[
  {
    "path": ".ci/openshift-ci/Dockerfile",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n\n# Dockerfile to bootstrap build and test in openshift-ci\nFROM registry.ci.openshift.org/openshift/release:golang-1.20\n# hadolint ignore=DL3002\nUSER 0\n\nSHELL [\"/bin/bash\", \"-c\"]\n\n# Temporary workaround since mirror.centos.org is down and can be replaced with vault.centos.org\nRUN sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/*.repo && \\\n    sed -i s/^#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo && \\\n    sed -i s/^mirrorlist=http/#mirrorlist=http/g /etc/yum.repos.d/*.repo\n\n# hadolint ignore=DL3041\n# Install yq, kubectl, chectl cli.\nRUN yum install --assumeyes -d1 psmisc python3-pip  httpd-tools nodejs && \\\n    pip3 install --upgrade setuptools && \\\n    pip3 install yq && \\\n    curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && \\\n    chmod +x ./kubectl && \\\n    mv ./kubectl /usr/local/bin && \\\n    bash <(curl -sL https://che-incubator.github.io/chectl/install.sh) --channel=next\n"
  },
  {
    "path": ".ci/openshift-ci/ca.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDDDCCAfSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDDBtpbmdy\nZXNzLW9wZXJhdG9yQDE3MjQwNzU0NzgwHhcNMjQwODE5MTM1MTE3WhcNMjYwODE5\nMTM1MTE4WjAmMSQwIgYDVQQDDBtpbmdyZXNzLW9wZXJhdG9yQDE3MjQwNzU0Nzgw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgfFNrBJSxPGNjA0S5+DUa\nUsqks86BMzzK7f6Fln90Aiw6eHgznvLlYLsUZUpCrbuOR2DbLy4NF4z1QMKwakY4\nClyNuxFUB823EzxdWsQx10LYeOglRWivNPln4n9TkCmet2fpSquI6LVnvFAJWWjE\nexAZt0JjOLfcLChNTZCdyxBp/v2eVM1uNj9F/EeQp+8IjZ4FJREuyQnFAA55DzYH\nqqsmscjLjWZeamZCKPufBWkHmxAfhxqSDiM9rfr9AuDQbgU85q4TKA9xpQmRHTsQ\nPNv7IeKAexrhin467FbIfbVcUOMxPe80i/wWW3Z9T/c9UNDkyfg26Y/u94/irk1h\nAgMBAAGjRTBDMA4GA1UdDwEB/wQEAwICpDASBgNVHRMBAf8ECDAGAQH/AgEAMB0G\nA1UdDgQWBBRUi8oPN5+mKa/wzaBztYbxY8QvFDANBgkqhkiG9w0BAQsFAAOCAQEA\nI5kiJUCNW/+7Pu7emoNb5H0L774AIccDmiXk4aS7Kbkhno9IuErdmYEbntjqllbt\nkFYSlcccW7AZm2EQ5SWOjhdMuDnF1krngv4ffHTN3RxIp0TbSLV8bqjQrwHxDf0s\nn8XYTrB3mIdmb0BK7SsaH5rubFCDWLxOMe9CT5SZsN258CoOm9fxOfE2SnxzLxjZ\n2rTUozKXLB+xPyezZsQ2hGPbQJzf7KRBITqOJbaTRDDDxfXr/IosYvGaPGpOC/aw\n4t2kbdLTJeiQAlZPwup9NXTPze+MEyAo2udooMACcxdiOEQc00bXvzKF0Qlvy6wC\nv2ib/BnCyVIZ3On5CwwJSA==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": ".ci/openshift-ci/common.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023-2025 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nset -e\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\nPR_IMAGE_TAG=\"pr-${PULL_NUMBER}\"\n\nexport CHE_NAMESPACE=${CHE_NAMESPACE:-\"eclipse-che\"}\nexport CHE_SERVER_IMAGE=${CHE_SERVER_IMAGE:-\"quay.io/eclipse/che-server:${PR_IMAGE_TAG}\"}\nexport ARTIFACTS_DIR=${ARTIFACT_DIR:-\"/tmp/artifacts\"}\nexport CHE_FORWARDED_PORT=\"8081\"\nexport OCP_ADMIN_USER_NAME=${OCP_ADMIN_USER_NAME:-\"admin\"}\nexport OCP_NON_ADMIN_USER_NAME=${OCP_NON_ADMIN_USER_NAME:-\"user\"}\nexport OCP_LOGIN_PASSWORD=${OCP_LOGIN_PASSWORD:-\"passw\"}\nexport ADMIN_CHE_NAMESPACE=${OCP_ADMIN_USER_NAME}\"-che\"\nexport USER_CHE_NAMESPACE=${OCP_NON_ADMIN_USER_NAME}\"-che\"\nexport GIT_PROVIDER_USERNAME=${GIT_PROVIDER_USERNAME:-\"chepullreq1\"}\nexport PUBLIC_REPO_WORKSPACE_NAME=${PUBLIC_REPO_WORKSPACE_NAME:-\"public-repo-wksp-testname\"}\nexport PRIVATE_REPO_WORKSPACE_NAME=${PRIVATE_REPO_WORKSPACE_NAME:-\"private-repo-wksp-testname\"}\nexport PUBLIC_PROJECT_NAME=${PUBLIC_PROJECT_NAME:-\"public-repo\"}\nexport PRIVATE_PROJECT_NAME=${PRIVATE_PROJECT_NAME:-\"private-repo\"}\nexport TEST_FILE_NAME=${TEST_FILE_NAME:-\"Date.txt\"}\nexport CUSTOM_CONFIG_MAP_NAME=${CUSTOM_CONFIG_MAP_NAME:-\"custom-ca-certificates\"}\nexport GIT_SSL_CONFIG_MAP_NAME=${GIT_SSL_CONFIG_MAP_NAME:-\"che-self-signed-cert\"}\n\nprovisionOpenShiftOAuthUser() {\n  echo \"------- [INFO] Start provisioning Openshift OAuth user -------\"\n  htpasswd -c -B -b users.htpasswd ${OCP_ADMIN_USER_NAME} ${OCP_LOGIN_PASSWORD}\n  htpasswd -b users.htpasswd ${OCP_NON_ADMIN_USER_NAME} ${OCP_LOGIN_PASSWORD}\n  oc create secret generic htpass-secret --from-file=htpasswd=\"users.htpasswd\" -n openshift-config\n  oc apply -f \".ci/openshift-ci/htpasswdProvider.yaml\"\n  oc adm policy add-cluster-role-to-user cluster-admin ${OCP_ADMIN_USER_NAME}\n\n  echo \"------- [INFO] Waiting for htpasswd auth to be working up to 5 minutes -------\"\n  CURRENT_TIME=$(date +%s)\n  ENDTIME=$((CURRENT_TIME + 300))\n  while [ \"$(date +%s)\" -lt $ENDTIME ]; do\n      if oc login -u=${OCP_ADMIN_USER_NAME} -p=${OCP_LOGIN_PASSWORD} --insecure-skip-tls-verify=false; then\n          echo \"======= [INFO] OpenShift OAuth htpasswd is configured. =======\n======= [INFO] Login to OCP cluster with admin user credentials is success.=======\"\n          return 0\n      fi\n      sleep 5\n  done\n\n  echo \"####### [ERROR] Error occurred while waiting OpenShift OAuth htpasswd setup. Try to rerun test. #######\"\n  exit 1\n}\n\nconfigureGitSelfSignedCertificate() {\n  echo \"------- [INFO] Configure self-signed certificate for Git provider -------\"\n  oc adm new-project ${CHE_NAMESPACE}\n  oc project ${CHE_NAMESPACE}\n\n  echo \"------- [INFO] Create ConfigMap with the required TLS certificate -------\"\n  oc create configmap ${CUSTOM_CONFIG_MAP_NAME} --from-file=.ci/openshift-ci/ca.crt\n  oc label configmap ${CUSTOM_CONFIG_MAP_NAME} app.kubernetes.io/part-of=che.eclipse.org app.kubernetes.io/component=ca-bundle\n\n  echo \"======= [INFO] ConfigMap is configured =======\"\n}\n\ncreateCustomResourcesFile() {\n  echo \"------- [INFO] Create custom resourses file -------\"\n  cat > custom-resources.yaml <<-END\napiVersion: org.eclipse.che/v2\nspec:\n  devEnvironments:\n    maxNumberOfRunningWorkspacesPerUser: 10000\nEND\n\n  echo \"======= [INFO] Generated custom resources file =======\"\n  cat custom-resources.yaml\n}\n\ndeployChe() {\n  echo \"------- [INFO] Start installing Eclipse Che -------\"\n  chectl server:deploy --cheimage=$CHE_SERVER_IMAGE \\\n                       --che-operator-cr-patch-yaml=custom-resources.yaml \\\n                       --platform=openshift \\\n                       --telemetry=off \\\n                       --batch\n\n  waitFinishDeploymentCheServer\n  echo \"======= [INFO] Eclipse Che is successfully installed =======\"\n}\n\nwaitFinishDeploymentCheServer() {\n          CURRENT_TIME=$(date +%s)\n          ENDTIME=$((CURRENT_TIME + 60))\n\n          while [ \"$(date +%s)\" -lt $ENDTIME ]; do\n              podCheServerName=$(oc get pod -n ${CHE_NAMESPACE} -l component=che | grep \"che\" | awk '{ print $1 }')\n              echo \"Pod Che_Server: $podCheServerName\"\n              count=$(echo \"$podCheServerName\" | wc -l)\n              if [ $count -eq 1 ]; then\n                  echo \"------- [INFO] Only one Che Server pod is left. -------\"\n                  return 0\n              fi\n              echo \"------- [INFO] Waiting until only one Che Server pod remains. -------\"\n              sleep 5\n          done\n\n          echo \"####### [ERROR] Error occurred while waiting for only one Che Server pod. #######\"\n          exit 1\n}\n\n# this command starts port forwarding between the local machine and the che-host service in the OpenShift cluster.\nforwardPortToService() {\n  echo \"------- [INFO] Start forwarding between the local machine and the che-host service -------\"\n  oc port-forward service/che-host ${CHE_FORWARDED_PORT}:8080 -n ${CHE_NAMESPACE} &\n  sleep 3s\n}\n\nkillProcessByPort() {\n  fuser -k ${CHE_FORWARDED_PORT}/tcp\n}\n\nrequestFactoryResolverGitRepoUrl() {\n  GIT_REPO_URL=$1\n  CLUSTER_ACCESS_TOKEN=$(oc whoami -t)\n\n  curl -i -X 'POST' \\\n    http://localhost:${CHE_FORWARDED_PORT}/api/factory/resolver \\\n    -H 'accept: */*' \\\n    -H \"Authorization: Bearer ${CLUSTER_ACCESS_TOKEN}\" \\\n    -H 'Content-Type: application/json' \\\n    -d '{\n    \"url\": \"'${GIT_REPO_URL}'\"\n  }'\n}\n\n# check that factory resolver returns correct value without any PAT/OAuth setup\ntestFactoryResolverNoPatOAuth() {\n  echo \"------- [INFO] Check factory resolver for public repository with NO PAT/OAuth setup -------\"\n  testFactoryResolverResponse $1 200\n\n  echo \"------- [INFO] Check factory resolver for private repository with NO PAT/OAuth setup -------\"\n  testFactoryResolverResponse $2 500\n}\n\n# check that raw devfile url factory resolver returns correct value without any PAT/OAuth setup\ntestFactoryResolverNoPatOAuthRaw() {\n  echo \"------- [INFO] Check factory resolver for public repository with NO PAT/OAuth setup -------\"\n  testFactoryResolverResponse $1 200\n\n  echo \"------- [INFO] Check factory resolver for private repository with NO PAT/OAuth setup -------\"\n  testFactoryResolverResponse $2 400\n}\n\n# check that factory resolver returns correct value with PAT/OAuth setup\ntestFactoryResolverWithPatOAuth() {\n  echo \"------- [INFO] Check factory resolver for public repository with PAT/OAuth setup -------\"\n  testFactoryResolverResponse $1 200\n\n  echo \"------- [INFO] Check factory resolver for private repository with PAT/OAuth setup -------\"\n  testFactoryResolverResponse $2 200\n}\n\ntestFactoryResolverResponse() {\n  URL=$1\n  RESPONSE_CODE=$2\n\n  if [ \"$(requestFactoryResolverGitRepoUrl ${URL} | grep \"HTTP/1.1 ${RESPONSE_CODE}\")\" ]; then\n    echo \"======= [INFO] Factory resolver returned 'HTTP/1.1 ${RESPONSE_CODE}' status code. Expected client side response. =======\"\n  else\n    echo \"####### [ERROR] Factory resolver returned wrong status code. Expected: HTTP/1.1 ${RESPONSE_CODE}. #######\n####### Cause possible: PR code regress or service is changed. Need to investigate it. #######\"\n    exit 1\n  fi\n}\n\nrequestProvisionNamespace() {\n  CLUSTER_ACCESS_TOKEN=$(oc whoami -t)\n\n  curl -i -X 'POST' \\\n    http://localhost:${CHE_FORWARDED_PORT}/api/kubernetes/namespace/provision \\\n    -H 'accept: application/json' \\\n    -H \"Authorization: Bearer ${CLUSTER_ACCESS_TOKEN}\" \\\n    -d ''\n}\n\ninitUserNamespace() {\n  OCP_USER_NAME=$1\n\n  echo \"------- [INFO] Initialize user namespace -------\"\n  oc login -u=${OCP_USER_NAME} -p=${OCP_LOGIN_PASSWORD} --insecure-skip-tls-verify=false\n\n  request_result=$(requestProvisionNamespace) || true\n\n  if [ -z \"$request_result\" ]; then\n    echo \"####### [ERROR] Cause possible: lost connection to pod, this is an infrastructure problem. Try to rerun the test. #######\"\n    exit 1\n  elif [ \"$(echo \"$request_result\" | grep \"HTTP/1.1 200\")\" ]; then\n    echo \"======= [INFO] Request provision user namespace returned 'HTTP/1.1 200' status code. User namespace is created. =======\"\n  else\n    echo \"####### [ERROR] Request provision user namespace returned wrong status code. Expected: HTTP/1.1 200. #######\n####### User namespace creation failed. Cause possible: PR code regression or service is changed. Need to investigate. #######\"\n    exit 1\n  fi\n}\n\nsetupPersonalAccessToken() {\n  GIT_PROVIDER_TYPE=$1\n  GIT_PROVIDER_URL=$2\n  GIT_PROVIDER_PAT=$3\n\n  echo \"------- [INFO] Setup Personal Access Token Secret -------\"\n  oc project ${USER_CHE_NAMESPACE}\n  CHE_USER_ID=$(oc get secret user-profile -o jsonpath='{.data.id}' | base64 -d)\n  cat .ci/openshift-ci/pat-secret.yaml > pat-secret.yaml\n\n  # patch the pat-secret.yaml file\n  sed -i \"s#che-user-id#${CHE_USER_ID}#g\" pat-secret.yaml\n  sed -i \"s#git-provider-name#${GIT_PROVIDER_TYPE}#g\" pat-secret.yaml\n  sed -i \"s#git-provider-url#${GIT_PROVIDER_URL}#g\" pat-secret.yaml\n  sed -i \"s#content-access-token#${GIT_PROVIDER_PAT}#g\" pat-secret.yaml\n\n  if [ \"${GIT_PROVIDER_TYPE}\" == \"azure-devops\" ]; then\n    sed -i \"s#''#${GIT_PROVIDER_USERNAME}#g\" pat-secret.yaml\n  fi\n\n  cat pat-secret.yaml\n\n  oc apply -f pat-secret.yaml -n ${USER_CHE_NAMESPACE}\n  echo \"======= [INFO] Personal Access Token is created. =======\"\n}\n\nsetupSSHKeyPairs() {\n  GIT_PRIVATE_KEY=$1\n  GIT_PUBLIC_KEY=$2\n\n  echo \"------- [INFO] Setup SSH Key Pairs Secret \"-------\n  oc project ${USER_CHE_NAMESPACE}\n  ENCODED_GIT_PRIVATE_KEY=$(echo \"${GIT_PRIVATE_KEY}\" | base64 -w 0)\n  ENCODED_GIT_PUBLIC_KEY=$(echo \"${GIT_PUBLIC_KEY}\" | base64 -w 0)\n  cat .ci/openshift-ci/ssh-secret.yaml > ssh-secret.yaml\n\n  # patch the ssh-secret.yaml file\n  sed -i \"s#ssh_private_key#${ENCODED_GIT_PRIVATE_KEY}#g\" ssh-secret.yaml\n  sed -i \"s#ssh_public_key#${ENCODED_GIT_PUBLIC_KEY}#g\" ssh-secret.yaml\n\n  cat ssh-secret.yaml\n\n  oc apply -f ssh-secret.yaml -n ${USER_CHE_NAMESPACE}\n  echo \"======= [INFO] SSH Secret is created. =======\"\n}\n\n# Only for GitLab server administrator users\ncreateOAuthApplicationGitLabServer() {\n  ADMIN_ACCESS_TOKEN=$1\n\n  CHE_URL=https://$(oc get route -n ${CHE_NAMESPACE} che -o jsonpath='{.spec.host}')\n\n  echo \"------- [INFO] Create OAuth Application -------\"\n  response=$(curl -k -X POST \\\n    ${GIT_PROVIDER_URL}/api/v4/applications \\\n    -H \"PRIVATE-TOKEN: ${ADMIN_ACCESS_TOKEN}\" \\\n    -d \"name=${APPLICATION_NAME}\" \\\n    -d \"redirect_uri=${CHE_URL}/api/oauth/callback\" \\\n    -d \"scopes=api write_repository openid\")\n\n  echo \"------- [INFO] Response of the created OAuth Application -------\"\n\n  OAUTH_ID=$(echo \"$response\" | jq -r '.id')\n  APPLICATION_ID=$(echo \"$response\" | jq -r '.application_id')\n  APPLICATION_SECRET=$(echo \"$response\" | jq -r '.secret')\n}\n\n# Only for GitLab server administrator users\ndeleteOAuthApplicationGitLabServer() {\n  OAUTH_ID=$1\n  ADMIN_ACCESS_TOKEN=$2\n\n  echo \"------- [INFO] Delete OAuth Application -------\"\n  curl -i -k -X DELETE \\\n    ${GIT_PROVIDER_URL}/api/v4/applications/${OAUTH_ID} \\\n    -H \"PRIVATE-TOKEN: ${ADMIN_ACCESS_TOKEN}\"\n\n  echo \"======= [INFO] OAuth Application is deleted =======\"\n}\n\n# Only for GitLab server\nrevokeAuthorizedOAuthApplication() {\n  APPLICATION_ID=$1\n  APPLICATION_SECRET=$2\n\n  echo \"------- [INFO] Revoke authorized OAuth application -------\"\n  oc project ${USER_CHE_NAMESPACE}\n  OAUTH_TOKEN_NAME=$(oc get secret | grep 'personal-access-token'| awk 'NR==1 { print $1 }')\n  OAUTH_TOKEN=$(oc get secret $OAUTH_TOKEN_NAME -o jsonpath='{.data.token}' | base64 -d)\n\n  curl -i -k -X POST \\\n    ${GIT_PROVIDER_URL}/oauth/revoke \\\n    -d \"client_id=${APPLICATION_ID}\" \\\n    -d \"client_secret=${APPLICATION_SECRET}\" \\\n    -d \"token=${OAUTH_TOKEN}\"\n\n  echo \"======= [INFO] Authorized OAuth application is revoked =======\"\n}\n\n# Only for GitLab server\nsetupOAuthSecret() {\n  APPLICATION_ID=$1\n  APPLICATION_SECRET=$2\n\n  echo \"------- [INFO] Setup OAuth Secret -------\"\n  oc login -u=${OCP_ADMIN_USER_NAME} -p=${OCP_LOGIN_PASSWORD} --insecure-skip-tls-verify=false\n  oc project ${CHE_NAMESPACE}\n  SERVER_POD=$(oc get pod -l component=che | grep \"che\" | awk 'NR==1 { print $1 }')\n\n  cat .ci/openshift-ci/oauth-secret.yaml > oauth-secret.yaml\n\n  # patch the oauth-secret.yaml file\n  sed -i \"s#git-provider-url#${GIT_PROVIDER_URL}#g\" oauth-secret.yaml\n  sed -i \"s#application-id#${APPLICATION_ID}#g\" oauth-secret.yaml\n  sed -i \"s#application-secret#${APPLICATION_SECRET}#g\" oauth-secret.yaml\n\n  cat oauth-secret.yaml\n  oc apply -f oauth-secret.yaml -n ${CHE_NAMESPACE}\n\n  echo \"------- [INFO] Wait updating deployment after create OAuth secret -------\"\n  oc wait --for=delete pod/${SERVER_POD} --timeout=120s\n}\n\nrunTestWorkspaceWithGitRepoUrl() {\n  WS_NAME=$1\n  PROJECT_NAME=$2\n  GIT_REPO_URL=$3\n  OCP_USER_NAMESPACE=$4\n\n  oc project ${OCP_USER_NAMESPACE}\n  cat .ci/openshift-ci/devworkspace-test.yaml > devworkspace-test.yaml\n\n  echo \"------- [INFO] Preparing 'devworkspace-test.yaml' and run test workspace -------\"\n  # patch the devworkspace-test.yaml file\n  sed -i \"s#ws-name#${WS_NAME}#g\" devworkspace-test.yaml\n  sed -i \"s#project-name#${PROJECT_NAME}#g\" devworkspace-test.yaml\n  sed -i \"s#git-repo-url#${GIT_REPO_URL}#g\" devworkspace-test.yaml\n\n  cat devworkspace-test.yaml\n\n  oc apply -f devworkspace-test.yaml -n ${OCP_USER_NAMESPACE}\n  oc wait -n ${OCP_USER_NAMESPACE} --for=condition=Ready dw ${WS_NAME} --timeout=420s\n  echo \"======= [INFO] Test workspace is run =======\"\n}\n\ntestProjectIsCloned() {\n  PROJECT_NAME=$1\n  OCP_USER_NAMESPACE=$2\n\n  WORKSPACE_POD_NAME=$(oc get pods -n ${OCP_USER_NAMESPACE} | grep workspace | awk '{print $1}')\n  if oc exec -it -n ${OCP_USER_NAMESPACE} ${WORKSPACE_POD_NAME} -- test -f /projects/${PROJECT_NAME}/${TEST_FILE_NAME}; then\n    echo \"======= [INFO] Project file /projects/${PROJECT_NAME}/${TEST_FILE_NAME} exists. =======\"\n  else\n    echo \"======= [INFO] Project file /projects/${PROJECT_NAME}/${TEST_FILE_NAME} is absent. =======\"\n    return 1\n  fi\n}\n\ntestGitCredentialsData() {\n  OCP_USER_NAMESPACE=$1\n  GIT_PROVIDER_PAT=$2\n  GIT_PROVIDER_URL=$3\n\n  echo \"------- [INFO] Check the 'git credentials' is in a workspace -------\"\n  hostName=\"${GIT_PROVIDER_URL#https://}\"\n\n  if [ \"${GIT_PROVIDER_TYPE}\" == \"azure-devops\" ]; then\n    userName=\"username\"\n  else\n    userName=${GIT_PROVIDER_USERNAME}\n  fi\n\n  gitCredentials=\"https://${userName}:${GIT_PROVIDER_PAT}@${hostName}\"\n  WORKSPACE_POD_NAME=$(oc get pods -n ${OCP_USER_NAMESPACE} | grep workspace | awk '{print $1}')\n  if oc exec -it -n ${OCP_USER_NAMESPACE} ${WORKSPACE_POD_NAME} -- cat /.git-credentials/credentials | grep -q ${gitCredentials}; then\n    echo \"======= [INFO] Git credentials file '/.git-credentials/credentials' exists and has the expected content. =======\"\n  else\n    echo \"####### [ERROR] Git credentials file '/.git-credentials/credentials' does not exist or has incorrect content. ######\n###### Cause possible: PR code regress or service is changed. Need to investigate it. #######\"\n    exit 1\n  fi\n}\n\ndeleteTestWorkspace() {\n  WS_NAME=$1\n  OCP_USER_NAMESPACE=$2\n  echo \"------- [INFO] Delete test workspace -------\"\n  oc delete dw ${WS_NAME} -n ${OCP_USER_NAMESPACE}\n}\n\nstartOAuthFactoryTest() {\n  CHE_URL=https://$(oc get route -n ${CHE_NAMESPACE} che -o jsonpath='{.spec.host}')\n  # patch oauth-factory-test.yaml\n  cat .ci/openshift-ci/pod-oauth-factory-test.yaml > oauth-factory-test.yaml\n  sed -i \"s#CHE_URL#${CHE_URL}#g\" oauth-factory-test.yaml\n  sed -i \"s#CHE-NAMESPACE#${CHE_NAMESPACE}#g\" oauth-factory-test.yaml\n  sed -i \"s#OCP_USER_NAME#${OCP_NON_ADMIN_USER_NAME}#g\" oauth-factory-test.yaml\n  sed -i \"s#OCP_USER_PASSWORD#${OCP_LOGIN_PASSWORD}#g\" oauth-factory-test.yaml\n  sed -i \"s#FACTORY_REPO_URL#${PRIVATE_REPO_URL}#g\" oauth-factory-test.yaml\n  sed -i \"s#GIT_BRANCH#${GIT_REPO_BRANCH}#g\" oauth-factory-test.yaml\n  sed -i \"s#GIT_PROVIDER_TYPE#${GIT_PROVIDER_TYPE}#g\" oauth-factory-test.yaml\n  sed -i \"s#GIT_PROVIDER_USER_NAME#${GIT_PROVIDER_LOGIN}#g\" oauth-factory-test.yaml\n  sed -i \"s#GIT_PROVIDER_USER_PASSWORD#${GIT_PROVIDER_PASSWORD}#g\" oauth-factory-test.yaml\n\n  echo \"------- [INFO] Applying the following patched OAuth Factory Test Pod: -------\"\n  cat oauth-factory-test.yaml\n  echo \"[INFO] --------------------------------------------------\"\n  oc apply -f oauth-factory-test.yaml\n  # wait for the pod to start\n  n=0\n  while [ $n -le 120 ]\n  do\n    PHASE=$(oc get pod -n ${CHE_NAMESPACE} ${TEST_POD_NAME} \\\n        --template='{{ .status.phase }}')\n    if [[ ${PHASE} == \"Running\" ]]; then\n      echo \"======= [INFO] Factory test started successfully. =======\"\n      return\n    fi\n\n    sleep 5\n    n=$(( n+1 ))\n  done\n\n  echo \"####### [ERROR] Failed to start Factory test. #######\n###### Cause possible: an infrastructure problem, pod could not start, try to rerun the test. #######\"\n  exit 1\n}\n\nstartSmokeTest() {\n  CHE_URL=https://$(oc get route -n ${CHE_NAMESPACE} che -o jsonpath='{.spec.host}')\n  # patch che-smoke-test.yaml\n  cat .ci/openshift-ci/pod-che-smoke-test.yaml > che-smoke-test.yaml\n  sed -i \"s#CHE_URL#${CHE_URL}#g\" che-smoke-test.yaml\n  sed -i \"s#CHE-NAMESPACE#${CHE_NAMESPACE}#g\" che-smoke-test.yaml\n  sed -i \"s#OCP_USER_NAME#${OCP_NON_ADMIN_USER_NAME}#g\" che-smoke-test.yaml\n  sed -i \"s#OCP_USER_PASSWORD#${OCP_LOGIN_PASSWORD}#g\" che-smoke-test.yaml\n\n  echo \"------- [INFO] Applying the following patched Smoke Test Pod: -------\"\n  cat che-smoke-test.yaml\n  echo \"[INFO] --------------------------------------------------\"\n  oc apply -f che-smoke-test.yaml\n  # wait for the pod to start\n  n=0\n  while [ $n -le 120 ]\n  do\n    PHASE=$(oc get pod -n ${CHE_NAMESPACE} ${TEST_POD_NAME} \\\n        --template='{{ .status.phase }}')\n    if [[ ${PHASE} == \"Running\" ]]; then\n      echo \"======= [INFO] Smoke test started successfully. =======\"\n      return\n    fi\n\n    sleep 5\n    n=$(( n+1 ))\n  done\n\n  echo \"####### [ERROR] Failed to start Smoke test. #######\n####### Cause possible: an infrastructure problem, pod could not start, try to rerun the test. #######\"\n  exit 1\n}\n\n# Catch the finish of the job and write logs in artifacts.\ncatchFinish() {\n  local RESULT=$?\n  if [ \"$RESULT\" != \"0\" ]; then\n    set +e\n    collectEclipseCheLogs\n    set -e\n  fi\n\n  echo \"------- [INFO] Terminate the process after finish the test script. -------\"\n  set +e\n  killProcessByPort\n  set -e\n\n  [[ \"${RESULT}\" != \"0\" ]] && echo \"####### [ERROR] Job failed. #######\" || echo \"####### [INFO] Job completed successfully. #######\"\n  exit $RESULT\n}\n\ncollectEclipseCheLogs() {\n  mkdir -p ${ARTIFACTS_DIR}/che-logs\n\n  # Collect all Eclipse Che logs and cluster CR\n  oc login -u=${OCP_ADMIN_USER_NAME} -p=${OCP_LOGIN_PASSWORD} --insecure-skip-tls-verify=false\n  oc get checluster -o yaml -n $CHE_NAMESPACE > \"${ARTIFACTS_DIR}/che-cluster.yaml\"\n  chectl server:logs -n $CHE_NAMESPACE --directory ${ARTIFACTS_DIR}/che-logs --telemetry off\n}\n\ncollectLogs() {\n  echo \"------- [INFO] Waiting until test pod finished. -------\"\n  oc logs -n ${CHE_NAMESPACE} ${TEST_POD_NAME} -c test -f\n  sleep 3\n\n  # Download artifacts\n  set +e\n  echo -------\" [INFO] Collect all Eclipse Che logs and cluster CR. -------\"\n  collectEclipseCheLogs\n\n  echo \"------- [INFO] Downloading test report. -------\"\n  mkdir -p ${ARTIFACTS_DIR}/e2e\n  oc rsync -n ${CHE_NAMESPACE} ${TEST_POD_NAME}:/tmp/e2e/report/ ${ARTIFACTS_DIR}/e2e -c download-reports\n  oc exec -n ${CHE_NAMESPACE} ${TEST_POD_NAME} -c download-reports -- touch /tmp/done\n\n  # Revoke and delete the OAuth application\n  if [[ ${TEST_POD_NAME} == \"oauth-factory-test\" ]]; then\n    revokeAuthorizedOAuthApplication ${APPLICATION_ID} ${APPLICATION_SECRET}\n    deleteOAuthApplicationGitLabServer ${OAUTH_ID} ${ADMIN_ACCESS_TOKEN}\n  fi\n\n  set -e\n\n  EXIT_CODE=$(oc logs -n ${CHE_NAMESPACE} ${TEST_POD_NAME} -c test | grep EXIT_CODE)\n  if [[ ${EXIT_CODE} != \"+ EXIT_CODE=0\" ]]; then\n    echo \"####### [ERROR] GUI test failed. Job failed. #######\n###### Cause possible: PR code regress or service is changed. Need to investigate it. #######\"\n    exit 1\n  fi\n  echo \"======= [INFO] Job completed successfully. =======\"\n}\n\ntestCloneGitRepoNoProjectExists() {\n    WS_NAME=$1\n    PROJECT_NAME=$2\n    GIT_REPO_URL=$3\n    OCP_USER_NAMESPACE=$4\n\n    runTestWorkspaceWithGitRepoUrl ${WS_NAME} ${PROJECT_NAME} ${GIT_REPO_URL} ${OCP_USER_NAMESPACE}\n    echo \"------- [INFO] Check the private repository is NOT cloned with NO PAT/OAuth setup. -------\"\n    testProjectIsCloned ${PROJECT_NAME} ${OCP_USER_NAMESPACE} && \\\n    { echo \"####### [ERROR] Project file /projects/${PROJECT_NAME}/${TEST_FILE_NAME} should NOT be present. #######\n####### Cause possible: PR code regress or service is changed. Need to investigate it. #######\" && exit 1; }\n    echo \"======= [INFO] Project file /projects/${PROJECT_NAME}/${TEST_FILE_NAME} is NOT present. This is EXPECTED. =======\"\n}\n\n# Verify that a public repository is cloned without requiring PAT, OAuth, or SSH configuration.\n# Verify that a public or private repository is cloned when PAT, OAuth, or SSH configuration is provided.\ntestCloneGitRepoProjectShouldExists() {\n  WS_NAME=$1\n  PROJECT_NAME=$2\n  GIT_REPO_URL=$3\n  OCP_USER_NAMESPACE=$4\n\n  runTestWorkspaceWithGitRepoUrl ${WS_NAME} ${PROJECT_NAME} ${GIT_REPO_URL} ${OCP_USER_NAMESPACE}\n  echo \"------- [INFO] Check the repository is cloned. -------\"\n  testProjectIsCloned ${PROJECT_NAME} ${OCP_USER_NAMESPACE} || \\\n  { echo \"####### [ERROR] Project file /projects/${PROJECT_NAME}/${TEST_FILE_NAME} should be present. #######\n###### Cause possible: PR code regress or service is changed. Need to investigate it. #######\" && exit 1; }\n}\n\nsetupTestEnvironment() {\n  OCP_USER_NAME=$1\n\n  provisionOpenShiftOAuthUser\n  createCustomResourcesFile\n  deployChe\n  forwardPortToService\n  initUserNamespace ${OCP_USER_NAME}\n}\n\nsetupTestEnvironmentOAuthFlow() {\n  ADMIN_ACCESS_TOKEN=$1\n  APPLICATION_ID=$2\n  APPLICATION_SECRET=$3\n\n  provisionOpenShiftOAuthUser\n  configureGitSelfSignedCertificate\n  createCustomResourcesFile\n  deployChe\n  createOAuthApplicationGitLabServer ${ADMIN_ACCESS_TOKEN} ${APPLICATION_NAME}\n  setupOAuthSecret ${APPLICATION_ID} ${APPLICATION_SECRET}\n}\n"
  },
  {
    "path": ".ci/openshift-ci/devworkspace-test.yaml",
    "content": "kind: DevWorkspace\napiVersion: workspace.devfile.io/v1alpha2\nmetadata:\n  name: ws-name\nspec:\n  started: true\n  routingClass: che\n  template:\n    projects:\n      - name: project-name\n        git:\n          remotes:\n            origin: git-repo-url\n  contributions:\n    - name: che-code\n      uri: https://eclipse-che.github.io/che-plugin-registry/main/v3/plugins/che-incubator/che-code/latest/devfile.yaml\n      components:\n        - name: che-code-runtime-description\n          container:\n            env:\n              - name: CODE_HOST\n                value: 0.0.0.0\n"
  },
  {
    "path": ".ci/openshift-ci/htpasswdProvider.yaml",
    "content": "apiVersion: config.openshift.io/v1\nkind: OAuth\nmetadata:\n  name: cluster\nspec:\n  identityProviders:\n    - name: htpasswd\n      mappingMethod: claim\n      type: HTPasswd\n      htpasswd:\n        fileData:\n          name: htpass-secret\n"
  },
  {
    "path": ".ci/openshift-ci/oauth-secret.yaml",
    "content": "kind: Secret\napiVersion: v1\nmetadata:\n  name: gitlab-oauth-secret\n  namespace: eclipse-che\n  labels:\n    app.kubernetes.io/part-of: che.eclipse.org\n    app.kubernetes.io/component: oauth-scm-configuration\n  annotations:\n    che.eclipse.org/oauth-scm-server: gitlab\n    che.eclipse.org/scm-server-endpoint: git-provider-url\ntype: Opaque\nstringData:\n  id: application-id\n  secret: application-secret\n"
  },
  {
    "path": ".ci/openshift-ci/pat-secret.yaml",
    "content": "kind: Secret\napiVersion: v1\nmetadata:\n  name: personal-access-token\n  labels:\n    app.kubernetes.io/component: scm-personal-access-token\n    app.kubernetes.io/part-of: che.eclipse.org\n  annotations:\n    che.eclipse.org/che-userid: che-user-id\n    che.eclipse.org/scm-personal-access-token-name: git-provider-name\n    che.eclipse.org/scm-url: git-provider-url\n    che.eclipse.org/scm-organization: ''\nstringData:\n  token: content-access-token\ntype: Opaque\n"
  },
  {
    "path": ".ci/openshift-ci/pod-che-smoke-test.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: che-smoke-test\n  namespace: CHE-NAMESPACE\nspec:\n  volumes:\n    - name: test-run-results\n    - name: ffmpeg-video\n    - name: dshm\n      emptyDir:\n        medium: Memory\n  containers:\n    # container containing the tests\n    - name: test\n      image: quay.io/eclipse/che-e2e:next\n      imagePullPolicy: Always\n      env:\n        - name: VIDEO_RECORDING\n          value: \"true\"\n        - name: TEST_SUITE\n          value: \"test\"\n        - name: TS_SELENIUM_EDITOR\n          value: \"che-code\"\n        - name: USERSTORY\n          value: \"SmokeTest\"\n        - name: NODE_TLS_REJECT_UNAUTHORIZED\n          value: \"0\"\n        - name: TS_SELENIUM_BASE_URL\n          value: \"CHE_URL\"\n        - name: TS_SELENIUM_LOG_LEVEL\n          value: \"TRACE\"\n        - name: TS_SELENIUM_OCP_USERNAME\n          value: \"OCP_USER_NAME\"\n        - name: TS_SELENIUM_OCP_PASSWORD\n          value: \"OCP_USER_PASSWORD\"\n        - name: TS_SELENIUM_VALUE_OPENSHIFT_OAUTH\n          value: \"true\"\n        - name: TS_OCP_LOGIN_PAGE_PROVIDER_TITLE\n          value: \"htpasswd\"\n        - name: DELETE_WORKSPACE_ON_FAILED_TEST\n          value: \"true\"\n        - name: TS_SELENIUM_START_WORKSPACE_TIMEOUT\n          value: \"360000\"\n        - name: TS_IDE_LOAD_TIMEOUT\n          value: \"40000\"\n      volumeMounts:\n        - name: test-run-results\n          mountPath: /tmp/e2e/report/\n        - name: ffmpeg-video\n          mountPath: /tmp/ffmpeg_report/\n        - name: dshm\n          mountPath: /dev/shm\n      resources:\n        requests:\n          memory: \"3Gi\"\n          cpu: \"2\"\n        limits:\n          memory: \"4Gi\"\n          cpu: \"2\"\n    # Download results\n    - name: download-reports\n      image: eeacms/rsync\n      imagePullPolicy: IfNotPresent\n      volumeMounts:\n        - name: test-run-results\n          mountPath: /tmp/e2e/report/\n        - name: ffmpeg-video\n          mountPath: /tmp/ffmpeg_report/\n      resources:\n      command: [\"sh\"]\n      args:\n        [\n          \"-c\",\n          \"while true; if [[ -f /tmp/done ]]; then exit 0; fi; do sleep 1; done\",\n        ]\n  restartPolicy: Never\n"
  },
  {
    "path": ".ci/openshift-ci/pod-oauth-factory-test.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: oauth-factory-test\n  namespace: CHE-NAMESPACE\nspec:\n  volumes:\n    - name: test-run-results\n    - name: ffmpeg-video\n    - name: dshm\n      emptyDir:\n        medium: Memory\n  containers:\n    # container containing the tests\n    - name: test\n      image: quay.io/eclipse/che-e2e:next\n      imagePullPolicy: Always\n      env:\n        - name: VIDEO_RECORDING\n          value: \"true\"\n        - name: TEST_SUITE\n          value: \"test\"\n        - name: TS_SELENIUM_EDITOR\n          value: \"che-code\"\n        - name: USERSTORY\n          value: \"Factory\"\n        - name: NODE_TLS_REJECT_UNAUTHORIZED\n          value: \"0\"\n        - name: TS_SELENIUM_BASE_URL\n          value: \"CHE_URL\"\n        - name: TS_SELENIUM_LOG_LEVEL\n          value: \"TRACE\"\n        - name: TS_SELENIUM_OCP_USERNAME\n          value: \"OCP_USER_NAME\"\n        - name: TS_SELENIUM_OCP_PASSWORD\n          value: \"OCP_USER_PASSWORD\"\n        - name: TS_SELENIUM_VALUE_OPENSHIFT_OAUTH\n          value: \"true\"\n        - name: TS_SELENIUM_FACTORY_GIT_REPO_URL\n          value: \"FACTORY_REPO_URL\"\n        - name: TS_SELENIUM_FACTORY_GIT_REPO_BRANCH\n          value: \"GIT_BRANCH\"\n        - name: TS_SELENIUM_FACTORY_GIT_PROVIDER\n          value: \"GIT_PROVIDER_TYPE\"\n        - name: TS_SELENIUM_GIT_PROVIDER_OAUTH\n          value: \"true\"\n        - name: TS_SELENIUM_GIT_PROVIDER_USERNAME\n          value: \"GIT_PROVIDER_USER_NAME\"\n        - name: TS_SELENIUM_GIT_PROVIDER_PASSWORD\n          value: \"GIT_PROVIDER_USER_PASSWORD\"\n        - name: TS_OCP_LOGIN_PAGE_PROVIDER_TITLE\n          value: \"htpasswd\"\n        - name: DELETE_WORKSPACE_ON_FAILED_TEST\n          value: \"true\"\n        - name: TS_SELENIUM_START_WORKSPACE_TIMEOUT\n          value: \"360000\"\n        - name: TS_IDE_LOAD_TIMEOUT\n          value: \"40000\"\n      volumeMounts:\n        - name: test-run-results\n          mountPath: /tmp/e2e/report/\n        - name: ffmpeg-video\n          mountPath: /tmp/ffmpeg_report/\n        - name: dshm\n          mountPath: /dev/shm\n      resources:\n        requests:\n          memory: \"3Gi\"\n          cpu: \"2\"\n        limits:\n          memory: \"4Gi\"\n          cpu: \"2\"\n    # Download results\n    - name: download-reports\n      image: eeacms/rsync\n      imagePullPolicy: IfNotPresent\n      volumeMounts:\n        - name: test-run-results\n          mountPath: /tmp/e2e/report/\n        - name: ffmpeg-video\n          mountPath: /tmp/ffmpeg_report/\n      resources:\n      command: [\"sh\"]\n      args:\n        [\n          \"-c\",\n          \"while true; if [[ -f /tmp/done ]]; then exit 0; fi; do sleep 1; done\",\n        ]\n  restartPolicy: Never\n"
  },
  {
    "path": ".ci/openshift-ci/ssh-secret.yaml",
    "content": "apiVersion: v1\nkind: Secret\nmetadata:\n  name: git-ssh-key\n  annotations:\n    controller.devfile.io/mount-as: subpath\n    controller.devfile.io/mount-path: /etc/ssh/\n  labels:\n    controller.devfile.io/mount-to-devworkspace: \"true\"\n    controller.devfile.io/watch-secret: \"true\"\ntype: Opaque\ndata:\n  dwo_ssh_key: ssh_private_key\n  dwo_ssh_key.pub: ssh_public_key\n  ssh_config: aG9zdCAqCiAgSWRlbnRpdHlGaWxlIC9ldGMvc3NoL2R3b19zc2hfa2V5CiAgU3RyaWN0SG9zdEtleUNoZWNraW5nID0gbm8K\n"
  },
  {
    "path": ".ci/openshift-ci/test-azure-no-pat-oauth-flow-raw-devfile-url.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_RAW_PATH_URL=${PUBLIC_REPO_RAW_PATH_URL:-\"https://dev.azure.com/chepullreq1/che-pr-public/_apis/git/repositories/public-repo/items?path=/devfile.yaml\"}\nexport PRIVATE_REPO_RAW_PATH_URL=${PRIVATE_REPO_URL:-\"https://dev.azure.com/chepullreq1/che-pr-private/_apis/git/repositories/private-repo/items?path=/devfile.yaml\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\ntestFactoryResolverResponse ${PUBLIC_REPO_RAW_PATH_URL} 200\ntestFactoryResolverResponse ${PRIVATE_REPO_RAW_PATH_URL} 400\n\ntestCloneGitRepoNoProjectExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\ntestCloneGitRepoNoProjectExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}"
  },
  {
    "path": ".ci/openshift-ci/test-azure-no-pat-oauth-flow-ssh-url.sh",
    "content": "\n#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_SSH_URL=${PUBLIC_REPO_SSH_URL:-\"git@ssh.dev.azure.com:v3/chepullreq1/che-pr-public/public-repo\"}\nexport PRIVATE_REPO_SSH_URL=${PRIVATE_REPO_SSH_URL:-\"git@ssh.dev.azure.com:v3/chepullreq1/che-pr-private/private-repo\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\nsetupSSHKeyPairs \"${AZURE_PRIVATE_KEY}\" \"${AZURE_PUBLIC_KEY}\"\ntestFactoryResolverResponse ${PUBLIC_REPO_SSH_URL} 200\ntestFactoryResolverResponse ${PRIVATE_REPO_SSH_URL} 500\n\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}"
  },
  {
    "path": ".ci/openshift-ci/test-azure-no-pat-oauth-flow.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_URL=${PUBLIC_REPO_URL:-\"https://chepullreq1@dev.azure.com/chepullreq1/che-pr-public/_git/public-repo\"}\nexport PRIVATE_REPO_URL=${PRIVATE_REPO_URL:-\"https://dev.azure.com/chepullreq1/che-pr-private/_git/private-repo\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\ntestFactoryResolverNoPatOAuth ${PUBLIC_REPO_URL} ${PRIVATE_REPO_URL}\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\ntestCloneGitRepoNoProjectExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n"
  },
  {
    "path": ".ci/openshift-ci/test-azure-with-pat-setup-flow.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_URL=${PUBLIC_REPO_URL:-\"https://chepullreq1@dev.azure.com/chepullreq1/che-pr-public/_git/public-repo\"}\nexport PRIVATE_REPO_URL=${PRIVATE_REPO_URL:-\"https://dev.azure.com/chepullreq1/che-pr-private/_git/private-repo\"}\nexport GIT_PROVIDER_TYPE=${GIT_PROVIDER_TYPE:-\"azure-devops\"}\nexport GIT_PROVIDER_URL=${GIT_PROVIDER_URL:-\"https://dev.azure.com\"}\nexport PRIVATE_REPO_SSH_URL=${PRIVATE_REPO_SSH_URL:-\"git@ssh.dev.azure.com:v3/chepullreq1/che-pr-private/private-repo\"}\nexport PRIVATE_REPO_RAW_PATH_URL=${PRIVATE_REPO_URL:-\"https://dev.azure.com/chepullreq1/che-pr-private/_apis/git/repositories/private-repo/items?path=/devfile.yaml\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\nsetupPersonalAccessToken  ${GIT_PROVIDER_TYPE} ${GIT_PROVIDER_URL} ${AZURE_PAT}\nrequestProvisionNamespace\ntestFactoryResolverWithPatOAuth ${PUBLIC_REPO_URL} ${PRIVATE_REPO_URL}\n\necho \"------- [INFO] Check clone public repository with PAT setup -------\"\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_URL} ${USER_CHE_NAMESPACE}\ntestGitCredentialsData ${USER_CHE_NAMESPACE} ${AZURE_PAT} ${GIT_PROVIDER_URL}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\necho \"------- [INFO] Check clone private repository with PAT setup -------\"\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_URL} ${USER_CHE_NAMESPACE}\ntestGitCredentialsData ${USER_CHE_NAMESPACE} ${AZURE_PAT} ${GIT_PROVIDER_URL}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\necho \"------- [INFO] Check clone private repository by raw devfile URL with PAT setup -------\"\ntestFactoryResolverResponse ${PRIVATE_REPO_RAW_PATH_URL} 200\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\nsetupSSHKeyPairs \"${AZURE_PRIVATE_KEY}\" \"${AZURE_PUBLIC_KEY}\"\n\necho \"------- [INFO] Check clone private repository by SSH URL with PAT setup -------\"\ntestFactoryResolverResponse ${PRIVATE_REPO_SSH_URL} 200\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n"
  },
  {
    "path": ".ci/openshift-ci/test-bitbucket-no-pat-oauth-flow-raw-devfile-url.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_RAW_PATH_URL=${PUBLIC_REPO_RAW_PATH_URL:-\"https://bitbucket.org/chepullreq/public-repo/raw/746000bd63a54eaf8ea8aba9dfe6620e5c6c61d7/devfile.yaml\"}\nexport PRIVATE_REPO_RAW_PATH_URL=${PRIVATE_REPO_URL:-\"https://bitbucket.org/chepullreq/private-repo/raw/80b183d27c6c533462128b0c092208aad73b2906/devfile.yaml\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\ntestFactoryResolverNoPatOAuthRaw ${PUBLIC_REPO_RAW_PATH_URL} ${PRIVATE_REPO_RAW_PATH_URL}\n\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\ntestCloneGitRepoNoProjectExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n"
  },
  {
    "path": ".ci/openshift-ci/test-bitbucket-no-pat-oauth-flow-ssh-url.sh",
    "content": "\n#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_SSH_URL=${PUBLIC_REPO_SSH_URL:-\"git@bitbucket.org:chepullreq/public-repo.git\"}\nexport PRIVATE_REPO_SSH_URL=${PRIVATE_REPO_SSH_URL:-\"git@bitbucket.org:chepullreq/private-repo.git\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\nsetupSSHKeyPairs \"${BITBUCKET_PRIVATE_KEY}\" \"${BITBUCKET_PUBLIC_KEY}\"\ntestFactoryResolverNoPatOAuth ${PUBLIC_REPO_SSH_URL} ${PRIVATE_REPO_SSH_URL}\n\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n"
  },
  {
    "path": ".ci/openshift-ci/test-bitbucket-no-pat-oauth-flow.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_URL=${PUBLIC_REPO_URL:-\"https://chepullreq1@bitbucket.org/chepullreq/public-repo.git\"}\nexport PRIVATE_REPO_URL=${PRIVATE_REPO_URL:-\"https://chepullreq1@bitbucket.org/chepullreq/private-repo.git\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\ntestFactoryResolverNoPatOAuth ${PUBLIC_REPO_URL} ${PRIVATE_REPO_URL}\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\ntestCloneGitRepoNoProjectExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n"
  },
  {
    "path": ".ci/openshift-ci/test-che-smoke-test.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2024  Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport TEST_POD_NAME=${TEST_POD_NAME:-\"che-smoke-test\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"collectLogs\" EXIT SIGINT\n\nprovisionOpenShiftOAuthUser\ncreateCustomResourcesFile\ndeployChe\nstartSmokeTest\n"
  },
  {
    "path": ".ci/openshift-ci/test-gitea-no-pat-oauth-flow.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_SSH_URL=${PUBLIC_REPO_SSH_URL:-\"git@gitea.com:chepullreq1/public-repo.git\"}\nexport PRIVATE_REPO_SSH_URL=${PRIVATE_REPO_SSH_URL:-\"git@gitea.com:chepullreq1/private-repo.git\"}\nexport PUBLIC_REPO_RAW_PATH_URL=${PUBLIC_REPO_RAW_PATH_URL:-\"https://gitea.com/chepullreq1/public-repo/raw/branch/main/devfile.yaml\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\nsetupSSHKeyPairs \"${GITEA_PRIVATE_KEY}\" \"${GITEA_PUBLIC_KEY}\"\n\ntestFactoryResolverResponse ${PUBLIC_REPO_SSH_URL} 500\ntestFactoryResolverResponse ${PRIVATE_REPO_SSH_URL} 500\ntestFactoryResolverResponse ${PUBLIC_REPO_RAW_PATH_URL} 200\n\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\ntestCloneGitRepoNoProjectExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n"
  },
  {
    "path": ".ci/openshift-ci/test-gitea-with-pat-setup-flow.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PRIVATE_REPO_RAW_PATH_URL=${PRIVATE_REPO_RAW_PATH_URL:-\"https://${GITEA_PAT}@gitea.com/chepullreq1/private-repo/raw/branch/main/devfile.yaml\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\ntestFactoryResolverResponse ${PRIVATE_REPO_RAW_PATH_URL} 200\n\ntestCloneGitRepoNoProjectExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n"
  },
  {
    "path": ".ci/openshift-ci/test-github-no-pat-oauth-flow-raw-devfile-url.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_RAW_PATH_URL=${PUBLIC_REPO_RAW_PATH_URL:-\"https://raw.githubusercontent.com/chepullreq1/public-repo/main/devfile.yaml\"}\nexport PRIVATE_REPO_RAW_PATH_URL=${PRIVATE_REPO_URL:-\"https://raw.githubusercontent.com/chepullreq1/private-repo/main/devfile.yaml\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\ntestFactoryResolverNoPatOAuthRaw ${PUBLIC_REPO_RAW_PATH_URL} ${PRIVATE_REPO_RAW_PATH_URL}\n\ntestCloneGitRepoNoProjectExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\ntestCloneGitRepoNoProjectExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\n"
  },
  {
    "path": ".ci/openshift-ci/test-github-no-pat-oauth-flow-ssh-url.sh",
    "content": "\n#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_SSH_URL=${PUBLIC_REPO_SSH_URL:-\"git@github.com:chepullreq1/public-repo.git\"}\nexport PRIVATE_REPO_SSH_URL=${PRIVATE_REPO_SSH_URL:-\"git@github.com:chepullreq1/private-repo.git\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\nsetupSSHKeyPairs \"${GITHUB_PRIVATE_KEY}\" \"${GITHUB_PUBLIC_KEY}\"\ntestFactoryResolverNoPatOAuth ${PUBLIC_REPO_SSH_URL} ${PRIVATE_REPO_SSH_URL}\n\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n"
  },
  {
    "path": ".ci/openshift-ci/test-github-no-pat-oauth-flow.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_URL=${PUBLIC_REPO_URL:-\"https://github.com/chepullreq1/public-repo.git\"}\nexport PRIVATE_REPO_URL=${PRIVATE_REPO_URL:-\"https://github.com/chepullreq1/private-repo.git\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\ntestFactoryResolverNoPatOAuth ${PUBLIC_REPO_URL} ${PRIVATE_REPO_URL}\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\ntestCloneGitRepoNoProjectExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n"
  },
  {
    "path": ".ci/openshift-ci/test-github-with-pat-setup-flow.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_URL=${PUBLIC_REPO_URL:-\"https://github.com/chepullreq1/public-repo.git\"}\nexport PRIVATE_REPO_URL=${PRIVATE_REPO_URL:-\"https://github.com/chepullreq1/private-repo.git\"}\nexport GIT_PROVIDER_TYPE=${GIT_PROVIDER_TYPE:-\"github\"}\nexport GIT_PROVIDER_URL=${GIT_PROVIDER_URL:-\"https://github.com\"}\nexport PRIVATE_REPO_RAW_PATH_URL=${PRIVATE_REPO_URL:-\"https://raw.githubusercontent.com/chepullreq1/private-repo/main/devfile.yaml\"}\nexport PRIVATE_REPO_SSH_URL=${PRIVATE_REPO_SSH_URL:-\"git@github.com:chepullreq1/private-repo.git\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\nsetupPersonalAccessToken  ${GIT_PROVIDER_TYPE} ${GIT_PROVIDER_URL} ${GITHUB_PAT}\nrequestProvisionNamespace\ntestFactoryResolverWithPatOAuth ${PUBLIC_REPO_URL} ${PRIVATE_REPO_URL}\n\necho \"------- [INFO] Check clone public repository with PAT setup -------\"\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_URL} ${USER_CHE_NAMESPACE}\ntestGitCredentialsData ${USER_CHE_NAMESPACE} ${GITHUB_PAT} ${GIT_PROVIDER_URL}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\necho \"------- [INFO] Check clone private repository with PAT setup -------\"\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_URL} ${USER_CHE_NAMESPACE}\ntestGitCredentialsData ${USER_CHE_NAMESPACE} ${GITHUB_PAT} ${GIT_PROVIDER_URL}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\necho \"------- [INFO] Check clone private repository by raw devfile URL with PAT setup -------\"\ntestFactoryResolverResponse ${PRIVATE_REPO_RAW_PATH_URL} 200\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\nsetupSSHKeyPairs \"${GITHUB_PRIVATE_KEY}\" \"${GITHUB_PUBLIC_KEY}\"\n\necho \"------- [INFO] Check clone private repository by SSH URL with PAT setup -------\"\ntestFactoryResolverResponse ${PRIVATE_REPO_SSH_URL} 200\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}"
  },
  {
    "path": ".ci/openshift-ci/test-gitlab-no-pat-oauth-flow-raw-devfile-url.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_RAW_PATH_URL=${PUBLIC_REPO_RAW_PATH_URL:-\"https://gitlab.com/chepullreq1/public-repo/-/raw/main/devfile.yaml\"}\nexport PRIVATE_REPO_RAW_PATH_URL=${PRIVATE_REPO_URL:-\"https://gitlab.com/chepullreq1/private-repo/-/raw/main/devfile.yaml\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\ntestFactoryResolverNoPatOAuth ${PUBLIC_REPO_RAW_PATH_URL} ${PRIVATE_REPO_RAW_PATH_URL}\n\ntestCloneGitRepoNoProjectExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\ntestCloneGitRepoNoProjectExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n"
  },
  {
    "path": ".ci/openshift-ci/test-gitlab-no-pat-oauth-flow-ssh-url.sh",
    "content": "\n#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_SSH_URL=${PUBLIC_REPO_SSH_URL:-\"git@gitlab.com:chepullreq1/public-repo.git\"}\nexport PRIVATE_REPO_SSH_URL=${PRIVATE_REPO_SSH_URL:-\"git@gitlab.com:chepullreq1/private-repo.git\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\nsetupSSHKeyPairs \"${GITLAB_PRIVATE_KEY}\" \"${GITLAB_PUBLIC_KEY}\"\ntestFactoryResolverNoPatOAuth ${PUBLIC_REPO_SSH_URL} ${PRIVATE_REPO_SSH_URL}\n\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}"
  },
  {
    "path": ".ci/openshift-ci/test-gitlab-no-pat-oauth-flow.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_URL=${PUBLIC_REPO_URL:-\"https://gitlab.com/chepullreq1/public-repo.git\"}\nexport PRIVATE_REPO_URL=${PRIVATE_REPO_URL:-\"https://gitlab.com/chepullreq1/private-repo.git\"}\n\nexport PUBLIC_REPO_WITH_DOT_DEFILE_URL=${PUBLIC_REPO_WITH_DOT_DEFILE_URL:-\"https://gitlab.com/chepullreq1/public-repo-dot-devfile.git\"}\nexport PRIVATE_REPO_WITH_DOT_DEFILE_URL=${PRIVATE_REPO_WITH_DOT_DEFILE_URL:-\"https://gitlab.com/chepullreq1/private-repo-dot-devfile.git\"}\n\nexport NAME_OF_PUBLIC_REPO_WITH_DOT_DEFILE=${NAME_OF_PUBLIC_REPO_WITH_DOT_DEFILE:-\"public-repo-dot-devfile\"}\nexport NAME_OF_PRIVATE_REPO_WITH_DOT_DEFILE=${NAME_OF_PRIVATE_REPO_WITH_DOT_DEFILE:-\"private-repo-dot-devfile\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\ntestFactoryResolverNoPatOAuth ${PUBLIC_REPO_URL} ${PRIVATE_REPO_URL}\ntestFactoryResolverNoPatOAuth ${PUBLIC_REPO_WITH_DOT_DEFILE_URL} ${PRIVATE_REPO_WITH_DOT_DEFILE_URL}\n\necho \"------- [INFO] Check clone a public repository without PAT -------\"\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\necho \"------- [INFO] Check clone a public repository with .devfile.yaml and without PAT -------\"\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${NAME_OF_PUBLIC_REPO_WITH_DOT_DEFILE} ${PUBLIC_REPO_WITH_DOT_DEFILE_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\necho \"------- [INFO] Check clone a private repository without PAT is not available -------\"\ntestCloneGitRepoNoProjectExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\necho \"------- [INFO] Check clone a private repository with .devfile.yaml and without PAT is not available -------\"\ntestCloneGitRepoNoProjectExists ${PRIVATE_REPO_WORKSPACE_NAME} ${NAME_OF_PRIVATE_REPO_WITH_DOT_DEFILE} ${PRIVATE_REPO_WITH_DOT_DEFILE_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n"
  },
  {
    "path": ".ci/openshift-ci/test-gitlab-with-oauth-setup-flow.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport TEST_POD_NAME=${TEST_POD_NAME:-\"oauth-factory-test\"}\nexport GIT_PROVIDER_TYPE=${GIT_PROVIDER_TYPE:-\"gitlab\"}\nexport GIT_PROVIDER_URL=${GIT_PROVIDER_URL:-\"https://gitlab-gitlab-system.apps.git.crw-qe.com\"}\nexport GIT_PROVIDER_LOGIN=${GIT_PROVIDER_LOGIN:-\"admin-user\"}\nexport PRIVATE_REPO_URL=${PRIVATE_REPO_URL:-\"https://gitlab-gitlab-system.apps.git.crw-qe.com/admin-user/private-repo.git\"}\nexport GIT_REPO_BRANCH=${PRIVATE_REPO_BRANCH:-\"main\"}\nexport APPLICATION_NAME=${APPLICATION_NAME:-\"TestApp\"}\nexport OAUTH_ID=\"\"\nexport APPLICATION_ID=\"\"\nexport APPLICATION_SECRET=\"\"\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"collectLogs\" EXIT SIGINT\n\nsetupTestEnvironmentOAuthFlow ${ADMIN_ACCESS_TOKEN} ${APPLICATION_NAME} ${APPLICATION_ID} ${APPLICATION_SECRET}\nstartOAuthFactoryTest\n"
  },
  {
    "path": ".ci/openshift-ci/test-gitlab-with-pat-setup-flow.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# exit immediately when a command fails\nset -ex\n# only exit with zero if all commands of the pipeline exit successfully\nset -o pipefail\n\necho \"======= [INFO] OpenShift CI infrastructure is ready. Running test. =======\"\n\nexport PUBLIC_REPO_URL=${PUBLIC_REPO_URL:-\"https://gitlab.com/chepullreq1/public-repo.git\"}\nexport PRIVATE_REPO_URL=${PRIVATE_REPO_URL:-\"https://gitlab.com/chepullreq1/private-repo.git\"}\nexport GIT_PROVIDER_TYPE=${GIT_PROVIDER_TYPE:-\"gitlab\"}\nexport GIT_PROVIDER_URL=${GIT_PROVIDER_URL:-\"https://gitlab.com\"}\nexport PRIVATE_REPO_SSH_URL=${PRIVATE_REPO_SSH_URL:-\"git@gitlab.com:chepullreq1/private-repo.git\"}\nexport PRIVATE_REPO_RAW_PATH_URL=${PRIVATE_REPO_URL:-\"https://gitlab.com/chepullreq1/private-repo/-/raw/main/devfile.yaml\"}\n\nexport PUBLIC_REPO_WITH_DOT_DEFILE_URL=${PUBLIC_REPO_WITH_DOT_DEFILE_URL:-\"https://gitlab.com/chepullreq1/public-repo-dot-devfile.git\"}\nexport PRIVATE_REPO_WITH_DOT_DEFILE_URL=${PRIVATE_REPO_WITH_DOT_DEFILE_URL:-\"https://gitlab.com/chepullreq1/private-repo-dot-devfile.git\"}\n\nexport NAME_OF_PUBLIC_REPO_WITH_DOT_DEFILE=${NAME_OF_PUBLIC_REPO_WITH_DOT_DEFILE:-\"public-repo-dot-devfile\"}\nexport NAME_OF_PRIVATE_REPO_WITH_DOT_DEFILE=${NAME_OF_PRIVATE_REPO_WITH_DOT_DEFILE:-\"private-repo-dot-devfile\"}\n\n# import common test functions\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\nsource \"${SCRIPT_DIR}\"/common.sh\n\ntrap \"catchFinish\" EXIT SIGINT\n\nsetupTestEnvironment ${OCP_NON_ADMIN_USER_NAME}\nsetupPersonalAccessToken  ${GIT_PROVIDER_TYPE} ${GIT_PROVIDER_URL} ${GITLAB_PAT}\nrequestProvisionNamespace\ntestFactoryResolverWithPatOAuth ${PUBLIC_REPO_URL} ${PRIVATE_REPO_URL}\ntestFactoryResolverWithPatOAuth ${PUBLIC_REPO_WITH_DOT_DEFILE_URL} ${PRIVATE_REPO_WITH_DOT_DEFILE_URL}\n\necho \"------- [INFO] Check clone public repository with PAT setup -------\"\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${PUBLIC_PROJECT_NAME} ${PUBLIC_REPO_URL} ${USER_CHE_NAMESPACE}\ntestGitCredentialsData ${USER_CHE_NAMESPACE} ${GITLAB_PAT} ${GIT_PROVIDER_URL}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\necho \"------- [INFO] Check clone public repository that has .devfile.yaml and with PAT setup -------\"\ntestCloneGitRepoProjectShouldExists ${PUBLIC_REPO_WORKSPACE_NAME} ${NAME_OF_PUBLIC_REPO_WITH_DOT_DEFILE} ${PUBLIC_REPO_WITH_DOT_DEFILE_URL} ${USER_CHE_NAMESPACE}\ntestGitCredentialsData ${USER_CHE_NAMESPACE} ${GITLAB_PAT} ${GIT_PROVIDER_URL}\ndeleteTestWorkspace ${PUBLIC_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\necho \"------- [INFO] Check clone private repository with PAT setup -------\"\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_URL} ${USER_CHE_NAMESPACE}\ntestGitCredentialsData ${USER_CHE_NAMESPACE} ${GITLAB_PAT} ${GIT_PROVIDER_URL}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\necho \"------- [INFO] Check clone private repository that has .devfile.yaml and with PAT setup -------\"\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${NAME_OF_PRIVATE_REPO_WITH_DOT_DEFILE} ${PRIVATE_REPO_WITH_DOT_DEFILE_URL} ${USER_CHE_NAMESPACE}\ntestGitCredentialsData ${USER_CHE_NAMESPACE} ${GITLAB_PAT} ${GIT_PROVIDER_URL}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\necho \"------- [INFO] Check clone private repository by raw devfile URL with PAT setup -------\"\ntestFactoryResolverResponse ${PRIVATE_REPO_RAW_PATH_URL} 200\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_RAW_PATH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n\nsetupSSHKeyPairs \"${GITLAB_PRIVATE_KEY}\" \"${GITLAB_PUBLIC_KEY}\"\n\necho \"------- [INFO] Check clone private repository by SSH URL with PAT setup -------\"\ntestFactoryResolverResponse ${PRIVATE_REPO_SSH_URL} 200\ntestCloneGitRepoProjectShouldExists ${PRIVATE_REPO_WORKSPACE_NAME} ${PRIVATE_PROJECT_NAME} ${PRIVATE_REPO_SSH_URL} ${USER_CHE_NAMESPACE}\ndeleteTestWorkspace ${PRIVATE_REPO_WORKSPACE_NAME} ${USER_CHE_NAMESPACE}\n"
  },
  {
    "path": ".gitattributes",
    "content": "*.sh text eol=lf\n*.ts text eol=lf\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# Global Owners\n* @SDawley @ibuziuk @vinokurig @tolusha\n\n# che.properties file is quasi-documentation, so in future we might grant access to this \n# assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/** @osslate \n\n# deploy\ndeploy/** @tolusha @dkwon17\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!-- Please review the following before submitting a PR:\nChe's Contributing Guide: https://github.com/eclipse/che/blob/master/CONTRIBUTING.md\nPull Request Policy: https://github.com/eclipse/che/wiki/Development-Workflow#pull-requests\n-->\n\n### What does this PR do?\n\n\n### Screenshot/screencast of this PR\n<!-- Please include a screenshot or a screencast explaining what is doing this PR -->\n\n\n### What issues does this PR fix or reference?\n<!-- Please include any related issue from eclipse che repository (or from another issue tracker).\n     Include link to other pull requests like documentation PR from [the docs repo](https://github.com/eclipse/che-docs)\n-->\n\n\n### How to test this PR?\n<!-- Please explain for example :\n  - The test platform (openshift, kubernetes, minikube, CodeReady Container, docker-desktop, etc)\n  - Installation method: chectl / che-operator\n  - steps to reproduce\n -->\n\n\n### PR Checklist\n\n[As the author of this Pull Request I made sure that:](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#pull-request-template-and-its-checklist)\n\n- [ ] [The Eclipse Contributor Agreement is valid](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#the-eclipse-contributor-agreement-is-valid)\n- [ ] [Code produced is complete](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#code-produced-is-complete)\n- [ ] [Code builds without errors](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#code-builds-without-errors)\n- [ ] [Tests are covering the bugfix](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#tests-are-covering-the-bugfix)\n- [ ] [The repository devfile is up to date and works](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#the-repository-devfile-is-up-to-date-and-works)\n- [ ] [Sections `What issues does this PR fix or reference` and `How to test this PR` completed](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#sections-what-issues-does-this-pr-fix-or-reference-and-how-to-test-this-pr-completed)\n- [ ] [Relevant user documentation updated](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#relevant-contributing-documentation-updated)\n- [ ] [Relevant contributing documentation updated](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#relevant-contributing-documentation-updated)\n- [ ] [CI/CD changes implemented, documented and communicated](https://github.com/eclipse/che/blob/master/CONTRIBUTING.md#cicd-changes-implemented-documented-and-communicated)\n\n### Release Notes\n\n### Reviewers\n\nReviewers, please comment how you tested the PR when approving it.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: maven\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n      day: \"sunday\"\n    open-pull-requests-limit: 15\n"
  },
  {
    "path": ".github/workflows/build-pr-check.yml",
    "content": "#\n# Copyright (c) 2020 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n\nname: build-pr-check\n\non: [push, pull_request]\n\nenv:\n  PR_IMAGE_TAG: pr-${{ github.event.pull_request.number }}\n  ORGANIZATION: quay.io/eclipse\n\njobs:\n  build:\n    runs-on: ubuntu-22.04\n    steps:\n    - uses: actions/checkout@v3\n      with:\n        fetch-depth: 0\n    - name: Check all properties have description\n      run: ./check_properties_description.sh\n    - name: Set up JDK 17\n      uses: actions/setup-java@v3\n      with:\n        distribution: 'temurin'\n        java-version: '17'\n        cache: 'maven'\n    - name: Set up QEMU\n      # Skip this and other docker related steps, if the PR is from a forked repo. GitHub secrets\n      # are not available for forked repos, so the podman login step will fail.\n      # See https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions#using-secrets-in-a-workflow\n      if: ${{ ! github.event.pull_request.head.repo.fork }}\n      uses: docker/setup-qemu-action@v3\n    - name: Login to quay.io\n      if: ${{ github.event_name == 'pull_request' && ! github.event.pull_request.head.repo.fork }}\n      uses: redhat-actions/podman-login@v1.7\n      with:\n        username: ${{ secrets.QUAY_USERNAME }}\n        password: ${{ secrets.QUAY_PASSWORD }}\n        registry: quay.io\n    - name: Build with Maven\n      run: mvn -B clean install -U -Pintegration\n    - name: Build and push images\n      if: ${{ github.event_name == 'pull_request' && ! github.event.pull_request.head.repo.fork }}\n      run: ./build/build.sh --tag:${{ env.PR_IMAGE_TAG }} --build-platforms:linux/amd64,linux/ppc64le,linux/arm64,linux/s390x --builder:podman --push-image\n    -\n      name: Comment with image name\n      uses: actions/github-script@v7\n      if: ${{ github.event_name == 'pull_request' && ! github.event.pull_request.head.repo.fork }}\n      with:\n        script: |\n          const { issue: { number: issue_number }, repo: { owner, repo } } = context;\n          const cheServerImage = \"${{ env.ORGANIZATION }}/che-server:${{ env.PR_IMAGE_TAG }}\";\n          const patchCommand = `kubectl patch -n eclipse-che \"checluster/eclipse-che\" --type=json -p=\"[{\\\"op\\\": \\\"replace\\\", \\\"path\\\": \\\"/spec/components/cheServer/deployment\\\", \\\"value\\\": {containers: [{image: \\\"${cheServerImage}\\\", name: che}]}}]\"`;\n          const text = `\n          Docker image build succeeded: **${cheServerImage}**\n          <details>\n          <summary>kubectl patch command</summary>\n          \n          \\`\\`\\`bash\n          ${patchCommand}\n          \\`\\`\\`\n          \n          </details>\n          `;\n          github.rest.issues.createComment({ issue_number, owner, repo, body: text });\n"
  },
  {
    "path": ".github/workflows/che-properties-docs-update.yml",
    "content": "#\n# Copyright (c) 2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n\nname: Update Che docs variables\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n      - '7.[0-9]+.x'\n    paths:\n      - 'assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties'\n      - 'assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/multiuser.properties'\n\njobs:\n  build:\n    runs-on: ubuntu-22.04\n    steps:\n    - name: Execute workflow in Che Docs\n      id: build\n      run: |\n        invokeAction() {\n            this_repo=$1\n            this_action_name=$2\n            this_workflow_id=$3\n            this_var=$4\n            this_val=$5\n\n            # can compute using GH API\n            # workflow_id=$(curl -sSL https://api.github.com/repos/${this_repo}/actions/workflows -H \"Authorization: token ${{ secrets.CHE_BOT_GITHUB_TOKEN }}\" -H \"Accept: application/vnd.github.v3+json\" | jq --arg search_field \"${this_action_name}\" '.workflows[] | select(.name == $search_field).id'); # echo \"workflow_id = $workflow_id\"\n            # or just pass it in\n            workflow_id=$this_workflow_id\n\n            curl -sSL https://api.github.com/repos/${this_repo}/actions/workflows/${workflow_id}/dispatches -X POST -H \"Authorization: token ${{ secrets.CHE_BOT_GITHUB_TOKEN }}\" -H \"Accept: application/vnd.github.v3+json\" -d \"{\\\"ref\\\":\\\"master\\\",\\\"inputs\\\": {\\\"${this_var}\\\":\\\"${this_val}\\\"} }\"\n            echo \"[INFO] Invoked '${this_action_name}' action ($workflow_id) - see https://github.com/${this_repo}/actions?query=workflow%3A%22${this_action_name// /+}%22\"\n        }\n\n        branch=${GITHUB_REF%/}\n        # invoke action from che-docs repo\n        invokeAction eclipse/che-docs \"Update Che variables in the docs\" \"13902929\" branch \"${branch}\"\n"
  },
  {
    "path": ".github/workflows/generate-maven-sbom.yml",
    "content": "name: Generate Maven SBOM\n\non:\n  release:\n    types: [published]\n  workflow_dispatch:\n    inputs:\n      version:\n        description: \"Version\"\n        default: \"main\"\n        required: true\n\nenv:\n  JAVA_VERSION: '11'\n  JAVA_DISTRO: 'temurin'\n  PRODUCT_PATH: './'\n  PLUGIN_VERSION: '2.7.8'\n  SBOM_TYPE: 'makeAggregateBom'\n\npermissions:\n  contents: read\n\njobs:\n  generate-sbom:\n    runs-on: ubuntu-latest\n    outputs:\n      project-version: ${{ steps.version.outputs.PROJECT_VERSION }}\n    steps:\n      - name: Extract version\n        id: version\n        run: |\n          VERSION=\"${{ github.event_name == 'release' && github.event.release.tag_name || github.event.inputs.version }}\"\n          echo \"PROJECT_VERSION=$VERSION\" >> $GITHUB_OUTPUT\n          echo \"Product version: $VERSION\"\n      - name: Checkout repository\n        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2\n        with:\n          fetch-depth: 0\n          ref: ${{ steps.version.outputs.PROJECT_VERSION }}\n\n      - name: Setup Java SDK\n        uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1\n        with:\n          java-version: ${{ env.JAVA_VERSION }}\n          distribution: ${{ env.JAVA_DISTRO }}\n\n      - name: Generate sbom\n        run: |\n          mvn org.cyclonedx:cyclonedx-maven-plugin:$PLUGIN_VERSION:$SBOM_TYPE -f \"$PRODUCT_PATH/pom.xml\"\n\n      - name: Upload sbom\n        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2\n        with:\n          name: sbom\n          path: ${{ env.PRODUCT_PATH }}/target/bom.json\n  \n  store-sbom-data: # stores sbom and metadata in a predefined format for otterdog to pick up\n    needs: ['generate-sbom']\n    uses: eclipse-csi/workflows/.github/workflows/store-sbom-data.yml@main\n    with:\n      projectName: 'che-server'\n      projectVersion: ${{ needs.generate-sbom.outputs.project-version }}\n      bomArtifact: 'sbom'\n      bomFilename: 'bom.json'\n      parentProject: '1ab66138-685e-47bb-9020-feb6ca1fb40c'\n"
  },
  {
    "path": ".github/workflows/next-build.yml",
    "content": "#\n# Copyright (c) 2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n\nname: build-next\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n\njobs:\n  build:\n    runs-on: ubuntu-22.04\n    steps:\n    - uses: actions/checkout@v3\n      with:\n        fetch-depth: 0\n    - name: Set up JDK 17\n      uses: actions/setup-java@v3\n      with:\n        distribution: 'temurin'\n        java-version: '17'\n        cache: 'maven'\n    - name: Set up QEMU\n      uses: docker/setup-qemu-action@v3\n    - name: Login to docker.io\n      uses: redhat-actions/podman-login@v1\n      with:\n        username: ${{ secrets.DOCKERHUB_USERNAME }}\n        password: ${{ secrets.DOCKERHUB_PASSWORD }}\n        registry: docker.io\n    - name: Login to quay.io\n      uses: redhat-actions/podman-login@v1\n      with:\n        username: ${{ secrets.QUAY_USERNAME }}\n        password: ${{ secrets.QUAY_PASSWORD }}\n        registry: quay.io\n    - name: Build with Maven\n      run: mvn -B clean install -U -Pintegration\n    - name: Build and push images\n      id: build\n      run: |\n          echo \"short_sha1=$(git rev-parse --short HEAD)\" >> $GITHUB_OUTPUT\n          ./build/build.sh --tag:next --sha-tag --build-platforms:linux/amd64,linux/ppc64le,linux/arm64,linux/s390x --builder:podman --push-image\n    - name: Create failure MM message\n      if: ${{ failure() }}\n      run: |\n        echo \"{\\\"text\\\":\\\":no_entry_sign: Next Che Server build has failed: https://github.com/eclipse-che/che-server/actions/workflows/next-build.yml\\\"}\" > mattermost.json\n    - name: Send MM message\n      if: ${{ failure() }}\n      uses: mattermost/action-mattermost-notify@1.1.0\n      env:\n        MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}\n        MATTERMOST_CHANNEL: eclipse-che-ci\n        MATTERMOST_USERNAME: che-bot\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "#\n# Copyright (c) 2020-2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n\nname: Release Che Server\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: 'The version that is going to be released. Should be in format 7.y.z'\n        required: true\n        default: ''\n      forceRecreateTags:\n        description: 'If true, tags will be overriden and regenerated. Use with caution.'\n        required: false\n        default: 'false'\n      rebuildFromExistingTags:\n        description: 'If true, and *forceRecreateTags* is false, a checkout to existing tags will be performed.'\n        required: false\n        default: 'false'\n      buildAndPushImages:\n        description: 'If true, Che Server images will be build.'\n        required: false\n        default: 'true'\n      bumpNextVersion:\n        description: 'If true, will update this project to the next version.'\n        required: false\n        default: 'true'\n\njobs:\n  build:\n    runs-on: ubuntu-22.04\n    steps:\n      - uses: actions/checkout@v3\n        with: \n          path: che-server\n          fetch-depth: 0\n      - name: Check existing tag\n        run: |\n          if [[ \"$FORCE_RECREATE_TAGS\" == \"false\" ]] && [[ $(cd che && git ls-remote --exit-code origin refs/tags/${{ github.event.inputs.version }}) ]]; then\n            echo \"cannot create release, when tag already exists\"\n            exit 1\n          fi\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v3\n      - name: Login to docker.io\n        uses: docker/login-action@v2\n        with:\n          username: ${{ secrets.DOCKERHUB_USERNAME }}\n          password: ${{ secrets.DOCKERHUB_PASSWORD }}\n          registry: docker.io\n      - name: Login to quay.io\n        uses: docker/login-action@v2\n        with:\n          username: ${{ secrets.QUAY_USERNAME }}\n          password: ${{ secrets.QUAY_PASSWORD }}\n          registry: quay.io\n      - name: Set up Python 3.9\n        uses: actions/setup-python@v4\n        with:\n          python-version: 3.9\n      - name: Set up JDK 17\n        uses: actions/setup-java@v3\n        with:\n          distribution: 'temurin'\n          java-version: '17'\n          cache: 'maven'\n      - name: Set up environment\n        run: |\n          sudo apt-get update -y || true\n          # install more dependencies\n          sudo apt-get -y -q install wget curl bash git\n          java -version\n          git --version\n          gh --version\n\n          # want >=5\n          bash --version\n\n          java -version\n          which java\n          javac -version\n          which javac\n      - name: Release\n        run: |\n          export CHE_VERSION=\"${{ github.event.inputs.version }}\"\n          echo \"CHE_VERSION=${CHE_VERSION}\"\n\n          export CHE_MAVEN_SETTINGS=${{ secrets.CHE_MAVEN_SETTINGS}}\n          export CHE_OSS_SONATYPE_GPG_KEY=${{ secrets.CHE_OSS_SONATYPE_GPG_KEY}}\n          export CHE_OSS_SONATYPE_PASSPHRASE=${{ secrets.CHE_OSS_SONATYPE_PASSPHRASE}}\n          export CHE_GITHUB_SSH_KEY=${{ secrets.CHE_GITHUB_SSH_KEY}}\n          export CHE_NPM_AUTH_TOKEN=${{ secrets.CHE_NPM_AUTH_TOKEN}}\n\n          export DEPLOY_TO_NEXUS=\"${{ github.event.inputs.deployOnNexus }}\"\n          export AUTORELEASE_ON_NEXUS=\"${{ github.event.inputs.autoReleaseOnNexus }}\"\n          export REBUILD_FROM_EXISTING_TAGS=\"${{ github.event.inputs.rebuildFromExistingTags }}\"\n          export BUILD_AND_PUSH_IMAGES=\"${{ github.event.inputs.buildAndPushImages }}\"\n          export BUMP_NEXT_VERSION=\"${{ github.event.inputs.bumpNextVersion }}\"\n\n          export QUAY_ECLIPSE_CHE_USERNAME=${{ secrets.QUAY_USERNAME }}\n          export QUAY_ECLIPSE_CHE_PASSWORD=${{ secrets.QUAY_PASSWORD }}\n          git config --global user.name \"Mykhailo Kuznietsov\"\n          git config --global user.email \"mkuznets@redhat.com\"\n          export GITHUB_TOKEN=${{ secrets.CHE_BOT_GITHUB_TOKEN }}\n          export CHE_BOT_GITHUB_TOKEN=${{ secrets.CHE_BOT_GITHUB_TOKEN }}\n          set -e\n          # determine which OS we're using: rhel or ubuntu\n          cat /etc/os-release || true\n          ./che-server/make-release.sh\n      - name: Create GH Release\n        id: create_release\n        uses: ncipollo/release-action@v1\n        env:\n          GITHUB_TOKEN: ${{ secrets.CHE_BOT_GITHUB_TOKEN }} \n        with:\n          allowUpdates: true\n          body: Eclipse Che ${{ github.event.inputs.version }}\n          draft: false\n          name: Eclipse Che ${{ github.event.inputs.version }}\n          omitBodyDuringUpdate: true\n          omitNameDuringUpdate: true\n          prerelease: false\n          tag: ${{ github.event.inputs.version }}\n          token: ${{ secrets.CHE_BOT_GITHUB_TOKEN }}\n      #- name: Create failure MM message\n        #if: ${{ failure() }}\n        #run: |\n          #echo \"{\\\"text\\\":\\\":no_entry_sign: Che Server ${{ github.event.inputs.version }} release has failed: https://github.com/eclipse-che/che-server/actions/workflows/release.yml\\\"}\" > mattermost.json\n      #- name: Create success MM message\n        #run: |\n          #echo \"{\\\"text\\\":\\\":white_check_mark: Che Server ${{ github.event.inputs.version }} has been released: https://quay.io/eclipse/che-server:${{ github.event.inputs.version }}\\\"}\" > mattermost.json\n      #- name: Send MM message\n        #if: ${{ success() }} || ${{ failure() }}\n        #uses: mattermost/action-mattermost-notify@1.1.0\n        #env:\n          #MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}\n          #MATTERMOST_CHANNEL: eclipse-che-releases\n          #MATTERMOST_USERNAME: che-bot\n"
  },
  {
    "path": ".github/workflows/try-in-web-ide.yaml",
    "content": "# Add Web IDE link on PRs\nname: Try in Web IDE\n\non:\n  pull_request_target:\n    types: [opened, synchronize]\n\njobs:\n  add-link:\n    runs-on: ubuntu-22.04\n    steps:\n      - name: Web IDE Pull Request Check\n        uses: redhat-actions/try-in-web-ide@v1\n        with:\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          add_comment: false\n"
  },
  {
    "path": ".gitignore",
    "content": ".repository/\n\n# Eclipse  #\n###################\n\n*.launch\n.classpath\n.project\n.settings/\ntarget/\nbin/\ntest-output/\nmaven-eclipse.xml\n.factorypath\n\n# Idea #\n##################\n*.iml\n*.ipr\n*.iws\n.idea/\n\n.vscode/\n\n# Compiled source #\n###################\n!*.com/\n*.class\n*.dll\n*.exe\n*.o\n*.so\n\n# Packages #\n############\n# it's better to unpack these files and commit the raw source\n# git has its own built in compression methods\n*.7z\n*.dmg\n*.gz\n*.iso\n*.jar\n*.rar\n*.tar\n*.zip\n*.war\n*.ear\n\n# Logs and databases #\n######################\n*.log\n*.sqlite\nnpm-debug.log.*\n\n# OS generated files #\n######################\n.DS_Store\nehthumbs.db\nIcon?\nThumbs.db\n*/overlays\n*~\n.directory\nassembly/**/overlays/\n\n# Che files #\n#############\n.che\ndockerfiles/che/eclipse-che.tar.gz\ndockerfiles/che/eclipse-che/\n.unison*\ndocs/_site\ndocs/.sass-cache\ndocs/.jekyll-metadata\ndocs/assets/imgs\n!assembly/assembly-main/src/assembly/bin/\n\n# NodeJs modules #\n##################\nplugins/plugin-terminal-ui/node_modules/\nplugins/plugin-terminal-ui/build/\nrequirements.lock\ntests/e2e/dist/\ntests/e2e/node_modules/\ntests/e2e/report/\ntests/e2e/load-test-folder\n\n# Cypress modules #\n###################\n*/cypress/screenshots\n*/cypress/videos\n*/node_modules\n*/pids\n*/.pid\n*/.seed\n*/lib-cov\n*/coverage\n*/.grunt\n*/.lock-wscript\n*/cypress-tests/dist\n\n# typescript-dto\n/typescript-dto/.pnp.cjs\n"
  },
  {
    "path": ".mvn/jvm.config",
    "content": "-Xmx2048m -Xms1024m -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dgwt.compiler.localWorkers=1\n--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED\n--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED\n--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED\n--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED\n--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED\n--add-exports jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED\n--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED\n--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED\n--add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED\n--add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "## Developing with Eclipse Che\n\nThis project contains a [devfile v2](https://github.com/eclipse-che/che-server/blob/main/devfile.yaml) located in the project's root directory.\nWith this devfile you can perform the following tasks:\n\n- Build project sources with maven.\n- Build a container image.\n- Install [checlt cli tool](https://github.com/che-incubator/chectl).\n- Start debug session.\n- Push your changes to GitHub.\n\n### Starting a Workspace within Eclipse Che\n\nTo start a new workspace within Eclipse Che, navigate to the following URL:\n\n```sh\n{CHE-HOST}/#https://github.com/eclipse-che/che-server\n```\n\n### Running Devfile Tasks for Downloading Dependencies and Building the Project\n\nFor VS Code, execute tasks defined in the devfile with these steps:\n\n1. Open the command palette (Ctrl/Cmd + Shift + P).\n2. Execute the `Tasks: Run Task` command.\n3. Select the `devfile` folder  and select the `1. Build sources` task to build the project sources with maven.\n4. Follow steps 1 and 2 again, select the `1. Build image` task in the `devfile` folder to build a container image.\n5. Follow steps 1 and 2 again, select the `3. Install chectl` task in the `devfile` folder to install the chectl cli tool.\n6. In the workspace terminal, tag the **che-server** image with your account: `podman tag quay.io/eclipse/che-server:next <docker registry>/<your account>/che-server:next`.\n7. Push the **che-server** image to your account: `podman push <docker registry>/<your account>/che-server:next`.\n\n# Local build requirements\n- Apache Maven 3.9 or later\n- JDK 17\n- Podman or Docker (required for running integration tests)\nA Che workspace environment allows to build the image internally, using the workspace terminal.\n\n# Start and debug\n1. Deploy Che to a [Red Hat OpenShift](https://www.eclipse.org/che/docs/stable/administration-guide/installing-che-on-openshift-using-cli/) or [Minikube](https://www.eclipse.org/che/docs/stable/administration-guide/installing-che-on-minikube/) cluster by using a previously built image: `chectl server:deploy --platform=<openshift / minikube> --cheimage=<docker registry>/<your account>/che-server:next --debug`.\n2. Enable local debugging of the Eclipse Che server: `chectl server:debug` in a terminal.\n3. Hit a breakpoint in the code.\n4. Open the `Run and Debug` (Ctrl/Cmd + Shift + D) panel.\n5. Click the `Start Debugging` (F5) button.\n\n# Contributing an SCM provider\nAn SCM provider support has to be provided by adding new maven modules to the wsmaster directory.\n\n## Implementing che-core-api-oauth-<SCM provider name> module\nThis module is responsible for Oauth requests to the SCM provider and contans next implementations:\n1. `<SCM provider name>OAuthAuthenticator` contains specific implementation of Oauth token requestand authentication endpoint.\n2. `<SCM provider name>OAuthAuthenticatorProvider` a provider of the `OAuthAuthenticator`.\n\n## Implementing coresponding che-core-api-factory-<SCM provider name> module\nThis module is responsible for API operations of the specific SCM provider.\n1. `<SCM provider name>ApiClient` contains all necessary HTTP API calls like `getUser()`.\n2. `<SCM provider name>AuthorisingFileContentProvider` overrides the common `AuthorisingFileContentProvider` to define the specific `isPublicRepository()` function.\n3. `<SCM provider name>FactoryParameterResolver` validates SCM URL if it corresponds to the SCM provider. Also Provides specific Factory Parameters resolver for the SCM repository.\n4. `<SCM provider name>PersonalAccessTokenFetcher` fetches Personal Access Token from the SCM provider by reqesting the OAuth API of the provider. Validates the token by comparing the token access scopes with the predefined scope list.\n5. `<SCM provider name>FileResolver` Implementation of a resolver that can return particular file content from specified SCM repository.\n6. `<SCM provider name>URLParser` Parses the string representation of the URL to an SCM specific object\n7. `<SCM provider name>UserDataFetcher` Implementation of a resolver that can return particular file content from specified SCM repository.\n\n# CI\nThere are several [GitHub Actions](https://github.com/eclipse-che/che-server/actions) workflows implemented for this repository:\n\n- [![build-next](https://github.com/eclipse-che/che-server/actions/workflows/next-build.yml/badge.svg)](https://github.com/eclipse-che/che-server/actions/workflows/next-build.yml)  \nBuilds Maven artifacts, builds container images and pushes them to [quay.io](https://quay.io/organization/eclipse) on each commit to [`main`](https://github.com/eclipse-che/che-server/tree/main) branch.\n- [![Release Che Server](https://github.com/eclipse-che/che-server/actions/workflows/release.yml/badge.svg)](https://github.com/eclipse-che/che-server/actions/workflows/release.yml)  \nBuilds Maven artifacts and container images. Images are public and pushed to [quay.io](https://quay.io/organization/eclipse). See [RELEASE.md](https://github.com/eclipse-che/che-server/blob/master/RELEASE.md) for more information about this workflow.\n- [![Release Changelog](https://github.com/eclipse-che/che-server/actions/workflows/release-changelog.yml/badge.svg)](https://github.com/eclipse-che/che-server/actions/workflows/release-changelog.yml)  \nCreates a GitHub release which will include a generated changelog.\n- [![Update Che docs variables](https://github.com/eclipse-che/che-server/actions/workflows/che-properties-docs-update.yml/badge.svg)](https://github.com/eclipse-che/che-server/actions/workflows/che-properties-docs-update.yml/badge.svg)  \nRuns on each commit to [`main`](https://github.com/eclipse-che/che-server/tree/main) branch.\n- [![build-pr-check](https://github.com/eclipse-che/che-server/actions/workflows/build-pr-check.yml/badge.svg)](https://github.com/eclipse-che/che-server/actions/workflows/build-pr-check.yml)  \nBuilds Maven artifacts and container images. This workflow is used as a check for all pull requests that are submitted to this project.\n- [![Sonar](https://github.com/eclipse-che/che-server/actions/workflows/sonar.yaml/badge.svg)](https://github.com/eclipse-che/che-server/actions/workflows/sonar.yaml)  \nRuns Sonar against the main branch. The result can be seen [here](https://sonarcloud.io/dashboard?id=org.eclipse.che%3Ache-server).\n- [![Try in Web IDE](https://github.com/eclipse-che/che-server/actions/workflows/try-in-web-ide.yaml/badge.svg)](https://github.com/eclipse-che/che-server/actions/workflows/try-in-web-ide.yaml)  \nUsed as a check for pull requests that are submitted to this project. \n\nDownstream builds can be found at the link below, which is _internal to Red Hat_. Stable builds can be found by replacing the 3.x with a specific version like 3.2. \n\n- [server_3.x](https://main-jenkins-csb-crwqe.apps.ocp-c1.prod.psi.redhat.com/job/DS_CI/job/server_3.x/)\n\n# Report issues\nIssues are tracked on the main Eclipse Che Repository: https://github.com/eclipse/che/issues\n"
  },
  {
    "path": "LICENSE",
    "content": "Eclipse Public License - v 2.0\n\n    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n    PUBLIC LICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION\n    OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\n\n1. DEFINITIONS\n\n\"Contribution\" means:\n\n  a) in the case of the initial Contributor, the initial content\n     Distributed under this Agreement, and\n\n  b) in the case of each subsequent Contributor:\n     i) changes to the Program, and\n     ii) additions to the Program;\n  where such changes and/or additions to the Program originate from\n  and are Distributed by that particular Contributor. A Contribution\n  \"originates\" from a Contributor if it was added to the Program by\n  such Contributor itself or anyone acting on such Contributor's behalf.\n  Contributions do not include changes or additions to the Program that\n  are not Modified Works.\n\n\"Contributor\" means any person or entity that Distributes the Program.\n\n\"Licensed Patents\" mean patent claims licensable by a Contributor which\nare necessarily infringed by the use or sale of its Contribution alone\nor when combined with the Program.\n\n\"Program\" means the Contributions Distributed in accordance with this\nAgreement.\n\n\"Recipient\" means anyone who receives the Program under this Agreement\nor any Secondary License (as applicable), including Contributors.\n\n\"Derivative Works\" shall mean any work, whether in Source Code or other\nform, that is based on (or derived from) the Program and for which the\neditorial revisions, annotations, elaborations, or other modifications\nrepresent, as a whole, an original work of authorship.\n\n\"Modified Works\" shall mean any work in Source Code or other form that\nresults from an addition to, deletion from, or modification of the\ncontents of the Program, including, for purposes of clarity any new file\nin Source Code form that contains any contents of the Program. Modified\nWorks shall not include works that contain only declarations,\ninterfaces, types, classes, structures, or files of the Program solely\nin each case in order to link to, bind by name, or subclass the Program\nor Modified Works thereof.\n\n\"Distribute\" means the acts of a) distributing or b) making available\nin any manner that enables the transfer of a copy.\n\n\"Source Code\" means the form of a Program preferred for making\nmodifications, including but not limited to software source code,\ndocumentation source, and configuration files.\n\n\"Secondary License\" means either the GNU General Public License,\nVersion 2.0, or any later versions of that license, including any\nexceptions or additional permissions as identified by the initial\nContributor.\n\n2. GRANT OF RIGHTS\n\n  a) Subject to the terms of this Agreement, each Contributor hereby\n  grants Recipient a non-exclusive, worldwide, royalty-free copyright\n  license to reproduce, prepare Derivative Works of, publicly display,\n  publicly perform, Distribute and sublicense the Contribution of such\n  Contributor, if any, and such Derivative Works.\n\n  b) Subject to the terms of this Agreement, each Contributor hereby\n  grants Recipient a non-exclusive, worldwide, royalty-free patent\n  license under Licensed Patents to make, use, sell, offer to sell,\n  import and otherwise transfer the Contribution of such Contributor,\n  if any, in Source Code or other form. This patent license shall\n  apply to the combination of the Contribution and the Program if, at\n  the time the Contribution is added by the Contributor, such addition\n  of the Contribution causes such combination to be covered by the\n  Licensed Patents. The patent license shall not apply to any other\n  combinations which include the Contribution. No hardware per se is\n  licensed hereunder.\n\n  c) Recipient understands that although each Contributor grants the\n  licenses to its Contributions set forth herein, no assurances are\n  provided by any Contributor that the Program does not infringe the\n  patent or other intellectual property rights of any other entity.\n  Each Contributor disclaims any liability to Recipient for claims\n  brought by any other entity based on infringement of intellectual\n  property rights or otherwise. As a condition to exercising the\n  rights and licenses granted hereunder, each Recipient hereby\n  assumes sole responsibility to secure any other intellectual\n  property rights needed, if any. For example, if a third party\n  patent license is required to allow Recipient to Distribute the\n  Program, it is Recipient's responsibility to acquire that license\n  before distributing the Program.\n\n  d) Each Contributor represents that to its knowledge it has\n  sufficient copyright rights in its Contribution, if any, to grant\n  the copyright license set forth in this Agreement.\n\n  e) Notwithstanding the terms of any Secondary License, no\n  Contributor makes additional grants to any Recipient (other than\n  those set forth in this Agreement) as a result of such Recipient's\n  receipt of the Program under the terms of a Secondary License\n  (if permitted under the terms of Section 3).\n\n3. REQUIREMENTS\n\n3.1 If a Contributor Distributes the Program in any form, then:\n\n  a) the Program must also be made available as Source Code, in\n  accordance with section 3.2, and the Contributor must accompany\n  the Program with a statement that the Source Code for the Program\n  is available under this Agreement, and informs Recipients how to\n  obtain it in a reasonable manner on or through a medium customarily\n  used for software exchange; and\n\n  b) the Contributor may Distribute the Program under a license\n  different than this Agreement, provided that such license:\n     i) effectively disclaims on behalf of all other Contributors all\n     warranties and conditions, express and implied, including\n     warranties or conditions of title and non-infringement, and\n     implied warranties or conditions of merchantability and fitness\n     for a particular purpose;\n\n     ii) effectively excludes on behalf of all other Contributors all\n     liability for damages, including direct, indirect, special,\n     incidental and consequential damages, such as lost profits;\n\n     iii) does not attempt to limit or alter the recipients' rights\n     in the Source Code under section 3.2; and\n\n     iv) requires any subsequent distribution of the Program by any\n     party to be under a license that satisfies the requirements\n     of this section 3.\n\n3.2 When the Program is Distributed as Source Code:\n\n  a) it must be made available under this Agreement, or if the\n  Program (i) is combined with other material in a separate file or\n  files made available under a Secondary License, and (ii) the initial\n  Contributor attached to the Source Code the notice described in\n  Exhibit A of this Agreement, then the Program may be made available\n  under the terms of such Secondary Licenses, and\n\n  b) a copy of this Agreement must be included with each copy of\n  the Program.\n\n3.3 Contributors may not remove or alter any copyright, patent,\ntrademark, attribution notices, disclaimers of warranty, or limitations\nof liability (\"notices\") contained within the Program from any copy of\nthe Program which they Distribute, provided that Contributors may add\ntheir own appropriate notices.\n\n4. COMMERCIAL DISTRIBUTION\n\nCommercial distributors of software may accept certain responsibilities\nwith respect to end users, business partners and the like. While this\nlicense is intended to facilitate the commercial use of the Program,\nthe Contributor who includes the Program in a commercial product\noffering should do so in a manner which does not create potential\nliability for other Contributors. Therefore, if a Contributor includes\nthe Program in a commercial product offering, such Contributor\n(\"Commercial Contributor\") hereby agrees to defend and indemnify every\nother Contributor (\"Indemnified Contributor\") against any losses,\ndamages and costs (collectively \"Losses\") arising from claims, lawsuits\nand other legal actions brought by a third party against the Indemnified\nContributor to the extent caused by the acts or omissions of such\nCommercial Contributor in connection with its distribution of the Program\nin a commercial product offering. The obligations in this section do not\napply to any claims or Losses relating to any actual or alleged\nintellectual property infringement. In order to qualify, an Indemnified\nContributor must: a) promptly notify the Commercial Contributor in\nwriting of such claim, and b) allow the Commercial Contributor to control,\nand cooperate with the Commercial Contributor in, the defense and any\nrelated settlement negotiations. The Indemnified Contributor may\nparticipate in any such claim at its own expense.\n\nFor example, a Contributor might include the Program in a commercial\nproduct offering, Product X. That Contributor is then a Commercial\nContributor. If that Commercial Contributor then makes performance\nclaims, or offers warranties related to Product X, those performance\nclaims and warranties are such Commercial Contributor's responsibility\nalone. Under this section, the Commercial Contributor would have to\ndefend claims against the other Contributors related to those performance\nclaims and warranties, and if a court requires any other Contributor to\npay any damages as a result, the Commercial Contributor must pay\nthose damages.\n\n5. NO WARRANTY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT\nPERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN \"AS IS\"\nBASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR\nIMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF\nTITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR\nPURPOSE. Each Recipient is solely responsible for determining the\nappropriateness of using and distributing the Program and assumes all\nrisks associated with its exercise of rights under this Agreement,\nincluding but not limited to the risks and costs of program errors,\ncompliance with applicable laws, damage to or loss of data, programs\nor equipment, and unavailability or interruption of operations.\n\n6. DISCLAIMER OF LIABILITY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT\nPERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS\nSHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST\nPROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE\nEXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n7. GENERAL\n\nIf any provision of this Agreement is invalid or unenforceable under\napplicable law, it shall not affect the validity or enforceability of\nthe remainder of the terms of this Agreement, and without further\naction by the parties hereto, such provision shall be reformed to the\nminimum extent necessary to make such provision valid and enforceable.\n\nIf Recipient institutes patent litigation against any entity\n(including a cross-claim or counterclaim in a lawsuit) alleging that the\nProgram itself (excluding combinations of the Program with other software\nor hardware) infringes such Recipient's patent(s), then such Recipient's\nrights granted under Section 2(b) shall terminate as of the date such\nlitigation is filed.\n\nAll Recipient's rights under this Agreement shall terminate if it\nfails to comply with any of the material terms or conditions of this\nAgreement and does not cure such failure in a reasonable period of\ntime after becoming aware of such noncompliance. If all Recipient's\nrights under this Agreement terminate, Recipient agrees to cease use\nand distribution of the Program as soon as reasonably practicable.\nHowever, Recipient's obligations under this Agreement and any licenses\ngranted by Recipient relating to the Program shall continue and survive.\n\nEveryone is permitted to copy and distribute copies of this Agreement,\nbut in order to avoid inconsistency the Agreement is copyrighted and\nmay only be modified in the following manner. The Agreement Steward\nreserves the right to publish new versions (including revisions) of\nthis Agreement from time to time. No one other than the Agreement\nSteward has the right to modify this Agreement. The Eclipse Foundation\nis the initial Agreement Steward. The Eclipse Foundation may assign the\nresponsibility to serve as the Agreement Steward to a suitable separate\nentity. Each new version of the Agreement will be given a distinguishing\nversion number. The Program (including Contributions) may always be\nDistributed subject to the version of the Agreement under which it was\nreceived. In addition, after a new version of the Agreement is published,\nContributor may elect to Distribute the Program (including its\nContributions) under the new version.\n\nExcept as expressly stated in Sections 2(a) and 2(b) above, Recipient\nreceives no rights or licenses to the intellectual property of any\nContributor under this Agreement, whether expressly, by implication,\nestoppel or otherwise. All rights in the Program not expressly granted\nunder this Agreement are reserved. Nothing in this Agreement is intended\nto be enforceable by any entity that is not a Contributor or Recipient.\nNo third-party beneficiary rights are created under this Agreement.\n\nExhibit A - Form of Secondary Licenses Notice\n\n\"This Source Code may also be made available under the following\nSecondary Licenses when the conditions for such availability set forth\nin the Eclipse Public License, v. 2.0 are satisfied: {name license(s),\nversion(s), and exceptions or additional permissions here}.\"\n\n  Simply including a copy of this Agreement, including this Exhibit A\n  is not sufficient to license the Source Code under Secondary Licenses.\n\n  If it is not possible or desirable to put the notice in a particular\n  file, then You may include the notice in a location (such as a LICENSE\n  file in a relevant directory) where a recipient would be likely to\n  look for such a notice.\n\n  You may add additional accurate notices of copyright ownership.\n"
  },
  {
    "path": "NUMBERING.md",
    "content": "### Schema\n```\na.b.c-d\n  a = major\n  b = feature\n  c = bug fix\n  d = development, numbered as `<rc>d`\n```\n\n### Release\n```\na.b.0 - initial\na.b.c - bug fixing\n```\n\n## EXAMPLE\n### Before Stable Release\n```\n4.0.0-rc1-SNAPSHOT - This is a build\n4.0.0-rc1          - This is a release  \n4.0.0-rc2-SNAPSHOT - This is a build\n4.0.0-rc2          - This is a release\n```\n\n### Ship\n```\n4.0.0 \n```\n\n### Branch For Fixes\n```\n4.0.x\n```\n\n### Version For Fixes On Ship Release\n```\n4.0.1\n4.0.2\n```\n"
  },
  {
    "path": "README.md",
    "content": "[![Contribute](https://www.eclipse.org/che/contribute.svg)](https://workspaces.openshift.com#https://github.com/eclipse-che/che-server)\n\n# What is Che server\nChe Server provides an API for managing Kubernetes namespaces and to retrieve devfile content from repositories,\nhosted on GitHub, GitLab, Bitbucket and Microsoft Azure Repos.\n\n# Project structure\nChe Server is mostly a Java web application deployed on an Apache Tomcat server in a container. Che Server uses the following modules:     \n### OAuth1 / OAuth2 API implementations\n- wsmaster/che-core-api-auth\n- wsmaster/che-core-api-azure-devops\n- wsmaster/che-core-api-bitbucket\n- wsmaster/che-core-api-github\n- wsmaster/che-core-api-gitlab\n### Factory flow implementations\n- wsmaster/che-core-api-factory-azure-devops\n- wsmaster/che-core-api-factory-bitbucket\n- wsmaster/che-core-api-factory-bitbucket-server\n- wsmaster/che-core-api-factory-github\n- wsmaster/che-core-api-factory-gitlab\n- wsmaster/che-core-api-factory-shared\n### Kubernetes namespace provisioning\n- infrastructures/kubernetes\n- infrastructure/openshift\n- infrastructures/infrastructure-factory\n\nOther modules are deprecated and will be removed in the future.\n\n# License\n\n- [Eclipse Public License 2.0](LICENSE)\n\n# Join the community\n\nThe Eclipse Che community is globally reachable through public chat rooms, mailing list and weekly calls.\nSee the Eclipse Che Documentation about [how you can join our community](https://www.eclipse.org/che/docs/stable/overview/introduction-to-eclipse-che/#_joining_the_community).\n\n## Builds\n\n* [![release latest stable](https://github.com/eclipse-che/che-server/actions/workflows/release.yml/badge.svg)](https://github.com/eclipse-che/che-server/actions/workflows/release.yml)\n\n## SBOM\n\nTo enhance supply chain security and offer users clear insight into project  components, Eclipse Che now generates a Software Bill of Materials (SBOM) for every release. These are published to the Eclipse Foundation SBOM registry, with access instructions and usage details available in this [documentation](https://eclipse-csi.github.io/security-handbook/sbom/registry.html).\n"
  },
  {
    "path": "RELEASE.md",
    "content": "# Automated release workflow\nRelease is performed with GitHub Actions workflow [release.yml](https://github.com/eclipse/che/actions/workflows/release.yml).\nThe release will perform the build of Maven Artifacts, build and push of all nesessary docker images, and bumping up development version.\n\n[make-release.sh](https://github.com/eclipse/che/blob/master/make-release.sh) is the script that can be used for standalone release outside of GitHub Actions. However, ensure that all environment variables are set in place before invoking `./make-release.sh`, similarly to how it is outlined in [release.yml](https://github.com/eclipse/che/actions/workflows/release.yml):\n\nREBUILD_FROM_EXISTING_TAGS - if `true`, release will not create new tag, but instead checkout to existing one. Use this to rerun failed attempts, without having to recreate the tag.\nBUILD_AND_PUSH_IMAGES - if `true`, will build all asociated images in [dockerfiles](https://github.com/eclipse/che/tree/master/dockerfiles) directory. Set `false`, if this step needs to be skipped.\nBUMP_NEXT_VERSION - if `true`, will increase the development versions in main and bugfix branches. Set false, if this step needs to be skipped\n"
  },
  {
    "path": "assembly/assembly-che-tomcat/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-assembly-parent</artifactId>\n        <groupId>org.eclipse.che</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>assembly-che-tomcat</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Assembly :: Assemblies Che Tomcat</name>\n    <build>\n        <finalName>assembly-che-tomcat</finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-assembly-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>make-assembly</id>\n                        <phase>package</phase>\n                        <goals>\n                            <goal>single</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <configuration>\n                    <appendAssemblyId>false</appendAssemblyId>\n                    <updateOnly>false</updateOnly>\n                    <descriptors>\n                        <descriptor>${project.basedir}/src/assembly/assembly.xml</descriptor>\n                    </descriptors>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-clean-plugin</artifactId>\n                <configuration>\n                    <excludeDefaultDirectories>true</excludeDefaultDirectories>\n                    <filesets>\n                        <fileset>\n                            <directory>${project.build.directory}</directory>\n                            <includes>\n                                <include>**/*</include>\n                            </includes>\n                        </fileset>\n                    </filesets>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-dependency-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>unpack-tomcat</id>\n                        <phase>prepare-package</phase>\n                        <goals>\n                            <goal>unpack</goal>\n                        </goals>\n                        <configuration>\n                            <artifactItems>\n                                <artifactItem>\n                                    <groupId>org.apache.tomcat</groupId>\n                                    <artifactId>tomcat</artifactId>\n                                    <type>zip</type>\n                                    <version>${org.apache.tomcat.version}</version>\n                                    <overWrite>false</overWrite>\n                                </artifactItem>\n                            </artifactItems>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>analyze</id>\n                        <configuration>\n                            <skip>true</skip>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "assembly/assembly-che-tomcat/src/assembly/LICENSE-tomcat.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n\n\nAPACHE TOMCAT SUBCOMPONENTS:\n\nApache Tomcat includes a number of subcomponents with separate copyright notices\nand license terms. Your use of these subcomponents is subject to the terms and\nconditions of the following licenses.\n\n\nFor the Eclipse JDT Core Batch Compiler (ecj-x.x.x.jar) component and the\nfollowing Jakarta EE Schemas:\n- jakartaee_9.xsd\n- jakarta_web-services_2_0.xsd\n- jakarta_web-services_client_2_0.xsd\n- jsp_3_0.xsd\n- web-app_5_0.xsd\n- web-commonn_5_0.xsd\n- web-fragment_5_0.xsd\n- web-jsptaglibrary_3_0.xsd\n\nEclipse Public License - v 2.0\n\n    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n    PUBLIC LICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION\n    OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\n\n1. DEFINITIONS\n\n\"Contribution\" means:\n\n  a) in the case of the initial Contributor, the initial content\n     Distributed under this Agreement, and\n\n  b) in the case of each subsequent Contributor:\n     i) changes to the Program, and\n     ii) additions to the Program;\n  where such changes and/or additions to the Program originate from\n  and are Distributed by that particular Contributor. A Contribution\n  \"originates\" from a Contributor if it was added to the Program by\n  such Contributor itself or anyone acting on such Contributor's behalf.\n  Contributions do not include changes or additions to the Program that\n  are not Modified Works.\n\n\"Contributor\" means any person or entity that Distributes the Program.\n\n\"Licensed Patents\" mean patent claims licensable by a Contributor which\nare necessarily infringed by the use or sale of its Contribution alone\nor when combined with the Program.\n\n\"Program\" means the Contributions Distributed in accordance with this\nAgreement.\n\n\"Recipient\" means anyone who receives the Program under this Agreement\nor any Secondary License (as applicable), including Contributors.\n\n\"Derivative Works\" shall mean any work, whether in Source Code or other\nform, that is based on (or derived from) the Program and for which the\neditorial revisions, annotations, elaborations, or other modifications\nrepresent, as a whole, an original work of authorship.\n\n\"Modified Works\" shall mean any work in Source Code or other form that\nresults from an addition to, deletion from, or modification of the\ncontents of the Program, including, for purposes of clarity any new file\nin Source Code form that contains any contents of the Program. Modified\nWorks shall not include works that contain only declarations,\ninterfaces, types, classes, structures, or files of the Program solely\nin each case in order to link to, bind by name, or subclass the Program\nor Modified Works thereof.\n\n\"Distribute\" means the acts of a) distributing or b) making available\nin any manner that enables the transfer of a copy.\n\n\"Source Code\" means the form of a Program preferred for making\nmodifications, including but not limited to software source code,\ndocumentation source, and configuration files.\n\n\"Secondary License\" means either the GNU General Public License,\nVersion 2.0, or any later versions of that license, including any\nexceptions or additional permissions as identified by the initial\nContributor.\n\n2. GRANT OF RIGHTS\n\n  a) Subject to the terms of this Agreement, each Contributor hereby\n  grants Recipient a non-exclusive, worldwide, royalty-free copyright\n  license to reproduce, prepare Derivative Works of, publicly display,\n  publicly perform, Distribute and sublicense the Contribution of such\n  Contributor, if any, and such Derivative Works.\n\n  b) Subject to the terms of this Agreement, each Contributor hereby\n  grants Recipient a non-exclusive, worldwide, royalty-free patent\n  license under Licensed Patents to make, use, sell, offer to sell,\n  import and otherwise transfer the Contribution of such Contributor,\n  if any, in Source Code or other form. This patent license shall\n  apply to the combination of the Contribution and the Program if, at\n  the time the Contribution is added by the Contributor, such addition\n  of the Contribution causes such combination to be covered by the\n  Licensed Patents. The patent license shall not apply to any other\n  combinations which include the Contribution. No hardware per se is\n  licensed hereunder.\n\n  c) Recipient understands that although each Contributor grants the\n  licenses to its Contributions set forth herein, no assurances are\n  provided by any Contributor that the Program does not infringe the\n  patent or other intellectual property rights of any other entity.\n  Each Contributor disclaims any liability to Recipient for claims\n  brought by any other entity based on infringement of intellectual\n  property rights or otherwise. As a condition to exercising the\n  rights and licenses granted hereunder, each Recipient hereby\n  assumes sole responsibility to secure any other intellectual\n  property rights needed, if any. For example, if a third party\n  patent license is required to allow Recipient to Distribute the\n  Program, it is Recipient's responsibility to acquire that license\n  before distributing the Program.\n\n  d) Each Contributor represents that to its knowledge it has\n  sufficient copyright rights in its Contribution, if any, to grant\n  the copyright license set forth in this Agreement.\n\n  e) Notwithstanding the terms of any Secondary License, no\n  Contributor makes additional grants to any Recipient (other than\n  those set forth in this Agreement) as a result of such Recipient's\n  receipt of the Program under the terms of a Secondary License\n  (if permitted under the terms of Section 3).\n\n3. REQUIREMENTS\n\n3.1 If a Contributor Distributes the Program in any form, then:\n\n  a) the Program must also be made available as Source Code, in\n  accordance with section 3.2, and the Contributor must accompany\n  the Program with a statement that the Source Code for the Program\n  is available under this Agreement, and informs Recipients how to\n  obtain it in a reasonable manner on or through a medium customarily\n  used for software exchange; and\n\n  b) the Contributor may Distribute the Program under a license\n  different than this Agreement, provided that such license:\n     i) effectively disclaims on behalf of all other Contributors all\n     warranties and conditions, express and implied, including\n     warranties or conditions of title and non-infringement, and\n     implied warranties or conditions of merchantability and fitness\n     for a particular purpose;\n\n     ii) effectively excludes on behalf of all other Contributors all\n     liability for damages, including direct, indirect, special,\n     incidental and consequential damages, such as lost profits;\n\n     iii) does not attempt to limit or alter the recipients' rights\n     in the Source Code under section 3.2; and\n\n     iv) requires any subsequent distribution of the Program by any\n     party to be under a license that satisfies the requirements\n     of this section 3.\n\n3.2 When the Program is Distributed as Source Code:\n\n  a) it must be made available under this Agreement, or if the\n  Program (i) is combined with other material in a separate file or\n  files made available under a Secondary License, and (ii) the initial\n  Contributor attached to the Source Code the notice described in\n  Exhibit A of this Agreement, then the Program may be made available\n  under the terms of such Secondary Licenses, and\n\n  b) a copy of this Agreement must be included with each copy of\n  the Program.\n\n3.3 Contributors may not remove or alter any copyright, patent,\ntrademark, attribution notices, disclaimers of warranty, or limitations\nof liability (\"notices\") contained within the Program from any copy of\nthe Program which they Distribute, provided that Contributors may add\ntheir own appropriate notices.\n\n4. COMMERCIAL DISTRIBUTION\n\nCommercial distributors of software may accept certain responsibilities\nwith respect to end users, business partners and the like. While this\nlicense is intended to facilitate the commercial use of the Program,\nthe Contributor who includes the Program in a commercial product\noffering should do so in a manner which does not create potential\nliability for other Contributors. Therefore, if a Contributor includes\nthe Program in a commercial product offering, such Contributor\n(\"Commercial Contributor\") hereby agrees to defend and indemnify every\nother Contributor (\"Indemnified Contributor\") against any losses,\ndamages and costs (collectively \"Losses\") arising from claims, lawsuits\nand other legal actions brought by a third party against the Indemnified\nContributor to the extent caused by the acts or omissions of such\nCommercial Contributor in connection with its distribution of the Program\nin a commercial product offering. The obligations in this section do not\napply to any claims or Losses relating to any actual or alleged\nintellectual property infringement. In order to qualify, an Indemnified\nContributor must: a) promptly notify the Commercial Contributor in\nwriting of such claim, and b) allow the Commercial Contributor to control,\nand cooperate with the Commercial Contributor in, the defense and any\nrelated settlement negotiations. The Indemnified Contributor may\nparticipate in any such claim at its own expense.\n\nFor example, a Contributor might include the Program in a commercial\nproduct offering, Product X. That Contributor is then a Commercial\nContributor. If that Commercial Contributor then makes performance\nclaims, or offers warranties related to Product X, those performance\nclaims and warranties are such Commercial Contributor's responsibility\nalone. Under this section, the Commercial Contributor would have to\ndefend claims against the other Contributors related to those performance\nclaims and warranties, and if a court requires any other Contributor to\npay any damages as a result, the Commercial Contributor must pay\nthose damages.\n\n5. NO WARRANTY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT\nPERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN \"AS IS\"\nBASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR\nIMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF\nTITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR\nPURPOSE. Each Recipient is solely responsible for determining the\nappropriateness of using and distributing the Program and assumes all\nrisks associated with its exercise of rights under this Agreement,\nincluding but not limited to the risks and costs of program errors,\ncompliance with applicable laws, damage to or loss of data, programs\nor equipment, and unavailability or interruption of operations.\n\n6. DISCLAIMER OF LIABILITY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT\nPERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS\nSHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST\nPROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE\nEXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n7. GENERAL\n\nIf any provision of this Agreement is invalid or unenforceable under\napplicable law, it shall not affect the validity or enforceability of\nthe remainder of the terms of this Agreement, and without further\naction by the parties hereto, such provision shall be reformed to the\nminimum extent necessary to make such provision valid and enforceable.\n\nIf Recipient institutes patent litigation against any entity\n(including a cross-claim or counterclaim in a lawsuit) alleging that the\nProgram itself (excluding combinations of the Program with other software\nor hardware) infringes such Recipient's patent(s), then such Recipient's\nrights granted under Section 2(b) shall terminate as of the date such\nlitigation is filed.\n\nAll Recipient's rights under this Agreement shall terminate if it\nfails to comply with any of the material terms or conditions of this\nAgreement and does not cure such failure in a reasonable period of\ntime after becoming aware of such noncompliance. If all Recipient's\nrights under this Agreement terminate, Recipient agrees to cease use\nand distribution of the Program as soon as reasonably practicable.\nHowever, Recipient's obligations under this Agreement and any licenses\ngranted by Recipient relating to the Program shall continue and survive.\n\nEveryone is permitted to copy and distribute copies of this Agreement,\nbut in order to avoid inconsistency the Agreement is copyrighted and\nmay only be modified in the following manner. The Agreement Steward\nreserves the right to publish new versions (including revisions) of\nthis Agreement from time to time. No one other than the Agreement\nSteward has the right to modify this Agreement. The Eclipse Foundation\nis the initial Agreement Steward. The Eclipse Foundation may assign the\nresponsibility to serve as the Agreement Steward to a suitable separate\nentity. Each new version of the Agreement will be given a distinguishing\nversion number. The Program (including Contributions) may always be\nDistributed subject to the version of the Agreement under which it was\nreceived. In addition, after a new version of the Agreement is published,\nContributor may elect to Distribute the Program (including its\nContributions) under the new version.\n\nExcept as expressly stated in Sections 2(a) and 2(b) above, Recipient\nreceives no rights or licenses to the intellectual property of any\nContributor under this Agreement, whether expressly, by implication,\nestoppel or otherwise. All rights in the Program not expressly granted\nunder this Agreement are reserved. Nothing in this Agreement is intended\nto be enforceable by any entity that is not a Contributor or Recipient.\nNo third-party beneficiary rights are created under this Agreement.\n\nExhibit A - Form of Secondary Licenses Notice\n\n\"This Source Code may also be made available under the following\nSecondary Licenses when the conditions for such availability set forth\nin the Eclipse Public License, v. 2.0 are satisfied: {name license(s),\nversion(s), and exceptions or additional permissions here}.\"\n\n  Simply including a copy of this Agreement, including this Exhibit A\n  is not sufficient to license the Source Code under Secondary Licenses.\n\n  If it is not possible or desirable to put the notice in a particular\n  file, then You may include the notice in a location (such as a LICENSE\n  file in a relevant directory) where a recipient would be likely to\n  look for such a notice.\n\n  You may add additional accurate notices of copyright ownership.\n\n\nFor the Windows Installer component:\n\n    * All NSIS source code, plug-ins, documentation, examples, header files and\n       graphics, with the exception of the compression modules and where\n       otherwise noted, are licensed under the zlib/libpng license.\n    * The zlib compression module for NSIS is licensed under the zlib/libpng\n       license.\n    * The bzip2 compression module for NSIS is licensed under the bzip2 license.\n    * The lzma compression module for NSIS is licensed under the Common Public\n       License version 1.0.\n\nzlib/libpng license\n\nThis software is provided 'as-is', without any express or implied warranty. In\nno event will the authors be held liable for any damages arising from the use of\nthis software.\n\nPermission is granted to anyone to use this software for any purpose, including\ncommercial applications, and to alter it and redistribute it freely, subject to\nthe following restrictions:\n\n   1. The origin of this software must not be misrepresented; you must not claim\n       that you wrote the original software. If you use this software in a\n       product, an acknowledgment in the product documentation would be\n       appreciated but is not required.\n   2. Altered source versions must be plainly marked as such, and must not be\n       misrepresented as being the original software.\n   3. This notice may not be removed or altered from any source distribution.\n\nbzip2 license\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n   2. The origin of this software must not be misrepresented; you must not claim\n       that you wrote the original software. If you use this software in a\n       product, an acknowledgment in the product documentation would be\n       appreciated but is not required.\n   3. Altered source versions must be plainly marked as such, and must not be\n       misrepresented as being the original software.\n   4. The name of the author may not be used to endorse or promote products\n       derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS AND ANY EXPRESS OR IMPLIED\nWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\nOF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\nIN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\nOF SUCH DAMAGE.\n\nJulian Seward, Cambridge, UK.\n\njseward@acm.org\nCommon Public License version 1.0\n\nTHE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC\nLICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM\nCONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\n\n1. DEFINITIONS\n\n\"Contribution\" means:\n\na) in the case of the initial Contributor, the initial code and documentation\ndistributed under this Agreement, and b) in the case of each subsequent\nContributor:\n\ni) changes to the Program, and\n\nii) additions to the Program;\n\nwhere such changes and/or additions to the Program originate from and are\ndistributed by that particular Contributor. A Contribution 'originates' from a\nContributor if it was added to the Program by such Contributor itself or anyone\nacting on such Contributor's behalf. Contributions do not include additions to\nthe Program which: (i) are separate modules of software distributed in\nconjunction with the Program under their own license agreement, and (ii) are not\nderivative works of the Program.\n\n\"Contributor\" means any person or entity that distributes the Program.\n\n\"Licensed Patents \" mean patent claims licensable by a Contributor which are\nnecessarily infringed by the use or sale of its Contribution alone or when\ncombined with the Program.\n\n\"Program\" means the Contributions distributed in accordance with this Agreement.\n\n\"Recipient\" means anyone who receives the Program under this Agreement,\nincluding all Contributors.\n\n2. GRANT OF RIGHTS\n\na) Subject to the terms of this Agreement, each Contributor hereby grants\nRecipient a non-exclusive, worldwide, royalty-free copyright license to\nreproduce, prepare derivative works of, publicly display, publicly perform,\ndistribute and sublicense the Contribution of such Contributor, if any, and such\nderivative works, in source code and object code form.\n\nb) Subject to the terms of this Agreement, each Contributor hereby grants\nRecipient a non-exclusive, worldwide, royalty-free patent license under Licensed\nPatents to make, use, sell, offer to sell, import and otherwise transfer the\nContribution of such Contributor, if any, in source code and object code form.\nThis patent license shall apply to the combination of the Contribution and the\nProgram if, at the time the Contribution is added by the Contributor, such\naddition of the Contribution causes such combination to be covered by the\nLicensed Patents. The patent license shall not apply to any other combinations\nwhich include the Contribution. No hardware per se is licensed hereunder.\n\nc) Recipient understands that although each Contributor grants the licenses to\nits Contributions set forth herein, no assurances are provided by any\nContributor that the Program does not infringe the patent or other intellectual\nproperty rights of any other entity. Each Contributor disclaims any liability to\nRecipient for claims brought by any other entity based on infringement of\nintellectual property rights or otherwise. As a condition to exercising the\nrights and licenses granted hereunder, each Recipient hereby assumes sole\nresponsibility to secure any other intellectual property rights needed, if any.\nFor example, if a third party patent license is required to allow Recipient to\ndistribute the Program, it is Recipient's responsibility to acquire that license\nbefore distributing the Program.\n\nd) Each Contributor represents that to its knowledge it has sufficient copyright\nrights in its Contribution, if any, to grant the copyright license set forth in\nthis Agreement.\n\n3. REQUIREMENTS\n\nA Contributor may choose to distribute the Program in object code form under its\nown license agreement, provided that:\n\na) it complies with the terms and conditions of this Agreement; and\n\nb) its license agreement:\n\ni) effectively disclaims on behalf of all Contributors all warranties and\nconditions, express and implied, including warranties or conditions of title and\nnon-infringement, and implied warranties or conditions of merchantability and\nfitness for a particular purpose;\n\nii) effectively excludes on behalf of all Contributors all liability for\ndamages, including direct, indirect, special, incidental and consequential\ndamages, such as lost profits;\n\niii) states that any provisions which differ from this Agreement are offered by\nthat Contributor alone and not by any other party; and\n\niv) states that source code for the Program is available from such Contributor,\nand informs licensees how to obtain it in a reasonable manner on or through a\nmedium customarily used for software exchange.\n\nWhen the Program is made available in source code form:\n\na) it must be made available under this Agreement; and\n\nb) a copy of this Agreement must be included with each copy of the Program.\n\nContributors may not remove or alter any copyright notices contained within the\nProgram.\n\nEach Contributor must identify itself as the originator of its Contribution, if\nany, in a manner that reasonably allows subsequent Recipients to identify the\noriginator of the Contribution.\n\n4. COMMERCIAL DISTRIBUTION\n\nCommercial distributors of software may accept certain responsibilities with\nrespect to end users, business partners and the like. While this license is\nintended to facilitate the commercial use of the Program, the Contributor who\nincludes the Program in a commercial product offering should do so in a manner\nwhich does not create potential liability for other Contributors. Therefore, if\na Contributor includes the Program in a commercial product offering, such\nContributor (\"Commercial Contributor\") hereby agrees to defend and indemnify\nevery other Contributor (\"Indemnified Contributor\") against any losses, damages\nand costs (collectively \"Losses\") arising from claims, lawsuits and other legal\nactions brought by a third party against the Indemnified Contributor to the\nextent caused by the acts or omissions of such Commercial Contributor in\nconnection with its distribution of the Program in a commercial product\noffering. The obligations in this section do not apply to any claims or Losses\nrelating to any actual or alleged intellectual property infringement. In order\nto qualify, an Indemnified Contributor must: a) promptly notify the Commercial\nContributor in writing of such claim, and b) allow the Commercial Contributor to\ncontrol, and cooperate with the Commercial Contributor in, the defense and any\nrelated settlement negotiations. The Indemnified Contributor may participate in\nany such claim at its own expense.\n\nFor example, a Contributor might include the Program in a commercial product\noffering, Product X. That Contributor is then a Commercial Contributor. If that\nCommercial Contributor then makes performance claims, or offers warranties\nrelated to Product X, those performance claims and warranties are such\nCommercial Contributor's responsibility alone. Under this section, the\nCommercial Contributor would have to defend claims against the other\nContributors related to those performance claims and warranties, and if a court\nrequires any other Contributor to pay any damages as a result, the Commercial\nContributor must pay those damages.\n\n5. NO WARRANTY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR\nIMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each\nRecipient is solely responsible for determining the appropriateness of using and\ndistributing the Program and assumes all risks associated with its exercise of\nrights under this Agreement, including but not limited to the risks and costs of\nprogram errors, compliance with applicable laws, damage to or loss of data,\nprograms or equipment, and unavailability or interruption of operations.\n\n6. DISCLAIMER OF LIABILITY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY\nCONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST\nPROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\nSTRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\nOUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS\nGRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n7. GENERAL\n\nIf any provision of this Agreement is invalid or unenforceable under applicable\nlaw, it shall not affect the validity or enforceability of the remainder of the\nterms of this Agreement, and without further action by the parties hereto, such\nprovision shall be reformed to the minimum extent necessary to make such\nprovision valid and enforceable.\n\nIf Recipient institutes patent litigation against a Contributor with respect to\na patent applicable to software (including a cross-claim or counterclaim in a\nlawsuit), then any patent licenses granted by that Contributor to such Recipient\nunder this Agreement shall terminate as of the date such litigation is filed. In\naddition, if Recipient institutes patent litigation against any entity\n(including a cross-claim or counterclaim in a lawsuit) alleging that the Program\nitself (excluding combinations of the Program with other software or hardware)\ninfringes such Recipient's patent(s), then such Recipient's rights granted under\nSection 2(b) shall terminate as of the date such litigation is filed.\n\nAll Recipient's rights under this Agreement shall terminate if it fails to\ncomply with any of the material terms or conditions of this Agreement and does\nnot cure such failure in a reasonable period of time after becoming aware of\nsuch noncompliance. If all Recipient's rights under this Agreement terminate,\nRecipient agrees to cease use and distribution of the Program as soon as\nreasonably practicable. However, Recipient's obligations under this Agreement\nand any licenses granted by Recipient relating to the Program shall continue and\nsurvive.\n\nEveryone is permitted to copy and distribute copies of this Agreement, but in\norder to avoid inconsistency the Agreement is copyrighted and may only be\nmodified in the following manner. The Agreement Steward reserves the right to\npublish new versions (including revisions) of this Agreement from time to time.\nNo one other than the Agreement Steward has the right to modify this Agreement.\nIBM is the initial Agreement Steward. IBM may assign the responsibility to serve\nas the Agreement Steward to a suitable separate entity. Each new version of the\nAgreement will be given a distinguishing version number. The Program (including\nContributions) may always be distributed subject to the version of the Agreement\nunder which it was received. In addition, after a new version of the Agreement\nis published, Contributor may elect to distribute the Program (including its\nContributions) under the new version. Except as expressly stated in Sections\n2(a) and 2(b) above, Recipient receives no rights or licenses to the\nintellectual property of any Contributor under this Agreement, whether\nexpressly, by implication, estoppel or otherwise. All rights in the Program not\nexpressly granted under this Agreement are reserved.\n\nThis Agreement is governed by the laws of the State of New York and the\nintellectual property laws of the United States of America. No party to this\nAgreement will bring a legal action under this Agreement more than one year\nafter the cause of action arose. Each party waives its rights to a jury trial in\nany resulting litigation.\n\nSpecial exception for LZMA compression module\n\nIgor Pavlov and Amir Szekely, the authors of the LZMA compression module for\nNSIS, expressly permit you to statically or dynamically link your code (or bind\nby name) to the files from the LZMA compression module for NSIS without\nsubjecting your linked code to the terms of the Common Public license version\n1.0. Any modifications or additions to files from the LZMA compression module\nfor NSIS, however, are subject to the terms of the Common Public License version\n1.0.\n\n\nFor the following XML Schemas for Java EE Deployment Descriptors:\n - javaee_5.xsd\n - javaee_web_services_1_2.xsd\n - javaee_web_services_client_1_2.xsd\n - javaee_6.xsd\n - javaee_web_services_1_3.xsd\n - javaee_web_services_client_1_3.xsd\n - jsp_2_2.xsd\n - web-app_3_0.xsd\n - web-common_3_0.xsd\n - web-fragment_3_0.xsd\n - javaee_7.xsd\n - javaee_web_services_1_4.xsd\n - javaee_web_services_client_1_4.xsd\n - jsp_2_3.xsd\n - web-app_3_1.xsd\n - web-common_3_1.xsd\n - web-fragment_3_1.xsd\n - javaee_8.xsd\n - web-app_4_0.xsd\n - web-common_4_0.xsd\n - web-fragment_4_0.xsd\n\nCOMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0\n\n1. Definitions.\n\n   1.1. Contributor. means each individual or entity that creates or contributes\n        to the creation of Modifications.\n\n   1.2. Contributor Version. means the combination of the Original Software,\n        prior Modifications used by a Contributor (if any), and the\n        Modifications made by that particular Contributor.\n\n   1.3. Covered Software. means (a) the Original Software, or (b) Modifications,\n        or (c) the combination of files containing Original Software with files\n        containing Modifications, in each case including portions thereof.\n\n   1.4. Executable. means the Covered Software in any form other than Source\n        Code.\n\n   1.5. Initial Developer. means the individual or entity that first makes\n        Original Software available under this License.\n\n   1.6. Larger Work. means a work which combines Covered Software or portions\n        thereof with code not governed by the terms of this License.\n\n   1.7. License. means this document.\n\n   1.8. Licensable. means having the right to grant, to the maximum extent\n        possible, whether at the time of the initial grant or subsequently\n        acquired, any and all of the rights conveyed herein.\n\n   1.9. Modifications. means the Source Code and Executable form of any of the\n        following:\n\n        A. Any file that results from an addition to, deletion from or\n           modification of the contents of a file containing Original Software\n           or previous Modifications;\n\n        B. Any new file that contains any part of the Original Software or\n           previous Modification; or\n\n        C. Any new file that is contributed or otherwise made available under\n           the terms of this License.\n\n   1.10. Original Software. means the Source Code and Executable form of\n         computer software code that is originally released under this License.\n\n   1.11. Patent Claims. means any patent claim(s), now owned or hereafter\n         acquired, including without limitation, method, process, and apparatus\n         claims, in any patent Licensable by grantor.\n\n   1.12. Source Code. means (a) the common form of computer software code in\n         which modifications are made and (b) associated documentation included\n         in or with such code.\n\n   1.13. You. (or .Your.) means an individual or a legal entity exercising\n         rights under, and complying with all of the terms of, this License. For\n         legal entities, .You. includes any entity which controls, is controlled\n         by, or is under common control with You. For purposes of this\n         definition, .control. means (a) the power, direct or indirect, to cause\n         the direction or management of such entity, whether by contract or\n         otherwise, or (b) ownership of more than fifty percent (50%) of the\n         outstanding shares or beneficial ownership of such entity.\n\n2. License Grants.\n\n      2.1. The Initial Developer Grant.\n\n      Conditioned upon Your compliance with Section 3.1 below and subject to\n      third party intellectual property claims, the Initial Developer hereby\n      grants You a world-wide, royalty-free, non-exclusive license:\n\n        (a) under intellectual property rights (other than patent or trademark)\n            Licensable by Initial Developer, to use, reproduce, modify, display,\n            perform, sublicense and distribute the Original Software (or\n            portions thereof), with or without Modifications, and/or as part of\n            a Larger Work; and\n\n        (b) under Patent Claims infringed by the making, using or selling of\n            Original Software, to make, have made, use, practice, sell, and\n            offer for sale, and/or otherwise dispose of the Original Software\n            (or portions thereof).\n\n        (c) The licenses granted in Sections 2.1(a) and (b) are effective on the\n            date Initial Developer first distributes or otherwise makes the\n            Original Software available to a third party under the terms of this\n            License.\n\n        (d) Notwithstanding Section 2.1(b) above, no patent license is granted:\n            (1) for code that You delete from the Original Software, or (2) for\n            infringements caused by: (i) the modification of the Original\n            Software, or (ii) the combination of the Original Software with\n            other software or devices.\n\n    2.2. Contributor Grant.\n\n    Conditioned upon Your compliance with Section 3.1 below and subject to third\n    party intellectual property claims, each Contributor hereby grants You a\n    world-wide, royalty-free, non-exclusive license:\n\n        (a) under intellectual property rights (other than patent or trademark)\n            Licensable by Contributor to use, reproduce, modify, display,\n            perform, sublicense and distribute the Modifications created by such\n            Contributor (or portions thereof), either on an unmodified basis,\n            with other Modifications, as Covered Software and/or as part of a\n            Larger Work; and\n\n        (b) under Patent Claims infringed by the making, using, or selling of\n            Modifications made by that Contributor either alone and/or in\n            combination with its Contributor Version (or portions of such\n            combination), to make, use, sell, offer for sale, have made, and/or\n            otherwise dispose of: (1) Modifications made by that Contributor (or\n            portions thereof); and (2) the combination of Modifications made by\n            that Contributor with its Contributor Version (or portions of such\n            combination).\n\n        (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on\n            the date Contributor first distributes or otherwise makes the\n            Modifications available to a third party.\n\n        (d) Notwithstanding Section 2.2(b) above, no patent license is granted:\n            (1) for any code that Contributor has deleted from the Contributor\n            Version; (2) for infringements caused by: (i) third party\n            modifications of Contributor Version, or (ii) the combination of\n            Modifications made by that Contributor with other software (except\n            as part of the Contributor Version) or other devices; or (3) under\n            Patent Claims infringed by Covered Software in the absence of\n            Modifications made by that Contributor.\n\n3. Distribution Obligations.\n\n      3.1. Availability of Source Code.\n      Any Covered Software that You distribute or otherwise make available in\n      Executable form must also be made available in Source Code form and that\n      Source Code form must be distributed only under the terms of this License.\n      You must include a copy of this License with every copy of the Source Code\n      form of the Covered Software You distribute or otherwise make available.\n      You must inform recipients of any such Covered Software in Executable form\n      as to how they can obtain such Covered Software in Source Code form in a\n      reasonable manner on or through a medium customarily used for software\n      exchange.\n\n      3.2. Modifications.\n      The Modifications that You create or to which You contribute are governed\n      by the terms of this License. You represent that You believe Your\n      Modifications are Your original creation(s) and/or You have sufficient\n      rights to grant the rights conveyed by this License.\n\n      3.3. Required Notices.\n      You must include a notice in each of Your Modifications that identifies\n      You as the Contributor of the Modification. You may not remove or alter\n      any copyright, patent or trademark notices contained within the Covered\n      Software, or any notices of licensing or any descriptive text giving\n      attribution to any Contributor or the Initial Developer.\n\n      3.4. Application of Additional Terms.\n      You may not offer or impose any terms on any Covered Software in Source\n      Code form that alters or restricts the applicable version of this License\n      or the recipients. rights hereunder. You may choose to offer, and to\n      charge a fee for, warranty, support, indemnity or liability obligations to\n      one or more recipients of Covered Software. However, you may do so only on\n      Your own behalf, and not on behalf of the Initial Developer or any\n      Contributor. You must make it absolutely clear that any such warranty,\n      support, indemnity or liability obligation is offered by You alone, and\n      You hereby agree to indemnify the Initial Developer and every Contributor\n      for any liability incurred by the Initial Developer or such Contributor as\n      a result of warranty, support, indemnity or liability terms You offer.\n\n      3.5. Distribution of Executable Versions.\n      You may distribute the Executable form of the Covered Software under the\n      terms of this License or under the terms of a license of Your choice,\n      which may contain terms different from this License, provided that You are\n      in compliance with the terms of this License and that the license for the\n      Executable form does not attempt to limit or alter the recipient.s rights\n      in the Source Code form from the rights set forth in this License. If You\n      distribute the Covered Software in Executable form under a different\n      license, You must make it absolutely clear that any terms which differ\n      from this License are offered by You alone, not by the Initial Developer\n      or Contributor. You hereby agree to indemnify the Initial Developer and\n      every Contributor for any liability incurred by the Initial Developer or\n      such Contributor as a result of any such terms You offer.\n\n      3.6. Larger Works.\n      You may create a Larger Work by combining Covered Software with other code\n      not governed by the terms of this License and distribute the Larger Work\n      as a single product. In such a case, You must make sure the requirements\n      of this License are fulfilled for the Covered Software.\n\n4. Versions of the License.\n\n      4.1. New Versions.\n      Sun Microsystems, Inc. is the initial license steward and may publish\n      revised and/or new versions of this License from time to time. Each\n      version will be given a distinguishing version number. Except as provided\n      in Section 4.3, no one other than the license steward has the right to\n      modify this License.\n\n      4.2. Effect of New Versions.\n      You may always continue to use, distribute or otherwise make the Covered\n      Software available under the terms of the version of the License under\n      which You originally received the Covered Software. If the Initial\n      Developer includes a notice in the Original Software prohibiting it from\n      being distributed or otherwise made available under any subsequent version\n      of the License, You must distribute and make the Covered Software\n      available under the terms of the version of the License under which You\n      originally received the Covered Software. Otherwise, You may also choose\n      to use, distribute or otherwise make the Covered Software available under\n      the terms of any subsequent version of the License published by the\n      license steward.\n\n      4.3. Modified Versions.\n      When You are an Initial Developer and You want to create a new license for\n      Your Original Software, You may create and use a modified version of this\n      License if You: (a) rename the license and remove any references to the\n      name of the license steward (except to note that the license differs from\n      this License); and (b) otherwise make it clear that the license contains\n      terms which differ from this License.\n\n5. DISCLAIMER OF WARRANTY.\n\n   COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN .AS IS. BASIS, WITHOUT\n   WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT\n   LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS,\n   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK\n   AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD\n   ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL\n   DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY\n   SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN\n   ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED\n   HEREUNDER EXCEPT UNDER THIS DISCLAIMER.\n\n6. TERMINATION.\n\n      6.1. This License and the rights granted hereunder will terminate\n           automatically if You fail to comply with terms herein and fail to\n           cure such breach within 30 days of becoming aware of the breach.\n           Provisions which, by their nature, must remain in effect beyond the\n           termination of this License shall survive.\n\n      6.2. If You assert a patent infringement claim (excluding declaratory\n           judgment actions) against Initial Developer or a Contributor (the\n           Initial Developer or Contributor against whom You assert such claim\n           is referred to as .Participant.) alleging that the Participant\n           Software (meaning the Contributor Version where the Participant is a\n           Contributor or the Original Software where the Participant is the\n           Initial Developer) directly or indirectly infringes any patent, then\n           any and all rights granted directly or indirectly to You by such\n           Participant, the Initial Developer (if the Initial Developer is not\n           the Participant) and all Contributors under Sections 2.1 and/or 2.2\n           of this License shall, upon 60 days notice from Participant terminate\n           prospectively and automatically at the expiration of such 60 day\n           notice period, unless if within such 60 day period You withdraw Your\n           claim with respect to the Participant Software against such\n           Participant either unilaterally or pursuant to a written agreement\n           with Participant.\n\n      6.3. In the event of termination under Sections 6.1 or 6.2 above, all end\n           user licenses that have been validly granted by You or any\n           distributor hereunder prior to termination (excluding licenses\n           granted to You by any distributor) shall survive termination.\n\n7. LIMITATION OF LIABILITY.\n\n   UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING\n   NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY\n   OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF\n   ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL,\n   INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT\n   LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE,\n   COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR\n   LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF\n   SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR\n   DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY.S NEGLIGENCE TO THE EXTENT\n   APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE\n   EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS\n   EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.\n\n8. U.S. GOVERNMENT END USERS.\n\n   The Covered Software is a .commercial item,. as that term is defined in 48\n   C.F.R. 2.101 (Oct. 1995), consisting of .commercial computer software. (as\n   that term is defined at 48 C.F.R. ? 252.227-7014(a)(1)) and commercial\n   computer software documentation. as such terms are used in 48 C.F.R. 12.212\n   (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1\n   through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered\n   Software with only those rights set forth herein. This U.S. Government Rights\n   clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or\n   provision that addresses Government rights in computer software under this\n   License.\n\n9. MISCELLANEOUS.\n\n   This License represents the complete agreement concerning subject matter\n   hereof. If any provision of this License is held to be unenforceable, such\n   provision shall be reformed only to the extent necessary to make it\n   enforceable. This License shall be governed by the law of the jurisdiction\n   specified in a notice contained within the Original Software (except to the\n   extent applicable law, if any, provides otherwise), excluding such\n   jurisdiction's conflict-of-law provisions. Any litigation relating to this\n   License shall be subject to the jurisdiction of the courts located in the\n   jurisdiction and venue specified in a notice contained within the Original\n   Software, with the losing party responsible for costs, including, without\n   limitation, court costs and reasonable attorneys. fees and expenses. The\n   application of the United Nations Convention on Contracts for the\n   International Sale of Goods is expressly excluded. Any law or regulation\n   which provides that the language of a contract shall be construed against\n   the drafter shall not apply to this License. You agree that You alone are\n   responsible for compliance with the United States export administration\n   regulations (and the export control laws and regulation of any other\n   countries) when You use, distribute or otherwise make available any Covered\n   Software.\n\n10. RESPONSIBILITY FOR CLAIMS.\n\n   As between Initial Developer and the Contributors, each party is responsible\n   for claims and damages arising, directly or indirectly, out of its\n   utilization of rights under this License and You agree to work with Initial\n   Developer and Contributors to distribute such responsibility on an equitable\n   basis. Nothing herein is intended or shall be deemed to constitute any\n   admission of liability.\n\n   NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION\n   LICENSE (CDDL)\n\n   The code released under the CDDL shall be governed by the laws of the State\n   of California (excluding conflict-of-law provisions). Any litigation relating\n   to this License shall be subject to the jurisdiction of the Federal Courts of\n   the Northern District of California and the state courts of the State of\n   California, with venue lying in Santa Clara County, California.\n\n"
  },
  {
    "path": "assembly/assembly-che-tomcat/src/assembly/assembly.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<assembly xmlns=\"https://maven.apache.org/plugins/maven-assembly-plugin/assembly/2.0.0\" xmlns:xsi=\"https://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"https://maven.apache.org/plugins/maven-assembly-plugin/assembly/2.0.0 https://maven.apache.org/xsd/assembly-2.0.0.xsd\">\n    <id>tomcat-zip</id>\n\n    <formats>\n        <format>zip</format>\n    </formats>\n\n    <includeBaseDirectory>false</includeBaseDirectory>\n\n\n    <fileSets>\n        <fileSet>\n            <directory>${project.build.directory}/dependency/apache-tomcat-${org.apache.tomcat.version}</directory>\n            <outputDirectory></outputDirectory>\n            <excludes>\n                <exclude>**/webapps/**</exclude>\n                <exclude>**/bin/setenv.*</exclude>\n                <exclude>**/bin/*.sh</exclude>\n                <exclude>**/bin/catalina-tasks.xml</exclude>\n                <exclude>**/bin/*.tar.gz</exclude>\n                <exclude>**/conf/tomcat-users.xml</exclude>\n                <exclude>**/conf/server.xml</exclude>\n            </excludes>\n        </fileSet>\n        <fileSet>\n            <directory>${project.build.directory}/dependency/apache-tomcat-${org.apache.tomcat.version}</directory>\n            <outputDirectory></outputDirectory>\n            <includes>\n                <include>**/bin/*.sh</include>\n            </includes>\n            <fileMode>755</fileMode>\n        </fileSet>\n\n\n        <fileSet>\n            <directory>${project.basedir}/src/assembly</directory>\n            <outputDirectory></outputDirectory>\n            <includes>\n                <include>LICENSE-tomcat.txt</include>\n            </includes>\n        </fileSet>\n        <fileSet>\n            <directory>${project.basedir}/src/assembly/bin</directory>\n            <outputDirectory>bin</outputDirectory>\n            <includes>\n                <include>setenv.sh</include>\n            </includes>\n            <fileMode>755</fileMode>\n        </fileSet>\n        <fileSet>\n            <directory>${project.basedir}/src/assembly/conf</directory>\n            <outputDirectory>conf</outputDirectory>\n            <includes>\n                <include>logback-access.xml</include>\n                <include>logback.xml</include>\n                <include>logback-json-appenders.xml</include>\n                <include>logback-plaintext-appenders.xml</include>\n                <include>server.xml</include>\n                <include>context.xml</include>\n                <include>logging.properties</include>\n            </includes>\n        </fileSet>\n    </fileSets>\n</assembly>\n"
  },
  {
    "path": "assembly/assembly-che-tomcat/src/assembly/conf/logback-access.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <property name=\"max.retention.days\" value=\"60\" />\n\n    <appender name=\"CONSOLE\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder class=\"ch.qos.logback.access.PatternLayoutEncoder\">\n            <pattern>common</pattern>\n        </encoder>\n    </appender>\n\n    <appender name=\"ACCESS-LOG\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${che.logs.dir}/logs/localhost-access.log</file>\n        <append>true</append>\n        <encoder class=\"ch.qos.logback.access.PatternLayoutEncoder\">\n            <charset>utf-8</charset>\n            <pattern>common</pattern>\n        </encoder>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\">\n            <fileNamePattern>${che.logs.dir}/archive/localhost-access-%d{yyyyMMdd}-%i.log</fileNamePattern>\n            <maxHistory>${max.retention.days}</maxHistory>\n            <maxFileSize>20MB</maxFileSize>\n        </rollingPolicy>\n    </appender>\n\n    <appender-ref ref=\"ACCESS-LOG\" />\n\n</configuration>\n"
  },
  {
    "path": "assembly/assembly-che-tomcat/src/assembly/conf/logback-json-appenders.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<included>\n    <appender name=\"stdout-json\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder class=\"net.logstash.logback.encoder.LogstashEncoder\">\n            <includeMdcKeyName>identity_id</includeMdcKeyName>\n            <includeMdcKeyName>req_id</includeMdcKeyName>\n        </encoder>\n    </appender>\n\n    <root level=\"${che.logs.level:-INFO}\">\n        <appender-ref ref=\"stdout-json\"/>\n    </root>\n</included>\n"
  },
  {
    "path": "assembly/assembly-che-tomcat/src/assembly/conf/logback-plaintext-appenders.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<included>\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <appender name=\"file\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <append>true</append>\n        <prudent>true</prudent>\n        <encoder>\n            <charset>utf-8</charset>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${che.logs.dir}/archive/%d{yyyy/MM/dd}/catalina.log</fileNamePattern>\n            <maxHistory>${max.retention.days}</maxHistory>\n        </rollingPolicy>\n    </appender>\n\n    <root level=\"${che.logs.level:-INFO}\">\n        <appender-ref ref=\"stdout\"/>\n        <appender-ref ref=\"file\"/>\n    </root>\n</included>\n"
  },
  {
    "path": "assembly/assembly-che-tomcat/src/assembly/conf/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n    <contextListener class=\"ch.qos.logback.classic.jul.LevelChangePropagator\">\n        <resetJUL>true</resetJUL>\n    </contextListener>\n    <contextListener class=\"org.eclipse.che.commons.logback.EnvironmentVariablesLogLevelPropagator\"/>\n\n    <property name=\"max.retention.days\" value=\"60\" />\n\n    <jmxConfigurator/>\n\n    <include optional=\"true\" file=\"${che.local.conf.dir}/logback/logback-additional-appenders.xml\"/>\n    <include optional=\"true\" file=\"${catalina.home}/conf/logback-additional-appenders.xml\"/>\n    <!--Include appenders file depending on the variable `CHE_LOGS_APPENDERS_IMPL` -->\n    <include optional=\"false\" file=\"${catalina.home}/conf/logback-${CHE_LOGS_APPENDERS_IMPL:-plaintext}-appenders.xml\"/>\n\n    <logger name=\"org.apache.catalina.loader\" level=\"OFF\"/>\n    <logger name=\"org.apache.catalina.session.PersistentManagerBase\" level=\"OFF\"/>\n    <logger name=\"org.apache.jasper.servlet.TldScanner\" level=\"OFF\"/>\n</configuration>\n"
  },
  {
    "path": "assembly/assembly-che-tomcat/src/assembly/conf/server.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  Licensed to the Apache Software Foundation (ASF) under one or more\n  contributor license agreements.  See the NOTICE file distributed with\n  this work for additional information regarding copyright ownership.\n  The ASF licenses this file to You under the Apache License, Version 2.0\n  (the \"License\"); you may not use this file except in compliance with\n  the License.  You may obtain a copy of the License at\n\n      http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n-->\n<!-- Note:  A \"Server\" is not itself a \"Container\", so you may not\n     define subcomponents such as \"Valves\" at this level.\n     Documentation at /docs/config/server.html\n -->\n<Server port=\"8005\" shutdown=\"SHUTDOWN\">\n  <Listener className=\"org.apache.catalina.startup.VersionLoggerListener\" />\n  <!-- Security listener. Documentation at /docs/config/listeners.html\n  <Listener className=\"org.apache.catalina.security.SecurityListener\" />\n  -->\n  <!--APR library loader. Documentation at /docs/apr.html >\n  <Listener className=\"org.apache.catalina.core.AprLifecycleListener\" SSLEngine=\"on\" />\n  -->\n  <!-- Prevent memory leaks due to use of particular java/javax APIs-->\n  <Listener className=\"org.apache.catalina.core.JreMemoryLeakPreventionListener\" />\n  <Listener className=\"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener\" />\n  <Listener className=\"org.apache.catalina.core.ThreadLocalLeakPreventionListener\" />\n\n  <!-- Global JNDI resources\n       Documentation at /docs/jndi-resources-howto.html\n  -->\n  <GlobalNamingResources>\n    <!-- Editable user database that can also be used by\n         UserDatabaseRealm to authenticate users\n    -->\n    <!--Resource name=\"UserDatabase\" auth=\"Container\"\n              type=\"org.apache.catalina.UserDatabase\"\n              description=\"User database that can be updated and saved\"\n              factory=\"org.apache.catalina.users.MemoryUserDatabaseFactory\"\n              pathname=\"conf/tomcat-users.xml\" /-->\n  </GlobalNamingResources>\n\n  <!-- A \"Service\" is a collection of one or more \"Connectors\" that share\n       a single \"Container\" Note:  A \"Service\" is not itself a \"Container\",\n       so you may not define subcomponents such as \"Valves\" at this level.\n       Documentation at /docs/config/service.html\n   -->\n  <Service name=\"Catalina\">\n\n    <!--The connectors can use a shared executor, you can define one or more named thread pools-->\n    <!--\n    <Executor name=\"tomcatThreadPool\" namePrefix=\"catalina-exec-\"\n        maxThreads=\"150\" minSpareThreads=\"4\"/>\n    -->\n\n\n    <!-- A \"Connector\" represents an endpoint by which requests are received\n         and responses are returned. Documentation at :\n         HTTP Connector: /docs/config/http.html\n         AJP  Connector: /docs/config/ajp.html\n         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080\n    -->\n      <Connector port=\"${port.http:-8080}\" protocol=\"HTTP/1.1\"\n                 connectionTimeout=\"20000\"\n                 maxThreads=\"300\"\n                 maxHttpHeaderSize=\"32768\"\n                 compression=\"on\"\n                 compressionMinSize=\"2048\"\n                 noCompressionUserAgents=\".*MSIE 6.*\"\n                 compressibleMimeType=\"text/html,text/xml,text/plain,text/css,text/javascript,application/json,application/javascript\"\n                 redirectPort=\"8443\"/>\n    <!-- A \"Connector\" using the shared thread pool-->\n    <!--\n    <Connector executor=\"tomcatThreadPool\"\n               port=\"8080\" protocol=\"HTTP/1.1\"\n               connectionTimeout=\"20000\"\n               redirectPort=\"8443\" />\n    -->\n    <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2\n         This connector uses the NIO implementation. The default\n         SSLImplementation will depend on the presence of the APR/native\n         library and the useOpenSSL attribute of the\n         AprLifecycleListener.\n         Either JSSE or OpenSSL style configuration may be used regardless of\n         the SSLImplementation selected. JSSE style configuration is used below.\n    -->\n    <!--\n    <Connector port=\"8443\" protocol=\"org.apache.coyote.http11.Http11NioProtocol\"\n               maxThreads=\"150\" SSLEnabled=\"true\">\n        <UpgradeProtocol className=\"org.apache.coyote.http2.Http2Protocol\" />\n        <SSLHostConfig>\n            <Certificate certificateKeystoreFile=\"conf/localhost-rsa.jks\"\n                         type=\"RSA\" />\n        </SSLHostConfig>\n    </Connector>\n    -->\n\n    <!-- Define an AJP 1.3 Connector on port 8009 -->\n    <!--\n    <Connector protocol=\"AJP/1.3\"\n               address=\"::1\"\n               port=\"8009\"\n               redirectPort=\"8443\" />\n    -->\n\n    <!-- An Engine represents the entry point (within Catalina) that processes\n         every request.  The Engine implementation for Tomcat stand alone\n         analyzes the HTTP headers included with the request, and passes them\n         on to the appropriate Host (virtual host).\n         Documentation at /docs/config/engine.html -->\n\n    <!-- You should set jvmRoute to support load-balancing via AJP ie :\n    <Engine name=\"Catalina\" defaultHost=\"localhost\" jvmRoute=\"jvm1\">\n    -->\n    <Engine name=\"Catalina\" defaultHost=\"localhost\">\n\n      <!--For clustering, please take a look at documentation at:\n          /docs/cluster-howto.html  (simple how to)\n          /docs/config/cluster.html (reference documentation) -->\n      <!--\n      <Cluster className=\"org.apache.catalina.ha.tcp.SimpleTcpCluster\"/>\n      -->\n\n      <!-- Use the LockOutRealm to prevent attempts to guess user passwords\n           via a brute-force attack -->\n      <Realm className=\"org.apache.catalina.realm.LockOutRealm\">\n        <!-- This Realm uses the UserDatabase configured in the global JNDI\n             resources under the key \"UserDatabase\".  Any edits\n             that are performed against this UserDatabase are immediately\n             available for use by the Realm.  -->\n        <!--Realm className=\"org.apache.catalina.realm.UserDatabaseRealm\"\n               resourceName=\"UserDatabase\"/-->\n      </Realm>\n\n      <Host name=\"localhost\"  appBase=\"webapps\"\n            unpackWARs=\"true\" autoDeploy=\"false\">\n\n        <!-- SingleSignOn valve, share authentication between web applications\n             Documentation at: /docs/config/valve.html -->\n        <!--\n        <Valve className=\"org.apache.catalina.authenticator.SingleSignOn\" />\n        -->\n\n        <!-- Access log processes all example.\n             Documentation at: /docs/config/valve.html\n             Note: The pattern used is equivalent to using pattern=\"common\" -->\n        <Valve className=\"org.apache.catalina.valves.AccessLogValve\" directory=\"logs\"\n               prefix=\"localhost_access_log\" suffix=\".txt\"\n               pattern=\"%h %l %u %t &quot;%r&quot; %s %b\" />\n         <Valve className=\"org.apache.catalina.valves.RemoteIpValve\" protocolHeader=\"X-Forwarded-Proto\"\n                 internalProxies=\"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\"/>\n\n      </Host>\n    </Engine>\n  </Service>\n</Server>\n"
  },
  {
    "path": "assembly/assembly-main/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-assembly-parent</artifactId>\n        <groupId>org.eclipse.che</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>assembly-main</artifactId>\n    <packaging>pom</packaging>\n    <name>Che Assembly :: Assemblies Che Server Tomcat</name>\n    <dependencies>\n        <dependency>\n            <groupId>org.eclipse.che</groupId>\n            <artifactId>assembly-che-tomcat</artifactId>\n            <type>zip</type>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che</groupId>\n            <artifactId>assembly-root-war</artifactId>\n            <type>war</type>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che</groupId>\n            <artifactId>assembly-swagger-war</artifactId>\n            <type>war</type>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che</groupId>\n            <artifactId>assembly-wsmaster-war</artifactId>\n            <type>war</type>\n        </dependency>\n        <dependency>\n            <groupId>org.postgresql</groupId>\n            <artifactId>postgresql</artifactId>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-assembly-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>make-assembly</id>\n                        <phase>package</phase>\n                        <goals>\n                            <goal>single</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <configuration>\n                    <appendAssemblyId>false</appendAssemblyId>\n                    <updateOnly>false</updateOnly>\n                    <descriptors>\n                        <descriptor>${project.basedir}/src/assembly/assembly.xml</descriptor>\n                    </descriptors>\n                    <finalName>eclipse-che-${project.version}</finalName>\n                    <tarLongFileMode>posix</tarLongFileMode>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-dependency-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>unpack-tomcat</id>\n                        <phase>prepare-package</phase>\n                        <goals>\n                            <goal>unpack</goal>\n                        </goals>\n                        <configuration>\n                            <artifactItems>\n                                <artifactItem>\n                                    <groupId>org.eclipse.che</groupId>\n                                    <artifactId>assembly-che-tomcat</artifactId>\n                                    <type>zip</type>\n                                    <overWrite>true</overWrite>\n                                    <outputDirectory>${project.build.directory}/dependency/assembly-che-tomcat</outputDirectory>\n                                </artifactItem>\n                            </artifactItems>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "assembly/assembly-main/src/assembly/LICENSE",
    "content": "Eclipse Public License - v 1.0\n\nTHE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC\nLICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM\nCONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\n\n1. DEFINITIONS\n\n\"Contribution\" means:\n\na) in the case of the initial Contributor, the initial code and documentation\n   distributed under this Agreement, and\nb) in the case of each subsequent Contributor:\n    i) changes to the Program, and\n   ii) additions to the Program;\n\n   where such changes and/or additions to the Program originate from and are\n   distributed by that particular Contributor. A Contribution 'originates'\n   from a Contributor if it was added to the Program by such Contributor\n   itself or anyone acting on such Contributor's behalf. Contributions do not\n   include additions to the Program which: (i) are separate modules of\n   software distributed in conjunction with the Program under their own\n   license agreement, and (ii) are not derivative works of the Program.\n\n\"Contributor\" means any person or entity that distributes the Program.\n\n\"Licensed Patents\" mean patent claims licensable by a Contributor which are\nnecessarily infringed by the use or sale of its Contribution alone or when\ncombined with the Program.\n\n\"Program\" means the Contributions distributed in accordance with this\nAgreement.\n\n\"Recipient\" means anyone who receives the Program under this Agreement,\nincluding all Contributors.\n\n2. GRANT OF RIGHTS\n  a) Subject to the terms of this Agreement, each Contributor hereby grants\n     Recipient a non-exclusive, worldwide, royalty-free copyright license to\n     reproduce, prepare derivative works of, publicly display, publicly\n     perform, distribute and sublicense the Contribution of such Contributor,\n     if any, and such derivative works, in source code and object code form.\n  b) Subject to the terms of this Agreement, each Contributor hereby grants\n     Recipient a non-exclusive, worldwide, royalty-free patent license under\n     Licensed Patents to make, use, sell, offer to sell, import and otherwise\n     transfer the Contribution of such Contributor, if any, in source code and\n     object code form. This patent license shall apply to the combination of\n     the Contribution and the Program if, at the time the Contribution is\n     added by the Contributor, such addition of the Contribution causes such\n     combination to be covered by the Licensed Patents. The patent license\n     shall not apply to any other combinations which include the Contribution.\n     No hardware per se is licensed hereunder.\n  c) Recipient understands that although each Contributor grants the licenses\n     to its Contributions set forth herein, no assurances are provided by any\n     Contributor that the Program does not infringe the patent or other\n     intellectual property rights of any other entity. Each Contributor\n     disclaims any liability to Recipient for claims brought by any other\n     entity based on infringement of intellectual property rights or\n     otherwise. As a condition to exercising the rights and licenses granted\n     hereunder, each Recipient hereby assumes sole responsibility to secure\n     any other intellectual property rights needed, if any. For example, if a\n     third party patent license is required to allow Recipient to distribute\n     the Program, it is Recipient's responsibility to acquire that license\n     before distributing the Program.\n  d) Each Contributor represents that to its knowledge it has sufficient\n     copyright rights in its Contribution, if any, to grant the copyright\n     license set forth in this Agreement.\n\n3. REQUIREMENTS\n\nA Contributor may choose to distribute the Program in object code form under\nits own license agreement, provided that:\n\n  a) it complies with the terms and conditions of this Agreement; and\n  b) its license agreement:\n      i) effectively disclaims on behalf of all Contributors all warranties\n         and conditions, express and implied, including warranties or\n         conditions of title and non-infringement, and implied warranties or\n         conditions of merchantability and fitness for a particular purpose;\n     ii) effectively excludes on behalf of all Contributors all liability for\n         damages, including direct, indirect, special, incidental and\n         consequential damages, such as lost profits;\n    iii) states that any provisions which differ from this Agreement are\n         offered by that Contributor alone and not by any other party; and\n     iv) states that source code for the Program is available from such\n         Contributor, and informs licensees how to obtain it in a reasonable\n         manner on or through a medium customarily used for software exchange.\n\nWhen the Program is made available in source code form:\n\n  a) it must be made available under this Agreement; and\n  b) a copy of this Agreement must be included with each copy of the Program.\n     Contributors may not remove or alter any copyright notices contained\n     within the Program.\n\nEach Contributor must identify itself as the originator of its Contribution,\nif\nany, in a manner that reasonably allows subsequent Recipients to identify the\noriginator of the Contribution.\n\n4. COMMERCIAL DISTRIBUTION\n\nCommercial distributors of software may accept certain responsibilities with\nrespect to end users, business partners and the like. While this license is\nintended to facilitate the commercial use of the Program, the Contributor who\nincludes the Program in a commercial product offering should do so in a manner\nwhich does not create potential liability for other Contributors. Therefore,\nif a Contributor includes the Program in a commercial product offering, such\nContributor (\"Commercial Contributor\") hereby agrees to defend and indemnify\nevery other Contributor (\"Indemnified Contributor\") against any losses,\ndamages and costs (collectively \"Losses\") arising from claims, lawsuits and\nother legal actions brought by a third party against the Indemnified\nContributor to the extent caused by the acts or omissions of such Commercial\nContributor in connection with its distribution of the Program in a commercial\nproduct offering. The obligations in this section do not apply to any claims\nor Losses relating to any actual or alleged intellectual property\ninfringement. In order to qualify, an Indemnified Contributor must:\na) promptly notify the Commercial Contributor in writing of such claim, and\nb) allow the Commercial Contributor to control, and cooperate with the\nCommercial Contributor in, the defense and any related settlement\nnegotiations. The Indemnified Contributor may participate in any such claim at\nits own expense.\n\nFor example, a Contributor might include the Program in a commercial product\noffering, Product X. That Contributor is then a Commercial Contributor. If\nthat Commercial Contributor then makes performance claims, or offers\nwarranties related to Product X, those performance claims and warranties are\nsuch Commercial Contributor's responsibility alone. Under this section, the\nCommercial Contributor would have to defend claims against the other\nContributors related to those performance claims and warranties, and if a\ncourt requires any other Contributor to pay any damages as a result, the\nCommercial Contributor must pay those damages.\n\n5. NO WARRANTY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR\nIMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each\nRecipient is solely responsible for determining the appropriateness of using\nand distributing the Program and assumes all risks associated with its\nexercise of rights under this Agreement , including but not limited to the\nrisks and costs of program errors, compliance with applicable laws, damage to\nor loss of data, programs or equipment, and unavailability or interruption of\noperations.\n\n6. DISCLAIMER OF LIABILITY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY\nCONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION\nLOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE\nEXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY\nOF SUCH DAMAGES.\n\n7. GENERAL\n\nIf any provision of this Agreement is invalid or unenforceable under\napplicable law, it shall not affect the validity or enforceability of the\nremainder of the terms of this Agreement, and without further action by the\nparties hereto, such provision shall be reformed to the minimum extent\nnecessary to make such provision valid and enforceable.\n\nIf Recipient institutes patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Program itself\n(excluding combinations of the Program with other software or hardware)\ninfringes such Recipient's patent(s), then such Recipient's rights granted\nunder Section 2(b) shall terminate as of the date such litigation is filed.\n\nAll Recipient's rights under this Agreement shall terminate if it fails to\ncomply with any of the material terms or conditions of this Agreement and does\nnot cure such failure in a reasonable period of time after becoming aware of\nsuch noncompliance. If all Recipient's rights under this Agreement terminate,\nRecipient agrees to cease use and distribution of the Program as soon as\nreasonably practicable. However, Recipient's obligations under this Agreement\nand any licenses granted by Recipient relating to the Program shall continue\nand survive.\n\nEveryone is permitted to copy and distribute copies of this Agreement, but in\norder to avoid inconsistency the Agreement is copyrighted and may only be\nmodified in the following manner. The Agreement Steward reserves the right to\npublish new versions (including revisions) of this Agreement from time to\ntime. No one other than the Agreement Steward has the right to modify this\nAgreement. The Eclipse Foundation is the initial Agreement Steward. The\nEclipse Foundation may assign the responsibility to serve as the Agreement\nSteward to a suitable separate entity. Each new version of the Agreement will\nbe given a distinguishing version number. The Program (including\nContributions) may always be distributed subject to the version of the\nAgreement under which it was received. In addition, after a new version of the\nAgreement is published, Contributor may elect to distribute the Program\n(including its Contributions) under the new version. Except as expressly\nstated in Sections 2(a) and 2(b) above, Recipient receives no rights or\nlicenses to the intellectual property of any Contributor under this Agreement,\nwhether expressly, by implication, estoppel or otherwise. All rights in the\nProgram not expressly granted under this Agreement are reserved.\n\nThis Agreement is governed by the laws of the State of New York and the\nintellectual property laws of the United States of America. No party to this\nAgreement will bring a legal action under this Agreement more than one year\nafter the cause of action arose. Each party waives its rights to a jury trial in\nany resulting litigation.\n"
  },
  {
    "path": "assembly/assembly-main/src/assembly/README",
    "content": "﻿/*******************************************************************************\n * Copyright (c) 2012-2019 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n *******************************************************************************/\n\n                               Eclipse Che\n                       ---------------------------\n                       Next Generation Eclipse IDE\n\n\n=============\nRequirements\n=============\n\n *  Java Platform, Standard Edition 8 Development Kit.\n *  Apache Maven version 3.3.1+.\n *  Docker 1.8+.\n\n\n===============\nGetting Started\n===============\nSee eclipse.org/che\n\n=============\nContributing\n=============\nSee github.com/eclipse/che\n\n==============\nDocumentation\n==============\nSee eclipse.org/che/docs\n"
  },
  {
    "path": "assembly/assembly-main/src/assembly/assembly.xml",
    "content": "<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<assembly xmlns=\"http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n          xsi:schemaLocation=\"http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd\">\n    <id>tomcat-zip</id>\n    <formats>\n        <format>dir</format>\n        <format>zip</format>\n        <format>tar.gz</format>\n    </formats>\n    <dependencySets>\n        <dependencySet>\n            <useProjectArtifact>false</useProjectArtifact>\n            <unpack>false</unpack>\n            <outputDirectory>tomcat/webapps</outputDirectory>\n            <outputFileNameMapping>ROOT.war</outputFileNameMapping>\n            <includes>\n                <include>org.eclipse.che:assembly-root-war</include>\n            </includes>\n        </dependencySet>\n        <dependencySet>\n            <useProjectArtifact>false</useProjectArtifact>\n            <unpack>false</unpack>\n            <outputDirectory>tomcat/webapps</outputDirectory>\n            <outputFileNameMapping>api.war</outputFileNameMapping>\n            <includes>\n                <include>org.eclipse.che:assembly-wsmaster-war</include>\n            </includes>\n        </dependencySet>\n        <dependencySet>\n            <useProjectArtifact>false</useProjectArtifact>\n            <unpack>false</unpack>\n            <outputDirectory>tomcat/webapps</outputDirectory>\n            <outputFileNameMapping>swagger.war</outputFileNameMapping>\n            <includes>\n                <include>org.eclipse.che:assembly-swagger-war</include>\n            </includes>\n        </dependencySet>\n        <dependencySet>\n            <useProjectArtifact>false</useProjectArtifact>\n            <unpack>false</unpack>\n            <outputDirectory>lib</outputDirectory>\n            <includes>\n                <include>org.postgresql:postgresql</include>\n            </includes>\n        </dependencySet>\n    </dependencySets>\n    <fileSets>\n        <fileSet>\n            <directory>${project.build.directory}/dependency/assembly-che-tomcat</directory>\n            <outputDirectory>tomcat/</outputDirectory>\n            <excludes>\n                <exclude>bin/*.bat</exclude>\n            </excludes>\n       </fileSet>\n       <fileSet>\n            <directory>${project.basedir}/src/assembly</directory>\n            <outputDirectory></outputDirectory>\n            <includes>\n              <include>LICENSE</include>\n              <include>README</include>\n           </includes>\n        </fileSet>\n    </fileSets>\n</assembly>\n"
  },
  {
    "path": "assembly/assembly-root-war/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-assembly-parent</artifactId>\n        <groupId>org.eclipse.che</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>assembly-root-war</artifactId>\n    <packaging>war</packaging>\n    <name>Che Assembly :: Root war</name>\n    <description>Packages Che root web app</description>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>net.logstash.logback</groupId>\n            <artifactId>logstash-logback-encoder</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-inject</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-j2ee</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-logback</artifactId>\n            <exclusions>\n                <exclusion>\n                    <artifactId>che-core-api-core</artifactId>\n                    <groupId>org.eclipse.che.core</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-guice-servlet</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-dependency-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>analyze</id>\n                        <configuration>\n                            <ignoredUnusedDeclaredDependencies>\n                                <dep>net.logstash.logback:logstash-logback-encoder</dep>\n                                <dep>ch.qos.logback:logback-classic</dep>\n                                <dep>org.eclipse.che.core:che-core-commons-j2ee</dep>\n                                <dep>org.eclipse.che.core:che-core-logback</dep>\n                            </ignoredUnusedDeclaredDependencies>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "assembly/assembly-root-war/src/main/java/org/eclipse/che/ApiAccessRejectionFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che;\n\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport javax.inject.Singleton;\n\n/**\n * Returns internal server error when request is supposed to be handled by API war. Situation occurs\n * when API war failed to start and all requests to it are handled by ROOT war.\n *\n * @author Alexander Garagatyi\n */\n@Singleton\npublic class ApiAccessRejectionFilter implements Filter {\n  public static final String ERROR_MESSAGE = \"Internal server error occurs. API is not accessible\";\n\n  private static final byte[] ERROR_MESSAGE_IN_BYTES = ERROR_MESSAGE.getBytes();\n\n  @Override\n  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n      throws IOException, ServletException {\n    HttpServletResponse resp = (HttpServletResponse) response;\n    resp.setStatus(500);\n    resp.getOutputStream().write(ERROR_MESSAGE_IN_BYTES);\n  }\n\n  @Override\n  public void init(FilterConfig filterConfig) throws ServletException {}\n\n  @Override\n  public void destroy() {}\n}\n"
  },
  {
    "path": "assembly/assembly-root-war/src/main/java/org/eclipse/che/DashboardModule.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che;\n\nimport com.google.inject.servlet.ServletModule;\nimport org.eclipse.che.inject.DynaModule;\n\n@DynaModule\npublic class DashboardModule extends ServletModule {\n  @Override\n  protected void configureServlets() {\n    filter(\"/api\", \"/api/*\").through(ApiAccessRejectionFilter.class);\n    filter(\"/*\").through(DashboardRedirectionFilter.class);\n  }\n}\n"
  },
  {
    "path": "assembly/assembly-root-war/src/main/java/org/eclipse/che/DashboardRedirectionFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che;\n\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.regex.Pattern;\nimport javax.inject.Singleton;\n\n/**\n * Redirect user to dashboard if request wasn't made to namespace/workspaceName or app resources.\n *\n * @author Max Shaposhnik\n */\n@Singleton\npublic class DashboardRedirectionFilter implements Filter {\n\n  // Describes IDE direct URL in format namespace/workspaceName, like user123/java-mysql\n  private static final String IDE_DIRECT_URL = \"/\\\\w+/\\\\w+\";\n  // Describes URL to app resources, like /_ide/loader.html\n  private static final String APP_RESOURCES = \"/_app/.*\";\n\n  private static final Pattern EXCLUDES =\n      Pattern.compile(\"^(\" + APP_RESOURCES + \")|(\" + IDE_DIRECT_URL + \")$\");\n\n  @Override\n  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n      throws IOException, ServletException {\n    HttpServletRequest req = (HttpServletRequest) request;\n    HttpServletResponse resp = (HttpServletResponse) response;\n\n    if ((\"GET\".equals(req.getMethod()) || \"HEAD\".equals(req.getMethod()))\n        && !EXCLUDES.matcher(req.getRequestURI()).matches()) {\n      resp.sendRedirect(\"/dashboard/\");\n      return;\n    }\n    chain.doFilter(request, response);\n  }\n\n  @Override\n  public void init(FilterConfig filterConfig) throws ServletException {}\n\n  @Override\n  public void destroy() {}\n}\n"
  },
  {
    "path": "assembly/assembly-root-war/src/main/webapp/META-INF/context.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<Context allowCasualMultipartParsing=\"true\">\n    <Valve className=\"org.apache.catalina.valves.rewrite.RewriteValve\"/>\n</Context>\n"
  },
  {
    "path": "assembly/assembly-root-war/src/main/webapp/WEB-INF/rewrite.config",
    "content": "RewriteRule ^/factory$                /dashboard/#/load-factory/    [R,NE,QSA]\nRewriteRule ^/factory/$               /dashboard/#/load-factory/    [R,NE,QSA]\nRewriteRule ^/f/$                     /dashboard/#/load-factory/    [R,NE,QSA]\nRewriteRule ^/f$                      /dashboard/#/load-factory/    [R,NE,QSA]\nRewriteRule ^/(?!_app/)(\\w+)/(\\w+)$   /dashboard/#/ide/$1/$2        [R,NE,QSA]\nRewriteRule ^/(?!_app/)(\\w+)/(\\w+)/$  /dashboard/#/ide/$1/$2        [R,NE,QSA]\n"
  },
  {
    "path": "assembly/assembly-root-war/src/main/webapp/WEB-INF/web.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<web-app xmlns=\"https://jakarta.ee/xml/ns/jakartaee\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"https://jakarta.ee/xml/ns/jakartaee\n                  https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd\"\n         version=\"5.0\">\n\n    <listener>\n        <listener-class>org.eclipse.che.inject.CheBootstrap</listener-class>\n    </listener>\n\n    <filter>\n        <filter-name>cacheDisablingFilter</filter-name>\n        <filter-class>org.eclipse.che.filter.CheCacheDisablingFilter</filter-class>\n        <init-param>\n            <param-name>pattern_filename</param-name>\n            <param-value>^.*\\.nocache\\..*$</param-value>\n        </init-param>\n        <init-param>\n            <param-name>pattern_appname</param-name>\n            <param-value>^.*/_app/.*$</param-value>\n        </init-param>\n    </filter>\n    <filter>\n        <filter-name>cacheForcingFilter</filter-name>\n        <filter-class>org.eclipse.che.filter.CheCacheForcingFilter</filter-class>\n        <init-param>\n            <param-name>pattern_filename</param-name>\n            <param-value>^.*\\.cache\\..*$</param-value>\n        </init-param>\n    </filter>\n    <filter>\n        <filter-name>guiceFilter</filter-name>\n        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>\n    </filter>\n\n    <filter-mapping>\n        <filter-name>guiceFilter</filter-name>\n        <url-pattern>/*</url-pattern>\n    </filter-mapping>\n    <filter-mapping>\n        <filter-name>cacheDisablingFilter</filter-name>\n        <url-pattern>/*</url-pattern>\n    </filter-mapping>\n    <filter-mapping>\n        <filter-name>cacheForcingFilter</filter-name>\n        <url-pattern>/*</url-pattern>\n    </filter-mapping>\n\n    <servlet-mapping>\n        <servlet-name>default</servlet-name>\n        <url-pattern>/*</url-pattern>\n    </servlet-mapping>\n\n    <security-role>\n        <description>the user role</description>\n        <role-name>developer</role-name>\n    </security-role>\n\n</web-app>\n"
  },
  {
    "path": "assembly/assembly-root-war/src/main/webapp/_app/keycloackLoader.js",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\nexport class KeycloakLoader {\n    /**\n     * Load keycloak settings\n     */\n    loadKeycloakSettings() {\n        const msg = \"Cannot load keycloak settings. This is normal for single-user mode.\";\n\n        return new Promise((resolve, reject) => {\n            try {\n                const request = new XMLHttpRequest();\n\n                request.onerror = request.onabort = function() {\n                    reject(new Error(msg));\n                };\n\n                request.onload = () => {\n                    if (request.status == 200) {\n                        resolve(this.injectKeycloakScript(JSON.parse(request.responseText)));\n                    } else {\n                        reject(new Error(msg));\n                    }\n                };\n\n                const url = \"/api/keycloak/settings\";\n                request.open(\"GET\", url, true);\n                request.send();\n            } catch (e) {\n                reject(new Error(msg + e.message));\n            }\n        });\n    }\n\n    /**\n     * Injects keycloak javascript\n     */\n    injectKeycloakScript(keycloakSettings) {\n        return new Promise((resolve, reject) => {\n            const script = document.createElement('script');\n            script.type = 'text/javascript';\n            script.language = 'javascript';\n            script.async = true;\n            script.src = keycloakSettings['che.keycloak.js_adapter_url'];\n\n            script.onload = () => {\n                resolve(this.initKeycloak(keycloakSettings));\n            };\n\n            script.onerror = script.onabort = () => {\n                reject(new Error('cannot load ' + script.src));\n            };\n\n            document.head.appendChild(script);\n        });\n    }\n\n    /**\n     * Initialize keycloak\n     */\n    initKeycloak(keycloakSettings) {\n        return new Promise((resolve, reject) => {\n\n            function keycloakConfig() {\n                const theOidcProvider = keycloakSettings['che.keycloak.oidc_provider'];\n                if (!theOidcProvider) {\n                    return {\n                        url: keycloakSettings['che.keycloak.auth_server_url'],\n                        realm: keycloakSettings['che.keycloak.realm'],\n                        clientId: keycloakSettings['che.keycloak.client_id']\n                    };\n                } else {\n                    return {\n                        oidcProvider: theOidcProvider,\n                        clientId: keycloakSettings['che.keycloak.client_id']\n                    };\n                }\n            }\n            const keycloak = Keycloak(keycloakConfig());\n\n            window['_keycloak'] = keycloak;\n\n            var useNonce;\n            if (typeof keycloakSettings['che.keycloak.use_nonce'] === 'string') {\n                useNonce = keycloakSettings['che.keycloak.use_nonce'].toLowerCase() === 'true';\n            }\n            window.sessionStorage.setItem('oidcIdeRedirectUrl', location.href);\n            keycloak\n                .init({\n                    onLoad: 'login-required',\n                    checkLoginIframe: false,\n                    useNonce: useNonce,\n                    scope: 'openid',\n                    redirectUri: location.href\n                })\n                .success(() => {\n                    resolve(keycloak);\n                })\n                .error(() => {\n                    reject(new Error('[Keycloak] Failed to initialize Keycloak'));\n                });\n        });\n    }\n\n}\n"
  },
  {
    "path": "assembly/assembly-root-war/src/main/webapp/_app/loader.css",
    "content": "/**\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\n#workspace-loader {\n    position: fixed;\n    width: 300px;\n    height: 45px;\n    left: 50%;\n    top: 30%;\n    margin-left: -150px;\n    transition: all 0.2s ease-in-out;\n}\n\n#workspace-loader-label {\n    position: absolute;\n    left: 0px;\n    top: 0px;\n    width: 300px;\n    height: 30px;\n    font-family: sans-serif;\n    font-size: 14px;\n    line-height: 30px;\n    text-align: center;\n    color: #a0a9b7;\n}\n\n#workspace-loader-reload {\n    display: none;\n    position: absolute;\n    left: 0px;\n    top: 0px;\n    width: 300px;\n    height: 30px;\n    font-family: sans-serif;\n    font-size: 14px;\n    line-height: 30px;\n    text-align: center;\n    color: #a0a9b7;\n}\n\n#workspace-loader-reload a {\n    color: #a0a9b7;\n}\n\n#workspace-loader-progress {\n    position: absolute;\n    width: 300px;\n    height: 15px;\n    left: 0px;\n    bottom: 0px;\n    background-color: #202325;\n    border: 1px solid #456594;\n    box-sizing: border-box;\n}\n\n#workspace-loader-progress>div {\n    position: absolute;\n    left: 1px;\n    right: 1px;\n    top: 1px;\n    bottom: 1px;\n    overflow: hidden;\n}\n\n#workspace-loader-progress-bar {\n    box-sizing: border-box;\n    height: 100%;\n    width: 0%;\n    background-color: #498fe1;\n    transition: all 0.2s linear;\n    animation-name: dancing;\n    animation-duration: 3s;\n    animation-delay: 1s;\n    animation-timing-function: linear;\n    animation-iteration-count: infinite;\n}\n\n#workspace-console {\n    position: fixed;\n    left: 30px;\n    right: 30px;\n    bottom: 25px;\n    height: 30%;\n    background-color: transparent;\n    overflow: auto;\n    color: #e6e6e6;\n    left: 2px;\n    right: 2px;\n    bottom: 2px;\n    transition: all 0.2s ease-in-out;\n}\n\n#workspace-console>div {\n    position: relative;\n    width: 100%;\n}\n\n#workspace-console pre {\n    font-family: \"Droid Sans Mono\", monospace;\n    font-size: 9pt;\n    line-height: 13px;\n    padding: 0;\n    margin: 0;\n    white-space: pre-wrap;\n    word-wrap: break-word;\n    cursor: text;\n}\n\n#workspace-console pre.error {\n    color: #e22812;\n}\n\n@-webkit-keyframes dancing {\n    0% {\n        width: 0%;\n        margin-left: 0%;\n    }\n    30% {\n        width: 30%;\n        margin-left: 0%;\n    }\n    70% {\n        width: 30%;\n        margin-left: 70%;\n    }\n    100% {\n        width: 0%;\n        margin-left: 100%;\n    }\n}\n\n@keyframes dancing {\n    0% {\n        width: 0%;\n        margin-left: 0%;\n    }\n    6% {\n        width: 30%;\n        margin-left: 0%;\n    }\n    14% {\n        width: 30%;\n        margin-left: 70%;\n    }\n    20% {\n        width: 0%;\n        margin-left: 100%;\n    }\n    100% {\n        width: 0%;\n        margin-left: 100%;\n    }\n}\n"
  },
  {
    "path": "assembly/assembly-root-war/src/main/webapp/_app/loader.html",
    "content": "<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Workspace token loader</title>\n\n    <link rel=\"stylesheet\" href=\"./loader.css\"/>\n    <script type=\"module\" src=\"loader.js\" defer></script>\n</head>\n\n<body style=\"background-color: #21252b; transition: background-color 0.5s ease;\">\n\n    <div id=\"workspace-loader\">\n        <div id=\"workspace-loader-label\">Loading a runtime token...</div>\n        <div id=\"workspace-loader-progress\">\n            <div>\n                <div id=\"workspace-loader-progress-bar\"></div>\n            </div>\n        </div>\n        <div id=\"workspace-loader-reload\">Press F5 or click <a href=\"#\">here</a> to try again.</div>\n    </div>\n    <div id=\"workspace-console\">\n        <div id=\"workspace-console-container\"></div>\n    </div>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "assembly/assembly-root-war/src/main/webapp/_app/loader.js",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\nimport { KeycloakLoader } from './keycloackLoader.js';\n\nclass Loader {\n\n    constructor() {\n        document.getElementById('workspace-loader-reload').onclick = () => this.onclickReload();\n    }\n\n    /**\n     * Hides progress bar and displays reloading prompt\n     */\n    hideLoader() {\n        document.getElementById('workspace-loader-label').style.display = 'none';\n        document.getElementById('workspace-loader-progress').style.display = 'none';\n\n        document.getElementById('workspace-loader-reload').style.display = 'block';\n    }\n\n    /**\n     * Displays error message\n     * @param {string} message an error message to show\n     */\n    error(message) {\n        const container = document.getElementById(\"workspace-console-container\");\n        if (container.childElementCount > 500) {\n            container.removeChild(container.firstChild)\n        }\n\n        const element = document.createElement(\"pre\");\n        element.innerHTML = message;\n        container.appendChild(element);\n        if (element.scrollIntoView) {\n            element.scrollIntoView();\n        }\n        element.className = \"error\";\n        return element;\n    }\n\n    /**\n     * Reloads the page\n     */\n    onclickReload() {\n        window.location.reload();\n        return false;\n    }\n\n    /**\n     * Returns query parameter value if it is present\n     * @param {string} name a query parameter name\n     */\n    getQueryParam(name) {\n        const params = window.location.search.substr(1),\n            paramEntries = params.split('&');\n        const entry = paramEntries.find(_entry => {\n            return _entry.startsWith(name + '=');\n        });\n        if (!entry) {\n            return;\n        }\n        const [_, value] = entry.split('=');\n        return decodeURIComponent(value);\n    }\n\n    /**\n     * Fetches workspace details by ID\n     * @param {string} workspaceId a workspace ID\n     */\n    asyncGetWorkspace(workspaceId) {\n        return new Promise((resolve, reject) => {\n            const request = new XMLHttpRequest();\n            request.open(\"GET\", '/api/workspace/' + workspaceId);\n            this.setAuthorizationHeader(request).then((xhr) => {\n                xhr.send();\n                xhr.onreadystatechange = () => {\n                    if (xhr.readyState !== 4) {\n                        return;\n                    }\n                    if (xhr.status !== 200) {\n                        const errorMessage = 'Failed to get the workspace: \"' + this.getRequestErrorMessage(xhr) + '\"';\n                        reject(new Error(errorMessage));\n                        return;\n                    }\n                    resolve(JSON.parse(xhr.responseText));\n                };\n            });\n        });\n    }\n\n    /**\n     * Sets authorization header for a request\n     * @param {XMLHttpRequest} xhr\n     */\n    setAuthorizationHeader(xhr) {\n        return new Promise((resolve, reject) => {\n            if (window._keycloak && window._keycloak.token) {\n                window._keycloak.updateToken(5).success(() => {\n                    xhr.setRequestHeader('Authorization', 'Bearer ' + window._keycloak.token);\n                    resolve(xhr);\n                }).error(() => {\n                    window.sessionStorage.setItem('oidcIdeRedirectUrl', location.href);\n                    window._keycloak.login();\n                    reject(new Error('Failed to refresh token'));\n                });\n            }\n\n            resolve(xhr);\n        });\n    }\n\n    /**\n     * Finds and returns appropriate server which user request belongs to, or throw error\n     * if none is found.\n     * @param {*} workspace a workspace\n     * @param {string} redirectUrl a redirect URL\n     */\n    asyncGetMatchedServer(workspace, redirectUrl) {\n        return new Promise((resolve, reject) => {\n            if (!workspace.runtime) {\n                reject(new Error(\"Can't check service link: Workspace isn't RUNNING at the moment.\"));\n                return;\n            }\n\n            var machines = Object.values(workspace.runtime.machines);\n\n            var servers = machines.filter(machines => machines.servers)\n              .map(machine => Object.values(machine.servers))\n              .reduce((servers, machineServers) => servers.concat(...machineServers), []);\n\n            const server = servers.find(_server => {\n                if (!_server.url) {\n                    return false;\n                }\n                const url = new URL(_server.url);\n                url.search = '';\n                return redirectUrl.startsWith(url.href);\n            });\n\n            if (server) {\n                resolve(server);\n            } else {\n                reject(new Error(\"Workspace doesn't have a server which matches with URL: \" + redirectUrl));\n            }\n        });\n    }\n\n    /**\n     * Returns resolved promise if `workspace` has the `runtime` property\n     * @param {*} workspace a workspace\n     */\n    asyncGetWsToken(workspace) {\n        return new Promise((resolve, reject) => {\n            if (workspace.runtime) {\n                resolve(workspace.runtime.machineToken);\n            } else {\n                reject(new Error(\"Can't get ws-token: Workspace isn't RUNNING at the moment.\"));\n            }\n        });\n    }\n\n    /**\n     * Calls auth endpoint in order to accept authentication cookie.\n     * @param {string} redirectUrl a redirect URL\n     * @param {string} token\n     */\n    asyncAuthenticate(redirectUrl, endpointOrigin, token) {\n        redirectUrl = new URL(redirectUrl);\n        // if endpointOrigin is just \"/\", we'd end up with \"///jwt/auth\". So we replace two or more consecutive / with a single /.\n        const url = redirectUrl.protocol + \"//\" + redirectUrl.host + (\"/\" + endpointOrigin + \"/jwt/auth\").replace(/\\/{2,}/g, \"/\");\n        return new Promise((resolve, reject) => {\n            const request = new XMLHttpRequest();\n            request.open('GET', url);\n            request.setRequestHeader('Authorization', 'Bearer ' + token);\n            request.withCredentials = true;\n            request.send();\n            request.onreadystatechange = () => {\n                if (request.readyState !== 4) {\n                    return;\n                }\n                if (request.status !== 204) {\n                    const errorMessage = 'Failed to authenticate: \"' + this.getRequestErrorMessage(request) + '\"';\n                    reject(new Error(errorMessage));\n                    return;\n                }\n                resolve();\n            };\n        });\n    }\n\n    getRequestErrorMessage(xhr) {\n        let errorMessage;\n        try {\n            const response = JSON.parse(xhr.responseText);\n            errorMessage = response.message;\n        } catch (e) { }\n\n        if (errorMessage) {\n            return errorMessage;\n        }\n\n        if (xhr.statusText) {\n            return xhr.statusText;\n        }\n\n        return \"Unknown error\";\n    }\n\n}\n\n(async function() {\n    const loader = new Loader();\n\n    const workspaceId = loader.getQueryParam('workspaceId');\n    const redirectUrl = loader.getQueryParam('redirectUrl');\n\n    try {\n        if (!workspaceId) {\n            throw new Error(\"Workspace ID isn't found in query parameters.\");\n        }\n        if (!redirectUrl) {\n            throw new Error(\"Redirect URL isn't found in query parameters.\");\n        }\n\n        await new KeycloakLoader().loadKeycloakSettings();\n        const workspace = await loader.asyncGetWorkspace(workspaceId);\n        const server = await loader.asyncGetMatchedServer(workspace, redirectUrl);\n        const token = await loader.asyncGetWsToken(workspace);\n        await loader.asyncAuthenticate(server.url, server.attributes.endpointOrigin, token);\n\n        window.location.replace(redirectUrl);\n    } catch (errorMessage) {\n        console.error(errorMessage);\n        loader.hideLoader();\n        loader.error(errorMessage);\n    }\n})();\n"
  },
  {
    "path": "assembly/assembly-root-war/src/main/webapp/_app/oauth.html",
    "content": "<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Authentication</title>\n    <script type=\"module\" src=\"./oauthLoader.js\" defer></script>\n</head>\n\n<body style=\"background-color: #21252b; transition: background-color 0.5s ease;\">\n\n<div id=\"error-console\"></div>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "assembly/assembly-root-war/src/main/webapp/_app/oauthLoader.js",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\nimport { KeycloakLoader } from './keycloackLoader.js';\n\n/**\n * Displays error message\n * @param {string} message an error message to show\n */\nfunction error(message) {\n    const container = document.getElementById(\"error-console\");\n\n    const element = document.createElement(\"pre\");\n    element.innerHTML = message;\n    element.style.color = 'red';\n    container.appendChild(element);\n    return element;\n}\n\n/**\n * Returns an array of query parameter values if it is present\n * @param {string} name of the query parameter\n */\nfunction getQueryParams(name) {\n    const queryString = window.location.search;\n    return new URLSearchParams(queryString).getAll(name);\n}\n\n/**\n * Fetches userId\n */\nfunction asyncGetUserId() {\n    return new Promise((resolve, reject) => {\n        const request = new XMLHttpRequest();\n        request.open(\"GET\", '/api/user');\n        setAuthorizationHeader(request).then((xhr) => {\n            xhr.send();\n            xhr.onreadystatechange = () => {\n                if (xhr.readyState !== 4) {\n                    return;\n                }\n                if (xhr.status !== 200) {\n                    const errorMessage = 'Failed to get the workspace: \"' + this.getRequestErrorMessage(xhr) + '\"';\n                    reject(new Error(errorMessage));\n                    return;\n                }\n                resolve(JSON.parse(xhr.responseText).id);\n            };\n        });\n    });\n}\n\n/**\n * Sets authorization header for a request\n * @param {XMLHttpRequest} xhr\n */\nfunction setAuthorizationHeader(xhr) {\n    return new Promise((resolve, reject) => {\n        if (window._keycloak && window._keycloak.token) {\n            window._keycloak.updateToken(5).success(() => {\n                xhr.setRequestHeader('Authorization', 'Bearer ' + window._keycloak.token);\n                resolve(xhr);\n            }).error(() => {\n                window.sessionStorage.setItem('oidcIdeRedirectUrl', location.href);\n                window._keycloak.login();\n                reject(new Error('Failed to refresh token'));\n            });\n        }\n\n        resolve(xhr);\n    });\n}\n\nfunction postMessage(message) {\n    if (window.opener) {\n        window.opener.postMessage(message, '*');\n    }\n}\n\n/**\n * Fetches workspace details by ID\n * @param {string} workspaceId a workspace id\n */\nfunction getWorkspace(workspaceId) {\n    return new Promise((resolve, reject) => {\n        const request = new XMLHttpRequest();\n        request.open(\"GET\", '/api/workspace/' + workspaceId);\n        setAuthorizationHeader(request).then((xhr) => {\n            xhr.send();\n            xhr.onreadystatechange = () => {\n                if (xhr.readyState !== 4) {\n                    return;\n                }\n                if (xhr.status !== 200) {\n                    const errorMessage = 'Failed to get the workspace: \"' + this.getRequestErrorMessage(xhr) + '\"';\n                    reject(new Error(errorMessage));\n                    return;\n                }\n                resolve(undefined);\n            };\n        });\n    });\n}\n\n\nfunction parseToken (token) {\n    return JSON.parse(atob(token.split('.')[1]));\n}\n\n(async () => {\n    let token;\n    try {\n        const keycloak = await new KeycloakLoader().loadKeycloakSettings();\n        token = keycloak ? keycloak.token : undefined;\n    } catch (e) {\n        console.log(e.message);\n    }\n    try {\n        if (token) {\n            await new Promise((resolve, reject) => {\n                window.addEventListener('message', async data => {\n                    if (data.data.startsWith('token:')) {\n                        const machineToken = parseToken(data.data.substring(6, data.data.length));\n                        const userToken = parseToken(token);\n                        if (machineToken.uid === userToken.sub) {\n                            try {\n                                await getWorkspace(machineToken.wsid);\n                            } catch (e) {\n                                reject(e);\n                            }\n                        } else {\n                            reject(new Error('Machine and user token mismatch'));\n                        }\n                        resolve(undefined);\n                    }\n                });\n                postMessage('status:ready-to-receive-messages');\n            });\n        }\n        const status = getQueryParams('status')[0]; {\n            if (status && status === 'ready') {\n                postMessage('token:' + (token ? token : ''));\n                return;\n            }\n        }\n        const oauthProvider = getQueryParams('oauth_provider')[0];\n        if (!oauthProvider) {\n            postMessage('token:' + (token ? token : ''));\n            return;\n        }\n        const currentUrl = window.location.href;\n        const cheUrl = currentUrl.substring(0, currentUrl.indexOf('/_app'));\n        const apiUrl = cheUrl + '/api';\n        const redirectUrl = currentUrl.substring(0, currentUrl.indexOf('?')) + '?status=ready';\n        let url = `${apiUrl}/oauth/authenticate?oauth_provider=${oauthProvider}&userId=${await asyncGetUserId()}`;\n        const scope = getQueryParams('scope'); {\n            for (const s of scope) {\n                url += `&scope=${s}`;\n            }\n        }\n        url += `&redirect_after_login=${redirectUrl}`;\n        if (token) {\n            url += `&token=${token}`;\n        }\n        window.location.replace(url);\n    } catch (errorMessage) {\n        error(errorMessage);\n        console.error(errorMessage);\n    }\n})\n();\n"
  },
  {
    "path": "assembly/assembly-root-war/src/test/java/org/eclipse/che/ApiAccessRejectionFilterTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che;\n\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\nimport static org.mockito.Mockito.when;\n\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletOutputStream;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\n@Listeners(value = {MockitoTestNGListener.class})\npublic class ApiAccessRejectionFilterTest {\n  @Mock private FilterChain chain;\n\n  @Mock private HttpServletRequest request;\n\n  @Mock private HttpServletResponse response;\n\n  @Mock private ServletOutputStream outputStream;\n\n  @InjectMocks private ApiAccessRejectionFilter filter;\n\n  @Test\n  public void shouldReturnError() throws Exception {\n    // given\n    when(response.getOutputStream()).thenReturn(outputStream);\n\n    // when\n    filter.doFilter(request, response, chain);\n\n    // then\n    verifyNoMoreInteractions(chain);\n    verify(response).setStatus(500);\n    verify(outputStream).write(eq(ApiAccessRejectionFilter.ERROR_MESSAGE.getBytes()));\n  }\n}\n"
  },
  {
    "path": "assembly/assembly-root-war/src/test/java/org/eclipse/che/DashboardRedirectionFilterTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.util.Collections;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Max Shaposhnik (mshaposhnik@codenvy.com)\n */\n@Listeners(value = {MockitoTestNGListener.class})\npublic class DashboardRedirectionFilterTest {\n  @Mock private FilterChain chain;\n\n  @Mock private HttpServletRequest request;\n\n  @Mock private HttpServletResponse response;\n\n  @InjectMocks private DashboardRedirectionFilter filter;\n\n  @Test(dataProvider = \"nonNamespacePathProvider\")\n  public void shouldRedirectIfGetRequestIsNotNamespaceWorkspaceName(String uri) throws Exception {\n    // given\n    when(request.getMethod()).thenReturn(\"GET\");\n    when(request.getRequestURI()).thenReturn(uri);\n    EnvironmentContext context = new EnvironmentContext();\n    context.setSubject(\n        new SubjectImpl(\"id123\", Collections.emptyList(), \"name\", \"token123\", false));\n    EnvironmentContext.setCurrent(context);\n\n    // when\n    filter.doFilter(request, response, chain);\n\n    // then\n    verify(response).sendRedirect(eq(\"/dashboard/\"));\n  }\n\n  @Test(dataProvider = \"nonNamespacePathProvider\")\n  public void shouldRedirectIfHEADRequestIsNotNamespaceWorkspaceName(String uri) throws Exception {\n    // given\n    when(request.getMethod()).thenReturn(\"HEAD\");\n    when(request.getRequestURI()).thenReturn(uri);\n    EnvironmentContext context = new EnvironmentContext();\n    context.setSubject(\n        new SubjectImpl(\"id123\", Collections.emptyList(), \"name\", \"token123\", false));\n    EnvironmentContext.setCurrent(context);\n\n    // when\n    filter.doFilter(request, response, chain);\n\n    // then\n    verify(response).sendRedirect(eq(\"/dashboard/\"));\n  }\n\n  @DataProvider(name = \"nonNamespacePathProvider\")\n  public Object[][] nonProjectPathProvider() {\n    return new Object[][] {\n      {\"/\"}, {\"/ws-id/\"}, {\"/wsname\"}, {\"/unknown/resource/index.html\"},\n    };\n  }\n\n  @Test\n  public void shouldSkipRequestToAppResources() throws Exception {\n    // given\n    when(request.getMethod()).thenReturn(\"GET\");\n    when(request.getRequestURI()).thenReturn(\"/_app/loader.html\");\n\n    // when\n    filter.doFilter(request, response, chain);\n\n    // then\n    verify(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class));\n  }\n\n  @Test(dataProvider = \"notGETNorHEADMethodProvider\")\n  public void shouldSkipNotGETNorHEADRequest(String method) throws Exception {\n    // given\n    when(request.getMethod()).thenReturn(method);\n    lenient().when(request.getRequestURI()).thenReturn(\"/namespace/workspaceName\");\n\n    // when\n    filter.doFilter(request, response, chain);\n\n    // then\n    verify(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class));\n  }\n\n  @DataProvider(name = \"notGETNorHEADMethodProvider\")\n  public Object[][] notGETNorHEADMethodProvider() {\n    return new Object[][] {{\"POST\"}, {\"DELETE\"}, {\"PUT\"}};\n  }\n}\n"
  },
  {
    "path": "assembly/assembly-swagger-war/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-assembly-parent</artifactId>\n        <groupId>org.eclipse.che</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>assembly-swagger-war</artifactId>\n    <packaging>war</packaging>\n    <name>Che Assembly :: Swagger war</name>\n    <build>\n        <finalName>che-swagger-ui</finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-war-plugin</artifactId>\n                <configuration>\n                    <failOnMissingWebXml>false</failOnMissingWebXml>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>com.mycila</groupId>\n                <artifactId>license-maven-plugin</artifactId>\n                <configuration>\n                    <excludes>\n                        <exclude>**/src/**</exclude>\n                    </excludes>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "assembly/assembly-swagger-war/src/main/webapp/index.html",
    "content": "<!-- HTML for static distribution bundle build -->\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Swagger UI</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"./swagger-ui.css\" />\n    <link rel=\"icon\" type=\"image/png\" href=\"./favicon-32x32.png\" sizes=\"32x32\" />\n    <link rel=\"icon\" type=\"image/png\" href=\"./favicon-16x16.png\" sizes=\"16x16\" />\n    <style>\n      html\n      {\n        box-sizing: border-box;\n        overflow: -moz-scrollbars-vertical;\n        overflow-y: scroll;\n      }\n\n      *,\n      *:before,\n      *:after\n      {\n        box-sizing: inherit;\n      }\n\n      body\n      {\n        margin:0;\n        background: #fafafa;\n      }\n    </style>\n  </head>\n\n  <body>\n    <div id=\"swagger-ui\"></div>\n\n    <script src=\"./swagger-ui-bundle.js\" charset=\"UTF-8\"> </script>\n    <script src=\"./swagger-ui-standalone-preset.js\" charset=\"UTF-8\"> </script>\n    <script>\n    window.onload = function() {\n      var url = window.location.search.match(/url=([^&]+)/);\n      if (url && url.length > 1) {\n        url = decodeURIComponent(url[1]);\n      } else {\n        url = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '') + '/api/openapi.json';\n      }\n\n      // Begin Swagger UI call region\n      const ui = SwaggerUIBundle({\n        url: url,\n        dom_id: '#swagger-ui',\n        deepLinking: true,\n        presets: [\n          SwaggerUIBundle.presets.apis,\n          SwaggerUIStandalonePreset\n        ],\n        plugins: [\n          SwaggerUIBundle.plugins.DownloadUrl\n        ],\n        layout: \"StandaloneLayout\"\n      });\n      // End Swagger UI call region\n\n      window.ui = ui;\n    };\n  </script>\n  </body>\n</html>\n"
  },
  {
    "path": "assembly/assembly-swagger-war/src/main/webapp/oauth2-redirect.html",
    "content": "<!doctype html>\n<html lang=\"en-US\">\n<head>\n    <title>Swagger UI: OAuth2 Redirect</title>\n</head>\n<body>\n<script>\n    'use strict';\n    function run () {\n        var oauth2 = window.opener.swaggerUIRedirectOauth2;\n        var sentState = oauth2.state;\n        var redirectUrl = oauth2.redirectUrl;\n        var isValid, qp, arr;\n\n        if (/code|token|error/.test(window.location.hash)) {\n            qp = window.location.hash.substring(1);\n        } else {\n            qp = location.search.substring(1);\n        }\n\n        arr = qp.split(\"&\");\n        arr.forEach(function (v,i,_arr) { _arr[i] = '\"' + v.replace('=', '\":\"') + '\"';});\n        qp = qp ? JSON.parse('{' + arr.join() + '}',\n                function (key, value) {\n                    return key === \"\" ? value : decodeURIComponent(value);\n                }\n        ) : {};\n\n        isValid = qp.state === sentState;\n\n        if ((\n          oauth2.auth.schema.get(\"flow\") === \"accessCode\" ||\n          oauth2.auth.schema.get(\"flow\") === \"authorizationCode\" ||\n          oauth2.auth.schema.get(\"flow\") === \"authorization_code\"\n        ) && !oauth2.auth.code) {\n            if (!isValid) {\n                oauth2.errCb({\n                    authId: oauth2.auth.name,\n                    source: \"auth\",\n                    level: \"warning\",\n                    message: \"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server\"\n                });\n            }\n\n            if (qp.code) {\n                delete oauth2.state;\n                oauth2.auth.code = qp.code;\n                oauth2.callback({auth: oauth2.auth, redirectUrl: redirectUrl});\n            } else {\n                let oauthErrorMsg;\n                if (qp.error) {\n                    oauthErrorMsg = \"[\"+qp.error+\"]: \" +\n                        (qp.error_description ? qp.error_description+ \". \" : \"no accessCode received from the server. \") +\n                        (qp.error_uri ? \"More info: \"+qp.error_uri : \"\");\n                }\n\n                oauth2.errCb({\n                    authId: oauth2.auth.name,\n                    source: \"auth\",\n                    level: \"error\",\n                    message: oauthErrorMsg || \"[Authorization failed]: no accessCode received from the server\"\n                });\n            }\n        } else {\n            oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid, redirectUrl: redirectUrl});\n        }\n        window.close();\n    }\n\n    window.addEventListener('DOMContentLoaded', function () {\n      run();\n    });\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "assembly/assembly-swagger-war/src/main/webapp/swagger-ui-bundle.js",
    "content": "/*! For license information please see swagger-ui-bundle.js.LICENSE.txt */\n!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.SwaggerUIBundle=t():e.SwaggerUIBundle=t()}(this,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"/dist\",n(n.s=543)}([function(e,t,n){\"use strict\";e.exports=n(132)},function(e,t,n){e.exports=function(){\"use strict\";var e=Array.prototype.slice;function t(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function n(e){return i(e)?e:J(e)}function r(e){return s(e)?e:K(e)}function o(e){return u(e)?e:Y(e)}function a(e){return i(e)&&!c(e)?e:G(e)}function i(e){return!(!e||!e[p])}function s(e){return!(!e||!e[f])}function u(e){return!(!e||!e[h])}function c(e){return s(e)||u(e)}function l(e){return!(!e||!e[d])}t(r,n),t(o,n),t(a,n),n.isIterable=i,n.isKeyed=s,n.isIndexed=u,n.isAssociative=c,n.isOrdered=l,n.Keyed=r,n.Indexed=o,n.Set=a;var p=\"@@__IMMUTABLE_ITERABLE__@@\",f=\"@@__IMMUTABLE_KEYED__@@\",h=\"@@__IMMUTABLE_INDEXED__@@\",d=\"@@__IMMUTABLE_ORDERED__@@\",m=\"delete\",v=5,g=1<<v,y=g-1,b={},_={value:!1},w={value:!1};function x(e){return e.value=!1,e}function E(e){e&&(e.value=!0)}function S(){}function C(e,t){t=t||0;for(var n=Math.max(0,e.length-t),r=new Array(n),o=0;o<n;o++)r[o]=e[o+t];return r}function A(e){return void 0===e.size&&(e.size=e.__iterate(O)),e.size}function k(e,t){if(\"number\"!=typeof t){var n=t>>>0;if(\"\"+n!==t||4294967295===n)return NaN;t=n}return t<0?A(e)+t:t}function O(){return!0}function j(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function T(e,t){return P(e,t,0)}function I(e,t){return P(e,t,t)}function P(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}var N=0,M=1,R=2,D=\"function\"==typeof Symbol&&Symbol.iterator,L=\"@@iterator\",B=D||L;function F(e){this.next=e}function U(e,t,n,r){var o=0===e?t:1===e?n:[t,n];return r?r.value=o:r={value:o,done:!1},r}function q(){return{value:void 0,done:!0}}function z(e){return!!H(e)}function V(e){return e&&\"function\"==typeof e.next}function W(e){var t=H(e);return t&&t.call(e)}function H(e){var t=e&&(D&&e[D]||e[L]);if(\"function\"==typeof t)return t}function $(e){return e&&\"number\"==typeof e.length}function J(e){return null==e?ie():i(e)?e.toSeq():ce(e)}function K(e){return null==e?ie().toKeyedSeq():i(e)?s(e)?e.toSeq():e.fromEntrySeq():se(e)}function Y(e){return null==e?ie():i(e)?s(e)?e.entrySeq():e.toIndexedSeq():ue(e)}function G(e){return(null==e?ie():i(e)?s(e)?e.entrySeq():e:ue(e)).toSetSeq()}F.prototype.toString=function(){return\"[Iterator]\"},F.KEYS=N,F.VALUES=M,F.ENTRIES=R,F.prototype.inspect=F.prototype.toSource=function(){return this.toString()},F.prototype[B]=function(){return this},t(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString(\"Seq {\",\"}\")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(e,t){return pe(this,e,t,!0)},J.prototype.__iterator=function(e,t){return fe(this,e,t,!0)},t(K,J),K.prototype.toKeyedSeq=function(){return this},t(Y,J),Y.of=function(){return Y(arguments)},Y.prototype.toIndexedSeq=function(){return this},Y.prototype.toString=function(){return this.__toString(\"Seq [\",\"]\")},Y.prototype.__iterate=function(e,t){return pe(this,e,t,!1)},Y.prototype.__iterator=function(e,t){return fe(this,e,t,!1)},t(G,J),G.of=function(){return G(arguments)},G.prototype.toSetSeq=function(){return this},J.isSeq=ae,J.Keyed=K,J.Set=G,J.Indexed=Y;var Z,X,Q,ee=\"@@__IMMUTABLE_SEQ__@@\";function te(e){this._array=e,this.size=e.length}function ne(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function re(e){this._iterable=e,this.size=e.length||e.size}function oe(e){this._iterator=e,this._iteratorCache=[]}function ae(e){return!(!e||!e[ee])}function ie(){return Z||(Z=new te([]))}function se(e){var t=Array.isArray(e)?new te(e).fromEntrySeq():V(e)?new oe(e).fromEntrySeq():z(e)?new re(e).fromEntrySeq():\"object\"==typeof e?new ne(e):void 0;if(!t)throw new TypeError(\"Expected Array or iterable object of [k, v] entries, or keyed object: \"+e);return t}function ue(e){var t=le(e);if(!t)throw new TypeError(\"Expected Array or iterable object of values: \"+e);return t}function ce(e){var t=le(e)||\"object\"==typeof e&&new ne(e);if(!t)throw new TypeError(\"Expected Array or iterable object of values, or keyed object: \"+e);return t}function le(e){return $(e)?new te(e):V(e)?new oe(e):z(e)?new re(e):void 0}function pe(e,t,n,r){var o=e._cache;if(o){for(var a=o.length-1,i=0;i<=a;i++){var s=o[n?a-i:i];if(!1===t(s[1],r?s[0]:i,e))return i+1}return i}return e.__iterateUncached(t,n)}function fe(e,t,n,r){var o=e._cache;if(o){var a=o.length-1,i=0;return new F((function(){var e=o[n?a-i:i];return i++>a?q():U(t,r?e[0]:i-1,e[1])}))}return e.__iteratorUncached(t,n)}function he(e,t){return t?de(t,e,\"\",{\"\":e}):me(e)}function de(e,t,n,r){return Array.isArray(t)?e.call(r,n,Y(t).map((function(n,r){return de(e,n,r,t)}))):ve(t)?e.call(r,n,K(t).map((function(n,r){return de(e,n,r,t)}))):t}function me(e){return Array.isArray(e)?Y(e).map(me).toList():ve(e)?K(e).map(me).toMap():e}function ve(e){return e&&(e.constructor===Object||void 0===e.constructor)}function ge(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if(\"function\"==typeof e.valueOf&&\"function\"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!(\"function\"!=typeof e.equals||\"function\"!=typeof t.equals||!e.equals(t))}function ye(e,t){if(e===t)return!0;if(!i(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||s(e)!==s(t)||u(e)!==u(t)||l(e)!==l(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!c(e);if(l(e)){var r=e.entries();return t.every((function(e,t){var o=r.next().value;return o&&ge(o[1],e)&&(n||ge(o[0],t))}))&&r.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)\"function\"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var a=e;e=t,t=a}var p=!0,f=t.__iterate((function(t,r){if(n?!e.has(t):o?!ge(t,e.get(r,b)):!ge(e.get(r,b),t))return p=!1,!1}));return p&&e.size===f}function be(e,t){if(!(this instanceof be))return new be(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(X)return X;X=this}}function _e(e,t){if(!e)throw new Error(t)}function we(e,t,n){if(!(this instanceof we))return new we(e,t,n);if(_e(0!==n,\"Cannot step a Range by 0\"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),t<e&&(n=-n),this._start=e,this._end=t,this._step=n,this.size=Math.max(0,Math.ceil((t-e)/n-1)+1),0===this.size){if(Q)return Q;Q=this}}function xe(){throw TypeError(\"Abstract\")}function Ee(){}function Se(){}function Ce(){}J.prototype[ee]=!0,t(te,Y),te.prototype.get=function(e,t){return this.has(e)?this._array[k(this,e)]:t},te.prototype.__iterate=function(e,t){for(var n=this._array,r=n.length-1,o=0;o<=r;o++)if(!1===e(n[t?r-o:o],o,this))return o+1;return o},te.prototype.__iterator=function(e,t){var n=this._array,r=n.length-1,o=0;return new F((function(){return o>r?q():U(e,o,n[t?r-o++:o++])}))},t(ne,K),ne.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},ne.prototype.has=function(e){return this._object.hasOwnProperty(e)},ne.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,o=r.length-1,a=0;a<=o;a++){var i=r[t?o-a:a];if(!1===e(n[i],i,this))return a+1}return a},ne.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,o=r.length-1,a=0;return new F((function(){var i=r[t?o-a:a];return a++>o?q():U(e,i,n[i])}))},ne.prototype[d]=!0,t(re,Y),re.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=W(this._iterable),r=0;if(V(n))for(var o;!(o=n.next()).done&&!1!==e(o.value,r++,this););return r},re.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=W(this._iterable);if(!V(n))return new F(q);var r=0;return new F((function(){var t=n.next();return t.done?t:U(e,r++,t.value)}))},t(oe,Y),oe.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n,r=this._iterator,o=this._iteratorCache,a=0;a<o.length;)if(!1===e(o[a],a++,this))return a;for(;!(n=r.next()).done;){var i=n.value;if(o[a]=i,!1===e(i,a++,this))break}return a},oe.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=this._iterator,r=this._iteratorCache,o=0;return new F((function(){if(o>=r.length){var t=n.next();if(t.done)return t;r[o]=t.value}return U(e,o,r[o++])}))},t(be,Y),be.prototype.toString=function(){return 0===this.size?\"Repeat []\":\"Repeat [ \"+this._value+\" \"+this.size+\" times ]\"},be.prototype.get=function(e,t){return this.has(e)?this._value:t},be.prototype.includes=function(e){return ge(this._value,e)},be.prototype.slice=function(e,t){var n=this.size;return j(e,t,n)?this:new be(this._value,I(t,n)-T(e,n))},be.prototype.reverse=function(){return this},be.prototype.indexOf=function(e){return ge(this._value,e)?0:-1},be.prototype.lastIndexOf=function(e){return ge(this._value,e)?this.size:-1},be.prototype.__iterate=function(e,t){for(var n=0;n<this.size;n++)if(!1===e(this._value,n,this))return n+1;return n},be.prototype.__iterator=function(e,t){var n=this,r=0;return new F((function(){return r<n.size?U(e,r++,n._value):q()}))},be.prototype.equals=function(e){return e instanceof be?ge(this._value,e._value):ye(e)},t(we,Y),we.prototype.toString=function(){return 0===this.size?\"Range []\":\"Range [ \"+this._start+\"...\"+this._end+(1!==this._step?\" by \"+this._step:\"\")+\" ]\"},we.prototype.get=function(e,t){return this.has(e)?this._start+k(this,e)*this._step:t},we.prototype.includes=function(e){var t=(e-this._start)/this._step;return t>=0&&t<this.size&&t===Math.floor(t)},we.prototype.slice=function(e,t){return j(e,t,this.size)?this:(e=T(e,this.size),(t=I(t,this.size))<=e?new we(0,0):new we(this.get(e,this._end),this.get(t,this._end),this._step))},we.prototype.indexOf=function(e){var t=e-this._start;if(t%this._step==0){var n=t/this._step;if(n>=0&&n<this.size)return n}return-1},we.prototype.lastIndexOf=function(e){return this.indexOf(e)},we.prototype.__iterate=function(e,t){for(var n=this.size-1,r=this._step,o=t?this._start+n*r:this._start,a=0;a<=n;a++){if(!1===e(o,a,this))return a+1;o+=t?-r:r}return a},we.prototype.__iterator=function(e,t){var n=this.size-1,r=this._step,o=t?this._start+n*r:this._start,a=0;return new F((function(){var i=o;return o+=t?-r:r,a>n?q():U(e,a++,i)}))},we.prototype.equals=function(e){return e instanceof we?this._start===e._start&&this._end===e._end&&this._step===e._step:ye(this,e)},t(xe,n),t(Ee,xe),t(Se,xe),t(Ce,xe),xe.Keyed=Ee,xe.Indexed=Se,xe.Set=Ce;var Ae=\"function\"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),r=65535&(t|=0);return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0};function ke(e){return e>>>1&1073741824|3221225471&e}function Oe(e){if(!1===e||null==e)return 0;if(\"function\"==typeof e.valueOf&&(!1===(e=e.valueOf())||null==e))return 0;if(!0===e)return 1;var t=typeof e;if(\"number\"===t){if(e!=e||e===1/0)return 0;var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)n^=e/=4294967295;return ke(n)}if(\"string\"===t)return e.length>Fe?je(e):Te(e);if(\"function\"==typeof e.hashCode)return e.hashCode();if(\"object\"===t)return Ie(e);if(\"function\"==typeof e.toString)return Te(e.toString());throw new Error(\"Value type \"+t+\" cannot be hashed.\")}function je(e){var t=ze[e];return void 0===t&&(t=Te(e),qe===Ue&&(qe=0,ze={}),qe++,ze[e]=t),t}function Te(e){for(var t=0,n=0;n<e.length;n++)t=31*t+e.charCodeAt(n)|0;return ke(t)}function Ie(e){var t;if(De&&void 0!==(t=Re.get(e)))return t;if(void 0!==(t=e[Be]))return t;if(!Ne){if(void 0!==(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[Be]))return t;if(void 0!==(t=Me(e)))return t}if(t=++Le,1073741824&Le&&(Le=0),De)Re.set(e,t);else{if(void 0!==Pe&&!1===Pe(e))throw new Error(\"Non-extensible objects are not allowed as keys.\");if(Ne)Object.defineProperty(e,Be,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[Be]=t;else{if(void 0===e.nodeType)throw new Error(\"Unable to set a non-enumerable property on object.\");e[Be]=t}}return t}var Pe=Object.isExtensible,Ne=function(){try{return Object.defineProperty({},\"@\",{}),!0}catch(e){return!1}}();function Me(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}var Re,De=\"function\"==typeof WeakMap;De&&(Re=new WeakMap);var Le=0,Be=\"__immutablehash__\";\"function\"==typeof Symbol&&(Be=Symbol(Be));var Fe=16,Ue=255,qe=0,ze={};function Ve(e){_e(e!==1/0,\"Cannot perform this action with an infinite size.\")}function We(e){return null==e?ot():He(e)&&!l(e)?e:ot().withMutations((function(t){var n=r(e);Ve(n.size),n.forEach((function(e,n){return t.set(n,e)}))}))}function He(e){return!(!e||!e[Je])}t(We,Ee),We.of=function(){var t=e.call(arguments,0);return ot().withMutations((function(e){for(var n=0;n<t.length;n+=2){if(n+1>=t.length)throw new Error(\"Missing value for key: \"+t[n]);e.set(t[n],t[n+1])}}))},We.prototype.toString=function(){return this.__toString(\"Map {\",\"}\")},We.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},We.prototype.set=function(e,t){return at(this,e,t)},We.prototype.setIn=function(e,t){return this.updateIn(e,b,(function(){return t}))},We.prototype.remove=function(e){return at(this,e,b)},We.prototype.deleteIn=function(e){return this.updateIn(e,(function(){return b}))},We.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},We.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=vt(this,xn(e),t,n);return r===b?void 0:r},We.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):ot()},We.prototype.merge=function(){return ft(this,void 0,arguments)},We.prototype.mergeWith=function(t){return ft(this,t,e.call(arguments,1))},We.prototype.mergeIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,ot(),(function(e){return\"function\"==typeof e.merge?e.merge.apply(e,n):n[n.length-1]}))},We.prototype.mergeDeep=function(){return ft(this,ht,arguments)},We.prototype.mergeDeepWith=function(t){var n=e.call(arguments,1);return ft(this,dt(t),n)},We.prototype.mergeDeepIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,ot(),(function(e){return\"function\"==typeof e.mergeDeep?e.mergeDeep.apply(e,n):n[n.length-1]}))},We.prototype.sort=function(e){return zt(pn(this,e))},We.prototype.sortBy=function(e,t){return zt(pn(this,t,e))},We.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},We.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new S)},We.prototype.asImmutable=function(){return this.__ensureOwner()},We.prototype.wasAltered=function(){return this.__altered},We.prototype.__iterator=function(e,t){return new et(this,e,t)},We.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate((function(t){return r++,e(t[1],t[0],n)}),t),r},We.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?rt(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},We.isMap=He;var $e,Je=\"@@__IMMUTABLE_MAP__@@\",Ke=We.prototype;function Ye(e,t){this.ownerID=e,this.entries=t}function Ge(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function Ze(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function Xe(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function Qe(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function et(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&nt(e._root)}function tt(e,t){return U(e,t[0],t[1])}function nt(e,t){return{node:e,index:0,__prev:t}}function rt(e,t,n,r){var o=Object.create(Ke);return o.size=e,o._root=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function ot(){return $e||($e=rt(0))}function at(e,t,n){var r,o;if(e._root){var a=x(_),i=x(w);if(r=it(e._root,e.__ownerID,0,void 0,t,n,a,i),!i.value)return e;o=e.size+(a.value?n===b?-1:1:0)}else{if(n===b)return e;o=1,r=new Ye(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=o,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?rt(o,r):ot()}function it(e,t,n,r,o,a,i,s){return e?e.update(t,n,r,o,a,i,s):a===b?e:(E(s),E(i),new Qe(t,r,[o,a]))}function st(e){return e.constructor===Qe||e.constructor===Xe}function ut(e,t,n,r,o){if(e.keyHash===r)return new Xe(t,r,[e.entry,o]);var a,i=(0===n?e.keyHash:e.keyHash>>>n)&y,s=(0===n?r:r>>>n)&y;return new Ge(t,1<<i|1<<s,i===s?[ut(e,t,n+v,r,o)]:(a=new Qe(t,r,o),i<s?[e,a]:[a,e]))}function ct(e,t,n,r){e||(e=new S);for(var o=new Qe(e,Oe(n),[n,r]),a=0;a<t.length;a++){var i=t[a];o=o.update(e,0,void 0,i[0],i[1])}return o}function lt(e,t,n,r){for(var o=0,a=0,i=new Array(n),s=0,u=1,c=t.length;s<c;s++,u<<=1){var l=t[s];void 0!==l&&s!==r&&(o|=u,i[a++]=l)}return new Ge(e,o,i)}function pt(e,t,n,r,o){for(var a=0,i=new Array(g),s=0;0!==n;s++,n>>>=1)i[s]=1&n?t[a++]:void 0;return i[r]=o,new Ze(e,a+1,i)}function ft(e,t,n){for(var o=[],a=0;a<n.length;a++){var s=n[a],u=r(s);i(s)||(u=u.map((function(e){return he(e)}))),o.push(u)}return mt(e,t,o)}function ht(e,t,n){return e&&e.mergeDeep&&i(t)?e.mergeDeep(t):ge(e,t)?e:t}function dt(e){return function(t,n,r){if(t&&t.mergeDeepWith&&i(n))return t.mergeDeepWith(e,n);var o=e(t,n,r);return ge(t,o)?t:o}}function mt(e,t,n){return 0===(n=n.filter((function(e){return 0!==e.size}))).length?e:0!==e.size||e.__ownerID||1!==n.length?e.withMutations((function(e){for(var r=t?function(n,r){e.update(r,b,(function(e){return e===b?n:t(e,n,r)}))}:function(t,n){e.set(n,t)},o=0;o<n.length;o++)n[o].forEach(r)})):e.constructor(n[0])}function vt(e,t,n,r){var o=e===b,a=t.next();if(a.done){var i=o?n:e,s=r(i);return s===i?e:s}_e(o||e&&e.set,\"invalid keyPath\");var u=a.value,c=o?b:e.get(u,b),l=vt(c,t,n,r);return l===c?e:l===b?e.remove(u):(o?ot():e).set(u,l)}function gt(e){return e=(e=(858993459&(e-=e>>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function yt(e,t,n,r){var o=r?e:C(e);return o[t]=n,o}function bt(e,t,n,r){var o=e.length+1;if(r&&t+1===o)return e[t]=n,e;for(var a=new Array(o),i=0,s=0;s<o;s++)s===t?(a[s]=n,i=-1):a[s]=e[s+i];return a}function _t(e,t,n){var r=e.length-1;if(n&&t===r)return e.pop(),e;for(var o=new Array(r),a=0,i=0;i<r;i++)i===t&&(a=1),o[i]=e[i+a];return o}Ke[Je]=!0,Ke[m]=Ke.remove,Ke.removeIn=Ke.deleteIn,Ye.prototype.get=function(e,t,n,r){for(var o=this.entries,a=0,i=o.length;a<i;a++)if(ge(n,o[a][0]))return o[a][1];return r},Ye.prototype.update=function(e,t,n,r,o,a,i){for(var s=o===b,u=this.entries,c=0,l=u.length;c<l&&!ge(r,u[c][0]);c++);var p=c<l;if(p?u[c][1]===o:s)return this;if(E(i),(s||!p)&&E(a),!s||1!==u.length){if(!p&&!s&&u.length>=wt)return ct(e,u,r,o);var f=e&&e===this.ownerID,h=f?u:C(u);return p?s?c===l-1?h.pop():h[c]=h.pop():h[c]=[r,o]:h.push([r,o]),f?(this.entries=h,this):new Ye(e,h)}},Ge.prototype.get=function(e,t,n,r){void 0===t&&(t=Oe(n));var o=1<<((0===e?t:t>>>e)&y),a=this.bitmap;return 0==(a&o)?r:this.nodes[gt(a&o-1)].get(e+v,t,n,r)},Ge.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=Oe(r));var s=(0===t?n:n>>>t)&y,u=1<<s,c=this.bitmap,l=0!=(c&u);if(!l&&o===b)return this;var p=gt(c&u-1),f=this.nodes,h=l?f[p]:void 0,d=it(h,e,t+v,n,r,o,a,i);if(d===h)return this;if(!l&&d&&f.length>=xt)return pt(e,f,c,s,d);if(l&&!d&&2===f.length&&st(f[1^p]))return f[1^p];if(l&&d&&1===f.length&&st(d))return d;var m=e&&e===this.ownerID,g=l?d?c:c^u:c|u,_=l?d?yt(f,p,d,m):_t(f,p,m):bt(f,p,d,m);return m?(this.bitmap=g,this.nodes=_,this):new Ge(e,g,_)},Ze.prototype.get=function(e,t,n,r){void 0===t&&(t=Oe(n));var o=(0===e?t:t>>>e)&y,a=this.nodes[o];return a?a.get(e+v,t,n,r):r},Ze.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=Oe(r));var s=(0===t?n:n>>>t)&y,u=o===b,c=this.nodes,l=c[s];if(u&&!l)return this;var p=it(l,e,t+v,n,r,o,a,i);if(p===l)return this;var f=this.count;if(l){if(!p&&--f<Et)return lt(e,c,f,s)}else f++;var h=e&&e===this.ownerID,d=yt(c,s,p,h);return h?(this.count=f,this.nodes=d,this):new Ze(e,f,d)},Xe.prototype.get=function(e,t,n,r){for(var o=this.entries,a=0,i=o.length;a<i;a++)if(ge(n,o[a][0]))return o[a][1];return r},Xe.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=Oe(r));var s=o===b;if(n!==this.keyHash)return s?this:(E(i),E(a),ut(this,e,t,n,[r,o]));for(var u=this.entries,c=0,l=u.length;c<l&&!ge(r,u[c][0]);c++);var p=c<l;if(p?u[c][1]===o:s)return this;if(E(i),(s||!p)&&E(a),s&&2===l)return new Qe(e,this.keyHash,u[1^c]);var f=e&&e===this.ownerID,h=f?u:C(u);return p?s?c===l-1?h.pop():h[c]=h.pop():h[c]=[r,o]:h.push([r,o]),f?(this.entries=h,this):new Xe(e,this.keyHash,h)},Qe.prototype.get=function(e,t,n,r){return ge(n,this.entry[0])?this.entry[1]:r},Qe.prototype.update=function(e,t,n,r,o,a,i){var s=o===b,u=ge(r,this.entry[0]);return(u?o===this.entry[1]:s)?this:(E(i),s?void E(a):u?e&&e===this.ownerID?(this.entry[1]=o,this):new Qe(e,this.keyHash,[r,o]):(E(a),ut(this,e,t,Oe(r),[r,o])))},Ye.prototype.iterate=Xe.prototype.iterate=function(e,t){for(var n=this.entries,r=0,o=n.length-1;r<=o;r++)if(!1===e(n[t?o-r:r]))return!1},Ge.prototype.iterate=Ze.prototype.iterate=function(e,t){for(var n=this.nodes,r=0,o=n.length-1;r<=o;r++){var a=n[t?o-r:r];if(a&&!1===a.iterate(e,t))return!1}},Qe.prototype.iterate=function(e,t){return e(this.entry)},t(et,F),et.prototype.next=function(){for(var e=this._type,t=this._stack;t;){var n,r=t.node,o=t.index++;if(r.entry){if(0===o)return tt(e,r.entry)}else if(r.entries){if(o<=(n=r.entries.length-1))return tt(e,r.entries[this._reverse?n-o:o])}else if(o<=(n=r.nodes.length-1)){var a=r.nodes[this._reverse?n-o:o];if(a){if(a.entry)return tt(e,a.entry);t=this._stack=nt(a,t)}continue}t=this._stack=this._stack.__prev}return q()};var wt=g/4,xt=g/2,Et=g/4;function St(e){var t=Mt();if(null==e)return t;if(Ct(e))return e;var n=o(e),r=n.size;return 0===r?t:(Ve(r),r>0&&r<g?Nt(0,r,v,null,new Ot(n.toArray())):t.withMutations((function(e){e.setSize(r),n.forEach((function(t,n){return e.set(n,t)}))})))}function Ct(e){return!(!e||!e[At])}t(St,Se),St.of=function(){return this(arguments)},St.prototype.toString=function(){return this.__toString(\"List [\",\"]\")},St.prototype.get=function(e,t){if((e=k(this,e))>=0&&e<this.size){var n=Bt(this,e+=this._origin);return n&&n.array[e&y]}return t},St.prototype.set=function(e,t){return Rt(this,e,t)},St.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},St.prototype.insert=function(e,t){return this.splice(e,0,t)},St.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=v,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):Mt()},St.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations((function(n){Ft(n,0,t+e.length);for(var r=0;r<e.length;r++)n.set(t+r,e[r])}))},St.prototype.pop=function(){return Ft(this,0,-1)},St.prototype.unshift=function(){var e=arguments;return this.withMutations((function(t){Ft(t,-e.length);for(var n=0;n<e.length;n++)t.set(n,e[n])}))},St.prototype.shift=function(){return Ft(this,1)},St.prototype.merge=function(){return Ut(this,void 0,arguments)},St.prototype.mergeWith=function(t){return Ut(this,t,e.call(arguments,1))},St.prototype.mergeDeep=function(){return Ut(this,ht,arguments)},St.prototype.mergeDeepWith=function(t){var n=e.call(arguments,1);return Ut(this,dt(t),n)},St.prototype.setSize=function(e){return Ft(this,0,e)},St.prototype.slice=function(e,t){var n=this.size;return j(e,t,n)?this:Ft(this,T(e,n),I(t,n))},St.prototype.__iterator=function(e,t){var n=0,r=Pt(this,t);return new F((function(){var t=r();return t===It?q():U(e,n++,t)}))},St.prototype.__iterate=function(e,t){for(var n,r=0,o=Pt(this,t);(n=o())!==It&&!1!==e(n,r++,this););return r},St.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Nt(this._origin,this._capacity,this._level,this._root,this._tail,e,this.__hash):(this.__ownerID=e,this)},St.isList=Ct;var At=\"@@__IMMUTABLE_LIST__@@\",kt=St.prototype;function Ot(e,t){this.array=e,this.ownerID=t}kt[At]=!0,kt[m]=kt.remove,kt.setIn=Ke.setIn,kt.deleteIn=kt.removeIn=Ke.removeIn,kt.update=Ke.update,kt.updateIn=Ke.updateIn,kt.mergeIn=Ke.mergeIn,kt.mergeDeepIn=Ke.mergeDeepIn,kt.withMutations=Ke.withMutations,kt.asMutable=Ke.asMutable,kt.asImmutable=Ke.asImmutable,kt.wasAltered=Ke.wasAltered,Ot.prototype.removeBefore=function(e,t,n){if(n===t?1<<t:0===this.array.length)return this;var r=n>>>t&y;if(r>=this.array.length)return new Ot([],e);var o,a=0===r;if(t>0){var i=this.array[r];if((o=i&&i.removeBefore(e,t-v,n))===i&&a)return this}if(a&&!o)return this;var s=Lt(this,e);if(!a)for(var u=0;u<r;u++)s.array[u]=void 0;return o&&(s.array[r]=o),s},Ot.prototype.removeAfter=function(e,t,n){if(n===(t?1<<t:0)||0===this.array.length)return this;var r,o=n-1>>>t&y;if(o>=this.array.length)return this;if(t>0){var a=this.array[o];if((r=a&&a.removeAfter(e,t-v,n))===a&&o===this.array.length-1)return this}var i=Lt(this,e);return i.array.splice(o+1),r&&(i.array[o]=r),i};var jt,Tt,It={};function Pt(e,t){var n=e._origin,r=e._capacity,o=qt(r),a=e._tail;return i(e._root,e._level,0);function i(e,t,n){return 0===t?s(e,n):u(e,t,n)}function s(e,i){var s=i===o?a&&a.array:e&&e.array,u=i>n?0:n-i,c=r-i;return c>g&&(c=g),function(){if(u===c)return It;var e=t?--c:u++;return s&&s[e]}}function u(e,o,a){var s,u=e&&e.array,c=a>n?0:n-a>>o,l=1+(r-a>>o);return l>g&&(l=g),function(){for(;;){if(s){var e=s();if(e!==It)return e;s=null}if(c===l)return It;var n=t?--l:c++;s=i(u&&u[n],o-v,a+(n<<o))}}}}function Nt(e,t,n,r,o,a,i){var s=Object.create(kt);return s.size=t-e,s._origin=e,s._capacity=t,s._level=n,s._root=r,s._tail=o,s.__ownerID=a,s.__hash=i,s.__altered=!1,s}function Mt(){return jt||(jt=Nt(0,0,v))}function Rt(e,t,n){if((t=k(e,t))!=t)return e;if(t>=e.size||t<0)return e.withMutations((function(e){t<0?Ft(e,t).set(0,n):Ft(e,0,t+1).set(t,n)}));t+=e._origin;var r=e._tail,o=e._root,a=x(w);return t>=qt(e._capacity)?r=Dt(r,e.__ownerID,0,t,n,a):o=Dt(o,e.__ownerID,e._level,t,n,a),a.value?e.__ownerID?(e._root=o,e._tail=r,e.__hash=void 0,e.__altered=!0,e):Nt(e._origin,e._capacity,e._level,o,r):e}function Dt(e,t,n,r,o,a){var i,s=r>>>n&y,u=e&&s<e.array.length;if(!u&&void 0===o)return e;if(n>0){var c=e&&e.array[s],l=Dt(c,t,n-v,r,o,a);return l===c?e:((i=Lt(e,t)).array[s]=l,i)}return u&&e.array[s]===o?e:(E(a),i=Lt(e,t),void 0===o&&s===i.array.length-1?i.array.pop():i.array[s]=o,i)}function Lt(e,t){return t&&e&&t===e.ownerID?e:new Ot(e?e.array.slice():[],t)}function Bt(e,t){if(t>=qt(e._capacity))return e._tail;if(t<1<<e._level+v){for(var n=e._root,r=e._level;n&&r>0;)n=n.array[t>>>r&y],r-=v;return n}}function Ft(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new S,o=e._origin,a=e._capacity,i=o+t,s=void 0===n?a:n<0?a+n:o+n;if(i===o&&s===a)return e;if(i>=s)return e.clear();for(var u=e._level,c=e._root,l=0;i+l<0;)c=new Ot(c&&c.array.length?[void 0,c]:[],r),l+=1<<(u+=v);l&&(i+=l,o+=l,s+=l,a+=l);for(var p=qt(a),f=qt(s);f>=1<<u+v;)c=new Ot(c&&c.array.length?[c]:[],r),u+=v;var h=e._tail,d=f<p?Bt(e,s-1):f>p?new Ot([],r):h;if(h&&f>p&&i<a&&h.array.length){for(var m=c=Lt(c,r),g=u;g>v;g-=v){var b=p>>>g&y;m=m.array[b]=Lt(m.array[b],r)}m.array[p>>>v&y]=h}if(s<a&&(d=d&&d.removeAfter(r,0,s)),i>=f)i-=f,s-=f,u=v,c=null,d=d&&d.removeBefore(r,0,i);else if(i>o||f<p){for(l=0;c;){var _=i>>>u&y;if(_!==f>>>u&y)break;_&&(l+=(1<<u)*_),u-=v,c=c.array[_]}c&&i>o&&(c=c.removeBefore(r,u,i-l)),c&&f<p&&(c=c.removeAfter(r,u,f-l)),l&&(i-=l,s-=l)}return e.__ownerID?(e.size=s-i,e._origin=i,e._capacity=s,e._level=u,e._root=c,e._tail=d,e.__hash=void 0,e.__altered=!0,e):Nt(i,s,u,c,d)}function Ut(e,t,n){for(var r=[],a=0,s=0;s<n.length;s++){var u=n[s],c=o(u);c.size>a&&(a=c.size),i(u)||(c=c.map((function(e){return he(e)}))),r.push(c)}return a>e.size&&(e=e.setSize(a)),mt(e,t,r)}function qt(e){return e<g?0:e-1>>>v<<v}function zt(e){return null==e?Ht():Vt(e)?e:Ht().withMutations((function(t){var n=r(e);Ve(n.size),n.forEach((function(e,n){return t.set(n,e)}))}))}function Vt(e){return He(e)&&l(e)}function Wt(e,t,n,r){var o=Object.create(zt.prototype);return o.size=e?e.size:0,o._map=e,o._list=t,o.__ownerID=n,o.__hash=r,o}function Ht(){return Tt||(Tt=Wt(ot(),Mt()))}function $t(e,t,n){var r,o,a=e._map,i=e._list,s=a.get(t),u=void 0!==s;if(n===b){if(!u)return e;i.size>=g&&i.size>=2*a.size?(r=(o=i.filter((function(e,t){return void 0!==e&&s!==t}))).toKeyedSeq().map((function(e){return e[0]})).flip().toMap(),e.__ownerID&&(r.__ownerID=o.__ownerID=e.__ownerID)):(r=a.remove(t),o=s===i.size-1?i.pop():i.set(s,void 0))}else if(u){if(n===i.get(s)[1])return e;r=a,o=i.set(s,[t,n])}else r=a.set(t,i.size),o=i.set(i.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=o,e.__hash=void 0,e):Wt(r,o)}function Jt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function Kt(e){this._iter=e,this.size=e.size}function Yt(e){this._iter=e,this.size=e.size}function Gt(e){this._iter=e,this.size=e.size}function Zt(e){var t=bn(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=_n,t.__iterateUncached=function(t,n){var r=this;return e.__iterate((function(e,n){return!1!==t(n,e,r)}),n)},t.__iteratorUncached=function(t,n){if(t===R){var r=e.__iterator(t,n);return new F((function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e}))}return e.__iterator(t===M?N:M,n)},t}function Xt(e,t,n){var r=bn(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,o){var a=e.get(r,b);return a===b?o:t.call(n,a,r,e)},r.__iterateUncached=function(r,o){var a=this;return e.__iterate((function(e,o,i){return!1!==r(t.call(n,e,o,i),o,a)}),o)},r.__iteratorUncached=function(r,o){var a=e.__iterator(R,o);return new F((function(){var o=a.next();if(o.done)return o;var i=o.value,s=i[0];return U(r,s,t.call(n,i[1],s,e),o)}))},r}function Qt(e,t){var n=bn(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=Zt(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=_n,n.__iterate=function(t,n){var r=this;return e.__iterate((function(e,n){return t(e,n,r)}),!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function en(e,t,n,r){var o=bn(e);return r&&(o.has=function(r){var o=e.get(r,b);return o!==b&&!!t.call(n,o,r,e)},o.get=function(r,o){var a=e.get(r,b);return a!==b&&t.call(n,a,r,e)?a:o}),o.__iterateUncached=function(o,a){var i=this,s=0;return e.__iterate((function(e,a,u){if(t.call(n,e,a,u))return s++,o(e,r?a:s-1,i)}),a),s},o.__iteratorUncached=function(o,a){var i=e.__iterator(R,a),s=0;return new F((function(){for(;;){var a=i.next();if(a.done)return a;var u=a.value,c=u[0],l=u[1];if(t.call(n,l,c,e))return U(o,r?c:s++,l,a)}}))},o}function tn(e,t,n){var r=We().asMutable();return e.__iterate((function(o,a){r.update(t.call(n,o,a,e),0,(function(e){return e+1}))})),r.asImmutable()}function nn(e,t,n){var r=s(e),o=(l(e)?zt():We()).asMutable();e.__iterate((function(a,i){o.update(t.call(n,a,i,e),(function(e){return(e=e||[]).push(r?[i,a]:a),e}))}));var a=yn(e);return o.map((function(t){return mn(e,a(t))}))}function rn(e,t,n,r){var o=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n===1/0?n=o:n|=0),j(t,n,o))return e;var a=T(t,o),i=I(n,o);if(a!=a||i!=i)return rn(e.toSeq().cacheResult(),t,n,r);var s,u=i-a;u==u&&(s=u<0?0:u);var c=bn(e);return c.size=0===s?s:e.size&&s||void 0,!r&&ae(e)&&s>=0&&(c.get=function(t,n){return(t=k(this,t))>=0&&t<s?e.get(t+a,n):n}),c.__iterateUncached=function(t,n){var o=this;if(0===s)return 0;if(n)return this.cacheResult().__iterate(t,n);var i=0,u=!0,c=0;return e.__iterate((function(e,n){if(!u||!(u=i++<a))return c++,!1!==t(e,r?n:c-1,o)&&c!==s})),c},c.__iteratorUncached=function(t,n){if(0!==s&&n)return this.cacheResult().__iterator(t,n);var o=0!==s&&e.__iterator(t,n),i=0,u=0;return new F((function(){for(;i++<a;)o.next();if(++u>s)return q();var e=o.next();return r||t===M?e:U(t,u-1,t===N?void 0:e.value[1],e)}))},c}function on(e,t,n){var r=bn(e);return r.__iterateUncached=function(r,o){var a=this;if(o)return this.cacheResult().__iterate(r,o);var i=0;return e.__iterate((function(e,o,s){return t.call(n,e,o,s)&&++i&&r(e,o,a)})),i},r.__iteratorUncached=function(r,o){var a=this;if(o)return this.cacheResult().__iterator(r,o);var i=e.__iterator(R,o),s=!0;return new F((function(){if(!s)return q();var e=i.next();if(e.done)return e;var o=e.value,u=o[0],c=o[1];return t.call(n,c,u,a)?r===R?e:U(r,u,c,e):(s=!1,q())}))},r}function an(e,t,n,r){var o=bn(e);return o.__iterateUncached=function(o,a){var i=this;if(a)return this.cacheResult().__iterate(o,a);var s=!0,u=0;return e.__iterate((function(e,a,c){if(!s||!(s=t.call(n,e,a,c)))return u++,o(e,r?a:u-1,i)})),u},o.__iteratorUncached=function(o,a){var i=this;if(a)return this.cacheResult().__iterator(o,a);var s=e.__iterator(R,a),u=!0,c=0;return new F((function(){var e,a,l;do{if((e=s.next()).done)return r||o===M?e:U(o,c++,o===N?void 0:e.value[1],e);var p=e.value;a=p[0],l=p[1],u&&(u=t.call(n,l,a,i))}while(u);return o===R?e:U(o,a,l,e)}))},o}function sn(e,t){var n=s(e),o=[e].concat(t).map((function(e){return i(e)?n&&(e=r(e)):e=n?se(e):ue(Array.isArray(e)?e:[e]),e})).filter((function(e){return 0!==e.size}));if(0===o.length)return e;if(1===o.length){var a=o[0];if(a===e||n&&s(a)||u(e)&&u(a))return a}var c=new te(o);return n?c=c.toKeyedSeq():u(e)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=o.reduce((function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}}),0),c}function un(e,t,n){var r=bn(e);return r.__iterateUncached=function(r,o){var a=0,s=!1;function u(e,c){var l=this;e.__iterate((function(e,o){return(!t||c<t)&&i(e)?u(e,c+1):!1===r(e,n?o:a++,l)&&(s=!0),!s}),o)}return u(e,0),a},r.__iteratorUncached=function(r,o){var a=e.__iterator(r,o),s=[],u=0;return new F((function(){for(;a;){var e=a.next();if(!1===e.done){var c=e.value;if(r===R&&(c=c[1]),t&&!(s.length<t)||!i(c))return n?e:U(r,u++,c,e);s.push(a),a=c.__iterator(r,o)}else a=s.pop()}return q()}))},r}function cn(e,t,n){var r=yn(e);return e.toSeq().map((function(o,a){return r(t.call(n,o,a,e))})).flatten(!0)}function ln(e,t){var n=bn(e);return n.size=e.size&&2*e.size-1,n.__iterateUncached=function(n,r){var o=this,a=0;return e.__iterate((function(e,r){return(!a||!1!==n(t,a++,o))&&!1!==n(e,a++,o)}),r),a},n.__iteratorUncached=function(n,r){var o,a=e.__iterator(M,r),i=0;return new F((function(){return(!o||i%2)&&(o=a.next()).done?o:i%2?U(n,i++,t):U(n,i++,o.value,o)}))},n}function pn(e,t,n){t||(t=wn);var r=s(e),o=0,a=e.toSeq().map((function(t,r){return[r,t,o++,n?n(t,r,e):t]})).toArray();return a.sort((function(e,n){return t(e[3],n[3])||e[2]-n[2]})).forEach(r?function(e,t){a[t].length=2}:function(e,t){a[t]=e[1]}),r?K(a):u(e)?Y(a):G(a)}function fn(e,t,n){if(t||(t=wn),n){var r=e.toSeq().map((function(t,r){return[t,n(t,r,e)]})).reduce((function(e,n){return hn(t,e[1],n[1])?n:e}));return r&&r[0]}return e.reduce((function(e,n){return hn(t,e,n)?n:e}))}function hn(e,t,n){var r=e(n,t);return 0===r&&n!==t&&(null==n||n!=n)||r>0}function dn(e,t,r){var o=bn(e);return o.size=new te(r).map((function(e){return e.size})).min(),o.__iterate=function(e,t){for(var n,r=this.__iterator(M,t),o=0;!(n=r.next()).done&&!1!==e(n.value,o++,this););return o},o.__iteratorUncached=function(e,o){var a=r.map((function(e){return e=n(e),W(o?e.reverse():e)})),i=0,s=!1;return new F((function(){var n;return s||(n=a.map((function(e){return e.next()})),s=n.some((function(e){return e.done}))),s?q():U(e,i++,t.apply(null,n.map((function(e){return e.value}))))}))},o}function mn(e,t){return ae(e)?t:e.constructor(t)}function vn(e){if(e!==Object(e))throw new TypeError(\"Expected [K, V] tuple: \"+e)}function gn(e){return Ve(e.size),A(e)}function yn(e){return s(e)?r:u(e)?o:a}function bn(e){return Object.create((s(e)?K:u(e)?Y:G).prototype)}function _n(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function wn(e,t){return e>t?1:e<t?-1:0}function xn(e){var t=W(e);if(!t){if(!$(e))throw new TypeError(\"Expected iterable or array-like: \"+e);t=W(n(e))}return t}function En(e,t){var n,r=function(a){if(a instanceof r)return a;if(!(this instanceof r))return new r(a);if(!n){n=!0;var i=Object.keys(e);kn(o,i),o.size=i.length,o._name=t,o._keys=i,o._defaultValues=e}this._map=We(a)},o=r.prototype=Object.create(Sn);return o.constructor=r,r}t(zt,We),zt.of=function(){return this(arguments)},zt.prototype.toString=function(){return this.__toString(\"OrderedMap {\",\"}\")},zt.prototype.get=function(e,t){var n=this._map.get(e);return void 0!==n?this._list.get(n)[1]:t},zt.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):Ht()},zt.prototype.set=function(e,t){return $t(this,e,t)},zt.prototype.remove=function(e){return $t(this,e,b)},zt.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},zt.prototype.__iterate=function(e,t){var n=this;return this._list.__iterate((function(t){return t&&e(t[1],t[0],n)}),t)},zt.prototype.__iterator=function(e,t){return this._list.fromEntrySeq().__iterator(e,t)},zt.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e),n=this._list.__ensureOwner(e);return e?Wt(t,n,e,this.__hash):(this.__ownerID=e,this._map=t,this._list=n,this)},zt.isOrderedMap=Vt,zt.prototype[d]=!0,zt.prototype[m]=zt.prototype.remove,t(Jt,K),Jt.prototype.get=function(e,t){return this._iter.get(e,t)},Jt.prototype.has=function(e){return this._iter.has(e)},Jt.prototype.valueSeq=function(){return this._iter.valueSeq()},Jt.prototype.reverse=function(){var e=this,t=Qt(this,!0);return this._useKeys||(t.valueSeq=function(){return e._iter.toSeq().reverse()}),t},Jt.prototype.map=function(e,t){var n=this,r=Xt(this,e,t);return this._useKeys||(r.valueSeq=function(){return n._iter.toSeq().map(e,t)}),r},Jt.prototype.__iterate=function(e,t){var n,r=this;return this._iter.__iterate(this._useKeys?function(t,n){return e(t,n,r)}:(n=t?gn(this):0,function(o){return e(o,t?--n:n++,r)}),t)},Jt.prototype.__iterator=function(e,t){if(this._useKeys)return this._iter.__iterator(e,t);var n=this._iter.__iterator(M,t),r=t?gn(this):0;return new F((function(){var o=n.next();return o.done?o:U(e,t?--r:r++,o.value,o)}))},Jt.prototype[d]=!0,t(Kt,Y),Kt.prototype.includes=function(e){return this._iter.includes(e)},Kt.prototype.__iterate=function(e,t){var n=this,r=0;return this._iter.__iterate((function(t){return e(t,r++,n)}),t)},Kt.prototype.__iterator=function(e,t){var n=this._iter.__iterator(M,t),r=0;return new F((function(){var t=n.next();return t.done?t:U(e,r++,t.value,t)}))},t(Yt,G),Yt.prototype.has=function(e){return this._iter.includes(e)},Yt.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate((function(t){return e(t,t,n)}),t)},Yt.prototype.__iterator=function(e,t){var n=this._iter.__iterator(M,t);return new F((function(){var t=n.next();return t.done?t:U(e,t.value,t.value,t)}))},t(Gt,K),Gt.prototype.entrySeq=function(){return this._iter.toSeq()},Gt.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate((function(t){if(t){vn(t);var r=i(t);return e(r?t.get(1):t[1],r?t.get(0):t[0],n)}}),t)},Gt.prototype.__iterator=function(e,t){var n=this._iter.__iterator(M,t);return new F((function(){for(;;){var t=n.next();if(t.done)return t;var r=t.value;if(r){vn(r);var o=i(r);return U(e,o?r.get(0):r[0],o?r.get(1):r[1],t)}}}))},Kt.prototype.cacheResult=Jt.prototype.cacheResult=Yt.prototype.cacheResult=Gt.prototype.cacheResult=_n,t(En,Ee),En.prototype.toString=function(){return this.__toString(An(this)+\" {\",\"}\")},En.prototype.has=function(e){return this._defaultValues.hasOwnProperty(e)},En.prototype.get=function(e,t){if(!this.has(e))return t;var n=this._defaultValues[e];return this._map?this._map.get(e,n):n},En.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var e=this.constructor;return e._empty||(e._empty=Cn(this,ot()))},En.prototype.set=function(e,t){if(!this.has(e))throw new Error('Cannot set unknown key \"'+e+'\" on '+An(this));if(this._map&&!this._map.has(e)&&t===this._defaultValues[e])return this;var n=this._map&&this._map.set(e,t);return this.__ownerID||n===this._map?this:Cn(this,n)},En.prototype.remove=function(e){if(!this.has(e))return this;var t=this._map&&this._map.remove(e);return this.__ownerID||t===this._map?this:Cn(this,t)},En.prototype.wasAltered=function(){return this._map.wasAltered()},En.prototype.__iterator=function(e,t){var n=this;return r(this._defaultValues).map((function(e,t){return n.get(t)})).__iterator(e,t)},En.prototype.__iterate=function(e,t){var n=this;return r(this._defaultValues).map((function(e,t){return n.get(t)})).__iterate(e,t)},En.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map&&this._map.__ensureOwner(e);return e?Cn(this,t,e):(this.__ownerID=e,this._map=t,this)};var Sn=En.prototype;function Cn(e,t,n){var r=Object.create(Object.getPrototypeOf(e));return r._map=t,r.__ownerID=n,r}function An(e){return e._name||e.constructor.name||\"Record\"}function kn(e,t){try{t.forEach(On.bind(void 0,e))}catch(e){}}function On(e,t){Object.defineProperty(e,t,{get:function(){return this.get(t)},set:function(e){_e(this.__ownerID,\"Cannot set on an immutable record.\"),this.set(t,e)}})}function jn(e){return null==e?Dn():Tn(e)&&!l(e)?e:Dn().withMutations((function(t){var n=a(e);Ve(n.size),n.forEach((function(e){return t.add(e)}))}))}function Tn(e){return!(!e||!e[Pn])}Sn[m]=Sn.remove,Sn.deleteIn=Sn.removeIn=Ke.removeIn,Sn.merge=Ke.merge,Sn.mergeWith=Ke.mergeWith,Sn.mergeIn=Ke.mergeIn,Sn.mergeDeep=Ke.mergeDeep,Sn.mergeDeepWith=Ke.mergeDeepWith,Sn.mergeDeepIn=Ke.mergeDeepIn,Sn.setIn=Ke.setIn,Sn.update=Ke.update,Sn.updateIn=Ke.updateIn,Sn.withMutations=Ke.withMutations,Sn.asMutable=Ke.asMutable,Sn.asImmutable=Ke.asImmutable,t(jn,Ce),jn.of=function(){return this(arguments)},jn.fromKeys=function(e){return this(r(e).keySeq())},jn.prototype.toString=function(){return this.__toString(\"Set {\",\"}\")},jn.prototype.has=function(e){return this._map.has(e)},jn.prototype.add=function(e){return Mn(this,this._map.set(e,!0))},jn.prototype.remove=function(e){return Mn(this,this._map.remove(e))},jn.prototype.clear=function(){return Mn(this,this._map.clear())},jn.prototype.union=function(){var t=e.call(arguments,0);return 0===(t=t.filter((function(e){return 0!==e.size}))).length?this:0!==this.size||this.__ownerID||1!==t.length?this.withMutations((function(e){for(var n=0;n<t.length;n++)a(t[n]).forEach((function(t){return e.add(t)}))})):this.constructor(t[0])},jn.prototype.intersect=function(){var t=e.call(arguments,0);if(0===t.length)return this;t=t.map((function(e){return a(e)}));var n=this;return this.withMutations((function(e){n.forEach((function(n){t.every((function(e){return e.includes(n)}))||e.remove(n)}))}))},jn.prototype.subtract=function(){var t=e.call(arguments,0);if(0===t.length)return this;t=t.map((function(e){return a(e)}));var n=this;return this.withMutations((function(e){n.forEach((function(n){t.some((function(e){return e.includes(n)}))&&e.remove(n)}))}))},jn.prototype.merge=function(){return this.union.apply(this,arguments)},jn.prototype.mergeWith=function(t){var n=e.call(arguments,1);return this.union.apply(this,n)},jn.prototype.sort=function(e){return Ln(pn(this,e))},jn.prototype.sortBy=function(e,t){return Ln(pn(this,t,e))},jn.prototype.wasAltered=function(){return this._map.wasAltered()},jn.prototype.__iterate=function(e,t){var n=this;return this._map.__iterate((function(t,r){return e(r,r,n)}),t)},jn.prototype.__iterator=function(e,t){return this._map.map((function(e,t){return t})).__iterator(e,t)},jn.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e);return e?this.__make(t,e):(this.__ownerID=e,this._map=t,this)},jn.isSet=Tn;var In,Pn=\"@@__IMMUTABLE_SET__@@\",Nn=jn.prototype;function Mn(e,t){return e.__ownerID?(e.size=t.size,e._map=t,e):t===e._map?e:0===t.size?e.__empty():e.__make(t)}function Rn(e,t){var n=Object.create(Nn);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function Dn(){return In||(In=Rn(ot()))}function Ln(e){return null==e?zn():Bn(e)?e:zn().withMutations((function(t){var n=a(e);Ve(n.size),n.forEach((function(e){return t.add(e)}))}))}function Bn(e){return Tn(e)&&l(e)}Nn[Pn]=!0,Nn[m]=Nn.remove,Nn.mergeDeep=Nn.merge,Nn.mergeDeepWith=Nn.mergeWith,Nn.withMutations=Ke.withMutations,Nn.asMutable=Ke.asMutable,Nn.asImmutable=Ke.asImmutable,Nn.__empty=Dn,Nn.__make=Rn,t(Ln,jn),Ln.of=function(){return this(arguments)},Ln.fromKeys=function(e){return this(r(e).keySeq())},Ln.prototype.toString=function(){return this.__toString(\"OrderedSet {\",\"}\")},Ln.isOrderedSet=Bn;var Fn,Un=Ln.prototype;function qn(e,t){var n=Object.create(Un);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function zn(){return Fn||(Fn=qn(Ht()))}function Vn(e){return null==e?Yn():Wn(e)?e:Yn().unshiftAll(e)}function Wn(e){return!(!e||!e[$n])}Un[d]=!0,Un.__empty=zn,Un.__make=qn,t(Vn,Se),Vn.of=function(){return this(arguments)},Vn.prototype.toString=function(){return this.__toString(\"Stack [\",\"]\")},Vn.prototype.get=function(e,t){var n=this._head;for(e=k(this,e);n&&e--;)n=n.next;return n?n.value:t},Vn.prototype.peek=function(){return this._head&&this._head.value},Vn.prototype.push=function(){if(0===arguments.length)return this;for(var e=this.size+arguments.length,t=this._head,n=arguments.length-1;n>=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):Kn(e,t)},Vn.prototype.pushAll=function(e){if(0===(e=o(e)).size)return this;Ve(e.size);var t=this.size,n=this._head;return e.reverse().forEach((function(e){t++,n={value:e,next:n}})),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):Kn(t,n)},Vn.prototype.pop=function(){return this.slice(1)},Vn.prototype.unshift=function(){return this.push.apply(this,arguments)},Vn.prototype.unshiftAll=function(e){return this.pushAll(e)},Vn.prototype.shift=function(){return this.pop.apply(this,arguments)},Vn.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Yn()},Vn.prototype.slice=function(e,t){if(j(e,t,this.size))return this;var n=T(e,this.size);if(I(t,this.size)!==this.size)return Se.prototype.slice.call(this,e,t);for(var r=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=r,this._head=o,this.__hash=void 0,this.__altered=!0,this):Kn(r,o)},Vn.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Kn(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Vn.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&!1!==e(r.value,n++,this);)r=r.next;return n},Vn.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new F((function(){if(r){var t=r.value;return r=r.next,U(e,n++,t)}return q()}))},Vn.isStack=Wn;var Hn,$n=\"@@__IMMUTABLE_STACK__@@\",Jn=Vn.prototype;function Kn(e,t,n,r){var o=Object.create(Jn);return o.size=e,o._head=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Yn(){return Hn||(Hn=Kn(0))}function Gn(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}Jn[$n]=!0,Jn.withMutations=Ke.withMutations,Jn.asMutable=Ke.asMutable,Jn.asImmutable=Ke.asImmutable,Jn.wasAltered=Ke.wasAltered,n.Iterator=F,Gn(n,{toArray:function(){Ve(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate((function(t,n){e[n]=t})),e},toIndexedSeq:function(){return new Kt(this)},toJS:function(){return this.toSeq().map((function(e){return e&&\"function\"==typeof e.toJS?e.toJS():e})).__toJS()},toJSON:function(){return this.toSeq().map((function(e){return e&&\"function\"==typeof e.toJSON?e.toJSON():e})).__toJS()},toKeyedSeq:function(){return new Jt(this,!0)},toMap:function(){return We(this.toKeyedSeq())},toObject:function(){Ve(this.size);var e={};return this.__iterate((function(t,n){e[n]=t})),e},toOrderedMap:function(){return zt(this.toKeyedSeq())},toOrderedSet:function(){return Ln(s(this)?this.valueSeq():this)},toSet:function(){return jn(s(this)?this.valueSeq():this)},toSetSeq:function(){return new Yt(this)},toSeq:function(){return u(this)?this.toIndexedSeq():s(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Vn(s(this)?this.valueSeq():this)},toList:function(){return St(s(this)?this.valueSeq():this)},toString:function(){return\"[Iterable]\"},__toString:function(e,t){return 0===this.size?e+t:e+\" \"+this.toSeq().map(this.__toStringMapper).join(\", \")+\" \"+t},concat:function(){return mn(this,sn(this,e.call(arguments,0)))},includes:function(e){return this.some((function(t){return ge(t,e)}))},entries:function(){return this.__iterator(R)},every:function(e,t){Ve(this.size);var n=!0;return this.__iterate((function(r,o,a){if(!e.call(t,r,o,a))return n=!1,!1})),n},filter:function(e,t){return mn(this,en(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},forEach:function(e,t){return Ve(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){Ve(this.size),e=void 0!==e?\"\"+e:\",\";var t=\"\",n=!0;return this.__iterate((function(r){n?n=!1:t+=e,t+=null!=r?r.toString():\"\"})),t},keys:function(){return this.__iterator(N)},map:function(e,t){return mn(this,Xt(this,e,t))},reduce:function(e,t,n){var r,o;return Ve(this.size),arguments.length<2?o=!0:r=t,this.__iterate((function(t,a,i){o?(o=!1,r=t):r=e.call(n,r,t,a,i)})),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return mn(this,Qt(this,!0))},slice:function(e,t){return mn(this,rn(this,e,t,!0))},some:function(e,t){return!this.every(tr(e),t)},sort:function(e){return mn(this,pn(this,e))},values:function(){return this.__iterator(M)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(e,t){return A(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return tn(this,e,t)},equals:function(e){return ye(this,e)},entrySeq:function(){var e=this;if(e._cache)return new te(e._cache);var t=e.toSeq().map(er).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(tr(e),t)},findEntry:function(e,t,n){var r=n;return this.__iterate((function(n,o,a){if(e.call(t,n,o,a))return r=[o,n],!1})),r},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(O)},flatMap:function(e,t){return mn(this,cn(this,e,t))},flatten:function(e){return mn(this,un(this,e,!0))},fromEntrySeq:function(){return new Gt(this)},get:function(e,t){return this.find((function(t,n){return ge(n,e)}),void 0,t)},getIn:function(e,t){for(var n,r=this,o=xn(e);!(n=o.next()).done;){var a=n.value;if((r=r&&r.get?r.get(a,b):b)===b)return t}return r},groupBy:function(e,t){return nn(this,e,t)},has:function(e){return this.get(e,b)!==b},hasIn:function(e){return this.getIn(e,b)!==b},isSubset:function(e){return e=\"function\"==typeof e.includes?e:n(e),this.every((function(t){return e.includes(t)}))},isSuperset:function(e){return(e=\"function\"==typeof e.isSubset?e:n(e)).isSubset(this)},keyOf:function(e){return this.findKey((function(t){return ge(t,e)}))},keySeq:function(){return this.toSeq().map(Qn).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return fn(this,e)},maxBy:function(e,t){return fn(this,t,e)},min:function(e){return fn(this,e?nr(e):ar)},minBy:function(e,t){return fn(this,t?nr(t):ar,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return mn(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return mn(this,an(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(tr(e),t)},sortBy:function(e,t){return mn(this,pn(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return mn(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return mn(this,on(this,e,t))},takeUntil:function(e,t){return this.takeWhile(tr(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=ir(this))}});var Zn=n.prototype;Zn[p]=!0,Zn[B]=Zn.values,Zn.__toJS=Zn.toArray,Zn.__toStringMapper=rr,Zn.inspect=Zn.toSource=function(){return this.toString()},Zn.chain=Zn.flatMap,Zn.contains=Zn.includes,Gn(r,{flip:function(){return mn(this,Zt(this))},mapEntries:function(e,t){var n=this,r=0;return mn(this,this.toSeq().map((function(o,a){return e.call(t,[a,o],r++,n)})).fromEntrySeq())},mapKeys:function(e,t){var n=this;return mn(this,this.toSeq().flip().map((function(r,o){return e.call(t,r,o,n)})).flip())}});var Xn=r.prototype;function Qn(e,t){return t}function er(e,t){return[t,e]}function tr(e){return function(){return!e.apply(this,arguments)}}function nr(e){return function(){return-e.apply(this,arguments)}}function rr(e){return\"string\"==typeof e?JSON.stringify(e):String(e)}function or(){return C(arguments)}function ar(e,t){return e<t?1:e>t?-1:0}function ir(e){if(e.size===1/0)return 0;var t=l(e),n=s(e),r=t?1:0;return sr(e.__iterate(n?t?function(e,t){r=31*r+ur(Oe(e),Oe(t))|0}:function(e,t){r=r+ur(Oe(e),Oe(t))|0}:t?function(e){r=31*r+Oe(e)|0}:function(e){r=r+Oe(e)|0}),r)}function sr(e,t){return t=Ae(t,3432918353),t=Ae(t<<15|t>>>-15,461845907),t=Ae(t<<13|t>>>-13,5),t=Ae((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=ke((t=Ae(t^t>>>13,3266489909))^t>>>16)}function ur(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}return Xn[f]=!0,Xn[B]=Zn.entries,Xn.__toJS=Zn.toObject,Xn.__toStringMapper=function(e,t){return JSON.stringify(t)+\": \"+rr(e)},Gn(o,{toKeyedSeq:function(){return new Jt(this,!1)},filter:function(e,t){return mn(this,en(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return mn(this,Qt(this,!1))},slice:function(e,t){return mn(this,rn(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=T(e,e<0?this.count():this.size);var r=this.slice(0,e);return mn(this,1===n?r:r.concat(C(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(e){return mn(this,un(this,e,!1))},get:function(e,t){return(e=k(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find((function(t,n){return n===e}),void 0,t)},has:function(e){return(e=k(this,e))>=0&&(void 0!==this.size?this.size===1/0||e<this.size:-1!==this.indexOf(e))},interpose:function(e){return mn(this,ln(this,e))},interleave:function(){var e=[this].concat(C(arguments)),t=dn(this.toSeq(),Y.of,e),n=t.flatten(!0);return t.size&&(n.size=t.size*e.length),mn(this,n)},keySeq:function(){return we(0,this.size)},last:function(){return this.get(-1)},skipWhile:function(e,t){return mn(this,an(this,e,t,!1))},zip:function(){return mn(this,dn(this,or,[this].concat(C(arguments))))},zipWith:function(e){var t=C(arguments);return t[0]=this,mn(this,dn(this,e,t))}}),o.prototype[h]=!0,o.prototype[d]=!0,Gn(a,{get:function(e,t){return this.has(e)?e:t},includes:function(e){return this.has(e)},keySeq:function(){return this.valueSeq()}}),a.prototype.has=Zn.includes,a.prototype.contains=a.prototype.includes,Gn(K,r.prototype),Gn(Y,o.prototype),Gn(G,a.prototype),Gn(Ee,r.prototype),Gn(Se,o.prototype),Gn(Ce,a.prototype),{Iterable:n,Seq:J,Collection:xe,Map:We,OrderedMap:zt,List:St,Stack:Vn,Set:jn,OrderedSet:Ln,Record:En,Range:we,Repeat:be,is:ge,fromJS:he}}()},function(e,t,n){e.exports=n(577)},function(e,t,n){var r=n(240);e.exports=function(e,t,n){return t in e?r(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(608)},function(e,t,n){\"use strict\";(function(e){n.d(t,\"z\",(function(){return ye})),n.d(t,\"i\",(function(){return be})),n.d(t,\"v\",(function(){return _e})),n.d(t,\"r\",(function(){return we})),n.d(t,\"t\",(function(){return xe})),n.d(t,\"s\",(function(){return Ee})),n.d(t,\"p\",(function(){return Se})),n.d(t,\"u\",(function(){return Ce})),n.d(t,\"x\",(function(){return Ae})),n.d(t,\"y\",(function(){return ke})),n.d(t,\"J\",(function(){return Oe})),n.d(t,\"f\",(function(){return je})),n.d(t,\"n\",(function(){return Te})),n.d(t,\"h\",(function(){return Ie})),n.d(t,\"D\",(function(){return Pe})),n.d(t,\"K\",(function(){return Me})),n.d(t,\"o\",(function(){return Ue})),n.d(t,\"C\",(function(){return qe})),n.d(t,\"a\",(function(){return ze})),n.d(t,\"H\",(function(){return Ve})),n.d(t,\"b\",(function(){return We})),n.d(t,\"G\",(function(){return He})),n.d(t,\"F\",(function(){return $e})),n.d(t,\"E\",(function(){return Je})),n.d(t,\"k\",(function(){return Ke})),n.d(t,\"d\",(function(){return Ye})),n.d(t,\"g\",(function(){return Ge})),n.d(t,\"m\",(function(){return Ze})),n.d(t,\"l\",(function(){return Xe})),n.d(t,\"e\",(function(){return Qe})),n.d(t,\"I\",(function(){return et})),n.d(t,\"w\",(function(){return tt})),n.d(t,\"A\",(function(){return nt})),n.d(t,\"B\",(function(){return rt})),n.d(t,\"j\",(function(){return ot})),n.d(t,\"c\",(function(){return at})),n.d(t,\"q\",(function(){return st}));var r=n(14),o=n.n(r),a=(n(13),n(18)),i=n.n(a),s=n(49),u=n.n(s),c=n(22),l=n.n(c),p=n(4),f=n.n(p),h=n(82),d=n.n(h),m=n(2),v=n.n(m),g=n(23),y=n.n(g),b=n(12),_=n.n(b),w=n(15),x=n.n(w),E=(n(36),n(29)),S=n.n(E),C=n(20),A=n.n(C),k=n(208),O=n.n(k),j=n(19),T=n.n(j),I=n(75),P=n.n(I),N=(n(31),n(32)),M=n.n(N),R=n(17),D=n.n(R),L=n(64),B=n.n(L),F=n(172),U=n.n(F),q=n(101),z=n.n(q),V=n(1),W=n.n(V),H=n(511),$=n(512),J=n.n($),K=n(284),Y=n.n(K),G=n(285),Z=n.n(G),X=n(209),Q=n.n(X),ee=n(346),te=n.n(ee),ne=n(123),re=n.n(ne),oe=n(124),ae=n.n(oe),ie=n(146),se=n(26),ue=n(514),ce=n.n(ue),le=n(149),pe=n(515),fe=n.n(pe),he=n(516),de=n.n(he),me=n(74),ve=\"default\",ge=function(e){return W.a.Iterable.isIterable(e)};function ye(e){return xe(e)?ge(e)?e.toJS():e:{}}function be(e){var t,n;if(ge(e))return e;if(e instanceof se.a.File)return e;if(!xe(e))return e;if(l()(e))return f()(n=W.a.Seq(e)).call(n,be).toList();if(ae()(d()(e))){var r,o=function(e){if(!ae()(d()(e)))return e;var t,n={},r=\"_**[]\",o={},a=u()(d()(e).call(e));try{for(a.s();!(t=a.n()).done;){var i=t.value;if(n[i[0]]||o[i[0]]&&o[i[0]].containsMultiple){var s,c,l,p;if(!o[i[0]])o[i[0]]={containsMultiple:!0,length:1},n[v()(l=v()(p=\"\".concat(i[0])).call(p,r)).call(l,o[i[0]].length)]=n[i[0]],delete n[i[0]];o[i[0]].length+=1,n[v()(s=v()(c=\"\".concat(i[0])).call(c,r)).call(s,o[i[0]].length)]=i[1]}else n[i[0]]=i[1]}}catch(e){a.e(e)}finally{a.f()}return n}(e);return f()(r=W.a.OrderedMap(o)).call(r,be)}return f()(t=W.a.OrderedMap(e)).call(t,be)}function _e(e){return l()(e)?e:[e]}function we(e){return\"function\"==typeof e}function xe(e){return!!e&&\"object\"===i()(e)}function Ee(e){return\"function\"==typeof e}function Se(e){return l()(e)}var Ce=Z.a;function Ae(e,t){var n;return S()(n=x()(e)).call(n,(function(n,r){return n[r]=t(e[r],r),n}),{})}function ke(e,t){var n;return S()(n=x()(e)).call(n,(function(n,r){var o=t(e[r],r);return o&&\"object\"===i()(o)&&A()(n,o),n}),{})}function Oe(e){return function(t){t.dispatch,t.getState;return function(t){return function(n){return\"function\"==typeof n?n(e()):t(n)}}}}function je(e){var t,n=e.keySeq();return n.contains(ve)?ve:O()(t=_()(n).call(n,(function(e){return\"2\"===(e+\"\")[0]}))).call(t).first()}function Te(e,t){if(!W.a.Iterable.isIterable(e))return W.a.List();var n=e.getIn(l()(t)?t:[t]);return W.a.List.isList(n)?n:W.a.List()}function Ie(e){var t,n=[/filename\\*=[^']+'\\w*'\"([^\"]+)\";?/i,/filename\\*=[^']+'\\w*'([^;]+);?/i,/filename=\"([^;]*);?\"/i,/filename=([^;]*);?/i];if(P()(n).call(n,(function(n){return null!==(t=n.exec(e))})),null!==t&&t.length>1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function Pe(e){return t=e.replace(/\\.[^./]*$/,\"\"),Y()(J()(t));var t}function Ne(e,t,n,r,a){if(!t)return[];var s=[],u=t.get(\"nullable\"),c=t.get(\"required\"),p=t.get(\"maximum\"),h=t.get(\"minimum\"),d=t.get(\"type\"),m=t.get(\"format\"),g=t.get(\"maxLength\"),b=t.get(\"minLength\"),w=t.get(\"uniqueItems\"),x=t.get(\"maxItems\"),E=t.get(\"minItems\"),S=t.get(\"pattern\"),C=n||!0===c,A=null!=e;if(u&&null===e||!d||!(C||A&&\"array\"===d||!(!C&&!A)))return[];var k=\"string\"===d&&e,O=\"array\"===d&&l()(e)&&e.length,j=\"array\"===d&&W.a.List.isList(e)&&e.count(),T=[k,O,j,\"array\"===d&&\"string\"==typeof e&&e,\"file\"===d&&e instanceof se.a.File,\"boolean\"===d&&(e||!1===e),\"number\"===d&&(e||0===e),\"integer\"===d&&(e||0===e),\"object\"===d&&\"object\"===i()(e)&&null!==e,\"object\"===d&&\"string\"==typeof e&&e],I=P()(T).call(T,(function(e){return!!e}));if(C&&!I&&!r)return s.push(\"Required field is not provided\"),s;if(\"object\"===d&&(null===a||\"application/json\"===a)){var N,M=e;if(\"string\"==typeof e)try{M=JSON.parse(e)}catch(e){return s.push(\"Parameter string value must be valid JSON\"),s}if(t&&t.has(\"required\")&&Ee(c.isList)&&c.isList()&&y()(c).call(c,(function(e){void 0===M[e]&&s.push({propKey:e,error:\"Required property not found\"})})),t&&t.has(\"properties\"))y()(N=t.get(\"properties\")).call(N,(function(e,t){var n=Ne(M[t],e,!1,r,a);s.push.apply(s,o()(f()(n).call(n,(function(e){return{propKey:t,error:e}}))))}))}if(S){var R=function(e,t){if(!new RegExp(t).test(e))return\"Value must follow pattern \"+t}(e,S);R&&s.push(R)}if(E&&\"array\"===d){var D=function(e,t){var n;if(!e&&t>=1||e&&e.length<t)return v()(n=\"Array must contain at least \".concat(t,\" item\")).call(n,1===t?\"\":\"s\")}(e,E);D&&s.push(D)}if(x&&\"array\"===d){var L=function(e,t){var n;if(e&&e.length>t)return v()(n=\"Array must not contain more then \".concat(t,\" item\")).call(n,1===t?\"\":\"s\")}(e,x);L&&s.push({needRemove:!0,error:L})}if(w&&\"array\"===d){var B=function(e,t){if(e&&(\"true\"===t||!0===t)){var n=Object(V.fromJS)(e),r=n.toSet();if(e.length>r.size){var o=Object(V.Set)();if(y()(n).call(n,(function(e,t){_()(n).call(n,(function(t){return Ee(t.equals)?t.equals(e):t===e})).size>1&&(o=o.add(t))})),0!==o.size)return f()(o).call(o,(function(e){return{index:e,error:\"No duplicates allowed.\"}})).toArray()}}}(e,w);B&&s.push.apply(s,o()(B))}if(g||0===g){var F=function(e,t){var n;if(e.length>t)return v()(n=\"Value must be no longer than \".concat(t,\" character\")).call(n,1!==t?\"s\":\"\")}(e,g);F&&s.push(F)}if(b){var U=function(e,t){var n;if(e.length<t)return v()(n=\"Value must be at least \".concat(t,\" character\")).call(n,1!==t?\"s\":\"\")}(e,b);U&&s.push(U)}if(p||0===p){var q=function(e,t){if(e>t)return\"Value must be less than \".concat(t)}(e,p);q&&s.push(q)}if(h||0===h){var z=function(e,t){if(e<t)return\"Value must be greater than \".concat(t)}(e,h);z&&s.push(z)}if(\"string\"===d){var H;if(!(H=\"date-time\"===m?function(e){if(isNaN(Date.parse(e)))return\"Value must be a DateTime\"}(e):\"uuid\"===m?function(e){if(e=e.toString().toLowerCase(),!/^[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[)}]?$/.test(e))return\"Value must be a Guid\"}(e):function(e){if(e&&\"string\"!=typeof e)return\"Value must be a string\"}(e)))return s;s.push(H)}else if(\"boolean\"===d){var $=function(e){if(\"true\"!==e&&\"false\"!==e&&!0!==e&&!1!==e)return\"Value must be a boolean\"}(e);if(!$)return s;s.push($)}else if(\"number\"===d){var J=function(e){if(!/^-?\\d+(\\.?\\d+)?$/.test(e))return\"Value must be a number\"}(e);if(!J)return s;s.push(J)}else if(\"integer\"===d){var K=function(e){if(!/^-?\\d+$/.test(e))return\"Value must be an integer\"}(e);if(!K)return s;s.push(K)}else if(\"array\"===d){if(!O&&!j)return s;e&&y()(e).call(e,(function(e,n){var i=Ne(e,t.get(\"items\"),!1,r,a);s.push.apply(s,o()(f()(i).call(i,(function(e){return{index:n,error:e}}))))}))}else if(\"file\"===d){var Y=function(e){if(e&&!(e instanceof se.a.File))return\"Value must be a file\"}(e);if(!Y)return s;s.push(Y)}return s}var Me=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,o=void 0!==r&&r,a=n.bypassRequiredCheck,i=void 0!==a&&a,s=e.get(\"required\"),u=Object(le.a)(e,{isOAS3:o}),c=u.schema,l=u.parameterContentMediaType;return Ne(t,c,s,i,l)},Re=function(e,t,n){if(e&&(!e.xml||!e.xml.name)){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n\\x3c!-- XML example cannot be generated; root element name is undefined --\\x3e':null;var r=e.$$ref.match(/\\S*\\/(\\S+)$/);e.xml.name=r[1]}return Object(ie.memoizedCreateXMLExample)(e,t,n)},De=[{when:/json/,shouldStringifyTypes:[\"string\"]}],Le=[\"object\"],Be=function(e,t,n,r){var a=Object(ie.memoizedSampleFromSchema)(e,t,r),s=i()(a),u=S()(De).call(De,(function(e,t){var r;return t.when.test(n)?v()(r=[]).call(r,o()(e),o()(t.shouldStringifyTypes)):e}),Le);return te()(u,(function(e){return e===s}))?M()(a,null,2):a},Fe=function(e,t,n,r){var o,a=Be(e,t,n,r);try{\"\\n\"===(o=me.a.dump(me.a.load(a),{lineWidth:-1}))[o.length-1]&&(o=T()(o).call(o,0,o.length-1))}catch(e){return console.error(e),\"error: could not generate yaml example\"}return o.replace(/\\t/g,\"  \")},Ue=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return e&&Ee(e.toJS)&&(e=e.toJS()),r&&Ee(r.toJS)&&(r=r.toJS()),/xml/.test(t)?Re(e,n,r):/(yaml|yml)/.test(t)?Fe(e,n,t,r):Be(e,n,t,r)},qe=function(){var e={},t=se.a.location.search;if(!t)return{};if(\"\"!=t){var n=t.substr(1).split(\"&\");for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(r=n[r].split(\"=\"),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||\"\")}return e},ze=function(t){return(t instanceof e?t:e.from(t.toString(),\"utf-8\")).toString(\"base64\")},Ve={operationsSorter:{alpha:function(e,t){return e.get(\"path\").localeCompare(t.get(\"path\"))},method:function(e,t){return e.get(\"method\").localeCompare(t.get(\"method\"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},We=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&\"\"!==r&&t.push([n,\"=\",encodeURIComponent(r).replace(/%20/g,\"+\")].join(\"\"))}return t.join(\"&\")},He=function(e,t,n){return!!Q()(n,(function(n){return re()(e[n],t[n])}))};function $e(e){return\"string\"!=typeof e||\"\"===e?\"\":Object(H.sanitizeUrl)(e)}function Je(e){return!(!e||D()(e).call(e,\"localhost\")>=0||D()(e).call(e,\"127.0.0.1\")>=0||\"none\"===e)}function Ke(e){if(!W.a.OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=B()(e).call(e,(function(e,t){return U()(t).call(t,\"2\")&&x()(e.get(\"content\")||{}).length>0})),n=e.get(\"default\")||W.a.OrderedMap(),r=(n.get(\"content\")||W.a.OrderedMap()).keySeq().toJS().length?n:null;return t||r}var Ye=function(e){return\"string\"==typeof e||e instanceof String?z()(e).call(e).replace(/\\s/g,\"%20\"):\"\"},Ge=function(e){return ce()(Ye(e).replace(/%20/g,\"_\"))},Ze=function(e){return _()(e).call(e,(function(e,t){return/^x-/.test(t)}))},Xe=function(e){return _()(e).call(e,(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)}))};function Qe(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if(\"object\"!==i()(e)||l()(e)||null===e||!t)return e;var o=A()({},e);return y()(n=x()(o)).call(n,(function(e){e===t&&r(o[e],e)?delete o[e]:o[e]=Qe(o[e],t,r)})),o}function et(e){if(\"string\"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),\"object\"===i()(e)&&null!==e)try{return M()(e,null,2)}catch(t){return String(e)}return null==e?\"\":e.toString()}function tt(e){return\"number\"==typeof e?e.toString():e}function nt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,o=t.allowHashes,a=void 0===o||o;if(!W.a.Map.isMap(e))throw new Error(\"paramToIdentifier: received a non-Im.Map parameter as input\");var i,s,u,c=e.get(\"name\"),l=e.get(\"in\"),p=[];e&&e.hashCode&&l&&c&&a&&p.push(v()(i=v()(s=\"\".concat(l,\".\")).call(s,c,\".hash-\")).call(i,e.hashCode()));l&&c&&p.push(v()(u=\"\".concat(l,\".\")).call(u,c));return p.push(c),r?p:p[0]||\"\"}function rt(e,t){var n,r=nt(e,{returnAll:!0});return _()(n=f()(r).call(r,(function(e){return t[e]}))).call(n,(function(e){return void 0!==e}))[0]}function ot(){return it(fe()(32).toString(\"base64\"))}function at(e){return it(de()(\"sha256\").update(e).digest(\"base64\"))}function it(e){return e.replace(/\\+/g,\"-\").replace(/\\//g,\"_\").replace(/=/g,\"\")}var st=function(e){return!e||!(!ge(e)||!e.isEmpty())}}).call(this,n(73).Buffer)},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(240);function o(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),r(e,o.key,o)}}e.exports=function(e,t,n){return t&&o(e.prototype,t),n&&o(e,n),e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(899),o=n(903);e.exports=function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=r(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&o(e,t)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(466),o=n(910),a=n(915),i=n(916);e.exports=function(e){var t=a();return function(){var n,a=o(e);if(t){var s=o(this).constructor;n=r(a,arguments,s)}else n=a.apply(this,arguments);return i(this,n)}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(994)()},function(e,t,n){e.exports=n(580)},function(e,t,n){var r=n(399),o=n(641),a=n(185),i=n(400);e.exports=function(e,t){return r(e)||o(e,t)||a(e,t)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(632),o=n(392),a=n(185),i=n(640);e.exports=function(e){return r(e)||o(e)||a(e)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(583)},function(e,t,n){\"use strict\";function r(e,t){return e===t}function o(e,t,n){if(null===t||null===n||t.length!==n.length)return!1;for(var r=t.length,o=0;o<r;o++)if(!e(t[o],n[o]))return!1;return!0}function a(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return\"function\"==typeof e}))){var n=t.map((function(e){return typeof e})).join(\", \");throw new Error(\"Selector creators expect all input-selectors to be functions, instead received the following types: [\"+n+\"]\")}return t}n.d(t,\"a\",(function(){return i}));var i=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return function(){for(var t=arguments.length,r=Array(t),o=0;o<t;o++)r[o]=arguments[o];var i=0,s=r.pop(),u=a(r),c=e.apply(void 0,[function(){return i++,s.apply(null,arguments)}].concat(n)),l=e((function(){for(var e=[],t=u.length,n=0;n<t;n++)e.push(u[n].apply(null,arguments));return c.apply(null,e)}));return l.resultFunc=s,l.dependencies=u,l.recomputations=function(){return i},l.resetRecomputations=function(){return i=0},l}}((function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r,n=null,a=null;return function(){return o(t,n,arguments)||(a=e.apply(null,arguments)),n=arguments,a}}))},function(e,t,n){e.exports=n(668)},function(e,t,n){var r=n(175),o=n(572);function a(t){return\"function\"==typeof r&&\"symbol\"==typeof o?(e.exports=a=function(e){return typeof e},e.exports.default=e.exports,e.exports.__esModule=!0):(e.exports=a=function(e){return e&&\"function\"==typeof r&&e.constructor===r&&e!==r.prototype?\"symbol\":typeof e},e.exports.default=e.exports,e.exports.__esModule=!0),a(t)}e.exports=a,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(598)},function(e,t,n){e.exports=n(596)},function(e,t,n){\"use strict\";var r=n(40),o=n(127).f,a=n(362),i=n(34),s=n(107),u=n(67),c=n(55),l=function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t};e.exports=function(e,t){var n,p,f,h,d,m,v,g,y=e.target,b=e.global,_=e.stat,w=e.proto,x=b?r:_?r[y]:(r[y]||{}).prototype,E=b?i:i[y]||(i[y]={}),S=E.prototype;for(f in t)n=!a(b?f:y+(_?\".\":\"#\")+f,e.forced)&&x&&c(x,f),d=E[f],n&&(m=e.noTargetGet?(g=o(x,f))&&g.value:x[f]),h=n&&m?m:t[f],n&&typeof d==typeof h||(v=e.bind&&n?s(h,r):e.wrap&&n?l(h):w&&\"function\"==typeof h?s(Function.call,h):h,(e.sham||h&&h.sham||d&&d.sham)&&u(v,\"sham\",!0),E[f]=v,w&&(c(i,p=y+\"Prototype\")||u(i,p,{}),i[p][f]=h,e.real&&S&&!S[f]&&u(S,f,h)))}},function(e,t,n){e.exports=n(601)},function(e,t,n){e.exports=n(401)},function(e,t,n){var r=n(448),o=n(449),a=n(854),i=n(856),s=n(860),u=n(862),c=n(867),l=n(240),p=n(3);function f(e,t){var n=r(e);if(o){var s=o(e);t&&(s=a(s).call(s,(function(t){return i(e,t).enumerable}))),n.push.apply(n,s)}return n}e.exports=function(e){for(var t=1;t<arguments.length;t++){var n,r=null!=arguments[t]?arguments[t]:{};if(t%2)s(n=f(Object(r),!0)).call(n,(function(t){p(e,t,r[t])}));else if(u)c(e,u(r));else{var o;s(o=f(Object(r))).call(o,(function(t){l(e,t,i(r,t))}))}}return e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var u;if(void 0===t)u=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[n,r,o,a,i,s],l=0;(u=new Error(t.replace(/%s/g,(function(){return c[l++]})))).name=\"Invariant Violation\"}throw u.framesToPop=1,u}}},function(e,t,n){\"use strict\";t.a=function(){var e={location:{},history:{},open:function(){},close:function(){},File:function(){}};if(\"undefined\"==typeof window)return e;try{e=window;for(var t=0,n=[\"File\",\"Blob\",\"FormData\"];t<n.length;t++){var r=n[t];r in window&&(e[r]=window[r])}}catch(e){console.error(e)}return e}()},function(e,t,n){\"use strict\";var r,o=n(1),a=\"<<anonymous>>\",i=function(){invariant(!1,\"ImmutablePropTypes type checking code is stripped in production.\")};i.isRequired=i;var s=function(){return i};function u(e){var t=typeof e;return Array.isArray(e)?\"array\":e instanceof RegExp?\"object\":e instanceof o.Iterable?\"Immutable.\"+e.toSource().split(\" \")[0]:t}function c(e){function t(t,n,r,o,i,s){for(var u=arguments.length,c=Array(u>6?u-6:0),l=6;l<u;l++)c[l-6]=arguments[l];if(s=s||r,o=o||a,null!=n[r])return e.apply(void 0,[n,r,o,i,s].concat(c));var p=i;return t?new Error(\"Required \"+p+\" `\"+s+\"` was not specified in `\"+o+\"`.\"):void 0}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}function l(e,t){return n=\"Iterable.\"+e,r=function(e){return o.Iterable.isIterable(e)&&t(e)},c((function(e,t,o,a,i){var s=e[t];if(!r(s)){var c=u(s);return new Error(\"Invalid \"+a+\" `\"+i+\"` of type `\"+c+\"` supplied to `\"+o+\"`, expected `\"+n+\"`.\")}return null}));var n,r}(r={listOf:s,mapOf:s,orderedMapOf:s,setOf:s,orderedSetOf:s,stackOf:s,iterableOf:s,recordOf:s,shape:s,contains:s,mapContains:s,orderedMapContains:s,list:i,map:i,orderedMap:i,set:i,orderedSet:i,stack:i,seq:i,record:i,iterable:i}).iterable.indexed=l(\"Indexed\",o.Iterable.isIndexed),r.iterable.keyed=l(\"Keyed\",o.Iterable.isKeyed),e.exports=r},function(e,t,n){var r=n(897);function o(){return e.exports=o=r||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},e.exports.default=e.exports,e.exports.__esModule=!0,o.apply(this,arguments)}e.exports=o,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(603)},function(e,t,n){\"use strict\";e.exports=function(e){for(var t=arguments.length-1,n=\"Minified React error #\"+e+\"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=\"+e,r=0;r<t;r++)n+=\"&args[]=\"+encodeURIComponent(arguments[r+1]);n+=\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\";var o=new Error(n);throw o.name=\"Invariant Violation\",o.framesToPop=1,o}},function(e,t,n){e.exports=n(661)},function(e,t,n){e.exports=n(585)},function(e,t,n){\"use strict\";var r=n(79);e.exports=r},function(e,t){e.exports={}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"isOAS3\",(function(){return c})),n.d(t,\"isSwagger2\",(function(){return l})),n.d(t,\"OAS3ComponentWrapFactory\",(function(){return p}));var r=n(28),o=n.n(r),a=n(172),i=n.n(a),s=n(0),u=n.n(s);function c(e){var t=e.get(\"openapi\");return\"string\"==typeof t&&(i()(t).call(t,\"3.0.\")&&t.length>4)}function l(e){var t=e.get(\"swagger\");return\"string\"==typeof t&&i()(t).call(t,\"2.0\")}function p(e){return function(t,n){return function(r){return n&&n.specSelectors&&n.specSelectors.specJson?c(n.specSelectors.specJson())?u.a.createElement(e,o()({},r,n,{Ori:t})):u.a.createElement(t,r):(console.warn(\"OAS3 wrapper: couldn't get spec\"),null)}}}},function(e,t,n){e.exports=n(592)},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){\"use strict\";var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;function i(e){if(null==e)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String(\"abc\");if(e[5]=\"de\",\"5\"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t[\"_\"+String.fromCharCode(n)]=n;if(\"0123456789\"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(\"\"))return!1;var r={};return\"abcdefghijklmnopqrst\".split(\"\").forEach((function(e){r[e]=e})),\"abcdefghijklmnopqrst\"===Object.keys(Object.assign({},r)).join(\"\")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,u=i(e),c=1;c<arguments.length;c++){for(var l in n=Object(arguments[c]))o.call(n,l)&&(u[l]=n[l]);if(r){s=r(n);for(var p=0;p<s.length;p++)a.call(n,s[p])&&(u[s[p]]=n[s[p]])}}return u}},function(e,t,n){e.exports=n(885)},function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n(\"object\"==typeof globalThis&&globalThis)||n(\"object\"==typeof window&&window)||n(\"object\"==typeof self&&self)||n(\"object\"==typeof t&&t)||function(){return this}()||Function(\"return this\")()}).call(this,n(51))},function(e,t,n){var r=n(40),o=n(227),a=n(55),i=n(179),s=n(229),u=n(363),c=o(\"wks\"),l=r.Symbol,p=u?l:l&&l.withoutSetter||i;e.exports=function(e){return a(c,e)&&(s||\"string\"==typeof c[e])||(s&&a(l,e)?c[e]=l[e]:c[e]=p(\"Symbol.\"+e)),c[e]}},function(e,t,n){var r=n(34);e.exports=function(e){return r[e+\"Prototype\"]}},function(e,t,n){var r=n(196);e.exports=function(e,t,n){var o=null==e?void 0:r(e,t);return void 0===o?n:o}},function(e,t,n){var r=n(34),o=n(55),a=n(236),i=n(68).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});o(t,e)||i(t,e,{value:a.f(e)})}},function(e,t,n){\"use strict\";var r=n(30),o=n(140),a=n(467),i=(n(25),o.ID_ATTRIBUTE_NAME),s=a,u=\"__reactInternalInstance$\"+Math.random().toString(36).slice(2);function c(e,t){return 1===e.nodeType&&e.getAttribute(i)===String(t)||8===e.nodeType&&e.nodeValue===\" react-text: \"+t+\" \"||8===e.nodeType&&e.nodeValue===\" react-empty: \"+t+\" \"}function l(e){for(var t;t=e._renderedComponent;)e=t;return e}function p(e,t){var n=l(e);n._hostNode=t,t[u]=n}function f(e,t){if(!(e._flags&s.hasCachedChildNodes)){var n=e._renderedChildren,o=t.firstChild;e:for(var a in n)if(n.hasOwnProperty(a)){var i=n[a],u=l(i)._domID;if(0!==u){for(;null!==o;o=o.nextSibling)if(c(o,u)){p(i,o);continue e}r(\"32\",u)}}e._flags|=s.hasCachedChildNodes}}function h(e){if(e[u])return e[u];for(var t,n,r=[];!e[u];){if(r.push(e),!e.parentNode)return null;e=e.parentNode}for(;e&&(n=e[u]);e=r.pop())t=n,r.length&&f(n,e);return t}var d={getClosestInstanceFromNode:h,getInstanceFromNode:function(e){var t=h(e);return null!=t&&t._hostNode===e?t:null},getNodeFromInstance:function(e){if(void 0===e._hostNode&&r(\"33\"),e._hostNode)return e._hostNode;for(var t=[];!e._hostNode;)t.push(e),e._hostParent||r(\"34\"),e=e._hostParent;for(;t.length;e=t.pop())f(e,e._hostNode);return e._hostNode},precacheChildNodes:f,precacheNode:p,uncacheNode:function(e){var t=e._hostNode;t&&(delete t[u],e._hostNode=null)}};e.exports=d},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_SPEC\",(function(){return ee})),n.d(t,\"UPDATE_URL\",(function(){return te})),n.d(t,\"UPDATE_JSON\",(function(){return ne})),n.d(t,\"UPDATE_PARAM\",(function(){return re})),n.d(t,\"UPDATE_EMPTY_PARAM_INCLUSION\",(function(){return oe})),n.d(t,\"VALIDATE_PARAMS\",(function(){return ae})),n.d(t,\"SET_RESPONSE\",(function(){return ie})),n.d(t,\"SET_REQUEST\",(function(){return se})),n.d(t,\"SET_MUTATED_REQUEST\",(function(){return ue})),n.d(t,\"LOG_REQUEST\",(function(){return ce})),n.d(t,\"CLEAR_RESPONSE\",(function(){return le})),n.d(t,\"CLEAR_REQUEST\",(function(){return pe})),n.d(t,\"CLEAR_VALIDATE_PARAMS\",(function(){return fe})),n.d(t,\"UPDATE_OPERATION_META_VALUE\",(function(){return he})),n.d(t,\"UPDATE_RESOLVED\",(function(){return de})),n.d(t,\"UPDATE_RESOLVED_SUBTREE\",(function(){return me})),n.d(t,\"SET_SCHEME\",(function(){return ve})),n.d(t,\"updateSpec\",(function(){return ge})),n.d(t,\"updateResolved\",(function(){return ye})),n.d(t,\"updateUrl\",(function(){return be})),n.d(t,\"updateJsonSpec\",(function(){return _e})),n.d(t,\"parseToJson\",(function(){return we})),n.d(t,\"resolveSpec\",(function(){return Ee})),n.d(t,\"requestResolvedSubtree\",(function(){return Ae})),n.d(t,\"changeParam\",(function(){return ke})),n.d(t,\"changeParamByIdentity\",(function(){return Oe})),n.d(t,\"updateResolvedSubtree\",(function(){return je})),n.d(t,\"invalidateResolvedSubtreeCache\",(function(){return Te})),n.d(t,\"validateParams\",(function(){return Ie})),n.d(t,\"updateEmptyParamInclusion\",(function(){return Pe})),n.d(t,\"clearValidateParams\",(function(){return Ne})),n.d(t,\"changeConsumesValue\",(function(){return Me})),n.d(t,\"changeProducesValue\",(function(){return Re})),n.d(t,\"setResponse\",(function(){return De})),n.d(t,\"setRequest\",(function(){return Le})),n.d(t,\"setMutatedRequest\",(function(){return Be})),n.d(t,\"logRequest\",(function(){return Fe})),n.d(t,\"executeRequest\",(function(){return Ue})),n.d(t,\"execute\",(function(){return qe})),n.d(t,\"clearResponse\",(function(){return ze})),n.d(t,\"clearRequest\",(function(){return Ve})),n.d(t,\"setScheme\",(function(){return We}));var r=n(24),o=n.n(r),a=n(53),i=n.n(a),s=n(76),u=n.n(s),c=n(18),l=n.n(c),p=n(39),f=n.n(p),h=n(22),d=n.n(h),m=n(4),v=n.n(m),g=n(348),y=n.n(g),b=n(29),_=n.n(b),w=n(210),x=n.n(w),E=n(65),S=n.n(E),C=n(12),A=n.n(C),k=n(211),O=n.n(k),j=n(17),T=n.n(j),I=n(23),P=n.n(I),N=n(2),M=n.n(N),R=n(15),D=n.n(R),L=n(20),B=n.n(L),F=n(349),U=n.n(F),q=n(74),z=n(1),V=n(94),W=n.n(V),H=n(145),$=n(212),J=n.n($),K=n(518),Y=n.n(K),G=n(350),Z=n.n(G),X=n(5),Q=[\"path\",\"method\"],ee=\"spec_update_spec\",te=\"spec_update_url\",ne=\"spec_update_json\",re=\"spec_update_param\",oe=\"spec_update_empty_param_inclusion\",ae=\"spec_validate_param\",ie=\"spec_set_response\",se=\"spec_set_request\",ue=\"spec_set_mutated_request\",ce=\"spec_log_request\",le=\"spec_clear_response\",pe=\"spec_clear_request\",fe=\"spec_clear_validate_param\",he=\"spec_update_operation_meta_value\",de=\"spec_update_resolved\",me=\"spec_update_resolved_subtree\",ve=\"set_scheme\";function ge(e){var t,n=(t=e,J()(t)?t:\"\").replace(/\\t/g,\"  \");if(\"string\"==typeof e)return{type:ee,payload:n}}function ye(e){return{type:de,payload:e}}function be(e){return{type:te,payload:e}}function _e(e){return{type:ne,payload:e}}var we=function(e){return function(t){var n=t.specActions,r=t.specSelectors,o=t.errActions,a=r.specStr,i=null;try{e=e||a(),o.clear({source:\"parser\"}),i=q.a.load(e)}catch(e){return console.error(e),o.newSpecErr({source:\"parser\",level:\"error\",message:e.reason,line:e.mark&&e.mark.line?e.mark.line+1:void 0})}return i&&\"object\"===l()(i)?n.updateJsonSpec(i):{}}},xe=!1,Ee=function(e,t){return function(n){var r=n.specActions,o=n.specSelectors,a=n.errActions,i=n.fn,s=i.fetch,u=i.resolve,c=i.AST,l=void 0===c?{}:c,p=n.getConfigs;xe||(console.warn(\"specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!\"),xe=!0);var f=p(),h=f.modelPropertyMacro,m=f.parameterMacro,g=f.requestInterceptor,b=f.responseInterceptor;void 0===e&&(e=o.specJson()),void 0===t&&(t=o.url());var _=l.getLineNumberForPath?l.getLineNumberForPath:function(){},w=o.specStr();return u({fetch:s,spec:e,baseDoc:t,modelPropertyMacro:h,parameterMacro:m,requestInterceptor:g,responseInterceptor:b}).then((function(e){var t=e.spec,n=e.errors;if(a.clear({type:\"thrown\"}),d()(n)&&n.length>0){var o=v()(n).call(n,(function(e){return console.error(e),e.line=e.fullPath?_(w,e.fullPath):null,e.path=e.fullPath?e.fullPath.join(\".\"):null,e.level=\"error\",e.type=\"thrown\",e.source=\"resolver\",y()(e,\"message\",{enumerable:!0,value:e.message}),e}));a.newThrownErrBatch(o)}return r.updateResolved(t)}))}},Se=[],Ce=Y()(u()(f.a.mark((function e(){var t,n,r,o,a,i,s,c,l,p,h,m,g,b,w,E,C,k;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Se.system){e.next=4;break}return console.error(\"debResolveSubtrees: don't have a system to operate on, aborting.\"),e.abrupt(\"return\");case 4:if(n=t.errActions,r=t.errSelectors,o=t.fn,a=o.resolveSubtree,i=o.fetch,s=o.AST,c=void 0===s?{}:s,l=t.specSelectors,p=t.specActions,a){e.next=8;break}return console.error(\"Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing.\"),e.abrupt(\"return\");case 8:return h=c.getLineNumberForPath?c.getLineNumberForPath:function(){},m=l.specStr(),g=t.getConfigs(),b=g.modelPropertyMacro,w=g.parameterMacro,E=g.requestInterceptor,C=g.responseInterceptor,e.prev=11,e.next=14,_()(Se).call(Se,function(){var e=u()(f.a.mark((function e(t,o){var s,c,p,g,_,k,j,T,I;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return s=e.sent,c=s.resultMap,p=s.specWithCurrentSubtrees,e.next=7,a(p,o,{baseDoc:l.url(),modelPropertyMacro:b,parameterMacro:w,requestInterceptor:E,responseInterceptor:C});case 7:if(g=e.sent,_=g.errors,k=g.spec,r.allErrors().size&&n.clearBy((function(e){var t;return\"thrown\"!==e.get(\"type\")||\"resolver\"!==e.get(\"source\")||!x()(t=e.get(\"fullPath\")).call(t,(function(e,t){return e===o[t]||void 0===o[t]}))})),d()(_)&&_.length>0&&(j=v()(_).call(_,(function(e){return e.line=e.fullPath?h(m,e.fullPath):null,e.path=e.fullPath?e.fullPath.join(\".\"):null,e.level=\"error\",e.type=\"thrown\",e.source=\"resolver\",y()(e,\"message\",{enumerable:!0,value:e.message}),e})),n.newThrownErrBatch(j)),!k||!l.isOAS3()||\"components\"!==o[0]||\"securitySchemes\"!==o[1]){e.next=15;break}return e.next=15,S.a.all(v()(T=A()(I=O()(k)).call(I,(function(e){return\"openIdConnect\"===e.type}))).call(T,function(){var e=u()(f.a.mark((function e(t){var n,r;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={url:t.openIdConnectUrl,requestInterceptor:E,responseInterceptor:C},e.prev=1,e.next=4,i(n);case 4:(r=e.sent)instanceof Error||r.status>=400?console.error(r.statusText+\" \"+n.url):t.openIdConnectData=JSON.parse(r.text),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(1),console.error(e.t0);case 11:case\"end\":return e.stop()}}),e,null,[[1,8]])})));return function(t){return e.apply(this,arguments)}}()));case 15:return Z()(c,o,k),Z()(p,o,k),e.abrupt(\"return\",{resultMap:c,specWithCurrentSubtrees:p});case 18:case\"end\":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),S.a.resolve({resultMap:(l.specResolvedSubtree([])||Object(z.Map)()).toJS(),specWithCurrentSubtrees:l.specJson().toJS()}));case 14:k=e.sent,delete Se.system,Se=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:p.updateResolvedSubtree([],k.resultMap);case 23:case\"end\":return e.stop()}}),e,null,[[11,19]])}))),35),Ae=function(e){return function(t){var n;T()(n=v()(Se).call(Se,(function(e){return e.join(\"@@\")}))).call(n,e.join(\"@@\"))>-1||(Se.push(e),Se.system=t,Ce())}};function ke(e,t,n,r,o){return{type:re,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:o}}}function Oe(e,t,n,r){return{type:re,payload:{path:e,param:t,value:n,isXml:r}}}var je=function(e,t){return{type:me,payload:{path:e,value:t}}},Te=function(){return{type:me,payload:{path:[],value:Object(z.Map)()}}},Ie=function(e,t){return{type:ae,payload:{pathMethod:e,isOAS3:t}}},Pe=function(e,t,n,r){return{type:oe,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};function Ne(e){return{type:fe,payload:{pathMethod:e}}}function Me(e,t){return{type:he,payload:{path:e,value:t,key:\"consumes_value\"}}}function Re(e,t){return{type:he,payload:{path:e,value:t,key:\"produces_value\"}}}var De=function(e,t,n){return{payload:{path:e,method:t,res:n},type:ie}},Le=function(e,t,n){return{payload:{path:e,method:t,req:n},type:se}},Be=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ue}},Fe=function(e){return{payload:e,type:ce}},Ue=function(e){return function(t){var n,r,o=t.fn,a=t.specActions,i=t.specSelectors,s=t.getConfigs,c=t.oas3Selectors,l=e.pathName,p=e.method,h=e.operation,m=s(),g=m.requestInterceptor,y=m.responseInterceptor,b=h.toJS();h&&h.get(\"parameters\")&&P()(n=A()(r=h.get(\"parameters\")).call(r,(function(e){return e&&!0===e.get(\"allowEmptyValue\")}))).call(n,(function(t){if(i.parameterInclusionSettingFor([l,p],t.get(\"name\"),t.get(\"in\"))){e.parameters=e.parameters||{};var n=Object(X.B)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get(\"name\")]=\"\")}}));if(e.contextUrl=W()(i.url()).toString(),b&&b.operationId?e.operationId=b.operationId:b&&l&&p&&(e.operationId=o.opId(b,l,p)),i.isOAS3()){var _,w=M()(_=\"\".concat(l,\":\")).call(_,p);e.server=c.selectedServer(w)||c.selectedServer();var x=c.serverVariables({server:e.server,namespace:w}).toJS(),E=c.serverVariables({server:e.server}).toJS();e.serverVariables=D()(x).length?x:E,e.requestContentType=c.requestContentType(l,p),e.responseContentType=c.responseContentType(l,p)||\"*/*\";var S,C=c.requestBodyValue(l,p),k=c.requestBodyInclusionSetting(l,p);if(C&&C.toJS)e.requestBody=A()(S=v()(C).call(C,(function(e){return z.Map.isMap(e)?e.get(\"value\"):e}))).call(S,(function(e,t){return(d()(e)?0!==e.length:!Object(X.q)(e))||k.get(t)})).toJS();else e.requestBody=C}var O=B()({},e);O=o.buildRequest(O),a.setRequest(e.pathName,e.method,O);var j=function(){var t=u()(f.a.mark((function t(n){var r,o;return f.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,g.apply(undefined,[n]);case 2:return r=t.sent,o=B()({},r),a.setMutatedRequest(e.pathName,e.method,o),t.abrupt(\"return\",r);case 6:case\"end\":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();e.requestInterceptor=j,e.responseInterceptor=y;var T=U()();return o.execute(e).then((function(t){t.duration=U()()-T,a.setResponse(e.pathName,e.method,t)})).catch((function(t){\"Failed to fetch\"===t.message&&(t.name=\"\",t.message='**Failed to fetch.**  \\n**Possible Reasons:** \\n  - CORS \\n  - Network Failure \\n  - URL scheme must be \"http\" or \"https\" for CORS request.'),a.setResponse(e.pathName,e.method,{error:!0,err:Object(H.serializeError)(t)})}))}},qe=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=i()(e,Q);return function(e){var a=e.fn.fetch,i=e.specSelectors,s=e.specActions,u=i.specJsonWithResolvedSubtrees().toJS(),c=i.operationScheme(t,n),l=i.contentTypeValues([t,n]).toJS(),p=l.requestContentType,f=l.responseContentType,h=/xml/i.test(p),d=i.parameterValues([t,n],h).toJS();return s.executeRequest(o()(o()({},r),{},{fetch:a,spec:u,pathName:t,method:n,parameters:d,requestContentType:p,scheme:c,responseContentType:f}))}};function ze(e,t){return{type:le,payload:{path:e,method:t}}}function Ve(e,t){return{type:pe,payload:{path:e,method:t}}}function We(e,t,n){return{type:ve,payload:{scheme:e,path:t,method:n}}}},function(e,t){e.exports=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e}},function(e,t,n){var r=n(37);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){var r=n(175),o=n(243),a=n(242),i=n(185);e.exports=function(e,t){var n=void 0!==r&&o(e)||e[\"@@iterator\"];if(!n){if(a(e)||(n=i(e))||t&&e&&\"number\"==typeof e.length){n&&(e=n);var s=0,u=function(){};return{s:u,n:function(){return s>=e.length?{done:!0}:{done:!1,value:e[s++]}},e:function(e){throw e},f:u}}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 c,l=!0,p=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return l=e.done,e},e:function(e){p=!0,c=e},f:function(){try{l||null==n.return||n.return()}finally{if(p)throw c}}}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){var n=Array.isArray;e.exports=n},function(e,t){var n;n=function(){return this}();try{n=n||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(n=window)}e.exports=n},function(e,t,n){var r=n(47);e.exports=function(e){if(!r(e))throw TypeError(String(e)+\" is not an object\");return e}},function(e,t,n){var r=n(449),o=n(450),a=n(872);e.exports=function(e,t){if(null==e)return{};var n,i,s=a(e,t);if(r){var u=r(e);for(i=0;i<u.length;i++)n=u[i],o(t).call(t,n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_SELECTED_SERVER\",(function(){return r})),n.d(t,\"UPDATE_REQUEST_BODY_VALUE\",(function(){return o})),n.d(t,\"UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG\",(function(){return a})),n.d(t,\"UPDATE_REQUEST_BODY_INCLUSION\",(function(){return i})),n.d(t,\"UPDATE_ACTIVE_EXAMPLES_MEMBER\",(function(){return s})),n.d(t,\"UPDATE_REQUEST_CONTENT_TYPE\",(function(){return u})),n.d(t,\"UPDATE_RESPONSE_CONTENT_TYPE\",(function(){return c})),n.d(t,\"UPDATE_SERVER_VARIABLE_VALUE\",(function(){return l})),n.d(t,\"SET_REQUEST_BODY_VALIDATE_ERROR\",(function(){return p})),n.d(t,\"CLEAR_REQUEST_BODY_VALIDATE_ERROR\",(function(){return f})),n.d(t,\"CLEAR_REQUEST_BODY_VALUE\",(function(){return h})),n.d(t,\"setSelectedServer\",(function(){return d})),n.d(t,\"setRequestBodyValue\",(function(){return m})),n.d(t,\"setRetainRequestBodyValueFlag\",(function(){return v})),n.d(t,\"setRequestBodyInclusion\",(function(){return g})),n.d(t,\"setActiveExamplesMember\",(function(){return y})),n.d(t,\"setRequestContentType\",(function(){return b})),n.d(t,\"setResponseContentType\",(function(){return _})),n.d(t,\"setServerVariableValue\",(function(){return w})),n.d(t,\"setRequestBodyValidateError\",(function(){return x})),n.d(t,\"clearRequestBodyValidateError\",(function(){return E})),n.d(t,\"initRequestBodyValidateError\",(function(){return S})),n.d(t,\"clearRequestBodyValue\",(function(){return C}));var r=\"oas3_set_servers\",o=\"oas3_set_request_body_value\",a=\"oas3_set_request_body_retain_flag\",i=\"oas3_set_request_body_inclusion\",s=\"oas3_set_active_examples_member\",u=\"oas3_set_request_content_type\",c=\"oas3_set_response_content_type\",l=\"oas3_set_server_variable_value\",p=\"oas3_set_request_body_validate_error\",f=\"oas3_clear_request_body_validate_error\",h=\"oas3_clear_request_body_value\";function d(e,t){return{type:r,payload:{selectedServerUrl:e,namespace:t}}}function m(e){var t=e.value,n=e.pathMethod;return{type:o,payload:{value:t,pathMethod:n}}}var v=function(e){var t=e.value,n=e.pathMethod;return{type:a,payload:{value:t,pathMethod:n}}};function g(e){var t=e.value,n=e.pathMethod,r=e.name;return{type:i,payload:{value:t,pathMethod:n,name:r}}}function y(e){var t=e.name,n=e.pathMethod,r=e.contextType,o=e.contextName;return{type:s,payload:{name:t,pathMethod:n,contextType:r,contextName:o}}}function b(e){var t=e.value,n=e.pathMethod;return{type:u,payload:{value:t,pathMethod:n}}}function _(e){var t=e.value,n=e.path,r=e.method;return{type:c,payload:{value:t,path:n,method:r}}}function w(e){var t=e.server,n=e.namespace,r=e.key,o=e.val;return{type:l,payload:{server:t,namespace:n,key:r,val:o}}}var x=function(e){var t=e.path,n=e.method,r=e.validationErrors;return{type:p,payload:{path:t,method:n,validationErrors:r}}},E=function(e){var t=e.path,n=e.method;return{type:f,payload:{path:t,method:n}}},S=function(e){var t=e.pathMethod;return{type:f,payload:{path:t[0],method:t[1]}}},C=function(e){var t=e.pathMethod;return{type:h,payload:{pathMethod:t}}}},function(e,t,n){var r=n(60),o={}.hasOwnProperty;e.exports=Object.hasOwn||function(e,t){return o.call(r(e),t)}},function(e,t,n){\"use strict\";var r=!(\"undefined\"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:r,canUseWorkers:\"undefined\"!=typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen,isInWorker:!r};e.exports=o},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&(\"object\"==t||\"function\"==t)}},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return m})),n.d(t,\"e\",(function(){return v})),n.d(t,\"c\",(function(){return y})),n.d(t,\"a\",(function(){return b})),n.d(t,\"d\",(function(){return _}));var r=n(49),o=n.n(r),a=n(18),i=n.n(a),s=n(2),u=n.n(s),c=n(57),l=n.n(c),p=n(356),f=n.n(p),h=function(e){return String.prototype.toLowerCase.call(e)},d=function(e){return e.replace(/[^\\w]/gi,\"_\")};function m(e){var t=e.openapi;return!!t&&f()(t,\"3\")}function v(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=r.v2OperationIdCompatibilityMode;if(!e||\"object\"!==i()(e))return null;var a=(e.operationId||\"\").replace(/\\s/g,\"\");return a.length?d(e.operationId):g(t,n,{v2OperationIdCompatibilityMode:o})}function g(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=r.v2OperationIdCompatibilityMode;if(o){var a,i,s=u()(a=\"\".concat(t.toLowerCase(),\"_\")).call(a,e).replace(/[\\s!@#$%^&*()_+=[{\\]};:<>|./?,\\\\'\"\"-]/g,\"_\");return(s=s||u()(i=\"\".concat(e.substring(1),\"_\")).call(i,t)).replace(/((_){2,})/g,\"_\").replace(/^(_)*/g,\"\").replace(/([_])*$/g,\"\")}return u()(n=\"\".concat(h(t))).call(n,d(e))}function y(e,t){var n;return u()(n=\"\".concat(h(t),\"-\")).call(n,e)}function b(e,t){return e&&e.paths?function(e,t){return function(e,t,n){if(!e||\"object\"!==i()(e)||!e.paths||\"object\"!==i()(e.paths))return null;var r=e.paths;for(var o in r)for(var a in r[o])if(\"PARAMETERS\"!==a.toUpperCase()){var s=r[o][a];if(s&&\"object\"===i()(s)){var u={spec:e,pathName:o,method:a.toUpperCase(),operation:s},c=t(u);if(n&&c)return u}}return}(e,t,!0)||null}(e,(function(e){var n=e.pathName,r=e.method,o=e.operation;if(!o||\"object\"!==i()(o))return!1;var a=o.operationId;return[v(o,n,r),y(n,r),a].some((function(e){return e&&e===t}))})):null}function _(e){var t=e.spec,n=t.paths,r={};if(!n||t.$$normalized)return e;for(var a in n){var i=n[a];if(l()(i)){var s=i.parameters,c=function(e){var n=i[e];if(!l()(n))return\"continue\";var c=v(n,a,e);if(c){r[c]?r[c].push(n):r[c]=[n];var p=r[c];if(p.length>1)p.forEach((function(e,t){var n;e.__originalOperationId=e.__originalOperationId||e.operationId,e.operationId=u()(n=\"\".concat(c)).call(n,t+1)}));else if(void 0!==n.operationId){var f=p[0];f.__originalOperationId=f.__originalOperationId||n.operationId,f.operationId=c}}if(\"parameters\"!==e){var h=[],d={};for(var m in t)\"produces\"!==m&&\"consumes\"!==m&&\"security\"!==m||(d[m]=t[m],h.push(d));if(s&&(d.parameters=s,h.push(d)),h.length){var g,y=o()(h);try{for(y.s();!(g=y.n()).done;){var b=g.value;for(var _ in b)if(n[_]){if(\"parameters\"===_){var w,x=o()(b[_]);try{var E=function(){var e=w.value;n[_].some((function(t){return t.name&&t.name===e.name||t.$ref&&t.$ref===e.$ref||t.$$ref&&t.$$ref===e.$$ref||t===e}))||n[_].push(e)};for(x.s();!(w=x.n()).done;)E()}catch(e){x.e(e)}finally{x.f()}}}else n[_]=b[_]}}catch(e){y.e(e)}finally{y.f()}}}};for(var p in i)c(p)}}return t.$$normalized=!0,e}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"NEW_THROWN_ERR\",(function(){return o})),n.d(t,\"NEW_THROWN_ERR_BATCH\",(function(){return a})),n.d(t,\"NEW_SPEC_ERR\",(function(){return i})),n.d(t,\"NEW_SPEC_ERR_BATCH\",(function(){return s})),n.d(t,\"NEW_AUTH_ERR\",(function(){return u})),n.d(t,\"CLEAR\",(function(){return c})),n.d(t,\"CLEAR_BY\",(function(){return l})),n.d(t,\"newThrownErr\",(function(){return p})),n.d(t,\"newThrownErrBatch\",(function(){return f})),n.d(t,\"newSpecErr\",(function(){return h})),n.d(t,\"newSpecErrBatch\",(function(){return d})),n.d(t,\"newAuthErr\",(function(){return m})),n.d(t,\"clear\",(function(){return v})),n.d(t,\"clearBy\",(function(){return g}));var r=n(145),o=\"err_new_thrown_err\",a=\"err_new_thrown_err_batch\",i=\"err_new_spec_err\",s=\"err_new_spec_err_batch\",u=\"err_new_auth_err\",c=\"err_clear\",l=\"err_clear_by\";function p(e){return{type:o,payload:Object(r.serializeError)(e)}}function f(e){return{type:a,payload:e}}function h(e){return{type:i,payload:e}}function d(e){return{type:s,payload:e}}function m(e){return{type:u,payload:e}}function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:c,payload:e}}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:l,payload:e}}},function(e,t,n){var r=n(106);e.exports=function(e){return Object(r(e))}},function(e,t){\"function\"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t,n){var r=n(73),o=r.Buffer;function a(e,t){for(var n in e)t[n]=e[n]}function i(e,t,n){return o(e,t,n)}o.from&&o.alloc&&o.allocUnsafe&&o.allocUnsafeSlow?e.exports=r:(a(r,t),t.Buffer=i),a(o,i),i.from=function(e,t,n){if(\"number\"==typeof e)throw new TypeError(\"Argument must not be a number\");return o(e,t,n)},i.alloc=function(e,t,n){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");var r=o(e);return void 0!==t?\"string\"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},i.allocUnsafe=function(e){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");return o(e)},i.allocUnsafeSlow=function(e){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");return r.SlowBuffer(e)}},function(e,t,n){var r;!function(){\"use strict\";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var a=typeof r;if(\"string\"===a||\"number\"===a)e.push(r);else if(Array.isArray(r)){if(r.length){var i=o.apply(null,r);i&&e.push(i)}}else if(\"object\"===a)if(r.toString===Object.prototype.toString)for(var s in r)n.call(r,s)&&r[s]&&e.push(s);else e.push(r.toString())}}return e.join(\" \")}e.exports?(o.default=o,e.exports=o):void 0===(r=function(){return o}.apply(t,[]))||(e.exports=r)}()},function(e,t,n){e.exports=n(671)},function(e,t,n){e.exports=n(887)},function(e,t,n){var r=n(177),o=n(106);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(48),o=n(68),a=n(105);e.exports=r?function(e,t,n){return o.f(e,t,a(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(48),o=n(361),a=n(52),i=n(178),s=Object.defineProperty;t.f=r?s:function(e,t,n){if(a(e),t=i(t,!0),a(n),o)try{return s(e,t,n)}catch(e){}if(\"get\"in n||\"set\"in n)throw TypeError(\"Accessors not supported\");return\"value\"in n&&(e[t]=n.value),e}},function(e,t,n){var r=n(128),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t,n){var r=n(34),o=n(40),a=function(e){return\"function\"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?a(r[e])||a(o[e]):r[e]&&r[e][t]||o[e]&&o[e][t]}},function(e,t,n){var r=n(407),o=\"object\"==typeof self&&self&&self.Object===Object&&self,a=r||o||Function(\"return this\")();e.exports=a},function(e,t,n){\"use strict\";e.exports={debugTool:null}},function(e,t,n){\"use strict\";(function(e){var r=n(588),o=n(589),a=n(376);function i(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(i()<t)throw new RangeError(\"Invalid typed array length\");return u.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=u.prototype:(null===e&&(e=new u(t)),e.length=t),e}function u(e,t,n){if(!(u.TYPED_ARRAY_SUPPORT||this instanceof u))return new u(e,t,n);if(\"number\"==typeof e){if(\"string\"==typeof t)throw new Error(\"If encoding is specified then the first argument must be a string\");return p(this,e)}return c(this,e,t,n)}function c(e,t,n,r){if(\"number\"==typeof t)throw new TypeError('\"value\" argument must not be a number');return\"undefined\"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,n,r){if(t.byteLength,n<0||t.byteLength<n)throw new RangeError(\"'offset' is out of bounds\");if(t.byteLength<n+(r||0))throw new RangeError(\"'length' is out of bounds\");t=void 0===n&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,n):new Uint8Array(t,n,r);u.TYPED_ARRAY_SUPPORT?(e=t).__proto__=u.prototype:e=f(e,t);return e}(e,t,n,r):\"string\"==typeof t?function(e,t,n){\"string\"==typeof n&&\"\"!==n||(n=\"utf8\");if(!u.isEncoding(n))throw new TypeError('\"encoding\" must be a valid string encoding');var r=0|d(t,n),o=(e=s(e,r)).write(t,n);o!==r&&(e=e.slice(0,o));return e}(e,t,n):function(e,t){if(u.isBuffer(t)){var n=0|h(t.length);return 0===(e=s(e,n)).length||t.copy(e,0,0,n),e}if(t){if(\"undefined\"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||\"length\"in t)return\"number\"!=typeof t.length||(r=t.length)!=r?s(e,0):f(e,t);if(\"Buffer\"===t.type&&a(t.data))return f(e,t.data)}var r;throw new TypeError(\"First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.\")}(e,t)}function l(e){if(\"number\"!=typeof e)throw new TypeError('\"size\" argument must be a number');if(e<0)throw new RangeError('\"size\" argument must not be negative')}function p(e,t){if(l(t),e=s(e,t<0?0:0|h(t)),!u.TYPED_ARRAY_SUPPORT)for(var n=0;n<t;++n)e[n]=0;return e}function f(e,t){var n=t.length<0?0:0|h(t.length);e=s(e,n);for(var r=0;r<n;r+=1)e[r]=255&t[r];return e}function h(e){if(e>=i())throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+i().toString(16)+\" bytes\");return 0|e}function d(e,t){if(u.isBuffer(e))return e.length;if(\"undefined\"!=typeof ArrayBuffer&&\"function\"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;\"string\"!=typeof e&&(e=\"\"+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case\"ascii\":case\"latin1\":case\"binary\":return n;case\"utf8\":case\"utf-8\":case void 0:return q(e).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*n;case\"hex\":return n>>>1;case\"base64\":return z(e).length;default:if(r)return q(e).length;t=(\"\"+t).toLowerCase(),r=!0}}function m(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return\"\";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return\"\";if((n>>>=0)<=(t>>>=0))return\"\";for(e||(e=\"utf8\");;)switch(e){case\"hex\":return T(this,t,n);case\"utf8\":case\"utf-8\":return A(this,t,n);case\"ascii\":return O(this,t,n);case\"latin1\":case\"binary\":return j(this,t,n);case\"base64\":return C(this,t,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return I(this,t,n);default:if(r)throw new TypeError(\"Unknown encoding: \"+e);e=(e+\"\").toLowerCase(),r=!0}}function v(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function g(e,t,n,r,o){if(0===e.length)return-1;if(\"string\"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if(\"string\"==typeof t&&(t=u.from(t,r)),u.isBuffer(t))return 0===t.length?-1:y(e,t,n,r,o);if(\"number\"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&\"function\"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,r,o);throw new TypeError(\"val must be string, number or Buffer\")}function y(e,t,n,r,o){var a,i=1,s=e.length,u=t.length;if(void 0!==r&&(\"ucs2\"===(r=String(r).toLowerCase())||\"ucs-2\"===r||\"utf16le\"===r||\"utf-16le\"===r)){if(e.length<2||t.length<2)return-1;i=2,s/=2,u/=2,n/=2}function c(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(o){var l=-1;for(a=n;a<s;a++)if(c(e,a)===c(t,-1===l?0:a-l)){if(-1===l&&(l=a),a-l+1===u)return l*i}else-1!==l&&(a-=a-l),l=-1}else for(n+u>s&&(n=s-u),a=n;a>=0;a--){for(var p=!0,f=0;f<u;f++)if(c(e,a+f)!==c(t,f)){p=!1;break}if(p)return a}return-1}function b(e,t,n,r){n=Number(n)||0;var o=e.length-n;r?(r=Number(r))>o&&(r=o):r=o;var a=t.length;if(a%2!=0)throw new TypeError(\"Invalid hex string\");r>a/2&&(r=a/2);for(var i=0;i<r;++i){var s=parseInt(t.substr(2*i,2),16);if(isNaN(s))return i;e[n+i]=s}return i}function _(e,t,n,r){return V(q(t,e.length-n),e,n,r)}function w(e,t,n,r){return V(function(e){for(var t=[],n=0;n<e.length;++n)t.push(255&e.charCodeAt(n));return t}(t),e,n,r)}function x(e,t,n,r){return w(e,t,n,r)}function E(e,t,n,r){return V(z(t),e,n,r)}function S(e,t,n,r){return V(function(e,t){for(var n,r,o,a=[],i=0;i<e.length&&!((t-=2)<0);++i)r=(n=e.charCodeAt(i))>>8,o=n%256,a.push(o),a.push(r);return a}(t,e.length-n),e,n,r)}function C(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function A(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o<n;){var a,i,s,u,c=e[o],l=null,p=c>239?4:c>223?3:c>191?2:1;if(o+p<=n)switch(p){case 1:c<128&&(l=c);break;case 2:128==(192&(a=e[o+1]))&&(u=(31&c)<<6|63&a)>127&&(l=u);break;case 3:a=e[o+1],i=e[o+2],128==(192&a)&&128==(192&i)&&(u=(15&c)<<12|(63&a)<<6|63&i)>2047&&(u<55296||u>57343)&&(l=u);break;case 4:a=e[o+1],i=e[o+2],s=e[o+3],128==(192&a)&&128==(192&i)&&128==(192&s)&&(u=(15&c)<<18|(63&a)<<12|(63&i)<<6|63&s)>65535&&u<1114112&&(l=u)}null===l?(l=65533,p=1):l>65535&&(l-=65536,r.push(l>>>10&1023|55296),l=56320|1023&l),r.push(l),o+=p}return function(e){var t=e.length;if(t<=k)return String.fromCharCode.apply(String,e);var n=\"\",r=0;for(;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=k));return n}(r)}t.Buffer=u,t.SlowBuffer=function(e){+e!=e&&(e=0);return u.alloc(+e)},t.INSPECT_MAX_BYTES=50,u.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&\"function\"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),t.kMaxLength=i(),u.poolSize=8192,u._augment=function(e){return e.__proto__=u.prototype,e},u.from=function(e,t,n){return c(null,e,t,n)},u.TYPED_ARRAY_SUPPORT&&(u.prototype.__proto__=Uint8Array.prototype,u.__proto__=Uint8Array,\"undefined\"!=typeof Symbol&&Symbol.species&&u[Symbol.species]===u&&Object.defineProperty(u,Symbol.species,{value:null,configurable:!0})),u.alloc=function(e,t,n){return function(e,t,n,r){return l(t),t<=0?s(e,t):void 0!==n?\"string\"==typeof r?s(e,t).fill(n,r):s(e,t).fill(n):s(e,t)}(null,e,t,n)},u.allocUnsafe=function(e){return p(null,e)},u.allocUnsafeSlow=function(e){return p(null,e)},u.isBuffer=function(e){return!(null==e||!e._isBuffer)},u.compare=function(e,t){if(!u.isBuffer(e)||!u.isBuffer(t))throw new TypeError(\"Arguments must be Buffers\");if(e===t)return 0;for(var n=e.length,r=t.length,o=0,a=Math.min(n,r);o<a;++o)if(e[o]!==t[o]){n=e[o],r=t[o];break}return n<r?-1:r<n?1:0},u.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"latin1\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},u.concat=function(e,t){if(!a(e))throw new TypeError('\"list\" argument must be an Array of Buffers');if(0===e.length)return u.alloc(0);var n;if(void 0===t)for(t=0,n=0;n<e.length;++n)t+=e[n].length;var r=u.allocUnsafe(t),o=0;for(n=0;n<e.length;++n){var i=e[n];if(!u.isBuffer(i))throw new TypeError('\"list\" argument must be an Array of Buffers');i.copy(r,o),o+=i.length}return r},u.byteLength=d,u.prototype._isBuffer=!0,u.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var t=0;t<e;t+=2)v(this,t,t+1);return this},u.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError(\"Buffer size must be a multiple of 32-bits\");for(var t=0;t<e;t+=4)v(this,t,t+3),v(this,t+1,t+2);return this},u.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError(\"Buffer size must be a multiple of 64-bits\");for(var t=0;t<e;t+=8)v(this,t,t+7),v(this,t+1,t+6),v(this,t+2,t+5),v(this,t+3,t+4);return this},u.prototype.toString=function(){var e=0|this.length;return 0===e?\"\":0===arguments.length?A(this,0,e):m.apply(this,arguments)},u.prototype.equals=function(e){if(!u.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");return this===e||0===u.compare(this,e)},u.prototype.inspect=function(){var e=\"\",n=t.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString(\"hex\",0,n).match(/.{2}/g).join(\" \"),this.length>n&&(e+=\" ... \")),\"<Buffer \"+e+\">\"},u.prototype.compare=function(e,t,n,r,o){if(!u.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError(\"out of range index\");if(r>=o&&t>=n)return 0;if(r>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var a=(o>>>=0)-(r>>>=0),i=(n>>>=0)-(t>>>=0),s=Math.min(a,i),c=this.slice(r,o),l=e.slice(t,n),p=0;p<s;++p)if(c[p]!==l[p]){a=c[p],i=l[p];break}return a<i?-1:i<a?1:0},u.prototype.includes=function(e,t,n){return-1!==this.indexOf(e,t,n)},u.prototype.indexOf=function(e,t,n){return g(this,e,t,n,!0)},u.prototype.lastIndexOf=function(e,t,n){return g(this,e,t,n,!1)},u.prototype.write=function(e,t,n,r){if(void 0===t)r=\"utf8\",n=this.length,t=0;else if(void 0===n&&\"string\"==typeof t)r=t,n=this.length,t=0;else{if(!isFinite(t))throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");t|=0,isFinite(n)?(n|=0,void 0===r&&(r=\"utf8\")):(r=n,n=void 0)}var o=this.length-t;if((void 0===n||n>o)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");r||(r=\"utf8\");for(var a=!1;;)switch(r){case\"hex\":return b(this,e,t,n);case\"utf8\":case\"utf-8\":return _(this,e,t,n);case\"ascii\":return w(this,e,t,n);case\"latin1\":case\"binary\":return x(this,e,t,n);case\"base64\":return E(this,e,t,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return S(this,e,t,n);default:if(a)throw new TypeError(\"Unknown encoding: \"+r);r=(\"\"+r).toLowerCase(),a=!0}},u.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var k=4096;function O(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var o=t;o<n;++o)r+=String.fromCharCode(127&e[o]);return r}function j(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var o=t;o<n;++o)r+=String.fromCharCode(e[o]);return r}function T(e,t,n){var r=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>r)&&(n=r);for(var o=\"\",a=t;a<n;++a)o+=U(e[a]);return o}function I(e,t,n){for(var r=e.slice(t,n),o=\"\",a=0;a<r.length;a+=2)o+=String.fromCharCode(r[a]+256*r[a+1]);return o}function P(e,t,n){if(e%1!=0||e<0)throw new RangeError(\"offset is not uint\");if(e+t>n)throw new RangeError(\"Trying to access beyond buffer length\")}function N(e,t,n,r,o,a){if(!u.isBuffer(e))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(t>o||t<a)throw new RangeError('\"value\" argument is out of bounds');if(n+r>e.length)throw new RangeError(\"Index out of range\")}function M(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,a=Math.min(e.length-n,2);o<a;++o)e[n+o]=(t&255<<8*(r?o:1-o))>>>8*(r?o:1-o)}function R(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,a=Math.min(e.length-n,4);o<a;++o)e[n+o]=t>>>8*(r?o:3-o)&255}function D(e,t,n,r,o,a){if(n+r>e.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"Index out of range\")}function L(e,t,n,r,a){return a||D(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function B(e,t,n,r,a){return a||D(e,0,n,8),o.write(e,t,n,r,52,8),n+8}u.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t<e&&(t=e),u.TYPED_ARRAY_SUPPORT)(n=this.subarray(e,t)).__proto__=u.prototype;else{var o=t-e;n=new u(o,void 0);for(var a=0;a<o;++a)n[a]=this[a+e]}return n},u.prototype.readUIntLE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=this[e],o=1,a=0;++a<t&&(o*=256);)r+=this[e+a]*o;return r},u.prototype.readUIntBE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=this[e+--t],o=1;t>0&&(o*=256);)r+=this[e+--t]*o;return r},u.prototype.readUInt8=function(e,t){return t||P(e,1,this.length),this[e]},u.prototype.readUInt16LE=function(e,t){return t||P(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUInt16BE=function(e,t){return t||P(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUInt32LE=function(e,t){return t||P(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUInt32BE=function(e,t){return t||P(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=this[e],o=1,a=0;++a<t&&(o*=256);)r+=this[e+a]*o;return r>=(o*=128)&&(r-=Math.pow(2,8*t)),r},u.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=t,o=1,a=this[e+--r];r>0&&(o*=256);)a+=this[e+--r]*o;return a>=(o*=128)&&(a-=Math.pow(2,8*t)),a},u.prototype.readInt8=function(e,t){return t||P(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||P(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(e,t){t||P(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(e,t){return t||P(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||P(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||P(e,4,this.length),o.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||P(e,4,this.length),o.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||P(e,8,this.length),o.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||P(e,8,this.length),o.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||N(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,a=0;for(this[t]=255&e;++a<n&&(o*=256);)this[t+a]=e/o&255;return t+n},u.prototype.writeUIntBE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||N(this,e,t,n,Math.pow(2,8*n)-1,0);var o=n-1,a=1;for(this[t+o]=255&e;--o>=0&&(a*=256);)this[t+o]=e/a&255;return t+n},u.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,1,255,0),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},u.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):M(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):M(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);N(this,e,t,n,o-1,-o)}var a=0,i=1,s=0;for(this[t]=255&e;++a<n&&(i*=256);)e<0&&0===s&&0!==this[t+a-1]&&(s=1),this[t+a]=(e/i>>0)-s&255;return t+n},u.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);N(this,e,t,n,o-1,-o)}var a=n-1,i=1,s=0;for(this[t+a]=255&e;--a>=0&&(i*=256);)e<0&&0===s&&0!==this[t+a+1]&&(s=1),this[t+a]=(e/i>>0)-s&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):M(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):M(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,n){return L(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return L(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return B(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return B(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError(\"targetStart out of bounds\");if(n<0||n>=this.length)throw new RangeError(\"sourceStart out of bounds\");if(r<0)throw new RangeError(\"sourceEnd out of bounds\");r>this.length&&(r=this.length),e.length-t<r-n&&(r=e.length-t+n);var o,a=r-n;if(this===e&&n<t&&t<r)for(o=a-1;o>=0;--o)e[o+t]=this[o+n];else if(a<1e3||!u.TYPED_ARRAY_SUPPORT)for(o=0;o<a;++o)e[o+t]=this[o+n];else Uint8Array.prototype.set.call(e,this.subarray(n,n+a),t);return a},u.prototype.fill=function(e,t,n,r){if(\"string\"==typeof e){if(\"string\"==typeof t?(r=t,t=0,n=this.length):\"string\"==typeof n&&(r=n,n=this.length),1===e.length){var o=e.charCodeAt(0);o<256&&(e=o)}if(void 0!==r&&\"string\"!=typeof r)throw new TypeError(\"encoding must be a string\");if(\"string\"==typeof r&&!u.isEncoding(r))throw new TypeError(\"Unknown encoding: \"+r)}else\"number\"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<n)throw new RangeError(\"Out of range index\");if(n<=t)return this;var a;if(t>>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),\"number\"==typeof e)for(a=t;a<n;++a)this[a]=e;else{var i=u.isBuffer(e)?e:q(new u(e,r).toString()),s=i.length;for(a=0;a<n-t;++a)this[a+t]=i[a%s]}return this};var F=/[^+\\/0-9A-Za-z-_]/g;function U(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function q(e,t){var n;t=t||1/0;for(var r=e.length,o=null,a=[],i=0;i<r;++i){if((n=e.charCodeAt(i))>55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(i+1===r){(t-=3)>-1&&a.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&a.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&a.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;a.push(n)}else if(n<2048){if((t-=2)<0)break;a.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;a.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error(\"Invalid code point\");if((t-=4)<0)break;a.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return a}function z(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}(e).replace(F,\"\")).length<2)return\"\";for(;e.length%4!=0;)e+=\"=\";return e}(e))}function V(e,t,n,r){for(var o=0;o<r&&!(o+n>=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,n(51))},function(e,t,n){\"use strict\";function r(e){return null==e}var o={isNothing:r,isObject:function(e){return\"object\"==typeof e&&null!==e},toArray:function(e){return Array.isArray(e)?e:r(e)?[]:[e]},repeat:function(e,t){var n,r=\"\";for(n=0;n<t;n+=1)r+=e;return r},isNegativeZero:function(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e},extend:function(e,t){var n,r,o,a;if(t)for(n=0,r=(a=Object.keys(t)).length;n<r;n+=1)e[o=a[n]]=t[o];return e}};function a(e,t){var n=\"\",r=e.reason||\"(unknown reason)\";return e.mark?(e.mark.name&&(n+='in \"'+e.mark.name+'\" '),n+=\"(\"+(e.mark.line+1)+\":\"+(e.mark.column+1)+\")\",!t&&e.mark.snippet&&(n+=\"\\n\\n\"+e.mark.snippet),r+\" \"+n):r}function i(e,t){Error.call(this),this.name=\"YAMLException\",this.reason=e,this.mark=t,this.message=a(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||\"\"}i.prototype=Object.create(Error.prototype),i.prototype.constructor=i,i.prototype.toString=function(e){return this.name+\": \"+a(this,e)};var s=i;function u(e,t,n,r,o){var a=\"\",i=\"\",s=Math.floor(o/2)-1;return r-t>s&&(t=r-s+(a=\" ... \").length),n-r>s&&(n=r+s-(i=\" ...\").length),{str:a+e.slice(t,n).replace(/\\t/g,\"→\")+i,pos:r-t+a.length}}function c(e,t){return o.repeat(\" \",t-e.length)+e}var l=function(e,t){if(t=Object.create(t||null),!e.buffer)return null;t.maxLength||(t.maxLength=79),\"number\"!=typeof t.indent&&(t.indent=1),\"number\"!=typeof t.linesBefore&&(t.linesBefore=3),\"number\"!=typeof t.linesAfter&&(t.linesAfter=2);for(var n,r=/\\r?\\n|\\r|\\0/g,a=[0],i=[],s=-1;n=r.exec(e.buffer);)i.push(n.index),a.push(n.index+n[0].length),e.position<=n.index&&s<0&&(s=a.length-2);s<0&&(s=a.length-1);var l,p,f=\"\",h=Math.min(e.line+t.linesAfter,i.length).toString().length,d=t.maxLength-(t.indent+h+3);for(l=1;l<=t.linesBefore&&!(s-l<0);l++)p=u(e.buffer,a[s-l],i[s-l],e.position-(a[s]-a[s-l]),d),f=o.repeat(\" \",t.indent)+c((e.line-l+1).toString(),h)+\" | \"+p.str+\"\\n\"+f;for(p=u(e.buffer,a[s],i[s],e.position,d),f+=o.repeat(\" \",t.indent)+c((e.line+1).toString(),h)+\" | \"+p.str+\"\\n\",f+=o.repeat(\"-\",t.indent+h+3+p.pos)+\"^\\n\",l=1;l<=t.linesAfter&&!(s+l>=i.length);l++)p=u(e.buffer,a[s+l],i[s+l],e.position-(a[s]-a[s+l]),d),f+=o.repeat(\" \",t.indent)+c((e.line+l+1).toString(),h)+\" | \"+p.str+\"\\n\";return f.replace(/\\n$/,\"\")},p=[\"kind\",\"multi\",\"resolve\",\"construct\",\"instanceOf\",\"predicate\",\"represent\",\"representName\",\"defaultStyle\",\"styleAliases\"],f=[\"scalar\",\"sequence\",\"mapping\"];var h=function(e,t){if(t=t||{},Object.keys(t).forEach((function(t){if(-1===p.indexOf(t))throw new s('Unknown option \"'+t+'\" is met in definition of \"'+e+'\" YAML type.')})),this.options=t,this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=function(e){var t={};return null!==e&&Object.keys(e).forEach((function(n){e[n].forEach((function(e){t[String(e)]=n}))})),t}(t.styleAliases||null),-1===f.indexOf(this.kind))throw new s('Unknown kind \"'+this.kind+'\" is specified for \"'+e+'\" YAML type.')};function d(e,t){var n=[];return e[t].forEach((function(e){var t=n.length;n.forEach((function(n,r){n.tag===e.tag&&n.kind===e.kind&&n.multi===e.multi&&(t=r)})),n[t]=e})),n}function m(e){return this.extend(e)}m.prototype.extend=function(e){var t=[],n=[];if(e instanceof h)n.push(e);else if(Array.isArray(e))n=n.concat(e);else{if(!e||!Array.isArray(e.implicit)&&!Array.isArray(e.explicit))throw new s(\"Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })\");e.implicit&&(t=t.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit))}t.forEach((function(e){if(!(e instanceof h))throw new s(\"Specified list of YAML types (or a single Type object) contains a non-Type object.\");if(e.loadKind&&\"scalar\"!==e.loadKind)throw new s(\"There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.\");if(e.multi)throw new s(\"There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.\")})),n.forEach((function(e){if(!(e instanceof h))throw new s(\"Specified list of YAML types (or a single Type object) contains a non-Type object.\")}));var r=Object.create(m.prototype);return r.implicit=(this.implicit||[]).concat(t),r.explicit=(this.explicit||[]).concat(n),r.compiledImplicit=d(r,\"implicit\"),r.compiledExplicit=d(r,\"explicit\"),r.compiledTypeMap=function(){var e,t,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function r(e){e.multi?(n.multi[e.kind].push(e),n.multi.fallback.push(e)):n[e.kind][e.tag]=n.fallback[e.tag]=e}for(e=0,t=arguments.length;e<t;e+=1)arguments[e].forEach(r);return n}(r.compiledImplicit,r.compiledExplicit),r};var v=m,g=new h(\"tag:yaml.org,2002:str\",{kind:\"scalar\",construct:function(e){return null!==e?e:\"\"}}),y=new h(\"tag:yaml.org,2002:seq\",{kind:\"sequence\",construct:function(e){return null!==e?e:[]}}),b=new h(\"tag:yaml.org,2002:map\",{kind:\"mapping\",construct:function(e){return null!==e?e:{}}}),_=new v({explicit:[g,y,b]});var w=new h(\"tag:yaml.org,2002:null\",{kind:\"scalar\",resolve:function(e){if(null===e)return!0;var t=e.length;return 1===t&&\"~\"===e||4===t&&(\"null\"===e||\"Null\"===e||\"NULL\"===e)},construct:function(){return null},predicate:function(e){return null===e},represent:{canonical:function(){return\"~\"},lowercase:function(){return\"null\"},uppercase:function(){return\"NULL\"},camelcase:function(){return\"Null\"},empty:function(){return\"\"}},defaultStyle:\"lowercase\"});var x=new h(\"tag:yaml.org,2002:bool\",{kind:\"scalar\",resolve:function(e){if(null===e)return!1;var t=e.length;return 4===t&&(\"true\"===e||\"True\"===e||\"TRUE\"===e)||5===t&&(\"false\"===e||\"False\"===e||\"FALSE\"===e)},construct:function(e){return\"true\"===e||\"True\"===e||\"TRUE\"===e},predicate:function(e){return\"[object Boolean]\"===Object.prototype.toString.call(e)},represent:{lowercase:function(e){return e?\"true\":\"false\"},uppercase:function(e){return e?\"TRUE\":\"FALSE\"},camelcase:function(e){return e?\"True\":\"False\"}},defaultStyle:\"lowercase\"});function E(e){return 48<=e&&e<=55}function S(e){return 48<=e&&e<=57}var C=new h(\"tag:yaml.org,2002:int\",{kind:\"scalar\",resolve:function(e){if(null===e)return!1;var t,n,r=e.length,o=0,a=!1;if(!r)return!1;if(\"-\"!==(t=e[o])&&\"+\"!==t||(t=e[++o]),\"0\"===t){if(o+1===r)return!0;if(\"b\"===(t=e[++o])){for(o++;o<r;o++)if(\"_\"!==(t=e[o])){if(\"0\"!==t&&\"1\"!==t)return!1;a=!0}return a&&\"_\"!==t}if(\"x\"===t){for(o++;o<r;o++)if(\"_\"!==(t=e[o])){if(!(48<=(n=e.charCodeAt(o))&&n<=57||65<=n&&n<=70||97<=n&&n<=102))return!1;a=!0}return a&&\"_\"!==t}if(\"o\"===t){for(o++;o<r;o++)if(\"_\"!==(t=e[o])){if(!E(e.charCodeAt(o)))return!1;a=!0}return a&&\"_\"!==t}}if(\"_\"===t)return!1;for(;o<r;o++)if(\"_\"!==(t=e[o])){if(!S(e.charCodeAt(o)))return!1;a=!0}return!(!a||\"_\"===t)},construct:function(e){var t,n=e,r=1;if(-1!==n.indexOf(\"_\")&&(n=n.replace(/_/g,\"\")),\"-\"!==(t=n[0])&&\"+\"!==t||(\"-\"===t&&(r=-1),t=(n=n.slice(1))[0]),\"0\"===n)return 0;if(\"0\"===t){if(\"b\"===n[1])return r*parseInt(n.slice(2),2);if(\"x\"===n[1])return r*parseInt(n.slice(2),16);if(\"o\"===n[1])return r*parseInt(n.slice(2),8)}return r*parseInt(n,10)},predicate:function(e){return\"[object Number]\"===Object.prototype.toString.call(e)&&e%1==0&&!o.isNegativeZero(e)},represent:{binary:function(e){return e>=0?\"0b\"+e.toString(2):\"-0b\"+e.toString(2).slice(1)},octal:function(e){return e>=0?\"0o\"+e.toString(8):\"-0o\"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?\"0x\"+e.toString(16).toUpperCase():\"-0x\"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:\"decimal\",styleAliases:{binary:[2,\"bin\"],octal:[8,\"oct\"],decimal:[10,\"dec\"],hexadecimal:[16,\"hex\"]}}),A=new RegExp(\"^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");var k=/^[-+]?[0-9]+e/;var O=new h(\"tag:yaml.org,2002:float\",{kind:\"scalar\",resolve:function(e){return null!==e&&!(!A.test(e)||\"_\"===e[e.length-1])},construct:function(e){var t,n;return n=\"-\"===(t=e.replace(/_/g,\"\").toLowerCase())[0]?-1:1,\"+-\".indexOf(t[0])>=0&&(t=t.slice(1)),\".inf\"===t?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:\".nan\"===t?NaN:n*parseFloat(t,10)},predicate:function(e){return\"[object Number]\"===Object.prototype.toString.call(e)&&(e%1!=0||o.isNegativeZero(e))},represent:function(e,t){var n;if(isNaN(e))switch(t){case\"lowercase\":return\".nan\";case\"uppercase\":return\".NAN\";case\"camelcase\":return\".NaN\"}else if(Number.POSITIVE_INFINITY===e)switch(t){case\"lowercase\":return\".inf\";case\"uppercase\":return\".INF\";case\"camelcase\":return\".Inf\"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case\"lowercase\":return\"-.inf\";case\"uppercase\":return\"-.INF\";case\"camelcase\":return\"-.Inf\"}else if(o.isNegativeZero(e))return\"-0.0\";return n=e.toString(10),k.test(n)?n.replace(\"e\",\".e\"):n},defaultStyle:\"lowercase\"}),j=_.extend({implicit:[w,x,C,O]}),T=j,I=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\"),P=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");var N=new h(\"tag:yaml.org,2002:timestamp\",{kind:\"scalar\",resolve:function(e){return null!==e&&(null!==I.exec(e)||null!==P.exec(e))},construct:function(e){var t,n,r,o,a,i,s,u,c=0,l=null;if(null===(t=I.exec(e))&&(t=P.exec(e)),null===t)throw new Error(\"Date resolve error\");if(n=+t[1],r=+t[2]-1,o=+t[3],!t[4])return new Date(Date.UTC(n,r,o));if(a=+t[4],i=+t[5],s=+t[6],t[7]){for(c=t[7].slice(0,3);c.length<3;)c+=\"0\";c=+c}return t[9]&&(l=6e4*(60*+t[10]+ +(t[11]||0)),\"-\"===t[9]&&(l=-l)),u=new Date(Date.UTC(n,r,o,a,i,s,c)),l&&u.setTime(u.getTime()-l),u},instanceOf:Date,represent:function(e){return e.toISOString()}});var M=new h(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:function(e){return\"<<\"===e||null===e}}),R=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r\";var D=new h(\"tag:yaml.org,2002:binary\",{kind:\"scalar\",resolve:function(e){if(null===e)return!1;var t,n,r=0,o=e.length,a=R;for(n=0;n<o;n++)if(!((t=a.indexOf(e.charAt(n)))>64)){if(t<0)return!1;r+=6}return r%8==0},construct:function(e){var t,n,r=e.replace(/[\\r\\n=]/g,\"\"),o=r.length,a=R,i=0,s=[];for(t=0;t<o;t++)t%4==0&&t&&(s.push(i>>16&255),s.push(i>>8&255),s.push(255&i)),i=i<<6|a.indexOf(r.charAt(t));return 0===(n=o%4*6)?(s.push(i>>16&255),s.push(i>>8&255),s.push(255&i)):18===n?(s.push(i>>10&255),s.push(i>>2&255)):12===n&&s.push(i>>4&255),new Uint8Array(s)},predicate:function(e){return\"[object Uint8Array]\"===Object.prototype.toString.call(e)},represent:function(e){var t,n,r=\"\",o=0,a=e.length,i=R;for(t=0;t<a;t++)t%3==0&&t&&(r+=i[o>>18&63],r+=i[o>>12&63],r+=i[o>>6&63],r+=i[63&o]),o=(o<<8)+e[t];return 0===(n=a%3)?(r+=i[o>>18&63],r+=i[o>>12&63],r+=i[o>>6&63],r+=i[63&o]):2===n?(r+=i[o>>10&63],r+=i[o>>4&63],r+=i[o<<2&63],r+=i[64]):1===n&&(r+=i[o>>2&63],r+=i[o<<4&63],r+=i[64],r+=i[64]),r}}),L=Object.prototype.hasOwnProperty,B=Object.prototype.toString;var F=new h(\"tag:yaml.org,2002:omap\",{kind:\"sequence\",resolve:function(e){if(null===e)return!0;var t,n,r,o,a,i=[],s=e;for(t=0,n=s.length;t<n;t+=1){if(r=s[t],a=!1,\"[object Object]\"!==B.call(r))return!1;for(o in r)if(L.call(r,o)){if(a)return!1;a=!0}if(!a)return!1;if(-1!==i.indexOf(o))return!1;i.push(o)}return!0},construct:function(e){return null!==e?e:[]}}),U=Object.prototype.toString;var q=new h(\"tag:yaml.org,2002:pairs\",{kind:\"sequence\",resolve:function(e){if(null===e)return!0;var t,n,r,o,a,i=e;for(a=new Array(i.length),t=0,n=i.length;t<n;t+=1){if(r=i[t],\"[object Object]\"!==U.call(r))return!1;if(1!==(o=Object.keys(r)).length)return!1;a[t]=[o[0],r[o[0]]]}return!0},construct:function(e){if(null===e)return[];var t,n,r,o,a,i=e;for(a=new Array(i.length),t=0,n=i.length;t<n;t+=1)r=i[t],o=Object.keys(r),a[t]=[o[0],r[o[0]]];return a}}),z=Object.prototype.hasOwnProperty;var V=new h(\"tag:yaml.org,2002:set\",{kind:\"mapping\",resolve:function(e){if(null===e)return!0;var t,n=e;for(t in n)if(z.call(n,t)&&null!==n[t])return!1;return!0},construct:function(e){return null!==e?e:{}}}),W=T.extend({implicit:[N,M],explicit:[D,F,q,V]}),H=Object.prototype.hasOwnProperty,$=/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,J=/[\\x85\\u2028\\u2029]/,K=/[,\\[\\]\\{\\}]/,Y=/^(?:!|!!|![a-z\\-]+!)$/i,G=/^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;function Z(e){return Object.prototype.toString.call(e)}function X(e){return 10===e||13===e}function Q(e){return 9===e||32===e}function ee(e){return 9===e||32===e||10===e||13===e}function te(e){return 44===e||91===e||93===e||123===e||125===e}function ne(e){var t;return 48<=e&&e<=57?e-48:97<=(t=32|e)&&t<=102?t-97+10:-1}function re(e){return 48===e?\"\\0\":97===e?\"\u0007\":98===e?\"\\b\":116===e||9===e?\"\\t\":110===e?\"\\n\":118===e?\"\\v\":102===e?\"\\f\":114===e?\"\\r\":101===e?\"\u001b\":32===e?\" \":34===e?'\"':47===e?\"/\":92===e?\"\\\\\":78===e?\"\":95===e?\" \":76===e?\"\\u2028\":80===e?\"\\u2029\":\"\"}function oe(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(55296+(e-65536>>10),56320+(e-65536&1023))}for(var ae=new Array(256),ie=new Array(256),se=0;se<256;se++)ae[se]=re(se)?1:0,ie[se]=re(se);function ue(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||W,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function ce(e,t){var n={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return n.snippet=l(n),new s(t,n)}function le(e,t){throw ce(e,t)}function pe(e,t){e.onWarning&&e.onWarning.call(null,ce(e,t))}var fe={YAML:function(e,t,n){var r,o,a;null!==e.version&&le(e,\"duplication of %YAML directive\"),1!==n.length&&le(e,\"YAML directive accepts exactly one argument\"),null===(r=/^([0-9]+)\\.([0-9]+)$/.exec(n[0]))&&le(e,\"ill-formed argument of the YAML directive\"),o=parseInt(r[1],10),a=parseInt(r[2],10),1!==o&&le(e,\"unacceptable YAML version of the document\"),e.version=n[0],e.checkLineBreaks=a<2,1!==a&&2!==a&&pe(e,\"unsupported YAML version of the document\")},TAG:function(e,t,n){var r,o;2!==n.length&&le(e,\"TAG directive accepts exactly two arguments\"),r=n[0],o=n[1],Y.test(r)||le(e,\"ill-formed tag handle (first argument) of the TAG directive\"),H.call(e.tagMap,r)&&le(e,'there is a previously declared suffix for \"'+r+'\" tag handle'),G.test(o)||le(e,\"ill-formed tag prefix (second argument) of the TAG directive\");try{o=decodeURIComponent(o)}catch(t){le(e,\"tag prefix is malformed: \"+o)}e.tagMap[r]=o}};function he(e,t,n,r){var o,a,i,s;if(t<n){if(s=e.input.slice(t,n),r)for(o=0,a=s.length;o<a;o+=1)9===(i=s.charCodeAt(o))||32<=i&&i<=1114111||le(e,\"expected valid JSON character\");else $.test(s)&&le(e,\"the stream contains non-printable characters\");e.result+=s}}function de(e,t,n,r){var a,i,s,u;for(o.isObject(n)||le(e,\"cannot merge mappings; the provided source object is unacceptable\"),s=0,u=(a=Object.keys(n)).length;s<u;s+=1)i=a[s],H.call(t,i)||(t[i]=n[i],r[i]=!0)}function me(e,t,n,r,o,a,i,s,u){var c,l;if(Array.isArray(o))for(c=0,l=(o=Array.prototype.slice.call(o)).length;c<l;c+=1)Array.isArray(o[c])&&le(e,\"nested arrays are not supported inside keys\"),\"object\"==typeof o&&\"[object Object]\"===Z(o[c])&&(o[c]=\"[object Object]\");if(\"object\"==typeof o&&\"[object Object]\"===Z(o)&&(o=\"[object Object]\"),o=String(o),null===t&&(t={}),\"tag:yaml.org,2002:merge\"===r)if(Array.isArray(a))for(c=0,l=a.length;c<l;c+=1)de(e,t,a[c],n);else de(e,t,a,n);else e.json||H.call(n,o)||!H.call(t,o)||(e.line=i||e.line,e.lineStart=s||e.lineStart,e.position=u||e.position,le(e,\"duplicated mapping key\")),\"__proto__\"===o?Object.defineProperty(t,o,{configurable:!0,enumerable:!0,writable:!0,value:a}):t[o]=a,delete n[o];return t}function ve(e){var t;10===(t=e.input.charCodeAt(e.position))?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):le(e,\"a line break is expected\"),e.line+=1,e.lineStart=e.position,e.firstTabInLine=-1}function ge(e,t,n){for(var r=0,o=e.input.charCodeAt(e.position);0!==o;){for(;Q(o);)9===o&&-1===e.firstTabInLine&&(e.firstTabInLine=e.position),o=e.input.charCodeAt(++e.position);if(t&&35===o)do{o=e.input.charCodeAt(++e.position)}while(10!==o&&13!==o&&0!==o);if(!X(o))break;for(ve(e),o=e.input.charCodeAt(e.position),r++,e.lineIndent=0;32===o;)e.lineIndent++,o=e.input.charCodeAt(++e.position)}return-1!==n&&0!==r&&e.lineIndent<n&&pe(e,\"deficient indentation\"),r}function ye(e){var t,n=e.position;return!(45!==(t=e.input.charCodeAt(n))&&46!==t||t!==e.input.charCodeAt(n+1)||t!==e.input.charCodeAt(n+2)||(n+=3,0!==(t=e.input.charCodeAt(n))&&!ee(t)))}function be(e,t){1===t?e.result+=\" \":t>1&&(e.result+=o.repeat(\"\\n\",t-1))}function _e(e,t){var n,r,o=e.tag,a=e.anchor,i=[],s=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=i),r=e.input.charCodeAt(e.position);0!==r&&(-1!==e.firstTabInLine&&(e.position=e.firstTabInLine,le(e,\"tab characters must not be used in indentation\")),45===r)&&ee(e.input.charCodeAt(e.position+1));)if(s=!0,e.position++,ge(e,!0,-1)&&e.lineIndent<=t)i.push(null),r=e.input.charCodeAt(e.position);else if(n=e.line,Ee(e,t,3,!1,!0),i.push(e.result),ge(e,!0,-1),r=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==r)le(e,\"bad indentation of a sequence entry\");else if(e.lineIndent<t)break;return!!s&&(e.tag=o,e.anchor=a,e.kind=\"sequence\",e.result=i,!0)}function we(e){var t,n,r,o,a=!1,i=!1;if(33!==(o=e.input.charCodeAt(e.position)))return!1;if(null!==e.tag&&le(e,\"duplication of a tag property\"),60===(o=e.input.charCodeAt(++e.position))?(a=!0,o=e.input.charCodeAt(++e.position)):33===o?(i=!0,n=\"!!\",o=e.input.charCodeAt(++e.position)):n=\"!\",t=e.position,a){do{o=e.input.charCodeAt(++e.position)}while(0!==o&&62!==o);e.position<e.length?(r=e.input.slice(t,e.position),o=e.input.charCodeAt(++e.position)):le(e,\"unexpected end of the stream within a verbatim tag\")}else{for(;0!==o&&!ee(o);)33===o&&(i?le(e,\"tag suffix cannot contain exclamation marks\"):(n=e.input.slice(t-1,e.position+1),Y.test(n)||le(e,\"named tag handle cannot contain such characters\"),i=!0,t=e.position+1)),o=e.input.charCodeAt(++e.position);r=e.input.slice(t,e.position),K.test(r)&&le(e,\"tag suffix cannot contain flow indicator characters\")}r&&!G.test(r)&&le(e,\"tag name cannot contain such characters: \"+r);try{r=decodeURIComponent(r)}catch(t){le(e,\"tag name is malformed: \"+r)}return a?e.tag=r:H.call(e.tagMap,n)?e.tag=e.tagMap[n]+r:\"!\"===n?e.tag=\"!\"+r:\"!!\"===n?e.tag=\"tag:yaml.org,2002:\"+r:le(e,'undeclared tag handle \"'+n+'\"'),!0}function xe(e){var t,n;if(38!==(n=e.input.charCodeAt(e.position)))return!1;for(null!==e.anchor&&le(e,\"duplication of an anchor property\"),n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!ee(n)&&!te(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&le(e,\"name of an anchor node must contain at least one character\"),e.anchor=e.input.slice(t,e.position),!0}function Ee(e,t,n,r,a){var i,s,u,c,l,p,f,h,d,m=1,v=!1,g=!1;if(null!==e.listener&&e.listener(\"open\",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null,i=s=u=4===n||3===n,r&&ge(e,!0,-1)&&(v=!0,e.lineIndent>t?m=1:e.lineIndent===t?m=0:e.lineIndent<t&&(m=-1)),1===m)for(;we(e)||xe(e);)ge(e,!0,-1)?(v=!0,u=i,e.lineIndent>t?m=1:e.lineIndent===t?m=0:e.lineIndent<t&&(m=-1)):u=!1;if(u&&(u=v||a),1!==m&&4!==n||(h=1===n||2===n?t:t+1,d=e.position-e.lineStart,1===m?u&&(_e(e,d)||function(e,t,n){var r,o,a,i,s,u,c,l=e.tag,p=e.anchor,f={},h=Object.create(null),d=null,m=null,v=null,g=!1,y=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=f),c=e.input.charCodeAt(e.position);0!==c;){if(g||-1===e.firstTabInLine||(e.position=e.firstTabInLine,le(e,\"tab characters must not be used in indentation\")),r=e.input.charCodeAt(e.position+1),a=e.line,63!==c&&58!==c||!ee(r)){if(i=e.line,s=e.lineStart,u=e.position,!Ee(e,n,2,!1,!0))break;if(e.line===a){for(c=e.input.charCodeAt(e.position);Q(c);)c=e.input.charCodeAt(++e.position);if(58===c)ee(c=e.input.charCodeAt(++e.position))||le(e,\"a whitespace character is expected after the key-value separator within a block mapping\"),g&&(me(e,f,h,d,m,null,i,s,u),d=m=v=null),y=!0,g=!1,o=!1,d=e.tag,m=e.result;else{if(!y)return e.tag=l,e.anchor=p,!0;le(e,\"can not read an implicit mapping pair; a colon is missed\")}}else{if(!y)return e.tag=l,e.anchor=p,!0;le(e,\"can not read a block mapping entry; a multiline key may not be an implicit key\")}}else 63===c?(g&&(me(e,f,h,d,m,null,i,s,u),d=m=v=null),y=!0,g=!0,o=!0):g?(g=!1,o=!0):le(e,\"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line\"),e.position+=1,c=r;if((e.line===a||e.lineIndent>t)&&(g&&(i=e.line,s=e.lineStart,u=e.position),Ee(e,t,4,!0,o)&&(g?m=e.result:v=e.result),g||(me(e,f,h,d,m,v,i,s,u),d=m=v=null),ge(e,!0,-1),c=e.input.charCodeAt(e.position)),(e.line===a||e.lineIndent>t)&&0!==c)le(e,\"bad indentation of a mapping entry\");else if(e.lineIndent<t)break}return g&&me(e,f,h,d,m,null,i,s,u),y&&(e.tag=l,e.anchor=p,e.kind=\"mapping\",e.result=f),y}(e,d,h))||function(e,t){var n,r,o,a,i,s,u,c,l,p,f,h,d=!0,m=e.tag,v=e.anchor,g=Object.create(null);if(91===(h=e.input.charCodeAt(e.position)))i=93,c=!1,a=[];else{if(123!==h)return!1;i=125,c=!0,a={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=a),h=e.input.charCodeAt(++e.position);0!==h;){if(ge(e,!0,t),(h=e.input.charCodeAt(e.position))===i)return e.position++,e.tag=m,e.anchor=v,e.kind=c?\"mapping\":\"sequence\",e.result=a,!0;d?44===h&&le(e,\"expected the node content, but found ','\"):le(e,\"missed comma between flow collection entries\"),f=null,s=u=!1,63===h&&ee(e.input.charCodeAt(e.position+1))&&(s=u=!0,e.position++,ge(e,!0,t)),n=e.line,r=e.lineStart,o=e.position,Ee(e,t,1,!1,!0),p=e.tag,l=e.result,ge(e,!0,t),h=e.input.charCodeAt(e.position),!u&&e.line!==n||58!==h||(s=!0,h=e.input.charCodeAt(++e.position),ge(e,!0,t),Ee(e,t,1,!1,!0),f=e.result),c?me(e,a,g,p,l,f,n,r,o):s?a.push(me(e,null,g,p,l,f,n,r,o)):a.push(l),ge(e,!0,t),44===(h=e.input.charCodeAt(e.position))?(d=!0,h=e.input.charCodeAt(++e.position)):d=!1}le(e,\"unexpected end of the stream within a flow collection\")}(e,h)?g=!0:(s&&function(e,t){var n,r,a,i,s,u=1,c=!1,l=!1,p=t,f=0,h=!1;if(124===(i=e.input.charCodeAt(e.position)))r=!1;else{if(62!==i)return!1;r=!0}for(e.kind=\"scalar\",e.result=\"\";0!==i;)if(43===(i=e.input.charCodeAt(++e.position))||45===i)1===u?u=43===i?3:2:le(e,\"repeat of a chomping mode identifier\");else{if(!((a=48<=(s=i)&&s<=57?s-48:-1)>=0))break;0===a?le(e,\"bad explicit indentation width of a block scalar; it cannot be less than one\"):l?le(e,\"repeat of an indentation width identifier\"):(p=t+a-1,l=!0)}if(Q(i)){do{i=e.input.charCodeAt(++e.position)}while(Q(i));if(35===i)do{i=e.input.charCodeAt(++e.position)}while(!X(i)&&0!==i)}for(;0!==i;){for(ve(e),e.lineIndent=0,i=e.input.charCodeAt(e.position);(!l||e.lineIndent<p)&&32===i;)e.lineIndent++,i=e.input.charCodeAt(++e.position);if(!l&&e.lineIndent>p&&(p=e.lineIndent),X(i))f++;else{if(e.lineIndent<p){3===u?e.result+=o.repeat(\"\\n\",c?1+f:f):1===u&&c&&(e.result+=\"\\n\");break}for(r?Q(i)?(h=!0,e.result+=o.repeat(\"\\n\",c?1+f:f)):h?(h=!1,e.result+=o.repeat(\"\\n\",f+1)):0===f?c&&(e.result+=\" \"):e.result+=o.repeat(\"\\n\",f):e.result+=o.repeat(\"\\n\",c?1+f:f),c=!0,l=!0,f=0,n=e.position;!X(i)&&0!==i;)i=e.input.charCodeAt(++e.position);he(e,n,e.position,!1)}}return!0}(e,h)||function(e,t){var n,r,o;if(39!==(n=e.input.charCodeAt(e.position)))return!1;for(e.kind=\"scalar\",e.result=\"\",e.position++,r=o=e.position;0!==(n=e.input.charCodeAt(e.position));)if(39===n){if(he(e,r,e.position,!0),39!==(n=e.input.charCodeAt(++e.position)))return!0;r=e.position,e.position++,o=e.position}else X(n)?(he(e,r,o,!0),be(e,ge(e,!1,t)),r=o=e.position):e.position===e.lineStart&&ye(e)?le(e,\"unexpected end of the document within a single quoted scalar\"):(e.position++,o=e.position);le(e,\"unexpected end of the stream within a single quoted scalar\")}(e,h)||function(e,t){var n,r,o,a,i,s,u;if(34!==(s=e.input.charCodeAt(e.position)))return!1;for(e.kind=\"scalar\",e.result=\"\",e.position++,n=r=e.position;0!==(s=e.input.charCodeAt(e.position));){if(34===s)return he(e,n,e.position,!0),e.position++,!0;if(92===s){if(he(e,n,e.position,!0),X(s=e.input.charCodeAt(++e.position)))ge(e,!1,t);else if(s<256&&ae[s])e.result+=ie[s],e.position++;else if((i=120===(u=s)?2:117===u?4:85===u?8:0)>0){for(o=i,a=0;o>0;o--)(i=ne(s=e.input.charCodeAt(++e.position)))>=0?a=(a<<4)+i:le(e,\"expected hexadecimal character\");e.result+=oe(a),e.position++}else le(e,\"unknown escape sequence\");n=r=e.position}else X(s)?(he(e,n,r,!0),be(e,ge(e,!1,t)),n=r=e.position):e.position===e.lineStart&&ye(e)?le(e,\"unexpected end of the document within a double quoted scalar\"):(e.position++,r=e.position)}le(e,\"unexpected end of the stream within a double quoted scalar\")}(e,h)?g=!0:!function(e){var t,n,r;if(42!==(r=e.input.charCodeAt(e.position)))return!1;for(r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!ee(r)&&!te(r);)r=e.input.charCodeAt(++e.position);return e.position===t&&le(e,\"name of an alias node must contain at least one character\"),n=e.input.slice(t,e.position),H.call(e.anchorMap,n)||le(e,'unidentified alias \"'+n+'\"'),e.result=e.anchorMap[n],ge(e,!0,-1),!0}(e)?function(e,t,n){var r,o,a,i,s,u,c,l,p=e.kind,f=e.result;if(ee(l=e.input.charCodeAt(e.position))||te(l)||35===l||38===l||42===l||33===l||124===l||62===l||39===l||34===l||37===l||64===l||96===l)return!1;if((63===l||45===l)&&(ee(r=e.input.charCodeAt(e.position+1))||n&&te(r)))return!1;for(e.kind=\"scalar\",e.result=\"\",o=a=e.position,i=!1;0!==l;){if(58===l){if(ee(r=e.input.charCodeAt(e.position+1))||n&&te(r))break}else if(35===l){if(ee(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&ye(e)||n&&te(l))break;if(X(l)){if(s=e.line,u=e.lineStart,c=e.lineIndent,ge(e,!1,-1),e.lineIndent>=t){i=!0,l=e.input.charCodeAt(e.position);continue}e.position=a,e.line=s,e.lineStart=u,e.lineIndent=c;break}}i&&(he(e,o,a,!1),be(e,e.line-s),o=a=e.position,i=!1),Q(l)||(a=e.position+1),l=e.input.charCodeAt(++e.position)}return he(e,o,a,!1),!!e.result||(e.kind=p,e.result=f,!1)}(e,h,1===n)&&(g=!0,null===e.tag&&(e.tag=\"?\")):(g=!0,null===e.tag&&null===e.anchor||le(e,\"alias node should not have any properties\")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===m&&(g=u&&_e(e,d))),null===e.tag)null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);else if(\"?\"===e.tag){for(null!==e.result&&\"scalar\"!==e.kind&&le(e,'unacceptable node kind for !<?> tag; it should be \"scalar\", not \"'+e.kind+'\"'),c=0,l=e.implicitTypes.length;c<l;c+=1)if((f=e.implicitTypes[c]).resolve(e.result)){e.result=f.construct(e.result),e.tag=f.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else if(\"!\"!==e.tag){if(H.call(e.typeMap[e.kind||\"fallback\"],e.tag))f=e.typeMap[e.kind||\"fallback\"][e.tag];else for(f=null,c=0,l=(p=e.typeMap.multi[e.kind||\"fallback\"]).length;c<l;c+=1)if(e.tag.slice(0,p[c].tag.length)===p[c].tag){f=p[c];break}f||le(e,\"unknown tag !<\"+e.tag+\">\"),null!==e.result&&f.kind!==e.kind&&le(e,\"unacceptable node kind for !<\"+e.tag+'> tag; it should be \"'+f.kind+'\", not \"'+e.kind+'\"'),f.resolve(e.result,e.tag)?(e.result=f.construct(e.result,e.tag),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):le(e,\"cannot resolve a node with !<\"+e.tag+\"> explicit tag\")}return null!==e.listener&&e.listener(\"close\",e),null!==e.tag||null!==e.anchor||g}function Se(e){var t,n,r,o,a=e.position,i=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);0!==(o=e.input.charCodeAt(e.position))&&(ge(e,!0,-1),o=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==o));){for(i=!0,o=e.input.charCodeAt(++e.position),t=e.position;0!==o&&!ee(o);)o=e.input.charCodeAt(++e.position);for(r=[],(n=e.input.slice(t,e.position)).length<1&&le(e,\"directive name must not be less than one character in length\");0!==o;){for(;Q(o);)o=e.input.charCodeAt(++e.position);if(35===o){do{o=e.input.charCodeAt(++e.position)}while(0!==o&&!X(o));break}if(X(o))break;for(t=e.position;0!==o&&!ee(o);)o=e.input.charCodeAt(++e.position);r.push(e.input.slice(t,e.position))}0!==o&&ve(e),H.call(fe,n)?fe[n](e,n,r):pe(e,'unknown document directive \"'+n+'\"')}ge(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,ge(e,!0,-1)):i&&le(e,\"directives end mark is expected\"),Ee(e,e.lineIndent-1,4,!1,!0),ge(e,!0,-1),e.checkLineBreaks&&J.test(e.input.slice(a,e.position))&&pe(e,\"non-ASCII line breaks are interpreted as content\"),e.documents.push(e.result),e.position===e.lineStart&&ye(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,ge(e,!0,-1)):e.position<e.length-1&&le(e,\"end of the stream or a document separator is expected\")}function Ce(e,t){t=t||{},0!==(e=String(e)).length&&(10!==e.charCodeAt(e.length-1)&&13!==e.charCodeAt(e.length-1)&&(e+=\"\\n\"),65279===e.charCodeAt(0)&&(e=e.slice(1)));var n=new ue(e,t),r=e.indexOf(\"\\0\");for(-1!==r&&(n.position=r,le(n,\"null byte is not allowed in input\")),n.input+=\"\\0\";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)Se(n);return n.documents}var Ae={loadAll:function(e,t,n){null!==t&&\"object\"==typeof t&&void 0===n&&(n=t,t=null);var r=Ce(e,n);if(\"function\"!=typeof t)return r;for(var o=0,a=r.length;o<a;o+=1)t(r[o])},load:function(e,t){var n=Ce(e,t);if(0!==n.length){if(1===n.length)return n[0];throw new s(\"expected a single document in the stream, but found more\")}}},ke=Object.prototype.toString,Oe=Object.prototype.hasOwnProperty,je=65279,Te={0:\"\\\\0\",7:\"\\\\a\",8:\"\\\\b\",9:\"\\\\t\",10:\"\\\\n\",11:\"\\\\v\",12:\"\\\\f\",13:\"\\\\r\",27:\"\\\\e\",34:'\\\\\"',92:\"\\\\\\\\\",133:\"\\\\N\",160:\"\\\\_\",8232:\"\\\\L\",8233:\"\\\\P\"},Ie=[\"y\",\"Y\",\"yes\",\"Yes\",\"YES\",\"on\",\"On\",\"ON\",\"n\",\"N\",\"no\",\"No\",\"NO\",\"off\",\"Off\",\"OFF\"],Pe=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;function Ne(e){var t,n,r;if(t=e.toString(16).toUpperCase(),e<=255)n=\"x\",r=2;else if(e<=65535)n=\"u\",r=4;else{if(!(e<=4294967295))throw new s(\"code point within a string may not be greater than 0xFFFFFFFF\");n=\"U\",r=8}return\"\\\\\"+n+o.repeat(\"0\",r-t.length)+t}function Me(e){this.schema=e.schema||W,this.indent=Math.max(1,e.indent||2),this.noArrayIndent=e.noArrayIndent||!1,this.skipInvalid=e.skipInvalid||!1,this.flowLevel=o.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=function(e,t){var n,r,o,a,i,s,u;if(null===t)return{};for(n={},o=0,a=(r=Object.keys(t)).length;o<a;o+=1)i=r[o],s=String(t[i]),\"!!\"===i.slice(0,2)&&(i=\"tag:yaml.org,2002:\"+i.slice(2)),(u=e.compiledTypeMap.fallback[i])&&Oe.call(u.styleAliases,s)&&(s=u.styleAliases[s]),n[i]=s;return n}(this.schema,e.styles||null),this.sortKeys=e.sortKeys||!1,this.lineWidth=e.lineWidth||80,this.noRefs=e.noRefs||!1,this.noCompatMode=e.noCompatMode||!1,this.condenseFlow=e.condenseFlow||!1,this.quotingType='\"'===e.quotingType?2:1,this.forceQuotes=e.forceQuotes||!1,this.replacer=\"function\"==typeof e.replacer?e.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result=\"\",this.duplicates=[],this.usedDuplicates=null}function Re(e,t){for(var n,r=o.repeat(\" \",t),a=0,i=-1,s=\"\",u=e.length;a<u;)-1===(i=e.indexOf(\"\\n\",a))?(n=e.slice(a),a=u):(n=e.slice(a,i+1),a=i+1),n.length&&\"\\n\"!==n&&(s+=r),s+=n;return s}function De(e,t){return\"\\n\"+o.repeat(\" \",e.indent*t)}function Le(e){return 32===e||9===e}function Be(e){return 32<=e&&e<=126||161<=e&&e<=55295&&8232!==e&&8233!==e||57344<=e&&e<=65533&&e!==je||65536<=e&&e<=1114111}function Fe(e){return Be(e)&&e!==je&&13!==e&&10!==e}function Ue(e,t,n){var r=Fe(e),o=r&&!Le(e);return(n?r:r&&44!==e&&91!==e&&93!==e&&123!==e&&125!==e)&&35!==e&&!(58===t&&!o)||Fe(t)&&!Le(t)&&35===e||58===t&&o}function qe(e,t){var n,r=e.charCodeAt(t);return r>=55296&&r<=56319&&t+1<e.length&&(n=e.charCodeAt(t+1))>=56320&&n<=57343?1024*(r-55296)+n-56320+65536:r}function ze(e){return/^\\n* /.test(e)}function Ve(e,t,n,r,o,a,i,s){var u,c,l=0,p=null,f=!1,h=!1,d=-1!==r,m=-1,v=Be(c=qe(e,0))&&c!==je&&!Le(c)&&45!==c&&63!==c&&58!==c&&44!==c&&91!==c&&93!==c&&123!==c&&125!==c&&35!==c&&38!==c&&42!==c&&33!==c&&124!==c&&61!==c&&62!==c&&39!==c&&34!==c&&37!==c&&64!==c&&96!==c&&function(e){return!Le(e)&&58!==e}(qe(e,e.length-1));if(t||i)for(u=0;u<e.length;l>=65536?u+=2:u++){if(!Be(l=qe(e,u)))return 5;v=v&&Ue(l,p,s),p=l}else{for(u=0;u<e.length;l>=65536?u+=2:u++){if(10===(l=qe(e,u)))f=!0,d&&(h=h||u-m-1>r&&\" \"!==e[m+1],m=u);else if(!Be(l))return 5;v=v&&Ue(l,p,s),p=l}h=h||d&&u-m-1>r&&\" \"!==e[m+1]}return f||h?n>9&&ze(e)?5:i?2===a?5:2:h?4:3:!v||i||o(e)?2===a?5:2:1}function We(e,t,n,r,o){e.dump=function(){if(0===t.length)return 2===e.quotingType?'\"\"':\"''\";if(!e.noCompatMode&&(-1!==Ie.indexOf(t)||Pe.test(t)))return 2===e.quotingType?'\"'+t+'\"':\"'\"+t+\"'\";var a=e.indent*Math.max(1,n),i=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-a),u=r||e.flowLevel>-1&&n>=e.flowLevel;switch(Ve(t,u,e.indent,i,(function(t){return function(e,t){var n,r;for(n=0,r=e.implicitTypes.length;n<r;n+=1)if(e.implicitTypes[n].resolve(t))return!0;return!1}(e,t)}),e.quotingType,e.forceQuotes&&!r,o)){case 1:return t;case 2:return\"'\"+t.replace(/'/g,\"''\")+\"'\";case 3:return\"|\"+He(t,e.indent)+$e(Re(t,a));case 4:return\">\"+He(t,e.indent)+$e(Re(function(e,t){var n,r,o=/(\\n+)([^\\n]*)/g,a=(s=e.indexOf(\"\\n\"),s=-1!==s?s:e.length,o.lastIndex=s,Je(e.slice(0,s),t)),i=\"\\n\"===e[0]||\" \"===e[0];var s;for(;r=o.exec(e);){var u=r[1],c=r[2];n=\" \"===c[0],a+=u+(i||n||\"\"===c?\"\":\"\\n\")+Je(c,t),i=n}return a}(t,i),a));case 5:return'\"'+function(e){for(var t,n=\"\",r=0,o=0;o<e.length;r>=65536?o+=2:o++)r=qe(e,o),!(t=Te[r])&&Be(r)?(n+=e[o],r>=65536&&(n+=e[o+1])):n+=t||Ne(r);return n}(t)+'\"';default:throw new s(\"impossible error: invalid scalar style\")}}()}function He(e,t){var n=ze(e)?String(t):\"\",r=\"\\n\"===e[e.length-1];return n+(r&&(\"\\n\"===e[e.length-2]||\"\\n\"===e)?\"+\":r?\"\":\"-\")+\"\\n\"}function $e(e){return\"\\n\"===e[e.length-1]?e.slice(0,-1):e}function Je(e,t){if(\"\"===e||\" \"===e[0])return e;for(var n,r,o=/ [^ ]/g,a=0,i=0,s=0,u=\"\";n=o.exec(e);)(s=n.index)-a>t&&(r=i>a?i:s,u+=\"\\n\"+e.slice(a,r),a=r+1),i=s;return u+=\"\\n\",e.length-a>t&&i>a?u+=e.slice(a,i)+\"\\n\"+e.slice(i+1):u+=e.slice(a),u.slice(1)}function Ke(e,t,n,r){var o,a,i,s=\"\",u=e.tag;for(o=0,a=n.length;o<a;o+=1)i=n[o],e.replacer&&(i=e.replacer.call(n,String(o),i)),(Ge(e,t+1,i,!0,!0,!1,!0)||void 0===i&&Ge(e,t+1,null,!0,!0,!1,!0))&&(r&&\"\"===s||(s+=De(e,t)),e.dump&&10===e.dump.charCodeAt(0)?s+=\"-\":s+=\"- \",s+=e.dump);e.tag=u,e.dump=s||\"[]\"}function Ye(e,t,n){var r,o,a,i,u,c;for(a=0,i=(o=n?e.explicitTypes:e.implicitTypes).length;a<i;a+=1)if(((u=o[a]).instanceOf||u.predicate)&&(!u.instanceOf||\"object\"==typeof t&&t instanceof u.instanceOf)&&(!u.predicate||u.predicate(t))){if(n?u.multi&&u.representName?e.tag=u.representName(t):e.tag=u.tag:e.tag=\"?\",u.represent){if(c=e.styleMap[u.tag]||u.defaultStyle,\"[object Function]\"===ke.call(u.represent))r=u.represent(t,c);else{if(!Oe.call(u.represent,c))throw new s(\"!<\"+u.tag+'> tag resolver accepts not \"'+c+'\" style');r=u.represent[c](t,c)}e.dump=r}return!0}return!1}function Ge(e,t,n,r,o,a,i){e.tag=null,e.dump=n,Ye(e,n,!1)||Ye(e,n,!0);var u,c=ke.call(e.dump),l=r;r&&(r=e.flowLevel<0||e.flowLevel>t);var p,f,h=\"[object Object]\"===c||\"[object Array]\"===c;if(h&&(f=-1!==(p=e.duplicates.indexOf(n))),(null!==e.tag&&\"?\"!==e.tag||f||2!==e.indent&&t>0)&&(o=!1),f&&e.usedDuplicates[p])e.dump=\"*ref_\"+p;else{if(h&&f&&!e.usedDuplicates[p]&&(e.usedDuplicates[p]=!0),\"[object Object]\"===c)r&&0!==Object.keys(e.dump).length?(!function(e,t,n,r){var o,a,i,u,c,l,p=\"\",f=e.tag,h=Object.keys(n);if(!0===e.sortKeys)h.sort();else if(\"function\"==typeof e.sortKeys)h.sort(e.sortKeys);else if(e.sortKeys)throw new s(\"sortKeys must be a boolean or a function\");for(o=0,a=h.length;o<a;o+=1)l=\"\",r&&\"\"===p||(l+=De(e,t)),u=n[i=h[o]],e.replacer&&(u=e.replacer.call(n,i,u)),Ge(e,t+1,i,!0,!0,!0)&&((c=null!==e.tag&&\"?\"!==e.tag||e.dump&&e.dump.length>1024)&&(e.dump&&10===e.dump.charCodeAt(0)?l+=\"?\":l+=\"? \"),l+=e.dump,c&&(l+=De(e,t)),Ge(e,t+1,u,!0,c)&&(e.dump&&10===e.dump.charCodeAt(0)?l+=\":\":l+=\": \",p+=l+=e.dump));e.tag=f,e.dump=p||\"{}\"}(e,t,e.dump,o),f&&(e.dump=\"&ref_\"+p+e.dump)):(!function(e,t,n){var r,o,a,i,s,u=\"\",c=e.tag,l=Object.keys(n);for(r=0,o=l.length;r<o;r+=1)s=\"\",\"\"!==u&&(s+=\", \"),e.condenseFlow&&(s+='\"'),i=n[a=l[r]],e.replacer&&(i=e.replacer.call(n,a,i)),Ge(e,t,a,!1,!1)&&(e.dump.length>1024&&(s+=\"? \"),s+=e.dump+(e.condenseFlow?'\"':\"\")+\":\"+(e.condenseFlow?\"\":\" \"),Ge(e,t,i,!1,!1)&&(u+=s+=e.dump));e.tag=c,e.dump=\"{\"+u+\"}\"}(e,t,e.dump),f&&(e.dump=\"&ref_\"+p+\" \"+e.dump));else if(\"[object Array]\"===c)r&&0!==e.dump.length?(e.noArrayIndent&&!i&&t>0?Ke(e,t-1,e.dump,o):Ke(e,t,e.dump,o),f&&(e.dump=\"&ref_\"+p+e.dump)):(!function(e,t,n){var r,o,a,i=\"\",s=e.tag;for(r=0,o=n.length;r<o;r+=1)a=n[r],e.replacer&&(a=e.replacer.call(n,String(r),a)),(Ge(e,t,a,!1,!1)||void 0===a&&Ge(e,t,null,!1,!1))&&(\"\"!==i&&(i+=\",\"+(e.condenseFlow?\"\":\" \")),i+=e.dump);e.tag=s,e.dump=\"[\"+i+\"]\"}(e,t,e.dump),f&&(e.dump=\"&ref_\"+p+\" \"+e.dump));else{if(\"[object String]\"!==c){if(\"[object Undefined]\"===c)return!1;if(e.skipInvalid)return!1;throw new s(\"unacceptable kind of an object to dump \"+c)}\"?\"!==e.tag&&We(e,e.dump,t,a,l)}null!==e.tag&&\"?\"!==e.tag&&(u=encodeURI(\"!\"===e.tag[0]?e.tag.slice(1):e.tag).replace(/!/g,\"%21\"),u=\"!\"===e.tag[0]?\"!\"+u:\"tag:yaml.org,2002:\"===u.slice(0,18)?\"!!\"+u.slice(18):\"!<\"+u+\">\",e.dump=u+\" \"+e.dump)}return!0}function Ze(e,t){var n,r,o=[],a=[];for(Xe(e,o,a),n=0,r=a.length;n<r;n+=1)t.duplicates.push(o[a[n]]);t.usedDuplicates=new Array(r)}function Xe(e,t,n){var r,o,a;if(null!==e&&\"object\"==typeof e)if(-1!==(o=t.indexOf(e)))-1===n.indexOf(o)&&n.push(o);else if(t.push(e),Array.isArray(e))for(o=0,a=e.length;o<a;o+=1)Xe(e[o],t,n);else for(o=0,a=(r=Object.keys(e)).length;o<a;o+=1)Xe(e[r[o]],t,n)}function Qe(e,t){return function(){throw new Error(\"Function yaml.\"+e+\" is removed in js-yaml 4. Use yaml.\"+t+\" instead, which is now safe by default.\")}}var et={Type:h,Schema:v,FAILSAFE_SCHEMA:_,JSON_SCHEMA:j,CORE_SCHEMA:T,DEFAULT_SCHEMA:W,load:Ae.load,loadAll:Ae.loadAll,dump:{dump:function(e,t){var n=new Me(t=t||{});n.noRefs||Ze(e,n);var r=e;return n.replacer&&(r=n.replacer.call({\"\":r},\"\",r)),Ge(n,0,r,!0,!0)?n.dump+\"\\n\":\"\"}}.dump,YAMLException:s,types:{binary:D,float:O,map:b,null:w,pairs:q,set:V,timestamp:N,bool:x,int:C,merge:M,omap:F,seq:y,str:g},safeLoad:Qe(\"safeLoad\",\"load\"),safeLoadAll:Qe(\"safeLoadAll\",\"loadAll\"),safeDump:Qe(\"safeDump\",\"dump\")};t.a=et},function(e,t,n){e.exports=n(657)},function(e,t,n){var r=n(873);function o(e,t,n,o,a,i,s){try{var u=e[i](s),c=u.value}catch(e){return void n(e)}u.done?t(c):r.resolve(c).then(o,a)}e.exports=function(e){return function(){var t=this,n=arguments;return new r((function(r,a){var i=e.apply(t,n);function s(e){o(i,r,a,s,u,\"next\",e)}function u(e){o(i,r,a,s,u,\"throw\",e)}s(void 0)}))}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e){if(\"function\"!=typeof e)throw TypeError(String(e)+\" is not a function\");return e}},function(e,t,n){var r,o,a,i=n(367),s=n(40),u=n(47),c=n(67),l=n(55),p=n(228),f=n(181),h=n(156),d=\"Object already initialized\",m=s.WeakMap;if(i||p.state){var v=p.state||(p.state=new m),g=v.get,y=v.has,b=v.set;r=function(e,t){if(y.call(v,e))throw new TypeError(d);return t.facade=e,b.call(v,e,t),t},o=function(e){return g.call(v,e)||{}},a=function(e){return y.call(v,e)}}else{var _=f(\"state\");h[_]=!0,r=function(e,t){if(l(e,_))throw new TypeError(d);return t.facade=e,c(e,_,t),t},o=function(e){return l(e,_)?e[_]:{}},a=function(e){return l(e,_)}}e.exports={set:r,get:o,has:a,enforce:function(e){return a(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!u(t)||(n=o(t)).type!==e)throw TypeError(\"Incompatible receiver, \"+e+\" required\");return n}}}},function(e,t,n){\"use strict\";function r(e){return function(){return e}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},e.exports=o},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(471),i=n(122),s=n(472),u=n(141),c=n(202),l=n(25),p=[],f=0,h=a.getPooled(),d=!1,m=null;function v(){x.ReactReconcileTransaction&&m||r(\"123\")}var g=[{initialize:function(){this.dirtyComponentsLength=p.length},close:function(){this.dirtyComponentsLength!==p.length?(p.splice(0,this.dirtyComponentsLength),w()):p.length=0}},{initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}}];function y(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=a.getPooled(),this.reconcileTransaction=x.ReactReconcileTransaction.getPooled(!0)}function b(e,t){return e._mountOrder-t._mountOrder}function _(e){var t=e.dirtyComponentsLength;t!==p.length&&r(\"124\",t,p.length),p.sort(b),f++;for(var n=0;n<t;n++){var o,a=p[n],i=a._pendingCallbacks;if(a._pendingCallbacks=null,s.logTopLevelRenders){var c=a;a._currentElement.type.isReactTopLevelWrapper&&(c=a._renderedComponent),o=\"React update: \"+c.getName(),console.time(o)}if(u.performUpdateIfNecessary(a,e.reconcileTransaction,f),o&&console.timeEnd(o),i)for(var l=0;l<i.length;l++)e.callbackQueue.enqueue(i[l],a.getPublicInstance())}}o(y.prototype,c,{getTransactionWrappers:function(){return g},destructor:function(){this.dirtyComponentsLength=null,a.release(this.callbackQueue),this.callbackQueue=null,x.ReactReconcileTransaction.release(this.reconcileTransaction),this.reconcileTransaction=null},perform:function(e,t,n){return c.perform.call(this,this.reconcileTransaction.perform,this.reconcileTransaction,e,t,n)}}),i.addPoolingTo(y);var w=function(){for(;p.length||d;){if(p.length){var e=y.getPooled();e.perform(_,null,e),y.release(e)}if(d){d=!1;var t=h;h=a.getPooled(),t.notifyAll(),a.release(t)}}};var x={ReactReconcileTransaction:null,batchedUpdates:function(e,t,n,r,o,a){return v(),m.batchedUpdates(e,t,n,r,o,a)},enqueueUpdate:function e(t){v(),m.isBatchingUpdates?(p.push(t),null==t._updateBatchNumber&&(t._updateBatchNumber=f+1)):m.batchedUpdates(e,t)},flushBatchedUpdates:w,injection:{injectReconcileTransaction:function(e){e||r(\"126\"),x.ReactReconcileTransaction=e},injectBatchingStrategy:function(e){e||r(\"127\"),\"function\"!=typeof e.batchedUpdates&&r(\"128\"),\"boolean\"!=typeof e.isBatchingUpdates&&r(\"129\"),m=e}},asap:function(e,t){l(m.isBatchingUpdates,\"ReactUpdates.asap: Can't enqueue an asap callback in a context whereupdates are not being batched.\"),h.enqueue(e,t),d=!0}};e.exports=x},function(e,t,n){\"use strict\";(function(t){function n(e){return e instanceof t||e instanceof Date||e instanceof RegExp}function r(e){if(e instanceof t){var n=t.alloc?t.alloc(e.length):new t(e.length);return e.copy(n),n}if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e);throw new Error(\"Unexpected situation\")}function o(e){var t=[];return e.forEach((function(e,a){\"object\"==typeof e&&null!==e?Array.isArray(e)?t[a]=o(e):n(e)?t[a]=r(e):t[a]=i({},e):t[a]=e})),t}function a(e,t){return\"__proto__\"===t?void 0:e[t]}var i=e.exports=function(){if(arguments.length<1||\"object\"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var e,t,s=arguments[0],u=Array.prototype.slice.call(arguments,1);return u.forEach((function(u){\"object\"!=typeof u||null===u||Array.isArray(u)||Object.keys(u).forEach((function(c){return t=a(s,c),(e=a(u,c))===s?void 0:\"object\"!=typeof e||null===e?void(s[c]=e):Array.isArray(e)?void(s[c]=o(e)):n(e)?void(s[c]=r(e)):\"object\"!=typeof t||null===t||Array.isArray(t)?void(s[c]=i({},e)):void(s[c]=i(t,e))}))})),s}}).call(this,n(73).Buffer)},function(e,t,n){e.exports=n(642)},function(e,t,n){\"use strict\";var r=n(1075),o=n(1076);function a(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}t.parse=b,t.resolve=function(e,t){return b(e,!1,!0).resolve(t)},t.resolveObject=function(e,t){return e?b(e,!1,!0).resolveObject(t):t},t.format=function(e){o.isString(e)&&(e=b(e));return e instanceof a?e.format():a.prototype.format.call(e)},t.Url=a;var i=/^([a-z0-9.+-]+:)/i,s=/:[0-9]*$/,u=/^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,c=[\"{\",\"}\",\"|\",\"\\\\\",\"^\",\"`\"].concat([\"<\",\">\",'\"',\"`\",\" \",\"\\r\",\"\\n\",\"\\t\"]),l=[\"'\"].concat(c),p=[\"%\",\"/\",\"?\",\";\",\"#\"].concat(l),f=[\"/\",\"?\",\"#\"],h=/^[+a-z0-9A-Z_-]{0,63}$/,d=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,m={javascript:!0,\"javascript:\":!0},v={javascript:!0,\"javascript:\":!0},g={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,\"http:\":!0,\"https:\":!0,\"ftp:\":!0,\"gopher:\":!0,\"file:\":!0},y=n(1077);function b(e,t,n){if(e&&o.isObject(e)&&e instanceof a)return e;var r=new a;return r.parse(e,t,n),r}a.prototype.parse=function(e,t,n){if(!o.isString(e))throw new TypeError(\"Parameter 'url' must be a string, not \"+typeof e);var a=e.indexOf(\"?\"),s=-1!==a&&a<e.indexOf(\"#\")?\"?\":\"#\",c=e.split(s);c[0]=c[0].replace(/\\\\/g,\"/\");var b=e=c.join(s);if(b=b.trim(),!n&&1===e.split(\"#\").length){var _=u.exec(b);if(_)return this.path=b,this.href=b,this.pathname=_[1],_[2]?(this.search=_[2],this.query=t?y.parse(this.search.substr(1)):this.search.substr(1)):t&&(this.search=\"\",this.query={}),this}var w=i.exec(b);if(w){var x=(w=w[0]).toLowerCase();this.protocol=x,b=b.substr(w.length)}if(n||w||b.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)){var E=\"//\"===b.substr(0,2);!E||w&&v[w]||(b=b.substr(2),this.slashes=!0)}if(!v[w]&&(E||w&&!g[w])){for(var S,C,A=-1,k=0;k<f.length;k++){-1!==(O=b.indexOf(f[k]))&&(-1===A||O<A)&&(A=O)}-1!==(C=-1===A?b.lastIndexOf(\"@\"):b.lastIndexOf(\"@\",A))&&(S=b.slice(0,C),b=b.slice(C+1),this.auth=decodeURIComponent(S)),A=-1;for(k=0;k<p.length;k++){var O;-1!==(O=b.indexOf(p[k]))&&(-1===A||O<A)&&(A=O)}-1===A&&(A=b.length),this.host=b.slice(0,A),b=b.slice(A),this.parseHost(),this.hostname=this.hostname||\"\";var j=\"[\"===this.hostname[0]&&\"]\"===this.hostname[this.hostname.length-1];if(!j)for(var T=this.hostname.split(/\\./),I=(k=0,T.length);k<I;k++){var P=T[k];if(P&&!P.match(h)){for(var N=\"\",M=0,R=P.length;M<R;M++)P.charCodeAt(M)>127?N+=\"x\":N+=P[M];if(!N.match(h)){var D=T.slice(0,k),L=T.slice(k+1),B=P.match(d);B&&(D.push(B[1]),L.unshift(B[2])),L.length&&(b=\"/\"+L.join(\".\")+b),this.hostname=D.join(\".\");break}}}this.hostname.length>255?this.hostname=\"\":this.hostname=this.hostname.toLowerCase(),j||(this.hostname=r.toASCII(this.hostname));var F=this.port?\":\"+this.port:\"\",U=this.hostname||\"\";this.host=U+F,this.href+=this.host,j&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),\"/\"!==b[0]&&(b=\"/\"+b))}if(!m[x])for(k=0,I=l.length;k<I;k++){var q=l[k];if(-1!==b.indexOf(q)){var z=encodeURIComponent(q);z===q&&(z=escape(q)),b=b.split(q).join(z)}}var V=b.indexOf(\"#\");-1!==V&&(this.hash=b.substr(V),b=b.slice(0,V));var W=b.indexOf(\"?\");if(-1!==W?(this.search=b.substr(W),this.query=b.substr(W+1),t&&(this.query=y.parse(this.query)),b=b.slice(0,W)):t&&(this.search=\"\",this.query={}),b&&(this.pathname=b),g[x]&&this.hostname&&!this.pathname&&(this.pathname=\"/\"),this.pathname||this.search){F=this.pathname||\"\";var H=this.search||\"\";this.path=F+H}return this.href=this.format(),this},a.prototype.format=function(){var e=this.auth||\"\";e&&(e=(e=encodeURIComponent(e)).replace(/%3A/i,\":\"),e+=\"@\");var t=this.protocol||\"\",n=this.pathname||\"\",r=this.hash||\"\",a=!1,i=\"\";this.host?a=e+this.host:this.hostname&&(a=e+(-1===this.hostname.indexOf(\":\")?this.hostname:\"[\"+this.hostname+\"]\"),this.port&&(a+=\":\"+this.port)),this.query&&o.isObject(this.query)&&Object.keys(this.query).length&&(i=y.stringify(this.query));var s=this.search||i&&\"?\"+i||\"\";return t&&\":\"!==t.substr(-1)&&(t+=\":\"),this.slashes||(!t||g[t])&&!1!==a?(a=\"//\"+(a||\"\"),n&&\"/\"!==n.charAt(0)&&(n=\"/\"+n)):a||(a=\"\"),r&&\"#\"!==r.charAt(0)&&(r=\"#\"+r),s&&\"?\"!==s.charAt(0)&&(s=\"?\"+s),t+a+(n=n.replace(/[?#]/g,(function(e){return encodeURIComponent(e)})))+(s=s.replace(\"#\",\"%23\"))+r},a.prototype.resolve=function(e){return this.resolveObject(b(e,!1,!0)).format()},a.prototype.resolveObject=function(e){if(o.isString(e)){var t=new a;t.parse(e,!1,!0),e=t}for(var n=new a,r=Object.keys(this),i=0;i<r.length;i++){var s=r[i];n[s]=this[s]}if(n.hash=e.hash,\"\"===e.href)return n.href=n.format(),n;if(e.slashes&&!e.protocol){for(var u=Object.keys(e),c=0;c<u.length;c++){var l=u[c];\"protocol\"!==l&&(n[l]=e[l])}return g[n.protocol]&&n.hostname&&!n.pathname&&(n.path=n.pathname=\"/\"),n.href=n.format(),n}if(e.protocol&&e.protocol!==n.protocol){if(!g[e.protocol]){for(var p=Object.keys(e),f=0;f<p.length;f++){var h=p[f];n[h]=e[h]}return n.href=n.format(),n}if(n.protocol=e.protocol,e.host||v[e.protocol])n.pathname=e.pathname;else{for(var d=(e.pathname||\"\").split(\"/\");d.length&&!(e.host=d.shift()););e.host||(e.host=\"\"),e.hostname||(e.hostname=\"\"),\"\"!==d[0]&&d.unshift(\"\"),d.length<2&&d.unshift(\"\"),n.pathname=d.join(\"/\")}if(n.search=e.search,n.query=e.query,n.host=e.host||\"\",n.auth=e.auth,n.hostname=e.hostname||e.host,n.port=e.port,n.pathname||n.search){var m=n.pathname||\"\",y=n.search||\"\";n.path=m+y}return n.slashes=n.slashes||e.slashes,n.href=n.format(),n}var b=n.pathname&&\"/\"===n.pathname.charAt(0),_=e.host||e.pathname&&\"/\"===e.pathname.charAt(0),w=_||b||n.host&&e.pathname,x=w,E=n.pathname&&n.pathname.split(\"/\")||[],S=(d=e.pathname&&e.pathname.split(\"/\")||[],n.protocol&&!g[n.protocol]);if(S&&(n.hostname=\"\",n.port=null,n.host&&(\"\"===E[0]?E[0]=n.host:E.unshift(n.host)),n.host=\"\",e.protocol&&(e.hostname=null,e.port=null,e.host&&(\"\"===d[0]?d[0]=e.host:d.unshift(e.host)),e.host=null),w=w&&(\"\"===d[0]||\"\"===E[0])),_)n.host=e.host||\"\"===e.host?e.host:n.host,n.hostname=e.hostname||\"\"===e.hostname?e.hostname:n.hostname,n.search=e.search,n.query=e.query,E=d;else if(d.length)E||(E=[]),E.pop(),E=E.concat(d),n.search=e.search,n.query=e.query;else if(!o.isNullOrUndefined(e.search)){if(S)n.hostname=n.host=E.shift(),(j=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\"))&&(n.auth=j.shift(),n.host=n.hostname=j.shift());return n.search=e.search,n.query=e.query,o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.href=n.format(),n}if(!E.length)return n.pathname=null,n.search?n.path=\"/\"+n.search:n.path=null,n.href=n.format(),n;for(var C=E.slice(-1)[0],A=(n.host||e.host||E.length>1)&&(\".\"===C||\"..\"===C)||\"\"===C,k=0,O=E.length;O>=0;O--)\".\"===(C=E[O])?E.splice(O,1):\"..\"===C?(E.splice(O,1),k++):k&&(E.splice(O,1),k--);if(!w&&!x)for(;k--;k)E.unshift(\"..\");!w||\"\"===E[0]||E[0]&&\"/\"===E[0].charAt(0)||E.unshift(\"\"),A&&\"/\"!==E.join(\"/\").substr(-1)&&E.push(\"\");var j,T=\"\"===E[0]||E[0]&&\"/\"===E[0].charAt(0);S&&(n.hostname=n.host=T?\"\":E.length?E.shift():\"\",(j=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\"))&&(n.auth=j.shift(),n.host=n.hostname=j.shift()));return(w=w||n.host&&E.length)&&!T&&E.unshift(\"\"),E.length?n.pathname=E.join(\"/\"):(n.pathname=null,n.path=null),o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},a.prototype.parseHost=function(){var e=this.host,t=s.exec(e);t&&(\":\"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"SHOW_AUTH_POPUP\",(function(){return h})),n.d(t,\"AUTHORIZE\",(function(){return d})),n.d(t,\"LOGOUT\",(function(){return m})),n.d(t,\"PRE_AUTHORIZE_OAUTH2\",(function(){return v})),n.d(t,\"AUTHORIZE_OAUTH2\",(function(){return g})),n.d(t,\"VALIDATE\",(function(){return y})),n.d(t,\"CONFIGURE_AUTH\",(function(){return b})),n.d(t,\"RESTORE_AUTHORIZATION\",(function(){return _})),n.d(t,\"showDefinitions\",(function(){return w})),n.d(t,\"authorize\",(function(){return x})),n.d(t,\"authorizeWithPersistOption\",(function(){return E})),n.d(t,\"logout\",(function(){return S})),n.d(t,\"logoutWithPersistOption\",(function(){return C})),n.d(t,\"preAuthorizeImplicit\",(function(){return A})),n.d(t,\"authorizeOauth2\",(function(){return k})),n.d(t,\"authorizeOauth2WithPersistOption\",(function(){return O})),n.d(t,\"authorizePassword\",(function(){return j})),n.d(t,\"authorizeApplication\",(function(){return T})),n.d(t,\"authorizeAccessCodeWithFormParams\",(function(){return I})),n.d(t,\"authorizeAccessCodeWithBasicAuthentication\",(function(){return P})),n.d(t,\"authorizeRequest\",(function(){return N})),n.d(t,\"configureAuth\",(function(){return M})),n.d(t,\"restoreAuthorization\",(function(){return R})),n.d(t,\"persistAuthorizationIfNeeded\",(function(){return D}));var r=n(18),o=n.n(r),a=n(32),i=n.n(a),s=n(20),u=n.n(s),c=n(94),l=n.n(c),p=n(26),f=n(5),h=\"show_popup\",d=\"authorize\",m=\"logout\",v=\"pre_authorize_oauth2\",g=\"authorize_oauth2\",y=\"validate\",b=\"configure_auth\",_=\"restore_authorization\";function w(e){return{type:h,payload:e}}function x(e){return{type:d,payload:e}}var E=function(e){return function(t){var n=t.authActions;n.authorize(e),n.persistAuthorizationIfNeeded()}};function S(e){return{type:m,payload:e}}var C=function(e){return function(t){var n=t.authActions;n.logout(e),n.persistAuthorizationIfNeeded()}},A=function(e){return function(t){var n=t.authActions,r=t.errActions,o=e.auth,a=e.token,s=e.isValid,u=o.schema,c=o.name,l=u.get(\"flow\");delete p.a.swaggerUIRedirectOauth2,\"accessCode\"===l||s||r.newAuthErr({authId:c,source:\"auth\",level:\"warning\",message:\"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server\"}),a.error?r.newAuthErr({authId:c,source:\"auth\",level:\"error\",message:i()(a)}):n.authorizeOauth2WithPersistOption({auth:o,token:a})}};function k(e){return{type:g,payload:e}}var O=function(e){return function(t){var n=t.authActions;n.authorizeOauth2(e),n.persistAuthorizationIfNeeded()}},j=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.name,a=e.username,i=e.password,s=e.passwordType,c=e.clientId,l=e.clientSecret,p={grant_type:\"password\",scope:e.scopes.join(\" \"),username:a,password:i},h={};switch(s){case\"request-body\":!function(e,t,n){t&&u()(e,{client_id:t});n&&u()(e,{client_secret:n})}(p,c,l);break;case\"basic\":h.Authorization=\"Basic \"+Object(f.a)(c+\":\"+l);break;default:console.warn(\"Warning: invalid passwordType \".concat(s,\" was passed, not including client id and secret\"))}return n.authorizeRequest({body:Object(f.b)(p),url:r.get(\"tokenUrl\"),name:o,headers:h,query:{},auth:e})}};var T=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.scopes,a=e.name,i=e.clientId,s=e.clientSecret,u={Authorization:\"Basic \"+Object(f.a)(i+\":\"+s)},c={grant_type:\"client_credentials\",scope:o.join(\" \")};return n.authorizeRequest({body:Object(f.b)(c),name:a,url:r.get(\"tokenUrl\"),auth:e,headers:u})}},I=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,a=t.name,i=t.clientId,s=t.clientSecret,u=t.codeVerifier,c={grant_type:\"authorization_code\",code:t.code,client_id:i,client_secret:s,redirect_uri:n,code_verifier:u};return r.authorizeRequest({body:Object(f.b)(c),name:a,url:o.get(\"tokenUrl\"),auth:t})}},P=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,a=t.name,i=t.clientId,s=t.clientSecret,u=t.codeVerifier,c={Authorization:\"Basic \"+Object(f.a)(i+\":\"+s)},l={grant_type:\"authorization_code\",code:t.code,client_id:i,redirect_uri:n,code_verifier:u};return r.authorizeRequest({body:Object(f.b)(l),name:a,url:o.get(\"tokenUrl\"),auth:t,headers:c})}},N=function(e){return function(t){var n,r=t.fn,a=t.getConfigs,s=t.authActions,c=t.errActions,p=t.oas3Selectors,f=t.specSelectors,h=t.authSelectors,d=e.body,m=e.query,v=void 0===m?{}:m,g=e.headers,y=void 0===g?{}:g,b=e.name,_=e.url,w=e.auth,x=(h.getConfigs()||{}).additionalQueryStringParams;if(f.isOAS3()){var E=p.serverEffectiveValue(p.selectedServer());n=l()(_,E,!0)}else n=l()(_,f.url(),!0);\"object\"===o()(x)&&(n.query=u()({},n.query,x));var S=n.toString(),C=u()({Accept:\"application/json, text/plain, */*\",\"Content-Type\":\"application/x-www-form-urlencoded\",\"X-Requested-With\":\"XMLHttpRequest\"},y);r.fetch({url:S,method:\"post\",headers:C,query:v,body:d,requestInterceptor:a().requestInterceptor,responseInterceptor:a().responseInterceptor}).then((function(e){var t=JSON.parse(e.data),n=t&&(t.error||\"\"),r=t&&(t.parseError||\"\");e.ok?n||r?c.newAuthErr({authId:b,level:\"error\",source:\"auth\",message:i()(t)}):s.authorizeOauth2WithPersistOption({auth:w,token:t}):c.newAuthErr({authId:b,level:\"error\",source:\"auth\",message:e.statusText})})).catch((function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r=\"string\"==typeof n?JSON.parse(n):n;r.error&&(t+=\", error: \".concat(r.error)),r.error_description&&(t+=\", description: \".concat(r.error_description))}catch(e){}}c.newAuthErr({authId:b,level:\"error\",source:\"auth\",message:t})}))}};function M(e){return{type:b,payload:e}}function R(e){return{type:_,payload:e}}var D=function(){return function(e){var t=e.authSelectors;if((0,e.getConfigs)().persistAuthorization){var n=t.authorized();localStorage.setItem(\"authorized\",i()(n.toJS()))}}}},function(e,t,n){var r=n(1048);e.exports=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?Object(arguments[t]):{},o=Object.keys(n);\"function\"==typeof Object.getOwnPropertySymbols&&(o=o.concat(Object.getOwnPropertySymbols(n).filter((function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable})))),o.forEach((function(t){r(e,t,n[t])}))}return e}},function(e,t,n){var r=n(107),o=n(177),a=n(60),i=n(69),s=n(226),u=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,l=4==e,p=6==e,f=7==e,h=5==e||p;return function(d,m,v,g){for(var y,b,_=a(d),w=o(_),x=r(m,v,3),E=i(w.length),S=0,C=g||s,A=t?C(d,E):n||f?C(d,0):void 0;E>S;S++)if((h||S in w)&&(b=x(y=w[S],S,_),e))if(t)A[S]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return S;case 2:u.call(A,y)}else switch(e){case 4:return!1;case 7:u.call(A,y)}return p?-1:c||l?l:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},function(e,t,n){n(157);var r=n(576),o=n(40),a=n(99),i=n(67),s=n(131),u=n(41)(\"toStringTag\");for(var c in r){var l=o[c],p=l&&l.prototype;p&&a(p)!==u&&i(p,u,c),s[c]=s.Array}},function(e,t,n){\"use strict\";e.exports={current:null}},function(e,t){e.exports=function(e){return null!=e&&\"object\"==typeof e}},function(e,t){var n,r,o=e.exports={};function a(){throw new Error(\"setTimeout has not been defined\")}function i(){throw new Error(\"clearTimeout has not been defined\")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===a||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n=\"function\"==typeof setTimeout?setTimeout:a}catch(e){n=a}try{r=\"function\"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var u,c=[],l=!1,p=-1;function f(){l&&u&&(l=!1,u.length?c=u.concat(c):p=-1,c.length&&h())}function h(){if(!l){var e=s(f);l=!0;for(var t=c.length;t;){for(u=c,c=[];++p<t;)u&&u[p].run();p=-1,t=c.length}u=null,l=!1,function(e){if(r===clearTimeout)return clearTimeout(e);if((r===i||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}(e)}}function d(e,t){this.fun=e,this.array=t}function m(){}o.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];c.push(new d(e,t)),1!==c.length||l||s(h)},d.prototype.run=function(){this.fun.apply(null,this.array)},o.title=\"browser\",o.browser=!0,o.env={},o.argv=[],o.version=\"\",o.versions={},o.on=m,o.addListener=m,o.once=m,o.off=m,o.removeListener=m,o.removeAllListeners=m,o.emit=m,o.prependListener=m,o.prependOnceListener=m,o.listeners=function(e){return[]},o.binding=function(e){throw new Error(\"process.binding is not supported\")},o.cwd=function(){return\"/\"},o.chdir=function(e){throw new Error(\"process.chdir is not supported\")},o.umask=function(){return 0}},function(e,t,n){\"use strict\";var r=n(38),o=n(122),a=n(79),i=(n(33),[\"dispatchConfig\",\"_targetInst\",\"nativeEvent\",\"isDefaultPrevented\",\"isPropagationStopped\",\"_dispatchListeners\",\"_dispatchInstances\"]),s={type:null,target:null,currentTarget:a.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};function u(e,t,n,r){this.dispatchConfig=e,this._targetInst=t,this.nativeEvent=n;var o=this.constructor.Interface;for(var i in o)if(o.hasOwnProperty(i)){0;var s=o[i];s?this[i]=s(n):\"target\"===i?this.target=r:this[i]=n[i]}var u=null!=n.defaultPrevented?n.defaultPrevented:!1===n.returnValue;return this.isDefaultPrevented=u?a.thatReturnsTrue:a.thatReturnsFalse,this.isPropagationStopped=a.thatReturnsFalse,this}r(u.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():\"unknown\"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=a.thatReturnsTrue)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():\"unknown\"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=a.thatReturnsTrue)},persist:function(){this.isPersistent=a.thatReturnsTrue},isPersistent:a.thatReturnsFalse,destructor:function(){var e=this.constructor.Interface;for(var t in e)this[t]=null;for(var n=0;n<i.length;n++)this[i[n]]=null}}),u.Interface=s,u.augmentClass=function(e,t){var n=this,a=function(){};a.prototype=n.prototype;var i=new a;r(i,e.prototype),e.prototype=i,e.prototype.constructor=e,e.Interface=r({},n.Interface,t),e.augmentClass=n.augmentClass,o.addPoolingTo(e,o.fourArgumentPooler)},o.addPoolingTo(u,o.fourArgumentPooler),e.exports=u},function(e,t,n){var r=n(406);e.exports=function(e){return null==e?\"\":r(e)}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"lastError\",(function(){return M})),n.d(t,\"url\",(function(){return R})),n.d(t,\"specStr\",(function(){return D})),n.d(t,\"specSource\",(function(){return L})),n.d(t,\"specJson\",(function(){return B})),n.d(t,\"specResolved\",(function(){return F})),n.d(t,\"specResolvedSubtree\",(function(){return U})),n.d(t,\"specJsonWithResolvedSubtrees\",(function(){return z})),n.d(t,\"spec\",(function(){return V})),n.d(t,\"isOAS3\",(function(){return W})),n.d(t,\"info\",(function(){return H})),n.d(t,\"externalDocs\",(function(){return $})),n.d(t,\"version\",(function(){return J})),n.d(t,\"semver\",(function(){return K})),n.d(t,\"paths\",(function(){return Y})),n.d(t,\"operations\",(function(){return G})),n.d(t,\"consumes\",(function(){return Z})),n.d(t,\"produces\",(function(){return X})),n.d(t,\"security\",(function(){return Q})),n.d(t,\"securityDefinitions\",(function(){return ee})),n.d(t,\"findDefinition\",(function(){return te})),n.d(t,\"definitions\",(function(){return ne})),n.d(t,\"basePath\",(function(){return re})),n.d(t,\"host\",(function(){return oe})),n.d(t,\"schemes\",(function(){return ae})),n.d(t,\"operationsWithRootInherited\",(function(){return ie})),n.d(t,\"tags\",(function(){return se})),n.d(t,\"tagDetails\",(function(){return ue})),n.d(t,\"operationsWithTags\",(function(){return ce})),n.d(t,\"taggedOperations\",(function(){return le})),n.d(t,\"responses\",(function(){return pe})),n.d(t,\"requests\",(function(){return fe})),n.d(t,\"mutatedRequests\",(function(){return he})),n.d(t,\"responseFor\",(function(){return de})),n.d(t,\"requestFor\",(function(){return me})),n.d(t,\"mutatedRequestFor\",(function(){return ve})),n.d(t,\"allowTryItOutFor\",(function(){return ge})),n.d(t,\"parameterWithMetaByIdentity\",(function(){return ye})),n.d(t,\"parameterInclusionSettingFor\",(function(){return be})),n.d(t,\"parameterWithMeta\",(function(){return _e})),n.d(t,\"operationWithMeta\",(function(){return we})),n.d(t,\"getParameter\",(function(){return xe})),n.d(t,\"hasHost\",(function(){return Ee})),n.d(t,\"parameterValues\",(function(){return Se})),n.d(t,\"parametersIncludeIn\",(function(){return Ce})),n.d(t,\"parametersIncludeType\",(function(){return Ae})),n.d(t,\"contentTypeValues\",(function(){return ke})),n.d(t,\"currentProducesFor\",(function(){return Oe})),n.d(t,\"producesOptionsFor\",(function(){return je})),n.d(t,\"consumesOptionsFor\",(function(){return Te})),n.d(t,\"operationScheme\",(function(){return Ie})),n.d(t,\"canExecuteScheme\",(function(){return Pe})),n.d(t,\"validateBeforeExecute\",(function(){return Ne})),n.d(t,\"getOAS3RequiredRequestBodyContentType\",(function(){return Me})),n.d(t,\"isMediaTypeSchemaPropertiesEqual\",(function(){return Re}));var r=n(13),o=n.n(r),a=n(14),i=n.n(a),s=n(2),u=n.n(s),c=n(19),l=n.n(c),p=n(23),f=n.n(p),h=n(17),d=n.n(h),m=n(4),v=n.n(m),g=n(12),y=n.n(g),b=n(64),_=n.n(b),w=n(29),x=n.n(w),E=n(208),S=n.n(E),C=n(75),A=n.n(C),k=n(22),O=n.n(k),j=n(16),T=n(5),I=n(1),P=[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\",\"trace\"],N=function(e){return e||Object(I.Map)()},M=Object(j.a)(N,(function(e){return e.get(\"lastError\")})),R=Object(j.a)(N,(function(e){return e.get(\"url\")})),D=Object(j.a)(N,(function(e){return e.get(\"spec\")||\"\"})),L=Object(j.a)(N,(function(e){return e.get(\"specSource\")||\"not-editor\"})),B=Object(j.a)(N,(function(e){return e.get(\"json\",Object(I.Map)())})),F=Object(j.a)(N,(function(e){return e.get(\"resolved\",Object(I.Map)())})),U=function(e,t){var n;return e.getIn(u()(n=[\"resolvedSubtrees\"]).call(n,i()(t)),void 0)},q=function e(t,n){return I.Map.isMap(t)&&I.Map.isMap(n)?n.get(\"$$ref\")?n:Object(I.OrderedMap)().mergeWith(e,t,n):n},z=Object(j.a)(N,(function(e){return Object(I.OrderedMap)().mergeWith(q,e.get(\"json\"),e.get(\"resolvedSubtrees\"))})),V=function(e){return B(e)},W=Object(j.a)(V,(function(){return!1})),H=Object(j.a)(V,(function(e){return De(e&&e.get(\"info\"))})),$=Object(j.a)(V,(function(e){return De(e&&e.get(\"externalDocs\"))})),J=Object(j.a)(H,(function(e){return e&&e.get(\"version\")})),K=Object(j.a)(J,(function(e){var t;return l()(t=/v?([0-9]*)\\.([0-9]*)\\.([0-9]*)/i.exec(e)).call(t,1)})),Y=Object(j.a)(z,(function(e){return e.get(\"paths\")})),G=Object(j.a)(Y,(function(e){if(!e||e.size<1)return Object(I.List)();var t=Object(I.List)();return e&&f()(e)?(f()(e).call(e,(function(e,n){if(!e||!f()(e))return{};f()(e).call(e,(function(e,r){var o;d()(P).call(P,r)<0||(t=t.push(Object(I.fromJS)({path:n,method:r,operation:e,id:u()(o=\"\".concat(r,\"-\")).call(o,n)})))}))})),t):Object(I.List)()})),Z=Object(j.a)(V,(function(e){return Object(I.Set)(e.get(\"consumes\"))})),X=Object(j.a)(V,(function(e){return Object(I.Set)(e.get(\"produces\"))})),Q=Object(j.a)(V,(function(e){return e.get(\"security\",Object(I.List)())})),ee=Object(j.a)(V,(function(e){return e.get(\"securityDefinitions\")})),te=function(e,t){var n=e.getIn([\"resolvedSubtrees\",\"definitions\",t],null),r=e.getIn([\"json\",\"definitions\",t],null);return n||r||null},ne=Object(j.a)(V,(function(e){var t=e.get(\"definitions\");return I.Map.isMap(t)?t:Object(I.Map)()})),re=Object(j.a)(V,(function(e){return e.get(\"basePath\")})),oe=Object(j.a)(V,(function(e){return e.get(\"host\")})),ae=Object(j.a)(V,(function(e){return e.get(\"schemes\",Object(I.Map)())})),ie=Object(j.a)(G,Z,X,(function(e,t,n){return v()(e).call(e,(function(e){return e.update(\"operation\",(function(e){if(e){if(!I.Map.isMap(e))return;return e.withMutations((function(e){return e.get(\"consumes\")||e.update(\"consumes\",(function(e){return Object(I.Set)(e).merge(t)})),e.get(\"produces\")||e.update(\"produces\",(function(e){return Object(I.Set)(e).merge(n)})),e}))}return Object(I.Map)()}))}))})),se=Object(j.a)(V,(function(e){var t=e.get(\"tags\",Object(I.List)());return I.List.isList(t)?y()(t).call(t,(function(e){return I.Map.isMap(e)})):Object(I.List)()})),ue=function(e,t){var n,r=se(e)||Object(I.List)();return _()(n=y()(r).call(r,I.Map.isMap)).call(n,(function(e){return e.get(\"name\")===t}),Object(I.Map)())},ce=Object(j.a)(ie,se,(function(e,t){return x()(e).call(e,(function(e,t){var n=Object(I.Set)(t.getIn([\"operation\",\"tags\"]));return n.count()<1?e.update(\"default\",Object(I.List)(),(function(e){return e.push(t)})):x()(n).call(n,(function(e,n){return e.update(n,Object(I.List)(),(function(e){return e.push(t)}))}),e)}),x()(t).call(t,(function(e,t){return e.set(t.get(\"name\"),Object(I.List)())}),Object(I.OrderedMap)()))})),le=function(e){return function(t){var n,r=(0,t.getConfigs)(),o=r.tagsSorter,a=r.operationsSorter;return v()(n=ce(e).sortBy((function(e,t){return t}),(function(e,t){var n=\"function\"==typeof o?o:T.H.tagsSorter[o];return n?n(e,t):null}))).call(n,(function(t,n){var r=\"function\"==typeof a?a:T.H.operationsSorter[a],o=r?S()(t).call(t,r):t;return Object(I.Map)({tagDetails:ue(e,n),operations:o})}))}},pe=Object(j.a)(N,(function(e){return e.get(\"responses\",Object(I.Map)())})),fe=Object(j.a)(N,(function(e){return e.get(\"requests\",Object(I.Map)())})),he=Object(j.a)(N,(function(e){return e.get(\"mutatedRequests\",Object(I.Map)())})),de=function(e,t,n){return pe(e).getIn([t,n],null)},me=function(e,t,n){return fe(e).getIn([t,n],null)},ve=function(e,t,n){return he(e).getIn([t,n],null)},ge=function(){return!0},ye=function(e,t,n){var r,o,a=z(e).getIn(u()(r=[\"paths\"]).call(r,i()(t),[\"parameters\"]),Object(I.OrderedMap)()),s=e.getIn(u()(o=[\"meta\",\"paths\"]).call(o,i()(t),[\"parameters\"]),Object(I.OrderedMap)()),c=v()(a).call(a,(function(e){var t,r,o,a=s.get(u()(t=\"\".concat(n.get(\"in\"),\".\")).call(t,n.get(\"name\"))),i=s.get(u()(r=u()(o=\"\".concat(n.get(\"in\"),\".\")).call(o,n.get(\"name\"),\".hash-\")).call(r,n.hashCode()));return Object(I.OrderedMap)().merge(e,a,i)}));return _()(c).call(c,(function(e){return e.get(\"in\")===n.get(\"in\")&&e.get(\"name\")===n.get(\"name\")}),Object(I.OrderedMap)())},be=function(e,t,n,r){var o,a,s=u()(o=\"\".concat(r,\".\")).call(o,n);return e.getIn(u()(a=[\"meta\",\"paths\"]).call(a,i()(t),[\"parameter_inclusions\",s]),!1)},_e=function(e,t,n,r){var o,a=z(e).getIn(u()(o=[\"paths\"]).call(o,i()(t),[\"parameters\"]),Object(I.OrderedMap)()),s=_()(a).call(a,(function(e){return e.get(\"in\")===r&&e.get(\"name\")===n}),Object(I.OrderedMap)());return ye(e,t,s)},we=function(e,t,n){var r,o=z(e).getIn([\"paths\",t,n],Object(I.OrderedMap)()),a=e.getIn([\"meta\",\"paths\",t,n],Object(I.OrderedMap)()),i=v()(r=o.get(\"parameters\",Object(I.List)())).call(r,(function(r){return ye(e,[t,n],r)}));return Object(I.OrderedMap)().merge(o,a).set(\"parameters\",i)};function xe(e,t,n,r){var o;t=t||[];var a=e.getIn(u()(o=[\"meta\",\"paths\"]).call(o,i()(t),[\"parameters\"]),Object(I.fromJS)([]));return _()(a).call(a,(function(e){return I.Map.isMap(e)&&e.get(\"name\")===n&&e.get(\"in\")===r}))||Object(I.Map)()}var Ee=Object(j.a)(V,(function(e){var t=e.get(\"host\");return\"string\"==typeof t&&t.length>0&&\"/\"!==t[0]}));function Se(e,t,n){var r;t=t||[];var o=we.apply(void 0,u()(r=[e]).call(r,i()(t))).get(\"parameters\",Object(I.List)());return x()(o).call(o,(function(e,t){var r=n&&\"body\"===t.get(\"in\")?t.get(\"value_xml\"):t.get(\"value\");return e.set(Object(T.A)(t,{allowHashes:!1}),r)}),Object(I.fromJS)({}))}function Ce(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(I.List.isList(e))return A()(e).call(e,(function(e){return I.Map.isMap(e)&&e.get(\"in\")===t}))}function Ae(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(I.List.isList(e))return A()(e).call(e,(function(e){return I.Map.isMap(e)&&e.get(\"type\")===t}))}function ke(e,t){var n,r;t=t||[];var o=z(e).getIn(u()(n=[\"paths\"]).call(n,i()(t)),Object(I.fromJS)({})),a=e.getIn(u()(r=[\"meta\",\"paths\"]).call(r,i()(t)),Object(I.fromJS)({})),s=Oe(e,t),c=o.get(\"parameters\")||new I.List,l=a.get(\"consumes_value\")?a.get(\"consumes_value\"):Ae(c,\"file\")?\"multipart/form-data\":Ae(c,\"formData\")?\"application/x-www-form-urlencoded\":void 0;return Object(I.fromJS)({requestContentType:l,responseContentType:s})}function Oe(e,t){var n,r;t=t||[];var o=z(e).getIn(u()(n=[\"paths\"]).call(n,i()(t)),null);if(null!==o){var a=e.getIn(u()(r=[\"meta\",\"paths\"]).call(r,i()(t),[\"produces_value\"]),null),s=o.getIn([\"produces\",0],null);return a||s||\"application/json\"}}function je(e,t){var n;t=t||[];var r=z(e),a=r.getIn(u()(n=[\"paths\"]).call(n,i()(t)),null);if(null!==a){var s=t,c=o()(s,1)[0],l=a.get(\"produces\",null),p=r.getIn([\"paths\",c,\"produces\"],null),f=r.getIn([\"produces\"],null);return l||p||f}}function Te(e,t){var n;t=t||[];var r=z(e),a=r.getIn(u()(n=[\"paths\"]).call(n,i()(t)),null);if(null!==a){var s=t,c=o()(s,1)[0],l=a.get(\"consumes\",null),p=r.getIn([\"paths\",c,\"consumes\"],null),f=r.getIn([\"consumes\"],null);return l||p||f}}var Ie=function(e,t,n){var r=e.get(\"url\").match(/^([a-z][a-z0-9+\\-.]*):/),o=O()(r)?r[1]:null;return e.getIn([\"scheme\",t,n])||e.getIn([\"scheme\",\"_defaultScheme\"])||o||\"\"},Pe=function(e,t,n){var r;return d()(r=[\"http\",\"https\"]).call(r,Ie(e,t,n))>-1},Ne=function(e,t){var n;t=t||[];var r=e.getIn(u()(n=[\"meta\",\"paths\"]).call(n,i()(t),[\"parameters\"]),Object(I.fromJS)([])),o=!0;return f()(r).call(r,(function(e){var t=e.get(\"errors\");t&&t.count()&&(o=!1)})),o},Me=function(e,t){var n,r,o={requestBody:!1,requestContentType:{}},a=e.getIn(u()(n=[\"resolvedSubtrees\",\"paths\"]).call(n,i()(t),[\"requestBody\"]),Object(I.fromJS)([]));return a.size<1||(a.getIn([\"required\"])&&(o.requestBody=a.getIn([\"required\"])),f()(r=a.getIn([\"content\"]).entrySeq()).call(r,(function(e){var t=e[0];if(e[1].getIn([\"schema\",\"required\"])){var n=e[1].getIn([\"schema\",\"required\"]).toJS();o.requestContentType[t]=n}}))),o},Re=function(e,t,n,r){var o;if((n||r)&&n===r)return!0;var a=e.getIn(u()(o=[\"resolvedSubtrees\",\"paths\"]).call(o,i()(t),[\"requestBody\",\"content\"]),Object(I.fromJS)([]));if(a.size<2||!n||!r)return!1;var s=a.getIn([n,\"schema\",\"properties\"],Object(I.fromJS)([])),c=a.getIn([r,\"schema\",\"properties\"],Object(I.fromJS)([]));return!!s.equals(c)};function De(e){return I.Map.isMap(e)?e:new I.Map}},function(e,t,n){\"use strict\";(function(t){var r=n(894),o=n(895),a=/^[A-Za-z][A-Za-z0-9+-.]*:[\\\\/]+/,i=/^([a-z][a-z0-9.+-]*:)?([\\\\/]{1,})?([\\S\\s]*)/i,s=new RegExp(\"^[\\\\x09\\\\x0A\\\\x0B\\\\x0C\\\\x0D\\\\x20\\\\xA0\\\\u1680\\\\u180E\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200A\\\\u202F\\\\u205F\\\\u3000\\\\u2028\\\\u2029\\\\uFEFF]+\");function u(e){return(e||\"\").toString().replace(s,\"\")}var c=[[\"#\",\"hash\"],[\"?\",\"query\"],function(e){return e.replace(\"\\\\\",\"/\")},[\"/\",\"pathname\"],[\"@\",\"auth\",1],[NaN,\"host\",void 0,1,1],[/:(\\d+)$/,\"port\",void 0,1],[NaN,\"hostname\",void 0,1,1]],l={hash:1,query:1};function p(e){var n,r=(\"undefined\"!=typeof window?window:void 0!==t?t:\"undefined\"!=typeof self?self:{}).location||{},o={},i=typeof(e=e||r);if(\"blob:\"===e.protocol)o=new h(unescape(e.pathname),{});else if(\"string\"===i)for(n in o=new h(e,{}),l)delete o[n];else if(\"object\"===i){for(n in e)n in l||(o[n]=e[n]);void 0===o.slashes&&(o.slashes=a.test(e.href))}return o}function f(e){e=u(e);var t=i.exec(e);return{protocol:t[1]?t[1].toLowerCase():\"\",slashes:!!(t[2]&&t[2].length>=2),rest:t[2]&&1===t[2].length?\"/\"+t[3]:t[3]}}function h(e,t,n){if(e=u(e),!(this instanceof h))return new h(e,t,n);var a,i,s,l,d,m,v=c.slice(),g=typeof t,y=this,b=0;for(\"object\"!==g&&\"string\"!==g&&(n=t,t=null),n&&\"function\"!=typeof n&&(n=o.parse),t=p(t),a=!(i=f(e||\"\")).protocol&&!i.slashes,y.slashes=i.slashes||a&&t.slashes,y.protocol=i.protocol||t.protocol||\"\",e=i.rest,i.slashes||(v[3]=[/(.*)/,\"pathname\"]);b<v.length;b++)\"function\"!=typeof(l=v[b])?(s=l[0],m=l[1],s!=s?y[m]=e:\"string\"==typeof s?~(d=e.indexOf(s))&&(\"number\"==typeof l[2]?(y[m]=e.slice(0,d),e=e.slice(d+l[2])):(y[m]=e.slice(d),e=e.slice(0,d))):(d=s.exec(e))&&(y[m]=d[1],e=e.slice(0,d.index)),y[m]=y[m]||a&&l[3]&&t[m]||\"\",l[4]&&(y[m]=y[m].toLowerCase())):e=l(e);n&&(y.query=n(y.query)),a&&t.slashes&&\"/\"!==y.pathname.charAt(0)&&(\"\"!==y.pathname||\"\"!==t.pathname)&&(y.pathname=function(e,t){if(\"\"===e)return t;for(var n=(t||\"/\").split(\"/\").slice(0,-1).concat(e.split(\"/\")),r=n.length,o=n[r-1],a=!1,i=0;r--;)\".\"===n[r]?n.splice(r,1):\"..\"===n[r]?(n.splice(r,1),i++):i&&(0===r&&(a=!0),n.splice(r,1),i--);return a&&n.unshift(\"\"),\".\"!==o&&\"..\"!==o||n.push(\"\"),n.join(\"/\")}(y.pathname,t.pathname)),\"/\"!==y.pathname.charAt(0)&&y.hostname&&(y.pathname=\"/\"+y.pathname),r(y.port,y.protocol)||(y.host=y.hostname,y.port=\"\"),y.username=y.password=\"\",y.auth&&(l=y.auth.split(\":\"),y.username=l[0]||\"\",y.password=l[1]||\"\"),y.origin=y.protocol&&y.host&&\"file:\"!==y.protocol?y.protocol+\"//\"+y.host:\"null\",y.href=y.toString()}h.prototype={set:function(e,t,n){var a=this;switch(e){case\"query\":\"string\"==typeof t&&t.length&&(t=(n||o.parse)(t)),a[e]=t;break;case\"port\":a[e]=t,r(t,a.protocol)?t&&(a.host=a.hostname+\":\"+t):(a.host=a.hostname,a[e]=\"\");break;case\"hostname\":a[e]=t,a.port&&(t+=\":\"+a.port),a.host=t;break;case\"host\":a[e]=t,/:\\d+$/.test(t)?(t=t.split(\":\"),a.port=t.pop(),a.hostname=t.join(\":\")):(a.hostname=t,a.port=\"\");break;case\"protocol\":a.protocol=t.toLowerCase(),a.slashes=!n;break;case\"pathname\":case\"hash\":if(t){var i=\"pathname\"===e?\"/\":\"#\";a[e]=t.charAt(0)!==i?i+t:t}else a[e]=t;break;default:a[e]=t}for(var s=0;s<c.length;s++){var u=c[s];u[4]&&(a[u[1]]=a[u[1]].toLowerCase())}return a.origin=a.protocol&&a.host&&\"file:\"!==a.protocol?a.protocol+\"//\"+a.host:\"null\",a.href=a.toString(),a},toString:function(e){e&&\"function\"==typeof e||(e=o.stringify);var t,n=this,r=n.protocol;r&&\":\"!==r.charAt(r.length-1)&&(r+=\":\");var a=r+(n.slashes?\"//\":\"\");return n.username&&(a+=n.username,n.password&&(a+=\":\"+n.password),a+=\"@\"),a+=n.host+n.pathname,(t=\"object\"==typeof n.query?e(n.query):n.query)&&(a+=\"?\"!==t.charAt(0)?\"?\"+t:t),n.hash&&(a+=n.hash),a}},h.extractProtocol=f,h.location=p,h.trimLeft=u,h.qs=o,e.exports=h}).call(this,n(51))},function(e,t,n){e.exports=n(1083)},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return ee})),n.d(t,\"a\",(function(){return D}));var r=n(15),o=n.n(r),a=n(31),i=n.n(a),s=n(522),u=n.n(s),c=n(523),l=n.n(c),p=n(85),f=n.n(p),h=n(0),d=n.n(h),m=n(524),v=n.n(m);var g={};function y(e){if(0===e.length||1===e.length)return e;var t,n,r=e.join(\".\");return g[r]||(g[r]=0===(n=(t=e).length)||1===n?t:2===n?[t[0],t[1],\"\".concat(t[0],\".\").concat(t[1]),\"\".concat(t[1],\".\").concat(t[0])]:3===n?[t[0],t[1],t[2],\"\".concat(t[0],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[0]),\"\".concat(t[1],\".\").concat(t[2]),\"\".concat(t[2],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[1],\".\").concat(t[2]),\"\".concat(t[0],\".\").concat(t[2],\".\").concat(t[1]),\"\".concat(t[1],\".\").concat(t[0],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[2],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[0],\".\").concat(t[1]),\"\".concat(t[2],\".\").concat(t[1],\".\").concat(t[0])]:n>=4?[t[0],t[1],t[2],t[3],\"\".concat(t[0],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[2]),\"\".concat(t[0],\".\").concat(t[3]),\"\".concat(t[1],\".\").concat(t[0]),\"\".concat(t[1],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[3]),\"\".concat(t[2],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[1]),\"\".concat(t[2],\".\").concat(t[3]),\"\".concat(t[3],\".\").concat(t[0]),\"\".concat(t[3],\".\").concat(t[1]),\"\".concat(t[3],\".\").concat(t[2]),\"\".concat(t[0],\".\").concat(t[1],\".\").concat(t[2]),\"\".concat(t[0],\".\").concat(t[1],\".\").concat(t[3]),\"\".concat(t[0],\".\").concat(t[2],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[2],\".\").concat(t[3]),\"\".concat(t[0],\".\").concat(t[3],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[3],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[0],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[0],\".\").concat(t[3]),\"\".concat(t[1],\".\").concat(t[2],\".\").concat(t[0]),\"\".concat(t[1],\".\").concat(t[2],\".\").concat(t[3]),\"\".concat(t[1],\".\").concat(t[3],\".\").concat(t[0]),\"\".concat(t[1],\".\").concat(t[3],\".\").concat(t[2]),\"\".concat(t[2],\".\").concat(t[0],\".\").concat(t[1]),\"\".concat(t[2],\".\").concat(t[0],\".\").concat(t[3]),\"\".concat(t[2],\".\").concat(t[1],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[1],\".\").concat(t[3]),\"\".concat(t[2],\".\").concat(t[3],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[3],\".\").concat(t[1]),\"\".concat(t[3],\".\").concat(t[0],\".\").concat(t[1]),\"\".concat(t[3],\".\").concat(t[0],\".\").concat(t[2]),\"\".concat(t[3],\".\").concat(t[1],\".\").concat(t[0]),\"\".concat(t[3],\".\").concat(t[1],\".\").concat(t[2]),\"\".concat(t[3],\".\").concat(t[2],\".\").concat(t[0]),\"\".concat(t[3],\".\").concat(t[2],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[1],\".\").concat(t[2],\".\").concat(t[3]),\"\".concat(t[0],\".\").concat(t[1],\".\").concat(t[3],\".\").concat(t[2]),\"\".concat(t[0],\".\").concat(t[2],\".\").concat(t[1],\".\").concat(t[3]),\"\".concat(t[0],\".\").concat(t[2],\".\").concat(t[3],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[3],\".\").concat(t[1],\".\").concat(t[2]),\"\".concat(t[0],\".\").concat(t[3],\".\").concat(t[2],\".\").concat(t[1]),\"\".concat(t[1],\".\").concat(t[0],\".\").concat(t[2],\".\").concat(t[3]),\"\".concat(t[1],\".\").concat(t[0],\".\").concat(t[3],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[2],\".\").concat(t[0],\".\").concat(t[3]),\"\".concat(t[1],\".\").concat(t[2],\".\").concat(t[3],\".\").concat(t[0]),\"\".concat(t[1],\".\").concat(t[3],\".\").concat(t[0],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[3],\".\").concat(t[2],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[0],\".\").concat(t[1],\".\").concat(t[3]),\"\".concat(t[2],\".\").concat(t[0],\".\").concat(t[3],\".\").concat(t[1]),\"\".concat(t[2],\".\").concat(t[1],\".\").concat(t[0],\".\").concat(t[3]),\"\".concat(t[2],\".\").concat(t[1],\".\").concat(t[3],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[3],\".\").concat(t[0],\".\").concat(t[1]),\"\".concat(t[2],\".\").concat(t[3],\".\").concat(t[1],\".\").concat(t[0]),\"\".concat(t[3],\".\").concat(t[0],\".\").concat(t[1],\".\").concat(t[2]),\"\".concat(t[3],\".\").concat(t[0],\".\").concat(t[2],\".\").concat(t[1]),\"\".concat(t[3],\".\").concat(t[1],\".\").concat(t[0],\".\").concat(t[2]),\"\".concat(t[3],\".\").concat(t[1],\".\").concat(t[2],\".\").concat(t[0]),\"\".concat(t[3],\".\").concat(t[2],\".\").concat(t[0],\".\").concat(t[1]),\"\".concat(t[3],\".\").concat(t[2],\".\").concat(t[1],\".\").concat(t[0])]:void 0),g[r]}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=e.filter((function(e){return\"token\"!==e})),o=y(r);return o.reduce((function(e,t){return f()({},e,n[t])}),t)}function _(e){return e.join(\" \")}function w(e){var t=e.node,n=e.stylesheet,r=e.style,o=void 0===r?{}:r,a=e.useInlineStyles,i=e.key,s=t.properties,u=t.type,c=t.tagName,l=t.value;if(\"text\"===u)return l;if(c){var p,h=function(e,t){var n=0;return function(r){return n+=1,r.map((function(r,o){return w({node:r,stylesheet:e,useInlineStyles:t,key:\"code-segment-\".concat(n,\"-\").concat(o)})}))}}(n,a);if(a){var m=Object.keys(n).reduce((function(e,t){return t.split(\".\").forEach((function(t){e.includes(t)||e.push(t)})),e}),[]),g=s.className&&s.className.includes(\"token\")?[\"token\"]:[],y=s.className&&g.concat(s.className.filter((function(e){return!m.includes(e)})));p=f()({},s,{className:_(y)||void 0,style:b(s.className,Object.assign({},s.style,o),n)})}else p=f()({},s,{className:_(s.className)});var x=h(t.children);return d.a.createElement(c,v()({key:i},p),x)}}var x=/\\n/g;function E(e){var t=e.codeString,n=e.codeStyle,r=e.containerStyle,o=void 0===r?{float:\"left\",paddingRight:\"10px\"}:r,a=e.numberStyle,i=void 0===a?{}:a,s=e.startingLineNumber;return d.a.createElement(\"code\",{style:Object.assign({},n,o)},function(e){var t=e.lines,n=e.startingLineNumber,r=e.style;return t.map((function(e,t){var o=t+n;return d.a.createElement(\"span\",{key:\"line-\".concat(t),className:\"react-syntax-highlighter-line-number\",style:\"function\"==typeof r?r(o):r},\"\".concat(o,\"\\n\"))}))}({lines:t.replace(/\\n$/,\"\").split(\"\\n\"),style:i,startingLineNumber:s}))}function S(e,t){return{type:\"element\",tagName:\"span\",properties:{key:\"line-number--\".concat(e),className:[\"comment\",\"linenumber\",\"react-syntax-highlighter-line-number\"],style:t},children:[{type:\"text\",value:e}]}}function C(e,t,n){var r,o={display:\"inline-block\",minWidth:(r=n,\"\".concat(r.toString().length,\".25em\")),paddingRight:\"1em\",textAlign:\"right\",userSelect:\"none\"},a=\"function\"==typeof e?e(t):e;return f()({},o,a)}function A(e){var t=e.children,n=e.lineNumber,r=e.lineNumberStyle,o=e.largestLineNumber,a=e.showInlineLineNumbers,i=e.lineProps,s=void 0===i?{}:i,u=e.className,c=void 0===u?[]:u,l=e.showLineNumbers,p=e.wrapLongLines,h=\"function\"==typeof s?s(n):s;if(h.className=c,n&&a){var d=C(r,n,o);t.unshift(S(n,d))}return p&l&&(h.style=f()({},h.style,{display:\"flex\"})),{type:\"element\",tagName:\"span\",properties:h,children:t}}function k(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=0;r<e.length;r++){var o=e[r];if(\"text\"===o.type)n.push(A({children:[o],className:l()(new Set(t))}));else if(o.children){var a=t.concat(o.properties.className);n=n.concat(k(o.children,a))}}return n}function O(e,t,n,r,o,a,i,s,u){var c,l=k(e.value),p=[],f=-1,h=0;function d(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return A({children:e,lineNumber:t,lineNumberStyle:s,largestLineNumber:i,showInlineLineNumbers:o,lineProps:n,className:a,showLineNumbers:r,wrapLongLines:u})}function m(e,t){if(r&&t&&o){var n=C(s,t,i);e.unshift(S(t,n))}return e}function v(e,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return t||r.length>0?d(e,n,r):m(e,n)}for(var g=function(){var e=l[h],t=e.children[0].value;if(t.match(x)){var n=t.split(\"\\n\");n.forEach((function(t,o){var i=r&&p.length+a,s={type:\"text\",value:\"\".concat(t,\"\\n\")};if(0===o){var u=v(l.slice(f+1,h).concat(A({children:[s],className:e.properties.className})),i);p.push(u)}else if(o===n.length-1){if(l[h+1]&&l[h+1].children&&l[h+1].children[0]){var c=A({children:[{type:\"text\",value:\"\".concat(t)}],className:e.properties.className});l.splice(h+1,0,c)}else{var d=v([s],i,e.properties.className);p.push(d)}}else{var m=v([s],i,e.properties.className);p.push(m)}})),f=h}h++};h<l.length;)g();if(f!==l.length-1){var y=l.slice(f+1,l.length);if(y&&y.length){var b=v(y,r&&p.length+a);p.push(b)}}return t?p:(c=[]).concat.apply(c,p)}function j(e){var t=e.rows,n=e.stylesheet,r=e.useInlineStyles;return t.map((function(e,t){return w({node:e,stylesheet:n,useInlineStyles:r,key:\"code-segement\".concat(t)})}))}function T(e){return e&&void 0!==e.highlightAuto}var I,P,N=n(352),M=n.n(N),R=(I=M.a,P={},function(e){var t=e.language,n=e.children,r=e.style,o=void 0===r?P:r,a=e.customStyle,i=void 0===a?{}:a,s=e.codeTagProps,c=void 0===s?{className:t?\"language-\".concat(t):void 0,style:f()({},o['code[class*=\"language-\"]'],o['code[class*=\"language-'.concat(t,'\"]')])}:s,l=e.useInlineStyles,p=void 0===l||l,h=e.showLineNumbers,m=void 0!==h&&h,v=e.showInlineLineNumbers,g=void 0===v||v,y=e.startingLineNumber,b=void 0===y?1:y,_=e.lineNumberContainerStyle,w=e.lineNumberStyle,x=void 0===w?{}:w,S=e.wrapLines,C=e.wrapLongLines,A=void 0!==C&&C,k=e.lineProps,N=void 0===k?{}:k,M=e.renderer,R=e.PreTag,D=void 0===R?\"pre\":R,L=e.CodeTag,B=void 0===L?\"code\":L,F=e.code,U=void 0===F?Array.isArray(n)?n[0]:n:F,q=e.astGenerator,z=u()(e,[\"language\",\"children\",\"style\",\"customStyle\",\"codeTagProps\",\"useInlineStyles\",\"showLineNumbers\",\"showInlineLineNumbers\",\"startingLineNumber\",\"lineNumberContainerStyle\",\"lineNumberStyle\",\"wrapLines\",\"wrapLongLines\",\"lineProps\",\"renderer\",\"PreTag\",\"CodeTag\",\"code\",\"astGenerator\"]);q=q||I;var V=m?d.a.createElement(E,{containerStyle:_,codeStyle:c.style||{},numberStyle:x,startingLineNumber:b,codeString:U}):null,W=o.hljs||o['pre[class*=\"language-\"]']||{backgroundColor:\"#fff\"},H=T(q)?\"hljs\":\"prismjs\",$=p?Object.assign({},z,{style:Object.assign({},W,i)}):Object.assign({},z,{className:z.className?\"\".concat(H,\" \").concat(z.className):H,style:Object.assign({},i)});if(!q)return d.a.createElement(D,$,V,d.a.createElement(B,c,U));(void 0===S&&M||A)&&(S=!0),M=M||j;var J=[{type:\"text\",value:U}],K=function(e){var t=e.astGenerator,n=e.language,r=e.code,o=e.defaultCodeValue;if(T(t)){var a=function(e,t){return-1!==e.listLanguages().indexOf(t)}(t,n);return\"text\"===n?{value:o,language:\"text\"}:a?t.highlight(n,r):t.highlightAuto(r)}try{return n&&\"text\"!==n?{value:t.highlight(r,n)}:{value:o}}catch(e){return{value:o}}}({astGenerator:q,language:t,code:U,defaultCodeValue:J});null===K.language&&(K.value=J);var Y=O(K,S,N,m,g,b,K.value.length+b,x,A);return c.style=A?f()({},c.style,{whiteSpace:\"pre-wrap\"}):f()({},c.style,{whiteSpace:\"pre\"}),d.a.createElement(D,$,d.a.createElement(B,c,!g&&V,M({rows:Y,stylesheet:o,useInlineStyles:p})))});R.registerLanguage=M.a.registerLanguage;var D=R,L=n(526),B=n.n(L).a,F=n(525),U=n.n(F).a,q=n(527),z=n.n(q).a,V=n(530),W=n.n(V).a,H=n(528),$=n.n(H).a,J=n(529),K=n.n(J).a,Y=n(531),G=n.n(Y).a,Z={hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#333\",color:\"white\"},\"hljs-name\":{fontWeight:\"bold\"},\"hljs-strong\":{fontWeight:\"bold\"},\"hljs-code\":{fontStyle:\"italic\",color:\"#888\"},\"hljs-emphasis\":{fontStyle:\"italic\"},\"hljs-tag\":{color:\"#62c8f3\"},\"hljs-variable\":{color:\"#ade5fc\"},\"hljs-template-variable\":{color:\"#ade5fc\"},\"hljs-selector-id\":{color:\"#ade5fc\"},\"hljs-selector-class\":{color:\"#ade5fc\"},\"hljs-string\":{color:\"#a2fca2\"},\"hljs-bullet\":{color:\"#d36363\"},\"hljs-type\":{color:\"#ffa\"},\"hljs-title\":{color:\"#ffa\"},\"hljs-section\":{color:\"#ffa\"},\"hljs-attribute\":{color:\"#ffa\"},\"hljs-quote\":{color:\"#ffa\"},\"hljs-built_in\":{color:\"#ffa\"},\"hljs-builtin-name\":{color:\"#ffa\"},\"hljs-number\":{color:\"#d36363\"},\"hljs-symbol\":{color:\"#d36363\"},\"hljs-keyword\":{color:\"#fcc28c\"},\"hljs-selector-tag\":{color:\"#fcc28c\"},\"hljs-literal\":{color:\"#fcc28c\"},\"hljs-comment\":{color:\"#888\"},\"hljs-deletion\":{color:\"#333\",backgroundColor:\"#fc9b9b\"},\"hljs-regexp\":{color:\"#c6b4f0\"},\"hljs-link\":{color:\"#c6b4f0\"},\"hljs-meta\":{color:\"#fc9b9b\"},\"hljs-addition\":{backgroundColor:\"#a2fca2\",color:\"#333\"}};D.registerLanguage(\"json\",U),D.registerLanguage(\"js\",B),D.registerLanguage(\"xml\",z),D.registerLanguage(\"yaml\",$),D.registerLanguage(\"http\",K),D.registerLanguage(\"bash\",W),D.registerLanguage(\"powershell\",G),D.registerLanguage(\"javascript\",B);var X={agate:Z,arta:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#222\",color:\"#aaa\"},\"hljs-subst\":{color:\"#aaa\"},\"hljs-section\":{color:\"#fff\",fontWeight:\"bold\"},\"hljs-comment\":{color:\"#444\"},\"hljs-quote\":{color:\"#444\"},\"hljs-meta\":{color:\"#444\"},\"hljs-string\":{color:\"#ffcc33\"},\"hljs-symbol\":{color:\"#ffcc33\"},\"hljs-bullet\":{color:\"#ffcc33\"},\"hljs-regexp\":{color:\"#ffcc33\"},\"hljs-number\":{color:\"#00cc66\"},\"hljs-addition\":{color:\"#00cc66\"},\"hljs-built_in\":{color:\"#32aaee\"},\"hljs-builtin-name\":{color:\"#32aaee\"},\"hljs-literal\":{color:\"#32aaee\"},\"hljs-type\":{color:\"#32aaee\"},\"hljs-template-variable\":{color:\"#32aaee\"},\"hljs-attribute\":{color:\"#32aaee\"},\"hljs-link\":{color:\"#32aaee\"},\"hljs-keyword\":{color:\"#6644aa\"},\"hljs-selector-tag\":{color:\"#6644aa\"},\"hljs-name\":{color:\"#6644aa\"},\"hljs-selector-id\":{color:\"#6644aa\"},\"hljs-selector-class\":{color:\"#6644aa\"},\"hljs-title\":{color:\"#bb1166\"},\"hljs-variable\":{color:\"#bb1166\"},\"hljs-deletion\":{color:\"#bb1166\"},\"hljs-template-tag\":{color:\"#bb1166\"},\"hljs-doctag\":{fontWeight:\"bold\"},\"hljs-strong\":{fontWeight:\"bold\"},\"hljs-emphasis\":{fontStyle:\"italic\"}},monokai:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#272822\",color:\"#ddd\"},\"hljs-tag\":{color:\"#f92672\"},\"hljs-keyword\":{color:\"#f92672\",fontWeight:\"bold\"},\"hljs-selector-tag\":{color:\"#f92672\",fontWeight:\"bold\"},\"hljs-literal\":{color:\"#f92672\",fontWeight:\"bold\"},\"hljs-strong\":{color:\"#f92672\"},\"hljs-name\":{color:\"#f92672\"},\"hljs-code\":{color:\"#66d9ef\"},\"hljs-class .hljs-title\":{color:\"white\"},\"hljs-attribute\":{color:\"#bf79db\"},\"hljs-symbol\":{color:\"#bf79db\"},\"hljs-regexp\":{color:\"#bf79db\"},\"hljs-link\":{color:\"#bf79db\"},\"hljs-string\":{color:\"#a6e22e\"},\"hljs-bullet\":{color:\"#a6e22e\"},\"hljs-subst\":{color:\"#a6e22e\"},\"hljs-title\":{color:\"#a6e22e\",fontWeight:\"bold\"},\"hljs-section\":{color:\"#a6e22e\",fontWeight:\"bold\"},\"hljs-emphasis\":{color:\"#a6e22e\"},\"hljs-type\":{color:\"#a6e22e\",fontWeight:\"bold\"},\"hljs-built_in\":{color:\"#a6e22e\"},\"hljs-builtin-name\":{color:\"#a6e22e\"},\"hljs-selector-attr\":{color:\"#a6e22e\"},\"hljs-selector-pseudo\":{color:\"#a6e22e\"},\"hljs-addition\":{color:\"#a6e22e\"},\"hljs-variable\":{color:\"#a6e22e\"},\"hljs-template-tag\":{color:\"#a6e22e\"},\"hljs-template-variable\":{color:\"#a6e22e\"},\"hljs-comment\":{color:\"#75715e\"},\"hljs-quote\":{color:\"#75715e\"},\"hljs-deletion\":{color:\"#75715e\"},\"hljs-meta\":{color:\"#75715e\"},\"hljs-doctag\":{fontWeight:\"bold\"},\"hljs-selector-id\":{fontWeight:\"bold\"}},nord:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#2E3440\",color:\"#D8DEE9\"},\"hljs-subst\":{color:\"#D8DEE9\"},\"hljs-selector-tag\":{color:\"#81A1C1\"},\"hljs-selector-id\":{color:\"#8FBCBB\",fontWeight:\"bold\"},\"hljs-selector-class\":{color:\"#8FBCBB\"},\"hljs-selector-attr\":{color:\"#8FBCBB\"},\"hljs-selector-pseudo\":{color:\"#88C0D0\"},\"hljs-addition\":{backgroundColor:\"rgba(163, 190, 140, 0.5)\"},\"hljs-deletion\":{backgroundColor:\"rgba(191, 97, 106, 0.5)\"},\"hljs-built_in\":{color:\"#8FBCBB\"},\"hljs-type\":{color:\"#8FBCBB\"},\"hljs-class\":{color:\"#8FBCBB\"},\"hljs-function\":{color:\"#88C0D0\"},\"hljs-function > .hljs-title\":{color:\"#88C0D0\"},\"hljs-keyword\":{color:\"#81A1C1\"},\"hljs-literal\":{color:\"#81A1C1\"},\"hljs-symbol\":{color:\"#81A1C1\"},\"hljs-number\":{color:\"#B48EAD\"},\"hljs-regexp\":{color:\"#EBCB8B\"},\"hljs-string\":{color:\"#A3BE8C\"},\"hljs-title\":{color:\"#8FBCBB\"},\"hljs-params\":{color:\"#D8DEE9\"},\"hljs-bullet\":{color:\"#81A1C1\"},\"hljs-code\":{color:\"#8FBCBB\"},\"hljs-emphasis\":{fontStyle:\"italic\"},\"hljs-formula\":{color:\"#8FBCBB\"},\"hljs-strong\":{fontWeight:\"bold\"},\"hljs-link:hover\":{textDecoration:\"underline\"},\"hljs-quote\":{color:\"#4C566A\"},\"hljs-comment\":{color:\"#4C566A\"},\"hljs-doctag\":{color:\"#8FBCBB\"},\"hljs-meta\":{color:\"#5E81AC\"},\"hljs-meta-keyword\":{color:\"#5E81AC\"},\"hljs-meta-string\":{color:\"#A3BE8C\"},\"hljs-attr\":{color:\"#8FBCBB\"},\"hljs-attribute\":{color:\"#D8DEE9\"},\"hljs-builtin-name\":{color:\"#81A1C1\"},\"hljs-name\":{color:\"#81A1C1\"},\"hljs-section\":{color:\"#88C0D0\"},\"hljs-tag\":{color:\"#81A1C1\"},\"hljs-variable\":{color:\"#D8DEE9\"},\"hljs-template-variable\":{color:\"#D8DEE9\"},\"hljs-template-tag\":{color:\"#5E81AC\"},\"abnf .hljs-attribute\":{color:\"#88C0D0\"},\"abnf .hljs-symbol\":{color:\"#EBCB8B\"},\"apache .hljs-attribute\":{color:\"#88C0D0\"},\"apache .hljs-section\":{color:\"#81A1C1\"},\"arduino .hljs-built_in\":{color:\"#88C0D0\"},\"aspectj .hljs-meta\":{color:\"#D08770\"},\"aspectj > .hljs-title\":{color:\"#88C0D0\"},\"bnf .hljs-attribute\":{color:\"#8FBCBB\"},\"clojure .hljs-name\":{color:\"#88C0D0\"},\"clojure .hljs-symbol\":{color:\"#EBCB8B\"},\"coq .hljs-built_in\":{color:\"#88C0D0\"},\"cpp .hljs-meta-string\":{color:\"#8FBCBB\"},\"css .hljs-built_in\":{color:\"#88C0D0\"},\"css .hljs-keyword\":{color:\"#D08770\"},\"diff .hljs-meta\":{color:\"#8FBCBB\"},\"ebnf .hljs-attribute\":{color:\"#8FBCBB\"},\"glsl .hljs-built_in\":{color:\"#88C0D0\"},\"groovy .hljs-meta:not(:first-child)\":{color:\"#D08770\"},\"haxe .hljs-meta\":{color:\"#D08770\"},\"java .hljs-meta\":{color:\"#D08770\"},\"ldif .hljs-attribute\":{color:\"#8FBCBB\"},\"lisp .hljs-name\":{color:\"#88C0D0\"},\"lua .hljs-built_in\":{color:\"#88C0D0\"},\"moonscript .hljs-built_in\":{color:\"#88C0D0\"},\"nginx .hljs-attribute\":{color:\"#88C0D0\"},\"nginx .hljs-section\":{color:\"#5E81AC\"},\"pf .hljs-built_in\":{color:\"#88C0D0\"},\"processing .hljs-built_in\":{color:\"#88C0D0\"},\"scss .hljs-keyword\":{color:\"#81A1C1\"},\"stylus .hljs-keyword\":{color:\"#81A1C1\"},\"swift .hljs-meta\":{color:\"#D08770\"},\"vim .hljs-built_in\":{color:\"#88C0D0\",fontStyle:\"italic\"},\"yaml .hljs-meta\":{color:\"#D08770\"}},obsidian:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#282b2e\",color:\"#e0e2e4\"},\"hljs-keyword\":{color:\"#93c763\",fontWeight:\"bold\"},\"hljs-selector-tag\":{color:\"#93c763\",fontWeight:\"bold\"},\"hljs-literal\":{color:\"#93c763\",fontWeight:\"bold\"},\"hljs-selector-id\":{color:\"#93c763\"},\"hljs-number\":{color:\"#ffcd22\"},\"hljs-attribute\":{color:\"#668bb0\"},\"hljs-code\":{color:\"white\"},\"hljs-class .hljs-title\":{color:\"white\"},\"hljs-section\":{color:\"white\",fontWeight:\"bold\"},\"hljs-regexp\":{color:\"#d39745\"},\"hljs-link\":{color:\"#d39745\"},\"hljs-meta\":{color:\"#557182\"},\"hljs-tag\":{color:\"#8cbbad\"},\"hljs-name\":{color:\"#8cbbad\",fontWeight:\"bold\"},\"hljs-bullet\":{color:\"#8cbbad\"},\"hljs-subst\":{color:\"#8cbbad\"},\"hljs-emphasis\":{color:\"#8cbbad\"},\"hljs-type\":{color:\"#8cbbad\",fontWeight:\"bold\"},\"hljs-built_in\":{color:\"#8cbbad\"},\"hljs-selector-attr\":{color:\"#8cbbad\"},\"hljs-selector-pseudo\":{color:\"#8cbbad\"},\"hljs-addition\":{color:\"#8cbbad\"},\"hljs-variable\":{color:\"#8cbbad\"},\"hljs-template-tag\":{color:\"#8cbbad\"},\"hljs-template-variable\":{color:\"#8cbbad\"},\"hljs-string\":{color:\"#ec7600\"},\"hljs-symbol\":{color:\"#ec7600\"},\"hljs-comment\":{color:\"#818e96\"},\"hljs-quote\":{color:\"#818e96\"},\"hljs-deletion\":{color:\"#818e96\"},\"hljs-selector-class\":{color:\"#A082BD\"},\"hljs-doctag\":{fontWeight:\"bold\"},\"hljs-title\":{fontWeight:\"bold\"},\"hljs-strong\":{fontWeight:\"bold\"}},\"tomorrow-night\":{\"hljs-comment\":{color:\"#969896\"},\"hljs-quote\":{color:\"#969896\"},\"hljs-variable\":{color:\"#cc6666\"},\"hljs-template-variable\":{color:\"#cc6666\"},\"hljs-tag\":{color:\"#cc6666\"},\"hljs-name\":{color:\"#cc6666\"},\"hljs-selector-id\":{color:\"#cc6666\"},\"hljs-selector-class\":{color:\"#cc6666\"},\"hljs-regexp\":{color:\"#cc6666\"},\"hljs-deletion\":{color:\"#cc6666\"},\"hljs-number\":{color:\"#de935f\"},\"hljs-built_in\":{color:\"#de935f\"},\"hljs-builtin-name\":{color:\"#de935f\"},\"hljs-literal\":{color:\"#de935f\"},\"hljs-type\":{color:\"#de935f\"},\"hljs-params\":{color:\"#de935f\"},\"hljs-meta\":{color:\"#de935f\"},\"hljs-link\":{color:\"#de935f\"},\"hljs-attribute\":{color:\"#f0c674\"},\"hljs-string\":{color:\"#b5bd68\"},\"hljs-symbol\":{color:\"#b5bd68\"},\"hljs-bullet\":{color:\"#b5bd68\"},\"hljs-addition\":{color:\"#b5bd68\"},\"hljs-title\":{color:\"#81a2be\"},\"hljs-section\":{color:\"#81a2be\"},\"hljs-keyword\":{color:\"#b294bb\"},\"hljs-selector-tag\":{color:\"#b294bb\"},hljs:{display:\"block\",overflowX:\"auto\",background:\"#1d1f21\",color:\"#c5c8c6\",padding:\"0.5em\"},\"hljs-emphasis\":{fontStyle:\"italic\"},\"hljs-strong\":{fontWeight:\"bold\"}}},Q=o()(X),ee=function(e){return i()(Q).call(Q,e)?X[e]:(console.warn(\"Request style '\".concat(e,\"' is not available, returning default instead\")),Z)}},function(e,t){e.exports=!0},function(e,t,n){var r=n(237),o=n(68).f,a=n(67),i=n(55),s=n(548),u=n(41)(\"toStringTag\");e.exports=function(e,t,n,c){if(e){var l=n?e:e.prototype;i(l,u)||o(l,u,{configurable:!0,value:t}),c&&!r&&a(l,\"toString\",s)}}},function(e,t,n){var r=n(237),o=n(151),a=n(41)(\"toStringTag\"),i=\"Arguments\"==o(function(){return arguments}());e.exports=r?o:function(e){var t,n,r;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),a))?n:i?o(t):\"Object\"==(r=o(t))&&\"function\"==typeof t.callee?\"Arguments\":r}},function(e,t,n){\"use strict\";e.exports=function(e){if(\"function\"!=typeof e)throw new TypeError(e+\" is not a function\");return e}},function(e,t,n){e.exports=n(679)},function(e,t,n){\"use strict\";function r(e){return function(e){try{return!!JSON.parse(e)}catch(e){return null}}(e)?\"json\":null}n.d(t,\"a\",(function(){return r}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_LAYOUT\",(function(){return o})),n.d(t,\"UPDATE_FILTER\",(function(){return a})),n.d(t,\"UPDATE_MODE\",(function(){return i})),n.d(t,\"SHOW\",(function(){return s})),n.d(t,\"updateLayout\",(function(){return u})),n.d(t,\"updateFilter\",(function(){return c})),n.d(t,\"show\",(function(){return l})),n.d(t,\"changeMode\",(function(){return p}));var r=n(5),o=\"layout_update_layout\",a=\"layout_update_filter\",i=\"layout_update_mode\",s=\"layout_show\";function u(e){return{type:o,payload:e}}function c(e){return{type:a,payload:e}}function l(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=Object(r.v)(e),{type:s,payload:{thing:e,shown:t}}}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";return e=Object(r.v)(e),{type:i,payload:{thing:e,mode:t}}}},function(e,t,n){var r=n(421),o=n(161),a=n(192),i=n(50),s=n(115),u=n(193),c=n(160),l=n(249),p=Object.prototype.hasOwnProperty;e.exports=function(e){if(null==e)return!0;if(s(e)&&(i(e)||\"string\"==typeof e||\"function\"==typeof e.splice||u(e)||l(e)||a(e)))return!e.length;var t=o(e);if(\"[object Map]\"==t||\"[object Set]\"==t)return!e.size;if(c(e))return!r(e).length;for(var n in e)if(p.call(e,n))return!1;return!0}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){e.exports=function(e){if(null==e)throw TypeError(\"Can't call method on \"+e);return e}},function(e,t,n){var r=n(77);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){var r=n(70);e.exports=r(\"navigator\",\"userAgent\")||\"\"},function(e,t,n){var r,o=n(52),a=n(230),i=n(233),s=n(156),u=n(366),c=n(225),l=n(181),p=l(\"IE_PROTO\"),f=function(){},h=function(e){return\"<script>\"+e+\"</\"+\"script>\"},d=function(){try{r=document.domain&&new ActiveXObject(\"htmlfile\")}catch(e){}var e,t;d=r?function(e){e.write(h(\"\")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):((t=c(\"iframe\")).style.display=\"none\",u.appendChild(t),t.src=String(\"javascript:\"),(e=t.contentWindow.document).open(),e.write(h(\"document.F=Object\")),e.close(),e.F);for(var n=i.length;n--;)delete d.prototype[i[n]];return d()};s[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(f.prototype=o(e),n=new f,f.prototype=null,n[p]=e):n=d(),void 0===t?n:a(n,t)}},function(e,t,n){var r=n(67);e.exports=function(e,t,n,o){o&&o.enumerable?e[t]=n:r(e,t,n)}},function(e,t,n){\"use strict\";var r=n(37);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},function(e,t,n){var r=n(134),o=n(686),a=n(687),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?\"[object Undefined]\":\"[object Null]\":i&&i in Object(e)?o(e):a(e)}},function(e,t,n){var r=n(704),o=n(707);e.exports=function(e,t){var n=o(e,t);return r(n)?n:void 0}},function(e,t,n){var r=n(420),o=n(421),a=n(115);e.exports=function(e){return a(e)?r(e):o(e)}},function(e,t,n){var r=n(124),o=n(250);e.exports=function(e){return null!=e&&o(e.length)&&!r(e)}},function(e,t,n){\"use strict\";var r=n(197),o=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t};e.exports=p;var a=n(162);a.inherits=n(61);var i=n(430),s=n(257);a.inherits(p,i);for(var u=o(s.prototype),c=0;c<u.length;c++){var l=u[c];p.prototype[l]||(p.prototype[l]=s.prototype[l])}function p(e){if(!(this instanceof p))return new p(e);i.call(this,e),s.call(this,e),e&&!1===e.readable&&(this.readable=!1),e&&!1===e.writable&&(this.writable=!1),this.allowHalfOpen=!0,e&&!1===e.allowHalfOpen&&(this.allowHalfOpen=!1),this.once(\"end\",f)}function f(){this.allowHalfOpen||this._writableState.ended||r.nextTick(h,this)}function h(e){e.end()}Object.defineProperty(p.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),Object.defineProperty(p.prototype,\"destroyed\",{get:function(){return void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed&&this._writableState.destroyed)},set:function(e){void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed=e,this._writableState.destroyed=e)}}),p.prototype._destroy=function(e,t){this.push(null),this.end(),r.nextTick(t,e)}},function(e,t,n){\"use strict\";var r=n(780)();e.exports=function(e){return e!==r&&null!==e}},function(e,t,n){\"use strict\";var r=n(781),o=Math.max;e.exports=function(e){return o(0,r(e))}},function(e,t,n){},function(e,t,n){\"use strict\";var r=n(441),o=n(795),a=n(438),i=n(436),s=n(799);(e.exports=function(e,t){var n,o,u,c,l;return arguments.length<2||\"string\"!=typeof e?(c=t,t=e,e=null):c=arguments[2],r(e)?(n=s.call(e,\"c\"),o=s.call(e,\"e\"),u=s.call(e,\"w\")):(n=u=!0,o=!1),l={value:t,configurable:n,enumerable:o,writable:u},c?a(i(c),l):l}).gs=function(e,t,n){var u,c,l,p;return\"string\"!=typeof e?(l=n,n=t,t=e,e=null):l=arguments[3],r(t)?o(t)?r(n)?o(n)||(l=n,n=void 0):n=void 0:(l=t,t=n=void 0):t=void 0,r(e)?(u=s.call(e,\"c\"),c=s.call(e,\"e\")):(u=!0,c=!1),p={get:t,set:n,configurable:u,enumerable:c},l?a(i(l),p):p}},function(e,t,n){var r=n(52),o=n(397),a=n(69),i=n(107),s=n(159),u=n(396),c=function(e,t){this.stopped=e,this.result=t};e.exports=function(e,t,n){var l,p,f,h,d,m,v,g=n&&n.that,y=!(!n||!n.AS_ENTRIES),b=!(!n||!n.IS_ITERATOR),_=!(!n||!n.INTERRUPTED),w=i(t,g,1+y+_),x=function(e){return l&&u(l),new c(!0,e)},E=function(e){return y?(r(e),_?w(e[0],e[1],x):w(e[0],e[1])):_?w(e,x):w(e)};if(b)l=e;else{if(\"function\"!=typeof(p=s(e)))throw TypeError(\"Target is not iterable\");if(o(p)){for(f=0,h=a(e.length);h>f;f++)if((d=E(e[f]))&&d instanceof c)return d;return new c(!1)}l=p.call(e)}for(m=l.next;!(v=m.call(l)).done;){try{d=E(v.value)}catch(e){throw u(l),e}if(\"object\"==typeof d&&d&&d instanceof c)return d}return new c(!1)}},function(e,t,n){\"use strict\";var r=n(30),o=(n(25),function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)}),a=function(e){var t=this;e instanceof t||r(\"25\"),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},i=o,s={addPoolingTo:function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||i,n.poolSize||(n.poolSize=10),n.release=a,n},oneArgumentPooler:o,twoArgumentPooler:function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},threeArgumentPooler:function(e,t,n){var r=this;if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,e,t,n),o}return new r(e,t,n)},fourArgumentPooler:function(e,t,n,r){var o=this;if(o.instancePool.length){var a=o.instancePool.pop();return o.call(a,e,t,n,r),a}return new o(e,t,n,r)}};e.exports=s},function(e,t){e.exports=function(e,t){return e===t||e!=e&&t!=t}},function(e,t,n){var r=n(112),o=n(57);e.exports=function(e){if(!o(e))return!1;var t=r(e);return\"[object Function]\"==t||\"[object GeneratorFunction]\"==t||\"[object AsyncFunction]\"==t||\"[object Proxy]\"==t}},function(e,t,n){e.exports=n(1095)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return l}));var r=n(12),o=n.n(r),a=n(4),i=n.n(a),s=n(517),u=n.n(s),c=[n(288),n(289)];function l(e){var t,n={jsSpec:{}},r=u()(c,(function(e,t){try{var r=t.transform(e,n);return o()(r).call(r,(function(e){return!!e}))}catch(t){return console.error(\"Transformer error:\",t),e}}),e);return i()(t=o()(r).call(r,(function(e){return!!e}))).call(t,(function(e){return!e.get(\"line\")&&e.get(\"path\"),e}))}},function(e,t,n){var r=n(48),o=n(176),a=n(105),i=n(66),s=n(178),u=n(55),c=n(361),l=Object.getOwnPropertyDescriptor;t.f=r?l:function(e,t){if(e=i(e),t=s(t,!0),c)try{return l(e,t)}catch(e){}if(u(e,t))return a(!o.f.call(e,t),e[t])}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r,o,a=n(40),i=n(108),s=a.process,u=s&&s.versions,c=u&&u.v8;c?o=(r=c.split(\".\"))[0]<4?1:r[0]+r[1]:i&&(!(r=i.match(/Edge\\/(\\d+)/))||r[1]>=74)&&(r=i.match(/Chrome\\/(\\d+)/))&&(o=r[1]),e.exports=o&&+o},function(e,t,n){\"use strict\";var r=n(370).charAt,o=n(78),a=n(238),i=\"String Iterator\",s=o.set,u=o.getterFor(i);a(String,\"String\",(function(e){s(this,{type:i,string:String(e),index:0})}),(function(){var e,t=u(this),n=t.string,o=t.index;return o>=n.length?{value:void 0,done:!0}:(e=r(n,o),t.index+=e.length,{value:e,done:!1})}))},function(e,t){e.exports={}},function(e,t,n){\"use strict\";var r=n(38),o=n(383),a=n(613),i=n(618),s=n(133),u=n(619),c=n(623),l=n(624),p=n(626),f=s.createElement,h=s.createFactory,d=s.cloneElement,m=r,v={Children:{map:a.map,forEach:a.forEach,count:a.count,toArray:a.toArray,only:p},Component:o.Component,PureComponent:o.PureComponent,createElement:f,cloneElement:d,isValidElement:s.isValidElement,PropTypes:u,createClass:l,createFactory:h,createMixin:function(e){return e},DOM:i,version:c,__spread:m};e.exports=v},function(e,t,n){\"use strict\";var r=n(38),o=n(88),a=(n(33),n(385),Object.prototype.hasOwnProperty),i=n(386),s={key:!0,ref:!0,__self:!0,__source:!0};function u(e){return void 0!==e.ref}function c(e){return void 0!==e.key}var l=function(e,t,n,r,o,a,s){return{$$typeof:i,type:e,key:t,ref:n,props:s,_owner:a}};l.createElement=function(e,t,n){var r,i={},p=null,f=null;if(null!=t)for(r in u(t)&&(f=t.ref),c(t)&&(p=\"\"+t.key),void 0===t.__self?null:t.__self,void 0===t.__source?null:t.__source,t)a.call(t,r)&&!s.hasOwnProperty(r)&&(i[r]=t[r]);var h=arguments.length-2;if(1===h)i.children=n;else if(h>1){for(var d=Array(h),m=0;m<h;m++)d[m]=arguments[m+2];0,i.children=d}if(e&&e.defaultProps){var v=e.defaultProps;for(r in v)void 0===i[r]&&(i[r]=v[r])}return l(e,p,f,0,0,o.current,i)},l.createFactory=function(e){var t=l.createElement.bind(null,e);return t.type=e,t},l.cloneAndReplaceKey=function(e,t){return l(e.type,t,e.ref,e._self,e._source,e._owner,e.props)},l.cloneElement=function(e,t,n){var i,p,f=r({},e.props),h=e.key,d=e.ref,m=(e._self,e._source,e._owner);if(null!=t)for(i in u(t)&&(d=t.ref,m=o.current),c(t)&&(h=\"\"+t.key),e.type&&e.type.defaultProps&&(p=e.type.defaultProps),t)a.call(t,i)&&!s.hasOwnProperty(i)&&(void 0===t[i]&&void 0!==p?f[i]=p[i]:f[i]=t[i]);var v=arguments.length-2;if(1===v)f.children=n;else if(v>1){for(var g=Array(v),y=0;y<v;y++)g[y]=arguments[y+2];f.children=g}return l(e.type,h,d,0,0,m,f)},l.isValidElement=function(e){return\"object\"==typeof e&&null!==e&&e.$$typeof===i},e.exports=l},function(e,t,n){var r=n(71).Symbol;e.exports=r},function(e,t,n){var r=n(50),o=n(253),a=n(751),i=n(92);e.exports=function(e,t){return r(e)?e:o(e,t)?[e]:a(i(e))}},function(e,t,n){var r=n(186);e.exports=function(e){if(\"string\"==typeof e||r(e))return e;var t=e+\"\";return\"0\"==t&&1/e==-Infinity?\"-0\":t}},function(e,t,n){\"use strict\";var r=n(117);e.exports=function(e){if(!r(e))throw new TypeError(\"Cannot use null or undefined\");return e}},function(e,t,n){var r=n(62).Buffer;function o(e,t){this._block=r.alloc(e),this._finalSize=t,this._blockSize=e,this._len=0}o.prototype.update=function(e,t){\"string\"==typeof e&&(t=t||\"utf8\",e=r.from(e,t));for(var n=this._block,o=this._blockSize,a=e.length,i=this._len,s=0;s<a;){for(var u=i%o,c=Math.min(a-s,o-u),l=0;l<c;l++)n[u+l]=e[s+l];s+=c,(i+=c)%o==0&&this._update(n)}return this._len+=a,this},o.prototype.digest=function(e){var t=this._len%this._blockSize;this._block[t]=128,this._block.fill(0,t+1),t>=this._finalSize&&(this._update(this._block),this._block.fill(0));var n=8*this._len;if(n<=4294967295)this._block.writeUInt32BE(n,this._blockSize-4);else{var r=(4294967295&n)>>>0,o=(n-r)/4294967296;this._block.writeUInt32BE(o,this._blockSize-8),this._block.writeUInt32BE(r,this._blockSize-4)}this._update(this._block);var a=this._hash();return e?a.toString(e):a},o.prototype._update=function(){throw new Error(\"_update must be implemented by subclass\")},e.exports=o},function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError(\"Incorrect \"+(n?n+\" \":\"\")+\"invocation\");return e}},function(e,t,n){\"use strict\";var r=n(30);n(25);function o(e,t){return(e&t)===t}var a={MUST_USE_PROPERTY:1,HAS_BOOLEAN_VALUE:4,HAS_NUMERIC_VALUE:8,HAS_POSITIVE_NUMERIC_VALUE:24,HAS_OVERLOADED_BOOLEAN_VALUE:32,injectDOMPropertyConfig:function(e){var t=a,n=e.Properties||{},i=e.DOMAttributeNamespaces||{},u=e.DOMAttributeNames||{},c=e.DOMPropertyNames||{},l=e.DOMMutationMethods||{};for(var p in e.isCustomAttribute&&s._isCustomAttributeFunctions.push(e.isCustomAttribute),n){s.properties.hasOwnProperty(p)&&r(\"48\",p);var f=p.toLowerCase(),h=n[p],d={attributeName:f,attributeNamespace:null,propertyName:p,mutationMethod:null,mustUseProperty:o(h,t.MUST_USE_PROPERTY),hasBooleanValue:o(h,t.HAS_BOOLEAN_VALUE),hasNumericValue:o(h,t.HAS_NUMERIC_VALUE),hasPositiveNumericValue:o(h,t.HAS_POSITIVE_NUMERIC_VALUE),hasOverloadedBooleanValue:o(h,t.HAS_OVERLOADED_BOOLEAN_VALUE)};if(d.hasBooleanValue+d.hasNumericValue+d.hasOverloadedBooleanValue<=1||r(\"50\",p),u.hasOwnProperty(p)){var m=u[p];d.attributeName=m}i.hasOwnProperty(p)&&(d.attributeNamespace=i[p]),c.hasOwnProperty(p)&&(d.propertyName=c[p]),l.hasOwnProperty(p)&&(d.mutationMethod=l[p]),s.properties[p]=d}}},i=\":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\",s={ID_ATTRIBUTE_NAME:\"data-reactid\",ROOT_ATTRIBUTE_NAME:\"data-reactroot\",ATTRIBUTE_NAME_START_CHAR:i,ATTRIBUTE_NAME_CHAR:i+\"\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\",properties:{},getPossibleStandardName:null,_isCustomAttributeFunctions:[],isCustomAttribute:function(e){for(var t=0;t<s._isCustomAttributeFunctions.length;t++){if((0,s._isCustomAttributeFunctions[t])(e))return!0}return!1},injection:a};e.exports=s},function(e,t,n){\"use strict\";var r=n(925);n(72),n(33);function o(){r.attachRefs(this,this._currentElement)}var a={mountComponent:function(e,t,n,r,a,i){var s=e.mountComponent(t,n,r,a,i);return e._currentElement&&null!=e._currentElement.ref&&t.getReactMountReady().enqueue(o,e),s},getHostNode:function(e){return e.getHostNode()},unmountComponent:function(e,t){r.detachRefs(e,e._currentElement),e.unmountComponent(t)},receiveComponent:function(e,t,n,a){var i=e._currentElement;if(t!==i||a!==e._context){0;var s=r.shouldUpdateRefs(i,t);s&&r.detachRefs(e,i),e.receiveComponent(t,n,a),s&&e._currentElement&&null!=e._currentElement.ref&&n.getReactMountReady().enqueue(o,e)}},performUpdateIfNecessary:function(e,t,n){e._updateBatchNumber===n&&e.performUpdateIfNecessary(t)}};e.exports=a},function(e,t,n){\"use strict\";var r=n(268),o=n(204),a=n(269),i=n(476),s=\"undefined\"!=typeof document&&\"number\"==typeof document.documentMode||\"undefined\"!=typeof navigator&&\"string\"==typeof navigator.userAgent&&/\\bEdge\\/\\d/.test(navigator.userAgent);function u(e){if(s){var t=e.node,n=e.children;if(n.length)for(var r=0;r<n.length;r++)c(t,n[r],null);else null!=e.html?o(t,e.html):null!=e.text&&i(t,e.text)}}var c=a((function(e,t,n){11===t.node.nodeType||1===t.node.nodeType&&\"object\"===t.node.nodeName.toLowerCase()&&(null==t.node.namespaceURI||t.node.namespaceURI===r.html)?(u(t),e.insertBefore(t.node,n)):(e.insertBefore(t.node,n),u(t))}));function l(){return this.node.nodeName}function p(e){return{node:e,children:[],html:null,text:null,toString:l}}p.insertTreeBefore=c,p.replaceChildWithTree=function(e,t){e.parentNode.replaceChild(t.node,e),u(t)},p.queueChild=function(e,t){s?e.children.push(t):e.node.appendChild(t.node)},p.queueHTML=function(e,t){s?e.html=t:o(e.node,t)},p.queueText=function(e,t){s?e.text=t:i(e.node,t)},e.exports=p},function(e,t,n){var r=n(201),o=n(463);e.exports=function(e,t,n,a){var i=!n;n||(n={});for(var s=-1,u=t.length;++s<u;){var c=t[s],l=a?a(n[c],e[c],c,n,e):void 0;void 0===l&&(l=e[c]),i?o(n,c,l):r(n,c,l)}return n}},function(e,t,n){var r=n(112),o=n(278),a=n(89),i=Function.prototype,s=Object.prototype,u=i.toString,c=s.hasOwnProperty,l=u.call(Object);e.exports=function(e){if(!a(e)||\"[object Object]\"!=r(e))return!1;var t=o(e);if(null===t)return!0;var n=c.call(t,\"constructor\")&&t.constructor;return\"function\"==typeof n&&n instanceof n&&u.call(n)==l}},function(e,t,n){\"use strict\";(function(t){class n extends Error{constructor(e){super(n._prepareSuperMessage(e)),Object.defineProperty(this,\"name\",{value:\"NonError\",configurable:!0,writable:!0}),Error.captureStackTrace&&Error.captureStackTrace(this,n)}static _prepareSuperMessage(e){try{return JSON.stringify(e)}catch{return String(e)}}}const r=[{property:\"name\",enumerable:!1},{property:\"message\",enumerable:!1},{property:\"stack\",enumerable:!1},{property:\"code\",enumerable:!0}],o=Symbol(\".toJSON called\"),a=({from:e,seen:n,to_:i,forceEnumerable:s,maxDepth:u,depth:c})=>{const l=i||(Array.isArray(e)?[]:{});if(n.push(e),c>=u)return l;if(\"function\"==typeof e.toJSON&&!0!==e[o])return(e=>{e[o]=!0;const t=e.toJSON();return delete e[o],t})(e);for(const[r,o]of Object.entries(e))\"function\"==typeof t&&t.isBuffer(o)?l[r]=\"[object Buffer]\":\"function\"!=typeof o&&(o&&\"object\"==typeof o?n.includes(e[r])?l[r]=\"[Circular]\":(c++,l[r]=a({from:e[r],seen:n.slice(),forceEnumerable:s,maxDepth:u,depth:c})):l[r]=o);for(const{property:t,enumerable:n}of r)\"string\"==typeof e[t]&&Object.defineProperty(l,t,{value:e[t],enumerable:!!s||n,configurable:!0,writable:!0});return l};e.exports={serializeError:(e,t={})=>{const{maxDepth:n=Number.POSITIVE_INFINITY}=t;return\"object\"==typeof e&&null!==e?a({from:e,seen:[],forceEnumerable:!0,maxDepth:n,depth:0}):\"function\"==typeof e?`[Function: ${e.name||\"anonymous\"}]`:e},deserializeError:(e,t={})=>{const{maxDepth:r=Number.POSITIVE_INFINITY}=t;if(e instanceof Error)return e;if(\"object\"==typeof e&&null!==e&&!Array.isArray(e)){const t=new Error;return a({from:e,seen:[],to_:t,maxDepth:r,depth:0}),t}return new n(e)}}}).call(this,n(73).Buffer)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"sampleFromSchemaGeneric\",(function(){return B})),n.d(t,\"inferSchema\",(function(){return F})),n.d(t,\"createXMLExample\",(function(){return U})),n.d(t,\"sampleFromSchema\",(function(){return q})),n.d(t,\"memoizedCreateXMLExample\",(function(){return z})),n.d(t,\"memoizedSampleFromSchema\",(function(){return V}));var r=n(18),o=n.n(r),a=n(2),i=n.n(a),s=n(17),u=n.n(s),c=n(23),l=n.n(c),p=n(22),f=n.n(p),h=n(31),d=n.n(h),m=n(75),v=n.n(m),g=n(19),y=n.n(g),b=n(64),_=n.n(b),w=n(4),x=n.n(w),E=n(5),S=n(513),C=n.n(S),A=n(347),k=n.n(A),O=n(104),j=n.n(O),T={string:function(){return\"string\"},string_email:function(){return\"user@example.com\"},\"string_date-time\":function(){return(new Date).toISOString()},string_date:function(){return(new Date).toISOString().substring(0,10)},string_uuid:function(){return\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"},string_hostname:function(){return\"example.com\"},string_ipv4:function(){return\"198.51.100.42\"},string_ipv6:function(){return\"2001:0db8:5b96:0000:0000:426f:8e17:642a\"},number:function(){return 0},number_float:function(){return 0},integer:function(){return 0},boolean:function(e){return\"boolean\"!=typeof e.default||e.default}},I=function(e){var t,n=e=Object(E.z)(e),r=n.type,o=n.format,a=T[i()(t=\"\".concat(r,\"_\")).call(t,o)]||T[r];return Object(E.s)(a)?a(e):\"Unknown Type: \"+e.type},P=function(e){return Object(E.e)(e,\"$$ref\",(function(e){return\"string\"==typeof e&&u()(e).call(e,\"#\")>-1}))},N=[\"maxProperties\",\"minProperties\"],M=[\"minItems\",\"maxItems\"],R=[\"minimum\",\"maximum\",\"exclusiveMinimum\",\"exclusiveMaximum\"],D=[\"minLength\",\"maxLength\"],L=function e(t,n){var r,o,a,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},c=function(e){void 0===n[e]&&void 0!==t[e]&&(n[e]=t[e])};(l()(r=i()(o=[\"example\",\"default\",\"enum\",\"xml\",\"type\"]).call(o,N,M,R,D)).call(r,(function(e){return c(e)})),void 0!==t.required&&f()(t.required))&&(void 0!==n.required&&n.required.length||(n.required=[]),l()(a=t.required).call(a,(function(e){var t;d()(t=n.required).call(t,e)||n.required.push(e)})));if(t.properties){n.properties||(n.properties={});var p=Object(E.z)(t.properties);for(var h in p){var m;if(Object.prototype.hasOwnProperty.call(p,h))if(!p[h]||!p[h].deprecated)if(!p[h]||!p[h].readOnly||s.includeReadOnly)if(!p[h]||!p[h].writeOnly||s.includeWriteOnly)if(!n.properties[h])n.properties[h]=p[h],!t.required&&f()(t.required)&&-1!==u()(m=t.required).call(m,h)&&(n.required?n.required.push(h):n.required=[h])}}return t.items&&(n.items||(n.items={}),n.items=e(t.items,n.items,s)),n},B=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3];t&&Object(E.s)(t.toJS)&&(t=t.toJS());var s=void 0!==r||t&&void 0!==t.example||t&&void 0!==t.default,c=!s&&t&&t.oneOf&&t.oneOf.length>0,p=!s&&t&&t.anyOf&&t.anyOf.length>0;if(!s&&(c||p)){var h=Object(E.z)(c?t.oneOf[0]:t.anyOf[0]);if(L(h,t,n),!t.xml&&h.xml&&(t.xml=h.xml),void 0!==t.example&&void 0!==h.example)s=!0;else if(h.properties){t.properties||(t.properties={});var m=Object(E.z)(h.properties);for(var g in m){var b;if(Object.prototype.hasOwnProperty.call(m,g))if(!m[g]||!m[g].deprecated)if(!m[g]||!m[g].readOnly||n.includeReadOnly)if(!m[g]||!m[g].writeOnly||n.includeWriteOnly)if(!t.properties[g])t.properties[g]=m[g],!h.required&&f()(h.required)&&-1!==u()(b=h.required).call(b,g)&&(t.required?t.required.push(g):t.required=[g])}}}var w,S={},C=t||{},A=C.xml,k=C.type,O=C.example,T=C.properties,D=C.additionalProperties,B=C.items,F=n.includeReadOnly,U=n.includeWriteOnly,q=A=A||{},z=q.name,V=q.prefix,W=q.namespace,H={};if(a&&(w=(V?V+\":\":\"\")+(z=z||\"notagname\"),W)){var $=V?\"xmlns:\"+V:\"xmlns\";S[$]=W}a&&(H[w]=[]);var J=function(e){return v()(e).call(e,(function(e){return Object.prototype.hasOwnProperty.call(t,e)}))};t&&!k&&(T||D||J(N)?k=\"object\":B||J(M)?k=\"array\":J(R)?(k=\"number\",t.type=\"number\"):s||t.enum||(k=\"string\",t.type=\"string\"));var K,Y,G=function(e){var n,r,o,a,i;null!==(null===(n=t)||void 0===n?void 0:n.maxItems)&&void 0!==(null===(r=t)||void 0===r?void 0:r.maxItems)&&(e=y()(e).call(e,0,null===(i=t)||void 0===i?void 0:i.maxItems));if(null!==(null===(o=t)||void 0===o?void 0:o.minItems)&&void 0!==(null===(a=t)||void 0===a?void 0:a.minItems))for(var s=0;e.length<(null===(u=t)||void 0===u?void 0:u.minItems);){var u;e.push(e[s++%e.length])}return e},Z=Object(E.z)(T),X=0,Q=function(){return t&&null!==t.maxProperties&&void 0!==t.maxProperties&&X>=t.maxProperties},ee=function(){if(!t||!t.required)return 0;var e,n,r=0;a?l()(e=t.required).call(e,(function(e){return r+=void 0===H[e]?0:1})):l()(n=t.required).call(n,(function(e){var t;return r+=void 0===(null===(t=H[w])||void 0===t?void 0:_()(t).call(t,(function(t){return void 0!==t[e]})))?0:1}));return t.required.length-r},te=function(e){var n;return!(t&&t.required&&t.required.length)||!d()(n=t.required).call(n,e)},ne=function(e){return!t||null===t.maxProperties||void 0===t.maxProperties||!Q()&&(!te(e)||t.maxProperties-X-ee()>0)};if(K=a?function(r){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(t&&Z[r]){if(Z[r].xml=Z[r].xml||{},Z[r].xml.attribute){var s=f()(Z[r].enum)?Z[r].enum[0]:void 0,u=Z[r].example,c=Z[r].default;return void(S[Z[r].xml.name||r]=void 0!==u?u:void 0!==c?c:void 0!==s?s:I(Z[r]))}Z[r].xml.name=Z[r].xml.name||r}else Z[r]||!1===D||(Z[r]={xml:{name:r}});var l,p=e(t&&Z[r]||void 0,n,o,a);ne(r)&&(X++,f()(p)?H[w]=i()(l=H[w]).call(l,p):H[w].push(p))}:function(t,r){ne(t)&&(H[t]=e(Z[t],n,r,a),X++)},s){var re;if(re=P(void 0!==r?r:void 0!==O?O:t.default),!a){if(\"number\"==typeof re&&\"string\"===k)return\"\".concat(re);if(\"string\"!=typeof re||\"string\"===k)return re;try{return JSON.parse(re)}catch(e){return re}}if(t||(k=f()(re)?\"array\":o()(re)),\"array\"===k){if(!f()(re)){if(\"string\"==typeof re)return re;re=[re]}var oe=t?t.items:void 0;oe&&(oe.xml=oe.xml||A||{},oe.xml.name=oe.xml.name||A.name);var ae=x()(re).call(re,(function(t){return e(oe,n,t,a)}));return ae=G(ae),A.wrapped?(H[w]=ae,j()(S)||H[w].push({_attr:S})):H=ae,H}if(\"object\"===k){if(\"string\"==typeof re)return re;for(var ie in re)Object.prototype.hasOwnProperty.call(re,ie)&&(t&&Z[ie]&&Z[ie].readOnly&&!F||t&&Z[ie]&&Z[ie].writeOnly&&!U||(t&&Z[ie]&&Z[ie].xml&&Z[ie].xml.attribute?S[Z[ie].xml.name||ie]=re[ie]:K(ie,re[ie])));return j()(S)||H[w].push({_attr:S}),H}return H[w]=j()(S)?re:[{_attr:S},re],H}if(\"object\"===k){for(var se in Z)Object.prototype.hasOwnProperty.call(Z,se)&&(Z[se]&&Z[se].deprecated||Z[se]&&Z[se].readOnly&&!F||Z[se]&&Z[se].writeOnly&&!U||K(se));if(a&&S&&H[w].push({_attr:S}),Q())return H;if(!0===D)a?H[w].push({additionalProp:\"Anything can be here\"}):H.additionalProp1={},X++;else if(D){var ue=Object(E.z)(D),ce=e(ue,n,void 0,a);if(a&&ue.xml&&ue.xml.name&&\"notagname\"!==ue.xml.name)H[w].push(ce);else for(var le=null!==t.minProperties&&void 0!==t.minProperties&&X<t.minProperties?t.minProperties-X:4,pe=1;pe<le;pe++){if(Q())return H;if(a){var fe={};fe[\"additionalProp\"+pe]=ce.notagname,H[w].push(fe)}else H[\"additionalProp\"+pe]=ce;X++}}return H}if(\"array\"===k){if(!B)return;var he,de,me;if(a)B.xml=B.xml||(null===(de=t)||void 0===de?void 0:de.xml)||{},B.xml.name=B.xml.name||A.name;if(f()(B.anyOf))he=x()(me=B.anyOf).call(me,(function(t){return e(L(B,t,n),n,void 0,a)}));else if(f()(B.oneOf)){var ve;he=x()(ve=B.oneOf).call(ve,(function(t){return e(L(B,t,n),n,void 0,a)}))}else{if(!(!a||a&&A.wrapped))return e(B,n,void 0,a);he=[e(B,n,void 0,a)]}return he=G(he),a&&A.wrapped?(H[w]=he,j()(S)||H[w].push({_attr:S}),H):he}if(t&&f()(t.enum))Y=Object(E.v)(t.enum)[0];else{if(!t)return;if(\"number\"==typeof(Y=I(t))){var ge=t.minimum;null!=ge&&(t.exclusiveMinimum&&ge++,Y=ge);var ye=t.maximum;null!=ye&&(t.exclusiveMaximum&&ye--,Y=ye)}if(\"string\"==typeof Y&&(null!==t.maxLength&&void 0!==t.maxLength&&(Y=y()(Y).call(Y,0,t.maxLength)),null!==t.minLength&&void 0!==t.minLength))for(var be=0;Y.length<t.minLength;)Y+=Y[be++%Y.length]}if(\"file\"!==k)return a?(H[w]=j()(S)?Y:[{_attr:S},Y],H):Y},F=function(e){return e.schema&&(e=e.schema),e.properties&&(e.type=\"object\"),e},U=function(e,t,n){var r=B(e,t,n,!0);if(r)return\"string\"==typeof r?r:C()(r,{declaration:!0,indent:\"\\t\"})},q=function(e,t,n){return B(e,t,n,!1)},z=k()(U),V=k()(q)},function(e,t,n){\"use strict\";var r=n(1037).CopyToClipboard;r.CopyToClipboard=r,e.exports=r},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_CONFIGS\",(function(){return a})),n.d(t,\"TOGGLE_CONFIGS\",(function(){return i})),n.d(t,\"update\",(function(){return s})),n.d(t,\"toggle\",(function(){return u})),n.d(t,\"loaded\",(function(){return c}));var r=n(3),o=n.n(r),a=\"configs_update\",i=\"configs_toggle\";function s(e,t){return{type:a,payload:o()({},e,t)}}function u(e){return{type:i,payload:e}}var c=function(){return function(e){var t=e.getConfigs,n=e.authActions;if(t().persistAuthorization){var r=localStorage.getItem(\"authorized\");r&&n.restoreAuthorization({authorized:JSON.parse(r)})}}}},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return l}));var r=n(12),o=n.n(r),a=n(31),i=n.n(a),s=n(1),u=n.n(s),c=u.a.Set.of(\"type\",\"format\",\"items\",\"default\",\"maximum\",\"exclusiveMaximum\",\"minimum\",\"exclusiveMinimum\",\"maxLength\",\"minLength\",\"pattern\",\"maxItems\",\"minItems\",\"uniqueItems\",\"enum\",\"multipleOf\");function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isOAS3;if(!u.a.Map.isMap(e))return{schema:u.a.Map(),parameterContentMediaType:null};if(!n)return\"body\"===e.get(\"in\")?{schema:e.get(\"schema\",u.a.Map()),parameterContentMediaType:null}:{schema:o()(e).call(e,(function(e,t){return i()(c).call(c,t)})),parameterContentMediaType:null};if(e.get(\"content\")){var r=e.get(\"content\",u.a.Map({})).keySeq(),a=r.first();return{schema:e.getIn([\"content\",a,\"schema\"],u.a.Map()),parameterContentMediaType:a}}return{schema:e.get(\"schema\",u.a.Map()),parameterContentMediaType:null}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"createStore\",(function(){return C})),n.d(t,\"combineReducers\",(function(){return k})),n.d(t,\"bindActionCreators\",(function(){return j})),n.d(t,\"applyMiddleware\",(function(){return P})),n.d(t,\"compose\",(function(){return T}));var r=n(508),o=\"object\"==typeof self&&self&&self.Object===Object&&self,a=(r.a||o||Function(\"return this\")()).Symbol,i=Object.prototype,s=i.hasOwnProperty,u=i.toString,c=a?a.toStringTag:void 0;var l=function(e){var t=s.call(e,c),n=e[c];try{e[c]=void 0;var r=!0}catch(e){}var o=u.call(e);return r&&(t?e[c]=n:delete e[c]),o},p=Object.prototype.toString;var f=function(e){return p.call(e)},h=a?a.toStringTag:void 0;var d=function(e){return null==e?void 0===e?\"[object Undefined]\":\"[object Null]\":h&&h in Object(e)?l(e):f(e)};var m=function(e,t){return function(n){return e(t(n))}}(Object.getPrototypeOf,Object);var v=function(e){return null!=e&&\"object\"==typeof e},g=Function.prototype,y=Object.prototype,b=g.toString,_=y.hasOwnProperty,w=b.call(Object);var x=function(e){if(!v(e)||\"[object Object]\"!=d(e))return!1;var t=m(e);if(null===t)return!0;var n=_.call(t,\"constructor\")&&t.constructor;return\"function\"==typeof n&&n instanceof n&&b.call(n)==w},E=n(345),S=\"@@redux/INIT\";function C(e,t,n){var r;if(\"function\"==typeof t&&void 0===n&&(n=t,t=void 0),void 0!==n){if(\"function\"!=typeof n)throw new Error(\"Expected the enhancer to be a function.\");return n(C)(e,t)}if(\"function\"!=typeof e)throw new Error(\"Expected the reducer to be a function.\");var o=e,a=t,i=[],s=i,u=!1;function c(){s===i&&(s=i.slice())}function l(){return a}function p(e){if(\"function\"!=typeof e)throw new Error(\"Expected listener to be a function.\");var t=!0;return c(),s.push(e),function(){if(t){t=!1,c();var n=s.indexOf(e);s.splice(n,1)}}}function f(e){if(!x(e))throw new Error(\"Actions must be plain objects. Use custom middleware for async actions.\");if(void 0===e.type)throw new Error('Actions may not have an undefined \"type\" property. Have you misspelled a constant?');if(u)throw new Error(\"Reducers may not dispatch actions.\");try{u=!0,a=o(a,e)}finally{u=!1}for(var t=i=s,n=0;n<t.length;n++){(0,t[n])()}return e}return f({type:S}),(r={dispatch:f,subscribe:p,getState:l,replaceReducer:function(e){if(\"function\"!=typeof e)throw new Error(\"Expected the nextReducer to be a function.\");o=e,f({type:S})}})[E.a]=function(){var e,t=p;return(e={subscribe:function(e){if(\"object\"!=typeof e)throw new TypeError(\"Expected the observer to be an object.\");function n(){e.next&&e.next(l())}return n(),{unsubscribe:t(n)}}})[E.a]=function(){return this},e},r}function A(e,t){var n=t&&t.type;return\"Given action \"+(n&&'\"'+n.toString()+'\"'||\"an action\")+', reducer \"'+e+'\" returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.'}function k(e){for(var t=Object.keys(e),n={},r=0;r<t.length;r++){var o=t[r];0,\"function\"==typeof e[o]&&(n[o]=e[o])}var a=Object.keys(n);var i=void 0;try{!function(e){Object.keys(e).forEach((function(t){var n=e[t];if(void 0===n(void 0,{type:S}))throw new Error('Reducer \"'+t+\"\\\" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.\");if(void 0===n(void 0,{type:\"@@redux/PROBE_UNKNOWN_ACTION_\"+Math.random().toString(36).substring(7).split(\"\").join(\".\")}))throw new Error('Reducer \"'+t+\"\\\" returned undefined when probed with a random type. Don't try to handle \"+S+' or other actions in \"redux/*\" namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.')}))}(n)}catch(e){i=e}return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];if(i)throw i;for(var r=!1,o={},s=0;s<a.length;s++){var u=a[s],c=n[u],l=e[u],p=c(l,t);if(void 0===p){var f=A(u,t);throw new Error(f)}o[u]=p,r=r||p!==l}return r?o:e}}function O(e,t){return function(){return t(e.apply(void 0,arguments))}}function j(e,t){if(\"function\"==typeof e)return O(e,t);if(\"object\"!=typeof e||null===e)throw new Error(\"bindActionCreators expected an object or a function, instead received \"+(null===e?\"null\":typeof e)+'. Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?');for(var n=Object.keys(e),r={},o=0;o<n.length;o++){var a=n[o],i=e[a];\"function\"==typeof i&&(r[a]=O(i,t))}return r}function T(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return 0===t.length?function(e){return e}:1===t.length?t[0]:t.reduce((function(e,t){return function(){return e(t.apply(void 0,arguments))}}))}var I=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};function P(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){return function(n,r,o){var a,i=e(n,r,o),s=i.dispatch,u={getState:i.getState,dispatch:function(e){return s(e)}};return a=t.map((function(e){return e(u)})),s=T.apply(void 0,a)(i.dispatch),I({},i,{dispatch:s})}}}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r=n(151);e.exports=Array.isArray||function(e){return\"Array\"==r(e)}},function(e,t,n){\"use strict\";var r=n(178),o=n(68),a=n(105);e.exports=function(e,t,n){var i=r(t);i in e?o.f(e,i,a(0,n)):e[i]=n}},function(e,t,n){var r=n(37),o=n(41),a=n(129),i=o(\"species\");e.exports=function(e){return a>=51||!r((function(){var t=[];return(t.constructor={})[i]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},function(e,t,n){var r=n(365),o=n(233);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t){e.exports={}},function(e,t,n){\"use strict\";var r=n(66),o=n(239),a=n(131),i=n(78),s=n(238),u=\"Array Iterator\",c=i.set,l=i.getterFor(u);e.exports=s(Array,\"Array\",(function(e,t){c(this,{type:u,target:r(e),index:0,kind:t})}),(function(){var e=l(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):\"keys\"==n?{value:r,done:!1}:\"values\"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),\"values\"),a.Arguments=a.Array,o(\"keys\"),o(\"values\"),o(\"entries\")},function(e,t,n){\"use strict\";e.exports=function(e){for(var t=arguments.length-1,n=\"Minified React error #\"+e+\"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=\"+e,r=0;r<t;r++)n+=\"&args[]=\"+encodeURIComponent(arguments[r+1]);n+=\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\";var o=new Error(n);throw o.name=\"Invariant Violation\",o.framesToPop=1,o}},function(e,t,n){var r=n(99),o=n(131),a=n(41)(\"iterator\");e.exports=function(e){if(null!=e)return e[a]||e[\"@@iterator\"]||o[r(e)]}},function(e,t){var n=Object.prototype;e.exports=function(e){var t=e&&e.constructor;return e===(\"function\"==typeof t&&t.prototype||n)}},function(e,t,n){var r=n(745),o=n(245),a=n(746),i=n(747),s=n(748),u=n(112),c=n(412),l=\"[object Map]\",p=\"[object Promise]\",f=\"[object Set]\",h=\"[object WeakMap]\",d=\"[object DataView]\",m=c(r),v=c(o),g=c(a),y=c(i),b=c(s),_=u;(r&&_(new r(new ArrayBuffer(1)))!=d||o&&_(new o)!=l||a&&_(a.resolve())!=p||i&&_(new i)!=f||s&&_(new s)!=h)&&(_=function(e){var t=u(e),n=\"[object Object]\"==t?e.constructor:void 0,r=n?c(n):\"\";if(r)switch(r){case m:return d;case v:return l;case g:return p;case y:return f;case b:return h}return t}),e.exports=_},function(e,t,n){(function(e){function n(e){return Object.prototype.toString.call(e)}t.isArray=function(e){return Array.isArray?Array.isArray(e):\"[object Array]\"===n(e)},t.isBoolean=function(e){return\"boolean\"==typeof e},t.isNull=function(e){return null===e},t.isNullOrUndefined=function(e){return null==e},t.isNumber=function(e){return\"number\"==typeof e},t.isString=function(e){return\"string\"==typeof e},t.isSymbol=function(e){return\"symbol\"==typeof e},t.isUndefined=function(e){return void 0===e},t.isRegExp=function(e){return\"[object RegExp]\"===n(e)},t.isObject=function(e){return\"object\"==typeof e&&null!==e},t.isDate=function(e){return\"[object Date]\"===n(e)},t.isError=function(e){return\"[object Error]\"===n(e)||e instanceof Error},t.isFunction=function(e){return\"function\"==typeof e},t.isPrimitive=function(e){return null===e||\"boolean\"==typeof e||\"number\"==typeof e||\"string\"==typeof e||\"symbol\"==typeof e||void 0===e},t.isBuffer=e.isBuffer}).call(this,n(73).Buffer)},function(e,t,n){var r=n(110);e.exports=function(e,t,n){for(var o in t)n&&n.unsafe&&e[o]?e[o]=t[o]:r(e,o,t[o],n);return e}},function(e,t,n){\"use strict\";var r=n(77),o=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError(\"Bad Promise constructor\");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new o(e)}},function(e,t,n){\"use strict\";var r=n(166),o=n(262),a=n(468),i=n(469),s=(n(33),r.getListener);function u(e,t,n){var r=function(e,t,n){var r=t.dispatchConfig.phasedRegistrationNames[n];return s(e,r)}(e,n,t);r&&(n._dispatchListeners=a(n._dispatchListeners,r),n._dispatchInstances=a(n._dispatchInstances,e))}function c(e){e&&e.dispatchConfig.phasedRegistrationNames&&o.traverseTwoPhase(e._targetInst,u,e)}function l(e){if(e&&e.dispatchConfig.phasedRegistrationNames){var t=e._targetInst,n=t?o.getParentInstance(t):null;o.traverseTwoPhase(n,u,e)}}function p(e,t,n){if(n&&n.dispatchConfig.registrationName){var r=n.dispatchConfig.registrationName,o=s(e,r);o&&(n._dispatchListeners=a(n._dispatchListeners,o),n._dispatchInstances=a(n._dispatchInstances,e))}}function f(e){e&&e.dispatchConfig.registrationName&&p(e._targetInst,0,e)}var h={accumulateTwoPhaseDispatches:function(e){i(e,c)},accumulateTwoPhaseDispatchesSkipTarget:function(e){i(e,l)},accumulateDirectDispatches:function(e){i(e,f)},accumulateEnterLeaveDispatches:function(e,t,n,r){o.traverseEnterLeave(n,r,p,e,t)}};e.exports=h},function(e,t,n){\"use strict\";var r=n(30),o=n(261),a=n(262),i=n(263),s=n(468),u=n(469),c=(n(25),{}),l=null,p=function(e,t){e&&(a.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))},f=function(e){return p(e,!0)},h=function(e){return p(e,!1)},d=function(e){return\".\"+e._rootNodeID};var m={injection:{injectEventPluginOrder:o.injectEventPluginOrder,injectEventPluginsByName:o.injectEventPluginsByName},putListener:function(e,t,n){\"function\"!=typeof n&&r(\"94\",t,typeof n);var a=d(e);(c[t]||(c[t]={}))[a]=n;var i=o.registrationNameModules[t];i&&i.didPutListener&&i.didPutListener(e,t,n)},getListener:function(e,t){var n=c[t];if(function(e,t,n){switch(e){case\"onClick\":case\"onClickCapture\":case\"onDoubleClick\":case\"onDoubleClickCapture\":case\"onMouseDown\":case\"onMouseDownCapture\":case\"onMouseMove\":case\"onMouseMoveCapture\":case\"onMouseUp\":case\"onMouseUpCapture\":return!(!n.disabled||(r=t,\"button\"!==r&&\"input\"!==r&&\"select\"!==r&&\"textarea\"!==r));default:return!1}var r}(t,e._currentElement.type,e._currentElement.props))return null;var r=d(e);return n&&n[r]},deleteListener:function(e,t){var n=o.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t);var r=c[t];r&&delete r[d(e)]},deleteAllListeners:function(e){var t=d(e);for(var n in c)if(c.hasOwnProperty(n)&&c[n][t]){var r=o.registrationNameModules[n];r&&r.willDeleteListener&&r.willDeleteListener(e,n),delete c[n][t]}},extractEvents:function(e,t,n,r){for(var a,i=o.plugins,u=0;u<i.length;u++){var c=i[u];if(c){var l=c.extractEvents(e,t,n,r);l&&(a=s(a,l))}}return a},enqueueEvents:function(e){e&&(l=s(l,e))},processEventQueue:function(e){var t=l;l=null,u(t,e?f:h),l&&r(\"95\"),i.rethrowCaughtError()},__purge:function(){c={}},__getListenerBank:function(){return c}};e.exports=m},function(e,t,n){\"use strict\";var r=n(91),o=n(264),a={view:function(e){if(e.view)return e.view;var t=o(e);if(t.window===t)return t;var n=t.ownerDocument;return n?n.defaultView||n.parentWindow:window},detail:function(e){return e.detail||0}};function i(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(i,a),e.exports=i},function(e,t,n){\"use strict\";var r={remove:function(e){e._reactInternalInstance=void 0},get:function(e){return e._reactInternalInstance},has:function(e){return void 0!==e._reactInternalInstance},set:function(e,t){e._reactInternalInstance=t}};e.exports=r},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"requestSnippetGenerator_curl_powershell\",(function(){return N})),n.d(t,\"requestSnippetGenerator_curl_bash\",(function(){return M})),n.d(t,\"requestSnippetGenerator_curl_cmd\",(function(){return R}));var r=n(14),o=n.n(r),a=n(13),i=n.n(a),s=n(49),u=n.n(s),c=n(17),l=n.n(c),p=n(101),f=n.n(p),h=n(2),d=n.n(h),m=n(32),v=n.n(m),g=n(4),y=n.n(g),b=n(521),_=n.n(b),w=n(82),x=n.n(w),E=n(31),S=n.n(E),C=n(26),A=n(1),k=function(e){var t,n=\"_**[]\";return l()(e).call(e,n)<0?e:f()(t=e.split(n)[0]).call(t)},O=function(e){return\"-d \"===e||/^[_\\/-]/g.test(e)?e:\"'\"+e.replace(/'/g,\"'\\\\''\")+\"'\"},j=function(e){return\"-d \"===(e=e.replace(/\\^/g,\"^^\").replace(/\\\\\"/g,'\\\\\\\\\"').replace(/\"/g,'\"\"').replace(/\\n/g,\"^\\n\"))?e.replace(/-d /g,\"-d ^\\n\"):/^[_\\/-]/g.test(e)?e:'\"'+e+'\"'},T=function(e){return\"-d \"===e?e:/\\n/.test(e)?'@\"\\n'+e.replace(/\"/g,'\\\\\"').replace(/`/g,\"``\").replace(/\\$/,\"`$\")+'\\n\"@':/^[_\\/-]/g.test(e)?e:\"'\"+e.replace(/\"/g,'\"\"').replace(/'/g,\"''\")+\"'\"};function I(e){var t,n=[],r=u()(e.get(\"body\").entrySeq());try{for(r.s();!(t=r.n()).done;){var o,a,s,c=i()(t.value,2),l=c[0],p=c[1],f=k(l);if(p instanceof C.a.File)n.push(d()(o=d()(a='  \"'.concat(f,'\": {\\n    \"name\": \"')).call(a,p.name,'\"')).call(o,p.type?',\\n    \"type\": \"'.concat(p.type,'\"'):\"\",\"\\n  }\"));else n.push(d()(s='  \"'.concat(f,'\": ')).call(s,v()(p,null,2).replace(/(\\r\\n|\\r|\\n)/g,\"\\n  \")))}}catch(e){r.e(e)}finally{r.f()}return\"{\\n\".concat(n.join(\",\\n\"),\"\\n}\")}var P=function(e,t,n){var r,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",s=!1,c=\"\",l=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return c+=\" \"+y()(n).call(n,t).join(\" \")},p=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return c+=y()(n).call(n,t).join(\" \")},f=function(){return c+=\" \".concat(n)},h=function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;return c+=_()(e=\"  \").call(e,t)},m=e.get(\"headers\");if(c+=\"curl\"+a,e.has(\"curlOptions\")&&l.apply(void 0,o()(e.get(\"curlOptions\"))),l(\"-X\",e.get(\"method\")),f(),h(),p(\"\".concat(e.get(\"url\"))),m&&m.size){var g,b,w=u()(x()(g=e.get(\"headers\")).call(g));try{for(w.s();!(b=w.n()).done;){var E,O=b.value;f(),h();var j=i()(O,2),T=j[0],P=j[1];p(\"-H\",d()(E=\"\".concat(T,\": \")).call(E,P)),s=s||/^content-type$/i.test(T)&&/^multipart\\/form-data$/i.test(P)}}catch(e){w.e(e)}finally{w.f()}}if(e.get(\"body\"))if(s&&S()(r=[\"POST\",\"PUT\",\"PATCH\"]).call(r,e.get(\"method\"))){var N,M=u()(e.get(\"body\").entrySeq());try{for(M.s();!(N=M.n()).done;){var R,D,L,B=i()(N.value,2),F=B[0],U=B[1],q=k(F);if(f(),h(),p(\"-F\"),U instanceof C.a.File)l(d()(R=d()(D=\"\".concat(q,\"=@\")).call(D,U.name)).call(R,U.type?\";type=\".concat(U.type):\"\"));else l(d()(L=\"\".concat(q,\"=\")).call(L,U))}}catch(e){M.e(e)}finally{M.f()}}else{f(),h(),p(\"-d \");var z=e.get(\"body\");A.Map.isMap(z)?p(I(e)):(\"string\"!=typeof z&&(z=v()(z)),p(z))}else e.get(\"body\")||\"POST\"!==e.get(\"method\")||(f(),h(),p(\"-d ''\"));return c},N=function(e){return P(e,T,\"`\\n\",\".exe\")},M=function(e){return P(e,O,\"\\\\\\n\")},R=function(e){return P(e,j,\"^\\n\")}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"parseYamlConfig\",(function(){return o}));var r=n(74),o=function(e,t){try{return r.a.load(e)}catch(e){return t&&t.errActions.newThrownErr(new Error(e)),{}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"getDefaultRequestBodyValue\",(function(){return _}));var r=n(13),o=n.n(r),a=n(4),i=n.n(a),s=n(17),u=n.n(s),c=n(31),l=n.n(c),p=n(2),f=n.n(p),h=n(22),d=n.n(h),m=n(0),v=n.n(m),g=(n(11),n(27),n(1)),y=n(5),b=n(102),_=function(e,t,n){var r=e.getIn([\"content\",t]),o=r.get(\"schema\").toJS(),a=void 0!==r.get(\"examples\"),i=r.get(\"example\"),s=a?r.getIn([\"examples\",n,\"value\"]):i,u=Object(y.o)(o,t,{includeWriteOnly:!0},s);return Object(y.I)(u)};t.default=function(e){var t=e.userHasEditedBody,n=e.requestBody,r=e.requestBodyValue,a=e.requestBodyInclusionSetting,s=e.requestBodyErrors,c=e.getComponent,p=e.getConfigs,h=e.specSelectors,m=e.fn,w=e.contentType,x=e.isExecute,E=e.specPath,S=e.onChange,C=e.onChangeIncludeEmpty,A=e.activeExamplesKey,k=e.updateActiveExamplesKey,O=e.setRetainRequestBodyValueFlag,j=function(e){var t={key:e,shouldDispatchInit:!1,defaultValue:!0};return\"no value\"===a.get(e,\"no value\")&&(t.shouldDispatchInit=!0),t},T=c(\"Markdown\",!0),I=c(\"modelExample\"),P=c(\"RequestBodyEditor\"),N=c(\"highlightCode\"),M=c(\"ExamplesSelectValueRetainer\"),R=c(\"Example\"),D=c(\"ParameterIncludeEmpty\"),L=p().showCommonExtensions,B=n&&n.get(\"description\")||null,F=n&&n.get(\"content\")||new g.OrderedMap;w=w||F.keySeq().first()||\"\";var U=F.get(w,Object(g.OrderedMap)()),q=U.get(\"schema\",Object(g.OrderedMap)()),z=U.get(\"examples\",null),V=null==z?void 0:i()(z).call(z,(function(e,t){var r,o=null===(r=e)||void 0===r?void 0:r.get(\"value\",null);return o&&(e=e.set(\"value\",_(n,w,t),o)),e}));if(s=g.List.isList(s)?s:Object(g.List)(),!U.size)return null;var W=\"object\"===U.getIn([\"schema\",\"type\"]),H=\"binary\"===U.getIn([\"schema\",\"format\"]),$=\"base64\"===U.getIn([\"schema\",\"format\"]);if(\"application/octet-stream\"===w||0===u()(w).call(w,\"image/\")||0===u()(w).call(w,\"audio/\")||0===u()(w).call(w,\"video/\")||H||$){var J=c(\"Input\");return x?v.a.createElement(J,{type:\"file\",onChange:function(e){S(e.target.files[0])}}):v.a.createElement(\"i\",null,\"Example values are not available for \",v.a.createElement(\"code\",null,w),\" media types.\")}if(W&&(\"application/x-www-form-urlencoded\"===w||0===u()(w).call(w,\"multipart/\"))&&q.get(\"properties\",Object(g.OrderedMap)()).size>0){var K,Y=c(\"JsonSchemaForm\"),G=c(\"ParameterExt\"),Z=q.get(\"properties\",Object(g.OrderedMap)());return r=g.Map.isMap(r)?r:Object(g.OrderedMap)(),v.a.createElement(\"div\",{className:\"table-container\"},B&&v.a.createElement(T,{source:B}),v.a.createElement(\"table\",null,v.a.createElement(\"tbody\",null,g.Map.isMap(Z)&&i()(K=Z.entrySeq()).call(K,(function(e){var t,n,u=o()(e,2),p=u[0],h=u[1];if(!h.get(\"readOnly\")){var b=L?Object(y.l)(h):null,_=l()(t=q.get(\"required\",Object(g.List)())).call(t,p),w=h.get(\"type\"),E=h.get(\"format\"),A=h.get(\"description\"),k=r.getIn([p,\"value\"]),O=r.getIn([p,\"errors\"])||s,I=a.get(p)||!1,P=h.has(\"default\")||h.has(\"example\")||h.hasIn([\"items\",\"example\"])||h.hasIn([\"items\",\"default\"]),N=h.has(\"enum\")&&(1===h.get(\"enum\").size||_),M=P||N,R=\"\";\"array\"!==w||M||(R=[]),(\"object\"===w||M)&&(R=Object(y.o)(h,!1,{includeWriteOnly:!0})),\"string\"!=typeof R&&\"object\"===w&&(R=Object(y.I)(R)),\"string\"==typeof R&&\"array\"===w&&(R=JSON.parse(R));var B=\"string\"===w&&(\"binary\"===E||\"base64\"===E);return v.a.createElement(\"tr\",{key:p,className:\"parameters\",\"data-property-name\":p},v.a.createElement(\"td\",{className:\"parameters-col_name\"},v.a.createElement(\"div\",{className:_?\"parameter__name required\":\"parameter__name\"},p,_?v.a.createElement(\"span\",null,\" *\"):null),v.a.createElement(\"div\",{className:\"parameter__type\"},w,E&&v.a.createElement(\"span\",{className:\"prop-format\"},\"($\",E,\")\"),L&&b.size?i()(n=b.entrySeq()).call(n,(function(e){var t,n=o()(e,2),r=n[0],a=n[1];return v.a.createElement(G,{key:f()(t=\"\".concat(r,\"-\")).call(t,a),xKey:r,xVal:a})})):null),v.a.createElement(\"div\",{className:\"parameter__deprecated\"},h.get(\"deprecated\")?\"deprecated\":null)),v.a.createElement(\"td\",{className:\"parameters-col_description\"},v.a.createElement(T,{source:A}),x?v.a.createElement(\"div\",null,v.a.createElement(Y,{fn:m,dispatchInitialValue:!B,schema:h,description:p,getComponent:c,value:void 0===k?R:k,required:_,errors:O,onChange:function(e){S(e,[p])}}),_?null:v.a.createElement(D,{onChange:function(e){return C(p,e)},isIncluded:I,isIncludedOptions:j(p),isDisabled:d()(k)?0!==k.length:!Object(y.q)(k)})):null))}})))))}var X=_(n,w,A),Q=null;return Object(b.a)(X)&&(Q=\"json\"),v.a.createElement(\"div\",null,B&&v.a.createElement(T,{source:B}),V?v.a.createElement(M,{userHasEditedBody:t,examples:V,currentKey:A,currentUserInputValue:r,onSelect:function(e){k(e)},updateValue:S,defaultToFirstExample:!0,getComponent:c,setRetainRequestBodyValueFlag:O}):null,x?v.a.createElement(\"div\",null,v.a.createElement(P,{value:r,errors:s,defaultValue:X,onChange:S,getComponent:c})):v.a.createElement(I,{getComponent:c,getConfigs:p,specSelectors:h,expandDepth:1,isExecute:x,schema:U.get(\"schema\"),specPath:E.push(\"content\",w),example:v.a.createElement(N,{className:\"body-param__example\",getConfigs:p,language:Q,value:Object(y.I)(r)||X}),includeWriteOnly:!0}),V?v.a.createElement(R,{example:V.get(A),getComponent:c,getConfigs:p}):null)}},function(e,t,n){e.exports=n(675)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"makeMappedContainer\",(function(){return O})),n.d(t,\"render\",(function(){return j})),n.d(t,\"getComponent\",(function(){return P}));var r=n(18),o=n.n(r),a=n(28),i=n.n(a),s=n(6),u=n.n(s),c=n(7),l=n.n(c),p=n(8),f=n.n(p),h=n(9),d=n.n(h),m=n(20),v=n.n(m),g=n(15),y=n.n(g),b=n(0),_=n.n(b),w=n(519),x=n.n(w),E=n(351),S=n(520),C=n.n(S),A=function(e,t,n){var r=function(e,t){return function(n){f()(o,n);var r=d()(o);function o(){return u()(this,o),r.apply(this,arguments)}return l()(o,[{key:\"render\",value:function(){return _.a.createElement(t,i()({},e(),this.props,this.context))}}]),o}(b.Component)}(e,t),o=Object(E.connect)((function(n,r){var o=v()({},r,e());return(t.prototype.mapStateToProps||function(e){return{state:e}})(n,o)}))(r);return n?function(e,t){return function(n){f()(o,n);var r=d()(o);function o(){return u()(this,o),r.apply(this,arguments)}return l()(o,[{key:\"render\",value:function(){return _.a.createElement(E.Provider,{store:e},_.a.createElement(t,i()({},this.props,this.context)))}}]),o}(b.Component)}(n,o):o},k=function(e,t,n,r){for(var o in t){var a=t[o];\"function\"==typeof a&&a(n[o],r[o],e())}},O=function(e,t,n,r,o,a){return function(t){f()(i,t);var r=d()(i);function i(t,n){var o;return u()(this,i),o=r.call(this,t,n),k(e,a,t,{}),o}return l()(i,[{key:\"componentWillReceiveProps\",value:function(t){k(e,a,t,this.props)}},{key:\"render\",value:function(){var e=C()(this.props,a?y()(a):[]),t=n(o,\"root\");return _.a.createElement(t,e)}}]),i}(b.Component)},j=function(e,t,n,r,o){var a=n(e,t,r,\"App\",\"root\");x.a.render(_.a.createElement(a,null),o)},T=function(e){var t=e.name;return _.a.createElement(\"div\",{className:\"fallback\"},\"😱 \",_.a.createElement(\"i\",null,\"Could not render \",\"t\"===t?\"this component\":t,\", see the console.\"))},I=function(e){var t=function(e){return!(e.prototype&&e.prototype.isReactComponent)}(e)?function(e){return function(t){f()(r,t);var n=d()(r);function r(){return u()(this,r),n.apply(this,arguments)}return l()(r,[{key:\"render\",value:function(){return e(this.props)}}]),r}(b.Component)}(e):e,n=t.prototype.render;return t.prototype.render=function(){try{for(var e=arguments.length,r=new Array(e),o=0;o<e;o++)r[o]=arguments[o];return n.apply(this,r)}catch(e){return console.error(e),_.a.createElement(T,{error:e,name:t.name})}},t},P=function(e,t,n,r,a){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};if(\"string\"!=typeof r)throw new TypeError(\"Need a string, to fetch a component. Was given a \"+o()(r));var s=n(r);return s?a?\"root\"===a?A(e,s,t()):A(e,I(s)):I(s):(i.failSilently||e().log.warn(\"Could not find component:\",r),null)}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"setHash\",(function(){return r}));var r=function(e){return e?history.pushState(null,null,\"#\".concat(e)):window.location.hash=\"\"}},function(e,t,n){e.exports=n(544)},function(e,t,n){\"use strict\";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,a=o&&!r.call({1:2},1);t.f=a?function(e){var t=o(this,e);return!!t&&t.enumerable}:r},function(e,t,n){var r=n(37),o=n(151),a=\"\".split;e.exports=r((function(){return!Object(\"z\").propertyIsEnumerable(0)}))?function(e){return\"String\"==o(e)?a.call(e,\"\"):Object(e)}:Object},function(e,t,n){var r=n(47);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&\"function\"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if(\"function\"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&\"function\"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError(\"Can't convert object to primitive value\")}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return\"Symbol(\"+String(void 0===e?\"\":e)+\")_\"+(++n+r).toString(36)}},function(e,t){},function(e,t,n){var r=n(227),o=n(179),a=r(\"keys\");e.exports=function(e){return a[e]||(a[e]=o(e))}},function(e,t,n){var r=n(55),o=n(60),a=n(181),i=n(373),s=a(\"IE_PROTO\"),u=Object.prototype;e.exports=i?Object.getPrototypeOf:function(e){return e=o(e),r(e,s)?e[s]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?u:null}},function(e,t,n){var r=n(52),o=n(575);e.exports=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,a){return r(n),o(a),t?e.call(n,a):n.__proto__=a,n}}():void 0)},function(e,t,n){var r=n(151),o=n(40);e.exports=\"process\"==r(o.process)},function(e,t,n){var r=n(638),o=n(393),a=n(391);e.exports=function(e,t){var n;if(e){if(\"string\"==typeof e)return a(e,t);var i=r(n=Object.prototype.toString.call(e)).call(n,8,-1);return\"Object\"===i&&e.constructor&&(i=e.constructor.name),\"Map\"===i||\"Set\"===i?o(e):\"Arguments\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(e,t):void 0}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(112),o=n(89);e.exports=function(e){return\"symbol\"==typeof e||o(e)&&\"[object Symbol]\"==r(e)}},function(e,t,n){var r=n(113)(Object,\"create\");e.exports=r},function(e,t,n){var r=n(712),o=n(713),a=n(714),i=n(715),s=n(716);function u(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}u.prototype.clear=r,u.prototype.delete=o,u.prototype.get=a,u.prototype.has=i,u.prototype.set=s,e.exports=u},function(e,t,n){var r=n(123);e.exports=function(e,t){for(var n=e.length;n--;)if(r(e[n][0],t))return n;return-1}},function(e,t,n){var r=n(718);e.exports=function(e,t){var n=e.__data__;return r(t)?n[\"string\"==typeof t?\"string\":\"hash\"]:n.map}},function(e,t,n){var r=n(723),o=n(750),a=n(254),i=n(50),s=n(755);e.exports=function(e){return\"function\"==typeof e?e:null==e?a:\"object\"==typeof e?i(e)?o(e[0],e[1]):r(e):s(e)}},function(e,t,n){var r=n(741),o=n(89),a=Object.prototype,i=a.hasOwnProperty,s=a.propertyIsEnumerable,u=r(function(){return arguments}())?r:function(e){return o(e)&&i.call(e,\"callee\")&&!s.call(e,\"callee\")};e.exports=u},function(e,t,n){(function(e){var r=n(71),o=n(742),a=t&&!t.nodeType&&t,i=a&&\"object\"==typeof e&&e&&!e.nodeType&&e,s=i&&i.exports===a?r.Buffer:void 0,u=(s?s.isBuffer:void 0)||o;e.exports=u}).call(this,n(194)(e))},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,\"loaded\",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,\"id\",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t){var n=/^(?:0|[1-9]\\d*)$/;e.exports=function(e,t){var r=typeof e;return!!(t=null==t?9007199254740991:t)&&(\"number\"==r||\"symbol\"!=r&&n.test(e))&&e>-1&&e%1==0&&e<t}},function(e,t,n){var r=n(135),o=n(136);e.exports=function(e,t){for(var n=0,a=(t=r(t,e)).length;null!=e&&n<a;)e=e[o(t[n++])];return n&&n==a?e:void 0}},function(e,t,n){\"use strict\";(function(t){!t.version||0===t.version.indexOf(\"v0.\")||0===t.version.indexOf(\"v1.\")&&0!==t.version.indexOf(\"v1.8.\")?e.exports={nextTick:function(e,n,r,o){if(\"function\"!=typeof e)throw new TypeError('\"callback\" argument must be a function');var a,i,s=arguments.length;switch(s){case 0:case 1:return t.nextTick(e);case 2:return t.nextTick((function(){e.call(null,n)}));case 3:return t.nextTick((function(){e.call(null,n,r)}));case 4:return t.nextTick((function(){e.call(null,n,r,o)}));default:for(a=new Array(s-1),i=0;i<a.length;)a[i++]=arguments[i];return t.nextTick((function(){e.apply(null,a)}))}}}:e.exports=t}).call(this,n(90))},function(e,t,n){\"use strict\";e.exports=n(786)(\"forEach\")},function(e,t,n){\"use strict\";e.exports=n(809)()?globalThis:n(810)},function(e,t){e.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},function(e,t,n){var r=n(463),o=n(123),a=Object.prototype.hasOwnProperty;e.exports=function(e,t,n){var i=e[t];a.call(e,t)&&o(i,n)&&(void 0!==n||t in e)||r(e,t,n)}},function(e,t,n){\"use strict\";var r=n(30),o=(n(25),{}),a={reinitializeTransaction:function(){this.transactionWrappers=this.getTransactionWrappers(),this.wrapperInitData?this.wrapperInitData.length=0:this.wrapperInitData=[],this._isInTransaction=!1},_isInTransaction:!1,getTransactionWrappers:null,isInTransaction:function(){return!!this._isInTransaction},perform:function(e,t,n,o,a,i,s,u){var c,l;this.isInTransaction()&&r(\"27\");try{this._isInTransaction=!0,c=!0,this.initializeAll(0),l=e.call(t,n,o,a,i,s,u),c=!1}finally{try{if(c)try{this.closeAll(0)}catch(e){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return l},initializeAll:function(e){for(var t=this.transactionWrappers,n=e;n<t.length;n++){var r=t[n];try{this.wrapperInitData[n]=o,this.wrapperInitData[n]=r.initialize?r.initialize.call(this):null}finally{if(this.wrapperInitData[n]===o)try{this.initializeAll(n+1)}catch(e){}}}},closeAll:function(e){this.isInTransaction()||r(\"28\");for(var t=this.transactionWrappers,n=e;n<t.length;n++){var a,i=t[n],s=this.wrapperInitData[n];try{a=!0,s!==o&&i.close&&i.close.call(this,s),a=!1}finally{if(a)try{this.closeAll(n+1)}catch(e){}}}this.wrapperInitData.length=0}};e.exports=a},function(e,t,n){\"use strict\";var r=n(167),o=n(475),a={screenX:null,screenY:null,clientX:null,clientY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:n(266),button:function(e){var t=e.button;return\"which\"in e?t:2===t?2:4===t?1:0},buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)},pageX:function(e){return\"pageX\"in e?e.pageX:e.clientX+o.currentScrollLeft},pageY:function(e){return\"pageY\"in e?e.pageY:e.clientY+o.currentScrollTop}};function i(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(i,a),e.exports=i},function(e,t,n){\"use strict\";var r,o=n(56),a=n(268),i=/^[ \\r\\n\\t\\f]/,s=/<(!--|link|noscript|meta|script|style)[ \\r\\n\\t\\f\\/>]/,u=n(269)((function(e,t){if(e.namespaceURI!==a.svg||\"innerHTML\"in e)e.innerHTML=t;else{(r=r||document.createElement(\"div\")).innerHTML=\"<svg>\"+t+\"</svg>\";for(var n=r.firstChild;n.firstChild;)e.appendChild(n.firstChild)}}));if(o.canUseDOM){var c=document.createElement(\"div\");c.innerHTML=\" \",\"\"===c.innerHTML&&(u=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),i.test(t)||\"<\"===t[0]&&s.test(t)){e.innerHTML=String.fromCharCode(65279)+t;var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t}),c=null}e.exports=u},function(e,t,n){\"use strict\";var r=/[\"'&<>]/;e.exports=function(e){return\"boolean\"==typeof e||\"number\"==typeof e?\"\"+e:function(e){var t,n=\"\"+e,o=r.exec(n);if(!o)return n;var a=\"\",i=0,s=0;for(i=o.index;i<n.length;i++){switch(n.charCodeAt(i)){case 34:t=\"&quot;\";break;case 38:t=\"&amp;\";break;case 39:t=\"&#x27;\";break;case 60:t=\"&lt;\";break;case 62:t=\"&gt;\";break;default:continue}s!==i&&(a+=n.substring(s,i)),s=i+1,a+=t}return s!==i?a+n.substring(s,i):a}(e)}},function(e,t,n){\"use strict\";var r,o=n(38),a=n(261),i=n(946),s=n(475),u=n(947),c=n(265),l={},p=!1,f=0,h={topAbort:\"abort\",topAnimationEnd:u(\"animationend\")||\"animationend\",topAnimationIteration:u(\"animationiteration\")||\"animationiteration\",topAnimationStart:u(\"animationstart\")||\"animationstart\",topBlur:\"blur\",topCanPlay:\"canplay\",topCanPlayThrough:\"canplaythrough\",topChange:\"change\",topClick:\"click\",topCompositionEnd:\"compositionend\",topCompositionStart:\"compositionstart\",topCompositionUpdate:\"compositionupdate\",topContextMenu:\"contextmenu\",topCopy:\"copy\",topCut:\"cut\",topDoubleClick:\"dblclick\",topDrag:\"drag\",topDragEnd:\"dragend\",topDragEnter:\"dragenter\",topDragExit:\"dragexit\",topDragLeave:\"dragleave\",topDragOver:\"dragover\",topDragStart:\"dragstart\",topDrop:\"drop\",topDurationChange:\"durationchange\",topEmptied:\"emptied\",topEncrypted:\"encrypted\",topEnded:\"ended\",topError:\"error\",topFocus:\"focus\",topInput:\"input\",topKeyDown:\"keydown\",topKeyPress:\"keypress\",topKeyUp:\"keyup\",topLoadedData:\"loadeddata\",topLoadedMetadata:\"loadedmetadata\",topLoadStart:\"loadstart\",topMouseDown:\"mousedown\",topMouseMove:\"mousemove\",topMouseOut:\"mouseout\",topMouseOver:\"mouseover\",topMouseUp:\"mouseup\",topPaste:\"paste\",topPause:\"pause\",topPlay:\"play\",topPlaying:\"playing\",topProgress:\"progress\",topRateChange:\"ratechange\",topScroll:\"scroll\",topSeeked:\"seeked\",topSeeking:\"seeking\",topSelectionChange:\"selectionchange\",topStalled:\"stalled\",topSuspend:\"suspend\",topTextInput:\"textInput\",topTimeUpdate:\"timeupdate\",topTouchCancel:\"touchcancel\",topTouchEnd:\"touchend\",topTouchMove:\"touchmove\",topTouchStart:\"touchstart\",topTransitionEnd:u(\"transitionend\")||\"transitionend\",topVolumeChange:\"volumechange\",topWaiting:\"waiting\",topWheel:\"wheel\"},d=\"_reactListenersID\"+String(Math.random()).slice(2);var m=o({},i,{ReactEventListener:null,injection:{injectReactEventListener:function(e){e.setHandleTopLevel(m.handleTopLevel),m.ReactEventListener=e}},setEnabled:function(e){m.ReactEventListener&&m.ReactEventListener.setEnabled(e)},isEnabled:function(){return!(!m.ReactEventListener||!m.ReactEventListener.isEnabled())},listenTo:function(e,t){for(var n=t,r=function(e){return Object.prototype.hasOwnProperty.call(e,d)||(e[d]=f++,l[e[d]]={}),l[e[d]]}(n),o=a.registrationNameDependencies[e],i=0;i<o.length;i++){var s=o[i];r.hasOwnProperty(s)&&r[s]||(\"topWheel\"===s?c(\"wheel\")?m.ReactEventListener.trapBubbledEvent(\"topWheel\",\"wheel\",n):c(\"mousewheel\")?m.ReactEventListener.trapBubbledEvent(\"topWheel\",\"mousewheel\",n):m.ReactEventListener.trapBubbledEvent(\"topWheel\",\"DOMMouseScroll\",n):\"topScroll\"===s?c(\"scroll\",!0)?m.ReactEventListener.trapCapturedEvent(\"topScroll\",\"scroll\",n):m.ReactEventListener.trapBubbledEvent(\"topScroll\",\"scroll\",m.ReactEventListener.WINDOW_HANDLE):\"topFocus\"===s||\"topBlur\"===s?(c(\"focus\",!0)?(m.ReactEventListener.trapCapturedEvent(\"topFocus\",\"focus\",n),m.ReactEventListener.trapCapturedEvent(\"topBlur\",\"blur\",n)):c(\"focusin\")&&(m.ReactEventListener.trapBubbledEvent(\"topFocus\",\"focusin\",n),m.ReactEventListener.trapBubbledEvent(\"topBlur\",\"focusout\",n)),r.topBlur=!0,r.topFocus=!0):h.hasOwnProperty(s)&&m.ReactEventListener.trapBubbledEvent(s,h[s],n),r[s]=!0)}},trapBubbledEvent:function(e,t,n){return m.ReactEventListener.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return m.ReactEventListener.trapCapturedEvent(e,t,n)},supportsEventPageXY:function(){if(!document.createEvent)return!1;var e=document.createEvent(\"MouseEvent\");return null!=e&&\"pageX\"in e},ensureScrollValueMonitoring:function(){if(void 0===r&&(r=m.supportsEventPageXY()),!r&&!p){var e=s.refreshScrollValues;m.ReactEventListener.monitorScrollValue(e),p=!0}}});e.exports=m},function(e,t,n){var r=n(156),o=n(47),a=n(55),i=n(68).f,s=n(179),u=n(1073),c=s(\"meta\"),l=0,p=Object.isExtensible||function(){return!0},f=function(e){i(e,c,{value:{objectID:\"O\"+ ++l,weakData:{}}})},h=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!o(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!a(e,c)){if(!p(e))return\"F\";if(!t)return\"E\";f(e)}return e[c].objectID},getWeakData:function(e,t){if(!a(e,c)){if(!p(e))return!0;if(!t)return!1;f(e)}return e[c].weakData},onFreeze:function(e){return u&&h.REQUIRED&&p(e)&&!a(e,c)&&f(e),e}};r[c]=!0},function(e,t,n){e.exports=n(649)},function(e,t,n){var r=n(722)(n(758));e.exports=r},function(e,t,n){e.exports=n(846)},function(e,t,n){e.exports=n(888)},function(e,t,n){var r=n(112),o=n(50),a=n(89);e.exports=function(e){return\"string\"==typeof e||!o(e)&&a(e)&&\"[object String]\"==r(e)}},function(e,t,n){e.exports=n(1049)},function(e,t,n){e.exports=n(1050)},function(e,t,n){var r=n(1064),o=n(497)((function(e,t){return null==e?{}:r(e,t)}));e.exports=o},function(e,t,n){var r=n(201),o=n(143),a=n(1081),i=n(115),s=n(160),u=n(114),c=Object.prototype.hasOwnProperty,l=a((function(e,t){if(s(t)||i(t))o(t,u(t),e);else for(var n in t)c.call(t,n)&&r(e,n,t[n])}));e.exports=l},function(e,t,n){(function(t){!function(){\"use strict\";e.exports=function(e){return(e instanceof t?e:t.from(e.toString(),\"binary\")).toString(\"base64\")}}()}).call(this,n(73).Buffer)},function(e,t,n){e.exports=n(1089)},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return k}));var r=n(18),o=n.n(r),a=n(6),i=n.n(a),s=n(7),u=n.n(s),c=n(10),l=n.n(c),p=n(8),f=n.n(p),h=n(9),d=n.n(h),m=n(3),v=n.n(m),g=n(15),y=n.n(g),b=n(2),_=n.n(b),w=n(0),x=n.n(w),E=n(94),S=n.n(E),C=(n(11),n(5)),A=n(26),k=function(e){f()(n,e);var t=d()(n);function n(e,r){var o;i()(this,n),o=t.call(this,e,r),v()(l()(o),\"getDefinitionUrl\",(function(){var e=o.props.specSelectors;return new S.a(e.url(),A.a.location).toString()}));var a=(0,e.getConfigs)().validatorUrl;return o.state={url:o.getDefinitionUrl(),validatorUrl:void 0===a?\"https://validator.swagger.io/validator\":a},o}return u()(n,[{key:\"componentWillReceiveProps\",value:function(e){var t=(0,e.getConfigs)().validatorUrl;this.setState({url:this.getDefinitionUrl(),validatorUrl:void 0===t?\"https://validator.swagger.io/validator\":t})}},{key:\"render\",value:function(){var e,t,n=(0,this.props.getConfigs)().spec,r=Object(C.F)(this.state.validatorUrl);return\"object\"===o()(n)&&y()(n).length?null:this.state.url&&Object(C.E)(this.state.validatorUrl)&&Object(C.E)(this.state.url)?x.a.createElement(\"span\",{className:\"float-right\"},x.a.createElement(\"a\",{target:\"_blank\",rel:\"noopener noreferrer\",href:_()(e=\"\".concat(r,\"/debug?url=\")).call(e,encodeURIComponent(this.state.url))},x.a.createElement(O,{src:_()(t=\"\".concat(r,\"?url=\")).call(t,encodeURIComponent(this.state.url)),alt:\"Online validator badge\"}))):null}}]),n}(x.a.Component),O=function(e){f()(n,e);var t=d()(n);function n(e){var r;return i()(this,n),(r=t.call(this,e)).state={loaded:!1,error:!1},r}return u()(n,[{key:\"componentDidMount\",value:function(){var e=this,t=new Image;t.onload=function(){e.setState({loaded:!0})},t.onerror=function(){e.setState({error:!0})},t.src=this.props.src}},{key:\"componentWillReceiveProps\",value:function(e){var t=this;if(e.src!==this.props.src){var n=new Image;n.onload=function(){t.setState({loaded:!0})},n.onerror=function(){t.setState({error:!0})},n.src=e.src}}},{key:\"render\",value:function(){return this.state.error?x.a.createElement(\"img\",{alt:\"Error\"}):this.state.loaded?x.a.createElement(\"img\",{src:this.props.src,alt:this.props.alt}):null}}]),n}(x.a.Component)},function(e,t,n){\"use strict\";var r;function o(e){return(r=r||document.createElement(\"textarea\")).innerHTML=\"&\"+e+\";\",r.value}n.d(t,\"a\",(function(){return ke}));var a=Object.prototype.hasOwnProperty;function i(e,t){return!!e&&a.call(e,t)}function s(e){var t=[].slice.call(arguments,1);return t.forEach((function(t){if(t){if(\"object\"!=typeof t)throw new TypeError(t+\"must be object\");Object.keys(t).forEach((function(n){e[n]=t[n]}))}})),e}var u=/\\\\([\\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;function c(e){return e.indexOf(\"\\\\\")<0?e:e.replace(u,\"$1\")}function l(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function p(e){if(e>65535){var t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}var f=/&([a-z#][a-z0-9]{1,31});/gi,h=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;function d(e,t){var n=0,r=o(t);return t!==r?r:35===t.charCodeAt(0)&&h.test(t)&&l(n=\"x\"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?p(n):e}function m(e){return e.indexOf(\"&\")<0?e:e.replace(f,d)}var v=/[&<>\"]/,g=/[&<>\"]/g,y={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\"};function b(e){return y[e]}function _(e){return v.test(e)?e.replace(g,b):e}var w={};function x(e,t){return++t>=e.length-2?t:\"paragraph_open\"===e[t].type&&e[t].tight&&\"inline\"===e[t+1].type&&0===e[t+1].content.length&&\"paragraph_close\"===e[t+2].type&&e[t+2].tight?x(e,t+2):t}w.blockquote_open=function(){return\"<blockquote>\\n\"},w.blockquote_close=function(e,t){return\"</blockquote>\"+E(e,t)},w.code=function(e,t){return e[t].block?\"<pre><code>\"+_(e[t].content)+\"</code></pre>\"+E(e,t):\"<code>\"+_(e[t].content)+\"</code>\"},w.fence=function(e,t,n,r,o){var a,s,u=e[t],l=\"\",p=n.langPrefix;if(u.params){if(s=(a=u.params.split(/\\s+/g)).join(\" \"),i(o.rules.fence_custom,a[0]))return o.rules.fence_custom[a[0]](e,t,n,r,o);l=' class=\"'+p+_(m(c(s)))+'\"'}return\"<pre><code\"+l+\">\"+(n.highlight&&n.highlight.apply(n.highlight,[u.content].concat(a))||_(u.content))+\"</code></pre>\"+E(e,t)},w.fence_custom={},w.heading_open=function(e,t){return\"<h\"+e[t].hLevel+\">\"},w.heading_close=function(e,t){return\"</h\"+e[t].hLevel+\">\\n\"},w.hr=function(e,t,n){return(n.xhtmlOut?\"<hr />\":\"<hr>\")+E(e,t)},w.bullet_list_open=function(){return\"<ul>\\n\"},w.bullet_list_close=function(e,t){return\"</ul>\"+E(e,t)},w.list_item_open=function(){return\"<li>\"},w.list_item_close=function(){return\"</li>\\n\"},w.ordered_list_open=function(e,t){var n=e[t];return\"<ol\"+(n.order>1?' start=\"'+n.order+'\"':\"\")+\">\\n\"},w.ordered_list_close=function(e,t){return\"</ol>\"+E(e,t)},w.paragraph_open=function(e,t){return e[t].tight?\"\":\"<p>\"},w.paragraph_close=function(e,t){var n=!(e[t].tight&&t&&\"inline\"===e[t-1].type&&!e[t-1].content);return(e[t].tight?\"\":\"</p>\")+(n?E(e,t):\"\")},w.link_open=function(e,t,n){var r=e[t].title?' title=\"'+_(m(e[t].title))+'\"':\"\",o=n.linkTarget?' target=\"'+n.linkTarget+'\"':\"\";return'<a href=\"'+_(e[t].href)+'\"'+r+o+\">\"},w.link_close=function(){return\"</a>\"},w.image=function(e,t,n){var r=' src=\"'+_(e[t].src)+'\"',o=e[t].title?' title=\"'+_(m(e[t].title))+'\"':\"\";return\"<img\"+r+(' alt=\"'+(e[t].alt?_(m(c(e[t].alt))):\"\")+'\"')+o+(n.xhtmlOut?\" /\":\"\")+\">\"},w.table_open=function(){return\"<table>\\n\"},w.table_close=function(){return\"</table>\\n\"},w.thead_open=function(){return\"<thead>\\n\"},w.thead_close=function(){return\"</thead>\\n\"},w.tbody_open=function(){return\"<tbody>\\n\"},w.tbody_close=function(){return\"</tbody>\\n\"},w.tr_open=function(){return\"<tr>\"},w.tr_close=function(){return\"</tr>\\n\"},w.th_open=function(e,t){var n=e[t];return\"<th\"+(n.align?' style=\"text-align:'+n.align+'\"':\"\")+\">\"},w.th_close=function(){return\"</th>\"},w.td_open=function(e,t){var n=e[t];return\"<td\"+(n.align?' style=\"text-align:'+n.align+'\"':\"\")+\">\"},w.td_close=function(){return\"</td>\"},w.strong_open=function(){return\"<strong>\"},w.strong_close=function(){return\"</strong>\"},w.em_open=function(){return\"<em>\"},w.em_close=function(){return\"</em>\"},w.del_open=function(){return\"<del>\"},w.del_close=function(){return\"</del>\"},w.ins_open=function(){return\"<ins>\"},w.ins_close=function(){return\"</ins>\"},w.mark_open=function(){return\"<mark>\"},w.mark_close=function(){return\"</mark>\"},w.sub=function(e,t){return\"<sub>\"+_(e[t].content)+\"</sub>\"},w.sup=function(e,t){return\"<sup>\"+_(e[t].content)+\"</sup>\"},w.hardbreak=function(e,t,n){return n.xhtmlOut?\"<br />\\n\":\"<br>\\n\"},w.softbreak=function(e,t,n){return n.breaks?n.xhtmlOut?\"<br />\\n\":\"<br>\\n\":\"\\n\"},w.text=function(e,t){return _(e[t].content)},w.htmlblock=function(e,t){return e[t].content},w.htmltag=function(e,t){return e[t].content},w.abbr_open=function(e,t){return'<abbr title=\"'+_(m(e[t].title))+'\">'},w.abbr_close=function(){return\"</abbr>\"},w.footnote_ref=function(e,t){var n=Number(e[t].id+1).toString(),r=\"fnref\"+n;return e[t].subId>0&&(r+=\":\"+e[t].subId),'<sup class=\"footnote-ref\"><a href=\"#fn'+n+'\" id=\"'+r+'\">['+n+\"]</a></sup>\"},w.footnote_block_open=function(e,t,n){return(n.xhtmlOut?'<hr class=\"footnotes-sep\" />\\n':'<hr class=\"footnotes-sep\">\\n')+'<section class=\"footnotes\">\\n<ol class=\"footnotes-list\">\\n'},w.footnote_block_close=function(){return\"</ol>\\n</section>\\n\"},w.footnote_open=function(e,t){return'<li id=\"fn'+Number(e[t].id+1).toString()+'\"  class=\"footnote-item\">'},w.footnote_close=function(){return\"</li>\\n\"},w.footnote_anchor=function(e,t){var n=\"fnref\"+Number(e[t].id+1).toString();return e[t].subId>0&&(n+=\":\"+e[t].subId),' <a href=\"#'+n+'\" class=\"footnote-backref\">↩</a>'},w.dl_open=function(){return\"<dl>\\n\"},w.dt_open=function(){return\"<dt>\"},w.dd_open=function(){return\"<dd>\"},w.dl_close=function(){return\"</dl>\\n\"},w.dt_close=function(){return\"</dt>\\n\"},w.dd_close=function(){return\"</dd>\\n\"};var E=w.getBreak=function(e,t){return(t=x(e,t))<e.length&&\"list_item_close\"===e[t].type?\"\":\"\\n\"};function S(){this.rules=s({},w),this.getBreak=w.getBreak}function C(){this.__rules__=[],this.__cache__=null}function A(e,t,n,r,o){this.src=e,this.env=r,this.options=n,this.parser=t,this.tokens=o,this.pos=0,this.posMax=this.src.length,this.level=0,this.pending=\"\",this.pendingLevel=0,this.cache=[],this.isInLabel=!1,this.linkLevel=0,this.linkContent=\"\",this.labelUnmatchedScopes=0}function k(e,t){var n,r,o,a=-1,i=e.posMax,s=e.pos,u=e.isInLabel;if(e.isInLabel)return-1;if(e.labelUnmatchedScopes)return e.labelUnmatchedScopes--,-1;for(e.pos=t+1,e.isInLabel=!0,n=1;e.pos<i;){if(91===(o=e.src.charCodeAt(e.pos)))n++;else if(93===o&&0===--n){r=!0;break}e.parser.skipToken(e)}return r?(a=e.pos,e.labelUnmatchedScopes=0):e.labelUnmatchedScopes=n-1,e.pos=s,e.isInLabel=u,a}function O(e,t,n,r){var o,a,i,s,u,c;if(42!==e.charCodeAt(0))return-1;if(91!==e.charCodeAt(1))return-1;if(-1===e.indexOf(\"]:\"))return-1;if((a=k(o=new A(e,t,n,r,[]),1))<0||58!==e.charCodeAt(a+1))return-1;for(s=o.posMax,i=a+2;i<s&&10!==o.src.charCodeAt(i);i++);return u=e.slice(2,a),0===(c=e.slice(a+2,i).trim()).length?-1:(r.abbreviations||(r.abbreviations={}),void 0===r.abbreviations[\":\"+u]&&(r.abbreviations[\":\"+u]=c),i)}function j(e){var t=m(e);try{t=decodeURI(t)}catch(e){}return encodeURI(t)}function T(e,t){var n,r,o,a=t,i=e.posMax;if(60===e.src.charCodeAt(t)){for(t++;t<i;){if(10===(n=e.src.charCodeAt(t)))return!1;if(62===n)return o=j(c(e.src.slice(a+1,t))),!!e.parser.validateLink(o)&&(e.pos=t+1,e.linkContent=o,!0);92===n&&t+1<i?t+=2:t++}return!1}for(r=0;t<i&&32!==(n=e.src.charCodeAt(t))&&!(n<32||127===n);)if(92===n&&t+1<i)t+=2;else{if(40===n&&++r>1)break;if(41===n&&--r<0)break;t++}return a!==t&&(o=c(e.src.slice(a,t)),!!e.parser.validateLink(o)&&(e.linkContent=o,e.pos=t,!0))}function I(e,t){var n,r=t,o=e.posMax,a=e.src.charCodeAt(t);if(34!==a&&39!==a&&40!==a)return!1;for(t++,40===a&&(a=41);t<o;){if((n=e.src.charCodeAt(t))===a)return e.pos=t+1,e.linkContent=c(e.src.slice(r+1,t)),!0;92===n&&t+1<o?t+=2:t++}return!1}function P(e){return e.trim().replace(/\\s+/g,\" \").toUpperCase()}function N(e,t,n,r){var o,a,i,s,u,c,l,p,f;if(91!==e.charCodeAt(0))return-1;if(-1===e.indexOf(\"]:\"))return-1;if((a=k(o=new A(e,t,n,r,[]),0))<0||58!==e.charCodeAt(a+1))return-1;for(s=o.posMax,i=a+2;i<s&&(32===(u=o.src.charCodeAt(i))||10===u);i++);if(!T(o,i))return-1;for(l=o.linkContent,c=i=o.pos,i+=1;i<s&&(32===(u=o.src.charCodeAt(i))||10===u);i++);for(i<s&&c!==i&&I(o,i)?(p=o.linkContent,i=o.pos):(p=\"\",i=c);i<s&&32===o.src.charCodeAt(i);)i++;return i<s&&10!==o.src.charCodeAt(i)?-1:(f=P(e.slice(1,a)),void 0===r.references[f]&&(r.references[f]={title:p,href:l}),i)}S.prototype.renderInline=function(e,t,n){for(var r=this.rules,o=e.length,a=0,i=\"\";o--;)i+=r[e[a].type](e,a++,t,n,this);return i},S.prototype.render=function(e,t,n){for(var r=this.rules,o=e.length,a=-1,i=\"\";++a<o;)\"inline\"===e[a].type?i+=this.renderInline(e[a].children,t,n):i+=r[e[a].type](e,a,t,n,this);return i},C.prototype.__find__=function(e){for(var t=this.__rules__.length,n=-1;t--;)if(this.__rules__[++n].name===e)return n;return-1},C.prototype.__compile__=function(){var e=this,t=[\"\"];e.__rules__.forEach((function(e){e.enabled&&e.alt.forEach((function(e){t.indexOf(e)<0&&t.push(e)}))})),e.__cache__={},t.forEach((function(t){e.__cache__[t]=[],e.__rules__.forEach((function(n){n.enabled&&(t&&n.alt.indexOf(t)<0||e.__cache__[t].push(n.fn))}))}))},C.prototype.at=function(e,t,n){var r=this.__find__(e),o=n||{};if(-1===r)throw new Error(\"Parser rule not found: \"+e);this.__rules__[r].fn=t,this.__rules__[r].alt=o.alt||[],this.__cache__=null},C.prototype.before=function(e,t,n,r){var o=this.__find__(e),a=r||{};if(-1===o)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o,0,{name:t,enabled:!0,fn:n,alt:a.alt||[]}),this.__cache__=null},C.prototype.after=function(e,t,n,r){var o=this.__find__(e),a=r||{};if(-1===o)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o+1,0,{name:t,enabled:!0,fn:n,alt:a.alt||[]}),this.__cache__=null},C.prototype.push=function(e,t,n){var r=n||{};this.__rules__.push({name:e,enabled:!0,fn:t,alt:r.alt||[]}),this.__cache__=null},C.prototype.enable=function(e,t){e=Array.isArray(e)?e:[e],t&&this.__rules__.forEach((function(e){e.enabled=!1})),e.forEach((function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!0}),this),this.__cache__=null},C.prototype.disable=function(e){(e=Array.isArray(e)?e:[e]).forEach((function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!1}),this),this.__cache__=null},C.prototype.getRules=function(e){return null===this.__cache__&&this.__compile__(),this.__cache__[e]||[]},A.prototype.pushPending=function(){this.tokens.push({type:\"text\",content:this.pending,level:this.pendingLevel}),this.pending=\"\"},A.prototype.push=function(e){this.pending&&this.pushPending(),this.tokens.push(e),this.pendingLevel=this.level},A.prototype.cacheSet=function(e,t){for(var n=this.cache.length;n<=e;n++)this.cache.push(0);this.cache[e]=t},A.prototype.cacheGet=function(e){return e<this.cache.length?this.cache[e]:0};var M=\" \\n()[]'\\\".,!?-\";function R(e){return e.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g,\"\\\\$1\")}var D=/\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/,L=/\\((c|tm|r|p)\\)/gi,B={c:\"©\",r:\"®\",p:\"§\",tm:\"™\"};var F=/['\"]/,U=/['\"]/g,q=/[-\\s()\\[\\]]/;function z(e,t){return!(t<0||t>=e.length)&&!q.test(e[t])}function V(e,t,n){return e.substr(0,t)+n+e.substr(t+1)}var W=[[\"block\",function(e){e.inlineMode?e.tokens.push({type:\"inline\",content:e.src.replace(/\\n/g,\" \").trim(),level:0,lines:[0,1],children:[]}):e.block.parse(e.src,e.options,e.env,e.tokens)}],[\"abbr\",function(e){var t,n,r,o,a=e.tokens;if(!e.inlineMode)for(t=1,n=a.length-1;t<n;t++)if(\"paragraph_open\"===a[t-1].type&&\"inline\"===a[t].type&&\"paragraph_close\"===a[t+1].type){for(r=a[t].content;r.length&&!((o=O(r,e.inline,e.options,e.env))<0);)r=r.slice(o).trim();a[t].content=r,r.length||(a[t-1].tight=!0,a[t+1].tight=!0)}}],[\"references\",function(e){var t,n,r,o,a=e.tokens;if(e.env.references=e.env.references||{},!e.inlineMode)for(t=1,n=a.length-1;t<n;t++)if(\"inline\"===a[t].type&&\"paragraph_open\"===a[t-1].type&&\"paragraph_close\"===a[t+1].type){for(r=a[t].content;r.length&&!((o=N(r,e.inline,e.options,e.env))<0);)r=r.slice(o).trim();a[t].content=r,r.length||(a[t-1].tight=!0,a[t+1].tight=!0)}}],[\"inline\",function(e){var t,n,r,o=e.tokens;for(n=0,r=o.length;n<r;n++)\"inline\"===(t=o[n]).type&&e.inline.parse(t.content,e.options,e.env,t.children)}],[\"footnote_tail\",function(e){var t,n,r,o,a,i,s,u,c,l=0,p=!1,f={};if(e.env.footnotes&&(e.tokens=e.tokens.filter((function(e){return\"footnote_reference_open\"===e.type?(p=!0,u=[],c=e.label,!1):\"footnote_reference_close\"===e.type?(p=!1,f[\":\"+c]=u,!1):(p&&u.push(e),!p)})),e.env.footnotes.list)){for(i=e.env.footnotes.list,e.tokens.push({type:\"footnote_block_open\",level:l++}),t=0,n=i.length;t<n;t++){for(e.tokens.push({type:\"footnote_open\",id:t,level:l++}),i[t].tokens?((s=[]).push({type:\"paragraph_open\",tight:!1,level:l++}),s.push({type:\"inline\",content:\"\",level:l,children:i[t].tokens}),s.push({type:\"paragraph_close\",tight:!1,level:--l})):i[t].label&&(s=f[\":\"+i[t].label]),e.tokens=e.tokens.concat(s),a=\"paragraph_close\"===e.tokens[e.tokens.length-1].type?e.tokens.pop():null,o=i[t].count>0?i[t].count:1,r=0;r<o;r++)e.tokens.push({type:\"footnote_anchor\",id:t,subId:r,level:l});a&&e.tokens.push(a),e.tokens.push({type:\"footnote_close\",level:--l})}e.tokens.push({type:\"footnote_block_close\",level:--l})}}],[\"abbr2\",function(e){var t,n,r,o,a,i,s,u,c,l,p,f,h=e.tokens;if(e.env.abbreviations)for(e.env.abbrRegExp||(f=\"(^|[\"+M.split(\"\").map(R).join(\"\")+\"])(\"+Object.keys(e.env.abbreviations).map((function(e){return e.substr(1)})).sort((function(e,t){return t.length-e.length})).map(R).join(\"|\")+\")($|[\"+M.split(\"\").map(R).join(\"\")+\"])\",e.env.abbrRegExp=new RegExp(f,\"g\")),l=e.env.abbrRegExp,n=0,r=h.length;n<r;n++)if(\"inline\"===h[n].type)for(t=(o=h[n].children).length-1;t>=0;t--)if(\"text\"===(a=o[t]).type){for(u=0,i=a.content,l.lastIndex=0,c=a.level,s=[];p=l.exec(i);)l.lastIndex>u&&s.push({type:\"text\",content:i.slice(u,p.index+p[1].length),level:c}),s.push({type:\"abbr_open\",title:e.env.abbreviations[\":\"+p[2]],level:c++}),s.push({type:\"text\",content:p[2],level:c}),s.push({type:\"abbr_close\",level:--c}),u=l.lastIndex-p[3].length;s.length&&(u<i.length&&s.push({type:\"text\",content:i.slice(u),level:c}),h[n].children=o=[].concat(o.slice(0,t),s,o.slice(t+1)))}}],[\"replacements\",function(e){var t,n,r,o,a,i;if(e.options.typographer)for(a=e.tokens.length-1;a>=0;a--)if(\"inline\"===e.tokens[a].type)for(t=(o=e.tokens[a].children).length-1;t>=0;t--)\"text\"===(n=o[t]).type&&(r=n.content,r=(i=r).indexOf(\"(\")<0?i:i.replace(L,(function(e,t){return B[t.toLowerCase()]})),D.test(r)&&(r=r.replace(/\\+-/g,\"±\").replace(/\\.{2,}/g,\"…\").replace(/([?!])…/g,\"$1..\").replace(/([?!]){4,}/g,\"$1$1$1\").replace(/,{2,}/g,\",\").replace(/(^|[^-])---([^-]|$)/gm,\"$1—$2\").replace(/(^|\\s)--(\\s|$)/gm,\"$1–$2\").replace(/(^|[^-\\s])--([^-\\s]|$)/gm,\"$1–$2\")),n.content=r)}],[\"smartquotes\",function(e){var t,n,r,o,a,i,s,u,c,l,p,f,h,d,m,v,g;if(e.options.typographer)for(g=[],m=e.tokens.length-1;m>=0;m--)if(\"inline\"===e.tokens[m].type)for(v=e.tokens[m].children,g.length=0,t=0;t<v.length;t++)if(\"text\"===(n=v[t]).type&&!F.test(n.text)){for(s=v[t].level,h=g.length-1;h>=0&&!(g[h].level<=s);h--);g.length=h+1,a=0,i=(r=n.content).length;e:for(;a<i&&(U.lastIndex=a,o=U.exec(r));)if(u=!z(r,o.index-1),a=o.index+1,d=\"'\"===o[0],(c=!z(r,a))||u){if(p=!c,f=!u)for(h=g.length-1;h>=0&&(l=g[h],!(g[h].level<s));h--)if(l.single===d&&g[h].level===s){l=g[h],d?(v[l.token].content=V(v[l.token].content,l.pos,e.options.quotes[2]),n.content=V(n.content,o.index,e.options.quotes[3])):(v[l.token].content=V(v[l.token].content,l.pos,e.options.quotes[0]),n.content=V(n.content,o.index,e.options.quotes[1])),g.length=h;continue e}p?g.push({token:t,pos:o.index,single:d,level:s}):f&&d&&(n.content=V(n.content,o.index,\"’\"))}else d&&(n.content=V(n.content,o.index,\"’\"))}}]];function H(){this.options={},this.ruler=new C;for(var e=0;e<W.length;e++)this.ruler.push(W[e][0],W[e][1])}function $(e,t,n,r,o){var a,i,s,u,c,l,p;for(this.src=e,this.parser=t,this.options=n,this.env=r,this.tokens=o,this.bMarks=[],this.eMarks=[],this.tShift=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.parentType=\"root\",this.ddIndent=-1,this.level=0,this.result=\"\",l=0,p=!1,s=u=l=0,c=(i=this.src).length;u<c;u++){if(a=i.charCodeAt(u),!p){if(32===a){l++;continue}p=!0}10!==a&&u!==c-1||(10!==a&&u++,this.bMarks.push(s),this.eMarks.push(u),this.tShift.push(l),p=!1,l=0,s=u+1)}this.bMarks.push(i.length),this.eMarks.push(i.length),this.tShift.push(0),this.lineMax=this.bMarks.length-1}function J(e,t){var n,r,o;return(r=e.bMarks[t]+e.tShift[t])>=(o=e.eMarks[t])||42!==(n=e.src.charCodeAt(r++))&&45!==n&&43!==n||r<o&&32!==e.src.charCodeAt(r)?-1:r}function K(e,t){var n,r=e.bMarks[t]+e.tShift[t],o=e.eMarks[t];if(r+1>=o)return-1;if((n=e.src.charCodeAt(r++))<48||n>57)return-1;for(;;){if(r>=o)return-1;if(!((n=e.src.charCodeAt(r++))>=48&&n<=57)){if(41===n||46===n)break;return-1}}return r<o&&32!==e.src.charCodeAt(r)?-1:r}H.prototype.process=function(e){var t,n,r;for(t=0,n=(r=this.ruler.getRules(\"\")).length;t<n;t++)r[t](e)},$.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},$.prototype.skipEmptyLines=function(e){for(var t=this.lineMax;e<t&&!(this.bMarks[e]+this.tShift[e]<this.eMarks[e]);e++);return e},$.prototype.skipSpaces=function(e){for(var t=this.src.length;e<t&&32===this.src.charCodeAt(e);e++);return e},$.prototype.skipChars=function(e,t){for(var n=this.src.length;e<n&&this.src.charCodeAt(e)===t;e++);return e},$.prototype.skipCharsBack=function(e,t,n){if(e<=n)return e;for(;e>n;)if(t!==this.src.charCodeAt(--e))return e+1;return e},$.prototype.getLines=function(e,t,n,r){var o,a,i,s,u,c=e;if(e>=t)return\"\";if(c+1===t)return a=this.bMarks[c]+Math.min(this.tShift[c],n),i=r?this.eMarks[c]+1:this.eMarks[c],this.src.slice(a,i);for(s=new Array(t-e),o=0;c<t;c++,o++)(u=this.tShift[c])>n&&(u=n),u<0&&(u=0),a=this.bMarks[c]+u,i=c+1<t||r?this.eMarks[c]+1:this.eMarks[c],s[o]=this.src.slice(a,i);return s.join(\"\")};var Y={};[\"article\",\"aside\",\"button\",\"blockquote\",\"body\",\"canvas\",\"caption\",\"col\",\"colgroup\",\"dd\",\"div\",\"dl\",\"dt\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hgroup\",\"hr\",\"iframe\",\"li\",\"map\",\"object\",\"ol\",\"output\",\"p\",\"pre\",\"progress\",\"script\",\"section\",\"style\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"tr\",\"thead\",\"ul\",\"video\"].forEach((function(e){Y[e]=!0}));var G=/^<([a-zA-Z]{1,15})[\\s\\/>]/,Z=/^<\\/([a-zA-Z]{1,15})[\\s>]/;function X(e,t){var n=e.bMarks[t]+e.blkIndent,r=e.eMarks[t];return e.src.substr(n,r-n)}function Q(e,t){var n,r,o=e.bMarks[t]+e.tShift[t],a=e.eMarks[t];return o>=a||126!==(r=e.src.charCodeAt(o++))&&58!==r||o===(n=e.skipSpaces(o))||n>=a?-1:n}var ee=[[\"code\",function(e,t,n){var r,o;if(e.tShift[t]-e.blkIndent<4)return!1;for(o=r=t+1;r<n;)if(e.isEmpty(r))r++;else{if(!(e.tShift[r]-e.blkIndent>=4))break;o=++r}return e.line=r,e.tokens.push({type:\"code\",content:e.getLines(t,o,4+e.blkIndent,!0),block:!0,lines:[t,e.line],level:e.level}),!0}],[\"fences\",function(e,t,n,r){var o,a,i,s,u,c=!1,l=e.bMarks[t]+e.tShift[t],p=e.eMarks[t];if(l+3>p)return!1;if(126!==(o=e.src.charCodeAt(l))&&96!==o)return!1;if(u=l,(a=(l=e.skipChars(l,o))-u)<3)return!1;if((i=e.src.slice(l,p).trim()).indexOf(\"`\")>=0)return!1;if(r)return!0;for(s=t;!(++s>=n)&&!((l=u=e.bMarks[s]+e.tShift[s])<(p=e.eMarks[s])&&e.tShift[s]<e.blkIndent);)if(e.src.charCodeAt(l)===o&&!(e.tShift[s]-e.blkIndent>=4||(l=e.skipChars(l,o))-u<a||(l=e.skipSpaces(l))<p)){c=!0;break}return a=e.tShift[t],e.line=s+(c?1:0),e.tokens.push({type:\"fence\",params:i,content:e.getLines(t+1,s,a,!0),lines:[t,e.line],level:e.level}),!0},[\"paragraph\",\"blockquote\",\"list\"]],[\"blockquote\",function(e,t,n,r){var o,a,i,s,u,c,l,p,f,h,d,m=e.bMarks[t]+e.tShift[t],v=e.eMarks[t];if(m>v)return!1;if(62!==e.src.charCodeAt(m++))return!1;if(e.level>=e.options.maxNesting)return!1;if(r)return!0;for(32===e.src.charCodeAt(m)&&m++,u=e.blkIndent,e.blkIndent=0,s=[e.bMarks[t]],e.bMarks[t]=m,a=(m=m<v?e.skipSpaces(m):m)>=v,i=[e.tShift[t]],e.tShift[t]=m-e.bMarks[t],p=e.parser.ruler.getRules(\"blockquote\"),o=t+1;o<n&&!((m=e.bMarks[o]+e.tShift[o])>=(v=e.eMarks[o]));o++)if(62!==e.src.charCodeAt(m++)){if(a)break;for(d=!1,f=0,h=p.length;f<h;f++)if(p[f](e,o,n,!0)){d=!0;break}if(d)break;s.push(e.bMarks[o]),i.push(e.tShift[o]),e.tShift[o]=-1337}else 32===e.src.charCodeAt(m)&&m++,s.push(e.bMarks[o]),e.bMarks[o]=m,a=(m=m<v?e.skipSpaces(m):m)>=v,i.push(e.tShift[o]),e.tShift[o]=m-e.bMarks[o];for(c=e.parentType,e.parentType=\"blockquote\",e.tokens.push({type:\"blockquote_open\",lines:l=[t,0],level:e.level++}),e.parser.tokenize(e,t,o),e.tokens.push({type:\"blockquote_close\",level:--e.level}),e.parentType=c,l[1]=e.line,f=0;f<i.length;f++)e.bMarks[f+t]=s[f],e.tShift[f+t]=i[f];return e.blkIndent=u,!0},[\"paragraph\",\"blockquote\",\"list\"]],[\"hr\",function(e,t,n,r){var o,a,i,s=e.bMarks[t],u=e.eMarks[t];if((s+=e.tShift[t])>u)return!1;if(42!==(o=e.src.charCodeAt(s++))&&45!==o&&95!==o)return!1;for(a=1;s<u;){if((i=e.src.charCodeAt(s++))!==o&&32!==i)return!1;i===o&&a++}return!(a<3)&&(r||(e.line=t+1,e.tokens.push({type:\"hr\",lines:[t,e.line],level:e.level})),!0)},[\"paragraph\",\"blockquote\",\"list\"]],[\"list\",function(e,t,n,r){var o,a,i,s,u,c,l,p,f,h,d,m,v,g,y,b,_,w,x,E,S,C=!0;if((p=K(e,t))>=0)m=!0;else{if(!((p=J(e,t))>=0))return!1;m=!1}if(e.level>=e.options.maxNesting)return!1;if(d=e.src.charCodeAt(p-1),r)return!0;for(g=e.tokens.length,m?(l=e.bMarks[t]+e.tShift[t],h=Number(e.src.substr(l,p-l-1)),e.tokens.push({type:\"ordered_list_open\",order:h,lines:b=[t,0],level:e.level++})):e.tokens.push({type:\"bullet_list_open\",lines:b=[t,0],level:e.level++}),o=t,y=!1,w=e.parser.ruler.getRules(\"list\");!(!(o<n)||((f=(v=e.skipSpaces(p))>=e.eMarks[o]?1:v-p)>4&&(f=1),f<1&&(f=1),a=p-e.bMarks[o]+f,e.tokens.push({type:\"list_item_open\",lines:_=[t,0],level:e.level++}),s=e.blkIndent,u=e.tight,i=e.tShift[t],c=e.parentType,e.tShift[t]=v-e.bMarks[t],e.blkIndent=a,e.tight=!0,e.parentType=\"list\",e.parser.tokenize(e,t,n,!0),e.tight&&!y||(C=!1),y=e.line-t>1&&e.isEmpty(e.line-1),e.blkIndent=s,e.tShift[t]=i,e.tight=u,e.parentType=c,e.tokens.push({type:\"list_item_close\",level:--e.level}),o=t=e.line,_[1]=o,v=e.bMarks[t],o>=n)||e.isEmpty(o)||e.tShift[o]<e.blkIndent);){for(S=!1,x=0,E=w.length;x<E;x++)if(w[x](e,o,n,!0)){S=!0;break}if(S)break;if(m){if((p=K(e,o))<0)break}else if((p=J(e,o))<0)break;if(d!==e.src.charCodeAt(p-1))break}return e.tokens.push({type:m?\"ordered_list_close\":\"bullet_list_close\",level:--e.level}),b[1]=o,e.line=o,C&&function(e,t){var n,r,o=e.level+2;for(n=t+2,r=e.tokens.length-2;n<r;n++)e.tokens[n].level===o&&\"paragraph_open\"===e.tokens[n].type&&(e.tokens[n+2].tight=!0,e.tokens[n].tight=!0,n+=2)}(e,g),!0},[\"paragraph\",\"blockquote\"]],[\"footnote\",function(e,t,n,r){var o,a,i,s,u,c=e.bMarks[t]+e.tShift[t],l=e.eMarks[t];if(c+4>l)return!1;if(91!==e.src.charCodeAt(c))return!1;if(94!==e.src.charCodeAt(c+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(s=c+2;s<l;s++){if(32===e.src.charCodeAt(s))return!1;if(93===e.src.charCodeAt(s))break}return s!==c+2&&(!(s+1>=l||58!==e.src.charCodeAt(++s))&&(r||(s++,e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.refs||(e.env.footnotes.refs={}),u=e.src.slice(c+2,s-2),e.env.footnotes.refs[\":\"+u]=-1,e.tokens.push({type:\"footnote_reference_open\",label:u,level:e.level++}),o=e.bMarks[t],a=e.tShift[t],i=e.parentType,e.tShift[t]=e.skipSpaces(s)-s,e.bMarks[t]=s,e.blkIndent+=4,e.parentType=\"footnote\",e.tShift[t]<e.blkIndent&&(e.tShift[t]+=e.blkIndent,e.bMarks[t]-=e.blkIndent),e.parser.tokenize(e,t,n,!0),e.parentType=i,e.blkIndent-=4,e.tShift[t]=a,e.bMarks[t]=o,e.tokens.push({type:\"footnote_reference_close\",level:--e.level})),!0))},[\"paragraph\"]],[\"heading\",function(e,t,n,r){var o,a,i,s=e.bMarks[t]+e.tShift[t],u=e.eMarks[t];if(s>=u)return!1;if(35!==(o=e.src.charCodeAt(s))||s>=u)return!1;for(a=1,o=e.src.charCodeAt(++s);35===o&&s<u&&a<=6;)a++,o=e.src.charCodeAt(++s);return!(a>6||s<u&&32!==o)&&(r||(u=e.skipCharsBack(u,32,s),(i=e.skipCharsBack(u,35,s))>s&&32===e.src.charCodeAt(i-1)&&(u=i),e.line=t+1,e.tokens.push({type:\"heading_open\",hLevel:a,lines:[t,e.line],level:e.level}),s<u&&e.tokens.push({type:\"inline\",content:e.src.slice(s,u).trim(),level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:a,level:e.level})),!0)},[\"paragraph\",\"blockquote\"]],[\"lheading\",function(e,t,n){var r,o,a,i=t+1;return!(i>=n)&&(!(e.tShift[i]<e.blkIndent)&&(!(e.tShift[i]-e.blkIndent>3)&&(!((o=e.bMarks[i]+e.tShift[i])>=(a=e.eMarks[i]))&&((45===(r=e.src.charCodeAt(o))||61===r)&&(o=e.skipChars(o,r),!((o=e.skipSpaces(o))<a)&&(o=e.bMarks[t]+e.tShift[t],e.line=i+1,e.tokens.push({type:\"heading_open\",hLevel:61===r?1:2,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:e.src.slice(o,e.eMarks[t]).trim(),level:e.level+1,lines:[t,e.line-1],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:61===r?1:2,level:e.level}),!0))))))}],[\"htmlblock\",function(e,t,n,r){var o,a,i,s=e.bMarks[t],u=e.eMarks[t],c=e.tShift[t];if(s+=c,!e.options.html)return!1;if(c>3||s+2>=u)return!1;if(60!==e.src.charCodeAt(s))return!1;if(33===(o=e.src.charCodeAt(s+1))||63===o){if(r)return!0}else{if(47!==o&&!function(e){var t=32|e;return t>=97&&t<=122}(o))return!1;if(47===o){if(!(a=e.src.slice(s,u).match(Z)))return!1}else if(!(a=e.src.slice(s,u).match(G)))return!1;if(!0!==Y[a[1].toLowerCase()])return!1;if(r)return!0}for(i=t+1;i<e.lineMax&&!e.isEmpty(i);)i++;return e.line=i,e.tokens.push({type:\"htmlblock\",level:e.level,lines:[t,e.line],content:e.getLines(t,i,0,!0)}),!0},[\"paragraph\",\"blockquote\"]],[\"table\",function(e,t,n,r){var o,a,i,s,u,c,l,p,f,h,d;if(t+2>n)return!1;if(u=t+1,e.tShift[u]<e.blkIndent)return!1;if((i=e.bMarks[u]+e.tShift[u])>=e.eMarks[u])return!1;if(124!==(o=e.src.charCodeAt(i))&&45!==o&&58!==o)return!1;if(a=X(e,t+1),!/^[-:| ]+$/.test(a))return!1;if((c=a.split(\"|\"))<=2)return!1;for(p=[],s=0;s<c.length;s++){if(!(f=c[s].trim())){if(0===s||s===c.length-1)continue;return!1}if(!/^:?-+:?$/.test(f))return!1;58===f.charCodeAt(f.length-1)?p.push(58===f.charCodeAt(0)?\"center\":\"right\"):58===f.charCodeAt(0)?p.push(\"left\"):p.push(\"\")}if(-1===(a=X(e,t).trim()).indexOf(\"|\"))return!1;if(c=a.replace(/^\\||\\|$/g,\"\").split(\"|\"),p.length!==c.length)return!1;if(r)return!0;for(e.tokens.push({type:\"table_open\",lines:h=[t,0],level:e.level++}),e.tokens.push({type:\"thead_open\",lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"tr_open\",lines:[t,t+1],level:e.level++}),s=0;s<c.length;s++)e.tokens.push({type:\"th_open\",align:p[s],lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"inline\",content:c[s].trim(),lines:[t,t+1],level:e.level,children:[]}),e.tokens.push({type:\"th_close\",level:--e.level});for(e.tokens.push({type:\"tr_close\",level:--e.level}),e.tokens.push({type:\"thead_close\",level:--e.level}),e.tokens.push({type:\"tbody_open\",lines:d=[t+2,0],level:e.level++}),u=t+2;u<n&&!(e.tShift[u]<e.blkIndent)&&-1!==(a=X(e,u).trim()).indexOf(\"|\");u++){for(c=a.replace(/^\\||\\|$/g,\"\").split(\"|\"),e.tokens.push({type:\"tr_open\",level:e.level++}),s=0;s<c.length;s++)e.tokens.push({type:\"td_open\",align:p[s],level:e.level++}),l=c[s].substring(124===c[s].charCodeAt(0)?1:0,124===c[s].charCodeAt(c[s].length-1)?c[s].length-1:c[s].length).trim(),e.tokens.push({type:\"inline\",content:l,level:e.level,children:[]}),e.tokens.push({type:\"td_close\",level:--e.level});e.tokens.push({type:\"tr_close\",level:--e.level})}return e.tokens.push({type:\"tbody_close\",level:--e.level}),e.tokens.push({type:\"table_close\",level:--e.level}),h[1]=d[1]=u,e.line=u,!0},[\"paragraph\"]],[\"deflist\",function(e,t,n,r){var o,a,i,s,u,c,l,p,f,h,d,m,v,g;if(r)return!(e.ddIndent<0)&&Q(e,t)>=0;if(l=t+1,e.isEmpty(l)&&++l>n)return!1;if(e.tShift[l]<e.blkIndent)return!1;if((o=Q(e,l))<0)return!1;if(e.level>=e.options.maxNesting)return!1;c=e.tokens.length,e.tokens.push({type:\"dl_open\",lines:u=[t,0],level:e.level++}),i=t,a=l;e:for(;;){for(g=!0,v=!1,e.tokens.push({type:\"dt_open\",lines:[i,i],level:e.level++}),e.tokens.push({type:\"inline\",content:e.getLines(i,i+1,e.blkIndent,!1).trim(),level:e.level+1,lines:[i,i],children:[]}),e.tokens.push({type:\"dt_close\",level:--e.level});;){if(e.tokens.push({type:\"dd_open\",lines:s=[l,0],level:e.level++}),m=e.tight,f=e.ddIndent,p=e.blkIndent,d=e.tShift[a],h=e.parentType,e.blkIndent=e.ddIndent=e.tShift[a]+2,e.tShift[a]=o-e.bMarks[a],e.tight=!0,e.parentType=\"deflist\",e.parser.tokenize(e,a,n,!0),e.tight&&!v||(g=!1),v=e.line-a>1&&e.isEmpty(e.line-1),e.tShift[a]=d,e.tight=m,e.parentType=h,e.blkIndent=p,e.ddIndent=f,e.tokens.push({type:\"dd_close\",level:--e.level}),s[1]=l=e.line,l>=n)break e;if(e.tShift[l]<e.blkIndent)break e;if((o=Q(e,l))<0)break;a=l}if(l>=n)break;if(i=l,e.isEmpty(i))break;if(e.tShift[i]<e.blkIndent)break;if((a=i+1)>=n)break;if(e.isEmpty(a)&&a++,a>=n)break;if(e.tShift[a]<e.blkIndent)break;if((o=Q(e,a))<0)break}return e.tokens.push({type:\"dl_close\",level:--e.level}),u[1]=l,e.line=l,g&&function(e,t){var n,r,o=e.level+2;for(n=t+2,r=e.tokens.length-2;n<r;n++)e.tokens[n].level===o&&\"paragraph_open\"===e.tokens[n].type&&(e.tokens[n+2].tight=!0,e.tokens[n].tight=!0,n+=2)}(e,c),!0},[\"paragraph\"]],[\"paragraph\",function(e,t){var n,r,o,a,i,s,u=t+1;if(u<(n=e.lineMax)&&!e.isEmpty(u))for(s=e.parser.ruler.getRules(\"paragraph\");u<n&&!e.isEmpty(u);u++)if(!(e.tShift[u]-e.blkIndent>3)){for(o=!1,a=0,i=s.length;a<i;a++)if(s[a](e,u,n,!0)){o=!0;break}if(o)break}return r=e.getLines(t,u,e.blkIndent,!1).trim(),e.line=u,r.length&&(e.tokens.push({type:\"paragraph_open\",tight:!1,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:r,level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"paragraph_close\",tight:!1,level:e.level})),!0}]];function te(){this.ruler=new C;for(var e=0;e<ee.length;e++)this.ruler.push(ee[e][0],ee[e][1],{alt:(ee[e][2]||[]).slice()})}te.prototype.tokenize=function(e,t,n){for(var r,o=this.ruler.getRules(\"\"),a=o.length,i=t,s=!1;i<n&&(e.line=i=e.skipEmptyLines(i),!(i>=n))&&!(e.tShift[i]<e.blkIndent);){for(r=0;r<a&&!o[r](e,i,n,!1);r++);if(e.tight=!s,e.isEmpty(e.line-1)&&(s=!0),(i=e.line)<n&&e.isEmpty(i)){if(s=!0,++i<n&&\"list\"===e.parentType&&e.isEmpty(i))break;e.line=i}}};var ne=/[\\n\\t]/g,re=/\\r[\\n\\u0085]|[\\u2424\\u2028\\u0085]/g,oe=/\\u00a0/g;function ae(e){switch(e){case 10:case 92:case 96:case 42:case 95:case 94:case 91:case 93:case 33:case 38:case 60:case 62:case 123:case 125:case 36:case 37:case 64:case 126:case 43:case 61:case 58:return!0;default:return!1}}te.prototype.parse=function(e,t,n,r){var o,a=0,i=0;if(!e)return[];(e=(e=e.replace(oe,\" \")).replace(re,\"\\n\")).indexOf(\"\\t\")>=0&&(e=e.replace(ne,(function(t,n){var r;return 10===e.charCodeAt(n)?(a=n+1,i=0,t):(r=\"    \".slice((n-a-i)%4),i=n-a+1,r)}))),o=new $(e,this,t,n,r),this.tokenize(o,o.line,o.lineMax)};for(var ie=[],se=0;se<256;se++)ie.push(0);function ue(e){return e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122}function ce(e,t){var n,r,o,a=t,i=!0,s=!0,u=e.posMax,c=e.src.charCodeAt(t);for(n=t>0?e.src.charCodeAt(t-1):-1;a<u&&e.src.charCodeAt(a)===c;)a++;return a>=u&&(i=!1),(o=a-t)>=4?i=s=!1:(32!==(r=a<u?e.src.charCodeAt(a):-1)&&10!==r||(i=!1),32!==n&&10!==n||(s=!1),95===c&&(ue(n)&&(i=!1),ue(r)&&(s=!1))),{can_open:i,can_close:s,delims:o}}\"\\\\!\\\"#$%&'()*+,./:;<=>?@[]^_`{|}~-\".split(\"\").forEach((function(e){ie[e.charCodeAt(0)]=1}));var le=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;var pe=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;var fe=[\"coap\",\"doi\",\"javascript\",\"aaa\",\"aaas\",\"about\",\"acap\",\"cap\",\"cid\",\"crid\",\"data\",\"dav\",\"dict\",\"dns\",\"file\",\"ftp\",\"geo\",\"go\",\"gopher\",\"h323\",\"http\",\"https\",\"iax\",\"icap\",\"im\",\"imap\",\"info\",\"ipp\",\"iris\",\"iris.beep\",\"iris.xpc\",\"iris.xpcs\",\"iris.lwz\",\"ldap\",\"mailto\",\"mid\",\"msrp\",\"msrps\",\"mtqp\",\"mupdate\",\"news\",\"nfs\",\"ni\",\"nih\",\"nntp\",\"opaquelocktoken\",\"pop\",\"pres\",\"rtsp\",\"service\",\"session\",\"shttp\",\"sieve\",\"sip\",\"sips\",\"sms\",\"snmp\",\"soap.beep\",\"soap.beeps\",\"tag\",\"tel\",\"telnet\",\"tftp\",\"thismessage\",\"tn3270\",\"tip\",\"tv\",\"urn\",\"vemmi\",\"ws\",\"wss\",\"xcon\",\"xcon-userid\",\"xmlrpc.beep\",\"xmlrpc.beeps\",\"xmpp\",\"z39.50r\",\"z39.50s\",\"adiumxtra\",\"afp\",\"afs\",\"aim\",\"apt\",\"attachment\",\"aw\",\"beshare\",\"bitcoin\",\"bolo\",\"callto\",\"chrome\",\"chrome-extension\",\"com-eventbrite-attendee\",\"content\",\"cvs\",\"dlna-playsingle\",\"dlna-playcontainer\",\"dtn\",\"dvb\",\"ed2k\",\"facetime\",\"feed\",\"finger\",\"fish\",\"gg\",\"git\",\"gizmoproject\",\"gtalk\",\"hcp\",\"icon\",\"ipn\",\"irc\",\"irc6\",\"ircs\",\"itms\",\"jar\",\"jms\",\"keyparc\",\"lastfm\",\"ldaps\",\"magnet\",\"maps\",\"market\",\"message\",\"mms\",\"ms-help\",\"msnim\",\"mumble\",\"mvn\",\"notes\",\"oid\",\"palm\",\"paparazzi\",\"platform\",\"proxy\",\"psyc\",\"query\",\"res\",\"resource\",\"rmi\",\"rsync\",\"rtmp\",\"secondlife\",\"sftp\",\"sgn\",\"skype\",\"smb\",\"soldat\",\"spotify\",\"ssh\",\"steam\",\"svn\",\"teamspeak\",\"things\",\"udp\",\"unreal\",\"ut2004\",\"ventrilo\",\"view-source\",\"webcal\",\"wtai\",\"wyciwyg\",\"xfire\",\"xri\",\"ymsgr\"],he=/^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,de=/^<([a-zA-Z.\\-]{1,25}):([^<>\\x00-\\x20]*)>/;function me(e,t){return e=e.source,t=t||\"\",function n(r,o){return r?(o=o.source||o,e=e.replace(r,o),n):new RegExp(e,t)}}var ve=me(/(?:unquoted|single_quoted|double_quoted)/)(\"unquoted\",/[^\"'=<>`\\x00-\\x20]+/)(\"single_quoted\",/'[^']*'/)(\"double_quoted\",/\"[^\"]*\"/)(),ge=me(/(?:\\s+attr_name(?:\\s*=\\s*attr_value)?)/)(\"attr_name\",/[a-zA-Z_:][a-zA-Z0-9:._-]*/)(\"attr_value\",ve)(),ye=me(/<[A-Za-z][A-Za-z0-9]*attribute*\\s*\\/?>/)(\"attribute\",ge)(),be=me(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)(\"open_tag\",ye)(\"close_tag\",/<\\/[A-Za-z][A-Za-z0-9]*\\s*>/)(\"comment\",/<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->/)(\"processing\",/<[?].*?[?]>/)(\"declaration\",/<![A-Z]+\\s+[^>]*>/)(\"cdata\",/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/)();var _e=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,we=/^&([a-z][a-z0-9]{1,31});/i;var xe=[[\"text\",function(e,t){for(var n=e.pos;n<e.posMax&&!ae(e.src.charCodeAt(n));)n++;return n!==e.pos&&(t||(e.pending+=e.src.slice(e.pos,n)),e.pos=n,!0)}],[\"newline\",function(e,t){var n,r,o=e.pos;if(10!==e.src.charCodeAt(o))return!1;if(n=e.pending.length-1,r=e.posMax,!t)if(n>=0&&32===e.pending.charCodeAt(n))if(n>=1&&32===e.pending.charCodeAt(n-1)){for(var a=n-2;a>=0;a--)if(32!==e.pending.charCodeAt(a)){e.pending=e.pending.substring(0,a+1);break}e.push({type:\"hardbreak\",level:e.level})}else e.pending=e.pending.slice(0,-1),e.push({type:\"softbreak\",level:e.level});else e.push({type:\"softbreak\",level:e.level});for(o++;o<r&&32===e.src.charCodeAt(o);)o++;return e.pos=o,!0}],[\"escape\",function(e,t){var n,r=e.pos,o=e.posMax;if(92!==e.src.charCodeAt(r))return!1;if(++r<o){if((n=e.src.charCodeAt(r))<256&&0!==ie[n])return t||(e.pending+=e.src[r]),e.pos+=2,!0;if(10===n){for(t||e.push({type:\"hardbreak\",level:e.level}),r++;r<o&&32===e.src.charCodeAt(r);)r++;return e.pos=r,!0}}return t||(e.pending+=\"\\\\\"),e.pos++,!0}],[\"backticks\",function(e,t){var n,r,o,a,i,s=e.pos;if(96!==e.src.charCodeAt(s))return!1;for(n=s,s++,r=e.posMax;s<r&&96===e.src.charCodeAt(s);)s++;for(o=e.src.slice(n,s),a=i=s;-1!==(a=e.src.indexOf(\"`\",i));){for(i=a+1;i<r&&96===e.src.charCodeAt(i);)i++;if(i-a===o.length)return t||e.push({type:\"code\",content:e.src.slice(s,a).replace(/[ \\n]+/g,\" \").trim(),block:!1,level:e.level}),e.pos=i,!0}return t||(e.pending+=o),e.pos+=o.length,!0}],[\"del\",function(e,t){var n,r,o,a,i,s=e.posMax,u=e.pos;if(126!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=s)return!1;if(126!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(a=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),126===a)return!1;if(126===i)return!1;if(32===i||10===i)return!1;for(r=u+2;r<s&&126===e.src.charCodeAt(r);)r++;if(r>u+3)return e.pos+=r-u,t||(e.pending+=e.src.slice(u,r)),!0;for(e.pos=u+2,o=1;e.pos+1<s;){if(126===e.src.charCodeAt(e.pos)&&126===e.src.charCodeAt(e.pos+1)&&(a=e.src.charCodeAt(e.pos-1),126!==(i=e.pos+2<s?e.src.charCodeAt(e.pos+2):-1)&&126!==a&&(32!==a&&10!==a?o--:32!==i&&10!==i&&o++,o<=0))){n=!0;break}e.parser.skipToken(e)}return n?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"del_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"del_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=s,!0):(e.pos=u,!1)}],[\"ins\",function(e,t){var n,r,o,a,i,s=e.posMax,u=e.pos;if(43!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=s)return!1;if(43!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(a=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),43===a)return!1;if(43===i)return!1;if(32===i||10===i)return!1;for(r=u+2;r<s&&43===e.src.charCodeAt(r);)r++;if(r!==u+2)return e.pos+=r-u,t||(e.pending+=e.src.slice(u,r)),!0;for(e.pos=u+2,o=1;e.pos+1<s;){if(43===e.src.charCodeAt(e.pos)&&43===e.src.charCodeAt(e.pos+1)&&(a=e.src.charCodeAt(e.pos-1),43!==(i=e.pos+2<s?e.src.charCodeAt(e.pos+2):-1)&&43!==a&&(32!==a&&10!==a?o--:32!==i&&10!==i&&o++,o<=0))){n=!0;break}e.parser.skipToken(e)}return n?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"ins_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"ins_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=s,!0):(e.pos=u,!1)}],[\"mark\",function(e,t){var n,r,o,a,i,s=e.posMax,u=e.pos;if(61!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=s)return!1;if(61!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(a=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),61===a)return!1;if(61===i)return!1;if(32===i||10===i)return!1;for(r=u+2;r<s&&61===e.src.charCodeAt(r);)r++;if(r!==u+2)return e.pos+=r-u,t||(e.pending+=e.src.slice(u,r)),!0;for(e.pos=u+2,o=1;e.pos+1<s;){if(61===e.src.charCodeAt(e.pos)&&61===e.src.charCodeAt(e.pos+1)&&(a=e.src.charCodeAt(e.pos-1),61!==(i=e.pos+2<s?e.src.charCodeAt(e.pos+2):-1)&&61!==a&&(32!==a&&10!==a?o--:32!==i&&10!==i&&o++,o<=0))){n=!0;break}e.parser.skipToken(e)}return n?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"mark_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"mark_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=s,!0):(e.pos=u,!1)}],[\"emphasis\",function(e,t){var n,r,o,a,i,s,u,c=e.posMax,l=e.pos,p=e.src.charCodeAt(l);if(95!==p&&42!==p)return!1;if(t)return!1;if(n=(u=ce(e,l)).delims,!u.can_open)return e.pos+=n,t||(e.pending+=e.src.slice(l,e.pos)),!0;if(e.level>=e.options.maxNesting)return!1;for(e.pos=l+n,s=[n];e.pos<c;)if(e.src.charCodeAt(e.pos)!==p)e.parser.skipToken(e);else{if(r=(u=ce(e,e.pos)).delims,u.can_close){for(a=s.pop(),i=r;a!==i;){if(i<a){s.push(a-i);break}if(i-=a,0===s.length)break;e.pos+=a,a=s.pop()}if(0===s.length){n=a,o=!0;break}e.pos+=r;continue}u.can_open&&s.push(r),e.pos+=r}return o?(e.posMax=e.pos,e.pos=l+n,t||(2!==n&&3!==n||e.push({type:\"strong_open\",level:e.level++}),1!==n&&3!==n||e.push({type:\"em_open\",level:e.level++}),e.parser.tokenize(e),1!==n&&3!==n||e.push({type:\"em_close\",level:--e.level}),2!==n&&3!==n||e.push({type:\"strong_close\",level:--e.level})),e.pos=e.posMax+n,e.posMax=c,!0):(e.pos=l,!1)}],[\"sub\",function(e,t){var n,r,o=e.posMax,a=e.pos;if(126!==e.src.charCodeAt(a))return!1;if(t)return!1;if(a+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=a+1;e.pos<o;){if(126===e.src.charCodeAt(e.pos)){n=!0;break}e.parser.skipToken(e)}return n&&a+1!==e.pos?(r=e.src.slice(a+1,e.pos)).match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=a,!1):(e.posMax=e.pos,e.pos=a+1,t||e.push({type:\"sub\",level:e.level,content:r.replace(le,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=a,!1)}],[\"sup\",function(e,t){var n,r,o=e.posMax,a=e.pos;if(94!==e.src.charCodeAt(a))return!1;if(t)return!1;if(a+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=a+1;e.pos<o;){if(94===e.src.charCodeAt(e.pos)){n=!0;break}e.parser.skipToken(e)}return n&&a+1!==e.pos?(r=e.src.slice(a+1,e.pos)).match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=a,!1):(e.posMax=e.pos,e.pos=a+1,t||e.push({type:\"sup\",level:e.level,content:r.replace(pe,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=a,!1)}],[\"links\",function(e,t){var n,r,o,a,i,s,u,c,l=!1,p=e.pos,f=e.posMax,h=e.pos,d=e.src.charCodeAt(h);if(33===d&&(l=!0,d=e.src.charCodeAt(++h)),91!==d)return!1;if(e.level>=e.options.maxNesting)return!1;if(n=h+1,(r=k(e,h))<0)return!1;if((s=r+1)<f&&40===e.src.charCodeAt(s)){for(s++;s<f&&(32===(c=e.src.charCodeAt(s))||10===c);s++);if(s>=f)return!1;for(h=s,T(e,s)?(a=e.linkContent,s=e.pos):a=\"\",h=s;s<f&&(32===(c=e.src.charCodeAt(s))||10===c);s++);if(s<f&&h!==s&&I(e,s))for(i=e.linkContent,s=e.pos;s<f&&(32===(c=e.src.charCodeAt(s))||10===c);s++);else i=\"\";if(s>=f||41!==e.src.charCodeAt(s))return e.pos=p,!1;s++}else{if(e.linkLevel>0)return!1;for(;s<f&&(32===(c=e.src.charCodeAt(s))||10===c);s++);if(s<f&&91===e.src.charCodeAt(s)&&(h=s+1,(s=k(e,s))>=0?o=e.src.slice(h,s++):s=h-1),o||(void 0===o&&(s=r+1),o=e.src.slice(n,r)),!(u=e.env.references[P(o)]))return e.pos=p,!1;a=u.href,i=u.title}return t||(e.pos=n,e.posMax=r,l?e.push({type:\"image\",src:a,title:i,alt:e.src.substr(n,r-n),level:e.level}):(e.push({type:\"link_open\",href:a,title:i,level:e.level++}),e.linkLevel++,e.parser.tokenize(e),e.linkLevel--,e.push({type:\"link_close\",level:--e.level}))),e.pos=s,e.posMax=f,!0}],[\"footnote_inline\",function(e,t){var n,r,o,a,i=e.posMax,s=e.pos;return!(s+2>=i)&&(94===e.src.charCodeAt(s)&&(91===e.src.charCodeAt(s+1)&&(!(e.level>=e.options.maxNesting)&&(n=s+2,!((r=k(e,s+1))<0)&&(t||(e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.list||(e.env.footnotes.list=[]),o=e.env.footnotes.list.length,e.pos=n,e.posMax=r,e.push({type:\"footnote_ref\",id:o,level:e.level}),e.linkLevel++,a=e.tokens.length,e.parser.tokenize(e),e.env.footnotes.list[o]={tokens:e.tokens.splice(a)},e.linkLevel--),e.pos=r+1,e.posMax=i,!0)))))}],[\"footnote_ref\",function(e,t){var n,r,o,a,i=e.posMax,s=e.pos;if(s+3>i)return!1;if(!e.env.footnotes||!e.env.footnotes.refs)return!1;if(91!==e.src.charCodeAt(s))return!1;if(94!==e.src.charCodeAt(s+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(r=s+2;r<i;r++){if(32===e.src.charCodeAt(r))return!1;if(10===e.src.charCodeAt(r))return!1;if(93===e.src.charCodeAt(r))break}return r!==s+2&&(!(r>=i)&&(r++,n=e.src.slice(s+2,r-1),void 0!==e.env.footnotes.refs[\":\"+n]&&(t||(e.env.footnotes.list||(e.env.footnotes.list=[]),e.env.footnotes.refs[\":\"+n]<0?(o=e.env.footnotes.list.length,e.env.footnotes.list[o]={label:n,count:0},e.env.footnotes.refs[\":\"+n]=o):o=e.env.footnotes.refs[\":\"+n],a=e.env.footnotes.list[o].count,e.env.footnotes.list[o].count++,e.push({type:\"footnote_ref\",id:o,subId:a,level:e.level})),e.pos=r,e.posMax=i,!0)))}],[\"autolink\",function(e,t){var n,r,o,a,i,s=e.pos;return 60===e.src.charCodeAt(s)&&(!((n=e.src.slice(s)).indexOf(\">\")<0)&&((r=n.match(de))?!(fe.indexOf(r[1].toLowerCase())<0)&&(i=j(a=r[0].slice(1,-1)),!!e.parser.validateLink(a)&&(t||(e.push({type:\"link_open\",href:i,level:e.level}),e.push({type:\"text\",content:a,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=r[0].length,!0)):!!(o=n.match(he))&&(i=j(\"mailto:\"+(a=o[0].slice(1,-1))),!!e.parser.validateLink(i)&&(t||(e.push({type:\"link_open\",href:i,level:e.level}),e.push({type:\"text\",content:a,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=o[0].length,!0))))}],[\"htmltag\",function(e,t){var n,r,o,a=e.pos;return!!e.options.html&&(o=e.posMax,!(60!==e.src.charCodeAt(a)||a+2>=o)&&(!(33!==(n=e.src.charCodeAt(a+1))&&63!==n&&47!==n&&!function(e){var t=32|e;return t>=97&&t<=122}(n))&&(!!(r=e.src.slice(a).match(be))&&(t||e.push({type:\"htmltag\",content:e.src.slice(a,a+r[0].length),level:e.level}),e.pos+=r[0].length,!0))))}],[\"entity\",function(e,t){var n,r,a=e.pos,i=e.posMax;if(38!==e.src.charCodeAt(a))return!1;if(a+1<i)if(35===e.src.charCodeAt(a+1)){if(r=e.src.slice(a).match(_e))return t||(n=\"x\"===r[1][0].toLowerCase()?parseInt(r[1].slice(1),16):parseInt(r[1],10),e.pending+=l(n)?p(n):p(65533)),e.pos+=r[0].length,!0}else if(r=e.src.slice(a).match(we)){var s=o(r[1]);if(r[1]!==s)return t||(e.pending+=s),e.pos+=r[0].length,!0}return t||(e.pending+=\"&\"),e.pos++,!0}]];function Ee(){this.ruler=new C;for(var e=0;e<xe.length;e++)this.ruler.push(xe[e][0],xe[e][1]);this.validateLink=Se}function Se(e){var t=e.trim().toLowerCase();return-1===(t=m(t)).indexOf(\":\")||-1===[\"vbscript\",\"javascript\",\"file\",\"data\"].indexOf(t.split(\":\")[0])}Ee.prototype.skipToken=function(e){var t,n,r=this.ruler.getRules(\"\"),o=r.length,a=e.pos;if((n=e.cacheGet(a))>0)e.pos=n;else{for(t=0;t<o;t++)if(r[t](e,!0))return void e.cacheSet(a,e.pos);e.pos++,e.cacheSet(a,e.pos)}},Ee.prototype.tokenize=function(e){for(var t,n,r=this.ruler.getRules(\"\"),o=r.length,a=e.posMax;e.pos<a;){for(n=0;n<o&&!(t=r[n](e,!1));n++);if(t){if(e.pos>=a)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},Ee.prototype.parse=function(e,t,n,r){var o=new A(e,this,t,n,r);this.tokenize(o)};var Ce={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"replacements\",\"smartquotes\",\"references\",\"abbr2\",\"footnote_tail\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"footnote\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\",\"table\"]},inline:{rules:[\"autolink\",\"backticks\",\"del\",\"emphasis\",\"entity\",\"escape\",\"footnote_ref\",\"htmltag\",\"links\",\"newline\",\"text\"]}}},full:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"abbr2\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\"]},inline:{rules:[\"autolink\",\"backticks\",\"emphasis\",\"entity\",\"escape\",\"htmltag\",\"links\",\"newline\",\"text\"]}}}};function Ae(e,t,n){this.src=t,this.env=n,this.options=e.options,this.tokens=[],this.inlineMode=!1,this.inline=e.inline,this.block=e.block,this.renderer=e.renderer,this.typographer=e.typographer}function ke(e,t){\"string\"!=typeof e&&(t=e,e=\"default\"),t&&null!=t.linkify&&console.warn(\"linkify option is removed. Use linkify plugin instead:\\n\\nimport Remarkable from 'remarkable';\\nimport linkify from 'remarkable/linkify';\\nnew Remarkable().use(linkify)\\n\"),this.inline=new Ee,this.block=new te,this.core=new H,this.renderer=new S,this.ruler=new C,this.options={},this.configure(Ce[e]),this.set(t||{})}ke.prototype.set=function(e){s(this.options,e)},ke.prototype.configure=function(e){var t=this;if(!e)throw new Error(\"Wrong `remarkable` preset, check name/content\");e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach((function(n){e.components[n].rules&&t[n].ruler.enable(e.components[n].rules,!0)}))},ke.prototype.use=function(e,t){return e(this,t),this},ke.prototype.parse=function(e,t){var n=new Ae(this,e,t);return this.core.process(n),n.tokens},ke.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)},ke.prototype.parseInline=function(e,t){var n=new Ae(this,e,t);return n.inlineMode=!0,this.core.process(n),n.tokens},ke.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)}},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return ve}));var r=n(0),o=n.n(r),a=(n(11),n(220));function i(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1}function s(e,t){for(var n=e.length-1;n>=0;n--)!0===t(e[n])&&e.splice(n,1)}function u(e){throw new Error(\"Unhandled case for value: '\"+e+\"'\")}var c=function(){function e(e){void 0===e&&(e={}),this.tagName=\"\",this.attrs={},this.innerHTML=\"\",this.whitespaceRegex=/\\s+/,this.tagName=e.tagName||\"\",this.attrs=e.attrs||{},this.innerHTML=e.innerHtml||e.innerHTML||\"\"}return e.prototype.setTagName=function(e){return this.tagName=e,this},e.prototype.getTagName=function(){return this.tagName||\"\"},e.prototype.setAttr=function(e,t){return this.getAttrs()[e]=t,this},e.prototype.getAttr=function(e){return this.getAttrs()[e]},e.prototype.setAttrs=function(e){return Object.assign(this.getAttrs(),e),this},e.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},e.prototype.setClass=function(e){return this.setAttr(\"class\",e)},e.prototype.addClass=function(e){for(var t,n=this.getClass(),r=this.whitespaceRegex,o=n?n.split(r):[],a=e.split(r);t=a.shift();)-1===i(o,t)&&o.push(t);return this.getAttrs().class=o.join(\" \"),this},e.prototype.removeClass=function(e){for(var t,n=this.getClass(),r=this.whitespaceRegex,o=n?n.split(r):[],a=e.split(r);o.length&&(t=a.shift());){var s=i(o,t);-1!==s&&o.splice(s,1)}return this.getAttrs().class=o.join(\" \"),this},e.prototype.getClass=function(){return this.getAttrs().class||\"\"},e.prototype.hasClass=function(e){return-1!==(\" \"+this.getClass()+\" \").indexOf(\" \"+e+\" \")},e.prototype.setInnerHTML=function(e){return this.innerHTML=e,this},e.prototype.setInnerHtml=function(e){return this.setInnerHTML(e)},e.prototype.getInnerHTML=function(){return this.innerHTML||\"\"},e.prototype.getInnerHtml=function(){return this.getInnerHTML()},e.prototype.toAnchorString=function(){var e=this.getTagName(),t=this.buildAttrsStr();return[\"<\",e,t=t?\" \"+t:\"\",\">\",this.getInnerHtml(),\"</\",e,\">\"].join(\"\")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return\"\";var e=this.getAttrs(),t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n+'=\"'+e[n]+'\"');return t.join(\" \")},e}();var l=function(){function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this.className=\"\",this.newWindow=e.newWindow||!1,this.truncate=e.truncate||{},this.className=e.className||\"\"}return e.prototype.build=function(e){return new c({tagName:\"a\",attrs:this.createAttrs(e),innerHtml:this.processAnchorText(e.getAnchorText())})},e.prototype.createAttrs=function(e){var t={href:e.getAnchorHref()},n=this.createCssClass(e);return n&&(t.class=n),this.newWindow&&(t.target=\"_blank\",t.rel=\"noopener noreferrer\"),this.truncate&&this.truncate.length&&this.truncate.length<e.getAnchorText().length&&(t.title=e.getAnchorHref()),t},e.prototype.createCssClass=function(e){var t=this.className;if(t){for(var n=[t],r=e.getCssClassSuffixes(),o=0,a=r.length;o<a;o++)n.push(t+\"-\"+r[o]);return n.join(\" \")}return\"\"},e.prototype.processAnchorText=function(e){return e=this.doTruncate(e)},e.prototype.doTruncate=function(e){var t=this.truncate;if(!t||!t.length)return e;var n=t.length,r=t.location;return\"smart\"===r?function(e,t,n){var r,o;null==n?(n=\"&hellip;\",o=3,r=8):(o=n.length,r=n.length);var a=function(e){var t=\"\";return e.scheme&&e.host&&(t+=e.scheme+\"://\"),e.host&&(t+=e.host),e.path&&(t+=\"/\"+e.path),e.query&&(t+=\"?\"+e.query),e.fragment&&(t+=\"#\"+e.fragment),t},i=function(e,t){var r=t/2,o=Math.ceil(r),a=-1*Math.floor(r),i=\"\";return a<0&&(i=e.substr(a)),e.substr(0,o)+n+i};if(e.length<=t)return e;var s=t-o,u=function(e){var t={},n=e,r=n.match(/^([a-z]+):\\/\\//i);return r&&(t.scheme=r[1],n=n.substr(r[0].length)),(r=n.match(/^(.*?)(?=(\\?|#|\\/|$))/i))&&(t.host=r[1],n=n.substr(r[0].length)),(r=n.match(/^\\/(.*?)(?=(\\?|#|$))/i))&&(t.path=r[1],n=n.substr(r[0].length)),(r=n.match(/^\\?(.*?)(?=(#|$))/i))&&(t.query=r[1],n=n.substr(r[0].length)),(r=n.match(/^#(.*?)$/i))&&(t.fragment=r[1]),t}(e);if(u.query){var c=u.query.match(/^(.*?)(?=(\\?|\\#))(.*?)$/i);c&&(u.query=u.query.substr(0,c[1].length),e=a(u))}if(e.length<=t)return e;if(u.host&&(u.host=u.host.replace(/^www\\./,\"\"),e=a(u)),e.length<=t)return e;var l=\"\";if(u.host&&(l+=u.host),l.length>=s)return u.host.length==t?(u.host.substr(0,t-o)+n).substr(0,s+r):i(l,s).substr(0,s+r);var p=\"\";if(u.path&&(p+=\"/\"+u.path),u.query&&(p+=\"?\"+u.query),p){if((l+p).length>=s)return(l+p).length==t?(l+p).substr(0,t):(l+i(p,s-l.length)).substr(0,s+r);l+=p}if(u.fragment){var f=\"#\"+u.fragment;if((l+f).length>=s)return(l+f).length==t?(l+f).substr(0,t):(l+i(f,s-l.length)).substr(0,s+r);l+=f}if(u.scheme&&u.host){var h=u.scheme+\"://\";if((l+h).length<s)return(h+l).substr(0,t)}if(l.length<=t)return l;var d=\"\";return s>0&&(d=l.substr(-1*Math.floor(s/2))),(l.substr(0,Math.ceil(s/2))+n+d).substr(0,s+r)}(e,n):\"middle\"===r?function(e,t,n){if(e.length<=t)return e;var r,o;null==n?(n=\"&hellip;\",r=8,o=3):(r=n.length,o=n.length);var a=t-o,i=\"\";return a>0&&(i=e.substr(-1*Math.floor(a/2))),(e.substr(0,Math.ceil(a/2))+n+i).substr(0,a+r)}(e,n):function(e,t,n){return function(e,t,n){var r;return e.length>t&&(null==n?(n=\"&hellip;\",r=3):r=n.length,e=e.substring(0,t-r)+n),e}(e,t,n)}(e,n)},e}(),p=function(){function e(e){this.__jsduckDummyDocProp=null,this.matchedText=\"\",this.offset=0,this.tagBuilder=e.tagBuilder,this.matchedText=e.matchedText,this.offset=e.offset}return e.prototype.getMatchedText=function(){return this.matchedText},e.prototype.setOffset=function(e){this.offset=e},e.prototype.getOffset=function(){return this.offset},e.prototype.getCssClassSuffixes=function(){return[this.getType()]},e.prototype.buildTag=function(){return this.tagBuilder.build(this)},e}(),f=function(e,t){return(f=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function h(e,t){function n(){this.constructor=e}f(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var d=function(){return(d=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};var m,v=function(e){function t(t){var n=e.call(this,t)||this;return n.email=\"\",n.email=t.email,n}return h(t,e),t.prototype.getType=function(){return\"email\"},t.prototype.getEmail=function(){return this.email},t.prototype.getAnchorHref=function(){return\"mailto:\"+this.email},t.prototype.getAnchorText=function(){return this.email},t}(p),g=function(e){function t(t){var n=e.call(this,t)||this;return n.serviceName=\"\",n.hashtag=\"\",n.serviceName=t.serviceName,n.hashtag=t.hashtag,n}return h(t,e),t.prototype.getType=function(){return\"hashtag\"},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getHashtag=function(){return this.hashtag},t.prototype.getAnchorHref=function(){var e=this.serviceName,t=this.hashtag;switch(e){case\"twitter\":return\"https://twitter.com/hashtag/\"+t;case\"facebook\":return\"https://www.facebook.com/hashtag/\"+t;case\"instagram\":return\"https://instagram.com/explore/tags/\"+t;default:throw new Error(\"Unknown service name to point hashtag to: \"+e)}},t.prototype.getAnchorText=function(){return\"#\"+this.hashtag},t}(p),y=function(e){function t(t){var n=e.call(this,t)||this;return n.serviceName=\"twitter\",n.mention=\"\",n.mention=t.mention,n.serviceName=t.serviceName,n}return h(t,e),t.prototype.getType=function(){return\"mention\"},t.prototype.getMention=function(){return this.mention},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getAnchorHref=function(){switch(this.serviceName){case\"twitter\":return\"https://twitter.com/\"+this.mention;case\"instagram\":return\"https://instagram.com/\"+this.mention;case\"soundcloud\":return\"https://soundcloud.com/\"+this.mention;default:throw new Error(\"Unknown service name to point mention to: \"+this.serviceName)}},t.prototype.getAnchorText=function(){return\"@\"+this.mention},t.prototype.getCssClassSuffixes=function(){var t=e.prototype.getCssClassSuffixes.call(this),n=this.getServiceName();return n&&t.push(n),t},t}(p),b=function(e){function t(t){var n=e.call(this,t)||this;return n.number=\"\",n.plusSign=!1,n.number=t.number,n.plusSign=t.plusSign,n}return h(t,e),t.prototype.getType=function(){return\"phone\"},t.prototype.getPhoneNumber=function(){return this.number},t.prototype.getNumber=function(){return this.getPhoneNumber()},t.prototype.getAnchorHref=function(){return\"tel:\"+(this.plusSign?\"+\":\"\")+this.number},t.prototype.getAnchorText=function(){return this.matchedText},t}(p),_=function(e){function t(t){var n=e.call(this,t)||this;return n.url=\"\",n.urlMatchType=\"scheme\",n.protocolUrlMatch=!1,n.protocolRelativeMatch=!1,n.stripPrefix={scheme:!0,www:!0},n.stripTrailingSlash=!0,n.decodePercentEncoding=!0,n.schemePrefixRegex=/^(https?:\\/\\/)?/i,n.wwwPrefixRegex=/^(https?:\\/\\/)?(www\\.)?/i,n.protocolRelativeRegex=/^\\/\\//,n.protocolPrepended=!1,n.urlMatchType=t.urlMatchType,n.url=t.url,n.protocolUrlMatch=t.protocolUrlMatch,n.protocolRelativeMatch=t.protocolRelativeMatch,n.stripPrefix=t.stripPrefix,n.stripTrailingSlash=t.stripTrailingSlash,n.decodePercentEncoding=t.decodePercentEncoding,n}return h(t,e),t.prototype.getType=function(){return\"url\"},t.prototype.getUrlMatchType=function(){return this.urlMatchType},t.prototype.getUrl=function(){var e=this.url;return this.protocolRelativeMatch||this.protocolUrlMatch||this.protocolPrepended||(e=this.url=\"http://\"+e,this.protocolPrepended=!0),e},t.prototype.getAnchorHref=function(){return this.getUrl().replace(/&amp;/g,\"&\")},t.prototype.getAnchorText=function(){var e=this.getMatchedText();return this.protocolRelativeMatch&&(e=this.stripProtocolRelativePrefix(e)),this.stripPrefix.scheme&&(e=this.stripSchemePrefix(e)),this.stripPrefix.www&&(e=this.stripWwwPrefix(e)),this.stripTrailingSlash&&(e=this.removeTrailingSlash(e)),this.decodePercentEncoding&&(e=this.removePercentEncoding(e)),e},t.prototype.stripSchemePrefix=function(e){return e.replace(this.schemePrefixRegex,\"\")},t.prototype.stripWwwPrefix=function(e){return e.replace(this.wwwPrefixRegex,\"$1\")},t.prototype.stripProtocolRelativePrefix=function(e){return e.replace(this.protocolRelativeRegex,\"\")},t.prototype.removeTrailingSlash=function(e){return\"/\"===e.charAt(e.length-1)&&(e=e.slice(0,-1)),e},t.prototype.removePercentEncoding=function(e){var t=e.replace(/%22/gi,\"&quot;\").replace(/%26/gi,\"&amp;\").replace(/%27/gi,\"&#39;\").replace(/%3C/gi,\"&lt;\").replace(/%3E/gi,\"&gt;\");try{return decodeURIComponent(t)}catch(e){return t}},t}(p),w=function(e){this.__jsduckDummyDocProp=null,this.tagBuilder=e.tagBuilder},x=/[A-Za-z]/,E=/[\\d]/,S=/[\\D]/,C=/\\s/,A=/['\"]/,k=/[\\x00-\\x1F\\x7F]/,O=/A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC/.source,j=O+/\\u2700-\\u27bf\\udde6-\\uddff\\ud800-\\udbff\\udc00-\\udfff\\ufe0e\\ufe0f\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0\\ud83c\\udffb-\\udfff\\u200d\\u3299\\u3297\\u303d\\u3030\\u24c2\\ud83c\\udd70-\\udd71\\udd7e-\\udd7f\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01-\\ude02\\ude1a\\ude2f\\ude32-\\ude3a\\ude50-\\ude51\\u203c\\u2049\\u25aa-\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u00a9\\u00ae\\u2122\\u2139\\udc04\\u2600-\\u26FF\\u2b05\\u2b06\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u231a\\u231b\\u2328\\u23cf\\u23e9-\\u23f3\\u23f8-\\u23fa\\udccf\\u2935\\u2934\\u2190-\\u21ff/.source+/\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F/.source,T=/0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19/.source,I=j+T,P=j+T,N=\"(?:[\"+T+\"]{1,3}\\\\.){3}[\"+T+\"]{1,3}\",M=\"[\"+P+\"](?:[\"+P+\"\\\\-]{0,61}[\"+P+\"])?\",R=function(e){return\"(?=(\"+M+\"))\\\\\"+e},D=function(e){return\"(?:\"+R(e)+\"(?:\\\\.\"+R(e+1)+\"){0,126}|\"+N+\")\"},L=(new RegExp(\"[\"+P+\".\\\\-]*[\"+P+\"\\\\-]\"),new RegExp(\"[\"+P+\"]\")),B=/(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|vermögensberatung|xn--3oq18vl8pn36a|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|vermögensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|afamilycompany|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbb9fbpob|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|spreadbetting|travelchannel|wolterskluwer|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|rightathome|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--estv75g|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--kpu716f|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pbt977c|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|சிங்கப்பூர்|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nationwide|newholland|nextdirect|onyourside|properties|protection|prudential|realestate|republican|restaurant|schaeffler|swiftcover|tatamotors|technology|telefonica|university|vistaprint|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|fujixerox|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|honeywell|institute|insurance|kuokgroup|ladbrokes|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|scjohnson|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--tckwe|xn--vhquv|yodobashi|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|budapest|builders|business|capetown|catering|catholic|chrysler|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|esurance|etisalat|everbank|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|movistar|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|symantec|training|uconnect|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|السعودية|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|cartier|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|iselect|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lancome|lanxess|lasalle|latrobe|leclerc|liaison|limited|lincoln|markets|metlife|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|shriram|singles|staples|starhub|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|католик|اتصالات|الجزائر|العليان|پاکستان|كاثوليك|موبايلي|இந்தியா|abarth|abbott|abbvie|active|africa|agency|airbus|airtel|alipay|alsace|alstom|anquan|aramco|author|bayern|beauty|berlin|bharti|blanco|bostik|boston|broker|camera|career|caseih|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|mobily|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|piaget|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|warman|webcam|xihuan|yachts|yandex|zappos|москва|онлайн|ابوظبي|ارامكو|الاردن|المغرب|امارات|فلسطين|مليسيا|भारतम्|இலங்கை|ファッション|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|dodge|drive|dubai|earth|edeka|email|epost|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glade|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|intel|irish|iveco|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|lixil|loans|locus|lotte|lotto|lupin|macys|mango|media|miami|money|mopar|movie|nadex|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|zippo|ایران|بازار|بھارت|سودان|سورية|همراه|भारोत|संगठन|বাংলা|భారత్|ഭാരതം|嘉里大酒店|aarp|able|adac|aero|aigo|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|doha|duck|duns|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|raid|read|reit|rent|rest|rich|rmit|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scor|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|дети|сайт|بارت|بيتك|ڀارت|تونس|شبكة|عراق|عمان|موقع|भारत|ভারত|ভাৰত|ਭਾਰਤ|ભારત|ଭାରତ|ಭಾರತ|ලංකා|グーグル|クラウド|ポイント|大众汽车|组织机构|電訊盈科|香格里拉|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bnl|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceb|ceo|cfa|cfd|com|crs|csc|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jcp|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|off|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|qvc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|srl|srt|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|бел|ком|қаз|мкд|мон|орг|рус|срб|укр|հայ|קום|عرب|قطر|كوم|مصر|कॉम|नेट|คอม|ไทย|ストア|セール|みんな|中文网|天主教|我爱你|新加坡|淡马锡|诺基亚|飞利浦|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|ελ|бг|ею|рф|გე|닷넷|닷컴|삼성|한국|コム|世界|中信|中国|中國|企业|佛山|信息|健康|八卦|公司|公益|台湾|台灣|商城|商店|商标|嘉里|在线|大拿|娱乐|家電|工行|广东|微博|慈善|手机|手表|招聘|政务|政府|新闻|时尚|書籍|机构|游戏|澳門|点看|珠宝|移动|网址|网店|网站|网络|联通|谷歌|购物|通販|集团|食品|餐厅|香港)/,F=new RegExp(\"[\"+P+\"!#$%&'*+/=?^_`{|}~-]\"),U=new RegExp(\"^\"+B.source+\"$\"),q=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.localPartCharRegex=F,t.strictTldRegex=U,t}return h(t,e),t.prototype.parseMatches=function(e){for(var t=this.tagBuilder,n=this.localPartCharRegex,r=this.strictTldRegex,o=[],a=e.length,i=new z,s={m:\"a\",a:\"i\",i:\"l\",l:\"t\",t:\"o\",o:\":\"},c=0,l=0,p=i;c<a;){var f=e.charAt(c);switch(l){case 0:h(f);break;case 1:m(e.charAt(c-1),f);break;case 2:g(f);break;case 3:y(f);break;case 4:b(f);break;case 5:_(f);break;case 6:w(f);break;case 7:x(f);break;default:u(l)}c++}return C(),o;function h(e){\"m\"===e?E(1):n.test(e)&&E()}function m(e,t){\":\"===e?n.test(t)?(l=2,p=new z(d({},p,{hasMailtoPrefix:!0}))):S():s[e]===t||(n.test(t)?l=2:\".\"===t?l=3:\"@\"===t?l=4:S())}function g(e){\".\"===e?l=3:\"@\"===e?l=4:n.test(e)||S()}function y(e){\".\"===e||\"@\"===e?S():n.test(e)?l=2:S()}function b(e){L.test(e)?l=5:S()}function _(e){\".\"===e?l=7:\"-\"===e?l=6:L.test(e)||C()}function w(e){\"-\"===e||\".\"===e?C():L.test(e)?l=5:C()}function x(e){\".\"===e||\"-\"===e?C():L.test(e)?(l=5,p=new z(d({},p,{hasDomainDot:!0}))):C()}function E(e){void 0===e&&(e=2),l=e,p=new z({idx:c})}function S(){l=0,p=i}function C(){if(p.hasDomainDot){var n=e.slice(p.idx,c);/[-.]$/.test(n)&&(n=n.slice(0,-1));var a=p.hasMailtoPrefix?n.slice(\"mailto:\".length):n;(function(e){var t=(e.split(\".\").pop()||\"\").toLowerCase();return r.test(t)})(a)&&o.push(new v({tagBuilder:t,matchedText:n,offset:p.idx,email:a}))}S()}},t}(w),z=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.hasMailtoPrefix=!!e.hasMailtoPrefix,this.hasDomainDot=!!e.hasDomainDot},V=function(){function e(){}return e.isValid=function(e,t){return!(t&&!this.isValidUriScheme(t)||this.urlMatchDoesNotHaveProtocolOrDot(e,t)||this.urlMatchDoesNotHaveAtLeastOneWordChar(e,t)&&!this.isValidIpAddress(e)||this.containsMultipleDots(e))},e.isValidIpAddress=function(e){var t=new RegExp(this.hasFullProtocolRegex.source+this.ipRegex.source);return null!==e.match(t)},e.containsMultipleDots=function(e){var t=e;return this.hasFullProtocolRegex.test(e)&&(t=e.split(\"://\")[1]),t.split(\"/\")[0].indexOf(\"..\")>-1},e.isValidUriScheme=function(e){var t=e.match(this.uriSchemeRegex),n=t&&t[0].toLowerCase();return\"javascript:\"!==n&&\"vbscript:\"!==n},e.urlMatchDoesNotHaveProtocolOrDot=function(e,t){return!(!e||t&&this.hasFullProtocolRegex.test(t)||-1!==e.indexOf(\".\"))},e.urlMatchDoesNotHaveAtLeastOneWordChar=function(e,t){return!(!e||!t)&&(!this.hasFullProtocolRegex.test(t)&&!this.hasWordCharAfterProtocolRegex.test(e))},e.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\\/\\//,e.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,e.hasWordCharAfterProtocolRegex=new RegExp(\":[^\\\\s]*?[\"+O+\"]\"),e.ipRegex=/[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?(:[0-9]*)?\\/?$/,e}(),W=(m=new RegExp(\"[/?#](?:[\"+P+\"\\\\-+&@#/%=~_()|'$*\\\\[\\\\]{}?!:,.;^✓]*[\"+P+\"\\\\-+&@#/%=~_()|'$*\\\\[\\\\]{}✓])?\"),new RegExp([\"(?:\",\"(\",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\\/\\/)(?!\\d+\\/?)(?:\\/\\/)?)/.source,D(2),\")\",\"|\",\"(\",\"(//)?\",/(?:www\\.)/.source,D(6),\")\",\"|\",\"(\",\"(//)?\",D(10)+\"\\\\.\",B.source,\"(?![-\"+I+\"])\",\")\",\")\",\"(?::[0-9]+)?\",\"(?:\"+m.source+\")?\"].join(\"\"),\"gi\")),H=new RegExp(\"[\"+P+\"]\"),$=function(e){function t(t){var n=e.call(this,t)||this;return n.stripPrefix={scheme:!0,www:!0},n.stripTrailingSlash=!0,n.decodePercentEncoding=!0,n.matcherRegex=W,n.wordCharRegExp=H,n.stripPrefix=t.stripPrefix,n.stripTrailingSlash=t.stripTrailingSlash,n.decodePercentEncoding=t.decodePercentEncoding,n}return h(t,e),t.prototype.parseMatches=function(e){for(var t,n=this.matcherRegex,r=this.stripPrefix,o=this.stripTrailingSlash,a=this.decodePercentEncoding,i=this.tagBuilder,s=[],u=function(){var n=t[0],u=t[1],l=t[4],p=t[5],f=t[9],h=t.index,d=p||f,m=e.charAt(h-1);if(!V.isValid(n,u))return\"continue\";if(h>0&&\"@\"===m)return\"continue\";if(h>0&&d&&c.wordCharRegExp.test(m))return\"continue\";if(/\\?$/.test(n)&&(n=n.substr(0,n.length-1)),c.matchHasUnbalancedClosingParen(n))n=n.substr(0,n.length-1);else{var v=c.matchHasInvalidCharAfterTld(n,u);v>-1&&(n=n.substr(0,v))}var g=[\"http://\",\"https://\"].find((function(e){return!!u&&-1!==u.indexOf(e)}));if(g){var y=n.indexOf(g);n=n.substr(y),u=u.substr(y),h+=y}var b=u?\"scheme\":l?\"www\":\"tld\",w=!!u;s.push(new _({tagBuilder:i,matchedText:n,offset:h,urlMatchType:b,url:n,protocolUrlMatch:w,protocolRelativeMatch:!!d,stripPrefix:r,stripTrailingSlash:o,decodePercentEncoding:a}))},c=this;null!==(t=n.exec(e));)u();return s},t.prototype.matchHasUnbalancedClosingParen=function(e){var t,n=e.charAt(e.length-1);if(\")\"===n)t=\"(\";else if(\"]\"===n)t=\"[\";else{if(\"}\"!==n)return!1;t=\"{\"}for(var r=0,o=0,a=e.length-1;o<a;o++){var i=e.charAt(o);i===t?r++:i===n&&(r=Math.max(r-1,0))}return 0===r},t.prototype.matchHasInvalidCharAfterTld=function(e,t){if(!e)return-1;var n=0;t&&(n=e.indexOf(\":\"),e=e.slice(n));var r=new RegExp(\"^((.?//)?[-.\"+P+\"]*[-\"+P+\"]\\\\.[-\"+P+\"]+)\").exec(e);return null===r?-1:(n+=r[1].length,e=e.slice(r[1].length),/^[^-.A-Za-z0-9:\\/?#]/.test(e)?n:-1)},t}(w),J=new RegExp(\"#[_\"+P+\"]{1,139}(?![_\"+P+\"])\",\"g\"),K=new RegExp(\"[^\"+P+\"]\"),Y=function(e){function t(t){var n=e.call(this,t)||this;return n.serviceName=\"twitter\",n.matcherRegex=J,n.nonWordCharRegex=K,n.serviceName=t.serviceName,n}return h(t,e),t.prototype.parseMatches=function(e){for(var t,n=this.matcherRegex,r=this.nonWordCharRegex,o=this.serviceName,a=this.tagBuilder,i=[];null!==(t=n.exec(e));){var s=t.index,u=e.charAt(s-1);if(0===s||r.test(u)){var c=t[0],l=t[0].slice(1);i.push(new g({tagBuilder:a,matchedText:c,offset:s,serviceName:o,hashtag:l}))}}return i},t}(w),G=/(?:(?:(?:(\\+)?\\d{1,3}[-\\040.]?)?\\(?\\d{3}\\)?[-\\040.]?\\d{3}[-\\040.]?\\d{4})|(?:(\\+)(?:9[976]\\d|8[987530]\\d|6[987]\\d|5[90]\\d|42\\d|3[875]\\d|2[98654321]\\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\\040.]?(?:\\d[-\\040.]?){6,12}\\d+))([,;]+[0-9]+#?)*/g,Z=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.matcherRegex=G,t}return h(t,e),t.prototype.parseMatches=function(e){for(var t,n=this.matcherRegex,r=this.tagBuilder,o=[];null!==(t=n.exec(e));){var a=t[0],i=a.replace(/[^0-9,;#]/g,\"\"),s=!(!t[1]&&!t[2]),u=0==t.index?\"\":e.substr(t.index-1,1),c=e.substr(t.index+a.length,1),l=!u.match(/\\d/)&&!c.match(/\\d/);this.testMatch(t[3])&&this.testMatch(a)&&l&&o.push(new b({tagBuilder:r,matchedText:a,offset:t.index,number:i,plusSign:s}))}return o},t.prototype.testMatch=function(e){return S.test(e)},t}(w),X=new RegExp(\"@[_\"+P+\"]{1,50}(?![_\"+P+\"])\",\"g\"),Q=new RegExp(\"@[_.\"+P+\"]{1,30}(?![_\"+P+\"])\",\"g\"),ee=new RegExp(\"@[-_.\"+P+\"]{1,50}(?![-_\"+P+\"])\",\"g\"),te=new RegExp(\"[^\"+P+\"]\"),ne=function(e){function t(t){var n=e.call(this,t)||this;return n.serviceName=\"twitter\",n.matcherRegexes={twitter:X,instagram:Q,soundcloud:ee},n.nonWordCharRegex=te,n.serviceName=t.serviceName,n}return h(t,e),t.prototype.parseMatches=function(e){var t,n=this.serviceName,r=this.matcherRegexes[this.serviceName],o=this.nonWordCharRegex,a=this.tagBuilder,i=[];if(!r)return i;for(;null!==(t=r.exec(e));){var s=t.index,u=e.charAt(s-1);if(0===s||o.test(u)){var c=t[0].replace(/\\.+$/g,\"\"),l=c.slice(1);i.push(new y({tagBuilder:a,matchedText:c,offset:s,serviceName:n,mention:l}))}}return i},t}(w);function re(e,t){for(var n,r=t.onOpenTag,o=t.onCloseTag,a=t.onText,i=t.onComment,s=t.onDoctype,c=new oe,l=0,p=e.length,f=0,h=0,m=c;l<p;){var v=e.charAt(l);switch(f){case 0:g(v);break;case 1:y(v);break;case 2:_(v);break;case 3:b(v);break;case 4:w(v);break;case 5:S(v);break;case 6:O(v);break;case 7:j(v);break;case 8:T(v);break;case 9:I(v);break;case 10:P(v);break;case 11:N(v);break;case 12:M(v);break;case 13:R(v);break;case 14:D(v);break;case 15:L(v);break;case 16:B(v);break;case 17:F(v);break;case 18:U(v);break;case 19:q(v);break;case 20:z(v);break;default:u(f)}l++}function g(e){\"<\"===e&&W()}function y(e){\"!\"===e?f=13:\"/\"===e?(f=2,m=new oe(d({},m,{isClosing:!0}))):\"<\"===e?W():x.test(e)?(f=3,m=new oe(d({},m,{isOpening:!0}))):(f=0,m=c)}function b(e){C.test(e)?(m=new oe(d({},m,{name:$()})),f=4):\"<\"===e?W():\"/\"===e?(m=new oe(d({},m,{name:$()})),f=12):\">\"===e?(m=new oe(d({},m,{name:$()})),H()):x.test(e)||E.test(e)||\":\"===e||V()}function _(e){\">\"===e?V():x.test(e)?f=3:V()}function w(e){C.test(e)||(\"/\"===e?f=12:\">\"===e?H():\"<\"===e?W():\"=\"===e||A.test(e)||k.test(e)?V():f=5)}function S(e){C.test(e)?f=6:\"/\"===e?f=12:\"=\"===e?f=7:\">\"===e?H():\"<\"===e?W():A.test(e)&&V()}function O(e){C.test(e)||(\"/\"===e?f=12:\"=\"===e?f=7:\">\"===e?H():\"<\"===e?W():A.test(e)?V():f=5)}function j(e){C.test(e)||('\"'===e?f=8:\"'\"===e?f=9:/[>=`]/.test(e)?V():\"<\"===e?W():f=10)}function T(e){'\"'===e&&(f=11)}function I(e){\"'\"===e&&(f=11)}function P(e){C.test(e)?f=4:\">\"===e?H():\"<\"===e&&W()}function N(e){C.test(e)?f=4:\"/\"===e?f=12:\">\"===e?H():\"<\"===e?W():(f=4,l--)}function M(e){\">\"===e?(m=new oe(d({},m,{isClosing:!0})),H()):f=4}function R(t){\"--\"===e.substr(l,2)?(l+=2,m=new oe(d({},m,{type:\"comment\"})),f=14):\"DOCTYPE\"===e.substr(l,7).toUpperCase()?(l+=7,m=new oe(d({},m,{type:\"doctype\"})),f=20):V()}function D(e){\"-\"===e?f=15:\">\"===e?V():f=16}function L(e){\"-\"===e?f=18:\">\"===e?V():f=16}function B(e){\"-\"===e&&(f=17)}function F(e){f=\"-\"===e?18:16}function U(e){\">\"===e?H():\"!\"===e?f=19:\"-\"===e||(f=16)}function q(e){\"-\"===e?f=17:\">\"===e?H():f=16}function z(e){\">\"===e?H():\"<\"===e&&W()}function V(){f=0,m=c}function W(){f=1,m=new oe({idx:l})}function H(){var t=e.slice(h,m.idx);t&&a(t,h),\"comment\"===m.type?i(m.idx):\"doctype\"===m.type?s(m.idx):(m.isOpening&&r(m.name,m.idx),m.isClosing&&o(m.name,m.idx)),V(),h=l+1}function $(){var t=m.idx+(m.isClosing?2:1);return e.slice(t,l).toLowerCase()}h<l&&(n=e.slice(h,l),a(n,h),h=l+1)}var oe=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.type=e.type||\"tag\",this.name=e.name||\"\",this.isOpening=!!e.isOpening,this.isClosing=!!e.isClosing},ae=function(){function e(t){void 0===t&&(t={}),this.version=e.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:\"end\"},this.className=\"\",this.replaceFn=null,this.context=void 0,this.sanitizeHtml=!1,this.matchers=null,this.tagBuilder=null,this.urls=this.normalizeUrlsCfg(t.urls),this.email=\"boolean\"==typeof t.email?t.email:this.email,this.phone=\"boolean\"==typeof t.phone?t.phone:this.phone,this.hashtag=t.hashtag||this.hashtag,this.mention=t.mention||this.mention,this.newWindow=\"boolean\"==typeof t.newWindow?t.newWindow:this.newWindow,this.stripPrefix=this.normalizeStripPrefixCfg(t.stripPrefix),this.stripTrailingSlash=\"boolean\"==typeof t.stripTrailingSlash?t.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding=\"boolean\"==typeof t.decodePercentEncoding?t.decodePercentEncoding:this.decodePercentEncoding,this.sanitizeHtml=t.sanitizeHtml||!1;var n=this.mention;if(!1!==n&&\"twitter\"!==n&&\"instagram\"!==n&&\"soundcloud\"!==n)throw new Error(\"invalid `mention` cfg - see docs\");var r=this.hashtag;if(!1!==r&&\"twitter\"!==r&&\"facebook\"!==r&&\"instagram\"!==r)throw new Error(\"invalid `hashtag` cfg - see docs\");this.truncate=this.normalizeTruncateCfg(t.truncate),this.className=t.className||this.className,this.replaceFn=t.replaceFn||this.replaceFn,this.context=t.context||this}return e.link=function(t,n){return new e(n).link(t)},e.parse=function(t,n){return new e(n).parse(t)},e.prototype.normalizeUrlsCfg=function(e){return null==e&&(e=!0),\"boolean\"==typeof e?{schemeMatches:e,wwwMatches:e,tldMatches:e}:{schemeMatches:\"boolean\"!=typeof e.schemeMatches||e.schemeMatches,wwwMatches:\"boolean\"!=typeof e.wwwMatches||e.wwwMatches,tldMatches:\"boolean\"!=typeof e.tldMatches||e.tldMatches}},e.prototype.normalizeStripPrefixCfg=function(e){return null==e&&(e=!0),\"boolean\"==typeof e?{scheme:e,www:e}:{scheme:\"boolean\"!=typeof e.scheme||e.scheme,www:\"boolean\"!=typeof e.www||e.www}},e.prototype.normalizeTruncateCfg=function(e){return\"number\"==typeof e?{length:e,location:\"end\"}:function(e,t){for(var n in t)t.hasOwnProperty(n)&&void 0===e[n]&&(e[n]=t[n]);return e}(e||{},{length:Number.POSITIVE_INFINITY,location:\"end\"})},e.prototype.parse=function(e){var t=this,n=[\"a\",\"style\",\"script\"],r=0,o=[];return re(e,{onOpenTag:function(e){n.indexOf(e)>=0&&r++},onText:function(e,n){if(0===r){var a=function(e,t){if(!t.global)throw new Error(\"`splitRegex` must have the 'g' flag set\");for(var n,r=[],o=0;n=t.exec(e);)r.push(e.substring(o,n.index)),r.push(n[0]),o=n.index+n[0].length;return r.push(e.substring(o)),r}(e,/(&nbsp;|&#160;|&lt;|&#60;|&gt;|&#62;|&quot;|&#34;|&#39;)/gi),i=n;a.forEach((function(e,n){if(n%2==0){var r=t.parseText(e,i);o.push.apply(o,r)}i+=e.length}))}},onCloseTag:function(e){n.indexOf(e)>=0&&(r=Math.max(r-1,0))},onComment:function(e){},onDoctype:function(e){}}),o=this.compactMatches(o),o=this.removeUnwantedMatches(o)},e.prototype.compactMatches=function(e){e.sort((function(e,t){return e.getOffset()-t.getOffset()}));for(var t=0;t<e.length-1;t++){var n=e[t],r=n.getOffset(),o=n.getMatchedText().length,a=r+o;if(t+1<e.length){if(e[t+1].getOffset()===r){var i=e[t+1].getMatchedText().length>o?t:t+1;e.splice(i,1);continue}e[t+1].getOffset()<a&&e.splice(t+1,1)}}return e},e.prototype.removeUnwantedMatches=function(e){return this.hashtag||s(e,(function(e){return\"hashtag\"===e.getType()})),this.email||s(e,(function(e){return\"email\"===e.getType()})),this.phone||s(e,(function(e){return\"phone\"===e.getType()})),this.mention||s(e,(function(e){return\"mention\"===e.getType()})),this.urls.schemeMatches||s(e,(function(e){return\"url\"===e.getType()&&\"scheme\"===e.getUrlMatchType()})),this.urls.wwwMatches||s(e,(function(e){return\"url\"===e.getType()&&\"www\"===e.getUrlMatchType()})),this.urls.tldMatches||s(e,(function(e){return\"url\"===e.getType()&&\"tld\"===e.getUrlMatchType()})),e},e.prototype.parseText=function(e,t){void 0===t&&(t=0),t=t||0;for(var n=this.getMatchers(),r=[],o=0,a=n.length;o<a;o++){for(var i=n[o].parseMatches(e),s=0,u=i.length;s<u;s++)i[s].setOffset(t+i[s].getOffset());r.push.apply(r,i)}return r},e.prototype.link=function(e){if(!e)return\"\";this.sanitizeHtml&&(e=e.replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\"));for(var t=this.parse(e),n=[],r=0,o=0,a=t.length;o<a;o++){var i=t[o];n.push(e.substring(r,i.getOffset())),n.push(this.createMatchReturnVal(i)),r=i.getOffset()+i.getMatchedText().length}return n.push(e.substring(r)),n.join(\"\")},e.prototype.createMatchReturnVal=function(e){var t;return this.replaceFn&&(t=this.replaceFn.call(this.context,e)),\"string\"==typeof t?t:!1===t?e.getMatchedText():t instanceof c?t.toAnchorString():e.buildTag().toAnchorString()},e.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var e=this.getTagBuilder(),t=[new Y({tagBuilder:e,serviceName:this.hashtag}),new q({tagBuilder:e}),new Z({tagBuilder:e}),new ne({tagBuilder:e,serviceName:this.mention}),new $({tagBuilder:e,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=t},e.prototype.getTagBuilder=function(){var e=this.tagBuilder;return e||(e=this.tagBuilder=new l({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),e},e.version=\"3.14.1\",e.AnchorTagBuilder=l,e.HtmlTag=c,e.matcher={Email:q,Hashtag:Y,Matcher:w,Mention:ne,Phone:Z,Url:$},e.match={Email:v,Hashtag:g,Match:p,Mention:y,Phone:b,Url:_},e}(),ie=/www|@|\\:\\/\\//;function se(e){return/^<\\/a\\s*>/i.test(e)}function ue(){var e=[],t=new ae({stripPrefix:!1,url:!0,email:!0,replaceFn:function(t){switch(t.getType()){case\"url\":e.push({text:t.matchedText,url:t.getUrl()});break;case\"email\":e.push({text:t.matchedText,url:\"mailto:\"+t.getEmail().replace(/^mailto:/i,\"\")})}return!1}});return{links:e,autolinker:t}}function ce(e){var t,n,r,o,a,i,s,u,c,l,p,f,h,d,m=e.tokens,v=null;for(n=0,r=m.length;n<r;n++)if(\"inline\"===m[n].type)for(p=0,t=(o=m[n].children).length-1;t>=0;t--)if(\"link_close\"!==(a=o[t]).type){if(\"htmltag\"===a.type&&(d=a.content,/^<a[>\\s]/i.test(d)&&p>0&&p--,se(a.content)&&p++),!(p>0)&&\"text\"===a.type&&ie.test(a.content)){if(v||(f=(v=ue()).links,h=v.autolinker),i=a.content,f.length=0,h.link(i),!f.length)continue;for(s=[],l=a.level,u=0;u<f.length;u++)e.inline.validateLink(f[u].url)&&((c=i.indexOf(f[u].text))&&s.push({type:\"text\",content:i.slice(0,c),level:l}),s.push({type:\"link_open\",href:f[u].url,title:\"\",level:l++}),s.push({type:\"text\",content:f[u].text,level:l}),s.push({type:\"link_close\",level:--l}),i=i.slice(c+f[u].text.length));i.length&&s.push({type:\"text\",content:i,level:l}),m[n].children=o=[].concat(o.slice(0,t),s,o.slice(t+1))}}else for(t--;o[t].level!==a.level&&\"link_open\"!==o[t].type;)t--}function le(e){e.core.ruler.push(\"linkify\",ce)}var pe=n(224),fe=n.n(pe),he=n(63),de=n.n(he);function me(e){var t=e.source,n=e.className,r=void 0===n?\"\":n,i=e.getConfigs;if(\"string\"!=typeof t)return null;var s=new a.a({html:!0,typographer:!0,breaks:!0,linkTarget:\"_blank\"}).use(le);s.core.ruler.disable([\"replacements\",\"smartquotes\"]);var u=i().useUnsafeMarkdown,c=s.render(t),l=ve(c,{useUnsafeMarkdown:u});return t&&c&&l?o.a.createElement(\"div\",{className:de()(r,\"markdown\"),dangerouslySetInnerHTML:{__html:l}}):null}fe.a.addHook&&fe.a.addHook(\"beforeSanitizeElements\",(function(e){return e.href&&e.setAttribute(\"rel\",\"noopener noreferrer\"),e})),me.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}};t.a=me;function ve(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.useUnsafeMarkdown,r=void 0!==n&&n,o=r,a=r?[]:[\"style\",\"class\"];return r&&!ve.hasWarnedAboutDeprecation&&(console.warn(\"useUnsafeMarkdown display configuration parameter is deprecated since >3.26.0 and will be removed in v4.0.0.\"),ve.hasWarnedAboutDeprecation=!0),fe.a.sanitize(e,{ADD_ATTR:[\"target\"],FORBID_TAGS:[\"style\",\"form\"],ALLOW_DATA_ATTR:o,FORBID_ATTR:a})}ve.hasWarnedAboutDeprecation=!1},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return R}));var r=n(28),o=n.n(r),a=n(6),i=n.n(a),s=n(7),u=n.n(s),c=n(10),l=n.n(c),p=n(8),f=n.n(p),h=n(9),d=n.n(h),m=n(3),v=n.n(m),g=n(2),y=n.n(g),b=n(17),_=n.n(b),w=n(4),x=n.n(w),E=n(0),S=n.n(E),C=n(1),A=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},k=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();function O(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function j(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}var T=function(e){function t(){return O(this,t),j(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),k(t,[{key:\"shouldComponentUpdate\",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=this.state||{};return!(this.updateOnProps||Object.keys(A({},e,this.props))).every((function(n){return Object(C.is)(e[n],t.props[n])}))||!(this.updateOnStates||Object.keys(A({},n,r))).every((function(e){return Object(C.is)(n[e],r[e])}))}}]),t}(S.a.Component),I=n(27),P=n.n(I),N=n(11),M=n.n(N),R=function(e){f()(r,e);var t=d()(r);function r(){var e,n;i()(this,r);for(var o=arguments.length,a=new Array(o),s=0;s<o;s++)a[s]=arguments[s];return n=t.call.apply(t,y()(e=[this]).call(e,a)),v()(l()(n),\"getModelName\",(function(e){return-1!==_()(e).call(e,\"#/definitions/\")?e.replace(/^.*#\\/definitions\\//,\"\"):-1!==_()(e).call(e,\"#/components/schemas/\")?e.replace(/^.*#\\/components\\/schemas\\//,\"\"):void 0})),v()(l()(n),\"getRefSchema\",(function(e){return n.props.specSelectors.findDefinition(e)})),n}return u()(r,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,r=e.getConfigs,a=e.specSelectors,i=e.schema,s=e.required,u=e.name,c=e.isRef,l=e.specPath,p=e.displayName,f=e.includeReadOnly,h=e.includeWriteOnly,d=t(\"ObjectModel\"),m=t(\"ArrayModel\"),v=t(\"PrimitiveModel\"),g=\"object\",y=i&&i.get(\"$$ref\");if(!u&&y&&(u=this.getModelName(y)),!i&&y&&(i=this.getRefSchema(u)),!i)return S.a.createElement(\"span\",{className:\"model model-title\"},S.a.createElement(\"span\",{className:\"model-title__text\"},p||u),S.a.createElement(\"img\",{src:n(506),height:\"20px\",width:\"20px\"}));var b=a.isOAS3()&&i.get(\"deprecated\");switch(c=void 0!==c?c:!!y,g=i&&i.get(\"type\")||g){case\"object\":return S.a.createElement(d,o()({className:\"object\"},this.props,{specPath:l,getConfigs:r,schema:i,name:u,deprecated:b,isRef:c,includeReadOnly:f,includeWriteOnly:h}));case\"array\":return S.a.createElement(m,o()({className:\"array\"},this.props,{getConfigs:r,schema:i,name:u,deprecated:b,required:s,includeReadOnly:f,includeWriteOnly:h}));case\"string\":case\"number\":case\"integer\":case\"boolean\":default:return S.a.createElement(v,o()({},this.props,{getComponent:t,getConfigs:r,schema:i,name:u,deprecated:b,required:s}))}}}]),r}(T);v()(R,\"propTypes\",{schema:x()(P.a).isRequired,getComponent:M.a.func.isRequired,getConfigs:M.a.func.isRequired,specSelectors:M.a.object.isRequired,name:M.a.string,displayName:M.a.string,isRef:M.a.bool,required:M.a.bool,expandDepth:M.a.number,depth:M.a.number,specPath:P.a.list.isRequired,includeReadOnly:M.a.bool,includeWriteOnly:M.a.bool})},function(e,t,n){\"use strict\";var r=n(1053),o=n(1063),a=n(283);e.exports={formats:a,parse:o,stringify:r}},function(e,t,n){e.exports=function(){\"use strict\";function e(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var t=Object.hasOwnProperty,n=Object.setPrototypeOf,r=Object.isFrozen,o=Object.getPrototypeOf,a=Object.getOwnPropertyDescriptor,i=Object.freeze,s=Object.seal,u=Object.create,c=\"undefined\"!=typeof Reflect&&Reflect,l=c.apply,p=c.construct;l||(l=function(e,t,n){return e.apply(t,n)}),i||(i=function(e){return e}),s||(s=function(e){return e}),p||(p=function(t,n){return new(Function.prototype.bind.apply(t,[null].concat(e(n))))});var f=x(Array.prototype.forEach),h=x(Array.prototype.pop),d=x(Array.prototype.push),m=x(String.prototype.toLowerCase),v=x(String.prototype.match),g=x(String.prototype.replace),y=x(String.prototype.indexOf),b=x(String.prototype.trim),_=x(RegExp.prototype.test),w=E(TypeError);function x(e){return function(t){for(var n=arguments.length,r=Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return l(e,t,r)}}function E(e){return function(){for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];return p(e,n)}}function S(e,t){n&&n(e,null);for(var o=t.length;o--;){var a=t[o];if(\"string\"==typeof a){var i=m(a);i!==a&&(r(t)||(t[o]=i),a=i)}e[a]=!0}return e}function C(e){var n=u(null),r=void 0;for(r in e)l(t,e,[r])&&(n[r]=e[r]);return n}function A(e,t){for(;null!==e;){var n=a(e,t);if(n){if(n.get)return x(n.get);if(\"function\"==typeof n.value)return x(n.value)}e=o(e)}function r(e){return console.warn(\"fallback value for\",e),null}return r}var k=i([\"a\",\"abbr\",\"acronym\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"bdi\",\"bdo\",\"big\",\"blink\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"center\",\"cite\",\"code\",\"col\",\"colgroup\",\"content\",\"data\",\"datalist\",\"dd\",\"decorator\",\"del\",\"details\",\"dfn\",\"dialog\",\"dir\",\"div\",\"dl\",\"dt\",\"element\",\"em\",\"fieldset\",\"figcaption\",\"figure\",\"font\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"img\",\"input\",\"ins\",\"kbd\",\"label\",\"legend\",\"li\",\"main\",\"map\",\"mark\",\"marquee\",\"menu\",\"menuitem\",\"meter\",\"nav\",\"nobr\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"picture\",\"pre\",\"progress\",\"q\",\"rp\",\"rt\",\"ruby\",\"s\",\"samp\",\"section\",\"select\",\"shadow\",\"small\",\"source\",\"spacer\",\"span\",\"strike\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"tr\",\"track\",\"tt\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"]),O=i([\"svg\",\"a\",\"altglyph\",\"altglyphdef\",\"altglyphitem\",\"animatecolor\",\"animatemotion\",\"animatetransform\",\"circle\",\"clippath\",\"defs\",\"desc\",\"ellipse\",\"filter\",\"font\",\"g\",\"glyph\",\"glyphref\",\"hkern\",\"image\",\"line\",\"lineargradient\",\"marker\",\"mask\",\"metadata\",\"mpath\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialgradient\",\"rect\",\"stop\",\"style\",\"switch\",\"symbol\",\"text\",\"textpath\",\"title\",\"tref\",\"tspan\",\"view\",\"vkern\"]),j=i([\"feBlend\",\"feColorMatrix\",\"feComponentTransfer\",\"feComposite\",\"feConvolveMatrix\",\"feDiffuseLighting\",\"feDisplacementMap\",\"feDistantLight\",\"feFlood\",\"feFuncA\",\"feFuncB\",\"feFuncG\",\"feFuncR\",\"feGaussianBlur\",\"feMerge\",\"feMergeNode\",\"feMorphology\",\"feOffset\",\"fePointLight\",\"feSpecularLighting\",\"feSpotLight\",\"feTile\",\"feTurbulence\"]),T=i([\"animate\",\"color-profile\",\"cursor\",\"discard\",\"fedropshadow\",\"feimage\",\"font-face\",\"font-face-format\",\"font-face-name\",\"font-face-src\",\"font-face-uri\",\"foreignobject\",\"hatch\",\"hatchpath\",\"mesh\",\"meshgradient\",\"meshpatch\",\"meshrow\",\"missing-glyph\",\"script\",\"set\",\"solidcolor\",\"unknown\",\"use\"]),I=i([\"math\",\"menclose\",\"merror\",\"mfenced\",\"mfrac\",\"mglyph\",\"mi\",\"mlabeledtr\",\"mmultiscripts\",\"mn\",\"mo\",\"mover\",\"mpadded\",\"mphantom\",\"mroot\",\"mrow\",\"ms\",\"mspace\",\"msqrt\",\"mstyle\",\"msub\",\"msup\",\"msubsup\",\"mtable\",\"mtd\",\"mtext\",\"mtr\",\"munder\",\"munderover\"]),P=i([\"maction\",\"maligngroup\",\"malignmark\",\"mlongdiv\",\"mscarries\",\"mscarry\",\"msgroup\",\"mstack\",\"msline\",\"msrow\",\"semantics\",\"annotation\",\"annotation-xml\",\"mprescripts\",\"none\"]),N=i([\"#text\"]),M=i([\"accept\",\"action\",\"align\",\"alt\",\"autocapitalize\",\"autocomplete\",\"autopictureinpicture\",\"autoplay\",\"background\",\"bgcolor\",\"border\",\"capture\",\"cellpadding\",\"cellspacing\",\"checked\",\"cite\",\"class\",\"clear\",\"color\",\"cols\",\"colspan\",\"controls\",\"controlslist\",\"coords\",\"crossorigin\",\"datetime\",\"decoding\",\"default\",\"dir\",\"disabled\",\"disablepictureinpicture\",\"disableremoteplayback\",\"download\",\"draggable\",\"enctype\",\"enterkeyhint\",\"face\",\"for\",\"headers\",\"height\",\"hidden\",\"high\",\"href\",\"hreflang\",\"id\",\"inputmode\",\"integrity\",\"ismap\",\"kind\",\"label\",\"lang\",\"list\",\"loading\",\"loop\",\"low\",\"max\",\"maxlength\",\"media\",\"method\",\"min\",\"minlength\",\"multiple\",\"muted\",\"name\",\"noshade\",\"novalidate\",\"nowrap\",\"open\",\"optimum\",\"pattern\",\"placeholder\",\"playsinline\",\"poster\",\"preload\",\"pubdate\",\"radiogroup\",\"readonly\",\"rel\",\"required\",\"rev\",\"reversed\",\"role\",\"rows\",\"rowspan\",\"spellcheck\",\"scope\",\"selected\",\"shape\",\"size\",\"sizes\",\"span\",\"srclang\",\"start\",\"src\",\"srcset\",\"step\",\"style\",\"summary\",\"tabindex\",\"title\",\"translate\",\"type\",\"usemap\",\"valign\",\"value\",\"width\",\"xmlns\",\"slot\"]),R=i([\"accent-height\",\"accumulate\",\"additive\",\"alignment-baseline\",\"ascent\",\"attributename\",\"attributetype\",\"azimuth\",\"basefrequency\",\"baseline-shift\",\"begin\",\"bias\",\"by\",\"class\",\"clip\",\"clippathunits\",\"clip-path\",\"clip-rule\",\"color\",\"color-interpolation\",\"color-interpolation-filters\",\"color-profile\",\"color-rendering\",\"cx\",\"cy\",\"d\",\"dx\",\"dy\",\"diffuseconstant\",\"direction\",\"display\",\"divisor\",\"dur\",\"edgemode\",\"elevation\",\"end\",\"fill\",\"fill-opacity\",\"fill-rule\",\"filter\",\"filterunits\",\"flood-color\",\"flood-opacity\",\"font-family\",\"font-size\",\"font-size-adjust\",\"font-stretch\",\"font-style\",\"font-variant\",\"font-weight\",\"fx\",\"fy\",\"g1\",\"g2\",\"glyph-name\",\"glyphref\",\"gradientunits\",\"gradienttransform\",\"height\",\"href\",\"id\",\"image-rendering\",\"in\",\"in2\",\"k\",\"k1\",\"k2\",\"k3\",\"k4\",\"kerning\",\"keypoints\",\"keysplines\",\"keytimes\",\"lang\",\"lengthadjust\",\"letter-spacing\",\"kernelmatrix\",\"kernelunitlength\",\"lighting-color\",\"local\",\"marker-end\",\"marker-mid\",\"marker-start\",\"markerheight\",\"markerunits\",\"markerwidth\",\"maskcontentunits\",\"maskunits\",\"max\",\"mask\",\"media\",\"method\",\"mode\",\"min\",\"name\",\"numoctaves\",\"offset\",\"operator\",\"opacity\",\"order\",\"orient\",\"orientation\",\"origin\",\"overflow\",\"paint-order\",\"path\",\"pathlength\",\"patterncontentunits\",\"patterntransform\",\"patternunits\",\"points\",\"preservealpha\",\"preserveaspectratio\",\"primitiveunits\",\"r\",\"rx\",\"ry\",\"radius\",\"refx\",\"refy\",\"repeatcount\",\"repeatdur\",\"restart\",\"result\",\"rotate\",\"scale\",\"seed\",\"shape-rendering\",\"specularconstant\",\"specularexponent\",\"spreadmethod\",\"startoffset\",\"stddeviation\",\"stitchtiles\",\"stop-color\",\"stop-opacity\",\"stroke-dasharray\",\"stroke-dashoffset\",\"stroke-linecap\",\"stroke-linejoin\",\"stroke-miterlimit\",\"stroke-opacity\",\"stroke\",\"stroke-width\",\"style\",\"surfacescale\",\"systemlanguage\",\"tabindex\",\"targetx\",\"targety\",\"transform\",\"text-anchor\",\"text-decoration\",\"text-rendering\",\"textlength\",\"type\",\"u1\",\"u2\",\"unicode\",\"values\",\"viewbox\",\"visibility\",\"version\",\"vert-adv-y\",\"vert-origin-x\",\"vert-origin-y\",\"width\",\"word-spacing\",\"wrap\",\"writing-mode\",\"xchannelselector\",\"ychannelselector\",\"x\",\"x1\",\"x2\",\"xmlns\",\"y\",\"y1\",\"y2\",\"z\",\"zoomandpan\"]),D=i([\"accent\",\"accentunder\",\"align\",\"bevelled\",\"close\",\"columnsalign\",\"columnlines\",\"columnspan\",\"denomalign\",\"depth\",\"dir\",\"display\",\"displaystyle\",\"encoding\",\"fence\",\"frame\",\"height\",\"href\",\"id\",\"largeop\",\"length\",\"linethickness\",\"lspace\",\"lquote\",\"mathbackground\",\"mathcolor\",\"mathsize\",\"mathvariant\",\"maxsize\",\"minsize\",\"movablelimits\",\"notation\",\"numalign\",\"open\",\"rowalign\",\"rowlines\",\"rowspacing\",\"rowspan\",\"rspace\",\"rquote\",\"scriptlevel\",\"scriptminsize\",\"scriptsizemultiplier\",\"selection\",\"separator\",\"separators\",\"stretchy\",\"subscriptshift\",\"supscriptshift\",\"symmetric\",\"voffset\",\"width\",\"xmlns\"]),L=i([\"xlink:href\",\"xml:id\",\"xlink:title\",\"xml:space\",\"xmlns:xlink\"]),B=s(/\\{\\{[\\s\\S]*|[\\s\\S]*\\}\\}/gm),F=s(/<%[\\s\\S]*|[\\s\\S]*%>/gm),U=s(/^data-[\\-\\w.\\u00B7-\\uFFFF]/),q=s(/^aria-[\\-\\w]+$/),z=s(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i),V=s(/^(?:\\w+script|data):/i),W=s(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g),H=\"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};function $(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var J=function(){return\"undefined\"==typeof window?null:window},K=function(e,t){if(\"object\"!==(void 0===e?\"undefined\":H(e))||\"function\"!=typeof e.createPolicy)return null;var n=null,r=\"data-tt-policy-suffix\";t.currentScript&&t.currentScript.hasAttribute(r)&&(n=t.currentScript.getAttribute(r));var o=\"dompurify\"+(n?\"#\"+n:\"\");try{return e.createPolicy(o,{createHTML:function(e){return e}})}catch(e){return console.warn(\"TrustedTypes policy \"+o+\" could not be created.\"),null}};function Y(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:J(),t=function(e){return Y(e)};if(t.version=\"2.2.9\",t.removed=[],!e||!e.document||9!==e.document.nodeType)return t.isSupported=!1,t;var n=e.document,r=e.document,o=e.DocumentFragment,a=e.HTMLTemplateElement,s=e.Node,u=e.Element,c=e.NodeFilter,l=e.NamedNodeMap,p=void 0===l?e.NamedNodeMap||e.MozNamedAttrMap:l,x=e.Text,E=e.Comment,G=e.DOMParser,Z=e.trustedTypes,X=u.prototype,Q=A(X,\"cloneNode\"),ee=A(X,\"nextSibling\"),te=A(X,\"childNodes\"),ne=A(X,\"parentNode\");if(\"function\"==typeof a){var re=r.createElement(\"template\");re.content&&re.content.ownerDocument&&(r=re.content.ownerDocument)}var oe=K(Z,n),ae=oe&&De?oe.createHTML(\"\"):\"\",ie=r,se=ie.implementation,ue=ie.createNodeIterator,ce=ie.createDocumentFragment,le=n.importNode,pe={};try{pe=C(r).documentMode?r.documentMode:{}}catch(e){}var fe={};t.isSupported=\"function\"==typeof ne&&se&&void 0!==se.createHTMLDocument&&9!==pe;var he=B,de=F,me=U,ve=q,ge=V,ye=W,be=z,_e=null,we=S({},[].concat($(k),$(O),$(j),$(I),$(N))),xe=null,Ee=S({},[].concat($(M),$(R),$(D),$(L))),Se=null,Ce=null,Ae=!0,ke=!0,Oe=!1,je=!1,Te=!1,Ie=!1,Pe=!1,Ne=!1,Me=!1,Re=!0,De=!1,Le=!0,Be=!0,Fe=!1,Ue={},qe=S({},[\"annotation-xml\",\"audio\",\"colgroup\",\"desc\",\"foreignobject\",\"head\",\"iframe\",\"math\",\"mi\",\"mn\",\"mo\",\"ms\",\"mtext\",\"noembed\",\"noframes\",\"noscript\",\"plaintext\",\"script\",\"style\",\"svg\",\"template\",\"thead\",\"title\",\"video\",\"xmp\"]),ze=null,Ve=S({},[\"audio\",\"video\",\"img\",\"source\",\"image\",\"track\"]),We=null,He=S({},[\"alt\",\"class\",\"for\",\"id\",\"label\",\"name\",\"pattern\",\"placeholder\",\"summary\",\"title\",\"value\",\"style\",\"xmlns\"]),$e=\"http://www.w3.org/1998/Math/MathML\",Je=\"http://www.w3.org/2000/svg\",Ke=\"http://www.w3.org/1999/xhtml\",Ye=Ke,Ge=!1,Ze=null,Xe=r.createElement(\"form\"),Qe=function(e){Ze&&Ze===e||(e&&\"object\"===(void 0===e?\"undefined\":H(e))||(e={}),e=C(e),_e=\"ALLOWED_TAGS\"in e?S({},e.ALLOWED_TAGS):we,xe=\"ALLOWED_ATTR\"in e?S({},e.ALLOWED_ATTR):Ee,We=\"ADD_URI_SAFE_ATTR\"in e?S(C(He),e.ADD_URI_SAFE_ATTR):He,ze=\"ADD_DATA_URI_TAGS\"in e?S(C(Ve),e.ADD_DATA_URI_TAGS):Ve,Se=\"FORBID_TAGS\"in e?S({},e.FORBID_TAGS):{},Ce=\"FORBID_ATTR\"in e?S({},e.FORBID_ATTR):{},Ue=\"USE_PROFILES\"in e&&e.USE_PROFILES,Ae=!1!==e.ALLOW_ARIA_ATTR,ke=!1!==e.ALLOW_DATA_ATTR,Oe=e.ALLOW_UNKNOWN_PROTOCOLS||!1,je=e.SAFE_FOR_TEMPLATES||!1,Te=e.WHOLE_DOCUMENT||!1,Ne=e.RETURN_DOM||!1,Me=e.RETURN_DOM_FRAGMENT||!1,Re=!1!==e.RETURN_DOM_IMPORT,De=e.RETURN_TRUSTED_TYPE||!1,Pe=e.FORCE_BODY||!1,Le=!1!==e.SANITIZE_DOM,Be=!1!==e.KEEP_CONTENT,Fe=e.IN_PLACE||!1,be=e.ALLOWED_URI_REGEXP||be,Ye=e.NAMESPACE||Ke,je&&(ke=!1),Me&&(Ne=!0),Ue&&(_e=S({},[].concat($(N))),xe=[],!0===Ue.html&&(S(_e,k),S(xe,M)),!0===Ue.svg&&(S(_e,O),S(xe,R),S(xe,L)),!0===Ue.svgFilters&&(S(_e,j),S(xe,R),S(xe,L)),!0===Ue.mathMl&&(S(_e,I),S(xe,D),S(xe,L))),e.ADD_TAGS&&(_e===we&&(_e=C(_e)),S(_e,e.ADD_TAGS)),e.ADD_ATTR&&(xe===Ee&&(xe=C(xe)),S(xe,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&S(We,e.ADD_URI_SAFE_ATTR),Be&&(_e[\"#text\"]=!0),Te&&S(_e,[\"html\",\"head\",\"body\"]),_e.table&&(S(_e,[\"tbody\"]),delete Se.tbody),i&&i(e),Ze=e)},et=S({},[\"mi\",\"mo\",\"mn\",\"ms\",\"mtext\"]),tt=S({},[\"foreignobject\",\"desc\",\"title\",\"annotation-xml\"]),nt=S({},O);S(nt,j),S(nt,T);var rt=S({},I);S(rt,P);var ot=function(e){var t=ne(e);t&&t.tagName||(t={namespaceURI:Ke,tagName:\"template\"});var n=m(e.tagName),r=m(t.tagName);if(e.namespaceURI===Je)return t.namespaceURI===Ke?\"svg\"===n:t.namespaceURI===$e?\"svg\"===n&&(\"annotation-xml\"===r||et[r]):Boolean(nt[n]);if(e.namespaceURI===$e)return t.namespaceURI===Ke?\"math\"===n:t.namespaceURI===Je?\"math\"===n&&tt[r]:Boolean(rt[n]);if(e.namespaceURI===Ke){if(t.namespaceURI===Je&&!tt[r])return!1;if(t.namespaceURI===$e&&!et[r])return!1;var o=S({},[\"title\",\"style\",\"font\",\"a\",\"script\"]);return!rt[n]&&(o[n]||!nt[n])}return!1},at=function(e){d(t.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=ae}catch(t){e.remove()}}},it=function(e,n){try{d(t.removed,{attribute:n.getAttributeNode(e),from:n})}catch(e){d(t.removed,{attribute:null,from:n})}if(n.removeAttribute(e),\"is\"===e&&!xe[e])if(Ne||Me)try{at(n)}catch(e){}else try{n.setAttribute(e,\"\")}catch(e){}},st=function(e){var t=void 0,n=void 0;if(Pe)e=\"<remove></remove>\"+e;else{var o=v(e,/^[\\r\\n\\t ]+/);n=o&&o[0]}var a=oe?oe.createHTML(e):e;if(Ye===Ke)try{t=(new G).parseFromString(a,\"text/html\")}catch(e){}if(!t||!t.documentElement){t=se.createDocument(Ye,\"template\",null);try{t.documentElement.innerHTML=Ge?\"\":a}catch(e){}}var i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Te?t.documentElement:i},ut=function(e){return ue.call(e.ownerDocument||e,e,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT,null,!1)},ct=function(e){return!(e instanceof x||e instanceof E||\"string\"==typeof e.nodeName&&\"string\"==typeof e.textContent&&\"function\"==typeof e.removeChild&&e.attributes instanceof p&&\"function\"==typeof e.removeAttribute&&\"function\"==typeof e.setAttribute&&\"string\"==typeof e.namespaceURI&&\"function\"==typeof e.insertBefore)},lt=function(e){return\"object\"===(void 0===s?\"undefined\":H(s))?e instanceof s:e&&\"object\"===(void 0===e?\"undefined\":H(e))&&\"number\"==typeof e.nodeType&&\"string\"==typeof e.nodeName},pt=function(e,n,r){fe[e]&&f(fe[e],(function(e){e.call(t,n,r,Ze)}))},ft=function(e){var n=void 0;if(pt(\"beforeSanitizeElements\",e,null),ct(e))return at(e),!0;if(v(e.nodeName,/[\\u0080-\\uFFFF]/))return at(e),!0;var r=m(e.nodeName);if(pt(\"uponSanitizeElement\",e,{tagName:r,allowedTags:_e}),!lt(e.firstElementChild)&&(!lt(e.content)||!lt(e.content.firstElementChild))&&_(/<[/\\w]/g,e.innerHTML)&&_(/<[/\\w]/g,e.textContent))return at(e),!0;if(!_e[r]||Se[r]){if(Be&&!qe[r]){var o=ne(e)||e.parentNode,a=te(e)||e.childNodes;if(a&&o)for(var i=a.length-1;i>=0;--i)o.insertBefore(Q(a[i],!0),ee(e))}return at(e),!0}return e instanceof u&&!ot(e)?(at(e),!0):\"noscript\"!==r&&\"noembed\"!==r||!_(/<\\/no(script|embed)/i,e.innerHTML)?(je&&3===e.nodeType&&(n=e.textContent,n=g(n,he,\" \"),n=g(n,de,\" \"),e.textContent!==n&&(d(t.removed,{element:e.cloneNode()}),e.textContent=n)),pt(\"afterSanitizeElements\",e,null),!1):(at(e),!0)},ht=function(e,t,n){if(Le&&(\"id\"===t||\"name\"===t)&&(n in r||n in Xe))return!1;if(ke&&_(me,t));else if(Ae&&_(ve,t));else{if(!xe[t]||Ce[t])return!1;if(We[t]);else if(_(be,g(n,ye,\"\")));else if(\"src\"!==t&&\"xlink:href\"!==t&&\"href\"!==t||\"script\"===e||0!==y(n,\"data:\")||!ze[e])if(Oe&&!_(ge,g(n,ye,\"\")));else if(n)return!1}return!0},dt=function(e){var n=void 0,r=void 0,o=void 0,a=void 0;pt(\"beforeSanitizeAttributes\",e,null);var i=e.attributes;if(i){var s={attrName:\"\",attrValue:\"\",keepAttr:!0,allowedAttributes:xe};for(a=i.length;a--;){var u=n=i[a],c=u.name,l=u.namespaceURI;if(r=b(n.value),o=m(c),s.attrName=o,s.attrValue=r,s.keepAttr=!0,s.forceKeepAttr=void 0,pt(\"uponSanitizeAttribute\",e,s),r=s.attrValue,!s.forceKeepAttr&&(it(c,e),s.keepAttr))if(_(/\\/>/i,r))it(c,e);else{je&&(r=g(r,he,\" \"),r=g(r,de,\" \"));var p=e.nodeName.toLowerCase();if(ht(p,o,r))try{l?e.setAttributeNS(l,c,r):e.setAttribute(c,r),h(t.removed)}catch(e){}}}pt(\"afterSanitizeAttributes\",e,null)}},mt=function e(t){var n=void 0,r=ut(t);for(pt(\"beforeSanitizeShadowDOM\",t,null);n=r.nextNode();)pt(\"uponSanitizeShadowNode\",n,null),ft(n)||(n.content instanceof o&&e(n.content),dt(n));pt(\"afterSanitizeShadowDOM\",t,null)};return t.sanitize=function(r,a){var i=void 0,u=void 0,c=void 0,l=void 0,p=void 0;if((Ge=!r)&&(r=\"\\x3c!--\\x3e\"),\"string\"!=typeof r&&!lt(r)){if(\"function\"!=typeof r.toString)throw w(\"toString is not a function\");if(\"string\"!=typeof(r=r.toString()))throw w(\"dirty is not a string, aborting\")}if(!t.isSupported){if(\"object\"===H(e.toStaticHTML)||\"function\"==typeof e.toStaticHTML){if(\"string\"==typeof r)return e.toStaticHTML(r);if(lt(r))return e.toStaticHTML(r.outerHTML)}return r}if(Ie||Qe(a),t.removed=[],\"string\"==typeof r&&(Fe=!1),Fe);else if(r instanceof s)1===(u=(i=st(\"\\x3c!----\\x3e\")).ownerDocument.importNode(r,!0)).nodeType&&\"BODY\"===u.nodeName||\"HTML\"===u.nodeName?i=u:i.appendChild(u);else{if(!Ne&&!je&&!Te&&-1===r.indexOf(\"<\"))return oe&&De?oe.createHTML(r):r;if(!(i=st(r)))return Ne?null:ae}i&&Pe&&at(i.firstChild);for(var f=ut(Fe?r:i);c=f.nextNode();)3===c.nodeType&&c===l||ft(c)||(c.content instanceof o&&mt(c.content),dt(c),l=c);if(l=null,Fe)return r;if(Ne){if(Me)for(p=ce.call(i.ownerDocument);i.firstChild;)p.appendChild(i.firstChild);else p=i;return Re&&(p=le.call(n,p,!0)),p}var h=Te?i.outerHTML:i.innerHTML;return je&&(h=g(h,he,\" \"),h=g(h,de,\" \")),oe&&De?oe.createHTML(h):h},t.setConfig=function(e){Qe(e),Ie=!0},t.clearConfig=function(){Ze=null,Ie=!1},t.isValidAttribute=function(e,t,n){Ze||Qe({});var r=m(e),o=m(t);return ht(r,o,n)},t.addHook=function(e,t){\"function\"==typeof t&&(fe[e]=fe[e]||[],d(fe[e],t))},t.removeHook=function(e){fe[e]&&h(fe[e])},t.removeHooks=function(e){fe[e]&&(fe[e]=[])},t.removeAllHooks=function(){fe={}},t}return Y()}()},function(e,t,n){var r=n(40),o=n(47),a=r.document,i=o(a)&&o(a.createElement);e.exports=function(e){return i?a.createElement(e):{}}},function(e,t,n){var r=n(47),o=n(152),a=n(41)(\"species\");e.exports=function(e,t){var n;return o(e)&&(\"function\"!=typeof(n=e.constructor)||n!==Array&&!o(n.prototype)?r(n)&&null===(n=n[a])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},function(e,t,n){var r=n(97),o=n(228);(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})(\"versions\",[]).push({version:\"3.15.1\",mode:r?\"pure\":\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"})},function(e,t,n){var r=n(40),o=n(546),a=\"__core-js_shared__\",i=r[a]||o(a,{});e.exports=i},function(e,t,n){var r=n(129),o=n(37);e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(e,t,n){var r=n(48),o=n(68),a=n(52),i=n(155);e.exports=r?Object.defineProperties:function(e,t){a(e);for(var n,r=i(t),s=r.length,u=0;s>u;)o.f(e,n=r[u++],t[n]);return e}},function(e,t,n){var r=n(66),o=n(69),a=n(232),i=function(e){return function(t,n,i){var s,u=r(t),c=o(u.length),l=a(i,c);if(e&&n!=n){for(;c>l;)if((s=u[l++])!=s)return!0}else for(;c>l;l++)if((e||l in u)&&u[l]===n)return e||l||0;return!e&&-1}};e.exports={includes:i(!0),indexOf:i(!1)}},function(e,t,n){var r=n(128),o=Math.max,a=Math.min;e.exports=function(e,t){var n=r(e);return n<0?o(n+t,0):a(n,t)}},function(e,t){e.exports=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"]},function(e,t,n){var r=n(365),o=n(233).concat(\"length\",\"prototype\");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var r=n(41);t.f=r},function(e,t,n){var r={};r[n(41)(\"toStringTag\")]=\"z\",e.exports=\"[object z]\"===String(r)},function(e,t,n){\"use strict\";var r=n(21),o=n(371),a=n(182),i=n(183),s=n(98),u=n(67),c=n(110),l=n(41),p=n(97),f=n(131),h=n(372),d=h.IteratorPrototype,m=h.BUGGY_SAFARI_ITERATORS,v=l(\"iterator\"),g=\"keys\",y=\"values\",b=\"entries\",_=function(){return this};e.exports=function(e,t,n,l,h,w,x){o(n,t,l);var E,S,C,A=function(e){if(e===h&&I)return I;if(!m&&e in j)return j[e];switch(e){case g:case y:case b:return function(){return new n(this,e)}}return function(){return new n(this)}},k=t+\" Iterator\",O=!1,j=e.prototype,T=j[v]||j[\"@@iterator\"]||h&&j[h],I=!m&&T||A(h),P=\"Array\"==t&&j.entries||T;if(P&&(E=a(P.call(new e)),d!==Object.prototype&&E.next&&(p||a(E)===d||(i?i(E,d):\"function\"!=typeof E[v]&&u(E,v,_)),s(E,k,!0,!0),p&&(f[k]=_))),h==y&&T&&T.name!==y&&(O=!0,I=function(){return T.call(this)}),p&&!x||j[v]===I||u(j,v,I),f[t]=I,h)if(S={values:A(y),keys:w?I:A(g),entries:A(b)},x)for(C in S)(m||O||!(C in j))&&c(j,C,S[C]);else r({target:t,proto:!0,forced:m||O},S);return S}},function(e,t){e.exports=function(){}},function(e,t,n){e.exports=n(590)},function(e,t,n){\"use strict\";e.exports={}},function(e,t,n){e.exports=n(633)},function(e,t,n){e.exports=n(634)},function(e,t,n){var r=n(701),o=n(717),a=n(719),i=n(720),s=n(721);function u(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}u.prototype.clear=r,u.prototype.delete=o,u.prototype.get=a,u.prototype.has=i,u.prototype.set=s,e.exports=u},function(e,t,n){var r=n(113)(n(71),\"Map\");e.exports=r},function(e,t,n){var r=n(188),o=n(725),a=n(726),i=n(727),s=n(728),u=n(729);function c(e){var t=this.__data__=new r(e);this.size=t.size}c.prototype.clear=o,c.prototype.delete=a,c.prototype.get=i,c.prototype.has=s,c.prototype.set=u,e.exports=c},function(e,t){e.exports=function(e,t){for(var n=-1,r=t.length,o=e.length;++n<r;)e[o+n]=t[n];return e}},function(e,t,n){var r=n(739),o=n(419),a=Object.prototype.propertyIsEnumerable,i=Object.getOwnPropertySymbols,s=i?function(e){return null==e?[]:(e=Object(e),r(i(e),(function(t){return a.call(e,t)})))}:o;e.exports=s},function(e,t,n){var r=n(743),o=n(251),a=n(252),i=a&&a.isTypedArray,s=i?o(i):r;e.exports=s},function(e,t){e.exports=function(e){return\"number\"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,n){(function(e){var r=n(407),o=t&&!t.nodeType&&t,a=o&&\"object\"==typeof e&&e&&!e.nodeType&&e,i=a&&a.exports===o&&r.process,s=function(){try{var e=a&&a.require&&a.require(\"util\").types;return e||i&&i.binding&&i.binding(\"util\")}catch(e){}}();e.exports=s}).call(this,n(194)(e))},function(e,t,n){var r=n(50),o=n(186),a=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,i=/^\\w*$/;e.exports=function(e,t){if(r(e))return!1;var n=typeof e;return!(\"number\"!=n&&\"symbol\"!=n&&\"boolean\"!=n&&null!=e&&!o(e))||(i.test(e)||!a.test(e)||null!=t&&e in Object(t))}},function(e,t){e.exports=function(e){return e}},function(e,t,n){\"use strict\";var r,o=\"object\"==typeof Reflect?Reflect:null,a=o&&\"function\"==typeof o.apply?o.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};r=o&&\"function\"==typeof o.ownKeys?o.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var i=Number.isNaN||function(e){return e!=e};function s(){s.init.call(this)}e.exports=s,e.exports.once=function(e,t){return new Promise((function(n,r){function o(){void 0!==a&&e.removeListener(\"error\",a),n([].slice.call(arguments))}var a;\"error\"!==t&&(a=function(n){e.removeListener(t,o),r(n)},e.once(\"error\",a)),e.once(t,o)}))},s.EventEmitter=s,s.prototype._events=void 0,s.prototype._eventsCount=0,s.prototype._maxListeners=void 0;var u=10;function c(e){if(\"function\"!=typeof e)throw new TypeError('The \"listener\" argument must be of type Function. Received type '+typeof e)}function l(e){return void 0===e._maxListeners?s.defaultMaxListeners:e._maxListeners}function p(e,t,n,r){var o,a,i,s;if(c(n),void 0===(a=e._events)?(a=e._events=Object.create(null),e._eventsCount=0):(void 0!==a.newListener&&(e.emit(\"newListener\",t,n.listener?n.listener:n),a=e._events),i=a[t]),void 0===i)i=a[t]=n,++e._eventsCount;else if(\"function\"==typeof i?i=a[t]=r?[n,i]:[i,n]:r?i.unshift(n):i.push(n),(o=l(e))>0&&i.length>o&&!i.warned){i.warned=!0;var u=new Error(\"Possible EventEmitter memory leak detected. \"+i.length+\" \"+String(t)+\" listeners added. Use emitter.setMaxListeners() to increase limit\");u.name=\"MaxListenersExceededWarning\",u.emitter=e,u.type=t,u.count=i.length,s=u,console&&console.warn&&console.warn(s)}return e}function f(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function h(e,t,n){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},o=f.bind(r);return o.listener=n,r.wrapFn=o,o}function d(e,t,n){var r=e._events;if(void 0===r)return[];var o=r[t];return void 0===o?[]:\"function\"==typeof o?n?[o.listener||o]:[o]:n?function(e){for(var t=new Array(e.length),n=0;n<t.length;++n)t[n]=e[n].listener||e[n];return t}(o):v(o,o.length)}function m(e){var t=this._events;if(void 0!==t){var n=t[e];if(\"function\"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function v(e,t){for(var n=new Array(t),r=0;r<t;++r)n[r]=e[r];return n}Object.defineProperty(s,\"defaultMaxListeners\",{enumerable:!0,get:function(){return u},set:function(e){if(\"number\"!=typeof e||e<0||i(e))throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received '+e+\".\");u=e}}),s.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},s.prototype.setMaxListeners=function(e){if(\"number\"!=typeof e||e<0||i(e))throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received '+e+\".\");return this._maxListeners=e,this},s.prototype.getMaxListeners=function(){return l(this)},s.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var r=\"error\"===e,o=this._events;if(void 0!==o)r=r&&void 0===o.error;else if(!r)return!1;if(r){var i;if(t.length>0&&(i=t[0]),i instanceof Error)throw i;var s=new Error(\"Unhandled error.\"+(i?\" (\"+i.message+\")\":\"\"));throw s.context=i,s}var u=o[e];if(void 0===u)return!1;if(\"function\"==typeof u)a(u,this,t);else{var c=u.length,l=v(u,c);for(n=0;n<c;++n)a(l[n],this,t)}return!0},s.prototype.addListener=function(e,t){return p(this,e,t,!1)},s.prototype.on=s.prototype.addListener,s.prototype.prependListener=function(e,t){return p(this,e,t,!0)},s.prototype.once=function(e,t){return c(t),this.on(e,h(this,e,t)),this},s.prototype.prependOnceListener=function(e,t){return c(t),this.prependListener(e,h(this,e,t)),this},s.prototype.removeListener=function(e,t){var n,r,o,a,i;if(c(t),void 0===(r=this._events))return this;if(void 0===(n=r[e]))return this;if(n===t||n.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit(\"removeListener\",e,n.listener||t));else if(\"function\"!=typeof n){for(o=-1,a=n.length-1;a>=0;a--)if(n[a]===t||n[a].listener===t){i=n[a].listener,o=a;break}if(o<0)return this;0===o?n.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(n,o),1===n.length&&(r[e]=n[0]),void 0!==r.removeListener&&this.emit(\"removeListener\",e,i||t)}return this},s.prototype.off=s.prototype.removeListener,s.prototype.removeAllListeners=function(e){var t,n,r;if(void 0===(n=this._events))return this;if(void 0===n.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==n[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete n[e]),this;if(0===arguments.length){var o,a=Object.keys(n);for(r=0;r<a.length;++r)\"removeListener\"!==(o=a[r])&&this.removeAllListeners(o);return this.removeAllListeners(\"removeListener\"),this._events=Object.create(null),this._eventsCount=0,this}if(\"function\"==typeof(t=n[e]))this.removeListener(e,t);else if(void 0!==t)for(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this},s.prototype.listeners=function(e){return d(this,e,!0)},s.prototype.rawListeners=function(e){return d(this,e,!1)},s.listenerCount=function(e,t){return\"function\"==typeof e.listenerCount?e.listenerCount(t):m.call(e,t)},s.prototype.listenerCount=m,s.prototype.eventNames=function(){return this._eventsCount>0?r(this._events):[]}},function(e,t,n){(t=e.exports=n(430)).Stream=t,t.Readable=t,t.Writable=n(257),t.Duplex=n(116),t.Transform=n(435),t.PassThrough=n(775)},function(e,t,n){\"use strict\";(function(t,r,o){var a=n(197);function i(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,n){var r=e.entry;e.entry=null;for(;r;){var o=r.callback;t.pendingcb--,o(n),r=r.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}(t,e)}}e.exports=y;var s,u=!t.browser&&[\"v0.10\",\"v0.9.\"].indexOf(t.version.slice(0,5))>-1?r:a.nextTick;y.WritableState=g;var c=n(162);c.inherits=n(61);var l={deprecate:n(774)},p=n(431),f=n(62).Buffer,h=o.Uint8Array||function(){};var d,m=n(432);function v(){}function g(e,t){s=s||n(116),e=e||{};var r=t instanceof s;this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var o=e.highWaterMark,c=e.writableHighWaterMark,l=this.objectMode?16:16384;this.highWaterMark=o||0===o?o:r&&(c||0===c)?c:l,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var p=!1===e.decodeStrings;this.decodeStrings=!p,this.defaultEncoding=e.defaultEncoding||\"utf8\",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var n=e._writableState,r=n.sync,o=n.writecb;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(n),t)!function(e,t,n,r,o){--t.pendingcb,n?(a.nextTick(o,r),a.nextTick(S,e,t),e._writableState.errorEmitted=!0,e.emit(\"error\",r)):(o(r),e._writableState.errorEmitted=!0,e.emit(\"error\",r),S(e,t))}(e,n,r,t,o);else{var i=x(n);i||n.corked||n.bufferProcessing||!n.bufferedRequest||w(e,n),r?u(_,e,n,i,o):_(e,n,i,o)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new i(this)}function y(e){if(s=s||n(116),!(d.call(y,this)||this instanceof s))return new y(e);this._writableState=new g(e,this),this.writable=!0,e&&(\"function\"==typeof e.write&&(this._write=e.write),\"function\"==typeof e.writev&&(this._writev=e.writev),\"function\"==typeof e.destroy&&(this._destroy=e.destroy),\"function\"==typeof e.final&&(this._final=e.final)),p.call(this)}function b(e,t,n,r,o,a,i){t.writelen=r,t.writecb=i,t.writing=!0,t.sync=!0,n?e._writev(o,t.onwrite):e._write(o,a,t.onwrite),t.sync=!1}function _(e,t,n,r){n||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit(\"drain\"))}(e,t),t.pendingcb--,r(),S(e,t)}function w(e,t){t.bufferProcessing=!0;var n=t.bufferedRequest;if(e._writev&&n&&n.next){var r=t.bufferedRequestCount,o=new Array(r),a=t.corkedRequestsFree;a.entry=n;for(var s=0,u=!0;n;)o[s]=n,n.isBuf||(u=!1),n=n.next,s+=1;o.allBuffers=u,b(e,t,!0,t.length,o,\"\",a.finish),t.pendingcb++,t.lastBufferedRequest=null,a.next?(t.corkedRequestsFree=a.next,a.next=null):t.corkedRequestsFree=new i(t),t.bufferedRequestCount=0}else{for(;n;){var c=n.chunk,l=n.encoding,p=n.callback;if(b(e,t,!1,t.objectMode?1:c.length,c,l,p),n=n.next,t.bufferedRequestCount--,t.writing)break}null===n&&(t.lastBufferedRequest=null)}t.bufferedRequest=n,t.bufferProcessing=!1}function x(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function E(e,t){e._final((function(n){t.pendingcb--,n&&e.emit(\"error\",n),t.prefinished=!0,e.emit(\"prefinish\"),S(e,t)}))}function S(e,t){var n=x(t);return n&&(!function(e,t){t.prefinished||t.finalCalled||(\"function\"==typeof e._final?(t.pendingcb++,t.finalCalled=!0,a.nextTick(E,e,t)):(t.prefinished=!0,e.emit(\"prefinish\")))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit(\"finish\"))),n}c.inherits(y,p),g.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(g.prototype,\"buffer\",{get:l.deprecate((function(){return this.getBuffer()}),\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch(e){}}(),\"function\"==typeof Symbol&&Symbol.hasInstance&&\"function\"==typeof Function.prototype[Symbol.hasInstance]?(d=Function.prototype[Symbol.hasInstance],Object.defineProperty(y,Symbol.hasInstance,{value:function(e){return!!d.call(this,e)||this===y&&(e&&e._writableState instanceof g)}})):d=function(e){return e instanceof this},y.prototype.pipe=function(){this.emit(\"error\",new Error(\"Cannot pipe, not readable\"))},y.prototype.write=function(e,t,n){var r,o=this._writableState,i=!1,s=!o.objectMode&&(r=e,f.isBuffer(r)||r instanceof h);return s&&!f.isBuffer(e)&&(e=function(e){return f.from(e)}(e)),\"function\"==typeof t&&(n=t,t=null),s?t=\"buffer\":t||(t=o.defaultEncoding),\"function\"!=typeof n&&(n=v),o.ended?function(e,t){var n=new Error(\"write after end\");e.emit(\"error\",n),a.nextTick(t,n)}(this,n):(s||function(e,t,n,r){var o=!0,i=!1;return null===n?i=new TypeError(\"May not write null values to stream\"):\"string\"==typeof n||void 0===n||t.objectMode||(i=new TypeError(\"Invalid non-string/buffer chunk\")),i&&(e.emit(\"error\",i),a.nextTick(r,i),o=!1),o}(this,o,e,n))&&(o.pendingcb++,i=function(e,t,n,r,o,a){if(!n){var i=function(e,t,n){e.objectMode||!1===e.decodeStrings||\"string\"!=typeof t||(t=f.from(t,n));return t}(t,r,o);r!==i&&(n=!0,o=\"buffer\",r=i)}var s=t.objectMode?1:r.length;t.length+=s;var u=t.length<t.highWaterMark;u||(t.needDrain=!0);if(t.writing||t.corked){var c=t.lastBufferedRequest;t.lastBufferedRequest={chunk:r,encoding:o,isBuf:n,callback:a,next:null},c?c.next=t.lastBufferedRequest:t.bufferedRequest=t.lastBufferedRequest,t.bufferedRequestCount+=1}else b(e,t,!1,s,r,o,a);return u}(this,o,s,e,t,n)),i},y.prototype.cork=function(){this._writableState.corked++},y.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.finished||e.bufferProcessing||!e.bufferedRequest||w(this,e))},y.prototype.setDefaultEncoding=function(e){if(\"string\"==typeof e&&(e=e.toLowerCase()),!([\"hex\",\"utf8\",\"utf-8\",\"ascii\",\"binary\",\"base64\",\"ucs2\",\"ucs-2\",\"utf16le\",\"utf-16le\",\"raw\"].indexOf((e+\"\").toLowerCase())>-1))throw new TypeError(\"Unknown encoding: \"+e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(y.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),y.prototype._write=function(e,t,n){n(new Error(\"_write() is not implemented\"))},y.prototype._writev=null,y.prototype.end=function(e,t,n){var r=this._writableState;\"function\"==typeof e?(n=e,e=null,t=null):\"function\"==typeof t&&(n=t,t=null),null!=e&&this.write(e,t),r.corked&&(r.corked=1,this.uncork()),r.ending||r.finished||function(e,t,n){t.ending=!0,S(e,t),n&&(t.finished?a.nextTick(n):e.once(\"finish\",n));t.ended=!0,e.writable=!1}(this,r,n)},Object.defineProperty(y.prototype,\"destroyed\",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),y.prototype.destroy=m.destroy,y.prototype._undestroy=m.undestroy,y.prototype._destroy=function(e,t){this.end(),t(e)}}).call(this,n(90),n(433).setImmediate,n(51))},function(e,t,n){\"use strict\";e.exports=n(805)()?Array.from:n(806)},function(e,t,n){\"use strict\";var r=n(823),o=n(118),a=n(137),i=Array.prototype.indexOf,s=Object.prototype.hasOwnProperty,u=Math.abs,c=Math.floor;e.exports=function(e){var t,n,l,p;if(!r(e))return i.apply(this,arguments);for(n=o(a(this).length),l=arguments[1],t=l=isNaN(l)?0:l>=0?c(l):o(this.length)-c(u(l));t<n;++t)if(s.call(this,t)&&(p=this[t],r(p)))return t;return-1}},function(e,t,n){\"use strict\";(function(t,n){var r=function(e){if(\"function\"!=typeof e)throw new TypeError(e+\" is not a function\");return e},o=function(e){var t,n,o=document.createTextNode(\"\"),a=0;return new e((function(){var e;if(t)n&&(t=n.concat(t));else{if(!n)return;t=n}if(n=t,t=null,\"function\"==typeof n)return e=n,n=null,void e();for(o.data=a=++a%2;n;)e=n.shift(),n.length||(n=null),e()})).observe(o,{characterData:!0}),function(e){r(e),t?\"function\"==typeof t?t=[t,e]:t.push(e):(t=e,o.data=a=++a%2)}};e.exports=function(){if(\"object\"==typeof t&&t&&\"function\"==typeof t.nextTick)return t.nextTick;if(\"function\"==typeof queueMicrotask)return function(e){queueMicrotask(r(e))};if(\"object\"==typeof document&&document){if(\"function\"==typeof MutationObserver)return o(MutationObserver);if(\"function\"==typeof WebKitMutationObserver)return o(WebKitMutationObserver)}return\"function\"==typeof n?function(e){n(r(e))}:\"function\"==typeof setTimeout||\"object\"==typeof setTimeout?function(e){setTimeout(r(e),0)}:null}()}).call(this,n(90),n(433).setImmediate)},function(e,t,n){\"use strict\";var r=n(30),o=(n(25),null),a={};function i(){if(o)for(var e in a){var t=a[e],n=o.indexOf(e);if(n>-1||r(\"96\",e),!c.plugins[n]){t.extractEvents||r(\"97\",e),c.plugins[n]=t;var i=t.eventTypes;for(var u in i)s(i[u],t,u)||r(\"98\",u,e)}}}function s(e,t,n){c.eventNameDispatchConfigs.hasOwnProperty(n)&&r(\"99\",n),c.eventNameDispatchConfigs[n]=e;var o=e.phasedRegistrationNames;if(o){for(var a in o){if(o.hasOwnProperty(a))u(o[a],t,n)}return!0}return!!e.registrationName&&(u(e.registrationName,t,n),!0)}function u(e,t,n){c.registrationNameModules[e]&&r(\"100\",e),c.registrationNameModules[e]=t,c.registrationNameDependencies[e]=t.eventTypes[n].dependencies}var c={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},possibleRegistrationNames:null,injectEventPluginOrder:function(e){o&&r(\"101\"),o=Array.prototype.slice.call(e),i()},injectEventPluginsByName:function(e){var t=!1;for(var n in e)if(e.hasOwnProperty(n)){var o=e[n];a.hasOwnProperty(n)&&a[n]===o||(a[n]&&r(\"102\",n),a[n]=o,t=!0)}t&&i()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return c.registrationNameModules[t.registrationName]||null;if(void 0!==t.phasedRegistrationNames){var n=t.phasedRegistrationNames;for(var r in n)if(n.hasOwnProperty(r)){var o=c.registrationNameModules[n[r]];if(o)return o}}return null},_resetEventPlugins:function(){for(var e in o=null,a)a.hasOwnProperty(e)&&delete a[e];c.plugins.length=0;var t=c.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=c.registrationNameModules;for(var i in r)r.hasOwnProperty(i)&&delete r[i]}};e.exports=c},function(e,t,n){\"use strict\";var r,o,a=n(30),i=n(263);n(25),n(33);function s(e,t,n,r){var o=e.type||\"unknown-event\";e.currentTarget=u.getNodeFromInstance(r),t?i.invokeGuardedCallbackWithCatch(o,n,e):i.invokeGuardedCallback(o,n,e),e.currentTarget=null}var u={isEndish:function(e){return\"topMouseUp\"===e||\"topTouchEnd\"===e||\"topTouchCancel\"===e},isMoveish:function(e){return\"topMouseMove\"===e||\"topTouchMove\"===e},isStartish:function(e){return\"topMouseDown\"===e||\"topTouchStart\"===e},executeDirectDispatch:function(e){var t=e._dispatchListeners,n=e._dispatchInstances;Array.isArray(t)&&a(\"103\"),e.currentTarget=t?u.getNodeFromInstance(n):null;var r=t?t(e):null;return e.currentTarget=null,e._dispatchListeners=null,e._dispatchInstances=null,r},executeDispatchesInOrder:function(e,t){var n=e._dispatchListeners,r=e._dispatchInstances;if(Array.isArray(n))for(var o=0;o<n.length&&!e.isPropagationStopped();o++)s(e,t,n[o],r[o]);else n&&s(e,t,n,r);e._dispatchListeners=null,e._dispatchInstances=null},executeDispatchesInOrderStopAtTrue:function(e){var t=function(e){var t=e._dispatchListeners,n=e._dispatchInstances;if(Array.isArray(t)){for(var r=0;r<t.length&&!e.isPropagationStopped();r++)if(t[r](e,n[r]))return n[r]}else if(t&&t(e,n))return n;return null}(e);return e._dispatchInstances=null,e._dispatchListeners=null,t},hasDispatches:function(e){return!!e._dispatchListeners},getInstanceFromNode:function(e){return r.getInstanceFromNode(e)},getNodeFromInstance:function(e){return r.getNodeFromInstance(e)},isAncestor:function(e,t){return o.isAncestor(e,t)},getLowestCommonAncestor:function(e,t){return o.getLowestCommonAncestor(e,t)},getParentInstance:function(e){return o.getParentInstance(e)},traverseTwoPhase:function(e,t,n){return o.traverseTwoPhase(e,t,n)},traverseEnterLeave:function(e,t,n,r,a){return o.traverseEnterLeave(e,t,n,r,a)},injection:{injectComponentTree:function(e){r=e},injectTreeTraversal:function(e){o=e}}};e.exports=u},function(e,t,n){\"use strict\";var r=null;function o(e,t,n){try{t(n)}catch(e){null===r&&(r=e)}}var a={invokeGuardedCallback:o,invokeGuardedCallbackWithCatch:o,rethrowCaughtError:function(){if(r){var e=r;throw r=null,e}}};e.exports=a},function(e,t,n){\"use strict\";e.exports=function(e){var t=e.target||e.srcElement||window;return t.correspondingUseElement&&(t=t.correspondingUseElement),3===t.nodeType?t.parentNode:t}},function(e,t,n){\"use strict\";var r,o=n(56);o.canUseDOM&&(r=document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature(\"\",\"\")),e.exports=function(e,t){if(!o.canUseDOM||t&&!(\"addEventListener\"in document))return!1;var n=\"on\"+e,a=n in document;if(!a){var i=document.createElement(\"div\");i.setAttribute(n,\"return;\"),a=\"function\"==typeof i[n]}return!a&&r&&\"wheel\"===e&&(a=document.implementation.hasFeature(\"Events.wheel\",\"3.0\")),a}},function(e,t,n){\"use strict\";var r={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function o(e){var t=this.nativeEvent;if(t.getModifierState)return t.getModifierState(e);var n=r[e];return!!n&&!!t[n]}e.exports=function(e){return o}},function(e,t,n){\"use strict\";var r=n(142),o=n(931),a=(n(45),n(72),n(269)),i=n(204),s=n(476);function u(e,t){return Array.isArray(t)&&(t=t[1]),t?t.nextSibling:e.firstChild}var c=a((function(e,t,n){e.insertBefore(t,n)}));function l(e,t,n){r.insertTreeBefore(e,t,n)}function p(e,t,n){Array.isArray(t)?function(e,t,n,r){var o=t;for(;;){var a=o.nextSibling;if(c(e,o,r),o===n)break;o=a}}(e,t[0],t[1],n):c(e,t,n)}function f(e,t){if(Array.isArray(t)){var n=t[1];h(e,t=t[0],n),e.removeChild(n)}e.removeChild(t)}function h(e,t,n){for(;;){var r=t.nextSibling;if(r===n)break;e.removeChild(r)}}var d={dangerouslyReplaceNodeWithMarkup:o.dangerouslyReplaceNodeWithMarkup,replaceDelimitedText:function(e,t,n){var r=e.parentNode,o=e.nextSibling;o===t?n&&c(r,document.createTextNode(n),o):n?(s(o,n),h(r,o,t)):h(r,e,t)},processUpdates:function(e,t){for(var n=0;n<t.length;n++){var r=t[n];switch(r.type){case\"INSERT_MARKUP\":l(e,r.content,u(e,r.afterNode));break;case\"MOVE_EXISTING\":p(e,r.fromNode,u(e,r.afterNode));break;case\"SET_MARKUP\":i(e,r.content);break;case\"TEXT_CONTENT\":s(e,r.content);break;case\"REMOVE_NODE\":f(e,r.fromNode)}}}};e.exports=d},function(e,t,n){\"use strict\";e.exports={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"}},function(e,t,n){\"use strict\";e.exports=function(e){return\"undefined\"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(t,n,r,o){MSApp.execUnsafeLocalFunction((function(){return e(t,n,r,o)}))}:e}},function(e,t,n){\"use strict\";var r=n(30),o=n(949),a=n(387)(n(132).isValidElement),i=(n(25),n(33),{button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0});function s(e){null!=e.checkedLink&&null!=e.valueLink&&r(\"87\")}function u(e){s(e),(null!=e.value||null!=e.onChange)&&r(\"88\")}function c(e){s(e),(null!=e.checked||null!=e.onChange)&&r(\"89\")}var l={value:function(e,t,n){return!e[t]||i[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error(\"You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.\")},checked:function(e,t,n){return!e[t]||e.onChange||e.readOnly||e.disabled?null:new Error(\"You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.\")},onChange:a.func},p={};function f(e){if(e){var t=e.getName();if(t)return\" Check the render method of `\"+t+\"`.\"}return\"\"}var h={checkPropTypes:function(e,t,n){for(var r in l){if(l.hasOwnProperty(r))var a=l[r](t,r,e,\"prop\",null,o);if(a instanceof Error&&!(a.message in p)){p[a.message]=!0;f(n)}}},getValue:function(e){return e.valueLink?(u(e),e.valueLink.value):e.value},getChecked:function(e){return e.checkedLink?(c(e),e.checkedLink.value):e.checked},executeOnChange:function(e,t){return e.valueLink?(u(e),e.valueLink.requestChange(t.target.value)):e.checkedLink?(c(e),e.checkedLink.requestChange(t.target.checked)):e.onChange?e.onChange.call(void 0,t):void 0}};e.exports=h},function(e,t,n){\"use strict\";var r=n(30),o=(n(25),!1),a={replaceNodeWithMarkup:null,processChildrenUpdates:null,injection:{injectEnvironment:function(e){o&&r(\"104\"),a.replaceNodeWithMarkup=e.replaceNodeWithMarkup,a.processChildrenUpdates=e.processChildrenUpdates,o=!0}}};e.exports=a},function(e,t,n){\"use strict\";var r=Object.prototype.hasOwnProperty;function o(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!=e&&t!=t}e.exports=function(e,t){if(o(e,t))return!0;if(\"object\"!=typeof e||null===e||\"object\"!=typeof t||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(var i=0;i<n.length;i++)if(!r.call(t,n[i])||!o(e[n[i]],t[n[i]]))return!1;return!0}},function(e,t,n){\"use strict\";e.exports=function(e,t){var n=null===e||!1===e,r=null===t||!1===t;if(n||r)return n===r;var o=typeof e,a=typeof t;return\"string\"===o||\"number\"===o?\"string\"===a||\"number\"===a:\"object\"===a&&e.type===t.type&&e.key===t.key}},function(e,t,n){\"use strict\";var r={escape:function(e){var t={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+e).replace(/[=:]/g,(function(e){return t[e]}))},unescape:function(e){var t={\"=0\":\"=\",\"=2\":\":\"};return(\"\"+(\".\"===e[0]&&\"$\"===e[1]?e.substring(2):e.substring(1))).replace(/(=0|=2)/g,(function(e){return t[e]}))}};e.exports=r},function(e,t,n){\"use strict\";var r=n(30),o=(n(88),n(168)),a=(n(72),n(80));n(25),n(33);function i(e){a.enqueueUpdate(e)}function s(e,t){var n=o.get(e);return n||null}var u={isMounted:function(e){var t=o.get(e);return!!t&&!!t._renderedComponent},enqueueCallback:function(e,t,n){u.validateCallback(t,n);var r=s(e);if(!r)return null;r._pendingCallbacks?r._pendingCallbacks.push(t):r._pendingCallbacks=[t],i(r)},enqueueCallbackInternal:function(e,t){e._pendingCallbacks?e._pendingCallbacks.push(t):e._pendingCallbacks=[t],i(e)},enqueueForceUpdate:function(e){var t=s(e);t&&(t._pendingForceUpdate=!0,i(t))},enqueueReplaceState:function(e,t,n){var r=s(e);r&&(r._pendingStateQueue=[t],r._pendingReplaceState=!0,null!=n&&(u.validateCallback(n,\"replaceState\"),r._pendingCallbacks?r._pendingCallbacks.push(n):r._pendingCallbacks=[n]),i(r))},enqueueSetState:function(e,t){var n=s(e);n&&((n._pendingStateQueue||(n._pendingStateQueue=[])).push(t),i(n))},enqueueElementInternal:function(e,t,n){e._pendingElement=t,e._context=n,i(e)},validateCallback:function(e,t){e&&\"function\"!=typeof e&&r(\"122\",t,function(e){var t=typeof e;if(\"object\"!==t)return t;var n=e.constructor&&e.constructor.name||t,r=Object.keys(e);return r.length>0&&r.length<20?n+\" (keys: \"+r.join(\", \")+\")\":n}(e))}};e.exports=u},function(e,t,n){\"use strict\";n(38);var r=n(79),o=(n(33),r);e.exports=o},function(e,t,n){\"use strict\";e.exports=function(e){var t,n=e.keyCode;return\"charCode\"in e?0===(t=e.charCode)&&13===n&&(t=13):t=n,t>=32||13===t?t:0}},function(e,t,n){var r=n(422)(Object.getPrototypeOf,Object);e.exports=r},function(e,t,n){var r=n(420),o=n(1003),a=n(115);e.exports=function(e){return a(e)?r(e,!0):o(e)}},function(e,t,n){var r=n(416);e.exports=function(e){var t=new e.constructor(e.byteLength);return new r(t).set(new r(e)),t}},function(e,t,n){\"use strict\";var r,o=SyntaxError,a=Function,i=TypeError,s=function(e){try{return a('\"use strict\"; return ('+e+\").constructor;\")()}catch(e){}},u=Object.getOwnPropertyDescriptor;if(u)try{u({},\"\")}catch(e){u=null}var c=function(){throw new i},l=u?function(){try{return c}catch(e){try{return u(arguments,\"callee\").get}catch(e){return c}}}():c,p=n(1055)(),f=Object.getPrototypeOf||function(e){return e.__proto__},h={},d=\"undefined\"==typeof Uint8Array?r:f(Uint8Array),m={\"%AggregateError%\":\"undefined\"==typeof AggregateError?r:AggregateError,\"%Array%\":Array,\"%ArrayBuffer%\":\"undefined\"==typeof ArrayBuffer?r:ArrayBuffer,\"%ArrayIteratorPrototype%\":p?f([][Symbol.iterator]()):r,\"%AsyncFromSyncIteratorPrototype%\":r,\"%AsyncFunction%\":h,\"%AsyncGenerator%\":h,\"%AsyncGeneratorFunction%\":h,\"%AsyncIteratorPrototype%\":h,\"%Atomics%\":\"undefined\"==typeof Atomics?r:Atomics,\"%BigInt%\":\"undefined\"==typeof BigInt?r:BigInt,\"%Boolean%\":Boolean,\"%DataView%\":\"undefined\"==typeof DataView?r:DataView,\"%Date%\":Date,\"%decodeURI%\":decodeURI,\"%decodeURIComponent%\":decodeURIComponent,\"%encodeURI%\":encodeURI,\"%encodeURIComponent%\":encodeURIComponent,\"%Error%\":Error,\"%eval%\":eval,\"%EvalError%\":EvalError,\"%Float32Array%\":\"undefined\"==typeof Float32Array?r:Float32Array,\"%Float64Array%\":\"undefined\"==typeof Float64Array?r:Float64Array,\"%FinalizationRegistry%\":\"undefined\"==typeof FinalizationRegistry?r:FinalizationRegistry,\"%Function%\":a,\"%GeneratorFunction%\":h,\"%Int8Array%\":\"undefined\"==typeof Int8Array?r:Int8Array,\"%Int16Array%\":\"undefined\"==typeof Int16Array?r:Int16Array,\"%Int32Array%\":\"undefined\"==typeof Int32Array?r:Int32Array,\"%isFinite%\":isFinite,\"%isNaN%\":isNaN,\"%IteratorPrototype%\":p?f(f([][Symbol.iterator]())):r,\"%JSON%\":\"object\"==typeof JSON?JSON:r,\"%Map%\":\"undefined\"==typeof Map?r:Map,\"%MapIteratorPrototype%\":\"undefined\"!=typeof Map&&p?f((new Map)[Symbol.iterator]()):r,\"%Math%\":Math,\"%Number%\":Number,\"%Object%\":Object,\"%parseFloat%\":parseFloat,\"%parseInt%\":parseInt,\"%Promise%\":\"undefined\"==typeof Promise?r:Promise,\"%Proxy%\":\"undefined\"==typeof Proxy?r:Proxy,\"%RangeError%\":RangeError,\"%ReferenceError%\":ReferenceError,\"%Reflect%\":\"undefined\"==typeof Reflect?r:Reflect,\"%RegExp%\":RegExp,\"%Set%\":\"undefined\"==typeof Set?r:Set,\"%SetIteratorPrototype%\":\"undefined\"!=typeof Set&&p?f((new Set)[Symbol.iterator]()):r,\"%SharedArrayBuffer%\":\"undefined\"==typeof SharedArrayBuffer?r:SharedArrayBuffer,\"%String%\":String,\"%StringIteratorPrototype%\":p?f(\"\"[Symbol.iterator]()):r,\"%Symbol%\":p?Symbol:r,\"%SyntaxError%\":o,\"%ThrowTypeError%\":l,\"%TypedArray%\":d,\"%TypeError%\":i,\"%Uint8Array%\":\"undefined\"==typeof Uint8Array?r:Uint8Array,\"%Uint8ClampedArray%\":\"undefined\"==typeof Uint8ClampedArray?r:Uint8ClampedArray,\"%Uint16Array%\":\"undefined\"==typeof Uint16Array?r:Uint16Array,\"%Uint32Array%\":\"undefined\"==typeof Uint32Array?r:Uint32Array,\"%URIError%\":URIError,\"%WeakMap%\":\"undefined\"==typeof WeakMap?r:WeakMap,\"%WeakRef%\":\"undefined\"==typeof WeakRef?r:WeakRef,\"%WeakSet%\":\"undefined\"==typeof WeakSet?r:WeakSet},v=function e(t){var n;if(\"%AsyncFunction%\"===t)n=s(\"async function () {}\");else if(\"%GeneratorFunction%\"===t)n=s(\"function* () {}\");else if(\"%AsyncGeneratorFunction%\"===t)n=s(\"async function* () {}\");else if(\"%AsyncGenerator%\"===t){var r=e(\"%AsyncGeneratorFunction%\");r&&(n=r.prototype)}else if(\"%AsyncIteratorPrototype%\"===t){var o=e(\"%AsyncGenerator%\");o&&(n=f(o.prototype))}return m[t]=n,n},g={\"%ArrayBufferPrototype%\":[\"ArrayBuffer\",\"prototype\"],\"%ArrayPrototype%\":[\"Array\",\"prototype\"],\"%ArrayProto_entries%\":[\"Array\",\"prototype\",\"entries\"],\"%ArrayProto_forEach%\":[\"Array\",\"prototype\",\"forEach\"],\"%ArrayProto_keys%\":[\"Array\",\"prototype\",\"keys\"],\"%ArrayProto_values%\":[\"Array\",\"prototype\",\"values\"],\"%AsyncFunctionPrototype%\":[\"AsyncFunction\",\"prototype\"],\"%AsyncGenerator%\":[\"AsyncGeneratorFunction\",\"prototype\"],\"%AsyncGeneratorPrototype%\":[\"AsyncGeneratorFunction\",\"prototype\",\"prototype\"],\"%BooleanPrototype%\":[\"Boolean\",\"prototype\"],\"%DataViewPrototype%\":[\"DataView\",\"prototype\"],\"%DatePrototype%\":[\"Date\",\"prototype\"],\"%ErrorPrototype%\":[\"Error\",\"prototype\"],\"%EvalErrorPrototype%\":[\"EvalError\",\"prototype\"],\"%Float32ArrayPrototype%\":[\"Float32Array\",\"prototype\"],\"%Float64ArrayPrototype%\":[\"Float64Array\",\"prototype\"],\"%FunctionPrototype%\":[\"Function\",\"prototype\"],\"%Generator%\":[\"GeneratorFunction\",\"prototype\"],\"%GeneratorPrototype%\":[\"GeneratorFunction\",\"prototype\",\"prototype\"],\"%Int8ArrayPrototype%\":[\"Int8Array\",\"prototype\"],\"%Int16ArrayPrototype%\":[\"Int16Array\",\"prototype\"],\"%Int32ArrayPrototype%\":[\"Int32Array\",\"prototype\"],\"%JSONParse%\":[\"JSON\",\"parse\"],\"%JSONStringify%\":[\"JSON\",\"stringify\"],\"%MapPrototype%\":[\"Map\",\"prototype\"],\"%NumberPrototype%\":[\"Number\",\"prototype\"],\"%ObjectPrototype%\":[\"Object\",\"prototype\"],\"%ObjProto_toString%\":[\"Object\",\"prototype\",\"toString\"],\"%ObjProto_valueOf%\":[\"Object\",\"prototype\",\"valueOf\"],\"%PromisePrototype%\":[\"Promise\",\"prototype\"],\"%PromiseProto_then%\":[\"Promise\",\"prototype\",\"then\"],\"%Promise_all%\":[\"Promise\",\"all\"],\"%Promise_reject%\":[\"Promise\",\"reject\"],\"%Promise_resolve%\":[\"Promise\",\"resolve\"],\"%RangeErrorPrototype%\":[\"RangeError\",\"prototype\"],\"%ReferenceErrorPrototype%\":[\"ReferenceError\",\"prototype\"],\"%RegExpPrototype%\":[\"RegExp\",\"prototype\"],\"%SetPrototype%\":[\"Set\",\"prototype\"],\"%SharedArrayBufferPrototype%\":[\"SharedArrayBuffer\",\"prototype\"],\"%StringPrototype%\":[\"String\",\"prototype\"],\"%SymbolPrototype%\":[\"Symbol\",\"prototype\"],\"%SyntaxErrorPrototype%\":[\"SyntaxError\",\"prototype\"],\"%TypedArrayPrototype%\":[\"TypedArray\",\"prototype\"],\"%TypeErrorPrototype%\":[\"TypeError\",\"prototype\"],\"%Uint8ArrayPrototype%\":[\"Uint8Array\",\"prototype\"],\"%Uint8ClampedArrayPrototype%\":[\"Uint8ClampedArray\",\"prototype\"],\"%Uint16ArrayPrototype%\":[\"Uint16Array\",\"prototype\"],\"%Uint32ArrayPrototype%\":[\"Uint32Array\",\"prototype\"],\"%URIErrorPrototype%\":[\"URIError\",\"prototype\"],\"%WeakMapPrototype%\":[\"WeakMap\",\"prototype\"],\"%WeakSetPrototype%\":[\"WeakSet\",\"prototype\"]},y=n(282),b=n(1058),_=y.call(Function.call,Array.prototype.concat),w=y.call(Function.apply,Array.prototype.splice),x=y.call(Function.call,String.prototype.replace),E=y.call(Function.call,String.prototype.slice),S=/[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g,C=/\\\\(\\\\)?/g,A=function(e){var t=E(e,0,1),n=E(e,-1);if(\"%\"===t&&\"%\"!==n)throw new o(\"invalid intrinsic syntax, expected closing `%`\");if(\"%\"===n&&\"%\"!==t)throw new o(\"invalid intrinsic syntax, expected opening `%`\");var r=[];return x(e,S,(function(e,t,n,o){r[r.length]=n?x(o,C,\"$1\"):t||e})),r},k=function(e,t){var n,r=e;if(b(g,r)&&(r=\"%\"+(n=g[r])[0]+\"%\"),b(m,r)){var a=m[r];if(a===h&&(a=v(r)),void 0===a&&!t)throw new i(\"intrinsic \"+e+\" exists, but is not available. Please file an issue!\");return{alias:n,name:r,value:a}}throw new o(\"intrinsic \"+e+\" does not exist!\")};e.exports=function(e,t){if(\"string\"!=typeof e||0===e.length)throw new i(\"intrinsic name must be a non-empty string\");if(arguments.length>1&&\"boolean\"!=typeof t)throw new i('\"allowMissing\" argument must be a boolean');var n=A(e),r=n.length>0?n[0]:\"\",a=k(\"%\"+r+\"%\",t),s=a.name,c=a.value,l=!1,p=a.alias;p&&(r=p[0],w(n,_([0,1],p)));for(var f=1,h=!0;f<n.length;f+=1){var d=n[f],v=E(d,0,1),g=E(d,-1);if(('\"'===v||\"'\"===v||\"`\"===v||'\"'===g||\"'\"===g||\"`\"===g)&&v!==g)throw new o(\"property names with quotes must have matching quotes\");if(\"constructor\"!==d&&h||(l=!0),b(m,s=\"%\"+(r+=\".\"+d)+\"%\"))c=m[s];else if(null!=c){if(!(d in c)){if(!t)throw new i(\"base intrinsic for \"+e+\" exists, but the property is not available.\");return}if(u&&f+1>=n.length){var y=u(c,d);c=(h=!!y)&&\"get\"in y&&!(\"originalValue\"in y.get)?y.get:c[d]}else h=b(c,d),c=c[d];h&&!l&&(m[s]=c)}}return c}},function(e,t,n){\"use strict\";var r=n(1057);e.exports=Function.prototype.bind||r},function(e,t,n){\"use strict\";var r=String.prototype.replace,o=/%20/g,a=\"RFC1738\",i=\"RFC3986\";e.exports={default:i,formatters:{RFC1738:function(e){return r.call(e,o,\"+\")},RFC3986:function(e){return String(e)}},RFC1738:a,RFC3986:i}},function(e,t,n){var r=n(688)(\"toUpperCase\");e.exports=r},function(e,t,n){var r=n(244);function o(e,t){if(\"function\"!=typeof e||null!=t&&\"function\"!=typeof t)throw new TypeError(\"Expected a function\");var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],a=n.cache;if(a.has(o))return a.get(o);var i=e.apply(this,r);return n.cache=a.set(o,i)||a,i};return n.cache=new(o.Cache||r),n}o.Cache=r,e.exports=o},function(e,t,n){\"use strict\";n.r(t);var r=n(287),o=n(59),a=n(290);t.default=function(e){return{statePlugins:{err:{reducers:Object(r.default)(e),actions:o,selectors:a}}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(3),o=n.n(r),a=n(20),i=n.n(a),s=n(4),u=n.n(s),c=n(2),l=n.n(c),p=n(12),f=n.n(p),h=n(210),d=n.n(h),m=n(59),v=n(1),g=n(126),y={line:0,level:\"error\",message:\"Unknown error\"};t.default=function(){var e;return e={},o()(e,m.NEW_THROWN_ERR,(function(e,t){var n=t.payload,r=i()(y,n,{type:\"thrown\"});return e.update(\"errors\",(function(e){return(e||Object(v.List)()).push(Object(v.fromJS)(r))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),o()(e,m.NEW_THROWN_ERR_BATCH,(function(e,t){var n=t.payload;return n=u()(n).call(n,(function(e){return Object(v.fromJS)(i()(y,e,{type:\"thrown\"}))})),e.update(\"errors\",(function(e){var t;return l()(t=e||Object(v.List)()).call(t,Object(v.fromJS)(n))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),o()(e,m.NEW_SPEC_ERR,(function(e,t){var n=t.payload,r=Object(v.fromJS)(n);return r=r.set(\"type\",\"spec\"),e.update(\"errors\",(function(e){return(e||Object(v.List)()).push(Object(v.fromJS)(r)).sortBy((function(e){return e.get(\"line\")}))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),o()(e,m.NEW_SPEC_ERR_BATCH,(function(e,t){var n=t.payload;return n=u()(n).call(n,(function(e){return Object(v.fromJS)(i()(y,e,{type:\"spec\"}))})),e.update(\"errors\",(function(e){var t;return l()(t=e||Object(v.List)()).call(t,Object(v.fromJS)(n))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),o()(e,m.NEW_AUTH_ERR,(function(e,t){var n=t.payload,r=Object(v.fromJS)(i()({},n));return r=r.set(\"type\",\"auth\"),e.update(\"errors\",(function(e){return(e||Object(v.List)()).push(Object(v.fromJS)(r))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),o()(e,m.CLEAR,(function(e,t){var n,r=t.payload;if(!r||!e.get(\"errors\"))return e;var o=f()(n=e.get(\"errors\")).call(n,(function(e){var t;return d()(t=e.keySeq()).call(t,(function(t){var n=e.get(t),o=r[t];return!o||n!==o}))}));return e.merge({errors:o})})),o()(e,m.CLEAR_BY,(function(e,t){var n,r=t.payload;if(!r||\"function\"!=typeof r)return e;var o=f()(n=e.get(\"errors\")).call(n,(function(e){return r(e)}));return e.merge({errors:o})})),e}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"transform\",(function(){return p}));var r=n(4),o=n.n(r),a=n(17),i=n.n(a),s=n(19),u=n.n(s),c=n(29),l=n.n(c);function p(e){return o()(e).call(e,(function(e){var t,n=\"is not of a type(s)\",r=i()(t=e.get(\"message\")).call(t,n);if(r>-1){var o,a,s=u()(o=e.get(\"message\")).call(o,r+n.length).split(\",\");return e.set(\"message\",u()(a=e.get(\"message\")).call(a,0,r)+function(e){return l()(e).call(e,(function(e,t,n,r){return n===r.length-1&&r.length>1?e+\"or \"+t:r[n+1]&&r.length>2?e+t+\", \":r[n+1]?e+t+\" \":e+t}),\"should be a\")}(s))}return e}))}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"transform\",(function(){return r}));n(4),n(17),n(43),n(1);function r(e,t){t.jsSpec;return e}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"allErrors\",(function(){return a})),n.d(t,\"lastError\",(function(){return i}));var r=n(1),o=n(16),a=Object(o.a)((function(e){return e}),(function(e){return e.get(\"errors\",Object(r.List)())})),i=Object(o.a)(a,(function(e){return e.last()}))},function(e,t,n){\"use strict\";n.r(t);var r=n(292),o=n(103),a=n(293),i=n(294);t.default=function(){return{statePlugins:{layout:{reducers:r.default,actions:o,selectors:a},spec:{wrapSelectors:i}}}}},function(e,t,n){\"use strict\";n.r(t);var r,o=n(3),a=n.n(o),i=n(2),s=n.n(i),u=n(1),c=n(103);t.default=(r={},a()(r,c.UPDATE_LAYOUT,(function(e,t){return e.set(\"layout\",t.payload)})),a()(r,c.UPDATE_FILTER,(function(e,t){return e.set(\"filter\",t.payload)})),a()(r,c.SHOW,(function(e,t){var n=t.payload.shown,r=Object(u.fromJS)(t.payload.thing);return e.update(\"shown\",Object(u.fromJS)({}),(function(e){return e.set(r,n)}))})),a()(r,c.UPDATE_MODE,(function(e,t){var n,r=t.payload.thing,o=t.payload.mode;return e.setIn(s()(n=[\"modes\"]).call(n,r),(o||\"\")+\"\")})),r)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"current\",(function(){return l})),n.d(t,\"currentFilter\",(function(){return p})),n.d(t,\"isShown\",(function(){return f})),n.d(t,\"whatMode\",(function(){return h})),n.d(t,\"showSummary\",(function(){return d}));var r=n(14),o=n.n(r),a=n(2),i=n.n(a),s=n(16),u=n(5),c=n(1),l=function(e){return e.get(\"layout\")},p=function(e){return e.get(\"filter\")},f=function(e,t,n){return t=Object(u.v)(t),e.get(\"shown\",Object(c.fromJS)({})).get(Object(c.fromJS)(t),n)},h=function(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\";return t=Object(u.v)(t),e.getIn(i()(n=[\"modes\"]).call(n,o()(t)),r)},d=Object(s.a)((function(e){return e}),(function(e){return!f(e,\"editor\")}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"taggedOperations\",(function(){return s}));var r=n(2),o=n.n(r),a=n(19),i=n.n(a),s=function(e,t){return function(n){for(var r,a=arguments.length,s=new Array(a>1?a-1:0),u=1;u<a;u++)s[u-1]=arguments[u];var c=e.apply(void 0,o()(r=[n]).call(r,s)),l=t.getSystem(),p=l.fn,f=l.layoutSelectors,h=l.getConfigs,d=h(),m=d.maxDisplayedTags,v=f.currentFilter();return v&&!0!==v&&\"true\"!==v&&\"false\"!==v&&(c=p.opsFilter(c,v)),m&&!isNaN(m)&&m>=0&&(c=i()(c).call(c,0,m)),c}}},function(e,t,n){\"use strict\";n.r(t);var r=n(296),o=n(46),a=n(93),i=n(297);t.default=function(){return{statePlugins:{spec:{wrapActions:i,reducers:r.default,actions:o,selectors:a}}}}},function(e,t,n){\"use strict\";n.r(t);var r,o=n(3),a=n.n(o),i=n(14),s=n.n(i),u=n(2),c=n.n(u),l=n(29),p=n.n(l),f=n(4),h=n.n(f),d=n(20),m=n.n(d),v=n(1),g=n(5),y=n(26),b=n(93),_=n(46);t.default=(r={},a()(r,_.UPDATE_SPEC,(function(e,t){return\"string\"==typeof t.payload?e.set(\"spec\",t.payload):e})),a()(r,_.UPDATE_URL,(function(e,t){return e.set(\"url\",t.payload+\"\")})),a()(r,_.UPDATE_JSON,(function(e,t){return e.set(\"json\",Object(g.i)(t.payload))})),a()(r,_.UPDATE_RESOLVED,(function(e,t){return e.setIn([\"resolved\"],Object(g.i)(t.payload))})),a()(r,_.UPDATE_RESOLVED_SUBTREE,(function(e,t){var n,r=t.payload,o=r.value,a=r.path;return e.setIn(c()(n=[\"resolvedSubtrees\"]).call(n,s()(a)),Object(g.i)(o))})),a()(r,_.UPDATE_PARAM,(function(e,t){var n,r,o=t.payload,a=o.path,i=o.paramName,u=o.paramIn,l=o.param,p=o.value,f=o.isXml,h=l?Object(g.A)(l):c()(n=\"\".concat(u,\".\")).call(n,i),d=f?\"value_xml\":\"value\";return e.setIn(c()(r=[\"meta\",\"paths\"]).call(r,s()(a),[\"parameters\",h,d]),p)})),a()(r,_.UPDATE_EMPTY_PARAM_INCLUSION,(function(e,t){var n,r,o=t.payload,a=o.pathMethod,i=o.paramName,u=o.paramIn,l=o.includeEmptyValue;if(!i||!u)return console.warn(\"Warning: UPDATE_EMPTY_PARAM_INCLUSION could not generate a paramKey.\"),e;var p=c()(n=\"\".concat(u,\".\")).call(n,i);return e.setIn(c()(r=[\"meta\",\"paths\"]).call(r,s()(a),[\"parameter_inclusions\",p]),l)})),a()(r,_.VALIDATE_PARAMS,(function(e,t){var n,r,o=t.payload,a=o.pathMethod,i=o.isOAS3,u=Object(b.specJsonWithResolvedSubtrees)(e).getIn(c()(n=[\"paths\"]).call(n,s()(a))),l=Object(b.parameterValues)(e,a).toJS();return e.updateIn(c()(r=[\"meta\",\"paths\"]).call(r,s()(a),[\"parameters\"]),Object(v.fromJS)({}),(function(t){var n;return p()(n=u.get(\"parameters\",Object(v.List)())).call(n,(function(t,n){var r=Object(g.B)(n,l),o=Object(b.parameterInclusionSettingFor)(e,a,n.get(\"name\"),n.get(\"in\")),s=Object(g.K)(n,r,{bypassRequiredCheck:o,isOAS3:i});return t.setIn([Object(g.A)(n),\"errors\"],Object(v.fromJS)(s))}),t)}))})),a()(r,_.CLEAR_VALIDATE_PARAMS,(function(e,t){var n,r=t.payload.pathMethod;return e.updateIn(c()(n=[\"meta\",\"paths\"]).call(n,s()(r),[\"parameters\"]),Object(v.fromJS)([]),(function(e){return h()(e).call(e,(function(e){return e.set(\"errors\",Object(v.fromJS)([]))}))}))})),a()(r,_.SET_RESPONSE,(function(e,t){var n,r=t.payload,o=r.res,a=r.path,i=r.method;(n=o.error?m()({error:!0,name:o.err.name,message:o.err.message,statusCode:o.err.statusCode},o.err.response):o).headers=n.headers||{};var s=e.setIn([\"responses\",a,i],Object(g.i)(n));return y.a.Blob&&o.data instanceof y.a.Blob&&(s=s.setIn([\"responses\",a,i,\"text\"],o.data)),s})),a()(r,_.SET_REQUEST,(function(e,t){var n=t.payload,r=n.req,o=n.path,a=n.method;return e.setIn([\"requests\",o,a],Object(g.i)(r))})),a()(r,_.SET_MUTATED_REQUEST,(function(e,t){var n=t.payload,r=n.req,o=n.path,a=n.method;return e.setIn([\"mutatedRequests\",o,a],Object(g.i)(r))})),a()(r,_.UPDATE_OPERATION_META_VALUE,(function(e,t){var n,r,o,a,i,u,l=t.payload,p=l.path,f=l.value,h=l.key,d=c()(n=[\"paths\"]).call(n,s()(p)),m=c()(r=[\"meta\",\"paths\"]).call(r,s()(p));return e.getIn(c()(o=[\"json\"]).call(o,s()(d)))||e.getIn(c()(a=[\"resolved\"]).call(a,s()(d)))||e.getIn(c()(i=[\"resolvedSubtrees\"]).call(i,s()(d)))?e.setIn(c()(u=[]).call(u,s()(m),[h]),Object(v.fromJS)(f)):e})),a()(r,_.CLEAR_RESPONSE,(function(e,t){var n=t.payload,r=n.path,o=n.method;return e.deleteIn([\"responses\",r,o])})),a()(r,_.CLEAR_REQUEST,(function(e,t){var n=t.payload,r=n.path,o=n.method;return e.deleteIn([\"requests\",r,o])})),a()(r,_.SET_SCHEME,(function(e,t){var n=t.payload,r=n.scheme,o=n.path,a=n.method;return o&&a?e.setIn([\"scheme\",o,a],r):o||a?void 0:e.setIn([\"scheme\",\"_defaultScheme\"],r)})),r)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"updateSpec\",(function(){return c})),n.d(t,\"updateJsonSpec\",(function(){return l})),n.d(t,\"executeRequest\",(function(){return p})),n.d(t,\"validateParams\",(function(){return f}));var r=n(15),o=n.n(r),a=n(23),i=n.n(a),s=n(43),u=n.n(s),c=function(e,t){var n=t.specActions;return function(){e.apply(void 0,arguments),n.parseToJson.apply(n,arguments)}},l=function(e,t){var n=t.specActions;return function(){for(var t=arguments.length,r=new Array(t),a=0;a<t;a++)r[a]=arguments[a];e.apply(void 0,r),n.invalidateResolvedSubtreeCache();var s=r[0],c=u()(s,[\"paths\"])||{},l=o()(c);i()(l).call(l,(function(e){u()(c,[e]).$ref&&n.requestResolvedSubtree([\"paths\",e])})),n.requestResolvedSubtree([\"components\",\"securitySchemes\"])}},p=function(e,t){var n=t.specActions;return function(t){return n.logRequest(t),e(t)}},f=function(e,t){var n=t.specSelectors;return function(t){return e(t,n.isOAS3())}}},function(e,t,n){\"use strict\";n.r(t);var r=n(36),o=n.n(r),a=n(173),i=n(5);t.default=function(e){var t=e.getComponents,n=e.getStore,r=e.getSystem,s=a.getComponent,u=a.render,c=a.makeMappedContainer,l=Object(i.u)(o()(s).call(s,null,r,n,t));return{rootInjects:{getComponent:l,makeMappedContainer:Object(i.u)(o()(c).call(c,null,r,n,l,t)),render:o()(u).call(u,null,r,n,s,t)}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(146);t.default=function(){return{fn:r}}},function(e,t,n){\"use strict\";n.r(t);var r=n(169),o=n(301),a=n(302);t.default=function(){return{components:{RequestSnippets:a.RequestSnippets},fn:r,statePlugins:{requestSnippets:{selectors:o}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"getGenerators\",(function(){return f})),n.d(t,\"getSnippetGenerators\",(function(){return h})),n.d(t,\"getActiveLanguage\",(function(){return d})),n.d(t,\"getDefaultExpanded\",(function(){return m}));var r=n(12),o=n.n(r),a=n(31),i=n.n(a),s=n(4),u=n.n(s),c=n(16),l=n(1),p=function(e){return e||Object(l.Map)()},f=Object(c.a)(p,(function(e){var t=e.get(\"languages\"),n=e.get(\"generators\",Object(l.Map)());return t?o()(n).call(n,(function(e,n){return i()(t).call(t,n)})):n})),h=function(e){return function(t){var n,r,a=t.fn;return o()(n=u()(r=f(e)).call(r,(function(e,t){var n=function(e){return a[\"requestSnippetGenerator_\".concat(e)]}(t);return\"function\"!=typeof n?null:e.set(\"fn\",n)}))).call(n,(function(e){return e}))}},d=Object(c.a)(p,(function(e){return e.get(\"activeLanguage\")})),m=Object(c.a)(p,(function(e){return e.get(\"defaultExpanded\")}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"RequestSnippets\",(function(){return w}));var r=n(13),o=n.n(r),a=n(6),i=n.n(a),s=n(7),u=n.n(s),c=n(8),l=n.n(c),p=n(9),f=n.n(p),h=n(4),d=n.n(h),m=n(0),v=n.n(m),g=n(147),y=(n(11),n(43)),b=n.n(y),_=n(96),w=function(e){l()(n,e);var t=f()(n);function n(){var e,r,o,a,s,u;return i()(this,n),(u=t.call(this)).state={activeLanguage:null===(e=u.props)||void 0===e||null===(r=e.requestSnippetsSelectors)||void 0===r||null===(o=r.getSnippetGenerators())||void 0===o?void 0:o.keySeq().first(),expanded:null===(a=u.props)||void 0===a||null===(s=a.requestSnippetsSelectors)||void 0===s?void 0:s.getDefaultExpanded()},u}return u()(n,[{key:\"render\",value:function(){var e,t,n,r,a=this,i=this.props,s=i.request,u=i.getConfigs,c=i.requestSnippetsSelectors.getSnippetGenerators(),l=this.state.activeLanguage||c.keySeq().first(),p=c.get(l),f=p.get(\"fn\")(s),h={cursor:\"pointer\",lineHeight:1,display:\"inline-flex\",backgroundColor:\"rgb(250, 250, 250)\",paddingBottom:\"0\",paddingTop:\"0\",border:\"1px solid rgb(51, 51, 51)\",borderRadius:\"4px 4px 0 0\",boxShadow:\"none\",borderBottom:\"none\"},m={cursor:\"pointer\",lineHeight:1,display:\"inline-flex\",backgroundColor:\"rgb(51, 51, 51)\",boxShadow:\"none\",border:\"1px solid rgb(51, 51, 51)\",paddingBottom:\"0\",paddingTop:\"0\",borderRadius:\"4px 4px 0 0\",marginTop:\"-5px\",marginRight:\"-5px\",marginLeft:\"-5px\",zIndex:\"9999\",borderBottom:\"none\"},y=function(e){return e===l?m:h},w=u(),x=null!=w&&null!==(e=w.syntaxHighlight)&&void 0!==e&&e.activated?v.a.createElement(_.a,{language:p.get(\"syntax\"),className:\"curl microlight\",onWheel:function(e){return this.preventYScrollingBeyondElement(e)},style:Object(_.b)(b()(w,\"syntaxHighlight.theme\"))},f):v.a.createElement(\"textarea\",{readOnly:!0,className:\"curl\",value:f}),E=void 0===this.state.expanded?null===(t=this.props)||void 0===t||null===(n=t.requestSnippetsSelectors)||void 0===n?void 0:n.getDefaultExpanded():this.state.expanded;return v.a.createElement(\"div\",null,v.a.createElement(\"div\",{style:{width:\"100%\",display:\"flex\",justifyContent:\"flex-start\",alignItems:\"center\",marginBottom:\"15px\"}},v.a.createElement(\"h4\",{style:{cursor:\"pointer\"},onClick:function(){return a.setState({expanded:!E})}},\"Snippets\"),v.a.createElement(\"button\",{onClick:function(){return a.setState({expanded:!E})},style:{border:\"none\",background:\"none\"},title:E?\"Collapse operation\":\"Expand operation\"},v.a.createElement(\"svg\",{className:\"arrow\",width:\"10\",height:\"10\"},v.a.createElement(\"use\",{href:E?\"#large-arrow-down\":\"#large-arrow\",xlinkHref:E?\"#large-arrow-down\":\"#large-arrow\"})))),E&&v.a.createElement(\"div\",{className:\"curl-command\"},v.a.createElement(\"div\",{style:{paddingLeft:\"15px\",paddingRight:\"10px\",width:\"100%\",display:\"flex\"}},d()(r=c.entrySeq()).call(r,(function(e){var t=o()(e,2),n=t[0],r=t[1];return v.a.createElement(\"div\",{style:y(n),className:\"btn\",key:n,onClick:function(){return function(e){l!==e&&a.setState({activeLanguage:e})}(n)}},v.a.createElement(\"h4\",{style:n===l?{color:\"white\"}:{}},r.get(\"title\")))}))),v.a.createElement(\"div\",{className:\"copy-to-clipboard\"},v.a.createElement(g.CopyToClipboard,{text:f},v.a.createElement(\"button\",null))),v.a.createElement(\"div\",null,x)))}}]),n}(v.a.Component)},function(e,t,n){\"use strict\";n.r(t);var r=n(36),o=n.n(r);t.default=function(e){var t=e.configs,n={debug:0,info:1,log:2,warn:3,error:4},r=function(e){return n[e]||-1},a=t.logLevel,i=r(a);function s(e){for(var t,n=arguments.length,o=new Array(n>1?n-1:0),a=1;a<n;a++)o[a-1]=arguments[a];r(e)>=i&&(t=console)[e].apply(t,o)}return s.warn=o()(s).call(s,null,\"warn\"),s.error=o()(s).call(s,null,\"error\"),s.info=o()(s).call(s,null,\"info\"),s.debug=o()(s).call(s,null,\"debug\"),{rootInjects:{log:s}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"loaded\",(function(){return r}));var r=function(e,t){return function(){e.apply(void 0,arguments);var n=t.getConfigs().withCredentials;void 0!==n&&(t.fn.fetch.withCredentials=\"string\"==typeof n?\"true\"===n:!!n)}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"preauthorizeBasic\",(function(){return h})),n.d(t,\"preauthorizeApiKey\",(function(){return d}));var r=n(3),o=n.n(r),a=n(36),i=n.n(a),s=n(2),u=n.n(s),c=n(306),l=n(84),p=n(307),f=n(308);function h(e,t,n,r){var a,i=e.authActions.authorize,s=e.specSelectors,c=s.specJson,l=(0,s.isOAS3)()?[\"components\",\"securitySchemes\"]:[\"securityDefinitions\"],p=c().getIn(u()(a=[]).call(a,l,[t]));return p?i(o()({},t,{value:{username:n,password:r},schema:p.toJS()})):null}function d(e,t,n){var r,a=e.authActions.authorize,i=e.specSelectors,s=i.specJson,c=(0,i.isOAS3)()?[\"components\",\"securitySchemes\"]:[\"securityDefinitions\"],l=s().getIn(u()(r=[]).call(r,c,[t]));return l?a(o()({},t,{value:n,schema:l.toJS()})):null}t.default=function(){return{afterLoad:function(e){this.rootInjects=this.rootInjects||{},this.rootInjects.initOAuth=e.authActions.configureAuth,this.rootInjects.preauthorizeApiKey=i()(d).call(d,null,e),this.rootInjects.preauthorizeBasic=i()(h).call(h,null,e)},statePlugins:{auth:{reducers:c.default,actions:l,selectors:p},spec:{wrapActions:f}}}}},function(e,t,n){\"use strict\";n.r(t);var r,o=n(3),a=n.n(o),i=n(13),s=n.n(i),u=n(23),c=n.n(u),l=n(20),p=n.n(l),f=n(1),h=n(5),d=n(84);t.default=(r={},a()(r,d.SHOW_AUTH_POPUP,(function(e,t){var n=t.payload;return e.set(\"showDefinitions\",n)})),a()(r,d.AUTHORIZE,(function(e,t){var n,r=t.payload,o=Object(f.fromJS)(r),a=e.get(\"authorized\")||Object(f.Map)();return c()(n=o.entrySeq()).call(n,(function(t){var n=s()(t,2),r=n[0],o=n[1];if(!Object(h.s)(o.getIn))return e.set(\"authorized\",a);var i=o.getIn([\"schema\",\"type\"]);if(\"apiKey\"===i||\"http\"===i)a=a.set(r,o);else if(\"basic\"===i){var u=o.getIn([\"value\",\"username\"]),c=o.getIn([\"value\",\"password\"]);a=(a=a.setIn([r,\"value\"],{username:u,header:\"Basic \"+Object(h.a)(u+\":\"+c)})).setIn([r,\"schema\"],o.get(\"schema\"))}})),e.set(\"authorized\",a)})),a()(r,d.AUTHORIZE_OAUTH2,(function(e,t){var n,r=t.payload,o=r.auth,a=r.token;o.token=p()({},a),n=Object(f.fromJS)(o);var i=e.get(\"authorized\")||Object(f.Map)();return i=i.set(n.get(\"name\"),n),e.set(\"authorized\",i)})),a()(r,d.LOGOUT,(function(e,t){var n=t.payload,r=e.get(\"authorized\").withMutations((function(e){c()(n).call(n,(function(t){e.delete(t)}))}));return e.set(\"authorized\",r)})),a()(r,d.CONFIGURE_AUTH,(function(e,t){var n=t.payload;return e.set(\"configs\",n)})),a()(r,d.RESTORE_AUTHORIZATION,(function(e,t){var n=t.payload;return e.set(\"authorized\",Object(f.fromJS)(n.authorized))})),r)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"shownDefinitions\",(function(){return _})),n.d(t,\"definitionsToAuthorize\",(function(){return w})),n.d(t,\"getDefinitionsByNames\",(function(){return x})),n.d(t,\"definitionsForRequirements\",(function(){return E})),n.d(t,\"authorized\",(function(){return S})),n.d(t,\"isAuthorized\",(function(){return C})),n.d(t,\"getConfigs\",(function(){return A}));var r=n(13),o=n.n(r),a=n(23),i=n.n(a),s=n(12),u=n.n(s),c=n(75),l=n.n(c),p=n(17),f=n.n(p),h=n(4),d=n.n(h),m=n(15),v=n.n(m),g=n(16),y=n(1),b=function(e){return e},_=Object(g.a)(b,(function(e){return e.get(\"showDefinitions\")})),w=Object(g.a)(b,(function(){return function(e){var t,n=e.specSelectors.securityDefinitions()||Object(y.Map)({}),r=Object(y.List)();return i()(t=n.entrySeq()).call(t,(function(e){var t=o()(e,2),n=t[0],a=t[1],i=Object(y.Map)();i=i.set(n,a),r=r.push(i)})),r}})),x=function(e,t){return function(e){var n,r=e.specSelectors;console.warn(\"WARNING: getDefinitionsByNames is deprecated and will be removed in the next major version.\");var a=r.securityDefinitions(),s=Object(y.List)();return i()(n=t.valueSeq()).call(n,(function(e){var t,n=Object(y.Map)();i()(t=e.entrySeq()).call(t,(function(e){var t,r,s=o()(e,2),u=s[0],c=s[1],l=a.get(u);\"oauth2\"===l.get(\"type\")&&c.size&&(t=l.get(\"scopes\"),i()(r=t.keySeq()).call(r,(function(e){c.contains(e)||(t=t.delete(e))})),l=l.set(\"allowedScopes\",t));n=n.set(u,l)})),s=s.push(n)})),s}},E=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Object(y.List)();return function(e){var n=e.authSelectors.definitionsToAuthorize()||Object(y.List)();return u()(n).call(n,(function(e){return l()(t).call(t,(function(t){return t.get(e.keySeq().first())}))}))}},S=Object(g.a)(b,(function(e){return e.get(\"authorized\")||Object(y.Map)()})),C=function(e,t){return function(e){var n,r=e.authSelectors.authorized();return y.List.isList(t)?!!u()(n=t.toJS()).call(n,(function(e){var t,n;return-1===f()(t=d()(n=v()(e)).call(n,(function(e){return!!r.get(e)}))).call(t,!1)})).length:null}},A=Object(g.a)(b,(function(e){return e.get(\"configs\")}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"execute\",(function(){return a}));var r=n(24),o=n.n(r),a=function(e,t){var n=t.authSelectors,r=t.specSelectors;return function(t){var a=t.path,i=t.method,s=t.operation,u=t.extras,c={authorized:n.authorized()&&n.authorized().toJS(),definitions:r.securityDefinitions()&&r.securityDefinitions().toJS(),specSecurity:r.security()&&r.security().toJS()};return e(o()({path:a,method:i,operation:s,securities:c},u))}}},function(e,t,n){\"use strict\";n.r(t);var r=n(5);t.default=function(){return{fn:{shallowEqualKeys:r.G}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return v}));var r=n(20),o=n.n(r),a=n(95),i=n.n(a),s=n(2),u=n.n(s),c=n(17),l=n.n(c),p=n(32),f=n.n(p),h=n(16),d=n(1),m=n(26);function v(e){var t=e.fn;return{statePlugins:{spec:{actions:{download:function(e){return function(n){var r=n.errActions,a=n.specSelectors,s=n.specActions,c=n.getConfigs,l=t.fetch,p=c();function f(t){if(t instanceof Error||t.status>=400)return s.updateLoadingStatus(\"failed\"),r.newThrownErr(o()(new Error((t.message||t.statusText)+\" \"+e),{source:\"fetch\"})),void(!t.status&&t instanceof Error&&function(){try{var t;if(\"URL\"in m.a?t=new i.a(e):(t=document.createElement(\"a\")).href=e,\"https:\"!==t.protocol&&\"https:\"===m.a.location.protocol){var n=o()(new Error(\"Possible mixed-content issue? The page was loaded over https:// but a \".concat(t.protocol,\"// URL was specified. Check that you are not attempting to load mixed content.\")),{source:\"fetch\"});return void r.newThrownErr(n)}if(t.origin!==m.a.location.origin){var a,s=o()(new Error(u()(a=\"Possible cross-origin (CORS) issue? The URL origin (\".concat(t.origin,\") does not match the page (\")).call(a,m.a.location.origin,\"). Check the server returns the correct 'Access-Control-Allow-*' headers.\")),{source:\"fetch\"});r.newThrownErr(s)}}catch(e){return}}());s.updateLoadingStatus(\"success\"),s.updateSpec(t.text),a.url()!==e&&s.updateUrl(e)}e=e||a.url(),s.updateLoadingStatus(\"loading\"),r.clear({source:\"fetch\"}),l({url:e,loadSpec:!0,requestInterceptor:p.requestInterceptor||function(e){return e},responseInterceptor:p.responseInterceptor||function(e){return e},credentials:\"same-origin\",headers:{Accept:\"application/json,*/*\"}}).then(f,f)}},updateLoadingStatus:function(e){var t,n=[null,\"loading\",\"failed\",\"success\",\"failedConfig\"];-1===l()(n).call(n,e)&&console.error(u()(t=\"Error: \".concat(e,\" is not one of \")).call(t,f()(n)));return{type:\"spec_update_loading_status\",payload:e}}},reducers:{spec_update_loading_status:function(e,t){return\"string\"==typeof t.payload?e.set(\"loadingStatus\",t.payload):e}},selectors:{loadingStatus:Object(h.a)((function(e){return e||Object(d.Map)()}),(function(e){return e.get(\"loadingStatus\")||null}))}}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"downloadConfig\",(function(){return o})),n.d(t,\"getConfigByUrl\",(function(){return a}));var r=n(170),o=function(e){return function(t){return(0,t.fn.fetch)(e)}},a=function(e,t){return function(n){var o=n.specActions;if(e)return o.downloadConfig(e).then(a,a);function a(n){n instanceof Error||n.status>=400?(o.updateLoadingStatus(\"failedConfig\"),o.updateLoadingStatus(\"failedConfig\"),o.updateUrl(\"\"),console.error(n.statusText+\" \"+e.url),t(null)):t(Object(r.parseYamlConfig)(n.text))}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"get\",(function(){return a}));var r=n(22),o=n.n(r),a=function(e,t){return e.getIn(o()(t)?t:[t])}},function(e,t,n){\"use strict\";n.r(t);var r,o=n(3),a=n.n(o),i=n(1),s=n(148);t.default=(r={},a()(r,s.UPDATE_CONFIGS,(function(e,t){return e.merge(Object(i.fromJS)(t.payload))})),a()(r,s.TOGGLE_CONFIGS,(function(e,t){var n=t.payload,r=e.get(n);return e.set(n,!r)})),r)},function(e,t,n){\"use strict\";n.r(t);var r=n(315),o=n(316),a=n(317);t.default=function(){return[r.default,{statePlugins:{configs:{wrapActions:{loaded:function(e,t){return function(){e.apply(void 0,arguments);var n=decodeURIComponent(window.location.hash);t.layoutActions.parseDeepLinkHash(n)}}}}},wrapComponents:{operation:o.default,OperationTag:a.default}}]}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"show\",(function(){return A})),n.d(t,\"scrollTo\",(function(){return k})),n.d(t,\"parseDeepLinkHash\",(function(){return O})),n.d(t,\"readyToScroll\",(function(){return j})),n.d(t,\"scrollToElement\",(function(){return T})),n.d(t,\"clearScrollTo\",(function(){return I}));var r,o=n(3),a=n.n(o),i=n(13),s=n.n(i),u=n(22),c=n.n(u),l=n(2),p=n.n(l),f=n(19),h=n.n(f),d=n(4),m=n.n(d),v=n(17),g=n.n(v),y=n(174),b=n(537),_=n.n(b),w=n(5),x=n(1),E=n.n(x),S=\"layout_scroll_to\",C=\"layout_clear_scroll\",A=function(e,t){var n=t.getConfigs,r=t.layoutSelectors;return function(){for(var t=arguments.length,o=new Array(t),a=0;a<t;a++)o[a]=arguments[a];if(e.apply(void 0,o),n().deepLinking)try{var i=o[0],u=o[1];i=c()(i)?i:[i];var l=r.urlHashArrayFromIsShownKey(i);if(!l.length)return;var f,h=s()(l,2),d=h[0],m=h[1];if(!u)return Object(y.setHash)(\"/\");if(2===l.length)Object(y.setHash)(Object(w.d)(p()(f=\"/\".concat(encodeURIComponent(d),\"/\")).call(f,encodeURIComponent(m))));else 1===l.length&&Object(y.setHash)(Object(w.d)(\"/\".concat(encodeURIComponent(d))))}catch(e){console.error(e)}}},k=function(e){return{type:S,payload:c()(e)?e:[e]}},O=function(e){return function(t){var n=t.layoutActions,r=t.layoutSelectors;if((0,t.getConfigs)().deepLinking&&e){var o,a=h()(e).call(e,1);\"!\"===a[0]&&(a=h()(a).call(a,1)),\"/\"===a[0]&&(a=h()(a).call(a,1));var i=m()(o=a.split(\"/\")).call(o,(function(e){return e||\"\"})),u=r.isShownKeyFromUrlHashArray(i),c=s()(u,3),l=c[0],p=c[1],f=void 0===p?\"\":p,d=c[2],v=void 0===d?\"\":d;if(\"operations\"===l){var y=r.isShownKeyFromUrlHashArray([f]);g()(f).call(f,\"_\")>-1&&(console.warn(\"Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead.\"),n.show(m()(y).call(y,(function(e){return e.replace(/_/g,\" \")})),!0)),n.show(y,!0)}(g()(f).call(f,\"_\")>-1||g()(v).call(v,\"_\")>-1)&&(console.warn(\"Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead.\"),n.show(m()(u).call(u,(function(e){return e.replace(/_/g,\" \")})),!0)),n.show(u,!0),n.scrollTo(u)}}},j=function(e,t){return function(n){var r=n.layoutSelectors.getScrollToKey();E.a.is(r,Object(x.fromJS)(e))&&(n.layoutActions.scrollToElement(t),n.layoutActions.clearScrollTo())}},T=function(e,t){return function(n){try{t=t||n.fn.getScrollParent(e),_.a.createScroller(t).to(e)}catch(e){console.error(e)}}},I=function(){return{type:C}};t.default={fn:{getScrollParent:function(e,t){var n=document.documentElement,r=getComputedStyle(e),o=\"absolute\"===r.position,a=t?/(auto|scroll|hidden)/:/(auto|scroll)/;if(\"fixed\"===r.position)return n;for(var i=e;i=i.parentElement;)if(r=getComputedStyle(i),(!o||\"static\"!==r.position)&&a.test(r.overflow+r.overflowY+r.overflowX))return i;return n}},statePlugins:{layout:{actions:{scrollToElement:T,scrollTo:k,clearScrollTo:I,readyToScroll:j,parseDeepLinkHash:O},selectors:{getScrollToKey:function(e){return e.get(\"scrollToKey\")},isShownKeyFromUrlHashArray:function(e,t){var n=s()(t,2),r=n[0],o=n[1];return o?[\"operations\",r,o]:r?[\"operations-tag\",r]:[]},urlHashArrayFromIsShownKey:function(e,t){var n=s()(t,3),r=n[0],o=n[1],a=n[2];return\"operations\"==r?[o,a]:\"operations-tag\"==r?[o]:[]}},reducers:(r={},a()(r,S,(function(e,t){return e.set(\"scrollToKey\",E.a.fromJS(t.payload))})),a()(r,C,(function(e){return e.delete(\"scrollToKey\")})),r),wrapActions:{show:A}}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(6),o=n.n(r),a=n(7),i=n.n(a),s=n(10),u=n.n(s),c=n(8),l=n.n(c),p=n(9),f=n.n(p),h=n(3),d=n.n(h),m=n(2),v=n.n(m),g=n(0),y=n.n(g);n(27);t.default=function(e,t){return function(n){l()(a,n);var r=f()(a);function a(){var e,n;o()(this,a);for(var i=arguments.length,s=new Array(i),c=0;c<i;c++)s[c]=arguments[c];return n=r.call.apply(r,v()(e=[this]).call(e,s)),d()(u()(n),\"onLoad\",(function(e){var r=n.props.operation,o=r.toObject(),a=o.tag,i=o.operationId,s=r.toObject().isShownKey;s=s||[\"operations\",a,i],t.layoutActions.readyToScroll(s,e)})),n}return i()(a,[{key:\"render\",value:function(){return y.a.createElement(\"span\",{ref:this.onLoad},y.a.createElement(e,this.props))}}]),a}(y.a.Component)}},function(e,t,n){\"use strict\";n.r(t);var r=n(6),o=n.n(r),a=n(7),i=n.n(a),s=n(10),u=n.n(s),c=n(8),l=n.n(c),p=n(9),f=n.n(p),h=n(3),d=n.n(h),m=n(2),v=n.n(m),g=n(0),y=n.n(g);n(11);t.default=function(e,t){return function(n){l()(a,n);var r=f()(a);function a(){var e,n;o()(this,a);for(var i=arguments.length,s=new Array(i),c=0;c<i;c++)s[c]=arguments[c];return n=r.call.apply(r,v()(e=[this]).call(e,s)),d()(u()(n),\"onLoad\",(function(e){var r=[\"operations-tag\",n.props.tag];t.layoutActions.readyToScroll(r,e)})),n}return i()(a,[{key:\"render\",value:function(){return y.a.createElement(\"span\",{ref:this.onLoad},y.a.createElement(e,this.props))}}]),a}(y.a.Component)}},function(e,t,n){\"use strict\";n.r(t);var r=n(319);t.default=function(){return{fn:{opsFilter:r.default}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(12),o=n.n(r),a=n(17),i=n.n(a);t.default=function(e,t){return o()(e).call(e,(function(e,n){return-1!==i()(n).call(n,t)}))}},function(e,t,n){\"use strict\";n.r(t);var r=n(218),o=n.n(r),a=!1;t.default=function(){return{statePlugins:{spec:{wrapActions:{updateSpec:function(e){return function(){return a=!0,e.apply(void 0,arguments)}},updateJsonSpec:function(e,t){return function(){var n=t.getConfigs().onComplete;return a&&\"function\"==typeof n&&(o()(n,0),a=!1),e.apply(void 0,arguments)}}}}}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(322),o=n(323),a=n(324),i=n(325),s=n(333),u=n(54),c=n(340),l=n(341);t.default=function(){return{components:i.default,wrapComponents:s.default,statePlugins:{spec:{wrapSelectors:r,selectors:a},auth:{wrapSelectors:o},oas3:{actions:u,reducers:l.default,selectors:c}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"definitions\",(function(){return h})),n.d(t,\"hasHost\",(function(){return d})),n.d(t,\"securityDefinitions\",(function(){return m})),n.d(t,\"host\",(function(){return v})),n.d(t,\"basePath\",(function(){return g})),n.d(t,\"consumes\",(function(){return y})),n.d(t,\"produces\",(function(){return b})),n.d(t,\"schemes\",(function(){return _})),n.d(t,\"servers\",(function(){return w})),n.d(t,\"isOAS3\",(function(){return x})),n.d(t,\"isSwagger2\",(function(){return E}));var r=n(16),o=n(93),a=n(1),i=n(35);function s(e){return function(t,n){return function(){var r=n.getSystem().specSelectors.specJson();return Object(i.isOAS3)(r)?e.apply(void 0,arguments):t.apply(void 0,arguments)}}}var u=function(e){return e||Object(a.Map)()},c=s(Object(r.a)((function(){return null}))),l=Object(r.a)(u,(function(e){return e.get(\"json\",Object(a.Map)())})),p=Object(r.a)(u,(function(e){return e.get(\"resolved\",Object(a.Map)())})),f=function(e){var t=p(e);return t.count()<1&&(t=l(e)),t},h=s(Object(r.a)(f,(function(e){var t=e.getIn([\"components\",\"schemas\"]);return a.Map.isMap(t)?t:Object(a.Map)()}))),d=s((function(e){return f(e).hasIn([\"servers\",0])})),m=s(Object(r.a)(o.specJsonWithResolvedSubtrees,(function(e){return e.getIn([\"components\",\"securitySchemes\"])||null}))),v=c,g=c,y=c,b=c,_=c,w=s(Object(r.a)(f,(function(e){return e.getIn([\"servers\"])||Object(a.Map)()}))),x=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return Object(i.isOAS3)(a.Map.isMap(e)?e:Object(a.Map)())}},E=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return Object(i.isSwagger2)(a.Map.isMap(e)?e:Object(a.Map)())}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"definitionsToAuthorize\",(function(){return b}));var r=n(3),o=n.n(r),a=n(13),i=n.n(a),s=n(2),u=n.n(s),c=n(23),l=n.n(c),p=n(12),f=n.n(p),h=n(29),d=n.n(h),m=n(16),v=n(1),g=n(35);var y,b=(y=Object(m.a)((function(e){return e}),(function(e){return e.specSelectors.securityDefinitions()}),(function(e,t){var n,r=Object(v.List)();return t?(l()(n=t.entrySeq()).call(n,(function(e){var t,n=i()(e,2),a=n[0],s=n[1],u=s.get(\"type\");if(\"oauth2\"===u&&l()(t=s.get(\"flows\").entrySeq()).call(t,(function(e){var t=i()(e,2),n=t[0],u=t[1],c=Object(v.fromJS)({flow:n,authorizationUrl:u.get(\"authorizationUrl\"),tokenUrl:u.get(\"tokenUrl\"),scopes:u.get(\"scopes\"),type:s.get(\"type\"),description:s.get(\"description\")});r=r.push(new v.Map(o()({},a,f()(c).call(c,(function(e){return void 0!==e})))))})),\"http\"!==u&&\"apiKey\"!==u||(r=r.push(new v.Map(o()({},a,s)))),\"openIdConnect\"===u&&s.get(\"openIdConnectData\")){var c=s.get(\"openIdConnectData\"),p=c.get(\"grant_types_supported\")||[\"authorization_code\",\"implicit\"];l()(p).call(p,(function(e){var t,n=c.get(\"scopes_supported\")&&d()(t=c.get(\"scopes_supported\")).call(t,(function(e,t){return e.set(t,\"\")}),new v.Map),i=Object(v.fromJS)({flow:e,authorizationUrl:c.get(\"authorization_endpoint\"),tokenUrl:c.get(\"token_endpoint\"),scopes:n,type:\"oauth2\",openIdConnectUrl:s.get(\"openIdConnectUrl\")});r=r.push(new v.Map(o()({},a,f()(i).call(i,(function(e){return void 0!==e})))))}))}})),r):r})),function(e,t){return function(){for(var n=t.getSystem().specSelectors.specJson(),r=arguments.length,o=new Array(r),a=0;a<r;a++)o[a]=arguments[a];if(Object(g.isOAS3)(n)){var i,s=t.getState().getIn([\"spec\",\"resolvedSubtrees\",\"components\",\"securitySchemes\"]);return y.apply(void 0,u()(i=[t,s]).call(i,o))}return e.apply(void 0,o)}})},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"servers\",(function(){return l})),n.d(t,\"isSwagger2\",(function(){return p}));var r=n(16),o=n(1),a=n(35);var i,s=function(e){return e||Object(o.Map)()},u=Object(r.a)(s,(function(e){return e.get(\"json\",Object(o.Map)())})),c=Object(r.a)(s,(function(e){return e.get(\"resolved\",Object(o.Map)())})),l=(i=Object(r.a)((function(e){var t=c(e);return t.count()<1&&(t=u(e)),t}),(function(e){return e.getIn([\"servers\"])||Object(o.Map)()})),function(){return function(e){var t=e.getSystem().specSelectors.specJson();if(Object(a.isOAS3)(t)){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return i.apply(void 0,r)}return null}}),p=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return Object(a.isSwagger2)(e)}}},function(e,t,n){\"use strict\";n.r(t);var r=n(326),o=n(171),a=n(327),i=n(328),s=n(329),u=n(330),c=n(331),l=n(332);t.default={Callbacks:r.default,HttpAuth:c.default,RequestBody:o.default,Servers:i.default,ServersContainer:s.default,RequestBodyEditor:u.default,OperationServers:l.default,operationLink:a.default}},function(e,t,n){\"use strict\";n.r(t);var r=n(28),o=n.n(r),a=n(13),i=n.n(a),s=n(4),u=n.n(s),c=n(0),l=n.n(c),p=(n(11),n(27),n(1));t.default=function(e){var t,n=e.callbacks,r=e.getComponent,a=e.specPath,s=r(\"OperationContainer\",!0);if(!n)return l.a.createElement(\"span\",null,\"No callbacks\");var c=u()(t=n.entrySeq()).call(t,(function(t){var n,r=i()(t,2),c=r[0],f=r[1];return l.a.createElement(\"div\",{key:c},l.a.createElement(\"h2\",null,c),u()(n=f.entrySeq()).call(n,(function(t){var n,r=i()(t,2),f=r[0],h=r[1];return\"$$ref\"===f?null:l.a.createElement(\"div\",{key:f},u()(n=h.entrySeq()).call(n,(function(t){var n=i()(t,2),r=n[0],u=n[1];if(\"$$ref\"===r)return null;var h=Object(p.fromJS)({operation:u});return l.a.createElement(s,o()({},e,{op:h,key:r,tag:\"\",method:r,path:f,specPath:a.push(c,f,r),allowTryItOut:!1}))})))})))}));return l.a.createElement(\"div\",null,c)}},function(e,t,n){\"use strict\";n.r(t);var r=n(6),o=n.n(r),a=n(7),i=n.n(a),s=n(8),u=n.n(s),c=n(9),l=n.n(c),p=n(32),f=n.n(p),h=n(4),d=n.n(h),m=n(0),v=n.n(m),g=(n(11),n(27),function(e){u()(n,e);var t=l()(n);function n(){return o()(this,n),t.apply(this,arguments)}return i()(n,[{key:\"render\",value:function(){var e=this.props,t=e.link,n=e.name,r=(0,e.getComponent)(\"Markdown\",!0),o=t.get(\"operationId\")||t.get(\"operationRef\"),a=t.get(\"parameters\")&&t.get(\"parameters\").toJS(),i=t.get(\"description\");return v.a.createElement(\"div\",{className:\"operation-link\"},v.a.createElement(\"div\",{className:\"description\"},v.a.createElement(\"b\",null,v.a.createElement(\"code\",null,n)),i?v.a.createElement(r,{source:i}):null),v.a.createElement(\"pre\",null,\"Operation `\",o,\"`\",v.a.createElement(\"br\",null),v.a.createElement(\"br\",null),\"Parameters \",function(e,t){var n;if(\"string\"!=typeof t)return\"\";return d()(n=t.split(\"\\n\")).call(n,(function(t,n){return n>0?Array(e+1).join(\" \")+t:t})).join(\"\\n\")}(0,f()(a,null,2))||\"{}\",v.a.createElement(\"br\",null)))}}]),n}(m.Component));t.default=g},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return A}));var r=n(13),o=n.n(r),a=n(6),i=n.n(a),s=n(7),u=n.n(s),c=n(10),l=n.n(c),p=n(8),f=n.n(p),h=n(9),d=n.n(h),m=n(3),v=n.n(m),g=n(2),y=n.n(g),b=n(64),_=n.n(b),w=n(4),x=n.n(w),E=n(0),S=n.n(E),C=n(1),A=(n(11),n(27),function(e){f()(n,e);var t=d()(n);function n(){var e,r;i()(this,n);for(var o=arguments.length,a=new Array(o),s=0;s<o;s++)a[s]=arguments[s];return r=t.call.apply(t,y()(e=[this]).call(e,a)),v()(l()(r),\"onServerChange\",(function(e){r.setServer(e.target.value)})),v()(l()(r),\"onServerVariableValueChange\",(function(e){var t=r.props,n=t.setServerVariableValue,o=t.currentServer,a=e.target.getAttribute(\"data-variable\"),i=e.target.value;\"function\"==typeof n&&n({server:o,key:a,val:i})})),v()(l()(r),\"setServer\",(function(e){(0,r.props.setSelectedServer)(e)})),r}return u()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.servers;e.currentServer||this.setServer(t.first().get(\"url\"))}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.servers,n=e.setServerVariableValue,r=e.getServerVariable;if(this.props.currentServer!==e.currentServer||this.props.servers!==e.servers){var o=_()(t).call(t,(function(t){return t.get(\"url\")===e.currentServer}));if(!o)return this.setServer(t.first().get(\"url\"));var a=o.get(\"variables\")||Object(C.OrderedMap)();x()(a).call(a,(function(t,o){r(e.currentServer,o)||n({server:e.currentServer,key:o,val:t.get(\"default\")||\"\"})}))}}},{key:\"render\",value:function(){var e,t,n=this,r=this.props,a=r.servers,i=r.currentServer,s=r.getServerVariable,u=r.getEffectiveServerValue,c=(_()(a).call(a,(function(e){return e.get(\"url\")===i}))||Object(C.OrderedMap)()).get(\"variables\")||Object(C.OrderedMap)(),l=0!==c.size;return S.a.createElement(\"div\",{className:\"servers\"},S.a.createElement(\"label\",{htmlFor:\"servers\"},S.a.createElement(\"select\",{onChange:this.onServerChange,value:i},x()(e=a.valueSeq()).call(e,(function(e){return S.a.createElement(\"option\",{value:e.get(\"url\"),key:e.get(\"url\")},e.get(\"url\"),e.get(\"description\")&&\" - \".concat(e.get(\"description\")))})).toArray())),l?S.a.createElement(\"div\",null,S.a.createElement(\"div\",{className:\"computed-url\"},\"Computed URL:\",S.a.createElement(\"code\",null,u(i))),S.a.createElement(\"h4\",null,\"Server variables\"),S.a.createElement(\"table\",null,S.a.createElement(\"tbody\",null,x()(t=c.entrySeq()).call(t,(function(e){var t,r=o()(e,2),a=r[0],u=r[1];return S.a.createElement(\"tr\",{key:a},S.a.createElement(\"td\",null,a),S.a.createElement(\"td\",null,u.get(\"enum\")?S.a.createElement(\"select\",{\"data-variable\":a,onChange:n.onServerVariableValueChange},x()(t=u.get(\"enum\")).call(t,(function(e){return S.a.createElement(\"option\",{selected:e===s(i,a),key:e,value:e},e)}))):S.a.createElement(\"input\",{type:\"text\",value:s(i,a)||\"\",onChange:n.onServerVariableValueChange,\"data-variable\":a})))}))))):null)}}]),n}(S.a.Component))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return h}));var r=n(6),o=n.n(r),a=n(7),i=n.n(a),s=n(8),u=n.n(s),c=n(9),l=n.n(c),p=n(0),f=n.n(p),h=(n(11),function(e){u()(n,e);var t=l()(n);function n(){return o()(this,n),t.apply(this,arguments)}return i()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.oas3Selectors,r=e.oas3Actions,o=e.getComponent,a=t.servers(),i=o(\"Servers\");return a&&a.size?f.a.createElement(\"div\",null,f.a.createElement(\"span\",{className:\"servers-title\"},\"Servers\"),f.a.createElement(i,{servers:a,currentServer:n.selectedServer(),setSelectedServer:r.setSelectedServer,setServerVariableValue:r.setServerVariableValue,getServerVariable:n.serverVariableValue,getEffectiveServerValue:n.serverEffectiveValue})):null}}]),n}(f.a.Component))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return w}));var r=n(6),o=n.n(r),a=n(7),i=n.n(a),s=n(10),u=n.n(s),c=n(8),l=n.n(c),p=n(9),f=n.n(p),h=n(3),d=n.n(h),m=n(0),v=n.n(m),g=(n(11),n(63)),y=n.n(g),b=n(5),_=Function.prototype,w=function(e){l()(n,e);var t=f()(n);function n(e,r){var a;return o()(this,n),a=t.call(this,e,r),d()(u()(a),\"applyDefaultValue\",(function(e){var t=e||a.props,n=t.onChange,r=t.defaultValue;return a.setState({value:r}),n(r)})),d()(u()(a),\"onChange\",(function(e){a.props.onChange(Object(b.I)(e))})),d()(u()(a),\"onDomChange\",(function(e){var t=e.target.value;a.setState({value:t},(function(){return a.onChange(t)}))})),a.state={value:Object(b.I)(e.value)||e.defaultValue},e.onChange(e.value),a}return i()(n,[{key:\"componentWillReceiveProps\",value:function(e){this.props.value!==e.value&&e.value!==this.state.value&&this.setState({value:Object(b.I)(e.value)}),!e.value&&e.defaultValue&&this.state.value&&this.applyDefaultValue(e)}},{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.errors,r=this.state.value,o=n.size>0,a=t(\"TextArea\");return v.a.createElement(\"div\",{className:\"body-param\"},v.a.createElement(a,{className:y()(\"body-param__text\",{invalid:o}),title:n.size?n.join(\", \"):\"\",value:r,onChange:this.onDomChange}))}}]),n}(m.PureComponent);d()(w,\"defaultProps\",{onChange:_,userHasEditedBody:!1})},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return E}));var r=n(6),o=n.n(r),a=n(7),i=n.n(a),s=n(10),u=n.n(s),c=n(8),l=n.n(c),p=n(9),f=n.n(p),h=n(3),d=n.n(h),m=n(20),v=n.n(m),g=n(12),y=n.n(g),b=n(4),_=n.n(b),w=n(0),x=n.n(w),E=(n(11),function(e){l()(n,e);var t=f()(n);function n(e,r){var a;o()(this,n),a=t.call(this,e,r),d()(u()(a),\"onChange\",(function(e){var t=a.props.onChange,n=e.target,r=n.value,o=n.name,i=v()({},a.state.value);o?i[o]=r:i=r,a.setState({value:i},(function(){return t(a.state)}))}));var i=a.props,s=i.name,c=i.schema,l=a.getValue();return a.state={name:s,schema:c,value:l},a}return i()(n,[{key:\"getValue\",value:function(){var e=this.props,t=e.name,n=e.authorized;return n&&n.getIn([t,\"value\"])}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.schema,o=n.getComponent,a=n.errSelectors,i=n.name,s=o(\"Input\"),u=o(\"Row\"),c=o(\"Col\"),l=o(\"authError\"),p=o(\"Markdown\",!0),f=o(\"JumpToPath\",!0),h=(r.get(\"scheme\")||\"\").toLowerCase(),d=this.getValue(),m=y()(e=a.allErrors()).call(e,(function(e){return e.get(\"authId\")===i}));if(\"basic\"===h){var v,g=d?d.get(\"username\"):null;return x.a.createElement(\"div\",null,x.a.createElement(\"h4\",null,x.a.createElement(\"code\",null,i||r.get(\"name\")),\"  (http, Basic)\",x.a.createElement(f,{path:[\"securityDefinitions\",i]})),g&&x.a.createElement(\"h6\",null,\"Authorized\"),x.a.createElement(u,null,x.a.createElement(p,{source:r.get(\"description\")})),x.a.createElement(u,null,x.a.createElement(\"label\",null,\"Username:\"),g?x.a.createElement(\"code\",null,\" \",g,\" \"):x.a.createElement(c,null,x.a.createElement(s,{type:\"text\",required:\"required\",name:\"username\",onChange:this.onChange,autoFocus:!0}))),x.a.createElement(u,null,x.a.createElement(\"label\",null,\"Password:\"),g?x.a.createElement(\"code\",null,\" ****** \"):x.a.createElement(c,null,x.a.createElement(s,{autoComplete:\"new-password\",name:\"password\",type:\"password\",onChange:this.onChange}))),_()(v=m.valueSeq()).call(v,(function(e,t){return x.a.createElement(l,{error:e,key:t})})))}return\"bearer\"===h?x.a.createElement(\"div\",null,x.a.createElement(\"h4\",null,x.a.createElement(\"code\",null,i||r.get(\"name\")),\"  (http, Bearer)\",x.a.createElement(f,{path:[\"securityDefinitions\",i]})),d&&x.a.createElement(\"h6\",null,\"Authorized\"),x.a.createElement(u,null,x.a.createElement(p,{source:r.get(\"description\")})),x.a.createElement(u,null,x.a.createElement(\"label\",null,\"Value:\"),d?x.a.createElement(\"code\",null,\" ****** \"):x.a.createElement(c,null,x.a.createElement(s,{type:\"text\",onChange:this.onChange,autoFocus:!0}))),_()(t=m.valueSeq()).call(t,(function(e,t){return x.a.createElement(l,{error:e,key:t})}))):x.a.createElement(\"div\",null,x.a.createElement(\"em\",null,x.a.createElement(\"b\",null,i),\" HTTP authentication: unsupported scheme \",\"'\".concat(h,\"'\")))}}]),n}(x.a.Component))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return w}));var r=n(24),o=n.n(r),a=n(6),i=n.n(a),s=n(7),u=n.n(s),c=n(10),l=n.n(c),p=n(8),f=n.n(p),h=n(9),d=n.n(h),m=n(3),v=n.n(m),g=n(2),y=n.n(g),b=n(0),_=n.n(b),w=(n(11),n(27),function(e){f()(n,e);var t=d()(n);function n(){var e,r;i()(this,n);for(var a=arguments.length,s=new Array(a),u=0;u<a;u++)s[u]=arguments[u];return r=t.call.apply(t,y()(e=[this]).call(e,s)),v()(l()(r),\"setSelectedServer\",(function(e){var t,n=r.props,o=n.path,a=n.method;return r.forceUpdate(),r.props.setSelectedServer(e,y()(t=\"\".concat(o,\":\")).call(t,a))})),v()(l()(r),\"setServerVariableValue\",(function(e){var t,n=r.props,a=n.path,i=n.method;return r.forceUpdate(),r.props.setServerVariableValue(o()(o()({},e),{},{namespace:y()(t=\"\".concat(a,\":\")).call(t,i)}))})),v()(l()(r),\"getSelectedServer\",(function(){var e,t=r.props,n=t.path,o=t.method;return r.props.getSelectedServer(y()(e=\"\".concat(n,\":\")).call(e,o))})),v()(l()(r),\"getServerVariable\",(function(e,t){var n,o=r.props,a=o.path,i=o.method;return r.props.getServerVariable({namespace:y()(n=\"\".concat(a,\":\")).call(n,i),server:e},t)})),v()(l()(r),\"getEffectiveServerValue\",(function(e){var t,n=r.props,o=n.path,a=n.method;return r.props.getEffectiveServerValue({server:e,namespace:y()(t=\"\".concat(o,\":\")).call(t,a)})})),r}return u()(n,[{key:\"render\",value:function(){var e=this.props,t=e.operationServers,n=e.pathServers,r=e.getComponent;if(!t&&!n)return null;var o=r(\"Servers\"),a=t||n,i=t?\"operation\":\"path\";return _.a.createElement(\"div\",{className:\"opblock-section operation-servers\"},_.a.createElement(\"div\",{className:\"opblock-section-header\"},_.a.createElement(\"div\",{className:\"tab-header\"},_.a.createElement(\"h4\",{className:\"opblock-title\"},\"Servers\"))),_.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},_.a.createElement(\"h4\",{className:\"message\"},\"These \",i,\"-level options override the global server options.\"),_.a.createElement(o,{servers:a,currentServer:this.getSelectedServer(),setSelectedServer:this.setSelectedServer,setServerVariableValue:this.setServerVariableValue,getServerVariable:this.getServerVariable,getEffectiveServerValue:this.getEffectiveServerValue})))}}]),n}(_.a.Component))},function(e,t,n){\"use strict\";n.r(t);var r=n(334),o=n(335),a=n(336),i=n(337),s=n(338),u=n(339);t.default={Markdown:r.default,AuthItem:o.default,JsonSchema_string:u.default,VersionStamp:a.default,model:s.default,onlineValidatorBadge:i.default}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"Markdown\",(function(){return h}));var r=n(101),o=n.n(r),a=n(0),i=n.n(a),s=(n(11),n(63)),u=n.n(s),c=n(220),l=n(35),p=n(221),f=new c.a(\"commonmark\");f.block.ruler.enable([\"table\"]),f.set({linkTarget:\"_blank\"});var h=function(e){var t=e.source,n=e.className,r=void 0===n?\"\":n,a=e.getConfigs;if(\"string\"!=typeof t)return null;if(t){var s,c=a().useUnsafeMarkdown,l=f.render(t),h=Object(p.b)(l,{useUnsafeMarkdown:c});return\"string\"==typeof h&&(s=o()(h).call(h)),i.a.createElement(\"div\",{dangerouslySetInnerHTML:{__html:s},className:u()(r,\"renderedMarkdown\")})}return null};h.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}},t.default=Object(l.OAS3ComponentWrapFactory)(h)},function(e,t,n){\"use strict\";n.r(t);var r=n(53),o=n.n(r),a=n(0),i=n.n(a),s=n(35),u=[\"Ori\"];t.default=Object(s.OAS3ComponentWrapFactory)((function(e){var t=e.Ori,n=o()(e,u),r=n.schema,a=n.getComponent,s=n.errSelectors,c=n.authorized,l=n.onAuthChange,p=n.name,f=a(\"HttpAuth\");return\"http\"===r.get(\"type\")?i.a.createElement(f,{key:p,schema:r,name:p,errSelectors:s,authorized:c,getComponent:a,onChange:l}):i.a.createElement(t,n)}))},function(e,t,n){\"use strict\";n.r(t);var r=n(0),o=n.n(r),a=n(35);t.default=Object(a.OAS3ComponentWrapFactory)((function(e){var t=e.Ori;return o.a.createElement(\"span\",null,o.a.createElement(t,e),o.a.createElement(\"small\",{className:\"version-stamp\"},o.a.createElement(\"pre\",{className:\"version\"},\"OAS3\")))}))},function(e,t,n){\"use strict\";n.r(t);var r=n(35),o=n(219);t.default=Object(r.OAS3ComponentWrapFactory)(o.a)},function(e,t,n){\"use strict\";n.r(t);var r=n(28),o=n.n(r),a=n(6),i=n.n(a),s=n(7),u=n.n(s),c=n(8),l=n.n(c),p=n(9),f=n.n(p),h=n(0),d=n.n(h),m=(n(11),n(35)),v=n(222),g=function(e){l()(n,e);var t=f()(n);function n(){return i()(this,n),t.apply(this,arguments)}return u()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getConfigs,n=[\"model-box\"],r=null;return!0===e.schema.get(\"deprecated\")&&(n.push(\"deprecated\"),r=d.a.createElement(\"span\",{className:\"model-deprecated-warning\"},\"Deprecated:\")),d.a.createElement(\"div\",{className:n.join(\" \")},r,d.a.createElement(v.a,o()({},this.props,{getConfigs:t,depth:1,expandDepth:this.props.expandDepth||0})))}}]),n}(h.Component);t.default=Object(m.OAS3ComponentWrapFactory)(g)},function(e,t,n){\"use strict\";n.r(t);var r=n(53),o=n.n(r),a=n(0),i=n.n(a),s=n(35),u=[\"Ori\"];t.default=Object(s.OAS3ComponentWrapFactory)((function(e){var t=e.Ori,n=o()(e,u),r=n.schema,a=n.getComponent,s=n.errors,c=n.onChange,l=r&&r.get?r.get(\"format\"):null,p=r&&r.get?r.get(\"type\"):null,f=a(\"Input\");return p&&\"string\"===p&&l&&(\"binary\"===l||\"base64\"===l)?i.a.createElement(f,{type:\"file\",className:s.length?\"invalid\":\"\",title:s.length?s:\"\",onChange:function(e){c(e.target.files[0])},disabled:t.isDisabled}):i.a.createElement(t,n)}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"selectedServer\",(function(){return w})),n.d(t,\"requestBodyValue\",(function(){return x})),n.d(t,\"shouldRetainRequestBodyValue\",(function(){return E})),n.d(t,\"hasUserEditedBody\",(function(){return S})),n.d(t,\"requestBodyInclusionSetting\",(function(){return C})),n.d(t,\"requestBodyErrors\",(function(){return A})),n.d(t,\"activeExamplesMember\",(function(){return k})),n.d(t,\"requestContentType\",(function(){return O})),n.d(t,\"responseContentType\",(function(){return j})),n.d(t,\"serverVariableValue\",(function(){return T})),n.d(t,\"serverVariables\",(function(){return I})),n.d(t,\"serverEffectiveValue\",(function(){return P})),n.d(t,\"validateBeforeExecute\",(function(){return N})),n.d(t,\"validateShallowRequired\",(function(){return M}));var r=n(14),o=n.n(r),a=n(2),i=n.n(a),s=n(4),u=n.n(s),c=n(23),l=n.n(c),p=n(15),f=n.n(p),h=n(17),d=n.n(h),m=n(1),v=n(35),g=n(171),y=n(5);function b(e){return function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return function(t){var r=t.getSystem().specSelectors.specJson();return Object(v.isOAS3)(r)?e.apply(void 0,n):null}}}var _,w=b((function(e,t){var n=t?[t,\"selectedServer\"]:[\"selectedServer\"];return e.getIn(n)||\"\"})),x=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"bodyValue\"])||null})),E=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"retainBodyValue\"])||!1})),S=function(e,t,n){return function(e){var r=e.getSystem(),o=r.oas3Selectors,a=r.specSelectors,i=a.specJson();if(Object(v.isOAS3)(i)){var s=!1,u=o.requestContentType(t,n),c=o.requestBodyValue(t,n);if(m.Map.isMap(c)&&(c=Object(y.I)(c.mapEntries((function(e){return m.Map.isMap(e[1])?[e[0],e[1].get(\"value\")]:e})).toJS())),m.List.isList(c)&&(c=Object(y.I)(c)),u){var l=Object(g.getDefaultRequestBodyValue)(a.specResolvedSubtree([\"paths\",t,n,\"requestBody\"]),u,o.activeExamplesMember(t,n,\"requestBody\",\"requestBody\"));s=!!c&&c!==l}return s}return null}},C=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"bodyInclusion\"])||Object(m.Map)()})),A=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"errors\"])||null})),k=b((function(e,t,n,r,o){return e.getIn([\"examples\",t,n,r,o,\"activeExample\"])||null})),O=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"requestContentType\"])||null})),j=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"responseContentType\"])||null})),T=b((function(e,t,n){var r;if(\"string\"!=typeof t){var o=t.server,a=t.namespace;r=a?[a,\"serverVariableValues\",o,n]:[\"serverVariableValues\",o,n]}else{r=[\"serverVariableValues\",t,n]}return e.getIn(r)||null})),I=b((function(e,t){var n;if(\"string\"!=typeof t){var r=t.server,o=t.namespace;n=o?[o,\"serverVariableValues\",r]:[\"serverVariableValues\",r]}else{n=[\"serverVariableValues\",t]}return e.getIn(n)||Object(m.OrderedMap)()})),P=b((function(e,t){var n,r;if(\"string\"!=typeof t){var o=t.server,a=t.namespace;r=o,n=a?e.getIn([a,\"serverVariableValues\",r]):e.getIn([\"serverVariableValues\",r])}else r=t,n=e.getIn([\"serverVariableValues\",r]);n=n||Object(m.OrderedMap)();var i=r;return u()(n).call(n,(function(e,t){i=i.replace(new RegExp(\"{\".concat(t,\"}\"),\"g\"),e)})),i})),N=(_=function(e,t){return function(e,t){var n;return t=t||[],!!e.getIn(i()(n=[\"requestData\"]).call(n,o()(t),[\"bodyValue\"]))}(e,t)},function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){var n,r,a=e.getSystem().specSelectors.specJson(),s=i()(n=[]).call(n,t)[1]||[];return!a.getIn(i()(r=[\"paths\"]).call(r,o()(s),[\"requestBody\",\"required\"]))||_.apply(void 0,t)}}),M=function(e,t){var n,r=t.oas3RequiredRequestBodyContentType,o=t.oas3RequestContentType,a=t.oas3RequestBodyValue,i=[];if(!m.Map.isMap(a))return i;var s=[];return l()(n=f()(r.requestContentType)).call(n,(function(e){if(e===o){var t=r.requestContentType[e];l()(t).call(t,(function(e){d()(s).call(s,e)<0&&s.push(e)}))}})),l()(s).call(s,(function(e){a.getIn([e,\"value\"])||i.push(e)})),i}},function(e,t,n){\"use strict\";n.r(t);var r,o=n(3),a=n.n(o),i=n(359),s=n.n(i),u=n(13),c=n.n(u),l=n(125),p=n.n(l),f=n(19),h=n.n(f),d=n(23),m=n.n(d),v=n(29),g=n.n(v),y=n(1),b=n(54);t.default=(r={},a()(r,b.UPDATE_SELECTED_SERVER,(function(e,t){var n=t.payload,r=n.selectedServerUrl,o=n.namespace,a=o?[o,\"selectedServer\"]:[\"selectedServer\"];return e.setIn(a,r)})),a()(r,b.UPDATE_REQUEST_BODY_VALUE,(function(e,t){var n=t.payload,r=n.value,o=n.pathMethod,a=c()(o,2),i=a[0],u=a[1];if(!y.Map.isMap(r))return e.setIn([\"requestData\",i,u,\"bodyValue\"],r);var l,f=e.getIn([\"requestData\",i,u,\"bodyValue\"])||Object(y.Map)();y.Map.isMap(f)||(f=Object(y.Map)());var d=p()(r).call(r),v=s()(d),g=h()(v).call(v,0);return m()(g).call(g,(function(e){var t=r.getIn([e]);f.has(e)&&y.Map.isMap(t)||(l=f.setIn([e,\"value\"],t))})),e.setIn([\"requestData\",i,u,\"bodyValue\"],l)})),a()(r,b.UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG,(function(e,t){var n=t.payload,r=n.value,o=n.pathMethod,a=c()(o,2),i=a[0],s=a[1];return e.setIn([\"requestData\",i,s,\"retainBodyValue\"],r)})),a()(r,b.UPDATE_REQUEST_BODY_INCLUSION,(function(e,t){var n=t.payload,r=n.value,o=n.pathMethod,a=n.name,i=c()(o,2),s=i[0],u=i[1];return e.setIn([\"requestData\",s,u,\"bodyInclusion\",a],r)})),a()(r,b.UPDATE_ACTIVE_EXAMPLES_MEMBER,(function(e,t){var n=t.payload,r=n.name,o=n.pathMethod,a=n.contextType,i=n.contextName,s=c()(o,2),u=s[0],l=s[1];return e.setIn([\"examples\",u,l,a,i,\"activeExample\"],r)})),a()(r,b.UPDATE_REQUEST_CONTENT_TYPE,(function(e,t){var n=t.payload,r=n.value,o=n.pathMethod,a=c()(o,2),i=a[0],s=a[1];return e.setIn([\"requestData\",i,s,\"requestContentType\"],r)})),a()(r,b.UPDATE_RESPONSE_CONTENT_TYPE,(function(e,t){var n=t.payload,r=n.value,o=n.path,a=n.method;return e.setIn([\"requestData\",o,a,\"responseContentType\"],r)})),a()(r,b.UPDATE_SERVER_VARIABLE_VALUE,(function(e,t){var n=t.payload,r=n.server,o=n.namespace,a=n.key,i=n.val,s=o?[o,\"serverVariableValues\",r,a]:[\"serverVariableValues\",r,a];return e.setIn(s,i)})),a()(r,b.SET_REQUEST_BODY_VALIDATE_ERROR,(function(e,t){var n=t.payload,r=n.path,o=n.method,a=n.validationErrors,i=[];if(i.push(\"Required field is not provided\"),a.missingBodyValue)return e.setIn([\"requestData\",r,o,\"errors\"],Object(y.fromJS)(i));if(a.missingRequiredKeys&&a.missingRequiredKeys.length>0){var s=a.missingRequiredKeys;return e.updateIn([\"requestData\",r,o,\"bodyValue\"],Object(y.fromJS)({}),(function(e){return g()(s).call(s,(function(e,t){return e.setIn([t,\"errors\"],Object(y.fromJS)(i))}),e)}))}return console.warn(\"unexpected result: SET_REQUEST_BODY_VALIDATE_ERROR\"),e})),a()(r,b.CLEAR_REQUEST_BODY_VALIDATE_ERROR,(function(e,t){var n=t.payload,r=n.path,o=n.method,a=e.getIn([\"requestData\",r,o,\"bodyValue\"]);if(!y.Map.isMap(a))return e.setIn([\"requestData\",r,o,\"errors\"],Object(y.fromJS)([]));var i=p()(a).call(a),u=s()(i),c=h()(u).call(u,0);return c?e.updateIn([\"requestData\",r,o,\"bodyValue\"],Object(y.fromJS)({}),(function(e){return g()(c).call(c,(function(e,t){return e.setIn([t,\"errors\"],Object(y.fromJS)([]))}),e)})):e})),a()(r,b.CLEAR_REQUEST_BODY_VALUE,(function(e,t){var n=t.payload.pathMethod,r=c()(n,2),o=r[0],a=r[1],i=e.getIn([\"requestData\",o,a,\"bodyValue\"]);return i?y.Map.isMap(i)?e.setIn([\"requestData\",o,a,\"bodyValue\"],Object(y.Map)()):e.setIn([\"requestData\",o,a,\"bodyValue\"],\"\"):e})),r)},function(e,t,n){\"use strict\";n.r(t);var r,o=n(23),a=n.n(o),i=n(125),s=n.n(i),u=n(5),c=n(1109),l={};a()(r=s()(c).call(c)).call(r,(function(e){if(\"./index.js\"!==e){var t=c(e);l[Object(u.D)(e)]=t.default?t.default:t}})),t.default=l},function(e,t,n){\"use strict\";n.r(t);var r={};n.r(r),n.d(r,\"JsonPatchError\",(function(){return $e})),n.d(r,\"deepClone\",(function(){return Je})),n.d(r,\"getValueByPointer\",(function(){return Ge})),n.d(r,\"applyOperation\",(function(){return Ze})),n.d(r,\"applyPatch\",(function(){return Xe})),n.d(r,\"applyReducer\",(function(){return Qe})),n.d(r,\"validator\",(function(){return et})),n.d(r,\"validate\",(function(){return tt})),n.d(r,\"_areEquals\",(function(){return nt}));var o={};n.r(o),n.d(o,\"unobserve\",(function(){return it})),n.d(o,\"observe\",(function(){return st})),n.d(o,\"generate\",(function(){return ut})),n.d(o,\"compare\",(function(){return lt}));var a={};n.r(a),n.d(a,\"path\",(function(){return Fn})),n.d(a,\"query\",(function(){return Un})),n.d(a,\"header\",(function(){return zn})),n.d(a,\"cookie\",(function(){return Vn}));var i=n(2),s=n.n(i),u=n(76),c=n.n(u),l=n(39),p=n.n(l),f=n(49),h=n.n(f),d=n(18),m=n.n(d),v=n(13),g=n.n(v),y=n(31),b=n.n(y),_=n(82),w=n.n(_),x=n(213),E=n.n(x),S=n(32),C=n.n(S),A=n(4),k=n.n(A),O=n(15),j=n.n(O),T=n(214),I=n.n(T),P=n(12),N=n.n(P),M=(n(501),n(223)),R=n.n(M),D=n(74),L=n(215),B=n.n(L),F=n(124),U=n.n(F),q=n(73),z=n(353),V=n(14),W=n.n(V),H=n(19),$=n.n(H),J=n(73).Buffer,K=function(e){return\":/?#[]@!$&'()*+,;=\".indexOf(e)>-1},Y=function(e){return/^[a-z0-9\\-._~]+$/i.test(e)};function G(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=n.escape,o=arguments.length>2?arguments[2]:void 0;return\"number\"==typeof e&&(e=e.toString()),\"string\"==typeof e&&e.length&&r?o?JSON.parse(e):k()(t=W()(e)).call(t,(function(e){var t,n;return Y(e)||K(e)&&\"unsafe\"===r?e:k()(t=k()(n=J.from(e).toJSON().data||[]).call(n,(function(e){var t;return $()(t=\"0\".concat(e.toString(16).toUpperCase())).call(t,-2)}))).call(t,(function(e){return\"%\".concat(e)})).join(\"\")})).join(\"\"):e}function Z(e){var t=e.value;return Array.isArray(t)?function(e){var t=e.key,n=e.value,r=e.style,o=e.explode,a=e.escape,i=function(e){return G(e,{escape:a})};if(\"simple\"===r)return k()(n).call(n,(function(e){return i(e)})).join(\",\");if(\"label\"===r)return\".\".concat(k()(n).call(n,(function(e){return i(e)})).join(\".\"));if(\"matrix\"===r)return k()(n).call(n,(function(e){return i(e)})).reduce((function(e,n){var r,a,i;return!e||o?s()(a=s()(i=\"\".concat(e||\"\",\";\")).call(i,t,\"=\")).call(a,n):s()(r=\"\".concat(e,\",\")).call(r,n)}),\"\");if(\"form\"===r){var u=o?\"&\".concat(t,\"=\"):\",\";return k()(n).call(n,(function(e){return i(e)})).join(u)}if(\"spaceDelimited\"===r){var c=o?\"\".concat(t,\"=\"):\"\";return k()(n).call(n,(function(e){return i(e)})).join(\" \".concat(c))}if(\"pipeDelimited\"===r){var l=o?\"\".concat(t,\"=\"):\"\";return k()(n).call(n,(function(e){return i(e)})).join(\"|\".concat(l))}return}(e):\"object\"===m()(t)?function(e){var t=e.key,n=e.value,r=e.style,o=e.explode,a=e.escape,i=function(e){return G(e,{escape:a})},u=j()(n);if(\"simple\"===r)return u.reduce((function(e,t){var r,a,u,c=i(n[t]),l=o?\"=\":\",\",p=e?\"\".concat(e,\",\"):\"\";return s()(r=s()(a=s()(u=\"\".concat(p)).call(u,t)).call(a,l)).call(r,c)}),\"\");if(\"label\"===r)return u.reduce((function(e,t){var r,a,u,c=i(n[t]),l=o?\"=\":\".\",p=e?\"\".concat(e,\".\"):\".\";return s()(r=s()(a=s()(u=\"\".concat(p)).call(u,t)).call(a,l)).call(r,c)}),\"\");if(\"matrix\"===r&&o)return u.reduce((function(e,t){var r,o,a=i(n[t]),u=e?\"\".concat(e,\";\"):\";\";return s()(r=s()(o=\"\".concat(u)).call(o,t,\"=\")).call(r,a)}),\"\");if(\"matrix\"===r)return u.reduce((function(e,r){var o,a,u=i(n[r]),c=e?\"\".concat(e,\",\"):\";\".concat(t,\"=\");return s()(o=s()(a=\"\".concat(c)).call(a,r,\",\")).call(o,u)}),\"\");if(\"form\"===r)return u.reduce((function(e,t){var r,a,u,c,l=i(n[t]),p=e?s()(r=\"\".concat(e)).call(r,o?\"&\":\",\"):\"\",f=o?\"=\":\",\";return s()(a=s()(u=s()(c=\"\".concat(p)).call(c,t)).call(u,f)).call(a,l)}),\"\");return}(e):function(e){var t,n=e.key,r=e.value,o=e.style,a=e.escape,i=function(e){return G(e,{escape:a})};if(\"simple\"===o)return i(r);if(\"label\"===o)return\".\".concat(i(r));if(\"matrix\"===o)return s()(t=\";\".concat(n,\"=\")).call(t,i(r));if(\"form\"===o)return i(r);if(\"deepObject\"===o)return i(r,{},!0);return}(e)}var X=function(e,t){t.body=e},Q={serializeRes:oe,mergeInQueryOrForm:me};function ee(e){return te.apply(this,arguments)}function te(){return(te=c()(p.a.mark((function e(t){var n,r,o,a,i,s=arguments;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=s.length>1&&void 0!==s[1]?s[1]:{},\"object\"===m()(t)&&(t=(n=t).url),n.headers=n.headers||{},Q.mergeInQueryOrForm(n),n.headers&&j()(n.headers).forEach((function(e){var t=n.headers[e];\"string\"==typeof t&&(n.headers[e]=t.replace(/\\n+/g,\" \"))})),!n.requestInterceptor){e.next=12;break}return e.next=8,n.requestInterceptor(n);case 8:if(e.t0=e.sent,e.t0){e.next=11;break}e.t0=n;case 11:n=e.t0;case 12:return r=n.headers[\"content-type\"]||n.headers[\"Content-Type\"],/multipart\\/form-data/i.test(r)&&n.body instanceof z.FormData&&(delete n.headers[\"content-type\"],delete n.headers[\"Content-Type\"]),e.prev=14,e.next=17,(n.userFetch||fetch)(n.url,n);case 17:return o=e.sent,e.next=20,Q.serializeRes(o,t,n);case 20:if(o=e.sent,!n.responseInterceptor){e.next=28;break}return e.next=24,n.responseInterceptor(o);case 24:if(e.t1=e.sent,e.t1){e.next=27;break}e.t1=o;case 27:o=e.t1;case 28:e.next=39;break;case 30:if(e.prev=30,e.t2=e.catch(14),o){e.next=34;break}throw e.t2;case 34:throw(a=new Error(o.statusText||\"response status is \".concat(o.status))).status=o.status,a.statusCode=o.status,a.responseError=e.t2,a;case 39:if(o.ok){e.next=45;break}throw(i=new Error(o.statusText||\"response status is \".concat(o.status))).status=o.status,i.statusCode=o.status,i.response=o,i;case 45:return e.abrupt(\"return\",o);case 46:case\"end\":return e.stop()}}),e,null,[[14,30]])})))).apply(this,arguments)}var ne=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\";return/(json|xml|yaml|text)\\b/.test(e)};function re(e,t){return t&&(0===t.indexOf(\"application/json\")||t.indexOf(\"+json\")>0)?JSON.parse(e):D.a.load(e)}function oe(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.loadSpec,o=void 0!==r&&r,a={ok:e.ok,url:e.url||t,status:e.status,statusText:e.statusText,headers:ie(e.headers)},i=a.headers[\"content-type\"],s=o||ne(i),u=s?e.text:e.blob||e.buffer;return u.call(e).then((function(e){if(a.text=e,a.data=e,s)try{var t=re(e,i);a.body=t,a.obj=t}catch(e){a.parseError=e}return a}))}function ae(e){return b()(e).call(e,\", \")?e.split(\", \"):e}function ie(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return U()(w()(e))?E()(w()(e).call(e)).reduce((function(e,t){var n=g()(t,2),r=n[0],o=n[1];return e[r]=ae(o),e}),{}):{}}function se(e,t){return t||\"undefined\"==typeof navigator||(t=navigator),t&&\"ReactNative\"===t.product?!(!e||\"object\"!==m()(e)||\"string\"!=typeof e.uri):\"undefined\"!=typeof File&&e instanceof File||(\"undefined\"!=typeof Blob&&e instanceof Blob||(void 0!==q.Buffer&&e instanceof q.Buffer||null!==e&&\"object\"===m()(e)&&\"function\"==typeof e.pipe))}function ue(e,t){return Array.isArray(e)&&e.some((function(e){return se(e,t)}))}var ce={form:\",\",spaceDelimited:\"%20\",pipeDelimited:\"|\"},le={csv:\",\",ssv:\"%20\",tsv:\"%09\",pipes:\"|\"};function pe(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=t.collectionFormat,o=t.allowEmptyValue,a=t.serializationOption,i=t.encoding,s=\"object\"!==m()(t)||Array.isArray(t)?t:t.value,u=n?function(e){return e.toString()}:function(e){return encodeURIComponent(e)},c=u(e);if(void 0===s&&o)return[[c,\"\"]];if(se(s)||ue(s))return[[c,s]];if(a)return fe(e,s,n,a);if(i){if([m()(i.style),m()(i.explode),m()(i.allowReserved)].some((function(e){return\"undefined\"!==e})))return fe(e,s,n,B()(i,[\"style\",\"explode\",\"allowReserved\"]));if(i.contentType){if(\"application/json\"===i.contentType){var l=\"string\"==typeof s?s:C()(s);return[[c,u(l)]]}return[[c,u(s.toString())]]}return\"object\"!==m()(s)?[[c,u(s)]]:Array.isArray(s)&&s.every((function(e){return\"object\"!==m()(e)}))?[[c,k()(s).call(s,u).join(\",\")]]:[[c,u(C()(s))]]}return\"object\"!==m()(s)?[[c,u(s)]]:Array.isArray(s)?\"multi\"===r?[[c,k()(s).call(s,u)]]:[[c,k()(s).call(s,u).join(le[r||\"csv\"])]]:[[c,\"\"]]}function fe(e,t,n,r){var o,a,i,u=r.style||\"form\",c=void 0===r.explode?\"form\"===u:r.explode,l=!n&&(r&&r.allowReserved?\"unsafe\":\"reserved\"),p=function(e){return G(e,{escape:l})},f=n?function(e){return e}:function(e){return G(e,{escape:l})};return\"object\"!==m()(t)?[[f(e),p(t)]]:Array.isArray(t)?c?[[f(e),k()(t).call(t,p)]]:[[f(e),k()(t).call(t,p).join(ce[u])]]:\"deepObject\"===u?k()(a=j()(t)).call(a,(function(n){var r;return[f(s()(r=\"\".concat(e,\"[\")).call(r,n,\"]\")),p(t[n])]})):c?k()(i=j()(t)).call(i,(function(e){return[f(e),p(t[e])]})):[[f(e),k()(o=j()(t)).call(o,(function(e){var n;return[s()(n=\"\".concat(f(e),\",\")).call(n,p(t[e]))]})).join(\",\")]]}function he(e){return I()(e).reduce((function(e,t){var n,r=g()(t,2),o=r[0],a=r[1],i=h()(pe(o,a,!0));try{for(i.s();!(n=i.n()).done;){var s=g()(n.value,2),u=s[0],c=s[1];if(Array.isArray(c)){var l,p=h()(c);try{for(p.s();!(l=p.n()).done;){var f=l.value;e.append(u,f)}}catch(e){p.e(e)}finally{p.f()}}else e.append(u,c)}}catch(e){i.e(e)}finally{i.f()}return e}),new z.FormData)}function de(e){var t=j()(e).reduce((function(t,n){var r,o=h()(pe(n,e[n]));try{for(o.s();!(r=o.n()).done;){var a=g()(r.value,2),i=a[0],s=a[1];t[i]=s}}catch(e){o.e(e)}finally{o.f()}return t}),{});return R.a.stringify(t,{encode:!1,indices:!1})||\"\"}function me(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,n=void 0===t?\"\":t,r=e.query,o=e.form,a=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=N()(t).call(t,(function(e){return e})).join(\"&\");return r?\"?\".concat(r):\"\"};if(o){var i=j()(o).some((function(e){var t=o[e].value;return se(t)||ue(t)})),s=e.headers[\"content-type\"]||e.headers[\"Content-Type\"];if(i||/multipart\\/form-data/i.test(s)){var u=he(e.form);X(u,e)}else e.body=de(o);delete e.form}if(r){var c=n.split(\"?\"),l=g()(c,2),p=l[0],f=l[1],h=\"\";if(f){var d=R.a.parse(f),m=j()(r);m.forEach((function(e){return delete d[e]})),h=R.a.stringify(d,{encode:!0})}var v=a(h,de(r));e.url=p+v,delete e.query}return e}var ve,ge=n(24),ye=n.n(ge),be=n(6),_e=n.n(be),we=n(7),xe=n.n(we),Ee=n(20),Se=n.n(Ee),Ce=n(65),Ae=n.n(Ce),ke=n(532),Oe=n.n(ke),je=n(209),Te=n.n(je),Ie=n(354),Pe=n.n(Ie),Ne=n(3),Me=n.n(Ne),Re=(ve=function(e,t){return(ve=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},function(e,t){function n(){this.constructor=e}ve(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),De=Object.prototype.hasOwnProperty;function Le(e,t){return De.call(e,t)}function Be(e){if(Array.isArray(e)){for(var t=new Array(e.length),n=0;n<t.length;n++)t[n]=\"\"+n;return t}if(Object.keys)return Object.keys(e);t=[];for(var r in e)Le(e,r)&&t.push(r);return t}function Fe(e){switch(typeof e){case\"object\":return JSON.parse(JSON.stringify(e));case\"undefined\":return null;default:return e}}function Ue(e){for(var t,n=0,r=e.length;n<r;){if(!((t=e.charCodeAt(n))>=48&&t<=57))return!1;n++}return!0}function qe(e){return-1===e.indexOf(\"/\")&&-1===e.indexOf(\"~\")?e:e.replace(/~/g,\"~0\").replace(/\\//g,\"~1\")}function ze(e){return e.replace(/~1/g,\"/\").replace(/~0/g,\"~\")}function Ve(e){if(void 0===e)return!0;if(e)if(Array.isArray(e)){for(var t=0,n=e.length;t<n;t++)if(Ve(e[t]))return!0}else if(\"object\"==typeof e){var r=Be(e),o=r.length;for(t=0;t<o;t++)if(Ve(e[r[t]]))return!0}return!1}function We(e,t){var n=[e];for(var r in t){var o=\"object\"==typeof t[r]?JSON.stringify(t[r],null,2):t[r];void 0!==o&&n.push(r+\": \"+o)}return n.join(\"\\n\")}var He=function(e){function t(t,n,r,o,a){var i=this.constructor,s=e.call(this,We(t,{name:n,index:r,operation:o,tree:a}))||this;return s.name=n,s.index=r,s.operation=o,s.tree=a,Object.setPrototypeOf(s,i.prototype),s.message=We(t,{name:n,index:r,operation:o,tree:a}),s}return Re(t,e),t}(Error),$e=He,Je=Fe,Ke={add:function(e,t,n){return e[t]=this.value,{newDocument:n}},remove:function(e,t,n){var r=e[t];return delete e[t],{newDocument:n,removed:r}},replace:function(e,t,n){var r=e[t];return e[t]=this.value,{newDocument:n,removed:r}},move:function(e,t,n){var r=Ge(n,this.path);r&&(r=Fe(r));var o=Ze(n,{op:\"remove\",path:this.from}).removed;return Ze(n,{op:\"add\",path:this.path,value:o}),{newDocument:n,removed:r}},copy:function(e,t,n){var r=Ge(n,this.from);return Ze(n,{op:\"add\",path:this.path,value:Fe(r)}),{newDocument:n}},test:function(e,t,n){return{newDocument:n,test:nt(e[t],this.value)}},_get:function(e,t,n){return this.value=e[t],{newDocument:n}}},Ye={add:function(e,t,n){return Ue(t)?e.splice(t,0,this.value):e[t]=this.value,{newDocument:n,index:t}},remove:function(e,t,n){return{newDocument:n,removed:e.splice(t,1)[0]}},replace:function(e,t,n){var r=e[t];return e[t]=this.value,{newDocument:n,removed:r}},move:Ke.move,copy:Ke.copy,test:Ke.test,_get:Ke._get};function Ge(e,t){if(\"\"==t)return e;var n={op:\"_get\",path:t};return Ze(e,n),n.value}function Ze(e,t,n,r,o,a){if(void 0===n&&(n=!1),void 0===r&&(r=!0),void 0===o&&(o=!0),void 0===a&&(a=0),n&&(\"function\"==typeof n?n(t,0,e,t.path):et(t,0)),\"\"===t.path){var i={newDocument:e};if(\"add\"===t.op)return i.newDocument=t.value,i;if(\"replace\"===t.op)return i.newDocument=t.value,i.removed=e,i;if(\"move\"===t.op||\"copy\"===t.op)return i.newDocument=Ge(e,t.from),\"move\"===t.op&&(i.removed=e),i;if(\"test\"===t.op){if(i.test=nt(e,t.value),!1===i.test)throw new $e(\"Test operation failed\",\"TEST_OPERATION_FAILED\",a,t,e);return i.newDocument=e,i}if(\"remove\"===t.op)return i.removed=e,i.newDocument=null,i;if(\"_get\"===t.op)return t.value=e,i;if(n)throw new $e(\"Operation `op` property is not one of operations defined in RFC-6902\",\"OPERATION_OP_INVALID\",a,t,e);return i}r||(e=Fe(e));var s=(t.path||\"\").split(\"/\"),u=e,c=1,l=s.length,p=void 0,f=void 0,h=void 0;for(h=\"function\"==typeof n?n:et;;){if(f=s[c],o&&\"__proto__\"==f)throw new TypeError(\"JSON-Patch: modifying `__proto__` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README\");if(n&&void 0===p&&(void 0===u[f]?p=s.slice(0,c).join(\"/\"):c==l-1&&(p=t.path),void 0!==p&&h(t,0,e,p)),c++,Array.isArray(u)){if(\"-\"===f)f=u.length;else{if(n&&!Ue(f))throw new $e(\"Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index\",\"OPERATION_PATH_ILLEGAL_ARRAY_INDEX\",a,t,e);Ue(f)&&(f=~~f)}if(c>=l){if(n&&\"add\"===t.op&&f>u.length)throw new $e(\"The specified index MUST NOT be greater than the number of elements in the array\",\"OPERATION_VALUE_OUT_OF_BOUNDS\",a,t,e);if(!1===(i=Ye[t.op].call(t,u,f,e)).test)throw new $e(\"Test operation failed\",\"TEST_OPERATION_FAILED\",a,t,e);return i}}else if(f&&-1!=f.indexOf(\"~\")&&(f=ze(f)),c>=l){if(!1===(i=Ke[t.op].call(t,u,f,e)).test)throw new $e(\"Test operation failed\",\"TEST_OPERATION_FAILED\",a,t,e);return i}u=u[f]}}function Xe(e,t,n,r,o){if(void 0===r&&(r=!0),void 0===o&&(o=!0),n&&!Array.isArray(t))throw new $e(\"Patch sequence must be an array\",\"SEQUENCE_NOT_AN_ARRAY\");r||(e=Fe(e));for(var a=new Array(t.length),i=0,s=t.length;i<s;i++)a[i]=Ze(e,t[i],n,!0,o,i),e=a[i].newDocument;return a.newDocument=e,a}function Qe(e,t,n){var r=Ze(e,t);if(!1===r.test)throw new $e(\"Test operation failed\",\"TEST_OPERATION_FAILED\",n,t,e);return r.newDocument}function et(e,t,n,r){if(\"object\"!=typeof e||null===e||Array.isArray(e))throw new $e(\"Operation is not an object\",\"OPERATION_NOT_AN_OBJECT\",t,e,n);if(!Ke[e.op])throw new $e(\"Operation `op` property is not one of operations defined in RFC-6902\",\"OPERATION_OP_INVALID\",t,e,n);if(\"string\"!=typeof e.path)throw new $e(\"Operation `path` property is not a string\",\"OPERATION_PATH_INVALID\",t,e,n);if(0!==e.path.indexOf(\"/\")&&e.path.length>0)throw new $e('Operation `path` property must start with \"/\"',\"OPERATION_PATH_INVALID\",t,e,n);if((\"move\"===e.op||\"copy\"===e.op)&&\"string\"!=typeof e.from)throw new $e(\"Operation `from` property is not present (applicable in `move` and `copy` operations)\",\"OPERATION_FROM_REQUIRED\",t,e,n);if((\"add\"===e.op||\"replace\"===e.op||\"test\"===e.op)&&void 0===e.value)throw new $e(\"Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)\",\"OPERATION_VALUE_REQUIRED\",t,e,n);if((\"add\"===e.op||\"replace\"===e.op||\"test\"===e.op)&&Ve(e.value))throw new $e(\"Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)\",\"OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED\",t,e,n);if(n)if(\"add\"==e.op){var o=e.path.split(\"/\").length,a=r.split(\"/\").length;if(o!==a+1&&o!==a)throw new $e(\"Cannot perform an `add` operation at the desired path\",\"OPERATION_PATH_CANNOT_ADD\",t,e,n)}else if(\"replace\"===e.op||\"remove\"===e.op||\"_get\"===e.op){if(e.path!==r)throw new $e(\"Cannot perform the operation at a path that does not exist\",\"OPERATION_PATH_UNRESOLVABLE\",t,e,n)}else if(\"move\"===e.op||\"copy\"===e.op){var i=tt([{op:\"_get\",path:e.from,value:void 0}],n);if(i&&\"OPERATION_PATH_UNRESOLVABLE\"===i.name)throw new $e(\"Cannot perform the operation from a path that does not exist\",\"OPERATION_FROM_UNRESOLVABLE\",t,e,n)}}function tt(e,t,n){try{if(!Array.isArray(e))throw new $e(\"Patch sequence must be an array\",\"SEQUENCE_NOT_AN_ARRAY\");if(t)Xe(Fe(t),Fe(e),n||!0);else{n=n||et;for(var r=0;r<e.length;r++)n(e[r],r,t,void 0)}}catch(e){if(e instanceof $e)return e;throw e}}function nt(e,t){if(e===t)return!0;if(e&&t&&\"object\"==typeof e&&\"object\"==typeof t){var n,r,o,a=Array.isArray(e),i=Array.isArray(t);if(a&&i){if((r=e.length)!=t.length)return!1;for(n=r;0!=n--;)if(!nt(e[n],t[n]))return!1;return!0}if(a!=i)return!1;var s=Object.keys(e);if((r=s.length)!==Object.keys(t).length)return!1;for(n=r;0!=n--;)if(!t.hasOwnProperty(s[n]))return!1;for(n=r;0!=n--;)if(!nt(e[o=s[n]],t[o]))return!1;return!0}return e!=e&&t!=t}var rt=new WeakMap,ot=function(e){this.observers=new Map,this.obj=e},at=function(e,t){this.callback=e,this.observer=t};function it(e,t){t.unobserve()}function st(e,t){var n,r=function(e){return rt.get(e)}(e);if(r){var o=function(e,t){return e.observers.get(t)}(r,t);n=o&&o.observer}else r=new ot(e),rt.set(e,r);if(n)return n;if(n={},r.value=Fe(e),t){n.callback=t,n.next=null;var a=function(){ut(n)},i=function(){clearTimeout(n.next),n.next=setTimeout(a)};\"undefined\"!=typeof window&&(window.addEventListener(\"mouseup\",i),window.addEventListener(\"keyup\",i),window.addEventListener(\"mousedown\",i),window.addEventListener(\"keydown\",i),window.addEventListener(\"change\",i))}return n.patches=[],n.object=e,n.unobserve=function(){ut(n),clearTimeout(n.next),function(e,t){e.observers.delete(t.callback)}(r,n),\"undefined\"!=typeof window&&(window.removeEventListener(\"mouseup\",i),window.removeEventListener(\"keyup\",i),window.removeEventListener(\"mousedown\",i),window.removeEventListener(\"keydown\",i),window.removeEventListener(\"change\",i))},r.observers.set(t,new at(t,n)),n}function ut(e,t){void 0===t&&(t=!1);var n=rt.get(e.object);ct(n.value,e.object,e.patches,\"\",t),e.patches.length&&Xe(n.value,e.patches);var r=e.patches;return r.length>0&&(e.patches=[],e.callback&&e.callback(r)),r}function ct(e,t,n,r,o){if(t!==e){\"function\"==typeof t.toJSON&&(t=t.toJSON());for(var a=Be(t),i=Be(e),s=!1,u=i.length-1;u>=0;u--){var c=e[p=i[u]];if(!Le(t,p)||void 0===t[p]&&void 0!==c&&!1===Array.isArray(t))Array.isArray(e)===Array.isArray(t)?(o&&n.push({op:\"test\",path:r+\"/\"+qe(p),value:Fe(c)}),n.push({op:\"remove\",path:r+\"/\"+qe(p)}),s=!0):(o&&n.push({op:\"test\",path:r,value:e}),n.push({op:\"replace\",path:r,value:t}),!0);else{var l=t[p];\"object\"==typeof c&&null!=c&&\"object\"==typeof l&&null!=l?ct(c,l,n,r+\"/\"+qe(p),o):c!==l&&(!0,o&&n.push({op:\"test\",path:r+\"/\"+qe(p),value:Fe(c)}),n.push({op:\"replace\",path:r+\"/\"+qe(p),value:Fe(l)}))}}if(s||a.length!=i.length)for(u=0;u<a.length;u++){var p;Le(e,p=a[u])||void 0===t[p]||n.push({op:\"add\",path:r+\"/\"+qe(p),value:Fe(t[p])})}}}function lt(e,t,n){void 0===n&&(n=!1);var r=[];return ct(e,t,r,\"\",n),r}Object.assign({},r,o,{JsonPatchError:He,deepClone:Fe,escapePathComponent:qe,unescapePathComponent:ze});var pt=n(81),ft=n.n(pt),ht=n(533),dt=n.n(ht),mt={add:function(e,t){return{op:\"add\",path:e,value:t}},replace:gt,remove:function(e){return{op:\"remove\",path:e}},merge:function(e,t){return{type:\"mutation\",op:\"merge\",path:e,value:t}},mergeDeep:function(e,t){return{type:\"mutation\",op:\"mergeDeep\",path:e,value:t}},context:function(e,t){return{type:\"context\",path:e,value:t}},getIn:function(e,t){return t.reduce((function(e,t){return void 0!==t&&e?e[t]:e}),e)},applyPatch:function(e,t,n){if(n=n||{},\"merge\"===(t=ye()(ye()({},t),{},{path:t.path&&vt(t.path)})).op){var r=Tt(e,t.path);Se()(r,t.value),Xe(e,[gt(t.path,r)])}else if(\"mergeDeep\"===t.op){var o=Tt(e,t.path);for(var a in t.value){var i=t.value[a],u=Array.isArray(i);if(u){var c=o[a]||[];o[a]=s()(c).call(c,i)}else if(St(i)&&!u){var l=ye()({},o[a]);for(var p in i){if(Object.prototype.hasOwnProperty.call(l,p)){l=ft()(dt()(l),i);break}Se()(l,Me()({},p,i[p]))}o[a]=l}else o[a]=i}}else if(\"add\"===t.op&&\"\"===t.path&&St(t.value)){var f=j()(t.value).reduce((function(e,n){return e.push({op:\"add\",path:\"/\".concat(vt(n)),value:t.value[n]}),e}),[]);Xe(e,f)}else if(\"replace\"===t.op&&\"\"===t.path){var h=t.value;n.allowMetaPatches&&t.meta&&Ot(t)&&(Array.isArray(t.value)||St(t.value))&&(h=ye()(ye()({},h),t.meta)),e=h}else if(Xe(e,[t]),n.allowMetaPatches&&t.meta&&Ot(t)&&(Array.isArray(t.value)||St(t.value))){var d=Tt(e,t.path),m=ye()(ye()({},d),t.meta);Xe(e,[gt(t.path,m)])}return e},parentPathMatch:function(e,t){if(!Array.isArray(t))return!1;for(var n=0,r=t.length;n<r;n+=1)if(t[n]!==e[n])return!1;return!0},flatten:xt,fullyNormalizeArray:function(e){return Et(xt(wt(e)))},normalizeArray:wt,isPromise:function(e){return St(e)&&Ct(e.then)},forEachNew:function(e,t){try{return yt(e,_t,t)}catch(e){return e}},forEachNewPrimitive:function(e,t){try{return yt(e,bt,t)}catch(e){return e}},isJsonPatch:At,isContextPatch:function(e){return jt(e)&&\"context\"===e.type},isPatch:jt,isMutation:kt,isAdditiveMutation:Ot,isGenerator:function(e){return\"[object GeneratorFunction]\"===Object.prototype.toString.call(e)},isFunction:Ct,isObject:St,isError:function(e){return e instanceof Error}};function vt(e){return Array.isArray(e)?e.length<1?\"\":\"/\".concat(k()(e).call(e,(function(e){return(e+\"\").replace(/~/g,\"~0\").replace(/\\//g,\"~1\")})).join(\"/\")):e}function gt(e,t,n){return{op:\"replace\",path:e,value:t,meta:n}}function yt(e,t,n){var r;return Et(xt(k()(r=N()(e).call(e,Ot)).call(r,(function(e){return t(e.value,n,e.path)}))||[]))}function bt(e,t,n){return n=n||[],Array.isArray(e)?k()(e).call(e,(function(e,r){return bt(e,t,s()(n).call(n,r))})):St(e)?k()(r=j()(e)).call(r,(function(r){return bt(e[r],t,s()(n).call(n,r))})):t(e,n[n.length-1],n);var r}function _t(e,t,n){var r=[];if((n=n||[]).length>0){var o=t(e,n[n.length-1],n);o&&(r=s()(r).call(r,o))}if(Array.isArray(e)){var a=k()(e).call(e,(function(e,r){return _t(e,t,s()(n).call(n,r))}));a&&(r=s()(r).call(r,a))}else if(St(e)){var i,u=k()(i=j()(e)).call(i,(function(r){return _t(e[r],t,s()(n).call(n,r))}));u&&(r=s()(r).call(r,u))}return r=xt(r)}function wt(e){return Array.isArray(e)?e:[e]}function xt(e){var t;return s()(t=[]).apply(t,W()(k()(e).call(e,(function(e){return Array.isArray(e)?xt(e):e}))))}function Et(e){return N()(e).call(e,(function(e){return void 0!==e}))}function St(e){return e&&\"object\"===m()(e)}function Ct(e){return e&&\"function\"==typeof e}function At(e){if(jt(e)){var t=e.op;return\"add\"===t||\"remove\"===t||\"replace\"===t}return!1}function kt(e){return At(e)||jt(e)&&\"mutation\"===e.type}function Ot(e){return kt(e)&&(\"add\"===e.op||\"replace\"===e.op||\"merge\"===e.op||\"mergeDeep\"===e.op)}function jt(e){return e&&\"object\"===m()(e)}function Tt(e,t){try{return Ge(e,t)}catch(e){return console.error(e),{}}}var It=n(534),Pt=n.n(It),Nt=n(355),Mt=n.n(Nt),Rt=n(83),Dt=n.n(Rt);function Lt(e,t){function n(){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack;for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];this.message=n[0],t&&t.apply(this,n)}return n.prototype=new Error,n.prototype.name=e,n.prototype.constructor=n,n}var Bt=n(535),Ft=n.n(Bt),Ut=n(212),qt=n.n(Ut),zt=[\"properties\"],Vt=[\"properties\"],Wt=[\"definitions\",\"parameters\",\"responses\",\"securityDefinitions\",\"components/schemas\",\"components/responses\",\"components/parameters\",\"components/securitySchemes\"],Ht=[\"schema/example\",\"items/example\"];function $t(e){var t=e[e.length-1],n=e[e.length-2],r=e.join(\"/\");return zt.indexOf(t)>-1&&-1===Vt.indexOf(n)||Wt.indexOf(r)>-1||Ht.some((function(e){return r.indexOf(e)>-1}))}function Jt(e,t){var n,r=e.split(\"#\"),o=g()(r,2),a=o[0],i=o[1],u=Dt.a.resolve(a||\"\",t||\"\");return i?s()(n=\"\".concat(u,\"#\")).call(n,i):u}var Kt=\"application/json, application/yaml\",Yt=new RegExp(\"^([a-z]+://|//)\",\"i\"),Gt=Lt(\"JSONRefError\",(function(e,t,n){this.originalError=n,Se()(this,t||{})})),Zt={},Xt=new Pt.a,Qt=[function(e){return\"paths\"===e[0]&&\"responses\"===e[3]&&\"examples\"===e[5]},function(e){return\"paths\"===e[0]&&\"responses\"===e[3]&&\"content\"===e[5]&&\"example\"===e[7]},function(e){return\"paths\"===e[0]&&\"responses\"===e[3]&&\"content\"===e[5]&&\"examples\"===e[7]&&\"value\"===e[9]},function(e){return\"paths\"===e[0]&&\"requestBody\"===e[3]&&\"content\"===e[4]&&\"example\"===e[6]},function(e){return\"paths\"===e[0]&&\"requestBody\"===e[3]&&\"content\"===e[4]&&\"examples\"===e[6]&&\"value\"===e[8]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"example\"===e[4]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"example\"===e[5]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"examples\"===e[4]&&\"value\"===e[6]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"examples\"===e[5]&&\"value\"===e[7]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"content\"===e[4]&&\"example\"===e[6]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"content\"===e[4]&&\"examples\"===e[6]&&\"value\"===e[8]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"content\"===e[4]&&\"example\"===e[7]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"content\"===e[5]&&\"examples\"===e[7]&&\"value\"===e[9]}],en={key:\"$ref\",plugin:function(e,t,n,r){var o=r.getInstance(),a=$()(n).call(n,0,-1);if(!$t(a)&&(i=a,!Qt.some((function(e){return e(i)})))){var i,u=r.getContext(n).baseDoc;if(\"string\"!=typeof e)return new Gt(\"$ref: must be a string (JSON-Ref)\",{$ref:e,baseDoc:u,fullPath:n});var c,l,p,f=an(e),h=f[0],d=f[1]||\"\";try{c=u||h?rn(h,u):null}catch(t){return on(t,{pointer:d,$ref:e,basePath:c,fullPath:n})}if(function(e,t,n,r){var o,a,i=Xt.get(r);i||(i={},Xt.set(r,i));var u=function(e){if(0===e.length)return\"\";return\"/\".concat(k()(e).call(e,fn).join(\"/\"))}(n),c=s()(o=\"\".concat(t||\"<specmap-base>\",\"#\")).call(o,e),l=u.replace(/allOf\\/\\d+\\/?/g,\"\"),p=r.contextTree.get([]).baseDoc;if(t===p&&hn(l,e))return!0;var f=\"\";if(n.some((function(e){var t;return f=s()(t=\"\".concat(f,\"/\")).call(t,fn(e)),i[f]&&i[f].some((function(e){return hn(e,c)||hn(c,e)}))})))return!0;return void(i[l]=s()(a=i[l]||[]).call(a,c))}(d,c,a,r)&&!o.useCircularStructures){var m=Jt(e,c);return e===m?null:mt.replace(n,m)}if(null==c?(p=ln(d),void 0===(l=r.get(p))&&(l=new Gt(\"Could not resolve reference: \".concat(e),{pointer:d,$ref:e,baseDoc:u,fullPath:n}))):l=null!=(l=sn(c,d)).__value?l.__value:l.catch((function(t){throw on(t,{pointer:d,$ref:e,baseDoc:u,fullPath:n})})),l instanceof Error)return[mt.remove(n),l];var v=Jt(e,c),g=mt.replace(a,l,{$$ref:v});if(c&&c!==u)return[g,mt.context(a,{baseDoc:c})];try{if(!function(e,t){var n=[e];return t.path.reduce((function(e,t){return n.push(e[t]),e[t]}),e),r(t.value);function r(e){return mt.isObject(e)&&(n.indexOf(e)>=0||j()(e).some((function(t){return r(e[t])})))}}(r.state,g)||o.useCircularStructures)return g}catch(e){return null}}}},tn=Se()(en,{docCache:Zt,absoluteify:rn,clearCache:function(e){void 0!==e?delete Zt[e]:j()(Zt).forEach((function(e){delete Zt[e]}))},JSONRefError:Gt,wrapError:on,getDoc:un,split:an,extractFromDoc:sn,fetchJSON:function(e){return fetch(e,{headers:{Accept:Kt},loadSpec:!0}).then((function(e){return e.text()})).then((function(e){return D.a.load(e)}))},extract:cn,jsonPointerToArray:ln,unescapeJsonPointerToken:pn}),nn=tn;function rn(e,t){if(!Yt.test(e)){var n;if(!t)throw new Gt(s()(n=\"Tried to resolve a relative URL, without having a basePath. path: '\".concat(e,\"' basePath: '\")).call(n,t,\"'\"));return Dt.a.resolve(t,e)}return e}function on(e,t){var n,r;e&&e.response&&e.response.body?n=s()(r=\"\".concat(e.response.body.code,\" \")).call(r,e.response.body.message):n=e.message;return new Gt(\"Could not resolve reference: \".concat(n),t,e)}function an(e){return(e+\"\").split(\"#\")}function sn(e,t){var n=Zt[e];if(n&&!mt.isPromise(n))try{var r=cn(t,n);return Se()(Ae.a.resolve(r),{__value:r})}catch(e){return Ae.a.reject(e)}return un(e).then((function(e){return cn(t,e)}))}function un(e){var t=Zt[e];return t?mt.isPromise(t)?t:Ae.a.resolve(t):(Zt[e]=tn.fetchJSON(e).then((function(t){return Zt[e]=t,t})),Zt[e])}function cn(e,t){var n=ln(e);if(n.length<1)return t;var r=mt.getIn(t,n);if(void 0===r)throw new Gt(\"Could not resolve pointer: \".concat(e,\" does not exist in document\"),{pointer:e});return r}function ln(e){var t;if(\"string\"!=typeof e)throw new TypeError(\"Expected a string, got a \".concat(m()(e)));return\"/\"===e[0]&&(e=e.substr(1)),\"\"===e?[]:k()(t=e.split(\"/\")).call(t,pn)}function pn(e){return\"string\"!=typeof e?e:Mt.a.unescape(e.replace(/~1/g,\"/\").replace(/~0/g,\"~\"))}function fn(e){return Mt.a.escape(e.replace(/~/g,\"~0\").replace(/\\//g,\"~1\"))}function hn(e,t){if(!(n=t)||\"/\"===n||\"#\"===n)return!0;var n,r=e.charAt(t.length),o=$()(t).call(t,-1);return 0===e.indexOf(t)&&(!r||\"/\"===r||\"#\"===r)&&\"#\"!==o}var dn=n(104),mn=n.n(dn),vn={key:\"allOf\",plugin:function(e,t,n,r,o){if(!o.meta||!o.meta.$$ref){var a=$()(n).call(n,0,-1);if(!$t(a)){if(!Array.isArray(e)){var i=new TypeError(\"allOf must be an array\");return i.fullPath=n,i}var u=!1,c=o.value;if(a.forEach((function(e){c&&(c=c[e])})),c=ye()({},c),!mn()(c)){delete c.allOf;var l,p=[];if(p.push(r.replace(a,{})),e.forEach((function(e,t){if(!r.isObject(e)){if(u)return null;u=!0;var o=new TypeError(\"Elements in allOf must be objects\");return o.fullPath=n,p.push(o)}p.push(r.mergeDeep(a,e));var i=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.specmap,o=n.getBaseUrlForNodePath,a=void 0===o?function(e){var n;return r.getContext(s()(n=[]).call(n,W()(t),W()(e))).baseDoc}:o,i=n.targetKeys,u=void 0===i?[\"$ref\",\"$$ref\"]:i,c=[];return Ft()(e).forEach((function(){if(b()(u).call(u,this.key)&&qt()(this.node)){var e=this.path,n=s()(t).call(t,this.path),o=Jt(this.node,a(e));c.push(r.replace(n,o))}})),c}(e,$()(n).call(n,0,-1),{getBaseUrlForNodePath:function(e){var o;return r.getContext(s()(o=[]).call(o,W()(n),[t],W()(e))).baseDoc},specmap:r});p.push.apply(p,W()(i))})),p.push(r.mergeDeep(a,c)),!c.$$ref)p.push(r.remove(s()(l=[]).call(l,a,\"$$ref\")));return p}}}}},gn={key:\"parameters\",plugin:function(e,t,n,r){if(Array.isArray(e)&&e.length){var o=Se()([],e),a=$()(n).call(n,0,-1),i=ye()({},mt.getIn(r.spec,a));return e.forEach((function(e,t){try{o[t].default=r.parameterMacro(i,e)}catch(e){var a=new Error(e);return a.fullPath=n,a}})),mt.replace(n,o)}return mt.replace(n,e)}},yn={key:\"properties\",plugin:function(e,t,n,r){var o=ye()({},e);for(var a in e)try{o[a].default=r.modelPropertyMacro(o[a])}catch(e){var i=new Error(e);return i.fullPath=n,i}return mt.replace(n,o)}},bn=function(){function e(t){_e()(this,e),this.root=_n(t||{})}return xe()(e,[{key:\"set\",value:function(e,t){var n=this.getParent(e,!0);if(n){var r=e[e.length-1],o=n.children;o[r]?wn(o[r],t,n):o[r]=_n(t,n)}else wn(this.root,t,null)}},{key:\"get\",value:function(e){if((e=e||[]).length<1)return this.root.value;for(var t,n,r=this.root,o=0;o<e.length&&(n=e[o],(t=r.children)[n]);o+=1)r=t[n];return r&&r.protoValue}},{key:\"getParent\",value:function(e,t){return!e||e.length<1?null:e.length<2?this.root:$()(e).call(e,0,-1).reduce((function(e,n){if(!e)return e;var r=e.children;return!r[n]&&t&&(r[n]=_n(null,e)),r[n]}),this.root)}}]),e}();function _n(e,t){return wn({children:{}},e,t)}function wn(e,t,n){return e.value=t||{},e.protoValue=n?ye()(ye()({},n.protoValue),e.value):e.value,j()(e.children).forEach((function(t){var n=e.children[t];e.children[t]=wn(n,n.value,e)})),e}var xn=function(){function e(t){var n,r,o=this;_e()(this,e),Se()(this,{spec:\"\",debugLevel:\"info\",plugins:[],pluginHistory:{},errors:[],mutations:[],promisedPatches:[],state:{},patches:[],context:{},contextTree:new bn,showDebug:!1,allPatches:[],pluginProp:\"specMap\",libMethods:Se()(Object.create(this),mt,{getInstance:function(){return o}}),allowMetaPatches:!1},t),this.get=this._get.bind(this),this.getContext=this._getContext.bind(this),this.hasRun=this._hasRun.bind(this),this.wrappedPlugins=N()(n=k()(r=this.plugins).call(r,this.wrapPlugin.bind(this))).call(n,mt.isFunction),this.patches.push(mt.add([],this.spec)),this.patches.push(mt.context([],this.context)),this.updatePatches(this.patches)}return xe()(e,[{key:\"debug\",value:function(e){if(this.debugLevel===e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];(t=console).log.apply(t,r)}}},{key:\"verbose\",value:function(e){if(\"verbose\"===this.debugLevel){for(var t,n,r=arguments.length,o=new Array(r>1?r-1:0),a=1;a<r;a++)o[a-1]=arguments[a];(t=console).log.apply(t,s()(n=[\"[\".concat(e,\"]   \")]).call(n,o))}}},{key:\"wrapPlugin\",value:function(e,t){var n,r,o,a=this.pathDiscriminator,i=null;return e[this.pluginProp]?(i=e,n=e[this.pluginProp]):mt.isFunction(e)?n=e:mt.isObject(e)&&(r=e,o=function(e,t){return!Array.isArray(e)||e.every((function(e,n){return e===t[n]}))},n=p.a.mark((function e(t,n){var i,u,c,l,f,d;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:d=function(e,t,c){var l,f,h,m,v,g,y,b,_,w,x,E,S;return p.a.wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(mt.isObject(e)){i.next=6;break}if(r.key!==t[t.length-1]){i.next=4;break}return i.next=4,r.plugin(e,r.key,t,n);case 4:i.next=30;break;case 6:l=t.length-1,f=t[l],h=t.indexOf(\"properties\"),m=\"properties\"===f&&l===h,v=n.allowMetaPatches&&u[e.$$ref],g=0,y=j()(e);case 12:if(!(g<y.length)){i.next=30;break}if(b=y[g],_=e[b],w=s()(t).call(t,b),x=mt.isObject(_),E=e.$$ref,v){i.next=22;break}if(!x){i.next=22;break}return n.allowMetaPatches&&E&&(u[E]=!0),i.delegateYield(d(_,w,c),\"t0\",22);case 22:if(m||b!==r.key){i.next=27;break}if(S=o(a,t),a&&!S){i.next=27;break}return i.next=27,r.plugin(_,b,w,n,c);case 27:g++,i.next=12;break;case 30:case\"end\":return i.stop()}}),i)},i=p.a.mark(d),u={},c=h()(N()(t).call(t,mt.isAdditiveMutation)),e.prev=4,c.s();case 6:if((l=c.n()).done){e.next=11;break}return f=l.value,e.delegateYield(d(f.value,f.path,f),\"t0\",9);case 9:e.next=6;break;case 11:e.next=16;break;case 13:e.prev=13,e.t1=e.catch(4),c.e(e.t1);case 16:return e.prev=16,c.f(),e.finish(16);case 19:case\"end\":return e.stop()}}),e,null,[[4,13,16,19]])}))),Se()(n.bind(i),{pluginName:e.name||t,isGenerator:mt.isGenerator(n)})}},{key:\"nextPlugin\",value:function(){var e=this;return Te()(this.wrappedPlugins,(function(t){return e.getMutationsForPlugin(t).length>0}))}},{key:\"nextPromisedPatch\",value:function(){var e;if(this.promisedPatches.length>0)return Ae.a.race(k()(e=this.promisedPatches).call(e,(function(e){return e.value})))}},{key:\"getPluginHistory\",value:function(e){var t=this.constructor.getPluginName(e);return this.pluginHistory[t]||[]}},{key:\"getPluginRunCount\",value:function(e){return this.getPluginHistory(e).length}},{key:\"getPluginHistoryTip\",value:function(e){var t=this.getPluginHistory(e);return t&&t[t.length-1]||{}}},{key:\"getPluginMutationIndex\",value:function(e){var t=this.getPluginHistoryTip(e).mutationIndex;return\"number\"!=typeof t?-1:t}},{key:\"updatePluginHistory\",value:function(e,t){var n=this.constructor.getPluginName(e);this.pluginHistory[n]=this.pluginHistory[n]||[],this.pluginHistory[n].push(t)}},{key:\"updatePatches\",value:function(e){var t=this;mt.normalizeArray(e).forEach((function(e){if(e instanceof Error)t.errors.push(e);else try{if(!mt.isObject(e))return void t.debug(\"updatePatches\",\"Got a non-object patch\",e);if(t.showDebug&&t.allPatches.push(e),mt.isPromise(e.value))return t.promisedPatches.push(e),void t.promisedPatchThen(e);if(mt.isContextPatch(e))return void t.setContext(e.path,e.value);if(mt.isMutation(e))return void t.updateMutations(e)}catch(e){console.error(e),t.errors.push(e)}}))}},{key:\"updateMutations\",value:function(e){\"object\"===m()(e.value)&&!Array.isArray(e.value)&&this.allowMetaPatches&&(e.value=ye()({},e.value));var t=mt.applyPatch(this.state,e,{allowMetaPatches:this.allowMetaPatches});t&&(this.mutations.push(e),this.state=t)}},{key:\"removePromisedPatch\",value:function(e){var t,n=this.promisedPatches.indexOf(e);n<0?this.debug(\"Tried to remove a promisedPatch that isn't there!\"):Oe()(t=this.promisedPatches).call(t,n,1)}},{key:\"promisedPatchThen\",value:function(e){var t=this;return e.value=e.value.then((function(n){var r=ye()(ye()({},e),{},{value:n});t.removePromisedPatch(e),t.updatePatches(r)})).catch((function(n){t.removePromisedPatch(e),t.updatePatches(n)})),e.value}},{key:\"getMutations\",value:function(e,t){var n;return e=e||0,\"number\"!=typeof t&&(t=this.mutations.length),$()(n=this.mutations).call(n,e,t)}},{key:\"getCurrentMutations\",value:function(){return this.getMutationsForPlugin(this.getCurrentPlugin())}},{key:\"getMutationsForPlugin\",value:function(e){var t=this.getPluginMutationIndex(e);return this.getMutations(t+1)}},{key:\"getCurrentPlugin\",value:function(){return this.currentPlugin}},{key:\"getLib\",value:function(){return this.libMethods}},{key:\"_get\",value:function(e){return mt.getIn(this.state,e)}},{key:\"_getContext\",value:function(e){return this.contextTree.get(e)}},{key:\"setContext\",value:function(e,t){return this.contextTree.set(e,t)}},{key:\"_hasRun\",value:function(e){return this.getPluginRunCount(this.getCurrentPlugin())>(e||0)}},{key:\"dispatch\",value:function(){var e,t=this,n=this,r=this.nextPlugin();if(!r){var o=this.nextPromisedPatch();if(o)return o.then((function(){return t.dispatch()})).catch((function(){return t.dispatch()}));var a={spec:this.state,errors:this.errors};return this.showDebug&&(a.patches=this.allPatches),Ae.a.resolve(a)}if(n.pluginCount=n.pluginCount||{},n.pluginCount[r]=(n.pluginCount[r]||0)+1,n.pluginCount[r]>100)return Ae.a.resolve({spec:n.state,errors:s()(e=n.errors).call(e,new Error(\"We've reached a hard limit of \".concat(100,\" plugin runs\")))});if(r!==this.currentPlugin&&this.promisedPatches.length){var i,u=k()(i=this.promisedPatches).call(i,(function(e){return e.value}));return Ae.a.all(k()(u).call(u,(function(e){return e.then(Pe.a,Pe.a)}))).then((function(){return t.dispatch()}))}return function(){n.currentPlugin=r;var e=n.getCurrentMutations(),t=n.mutations.length-1;try{if(r.isGenerator){var o,a=h()(r(e,n.getLib()));try{for(a.s();!(o=a.n()).done;){c(o.value)}}catch(e){a.e(e)}finally{a.f()}}else{c(r(e,n.getLib()))}}catch(e){console.error(e),c([Se()(Object.create(e),{plugin:r})])}finally{n.updatePluginHistory(r,{mutationIndex:t})}return n.dispatch()}();function c(e){e&&(e=mt.fullyNormalizeArray(e),n.updatePatches(e,r))}}}],[{key:\"getPluginName\",value:function(e){return e.pluginName}},{key:\"getPatchesOfType\",value:function(e,t){return N()(e).call(e,t)}}]),e}();var En={refs:nn,allOf:vn,parameters:gn,properties:yn},Sn=n(58);function Cn(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.requestInterceptor,r=t.responseInterceptor,o=e.withCredentials?\"include\":\"same-origin\";return function(t){return e({url:t,loadSpec:!0,requestInterceptor:n,responseInterceptor:r,headers:{Accept:Kt},credentials:o}).then((function(e){return e.body}))}}function An(e){var t=e.fetch,n=e.spec,r=e.url,o=e.mode,a=e.allowMetaPatches,i=void 0===a||a,s=e.pathDiscriminator,u=e.modelPropertyMacro,l=e.parameterMacro,f=e.requestInterceptor,h=e.responseInterceptor,d=e.skipNormalization,m=e.useCircularStructures,v=e.http,g=e.baseDoc;return g=g||r,v=t||v||ee,n?y(n):Cn(v,{requestInterceptor:f,responseInterceptor:h})(g).then(y);function y(e){g&&(En.refs.docCache[g]=e),En.refs.fetchJSON=Cn(v,{requestInterceptor:f,responseInterceptor:h});var t,n=[En.refs];return\"function\"==typeof l&&n.push(En.parameters),\"function\"==typeof u&&n.push(En.properties),\"strict\"!==o&&n.push(En.allOf),(t={spec:e,context:{baseDoc:g},plugins:n,allowMetaPatches:i,pathDiscriminator:s,parameterMacro:l,modelPropertyMacro:u,useCircularStructures:m},new xn(t).dispatch()).then(d?function(){var e=c()(p.a.mark((function e(t){return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt(\"return\",t);case 1:case\"end\":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}():Sn.d)}}var kn=n(53),On=n.n(kn),jn=n(43),Tn=n.n(jn),In=n(144),Pn=n.n(In),Nn=n(50),Mn=n.n(Nn),Rn=n(536),Dn=n.n(Rn),Ln={body:function(e){var t=e.req,n=e.value;t.body=n},header:function(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{},void 0!==r&&(t.headers[n.name]=r)},query:function(e){var t=e.req,n=e.value,r=e.parameter;t.query=t.query||{},!1===n&&\"boolean\"===r.type&&(n=\"false\");0===n&&[\"number\",\"integer\"].indexOf(r.type)>-1&&(n=\"0\");if(n)t.query[r.name]={collectionFormat:r.collectionFormat,value:n};else if(r.allowEmptyValue&&void 0!==n){var o=r.name;t.query[o]=t.query[o]||{},t.query[o].allowEmptyValue=!0}},path:function(e){var t=e.req,n=e.value,r=e.parameter;t.url=t.url.split(\"{\".concat(r.name,\"}\")).join(encodeURIComponent(n))},formData:function(e){var t=e.req,n=e.value,r=e.parameter;(n||r.allowEmptyValue)&&(t.form=t.form||{},t.form[r.name]={value:n,allowEmptyValue:r.allowEmptyValue,collectionFormat:r.collectionFormat})}};function Bn(e,t){return b()(t).call(t,\"application/json\")?\"string\"==typeof e?e:C()(e):e.toString()}function Fn(e){var t=e.req,n=e.value,r=e.parameter,o=r.name,a=r.style,i=r.explode,s=r.content;if(s){var u=j()(s)[0];t.url=t.url.split(\"{\".concat(o,\"}\")).join(G(Bn(n,u),{escape:!0}))}else{var c=Z({key:r.name,value:n,style:a||\"simple\",explode:i||!1,escape:!0});t.url=t.url.split(\"{\".concat(o,\"}\")).join(c)}}function Un(e){var t=e.req,n=e.value,r=e.parameter;if(t.query=t.query||{},r.content){var o=j()(r.content)[0];t.query[r.name]=Bn(n,o)}else if(!1===n&&(n=\"false\"),0===n&&(n=\"0\"),n)t.query[r.name]={value:n,serializationOption:B()(r,[\"style\",\"explode\",\"allowReserved\"])};else if(r.allowEmptyValue&&void 0!==n){var a=r.name;t.query[a]=t.query[a]||{},t.query[a].allowEmptyValue=!0}}var qn=[\"accept\",\"authorization\",\"content-type\"];function zn(e){var t=e.req,n=e.parameter,r=e.value;if(t.headers=t.headers||{},!(qn.indexOf(n.name.toLowerCase())>-1))if(n.content){var o=j()(n.content)[0];t.headers[n.name]=Bn(r,o)}else void 0!==r&&(t.headers[n.name]=Z({key:n.name,value:r,style:n.style||\"simple\",explode:void 0!==n.explode&&n.explode,escape:!1}))}function Vn(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{};var o=m()(r);if(n.content){var a,i=j()(n.content)[0];t.headers.Cookie=s()(a=\"\".concat(n.name,\"=\")).call(a,Bn(r,i))}else if(\"undefined\"!==o){var u=\"object\"===o&&!Array.isArray(r)&&n.explode?\"\":\"\".concat(n.name,\"=\");t.headers.Cookie=u+Z({key:n.name,value:r,escape:!1,style:n.style||\"form\",explode:void 0!==n.explode&&n.explode})}}var Wn=n(216),Hn=n.n(Wn),$n=n(217),Jn=n.n($n);function Kn(e,t){var n=e.operation,r=e.requestBody,o=e.securities,a=e.spec,i=e.attachContentTypeForEmptyPayload,u=e.requestContentType;t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,o=e.operation,a=void 0===o?{}:o,i=e.spec,u=Hn()({},t),c=r.authorized,l=void 0===c?{}:c,p=a.security||i.security||[],f=l&&!!j()(l).length,h=Tn()(i,[\"components\",\"securitySchemes\"])||{};if(u.headers=u.headers||{},u.query=u.query||{},!j()(r).length||!f||!p||Array.isArray(a.security)&&!a.security.length)return t;return p.forEach((function(e){j()(e).forEach((function(e){var t=l[e],n=h[e];if(t){var r=t.value||t,o=n.type;if(t)if(\"apiKey\"===o)\"query\"===n.in&&(u.query[n.name]=r),\"header\"===n.in&&(u.headers[n.name]=r),\"cookie\"===n.in&&(u.cookies[n.name]=r);else if(\"http\"===o){if(/^basic$/i.test(n.scheme)){var a,i=r.username||\"\",c=r.password||\"\",p=Jn()(s()(a=\"\".concat(i,\":\")).call(a,c));u.headers.Authorization=\"Basic \".concat(p)}/^bearer$/i.test(n.scheme)&&(u.headers.Authorization=\"Bearer \".concat(r))}else if(\"oauth2\"===o||\"openIdConnect\"===o){var f,d=t.token||{},m=d[n[\"x-tokenName\"]||\"access_token\"],v=d.token_type;v&&\"bearer\"!==v.toLowerCase()||(v=\"Bearer\"),u.headers.Authorization=s()(f=\"\".concat(v,\" \")).call(f,m)}}}))})),u}({request:t,securities:o,operation:n,spec:a});var c=n.requestBody||{},l=j()(c.content||{}),p=u&&l.indexOf(u)>-1;if(r||i){if(u&&p)t.headers[\"Content-Type\"]=u;else if(!u){var f=l[0];f&&(t.headers[\"Content-Type\"]=f,u=f)}}else u&&p&&(t.headers[\"Content-Type\"]=u);if(!e.responseContentType&&n.responses){var h,d=N()(h=I()(n.responses)).call(h,(function(e){var t=g()(e,2),n=t[0],r=t[1],o=parseInt(n,10);return o>=200&&o<300&&Pn()(r.content)})).reduce((function(e,t){var n=g()(t,2)[1];return s()(e).call(e,j()(n.content))}),[]);d.length>0&&(t.headers.accept=d.join(\", \"))}if(r)if(u){if(l.indexOf(u)>-1)if(\"application/x-www-form-urlencoded\"===u||\"multipart/form-data\"===u)if(\"object\"===m()(r)){var v=(c.content[u]||{}).encoding||{};t.form={},j()(r).forEach((function(e){t.form[e]={value:r[e],encoding:v[e]||{}}}))}else t.form=r;else t.body=r}else t.body=r;return t}function Yn(e,t){var n,r,o=e.spec,a=e.operation,i=e.securities,u=e.requestContentType,c=e.responseContentType,l=e.attachContentTypeForEmptyPayload;if((t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,o=e.operation,a=void 0===o?{}:o,i=e.spec,u=Hn()({},t),c=r.authorized,l=void 0===c?{}:c,p=r.specSecurity,f=void 0===p?[]:p,h=a.security||f,d=l&&!!j()(l).length,m=i.securityDefinitions;if(u.headers=u.headers||{},u.query=u.query||{},!j()(r).length||!d||!h||Array.isArray(a.security)&&!a.security.length)return t;return h.forEach((function(e){j()(e).forEach((function(e){var t=l[e];if(t){var n=t.token,r=t.value||t,o=m[e],a=o.type,i=o[\"x-tokenName\"]||\"access_token\",c=n&&n[i],p=n&&n.token_type;if(t)if(\"apiKey\"===a){var f=\"query\"===o.in?\"query\":\"headers\";u[f]=u[f]||{},u[f][o.name]=r}else if(\"basic\"===a)if(r.header)u.headers.authorization=r.header;else{var h,d=r.username||\"\",v=r.password||\"\";r.base64=Jn()(s()(h=\"\".concat(d,\":\")).call(h,v)),u.headers.authorization=\"Basic \".concat(r.base64)}else if(\"oauth2\"===a&&c){var g;p=p&&\"bearer\"!==p.toLowerCase()?p:\"Bearer\",u.headers.authorization=s()(g=\"\".concat(p,\" \")).call(g,c)}}}))})),u}({request:t,securities:i,operation:a,spec:o})).body||t.form||l)if(u)t.headers[\"Content-Type\"]=u;else if(Array.isArray(a.consumes)){var p=g()(a.consumes,1);t.headers[\"Content-Type\"]=p[0]}else if(Array.isArray(o.consumes)){var f=g()(o.consumes,1);t.headers[\"Content-Type\"]=f[0]}else a.parameters&&N()(n=a.parameters).call(n,(function(e){return\"file\"===e.type})).length?t.headers[\"Content-Type\"]=\"multipart/form-data\":a.parameters&&N()(r=a.parameters).call(r,(function(e){return\"formData\"===e.in})).length&&(t.headers[\"Content-Type\"]=\"application/x-www-form-urlencoded\");else if(u){var h,d,m=a.parameters&&N()(h=a.parameters).call(h,(function(e){return\"body\"===e.in})).length>0,v=a.parameters&&N()(d=a.parameters).call(d,(function(e){return\"formData\"===e.in})).length>0;(m||v)&&(t.headers[\"Content-Type\"]=u)}return!c&&Array.isArray(a.produces)&&a.produces.length>0&&(t.headers.accept=a.produces.join(\", \")),t}var Gn=[\"http\",\"fetch\",\"spec\",\"operationId\",\"pathName\",\"method\",\"parameters\",\"securities\"],Zn=function(e){return Array.isArray(e)?e:[]},Xn=Lt(\"OperationNotFoundError\",(function(e,t,n){this.originalError=n,Se()(this,t||{})})),Qn={buildRequest:tr};function er(e){var t=e.http,n=e.fetch,r=e.spec,o=e.operationId,a=e.pathName,i=e.method,s=e.parameters,u=e.securities,c=On()(e,Gn),l=t||n||ee;a&&i&&!o&&(o=Object(Sn.c)(a,i));var p=Qn.buildRequest(ye()({spec:r,operationId:o,parameters:s,securities:u,http:l},c));return p.body&&(Pn()(p.body)||Mn()(p.body))&&(p.body=C()(p.body)),l(p)}function tr(e){var t,n,r=e.spec,o=e.operationId,i=e.responseContentType,u=e.scheme,c=e.requestInterceptor,l=e.responseInterceptor,p=e.contextUrl,f=e.userFetch,h=e.server,d=e.serverVariables,m=e.http,v=e.parameters,y=e.parameterBuilders,b=Object(Sn.b)(r);y||(y=b?a:Ln);var _={url:\"\",credentials:m&&m.withCredentials?\"include\":\"same-origin\",headers:{},cookies:{}};c&&(_.requestInterceptor=c),l&&(_.responseInterceptor=l),f&&(_.userFetch=f);var w=Object(Sn.a)(r,o);if(!w)throw new Xn(\"Operation \".concat(o,\" not found\"));var x,E=w.operation,S=void 0===E?{}:E,C=w.method,A=w.pathName;if(_.url+=(x={spec:r,scheme:u,contextUrl:p,server:h,serverVariables:d,pathName:A,method:C},Object(Sn.b)(x.spec)?function(e){var t=e.spec,n=e.pathName,r=e.method,o=e.server,a=e.contextUrl,i=e.serverVariables,u=void 0===i?{}:i,c=Tn()(t,[\"paths\",n,(r||\"\").toLowerCase(),\"servers\"])||Tn()(t,[\"paths\",n,\"servers\"])||Tn()(t,[\"servers\"]),l=\"\",p=null;if(o&&c&&c.length){var f=k()(c).call(c,(function(e){return e.url}));f.indexOf(o)>-1&&(l=o,p=c[f.indexOf(o)])}if(!l&&c&&c.length){l=c[0].url;var h=g()(c,1);p=h[0]}return l.indexOf(\"{\")>-1&&function(e){for(var t,n=[],r=/{([^}]+)}/g;t=r.exec(e);)n.push(t[1]);return n}(l).forEach((function(e){if(p.variables&&p.variables[e]){var t=p.variables[e],n=u[e]||t.default,r=new RegExp(\"{\".concat(e,\"}\"),\"g\");l=l.replace(r,n)}})),function(){var e,t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",o=n&&r?Dt.a.parse(Dt.a.resolve(r,n)):Dt.a.parse(n),a=Dt.a.parse(r),i=nr(o.protocol)||nr(a.protocol)||\"\",u=o.host||a.host,c=o.pathname||\"\";return\"/\"===(e=i&&u?s()(t=\"\".concat(i,\"://\")).call(t,u+c):c)[e.length-1]?$()(e).call(e,0,-1):e}(l,a)}(x):function(e){var t,n,r=e.spec,o=e.scheme,a=e.contextUrl,i=void 0===a?\"\":a,u=Dt.a.parse(i),c=Array.isArray(r.schemes)?r.schemes[0]:null,l=o||c||nr(u.protocol)||\"http\",p=r.host||u.host||\"\",f=r.basePath||\"\";return\"/\"===(t=l&&p?s()(n=\"\".concat(l,\"://\")).call(n,p+f):f)[t.length-1]?$()(t).call(t,0,-1):t}(x)),!o)return delete _.cookies,_;_.url+=A,_.method=\"\".concat(C).toUpperCase(),v=v||{};var O=r.paths[A]||{};i&&(_.headers.accept=i);var T=function(e){var t={};e.forEach((function(e){t[e.in]||(t[e.in]={}),t[e.in][e.name]=e}));var n=[];return j()(t).forEach((function(e){j()(t[e]).forEach((function(r){n.push(t[e][r])}))})),n}(s()(t=s()(n=[]).call(n,Zn(S.parameters))).call(t,Zn(O.parameters)));T.forEach((function(e){var t,n,o=y[e.in];if(\"body\"===e.in&&e.schema&&e.schema.properties&&(t=v),void 0===(t=e&&e.name&&v[e.name]))t=e&&e.name&&v[s()(n=\"\".concat(e.in,\".\")).call(n,e.name)];else if(function(e,t){return N()(t).call(t,(function(t){return t.name===e}))}(e.name,T).length>1){var a;console.warn(s()(a=\"Parameter '\".concat(e.name,\"' is ambiguous because the defined spec has more than one parameter with the name: '\")).call(a,e.name,\"' and the passed-in parameter values did not define an 'in' value.\"))}if(null!==t){if(void 0!==e.default&&void 0===t&&(t=e.default),void 0===t&&e.required&&!e.allowEmptyValue)throw new Error(\"Required parameter \".concat(e.name,\" is not provided\"));if(b&&e.schema&&\"object\"===e.schema.type&&\"string\"==typeof t)try{t=JSON.parse(t)}catch(e){throw new Error(\"Could not parse object parameter value string as JSON\")}o&&o({req:_,parameter:e,value:t,operation:S,spec:r})}}));var I=ye()(ye()({},e),{},{operation:S});if((_=b?Kn(I,_):Yn(I,_)).cookies&&j()(_.cookies).length){var P=j()(_.cookies).reduce((function(e,t){var n=_.cookies[t];return e+(e?\"&\":\"\")+Dn.a.serialize(t,n)}),\"\");_.headers.Cookie=P}return _.cookies&&delete _.cookies,me(_),_}var nr=function(e){return e?e.replace(/\\W/g,\"\"):null};function rr(e,t){return or.apply(this,arguments)}function or(){return(or=c()(p.a.mark((function e(t,n){var r,o,a,i,s,u,c,l,f,h,d,m,v=arguments;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=v.length>2&&void 0!==v[2]?v[2]:{},o=r.returnEntireTree,a=r.baseDoc,i=r.requestInterceptor,s=r.responseInterceptor,u=r.parameterMacro,c=r.modelPropertyMacro,l=r.useCircularStructures,f={pathDiscriminator:n,baseDoc:a,requestInterceptor:i,responseInterceptor:s,parameterMacro:u,modelPropertyMacro:c,useCircularStructures:l},h=Object(Sn.d)({spec:t}),d=h.spec,e.next=6,An(ye()(ye()({},f),{},{spec:d,allowMetaPatches:!0,skipNormalization:!0}));case 6:return m=e.sent,!o&&Array.isArray(n)&&n.length&&(m.spec=Tn()(m.spec,n)||null),e.abrupt(\"return\",m);case 9:case\"end\":return e.stop()}}),e)})))).apply(this,arguments)}var ar=n(304);t.default=function(e){var t,n,r,o=e.configs,a=e.getConfigs;return{fn:{fetch:(t=ee,n=o.preFetch,r=o.postFetch,r=r||function(e){return e},n=n||function(e){return e},function(e){return\"string\"==typeof e&&(e={url:e}),Q.mergeInQueryOrForm(e),e=n(e),r(t(e))}),buildRequest:tr,execute:er,resolve:An,resolveSubtree:function(e,t,n){var r;if(void 0===n){var o=a();n={modelPropertyMacro:o.modelPropertyMacro,parameterMacro:o.parameterMacro,requestInterceptor:o.requestInterceptor,responseInterceptor:o.responseInterceptor}}for(var i=arguments.length,u=new Array(i>3?i-3:0),c=3;c<i;c++)u[c-3]=arguments[c];return rr.apply(void 0,s()(r=[e,t,n]).call(r,u))},serializeRes:oe,opId:Sn.e},statePlugins:{configs:{wrapActions:ar}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return c}));var r=n(170),o=n(148),a=n(311),i=n(312),s=n(313),u={getLocalConfig:function(){return Object(r.parseYamlConfig)('---\\nurl: \"https://petstore.swagger.io/v2/swagger.json\"\\ndom_id: \"#swagger-ui\"\\nvalidatorUrl: \"https://validator.swagger.io/validator\"\\n')}};function c(){return{statePlugins:{spec:{actions:a,selectors:u},configs:{reducers:s.default,actions:o,selectors:i}}}}},function(e,t,n){\"use strict\";(function(e,r){var o,a=n(507);o=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==e?e:r;var i=Object(a.a)(o);t.a=i}).call(this,n(51),n(627)(e))},function(e,t,n){var r=n(415),o=n(191),a=n(763),i=n(50),s=n(429);e.exports=function(e,t,n){var u=i(e)?r:a;return n&&s(e,t,n)&&(t=void 0),u(e,o(t,3))}},function(e,t,n){\"use strict\";var r=n(436),o=n(437),a=n(785);e.exports=function(e){var t,i=r(arguments[1]);return i.normalizer||0!==(t=i.length=o(i.length,e.length,i.async))&&(i.primitive?!1===t?i.normalizer=n(820):t>1&&(i.normalizer=n(821)(t)):i.normalizer=!1===t?n(822)():1===t?n(826)():n(827)(t)),i.async&&n(828),i.promise&&n(829),i.dispose&&n(835),i.maxAge&&n(836),i.max&&n(839),i.refCounter&&n(841),a(e,i)}},function(e,t,n){e.exports=n(886)},function(e,t,n){e.exports=n(891)},function(e,t,n){var r=n(462);e.exports=function(e,t,n){return null==e?e:r(e,t,n)}},function(e,t,n){\"use strict\";t.__esModule=!0,t.connect=t.Provider=void 0;var r=a(n(993)),o=a(n(995));function a(e){return e&&e.__esModule?e:{default:e}}t.Provider=r.default,t.connect=o.default},function(e,t,n){\"use strict\";var r=n(1040),o=n(1041);t.highlight=i,t.highlightAuto=function(e,t){var n,s,u,c,l=t||{},p=l.subset||r.listLanguages(),f=l.prefix,h=p.length,d=-1;null==f&&(f=a);if(\"string\"!=typeof e)throw o(\"Expected `string` for value, got `%s`\",e);s={relevance:0,language:null,value:[]},n={relevance:0,language:null,value:[]};for(;++d<h;)c=p[d],r.getLanguage(c)&&((u=i(c,e,t)).language=c,u.relevance>s.relevance&&(s=u),u.relevance>n.relevance&&(s=n,n=u));s.language&&(n.secondBest=s);return n},t.registerLanguage=function(e,t){r.registerLanguage(e,t)},t.listLanguages=function(){return r.listLanguages()},t.registerAlias=function(e,t){var n,o=e;t&&((o={})[e]=t);for(n in o)r.registerAliases(o[n],{languageName:n})},s.prototype.addText=function(e){var t,n,r=this.stack;if(\"\"===e)return;t=r[r.length-1],(n=t.children[t.children.length-1])&&\"text\"===n.type?n.value+=e:t.children.push({type:\"text\",value:e})},s.prototype.addKeyword=function(e,t){this.openNode(t),this.addText(e),this.closeNode()},s.prototype.addSublanguage=function(e,t){var n=this.stack,r=n[n.length-1],o=e.rootNode.children,a=t?{type:\"element\",tagName:\"span\",properties:{className:[t]},children:o}:o;r.children=r.children.concat(a)},s.prototype.openNode=function(e){var t=this.stack,n=this.options.classPrefix+e,r=t[t.length-1],o={type:\"element\",tagName:\"span\",properties:{className:[n]},children:[]};r.children.push(o),t.push(o)},s.prototype.closeNode=function(){this.stack.pop()},s.prototype.closeAllNodes=u,s.prototype.finalize=u,s.prototype.toHTML=function(){return\"\"};var a=\"hljs-\";function i(e,t,n){var i,u=r.configure({}),c=(n||{}).prefix;if(\"string\"!=typeof e)throw o(\"Expected `string` for name, got `%s`\",e);if(!r.getLanguage(e))throw o(\"Unknown language: `%s` is not registered\",e);if(\"string\"!=typeof t)throw o(\"Expected `string` for value, got `%s`\",t);if(null==c&&(c=a),r.configure({__emitter:s,classPrefix:c}),i=r.highlight(e,t,!0),r.configure(u||{}),i.errorRaised)throw i.errorRaised;return{relevance:i.relevance,language:i.language,value:i.emitter.rootNode.children}}function s(e){this.options=e,this.rootNode={children:[]},this.stack=[this.rootNode]}function u(){}},function(e,t,n){\"use strict\";function r(e){return\"undefined\"!=typeof globalThis?globalThis[e]:\"undefined\"!=typeof self?self[e]:window[e]}Object.defineProperty(t,\"__esModule\",{value:!0}),t.File=t.Blob=t.FormData=void 0,t.FormData=r(\"FormData\"),t.Blob=r(\"Blob\"),t.File=r(\"File\")},function(e,t){e.exports=function(){}},function(e,t,n){\"use strict\";var r=t,o=n(73).Buffer;function a(e,t){try{return decodeURIComponent(e)}catch(n){return r.unescapeBuffer(e,t).toString()}}r.unescapeBuffer=function(e,t){for(var n,r,a,i=new o(e.length),s=0,u=0,c=0;u<=e.length;u++){var l=u<e.length?e.charCodeAt(u):NaN;switch(s){case 0:switch(l){case 37:n=0,r=0,s=1;break;case 43:t&&(l=32);default:i[c++]=l}break;case 1:if(a=l,l>=48&&l<=57)n=l-48;else if(l>=65&&l<=70)n=l-65+10;else{if(!(l>=97&&l<=102)){i[c++]=37,i[c++]=l,s=0;break}n=l-97+10}s=2;break;case 2:if(s=0,l>=48&&l<=57)r=l-48;else if(l>=65&&l<=70)r=l-65+10;else{if(!(l>=97&&l<=102)){i[c++]=37,i[c++]=a,i[c++]=l;break}r=l-97+10}i[c++]=16*n+r}}return i.slice(0,c-1)},r.unescape=a;for(var i=new Array(256),s=0;s<256;++s)i[s]=\"%\"+((s<16?\"0\":\"\")+s.toString(16)).toUpperCase();r.escape=function(e){\"string\"!=typeof e&&(e+=\"\");for(var t=\"\",n=0,r=0;r<e.length;++r){var o=e.charCodeAt(r);if(!(33===o||45===o||46===o||95===o||126===o||o>=39&&o<=42||o>=48&&o<=57||o>=65&&o<=90||o>=97&&o<=122))if(r-n>0&&(t+=e.slice(n,r)),o<128)n=r+1,t+=i[o];else if(o<2048)n=r+1,t+=i[192|o>>6]+i[128|63&o];else if(o<55296||o>=57344)n=r+1,t+=i[224|o>>12]+i[128|o>>6&63]+i[128|63&o];else{var a;if(!(++r<e.length))throw new URIError(\"URI malformed\");a=1023&e.charCodeAt(r),n=r+1,t+=i[240|(o=65536+((1023&o)<<10|a))>>18]+i[128|o>>12&63]+i[128|o>>6&63]+i[128|63&o]}}return 0===n?e:n<e.length?t+e.slice(n):t};var u=function(e){return\"string\"==typeof e?e:\"number\"==typeof e&&isFinite(e)?\"\"+e:\"boolean\"==typeof e?e?\"true\":\"false\":\"\"};function c(e,t){try{return t(e)}catch(t){return r.unescape(e,!0)}}r.stringify=r.encode=function(e,t,n,o){t=t||\"&\",n=n||\"=\";var a=r.escape;if(o&&\"function\"==typeof o.encodeURIComponent&&(a=o.encodeURIComponent),null!==e&&\"object\"==typeof e){for(var i=Object.keys(e),s=i.length,c=s-1,l=\"\",p=0;p<s;++p){var f=i[p],h=e[f],d=a(u(f))+n;if(Array.isArray(h)){for(var m=h.length,v=m-1,g=0;g<m;++g)l+=d+a(u(h[g])),g<v&&(l+=t);m&&p<c&&(l+=t)}else l+=d+a(u(h)),p<c&&(l+=t)}return l}return\"\"},r.parse=r.decode=function(e,t,n,o){t=t||\"&\",n=n||\"=\";var i={};if(\"string\"!=typeof e||0===e.length)return i;\"string\"!=typeof t&&(t+=\"\");var s=n.length,u=t.length,l=1e3;o&&\"number\"==typeof o.maxKeys&&(l=o.maxKeys);var p=1/0;l>0&&(p=l);var f=r.unescape;o&&\"function\"==typeof o.decodeURIComponent&&(f=o.decodeURIComponent);for(var h=f!==a,d=[],m=0,v=0,g=0,y=\"\",b=\"\",_=h,w=h,x=0,E=0;E<e.length;++E){var S=e.charCodeAt(E);if(S!==t.charCodeAt(v)){if(v=0,w||(37===S?x=1:x>0&&(S>=48&&S<=57||S>=65&&S<=70||S>=97&&S<=102)?3==++x&&(w=!0):x=0),g<s){if(S===n.charCodeAt(g)){if(++g===s)m<(A=E-g+1)&&(y+=e.slice(m,A)),x=0,m=E+1;continue}g=0,_||(37===S?x=1:x>0&&(S>=48&&S<=57||S>=65&&S<=70||S>=97&&S<=102)?3==++x&&(_=!0):x=0)}43===S&&(g<s?(E-m>0&&(y+=e.slice(m,E)),y+=\"%20\",_=!0):(E-m>0&&(b+=e.slice(m,E)),b+=\"%20\",w=!0),m=E+1)}else if(++v===u){var C,A=E-v+1;if(g<s?m<A&&(y+=e.slice(m,A)):m<A&&(b+=e.slice(m,A)),_&&(y=c(y,f)),w&&(b=c(b,f)),-1===d.indexOf(y))i[y]=b,d[d.length]=y;else(C=i[y])instanceof Array?C[C.length]=b:i[y]=[C,b];if(0==--p)break;_=w=h,x=0,y=b=\"\",m=E+1,v=g=0}}p>0&&(m<e.length||g>0)&&(m<e.length&&(g<s?y+=e.slice(m):v<u&&(b+=e.slice(m))),_&&(y=c(y,f)),w&&(b=c(b,f)),-1===d.indexOf(y)?(i[y]=b,d[d.length]=y):(C=i[y])instanceof Array?C[C.length]=b:i[y]=[C,b]);return i}},function(e,t,n){var r=n(1080),o=n(406),a=n(426),i=n(92);e.exports=function(e,t,n){return e=i(e),n=null==n?0:r(a(n),0,e.length),t=o(t),e.slice(n,n+t.length)==t}},function(e,t,n){var r=n(92);e.exports=function(e){return r(e).toLowerCase()}},function(e,t,n){\"use strict\";var r=n(1107).DebounceInput;r.DebounceInput=r,e.exports=r},function(e,t,n){var r=n(399),o=n(392),a=n(185),i=n(400);e.exports=function(e){return r(e)||o(e)||a(e)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";var r=n(21),o=n(37),a=n(152),i=n(47),s=n(60),u=n(69),c=n(153),l=n(226),p=n(154),f=n(41),h=n(129),d=f(\"isConcatSpreadable\"),m=9007199254740991,v=\"Maximum allowed index exceeded\",g=h>=51||!o((function(){var e=[];return e[d]=!1,e.concat()[0]!==e})),y=p(\"concat\"),b=function(e){if(!i(e))return!1;var t=e[d];return void 0!==t?!!t:a(e)};r({target:\"Array\",proto:!0,forced:!g||!y},{concat:function(e){var t,n,r,o,a,i=s(this),p=l(i,0),f=0;for(t=-1,r=arguments.length;t<r;t++)if(b(a=-1===t?i:arguments[t])){if(f+(o=u(a.length))>m)throw TypeError(v);for(n=0;n<o;n++,f++)n in a&&c(p,f,a[n])}else{if(f>=m)throw TypeError(v);c(p,f++,a)}return p.length=f,p}})},function(e,t,n){var r=n(48),o=n(37),a=n(225);e.exports=!r&&!o((function(){return 7!=Object.defineProperty(a(\"div\"),\"a\",{get:function(){return 7}}).a}))},function(e,t,n){var r=n(37),o=/#|\\.prototype\\./,a=function(e,t){var n=s[i(e)];return n==c||n!=u&&(\"function\"==typeof t?r(t):!!t)},i=a.normalize=function(e){return String(e).replace(o,\".\").toLowerCase()},s=a.data={},u=a.NATIVE=\"N\",c=a.POLYFILL=\"P\";e.exports=a},function(e,t,n){var r=n(229);e.exports=r&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator},function(e,t,n){\"use strict\";var r=n(21),o=n(40),a=n(70),i=n(97),s=n(48),u=n(229),c=n(363),l=n(37),p=n(55),f=n(152),h=n(47),d=n(52),m=n(60),v=n(66),g=n(178),y=n(105),b=n(109),_=n(155),w=n(234),x=n(547),E=n(235),S=n(127),C=n(68),A=n(176),k=n(67),O=n(110),j=n(227),T=n(181),I=n(156),P=n(179),N=n(41),M=n(236),R=n(44),D=n(98),L=n(78),B=n(86).forEach,F=T(\"hidden\"),U=\"Symbol\",q=N(\"toPrimitive\"),z=L.set,V=L.getterFor(U),W=Object.prototype,H=o.Symbol,$=a(\"JSON\",\"stringify\"),J=S.f,K=C.f,Y=x.f,G=A.f,Z=j(\"symbols\"),X=j(\"op-symbols\"),Q=j(\"string-to-symbol-registry\"),ee=j(\"symbol-to-string-registry\"),te=j(\"wks\"),ne=o.QObject,re=!ne||!ne.prototype||!ne.prototype.findChild,oe=s&&l((function(){return 7!=b(K({},\"a\",{get:function(){return K(this,\"a\",{value:7}).a}})).a}))?function(e,t,n){var r=J(W,t);r&&delete W[t],K(e,t,n),r&&e!==W&&K(W,t,r)}:K,ae=function(e,t){var n=Z[e]=b(H.prototype);return z(n,{type:U,tag:e,description:t}),s||(n.description=t),n},ie=c?function(e){return\"symbol\"==typeof e}:function(e){return Object(e)instanceof H},se=function(e,t,n){e===W&&se(X,t,n),d(e);var r=g(t,!0);return d(n),p(Z,r)?(n.enumerable?(p(e,F)&&e[F][r]&&(e[F][r]=!1),n=b(n,{enumerable:y(0,!1)})):(p(e,F)||K(e,F,y(1,{})),e[F][r]=!0),oe(e,r,n)):K(e,r,n)},ue=function(e,t){d(e);var n=v(t),r=_(n).concat(fe(n));return B(r,(function(t){s&&!ce.call(n,t)||se(e,t,n[t])})),e},ce=function(e){var t=g(e,!0),n=G.call(this,t);return!(this===W&&p(Z,t)&&!p(X,t))&&(!(n||!p(this,t)||!p(Z,t)||p(this,F)&&this[F][t])||n)},le=function(e,t){var n=v(e),r=g(t,!0);if(n!==W||!p(Z,r)||p(X,r)){var o=J(n,r);return!o||!p(Z,r)||p(n,F)&&n[F][r]||(o.enumerable=!0),o}},pe=function(e){var t=Y(v(e)),n=[];return B(t,(function(e){p(Z,e)||p(I,e)||n.push(e)})),n},fe=function(e){var t=e===W,n=Y(t?X:v(e)),r=[];return B(n,(function(e){!p(Z,e)||t&&!p(W,e)||r.push(Z[e])})),r};(u||(O((H=function(){if(this instanceof H)throw TypeError(\"Symbol is not a constructor\");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=P(e),n=function(e){this===W&&n.call(X,e),p(this,F)&&p(this[F],t)&&(this[F][t]=!1),oe(this,t,y(1,e))};return s&&re&&oe(W,t,{configurable:!0,set:n}),ae(t,e)}).prototype,\"toString\",(function(){return V(this).tag})),O(H,\"withoutSetter\",(function(e){return ae(P(e),e)})),A.f=ce,C.f=se,S.f=le,w.f=x.f=pe,E.f=fe,M.f=function(e){return ae(N(e),e)},s&&(K(H.prototype,\"description\",{configurable:!0,get:function(){return V(this).description}}),i||O(W,\"propertyIsEnumerable\",ce,{unsafe:!0}))),r({global:!0,wrap:!0,forced:!u,sham:!u},{Symbol:H}),B(_(te),(function(e){R(e)})),r({target:U,stat:!0,forced:!u},{for:function(e){var t=String(e);if(p(Q,t))return Q[t];var n=H(t);return Q[t]=n,ee[n]=t,n},keyFor:function(e){if(!ie(e))throw TypeError(e+\" is not a symbol\");if(p(ee,e))return ee[e]},useSetter:function(){re=!0},useSimple:function(){re=!1}}),r({target:\"Object\",stat:!0,forced:!u,sham:!s},{create:function(e,t){return void 0===t?b(e):ue(b(e),t)},defineProperty:se,defineProperties:ue,getOwnPropertyDescriptor:le}),r({target:\"Object\",stat:!0,forced:!u},{getOwnPropertyNames:pe,getOwnPropertySymbols:fe}),r({target:\"Object\",stat:!0,forced:l((function(){E.f(1)}))},{getOwnPropertySymbols:function(e){return E.f(m(e))}}),$)&&r({target:\"JSON\",stat:!0,forced:!u||l((function(){var e=H();return\"[null]\"!=$([e])||\"{}\"!=$({a:e})||\"{}\"!=$(Object(e))}))},{stringify:function(e,t,n){for(var r,o=[e],a=1;arguments.length>a;)o.push(arguments[a++]);if(r=t,(h(t)||void 0!==e)&&!ie(e))return f(t)||(t=function(e,t){if(\"function\"==typeof r&&(t=r.call(this,e,t)),!ie(t))return t}),o[1]=t,$.apply(null,o)}});H.prototype[q]||k(H.prototype,q,H.prototype.valueOf),D(H,U),I[F]=!0},function(e,t,n){var r=n(55),o=n(66),a=n(231).indexOf,i=n(156);e.exports=function(e,t){var n,s=o(e),u=0,c=[];for(n in s)!r(i,n)&&r(s,n)&&c.push(n);for(;t.length>u;)r(s,n=t[u++])&&(~a(c,n)||c.push(n));return c}},function(e,t,n){var r=n(70);e.exports=r(\"document\",\"documentElement\")},function(e,t,n){var r=n(40),o=n(368),a=r.WeakMap;e.exports=\"function\"==typeof a&&/native code/.test(o(a))},function(e,t,n){var r=n(228),o=Function.toString;\"function\"!=typeof r.inspectSource&&(r.inspectSource=function(e){return o.call(e)}),e.exports=r.inspectSource},function(e,t,n){n(44)(\"iterator\")},function(e,t,n){var r=n(128),o=n(106),a=function(e){return function(t,n){var a,i,s=String(o(t)),u=r(n),c=s.length;return u<0||u>=c?e?\"\":void 0:(a=s.charCodeAt(u))<55296||a>56319||u+1===c||(i=s.charCodeAt(u+1))<56320||i>57343?e?s.charAt(u):a:e?s.slice(u,u+2):i-56320+(a-55296<<10)+65536}};e.exports={codeAt:a(!1),charAt:a(!0)}},function(e,t,n){\"use strict\";var r=n(372).IteratorPrototype,o=n(109),a=n(105),i=n(98),s=n(131),u=function(){return this};e.exports=function(e,t,n){var c=t+\" Iterator\";return e.prototype=o(r,{next:a(1,n)}),i(e,c,!1,!0),s[c]=u,e}},function(e,t,n){\"use strict\";var r,o,a,i=n(37),s=n(182),u=n(67),c=n(55),l=n(41),p=n(97),f=l(\"iterator\"),h=!1;[].keys&&(\"next\"in(a=[].keys())?(o=s(s(a)))!==Object.prototype&&(r=o):h=!0);var d=null==r||i((function(){var e={};return r[f].call(e)!==e}));d&&(r={}),p&&!d||c(r,f)||u(r,f,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:h}},function(e,t,n){var r=n(37);e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},function(e,t,n){var r=n(581),o=Array.prototype;e.exports=function(e){var t=e.filter;return e===o||e instanceof Array&&t===o.filter?r:t}},function(e,t,n){n(584);var r=n(34);e.exports=r.Object.keys},function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return\"[object Array]\"==n.call(e)}},function(e,t,n){n(591);var r=n(34).Object,o=e.exports=function(e,t,n){return r.defineProperty(e,t,n)};r.defineProperty.sham&&(o.sham=!0)},function(e,t,n){\"use strict\";var r=n(77),o=n(47),a=[].slice,i={},s=function(e,t,n){if(!(t in i)){for(var r=[],o=0;o<t;o++)r[o]=\"a[\"+o+\"]\";i[t]=Function(\"C,a\",\"return new C(\"+r.join(\",\")+\")\")}return i[t](e,n)};e.exports=Function.bind||function(e){var t=r(this),n=a.call(arguments,1),i=function(){var r=n.concat(a.call(arguments));return this instanceof i?s(t,r.length,r):t.apply(e,r)};return o(t.prototype)&&(i.prototype=t.prototype),i}},function(e,t,n){n(597);var r=n(34);e.exports=r.Object.assign},function(e,t,n){\"use strict\";var r=n(48),o=n(37),a=n(155),i=n(235),s=n(176),u=n(60),c=n(177),l=Object.assign,p=Object.defineProperty;e.exports=!l||o((function(){if(r&&1!==l({b:1},l(p({},\"a\",{enumerable:!0,get:function(){p(this,\"b\",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),o=\"abcdefghijklmnopqrst\";return e[n]=7,o.split(\"\").forEach((function(e){t[e]=e})),7!=l({},e)[n]||a(l({},t)).join(\"\")!=o}))?function(e,t){for(var n=u(e),o=arguments.length,l=1,p=i.f,f=s.f;o>l;)for(var h,d=c(arguments[l++]),m=p?a(d).concat(p(d)):a(d),v=m.length,g=0;v>g;)h=m[g++],r&&!f.call(d,h)||(n[h]=d[h]);return n}:l},function(e,t,n){var r=n(599),o=Array.prototype;e.exports=function(e){var t=e.slice;return e===o||e instanceof Array&&t===o.slice?r:t}},function(e,t,n){n(602);var r=n(34);e.exports=r.Array.isArray},function(e,t,n){\"use strict\";var r=n(158),o=n(38),a=n(384),i=(n(385),n(241));n(25),n(612);function s(e,t,n){this.props=e,this.context=t,this.refs=i,this.updater=n||a}function u(e,t,n){this.props=e,this.context=t,this.refs=i,this.updater=n||a}function c(){}s.prototype.isReactComponent={},s.prototype.setState=function(e,t){\"object\"!=typeof e&&\"function\"!=typeof e&&null!=e&&r(\"85\"),this.updater.enqueueSetState(this,e),t&&this.updater.enqueueCallback(this,t,\"setState\")},s.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this),e&&this.updater.enqueueCallback(this,e,\"forceUpdate\")},c.prototype=s.prototype,u.prototype=new c,u.prototype.constructor=u,o(u.prototype,s.prototype),u.prototype.isPureReactComponent=!0,e.exports={Component:s,PureComponent:u}},function(e,t,n){\"use strict\";n(33);var r={isMounted:function(e){return!1},enqueueCallback:function(e,t){},enqueueForceUpdate:function(e){},enqueueReplaceState:function(e,t){},enqueueSetState:function(e,t){}};e.exports=r},function(e,t,n){\"use strict\";e.exports=!1},function(e,t,n){\"use strict\";var r=\"function\"==typeof Symbol&&Symbol.for&&Symbol.for(\"react.element\")||60103;e.exports=r},function(e,t,n){\"use strict\";var r=n(620);e.exports=function(e){return r(e,!1)}},function(e,t,n){\"use strict\";e.exports=n(621)},function(e,t,n){\"use strict\";e.exports=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\"},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e){return e&&\"@@redux/INIT\"===e.type?\"initialState argument passed to createStore\":\"previous state received by the reducer\"},e.exports=t.default},function(e,t){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(175),o=n(243),a=n(393);e.exports=function(e){if(void 0!==r&&null!=o(e)||null!=e[\"@@iterator\"])return a(e)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(635)},function(e,t,n){n(130),n(636);var r=n(34);e.exports=r.Array.from},function(e,t,n){\"use strict\";var r=n(107),o=n(60),a=n(637),i=n(397),s=n(69),u=n(153),c=n(159);e.exports=function(e){var t,n,l,p,f,h,d=o(e),m=\"function\"==typeof this?this:Array,v=arguments.length,g=v>1?arguments[1]:void 0,y=void 0!==g,b=c(d),_=0;if(y&&(g=r(g,v>2?arguments[2]:void 0,2)),null==b||m==Array&&i(b))for(n=new m(t=s(d.length));t>_;_++)h=y?g(d[_],_):d[_],u(n,_,h);else for(f=(p=b.call(d)).next,n=new m;!(l=f.call(p)).done;_++)h=y?a(p,g,[l.value,_],!0):l.value,u(n,_,h);return n.length=_,n}},function(e,t,n){var r=n(52);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},function(e,t,n){var r=n(41),o=n(131),a=r(\"iterator\"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(o.Array===e||i[a]===e)}},function(e,t,n){var r=n(41)(\"iterator\"),o=!1;try{var a=0,i={next:function(){return{done:!!a++}},return:function(){o=!0}};i[r]=function(){return this},Array.from(i,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var a={};a[r]=function(){return{next:function(){return{done:n=!0}}}},e(a)}catch(e){}return n}},function(e,t,n){var r=n(242);e.exports=function(e){if(r(e))return e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){n(87);var r=n(645),o=n(99),a=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.forEach;return e===a||e instanceof Array&&t===a.forEach||i.hasOwnProperty(o(e))?r:t}},function(e,t,n){var r=n(667);e.exports=function(e){if(r(e))throw TypeError(\"The method doesn't accept regular expressions\");return e}},function(e,t,n){var r=n(41)(\"match\");e.exports=function(e){var t=/./;try{\"/./\"[e](t)}catch(n){try{return t[r]=!1,\"/./\"[e](t)}catch(e){}}return!1}},function(e,t,n){var r=n(669),o=Array.prototype;e.exports=function(e){var t=e.indexOf;return e===o||e instanceof Array&&t===o.indexOf?r:t}},function(e,t){e.exports=\"\\t\\n\\v\\f\\r                　\\u2028\\u2029\\ufeff\"},function(e,t,n){var r=n(134),o=n(408),a=n(50),i=n(186),s=r?r.prototype:void 0,u=s?s.toString:void 0;e.exports=function e(t){if(\"string\"==typeof t)return t;if(a(t))return o(t,e)+\"\";if(i(t))return u?u.call(t):\"\";var n=t+\"\";return\"0\"==n&&1/t==-Infinity?\"-0\":n}},function(e,t,n){(function(t){var n=\"object\"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(this,n(51))},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}},function(e,t){e.exports=function(e,t,n){var r=-1,o=e.length;t<0&&(t=-t>o?0:o+t),(n=n>o?o:n)<0&&(n+=o),o=t>n?0:n-t>>>0,t>>>=0;for(var a=Array(o);++r<o;)a[r]=e[r+t];return a}},function(e,t){var n=RegExp(\"[\\\\u200d\\\\ud800-\\\\udfff\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff\\\\ufe0e\\\\ufe0f]\");e.exports=function(e){return n.test(e)}},function(e,t){e.exports=function(e,t,n,r){var o=-1,a=null==e?0:e.length;for(r&&a&&(n=e[++o]);++o<a;)n=t(n,e[o],o,e);return n}},function(e,t){var n=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return n.call(e)}catch(e){}try{return e+\"\"}catch(e){}}return\"\"}},function(e,t,n){var r=n(730),o=n(89);e.exports=function e(t,n,a,i,s){return t===n||(null==t||null==n||!o(t)&&!o(n)?t!=t&&n!=n:r(t,n,a,i,e,s))}},function(e,t,n){var r=n(731),o=n(415),a=n(734);e.exports=function(e,t,n,i,s,u){var c=1&n,l=e.length,p=t.length;if(l!=p&&!(c&&p>l))return!1;var f=u.get(e),h=u.get(t);if(f&&h)return f==t&&h==e;var d=-1,m=!0,v=2&n?new r:void 0;for(u.set(e,t),u.set(t,e);++d<l;){var g=e[d],y=t[d];if(i)var b=c?i(y,g,d,t,e,u):i(g,y,d,e,t,u);if(void 0!==b){if(b)continue;m=!1;break}if(v){if(!o(t,(function(e,t){if(!a(v,t)&&(g===e||s(g,e,n,i,u)))return v.push(t)}))){m=!1;break}}else if(g!==y&&!s(g,y,n,i,u)){m=!1;break}}return u.delete(e),u.delete(t),m}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n<r;)if(t(e[n],n,e))return!0;return!1}},function(e,t,n){var r=n(71).Uint8Array;e.exports=r},function(e,t,n){var r=n(418),o=n(248),a=n(114);e.exports=function(e){return r(e,a,o)}},function(e,t,n){var r=n(247),o=n(50);e.exports=function(e,t,n){var a=t(e);return o(e)?a:r(a,n(e))}},function(e,t){e.exports=function(){return[]}},function(e,t,n){var r=n(740),o=n(192),a=n(50),i=n(193),s=n(195),u=n(249),c=Object.prototype.hasOwnProperty;e.exports=function(e,t){var n=a(e),l=!n&&o(e),p=!n&&!l&&i(e),f=!n&&!l&&!p&&u(e),h=n||l||p||f,d=h?r(e.length,String):[],m=d.length;for(var v in e)!t&&!c.call(e,v)||h&&(\"length\"==v||p&&(\"offset\"==v||\"parent\"==v)||f&&(\"buffer\"==v||\"byteLength\"==v||\"byteOffset\"==v)||s(v,m))||d.push(v);return d}},function(e,t,n){var r=n(160),o=n(744),a=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return o(e);var t=[];for(var n in Object(e))a.call(e,n)&&\"constructor\"!=n&&t.push(n);return t}},function(e,t){e.exports=function(e,t){return function(n){return e(t(n))}}},function(e,t,n){var r=n(57);e.exports=function(e){return e==e&&!r(e)}},function(e,t){e.exports=function(e,t){return function(n){return null!=n&&(n[e]===t&&(void 0!==t||e in Object(n)))}}},function(e,t,n){var r=n(753),o=n(754);e.exports=function(e,t){return null!=e&&o(e,t,r)}},function(e,t,n){var r=n(760);e.exports=function(e){var t=r(e),n=t%1;return t==t?n?t-n:t:0}},function(e,t,n){var r=n(761),o=n(57),a=n(186),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,u=/^0o[0-7]+$/i,c=parseInt;e.exports=function(e){if(\"number\"==typeof e)return e;if(a(e))return NaN;if(o(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=r(e);var n=s.test(e);return n||u.test(e)?c(e.slice(2),n?2:8):i.test(e)?NaN:+e}},function(e,t,n){var r=n(764),o=n(767)(r);e.exports=o},function(e,t,n){var r=n(123),o=n(115),a=n(195),i=n(57);e.exports=function(e,t,n){if(!i(n))return!1;var s=typeof t;return!!(\"number\"==s?o(n)&&a(t,n.length):\"string\"==s&&t in n)&&r(n[t],e)}},function(e,t,n){\"use strict\";(function(t,r){var o=n(197);e.exports=b;var a,i=n(376);b.ReadableState=y;n(255).EventEmitter;var s=function(e,t){return e.listeners(t).length},u=n(431),c=n(62).Buffer,l=t.Uint8Array||function(){};var p=n(162);p.inherits=n(61);var f=n(770),h=void 0;h=f&&f.debuglog?f.debuglog(\"stream\"):function(){};var d,m=n(771),v=n(432);p.inherits(b,u);var g=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];function y(e,t){e=e||{};var r=t instanceof(a=a||n(116));this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var o=e.highWaterMark,i=e.readableHighWaterMark,s=this.objectMode?16:16384;this.highWaterMark=o||0===o?o:r&&(i||0===i)?i:s,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new m,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||\"utf8\",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(d||(d=n(434).StringDecoder),this.decoder=new d(e.encoding),this.encoding=e.encoding)}function b(e){if(a=a||n(116),!(this instanceof b))return new b(e);this._readableState=new y(e,this),this.readable=!0,e&&(\"function\"==typeof e.read&&(this._read=e.read),\"function\"==typeof e.destroy&&(this._destroy=e.destroy)),u.call(this)}function _(e,t,n,r,o){var a,i=e._readableState;null===t?(i.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var n=t.decoder.end();n&&n.length&&(t.buffer.push(n),t.length+=t.objectMode?1:n.length)}t.ended=!0,S(e)}(e,i)):(o||(a=function(e,t){var n;r=t,c.isBuffer(r)||r instanceof l||\"string\"==typeof t||void 0===t||e.objectMode||(n=new TypeError(\"Invalid non-string/buffer chunk\"));var r;return n}(i,t)),a?e.emit(\"error\",a):i.objectMode||t&&t.length>0?(\"string\"==typeof t||i.objectMode||Object.getPrototypeOf(t)===c.prototype||(t=function(e){return c.from(e)}(t)),r?i.endEmitted?e.emit(\"error\",new Error(\"stream.unshift() after end event\")):w(e,i,t,!0):i.ended?e.emit(\"error\",new Error(\"stream.push() after EOF\")):(i.reading=!1,i.decoder&&!n?(t=i.decoder.write(t),i.objectMode||0!==t.length?w(e,i,t,!1):A(e,i)):w(e,i,t,!1))):r||(i.reading=!1));return function(e){return!e.ended&&(e.needReadable||e.length<e.highWaterMark||0===e.length)}(i)}function w(e,t,n,r){t.flowing&&0===t.length&&!t.sync?(e.emit(\"data\",n),e.read(0)):(t.length+=t.objectMode?1:n.length,r?t.buffer.unshift(n):t.buffer.push(n),t.needReadable&&S(e)),A(e,t)}Object.defineProperty(b.prototype,\"destroyed\",{get:function(){return void 0!==this._readableState&&this._readableState.destroyed},set:function(e){this._readableState&&(this._readableState.destroyed=e)}}),b.prototype.destroy=v.destroy,b.prototype._undestroy=v.undestroy,b.prototype._destroy=function(e,t){this.push(null),t(e)},b.prototype.push=function(e,t){var n,r=this._readableState;return r.objectMode?n=!0:\"string\"==typeof e&&((t=t||r.defaultEncoding)!==r.encoding&&(e=c.from(e,t),t=\"\"),n=!0),_(this,e,t,!1,n)},b.prototype.unshift=function(e){return _(this,e,null,!0,!1)},b.prototype.isPaused=function(){return!1===this._readableState.flowing},b.prototype.setEncoding=function(e){return d||(d=n(434).StringDecoder),this._readableState.decoder=new d(e),this._readableState.encoding=e,this};var x=8388608;function E(e,t){return e<=0||0===t.length&&t.ended?0:t.objectMode?1:e!=e?t.flowing&&t.length?t.buffer.head.data.length:t.length:(e>t.highWaterMark&&(t.highWaterMark=function(e){return e>=x?e=x:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function S(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(h(\"emitReadable\",t.flowing),t.emittedReadable=!0,t.sync?o.nextTick(C,e):C(e))}function C(e){h(\"emit readable\"),e.emit(\"readable\"),T(e)}function A(e,t){t.readingMore||(t.readingMore=!0,o.nextTick(k,e,t))}function k(e,t){for(var n=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length<t.highWaterMark&&(h(\"maybeReadMore read 0\"),e.read(0),n!==t.length);)n=t.length;t.readingMore=!1}function O(e){h(\"readable nexttick read 0\"),e.read(0)}function j(e,t){t.reading||(h(\"resume read 0\"),e.read(0)),t.resumeScheduled=!1,t.awaitDrain=0,e.emit(\"resume\"),T(e),t.flowing&&!t.reading&&e.read(0)}function T(e){var t=e._readableState;for(h(\"flow\",t.flowing);t.flowing&&null!==e.read(););}function I(e,t){return 0===t.length?null:(t.objectMode?n=t.buffer.shift():!e||e>=t.length?(n=t.decoder?t.buffer.join(\"\"):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):n=function(e,t,n){var r;e<t.head.data.length?(r=t.head.data.slice(0,e),t.head.data=t.head.data.slice(e)):r=e===t.head.data.length?t.shift():n?function(e,t){var n=t.head,r=1,o=n.data;e-=o.length;for(;n=n.next;){var a=n.data,i=e>a.length?a.length:e;if(i===a.length?o+=a:o+=a.slice(0,e),0===(e-=i)){i===a.length?(++r,n.next?t.head=n.next:t.head=t.tail=null):(t.head=n,n.data=a.slice(i));break}++r}return t.length-=r,o}(e,t):function(e,t){var n=c.allocUnsafe(e),r=t.head,o=1;r.data.copy(n),e-=r.data.length;for(;r=r.next;){var a=r.data,i=e>a.length?a.length:e;if(a.copy(n,n.length-e,0,i),0===(e-=i)){i===a.length?(++o,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=a.slice(i));break}++o}return t.length-=o,n}(e,t);return r}(e,t.buffer,t.decoder),n);var n}function P(e){var t=e._readableState;if(t.length>0)throw new Error('\"endReadable()\" called on non-empty stream');t.endEmitted||(t.ended=!0,o.nextTick(N,t,e))}function N(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit(\"end\"))}function M(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1}b.prototype.read=function(e){h(\"read\",e),e=parseInt(e,10);var t=this._readableState,n=e;if(0!==e&&(t.emittedReadable=!1),0===e&&t.needReadable&&(t.length>=t.highWaterMark||t.ended))return h(\"read: emitReadable\",t.length,t.ended),0===t.length&&t.ended?P(this):S(this),null;if(0===(e=E(e,t))&&t.ended)return 0===t.length&&P(this),null;var r,o=t.needReadable;return h(\"need readable\",o),(0===t.length||t.length-e<t.highWaterMark)&&h(\"length less than watermark\",o=!0),t.ended||t.reading?h(\"reading or ended\",o=!1):o&&(h(\"do read\"),t.reading=!0,t.sync=!0,0===t.length&&(t.needReadable=!0),this._read(t.highWaterMark),t.sync=!1,t.reading||(e=E(n,t))),null===(r=e>0?I(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),n!==e&&t.ended&&P(this)),null!==r&&this.emit(\"data\",r),r},b.prototype._read=function(e){this.emit(\"error\",new Error(\"_read() is not implemented\"))},b.prototype.pipe=function(e,t){var n=this,a=this._readableState;switch(a.pipesCount){case 0:a.pipes=e;break;case 1:a.pipes=[a.pipes,e];break;default:a.pipes.push(e)}a.pipesCount+=1,h(\"pipe count=%d opts=%j\",a.pipesCount,t);var u=(!t||!1!==t.end)&&e!==r.stdout&&e!==r.stderr?l:b;function c(t,r){h(\"onunpipe\"),t===n&&r&&!1===r.hasUnpiped&&(r.hasUnpiped=!0,h(\"cleanup\"),e.removeListener(\"close\",g),e.removeListener(\"finish\",y),e.removeListener(\"drain\",p),e.removeListener(\"error\",v),e.removeListener(\"unpipe\",c),n.removeListener(\"end\",l),n.removeListener(\"end\",b),n.removeListener(\"data\",m),f=!0,!a.awaitDrain||e._writableState&&!e._writableState.needDrain||p())}function l(){h(\"onend\"),e.end()}a.endEmitted?o.nextTick(u):n.once(\"end\",u),e.on(\"unpipe\",c);var p=function(e){return function(){var t=e._readableState;h(\"pipeOnDrain\",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&s(e,\"data\")&&(t.flowing=!0,T(e))}}(n);e.on(\"drain\",p);var f=!1;var d=!1;function m(t){h(\"ondata\"),d=!1,!1!==e.write(t)||d||((1===a.pipesCount&&a.pipes===e||a.pipesCount>1&&-1!==M(a.pipes,e))&&!f&&(h(\"false write response, pause\",n._readableState.awaitDrain),n._readableState.awaitDrain++,d=!0),n.pause())}function v(t){h(\"onerror\",t),b(),e.removeListener(\"error\",v),0===s(e,\"error\")&&e.emit(\"error\",t)}function g(){e.removeListener(\"finish\",y),b()}function y(){h(\"onfinish\"),e.removeListener(\"close\",g),b()}function b(){h(\"unpipe\"),n.unpipe(e)}return n.on(\"data\",m),function(e,t,n){if(\"function\"==typeof e.prependListener)return e.prependListener(t,n);e._events&&e._events[t]?i(e._events[t])?e._events[t].unshift(n):e._events[t]=[n,e._events[t]]:e.on(t,n)}(e,\"error\",v),e.once(\"close\",g),e.once(\"finish\",y),e.emit(\"pipe\",n),a.flowing||(h(\"pipe resume\"),n.resume()),e},b.prototype.unpipe=function(e){var t=this._readableState,n={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit(\"unpipe\",this,n)),this;if(!e){var r=t.pipes,o=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var a=0;a<o;a++)r[a].emit(\"unpipe\",this,n);return this}var i=M(t.pipes,e);return-1===i||(t.pipes.splice(i,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit(\"unpipe\",this,n)),this},b.prototype.on=function(e,t){var n=u.prototype.on.call(this,e,t);if(\"data\"===e)!1!==this._readableState.flowing&&this.resume();else if(\"readable\"===e){var r=this._readableState;r.endEmitted||r.readableListening||(r.readableListening=r.needReadable=!0,r.emittedReadable=!1,r.reading?r.length&&S(this):o.nextTick(O,this))}return n},b.prototype.addListener=b.prototype.on,b.prototype.resume=function(){var e=this._readableState;return e.flowing||(h(\"resume\"),e.flowing=!0,function(e,t){t.resumeScheduled||(t.resumeScheduled=!0,o.nextTick(j,e,t))}(this,e)),this},b.prototype.pause=function(){return h(\"call pause flowing=%j\",this._readableState.flowing),!1!==this._readableState.flowing&&(h(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this},b.prototype.wrap=function(e){var t=this,n=this._readableState,r=!1;for(var o in e.on(\"end\",(function(){if(h(\"wrapped end\"),n.decoder&&!n.ended){var e=n.decoder.end();e&&e.length&&t.push(e)}t.push(null)})),e.on(\"data\",(function(o){(h(\"wrapped data\"),n.decoder&&(o=n.decoder.write(o)),n.objectMode&&null==o)||(n.objectMode||o&&o.length)&&(t.push(o)||(r=!0,e.pause()))})),e)void 0===this[o]&&\"function\"==typeof e[o]&&(this[o]=function(t){return function(){return e[t].apply(e,arguments)}}(o));for(var a=0;a<g.length;a++)e.on(g[a],this.emit.bind(this,g[a]));return this._read=function(t){h(\"wrapped _read\",t),r&&(r=!1,e.resume())},this},Object.defineProperty(b.prototype,\"readableHighWaterMark\",{enumerable:!1,get:function(){return this._readableState.highWaterMark}}),b._fromList=I}).call(this,n(51),n(90))},function(e,t,n){e.exports=n(255).EventEmitter},function(e,t,n){\"use strict\";var r=n(197);function o(e,t){e.emit(\"error\",t)}e.exports={destroy:function(e,t){var n=this,a=this._readableState&&this._readableState.destroyed,i=this._writableState&&this._writableState.destroyed;return a||i?(t?t(e):!e||this._writableState&&this._writableState.errorEmitted||r.nextTick(o,this,e),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(e||null,(function(e){!t&&e?(r.nextTick(o,n,e),n._writableState&&(n._writableState.errorEmitted=!0)):t&&t(e)})),this)},undestroy:function(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}}},function(e,t,n){(function(e){var r=void 0!==e&&e||\"undefined\"!=typeof self&&self||window,o=Function.prototype.apply;function a(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new a(o.call(setTimeout,r,arguments),clearTimeout)},t.setInterval=function(){return new a(o.call(setInterval,r,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},a.prototype.unref=a.prototype.ref=function(){},a.prototype.close=function(){this._clearFn.call(r,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(773),t.setImmediate=\"undefined\"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate=\"undefined\"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(51))},function(e,t,n){\"use strict\";var r=n(62).Buffer,o=r.isEncoding||function(e){switch((e=\"\"+e)&&e.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};function a(e){var t;switch(this.encoding=function(e){var t=function(e){if(!e)return\"utf8\";for(var t;;)switch(e){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return e;default:if(t)return;e=(\"\"+e).toLowerCase(),t=!0}}(e);if(\"string\"!=typeof t&&(r.isEncoding===o||!o(e)))throw new Error(\"Unknown encoding: \"+e);return t||e}(e),this.encoding){case\"utf16le\":this.text=u,this.end=c,t=4;break;case\"utf8\":this.fillLast=s,t=4;break;case\"base64\":this.text=l,this.end=p,t=3;break;default:return this.write=f,void(this.end=h)}this.lastNeed=0,this.lastTotal=0,this.lastChar=r.allocUnsafe(t)}function i(e){return e<=127?0:e>>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function s(e){var t=this.lastTotal-this.lastNeed,n=function(e,t,n){if(128!=(192&t[0]))return e.lastNeed=0,\"�\";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,\"�\";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,\"�\"}}(this,e);return void 0!==n?n:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function u(e,t){if((e.length-t)%2==0){var n=e.toString(\"utf16le\",t);if(n){var r=n.charCodeAt(n.length-1);if(r>=55296&&r<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],n.slice(0,-1)}return n}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString(\"utf16le\",t,e.length-1)}function c(e){var t=e&&e.length?this.write(e):\"\";if(this.lastNeed){var n=this.lastTotal-this.lastNeed;return t+this.lastChar.toString(\"utf16le\",0,n)}return t}function l(e,t){var n=(e.length-t)%3;return 0===n?e.toString(\"base64\",t):(this.lastNeed=3-n,this.lastTotal=3,1===n?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString(\"base64\",t,e.length-n))}function p(e){var t=e&&e.length?this.write(e):\"\";return this.lastNeed?t+this.lastChar.toString(\"base64\",0,3-this.lastNeed):t}function f(e){return e.toString(this.encoding)}function h(e){return e&&e.length?this.write(e):\"\"}t.StringDecoder=a,a.prototype.write=function(e){if(0===e.length)return\"\";var t,n;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return\"\";n=this.lastNeed,this.lastNeed=0}else n=0;return n<e.length?t?t+this.text(e,n):this.text(e,n):t||\"\"},a.prototype.end=function(e){var t=e&&e.length?this.write(e):\"\";return this.lastNeed?t+\"�\":t},a.prototype.text=function(e,t){var n=function(e,t,n){var r=t.length-1;if(r<n)return 0;var o=i(t[r]);if(o>=0)return o>0&&(e.lastNeed=o-1),o;if(--r<n||-2===o)return 0;if((o=i(t[r]))>=0)return o>0&&(e.lastNeed=o-2),o;if(--r<n||-2===o)return 0;if((o=i(t[r]))>=0)return o>0&&(2===o?o=0:e.lastNeed=o-3),o;return 0}(this,e,t);if(!this.lastNeed)return e.toString(\"utf8\",t);this.lastTotal=n;var r=e.length-(n-this.lastNeed);return e.copy(this.lastChar,0,r),e.toString(\"utf8\",t,r)},a.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},function(e,t,n){\"use strict\";e.exports=i;var r=n(116),o=n(162);function a(e,t){var n=this._transformState;n.transforming=!1;var r=n.writecb;if(!r)return this.emit(\"error\",new Error(\"write callback called multiple times\"));n.writechunk=null,n.writecb=null,null!=t&&this.push(t),r(e);var o=this._readableState;o.reading=!1,(o.needReadable||o.length<o.highWaterMark)&&this._read(o.highWaterMark)}function i(e){if(!(this instanceof i))return new i(e);r.call(this,e),this._transformState={afterTransform:a.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,e&&(\"function\"==typeof e.transform&&(this._transform=e.transform),\"function\"==typeof e.flush&&(this._flush=e.flush)),this.on(\"prefinish\",s)}function s(){var e=this;\"function\"==typeof this._flush?this._flush((function(t,n){u(e,t,n)})):u(this,null,null)}function u(e,t,n){if(t)return e.emit(\"error\",t);if(null!=n&&e.push(n),e._writableState.length)throw new Error(\"Calling transform done when ws.length != 0\");if(e._transformState.transforming)throw new Error(\"Calling transform done when still transforming\");return e.push(null)}o.inherits=n(61),o.inherits(i,r),i.prototype.push=function(e,t){return this._transformState.needTransform=!1,r.prototype.push.call(this,e,t)},i.prototype._transform=function(e,t,n){throw new Error(\"_transform() is not implemented\")},i.prototype._write=function(e,t,n){var r=this._transformState;if(r.writecb=n,r.writechunk=e,r.writeencoding=t,!r.transforming){var o=this._readableState;(r.needTransform||o.needReadable||o.length<o.highWaterMark)&&this._read(o.highWaterMark)}},i.prototype._read=function(e){var t=this._transformState;null!==t.writechunk&&t.writecb&&!t.transforming?(t.transforming=!0,this._transform(t.writechunk,t.writeencoding,t.afterTransform)):t.needTransform=!0},i.prototype._destroy=function(e,t){var n=this;r.prototype._destroy.call(this,e,(function(e){t(e),n.emit(\"close\")}))}},function(e,t,n){\"use strict\";var r=n(117),o=Array.prototype.forEach,a=Object.create,i=function(e,t){var n;for(n in e)t[n]=e[n]};e.exports=function(e){var t=a(null);return o.call(arguments,(function(e){r(e)&&i(Object(e),t)})),t}},function(e,t,n){\"use strict\";var r=n(118);e.exports=function(e,t,n){var o;return isNaN(e)?(o=t)>=0?n&&o?o-1:o:1:!1!==e&&r(e)}},function(e,t,n){\"use strict\";e.exports=n(789)()?Object.assign:n(790)},function(e,t,n){\"use strict\";var r,o,a,i,s,u=n(118),c=function(e,t){return t};try{Object.defineProperty(c,\"length\",{configurable:!0,writable:!1,enumerable:!1,value:1})}catch(e){}1===c.length?(r={configurable:!0,writable:!1,enumerable:!1},o=Object.defineProperty,e.exports=function(e,t){return t=u(t),e.length===t?e:(r.value=t,o(e,\"length\",r))}):(i=n(440),s=[],a=function(e){var t,n=0;if(s[e])return s[e];for(t=[];e--;)t.push(\"a\"+(++n).toString(36));return new Function(\"fn\",\"return function (\"+t.join(\", \")+\") { return fn.apply(this, arguments); };\")},e.exports=function(e,t){var n;if(t=u(t),e.length===t)return e;n=a(t)(e);try{i(n,e)}catch(e){}return n})},function(e,t,n){\"use strict\";var r=n(137),o=Object.defineProperty,a=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,s=Object.getOwnPropertySymbols;e.exports=function(e,t){var n,u=Object(r(t));if(e=Object(r(e)),i(u).forEach((function(r){try{o(e,r,a(t,r))}catch(e){n=e}})),\"function\"==typeof s&&s(u).forEach((function(r){try{o(e,r,a(t,r))}catch(e){n=e}})),void 0!==n)throw n;return e}},function(e,t,n){\"use strict\";e.exports=function(e){return null!=e}},function(e,t,n){\"use strict\";var r=n(812);e.exports=function(e){if(!r(e))throw new TypeError(e+\" is not a symbol\");return e}},function(e,t,n){\"use strict\";var r=n(100),o=n(198),a=Function.prototype.call;e.exports=function(e,t){var n={},i=arguments[2];return r(t),o(e,(function(e,r,o,s){n[r]=a.call(t,i,e,r,o,s)})),n}},function(e,t,n){\"use strict\";e.exports=function(e){return\"function\"==typeof e}},function(e,t){function n(e){return!!e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"function\"==typeof e.then}e.exports=n,e.exports.default=n},function(e,t,n){var r=n(61),o=n(138),a=n(62).Buffer,i=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],s=new Array(64);function u(){this.init(),this._w=s,o.call(this,64,56)}function c(e,t,n){return n^e&(t^n)}function l(e,t,n){return e&t|n&(e|t)}function p(e){return(e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10)}function f(e){return(e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7)}function h(e){return(e>>>7|e<<25)^(e>>>18|e<<14)^e>>>3}r(u,o),u.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},u.prototype._update=function(e){for(var t,n=this._w,r=0|this._a,o=0|this._b,a=0|this._c,s=0|this._d,u=0|this._e,d=0|this._f,m=0|this._g,v=0|this._h,g=0;g<16;++g)n[g]=e.readInt32BE(4*g);for(;g<64;++g)n[g]=0|(((t=n[g-2])>>>17|t<<15)^(t>>>19|t<<13)^t>>>10)+n[g-7]+h(n[g-15])+n[g-16];for(var y=0;y<64;++y){var b=v+f(u)+c(u,d,m)+i[y]+n[y]|0,_=p(r)+l(r,o,a)|0;v=m,m=d,d=u,u=s+b|0,s=a,a=o,o=r,r=b+_|0}this._a=r+this._a|0,this._b=o+this._b|0,this._c=a+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0,this._f=d+this._f|0,this._g=m+this._g|0,this._h=v+this._h|0},u.prototype._hash=function(){var e=a.allocUnsafe(32);return e.writeInt32BE(this._a,0),e.writeInt32BE(this._b,4),e.writeInt32BE(this._c,8),e.writeInt32BE(this._d,12),e.writeInt32BE(this._e,16),e.writeInt32BE(this._f,20),e.writeInt32BE(this._g,24),e.writeInt32BE(this._h,28),e},e.exports=u},function(e,t,n){var r=n(61),o=n(138),a=n(62).Buffer,i=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],s=new Array(160);function u(){this.init(),this._w=s,o.call(this,128,112)}function c(e,t,n){return n^e&(t^n)}function l(e,t,n){return e&t|n&(e|t)}function p(e,t){return(e>>>28|t<<4)^(t>>>2|e<<30)^(t>>>7|e<<25)}function f(e,t){return(e>>>14|t<<18)^(e>>>18|t<<14)^(t>>>9|e<<23)}function h(e,t){return(e>>>1|t<<31)^(e>>>8|t<<24)^e>>>7}function d(e,t){return(e>>>1|t<<31)^(e>>>8|t<<24)^(e>>>7|t<<25)}function m(e,t){return(e>>>19|t<<13)^(t>>>29|e<<3)^e>>>6}function v(e,t){return(e>>>19|t<<13)^(t>>>29|e<<3)^(e>>>6|t<<26)}function g(e,t){return e>>>0<t>>>0?1:0}r(u,o),u.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},u.prototype._update=function(e){for(var t=this._w,n=0|this._ah,r=0|this._bh,o=0|this._ch,a=0|this._dh,s=0|this._eh,u=0|this._fh,y=0|this._gh,b=0|this._hh,_=0|this._al,w=0|this._bl,x=0|this._cl,E=0|this._dl,S=0|this._el,C=0|this._fl,A=0|this._gl,k=0|this._hl,O=0;O<32;O+=2)t[O]=e.readInt32BE(4*O),t[O+1]=e.readInt32BE(4*O+4);for(;O<160;O+=2){var j=t[O-30],T=t[O-30+1],I=h(j,T),P=d(T,j),N=m(j=t[O-4],T=t[O-4+1]),M=v(T,j),R=t[O-14],D=t[O-14+1],L=t[O-32],B=t[O-32+1],F=P+D|0,U=I+R+g(F,P)|0;U=(U=U+N+g(F=F+M|0,M)|0)+L+g(F=F+B|0,B)|0,t[O]=U,t[O+1]=F}for(var q=0;q<160;q+=2){U=t[q],F=t[q+1];var z=l(n,r,o),V=l(_,w,x),W=p(n,_),H=p(_,n),$=f(s,S),J=f(S,s),K=i[q],Y=i[q+1],G=c(s,u,y),Z=c(S,C,A),X=k+J|0,Q=b+$+g(X,k)|0;Q=(Q=(Q=Q+G+g(X=X+Z|0,Z)|0)+K+g(X=X+Y|0,Y)|0)+U+g(X=X+F|0,F)|0;var ee=H+V|0,te=W+z+g(ee,H)|0;b=y,k=A,y=u,A=C,u=s,C=S,s=a+Q+g(S=E+X|0,E)|0,a=o,E=x,o=r,x=w,r=n,w=_,n=Q+te+g(_=X+ee|0,X)|0}this._al=this._al+_|0,this._bl=this._bl+w|0,this._cl=this._cl+x|0,this._dl=this._dl+E|0,this._el=this._el+S|0,this._fl=this._fl+C|0,this._gl=this._gl+A|0,this._hl=this._hl+k|0,this._ah=this._ah+n+g(this._al,_)|0,this._bh=this._bh+r+g(this._bl,w)|0,this._ch=this._ch+o+g(this._cl,x)|0,this._dh=this._dh+a+g(this._dl,E)|0,this._eh=this._eh+s+g(this._el,S)|0,this._fh=this._fh+u+g(this._fl,C)|0,this._gh=this._gh+y+g(this._gl,A)|0,this._hh=this._hh+b+g(this._hl,k)|0},u.prototype._hash=function(){var e=a.allocUnsafe(64);function t(t,n,r){e.writeInt32BE(t,r),e.writeInt32BE(n,r+4)}return t(this._ah,this._al,0),t(this._bh,this._bl,8),t(this._ch,this._cl,16),t(this._dh,this._dl,24),t(this._eh,this._el,32),t(this._fh,this._fl,40),t(this._gh,this._gl,48),t(this._hh,this._hl,56),e},e.exports=u},function(e,t,n){e.exports=n(851)},function(e,t,n){e.exports=n(852)},function(e,t,n){e.exports=n(871)},function(e,t,n){n(452),n(180),n(875),n(459),n(460),n(880),n(130),n(87);var r=n(34);e.exports=r.Promise},function(e,t,n){\"use strict\";var r=n(21),o=n(182),a=n(183),i=n(109),s=n(67),u=n(105),c=n(121),l=function(e,t){var n=this;if(!(n instanceof l))return new l(e,t);a&&(n=a(new Error(void 0),o(n))),void 0!==t&&s(n,\"message\",String(t));var r=[];return c(e,r.push,{that:r}),s(n,\"errors\",r),n};l.prototype=i(Error.prototype,{constructor:u(5,l),message:u(5,\"\"),name:u(5,\"AggregateError\")}),r({global:!0},{AggregateError:l})},function(e,t,n){var r=n(40);e.exports=r.Promise},function(e,t,n){\"use strict\";var r=n(70),o=n(68),a=n(41),i=n(48),s=a(\"species\");e.exports=function(e){var t=r(e),n=o.f;i&&t&&!t[s]&&n(t,s,{configurable:!0,get:function(){return this}})}},function(e,t,n){var r=n(52),o=n(77),a=n(41)(\"species\");e.exports=function(e,t){var n,i=r(e).constructor;return void 0===i||null==(n=r(i)[a])?t:o(n)}},function(e,t,n){var r,o,a,i=n(40),s=n(37),u=n(107),c=n(366),l=n(225),p=n(457),f=n(184),h=i.location,d=i.setImmediate,m=i.clearImmediate,v=i.process,g=i.MessageChannel,y=i.Dispatch,b=0,_={},w=\"onreadystatechange\",x=function(e){if(_.hasOwnProperty(e)){var t=_[e];delete _[e],t()}},E=function(e){return function(){x(e)}},S=function(e){x(e.data)},C=function(e){i.postMessage(e+\"\",h.protocol+\"//\"+h.host)};d&&m||(d=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return _[++b]=function(){(\"function\"==typeof e?e:Function(e)).apply(void 0,t)},r(b),b},m=function(e){delete _[e]},f?r=function(e){v.nextTick(E(e))}:y&&y.now?r=function(e){y.now(E(e))}:g&&!p?(a=(o=new g).port2,o.port1.onmessage=S,r=u(a.postMessage,a,1)):i.addEventListener&&\"function\"==typeof postMessage&&!i.importScripts&&h&&\"file:\"!==h.protocol&&!s(C)?(r=C,i.addEventListener(\"message\",S,!1)):r=w in l(\"script\")?function(e){c.appendChild(l(\"script\")).onreadystatechange=function(){c.removeChild(this),x(e)}}:function(e){setTimeout(E(e),0)}),e.exports={set:d,clear:m}},function(e,t,n){var r=n(108);e.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(r)},function(e,t,n){var r=n(52),o=n(47),a=n(164);e.exports=function(e,t){if(r(e),o(t)&&t.constructor===e)return t;var n=a.f(e);return(0,n.resolve)(t),n.promise}},function(e,t,n){\"use strict\";var r=n(21),o=n(77),a=n(164),i=n(200),s=n(121);r({target:\"Promise\",stat:!0},{allSettled:function(e){var t=this,n=a.f(t),r=n.resolve,u=n.reject,c=i((function(){var n=o(t.resolve),a=[],i=0,u=1;s(e,(function(e){var o=i++,s=!1;a.push(void 0),u++,n.call(t,e).then((function(e){s||(s=!0,a[o]={status:\"fulfilled\",value:e},--u||r(a))}),(function(e){s||(s=!0,a[o]={status:\"rejected\",reason:e},--u||r(a))}))})),--u||r(a)}));return c.error&&u(c.value),n.promise}})},function(e,t,n){\"use strict\";var r=n(21),o=n(77),a=n(70),i=n(164),s=n(200),u=n(121),c=\"No one promise resolved\";r({target:\"Promise\",stat:!0},{any:function(e){var t=this,n=i.f(t),r=n.resolve,l=n.reject,p=s((function(){var n=o(t.resolve),i=[],s=0,p=1,f=!1;u(e,(function(e){var o=s++,u=!1;i.push(void 0),p++,n.call(t,e).then((function(e){u||f||(f=!0,r(e))}),(function(e){u||f||(u=!0,i[o]=e,--p||l(new(a(\"AggregateError\"))(i,c)))}))})),--p||l(new(a(\"AggregateError\"))(i,c))}));return p.error&&l(p.value),n.promise}})},function(e,t,n){var r=n(48),o=n(155),a=n(66),i=n(176).f,s=function(e){return function(t){for(var n,s=a(t),u=o(s),c=u.length,l=0,p=[];c>l;)n=u[l++],r&&!i.call(s,n)||p.push(e?[n,s[n]]:s[n]);return p}};e.exports={entries:s(!0),values:s(!1)}},function(e,t,n){var r=n(201),o=n(135),a=n(195),i=n(57),s=n(136);e.exports=function(e,t,n,u){if(!i(e))return e;for(var c=-1,l=(t=o(t,e)).length,p=l-1,f=e;null!=f&&++c<l;){var h=s(t[c]),d=n;if(\"__proto__\"===h||\"constructor\"===h||\"prototype\"===h)return e;if(c!=p){var m=f[h];void 0===(d=u?u(m,h,f):void 0)&&(d=i(m)?m:a(t[c+1])?[]:{})}r(f,h,d),f=f[h]}return e}},function(e,t,n){var r=n(464);e.exports=function(e,t,n){\"__proto__\"==t&&r?r(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}},function(e,t,n){var r=n(113),o=function(){try{var e=r(Object,\"defineProperty\");return e({},\"\",{}),e}catch(e){}}();e.exports=o},function(e,t,n){e.exports=n(904)},function(e,t,n){e.exports=n(907)},function(e,t,n){\"use strict\";e.exports={hasCachedChildNodes:1}},function(e,t,n){\"use strict\";var r=n(30);n(25);e.exports=function(e,t){return null==t&&r(\"30\"),null==e?t:Array.isArray(e)?Array.isArray(t)?(e.push.apply(e,t),e):(e.push(t),e):Array.isArray(t)?[e].concat(t):[e,t]}},function(e,t,n){\"use strict\";e.exports=function(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}},function(e,t,n){\"use strict\";var r=n(56),o=null;e.exports=function(){return!o&&r.canUseDOM&&(o=\"textContent\"in document.documentElement?\"textContent\":\"innerText\"),o}},function(e,t,n){\"use strict\";var r=n(30);var o=n(122),a=(n(25),function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this._callbacks=null,this._contexts=null,this._arg=t}return e.prototype.enqueue=function(e,t){this._callbacks=this._callbacks||[],this._callbacks.push(e),this._contexts=this._contexts||[],this._contexts.push(t)},e.prototype.notifyAll=function(){var e=this._callbacks,t=this._contexts,n=this._arg;if(e&&t){e.length!==t.length&&r(\"24\"),this._callbacks=null,this._contexts=null;for(var o=0;o<e.length;o++)e[o].call(t[o],n);e.length=0,t.length=0}},e.prototype.checkpoint=function(){return this._callbacks?this._callbacks.length:0},e.prototype.rollback=function(e){this._callbacks&&this._contexts&&(this._callbacks.length=e,this._contexts.length=e)},e.prototype.reset=function(){this._callbacks=null,this._contexts=null},e.prototype.destructor=function(){this.reset()},e}());e.exports=o.addPoolingTo(a)},function(e,t,n){\"use strict\";e.exports={logTopLevelRenders:!1}},function(e,t,n){\"use strict\";var r=n(45);function o(e){var t=e.type,n=e.nodeName;return n&&\"input\"===n.toLowerCase()&&(\"checkbox\"===t||\"radio\"===t)}function a(e){return e._wrapperState.valueTracker}var i={_getTrackerFromNode:function(e){return a(r.getInstanceFromNode(e))},track:function(e){if(!a(e)){var t=r.getNodeFromInstance(e),n=o(t)?\"checked\":\"value\",i=Object.getOwnPropertyDescriptor(t.constructor.prototype,n),s=\"\"+t[n];t.hasOwnProperty(n)||\"function\"!=typeof i.get||\"function\"!=typeof i.set||(Object.defineProperty(t,n,{enumerable:i.enumerable,configurable:!0,get:function(){return i.get.call(this)},set:function(e){s=\"\"+e,i.set.call(this,e)}}),function(e,t){e._wrapperState.valueTracker=t}(e,{getValue:function(){return s},setValue:function(e){s=\"\"+e},stopTracking:function(){!function(e){e._wrapperState.valueTracker=null}(e),delete t[n]}}))}},updateValueIfChanged:function(e){if(!e)return!1;var t=a(e);if(!t)return i.track(e),!0;var n,s,u=t.getValue(),c=((n=r.getNodeFromInstance(e))&&(s=o(n)?\"\"+n.checked:n.value),s);return c!==u&&(t.setValue(c),!0)},stopTracking:function(e){var t=a(e);t&&t.stopTracking()}};e.exports=i},function(e,t,n){\"use strict\";var r={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};e.exports=function(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return\"input\"===t?!!r[e.type]:\"textarea\"===t}},function(e,t,n){\"use strict\";var r={currentScrollLeft:0,currentScrollTop:0,refreshScrollValues:function(e){r.currentScrollLeft=e.x,r.currentScrollTop=e.y}};e.exports=r},function(e,t,n){\"use strict\";var r=n(56),o=n(205),a=n(204),i=function(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t};r.canUseDOM&&(\"textContent\"in document.documentElement||(i=function(e,t){3!==e.nodeType?a(e,o(t)):e.nodeValue=t})),e.exports=i},function(e,t,n){\"use strict\";e.exports=function(e){try{e.focus()}catch(e){}}},function(e,t,n){\"use strict\";var r={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0};var o=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(r).forEach((function(e){o.forEach((function(t){r[function(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}(t,e)]=r[e]}))}));var a={isUnitlessNumber:r,shorthandPropertyExpansions:{background:{backgroundAttachment:!0,backgroundColor:!0,backgroundImage:!0,backgroundPositionX:!0,backgroundPositionY:!0,backgroundRepeat:!0},backgroundPosition:{backgroundPositionX:!0,backgroundPositionY:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0},outline:{outlineWidth:!0,outlineStyle:!0,outlineColor:!0}}};e.exports=a},function(e,t,n){\"use strict\";var r=n(140),o=(n(45),n(72),n(945)),a=(n(33),new RegExp(\"^[\"+r.ATTRIBUTE_NAME_START_CHAR+\"][\"+r.ATTRIBUTE_NAME_CHAR+\"]*$\")),i={},s={};function u(e){return!!s.hasOwnProperty(e)||!i.hasOwnProperty(e)&&(a.test(e)?(s[e]=!0,!0):(i[e]=!0,!1))}function c(e,t){return null==t||e.hasBooleanValue&&!t||e.hasNumericValue&&isNaN(t)||e.hasPositiveNumericValue&&t<1||e.hasOverloadedBooleanValue&&!1===t}var l={createMarkupForID:function(e){return r.ID_ATTRIBUTE_NAME+\"=\"+o(e)},setAttributeForID:function(e,t){e.setAttribute(r.ID_ATTRIBUTE_NAME,t)},createMarkupForRoot:function(){return r.ROOT_ATTRIBUTE_NAME+'=\"\"'},setAttributeForRoot:function(e){e.setAttribute(r.ROOT_ATTRIBUTE_NAME,\"\")},createMarkupForProperty:function(e,t){var n=r.properties.hasOwnProperty(e)?r.properties[e]:null;if(n){if(c(n,t))return\"\";var a=n.attributeName;return n.hasBooleanValue||n.hasOverloadedBooleanValue&&!0===t?a+'=\"\"':a+\"=\"+o(t)}return r.isCustomAttribute(e)?null==t?\"\":e+\"=\"+o(t):null},createMarkupForCustomAttribute:function(e,t){return u(e)&&null!=t?e+\"=\"+o(t):\"\"},setValueForProperty:function(e,t,n){var o=r.properties.hasOwnProperty(t)?r.properties[t]:null;if(o){var a=o.mutationMethod;if(a)a(e,n);else{if(c(o,n))return void this.deleteValueForProperty(e,t);if(o.mustUseProperty)e[o.propertyName]=n;else{var i=o.attributeName,s=o.attributeNamespace;s?e.setAttributeNS(s,i,\"\"+n):o.hasBooleanValue||o.hasOverloadedBooleanValue&&!0===n?e.setAttribute(i,\"\"):e.setAttribute(i,\"\"+n)}}}else if(r.isCustomAttribute(t))return void l.setValueForAttribute(e,t,n)},setValueForAttribute:function(e,t,n){u(t)&&(null==n?e.removeAttribute(t):e.setAttribute(t,\"\"+n))},deleteValueForAttribute:function(e,t){e.removeAttribute(t)},deleteValueForProperty:function(e,t){var n=r.properties.hasOwnProperty(t)?r.properties[t]:null;if(n){var o=n.mutationMethod;if(o)o(e,void 0);else if(n.mustUseProperty){var a=n.propertyName;n.hasBooleanValue?e[a]=!1:e[a]=\"\"}else e.removeAttribute(n.attributeName)}else r.isCustomAttribute(t)&&e.removeAttribute(t)}};e.exports=l},function(e,t,n){\"use strict\";var r=n(38),o=n(270),a=n(45),i=n(80),s=(n(33),!1);function u(){if(this._rootNodeID&&this._wrapperState.pendingUpdate){this._wrapperState.pendingUpdate=!1;var e=this._currentElement.props,t=o.getValue(e);null!=t&&c(this,Boolean(e.multiple),t)}}function c(e,t,n){var r,o,i=a.getNodeFromInstance(e).options;if(t){for(r={},o=0;o<n.length;o++)r[\"\"+n[o]]=!0;for(o=0;o<i.length;o++){var s=r.hasOwnProperty(i[o].value);i[o].selected!==s&&(i[o].selected=s)}}else{for(r=\"\"+n,o=0;o<i.length;o++)if(i[o].value===r)return void(i[o].selected=!0);i.length&&(i[0].selected=!0)}}var l={getHostProps:function(e,t){return r({},t,{onChange:e._wrapperState.onChange,value:void 0})},mountWrapper:function(e,t){var n=o.getValue(t);e._wrapperState={pendingUpdate:!1,initialValue:null!=n?n:t.defaultValue,listeners:null,onChange:p.bind(e),wasMultiple:Boolean(t.multiple)},void 0===t.value||void 0===t.defaultValue||s||(s=!0)},getSelectValueContext:function(e){return e._wrapperState.initialValue},postUpdateWrapper:function(e){var t=e._currentElement.props;e._wrapperState.initialValue=void 0;var n=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=Boolean(t.multiple);var r=o.getValue(t);null!=r?(e._wrapperState.pendingUpdate=!1,c(e,Boolean(t.multiple),r)):n!==Boolean(t.multiple)&&(null!=t.defaultValue?c(e,Boolean(t.multiple),t.defaultValue):c(e,Boolean(t.multiple),t.multiple?[]:\"\"))}};function p(e){var t=this._currentElement.props,n=o.executeOnChange(t,e);return this._rootNodeID&&(this._wrapperState.pendingUpdate=!0),i.asap(u,this),n}e.exports=l},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(954),i=n(483),s=n(484),u=(n(955),n(25),n(33),function(e){this.construct(e)});function c(e,t){var n;if(null===e||!1===e)n=i.create(c);else if(\"object\"==typeof e){var o=e,a=o.type;if(\"function\"!=typeof a&&\"string\"!=typeof a){var l=\"\";0,l+=function(e){if(e){var t=e.getName();if(t)return\" Check the render method of `\"+t+\"`.\"}return\"\"}(o._owner),r(\"130\",null==a?a:typeof a,l)}\"string\"==typeof o.type?n=s.createInternalComponent(o):!function(e){return\"function\"==typeof e&&void 0!==e.prototype&&\"function\"==typeof e.prototype.mountComponent&&\"function\"==typeof e.prototype.receiveComponent}(o.type)?n=new u(o):(n=new o.type(o)).getHostNode||(n.getHostNode=n.getNativeNode)}else\"string\"==typeof e||\"number\"==typeof e?n=s.createInstanceForText(e):r(\"131\",typeof e);return n._mountIndex=0,n._mountImage=null,n}o(u.prototype,a,{_instantiateReactComponent:c}),e.exports=c},function(e,t,n){\"use strict\";var r=n(30),o=n(132),a=(n(25),{HOST:0,COMPOSITE:1,EMPTY:2,getType:function(e){return null===e||!1===e?a.EMPTY:o.isValidElement(e)?\"function\"==typeof e.type?a.COMPOSITE:a.HOST:void r(\"26\",e)}});e.exports=a},function(e,t,n){\"use strict\";var r,o={injectEmptyComponentFactory:function(e){r=e}},a={create:function(e){return r(e)}};a.injection=o,e.exports=a},function(e,t,n){\"use strict\";var r=n(30),o=(n(25),null),a=null;var i={createInternalComponent:function(e){return o||r(\"111\",e.type),new o(e)},createInstanceForText:function(e){return new a(e)},isTextComponent:function(e){return e instanceof a},injection:{injectGenericComponentClass:function(e){o=e},injectTextComponentClass:function(e){a=e}}};e.exports=i},function(e,t,n){\"use strict\";var r=n(30),o=(n(88),n(956)),a=n(957),i=(n(25),n(274));n(33);function s(e,t){return e&&\"object\"==typeof e&&null!=e.key?i.escape(e.key):t.toString(36)}function u(e,t,n,c){var l,p=typeof e;if(\"undefined\"!==p&&\"boolean\"!==p||(e=null),null===e||\"string\"===p||\"number\"===p||\"object\"===p&&e.$$typeof===o)return n(c,e,\"\"===t?\".\"+s(e,0):t),1;var f=0,h=\"\"===t?\".\":t+\":\";if(Array.isArray(e))for(var d=0;d<e.length;d++)f+=u(l=e[d],h+s(l,d),n,c);else{var m=a(e);if(m){var v,g=m.call(e);if(m!==e.entries)for(var y=0;!(v=g.next()).done;)f+=u(l=v.value,h+s(l,y++),n,c);else for(;!(v=g.next()).done;){var b=v.value;b&&(f+=u(l=b[1],h+i.escape(b[0])+\":\"+s(l,0),n,c))}}else if(\"object\"===p){var _=String(e);r(\"31\",\"[object Object]\"===_?\"object with keys {\"+Object.keys(e).join(\", \")+\"}\":_,\"\")}}return f}e.exports=function(e,t,n){return null==e?0:u(e,\"\",t,n)}},function(e,t,n){\"use strict\";var r,o,a,i,s,u,c,l=n(158),p=n(88);n(25),n(33);function f(e){var t=Function.prototype.toString,n=Object.prototype.hasOwnProperty,r=RegExp(\"^\"+t.call(n).replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");try{var o=t.call(e);return r.test(o)}catch(e){return!1}}if(\"function\"==typeof Array.from&&\"function\"==typeof Map&&f(Map)&&null!=Map.prototype&&\"function\"==typeof Map.prototype.keys&&f(Map.prototype.keys)&&\"function\"==typeof Set&&f(Set)&&null!=Set.prototype&&\"function\"==typeof Set.prototype.keys&&f(Set.prototype.keys)){var h=new Map,d=new Set;r=function(e,t){h.set(e,t)},o=function(e){return h.get(e)},a=function(e){h.delete(e)},i=function(){return Array.from(h.keys())},s=function(e){d.add(e)},u=function(e){d.delete(e)},c=function(){return Array.from(d.keys())}}else{var m={},v={},g=function(e){return\".\"+e},y=function(e){return parseInt(e.substr(1),10)};r=function(e,t){var n=g(e);m[n]=t},o=function(e){var t=g(e);return m[t]},a=function(e){var t=g(e);delete m[t]},i=function(){return Object.keys(m).map(y)},s=function(e){var t=g(e);v[t]=!0},u=function(e){var t=g(e);delete v[t]},c=function(){return Object.keys(v).map(y)}}var b=[];function _(e){var t=o(e);if(t){var n=t.childIDs;a(e),n.forEach(_)}}function w(e,t,n){return\"\\n    in \"+(e||\"Unknown\")+(t?\" (at \"+t.fileName.replace(/^.*[\\\\\\/]/,\"\")+\":\"+t.lineNumber+\")\":n?\" (created by \"+n+\")\":\"\")}function x(e){return null==e?\"#empty\":\"string\"==typeof e||\"number\"==typeof e?\"#text\":\"string\"==typeof e.type?e.type:e.type.displayName||e.type.name||\"Unknown\"}function E(e){var t,n=S.getDisplayName(e),r=S.getElement(e),o=S.getOwnerID(e);return o&&(t=S.getDisplayName(o)),w(n,r&&r._source,t)}var S={onSetChildren:function(e,t){var n=o(e);n||l(\"144\"),n.childIDs=t;for(var r=0;r<t.length;r++){var a=t[r],i=o(a);i||l(\"140\"),null==i.childIDs&&\"object\"==typeof i.element&&null!=i.element&&l(\"141\"),i.isMounted||l(\"71\"),null==i.parentID&&(i.parentID=e),i.parentID!==e&&l(\"142\",a,i.parentID,e)}},onBeforeMountComponent:function(e,t,n){r(e,{element:t,parentID:n,text:null,childIDs:[],isMounted:!1,updateCount:0})},onBeforeUpdateComponent:function(e,t){var n=o(e);n&&n.isMounted&&(n.element=t)},onMountComponent:function(e){var t=o(e);t||l(\"144\"),t.isMounted=!0,0===t.parentID&&s(e)},onUpdateComponent:function(e){var t=o(e);t&&t.isMounted&&t.updateCount++},onUnmountComponent:function(e){var t=o(e);t&&(t.isMounted=!1,0===t.parentID&&u(e));b.push(e)},purgeUnmountedComponents:function(){if(!S._preventPurging){for(var e=0;e<b.length;e++){_(b[e])}b.length=0}},isMounted:function(e){var t=o(e);return!!t&&t.isMounted},getCurrentStackAddendum:function(e){var t=\"\";if(e){var n=x(e),r=e._owner;t+=w(n,e._source,r&&r.getName())}var o=p.current,a=o&&o._debugID;return t+=S.getStackAddendumByID(a)},getStackAddendumByID:function(e){for(var t=\"\";e;)t+=E(e),e=S.getParentID(e);return t},getChildIDs:function(e){var t=o(e);return t?t.childIDs:[]},getDisplayName:function(e){var t=S.getElement(e);return t?x(t):null},getElement:function(e){var t=o(e);return t?t.element:null},getOwnerID:function(e){var t=S.getElement(e);return t&&t._owner?t._owner._debugID:null},getParentID:function(e){var t=o(e);return t?t.parentID:null},getSource:function(e){var t=o(e),n=t?t.element:null;return null!=n?n._source:null},getText:function(e){var t=S.getElement(e);return\"string\"==typeof t?t:\"number\"==typeof t?\"\"+t:null},getUpdateCount:function(e){var t=o(e);return t?t.updateCount:0},getRootIDs:c,getRegisteredIDs:i,pushNonStandardWarningStack:function(e,t){if(\"function\"==typeof console.reactStack){var n=[],r=p.current,o=r&&r._debugID;try{for(e&&n.push({name:o?S.getDisplayName(o):null,fileName:t?t.fileName:null,lineNumber:t?t.lineNumber:null});o;){var a=S.getElement(o),i=S.getParentID(o),s=S.getOwnerID(o),u=s?S.getDisplayName(s):null,c=a&&a._source;n.push({name:u,fileName:c?c.fileName:null,lineNumber:c?c.lineNumber:null}),o=i}}catch(e){}console.reactStack(n)}},popNonStandardWarningStack:function(){\"function\"==typeof console.reactStackEnd&&console.reactStackEnd()}};e.exports=S},function(e,t,n){\"use strict\";var r=n(79),o={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent(\"on\"+t,n),{remove:function(){e.detachEvent(\"on\"+t,n)}}):void 0},capture:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!0),{remove:function(){e.removeEventListener(t,n,!0)}}):{remove:r}},registerDefault:function(){}};e.exports=o},function(e,t,n){\"use strict\";var r=n(969),o=n(971),a=n(477),i=n(489);var s={hasSelectionCapabilities:function(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(\"input\"===t&&\"text\"===e.type||\"textarea\"===t||\"true\"===e.contentEditable)},getSelectionInformation:function(){var e=i();return{focusedElem:e,selectionRange:s.hasSelectionCapabilities(e)?s.getSelection(e):null}},restoreSelection:function(e){var t,n=i(),r=e.focusedElem,u=e.selectionRange;n!==r&&(t=r,o(document.documentElement,t))&&(s.hasSelectionCapabilities(r)&&s.setSelection(r,u),a(r))},getSelection:function(e){var t;if(\"selectionStart\"in e)t={start:e.selectionStart,end:e.selectionEnd};else if(document.selection&&e.nodeName&&\"input\"===e.nodeName.toLowerCase()){var n=document.selection.createRange();n.parentElement()===e&&(t={start:-n.moveStart(\"character\",-e.value.length),end:-n.moveEnd(\"character\",-e.value.length)})}else t=r.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,o=t.end;if(void 0===o&&(o=n),\"selectionStart\"in e)e.selectionStart=n,e.selectionEnd=Math.min(o,e.value.length);else if(document.selection&&e.nodeName&&\"input\"===e.nodeName.toLowerCase()){var a=e.createTextRange();a.collapse(!0),a.moveStart(\"character\",n),a.moveEnd(\"character\",o-n),a.select()}else r.setOffsets(e,t)}};e.exports=s},function(e,t,n){\"use strict\";e.exports=function(e){if(void 0===(e=e||(\"undefined\"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}},function(e,t,n){\"use strict\";var r=n(30),o=n(142),a=n(140),i=n(132),s=n(206),u=(n(88),n(45)),c=n(986),l=n(987),p=n(472),f=n(168),h=(n(72),n(988)),d=n(141),m=n(275),v=n(80),g=n(241),y=n(481),b=(n(25),n(204)),_=n(273),w=(n(33),a.ID_ATTRIBUTE_NAME),x=a.ROOT_ATTRIBUTE_NAME,E={};function S(e){return e?9===e.nodeType?e.documentElement:e.firstChild:null}function C(e,t,n,r,o){var a;if(p.logTopLevelRenders){var i=e._currentElement.props.child.type;a=\"React mount: \"+(\"string\"==typeof i?i:i.displayName||i.name),console.time(a)}var s=d.mountComponent(e,n,null,c(e,t),o,0);a&&console.timeEnd(a),e._renderedComponent._topLevelWrapper=e,N._mountImageIntoNode(s,t,e,r,n)}function A(e,t,n,r){var o=v.ReactReconcileTransaction.getPooled(!n&&l.useCreateElement);o.perform(C,null,e,t,o,n,r),v.ReactReconcileTransaction.release(o)}function k(e,t,n){for(0,d.unmountComponent(e,n),9===t.nodeType&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)}function O(e){var t=S(e);if(t){var n=u.getInstanceFromNode(t);return!(!n||!n._hostParent)}}function j(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function T(e){var t=function(e){var t=S(e),n=t&&u.getInstanceFromNode(t);return n&&!n._hostParent?n:null}(e);return t?t._hostContainerInfo._topLevelWrapper:null}var I=1,P=function(){this.rootID=I++};P.prototype.isReactComponent={},P.prototype.render=function(){return this.props.child},P.isReactTopLevelWrapper=!0;var N={TopLevelWrapper:P,_instancesByReactRootID:E,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,r,o){return N.scrollMonitor(r,(function(){m.enqueueElementInternal(e,t,n),o&&m.enqueueCallbackInternal(e,o)})),e},_renderNewRootComponent:function(e,t,n,o){j(t)||r(\"37\"),s.ensureScrollValueMonitoring();var a=y(e,!1);v.batchedUpdates(A,a,t,n,o);var i=a._instance.rootID;return E[i]=a,a},renderSubtreeIntoContainer:function(e,t,n,o){return null!=e&&f.has(e)||r(\"38\"),N._renderSubtreeIntoContainer(e,t,n,o)},_renderSubtreeIntoContainer:function(e,t,n,o){m.validateCallback(o,\"ReactDOM.render\"),i.isValidElement(t)||r(\"39\",\"string\"==typeof t?\" Instead of passing a string like 'div', pass React.createElement('div') or <div />.\":\"function\"==typeof t?\" Instead of passing a class like Foo, pass React.createElement(Foo) or <Foo />.\":null!=t&&void 0!==t.props?\" This may be caused by unintentionally loading two independent copies of React.\":\"\");var a,s=i.createElement(P,{child:t});if(e){var u=f.get(e);a=u._processChildContext(u._context)}else a=g;var c=T(n);if(c){var l=c._currentElement.props.child;if(_(l,t)){var p=c._renderedComponent.getPublicInstance(),h=o&&function(){o.call(p)};return N._updateRootComponent(c,s,a,n,h),p}N.unmountComponentAtNode(n)}var d,v=S(n),y=v&&!(!(d=v).getAttribute||!d.getAttribute(w)),b=O(n),x=y&&!c&&!b,E=N._renderNewRootComponent(s,n,x,a)._renderedComponent.getPublicInstance();return o&&o.call(E),E},render:function(e,t,n){return N._renderSubtreeIntoContainer(null,e,t,n)},unmountComponentAtNode:function(e){j(e)||r(\"40\");var t=T(e);if(!t){O(e),1===e.nodeType&&e.hasAttribute(x);return!1}return delete E[t._instance.rootID],v.batchedUpdates(k,t,e,!1),!0},_mountImageIntoNode:function(e,t,n,a,i){if(j(t)||r(\"41\"),a){var s=S(t);if(h.canReuseMarkup(e,s))return void u.precacheNode(n,s);var c=s.getAttribute(h.CHECKSUM_ATTR_NAME);s.removeAttribute(h.CHECKSUM_ATTR_NAME);var l=s.outerHTML;s.setAttribute(h.CHECKSUM_ATTR_NAME,c);var p=e,f=function(e,t){for(var n=Math.min(e.length,t.length),r=0;r<n;r++)if(e.charAt(r)!==t.charAt(r))return r;return e.length===t.length?-1:n}(p,l),d=\" (client) \"+p.substring(f-20,f+20)+\"\\n (server) \"+l.substring(f-20,f+20);9===t.nodeType&&r(\"42\",d)}if(9===t.nodeType&&r(\"43\"),i.useCreateElement){for(;t.lastChild;)t.removeChild(t.lastChild);o.insertTreeBefore(t,e,null)}else b(t,e),u.precacheNode(n,t.firstChild)}};e.exports=N},function(e,t,n){\"use strict\";var r=n(482);e.exports=function(e){for(var t;(t=e._renderedNodeType)===r.COMPOSITE;)e=e._renderedComponent;return t===r.HOST?e._renderedComponent:t===r.EMPTY?null:void 0}},function(e,t,n){\"use strict\";t.__esModule=!0;var r,o=n(11),a=(r=o)&&r.__esModule?r:{default:r};t.default=a.default.shape({subscribe:a.default.func.isRequired,dispatch:a.default.func.isRequired,getState:a.default.func.isRequired})},function(e,t,n){\"use strict\";t.__esModule=!0,t.default=function(e){\"undefined\"!=typeof console&&\"function\"==typeof console.error&&console.error(e);try{throw new Error(e)}catch(e){}}},function(e,t,n){var r=n(246),o=n(1e3),a=n(201),i=n(1001),s=n(1002),u=n(1005),c=n(1006),l=n(1007),p=n(1008),f=n(417),h=n(496),d=n(161),m=n(1009),v=n(1010),g=n(1015),y=n(50),b=n(193),_=n(1017),w=n(57),x=n(1019),E=n(114),S=n(279),C=\"[object Arguments]\",A=\"[object Function]\",k=\"[object Object]\",O={};O[C]=O[\"[object Array]\"]=O[\"[object ArrayBuffer]\"]=O[\"[object DataView]\"]=O[\"[object Boolean]\"]=O[\"[object Date]\"]=O[\"[object Float32Array]\"]=O[\"[object Float64Array]\"]=O[\"[object Int8Array]\"]=O[\"[object Int16Array]\"]=O[\"[object Int32Array]\"]=O[\"[object Map]\"]=O[\"[object Number]\"]=O[k]=O[\"[object RegExp]\"]=O[\"[object Set]\"]=O[\"[object String]\"]=O[\"[object Symbol]\"]=O[\"[object Uint8Array]\"]=O[\"[object Uint8ClampedArray]\"]=O[\"[object Uint16Array]\"]=O[\"[object Uint32Array]\"]=!0,O[\"[object Error]\"]=O[A]=O[\"[object WeakMap]\"]=!1,e.exports=function e(t,n,j,T,I,P){var N,M=1&n,R=2&n,D=4&n;if(j&&(N=I?j(t,T,I,P):j(t)),void 0!==N)return N;if(!w(t))return t;var L=y(t);if(L){if(N=m(t),!M)return c(t,N)}else{var B=d(t),F=B==A||\"[object GeneratorFunction]\"==B;if(b(t))return u(t,M);if(B==k||B==C||F&&!I){if(N=R||F?{}:g(t),!M)return R?p(t,s(N,t)):l(t,i(N,t))}else{if(!O[B])return I?t:{};N=v(t,B,M)}}P||(P=new r);var U=P.get(t);if(U)return U;P.set(t,N),x(t)?t.forEach((function(r){N.add(e(r,n,j,r,t,P))})):_(t)&&t.forEach((function(r,o){N.set(o,e(r,n,j,o,t,P))}));var q=L?void 0:(D?R?h:f:R?S:E)(t);return o(q||t,(function(r,o){q&&(r=t[o=r]),a(N,o,e(r,n,j,o,t,P))})),N}},function(e,t,n){var r=n(247),o=n(278),a=n(248),i=n(419),s=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)r(t,a(e)),e=o(e);return t}:i;e.exports=s},function(e,t,n){var r=n(418),o=n(495),a=n(279);e.exports=function(e){return r(e,a,o)}},function(e,t,n){var r=n(1025),o=n(498),a=n(499);e.exports=function(e){return a(o(e,void 0,r),e+\"\")}},function(e,t,n){var r=n(1028),o=Math.max;e.exports=function(e,t,n){return t=o(void 0===t?e.length-1:t,0),function(){for(var a=arguments,i=-1,s=o(a.length-t,0),u=Array(s);++i<s;)u[i]=a[t+i];i=-1;for(var c=Array(t+1);++i<t;)c[i]=a[i];return c[t]=n(u),r(e,this,c)}}},function(e,t,n){var r=n(1029),o=n(1031)(r);e.exports=o},function(e,t){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}},function(e,t){!function(e){!function(t){var n=\"URLSearchParams\"in e,r=\"Symbol\"in e&&\"iterator\"in Symbol,o=\"FileReader\"in e&&\"Blob\"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),a=\"FormData\"in e,i=\"ArrayBuffer\"in e;if(i)var s=[\"[object Int8Array]\",\"[object Uint8Array]\",\"[object Uint8ClampedArray]\",\"[object Int16Array]\",\"[object Uint16Array]\",\"[object Int32Array]\",\"[object Uint32Array]\",\"[object Float32Array]\",\"[object Float64Array]\"],u=ArrayBuffer.isView||function(e){return e&&s.indexOf(Object.prototype.toString.call(e))>-1};function c(e){if(\"string\"!=typeof e&&(e=String(e)),/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(e))throw new TypeError(\"Invalid character in header field name\");return e.toLowerCase()}function l(e){return\"string\"!=typeof e&&(e=String(e)),e}function p(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return r&&(t[Symbol.iterator]=function(){return t}),t}function f(e){this.map={},e instanceof f?e.forEach((function(e,t){this.append(t,e)}),this):Array.isArray(e)?e.forEach((function(e){this.append(e[0],e[1])}),this):e&&Object.getOwnPropertyNames(e).forEach((function(t){this.append(t,e[t])}),this)}function h(e){if(e.bodyUsed)return Promise.reject(new TypeError(\"Already read\"));e.bodyUsed=!0}function d(e){return new Promise((function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}}))}function m(e){var t=new FileReader,n=d(t);return t.readAsArrayBuffer(e),n}function v(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function g(){return this.bodyUsed=!1,this._initBody=function(e){var t;this._bodyInit=e,e?\"string\"==typeof e?this._bodyText=e:o&&Blob.prototype.isPrototypeOf(e)?this._bodyBlob=e:a&&FormData.prototype.isPrototypeOf(e)?this._bodyFormData=e:n&&URLSearchParams.prototype.isPrototypeOf(e)?this._bodyText=e.toString():i&&o&&((t=e)&&DataView.prototype.isPrototypeOf(t))?(this._bodyArrayBuffer=v(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):i&&(ArrayBuffer.prototype.isPrototypeOf(e)||u(e))?this._bodyArrayBuffer=v(e):this._bodyText=e=Object.prototype.toString.call(e):this._bodyText=\"\",this.headers.get(\"content-type\")||(\"string\"==typeof e?this.headers.set(\"content-type\",\"text/plain;charset=UTF-8\"):this._bodyBlob&&this._bodyBlob.type?this.headers.set(\"content-type\",this._bodyBlob.type):n&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"))},o&&(this.blob=function(){var e=h(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error(\"could not read FormData body as blob\");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?h(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(m)}),this.text=function(){var e,t,n,r=h(this);if(r)return r;if(this._bodyBlob)return e=this._bodyBlob,t=new FileReader,n=d(t),t.readAsText(e),n;if(this._bodyArrayBuffer)return Promise.resolve(function(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join(\"\")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error(\"could not read FormData body as text\");return Promise.resolve(this._bodyText)},a&&(this.formData=function(){return this.text().then(_)}),this.json=function(){return this.text().then(JSON.parse)},this}f.prototype.append=function(e,t){e=c(e),t=l(t);var n=this.map[e];this.map[e]=n?n+\", \"+t:t},f.prototype.delete=function(e){delete this.map[c(e)]},f.prototype.get=function(e){return e=c(e),this.has(e)?this.map[e]:null},f.prototype.has=function(e){return this.map.hasOwnProperty(c(e))},f.prototype.set=function(e,t){this.map[c(e)]=l(t)},f.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},f.prototype.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),p(e)},f.prototype.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),p(e)},f.prototype.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),p(e)},r&&(f.prototype[Symbol.iterator]=f.prototype.entries);var y=[\"DELETE\",\"GET\",\"HEAD\",\"OPTIONS\",\"POST\",\"PUT\"];function b(e,t){var n,r,o=(t=t||{}).body;if(e instanceof b){if(e.bodyUsed)throw new TypeError(\"Already read\");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new f(e.headers)),this.method=e.method,this.mode=e.mode,this.signal=e.signal,o||null==e._bodyInit||(o=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||\"same-origin\",!t.headers&&this.headers||(this.headers=new f(t.headers)),this.method=(n=t.method||this.method||\"GET\",r=n.toUpperCase(),y.indexOf(r)>-1?r:n),this.mode=t.mode||this.mode||null,this.signal=t.signal||this.signal,this.referrer=null,(\"GET\"===this.method||\"HEAD\"===this.method)&&o)throw new TypeError(\"Body not allowed for GET or HEAD requests\");this._initBody(o)}function _(e){var t=new FormData;return e.trim().split(\"&\").forEach((function(e){if(e){var n=e.split(\"=\"),r=n.shift().replace(/\\+/g,\" \"),o=n.join(\"=\").replace(/\\+/g,\" \");t.append(decodeURIComponent(r),decodeURIComponent(o))}})),t}function w(e,t){t||(t={}),this.type=\"default\",this.status=void 0===t.status?200:t.status,this.ok=this.status>=200&&this.status<300,this.statusText=\"statusText\"in t?t.statusText:\"OK\",this.headers=new f(t.headers),this.url=t.url||\"\",this._initBody(e)}b.prototype.clone=function(){return new b(this,{body:this._bodyInit})},g.call(b.prototype),g.call(w.prototype),w.prototype.clone=function(){return new w(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new f(this.headers),url:this.url})},w.error=function(){var e=new w(null,{status:0,statusText:\"\"});return e.type=\"error\",e};var x=[301,302,303,307,308];w.redirect=function(e,t){if(-1===x.indexOf(t))throw new RangeError(\"Invalid status code\");return new w(null,{status:t,headers:{location:e}})},t.DOMException=e.DOMException;try{new t.DOMException}catch(e){t.DOMException=function(e,t){this.message=e,this.name=t;var n=Error(e);this.stack=n.stack},t.DOMException.prototype=Object.create(Error.prototype),t.DOMException.prototype.constructor=t.DOMException}function E(e,n){return new Promise((function(r,a){var i=new b(e,n);if(i.signal&&i.signal.aborted)return a(new t.DOMException(\"Aborted\",\"AbortError\"));var s=new XMLHttpRequest;function u(){s.abort()}s.onload=function(){var e,t,n={status:s.status,statusText:s.statusText,headers:(e=s.getAllResponseHeaders()||\"\",t=new f,e.replace(/\\r?\\n[\\t ]+/g,\" \").split(/\\r?\\n/).forEach((function(e){var n=e.split(\":\"),r=n.shift().trim();if(r){var o=n.join(\":\").trim();t.append(r,o)}})),t)};n.url=\"responseURL\"in s?s.responseURL:n.headers.get(\"X-Request-URL\");var o=\"response\"in s?s.response:s.responseText;r(new w(o,n))},s.onerror=function(){a(new TypeError(\"Network request failed\"))},s.ontimeout=function(){a(new TypeError(\"Network request failed\"))},s.onabort=function(){a(new t.DOMException(\"Aborted\",\"AbortError\"))},s.open(i.method,i.url,!0),\"include\"===i.credentials?s.withCredentials=!0:\"omit\"===i.credentials&&(s.withCredentials=!1),\"responseType\"in s&&o&&(s.responseType=\"blob\"),i.headers.forEach((function(e,t){s.setRequestHeader(t,e)})),i.signal&&(i.signal.addEventListener(\"abort\",u),s.onreadystatechange=function(){4===s.readyState&&i.signal.removeEventListener(\"abort\",u)}),s.send(void 0===i._bodyInit?null:i._bodyInit)}))}E.polyfill=!0,e.fetch||(e.fetch=E,e.Headers=f,e.Request=b,e.Response=w),t.Headers=f,t.Request=b,t.Response=w,t.fetch=E,Object.defineProperty(t,\"__esModule\",{value:!0})}({})}(\"undefined\"!=typeof self?self:this)},function(e,t,n){\"use strict\";var r=n(283),o=Object.prototype.hasOwnProperty,a=Array.isArray,i=function(){for(var e=[],t=0;t<256;++t)e.push(\"%\"+((t<16?\"0\":\"\")+t.toString(16)).toUpperCase());return e}(),s=function(e,t){for(var n=t&&t.plainObjects?Object.create(null):{},r=0;r<e.length;++r)void 0!==e[r]&&(n[r]=e[r]);return n};e.exports={arrayToObject:s,assign:function(e,t){return Object.keys(t).reduce((function(e,n){return e[n]=t[n],e}),e)},combine:function(e,t){return[].concat(e,t)},compact:function(e){for(var t=[{obj:{o:e},prop:\"o\"}],n=[],r=0;r<t.length;++r)for(var o=t[r],i=o.obj[o.prop],s=Object.keys(i),u=0;u<s.length;++u){var c=s[u],l=i[c];\"object\"==typeof l&&null!==l&&-1===n.indexOf(l)&&(t.push({obj:i,prop:c}),n.push(l))}return function(e){for(;e.length>1;){var t=e.pop(),n=t.obj[t.prop];if(a(n)){for(var r=[],o=0;o<n.length;++o)void 0!==n[o]&&r.push(n[o]);t.obj[t.prop]=r}}}(t),e},decode:function(e,t,n){var r=e.replace(/\\+/g,\" \");if(\"iso-8859-1\"===n)return r.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(r)}catch(e){return r}},encode:function(e,t,n,o,a){if(0===e.length)return e;var s=e;if(\"symbol\"==typeof e?s=Symbol.prototype.toString.call(e):\"string\"!=typeof e&&(s=String(e)),\"iso-8859-1\"===n)return escape(s).replace(/%u[0-9a-f]{4}/gi,(function(e){return\"%26%23\"+parseInt(e.slice(2),16)+\"%3B\"}));for(var u=\"\",c=0;c<s.length;++c){var l=s.charCodeAt(c);45===l||46===l||95===l||126===l||l>=48&&l<=57||l>=65&&l<=90||l>=97&&l<=122||a===r.RFC1738&&(40===l||41===l)?u+=s.charAt(c):l<128?u+=i[l]:l<2048?u+=i[192|l>>6]+i[128|63&l]:l<55296||l>=57344?u+=i[224|l>>12]+i[128|l>>6&63]+i[128|63&l]:(c+=1,l=65536+((1023&l)<<10|1023&s.charCodeAt(c)),u+=i[240|l>>18]+i[128|l>>12&63]+i[128|l>>6&63]+i[128|63&l])}return u},isBuffer:function(e){return!(!e||\"object\"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return\"[object RegExp]\"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(a(e)){for(var n=[],r=0;r<e.length;r+=1)n.push(t(e[r]));return n}return t(e)},merge:function e(t,n,r){if(!n)return t;if(\"object\"!=typeof n){if(a(t))t.push(n);else{if(!t||\"object\"!=typeof t)return[t,n];(r&&(r.plainObjects||r.allowPrototypes)||!o.call(Object.prototype,n))&&(t[n]=!0)}return t}if(!t||\"object\"!=typeof t)return[t].concat(n);var i=t;return a(t)&&!a(n)&&(i=s(t,r)),a(t)&&a(n)?(n.forEach((function(n,a){if(o.call(t,a)){var i=t[a];i&&\"object\"==typeof i&&n&&\"object\"==typeof n?t[a]=e(i,n,r):t.push(n)}else t[a]=n})),t):Object.keys(n).reduce((function(t,a){var i=n[a];return o.call(t,a)?t[a]=e(t[a],i,r):t[a]=i,t}),i)}}},function(e,t,n){\"use strict\";var r=n(21),o=n(40),a=n(207),i=n(37),s=n(67),u=n(121),c=n(139),l=n(47),p=n(98),f=n(68).f,h=n(86).forEach,d=n(48),m=n(78),v=m.set,g=m.getterFor;e.exports=function(e,t,n){var m,y=-1!==e.indexOf(\"Map\"),b=-1!==e.indexOf(\"Weak\"),_=y?\"set\":\"add\",w=o[e],x=w&&w.prototype,E={};if(d&&\"function\"==typeof w&&(b||x.forEach&&!i((function(){(new w).entries().next()})))){m=t((function(t,n){v(c(t,m,e),{type:e,collection:new w}),null!=n&&u(n,t[_],{that:t,AS_ENTRIES:y})}));var S=g(e);h([\"add\",\"clear\",\"delete\",\"forEach\",\"get\",\"has\",\"set\",\"keys\",\"values\",\"entries\"],(function(e){var t=\"add\"==e||\"set\"==e;!(e in x)||b&&\"clear\"==e||s(m.prototype,e,(function(n,r){var o=S(this).collection;if(!t&&b&&!l(n))return\"get\"==e&&void 0;var a=o[e](0===n?0:n,r);return t?this:a}))})),b||f(m.prototype,\"size\",{configurable:!0,get:function(){return S(this).collection.size}})}else m=n.getConstructor(t,e,y,_),a.REQUIRED=!0;return p(m,e,!1,!0),E[e]=m,r({global:!0,forced:!0},E),b||n.setStrong(m,e,y),m}},function(e,t,n){var r=n(37),o=n(41),a=n(97),i=o(\"iterator\");e.exports=!r((function(){var e=new URL(\"b?a=1&b=2&c=3\",\"http://a\"),t=e.searchParams,n=\"\";return e.pathname=\"c%20d\",t.forEach((function(e,r){t.delete(\"b\"),n+=r+e})),a&&!e.toJSON||!t.sort||\"http://a/c%20d?a=1&c=3\"!==e.href||\"3\"!==t.get(\"c\")||\"a=1\"!==String(new URLSearchParams(\"?a=1\"))||!t[i]||\"a\"!==new URL(\"https://a@b\").username||\"b\"!==new URLSearchParams(new URLSearchParams(\"a=b\")).get(\"a\")||\"xn--e1aybc\"!==new URL(\"http://тест\").host||\"#%D0%B1\"!==new URL(\"http://a#б\").hash||\"a1c3\"!==n||\"x\"!==new URL(\"http://x\",void 0).host}))},function(e,t,n){\"use strict\";n(157);var r=n(21),o=n(70),a=n(504),i=n(110),s=n(163),u=n(98),c=n(371),l=n(78),p=n(139),f=n(55),h=n(107),d=n(99),m=n(52),v=n(47),g=n(109),y=n(105),b=n(1087),_=n(159),w=n(41),x=o(\"fetch\"),E=o(\"Headers\"),S=w(\"iterator\"),C=\"URLSearchParams\",A=\"URLSearchParamsIterator\",k=l.set,O=l.getterFor(C),j=l.getterFor(A),T=/\\+/g,I=Array(4),P=function(e){return I[e-1]||(I[e-1]=RegExp(\"((?:%[\\\\da-f]{2}){\"+e+\"})\",\"gi\"))},N=function(e){try{return decodeURIComponent(e)}catch(t){return e}},M=function(e){var t=e.replace(T,\" \"),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(P(n--),N);return t}},R=/[!'()~]|%20/g,D={\"!\":\"%21\",\"'\":\"%27\",\"(\":\"%28\",\")\":\"%29\",\"~\":\"%7E\",\"%20\":\"+\"},L=function(e){return D[e]},B=function(e){return encodeURIComponent(e).replace(R,L)},F=function(e,t){if(t)for(var n,r,o=t.split(\"&\"),a=0;a<o.length;)(n=o[a++]).length&&(r=n.split(\"=\"),e.push({key:M(r.shift()),value:M(r.join(\"=\"))}))},U=function(e){this.entries.length=0,F(this.entries,e)},q=function(e,t){if(e<t)throw TypeError(\"Not enough arguments\")},z=c((function(e,t){k(this,{type:A,iterator:b(O(e).entries),kind:t})}),\"Iterator\",(function(){var e=j(this),t=e.kind,n=e.iterator.next(),r=n.value;return n.done||(n.value=\"keys\"===t?r.key:\"values\"===t?r.value:[r.key,r.value]),n})),V=function(){p(this,V,C);var e,t,n,r,o,a,i,s,u,c=arguments.length>0?arguments[0]:void 0,l=this,h=[];if(k(l,{type:C,entries:h,updateURL:function(){},updateSearchParams:U}),void 0!==c)if(v(c))if(\"function\"==typeof(e=_(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((i=(a=(o=b(m(r.value))).next).call(o)).done||(s=a.call(o)).done||!a.call(o).done)throw TypeError(\"Expected sequence with length 2\");h.push({key:i.value+\"\",value:s.value+\"\"})}else for(u in c)f(c,u)&&h.push({key:u,value:c[u]+\"\"});else F(h,\"string\"==typeof c?\"?\"===c.charAt(0)?c.slice(1):c:c+\"\")},W=V.prototype;s(W,{append:function(e,t){q(arguments.length,2);var n=O(this);n.entries.push({key:e+\"\",value:t+\"\"}),n.updateURL()},delete:function(e){q(arguments.length,1);for(var t=O(this),n=t.entries,r=e+\"\",o=0;o<n.length;)n[o].key===r?n.splice(o,1):o++;t.updateURL()},get:function(e){q(arguments.length,1);for(var t=O(this).entries,n=e+\"\",r=0;r<t.length;r++)if(t[r].key===n)return t[r].value;return null},getAll:function(e){q(arguments.length,1);for(var t=O(this).entries,n=e+\"\",r=[],o=0;o<t.length;o++)t[o].key===n&&r.push(t[o].value);return r},has:function(e){q(arguments.length,1);for(var t=O(this).entries,n=e+\"\",r=0;r<t.length;)if(t[r++].key===n)return!0;return!1},set:function(e,t){q(arguments.length,1);for(var n,r=O(this),o=r.entries,a=!1,i=e+\"\",s=t+\"\",u=0;u<o.length;u++)(n=o[u]).key===i&&(a?o.splice(u--,1):(a=!0,n.value=s));a||o.push({key:i,value:s}),r.updateURL()},sort:function(){var e,t,n,r=O(this),o=r.entries,a=o.slice();for(o.length=0,n=0;n<a.length;n++){for(e=a[n],t=0;t<n;t++)if(o[t].key>e.key){o.splice(t,0,e);break}t===n&&o.push(e)}r.updateURL()},forEach:function(e){for(var t,n=O(this).entries,r=h(e,arguments.length>1?arguments[1]:void 0,3),o=0;o<n.length;)r((t=n[o++]).value,t.key,this)},keys:function(){return new z(this,\"keys\")},values:function(){return new z(this,\"values\")},entries:function(){return new z(this,\"entries\")}},{enumerable:!0}),i(W,S,W.entries),i(W,\"toString\",(function(){for(var e,t=O(this).entries,n=[],r=0;r<t.length;)e=t[r++],n.push(B(e.key)+\"=\"+B(e.value));return n.join(\"&\")}),{enumerable:!0}),u(V,C),r({global:!0,forced:!a},{URLSearchParams:V}),a||\"function\"!=typeof x||\"function\"!=typeof E||r({global:!0,enumerable:!0,forced:!0},{fetch:function(e){var t,n,r,o=[e];return arguments.length>1&&(v(t=arguments[1])&&(n=t.body,d(n)===C&&((r=t.headers?new E(t.headers):new E).has(\"content-type\")||r.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"),t=g(t,{body:y(0,String(n)),headers:y(0,r)}))),o.push(t)),x.apply(this,o)}}),e.exports={URLSearchParams:V,getState:O}},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwcHgiICBoZWlnaHQ9IjIwMHB4IiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGNsYXNzPSJsZHMtcm9sbGluZyIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IGJhY2tncm91bmQtcG9zaXRpb246IGluaXRpYWwgaW5pdGlhbDsgYmFja2dyb3VuZC1yZXBlYXQ6IGluaXRpYWwgaW5pdGlhbDsiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIGZpbGw9Im5vbmUiIG5nLWF0dHItc3Ryb2tlPSJ7e2NvbmZpZy5jb2xvcn19IiBuZy1hdHRyLXN0cm9rZS13aWR0aD0ie3tjb25maWcud2lkdGh9fSIgbmctYXR0ci1yPSJ7e2NvbmZpZy5yYWRpdXN9fSIgbmctYXR0ci1zdHJva2UtZGFzaGFycmF5PSJ7e2NvbmZpZy5kYXNoYXJyYXl9fSIgc3Ryb2tlPSIjNTU1NTU1IiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgY2FsY01vZGU9ImxpbmVhciIgdmFsdWVzPSIwIDUwIDUwOzM2MCA1MCA1MCIga2V5VGltZXM9IjA7MSIgZHVyPSIxcyIgYmVnaW49IjBzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvY2lyY2xlPjwvc3ZnPgo=\"},function(e,t,n){\"use strict\";function r(e){var t,n=e.Symbol;return\"function\"==typeof n?n.observable?t=n.observable:(t=n(\"observable\"),n.observable=t):t=\"@@observable\",t}n.d(t,\"a\",(function(){return r}))},function(e,t,n){\"use strict\";(function(e){var n=\"object\"==typeof e&&e&&e.Object===Object&&e;t.a=n}).call(this,n(51))},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.combineReducers=void 0;var r,o=n(628),a=(r=o)&&r.__esModule?r:{default:r};t.combineReducers=a.default},function(e,t,n){\"use strict\";var r=\"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};function o(e){return null===e?\"null\":void 0===e?\"undefined\":\"object\"===(void 0===e?\"undefined\":r(e))?Array.isArray(e)?\"array\":\"object\":void 0===e?\"undefined\":r(e)}function a(e){return\"object\"===o(e)?s(e):\"array\"===o(e)?i(e):e}function i(e){return e.map(a)}function s(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=a(e[n]));return t}function u(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={arrayBehaviour:n.arrayBehaviour||\"replace\"},a=t.map((function(e){return e||{}})),c=e||{},l=0;l<a.length;l++)for(var p=a[l],f=Object.keys(p),h=0;h<f.length;h++){var d=f[h],m=p[d],v=o(m),g=o(c[d]);if(\"object\"===v)if(\"undefined\"!==g){var y=\"object\"===g?c[d]:{};c[d]=u({},[y,s(m)],r)}else c[d]=s(m);else if(\"array\"===v)if(\"array\"===g){var b=i(m);c[d]=\"merge\"===r.arrayBehaviour?c[d].concat(b):b}else c[d]=i(m);else c[d]=m}return c}e.exports=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return u(e,n)},e.exports.noMutate=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return u({},t)},e.exports.withOptions=function(e,t,n){return u(e,t,n)}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.sanitizeUrl=void 0;var r=/^([^\\w]*)(javascript|data|vbscript)/im,o=/[\\u0000-\\u001F\\u007F-\\u009F\\u2000-\\u200D\\uFEFF]/gim,a=/^([^:]+):/gm,i=[\".\",\"/\"];t.sanitizeUrl=function(e){if(!e)return\"about:blank\";var t=e.replace(o,\"\").trim();if(function(e){return i.indexOf(e[0])>-1}(t))return t;var n=t.match(a);if(!n)return t;var s=n[0];return r.test(s)?\"about:blank\":t}},function(e,t,n){var r=n(685),o=n(693)((function(e,t,n){return t=t.toLowerCase(),e+(n?r(t):t)}));e.exports=o},function(e,t,n){(function(t){var r=n(768),o=n(769).Stream;function a(e,t,n){n=n||0;var o,i,s=(o=t,new Array(n||0).join(o||\"\")),u=e;if(\"object\"==typeof e&&((u=e[i=Object.keys(e)[0]])&&u._elem))return u._elem.name=i,u._elem.icount=n,u._elem.indent=t,u._elem.indents=s,u._elem.interrupt=u,u._elem;var c,l=[],p=[];function f(e){Object.keys(e).forEach((function(t){l.push(function(e,t){return e+'=\"'+r(t)+'\"'}(t,e[t]))}))}switch(typeof u){case\"object\":if(null===u)break;u._attr&&f(u._attr),u._cdata&&p.push((\"<![CDATA[\"+u._cdata).replace(/\\]\\]>/g,\"]]]]><![CDATA[>\")+\"]]>\"),u.forEach&&(c=!1,p.push(\"\"),u.forEach((function(e){\"object\"==typeof e?\"_attr\"==Object.keys(e)[0]?f(e._attr):p.push(a(e,t,n+1)):(p.pop(),c=!0,p.push(r(e)))})),c||p.push(\"\"));break;default:p.push(r(u))}return{name:i,interrupt:!1,attributes:l,content:p,icount:n,indents:s,indent:t}}function i(e,t,n){if(\"object\"!=typeof t)return e(!1,t);var r=t.interrupt?1:t.content.length;function o(){for(;t.content.length;){var o=t.content.shift();if(void 0!==o){if(a(o))return;i(e,o)}}e(!1,(r>1?t.indents:\"\")+(t.name?\"</\"+t.name+\">\":\"\")+(t.indent&&!n?\"\\n\":\"\")),n&&n()}function a(t){return!!t.interrupt&&(t.interrupt.append=e,t.interrupt.end=o,t.interrupt=!1,e(!0),!0)}if(e(!1,t.indents+(t.name?\"<\"+t.name:\"\")+(t.attributes.length?\" \"+t.attributes.join(\" \"):\"\")+(r?t.name?\">\":\"\":t.name?\"/>\":\"\")+(t.indent&&r>1?\"\\n\":\"\")),!r)return e(!1,t.indent?\"\\n\":\"\");a(t)||o()}e.exports=function(e,n){\"object\"!=typeof n&&(n={indent:n});var r,s,u=n.stream?new o:null,c=\"\",l=!1,p=n.indent?!0===n.indent?\"    \":n.indent:\"\",f=!0;function h(e){f?t.nextTick(e):e()}function d(e,t){if(void 0!==t&&(c+=t),e&&!l&&(u=u||new o,l=!0),e&&l){var n=c;h((function(){u.emit(\"data\",n)})),c=\"\"}}function m(e,t){i(d,a(e,p,p?1:0),t)}function v(){if(u){var e=c;h((function(){u.emit(\"data\",e),u.emit(\"end\"),u.readable=!1,u.emit(\"close\")}))}}return h((function(){f=!1})),n.declaration&&(r=n.declaration,s={version:\"1.0\",encoding:r.encoding||\"UTF-8\"},r.standalone&&(s.standalone=r.standalone),m({\"?xml\":{_attr:s}}),c=c.replace(\"/>\",\"?>\")),e&&e.forEach?e.forEach((function(t,n){var r;n+1===e.length&&(r=v),m(t,r)})):m(e,v),u?(u.readable=!0,u):c},e.exports.element=e.exports.Element=function(){var e=Array.prototype.slice.call(arguments),t={_elem:a(e),push:function(e){if(!this.append)throw new Error(\"not assigned to a parent!\");var t=this,n=this._elem.indent;i(this.append,a(e,n,this._elem.icount+(n?1:0)),(function(){t.append(!0)}))},close:function(e){void 0!==e&&this.push(e),this.end&&this.end()}};return t}}).call(this,n(90))},function(e,t,n){(function(t){var n;n=void 0!==t?t:this,e.exports=function(e){if(e.CSS&&e.CSS.escape)return e.CSS.escape;var t=function(e){if(0==arguments.length)throw new TypeError(\"`CSS.escape` requires an argument.\");for(var t,n=String(e),r=n.length,o=-1,a=\"\",i=n.charCodeAt(0);++o<r;)0!=(t=n.charCodeAt(o))?a+=t>=1&&t<=31||127==t||0==o&&t>=48&&t<=57||1==o&&t>=48&&t<=57&&45==i?\"\\\\\"+t.toString(16)+\" \":0==o&&1==r&&45==t||!(t>=128||45==t||95==t||t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122)?\"\\\\\"+n.charAt(o):n.charAt(o):a+=\"�\";return a};return e.CSS||(e.CSS={}),e.CSS.escape=t,t}(n)}).call(this,n(51))},function(e,t,n){\"use strict\";(function(t,r){var o=65536,a=4294967295;var i=n(62).Buffer,s=t.crypto||t.msCrypto;s&&s.getRandomValues?e.exports=function(e,t){if(e>a)throw new RangeError(\"requested too many random bytes\");var n=i.allocUnsafe(e);if(e>0)if(e>o)for(var u=0;u<e;u+=o)s.getRandomValues(n.slice(u,u+o));else s.getRandomValues(n);if(\"function\"==typeof t)return r.nextTick((function(){t(null,n)}));return n}:e.exports=function(){throw new Error(\"Secure random number generation is not supported by this browser.\\nUse Chrome, Firefox or Internet Explorer 11\")}}).call(this,n(51),n(90))},function(e,t,n){(t=e.exports=function(e){e=e.toLowerCase();var n=t[e];if(!n)throw new Error(e+\" is not supported (we accept pull requests)\");return new n}).sha=n(842),t.sha1=n(843),t.sha224=n(844),t.sha256=n(446),t.sha384=n(845),t.sha512=n(447)},function(e,t,n){var r=n(411),o=n(428),a=n(191),i=n(850),s=n(50);e.exports=function(e,t,n){var u=s(e)?r:i,c=arguments.length<3;return u(e,a(t,4),n,c,o)}},function(e,t,n){var r=n(57),o=n(896),a=n(427),i=Math.max,s=Math.min;e.exports=function(e,t,n){var u,c,l,p,f,h,d=0,m=!1,v=!1,g=!0;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");function y(t){var n=u,r=c;return u=c=void 0,d=t,p=e.apply(r,n)}function b(e){return d=e,f=setTimeout(w,t),m?y(e):p}function _(e){var n=e-h;return void 0===h||n>=t||n<0||v&&e-d>=l}function w(){var e=o();if(_(e))return x(e);f=setTimeout(w,function(e){var n=t-(e-h);return v?s(n,l-(e-d)):n}(e))}function x(e){return f=void 0,g&&u?y(e):(u=c=void 0,p)}function E(){var e=o(),n=_(e);if(u=arguments,c=this,h=e,n){if(void 0===f)return b(h);if(v)return clearTimeout(f),f=setTimeout(w,t),y(h)}return void 0===f&&(f=setTimeout(w,t)),p}return t=a(t)||0,r(n)&&(m=!!n.leading,l=(v=\"maxWait\"in n)?i(a(n.maxWait)||0,t):l,g=\"trailing\"in n?!!n.trailing:g),E.cancel=function(){void 0!==f&&clearTimeout(f),d=0,u=h=c=f=void 0},E.flush=function(){return void 0===f?p:x(o())},E}},function(e,t,n){\"use strict\";e.exports=n(917)},function(e,t,n){var r=n(408),o=n(494),a=n(1021),i=n(135),s=n(143),u=n(1024),c=n(497),l=n(496),p=c((function(e,t){var n={};if(null==e)return n;var c=!1;t=r(t,(function(t){return t=i(t,e),c||(c=t.length>1),t})),s(e,l(e),n),c&&(n=o(n,7,u));for(var p=t.length;p--;)a(n,t[p]);return n}));e.exports=p},function(e,t,n){e.exports=n(1032)},function(e,t,n){var r=n(1043);e.exports=function(e,t){if(null==e)return{};var n,o,a=r(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}},function(e,t,n){var r=n(1044),o=n(1045),a=n(1046),i=n(1047);e.exports=function(e){return r(e)||o(e)||a(e)||i()}},function(e,t){function n(){return e.exports=n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},n.apply(this,arguments)}e.exports=n},function(e,t){e.exports=function(e){const t={literal:\"true false null\"},n=[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],r=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],o={end:\",\",endsWithParent:!0,excludeEnd:!0,contains:r,keywords:t},a={begin:/\\{/,end:/\\}/,contains:[{className:\"attr\",begin:/\"/,end:/\"/,contains:[e.BACKSLASH_ESCAPE],illegal:\"\\\\n\"},e.inherit(o,{begin:/:/})].concat(n),illegal:\"\\\\S\"},i={begin:\"\\\\[\",end:\"\\\\]\",contains:[e.inherit(o)],illegal:\"\\\\S\"};return r.push(a,i),n.forEach((function(e){r.push(e)})),{name:\"JSON\",contains:r,keywords:t,illegal:\"\\\\S\"}}},function(e,t){const n=\"[A-Za-z$_][0-9A-Za-z$_]*\",r=[\"as\",\"in\",\"of\",\"if\",\"for\",\"while\",\"finally\",\"var\",\"new\",\"function\",\"do\",\"return\",\"void\",\"else\",\"break\",\"catch\",\"instanceof\",\"with\",\"throw\",\"case\",\"default\",\"try\",\"switch\",\"continue\",\"typeof\",\"delete\",\"let\",\"yield\",\"const\",\"class\",\"debugger\",\"async\",\"await\",\"static\",\"import\",\"from\",\"export\",\"extends\"],o=[\"true\",\"false\",\"null\",\"undefined\",\"NaN\",\"Infinity\"],a=[].concat([\"setInterval\",\"setTimeout\",\"clearInterval\",\"clearTimeout\",\"require\",\"exports\",\"eval\",\"isFinite\",\"isNaN\",\"parseFloat\",\"parseInt\",\"decodeURI\",\"decodeURIComponent\",\"encodeURI\",\"encodeURIComponent\",\"escape\",\"unescape\"],[\"arguments\",\"this\",\"super\",\"console\",\"window\",\"document\",\"localStorage\",\"module\",\"global\"],[\"Intl\",\"DataView\",\"Number\",\"Math\",\"Date\",\"String\",\"RegExp\",\"Object\",\"Function\",\"Boolean\",\"Error\",\"Symbol\",\"Set\",\"Map\",\"WeakSet\",\"WeakMap\",\"Proxy\",\"Reflect\",\"JSON\",\"Promise\",\"Float64Array\",\"Int16Array\",\"Int32Array\",\"Int8Array\",\"Uint16Array\",\"Uint32Array\",\"Float32Array\",\"Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"ArrayBuffer\"],[\"EvalError\",\"InternalError\",\"RangeError\",\"ReferenceError\",\"SyntaxError\",\"TypeError\",\"URIError\"]);function i(e){return s(\"(?=\",e,\")\")}function s(...e){return e.map((e=>{return(t=e)?\"string\"==typeof t?t:t.source:null;var t})).join(\"\")}e.exports=function(e){const t=n,u=\"<>\",c=\"</>\",l={begin:/<[A-Za-z0-9\\\\._:-]+/,end:/\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,isTrulyOpeningTag:(e,t)=>{const n=e[0].length+e.index,r=e.input[n];\"<\"!==r?\">\"===r&&(((e,{after:t})=>{const n=\"</\"+e[0].slice(1);return-1!==e.input.indexOf(n,t)})(e,{after:n})||t.ignoreMatch()):t.ignoreMatch()}},p={$pattern:n,keyword:r.join(\" \"),literal:o.join(\" \"),built_in:a.join(\" \")},f=\"\\\\.([0-9](_?[0-9])*)\",h=\"0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*\",d={className:\"number\",variants:[{begin:`(\\\\b(${h})((${f})|\\\\.)?|(${f}))[eE][+-]?([0-9](_?[0-9])*)\\\\b`},{begin:`\\\\b(${h})\\\\b((${f})\\\\b|\\\\.)?|(${f})\\\\b`},{begin:\"\\\\b(0|[1-9](_?[0-9])*)n\\\\b\"},{begin:\"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\"},{begin:\"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\"},{begin:\"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\"},{begin:\"\\\\b0[0-7]+n?\\\\b\"}],relevance:0},m={className:\"subst\",begin:\"\\\\$\\\\{\",end:\"\\\\}\",keywords:p,contains:[]},v={begin:\"html`\",end:\"\",starts:{end:\"`\",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,m],subLanguage:\"xml\"}},g={begin:\"css`\",end:\"\",starts:{end:\"`\",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,m],subLanguage:\"css\"}},y={className:\"string\",begin:\"`\",end:\"`\",contains:[e.BACKSLASH_ESCAPE,m]},b={className:\"comment\",variants:[e.COMMENT(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,contains:[{className:\"doctag\",begin:\"@[A-Za-z]+\",contains:[{className:\"type\",begin:\"\\\\{\",end:\"\\\\}\",relevance:0},{className:\"variable\",begin:t+\"(?=\\\\s*(-)|$)\",endsParent:!0,relevance:0},{begin:/(?=[^\\n])\\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},_=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,v,g,y,d,e.REGEXP_MODE];m.contains=_.concat({begin:/\\{/,end:/\\}/,keywords:p,contains:[\"self\"].concat(_)});const w=[].concat(b,m.contains),x=w.concat([{begin:/\\(/,end:/\\)/,keywords:p,contains:[\"self\"].concat(w)}]),E={className:\"params\",begin:/\\(/,end:/\\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:x};return{name:\"Javascript\",aliases:[\"js\",\"jsx\",\"mjs\",\"cjs\"],keywords:p,exports:{PARAMS_CONTAINS:x},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:\"shebang\",binary:\"node\",relevance:5}),{label:\"use_strict\",className:\"meta\",relevance:10,begin:/^\\s*['\"]use (strict|asm)['\"]/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,v,g,y,b,d,{begin:s(/[{,\\n]\\s*/,i(s(/(((\\/\\/.*$)|(\\/\\*(\\*[^/]|[^*])*\\*\\/))\\s*)*/,t+\"\\\\s*:\"))),relevance:0,contains:[{className:\"attr\",begin:t+i(\"\\\\s*:\"),relevance:0}]},{begin:\"(\"+e.RE_STARTERS_RE+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",keywords:\"return throw case\",contains:[b,e.REGEXP_MODE,{className:\"function\",begin:\"(\\\\([^()]*(\\\\([^()]*(\\\\([^()]*\\\\)[^()]*)*\\\\)[^()]*)*\\\\)|\"+e.UNDERSCORE_IDENT_RE+\")\\\\s*=>\",returnBegin:!0,end:\"\\\\s*=>\",contains:[{className:\"params\",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\\(\\s*\\)/,skip:!0},{begin:/\\(/,end:/\\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:x}]}]},{begin:/,/,relevance:0},{className:\"\",begin:/\\s/,end:/\\s*/,skip:!0},{variants:[{begin:u,end:c},{begin:l.begin,\"on:begin\":l.isTrulyOpeningTag,end:l.end}],subLanguage:\"xml\",contains:[{begin:l.begin,end:l.end,skip:!0,contains:[\"self\"]}]}],relevance:0},{className:\"function\",beginKeywords:\"function\",end:/[{;]/,excludeEnd:!0,keywords:p,contains:[\"self\",e.inherit(e.TITLE_MODE,{begin:t}),E],illegal:/%/},{beginKeywords:\"while if switch catch for\"},{className:\"function\",begin:e.UNDERSCORE_IDENT_RE+\"\\\\([^()]*(\\\\([^()]*(\\\\([^()]*\\\\)[^()]*)*\\\\)[^()]*)*\\\\)\\\\s*\\\\{\",returnBegin:!0,contains:[E,e.inherit(e.TITLE_MODE,{begin:t})]},{variants:[{begin:\"\\\\.\"+t},{begin:\"\\\\$\"+t}],relevance:0},{className:\"class\",beginKeywords:\"class\",end:/[{;=]/,excludeEnd:!0,illegal:/[:\"[\\]]/,contains:[{beginKeywords:\"extends\"},e.UNDERSCORE_TITLE_MODE]},{begin:/\\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:t}),\"self\",E]},{begin:\"(get|set)\\\\s+(?=\"+t+\"\\\\()\",end:/\\{/,keywords:\"get set\",contains:[e.inherit(e.TITLE_MODE,{begin:t}),{begin:/\\(\\)/},E]},{begin:/\\$[(.]/}]}}},function(e,t){function n(e){return e?\"string\"==typeof e?e:e.source:null}function r(e){return o(\"(?=\",e,\")\")}function o(...e){return e.map((e=>n(e))).join(\"\")}function a(...e){return\"(\"+e.map((e=>n(e))).join(\"|\")+\")\"}e.exports=function(e){const t=o(/[A-Z_]/,o(\"(\",/[A-Z0-9_.-]+:/,\")?\"),/[A-Z0-9_.-]*/),n={className:\"symbol\",begin:\"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;\"},i={begin:\"\\\\s\",contains:[{className:\"meta-keyword\",begin:\"#?[a-z_][a-z1-9_-]+\",illegal:\"\\\\n\"}]},s=e.inherit(i,{begin:\"\\\\(\",end:\"\\\\)\"}),u=e.inherit(e.APOS_STRING_MODE,{className:\"meta-string\"}),c=e.inherit(e.QUOTE_STRING_MODE,{className:\"meta-string\"}),l={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:\"attr\",begin:\"[A-Za-z0-9\\\\._:-]+\",relevance:0},{begin:/=\\s*/,relevance:0,contains:[{className:\"string\",endsParent:!0,variants:[{begin:/\"/,end:/\"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\\s\"'=<>`]+/}]}]}]};return{name:\"HTML, XML\",aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\",\"wsf\",\"svg\"],case_insensitive:!0,contains:[{className:\"meta\",begin:\"<![a-z]\",end:\">\",relevance:10,contains:[i,c,u,s,{begin:\"\\\\[\",end:\"\\\\]\",contains:[{className:\"meta\",begin:\"<![a-z]\",end:\">\",contains:[i,s,c,u]}]}]},e.COMMENT(\"\\x3c!--\",\"--\\x3e\",{relevance:10}),{begin:\"<!\\\\[CDATA\\\\[\",end:\"\\\\]\\\\]>\",relevance:10},n,{className:\"meta\",begin:/<\\?xml/,end:/\\?>/,relevance:10},{className:\"tag\",begin:\"<style(?=\\\\s|>)\",end:\">\",keywords:{name:\"style\"},contains:[l],starts:{end:\"</style>\",returnEnd:!0,subLanguage:[\"css\",\"xml\"]}},{className:\"tag\",begin:\"<script(?=\\\\s|>)\",end:\">\",keywords:{name:\"script\"},contains:[l],starts:{end:/<\\/script>/,returnEnd:!0,subLanguage:[\"javascript\",\"handlebars\",\"xml\"]}},{className:\"tag\",begin:/<>|<\\/>/},{className:\"tag\",begin:o(/</,r(o(t,a(/\\/>/,/>/,/\\s/)))),end:/\\/?>/,contains:[{className:\"name\",begin:t,relevance:0,starts:l}]},{className:\"tag\",begin:o(/<\\//,r(o(t,/>/))),contains:[{className:\"name\",begin:t,relevance:0},{begin:/>/,relevance:0}]}]}}},function(e,t){e.exports=function(e){var t=\"true false yes no null\",n=\"[\\\\w#;/?:@&=+$,.~*'()[\\\\]]+\",r={className:\"string\",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/\"/,end:/\"/},{begin:/\\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:\"template-variable\",variants:[{begin:/\\{\\{/,end:/\\}\\}/},{begin:/%\\{/,end:/\\}/}]}]},o=e.inherit(r,{variants:[{begin:/'/,end:/'/},{begin:/\"/,end:/\"/},{begin:/[^\\s,{}[\\]]+/}]}),a={className:\"number\",begin:\"\\\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\\\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\\\.[0-9]*)?([ \\\\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\\\b\"},i={end:\",\",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:t,relevance:0},s={begin:/\\{/,end:/\\}/,contains:[i],illegal:\"\\\\n\",relevance:0},u={begin:\"\\\\[\",end:\"\\\\]\",contains:[i],illegal:\"\\\\n\",relevance:0},c=[{className:\"attr\",variants:[{begin:\"\\\\w[\\\\w :\\\\/.-]*:(?=[ \\t]|$)\"},{begin:'\"\\\\w[\\\\w :\\\\/.-]*\":(?=[ \\t]|$)'},{begin:\"'\\\\w[\\\\w :\\\\/.-]*':(?=[ \\t]|$)\"}]},{className:\"meta\",begin:\"^---\\\\s*$\",relevance:10},{className:\"string\",begin:\"[\\\\|>]([1-9]?[+-])?[ ]*\\\\n( +)[^ ][^\\\\n]*\\\\n(\\\\2[^\\\\n]+\\\\n?)*\"},{begin:\"<%[%=-]?\",end:\"[%-]?%>\",subLanguage:\"ruby\",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:\"type\",begin:\"!\\\\w+!\"+n},{className:\"type\",begin:\"!<\"+n+\">\"},{className:\"type\",begin:\"!\"+n},{className:\"type\",begin:\"!!\"+n},{className:\"meta\",begin:\"&\"+e.UNDERSCORE_IDENT_RE+\"$\"},{className:\"meta\",begin:\"\\\\*\"+e.UNDERSCORE_IDENT_RE+\"$\"},{className:\"bullet\",begin:\"-(?=[ ]|$)\",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},a,{className:\"number\",begin:e.C_NUMBER_RE+\"\\\\b\",relevance:0},s,u,r],l=[...c];return l.pop(),l.push(o),i.contains=l,{name:\"YAML\",case_insensitive:!0,aliases:[\"yml\",\"YAML\"],contains:c}}},function(e,t){e.exports=function(e){var t=\"HTTP/[0-9\\\\.]+\";return{name:\"HTTP\",aliases:[\"https\"],illegal:\"\\\\S\",contains:[{begin:\"^\"+t,end:\"$\",contains:[{className:\"number\",begin:\"\\\\b\\\\d{3}\\\\b\"}]},{begin:\"^[A-Z]+ (.*?) \"+t+\"$\",returnBegin:!0,end:\"$\",contains:[{className:\"string\",begin:\" \",end:\" \",excludeBegin:!0,excludeEnd:!0},{begin:t},{className:\"keyword\",begin:\"[A-Z]+\"}]},{className:\"attribute\",begin:\"^\\\\w\",end:\": \",excludeEnd:!0,illegal:\"\\\\n|\\\\s|=\",starts:{end:\"$\",relevance:0}},{begin:\"\\\\n\\\\n\",starts:{subLanguage:[],endsWithParent:!0}}]}}},function(e,t){function n(...e){return e.map((e=>{return(t=e)?\"string\"==typeof t?t:t.source:null;var t})).join(\"\")}e.exports=function(e){const t={},r={begin:/\\$\\{/,end:/\\}/,contains:[\"self\",{begin:/:-/,contains:[t]}]};Object.assign(t,{className:\"variable\",variants:[{begin:n(/\\$[\\w\\d#@][\\w\\d_]*/,\"(?![\\\\w\\\\d])(?![$])\")},r]});const o={className:\"subst\",begin:/\\$\\(/,end:/\\)/,contains:[e.BACKSLASH_ESCAPE]},a={begin:/<<-?\\s*(?=\\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\\w+)/,end:/(\\w+)/,className:\"string\"})]}},i={className:\"string\",begin:/\"/,end:/\"/,contains:[e.BACKSLASH_ESCAPE,t,o]};o.contains.push(i);const s={begin:/\\$\\(\\(/,end:/\\)\\)/,contains:[{begin:/\\d+#[0-9a-f]+/,className:\"number\"},e.NUMBER_MODE,t]},u=e.SHEBANG({binary:`(${[\"fish\",\"bash\",\"zsh\",\"sh\",\"csh\",\"ksh\",\"tcsh\",\"dash\",\"scsh\"].join(\"|\")})`,relevance:10}),c={className:\"function\",begin:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\\w[\\w\\d_]*/})],relevance:0};return{name:\"Bash\",aliases:[\"sh\",\"zsh\"],keywords:{$pattern:/\\b[a-z._-]+\\b/,keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\"},contains:[u,e.SHEBANG(),c,s,e.HASH_COMMENT_MODE,a,i,{className:\"\",begin:/\\\\\"/},{className:\"string\",begin:/'/,end:/'/},t]}}},function(e,t){e.exports=function(e){const t={$pattern:/-?[A-z\\.\\-]+\\b/,keyword:\"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter\",built_in:\"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write\"},n={begin:\"`[\\\\s\\\\S]\",relevance:0},r={className:\"variable\",variants:[{begin:/\\$\\B/},{className:\"keyword\",begin:/\\$this/},{begin:/\\$[\\w\\d][\\w\\d_:]*/}]},o={className:\"string\",variants:[{begin:/\"/,end:/\"/},{begin:/@\"/,end:/^\"@/}],contains:[n,r,{className:\"variable\",begin:/\\$[A-z]/,end:/[^A-z]/}]},a={className:\"string\",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},i=e.inherit(e.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,end:/#>/}],contains:[{className:\"doctag\",variants:[{begin:/\\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\\s+\\S+/}]}]}),s={className:\"built_in\",variants:[{begin:\"(\".concat(\"Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Complete|Confirm|Deny|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where\",\")+(-)[\\\\w\\\\d]+\")}]},u={className:\"class\",beginKeywords:\"class enum\",end:/\\s*[{]/,excludeEnd:!0,relevance:0,contains:[e.TITLE_MODE]},c={className:\"function\",begin:/function\\s+/,end:/\\s*\\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,contains:[{begin:\"function\",relevance:0,className:\"keyword\"},{className:\"title\",begin:/\\w[\\w\\d]*((-)[\\w\\d]+)*/,relevance:0},{begin:/\\(/,end:/\\)/,className:\"params\",relevance:0,contains:[r]}]},l={begin:/using\\s/,end:/$/,returnBegin:!0,contains:[o,a,{className:\"keyword\",begin:/(using|assembly|command|module|namespace|type)/}]},p={variants:[{className:\"operator\",begin:\"(\".concat(\"-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor\",\")\\\\b\")},{className:\"literal\",begin:/(-)[\\w\\d]+/,relevance:0}]},f={className:\"function\",begin:/\\[.*\\]\\s*[\\w]+[ ]??\\(/,end:/$/,returnBegin:!0,relevance:0,contains:[{className:\"keyword\",begin:\"(\".concat(t.keyword.toString().replace(/\\s/g,\"|\"),\")\\\\b\"),endsParent:!0,relevance:0},e.inherit(e.TITLE_MODE,{endsParent:!0})]},h=[f,i,n,e.NUMBER_MODE,o,a,s,r,{className:\"literal\",begin:/\\$(null|true|false)\\b/},{className:\"selector-tag\",begin:/@\\B/,relevance:0}],d={begin:/\\[/,end:/\\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat(\"self\",h,{begin:\"(\"+[\"string\",\"char\",\"byte\",\"int\",\"long\",\"bool\",\"decimal\",\"single\",\"double\",\"DateTime\",\"xml\",\"array\",\"hashtable\",\"void\"].join(\"|\")+\")\",className:\"built_in\",relevance:0},{className:\"type\",begin:/[\\.\\w\\d]+/,relevance:0})};return f.contains.unshift(d),{name:\"PowerShell\",aliases:[\"ps\",\"ps1\"],case_insensitive:!0,keywords:t,contains:h.concat(u,c,l,p,d)}}},function(e,t,n){e.exports=n(1066)},function(e,t,n){var r=n(494);e.exports=function(e){return r(e,5)}},function(e,t,n){e.exports=n(1070)},function(e,t){var n=e.exports=function(e){return new r(e)};function r(e){this.value=e}function o(e,t,n){var r=[],o=[],s=!0;return function e(p){var f=n?a(p):p,h={},d=!0,m={node:f,node_:p,path:[].concat(r),parent:o[o.length-1],parents:o,key:r.slice(-1)[0],isRoot:0===r.length,level:r.length,circular:null,update:function(e,t){m.isRoot||(m.parent.node[m.key]=e),m.node=e,t&&(d=!1)},delete:function(e){delete m.parent.node[m.key],e&&(d=!1)},remove:function(e){u(m.parent.node)?m.parent.node.splice(m.key,1):delete m.parent.node[m.key],e&&(d=!1)},keys:null,before:function(e){h.before=e},after:function(e){h.after=e},pre:function(e){h.pre=e},post:function(e){h.post=e},stop:function(){s=!1},block:function(){d=!1}};if(!s)return m;function v(){if(\"object\"==typeof m.node&&null!==m.node){m.keys&&m.node_===m.node||(m.keys=i(m.node)),m.isLeaf=0==m.keys.length;for(var e=0;e<o.length;e++)if(o[e].node_===p){m.circular=o[e];break}}else m.isLeaf=!0,m.keys=null;m.notLeaf=!m.isLeaf,m.notRoot=!m.isRoot}v();var g=t.call(m,m.node);return void 0!==g&&m.update&&m.update(g),h.before&&h.before.call(m,m.node),d?(\"object\"!=typeof m.node||null===m.node||m.circular||(o.push(m),v(),c(m.keys,(function(t,o){r.push(t),h.pre&&h.pre.call(m,m.node[t],t);var a=e(m.node[t]);n&&l.call(m.node,t)&&(m.node[t]=a.node),a.isLast=o==m.keys.length-1,a.isFirst=0==o,h.post&&h.post.call(m,a),r.pop()})),o.pop()),h.after&&h.after.call(m,m.node),m):m}(e).node}function a(e){if(\"object\"==typeof e&&null!==e){var t;if(u(e))t=[];else if(\"[object Date]\"===s(e))t=new Date(e.getTime?e.getTime():e);else if(function(e){return\"[object RegExp]\"===s(e)}(e))t=new RegExp(e);else if(function(e){return\"[object Error]\"===s(e)}(e))t={message:e.message};else if(function(e){return\"[object Boolean]\"===s(e)}(e))t=new Boolean(e);else if(function(e){return\"[object Number]\"===s(e)}(e))t=new Number(e);else if(function(e){return\"[object String]\"===s(e)}(e))t=new String(e);else if(Object.create&&Object.getPrototypeOf)t=Object.create(Object.getPrototypeOf(e));else if(e.constructor===Object)t={};else{var n=e.constructor&&e.constructor.prototype||e.__proto__||{},r=function(){};r.prototype=n,t=new r}return c(i(e),(function(n){t[n]=e[n]})),t}return e}r.prototype.get=function(e){for(var t=this.value,n=0;n<e.length;n++){var r=e[n];if(!t||!l.call(t,r)){t=void 0;break}t=t[r]}return t},r.prototype.has=function(e){for(var t=this.value,n=0;n<e.length;n++){var r=e[n];if(!t||!l.call(t,r))return!1;t=t[r]}return!0},r.prototype.set=function(e,t){for(var n=this.value,r=0;r<e.length-1;r++){var o=e[r];l.call(n,o)||(n[o]={}),n=n[o]}return n[e[r]]=t,t},r.prototype.map=function(e){return o(this.value,e,!0)},r.prototype.forEach=function(e){return this.value=o(this.value,e,!1),this.value},r.prototype.reduce=function(e,t){var n=1===arguments.length,r=n?this.value:t;return this.forEach((function(t){this.isRoot&&n||(r=e.call(this,r,t))})),r},r.prototype.paths=function(){var e=[];return this.forEach((function(t){e.push(this.path)})),e},r.prototype.nodes=function(){var e=[];return this.forEach((function(t){e.push(this.node)})),e},r.prototype.clone=function(){var e=[],t=[];return function n(r){for(var o=0;o<e.length;o++)if(e[o]===r)return t[o];if(\"object\"==typeof r&&null!==r){var s=a(r);return e.push(r),t.push(s),c(i(r),(function(e){s[e]=n(r[e])})),e.pop(),t.pop(),s}return r}(this.value)};var i=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t};function s(e){return Object.prototype.toString.call(e)}var u=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},c=function(e,t){if(e.forEach)return e.forEach(t);for(var n=0;n<e.length;n++)t(e[n],n,e)};c(i(r.prototype),(function(e){n[e]=function(t){var n=[].slice.call(arguments,1),o=new r(t);return o[e].apply(o,n)}}));var l=Object.hasOwnProperty||function(e,t){return t in e}},function(e,t,n){\"use strict\";t.parse=function(e,t){if(\"string\"!=typeof e)throw new TypeError(\"argument str must be a string\");for(var n={},o=t||{},i=e.split(a),u=o.decode||r,c=0;c<i.length;c++){var l=i[c],p=l.indexOf(\"=\");if(!(p<0)){var f=l.substr(0,p).trim(),h=l.substr(++p,l.length).trim();'\"'==h[0]&&(h=h.slice(1,-1)),null==n[f]&&(n[f]=s(h,u))}}return n},t.serialize=function(e,t,n){var r=n||{},a=r.encode||o;if(\"function\"!=typeof a)throw new TypeError(\"option encode is invalid\");if(!i.test(e))throw new TypeError(\"argument name is invalid\");var s=a(t);if(s&&!i.test(s))throw new TypeError(\"argument val is invalid\");var u=e+\"=\"+s;if(null!=r.maxAge){var c=r.maxAge-0;if(isNaN(c)||!isFinite(c))throw new TypeError(\"option maxAge is invalid\");u+=\"; Max-Age=\"+Math.floor(c)}if(r.domain){if(!i.test(r.domain))throw new TypeError(\"option domain is invalid\");u+=\"; Domain=\"+r.domain}if(r.path){if(!i.test(r.path))throw new TypeError(\"option path is invalid\");u+=\"; Path=\"+r.path}if(r.expires){if(\"function\"!=typeof r.expires.toUTCString)throw new TypeError(\"option expires is invalid\");u+=\"; Expires=\"+r.expires.toUTCString()}r.httpOnly&&(u+=\"; HttpOnly\");r.secure&&(u+=\"; Secure\");if(r.sameSite){switch(\"string\"==typeof r.sameSite?r.sameSite.toLowerCase():r.sameSite){case!0:u+=\"; SameSite=Strict\";break;case\"lax\":u+=\"; SameSite=Lax\";break;case\"strict\":u+=\"; SameSite=Strict\";break;case\"none\":u+=\"; SameSite=None\";break;default:throw new TypeError(\"option sameSite is invalid\")}}return u};var r=decodeURIComponent,o=encodeURIComponent,a=/; */,i=/^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;function s(e,t){try{return t(e)}catch(t){return e}}},function(e,t,n){var r,o,a;o=[],r=function(){\"use strict\";var e=function(e){return e&&\"getComputedStyle\"in window&&\"smooth\"===window.getComputedStyle(e)[\"scroll-behavior\"]};if(\"undefined\"==typeof window||!(\"document\"in window))return{};var t=function(t,n,r){var o;n=n||999,r||0===r||(r=9);var a=function(e){o=e},i=function(){clearTimeout(o),a(0)},s=function(e){return Math.max(0,t.getTopOf(e)-r)},u=function(r,o,s){if(i(),0===o||o&&o<0||e(t.body))t.toY(r),s&&s();else{var u=t.getY(),c=Math.max(0,r)-u,l=(new Date).getTime();o=o||Math.min(Math.abs(c),n),function e(){a(setTimeout((function(){var n=Math.min(1,((new Date).getTime()-l)/o),r=Math.max(0,Math.floor(u+c*(n<.5?2*n*n:n*(4-2*n)-1)));t.toY(r),n<1&&t.getHeight()+r<t.body.scrollHeight?e():(setTimeout(i,99),s&&s())}),9))}()}},c=function(e,t,n){u(s(e),t,n)},l=function(e,n,o){var a=e.getBoundingClientRect().height,i=t.getTopOf(e)+a,l=t.getHeight(),p=t.getY(),f=p+l;s(e)<p||a+r>l?c(e,n,o):i+r>f?u(i-l+r,n,o):o&&o()},p=function(e,n,r,o){u(Math.max(0,t.getTopOf(e)-t.getHeight()/2+(r||e.getBoundingClientRect().height/2)),n,o)};return{setup:function(e,t){return(0===e||e)&&(n=e),(0===t||t)&&(r=t),{defaultDuration:n,edgeOffset:r}},to:c,toY:u,intoView:l,center:p,stop:i,moving:function(){return!!o},getY:t.getY,getTopOf:t.getTopOf}},n=document.documentElement,r=function(){return window.scrollY||n.scrollTop},o=t({body:document.scrollingElement||document.body,toY:function(e){window.scrollTo(0,e)},getY:r,getHeight:function(){return window.innerHeight||n.clientHeight},getTopOf:function(e){return e.getBoundingClientRect().top+r()-n.offsetTop}});if(o.createScroller=function(e,r,o){return t({body:e,toY:function(t){e.scrollTop=t},getY:function(){return e.scrollTop},getHeight:function(){return Math.min(e.clientHeight,window.innerHeight||n.clientHeight)},getTopOf:function(e){return e.offsetTop}},r,o)},\"addEventListener\"in window&&!window.noZensmooth&&!e(document.body)){var a=\"history\"in window&&\"pushState\"in history,i=a&&\"scrollRestoration\"in history;i&&(history.scrollRestoration=\"auto\"),window.addEventListener(\"load\",(function(){i&&(setTimeout((function(){history.scrollRestoration=\"manual\"}),9),window.addEventListener(\"popstate\",(function(e){e.state&&\"zenscrollY\"in e.state&&o.toY(e.state.zenscrollY)}),!1)),window.location.hash&&setTimeout((function(){var e=o.setup().edgeOffset;if(e){var t=document.getElementById(window.location.href.split(\"#\")[1]);if(t){var n=Math.max(0,o.getTopOf(t)-e),r=o.getY()-n;0<=r&&r<9&&window.scrollTo(0,n)}}}),9)}),!1);var s=new RegExp(\"(^|\\\\s)noZensmooth(\\\\s|$)\");window.addEventListener(\"click\",(function(e){for(var t=e.target;t&&\"A\"!==t.tagName;)t=t.parentNode;if(!(!t||1!==e.which||e.shiftKey||e.metaKey||e.ctrlKey||e.altKey)){if(i){var n=history.state&&\"object\"==typeof history.state?history.state:{};n.zenscrollY=o.getY();try{history.replaceState(n,\"\")}catch(e){}}var r=t.getAttribute(\"href\")||\"\";if(0===r.indexOf(\"#\")&&!s.test(t.className)){var u=0,c=document.getElementById(r.substring(1));if(\"#\"!==r){if(!c)return;u=o.getTopOf(c)}e.preventDefault();var l=function(){window.location=r},p=o.setup().edgeOffset;p&&(u=Math.max(0,u-p),a&&(l=function(){history.pushState({},\"\",r)})),o.toY(u,null,l)}}}),!1)}return o}(),void 0===(a=\"function\"==typeof r?r.apply(t,o):r)||(e.exports=a)},function(e,t,n){e.exports=n(1091)},function(e,t){e.exports=function(e,t,n,r){var o=new Blob(void 0!==r?[r,e]:[e],{type:n||\"application/octet-stream\"});if(void 0!==window.navigator.msSaveBlob)window.navigator.msSaveBlob(o,t);else{var a=window.URL&&window.URL.createObjectURL?window.URL.createObjectURL(o):window.webkitURL.createObjectURL(o),i=document.createElement(\"a\");i.style.display=\"none\",i.href=a,i.setAttribute(\"download\",t),void 0===i.download&&i.setAttribute(\"target\",\"_blank\"),document.body.appendChild(i),i.click(),setTimeout((function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)}),200)}}},function(e,t,n){e.exports=n(1098)},function(e,t,n){e.exports=n(1101)},function(e,t,n){\"use strict\";var r=n(1106),o=function(e){return/<\\/+[^>]+>/.test(e)},a=function(e){return/<[^>]+\\/>/.test(e)};function i(e){return e.split(/(<\\/?[^>]+>)/g).filter((function(e){return\"\"!==e.trim()})).map((function(e){return{value:e,type:s(e)}}))}function s(e){return o(e)?\"ClosingTag\":function(e){return function(e){return/<[^>!]+>/.test(e)}(e)&&!o(e)&&!a(e)}(e)?\"OpeningTag\":a(e)?\"SelfClosingTag\":\"Text\"}e.exports=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.indentor,o=t.textNodesOnSameLine,a=0,s=[];n=n||\"    \";var u=i(e).map((function(e,t,i){var u=e.value,c=e.type;\"ClosingTag\"===c&&a--;var l=r(n,a),p=l+u;if(\"OpeningTag\"===c&&a++,o){var f=i[t-1],h=i[t-2];\"ClosingTag\"===c&&\"Text\"===f.type&&\"OpeningTag\"===h.type&&(p=\"\"+l+h.value+f.value+u,s.push(t-2,t-1))}return p}));return s.forEach((function(e){return u[e]=null})),u.filter((function(e){return!!e})).join(\"\\n\")}},function(e,t,n){e.exports=n(1110)},function(e,t,n){var r=n(545);n(565),n(566),n(567),n(568),n(569),n(570),n(571),e.exports=r},function(e,t,n){n(360),n(180),n(364),n(549),n(550),n(551),n(552),n(369),n(553),n(554),n(555),n(556),n(557),n(558),n(559),n(560),n(561),n(562),n(563),n(564);var r=n(34);e.exports=r.Symbol},function(e,t,n){var r=n(40),o=n(67);e.exports=function(e,t){try{o(r,e,t)}catch(n){r[e]=t}return t}},function(e,t,n){var r=n(66),o=n(234).f,a={}.toString,i=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return i&&\"[object Window]\"==a.call(e)?function(e){try{return o(e)}catch(e){return i.slice()}}(e):o(r(e))}},function(e,t,n){\"use strict\";var r=n(237),o=n(99);e.exports=r?{}.toString:function(){return\"[object \"+o(this)+\"]\"}},function(e,t,n){n(44)(\"asyncIterator\")},function(e,t){},function(e,t,n){n(44)(\"hasInstance\")},function(e,t,n){n(44)(\"isConcatSpreadable\")},function(e,t,n){n(44)(\"match\")},function(e,t,n){n(44)(\"matchAll\")},function(e,t,n){n(44)(\"replace\")},function(e,t,n){n(44)(\"search\")},function(e,t,n){n(44)(\"species\")},function(e,t,n){n(44)(\"split\")},function(e,t,n){n(44)(\"toPrimitive\")},function(e,t,n){n(44)(\"toStringTag\")},function(e,t,n){n(44)(\"unscopables\")},function(e,t,n){var r=n(40);n(98)(r.JSON,\"JSON\",!0)},function(e,t){},function(e,t){},function(e,t,n){n(44)(\"asyncDispose\")},function(e,t,n){n(44)(\"dispose\")},function(e,t,n){n(44)(\"matcher\")},function(e,t,n){n(44)(\"metadata\")},function(e,t,n){n(44)(\"observable\")},function(e,t,n){n(44)(\"patternMatch\")},function(e,t,n){n(44)(\"replaceAll\")},function(e,t,n){e.exports=n(573)},function(e,t,n){var r=n(574);e.exports=r},function(e,t,n){n(369),n(130),n(87);var r=n(236);e.exports=r.f(\"iterator\")},function(e,t,n){var r=n(47);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError(\"Can't set \"+String(e)+\" as a prototype\");return e}},function(e,t){e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(e,t,n){var r=n(578);e.exports=r},function(e,t,n){var r=n(579),o=Array.prototype;e.exports=function(e){var t=e.concat;return e===o||e instanceof Array&&t===o.concat?r:t}},function(e,t,n){n(360);var r=n(42);e.exports=r(\"Array\").concat},function(e,t,n){var r=n(374);e.exports=r},function(e,t,n){n(582);var r=n(42);e.exports=r(\"Array\").filter},function(e,t,n){\"use strict\";var r=n(21),o=n(86).filter;r({target:\"Array\",proto:!0,forced:!n(154)(\"filter\")},{filter:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(375);e.exports=r},function(e,t,n){var r=n(21),o=n(60),a=n(155);r({target:\"Object\",stat:!0,forced:n(37)((function(){a(1)}))},{keys:function(e){return a(o(e))}})},function(e,t,n){var r=n(586);e.exports=r},function(e,t,n){n(587);var r=n(34);r.JSON||(r.JSON={stringify:JSON.stringify}),e.exports=function(e,t,n){return r.JSON.stringify.apply(null,arguments)}},function(e,t,n){var r=n(21),o=n(70),a=n(37),i=o(\"JSON\",\"stringify\"),s=/[\\uD800-\\uDFFF]/g,u=/^[\\uD800-\\uDBFF]$/,c=/^[\\uDC00-\\uDFFF]$/,l=function(e,t,n){var r=n.charAt(t-1),o=n.charAt(t+1);return u.test(e)&&!c.test(o)||c.test(e)&&!u.test(r)?\"\\\\u\"+e.charCodeAt(0).toString(16):e},p=a((function(){return'\"\\\\udf06\\\\ud834\"'!==i(\"\\udf06\\ud834\")||'\"\\\\udead\"'!==i(\"\\udead\")}));i&&r({target:\"JSON\",stat:!0,forced:p},{stringify:function(e,t,n){var r=i.apply(null,arguments);return\"string\"==typeof r?r.replace(s,l):r}})},function(e,t,n){\"use strict\";t.byteLength=function(e){var t=c(e),n=t[0],r=t[1];return 3*(n+r)/4-r},t.toByteArray=function(e){var t,n,r=c(e),i=r[0],s=r[1],u=new a(function(e,t,n){return 3*(t+n)/4-n}(0,i,s)),l=0,p=s>0?i-4:i;for(n=0;n<p;n+=4)t=o[e.charCodeAt(n)]<<18|o[e.charCodeAt(n+1)]<<12|o[e.charCodeAt(n+2)]<<6|o[e.charCodeAt(n+3)],u[l++]=t>>16&255,u[l++]=t>>8&255,u[l++]=255&t;2===s&&(t=o[e.charCodeAt(n)]<<2|o[e.charCodeAt(n+1)]>>4,u[l++]=255&t);1===s&&(t=o[e.charCodeAt(n)]<<10|o[e.charCodeAt(n+1)]<<4|o[e.charCodeAt(n+2)]>>2,u[l++]=t>>8&255,u[l++]=255&t);return u},t.fromByteArray=function(e){for(var t,n=e.length,o=n%3,a=[],i=16383,s=0,u=n-o;s<u;s+=i)a.push(l(e,s,s+i>u?u:s+i));1===o?(t=e[n-1],a.push(r[t>>2]+r[t<<4&63]+\"==\")):2===o&&(t=(e[n-2]<<8)+e[n-1],a.push(r[t>>10]+r[t>>4&63]+r[t<<2&63]+\"=\"));return a.join(\"\")};for(var r=[],o=[],a=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,i=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",s=0,u=i.length;s<u;++s)r[s]=i[s],o[i.charCodeAt(s)]=s;function c(e){var t=e.length;if(t%4>0)throw new Error(\"Invalid string. Length must be a multiple of 4\");var n=e.indexOf(\"=\");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function l(e,t,n){for(var o,a,i=[],s=t;s<n;s+=3)o=(e[s]<<16&16711680)+(e[s+1]<<8&65280)+(255&e[s+2]),i.push(r[(a=o)>>18&63]+r[a>>12&63]+r[a>>6&63]+r[63&a]);return i.join(\"\")}o[\"-\".charCodeAt(0)]=62,o[\"_\".charCodeAt(0)]=63},function(e,t){t.read=function(e,t,n,r,o){var a,i,s=8*o-r-1,u=(1<<s)-1,c=u>>1,l=-7,p=n?o-1:0,f=n?-1:1,h=e[t+p];for(p+=f,a=h&(1<<-l)-1,h>>=-l,l+=s;l>0;a=256*a+e[t+p],p+=f,l-=8);for(i=a&(1<<-l)-1,a>>=-l,l+=r;l>0;i=256*i+e[t+p],p+=f,l-=8);if(0===a)a=1-c;else{if(a===u)return i?NaN:1/0*(h?-1:1);i+=Math.pow(2,r),a-=c}return(h?-1:1)*i*Math.pow(2,a-r)},t.write=function(e,t,n,r,o,a){var i,s,u,c=8*a-o-1,l=(1<<c)-1,p=l>>1,f=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:a-1,d=r?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,i=l):(i=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-i))<1&&(i--,u*=2),(t+=i+p>=1?f/u:f*Math.pow(2,1-p))*u>=2&&(i++,u/=2),i+p>=l?(s=0,i=l):i+p>=1?(s=(t*u-1)*Math.pow(2,o),i+=p):(s=t*Math.pow(2,p-1)*Math.pow(2,o),i=0));o>=8;e[n+h]=255&s,h+=d,s/=256,o-=8);for(i=i<<o|s,c+=o;c>0;e[n+h]=255&i,h+=d,i/=256,c-=8);e[n+h-d]|=128*m}},function(e,t,n){var r=n(377);e.exports=r},function(e,t,n){var r=n(21),o=n(48);r({target:\"Object\",stat:!0,forced:!o,sham:!o},{defineProperty:n(68).f})},function(e,t,n){var r=n(593);e.exports=r},function(e,t,n){var r=n(594),o=Function.prototype;e.exports=function(e){var t=e.bind;return e===o||e instanceof Function&&t===o.bind?r:t}},function(e,t,n){n(595);var r=n(42);e.exports=r(\"Function\").bind},function(e,t,n){n(21)({target:\"Function\",proto:!0},{bind:n(378)})},function(e,t,n){var r=n(379);e.exports=r},function(e,t,n){var r=n(21),o=n(380);r({target:\"Object\",stat:!0,forced:Object.assign!==o},{assign:o})},function(e,t,n){var r=n(381);e.exports=r},function(e,t,n){n(600);var r=n(42);e.exports=r(\"Array\").slice},function(e,t,n){\"use strict\";var r=n(21),o=n(47),a=n(152),i=n(232),s=n(69),u=n(66),c=n(153),l=n(41),p=n(154)(\"slice\"),f=l(\"species\"),h=[].slice,d=Math.max;r({target:\"Array\",proto:!0,forced:!p},{slice:function(e,t){var n,r,l,p=u(this),m=s(p.length),v=i(e,m),g=i(void 0===t?m:t,m);if(a(p)&&(\"function\"!=typeof(n=p.constructor)||n!==Array&&!a(n.prototype)?o(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return h.call(p,v,g);for(r=new(void 0===n?Array:n)(d(g-v,0)),l=0;v<g;v++,l++)v in p&&c(r,l,p[v]);return r.length=l,r}})},function(e,t,n){var r=n(382);e.exports=r},function(e,t,n){n(21)({target:\"Array\",stat:!0},{isArray:n(152)})},function(e,t,n){var r=n(604);e.exports=r},function(e,t,n){var r=n(605),o=Array.prototype;e.exports=function(e){var t=e.reduce;return e===o||e instanceof Array&&t===o.reduce?r:t}},function(e,t,n){n(606);var r=n(42);e.exports=r(\"Array\").reduce},function(e,t,n){\"use strict\";var r=n(21),o=n(607).left,a=n(111),i=n(129),s=n(184);r({target:\"Array\",proto:!0,forced:!a(\"reduce\")||!s&&i>79&&i<83},{reduce:function(e){return o(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(77),o=n(60),a=n(177),i=n(69),s=function(e){return function(t,n,s,u){r(n);var c=o(t),l=a(c),p=i(c.length),f=e?p-1:0,h=e?-1:1;if(s<2)for(;;){if(f in l){u=l[f],f+=h;break}if(f+=h,e?f<0:p<=f)throw TypeError(\"Reduce of empty array with no initial value\")}for(;e?f>=0:p>f;f+=h)f in l&&(u=n(u,l[f],f,c));return u}};e.exports={left:s(!1),right:s(!0)}},function(e,t,n){var r=n(609);e.exports=r},function(e,t,n){var r=n(610),o=Array.prototype;e.exports=function(e){var t=e.map;return e===o||e instanceof Array&&t===o.map?r:t}},function(e,t,n){n(611);var r=n(42);e.exports=r(\"Array\").map},function(e,t,n){\"use strict\";var r=n(21),o=n(86).map;r({target:\"Array\",proto:!0,forced:!n(154)(\"map\")},{map:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){\"use strict\";e.exports=function(){}},function(e,t,n){\"use strict\";var r=n(614),o=n(133),a=n(79),i=n(615),s=r.twoArgumentPooler,u=r.fourArgumentPooler,c=/\\/+/g;function l(e){return(\"\"+e).replace(c,\"$&/\")}function p(e,t){this.func=e,this.context=t,this.count=0}function f(e,t,n){var r=e.func,o=e.context;r.call(o,t,e.count++)}function h(e,t,n,r){this.result=e,this.keyPrefix=t,this.func=n,this.context=r,this.count=0}function d(e,t,n){var r=e.result,i=e.keyPrefix,s=e.func,u=e.context,c=s.call(u,t,e.count++);Array.isArray(c)?m(c,r,n,a.thatReturnsArgument):null!=c&&(o.isValidElement(c)&&(c=o.cloneAndReplaceKey(c,i+(!c.key||t&&t.key===c.key?\"\":l(c.key)+\"/\")+n)),r.push(c))}function m(e,t,n,r,o){var a=\"\";null!=n&&(a=l(n)+\"/\");var s=h.getPooled(t,a,r,o);i(e,d,s),h.release(s)}function v(e,t,n){return null}p.prototype.destructor=function(){this.func=null,this.context=null,this.count=0},r.addPoolingTo(p,s),h.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},r.addPoolingTo(h,u);var g={forEach:function(e,t,n){if(null==e)return e;var r=p.getPooled(t,n);i(e,f,r),p.release(r)},map:function(e,t,n){if(null==e)return e;var r=[];return m(e,r,null,t,n),r},mapIntoWithKeyPrefixInternal:m,count:function(e,t){return i(e,v,null)},toArray:function(e){var t=[];return m(e,t,null,a.thatReturnsArgument),t}};e.exports=g},function(e,t,n){\"use strict\";var r=n(158),o=(n(25),function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)}),a=function(e){var t=this;e instanceof t||r(\"25\"),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},i=o,s={addPoolingTo:function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||i,n.poolSize||(n.poolSize=10),n.release=a,n},oneArgumentPooler:o,twoArgumentPooler:function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},threeArgumentPooler:function(e,t,n){var r=this;if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,e,t,n),o}return new r(e,t,n)},fourArgumentPooler:function(e,t,n,r){var o=this;if(o.instancePool.length){var a=o.instancePool.pop();return o.call(a,e,t,n,r),a}return new o(e,t,n,r)}};e.exports=s},function(e,t,n){\"use strict\";var r=n(158),o=(n(88),n(386)),a=n(616),i=(n(25),n(617));n(33);function s(e,t){return e&&\"object\"==typeof e&&null!=e.key?i.escape(e.key):t.toString(36)}function u(e,t,n,c){var l,p=typeof e;if(\"undefined\"!==p&&\"boolean\"!==p||(e=null),null===e||\"string\"===p||\"number\"===p||\"object\"===p&&e.$$typeof===o)return n(c,e,\"\"===t?\".\"+s(e,0):t),1;var f=0,h=\"\"===t?\".\":t+\":\";if(Array.isArray(e))for(var d=0;d<e.length;d++)f+=u(l=e[d],h+s(l,d),n,c);else{var m=a(e);if(m){var v,g=m.call(e);if(m!==e.entries)for(var y=0;!(v=g.next()).done;)f+=u(l=v.value,h+s(l,y++),n,c);else for(;!(v=g.next()).done;){var b=v.value;b&&(f+=u(l=b[1],h+i.escape(b[0])+\":\"+s(l,0),n,c))}}else if(\"object\"===p){var _=String(e);r(\"31\",\"[object Object]\"===_?\"object with keys {\"+Object.keys(e).join(\", \")+\"}\":_,\"\")}}return f}e.exports=function(e,t,n){return null==e?0:u(e,\"\",t,n)}},function(e,t,n){\"use strict\";var r=\"function\"==typeof Symbol&&Symbol.iterator;e.exports=function(e){var t=e&&(r&&e[r]||e[\"@@iterator\"]);if(\"function\"==typeof t)return t}},function(e,t,n){\"use strict\";var r={escape:function(e){var t={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+e).replace(/[=:]/g,(function(e){return t[e]}))},unescape:function(e){var t={\"=0\":\"=\",\"=2\":\":\"};return(\"\"+(\".\"===e[0]&&\"$\"===e[1]?e.substring(2):e.substring(1))).replace(/(=0|=2)/g,(function(e){return t[e]}))}};e.exports=r},function(e,t,n){\"use strict\";var r=n(133).createFactory,o={a:r(\"a\"),abbr:r(\"abbr\"),address:r(\"address\"),area:r(\"area\"),article:r(\"article\"),aside:r(\"aside\"),audio:r(\"audio\"),b:r(\"b\"),base:r(\"base\"),bdi:r(\"bdi\"),bdo:r(\"bdo\"),big:r(\"big\"),blockquote:r(\"blockquote\"),body:r(\"body\"),br:r(\"br\"),button:r(\"button\"),canvas:r(\"canvas\"),caption:r(\"caption\"),cite:r(\"cite\"),code:r(\"code\"),col:r(\"col\"),colgroup:r(\"colgroup\"),data:r(\"data\"),datalist:r(\"datalist\"),dd:r(\"dd\"),del:r(\"del\"),details:r(\"details\"),dfn:r(\"dfn\"),dialog:r(\"dialog\"),div:r(\"div\"),dl:r(\"dl\"),dt:r(\"dt\"),em:r(\"em\"),embed:r(\"embed\"),fieldset:r(\"fieldset\"),figcaption:r(\"figcaption\"),figure:r(\"figure\"),footer:r(\"footer\"),form:r(\"form\"),h1:r(\"h1\"),h2:r(\"h2\"),h3:r(\"h3\"),h4:r(\"h4\"),h5:r(\"h5\"),h6:r(\"h6\"),head:r(\"head\"),header:r(\"header\"),hgroup:r(\"hgroup\"),hr:r(\"hr\"),html:r(\"html\"),i:r(\"i\"),iframe:r(\"iframe\"),img:r(\"img\"),input:r(\"input\"),ins:r(\"ins\"),kbd:r(\"kbd\"),keygen:r(\"keygen\"),label:r(\"label\"),legend:r(\"legend\"),li:r(\"li\"),link:r(\"link\"),main:r(\"main\"),map:r(\"map\"),mark:r(\"mark\"),menu:r(\"menu\"),menuitem:r(\"menuitem\"),meta:r(\"meta\"),meter:r(\"meter\"),nav:r(\"nav\"),noscript:r(\"noscript\"),object:r(\"object\"),ol:r(\"ol\"),optgroup:r(\"optgroup\"),option:r(\"option\"),output:r(\"output\"),p:r(\"p\"),param:r(\"param\"),picture:r(\"picture\"),pre:r(\"pre\"),progress:r(\"progress\"),q:r(\"q\"),rp:r(\"rp\"),rt:r(\"rt\"),ruby:r(\"ruby\"),s:r(\"s\"),samp:r(\"samp\"),script:r(\"script\"),section:r(\"section\"),select:r(\"select\"),small:r(\"small\"),source:r(\"source\"),span:r(\"span\"),strong:r(\"strong\"),style:r(\"style\"),sub:r(\"sub\"),summary:r(\"summary\"),sup:r(\"sup\"),table:r(\"table\"),tbody:r(\"tbody\"),td:r(\"td\"),textarea:r(\"textarea\"),tfoot:r(\"tfoot\"),th:r(\"th\"),thead:r(\"thead\"),time:r(\"time\"),title:r(\"title\"),tr:r(\"tr\"),track:r(\"track\"),u:r(\"u\"),ul:r(\"ul\"),var:r(\"var\"),video:r(\"video\"),wbr:r(\"wbr\"),circle:r(\"circle\"),clipPath:r(\"clipPath\"),defs:r(\"defs\"),ellipse:r(\"ellipse\"),g:r(\"g\"),image:r(\"image\"),line:r(\"line\"),linearGradient:r(\"linearGradient\"),mask:r(\"mask\"),path:r(\"path\"),pattern:r(\"pattern\"),polygon:r(\"polygon\"),polyline:r(\"polyline\"),radialGradient:r(\"radialGradient\"),rect:r(\"rect\"),stop:r(\"stop\"),svg:r(\"svg\"),text:r(\"text\"),tspan:r(\"tspan\")};e.exports=o},function(e,t,n){\"use strict\";var r=n(133).isValidElement,o=n(387);e.exports=o(r)},function(e,t,n){\"use strict\";var r=n(388),o=n(38),a=n(389),i=n(622),s=Function.call.bind(Object.prototype.hasOwnProperty);function u(){return null}e.exports=function(e,t){var n=\"function\"==typeof Symbol&&Symbol.iterator;var c=\"<<anonymous>>\",l={array:d(\"array\"),bool:d(\"boolean\"),func:d(\"function\"),number:d(\"number\"),object:d(\"object\"),string:d(\"string\"),symbol:d(\"symbol\"),any:h(u),arrayOf:function(e){return h((function(t,n,r,o,i){if(\"function\"!=typeof e)return new f(\"Property `\"+i+\"` of component `\"+r+\"` has invalid PropType notation inside arrayOf.\");var s=t[n];if(!Array.isArray(s))return new f(\"Invalid \"+o+\" `\"+i+\"` of type `\"+v(s)+\"` supplied to `\"+r+\"`, expected an array.\");for(var u=0;u<s.length;u++){var c=e(s,u,r,o,i+\"[\"+u+\"]\",a);if(c instanceof Error)return c}return null}))},element:h((function(t,n,r,o,a){var i=t[n];return e(i)?null:new f(\"Invalid \"+o+\" `\"+a+\"` of type `\"+v(i)+\"` supplied to `\"+r+\"`, expected a single ReactElement.\")})),elementType:h((function(e,t,n,o,a){var i=e[t];return r.isValidElementType(i)?null:new f(\"Invalid \"+o+\" `\"+a+\"` of type `\"+v(i)+\"` supplied to `\"+n+\"`, expected a single ReactElement type.\")})),instanceOf:function(e){return h((function(t,n,r,o,a){if(!(t[n]instanceof e)){var i=e.name||c;return new f(\"Invalid \"+o+\" `\"+a+\"` of type `\"+(((s=t[n]).constructor&&s.constructor.name?s.constructor.name:c)+\"` supplied to `\")+r+\"`, expected instance of `\"+i+\"`.\")}var s;return null}))},node:h((function(e,t,n,r,o){return m(e[t])?null:new f(\"Invalid \"+r+\" `\"+o+\"` supplied to `\"+n+\"`, expected a ReactNode.\")})),objectOf:function(e){return h((function(t,n,r,o,i){if(\"function\"!=typeof e)return new f(\"Property `\"+i+\"` of component `\"+r+\"` has invalid PropType notation inside objectOf.\");var u=t[n],c=v(u);if(\"object\"!==c)return new f(\"Invalid \"+o+\" `\"+i+\"` of type `\"+c+\"` supplied to `\"+r+\"`, expected an object.\");for(var l in u)if(s(u,l)){var p=e(u,l,r,o,i+\".\"+l,a);if(p instanceof Error)return p}return null}))},oneOf:function(e){if(!Array.isArray(e))return u;return h((function(t,n,r,o,a){for(var i=t[n],s=0;s<e.length;s++)if(p(i,e[s]))return null;var u=JSON.stringify(e,(function(e,t){return\"symbol\"===g(t)?String(t):t}));return new f(\"Invalid \"+o+\" `\"+a+\"` of value `\"+String(i)+\"` supplied to `\"+r+\"`, expected one of \"+u+\".\")}))},oneOfType:function(e){if(!Array.isArray(e))return u;for(var t=0;t<e.length;t++){var n=e[t];if(\"function\"!=typeof n)return y(n),u}return h((function(t,n,r,o,i){for(var s=0;s<e.length;s++)if(null==(0,e[s])(t,n,r,o,i,a))return null;return new f(\"Invalid \"+o+\" `\"+i+\"` supplied to `\"+r+\"`.\")}))},shape:function(e){return h((function(t,n,r,o,i){var s=t[n],u=v(s);if(\"object\"!==u)return new f(\"Invalid \"+o+\" `\"+i+\"` of type `\"+u+\"` supplied to `\"+r+\"`, expected `object`.\");for(var c in e){var l=e[c];if(l){var p=l(s,c,r,o,i+\".\"+c,a);if(p)return p}}return null}))},exact:function(e){return h((function(t,n,r,i,s){var u=t[n],c=v(u);if(\"object\"!==c)return new f(\"Invalid \"+i+\" `\"+s+\"` of type `\"+c+\"` supplied to `\"+r+\"`, expected `object`.\");var l=o({},t[n],e);for(var p in l){var h=e[p];if(!h)return new f(\"Invalid \"+i+\" `\"+s+\"` key `\"+p+\"` supplied to `\"+r+\"`.\\nBad object: \"+JSON.stringify(t[n],null,\"  \")+\"\\nValid keys: \"+JSON.stringify(Object.keys(e),null,\"  \"));var d=h(u,p,r,i,s+\".\"+p,a);if(d)return d}return null}))}};function p(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}function f(e){this.message=e,this.stack=\"\"}function h(e){function n(n,r,o,i,s,u,l){if((i=i||c,u=u||o,l!==a)&&t){var p=new Error(\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use `PropTypes.checkPropTypes()` to call them. Read more at http://fb.me/use-check-prop-types\");throw p.name=\"Invariant Violation\",p}return null==r[o]?n?null===r[o]?new f(\"The \"+s+\" `\"+u+\"` is marked as required in `\"+i+\"`, but its value is `null`.\"):new f(\"The \"+s+\" `\"+u+\"` is marked as required in `\"+i+\"`, but its value is `undefined`.\"):null:e(r,o,i,s,u)}var r=n.bind(null,!1);return r.isRequired=n.bind(null,!0),r}function d(e){return h((function(t,n,r,o,a,i){var s=t[n];return v(s)!==e?new f(\"Invalid \"+o+\" `\"+a+\"` of type `\"+g(s)+\"` supplied to `\"+r+\"`, expected `\"+e+\"`.\"):null}))}function m(t){switch(typeof t){case\"number\":case\"string\":case\"undefined\":return!0;case\"boolean\":return!t;case\"object\":if(Array.isArray(t))return t.every(m);if(null===t||e(t))return!0;var r=function(e){var t=e&&(n&&e[n]||e[\"@@iterator\"]);if(\"function\"==typeof t)return t}(t);if(!r)return!1;var o,a=r.call(t);if(r!==t.entries){for(;!(o=a.next()).done;)if(!m(o.value))return!1}else for(;!(o=a.next()).done;){var i=o.value;if(i&&!m(i[1]))return!1}return!0;default:return!1}}function v(e){var t=typeof e;return Array.isArray(e)?\"array\":e instanceof RegExp?\"object\":function(e,t){return\"symbol\"===e||!!t&&(\"Symbol\"===t[\"@@toStringTag\"]||\"function\"==typeof Symbol&&t instanceof Symbol)}(t,e)?\"symbol\":t}function g(e){if(null==e)return\"\"+e;var t=v(e);if(\"object\"===t){if(e instanceof Date)return\"date\";if(e instanceof RegExp)return\"regexp\"}return t}function y(e){var t=g(e);switch(t){case\"array\":case\"object\":return\"an \"+t;case\"boolean\":case\"date\":case\"regexp\":return\"a \"+t;default:return t}}return f.prototype=Error.prototype,l.checkPropTypes=i,l.resetWarningCache=i.resetWarningCache,l.PropTypes=l,l}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=\"function\"==typeof Symbol&&Symbol.for,o=r?Symbol.for(\"react.element\"):60103,a=r?Symbol.for(\"react.portal\"):60106,i=r?Symbol.for(\"react.fragment\"):60107,s=r?Symbol.for(\"react.strict_mode\"):60108,u=r?Symbol.for(\"react.profiler\"):60114,c=r?Symbol.for(\"react.provider\"):60109,l=r?Symbol.for(\"react.context\"):60110,p=r?Symbol.for(\"react.async_mode\"):60111,f=r?Symbol.for(\"react.concurrent_mode\"):60111,h=r?Symbol.for(\"react.forward_ref\"):60112,d=r?Symbol.for(\"react.suspense\"):60113,m=r?Symbol.for(\"react.memo\"):60115,v=r?Symbol.for(\"react.lazy\"):60116;function g(e){if(\"object\"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case o:switch(e=e.type){case p:case f:case i:case u:case s:case d:return e;default:switch(e=e&&e.$$typeof){case l:case h:case c:return e;default:return t}}case v:case m:case a:return t}}}function y(e){return g(e)===f}t.typeOf=g,t.AsyncMode=p,t.ConcurrentMode=f,t.ContextConsumer=l,t.ContextProvider=c,t.Element=o,t.ForwardRef=h,t.Fragment=i,t.Lazy=v,t.Memo=m,t.Portal=a,t.Profiler=u,t.StrictMode=s,t.Suspense=d,t.isValidElementType=function(e){return\"string\"==typeof e||\"function\"==typeof e||e===i||e===f||e===u||e===s||e===d||\"object\"==typeof e&&null!==e&&(e.$$typeof===v||e.$$typeof===m||e.$$typeof===c||e.$$typeof===l||e.$$typeof===h)},t.isAsyncMode=function(e){return y(e)||g(e)===p},t.isConcurrentMode=y,t.isContextConsumer=function(e){return g(e)===l},t.isContextProvider=function(e){return g(e)===c},t.isElement=function(e){return\"object\"==typeof e&&null!==e&&e.$$typeof===o},t.isForwardRef=function(e){return g(e)===h},t.isFragment=function(e){return g(e)===i},t.isLazy=function(e){return g(e)===v},t.isMemo=function(e){return g(e)===m},t.isPortal=function(e){return g(e)===a},t.isProfiler=function(e){return g(e)===u},t.isStrictMode=function(e){return g(e)===s},t.isSuspense=function(e){return g(e)===d}},function(e,t,n){\"use strict\";function r(e,t,n,r,o){}r.resetWarningCache=function(){0},e.exports=r},function(e,t,n){\"use strict\";e.exports=\"15.7.0\"},function(e,t,n){\"use strict\";var r=n(383).Component,o=n(133).isValidElement,a=n(384),i=n(625);e.exports=i(r,o,a)},function(e,t,n){\"use strict\";var r=n(38),o={};function a(e,t,n,r,o,a,i,s){if(!e){var u;if(void 0===t)u=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[n,r,o,a,i,s],l=0;(u=new Error(t.replace(/%s/g,(function(){return c[l++]})))).name=\"Invariant Violation\"}throw u.framesToPop=1,u}}var i=\"mixins\";e.exports=function(e,t,n){var s=[],u={mixins:\"DEFINE_MANY\",statics:\"DEFINE_MANY\",propTypes:\"DEFINE_MANY\",contextTypes:\"DEFINE_MANY\",childContextTypes:\"DEFINE_MANY\",getDefaultProps:\"DEFINE_MANY_MERGED\",getInitialState:\"DEFINE_MANY_MERGED\",getChildContext:\"DEFINE_MANY_MERGED\",render:\"DEFINE_ONCE\",componentWillMount:\"DEFINE_MANY\",componentDidMount:\"DEFINE_MANY\",componentWillReceiveProps:\"DEFINE_MANY\",shouldComponentUpdate:\"DEFINE_ONCE\",componentWillUpdate:\"DEFINE_MANY\",componentDidUpdate:\"DEFINE_MANY\",componentWillUnmount:\"DEFINE_MANY\",UNSAFE_componentWillMount:\"DEFINE_MANY\",UNSAFE_componentWillReceiveProps:\"DEFINE_MANY\",UNSAFE_componentWillUpdate:\"DEFINE_MANY\",updateComponent:\"OVERRIDE_BASE\"},c={getDerivedStateFromProps:\"DEFINE_MANY_MERGED\"},l={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)f(e,t[n])},childContextTypes:function(e,t){e.childContextTypes=r({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=r({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=d(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=r({},e.propTypes,t)},statics:function(e,t){!function(e,t){if(!t)return;for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){if(a(!(n in l),'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it as an instance property instead; it will still be accessible on the constructor.',n),n in e)return a(\"DEFINE_MANY_MERGED\"===(c.hasOwnProperty(n)?c[n]:null),\"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",n),void(e[n]=d(e[n],r));e[n]=r}}}(e,t)},autobind:function(){}};function p(e,t){var n=u.hasOwnProperty(t)?u[t]:null;b.hasOwnProperty(t)&&a(\"OVERRIDE_BASE\"===n,\"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.\",t),e&&a(\"DEFINE_MANY\"===n||\"DEFINE_MANY_MERGED\"===n,\"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",t)}function f(e,n){if(n){a(\"function\"!=typeof n,\"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object.\"),a(!t(n),\"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.\");var r=e.prototype,o=r.__reactAutoBindPairs;for(var s in n.hasOwnProperty(i)&&l.mixins(e,n.mixins),n)if(n.hasOwnProperty(s)&&s!==i){var c=n[s],f=r.hasOwnProperty(s);if(p(f,s),l.hasOwnProperty(s))l[s](e,c);else{var h=u.hasOwnProperty(s);if(\"function\"==typeof c&&!h&&!f&&!1!==n.autobind)o.push(s,c),r[s]=c;else if(f){var v=u[s];a(h&&(\"DEFINE_MANY_MERGED\"===v||\"DEFINE_MANY\"===v),\"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.\",v,s),\"DEFINE_MANY_MERGED\"===v?r[s]=d(r[s],c):\"DEFINE_MANY\"===v&&(r[s]=m(r[s],c))}else r[s]=c}}}else;}function h(e,t){for(var n in a(e&&t&&\"object\"==typeof e&&\"object\"==typeof t,\"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.\"),t)t.hasOwnProperty(n)&&(a(void 0===e[n],\"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.\",n),e[n]=t[n]);return e}function d(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return h(o,n),h(o,r),o}}function m(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function v(e,t){return t.bind(e)}var g={componentDidMount:function(){this.__isMounted=!0}},y={componentWillUnmount:function(){this.__isMounted=!1}},b={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e,t)},isMounted:function(){return!!this.__isMounted}},_=function(){};return r(_.prototype,e.prototype,b),function(e){var t=function(e,r,i){this.__reactAutoBindPairs.length&&function(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var r=t[n],o=t[n+1];e[r]=v(e,o)}}(this),this.props=e,this.context=r,this.refs=o,this.updater=i||n,this.state=null;var s=this.getInitialState?this.getInitialState():null;a(\"object\"==typeof s&&!Array.isArray(s),\"%s.getInitialState(): must return an object or null\",t.displayName||\"ReactCompositeComponent\"),this.state=s};for(var r in t.prototype=new _,t.prototype.constructor=t,t.prototype.__reactAutoBindPairs=[],s.forEach(f.bind(null,t)),f(t,g),f(t,e),f(t,y),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),a(t.prototype.render,\"createClass(...): Class specification must implement a `render` method.\"),u)t.prototype[r]||(t.prototype[r]=null);return t}}},function(e,t,n){\"use strict\";var r=n(158),o=n(133);n(25);e.exports=function(e){return o.isValidElement(e)||r(\"143\"),e}},function(e,t){e.exports=function(e){if(!e.webpackPolyfill){var t=Object.create(e);t.children||(t.children=[]),Object.defineProperty(t,\"loaded\",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,\"id\",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,\"exports\",{enumerable:!0}),t.webpackPolyfill=1}return t}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r,o=n(1),a=(r=o)&&r.__esModule?r:{default:r},i=n(629);t.default=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:a.default.Map,n=Object.keys(e);return function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t(),o=arguments[1];return r.withMutations((function(t){n.forEach((function(n){var r=(0,e[n])(t.get(n),o);(0,i.validateNextState)(r,n,o),t.set(n,r)}))}))}},e.exports=t.default},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.validateNextState=t.getUnexpectedInvocationParameterMessage=t.getStateName=void 0;var r=i(n(390)),o=i(n(630)),a=i(n(631));function i(e){return e&&e.__esModule?e:{default:e}}t.getStateName=r.default,t.getUnexpectedInvocationParameterMessage=o.default,t.validateNextState=a.default},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=a(n(1)),o=a(n(390));function a(e){return e&&e.__esModule?e:{default:e}}t.default=function(e,t,n){var a=Object.keys(t);if(!a.length)return\"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.\";var i=(0,o.default)(n);if(!r.default.Iterable.isIterable(e))return\"The \"+i+' is of unexpected type. Expected argument to be an instance of Immutable.Iterable with the following properties: \"'+a.join('\", \"')+'\".';var s=e.keySeq().toArray().filter((function(e){return!t.hasOwnProperty(e)}));return s.length>0?\"Unexpected \"+(1===s.length?\"property\":\"properties\")+' \"'+s.join('\", \"')+'\" found in '+i+'. Expected to find one of the known reducer property names instead: \"'+a.join('\", \"')+'\". Unexpected properties will be ignored.':null},e.exports=t.default},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e,t,n){if(void 0===e)throw new Error('Reducer \"'+t+'\" returned undefined when handling \"'+n.type+'\" action. To ignore an action, you must explicitly return the previous state.')},e.exports=t.default},function(e,t,n){var r=n(242),o=n(391);e.exports=function(e){if(r(e))return o(e)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(382);e.exports=r},function(e,t,n){n(87),n(130);var r=n(159);e.exports=r},function(e,t,n){var r=n(394);e.exports=r},function(e,t,n){var r=n(21),o=n(395);r({target:\"Array\",stat:!0,forced:!n(398)((function(e){Array.from(e)}))},{from:o})},function(e,t,n){var r=n(52),o=n(396);e.exports=function(e,t,n,a){try{return a?t(r(n)[0],n[1]):t(n)}catch(t){throw o(e),t}}},function(e,t,n){e.exports=n(639)},function(e,t,n){var r=n(381);e.exports=r},function(e,t){e.exports=function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(175),o=n(243);e.exports=function(e,t){var n=null==e?null:void 0!==r&&o(e)||e[\"@@iterator\"];if(null!=n){var a,i,s=[],u=!0,c=!1;try{for(n=n.call(e);!(u=(a=n.next()).done)&&(s.push(a.value),!t||s.length!==t);u=!0);}catch(e){c=!0,i=e}finally{try{u||null==n.return||n.return()}finally{if(c)throw i}}return s}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){n(87);var r=n(643),o=n(99),a=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.entries;return e===a||e instanceof Array&&t===a.entries||i.hasOwnProperty(o(e))?r:t}},function(e,t,n){var r=n(644);e.exports=r},function(e,t,n){n(157);var r=n(42);e.exports=r(\"Array\").entries},function(e,t,n){var r=n(646);e.exports=r},function(e,t,n){n(647);var r=n(42);e.exports=r(\"Array\").forEach},function(e,t,n){\"use strict\";var r=n(21),o=n(648);r({target:\"Array\",proto:!0,forced:[].forEach!=o},{forEach:o})},function(e,t,n){\"use strict\";var r=n(86).forEach,o=n(111)(\"forEach\");e.exports=o?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},function(e,t,n){var r=n(650);e.exports=r},function(e,t,n){var r=n(651),o=Array.prototype;e.exports=function(e){var t=e.sort;return e===o||e instanceof Array&&t===o.sort?r:t}},function(e,t,n){n(652);var r=n(42);e.exports=r(\"Array\").sort},function(e,t,n){\"use strict\";var r=n(21),o=n(77),a=n(60),i=n(69),s=n(37),u=n(653),c=n(111),l=n(654),p=n(655),f=n(129),h=n(656),d=[],m=d.sort,v=s((function(){d.sort(void 0)})),g=s((function(){d.sort(null)})),y=c(\"sort\"),b=!s((function(){if(f)return f<70;if(!(l&&l>3)){if(p)return!0;if(h)return h<603;var e,t,n,r,o=\"\";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)d.push({k:t+r,v:n})}for(d.sort((function(e,t){return t.v-e.v})),r=0;r<d.length;r++)t=d[r].k.charAt(0),o.charAt(o.length-1)!==t&&(o+=t);return\"DGBEFHACIJK\"!==o}}));r({target:\"Array\",proto:!0,forced:v||!g||!y||!b},{sort:function(e){void 0!==e&&o(e);var t=a(this);if(b)return void 0===e?m.call(t):m.call(t,e);var n,r,s=[],c=i(t.length);for(r=0;r<c;r++)r in t&&s.push(t[r]);for(n=(s=u(s,function(e){return function(t,n){return void 0===n?-1:void 0===t?1:void 0!==e?+e(t,n)||0:String(t)>String(n)?1:-1}}(e))).length,r=0;r<n;)t[r]=s[r++];for(;r<c;)delete t[r++];return t}})},function(e,t){var n=Math.floor,r=function(e,t){var i=e.length,s=n(i/2);return i<8?o(e,t):a(r(e.slice(0,s),t),r(e.slice(s),t),t)},o=function(e,t){for(var n,r,o=e.length,a=1;a<o;){for(r=a,n=e[a];r&&t(e[r-1],n)>0;)e[r]=e[--r];r!==a++&&(e[r]=n)}return e},a=function(e,t,n){for(var r=e.length,o=t.length,a=0,i=0,s=[];a<r||i<o;)a<r&&i<o?s.push(n(e[a],t[i])<=0?e[a++]:t[i++]):s.push(a<r?e[a++]:t[i++]);return s};e.exports=r},function(e,t,n){var r=n(108).match(/firefox\\/(\\d+)/i);e.exports=!!r&&+r[1]},function(e,t,n){var r=n(108);e.exports=/MSIE|Trident/.test(r)},function(e,t,n){var r=n(108).match(/AppleWebKit\\/(\\d+)\\./);e.exports=!!r&&+r[1]},function(e,t,n){var r=n(658);e.exports=r},function(e,t,n){var r=n(659),o=Array.prototype;e.exports=function(e){var t=e.some;return e===o||e instanceof Array&&t===o.some?r:t}},function(e,t,n){n(660);var r=n(42);e.exports=r(\"Array\").some},function(e,t,n){\"use strict\";var r=n(21),o=n(86).some;r({target:\"Array\",proto:!0,forced:!n(111)(\"some\")},{some:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(662);e.exports=r},function(e,t,n){var r=n(663),o=n(665),a=Array.prototype,i=String.prototype;e.exports=function(e){var t=e.includes;return e===a||e instanceof Array&&t===a.includes?r:\"string\"==typeof e||e===i||e instanceof String&&t===i.includes?o:t}},function(e,t,n){n(664);var r=n(42);e.exports=r(\"Array\").includes},function(e,t,n){\"use strict\";var r=n(21),o=n(231).includes,a=n(239);r({target:\"Array\",proto:!0},{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),a(\"includes\")},function(e,t,n){n(666);var r=n(42);e.exports=r(\"String\").includes},function(e,t,n){\"use strict\";var r=n(21),o=n(402),a=n(106);r({target:\"String\",proto:!0,forced:!n(403)(\"includes\")},{includes:function(e){return!!~String(a(this)).indexOf(o(e),arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(47),o=n(151),a=n(41)(\"match\");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[a])?!!t:\"RegExp\"==o(e))}},function(e,t,n){var r=n(404);e.exports=r},function(e,t,n){n(670);var r=n(42);e.exports=r(\"Array\").indexOf},function(e,t,n){\"use strict\";var r=n(21),o=n(231).indexOf,a=n(111),i=[].indexOf,s=!!i&&1/[1].indexOf(1,-0)<0,u=a(\"indexOf\");r({target:\"Array\",proto:!0,forced:s||!u},{indexOf:function(e){return s?i.apply(this,arguments)||0:o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(672);e.exports=r},function(e,t,n){var r=n(673),o=Array.prototype;e.exports=function(e){var t=e.find;return e===o||e instanceof Array&&t===o.find?r:t}},function(e,t,n){n(674);var r=n(42);e.exports=r(\"Array\").find},function(e,t,n){\"use strict\";var r=n(21),o=n(86).find,a=n(239),i=\"find\",s=!0;i in[]&&Array(1).find((function(){s=!1})),r({target:\"Array\",proto:!0,forced:s},{find:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),a(i)},function(e,t,n){var r=n(676);e.exports=r},function(e,t,n){var r=n(677),o=String.prototype;e.exports=function(e){var t=e.startsWith;return\"string\"==typeof e||e===o||e instanceof String&&t===o.startsWith?r:t}},function(e,t,n){n(678);var r=n(42);e.exports=r(\"String\").startsWith},function(e,t,n){\"use strict\";var r,o=n(21),a=n(127).f,i=n(69),s=n(402),u=n(106),c=n(403),l=n(97),p=\"\".startsWith,f=Math.min,h=c(\"startsWith\");o({target:\"String\",proto:!0,forced:!!(l||h||(r=a(String.prototype,\"startsWith\"),!r||r.writable))&&!h},{startsWith:function(e){var t=String(u(this));s(e);var n=i(f(arguments.length>1?arguments[1]:void 0,t.length)),r=String(e);return p?p.call(t,r,n):t.slice(n,n+r.length)===r}})},function(e,t,n){var r=n(680);e.exports=r},function(e,t,n){var r=n(681),o=String.prototype;e.exports=function(e){var t=e.trim;return\"string\"==typeof e||e===o||e instanceof String&&t===o.trim?r:t}},function(e,t,n){n(682);var r=n(42);e.exports=r(\"String\").trim},function(e,t,n){\"use strict\";var r=n(21),o=n(683).trim;r({target:\"String\",proto:!0,forced:n(684)(\"trim\")},{trim:function(){return o(this)}})},function(e,t,n){var r=n(106),o=\"[\"+n(405)+\"]\",a=RegExp(\"^\"+o+o+\"*\"),i=RegExp(o+o+\"*$\"),s=function(e){return function(t){var n=String(r(t));return 1&e&&(n=n.replace(a,\"\")),2&e&&(n=n.replace(i,\"\")),n}};e.exports={start:s(1),end:s(2),trim:s(3)}},function(e,t,n){var r=n(37),o=n(405);e.exports=function(e){return r((function(){return!!o[e]()||\"​᠎\"!=\"​᠎\"[e]()||o[e].name!==e}))}},function(e,t,n){var r=n(92),o=n(284);e.exports=function(e){return o(r(e).toLowerCase())}},function(e,t,n){var r=n(134),o=Object.prototype,a=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=a.call(e,s),n=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=n:delete e[s]),o}},function(e,t){var n=Object.prototype.toString;e.exports=function(e){return n.call(e)}},function(e,t,n){var r=n(689),o=n(410),a=n(690),i=n(92);e.exports=function(e){return function(t){t=i(t);var n=o(t)?a(t):void 0,s=n?n[0]:t.charAt(0),u=n?r(n,1).join(\"\"):t.slice(1);return s[e]()+u}}},function(e,t,n){var r=n(409);e.exports=function(e,t,n){var o=e.length;return n=void 0===n?o:n,!t&&n>=o?e:r(e,t,n)}},function(e,t,n){var r=n(691),o=n(410),a=n(692);e.exports=function(e){return o(e)?a(e):r(e)}},function(e,t){e.exports=function(e){return e.split(\"\")}},function(e,t){var n=\"[\\\\ud800-\\\\udfff]\",r=\"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\",o=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",a=\"[^\\\\ud800-\\\\udfff]\",i=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",s=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",u=\"(?:\"+r+\"|\"+o+\")\"+\"?\",c=\"[\\\\ufe0e\\\\ufe0f]?\",l=c+u+(\"(?:\\\\u200d(?:\"+[a,i,s].join(\"|\")+\")\"+c+u+\")*\"),p=\"(?:\"+[a+r+\"?\",r,i,s,n].join(\"|\")+\")\",f=RegExp(o+\"(?=\"+o+\")|\"+p+l,\"g\");e.exports=function(e){return e.match(f)||[]}},function(e,t,n){var r=n(411),o=n(694),a=n(697),i=RegExp(\"['’]\",\"g\");e.exports=function(e){return function(t){return r(a(o(t).replace(i,\"\")),e,\"\")}}},function(e,t,n){var r=n(695),o=n(92),a=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,i=RegExp(\"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\",\"g\");e.exports=function(e){return(e=o(e))&&e.replace(a,r).replace(i,\"\")}},function(e,t,n){var r=n(696)({\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ã\":\"A\",\"Ä\":\"A\",\"Å\":\"A\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ã\":\"a\",\"ä\":\"a\",\"å\":\"a\",\"Ç\":\"C\",\"ç\":\"c\",\"Ð\":\"D\",\"ð\":\"d\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ë\":\"E\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ë\":\"e\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ï\":\"I\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ï\":\"i\",\"Ñ\":\"N\",\"ñ\":\"n\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Õ\":\"O\",\"Ö\":\"O\",\"Ø\":\"O\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"õ\":\"o\",\"ö\":\"o\",\"ø\":\"o\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ü\":\"U\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ü\":\"u\",\"Ý\":\"Y\",\"ý\":\"y\",\"ÿ\":\"y\",\"Æ\":\"Ae\",\"æ\":\"ae\",\"Þ\":\"Th\",\"þ\":\"th\",\"ß\":\"ss\",\"Ā\":\"A\",\"Ă\":\"A\",\"Ą\":\"A\",\"ā\":\"a\",\"ă\":\"a\",\"ą\":\"a\",\"Ć\":\"C\",\"Ĉ\":\"C\",\"Ċ\":\"C\",\"Č\":\"C\",\"ć\":\"c\",\"ĉ\":\"c\",\"ċ\":\"c\",\"č\":\"c\",\"Ď\":\"D\",\"Đ\":\"D\",\"ď\":\"d\",\"đ\":\"d\",\"Ē\":\"E\",\"Ĕ\":\"E\",\"Ė\":\"E\",\"Ę\":\"E\",\"Ě\":\"E\",\"ē\":\"e\",\"ĕ\":\"e\",\"ė\":\"e\",\"ę\":\"e\",\"ě\":\"e\",\"Ĝ\":\"G\",\"Ğ\":\"G\",\"Ġ\":\"G\",\"Ģ\":\"G\",\"ĝ\":\"g\",\"ğ\":\"g\",\"ġ\":\"g\",\"ģ\":\"g\",\"Ĥ\":\"H\",\"Ħ\":\"H\",\"ĥ\":\"h\",\"ħ\":\"h\",\"Ĩ\":\"I\",\"Ī\":\"I\",\"Ĭ\":\"I\",\"Į\":\"I\",\"İ\":\"I\",\"ĩ\":\"i\",\"ī\":\"i\",\"ĭ\":\"i\",\"į\":\"i\",\"ı\":\"i\",\"Ĵ\":\"J\",\"ĵ\":\"j\",\"Ķ\":\"K\",\"ķ\":\"k\",\"ĸ\":\"k\",\"Ĺ\":\"L\",\"Ļ\":\"L\",\"Ľ\":\"L\",\"Ŀ\":\"L\",\"Ł\":\"L\",\"ĺ\":\"l\",\"ļ\":\"l\",\"ľ\":\"l\",\"ŀ\":\"l\",\"ł\":\"l\",\"Ń\":\"N\",\"Ņ\":\"N\",\"Ň\":\"N\",\"Ŋ\":\"N\",\"ń\":\"n\",\"ņ\":\"n\",\"ň\":\"n\",\"ŋ\":\"n\",\"Ō\":\"O\",\"Ŏ\":\"O\",\"Ő\":\"O\",\"ō\":\"o\",\"ŏ\":\"o\",\"ő\":\"o\",\"Ŕ\":\"R\",\"Ŗ\":\"R\",\"Ř\":\"R\",\"ŕ\":\"r\",\"ŗ\":\"r\",\"ř\":\"r\",\"Ś\":\"S\",\"Ŝ\":\"S\",\"Ş\":\"S\",\"Š\":\"S\",\"ś\":\"s\",\"ŝ\":\"s\",\"ş\":\"s\",\"š\":\"s\",\"Ţ\":\"T\",\"Ť\":\"T\",\"Ŧ\":\"T\",\"ţ\":\"t\",\"ť\":\"t\",\"ŧ\":\"t\",\"Ũ\":\"U\",\"Ū\":\"U\",\"Ŭ\":\"U\",\"Ů\":\"U\",\"Ű\":\"U\",\"Ų\":\"U\",\"ũ\":\"u\",\"ū\":\"u\",\"ŭ\":\"u\",\"ů\":\"u\",\"ű\":\"u\",\"ų\":\"u\",\"Ŵ\":\"W\",\"ŵ\":\"w\",\"Ŷ\":\"Y\",\"ŷ\":\"y\",\"Ÿ\":\"Y\",\"Ź\":\"Z\",\"Ż\":\"Z\",\"Ž\":\"Z\",\"ź\":\"z\",\"ż\":\"z\",\"ž\":\"z\",\"Ĳ\":\"IJ\",\"ĳ\":\"ij\",\"Œ\":\"Oe\",\"œ\":\"oe\",\"ŉ\":\"'n\",\"ſ\":\"s\"});e.exports=r},function(e,t){e.exports=function(e){return function(t){return null==e?void 0:e[t]}}},function(e,t,n){var r=n(698),o=n(699),a=n(92),i=n(700);e.exports=function(e,t,n){return e=a(e),void 0===(t=n?void 0:t)?o(e)?i(e):r(e):e.match(t)||[]}},function(e,t){var n=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;e.exports=function(e){return e.match(n)||[]}},function(e,t){var n=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;e.exports=function(e){return n.test(e)}},function(e,t){var n=\"\\\\u2700-\\\\u27bf\",r=\"a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\",o=\"A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\",a=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",i=\"[\"+a+\"]\",s=\"\\\\d+\",u=\"[\\\\u2700-\\\\u27bf]\",c=\"[\"+r+\"]\",l=\"[^\\\\ud800-\\\\udfff\"+a+s+n+r+o+\"]\",p=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",f=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",h=\"[\"+o+\"]\",d=\"(?:\"+c+\"|\"+l+\")\",m=\"(?:\"+h+\"|\"+l+\")\",v=\"(?:['’](?:d|ll|m|re|s|t|ve))?\",g=\"(?:['’](?:D|LL|M|RE|S|T|VE))?\",y=\"(?:[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]|\\\\ud83c[\\\\udffb-\\\\udfff])?\",b=\"[\\\\ufe0e\\\\ufe0f]?\",_=b+y+(\"(?:\\\\u200d(?:\"+[\"[^\\\\ud800-\\\\udfff]\",p,f].join(\"|\")+\")\"+b+y+\")*\"),w=\"(?:\"+[u,p,f].join(\"|\")+\")\"+_,x=RegExp([h+\"?\"+c+\"+\"+v+\"(?=\"+[i,h,\"$\"].join(\"|\")+\")\",m+\"+\"+g+\"(?=\"+[i,h+d,\"$\"].join(\"|\")+\")\",h+\"?\"+d+\"+\"+v,h+\"+\"+g,\"\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\",\"\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\",s,w].join(\"|\"),\"g\");e.exports=function(e){return e.match(x)||[]}},function(e,t,n){var r=n(702),o=n(188),a=n(245);e.exports=function(){this.size=0,this.__data__={hash:new r,map:new(a||o),string:new r}}},function(e,t,n){var r=n(703),o=n(708),a=n(709),i=n(710),s=n(711);function u(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}u.prototype.clear=r,u.prototype.delete=o,u.prototype.get=a,u.prototype.has=i,u.prototype.set=s,e.exports=u},function(e,t,n){var r=n(187);e.exports=function(){this.__data__=r?r(null):{},this.size=0}},function(e,t,n){var r=n(124),o=n(705),a=n(57),i=n(412),s=/^\\[object .+?Constructor\\]$/,u=Function.prototype,c=Object.prototype,l=u.toString,p=c.hasOwnProperty,f=RegExp(\"^\"+l.call(p).replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");e.exports=function(e){return!(!a(e)||o(e))&&(r(e)?f:s).test(i(e))}},function(e,t,n){var r,o=n(706),a=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||\"\"))?\"Symbol(src)_1.\"+r:\"\";e.exports=function(e){return!!a&&a in e}},function(e,t,n){var r=n(71)[\"__core-js_shared__\"];e.exports=r},function(e,t){e.exports=function(e,t){return null==e?void 0:e[t]}},function(e,t){e.exports=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},function(e,t,n){var r=n(187),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;if(r){var n=t[e];return\"__lodash_hash_undefined__\"===n?void 0:n}return o.call(t,e)?t[e]:void 0}},function(e,t,n){var r=n(187),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;return r?void 0!==t[e]:o.call(t,e)}},function(e,t,n){var r=n(187);e.exports=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=r&&void 0===t?\"__lodash_hash_undefined__\":t,this}},function(e,t){e.exports=function(){this.__data__=[],this.size=0}},function(e,t,n){var r=n(189),o=Array.prototype.splice;e.exports=function(e){var t=this.__data__,n=r(t,e);return!(n<0)&&(n==t.length-1?t.pop():o.call(t,n,1),--this.size,!0)}},function(e,t,n){var r=n(189);e.exports=function(e){var t=this.__data__,n=r(t,e);return n<0?void 0:t[n][1]}},function(e,t,n){var r=n(189);e.exports=function(e){return r(this.__data__,e)>-1}},function(e,t,n){var r=n(189);e.exports=function(e,t){var n=this.__data__,o=r(n,e);return o<0?(++this.size,n.push([e,t])):n[o][1]=t,this}},function(e,t,n){var r=n(190);e.exports=function(e){var t=r(this,e).delete(e);return this.size-=t?1:0,t}},function(e,t){e.exports=function(e){var t=typeof e;return\"string\"==t||\"number\"==t||\"symbol\"==t||\"boolean\"==t?\"__proto__\"!==e:null===e}},function(e,t,n){var r=n(190);e.exports=function(e){return r(this,e).get(e)}},function(e,t,n){var r=n(190);e.exports=function(e){return r(this,e).has(e)}},function(e,t,n){var r=n(190);e.exports=function(e,t){var n=r(this,e),o=n.size;return n.set(e,t),this.size+=n.size==o?0:1,this}},function(e,t,n){var r=n(191),o=n(115),a=n(114);e.exports=function(e){return function(t,n,i){var s=Object(t);if(!o(t)){var u=r(n,3);t=a(t),n=function(e){return u(s[e],e,s)}}var c=e(t,n,i);return c>-1?s[u?t[c]:c]:void 0}}},function(e,t,n){var r=n(724),o=n(749),a=n(424);e.exports=function(e){var t=o(e);return 1==t.length&&t[0][2]?a(t[0][0],t[0][1]):function(n){return n===e||r(n,e,t)}}},function(e,t,n){var r=n(246),o=n(413);e.exports=function(e,t,n,a){var i=n.length,s=i,u=!a;if(null==e)return!s;for(e=Object(e);i--;){var c=n[i];if(u&&c[2]?c[1]!==e[c[0]]:!(c[0]in e))return!1}for(;++i<s;){var l=(c=n[i])[0],p=e[l],f=c[1];if(u&&c[2]){if(void 0===p&&!(l in e))return!1}else{var h=new r;if(a)var d=a(p,f,l,e,t,h);if(!(void 0===d?o(f,p,3,a,h):d))return!1}}return!0}},function(e,t,n){var r=n(188);e.exports=function(){this.__data__=new r,this.size=0}},function(e,t){e.exports=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}},function(e,t){e.exports=function(e){return this.__data__.get(e)}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t,n){var r=n(188),o=n(245),a=n(244);e.exports=function(e,t){var n=this.__data__;if(n instanceof r){var i=n.__data__;if(!o||i.length<199)return i.push([e,t]),this.size=++n.size,this;n=this.__data__=new a(i)}return n.set(e,t),this.size=n.size,this}},function(e,t,n){var r=n(246),o=n(414),a=n(735),i=n(738),s=n(161),u=n(50),c=n(193),l=n(249),p=\"[object Arguments]\",f=\"[object Array]\",h=\"[object Object]\",d=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,m,v,g){var y=u(e),b=u(t),_=y?f:s(e),w=b?f:s(t),x=(_=_==p?h:_)==h,E=(w=w==p?h:w)==h,S=_==w;if(S&&c(e)){if(!c(t))return!1;y=!0,x=!1}if(S&&!x)return g||(g=new r),y||l(e)?o(e,t,n,m,v,g):a(e,t,_,n,m,v,g);if(!(1&n)){var C=x&&d.call(e,\"__wrapped__\"),A=E&&d.call(t,\"__wrapped__\");if(C||A){var k=C?e.value():e,O=A?t.value():t;return g||(g=new r),v(k,O,n,m,g)}}return!!S&&(g||(g=new r),i(e,t,n,m,v,g))}},function(e,t,n){var r=n(244),o=n(732),a=n(733);function i(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new r;++t<n;)this.add(e[t])}i.prototype.add=i.prototype.push=o,i.prototype.has=a,e.exports=i},function(e,t){e.exports=function(e){return this.__data__.set(e,\"__lodash_hash_undefined__\"),this}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t){e.exports=function(e,t){return e.has(t)}},function(e,t,n){var r=n(134),o=n(416),a=n(123),i=n(414),s=n(736),u=n(737),c=r?r.prototype:void 0,l=c?c.valueOf:void 0;e.exports=function(e,t,n,r,c,p,f){switch(n){case\"[object DataView]\":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case\"[object ArrayBuffer]\":return!(e.byteLength!=t.byteLength||!p(new o(e),new o(t)));case\"[object Boolean]\":case\"[object Date]\":case\"[object Number]\":return a(+e,+t);case\"[object Error]\":return e.name==t.name&&e.message==t.message;case\"[object RegExp]\":case\"[object String]\":return e==t+\"\";case\"[object Map]\":var h=s;case\"[object Set]\":var d=1&r;if(h||(h=u),e.size!=t.size&&!d)return!1;var m=f.get(e);if(m)return m==t;r|=2,f.set(e,t);var v=i(h(e),h(t),r,c,p,f);return f.delete(e),v;case\"[object Symbol]\":if(l)return l.call(e)==l.call(t)}return!1}},function(e,t){e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e,r){n[++t]=[r,e]})),n}},function(e,t){e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e){n[++t]=e})),n}},function(e,t,n){var r=n(417),o=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,a,i,s){var u=1&n,c=r(e),l=c.length;if(l!=r(t).length&&!u)return!1;for(var p=l;p--;){var f=c[p];if(!(u?f in t:o.call(t,f)))return!1}var h=s.get(e),d=s.get(t);if(h&&d)return h==t&&d==e;var m=!0;s.set(e,t),s.set(t,e);for(var v=u;++p<l;){var g=e[f=c[p]],y=t[f];if(a)var b=u?a(y,g,f,t,e,s):a(g,y,f,e,t,s);if(!(void 0===b?g===y||i(g,y,n,a,s):b)){m=!1;break}v||(v=\"constructor\"==f)}if(m&&!v){var _=e.constructor,w=t.constructor;_==w||!(\"constructor\"in e)||!(\"constructor\"in t)||\"function\"==typeof _&&_ instanceof _&&\"function\"==typeof w&&w instanceof w||(m=!1)}return s.delete(e),s.delete(t),m}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,a=[];++n<r;){var i=e[n];t(i,n,e)&&(a[o++]=i)}return a}},function(e,t){e.exports=function(e,t){for(var n=-1,r=Array(e);++n<e;)r[n]=t(n);return r}},function(e,t,n){var r=n(112),o=n(89);e.exports=function(e){return o(e)&&\"[object Arguments]\"==r(e)}},function(e,t){e.exports=function(){return!1}},function(e,t,n){var r=n(112),o=n(250),a=n(89),i={};i[\"[object Float32Array]\"]=i[\"[object Float64Array]\"]=i[\"[object Int8Array]\"]=i[\"[object Int16Array]\"]=i[\"[object Int32Array]\"]=i[\"[object Uint8Array]\"]=i[\"[object Uint8ClampedArray]\"]=i[\"[object Uint16Array]\"]=i[\"[object Uint32Array]\"]=!0,i[\"[object Arguments]\"]=i[\"[object Array]\"]=i[\"[object ArrayBuffer]\"]=i[\"[object Boolean]\"]=i[\"[object DataView]\"]=i[\"[object Date]\"]=i[\"[object Error]\"]=i[\"[object Function]\"]=i[\"[object Map]\"]=i[\"[object Number]\"]=i[\"[object Object]\"]=i[\"[object RegExp]\"]=i[\"[object Set]\"]=i[\"[object String]\"]=i[\"[object WeakMap]\"]=!1,e.exports=function(e){return a(e)&&o(e.length)&&!!i[r(e)]}},function(e,t,n){var r=n(422)(Object.keys,Object);e.exports=r},function(e,t,n){var r=n(113)(n(71),\"DataView\");e.exports=r},function(e,t,n){var r=n(113)(n(71),\"Promise\");e.exports=r},function(e,t,n){var r=n(113)(n(71),\"Set\");e.exports=r},function(e,t,n){var r=n(113)(n(71),\"WeakMap\");e.exports=r},function(e,t,n){var r=n(423),o=n(114);e.exports=function(e){for(var t=o(e),n=t.length;n--;){var a=t[n],i=e[a];t[n]=[a,i,r(i)]}return t}},function(e,t,n){var r=n(413),o=n(43),a=n(425),i=n(253),s=n(423),u=n(424),c=n(136);e.exports=function(e,t){return i(e)&&s(t)?u(c(e),t):function(n){var i=o(n,e);return void 0===i&&i===t?a(n,e):r(t,i,3)}}},function(e,t,n){var r=n(752),o=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,a=/\\\\(\\\\)?/g,i=r((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(\"\"),e.replace(o,(function(e,n,r,o){t.push(r?o.replace(a,\"$1\"):n||e)})),t}));e.exports=i},function(e,t,n){var r=n(285);e.exports=function(e){var t=r(e,(function(e){return 500===n.size&&n.clear(),e})),n=t.cache;return t}},function(e,t){e.exports=function(e,t){return null!=e&&t in Object(e)}},function(e,t,n){var r=n(135),o=n(192),a=n(50),i=n(195),s=n(250),u=n(136);e.exports=function(e,t,n){for(var c=-1,l=(t=r(t,e)).length,p=!1;++c<l;){var f=u(t[c]);if(!(p=null!=e&&n(e,f)))break;e=e[f]}return p||++c!=l?p:!!(l=null==e?0:e.length)&&s(l)&&i(f,l)&&(a(e)||o(e))}},function(e,t,n){var r=n(756),o=n(757),a=n(253),i=n(136);e.exports=function(e){return a(e)?r(i(e)):o(e)}},function(e,t){e.exports=function(e){return function(t){return null==t?void 0:t[e]}}},function(e,t,n){var r=n(196);e.exports=function(e){return function(t){return r(t,e)}}},function(e,t,n){var r=n(759),o=n(191),a=n(426),i=Math.max;e.exports=function(e,t,n){var s=null==e?0:e.length;if(!s)return-1;var u=null==n?0:a(n);return u<0&&(u=i(s+u,0)),r(e,o(t,3),u)}},function(e,t){e.exports=function(e,t,n,r){for(var o=e.length,a=n+(r?1:-1);r?a--:++a<o;)if(t(e[a],a,e))return a;return-1}},function(e,t,n){var r=n(427),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},function(e,t,n){var r=n(762),o=/^\\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,\"\"):e}},function(e,t){var n=/\\s/;e.exports=function(e){for(var t=e.length;t--&&n.test(e.charAt(t)););return t}},function(e,t,n){var r=n(428);e.exports=function(e,t){var n;return r(e,(function(e,r,o){return!(n=t(e,r,o))})),!!n}},function(e,t,n){var r=n(765),o=n(114);e.exports=function(e,t){return e&&r(e,t,o)}},function(e,t,n){var r=n(766)();e.exports=r},function(e,t){e.exports=function(e){return function(t,n,r){for(var o=-1,a=Object(t),i=r(t),s=i.length;s--;){var u=i[e?s:++o];if(!1===n(a[u],u,a))break}return t}}},function(e,t,n){var r=n(115);e.exports=function(e,t){return function(n,o){if(null==n)return n;if(!r(n))return e(n,o);for(var a=n.length,i=t?a:-1,s=Object(n);(t?i--:++i<a)&&!1!==o(s[i],i,s););return n}}},function(e,t){var n={\"&\":\"&amp;\",'\"':\"&quot;\",\"'\":\"&apos;\",\"<\":\"&lt;\",\">\":\"&gt;\"};e.exports=function(e){return e&&e.replace?e.replace(/([&\"<>'])/g,(function(e,t){return n[t]})):e}},function(e,t,n){e.exports=o;var r=n(255).EventEmitter;function o(){r.call(this)}n(61)(o,r),o.Readable=n(256),o.Writable=n(776),o.Duplex=n(777),o.Transform=n(778),o.PassThrough=n(779),o.Stream=o,o.prototype.pipe=function(e,t){var n=this;function o(t){e.writable&&!1===e.write(t)&&n.pause&&n.pause()}function a(){n.readable&&n.resume&&n.resume()}n.on(\"data\",o),e.on(\"drain\",a),e._isStdio||t&&!1===t.end||(n.on(\"end\",s),n.on(\"close\",u));var i=!1;function s(){i||(i=!0,e.end())}function u(){i||(i=!0,\"function\"==typeof e.destroy&&e.destroy())}function c(e){if(l(),0===r.listenerCount(this,\"error\"))throw e}function l(){n.removeListener(\"data\",o),e.removeListener(\"drain\",a),n.removeListener(\"end\",s),n.removeListener(\"close\",u),n.removeListener(\"error\",c),e.removeListener(\"error\",c),n.removeListener(\"end\",l),n.removeListener(\"close\",l),e.removeListener(\"close\",l)}return n.on(\"error\",c),e.on(\"error\",c),n.on(\"end\",l),n.on(\"close\",l),e.on(\"close\",l),e.emit(\"pipe\",n),e}},function(e,t){},function(e,t,n){\"use strict\";var r=n(62).Buffer,o=n(772);e.exports=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.head=null,this.tail=null,this.length=0}return e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return\"\";for(var t=this.head,n=\"\"+t.data;t=t.next;)n+=e+t.data;return n},e.prototype.concat=function(e){if(0===this.length)return r.alloc(0);if(1===this.length)return this.head.data;for(var t,n,o,a=r.allocUnsafe(e>>>0),i=this.head,s=0;i;)t=i.data,n=a,o=s,t.copy(n,o),s+=i.data.length,i=i.next;return a},e}(),o&&o.inspect&&o.inspect.custom&&(e.exports.prototype[o.inspect.custom]=function(){var e=o.inspect({length:this.length});return this.constructor.name+\" \"+e})},function(e,t){},function(e,t,n){(function(e,t){!function(e,n){\"use strict\";if(!e.setImmediate){var r,o,a,i,s,u=1,c={},l=!1,p=e.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(e);f=f&&f.setTimeout?f:e,\"[object process]\"==={}.toString.call(e.process)?r=function(e){t.nextTick((function(){d(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage(\"\",\"*\"),e.onmessage=n,t}}()?e.MessageChannel?((a=new MessageChannel).port1.onmessage=function(e){d(e.data)},r=function(e){a.port2.postMessage(e)}):p&&\"onreadystatechange\"in p.createElement(\"script\")?(o=p.documentElement,r=function(e){var t=p.createElement(\"script\");t.onreadystatechange=function(){d(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):r=function(e){setTimeout(d,0,e)}:(i=\"setImmediate$\"+Math.random()+\"$\",s=function(t){t.source===e&&\"string\"==typeof t.data&&0===t.data.indexOf(i)&&d(+t.data.slice(i.length))},e.addEventListener?e.addEventListener(\"message\",s,!1):e.attachEvent(\"onmessage\",s),r=function(t){e.postMessage(i+t,\"*\")}),f.setImmediate=function(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),n=0;n<t.length;n++)t[n]=arguments[n+1];var o={callback:e,args:t};return c[u]=o,r(u),u++},f.clearImmediate=h}function h(e){delete c[e]}function d(e){if(l)setTimeout(d,0,e);else{var t=c[e];if(t){l=!0;try{!function(e){var t=e.callback,n=e.args;switch(n.length){case 0:t();break;case 1:t(n[0]);break;case 2:t(n[0],n[1]);break;case 3:t(n[0],n[1],n[2]);break;default:t.apply(void 0,n)}}(t)}finally{h(e),l=!1}}}}}(\"undefined\"==typeof self?void 0===e?this:e:self)}).call(this,n(51),n(90))},function(e,t,n){(function(t){function n(e){try{if(!t.localStorage)return!1}catch(e){return!1}var n=t.localStorage[e];return null!=n&&\"true\"===String(n).toLowerCase()}e.exports=function(e,t){if(n(\"noDeprecation\"))return e;var r=!1;return function(){if(!r){if(n(\"throwDeprecation\"))throw new Error(t);n(\"traceDeprecation\")?console.trace(t):console.warn(t),r=!0}return e.apply(this,arguments)}}}).call(this,n(51))},function(e,t,n){\"use strict\";e.exports=a;var r=n(435),o=n(162);function a(e){if(!(this instanceof a))return new a(e);r.call(this,e)}o.inherits=n(61),o.inherits(a,r),a.prototype._transform=function(e,t,n){n(null,e)}},function(e,t,n){e.exports=n(257)},function(e,t,n){e.exports=n(116)},function(e,t,n){e.exports=n(256).Transform},function(e,t,n){e.exports=n(256).PassThrough},function(e,t,n){\"use strict\";e.exports=function(){}},function(e,t,n){\"use strict\";var r=n(782),o=Math.abs,a=Math.floor;e.exports=function(e){return isNaN(e)?0:0!==(e=Number(e))&&isFinite(e)?r(e)*a(o(e)):e}},function(e,t,n){\"use strict\";e.exports=n(783)()?Math.sign:n(784)},function(e,t,n){\"use strict\";e.exports=function(){var e=Math.sign;return\"function\"==typeof e&&(1===e(10)&&-1===e(-20))}},function(e,t,n){\"use strict\";e.exports=function(e){return e=Number(e),isNaN(e)||0===e?e:e>0?1:-1}},function(e,t,n){\"use strict\";var r=n(100),o=n(198),a=n(119),i=n(787),s=n(437);e.exports=function e(t){var n,u,c;if(r(t),(n=Object(arguments[1])).async&&n.promise)throw new Error(\"Options 'async' and 'promise' cannot be used together\");return hasOwnProperty.call(t,\"__memoized__\")&&!n.force?t:(u=s(n.length,t.length,n.async&&a.async),c=i(t,u,n),o(a,(function(e,t){n[t]&&e(n[t],c,n)})),e.__profiler__&&e.__profiler__(c),c.updateEnv(),c.memoized)}},function(e,t,n){\"use strict\";var r=n(100),o=n(137),a=Function.prototype.bind,i=Function.prototype.call,s=Object.keys,u=Object.prototype.propertyIsEnumerable;e.exports=function(e,t){return function(n,c){var l,p=arguments[2],f=arguments[3];return n=Object(o(n)),r(c),l=s(n),f&&l.sort(\"function\"==typeof f?a.call(f,n):void 0),\"function\"!=typeof e&&(e=l[e]),i.call(e,l,(function(e,r){return u.call(n,e)?i.call(c,p,n[e],e,n,r):t}))}}},function(e,t,n){\"use strict\";var r=n(788),o=n(439),a=n(120),i=n(802).methods,s=n(803),u=n(819),c=Function.prototype.apply,l=Function.prototype.call,p=Object.create,f=Object.defineProperties,h=i.on,d=i.emit;e.exports=function(e,t,n){var i,m,v,g,y,b,_,w,x,E,S,C,A,k,O,j=p(null);return m=!1!==t?t:isNaN(e.length)?1:e.length,n.normalizer&&(E=u(n.normalizer),v=E.get,g=E.set,y=E.delete,b=E.clear),null!=n.resolvers&&(O=s(n.resolvers)),k=v?o((function(t){var n,o,a=arguments;if(O&&(a=O(a)),null!==(n=v(a))&&hasOwnProperty.call(j,n))return S&&i.emit(\"get\",n,a,this),j[n];if(o=1===a.length?l.call(e,this,a[0]):c.call(e,this,a),null===n){if(null!==(n=v(a)))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");n=g(a)}else if(hasOwnProperty.call(j,n))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");return j[n]=o,C&&i.emit(\"set\",n,null,o),o}),m):0===t?function(){var t;if(hasOwnProperty.call(j,\"data\"))return S&&i.emit(\"get\",\"data\",arguments,this),j.data;if(t=arguments.length?c.call(e,this,arguments):l.call(e,this),hasOwnProperty.call(j,\"data\"))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");return j.data=t,C&&i.emit(\"set\",\"data\",null,t),t}:function(t){var n,o,a=arguments;if(O&&(a=O(arguments)),o=String(a[0]),hasOwnProperty.call(j,o))return S&&i.emit(\"get\",o,a,this),j[o];if(n=1===a.length?l.call(e,this,a[0]):c.call(e,this,a),hasOwnProperty.call(j,o))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");return j[o]=n,C&&i.emit(\"set\",o,null,n),n},i={original:e,memoized:k,profileName:n.profileName,get:function(e){return O&&(e=O(e)),v?v(e):String(e[0])},has:function(e){return hasOwnProperty.call(j,e)},delete:function(e){var t;hasOwnProperty.call(j,e)&&(y&&y(e),t=j[e],delete j[e],A&&i.emit(\"delete\",e,t))},clear:function(){var e=j;b&&b(),j=p(null),i.emit(\"clear\",e)},on:function(e,t){return\"get\"===e?S=!0:\"set\"===e?C=!0:\"delete\"===e&&(A=!0),h.call(this,e,t)},emit:d,updateEnv:function(){e=i.original}},_=v?o((function(e){var t,n=arguments;O&&(n=O(n)),null!==(t=v(n))&&i.delete(t)}),m):0===t?function(){return i.delete(\"data\")}:function(e){return O&&(e=O(arguments)[0]),i.delete(e)},w=o((function(){var e,n=arguments;return 0===t?j.data:(O&&(n=O(n)),e=v?v(n):String(n[0]),j[e])})),x=o((function(){var e,n=arguments;return 0===t?i.has(\"data\"):(O&&(n=O(n)),null!==(e=v?v(n):String(n[0]))&&i.has(e))})),f(k,{__memoized__:a(!0),delete:a(_),clear:a(i.clear),_get:a(w),_has:a(x)}),i}},function(e,t,n){\"use strict\";var r=n(438),o=n(794),a=n(117),i=Error.captureStackTrace;e.exports=function(t){var n=new Error(t),s=arguments[1],u=arguments[2];return a(u)||o(s)&&(u=s,s=null),a(u)&&r(n,u),a(s)&&(n.code=s),i&&i(n,e.exports),n}},function(e,t,n){\"use strict\";e.exports=function(){var e,t=Object.assign;return\"function\"==typeof t&&(t(e={foo:\"raz\"},{bar:\"dwa\"},{trzy:\"trzy\"}),e.foo+e.bar+e.trzy===\"razdwatrzy\")}},function(e,t,n){\"use strict\";var r=n(791),o=n(137),a=Math.max;e.exports=function(e,t){var n,i,s,u=a(arguments.length,2);for(e=Object(o(e)),s=function(r){try{e[r]=t[r]}catch(e){n||(n=e)}},i=1;i<u;++i)r(t=arguments[i]).forEach(s);if(void 0!==n)throw n;return e}},function(e,t,n){\"use strict\";e.exports=n(792)()?Object.keys:n(793)},function(e,t,n){\"use strict\";e.exports=function(){try{return Object.keys(\"primitive\"),!0}catch(e){return!1}}},function(e,t,n){\"use strict\";var r=n(117),o=Object.keys;e.exports=function(e){return o(r(e)?Object(e):e)}},function(e,t,n){\"use strict\";var r=n(117),o={function:!0,object:!0};e.exports=function(e){return r(e)&&o[typeof e]||!1}},function(e,t,n){\"use strict\";var r=n(796),o=/^\\s*class[\\s{/}]/,a=Function.prototype.toString;e.exports=function(e){return!!r(e)&&!o.test(a.call(e))}},function(e,t,n){\"use strict\";var r=n(797);e.exports=function(e){if(\"function\"!=typeof e)return!1;if(!hasOwnProperty.call(e,\"length\"))return!1;try{if(\"number\"!=typeof e.length)return!1;if(\"function\"!=typeof e.call)return!1;if(\"function\"!=typeof e.apply)return!1}catch(e){return!1}return!r(e)}},function(e,t,n){\"use strict\";var r=n(798);e.exports=function(e){if(!r(e))return!1;try{return!!e.constructor&&e.constructor.prototype===e}catch(e){return!1}}},function(e,t,n){\"use strict\";var r=n(441),o={object:!0,function:!0,undefined:!0};e.exports=function(e){return!!r(e)&&hasOwnProperty.call(o,typeof e)}},function(e,t,n){\"use strict\";e.exports=n(800)()?String.prototype.contains:n(801)},function(e,t,n){\"use strict\";var r=\"razdwatrzy\";e.exports=function(){return\"function\"==typeof r.contains&&(!0===r.contains(\"dwa\")&&!1===r.contains(\"foo\"))}},function(e,t,n){\"use strict\";var r=String.prototype.indexOf;e.exports=function(e){return r.call(this,e,arguments[1])>-1}},function(e,t,n){\"use strict\";var r,o,a,i,s,u,c,l=n(120),p=n(100),f=Function.prototype.apply,h=Function.prototype.call,d=Object.create,m=Object.defineProperty,v=Object.defineProperties,g=Object.prototype.hasOwnProperty,y={configurable:!0,enumerable:!1,writable:!0};o=function(e,t){var n,o;return p(t),o=this,r.call(this,e,n=function(){a.call(o,e,n),f.call(t,this,arguments)}),n.__eeOnceListener__=t,this},s={on:r=function(e,t){var n;return p(t),g.call(this,\"__ee__\")?n=this.__ee__:(n=y.value=d(null),m(this,\"__ee__\",y),y.value=null),n[e]?\"object\"==typeof n[e]?n[e].push(t):n[e]=[n[e],t]:n[e]=t,this},once:o,off:a=function(e,t){var n,r,o,a;if(p(t),!g.call(this,\"__ee__\"))return this;if(!(n=this.__ee__)[e])return this;if(\"object\"==typeof(r=n[e]))for(a=0;o=r[a];++a)o!==t&&o.__eeOnceListener__!==t||(2===r.length?n[e]=r[a?0:1]:r.splice(a,1));else r!==t&&r.__eeOnceListener__!==t||delete n[e];return this},emit:i=function(e){var t,n,r,o,a;if(g.call(this,\"__ee__\")&&(o=this.__ee__[e]))if(\"object\"==typeof o){for(n=arguments.length,a=new Array(n-1),t=1;t<n;++t)a[t-1]=arguments[t];for(o=o.slice(),t=0;r=o[t];++t)f.call(r,this,a)}else switch(arguments.length){case 1:h.call(o,this);break;case 2:h.call(o,this,arguments[1]);break;case 3:h.call(o,this,arguments[1],arguments[2]);break;default:for(n=arguments.length,a=new Array(n-1),t=1;t<n;++t)a[t-1]=arguments[t];f.call(o,this,a)}}},u={on:l(r),once:l(o),off:l(a),emit:l(i)},c=v({},u),e.exports=t=function(e){return null==e?d(c):v(Object(e),u)},t.methods=s},function(e,t,n){\"use strict\";var r,o=n(804),a=n(117),i=n(100),s=Array.prototype.slice;r=function(e){return this.map((function(t,n){return t?t(e[n]):e[n]})).concat(s.call(e,this.length))},e.exports=function(e){return(e=o(e)).forEach((function(e){a(e)&&i(e)})),r.bind(e)}},function(e,t,n){\"use strict\";var r=n(258),o=Array.isArray;e.exports=function(e){return o(e)?e:r(e)}},function(e,t,n){\"use strict\";e.exports=function(){var e,t,n=Array.from;return\"function\"==typeof n&&(t=n(e=[\"raz\",\"dwa\"]),Boolean(t&&t!==e&&\"dwa\"===t[1]))}},function(e,t,n){\"use strict\";var r=n(807).iterator,o=n(816),a=n(817),i=n(118),s=n(100),u=n(137),c=n(117),l=n(818),p=Array.isArray,f=Function.prototype.call,h={configurable:!0,enumerable:!0,writable:!0,value:null},d=Object.defineProperty;e.exports=function(e){var t,n,m,v,g,y,b,_,w,x,E=arguments[1],S=arguments[2];if(e=Object(u(e)),c(E)&&s(E),this&&this!==Array&&a(this))t=this;else{if(!E){if(o(e))return 1!==(g=e.length)?Array.apply(null,e):((v=new Array(1))[0]=e[0],v);if(p(e)){for(v=new Array(g=e.length),n=0;n<g;++n)v[n]=e[n];return v}}v=[]}if(!p(e))if(void 0!==(w=e[r])){for(b=s(w).call(e),t&&(v=new t),_=b.next(),n=0;!_.done;)x=E?f.call(E,S,_.value,n):_.value,t?(h.value=x,d(v,n,h)):v[n]=x,_=b.next(),++n;g=n}else if(l(e)){for(g=e.length,t&&(v=new t),n=0,m=0;n<g;++n)x=e[n],n+1<g&&(y=x.charCodeAt(0))>=55296&&y<=56319&&(x+=e[++n]),x=E?f.call(E,S,x,m):x,t?(h.value=x,d(v,m,h)):v[m]=x,++m;g=m}if(void 0===g)for(g=i(e.length),t&&(v=new t(g)),n=0;n<g;++n)x=E?f.call(E,S,e[n],n):e[n],t?(h.value=x,d(v,n,h)):v[n]=x;return t&&(h.value=null,v.length=g),v}},function(e,t,n){\"use strict\";e.exports=n(808)()?n(199).Symbol:n(811)},function(e,t,n){\"use strict\";var r=n(199),o={object:!0,symbol:!0};e.exports=function(){var e,t=r.Symbol;if(\"function\"!=typeof t)return!1;e=t(\"test symbol\");try{String(e)}catch(e){return!1}return!!o[typeof t.iterator]&&(!!o[typeof t.toPrimitive]&&!!o[typeof t.toStringTag])}},function(e,t,n){\"use strict\";e.exports=function(){return\"object\"==typeof globalThis&&(!!globalThis&&globalThis.Array===Array)}},function(e,t){var n=function(){if(\"object\"==typeof self&&self)return self;if(\"object\"==typeof window&&window)return window;throw new Error(\"Unable to resolve global `this`\")};e.exports=function(){if(this)return this;try{Object.defineProperty(Object.prototype,\"__global__\",{get:function(){return this},configurable:!0})}catch(e){return n()}try{return __global__||n()}finally{delete Object.prototype.__global__}}()},function(e,t,n){\"use strict\";var r,o,a,i=n(120),s=n(442),u=n(199).Symbol,c=n(813),l=n(814),p=n(815),f=Object.create,h=Object.defineProperties,d=Object.defineProperty;if(\"function\"==typeof u)try{String(u()),a=!0}catch(e){}else u=null;o=function(e){if(this instanceof o)throw new TypeError(\"Symbol is not a constructor\");return r(e)},e.exports=r=function e(t){var n;if(this instanceof e)throw new TypeError(\"Symbol is not a constructor\");return a?u(t):(n=f(o.prototype),t=void 0===t?\"\":String(t),h(n,{__description__:i(\"\",t),__name__:i(\"\",c(t))}))},l(r),p(r),h(o.prototype,{constructor:i(r),toString:i(\"\",(function(){return this.__name__}))}),h(r.prototype,{toString:i((function(){return\"Symbol (\"+s(this).__description__+\")\"})),valueOf:i((function(){return s(this)}))}),d(r.prototype,r.toPrimitive,i(\"\",(function(){var e=s(this);return\"symbol\"==typeof e?e:e.toString()}))),d(r.prototype,r.toStringTag,i(\"c\",\"Symbol\")),d(o.prototype,r.toStringTag,i(\"c\",r.prototype[r.toStringTag])),d(o.prototype,r.toPrimitive,i(\"c\",r.prototype[r.toPrimitive]))},function(e,t,n){\"use strict\";e.exports=function(e){return!!e&&(\"symbol\"==typeof e||!!e.constructor&&(\"Symbol\"===e.constructor.name&&\"Symbol\"===e[e.constructor.toStringTag]))}},function(e,t,n){\"use strict\";var r=n(120),o=Object.create,a=Object.defineProperty,i=Object.prototype,s=o(null);e.exports=function(e){for(var t,n,o=0;s[e+(o||\"\")];)++o;return s[e+=o||\"\"]=!0,a(i,t=\"@@\"+e,r.gs(null,(function(e){n||(n=!0,a(this,t,r(e)),n=!1)}))),t}},function(e,t,n){\"use strict\";var r=n(120),o=n(199).Symbol;e.exports=function(e){return Object.defineProperties(e,{hasInstance:r(\"\",o&&o.hasInstance||e(\"hasInstance\")),isConcatSpreadable:r(\"\",o&&o.isConcatSpreadable||e(\"isConcatSpreadable\")),iterator:r(\"\",o&&o.iterator||e(\"iterator\")),match:r(\"\",o&&o.match||e(\"match\")),replace:r(\"\",o&&o.replace||e(\"replace\")),search:r(\"\",o&&o.search||e(\"search\")),species:r(\"\",o&&o.species||e(\"species\")),split:r(\"\",o&&o.split||e(\"split\")),toPrimitive:r(\"\",o&&o.toPrimitive||e(\"toPrimitive\")),toStringTag:r(\"\",o&&o.toStringTag||e(\"toStringTag\")),unscopables:r(\"\",o&&o.unscopables||e(\"unscopables\"))})}},function(e,t,n){\"use strict\";var r=n(120),o=n(442),a=Object.create(null);e.exports=function(e){return Object.defineProperties(e,{for:r((function(t){return a[t]?a[t]:a[t]=e(String(t))})),keyFor:r((function(e){var t;for(t in o(e),a)if(a[t]===e)return t}))})}},function(e,t,n){\"use strict\";var r=Object.prototype.toString,o=r.call(function(){return arguments}());e.exports=function(e){return r.call(e)===o}},function(e,t,n){\"use strict\";var r=Object.prototype.toString,o=RegExp.prototype.test.bind(/^[object [A-Za-z0-9]*Function]$/);e.exports=function(e){return\"function\"==typeof e&&o(r.call(e))}},function(e,t,n){\"use strict\";var r=Object.prototype.toString,o=r.call(\"\");e.exports=function(e){return\"string\"==typeof e||e&&\"object\"==typeof e&&(e instanceof String||r.call(e)===o)||!1}},function(e,t,n){\"use strict\";var r=n(100);e.exports=function(e){var t;return\"function\"==typeof e?{set:e,get:e}:(t={get:r(e.get)},void 0!==e.set?(t.set=r(e.set),e.delete&&(t.delete=r(e.delete)),e.clear&&(t.clear=r(e.clear)),t):(t.set=t.get,t))}},function(e,t,n){\"use strict\";e.exports=function(e){var t,n,r=e.length;if(!r)return\"\u0002\";for(t=String(e[n=0]);--r;)t+=\"\u0001\"+e[++n];return t}},function(e,t,n){\"use strict\";e.exports=function(e){return e?function(t){for(var n=String(t[0]),r=0,o=e;--o;)n+=\"\u0001\"+t[++r];return n}:function(){return\"\"}}},function(e,t,n){\"use strict\";var r=n(259),o=Object.create;e.exports=function(){var e=0,t=[],n=o(null);return{get:function(e){var n,o=0,a=t,i=e.length;if(0===i)return a[i]||null;if(a=a[i]){for(;o<i-1;){if(-1===(n=r.call(a[0],e[o])))return null;a=a[1][n],++o}return-1===(n=r.call(a[0],e[o]))?null:a[1][n]||null}return null},set:function(o){var a,i=0,s=t,u=o.length;if(0===u)s[u]=++e;else{for(s[u]||(s[u]=[[],[]]),s=s[u];i<u-1;)-1===(a=r.call(s[0],o[i]))&&(a=s[0].push(o[i])-1,s[1].push([[],[]])),s=s[1][a],++i;-1===(a=r.call(s[0],o[i]))&&(a=s[0].push(o[i])-1),s[1][a]=++e}return n[e]=o,e},delete:function(e){var o,a=0,i=t,s=n[e],u=s.length,c=[];if(0===u)delete i[u];else if(i=i[u]){for(;a<u-1;){if(-1===(o=r.call(i[0],s[a])))return;c.push(i,o),i=i[1][o],++a}if(-1===(o=r.call(i[0],s[a])))return;for(e=i[1][o],i[0].splice(o,1),i[1].splice(o,1);!i[0].length&&c.length;)o=c.pop(),(i=c.pop())[0].splice(o,1),i[1].splice(o,1)}delete n[e]},clear:function(){t=[],n=o(null)}}}},function(e,t,n){\"use strict\";e.exports=n(824)()?Number.isNaN:n(825)},function(e,t,n){\"use strict\";e.exports=function(){var e=Number.isNaN;return\"function\"==typeof e&&(!e({})&&e(NaN)&&!e(34))}},function(e,t,n){\"use strict\";e.exports=function(e){return e!=e}},function(e,t,n){\"use strict\";var r=n(259);e.exports=function(){var e=0,t=[],n=[];return{get:function(e){var o=r.call(t,e[0]);return-1===o?null:n[o]},set:function(r){return t.push(r[0]),n.push(++e),e},delete:function(e){var o=r.call(n,e);-1!==o&&(t.splice(o,1),n.splice(o,1))},clear:function(){t=[],n=[]}}}},function(e,t,n){\"use strict\";var r=n(259),o=Object.create;e.exports=function(e){var t=0,n=[[],[]],a=o(null);return{get:function(t){for(var o,a=0,i=n;a<e-1;){if(-1===(o=r.call(i[0],t[a])))return null;i=i[1][o],++a}return-1===(o=r.call(i[0],t[a]))?null:i[1][o]||null},set:function(o){for(var i,s=0,u=n;s<e-1;)-1===(i=r.call(u[0],o[s]))&&(i=u[0].push(o[s])-1,u[1].push([[],[]])),u=u[1][i],++s;return-1===(i=r.call(u[0],o[s]))&&(i=u[0].push(o[s])-1),u[1][i]=++t,a[t]=o,t},delete:function(t){for(var o,i=0,s=n,u=[],c=a[t];i<e-1;){if(-1===(o=r.call(s[0],c[i])))return;u.push(s,o),s=s[1][o],++i}if(-1!==(o=r.call(s[0],c[i]))){for(t=s[1][o],s[0].splice(o,1),s[1].splice(o,1);!s[0].length&&u.length;)o=u.pop(),(s=u.pop())[0].splice(o,1),s[1].splice(o,1);delete a[t]}},clear:function(){n=[[],[]],a=o(null)}}}},function(e,t,n){\"use strict\";var r=n(258),o=n(443),a=n(440),i=n(439),s=n(260),u=Array.prototype.slice,c=Function.prototype.apply,l=Object.create;n(119).async=function(e,t){var n,p,f,h=l(null),d=l(null),m=t.memoized,v=t.original;t.memoized=i((function(e){var t=arguments,r=t[t.length-1];return\"function\"==typeof r&&(n=r,t=u.call(t,0,-1)),m.apply(p=this,f=t)}),m);try{a(t.memoized,m)}catch(e){}t.on(\"get\",(function(e){var r,o,a;if(n){if(h[e])return\"function\"==typeof h[e]?h[e]=[h[e],n]:h[e].push(n),void(n=null);r=n,o=p,a=f,n=p=f=null,s((function(){var i;hasOwnProperty.call(d,e)?(i=d[e],t.emit(\"getasync\",e,a,o),c.call(r,i.context,i.args)):(n=r,p=o,f=a,m.apply(o,a))}))}})),t.original=function(){var e,o,a,i;return n?(e=r(arguments),o=function e(n){var o,a,u=e.id;if(null!=u){if(delete e.id,o=h[u],delete h[u],o)return a=r(arguments),t.has(u)&&(n?t.delete(u):(d[u]={context:this,args:a},t.emit(\"setasync\",u,\"function\"==typeof o?1:o.length))),\"function\"==typeof o?i=c.call(o,this,a):o.forEach((function(e){i=c.call(e,this,a)}),this),i}else s(c.bind(e,this,arguments))},a=n,n=p=f=null,e.push(o),i=c.call(v,this,e),o.cb=a,n=o,i):c.call(v,this,arguments)},t.on(\"set\",(function(e){n?(h[e]?\"function\"==typeof h[e]?h[e]=[h[e],n.cb]:h[e].push(n.cb):h[e]=n.cb,delete n.cb,n.id=e,n=null):t.delete(e)})),t.on(\"delete\",(function(e){var n;hasOwnProperty.call(h,e)||d[e]&&(n=d[e],delete d[e],t.emit(\"deleteasync\",e,u.call(n.args,1)))})),t.on(\"clear\",(function(){var e=d;d=l(null),t.emit(\"clearasync\",o(e,(function(e){return u.call(e.args,1)})))}))}},function(e,t,n){\"use strict\";var r=n(443),o=n(830),a=n(831),i=n(833),s=n(445),u=n(260),c=Object.create,l=o(\"then\",\"then:finally\",\"done\",\"done:finally\");n(119).promise=function(e,t){var n=c(null),o=c(null),p=c(null);if(!0===e)e=null;else if(e=a(e),!l[e])throw new TypeError(\"'\"+i(e)+\"' is not valid promise mode\");t.on(\"set\",(function(r,a,i){var c=!1;if(!s(i))return o[r]=i,void t.emit(\"setasync\",r,1);n[r]=1,p[r]=i;var l=function(e){var a=n[r];if(c)throw new Error(\"Memoizee error: Detected unordered then|done & finally resolution, which in turn makes proper detection of success/failure impossible (when in 'done:finally' mode)\\nConsider to rely on 'then' or 'done' mode instead.\");a&&(delete n[r],o[r]=e,t.emit(\"setasync\",r,a))},f=function(){c=!0,n[r]&&(delete n[r],delete p[r],t.delete(r))},h=e;if(h||(h=\"then\"),\"then\"===h){var d=function(){u(f)};\"function\"==typeof(i=i.then((function(e){u(l.bind(this,e))}),d)).finally&&i.finally(d)}else if(\"done\"===h){if(\"function\"!=typeof i.done)throw new Error(\"Memoizee error: Retrieved promise does not implement 'done' in 'done' mode\");i.done(l,f)}else if(\"done:finally\"===h){if(\"function\"!=typeof i.done)throw new Error(\"Memoizee error: Retrieved promise does not implement 'done' in 'done:finally' mode\");if(\"function\"!=typeof i.finally)throw new Error(\"Memoizee error: Retrieved promise does not implement 'finally' in 'done:finally' mode\");i.done(l),i.finally(f)}})),t.on(\"get\",(function(e,r,o){var a;if(n[e])++n[e];else{a=p[e];var i=function(){t.emit(\"getasync\",e,r,o)};s(a)?\"function\"==typeof a.done?a.done(i):a.then((function(){u(i)})):i()}})),t.on(\"delete\",(function(e){if(delete p[e],n[e])delete n[e];else if(hasOwnProperty.call(o,e)){var r=o[e];delete o[e],t.emit(\"deleteasync\",e,[r])}})),t.on(\"clear\",(function(){var e=o;o=c(null),n=c(null),p=c(null),t.emit(\"clearasync\",r(e,(function(e){return[e]})))}))}},function(e,t,n){\"use strict\";var r=Array.prototype.forEach,o=Object.create;e.exports=function(e){var t=o(null);return r.call(arguments,(function(e){t[e]=!0})),t}},function(e,t,n){\"use strict\";var r=n(137),o=n(832);e.exports=function(e){return o(r(e))}},function(e,t,n){\"use strict\";var r=n(444);e.exports=function(e){try{return e&&r(e.toString)?e.toString():String(e)}catch(e){throw new TypeError(\"Passed argument cannot be stringifed\")}}},function(e,t,n){\"use strict\";var r=n(834),o=/[\\n\\r\\u2028\\u2029]/g;e.exports=function(e){var t=r(e);return t.length>100&&(t=t.slice(0,99)+\"…\"),t=t.replace(o,(function(e){return JSON.stringify(e).slice(1,-1)}))}},function(e,t,n){\"use strict\";var r=n(444);e.exports=function(e){try{return e&&r(e.toString)?e.toString():String(e)}catch(e){return\"<Non-coercible to string value>\"}}},function(e,t,n){\"use strict\";var r=n(100),o=n(198),a=n(119),i=Function.prototype.apply;a.dispose=function(e,t,n){var s;if(r(e),n.async&&a.async||n.promise&&a.promise)return t.on(\"deleteasync\",s=function(t,n){i.call(e,null,n)}),void t.on(\"clearasync\",(function(e){o(e,(function(e,t){s(t,e)}))}));t.on(\"delete\",s=function(t,n){e(n)}),t.on(\"clear\",(function(e){o(e,(function(e,t){s(t,e)}))}))}},function(e,t,n){\"use strict\";var r=n(258),o=n(198),a=n(260),i=n(445),s=n(837),u=n(119),c=Function.prototype,l=Math.max,p=Math.min,f=Object.create;u.maxAge=function(e,t,n){var h,d,m,v;(e=s(e))&&(h=f(null),d=n.async&&u.async||n.promise&&u.promise?\"async\":\"\",t.on(\"set\"+d,(function(n){h[n]=setTimeout((function(){t.delete(n)}),e),\"function\"==typeof h[n].unref&&h[n].unref(),v&&(v[n]&&\"nextTick\"!==v[n]&&clearTimeout(v[n]),v[n]=setTimeout((function(){delete v[n]}),m),\"function\"==typeof v[n].unref&&v[n].unref())})),t.on(\"delete\"+d,(function(e){clearTimeout(h[e]),delete h[e],v&&(\"nextTick\"!==v[e]&&clearTimeout(v[e]),delete v[e])})),n.preFetch&&(m=!0===n.preFetch||isNaN(n.preFetch)?.333:l(p(Number(n.preFetch),1),0))&&(v={},m=(1-m)*e,t.on(\"get\"+d,(function(e,o,s){v[e]||(v[e]=\"nextTick\",a((function(){var a;\"nextTick\"===v[e]&&(delete v[e],t.delete(e),n.async&&(o=r(o)).push(c),a=t.memoized.apply(s,o),n.promise&&i(a)&&(\"function\"==typeof a.done?a.done(c,c):a.then(c,c)))})))}))),t.on(\"clear\"+d,(function(){o(h,(function(e){clearTimeout(e)})),h={},v&&(o(v,(function(e){\"nextTick\"!==e&&clearTimeout(e)})),v={})})))}},function(e,t,n){\"use strict\";var r=n(118),o=n(838);e.exports=function(e){if((e=r(e))>o)throw new TypeError(e+\" exceeds maximum possible timeout\");return e}},function(e,t,n){\"use strict\";e.exports=2147483647},function(e,t,n){\"use strict\";var r=n(118),o=n(840),a=n(119);a.max=function(e,t,n){var i,s,u;(e=r(e))&&(s=o(e),i=n.async&&a.async||n.promise&&a.promise?\"async\":\"\",t.on(\"set\"+i,u=function(e){void 0!==(e=s.hit(e))&&t.delete(e)}),t.on(\"get\"+i,u),t.on(\"delete\"+i,s.delete),t.on(\"clear\"+i,s.clear))}},function(e,t,n){\"use strict\";var r=n(118),o=Object.create,a=Object.prototype.hasOwnProperty;e.exports=function(e){var t,n=0,i=1,s=o(null),u=o(null),c=0;return e=r(e),{hit:function(r){var o=u[r],l=++c;if(s[l]=r,u[r]=l,!o){if(++n<=e)return;return r=s[i],t(r),r}if(delete s[o],i===o)for(;!a.call(s,++i);)continue},delete:t=function(e){var t=u[e];if(t&&(delete s[t],delete u[e],--n,i===t)){if(!n)return c=0,void(i=1);for(;!a.call(s,++i);)continue}},clear:function(){n=0,i=1,s=o(null),u=o(null),c=0}}}},function(e,t,n){\"use strict\";var r=n(120),o=n(119),a=Object.create,i=Object.defineProperties;o.refCounter=function(e,t,n){var s,u;s=a(null),u=n.async&&o.async||n.promise&&o.promise?\"async\":\"\",t.on(\"set\"+u,(function(e,t){s[e]=t||1})),t.on(\"get\"+u,(function(e){++s[e]})),t.on(\"delete\"+u,(function(e){delete s[e]})),t.on(\"clear\"+u,(function(){s={}})),i(t.memoized,{deleteRef:r((function(){var e=t.get(arguments);return null===e?null:s[e]?!--s[e]&&(t.delete(e),!0):null})),getRefCount:r((function(){var e=t.get(arguments);return null===e?0:s[e]?s[e]:0}))})}},function(e,t,n){var r=n(61),o=n(138),a=n(62).Buffer,i=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function u(){this.init(),this._w=s,o.call(this,64,56)}function c(e){return e<<30|e>>>2}function l(e,t,n,r){return 0===e?t&n|~t&r:2===e?t&n|t&r|n&r:t^n^r}r(u,o),u.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},u.prototype._update=function(e){for(var t,n=this._w,r=0|this._a,o=0|this._b,a=0|this._c,s=0|this._d,u=0|this._e,p=0;p<16;++p)n[p]=e.readInt32BE(4*p);for(;p<80;++p)n[p]=n[p-3]^n[p-8]^n[p-14]^n[p-16];for(var f=0;f<80;++f){var h=~~(f/20),d=0|((t=r)<<5|t>>>27)+l(h,o,a,s)+u+n[f]+i[h];u=s,s=a,a=c(o),o=r,r=d}this._a=r+this._a|0,this._b=o+this._b|0,this._c=a+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0},u.prototype._hash=function(){var e=a.allocUnsafe(20);return e.writeInt32BE(0|this._a,0),e.writeInt32BE(0|this._b,4),e.writeInt32BE(0|this._c,8),e.writeInt32BE(0|this._d,12),e.writeInt32BE(0|this._e,16),e},e.exports=u},function(e,t,n){var r=n(61),o=n(138),a=n(62).Buffer,i=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function u(){this.init(),this._w=s,o.call(this,64,56)}function c(e){return e<<5|e>>>27}function l(e){return e<<30|e>>>2}function p(e,t,n,r){return 0===e?t&n|~t&r:2===e?t&n|t&r|n&r:t^n^r}r(u,o),u.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},u.prototype._update=function(e){for(var t,n=this._w,r=0|this._a,o=0|this._b,a=0|this._c,s=0|this._d,u=0|this._e,f=0;f<16;++f)n[f]=e.readInt32BE(4*f);for(;f<80;++f)n[f]=(t=n[f-3]^n[f-8]^n[f-14]^n[f-16])<<1|t>>>31;for(var h=0;h<80;++h){var d=~~(h/20),m=c(r)+p(d,o,a,s)+u+n[h]+i[d]|0;u=s,s=a,a=l(o),o=r,r=m}this._a=r+this._a|0,this._b=o+this._b|0,this._c=a+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0},u.prototype._hash=function(){var e=a.allocUnsafe(20);return e.writeInt32BE(0|this._a,0),e.writeInt32BE(0|this._b,4),e.writeInt32BE(0|this._c,8),e.writeInt32BE(0|this._d,12),e.writeInt32BE(0|this._e,16),e},e.exports=u},function(e,t,n){var r=n(61),o=n(446),a=n(138),i=n(62).Buffer,s=new Array(64);function u(){this.init(),this._w=s,a.call(this,64,56)}r(u,o),u.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},u.prototype._hash=function(){var e=i.allocUnsafe(28);return e.writeInt32BE(this._a,0),e.writeInt32BE(this._b,4),e.writeInt32BE(this._c,8),e.writeInt32BE(this._d,12),e.writeInt32BE(this._e,16),e.writeInt32BE(this._f,20),e.writeInt32BE(this._g,24),e},e.exports=u},function(e,t,n){var r=n(61),o=n(447),a=n(138),i=n(62).Buffer,s=new Array(160);function u(){this.init(),this._w=s,a.call(this,128,112)}r(u,o),u.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},u.prototype._hash=function(){var e=i.allocUnsafe(48);function t(t,n,r){e.writeInt32BE(t,r),e.writeInt32BE(n,r+4)}return t(this._ah,this._al,0),t(this._bh,this._bl,8),t(this._ch,this._cl,16),t(this._dh,this._dl,24),t(this._eh,this._el,32),t(this._fh,this._fl,40),e},e.exports=u},function(e,t,n){var r=n(847);e.exports=r},function(e,t,n){var r=n(848),o=Array.prototype;e.exports=function(e){var t=e.every;return e===o||e instanceof Array&&t===o.every?r:t}},function(e,t,n){n(849);var r=n(42);e.exports=r(\"Array\").every},function(e,t,n){\"use strict\";var r=n(21),o=n(86).every;r({target:\"Array\",proto:!0,forced:!n(111)(\"every\")},{every:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t){e.exports=function(e,t,n,r,o){return o(e,(function(e,o,a){n=r?(r=!1,e):t(n,e,o,a)})),n}},function(e,t,n){var r=n(375);e.exports=r},function(e,t,n){var r=n(853);e.exports=r},function(e,t,n){n(364);var r=n(34);e.exports=r.Object.getOwnPropertySymbols},function(e,t,n){e.exports=n(855)},function(e,t,n){var r=n(374);e.exports=r},function(e,t,n){e.exports=n(857)},function(e,t,n){var r=n(858);e.exports=r},function(e,t,n){n(859);var r=n(34).Object,o=e.exports=function(e,t){return r.getOwnPropertyDescriptor(e,t)};r.getOwnPropertyDescriptor.sham&&(o.sham=!0)},function(e,t,n){var r=n(21),o=n(37),a=n(66),i=n(127).f,s=n(48),u=o((function(){i(1)}));r({target:\"Object\",stat:!0,forced:!s||u,sham:!s},{getOwnPropertyDescriptor:function(e,t){return i(a(e),t)}})},function(e,t,n){e.exports=n(861)},function(e,t,n){var r=n(401);e.exports=r},function(e,t,n){e.exports=n(863)},function(e,t,n){var r=n(864);e.exports=r},function(e,t,n){n(865);var r=n(34);e.exports=r.Object.getOwnPropertyDescriptors},function(e,t,n){var r=n(21),o=n(48),a=n(866),i=n(66),s=n(127),u=n(153);r({target:\"Object\",stat:!0,sham:!o},{getOwnPropertyDescriptors:function(e){for(var t,n,r=i(e),o=s.f,c=a(r),l={},p=0;c.length>p;)void 0!==(n=o(r,t=c[p++]))&&u(l,t,n);return l}})},function(e,t,n){var r=n(70),o=n(234),a=n(235),i=n(52);e.exports=r(\"Reflect\",\"ownKeys\")||function(e){var t=o.f(i(e)),n=a.f;return n?t.concat(n(e)):t}},function(e,t,n){e.exports=n(868)},function(e,t,n){var r=n(869);e.exports=r},function(e,t,n){n(870);var r=n(34).Object,o=e.exports=function(e,t){return r.defineProperties(e,t)};r.defineProperties.sham&&(o.sham=!0)},function(e,t,n){var r=n(21),o=n(48);r({target:\"Object\",stat:!0,forced:!o,sham:!o},{defineProperties:n(230)})},function(e,t,n){var r=n(404);e.exports=r},function(e,t,n){var r=n(448),o=n(450);e.exports=function(e,t){if(null==e)return{};var n,a,i={},s=r(e);for(a=0;a<s.length;a++)n=s[a],o(t).call(t,n)>=0||(i[n]=e[n]);return i},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(874)},function(e,t,n){var r=n(451);n(881),n(882),n(883),n(884),e.exports=r},function(e,t,n){\"use strict\";var r,o,a,i,s=n(21),u=n(97),c=n(40),l=n(70),p=n(453),f=n(110),h=n(163),d=n(183),m=n(98),v=n(454),g=n(47),y=n(77),b=n(139),_=n(368),w=n(121),x=n(398),E=n(455),S=n(456).set,C=n(876),A=n(458),k=n(878),O=n(164),j=n(200),T=n(78),I=n(362),P=n(41),N=n(879),M=n(184),R=n(129),D=P(\"species\"),L=\"Promise\",B=T.get,F=T.set,U=T.getterFor(L),q=p&&p.prototype,z=p,V=q,W=c.TypeError,H=c.document,$=c.process,J=O.f,K=J,Y=!!(H&&H.createEvent&&c.dispatchEvent),G=\"function\"==typeof PromiseRejectionEvent,Z=\"unhandledrejection\",X=!1,Q=I(L,(function(){var e=_(z)!==String(z);if(!e&&66===R)return!0;if(u&&!V.finally)return!0;if(R>=51&&/native code/.test(z))return!1;var t=new z((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};return(t.constructor={})[D]=n,!(X=t.then((function(){}))instanceof n)||!e&&N&&!G})),ee=Q||!x((function(e){z.all(e).catch((function(){}))})),te=function(e){var t;return!(!g(e)||\"function\"!=typeof(t=e.then))&&t},ne=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;C((function(){for(var r=e.value,o=1==e.state,a=0;n.length>a;){var i,s,u,c=n[a++],l=o?c.ok:c.fail,p=c.resolve,f=c.reject,h=c.domain;try{l?(o||(2===e.rejection&&ie(e),e.rejection=1),!0===l?i=r:(h&&h.enter(),i=l(r),h&&(h.exit(),u=!0)),i===c.promise?f(W(\"Promise-chain cycle\")):(s=te(i))?s.call(i,p,f):p(i)):f(r)}catch(e){h&&!u&&h.exit(),f(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&oe(e)}))}},re=function(e,t,n){var r,o;Y?((r=H.createEvent(\"Event\")).promise=t,r.reason=n,r.initEvent(e,!1,!0),c.dispatchEvent(r)):r={promise:t,reason:n},!G&&(o=c[\"on\"+e])?o(r):e===Z&&k(\"Unhandled promise rejection\",n)},oe=function(e){S.call(c,(function(){var t,n=e.facade,r=e.value;if(ae(e)&&(t=j((function(){M?$.emit(\"unhandledRejection\",r,n):re(Z,n,r)})),e.rejection=M||ae(e)?2:1,t.error))throw t.value}))},ae=function(e){return 1!==e.rejection&&!e.parent},ie=function(e){S.call(c,(function(){var t=e.facade;M?$.emit(\"rejectionHandled\",t):re(\"rejectionhandled\",t,e.value)}))},se=function(e,t,n){return function(r){e(t,r,n)}},ue=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,ne(e,!0))},ce=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw W(\"Promise can't be resolved itself\");var r=te(t);r?C((function(){var n={done:!1};try{r.call(t,se(ce,n,e),se(ue,n,e))}catch(t){ue(n,t,e)}})):(e.value=t,e.state=1,ne(e,!1))}catch(t){ue({done:!1},t,e)}}};if(Q&&(V=(z=function(e){b(this,z,L),y(e),r.call(this);var t=B(this);try{e(se(ce,t),se(ue,t))}catch(e){ue(t,e)}}).prototype,(r=function(e){F(this,{type:L,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(V,{then:function(e,t){var n=U(this),r=J(E(this,z));return r.ok=\"function\"!=typeof e||e,r.fail=\"function\"==typeof t&&t,r.domain=M?$.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&ne(n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),o=function(){var e=new r,t=B(e);this.promise=e,this.resolve=se(ce,t),this.reject=se(ue,t)},O.f=J=function(e){return e===z||e===a?new o(e):K(e)},!u&&\"function\"==typeof p&&q!==Object.prototype)){i=q.then,X||(f(q,\"then\",(function(e,t){var n=this;return new z((function(e,t){i.call(n,e,t)})).then(e,t)}),{unsafe:!0}),f(q,\"catch\",V.catch,{unsafe:!0}));try{delete q.constructor}catch(e){}d&&d(q,V)}s({global:!0,wrap:!0,forced:Q},{Promise:z}),m(z,L,!1,!0),v(L),a=l(L),s({target:L,stat:!0,forced:Q},{reject:function(e){var t=J(this);return t.reject.call(void 0,e),t.promise}}),s({target:L,stat:!0,forced:u||Q},{resolve:function(e){return A(u&&this===a?z:this,e)}}),s({target:L,stat:!0,forced:ee},{all:function(e){var t=this,n=J(t),r=n.resolve,o=n.reject,a=j((function(){var n=y(t.resolve),a=[],i=0,s=1;w(e,(function(e){var u=i++,c=!1;a.push(void 0),s++,n.call(t,e).then((function(e){c||(c=!0,a[u]=e,--s||r(a))}),o)})),--s||r(a)}));return a.error&&o(a.value),n.promise},race:function(e){var t=this,n=J(t),r=n.reject,o=j((function(){var o=y(t.resolve);w(e,(function(e){o.call(t,e).then(n.resolve,r)}))}));return o.error&&r(o.value),n.promise}})},function(e,t,n){var r,o,a,i,s,u,c,l,p=n(40),f=n(127).f,h=n(456).set,d=n(457),m=n(877),v=n(184),g=p.MutationObserver||p.WebKitMutationObserver,y=p.document,b=p.process,_=p.Promise,w=f(p,\"queueMicrotask\"),x=w&&w.value;x||(r=function(){var e,t;for(v&&(e=b.domain)&&e.exit();o;){t=o.fn,o=o.next;try{t()}catch(e){throw o?i():a=void 0,e}}a=void 0,e&&e.enter()},d||v||m||!g||!y?_&&_.resolve?((c=_.resolve(void 0)).constructor=_,l=c.then,i=function(){l.call(c,r)}):i=v?function(){b.nextTick(r)}:function(){h.call(p,r)}:(s=!0,u=y.createTextNode(\"\"),new g(r).observe(u,{characterData:!0}),i=function(){u.data=s=!s})),e.exports=x||function(e){var t={fn:e,next:void 0};a&&(a.next=t),o||(o=t,i()),a=t}},function(e,t,n){var r=n(108);e.exports=/web0s(?!.*chrome)/i.test(r)},function(e,t,n){var r=n(40);e.exports=function(e,t){var n=r.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},function(e,t){e.exports=\"object\"==typeof window},function(e,t,n){\"use strict\";var r=n(21),o=n(97),a=n(453),i=n(37),s=n(70),u=n(455),c=n(458),l=n(110);if(r({target:\"Promise\",proto:!0,real:!0,forced:!!a&&i((function(){a.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=u(this,s(\"Promise\")),n=\"function\"==typeof e;return this.then(n?function(n){return c(t,e()).then((function(){return n}))}:e,n?function(n){return c(t,e()).then((function(){throw n}))}:e)}}),!o&&\"function\"==typeof a){var p=s(\"Promise\").prototype.finally;a.prototype.finally!==p&&l(a.prototype,\"finally\",p,{unsafe:!0})}},function(e,t,n){n(452)},function(e,t,n){n(459)},function(e,t,n){\"use strict\";var r=n(21),o=n(164),a=n(200);r({target:\"Promise\",stat:!0},{try:function(e){var t=o.f(this),n=a(e);return(n.error?t.reject:t.resolve)(n.value),t.promise}})},function(e,t,n){n(460)},function(e,t,n){var r=function(e){\"use strict\";var t,n=Object.prototype,r=n.hasOwnProperty,o=\"function\"==typeof Symbol?Symbol:{},a=o.iterator||\"@@iterator\",i=o.asyncIterator||\"@@asyncIterator\",s=o.toStringTag||\"@@toStringTag\";function u(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},\"\")}catch(e){u=function(e,t,n){return e[t]=n}}function c(e,t,n,r){var o=t&&t.prototype instanceof v?t:v,a=Object.create(o.prototype),i=new O(r||[]);return a._invoke=function(e,t,n){var r=p;return function(o,a){if(r===h)throw new Error(\"Generator is already running\");if(r===d){if(\"throw\"===o)throw a;return T()}for(n.method=o,n.arg=a;;){var i=n.delegate;if(i){var s=C(i,n);if(s){if(s===m)continue;return s}}if(\"next\"===n.method)n.sent=n._sent=n.arg;else if(\"throw\"===n.method){if(r===p)throw r=d,n.arg;n.dispatchException(n.arg)}else\"return\"===n.method&&n.abrupt(\"return\",n.arg);r=h;var u=l(e,t,n);if(\"normal\"===u.type){if(r=n.done?d:f,u.arg===m)continue;return{value:u.arg,done:n.done}}\"throw\"===u.type&&(r=d,n.method=\"throw\",n.arg=u.arg)}}}(e,n,i),a}function l(e,t,n){try{return{type:\"normal\",arg:e.call(t,n)}}catch(e){return{type:\"throw\",arg:e}}}e.wrap=c;var p=\"suspendedStart\",f=\"suspendedYield\",h=\"executing\",d=\"completed\",m={};function v(){}function g(){}function y(){}var b={};b[a]=function(){return this};var _=Object.getPrototypeOf,w=_&&_(_(j([])));w&&w!==n&&r.call(w,a)&&(b=w);var x=y.prototype=v.prototype=Object.create(b);function E(e){[\"next\",\"throw\",\"return\"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function S(e,t){function n(o,a,i,s){var u=l(e[o],e,a);if(\"throw\"!==u.type){var c=u.arg,p=c.value;return p&&\"object\"==typeof p&&r.call(p,\"__await\")?t.resolve(p.__await).then((function(e){n(\"next\",e,i,s)}),(function(e){n(\"throw\",e,i,s)})):t.resolve(p).then((function(e){c.value=e,i(c)}),(function(e){return n(\"throw\",e,i,s)}))}s(u.arg)}var o;this._invoke=function(e,r){function a(){return new t((function(t,o){n(e,r,t,o)}))}return o=o?o.then(a,a):a()}}function C(e,n){var r=e.iterator[n.method];if(r===t){if(n.delegate=null,\"throw\"===n.method){if(e.iterator.return&&(n.method=\"return\",n.arg=t,C(e,n),\"throw\"===n.method))return m;n.method=\"throw\",n.arg=new TypeError(\"The iterator does not provide a 'throw' method\")}return m}var o=l(r,e.iterator,n.arg);if(\"throw\"===o.type)return n.method=\"throw\",n.arg=o.arg,n.delegate=null,m;var a=o.arg;return a?a.done?(n[e.resultName]=a.value,n.next=e.nextLoc,\"return\"!==n.method&&(n.method=\"next\",n.arg=t),n.delegate=null,m):a:(n.method=\"throw\",n.arg=new TypeError(\"iterator result is not an object\"),n.delegate=null,m)}function A(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 k(e){var t=e.completion||{};t.type=\"normal\",delete t.arg,e.completion=t}function O(e){this.tryEntries=[{tryLoc:\"root\"}],e.forEach(A,this),this.reset(!0)}function j(e){if(e){var n=e[a];if(n)return n.call(e);if(\"function\"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function n(){for(;++o<e.length;)if(r.call(e,o))return n.value=e[o],n.done=!1,n;return n.value=t,n.done=!0,n};return i.next=i}}return{next:T}}function T(){return{value:t,done:!0}}return g.prototype=x.constructor=y,y.constructor=g,g.displayName=u(y,s,\"GeneratorFunction\"),e.isGeneratorFunction=function(e){var t=\"function\"==typeof e&&e.constructor;return!!t&&(t===g||\"GeneratorFunction\"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,y):(e.__proto__=y,u(e,s,\"GeneratorFunction\")),e.prototype=Object.create(x),e},e.awrap=function(e){return{__await:e}},E(S.prototype),S.prototype[i]=function(){return this},e.AsyncIterator=S,e.async=function(t,n,r,o,a){void 0===a&&(a=Promise);var i=new S(c(t,n,r,o),a);return e.isGeneratorFunction(n)?i:i.next().then((function(e){return e.done?e.value:i.next()}))},E(x),u(x,s,\"Generator\"),x[a]=function(){return this},x.toString=function(){return\"[object Generator]\"},e.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var r=t.pop();if(r in e)return n.value=r,n.done=!1,n}return n.done=!0,n}},e.values=j,O.prototype={constructor:O,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=t,this.tryEntries.forEach(k),!e)for(var n in this)\"t\"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=t)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if(\"throw\"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var n=this;function o(r,o){return s.type=\"throw\",s.arg=e,n.next=r,o&&(n.method=\"next\",n.arg=t),!!o}for(var a=this.tryEntries.length-1;a>=0;--a){var i=this.tryEntries[a],s=i.completion;if(\"root\"===i.tryLoc)return o(\"end\");if(i.tryLoc<=this.prev){var u=r.call(i,\"catchLoc\"),c=r.call(i,\"finallyLoc\");if(u&&c){if(this.prev<i.catchLoc)return o(i.catchLoc,!0);if(this.prev<i.finallyLoc)return o(i.finallyLoc)}else if(u){if(this.prev<i.catchLoc)return o(i.catchLoc,!0)}else{if(!c)throw new Error(\"try statement without catch or finally\");if(this.prev<i.finallyLoc)return o(i.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,\"finallyLoc\")&&this.prev<o.finallyLoc){var a=o;break}}a&&(\"break\"===e||\"continue\"===e)&&a.tryLoc<=t&&t<=a.finallyLoc&&(a=null);var i=a?a.completion:{};return i.type=e,i.arg=t,a?(this.method=\"next\",this.next=a.finallyLoc,m):this.complete(i)},complete:function(e,t){if(\"throw\"===e.type)throw e.arg;return\"break\"===e.type||\"continue\"===e.type?this.next=e.arg:\"return\"===e.type?(this.rval=this.arg=e.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===e.type&&t&&(this.next=t),m},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),k(n),m}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if(\"throw\"===r.type){var o=r.arg;k(n)}return o}}throw new Error(\"illegal catch attempt\")},delegateYield:function(e,n,r){return this.delegate={iterator:j(e),resultName:n,nextLoc:r},\"next\"===this.method&&(this.arg=t),m}},e}(e.exports);try{regeneratorRuntime=r}catch(e){Function(\"r\",\"regeneratorRuntime = r\")(r)}},function(e,t,n){var r=n(377);e.exports=r},function(e,t,n){var r=n(451);e.exports=r},function(e,t,n){var r=n(889);e.exports=r},function(e,t,n){n(890);var r=n(34);e.exports=r.Object.values},function(e,t,n){var r=n(21),o=n(461).values;r({target:\"Object\",stat:!0},{values:function(e){return o(e)}})},function(e,t,n){var r=n(892);e.exports=r},function(e,t,n){n(893);var r=n(34);e.exports=r.Date.now},function(e,t,n){n(21)({target:\"Date\",stat:!0},{now:function(){return(new Date).getTime()}})},function(e,t,n){\"use strict\";e.exports=function(e,t){if(t=t.split(\":\")[0],!(e=+e))return!1;switch(t){case\"http\":case\"ws\":return 80!==e;case\"https\":case\"wss\":return 443!==e;case\"ftp\":return 21!==e;case\"gopher\":return 70!==e;case\"file\":return!1}return 0!==e}},function(e,t,n){\"use strict\";var r=Object.prototype.hasOwnProperty;function o(e){try{return decodeURIComponent(e.replace(/\\+/g,\" \"))}catch(e){return null}}function a(e){try{return encodeURIComponent(e)}catch(e){return null}}t.stringify=function(e,t){t=t||\"\";var n,o,i=[];for(o in\"string\"!=typeof t&&(t=\"?\"),e)if(r.call(e,o)){if((n=e[o])||null!=n&&!isNaN(n)||(n=\"\"),o=a(o),n=a(n),null===o||null===n)continue;i.push(o+\"=\"+n)}return i.length?t+i.join(\"&\"):\"\"},t.parse=function(e){for(var t,n=/([^=?#&]+)=?([^&]*)/g,r={};t=n.exec(e);){var a=o(t[1]),i=o(t[2]);null===a||null===i||a in r||(r[a]=i)}return r}},function(e,t,n){var r=n(71);e.exports=function(){return r.Date.now()}},function(e,t,n){e.exports=n(898)},function(e,t,n){var r=n(379);e.exports=r},function(e,t,n){e.exports=n(900)},function(e,t,n){var r=n(901);e.exports=r},function(e,t,n){n(902);var r=n(34).Object;e.exports=function(e,t){return r.create(e,t)}},function(e,t,n){n(21)({target:\"Object\",stat:!0,sham:!n(48)},{create:n(109)})},function(e,t,n){var r=n(465);function o(t,n){return e.exports=o=r||function(e,t){return e.__proto__=t,e},e.exports.default=e.exports,e.exports.__esModule=!0,o(t,n)}e.exports=o,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(905);e.exports=r},function(e,t,n){n(906);var r=n(34);e.exports=r.Object.setPrototypeOf},function(e,t,n){n(21)({target:\"Object\",stat:!0},{setPrototypeOf:n(183)})},function(e,t,n){var r=n(908);e.exports=r},function(e,t,n){n(909);var r=n(34);e.exports=r.Reflect.construct},function(e,t,n){var r=n(21),o=n(70),a=n(77),i=n(52),s=n(47),u=n(109),c=n(378),l=n(37),p=o(\"Reflect\",\"construct\"),f=l((function(){function e(){}return!(p((function(){}),[],e)instanceof e)})),h=!l((function(){p((function(){}))})),d=f||h;r({target:\"Reflect\",stat:!0,forced:d,sham:d},{construct:function(e,t){a(e),i(t);var n=arguments.length<3?e:a(arguments[2]);if(h&&!f)return p(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var r=[null];return r.push.apply(r,t),new(c.apply(e,r))}var o=n.prototype,l=u(s(o)?o:Object.prototype),d=Function.apply.call(e,l,t);return s(d)?d:l}})},function(e,t,n){var r=n(465),o=n(911);function a(t){return e.exports=a=r?o:function(e){return e.__proto__||o(e)},e.exports.default=e.exports,e.exports.__esModule=!0,a(t)}e.exports=a,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(912)},function(e,t,n){var r=n(913);e.exports=r},function(e,t,n){n(914);var r=n(34);e.exports=r.Object.getPrototypeOf},function(e,t,n){var r=n(21),o=n(37),a=n(60),i=n(182),s=n(373);r({target:\"Object\",stat:!0,forced:o((function(){i(1)})),sham:!s},{getPrototypeOf:function(e){return i(a(e))}})},function(e,t,n){var r=n(466);e.exports=function(){if(\"undefined\"==typeof Reflect||!r)return!1;if(r.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(r(Boolean,[],(function(){}))),!0}catch(e){return!1}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(18).default,o=n(10);e.exports=function(e,t){return!t||\"object\"!==r(t)&&\"function\"!=typeof t?o(e):t},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";var r=n(45),o=n(918),a=n(490),i=n(141),s=n(80),u=n(990),c=n(991),l=n(491),p=n(992);n(33);o.inject();var f={findDOMNode:c,render:a.render,unmountComponentAtNode:a.unmountComponentAtNode,version:u,unstable_batchedUpdates:s.batchedUpdates,unstable_renderSubtreeIntoContainer:p};\"undefined\"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&\"function\"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ComponentTree:{getClosestInstanceFromNode:r.getClosestInstanceFromNode,getNodeFromInstance:function(e){return e._renderedComponent&&(e=l(e)),e?r.getNodeFromInstance(e):null}},Mount:a,Reconciler:i}),e.exports=f},function(e,t,n){\"use strict\";var r=n(919),o=n(920),a=n(924),i=n(927),s=n(928),u=n(929),c=n(930),l=n(936),p=n(45),f=n(961),h=n(962),d=n(963),m=n(964),v=n(965),g=n(967),y=n(968),b=n(974),_=n(975),w=n(976),x=!1;e.exports={inject:function(){x||(x=!0,g.EventEmitter.injectReactEventListener(v),g.EventPluginHub.injectEventPluginOrder(i),g.EventPluginUtils.injectComponentTree(p),g.EventPluginUtils.injectTreeTraversal(h),g.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:w,EnterLeaveEventPlugin:s,ChangeEventPlugin:a,SelectEventPlugin:_,BeforeInputEventPlugin:o}),g.HostComponent.injectGenericComponentClass(l),g.HostComponent.injectTextComponentClass(d),g.DOMProperty.injectDOMPropertyConfig(r),g.DOMProperty.injectDOMPropertyConfig(u),g.DOMProperty.injectDOMPropertyConfig(b),g.EmptyComponent.injectEmptyComponentFactory((function(e){return new f(e)})),g.Updates.injectReconcileTransaction(y),g.Updates.injectBatchingStrategy(m),g.Component.injectEnvironment(c))}}},function(e,t,n){\"use strict\";e.exports={Properties:{\"aria-current\":0,\"aria-details\":0,\"aria-disabled\":0,\"aria-hidden\":0,\"aria-invalid\":0,\"aria-keyshortcuts\":0,\"aria-label\":0,\"aria-roledescription\":0,\"aria-autocomplete\":0,\"aria-checked\":0,\"aria-expanded\":0,\"aria-haspopup\":0,\"aria-level\":0,\"aria-modal\":0,\"aria-multiline\":0,\"aria-multiselectable\":0,\"aria-orientation\":0,\"aria-placeholder\":0,\"aria-pressed\":0,\"aria-readonly\":0,\"aria-required\":0,\"aria-selected\":0,\"aria-sort\":0,\"aria-valuemax\":0,\"aria-valuemin\":0,\"aria-valuenow\":0,\"aria-valuetext\":0,\"aria-atomic\":0,\"aria-busy\":0,\"aria-live\":0,\"aria-relevant\":0,\"aria-dropeffect\":0,\"aria-grabbed\":0,\"aria-activedescendant\":0,\"aria-colcount\":0,\"aria-colindex\":0,\"aria-colspan\":0,\"aria-controls\":0,\"aria-describedby\":0,\"aria-errormessage\":0,\"aria-flowto\":0,\"aria-labelledby\":0,\"aria-owns\":0,\"aria-posinset\":0,\"aria-rowcount\":0,\"aria-rowindex\":0,\"aria-rowspan\":0,\"aria-setsize\":0},DOMAttributeNames:{},DOMPropertyNames:{}}},function(e,t,n){\"use strict\";var r=n(165),o=n(56),a=n(921),i=n(922),s=n(923),u=[9,13,27,32],c=o.canUseDOM&&\"CompositionEvent\"in window,l=null;o.canUseDOM&&\"documentMode\"in document&&(l=document.documentMode);var p,f=o.canUseDOM&&\"TextEvent\"in window&&!l&&!(\"object\"==typeof(p=window.opera)&&\"function\"==typeof p.version&&parseInt(p.version(),10)<=12),h=o.canUseDOM&&(!c||l&&l>8&&l<=11);var d=String.fromCharCode(32),m={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"topCompositionEnd\",\"topKeyPress\",\"topTextInput\",\"topPaste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:[\"topBlur\",\"topCompositionEnd\",\"topKeyDown\",\"topKeyPress\",\"topKeyUp\",\"topMouseDown\"]},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",captured:\"onCompositionStartCapture\"},dependencies:[\"topBlur\",\"topCompositionStart\",\"topKeyDown\",\"topKeyPress\",\"topKeyUp\",\"topMouseDown\"]},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:[\"topBlur\",\"topCompositionUpdate\",\"topKeyDown\",\"topKeyPress\",\"topKeyUp\",\"topMouseDown\"]}},v=!1;function g(e,t){switch(e){case\"topKeyUp\":return-1!==u.indexOf(t.keyCode);case\"topKeyDown\":return 229!==t.keyCode;case\"topKeyPress\":case\"topMouseDown\":case\"topBlur\":return!0;default:return!1}}function y(e){var t=e.detail;return\"object\"==typeof t&&\"data\"in t?t.data:null}var b=null;function _(e,t,n,o){var s,u;if(c?s=function(e){switch(e){case\"topCompositionStart\":return m.compositionStart;case\"topCompositionEnd\":return m.compositionEnd;case\"topCompositionUpdate\":return m.compositionUpdate}}(e):b?g(e,n)&&(s=m.compositionEnd):function(e,t){return\"topKeyDown\"===e&&229===t.keyCode}(e,n)&&(s=m.compositionStart),!s)return null;h&&(b||s!==m.compositionStart?s===m.compositionEnd&&b&&(u=b.getData()):b=a.getPooled(o));var l=i.getPooled(s,t,n,o);if(u)l.data=u;else{var p=y(n);null!==p&&(l.data=p)}return r.accumulateTwoPhaseDispatches(l),l}function w(e,t,n,o){var i;if(!(i=f?function(e,t){switch(e){case\"topCompositionEnd\":return y(t);case\"topKeyPress\":return 32!==t.which?null:(v=!0,d);case\"topTextInput\":var n=t.data;return n===d&&v?null:n;default:return null}}(e,n):function(e,t){if(b){if(\"topCompositionEnd\"===e||!c&&g(e,t)){var n=b.getData();return a.release(b),b=null,n}return null}switch(e){case\"topPaste\":return null;case\"topKeyPress\":return t.which&&!function(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.altKey)}(t)?String.fromCharCode(t.which):null;case\"topCompositionEnd\":return h?null:t.data;default:return null}}(e,n)))return null;var u=s.getPooled(m.beforeInput,t,n,o);return u.data=i,r.accumulateTwoPhaseDispatches(u),u}var x={eventTypes:m,extractEvents:function(e,t,n,r){return[_(e,t,n,r),w(e,t,n,r)]}};e.exports=x},function(e,t,n){\"use strict\";var r=n(38),o=n(122),a=n(470);function i(e){this._root=e,this._startText=this.getText(),this._fallbackText=null}r(i.prototype,{destructor:function(){this._root=null,this._startText=null,this._fallbackText=null},getText:function(){return\"value\"in this._root?this._root.value:this._root[a()]},getData:function(){if(this._fallbackText)return this._fallbackText;var e,t,n=this._startText,r=n.length,o=this.getText(),a=o.length;for(e=0;e<r&&n[e]===o[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===o[a-t];t++);var s=t>1?1-t:void 0;return this._fallbackText=o.slice(e,s),this._fallbackText}}),o.addPoolingTo(i),e.exports=i},function(e,t,n){\"use strict\";var r=n(91);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{data:null}),e.exports=o},function(e,t,n){\"use strict\";var r=n(91);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{data:null}),e.exports=o},function(e,t,n){\"use strict\";var r=n(166),o=n(165),a=n(56),i=n(45),s=n(80),u=n(91),c=n(473),l=n(264),p=n(265),f=n(474),h={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:[\"topBlur\",\"topChange\",\"topClick\",\"topFocus\",\"topInput\",\"topKeyDown\",\"topKeyUp\",\"topSelectionChange\"]}};function d(e,t,n){var r=u.getPooled(h.change,e,t,n);return r.type=\"change\",o.accumulateTwoPhaseDispatches(r),r}var m=null,v=null;var g=!1;function y(e){var t=d(v,e,l(e));s.batchedUpdates(b,t)}function b(e){r.enqueueEvents(e),r.processEventQueue(!1)}function _(){m&&(m.detachEvent(\"onchange\",y),m=null,v=null)}function w(e,t){var n=c.updateValueIfChanged(e),r=!0===t.simulated&&I._allowSimulatedPassThrough;if(n||r)return e}function x(e,t){if(\"topChange\"===e)return t}function E(e,t,n){\"topFocus\"===e?(_(),function(e,t){v=t,(m=e).attachEvent(\"onchange\",y)}(t,n)):\"topBlur\"===e&&_()}a.canUseDOM&&(g=p(\"change\")&&(!document.documentMode||document.documentMode>8));var S=!1;function C(){m&&(m.detachEvent(\"onpropertychange\",A),m=null,v=null)}function A(e){\"value\"===e.propertyName&&w(v,e)&&y(e)}function k(e,t,n){\"topFocus\"===e?(C(),function(e,t){v=t,(m=e).attachEvent(\"onpropertychange\",A)}(t,n)):\"topBlur\"===e&&C()}function O(e,t,n){if(\"topSelectionChange\"===e||\"topKeyUp\"===e||\"topKeyDown\"===e)return w(v,n)}function j(e,t,n){if(\"topClick\"===e)return w(t,n)}function T(e,t,n){if(\"topInput\"===e||\"topChange\"===e)return w(t,n)}a.canUseDOM&&(S=p(\"input\")&&(!document.documentMode||document.documentMode>9));var I={eventTypes:h,_allowSimulatedPassThrough:!0,_isInputEventSupported:S,extractEvents:function(e,t,n,r){var o,a,s,u,c=t?i.getNodeFromInstance(t):window;if(\"select\"===(u=(s=c).nodeName&&s.nodeName.toLowerCase())||\"input\"===u&&\"file\"===s.type?g?o=x:a=E:f(c)?S?o=T:(o=O,a=k):function(e){var t=e.nodeName;return t&&\"input\"===t.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)}(c)&&(o=j),o){var l=o(e,t,n);if(l)return d(l,n,r)}a&&a(e,c,t),\"topBlur\"===e&&function(e,t){if(null!=e){var n=e._wrapperState||t._wrapperState;if(n&&n.controlled&&\"number\"===t.type){var r=\"\"+t.value;t.getAttribute(\"value\")!==r&&t.setAttribute(\"value\",r)}}}(t,c)}};e.exports=I},function(e,t,n){\"use strict\";var r=n(926),o={};o.attachRefs=function(e,t){if(null!==t&&\"object\"==typeof t){var n=t.ref;null!=n&&function(e,t,n){\"function\"==typeof e?e(t.getPublicInstance()):r.addComponentAsRefTo(t,e,n)}(n,e,t._owner)}},o.shouldUpdateRefs=function(e,t){var n=null,r=null;null!==e&&\"object\"==typeof e&&(n=e.ref,r=e._owner);var o=null,a=null;return null!==t&&\"object\"==typeof t&&(o=t.ref,a=t._owner),n!==o||\"string\"==typeof o&&a!==r},o.detachRefs=function(e,t){if(null!==t&&\"object\"==typeof t){var n=t.ref;null!=n&&function(e,t,n){\"function\"==typeof e?e(null):r.removeComponentAsRefFrom(t,e,n)}(n,e,t._owner)}},e.exports=o},function(e,t,n){\"use strict\";var r=n(30);n(25);function o(e){return!(!e||\"function\"!=typeof e.attachRef||\"function\"!=typeof e.detachRef)}var a={addComponentAsRefTo:function(e,t,n){o(n)||r(\"119\"),n.attachRef(t,e)},removeComponentAsRefFrom:function(e,t,n){o(n)||r(\"120\");var a=n.getPublicInstance();a&&a.refs[t]===e.getPublicInstance()&&n.detachRef(t)}};e.exports=a},function(e,t,n){\"use strict\";e.exports=[\"ResponderEventPlugin\",\"SimpleEventPlugin\",\"TapEventPlugin\",\"EnterLeaveEventPlugin\",\"ChangeEventPlugin\",\"SelectEventPlugin\",\"BeforeInputEventPlugin\"]},function(e,t,n){\"use strict\";var r=n(165),o=n(45),a=n(203),i={mouseEnter:{registrationName:\"onMouseEnter\",dependencies:[\"topMouseOut\",\"topMouseOver\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"topMouseOut\",\"topMouseOver\"]}},s={eventTypes:i,extractEvents:function(e,t,n,s){if(\"topMouseOver\"===e&&(n.relatedTarget||n.fromElement))return null;if(\"topMouseOut\"!==e&&\"topMouseOver\"!==e)return null;var u,c,l;if(s.window===s)u=s;else{var p=s.ownerDocument;u=p?p.defaultView||p.parentWindow:window}if(\"topMouseOut\"===e){c=t;var f=n.relatedTarget||n.toElement;l=f?o.getClosestInstanceFromNode(f):null}else c=null,l=t;if(c===l)return null;var h=null==c?u:o.getNodeFromInstance(c),d=null==l?u:o.getNodeFromInstance(l),m=a.getPooled(i.mouseLeave,c,n,s);m.type=\"mouseleave\",m.target=h,m.relatedTarget=d;var v=a.getPooled(i.mouseEnter,l,n,s);return v.type=\"mouseenter\",v.target=d,v.relatedTarget=h,r.accumulateEnterLeaveDispatches(m,v,c,l),[m,v]}};e.exports=s},function(e,t,n){\"use strict\";var r=n(140),o=r.injection.MUST_USE_PROPERTY,a=r.injection.HAS_BOOLEAN_VALUE,i=r.injection.HAS_NUMERIC_VALUE,s=r.injection.HAS_POSITIVE_NUMERIC_VALUE,u=r.injection.HAS_OVERLOADED_BOOLEAN_VALUE,c={isCustomAttribute:RegExp.prototype.test.bind(new RegExp(\"^(data|aria)-[\"+r.ATTRIBUTE_NAME_CHAR+\"]*$\")),Properties:{accept:0,acceptCharset:0,accessKey:0,action:0,allowFullScreen:a,allowTransparency:0,alt:0,as:0,async:a,autoComplete:0,autoPlay:a,capture:a,cellPadding:0,cellSpacing:0,charSet:0,challenge:0,checked:o|a,cite:0,classID:0,className:0,cols:s,colSpan:0,content:0,contentEditable:0,contextMenu:0,controls:a,controlsList:0,coords:0,crossOrigin:0,data:0,dateTime:0,default:a,defer:a,dir:0,disabled:a,download:u,draggable:0,encType:0,form:0,formAction:0,formEncType:0,formMethod:0,formNoValidate:a,formTarget:0,frameBorder:0,headers:0,height:0,hidden:a,high:0,href:0,hrefLang:0,htmlFor:0,httpEquiv:0,icon:0,id:0,inputMode:0,integrity:0,is:0,keyParams:0,keyType:0,kind:0,label:0,lang:0,list:0,loop:a,low:0,manifest:0,marginHeight:0,marginWidth:0,max:0,maxLength:0,media:0,mediaGroup:0,method:0,min:0,minLength:0,multiple:o|a,muted:o|a,name:0,nonce:0,noValidate:a,open:a,optimum:0,pattern:0,placeholder:0,playsInline:a,poster:0,preload:0,profile:0,radioGroup:0,readOnly:a,referrerPolicy:0,rel:0,required:a,reversed:a,role:0,rows:s,rowSpan:i,sandbox:0,scope:0,scoped:a,scrolling:0,seamless:a,selected:o|a,shape:0,size:s,sizes:0,span:s,spellCheck:0,src:0,srcDoc:0,srcLang:0,srcSet:0,start:i,step:0,style:0,summary:0,tabIndex:0,target:0,title:0,type:0,useMap:0,value:0,width:0,wmode:0,wrap:0,about:0,datatype:0,inlist:0,prefix:0,property:0,resource:0,typeof:0,vocab:0,autoCapitalize:0,autoCorrect:0,autoSave:0,color:0,itemProp:0,itemScope:a,itemType:0,itemID:0,itemRef:0,results:0,security:0,unselectable:0},DOMAttributeNames:{acceptCharset:\"accept-charset\",className:\"class\",htmlFor:\"for\",httpEquiv:\"http-equiv\"},DOMPropertyNames:{},DOMMutationMethods:{value:function(e,t){if(null==t)return e.removeAttribute(\"value\");(\"number\"!==e.type||!1===e.hasAttribute(\"value\")||e.validity&&!e.validity.badInput&&e.ownerDocument.activeElement!==e)&&e.setAttribute(\"value\",\"\"+t)}}};e.exports=c},function(e,t,n){\"use strict\";var r=n(267),o={processChildrenUpdates:n(935).dangerouslyProcessChildrenUpdates,replaceNodeWithMarkup:r.dangerouslyReplaceNodeWithMarkup};e.exports=o},function(e,t,n){\"use strict\";var r=n(30),o=n(142),a=n(56),i=n(932),s=n(79),u=(n(25),{dangerouslyReplaceNodeWithMarkup:function(e,t){if(a.canUseDOM||r(\"56\"),t||r(\"57\"),\"HTML\"===e.nodeName&&r(\"58\"),\"string\"==typeof t){var n=i(t,s)[0];e.parentNode.replaceChild(n,e)}else o.replaceChildWithTree(e,t)}});e.exports=u},function(e,t,n){\"use strict\";var r=n(56),o=n(933),a=n(934),i=n(25),s=r.canUseDOM?document.createElement(\"div\"):null,u=/^\\s*<(\\w+)/;e.exports=function(e,t){var n=s;s||i(!1);var r=function(e){var t=e.match(u);return t&&t[1].toLowerCase()}(e),c=r&&a(r);if(c){n.innerHTML=c[1]+e+c[2];for(var l=c[0];l--;)n=n.lastChild}else n.innerHTML=e;var p=n.getElementsByTagName(\"script\");p.length&&(t||i(!1),o(p).forEach(t));for(var f=Array.from(n.childNodes);n.lastChild;)n.removeChild(n.lastChild);return f}},function(e,t,n){\"use strict\";var r=n(25);e.exports=function(e){return function(e){return!!e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"length\"in e&&!(\"setInterval\"in e)&&\"number\"!=typeof e.nodeType&&(Array.isArray(e)||\"callee\"in e||\"item\"in e)}(e)?Array.isArray(e)?e.slice():function(e){var t=e.length;if((Array.isArray(e)||\"object\"!=typeof e&&\"function\"!=typeof e)&&r(!1),\"number\"!=typeof t&&r(!1),0===t||t-1 in e||r(!1),\"function\"==typeof e.callee&&r(!1),e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(e){}for(var n=Array(t),o=0;o<t;o++)n[o]=e[o];return n}(e):[e]}},function(e,t,n){\"use strict\";var r=n(56),o=n(25),a=r.canUseDOM?document.createElement(\"div\"):null,i={},s=[1,'<select multiple=\"true\">',\"</select>\"],u=[1,\"<table>\",\"</table>\"],c=[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],l=[1,'<svg xmlns=\"http://www.w3.org/2000/svg\">',\"</svg>\"],p={\"*\":[1,\"?<div>\",\"</div>\"],area:[1,\"<map>\",\"</map>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],param:[1,\"<object>\",\"</object>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],optgroup:s,option:s,caption:u,colgroup:u,tbody:u,tfoot:u,thead:u,td:c,th:c};[\"circle\",\"clipPath\",\"defs\",\"ellipse\",\"g\",\"image\",\"line\",\"linearGradient\",\"mask\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialGradient\",\"rect\",\"stop\",\"text\",\"tspan\"].forEach((function(e){p[e]=l,i[e]=!0})),e.exports=function(e){return a||o(!1),p.hasOwnProperty(e)||(e=\"*\"),i.hasOwnProperty(e)||(a.innerHTML=\"*\"===e?\"<link />\":\"<\"+e+\"></\"+e+\">\",i[e]=!a.firstChild),i[e]?p[e]:null}},function(e,t,n){\"use strict\";var r=n(267),o=n(45),a={dangerouslyProcessChildrenUpdates:function(e,t){var n=o.getNodeFromInstance(e);r.processUpdates(n,t)}};e.exports=a},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(937),i=n(938),s=n(142),u=n(268),c=n(140),l=n(479),p=n(166),f=n(261),h=n(206),d=n(467),m=n(45),v=n(948),g=n(950),y=n(480),b=n(951),_=(n(72),n(952)),w=n(959),x=(n(79),n(205)),E=(n(25),n(265),n(272),n(473)),S=(n(276),n(33),d),C=p.deleteListener,A=m.getNodeFromInstance,k=h.listenTo,O=f.registrationNameModules,j={string:!0,number:!0},T=\"style\",I={children:null,dangerouslySetInnerHTML:null,suppressContentEditableWarning:null};function P(e,t){t&&(W[e._tag]&&(null!=t.children||null!=t.dangerouslySetInnerHTML)&&r(\"137\",e._tag,e._currentElement._owner?\" Check the render method of \"+e._currentElement._owner.getName()+\".\":\"\"),null!=t.dangerouslySetInnerHTML&&(null!=t.children&&r(\"60\"),\"object\"==typeof t.dangerouslySetInnerHTML&&\"__html\"in t.dangerouslySetInnerHTML||r(\"61\")),null!=t.style&&\"object\"!=typeof t.style&&r(\"62\",function(e){if(e){var t=e._currentElement._owner||null;if(t){var n=t.getName();if(n)return\" This DOM node was rendered by `\"+n+\"`.\"}}return\"\"}(e)))}function N(e,t,n,r){if(!(r instanceof w)){0;var o=e._hostContainerInfo,a=o._node&&11===o._node.nodeType?o._node:o._ownerDocument;k(t,a),r.getReactMountReady().enqueue(M,{inst:e,registrationName:t,listener:n})}}function M(){var e=this;p.putListener(e.inst,e.registrationName,e.listener)}function R(){v.postMountWrapper(this)}function D(){b.postMountWrapper(this)}function L(){g.postMountWrapper(this)}var B={topAbort:\"abort\",topCanPlay:\"canplay\",topCanPlayThrough:\"canplaythrough\",topDurationChange:\"durationchange\",topEmptied:\"emptied\",topEncrypted:\"encrypted\",topEnded:\"ended\",topError:\"error\",topLoadedData:\"loadeddata\",topLoadedMetadata:\"loadedmetadata\",topLoadStart:\"loadstart\",topPause:\"pause\",topPlay:\"play\",topPlaying:\"playing\",topProgress:\"progress\",topRateChange:\"ratechange\",topSeeked:\"seeked\",topSeeking:\"seeking\",topStalled:\"stalled\",topSuspend:\"suspend\",topTimeUpdate:\"timeupdate\",topVolumeChange:\"volumechange\",topWaiting:\"waiting\"};function F(){E.track(this)}function U(){var e=this;e._rootNodeID||r(\"63\");var t=A(e);switch(t||r(\"64\"),e._tag){case\"iframe\":case\"object\":e._wrapperState.listeners=[h.trapBubbledEvent(\"topLoad\",\"load\",t)];break;case\"video\":case\"audio\":for(var n in e._wrapperState.listeners=[],B)B.hasOwnProperty(n)&&e._wrapperState.listeners.push(h.trapBubbledEvent(n,B[n],t));break;case\"source\":e._wrapperState.listeners=[h.trapBubbledEvent(\"topError\",\"error\",t)];break;case\"img\":e._wrapperState.listeners=[h.trapBubbledEvent(\"topError\",\"error\",t),h.trapBubbledEvent(\"topLoad\",\"load\",t)];break;case\"form\":e._wrapperState.listeners=[h.trapBubbledEvent(\"topReset\",\"reset\",t),h.trapBubbledEvent(\"topSubmit\",\"submit\",t)];break;case\"input\":case\"select\":case\"textarea\":e._wrapperState.listeners=[h.trapBubbledEvent(\"topInvalid\",\"invalid\",t)]}}function q(){y.postUpdateWrapper(this)}var z={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},V={listing:!0,pre:!0,textarea:!0},W=o({menuitem:!0},z),H=/^[a-zA-Z][a-zA-Z:_\\.\\-\\d]*$/,$={},J={}.hasOwnProperty;function K(e,t){return e.indexOf(\"-\")>=0||null!=t.is}var Y=1;function G(e){var t=e.type;!function(e){J.call($,e)||(H.test(e)||r(\"65\",e),$[e]=!0)}(t),this._currentElement=e,this._tag=t.toLowerCase(),this._namespaceURI=null,this._renderedChildren=null,this._previousStyle=null,this._previousStyleCopy=null,this._hostNode=null,this._hostParent=null,this._rootNodeID=0,this._domID=0,this._hostContainerInfo=null,this._wrapperState=null,this._topLevelWrapper=null,this._flags=0}G.displayName=\"ReactDOMComponent\",G.Mixin={mountComponent:function(e,t,n,r){this._rootNodeID=Y++,this._domID=n._idCounter++,this._hostParent=t,this._hostContainerInfo=n;var o,i,c,p=this._currentElement.props;switch(this._tag){case\"audio\":case\"form\":case\"iframe\":case\"img\":case\"link\":case\"object\":case\"source\":case\"video\":this._wrapperState={listeners:null},e.getReactMountReady().enqueue(U,this);break;case\"input\":v.mountWrapper(this,p,t),p=v.getHostProps(this,p),e.getReactMountReady().enqueue(F,this),e.getReactMountReady().enqueue(U,this);break;case\"option\":g.mountWrapper(this,p,t),p=g.getHostProps(this,p);break;case\"select\":y.mountWrapper(this,p,t),p=y.getHostProps(this,p),e.getReactMountReady().enqueue(U,this);break;case\"textarea\":b.mountWrapper(this,p,t),p=b.getHostProps(this,p),e.getReactMountReady().enqueue(F,this),e.getReactMountReady().enqueue(U,this)}if(P(this,p),null!=t?(o=t._namespaceURI,i=t._tag):n._tag&&(o=n._namespaceURI,i=n._tag),(null==o||o===u.svg&&\"foreignobject\"===i)&&(o=u.html),o===u.html&&(\"svg\"===this._tag?o=u.svg:\"math\"===this._tag&&(o=u.mathml)),this._namespaceURI=o,e.useCreateElement){var f,h=n._ownerDocument;if(o===u.html)if(\"script\"===this._tag){var d=h.createElement(\"div\"),_=this._currentElement.type;d.innerHTML=\"<\"+_+\"></\"+_+\">\",f=d.removeChild(d.firstChild)}else f=p.is?h.createElement(this._currentElement.type,p.is):h.createElement(this._currentElement.type);else f=h.createElementNS(o,this._currentElement.type);m.precacheNode(this,f),this._flags|=S.hasCachedChildNodes,this._hostParent||l.setAttributeForRoot(f),this._updateDOMProperties(null,p,e);var w=s(f);this._createInitialChildren(e,p,r,w),c=w}else{var x=this._createOpenTagMarkupAndPutListeners(e,p),E=this._createContentMarkup(e,p,r);c=!E&&z[this._tag]?x+\"/>\":x+\">\"+E+\"</\"+this._currentElement.type+\">\"}switch(this._tag){case\"input\":e.getReactMountReady().enqueue(R,this),p.autoFocus&&e.getReactMountReady().enqueue(a.focusDOMComponent,this);break;case\"textarea\":e.getReactMountReady().enqueue(D,this),p.autoFocus&&e.getReactMountReady().enqueue(a.focusDOMComponent,this);break;case\"select\":case\"button\":p.autoFocus&&e.getReactMountReady().enqueue(a.focusDOMComponent,this);break;case\"option\":e.getReactMountReady().enqueue(L,this)}return c},_createOpenTagMarkupAndPutListeners:function(e,t){var n=\"<\"+this._currentElement.type;for(var r in t)if(t.hasOwnProperty(r)){var a=t[r];if(null!=a)if(O.hasOwnProperty(r))a&&N(this,r,a,e);else{r===T&&(a&&(a=this._previousStyleCopy=o({},t.style)),a=i.createMarkupForStyles(a,this));var s=null;null!=this._tag&&K(this._tag,t)?I.hasOwnProperty(r)||(s=l.createMarkupForCustomAttribute(r,a)):s=l.createMarkupForProperty(r,a),s&&(n+=\" \"+s)}}return e.renderToStaticMarkup?n:(this._hostParent||(n+=\" \"+l.createMarkupForRoot()),n+=\" \"+l.createMarkupForID(this._domID))},_createContentMarkup:function(e,t,n){var r=\"\",o=t.dangerouslySetInnerHTML;if(null!=o)null!=o.__html&&(r=o.__html);else{var a=j[typeof t.children]?t.children:null,i=null!=a?null:t.children;if(null!=a)r=x(a);else if(null!=i){r=this.mountChildren(i,e,n).join(\"\")}}return V[this._tag]&&\"\\n\"===r.charAt(0)?\"\\n\"+r:r},_createInitialChildren:function(e,t,n,r){var o=t.dangerouslySetInnerHTML;if(null!=o)null!=o.__html&&s.queueHTML(r,o.__html);else{var a=j[typeof t.children]?t.children:null,i=null!=a?null:t.children;if(null!=a)\"\"!==a&&s.queueText(r,a);else if(null!=i)for(var u=this.mountChildren(i,e,n),c=0;c<u.length;c++)s.queueChild(r,u[c])}},receiveComponent:function(e,t,n){var r=this._currentElement;this._currentElement=e,this.updateComponent(t,r,e,n)},updateComponent:function(e,t,n,r){var o=t.props,a=this._currentElement.props;switch(this._tag){case\"input\":o=v.getHostProps(this,o),a=v.getHostProps(this,a);break;case\"option\":o=g.getHostProps(this,o),a=g.getHostProps(this,a);break;case\"select\":o=y.getHostProps(this,o),a=y.getHostProps(this,a);break;case\"textarea\":o=b.getHostProps(this,o),a=b.getHostProps(this,a)}switch(P(this,a),this._updateDOMProperties(o,a,e),this._updateDOMChildren(o,a,e,r),this._tag){case\"input\":v.updateWrapper(this),E.updateValueIfChanged(this);break;case\"textarea\":b.updateWrapper(this);break;case\"select\":e.getReactMountReady().enqueue(q,this)}},_updateDOMProperties:function(e,t,n){var r,a,s;for(r in e)if(!t.hasOwnProperty(r)&&e.hasOwnProperty(r)&&null!=e[r])if(r===T){var u=this._previousStyleCopy;for(a in u)u.hasOwnProperty(a)&&((s=s||{})[a]=\"\");this._previousStyleCopy=null}else O.hasOwnProperty(r)?e[r]&&C(this,r):K(this._tag,e)?I.hasOwnProperty(r)||l.deleteValueForAttribute(A(this),r):(c.properties[r]||c.isCustomAttribute(r))&&l.deleteValueForProperty(A(this),r);for(r in t){var p=t[r],f=r===T?this._previousStyleCopy:null!=e?e[r]:void 0;if(t.hasOwnProperty(r)&&p!==f&&(null!=p||null!=f))if(r===T)if(p?p=this._previousStyleCopy=o({},p):this._previousStyleCopy=null,f){for(a in f)!f.hasOwnProperty(a)||p&&p.hasOwnProperty(a)||((s=s||{})[a]=\"\");for(a in p)p.hasOwnProperty(a)&&f[a]!==p[a]&&((s=s||{})[a]=p[a])}else s=p;else if(O.hasOwnProperty(r))p?N(this,r,p,n):f&&C(this,r);else if(K(this._tag,t))I.hasOwnProperty(r)||l.setValueForAttribute(A(this),r,p);else if(c.properties[r]||c.isCustomAttribute(r)){var h=A(this);null!=p?l.setValueForProperty(h,r,p):l.deleteValueForProperty(h,r)}}s&&i.setValueForStyles(A(this),s,this)},_updateDOMChildren:function(e,t,n,r){var o=j[typeof e.children]?e.children:null,a=j[typeof t.children]?t.children:null,i=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,s=t.dangerouslySetInnerHTML&&t.dangerouslySetInnerHTML.__html,u=null!=o?null:e.children,c=null!=a?null:t.children,l=null!=o||null!=i,p=null!=a||null!=s;null!=u&&null==c?this.updateChildren(null,n,r):l&&!p&&this.updateTextContent(\"\"),null!=a?o!==a&&this.updateTextContent(\"\"+a):null!=s?i!==s&&this.updateMarkup(\"\"+s):null!=c&&this.updateChildren(c,n,r)},getHostNode:function(){return A(this)},unmountComponent:function(e){switch(this._tag){case\"audio\":case\"form\":case\"iframe\":case\"img\":case\"link\":case\"object\":case\"source\":case\"video\":var t=this._wrapperState.listeners;if(t)for(var n=0;n<t.length;n++)t[n].remove();break;case\"input\":case\"textarea\":E.stopTracking(this);break;case\"html\":case\"head\":case\"body\":r(\"66\",this._tag)}this.unmountChildren(e),m.uncacheNode(this),p.deleteAllListeners(this),this._rootNodeID=0,this._domID=0,this._wrapperState=null},getPublicInstance:function(){return A(this)}},o(G.prototype,G.Mixin,_.Mixin),e.exports=G},function(e,t,n){\"use strict\";var r=n(45),o=n(477),a={focusDOMComponent:function(){o(r.getNodeFromInstance(this))}};e.exports=a},function(e,t,n){\"use strict\";var r=n(478),o=n(56),a=(n(72),n(939),n(941)),i=n(942),s=n(944),u=(n(33),s((function(e){return i(e)}))),c=!1,l=\"cssFloat\";if(o.canUseDOM){var p=document.createElement(\"div\").style;try{p.font=\"\"}catch(e){c=!0}void 0===document.documentElement.style.cssFloat&&(l=\"styleFloat\")}var f={createMarkupForStyles:function(e,t){var n=\"\";for(var r in e)if(e.hasOwnProperty(r)){var o=0===r.indexOf(\"--\"),i=e[r];0,null!=i&&(n+=u(r)+\":\",n+=a(r,i,t,o)+\";\")}return n||null},setValueForStyles:function(e,t,n){var o=e.style;for(var i in t)if(t.hasOwnProperty(i)){var s=0===i.indexOf(\"--\");0;var u=a(i,t[i],n,s);if(\"float\"!==i&&\"cssFloat\"!==i||(i=l),s)o.setProperty(i,u);else if(u)o[i]=u;else{var p=c&&r.shorthandPropertyExpansions[i];if(p)for(var f in p)o[f]=\"\";else o[i]=\"\"}}}};e.exports=f},function(e,t,n){\"use strict\";var r=n(940),o=/^-ms-/;e.exports=function(e){return r(e.replace(o,\"ms-\"))}},function(e,t,n){\"use strict\";var r=/-(.)/g;e.exports=function(e){return e.replace(r,(function(e,t){return t.toUpperCase()}))}},function(e,t,n){\"use strict\";var r=n(478),o=(n(33),r.isUnitlessNumber);e.exports=function(e,t,n,r){if(null==t||\"boolean\"==typeof t||\"\"===t)return\"\";var a=isNaN(t);return r||a||0===t||o.hasOwnProperty(e)&&o[e]?\"\"+t:(\"string\"==typeof t&&(t=t.trim()),t+\"px\")}},function(e,t,n){\"use strict\";var r=n(943),o=/^ms-/;e.exports=function(e){return r(e).replace(o,\"-ms-\")}},function(e,t,n){\"use strict\";var r=/([A-Z])/g;e.exports=function(e){return e.replace(r,\"-$1\").toLowerCase()}},function(e,t,n){\"use strict\";e.exports=function(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n]}}},function(e,t,n){\"use strict\";var r=n(205);e.exports=function(e){return'\"'+r(e)+'\"'}},function(e,t,n){\"use strict\";var r=n(166);var o={handleTopLevel:function(e,t,n,o){!function(e){r.enqueueEvents(e),r.processEventQueue(!1)}(r.extractEvents(e,t,n,o))}};e.exports=o},function(e,t,n){\"use strict\";var r=n(56);function o(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n[\"Webkit\"+e]=\"webkit\"+t,n[\"Moz\"+e]=\"moz\"+t,n[\"ms\"+e]=\"MS\"+t,n[\"O\"+e]=\"o\"+t.toLowerCase(),n}var a={animationend:o(\"Animation\",\"AnimationEnd\"),animationiteration:o(\"Animation\",\"AnimationIteration\"),animationstart:o(\"Animation\",\"AnimationStart\"),transitionend:o(\"Transition\",\"TransitionEnd\")},i={},s={};r.canUseDOM&&(s=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete a.animationend.animation,delete a.animationiteration.animation,delete a.animationstart.animation),\"TransitionEvent\"in window||delete a.transitionend.transition),e.exports=function(e){if(i[e])return i[e];if(!a[e])return e;var t=a[e];for(var n in t)if(t.hasOwnProperty(n)&&n in s)return i[e]=t[n];return\"\"}},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(479),i=n(270),s=n(45),u=n(80);n(25),n(33);function c(){this._rootNodeID&&p.updateWrapper(this)}function l(e){return\"checkbox\"===e.type||\"radio\"===e.type?null!=e.checked:null!=e.value}var p={getHostProps:function(e,t){var n=i.getValue(t),r=i.getChecked(t);return o({type:void 0,step:void 0,min:void 0,max:void 0},t,{defaultChecked:void 0,defaultValue:void 0,value:null!=n?n:e._wrapperState.initialValue,checked:null!=r?r:e._wrapperState.initialChecked,onChange:e._wrapperState.onChange})},mountWrapper:function(e,t){var n=t.defaultValue;e._wrapperState={initialChecked:null!=t.checked?t.checked:t.defaultChecked,initialValue:null!=t.value?t.value:n,listeners:null,onChange:f.bind(e),controlled:l(t)}},updateWrapper:function(e){var t=e._currentElement.props,n=t.checked;null!=n&&a.setValueForProperty(s.getNodeFromInstance(e),\"checked\",n||!1);var r=s.getNodeFromInstance(e),o=i.getValue(t);if(null!=o)if(0===o&&\"\"===r.value)r.value=\"0\";else if(\"number\"===t.type){var u=parseFloat(r.value,10)||0;(o!=u||o==u&&r.value!=o)&&(r.value=\"\"+o)}else r.value!==\"\"+o&&(r.value=\"\"+o);else null==t.value&&null!=t.defaultValue&&r.defaultValue!==\"\"+t.defaultValue&&(r.defaultValue=\"\"+t.defaultValue),null==t.checked&&null!=t.defaultChecked&&(r.defaultChecked=!!t.defaultChecked)},postMountWrapper:function(e){var t=e._currentElement.props,n=s.getNodeFromInstance(e);switch(t.type){case\"submit\":case\"reset\":break;case\"color\":case\"date\":case\"datetime\":case\"datetime-local\":case\"month\":case\"time\":case\"week\":n.value=\"\",n.value=n.defaultValue;break;default:n.value=n.value}var r=n.name;\"\"!==r&&(n.name=\"\"),n.defaultChecked=!n.defaultChecked,n.defaultChecked=!n.defaultChecked,\"\"!==r&&(n.name=r)}};function f(e){var t=this._currentElement.props,n=i.executeOnChange(t,e);u.asap(c,this);var o=t.name;if(\"radio\"===t.type&&null!=o){for(var a=s.getNodeFromInstance(this),l=a;l.parentNode;)l=l.parentNode;for(var p=l.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+o)+'][type=\"radio\"]'),f=0;f<p.length;f++){var h=p[f];if(h!==a&&h.form===a.form){var d=s.getInstanceFromNode(h);d||r(\"90\"),u.asap(c,d)}}}return n}e.exports=p},function(e,t,n){\"use strict\";e.exports=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\"},function(e,t,n){\"use strict\";var r=n(38),o=n(132),a=n(45),i=n(480),s=(n(33),!1);function u(e){var t=\"\";return o.Children.forEach(e,(function(e){null!=e&&(\"string\"==typeof e||\"number\"==typeof e?t+=e:s||(s=!0))})),t}var c={mountWrapper:function(e,t,n){var r=null;if(null!=n){var o=n;\"optgroup\"===o._tag&&(o=o._hostParent),null!=o&&\"select\"===o._tag&&(r=i.getSelectValueContext(o))}var a,s=null;if(null!=r)if(a=null!=t.value?t.value+\"\":u(t.children),s=!1,Array.isArray(r)){for(var c=0;c<r.length;c++)if(\"\"+r[c]===a){s=!0;break}}else s=\"\"+r===a;e._wrapperState={selected:s}},postMountWrapper:function(e){var t=e._currentElement.props;null!=t.value&&a.getNodeFromInstance(e).setAttribute(\"value\",t.value)},getHostProps:function(e,t){var n=r({selected:void 0,children:void 0},t);null!=e._wrapperState.selected&&(n.selected=e._wrapperState.selected);var o=u(t.children);return o&&(n.children=o),n}};e.exports=c},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(270),i=n(45),s=n(80);n(25),n(33);function u(){this._rootNodeID&&c.updateWrapper(this)}var c={getHostProps:function(e,t){return null!=t.dangerouslySetInnerHTML&&r(\"91\"),o({},t,{value:void 0,defaultValue:void 0,children:\"\"+e._wrapperState.initialValue,onChange:e._wrapperState.onChange})},mountWrapper:function(e,t){var n=a.getValue(t),o=n;if(null==n){var i=t.defaultValue,s=t.children;null!=s&&(null!=i&&r(\"92\"),Array.isArray(s)&&(s.length<=1||r(\"93\"),s=s[0]),i=\"\"+s),null==i&&(i=\"\"),o=i}e._wrapperState={initialValue:\"\"+o,listeners:null,onChange:l.bind(e)}},updateWrapper:function(e){var t=e._currentElement.props,n=i.getNodeFromInstance(e),r=a.getValue(t);if(null!=r){var o=\"\"+r;o!==n.value&&(n.value=o),null==t.defaultValue&&(n.defaultValue=o)}null!=t.defaultValue&&(n.defaultValue=t.defaultValue)},postMountWrapper:function(e){var t=i.getNodeFromInstance(e),n=t.textContent;n===e._wrapperState.initialValue&&(t.value=n)}};function l(e){var t=this._currentElement.props,n=a.executeOnChange(t,e);return s.asap(u,this),n}e.exports=c},function(e,t,n){\"use strict\";var r=n(30),o=n(271),a=(n(168),n(72),n(88),n(141)),i=n(953),s=(n(79),n(958));n(25);function u(e,t){return t&&(e=e||[]).push(t),e}function c(e,t){o.processChildrenUpdates(e,t)}var l={Mixin:{_reconcilerInstantiateChildren:function(e,t,n){return i.instantiateChildren(e,t,n)},_reconcilerUpdateChildren:function(e,t,n,r,o,a){var u;return u=s(t,0),i.updateChildren(e,u,n,r,o,this,this._hostContainerInfo,a,0),u},mountChildren:function(e,t,n){var r=this._reconcilerInstantiateChildren(e,t,n);this._renderedChildren=r;var o=[],i=0;for(var s in r)if(r.hasOwnProperty(s)){var u=r[s];0;var c=a.mountComponent(u,t,this,this._hostContainerInfo,n,0);u._mountIndex=i++,o.push(c)}return o},updateTextContent:function(e){var t,n=this._renderedChildren;for(var o in i.unmountChildren(n,!1),n)n.hasOwnProperty(o)&&r(\"118\");c(this,[(t=e,{type:\"TEXT_CONTENT\",content:t,fromIndex:null,fromNode:null,toIndex:null,afterNode:null})])},updateMarkup:function(e){var t,n=this._renderedChildren;for(var o in i.unmountChildren(n,!1),n)n.hasOwnProperty(o)&&r(\"118\");c(this,[(t=e,{type:\"SET_MARKUP\",content:t,fromIndex:null,fromNode:null,toIndex:null,afterNode:null})])},updateChildren:function(e,t,n){this._updateChildren(e,t,n)},_updateChildren:function(e,t,n){var r=this._renderedChildren,o={},i=[],s=this._reconcilerUpdateChildren(r,e,i,o,t,n);if(s||r){var l,p=null,f=0,h=0,d=0,m=null;for(l in s)if(s.hasOwnProperty(l)){var v=r&&r[l],g=s[l];v===g?(p=u(p,this.moveChild(v,m,f,h)),h=Math.max(v._mountIndex,h),v._mountIndex=f):(v&&(h=Math.max(v._mountIndex,h)),p=u(p,this._mountChildAtIndex(g,i[d],m,f,t,n)),d++),f++,m=a.getHostNode(g)}for(l in o)o.hasOwnProperty(l)&&(p=u(p,this._unmountChild(r[l],o[l])));p&&c(this,p),this._renderedChildren=s}},unmountChildren:function(e){var t=this._renderedChildren;i.unmountChildren(t,e),this._renderedChildren=null},moveChild:function(e,t,n,r){if(e._mountIndex<r)return function(e,t,n){return{type:\"MOVE_EXISTING\",content:null,fromIndex:e._mountIndex,fromNode:a.getHostNode(e),toIndex:n,afterNode:t}}(e,t,n)},createChild:function(e,t,n){return function(e,t,n){return{type:\"INSERT_MARKUP\",content:e,fromIndex:null,fromNode:null,toIndex:n,afterNode:t}}(n,t,e._mountIndex)},removeChild:function(e,t){return function(e,t){return{type:\"REMOVE_NODE\",content:null,fromIndex:e._mountIndex,fromNode:t,toIndex:null,afterNode:null}}(e,t)},_mountChildAtIndex:function(e,t,n,r,o,a){return e._mountIndex=r,this.createChild(e,n,t)},_unmountChild:function(e,t){var n=this.removeChild(e,t);return e._mountIndex=null,n}}};e.exports=l},function(e,t,n){\"use strict\";(function(t){var r=n(141),o=n(481),a=(n(274),n(273)),i=n(485);n(33);function s(e,t,n,r){var a=void 0===e[n];null!=t&&a&&(e[n]=o(t,!0))}void 0!==t&&t.env;var u={instantiateChildren:function(e,t,n,r){if(null==e)return null;var o={};return i(e,s,o),o},updateChildren:function(e,t,n,i,s,u,c,l,p){if(t||e){var f,h;for(f in t)if(t.hasOwnProperty(f)){var d=(h=e&&e[f])&&h._currentElement,m=t[f];if(null!=h&&a(d,m))r.receiveComponent(h,m,s,l),t[f]=h;else{h&&(i[f]=r.getHostNode(h),r.unmountComponent(h,!1));var v=o(m,!0);t[f]=v;var g=r.mountComponent(v,s,u,c,l,p);n.push(g)}}for(f in e)!e.hasOwnProperty(f)||t&&t.hasOwnProperty(f)||(h=e[f],i[f]=r.getHostNode(h),r.unmountComponent(h,!1))}},unmountChildren:function(e,t){for(var n in e)if(e.hasOwnProperty(n)){var o=e[n];r.unmountComponent(o,t)}}};e.exports=u}).call(this,n(90))},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(132),i=n(271),s=n(88),u=n(263),c=n(168),l=(n(72),n(482)),p=n(141),f=n(241),h=(n(25),n(272)),d=n(273),m=(n(33),0),v=1,g=2;function y(e){}function b(e,t){0}y.prototype.render=function(){var e=c.get(this)._currentElement.type,t=e(this.props,this.context,this.updater);return b(e,t),t};var _=1,w={construct:function(e){this._currentElement=e,this._rootNodeID=0,this._compositeType=null,this._instance=null,this._hostParent=null,this._hostContainerInfo=null,this._updateBatchNumber=null,this._pendingElement=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._renderedNodeType=null,this._renderedComponent=null,this._context=null,this._mountOrder=0,this._topLevelWrapper=null,this._pendingCallbacks=null,this._calledComponentWillUnmount=!1},mountComponent:function(e,t,n,o){this._context=o,this._mountOrder=_++,this._hostParent=t,this._hostContainerInfo=n;var i,s=this._currentElement.props,u=this._processContext(o),l=this._currentElement.type,p=e.getUpdateQueue(),h=function(e){return!(!e.prototype||!e.prototype.isReactComponent)}(l),d=this._constructComponent(h,s,u,p);h||null!=d&&null!=d.render?!function(e){return!(!e.prototype||!e.prototype.isPureReactComponent)}(l)?this._compositeType=m:this._compositeType=v:(i=d,b(),null===d||!1===d||a.isValidElement(d)||r(\"105\",l.displayName||l.name||\"Component\"),d=new y(l),this._compositeType=g),d.props=s,d.context=u,d.refs=f,d.updater=p,this._instance=d,c.set(d,this);var w,x=d.state;return void 0===x&&(d.state=x=null),(\"object\"!=typeof x||Array.isArray(x))&&r(\"106\",this.getName()||\"ReactCompositeComponent\"),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,w=d.unstable_handleError?this.performInitialMountWithErrorHandling(i,t,n,e,o):this.performInitialMount(i,t,n,e,o),d.componentDidMount&&e.getReactMountReady().enqueue(d.componentDidMount,d),w},_constructComponent:function(e,t,n,r){return this._constructComponentWithoutOwner(e,t,n,r)},_constructComponentWithoutOwner:function(e,t,n,r){var o=this._currentElement.type;return e?new o(t,n,r):o(t,n,r)},performInitialMountWithErrorHandling:function(e,t,n,r,o){var a,i=r.checkpoint();try{a=this.performInitialMount(e,t,n,r,o)}catch(s){r.rollback(i),this._instance.unstable_handleError(s),this._pendingStateQueue&&(this._instance.state=this._processPendingState(this._instance.props,this._instance.context)),i=r.checkpoint(),this._renderedComponent.unmountComponent(!0),r.rollback(i),a=this.performInitialMount(e,t,n,r,o)}return a},performInitialMount:function(e,t,n,r,o){var a=this._instance;a.componentWillMount&&(a.componentWillMount(),this._pendingStateQueue&&(a.state=this._processPendingState(a.props,a.context))),void 0===e&&(e=this._renderValidatedComponent());var i=l.getType(e);this._renderedNodeType=i;var s=this._instantiateReactComponent(e,i!==l.EMPTY);return this._renderedComponent=s,p.mountComponent(s,r,t,n,this._processChildContext(o),0)},getHostNode:function(){return p.getHostNode(this._renderedComponent)},unmountComponent:function(e){if(this._renderedComponent){var t=this._instance;if(t.componentWillUnmount&&!t._calledComponentWillUnmount)if(t._calledComponentWillUnmount=!0,e){var n=this.getName()+\".componentWillUnmount()\";u.invokeGuardedCallback(n,t.componentWillUnmount.bind(t))}else t.componentWillUnmount();this._renderedComponent&&(p.unmountComponent(this._renderedComponent,e),this._renderedNodeType=null,this._renderedComponent=null,this._instance=null),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._pendingCallbacks=null,this._pendingElement=null,this._context=null,this._rootNodeID=0,this._topLevelWrapper=null,c.remove(t)}},_maskContext:function(e){var t=this._currentElement.type.contextTypes;if(!t)return f;var n={};for(var r in t)n[r]=e[r];return n},_processContext:function(e){return this._maskContext(e)},_processChildContext:function(e){var t,n=this._currentElement.type,a=this._instance;if(a.getChildContext&&(t=a.getChildContext()),t){for(var i in\"object\"!=typeof n.childContextTypes&&r(\"107\",this.getName()||\"ReactCompositeComponent\"),t)i in n.childContextTypes||r(\"108\",this.getName()||\"ReactCompositeComponent\",i);return o({},e,t)}return e},_checkContextTypes:function(e,t,n){0},receiveComponent:function(e,t,n){var r=this._currentElement,o=this._context;this._pendingElement=null,this.updateComponent(t,r,e,o,n)},performUpdateIfNecessary:function(e){null!=this._pendingElement?p.receiveComponent(this,this._pendingElement,e,this._context):null!==this._pendingStateQueue||this._pendingForceUpdate?this.updateComponent(e,this._currentElement,this._currentElement,this._context,this._context):this._updateBatchNumber=null},updateComponent:function(e,t,n,o,a){var i=this._instance;null==i&&r(\"136\",this.getName()||\"ReactCompositeComponent\");var s,u=!1;this._context===a?s=i.context:(s=this._processContext(a),u=!0);var c=t.props,l=n.props;t!==n&&(u=!0),u&&i.componentWillReceiveProps&&i.componentWillReceiveProps(l,s);var p=this._processPendingState(l,s),f=!0;this._pendingForceUpdate||(i.shouldComponentUpdate?f=i.shouldComponentUpdate(l,p,s):this._compositeType===v&&(f=!h(c,l)||!h(i.state,p))),this._updateBatchNumber=null,f?(this._pendingForceUpdate=!1,this._performComponentUpdate(n,l,p,s,e,a)):(this._currentElement=n,this._context=a,i.props=l,i.state=p,i.context=s)},_processPendingState:function(e,t){var n=this._instance,r=this._pendingStateQueue,a=this._pendingReplaceState;if(this._pendingReplaceState=!1,this._pendingStateQueue=null,!r)return n.state;if(a&&1===r.length)return r[0];for(var i=o({},a?r[0]:n.state),s=a?1:0;s<r.length;s++){var u=r[s];o(i,\"function\"==typeof u?u.call(n,i,e,t):u)}return i},_performComponentUpdate:function(e,t,n,r,o,a){var i,s,u,c=this._instance,l=Boolean(c.componentDidUpdate);l&&(i=c.props,s=c.state,u=c.context),c.componentWillUpdate&&c.componentWillUpdate(t,n,r),this._currentElement=e,this._context=a,c.props=t,c.state=n,c.context=r,this._updateRenderedComponent(o,a),l&&o.getReactMountReady().enqueue(c.componentDidUpdate.bind(c,i,s,u),c)},_updateRenderedComponent:function(e,t){var n=this._renderedComponent,r=n._currentElement,o=this._renderValidatedComponent();if(d(r,o))p.receiveComponent(n,o,e,this._processChildContext(t));else{var a=p.getHostNode(n);p.unmountComponent(n,!1);var i=l.getType(o);this._renderedNodeType=i;var s=this._instantiateReactComponent(o,i!==l.EMPTY);this._renderedComponent=s;var u=p.mountComponent(s,e,this._hostParent,this._hostContainerInfo,this._processChildContext(t),0);this._replaceNodeWithMarkup(a,u,n)}},_replaceNodeWithMarkup:function(e,t,n){i.replaceNodeWithMarkup(e,t,n)},_renderValidatedComponentWithoutOwnerOrContext:function(){return this._instance.render()},_renderValidatedComponent:function(){var e;if(this._compositeType!==g){s.current=this;try{e=this._renderValidatedComponentWithoutOwnerOrContext()}finally{s.current=null}}else e=this._renderValidatedComponentWithoutOwnerOrContext();return null===e||!1===e||a.isValidElement(e)||r(\"109\",this.getName()||\"ReactCompositeComponent\"),e},attachRef:function(e,t){var n=this.getPublicInstance();null==n&&r(\"110\");var o=t.getPublicInstance();(n.refs===f?n.refs={}:n.refs)[e]=o},detachRef:function(e){delete this.getPublicInstance().refs[e]},getName:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null},getPublicInstance:function(){var e=this._instance;return this._compositeType===g?null:e},_instantiateReactComponent:null};e.exports=w},function(e,t,n){\"use strict\";var r=1;e.exports=function(){return r++}},function(e,t,n){\"use strict\";var r=\"function\"==typeof Symbol&&Symbol.for&&Symbol.for(\"react.element\")||60103;e.exports=r},function(e,t,n){\"use strict\";var r=\"function\"==typeof Symbol&&Symbol.iterator;e.exports=function(e){var t=e&&(r&&e[r]||e[\"@@iterator\"]);if(\"function\"==typeof t)return t}},function(e,t,n){\"use strict\";(function(t){n(274);var r=n(485);n(33);function o(e,t,n,r){if(e&&\"object\"==typeof e){var o=e;0,void 0===o[n]&&null!=t&&(o[n]=t)}}void 0!==t&&t.env,e.exports=function(e,t){if(null==e)return e;var n={};return r(e,o,n),n}}).call(this,n(90))},function(e,t,n){\"use strict\";var r=n(38),o=n(122),a=n(202),i=(n(72),n(960)),s=[];var u={enqueue:function(){}};function c(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.useCreateElement=!1,this.updateQueue=new i(this)}var l={getTransactionWrappers:function(){return s},getReactMountReady:function(){return u},getUpdateQueue:function(){return this.updateQueue},destructor:function(){},checkpoint:function(){},rollback:function(){}};r(c.prototype,a,l),o.addPoolingTo(c),e.exports=c},function(e,t,n){\"use strict\";var r=n(275);n(33);var o=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.transaction=t}return e.prototype.isMounted=function(e){return!1},e.prototype.enqueueCallback=function(e,t,n){this.transaction.isInTransaction()&&r.enqueueCallback(e,t,n)},e.prototype.enqueueForceUpdate=function(e){this.transaction.isInTransaction()&&r.enqueueForceUpdate(e)},e.prototype.enqueueReplaceState=function(e,t){this.transaction.isInTransaction()&&r.enqueueReplaceState(e,t)},e.prototype.enqueueSetState=function(e,t){this.transaction.isInTransaction()&&r.enqueueSetState(e,t)},e}();e.exports=o},function(e,t,n){\"use strict\";var r=n(38),o=n(142),a=n(45),i=function(e){this._currentElement=null,this._hostNode=null,this._hostParent=null,this._hostContainerInfo=null,this._domID=0};r(i.prototype,{mountComponent:function(e,t,n,r){var i=n._idCounter++;this._domID=i,this._hostParent=t,this._hostContainerInfo=n;var s=\" react-empty: \"+this._domID+\" \";if(e.useCreateElement){var u=n._ownerDocument.createComment(s);return a.precacheNode(this,u),o(u)}return e.renderToStaticMarkup?\"\":\"\\x3c!--\"+s+\"--\\x3e\"},receiveComponent:function(){},getHostNode:function(){return a.getNodeFromInstance(this)},unmountComponent:function(){a.uncacheNode(this)}}),e.exports=i},function(e,t,n){\"use strict\";var r=n(30);n(25);function o(e,t){\"_hostNode\"in e||r(\"33\"),\"_hostNode\"in t||r(\"33\");for(var n=0,o=e;o;o=o._hostParent)n++;for(var a=0,i=t;i;i=i._hostParent)a++;for(;n-a>0;)e=e._hostParent,n--;for(;a-n>0;)t=t._hostParent,a--;for(var s=n;s--;){if(e===t)return e;e=e._hostParent,t=t._hostParent}return null}e.exports={isAncestor:function(e,t){\"_hostNode\"in e||r(\"35\"),\"_hostNode\"in t||r(\"35\");for(;t;){if(t===e)return!0;t=t._hostParent}return!1},getLowestCommonAncestor:o,getParentInstance:function(e){return\"_hostNode\"in e||r(\"36\"),e._hostParent},traverseTwoPhase:function(e,t,n){for(var r,o=[];e;)o.push(e),e=e._hostParent;for(r=o.length;r-- >0;)t(o[r],\"captured\",n);for(r=0;r<o.length;r++)t(o[r],\"bubbled\",n)},traverseEnterLeave:function(e,t,n,r,a){for(var i=e&&t?o(e,t):null,s=[];e&&e!==i;)s.push(e),e=e._hostParent;for(var u,c=[];t&&t!==i;)c.push(t),t=t._hostParent;for(u=0;u<s.length;u++)n(s[u],\"bubbled\",r);for(u=c.length;u-- >0;)n(c[u],\"captured\",a)}}},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(267),i=n(142),s=n(45),u=n(205),c=(n(25),n(276),function(e){this._currentElement=e,this._stringText=\"\"+e,this._hostNode=null,this._hostParent=null,this._domID=0,this._mountIndex=0,this._closingComment=null,this._commentNodes=null});o(c.prototype,{mountComponent:function(e,t,n,r){var o=n._idCounter++,a=\" react-text: \"+o+\" \",c=\" /react-text \";if(this._domID=o,this._hostParent=t,e.useCreateElement){var l=n._ownerDocument,p=l.createComment(a),f=l.createComment(c),h=i(l.createDocumentFragment());return i.queueChild(h,i(p)),this._stringText&&i.queueChild(h,i(l.createTextNode(this._stringText))),i.queueChild(h,i(f)),s.precacheNode(this,p),this._closingComment=f,h}var d=u(this._stringText);return e.renderToStaticMarkup?d:\"\\x3c!--\"+a+\"--\\x3e\"+d+\"\\x3c!--\"+\" /react-text --\\x3e\"},receiveComponent:function(e,t){if(e!==this._currentElement){this._currentElement=e;var n=\"\"+e;if(n!==this._stringText){this._stringText=n;var r=this.getHostNode();a.replaceDelimitedText(r[0],r[1],n)}}},getHostNode:function(){var e=this._commentNodes;if(e)return e;if(!this._closingComment)for(var t=s.getNodeFromInstance(this).nextSibling;;){if(null==t&&r(\"67\",this._domID),8===t.nodeType&&\" /react-text \"===t.nodeValue){this._closingComment=t;break}t=t.nextSibling}return e=[this._hostNode,this._closingComment],this._commentNodes=e,e},unmountComponent:function(){this._closingComment=null,this._commentNodes=null,s.uncacheNode(this)}}),e.exports=c},function(e,t,n){\"use strict\";var r=n(38),o=n(80),a=n(202),i=n(79),s={initialize:i,close:function(){p.isBatchingUpdates=!1}},u=[{initialize:i,close:o.flushBatchedUpdates.bind(o)},s];function c(){this.reinitializeTransaction()}r(c.prototype,a,{getTransactionWrappers:function(){return u}});var l=new c,p={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,r,o,a){var i=p.isBatchingUpdates;return p.isBatchingUpdates=!0,i?e(t,n,r,o,a):l.perform(e,null,t,n,r,o,a)}};e.exports=p},function(e,t,n){\"use strict\";var r=n(38),o=n(487),a=n(56),i=n(122),s=n(45),u=n(80),c=n(264),l=n(966);function p(e){for(;e._hostParent;)e=e._hostParent;var t=s.getNodeFromInstance(e).parentNode;return s.getClosestInstanceFromNode(t)}function f(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}function h(e){var t=c(e.nativeEvent),n=s.getClosestInstanceFromNode(t),r=n;do{e.ancestors.push(r),r=r&&p(r)}while(r);for(var o=0;o<e.ancestors.length;o++)n=e.ancestors[o],m._handleTopLevel(e.topLevelType,n,e.nativeEvent,c(e.nativeEvent))}function d(e){e(l(window))}r(f.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),i.addPoolingTo(f,i.twoArgumentPooler);var m={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:a.canUseDOM?window:null,setHandleTopLevel:function(e){m._handleTopLevel=e},setEnabled:function(e){m._enabled=!!e},isEnabled:function(){return m._enabled},trapBubbledEvent:function(e,t,n){return n?o.listen(n,t,m.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){return n?o.capture(n,t,m.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var t=d.bind(null,e);o.listen(window,\"scroll\",t)},dispatchEvent:function(e,t){if(m._enabled){var n=f.getPooled(e,t);try{u.batchedUpdates(h,n)}finally{f.release(n)}}}};e.exports=m},function(e,t,n){\"use strict\";e.exports=function(e){return e.Window&&e instanceof e.Window?{x:e.pageXOffset||e.document.documentElement.scrollLeft,y:e.pageYOffset||e.document.documentElement.scrollTop}:{x:e.scrollLeft,y:e.scrollTop}}},function(e,t,n){\"use strict\";var r=n(140),o=n(166),a=n(262),i=n(271),s=n(483),u=n(206),c=n(484),l=n(80),p={Component:i.injection,DOMProperty:r.injection,EmptyComponent:s.injection,EventPluginHub:o.injection,EventPluginUtils:a.injection,EventEmitter:u.injection,HostComponent:c.injection,Updates:l.injection};e.exports=p},function(e,t,n){\"use strict\";var r=n(38),o=n(471),a=n(122),i=n(206),s=n(488),u=(n(72),n(202)),c=n(275),l=[{initialize:s.getSelectionInformation,close:s.restoreSelection},{initialize:function(){var e=i.isEnabled();return i.setEnabled(!1),e},close:function(e){i.setEnabled(e)}},{initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}}];function p(e){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=o.getPooled(null),this.useCreateElement=e}var f={getTransactionWrappers:function(){return l},getReactMountReady:function(){return this.reactMountReady},getUpdateQueue:function(){return c},checkpoint:function(){return this.reactMountReady.checkpoint()},rollback:function(e){this.reactMountReady.rollback(e)},destructor:function(){o.release(this.reactMountReady),this.reactMountReady=null}};r(p.prototype,u,f),a.addPoolingTo(p),e.exports=p},function(e,t,n){\"use strict\";var r=n(56),o=n(970),a=n(470);function i(e,t,n,r){return e===n&&t===r}var s=r.canUseDOM&&\"selection\"in document&&!(\"getSelection\"in window),u={getOffsets:s?function(e){var t=document.selection.createRange(),n=t.text.length,r=t.duplicate();r.moveToElementText(e),r.setEndPoint(\"EndToStart\",t);var o=r.text.length;return{start:o,end:o+n}}:function(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,r=t.anchorOffset,o=t.focusNode,a=t.focusOffset,s=t.getRangeAt(0);try{s.startContainer.nodeType,s.endContainer.nodeType}catch(e){return null}var u=i(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset)?0:s.toString().length,c=s.cloneRange();c.selectNodeContents(e),c.setEnd(s.startContainer,s.startOffset);var l=i(c.startContainer,c.startOffset,c.endContainer,c.endOffset)?0:c.toString().length,p=l+u,f=document.createRange();f.setStart(n,r),f.setEnd(o,a);var h=f.collapsed;return{start:h?p:l,end:h?l:p}},setOffsets:s?function(e,t){var n,r,o=document.selection.createRange().duplicate();void 0===t.end?r=n=t.start:t.start>t.end?(n=t.end,r=t.start):(n=t.start,r=t.end),o.moveToElementText(e),o.moveStart(\"character\",n),o.setEndPoint(\"EndToStart\",o),o.moveEnd(\"character\",r-n),o.select()}:function(e,t){if(window.getSelection){var n=window.getSelection(),r=e[a()].length,i=Math.min(t.start,r),s=void 0===t.end?i:Math.min(t.end,r);if(!n.extend&&i>s){var u=s;s=i,i=u}var c=o(e,i),l=o(e,s);if(c&&l){var p=document.createRange();p.setStart(c.node,c.offset),n.removeAllRanges(),i>s?(n.addRange(p),n.extend(l.node,l.offset)):(p.setEnd(l.node,l.offset),n.addRange(p))}}}};e.exports=u},function(e,t,n){\"use strict\";function r(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function o(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}e.exports=function(e,t){for(var n=r(e),a=0,i=0;n;){if(3===n.nodeType){if(i=a+n.textContent.length,a<=t&&i>=t)return{node:n,offset:t-a};a=i}n=r(o(n))}}},function(e,t,n){\"use strict\";var r=n(972);e.exports=function e(t,n){return!(!t||!n)&&(t===n||!r(t)&&(r(n)?e(t,n.parentNode):\"contains\"in t?t.contains(n):!!t.compareDocumentPosition&&!!(16&t.compareDocumentPosition(n))))}},function(e,t,n){\"use strict\";var r=n(973);e.exports=function(e){return r(e)&&3==e.nodeType}},function(e,t,n){\"use strict\";e.exports=function(e){var t=(e?e.ownerDocument||e:document).defaultView||window;return!(!e||!(\"function\"==typeof t.Node?e instanceof t.Node:\"object\"==typeof e&&\"number\"==typeof e.nodeType&&\"string\"==typeof e.nodeName))}},function(e,t,n){\"use strict\";var r=\"http://www.w3.org/1999/xlink\",o=\"http://www.w3.org/XML/1998/namespace\",a={accentHeight:\"accent-height\",accumulate:0,additive:0,alignmentBaseline:\"alignment-baseline\",allowReorder:\"allowReorder\",alphabetic:0,amplitude:0,arabicForm:\"arabic-form\",ascent:0,attributeName:\"attributeName\",attributeType:\"attributeType\",autoReverse:\"autoReverse\",azimuth:0,baseFrequency:\"baseFrequency\",baseProfile:\"baseProfile\",baselineShift:\"baseline-shift\",bbox:0,begin:0,bias:0,by:0,calcMode:\"calcMode\",capHeight:\"cap-height\",clip:0,clipPath:\"clip-path\",clipRule:\"clip-rule\",clipPathUnits:\"clipPathUnits\",colorInterpolation:\"color-interpolation\",colorInterpolationFilters:\"color-interpolation-filters\",colorProfile:\"color-profile\",colorRendering:\"color-rendering\",contentScriptType:\"contentScriptType\",contentStyleType:\"contentStyleType\",cursor:0,cx:0,cy:0,d:0,decelerate:0,descent:0,diffuseConstant:\"diffuseConstant\",direction:0,display:0,divisor:0,dominantBaseline:\"dominant-baseline\",dur:0,dx:0,dy:0,edgeMode:\"edgeMode\",elevation:0,enableBackground:\"enable-background\",end:0,exponent:0,externalResourcesRequired:\"externalResourcesRequired\",fill:0,fillOpacity:\"fill-opacity\",fillRule:\"fill-rule\",filter:0,filterRes:\"filterRes\",filterUnits:\"filterUnits\",floodColor:\"flood-color\",floodOpacity:\"flood-opacity\",focusable:0,fontFamily:\"font-family\",fontSize:\"font-size\",fontSizeAdjust:\"font-size-adjust\",fontStretch:\"font-stretch\",fontStyle:\"font-style\",fontVariant:\"font-variant\",fontWeight:\"font-weight\",format:0,from:0,fx:0,fy:0,g1:0,g2:0,glyphName:\"glyph-name\",glyphOrientationHorizontal:\"glyph-orientation-horizontal\",glyphOrientationVertical:\"glyph-orientation-vertical\",glyphRef:\"glyphRef\",gradientTransform:\"gradientTransform\",gradientUnits:\"gradientUnits\",hanging:0,horizAdvX:\"horiz-adv-x\",horizOriginX:\"horiz-origin-x\",ideographic:0,imageRendering:\"image-rendering\",in:0,in2:0,intercept:0,k:0,k1:0,k2:0,k3:0,k4:0,kernelMatrix:\"kernelMatrix\",kernelUnitLength:\"kernelUnitLength\",kerning:0,keyPoints:\"keyPoints\",keySplines:\"keySplines\",keyTimes:\"keyTimes\",lengthAdjust:\"lengthAdjust\",letterSpacing:\"letter-spacing\",lightingColor:\"lighting-color\",limitingConeAngle:\"limitingConeAngle\",local:0,markerEnd:\"marker-end\",markerMid:\"marker-mid\",markerStart:\"marker-start\",markerHeight:\"markerHeight\",markerUnits:\"markerUnits\",markerWidth:\"markerWidth\",mask:0,maskContentUnits:\"maskContentUnits\",maskUnits:\"maskUnits\",mathematical:0,mode:0,numOctaves:\"numOctaves\",offset:0,opacity:0,operator:0,order:0,orient:0,orientation:0,origin:0,overflow:0,overlinePosition:\"overline-position\",overlineThickness:\"overline-thickness\",paintOrder:\"paint-order\",panose1:\"panose-1\",pathLength:\"pathLength\",patternContentUnits:\"patternContentUnits\",patternTransform:\"patternTransform\",patternUnits:\"patternUnits\",pointerEvents:\"pointer-events\",points:0,pointsAtX:\"pointsAtX\",pointsAtY:\"pointsAtY\",pointsAtZ:\"pointsAtZ\",preserveAlpha:\"preserveAlpha\",preserveAspectRatio:\"preserveAspectRatio\",primitiveUnits:\"primitiveUnits\",r:0,radius:0,refX:\"refX\",refY:\"refY\",renderingIntent:\"rendering-intent\",repeatCount:\"repeatCount\",repeatDur:\"repeatDur\",requiredExtensions:\"requiredExtensions\",requiredFeatures:\"requiredFeatures\",restart:0,result:0,rotate:0,rx:0,ry:0,scale:0,seed:0,shapeRendering:\"shape-rendering\",slope:0,spacing:0,specularConstant:\"specularConstant\",specularExponent:\"specularExponent\",speed:0,spreadMethod:\"spreadMethod\",startOffset:\"startOffset\",stdDeviation:\"stdDeviation\",stemh:0,stemv:0,stitchTiles:\"stitchTiles\",stopColor:\"stop-color\",stopOpacity:\"stop-opacity\",strikethroughPosition:\"strikethrough-position\",strikethroughThickness:\"strikethrough-thickness\",string:0,stroke:0,strokeDasharray:\"stroke-dasharray\",strokeDashoffset:\"stroke-dashoffset\",strokeLinecap:\"stroke-linecap\",strokeLinejoin:\"stroke-linejoin\",strokeMiterlimit:\"stroke-miterlimit\",strokeOpacity:\"stroke-opacity\",strokeWidth:\"stroke-width\",surfaceScale:\"surfaceScale\",systemLanguage:\"systemLanguage\",tableValues:\"tableValues\",targetX:\"targetX\",targetY:\"targetY\",textAnchor:\"text-anchor\",textDecoration:\"text-decoration\",textRendering:\"text-rendering\",textLength:\"textLength\",to:0,transform:0,u1:0,u2:0,underlinePosition:\"underline-position\",underlineThickness:\"underline-thickness\",unicode:0,unicodeBidi:\"unicode-bidi\",unicodeRange:\"unicode-range\",unitsPerEm:\"units-per-em\",vAlphabetic:\"v-alphabetic\",vHanging:\"v-hanging\",vIdeographic:\"v-ideographic\",vMathematical:\"v-mathematical\",values:0,vectorEffect:\"vector-effect\",version:0,vertAdvY:\"vert-adv-y\",vertOriginX:\"vert-origin-x\",vertOriginY:\"vert-origin-y\",viewBox:\"viewBox\",viewTarget:\"viewTarget\",visibility:0,widths:0,wordSpacing:\"word-spacing\",writingMode:\"writing-mode\",x:0,xHeight:\"x-height\",x1:0,x2:0,xChannelSelector:\"xChannelSelector\",xlinkActuate:\"xlink:actuate\",xlinkArcrole:\"xlink:arcrole\",xlinkHref:\"xlink:href\",xlinkRole:\"xlink:role\",xlinkShow:\"xlink:show\",xlinkTitle:\"xlink:title\",xlinkType:\"xlink:type\",xmlBase:\"xml:base\",xmlns:0,xmlnsXlink:\"xmlns:xlink\",xmlLang:\"xml:lang\",xmlSpace:\"xml:space\",y:0,y1:0,y2:0,yChannelSelector:\"yChannelSelector\",z:0,zoomAndPan:\"zoomAndPan\"},i={Properties:{},DOMAttributeNamespaces:{xlinkActuate:r,xlinkArcrole:r,xlinkHref:r,xlinkRole:r,xlinkShow:r,xlinkTitle:r,xlinkType:r,xmlBase:o,xmlLang:o,xmlSpace:o},DOMAttributeNames:{}};Object.keys(a).forEach((function(e){i.Properties[e]=0,a[e]&&(i.DOMAttributeNames[e]=a[e])})),e.exports=i},function(e,t,n){\"use strict\";var r=n(165),o=n(56),a=n(45),i=n(488),s=n(91),u=n(489),c=n(474),l=n(272),p=o.canUseDOM&&\"documentMode\"in document&&document.documentMode<=11,f={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:[\"topBlur\",\"topContextMenu\",\"topFocus\",\"topKeyDown\",\"topKeyUp\",\"topMouseDown\",\"topMouseUp\",\"topSelectionChange\"]}},h=null,d=null,m=null,v=!1,g=!1;function y(e,t){if(v||null==h||h!==u())return null;var n=function(e){if(\"selectionStart\"in e&&i.hasSelectionCapabilities(e))return{start:e.selectionStart,end:e.selectionEnd};if(window.getSelection){var t=window.getSelection();return{anchorNode:t.anchorNode,anchorOffset:t.anchorOffset,focusNode:t.focusNode,focusOffset:t.focusOffset}}if(document.selection){var n=document.selection.createRange();return{parentElement:n.parentElement(),text:n.text,top:n.boundingTop,left:n.boundingLeft}}}(h);if(!m||!l(m,n)){m=n;var o=s.getPooled(f.select,d,e,t);return o.type=\"select\",o.target=h,r.accumulateTwoPhaseDispatches(o),o}return null}var b={eventTypes:f,extractEvents:function(e,t,n,r){if(!g)return null;var o=t?a.getNodeFromInstance(t):window;switch(e){case\"topFocus\":(c(o)||\"true\"===o.contentEditable)&&(h=o,d=t,m=null);break;case\"topBlur\":h=null,d=null,m=null;break;case\"topMouseDown\":v=!0;break;case\"topContextMenu\":case\"topMouseUp\":return v=!1,y(n,r);case\"topSelectionChange\":if(p)break;case\"topKeyDown\":case\"topKeyUp\":return y(n,r)}return null},didPutListener:function(e,t,n){\"onSelect\"===t&&(g=!0)}};e.exports=b},function(e,t,n){\"use strict\";var r=n(30),o=n(487),a=n(165),i=n(45),s=n(977),u=n(978),c=n(91),l=n(979),p=n(980),f=n(203),h=n(982),d=n(983),m=n(984),v=n(167),g=n(985),y=n(79),b=n(277),_=(n(25),{}),w={};[\"abort\",\"animationEnd\",\"animationIteration\",\"animationStart\",\"blur\",\"canPlay\",\"canPlayThrough\",\"click\",\"contextMenu\",\"copy\",\"cut\",\"doubleClick\",\"drag\",\"dragEnd\",\"dragEnter\",\"dragExit\",\"dragLeave\",\"dragOver\",\"dragStart\",\"drop\",\"durationChange\",\"emptied\",\"encrypted\",\"ended\",\"error\",\"focus\",\"input\",\"invalid\",\"keyDown\",\"keyPress\",\"keyUp\",\"load\",\"loadedData\",\"loadedMetadata\",\"loadStart\",\"mouseDown\",\"mouseMove\",\"mouseOut\",\"mouseOver\",\"mouseUp\",\"paste\",\"pause\",\"play\",\"playing\",\"progress\",\"rateChange\",\"reset\",\"scroll\",\"seeked\",\"seeking\",\"stalled\",\"submit\",\"suspend\",\"timeUpdate\",\"touchCancel\",\"touchEnd\",\"touchMove\",\"touchStart\",\"transitionEnd\",\"volumeChange\",\"waiting\",\"wheel\"].forEach((function(e){var t=e[0].toUpperCase()+e.slice(1),n=\"on\"+t,r=\"top\"+t,o={phasedRegistrationNames:{bubbled:n,captured:n+\"Capture\"},dependencies:[r]};_[e]=o,w[r]=o}));var x={};function E(e){return\".\"+e._rootNodeID}function S(e){return\"button\"===e||\"input\"===e||\"select\"===e||\"textarea\"===e}var C={eventTypes:_,extractEvents:function(e,t,n,o){var i,y=w[e];if(!y)return null;switch(e){case\"topAbort\":case\"topCanPlay\":case\"topCanPlayThrough\":case\"topDurationChange\":case\"topEmptied\":case\"topEncrypted\":case\"topEnded\":case\"topError\":case\"topInput\":case\"topInvalid\":case\"topLoad\":case\"topLoadedData\":case\"topLoadedMetadata\":case\"topLoadStart\":case\"topPause\":case\"topPlay\":case\"topPlaying\":case\"topProgress\":case\"topRateChange\":case\"topReset\":case\"topSeeked\":case\"topSeeking\":case\"topStalled\":case\"topSubmit\":case\"topSuspend\":case\"topTimeUpdate\":case\"topVolumeChange\":case\"topWaiting\":i=c;break;case\"topKeyPress\":if(0===b(n))return null;case\"topKeyDown\":case\"topKeyUp\":i=p;break;case\"topBlur\":case\"topFocus\":i=l;break;case\"topClick\":if(2===n.button)return null;case\"topDoubleClick\":case\"topMouseDown\":case\"topMouseMove\":case\"topMouseUp\":case\"topMouseOut\":case\"topMouseOver\":case\"topContextMenu\":i=f;break;case\"topDrag\":case\"topDragEnd\":case\"topDragEnter\":case\"topDragExit\":case\"topDragLeave\":case\"topDragOver\":case\"topDragStart\":case\"topDrop\":i=h;break;case\"topTouchCancel\":case\"topTouchEnd\":case\"topTouchMove\":case\"topTouchStart\":i=d;break;case\"topAnimationEnd\":case\"topAnimationIteration\":case\"topAnimationStart\":i=s;break;case\"topTransitionEnd\":i=m;break;case\"topScroll\":i=v;break;case\"topWheel\":i=g;break;case\"topCopy\":case\"topCut\":case\"topPaste\":i=u}i||r(\"86\",e);var _=i.getPooled(y,t,n,o);return a.accumulateTwoPhaseDispatches(_),_},didPutListener:function(e,t,n){if(\"onClick\"===t&&!S(e._tag)){var r=E(e),a=i.getNodeFromInstance(e);x[r]||(x[r]=o.listen(a,\"click\",y))}},willDeleteListener:function(e,t){if(\"onClick\"===t&&!S(e._tag)){var n=E(e);x[n].remove(),delete x[n]}}};e.exports=C},function(e,t,n){\"use strict\";var r=n(91);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{animationName:null,elapsedTime:null,pseudoElement:null}),e.exports=o},function(e,t,n){\"use strict\";var r=n(91),o={clipboardData:function(e){return\"clipboardData\"in e?e.clipboardData:window.clipboardData}};function a(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(a,o),e.exports=a},function(e,t,n){\"use strict\";var r=n(167);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{relatedTarget:null}),e.exports=o},function(e,t,n){\"use strict\";var r=n(167),o=n(277),a={key:n(981),location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:n(266),charCode:function(e){return\"keypress\"===e.type?o(e):0},keyCode:function(e){return\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0},which:function(e){return\"keypress\"===e.type?o(e):\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0}};function i(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(i,a),e.exports=i},function(e,t,n){\"use strict\";var r=n(277),o={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},a={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"};e.exports=function(e){if(e.key){var t=o[e.key]||e.key;if(\"Unidentified\"!==t)return t}if(\"keypress\"===e.type){var n=r(e);return 13===n?\"Enter\":String.fromCharCode(n)}return\"keydown\"===e.type||\"keyup\"===e.type?a[e.keyCode]||\"Unidentified\":\"\"}},function(e,t,n){\"use strict\";var r=n(203);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{dataTransfer:null}),e.exports=o},function(e,t,n){\"use strict\";var r=n(167),o={touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:n(266)};function a(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(a,o),e.exports=a},function(e,t,n){\"use strict\";var r=n(91);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{propertyName:null,elapsedTime:null,pseudoElement:null}),e.exports=o},function(e,t,n){\"use strict\";var r=n(203);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{deltaX:function(e){return\"deltaX\"in e?e.deltaX:\"wheelDeltaX\"in e?-e.wheelDeltaX:0},deltaY:function(e){return\"deltaY\"in e?e.deltaY:\"wheelDeltaY\"in e?-e.wheelDeltaY:\"wheelDelta\"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null}),e.exports=o},function(e,t,n){\"use strict\";n(276);e.exports=function(e,t){return{_topLevelWrapper:e,_idCounter:1,_ownerDocument:t?9===t.nodeType?t:t.ownerDocument:null,_node:t,_tag:t?t.nodeName.toLowerCase():null,_namespaceURI:t?t.namespaceURI:null}}},function(e,t,n){\"use strict\";e.exports={useCreateElement:!0,useFiber:!1}},function(e,t,n){\"use strict\";var r=n(989),o=/\\/?>/,a=/^<\\!\\-\\-/,i={CHECKSUM_ATTR_NAME:\"data-react-checksum\",addChecksumToMarkup:function(e){var t=r(e);return a.test(e)?e:e.replace(o,\" \"+i.CHECKSUM_ATTR_NAME+'=\"'+t+'\"$&')},canReuseMarkup:function(e,t){var n=t.getAttribute(i.CHECKSUM_ATTR_NAME);return n=n&&parseInt(n,10),r(e)===n}};e.exports=i},function(e,t,n){\"use strict\";var r=65521;e.exports=function(e){for(var t=1,n=0,o=0,a=e.length,i=-4&a;o<i;){for(var s=Math.min(o+4096,i);o<s;o+=4)n+=(t+=e.charCodeAt(o))+(t+=e.charCodeAt(o+1))+(t+=e.charCodeAt(o+2))+(t+=e.charCodeAt(o+3));t%=r,n%=r}for(;o<a;o++)n+=t+=e.charCodeAt(o);return(t%=r)|(n%=r)<<16}},function(e,t,n){\"use strict\";e.exports=\"15.6.2\"},function(e,t,n){\"use strict\";var r=n(30),o=(n(88),n(45)),a=n(168),i=n(491);n(25),n(33);e.exports=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=a.get(e);if(t)return(t=i(t))?o.getNodeFromInstance(t):null;\"function\"==typeof e.render?r(\"44\"):r(\"45\",Object.keys(e))}},function(e,t,n){\"use strict\";var r=n(490);e.exports=r.renderSubtreeIntoContainer},function(e,t,n){\"use strict\";t.__esModule=!0,t.default=void 0;var r=n(0),o=i(n(11)),a=i(n(492));i(n(493));function i(e){return e&&e.__esModule?e:{default:e}}var s=function(e){function t(n,r){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,t);var o=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}(this,e.call(this,n,r));return o.store=n.store,o}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.getChildContext=function(){return{store:this.store}},t.prototype.render=function(){return r.Children.only(this.props.children)},t}(r.Component);t.default=s,s.propTypes={store:a.default.isRequired,children:o.default.element.isRequired},s.childContextTypes={store:a.default.isRequired}},function(e,t,n){\"use strict\";var r=n(389);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error(\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types\");throw s.name=\"Invariant Violation\",s}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},function(e,t,n){\"use strict\";t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};t.default=function(e,t,n){var l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},w=Boolean(e),x=e||d,E=void 0;E=\"function\"==typeof t?t:t?(0,s.default)(t):m;var S=n||v,C=l.pure,A=void 0===C||C,k=l.withRef,O=void 0!==k&&k,j=A&&S!==v,T=_++;return function(e){var t=\"Connect(\"+g(e)+\")\";var n=function(n){function a(e,r){p(this,a);var o=f(this,n.call(this,e,r));o.version=T,o.store=e.store||r.store,(0,c.default)(o.store,'Could not find \"store\" in either the context or props of \"'+t+'\". Either wrap the root component in a <Provider>, or explicitly pass \"store\" as a prop to \"'+t+'\".');var i=o.store.getState();return o.state={storeState:i},o.clearCache(),o}return h(a,n),a.prototype.shouldComponentUpdate=function(){return!A||this.haveOwnPropsChanged||this.hasStoreStateChanged},a.prototype.computeStateProps=function(e,t){if(!this.finalMapStateToProps)return this.configureFinalMapState(e,t);var n=e.getState();return this.doStatePropsDependOnOwnProps?this.finalMapStateToProps(n,t):this.finalMapStateToProps(n)},a.prototype.configureFinalMapState=function(e,t){var n=x(e.getState(),t),r=\"function\"==typeof n;return this.finalMapStateToProps=r?n:x,this.doStatePropsDependOnOwnProps=1!==this.finalMapStateToProps.length,r?this.computeStateProps(e,t):n},a.prototype.computeDispatchProps=function(e,t){if(!this.finalMapDispatchToProps)return this.configureFinalMapDispatch(e,t);var n=e.dispatch;return this.doDispatchPropsDependOnOwnProps?this.finalMapDispatchToProps(n,t):this.finalMapDispatchToProps(n)},a.prototype.configureFinalMapDispatch=function(e,t){var n=E(e.dispatch,t),r=\"function\"==typeof n;return this.finalMapDispatchToProps=r?n:E,this.doDispatchPropsDependOnOwnProps=1!==this.finalMapDispatchToProps.length,r?this.computeDispatchProps(e,t):n},a.prototype.updateStatePropsIfNeeded=function(){var e=this.computeStateProps(this.store,this.props);return(!this.stateProps||!(0,i.default)(e,this.stateProps))&&(this.stateProps=e,!0)},a.prototype.updateDispatchPropsIfNeeded=function(){var e=this.computeDispatchProps(this.store,this.props);return(!this.dispatchProps||!(0,i.default)(e,this.dispatchProps))&&(this.dispatchProps=e,!0)},a.prototype.updateMergedPropsIfNeeded=function(){var e,t,n,r=(e=this.stateProps,t=this.dispatchProps,n=this.props,S(e,t,n));return!(this.mergedProps&&j&&(0,i.default)(r,this.mergedProps))&&(this.mergedProps=r,!0)},a.prototype.isSubscribed=function(){return\"function\"==typeof this.unsubscribe},a.prototype.trySubscribe=function(){w&&!this.unsubscribe&&(this.unsubscribe=this.store.subscribe(this.handleChange.bind(this)),this.handleChange())},a.prototype.tryUnsubscribe=function(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null)},a.prototype.componentDidMount=function(){this.trySubscribe()},a.prototype.componentWillReceiveProps=function(e){A&&(0,i.default)(e,this.props)||(this.haveOwnPropsChanged=!0)},a.prototype.componentWillUnmount=function(){this.tryUnsubscribe(),this.clearCache()},a.prototype.clearCache=function(){this.dispatchProps=null,this.stateProps=null,this.mergedProps=null,this.haveOwnPropsChanged=!0,this.hasStoreStateChanged=!0,this.haveStatePropsBeenPrecalculated=!1,this.statePropsPrecalculationError=null,this.renderedElement=null,this.finalMapDispatchToProps=null,this.finalMapStateToProps=null},a.prototype.handleChange=function(){if(this.unsubscribe){var e=this.store.getState(),t=this.state.storeState;if(!A||t!==e){if(A&&!this.doStatePropsDependOnOwnProps){var n=b(this.updateStatePropsIfNeeded,this);if(!n)return;n===y&&(this.statePropsPrecalculationError=y.value),this.haveStatePropsBeenPrecalculated=!0}this.hasStoreStateChanged=!0,this.setState({storeState:e})}}},a.prototype.getWrappedInstance=function(){return(0,c.default)(O,\"To access the wrapped instance, you need to specify { withRef: true } as the fourth argument of the connect() call.\"),this.refs.wrappedInstance},a.prototype.render=function(){var t=this.haveOwnPropsChanged,n=this.hasStoreStateChanged,a=this.haveStatePropsBeenPrecalculated,i=this.statePropsPrecalculationError,s=this.renderedElement;if(this.haveOwnPropsChanged=!1,this.hasStoreStateChanged=!1,this.haveStatePropsBeenPrecalculated=!1,this.statePropsPrecalculationError=null,i)throw i;var u=!0,c=!0;A&&s&&(u=n||t&&this.doStatePropsDependOnOwnProps,c=t&&this.doDispatchPropsDependOnOwnProps);var l=!1,p=!1;a?l=!0:u&&(l=this.updateStatePropsIfNeeded()),c&&(p=this.updateDispatchPropsIfNeeded());return!(!!(l||p||t)&&this.updateMergedPropsIfNeeded())&&s?s:(this.renderedElement=O?(0,o.createElement)(e,r({},this.mergedProps,{ref:\"wrappedInstance\"})):(0,o.createElement)(e,this.mergedProps),this.renderedElement)},a}(o.Component);return n.displayName=t,n.WrappedComponent=e,n.contextTypes={store:a.default},n.propTypes={store:a.default},(0,u.default)(n,e)}};var o=n(0),a=l(n(492)),i=l(n(996)),s=l(n(997)),u=(l(n(493)),l(n(144)),l(n(998))),c=l(n(999));function l(e){return e&&e.__esModule?e:{default:e}}function p(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function f(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function h(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var d=function(e){return{}},m=function(e){return{dispatch:e}},v=function(e,t,n){return r({},n,e,t)};function g(e){return e.displayName||e.name||\"Component\"}var y={value:null};function b(e,t){try{return e.apply(t)}catch(e){return y.value=e,y}}var _=0},function(e,t,n){\"use strict\";t.__esModule=!0,t.default=function(e,t){if(e===t)return!0;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(var o=Object.prototype.hasOwnProperty,a=0;a<n.length;a++)if(!o.call(t,n[a])||e[n[a]]!==t[n[a]])return!1;return!0}},function(e,t,n){\"use strict\";t.__esModule=!0,t.default=function(e){return function(t){return(0,r.bindActionCreators)(e,t)}};var r=n(150)},function(e,t,n){\"use strict\";var r=n(388),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function u(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,l=Object.getOwnPropertyNames,p=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,h=Object.getPrototypeOf,d=Object.prototype;e.exports=function e(t,n,r){if(\"string\"!=typeof n){if(d){var o=h(n);o&&o!==d&&e(t,o,r)}var i=l(n);p&&(i=i.concat(p(n)));for(var s=u(t),m=u(n),v=0;v<i.length;++v){var g=i[v];if(!(a[g]||r&&r[g]||m&&m[g]||s&&s[g])){var y=f(n,g);try{c(t,g,y)}catch(e){}}}}return t}},function(e,t,n){\"use strict\";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var u;if(void 0===t)u=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[n,r,o,a,i,s],l=0;(u=new Error(t.replace(/%s/g,(function(){return c[l++]})))).name=\"Invariant Violation\"}throw u.framesToPop=1,u}}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n<r&&!1!==t(e[n],n,e););return e}},function(e,t,n){var r=n(143),o=n(114);e.exports=function(e,t){return e&&r(t,o(t),e)}},function(e,t,n){var r=n(143),o=n(279);e.exports=function(e,t){return e&&r(t,o(t),e)}},function(e,t,n){var r=n(57),o=n(160),a=n(1004),i=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return a(e);var t=o(e),n=[];for(var s in e)(\"constructor\"!=s||!t&&i.call(e,s))&&n.push(s);return n}},function(e,t){e.exports=function(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);return t}},function(e,t,n){(function(e){var r=n(71),o=t&&!t.nodeType&&t,a=o&&\"object\"==typeof e&&e&&!e.nodeType&&e,i=a&&a.exports===o?r.Buffer:void 0,s=i?i.allocUnsafe:void 0;e.exports=function(e,t){if(t)return e.slice();var n=e.length,r=s?s(n):new e.constructor(n);return e.copy(r),r}}).call(this,n(194)(e))},function(e,t){e.exports=function(e,t){var n=-1,r=e.length;for(t||(t=Array(r));++n<r;)t[n]=e[n];return t}},function(e,t,n){var r=n(143),o=n(248);e.exports=function(e,t){return r(e,o(e),t)}},function(e,t,n){var r=n(143),o=n(495);e.exports=function(e,t){return r(e,o(e),t)}},function(e,t){var n=Object.prototype.hasOwnProperty;e.exports=function(e){var t=e.length,r=new e.constructor(t);return t&&\"string\"==typeof e[0]&&n.call(e,\"index\")&&(r.index=e.index,r.input=e.input),r}},function(e,t,n){var r=n(280),o=n(1011),a=n(1012),i=n(1013),s=n(1014);e.exports=function(e,t,n){var u=e.constructor;switch(t){case\"[object ArrayBuffer]\":return r(e);case\"[object Boolean]\":case\"[object Date]\":return new u(+e);case\"[object DataView]\":return o(e,n);case\"[object Float32Array]\":case\"[object Float64Array]\":case\"[object Int8Array]\":case\"[object Int16Array]\":case\"[object Int32Array]\":case\"[object Uint8Array]\":case\"[object Uint8ClampedArray]\":case\"[object Uint16Array]\":case\"[object Uint32Array]\":return s(e,n);case\"[object Map]\":return new u;case\"[object Number]\":case\"[object String]\":return new u(e);case\"[object RegExp]\":return a(e);case\"[object Set]\":return new u;case\"[object Symbol]\":return i(e)}}},function(e,t,n){var r=n(280);e.exports=function(e,t){var n=t?r(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}},function(e,t){var n=/\\w*$/;e.exports=function(e){var t=new e.constructor(e.source,n.exec(e));return t.lastIndex=e.lastIndex,t}},function(e,t,n){var r=n(134),o=r?r.prototype:void 0,a=o?o.valueOf:void 0;e.exports=function(e){return a?Object(a.call(e)):{}}},function(e,t,n){var r=n(280);e.exports=function(e,t){var n=t?r(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}},function(e,t,n){var r=n(1016),o=n(278),a=n(160);e.exports=function(e){return\"function\"!=typeof e.constructor||a(e)?{}:r(o(e))}},function(e,t,n){var r=n(57),o=Object.create,a=function(){function e(){}return function(t){if(!r(t))return{};if(o)return o(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();e.exports=a},function(e,t,n){var r=n(1018),o=n(251),a=n(252),i=a&&a.isMap,s=i?o(i):r;e.exports=s},function(e,t,n){var r=n(161),o=n(89);e.exports=function(e){return o(e)&&\"[object Map]\"==r(e)}},function(e,t,n){var r=n(1020),o=n(251),a=n(252),i=a&&a.isSet,s=i?o(i):r;e.exports=s},function(e,t,n){var r=n(161),o=n(89);e.exports=function(e){return o(e)&&\"[object Set]\"==r(e)}},function(e,t,n){var r=n(135),o=n(1022),a=n(1023),i=n(136);e.exports=function(e,t){return t=r(t,e),null==(e=a(e,t))||delete e[i(o(t))]}},function(e,t){e.exports=function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}},function(e,t,n){var r=n(196),o=n(409);e.exports=function(e,t){return t.length<2?e:r(e,o(t,0,-1))}},function(e,t,n){var r=n(144);e.exports=function(e){return r(e)?void 0:e}},function(e,t,n){var r=n(1026);e.exports=function(e){return(null==e?0:e.length)?r(e,1):[]}},function(e,t,n){var r=n(247),o=n(1027);e.exports=function e(t,n,a,i,s){var u=-1,c=t.length;for(a||(a=o),s||(s=[]);++u<c;){var l=t[u];n>0&&a(l)?n>1?e(l,n-1,a,i,s):r(s,l):i||(s[s.length]=l)}return s}},function(e,t,n){var r=n(134),o=n(192),a=n(50),i=r?r.isConcatSpreadable:void 0;e.exports=function(e){return a(e)||o(e)||!!(i&&e&&e[i])}},function(e,t){e.exports=function(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}},function(e,t,n){var r=n(1030),o=n(464),a=n(254),i=o?function(e,t){return o(e,\"toString\",{configurable:!0,enumerable:!1,value:r(t),writable:!0})}:a;e.exports=i},function(e,t){e.exports=function(e){return function(){return e}}},function(e,t){var n=Date.now;e.exports=function(e){var t=0,r=0;return function(){var o=n(),a=16-(o-r);if(r=o,a>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}},function(e,t,n){var r=n(1033);e.exports=r},function(e,t,n){var r=n(1034),o=String.prototype;e.exports=function(e){var t=e.repeat;return\"string\"==typeof e||e===o||e instanceof String&&t===o.repeat?r:t}},function(e,t,n){n(1035);var r=n(42);e.exports=r(\"String\").repeat},function(e,t,n){n(21)({target:\"String\",proto:!0},{repeat:n(1036)})},function(e,t,n){\"use strict\";var r=n(128),o=n(106);e.exports=function(e){var t=String(o(this)),n=\"\",a=r(e);if(a<0||a==1/0)throw RangeError(\"Wrong number of repetitions\");for(;a>0;(a>>>=1)&&(t+=t))1&a&&(n+=t);return n}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.CopyToClipboard=void 0;var r=a(n(0)),o=a(n(1038));function a(e){return e&&e.__esModule?e:{default:e}}function i(e){return(i=\"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 s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function u(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function c(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function p(e,t){return!t||\"object\"!==i(t)&&\"function\"!=typeof t?h(e):t}function f(e){return(f=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function h(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function d(e,t){return(d=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var v=function(e){function t(){var e,n;c(this,t);for(var a=arguments.length,i=new Array(a),s=0;s<a;s++)i[s]=arguments[s];return m(h(n=p(this,(e=f(t)).call.apply(e,[this].concat(i)))),\"onClick\",(function(e){var t=n.props,a=t.text,i=t.onCopy,s=t.children,u=t.options,c=r.default.Children.only(s),l=(0,o.default)(a,u);i&&i(a,l),c&&c.props&&\"function\"==typeof c.props.onClick&&c.props.onClick(e)})),n}var n,a,i;return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&d(e,t)}(t,e),n=t,(a=[{key:\"render\",value:function(){var e=this.props,t=(e.text,e.onCopy,e.options,e.children),n=u(e,[\"text\",\"onCopy\",\"options\",\"children\"]),o=r.default.Children.only(t);return r.default.cloneElement(o,function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(n,!0).forEach((function(t){m(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(n).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}({},n,{onClick:this.onClick}))}}])&&l(n.prototype,a),i&&l(n,i),t}(r.default.PureComponent);t.CopyToClipboard=v,m(v,\"defaultProps\",{onCopy:void 0,options:void 0})},function(e,t,n){\"use strict\";var r=n(1039),o={\"text/plain\":\"Text\",\"text/html\":\"Url\",default:\"Text\"};e.exports=function(e,t){var n,a,i,s,u,c,l=!1;t||(t={}),n=t.debug||!1;try{if(i=r(),s=document.createRange(),u=document.getSelection(),(c=document.createElement(\"span\")).textContent=e,c.style.all=\"unset\",c.style.position=\"fixed\",c.style.top=0,c.style.clip=\"rect(0, 0, 0, 0)\",c.style.whiteSpace=\"pre\",c.style.webkitUserSelect=\"text\",c.style.MozUserSelect=\"text\",c.style.msUserSelect=\"text\",c.style.userSelect=\"text\",c.addEventListener(\"copy\",(function(r){if(r.stopPropagation(),t.format)if(r.preventDefault(),void 0===r.clipboardData){n&&console.warn(\"unable to use e.clipboardData\"),n&&console.warn(\"trying IE specific stuff\"),window.clipboardData.clearData();var a=o[t.format]||o.default;window.clipboardData.setData(a,e)}else r.clipboardData.clearData(),r.clipboardData.setData(t.format,e);t.onCopy&&(r.preventDefault(),t.onCopy(r.clipboardData))})),document.body.appendChild(c),s.selectNodeContents(c),u.addRange(s),!document.execCommand(\"copy\"))throw new Error(\"copy command was unsuccessful\");l=!0}catch(r){n&&console.error(\"unable to copy using execCommand: \",r),n&&console.warn(\"trying IE specific stuff\");try{window.clipboardData.setData(t.format||\"text\",e),t.onCopy&&t.onCopy(window.clipboardData),l=!0}catch(r){n&&console.error(\"unable to copy using clipboardData: \",r),n&&console.error(\"falling back to prompt\"),a=function(e){var t=(/mac os x/i.test(navigator.userAgent)?\"⌘\":\"Ctrl\")+\"+C\";return e.replace(/#{\\s*key\\s*}/g,t)}(\"message\"in t?t.message:\"Copy to clipboard: #{key}, Enter\"),window.prompt(a,e)}}finally{u&&(\"function\"==typeof u.removeRange?u.removeRange(s):u.removeAllRanges()),c&&document.body.removeChild(c),i()}return l}},function(e,t){e.exports=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var t=document.activeElement,n=[],r=0;r<e.rangeCount;r++)n.push(e.getRangeAt(r));switch(t.tagName.toUpperCase()){case\"INPUT\":case\"TEXTAREA\":t.blur();break;default:t=null}return e.removeAllRanges(),function(){\"Caret\"===e.type&&e.removeAllRanges(),e.rangeCount||n.forEach((function(t){e.addRange(t)})),t&&t.focus()}}},function(e,t){function n(e){return e instanceof Map?e.clear=e.delete=e.set=function(){throw new Error(\"map is read-only\")}:e instanceof Set&&(e.add=e.clear=e.delete=function(){throw new Error(\"set is read-only\")}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((function(t){var r=e[t];\"object\"!=typeof r||Object.isFrozen(r)||n(r)})),e}var r=n,o=n;r.default=o;class a{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function i(e){return e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#x27;\")}function s(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t];return t.forEach((function(e){for(const t in e)n[t]=e[t]})),n}function u(e){return e.nodeName.toLowerCase()}var c=Object.freeze({__proto__:null,escapeHTML:i,inherit:s,nodeStream:function(e){const t=[];return function e(n,r){for(let o=n.firstChild;o;o=o.nextSibling)3===o.nodeType?r+=o.nodeValue.length:1===o.nodeType&&(t.push({event:\"start\",offset:r,node:o}),r=e(o,r),u(o).match(/br|hr|img|input/)||t.push({event:\"stop\",offset:r,node:o}));return r}(e,0),t},mergeStreams:function(e,t,n){let r=0,o=\"\";const a=[];function s(){return e.length&&t.length?e[0].offset!==t[0].offset?e[0].offset<t[0].offset?e:t:\"start\"===t[0].event?e:t:e.length?e:t}function c(e){o+=\"<\"+u(e)+[].map.call(e.attributes,(function(e){return\" \"+e.nodeName+'=\"'+i(e.value)+'\"'})).join(\"\")+\">\"}function l(e){o+=\"</\"+u(e)+\">\"}function p(e){(\"start\"===e.event?c:l)(e.node)}for(;e.length||t.length;){let t=s();if(o+=i(n.substring(r,t[0].offset)),r=t[0].offset,t===e){a.reverse().forEach(l);do{p(t.splice(0,1)[0]),t=s()}while(t===e&&t.length&&t[0].offset===r);a.reverse().forEach(c)}else\"start\"===t[0].event?a.push(t[0].node):a.pop(),p(t.splice(0,1)[0])}return o+i(n.substr(r))}});const l=e=>!!e.kind;class p{constructor(e,t){this.buffer=\"\",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){this.buffer+=i(e)}openNode(e){if(!l(e))return;let t=e.kind;e.sublanguage||(t=`${this.classPrefix}${t}`),this.span(t)}closeNode(e){l(e)&&(this.buffer+=\"</span>\")}value(){return this.buffer}span(e){this.buffer+=`<span class=\"${e}\">`}}class f{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const t={kind:e,children:[]};this.add(t),this.stack.push(t)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){return\"string\"==typeof t?e.addText(t):t.children&&(e.openNode(t),t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){\"string\"!=typeof e&&e.children&&(e.children.every((e=>\"string\"==typeof e))?e.children=[e.children.join(\"\")]:e.children.forEach((e=>{f._collapse(e)})))}}class h extends f{constructor(e){super(),this.options=e}addKeyword(e,t){\"\"!==e&&(this.openNode(t),this.addText(e),this.closeNode())}addText(e){\"\"!==e&&this.add(e)}addSublanguage(e,t){const n=e.root;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){return new p(this,this.options).value()}finalize(){return!0}}function d(e){return e?\"string\"==typeof e?e:e.source:null}const m=\"[a-zA-Z]\\\\w*\",v=\"[a-zA-Z_]\\\\w*\",g=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",y=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",b=\"\\\\b(0b[01]+)\",_={begin:\"\\\\\\\\[\\\\s\\\\S]\",relevance:0},w={className:\"string\",begin:\"'\",end:\"'\",illegal:\"\\\\n\",contains:[_]},x={className:\"string\",begin:'\"',end:'\"',illegal:\"\\\\n\",contains:[_]},E={begin:/\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/},S=function(e,t,n={}){const r=s({className:\"comment\",begin:e,end:t,contains:[]},n);return r.contains.push(E),r.contains.push({className:\"doctag\",begin:\"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):\",relevance:0}),r},C=S(\"//\",\"$\"),A=S(\"/\\\\*\",\"\\\\*/\"),k=S(\"#\",\"$\"),O={className:\"number\",begin:g,relevance:0},j={className:\"number\",begin:y,relevance:0},T={className:\"number\",begin:b,relevance:0},I={className:\"number\",begin:g+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",relevance:0},P={begin:/(?=\\/[^/\\n]*\\/)/,contains:[{className:\"regexp\",begin:/\\//,end:/\\/[gimuy]*/,illegal:/\\n/,contains:[_,{begin:/\\[/,end:/\\]/,relevance:0,contains:[_]}]}]},N={className:\"title\",begin:m,relevance:0},M={className:\"title\",begin:v,relevance:0},R={begin:\"\\\\.\\\\s*[a-zA-Z_]\\\\w*\",relevance:0};var D=Object.freeze({__proto__:null,IDENT_RE:m,UNDERSCORE_IDENT_RE:v,NUMBER_RE:g,C_NUMBER_RE:y,BINARY_NUMBER_RE:b,RE_STARTERS_RE:\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",SHEBANG:(e={})=>{const t=/^#![ ]*\\//;return e.binary&&(e.begin=function(...e){return e.map((e=>d(e))).join(\"\")}(t,/.*\\b/,e.binary,/\\b.*/)),s({className:\"meta\",begin:t,end:/$/,relevance:0,\"on:begin\":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:_,APOS_STRING_MODE:w,QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:E,COMMENT:S,C_LINE_COMMENT_MODE:C,C_BLOCK_COMMENT_MODE:A,HASH_COMMENT_MODE:k,NUMBER_MODE:O,C_NUMBER_MODE:j,BINARY_NUMBER_MODE:T,CSS_NUMBER_MODE:I,REGEXP_MODE:P,TITLE_MODE:N,UNDERSCORE_TITLE_MODE:M,METHOD_GUARD:R,END_SAME_AS_BEGIN:function(e){return Object.assign(e,{\"on:begin\":(e,t)=>{t.data._beginMatch=e[1]},\"on:end\":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}})}});const L=[\"of\",\"and\",\"for\",\"in\",\"not\",\"or\",\"if\",\"then\",\"parent\",\"list\",\"value\"];function B(e){function t(t,n){return new RegExp(d(t),\"m\"+(e.case_insensitive?\"i\":\"\")+(n?\"g\":\"\"))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,t){t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),this.matchAt+=function(e){return new RegExp(e.toString()+\"|\").exec(\"\").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map((e=>e[1]));this.matcherRe=t(function(e,t=\"|\"){const n=/\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./;let r=0,o=\"\";for(let a=0;a<e.length;a++){r+=1;const i=r;let s=d(e[a]);for(a>0&&(o+=t),o+=\"(\";s.length>0;){const e=n.exec(s);if(null==e){o+=s;break}o+=s.substring(0,e.index),s=s.substring(e.index+e[0].length),\"\\\\\"===e[0][0]&&e[1]?o+=\"\\\\\"+String(Number(e[1])+i):(o+=e[0],\"(\"===e[0]&&r++)}o+=\")\"}return o}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e);if(!t)return null;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),r=this.matchIndexes[n];return t.splice(0,n),Object.assign(t,r)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))),t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){this.rules.push([e,t]),\"begin\"===t.type&&this.count++}exec(e){const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex;let n=t.exec(e);if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}return n&&(this.regexIndex+=n.position+1,this.regexIndex===this.count&&this.considerAll()),n}}function o(e,t){\".\"===e.input[e.index-1]&&t.ignoreMatch()}if(e.contains&&e.contains.includes(\"self\"))throw new Error(\"ERR: contains `self` is not supported at the top-level of a language.  See documentation.\");return e.classNameAliases=s(e.classNameAliases||{}),function n(a,i){const u=a;if(a.compiled)return u;a.compiled=!0,a.__beforeBegin=null,a.keywords=a.keywords||a.beginKeywords;let c=null;if(\"object\"==typeof a.keywords&&(c=a.keywords.$pattern,delete a.keywords.$pattern),a.keywords&&(a.keywords=function(e,t){const n={};\"string\"==typeof e?r(\"keyword\",e):Object.keys(e).forEach((function(t){r(t,e[t])}));return n;function r(e,r){t&&(r=r.toLowerCase()),r.split(\" \").forEach((function(t){const r=t.split(\"|\");n[r[0]]=[e,U(r[0],r[1])]}))}}(a.keywords,e.case_insensitive)),a.lexemes&&c)throw new Error(\"ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) \");return u.keywordPatternRe=t(a.lexemes||c||/\\w+/,!0),i&&(a.beginKeywords&&(a.begin=\"\\\\b(\"+a.beginKeywords.split(\" \").join(\"|\")+\")(?!\\\\.)(?=\\\\b|\\\\s)\",a.__beforeBegin=o),a.begin||(a.begin=/\\B|\\b/),u.beginRe=t(a.begin),a.endSameAsBegin&&(a.end=a.begin),a.end||a.endsWithParent||(a.end=/\\B|\\b/),a.end&&(u.endRe=t(a.end)),u.terminator_end=d(a.end)||\"\",a.endsWithParent&&i.terminator_end&&(u.terminator_end+=(a.end?\"|\":\"\")+i.terminator_end)),a.illegal&&(u.illegalRe=t(a.illegal)),void 0===a.relevance&&(a.relevance=1),a.contains||(a.contains=[]),a.contains=[].concat(...a.contains.map((function(e){return function(e){e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(t){return s(e,{variants:null},t)})));if(e.cached_variants)return e.cached_variants;if(F(e))return s(e,{starts:e.starts?s(e.starts):null});if(Object.isFrozen(e))return s(e);return e}(\"self\"===e?a:e)}))),a.contains.forEach((function(e){n(e,u)})),a.starts&&n(a.starts,i),u.matcher=function(e){const t=new r;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:\"begin\"}))),e.terminator_end&&t.addRule(e.terminator_end,{type:\"end\"}),e.illegal&&t.addRule(e.illegal,{type:\"illegal\"}),t}(u),u}(e)}function F(e){return!!e&&(e.endsWithParent||F(e.starts))}function U(e,t){return t?Number(t):function(e){return L.includes(e.toLowerCase())}(e)?0:1}function q(e){const t={props:[\"language\",\"code\",\"autodetect\"],data:function(){return{detectedLanguage:\"\",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?\"\":\"hljs \"+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!e.getLanguage(this.language))return console.warn(`The language \"${this.language}\" you specified could not be found.`),this.unknownLanguage=!0,i(this.code);let t;return this.autoDetect?(t=e.highlightAuto(this.code),this.detectedLanguage=t.language):(t=e.highlight(this.language,this.code,this.ignoreIllegals),this.detectedLanguage=this.language),t.value},autoDetect(){return!this.language||(e=this.autodetect,Boolean(e||\"\"===e));var e},ignoreIllegals:()=>!0},render(e){return e(\"pre\",{},[e(\"code\",{class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{Component:t,VuePlugin:{install(e){e.component(\"highlightjs\",t)}}}}const z=i,V=s,{nodeStream:W,mergeStreams:H}=c,$=Symbol(\"nomatch\");var J=function(e){const t=[],n=Object.create(null),o=Object.create(null),i=[];let s=!0;const u=/(^(<[^>]+>|\\t|)+|\\n)/gm,c=\"Could not find the language '{}', did you forget to load/include a language module?\",l={disableAutodetect:!0,name:\"Plain text\",contains:[]};let p={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\\blang(?:uage)?-([\\w-]+)\\b/i,classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:null,__emitter:h};function f(e){return p.noHighlightRe.test(e)}function d(e,t,n,r){const o={code:t,language:e};E(\"before:highlight\",o);const a=o.result?o.result:m(o.language,o.code,n,r);return a.code=o.code,E(\"after:highlight\",a),a}function m(e,t,r,o){const i=t;function u(e,t){const n=x.case_insensitive?t[0].toLowerCase():t[0];return Object.prototype.hasOwnProperty.call(e.keywords,n)&&e.keywords[n]}function l(){null!=C.subLanguage?function(){if(\"\"===O)return;let e=null;if(\"string\"==typeof C.subLanguage){if(!n[C.subLanguage])return void k.addText(O);e=m(C.subLanguage,O,!0,A[C.subLanguage]),A[C.subLanguage]=e.top}else e=v(O,C.subLanguage.length?C.subLanguage:null);C.relevance>0&&(j+=e.relevance),k.addSublanguage(e.emitter,e.language)}():function(){if(!C.keywords)return void k.addText(O);let e=0;C.keywordPatternRe.lastIndex=0;let t=C.keywordPatternRe.exec(O),n=\"\";for(;t;){n+=O.substring(e,t.index);const r=u(C,t);if(r){const[e,o]=r;k.addText(n),n=\"\",j+=o;const a=x.classNameAliases[e]||e;k.addKeyword(t[0],a)}else n+=t[0];e=C.keywordPatternRe.lastIndex,t=C.keywordPatternRe.exec(O)}n+=O.substr(e),k.addText(n)}(),O=\"\"}function f(e){return e.className&&k.openNode(x.classNameAliases[e.className]||e.className),C=Object.create(e,{parent:{value:C}}),C}function h(e,t,n){let r=function(e,t){const n=e&&e.exec(t);return n&&0===n.index}(e.endRe,n);if(r){if(e[\"on:end\"]){const n=new a(e);e[\"on:end\"](t,n),n.ignore&&(r=!1)}if(r){for(;e.endsParent&&e.parent;)e=e.parent;return e}}if(e.endsWithParent)return h(e.parent,t,n)}function d(e){return 0===C.matcher.regexIndex?(O+=e[0],1):(P=!0,0)}function g(e){const t=e[0],n=e.rule,r=new a(n),o=[n.__beforeBegin,n[\"on:begin\"]];for(const n of o)if(n&&(n(e,r),r.ignore))return d(t);return n&&n.endSameAsBegin&&(n.endRe=new RegExp(t.replace(/[-/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\"),\"m\")),n.skip?O+=t:(n.excludeBegin&&(O+=t),l(),n.returnBegin||n.excludeBegin||(O=t)),f(n),n.returnBegin?0:t.length}function y(e){const t=e[0],n=i.substr(e.index),r=h(C,e,n);if(!r)return $;const o=C;o.skip?O+=t:(o.returnEnd||o.excludeEnd||(O+=t),l(),o.excludeEnd&&(O=t));do{C.className&&k.closeNode(),C.skip||C.subLanguage||(j+=C.relevance),C=C.parent}while(C!==r.parent);return r.starts&&(r.endSameAsBegin&&(r.starts.endRe=r.endRe),f(r.starts)),o.returnEnd?0:t.length}let b={};function w(t,n){const o=n&&n[0];if(O+=t,null==o)return l(),0;if(\"begin\"===b.type&&\"end\"===n.type&&b.index===n.index&&\"\"===o){if(O+=i.slice(n.index,n.index+1),!s){const t=new Error(\"0 width match regex\");throw t.languageName=e,t.badRule=b.rule,t}return 1}if(b=n,\"begin\"===n.type)return g(n);if(\"illegal\"===n.type&&!r){const e=new Error('Illegal lexeme \"'+o+'\" for mode \"'+(C.className||\"<unnamed>\")+'\"');throw e.mode=C,e}if(\"end\"===n.type){const e=y(n);if(e!==$)return e}if(\"illegal\"===n.type&&\"\"===o)return 1;if(I>1e5&&I>3*n.index){throw new Error(\"potential infinite loop, way more iterations than matches\")}return O+=o,o.length}const x=_(e);if(!x)throw console.error(c.replace(\"{}\",e)),new Error('Unknown language: \"'+e+'\"');const E=B(x);let S=\"\",C=o||E;const A={},k=new p.__emitter(p);!function(){const e=[];for(let t=C;t!==x;t=t.parent)t.className&&e.unshift(t.className);e.forEach((e=>k.openNode(e)))}();let O=\"\",j=0,T=0,I=0,P=!1;try{for(C.matcher.considerAll();;){I++,P?P=!1:C.matcher.considerAll(),C.matcher.lastIndex=T;const e=C.matcher.exec(i);if(!e)break;const t=w(i.substring(T,e.index),e);T=e.index+t}return w(i.substr(T)),k.closeAllNodes(),k.finalize(),S=k.toHTML(),{relevance:j,value:S,language:e,illegal:!1,emitter:k,top:C}}catch(t){if(t.message&&t.message.includes(\"Illegal\"))return{illegal:!0,illegalBy:{msg:t.message,context:i.slice(T-100,T+100),mode:t.mode},sofar:S,relevance:0,value:z(i),emitter:k};if(s)return{illegal:!1,relevance:0,value:z(i),emitter:k,language:e,top:C,errorRaised:t};throw t}}function v(e,t){t=t||p.languages||Object.keys(n);const r=function(e){const t={relevance:0,emitter:new p.__emitter(p),value:z(e),illegal:!1,top:l};return t.emitter.addText(e),t}(e),o=t.filter(_).filter(x).map((t=>m(t,e,!1)));o.unshift(r);const a=o.sort(((e,t)=>{if(e.relevance!==t.relevance)return t.relevance-e.relevance;if(e.language&&t.language){if(_(e.language).supersetOf===t.language)return 1;if(_(t.language).supersetOf===e.language)return-1}return 0})),[i,s]=a,u=i;return u.second_best=s,u}function g(e){return p.tabReplace||p.useBR?e.replace(u,(e=>\"\\n\"===e?p.useBR?\"<br>\":e:p.tabReplace?e.replace(/\\t/g,p.tabReplace):e)):e}function y(e){let t=null;const n=function(e){let t=e.className+\" \";t+=e.parentNode?e.parentNode.className:\"\";const n=p.languageDetectRe.exec(t);if(n){const t=_(n[1]);return t||(console.warn(c.replace(\"{}\",n[1])),console.warn(\"Falling back to no-highlight mode for this block.\",e)),t?n[1]:\"no-highlight\"}return t.split(/\\s+/).find((e=>f(e)||_(e)))}(e);if(f(n))return;E(\"before:highlightBlock\",{block:e,language:n}),p.useBR?(t=document.createElement(\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ /]*>/g,\"\\n\")):t=e;const r=t.textContent,a=n?d(n,r,!0):v(r),i=W(t);if(i.length){const e=document.createElement(\"div\");e.innerHTML=a.value,a.value=H(i,W(e),r)}a.value=g(a.value),E(\"after:highlightBlock\",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,t,n){const r=t?o[t]:n,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),e.includes(r)||a.push(r),a.join(\" \").trim()}(e.className,n,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const b=()=>{if(b.called)return;b.called=!0;const e=document.querySelectorAll(\"pre code\");t.forEach.call(e,y)};function _(e){return e=(e||\"\").toLowerCase(),n[e]||n[o[e]]}function w(e,{languageName:t}){\"string\"==typeof e&&(e=[e]),e.forEach((e=>{o[e]=t}))}function x(e){const t=_(e);return t&&!t.disableAutodetect}function E(e,t){const n=e;i.forEach((function(e){e[n]&&e[n](t)}))}Object.assign(e,{highlight:d,highlightAuto:v,fixMarkup:function(e){return console.warn(\"fixMarkup is deprecated and will be removed entirely in v11.0\"),console.warn(\"Please see https://github.com/highlightjs/highlight.js/issues/2534\"),g(e)},highlightBlock:y,configure:function(e){e.useBR&&(console.warn(\"'useBR' option is deprecated and will be removed entirely in v11.0\"),console.warn(\"Please see https://github.com/highlightjs/highlight.js/issues/2559\")),p=V(p,e)},initHighlighting:b,initHighlightingOnLoad:function(){window.addEventListener(\"DOMContentLoaded\",b,!1)},registerLanguage:function(t,r){let o=null;try{o=r(e)}catch(e){if(console.error(\"Language definition for '{}' could not be registered.\".replace(\"{}\",t)),!s)throw e;console.error(e),o=l}o.name||(o.name=t),n[t]=o,o.rawDefinition=r.bind(null,e),o.aliases&&w(o.aliases,{languageName:t})},listLanguages:function(){return Object.keys(n)},getLanguage:_,registerAliases:w,requireLanguage:function(e){console.warn(\"requireLanguage is deprecated and will be removed entirely in the future.\"),console.warn(\"Please see https://github.com/highlightjs/highlight.js/pull/2844\");const t=_(e);if(t)return t;throw new Error(\"The '{}' language is required, but not loaded.\".replace(\"{}\",e))},autoDetection:x,inherit:V,addPlugin:function(e){i.push(e)},vuePlugin:q(e).VuePlugin}),e.debugMode=function(){s=!1},e.safeMode=function(){s=!0},e.versionString=\"10.4.1\";for(const e in D)\"object\"==typeof D[e]&&r(D[e]);return Object.assign(e,D),e}({});e.exports=J},function(e,t,n){\"use strict\";var r=n(1042),o=a(Error);function a(e){return t.displayName=e.displayName||e.name,t;function t(t){return t&&(t=r.apply(null,arguments)),new e(t)}}e.exports=o,o.eval=a(EvalError),o.range=a(RangeError),o.reference=a(ReferenceError),o.syntax=a(SyntaxError),o.type=a(TypeError),o.uri=a(URIError),o.create=a},function(e,t,n){!function(){var t;function n(e){for(var t,n,r,o,a=1,i=[].slice.call(arguments),s=0,u=e.length,c=\"\",l=!1,p=!1,f=function(){return i[a++]},h=function(){for(var n=\"\";/\\d/.test(e[s]);)n+=e[s++],t=e[s];return n.length>0?parseInt(n):null};s<u;++s)if(t=e[s],l)switch(l=!1,\".\"==t?(p=!1,t=e[++s]):\"0\"==t&&\".\"==e[s+1]?(p=!0,t=e[s+=2]):p=!0,o=h(),t){case\"b\":c+=parseInt(f(),10).toString(2);break;case\"c\":c+=\"string\"==typeof(n=f())||n instanceof String?n:String.fromCharCode(parseInt(n,10));break;case\"d\":c+=parseInt(f(),10);break;case\"f\":r=String(parseFloat(f()).toFixed(o||6)),c+=p?r:r.replace(/^0/,\"\");break;case\"j\":c+=JSON.stringify(f());break;case\"o\":c+=\"0\"+parseInt(f(),10).toString(8);break;case\"s\":c+=f();break;case\"x\":c+=\"0x\"+parseInt(f(),10).toString(16);break;case\"X\":c+=\"0x\"+parseInt(f(),10).toString(16).toUpperCase();break;default:c+=t}else\"%\"===t?l=!0:c+=t;return c}(t=e.exports=n).format=n,t.vsprintf=function(e,t){return n.apply(null,[e].concat(t))},\"undefined\"!=typeof console&&\"function\"==typeof console.log&&(t.printf=function(){console.log(n.apply(null,arguments))})}()},function(e,t){e.exports=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}},function(e,t,n){var r=n(500);e.exports=function(e){if(Array.isArray(e))return r(e)}},function(e,t){e.exports=function(e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}},function(e,t,n){var r=n(500);e.exports=function(e,t){if(e){if(\"string\"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return\"Object\"===n&&e.constructor&&(n=e.constructor.name),\"Map\"===n||\"Set\"===n?Array.from(e):\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}},function(e,t){e.exports=function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}},function(e,t){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},function(e,t,n){var r=n(394);e.exports=r},function(e,t,n){var r=n(1051);e.exports=r},function(e,t,n){n(1052);var r=n(34);e.exports=r.Object.entries},function(e,t,n){var r=n(21),o=n(461).entries;r({target:\"Object\",stat:!0},{entries:function(e){return o(e)}})},function(e,t,n){\"use strict\";var r=n(1054),o=n(502),a=n(283),i=Object.prototype.hasOwnProperty,s={brackets:function(e){return e+\"[]\"},comma:\"comma\",indices:function(e,t){return e+\"[\"+t+\"]\"},repeat:function(e){return e}},u=Array.isArray,c=Array.prototype.push,l=function(e,t){c.apply(e,u(t)?t:[t])},p=Date.prototype.toISOString,f=a.default,h={addQueryPrefix:!1,allowDots:!1,charset:\"utf-8\",charsetSentinel:!1,delimiter:\"&\",encode:!0,encoder:o.encode,encodeValuesOnly:!1,format:f,formatter:a.formatters[f],indices:!1,serializeDate:function(e){return p.call(e)},skipNulls:!1,strictNullHandling:!1},d=function e(t,n,a,i,s,c,p,f,d,m,v,g,y,b,_){var w,x=t;if(_.has(t))throw new RangeError(\"Cyclic object value\");if(\"function\"==typeof p?x=p(n,x):x instanceof Date?x=m(x):\"comma\"===a&&u(x)&&(x=o.maybeMap(x,(function(e){return e instanceof Date?m(e):e}))),null===x){if(i)return c&&!y?c(n,h.encoder,b,\"key\",v):n;x=\"\"}if(\"string\"==typeof(w=x)||\"number\"==typeof w||\"boolean\"==typeof w||\"symbol\"==typeof w||\"bigint\"==typeof w||o.isBuffer(x))return c?[g(y?n:c(n,h.encoder,b,\"key\",v))+\"=\"+g(c(x,h.encoder,b,\"value\",v))]:[g(n)+\"=\"+g(String(x))];var E,S=[];if(void 0===x)return S;if(\"comma\"===a&&u(x))E=[{value:x.length>0?x.join(\",\")||null:void 0}];else if(u(p))E=p;else{var C=Object.keys(x);E=f?C.sort(f):C}for(var A=0;A<E.length;++A){var k=E[A],O=\"object\"==typeof k&&void 0!==k.value?k.value:x[k];if(!s||null!==O){var j=u(x)?\"function\"==typeof a?a(n,k):n:n+(d?\".\"+k:\"[\"+k+\"]\");_.set(t,!0);var T=r();l(S,e(O,j,a,i,s,c,p,f,d,m,v,g,y,b,T))}}return S};e.exports=function(e,t){var n,o=e,c=function(e){if(!e)return h;if(null!==e.encoder&&void 0!==e.encoder&&\"function\"!=typeof e.encoder)throw new TypeError(\"Encoder has to be a function.\");var t=e.charset||h.charset;if(void 0!==e.charset&&\"utf-8\"!==e.charset&&\"iso-8859-1\"!==e.charset)throw new TypeError(\"The charset option must be either utf-8, iso-8859-1, or undefined\");var n=a.default;if(void 0!==e.format){if(!i.call(a.formatters,e.format))throw new TypeError(\"Unknown format option provided.\");n=e.format}var r=a.formatters[n],o=h.filter;return(\"function\"==typeof e.filter||u(e.filter))&&(o=e.filter),{addQueryPrefix:\"boolean\"==typeof e.addQueryPrefix?e.addQueryPrefix:h.addQueryPrefix,allowDots:void 0===e.allowDots?h.allowDots:!!e.allowDots,charset:t,charsetSentinel:\"boolean\"==typeof e.charsetSentinel?e.charsetSentinel:h.charsetSentinel,delimiter:void 0===e.delimiter?h.delimiter:e.delimiter,encode:\"boolean\"==typeof e.encode?e.encode:h.encode,encoder:\"function\"==typeof e.encoder?e.encoder:h.encoder,encodeValuesOnly:\"boolean\"==typeof e.encodeValuesOnly?e.encodeValuesOnly:h.encodeValuesOnly,filter:o,format:n,formatter:r,serializeDate:\"function\"==typeof e.serializeDate?e.serializeDate:h.serializeDate,skipNulls:\"boolean\"==typeof e.skipNulls?e.skipNulls:h.skipNulls,sort:\"function\"==typeof e.sort?e.sort:null,strictNullHandling:\"boolean\"==typeof e.strictNullHandling?e.strictNullHandling:h.strictNullHandling}}(t);\"function\"==typeof c.filter?o=(0,c.filter)(\"\",o):u(c.filter)&&(n=c.filter);var p,f=[];if(\"object\"!=typeof o||null===o)return\"\";p=t&&t.arrayFormat in s?t.arrayFormat:t&&\"indices\"in t?t.indices?\"indices\":\"repeat\":\"indices\";var m=s[p];n||(n=Object.keys(o)),c.sort&&n.sort(c.sort);for(var v=r(),g=0;g<n.length;++g){var y=n[g];c.skipNulls&&null===o[y]||l(f,d(o[y],y,m,c.strictNullHandling,c.skipNulls,c.encode?c.encoder:null,c.filter,c.sort,c.allowDots,c.serializeDate,c.format,c.formatter,c.encodeValuesOnly,c.charset,v))}var b=f.join(c.delimiter),_=!0===c.addQueryPrefix?\"?\":\"\";return c.charsetSentinel&&(\"iso-8859-1\"===c.charset?_+=\"utf8=%26%2310003%3B&\":_+=\"utf8=%E2%9C%93&\"),b.length>0?_+b:\"\"}},function(e,t,n){\"use strict\";var r=n(281),o=n(1059),a=n(1061),i=r(\"%TypeError%\"),s=r(\"%WeakMap%\",!0),u=r(\"%Map%\",!0),c=o(\"WeakMap.prototype.get\",!0),l=o(\"WeakMap.prototype.set\",!0),p=o(\"WeakMap.prototype.has\",!0),f=o(\"Map.prototype.get\",!0),h=o(\"Map.prototype.set\",!0),d=o(\"Map.prototype.has\",!0),m=function(e,t){for(var n,r=e;null!==(n=r.next);r=n)if(n.key===t)return r.next=n.next,n.next=e.next,e.next=n,n};e.exports=function(){var e,t,n,r={assert:function(e){if(!r.has(e))throw new i(\"Side channel does not contain \"+a(e))},get:function(r){if(s&&r&&(\"object\"==typeof r||\"function\"==typeof r)){if(e)return c(e,r)}else if(u){if(t)return f(t,r)}else if(n)return function(e,t){var n=m(e,t);return n&&n.value}(n,r)},has:function(r){if(s&&r&&(\"object\"==typeof r||\"function\"==typeof r)){if(e)return p(e,r)}else if(u){if(t)return d(t,r)}else if(n)return function(e,t){return!!m(e,t)}(n,r);return!1},set:function(r,o){s&&r&&(\"object\"==typeof r||\"function\"==typeof r)?(e||(e=new s),l(e,r,o)):u?(t||(t=new u),h(t,r,o)):(n||(n={key:{},next:null}),function(e,t,n){var r=m(e,t);r?r.value=n:e.next={key:t,next:e.next,value:n}}(n,r,o))}};return r}},function(e,t,n){\"use strict\";var r=\"undefined\"!=typeof Symbol&&Symbol,o=n(1056);e.exports=function(){return\"function\"==typeof r&&(\"function\"==typeof Symbol&&(\"symbol\"==typeof r(\"foo\")&&(\"symbol\"==typeof Symbol(\"bar\")&&o())))}},function(e,t,n){\"use strict\";e.exports=function(){if(\"function\"!=typeof Symbol||\"function\"!=typeof Object.getOwnPropertySymbols)return!1;if(\"symbol\"==typeof Symbol.iterator)return!0;var e={},t=Symbol(\"test\"),n=Object(t);if(\"string\"==typeof t)return!1;if(\"[object Symbol]\"!==Object.prototype.toString.call(t))return!1;if(\"[object Symbol]\"!==Object.prototype.toString.call(n))return!1;for(t in e[t]=42,e)return!1;if(\"function\"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if(\"function\"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var r=Object.getOwnPropertySymbols(e);if(1!==r.length||r[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if(\"function\"==typeof Object.getOwnPropertyDescriptor){var o=Object.getOwnPropertyDescriptor(e,t);if(42!==o.value||!0!==o.enumerable)return!1}return!0}},function(e,t,n){\"use strict\";var r=\"Function.prototype.bind called on incompatible \",o=Array.prototype.slice,a=Object.prototype.toString,i=\"[object Function]\";e.exports=function(e){var t=this;if(\"function\"!=typeof t||a.call(t)!==i)throw new TypeError(r+t);for(var n,s=o.call(arguments,1),u=function(){if(this instanceof n){var r=t.apply(this,s.concat(o.call(arguments)));return Object(r)===r?r:this}return t.apply(e,s.concat(o.call(arguments)))},c=Math.max(0,t.length-s.length),l=[],p=0;p<c;p++)l.push(\"$\"+p);if(n=Function(\"binder\",\"return function (\"+l.join(\",\")+\"){ return binder.apply(this,arguments); }\")(u),t.prototype){var f=function(){};f.prototype=t.prototype,n.prototype=new f,f.prototype=null}return n}},function(e,t,n){\"use strict\";var r=n(282);e.exports=r.call(Function.call,Object.prototype.hasOwnProperty)},function(e,t,n){\"use strict\";var r=n(281),o=n(1060),a=o(r(\"String.prototype.indexOf\"));e.exports=function(e,t){var n=r(e,!!t);return\"function\"==typeof n&&a(e,\".prototype.\")>-1?o(n):n}},function(e,t,n){\"use strict\";var r=n(282),o=n(281),a=o(\"%Function.prototype.apply%\"),i=o(\"%Function.prototype.call%\"),s=o(\"%Reflect.apply%\",!0)||r.call(i,a),u=o(\"%Object.getOwnPropertyDescriptor%\",!0),c=o(\"%Object.defineProperty%\",!0),l=o(\"%Math.max%\");if(c)try{c({},\"a\",{value:1})}catch(e){c=null}e.exports=function(e){var t=s(r,i,arguments);if(u&&c){var n=u(t,\"length\");n.configurable&&c(t,\"length\",{value:1+l(0,e.length-(arguments.length-1))})}return t};var p=function(){return s(r,a,arguments)};c?c(e.exports,\"apply\",{value:p}):e.exports.apply=p},function(e,t,n){var r=\"function\"==typeof Map&&Map.prototype,o=Object.getOwnPropertyDescriptor&&r?Object.getOwnPropertyDescriptor(Map.prototype,\"size\"):null,a=r&&o&&\"function\"==typeof o.get?o.get:null,i=r&&Map.prototype.forEach,s=\"function\"==typeof Set&&Set.prototype,u=Object.getOwnPropertyDescriptor&&s?Object.getOwnPropertyDescriptor(Set.prototype,\"size\"):null,c=s&&u&&\"function\"==typeof u.get?u.get:null,l=s&&Set.prototype.forEach,p=\"function\"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,f=\"function\"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,h=Boolean.prototype.valueOf,d=Object.prototype.toString,m=Function.prototype.toString,v=String.prototype.match,g=\"function\"==typeof BigInt?BigInt.prototype.valueOf:null,y=Object.getOwnPropertySymbols,b=\"function\"==typeof Symbol?Symbol.prototype.toString:null,_=Object.prototype.propertyIsEnumerable,w=n(1062).custom,x=w&&A(w)?w:null;function E(e,t,n){var r=\"double\"===(n.quoteStyle||t)?'\"':\"'\";return r+e+r}function S(e){return String(e).replace(/\"/g,\"&quot;\")}function C(e){return\"[object Array]\"===j(e)}function A(e){return\"[object Symbol]\"===j(e)}e.exports=function e(t,n,r,o){var s=n||{};if(O(s,\"quoteStyle\")&&\"single\"!==s.quoteStyle&&\"double\"!==s.quoteStyle)throw new TypeError('option \"quoteStyle\" must be \"single\" or \"double\"');if(O(s,\"maxStringLength\")&&(\"number\"==typeof s.maxStringLength?s.maxStringLength<0&&s.maxStringLength!==1/0:null!==s.maxStringLength))throw new TypeError('option \"maxStringLength\", if provided, must be a positive integer, Infinity, or `null`');var u=!O(s,\"customInspect\")||s.customInspect;if(\"boolean\"!=typeof u)throw new TypeError('option \"customInspect\", if provided, must be `true` or `false`');if(O(s,\"indent\")&&null!==s.indent&&\"\\t\"!==s.indent&&!(parseInt(s.indent,10)===s.indent&&s.indent>0))throw new TypeError('options \"indent\" must be \"\\\\t\", an integer > 0, or `null`');if(void 0===t)return\"undefined\";if(null===t)return\"null\";if(\"boolean\"==typeof t)return t?\"true\":\"false\";if(\"string\"==typeof t)return I(t,s);if(\"number\"==typeof t)return 0===t?1/0/t>0?\"0\":\"-0\":String(t);if(\"bigint\"==typeof t)return String(t)+\"n\";var d=void 0===s.depth?5:s.depth;if(void 0===r&&(r=0),r>=d&&d>0&&\"object\"==typeof t)return C(t)?\"[Array]\":\"[Object]\";var y=function(e,t){var n;if(\"\\t\"===e.indent)n=\"\\t\";else{if(!(\"number\"==typeof e.indent&&e.indent>0))return null;n=Array(e.indent+1).join(\" \")}return{base:n,prev:Array(t+1).join(n)}}(s,r);if(void 0===o)o=[];else if(T(o,t)>=0)return\"[Circular]\";function _(t,n,a){if(n&&(o=o.slice()).push(n),a){var i={depth:s.depth};return O(s,\"quoteStyle\")&&(i.quoteStyle=s.quoteStyle),e(t,i,r+1,o)}return e(t,s,r+1,o)}if(\"function\"==typeof t){var w=function(e){if(e.name)return e.name;var t=v.call(m.call(e),/^function\\s*([\\w$]+)/);if(t)return t[1];return null}(t),k=L(t,_);return\"[Function\"+(w?\": \"+w:\" (anonymous)\")+\"]\"+(k.length>0?\" { \"+k.join(\", \")+\" }\":\"\")}if(A(t)){var P=b.call(t);return\"object\"==typeof t?N(P):P}if(function(e){if(!e||\"object\"!=typeof e)return!1;if(\"undefined\"!=typeof HTMLElement&&e instanceof HTMLElement)return!0;return\"string\"==typeof e.nodeName&&\"function\"==typeof e.getAttribute}(t)){for(var B=\"<\"+String(t.nodeName).toLowerCase(),F=t.attributes||[],U=0;U<F.length;U++)B+=\" \"+F[U].name+\"=\"+E(S(F[U].value),\"double\",s);return B+=\">\",t.childNodes&&t.childNodes.length&&(B+=\"...\"),B+=\"</\"+String(t.nodeName).toLowerCase()+\">\"}if(C(t)){if(0===t.length)return\"[]\";var q=L(t,_);return y&&!function(e){for(var t=0;t<e.length;t++)if(T(e[t],\"\\n\")>=0)return!1;return!0}(q)?\"[\"+D(q,y)+\"]\":\"[ \"+q.join(\", \")+\" ]\"}if(function(e){return\"[object Error]\"===j(e)}(t)){var z=L(t,_);return 0===z.length?\"[\"+String(t)+\"]\":\"{ [\"+String(t)+\"] \"+z.join(\", \")+\" }\"}if(\"object\"==typeof t&&u){if(x&&\"function\"==typeof t[x])return t[x]();if(\"function\"==typeof t.inspect)return t.inspect()}if(function(e){if(!a||!e||\"object\"!=typeof e)return!1;try{a.call(e);try{c.call(e)}catch(e){return!0}return e instanceof Map}catch(e){}return!1}(t)){var V=[];return i.call(t,(function(e,n){V.push(_(n,t,!0)+\" => \"+_(e,t))})),R(\"Map\",a.call(t),V,y)}if(function(e){if(!c||!e||\"object\"!=typeof e)return!1;try{c.call(e);try{a.call(e)}catch(e){return!0}return e instanceof Set}catch(e){}return!1}(t)){var W=[];return l.call(t,(function(e){W.push(_(e,t))})),R(\"Set\",c.call(t),W,y)}if(function(e){if(!p||!e||\"object\"!=typeof e)return!1;try{p.call(e,p);try{f.call(e,f)}catch(e){return!0}return e instanceof WeakMap}catch(e){}return!1}(t))return M(\"WeakMap\");if(function(e){if(!f||!e||\"object\"!=typeof e)return!1;try{f.call(e,f);try{p.call(e,p)}catch(e){return!0}return e instanceof WeakSet}catch(e){}return!1}(t))return M(\"WeakSet\");if(function(e){return\"[object Number]\"===j(e)}(t))return N(_(Number(t)));if(function(e){return\"[object BigInt]\"===j(e)}(t))return N(_(g.call(t)));if(function(e){return\"[object Boolean]\"===j(e)}(t))return N(h.call(t));if(function(e){return\"[object String]\"===j(e)}(t))return N(_(String(t)));if(!function(e){return\"[object Date]\"===j(e)}(t)&&!function(e){return\"[object RegExp]\"===j(e)}(t)){var H=L(t,_);return 0===H.length?\"{}\":y?\"{\"+D(H,y)+\"}\":\"{ \"+H.join(\", \")+\" }\"}return String(t)};var k=Object.prototype.hasOwnProperty||function(e){return e in this};function O(e,t){return k.call(e,t)}function j(e){return d.call(e)}function T(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1}function I(e,t){if(e.length>t.maxStringLength){var n=e.length-t.maxStringLength,r=\"... \"+n+\" more character\"+(n>1?\"s\":\"\");return I(e.slice(0,t.maxStringLength),t)+r}return E(e.replace(/(['\\\\])/g,\"\\\\$1\").replace(/[\\x00-\\x1f]/g,P),\"single\",t)}function P(e){var t=e.charCodeAt(0),n={8:\"b\",9:\"t\",10:\"n\",12:\"f\",13:\"r\"}[t];return n?\"\\\\\"+n:\"\\\\x\"+(t<16?\"0\":\"\")+t.toString(16).toUpperCase()}function N(e){return\"Object(\"+e+\")\"}function M(e){return e+\" { ? }\"}function R(e,t,n,r){return e+\" (\"+t+\") {\"+(r?D(n,r):n.join(\", \"))+\"}\"}function D(e,t){if(0===e.length)return\"\";var n=\"\\n\"+t.prev+t.base;return n+e.join(\",\"+n)+\"\\n\"+t.prev}function L(e,t){var n=C(e),r=[];if(n){r.length=e.length;for(var o=0;o<e.length;o++)r[o]=O(e,o)?t(e[o],e):\"\"}for(var a in e)O(e,a)&&(n&&String(Number(a))===a&&a<e.length||(/[^\\w$]/.test(a)?r.push(t(a,e)+\": \"+t(e[a],e)):r.push(a+\": \"+t(e[a],e))));if(\"function\"==typeof y)for(var i=y(e),s=0;s<i.length;s++)_.call(e,i[s])&&r.push(\"[\"+t(i[s])+\"]: \"+t(e[i[s]],e));return r}},function(e,t){},function(e,t,n){\"use strict\";var r=n(502),o=Object.prototype.hasOwnProperty,a=Array.isArray,i={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:\"utf-8\",charsetSentinel:!1,comma:!1,decoder:r.decode,delimiter:\"&\",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},s=function(e){return e.replace(/&#(\\d+);/g,(function(e,t){return String.fromCharCode(parseInt(t,10))}))},u=function(e,t){return e&&\"string\"==typeof e&&t.comma&&e.indexOf(\",\")>-1?e.split(\",\"):e},c=function(e,t,n,r){if(e){var a=n.allowDots?e.replace(/\\.([^.[]+)/g,\"[$1]\"):e,i=/(\\[[^[\\]]*])/g,s=n.depth>0&&/(\\[[^[\\]]*])/.exec(a),c=s?a.slice(0,s.index):a,l=[];if(c){if(!n.plainObjects&&o.call(Object.prototype,c)&&!n.allowPrototypes)return;l.push(c)}for(var p=0;n.depth>0&&null!==(s=i.exec(a))&&p<n.depth;){if(p+=1,!n.plainObjects&&o.call(Object.prototype,s[1].slice(1,-1))&&!n.allowPrototypes)return;l.push(s[1])}return s&&l.push(\"[\"+a.slice(s.index)+\"]\"),function(e,t,n,r){for(var o=r?t:u(t,n),a=e.length-1;a>=0;--a){var i,s=e[a];if(\"[]\"===s&&n.parseArrays)i=[].concat(o);else{i=n.plainObjects?Object.create(null):{};var c=\"[\"===s.charAt(0)&&\"]\"===s.charAt(s.length-1)?s.slice(1,-1):s,l=parseInt(c,10);n.parseArrays||\"\"!==c?!isNaN(l)&&s!==c&&String(l)===c&&l>=0&&n.parseArrays&&l<=n.arrayLimit?(i=[])[l]=o:i[c]=o:i={0:o}}o=i}return o}(l,t,n,r)}};e.exports=function(e,t){var n=function(e){if(!e)return i;if(null!==e.decoder&&void 0!==e.decoder&&\"function\"!=typeof e.decoder)throw new TypeError(\"Decoder has to be a function.\");if(void 0!==e.charset&&\"utf-8\"!==e.charset&&\"iso-8859-1\"!==e.charset)throw new TypeError(\"The charset option must be either utf-8, iso-8859-1, or undefined\");var t=void 0===e.charset?i.charset:e.charset;return{allowDots:void 0===e.allowDots?i.allowDots:!!e.allowDots,allowPrototypes:\"boolean\"==typeof e.allowPrototypes?e.allowPrototypes:i.allowPrototypes,allowSparse:\"boolean\"==typeof e.allowSparse?e.allowSparse:i.allowSparse,arrayLimit:\"number\"==typeof e.arrayLimit?e.arrayLimit:i.arrayLimit,charset:t,charsetSentinel:\"boolean\"==typeof e.charsetSentinel?e.charsetSentinel:i.charsetSentinel,comma:\"boolean\"==typeof e.comma?e.comma:i.comma,decoder:\"function\"==typeof e.decoder?e.decoder:i.decoder,delimiter:\"string\"==typeof e.delimiter||r.isRegExp(e.delimiter)?e.delimiter:i.delimiter,depth:\"number\"==typeof e.depth||!1===e.depth?+e.depth:i.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:\"boolean\"==typeof e.interpretNumericEntities?e.interpretNumericEntities:i.interpretNumericEntities,parameterLimit:\"number\"==typeof e.parameterLimit?e.parameterLimit:i.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:\"boolean\"==typeof e.plainObjects?e.plainObjects:i.plainObjects,strictNullHandling:\"boolean\"==typeof e.strictNullHandling?e.strictNullHandling:i.strictNullHandling}}(t);if(\"\"===e||null==e)return n.plainObjects?Object.create(null):{};for(var l=\"string\"==typeof e?function(e,t){var n,c={},l=t.ignoreQueryPrefix?e.replace(/^\\?/,\"\"):e,p=t.parameterLimit===1/0?void 0:t.parameterLimit,f=l.split(t.delimiter,p),h=-1,d=t.charset;if(t.charsetSentinel)for(n=0;n<f.length;++n)0===f[n].indexOf(\"utf8=\")&&(\"utf8=%E2%9C%93\"===f[n]?d=\"utf-8\":\"utf8=%26%2310003%3B\"===f[n]&&(d=\"iso-8859-1\"),h=n,n=f.length);for(n=0;n<f.length;++n)if(n!==h){var m,v,g=f[n],y=g.indexOf(\"]=\"),b=-1===y?g.indexOf(\"=\"):y+1;-1===b?(m=t.decoder(g,i.decoder,d,\"key\"),v=t.strictNullHandling?null:\"\"):(m=t.decoder(g.slice(0,b),i.decoder,d,\"key\"),v=r.maybeMap(u(g.slice(b+1),t),(function(e){return t.decoder(e,i.decoder,d,\"value\")}))),v&&t.interpretNumericEntities&&\"iso-8859-1\"===d&&(v=s(v)),g.indexOf(\"[]=\")>-1&&(v=a(v)?[v]:v),o.call(c,m)?c[m]=r.combine(c[m],v):c[m]=v}return c}(e,n):e,p=n.plainObjects?Object.create(null):{},f=Object.keys(l),h=0;h<f.length;++h){var d=f[h],m=c(d,l[d],n,\"string\"==typeof e);p=r.merge(p,m,n)}return!0===n.allowSparse?p:r.compact(p)}},function(e,t,n){var r=n(1065),o=n(425);e.exports=function(e,t){return r(e,t,(function(t,n){return o(e,n)}))}},function(e,t,n){var r=n(196),o=n(462),a=n(135);e.exports=function(e,t,n){for(var i=-1,s=t.length,u={};++i<s;){var c=t[i],l=r(e,c);n(l,c)&&o(u,a(c,e),l)}return u}},function(e,t,n){var r=n(1067);e.exports=r},function(e,t,n){var r=n(1068),o=Array.prototype;e.exports=function(e){var t=e.splice;return e===o||e instanceof Array&&t===o.splice?r:t}},function(e,t,n){n(1069);var r=n(42);e.exports=r(\"Array\").splice},function(e,t,n){\"use strict\";var r=n(21),o=n(232),a=n(128),i=n(69),s=n(60),u=n(226),c=n(153),l=n(154)(\"splice\"),p=Math.max,f=Math.min,h=9007199254740991,d=\"Maximum allowed length exceeded\";r({target:\"Array\",proto:!0,forced:!l},{splice:function(e,t){var n,r,l,m,v,g,y=s(this),b=i(y.length),_=o(e,b),w=arguments.length;if(0===w?n=r=0:1===w?(n=0,r=b-_):(n=w-2,r=f(p(a(t),0),b-_)),b+n-r>h)throw TypeError(d);for(l=u(y,r),m=0;m<r;m++)(v=_+m)in y&&c(l,m,y[v]);if(l.length=r,n<r){for(m=_;m<b-r;m++)g=m+n,(v=m+r)in y?y[g]=y[v]:delete y[g];for(m=b;m>b-r+n;m--)delete y[m-1]}else if(n>r)for(m=b-r;m>_;m--)g=m+n-1,(v=m+r-1)in y?y[g]=y[v]:delete y[g];for(m=0;m<n;m++)y[m+_]=arguments[m+2];return y.length=b-r+n,l}})},function(e,t,n){var r=n(1071);e.exports=r},function(e,t,n){n(180),n(1072),n(87);var r=n(34);e.exports=r.WeakMap},function(e,t,n){\"use strict\";var r,o=n(40),a=n(163),i=n(207),s=n(503),u=n(1074),c=n(47),l=n(78).enforce,p=n(367),f=!o.ActiveXObject&&\"ActiveXObject\"in o,h=Object.isExtensible,d=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},m=e.exports=s(\"WeakMap\",d,u);if(p&&f){r=u.getConstructor(d,\"WeakMap\",!0),i.REQUIRED=!0;var v=m.prototype,g=v.delete,y=v.has,b=v.get,_=v.set;a(v,{delete:function(e){if(c(e)&&!h(e)){var t=l(this);return t.frozen||(t.frozen=new r),g.call(this,e)||t.frozen.delete(e)}return g.call(this,e)},has:function(e){if(c(e)&&!h(e)){var t=l(this);return t.frozen||(t.frozen=new r),y.call(this,e)||t.frozen.has(e)}return y.call(this,e)},get:function(e){if(c(e)&&!h(e)){var t=l(this);return t.frozen||(t.frozen=new r),y.call(this,e)?b.call(this,e):t.frozen.get(e)}return b.call(this,e)},set:function(e,t){if(c(e)&&!h(e)){var n=l(this);n.frozen||(n.frozen=new r),y.call(this,e)?_.call(this,e,t):n.frozen.set(e,t)}else _.call(this,e,t);return this}})}},function(e,t,n){var r=n(37);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},function(e,t,n){\"use strict\";var r=n(163),o=n(207).getWeakData,a=n(52),i=n(47),s=n(139),u=n(121),c=n(86),l=n(55),p=n(78),f=p.set,h=p.getterFor,d=c.find,m=c.findIndex,v=0,g=function(e){return e.frozen||(e.frozen=new y)},y=function(){this.entries=[]},b=function(e,t){return d(e.entries,(function(e){return e[0]===t}))};y.prototype={get:function(e){var t=b(this,e);if(t)return t[1]},has:function(e){return!!b(this,e)},set:function(e,t){var n=b(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=m(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,c){var p=e((function(e,r){s(e,p,t),f(e,{type:t,id:v++,frozen:void 0}),null!=r&&u(r,e[c],{that:e,AS_ENTRIES:n})})),d=h(t),m=function(e,t,n){var r=d(e),i=o(a(t),!0);return!0===i?g(r).set(t,n):i[r.id]=n,e};return r(p.prototype,{delete:function(e){var t=d(this);if(!i(e))return!1;var n=o(e);return!0===n?g(t).delete(e):n&&l(n,t.id)&&delete n[t.id]},has:function(e){var t=d(this);if(!i(e))return!1;var n=o(e);return!0===n?g(t).has(e):n&&l(n,t.id)}}),r(p.prototype,n?{get:function(e){var t=d(this);if(i(e)){var n=o(e);return!0===n?g(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return m(this,e,t)}}:{add:function(e){return m(this,e,!0)}}),p}}},function(e,t,n){(function(e,r){var o;!function(a){t&&t.nodeType,e&&e.nodeType;var i=\"object\"==typeof r&&r;i.global!==i&&i.window!==i&&i.self;var s,u=2147483647,c=36,l=/^xn--/,p=/[^\\x20-\\x7E]/,f=/[\\x2E\\u3002\\uFF0E\\uFF61]/g,h={overflow:\"Overflow: input needs wider integers to process\",\"not-basic\":\"Illegal input >= 0x80 (not a basic code point)\",\"invalid-input\":\"Invalid input\"},d=Math.floor,m=String.fromCharCode;function v(e){throw RangeError(h[e])}function g(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function y(e,t){var n=e.split(\"@\"),r=\"\";return n.length>1&&(r=n[0]+\"@\",e=n[1]),r+g((e=e.replace(f,\".\")).split(\".\"),t).join(\".\")}function b(e){for(var t,n,r=[],o=0,a=e.length;o<a;)(t=e.charCodeAt(o++))>=55296&&t<=56319&&o<a?56320==(64512&(n=e.charCodeAt(o++)))?r.push(((1023&t)<<10)+(1023&n)+65536):(r.push(t),o--):r.push(t);return r}function _(e){return g(e,(function(e){var t=\"\";return e>65535&&(t+=m((e-=65536)>>>10&1023|55296),e=56320|1023&e),t+=m(e)})).join(\"\")}function w(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function x(e,t,n){var r=0;for(e=n?d(e/700):e>>1,e+=d(e/t);e>455;r+=c)e=d(e/35);return d(r+36*e/(e+38))}function E(e){var t,n,r,o,a,i,s,l,p,f,h,m=[],g=e.length,y=0,b=128,w=72;for((n=e.lastIndexOf(\"-\"))<0&&(n=0),r=0;r<n;++r)e.charCodeAt(r)>=128&&v(\"not-basic\"),m.push(e.charCodeAt(r));for(o=n>0?n+1:0;o<g;){for(a=y,i=1,s=c;o>=g&&v(\"invalid-input\"),((l=(h=e.charCodeAt(o++))-48<10?h-22:h-65<26?h-65:h-97<26?h-97:c)>=c||l>d((u-y)/i))&&v(\"overflow\"),y+=l*i,!(l<(p=s<=w?1:s>=w+26?26:s-w));s+=c)i>d(u/(f=c-p))&&v(\"overflow\"),i*=f;w=x(y-a,t=m.length+1,0==a),d(y/t)>u-b&&v(\"overflow\"),b+=d(y/t),y%=t,m.splice(y++,0,b)}return _(m)}function S(e){var t,n,r,o,a,i,s,l,p,f,h,g,y,_,E,S=[];for(g=(e=b(e)).length,t=128,n=0,a=72,i=0;i<g;++i)(h=e[i])<128&&S.push(m(h));for(r=o=S.length,o&&S.push(\"-\");r<g;){for(s=u,i=0;i<g;++i)(h=e[i])>=t&&h<s&&(s=h);for(s-t>d((u-n)/(y=r+1))&&v(\"overflow\"),n+=(s-t)*y,t=s,i=0;i<g;++i)if((h=e[i])<t&&++n>u&&v(\"overflow\"),h==t){for(l=n,p=c;!(l<(f=p<=a?1:p>=a+26?26:p-a));p+=c)E=l-f,_=c-f,S.push(m(w(f+E%_,0))),l=d(E/_);S.push(m(w(l,0))),a=x(n,y,r==o),n=0,++r}++n,++t}return S.join(\"\")}s={version:\"1.3.2\",ucs2:{decode:b,encode:_},decode:E,encode:S,toASCII:function(e){return y(e,(function(e){return p.test(e)?\"xn--\"+S(e):e}))},toUnicode:function(e){return y(e,(function(e){return l.test(e)?E(e.slice(4).toLowerCase()):e}))}},void 0===(o=function(){return s}.call(t,n,t,e))||(e.exports=o)}()}).call(this,n(194)(e),n(51))},function(e,t,n){\"use strict\";e.exports={isString:function(e){return\"string\"==typeof e},isObject:function(e){return\"object\"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},function(e,t,n){\"use strict\";t.decode=t.parse=n(1078),t.encode=t.stringify=n(1079)},function(e,t,n){\"use strict\";function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}e.exports=function(e,t,n,a){t=t||\"&\",n=n||\"=\";var i={};if(\"string\"!=typeof e||0===e.length)return i;var s=/\\+/g;e=e.split(t);var u=1e3;a&&\"number\"==typeof a.maxKeys&&(u=a.maxKeys);var c=e.length;u>0&&c>u&&(c=u);for(var l=0;l<c;++l){var p,f,h,d,m=e[l].replace(s,\"%20\"),v=m.indexOf(n);v>=0?(p=m.substr(0,v),f=m.substr(v+1)):(p=m,f=\"\"),h=decodeURIComponent(p),d=decodeURIComponent(f),r(i,h)?o(i[h])?i[h].push(d):i[h]=[i[h],d]:i[h]=d}return i};var o=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)}},function(e,t,n){\"use strict\";var r=function(e){switch(typeof e){case\"string\":return e;case\"boolean\":return e?\"true\":\"false\";case\"number\":return isFinite(e)?e:\"\";default:return\"\"}};e.exports=function(e,t,n,s){return t=t||\"&\",n=n||\"=\",null===e&&(e=void 0),\"object\"==typeof e?a(i(e),(function(i){var s=encodeURIComponent(r(i))+n;return o(e[i])?a(e[i],(function(e){return s+encodeURIComponent(r(e))})).join(t):s+encodeURIComponent(r(e[i]))})).join(t):s?encodeURIComponent(r(s))+n+encodeURIComponent(r(e)):\"\"};var o=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)};function a(e,t){if(e.map)return e.map(t);for(var n=[],r=0;r<e.length;r++)n.push(t(e[r],r));return n}var i=Object.keys||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t}},function(e,t){e.exports=function(e,t,n){return e==e&&(void 0!==n&&(e=e<=n?e:n),void 0!==t&&(e=e>=t?e:t)),e}},function(e,t,n){var r=n(1082),o=n(429);e.exports=function(e){return r((function(t,n){var r=-1,a=n.length,i=a>1?n[a-1]:void 0,s=a>2?n[2]:void 0;for(i=e.length>3&&\"function\"==typeof i?(a--,i):void 0,s&&o(n[0],n[1],s)&&(i=a<3?void 0:i,a=1),t=Object(t);++r<a;){var u=n[r];u&&e(t,u,r,i)}return t}))}},function(e,t,n){var r=n(254),o=n(498),a=n(499);e.exports=function(e,t){return a(o(e,t,r),e+\"\")}},function(e,t,n){var r=n(1084);e.exports=r},function(e,t,n){n(1085),n(1088),n(505);var r=n(34);e.exports=r.URL},function(e,t,n){\"use strict\";n(130);var r,o=n(21),a=n(48),i=n(504),s=n(40),u=n(230),c=n(110),l=n(139),p=n(55),f=n(380),h=n(395),d=n(370).codeAt,m=n(1086),v=n(98),g=n(505),y=n(78),b=s.URL,_=g.URLSearchParams,w=g.getState,x=y.set,E=y.getterFor(\"URL\"),S=Math.floor,C=Math.pow,A=\"Invalid scheme\",k=\"Invalid host\",O=\"Invalid port\",j=/[A-Za-z]/,T=/[\\d+-.A-Za-z]/,I=/\\d/,P=/^0x/i,N=/^[0-7]+$/,M=/^\\d+$/,R=/^[\\dA-Fa-f]+$/,D=/[\\0\\t\\n\\r #%/:<>?@[\\\\\\]^|]/,L=/[\\0\\t\\n\\r #/:<>?@[\\\\\\]^|]/,B=/^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g,F=/[\\t\\n\\r]/g,U=function(e,t){var n,r,o;if(\"[\"==t.charAt(0)){if(\"]\"!=t.charAt(t.length-1))return k;if(!(n=z(t.slice(1,-1))))return k;e.host=n}else if(G(e)){if(t=m(t),D.test(t))return k;if(null===(n=q(t)))return k;e.host=n}else{if(L.test(t))return k;for(n=\"\",r=h(t),o=0;o<r.length;o++)n+=K(r[o],W);e.host=n}},q=function(e){var t,n,r,o,a,i,s,u=e.split(\".\");if(u.length&&\"\"==u[u.length-1]&&u.pop(),(t=u.length)>4)return e;for(n=[],r=0;r<t;r++){if(\"\"==(o=u[r]))return e;if(a=10,o.length>1&&\"0\"==o.charAt(0)&&(a=P.test(o)?16:8,o=o.slice(8==a?1:2)),\"\"===o)i=0;else{if(!(10==a?M:8==a?N:R).test(o))return e;i=parseInt(o,a)}n.push(i)}for(r=0;r<t;r++)if(i=n[r],r==t-1){if(i>=C(256,5-t))return null}else if(i>255)return null;for(s=n.pop(),r=0;r<n.length;r++)s+=n[r]*C(256,3-r);return s},z=function(e){var t,n,r,o,a,i,s,u=[0,0,0,0,0,0,0,0],c=0,l=null,p=0,f=function(){return e.charAt(p)};if(\":\"==f()){if(\":\"!=e.charAt(1))return;p+=2,l=++c}for(;f();){if(8==c)return;if(\":\"!=f()){for(t=n=0;n<4&&R.test(f());)t=16*t+parseInt(f(),16),p++,n++;if(\".\"==f()){if(0==n)return;if(p-=n,c>6)return;for(r=0;f();){if(o=null,r>0){if(!(\".\"==f()&&r<4))return;p++}if(!I.test(f()))return;for(;I.test(f());){if(a=parseInt(f(),10),null===o)o=a;else{if(0==o)return;o=10*o+a}if(o>255)return;p++}u[c]=256*u[c]+o,2!=++r&&4!=r||c++}if(4!=r)return;break}if(\":\"==f()){if(p++,!f())return}else if(f())return;u[c++]=t}else{if(null!==l)return;p++,l=++c}}if(null!==l)for(i=c-l,c=7;0!=c&&i>0;)s=u[c],u[c--]=u[l+i-1],u[l+--i]=s;else if(8!=c)return;return u},V=function(e){var t,n,r,o;if(\"number\"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=S(e/256);return t.join(\".\")}if(\"object\"==typeof e){for(t=\"\",r=function(e){for(var t=null,n=1,r=null,o=0,a=0;a<8;a++)0!==e[a]?(o>n&&(t=r,n=o),r=null,o=0):(null===r&&(r=a),++o);return o>n&&(t=r,n=o),t}(e),n=0;n<8;n++)o&&0===e[n]||(o&&(o=!1),r===n?(t+=n?\":\":\"::\",o=!0):(t+=e[n].toString(16),n<7&&(t+=\":\")));return\"[\"+t+\"]\"}return e},W={},H=f({},W,{\" \":1,'\"':1,\"<\":1,\">\":1,\"`\":1}),$=f({},H,{\"#\":1,\"?\":1,\"{\":1,\"}\":1}),J=f({},$,{\"/\":1,\":\":1,\";\":1,\"=\":1,\"@\":1,\"[\":1,\"\\\\\":1,\"]\":1,\"^\":1,\"|\":1}),K=function(e,t){var n=d(e,0);return n>32&&n<127&&!p(t,e)?e:encodeURIComponent(e)},Y={ftp:21,file:null,http:80,https:443,ws:80,wss:443},G=function(e){return p(Y,e.scheme)},Z=function(e){return\"\"!=e.username||\"\"!=e.password},X=function(e){return!e.host||e.cannotBeABaseURL||\"file\"==e.scheme},Q=function(e,t){var n;return 2==e.length&&j.test(e.charAt(0))&&(\":\"==(n=e.charAt(1))||!t&&\"|\"==n)},ee=function(e){var t;return e.length>1&&Q(e.slice(0,2))&&(2==e.length||\"/\"===(t=e.charAt(2))||\"\\\\\"===t||\"?\"===t||\"#\"===t)},te=function(e){var t=e.path,n=t.length;!n||\"file\"==e.scheme&&1==n&&Q(t[0],!0)||t.pop()},ne=function(e){return\".\"===e||\"%2e\"===e.toLowerCase()},re={},oe={},ae={},ie={},se={},ue={},ce={},le={},pe={},fe={},he={},de={},me={},ve={},ge={},ye={},be={},_e={},we={},xe={},Ee={},Se=function(e,t,n,o){var a,i,s,u,c,l=n||re,f=0,d=\"\",m=!1,v=!1,g=!1;for(n||(e.scheme=\"\",e.username=\"\",e.password=\"\",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(B,\"\")),t=t.replace(F,\"\"),a=h(t);f<=a.length;){switch(i=a[f],l){case re:if(!i||!j.test(i)){if(n)return A;l=ae;continue}d+=i.toLowerCase(),l=oe;break;case oe:if(i&&(T.test(i)||\"+\"==i||\"-\"==i||\".\"==i))d+=i.toLowerCase();else{if(\":\"!=i){if(n)return A;d=\"\",l=ae,f=0;continue}if(n&&(G(e)!=p(Y,d)||\"file\"==d&&(Z(e)||null!==e.port)||\"file\"==e.scheme&&!e.host))return;if(e.scheme=d,n)return void(G(e)&&Y[e.scheme]==e.port&&(e.port=null));d=\"\",\"file\"==e.scheme?l=ve:G(e)&&o&&o.scheme==e.scheme?l=ie:G(e)?l=le:\"/\"==a[f+1]?(l=se,f++):(e.cannotBeABaseURL=!0,e.path.push(\"\"),l=we)}break;case ae:if(!o||o.cannotBeABaseURL&&\"#\"!=i)return A;if(o.cannotBeABaseURL&&\"#\"==i){e.scheme=o.scheme,e.path=o.path.slice(),e.query=o.query,e.fragment=\"\",e.cannotBeABaseURL=!0,l=Ee;break}l=\"file\"==o.scheme?ve:ue;continue;case ie:if(\"/\"!=i||\"/\"!=a[f+1]){l=ue;continue}l=pe,f++;break;case se:if(\"/\"==i){l=fe;break}l=_e;continue;case ue:if(e.scheme=o.scheme,i==r)e.username=o.username,e.password=o.password,e.host=o.host,e.port=o.port,e.path=o.path.slice(),e.query=o.query;else if(\"/\"==i||\"\\\\\"==i&&G(e))l=ce;else if(\"?\"==i)e.username=o.username,e.password=o.password,e.host=o.host,e.port=o.port,e.path=o.path.slice(),e.query=\"\",l=xe;else{if(\"#\"!=i){e.username=o.username,e.password=o.password,e.host=o.host,e.port=o.port,e.path=o.path.slice(),e.path.pop(),l=_e;continue}e.username=o.username,e.password=o.password,e.host=o.host,e.port=o.port,e.path=o.path.slice(),e.query=o.query,e.fragment=\"\",l=Ee}break;case ce:if(!G(e)||\"/\"!=i&&\"\\\\\"!=i){if(\"/\"!=i){e.username=o.username,e.password=o.password,e.host=o.host,e.port=o.port,l=_e;continue}l=fe}else l=pe;break;case le:if(l=pe,\"/\"!=i||\"/\"!=d.charAt(f+1))continue;f++;break;case pe:if(\"/\"!=i&&\"\\\\\"!=i){l=fe;continue}break;case fe:if(\"@\"==i){m&&(d=\"%40\"+d),m=!0,s=h(d);for(var y=0;y<s.length;y++){var b=s[y];if(\":\"!=b||g){var _=K(b,J);g?e.password+=_:e.username+=_}else g=!0}d=\"\"}else if(i==r||\"/\"==i||\"?\"==i||\"#\"==i||\"\\\\\"==i&&G(e)){if(m&&\"\"==d)return\"Invalid authority\";f-=h(d).length+1,d=\"\",l=he}else d+=i;break;case he:case de:if(n&&\"file\"==e.scheme){l=ye;continue}if(\":\"!=i||v){if(i==r||\"/\"==i||\"?\"==i||\"#\"==i||\"\\\\\"==i&&G(e)){if(G(e)&&\"\"==d)return k;if(n&&\"\"==d&&(Z(e)||null!==e.port))return;if(u=U(e,d))return u;if(d=\"\",l=be,n)return;continue}\"[\"==i?v=!0:\"]\"==i&&(v=!1),d+=i}else{if(\"\"==d)return k;if(u=U(e,d))return u;if(d=\"\",l=me,n==de)return}break;case me:if(!I.test(i)){if(i==r||\"/\"==i||\"?\"==i||\"#\"==i||\"\\\\\"==i&&G(e)||n){if(\"\"!=d){var w=parseInt(d,10);if(w>65535)return O;e.port=G(e)&&w===Y[e.scheme]?null:w,d=\"\"}if(n)return;l=be;continue}return O}d+=i;break;case ve:if(e.scheme=\"file\",\"/\"==i||\"\\\\\"==i)l=ge;else{if(!o||\"file\"!=o.scheme){l=_e;continue}if(i==r)e.host=o.host,e.path=o.path.slice(),e.query=o.query;else if(\"?\"==i)e.host=o.host,e.path=o.path.slice(),e.query=\"\",l=xe;else{if(\"#\"!=i){ee(a.slice(f).join(\"\"))||(e.host=o.host,e.path=o.path.slice(),te(e)),l=_e;continue}e.host=o.host,e.path=o.path.slice(),e.query=o.query,e.fragment=\"\",l=Ee}}break;case ge:if(\"/\"==i||\"\\\\\"==i){l=ye;break}o&&\"file\"==o.scheme&&!ee(a.slice(f).join(\"\"))&&(Q(o.path[0],!0)?e.path.push(o.path[0]):e.host=o.host),l=_e;continue;case ye:if(i==r||\"/\"==i||\"\\\\\"==i||\"?\"==i||\"#\"==i){if(!n&&Q(d))l=_e;else if(\"\"==d){if(e.host=\"\",n)return;l=be}else{if(u=U(e,d))return u;if(\"localhost\"==e.host&&(e.host=\"\"),n)return;d=\"\",l=be}continue}d+=i;break;case be:if(G(e)){if(l=_e,\"/\"!=i&&\"\\\\\"!=i)continue}else if(n||\"?\"!=i)if(n||\"#\"!=i){if(i!=r&&(l=_e,\"/\"!=i))continue}else e.fragment=\"\",l=Ee;else e.query=\"\",l=xe;break;case _e:if(i==r||\"/\"==i||\"\\\\\"==i&&G(e)||!n&&(\"?\"==i||\"#\"==i)){if(\"..\"===(c=(c=d).toLowerCase())||\"%2e.\"===c||\".%2e\"===c||\"%2e%2e\"===c?(te(e),\"/\"==i||\"\\\\\"==i&&G(e)||e.path.push(\"\")):ne(d)?\"/\"==i||\"\\\\\"==i&&G(e)||e.path.push(\"\"):(\"file\"==e.scheme&&!e.path.length&&Q(d)&&(e.host&&(e.host=\"\"),d=d.charAt(0)+\":\"),e.path.push(d)),d=\"\",\"file\"==e.scheme&&(i==r||\"?\"==i||\"#\"==i))for(;e.path.length>1&&\"\"===e.path[0];)e.path.shift();\"?\"==i?(e.query=\"\",l=xe):\"#\"==i&&(e.fragment=\"\",l=Ee)}else d+=K(i,$);break;case we:\"?\"==i?(e.query=\"\",l=xe):\"#\"==i?(e.fragment=\"\",l=Ee):i!=r&&(e.path[0]+=K(i,W));break;case xe:n||\"#\"!=i?i!=r&&(\"'\"==i&&G(e)?e.query+=\"%27\":e.query+=\"#\"==i?\"%23\":K(i,W)):(e.fragment=\"\",l=Ee);break;case Ee:i!=r&&(e.fragment+=K(i,H))}f++}},Ce=function(e){var t,n,r=l(this,Ce,\"URL\"),o=arguments.length>1?arguments[1]:void 0,i=String(e),s=x(r,{type:\"URL\"});if(void 0!==o)if(o instanceof Ce)t=E(o);else if(n=Se(t={},String(o)))throw TypeError(n);if(n=Se(s,i,null,t))throw TypeError(n);var u=s.searchParams=new _,c=w(u);c.updateSearchParams(s.query),c.updateURL=function(){s.query=String(u)||null},a||(r.href=ke.call(r),r.origin=Oe.call(r),r.protocol=je.call(r),r.username=Te.call(r),r.password=Ie.call(r),r.host=Pe.call(r),r.hostname=Ne.call(r),r.port=Me.call(r),r.pathname=Re.call(r),r.search=De.call(r),r.searchParams=Le.call(r),r.hash=Be.call(r))},Ae=Ce.prototype,ke=function(){var e=E(this),t=e.scheme,n=e.username,r=e.password,o=e.host,a=e.port,i=e.path,s=e.query,u=e.fragment,c=t+\":\";return null!==o?(c+=\"//\",Z(e)&&(c+=n+(r?\":\"+r:\"\")+\"@\"),c+=V(o),null!==a&&(c+=\":\"+a)):\"file\"==t&&(c+=\"//\"),c+=e.cannotBeABaseURL?i[0]:i.length?\"/\"+i.join(\"/\"):\"\",null!==s&&(c+=\"?\"+s),null!==u&&(c+=\"#\"+u),c},Oe=function(){var e=E(this),t=e.scheme,n=e.port;if(\"blob\"==t)try{return new Ce(t.path[0]).origin}catch(e){return\"null\"}return\"file\"!=t&&G(e)?t+\"://\"+V(e.host)+(null!==n?\":\"+n:\"\"):\"null\"},je=function(){return E(this).scheme+\":\"},Te=function(){return E(this).username},Ie=function(){return E(this).password},Pe=function(){var e=E(this),t=e.host,n=e.port;return null===t?\"\":null===n?V(t):V(t)+\":\"+n},Ne=function(){var e=E(this).host;return null===e?\"\":V(e)},Me=function(){var e=E(this).port;return null===e?\"\":String(e)},Re=function(){var e=E(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?\"/\"+t.join(\"/\"):\"\"},De=function(){var e=E(this).query;return e?\"?\"+e:\"\"},Le=function(){return E(this).searchParams},Be=function(){var e=E(this).fragment;return e?\"#\"+e:\"\"},Fe=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(a&&u(Ae,{href:Fe(ke,(function(e){var t=E(this),n=String(e),r=Se(t,n);if(r)throw TypeError(r);w(t.searchParams).updateSearchParams(t.query)})),origin:Fe(Oe),protocol:Fe(je,(function(e){var t=E(this);Se(t,String(e)+\":\",re)})),username:Fe(Te,(function(e){var t=E(this),n=h(String(e));if(!X(t)){t.username=\"\";for(var r=0;r<n.length;r++)t.username+=K(n[r],J)}})),password:Fe(Ie,(function(e){var t=E(this),n=h(String(e));if(!X(t)){t.password=\"\";for(var r=0;r<n.length;r++)t.password+=K(n[r],J)}})),host:Fe(Pe,(function(e){var t=E(this);t.cannotBeABaseURL||Se(t,String(e),he)})),hostname:Fe(Ne,(function(e){var t=E(this);t.cannotBeABaseURL||Se(t,String(e),de)})),port:Fe(Me,(function(e){var t=E(this);X(t)||(\"\"==(e=String(e))?t.port=null:Se(t,e,me))})),pathname:Fe(Re,(function(e){var t=E(this);t.cannotBeABaseURL||(t.path=[],Se(t,e+\"\",be))})),search:Fe(De,(function(e){var t=E(this);\"\"==(e=String(e))?t.query=null:(\"?\"==e.charAt(0)&&(e=e.slice(1)),t.query=\"\",Se(t,e,xe)),w(t.searchParams).updateSearchParams(t.query)})),searchParams:Fe(Le),hash:Fe(Be,(function(e){var t=E(this);\"\"!=(e=String(e))?(\"#\"==e.charAt(0)&&(e=e.slice(1)),t.fragment=\"\",Se(t,e,Ee)):t.fragment=null}))}),c(Ae,\"toJSON\",(function(){return ke.call(this)}),{enumerable:!0}),c(Ae,\"toString\",(function(){return ke.call(this)}),{enumerable:!0}),b){var Ue=b.createObjectURL,qe=b.revokeObjectURL;Ue&&c(Ce,\"createObjectURL\",(function(e){return Ue.apply(b,arguments)})),qe&&c(Ce,\"revokeObjectURL\",(function(e){return qe.apply(b,arguments)}))}v(Ce,\"URL\"),o({global:!0,forced:!i,sham:!a},{URL:Ce})},function(e,t,n){\"use strict\";var r=2147483647,o=/[^\\0-\\u007E]/,a=/[.\\u3002\\uFF0E\\uFF61]/g,i=\"Overflow: input needs wider integers to process\",s=Math.floor,u=String.fromCharCode,c=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?s(e/700):e>>1,e+=s(e/t);e>455;r+=36)e=s(e/35);return s(r+36*e/(e+38))},p=function(e){var t,n,o=[],a=(e=function(e){for(var t=[],n=0,r=e.length;n<r;){var o=e.charCodeAt(n++);if(o>=55296&&o<=56319&&n<r){var a=e.charCodeAt(n++);56320==(64512&a)?t.push(((1023&o)<<10)+(1023&a)+65536):(t.push(o),n--)}else t.push(o)}return t}(e)).length,p=128,f=0,h=72;for(t=0;t<e.length;t++)(n=e[t])<128&&o.push(u(n));var d=o.length,m=d;for(d&&o.push(\"-\");m<a;){var v=r;for(t=0;t<e.length;t++)(n=e[t])>=p&&n<v&&(v=n);var g=m+1;if(v-p>s((r-f)/g))throw RangeError(i);for(f+=(v-p)*g,p=v,t=0;t<e.length;t++){if((n=e[t])<p&&++f>r)throw RangeError(i);if(n==p){for(var y=f,b=36;;b+=36){var _=b<=h?1:b>=h+26?26:b-h;if(y<_)break;var w=y-_,x=36-_;o.push(u(c(_+w%x))),y=s(w/x)}o.push(u(c(y))),h=l(f,g,m==d),f=0,++m}}++f,++p}return o.join(\"\")};e.exports=function(e){var t,n,r=[],i=e.toLowerCase().replace(a,\".\").split(\".\");for(t=0;t<i.length;t++)n=i[t],r.push(o.test(n)?\"xn--\"+p(n):n);return r.join(\".\")}},function(e,t,n){var r=n(52),o=n(159);e.exports=function(e){var t=o(e);if(\"function\"!=typeof t)throw TypeError(String(e)+\" is not iterable\");return r(t.call(e))}},function(e,t){},function(e,t,n){n(1090);var r=n(34);e.exports=r.setTimeout},function(e,t,n){var r=n(21),o=n(40),a=n(108),i=[].slice,s=function(e){return function(t,n){var r=arguments.length>2,o=r?i.call(arguments,2):void 0;return e(r?function(){(\"function\"==typeof t?t:Function(t)).apply(this,o)}:t,n)}};r({global:!0,bind:!0,forced:/MSIE .\\./.test(a)},{setTimeout:s(o.setTimeout),setInterval:s(o.setInterval)})},function(e,t,n){var r=n(1092);e.exports=r},function(e,t,n){n(1093),n(180),n(130),n(87);var r=n(34);e.exports=r.Map},function(e,t,n){\"use strict\";var r=n(503),o=n(1094);e.exports=r(\"Map\",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),o)},function(e,t,n){\"use strict\";var r=n(68).f,o=n(109),a=n(163),i=n(107),s=n(139),u=n(121),c=n(238),l=n(454),p=n(48),f=n(207).fastKey,h=n(78),d=h.set,m=h.getterFor;e.exports={getConstructor:function(e,t,n,c){var l=e((function(e,r){s(e,l,t),d(e,{type:t,index:o(null),first:void 0,last:void 0,size:0}),p||(e.size=0),null!=r&&u(r,e[c],{that:e,AS_ENTRIES:n})})),h=m(t),v=function(e,t,n){var r,o,a=h(e),i=g(e,t);return i?i.value=n:(a.last=i={index:o=f(t,!0),key:t,value:n,previous:r=a.last,next:void 0,removed:!1},a.first||(a.first=i),r&&(r.next=i),p?a.size++:e.size++,\"F\"!==o&&(a.index[o]=i)),e},g=function(e,t){var n,r=h(e),o=f(t);if(\"F\"!==o)return r.index[o];for(n=r.first;n;n=n.next)if(n.key==t)return n};return a(l.prototype,{clear:function(){for(var e=h(this),t=e.index,n=e.first;n;)n.removed=!0,n.previous&&(n.previous=n.previous.next=void 0),delete t[n.index],n=n.next;e.first=e.last=void 0,p?e.size=0:this.size=0},delete:function(e){var t=this,n=h(t),r=g(t,e);if(r){var o=r.next,a=r.previous;delete n.index[r.index],r.removed=!0,a&&(a.next=o),o&&(o.previous=a),n.first==r&&(n.first=o),n.last==r&&(n.last=a),p?n.size--:t.size--}return!!r},forEach:function(e){for(var t,n=h(this),r=i(e,arguments.length>1?arguments[1]:void 0,3);t=t?t.next:n.first;)for(r(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!g(this,e)}}),a(l.prototype,n?{get:function(e){var t=g(this,e);return t&&t.value},set:function(e,t){return v(this,0===e?0:e,t)}}:{add:function(e){return v(this,e=0===e?0:e,e)}}),p&&r(l.prototype,\"size\",{get:function(){return h(this).size}}),l},setStrong:function(e,t,n){var r=t+\" Iterator\",o=m(t),a=m(r);c(e,t,(function(e,t){d(this,{type:r,target:e,state:o(e),kind:t,last:void 0})}),(function(){for(var e=a(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?\"keys\"==t?{value:n.key,done:!1}:\"values\"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),n?\"entries\":\"values\",!n,!0),l(t)}}},function(e,t,n){n(87);var r=n(1096),o=n(99),a=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.keys;return e===a||e instanceof Array&&t===a.keys||i.hasOwnProperty(o(e))?r:t}},function(e,t,n){var r=n(1097);e.exports=r},function(e,t,n){n(157);var r=n(42);e.exports=r(\"Array\").keys},function(e,t,n){n(87);var r=n(1099),o=n(99),a=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.values;return e===a||e instanceof Array&&t===a.values||i.hasOwnProperty(o(e))?r:t}},function(e,t,n){var r=n(1100);e.exports=r},function(e,t,n){n(157);var r=n(42);e.exports=r(\"Array\").values},function(e,t,n){var r=n(1102);e.exports=r},function(e,t,n){var r=n(1103),o=Array.prototype;e.exports=function(e){var t=e.lastIndexOf;return e===o||e instanceof Array&&t===o.lastIndexOf?r:t}},function(e,t,n){n(1104);var r=n(42);e.exports=r(\"Array\").lastIndexOf},function(e,t,n){var r=n(21),o=n(1105);r({target:\"Array\",proto:!0,forced:o!==[].lastIndexOf},{lastIndexOf:o})},function(e,t,n){\"use strict\";var r=n(66),o=n(128),a=n(69),i=n(111),s=Math.min,u=[].lastIndexOf,c=!!u&&1/[1].lastIndexOf(1,-0)<0,l=i(\"lastIndexOf\"),p=c||!l;e.exports=p?function(e){if(c)return u.apply(this,arguments)||0;var t=r(this),n=a(t.length),i=n-1;for(arguments.length>1&&(i=s(i,o(arguments[1]))),i<0&&(i=n+i);i>=0;i--)if(i in t&&t[i]===e)return i||0;return-1}:u},function(e,t,n){\"use strict\";var r,o=\"\";e.exports=function(e,t){if(\"string\"!=typeof e)throw new TypeError(\"expected a string\");if(1===t)return e;if(2===t)return e+e;var n=e.length*t;if(r!==e||void 0===r)r=e,o=\"\";else if(o.length>=n)return o.substr(0,n);for(;n>o.length&&t>1;)1&t&&(o+=e),t>>=1,e+=e;return o=(o+=e).substr(0,n)}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.DebounceInput=void 0;var r=a(n(0)),o=a(n(1108));function a(e){return e&&e.__esModule?e:{default:e}}function i(e){return(i=\"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 s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function u(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?u(Object(n),!0).forEach((function(t){v(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):u(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function p(e,t){return(p=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function f(e){var t=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=m(e);if(t){var o=m(this).constructor;n=Reflect.construct(r,arguments,o)}else n=r.apply(this,arguments);return h(this,n)}}function h(e,t){return!t||\"object\"!==i(t)&&\"function\"!=typeof t?d(e):t}function d(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function v(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var g=function(e){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&p(e,t)}(u,e);var t,n,a,i=f(u);function u(e){var t;!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,u),v(d(t=i.call(this,e)),\"onChange\",(function(e){e.persist();var n=t.state.value,r=t.props.minLength;t.setState({value:e.target.value},(function(){var o=t.state.value;o.length>=r?t.notify(e):n.length>o.length&&t.notify(c(c({},e),{},{target:c(c({},e.target),{},{value:\"\"})}))}))})),v(d(t),\"onKeyDown\",(function(e){\"Enter\"===e.key&&t.forceNotify(e);var n=t.props.onKeyDown;n&&(e.persist(),n(e))})),v(d(t),\"onBlur\",(function(e){t.forceNotify(e);var n=t.props.onBlur;n&&(e.persist(),n(e))})),v(d(t),\"createNotifier\",(function(e){if(e<0)t.notify=function(){return null};else if(0===e)t.notify=t.doNotify;else{var n=(0,o.default)((function(e){t.isDebouncing=!1,t.doNotify(e)}),e);t.notify=function(e){t.isDebouncing=!0,n(e)},t.flush=function(){return n.flush()},t.cancel=function(){t.isDebouncing=!1,n.cancel()}}})),v(d(t),\"doNotify\",(function(){var e=t.props.onChange;e.apply(void 0,arguments)})),v(d(t),\"forceNotify\",(function(e){var n=t.props.debounceTimeout;if(t.isDebouncing||!(n>0)){t.cancel&&t.cancel();var r=t.state.value,o=t.props.minLength;r.length>=o?t.doNotify(e):t.doNotify(c(c({},e),{},{target:c(c({},e.target),{},{value:r})}))}})),t.isDebouncing=!1,t.state={value:void 0===e.value||null===e.value?\"\":e.value};var n=t.props.debounceTimeout;return t.createNotifier(n),t}return t=u,(n=[{key:\"componentDidUpdate\",value:function(e){if(!this.isDebouncing){var t=this.props,n=t.value,r=t.debounceTimeout,o=e.debounceTimeout,a=e.value,i=this.state.value;void 0!==n&&a!==n&&i!==n&&this.setState({value:n}),r!==o&&this.createNotifier(r)}}},{key:\"componentWillUnmount\",value:function(){this.flush&&this.flush()}},{key:\"render\",value:function(){var e,t,n=this.props,o=n.element,a=(n.onChange,n.value,n.minLength,n.debounceTimeout,n.forceNotifyByEnter),i=n.forceNotifyOnBlur,u=n.onKeyDown,l=n.onBlur,p=n.inputRef,f=s(n,[\"element\",\"onChange\",\"value\",\"minLength\",\"debounceTimeout\",\"forceNotifyByEnter\",\"forceNotifyOnBlur\",\"onKeyDown\",\"onBlur\",\"inputRef\"]),h=this.state.value;e=a?{onKeyDown:this.onKeyDown}:u?{onKeyDown:u}:{},t=i?{onBlur:this.onBlur}:l?{onBlur:l}:{};var d=p?{ref:p}:{};return r.default.createElement(o,c(c(c(c({},f),{},{onChange:this.onChange,value:h},e),t),d))}}])&&l(t.prototype,n),a&&l(t,a),u}(r.default.PureComponent);t.DebounceInput=g,v(g,\"defaultProps\",{element:\"input\",type:\"text\",onKeyDown:void 0,onBlur:void 0,value:void 0,minLength:0,debounceTimeout:100,forceNotifyByEnter:!0,forceNotifyOnBlur:!0,inputRef:void 0})},function(e,t,n){(function(t){var n=/^\\s+|\\s+$/g,r=/^[-+]0x[0-9a-f]+$/i,o=/^0b[01]+$/i,a=/^0o[0-7]+$/i,i=parseInt,s=\"object\"==typeof t&&t&&t.Object===Object&&t,u=\"object\"==typeof self&&self&&self.Object===Object&&self,c=s||u||Function(\"return this\")(),l=Object.prototype.toString,p=Math.max,f=Math.min,h=function(){return c.Date.now()};function d(e){var t=typeof e;return!!e&&(\"object\"==t||\"function\"==t)}function m(e){if(\"number\"==typeof e)return e;if(function(e){return\"symbol\"==typeof e||function(e){return!!e&&\"object\"==typeof e}(e)&&\"[object Symbol]\"==l.call(e)}(e))return NaN;if(d(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=d(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=e.replace(n,\"\");var s=o.test(e);return s||a.test(e)?i(e.slice(2),s?2:8):r.test(e)?NaN:+e}e.exports=function(e,t,n){var r,o,a,i,s,u,c=0,l=!1,v=!1,g=!0;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");function y(t){var n=r,a=o;return r=o=void 0,c=t,i=e.apply(a,n)}function b(e){return c=e,s=setTimeout(w,t),l?y(e):i}function _(e){var n=e-u;return void 0===u||n>=t||n<0||v&&e-c>=a}function w(){var e=h();if(_(e))return x(e);s=setTimeout(w,function(e){var n=t-(e-u);return v?f(n,a-(e-c)):n}(e))}function x(e){return s=void 0,g&&r?y(e):(r=o=void 0,i)}function E(){var e=h(),n=_(e);if(r=arguments,o=this,u=e,n){if(void 0===s)return b(u);if(v)return s=setTimeout(w,t),y(u)}return void 0===s&&(s=setTimeout(w,t)),i}return t=m(t)||0,d(n)&&(l=!!n.leading,a=(v=\"maxWait\"in n)?p(m(n.maxWait)||0,t):a,g=\"trailing\"in n?!!n.trailing:g),E.cancel=function(){void 0!==s&&clearTimeout(s),c=0,r=u=o=s=void 0},E.flush=function(){return void 0===s?i:x(h())},E}}).call(this,n(51))},function(e,t,n){var r={\"./all.js\":342,\"./auth/actions.js\":84,\"./auth/index.js\":305,\"./auth/reducers.js\":306,\"./auth/selectors.js\":307,\"./auth/spec-wrap-actions.js\":308,\"./configs/actions.js\":148,\"./configs/helpers.js\":170,\"./configs/index.js\":344,\"./configs/reducers.js\":313,\"./configs/selectors.js\":312,\"./configs/spec-actions.js\":311,\"./deep-linking/helpers.js\":174,\"./deep-linking/index.js\":314,\"./deep-linking/layout.js\":315,\"./deep-linking/operation-tag-wrapper.jsx\":317,\"./deep-linking/operation-wrapper.jsx\":316,\"./download-url.js\":310,\"./err/actions.js\":59,\"./err/error-transformers/hook.js\":126,\"./err/error-transformers/transformers/not-of-type.js\":288,\"./err/error-transformers/transformers/parameter-oneof.js\":289,\"./err/index.js\":286,\"./err/reducers.js\":287,\"./err/selectors.js\":290,\"./filter/index.js\":318,\"./filter/opsFilter.js\":319,\"./layout/actions.js\":103,\"./layout/index.js\":291,\"./layout/reducers.js\":292,\"./layout/selectors.js\":293,\"./layout/spec-extensions/wrap-selector.js\":294,\"./logs/index.js\":303,\"./oas3/actions.js\":54,\"./oas3/auth-extensions/wrap-selectors.js\":323,\"./oas3/components/callbacks.jsx\":326,\"./oas3/components/http-auth.jsx\":331,\"./oas3/components/index.js\":325,\"./oas3/components/operation-link.jsx\":327,\"./oas3/components/operation-servers.jsx\":332,\"./oas3/components/request-body-editor.jsx\":330,\"./oas3/components/request-body.jsx\":171,\"./oas3/components/servers-container.jsx\":329,\"./oas3/components/servers.jsx\":328,\"./oas3/helpers.jsx\":35,\"./oas3/index.js\":321,\"./oas3/reducers.js\":341,\"./oas3/selectors.js\":340,\"./oas3/spec-extensions/selectors.js\":324,\"./oas3/spec-extensions/wrap-selectors.js\":322,\"./oas3/wrap-components/auth-item.jsx\":335,\"./oas3/wrap-components/index.js\":333,\"./oas3/wrap-components/json-schema-string.jsx\":339,\"./oas3/wrap-components/markdown.jsx\":334,\"./oas3/wrap-components/model.jsx\":338,\"./oas3/wrap-components/online-validator-badge.js\":337,\"./oas3/wrap-components/version-stamp.jsx\":336,\"./on-complete/index.js\":320,\"./request-snippets/fn.js\":169,\"./request-snippets/index.js\":300,\"./request-snippets/request-snippets.jsx\":302,\"./request-snippets/selectors.js\":301,\"./samples/fn.js\":146,\"./samples/index.js\":299,\"./spec/actions.js\":46,\"./spec/index.js\":295,\"./spec/reducers.js\":296,\"./spec/selectors.js\":93,\"./spec/wrap-actions.js\":297,\"./swagger-js/configs-wrap-actions.js\":304,\"./swagger-js/index.js\":343,\"./util/index.js\":309,\"./view/index.js\":298,\"./view/root-injects.jsx\":173};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error(\"Cannot find module '\"+e+\"'\");throw t.code=\"MODULE_NOT_FOUND\",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=1109},function(e,t,n){\"use strict\";n.r(t);var r={};n.r(r),n.d(r,\"Container\",(function(){return wn})),n.d(r,\"Col\",(function(){return En})),n.d(r,\"Row\",(function(){return Sn})),n.d(r,\"Button\",(function(){return Cn})),n.d(r,\"TextArea\",(function(){return An})),n.d(r,\"Input\",(function(){return kn})),n.d(r,\"Select\",(function(){return On})),n.d(r,\"Link\",(function(){return jn})),n.d(r,\"Collapse\",(function(){return In}));var o={};n.r(o),n.d(o,\"JsonSchemaForm\",(function(){return br})),n.d(o,\"JsonSchema_string\",(function(){return _r})),n.d(o,\"JsonSchema_array\",(function(){return wr})),n.d(o,\"JsonSchemaArrayItemText\",(function(){return xr})),n.d(o,\"JsonSchemaArrayItemFile\",(function(){return Er})),n.d(o,\"JsonSchema_boolean\",(function(){return Sr})),n.d(o,\"JsonSchema_object\",(function(){return Ar}));var a=n(18),i=n.n(a),s=n(2),u=n.n(s),c=n(12),l=n.n(c),p=n(15),f=n.n(p),h=n(32),d=n.n(h),m=n(81),v=n.n(m),g=n(3),y=n.n(g),b=n(6),_=n.n(b),w=n(7),x=n.n(w),E=n(36),S=n.n(E),C=n(20),A=n.n(C),k=n(19),O=n.n(k),j=n(22),T=n.n(j),I=n(29),P=n.n(I),N=n(4),M=n.n(N),R=n(0),D=n.n(R),L=n(150),B=n(1),F=n.n(B),U=n(509),q=n(145),z=n(510),V=n.n(z),W=n(59),H=n(26),$=n(5),J=function(e){return e};var K=function(){function e(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};_()(this,e),v()(this,{state:{},plugins:[],pluginsOptions:{},system:{configs:{},fn:{},components:{},rootInjects:{},statePlugins:{}},boundSystem:{},toolbox:{}},n),this.getSystem=S()(t=this._getSystem).call(t,this),this.store=Q(J,Object(B.fromJS)(this.state),this.getSystem),this.buildSystem(!1),this.register(this.plugins)}return x()(e,[{key:\"getStore\",value:function(){return this.store}},{key:\"register\",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=Y(e,this.getSystem(),this.pluginsOptions);Z(this.system,n),t&&this.buildSystem();var r=G.call(this.system,e,this.getSystem());r&&this.buildSystem()}},{key:\"buildSystem\",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.getStore().dispatch,n=this.getStore().getState;this.boundSystem=A()({},this.getRootInjects(),this.getWrappedAndBoundActions(t),this.getWrappedAndBoundSelectors(n,this.getSystem),this.getStateThunks(n),this.getFn(),this.getConfigs()),e&&this.rebuildReducer()}},{key:\"_getSystem\",value:function(){return this.boundSystem}},{key:\"getRootInjects\",value:function(){var e,t,n;return A()({getSystem:this.getSystem,getStore:S()(e=this.getStore).call(e,this),getComponents:S()(t=this.getComponents).call(t,this),getState:this.getStore().getState,getConfigs:S()(n=this._getConfigs).call(n,this),Im:F.a,React:D.a},this.system.rootInjects||{})}},{key:\"_getConfigs\",value:function(){return this.system.configs}},{key:\"getConfigs\",value:function(){return{configs:this.system.configs}}},{key:\"setConfigs\",value:function(e){this.system.configs=e}},{key:\"rebuildReducer\",value:function(){var e,t,n,r;this.store.replaceReducer((r=this.system.statePlugins,e=Object($.x)(r,(function(e){return e.reducers})),n=P()(t=f()(e)).call(t,(function(t,n){return t[n]=function(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new B.Map,n=arguments.length>1?arguments[1]:void 0;if(!e)return t;var r=e[n.type];if(r){var o=X(r)(t,n);return null===o?t:o}return t}}(e[n]),t}),{}),f()(n).length?Object(U.combineReducers)(n):J))}},{key:\"getType\",value:function(e){var t=e[0].toUpperCase()+O()(e).call(e,1);return Object($.y)(this.system.statePlugins,(function(n,r){var o=n[e];if(o)return y()({},r+t,o)}))}},{key:\"getSelectors\",value:function(){return this.getType(\"selectors\")}},{key:\"getActions\",value:function(){var e=this.getType(\"actions\");return Object($.x)(e,(function(e){return Object($.y)(e,(function(e,t){if(Object($.r)(e))return y()({},t,e)}))}))}},{key:\"getWrappedAndBoundActions\",value:function(e){var t=this,n=this.getBoundActions(e);return Object($.x)(n,(function(e,n){var r=t.system.statePlugins[O()(n).call(n,0,-7)].wrapActions;return r?Object($.x)(e,(function(e,n){var o=r[n];return o?(T()(o)||(o=[o]),P()(o).call(o,(function(e,n){var r=function(){return n(e,t.getSystem()).apply(void 0,arguments)};if(!Object($.r)(r))throw new TypeError(\"wrapActions needs to return a function that returns a new function (ie the wrapped action)\");return X(r)}),e||Function.prototype)):e})):e}))}},{key:\"getWrappedAndBoundSelectors\",value:function(e,t){var n=this,r=this.getBoundSelectors(e,t);return Object($.x)(r,(function(t,r){var o=[O()(r).call(r,0,-9)],a=n.system.statePlugins[o].wrapSelectors;return a?Object($.x)(t,(function(t,r){var i=a[r];return i?(T()(i)||(i=[i]),P()(i).call(i,(function(t,r){var a=function(){for(var a,i=arguments.length,s=new Array(i),c=0;c<i;c++)s[c]=arguments[c];return r(t,n.getSystem()).apply(void 0,u()(a=[e().getIn(o)]).call(a,s))};if(!Object($.r)(a))throw new TypeError(\"wrapSelector needs to return a function that returns a new function (ie the wrapped action)\");return a}),t||Function.prototype)):t})):t}))}},{key:\"getStates\",value:function(e){var t;return P()(t=f()(this.system.statePlugins)).call(t,(function(t,n){return t[n]=e.get(n),t}),{})}},{key:\"getStateThunks\",value:function(e){var t;return P()(t=f()(this.system.statePlugins)).call(t,(function(t,n){return t[n]=function(){return e().get(n)},t}),{})}},{key:\"getFn\",value:function(){return{fn:this.system.fn}}},{key:\"getComponents\",value:function(e){var t=this,n=this.system.components[e];return T()(n)?P()(n).call(n,(function(e,n){return n(e,t.getSystem())})):void 0!==e?this.system.components[e]:this.system.components}},{key:\"getBoundSelectors\",value:function(e,t){return Object($.x)(this.getSelectors(),(function(n,r){var o=[O()(r).call(r,0,-9)],a=function(){return e().getIn(o)};return Object($.x)(n,(function(e){return function(){for(var n,r=arguments.length,o=new Array(r),i=0;i<r;i++)o[i]=arguments[i];var s=X(e).apply(null,u()(n=[a()]).call(n,o));return\"function\"==typeof s&&(s=X(s)(t())),s}}))}))}},{key:\"getBoundActions\",value:function(e){e=e||this.getStore().dispatch;var t=this.getActions(),n=function e(t){return\"function\"!=typeof t?Object($.x)(t,(function(t){return e(t)})):function(){var e=null;try{e=t.apply(void 0,arguments)}catch(t){e={type:W.NEW_THROWN_ERR,error:!0,payload:Object(q.serializeError)(t)}}finally{return e}}};return Object($.x)(t,(function(t){return Object(L.bindActionCreators)(n(t),e)}))}},{key:\"getMapStateToProps\",value:function(){var e=this;return function(){return A()({},e.getSystem())}}},{key:\"getMapDispatchToProps\",value:function(e){var t=this;return function(n){return v()({},t.getWrappedAndBoundActions(n),t.getFn(),e)}}}]),e}();function Y(e,t,n){if(Object($.t)(e)&&!Object($.p)(e))return V()({},e);if(Object($.s)(e))return Y(e(t),t,n);if(Object($.p)(e)){var r,o=\"chain\"===n.pluginLoadType?t.getComponents():{};return P()(r=M()(e).call(e,(function(e){return Y(e,t,n)}))).call(r,Z,o)}return{}}function G(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=r.hasLoaded,a=o;return Object($.t)(e)&&!Object($.p)(e)&&\"function\"==typeof e.afterLoad&&(a=!0,X(e.afterLoad).call(this,t)),Object($.s)(e)?G.call(this,e(t),t,{hasLoaded:a}):Object($.p)(e)?M()(e).call(e,(function(e){return G.call(n,e,t,{hasLoaded:a})})):a}function Z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!Object($.t)(e))return{};if(!Object($.t)(t))return e;t.wrapComponents&&(Object($.x)(t.wrapComponents,(function(n,r){var o=e.components&&e.components[r];o&&T()(o)?(e.components[r]=u()(o).call(o,[n]),delete t.wrapComponents[r]):o&&(e.components[r]=[o,n],delete t.wrapComponents[r])})),f()(t.wrapComponents).length||delete t.wrapComponents);var n=e.statePlugins;if(Object($.t)(n))for(var r in n){var o=n[r];if(Object($.t)(o)){var a=o.wrapActions,i=o.wrapSelectors;if(Object($.t)(a))for(var s in a){var c,l=a[s];if(T()(l)||(l=[l],a[s]=l),t&&t.statePlugins&&t.statePlugins[r]&&t.statePlugins[r].wrapActions&&t.statePlugins[r].wrapActions[s])t.statePlugins[r].wrapActions[s]=u()(c=a[s]).call(c,t.statePlugins[r].wrapActions[s])}if(Object($.t)(i))for(var p in i){var h,d=i[p];if(T()(d)||(d=[d],i[p]=d),t&&t.statePlugins&&t.statePlugins[r]&&t.statePlugins[r].wrapSelectors&&t.statePlugins[r].wrapSelectors[p])t.statePlugins[r].wrapSelectors[p]=u()(h=i[p]).call(h,t.statePlugins[r].wrapSelectors[p])}}}return v()(e,t)}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.logErrors,r=void 0===n||n;return\"function\"!=typeof e?e:function(){try{for(var t,n=arguments.length,o=new Array(n),a=0;a<n;a++)o[a]=arguments[a];return e.call.apply(e,u()(t=[this]).call(t,o))}catch(e){return r&&console.error(e),null}}}function Q(e,t,n){return function(e,t,n){var r=[Object($.J)(n)],o=H.a.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__||L.compose;return Object(L.createStore)(e,t,o(L.applyMiddleware.apply(void 0,r)))}(e,t,n)}var ee=n(286),te=n(291),ne=n(295),re=n(298),oe=n(299),ae=n(300),ie=n(303),se=n(343),ue=n(305),ce=n(309),le=n(310),pe=n(344),fe=n(314),he=n(318),de=n(320),me=n(10),ve=n.n(me),ge=n(8),ye=n.n(ge),be=n(9),_e=n.n(be),we=n(17),xe=n.n(we),Ee=(n(11),n(27),n(58)),Se=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;_()(this,n),o=t.call(this,e,r),y()(ve()(o),\"toggleShown\",(function(){var e=o.props,t=e.layoutActions,n=e.tag,r=e.operationId,a=e.isShown,i=o.getResolvedSubtree();a||void 0!==i||o.requestResolvedSubtree(),t.show([\"operations\",n,r],!a)})),y()(ve()(o),\"onCancelClick\",(function(){o.setState({tryItOutEnabled:!o.state.tryItOutEnabled})})),y()(ve()(o),\"onTryoutClick\",(function(){o.setState({tryItOutEnabled:!o.state.tryItOutEnabled})})),y()(ve()(o),\"onExecute\",(function(){o.setState({executeInProgress:!0})})),y()(ve()(o),\"getResolvedSubtree\",(function(){var e=o.props,t=e.specSelectors,n=e.path,r=e.method,a=e.specPath;return a?t.specResolvedSubtree(a.toJS()):t.specResolvedSubtree([\"paths\",n,r])})),y()(ve()(o),\"requestResolvedSubtree\",(function(){var e=o.props,t=e.specActions,n=e.path,r=e.method,a=e.specPath;return a?t.requestResolvedSubtree(a.toJS()):t.requestResolvedSubtree([\"paths\",n,r])}));var a=e.getConfigs().tryItOutEnabled;return o.state={tryItOutEnabled:!0===a||\"true\"===a,executeInProgress:!1},o}return x()(n,[{key:\"mapStateToProps\",value:function(e,t){var n,r=t.op,o=t.layoutSelectors,a=(0,t.getConfigs)(),i=a.docExpansion,s=a.deepLinking,c=a.displayOperationId,l=a.displayRequestDuration,p=a.supportedSubmitMethods,f=o.showSummary(),h=r.getIn([\"operation\",\"__originalOperationId\"])||r.getIn([\"operation\",\"operationId\"])||Object(Ee.e)(r.get(\"operation\"),t.path,t.method)||r.get(\"id\"),d=[\"operations\",t.tag,h],m=s&&\"false\"!==s,v=xe()(p).call(p,t.method)>=0&&(void 0===t.allowTryItOut?t.specSelectors.allowTryItOutFor(t.path,t.method):t.allowTryItOut),g=r.getIn([\"operation\",\"security\"])||t.specSelectors.security();return{operationId:h,isDeepLinkingEnabled:m,showSummary:f,displayOperationId:c,displayRequestDuration:l,allowTryItOut:v,security:g,isAuthorized:t.authSelectors.isAuthorized(g),isShown:o.isShown(d,\"full\"===i),jumpToKey:u()(n=\"paths.\".concat(t.path,\".\")).call(n,t.method),response:t.specSelectors.responseFor(t.path,t.method),request:t.specSelectors.requestFor(t.path,t.method)}}},{key:\"componentDidMount\",value:function(){var e=this.props.isShown,t=this.getResolvedSubtree();e&&void 0===t&&this.requestResolvedSubtree()}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.response,n=e.isShown,r=this.getResolvedSubtree();t!==this.props.response&&this.setState({executeInProgress:!1}),n&&void 0===r&&this.requestResolvedSubtree()}},{key:\"render\",value:function(){var e=this.props,t=e.op,n=e.tag,r=e.path,o=e.method,a=e.security,i=e.isAuthorized,s=e.operationId,u=e.showSummary,c=e.isShown,l=e.jumpToKey,p=e.allowTryItOut,f=e.response,h=e.request,d=e.displayOperationId,m=e.displayRequestDuration,v=e.isDeepLinkingEnabled,g=e.specPath,y=e.specSelectors,b=e.specActions,_=e.getComponent,w=e.getConfigs,x=e.layoutSelectors,E=e.layoutActions,S=e.authActions,C=e.authSelectors,A=e.oas3Actions,k=e.oas3Selectors,O=e.fn,j=_(\"operation\"),T=this.getResolvedSubtree()||Object(B.Map)(),I=Object(B.fromJS)({op:T,tag:n,path:r,summary:t.getIn([\"operation\",\"summary\"])||\"\",deprecated:T.get(\"deprecated\")||t.getIn([\"operation\",\"deprecated\"])||!1,method:o,security:a,isAuthorized:i,operationId:s,originalOperationId:T.getIn([\"operation\",\"__originalOperationId\"]),showSummary:u,isShown:c,jumpToKey:l,allowTryItOut:p,request:h,displayOperationId:d,displayRequestDuration:m,isDeepLinkingEnabled:v,executeInProgress:this.state.executeInProgress,tryItOutEnabled:this.state.tryItOutEnabled});return D.a.createElement(j,{operation:I,response:f,request:h,isShown:c,toggleShown:this.toggleShown,onTryoutClick:this.onTryoutClick,onCancelClick:this.onCancelClick,onExecute:this.onExecute,specPath:g,specActions:b,specSelectors:y,oas3Actions:A,oas3Selectors:k,layoutActions:E,layoutSelectors:x,authActions:S,authSelectors:C,getComponent:_,getConfigs:w,fn:O})}}]),n}(R.PureComponent);y()(Se,\"defaultProps\",{showSummary:!0,response:null,allowTryItOut:!0,displayOperationId:!1,displayRequestDuration:!1});var Ce=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"getLayout\",value:function(){var e=this.props,t=e.getComponent,n=e.layoutSelectors.current(),r=t(n,!0);return r||function(){return D.a.createElement(\"h1\",null,' No layout defined for \"',n,'\" ')}}},{key:\"render\",value:function(){var e=this.getLayout();return D.a.createElement(e,null)}}]),n}(D.a.Component);Ce.defaultProps={};var Ae=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"close\",(function(){r.props.authActions.showDefinitions(!1)})),r}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.authSelectors,r=t.authActions,o=t.getComponent,a=t.errSelectors,i=t.specSelectors,s=t.fn.AST,u=void 0===s?{}:s,c=n.shownDefinitions(),l=o(\"auths\");return D.a.createElement(\"div\",{className:\"dialog-ux\"},D.a.createElement(\"div\",{className:\"backdrop-ux\"}),D.a.createElement(\"div\",{className:\"modal-ux\"},D.a.createElement(\"div\",{className:\"modal-dialog-ux\"},D.a.createElement(\"div\",{className:\"modal-ux-inner\"},D.a.createElement(\"div\",{className:\"modal-ux-header\"},D.a.createElement(\"h3\",null,\"Available authorizations\"),D.a.createElement(\"button\",{type:\"button\",className:\"close-modal\",onClick:this.close},D.a.createElement(\"svg\",{width:\"20\",height:\"20\"},D.a.createElement(\"use\",{href:\"#close\",xlinkHref:\"#close\"})))),D.a.createElement(\"div\",{className:\"modal-ux-content\"},M()(e=c.valueSeq()).call(e,(function(e,t){return D.a.createElement(l,{key:t,AST:u,definitions:e,getComponent:o,errSelectors:a,authSelectors:n,authActions:r,specSelectors:i})})))))))}}]),n}(D.a.Component),ke=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.isAuthorized,n=e.showPopup,r=e.onClick,o=(0,e.getComponent)(\"authorizationPopup\",!0);return D.a.createElement(\"div\",{className:\"auth-wrapper\"},D.a.createElement(\"button\",{className:t?\"btn authorize locked\":\"btn authorize unlocked\",onClick:r},D.a.createElement(\"span\",null,\"Authorize\"),D.a.createElement(\"svg\",{width:\"20\",height:\"20\"},D.a.createElement(\"use\",{href:t?\"#locked\":\"#unlocked\",xlinkHref:t?\"#locked\":\"#unlocked\"}))),n&&D.a.createElement(o,null))}}]),n}(D.a.Component),Oe=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.authActions,n=e.authSelectors,r=e.specSelectors,o=e.getComponent,a=r.securityDefinitions(),i=n.definitionsToAuthorize(),s=o(\"authorizeBtn\");return a?D.a.createElement(s,{onClick:function(){return t.showDefinitions(i)},isAuthorized:!!n.authorized().size,showPopup:!!n.shownDefinitions(),getComponent:o}):null}}]),n}(D.a.Component),je=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onClick\",(function(e){e.stopPropagation();var t=r.props.onClick;t&&t()})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props.isAuthorized;return D.a.createElement(\"button\",{className:e?\"authorization__btn locked\":\"authorization__btn unlocked\",\"aria-label\":e?\"authorization button locked\":\"authorization button unlocked\",onClick:this.onClick},D.a.createElement(\"svg\",{width:\"20\",height:\"20\"},D.a.createElement(\"use\",{href:e?\"#locked\":\"#unlocked\",xlinkHref:e?\"#locked\":\"#unlocked\"})))}}]),n}(D.a.Component),Te=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;return _()(this,n),o=t.call(this,e,r),y()(ve()(o),\"onAuthChange\",(function(e){var t=e.name;o.setState(y()({},t,e))})),y()(ve()(o),\"submitAuth\",(function(e){e.preventDefault(),o.props.authActions.authorizeWithPersistOption(o.state)})),y()(ve()(o),\"logoutClick\",(function(e){e.preventDefault();var t=o.props,n=t.authActions,r=t.definitions,a=M()(r).call(r,(function(e,t){return t})).toArray();o.setState(P()(a).call(a,(function(e,t){return e[t]=\"\",e}),{})),n.logoutWithPersistOption(a)})),y()(ve()(o),\"close\",(function(e){e.preventDefault(),o.props.authActions.showDefinitions(!1)})),o.state={},o}return x()(n,[{key:\"render\",value:function(){var e,t=this,n=this.props,r=n.definitions,o=n.getComponent,a=n.authSelectors,i=n.errSelectors,s=o(\"AuthItem\"),u=o(\"oauth2\",!0),c=o(\"Button\"),p=a.authorized(),f=l()(r).call(r,(function(e,t){return!!p.get(t)})),h=l()(r).call(r,(function(e){return\"oauth2\"!==e.get(\"type\")})),d=l()(r).call(r,(function(e){return\"oauth2\"===e.get(\"type\")}));return D.a.createElement(\"div\",{className:\"auth-container\"},!!h.size&&D.a.createElement(\"form\",{onSubmit:this.submitAuth},M()(h).call(h,(function(e,n){return D.a.createElement(s,{key:n,schema:e,name:n,getComponent:o,onAuthChange:t.onAuthChange,authorized:p,errSelectors:i})})).toArray(),D.a.createElement(\"div\",{className:\"auth-btn-wrapper\"},h.size===f.size?D.a.createElement(c,{className:\"btn modal-btn auth\",onClick:this.logoutClick},\"Logout\"):D.a.createElement(c,{type:\"submit\",className:\"btn modal-btn auth authorize\"},\"Authorize\"),D.a.createElement(c,{className:\"btn modal-btn auth btn-done\",onClick:this.close},\"Close\"))),d&&d.size?D.a.createElement(\"div\",null,D.a.createElement(\"div\",{className:\"scope-def\"},D.a.createElement(\"p\",null,\"Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.\"),D.a.createElement(\"p\",null,\"API requires the following scopes. Select which ones you want to grant to Swagger UI.\")),M()(e=l()(r).call(r,(function(e){return\"oauth2\"===e.get(\"type\")}))).call(e,(function(e,t){return D.a.createElement(\"div\",{key:t},D.a.createElement(u,{authorized:p,schema:e,name:t}))})).toArray()):null)}}]),n}(D.a.Component),Ie=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.schema,r=t.name,o=t.getComponent,a=t.onAuthChange,i=t.authorized,s=t.errSelectors,u=o(\"apiKeyAuth\"),c=o(\"basicAuth\"),l=n.get(\"type\");switch(l){case\"apiKey\":e=D.a.createElement(u,{key:r,schema:n,name:r,errSelectors:s,authorized:i,getComponent:o,onChange:a});break;case\"basic\":e=D.a.createElement(c,{key:r,schema:n,name:r,errSelectors:s,authorized:i,getComponent:o,onChange:a});break;default:e=D.a.createElement(\"div\",{key:r},\"Unknown security definition type \",l)}return D.a.createElement(\"div\",{key:\"\".concat(r,\"-jump\")},e)}}]),n}(D.a.Component),Pe=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props.error,t=e.get(\"level\"),n=e.get(\"message\"),r=e.get(\"source\");return D.a.createElement(\"div\",{className:\"errors\"},D.a.createElement(\"b\",null,r,\" \",t),D.a.createElement(\"span\",null,n))}}]),n}(D.a.Component),Ne=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;_()(this,n),o=t.call(this,e,r),y()(ve()(o),\"onChange\",(function(e){var t=o.props.onChange,n=e.target.value,r=A()({},o.state,{value:n});o.setState(r),t(r)}));var a=o.props,i=a.name,s=a.schema,u=o.getValue();return o.state={name:i,schema:s,value:u},o}return x()(n,[{key:\"getValue\",value:function(){var e=this.props,t=e.name,n=e.authorized;return n&&n.getIn([t,\"value\"])}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.schema,o=n.getComponent,a=n.errSelectors,i=n.name,s=o(\"Input\"),u=o(\"Row\"),c=o(\"Col\"),p=o(\"authError\"),f=o(\"Markdown\",!0),h=o(\"JumpToPath\",!0),d=this.getValue(),m=l()(e=a.allErrors()).call(e,(function(e){return e.get(\"authId\")===i}));return D.a.createElement(\"div\",null,D.a.createElement(\"h4\",null,D.a.createElement(\"code\",null,i||r.get(\"name\")),\"  (apiKey)\",D.a.createElement(h,{path:[\"securityDefinitions\",i]})),d&&D.a.createElement(\"h6\",null,\"Authorized\"),D.a.createElement(u,null,D.a.createElement(f,{source:r.get(\"description\")})),D.a.createElement(u,null,D.a.createElement(\"p\",null,\"Name: \",D.a.createElement(\"code\",null,r.get(\"name\")))),D.a.createElement(u,null,D.a.createElement(\"p\",null,\"In: \",D.a.createElement(\"code\",null,r.get(\"in\")))),D.a.createElement(u,null,D.a.createElement(\"label\",null,\"Value:\"),d?D.a.createElement(\"code\",null,\" ****** \"):D.a.createElement(c,null,D.a.createElement(s,{type:\"text\",onChange:this.onChange,autoFocus:!0}))),M()(t=m.valueSeq()).call(t,(function(e,t){return D.a.createElement(p,{error:e,key:t})})))}}]),n}(D.a.Component),Me=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;_()(this,n),o=t.call(this,e,r),y()(ve()(o),\"onChange\",(function(e){var t=o.props.onChange,n=e.target,r=n.value,a=n.name,i=o.state.value;i[a]=r,o.setState({value:i}),t(o.state)}));var a=o.props,i=a.schema,s=a.name,u=o.getValue().username;return o.state={name:s,schema:i,value:u?{username:u}:{}},o}return x()(n,[{key:\"getValue\",value:function(){var e=this.props,t=e.authorized,n=e.name;return t&&t.getIn([n,\"value\"])||{}}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.schema,o=n.getComponent,a=n.name,i=n.errSelectors,s=o(\"Input\"),u=o(\"Row\"),c=o(\"Col\"),p=o(\"authError\"),f=o(\"JumpToPath\",!0),h=o(\"Markdown\",!0),d=this.getValue().username,m=l()(e=i.allErrors()).call(e,(function(e){return e.get(\"authId\")===a}));return D.a.createElement(\"div\",null,D.a.createElement(\"h4\",null,\"Basic authorization\",D.a.createElement(f,{path:[\"securityDefinitions\",a]})),d&&D.a.createElement(\"h6\",null,\"Authorized\"),D.a.createElement(u,null,D.a.createElement(h,{source:r.get(\"description\")})),D.a.createElement(u,null,D.a.createElement(\"label\",null,\"Username:\"),d?D.a.createElement(\"code\",null,\" \",d,\" \"):D.a.createElement(c,null,D.a.createElement(s,{type:\"text\",required:\"required\",name:\"username\",onChange:this.onChange,autoFocus:!0}))),D.a.createElement(u,null,D.a.createElement(\"label\",null,\"Password:\"),d?D.a.createElement(\"code\",null,\" ****** \"):D.a.createElement(c,null,D.a.createElement(s,{autoComplete:\"new-password\",name:\"password\",type:\"password\",onChange:this.onChange}))),M()(t=m.valueSeq()).call(t,(function(e,t){return D.a.createElement(p,{error:e,key:t})})))}}]),n}(D.a.Component);function Re(e){var t=e.example,n=e.showValue,r=e.getComponent,o=e.getConfigs,a=r(\"Markdown\",!0),i=r(\"highlightCode\");return t?D.a.createElement(\"div\",{className:\"example\"},t.get(\"description\")?D.a.createElement(\"section\",{className:\"example__section\"},D.a.createElement(\"div\",{className:\"example__section-header\"},\"Example Description\"),D.a.createElement(\"p\",null,D.a.createElement(a,{source:t.get(\"description\")}))):null,n&&t.has(\"value\")?D.a.createElement(\"section\",{className:\"example__section\"},D.a.createElement(\"div\",{className:\"example__section-header\"},\"Example Value\"),D.a.createElement(i,{getConfigs:o,value:Object($.I)(t.get(\"value\"))})):null):null}var De=n(538),Le=n.n(De),Be=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"_onSelect\",(function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isSyntheticChange,o=void 0!==n&&n;\"function\"==typeof r.props.onSelect&&r.props.onSelect(e,{isSyntheticChange:o})})),y()(ve()(r),\"_onDomSelect\",(function(e){if(\"function\"==typeof r.props.onSelect){var t=e.target.selectedOptions[0].getAttribute(\"value\");r._onSelect(t,{isSyntheticChange:!1})}})),y()(ve()(r),\"getCurrentExample\",(function(){var e=r.props,t=e.examples,n=e.currentExampleKey,o=t.get(n),a=t.keySeq().first(),i=t.get(a);return o||i||Le()({})})),r}return x()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.onSelect,n=e.examples;if(\"function\"==typeof t){var r=n.first(),o=n.keyOf(r);this._onSelect(o,{isSyntheticChange:!0})}}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.currentExampleKey,n=e.examples;if(n!==this.props.examples&&!n.has(t)){var r=n.first(),o=n.keyOf(r);this._onSelect(o,{isSyntheticChange:!0})}}},{key:\"render\",value:function(){var e=this.props,t=e.examples,n=e.currentExampleKey,r=e.isValueModified,o=e.isModifiedValueAvailable,a=e.showLabels;return D.a.createElement(\"div\",{className:\"examples-select\"},a?D.a.createElement(\"span\",{className:\"examples-select__section-label\"},\"Examples: \"):null,D.a.createElement(\"select\",{className:\"examples-select-element\",onChange:this._onDomSelect,value:o&&r?\"__MODIFIED__VALUE__\":n||\"\"},o?D.a.createElement(\"option\",{value:\"__MODIFIED__VALUE__\"},\"[Modified value]\"):null,M()(t).call(t,(function(e,t){return D.a.createElement(\"option\",{key:t,value:t},e.get(\"summary\")||t)})).valueSeq()))}}]),n}(D.a.PureComponent);y()(Be,\"defaultProps\",{examples:F.a.Map({}),onSelect:function(){for(var e,t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=console).log.apply(e,u()(t=[\"DEBUG: ExamplesSelect was not given an onSelect callback\"]).call(t,r))},currentExampleKey:null,showLabels:!0});var Fe=function(e){return B.List.isList(e)?e:Object($.I)(e)},Ue=function(e){ye()(n,e);var t=_e()(n);function n(e){var r;_()(this,n),r=t.call(this,e),y()(ve()(r),\"_getStateForCurrentNamespace\",(function(){var e=r.props.currentNamespace;return(r.state[e]||Object(B.Map)()).toObject()})),y()(ve()(r),\"_setStateForCurrentNamespace\",(function(e){var t=r.props.currentNamespace;return r._setStateForNamespace(t,e)})),y()(ve()(r),\"_setStateForNamespace\",(function(e,t){var n=(r.state[e]||Object(B.Map)()).mergeDeep(t);return r.setState(y()({},e,n))})),y()(ve()(r),\"_isCurrentUserInputSameAsExampleValue\",(function(){var e=r.props.currentUserInputValue;return r._getCurrentExampleValue()===e})),y()(ve()(r),\"_getValueForExample\",(function(e,t){var n=(t||r.props).examples;return Fe((n||Object(B.Map)({})).getIn([e,\"value\"]))})),y()(ve()(r),\"_getCurrentExampleValue\",(function(e){var t=(e||r.props).currentKey;return r._getValueForExample(t,e||r.props)})),y()(ve()(r),\"_onExamplesSelect\",(function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isSyntheticChange,o=r.props,a=o.onSelect,i=o.updateValue,s=o.currentUserInputValue,c=o.userHasEditedBody,l=r._getStateForCurrentNamespace(),p=l.lastUserEditedValue,f=r._getValueForExample(e);if(\"__MODIFIED__VALUE__\"===e)return i(Fe(p)),r._setStateForCurrentNamespace({isModifiedValueSelected:!0});if(\"function\"==typeof a){for(var h,d=arguments.length,m=new Array(d>2?d-2:0),v=2;v<d;v++)m[v-2]=arguments[v];a.apply(void 0,u()(h=[e,{isSyntheticChange:n}]).call(h,m))}r._setStateForCurrentNamespace({lastDownstreamValue:f,isModifiedValueSelected:n&&c||!!s&&s!==f}),n||\"function\"==typeof i&&i(Fe(f))}));var o=r._getCurrentExampleValue();return r.state=y()({},e.currentNamespace,Object(B.Map)({lastUserEditedValue:r.props.currentUserInputValue,lastDownstreamValue:o,isModifiedValueSelected:r.props.userHasEditedBody||r.props.currentUserInputValue!==o})),r}return x()(n,[{key:\"componentWillUnmount\",value:function(){this.props.setRetainRequestBodyValueFlag(!1)}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.currentUserInputValue,n=e.examples,r=e.onSelect,o=e.userHasEditedBody,a=this._getStateForCurrentNamespace(),i=a.lastUserEditedValue,s=a.lastDownstreamValue,u=this._getValueForExample(e.currentKey,e),c=l()(n).call(n,(function(e){return e.get(\"value\")===t||Object($.I)(e.get(\"value\"))===t}));c.size?r(c.has(e.currentKey)?e.currentKey:c.keySeq().first(),{isSyntheticChange:!0}):t!==this.props.currentUserInputValue&&t!==i&&t!==s&&(this.props.setRetainRequestBodyValueFlag(!0),this._setStateForNamespace(e.currentNamespace,{lastUserEditedValue:e.currentUserInputValue,isModifiedValueSelected:o||t!==u}))}},{key:\"render\",value:function(){var e=this.props,t=e.currentUserInputValue,n=e.examples,r=e.currentKey,o=e.getComponent,a=e.userHasEditedBody,i=this._getStateForCurrentNamespace(),s=i.lastDownstreamValue,u=i.lastUserEditedValue,c=i.isModifiedValueSelected,l=o(\"ExamplesSelect\");return D.a.createElement(l,{examples:n,currentExampleKey:r,onSelect:this._onExamplesSelect,isModifiedValueAvailable:!!u&&u!==s,isValueModified:void 0!==t&&c&&t!==this._getCurrentExampleValue()||a})}}]),n}(D.a.PureComponent);y()(Ue,\"defaultProps\",{userHasEditedBody:!1,examples:Object(B.Map)({}),currentNamespace:\"__DEFAULT__NAMESPACE__\",setRetainRequestBodyValueFlag:function(){},onSelect:function(){for(var e,t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=console).log.apply(e,u()(t=[\"ExamplesSelectValueRetainer: no `onSelect` function was provided\"]).call(t,r))},updateValue:function(){for(var e,t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=console).log.apply(e,u()(t=[\"ExamplesSelectValueRetainer: no `updateValue` function was provided\"]).call(t,r))}});var qe=n(213),ze=n.n(qe),Ve=n(125),We=n.n(Ve),He=n(31),$e=n.n(He),Je=n(94),Ke=n.n(Je);var Ye=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;_()(this,n),o=t.call(this,e,r),y()(ve()(o),\"close\",(function(e){e.preventDefault(),o.props.authActions.showDefinitions(!1)})),y()(ve()(o),\"authorize\",(function(){var e=o.props,t=e.authActions,n=e.errActions,r=e.getConfigs,a=e.authSelectors,i=e.oas3Selectors,s=r(),u=a.getConfigs();n.clear({authId:name,type:\"auth\",source:\"auth\"}),function(e){var t=e.auth,n=e.authActions,r=e.errActions,o=e.configs,a=e.authConfigs,i=void 0===a?{}:a,s=e.currentServer,u=t.schema,c=t.scopes,l=t.name,p=t.clientId,f=u.get(\"flow\"),h=[];switch(f){case\"password\":return void n.authorizePassword(t);case\"application\":return void n.authorizeApplication(t);case\"accessCode\":h.push(\"response_type=code\");break;case\"implicit\":h.push(\"response_type=token\");break;case\"clientCredentials\":case\"client_credentials\":return void n.authorizeApplication(t);case\"authorizationCode\":case\"authorization_code\":h.push(\"response_type=code\")}\"string\"==typeof p&&h.push(\"client_id=\"+encodeURIComponent(p));var d=o.oauth2RedirectUrl;if(void 0!==d){h.push(\"redirect_uri=\"+encodeURIComponent(d));var m=[];if(T()(c)?m=c:F.a.List.isList(c)&&(m=c.toArray()),m.length>0){var v=i.scopeSeparator||\" \";h.push(\"scope=\"+encodeURIComponent(m.join(v)))}var g=Object($.a)(new Date);if(h.push(\"state=\"+encodeURIComponent(g)),void 0!==i.realm&&h.push(\"realm=\"+encodeURIComponent(i.realm)),(\"authorizationCode\"===f||\"authorization_code\"===f||\"accessCode\"===f)&&i.usePkceWithAuthorizationCodeGrant){var y=Object($.j)(),b=Object($.c)(y);h.push(\"code_challenge=\"+b),h.push(\"code_challenge_method=S256\"),t.codeVerifier=y}var _=i.additionalQueryStringParams;for(var w in _){var x;void 0!==_[w]&&h.push(M()(x=[w,_[w]]).call(x,encodeURIComponent).join(\"=\"))}var E,S=u.get(\"authorizationUrl\"),C=[s?Ke()(Object($.F)(S),s,!0).toString():Object($.F)(S),h.join(\"&\")].join(-1===xe()(S).call(S,\"?\")?\"?\":\"&\");E=\"implicit\"===f?n.preAuthorizeImplicit:i.useBasicAuthenticationWithAccessCodeGrant?n.authorizeAccessCodeWithBasicAuthentication:n.authorizeAccessCodeWithFormParams,H.a.swaggerUIRedirectOauth2={auth:t,state:g,redirectUrl:d,callback:E,errCb:r.newAuthErr},H.a.open(C)}else r.newAuthErr({authId:l,source:\"validation\",level:\"error\",message:\"oauth2RedirectUrl configuration is not passed. Oauth2 authorization cannot be performed.\"})}({auth:o.state,currentServer:i.serverEffectiveValue(i.selectedServer()),authActions:t,errActions:n,configs:s,authConfigs:u})})),y()(ve()(o),\"onScopeChange\",(function(e){var t,n,r=e.target,a=r.checked,i=r.dataset.value;if(a&&-1===xe()(t=o.state.scopes).call(t,i)){var s,c=u()(s=o.state.scopes).call(s,[i]);o.setState({scopes:c})}else if(!a&&xe()(n=o.state.scopes).call(n,i)>-1){var p;o.setState({scopes:l()(p=o.state.scopes).call(p,(function(e){return e!==i}))})}})),y()(ve()(o),\"onInputChange\",(function(e){var t=e.target,n=t.dataset.name,r=t.value,a=y()({},n,r);o.setState(a)})),y()(ve()(o),\"selectScopes\",(function(e){var t;e.target.dataset.all?o.setState({scopes:ze()(We()(t=o.props.schema.get(\"allowedScopes\")||o.props.schema.get(\"scopes\")).call(t))}):o.setState({scopes:[]})})),y()(ve()(o),\"logout\",(function(e){e.preventDefault();var t=o.props,n=t.authActions,r=t.errActions,a=t.name;r.clear({authId:a,type:\"auth\",source:\"auth\"}),n.logoutWithPersistOption([a])}));var a=o.props,i=a.name,s=a.schema,c=a.authorized,p=a.authSelectors,f=c&&c.get(i),h=p.getConfigs()||{},d=f&&f.get(\"username\")||\"\",m=f&&f.get(\"clientId\")||h.clientId||\"\",v=f&&f.get(\"clientSecret\")||h.clientSecret||\"\",g=f&&f.get(\"passwordType\")||\"basic\",b=f&&f.get(\"scopes\")||h.scopes||[];return\"string\"==typeof b&&(b=b.split(h.scopeSeparator||\" \")),o.state={appName:h.appName,name:i,schema:s,scopes:b,clientId:m,clientSecret:v,username:d,password:\"\",passwordType:g},o}return x()(n,[{key:\"render\",value:function(){var e,t,n=this,r=this.props,o=r.schema,a=r.getComponent,i=r.authSelectors,s=r.errSelectors,c=r.name,p=r.specSelectors,f=a(\"Input\"),h=a(\"Row\"),d=a(\"Col\"),m=a(\"Button\"),v=a(\"authError\"),g=a(\"JumpToPath\",!0),y=a(\"Markdown\",!0),b=a(\"InitializedInput\"),_=p.isOAS3,w=_()?o.get(\"openIdConnectUrl\"):null,x=\"implicit\",E=\"password\",S=_()?w?\"authorization_code\":\"authorizationCode\":\"accessCode\",C=_()?w?\"client_credentials\":\"clientCredentials\":\"application\",A=o.get(\"flow\"),k=o.get(\"allowedScopes\")||o.get(\"scopes\"),O=!!i.authorized().get(c),j=l()(e=s.allErrors()).call(e,(function(e){return e.get(\"authId\")===c})),T=!l()(j).call(j,(function(e){return\"validation\"===e.get(\"source\")})).size,I=o.get(\"description\");return D.a.createElement(\"div\",null,D.a.createElement(\"h4\",null,c,\" (OAuth2, \",o.get(\"flow\"),\") \",D.a.createElement(g,{path:[\"securityDefinitions\",c]})),this.state.appName?D.a.createElement(\"h5\",null,\"Application: \",this.state.appName,\" \"):null,I&&D.a.createElement(y,{source:o.get(\"description\")}),O&&D.a.createElement(\"h6\",null,\"Authorized\"),w&&D.a.createElement(\"p\",null,\"OpenID Connect URL: \",D.a.createElement(\"code\",null,w)),(A===x||A===S)&&D.a.createElement(\"p\",null,\"Authorization URL: \",D.a.createElement(\"code\",null,o.get(\"authorizationUrl\"))),(A===E||A===S||A===C)&&D.a.createElement(\"p\",null,\"Token URL:\",D.a.createElement(\"code\",null,\" \",o.get(\"tokenUrl\"))),D.a.createElement(\"p\",{className:\"flow\"},\"Flow: \",D.a.createElement(\"code\",null,o.get(\"flow\"))),A!==E?null:D.a.createElement(h,null,D.a.createElement(h,null,D.a.createElement(\"label\",{htmlFor:\"oauth_username\"},\"username:\"),O?D.a.createElement(\"code\",null,\" \",this.state.username,\" \"):D.a.createElement(d,{tablet:10,desktop:10},D.a.createElement(\"input\",{id:\"oauth_username\",type:\"text\",\"data-name\":\"username\",onChange:this.onInputChange,autoFocus:!0}))),D.a.createElement(h,null,D.a.createElement(\"label\",{htmlFor:\"oauth_password\"},\"password:\"),O?D.a.createElement(\"code\",null,\" ****** \"):D.a.createElement(d,{tablet:10,desktop:10},D.a.createElement(\"input\",{id:\"oauth_password\",type:\"password\",\"data-name\":\"password\",onChange:this.onInputChange}))),D.a.createElement(h,null,D.a.createElement(\"label\",{htmlFor:\"password_type\"},\"Client credentials location:\"),O?D.a.createElement(\"code\",null,\" \",this.state.passwordType,\" \"):D.a.createElement(d,{tablet:10,desktop:10},D.a.createElement(\"select\",{id:\"password_type\",\"data-name\":\"passwordType\",onChange:this.onInputChange},D.a.createElement(\"option\",{value:\"basic\"},\"Authorization header\"),D.a.createElement(\"option\",{value:\"request-body\"},\"Request body\"))))),(A===C||A===x||A===S||A===E)&&(!O||O&&this.state.clientId)&&D.a.createElement(h,null,D.a.createElement(\"label\",{htmlFor:\"client_id\"},\"client_id:\"),O?D.a.createElement(\"code\",null,\" ****** \"):D.a.createElement(d,{tablet:10,desktop:10},D.a.createElement(b,{id:\"client_id\",type:\"text\",required:A===E,initialValue:this.state.clientId,\"data-name\":\"clientId\",onChange:this.onInputChange}))),(A===C||A===S||A===E)&&D.a.createElement(h,null,D.a.createElement(\"label\",{htmlFor:\"client_secret\"},\"client_secret:\"),O?D.a.createElement(\"code\",null,\" ****** \"):D.a.createElement(d,{tablet:10,desktop:10},D.a.createElement(b,{id:\"client_secret\",initialValue:this.state.clientSecret,type:\"password\",\"data-name\":\"clientSecret\",onChange:this.onInputChange}))),!O&&k&&k.size?D.a.createElement(\"div\",{className:\"scopes\"},D.a.createElement(\"h2\",null,\"Scopes:\",D.a.createElement(\"a\",{onClick:this.selectScopes,\"data-all\":!0},\"select all\"),D.a.createElement(\"a\",{onClick:this.selectScopes},\"select none\")),M()(k).call(k,(function(e,t){var r,o,a,i,s;return D.a.createElement(h,{key:t},D.a.createElement(\"div\",{className:\"checkbox\"},D.a.createElement(f,{\"data-value\":t,id:u()(r=u()(o=\"\".concat(t,\"-\")).call(o,A,\"-checkbox-\")).call(r,n.state.name),disabled:O,checked:$e()(a=n.state.scopes).call(a,t),type:\"checkbox\",onChange:n.onScopeChange}),D.a.createElement(\"label\",{htmlFor:u()(i=u()(s=\"\".concat(t,\"-\")).call(s,A,\"-checkbox-\")).call(i,n.state.name)},D.a.createElement(\"span\",{className:\"item\"}),D.a.createElement(\"div\",{className:\"text\"},D.a.createElement(\"p\",{className:\"name\"},t),D.a.createElement(\"p\",{className:\"description\"},e)))))})).toArray()):null,M()(t=j.valueSeq()).call(t,(function(e,t){return D.a.createElement(v,{error:e,key:t})})),D.a.createElement(\"div\",{className:\"auth-btn-wrapper\"},T&&(O?D.a.createElement(m,{className:\"btn modal-btn auth authorize\",onClick:this.logout},\"Logout\"):D.a.createElement(m,{className:\"btn modal-btn auth authorize\",onClick:this.authorize},\"Authorize\")),D.a.createElement(m,{className:\"btn modal-btn auth btn-done\",onClick:this.close},\"Close\")))}}]),n}(D.a.Component),Ge=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onClick\",(function(){var e=r.props,t=e.specActions,n=e.path,o=e.method;t.clearResponse(n,o),t.clearRequest(n,o)})),r}return x()(n,[{key:\"render\",value:function(){return D.a.createElement(\"button\",{className:\"btn btn-clear opblock-control__btn\",onClick:this.onClick},\"Clear\")}}]),n}(R.Component),Ze=function(e){var t=e.headers;return D.a.createElement(\"div\",null,D.a.createElement(\"h5\",null,\"Response headers\"),D.a.createElement(\"pre\",{className:\"microlight\"},t))},Xe=function(e){var t=e.duration;return D.a.createElement(\"div\",null,D.a.createElement(\"h5\",null,\"Request duration\"),D.a.createElement(\"pre\",{className:\"microlight\"},t,\" ms\"))},Qe=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"shouldComponentUpdate\",value:function(e){return this.props.response!==e.response||this.props.path!==e.path||this.props.method!==e.method||this.props.displayRequestDuration!==e.displayRequestDuration}},{key:\"render\",value:function(){var e,t=this.props,n=t.response,r=t.getComponent,o=t.getConfigs,a=t.displayRequestDuration,i=t.specSelectors,s=t.path,c=t.method,l=o(),p=l.showMutatedRequest,h=l.requestSnippetsEnabled,d=p?i.mutatedRequestFor(s,c):i.requestFor(s,c),m=n.get(\"status\"),v=d.get(\"url\"),g=n.get(\"headers\").toJS(),y=n.get(\"notDocumented\"),b=n.get(\"error\"),_=n.get(\"text\"),w=n.get(\"duration\"),x=f()(g),E=g[\"content-type\"]||g[\"Content-Type\"],S=r(\"responseBody\"),C=M()(x).call(x,(function(e){var t=T()(g[e])?g[e].join():g[e];return D.a.createElement(\"span\",{className:\"headerline\",key:e},\" \",e,\": \",t,\" \")})),A=0!==C.length,k=r(\"Markdown\",!0),O=r(\"RequestSnippets\",!0),j=r(\"curl\");return D.a.createElement(\"div\",null,d&&(!0===h||\"true\"===h?D.a.createElement(O,{request:d}):D.a.createElement(j,{request:d,getConfigs:o})),v&&D.a.createElement(\"div\",null,D.a.createElement(\"h4\",null,\"Request URL\"),D.a.createElement(\"div\",{className:\"request-url\"},D.a.createElement(\"pre\",{className:\"microlight\"},v))),D.a.createElement(\"h4\",null,\"Server response\"),D.a.createElement(\"table\",{className:\"responses-table live-responses-table\"},D.a.createElement(\"thead\",null,D.a.createElement(\"tr\",{className:\"responses-header\"},D.a.createElement(\"td\",{className:\"col_header response-col_status\"},\"Code\"),D.a.createElement(\"td\",{className:\"col_header response-col_description\"},\"Details\"))),D.a.createElement(\"tbody\",null,D.a.createElement(\"tr\",{className:\"response\"},D.a.createElement(\"td\",{className:\"response-col_status\"},m,y?D.a.createElement(\"div\",{className:\"response-undocumented\"},D.a.createElement(\"i\",null,\" Undocumented \")):null),D.a.createElement(\"td\",{className:\"response-col_description\"},b?D.a.createElement(k,{source:u()(e=\"\".concat(\"\"!==n.get(\"name\")?\"\".concat(n.get(\"name\"),\": \"):\"\")).call(e,n.get(\"message\"))}):null,_?D.a.createElement(S,{content:_,contentType:E,url:v,headers:g,getConfigs:o,getComponent:r}):null,A?D.a.createElement(Ze,{headers:C}):null,a&&w?D.a.createElement(Xe,{duration:w}):null)))))}}]),n}(D.a.Component),et=n(219),tt=[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\"],nt=u()(tt).call(tt,[\"trace\"]),rt=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"renderOperationTag\",(function(e,t){var n=r.props,o=n.specSelectors,a=n.getComponent,i=n.oas3Selectors,s=n.layoutSelectors,c=n.layoutActions,l=n.getConfigs,p=a(\"OperationContainer\",!0),f=a(\"OperationTag\"),h=e.get(\"operations\");return D.a.createElement(f,{key:\"operation-\"+t,tagObj:e,tag:t,oas3Selectors:i,layoutSelectors:s,layoutActions:c,getConfigs:l,getComponent:a,specUrl:o.url()},D.a.createElement(\"div\",{className:\"operation-tag-content\"},M()(h).call(h,(function(e){var n,r=e.get(\"path\"),a=e.get(\"method\"),i=F.a.List([\"paths\",r,a]),s=o.isOAS3()?nt:tt;return-1===xe()(s).call(s,a)?null:D.a.createElement(p,{key:u()(n=\"\".concat(r,\"-\")).call(n,a),specPath:i,op:e,path:r,method:a,tag:t})})).toArray()))})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props.specSelectors.taggedOperations();return 0===e.size?D.a.createElement(\"h3\",null,\" No operations defined in spec!\"):D.a.createElement(\"div\",null,M()(e).call(e,this.renderOperationTag).toArray(),e.size<1?D.a.createElement(\"h3\",null,\" No operations defined in spec! \"):null)}}]),n}(D.a.Component),ot=n(95),at=n.n(ot);function it(e){return e.match(/^(?:[a-z]+:)?\\/\\//i)}function st(e,t){return e?it(e)?(n=e).match(/^\\/\\//i)?u()(r=\"\".concat(window.location.protocol)).call(r,n):n:new at.a(e,t).href:t;var n,r}function ut(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.selectedServer,o=void 0===r?\"\":r;if(e){if(it(e))return e;var a=st(o,t);return it(a)?new at.a(e,a).href:new at.a(e,window.location.href).href}}var ct=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.tagObj,r=t.tag,o=t.children,a=t.oas3Selectors,i=t.layoutSelectors,s=t.layoutActions,u=t.getConfigs,c=t.getComponent,l=t.specUrl,p=u(),f=p.docExpansion,h=p.deepLinking,d=h&&\"false\"!==h,m=c(\"Collapse\"),v=c(\"Markdown\",!0),g=c(\"DeepLink\"),y=c(\"Link\"),b=n.getIn([\"tagDetails\",\"description\"],null),_=n.getIn([\"tagDetails\",\"externalDocs\",\"description\"]),w=n.getIn([\"tagDetails\",\"externalDocs\",\"url\"]);e=Object($.s)(a)&&Object($.s)(a.selectedServer)?ut(w,l,{selectedServer:a.selectedServer()}):w;var x=[\"operations-tag\",r],E=i.isShown(x,\"full\"===f||\"list\"===f);return D.a.createElement(\"div\",{className:E?\"opblock-tag-section is-open\":\"opblock-tag-section\"},D.a.createElement(\"h3\",{onClick:function(){return s.show(x,!E)},className:b?\"opblock-tag\":\"opblock-tag no-desc\",id:M()(x).call(x,(function(e){return Object($.g)(e)})).join(\"-\"),\"data-tag\":r,\"data-is-open\":E},D.a.createElement(g,{enabled:d,isShown:E,path:Object($.d)(r),text:r}),b?D.a.createElement(\"small\",null,D.a.createElement(v,{source:b})):D.a.createElement(\"small\",null),D.a.createElement(\"div\",null,_?D.a.createElement(\"small\",null,_,e?\": \":null,e?D.a.createElement(y,{href:Object($.F)(e),onClick:function(e){return e.stopPropagation()},target:\"_blank\"},e):null):null),D.a.createElement(\"button\",{\"aria-expanded\":E,className:\"expand-operation\",title:E?\"Collapse operation\":\"Expand operation\",onClick:function(){return s.show(x,!E)}},D.a.createElement(\"svg\",{className:\"arrow\",width:\"20\",height:\"20\",\"aria-hidden\":\"true\",focusable:\"false\"},D.a.createElement(\"use\",{href:E?\"#large-arrow-up\":\"#large-arrow-down\",xlinkHref:E?\"#large-arrow-up\":\"#large-arrow-down\"})))),D.a.createElement(m,{isOpened:E},o))}}]),n}(D.a.Component);y()(ct,\"defaultProps\",{tagObj:F.a.fromJS({}),tag:\"\"});var lt=function(e){ye()(r,e);var t=_e()(r);function r(){return _()(this,r),t.apply(this,arguments)}return x()(r,[{key:\"render\",value:function(){var e=this.props,t=e.specPath,r=e.response,o=e.request,a=e.toggleShown,i=e.onTryoutClick,s=e.onCancelClick,u=e.onExecute,c=e.fn,l=e.getComponent,p=e.getConfigs,f=e.specActions,h=e.specSelectors,d=e.authActions,m=e.authSelectors,v=e.oas3Actions,g=e.oas3Selectors,y=this.props.operation,b=y.toJS(),_=b.deprecated,w=b.isShown,x=b.path,E=b.method,S=b.op,C=b.tag,A=b.operationId,k=b.allowTryItOut,O=b.displayRequestDuration,j=b.tryItOutEnabled,T=b.executeInProgress,I=S.description,P=S.externalDocs,N=S.schemes,M=P?ut(P.url,h.url(),{selectedServer:g.selectedServer()}):\"\",R=y.getIn([\"op\"]),L=R.get(\"responses\"),B=Object($.n)(R,[\"parameters\"]),F=h.operationScheme(x,E),U=[\"operations\",C,A],q=Object($.m)(R),z=l(\"responses\"),V=l(\"parameters\"),W=l(\"execute\"),H=l(\"clear\"),J=l(\"Collapse\"),K=l(\"Markdown\",!0),Y=l(\"schemes\"),G=l(\"OperationServers\"),Z=l(\"OperationExt\"),X=l(\"OperationSummary\"),Q=l(\"Link\"),ee=p().showExtensions;if(L&&r&&r.size>0){var te=!L.get(String(r.get(\"status\")))&&!L.get(\"default\");r=r.set(\"notDocumented\",te)}var ne=[x,E];return D.a.createElement(\"div\",{className:_?\"opblock opblock-deprecated\":w?\"opblock opblock-\".concat(E,\" is-open\"):\"opblock opblock-\".concat(E),id:Object($.g)(U.join(\"-\"))},D.a.createElement(X,{operationProps:y,isShown:w,toggleShown:a,getComponent:l,authActions:d,authSelectors:m,specPath:t}),D.a.createElement(J,{isOpened:w},D.a.createElement(\"div\",{className:\"opblock-body\"},R&&R.size||null===R?null:D.a.createElement(\"img\",{height:\"32px\",width:\"32px\",src:n(506),className:\"opblock-loading-animation\"}),_&&D.a.createElement(\"h4\",{className:\"opblock-title_normal\"},\" Warning: Deprecated\"),I&&D.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},D.a.createElement(\"div\",{className:\"opblock-description\"},D.a.createElement(K,{source:I}))),M?D.a.createElement(\"div\",{className:\"opblock-external-docs-wrapper\"},D.a.createElement(\"h4\",{className:\"opblock-title_normal\"},\"Find more details\"),D.a.createElement(\"div\",{className:\"opblock-external-docs\"},D.a.createElement(\"span\",{className:\"opblock-external-docs__description\"},D.a.createElement(K,{source:P.description})),D.a.createElement(Q,{target:\"_blank\",className:\"opblock-external-docs__link\",href:Object($.F)(M)},M))):null,R&&R.size?D.a.createElement(V,{parameters:B,specPath:t.push(\"parameters\"),operation:R,onChangeKey:ne,onTryoutClick:i,onCancelClick:s,tryItOutEnabled:j,allowTryItOut:k,fn:c,getComponent:l,specActions:f,specSelectors:h,pathMethod:[x,E],getConfigs:p,oas3Actions:v,oas3Selectors:g}):null,j?D.a.createElement(G,{getComponent:l,path:x,method:E,operationServers:R.get(\"servers\"),pathServers:h.paths().getIn([x,\"servers\"]),getSelectedServer:g.selectedServer,setSelectedServer:v.setSelectedServer,setServerVariableValue:v.setServerVariableValue,getServerVariable:g.serverVariableValue,getEffectiveServerValue:g.serverEffectiveValue}):null,j&&k&&N&&N.size?D.a.createElement(\"div\",{className:\"opblock-schemes\"},D.a.createElement(Y,{schemes:N,path:x,method:E,specActions:f,currentScheme:F})):null,D.a.createElement(\"div\",{className:j&&r&&k?\"btn-group\":\"execute-wrapper\"},j&&k?D.a.createElement(W,{operation:R,specActions:f,specSelectors:h,oas3Selectors:g,oas3Actions:v,path:x,method:E,onExecute:u,disabled:T}):null,j&&r&&k?D.a.createElement(H,{specActions:f,path:x,method:E}):null),T?D.a.createElement(\"div\",{className:\"loading-container\"},D.a.createElement(\"div\",{className:\"loading\"})):null,L?D.a.createElement(z,{responses:L,request:o,tryItOutResponse:r,getComponent:l,getConfigs:p,specSelectors:h,oas3Actions:v,oas3Selectors:g,specActions:f,produces:h.producesOptionsFor([x,E]),producesValue:h.currentProducesFor([x,E]),specPath:t.push(\"responses\"),path:x,method:E,displayRequestDuration:O,fn:c}):null,ee&&q.size?D.a.createElement(Z,{extensions:q,getComponent:l}):null)))}}]),r}(R.PureComponent);y()(lt,\"defaultProps\",{operation:null,response:null,request:null,specPath:Object(B.List)(),summary:\"\"});var pt=n(92),ft=n.n(pt),ht=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.isShown,r=t.toggleShown,o=t.getComponent,a=t.authActions,i=t.authSelectors,s=t.operationProps,c=t.specPath,l=s.toJS(),p=l.summary,f=l.isAuthorized,h=l.method,d=l.op,m=l.showSummary,v=l.path,g=l.operationId,y=l.originalOperationId,b=l.displayOperationId,_=d.summary,w=s.get(\"security\"),x=o(\"authorizeOperationBtn\"),E=o(\"OperationSummaryMethod\"),S=o(\"OperationSummaryPath\"),C=o(\"JumpToPath\",!0),A=w&&!!w.count(),k=A&&1===w.size&&w.first().isEmpty(),O=!A||k;return D.a.createElement(\"div\",{className:\"opblock-summary opblock-summary-\".concat(h)},D.a.createElement(\"button\",{\"aria-label\":u()(e=\"\".concat(h,\" \")).call(e,v.replace(/\\//g,\"​/\")),\"aria-expanded\":n,className:\"opblock-summary-control\",onClick:r},D.a.createElement(E,{method:h}),D.a.createElement(S,{getComponent:o,operationProps:s,specPath:c}),m?D.a.createElement(\"div\",{className:\"opblock-summary-description\"},ft()(_||p)):null,b&&(y||g)?D.a.createElement(\"span\",{className:\"opblock-summary-operation-id\"},y||g):null,D.a.createElement(\"svg\",{className:\"arrow\",width:\"20\",height:\"20\",\"aria-hidden\":\"true\",focusable:\"false\"},D.a.createElement(\"use\",{href:n?\"#large-arrow-up\":\"#large-arrow-down\",xlinkHref:n?\"#large-arrow-up\":\"#large-arrow-down\"}))),O?null:D.a.createElement(x,{isAuthorized:f,onClick:function(){var e=i.definitionsForRequirements(w);a.showDefinitions(e)}}),D.a.createElement(C,{path:c}))}}]),n}(R.PureComponent);y()(ht,\"defaultProps\",{operationProps:null,specPath:Object(B.List)(),summary:\"\"});var dt=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props.method;return D.a.createElement(\"span\",{className:\"opblock-summary-method\"},e.toUpperCase())}}]),n}(R.PureComponent);y()(dt,\"defaultProps\",{operationProps:null});var mt=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onCopyCapture\",(function(e){e.clipboardData.setData(\"text/plain\",r.props.operationProps.get(\"path\")),e.preventDefault()})),r}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.getComponent,r=t.operationProps.toJS(),o=r.deprecated,a=r.isShown,i=r.path,s=r.tag,c=r.operationId,l=r.isDeepLinkingEnabled,p=n(\"DeepLink\");return D.a.createElement(\"span\",{className:o?\"opblock-summary-path__deprecated\":\"opblock-summary-path\",onCopyCapture:this.onCopyCapture,\"data-path\":i},D.a.createElement(p,{enabled:l,isShown:a,path:Object($.d)(u()(e=\"\".concat(s,\"/\")).call(e,c)),text:i.replace(/\\//g,\"​/\")}))}}]),n}(R.PureComponent),vt=n(13),gt=n.n(vt),yt=function(e){var t,n=e.extensions,r=(0,e.getComponent)(\"OperationExtRow\");return D.a.createElement(\"div\",{className:\"opblock-section\"},D.a.createElement(\"div\",{className:\"opblock-section-header\"},D.a.createElement(\"h4\",null,\"Extensions\")),D.a.createElement(\"div\",{className:\"table-container\"},D.a.createElement(\"table\",null,D.a.createElement(\"thead\",null,D.a.createElement(\"tr\",null,D.a.createElement(\"td\",{className:\"col_header\"},\"Field\"),D.a.createElement(\"td\",{className:\"col_header\"},\"Value\"))),D.a.createElement(\"tbody\",null,M()(t=n.entrySeq()).call(t,(function(e){var t,n=gt()(e,2),o=n[0],a=n[1];return D.a.createElement(r,{key:u()(t=\"\".concat(o,\"-\")).call(t,a),xKey:o,xVal:a})}))))))},bt=function(e){var t=e.xKey,n=e.xVal,r=n?n.toJS?n.toJS():n:null;return D.a.createElement(\"tr\",null,D.a.createElement(\"td\",null,t),D.a.createElement(\"td\",null,d()(r)))},_t=n(96),wt=n(43),xt=n.n(wt),Et=n(539),St=n.n(Et),Ct=n(147),At=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"downloadText\",(function(){St()(r.props.value,r.props.fileName||\"response.txt\")})),y()(ve()(r),\"preventYScrollingBeyondElement\",(function(e){var t=e.target,n=e.nativeEvent.deltaY,r=t.scrollHeight,o=t.offsetHeight,a=t.scrollTop;r>o&&(0===a&&n<0||o+a>=r&&n>0)&&e.preventDefault()})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.value,n=e.className,r=e.downloadable,o=e.getConfigs,a=e.canCopy,i=e.language,s=o?o():{syntaxHighlight:{activated:!0,theme:\"agate\"}};n=n||\"\";var u=xt()(s,\"syntaxHighlight.activated\")?D.a.createElement(_t.a,{language:i,className:n+\" microlight\",onWheel:this.preventYScrollingBeyondElement,style:Object(_t.b)(xt()(s,\"syntaxHighlight.theme\"))},t):D.a.createElement(\"pre\",{onWheel:this.preventYScrollingBeyondElement,className:n+\" microlight\"},t);return D.a.createElement(\"div\",{className:\"highlight-code\"},r?D.a.createElement(\"div\",{className:\"download-contents\",onClick:this.downloadText},\"Download\"):null,a?D.a.createElement(\"div\",{className:\"copy-to-clipboard\"},D.a.createElement(Ct.CopyToClipboard,{text:t},D.a.createElement(\"button\",null))):null,u)}}]),n}(R.Component);var kt=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onChangeProducesWrapper\",(function(e){return r.props.specActions.changeProducesValue([r.props.path,r.props.method],e)})),y()(ve()(r),\"onResponseContentTypeChange\",(function(e){var t=e.controlsAcceptHeader,n=e.value,o=r.props,a=o.oas3Actions,i=o.path,s=o.method;t&&a.setResponseContentType({value:n,path:i,method:s})})),r}return x()(n,[{key:\"render\",value:function(){var e,t,r=this,o=this.props,a=o.responses,i=o.tryItOutResponse,s=o.getComponent,c=o.getConfigs,l=o.specSelectors,p=o.fn,f=o.producesValue,h=o.displayRequestDuration,d=o.specPath,m=o.path,v=o.method,g=o.oas3Selectors,y=o.oas3Actions,b=Object($.f)(a),_=s(\"contentType\"),w=s(\"liveResponse\"),x=s(\"response\"),E=this.props.produces&&this.props.produces.size?this.props.produces:n.defaultProps.produces,S=l.isOAS3()?Object($.k)(a):null,C=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"_\";return e.replace(/[^\\w-]/g,t)}(u()(e=\"\".concat(v)).call(e,m,\"_responses\")),A=\"\".concat(C,\"_select\");return D.a.createElement(\"div\",{className:\"responses-wrapper\"},D.a.createElement(\"div\",{className:\"opblock-section-header\"},D.a.createElement(\"h4\",null,\"Responses\"),l.isOAS3()?null:D.a.createElement(\"label\",{htmlFor:A},D.a.createElement(\"span\",null,\"Response content type\"),D.a.createElement(_,{value:f,ariaControls:C,ariaLabel:\"Response content type\",className:\"execute-content-type\",contentTypes:E,controlId:A,onChange:this.onChangeProducesWrapper}))),D.a.createElement(\"div\",{className:\"responses-inner\"},i?D.a.createElement(\"div\",null,D.a.createElement(w,{response:i,getComponent:s,getConfigs:c,specSelectors:l,path:this.props.path,method:this.props.method,displayRequestDuration:h}),D.a.createElement(\"h4\",null,\"Responses\")):null,D.a.createElement(\"table\",{\"aria-live\":\"polite\",className:\"responses-table\",id:C,role:\"region\"},D.a.createElement(\"thead\",null,D.a.createElement(\"tr\",{className:\"responses-header\"},D.a.createElement(\"td\",{className:\"col_header response-col_status\"},\"Code\"),D.a.createElement(\"td\",{className:\"col_header response-col_description\"},\"Description\"),l.isOAS3()?D.a.createElement(\"td\",{className:\"col col_header response-col_links\"},\"Links\"):null)),D.a.createElement(\"tbody\",null,M()(t=a.entrySeq()).call(t,(function(e){var t=gt()(e,2),n=t[0],o=t[1],a=i&&i.get(\"status\")==n?\"response_current\":\"\";return D.a.createElement(x,{key:n,path:m,method:v,specPath:d.push(n),isDefault:b===n,fn:p,className:a,code:n,response:o,specSelectors:l,controlsAcceptHeader:o===S,onContentTypeChange:r.onResponseContentTypeChange,contentType:f,getConfigs:c,activeExamplesKey:g.activeExamplesMember(m,v,\"responses\",n),oas3Actions:y,getComponent:s})})).toArray()))))}}]),n}(D.a.Component);y()(kt,\"defaultProps\",{tryItOutResponse:null,produces:Object(B.fromJS)([\"application/json\"]),displayRequestDuration:!1});var Ot=n(24),jt=n.n(Ot),Tt=n(540),It=n.n(Tt),Pt=n(63),Nt=n.n(Pt),Mt=n(102),Rt=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;return _()(this,n),o=t.call(this,e,r),y()(ve()(o),\"_onContentTypeChange\",(function(e){var t=o.props,n=t.onContentTypeChange,r=t.controlsAcceptHeader;o.setState({responseContentType:e}),n({value:e,controlsAcceptHeader:r})})),y()(ve()(o),\"getTargetExamplesKey\",(function(){var e=o.props,t=e.response,n=e.contentType,r=e.activeExamplesKey,a=o.state.responseContentType||n,i=t.getIn([\"content\",a],Object(B.Map)({})).get(\"examples\",null).keySeq().first();return r||i})),o.state={responseContentType:\"\"},o}return x()(n,[{key:\"render\",value:function(){var e,t,n,r,o,a=this.props,i=a.path,s=a.method,c=a.code,l=a.response,p=a.className,f=a.specPath,h=a.fn,d=a.getComponent,m=a.getConfigs,v=a.specSelectors,g=a.contentType,y=a.controlsAcceptHeader,b=a.oas3Actions,_=h.inferSchema,w=v.isOAS3(),x=m().showExtensions,E=x?Object($.m)(l):null,S=l.get(\"headers\"),C=l.get(\"links\"),A=d(\"ResponseExtension\"),k=d(\"headers\"),O=d(\"highlightCode\"),j=d(\"modelExample\"),T=d(\"Markdown\",!0),I=d(\"operationLink\"),P=d(\"contentType\"),N=d(\"ExamplesSelect\"),R=d(\"Example\"),L=this.state.responseContentType||g,F=l.getIn([\"content\",L],Object(B.Map)({})),U=F.get(\"examples\",null);if(w){var q=F.get(\"schema\");n=q?_(q.toJS()):null,r=q?Object(B.List)([\"content\",this.state.responseContentType,\"schema\"]):f}else n=l.get(\"schema\"),r=l.has(\"schema\")?f.push(\"schema\"):f;var z,V=!1,W={includeReadOnly:!0};if(w){var H;if(z=null===(H=F.get(\"schema\"))||void 0===H?void 0:H.toJS(),U){var J=this.getTargetExamplesKey(),K=function(e){return e.get(\"value\")};void 0===(o=K(U.get(J,Object(B.Map)({}))))&&(o=K(It()(U).call(U).next().value)),V=!0}else void 0!==F.get(\"example\")&&(o=F.get(\"example\"),V=!0)}else{z=n,W=jt()(jt()({},W),{},{includeWriteOnly:!0});var Y=l.getIn([\"examples\",L]);Y&&(o=Y,V=!0)}var G=function(e,t,n){if(null!=e){var r=null;return Object(Mt.a)(e)&&(r=\"json\"),D.a.createElement(\"div\",null,D.a.createElement(t,{className:\"example\",getConfigs:n,language:r,value:Object($.I)(e)}))}return null}(Object($.o)(z,L,W,V?o:void 0),O,m);return D.a.createElement(\"tr\",{className:\"response \"+(p||\"\"),\"data-code\":c},D.a.createElement(\"td\",{className:\"response-col_status\"},c),D.a.createElement(\"td\",{className:\"response-col_description\"},D.a.createElement(\"div\",{className:\"response-col_description__inner\"},D.a.createElement(T,{source:l.get(\"description\")})),x&&E.size?M()(e=E.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(A,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),xKey:r,xVal:o})})):null,w&&l.get(\"content\")?D.a.createElement(\"section\",{className:\"response-controls\"},D.a.createElement(\"div\",{className:Nt()(\"response-control-media-type\",{\"response-control-media-type--accept-controller\":y})},D.a.createElement(\"small\",{className:\"response-control-media-type__title\"},\"Media type\"),D.a.createElement(P,{value:this.state.responseContentType,contentTypes:l.get(\"content\")?l.get(\"content\").keySeq():Object(B.Seq)(),onChange:this._onContentTypeChange,ariaLabel:\"Media Type\"}),y?D.a.createElement(\"small\",{className:\"response-control-media-type__accept-message\"},\"Controls \",D.a.createElement(\"code\",null,\"Accept\"),\" header.\"):null),U?D.a.createElement(\"div\",{className:\"response-control-examples\"},D.a.createElement(\"small\",{className:\"response-control-examples__title\"},\"Examples\"),D.a.createElement(N,{examples:U,currentExampleKey:this.getTargetExamplesKey(),onSelect:function(e){return b.setActiveExamplesMember({name:e,pathMethod:[i,s],contextType:\"responses\",contextName:c})},showLabels:!1})):null):null,G||n?D.a.createElement(j,{specPath:r,getComponent:d,getConfigs:m,specSelectors:v,schema:Object($.i)(n),example:G,includeReadOnly:!0}):null,w&&U?D.a.createElement(R,{example:U.get(this.getTargetExamplesKey(),Object(B.Map)({})),getComponent:d,getConfigs:m,omitValue:!0}):null,S?D.a.createElement(k,{headers:S,getComponent:d}):null),w?D.a.createElement(\"td\",{className:\"response-col_links\"},C?M()(t=C.toSeq().entrySeq()).call(t,(function(e){var t=gt()(e,2),n=t[0],r=t[1];return D.a.createElement(I,{key:n,name:n,link:r,getComponent:d})})):D.a.createElement(\"i\",null,\"No links\")):null)}}]),n}(D.a.Component);y()(Rt,\"defaultProps\",{response:Object(B.fromJS)({}),onContentTypeChange:function(){}});var Dt=function(e){var t=e.xKey,n=e.xVal;return D.a.createElement(\"div\",{className:\"response__extension\"},t,\": \",String(n))},Lt=n(541),Bt=n.n(Lt),Ft=n(542),Ut=n.n(Ft),qt=n(357),zt=n.n(qt),Vt=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"state\",{parsedContent:null}),y()(ve()(r),\"updateParsedContent\",(function(e){var t=r.props.content;if(e!==t)if(t&&t instanceof Blob){var n=new FileReader;n.onload=function(){r.setState({parsedContent:n.result})},n.readAsText(t)}else r.setState({parsedContent:t.toString()})})),r}return x()(n,[{key:\"componentDidMount\",value:function(){this.updateParsedContent(null)}},{key:\"componentDidUpdate\",value:function(e){this.updateParsedContent(e.content)}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.content,o=n.contentType,a=n.url,i=n.headers,s=void 0===i?{}:i,u=n.getConfigs,c=n.getComponent,l=this.state.parsedContent,p=c(\"highlightCode\"),f=\"response_\"+(new Date).getTime();if(a=a||\"\",/^application\\/octet-stream/i.test(o)||s[\"Content-Disposition\"]&&/attachment/i.test(s[\"Content-Disposition\"])||s[\"content-disposition\"]&&/attachment/i.test(s[\"content-disposition\"])||s[\"Content-Description\"]&&/File Transfer/i.test(s[\"Content-Description\"])||s[\"content-description\"]&&/File Transfer/i.test(s[\"content-description\"]))if(\"Blob\"in window){var h=o||\"text/html\",m=r instanceof Blob?r:new Blob([r],{type:h}),v=at.a.createObjectURL(m),g=[h,a.substr(Bt()(a).call(a,\"/\")+1),v].join(\":\"),y=s[\"content-disposition\"]||s[\"Content-Disposition\"];if(void 0!==y){var b=Object($.h)(y);null!==b&&(g=b)}t=H.a.navigator&&H.a.navigator.msSaveOrOpenBlob?D.a.createElement(\"div\",null,D.a.createElement(\"a\",{href:v,onClick:function(){return H.a.navigator.msSaveOrOpenBlob(m,g)}},\"Download file\")):D.a.createElement(\"div\",null,D.a.createElement(\"a\",{href:v,download:g},\"Download file\"))}else t=D.a.createElement(\"pre\",{className:\"microlight\"},\"Download headers detected but your browser does not support downloading binary via XHR (Blob).\");else if(/json/i.test(o)){var _=null;Object(Mt.a)(r)&&(_=\"json\");try{e=d()(JSON.parse(r),null,\"  \")}catch(t){e=\"can't parse JSON.  Raw result:\\n\\n\"+r}t=D.a.createElement(p,{language:_,downloadable:!0,fileName:\"\".concat(f,\".json\"),value:e,getConfigs:u,canCopy:!0})}else/xml/i.test(o)?(e=Ut()(r,{textNodesOnSameLine:!0,indentor:\"  \"}),t=D.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".xml\"),value:e,getConfigs:u,canCopy:!0})):t=\"text/html\"===zt()(o)||/text\\/plain/.test(o)?D.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".html\"),value:r,getConfigs:u,canCopy:!0}):\"text/csv\"===zt()(o)||/text\\/csv/.test(o)?D.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".csv\"),value:r,getConfigs:u,canCopy:!0}):/^image\\//i.test(o)?$e()(o).call(o,\"svg\")?D.a.createElement(\"div\",null,\" \",r,\" \"):D.a.createElement(\"img\",{className:\"full-width\",src:at.a.createObjectURL(r)}):/^audio\\//i.test(o)?D.a.createElement(\"pre\",{className:\"microlight\"},D.a.createElement(\"audio\",{controls:!0},D.a.createElement(\"source\",{src:a,type:o}))):\"string\"==typeof r?D.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".txt\"),value:r,getConfigs:u,canCopy:!0}):r.size>0?l?D.a.createElement(\"div\",null,D.a.createElement(\"p\",{className:\"i\"},\"Unrecognized response type; displaying content as text.\"),D.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".txt\"),value:l,getConfigs:u,canCopy:!0})):D.a.createElement(\"p\",{className:\"i\"},\"Unrecognized response type; unable to display.\"):null;return t?D.a.createElement(\"div\",null,D.a.createElement(\"h5\",null,\"Response body\"),t):null}}]),n}(D.a.PureComponent),Wt=n(14),Ht=n.n(Wt),$t=n(211),Jt=n.n($t),Kt=function(e){ye()(n,e);var t=_e()(n);function n(e){var r;return _()(this,n),r=t.call(this,e),y()(ve()(r),\"onChange\",(function(e,t,n){var o=r.props;(0,o.specActions.changeParamByIdentity)(o.onChangeKey,e,t,n)})),y()(ve()(r),\"onChangeConsumesWrapper\",(function(e){var t=r.props;(0,t.specActions.changeConsumesValue)(t.onChangeKey,e)})),y()(ve()(r),\"toggleTab\",(function(e){return\"parameters\"===e?r.setState({parametersVisible:!0,callbackVisible:!1}):\"callbacks\"===e?r.setState({callbackVisible:!0,parametersVisible:!1}):void 0})),y()(ve()(r),\"onChangeMediaType\",(function(e){var t=e.value,n=e.pathMethod,o=r.props,a=o.specActions,i=o.oas3Selectors,s=o.oas3Actions,u=i.hasUserEditedBody.apply(i,Ht()(n)),c=i.shouldRetainRequestBodyValue.apply(i,Ht()(n));s.setRequestContentType({value:t,pathMethod:n}),s.initRequestBodyValidateError({pathMethod:n}),u||(c||s.setRequestBodyValue({value:void 0,pathMethod:n}),a.clearResponse.apply(a,Ht()(n)),a.clearRequest.apply(a,Ht()(n)),a.clearValidateParams(n))})),r.state={callbackVisible:!1,parametersVisible:!0},r}return x()(n,[{key:\"render\",value:function(){var e,t,n=this,r=this.props,o=r.onTryoutClick,a=r.parameters,i=r.allowTryItOut,s=r.tryItOutEnabled,c=r.specPath,l=r.fn,p=r.getComponent,f=r.getConfigs,h=r.specSelectors,d=r.specActions,m=r.pathMethod,v=r.oas3Actions,g=r.oas3Selectors,y=r.operation,b=p(\"parameterRow\"),_=p(\"TryItOutButton\"),w=p(\"contentType\"),x=p(\"Callbacks\",!0),E=p(\"RequestBody\",!0),S=s&&i,C=h.isOAS3(),A=y.get(\"requestBody\"),k=P()(e=Jt()(P()(a).call(a,(function(e,t){var n,r=t.get(\"in\");return null!==(n=e[r])&&void 0!==n||(e[r]=[]),e[r].push(t),e}),{}))).call(e,(function(e,t){return u()(e).call(e,t)}),[]);return D.a.createElement(\"div\",{className:\"opblock-section\"},D.a.createElement(\"div\",{className:\"opblock-section-header\"},C?D.a.createElement(\"div\",{className:\"tab-header\"},D.a.createElement(\"div\",{onClick:function(){return n.toggleTab(\"parameters\")},className:\"tab-item \".concat(this.state.parametersVisible&&\"active\")},D.a.createElement(\"h4\",{className:\"opblock-title\"},D.a.createElement(\"span\",null,\"Parameters\"))),y.get(\"callbacks\")?D.a.createElement(\"div\",{onClick:function(){return n.toggleTab(\"callbacks\")},className:\"tab-item \".concat(this.state.callbackVisible&&\"active\")},D.a.createElement(\"h4\",{className:\"opblock-title\"},D.a.createElement(\"span\",null,\"Callbacks\"))):null):D.a.createElement(\"div\",{className:\"tab-header\"},D.a.createElement(\"h4\",{className:\"opblock-title\"},\"Parameters\")),i?D.a.createElement(_,{isOAS3:h.isOAS3(),hasUserEditedBody:g.hasUserEditedBody.apply(g,Ht()(m)),enabled:s,onCancelClick:this.props.onCancelClick,onTryoutClick:o,onResetClick:function(){return v.setRequestBodyValue({value:void 0,pathMethod:m})}}):null),this.state.parametersVisible?D.a.createElement(\"div\",{className:\"parameters-container\"},k.length?D.a.createElement(\"div\",{className:\"table-container\"},D.a.createElement(\"table\",{className:\"parameters\"},D.a.createElement(\"thead\",null,D.a.createElement(\"tr\",null,D.a.createElement(\"th\",{className:\"col_header parameters-col_name\"},\"Name\"),D.a.createElement(\"th\",{className:\"col_header parameters-col_description\"},\"Description\"))),D.a.createElement(\"tbody\",null,M()(k).call(k,(function(e,t){var r;return D.a.createElement(b,{fn:l,specPath:c.push(t.toString()),getComponent:p,getConfigs:f,rawParam:e,param:h.parameterWithMetaByIdentity(m,e),key:u()(r=\"\".concat(e.get(\"in\"),\".\")).call(r,e.get(\"name\")),onChange:n.onChange,onChangeConsumes:n.onChangeConsumesWrapper,specSelectors:h,specActions:d,oas3Actions:v,oas3Selectors:g,pathMethod:m,isExecute:S})}))))):D.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},D.a.createElement(\"p\",null,\"No parameters\"))):null,this.state.callbackVisible?D.a.createElement(\"div\",{className:\"callbacks-container opblock-description-wrapper\"},D.a.createElement(x,{callbacks:Object(B.Map)(y.get(\"callbacks\")),specPath:O()(c).call(c,0,-1).push(\"callbacks\")})):null,C&&A&&this.state.parametersVisible&&D.a.createElement(\"div\",{className:\"opblock-section opblock-section-request-body\"},D.a.createElement(\"div\",{className:\"opblock-section-header\"},D.a.createElement(\"h4\",{className:\"opblock-title parameter__name \".concat(A.get(\"required\")&&\"required\")},\"Request body\"),D.a.createElement(\"label\",null,D.a.createElement(w,{value:g.requestContentType.apply(g,Ht()(m)),contentTypes:A.get(\"content\",Object(B.List)()).keySeq(),onChange:function(e){n.onChangeMediaType({value:e,pathMethod:m})},className:\"body-param-content-type\",ariaLabel:\"Request content type\"}))),D.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},D.a.createElement(E,{setRetainRequestBodyValueFlag:function(e){return v.setRetainRequestBodyValueFlag({value:e,pathMethod:m})},userHasEditedBody:g.hasUserEditedBody.apply(g,Ht()(m)),specPath:O()(c).call(c,0,-1).push(\"requestBody\"),requestBody:A,requestBodyValue:g.requestBodyValue.apply(g,Ht()(m)),requestBodyInclusionSetting:g.requestBodyInclusionSetting.apply(g,Ht()(m)),requestBodyErrors:g.requestBodyErrors.apply(g,Ht()(m)),isExecute:S,getConfigs:f,activeExamplesKey:g.activeExamplesMember.apply(g,u()(t=Ht()(m)).call(t,[\"requestBody\",\"requestBody\"])),updateActiveExamplesKey:function(e){n.props.oas3Actions.setActiveExamplesMember({name:e,pathMethod:n.props.pathMethod,contextType:\"requestBody\",contextName:\"requestBody\"})},onChange:function(e,t){if(t){var n=g.requestBodyValue.apply(g,Ht()(m)),r=B.Map.isMap(n)?n:Object(B.Map)();return v.setRequestBodyValue({pathMethod:m,value:r.setIn(t,e)})}v.setRequestBodyValue({value:e,pathMethod:m})},onChangeIncludeEmpty:function(e,t){v.setRequestBodyInclusion({pathMethod:m,value:t,name:e})},contentType:g.requestContentType.apply(g,Ht()(m))}))))}}]),n}(R.Component);y()(Kt,\"defaultProps\",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,tryItOutEnabled:!1,allowTryItOut:!0,onChangeKey:[],specPath:[]});var Yt=function(e){var t=e.xKey,n=e.xVal;return D.a.createElement(\"div\",{className:\"parameter__extension\"},t,\": \",String(n))},Gt={onChange:function(){},isIncludedOptions:{}},Zt=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onCheckboxChange\",(function(e){(0,r.props.onChange)(e.target.checked)})),r}return x()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.isIncludedOptions,n=e.onChange,r=t.shouldDispatchInit,o=t.defaultValue;r&&n(o)}},{key:\"render\",value:function(){var e=this.props,t=e.isIncluded,n=e.isDisabled;return D.a.createElement(\"div\",null,D.a.createElement(\"label\",{className:Nt()(\"parameter__empty_value_toggle\",{disabled:n})},D.a.createElement(\"input\",{type:\"checkbox\",disabled:n,checked:!n&&t,onChange:this.onCheckboxChange}),\"Send empty value\"))}}]),n}(R.Component);y()(Zt,\"defaultProps\",Gt);var Xt=n(149),Qt=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;return _()(this,n),o=t.call(this,e,r),y()(ve()(o),\"onChangeWrapper\",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=o.props,r=n.onChange,a=n.rawParam;return r(a,\"\"===e||e&&0===e.size?null:e,t)})),y()(ve()(o),\"_onExampleSelect\",(function(e){o.props.oas3Actions.setActiveExamplesMember({name:e,pathMethod:o.props.pathMethod,contextType:\"parameters\",contextName:o.getParamKey()})})),y()(ve()(o),\"onChangeIncludeEmpty\",(function(e){var t=o.props,n=t.specActions,r=t.param,a=t.pathMethod,i=r.get(\"name\"),s=r.get(\"in\");return n.updateEmptyParamInclusion(a,i,s,e)})),y()(ve()(o),\"setDefaultValue\",(function(){var e=o.props,t=e.specSelectors,n=e.pathMethod,r=e.rawParam,a=e.oas3Selectors,i=t.parameterWithMetaByIdentity(n,r)||Object(B.Map)(),s=Object(Xt.a)(i,{isOAS3:t.isOAS3()}).schema,c=i.get(\"content\",Object(B.Map)()).keySeq().first(),l=s?Object($.o)(s.toJS(),c,{includeWriteOnly:!0}):null;if(i&&void 0===i.get(\"value\")&&\"body\"!==i.get(\"in\")){var p;if(t.isSwagger2())p=void 0!==i.get(\"x-example\")?i.get(\"x-example\"):void 0!==i.getIn([\"schema\",\"example\"])?i.getIn([\"schema\",\"example\"]):s&&s.getIn([\"default\"]);else if(t.isOAS3()){var f,h=a.activeExamplesMember.apply(a,u()(f=Ht()(n)).call(f,[\"parameters\",o.getParamKey()]));p=void 0!==i.getIn([\"examples\",h,\"value\"])?i.getIn([\"examples\",h,\"value\"]):void 0!==i.getIn([\"content\",c,\"example\"])?i.getIn([\"content\",c,\"example\"]):void 0!==i.get(\"example\")?i.get(\"example\"):void 0!==(s&&s.get(\"example\"))?s&&s.get(\"example\"):void 0!==(s&&s.get(\"default\"))?s&&s.get(\"default\"):i.get(\"default\")}void 0===p||B.List.isList(p)||(p=Object($.I)(p)),void 0!==p?o.onChangeWrapper(p):s&&\"object\"===s.get(\"type\")&&l&&!i.get(\"examples\")&&o.onChangeWrapper(B.List.isList(l)?l:Object($.I)(l))}})),o.setDefaultValue(),o}return x()(n,[{key:\"componentWillReceiveProps\",value:function(e){var t,n=e.specSelectors,r=e.pathMethod,o=e.rawParam,a=n.isOAS3(),i=n.parameterWithMetaByIdentity(r,o)||new B.Map;if(i=i.isEmpty()?o:i,a){var s=Object(Xt.a)(i,{isOAS3:a}).schema;t=s?s.get(\"enum\"):void 0}else t=i?i.get(\"enum\"):void 0;var u,c=i?i.get(\"value\"):void 0;void 0!==c?u=c:o.get(\"required\")&&t&&t.size&&(u=t.first()),void 0!==u&&u!==c&&this.onChangeWrapper(Object($.w)(u)),this.setDefaultValue()}},{key:\"getParamKey\",value:function(){var e,t=this.props.param;return t?u()(e=\"\".concat(t.get(\"name\"),\"-\")).call(e,t.get(\"in\")):null}},{key:\"render\",value:function(){var e,t,n,r,o=this.props,a=o.param,i=o.rawParam,s=o.getComponent,c=o.getConfigs,l=o.isExecute,p=o.fn,f=o.onChangeConsumes,h=o.specSelectors,d=o.pathMethod,m=o.specPath,v=o.oas3Selectors,g=h.isOAS3(),y=c(),b=y.showExtensions,_=y.showCommonExtensions;if(a||(a=i),!i)return null;var w,x,E,S,C=s(\"JsonSchemaForm\"),A=s(\"ParamBody\"),k=a.get(\"in\"),O=\"body\"!==k?null:D.a.createElement(A,{getComponent:s,getConfigs:c,fn:p,param:a,consumes:h.consumesOptionsFor(d),consumesValue:h.contentTypeValues(d).get(\"requestContentType\"),onChange:this.onChangeWrapper,onChangeConsumes:f,isExecute:l,specSelectors:h,pathMethod:d}),j=s(\"modelExample\"),T=s(\"Markdown\",!0),I=s(\"ParameterExt\"),P=s(\"ParameterIncludeEmpty\"),N=s(\"ExamplesSelectValueRetainer\"),R=s(\"Example\"),L=Object(Xt.a)(a,{isOAS3:g}).schema,F=h.parameterWithMetaByIdentity(d,i)||Object(B.Map)(),U=L?L.get(\"format\"):null,q=L?L.get(\"type\"):null,z=L?L.getIn([\"items\",\"type\"]):null,V=\"formData\"===k,W=\"FormData\"in H.a,J=a.get(\"required\"),K=F?F.get(\"value\"):\"\",Y=_?Object($.l)(L):null,G=b?Object($.m)(a):null,Z=!1;return void 0!==a&&L&&(w=L.get(\"items\")),void 0!==w?(x=w.get(\"enum\"),E=w.get(\"default\")):L&&(x=L.get(\"enum\")),x&&x.size&&x.size>0&&(Z=!0),void 0!==a&&(L&&(E=L.get(\"default\")),void 0===E&&(E=a.get(\"default\")),void 0===(S=a.get(\"example\"))&&(S=a.get(\"x-example\"))),D.a.createElement(\"tr\",{\"data-param-name\":a.get(\"name\"),\"data-param-in\":a.get(\"in\")},D.a.createElement(\"td\",{className:\"parameters-col_name\"},D.a.createElement(\"div\",{className:J?\"parameter__name required\":\"parameter__name\"},a.get(\"name\"),J?D.a.createElement(\"span\",null,\" *\"):null),D.a.createElement(\"div\",{className:\"parameter__type\"},q,z&&\"[\".concat(z,\"]\"),U&&D.a.createElement(\"span\",{className:\"prop-format\"},\"($\",U,\")\")),D.a.createElement(\"div\",{className:\"parameter__deprecated\"},g&&a.get(\"deprecated\")?\"deprecated\":null),D.a.createElement(\"div\",{className:\"parameter__in\"},\"(\",a.get(\"in\"),\")\"),_&&Y.size?M()(e=Y.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(I,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),xKey:r,xVal:o})})):null,b&&G.size?M()(t=G.entrySeq()).call(t,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(I,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),xKey:r,xVal:o})})):null),D.a.createElement(\"td\",{className:\"parameters-col_description\"},a.get(\"description\")?D.a.createElement(T,{source:a.get(\"description\")}):null,!O&&l||!Z?null:D.a.createElement(T,{className:\"parameter__enum\",source:\"<i>Available values</i> : \"+M()(x).call(x,(function(e){return e})).toArray().join(\", \")}),!O&&l||void 0===E?null:D.a.createElement(T,{className:\"parameter__default\",source:\"<i>Default value</i> : \"+E}),!O&&l||void 0===S?null:D.a.createElement(T,{source:\"<i>Example</i> : \"+S}),V&&!W&&D.a.createElement(\"div\",null,\"Error: your browser does not support FormData\"),g&&a.get(\"examples\")?D.a.createElement(\"section\",{className:\"parameter-controls\"},D.a.createElement(N,{examples:a.get(\"examples\"),onSelect:this._onExampleSelect,updateValue:this.onChangeWrapper,getComponent:s,defaultToFirstExample:!0,currentKey:v.activeExamplesMember.apply(v,u()(n=Ht()(d)).call(n,[\"parameters\",this.getParamKey()])),currentUserInputValue:K})):null,O?null:D.a.createElement(C,{fn:p,getComponent:s,value:K,required:J,disabled:!l,description:a.get(\"name\"),onChange:this.onChangeWrapper,errors:F.get(\"errors\"),schema:L}),O&&L?D.a.createElement(j,{getComponent:s,specPath:m.push(\"schema\"),getConfigs:c,isExecute:l,specSelectors:h,schema:L,example:O,includeWriteOnly:!0}):null,!O&&l&&a.get(\"allowEmptyValue\")?D.a.createElement(P,{onChange:this.onChangeIncludeEmpty,isIncluded:h.parameterInclusionSettingFor(d,a.get(\"name\"),a.get(\"in\")),isDisabled:!Object($.q)(K)}):null,g&&a.get(\"examples\")?D.a.createElement(R,{example:a.getIn([\"examples\",v.activeExamplesMember.apply(v,u()(r=Ht()(d)).call(r,[\"parameters\",this.getParamKey()]))]),getComponent:s,getConfigs:c}):null))}}]),n}(R.Component),en=n(23),tn=n.n(en),nn=n(218),rn=n.n(nn),on=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"handleValidateParameters\",(function(){var e=r.props,t=e.specSelectors,n=e.specActions,o=e.path,a=e.method;return n.validateParams([o,a]),t.validateBeforeExecute([o,a])})),y()(ve()(r),\"handleValidateRequestBody\",(function(){var e=r.props,t=e.path,n=e.method,o=e.specSelectors,a=e.oas3Selectors,i=e.oas3Actions,s={missingBodyValue:!1,missingRequiredKeys:[]};i.clearRequestBodyValidateError({path:t,method:n});var u=o.getOAS3RequiredRequestBodyContentType([t,n]),c=a.requestBodyValue(t,n),l=a.validateBeforeExecute([t,n]),p=a.requestContentType(t,n);if(!l)return s.missingBodyValue=!0,i.setRequestBodyValidateError({path:t,method:n,validationErrors:s}),!1;if(!u)return!0;var f=a.validateShallowRequired({oas3RequiredRequestBodyContentType:u,oas3RequestContentType:p,oas3RequestBodyValue:c});return!f||f.length<1||(tn()(f).call(f,(function(e){s.missingRequiredKeys.push(e)})),i.setRequestBodyValidateError({path:t,method:n,validationErrors:s}),!1)})),y()(ve()(r),\"handleValidationResultPass\",(function(){var e=r.props,t=e.specActions,n=e.operation,o=e.path,a=e.method;r.props.onExecute&&r.props.onExecute(),t.execute({operation:n,path:o,method:a})})),y()(ve()(r),\"handleValidationResultFail\",(function(){var e=r.props,t=e.specActions,n=e.path,o=e.method;t.clearValidateParams([n,o]),rn()((function(){t.validateParams([n,o])}),40)})),y()(ve()(r),\"handleValidationResult\",(function(e){e?r.handleValidationResultPass():r.handleValidationResultFail()})),y()(ve()(r),\"onClick\",(function(){var e=r.handleValidateParameters(),t=r.handleValidateRequestBody(),n=e&&t;r.handleValidationResult(n)})),y()(ve()(r),\"onChangeProducesWrapper\",(function(e){return r.props.specActions.changeProducesValue([r.props.path,r.props.method],e)})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props.disabled;return D.a.createElement(\"button\",{className:\"btn execute opblock-control__btn\",onClick:this.onClick,disabled:e},\"Execute\")}}]),n}(R.Component),an=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.headers,r=t.getComponent,o=r(\"Property\"),a=r(\"Markdown\",!0);return n&&n.size?D.a.createElement(\"div\",{className:\"headers-wrapper\"},D.a.createElement(\"h4\",{className:\"headers__title\"},\"Headers:\"),D.a.createElement(\"table\",{className:\"headers\"},D.a.createElement(\"thead\",null,D.a.createElement(\"tr\",{className:\"header-row\"},D.a.createElement(\"th\",{className:\"header-col\"},\"Name\"),D.a.createElement(\"th\",{className:\"header-col\"},\"Description\"),D.a.createElement(\"th\",{className:\"header-col\"},\"Type\"))),D.a.createElement(\"tbody\",null,M()(e=n.entrySeq()).call(e,(function(e){var t=gt()(e,2),n=t[0],r=t[1];if(!F.a.Map.isMap(r))return null;var i=r.get(\"description\"),s=r.getIn([\"schema\"])?r.getIn([\"schema\",\"type\"]):r.getIn([\"type\"]),u=r.getIn([\"schema\",\"example\"]);return D.a.createElement(\"tr\",{key:n},D.a.createElement(\"td\",{className:\"header-col\"},n),D.a.createElement(\"td\",{className:\"header-col\"},i?D.a.createElement(a,{source:i}):null),D.a.createElement(\"td\",{className:\"header-col\"},s,\" \",u?D.a.createElement(o,{propKey:\"Example\",propVal:u,propClass:\"header-example\"}):null))})).toArray()))):null}}]),n}(D.a.Component),sn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.editorActions,n=e.errSelectors,r=e.layoutSelectors,o=e.layoutActions,a=(0,e.getComponent)(\"Collapse\");if(t&&t.jumpToLine)var i=t.jumpToLine;var s=n.allErrors(),u=l()(s).call(s,(function(e){return\"thrown\"===e.get(\"type\")||\"error\"===e.get(\"level\")}));if(!u||u.count()<1)return null;var c=r.isShown([\"errorPane\"],!0),p=u.sortBy((function(e){return e.get(\"line\")}));return D.a.createElement(\"pre\",{className:\"errors-wrapper\"},D.a.createElement(\"hgroup\",{className:\"error\"},D.a.createElement(\"h4\",{className:\"errors__title\"},\"Errors\"),D.a.createElement(\"button\",{className:\"btn errors__clear-btn\",onClick:function(){return o.show([\"errorPane\"],!c)}},c?\"Hide\":\"Show\")),D.a.createElement(a,{isOpened:c,animated:!0},D.a.createElement(\"div\",{className:\"errors\"},M()(p).call(p,(function(e,t){var n=e.get(\"type\");return\"thrown\"===n||\"auth\"===n?D.a.createElement(un,{key:t,error:e.get(\"error\")||e,jumpToLine:i}):\"spec\"===n?D.a.createElement(cn,{key:t,error:e,jumpToLine:i}):void 0})))))}}]),n}(D.a.Component),un=function(e){var t=e.error,n=e.jumpToLine;if(!t)return null;var r=t.get(\"line\");return D.a.createElement(\"div\",{className:\"error-wrapper\"},t?D.a.createElement(\"div\",null,D.a.createElement(\"h4\",null,t.get(\"source\")&&t.get(\"level\")?ln(t.get(\"source\"))+\" \"+t.get(\"level\"):\"\",t.get(\"path\")?D.a.createElement(\"small\",null,\" at \",t.get(\"path\")):null),D.a.createElement(\"span\",{className:\"message thrown\"},t.get(\"message\")),D.a.createElement(\"div\",{className:\"error-line\"},r&&n?D.a.createElement(\"a\",{onClick:S()(n).call(n,null,r)},\"Jump to line \",r):null)):null)},cn=function(e){var t=e.error,n=e.jumpToLine,r=null;return t.get(\"path\")?r=B.List.isList(t.get(\"path\"))?D.a.createElement(\"small\",null,\"at \",t.get(\"path\").join(\".\")):D.a.createElement(\"small\",null,\"at \",t.get(\"path\")):t.get(\"line\")&&!n&&(r=D.a.createElement(\"small\",null,\"on line \",t.get(\"line\"))),D.a.createElement(\"div\",{className:\"error-wrapper\"},t?D.a.createElement(\"div\",null,D.a.createElement(\"h4\",null,ln(t.get(\"source\"))+\" \"+t.get(\"level\"),\" \",r),D.a.createElement(\"span\",{className:\"message\"},t.get(\"message\")),D.a.createElement(\"div\",{className:\"error-line\"},n?D.a.createElement(\"a\",{onClick:S()(n).call(n,null,t.get(\"line\"))},\"Jump to line \",t.get(\"line\")):null)):null)};function ln(e){var t;return M()(t=(e||\"\").split(\" \")).call(t,(function(e){return e[0].toUpperCase()+O()(e).call(e,1)})).join(\" \")}un.defaultProps={jumpToLine:null};var pn=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onChangeWrapper\",(function(e){return r.props.onChange(e.target.value)})),r}return x()(n,[{key:\"componentDidMount\",value:function(){this.props.contentTypes&&this.props.onChange(this.props.contentTypes.first())}},{key:\"componentWillReceiveProps\",value:function(e){var t;e.contentTypes&&e.contentTypes.size&&($e()(t=e.contentTypes).call(t,e.value)||e.onChange(e.contentTypes.first()))}},{key:\"render\",value:function(){var e=this.props,t=e.ariaControls,n=e.ariaLabel,r=e.className,o=e.contentTypes,a=e.controlId,i=e.value;return o&&o.size?D.a.createElement(\"div\",{className:\"content-type-wrapper \"+(r||\"\")},D.a.createElement(\"select\",{\"aria-controls\":t,\"aria-label\":n,className:\"content-type\",id:a,onChange:this.onChangeWrapper,value:i||\"\"},M()(o).call(o,(function(e){return D.a.createElement(\"option\",{key:e,value:e},e)})).toArray())):null}}]),n}(D.a.Component);y()(pn,\"defaultProps\",{onChange:function(){},value:null,contentTypes:Object(B.fromJS)([\"application/json\"])});var fn=n(28),hn=n.n(fn),dn=n(53),mn=n.n(dn),vn=n(101),gn=n.n(vn),yn=[\"fullscreen\",\"full\"],bn=[\"hide\",\"keepContents\",\"mobile\",\"tablet\",\"desktop\",\"large\"];function _n(){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return gn()(e=l()(n).call(n,(function(e){return!!e})).join(\" \")).call(e)}var wn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.fullscreen,n=e.full,r=mn()(e,yn);if(t)return D.a.createElement(\"section\",r);var o=\"swagger-container\"+(n?\"-full\":\"\");return D.a.createElement(\"section\",hn()({},r,{className:_n(r.className,o)}))}}]),n}(D.a.Component),xn={mobile:\"\",tablet:\"-tablet\",desktop:\"-desktop\",large:\"-hd\"},En=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.hide,r=t.keepContents,o=(t.mobile,t.tablet,t.desktop,t.large,mn()(t,bn));if(n&&!r)return D.a.createElement(\"span\",null);var a=[];for(var i in xn)if(Object.prototype.hasOwnProperty.call(xn,i)){var s=xn[i];if(i in this.props){var c=this.props[i];if(c<1){a.push(\"none\"+s);continue}a.push(\"block\"+s),a.push(\"col-\"+c+s)}}n&&a.push(\"hidden\");var l=_n.apply(void 0,u()(e=[o.className]).call(e,a));return D.a.createElement(\"section\",hn()({},o,{className:l}))}}]),n}(D.a.Component),Sn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){return D.a.createElement(\"div\",hn()({},this.props,{className:_n(this.props.className,\"wrapper\")}))}}]),n}(D.a.Component),Cn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){return D.a.createElement(\"button\",hn()({},this.props,{className:_n(this.props.className,\"button\")}))}}]),n}(D.a.Component);y()(Cn,\"defaultProps\",{className:\"\"});var An=function(e){return D.a.createElement(\"textarea\",e)},kn=function(e){return D.a.createElement(\"input\",e)},On=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o,a;return _()(this,n),o=t.call(this,e,r),y()(ve()(o),\"onChange\",(function(e){var t,n,r=o.props,a=r.onChange,i=r.multiple,s=O()([]).call(e.target.options);i?t=M()(n=l()(s).call(s,(function(e){return e.selected}))).call(n,(function(e){return e.value})):t=e.target.value;o.setState({value:t}),a&&a(t)})),a=e.value?e.value:e.multiple?[\"\"]:\"\",o.state={value:a},o}return x()(n,[{key:\"componentWillReceiveProps\",value:function(e){e.value!==this.props.value&&this.setState({value:e.value})}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.allowedValues,o=n.multiple,a=n.allowEmptyValue,i=n.disabled,s=(null===(e=this.state.value)||void 0===e||null===(t=e.toJS)||void 0===t?void 0:t.call(e))||this.state.value;return D.a.createElement(\"select\",{className:this.props.className,multiple:o,value:s,onChange:this.onChange,disabled:i},a?D.a.createElement(\"option\",{value:\"\"},\"--\"):null,M()(r).call(r,(function(e,t){return D.a.createElement(\"option\",{key:t,value:String(e)},String(e))})))}}]),n}(D.a.Component);y()(On,\"defaultProps\",{multiple:!1,allowEmptyValue:!0});var jn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){return D.a.createElement(\"a\",hn()({},this.props,{rel:\"noopener noreferrer\",className:_n(this.props.className,\"link\")}))}}]),n}(D.a.Component),Tn=function(e){var t=e.children;return D.a.createElement(\"div\",{className:\"no-margin\"},\" \",t,\" \")},In=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"renderNotAnimated\",value:function(){return this.props.isOpened?D.a.createElement(Tn,null,this.props.children):D.a.createElement(\"noscript\",null)}},{key:\"render\",value:function(){var e=this.props,t=e.animated,n=e.isOpened,r=e.children;return t?(r=n?r:null,D.a.createElement(Tn,null,r)):this.renderNotAnimated()}}]),n}(D.a.Component);y()(In,\"defaultProps\",{isOpened:!1,animated:!1});var Pn=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r,o;_()(this,n);for(var a=arguments.length,i=new Array(a),s=0;s<a;s++)i[s]=arguments[s];return(o=t.call.apply(t,u()(e=[this]).call(e,i))).setTagShown=S()(r=o._setTagShown).call(r,ve()(o)),o}return x()(n,[{key:\"_setTagShown\",value:function(e,t){this.props.layoutActions.show(e,t)}},{key:\"showOp\",value:function(e,t){this.props.layoutActions.show(e,t)}},{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.layoutSelectors,r=e.layoutActions,o=e.getComponent,a=t.taggedOperations(),i=o(\"Collapse\");return D.a.createElement(\"div\",null,D.a.createElement(\"h4\",{className:\"overview-title\"},\"Overview\"),M()(a).call(a,(function(e,t){var o=e.get(\"operations\"),a=[\"overview-tags\",t],s=n.isShown(a,!0);return D.a.createElement(\"div\",{key:\"overview-\"+t},D.a.createElement(\"h4\",{onClick:function(){return r.show(a,!s)},className:\"link overview-tag\"},\" \",s?\"-\":\"+\",t),D.a.createElement(i,{isOpened:s,animated:!0},M()(o).call(o,(function(e){var t=e.toObject(),o=t.path,a=t.method,i=t.id,s=\"operations\",u=i,c=n.isShown([s,u]);return D.a.createElement(Nn,{key:i,path:o,method:a,id:o+\"-\"+a,shown:c,showOpId:u,showOpIdPrefix:s,href:\"#operation-\".concat(u),onClick:r.show})})).toArray()))})).toArray(),a.size<1&&D.a.createElement(\"h3\",null,\" No operations defined in spec! \"))}}]),n}(D.a.Component),Nn=function(e){ye()(n,e);var t=_e()(n);function n(e){var r,o;return _()(this,n),(o=t.call(this,e)).onClick=S()(r=o._onClick).call(r,ve()(o)),o}return x()(n,[{key:\"_onClick\",value:function(){var e=this.props,t=e.showOpId,n=e.showOpIdPrefix;(0,e.onClick)([n,t],!e.shown)}},{key:\"render\",value:function(){var e=this.props,t=e.id,n=e.method,r=e.shown,o=e.href;return D.a.createElement(jn,{href:o,onClick:this.onClick,className:\"block opblock-link \".concat(r?\"shown\":\"\")},D.a.createElement(\"div\",null,D.a.createElement(\"small\",{className:\"bold-label-\".concat(n)},n.toUpperCase()),D.a.createElement(\"span\",{className:\"bold-label\"},t)))}}]),n}(D.a.Component),Mn=[\"value\",\"defaultValue\",\"initialValue\"],Rn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"componentDidMount\",value:function(){this.props.initialValue&&(this.inputRef.value=this.props.initialValue)}},{key:\"render\",value:function(){var e=this,t=this.props,n=(t.value,t.defaultValue,t.initialValue,mn()(t,Mn));return D.a.createElement(\"input\",hn()({},n,{ref:function(t){return e.inputRef=t}}))}}]),n}(D.a.Component),Dn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.host,n=e.basePath;return D.a.createElement(\"pre\",{className:\"base-url\"},\"[ Base URL: \",t,n,\" ]\")}}]),n}(D.a.Component),Ln=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.data,n=e.getComponent,r=e.selectedServer,o=e.url,a=t.get(\"name\")||\"the developer\",i=ut(t.get(\"url\"),o,{selectedServer:r}),s=t.get(\"email\"),u=n(\"Link\");return D.a.createElement(\"div\",{className:\"info__contact\"},i&&D.a.createElement(\"div\",null,D.a.createElement(u,{href:Object($.F)(i),target:\"_blank\"},a,\" - Website\")),s&&D.a.createElement(u,{href:Object($.F)(\"mailto:\".concat(s))},i?\"Send email to \".concat(a):\"Contact \".concat(a)))}}]),n}(D.a.Component),Bn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.license,n=e.getComponent,r=e.selectedServer,o=e.url,a=n(\"Link\"),i=t.get(\"name\")||\"License\",s=ut(t.get(\"url\"),o,{selectedServer:r});return D.a.createElement(\"div\",{className:\"info__license\"},s?D.a.createElement(a,{target:\"_blank\",href:Object($.F)(s)},i):D.a.createElement(\"span\",null,i))}}]),n}(D.a.Component),Fn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.url,n=(0,e.getComponent)(\"Link\");return D.a.createElement(n,{target:\"_blank\",href:Object($.F)(t)},D.a.createElement(\"span\",{className:\"url\"},\" \",t))}}]),n}(D.a.PureComponent),Un=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.info,n=e.url,r=e.host,o=e.basePath,a=e.getComponent,i=e.externalDocs,s=e.selectedServer,u=e.url,c=t.get(\"version\"),l=t.get(\"description\"),p=t.get(\"title\"),f=ut(t.get(\"termsOfService\"),u,{selectedServer:s}),h=t.get(\"contact\"),d=t.get(\"license\"),m=ut(i&&i.get(\"url\"),u,{selectedServer:s}),v=i&&i.get(\"description\"),g=a(\"Markdown\",!0),y=a(\"Link\"),b=a(\"VersionStamp\"),_=a(\"InfoUrl\"),w=a(\"InfoBasePath\");return D.a.createElement(\"div\",{className:\"info\"},D.a.createElement(\"hgroup\",{className:\"main\"},D.a.createElement(\"h2\",{className:\"title\"},p,c&&D.a.createElement(b,{version:c})),r||o?D.a.createElement(w,{host:r,basePath:o}):null,n&&D.a.createElement(_,{getComponent:a,url:n})),D.a.createElement(\"div\",{className:\"description\"},D.a.createElement(g,{source:l})),f&&D.a.createElement(\"div\",{className:\"info__tos\"},D.a.createElement(y,{target:\"_blank\",href:Object($.F)(f)},\"Terms of service\")),h&&h.size?D.a.createElement(Ln,{getComponent:a,data:h,selectedServer:s,url:n}):null,d&&d.size?D.a.createElement(Bn,{getComponent:a,license:d,selectedServer:s,url:n}):null,m?D.a.createElement(y,{className:\"info__extdocs\",target:\"_blank\",href:Object($.F)(m)},v||m):null)}}]),n}(D.a.Component),qn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.getComponent,r=e.oas3Selectors,o=t.info(),a=t.url(),i=t.basePath(),s=t.host(),u=t.externalDocs(),c=r.selectedServer(),l=n(\"info\");return D.a.createElement(\"div\",null,o&&o.count()?D.a.createElement(l,{info:o,url:a,host:s,basePath:i,externalDocs:u,getComponent:n,selectedServer:c}):null)}}]),n}(D.a.Component),zn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){return null}}]),n}(D.a.Component),Vn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){return D.a.createElement(\"div\",{className:\"footer\"})}}]),n}(D.a.Component),Wn=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onFilterChange\",(function(e){var t=e.target.value;r.props.layoutActions.updateFilter(t)})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.layoutSelectors,r=(0,e.getComponent)(\"Col\"),o=\"loading\"===t.loadingStatus(),a=\"failed\"===t.loadingStatus(),i=n.currentFilter(),s=[\"operation-filter-input\"];return a&&s.push(\"failed\"),o&&s.push(\"loading\"),D.a.createElement(\"div\",null,null===i||!1===i||\"false\"===i?null:D.a.createElement(\"div\",{className:\"filter-container\"},D.a.createElement(r,{className:\"filter wrapper\",mobile:12},D.a.createElement(\"input\",{className:s.join(\" \"),placeholder:\"Filter by tag\",type:\"text\",onChange:this.onFilterChange,value:!0===i||\"true\"===i?\"\":i,disabled:o}))))}}]),n}(D.a.Component),Hn=Function.prototype,$n=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;return _()(this,n),o=t.call(this,e,r),y()(ve()(o),\"updateValues\",(function(e){var t=e.param,n=e.isExecute,r=e.consumesValue,a=void 0===r?\"\":r,i=/xml/i.test(a),s=/json/i.test(a),u=i?t.get(\"value_xml\"):t.get(\"value\");if(void 0!==u){var c=!u&&s?\"{}\":u;o.setState({value:c}),o.onChange(c,{isXml:i,isEditBox:n})}else i?o.onChange(o.sample(\"xml\"),{isXml:i,isEditBox:n}):o.onChange(o.sample(),{isEditBox:n})})),y()(ve()(o),\"sample\",(function(e){var t=o.props,n=t.param,r=(0,t.fn.inferSchema)(n.toJS());return Object($.o)(r,e,{includeWriteOnly:!0})})),y()(ve()(o),\"onChange\",(function(e,t){var n=t.isEditBox,r=t.isXml;o.setState({value:e,isEditBox:n}),o._onChange(e,r)})),y()(ve()(o),\"_onChange\",(function(e,t){(o.props.onChange||Hn)(e,t)})),y()(ve()(o),\"handleOnChange\",(function(e){var t=o.props.consumesValue,n=/xml/i.test(t),r=e.target.value;o.onChange(r,{isXml:n})})),y()(ve()(o),\"toggleIsEditBox\",(function(){return o.setState((function(e){return{isEditBox:!e.isEditBox}}))})),o.state={isEditBox:!1,value:\"\"},o}return x()(n,[{key:\"componentDidMount\",value:function(){this.updateValues.call(this,this.props)}},{key:\"componentWillReceiveProps\",value:function(e){this.updateValues.call(this,e)}},{key:\"render\",value:function(){var e=this.props,t=e.onChangeConsumes,r=e.param,o=e.isExecute,a=e.specSelectors,i=e.pathMethod,s=e.getConfigs,u=e.getComponent,c=u(\"Button\"),l=u(\"TextArea\"),p=u(\"highlightCode\"),f=u(\"contentType\"),h=(a?a.parameterWithMetaByIdentity(i,r):r).get(\"errors\",Object(B.List)()),d=a.contentTypeValues(i).get(\"requestContentType\"),m=this.props.consumes&&this.props.consumes.size?this.props.consumes:n.defaultProp.consumes,v=this.state,g=v.value,y=v.isEditBox,b=null;return Object(Mt.a)(g)&&(b=\"json\"),D.a.createElement(\"div\",{className:\"body-param\",\"data-param-name\":r.get(\"name\"),\"data-param-in\":r.get(\"in\")},y&&o?D.a.createElement(l,{className:\"body-param__text\"+(h.count()?\" invalid\":\"\"),value:g,onChange:this.handleOnChange}):g&&D.a.createElement(p,{className:\"body-param__example\",language:b,getConfigs:s,value:g}),D.a.createElement(\"div\",{className:\"body-param-options\"},o?D.a.createElement(\"div\",{className:\"body-param-edit\"},D.a.createElement(c,{className:y?\"btn cancel body-param__example-edit\":\"btn edit body-param__example-edit\",onClick:this.toggleIsEditBox},y?\"Cancel\":\"Edit\")):null,D.a.createElement(\"label\",{htmlFor:\"\"},D.a.createElement(\"span\",null,\"Parameter content type\"),D.a.createElement(f,{value:d,contentTypes:m,onChange:t,className:\"body-param-content-type\",ariaLabel:\"Parameter content type\"}))))}}]),n}(R.PureComponent);y()($n,\"defaultProp\",{consumes:Object(B.fromJS)([\"application/json\"]),param:Object(B.fromJS)({}),onChange:Hn,onChangeConsumes:Hn});var Jn=n(169),Kn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.request,n=e.getConfigs,r=Object(Jn.requestSnippetGenerator_curl_bash)(t),o=n(),a=xt()(o,\"syntaxHighlight.activated\")?D.a.createElement(_t.a,{language:\"bash\",className:\"curl microlight\",onWheel:this.preventYScrollingBeyondElement,style:Object(_t.b)(xt()(o,\"syntaxHighlight.theme\"))},r):D.a.createElement(\"textarea\",{readOnly:!0,className:\"curl\",value:r});return D.a.createElement(\"div\",{className:\"curl-command\"},D.a.createElement(\"h4\",null,\"Curl\"),D.a.createElement(\"div\",{className:\"copy-to-clipboard\"},D.a.createElement(Ct.CopyToClipboard,{text:r},D.a.createElement(\"button\",null))),D.a.createElement(\"div\",null,a))}}]),n}(D.a.Component),Yn=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onChange\",(function(e){r.setScheme(e.target.value)})),y()(ve()(r),\"setScheme\",(function(e){var t=r.props,n=t.path,o=t.method;t.specActions.setScheme(e,n,o)})),r}return x()(n,[{key:\"componentWillMount\",value:function(){var e=this.props.schemes;this.setScheme(e.first())}},{key:\"componentWillReceiveProps\",value:function(e){var t;this.props.currentScheme&&$e()(t=e.schemes).call(t,this.props.currentScheme)||this.setScheme(e.schemes.first())}},{key:\"render\",value:function(){var e,t=this.props,n=t.schemes,r=t.currentScheme;return D.a.createElement(\"label\",{htmlFor:\"schemes\"},D.a.createElement(\"span\",{className:\"schemes-title\"},\"Schemes\"),D.a.createElement(\"select\",{onChange:this.onChange,value:r},M()(e=n.valueSeq()).call(e,(function(e){return D.a.createElement(\"option\",{value:e,key:e},e)})).toArray()))}}]),n}(D.a.Component),Gn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specActions,n=e.specSelectors,r=e.getComponent,o=n.operationScheme(),a=n.schemes(),i=r(\"schemes\");return a&&a.size?D.a.createElement(i,{currentScheme:o,schemes:a,specActions:t}):null}}]),n}(D.a.Component),Zn=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;_()(this,n),o=t.call(this,e,r),y()(ve()(o),\"toggleCollapsed\",(function(){o.props.onToggle&&o.props.onToggle(o.props.modelName,!o.state.expanded),o.setState({expanded:!o.state.expanded})})),y()(ve()(o),\"onLoad\",(function(e){if(e&&o.props.layoutSelectors){var t=o.props.layoutSelectors.getScrollToKey();F.a.is(t,o.props.specPath)&&o.toggleCollapsed(),o.props.layoutActions.readyToScroll(o.props.specPath,e.parentElement)}}));var a=o.props,i=a.expanded,s=a.collapsedContent;return o.state={expanded:i,collapsedContent:s||n.defaultProps.collapsedContent},o}return x()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.hideSelfOnExpand,n=e.expanded,r=e.modelName;t&&n&&this.props.onToggle(r,n)}},{key:\"componentWillReceiveProps\",value:function(e){this.props.expanded!==e.expanded&&this.setState({expanded:e.expanded})}},{key:\"render\",value:function(){var e=this.props,t=e.title,n=e.classes;return this.state.expanded&&this.props.hideSelfOnExpand?D.a.createElement(\"span\",{className:n||\"\"},this.props.children):D.a.createElement(\"span\",{className:n||\"\",ref:this.onLoad},D.a.createElement(\"button\",{\"aria-expanded\":this.state.expanded,className:\"model-box-control\",onClick:this.toggleCollapsed},t&&D.a.createElement(\"span\",{className:\"pointer\"},t),D.a.createElement(\"span\",{className:\"model-toggle\"+(this.state.expanded?\"\":\" collapsed\")}),!this.state.expanded&&D.a.createElement(\"span\",null,this.state.collapsedContent)),this.state.expanded&&this.props.children)}}]),n}(R.Component);y()(Zn,\"defaultProps\",{collapsedContent:\"{...}\",expanded:!1,title:null,onToggle:function(){},hideSelfOnExpand:!1,specPath:F.a.List([])});var Xn=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;_()(this,n),o=t.call(this,e,r),y()(ve()(o),\"activeTab\",(function(e){var t=e.target.dataset.name;o.setState({activeTab:t})}));var a=o.props,i=a.getConfigs,s=a.isExecute,u=i().defaultModelRendering,c=u;return\"example\"!==u&&\"model\"!==u&&(c=\"example\"),s&&(c=\"example\"),o.state={activeTab:c},o}return x()(n,[{key:\"componentWillReceiveProps\",value:function(e){e.isExecute&&!this.props.isExecute&&this.props.example&&this.setState({activeTab:\"example\"})}},{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.specSelectors,r=e.schema,o=e.example,a=e.isExecute,i=e.getConfigs,s=e.specPath,u=e.includeReadOnly,c=e.includeWriteOnly,l=i().defaultModelExpandDepth,p=t(\"ModelWrapper\"),f=t(\"highlightCode\"),h=n.isOAS3();return D.a.createElement(\"div\",{className:\"model-example\"},D.a.createElement(\"ul\",{className:\"tab\"},D.a.createElement(\"li\",{className:\"tabitem\"+(\"example\"===this.state.activeTab?\" active\":\"\")},D.a.createElement(\"a\",{className:\"tablinks\",\"data-name\":\"example\",onClick:this.activeTab},a?\"Edit Value\":\"Example Value\")),r?D.a.createElement(\"li\",{className:\"tabitem\"+(\"model\"===this.state.activeTab?\" active\":\"\")},D.a.createElement(\"a\",{className:\"tablinks\"+(a?\" inactive\":\"\"),\"data-name\":\"model\",onClick:this.activeTab},h?\"Schema\":\"Model\")):null),D.a.createElement(\"div\",null,\"example\"===this.state.activeTab?o||D.a.createElement(f,{value:\"(no example available)\",getConfigs:i}):null,\"model\"===this.state.activeTab&&D.a.createElement(p,{schema:r,getComponent:t,getConfigs:i,specSelectors:n,expandDepth:l,specPath:s,includeReadOnly:u,includeWriteOnly:c})))}}]),n}(D.a.Component),Qn=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onToggle\",(function(e,t){r.props.layoutActions&&r.props.layoutActions.show(r.props.fullPath,t)})),r}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.getComponent,r=t.getConfigs,o=n(\"Model\");return this.props.layoutSelectors&&(e=this.props.layoutSelectors.isShown(this.props.fullPath)),D.a.createElement(\"div\",{className:\"model-box\"},D.a.createElement(o,hn()({},this.props,{getConfigs:r,expanded:e,depth:1,onToggle:this.onToggle,expandDepth:this.props.expandDepth||0})))}}]),n}(R.Component),er=n(222),tr=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"getSchemaBasePath\",(function(){return r.props.specSelectors.isOAS3()?[\"components\",\"schemas\"]:[\"definitions\"]})),y()(ve()(r),\"getCollapsedContent\",(function(){return\" \"})),y()(ve()(r),\"handleToggle\",(function(e,t){var n,o;(r.props.layoutActions.show(u()(n=[]).call(n,Ht()(r.getSchemaBasePath()),[e]),t),t)&&r.props.specActions.requestResolvedSubtree(u()(o=[]).call(o,Ht()(r.getSchemaBasePath()),[e]))})),y()(ve()(r),\"onLoadModels\",(function(e){e&&r.props.layoutActions.readyToScroll(r.getSchemaBasePath(),e)})),y()(ve()(r),\"onLoadModel\",(function(e){if(e){var t,n=e.getAttribute(\"data-name\");r.props.layoutActions.readyToScroll(u()(t=[]).call(t,Ht()(r.getSchemaBasePath()),[n]),e)}})),r}return x()(n,[{key:\"render\",value:function(){var e,t=this,n=this.props,r=n.specSelectors,o=n.getComponent,a=n.layoutSelectors,i=n.layoutActions,s=n.getConfigs,c=r.definitions(),l=s(),p=l.docExpansion,f=l.defaultModelsExpandDepth;if(!c.size||f<0)return null;var h=this.getSchemaBasePath(),d=a.isShown(h,f>0&&\"none\"!==p),m=r.isOAS3(),v=o(\"ModelWrapper\"),g=o(\"Collapse\"),y=o(\"ModelCollapse\"),b=o(\"JumpToPath\");return D.a.createElement(\"section\",{className:d?\"models is-open\":\"models\",ref:this.onLoadModels},D.a.createElement(\"h4\",null,D.a.createElement(\"button\",{\"aria-expanded\":d,className:\"models-control\",onClick:function(){return i.show(h,!d)}},D.a.createElement(\"span\",null,m?\"Schemas\":\"Models\"),D.a.createElement(\"svg\",{width:\"20\",height:\"20\",\"aria-hidden\":\"true\",focusable:\"false\"},D.a.createElement(\"use\",{xlinkHref:d?\"#large-arrow-up\":\"#large-arrow-down\"})))),D.a.createElement(g,{isOpened:d},M()(e=c.entrySeq()).call(e,(function(e){var n,c=gt()(e,1)[0],l=u()(n=[]).call(n,Ht()(h),[c]),p=F.a.List(l),d=r.specResolvedSubtree(l),m=r.specJson().getIn(l),g=B.Map.isMap(d)?d:F.a.Map(),_=B.Map.isMap(m)?m:F.a.Map(),w=g.get(\"title\")||_.get(\"title\")||c,x=a.isShown(l,!1);x&&0===g.size&&_.size>0&&t.props.specActions.requestResolvedSubtree(l);var E=D.a.createElement(v,{name:c,expandDepth:f,schema:g||F.a.Map(),displayName:w,fullPath:l,specPath:p,getComponent:o,specSelectors:r,getConfigs:s,layoutSelectors:a,layoutActions:i,includeReadOnly:!0,includeWriteOnly:!0}),S=D.a.createElement(\"span\",{className:\"model-box\"},D.a.createElement(\"span\",{className:\"model model-title\"},w));return D.a.createElement(\"div\",{id:\"model-\".concat(c),className:\"model-container\",key:\"models-section-\".concat(c),\"data-name\":c,ref:t.onLoadModel},D.a.createElement(\"span\",{className:\"models-jump-to-path\"},D.a.createElement(b,{specPath:p})),D.a.createElement(y,{classes:\"model-box\",collapsedContent:t.getCollapsedContent(c),onToggle:t.handleToggle,title:S,displayName:w,modelName:c,specPath:p,layoutSelectors:a,layoutActions:i,hideSelfOnExpand:!0,expanded:f>0&&x},E))})).toArray()))}}]),n}(R.Component),nr=function(e){var t=e.value,n=(0,e.getComponent)(\"ModelCollapse\"),r=D.a.createElement(\"span\",null,\"Array [ \",t.count(),\" ]\");return D.a.createElement(\"span\",{className:\"prop-enum\"},\"Enum:\",D.a.createElement(\"br\",null),D.a.createElement(n,{collapsedContent:r},\"[ \",t.join(\", \"),\" ]\"))},rr=[\"schema\",\"name\",\"displayName\",\"isRef\",\"getComponent\",\"getConfigs\",\"depth\",\"onToggle\",\"expanded\",\"specPath\"],or=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t,n,r,o=this.props,a=o.schema,i=o.name,s=o.displayName,c=o.isRef,p=o.getComponent,f=o.getConfigs,h=o.depth,m=o.onToggle,v=o.expanded,g=o.specPath,y=mn()(o,rr),b=y.specSelectors,_=y.expandDepth,w=y.includeReadOnly,x=y.includeWriteOnly,E=b.isOAS3;if(!a)return null;var S=f().showExtensions,C=a.get(\"description\"),A=a.get(\"properties\"),k=a.get(\"additionalProperties\"),j=a.get(\"title\")||s||i,T=a.get(\"required\"),I=l()(a).call(a,(function(e,t){var n;return-1!==xe()(n=[\"maxProperties\",\"minProperties\",\"nullable\",\"example\"]).call(n,t)})),P=a.get(\"deprecated\"),N=p(\"JumpToPath\",!0),R=p(\"Markdown\",!0),L=p(\"Model\"),F=p(\"ModelCollapse\"),U=p(\"Property\"),q=function(){return D.a.createElement(\"span\",{className:\"model-jump-to-path\"},D.a.createElement(N,{specPath:g}))},z=D.a.createElement(\"span\",null,D.a.createElement(\"span\",null,\"{\"),\"...\",D.a.createElement(\"span\",null,\"}\"),c?D.a.createElement(q,null):\"\"),V=b.isOAS3()?a.get(\"anyOf\"):null,W=b.isOAS3()?a.get(\"oneOf\"):null,H=b.isOAS3()?a.get(\"not\"):null,$=j&&D.a.createElement(\"span\",{className:\"model-title\"},c&&a.get(\"$$ref\")&&D.a.createElement(\"span\",{className:\"model-hint\"},a.get(\"$$ref\")),D.a.createElement(\"span\",{className:\"model-title__text\"},j));return D.a.createElement(\"span\",{className:\"model\"},D.a.createElement(F,{modelName:i,title:$,onToggle:m,expanded:!!v||h<=_,collapsedContent:z},D.a.createElement(\"span\",{className:\"brace-open object\"},\"{\"),c?D.a.createElement(q,null):null,D.a.createElement(\"span\",{className:\"inner-object\"},D.a.createElement(\"table\",{className:\"model\"},D.a.createElement(\"tbody\",null,C?D.a.createElement(\"tr\",{className:\"description\"},D.a.createElement(\"td\",null,\"description:\"),D.a.createElement(\"td\",null,D.a.createElement(R,{source:C}))):null,P?D.a.createElement(\"tr\",{className:\"property\"},D.a.createElement(\"td\",null,\"deprecated:\"),D.a.createElement(\"td\",null,\"true\")):null,A&&A.size?M()(e=l()(t=A.entrySeq()).call(t,(function(e){var t=gt()(e,2)[1];return(!t.get(\"readOnly\")||w)&&(!t.get(\"writeOnly\")||x)}))).call(e,(function(e){var t,n,r=gt()(e,2),o=r[0],a=r[1],s=E()&&a.get(\"deprecated\"),c=B.List.isList(T)&&T.contains(o),l=[\"property-row\"];return s&&l.push(\"deprecated\"),c&&l.push(\"required\"),D.a.createElement(\"tr\",{key:o,className:l.join(\" \")},D.a.createElement(\"td\",null,o,c&&D.a.createElement(\"span\",{className:\"star\"},\"*\")),D.a.createElement(\"td\",null,D.a.createElement(L,hn()({key:u()(t=u()(n=\"object-\".concat(i,\"-\")).call(n,o,\"_\")).call(t,a)},y,{required:c,getComponent:p,specPath:g.push(\"properties\",o),getConfigs:f,schema:a,depth:h+1}))))})).toArray():null,S?D.a.createElement(\"tr\",null,D.a.createElement(\"td\",null,\" \")):null,S?M()(n=a.entrySeq()).call(n,(function(e){var t=gt()(e,2),n=t[0],r=t[1];if(\"x-\"===O()(n).call(n,0,2)){var o=r?r.toJS?r.toJS():r:null;return D.a.createElement(\"tr\",{key:n,className:\"extension\"},D.a.createElement(\"td\",null,n),D.a.createElement(\"td\",null,d()(o)))}})).toArray():null,k&&k.size?D.a.createElement(\"tr\",null,D.a.createElement(\"td\",null,\"< * >:\"),D.a.createElement(\"td\",null,D.a.createElement(L,hn()({},y,{required:!1,getComponent:p,specPath:g.push(\"additionalProperties\"),getConfigs:f,schema:k,depth:h+1})))):null,V?D.a.createElement(\"tr\",null,D.a.createElement(\"td\",null,\"anyOf ->\"),D.a.createElement(\"td\",null,M()(V).call(V,(function(e,t){return D.a.createElement(\"div\",{key:t},D.a.createElement(L,hn()({},y,{required:!1,getComponent:p,specPath:g.push(\"anyOf\",t),getConfigs:f,schema:e,depth:h+1})))})))):null,W?D.a.createElement(\"tr\",null,D.a.createElement(\"td\",null,\"oneOf ->\"),D.a.createElement(\"td\",null,M()(W).call(W,(function(e,t){return D.a.createElement(\"div\",{key:t},D.a.createElement(L,hn()({},y,{required:!1,getComponent:p,specPath:g.push(\"oneOf\",t),getConfigs:f,schema:e,depth:h+1})))})))):null,H?D.a.createElement(\"tr\",null,D.a.createElement(\"td\",null,\"not ->\"),D.a.createElement(\"td\",null,D.a.createElement(\"div\",null,D.a.createElement(L,hn()({},y,{required:!1,getComponent:p,specPath:g.push(\"not\"),getConfigs:f,schema:H,depth:h+1}))))):null))),D.a.createElement(\"span\",{className:\"brace-close\"},\"}\")),I.size?M()(r=I.entrySeq()).call(r,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(U,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),propKey:r,propVal:o,propClass:\"property\"})})):null)}}]),n}(R.Component),ar=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.getComponent,r=t.getConfigs,o=t.schema,a=t.depth,i=t.expandDepth,s=t.name,c=t.displayName,p=t.specPath,f=o.get(\"description\"),h=o.get(\"items\"),d=o.get(\"title\")||c||s,m=l()(o).call(o,(function(e,t){var n;return-1===xe()(n=[\"type\",\"items\",\"description\",\"$$ref\"]).call(n,t)})),v=n(\"Markdown\",!0),g=n(\"ModelCollapse\"),y=n(\"Model\"),b=n(\"Property\"),_=d&&D.a.createElement(\"span\",{className:\"model-title\"},D.a.createElement(\"span\",{className:\"model-title__text\"},d));return D.a.createElement(\"span\",{className:\"model\"},D.a.createElement(g,{title:_,expanded:a<=i,collapsedContent:\"[...]\"},\"[\",m.size?M()(e=m.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(b,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),propKey:r,propVal:o,propClass:\"property\"})})):null,f?D.a.createElement(v,{source:f}):m.size?D.a.createElement(\"div\",{className:\"markdown\"}):null,D.a.createElement(\"span\",null,D.a.createElement(y,hn()({},this.props,{getConfigs:r,specPath:p.push(\"items\"),name:null,schema:h,required:!1,depth:a+1}))),\"]\"))}}]),n}(R.Component),ir=\"property primitive\",sr=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t,n,r=this.props,o=r.schema,a=r.getComponent,i=r.getConfigs,s=r.name,c=r.displayName,p=r.depth,f=i().showExtensions;if(!o||!o.get)return D.a.createElement(\"div\",null);var h=o.get(\"type\"),d=o.get(\"format\"),m=o.get(\"xml\"),v=o.get(\"enum\"),g=o.get(\"title\")||c||s,y=o.get(\"description\"),b=Object($.m)(o),_=l()(o).call(o,(function(e,t){var n;return-1===xe()(n=[\"enum\",\"type\",\"format\",\"description\",\"$$ref\"]).call(n,t)})).filterNot((function(e,t){return b.has(t)})),w=a(\"Markdown\",!0),x=a(\"EnumModel\"),E=a(\"Property\");return D.a.createElement(\"span\",{className:\"model\"},D.a.createElement(\"span\",{className:\"prop\"},s&&D.a.createElement(\"span\",{className:\"\".concat(1===p&&\"model-title\",\" prop-name\")},g),D.a.createElement(\"span\",{className:\"prop-type\"},h),d&&D.a.createElement(\"span\",{className:\"prop-format\"},\"($\",d,\")\"),_.size?M()(e=_.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(E,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),propKey:r,propVal:o,propClass:ir})})):null,f&&b.size?M()(t=b.entrySeq()).call(t,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(E,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),propKey:r,propVal:o,propClass:ir})})):null,y?D.a.createElement(w,{source:y}):null,m&&m.size?D.a.createElement(\"span\",null,D.a.createElement(\"br\",null),D.a.createElement(\"span\",{className:ir},\"xml:\"),M()(n=m.entrySeq()).call(n,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(\"span\",{key:u()(t=\"\".concat(r,\"-\")).call(t,o),className:ir},D.a.createElement(\"br\",null),\"   \",r,\": \",String(o))})).toArray()):null,v&&D.a.createElement(x,{value:v,getComponent:a})))}}]),n}(R.Component),ur=function(e){var t=e.propKey,n=e.propVal,r=e.propClass;return D.a.createElement(\"span\",{className:r},D.a.createElement(\"br\",null),t,\": \",String(n))},cr=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.onTryoutClick,n=e.onCancelClick,r=e.onResetClick,o=e.enabled,a=e.hasUserEditedBody,i=e.isOAS3&&a;return D.a.createElement(\"div\",{className:i?\"try-out btn-group\":\"try-out\"},o?D.a.createElement(\"button\",{className:\"btn try-out__btn cancel\",onClick:n},\"Cancel\"):D.a.createElement(\"button\",{className:\"btn try-out__btn\",onClick:t},\"Try it out \"),i&&D.a.createElement(\"button\",{className:\"btn try-out__btn reset\",onClick:r},\"Reset\"))}}]),n}(D.a.Component);y()(cr,\"defaultProps\",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,onResetClick:Function.prototype,enabled:!1,hasUserEditedBody:!1,isOAS3:!1});var lr=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.bypass,n=e.isSwagger2,r=e.isOAS3,o=e.alsoShow;return t?D.a.createElement(\"div\",null,this.props.children):n&&r?D.a.createElement(\"div\",{className:\"version-pragma\"},o,D.a.createElement(\"div\",{className:\"version-pragma__message version-pragma__message--ambiguous\"},D.a.createElement(\"div\",null,D.a.createElement(\"h3\",null,\"Unable to render this definition\"),D.a.createElement(\"p\",null,D.a.createElement(\"code\",null,\"swagger\"),\" and \",D.a.createElement(\"code\",null,\"openapi\"),\" fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields.\"),D.a.createElement(\"p\",null,\"Supported version fields are \",D.a.createElement(\"code\",null,\"swagger: \",'\"2.0\"'),\" and those that match \",D.a.createElement(\"code\",null,\"openapi: 3.0.n\"),\" (for example, \",D.a.createElement(\"code\",null,\"openapi: 3.0.0\"),\").\")))):n||r?D.a.createElement(\"div\",null,this.props.children):D.a.createElement(\"div\",{className:\"version-pragma\"},o,D.a.createElement(\"div\",{className:\"version-pragma__message version-pragma__message--missing\"},D.a.createElement(\"div\",null,D.a.createElement(\"h3\",null,\"Unable to render this definition\"),D.a.createElement(\"p\",null,\"The provided definition does not specify a valid version field.\"),D.a.createElement(\"p\",null,\"Please indicate a valid Swagger or OpenAPI version field. Supported version fields are \",D.a.createElement(\"code\",null,\"swagger: \",'\"2.0\"'),\" and those that match \",D.a.createElement(\"code\",null,\"openapi: 3.0.n\"),\" (for example, \",D.a.createElement(\"code\",null,\"openapi: 3.0.0\"),\").\"))))}}]),n}(D.a.PureComponent);y()(lr,\"defaultProps\",{alsoShow:null,children:null,bypass:!1});var pr=function(e){var t=e.version;return D.a.createElement(\"small\",null,D.a.createElement(\"pre\",{className:\"version\"},\" \",t,\" \"))},fr=function(e){var t=e.enabled,n=e.path,r=e.text;return D.a.createElement(\"a\",{className:\"nostyle\",onClick:t?function(e){return e.preventDefault()}:null,href:t?\"#/\".concat(n):null},D.a.createElement(\"span\",null,r))},hr=function(){return D.a.createElement(\"div\",null,D.a.createElement(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",xmlnsXlink:\"http://www.w3.org/1999/xlink\",className:\"svg-assets\"},D.a.createElement(\"defs\",null,D.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"unlocked\"},D.a.createElement(\"path\",{d:\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"locked\"},D.a.createElement(\"path\",{d:\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"close\"},D.a.createElement(\"path\",{d:\"M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"large-arrow\"},D.a.createElement(\"path\",{d:\"M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"large-arrow-down\"},D.a.createElement(\"path\",{d:\"M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"large-arrow-up\"},D.a.createElement(\"path\",{d:\"M 17.418 14.908 C 17.69 15.176 18.127 15.176 18.397 14.908 C 18.667 14.64 18.668 14.207 18.397 13.939 L 10.489 6.109 C 10.219 5.841 9.782 5.841 9.51 6.109 L 1.602 13.939 C 1.332 14.207 1.332 14.64 1.602 14.908 C 1.873 15.176 2.311 15.176 2.581 14.908 L 10 7.767 L 17.418 14.908 Z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 24 24\",id:\"jump-to\"},D.a.createElement(\"path\",{d:\"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 24 24\",id:\"expand\"},D.a.createElement(\"path\",{d:\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"})))))},dr=n(221),mr=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.errSelectors,n=e.specSelectors,r=e.getComponent,o=r(\"SvgAssets\"),a=r(\"InfoContainer\",!0),i=r(\"VersionPragmaFilter\"),s=r(\"operations\",!0),u=r(\"Models\",!0),c=r(\"Row\"),l=r(\"Col\"),p=r(\"errors\",!0),f=r(\"ServersContainer\",!0),h=r(\"SchemesContainer\",!0),d=r(\"AuthorizeBtnContainer\",!0),m=r(\"FilterContainer\",!0),v=n.isSwagger2(),g=n.isOAS3(),y=!n.specStr(),b=n.loadingStatus(),_=null;if(\"loading\"===b&&(_=D.a.createElement(\"div\",{className:\"info\"},D.a.createElement(\"div\",{className:\"loading-container\"},D.a.createElement(\"div\",{className:\"loading\"})))),\"failed\"===b&&(_=D.a.createElement(\"div\",{className:\"info\"},D.a.createElement(\"div\",{className:\"loading-container\"},D.a.createElement(\"h4\",{className:\"title\"},\"Failed to load API definition.\"),D.a.createElement(p,null)))),\"failedConfig\"===b){var w=t.lastError(),x=w?w.get(\"message\"):\"\";_=D.a.createElement(\"div\",{className:\"info failed-config\"},D.a.createElement(\"div\",{className:\"loading-container\"},D.a.createElement(\"h4\",{className:\"title\"},\"Failed to load remote configuration.\"),D.a.createElement(\"p\",null,x)))}if(!_&&y&&(_=D.a.createElement(\"h4\",null,\"No API definition provided.\")),_)return D.a.createElement(\"div\",{className:\"swagger-ui\"},D.a.createElement(\"div\",{className:\"loading-container\"},_));var E=n.servers(),S=n.schemes(),C=E&&E.size,A=S&&S.size,k=!!n.securityDefinitions();return D.a.createElement(\"div\",{className:\"swagger-ui\"},D.a.createElement(o,null),D.a.createElement(i,{isSwagger2:v,isOAS3:g,alsoShow:D.a.createElement(p,null)},D.a.createElement(p,null),D.a.createElement(c,{className:\"information-container\"},D.a.createElement(l,{mobile:12},D.a.createElement(a,null))),C||A||k?D.a.createElement(\"div\",{className:\"scheme-container\"},D.a.createElement(l,{className:\"schemes wrapper\",mobile:12},C?D.a.createElement(f,null):null,A?D.a.createElement(h,null):null,k?D.a.createElement(d,null):null)):null,D.a.createElement(m,null),D.a.createElement(c,null,D.a.createElement(l,{mobile:12,desktop:12},D.a.createElement(s,null))),D.a.createElement(c,null,D.a.createElement(l,{mobile:12,desktop:12},D.a.createElement(u,null)))))}}]),n}(D.a.Component),vr=n(358),gr=n.n(vr),yr={value:\"\",onChange:function(){},schema:{},keyName:\"\",required:!1,errors:Object(B.List)()},br=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.dispatchInitialValue,n=e.value,r=e.onChange;t?r(n):!1===t&&r(\"\")}},{key:\"render\",value:function(){var e,t=this.props,n=t.schema,r=t.errors,o=t.value,a=t.onChange,i=t.getComponent,s=t.fn,c=t.disabled,l=n&&n.get?n.get(\"format\"):null,p=n&&n.get?n.get(\"type\"):null,f=function(e){return i(e,!1,{failSilently:!0})},h=p?f(l?u()(e=\"JsonSchema_\".concat(p,\"_\")).call(e,l):\"JsonSchema_\".concat(p)):i(\"JsonSchema_string\");return h||(h=i(\"JsonSchema_string\")),D.a.createElement(h,hn()({},this.props,{errors:r,fn:s,getComponent:i,value:o,onChange:a,schema:n,disabled:c}))}}]),n}(R.Component);y()(br,\"defaultProps\",yr);var _r=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onChange\",(function(e){var t=r.props.schema&&\"file\"===r.props.schema.get(\"type\")?e.target.files[0]:e.target.value;r.props.onChange(t,r.props.keyName)})),y()(ve()(r),\"onEnumChange\",(function(e){return r.props.onChange(e)})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.schema,o=e.errors,a=e.required,i=e.description,s=e.disabled,u=r&&r.get?r.get(\"enum\"):null,c=r&&r.get?r.get(\"format\"):null,l=r&&r.get?r.get(\"type\"):null,p=r&&r.get?r.get(\"in\"):null;if(n||(n=\"\"),o=o.toJS?o.toJS():[],u){var f=t(\"Select\");return D.a.createElement(f,{className:o.length?\"invalid\":\"\",title:o.length?o:\"\",allowedValues:u,value:n,allowEmptyValue:!a,disabled:s,onChange:this.onEnumChange})}var h=s||p&&\"formData\"===p&&!(\"FormData\"in window),d=t(\"Input\");return l&&\"file\"===l?D.a.createElement(d,{type:\"file\",className:o.length?\"invalid\":\"\",title:o.length?o:\"\",onChange:this.onChange,disabled:h}):D.a.createElement(gr.a,{type:c&&\"password\"===c?\"password\":\"text\",className:o.length?\"invalid\":\"\",title:o.length?o:\"\",value:n,minLength:0,debounceTimeout:350,placeholder:i,onChange:this.onChange,disabled:h})}}]),n}(R.Component);y()(_r,\"defaultProps\",yr);var wr=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;return _()(this,n),o=t.call(this,e,r),y()(ve()(o),\"onChange\",(function(){o.props.onChange(o.state.value)})),y()(ve()(o),\"onItemChange\",(function(e,t){o.setState((function(n){return{value:n.value.set(t,e)}}),o.onChange)})),y()(ve()(o),\"removeItem\",(function(e){o.setState((function(t){return{value:t.value.delete(e)}}),o.onChange)})),y()(ve()(o),\"addItem\",(function(){var e=kr(o.state.value);o.setState((function(){return{value:e.push(Object($.o)(o.state.schema.get(\"items\"),!1,{includeWriteOnly:!0}))}}),o.onChange)})),y()(ve()(o),\"onEnumChange\",(function(e){o.setState((function(){return{value:e}}),o.onChange)})),o.state={value:kr(e.value),schema:e.schema},o}return x()(n,[{key:\"componentWillReceiveProps\",value:function(e){var t=kr(e.value);t!==this.state.value&&this.setState({value:t}),e.schema!==this.state.schema&&this.setState({schema:e.schema})}},{key:\"render\",value:function(){var e,t=this,n=this.props,r=n.getComponent,o=n.required,a=n.schema,i=n.errors,s=n.fn,c=n.disabled;i=i.toJS?i.toJS():T()(i)?i:[];var p,f,h=l()(i).call(i,(function(e){return\"string\"==typeof e})),d=M()(e=l()(i).call(i,(function(e){return void 0!==e.needRemove}))).call(e,(function(e){return e.error})),m=this.state.value,v=!!(m&&m.count&&m.count()>0),g=a.getIn([\"items\",\"enum\"]),y=a.getIn([\"items\",\"type\"]),b=a.getIn([\"items\",\"format\"]),_=a.get(\"items\"),w=!1,x=\"file\"===y||\"string\"===y&&\"binary\"===b;y&&b?p=r(u()(f=\"JsonSchema_\".concat(y,\"_\")).call(f,b)):\"boolean\"!==y&&\"array\"!==y&&\"object\"!==y||(p=r(\"JsonSchema_\".concat(y)));if(p||x||(w=!0),g){var E=r(\"Select\");return D.a.createElement(E,{className:i.length?\"invalid\":\"\",title:i.length?i:\"\",multiple:!0,value:m,disabled:c,allowedValues:g,allowEmptyValue:!o,onChange:this.onEnumChange})}var S=r(\"Button\");return D.a.createElement(\"div\",{className:\"json-schema-array\"},v?M()(m).call(m,(function(e,n){var o,a=Object(B.fromJS)(Ht()(M()(o=l()(i).call(i,(function(e){return e.index===n}))).call(o,(function(e){return e.error}))));return D.a.createElement(\"div\",{key:n,className:\"json-schema-form-item\"},x?D.a.createElement(Er,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:c,errors:a,getComponent:r}):w?D.a.createElement(xr,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:c,errors:a}):D.a.createElement(p,hn()({},t.props,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:c,errors:a,schema:_,getComponent:r,fn:s})),c?null:D.a.createElement(S,{className:\"btn btn-sm json-schema-form-item-remove \".concat(d.length?\"invalid\":null),title:d.length?d:\"\",onClick:function(){return t.removeItem(n)}},\" - \"))})):null,c?null:D.a.createElement(S,{className:\"btn btn-sm json-schema-form-item-add \".concat(h.length?\"invalid\":null),title:h.length?h:\"\",onClick:this.addItem},\"Add \",y?\"\".concat(y,\" \"):\"\",\"item\"))}}]),n}(R.PureComponent);y()(wr,\"defaultProps\",yr);var xr=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onChange\",(function(e){var t=e.target.value;r.props.onChange(t,r.props.keyName)})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.value,n=e.errors,r=e.description,o=e.disabled;return t||(t=\"\"),n=n.toJS?n.toJS():[],D.a.createElement(gr.a,{type:\"text\",className:n.length?\"invalid\":\"\",title:n.length?n:\"\",value:t,minLength:0,debounceTimeout:350,placeholder:r,onChange:this.onChange,disabled:o})}}]),n}(R.Component);y()(xr,\"defaultProps\",yr);var Er=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onFileChange\",(function(e){var t=e.target.files[0];r.props.onChange(t,r.props.keyName)})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.errors,r=e.disabled,o=t(\"Input\"),a=r||!(\"FormData\"in window);return D.a.createElement(o,{type:\"file\",className:n.length?\"invalid\":\"\",title:n.length?n:\"\",onChange:this.onFileChange,disabled:a})}}]),n}(R.Component);y()(Er,\"defaultProps\",yr);var Sr=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onEnumChange\",(function(e){return r.props.onChange(e)})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.errors,o=e.schema,a=e.required,i=e.disabled;r=r.toJS?r.toJS():[];var s=o&&o.get?o.get(\"enum\"):null,u=!s||!a,c=!s&&Object(B.fromJS)([\"true\",\"false\"]),l=t(\"Select\");return D.a.createElement(l,{className:r.length?\"invalid\":\"\",title:r.length?r:\"\",value:String(n),disabled:i,allowedValues:s||c,allowEmptyValue:u,onChange:this.onEnumChange})}}]),n}(R.Component);y()(Sr,\"defaultProps\",yr);var Cr=function(e){return M()(e).call(e,(function(e){var t,n=void 0!==e.propKey?e.propKey:e.index,r=\"string\"==typeof e?e:\"string\"==typeof e.error?e.error:null;if(!n&&r)return r;for(var o=e.error,a=\"/\".concat(e.propKey);\"object\"===i()(o);){var s=void 0!==o.propKey?o.propKey:o.index;if(void 0===s)break;if(a+=\"/\".concat(s),!o.error)break;o=o.error}return u()(t=\"\".concat(a,\": \")).call(t,o)}))},Ar=function(e){ye()(n,e);var t=_e()(n);function n(){var e;return _()(this,n),e=t.call(this),y()(ve()(e),\"onChange\",(function(t){e.props.onChange(t)})),y()(ve()(e),\"handleOnChange\",(function(t){var n=t.target.value;e.onChange(n)})),e}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.errors,o=e.disabled,a=t(\"TextArea\");return r=r.toJS?r.toJS():T()(r)?r:[],D.a.createElement(\"div\",null,D.a.createElement(a,{className:Nt()({invalid:r.length}),title:r.length?Cr(r).join(\", \"):\"\",value:Object($.I)(n),disabled:o,onChange:this.handleOnChange}))}}]),n}(R.PureComponent);function kr(e){return B.List.isList(e)?e:T()(e)?Object(B.fromJS)(e):Object(B.List)()}y()(Ar,\"defaultProps\",yr);var Or=function(){var e={components:{App:Ce,authorizationPopup:Ae,authorizeBtn:ke,AuthorizeBtnContainer:Oe,authorizeOperationBtn:je,auths:Te,AuthItem:Ie,authError:Pe,oauth2:Ye,apiKeyAuth:Ne,basicAuth:Me,clear:Ge,liveResponse:Qe,InitializedInput:Rn,info:Un,InfoContainer:qn,JumpToPath:zn,onlineValidatorBadge:et.a,operations:rt,operation:lt,OperationSummary:ht,OperationSummaryMethod:dt,OperationSummaryPath:mt,highlightCode:At,responses:kt,response:Rt,ResponseExtension:Dt,responseBody:Vt,parameters:Kt,parameterRow:Qt,execute:on,headers:an,errors:sn,contentType:pn,overview:Pn,footer:Vn,FilterContainer:Wn,ParamBody:$n,curl:Kn,schemes:Yn,SchemesContainer:Gn,modelExample:Xn,ModelWrapper:Qn,ModelCollapse:Zn,Model:er.a,Models:tr,EnumModel:nr,ObjectModel:or,ArrayModel:ar,PrimitiveModel:sr,Property:ur,TryItOutButton:cr,Markdown:dr.a,BaseLayout:mr,VersionPragmaFilter:lr,VersionStamp:pr,OperationExt:yt,OperationExtRow:bt,ParameterExt:Yt,ParameterIncludeEmpty:Zt,OperationTag:ct,OperationContainer:Se,DeepLink:fr,InfoUrl:Fn,InfoBasePath:Dn,SvgAssets:hr,Example:Re,ExamplesSelect:Be,ExamplesSelectValueRetainer:Ue}},t={components:r},n={components:o};return[pe.default,ce.default,ie.default,re.default,ne.default,ee.default,te.default,oe.default,e,t,se.default,n,ue.default,le.default,fe.default,he.default,de.default,ae.default]},jr=n(321);function Tr(){return[Or,jr.default]}var Ir=n(342);var Pr=!0,Nr=\"gee40b00\",Mr=\"3.52.0\",Rr=\"ip-172-31-21-173\",Dr=\"Mon, 09 Aug 2021 15:13:17 GMT\";function Lr(e){var t;H.a.versions=H.a.versions||{},H.a.versions.swaggerUi={version:Mr,gitRevision:Nr,gitDirty:Pr,buildTimestamp:Dr,machine:Rr};var n={dom_id:null,domNode:null,spec:{},url:\"\",urls:null,layout:\"BaseLayout\",docExpansion:\"list\",maxDisplayedTags:null,filter:null,validatorUrl:\"https://validator.swagger.io/validator\",oauth2RedirectUrl:u()(t=\"\".concat(window.location.protocol,\"//\")).call(t,window.location.host,\"/oauth2-redirect.html\"),persistAuthorization:!1,configs:{},custom:{},displayOperationId:!1,displayRequestDuration:!1,deepLinking:!1,tryItOutEnabled:!1,requestInterceptor:function(e){return e},responseInterceptor:function(e){return e},showMutatedRequest:!0,defaultModelRendering:\"example\",defaultModelExpandDepth:1,defaultModelsExpandDepth:1,showExtensions:!1,showCommonExtensions:!1,withCredentials:void 0,requestSnippetsEnabled:!1,requestSnippets:{generators:{curl_bash:{title:\"cURL (bash)\",syntax:\"bash\"},curl_powershell:{title:\"cURL (PowerShell)\",syntax:\"powershell\"},curl_cmd:{title:\"cURL (CMD)\",syntax:\"bash\"}},defaultExpanded:!0,languagesMask:null},supportedSubmitMethods:[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\",\"trace\"],presets:[Tr],plugins:[],pluginsOptions:{pluginLoadType:\"legacy\"},initialState:{},fn:{},components:{},syntaxHighlight:{activated:!0,theme:\"agate\"}},r=Object($.C)(),o=e.domNode;delete e.domNode;var a=v()({},n,e,r),s={system:{configs:a.configs},plugins:a.presets,pluginsOptions:a.pluginsOptions,state:v()({layout:{layout:a.layout,filter:l()(a)},spec:{spec:\"\",url:a.url},requestSnippets:a.requestSnippets},a.initialState)};if(a.initialState)for(var c in a.initialState)Object.prototype.hasOwnProperty.call(a.initialState,c)&&void 0===a.initialState[c]&&delete s.state[c];var p=new K(s);p.register([a.plugins,function(){return{fn:a.fn,components:a.components,state:a.state}}]);var h=p.getSystem(),m=function(e){var t=h.specSelectors.getLocalConfig?h.specSelectors.getLocalConfig():{},n=v()({},t,a,e||{},r);if(o&&(n.domNode=o),p.setConfigs(n),h.configsActions.loaded(),null!==e&&(!r.url&&\"object\"===i()(n.spec)&&f()(n.spec).length?(h.specActions.updateUrl(\"\"),h.specActions.updateLoadingStatus(\"success\"),h.specActions.updateSpec(d()(n.spec))):h.specActions.download&&n.url&&!n.urls&&(h.specActions.updateUrl(n.url),h.specActions.download(n.url))),n.domNode)h.render(n.domNode,\"App\");else if(n.dom_id){var s=document.querySelector(n.dom_id);h.render(s,\"App\")}else null===n.dom_id||null===n.domNode||console.error(\"Skipped rendering: no `dom_id` or `domNode` was specified\");return h},g=r.config||a.configUrl;return g&&h.specActions&&h.specActions.getConfigByUrl?(h.specActions.getConfigByUrl({url:g,loadRemoteConfig:!0,requestInterceptor:a.requestInterceptor,responseInterceptor:a.responseInterceptor},m),h):m()}Lr.presets={apis:Tr},Lr.plugins=Ir.default;t.default=Lr}]).default}));\n//# sourceMappingURL=swagger-ui-bundle.js.map"
  },
  {
    "path": "assembly/assembly-swagger-war/src/main/webapp/swagger-ui-es-bundle-core.js",
    "content": "/*! For license information please see swagger-ui-es-bundle-core.js.LICENSE.txt */\nmodule.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"/dist\",n(n.s=414)}([function(e,t){e.exports=require(\"react\")},function(e,t){e.exports=require(\"immutable\")},function(e,t,n){e.exports=n(448)},function(e,t,n){var r=n(198);e.exports=function(e,t,n){return t in e?r(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(477)},function(e,t,n){\"use strict\";(function(e){n.d(t,\"z\",(function(){return be})),n.d(t,\"i\",(function(){return Ee})),n.d(t,\"v\",(function(){return xe})),n.d(t,\"r\",(function(){return Se})),n.d(t,\"t\",(function(){return we})),n.d(t,\"s\",(function(){return je})),n.d(t,\"p\",(function(){return Oe})),n.d(t,\"u\",(function(){return Ce})),n.d(t,\"x\",(function(){return _e})),n.d(t,\"y\",(function(){return Ae})),n.d(t,\"J\",(function(){return ke})),n.d(t,\"f\",(function(){return Ie})),n.d(t,\"n\",(function(){return Pe})),n.d(t,\"h\",(function(){return Te})),n.d(t,\"D\",(function(){return Re})),n.d(t,\"K\",(function(){return Me})),n.d(t,\"o\",(function(){return Ve})),n.d(t,\"C\",(function(){return ze})),n.d(t,\"a\",(function(){return Fe})),n.d(t,\"H\",(function(){return Je})),n.d(t,\"b\",(function(){return We})),n.d(t,\"G\",(function(){return He})),n.d(t,\"F\",(function(){return $e})),n.d(t,\"E\",(function(){return Ye})),n.d(t,\"k\",(function(){return Ke})),n.d(t,\"d\",(function(){return Ge})),n.d(t,\"g\",(function(){return Ze})),n.d(t,\"m\",(function(){return Xe})),n.d(t,\"l\",(function(){return Qe})),n.d(t,\"e\",(function(){return et})),n.d(t,\"I\",(function(){return tt})),n.d(t,\"w\",(function(){return nt})),n.d(t,\"A\",(function(){return rt})),n.d(t,\"B\",(function(){return at})),n.d(t,\"j\",(function(){return ot})),n.d(t,\"c\",(function(){return it})),n.d(t,\"q\",(function(){return ct}));var r=n(14),a=n.n(r),o=(n(13),n(18)),i=n.n(o),s=n(44),c=n.n(s),u=n(22),l=n.n(u),p=n(4),f=n.n(p),d=n(69),h=n.n(d),m=n(2),v=n.n(m),g=n(23),y=n.n(g),b=n(12),E=n.n(b),x=n(15),S=n.n(x),w=(n(33),n(28)),j=n.n(w),O=n(20),C=n.n(O),_=n(164),A=n.n(_),k=n(19),I=n.n(k),P=n(64),T=n.n(P),R=(n(29),n(30)),N=n.n(R),M=n(17),q=n.n(M),D=n(55),B=n.n(D),L=n(136),U=n.n(L),V=n(84),z=n.n(V),F=n(1),J=n.n(F),W=n(383),H=n(384),$=n.n(H),Y=n(216),K=n.n(Y),G=n(217),Z=n.n(G),X=n(165),Q=n.n(X),ee=n(277),te=n.n(ee),ne=n(100),re=n.n(ne),ae=n(101),oe=n.n(ae),ie=n(115),se=n(25),ce=n(386),ue=n.n(ce),le=n(118),pe=n(387),fe=n.n(pe),de=n(388),he=n.n(de),me=n(63),ve=n.n(me),ge=\"default\",ye=function(e){return J.a.Iterable.isIterable(e)};function be(e){return we(e)?ye(e)?e.toJS():e:{}}function Ee(e){var t,n;if(ye(e))return e;if(e instanceof se.a.File)return e;if(!we(e))return e;if(l()(e))return f()(n=J.a.Seq(e)).call(n,Ee).toList();if(oe()(h()(e))){var r,a=function(e){if(!oe()(h()(e)))return e;var t,n={},r=\"_**[]\",a={},o=c()(h()(e).call(e));try{for(o.s();!(t=o.n()).done;){var i=t.value;if(n[i[0]]||a[i[0]]&&a[i[0]].containsMultiple){var s,u,l,p;if(!a[i[0]])a[i[0]]={containsMultiple:!0,length:1},n[v()(l=v()(p=\"\".concat(i[0])).call(p,r)).call(l,a[i[0]].length)]=n[i[0]],delete n[i[0]];a[i[0]].length+=1,n[v()(s=v()(u=\"\".concat(i[0])).call(u,r)).call(s,a[i[0]].length)]=i[1]}else n[i[0]]=i[1]}}catch(e){o.e(e)}finally{o.f()}return n}(e);return f()(r=J.a.OrderedMap(a)).call(r,Ee)}return f()(t=J.a.OrderedMap(e)).call(t,Ee)}function xe(e){return l()(e)?e:[e]}function Se(e){return\"function\"==typeof e}function we(e){return!!e&&\"object\"===i()(e)}function je(e){return\"function\"==typeof e}function Oe(e){return l()(e)}var Ce=Z.a;function _e(e,t){var n;return j()(n=S()(e)).call(n,(function(n,r){return n[r]=t(e[r],r),n}),{})}function Ae(e,t){var n;return j()(n=S()(e)).call(n,(function(n,r){var a=t(e[r],r);return a&&\"object\"===i()(a)&&C()(n,a),n}),{})}function ke(e){return function(t){t.dispatch,t.getState;return function(t){return function(n){return\"function\"==typeof n?n(e()):t(n)}}}}function Ie(e){var t,n=e.keySeq();return n.contains(ge)?ge:A()(t=E()(n).call(n,(function(e){return\"2\"===(e+\"\")[0]}))).call(t).first()}function Pe(e,t){if(!J.a.Iterable.isIterable(e))return J.a.List();var n=e.getIn(l()(t)?t:[t]);return J.a.List.isList(n)?n:J.a.List()}function Te(e){var t,n=[/filename\\*=[^']+'\\w*'\"([^\"]+)\";?/i,/filename\\*=[^']+'\\w*'([^;]+);?/i,/filename=\"([^;]*);?\"/i,/filename=([^;]*);?/i];if(T()(n).call(n,(function(n){return null!==(t=n.exec(e))})),null!==t&&t.length>1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function Re(e){return t=e.replace(/\\.[^./]*$/,\"\"),K()($()(t));var t}function Ne(e,t,n,r,o){if(!t)return[];var s=[],c=t.get(\"nullable\"),u=t.get(\"required\"),p=t.get(\"maximum\"),d=t.get(\"minimum\"),h=t.get(\"type\"),m=t.get(\"format\"),g=t.get(\"maxLength\"),b=t.get(\"minLength\"),x=t.get(\"uniqueItems\"),S=t.get(\"maxItems\"),w=t.get(\"minItems\"),j=t.get(\"pattern\"),O=n||!0===u,C=null!=e;if(c&&null===e||!h||!(O||C&&\"array\"===h||!(!O&&!C)))return[];var _=\"string\"===h&&e,A=\"array\"===h&&l()(e)&&e.length,k=\"array\"===h&&J.a.List.isList(e)&&e.count(),I=[_,A,k,\"array\"===h&&\"string\"==typeof e&&e,\"file\"===h&&e instanceof se.a.File,\"boolean\"===h&&(e||!1===e),\"number\"===h&&(e||0===e),\"integer\"===h&&(e||0===e),\"object\"===h&&\"object\"===i()(e)&&null!==e,\"object\"===h&&\"string\"==typeof e&&e],P=T()(I).call(I,(function(e){return!!e}));if(O&&!P&&!r)return s.push(\"Required field is not provided\"),s;if(\"object\"===h&&(null===o||\"application/json\"===o)){var R,N=e;if(\"string\"==typeof e)try{N=JSON.parse(e)}catch(e){return s.push(\"Parameter string value must be valid JSON\"),s}if(t&&t.has(\"required\")&&je(u.isList)&&u.isList()&&y()(u).call(u,(function(e){void 0===N[e]&&s.push({propKey:e,error:\"Required property not found\"})})),t&&t.has(\"properties\"))y()(R=t.get(\"properties\")).call(R,(function(e,t){var n=Ne(N[t],e,!1,r,o);s.push.apply(s,a()(f()(n).call(n,(function(e){return{propKey:t,error:e}}))))}))}if(j){var M=function(e,t){if(!new RegExp(t).test(e))return\"Value must follow pattern \"+t}(e,j);M&&s.push(M)}if(w&&\"array\"===h){var q=function(e,t){var n;if(!e&&t>=1||e&&e.length<t)return v()(n=\"Array must contain at least \".concat(t,\" item\")).call(n,1===t?\"\":\"s\")}(e,w);q&&s.push(q)}if(S&&\"array\"===h){var D=function(e,t){var n;if(e&&e.length>t)return v()(n=\"Array must not contain more then \".concat(t,\" item\")).call(n,1===t?\"\":\"s\")}(e,S);D&&s.push({needRemove:!0,error:D})}if(x&&\"array\"===h){var B=function(e,t){if(e&&(\"true\"===t||!0===t)){var n=Object(F.fromJS)(e),r=n.toSet();if(e.length>r.size){var a=Object(F.Set)();if(y()(n).call(n,(function(e,t){E()(n).call(n,(function(t){return je(t.equals)?t.equals(e):t===e})).size>1&&(a=a.add(t))})),0!==a.size)return f()(a).call(a,(function(e){return{index:e,error:\"No duplicates allowed.\"}})).toArray()}}}(e,x);B&&s.push.apply(s,a()(B))}if(g||0===g){var L=function(e,t){var n;if(e.length>t)return v()(n=\"Value must be no longer than \".concat(t,\" character\")).call(n,1!==t?\"s\":\"\")}(e,g);L&&s.push(L)}if(b){var U=function(e,t){var n;if(e.length<t)return v()(n=\"Value must be at least \".concat(t,\" character\")).call(n,1!==t?\"s\":\"\")}(e,b);U&&s.push(U)}if(p||0===p){var V=function(e,t){if(e>t)return\"Value must be less than \".concat(t)}(e,p);V&&s.push(V)}if(d||0===d){var z=function(e,t){if(e<t)return\"Value must be greater than \".concat(t)}(e,d);z&&s.push(z)}if(\"string\"===h){var W;if(!(W=\"date-time\"===m?function(e){if(isNaN(Date.parse(e)))return\"Value must be a DateTime\"}(e):\"uuid\"===m?function(e){if(e=e.toString().toLowerCase(),!/^[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[)}]?$/.test(e))return\"Value must be a Guid\"}(e):function(e){if(e&&\"string\"!=typeof e)return\"Value must be a string\"}(e)))return s;s.push(W)}else if(\"boolean\"===h){var H=function(e){if(\"true\"!==e&&\"false\"!==e&&!0!==e&&!1!==e)return\"Value must be a boolean\"}(e);if(!H)return s;s.push(H)}else if(\"number\"===h){var $=function(e){if(!/^-?\\d+(\\.?\\d+)?$/.test(e))return\"Value must be a number\"}(e);if(!$)return s;s.push($)}else if(\"integer\"===h){var Y=function(e){if(!/^-?\\d+$/.test(e))return\"Value must be an integer\"}(e);if(!Y)return s;s.push(Y)}else if(\"array\"===h){if(!A&&!k)return s;e&&y()(e).call(e,(function(e,n){var i=Ne(e,t.get(\"items\"),!1,r,o);s.push.apply(s,a()(f()(i).call(i,(function(e){return{index:n,error:e}}))))}))}else if(\"file\"===h){var K=function(e){if(e&&!(e instanceof se.a.File))return\"Value must be a file\"}(e);if(!K)return s;s.push(K)}return s}var Me=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,a=void 0!==r&&r,o=n.bypassRequiredCheck,i=void 0!==o&&o,s=e.get(\"required\"),c=Object(le.a)(e,{isOAS3:a}),u=c.schema,l=c.parameterContentMediaType;return Ne(t,u,s,i,l)},qe=function(e,t,n){if(e&&(!e.xml||!e.xml.name)){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n\\x3c!-- XML example cannot be generated; root element name is undefined --\\x3e':null;var r=e.$$ref.match(/\\S*\\/(\\S+)$/);e.xml.name=r[1]}return Object(ie.memoizedCreateXMLExample)(e,t,n)},De=[{when:/json/,shouldStringifyTypes:[\"string\"]}],Be=[\"object\"],Le=function(e,t,n,r){var o=Object(ie.memoizedSampleFromSchema)(e,t,r),s=i()(o),c=j()(De).call(De,(function(e,t){var r;return t.when.test(n)?v()(r=[]).call(r,a()(e),a()(t.shouldStringifyTypes)):e}),Be);return te()(c,(function(e){return e===s}))?N()(o,null,2):o},Ue=function(e,t,n,r){var a,o=Le(e,t,n,r);try{\"\\n\"===(a=ve.a.dump(ve.a.load(o),{lineWidth:-1}))[a.length-1]&&(a=I()(a).call(a,0,a.length-1))}catch(e){return console.error(e),\"error: could not generate yaml example\"}return a.replace(/\\t/g,\"  \")},Ve=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return e&&je(e.toJS)&&(e=e.toJS()),r&&je(r.toJS)&&(r=r.toJS()),/xml/.test(t)?qe(e,n,r):/(yaml|yml)/.test(t)?Ue(e,n,t,r):Le(e,n,t,r)},ze=function(){var e={},t=se.a.location.search;if(!t)return{};if(\"\"!=t){var n=t.substr(1).split(\"&\");for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(r=n[r].split(\"=\"),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||\"\")}return e},Fe=function(t){return(t instanceof e?t:e.from(t.toString(),\"utf-8\")).toString(\"base64\")},Je={operationsSorter:{alpha:function(e,t){return e.get(\"path\").localeCompare(t.get(\"path\"))},method:function(e,t){return e.get(\"method\").localeCompare(t.get(\"method\"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},We=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&\"\"!==r&&t.push([n,\"=\",encodeURIComponent(r).replace(/%20/g,\"+\")].join(\"\"))}return t.join(\"&\")},He=function(e,t,n){return!!Q()(n,(function(n){return re()(e[n],t[n])}))};function $e(e){return\"string\"!=typeof e||\"\"===e?\"\":Object(W.sanitizeUrl)(e)}function Ye(e){return!(!e||q()(e).call(e,\"localhost\")>=0||q()(e).call(e,\"127.0.0.1\")>=0||\"none\"===e)}function Ke(e){if(!J.a.OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=B()(e).call(e,(function(e,t){return U()(t).call(t,\"2\")&&S()(e.get(\"content\")||{}).length>0})),n=e.get(\"default\")||J.a.OrderedMap(),r=(n.get(\"content\")||J.a.OrderedMap()).keySeq().toJS().length?n:null;return t||r}var Ge=function(e){return\"string\"==typeof e||e instanceof String?z()(e).call(e).replace(/\\s/g,\"%20\"):\"\"},Ze=function(e){return ue()(Ge(e).replace(/%20/g,\"_\"))},Xe=function(e){return E()(e).call(e,(function(e,t){return/^x-/.test(t)}))},Qe=function(e){return E()(e).call(e,(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)}))};function et(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if(\"object\"!==i()(e)||l()(e)||null===e||!t)return e;var a=C()({},e);return y()(n=S()(a)).call(n,(function(e){e===t&&r(a[e],e)?delete a[e]:a[e]=et(a[e],t,r)})),a}function tt(e){if(\"string\"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),\"object\"===i()(e)&&null!==e)try{return N()(e,null,2)}catch(t){return String(e)}return null==e?\"\":e.toString()}function nt(e){return\"number\"==typeof e?e.toString():e}function rt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,a=t.allowHashes,o=void 0===a||a;if(!J.a.Map.isMap(e))throw new Error(\"paramToIdentifier: received a non-Im.Map parameter as input\");var i,s,c,u=e.get(\"name\"),l=e.get(\"in\"),p=[];e&&e.hashCode&&l&&u&&o&&p.push(v()(i=v()(s=\"\".concat(l,\".\")).call(s,u,\".hash-\")).call(i,e.hashCode()));l&&u&&p.push(v()(c=\"\".concat(l,\".\")).call(c,u));return p.push(u),r?p:p[0]||\"\"}function at(e,t){var n,r=rt(e,{returnAll:!0});return E()(n=f()(r).call(r,(function(e){return t[e]}))).call(n,(function(e){return void 0!==e}))[0]}function ot(){return st(fe()(32).toString(\"base64\"))}function it(e){return st(he()(\"sha256\").update(e).digest(\"base64\"))}function st(e){return e.replace(/\\+/g,\"-\").replace(/\\//g,\"_\").replace(/=/g,\"\")}var ct=function(e){return!e||!(!ye(e)||!e.isEmpty())}}).call(this,n(481).Buffer)},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(198);function a(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,\"value\"in a&&(a.writable=!0),r(e,a.key,a)}}e.exports=function(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(675),a=n(679);e.exports=function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=r(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&a(e,t)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(369),a=n(686),o=n(691),i=n(692);e.exports=function(e){var t=o();return function(){var n,o=a(e);if(t){var s=a(this).constructor;n=r(o,arguments,s)}else n=o.apply(this,arguments);return i(this,n)}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=require(\"prop-types\")},function(e,t,n){e.exports=n(451)},function(e,t,n){var r=n(320),a=n(494),o=n(150),i=n(321);e.exports=function(e,t){return r(e)||a(e,t)||o(e,t)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(485),a=n(313),o=n(150),i=n(493);e.exports=function(e){return r(e)||a(e)||o(e)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(454)},function(e,t){e.exports=require(\"reselect\")},function(e,t,n){e.exports=n(521)},function(e,t,n){var r=n(140),a=n(443);function o(t){return\"function\"==typeof r&&\"symbol\"==typeof a?(e.exports=o=function(e){return typeof e},e.exports.default=e.exports,e.exports.__esModule=!0):(e.exports=o=function(e){return e&&\"function\"==typeof r&&e.constructor===r&&e!==r.prototype?\"symbol\":typeof e},e.exports.default=e.exports,e.exports.__esModule=!0),o(t)}e.exports=o,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(467)},function(e,t,n){e.exports=n(465)},function(e,t,n){\"use strict\";var r=n(36),a=n(104).f,o=n(292),i=n(31),s=n(90),c=n(58),u=n(49),l=function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t};e.exports=function(e,t){var n,p,f,d,h,m,v,g,y=e.target,b=e.global,E=e.stat,x=e.proto,S=b?r:E?r[y]:(r[y]||{}).prototype,w=b?i:i[y]||(i[y]={}),j=w.prototype;for(f in t)n=!o(b?f:y+(E?\".\":\"#\")+f,e.forced)&&S&&u(S,f),h=w[f],n&&(m=e.noTargetGet?(g=a(S,f))&&g.value:S[f]),d=n&&m?m:t[f],n&&typeof h==typeof d||(v=e.bind&&n?s(d,r):e.wrap&&n?l(d):x&&\"function\"==typeof d?s(Function.call,d):d,(e.sham||d&&d.sham||h&&h.sham)&&c(v,\"sham\",!0),w[f]=v,x&&(u(i,p=y+\"Prototype\")||c(i,p,{}),i[p][f]=d,e.real&&j&&!j[f]&&c(j,f,d)))}},function(e,t,n){e.exports=n(470)},function(e,t,n){e.exports=n(322)},function(e,t,n){var r=n(351),a=n(352),o=n(632),i=n(634),s=n(638),c=n(640),u=n(645),l=n(198),p=n(3);function f(e,t){var n=r(e);if(a){var s=a(e);t&&(s=o(s).call(s,(function(t){return i(e,t).enumerable}))),n.push.apply(n,s)}return n}e.exports=function(e){for(var t=1;t<arguments.length;t++){var n,r=null!=arguments[t]?arguments[t]:{};if(t%2)s(n=f(Object(r),!0)).call(n,(function(t){p(e,t,r[t])}));else if(c)u(e,c(r));else{var a;s(a=f(Object(r))).call(a,(function(t){l(e,t,i(r,t))}))}}return e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";t.a=function(){var e={location:{},history:{},open:function(){},close:function(){},File:function(){}};if(\"undefined\"==typeof window)return e;try{e=window;for(var t=0,n=[\"File\",\"Blob\",\"FormData\"];t<n.length;t++){var r=n[t];r in window&&(e[r]=window[r])}}catch(e){console.error(e)}return e}()},function(e,t){e.exports=require(\"react-immutable-proptypes\")},function(e,t,n){var r=n(673);function a(){return e.exports=a=r||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},e.exports.default=e.exports,e.exports.__esModule=!0,a.apply(this,arguments)}e.exports=a,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(472)},function(e,t,n){e.exports=n(514)},function(e,t,n){e.exports=n(456)},function(e,t){e.exports={}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"isOAS3\",(function(){return u})),n.d(t,\"isSwagger2\",(function(){return l})),n.d(t,\"OAS3ComponentWrapFactory\",(function(){return p}));var r=n(27),a=n.n(r),o=n(136),i=n.n(o),s=n(0),c=n.n(s);function u(e){var t=e.get(\"openapi\");return\"string\"==typeof t&&(i()(t).call(t,\"3.0.\")&&t.length>4)}function l(e){var t=e.get(\"swagger\");return\"string\"==typeof t&&i()(t).call(t,\"2.0\")}function p(e){return function(t,n){return function(r){return n&&n.specSelectors&&n.specSelectors.specJson?u(n.specSelectors.specJson())?c.a.createElement(e,a()({},r,n,{Ori:t})):c.a.createElement(t,r):(console.warn(\"OAS3 wrapper: couldn't get spec\"),null)}}}},function(e,t,n){e.exports=n(461)},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){e.exports=n(663)},function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n(\"object\"==typeof globalThis&&globalThis)||n(\"object\"==typeof window&&window)||n(\"object\"==typeof self&&self)||n(\"object\"==typeof t&&t)||function(){return this}()||Function(\"return this\")()}).call(this,n(182))},function(e,t,n){var r=n(36),a=n(185),o=n(49),i=n(144),s=n(187),c=n(293),u=a(\"wks\"),l=r.Symbol,p=c?l:l&&l.withoutSetter||i;e.exports=function(e){return o(u,e)&&(s||\"string\"==typeof u[e])||(s&&o(l,e)?u[e]=l[e]:u[e]=p(\"Symbol.\"+e)),u[e]}},function(e,t,n){var r=n(31);e.exports=function(e){return r[e+\"Prototype\"]}},function(e,t,n){var r=n(160);e.exports=function(e,t,n){var a=null==e?void 0:r(e,t);return void 0===a?n:a}},function(e,t,n){var r=n(31),a=n(49),o=n(194),i=n(59).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});a(t,e)||i(t,e,{value:o.f(e)})}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_SPEC\",(function(){return te})),n.d(t,\"UPDATE_URL\",(function(){return ne})),n.d(t,\"UPDATE_JSON\",(function(){return re})),n.d(t,\"UPDATE_PARAM\",(function(){return ae})),n.d(t,\"UPDATE_EMPTY_PARAM_INCLUSION\",(function(){return oe})),n.d(t,\"VALIDATE_PARAMS\",(function(){return ie})),n.d(t,\"SET_RESPONSE\",(function(){return se})),n.d(t,\"SET_REQUEST\",(function(){return ce})),n.d(t,\"SET_MUTATED_REQUEST\",(function(){return ue})),n.d(t,\"LOG_REQUEST\",(function(){return le})),n.d(t,\"CLEAR_RESPONSE\",(function(){return pe})),n.d(t,\"CLEAR_REQUEST\",(function(){return fe})),n.d(t,\"CLEAR_VALIDATE_PARAMS\",(function(){return de})),n.d(t,\"UPDATE_OPERATION_META_VALUE\",(function(){return he})),n.d(t,\"UPDATE_RESOLVED\",(function(){return me})),n.d(t,\"UPDATE_RESOLVED_SUBTREE\",(function(){return ve})),n.d(t,\"SET_SCHEME\",(function(){return ge})),n.d(t,\"updateSpec\",(function(){return ye})),n.d(t,\"updateResolved\",(function(){return be})),n.d(t,\"updateUrl\",(function(){return Ee})),n.d(t,\"updateJsonSpec\",(function(){return xe})),n.d(t,\"parseToJson\",(function(){return Se})),n.d(t,\"resolveSpec\",(function(){return je})),n.d(t,\"requestResolvedSubtree\",(function(){return _e})),n.d(t,\"changeParam\",(function(){return Ae})),n.d(t,\"changeParamByIdentity\",(function(){return ke})),n.d(t,\"updateResolvedSubtree\",(function(){return Ie})),n.d(t,\"invalidateResolvedSubtreeCache\",(function(){return Pe})),n.d(t,\"validateParams\",(function(){return Te})),n.d(t,\"updateEmptyParamInclusion\",(function(){return Re})),n.d(t,\"clearValidateParams\",(function(){return Ne})),n.d(t,\"changeConsumesValue\",(function(){return Me})),n.d(t,\"changeProducesValue\",(function(){return qe})),n.d(t,\"setResponse\",(function(){return De})),n.d(t,\"setRequest\",(function(){return Be})),n.d(t,\"setMutatedRequest\",(function(){return Le})),n.d(t,\"logRequest\",(function(){return Ue})),n.d(t,\"executeRequest\",(function(){return Ve})),n.d(t,\"execute\",(function(){return ze})),n.d(t,\"clearResponse\",(function(){return Fe})),n.d(t,\"clearRequest\",(function(){return Je})),n.d(t,\"setScheme\",(function(){return We}));var r=n(24),a=n.n(r),o=n(47),i=n.n(o),s=n(65),c=n.n(s),u=n(18),l=n.n(u),p=n(35),f=n.n(p),d=n(22),h=n.n(d),m=n(4),v=n.n(m),g=n(279),y=n.n(g),b=n(28),E=n.n(b),x=n(166),S=n.n(x),w=n(56),j=n.n(w),O=n(12),C=n.n(O),_=n(167),A=n.n(_),k=n(17),I=n.n(k),P=n(23),T=n.n(P),R=n(2),N=n.n(R),M=n(15),q=n.n(M),D=n(20),B=n.n(D),L=n(280),U=n.n(L),V=n(63),z=n.n(V),F=n(1),J=n(78),W=n.n(J),H=n(114),$=n(168),Y=n.n($),K=n(390),G=n.n(K),Z=n(281),X=n.n(Z),Q=n(5),ee=[\"path\",\"method\"],te=\"spec_update_spec\",ne=\"spec_update_url\",re=\"spec_update_json\",ae=\"spec_update_param\",oe=\"spec_update_empty_param_inclusion\",ie=\"spec_validate_param\",se=\"spec_set_response\",ce=\"spec_set_request\",ue=\"spec_set_mutated_request\",le=\"spec_log_request\",pe=\"spec_clear_response\",fe=\"spec_clear_request\",de=\"spec_clear_validate_param\",he=\"spec_update_operation_meta_value\",me=\"spec_update_resolved\",ve=\"spec_update_resolved_subtree\",ge=\"set_scheme\";function ye(e){var t,n=(t=e,Y()(t)?t:\"\").replace(/\\t/g,\"  \");if(\"string\"==typeof e)return{type:te,payload:n}}function be(e){return{type:me,payload:e}}function Ee(e){return{type:ne,payload:e}}function xe(e){return{type:re,payload:e}}var Se=function(e){return function(t){var n=t.specActions,r=t.specSelectors,a=t.errActions,o=r.specStr,i=null;try{e=e||o(),a.clear({source:\"parser\"}),i=z.a.load(e)}catch(e){return console.error(e),a.newSpecErr({source:\"parser\",level:\"error\",message:e.reason,line:e.mark&&e.mark.line?e.mark.line+1:void 0})}return i&&\"object\"===l()(i)?n.updateJsonSpec(i):{}}},we=!1,je=function(e,t){return function(n){var r=n.specActions,a=n.specSelectors,o=n.errActions,i=n.fn,s=i.fetch,c=i.resolve,u=i.AST,l=void 0===u?{}:u,p=n.getConfigs;we||(console.warn(\"specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!\"),we=!0);var f=p(),d=f.modelPropertyMacro,m=f.parameterMacro,g=f.requestInterceptor,b=f.responseInterceptor;void 0===e&&(e=a.specJson()),void 0===t&&(t=a.url());var E=l.getLineNumberForPath?l.getLineNumberForPath:function(){},x=a.specStr();return c({fetch:s,spec:e,baseDoc:t,modelPropertyMacro:d,parameterMacro:m,requestInterceptor:g,responseInterceptor:b}).then((function(e){var t=e.spec,n=e.errors;if(o.clear({type:\"thrown\"}),h()(n)&&n.length>0){var a=v()(n).call(n,(function(e){return console.error(e),e.line=e.fullPath?E(x,e.fullPath):null,e.path=e.fullPath?e.fullPath.join(\".\"):null,e.level=\"error\",e.type=\"thrown\",e.source=\"resolver\",y()(e,\"message\",{enumerable:!0,value:e.message}),e}));o.newThrownErrBatch(a)}return r.updateResolved(t)}))}},Oe=[],Ce=G()(c()(f.a.mark((function e(){var t,n,r,a,o,i,s,u,l,p,d,m,g,b,x,w,O,_;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Oe.system){e.next=4;break}return console.error(\"debResolveSubtrees: don't have a system to operate on, aborting.\"),e.abrupt(\"return\");case 4:if(n=t.errActions,r=t.errSelectors,a=t.fn,o=a.resolveSubtree,i=a.fetch,s=a.AST,u=void 0===s?{}:s,l=t.specSelectors,p=t.specActions,o){e.next=8;break}return console.error(\"Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing.\"),e.abrupt(\"return\");case 8:return d=u.getLineNumberForPath?u.getLineNumberForPath:function(){},m=l.specStr(),g=t.getConfigs(),b=g.modelPropertyMacro,x=g.parameterMacro,w=g.requestInterceptor,O=g.responseInterceptor,e.prev=11,e.next=14,E()(Oe).call(Oe,function(){var e=c()(f.a.mark((function e(t,a){var s,u,p,g,E,_,k,I,P;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return s=e.sent,u=s.resultMap,p=s.specWithCurrentSubtrees,e.next=7,o(p,a,{baseDoc:l.url(),modelPropertyMacro:b,parameterMacro:x,requestInterceptor:w,responseInterceptor:O});case 7:if(g=e.sent,E=g.errors,_=g.spec,r.allErrors().size&&n.clearBy((function(e){var t;return\"thrown\"!==e.get(\"type\")||\"resolver\"!==e.get(\"source\")||!S()(t=e.get(\"fullPath\")).call(t,(function(e,t){return e===a[t]||void 0===a[t]}))})),h()(E)&&E.length>0&&(k=v()(E).call(E,(function(e){return e.line=e.fullPath?d(m,e.fullPath):null,e.path=e.fullPath?e.fullPath.join(\".\"):null,e.level=\"error\",e.type=\"thrown\",e.source=\"resolver\",y()(e,\"message\",{enumerable:!0,value:e.message}),e})),n.newThrownErrBatch(k)),!_||!l.isOAS3()||\"components\"!==a[0]||\"securitySchemes\"!==a[1]){e.next=15;break}return e.next=15,j.a.all(v()(I=C()(P=A()(_)).call(P,(function(e){return\"openIdConnect\"===e.type}))).call(I,function(){var e=c()(f.a.mark((function e(t){var n,r;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={url:t.openIdConnectUrl,requestInterceptor:w,responseInterceptor:O},e.prev=1,e.next=4,i(n);case 4:(r=e.sent)instanceof Error||r.status>=400?console.error(r.statusText+\" \"+n.url):t.openIdConnectData=JSON.parse(r.text),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(1),console.error(e.t0);case 11:case\"end\":return e.stop()}}),e,null,[[1,8]])})));return function(t){return e.apply(this,arguments)}}()));case 15:return X()(u,a,_),X()(p,a,_),e.abrupt(\"return\",{resultMap:u,specWithCurrentSubtrees:p});case 18:case\"end\":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),j.a.resolve({resultMap:(l.specResolvedSubtree([])||Object(F.Map)()).toJS(),specWithCurrentSubtrees:l.specJson().toJS()}));case 14:_=e.sent,delete Oe.system,Oe=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:p.updateResolvedSubtree([],_.resultMap);case 23:case\"end\":return e.stop()}}),e,null,[[11,19]])}))),35),_e=function(e){return function(t){var n;I()(n=v()(Oe).call(Oe,(function(e){return e.join(\"@@\")}))).call(n,e.join(\"@@\"))>-1||(Oe.push(e),Oe.system=t,Ce())}};function Ae(e,t,n,r,a){return{type:ae,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:a}}}function ke(e,t,n,r){return{type:ae,payload:{path:e,param:t,value:n,isXml:r}}}var Ie=function(e,t){return{type:ve,payload:{path:e,value:t}}},Pe=function(){return{type:ve,payload:{path:[],value:Object(F.Map)()}}},Te=function(e,t){return{type:ie,payload:{pathMethod:e,isOAS3:t}}},Re=function(e,t,n,r){return{type:oe,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};function Ne(e){return{type:de,payload:{pathMethod:e}}}function Me(e,t){return{type:he,payload:{path:e,value:t,key:\"consumes_value\"}}}function qe(e,t){return{type:he,payload:{path:e,value:t,key:\"produces_value\"}}}var De=function(e,t,n){return{payload:{path:e,method:t,res:n},type:se}},Be=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ce}},Le=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ue}},Ue=function(e){return{payload:e,type:le}},Ve=function(e){return function(t){var n,r,a=t.fn,o=t.specActions,i=t.specSelectors,s=t.getConfigs,u=t.oas3Selectors,l=e.pathName,p=e.method,d=e.operation,m=s(),g=m.requestInterceptor,y=m.responseInterceptor,b=d.toJS();d&&d.get(\"parameters\")&&T()(n=C()(r=d.get(\"parameters\")).call(r,(function(e){return e&&!0===e.get(\"allowEmptyValue\")}))).call(n,(function(t){if(i.parameterInclusionSettingFor([l,p],t.get(\"name\"),t.get(\"in\"))){e.parameters=e.parameters||{};var n=Object(Q.B)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get(\"name\")]=\"\")}}));if(e.contextUrl=W()(i.url()).toString(),b&&b.operationId?e.operationId=b.operationId:b&&l&&p&&(e.operationId=a.opId(b,l,p)),i.isOAS3()){var E,x=N()(E=\"\".concat(l,\":\")).call(E,p);e.server=u.selectedServer(x)||u.selectedServer();var S=u.serverVariables({server:e.server,namespace:x}).toJS(),w=u.serverVariables({server:e.server}).toJS();e.serverVariables=q()(S).length?S:w,e.requestContentType=u.requestContentType(l,p),e.responseContentType=u.responseContentType(l,p)||\"*/*\";var j,O=u.requestBodyValue(l,p),_=u.requestBodyInclusionSetting(l,p);if(O&&O.toJS)e.requestBody=C()(j=v()(O).call(O,(function(e){return F.Map.isMap(e)?e.get(\"value\"):e}))).call(j,(function(e,t){return(h()(e)?0!==e.length:!Object(Q.q)(e))||_.get(t)})).toJS();else e.requestBody=O}var A=B()({},e);A=a.buildRequest(A),o.setRequest(e.pathName,e.method,A);var k=function(){var t=c()(f.a.mark((function t(n){var r,a;return f.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,g.apply(undefined,[n]);case 2:return r=t.sent,a=B()({},r),o.setMutatedRequest(e.pathName,e.method,a),t.abrupt(\"return\",r);case 6:case\"end\":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();e.requestInterceptor=k,e.responseInterceptor=y;var I=U()();return a.execute(e).then((function(t){t.duration=U()()-I,o.setResponse(e.pathName,e.method,t)})).catch((function(t){\"Failed to fetch\"===t.message&&(t.name=\"\",t.message='**Failed to fetch.**  \\n**Possible Reasons:** \\n  - CORS \\n  - Network Failure \\n  - URL scheme must be \"http\" or \"https\" for CORS request.'),o.setResponse(e.pathName,e.method,{error:!0,err:Object(H.serializeError)(t)})}))}},ze=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=i()(e,ee);return function(e){var o=e.fn.fetch,i=e.specSelectors,s=e.specActions,c=i.specJsonWithResolvedSubtrees().toJS(),u=i.operationScheme(t,n),l=i.contentTypeValues([t,n]).toJS(),p=l.requestContentType,f=l.responseContentType,d=/xml/i.test(p),h=i.parameterValues([t,n],d).toJS();return s.executeRequest(a()(a()({},r),{},{fetch:o,spec:c,pathName:t,method:n,parameters:h,requestContentType:p,scheme:u,responseContentType:f}))}};function Fe(e,t){return{type:pe,payload:{path:e,method:t}}}function Je(e,t){return{type:fe,payload:{path:e,method:t}}}function We(e,t,n){return{type:ge,payload:{scheme:e,path:t,method:n}}}},function(e,t){e.exports=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e}},function(e,t,n){var r=n(34);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){var r=n(140),a=n(200),o=n(199),i=n(150);e.exports=function(e,t){var n=void 0!==r&&a(e)||e[\"@@iterator\"];if(!n){if(o(e)||(n=i(e))||t&&e&&\"number\"==typeof e.length){n&&(e=n);var s=0,c=function(){};return{s:c,n:function(){return s>=e.length?{done:!0}:{done:!1,value:e[s++]}},e:function(e){throw e},f:c}}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 u,l=!0,p=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return l=e.done,e},e:function(e){p=!0,u=e},f:function(){try{l||null==n.return||n.return()}finally{if(p)throw u}}}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){var r=n(42);e.exports=function(e){if(!r(e))throw TypeError(String(e)+\" is not an object\");return e}},function(e,t,n){var r=n(352),a=n(353),o=n(650);e.exports=function(e,t){if(null==e)return{};var n,i,s=o(e,t);if(r){var c=r(e);for(i=0;i<c.length;i++)n=c[i],a(t).call(t,n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_SELECTED_SERVER\",(function(){return r})),n.d(t,\"UPDATE_REQUEST_BODY_VALUE\",(function(){return a})),n.d(t,\"UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG\",(function(){return o})),n.d(t,\"UPDATE_REQUEST_BODY_INCLUSION\",(function(){return i})),n.d(t,\"UPDATE_ACTIVE_EXAMPLES_MEMBER\",(function(){return s})),n.d(t,\"UPDATE_REQUEST_CONTENT_TYPE\",(function(){return c})),n.d(t,\"UPDATE_RESPONSE_CONTENT_TYPE\",(function(){return u})),n.d(t,\"UPDATE_SERVER_VARIABLE_VALUE\",(function(){return l})),n.d(t,\"SET_REQUEST_BODY_VALIDATE_ERROR\",(function(){return p})),n.d(t,\"CLEAR_REQUEST_BODY_VALIDATE_ERROR\",(function(){return f})),n.d(t,\"CLEAR_REQUEST_BODY_VALUE\",(function(){return d})),n.d(t,\"setSelectedServer\",(function(){return h})),n.d(t,\"setRequestBodyValue\",(function(){return m})),n.d(t,\"setRetainRequestBodyValueFlag\",(function(){return v})),n.d(t,\"setRequestBodyInclusion\",(function(){return g})),n.d(t,\"setActiveExamplesMember\",(function(){return y})),n.d(t,\"setRequestContentType\",(function(){return b})),n.d(t,\"setResponseContentType\",(function(){return E})),n.d(t,\"setServerVariableValue\",(function(){return x})),n.d(t,\"setRequestBodyValidateError\",(function(){return S})),n.d(t,\"clearRequestBodyValidateError\",(function(){return w})),n.d(t,\"initRequestBodyValidateError\",(function(){return j})),n.d(t,\"clearRequestBodyValue\",(function(){return O}));var r=\"oas3_set_servers\",a=\"oas3_set_request_body_value\",o=\"oas3_set_request_body_retain_flag\",i=\"oas3_set_request_body_inclusion\",s=\"oas3_set_active_examples_member\",c=\"oas3_set_request_content_type\",u=\"oas3_set_response_content_type\",l=\"oas3_set_server_variable_value\",p=\"oas3_set_request_body_validate_error\",f=\"oas3_clear_request_body_validate_error\",d=\"oas3_clear_request_body_value\";function h(e,t){return{type:r,payload:{selectedServerUrl:e,namespace:t}}}function m(e){var t=e.value,n=e.pathMethod;return{type:a,payload:{value:t,pathMethod:n}}}var v=function(e){var t=e.value,n=e.pathMethod;return{type:o,payload:{value:t,pathMethod:n}}};function g(e){var t=e.value,n=e.pathMethod,r=e.name;return{type:i,payload:{value:t,pathMethod:n,name:r}}}function y(e){var t=e.name,n=e.pathMethod,r=e.contextType,a=e.contextName;return{type:s,payload:{name:t,pathMethod:n,contextType:r,contextName:a}}}function b(e){var t=e.value,n=e.pathMethod;return{type:c,payload:{value:t,pathMethod:n}}}function E(e){var t=e.value,n=e.path,r=e.method;return{type:u,payload:{value:t,path:n,method:r}}}function x(e){var t=e.server,n=e.namespace,r=e.key,a=e.val;return{type:l,payload:{server:t,namespace:n,key:r,val:a}}}var S=function(e){var t=e.path,n=e.method,r=e.validationErrors;return{type:p,payload:{path:t,method:n,validationErrors:r}}},w=function(e){var t=e.path,n=e.method;return{type:f,payload:{path:t,method:n}}},j=function(e){var t=e.pathMethod;return{type:f,payload:{path:t[0],method:t[1]}}},O=function(e){var t=e.pathMethod;return{type:d,payload:{pathMethod:t}}}},function(e,t,n){var r=n(53),a={}.hasOwnProperty;e.exports=Object.hasOwn||function(e,t){return a.call(r(e),t)}},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&(\"object\"==t||\"function\"==t)}},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return m})),n.d(t,\"e\",(function(){return v})),n.d(t,\"c\",(function(){return y})),n.d(t,\"a\",(function(){return b})),n.d(t,\"d\",(function(){return E}));var r=n(44),a=n.n(r),o=n(18),i=n.n(o),s=n(2),c=n.n(s),u=n(50),l=n.n(u),p=n(286),f=n.n(p),d=function(e){return String.prototype.toLowerCase.call(e)},h=function(e){return e.replace(/[^\\w]/gi,\"_\")};function m(e){var t=e.openapi;return!!t&&f()(t,\"3\")}function v(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=r.v2OperationIdCompatibilityMode;if(!e||\"object\"!==i()(e))return null;var o=(e.operationId||\"\").replace(/\\s/g,\"\");return o.length?h(e.operationId):g(t,n,{v2OperationIdCompatibilityMode:a})}function g(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=r.v2OperationIdCompatibilityMode;if(a){var o,i,s=c()(o=\"\".concat(t.toLowerCase(),\"_\")).call(o,e).replace(/[\\s!@#$%^&*()_+=[{\\]};:<>|./?,\\\\'\"\"-]/g,\"_\");return(s=s||c()(i=\"\".concat(e.substring(1),\"_\")).call(i,t)).replace(/((_){2,})/g,\"_\").replace(/^(_)*/g,\"\").replace(/([_])*$/g,\"\")}return c()(n=\"\".concat(d(t))).call(n,h(e))}function y(e,t){var n;return c()(n=\"\".concat(d(t),\"-\")).call(n,e)}function b(e,t){return e&&e.paths?function(e,t){return function(e,t,n){if(!e||\"object\"!==i()(e)||!e.paths||\"object\"!==i()(e.paths))return null;var r=e.paths;for(var a in r)for(var o in r[a])if(\"PARAMETERS\"!==o.toUpperCase()){var s=r[a][o];if(s&&\"object\"===i()(s)){var c={spec:e,pathName:a,method:o.toUpperCase(),operation:s},u=t(c);if(n&&u)return c}}return}(e,t,!0)||null}(e,(function(e){var n=e.pathName,r=e.method,a=e.operation;if(!a||\"object\"!==i()(a))return!1;var o=a.operationId;return[v(a,n,r),y(n,r),o].some((function(e){return e&&e===t}))})):null}function E(e){var t=e.spec,n=t.paths,r={};if(!n||t.$$normalized)return e;for(var o in n){var i=n[o];if(l()(i)){var s=i.parameters,u=function(e){var n=i[e];if(!l()(n))return\"continue\";var u=v(n,o,e);if(u){r[u]?r[u].push(n):r[u]=[n];var p=r[u];if(p.length>1)p.forEach((function(e,t){var n;e.__originalOperationId=e.__originalOperationId||e.operationId,e.operationId=c()(n=\"\".concat(u)).call(n,t+1)}));else if(void 0!==n.operationId){var f=p[0];f.__originalOperationId=f.__originalOperationId||n.operationId,f.operationId=u}}if(\"parameters\"!==e){var d=[],h={};for(var m in t)\"produces\"!==m&&\"consumes\"!==m&&\"security\"!==m||(h[m]=t[m],d.push(h));if(s&&(h.parameters=s,d.push(h)),d.length){var g,y=a()(d);try{for(y.s();!(g=y.n()).done;){var b=g.value;for(var E in b)if(n[E]){if(\"parameters\"===E){var x,S=a()(b[E]);try{var w=function(){var e=x.value;n[E].some((function(t){return t.name&&t.name===e.name||t.$ref&&t.$ref===e.$ref||t.$$ref&&t.$$ref===e.$$ref||t===e}))||n[E].push(e)};for(S.s();!(x=S.n()).done;)w()}catch(e){S.e(e)}finally{S.f()}}}else n[E]=b[E]}}catch(e){y.e(e)}finally{y.f()}}}};for(var p in i)u(p)}}return t.$$normalized=!0,e}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"NEW_THROWN_ERR\",(function(){return a})),n.d(t,\"NEW_THROWN_ERR_BATCH\",(function(){return o})),n.d(t,\"NEW_SPEC_ERR\",(function(){return i})),n.d(t,\"NEW_SPEC_ERR_BATCH\",(function(){return s})),n.d(t,\"NEW_AUTH_ERR\",(function(){return c})),n.d(t,\"CLEAR\",(function(){return u})),n.d(t,\"CLEAR_BY\",(function(){return l})),n.d(t,\"newThrownErr\",(function(){return p})),n.d(t,\"newThrownErrBatch\",(function(){return f})),n.d(t,\"newSpecErr\",(function(){return d})),n.d(t,\"newSpecErrBatch\",(function(){return h})),n.d(t,\"newAuthErr\",(function(){return m})),n.d(t,\"clear\",(function(){return v})),n.d(t,\"clearBy\",(function(){return g}));var r=n(114),a=\"err_new_thrown_err\",o=\"err_new_thrown_err_batch\",i=\"err_new_spec_err\",s=\"err_new_spec_err_batch\",c=\"err_new_auth_err\",u=\"err_clear\",l=\"err_clear_by\";function p(e){return{type:a,payload:Object(r.serializeError)(e)}}function f(e){return{type:o,payload:e}}function d(e){return{type:i,payload:e}}function h(e){return{type:s,payload:e}}function m(e){return{type:c,payload:e}}function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:u,payload:e}}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:l,payload:e}}},function(e,t,n){var r=n(89);e.exports=function(e){return Object(r(e))}},function(e,t){e.exports=require(\"classnames\")},function(e,t,n){e.exports=n(524)},function(e,t,n){e.exports=n(665)},function(e,t,n){var r=n(142),a=n(89);e.exports=function(e){return r(a(e))}},function(e,t,n){var r=n(43),a=n(59),o=n(88);e.exports=r?function(e,t,n){return a.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(43),a=n(291),o=n(46),i=n(143),s=Object.defineProperty;t.f=r?s:function(e,t,n){if(o(e),t=i(t,!0),o(n),a)try{return s(e,t,n)}catch(e){}if(\"get\"in n||\"set\"in n)throw TypeError(\"Accessors not supported\");return\"value\"in n&&(e[t]=n.value),e}},function(e,t,n){var r=n(105),a=Math.min;e.exports=function(e){return e>0?a(r(e),9007199254740991):0}},function(e,t,n){var r=n(31),a=n(36),o=function(e){return\"function\"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(a[e]):r[e]&&r[e][t]||a[e]&&a[e][t]}},function(e,t,n){var r=n(328),a=\"object\"==typeof self&&self&&self.Object===Object&&self,o=r||a||Function(\"return this\")();e.exports=o},function(e,t){e.exports=require(\"js-yaml\")},function(e,t,n){e.exports=n(510)},function(e,t,n){var r=n(651);function a(e,t,n,a,o,i,s){try{var c=e[i](s),u=c.value}catch(e){return void n(e)}c.done?t(u):r.resolve(u).then(a,o)}e.exports=function(e){return function(){var t=this,n=arguments;return new r((function(r,o){var i=e.apply(t,n);function s(e){a(i,r,o,s,c,\"next\",e)}function c(e){a(i,r,o,s,c,\"throw\",e)}s(void 0)}))}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e){if(\"function\"!=typeof e)throw TypeError(String(e)+\" is not a function\");return e}},function(e,t,n){var r,a,o,i=n(297),s=n(36),c=n(42),u=n(58),l=n(49),p=n(186),f=n(146),d=n(125),h=\"Object already initialized\",m=s.WeakMap;if(i||p.state){var v=p.state||(p.state=new m),g=v.get,y=v.has,b=v.set;r=function(e,t){if(y.call(v,e))throw new TypeError(h);return t.facade=e,b.call(v,e,t),t},a=function(e){return g.call(v,e)||{}},o=function(e){return y.call(v,e)}}else{var E=f(\"state\");d[E]=!0,r=function(e,t){if(l(e,E))throw new TypeError(h);return t.facade=e,u(e,E,t),t},a=function(e){return l(e,E)?e[E]:{}},o=function(e){return l(e,E)}}e.exports={set:r,get:a,has:o,enforce:function(e){return o(e)?a(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!c(t)||(n=a(t)).type!==e)throw TypeError(\"Incompatible receiver, \"+e+\" required\");return n}}}},function(e,t){e.exports=require(\"deep-extend\")},function(e,t,n){e.exports=n(495)},function(e,t){e.exports=require(\"url\")},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"SHOW_AUTH_POPUP\",(function(){return d})),n.d(t,\"AUTHORIZE\",(function(){return h})),n.d(t,\"LOGOUT\",(function(){return m})),n.d(t,\"PRE_AUTHORIZE_OAUTH2\",(function(){return v})),n.d(t,\"AUTHORIZE_OAUTH2\",(function(){return g})),n.d(t,\"VALIDATE\",(function(){return y})),n.d(t,\"CONFIGURE_AUTH\",(function(){return b})),n.d(t,\"RESTORE_AUTHORIZATION\",(function(){return E})),n.d(t,\"showDefinitions\",(function(){return x})),n.d(t,\"authorize\",(function(){return S})),n.d(t,\"authorizeWithPersistOption\",(function(){return w})),n.d(t,\"logout\",(function(){return j})),n.d(t,\"logoutWithPersistOption\",(function(){return O})),n.d(t,\"preAuthorizeImplicit\",(function(){return C})),n.d(t,\"authorizeOauth2\",(function(){return _})),n.d(t,\"authorizeOauth2WithPersistOption\",(function(){return A})),n.d(t,\"authorizePassword\",(function(){return k})),n.d(t,\"authorizeApplication\",(function(){return I})),n.d(t,\"authorizeAccessCodeWithFormParams\",(function(){return P})),n.d(t,\"authorizeAccessCodeWithBasicAuthentication\",(function(){return T})),n.d(t,\"authorizeRequest\",(function(){return R})),n.d(t,\"configureAuth\",(function(){return N})),n.d(t,\"restoreAuthorization\",(function(){return M})),n.d(t,\"persistAuthorizationIfNeeded\",(function(){return q}));var r=n(18),a=n.n(r),o=n(30),i=n.n(o),s=n(20),c=n.n(s),u=n(78),l=n.n(u),p=n(25),f=n(5),d=\"show_popup\",h=\"authorize\",m=\"logout\",v=\"pre_authorize_oauth2\",g=\"authorize_oauth2\",y=\"validate\",b=\"configure_auth\",E=\"restore_authorization\";function x(e){return{type:d,payload:e}}function S(e){return{type:h,payload:e}}var w=function(e){return function(t){var n=t.authActions;n.authorize(e),n.persistAuthorizationIfNeeded()}};function j(e){return{type:m,payload:e}}var O=function(e){return function(t){var n=t.authActions;n.logout(e),n.persistAuthorizationIfNeeded()}},C=function(e){return function(t){var n=t.authActions,r=t.errActions,a=e.auth,o=e.token,s=e.isValid,c=a.schema,u=a.name,l=c.get(\"flow\");delete p.a.swaggerUIRedirectOauth2,\"accessCode\"===l||s||r.newAuthErr({authId:u,source:\"auth\",level:\"warning\",message:\"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server\"}),o.error?r.newAuthErr({authId:u,source:\"auth\",level:\"error\",message:i()(o)}):n.authorizeOauth2WithPersistOption({auth:a,token:o})}};function _(e){return{type:g,payload:e}}var A=function(e){return function(t){var n=t.authActions;n.authorizeOauth2(e),n.persistAuthorizationIfNeeded()}},k=function(e){return function(t){var n=t.authActions,r=e.schema,a=e.name,o=e.username,i=e.password,s=e.passwordType,u=e.clientId,l=e.clientSecret,p={grant_type:\"password\",scope:e.scopes.join(\" \"),username:o,password:i},d={};switch(s){case\"request-body\":!function(e,t,n){t&&c()(e,{client_id:t});n&&c()(e,{client_secret:n})}(p,u,l);break;case\"basic\":d.Authorization=\"Basic \"+Object(f.a)(u+\":\"+l);break;default:console.warn(\"Warning: invalid passwordType \".concat(s,\" was passed, not including client id and secret\"))}return n.authorizeRequest({body:Object(f.b)(p),url:r.get(\"tokenUrl\"),name:a,headers:d,query:{},auth:e})}};var I=function(e){return function(t){var n=t.authActions,r=e.schema,a=e.scopes,o=e.name,i=e.clientId,s=e.clientSecret,c={Authorization:\"Basic \"+Object(f.a)(i+\":\"+s)},u={grant_type:\"client_credentials\",scope:a.join(\" \")};return n.authorizeRequest({body:Object(f.b)(u),name:o,url:r.get(\"tokenUrl\"),auth:e,headers:c})}},P=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,a=t.schema,o=t.name,i=t.clientId,s=t.clientSecret,c=t.codeVerifier,u={grant_type:\"authorization_code\",code:t.code,client_id:i,client_secret:s,redirect_uri:n,code_verifier:c};return r.authorizeRequest({body:Object(f.b)(u),name:o,url:a.get(\"tokenUrl\"),auth:t})}},T=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,a=t.schema,o=t.name,i=t.clientId,s=t.clientSecret,c=t.codeVerifier,u={Authorization:\"Basic \"+Object(f.a)(i+\":\"+s)},l={grant_type:\"authorization_code\",code:t.code,client_id:i,redirect_uri:n,code_verifier:c};return r.authorizeRequest({body:Object(f.b)(l),name:o,url:a.get(\"tokenUrl\"),auth:t,headers:u})}},R=function(e){return function(t){var n,r=t.fn,o=t.getConfigs,s=t.authActions,u=t.errActions,p=t.oas3Selectors,f=t.specSelectors,d=t.authSelectors,h=e.body,m=e.query,v=void 0===m?{}:m,g=e.headers,y=void 0===g?{}:g,b=e.name,E=e.url,x=e.auth,S=(d.getConfigs()||{}).additionalQueryStringParams;if(f.isOAS3()){var w=p.serverEffectiveValue(p.selectedServer());n=l()(E,w,!0)}else n=l()(E,f.url(),!0);\"object\"===a()(S)&&(n.query=c()({},n.query,S));var j=n.toString(),O=c()({Accept:\"application/json, text/plain, */*\",\"Content-Type\":\"application/x-www-form-urlencoded\",\"X-Requested-With\":\"XMLHttpRequest\"},y);r.fetch({url:j,method:\"post\",headers:O,query:v,body:h,requestInterceptor:o().requestInterceptor,responseInterceptor:o().responseInterceptor}).then((function(e){var t=JSON.parse(e.data),n=t&&(t.error||\"\"),r=t&&(t.parseError||\"\");e.ok?n||r?u.newAuthErr({authId:b,level:\"error\",source:\"auth\",message:i()(t)}):s.authorizeOauth2WithPersistOption({auth:x,token:t}):u.newAuthErr({authId:b,level:\"error\",source:\"auth\",message:e.statusText})})).catch((function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r=\"string\"==typeof n?JSON.parse(n):n;r.error&&(t+=\", error: \".concat(r.error)),r.error_description&&(t+=\", description: \".concat(r.error_description))}catch(e){}}u.newAuthErr({authId:b,level:\"error\",source:\"auth\",message:t})}))}};function N(e){return{type:b,payload:e}}function M(e){return{type:E,payload:e}}var q=function(){return function(e){var t=e.authSelectors;if((0,e.getConfigs)().persistAuthorization){var n=t.authorized();localStorage.setItem(\"authorized\",i()(n.toJS()))}}}},function(e,t){e.exports=require(\"react-syntax-highlighter\")},function(e,t,n){var r=n(90),a=n(142),o=n(53),i=n(60),s=n(184),c=[].push,u=function(e){var t=1==e,n=2==e,u=3==e,l=4==e,p=6==e,f=7==e,d=5==e||p;return function(h,m,v,g){for(var y,b,E=o(h),x=a(E),S=r(m,v,3),w=i(x.length),j=0,O=g||s,C=t?O(h,w):n||f?O(h,0):void 0;w>j;j++)if((d||j in x)&&(b=S(y=x[j],j,E),e))if(t)C[j]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return j;case 2:c.call(C,y)}else switch(e){case 4:return!1;case 7:c.call(C,y)}return p?-1:u||l?l:C}};e.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterOut:u(7)}},function(e,t,n){n(126);var r=n(447),a=n(36),o=n(83),i=n(58),s=n(108),c=n(37)(\"toStringTag\");for(var u in r){var l=a[u],p=l&&l.prototype;p&&o(p)!==c&&i(p,c,u),s[u]=s.Array}},function(e,t){e.exports=function(e){return null!=e&&\"object\"==typeof e}},function(e,t,n){var r=n(327);e.exports=function(e){return null==e?\"\":r(e)}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"lastError\",(function(){return N})),n.d(t,\"url\",(function(){return M})),n.d(t,\"specStr\",(function(){return q})),n.d(t,\"specSource\",(function(){return D})),n.d(t,\"specJson\",(function(){return B})),n.d(t,\"specResolved\",(function(){return L})),n.d(t,\"specResolvedSubtree\",(function(){return U})),n.d(t,\"specJsonWithResolvedSubtrees\",(function(){return z})),n.d(t,\"spec\",(function(){return F})),n.d(t,\"isOAS3\",(function(){return J})),n.d(t,\"info\",(function(){return W})),n.d(t,\"externalDocs\",(function(){return H})),n.d(t,\"version\",(function(){return $})),n.d(t,\"semver\",(function(){return Y})),n.d(t,\"paths\",(function(){return K})),n.d(t,\"operations\",(function(){return G})),n.d(t,\"consumes\",(function(){return Z})),n.d(t,\"produces\",(function(){return X})),n.d(t,\"security\",(function(){return Q})),n.d(t,\"securityDefinitions\",(function(){return ee})),n.d(t,\"findDefinition\",(function(){return te})),n.d(t,\"definitions\",(function(){return ne})),n.d(t,\"basePath\",(function(){return re})),n.d(t,\"host\",(function(){return ae})),n.d(t,\"schemes\",(function(){return oe})),n.d(t,\"operationsWithRootInherited\",(function(){return ie})),n.d(t,\"tags\",(function(){return se})),n.d(t,\"tagDetails\",(function(){return ce})),n.d(t,\"operationsWithTags\",(function(){return ue})),n.d(t,\"taggedOperations\",(function(){return le})),n.d(t,\"responses\",(function(){return pe})),n.d(t,\"requests\",(function(){return fe})),n.d(t,\"mutatedRequests\",(function(){return de})),n.d(t,\"responseFor\",(function(){return he})),n.d(t,\"requestFor\",(function(){return me})),n.d(t,\"mutatedRequestFor\",(function(){return ve})),n.d(t,\"allowTryItOutFor\",(function(){return ge})),n.d(t,\"parameterWithMetaByIdentity\",(function(){return ye})),n.d(t,\"parameterInclusionSettingFor\",(function(){return be})),n.d(t,\"parameterWithMeta\",(function(){return Ee})),n.d(t,\"operationWithMeta\",(function(){return xe})),n.d(t,\"getParameter\",(function(){return Se})),n.d(t,\"hasHost\",(function(){return we})),n.d(t,\"parameterValues\",(function(){return je})),n.d(t,\"parametersIncludeIn\",(function(){return Oe})),n.d(t,\"parametersIncludeType\",(function(){return Ce})),n.d(t,\"contentTypeValues\",(function(){return _e})),n.d(t,\"currentProducesFor\",(function(){return Ae})),n.d(t,\"producesOptionsFor\",(function(){return ke})),n.d(t,\"consumesOptionsFor\",(function(){return Ie})),n.d(t,\"operationScheme\",(function(){return Pe})),n.d(t,\"canExecuteScheme\",(function(){return Te})),n.d(t,\"validateBeforeExecute\",(function(){return Re})),n.d(t,\"getOAS3RequiredRequestBodyContentType\",(function(){return Ne})),n.d(t,\"isMediaTypeSchemaPropertiesEqual\",(function(){return Me}));var r=n(13),a=n.n(r),o=n(14),i=n.n(o),s=n(2),c=n.n(s),u=n(19),l=n.n(u),p=n(23),f=n.n(p),d=n(17),h=n.n(d),m=n(4),v=n.n(m),g=n(12),y=n.n(g),b=n(55),E=n.n(b),x=n(28),S=n.n(x),w=n(164),j=n.n(w),O=n(64),C=n.n(O),_=n(22),A=n.n(_),k=n(16),I=n(5),P=n(1),T=[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\",\"trace\"],R=function(e){return e||Object(P.Map)()},N=Object(k.createSelector)(R,(function(e){return e.get(\"lastError\")})),M=Object(k.createSelector)(R,(function(e){return e.get(\"url\")})),q=Object(k.createSelector)(R,(function(e){return e.get(\"spec\")||\"\"})),D=Object(k.createSelector)(R,(function(e){return e.get(\"specSource\")||\"not-editor\"})),B=Object(k.createSelector)(R,(function(e){return e.get(\"json\",Object(P.Map)())})),L=Object(k.createSelector)(R,(function(e){return e.get(\"resolved\",Object(P.Map)())})),U=function(e,t){var n;return e.getIn(c()(n=[\"resolvedSubtrees\"]).call(n,i()(t)),void 0)},V=function e(t,n){return P.Map.isMap(t)&&P.Map.isMap(n)?n.get(\"$$ref\")?n:Object(P.OrderedMap)().mergeWith(e,t,n):n},z=Object(k.createSelector)(R,(function(e){return Object(P.OrderedMap)().mergeWith(V,e.get(\"json\"),e.get(\"resolvedSubtrees\"))})),F=function(e){return B(e)},J=Object(k.createSelector)(F,(function(){return!1})),W=Object(k.createSelector)(F,(function(e){return qe(e&&e.get(\"info\"))})),H=Object(k.createSelector)(F,(function(e){return qe(e&&e.get(\"externalDocs\"))})),$=Object(k.createSelector)(W,(function(e){return e&&e.get(\"version\")})),Y=Object(k.createSelector)($,(function(e){var t;return l()(t=/v?([0-9]*)\\.([0-9]*)\\.([0-9]*)/i.exec(e)).call(t,1)})),K=Object(k.createSelector)(z,(function(e){return e.get(\"paths\")})),G=Object(k.createSelector)(K,(function(e){if(!e||e.size<1)return Object(P.List)();var t=Object(P.List)();return e&&f()(e)?(f()(e).call(e,(function(e,n){if(!e||!f()(e))return{};f()(e).call(e,(function(e,r){var a;h()(T).call(T,r)<0||(t=t.push(Object(P.fromJS)({path:n,method:r,operation:e,id:c()(a=\"\".concat(r,\"-\")).call(a,n)})))}))})),t):Object(P.List)()})),Z=Object(k.createSelector)(F,(function(e){return Object(P.Set)(e.get(\"consumes\"))})),X=Object(k.createSelector)(F,(function(e){return Object(P.Set)(e.get(\"produces\"))})),Q=Object(k.createSelector)(F,(function(e){return e.get(\"security\",Object(P.List)())})),ee=Object(k.createSelector)(F,(function(e){return e.get(\"securityDefinitions\")})),te=function(e,t){var n=e.getIn([\"resolvedSubtrees\",\"definitions\",t],null),r=e.getIn([\"json\",\"definitions\",t],null);return n||r||null},ne=Object(k.createSelector)(F,(function(e){var t=e.get(\"definitions\");return P.Map.isMap(t)?t:Object(P.Map)()})),re=Object(k.createSelector)(F,(function(e){return e.get(\"basePath\")})),ae=Object(k.createSelector)(F,(function(e){return e.get(\"host\")})),oe=Object(k.createSelector)(F,(function(e){return e.get(\"schemes\",Object(P.Map)())})),ie=Object(k.createSelector)(G,Z,X,(function(e,t,n){return v()(e).call(e,(function(e){return e.update(\"operation\",(function(e){if(e){if(!P.Map.isMap(e))return;return e.withMutations((function(e){return e.get(\"consumes\")||e.update(\"consumes\",(function(e){return Object(P.Set)(e).merge(t)})),e.get(\"produces\")||e.update(\"produces\",(function(e){return Object(P.Set)(e).merge(n)})),e}))}return Object(P.Map)()}))}))})),se=Object(k.createSelector)(F,(function(e){var t=e.get(\"tags\",Object(P.List)());return P.List.isList(t)?y()(t).call(t,(function(e){return P.Map.isMap(e)})):Object(P.List)()})),ce=function(e,t){var n,r=se(e)||Object(P.List)();return E()(n=y()(r).call(r,P.Map.isMap)).call(n,(function(e){return e.get(\"name\")===t}),Object(P.Map)())},ue=Object(k.createSelector)(ie,se,(function(e,t){return S()(e).call(e,(function(e,t){var n=Object(P.Set)(t.getIn([\"operation\",\"tags\"]));return n.count()<1?e.update(\"default\",Object(P.List)(),(function(e){return e.push(t)})):S()(n).call(n,(function(e,n){return e.update(n,Object(P.List)(),(function(e){return e.push(t)}))}),e)}),S()(t).call(t,(function(e,t){return e.set(t.get(\"name\"),Object(P.List)())}),Object(P.OrderedMap)()))})),le=function(e){return function(t){var n,r=(0,t.getConfigs)(),a=r.tagsSorter,o=r.operationsSorter;return v()(n=ue(e).sortBy((function(e,t){return t}),(function(e,t){var n=\"function\"==typeof a?a:I.H.tagsSorter[a];return n?n(e,t):null}))).call(n,(function(t,n){var r=\"function\"==typeof o?o:I.H.operationsSorter[o],a=r?j()(t).call(t,r):t;return Object(P.Map)({tagDetails:ce(e,n),operations:a})}))}},pe=Object(k.createSelector)(R,(function(e){return e.get(\"responses\",Object(P.Map)())})),fe=Object(k.createSelector)(R,(function(e){return e.get(\"requests\",Object(P.Map)())})),de=Object(k.createSelector)(R,(function(e){return e.get(\"mutatedRequests\",Object(P.Map)())})),he=function(e,t,n){return pe(e).getIn([t,n],null)},me=function(e,t,n){return fe(e).getIn([t,n],null)},ve=function(e,t,n){return de(e).getIn([t,n],null)},ge=function(){return!0},ye=function(e,t,n){var r,a,o=z(e).getIn(c()(r=[\"paths\"]).call(r,i()(t),[\"parameters\"]),Object(P.OrderedMap)()),s=e.getIn(c()(a=[\"meta\",\"paths\"]).call(a,i()(t),[\"parameters\"]),Object(P.OrderedMap)()),u=v()(o).call(o,(function(e){var t,r,a,o=s.get(c()(t=\"\".concat(n.get(\"in\"),\".\")).call(t,n.get(\"name\"))),i=s.get(c()(r=c()(a=\"\".concat(n.get(\"in\"),\".\")).call(a,n.get(\"name\"),\".hash-\")).call(r,n.hashCode()));return Object(P.OrderedMap)().merge(e,o,i)}));return E()(u).call(u,(function(e){return e.get(\"in\")===n.get(\"in\")&&e.get(\"name\")===n.get(\"name\")}),Object(P.OrderedMap)())},be=function(e,t,n,r){var a,o,s=c()(a=\"\".concat(r,\".\")).call(a,n);return e.getIn(c()(o=[\"meta\",\"paths\"]).call(o,i()(t),[\"parameter_inclusions\",s]),!1)},Ee=function(e,t,n,r){var a,o=z(e).getIn(c()(a=[\"paths\"]).call(a,i()(t),[\"parameters\"]),Object(P.OrderedMap)()),s=E()(o).call(o,(function(e){return e.get(\"in\")===r&&e.get(\"name\")===n}),Object(P.OrderedMap)());return ye(e,t,s)},xe=function(e,t,n){var r,a=z(e).getIn([\"paths\",t,n],Object(P.OrderedMap)()),o=e.getIn([\"meta\",\"paths\",t,n],Object(P.OrderedMap)()),i=v()(r=a.get(\"parameters\",Object(P.List)())).call(r,(function(r){return ye(e,[t,n],r)}));return Object(P.OrderedMap)().merge(a,o).set(\"parameters\",i)};function Se(e,t,n,r){var a;t=t||[];var o=e.getIn(c()(a=[\"meta\",\"paths\"]).call(a,i()(t),[\"parameters\"]),Object(P.fromJS)([]));return E()(o).call(o,(function(e){return P.Map.isMap(e)&&e.get(\"name\")===n&&e.get(\"in\")===r}))||Object(P.Map)()}var we=Object(k.createSelector)(F,(function(e){var t=e.get(\"host\");return\"string\"==typeof t&&t.length>0&&\"/\"!==t[0]}));function je(e,t,n){var r;t=t||[];var a=xe.apply(void 0,c()(r=[e]).call(r,i()(t))).get(\"parameters\",Object(P.List)());return S()(a).call(a,(function(e,t){var r=n&&\"body\"===t.get(\"in\")?t.get(\"value_xml\"):t.get(\"value\");return e.set(Object(I.A)(t,{allowHashes:!1}),r)}),Object(P.fromJS)({}))}function Oe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(P.List.isList(e))return C()(e).call(e,(function(e){return P.Map.isMap(e)&&e.get(\"in\")===t}))}function Ce(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(P.List.isList(e))return C()(e).call(e,(function(e){return P.Map.isMap(e)&&e.get(\"type\")===t}))}function _e(e,t){var n,r;t=t||[];var a=z(e).getIn(c()(n=[\"paths\"]).call(n,i()(t)),Object(P.fromJS)({})),o=e.getIn(c()(r=[\"meta\",\"paths\"]).call(r,i()(t)),Object(P.fromJS)({})),s=Ae(e,t),u=a.get(\"parameters\")||new P.List,l=o.get(\"consumes_value\")?o.get(\"consumes_value\"):Ce(u,\"file\")?\"multipart/form-data\":Ce(u,\"formData\")?\"application/x-www-form-urlencoded\":void 0;return Object(P.fromJS)({requestContentType:l,responseContentType:s})}function Ae(e,t){var n,r;t=t||[];var a=z(e).getIn(c()(n=[\"paths\"]).call(n,i()(t)),null);if(null!==a){var o=e.getIn(c()(r=[\"meta\",\"paths\"]).call(r,i()(t),[\"produces_value\"]),null),s=a.getIn([\"produces\",0],null);return o||s||\"application/json\"}}function ke(e,t){var n;t=t||[];var r=z(e),o=r.getIn(c()(n=[\"paths\"]).call(n,i()(t)),null);if(null!==o){var s=t,u=a()(s,1)[0],l=o.get(\"produces\",null),p=r.getIn([\"paths\",u,\"produces\"],null),f=r.getIn([\"produces\"],null);return l||p||f}}function Ie(e,t){var n;t=t||[];var r=z(e),o=r.getIn(c()(n=[\"paths\"]).call(n,i()(t)),null);if(null!==o){var s=t,u=a()(s,1)[0],l=o.get(\"consumes\",null),p=r.getIn([\"paths\",u,\"consumes\"],null),f=r.getIn([\"consumes\"],null);return l||p||f}}var Pe=function(e,t,n){var r=e.get(\"url\").match(/^([a-z][a-z0-9+\\-.]*):/),a=A()(r)?r[1]:null;return e.getIn([\"scheme\",t,n])||e.getIn([\"scheme\",\"_defaultScheme\"])||a||\"\"},Te=function(e,t,n){var r;return h()(r=[\"http\",\"https\"]).call(r,Pe(e,t,n))>-1},Re=function(e,t){var n;t=t||[];var r=e.getIn(c()(n=[\"meta\",\"paths\"]).call(n,i()(t),[\"parameters\"]),Object(P.fromJS)([])),a=!0;return f()(r).call(r,(function(e){var t=e.get(\"errors\");t&&t.count()&&(a=!1)})),a},Ne=function(e,t){var n,r,a={requestBody:!1,requestContentType:{}},o=e.getIn(c()(n=[\"resolvedSubtrees\",\"paths\"]).call(n,i()(t),[\"requestBody\"]),Object(P.fromJS)([]));return o.size<1||(o.getIn([\"required\"])&&(a.requestBody=o.getIn([\"required\"])),f()(r=o.getIn([\"content\"]).entrySeq()).call(r,(function(e){var t=e[0];if(e[1].getIn([\"schema\",\"required\"])){var n=e[1].getIn([\"schema\",\"required\"]).toJS();a.requestContentType[t]=n}}))),a},Me=function(e,t,n,r){var a;if((n||r)&&n===r)return!0;var o=e.getIn(c()(a=[\"resolvedSubtrees\",\"paths\"]).call(a,i()(t),[\"requestBody\",\"content\"]),Object(P.fromJS)([]));if(o.size<2||!n||!r)return!1;var s=o.getIn([n,\"schema\",\"properties\"],Object(P.fromJS)([])),u=o.getIn([r,\"schema\",\"properties\"],Object(P.fromJS)([]));return!!s.equals(u)};function qe(e){return P.Map.isMap(e)?e:new P.Map}},function(e,t){e.exports=require(\"url-parse\")},function(e,t,n){e.exports=n(748)},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return O})),n.d(t,\"a\",(function(){return s.Light}));var r=n(15),a=n.n(r),o=n(29),i=n.n(o),s=n(72),c=n(395),u=n.n(c).a,l=n(394),p=n.n(l).a,f=n(396),d=n.n(f).a,h=n(399),m=n.n(h).a,v=n(397),g=n.n(v).a,y=n(398),b=n.n(y).a,E=n(400),x=n.n(E).a,S={hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#333\",color:\"white\"},\"hljs-name\":{fontWeight:\"bold\"},\"hljs-strong\":{fontWeight:\"bold\"},\"hljs-code\":{fontStyle:\"italic\",color:\"#888\"},\"hljs-emphasis\":{fontStyle:\"italic\"},\"hljs-tag\":{color:\"#62c8f3\"},\"hljs-variable\":{color:\"#ade5fc\"},\"hljs-template-variable\":{color:\"#ade5fc\"},\"hljs-selector-id\":{color:\"#ade5fc\"},\"hljs-selector-class\":{color:\"#ade5fc\"},\"hljs-string\":{color:\"#a2fca2\"},\"hljs-bullet\":{color:\"#d36363\"},\"hljs-type\":{color:\"#ffa\"},\"hljs-title\":{color:\"#ffa\"},\"hljs-section\":{color:\"#ffa\"},\"hljs-attribute\":{color:\"#ffa\"},\"hljs-quote\":{color:\"#ffa\"},\"hljs-built_in\":{color:\"#ffa\"},\"hljs-builtin-name\":{color:\"#ffa\"},\"hljs-number\":{color:\"#d36363\"},\"hljs-symbol\":{color:\"#d36363\"},\"hljs-keyword\":{color:\"#fcc28c\"},\"hljs-selector-tag\":{color:\"#fcc28c\"},\"hljs-literal\":{color:\"#fcc28c\"},\"hljs-comment\":{color:\"#888\"},\"hljs-deletion\":{color:\"#333\",backgroundColor:\"#fc9b9b\"},\"hljs-regexp\":{color:\"#c6b4f0\"},\"hljs-link\":{color:\"#c6b4f0\"},\"hljs-meta\":{color:\"#fc9b9b\"},\"hljs-addition\":{backgroundColor:\"#a2fca2\",color:\"#333\"}};s.Light.registerLanguage(\"json\",p),s.Light.registerLanguage(\"js\",u),s.Light.registerLanguage(\"xml\",d),s.Light.registerLanguage(\"yaml\",g),s.Light.registerLanguage(\"http\",b),s.Light.registerLanguage(\"bash\",m),s.Light.registerLanguage(\"powershell\",x),s.Light.registerLanguage(\"javascript\",u);var w={agate:S,arta:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#222\",color:\"#aaa\"},\"hljs-subst\":{color:\"#aaa\"},\"hljs-section\":{color:\"#fff\",fontWeight:\"bold\"},\"hljs-comment\":{color:\"#444\"},\"hljs-quote\":{color:\"#444\"},\"hljs-meta\":{color:\"#444\"},\"hljs-string\":{color:\"#ffcc33\"},\"hljs-symbol\":{color:\"#ffcc33\"},\"hljs-bullet\":{color:\"#ffcc33\"},\"hljs-regexp\":{color:\"#ffcc33\"},\"hljs-number\":{color:\"#00cc66\"},\"hljs-addition\":{color:\"#00cc66\"},\"hljs-built_in\":{color:\"#32aaee\"},\"hljs-builtin-name\":{color:\"#32aaee\"},\"hljs-literal\":{color:\"#32aaee\"},\"hljs-type\":{color:\"#32aaee\"},\"hljs-template-variable\":{color:\"#32aaee\"},\"hljs-attribute\":{color:\"#32aaee\"},\"hljs-link\":{color:\"#32aaee\"},\"hljs-keyword\":{color:\"#6644aa\"},\"hljs-selector-tag\":{color:\"#6644aa\"},\"hljs-name\":{color:\"#6644aa\"},\"hljs-selector-id\":{color:\"#6644aa\"},\"hljs-selector-class\":{color:\"#6644aa\"},\"hljs-title\":{color:\"#bb1166\"},\"hljs-variable\":{color:\"#bb1166\"},\"hljs-deletion\":{color:\"#bb1166\"},\"hljs-template-tag\":{color:\"#bb1166\"},\"hljs-doctag\":{fontWeight:\"bold\"},\"hljs-strong\":{fontWeight:\"bold\"},\"hljs-emphasis\":{fontStyle:\"italic\"}},monokai:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#272822\",color:\"#ddd\"},\"hljs-tag\":{color:\"#f92672\"},\"hljs-keyword\":{color:\"#f92672\",fontWeight:\"bold\"},\"hljs-selector-tag\":{color:\"#f92672\",fontWeight:\"bold\"},\"hljs-literal\":{color:\"#f92672\",fontWeight:\"bold\"},\"hljs-strong\":{color:\"#f92672\"},\"hljs-name\":{color:\"#f92672\"},\"hljs-code\":{color:\"#66d9ef\"},\"hljs-class .hljs-title\":{color:\"white\"},\"hljs-attribute\":{color:\"#bf79db\"},\"hljs-symbol\":{color:\"#bf79db\"},\"hljs-regexp\":{color:\"#bf79db\"},\"hljs-link\":{color:\"#bf79db\"},\"hljs-string\":{color:\"#a6e22e\"},\"hljs-bullet\":{color:\"#a6e22e\"},\"hljs-subst\":{color:\"#a6e22e\"},\"hljs-title\":{color:\"#a6e22e\",fontWeight:\"bold\"},\"hljs-section\":{color:\"#a6e22e\",fontWeight:\"bold\"},\"hljs-emphasis\":{color:\"#a6e22e\"},\"hljs-type\":{color:\"#a6e22e\",fontWeight:\"bold\"},\"hljs-built_in\":{color:\"#a6e22e\"},\"hljs-builtin-name\":{color:\"#a6e22e\"},\"hljs-selector-attr\":{color:\"#a6e22e\"},\"hljs-selector-pseudo\":{color:\"#a6e22e\"},\"hljs-addition\":{color:\"#a6e22e\"},\"hljs-variable\":{color:\"#a6e22e\"},\"hljs-template-tag\":{color:\"#a6e22e\"},\"hljs-template-variable\":{color:\"#a6e22e\"},\"hljs-comment\":{color:\"#75715e\"},\"hljs-quote\":{color:\"#75715e\"},\"hljs-deletion\":{color:\"#75715e\"},\"hljs-meta\":{color:\"#75715e\"},\"hljs-doctag\":{fontWeight:\"bold\"},\"hljs-selector-id\":{fontWeight:\"bold\"}},nord:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#2E3440\",color:\"#D8DEE9\"},\"hljs-subst\":{color:\"#D8DEE9\"},\"hljs-selector-tag\":{color:\"#81A1C1\"},\"hljs-selector-id\":{color:\"#8FBCBB\",fontWeight:\"bold\"},\"hljs-selector-class\":{color:\"#8FBCBB\"},\"hljs-selector-attr\":{color:\"#8FBCBB\"},\"hljs-selector-pseudo\":{color:\"#88C0D0\"},\"hljs-addition\":{backgroundColor:\"rgba(163, 190, 140, 0.5)\"},\"hljs-deletion\":{backgroundColor:\"rgba(191, 97, 106, 0.5)\"},\"hljs-built_in\":{color:\"#8FBCBB\"},\"hljs-type\":{color:\"#8FBCBB\"},\"hljs-class\":{color:\"#8FBCBB\"},\"hljs-function\":{color:\"#88C0D0\"},\"hljs-function > .hljs-title\":{color:\"#88C0D0\"},\"hljs-keyword\":{color:\"#81A1C1\"},\"hljs-literal\":{color:\"#81A1C1\"},\"hljs-symbol\":{color:\"#81A1C1\"},\"hljs-number\":{color:\"#B48EAD\"},\"hljs-regexp\":{color:\"#EBCB8B\"},\"hljs-string\":{color:\"#A3BE8C\"},\"hljs-title\":{color:\"#8FBCBB\"},\"hljs-params\":{color:\"#D8DEE9\"},\"hljs-bullet\":{color:\"#81A1C1\"},\"hljs-code\":{color:\"#8FBCBB\"},\"hljs-emphasis\":{fontStyle:\"italic\"},\"hljs-formula\":{color:\"#8FBCBB\"},\"hljs-strong\":{fontWeight:\"bold\"},\"hljs-link:hover\":{textDecoration:\"underline\"},\"hljs-quote\":{color:\"#4C566A\"},\"hljs-comment\":{color:\"#4C566A\"},\"hljs-doctag\":{color:\"#8FBCBB\"},\"hljs-meta\":{color:\"#5E81AC\"},\"hljs-meta-keyword\":{color:\"#5E81AC\"},\"hljs-meta-string\":{color:\"#A3BE8C\"},\"hljs-attr\":{color:\"#8FBCBB\"},\"hljs-attribute\":{color:\"#D8DEE9\"},\"hljs-builtin-name\":{color:\"#81A1C1\"},\"hljs-name\":{color:\"#81A1C1\"},\"hljs-section\":{color:\"#88C0D0\"},\"hljs-tag\":{color:\"#81A1C1\"},\"hljs-variable\":{color:\"#D8DEE9\"},\"hljs-template-variable\":{color:\"#D8DEE9\"},\"hljs-template-tag\":{color:\"#5E81AC\"},\"abnf .hljs-attribute\":{color:\"#88C0D0\"},\"abnf .hljs-symbol\":{color:\"#EBCB8B\"},\"apache .hljs-attribute\":{color:\"#88C0D0\"},\"apache .hljs-section\":{color:\"#81A1C1\"},\"arduino .hljs-built_in\":{color:\"#88C0D0\"},\"aspectj .hljs-meta\":{color:\"#D08770\"},\"aspectj > .hljs-title\":{color:\"#88C0D0\"},\"bnf .hljs-attribute\":{color:\"#8FBCBB\"},\"clojure .hljs-name\":{color:\"#88C0D0\"},\"clojure .hljs-symbol\":{color:\"#EBCB8B\"},\"coq .hljs-built_in\":{color:\"#88C0D0\"},\"cpp .hljs-meta-string\":{color:\"#8FBCBB\"},\"css .hljs-built_in\":{color:\"#88C0D0\"},\"css .hljs-keyword\":{color:\"#D08770\"},\"diff .hljs-meta\":{color:\"#8FBCBB\"},\"ebnf .hljs-attribute\":{color:\"#8FBCBB\"},\"glsl .hljs-built_in\":{color:\"#88C0D0\"},\"groovy .hljs-meta:not(:first-child)\":{color:\"#D08770\"},\"haxe .hljs-meta\":{color:\"#D08770\"},\"java .hljs-meta\":{color:\"#D08770\"},\"ldif .hljs-attribute\":{color:\"#8FBCBB\"},\"lisp .hljs-name\":{color:\"#88C0D0\"},\"lua .hljs-built_in\":{color:\"#88C0D0\"},\"moonscript .hljs-built_in\":{color:\"#88C0D0\"},\"nginx .hljs-attribute\":{color:\"#88C0D0\"},\"nginx .hljs-section\":{color:\"#5E81AC\"},\"pf .hljs-built_in\":{color:\"#88C0D0\"},\"processing .hljs-built_in\":{color:\"#88C0D0\"},\"scss .hljs-keyword\":{color:\"#81A1C1\"},\"stylus .hljs-keyword\":{color:\"#81A1C1\"},\"swift .hljs-meta\":{color:\"#D08770\"},\"vim .hljs-built_in\":{color:\"#88C0D0\",fontStyle:\"italic\"},\"yaml .hljs-meta\":{color:\"#D08770\"}},obsidian:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#282b2e\",color:\"#e0e2e4\"},\"hljs-keyword\":{color:\"#93c763\",fontWeight:\"bold\"},\"hljs-selector-tag\":{color:\"#93c763\",fontWeight:\"bold\"},\"hljs-literal\":{color:\"#93c763\",fontWeight:\"bold\"},\"hljs-selector-id\":{color:\"#93c763\"},\"hljs-number\":{color:\"#ffcd22\"},\"hljs-attribute\":{color:\"#668bb0\"},\"hljs-code\":{color:\"white\"},\"hljs-class .hljs-title\":{color:\"white\"},\"hljs-section\":{color:\"white\",fontWeight:\"bold\"},\"hljs-regexp\":{color:\"#d39745\"},\"hljs-link\":{color:\"#d39745\"},\"hljs-meta\":{color:\"#557182\"},\"hljs-tag\":{color:\"#8cbbad\"},\"hljs-name\":{color:\"#8cbbad\",fontWeight:\"bold\"},\"hljs-bullet\":{color:\"#8cbbad\"},\"hljs-subst\":{color:\"#8cbbad\"},\"hljs-emphasis\":{color:\"#8cbbad\"},\"hljs-type\":{color:\"#8cbbad\",fontWeight:\"bold\"},\"hljs-built_in\":{color:\"#8cbbad\"},\"hljs-selector-attr\":{color:\"#8cbbad\"},\"hljs-selector-pseudo\":{color:\"#8cbbad\"},\"hljs-addition\":{color:\"#8cbbad\"},\"hljs-variable\":{color:\"#8cbbad\"},\"hljs-template-tag\":{color:\"#8cbbad\"},\"hljs-template-variable\":{color:\"#8cbbad\"},\"hljs-string\":{color:\"#ec7600\"},\"hljs-symbol\":{color:\"#ec7600\"},\"hljs-comment\":{color:\"#818e96\"},\"hljs-quote\":{color:\"#818e96\"},\"hljs-deletion\":{color:\"#818e96\"},\"hljs-selector-class\":{color:\"#A082BD\"},\"hljs-doctag\":{fontWeight:\"bold\"},\"hljs-title\":{fontWeight:\"bold\"},\"hljs-strong\":{fontWeight:\"bold\"}},\"tomorrow-night\":{\"hljs-comment\":{color:\"#969896\"},\"hljs-quote\":{color:\"#969896\"},\"hljs-variable\":{color:\"#cc6666\"},\"hljs-template-variable\":{color:\"#cc6666\"},\"hljs-tag\":{color:\"#cc6666\"},\"hljs-name\":{color:\"#cc6666\"},\"hljs-selector-id\":{color:\"#cc6666\"},\"hljs-selector-class\":{color:\"#cc6666\"},\"hljs-regexp\":{color:\"#cc6666\"},\"hljs-deletion\":{color:\"#cc6666\"},\"hljs-number\":{color:\"#de935f\"},\"hljs-built_in\":{color:\"#de935f\"},\"hljs-builtin-name\":{color:\"#de935f\"},\"hljs-literal\":{color:\"#de935f\"},\"hljs-type\":{color:\"#de935f\"},\"hljs-params\":{color:\"#de935f\"},\"hljs-meta\":{color:\"#de935f\"},\"hljs-link\":{color:\"#de935f\"},\"hljs-attribute\":{color:\"#f0c674\"},\"hljs-string\":{color:\"#b5bd68\"},\"hljs-symbol\":{color:\"#b5bd68\"},\"hljs-bullet\":{color:\"#b5bd68\"},\"hljs-addition\":{color:\"#b5bd68\"},\"hljs-title\":{color:\"#81a2be\"},\"hljs-section\":{color:\"#81a2be\"},\"hljs-keyword\":{color:\"#b294bb\"},\"hljs-selector-tag\":{color:\"#b294bb\"},hljs:{display:\"block\",overflowX:\"auto\",background:\"#1d1f21\",color:\"#c5c8c6\",padding:\"0.5em\"},\"hljs-emphasis\":{fontStyle:\"italic\"},\"hljs-strong\":{fontWeight:\"bold\"}}},j=a()(w),O=function(e){return i()(j).call(j,e)?w[e]:(console.warn(\"Request style '\".concat(e,\"' is not available, returning default instead\")),S)}},function(e,t){e.exports=!0},function(e,t,n){var r=n(195),a=n(59).f,o=n(58),i=n(49),s=n(419),c=n(37)(\"toStringTag\");e.exports=function(e,t,n,u){if(e){var l=n?e:e.prototype;i(l,c)||a(l,c,{configurable:!0,value:t}),u&&!r&&o(l,\"toString\",s)}}},function(e,t,n){var r=n(195),a=n(120),o=n(37)(\"toStringTag\"),i=\"Arguments\"==a(function(){return arguments}());e.exports=r?a:function(e){var t,n,r;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:i?a(t):\"Object\"==(r=a(t))&&\"function\"==typeof t.callee?\"Arguments\":r}},function(e,t,n){e.exports=n(532)},function(e,t,n){\"use strict\";function r(e){return function(e){try{return!!JSON.parse(e)}catch(e){return null}}(e)?\"json\":null}n.d(t,\"a\",(function(){return r}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_LAYOUT\",(function(){return a})),n.d(t,\"UPDATE_FILTER\",(function(){return o})),n.d(t,\"UPDATE_MODE\",(function(){return i})),n.d(t,\"SHOW\",(function(){return s})),n.d(t,\"updateLayout\",(function(){return c})),n.d(t,\"updateFilter\",(function(){return u})),n.d(t,\"show\",(function(){return l})),n.d(t,\"changeMode\",(function(){return p}));var r=n(5),a=\"layout_update_layout\",o=\"layout_update_filter\",i=\"layout_update_mode\",s=\"layout_show\";function c(e){return{type:a,payload:e}}function u(e){return{type:o,payload:e}}function l(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=Object(r.v)(e),{type:s,payload:{thing:e,shown:t}}}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";return e=Object(r.v)(e),{type:i,payload:{thing:e,mode:t}}}},function(e,t,n){var r=n(342),a=n(129),o=n(157),i=n(45),s=n(98),c=n(158),u=n(128),l=n(207),p=Object.prototype.hasOwnProperty;e.exports=function(e){if(null==e)return!0;if(s(e)&&(i(e)||\"string\"==typeof e||\"function\"==typeof e.splice||c(e)||l(e)||o(e)))return!e.length;var t=a(e);if(\"[object Map]\"==t||\"[object Set]\"==t)return!e.size;if(u(e))return!r(e).length;for(var n in e)if(p.call(e,n))return!1;return!0}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){e.exports=function(e){if(null==e)throw TypeError(\"Can't call method on \"+e);return e}},function(e,t,n){var r=n(66);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,a){return e.call(t,n,r,a)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){var r=n(61);e.exports=r(\"navigator\",\"userAgent\")||\"\"},function(e,t,n){var r,a=n(46),o=n(188),i=n(191),s=n(125),c=n(296),u=n(183),l=n(146),p=l(\"IE_PROTO\"),f=function(){},d=function(e){return\"<script>\"+e+\"</\"+\"script>\"},h=function(){try{r=document.domain&&new ActiveXObject(\"htmlfile\")}catch(e){}var e,t;h=r?function(e){e.write(d(\"\")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):((t=u(\"iframe\")).style.display=\"none\",c.appendChild(t),t.src=String(\"javascript:\"),(e=t.contentWindow.document).open(),e.write(d(\"document.F=Object\")),e.close(),e.F);for(var n=i.length;n--;)delete h.prototype[i[n]];return h()};s[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(f.prototype=a(e),n=new f,f.prototype=null,n[p]=e):n=h(),void 0===t?n:o(n,t)}},function(e,t,n){var r=n(58);e.exports=function(e,t,n,a){a&&a.enumerable?e[t]=n:r(e,t,n)}},function(e,t,n){\"use strict\";var r=n(34);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},function(e,t,n){var r=n(109),a=n(539),o=n(540),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?\"[object Undefined]\":\"[object Null]\":i&&i in Object(e)?a(e):o(e)}},function(e,t,n){var r=n(557),a=n(560);e.exports=function(e,t){var n=a(e,t);return r(n)?n:void 0}},function(e,t,n){var r=n(341),a=n(342),o=n(98);e.exports=function(e){return o(e)?r(e):a(e)}},function(e,t,n){var r=n(101),a=n(208);e.exports=function(e){return null!=e&&a(e.length)&&!r(e)}},function(e,t,n){var r=n(46),a=n(318),o=n(60),i=n(90),s=n(127),c=n(317),u=function(e,t){this.stopped=e,this.result=t};e.exports=function(e,t,n){var l,p,f,d,h,m,v,g=n&&n.that,y=!(!n||!n.AS_ENTRIES),b=!(!n||!n.IS_ITERATOR),E=!(!n||!n.INTERRUPTED),x=i(t,g,1+y+E),S=function(e){return l&&c(l),new u(!0,e)},w=function(e){return y?(r(e),E?x(e[0],e[1],S):x(e[0],e[1])):E?x(e,S):x(e)};if(b)l=e;else{if(\"function\"!=typeof(p=s(e)))throw TypeError(\"Target is not iterable\");if(a(p)){for(f=0,d=o(e.length);d>f;f++)if((h=w(e[f]))&&h instanceof u)return h;return new u(!1)}l=p.call(e)}for(m=l.next;!(v=m.call(l)).done;){try{h=w(v.value)}catch(e){throw c(l),e}if(\"object\"==typeof h&&h&&h instanceof u)return h}return new u(!1)}},function(e,t){e.exports=function(e,t){return e===t||e!=e&&t!=t}},function(e,t,n){var r=n(95),a=n(50);e.exports=function(e){if(!a(e))return!1;var t=r(e);return\"[object Function]\"==t||\"[object GeneratorFunction]\"==t||\"[object AsyncFunction]\"==t||\"[object Proxy]\"==t}},function(e,t,n){e.exports=n(760)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return l}));var r=n(12),a=n.n(r),o=n(4),i=n.n(o),s=n(389),c=n.n(s),u=[n(220),n(221)];function l(e){var t,n={jsSpec:{}},r=c()(u,(function(e,t){try{var r=t.transform(e,n);return a()(r).call(r,(function(e){return!!e}))}catch(t){return console.error(\"Transformer error:\",t),e}}),e);return i()(t=a()(r).call(r,(function(e){return!!e}))).call(t,(function(e){return!e.get(\"line\")&&e.get(\"path\"),e}))}},function(e,t,n){var r=n(43),a=n(141),o=n(88),i=n(57),s=n(143),c=n(49),u=n(291),l=Object.getOwnPropertyDescriptor;t.f=r?l:function(e,t){if(e=i(e),t=s(t,!0),u)try{return l(e,t)}catch(e){}if(c(e,t))return o(!a.f.call(e,t),e[t])}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r,a,o=n(36),i=n(91),s=o.process,c=s&&s.versions,u=c&&c.v8;u?a=(r=u.split(\".\"))[0]<4?1:r[0]+r[1]:i&&(!(r=i.match(/Edge\\/(\\d+)/))||r[1]>=74)&&(r=i.match(/Chrome\\/(\\d+)/))&&(a=r[1]),e.exports=a&&+a},function(e,t,n){\"use strict\";var r=n(300).charAt,a=n(67),o=n(196),i=\"String Iterator\",s=a.set,c=a.getterFor(i);o(String,\"String\",(function(e){s(this,{type:i,string:String(e),index:0})}),(function(){var e,t=c(this),n=t.string,a=t.index;return a>=n.length?{value:void 0,done:!0}:(e=r(n,a),t.index+=e.length,{value:e,done:!1})}))},function(e,t){e.exports={}},function(e,t,n){var r=n(62).Symbol;e.exports=r},function(e,t,n){var r=n(45),a=n(211),o=n(604),i=n(76);e.exports=function(e,t){return r(e)?e:a(e,t)?[e]:o(i(e))}},function(e,t,n){var r=n(151);e.exports=function(e){if(\"string\"==typeof e||r(e))return e;var t=e+\"\";return\"0\"==t&&1/e==-Infinity?\"-0\":t}},function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError(\"Incorrect \"+(n?n+\" \":\"\")+\"invocation\");return e}},function(e,t,n){var r=n(162),a=n(366);e.exports=function(e,t,n,o){var i=!n;n||(n={});for(var s=-1,c=t.length;++s<c;){var u=t[s],l=o?o(n[u],e[u],u,n,e):void 0;void 0===l&&(l=e[u]),i?a(n,u,l):r(n,u,l)}return n}},function(e,t){e.exports=require(\"serialize-error\")},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"sampleFromSchemaGeneric\",(function(){return B})),n.d(t,\"inferSchema\",(function(){return L})),n.d(t,\"createXMLExample\",(function(){return U})),n.d(t,\"sampleFromSchema\",(function(){return V})),n.d(t,\"memoizedCreateXMLExample\",(function(){return z})),n.d(t,\"memoizedSampleFromSchema\",(function(){return F}));var r=n(18),a=n.n(r),o=n(2),i=n.n(o),s=n(17),c=n.n(s),u=n(23),l=n.n(u),p=n(22),f=n.n(p),d=n(29),h=n.n(d),m=n(64),v=n.n(m),g=n(19),y=n.n(g),b=n(55),E=n.n(b),x=n(4),S=n.n(x),w=n(5),j=n(385),O=n.n(j),C=n(278),_=n.n(C),A=n(87),k=n.n(A),I={string:function(){return\"string\"},string_email:function(){return\"user@example.com\"},\"string_date-time\":function(){return(new Date).toISOString()},string_date:function(){return(new Date).toISOString().substring(0,10)},string_uuid:function(){return\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"},string_hostname:function(){return\"example.com\"},string_ipv4:function(){return\"198.51.100.42\"},string_ipv6:function(){return\"2001:0db8:5b96:0000:0000:426f:8e17:642a\"},number:function(){return 0},number_float:function(){return 0},integer:function(){return 0},boolean:function(e){return\"boolean\"!=typeof e.default||e.default}},P=function(e){var t,n=e=Object(w.z)(e),r=n.type,a=n.format,o=I[i()(t=\"\".concat(r,\"_\")).call(t,a)]||I[r];return Object(w.s)(o)?o(e):\"Unknown Type: \"+e.type},T=function(e){return Object(w.e)(e,\"$$ref\",(function(e){return\"string\"==typeof e&&c()(e).call(e,\"#\")>-1}))},R=[\"maxProperties\",\"minProperties\"],N=[\"minItems\",\"maxItems\"],M=[\"minimum\",\"maximum\",\"exclusiveMinimum\",\"exclusiveMaximum\"],q=[\"minLength\",\"maxLength\"],D=function e(t,n){var r,a,o,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},u=function(e){void 0===n[e]&&void 0!==t[e]&&(n[e]=t[e])};(l()(r=i()(a=[\"example\",\"default\",\"enum\",\"xml\",\"type\"]).call(a,R,N,M,q)).call(r,(function(e){return u(e)})),void 0!==t.required&&f()(t.required))&&(void 0!==n.required&&n.required.length||(n.required=[]),l()(o=t.required).call(o,(function(e){var t;h()(t=n.required).call(t,e)||n.required.push(e)})));if(t.properties){n.properties||(n.properties={});var p=Object(w.z)(t.properties);for(var d in p){var m;if(Object.prototype.hasOwnProperty.call(p,d))if(!p[d]||!p[d].deprecated)if(!p[d]||!p[d].readOnly||s.includeReadOnly)if(!p[d]||!p[d].writeOnly||s.includeWriteOnly)if(!n.properties[d])n.properties[d]=p[d],!t.required&&f()(t.required)&&-1!==c()(m=t.required).call(m,d)&&(n.required?n.required.push(d):n.required=[d])}}return t.items&&(n.items||(n.items={}),n.items=e(t.items,n.items,s)),n},B=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];t&&Object(w.s)(t.toJS)&&(t=t.toJS());var s=void 0!==r||t&&void 0!==t.example||t&&void 0!==t.default,u=!s&&t&&t.oneOf&&t.oneOf.length>0,p=!s&&t&&t.anyOf&&t.anyOf.length>0;if(!s&&(u||p)){var d=Object(w.z)(u?t.oneOf[0]:t.anyOf[0]);if(D(d,t,n),!t.xml&&d.xml&&(t.xml=d.xml),void 0!==t.example&&void 0!==d.example)s=!0;else if(d.properties){t.properties||(t.properties={});var m=Object(w.z)(d.properties);for(var g in m){var b;if(Object.prototype.hasOwnProperty.call(m,g))if(!m[g]||!m[g].deprecated)if(!m[g]||!m[g].readOnly||n.includeReadOnly)if(!m[g]||!m[g].writeOnly||n.includeWriteOnly)if(!t.properties[g])t.properties[g]=m[g],!d.required&&f()(d.required)&&-1!==c()(b=d.required).call(b,g)&&(t.required?t.required.push(g):t.required=[g])}}}var x,j={},O=t||{},C=O.xml,_=O.type,A=O.example,I=O.properties,q=O.additionalProperties,B=O.items,L=n.includeReadOnly,U=n.includeWriteOnly,V=C=C||{},z=V.name,F=V.prefix,J=V.namespace,W={};if(o&&(x=(F?F+\":\":\"\")+(z=z||\"notagname\"),J)){var H=F?\"xmlns:\"+F:\"xmlns\";j[H]=J}o&&(W[x]=[]);var $=function(e){return v()(e).call(e,(function(e){return Object.prototype.hasOwnProperty.call(t,e)}))};t&&!_&&(I||q||$(R)?_=\"object\":B||$(N)?_=\"array\":$(M)?(_=\"number\",t.type=\"number\"):s||t.enum||(_=\"string\",t.type=\"string\"));var Y,K,G=function(e){var n,r,a,o,i;null!==(null===(n=t)||void 0===n?void 0:n.maxItems)&&void 0!==(null===(r=t)||void 0===r?void 0:r.maxItems)&&(e=y()(e).call(e,0,null===(i=t)||void 0===i?void 0:i.maxItems));if(null!==(null===(a=t)||void 0===a?void 0:a.minItems)&&void 0!==(null===(o=t)||void 0===o?void 0:o.minItems))for(var s=0;e.length<(null===(c=t)||void 0===c?void 0:c.minItems);){var c;e.push(e[s++%e.length])}return e},Z=Object(w.z)(I),X=0,Q=function(){return t&&null!==t.maxProperties&&void 0!==t.maxProperties&&X>=t.maxProperties},ee=function(){if(!t||!t.required)return 0;var e,n,r=0;o?l()(e=t.required).call(e,(function(e){return r+=void 0===W[e]?0:1})):l()(n=t.required).call(n,(function(e){var t;return r+=void 0===(null===(t=W[x])||void 0===t?void 0:E()(t).call(t,(function(t){return void 0!==t[e]})))?0:1}));return t.required.length-r},te=function(e){var n;return!(t&&t.required&&t.required.length)||!h()(n=t.required).call(n,e)},ne=function(e){return!t||null===t.maxProperties||void 0===t.maxProperties||!Q()&&(!te(e)||t.maxProperties-X-ee()>0)};if(Y=o?function(r){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(t&&Z[r]){if(Z[r].xml=Z[r].xml||{},Z[r].xml.attribute){var s=f()(Z[r].enum)?Z[r].enum[0]:void 0,c=Z[r].example,u=Z[r].default;return void(j[Z[r].xml.name||r]=void 0!==c?c:void 0!==u?u:void 0!==s?s:P(Z[r]))}Z[r].xml.name=Z[r].xml.name||r}else Z[r]||!1===q||(Z[r]={xml:{name:r}});var l,p=e(t&&Z[r]||void 0,n,a,o);ne(r)&&(X++,f()(p)?W[x]=i()(l=W[x]).call(l,p):W[x].push(p))}:function(t,r){ne(t)&&(W[t]=e(Z[t],n,r,o),X++)},s){var re;if(re=T(void 0!==r?r:void 0!==A?A:t.default),!o){if(\"number\"==typeof re&&\"string\"===_)return\"\".concat(re);if(\"string\"!=typeof re||\"string\"===_)return re;try{return JSON.parse(re)}catch(e){return re}}if(t||(_=f()(re)?\"array\":a()(re)),\"array\"===_){if(!f()(re)){if(\"string\"==typeof re)return re;re=[re]}var ae=t?t.items:void 0;ae&&(ae.xml=ae.xml||C||{},ae.xml.name=ae.xml.name||C.name);var oe=S()(re).call(re,(function(t){return e(ae,n,t,o)}));return oe=G(oe),C.wrapped?(W[x]=oe,k()(j)||W[x].push({_attr:j})):W=oe,W}if(\"object\"===_){if(\"string\"==typeof re)return re;for(var ie in re)Object.prototype.hasOwnProperty.call(re,ie)&&(t&&Z[ie]&&Z[ie].readOnly&&!L||t&&Z[ie]&&Z[ie].writeOnly&&!U||(t&&Z[ie]&&Z[ie].xml&&Z[ie].xml.attribute?j[Z[ie].xml.name||ie]=re[ie]:Y(ie,re[ie])));return k()(j)||W[x].push({_attr:j}),W}return W[x]=k()(j)?re:[{_attr:j},re],W}if(\"object\"===_){for(var se in Z)Object.prototype.hasOwnProperty.call(Z,se)&&(Z[se]&&Z[se].deprecated||Z[se]&&Z[se].readOnly&&!L||Z[se]&&Z[se].writeOnly&&!U||Y(se));if(o&&j&&W[x].push({_attr:j}),Q())return W;if(!0===q)o?W[x].push({additionalProp:\"Anything can be here\"}):W.additionalProp1={},X++;else if(q){var ce=Object(w.z)(q),ue=e(ce,n,void 0,o);if(o&&ce.xml&&ce.xml.name&&\"notagname\"!==ce.xml.name)W[x].push(ue);else for(var le=null!==t.minProperties&&void 0!==t.minProperties&&X<t.minProperties?t.minProperties-X:4,pe=1;pe<le;pe++){if(Q())return W;if(o){var fe={};fe[\"additionalProp\"+pe]=ue.notagname,W[x].push(fe)}else W[\"additionalProp\"+pe]=ue;X++}}return W}if(\"array\"===_){if(!B)return;var de,he,me;if(o)B.xml=B.xml||(null===(he=t)||void 0===he?void 0:he.xml)||{},B.xml.name=B.xml.name||C.name;if(f()(B.anyOf))de=S()(me=B.anyOf).call(me,(function(t){return e(D(B,t,n),n,void 0,o)}));else if(f()(B.oneOf)){var ve;de=S()(ve=B.oneOf).call(ve,(function(t){return e(D(B,t,n),n,void 0,o)}))}else{if(!(!o||o&&C.wrapped))return e(B,n,void 0,o);de=[e(B,n,void 0,o)]}return de=G(de),o&&C.wrapped?(W[x]=de,k()(j)||W[x].push({_attr:j}),W):de}if(t&&f()(t.enum))K=Object(w.v)(t.enum)[0];else{if(!t)return;if(\"number\"==typeof(K=P(t))){var ge=t.minimum;null!=ge&&(t.exclusiveMinimum&&ge++,K=ge);var ye=t.maximum;null!=ye&&(t.exclusiveMaximum&&ye--,K=ye)}if(\"string\"==typeof K&&(null!==t.maxLength&&void 0!==t.maxLength&&(K=y()(K).call(K,0,t.maxLength)),null!==t.minLength&&void 0!==t.minLength))for(var be=0;K.length<t.minLength;)K+=K[be++%K.length]}if(\"file\"!==_)return o?(W[x]=k()(j)?K:[{_attr:j},K],W):K},L=function(e){return e.schema&&(e=e.schema),e.properties&&(e.type=\"object\"),e},U=function(e,t,n){var r=B(e,t,n,!0);if(r)return\"string\"==typeof r?r:O()(r,{declaration:!0,indent:\"\\t\"})},V=function(e,t,n){return B(e,t,n,!1)},z=_()(U),F=_()(V)},function(e,t){e.exports=require(\"react-copy-to-clipboard\")},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_CONFIGS\",(function(){return o})),n.d(t,\"TOGGLE_CONFIGS\",(function(){return i})),n.d(t,\"update\",(function(){return s})),n.d(t,\"toggle\",(function(){return c})),n.d(t,\"loaded\",(function(){return u}));var r=n(3),a=n.n(r),o=\"configs_update\",i=\"configs_toggle\";function s(e,t){return{type:o,payload:a()({},e,t)}}function c(e){return{type:i,payload:e}}var u=function(){return function(e){var t=e.getConfigs,n=e.authActions;if(t().persistAuthorization){var r=localStorage.getItem(\"authorized\");r&&n.restoreAuthorization({authorized:JSON.parse(r)})}}}},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return l}));var r=n(12),a=n.n(r),o=n(29),i=n.n(o),s=n(1),c=n.n(s),u=c.a.Set.of(\"type\",\"format\",\"items\",\"default\",\"maximum\",\"exclusiveMaximum\",\"minimum\",\"exclusiveMinimum\",\"maxLength\",\"minLength\",\"pattern\",\"maxItems\",\"minItems\",\"uniqueItems\",\"enum\",\"multipleOf\");function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isOAS3;if(!c.a.Map.isMap(e))return{schema:c.a.Map(),parameterContentMediaType:null};if(!n)return\"body\"===e.get(\"in\")?{schema:e.get(\"schema\",c.a.Map()),parameterContentMediaType:null}:{schema:a()(e).call(e,(function(e,t){return i()(u).call(u,t)})),parameterContentMediaType:null};if(e.get(\"content\")){var r=e.get(\"content\",c.a.Map({})).keySeq(),o=r.first();return{schema:e.getIn([\"content\",o,\"schema\"],c.a.Map()),parameterContentMediaType:o}}return{schema:e.get(\"schema\",c.a.Map()),parameterContentMediaType:null}}},function(e,t){e.exports=require(\"fast-json-patch\")},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r=n(120);e.exports=Array.isArray||function(e){return\"Array\"==r(e)}},function(e,t,n){\"use strict\";var r=n(143),a=n(59),o=n(88);e.exports=function(e,t,n){var i=r(t);i in e?a.f(e,i,o(0,n)):e[i]=n}},function(e,t,n){var r=n(34),a=n(37),o=n(106),i=a(\"species\");e.exports=function(e){return o>=51||!r((function(){var t=[];return(t.constructor={})[i]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},function(e,t,n){var r=n(295),a=n(191);e.exports=Object.keys||function(e){return r(e,a)}},function(e,t){e.exports={}},function(e,t,n){\"use strict\";var r=n(57),a=n(197),o=n(108),i=n(67),s=n(196),c=\"Array Iterator\",u=i.set,l=i.getterFor(c);e.exports=s(Array,\"Array\",(function(e,t){u(this,{type:c,target:r(e),index:0,kind:t})}),(function(){var e=l(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):\"keys\"==n?{value:r,done:!1}:\"values\"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),\"values\"),o.Arguments=o.Array,a(\"keys\"),a(\"values\"),a(\"entries\")},function(e,t,n){var r=n(83),a=n(108),o=n(37)(\"iterator\");e.exports=function(e){if(null!=e)return e[o]||e[\"@@iterator\"]||a[r(e)]}},function(e,t){var n=Object.prototype;e.exports=function(e){var t=e&&e.constructor;return e===(\"function\"==typeof t&&t.prototype||n)}},function(e,t,n){var r=n(598),a=n(202),o=n(599),i=n(600),s=n(601),c=n(95),u=n(333),l=\"[object Map]\",p=\"[object Promise]\",f=\"[object Set]\",d=\"[object WeakMap]\",h=\"[object DataView]\",m=u(r),v=u(a),g=u(o),y=u(i),b=u(s),E=c;(r&&E(new r(new ArrayBuffer(1)))!=h||a&&E(new a)!=l||o&&E(o.resolve())!=p||i&&E(new i)!=f||s&&E(new s)!=d)&&(E=function(e){var t=c(e),n=\"[object Object]\"==t?e.constructor:void 0,r=n?u(n):\"\";if(r)switch(r){case m:return h;case v:return l;case g:return p;case y:return f;case b:return d}return t}),e.exports=E},function(e,t,n){var r=n(93);e.exports=function(e,t,n){for(var a in t)n&&n.unsafe&&e[a]?e[a]=t[a]:r(e,a,t[a],n);return e}},function(e,t,n){\"use strict\";var r=n(66),a=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError(\"Bad Promise constructor\");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new a(e)}},function(e,t,n){var r=n(95),a=n(214),o=n(75),i=Function.prototype,s=Object.prototype,c=i.toString,u=s.hasOwnProperty,l=c.call(Object);e.exports=function(e){if(!o(e)||\"[object Object]\"!=r(e))return!1;var t=a(e);if(null===t)return!0;var n=u.call(t,\"constructor\")&&t.constructor;return\"function\"==typeof n&&n instanceof n&&c.call(n)==l}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"requestSnippetGenerator_curl_powershell\",(function(){return R})),n.d(t,\"requestSnippetGenerator_curl_bash\",(function(){return N})),n.d(t,\"requestSnippetGenerator_curl_cmd\",(function(){return M}));var r=n(14),a=n.n(r),o=n(13),i=n.n(o),s=n(44),c=n.n(s),u=n(17),l=n.n(u),p=n(84),f=n.n(p),d=n(2),h=n.n(d),m=n(30),v=n.n(m),g=n(4),y=n.n(g),b=n(393),E=n.n(b),x=n(69),S=n.n(x),w=n(29),j=n.n(w),O=n(25),C=n(1),_=function(e){var t,n=\"_**[]\";return l()(e).call(e,n)<0?e:f()(t=e.split(n)[0]).call(t)},A=function(e){return\"-d \"===e||/^[_\\/-]/g.test(e)?e:\"'\"+e.replace(/'/g,\"'\\\\''\")+\"'\"},k=function(e){return\"-d \"===(e=e.replace(/\\^/g,\"^^\").replace(/\\\\\"/g,'\\\\\\\\\"').replace(/\"/g,'\"\"').replace(/\\n/g,\"^\\n\"))?e.replace(/-d /g,\"-d ^\\n\"):/^[_\\/-]/g.test(e)?e:'\"'+e+'\"'},I=function(e){return\"-d \"===e?e:/\\n/.test(e)?'@\"\\n'+e.replace(/\"/g,'\\\\\"').replace(/`/g,\"``\").replace(/\\$/,\"`$\")+'\\n\"@':/^[_\\/-]/g.test(e)?e:\"'\"+e.replace(/\"/g,'\"\"').replace(/'/g,\"''\")+\"'\"};function P(e){var t,n=[],r=c()(e.get(\"body\").entrySeq());try{for(r.s();!(t=r.n()).done;){var a,o,s,u=i()(t.value,2),l=u[0],p=u[1],f=_(l);if(p instanceof O.a.File)n.push(h()(a=h()(o='  \"'.concat(f,'\": {\\n    \"name\": \"')).call(o,p.name,'\"')).call(a,p.type?',\\n    \"type\": \"'.concat(p.type,'\"'):\"\",\"\\n  }\"));else n.push(h()(s='  \"'.concat(f,'\": ')).call(s,v()(p,null,2).replace(/(\\r\\n|\\r|\\n)/g,\"\\n  \")))}}catch(e){r.e(e)}finally{r.f()}return\"{\\n\".concat(n.join(\",\\n\"),\"\\n}\")}var T=function(e,t,n){var r,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",s=!1,u=\"\",l=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return u+=\" \"+y()(n).call(n,t).join(\" \")},p=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return u+=y()(n).call(n,t).join(\" \")},f=function(){return u+=\" \".concat(n)},d=function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;return u+=E()(e=\"  \").call(e,t)},m=e.get(\"headers\");if(u+=\"curl\"+o,e.has(\"curlOptions\")&&l.apply(void 0,a()(e.get(\"curlOptions\"))),l(\"-X\",e.get(\"method\")),f(),d(),p(\"\".concat(e.get(\"url\"))),m&&m.size){var g,b,x=c()(S()(g=e.get(\"headers\")).call(g));try{for(x.s();!(b=x.n()).done;){var w,A=b.value;f(),d();var k=i()(A,2),I=k[0],T=k[1];p(\"-H\",h()(w=\"\".concat(I,\": \")).call(w,T)),s=s||/^content-type$/i.test(I)&&/^multipart\\/form-data$/i.test(T)}}catch(e){x.e(e)}finally{x.f()}}if(e.get(\"body\"))if(s&&j()(r=[\"POST\",\"PUT\",\"PATCH\"]).call(r,e.get(\"method\"))){var R,N=c()(e.get(\"body\").entrySeq());try{for(N.s();!(R=N.n()).done;){var M,q,D,B=i()(R.value,2),L=B[0],U=B[1],V=_(L);if(f(),d(),p(\"-F\"),U instanceof O.a.File)l(h()(M=h()(q=\"\".concat(V,\"=@\")).call(q,U.name)).call(M,U.type?\";type=\".concat(U.type):\"\"));else l(h()(D=\"\".concat(V,\"=\")).call(D,U))}}catch(e){N.e(e)}finally{N.f()}}else{f(),d(),p(\"-d \");var z=e.get(\"body\");C.Map.isMap(z)?p(P(e)):(\"string\"!=typeof z&&(z=v()(z)),p(z))}else e.get(\"body\")||\"POST\"!==e.get(\"method\")||(f(),d(),p(\"-d ''\"));return u},R=function(e){return T(e,I,\"`\\n\",\".exe\")},N=function(e){return T(e,A,\"\\\\\\n\")},M=function(e){return T(e,k,\"^\\n\")}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"parseYamlConfig\",(function(){return o}));var r=n(63),a=n.n(r),o=function(e,t){try{return a.a.load(e)}catch(e){return t&&t.errActions.newThrownErr(new Error(e)),{}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"getDefaultRequestBodyValue\",(function(){return E}));var r=n(13),a=n.n(r),o=n(4),i=n.n(o),s=n(17),c=n.n(s),u=n(29),l=n.n(u),p=n(2),f=n.n(p),d=n(22),h=n.n(d),m=n(0),v=n.n(m),g=(n(11),n(26),n(1)),y=n(5),b=n(85),E=function(e,t,n){var r=e.getIn([\"content\",t]),a=r.get(\"schema\").toJS(),o=void 0!==r.get(\"examples\"),i=r.get(\"example\"),s=o?r.getIn([\"examples\",n,\"value\"]):i,c=Object(y.o)(a,t,{includeWriteOnly:!0},s);return Object(y.I)(c)};t.default=function(e){var t=e.userHasEditedBody,n=e.requestBody,r=e.requestBodyValue,o=e.requestBodyInclusionSetting,s=e.requestBodyErrors,u=e.getComponent,p=e.getConfigs,d=e.specSelectors,m=e.fn,x=e.contentType,S=e.isExecute,w=e.specPath,j=e.onChange,O=e.onChangeIncludeEmpty,C=e.activeExamplesKey,_=e.updateActiveExamplesKey,A=e.setRetainRequestBodyValueFlag,k=function(e){var t={key:e,shouldDispatchInit:!1,defaultValue:!0};return\"no value\"===o.get(e,\"no value\")&&(t.shouldDispatchInit=!0),t},I=u(\"Markdown\",!0),P=u(\"modelExample\"),T=u(\"RequestBodyEditor\"),R=u(\"highlightCode\"),N=u(\"ExamplesSelectValueRetainer\"),M=u(\"Example\"),q=u(\"ParameterIncludeEmpty\"),D=p().showCommonExtensions,B=n&&n.get(\"description\")||null,L=n&&n.get(\"content\")||new g.OrderedMap;x=x||L.keySeq().first()||\"\";var U=L.get(x,Object(g.OrderedMap)()),V=U.get(\"schema\",Object(g.OrderedMap)()),z=U.get(\"examples\",null),F=null==z?void 0:i()(z).call(z,(function(e,t){var r,a=null===(r=e)||void 0===r?void 0:r.get(\"value\",null);return a&&(e=e.set(\"value\",E(n,x,t),a)),e}));if(s=g.List.isList(s)?s:Object(g.List)(),!U.size)return null;var J=\"object\"===U.getIn([\"schema\",\"type\"]),W=\"binary\"===U.getIn([\"schema\",\"format\"]),H=\"base64\"===U.getIn([\"schema\",\"format\"]);if(\"application/octet-stream\"===x||0===c()(x).call(x,\"image/\")||0===c()(x).call(x,\"audio/\")||0===c()(x).call(x,\"video/\")||W||H){var $=u(\"Input\");return S?v.a.createElement($,{type:\"file\",onChange:function(e){j(e.target.files[0])}}):v.a.createElement(\"i\",null,\"Example values are not available for \",v.a.createElement(\"code\",null,x),\" media types.\")}if(J&&(\"application/x-www-form-urlencoded\"===x||0===c()(x).call(x,\"multipart/\"))&&V.get(\"properties\",Object(g.OrderedMap)()).size>0){var Y,K=u(\"JsonSchemaForm\"),G=u(\"ParameterExt\"),Z=V.get(\"properties\",Object(g.OrderedMap)());return r=g.Map.isMap(r)?r:Object(g.OrderedMap)(),v.a.createElement(\"div\",{className:\"table-container\"},B&&v.a.createElement(I,{source:B}),v.a.createElement(\"table\",null,v.a.createElement(\"tbody\",null,g.Map.isMap(Z)&&i()(Y=Z.entrySeq()).call(Y,(function(e){var t,n,c=a()(e,2),p=c[0],d=c[1];if(!d.get(\"readOnly\")){var b=D?Object(y.l)(d):null,E=l()(t=V.get(\"required\",Object(g.List)())).call(t,p),x=d.get(\"type\"),w=d.get(\"format\"),C=d.get(\"description\"),_=r.getIn([p,\"value\"]),A=r.getIn([p,\"errors\"])||s,P=o.get(p)||!1,T=d.has(\"default\")||d.has(\"example\")||d.hasIn([\"items\",\"example\"])||d.hasIn([\"items\",\"default\"]),R=d.has(\"enum\")&&(1===d.get(\"enum\").size||E),N=T||R,M=\"\";\"array\"!==x||N||(M=[]),(\"object\"===x||N)&&(M=Object(y.o)(d,!1,{includeWriteOnly:!0})),\"string\"!=typeof M&&\"object\"===x&&(M=Object(y.I)(M)),\"string\"==typeof M&&\"array\"===x&&(M=JSON.parse(M));var B=\"string\"===x&&(\"binary\"===w||\"base64\"===w);return v.a.createElement(\"tr\",{key:p,className:\"parameters\",\"data-property-name\":p},v.a.createElement(\"td\",{className:\"parameters-col_name\"},v.a.createElement(\"div\",{className:E?\"parameter__name required\":\"parameter__name\"},p,E?v.a.createElement(\"span\",null,\" *\"):null),v.a.createElement(\"div\",{className:\"parameter__type\"},x,w&&v.a.createElement(\"span\",{className:\"prop-format\"},\"($\",w,\")\"),D&&b.size?i()(n=b.entrySeq()).call(n,(function(e){var t,n=a()(e,2),r=n[0],o=n[1];return v.a.createElement(G,{key:f()(t=\"\".concat(r,\"-\")).call(t,o),xKey:r,xVal:o})})):null),v.a.createElement(\"div\",{className:\"parameter__deprecated\"},d.get(\"deprecated\")?\"deprecated\":null)),v.a.createElement(\"td\",{className:\"parameters-col_description\"},v.a.createElement(I,{source:C}),S?v.a.createElement(\"div\",null,v.a.createElement(K,{fn:m,dispatchInitialValue:!B,schema:d,description:p,getComponent:u,value:void 0===_?M:_,required:E,errors:A,onChange:function(e){j(e,[p])}}),E?null:v.a.createElement(q,{onChange:function(e){return O(p,e)},isIncluded:P,isIncludedOptions:k(p),isDisabled:h()(_)?0!==_.length:!Object(y.q)(_)})):null))}})))))}var X=E(n,x,C),Q=null;return Object(b.a)(X)&&(Q=\"json\"),v.a.createElement(\"div\",null,B&&v.a.createElement(I,{source:B}),F?v.a.createElement(N,{userHasEditedBody:t,examples:F,currentKey:C,currentUserInputValue:r,onSelect:function(e){_(e)},updateValue:j,defaultToFirstExample:!0,getComponent:u,setRetainRequestBodyValueFlag:A}):null,S?v.a.createElement(\"div\",null,v.a.createElement(T,{value:r,errors:s,defaultValue:X,onChange:j,getComponent:u})):v.a.createElement(P,{getComponent:u,getConfigs:p,specSelectors:d,expandDepth:1,isExecute:S,schema:U.get(\"schema\"),specPath:w.push(\"content\",x),example:v.a.createElement(R,{className:\"body-param__example\",getConfigs:p,language:Q,value:Object(y.I)(r)||X}),includeWriteOnly:!0}),F?v.a.createElement(M,{example:F.get(C),getComponent:u,getConfigs:p}):null)}},function(e,t,n){e.exports=n(528)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"makeMappedContainer\",(function(){return A})),n.d(t,\"render\",(function(){return k})),n.d(t,\"getComponent\",(function(){return T}));var r=n(18),a=n.n(r),o=n(27),i=n.n(o),s=n(6),c=n.n(s),u=n(7),l=n.n(u),p=n(8),f=n.n(p),d=n(9),h=n.n(d),m=n(20),v=n.n(m),g=n(15),y=n.n(g),b=n(0),E=n.n(b),x=n(391),S=n.n(x),w=n(282),j=n(392),O=n.n(j),C=function(e,t,n){var r=function(e,t){return function(n){f()(a,n);var r=h()(a);function a(){return c()(this,a),r.apply(this,arguments)}return l()(a,[{key:\"render\",value:function(){return E.a.createElement(t,i()({},e(),this.props,this.context))}}]),a}(b.Component)}(e,t),a=Object(w.connect)((function(n,r){var a=v()({},r,e());return(t.prototype.mapStateToProps||function(e){return{state:e}})(n,a)}))(r);return n?function(e,t){return function(n){f()(a,n);var r=h()(a);function a(){return c()(this,a),r.apply(this,arguments)}return l()(a,[{key:\"render\",value:function(){return E.a.createElement(w.Provider,{store:e},E.a.createElement(t,i()({},this.props,this.context)))}}]),a}(b.Component)}(n,a):a},_=function(e,t,n,r){for(var a in t){var o=t[a];\"function\"==typeof o&&o(n[a],r[a],e())}},A=function(e,t,n,r,a,o){return function(t){f()(i,t);var r=h()(i);function i(t,n){var a;return c()(this,i),a=r.call(this,t,n),_(e,o,t,{}),a}return l()(i,[{key:\"componentWillReceiveProps\",value:function(t){_(e,o,t,this.props)}},{key:\"render\",value:function(){var e=O()(this.props,o?y()(o):[]),t=n(a,\"root\");return E.a.createElement(t,e)}}]),i}(b.Component)},k=function(e,t,n,r,a){var o=n(e,t,r,\"App\",\"root\");S.a.render(E.a.createElement(o,null),a)},I=function(e){var t=e.name;return E.a.createElement(\"div\",{className:\"fallback\"},\"😱 \",E.a.createElement(\"i\",null,\"Could not render \",\"t\"===t?\"this component\":t,\", see the console.\"))},P=function(e){var t=function(e){return!(e.prototype&&e.prototype.isReactComponent)}(e)?function(e){return function(t){f()(r,t);var n=h()(r);function r(){return c()(this,r),n.apply(this,arguments)}return l()(r,[{key:\"render\",value:function(){return e(this.props)}}]),r}(b.Component)}(e):e,n=t.prototype.render;return t.prototype.render=function(){try{for(var e=arguments.length,r=new Array(e),a=0;a<e;a++)r[a]=arguments[a];return n.apply(this,r)}catch(e){return console.error(e),E.a.createElement(I,{error:e,name:t.name})}},t},T=function(e,t,n,r,o){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};if(\"string\"!=typeof r)throw new TypeError(\"Need a string, to fetch a component. Was given a \"+a()(r));var s=n(r);return s?o?\"root\"===o?C(e,s,t()):C(e,P(s)):P(s):(i.failSilently||e().log.warn(\"Could not find component:\",r),null)}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"setHash\",(function(){return r}));var r=function(e){return e?history.pushState(null,null,\"#\".concat(e)):window.location.hash=\"\"}},function(e,t){e.exports=require(\"redux\")},function(e,t,n){e.exports=n(415)},function(e,t,n){\"use strict\";var r={}.propertyIsEnumerable,a=Object.getOwnPropertyDescriptor,o=a&&!r.call({1:2},1);t.f=o?function(e){var t=a(this,e);return!!t&&t.enumerable}:r},function(e,t,n){var r=n(34),a=n(120),o=\"\".split;e.exports=r((function(){return!Object(\"z\").propertyIsEnumerable(0)}))?function(e){return\"String\"==a(e)?o.call(e,\"\"):Object(e)}:Object},function(e,t,n){var r=n(42);e.exports=function(e,t){if(!r(e))return e;var n,a;if(t&&\"function\"==typeof(n=e.toString)&&!r(a=n.call(e)))return a;if(\"function\"==typeof(n=e.valueOf)&&!r(a=n.call(e)))return a;if(!t&&\"function\"==typeof(n=e.toString)&&!r(a=n.call(e)))return a;throw TypeError(\"Can't convert object to primitive value\")}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return\"Symbol(\"+String(void 0===e?\"\":e)+\")_\"+(++n+r).toString(36)}},function(e,t){},function(e,t,n){var r=n(185),a=n(144),o=r(\"keys\");e.exports=function(e){return o[e]||(o[e]=a(e))}},function(e,t,n){var r=n(49),a=n(53),o=n(146),i=n(303),s=o(\"IE_PROTO\"),c=Object.prototype;e.exports=i?Object.getPrototypeOf:function(e){return e=a(e),r(e,s)?e[s]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?c:null}},function(e,t,n){var r=n(46),a=n(446);e.exports=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),a(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},function(e,t,n){var r=n(120),a=n(36);e.exports=\"process\"==r(a.process)},function(e,t,n){var r=n(491),a=n(314),o=n(312);e.exports=function(e,t){var n;if(e){if(\"string\"==typeof e)return o(e,t);var i=r(n=Object.prototype.toString.call(e)).call(n,8,-1);return\"Object\"===i&&e.constructor&&(i=e.constructor.name),\"Map\"===i||\"Set\"===i?a(e):\"Arguments\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?o(e,t):void 0}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(95),a=n(75);e.exports=function(e){return\"symbol\"==typeof e||a(e)&&\"[object Symbol]\"==r(e)}},function(e,t,n){var r=n(96)(Object,\"create\");e.exports=r},function(e,t,n){var r=n(565),a=n(566),o=n(567),i=n(568),s=n(569);function c(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}c.prototype.clear=r,c.prototype.delete=a,c.prototype.get=o,c.prototype.has=i,c.prototype.set=s,e.exports=c},function(e,t,n){var r=n(100);e.exports=function(e,t){for(var n=e.length;n--;)if(r(e[n][0],t))return n;return-1}},function(e,t,n){var r=n(571);e.exports=function(e,t){var n=e.__data__;return r(t)?n[\"string\"==typeof t?\"string\":\"hash\"]:n.map}},function(e,t,n){var r=n(576),a=n(603),o=n(212),i=n(45),s=n(608);e.exports=function(e){return\"function\"==typeof e?e:null==e?o:\"object\"==typeof e?i(e)?a(e[0],e[1]):r(e):s(e)}},function(e,t,n){var r=n(594),a=n(75),o=Object.prototype,i=o.hasOwnProperty,s=o.propertyIsEnumerable,c=r(function(){return arguments}())?r:function(e){return a(e)&&i.call(e,\"callee\")&&!s.call(e,\"callee\")};e.exports=c},function(e,t,n){(function(e){var r=n(62),a=n(595),o=t&&!t.nodeType&&t,i=o&&\"object\"==typeof e&&e&&!e.nodeType&&e,s=i&&i.exports===o?r.Buffer:void 0,c=(s?s.isBuffer:void 0)||a;e.exports=c}).call(this,n(206)(e))},function(e,t){var n=/^(?:0|[1-9]\\d*)$/;e.exports=function(e,t){var r=typeof e;return!!(t=null==t?9007199254740991:t)&&(\"number\"==r||\"symbol\"!=r&&n.test(e))&&e>-1&&e%1==0&&e<t}},function(e,t,n){var r=n(110),a=n(111);e.exports=function(e,t){for(var n=0,o=(t=r(t,e)).length;null!=e&&n<o;)e=e[a(t[n++])];return n&&n==o?e:void 0}},function(e,t){e.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},function(e,t,n){var r=n(366),a=n(100),o=Object.prototype.hasOwnProperty;e.exports=function(e,t,n){var i=e[t];o.call(e,t)&&a(i,n)&&(void 0!==n||t in e)||r(e,t,n)}},function(e,t,n){var r=n(125),a=n(42),o=n(49),i=n(59).f,s=n(144),c=n(743),u=s(\"meta\"),l=0,p=Object.isExtensible||function(){return!0},f=function(e){i(e,u,{value:{objectID:\"O\"+ ++l,weakData:{}}})},d=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!a(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!o(e,u)){if(!p(e))return\"F\";if(!t)return\"E\";f(e)}return e[u].objectID},getWeakData:function(e,t){if(!o(e,u)){if(!p(e))return!0;if(!t)return!1;f(e)}return e[u].weakData},onFreeze:function(e){return c&&d.REQUIRED&&p(e)&&!o(e,u)&&f(e),e}};r[u]=!0},function(e,t,n){e.exports=n(502)},function(e,t,n){var r=n(575)(n(611));e.exports=r},function(e,t,n){e.exports=n(624)},function(e,t,n){e.exports=n(666)},function(e,t,n){var r=n(95),a=n(45),o=n(75);e.exports=function(e){return\"string\"==typeof e||!a(e)&&o(e)&&\"[object String]\"==r(e)}},function(e,t,n){e.exports=n(730)},function(e,t,n){e.exports=n(731)},function(e,t,n){var r=n(734),a=n(373)((function(e,t){return null==e?{}:r(e,t)}));e.exports=a},function(e,t){e.exports=require(\"buffer\")},function(e,t,n){var r=n(162),a=n(113),o=n(746),i=n(98),s=n(128),c=n(97),u=Object.prototype.hasOwnProperty,l=o((function(e,t){if(s(t)||i(t))a(t,c(t),e);else for(var n in t)u.call(t,n)&&r(e,n,t[n])}));e.exports=l},function(e,t){e.exports=require(\"btoa\")},function(e,t,n){e.exports=n(754)},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return _}));var r=n(18),a=n.n(r),o=n(6),i=n.n(o),s=n(7),c=n.n(s),u=n(10),l=n.n(u),p=n(8),f=n.n(p),d=n(9),h=n.n(d),m=n(3),v=n.n(m),g=n(15),y=n.n(g),b=n(2),E=n.n(b),x=n(0),S=n.n(x),w=n(78),j=n.n(w),O=(n(11),n(5)),C=n(25),_=function(e){f()(n,e);var t=h()(n);function n(e,r){var a;i()(this,n),a=t.call(this,e,r),v()(l()(a),\"getDefinitionUrl\",(function(){var e=a.props.specSelectors;return new j.a(e.url(),C.a.location).toString()}));var o=(0,e.getConfigs)().validatorUrl;return a.state={url:a.getDefinitionUrl(),validatorUrl:void 0===o?\"https://validator.swagger.io/validator\":o},a}return c()(n,[{key:\"componentWillReceiveProps\",value:function(e){var t=(0,e.getConfigs)().validatorUrl;this.setState({url:this.getDefinitionUrl(),validatorUrl:void 0===t?\"https://validator.swagger.io/validator\":t})}},{key:\"render\",value:function(){var e,t,n=(0,this.props.getConfigs)().spec,r=Object(O.F)(this.state.validatorUrl);return\"object\"===a()(n)&&y()(n).length?null:this.state.url&&Object(O.E)(this.state.validatorUrl)&&Object(O.E)(this.state.url)?S.a.createElement(\"span\",{className:\"float-right\"},S.a.createElement(\"a\",{target:\"_blank\",rel:\"noopener noreferrer\",href:E()(e=\"\".concat(r,\"/debug?url=\")).call(e,encodeURIComponent(this.state.url))},S.a.createElement(A,{src:E()(t=\"\".concat(r,\"?url=\")).call(t,encodeURIComponent(this.state.url)),alt:\"Online validator badge\"}))):null}}]),n}(S.a.Component),A=function(e){f()(n,e);var t=h()(n);function n(e){var r;return i()(this,n),(r=t.call(this,e)).state={loaded:!1,error:!1},r}return c()(n,[{key:\"componentDidMount\",value:function(){var e=this,t=new Image;t.onload=function(){e.setState({loaded:!0})},t.onerror=function(){e.setState({error:!0})},t.src=this.props.src}},{key:\"componentWillReceiveProps\",value:function(e){var t=this;if(e.src!==this.props.src){var n=new Image;n.onload=function(){t.setState({loaded:!0})},n.onerror=function(){t.setState({error:!0})},n.src=e.src}}},{key:\"render\",value:function(){return this.state.error?S.a.createElement(\"img\",{alt:\"Error\"}):this.state.loaded?S.a.createElement(\"img\",{src:this.props.src,alt:this.props.alt}):null}}]),n}(S.a.Component)},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return P}));var r=n(27),a=n.n(r),o=n(6),i=n.n(o),s=n(7),c=n.n(s),u=n(10),l=n.n(u),p=n(8),f=n.n(p),d=n(9),h=n.n(d),m=n(3),v=n.n(m),g=n(2),y=n.n(g),b=n(17),E=n.n(b),x=n(4),S=n.n(x),w=n(0),j=n.n(w),O=n(412),C=n.n(O),_=n(26),A=n.n(_),k=n(11),I=n.n(k),P=function(e){f()(r,e);var t=h()(r);function r(){var e,n;i()(this,r);for(var a=arguments.length,o=new Array(a),s=0;s<a;s++)o[s]=arguments[s];return n=t.call.apply(t,y()(e=[this]).call(e,o)),v()(l()(n),\"getModelName\",(function(e){return-1!==E()(e).call(e,\"#/definitions/\")?e.replace(/^.*#\\/definitions\\//,\"\"):-1!==E()(e).call(e,\"#/components/schemas/\")?e.replace(/^.*#\\/components\\/schemas\\//,\"\"):void 0})),v()(l()(n),\"getRefSchema\",(function(e){return n.props.specSelectors.findDefinition(e)})),n}return c()(r,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,r=e.getConfigs,o=e.specSelectors,i=e.schema,s=e.required,c=e.name,u=e.isRef,l=e.specPath,p=e.displayName,f=e.includeReadOnly,d=e.includeWriteOnly,h=t(\"ObjectModel\"),m=t(\"ArrayModel\"),v=t(\"PrimitiveModel\"),g=\"object\",y=i&&i.get(\"$$ref\");if(!c&&y&&(c=this.getModelName(y)),!i&&y&&(i=this.getRefSchema(c)),!i)return j.a.createElement(\"span\",{className:\"model model-title\"},j.a.createElement(\"span\",{className:\"model-title__text\"},p||c),j.a.createElement(\"img\",{src:n(380),height:\"20px\",width:\"20px\"}));var b=o.isOAS3()&&i.get(\"deprecated\");switch(u=void 0!==u?u:!!y,g=i&&i.get(\"type\")||g){case\"object\":return j.a.createElement(h,a()({className:\"object\"},this.props,{specPath:l,getConfigs:r,schema:i,name:c,deprecated:b,isRef:u,includeReadOnly:f,includeWriteOnly:d}));case\"array\":return j.a.createElement(m,a()({className:\"array\"},this.props,{getConfigs:r,schema:i,name:c,deprecated:b,required:s,includeReadOnly:f,includeWriteOnly:d}));case\"string\":case\"number\":case\"integer\":case\"boolean\":default:return j.a.createElement(v,a()({},this.props,{getComponent:t,getConfigs:r,schema:i,name:c,deprecated:b,required:s}))}}}]),r}(C.a);v()(P,\"propTypes\",{schema:S()(A.a).isRequired,getComponent:I.a.func.isRequired,getConfigs:I.a.func.isRequired,specSelectors:I.a.object.isRequired,name:I.a.string,displayName:I.a.string,isRef:I.a.bool,required:I.a.bool,expandDepth:I.a.number,depth:I.a.number,specPath:A.a.list.isRequired,includeReadOnly:I.a.bool,includeWriteOnly:I.a.bool})},function(e,t){e.exports=require(\"remarkable\")},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return y}));var r=n(0),a=n.n(r),o=(n(11),n(178)),i=n(413),s=n.n(i),c=/www|@|\\:\\/\\//;function u(e){return/^<\\/a\\s*>/i.test(e)}function l(){var e=[],t=new s.a({stripPrefix:!1,url:!0,email:!0,replaceFn:function(t){switch(t.getType()){case\"url\":e.push({text:t.matchedText,url:t.getUrl()});break;case\"email\":e.push({text:t.matchedText,url:\"mailto:\"+t.getEmail().replace(/^mailto:/i,\"\")})}return!1}});return{links:e,autolinker:t}}function p(e){var t,n,r,a,o,i,s,p,f,d,h,m,v,g,y=e.tokens,b=null;for(n=0,r=y.length;n<r;n++)if(\"inline\"===y[n].type)for(h=0,t=(a=y[n].children).length-1;t>=0;t--)if(\"link_close\"!==(o=a[t]).type){if(\"htmltag\"===o.type&&(g=o.content,/^<a[>\\s]/i.test(g)&&h>0&&h--,u(o.content)&&h++),!(h>0)&&\"text\"===o.type&&c.test(o.content)){if(b||(m=(b=l()).links,v=b.autolinker),i=o.content,m.length=0,v.link(i),!m.length)continue;for(s=[],d=o.level,p=0;p<m.length;p++)e.inline.validateLink(m[p].url)&&((f=i.indexOf(m[p].text))&&s.push({type:\"text\",content:i.slice(0,f),level:d}),s.push({type:\"link_open\",href:m[p].url,title:\"\",level:d++}),s.push({type:\"text\",content:m[p].text,level:d}),s.push({type:\"link_close\",level:--d}),i=i.slice(f+m[p].text.length));i.length&&s.push({type:\"text\",content:i,level:d}),y[n].children=a=[].concat(a.slice(0,t),s,a.slice(t+1))}}else for(t--;a[t].level!==o.level&&\"link_open\"!==a[t].type;)t--}function f(e){e.core.ruler.push(\"linkify\",p)}var d=n(181),h=n.n(d),m=n(54),v=n.n(m);function g(e){var t=e.source,n=e.className,r=void 0===n?\"\":n,i=e.getConfigs;if(\"string\"!=typeof t)return null;var s=new o.Remarkable({html:!0,typographer:!0,breaks:!0,linkTarget:\"_blank\"}).use(f);s.core.ruler.disable([\"replacements\",\"smartquotes\"]);var c=i().useUnsafeMarkdown,u=s.render(t),l=y(u,{useUnsafeMarkdown:c});return t&&u&&l?a.a.createElement(\"div\",{className:v()(r,\"markdown\"),dangerouslySetInnerHTML:{__html:l}}):null}h.a.addHook&&h.a.addHook(\"beforeSanitizeElements\",(function(e){return e.href&&e.setAttribute(\"rel\",\"noopener noreferrer\"),e})),g.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}};t.a=g;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.useUnsafeMarkdown,r=void 0!==n&&n,a=r,o=r?[]:[\"style\",\"class\"];return r&&!y.hasWarnedAboutDeprecation&&(console.warn(\"useUnsafeMarkdown display configuration parameter is deprecated since >3.26.0 and will be removed in v4.0.0.\"),y.hasWarnedAboutDeprecation=!0),h.a.sanitize(e,{ADD_ATTR:[\"target\"],FORBID_TAGS:[\"style\",\"form\"],ALLOW_DATA_ATTR:a,FORBID_ATTR:o})}y.hasWarnedAboutDeprecation=!1},function(e,t){e.exports=require(\"qs\")},function(e,t){e.exports=require(\"dompurify\")},function(e,t){var n;n=function(){return this}();try{n=n||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(n=window)}e.exports=n},function(e,t,n){var r=n(36),a=n(42),o=r.document,i=a(o)&&a(o.createElement);e.exports=function(e){return i?o.createElement(e):{}}},function(e,t,n){var r=n(42),a=n(121),o=n(37)(\"species\");e.exports=function(e,t){var n;return a(e)&&(\"function\"!=typeof(n=e.constructor)||n!==Array&&!a(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},function(e,t,n){var r=n(81),a=n(186);(e.exports=function(e,t){return a[e]||(a[e]=void 0!==t?t:{})})(\"versions\",[]).push({version:\"3.15.1\",mode:r?\"pure\":\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"})},function(e,t,n){var r=n(36),a=n(417),o=\"__core-js_shared__\",i=r[o]||a(o,{});e.exports=i},function(e,t,n){var r=n(106),a=n(34);e.exports=!!Object.getOwnPropertySymbols&&!a((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(e,t,n){var r=n(43),a=n(59),o=n(46),i=n(124);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=i(t),s=r.length,c=0;s>c;)a.f(e,n=r[c++],t[n]);return e}},function(e,t,n){var r=n(57),a=n(60),o=n(190),i=function(e){return function(t,n,i){var s,c=r(t),u=a(c.length),l=o(i,u);if(e&&n!=n){for(;u>l;)if((s=c[l++])!=s)return!0}else for(;u>l;l++)if((e||l in c)&&c[l]===n)return e||l||0;return!e&&-1}};e.exports={includes:i(!0),indexOf:i(!1)}},function(e,t,n){var r=n(105),a=Math.max,o=Math.min;e.exports=function(e,t){var n=r(e);return n<0?a(n+t,0):o(n,t)}},function(e,t){e.exports=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"]},function(e,t,n){var r=n(295),a=n(191).concat(\"length\",\"prototype\");t.f=Object.getOwnPropertyNames||function(e){return r(e,a)}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var r=n(37);t.f=r},function(e,t,n){var r={};r[n(37)(\"toStringTag\")]=\"z\",e.exports=\"[object z]\"===String(r)},function(e,t,n){\"use strict\";var r=n(21),a=n(301),o=n(147),i=n(148),s=n(82),c=n(58),u=n(93),l=n(37),p=n(81),f=n(108),d=n(302),h=d.IteratorPrototype,m=d.BUGGY_SAFARI_ITERATORS,v=l(\"iterator\"),g=\"keys\",y=\"values\",b=\"entries\",E=function(){return this};e.exports=function(e,t,n,l,d,x,S){a(n,t,l);var w,j,O,C=function(e){if(e===d&&P)return P;if(!m&&e in k)return k[e];switch(e){case g:case y:case b:return function(){return new n(this,e)}}return function(){return new n(this)}},_=t+\" Iterator\",A=!1,k=e.prototype,I=k[v]||k[\"@@iterator\"]||d&&k[d],P=!m&&I||C(d),T=\"Array\"==t&&k.entries||I;if(T&&(w=o(T.call(new e)),h!==Object.prototype&&w.next&&(p||o(w)===h||(i?i(w,h):\"function\"!=typeof w[v]&&c(w,v,E)),s(w,_,!0,!0),p&&(f[_]=E))),d==y&&I&&I.name!==y&&(A=!0,P=function(){return I.call(this)}),p&&!S||k[v]===P||c(k,v,P),f[t]=P,d)if(j={values:C(y),keys:x?P:C(g),entries:C(b)},S)for(O in j)(m||A||!(O in k))&&u(k,O,j[O]);else r({target:t,proto:!0,forced:m||A},j);return j}},function(e,t){e.exports=function(){}},function(e,t,n){e.exports=n(459)},function(e,t,n){e.exports=n(486)},function(e,t,n){e.exports=n(487)},function(e,t,n){var r=n(554),a=n(570),o=n(572),i=n(573),s=n(574);function c(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}c.prototype.clear=r,c.prototype.delete=a,c.prototype.get=o,c.prototype.has=i,c.prototype.set=s,e.exports=c},function(e,t,n){var r=n(96)(n(62),\"Map\");e.exports=r},function(e,t,n){var r=n(153),a=n(578),o=n(579),i=n(580),s=n(581),c=n(582);function u(e){var t=this.__data__=new r(e);this.size=t.size}u.prototype.clear=a,u.prototype.delete=o,u.prototype.get=i,u.prototype.has=s,u.prototype.set=c,e.exports=u},function(e,t){e.exports=function(e,t){for(var n=-1,r=t.length,a=e.length;++n<r;)e[a+n]=t[n];return e}},function(e,t,n){var r=n(592),a=n(340),o=Object.prototype.propertyIsEnumerable,i=Object.getOwnPropertySymbols,s=i?function(e){return null==e?[]:(e=Object(e),r(i(e),(function(t){return o.call(e,t)})))}:a;e.exports=s},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,\"loaded\",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,\"id\",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,n){var r=n(596),a=n(209),o=n(210),i=o&&o.isTypedArray,s=i?a(i):r;e.exports=s},function(e,t){e.exports=function(e){return\"number\"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,n){(function(e){var r=n(328),a=t&&!t.nodeType&&t,o=a&&\"object\"==typeof e&&e&&!e.nodeType&&e,i=o&&o.exports===a&&r.process,s=function(){try{var e=o&&o.require&&o.require(\"util\").types;return e||i&&i.binding&&i.binding(\"util\")}catch(e){}}();e.exports=s}).call(this,n(206)(e))},function(e,t,n){var r=n(45),a=n(151),o=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,i=/^\\w*$/;e.exports=function(e,t){if(r(e))return!1;var n=typeof e;return!(\"number\"!=n&&\"symbol\"!=n&&\"boolean\"!=n&&null!=e&&!a(e))||(i.test(e)||!o.test(e)||null!=t&&e in Object(t))}},function(e,t){e.exports=function(e){return e}},function(e,t,n){var r=n(341),a=n(696),o=n(98);e.exports=function(e){return o(e)?r(e,!0):a(e)}},function(e,t,n){var r=n(343)(Object.getPrototypeOf,Object);e.exports=r},function(e,t,n){var r=n(337);e.exports=function(e){var t=new e.constructor(e.byteLength);return new r(t).set(new r(e)),t}},function(e,t,n){var r=n(541)(\"toUpperCase\");e.exports=r},function(e,t,n){var r=n(201);function a(e,t){if(\"function\"!=typeof e||null!=t&&\"function\"!=typeof t)throw new TypeError(\"Expected a function\");var n=function(){var r=arguments,a=t?t.apply(this,r):r[0],o=n.cache;if(o.has(a))return o.get(a);var i=e.apply(this,r);return n.cache=o.set(a,i)||o,i};return n.cache=new(a.Cache||r),n}a.Cache=r,e.exports=a},function(e,t,n){\"use strict\";n.r(t);var r=n(219),a=n(52),o=n(222);t.default=function(e){return{statePlugins:{err:{reducers:Object(r.default)(e),actions:a,selectors:o}}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(3),a=n.n(r),o=n(20),i=n.n(o),s=n(4),c=n.n(s),u=n(2),l=n.n(u),p=n(12),f=n.n(p),d=n(166),h=n.n(d),m=n(52),v=n(1),g=n(103),y={line:0,level:\"error\",message:\"Unknown error\"};t.default=function(){var e;return e={},a()(e,m.NEW_THROWN_ERR,(function(e,t){var n=t.payload,r=i()(y,n,{type:\"thrown\"});return e.update(\"errors\",(function(e){return(e||Object(v.List)()).push(Object(v.fromJS)(r))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),a()(e,m.NEW_THROWN_ERR_BATCH,(function(e,t){var n=t.payload;return n=c()(n).call(n,(function(e){return Object(v.fromJS)(i()(y,e,{type:\"thrown\"}))})),e.update(\"errors\",(function(e){var t;return l()(t=e||Object(v.List)()).call(t,Object(v.fromJS)(n))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),a()(e,m.NEW_SPEC_ERR,(function(e,t){var n=t.payload,r=Object(v.fromJS)(n);return r=r.set(\"type\",\"spec\"),e.update(\"errors\",(function(e){return(e||Object(v.List)()).push(Object(v.fromJS)(r)).sortBy((function(e){return e.get(\"line\")}))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),a()(e,m.NEW_SPEC_ERR_BATCH,(function(e,t){var n=t.payload;return n=c()(n).call(n,(function(e){return Object(v.fromJS)(i()(y,e,{type:\"spec\"}))})),e.update(\"errors\",(function(e){var t;return l()(t=e||Object(v.List)()).call(t,Object(v.fromJS)(n))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),a()(e,m.NEW_AUTH_ERR,(function(e,t){var n=t.payload,r=Object(v.fromJS)(i()({},n));return r=r.set(\"type\",\"auth\"),e.update(\"errors\",(function(e){return(e||Object(v.List)()).push(Object(v.fromJS)(r))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),a()(e,m.CLEAR,(function(e,t){var n,r=t.payload;if(!r||!e.get(\"errors\"))return e;var a=f()(n=e.get(\"errors\")).call(n,(function(e){var t;return h()(t=e.keySeq()).call(t,(function(t){var n=e.get(t),a=r[t];return!a||n!==a}))}));return e.merge({errors:a})})),a()(e,m.CLEAR_BY,(function(e,t){var n,r=t.payload;if(!r||\"function\"!=typeof r)return e;var a=f()(n=e.get(\"errors\")).call(n,(function(e){return r(e)}));return e.merge({errors:a})})),e}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"transform\",(function(){return p}));var r=n(4),a=n.n(r),o=n(17),i=n.n(o),s=n(19),c=n.n(s),u=n(28),l=n.n(u);function p(e){return a()(e).call(e,(function(e){var t,n=\"is not of a type(s)\",r=i()(t=e.get(\"message\")).call(t,n);if(r>-1){var a,o,s=c()(a=e.get(\"message\")).call(a,r+n.length).split(\",\");return e.set(\"message\",c()(o=e.get(\"message\")).call(o,0,r)+function(e){return l()(e).call(e,(function(e,t,n,r){return n===r.length-1&&r.length>1?e+\"or \"+t:r[n+1]&&r.length>2?e+t+\", \":r[n+1]?e+t+\" \":e+t}),\"should be a\")}(s))}return e}))}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"transform\",(function(){return r}));n(4),n(17),n(39),n(1);function r(e,t){t.jsSpec;return e}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"allErrors\",(function(){return o})),n.d(t,\"lastError\",(function(){return i}));var r=n(1),a=n(16),o=Object(a.createSelector)((function(e){return e}),(function(e){return e.get(\"errors\",Object(r.List)())})),i=Object(a.createSelector)(o,(function(e){return e.last()}))},function(e,t,n){\"use strict\";n.r(t);var r=n(224),a=n(86),o=n(225),i=n(226);t.default=function(){return{statePlugins:{layout:{reducers:r.default,actions:a,selectors:o},spec:{wrapSelectors:i}}}}},function(e,t,n){\"use strict\";n.r(t);var r,a=n(3),o=n.n(a),i=n(2),s=n.n(i),c=n(1),u=n(86);t.default=(r={},o()(r,u.UPDATE_LAYOUT,(function(e,t){return e.set(\"layout\",t.payload)})),o()(r,u.UPDATE_FILTER,(function(e,t){return e.set(\"filter\",t.payload)})),o()(r,u.SHOW,(function(e,t){var n=t.payload.shown,r=Object(c.fromJS)(t.payload.thing);return e.update(\"shown\",Object(c.fromJS)({}),(function(e){return e.set(r,n)}))})),o()(r,u.UPDATE_MODE,(function(e,t){var n,r=t.payload.thing,a=t.payload.mode;return e.setIn(s()(n=[\"modes\"]).call(n,r),(a||\"\")+\"\")})),r)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"current\",(function(){return l})),n.d(t,\"currentFilter\",(function(){return p})),n.d(t,\"isShown\",(function(){return f})),n.d(t,\"whatMode\",(function(){return d})),n.d(t,\"showSummary\",(function(){return h}));var r=n(14),a=n.n(r),o=n(2),i=n.n(o),s=n(16),c=n(5),u=n(1),l=function(e){return e.get(\"layout\")},p=function(e){return e.get(\"filter\")},f=function(e,t,n){return t=Object(c.v)(t),e.get(\"shown\",Object(u.fromJS)({})).get(Object(u.fromJS)(t),n)},d=function(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\";return t=Object(c.v)(t),e.getIn(i()(n=[\"modes\"]).call(n,a()(t)),r)},h=Object(s.createSelector)((function(e){return e}),(function(e){return!f(e,\"editor\")}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"taggedOperations\",(function(){return s}));var r=n(2),a=n.n(r),o=n(19),i=n.n(o),s=function(e,t){return function(n){for(var r,o=arguments.length,s=new Array(o>1?o-1:0),c=1;c<o;c++)s[c-1]=arguments[c];var u=e.apply(void 0,a()(r=[n]).call(r,s)),l=t.getSystem(),p=l.fn,f=l.layoutSelectors,d=l.getConfigs,h=d(),m=h.maxDisplayedTags,v=f.currentFilter();return v&&!0!==v&&\"true\"!==v&&\"false\"!==v&&(u=p.opsFilter(u,v)),m&&!isNaN(m)&&m>=0&&(u=i()(u).call(u,0,m)),u}}},function(e,t,n){\"use strict\";n.r(t);var r=n(228),a=n(41),o=n(77),i=n(229);t.default=function(){return{statePlugins:{spec:{wrapActions:i,reducers:r.default,actions:a,selectors:o}}}}},function(e,t,n){\"use strict\";n.r(t);var r,a=n(3),o=n.n(a),i=n(14),s=n.n(i),c=n(2),u=n.n(c),l=n(28),p=n.n(l),f=n(4),d=n.n(f),h=n(20),m=n.n(h),v=n(1),g=n(5),y=n(25),b=n(77),E=n(41);t.default=(r={},o()(r,E.UPDATE_SPEC,(function(e,t){return\"string\"==typeof t.payload?e.set(\"spec\",t.payload):e})),o()(r,E.UPDATE_URL,(function(e,t){return e.set(\"url\",t.payload+\"\")})),o()(r,E.UPDATE_JSON,(function(e,t){return e.set(\"json\",Object(g.i)(t.payload))})),o()(r,E.UPDATE_RESOLVED,(function(e,t){return e.setIn([\"resolved\"],Object(g.i)(t.payload))})),o()(r,E.UPDATE_RESOLVED_SUBTREE,(function(e,t){var n,r=t.payload,a=r.value,o=r.path;return e.setIn(u()(n=[\"resolvedSubtrees\"]).call(n,s()(o)),Object(g.i)(a))})),o()(r,E.UPDATE_PARAM,(function(e,t){var n,r,a=t.payload,o=a.path,i=a.paramName,c=a.paramIn,l=a.param,p=a.value,f=a.isXml,d=l?Object(g.A)(l):u()(n=\"\".concat(c,\".\")).call(n,i),h=f?\"value_xml\":\"value\";return e.setIn(u()(r=[\"meta\",\"paths\"]).call(r,s()(o),[\"parameters\",d,h]),p)})),o()(r,E.UPDATE_EMPTY_PARAM_INCLUSION,(function(e,t){var n,r,a=t.payload,o=a.pathMethod,i=a.paramName,c=a.paramIn,l=a.includeEmptyValue;if(!i||!c)return console.warn(\"Warning: UPDATE_EMPTY_PARAM_INCLUSION could not generate a paramKey.\"),e;var p=u()(n=\"\".concat(c,\".\")).call(n,i);return e.setIn(u()(r=[\"meta\",\"paths\"]).call(r,s()(o),[\"parameter_inclusions\",p]),l)})),o()(r,E.VALIDATE_PARAMS,(function(e,t){var n,r,a=t.payload,o=a.pathMethod,i=a.isOAS3,c=Object(b.specJsonWithResolvedSubtrees)(e).getIn(u()(n=[\"paths\"]).call(n,s()(o))),l=Object(b.parameterValues)(e,o).toJS();return e.updateIn(u()(r=[\"meta\",\"paths\"]).call(r,s()(o),[\"parameters\"]),Object(v.fromJS)({}),(function(t){var n;return p()(n=c.get(\"parameters\",Object(v.List)())).call(n,(function(t,n){var r=Object(g.B)(n,l),a=Object(b.parameterInclusionSettingFor)(e,o,n.get(\"name\"),n.get(\"in\")),s=Object(g.K)(n,r,{bypassRequiredCheck:a,isOAS3:i});return t.setIn([Object(g.A)(n),\"errors\"],Object(v.fromJS)(s))}),t)}))})),o()(r,E.CLEAR_VALIDATE_PARAMS,(function(e,t){var n,r=t.payload.pathMethod;return e.updateIn(u()(n=[\"meta\",\"paths\"]).call(n,s()(r),[\"parameters\"]),Object(v.fromJS)([]),(function(e){return d()(e).call(e,(function(e){return e.set(\"errors\",Object(v.fromJS)([]))}))}))})),o()(r,E.SET_RESPONSE,(function(e,t){var n,r=t.payload,a=r.res,o=r.path,i=r.method;(n=a.error?m()({error:!0,name:a.err.name,message:a.err.message,statusCode:a.err.statusCode},a.err.response):a).headers=n.headers||{};var s=e.setIn([\"responses\",o,i],Object(g.i)(n));return y.a.Blob&&a.data instanceof y.a.Blob&&(s=s.setIn([\"responses\",o,i,\"text\"],a.data)),s})),o()(r,E.SET_REQUEST,(function(e,t){var n=t.payload,r=n.req,a=n.path,o=n.method;return e.setIn([\"requests\",a,o],Object(g.i)(r))})),o()(r,E.SET_MUTATED_REQUEST,(function(e,t){var n=t.payload,r=n.req,a=n.path,o=n.method;return e.setIn([\"mutatedRequests\",a,o],Object(g.i)(r))})),o()(r,E.UPDATE_OPERATION_META_VALUE,(function(e,t){var n,r,a,o,i,c,l=t.payload,p=l.path,f=l.value,d=l.key,h=u()(n=[\"paths\"]).call(n,s()(p)),m=u()(r=[\"meta\",\"paths\"]).call(r,s()(p));return e.getIn(u()(a=[\"json\"]).call(a,s()(h)))||e.getIn(u()(o=[\"resolved\"]).call(o,s()(h)))||e.getIn(u()(i=[\"resolvedSubtrees\"]).call(i,s()(h)))?e.setIn(u()(c=[]).call(c,s()(m),[d]),Object(v.fromJS)(f)):e})),o()(r,E.CLEAR_RESPONSE,(function(e,t){var n=t.payload,r=n.path,a=n.method;return e.deleteIn([\"responses\",r,a])})),o()(r,E.CLEAR_REQUEST,(function(e,t){var n=t.payload,r=n.path,a=n.method;return e.deleteIn([\"requests\",r,a])})),o()(r,E.SET_SCHEME,(function(e,t){var n=t.payload,r=n.scheme,a=n.path,o=n.method;return a&&o?e.setIn([\"scheme\",a,o],r):a||o?void 0:e.setIn([\"scheme\",\"_defaultScheme\"],r)})),r)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"updateSpec\",(function(){return u})),n.d(t,\"updateJsonSpec\",(function(){return l})),n.d(t,\"executeRequest\",(function(){return p})),n.d(t,\"validateParams\",(function(){return f}));var r=n(15),a=n.n(r),o=n(23),i=n.n(o),s=n(39),c=n.n(s),u=function(e,t){var n=t.specActions;return function(){e.apply(void 0,arguments),n.parseToJson.apply(n,arguments)}},l=function(e,t){var n=t.specActions;return function(){for(var t=arguments.length,r=new Array(t),o=0;o<t;o++)r[o]=arguments[o];e.apply(void 0,r),n.invalidateResolvedSubtreeCache();var s=r[0],u=c()(s,[\"paths\"])||{},l=a()(u);i()(l).call(l,(function(e){c()(u,[e]).$ref&&n.requestResolvedSubtree([\"paths\",e])})),n.requestResolvedSubtree([\"components\",\"securitySchemes\"])}},p=function(e,t){var n=t.specActions;return function(t){return n.logRequest(t),e(t)}},f=function(e,t){var n=t.specSelectors;return function(t){return e(t,n.isOAS3())}}},function(e,t,n){\"use strict\";n.r(t);var r=n(33),a=n.n(r),o=n(137),i=n(5);t.default=function(e){var t=e.getComponents,n=e.getStore,r=e.getSystem,s=o.getComponent,c=o.render,u=o.makeMappedContainer,l=Object(i.u)(a()(s).call(s,null,r,n,t));return{rootInjects:{getComponent:l,makeMappedContainer:Object(i.u)(a()(u).call(u,null,r,n,l,t)),render:a()(c).call(c,null,r,n,s,t)}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(115);t.default=function(){return{fn:r}}},function(e,t,n){\"use strict\";n.r(t);var r=n(133),a=n(233),o=n(234);t.default=function(){return{components:{RequestSnippets:o.RequestSnippets},fn:r,statePlugins:{requestSnippets:{selectors:a}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"getGenerators\",(function(){return f})),n.d(t,\"getSnippetGenerators\",(function(){return d})),n.d(t,\"getActiveLanguage\",(function(){return h})),n.d(t,\"getDefaultExpanded\",(function(){return m}));var r=n(12),a=n.n(r),o=n(29),i=n.n(o),s=n(4),c=n.n(s),u=n(16),l=n(1),p=function(e){return e||Object(l.Map)()},f=Object(u.createSelector)(p,(function(e){var t=e.get(\"languages\"),n=e.get(\"generators\",Object(l.Map)());return t?a()(n).call(n,(function(e,n){return i()(t).call(t,n)})):n})),d=function(e){return function(t){var n,r,o=t.fn;return a()(n=c()(r=f(e)).call(r,(function(e,t){var n=function(e){return o[\"requestSnippetGenerator_\".concat(e)]}(t);return\"function\"!=typeof n?null:e.set(\"fn\",n)}))).call(n,(function(e){return e}))}},h=Object(u.createSelector)(p,(function(e){return e.get(\"activeLanguage\")})),m=Object(u.createSelector)(p,(function(e){return e.get(\"defaultExpanded\")}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"RequestSnippets\",(function(){return x}));var r=n(13),a=n.n(r),o=n(6),i=n.n(o),s=n(7),c=n.n(s),u=n(8),l=n.n(u),p=n(9),f=n.n(p),d=n(4),h=n.n(d),m=n(0),v=n.n(m),g=n(116),y=(n(11),n(39)),b=n.n(y),E=n(80),x=function(e){l()(n,e);var t=f()(n);function n(){var e,r,a,o,s,c;return i()(this,n),(c=t.call(this)).state={activeLanguage:null===(e=c.props)||void 0===e||null===(r=e.requestSnippetsSelectors)||void 0===r||null===(a=r.getSnippetGenerators())||void 0===a?void 0:a.keySeq().first(),expanded:null===(o=c.props)||void 0===o||null===(s=o.requestSnippetsSelectors)||void 0===s?void 0:s.getDefaultExpanded()},c}return c()(n,[{key:\"render\",value:function(){var e,t,n,r,o=this,i=this.props,s=i.request,c=i.getConfigs,u=i.requestSnippetsSelectors.getSnippetGenerators(),l=this.state.activeLanguage||u.keySeq().first(),p=u.get(l),f=p.get(\"fn\")(s),d={cursor:\"pointer\",lineHeight:1,display:\"inline-flex\",backgroundColor:\"rgb(250, 250, 250)\",paddingBottom:\"0\",paddingTop:\"0\",border:\"1px solid rgb(51, 51, 51)\",borderRadius:\"4px 4px 0 0\",boxShadow:\"none\",borderBottom:\"none\"},m={cursor:\"pointer\",lineHeight:1,display:\"inline-flex\",backgroundColor:\"rgb(51, 51, 51)\",boxShadow:\"none\",border:\"1px solid rgb(51, 51, 51)\",paddingBottom:\"0\",paddingTop:\"0\",borderRadius:\"4px 4px 0 0\",marginTop:\"-5px\",marginRight:\"-5px\",marginLeft:\"-5px\",zIndex:\"9999\",borderBottom:\"none\"},y=function(e){return e===l?m:d},x=c(),S=null!=x&&null!==(e=x.syntaxHighlight)&&void 0!==e&&e.activated?v.a.createElement(E.a,{language:p.get(\"syntax\"),className:\"curl microlight\",onWheel:function(e){return this.preventYScrollingBeyondElement(e)},style:Object(E.b)(b()(x,\"syntaxHighlight.theme\"))},f):v.a.createElement(\"textarea\",{readOnly:!0,className:\"curl\",value:f}),w=void 0===this.state.expanded?null===(t=this.props)||void 0===t||null===(n=t.requestSnippetsSelectors)||void 0===n?void 0:n.getDefaultExpanded():this.state.expanded;return v.a.createElement(\"div\",null,v.a.createElement(\"div\",{style:{width:\"100%\",display:\"flex\",justifyContent:\"flex-start\",alignItems:\"center\",marginBottom:\"15px\"}},v.a.createElement(\"h4\",{style:{cursor:\"pointer\"},onClick:function(){return o.setState({expanded:!w})}},\"Snippets\"),v.a.createElement(\"button\",{onClick:function(){return o.setState({expanded:!w})},style:{border:\"none\",background:\"none\"},title:w?\"Collapse operation\":\"Expand operation\"},v.a.createElement(\"svg\",{className:\"arrow\",width:\"10\",height:\"10\"},v.a.createElement(\"use\",{href:w?\"#large-arrow-down\":\"#large-arrow\",xlinkHref:w?\"#large-arrow-down\":\"#large-arrow\"})))),w&&v.a.createElement(\"div\",{className:\"curl-command\"},v.a.createElement(\"div\",{style:{paddingLeft:\"15px\",paddingRight:\"10px\",width:\"100%\",display:\"flex\"}},h()(r=u.entrySeq()).call(r,(function(e){var t=a()(e,2),n=t[0],r=t[1];return v.a.createElement(\"div\",{style:y(n),className:\"btn\",key:n,onClick:function(){return function(e){l!==e&&o.setState({activeLanguage:e})}(n)}},v.a.createElement(\"h4\",{style:n===l?{color:\"white\"}:{}},r.get(\"title\")))}))),v.a.createElement(\"div\",{className:\"copy-to-clipboard\"},v.a.createElement(g.CopyToClipboard,{text:f},v.a.createElement(\"button\",null))),v.a.createElement(\"div\",null,S)))}}]),n}(v.a.Component)},function(e,t,n){\"use strict\";n.r(t);var r=n(33),a=n.n(r);t.default=function(e){var t=e.configs,n={debug:0,info:1,log:2,warn:3,error:4},r=function(e){return n[e]||-1},o=t.logLevel,i=r(o);function s(e){for(var t,n=arguments.length,a=new Array(n>1?n-1:0),o=1;o<n;o++)a[o-1]=arguments[o];r(e)>=i&&(t=console)[e].apply(t,a)}return s.warn=a()(s).call(s,null,\"warn\"),s.error=a()(s).call(s,null,\"error\"),s.info=a()(s).call(s,null,\"info\"),s.debug=a()(s).call(s,null,\"debug\"),{rootInjects:{log:s}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"loaded\",(function(){return r}));var r=function(e,t){return function(){e.apply(void 0,arguments);var n=t.getConfigs().withCredentials;void 0!==n&&(t.fn.fetch.withCredentials=\"string\"==typeof n?\"true\"===n:!!n)}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"preauthorizeBasic\",(function(){return d})),n.d(t,\"preauthorizeApiKey\",(function(){return h}));var r=n(3),a=n.n(r),o=n(33),i=n.n(o),s=n(2),c=n.n(s),u=n(238),l=n(71),p=n(239),f=n(240);function d(e,t,n,r){var o,i=e.authActions.authorize,s=e.specSelectors,u=s.specJson,l=(0,s.isOAS3)()?[\"components\",\"securitySchemes\"]:[\"securityDefinitions\"],p=u().getIn(c()(o=[]).call(o,l,[t]));return p?i(a()({},t,{value:{username:n,password:r},schema:p.toJS()})):null}function h(e,t,n){var r,o=e.authActions.authorize,i=e.specSelectors,s=i.specJson,u=(0,i.isOAS3)()?[\"components\",\"securitySchemes\"]:[\"securityDefinitions\"],l=s().getIn(c()(r=[]).call(r,u,[t]));return l?o(a()({},t,{value:n,schema:l.toJS()})):null}t.default=function(){return{afterLoad:function(e){this.rootInjects=this.rootInjects||{},this.rootInjects.initOAuth=e.authActions.configureAuth,this.rootInjects.preauthorizeApiKey=i()(h).call(h,null,e),this.rootInjects.preauthorizeBasic=i()(d).call(d,null,e)},statePlugins:{auth:{reducers:u.default,actions:l,selectors:p},spec:{wrapActions:f}}}}},function(e,t,n){\"use strict\";n.r(t);var r,a=n(3),o=n.n(a),i=n(13),s=n.n(i),c=n(23),u=n.n(c),l=n(20),p=n.n(l),f=n(1),d=n(5),h=n(71);t.default=(r={},o()(r,h.SHOW_AUTH_POPUP,(function(e,t){var n=t.payload;return e.set(\"showDefinitions\",n)})),o()(r,h.AUTHORIZE,(function(e,t){var n,r=t.payload,a=Object(f.fromJS)(r),o=e.get(\"authorized\")||Object(f.Map)();return u()(n=a.entrySeq()).call(n,(function(t){var n=s()(t,2),r=n[0],a=n[1];if(!Object(d.s)(a.getIn))return e.set(\"authorized\",o);var i=a.getIn([\"schema\",\"type\"]);if(\"apiKey\"===i||\"http\"===i)o=o.set(r,a);else if(\"basic\"===i){var c=a.getIn([\"value\",\"username\"]),u=a.getIn([\"value\",\"password\"]);o=(o=o.setIn([r,\"value\"],{username:c,header:\"Basic \"+Object(d.a)(c+\":\"+u)})).setIn([r,\"schema\"],a.get(\"schema\"))}})),e.set(\"authorized\",o)})),o()(r,h.AUTHORIZE_OAUTH2,(function(e,t){var n,r=t.payload,a=r.auth,o=r.token;a.token=p()({},o),n=Object(f.fromJS)(a);var i=e.get(\"authorized\")||Object(f.Map)();return i=i.set(n.get(\"name\"),n),e.set(\"authorized\",i)})),o()(r,h.LOGOUT,(function(e,t){var n=t.payload,r=e.get(\"authorized\").withMutations((function(e){u()(n).call(n,(function(t){e.delete(t)}))}));return e.set(\"authorized\",r)})),o()(r,h.CONFIGURE_AUTH,(function(e,t){var n=t.payload;return e.set(\"configs\",n)})),o()(r,h.RESTORE_AUTHORIZATION,(function(e,t){var n=t.payload;return e.set(\"authorized\",Object(f.fromJS)(n.authorized))})),r)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"shownDefinitions\",(function(){return E})),n.d(t,\"definitionsToAuthorize\",(function(){return x})),n.d(t,\"getDefinitionsByNames\",(function(){return S})),n.d(t,\"definitionsForRequirements\",(function(){return w})),n.d(t,\"authorized\",(function(){return j})),n.d(t,\"isAuthorized\",(function(){return O})),n.d(t,\"getConfigs\",(function(){return C}));var r=n(13),a=n.n(r),o=n(23),i=n.n(o),s=n(12),c=n.n(s),u=n(64),l=n.n(u),p=n(17),f=n.n(p),d=n(4),h=n.n(d),m=n(15),v=n.n(m),g=n(16),y=n(1),b=function(e){return e},E=Object(g.createSelector)(b,(function(e){return e.get(\"showDefinitions\")})),x=Object(g.createSelector)(b,(function(){return function(e){var t,n=e.specSelectors.securityDefinitions()||Object(y.Map)({}),r=Object(y.List)();return i()(t=n.entrySeq()).call(t,(function(e){var t=a()(e,2),n=t[0],o=t[1],i=Object(y.Map)();i=i.set(n,o),r=r.push(i)})),r}})),S=function(e,t){return function(e){var n,r=e.specSelectors;console.warn(\"WARNING: getDefinitionsByNames is deprecated and will be removed in the next major version.\");var o=r.securityDefinitions(),s=Object(y.List)();return i()(n=t.valueSeq()).call(n,(function(e){var t,n=Object(y.Map)();i()(t=e.entrySeq()).call(t,(function(e){var t,r,s=a()(e,2),c=s[0],u=s[1],l=o.get(c);\"oauth2\"===l.get(\"type\")&&u.size&&(t=l.get(\"scopes\"),i()(r=t.keySeq()).call(r,(function(e){u.contains(e)||(t=t.delete(e))})),l=l.set(\"allowedScopes\",t));n=n.set(c,l)})),s=s.push(n)})),s}},w=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Object(y.List)();return function(e){var n=e.authSelectors.definitionsToAuthorize()||Object(y.List)();return c()(n).call(n,(function(e){return l()(t).call(t,(function(t){return t.get(e.keySeq().first())}))}))}},j=Object(g.createSelector)(b,(function(e){return e.get(\"authorized\")||Object(y.Map)()})),O=function(e,t){return function(e){var n,r=e.authSelectors.authorized();return y.List.isList(t)?!!c()(n=t.toJS()).call(n,(function(e){var t,n;return-1===f()(t=h()(n=v()(e)).call(n,(function(e){return!!r.get(e)}))).call(t,!1)})).length:null}},C=Object(g.createSelector)(b,(function(e){return e.get(\"configs\")}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"execute\",(function(){return o}));var r=n(24),a=n.n(r),o=function(e,t){var n=t.authSelectors,r=t.specSelectors;return function(t){var o=t.path,i=t.method,s=t.operation,c=t.extras,u={authorized:n.authorized()&&n.authorized().toJS(),definitions:r.securityDefinitions()&&r.securityDefinitions().toJS(),specSecurity:r.security()&&r.security().toJS()};return e(a()({path:o,method:i,operation:s,securities:u},c))}}},function(e,t,n){\"use strict\";n.r(t);var r=n(5);t.default=function(){return{fn:{shallowEqualKeys:r.G}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return v}));var r=n(20),a=n.n(r),o=n(79),i=n.n(o),s=n(2),c=n.n(s),u=n(17),l=n.n(u),p=n(30),f=n.n(p),d=n(16),h=n(1),m=n(25);function v(e){var t=e.fn;return{statePlugins:{spec:{actions:{download:function(e){return function(n){var r=n.errActions,o=n.specSelectors,s=n.specActions,u=n.getConfigs,l=t.fetch,p=u();function f(t){if(t instanceof Error||t.status>=400)return s.updateLoadingStatus(\"failed\"),r.newThrownErr(a()(new Error((t.message||t.statusText)+\" \"+e),{source:\"fetch\"})),void(!t.status&&t instanceof Error&&function(){try{var t;if(\"URL\"in m.a?t=new i.a(e):(t=document.createElement(\"a\")).href=e,\"https:\"!==t.protocol&&\"https:\"===m.a.location.protocol){var n=a()(new Error(\"Possible mixed-content issue? The page was loaded over https:// but a \".concat(t.protocol,\"// URL was specified. Check that you are not attempting to load mixed content.\")),{source:\"fetch\"});return void r.newThrownErr(n)}if(t.origin!==m.a.location.origin){var o,s=a()(new Error(c()(o=\"Possible cross-origin (CORS) issue? The URL origin (\".concat(t.origin,\") does not match the page (\")).call(o,m.a.location.origin,\"). Check the server returns the correct 'Access-Control-Allow-*' headers.\")),{source:\"fetch\"});r.newThrownErr(s)}}catch(e){return}}());s.updateLoadingStatus(\"success\"),s.updateSpec(t.text),o.url()!==e&&s.updateUrl(e)}e=e||o.url(),s.updateLoadingStatus(\"loading\"),r.clear({source:\"fetch\"}),l({url:e,loadSpec:!0,requestInterceptor:p.requestInterceptor||function(e){return e},responseInterceptor:p.responseInterceptor||function(e){return e},credentials:\"same-origin\",headers:{Accept:\"application/json,*/*\"}}).then(f,f)}},updateLoadingStatus:function(e){var t,n=[null,\"loading\",\"failed\",\"success\",\"failedConfig\"];-1===l()(n).call(n,e)&&console.error(c()(t=\"Error: \".concat(e,\" is not one of \")).call(t,f()(n)));return{type:\"spec_update_loading_status\",payload:e}}},reducers:{spec_update_loading_status:function(e,t){return\"string\"==typeof t.payload?e.set(\"loadingStatus\",t.payload):e}},selectors:{loadingStatus:Object(d.createSelector)((function(e){return e||Object(h.Map)()}),(function(e){return e.get(\"loadingStatus\")||null}))}}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"downloadConfig\",(function(){return a})),n.d(t,\"getConfigByUrl\",(function(){return o}));var r=n(134),a=function(e){return function(t){return(0,t.fn.fetch)(e)}},o=function(e,t){return function(n){var a=n.specActions;if(e)return a.downloadConfig(e).then(o,o);function o(n){n instanceof Error||n.status>=400?(a.updateLoadingStatus(\"failedConfig\"),a.updateLoadingStatus(\"failedConfig\"),a.updateUrl(\"\"),console.error(n.statusText+\" \"+e.url),t(null)):t(Object(r.parseYamlConfig)(n.text))}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"get\",(function(){return o}));var r=n(22),a=n.n(r),o=function(e,t){return e.getIn(a()(t)?t:[t])}},function(e,t,n){\"use strict\";n.r(t);var r,a=n(3),o=n.n(a),i=n(1),s=n(117);t.default=(r={},o()(r,s.UPDATE_CONFIGS,(function(e,t){return e.merge(Object(i.fromJS)(t.payload))})),o()(r,s.TOGGLE_CONFIGS,(function(e,t){var n=t.payload,r=e.get(n);return e.set(n,!r)})),r)},function(e,t,n){\"use strict\";n.r(t);var r=n(247),a=n(248),o=n(249);t.default=function(){return[r.default,{statePlugins:{configs:{wrapActions:{loaded:function(e,t){return function(){e.apply(void 0,arguments);var n=decodeURIComponent(window.location.hash);t.layoutActions.parseDeepLinkHash(n)}}}}},wrapComponents:{operation:a.default,OperationTag:o.default}}]}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"show\",(function(){return C})),n.d(t,\"scrollTo\",(function(){return _})),n.d(t,\"parseDeepLinkHash\",(function(){return A})),n.d(t,\"readyToScroll\",(function(){return k})),n.d(t,\"scrollToElement\",(function(){return I})),n.d(t,\"clearScrollTo\",(function(){return P}));var r,a=n(3),o=n.n(a),i=n(13),s=n.n(i),c=n(22),u=n.n(c),l=n(2),p=n.n(l),f=n(19),d=n.n(f),h=n(4),m=n.n(h),v=n(17),g=n.n(v),y=n(138),b=n(406),E=n.n(b),x=n(5),S=n(1),w=n.n(S),j=\"layout_scroll_to\",O=\"layout_clear_scroll\",C=function(e,t){var n=t.getConfigs,r=t.layoutSelectors;return function(){for(var t=arguments.length,a=new Array(t),o=0;o<t;o++)a[o]=arguments[o];if(e.apply(void 0,a),n().deepLinking)try{var i=a[0],c=a[1];i=u()(i)?i:[i];var l=r.urlHashArrayFromIsShownKey(i);if(!l.length)return;var f,d=s()(l,2),h=d[0],m=d[1];if(!c)return Object(y.setHash)(\"/\");if(2===l.length)Object(y.setHash)(Object(x.d)(p()(f=\"/\".concat(encodeURIComponent(h),\"/\")).call(f,encodeURIComponent(m))));else 1===l.length&&Object(y.setHash)(Object(x.d)(\"/\".concat(encodeURIComponent(h))))}catch(e){console.error(e)}}},_=function(e){return{type:j,payload:u()(e)?e:[e]}},A=function(e){return function(t){var n=t.layoutActions,r=t.layoutSelectors;if((0,t.getConfigs)().deepLinking&&e){var a,o=d()(e).call(e,1);\"!\"===o[0]&&(o=d()(o).call(o,1)),\"/\"===o[0]&&(o=d()(o).call(o,1));var i=m()(a=o.split(\"/\")).call(a,(function(e){return e||\"\"})),c=r.isShownKeyFromUrlHashArray(i),u=s()(c,3),l=u[0],p=u[1],f=void 0===p?\"\":p,h=u[2],v=void 0===h?\"\":h;if(\"operations\"===l){var y=r.isShownKeyFromUrlHashArray([f]);g()(f).call(f,\"_\")>-1&&(console.warn(\"Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead.\"),n.show(m()(y).call(y,(function(e){return e.replace(/_/g,\" \")})),!0)),n.show(y,!0)}(g()(f).call(f,\"_\")>-1||g()(v).call(v,\"_\")>-1)&&(console.warn(\"Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead.\"),n.show(m()(c).call(c,(function(e){return e.replace(/_/g,\" \")})),!0)),n.show(c,!0),n.scrollTo(c)}}},k=function(e,t){return function(n){var r=n.layoutSelectors.getScrollToKey();w.a.is(r,Object(S.fromJS)(e))&&(n.layoutActions.scrollToElement(t),n.layoutActions.clearScrollTo())}},I=function(e,t){return function(n){try{t=t||n.fn.getScrollParent(e),E.a.createScroller(t).to(e)}catch(e){console.error(e)}}},P=function(){return{type:O}};t.default={fn:{getScrollParent:function(e,t){var n=document.documentElement,r=getComputedStyle(e),a=\"absolute\"===r.position,o=t?/(auto|scroll|hidden)/:/(auto|scroll)/;if(\"fixed\"===r.position)return n;for(var i=e;i=i.parentElement;)if(r=getComputedStyle(i),(!a||\"static\"!==r.position)&&o.test(r.overflow+r.overflowY+r.overflowX))return i;return n}},statePlugins:{layout:{actions:{scrollToElement:I,scrollTo:_,clearScrollTo:P,readyToScroll:k,parseDeepLinkHash:A},selectors:{getScrollToKey:function(e){return e.get(\"scrollToKey\")},isShownKeyFromUrlHashArray:function(e,t){var n=s()(t,2),r=n[0],a=n[1];return a?[\"operations\",r,a]:r?[\"operations-tag\",r]:[]},urlHashArrayFromIsShownKey:function(e,t){var n=s()(t,3),r=n[0],a=n[1],o=n[2];return\"operations\"==r?[a,o]:\"operations-tag\"==r?[a]:[]}},reducers:(r={},o()(r,j,(function(e,t){return e.set(\"scrollToKey\",w.a.fromJS(t.payload))})),o()(r,O,(function(e){return e.delete(\"scrollToKey\")})),r),wrapActions:{show:C}}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(6),a=n.n(r),o=n(7),i=n.n(o),s=n(10),c=n.n(s),u=n(8),l=n.n(u),p=n(9),f=n.n(p),d=n(3),h=n.n(d),m=n(2),v=n.n(m),g=n(0),y=n.n(g);n(26);t.default=function(e,t){return function(n){l()(o,n);var r=f()(o);function o(){var e,n;a()(this,o);for(var i=arguments.length,s=new Array(i),u=0;u<i;u++)s[u]=arguments[u];return n=r.call.apply(r,v()(e=[this]).call(e,s)),h()(c()(n),\"onLoad\",(function(e){var r=n.props.operation,a=r.toObject(),o=a.tag,i=a.operationId,s=r.toObject().isShownKey;s=s||[\"operations\",o,i],t.layoutActions.readyToScroll(s,e)})),n}return i()(o,[{key:\"render\",value:function(){return y.a.createElement(\"span\",{ref:this.onLoad},y.a.createElement(e,this.props))}}]),o}(y.a.Component)}},function(e,t,n){\"use strict\";n.r(t);var r=n(6),a=n.n(r),o=n(7),i=n.n(o),s=n(10),c=n.n(s),u=n(8),l=n.n(u),p=n(9),f=n.n(p),d=n(3),h=n.n(d),m=n(2),v=n.n(m),g=n(0),y=n.n(g);n(11);t.default=function(e,t){return function(n){l()(o,n);var r=f()(o);function o(){var e,n;a()(this,o);for(var i=arguments.length,s=new Array(i),u=0;u<i;u++)s[u]=arguments[u];return n=r.call.apply(r,v()(e=[this]).call(e,s)),h()(c()(n),\"onLoad\",(function(e){var r=[\"operations-tag\",n.props.tag];t.layoutActions.readyToScroll(r,e)})),n}return i()(o,[{key:\"render\",value:function(){return y.a.createElement(\"span\",{ref:this.onLoad},y.a.createElement(e,this.props))}}]),o}(y.a.Component)}},function(e,t,n){\"use strict\";n.r(t);var r=n(251);t.default=function(){return{fn:{opsFilter:r.default}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(12),a=n.n(r),o=n(17),i=n.n(o);t.default=function(e,t){return a()(e).call(e,(function(e,n){return-1!==i()(n).call(n,t)}))}},function(e,t,n){\"use strict\";n.r(t);var r=n(175),a=n.n(r),o=!1;t.default=function(){return{statePlugins:{spec:{wrapActions:{updateSpec:function(e){return function(){return o=!0,e.apply(void 0,arguments)}},updateJsonSpec:function(e,t){return function(){var n=t.getConfigs().onComplete;return o&&\"function\"==typeof n&&(a()(n,0),o=!1),e.apply(void 0,arguments)}}}}}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(254),a=n(255),o=n(256),i=n(257),s=n(265),c=n(48),u=n(272),l=n(273);t.default=function(){return{components:i.default,wrapComponents:s.default,statePlugins:{spec:{wrapSelectors:r,selectors:o},auth:{wrapSelectors:a},oas3:{actions:c,reducers:l.default,selectors:u}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"definitions\",(function(){return d})),n.d(t,\"hasHost\",(function(){return h})),n.d(t,\"securityDefinitions\",(function(){return m})),n.d(t,\"host\",(function(){return v})),n.d(t,\"basePath\",(function(){return g})),n.d(t,\"consumes\",(function(){return y})),n.d(t,\"produces\",(function(){return b})),n.d(t,\"schemes\",(function(){return E})),n.d(t,\"servers\",(function(){return x})),n.d(t,\"isOAS3\",(function(){return S})),n.d(t,\"isSwagger2\",(function(){return w}));var r=n(16),a=n(77),o=n(1),i=n(32);function s(e){return function(t,n){return function(){var r=n.getSystem().specSelectors.specJson();return Object(i.isOAS3)(r)?e.apply(void 0,arguments):t.apply(void 0,arguments)}}}var c=function(e){return e||Object(o.Map)()},u=s(Object(r.createSelector)((function(){return null}))),l=Object(r.createSelector)(c,(function(e){return e.get(\"json\",Object(o.Map)())})),p=Object(r.createSelector)(c,(function(e){return e.get(\"resolved\",Object(o.Map)())})),f=function(e){var t=p(e);return t.count()<1&&(t=l(e)),t},d=s(Object(r.createSelector)(f,(function(e){var t=e.getIn([\"components\",\"schemas\"]);return o.Map.isMap(t)?t:Object(o.Map)()}))),h=s((function(e){return f(e).hasIn([\"servers\",0])})),m=s(Object(r.createSelector)(a.specJsonWithResolvedSubtrees,(function(e){return e.getIn([\"components\",\"securitySchemes\"])||null}))),v=u,g=u,y=u,b=u,E=u,x=s(Object(r.createSelector)(f,(function(e){return e.getIn([\"servers\"])||Object(o.Map)()}))),S=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return Object(i.isOAS3)(o.Map.isMap(e)?e:Object(o.Map)())}},w=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return Object(i.isSwagger2)(o.Map.isMap(e)?e:Object(o.Map)())}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"definitionsToAuthorize\",(function(){return b}));var r=n(3),a=n.n(r),o=n(13),i=n.n(o),s=n(2),c=n.n(s),u=n(23),l=n.n(u),p=n(12),f=n.n(p),d=n(28),h=n.n(d),m=n(16),v=n(1),g=n(32);var y,b=(y=Object(m.createSelector)((function(e){return e}),(function(e){return e.specSelectors.securityDefinitions()}),(function(e,t){var n,r=Object(v.List)();return t?(l()(n=t.entrySeq()).call(n,(function(e){var t,n=i()(e,2),o=n[0],s=n[1],c=s.get(\"type\");if(\"oauth2\"===c&&l()(t=s.get(\"flows\").entrySeq()).call(t,(function(e){var t=i()(e,2),n=t[0],c=t[1],u=Object(v.fromJS)({flow:n,authorizationUrl:c.get(\"authorizationUrl\"),tokenUrl:c.get(\"tokenUrl\"),scopes:c.get(\"scopes\"),type:s.get(\"type\"),description:s.get(\"description\")});r=r.push(new v.Map(a()({},o,f()(u).call(u,(function(e){return void 0!==e})))))})),\"http\"!==c&&\"apiKey\"!==c||(r=r.push(new v.Map(a()({},o,s)))),\"openIdConnect\"===c&&s.get(\"openIdConnectData\")){var u=s.get(\"openIdConnectData\"),p=u.get(\"grant_types_supported\")||[\"authorization_code\",\"implicit\"];l()(p).call(p,(function(e){var t,n=u.get(\"scopes_supported\")&&h()(t=u.get(\"scopes_supported\")).call(t,(function(e,t){return e.set(t,\"\")}),new v.Map),i=Object(v.fromJS)({flow:e,authorizationUrl:u.get(\"authorization_endpoint\"),tokenUrl:u.get(\"token_endpoint\"),scopes:n,type:\"oauth2\",openIdConnectUrl:s.get(\"openIdConnectUrl\")});r=r.push(new v.Map(a()({},o,f()(i).call(i,(function(e){return void 0!==e})))))}))}})),r):r})),function(e,t){return function(){for(var n=t.getSystem().specSelectors.specJson(),r=arguments.length,a=new Array(r),o=0;o<r;o++)a[o]=arguments[o];if(Object(g.isOAS3)(n)){var i,s=t.getState().getIn([\"spec\",\"resolvedSubtrees\",\"components\",\"securitySchemes\"]);return y.apply(void 0,c()(i=[t,s]).call(i,a))}return e.apply(void 0,a)}})},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"servers\",(function(){return l})),n.d(t,\"isSwagger2\",(function(){return p}));var r=n(16),a=n(1),o=n(32);var i,s=function(e){return e||Object(a.Map)()},c=Object(r.createSelector)(s,(function(e){return e.get(\"json\",Object(a.Map)())})),u=Object(r.createSelector)(s,(function(e){return e.get(\"resolved\",Object(a.Map)())})),l=(i=Object(r.createSelector)((function(e){var t=u(e);return t.count()<1&&(t=c(e)),t}),(function(e){return e.getIn([\"servers\"])||Object(a.Map)()})),function(){return function(e){var t=e.getSystem().specSelectors.specJson();if(Object(o.isOAS3)(t)){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];return i.apply(void 0,r)}return null}}),p=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return Object(o.isSwagger2)(e)}}},function(e,t,n){\"use strict\";n.r(t);var r=n(258),a=n(135),o=n(259),i=n(260),s=n(261),c=n(262),u=n(263),l=n(264);t.default={Callbacks:r.default,HttpAuth:u.default,RequestBody:a.default,Servers:i.default,ServersContainer:s.default,RequestBodyEditor:c.default,OperationServers:l.default,operationLink:o.default}},function(e,t,n){\"use strict\";n.r(t);var r=n(27),a=n.n(r),o=n(13),i=n.n(o),s=n(4),c=n.n(s),u=n(0),l=n.n(u),p=(n(11),n(26),n(1));t.default=function(e){var t,n=e.callbacks,r=e.getComponent,o=e.specPath,s=r(\"OperationContainer\",!0);if(!n)return l.a.createElement(\"span\",null,\"No callbacks\");var u=c()(t=n.entrySeq()).call(t,(function(t){var n,r=i()(t,2),u=r[0],f=r[1];return l.a.createElement(\"div\",{key:u},l.a.createElement(\"h2\",null,u),c()(n=f.entrySeq()).call(n,(function(t){var n,r=i()(t,2),f=r[0],d=r[1];return\"$$ref\"===f?null:l.a.createElement(\"div\",{key:f},c()(n=d.entrySeq()).call(n,(function(t){var n=i()(t,2),r=n[0],c=n[1];if(\"$$ref\"===r)return null;var d=Object(p.fromJS)({operation:c});return l.a.createElement(s,a()({},e,{op:d,key:r,tag:\"\",method:r,path:f,specPath:o.push(u,f,r),allowTryItOut:!1}))})))})))}));return l.a.createElement(\"div\",null,u)}},function(e,t,n){\"use strict\";n.r(t);var r=n(6),a=n.n(r),o=n(7),i=n.n(o),s=n(8),c=n.n(s),u=n(9),l=n.n(u),p=n(30),f=n.n(p),d=n(4),h=n.n(d),m=n(0),v=n.n(m),g=(n(11),n(26),function(e){c()(n,e);var t=l()(n);function n(){return a()(this,n),t.apply(this,arguments)}return i()(n,[{key:\"render\",value:function(){var e=this.props,t=e.link,n=e.name,r=(0,e.getComponent)(\"Markdown\",!0),a=t.get(\"operationId\")||t.get(\"operationRef\"),o=t.get(\"parameters\")&&t.get(\"parameters\").toJS(),i=t.get(\"description\");return v.a.createElement(\"div\",{className:\"operation-link\"},v.a.createElement(\"div\",{className:\"description\"},v.a.createElement(\"b\",null,v.a.createElement(\"code\",null,n)),i?v.a.createElement(r,{source:i}):null),v.a.createElement(\"pre\",null,\"Operation `\",a,\"`\",v.a.createElement(\"br\",null),v.a.createElement(\"br\",null),\"Parameters \",function(e,t){var n;if(\"string\"!=typeof t)return\"\";return h()(n=t.split(\"\\n\")).call(n,(function(t,n){return n>0?Array(e+1).join(\" \")+t:t})).join(\"\\n\")}(0,f()(o,null,2))||\"{}\",v.a.createElement(\"br\",null)))}}]),n}(m.Component));t.default=g},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return C}));var r=n(13),a=n.n(r),o=n(6),i=n.n(o),s=n(7),c=n.n(s),u=n(10),l=n.n(u),p=n(8),f=n.n(p),d=n(9),h=n.n(d),m=n(3),v=n.n(m),g=n(2),y=n.n(g),b=n(55),E=n.n(b),x=n(4),S=n.n(x),w=n(0),j=n.n(w),O=n(1),C=(n(11),n(26),function(e){f()(n,e);var t=h()(n);function n(){var e,r;i()(this,n);for(var a=arguments.length,o=new Array(a),s=0;s<a;s++)o[s]=arguments[s];return r=t.call.apply(t,y()(e=[this]).call(e,o)),v()(l()(r),\"onServerChange\",(function(e){r.setServer(e.target.value)})),v()(l()(r),\"onServerVariableValueChange\",(function(e){var t=r.props,n=t.setServerVariableValue,a=t.currentServer,o=e.target.getAttribute(\"data-variable\"),i=e.target.value;\"function\"==typeof n&&n({server:a,key:o,val:i})})),v()(l()(r),\"setServer\",(function(e){(0,r.props.setSelectedServer)(e)})),r}return c()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.servers;e.currentServer||this.setServer(t.first().get(\"url\"))}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.servers,n=e.setServerVariableValue,r=e.getServerVariable;if(this.props.currentServer!==e.currentServer||this.props.servers!==e.servers){var a=E()(t).call(t,(function(t){return t.get(\"url\")===e.currentServer}));if(!a)return this.setServer(t.first().get(\"url\"));var o=a.get(\"variables\")||Object(O.OrderedMap)();S()(o).call(o,(function(t,a){r(e.currentServer,a)||n({server:e.currentServer,key:a,val:t.get(\"default\")||\"\"})}))}}},{key:\"render\",value:function(){var e,t,n=this,r=this.props,o=r.servers,i=r.currentServer,s=r.getServerVariable,c=r.getEffectiveServerValue,u=(E()(o).call(o,(function(e){return e.get(\"url\")===i}))||Object(O.OrderedMap)()).get(\"variables\")||Object(O.OrderedMap)(),l=0!==u.size;return j.a.createElement(\"div\",{className:\"servers\"},j.a.createElement(\"label\",{htmlFor:\"servers\"},j.a.createElement(\"select\",{onChange:this.onServerChange,value:i},S()(e=o.valueSeq()).call(e,(function(e){return j.a.createElement(\"option\",{value:e.get(\"url\"),key:e.get(\"url\")},e.get(\"url\"),e.get(\"description\")&&\" - \".concat(e.get(\"description\")))})).toArray())),l?j.a.createElement(\"div\",null,j.a.createElement(\"div\",{className:\"computed-url\"},\"Computed URL:\",j.a.createElement(\"code\",null,c(i))),j.a.createElement(\"h4\",null,\"Server variables\"),j.a.createElement(\"table\",null,j.a.createElement(\"tbody\",null,S()(t=u.entrySeq()).call(t,(function(e){var t,r=a()(e,2),o=r[0],c=r[1];return j.a.createElement(\"tr\",{key:o},j.a.createElement(\"td\",null,o),j.a.createElement(\"td\",null,c.get(\"enum\")?j.a.createElement(\"select\",{\"data-variable\":o,onChange:n.onServerVariableValueChange},S()(t=c.get(\"enum\")).call(t,(function(e){return j.a.createElement(\"option\",{selected:e===s(i,o),key:e,value:e},e)}))):j.a.createElement(\"input\",{type:\"text\",value:s(i,o)||\"\",onChange:n.onServerVariableValueChange,\"data-variable\":o})))}))))):null)}}]),n}(j.a.Component))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return d}));var r=n(6),a=n.n(r),o=n(7),i=n.n(o),s=n(8),c=n.n(s),u=n(9),l=n.n(u),p=n(0),f=n.n(p),d=(n(11),function(e){c()(n,e);var t=l()(n);function n(){return a()(this,n),t.apply(this,arguments)}return i()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.oas3Selectors,r=e.oas3Actions,a=e.getComponent,o=t.servers(),i=a(\"Servers\");return o&&o.size?f.a.createElement(\"div\",null,f.a.createElement(\"span\",{className:\"servers-title\"},\"Servers\"),f.a.createElement(i,{servers:o,currentServer:n.selectedServer(),setSelectedServer:r.setSelectedServer,setServerVariableValue:r.setServerVariableValue,getServerVariable:n.serverVariableValue,getEffectiveServerValue:n.serverEffectiveValue})):null}}]),n}(f.a.Component))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return x}));var r=n(6),a=n.n(r),o=n(7),i=n.n(o),s=n(10),c=n.n(s),u=n(8),l=n.n(u),p=n(9),f=n.n(p),d=n(3),h=n.n(d),m=n(0),v=n.n(m),g=(n(11),n(54)),y=n.n(g),b=n(5),E=Function.prototype,x=function(e){l()(n,e);var t=f()(n);function n(e,r){var o;return a()(this,n),o=t.call(this,e,r),h()(c()(o),\"applyDefaultValue\",(function(e){var t=e||o.props,n=t.onChange,r=t.defaultValue;return o.setState({value:r}),n(r)})),h()(c()(o),\"onChange\",(function(e){o.props.onChange(Object(b.I)(e))})),h()(c()(o),\"onDomChange\",(function(e){var t=e.target.value;o.setState({value:t},(function(){return o.onChange(t)}))})),o.state={value:Object(b.I)(e.value)||e.defaultValue},e.onChange(e.value),o}return i()(n,[{key:\"componentWillReceiveProps\",value:function(e){this.props.value!==e.value&&e.value!==this.state.value&&this.setState({value:Object(b.I)(e.value)}),!e.value&&e.defaultValue&&this.state.value&&this.applyDefaultValue(e)}},{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.errors,r=this.state.value,a=n.size>0,o=t(\"TextArea\");return v.a.createElement(\"div\",{className:\"body-param\"},v.a.createElement(o,{className:y()(\"body-param__text\",{invalid:a}),title:n.size?n.join(\", \"):\"\",value:r,onChange:this.onDomChange}))}}]),n}(m.PureComponent);h()(x,\"defaultProps\",{onChange:E,userHasEditedBody:!1})},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return w}));var r=n(6),a=n.n(r),o=n(7),i=n.n(o),s=n(10),c=n.n(s),u=n(8),l=n.n(u),p=n(9),f=n.n(p),d=n(3),h=n.n(d),m=n(20),v=n.n(m),g=n(12),y=n.n(g),b=n(4),E=n.n(b),x=n(0),S=n.n(x),w=(n(11),function(e){l()(n,e);var t=f()(n);function n(e,r){var o;a()(this,n),o=t.call(this,e,r),h()(c()(o),\"onChange\",(function(e){var t=o.props.onChange,n=e.target,r=n.value,a=n.name,i=v()({},o.state.value);a?i[a]=r:i=r,o.setState({value:i},(function(){return t(o.state)}))}));var i=o.props,s=i.name,u=i.schema,l=o.getValue();return o.state={name:s,schema:u,value:l},o}return i()(n,[{key:\"getValue\",value:function(){var e=this.props,t=e.name,n=e.authorized;return n&&n.getIn([t,\"value\"])}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.schema,a=n.getComponent,o=n.errSelectors,i=n.name,s=a(\"Input\"),c=a(\"Row\"),u=a(\"Col\"),l=a(\"authError\"),p=a(\"Markdown\",!0),f=a(\"JumpToPath\",!0),d=(r.get(\"scheme\")||\"\").toLowerCase(),h=this.getValue(),m=y()(e=o.allErrors()).call(e,(function(e){return e.get(\"authId\")===i}));if(\"basic\"===d){var v,g=h?h.get(\"username\"):null;return S.a.createElement(\"div\",null,S.a.createElement(\"h4\",null,S.a.createElement(\"code\",null,i||r.get(\"name\")),\"  (http, Basic)\",S.a.createElement(f,{path:[\"securityDefinitions\",i]})),g&&S.a.createElement(\"h6\",null,\"Authorized\"),S.a.createElement(c,null,S.a.createElement(p,{source:r.get(\"description\")})),S.a.createElement(c,null,S.a.createElement(\"label\",null,\"Username:\"),g?S.a.createElement(\"code\",null,\" \",g,\" \"):S.a.createElement(u,null,S.a.createElement(s,{type:\"text\",required:\"required\",name:\"username\",onChange:this.onChange,autoFocus:!0}))),S.a.createElement(c,null,S.a.createElement(\"label\",null,\"Password:\"),g?S.a.createElement(\"code\",null,\" ****** \"):S.a.createElement(u,null,S.a.createElement(s,{autoComplete:\"new-password\",name:\"password\",type:\"password\",onChange:this.onChange}))),E()(v=m.valueSeq()).call(v,(function(e,t){return S.a.createElement(l,{error:e,key:t})})))}return\"bearer\"===d?S.a.createElement(\"div\",null,S.a.createElement(\"h4\",null,S.a.createElement(\"code\",null,i||r.get(\"name\")),\"  (http, Bearer)\",S.a.createElement(f,{path:[\"securityDefinitions\",i]})),h&&S.a.createElement(\"h6\",null,\"Authorized\"),S.a.createElement(c,null,S.a.createElement(p,{source:r.get(\"description\")})),S.a.createElement(c,null,S.a.createElement(\"label\",null,\"Value:\"),h?S.a.createElement(\"code\",null,\" ****** \"):S.a.createElement(u,null,S.a.createElement(s,{type:\"text\",onChange:this.onChange,autoFocus:!0}))),E()(t=m.valueSeq()).call(t,(function(e,t){return S.a.createElement(l,{error:e,key:t})}))):S.a.createElement(\"div\",null,S.a.createElement(\"em\",null,S.a.createElement(\"b\",null,i),\" HTTP authentication: unsupported scheme \",\"'\".concat(d,\"'\")))}}]),n}(S.a.Component))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return x}));var r=n(24),a=n.n(r),o=n(6),i=n.n(o),s=n(7),c=n.n(s),u=n(10),l=n.n(u),p=n(8),f=n.n(p),d=n(9),h=n.n(d),m=n(3),v=n.n(m),g=n(2),y=n.n(g),b=n(0),E=n.n(b),x=(n(11),n(26),function(e){f()(n,e);var t=h()(n);function n(){var e,r;i()(this,n);for(var o=arguments.length,s=new Array(o),c=0;c<o;c++)s[c]=arguments[c];return r=t.call.apply(t,y()(e=[this]).call(e,s)),v()(l()(r),\"setSelectedServer\",(function(e){var t,n=r.props,a=n.path,o=n.method;return r.forceUpdate(),r.props.setSelectedServer(e,y()(t=\"\".concat(a,\":\")).call(t,o))})),v()(l()(r),\"setServerVariableValue\",(function(e){var t,n=r.props,o=n.path,i=n.method;return r.forceUpdate(),r.props.setServerVariableValue(a()(a()({},e),{},{namespace:y()(t=\"\".concat(o,\":\")).call(t,i)}))})),v()(l()(r),\"getSelectedServer\",(function(){var e,t=r.props,n=t.path,a=t.method;return r.props.getSelectedServer(y()(e=\"\".concat(n,\":\")).call(e,a))})),v()(l()(r),\"getServerVariable\",(function(e,t){var n,a=r.props,o=a.path,i=a.method;return r.props.getServerVariable({namespace:y()(n=\"\".concat(o,\":\")).call(n,i),server:e},t)})),v()(l()(r),\"getEffectiveServerValue\",(function(e){var t,n=r.props,a=n.path,o=n.method;return r.props.getEffectiveServerValue({server:e,namespace:y()(t=\"\".concat(a,\":\")).call(t,o)})})),r}return c()(n,[{key:\"render\",value:function(){var e=this.props,t=e.operationServers,n=e.pathServers,r=e.getComponent;if(!t&&!n)return null;var a=r(\"Servers\"),o=t||n,i=t?\"operation\":\"path\";return E.a.createElement(\"div\",{className:\"opblock-section operation-servers\"},E.a.createElement(\"div\",{className:\"opblock-section-header\"},E.a.createElement(\"div\",{className:\"tab-header\"},E.a.createElement(\"h4\",{className:\"opblock-title\"},\"Servers\"))),E.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},E.a.createElement(\"h4\",{className:\"message\"},\"These \",i,\"-level options override the global server options.\"),E.a.createElement(a,{servers:o,currentServer:this.getSelectedServer(),setSelectedServer:this.setSelectedServer,setServerVariableValue:this.setServerVariableValue,getServerVariable:this.getServerVariable,getEffectiveServerValue:this.getEffectiveServerValue})))}}]),n}(E.a.Component))},function(e,t,n){\"use strict\";n.r(t);var r=n(266),a=n(267),o=n(268),i=n(269),s=n(270),c=n(271);t.default={Markdown:r.default,AuthItem:a.default,JsonSchema_string:c.default,VersionStamp:o.default,model:s.default,onlineValidatorBadge:i.default}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"Markdown\",(function(){return d}));var r=n(84),a=n.n(r),o=n(0),i=n.n(o),s=(n(11),n(54)),c=n.n(s),u=n(178),l=n(32),p=n(179),f=new u.Remarkable(\"commonmark\");f.block.ruler.enable([\"table\"]),f.set({linkTarget:\"_blank\"});var d=function(e){var t=e.source,n=e.className,r=void 0===n?\"\":n,o=e.getConfigs;if(\"string\"!=typeof t)return null;if(t){var s,u=o().useUnsafeMarkdown,l=f.render(t),d=Object(p.b)(l,{useUnsafeMarkdown:u});return\"string\"==typeof d&&(s=a()(d).call(d)),i.a.createElement(\"div\",{dangerouslySetInnerHTML:{__html:s},className:c()(r,\"renderedMarkdown\")})}return null};d.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}},t.default=Object(l.OAS3ComponentWrapFactory)(d)},function(e,t,n){\"use strict\";n.r(t);var r=n(47),a=n.n(r),o=n(0),i=n.n(o),s=n(32),c=[\"Ori\"];t.default=Object(s.OAS3ComponentWrapFactory)((function(e){var t=e.Ori,n=a()(e,c),r=n.schema,o=n.getComponent,s=n.errSelectors,u=n.authorized,l=n.onAuthChange,p=n.name,f=o(\"HttpAuth\");return\"http\"===r.get(\"type\")?i.a.createElement(f,{key:p,schema:r,name:p,errSelectors:s,authorized:u,getComponent:o,onChange:l}):i.a.createElement(t,n)}))},function(e,t,n){\"use strict\";n.r(t);var r=n(0),a=n.n(r),o=n(32);t.default=Object(o.OAS3ComponentWrapFactory)((function(e){var t=e.Ori;return a.a.createElement(\"span\",null,a.a.createElement(t,e),a.a.createElement(\"small\",{className:\"version-stamp\"},a.a.createElement(\"pre\",{className:\"version\"},\"OAS3\")))}))},function(e,t,n){\"use strict\";n.r(t);var r=n(32),a=n(176);t.default=Object(r.OAS3ComponentWrapFactory)(a.a)},function(e,t,n){\"use strict\";n.r(t);var r=n(27),a=n.n(r),o=n(6),i=n.n(o),s=n(7),c=n.n(s),u=n(8),l=n.n(u),p=n(9),f=n.n(p),d=n(0),h=n.n(d),m=(n(11),n(32)),v=n(177),g=function(e){l()(n,e);var t=f()(n);function n(){return i()(this,n),t.apply(this,arguments)}return c()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getConfigs,n=[\"model-box\"],r=null;return!0===e.schema.get(\"deprecated\")&&(n.push(\"deprecated\"),r=h.a.createElement(\"span\",{className:\"model-deprecated-warning\"},\"Deprecated:\")),h.a.createElement(\"div\",{className:n.join(\" \")},r,h.a.createElement(v.a,a()({},this.props,{getConfigs:t,depth:1,expandDepth:this.props.expandDepth||0})))}}]),n}(d.Component);t.default=Object(m.OAS3ComponentWrapFactory)(g)},function(e,t,n){\"use strict\";n.r(t);var r=n(47),a=n.n(r),o=n(0),i=n.n(o),s=n(32),c=[\"Ori\"];t.default=Object(s.OAS3ComponentWrapFactory)((function(e){var t=e.Ori,n=a()(e,c),r=n.schema,o=n.getComponent,s=n.errors,u=n.onChange,l=r&&r.get?r.get(\"format\"):null,p=r&&r.get?r.get(\"type\"):null,f=o(\"Input\");return p&&\"string\"===p&&l&&(\"binary\"===l||\"base64\"===l)?i.a.createElement(f,{type:\"file\",className:s.length?\"invalid\":\"\",title:s.length?s:\"\",onChange:function(e){u(e.target.files[0])},disabled:t.isDisabled}):i.a.createElement(t,n)}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"selectedServer\",(function(){return x})),n.d(t,\"requestBodyValue\",(function(){return S})),n.d(t,\"shouldRetainRequestBodyValue\",(function(){return w})),n.d(t,\"hasUserEditedBody\",(function(){return j})),n.d(t,\"requestBodyInclusionSetting\",(function(){return O})),n.d(t,\"requestBodyErrors\",(function(){return C})),n.d(t,\"activeExamplesMember\",(function(){return _})),n.d(t,\"requestContentType\",(function(){return A})),n.d(t,\"responseContentType\",(function(){return k})),n.d(t,\"serverVariableValue\",(function(){return I})),n.d(t,\"serverVariables\",(function(){return P})),n.d(t,\"serverEffectiveValue\",(function(){return T})),n.d(t,\"validateBeforeExecute\",(function(){return R})),n.d(t,\"validateShallowRequired\",(function(){return N}));var r=n(14),a=n.n(r),o=n(2),i=n.n(o),s=n(4),c=n.n(s),u=n(23),l=n.n(u),p=n(15),f=n.n(p),d=n(17),h=n.n(d),m=n(1),v=n(32),g=n(135),y=n(5);function b(e){return function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return function(t){var r=t.getSystem().specSelectors.specJson();return Object(v.isOAS3)(r)?e.apply(void 0,n):null}}}var E,x=b((function(e,t){var n=t?[t,\"selectedServer\"]:[\"selectedServer\"];return e.getIn(n)||\"\"})),S=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"bodyValue\"])||null})),w=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"retainBodyValue\"])||!1})),j=function(e,t,n){return function(e){var r=e.getSystem(),a=r.oas3Selectors,o=r.specSelectors,i=o.specJson();if(Object(v.isOAS3)(i)){var s=!1,c=a.requestContentType(t,n),u=a.requestBodyValue(t,n);if(m.Map.isMap(u)&&(u=Object(y.I)(u.mapEntries((function(e){return m.Map.isMap(e[1])?[e[0],e[1].get(\"value\")]:e})).toJS())),m.List.isList(u)&&(u=Object(y.I)(u)),c){var l=Object(g.getDefaultRequestBodyValue)(o.specResolvedSubtree([\"paths\",t,n,\"requestBody\"]),c,a.activeExamplesMember(t,n,\"requestBody\",\"requestBody\"));s=!!u&&u!==l}return s}return null}},O=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"bodyInclusion\"])||Object(m.Map)()})),C=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"errors\"])||null})),_=b((function(e,t,n,r,a){return e.getIn([\"examples\",t,n,r,a,\"activeExample\"])||null})),A=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"requestContentType\"])||null})),k=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"responseContentType\"])||null})),I=b((function(e,t,n){var r;if(\"string\"!=typeof t){var a=t.server,o=t.namespace;r=o?[o,\"serverVariableValues\",a,n]:[\"serverVariableValues\",a,n]}else{r=[\"serverVariableValues\",t,n]}return e.getIn(r)||null})),P=b((function(e,t){var n;if(\"string\"!=typeof t){var r=t.server,a=t.namespace;n=a?[a,\"serverVariableValues\",r]:[\"serverVariableValues\",r]}else{n=[\"serverVariableValues\",t]}return e.getIn(n)||Object(m.OrderedMap)()})),T=b((function(e,t){var n,r;if(\"string\"!=typeof t){var a=t.server,o=t.namespace;r=a,n=o?e.getIn([o,\"serverVariableValues\",r]):e.getIn([\"serverVariableValues\",r])}else r=t,n=e.getIn([\"serverVariableValues\",r]);n=n||Object(m.OrderedMap)();var i=r;return c()(n).call(n,(function(e,t){i=i.replace(new RegExp(\"{\".concat(t,\"}\"),\"g\"),e)})),i})),R=(E=function(e,t){return function(e,t){var n;return t=t||[],!!e.getIn(i()(n=[\"requestData\"]).call(n,a()(t),[\"bodyValue\"]))}(e,t)},function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){var n,r,o=e.getSystem().specSelectors.specJson(),s=i()(n=[]).call(n,t)[1]||[];return!o.getIn(i()(r=[\"paths\"]).call(r,a()(s),[\"requestBody\",\"required\"]))||E.apply(void 0,t)}}),N=function(e,t){var n,r=t.oas3RequiredRequestBodyContentType,a=t.oas3RequestContentType,o=t.oas3RequestBodyValue,i=[];if(!m.Map.isMap(o))return i;var s=[];return l()(n=f()(r.requestContentType)).call(n,(function(e){if(e===a){var t=r.requestContentType[e];l()(t).call(t,(function(e){h()(s).call(s,e)<0&&s.push(e)}))}})),l()(s).call(s,(function(e){o.getIn([e,\"value\"])||i.push(e)})),i}},function(e,t,n){\"use strict\";n.r(t);var r,a=n(3),o=n.n(a),i=n(289),s=n.n(i),c=n(13),u=n.n(c),l=n(102),p=n.n(l),f=n(19),d=n.n(f),h=n(23),m=n.n(h),v=n(28),g=n.n(v),y=n(1),b=n(48);t.default=(r={},o()(r,b.UPDATE_SELECTED_SERVER,(function(e,t){var n=t.payload,r=n.selectedServerUrl,a=n.namespace,o=a?[a,\"selectedServer\"]:[\"selectedServer\"];return e.setIn(o,r)})),o()(r,b.UPDATE_REQUEST_BODY_VALUE,(function(e,t){var n=t.payload,r=n.value,a=n.pathMethod,o=u()(a,2),i=o[0],c=o[1];if(!y.Map.isMap(r))return e.setIn([\"requestData\",i,c,\"bodyValue\"],r);var l,f=e.getIn([\"requestData\",i,c,\"bodyValue\"])||Object(y.Map)();y.Map.isMap(f)||(f=Object(y.Map)());var h=p()(r).call(r),v=s()(h),g=d()(v).call(v,0);return m()(g).call(g,(function(e){var t=r.getIn([e]);f.has(e)&&y.Map.isMap(t)||(l=f.setIn([e,\"value\"],t))})),e.setIn([\"requestData\",i,c,\"bodyValue\"],l)})),o()(r,b.UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG,(function(e,t){var n=t.payload,r=n.value,a=n.pathMethod,o=u()(a,2),i=o[0],s=o[1];return e.setIn([\"requestData\",i,s,\"retainBodyValue\"],r)})),o()(r,b.UPDATE_REQUEST_BODY_INCLUSION,(function(e,t){var n=t.payload,r=n.value,a=n.pathMethod,o=n.name,i=u()(a,2),s=i[0],c=i[1];return e.setIn([\"requestData\",s,c,\"bodyInclusion\",o],r)})),o()(r,b.UPDATE_ACTIVE_EXAMPLES_MEMBER,(function(e,t){var n=t.payload,r=n.name,a=n.pathMethod,o=n.contextType,i=n.contextName,s=u()(a,2),c=s[0],l=s[1];return e.setIn([\"examples\",c,l,o,i,\"activeExample\"],r)})),o()(r,b.UPDATE_REQUEST_CONTENT_TYPE,(function(e,t){var n=t.payload,r=n.value,a=n.pathMethod,o=u()(a,2),i=o[0],s=o[1];return e.setIn([\"requestData\",i,s,\"requestContentType\"],r)})),o()(r,b.UPDATE_RESPONSE_CONTENT_TYPE,(function(e,t){var n=t.payload,r=n.value,a=n.path,o=n.method;return e.setIn([\"requestData\",a,o,\"responseContentType\"],r)})),o()(r,b.UPDATE_SERVER_VARIABLE_VALUE,(function(e,t){var n=t.payload,r=n.server,a=n.namespace,o=n.key,i=n.val,s=a?[a,\"serverVariableValues\",r,o]:[\"serverVariableValues\",r,o];return e.setIn(s,i)})),o()(r,b.SET_REQUEST_BODY_VALIDATE_ERROR,(function(e,t){var n=t.payload,r=n.path,a=n.method,o=n.validationErrors,i=[];if(i.push(\"Required field is not provided\"),o.missingBodyValue)return e.setIn([\"requestData\",r,a,\"errors\"],Object(y.fromJS)(i));if(o.missingRequiredKeys&&o.missingRequiredKeys.length>0){var s=o.missingRequiredKeys;return e.updateIn([\"requestData\",r,a,\"bodyValue\"],Object(y.fromJS)({}),(function(e){return g()(s).call(s,(function(e,t){return e.setIn([t,\"errors\"],Object(y.fromJS)(i))}),e)}))}return console.warn(\"unexpected result: SET_REQUEST_BODY_VALIDATE_ERROR\"),e})),o()(r,b.CLEAR_REQUEST_BODY_VALIDATE_ERROR,(function(e,t){var n=t.payload,r=n.path,a=n.method,o=e.getIn([\"requestData\",r,a,\"bodyValue\"]);if(!y.Map.isMap(o))return e.setIn([\"requestData\",r,a,\"errors\"],Object(y.fromJS)([]));var i=p()(o).call(o),c=s()(i),u=d()(c).call(c,0);return u?e.updateIn([\"requestData\",r,a,\"bodyValue\"],Object(y.fromJS)({}),(function(e){return g()(u).call(u,(function(e,t){return e.setIn([t,\"errors\"],Object(y.fromJS)([]))}),e)})):e})),o()(r,b.CLEAR_REQUEST_BODY_VALUE,(function(e,t){var n=t.payload.pathMethod,r=u()(n,2),a=r[0],o=r[1],i=e.getIn([\"requestData\",a,o,\"bodyValue\"]);return i?y.Map.isMap(i)?e.setIn([\"requestData\",a,o,\"bodyValue\"],Object(y.Map)()):e.setIn([\"requestData\",a,o,\"bodyValue\"],\"\"):e})),r)},function(e,t,n){\"use strict\";n.r(t);var r,a=n(23),o=n.n(a),i=n(102),s=n.n(i),c=n(5),u=n(771),l={};o()(r=s()(u).call(u)).call(r,(function(e){if(\"./index.js\"!==e){var t=u(e);l[Object(c.D)(e)]=t.default?t.default:t}})),t.default=l},function(e,t,n){\"use strict\";n.r(t);var r={};n.r(r),n.d(r,\"path\",(function(){return cn})),n.d(r,\"query\",(function(){return un})),n.d(r,\"header\",(function(){return pn})),n.d(r,\"cookie\",(function(){return fn}));var a=n(2),o=n.n(a),i=n(65),s=n.n(i),c=n(35),u=n.n(c),l=n(44),p=n.n(l),f=n(18),d=n.n(f),h=n(13),m=n.n(h),v=n(29),g=n.n(v),y=n(69),b=n.n(y),E=n(169),x=n.n(E),S=n(30),w=n.n(S),j=n(4),O=n.n(j),C=n(15),_=n.n(C),A=n(170),k=n.n(A),I=n(12),P=n.n(I),T=(n(376),n(180)),R=n.n(T),N=n(63),M=n.n(N),q=n(171),D=n.n(q),B=n(101),L=n.n(B),U=n(172),V=n(283),z=n(14),F=n.n(z),J=n(19),W=n.n(J),H=n(172).Buffer,$=function(e){return\":/?#[]@!$&'()*+,;=\".indexOf(e)>-1},Y=function(e){return/^[a-z0-9\\-._~]+$/i.test(e)};function K(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=n.escape,a=arguments.length>2?arguments[2]:void 0;return\"number\"==typeof e&&(e=e.toString()),\"string\"==typeof e&&e.length&&r?a?JSON.parse(e):O()(t=F()(e)).call(t,(function(e){var t,n;return Y(e)||$(e)&&\"unsafe\"===r?e:O()(t=O()(n=H.from(e).toJSON().data||[]).call(n,(function(e){var t;return W()(t=\"0\".concat(e.toString(16).toUpperCase())).call(t,-2)}))).call(t,(function(e){return\"%\".concat(e)})).join(\"\")})).join(\"\"):e}function G(e){var t=e.value;return Array.isArray(t)?function(e){var t=e.key,n=e.value,r=e.style,a=e.explode,i=e.escape,s=function(e){return K(e,{escape:i})};if(\"simple\"===r)return O()(n).call(n,(function(e){return s(e)})).join(\",\");if(\"label\"===r)return\".\".concat(O()(n).call(n,(function(e){return s(e)})).join(\".\"));if(\"matrix\"===r)return O()(n).call(n,(function(e){return s(e)})).reduce((function(e,n){var r,i,s;return!e||a?o()(i=o()(s=\"\".concat(e||\"\",\";\")).call(s,t,\"=\")).call(i,n):o()(r=\"\".concat(e,\",\")).call(r,n)}),\"\");if(\"form\"===r){var c=a?\"&\".concat(t,\"=\"):\",\";return O()(n).call(n,(function(e){return s(e)})).join(c)}if(\"spaceDelimited\"===r){var u=a?\"\".concat(t,\"=\"):\"\";return O()(n).call(n,(function(e){return s(e)})).join(\" \".concat(u))}if(\"pipeDelimited\"===r){var l=a?\"\".concat(t,\"=\"):\"\";return O()(n).call(n,(function(e){return s(e)})).join(\"|\".concat(l))}return}(e):\"object\"===d()(t)?function(e){var t=e.key,n=e.value,r=e.style,a=e.explode,i=e.escape,s=function(e){return K(e,{escape:i})},c=_()(n);if(\"simple\"===r)return c.reduce((function(e,t){var r,i,c,u=s(n[t]),l=a?\"=\":\",\",p=e?\"\".concat(e,\",\"):\"\";return o()(r=o()(i=o()(c=\"\".concat(p)).call(c,t)).call(i,l)).call(r,u)}),\"\");if(\"label\"===r)return c.reduce((function(e,t){var r,i,c,u=s(n[t]),l=a?\"=\":\".\",p=e?\"\".concat(e,\".\"):\".\";return o()(r=o()(i=o()(c=\"\".concat(p)).call(c,t)).call(i,l)).call(r,u)}),\"\");if(\"matrix\"===r&&a)return c.reduce((function(e,t){var r,a,i=s(n[t]),c=e?\"\".concat(e,\";\"):\";\";return o()(r=o()(a=\"\".concat(c)).call(a,t,\"=\")).call(r,i)}),\"\");if(\"matrix\"===r)return c.reduce((function(e,r){var a,i,c=s(n[r]),u=e?\"\".concat(e,\",\"):\";\".concat(t,\"=\");return o()(a=o()(i=\"\".concat(u)).call(i,r,\",\")).call(a,c)}),\"\");if(\"form\"===r)return c.reduce((function(e,t){var r,i,c,u,l=s(n[t]),p=e?o()(r=\"\".concat(e)).call(r,a?\"&\":\",\"):\"\",f=a?\"=\":\",\";return o()(i=o()(c=o()(u=\"\".concat(p)).call(u,t)).call(c,f)).call(i,l)}),\"\");return}(e):function(e){var t,n=e.key,r=e.value,a=e.style,i=e.escape,s=function(e){return K(e,{escape:i})};if(\"simple\"===a)return s(r);if(\"label\"===a)return\".\".concat(s(r));if(\"matrix\"===a)return o()(t=\";\".concat(n,\"=\")).call(t,s(r));if(\"form\"===a)return s(r);if(\"deepObject\"===a)return s(r,{},!0);return}(e)}var Z=function(e,t){t.body=e},X={serializeRes:re,mergeInQueryOrForm:he};function Q(e){return ee.apply(this,arguments)}function ee(){return(ee=s()(u.a.mark((function e(t){var n,r,a,o,i,s=arguments;return u.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=s.length>1&&void 0!==s[1]?s[1]:{},\"object\"===d()(t)&&(t=(n=t).url),n.headers=n.headers||{},X.mergeInQueryOrForm(n),n.headers&&_()(n.headers).forEach((function(e){var t=n.headers[e];\"string\"==typeof t&&(n.headers[e]=t.replace(/\\n+/g,\" \"))})),!n.requestInterceptor){e.next=12;break}return e.next=8,n.requestInterceptor(n);case 8:if(e.t0=e.sent,e.t0){e.next=11;break}e.t0=n;case 11:n=e.t0;case 12:return r=n.headers[\"content-type\"]||n.headers[\"Content-Type\"],/multipart\\/form-data/i.test(r)&&n.body instanceof V.FormData&&(delete n.headers[\"content-type\"],delete n.headers[\"Content-Type\"]),e.prev=14,e.next=17,(n.userFetch||fetch)(n.url,n);case 17:return a=e.sent,e.next=20,X.serializeRes(a,t,n);case 20:if(a=e.sent,!n.responseInterceptor){e.next=28;break}return e.next=24,n.responseInterceptor(a);case 24:if(e.t1=e.sent,e.t1){e.next=27;break}e.t1=a;case 27:a=e.t1;case 28:e.next=39;break;case 30:if(e.prev=30,e.t2=e.catch(14),a){e.next=34;break}throw e.t2;case 34:throw(o=new Error(a.statusText||\"response status is \".concat(a.status))).status=a.status,o.statusCode=a.status,o.responseError=e.t2,o;case 39:if(a.ok){e.next=45;break}throw(i=new Error(a.statusText||\"response status is \".concat(a.status))).status=a.status,i.statusCode=a.status,i.response=a,i;case 45:return e.abrupt(\"return\",a);case 46:case\"end\":return e.stop()}}),e,null,[[14,30]])})))).apply(this,arguments)}var te=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\";return/(json|xml|yaml|text)\\b/.test(e)};function ne(e,t){return t&&(0===t.indexOf(\"application/json\")||t.indexOf(\"+json\")>0)?JSON.parse(e):M.a.load(e)}function re(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.loadSpec,a=void 0!==r&&r,o={ok:e.ok,url:e.url||t,status:e.status,statusText:e.statusText,headers:oe(e.headers)},i=o.headers[\"content-type\"],s=a||te(i),c=s?e.text:e.blob||e.buffer;return c.call(e).then((function(e){if(o.text=e,o.data=e,s)try{var t=ne(e,i);o.body=t,o.obj=t}catch(e){o.parseError=e}return o}))}function ae(e){return g()(e).call(e,\", \")?e.split(\", \"):e}function oe(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return L()(b()(e))?x()(b()(e).call(e)).reduce((function(e,t){var n=m()(t,2),r=n[0],a=n[1];return e[r]=ae(a),e}),{}):{}}function ie(e,t){return t||\"undefined\"==typeof navigator||(t=navigator),t&&\"ReactNative\"===t.product?!(!e||\"object\"!==d()(e)||\"string\"!=typeof e.uri):\"undefined\"!=typeof File&&e instanceof File||(\"undefined\"!=typeof Blob&&e instanceof Blob||(void 0!==U.Buffer&&e instanceof U.Buffer||null!==e&&\"object\"===d()(e)&&\"function\"==typeof e.pipe))}function se(e,t){return Array.isArray(e)&&e.some((function(e){return ie(e,t)}))}var ce={form:\",\",spaceDelimited:\"%20\",pipeDelimited:\"|\"},ue={csv:\",\",ssv:\"%20\",tsv:\"%09\",pipes:\"|\"};function le(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=t.collectionFormat,a=t.allowEmptyValue,o=t.serializationOption,i=t.encoding,s=\"object\"!==d()(t)||Array.isArray(t)?t:t.value,c=n?function(e){return e.toString()}:function(e){return encodeURIComponent(e)},u=c(e);if(void 0===s&&a)return[[u,\"\"]];if(ie(s)||se(s))return[[u,s]];if(o)return pe(e,s,n,o);if(i){if([d()(i.style),d()(i.explode),d()(i.allowReserved)].some((function(e){return\"undefined\"!==e})))return pe(e,s,n,D()(i,[\"style\",\"explode\",\"allowReserved\"]));if(i.contentType){if(\"application/json\"===i.contentType){var l=\"string\"==typeof s?s:w()(s);return[[u,c(l)]]}return[[u,c(s.toString())]]}return\"object\"!==d()(s)?[[u,c(s)]]:Array.isArray(s)&&s.every((function(e){return\"object\"!==d()(e)}))?[[u,O()(s).call(s,c).join(\",\")]]:[[u,c(w()(s))]]}return\"object\"!==d()(s)?[[u,c(s)]]:Array.isArray(s)?\"multi\"===r?[[u,O()(s).call(s,c)]]:[[u,O()(s).call(s,c).join(ue[r||\"csv\"])]]:[[u,\"\"]]}function pe(e,t,n,r){var a,i,s,c=r.style||\"form\",u=void 0===r.explode?\"form\"===c:r.explode,l=!n&&(r&&r.allowReserved?\"unsafe\":\"reserved\"),p=function(e){return K(e,{escape:l})},f=n?function(e){return e}:function(e){return K(e,{escape:l})};return\"object\"!==d()(t)?[[f(e),p(t)]]:Array.isArray(t)?u?[[f(e),O()(t).call(t,p)]]:[[f(e),O()(t).call(t,p).join(ce[c])]]:\"deepObject\"===c?O()(i=_()(t)).call(i,(function(n){var r;return[f(o()(r=\"\".concat(e,\"[\")).call(r,n,\"]\")),p(t[n])]})):u?O()(s=_()(t)).call(s,(function(e){return[f(e),p(t[e])]})):[[f(e),O()(a=_()(t)).call(a,(function(e){var n;return[o()(n=\"\".concat(f(e),\",\")).call(n,p(t[e]))]})).join(\",\")]]}function fe(e){return k()(e).reduce((function(e,t){var n,r=m()(t,2),a=r[0],o=r[1],i=p()(le(a,o,!0));try{for(i.s();!(n=i.n()).done;){var s=m()(n.value,2),c=s[0],u=s[1];if(Array.isArray(u)){var l,f=p()(u);try{for(f.s();!(l=f.n()).done;){var d=l.value;e.append(c,d)}}catch(e){f.e(e)}finally{f.f()}}else e.append(c,u)}}catch(e){i.e(e)}finally{i.f()}return e}),new V.FormData)}function de(e){var t=_()(e).reduce((function(t,n){var r,a=p()(le(n,e[n]));try{for(a.s();!(r=a.n()).done;){var o=m()(r.value,2),i=o[0],s=o[1];t[i]=s}}catch(e){a.e(e)}finally{a.f()}return t}),{});return R.a.stringify(t,{encode:!1,indices:!1})||\"\"}function he(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,n=void 0===t?\"\":t,r=e.query,a=e.form,o=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=P()(t).call(t,(function(e){return e})).join(\"&\");return r?\"?\".concat(r):\"\"};if(a){var i=_()(a).some((function(e){var t=a[e].value;return ie(t)||se(t)})),s=e.headers[\"content-type\"]||e.headers[\"Content-Type\"];if(i||/multipart\\/form-data/i.test(s)){var c=fe(e.form);Z(c,e)}else e.body=de(a);delete e.form}if(r){var u=n.split(\"?\"),l=m()(u,2),p=l[0],f=l[1],d=\"\";if(f){var h=R.a.parse(f),v=_()(r);v.forEach((function(e){return delete h[e]})),d=R.a.stringify(h,{encode:!0})}var g=o(d,de(r));e.url=p+g,delete e.query}return e}var me=n(24),ve=n.n(me),ge=n(6),ye=n.n(ge),be=n(7),Ee=n.n(be),xe=n(20),Se=n.n(xe),we=n(56),je=n.n(we),Oe=n(401),Ce=n.n(Oe),_e=n(165),Ae=n.n(_e),ke=n(284),Ie=n.n(ke),Pe=n(3),Te=n.n(Pe),Re=n(119),Ne=n(68),Me=n.n(Ne),qe=n(402),De=n.n(qe),Be={add:function(e,t){return{op:\"add\",path:e,value:t}},replace:Ue,remove:function(e){return{op:\"remove\",path:e}},merge:function(e,t){return{type:\"mutation\",op:\"merge\",path:e,value:t}},mergeDeep:function(e,t){return{type:\"mutation\",op:\"mergeDeep\",path:e,value:t}},context:function(e,t){return{type:\"context\",path:e,value:t}},getIn:function(e,t){return t.reduce((function(e,t){return void 0!==t&&e?e[t]:e}),e)},applyPatch:function(e,t,n){if(n=n||{},\"merge\"===(t=ve()(ve()({},t),{},{path:t.path&&Le(t.path)})).op){var r=Qe(e,t.path);Se()(r,t.value),Re.applyPatch(e,[Ue(t.path,r)])}else if(\"mergeDeep\"===t.op){var a=Qe(e,t.path);for(var i in t.value){var s=t.value[i],c=Array.isArray(s);if(c){var u=a[i]||[];a[i]=o()(u).call(u,s)}else if($e(s)&&!c){var l=ve()({},a[i]);for(var p in s){if(Object.prototype.hasOwnProperty.call(l,p)){l=Me()(De()(l),s);break}Se()(l,Te()({},p,s[p]))}a[i]=l}else a[i]=s}}else if(\"add\"===t.op&&\"\"===t.path&&$e(t.value)){var f=_()(t.value).reduce((function(e,n){return e.push({op:\"add\",path:\"/\".concat(Le(n)),value:t.value[n]}),e}),[]);Re.applyPatch(e,f)}else if(\"replace\"===t.op&&\"\"===t.path){var d=t.value;n.allowMetaPatches&&t.meta&&Ze(t)&&(Array.isArray(t.value)||$e(t.value))&&(d=ve()(ve()({},d),t.meta)),e=d}else if(Re.applyPatch(e,[t]),n.allowMetaPatches&&t.meta&&Ze(t)&&(Array.isArray(t.value)||$e(t.value))){var h=Qe(e,t.path),m=ve()(ve()({},h),t.meta);Re.applyPatch(e,[Ue(t.path,m)])}return e},parentPathMatch:function(e,t){if(!Array.isArray(t))return!1;for(var n=0,r=t.length;n<r;n+=1)if(t[n]!==e[n])return!1;return!0},flatten:We,fullyNormalizeArray:function(e){return He(We(Je(e)))},normalizeArray:Je,isPromise:function(e){return $e(e)&&Ye(e.then)},forEachNew:function(e,t){try{return Ve(e,Fe,t)}catch(e){return e}},forEachNewPrimitive:function(e,t){try{return Ve(e,ze,t)}catch(e){return e}},isJsonPatch:Ke,isContextPatch:function(e){return Xe(e)&&\"context\"===e.type},isPatch:Xe,isMutation:Ge,isAdditiveMutation:Ze,isGenerator:function(e){return\"[object GeneratorFunction]\"===Object.prototype.toString.call(e)},isFunction:Ye,isObject:$e,isError:function(e){return e instanceof Error}};function Le(e){return Array.isArray(e)?e.length<1?\"\":\"/\".concat(O()(e).call(e,(function(e){return(e+\"\").replace(/~/g,\"~0\").replace(/\\//g,\"~1\")})).join(\"/\")):e}function Ue(e,t,n){return{op:\"replace\",path:e,value:t,meta:n}}function Ve(e,t,n){var r;return He(We(O()(r=P()(e).call(e,Ze)).call(r,(function(e){return t(e.value,n,e.path)}))||[]))}function ze(e,t,n){return n=n||[],Array.isArray(e)?O()(e).call(e,(function(e,r){return ze(e,t,o()(n).call(n,r))})):$e(e)?O()(r=_()(e)).call(r,(function(r){return ze(e[r],t,o()(n).call(n,r))})):t(e,n[n.length-1],n);var r}function Fe(e,t,n){var r=[];if((n=n||[]).length>0){var a=t(e,n[n.length-1],n);a&&(r=o()(r).call(r,a))}if(Array.isArray(e)){var i=O()(e).call(e,(function(e,r){return Fe(e,t,o()(n).call(n,r))}));i&&(r=o()(r).call(r,i))}else if($e(e)){var s,c=O()(s=_()(e)).call(s,(function(r){return Fe(e[r],t,o()(n).call(n,r))}));c&&(r=o()(r).call(r,c))}return r=We(r)}function Je(e){return Array.isArray(e)?e:[e]}function We(e){var t;return o()(t=[]).apply(t,F()(O()(e).call(e,(function(e){return Array.isArray(e)?We(e):e}))))}function He(e){return P()(e).call(e,(function(e){return void 0!==e}))}function $e(e){return e&&\"object\"===d()(e)}function Ye(e){return e&&\"function\"==typeof e}function Ke(e){if(Xe(e)){var t=e.op;return\"add\"===t||\"remove\"===t||\"replace\"===t}return!1}function Ge(e){return Ke(e)||Xe(e)&&\"mutation\"===e.type}function Ze(e){return Ge(e)&&(\"add\"===e.op||\"replace\"===e.op||\"merge\"===e.op||\"mergeDeep\"===e.op)}function Xe(e){return e&&\"object\"===d()(e)}function Qe(e,t){try{return Re.getValueByPointer(e,t)}catch(e){return console.error(e),{}}}var et=n(403),tt=n.n(et),nt=n(285),rt=n.n(nt),at=n(70),ot=n.n(at);function it(e,t){function n(){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack;for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];this.message=n[0],t&&t.apply(this,n)}return n.prototype=new Error,n.prototype.name=e,n.prototype.constructor=n,n}var st=n(404),ct=n.n(st),ut=n(168),lt=n.n(ut),pt=[\"properties\"],ft=[\"properties\"],dt=[\"definitions\",\"parameters\",\"responses\",\"securityDefinitions\",\"components/schemas\",\"components/responses\",\"components/parameters\",\"components/securitySchemes\"],ht=[\"schema/example\",\"items/example\"];function mt(e){var t=e[e.length-1],n=e[e.length-2],r=e.join(\"/\");return pt.indexOf(t)>-1&&-1===ft.indexOf(n)||dt.indexOf(r)>-1||ht.some((function(e){return r.indexOf(e)>-1}))}function vt(e,t){var n,r=e.split(\"#\"),a=m()(r,2),i=a[0],s=a[1],c=ot.a.resolve(i||\"\",t||\"\");return s?o()(n=\"\".concat(c,\"#\")).call(n,s):c}var gt=\"application/json, application/yaml\",yt=new RegExp(\"^([a-z]+://|//)\",\"i\"),bt=it(\"JSONRefError\",(function(e,t,n){this.originalError=n,Se()(this,t||{})})),Et={},xt=new tt.a,St=[function(e){return\"paths\"===e[0]&&\"responses\"===e[3]&&\"examples\"===e[5]},function(e){return\"paths\"===e[0]&&\"responses\"===e[3]&&\"content\"===e[5]&&\"example\"===e[7]},function(e){return\"paths\"===e[0]&&\"responses\"===e[3]&&\"content\"===e[5]&&\"examples\"===e[7]&&\"value\"===e[9]},function(e){return\"paths\"===e[0]&&\"requestBody\"===e[3]&&\"content\"===e[4]&&\"example\"===e[6]},function(e){return\"paths\"===e[0]&&\"requestBody\"===e[3]&&\"content\"===e[4]&&\"examples\"===e[6]&&\"value\"===e[8]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"example\"===e[4]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"example\"===e[5]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"examples\"===e[4]&&\"value\"===e[6]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"examples\"===e[5]&&\"value\"===e[7]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"content\"===e[4]&&\"example\"===e[6]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"content\"===e[4]&&\"examples\"===e[6]&&\"value\"===e[8]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"content\"===e[4]&&\"example\"===e[7]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"content\"===e[5]&&\"examples\"===e[7]&&\"value\"===e[9]}],wt={key:\"$ref\",plugin:function(e,t,n,r){var a=r.getInstance(),i=W()(n).call(n,0,-1);if(!mt(i)&&(s=i,!St.some((function(e){return e(s)})))){var s,c=r.getContext(n).baseDoc;if(\"string\"!=typeof e)return new bt(\"$ref: must be a string (JSON-Ref)\",{$ref:e,baseDoc:c,fullPath:n});var u,l,p,f=At(e),d=f[0],h=f[1]||\"\";try{u=c||d?Ct(d,c):null}catch(t){return _t(t,{pointer:h,$ref:e,basePath:u,fullPath:n})}if(function(e,t,n,r){var a,i,s=xt.get(r);s||(s={},xt.set(r,s));var c=function(e){if(0===e.length)return\"\";return\"/\".concat(O()(e).call(e,Nt).join(\"/\"))}(n),u=o()(a=\"\".concat(t||\"<specmap-base>\",\"#\")).call(a,e),l=c.replace(/allOf\\/\\d+\\/?/g,\"\"),p=r.contextTree.get([]).baseDoc;if(t===p&&Mt(l,e))return!0;var f=\"\";if(n.some((function(e){var t;return f=o()(t=\"\".concat(f,\"/\")).call(t,Nt(e)),s[f]&&s[f].some((function(e){return Mt(e,u)||Mt(u,e)}))})))return!0;return void(s[l]=o()(i=s[l]||[]).call(i,u))}(h,u,i,r)&&!a.useCircularStructures){var m=vt(e,u);return e===m?null:Be.replace(n,m)}if(null==u?(p=Tt(h),void 0===(l=r.get(p))&&(l=new bt(\"Could not resolve reference: \".concat(e),{pointer:h,$ref:e,baseDoc:c,fullPath:n}))):l=null!=(l=kt(u,h)).__value?l.__value:l.catch((function(t){throw _t(t,{pointer:h,$ref:e,baseDoc:c,fullPath:n})})),l instanceof Error)return[Be.remove(n),l];var v=vt(e,u),g=Be.replace(i,l,{$$ref:v});if(u&&u!==c)return[g,Be.context(i,{baseDoc:u})];try{if(!function(e,t){var n=[e];return t.path.reduce((function(e,t){return n.push(e[t]),e[t]}),e),r(t.value);function r(e){return Be.isObject(e)&&(n.indexOf(e)>=0||_()(e).some((function(t){return r(e[t])})))}}(r.state,g)||a.useCircularStructures)return g}catch(e){return null}}}},jt=Se()(wt,{docCache:Et,absoluteify:Ct,clearCache:function(e){void 0!==e?delete Et[e]:_()(Et).forEach((function(e){delete Et[e]}))},JSONRefError:bt,wrapError:_t,getDoc:It,split:At,extractFromDoc:kt,fetchJSON:function(e){return fetch(e,{headers:{Accept:gt},loadSpec:!0}).then((function(e){return e.text()})).then((function(e){return M.a.load(e)}))},extract:Pt,jsonPointerToArray:Tt,unescapeJsonPointerToken:Rt}),Ot=jt;function Ct(e,t){if(!yt.test(e)){var n;if(!t)throw new bt(o()(n=\"Tried to resolve a relative URL, without having a basePath. path: '\".concat(e,\"' basePath: '\")).call(n,t,\"'\"));return ot.a.resolve(t,e)}return e}function _t(e,t){var n,r;e&&e.response&&e.response.body?n=o()(r=\"\".concat(e.response.body.code,\" \")).call(r,e.response.body.message):n=e.message;return new bt(\"Could not resolve reference: \".concat(n),t,e)}function At(e){return(e+\"\").split(\"#\")}function kt(e,t){var n=Et[e];if(n&&!Be.isPromise(n))try{var r=Pt(t,n);return Se()(je.a.resolve(r),{__value:r})}catch(e){return je.a.reject(e)}return It(e).then((function(e){return Pt(t,e)}))}function It(e){var t=Et[e];return t?Be.isPromise(t)?t:je.a.resolve(t):(Et[e]=jt.fetchJSON(e).then((function(t){return Et[e]=t,t})),Et[e])}function Pt(e,t){var n=Tt(e);if(n.length<1)return t;var r=Be.getIn(t,n);if(void 0===r)throw new bt(\"Could not resolve pointer: \".concat(e,\" does not exist in document\"),{pointer:e});return r}function Tt(e){var t;if(\"string\"!=typeof e)throw new TypeError(\"Expected a string, got a \".concat(d()(e)));return\"/\"===e[0]&&(e=e.substr(1)),\"\"===e?[]:O()(t=e.split(\"/\")).call(t,Rt)}function Rt(e){return\"string\"!=typeof e?e:rt.a.unescape(e.replace(/~1/g,\"/\").replace(/~0/g,\"~\"))}function Nt(e){return rt.a.escape(e.replace(/~/g,\"~0\").replace(/\\//g,\"~1\"))}function Mt(e,t){if(!(n=t)||\"/\"===n||\"#\"===n)return!0;var n,r=e.charAt(t.length),a=W()(t).call(t,-1);return 0===e.indexOf(t)&&(!r||\"/\"===r||\"#\"===r)&&\"#\"!==a}var qt=n(87),Dt=n.n(qt),Bt={key:\"allOf\",plugin:function(e,t,n,r,a){if(!a.meta||!a.meta.$$ref){var i=W()(n).call(n,0,-1);if(!mt(i)){if(!Array.isArray(e)){var s=new TypeError(\"allOf must be an array\");return s.fullPath=n,s}var c=!1,u=a.value;if(i.forEach((function(e){u&&(u=u[e])})),u=ve()({},u),!Dt()(u)){delete u.allOf;var l,p=[];if(p.push(r.replace(i,{})),e.forEach((function(e,t){if(!r.isObject(e)){if(c)return null;c=!0;var a=new TypeError(\"Elements in allOf must be objects\");return a.fullPath=n,p.push(a)}p.push(r.mergeDeep(i,e));var s=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.specmap,a=n.getBaseUrlForNodePath,i=void 0===a?function(e){var n;return r.getContext(o()(n=[]).call(n,F()(t),F()(e))).baseDoc}:a,s=n.targetKeys,c=void 0===s?[\"$ref\",\"$$ref\"]:s,u=[];return ct()(e).forEach((function(){if(g()(c).call(c,this.key)&&lt()(this.node)){var e=this.path,n=o()(t).call(t,this.path),a=vt(this.node,i(e));u.push(r.replace(n,a))}})),u}(e,W()(n).call(n,0,-1),{getBaseUrlForNodePath:function(e){var a;return r.getContext(o()(a=[]).call(a,F()(n),[t],F()(e))).baseDoc},specmap:r});p.push.apply(p,F()(s))})),p.push(r.mergeDeep(i,u)),!u.$$ref)p.push(r.remove(o()(l=[]).call(l,i,\"$$ref\")));return p}}}}},Lt={key:\"parameters\",plugin:function(e,t,n,r){if(Array.isArray(e)&&e.length){var a=Se()([],e),o=W()(n).call(n,0,-1),i=ve()({},Be.getIn(r.spec,o));return e.forEach((function(e,t){try{a[t].default=r.parameterMacro(i,e)}catch(e){var o=new Error(e);return o.fullPath=n,o}})),Be.replace(n,a)}return Be.replace(n,e)}},Ut={key:\"properties\",plugin:function(e,t,n,r){var a=ve()({},e);for(var o in e)try{a[o].default=r.modelPropertyMacro(a[o])}catch(e){var i=new Error(e);return i.fullPath=n,i}return Be.replace(n,a)}},Vt=function(){function e(t){ye()(this,e),this.root=zt(t||{})}return Ee()(e,[{key:\"set\",value:function(e,t){var n=this.getParent(e,!0);if(n){var r=e[e.length-1],a=n.children;a[r]?Ft(a[r],t,n):a[r]=zt(t,n)}else Ft(this.root,t,null)}},{key:\"get\",value:function(e){if((e=e||[]).length<1)return this.root.value;for(var t,n,r=this.root,a=0;a<e.length&&(n=e[a],(t=r.children)[n]);a+=1)r=t[n];return r&&r.protoValue}},{key:\"getParent\",value:function(e,t){return!e||e.length<1?null:e.length<2?this.root:W()(e).call(e,0,-1).reduce((function(e,n){if(!e)return e;var r=e.children;return!r[n]&&t&&(r[n]=zt(null,e)),r[n]}),this.root)}}]),e}();function zt(e,t){return Ft({children:{}},e,t)}function Ft(e,t,n){return e.value=t||{},e.protoValue=n?ve()(ve()({},n.protoValue),e.value):e.value,_()(e.children).forEach((function(t){var n=e.children[t];e.children[t]=Ft(n,n.value,e)})),e}var Jt=function(){function e(t){var n,r,a=this;ye()(this,e),Se()(this,{spec:\"\",debugLevel:\"info\",plugins:[],pluginHistory:{},errors:[],mutations:[],promisedPatches:[],state:{},patches:[],context:{},contextTree:new Vt,showDebug:!1,allPatches:[],pluginProp:\"specMap\",libMethods:Se()(Object.create(this),Be,{getInstance:function(){return a}}),allowMetaPatches:!1},t),this.get=this._get.bind(this),this.getContext=this._getContext.bind(this),this.hasRun=this._hasRun.bind(this),this.wrappedPlugins=P()(n=O()(r=this.plugins).call(r,this.wrapPlugin.bind(this))).call(n,Be.isFunction),this.patches.push(Be.add([],this.spec)),this.patches.push(Be.context([],this.context)),this.updatePatches(this.patches)}return Ee()(e,[{key:\"debug\",value:function(e){if(this.debugLevel===e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];(t=console).log.apply(t,r)}}},{key:\"verbose\",value:function(e){if(\"verbose\"===this.debugLevel){for(var t,n,r=arguments.length,a=new Array(r>1?r-1:0),i=1;i<r;i++)a[i-1]=arguments[i];(t=console).log.apply(t,o()(n=[\"[\".concat(e,\"]   \")]).call(n,a))}}},{key:\"wrapPlugin\",value:function(e,t){var n,r,a,i=this.pathDiscriminator,s=null;return e[this.pluginProp]?(s=e,n=e[this.pluginProp]):Be.isFunction(e)?n=e:Be.isObject(e)&&(r=e,a=function(e,t){return!Array.isArray(e)||e.every((function(e,n){return e===t[n]}))},n=u.a.mark((function e(t,n){var s,c,l,f,d,h;return u.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:h=function(e,t,l){var p,f,d,m,v,g,y,b,E,x,S,w,j;return u.a.wrap((function(s){for(;;)switch(s.prev=s.next){case 0:if(Be.isObject(e)){s.next=6;break}if(r.key!==t[t.length-1]){s.next=4;break}return s.next=4,r.plugin(e,r.key,t,n);case 4:s.next=30;break;case 6:p=t.length-1,f=t[p],d=t.indexOf(\"properties\"),m=\"properties\"===f&&p===d,v=n.allowMetaPatches&&c[e.$$ref],g=0,y=_()(e);case 12:if(!(g<y.length)){s.next=30;break}if(b=y[g],E=e[b],x=o()(t).call(t,b),S=Be.isObject(E),w=e.$$ref,v){s.next=22;break}if(!S){s.next=22;break}return n.allowMetaPatches&&w&&(c[w]=!0),s.delegateYield(h(E,x,l),\"t0\",22);case 22:if(m||b!==r.key){s.next=27;break}if(j=a(i,t),i&&!j){s.next=27;break}return s.next=27,r.plugin(E,b,x,n,l);case 27:g++,s.next=12;break;case 30:case\"end\":return s.stop()}}),s)},s=u.a.mark(h),c={},l=p()(P()(t).call(t,Be.isAdditiveMutation)),e.prev=4,l.s();case 6:if((f=l.n()).done){e.next=11;break}return d=f.value,e.delegateYield(h(d.value,d.path,d),\"t0\",9);case 9:e.next=6;break;case 11:e.next=16;break;case 13:e.prev=13,e.t1=e.catch(4),l.e(e.t1);case 16:return e.prev=16,l.f(),e.finish(16);case 19:case\"end\":return e.stop()}}),e,null,[[4,13,16,19]])}))),Se()(n.bind(s),{pluginName:e.name||t,isGenerator:Be.isGenerator(n)})}},{key:\"nextPlugin\",value:function(){var e=this;return Ae()(this.wrappedPlugins,(function(t){return e.getMutationsForPlugin(t).length>0}))}},{key:\"nextPromisedPatch\",value:function(){var e;if(this.promisedPatches.length>0)return je.a.race(O()(e=this.promisedPatches).call(e,(function(e){return e.value})))}},{key:\"getPluginHistory\",value:function(e){var t=this.constructor.getPluginName(e);return this.pluginHistory[t]||[]}},{key:\"getPluginRunCount\",value:function(e){return this.getPluginHistory(e).length}},{key:\"getPluginHistoryTip\",value:function(e){var t=this.getPluginHistory(e);return t&&t[t.length-1]||{}}},{key:\"getPluginMutationIndex\",value:function(e){var t=this.getPluginHistoryTip(e).mutationIndex;return\"number\"!=typeof t?-1:t}},{key:\"updatePluginHistory\",value:function(e,t){var n=this.constructor.getPluginName(e);this.pluginHistory[n]=this.pluginHistory[n]||[],this.pluginHistory[n].push(t)}},{key:\"updatePatches\",value:function(e){var t=this;Be.normalizeArray(e).forEach((function(e){if(e instanceof Error)t.errors.push(e);else try{if(!Be.isObject(e))return void t.debug(\"updatePatches\",\"Got a non-object patch\",e);if(t.showDebug&&t.allPatches.push(e),Be.isPromise(e.value))return t.promisedPatches.push(e),void t.promisedPatchThen(e);if(Be.isContextPatch(e))return void t.setContext(e.path,e.value);if(Be.isMutation(e))return void t.updateMutations(e)}catch(e){console.error(e),t.errors.push(e)}}))}},{key:\"updateMutations\",value:function(e){\"object\"===d()(e.value)&&!Array.isArray(e.value)&&this.allowMetaPatches&&(e.value=ve()({},e.value));var t=Be.applyPatch(this.state,e,{allowMetaPatches:this.allowMetaPatches});t&&(this.mutations.push(e),this.state=t)}},{key:\"removePromisedPatch\",value:function(e){var t,n=this.promisedPatches.indexOf(e);n<0?this.debug(\"Tried to remove a promisedPatch that isn't there!\"):Ce()(t=this.promisedPatches).call(t,n,1)}},{key:\"promisedPatchThen\",value:function(e){var t=this;return e.value=e.value.then((function(n){var r=ve()(ve()({},e),{},{value:n});t.removePromisedPatch(e),t.updatePatches(r)})).catch((function(n){t.removePromisedPatch(e),t.updatePatches(n)})),e.value}},{key:\"getMutations\",value:function(e,t){var n;return e=e||0,\"number\"!=typeof t&&(t=this.mutations.length),W()(n=this.mutations).call(n,e,t)}},{key:\"getCurrentMutations\",value:function(){return this.getMutationsForPlugin(this.getCurrentPlugin())}},{key:\"getMutationsForPlugin\",value:function(e){var t=this.getPluginMutationIndex(e);return this.getMutations(t+1)}},{key:\"getCurrentPlugin\",value:function(){return this.currentPlugin}},{key:\"getLib\",value:function(){return this.libMethods}},{key:\"_get\",value:function(e){return Be.getIn(this.state,e)}},{key:\"_getContext\",value:function(e){return this.contextTree.get(e)}},{key:\"setContext\",value:function(e,t){return this.contextTree.set(e,t)}},{key:\"_hasRun\",value:function(e){return this.getPluginRunCount(this.getCurrentPlugin())>(e||0)}},{key:\"dispatch\",value:function(){var e,t=this,n=this,r=this.nextPlugin();if(!r){var a=this.nextPromisedPatch();if(a)return a.then((function(){return t.dispatch()})).catch((function(){return t.dispatch()}));var i={spec:this.state,errors:this.errors};return this.showDebug&&(i.patches=this.allPatches),je.a.resolve(i)}if(n.pluginCount=n.pluginCount||{},n.pluginCount[r]=(n.pluginCount[r]||0)+1,n.pluginCount[r]>100)return je.a.resolve({spec:n.state,errors:o()(e=n.errors).call(e,new Error(\"We've reached a hard limit of \".concat(100,\" plugin runs\")))});if(r!==this.currentPlugin&&this.promisedPatches.length){var s,c=O()(s=this.promisedPatches).call(s,(function(e){return e.value}));return je.a.all(O()(c).call(c,(function(e){return e.then(Ie.a,Ie.a)}))).then((function(){return t.dispatch()}))}return function(){n.currentPlugin=r;var e=n.getCurrentMutations(),t=n.mutations.length-1;try{if(r.isGenerator){var a,o=p()(r(e,n.getLib()));try{for(o.s();!(a=o.n()).done;){u(a.value)}}catch(e){o.e(e)}finally{o.f()}}else{u(r(e,n.getLib()))}}catch(e){console.error(e),u([Se()(Object.create(e),{plugin:r})])}finally{n.updatePluginHistory(r,{mutationIndex:t})}return n.dispatch()}();function u(e){e&&(e=Be.fullyNormalizeArray(e),n.updatePatches(e,r))}}}],[{key:\"getPluginName\",value:function(e){return e.pluginName}},{key:\"getPatchesOfType\",value:function(e,t){return P()(e).call(e,t)}}]),e}();var Wt={refs:Ot,allOf:Bt,parameters:Lt,properties:Ut},Ht=n(51);function $t(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.requestInterceptor,r=t.responseInterceptor,a=e.withCredentials?\"include\":\"same-origin\";return function(t){return e({url:t,loadSpec:!0,requestInterceptor:n,responseInterceptor:r,headers:{Accept:gt},credentials:a}).then((function(e){return e.body}))}}function Yt(e){var t=e.fetch,n=e.spec,r=e.url,a=e.mode,o=e.allowMetaPatches,i=void 0===o||o,c=e.pathDiscriminator,l=e.modelPropertyMacro,p=e.parameterMacro,f=e.requestInterceptor,d=e.responseInterceptor,h=e.skipNormalization,m=e.useCircularStructures,v=e.http,g=e.baseDoc;return g=g||r,v=t||v||Q,n?y(n):$t(v,{requestInterceptor:f,responseInterceptor:d})(g).then(y);function y(e){g&&(Wt.refs.docCache[g]=e),Wt.refs.fetchJSON=$t(v,{requestInterceptor:f,responseInterceptor:d});var t,n=[Wt.refs];return\"function\"==typeof p&&n.push(Wt.parameters),\"function\"==typeof l&&n.push(Wt.properties),\"strict\"!==a&&n.push(Wt.allOf),(t={spec:e,context:{baseDoc:g},plugins:n,allowMetaPatches:i,pathDiscriminator:c,parameterMacro:p,modelPropertyMacro:l,useCircularStructures:m},new Jt(t).dispatch()).then(h?function(){var e=s()(u.a.mark((function e(t){return u.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt(\"return\",t);case 1:case\"end\":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}():Ht.d)}}var Kt=n(47),Gt=n.n(Kt),Zt=n(39),Xt=n.n(Zt),Qt=n(132),en=n.n(Qt),tn=n(45),nn=n.n(tn),rn=n(405),an=n.n(rn),on={body:function(e){var t=e.req,n=e.value;t.body=n},header:function(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{},void 0!==r&&(t.headers[n.name]=r)},query:function(e){var t=e.req,n=e.value,r=e.parameter;t.query=t.query||{},!1===n&&\"boolean\"===r.type&&(n=\"false\");0===n&&[\"number\",\"integer\"].indexOf(r.type)>-1&&(n=\"0\");if(n)t.query[r.name]={collectionFormat:r.collectionFormat,value:n};else if(r.allowEmptyValue&&void 0!==n){var a=r.name;t.query[a]=t.query[a]||{},t.query[a].allowEmptyValue=!0}},path:function(e){var t=e.req,n=e.value,r=e.parameter;t.url=t.url.split(\"{\".concat(r.name,\"}\")).join(encodeURIComponent(n))},formData:function(e){var t=e.req,n=e.value,r=e.parameter;(n||r.allowEmptyValue)&&(t.form=t.form||{},t.form[r.name]={value:n,allowEmptyValue:r.allowEmptyValue,collectionFormat:r.collectionFormat})}};function sn(e,t){return g()(t).call(t,\"application/json\")?\"string\"==typeof e?e:w()(e):e.toString()}function cn(e){var t=e.req,n=e.value,r=e.parameter,a=r.name,o=r.style,i=r.explode,s=r.content;if(s){var c=_()(s)[0];t.url=t.url.split(\"{\".concat(a,\"}\")).join(K(sn(n,c),{escape:!0}))}else{var u=G({key:r.name,value:n,style:o||\"simple\",explode:i||!1,escape:!0});t.url=t.url.split(\"{\".concat(a,\"}\")).join(u)}}function un(e){var t=e.req,n=e.value,r=e.parameter;if(t.query=t.query||{},r.content){var a=_()(r.content)[0];t.query[r.name]=sn(n,a)}else if(!1===n&&(n=\"false\"),0===n&&(n=\"0\"),n)t.query[r.name]={value:n,serializationOption:D()(r,[\"style\",\"explode\",\"allowReserved\"])};else if(r.allowEmptyValue&&void 0!==n){var o=r.name;t.query[o]=t.query[o]||{},t.query[o].allowEmptyValue=!0}}var ln=[\"accept\",\"authorization\",\"content-type\"];function pn(e){var t=e.req,n=e.parameter,r=e.value;if(t.headers=t.headers||{},!(ln.indexOf(n.name.toLowerCase())>-1))if(n.content){var a=_()(n.content)[0];t.headers[n.name]=sn(r,a)}else void 0!==r&&(t.headers[n.name]=G({key:n.name,value:r,style:n.style||\"simple\",explode:void 0!==n.explode&&n.explode,escape:!1}))}function fn(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{};var a=d()(r);if(n.content){var i,s=_()(n.content)[0];t.headers.Cookie=o()(i=\"\".concat(n.name,\"=\")).call(i,sn(r,s))}else if(\"undefined\"!==a){var c=\"object\"===a&&!Array.isArray(r)&&n.explode?\"\":\"\".concat(n.name,\"=\");t.headers.Cookie=c+G({key:n.name,value:r,escape:!1,style:n.style||\"form\",explode:void 0!==n.explode&&n.explode})}}var dn=n(173),hn=n.n(dn),mn=n(174),vn=n.n(mn);function gn(e,t){var n=e.operation,r=e.requestBody,a=e.securities,i=e.spec,s=e.attachContentTypeForEmptyPayload,c=e.requestContentType;t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,a=e.operation,i=void 0===a?{}:a,s=e.spec,c=hn()({},t),u=r.authorized,l=void 0===u?{}:u,p=i.security||s.security||[],f=l&&!!_()(l).length,d=Xt()(s,[\"components\",\"securitySchemes\"])||{};if(c.headers=c.headers||{},c.query=c.query||{},!_()(r).length||!f||!p||Array.isArray(i.security)&&!i.security.length)return t;return p.forEach((function(e){_()(e).forEach((function(e){var t=l[e],n=d[e];if(t){var r=t.value||t,a=n.type;if(t)if(\"apiKey\"===a)\"query\"===n.in&&(c.query[n.name]=r),\"header\"===n.in&&(c.headers[n.name]=r),\"cookie\"===n.in&&(c.cookies[n.name]=r);else if(\"http\"===a){if(/^basic$/i.test(n.scheme)){var i,s=r.username||\"\",u=r.password||\"\",p=vn()(o()(i=\"\".concat(s,\":\")).call(i,u));c.headers.Authorization=\"Basic \".concat(p)}/^bearer$/i.test(n.scheme)&&(c.headers.Authorization=\"Bearer \".concat(r))}else if(\"oauth2\"===a||\"openIdConnect\"===a){var f,h=t.token||{},m=h[n[\"x-tokenName\"]||\"access_token\"],v=h.token_type;v&&\"bearer\"!==v.toLowerCase()||(v=\"Bearer\"),c.headers.Authorization=o()(f=\"\".concat(v,\" \")).call(f,m)}}}))})),c}({request:t,securities:a,operation:n,spec:i});var u=n.requestBody||{},l=_()(u.content||{}),p=c&&l.indexOf(c)>-1;if(r||s){if(c&&p)t.headers[\"Content-Type\"]=c;else if(!c){var f=l[0];f&&(t.headers[\"Content-Type\"]=f,c=f)}}else c&&p&&(t.headers[\"Content-Type\"]=c);if(!e.responseContentType&&n.responses){var h,v=P()(h=k()(n.responses)).call(h,(function(e){var t=m()(e,2),n=t[0],r=t[1],a=parseInt(n,10);return a>=200&&a<300&&en()(r.content)})).reduce((function(e,t){var n=m()(t,2)[1];return o()(e).call(e,_()(n.content))}),[]);v.length>0&&(t.headers.accept=v.join(\", \"))}if(r)if(c){if(l.indexOf(c)>-1)if(\"application/x-www-form-urlencoded\"===c||\"multipart/form-data\"===c)if(\"object\"===d()(r)){var g=(u.content[c]||{}).encoding||{};t.form={},_()(r).forEach((function(e){t.form[e]={value:r[e],encoding:g[e]||{}}}))}else t.form=r;else t.body=r}else t.body=r;return t}function yn(e,t){var n,r,a=e.spec,i=e.operation,s=e.securities,c=e.requestContentType,u=e.responseContentType,l=e.attachContentTypeForEmptyPayload;if((t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,a=e.operation,i=void 0===a?{}:a,s=e.spec,c=hn()({},t),u=r.authorized,l=void 0===u?{}:u,p=r.specSecurity,f=void 0===p?[]:p,d=i.security||f,h=l&&!!_()(l).length,m=s.securityDefinitions;if(c.headers=c.headers||{},c.query=c.query||{},!_()(r).length||!h||!d||Array.isArray(i.security)&&!i.security.length)return t;return d.forEach((function(e){_()(e).forEach((function(e){var t=l[e];if(t){var n=t.token,r=t.value||t,a=m[e],i=a.type,s=a[\"x-tokenName\"]||\"access_token\",u=n&&n[s],p=n&&n.token_type;if(t)if(\"apiKey\"===i){var f=\"query\"===a.in?\"query\":\"headers\";c[f]=c[f]||{},c[f][a.name]=r}else if(\"basic\"===i)if(r.header)c.headers.authorization=r.header;else{var d,h=r.username||\"\",v=r.password||\"\";r.base64=vn()(o()(d=\"\".concat(h,\":\")).call(d,v)),c.headers.authorization=\"Basic \".concat(r.base64)}else if(\"oauth2\"===i&&u){var g;p=p&&\"bearer\"!==p.toLowerCase()?p:\"Bearer\",c.headers.authorization=o()(g=\"\".concat(p,\" \")).call(g,u)}}}))})),c}({request:t,securities:s,operation:i,spec:a})).body||t.form||l)if(c)t.headers[\"Content-Type\"]=c;else if(Array.isArray(i.consumes)){var p=m()(i.consumes,1);t.headers[\"Content-Type\"]=p[0]}else if(Array.isArray(a.consumes)){var f=m()(a.consumes,1);t.headers[\"Content-Type\"]=f[0]}else i.parameters&&P()(n=i.parameters).call(n,(function(e){return\"file\"===e.type})).length?t.headers[\"Content-Type\"]=\"multipart/form-data\":i.parameters&&P()(r=i.parameters).call(r,(function(e){return\"formData\"===e.in})).length&&(t.headers[\"Content-Type\"]=\"application/x-www-form-urlencoded\");else if(c){var d,h,v=i.parameters&&P()(d=i.parameters).call(d,(function(e){return\"body\"===e.in})).length>0,g=i.parameters&&P()(h=i.parameters).call(h,(function(e){return\"formData\"===e.in})).length>0;(v||g)&&(t.headers[\"Content-Type\"]=c)}return!u&&Array.isArray(i.produces)&&i.produces.length>0&&(t.headers.accept=i.produces.join(\", \")),t}var bn=[\"http\",\"fetch\",\"spec\",\"operationId\",\"pathName\",\"method\",\"parameters\",\"securities\"],En=function(e){return Array.isArray(e)?e:[]},xn=it(\"OperationNotFoundError\",(function(e,t,n){this.originalError=n,Se()(this,t||{})})),Sn={buildRequest:jn};function wn(e){var t=e.http,n=e.fetch,r=e.spec,a=e.operationId,o=e.pathName,i=e.method,s=e.parameters,c=e.securities,u=Gt()(e,bn),l=t||n||Q;o&&i&&!a&&(a=Object(Ht.c)(o,i));var p=Sn.buildRequest(ve()({spec:r,operationId:a,parameters:s,securities:c,http:l},u));return p.body&&(en()(p.body)||nn()(p.body))&&(p.body=w()(p.body)),l(p)}function jn(e){var t,n,a=e.spec,i=e.operationId,s=e.responseContentType,c=e.scheme,u=e.requestInterceptor,l=e.responseInterceptor,p=e.contextUrl,f=e.userFetch,d=e.server,h=e.serverVariables,v=e.http,g=e.parameters,y=e.parameterBuilders,b=Object(Ht.b)(a);y||(y=b?r:on);var E={url:\"\",credentials:v&&v.withCredentials?\"include\":\"same-origin\",headers:{},cookies:{}};u&&(E.requestInterceptor=u),l&&(E.responseInterceptor=l),f&&(E.userFetch=f);var x=Object(Ht.a)(a,i);if(!x)throw new xn(\"Operation \".concat(i,\" not found\"));var S,w=x.operation,j=void 0===w?{}:w,C=x.method,A=x.pathName;if(E.url+=(S={spec:a,scheme:c,contextUrl:p,server:d,serverVariables:h,pathName:A,method:C},Object(Ht.b)(S.spec)?function(e){var t=e.spec,n=e.pathName,r=e.method,a=e.server,i=e.contextUrl,s=e.serverVariables,c=void 0===s?{}:s,u=Xt()(t,[\"paths\",n,(r||\"\").toLowerCase(),\"servers\"])||Xt()(t,[\"paths\",n,\"servers\"])||Xt()(t,[\"servers\"]),l=\"\",p=null;if(a&&u&&u.length){var f=O()(u).call(u,(function(e){return e.url}));f.indexOf(a)>-1&&(l=a,p=u[f.indexOf(a)])}if(!l&&u&&u.length){l=u[0].url;var d=m()(u,1);p=d[0]}return l.indexOf(\"{\")>-1&&function(e){for(var t,n=[],r=/{([^}]+)}/g;t=r.exec(e);)n.push(t[1]);return n}(l).forEach((function(e){if(p.variables&&p.variables[e]){var t=p.variables[e],n=c[e]||t.default,r=new RegExp(\"{\".concat(e,\"}\"),\"g\");l=l.replace(r,n)}})),function(){var e,t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",a=n&&r?ot.a.parse(ot.a.resolve(r,n)):ot.a.parse(n),i=ot.a.parse(r),s=On(a.protocol)||On(i.protocol)||\"\",c=a.host||i.host,u=a.pathname||\"\";return\"/\"===(e=s&&c?o()(t=\"\".concat(s,\"://\")).call(t,c+u):u)[e.length-1]?W()(e).call(e,0,-1):e}(l,i)}(S):function(e){var t,n,r=e.spec,a=e.scheme,i=e.contextUrl,s=void 0===i?\"\":i,c=ot.a.parse(s),u=Array.isArray(r.schemes)?r.schemes[0]:null,l=a||u||On(c.protocol)||\"http\",p=r.host||c.host||\"\",f=r.basePath||\"\";return\"/\"===(t=l&&p?o()(n=\"\".concat(l,\"://\")).call(n,p+f):f)[t.length-1]?W()(t).call(t,0,-1):t}(S)),!i)return delete E.cookies,E;E.url+=A,E.method=\"\".concat(C).toUpperCase(),g=g||{};var k=a.paths[A]||{};s&&(E.headers.accept=s);var I=function(e){var t={};e.forEach((function(e){t[e.in]||(t[e.in]={}),t[e.in][e.name]=e}));var n=[];return _()(t).forEach((function(e){_()(t[e]).forEach((function(r){n.push(t[e][r])}))})),n}(o()(t=o()(n=[]).call(n,En(j.parameters))).call(t,En(k.parameters)));I.forEach((function(e){var t,n,r=y[e.in];if(\"body\"===e.in&&e.schema&&e.schema.properties&&(t=g),void 0===(t=e&&e.name&&g[e.name]))t=e&&e.name&&g[o()(n=\"\".concat(e.in,\".\")).call(n,e.name)];else if(function(e,t){return P()(t).call(t,(function(t){return t.name===e}))}(e.name,I).length>1){var i;console.warn(o()(i=\"Parameter '\".concat(e.name,\"' is ambiguous because the defined spec has more than one parameter with the name: '\")).call(i,e.name,\"' and the passed-in parameter values did not define an 'in' value.\"))}if(null!==t){if(void 0!==e.default&&void 0===t&&(t=e.default),void 0===t&&e.required&&!e.allowEmptyValue)throw new Error(\"Required parameter \".concat(e.name,\" is not provided\"));if(b&&e.schema&&\"object\"===e.schema.type&&\"string\"==typeof t)try{t=JSON.parse(t)}catch(e){throw new Error(\"Could not parse object parameter value string as JSON\")}r&&r({req:E,parameter:e,value:t,operation:j,spec:a})}}));var T=ve()(ve()({},e),{},{operation:j});if((E=b?gn(T,E):yn(T,E)).cookies&&_()(E.cookies).length){var R=_()(E.cookies).reduce((function(e,t){var n=E.cookies[t];return e+(e?\"&\":\"\")+an.a.serialize(t,n)}),\"\");E.headers.Cookie=R}return E.cookies&&delete E.cookies,he(E),E}var On=function(e){return e?e.replace(/\\W/g,\"\"):null};function Cn(e,t){return _n.apply(this,arguments)}function _n(){return(_n=s()(u.a.mark((function e(t,n){var r,a,o,i,s,c,l,p,f,d,h,m,v=arguments;return u.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=v.length>2&&void 0!==v[2]?v[2]:{},a=r.returnEntireTree,o=r.baseDoc,i=r.requestInterceptor,s=r.responseInterceptor,c=r.parameterMacro,l=r.modelPropertyMacro,p=r.useCircularStructures,f={pathDiscriminator:n,baseDoc:o,requestInterceptor:i,responseInterceptor:s,parameterMacro:c,modelPropertyMacro:l,useCircularStructures:p},d=Object(Ht.d)({spec:t}),h=d.spec,e.next=6,Yt(ve()(ve()({},f),{},{spec:h,allowMetaPatches:!0,skipNormalization:!0}));case 6:return m=e.sent,!a&&Array.isArray(n)&&n.length&&(m.spec=Xt()(m.spec,n)||null),e.abrupt(\"return\",m);case 9:case\"end\":return e.stop()}}),e)})))).apply(this,arguments)}var An=n(236);t.default=function(e){var t,n,r,a=e.configs,i=e.getConfigs;return{fn:{fetch:(t=Q,n=a.preFetch,r=a.postFetch,r=r||function(e){return e},n=n||function(e){return e},function(e){return\"string\"==typeof e&&(e={url:e}),X.mergeInQueryOrForm(e),e=n(e),r(t(e))}),buildRequest:jn,execute:wn,resolve:Yt,resolveSubtree:function(e,t,n){var r;if(void 0===n){var a=i();n={modelPropertyMacro:a.modelPropertyMacro,parameterMacro:a.parameterMacro,requestInterceptor:a.requestInterceptor,responseInterceptor:a.responseInterceptor}}for(var s=arguments.length,c=new Array(s>3?s-3:0),u=3;u<s;u++)c[u-3]=arguments[u];return Cn.apply(void 0,o()(r=[e,t,n]).call(r,c))},serializeRes:re,opId:Ht.e},statePlugins:{configs:{wrapActions:An}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return u}));var r=n(134),a=n(117),o=n(243),i=n(244),s=n(245),c={getLocalConfig:function(){return Object(r.parseYamlConfig)('---\\nurl: \"https://petstore.swagger.io/v2/swagger.json\"\\ndom_id: \"#swagger-ui\"\\nvalidatorUrl: \"https://validator.swagger.io/validator\"\\n')}};function u(){return{statePlugins:{spec:{actions:o,selectors:c},configs:{reducers:s.default,actions:a,selectors:i}}}}},function(e,t,n){var r=n(336),a=n(156),o=n(616),i=n(45),s=n(350);e.exports=function(e,t,n){var c=i(e)?r:o;return n&&s(e,t,n)&&(t=void 0),c(e,a(t,3))}},function(e,t){e.exports=require(\"memoizee\")},function(e,t,n){e.exports=n(664)},function(e,t,n){e.exports=n(669)},function(e,t,n){var r=n(365);e.exports=function(e,t,n){return null==e?e:r(e,t,n)}},function(e,t){e.exports=require(\"react-redux\")},function(e,t){e.exports=require(\"formdata-node\")},function(e,t){e.exports=function(){}},function(e,t){e.exports=require(\"querystring-browser\")},function(e,t,n){var r=n(745),a=n(327),o=n(347),i=n(76);e.exports=function(e,t,n){return e=i(e),n=null==n?0:r(o(n),0,e.length),t=a(t),e.slice(n,n+t.length)==t}},function(e,t,n){var r=n(76);e.exports=function(e){return r(e).toLowerCase()}},function(e,t){e.exports=require(\"react-debounce-input\")},function(e,t,n){var r=n(320),a=n(313),o=n(150),i=n(321);e.exports=function(e){return r(e)||a(e)||o(e)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";var r=n(21),a=n(34),o=n(121),i=n(42),s=n(53),c=n(60),u=n(122),l=n(184),p=n(123),f=n(37),d=n(106),h=f(\"isConcatSpreadable\"),m=9007199254740991,v=\"Maximum allowed index exceeded\",g=d>=51||!a((function(){var e=[];return e[h]=!1,e.concat()[0]!==e})),y=p(\"concat\"),b=function(e){if(!i(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:\"Array\",proto:!0,forced:!g||!y},{concat:function(e){var t,n,r,a,o,i=s(this),p=l(i,0),f=0;for(t=-1,r=arguments.length;t<r;t++)if(b(o=-1===t?i:arguments[t])){if(f+(a=c(o.length))>m)throw TypeError(v);for(n=0;n<a;n++,f++)n in o&&u(p,f,o[n])}else{if(f>=m)throw TypeError(v);u(p,f++,o)}return p.length=f,p}})},function(e,t,n){var r=n(43),a=n(34),o=n(183);e.exports=!r&&!a((function(){return 7!=Object.defineProperty(o(\"div\"),\"a\",{get:function(){return 7}}).a}))},function(e,t,n){var r=n(34),a=/#|\\.prototype\\./,o=function(e,t){var n=s[i(e)];return n==u||n!=c&&(\"function\"==typeof t?r(t):!!t)},i=o.normalize=function(e){return String(e).replace(a,\".\").toLowerCase()},s=o.data={},c=o.NATIVE=\"N\",u=o.POLYFILL=\"P\";e.exports=o},function(e,t,n){var r=n(187);e.exports=r&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator},function(e,t,n){\"use strict\";var r=n(21),a=n(36),o=n(61),i=n(81),s=n(43),c=n(187),u=n(293),l=n(34),p=n(49),f=n(121),d=n(42),h=n(46),m=n(53),v=n(57),g=n(143),y=n(88),b=n(92),E=n(124),x=n(192),S=n(418),w=n(193),j=n(104),O=n(59),C=n(141),_=n(58),A=n(93),k=n(185),I=n(146),P=n(125),T=n(144),R=n(37),N=n(194),M=n(40),q=n(82),D=n(67),B=n(73).forEach,L=I(\"hidden\"),U=\"Symbol\",V=R(\"toPrimitive\"),z=D.set,F=D.getterFor(U),J=Object.prototype,W=a.Symbol,H=o(\"JSON\",\"stringify\"),$=j.f,Y=O.f,K=S.f,G=C.f,Z=k(\"symbols\"),X=k(\"op-symbols\"),Q=k(\"string-to-symbol-registry\"),ee=k(\"symbol-to-string-registry\"),te=k(\"wks\"),ne=a.QObject,re=!ne||!ne.prototype||!ne.prototype.findChild,ae=s&&l((function(){return 7!=b(Y({},\"a\",{get:function(){return Y(this,\"a\",{value:7}).a}})).a}))?function(e,t,n){var r=$(J,t);r&&delete J[t],Y(e,t,n),r&&e!==J&&Y(J,t,r)}:Y,oe=function(e,t){var n=Z[e]=b(W.prototype);return z(n,{type:U,tag:e,description:t}),s||(n.description=t),n},ie=u?function(e){return\"symbol\"==typeof e}:function(e){return Object(e)instanceof W},se=function(e,t,n){e===J&&se(X,t,n),h(e);var r=g(t,!0);return h(n),p(Z,r)?(n.enumerable?(p(e,L)&&e[L][r]&&(e[L][r]=!1),n=b(n,{enumerable:y(0,!1)})):(p(e,L)||Y(e,L,y(1,{})),e[L][r]=!0),ae(e,r,n)):Y(e,r,n)},ce=function(e,t){h(e);var n=v(t),r=E(n).concat(fe(n));return B(r,(function(t){s&&!ue.call(n,t)||se(e,t,n[t])})),e},ue=function(e){var t=g(e,!0),n=G.call(this,t);return!(this===J&&p(Z,t)&&!p(X,t))&&(!(n||!p(this,t)||!p(Z,t)||p(this,L)&&this[L][t])||n)},le=function(e,t){var n=v(e),r=g(t,!0);if(n!==J||!p(Z,r)||p(X,r)){var a=$(n,r);return!a||!p(Z,r)||p(n,L)&&n[L][r]||(a.enumerable=!0),a}},pe=function(e){var t=K(v(e)),n=[];return B(t,(function(e){p(Z,e)||p(P,e)||n.push(e)})),n},fe=function(e){var t=e===J,n=K(t?X:v(e)),r=[];return B(n,(function(e){!p(Z,e)||t&&!p(J,e)||r.push(Z[e])})),r};(c||(A((W=function(){if(this instanceof W)throw TypeError(\"Symbol is not a constructor\");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=T(e),n=function(e){this===J&&n.call(X,e),p(this,L)&&p(this[L],t)&&(this[L][t]=!1),ae(this,t,y(1,e))};return s&&re&&ae(J,t,{configurable:!0,set:n}),oe(t,e)}).prototype,\"toString\",(function(){return F(this).tag})),A(W,\"withoutSetter\",(function(e){return oe(T(e),e)})),C.f=ue,O.f=se,j.f=le,x.f=S.f=pe,w.f=fe,N.f=function(e){return oe(R(e),e)},s&&(Y(W.prototype,\"description\",{configurable:!0,get:function(){return F(this).description}}),i||A(J,\"propertyIsEnumerable\",ue,{unsafe:!0}))),r({global:!0,wrap:!0,forced:!c,sham:!c},{Symbol:W}),B(E(te),(function(e){M(e)})),r({target:U,stat:!0,forced:!c},{for:function(e){var t=String(e);if(p(Q,t))return Q[t];var n=W(t);return Q[t]=n,ee[n]=t,n},keyFor:function(e){if(!ie(e))throw TypeError(e+\" is not a symbol\");if(p(ee,e))return ee[e]},useSetter:function(){re=!0},useSimple:function(){re=!1}}),r({target:\"Object\",stat:!0,forced:!c,sham:!s},{create:function(e,t){return void 0===t?b(e):ce(b(e),t)},defineProperty:se,defineProperties:ce,getOwnPropertyDescriptor:le}),r({target:\"Object\",stat:!0,forced:!c},{getOwnPropertyNames:pe,getOwnPropertySymbols:fe}),r({target:\"Object\",stat:!0,forced:l((function(){w.f(1)}))},{getOwnPropertySymbols:function(e){return w.f(m(e))}}),H)&&r({target:\"JSON\",stat:!0,forced:!c||l((function(){var e=W();return\"[null]\"!=H([e])||\"{}\"!=H({a:e})||\"{}\"!=H(Object(e))}))},{stringify:function(e,t,n){for(var r,a=[e],o=1;arguments.length>o;)a.push(arguments[o++]);if(r=t,(d(t)||void 0!==e)&&!ie(e))return f(t)||(t=function(e,t){if(\"function\"==typeof r&&(t=r.call(this,e,t)),!ie(t))return t}),a[1]=t,H.apply(null,a)}});W.prototype[V]||_(W.prototype,V,W.prototype.valueOf),q(W,U),P[L]=!0},function(e,t,n){var r=n(49),a=n(57),o=n(189).indexOf,i=n(125);e.exports=function(e,t){var n,s=a(e),c=0,u=[];for(n in s)!r(i,n)&&r(s,n)&&u.push(n);for(;t.length>c;)r(s,n=t[c++])&&(~o(u,n)||u.push(n));return u}},function(e,t,n){var r=n(61);e.exports=r(\"document\",\"documentElement\")},function(e,t,n){var r=n(36),a=n(298),o=r.WeakMap;e.exports=\"function\"==typeof o&&/native code/.test(a(o))},function(e,t,n){var r=n(186),a=Function.toString;\"function\"!=typeof r.inspectSource&&(r.inspectSource=function(e){return a.call(e)}),e.exports=r.inspectSource},function(e,t,n){n(40)(\"iterator\")},function(e,t,n){var r=n(105),a=n(89),o=function(e){return function(t,n){var o,i,s=String(a(t)),c=r(n),u=s.length;return c<0||c>=u?e?\"\":void 0:(o=s.charCodeAt(c))<55296||o>56319||c+1===u||(i=s.charCodeAt(c+1))<56320||i>57343?e?s.charAt(c):o:e?s.slice(c,c+2):i-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},function(e,t,n){\"use strict\";var r=n(302).IteratorPrototype,a=n(92),o=n(88),i=n(82),s=n(108),c=function(){return this};e.exports=function(e,t,n){var u=t+\" Iterator\";return e.prototype=a(r,{next:o(1,n)}),i(e,u,!1,!0),s[u]=c,e}},function(e,t,n){\"use strict\";var r,a,o,i=n(34),s=n(147),c=n(58),u=n(49),l=n(37),p=n(81),f=l(\"iterator\"),d=!1;[].keys&&(\"next\"in(o=[].keys())?(a=s(s(o)))!==Object.prototype&&(r=a):d=!0);var h=null==r||i((function(){var e={};return r[f].call(e)!==e}));h&&(r={}),p&&!h||u(r,f)||c(r,f,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:d}},function(e,t,n){var r=n(34);e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},function(e,t,n){var r=n(452),a=Array.prototype;e.exports=function(e){var t=e.filter;return e===a||e instanceof Array&&t===a.filter?r:t}},function(e,t,n){n(455);var r=n(31);e.exports=r.Object.keys},function(e,t,n){n(460);var r=n(31).Object,a=e.exports=function(e,t,n){return r.defineProperty(e,t,n)};r.defineProperty.sham&&(a.sham=!0)},function(e,t,n){\"use strict\";var r=n(66),a=n(42),o=[].slice,i={},s=function(e,t,n){if(!(t in i)){for(var r=[],a=0;a<t;a++)r[a]=\"a[\"+a+\"]\";i[t]=Function(\"C,a\",\"return new C(\"+r.join(\",\")+\")\")}return i[t](e,n)};e.exports=Function.bind||function(e){var t=r(this),n=o.call(arguments,1),i=function(){var r=n.concat(o.call(arguments));return this instanceof i?s(t,r.length,r):t.apply(e,r)};return a(t.prototype)&&(i.prototype=t.prototype),i}},function(e,t,n){n(466);var r=n(31);e.exports=r.Object.assign},function(e,t,n){\"use strict\";var r=n(43),a=n(34),o=n(124),i=n(193),s=n(141),c=n(53),u=n(142),l=Object.assign,p=Object.defineProperty;e.exports=!l||a((function(){if(r&&1!==l({b:1},l(p({},\"a\",{enumerable:!0,get:function(){p(this,\"b\",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),a=\"abcdefghijklmnopqrst\";return e[n]=7,a.split(\"\").forEach((function(e){t[e]=e})),7!=l({},e)[n]||o(l({},t)).join(\"\")!=a}))?function(e,t){for(var n=c(e),a=arguments.length,l=1,p=i.f,f=s.f;a>l;)for(var d,h=u(arguments[l++]),m=p?o(h).concat(p(h)):o(h),v=m.length,g=0;v>g;)d=m[g++],r&&!f.call(h,d)||(n[d]=h[d]);return n}:l},function(e,t,n){var r=n(468),a=Array.prototype;e.exports=function(e){var t=e.slice;return e===a||e instanceof Array&&t===a.slice?r:t}},function(e,t,n){n(471);var r=n(31);e.exports=r.Array.isArray},function(e,t){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(140),a=n(200),o=n(314);e.exports=function(e){if(void 0!==r&&null!=a(e)||null!=e[\"@@iterator\"])return o(e)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(488)},function(e,t,n){n(107),n(489);var r=n(31);e.exports=r.Array.from},function(e,t,n){\"use strict\";var r=n(90),a=n(53),o=n(490),i=n(318),s=n(60),c=n(122),u=n(127);e.exports=function(e){var t,n,l,p,f,d,h=a(e),m=\"function\"==typeof this?this:Array,v=arguments.length,g=v>1?arguments[1]:void 0,y=void 0!==g,b=u(h),E=0;if(y&&(g=r(g,v>2?arguments[2]:void 0,2)),null==b||m==Array&&i(b))for(n=new m(t=s(h.length));t>E;E++)d=y?g(h[E],E):h[E],c(n,E,d);else for(f=(p=b.call(h)).next,n=new m;!(l=f.call(p)).done;E++)d=y?o(p,g,[l.value,E],!0):l.value,c(n,E,d);return n.length=E,n}},function(e,t,n){var r=n(46);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},function(e,t,n){var r=n(37),a=n(108),o=r(\"iterator\"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(a.Array===e||i[o]===e)}},function(e,t,n){var r=n(37)(\"iterator\"),a=!1;try{var o=0,i={next:function(){return{done:!!o++}},return:function(){a=!0}};i[r]=function(){return this},Array.from(i,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!a)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},function(e,t,n){var r=n(199);e.exports=function(e){if(r(e))return e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){n(74);var r=n(498),a=n(83),o=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.forEach;return e===o||e instanceof Array&&t===o.forEach||i.hasOwnProperty(a(e))?r:t}},function(e,t,n){var r=n(520);e.exports=function(e){if(r(e))throw TypeError(\"The method doesn't accept regular expressions\");return e}},function(e,t,n){var r=n(37)(\"match\");e.exports=function(e){var t=/./;try{\"/./\"[e](t)}catch(n){try{return t[r]=!1,\"/./\"[e](t)}catch(e){}}return!1}},function(e,t,n){var r=n(522),a=Array.prototype;e.exports=function(e){var t=e.indexOf;return e===a||e instanceof Array&&t===a.indexOf?r:t}},function(e,t){e.exports=\"\\t\\n\\v\\f\\r                　\\u2028\\u2029\\ufeff\"},function(e,t,n){var r=n(109),a=n(329),o=n(45),i=n(151),s=r?r.prototype:void 0,c=s?s.toString:void 0;e.exports=function e(t){if(\"string\"==typeof t)return t;if(o(t))return a(t,e)+\"\";if(i(t))return c?c.call(t):\"\";var n=t+\"\";return\"0\"==n&&1/t==-Infinity?\"-0\":n}},function(e,t,n){(function(t){var n=\"object\"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(this,n(182))},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,a=Array(r);++n<r;)a[n]=t(e[n],n,e);return a}},function(e,t){e.exports=function(e,t,n){var r=-1,a=e.length;t<0&&(t=-t>a?0:a+t),(n=n>a?a:n)<0&&(n+=a),a=t>n?0:n-t>>>0,t>>>=0;for(var o=Array(a);++r<a;)o[r]=e[r+t];return o}},function(e,t){var n=RegExp(\"[\\\\u200d\\\\ud800-\\\\udfff\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff\\\\ufe0e\\\\ufe0f]\");e.exports=function(e){return n.test(e)}},function(e,t){e.exports=function(e,t,n,r){var a=-1,o=null==e?0:e.length;for(r&&o&&(n=e[++a]);++a<o;)n=t(n,e[a],a,e);return n}},function(e,t){var n=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return n.call(e)}catch(e){}try{return e+\"\"}catch(e){}}return\"\"}},function(e,t,n){var r=n(583),a=n(75);e.exports=function e(t,n,o,i,s){return t===n||(null==t||null==n||!a(t)&&!a(n)?t!=t&&n!=n:r(t,n,o,i,e,s))}},function(e,t,n){var r=n(584),a=n(336),o=n(587);e.exports=function(e,t,n,i,s,c){var u=1&n,l=e.length,p=t.length;if(l!=p&&!(u&&p>l))return!1;var f=c.get(e),d=c.get(t);if(f&&d)return f==t&&d==e;var h=-1,m=!0,v=2&n?new r:void 0;for(c.set(e,t),c.set(t,e);++h<l;){var g=e[h],y=t[h];if(i)var b=u?i(y,g,h,t,e,c):i(g,y,h,e,t,c);if(void 0!==b){if(b)continue;m=!1;break}if(v){if(!a(t,(function(e,t){if(!o(v,t)&&(g===e||s(g,e,n,i,c)))return v.push(t)}))){m=!1;break}}else if(g!==y&&!s(g,y,n,i,c)){m=!1;break}}return c.delete(e),c.delete(t),m}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n<r;)if(t(e[n],n,e))return!0;return!1}},function(e,t,n){var r=n(62).Uint8Array;e.exports=r},function(e,t,n){var r=n(339),a=n(205),o=n(97);e.exports=function(e){return r(e,o,a)}},function(e,t,n){var r=n(204),a=n(45);e.exports=function(e,t,n){var o=t(e);return a(e)?o:r(o,n(e))}},function(e,t){e.exports=function(){return[]}},function(e,t,n){var r=n(593),a=n(157),o=n(45),i=n(158),s=n(159),c=n(207),u=Object.prototype.hasOwnProperty;e.exports=function(e,t){var n=o(e),l=!n&&a(e),p=!n&&!l&&i(e),f=!n&&!l&&!p&&c(e),d=n||l||p||f,h=d?r(e.length,String):[],m=h.length;for(var v in e)!t&&!u.call(e,v)||d&&(\"length\"==v||p&&(\"offset\"==v||\"parent\"==v)||f&&(\"buffer\"==v||\"byteLength\"==v||\"byteOffset\"==v)||s(v,m))||h.push(v);return h}},function(e,t,n){var r=n(128),a=n(597),o=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return a(e);var t=[];for(var n in Object(e))o.call(e,n)&&\"constructor\"!=n&&t.push(n);return t}},function(e,t){e.exports=function(e,t){return function(n){return e(t(n))}}},function(e,t,n){var r=n(50);e.exports=function(e){return e==e&&!r(e)}},function(e,t){e.exports=function(e,t){return function(n){return null!=n&&(n[e]===t&&(void 0!==t||e in Object(n)))}}},function(e,t,n){var r=n(606),a=n(607);e.exports=function(e,t){return null!=e&&a(e,t,r)}},function(e,t,n){var r=n(613);e.exports=function(e){var t=r(e),n=t%1;return t==t?n?t-n:t:0}},function(e,t,n){var r=n(614),a=n(50),o=n(151),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,c=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if(\"number\"==typeof e)return e;if(o(e))return NaN;if(a(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=a(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=r(e);var n=s.test(e);return n||c.test(e)?u(e.slice(2),n?2:8):i.test(e)?NaN:+e}},function(e,t,n){var r=n(617),a=n(620)(r);e.exports=a},function(e,t,n){var r=n(100),a=n(98),o=n(159),i=n(50);e.exports=function(e,t,n){if(!i(n))return!1;var s=typeof t;return!!(\"number\"==s?a(n)&&o(t,n.length):\"string\"==s&&t in n)&&r(n[t],e)}},function(e,t,n){e.exports=n(629)},function(e,t,n){e.exports=n(630)},function(e,t,n){e.exports=n(649)},function(e,t,n){n(355),n(145),n(653),n(362),n(363),n(658),n(107),n(74);var r=n(31);e.exports=r.Promise},function(e,t,n){\"use strict\";var r=n(21),a=n(147),o=n(148),i=n(92),s=n(58),c=n(88),u=n(99),l=function(e,t){var n=this;if(!(n instanceof l))return new l(e,t);o&&(n=o(new Error(void 0),a(n))),void 0!==t&&s(n,\"message\",String(t));var r=[];return u(e,r.push,{that:r}),s(n,\"errors\",r),n};l.prototype=i(Error.prototype,{constructor:c(5,l),message:c(5,\"\"),name:c(5,\"AggregateError\")}),r({global:!0},{AggregateError:l})},function(e,t,n){var r=n(36);e.exports=r.Promise},function(e,t,n){\"use strict\";var r=n(61),a=n(59),o=n(37),i=n(43),s=o(\"species\");e.exports=function(e){var t=r(e),n=a.f;i&&t&&!t[s]&&n(t,s,{configurable:!0,get:function(){return this}})}},function(e,t,n){var r=n(46),a=n(66),o=n(37)(\"species\");e.exports=function(e,t){var n,i=r(e).constructor;return void 0===i||null==(n=r(i)[o])?t:a(n)}},function(e,t,n){var r,a,o,i=n(36),s=n(34),c=n(90),u=n(296),l=n(183),p=n(360),f=n(149),d=i.location,h=i.setImmediate,m=i.clearImmediate,v=i.process,g=i.MessageChannel,y=i.Dispatch,b=0,E={},x=\"onreadystatechange\",S=function(e){if(E.hasOwnProperty(e)){var t=E[e];delete E[e],t()}},w=function(e){return function(){S(e)}},j=function(e){S(e.data)},O=function(e){i.postMessage(e+\"\",d.protocol+\"//\"+d.host)};h&&m||(h=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return E[++b]=function(){(\"function\"==typeof e?e:Function(e)).apply(void 0,t)},r(b),b},m=function(e){delete E[e]},f?r=function(e){v.nextTick(w(e))}:y&&y.now?r=function(e){y.now(w(e))}:g&&!p?(o=(a=new g).port2,a.port1.onmessage=j,r=c(o.postMessage,o,1)):i.addEventListener&&\"function\"==typeof postMessage&&!i.importScripts&&d&&\"file:\"!==d.protocol&&!s(O)?(r=O,i.addEventListener(\"message\",j,!1)):r=x in l(\"script\")?function(e){u.appendChild(l(\"script\")).onreadystatechange=function(){u.removeChild(this),S(e)}}:function(e){setTimeout(w(e),0)}),e.exports={set:h,clear:m}},function(e,t,n){var r=n(91);e.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(r)},function(e,t,n){var r=n(46),a=n(42),o=n(131);e.exports=function(e,t){if(r(e),a(t)&&t.constructor===e)return t;var n=o.f(e);return(0,n.resolve)(t),n.promise}},function(e,t,n){\"use strict\";var r=n(21),a=n(66),o=n(131),i=n(161),s=n(99);r({target:\"Promise\",stat:!0},{allSettled:function(e){var t=this,n=o.f(t),r=n.resolve,c=n.reject,u=i((function(){var n=a(t.resolve),o=[],i=0,c=1;s(e,(function(e){var a=i++,s=!1;o.push(void 0),c++,n.call(t,e).then((function(e){s||(s=!0,o[a]={status:\"fulfilled\",value:e},--c||r(o))}),(function(e){s||(s=!0,o[a]={status:\"rejected\",reason:e},--c||r(o))}))})),--c||r(o)}));return u.error&&c(u.value),n.promise}})},function(e,t,n){\"use strict\";var r=n(21),a=n(66),o=n(61),i=n(131),s=n(161),c=n(99),u=\"No one promise resolved\";r({target:\"Promise\",stat:!0},{any:function(e){var t=this,n=i.f(t),r=n.resolve,l=n.reject,p=s((function(){var n=a(t.resolve),i=[],s=0,p=1,f=!1;c(e,(function(e){var a=s++,c=!1;i.push(void 0),p++,n.call(t,e).then((function(e){c||f||(f=!0,r(e))}),(function(e){c||f||(c=!0,i[a]=e,--p||l(new(o(\"AggregateError\"))(i,u)))}))})),--p||l(new(o(\"AggregateError\"))(i,u))}));return p.error&&l(p.value),n.promise}})},function(e,t,n){var r=n(43),a=n(124),o=n(57),i=n(141).f,s=function(e){return function(t){for(var n,s=o(t),c=a(s),u=c.length,l=0,p=[];u>l;)n=c[l++],r&&!i.call(s,n)||p.push(e?[n,s[n]]:s[n]);return p}};e.exports={entries:s(!0),values:s(!1)}},function(e,t,n){var r=n(162),a=n(110),o=n(159),i=n(50),s=n(111);e.exports=function(e,t,n,c){if(!i(e))return e;for(var u=-1,l=(t=a(t,e)).length,p=l-1,f=e;null!=f&&++u<l;){var d=s(t[u]),h=n;if(\"__proto__\"===d||\"constructor\"===d||\"prototype\"===d)return e;if(u!=p){var m=f[d];void 0===(h=c?c(m,d,f):void 0)&&(h=i(m)?m:o(t[u+1])?[]:{})}r(f,d,h),f=f[d]}return e}},function(e,t,n){var r=n(367);e.exports=function(e,t,n){\"__proto__\"==t&&r?r(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}},function(e,t,n){var r=n(96),a=function(){try{var e=r(Object,\"defineProperty\");return e({},\"\",{}),e}catch(e){}}();e.exports=a},function(e,t,n){e.exports=n(680)},function(e,t,n){e.exports=n(683)},function(e,t,n){var r=n(203),a=n(693),o=n(162),i=n(694),s=n(695),c=n(698),u=n(699),l=n(700),p=n(701),f=n(338),d=n(372),h=n(129),m=n(702),v=n(703),g=n(708),y=n(45),b=n(158),E=n(710),x=n(50),S=n(712),w=n(97),j=n(213),O=\"[object Arguments]\",C=\"[object Function]\",_=\"[object Object]\",A={};A[O]=A[\"[object Array]\"]=A[\"[object ArrayBuffer]\"]=A[\"[object DataView]\"]=A[\"[object Boolean]\"]=A[\"[object Date]\"]=A[\"[object Float32Array]\"]=A[\"[object Float64Array]\"]=A[\"[object Int8Array]\"]=A[\"[object Int16Array]\"]=A[\"[object Int32Array]\"]=A[\"[object Map]\"]=A[\"[object Number]\"]=A[_]=A[\"[object RegExp]\"]=A[\"[object Set]\"]=A[\"[object String]\"]=A[\"[object Symbol]\"]=A[\"[object Uint8Array]\"]=A[\"[object Uint8ClampedArray]\"]=A[\"[object Uint16Array]\"]=A[\"[object Uint32Array]\"]=!0,A[\"[object Error]\"]=A[C]=A[\"[object WeakMap]\"]=!1,e.exports=function e(t,n,k,I,P,T){var R,N=1&n,M=2&n,q=4&n;if(k&&(R=P?k(t,I,P,T):k(t)),void 0!==R)return R;if(!x(t))return t;var D=y(t);if(D){if(R=m(t),!N)return u(t,R)}else{var B=h(t),L=B==C||\"[object GeneratorFunction]\"==B;if(b(t))return c(t,N);if(B==_||B==O||L&&!P){if(R=M||L?{}:g(t),!N)return M?p(t,s(R,t)):l(t,i(R,t))}else{if(!A[B])return P?t:{};R=v(t,B,N)}}T||(T=new r);var U=T.get(t);if(U)return U;T.set(t,R),S(t)?t.forEach((function(r){R.add(e(r,n,k,r,t,T))})):E(t)&&t.forEach((function(r,a){R.set(a,e(r,n,k,a,t,T))}));var V=D?void 0:(q?M?d:f:M?j:w)(t);return a(V||t,(function(r,a){V&&(r=t[a=r]),o(R,a,e(r,n,k,a,t,T))})),R}},function(e,t,n){var r=n(204),a=n(214),o=n(205),i=n(340),s=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)r(t,o(e)),e=a(e);return t}:i;e.exports=s},function(e,t,n){var r=n(339),a=n(371),o=n(213);e.exports=function(e){return r(e,o,a)}},function(e,t,n){var r=n(718),a=n(374),o=n(375);e.exports=function(e){return o(a(e,void 0,r),e+\"\")}},function(e,t,n){var r=n(721),a=Math.max;e.exports=function(e,t,n){return t=a(void 0===t?e.length-1:t,0),function(){for(var o=arguments,i=-1,s=a(o.length-t,0),c=Array(s);++i<s;)c[i]=o[t+i];i=-1;for(var u=Array(t+1);++i<t;)u[i]=o[i];return u[t]=n(c),r(e,this,u)}}},function(e,t,n){var r=n(722),a=n(724)(r);e.exports=a},function(e,t){!function(e){!function(t){var n=\"URLSearchParams\"in e,r=\"Symbol\"in e&&\"iterator\"in Symbol,a=\"FileReader\"in e&&\"Blob\"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),o=\"FormData\"in e,i=\"ArrayBuffer\"in e;if(i)var s=[\"[object Int8Array]\",\"[object Uint8Array]\",\"[object Uint8ClampedArray]\",\"[object Int16Array]\",\"[object Uint16Array]\",\"[object Int32Array]\",\"[object Uint32Array]\",\"[object Float32Array]\",\"[object Float64Array]\"],c=ArrayBuffer.isView||function(e){return e&&s.indexOf(Object.prototype.toString.call(e))>-1};function u(e){if(\"string\"!=typeof e&&(e=String(e)),/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(e))throw new TypeError(\"Invalid character in header field name\");return e.toLowerCase()}function l(e){return\"string\"!=typeof e&&(e=String(e)),e}function p(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return r&&(t[Symbol.iterator]=function(){return t}),t}function f(e){this.map={},e instanceof f?e.forEach((function(e,t){this.append(t,e)}),this):Array.isArray(e)?e.forEach((function(e){this.append(e[0],e[1])}),this):e&&Object.getOwnPropertyNames(e).forEach((function(t){this.append(t,e[t])}),this)}function d(e){if(e.bodyUsed)return Promise.reject(new TypeError(\"Already read\"));e.bodyUsed=!0}function h(e){return new Promise((function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}}))}function m(e){var t=new FileReader,n=h(t);return t.readAsArrayBuffer(e),n}function v(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function g(){return this.bodyUsed=!1,this._initBody=function(e){var t;this._bodyInit=e,e?\"string\"==typeof e?this._bodyText=e:a&&Blob.prototype.isPrototypeOf(e)?this._bodyBlob=e:o&&FormData.prototype.isPrototypeOf(e)?this._bodyFormData=e:n&&URLSearchParams.prototype.isPrototypeOf(e)?this._bodyText=e.toString():i&&a&&((t=e)&&DataView.prototype.isPrototypeOf(t))?(this._bodyArrayBuffer=v(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):i&&(ArrayBuffer.prototype.isPrototypeOf(e)||c(e))?this._bodyArrayBuffer=v(e):this._bodyText=e=Object.prototype.toString.call(e):this._bodyText=\"\",this.headers.get(\"content-type\")||(\"string\"==typeof e?this.headers.set(\"content-type\",\"text/plain;charset=UTF-8\"):this._bodyBlob&&this._bodyBlob.type?this.headers.set(\"content-type\",this._bodyBlob.type):n&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"))},a&&(this.blob=function(){var e=d(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error(\"could not read FormData body as blob\");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?d(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(m)}),this.text=function(){var e,t,n,r=d(this);if(r)return r;if(this._bodyBlob)return e=this._bodyBlob,t=new FileReader,n=h(t),t.readAsText(e),n;if(this._bodyArrayBuffer)return Promise.resolve(function(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join(\"\")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error(\"could not read FormData body as text\");return Promise.resolve(this._bodyText)},o&&(this.formData=function(){return this.text().then(E)}),this.json=function(){return this.text().then(JSON.parse)},this}f.prototype.append=function(e,t){e=u(e),t=l(t);var n=this.map[e];this.map[e]=n?n+\", \"+t:t},f.prototype.delete=function(e){delete this.map[u(e)]},f.prototype.get=function(e){return e=u(e),this.has(e)?this.map[e]:null},f.prototype.has=function(e){return this.map.hasOwnProperty(u(e))},f.prototype.set=function(e,t){this.map[u(e)]=l(t)},f.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},f.prototype.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),p(e)},f.prototype.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),p(e)},f.prototype.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),p(e)},r&&(f.prototype[Symbol.iterator]=f.prototype.entries);var y=[\"DELETE\",\"GET\",\"HEAD\",\"OPTIONS\",\"POST\",\"PUT\"];function b(e,t){var n,r,a=(t=t||{}).body;if(e instanceof b){if(e.bodyUsed)throw new TypeError(\"Already read\");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new f(e.headers)),this.method=e.method,this.mode=e.mode,this.signal=e.signal,a||null==e._bodyInit||(a=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||\"same-origin\",!t.headers&&this.headers||(this.headers=new f(t.headers)),this.method=(n=t.method||this.method||\"GET\",r=n.toUpperCase(),y.indexOf(r)>-1?r:n),this.mode=t.mode||this.mode||null,this.signal=t.signal||this.signal,this.referrer=null,(\"GET\"===this.method||\"HEAD\"===this.method)&&a)throw new TypeError(\"Body not allowed for GET or HEAD requests\");this._initBody(a)}function E(e){var t=new FormData;return e.trim().split(\"&\").forEach((function(e){if(e){var n=e.split(\"=\"),r=n.shift().replace(/\\+/g,\" \"),a=n.join(\"=\").replace(/\\+/g,\" \");t.append(decodeURIComponent(r),decodeURIComponent(a))}})),t}function x(e,t){t||(t={}),this.type=\"default\",this.status=void 0===t.status?200:t.status,this.ok=this.status>=200&&this.status<300,this.statusText=\"statusText\"in t?t.statusText:\"OK\",this.headers=new f(t.headers),this.url=t.url||\"\",this._initBody(e)}b.prototype.clone=function(){return new b(this,{body:this._bodyInit})},g.call(b.prototype),g.call(x.prototype),x.prototype.clone=function(){return new x(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new f(this.headers),url:this.url})},x.error=function(){var e=new x(null,{status:0,statusText:\"\"});return e.type=\"error\",e};var S=[301,302,303,307,308];x.redirect=function(e,t){if(-1===S.indexOf(t))throw new RangeError(\"Invalid status code\");return new x(null,{status:t,headers:{location:e}})},t.DOMException=e.DOMException;try{new t.DOMException}catch(e){t.DOMException=function(e,t){this.message=e,this.name=t;var n=Error(e);this.stack=n.stack},t.DOMException.prototype=Object.create(Error.prototype),t.DOMException.prototype.constructor=t.DOMException}function w(e,n){return new Promise((function(r,o){var i=new b(e,n);if(i.signal&&i.signal.aborted)return o(new t.DOMException(\"Aborted\",\"AbortError\"));var s=new XMLHttpRequest;function c(){s.abort()}s.onload=function(){var e,t,n={status:s.status,statusText:s.statusText,headers:(e=s.getAllResponseHeaders()||\"\",t=new f,e.replace(/\\r?\\n[\\t ]+/g,\" \").split(/\\r?\\n/).forEach((function(e){var n=e.split(\":\"),r=n.shift().trim();if(r){var a=n.join(\":\").trim();t.append(r,a)}})),t)};n.url=\"responseURL\"in s?s.responseURL:n.headers.get(\"X-Request-URL\");var a=\"response\"in s?s.response:s.responseText;r(new x(a,n))},s.onerror=function(){o(new TypeError(\"Network request failed\"))},s.ontimeout=function(){o(new TypeError(\"Network request failed\"))},s.onabort=function(){o(new t.DOMException(\"Aborted\",\"AbortError\"))},s.open(i.method,i.url,!0),\"include\"===i.credentials?s.withCredentials=!0:\"omit\"===i.credentials&&(s.withCredentials=!1),\"responseType\"in s&&a&&(s.responseType=\"blob\"),i.headers.forEach((function(e,t){s.setRequestHeader(t,e)})),i.signal&&(i.signal.addEventListener(\"abort\",c),s.onreadystatechange=function(){4===s.readyState&&i.signal.removeEventListener(\"abort\",c)}),s.send(void 0===i._bodyInit?null:i._bodyInit)}))}w.polyfill=!0,e.fetch||(e.fetch=w,e.Headers=f,e.Request=b,e.Response=x),t.Headers=f,t.Request=b,t.Response=x,t.fetch=w,Object.defineProperty(t,\"__esModule\",{value:!0})}({})}(\"undefined\"!=typeof self?self:this)},function(e,t,n){\"use strict\";var r=n(21),a=n(36),o=n(163),i=n(34),s=n(58),c=n(99),u=n(112),l=n(42),p=n(82),f=n(59).f,d=n(73).forEach,h=n(43),m=n(67),v=m.set,g=m.getterFor;e.exports=function(e,t,n){var m,y=-1!==e.indexOf(\"Map\"),b=-1!==e.indexOf(\"Weak\"),E=y?\"set\":\"add\",x=a[e],S=x&&x.prototype,w={};if(h&&\"function\"==typeof x&&(b||S.forEach&&!i((function(){(new x).entries().next()})))){m=t((function(t,n){v(u(t,m,e),{type:e,collection:new x}),null!=n&&c(n,t[E],{that:t,AS_ENTRIES:y})}));var j=g(e);d([\"add\",\"clear\",\"delete\",\"forEach\",\"get\",\"has\",\"set\",\"keys\",\"values\",\"entries\"],(function(e){var t=\"add\"==e||\"set\"==e;!(e in S)||b&&\"clear\"==e||s(m.prototype,e,(function(n,r){var a=j(this).collection;if(!t&&b&&!l(n))return\"get\"==e&&void 0;var o=a[e](0===n?0:n,r);return t?this:o}))})),b||f(m.prototype,\"size\",{configurable:!0,get:function(){return j(this).collection.size}})}else m=n.getConstructor(t,e,y,E),o.REQUIRED=!0;return p(m,e,!1,!0),w[e]=m,r({global:!0,forced:!0},w),b||n.setStrong(m,e,y),m}},function(e,t,n){var r=n(34),a=n(37),o=n(81),i=a(\"iterator\");e.exports=!r((function(){var e=new URL(\"b?a=1&b=2&c=3\",\"http://a\"),t=e.searchParams,n=\"\";return e.pathname=\"c%20d\",t.forEach((function(e,r){t.delete(\"b\"),n+=r+e})),o&&!e.toJSON||!t.sort||\"http://a/c%20d?a=1&c=3\"!==e.href||\"3\"!==t.get(\"c\")||\"a=1\"!==String(new URLSearchParams(\"?a=1\"))||!t[i]||\"a\"!==new URL(\"https://a@b\").username||\"b\"!==new URLSearchParams(new URLSearchParams(\"a=b\")).get(\"a\")||\"xn--e1aybc\"!==new URL(\"http://тест\").host||\"#%D0%B1\"!==new URL(\"http://a#б\").hash||\"a1c3\"!==n||\"x\"!==new URL(\"http://x\",void 0).host}))},function(e,t,n){\"use strict\";n(126);var r=n(21),a=n(61),o=n(378),i=n(93),s=n(130),c=n(82),u=n(301),l=n(67),p=n(112),f=n(49),d=n(90),h=n(83),m=n(46),v=n(42),g=n(92),y=n(88),b=n(752),E=n(127),x=n(37),S=a(\"fetch\"),w=a(\"Headers\"),j=x(\"iterator\"),O=\"URLSearchParams\",C=\"URLSearchParamsIterator\",_=l.set,A=l.getterFor(O),k=l.getterFor(C),I=/\\+/g,P=Array(4),T=function(e){return P[e-1]||(P[e-1]=RegExp(\"((?:%[\\\\da-f]{2}){\"+e+\"})\",\"gi\"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},N=function(e){var t=e.replace(I,\" \"),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(T(n--),R);return t}},M=/[!'()~]|%20/g,q={\"!\":\"%21\",\"'\":\"%27\",\"(\":\"%28\",\")\":\"%29\",\"~\":\"%7E\",\"%20\":\"+\"},D=function(e){return q[e]},B=function(e){return encodeURIComponent(e).replace(M,D)},L=function(e,t){if(t)for(var n,r,a=t.split(\"&\"),o=0;o<a.length;)(n=a[o++]).length&&(r=n.split(\"=\"),e.push({key:N(r.shift()),value:N(r.join(\"=\"))}))},U=function(e){this.entries.length=0,L(this.entries,e)},V=function(e,t){if(e<t)throw TypeError(\"Not enough arguments\")},z=u((function(e,t){_(this,{type:C,iterator:b(A(e).entries),kind:t})}),\"Iterator\",(function(){var e=k(this),t=e.kind,n=e.iterator.next(),r=n.value;return n.done||(n.value=\"keys\"===t?r.key:\"values\"===t?r.value:[r.key,r.value]),n})),F=function(){p(this,F,O);var e,t,n,r,a,o,i,s,c,u=arguments.length>0?arguments[0]:void 0,l=this,d=[];if(_(l,{type:O,entries:d,updateURL:function(){},updateSearchParams:U}),void 0!==u)if(v(u))if(\"function\"==typeof(e=E(u)))for(n=(t=e.call(u)).next;!(r=n.call(t)).done;){if((i=(o=(a=b(m(r.value))).next).call(a)).done||(s=o.call(a)).done||!o.call(a).done)throw TypeError(\"Expected sequence with length 2\");d.push({key:i.value+\"\",value:s.value+\"\"})}else for(c in u)f(u,c)&&d.push({key:c,value:u[c]+\"\"});else L(d,\"string\"==typeof u?\"?\"===u.charAt(0)?u.slice(1):u:u+\"\")},J=F.prototype;s(J,{append:function(e,t){V(arguments.length,2);var n=A(this);n.entries.push({key:e+\"\",value:t+\"\"}),n.updateURL()},delete:function(e){V(arguments.length,1);for(var t=A(this),n=t.entries,r=e+\"\",a=0;a<n.length;)n[a].key===r?n.splice(a,1):a++;t.updateURL()},get:function(e){V(arguments.length,1);for(var t=A(this).entries,n=e+\"\",r=0;r<t.length;r++)if(t[r].key===n)return t[r].value;return null},getAll:function(e){V(arguments.length,1);for(var t=A(this).entries,n=e+\"\",r=[],a=0;a<t.length;a++)t[a].key===n&&r.push(t[a].value);return r},has:function(e){V(arguments.length,1);for(var t=A(this).entries,n=e+\"\",r=0;r<t.length;)if(t[r++].key===n)return!0;return!1},set:function(e,t){V(arguments.length,1);for(var n,r=A(this),a=r.entries,o=!1,i=e+\"\",s=t+\"\",c=0;c<a.length;c++)(n=a[c]).key===i&&(o?a.splice(c--,1):(o=!0,n.value=s));o||a.push({key:i,value:s}),r.updateURL()},sort:function(){var e,t,n,r=A(this),a=r.entries,o=a.slice();for(a.length=0,n=0;n<o.length;n++){for(e=o[n],t=0;t<n;t++)if(a[t].key>e.key){a.splice(t,0,e);break}t===n&&a.push(e)}r.updateURL()},forEach:function(e){for(var t,n=A(this).entries,r=d(e,arguments.length>1?arguments[1]:void 0,3),a=0;a<n.length;)r((t=n[a++]).value,t.key,this)},keys:function(){return new z(this,\"keys\")},values:function(){return new z(this,\"values\")},entries:function(){return new z(this,\"entries\")}},{enumerable:!0}),i(J,j,J.entries),i(J,\"toString\",(function(){for(var e,t=A(this).entries,n=[],r=0;r<t.length;)e=t[r++],n.push(B(e.key)+\"=\"+B(e.value));return n.join(\"&\")}),{enumerable:!0}),c(F,O),r({global:!0,forced:!o},{URLSearchParams:F}),o||\"function\"!=typeof S||\"function\"!=typeof w||r({global:!0,enumerable:!0,forced:!0},{fetch:function(e){var t,n,r,a=[e];return arguments.length>1&&(v(t=arguments[1])&&(n=t.body,h(n)===O&&((r=t.headers?new w(t.headers):new w).has(\"content-type\")||r.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"),t=g(t,{body:y(0,String(n)),headers:y(0,r)}))),a.push(t)),S.apply(this,a)}}),e.exports={URLSearchParams:F,getState:A}},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwcHgiICBoZWlnaHQ9IjIwMHB4IiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGNsYXNzPSJsZHMtcm9sbGluZyIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IGJhY2tncm91bmQtcG9zaXRpb246IGluaXRpYWwgaW5pdGlhbDsgYmFja2dyb3VuZC1yZXBlYXQ6IGluaXRpYWwgaW5pdGlhbDsiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIGZpbGw9Im5vbmUiIG5nLWF0dHItc3Ryb2tlPSJ7e2NvbmZpZy5jb2xvcn19IiBuZy1hdHRyLXN0cm9rZS13aWR0aD0ie3tjb25maWcud2lkdGh9fSIgbmctYXR0ci1yPSJ7e2NvbmZpZy5yYWRpdXN9fSIgbmctYXR0ci1zdHJva2UtZGFzaGFycmF5PSJ7e2NvbmZpZy5kYXNoYXJyYXl9fSIgc3Ryb2tlPSIjNTU1NTU1IiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgY2FsY01vZGU9ImxpbmVhciIgdmFsdWVzPSIwIDUwIDUwOzM2MCA1MCA1MCIga2V5VGltZXM9IjA7MSIgZHVyPSIxcyIgYmVnaW49IjBzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvY2lyY2xlPjwvc3ZnPgo=\"},function(e,t){e.exports=require(\"redux-immutable\")},function(e,t,n){\"use strict\";var r=\"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};function a(e){return null===e?\"null\":void 0===e?\"undefined\":\"object\"===(void 0===e?\"undefined\":r(e))?Array.isArray(e)?\"array\":\"object\":void 0===e?\"undefined\":r(e)}function o(e){return\"object\"===a(e)?s(e):\"array\"===a(e)?i(e):e}function i(e){return e.map(o)}function s(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=o(e[n]));return t}function c(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={arrayBehaviour:n.arrayBehaviour||\"replace\"},o=t.map((function(e){return e||{}})),u=e||{},l=0;l<o.length;l++)for(var p=o[l],f=Object.keys(p),d=0;d<f.length;d++){var h=f[d],m=p[h],v=a(m),g=a(u[h]);if(\"object\"===v)if(\"undefined\"!==g){var y=\"object\"===g?u[h]:{};u[h]=c({},[y,s(m)],r)}else u[h]=s(m);else if(\"array\"===v)if(\"array\"===g){var b=i(m);u[h]=\"merge\"===r.arrayBehaviour?u[h].concat(b):b}else u[h]=i(m);else u[h]=m}return u}e.exports=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return c(e,n)},e.exports.noMutate=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return c({},t)},e.exports.withOptions=function(e,t,n){return c(e,t,n)}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.sanitizeUrl=void 0;var r=/^([^\\w]*)(javascript|data|vbscript)/im,a=/[\\u0000-\\u001F\\u007F-\\u009F\\u2000-\\u200D\\uFEFF]/gim,o=/^([^:]+):/gm,i=[\".\",\"/\"];t.sanitizeUrl=function(e){if(!e)return\"about:blank\";var t=e.replace(a,\"\").trim();if(function(e){return i.indexOf(e[0])>-1}(t))return t;var n=t.match(o);if(!n)return t;var s=n[0];return r.test(s)?\"about:blank\":t}},function(e,t,n){var r=n(538),a=n(546)((function(e,t,n){return t=t.toLowerCase(),e+(n?r(t):t)}));e.exports=a},function(e,t,n){(function(t){var r=n(622),a=n(623).Stream;function o(e,t,n){n=n||0;var a,i,s=(a=t,new Array(n||0).join(a||\"\")),c=e;if(\"object\"==typeof e&&((c=e[i=Object.keys(e)[0]])&&c._elem))return c._elem.name=i,c._elem.icount=n,c._elem.indent=t,c._elem.indents=s,c._elem.interrupt=c,c._elem;var u,l=[],p=[];function f(e){Object.keys(e).forEach((function(t){l.push(function(e,t){return e+'=\"'+r(t)+'\"'}(t,e[t]))}))}switch(typeof c){case\"object\":if(null===c)break;c._attr&&f(c._attr),c._cdata&&p.push((\"<![CDATA[\"+c._cdata).replace(/\\]\\]>/g,\"]]]]><![CDATA[>\")+\"]]>\"),c.forEach&&(u=!1,p.push(\"\"),c.forEach((function(e){\"object\"==typeof e?\"_attr\"==Object.keys(e)[0]?f(e._attr):p.push(o(e,t,n+1)):(p.pop(),u=!0,p.push(r(e)))})),u||p.push(\"\"));break;default:p.push(r(c))}return{name:i,interrupt:!1,attributes:l,content:p,icount:n,indents:s,indent:t}}function i(e,t,n){if(\"object\"!=typeof t)return e(!1,t);var r=t.interrupt?1:t.content.length;function a(){for(;t.content.length;){var a=t.content.shift();if(void 0!==a){if(o(a))return;i(e,a)}}e(!1,(r>1?t.indents:\"\")+(t.name?\"</\"+t.name+\">\":\"\")+(t.indent&&!n?\"\\n\":\"\")),n&&n()}function o(t){return!!t.interrupt&&(t.interrupt.append=e,t.interrupt.end=a,t.interrupt=!1,e(!0),!0)}if(e(!1,t.indents+(t.name?\"<\"+t.name:\"\")+(t.attributes.length?\" \"+t.attributes.join(\" \"):\"\")+(r?t.name?\">\":\"\":t.name?\"/>\":\"\")+(t.indent&&r>1?\"\\n\":\"\")),!r)return e(!1,t.indent?\"\\n\":\"\");o(t)||a()}e.exports=function(e,n){\"object\"!=typeof n&&(n={indent:n});var r,s,c=n.stream?new a:null,u=\"\",l=!1,p=n.indent?!0===n.indent?\"    \":n.indent:\"\",f=!0;function d(e){f?t.nextTick(e):e()}function h(e,t){if(void 0!==t&&(u+=t),e&&!l&&(c=c||new a,l=!0),e&&l){var n=u;d((function(){c.emit(\"data\",n)})),u=\"\"}}function m(e,t){i(h,o(e,p,p?1:0),t)}function v(){if(c){var e=u;d((function(){c.emit(\"data\",e),c.emit(\"end\"),c.readable=!1,c.emit(\"close\")}))}}return d((function(){f=!1})),n.declaration&&(r=n.declaration,s={version:\"1.0\",encoding:r.encoding||\"UTF-8\"},r.standalone&&(s.standalone=r.standalone),m({\"?xml\":{_attr:s}}),u=u.replace(\"/>\",\"?>\")),e&&e.forEach?e.forEach((function(t,n){var r;n+1===e.length&&(r=v),m(t,r)})):m(e,v),c?(c.readable=!0,c):u},e.exports.element=e.exports.Element=function(){var e=Array.prototype.slice.call(arguments),t={_elem:o(e),push:function(e){if(!this.append)throw new Error(\"not assigned to a parent!\");var t=this,n=this._elem.indent;i(this.append,o(e,n,this._elem.icount+(n?1:0)),(function(){t.append(!0)}))},close:function(e){void 0!==e&&this.push(e),this.end&&this.end()}};return t}}).call(this,n(621))},function(e,t){e.exports=require(\"css.escape\")},function(e,t){e.exports=require(\"randombytes\")},function(e,t){e.exports=require(\"sha.js\")},function(e,t,n){var r=n(332),a=n(349),o=n(156),i=n(628),s=n(45);e.exports=function(e,t,n){var c=s(e)?r:i,u=arguments.length<3;return c(e,o(t,4),n,u,a)}},function(e,t,n){var r=n(50),a=n(672),o=n(348),i=Math.max,s=Math.min;e.exports=function(e,t,n){var c,u,l,p,f,d,h=0,m=!1,v=!1,g=!0;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");function y(t){var n=c,r=u;return c=u=void 0,h=t,p=e.apply(r,n)}function b(e){return h=e,f=setTimeout(x,t),m?y(e):p}function E(e){var n=e-d;return void 0===d||n>=t||n<0||v&&e-h>=l}function x(){var e=a();if(E(e))return S(e);f=setTimeout(x,function(e){var n=t-(e-d);return v?s(n,l-(e-h)):n}(e))}function S(e){return f=void 0,g&&c?y(e):(c=u=void 0,p)}function w(){var e=a(),n=E(e);if(c=arguments,u=this,d=e,n){if(void 0===f)return b(d);if(v)return clearTimeout(f),f=setTimeout(x,t),y(d)}return void 0===f&&(f=setTimeout(x,t)),p}return t=o(t)||0,r(n)&&(m=!!n.leading,l=(v=\"maxWait\"in n)?i(o(n.maxWait)||0,t):l,g=\"trailing\"in n?!!n.trailing:g),w.cancel=function(){void 0!==f&&clearTimeout(f),h=0,c=d=u=f=void 0},w.flush=function(){return void 0===f?p:S(a())},w}},function(e,t){e.exports=require(\"react-dom\")},function(e,t,n){var r=n(329),a=n(370),o=n(714),i=n(110),s=n(113),c=n(717),u=n(373),l=n(372),p=u((function(e,t){var n={};if(null==e)return n;var u=!1;t=r(t,(function(t){return t=i(t,e),u||(u=t.length>1),t})),s(e,l(e),n),u&&(n=a(n,7,c));for(var p=t.length;p--;)o(n,t[p]);return n}));e.exports=p},function(e,t,n){e.exports=n(725)},function(e,t){e.exports=function(e){const t={literal:\"true false null\"},n=[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],r=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],a={end:\",\",endsWithParent:!0,excludeEnd:!0,contains:r,keywords:t},o={begin:/\\{/,end:/\\}/,contains:[{className:\"attr\",begin:/\"/,end:/\"/,contains:[e.BACKSLASH_ESCAPE],illegal:\"\\\\n\"},e.inherit(a,{begin:/:/})].concat(n),illegal:\"\\\\S\"},i={begin:\"\\\\[\",end:\"\\\\]\",contains:[e.inherit(a)],illegal:\"\\\\S\"};return r.push(o,i),n.forEach((function(e){r.push(e)})),{name:\"JSON\",contains:r,keywords:t,illegal:\"\\\\S\"}}},function(e,t){const n=\"[A-Za-z$_][0-9A-Za-z$_]*\",r=[\"as\",\"in\",\"of\",\"if\",\"for\",\"while\",\"finally\",\"var\",\"new\",\"function\",\"do\",\"return\",\"void\",\"else\",\"break\",\"catch\",\"instanceof\",\"with\",\"throw\",\"case\",\"default\",\"try\",\"switch\",\"continue\",\"typeof\",\"delete\",\"let\",\"yield\",\"const\",\"class\",\"debugger\",\"async\",\"await\",\"static\",\"import\",\"from\",\"export\",\"extends\"],a=[\"true\",\"false\",\"null\",\"undefined\",\"NaN\",\"Infinity\"],o=[].concat([\"setInterval\",\"setTimeout\",\"clearInterval\",\"clearTimeout\",\"require\",\"exports\",\"eval\",\"isFinite\",\"isNaN\",\"parseFloat\",\"parseInt\",\"decodeURI\",\"decodeURIComponent\",\"encodeURI\",\"encodeURIComponent\",\"escape\",\"unescape\"],[\"arguments\",\"this\",\"super\",\"console\",\"window\",\"document\",\"localStorage\",\"module\",\"global\"],[\"Intl\",\"DataView\",\"Number\",\"Math\",\"Date\",\"String\",\"RegExp\",\"Object\",\"Function\",\"Boolean\",\"Error\",\"Symbol\",\"Set\",\"Map\",\"WeakSet\",\"WeakMap\",\"Proxy\",\"Reflect\",\"JSON\",\"Promise\",\"Float64Array\",\"Int16Array\",\"Int32Array\",\"Int8Array\",\"Uint16Array\",\"Uint32Array\",\"Float32Array\",\"Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"ArrayBuffer\"],[\"EvalError\",\"InternalError\",\"RangeError\",\"ReferenceError\",\"SyntaxError\",\"TypeError\",\"URIError\"]);function i(e){return s(\"(?=\",e,\")\")}function s(...e){return e.map((e=>{return(t=e)?\"string\"==typeof t?t:t.source:null;var t})).join(\"\")}e.exports=function(e){const t=n,c=\"<>\",u=\"</>\",l={begin:/<[A-Za-z0-9\\\\._:-]+/,end:/\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,isTrulyOpeningTag:(e,t)=>{const n=e[0].length+e.index,r=e.input[n];\"<\"!==r?\">\"===r&&(((e,{after:t})=>{const n=\"</\"+e[0].slice(1);return-1!==e.input.indexOf(n,t)})(e,{after:n})||t.ignoreMatch()):t.ignoreMatch()}},p={$pattern:n,keyword:r.join(\" \"),literal:a.join(\" \"),built_in:o.join(\" \")},f=\"\\\\.([0-9](_?[0-9])*)\",d=\"0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*\",h={className:\"number\",variants:[{begin:`(\\\\b(${d})((${f})|\\\\.)?|(${f}))[eE][+-]?([0-9](_?[0-9])*)\\\\b`},{begin:`\\\\b(${d})\\\\b((${f})\\\\b|\\\\.)?|(${f})\\\\b`},{begin:\"\\\\b(0|[1-9](_?[0-9])*)n\\\\b\"},{begin:\"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\"},{begin:\"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\"},{begin:\"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\"},{begin:\"\\\\b0[0-7]+n?\\\\b\"}],relevance:0},m={className:\"subst\",begin:\"\\\\$\\\\{\",end:\"\\\\}\",keywords:p,contains:[]},v={begin:\"html`\",end:\"\",starts:{end:\"`\",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,m],subLanguage:\"xml\"}},g={begin:\"css`\",end:\"\",starts:{end:\"`\",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,m],subLanguage:\"css\"}},y={className:\"string\",begin:\"`\",end:\"`\",contains:[e.BACKSLASH_ESCAPE,m]},b={className:\"comment\",variants:[e.COMMENT(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,contains:[{className:\"doctag\",begin:\"@[A-Za-z]+\",contains:[{className:\"type\",begin:\"\\\\{\",end:\"\\\\}\",relevance:0},{className:\"variable\",begin:t+\"(?=\\\\s*(-)|$)\",endsParent:!0,relevance:0},{begin:/(?=[^\\n])\\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},E=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,v,g,y,h,e.REGEXP_MODE];m.contains=E.concat({begin:/\\{/,end:/\\}/,keywords:p,contains:[\"self\"].concat(E)});const x=[].concat(b,m.contains),S=x.concat([{begin:/\\(/,end:/\\)/,keywords:p,contains:[\"self\"].concat(x)}]),w={className:\"params\",begin:/\\(/,end:/\\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:S};return{name:\"Javascript\",aliases:[\"js\",\"jsx\",\"mjs\",\"cjs\"],keywords:p,exports:{PARAMS_CONTAINS:S},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:\"shebang\",binary:\"node\",relevance:5}),{label:\"use_strict\",className:\"meta\",relevance:10,begin:/^\\s*['\"]use (strict|asm)['\"]/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,v,g,y,b,h,{begin:s(/[{,\\n]\\s*/,i(s(/(((\\/\\/.*$)|(\\/\\*(\\*[^/]|[^*])*\\*\\/))\\s*)*/,t+\"\\\\s*:\"))),relevance:0,contains:[{className:\"attr\",begin:t+i(\"\\\\s*:\"),relevance:0}]},{begin:\"(\"+e.RE_STARTERS_RE+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",keywords:\"return throw case\",contains:[b,e.REGEXP_MODE,{className:\"function\",begin:\"(\\\\([^()]*(\\\\([^()]*(\\\\([^()]*\\\\)[^()]*)*\\\\)[^()]*)*\\\\)|\"+e.UNDERSCORE_IDENT_RE+\")\\\\s*=>\",returnBegin:!0,end:\"\\\\s*=>\",contains:[{className:\"params\",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\\(\\s*\\)/,skip:!0},{begin:/\\(/,end:/\\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:S}]}]},{begin:/,/,relevance:0},{className:\"\",begin:/\\s/,end:/\\s*/,skip:!0},{variants:[{begin:c,end:u},{begin:l.begin,\"on:begin\":l.isTrulyOpeningTag,end:l.end}],subLanguage:\"xml\",contains:[{begin:l.begin,end:l.end,skip:!0,contains:[\"self\"]}]}],relevance:0},{className:\"function\",beginKeywords:\"function\",end:/[{;]/,excludeEnd:!0,keywords:p,contains:[\"self\",e.inherit(e.TITLE_MODE,{begin:t}),w],illegal:/%/},{beginKeywords:\"while if switch catch for\"},{className:\"function\",begin:e.UNDERSCORE_IDENT_RE+\"\\\\([^()]*(\\\\([^()]*(\\\\([^()]*\\\\)[^()]*)*\\\\)[^()]*)*\\\\)\\\\s*\\\\{\",returnBegin:!0,contains:[w,e.inherit(e.TITLE_MODE,{begin:t})]},{variants:[{begin:\"\\\\.\"+t},{begin:\"\\\\$\"+t}],relevance:0},{className:\"class\",beginKeywords:\"class\",end:/[{;=]/,excludeEnd:!0,illegal:/[:\"[\\]]/,contains:[{beginKeywords:\"extends\"},e.UNDERSCORE_TITLE_MODE]},{begin:/\\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:t}),\"self\",w]},{begin:\"(get|set)\\\\s+(?=\"+t+\"\\\\()\",end:/\\{/,keywords:\"get set\",contains:[e.inherit(e.TITLE_MODE,{begin:t}),{begin:/\\(\\)/},w]},{begin:/\\$[(.]/}]}}},function(e,t){function n(e){return e?\"string\"==typeof e?e:e.source:null}function r(e){return a(\"(?=\",e,\")\")}function a(...e){return e.map((e=>n(e))).join(\"\")}function o(...e){return\"(\"+e.map((e=>n(e))).join(\"|\")+\")\"}e.exports=function(e){const t=a(/[A-Z_]/,a(\"(\",/[A-Z0-9_.-]+:/,\")?\"),/[A-Z0-9_.-]*/),n={className:\"symbol\",begin:\"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;\"},i={begin:\"\\\\s\",contains:[{className:\"meta-keyword\",begin:\"#?[a-z_][a-z1-9_-]+\",illegal:\"\\\\n\"}]},s=e.inherit(i,{begin:\"\\\\(\",end:\"\\\\)\"}),c=e.inherit(e.APOS_STRING_MODE,{className:\"meta-string\"}),u=e.inherit(e.QUOTE_STRING_MODE,{className:\"meta-string\"}),l={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:\"attr\",begin:\"[A-Za-z0-9\\\\._:-]+\",relevance:0},{begin:/=\\s*/,relevance:0,contains:[{className:\"string\",endsParent:!0,variants:[{begin:/\"/,end:/\"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\\s\"'=<>`]+/}]}]}]};return{name:\"HTML, XML\",aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\",\"wsf\",\"svg\"],case_insensitive:!0,contains:[{className:\"meta\",begin:\"<![a-z]\",end:\">\",relevance:10,contains:[i,u,c,s,{begin:\"\\\\[\",end:\"\\\\]\",contains:[{className:\"meta\",begin:\"<![a-z]\",end:\">\",contains:[i,s,u,c]}]}]},e.COMMENT(\"\\x3c!--\",\"--\\x3e\",{relevance:10}),{begin:\"<!\\\\[CDATA\\\\[\",end:\"\\\\]\\\\]>\",relevance:10},n,{className:\"meta\",begin:/<\\?xml/,end:/\\?>/,relevance:10},{className:\"tag\",begin:\"<style(?=\\\\s|>)\",end:\">\",keywords:{name:\"style\"},contains:[l],starts:{end:\"</style>\",returnEnd:!0,subLanguage:[\"css\",\"xml\"]}},{className:\"tag\",begin:\"<script(?=\\\\s|>)\",end:\">\",keywords:{name:\"script\"},contains:[l],starts:{end:/<\\/script>/,returnEnd:!0,subLanguage:[\"javascript\",\"handlebars\",\"xml\"]}},{className:\"tag\",begin:/<>|<\\/>/},{className:\"tag\",begin:a(/</,r(a(t,o(/\\/>/,/>/,/\\s/)))),end:/\\/?>/,contains:[{className:\"name\",begin:t,relevance:0,starts:l}]},{className:\"tag\",begin:a(/<\\//,r(a(t,/>/))),contains:[{className:\"name\",begin:t,relevance:0},{begin:/>/,relevance:0}]}]}}},function(e,t){e.exports=function(e){var t=\"true false yes no null\",n=\"[\\\\w#;/?:@&=+$,.~*'()[\\\\]]+\",r={className:\"string\",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/\"/,end:/\"/},{begin:/\\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:\"template-variable\",variants:[{begin:/\\{\\{/,end:/\\}\\}/},{begin:/%\\{/,end:/\\}/}]}]},a=e.inherit(r,{variants:[{begin:/'/,end:/'/},{begin:/\"/,end:/\"/},{begin:/[^\\s,{}[\\]]+/}]}),o={className:\"number\",begin:\"\\\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\\\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\\\.[0-9]*)?([ \\\\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\\\b\"},i={end:\",\",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:t,relevance:0},s={begin:/\\{/,end:/\\}/,contains:[i],illegal:\"\\\\n\",relevance:0},c={begin:\"\\\\[\",end:\"\\\\]\",contains:[i],illegal:\"\\\\n\",relevance:0},u=[{className:\"attr\",variants:[{begin:\"\\\\w[\\\\w :\\\\/.-]*:(?=[ \\t]|$)\"},{begin:'\"\\\\w[\\\\w :\\\\/.-]*\":(?=[ \\t]|$)'},{begin:\"'\\\\w[\\\\w :\\\\/.-]*':(?=[ \\t]|$)\"}]},{className:\"meta\",begin:\"^---\\\\s*$\",relevance:10},{className:\"string\",begin:\"[\\\\|>]([1-9]?[+-])?[ ]*\\\\n( +)[^ ][^\\\\n]*\\\\n(\\\\2[^\\\\n]+\\\\n?)*\"},{begin:\"<%[%=-]?\",end:\"[%-]?%>\",subLanguage:\"ruby\",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:\"type\",begin:\"!\\\\w+!\"+n},{className:\"type\",begin:\"!<\"+n+\">\"},{className:\"type\",begin:\"!\"+n},{className:\"type\",begin:\"!!\"+n},{className:\"meta\",begin:\"&\"+e.UNDERSCORE_IDENT_RE+\"$\"},{className:\"meta\",begin:\"\\\\*\"+e.UNDERSCORE_IDENT_RE+\"$\"},{className:\"bullet\",begin:\"-(?=[ ]|$)\",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},o,{className:\"number\",begin:e.C_NUMBER_RE+\"\\\\b\",relevance:0},s,c,r],l=[...u];return l.pop(),l.push(a),i.contains=l,{name:\"YAML\",case_insensitive:!0,aliases:[\"yml\",\"YAML\"],contains:u}}},function(e,t){e.exports=function(e){var t=\"HTTP/[0-9\\\\.]+\";return{name:\"HTTP\",aliases:[\"https\"],illegal:\"\\\\S\",contains:[{begin:\"^\"+t,end:\"$\",contains:[{className:\"number\",begin:\"\\\\b\\\\d{3}\\\\b\"}]},{begin:\"^[A-Z]+ (.*?) \"+t+\"$\",returnBegin:!0,end:\"$\",contains:[{className:\"string\",begin:\" \",end:\" \",excludeBegin:!0,excludeEnd:!0},{begin:t},{className:\"keyword\",begin:\"[A-Z]+\"}]},{className:\"attribute\",begin:\"^\\\\w\",end:\": \",excludeEnd:!0,illegal:\"\\\\n|\\\\s|=\",starts:{end:\"$\",relevance:0}},{begin:\"\\\\n\\\\n\",starts:{subLanguage:[],endsWithParent:!0}}]}}},function(e,t){function n(...e){return e.map((e=>{return(t=e)?\"string\"==typeof t?t:t.source:null;var t})).join(\"\")}e.exports=function(e){const t={},r={begin:/\\$\\{/,end:/\\}/,contains:[\"self\",{begin:/:-/,contains:[t]}]};Object.assign(t,{className:\"variable\",variants:[{begin:n(/\\$[\\w\\d#@][\\w\\d_]*/,\"(?![\\\\w\\\\d])(?![$])\")},r]});const a={className:\"subst\",begin:/\\$\\(/,end:/\\)/,contains:[e.BACKSLASH_ESCAPE]},o={begin:/<<-?\\s*(?=\\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\\w+)/,end:/(\\w+)/,className:\"string\"})]}},i={className:\"string\",begin:/\"/,end:/\"/,contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(i);const s={begin:/\\$\\(\\(/,end:/\\)\\)/,contains:[{begin:/\\d+#[0-9a-f]+/,className:\"number\"},e.NUMBER_MODE,t]},c=e.SHEBANG({binary:`(${[\"fish\",\"bash\",\"zsh\",\"sh\",\"csh\",\"ksh\",\"tcsh\",\"dash\",\"scsh\"].join(\"|\")})`,relevance:10}),u={className:\"function\",begin:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\\w[\\w\\d_]*/})],relevance:0};return{name:\"Bash\",aliases:[\"sh\",\"zsh\"],keywords:{$pattern:/\\b[a-z._-]+\\b/,keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\"},contains:[c,e.SHEBANG(),u,s,e.HASH_COMMENT_MODE,o,i,{className:\"\",begin:/\\\\\"/},{className:\"string\",begin:/'/,end:/'/},t]}}},function(e,t){e.exports=function(e){const t={$pattern:/-?[A-z\\.\\-]+\\b/,keyword:\"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter\",built_in:\"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write\"},n={begin:\"`[\\\\s\\\\S]\",relevance:0},r={className:\"variable\",variants:[{begin:/\\$\\B/},{className:\"keyword\",begin:/\\$this/},{begin:/\\$[\\w\\d][\\w\\d_:]*/}]},a={className:\"string\",variants:[{begin:/\"/,end:/\"/},{begin:/@\"/,end:/^\"@/}],contains:[n,r,{className:\"variable\",begin:/\\$[A-z]/,end:/[^A-z]/}]},o={className:\"string\",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},i=e.inherit(e.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,end:/#>/}],contains:[{className:\"doctag\",variants:[{begin:/\\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\\s+\\S+/}]}]}),s={className:\"built_in\",variants:[{begin:\"(\".concat(\"Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Complete|Confirm|Deny|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where\",\")+(-)[\\\\w\\\\d]+\")}]},c={className:\"class\",beginKeywords:\"class enum\",end:/\\s*[{]/,excludeEnd:!0,relevance:0,contains:[e.TITLE_MODE]},u={className:\"function\",begin:/function\\s+/,end:/\\s*\\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,contains:[{begin:\"function\",relevance:0,className:\"keyword\"},{className:\"title\",begin:/\\w[\\w\\d]*((-)[\\w\\d]+)*/,relevance:0},{begin:/\\(/,end:/\\)/,className:\"params\",relevance:0,contains:[r]}]},l={begin:/using\\s/,end:/$/,returnBegin:!0,contains:[a,o,{className:\"keyword\",begin:/(using|assembly|command|module|namespace|type)/}]},p={variants:[{className:\"operator\",begin:\"(\".concat(\"-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor\",\")\\\\b\")},{className:\"literal\",begin:/(-)[\\w\\d]+/,relevance:0}]},f={className:\"function\",begin:/\\[.*\\]\\s*[\\w]+[ ]??\\(/,end:/$/,returnBegin:!0,relevance:0,contains:[{className:\"keyword\",begin:\"(\".concat(t.keyword.toString().replace(/\\s/g,\"|\"),\")\\\\b\"),endsParent:!0,relevance:0},e.inherit(e.TITLE_MODE,{endsParent:!0})]},d=[f,i,n,e.NUMBER_MODE,a,o,s,r,{className:\"literal\",begin:/\\$(null|true|false)\\b/},{className:\"selector-tag\",begin:/@\\B/,relevance:0}],h={begin:/\\[/,end:/\\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat(\"self\",d,{begin:\"(\"+[\"string\",\"char\",\"byte\",\"int\",\"long\",\"bool\",\"decimal\",\"single\",\"double\",\"DateTime\",\"xml\",\"array\",\"hashtable\",\"void\"].join(\"|\")+\")\",className:\"built_in\",relevance:0},{className:\"type\",begin:/[\\.\\w\\d]+/,relevance:0})};return f.contains.unshift(h),{name:\"PowerShell\",aliases:[\"ps\",\"ps1\"],case_insensitive:!0,keywords:t,contains:d.concat(c,u,l,p,h)}}},function(e,t,n){e.exports=n(736)},function(e,t,n){var r=n(370);e.exports=function(e){return r(e,5)}},function(e,t,n){e.exports=n(740)},function(e,t){e.exports=require(\"traverse\")},function(e,t){e.exports=require(\"cookie\")},function(e,t){e.exports=require(\"zenscroll\")},function(e,t,n){e.exports=n(756)},function(e,t){e.exports=require(\"js-file-download\")},function(e,t,n){e.exports=n(763)},function(e,t,n){e.exports=n(766)},function(e,t){e.exports=require(\"xml-but-prettier\")},function(e,t){e.exports=require(\"react-immutable-pure-component\")},function(e,t){e.exports=require(\"autolinker\")},function(e,t,n){e.exports=n(772)},function(e,t,n){var r=n(416);n(436),n(437),n(438),n(439),n(440),n(441),n(442),e.exports=r},function(e,t,n){n(290),n(145),n(294),n(420),n(421),n(422),n(423),n(299),n(424),n(425),n(426),n(427),n(428),n(429),n(430),n(431),n(432),n(433),n(434),n(435);var r=n(31);e.exports=r.Symbol},function(e,t,n){var r=n(36),a=n(58);e.exports=function(e,t){try{a(r,e,t)}catch(n){r[e]=t}return t}},function(e,t,n){var r=n(57),a=n(192).f,o={}.toString,i=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return i&&\"[object Window]\"==o.call(e)?function(e){try{return a(e)}catch(e){return i.slice()}}(e):a(r(e))}},function(e,t,n){\"use strict\";var r=n(195),a=n(83);e.exports=r?{}.toString:function(){return\"[object \"+a(this)+\"]\"}},function(e,t,n){n(40)(\"asyncIterator\")},function(e,t){},function(e,t,n){n(40)(\"hasInstance\")},function(e,t,n){n(40)(\"isConcatSpreadable\")},function(e,t,n){n(40)(\"match\")},function(e,t,n){n(40)(\"matchAll\")},function(e,t,n){n(40)(\"replace\")},function(e,t,n){n(40)(\"search\")},function(e,t,n){n(40)(\"species\")},function(e,t,n){n(40)(\"split\")},function(e,t,n){n(40)(\"toPrimitive\")},function(e,t,n){n(40)(\"toStringTag\")},function(e,t,n){n(40)(\"unscopables\")},function(e,t,n){var r=n(36);n(82)(r.JSON,\"JSON\",!0)},function(e,t){},function(e,t){},function(e,t,n){n(40)(\"asyncDispose\")},function(e,t,n){n(40)(\"dispose\")},function(e,t,n){n(40)(\"matcher\")},function(e,t,n){n(40)(\"metadata\")},function(e,t,n){n(40)(\"observable\")},function(e,t,n){n(40)(\"patternMatch\")},function(e,t,n){n(40)(\"replaceAll\")},function(e,t,n){e.exports=n(444)},function(e,t,n){var r=n(445);e.exports=r},function(e,t,n){n(299),n(107),n(74);var r=n(194);e.exports=r.f(\"iterator\")},function(e,t,n){var r=n(42);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError(\"Can't set \"+String(e)+\" as a prototype\");return e}},function(e,t){e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(e,t,n){var r=n(449);e.exports=r},function(e,t,n){var r=n(450),a=Array.prototype;e.exports=function(e){var t=e.concat;return e===a||e instanceof Array&&t===a.concat?r:t}},function(e,t,n){n(290);var r=n(38);e.exports=r(\"Array\").concat},function(e,t,n){var r=n(304);e.exports=r},function(e,t,n){n(453);var r=n(38);e.exports=r(\"Array\").filter},function(e,t,n){\"use strict\";var r=n(21),a=n(73).filter;r({target:\"Array\",proto:!0,forced:!n(123)(\"filter\")},{filter:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(305);e.exports=r},function(e,t,n){var r=n(21),a=n(53),o=n(124);r({target:\"Object\",stat:!0,forced:n(34)((function(){o(1)}))},{keys:function(e){return o(a(e))}})},function(e,t,n){var r=n(457);e.exports=r},function(e,t,n){n(458);var r=n(31);r.JSON||(r.JSON={stringify:JSON.stringify}),e.exports=function(e,t,n){return r.JSON.stringify.apply(null,arguments)}},function(e,t,n){var r=n(21),a=n(61),o=n(34),i=a(\"JSON\",\"stringify\"),s=/[\\uD800-\\uDFFF]/g,c=/^[\\uD800-\\uDBFF]$/,u=/^[\\uDC00-\\uDFFF]$/,l=function(e,t,n){var r=n.charAt(t-1),a=n.charAt(t+1);return c.test(e)&&!u.test(a)||u.test(e)&&!c.test(r)?\"\\\\u\"+e.charCodeAt(0).toString(16):e},p=o((function(){return'\"\\\\udf06\\\\ud834\"'!==i(\"\\udf06\\ud834\")||'\"\\\\udead\"'!==i(\"\\udead\")}));i&&r({target:\"JSON\",stat:!0,forced:p},{stringify:function(e,t,n){var r=i.apply(null,arguments);return\"string\"==typeof r?r.replace(s,l):r}})},function(e,t,n){var r=n(306);e.exports=r},function(e,t,n){var r=n(21),a=n(43);r({target:\"Object\",stat:!0,forced:!a,sham:!a},{defineProperty:n(59).f})},function(e,t,n){var r=n(462);e.exports=r},function(e,t,n){var r=n(463),a=Function.prototype;e.exports=function(e){var t=e.bind;return e===a||e instanceof Function&&t===a.bind?r:t}},function(e,t,n){n(464);var r=n(38);e.exports=r(\"Function\").bind},function(e,t,n){n(21)({target:\"Function\",proto:!0},{bind:n(307)})},function(e,t,n){var r=n(308);e.exports=r},function(e,t,n){var r=n(21),a=n(309);r({target:\"Object\",stat:!0,forced:Object.assign!==a},{assign:a})},function(e,t,n){var r=n(310);e.exports=r},function(e,t,n){n(469);var r=n(38);e.exports=r(\"Array\").slice},function(e,t,n){\"use strict\";var r=n(21),a=n(42),o=n(121),i=n(190),s=n(60),c=n(57),u=n(122),l=n(37),p=n(123)(\"slice\"),f=l(\"species\"),d=[].slice,h=Math.max;r({target:\"Array\",proto:!0,forced:!p},{slice:function(e,t){var n,r,l,p=c(this),m=s(p.length),v=i(e,m),g=i(void 0===t?m:t,m);if(o(p)&&(\"function\"!=typeof(n=p.constructor)||n!==Array&&!o(n.prototype)?a(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return d.call(p,v,g);for(r=new(void 0===n?Array:n)(h(g-v,0)),l=0;v<g;v++,l++)v in p&&u(r,l,p[v]);return r.length=l,r}})},function(e,t,n){var r=n(311);e.exports=r},function(e,t,n){n(21)({target:\"Array\",stat:!0},{isArray:n(121)})},function(e,t,n){var r=n(473);e.exports=r},function(e,t,n){var r=n(474),a=Array.prototype;e.exports=function(e){var t=e.reduce;return e===a||e instanceof Array&&t===a.reduce?r:t}},function(e,t,n){n(475);var r=n(38);e.exports=r(\"Array\").reduce},function(e,t,n){\"use strict\";var r=n(21),a=n(476).left,o=n(94),i=n(106),s=n(149);r({target:\"Array\",proto:!0,forced:!o(\"reduce\")||!s&&i>79&&i<83},{reduce:function(e){return a(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(66),a=n(53),o=n(142),i=n(60),s=function(e){return function(t,n,s,c){r(n);var u=a(t),l=o(u),p=i(u.length),f=e?p-1:0,d=e?-1:1;if(s<2)for(;;){if(f in l){c=l[f],f+=d;break}if(f+=d,e?f<0:p<=f)throw TypeError(\"Reduce of empty array with no initial value\")}for(;e?f>=0:p>f;f+=d)f in l&&(c=n(c,l[f],f,u));return c}};e.exports={left:s(!1),right:s(!0)}},function(e,t,n){var r=n(478);e.exports=r},function(e,t,n){var r=n(479),a=Array.prototype;e.exports=function(e){var t=e.map;return e===a||e instanceof Array&&t===a.map?r:t}},function(e,t,n){n(480);var r=n(38);e.exports=r(\"Array\").map},function(e,t,n){\"use strict\";var r=n(21),a=n(73).map;r({target:\"Array\",proto:!0,forced:!n(123)(\"map\")},{map:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){\"use strict\";(function(e){var r=n(482),a=n(483),o=n(484);function i(){return c.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(i()<t)throw new RangeError(\"Invalid typed array length\");return c.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=c.prototype:(null===e&&(e=new c(t)),e.length=t),e}function c(e,t,n){if(!(c.TYPED_ARRAY_SUPPORT||this instanceof c))return new c(e,t,n);if(\"number\"==typeof e){if(\"string\"==typeof t)throw new Error(\"If encoding is specified then the first argument must be a string\");return p(this,e)}return u(this,e,t,n)}function u(e,t,n,r){if(\"number\"==typeof t)throw new TypeError('\"value\" argument must not be a number');return\"undefined\"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,n,r){if(t.byteLength,n<0||t.byteLength<n)throw new RangeError(\"'offset' is out of bounds\");if(t.byteLength<n+(r||0))throw new RangeError(\"'length' is out of bounds\");t=void 0===n&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,n):new Uint8Array(t,n,r);c.TYPED_ARRAY_SUPPORT?(e=t).__proto__=c.prototype:e=f(e,t);return e}(e,t,n,r):\"string\"==typeof t?function(e,t,n){\"string\"==typeof n&&\"\"!==n||(n=\"utf8\");if(!c.isEncoding(n))throw new TypeError('\"encoding\" must be a valid string encoding');var r=0|h(t,n),a=(e=s(e,r)).write(t,n);a!==r&&(e=e.slice(0,a));return e}(e,t,n):function(e,t){if(c.isBuffer(t)){var n=0|d(t.length);return 0===(e=s(e,n)).length||t.copy(e,0,0,n),e}if(t){if(\"undefined\"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||\"length\"in t)return\"number\"!=typeof t.length||(r=t.length)!=r?s(e,0):f(e,t);if(\"Buffer\"===t.type&&o(t.data))return f(e,t.data)}var r;throw new TypeError(\"First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.\")}(e,t)}function l(e){if(\"number\"!=typeof e)throw new TypeError('\"size\" argument must be a number');if(e<0)throw new RangeError('\"size\" argument must not be negative')}function p(e,t){if(l(t),e=s(e,t<0?0:0|d(t)),!c.TYPED_ARRAY_SUPPORT)for(var n=0;n<t;++n)e[n]=0;return e}function f(e,t){var n=t.length<0?0:0|d(t.length);e=s(e,n);for(var r=0;r<n;r+=1)e[r]=255&t[r];return e}function d(e){if(e>=i())throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+i().toString(16)+\" bytes\");return 0|e}function h(e,t){if(c.isBuffer(e))return e.length;if(\"undefined\"!=typeof ArrayBuffer&&\"function\"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;\"string\"!=typeof e&&(e=\"\"+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case\"ascii\":case\"latin1\":case\"binary\":return n;case\"utf8\":case\"utf-8\":case void 0:return V(e).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*n;case\"hex\":return n>>>1;case\"base64\":return z(e).length;default:if(r)return V(e).length;t=(\"\"+t).toLowerCase(),r=!0}}function m(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return\"\";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return\"\";if((n>>>=0)<=(t>>>=0))return\"\";for(e||(e=\"utf8\");;)switch(e){case\"hex\":return I(this,t,n);case\"utf8\":case\"utf-8\":return C(this,t,n);case\"ascii\":return A(this,t,n);case\"latin1\":case\"binary\":return k(this,t,n);case\"base64\":return O(this,t,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return P(this,t,n);default:if(r)throw new TypeError(\"Unknown encoding: \"+e);e=(e+\"\").toLowerCase(),r=!0}}function v(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function g(e,t,n,r,a){if(0===e.length)return-1;if(\"string\"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=a?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(a)return-1;n=e.length-1}else if(n<0){if(!a)return-1;n=0}if(\"string\"==typeof t&&(t=c.from(t,r)),c.isBuffer(t))return 0===t.length?-1:y(e,t,n,r,a);if(\"number\"==typeof t)return t&=255,c.TYPED_ARRAY_SUPPORT&&\"function\"==typeof Uint8Array.prototype.indexOf?a?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,r,a);throw new TypeError(\"val must be string, number or Buffer\")}function y(e,t,n,r,a){var o,i=1,s=e.length,c=t.length;if(void 0!==r&&(\"ucs2\"===(r=String(r).toLowerCase())||\"ucs-2\"===r||\"utf16le\"===r||\"utf-16le\"===r)){if(e.length<2||t.length<2)return-1;i=2,s/=2,c/=2,n/=2}function u(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(a){var l=-1;for(o=n;o<s;o++)if(u(e,o)===u(t,-1===l?0:o-l)){if(-1===l&&(l=o),o-l+1===c)return l*i}else-1!==l&&(o-=o-l),l=-1}else for(n+c>s&&(n=s-c),o=n;o>=0;o--){for(var p=!0,f=0;f<c;f++)if(u(e,o+f)!==u(t,f)){p=!1;break}if(p)return o}return-1}function b(e,t,n,r){n=Number(n)||0;var a=e.length-n;r?(r=Number(r))>a&&(r=a):r=a;var o=t.length;if(o%2!=0)throw new TypeError(\"Invalid hex string\");r>o/2&&(r=o/2);for(var i=0;i<r;++i){var s=parseInt(t.substr(2*i,2),16);if(isNaN(s))return i;e[n+i]=s}return i}function E(e,t,n,r){return F(V(t,e.length-n),e,n,r)}function x(e,t,n,r){return F(function(e){for(var t=[],n=0;n<e.length;++n)t.push(255&e.charCodeAt(n));return t}(t),e,n,r)}function S(e,t,n,r){return x(e,t,n,r)}function w(e,t,n,r){return F(z(t),e,n,r)}function j(e,t,n,r){return F(function(e,t){for(var n,r,a,o=[],i=0;i<e.length&&!((t-=2)<0);++i)r=(n=e.charCodeAt(i))>>8,a=n%256,o.push(a),o.push(r);return o}(t,e.length-n),e,n,r)}function O(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function C(e,t,n){n=Math.min(e.length,n);for(var r=[],a=t;a<n;){var o,i,s,c,u=e[a],l=null,p=u>239?4:u>223?3:u>191?2:1;if(a+p<=n)switch(p){case 1:u<128&&(l=u);break;case 2:128==(192&(o=e[a+1]))&&(c=(31&u)<<6|63&o)>127&&(l=c);break;case 3:o=e[a+1],i=e[a+2],128==(192&o)&&128==(192&i)&&(c=(15&u)<<12|(63&o)<<6|63&i)>2047&&(c<55296||c>57343)&&(l=c);break;case 4:o=e[a+1],i=e[a+2],s=e[a+3],128==(192&o)&&128==(192&i)&&128==(192&s)&&(c=(15&u)<<18|(63&o)<<12|(63&i)<<6|63&s)>65535&&c<1114112&&(l=c)}null===l?(l=65533,p=1):l>65535&&(l-=65536,r.push(l>>>10&1023|55296),l=56320|1023&l),r.push(l),a+=p}return function(e){var t=e.length;if(t<=_)return String.fromCharCode.apply(String,e);var n=\"\",r=0;for(;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=_));return n}(r)}t.Buffer=c,t.SlowBuffer=function(e){+e!=e&&(e=0);return c.alloc(+e)},t.INSPECT_MAX_BYTES=50,c.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&\"function\"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),t.kMaxLength=i(),c.poolSize=8192,c._augment=function(e){return e.__proto__=c.prototype,e},c.from=function(e,t,n){return u(null,e,t,n)},c.TYPED_ARRAY_SUPPORT&&(c.prototype.__proto__=Uint8Array.prototype,c.__proto__=Uint8Array,\"undefined\"!=typeof Symbol&&Symbol.species&&c[Symbol.species]===c&&Object.defineProperty(c,Symbol.species,{value:null,configurable:!0})),c.alloc=function(e,t,n){return function(e,t,n,r){return l(t),t<=0?s(e,t):void 0!==n?\"string\"==typeof r?s(e,t).fill(n,r):s(e,t).fill(n):s(e,t)}(null,e,t,n)},c.allocUnsafe=function(e){return p(null,e)},c.allocUnsafeSlow=function(e){return p(null,e)},c.isBuffer=function(e){return!(null==e||!e._isBuffer)},c.compare=function(e,t){if(!c.isBuffer(e)||!c.isBuffer(t))throw new TypeError(\"Arguments must be Buffers\");if(e===t)return 0;for(var n=e.length,r=t.length,a=0,o=Math.min(n,r);a<o;++a)if(e[a]!==t[a]){n=e[a],r=t[a];break}return n<r?-1:r<n?1:0},c.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"latin1\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},c.concat=function(e,t){if(!o(e))throw new TypeError('\"list\" argument must be an Array of Buffers');if(0===e.length)return c.alloc(0);var n;if(void 0===t)for(t=0,n=0;n<e.length;++n)t+=e[n].length;var r=c.allocUnsafe(t),a=0;for(n=0;n<e.length;++n){var i=e[n];if(!c.isBuffer(i))throw new TypeError('\"list\" argument must be an Array of Buffers');i.copy(r,a),a+=i.length}return r},c.byteLength=h,c.prototype._isBuffer=!0,c.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var t=0;t<e;t+=2)v(this,t,t+1);return this},c.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError(\"Buffer size must be a multiple of 32-bits\");for(var t=0;t<e;t+=4)v(this,t,t+3),v(this,t+1,t+2);return this},c.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError(\"Buffer size must be a multiple of 64-bits\");for(var t=0;t<e;t+=8)v(this,t,t+7),v(this,t+1,t+6),v(this,t+2,t+5),v(this,t+3,t+4);return this},c.prototype.toString=function(){var e=0|this.length;return 0===e?\"\":0===arguments.length?C(this,0,e):m.apply(this,arguments)},c.prototype.equals=function(e){if(!c.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");return this===e||0===c.compare(this,e)},c.prototype.inspect=function(){var e=\"\",n=t.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString(\"hex\",0,n).match(/.{2}/g).join(\" \"),this.length>n&&(e+=\" ... \")),\"<Buffer \"+e+\">\"},c.prototype.compare=function(e,t,n,r,a){if(!c.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===a&&(a=this.length),t<0||n>e.length||r<0||a>this.length)throw new RangeError(\"out of range index\");if(r>=a&&t>=n)return 0;if(r>=a)return-1;if(t>=n)return 1;if(this===e)return 0;for(var o=(a>>>=0)-(r>>>=0),i=(n>>>=0)-(t>>>=0),s=Math.min(o,i),u=this.slice(r,a),l=e.slice(t,n),p=0;p<s;++p)if(u[p]!==l[p]){o=u[p],i=l[p];break}return o<i?-1:i<o?1:0},c.prototype.includes=function(e,t,n){return-1!==this.indexOf(e,t,n)},c.prototype.indexOf=function(e,t,n){return g(this,e,t,n,!0)},c.prototype.lastIndexOf=function(e,t,n){return g(this,e,t,n,!1)},c.prototype.write=function(e,t,n,r){if(void 0===t)r=\"utf8\",n=this.length,t=0;else if(void 0===n&&\"string\"==typeof t)r=t,n=this.length,t=0;else{if(!isFinite(t))throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");t|=0,isFinite(n)?(n|=0,void 0===r&&(r=\"utf8\")):(r=n,n=void 0)}var a=this.length-t;if((void 0===n||n>a)&&(n=a),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");r||(r=\"utf8\");for(var o=!1;;)switch(r){case\"hex\":return b(this,e,t,n);case\"utf8\":case\"utf-8\":return E(this,e,t,n);case\"ascii\":return x(this,e,t,n);case\"latin1\":case\"binary\":return S(this,e,t,n);case\"base64\":return w(this,e,t,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return j(this,e,t,n);default:if(o)throw new TypeError(\"Unknown encoding: \"+r);r=(\"\"+r).toLowerCase(),o=!0}},c.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var _=4096;function A(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var a=t;a<n;++a)r+=String.fromCharCode(127&e[a]);return r}function k(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var a=t;a<n;++a)r+=String.fromCharCode(e[a]);return r}function I(e,t,n){var r=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>r)&&(n=r);for(var a=\"\",o=t;o<n;++o)a+=U(e[o]);return a}function P(e,t,n){for(var r=e.slice(t,n),a=\"\",o=0;o<r.length;o+=2)a+=String.fromCharCode(r[o]+256*r[o+1]);return a}function T(e,t,n){if(e%1!=0||e<0)throw new RangeError(\"offset is not uint\");if(e+t>n)throw new RangeError(\"Trying to access beyond buffer length\")}function R(e,t,n,r,a,o){if(!c.isBuffer(e))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(t>a||t<o)throw new RangeError('\"value\" argument is out of bounds');if(n+r>e.length)throw new RangeError(\"Index out of range\")}function N(e,t,n,r){t<0&&(t=65535+t+1);for(var a=0,o=Math.min(e.length-n,2);a<o;++a)e[n+a]=(t&255<<8*(r?a:1-a))>>>8*(r?a:1-a)}function M(e,t,n,r){t<0&&(t=4294967295+t+1);for(var a=0,o=Math.min(e.length-n,4);a<o;++a)e[n+a]=t>>>8*(r?a:3-a)&255}function q(e,t,n,r,a,o){if(n+r>e.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"Index out of range\")}function D(e,t,n,r,o){return o||q(e,0,n,4),a.write(e,t,n,r,23,4),n+4}function B(e,t,n,r,o){return o||q(e,0,n,8),a.write(e,t,n,r,52,8),n+8}c.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t<e&&(t=e),c.TYPED_ARRAY_SUPPORT)(n=this.subarray(e,t)).__proto__=c.prototype;else{var a=t-e;n=new c(a,void 0);for(var o=0;o<a;++o)n[o]=this[o+e]}return n},c.prototype.readUIntLE=function(e,t,n){e|=0,t|=0,n||T(e,t,this.length);for(var r=this[e],a=1,o=0;++o<t&&(a*=256);)r+=this[e+o]*a;return r},c.prototype.readUIntBE=function(e,t,n){e|=0,t|=0,n||T(e,t,this.length);for(var r=this[e+--t],a=1;t>0&&(a*=256);)r+=this[e+--t]*a;return r},c.prototype.readUInt8=function(e,t){return t||T(e,1,this.length),this[e]},c.prototype.readUInt16LE=function(e,t){return t||T(e,2,this.length),this[e]|this[e+1]<<8},c.prototype.readUInt16BE=function(e,t){return t||T(e,2,this.length),this[e]<<8|this[e+1]},c.prototype.readUInt32LE=function(e,t){return t||T(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},c.prototype.readUInt32BE=function(e,t){return t||T(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},c.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||T(e,t,this.length);for(var r=this[e],a=1,o=0;++o<t&&(a*=256);)r+=this[e+o]*a;return r>=(a*=128)&&(r-=Math.pow(2,8*t)),r},c.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||T(e,t,this.length);for(var r=t,a=1,o=this[e+--r];r>0&&(a*=256);)o+=this[e+--r]*a;return o>=(a*=128)&&(o-=Math.pow(2,8*t)),o},c.prototype.readInt8=function(e,t){return t||T(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},c.prototype.readInt16LE=function(e,t){t||T(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},c.prototype.readInt16BE=function(e,t){t||T(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},c.prototype.readInt32LE=function(e,t){return t||T(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},c.prototype.readInt32BE=function(e,t){return t||T(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},c.prototype.readFloatLE=function(e,t){return t||T(e,4,this.length),a.read(this,e,!0,23,4)},c.prototype.readFloatBE=function(e,t){return t||T(e,4,this.length),a.read(this,e,!1,23,4)},c.prototype.readDoubleLE=function(e,t){return t||T(e,8,this.length),a.read(this,e,!0,52,8)},c.prototype.readDoubleBE=function(e,t){return t||T(e,8,this.length),a.read(this,e,!1,52,8)},c.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||R(this,e,t,n,Math.pow(2,8*n)-1,0);var a=1,o=0;for(this[t]=255&e;++o<n&&(a*=256);)this[t+o]=e/a&255;return t+n},c.prototype.writeUIntBE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||R(this,e,t,n,Math.pow(2,8*n)-1,0);var a=n-1,o=1;for(this[t+a]=255&e;--a>=0&&(o*=256);)this[t+a]=e/o&255;return t+n},c.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,255,0),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},c.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},c.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},c.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):M(this,e,t,!0),t+4},c.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):M(this,e,t,!1),t+4},c.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var a=Math.pow(2,8*n-1);R(this,e,t,n,a-1,-a)}var o=0,i=1,s=0;for(this[t]=255&e;++o<n&&(i*=256);)e<0&&0===s&&0!==this[t+o-1]&&(s=1),this[t+o]=(e/i>>0)-s&255;return t+n},c.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var a=Math.pow(2,8*n-1);R(this,e,t,n,a-1,-a)}var o=n-1,i=1,s=0;for(this[t+o]=255&e;--o>=0&&(i*=256);)e<0&&0===s&&0!==this[t+o+1]&&(s=1),this[t+o]=(e/i>>0)-s&255;return t+n},c.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,127,-128),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},c.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},c.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},c.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):M(this,e,t,!0),t+4},c.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):M(this,e,t,!1),t+4},c.prototype.writeFloatLE=function(e,t,n){return D(this,e,t,!0,n)},c.prototype.writeFloatBE=function(e,t,n){return D(this,e,t,!1,n)},c.prototype.writeDoubleLE=function(e,t,n){return B(this,e,t,!0,n)},c.prototype.writeDoubleBE=function(e,t,n){return B(this,e,t,!1,n)},c.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError(\"targetStart out of bounds\");if(n<0||n>=this.length)throw new RangeError(\"sourceStart out of bounds\");if(r<0)throw new RangeError(\"sourceEnd out of bounds\");r>this.length&&(r=this.length),e.length-t<r-n&&(r=e.length-t+n);var a,o=r-n;if(this===e&&n<t&&t<r)for(a=o-1;a>=0;--a)e[a+t]=this[a+n];else if(o<1e3||!c.TYPED_ARRAY_SUPPORT)for(a=0;a<o;++a)e[a+t]=this[a+n];else Uint8Array.prototype.set.call(e,this.subarray(n,n+o),t);return o},c.prototype.fill=function(e,t,n,r){if(\"string\"==typeof e){if(\"string\"==typeof t?(r=t,t=0,n=this.length):\"string\"==typeof n&&(r=n,n=this.length),1===e.length){var a=e.charCodeAt(0);a<256&&(e=a)}if(void 0!==r&&\"string\"!=typeof r)throw new TypeError(\"encoding must be a string\");if(\"string\"==typeof r&&!c.isEncoding(r))throw new TypeError(\"Unknown encoding: \"+r)}else\"number\"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<n)throw new RangeError(\"Out of range index\");if(n<=t)return this;var o;if(t>>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),\"number\"==typeof e)for(o=t;o<n;++o)this[o]=e;else{var i=c.isBuffer(e)?e:V(new c(e,r).toString()),s=i.length;for(o=0;o<n-t;++o)this[o+t]=i[o%s]}return this};var L=/[^+\\/0-9A-Za-z-_]/g;function U(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function V(e,t){var n;t=t||1/0;for(var r=e.length,a=null,o=[],i=0;i<r;++i){if((n=e.charCodeAt(i))>55295&&n<57344){if(!a){if(n>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(i+1===r){(t-=3)>-1&&o.push(239,191,189);continue}a=n;continue}if(n<56320){(t-=3)>-1&&o.push(239,191,189),a=n;continue}n=65536+(a-55296<<10|n-56320)}else a&&(t-=3)>-1&&o.push(239,191,189);if(a=null,n<128){if((t-=1)<0)break;o.push(n)}else if(n<2048){if((t-=2)<0)break;o.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;o.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error(\"Invalid code point\");if((t-=4)<0)break;o.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return o}function z(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}(e).replace(L,\"\")).length<2)return\"\";for(;e.length%4!=0;)e+=\"=\";return e}(e))}function F(e,t,n,r){for(var a=0;a<r&&!(a+n>=t.length||a>=e.length);++a)t[a+n]=e[a];return a}}).call(this,n(182))},function(e,t){e.exports=require(\"base64-js\")},function(e,t){e.exports=require(\"ieee754\")},function(e,t){e.exports=require(\"isarray\")},function(e,t,n){var r=n(199),a=n(312);e.exports=function(e){if(r(e))return a(e)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(311);e.exports=r},function(e,t,n){n(74),n(107);var r=n(127);e.exports=r},function(e,t,n){var r=n(315);e.exports=r},function(e,t,n){var r=n(21),a=n(316);r({target:\"Array\",stat:!0,forced:!n(319)((function(e){Array.from(e)}))},{from:a})},function(e,t,n){var r=n(46),a=n(317);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw a(e),t}}},function(e,t,n){e.exports=n(492)},function(e,t,n){var r=n(310);e.exports=r},function(e,t){e.exports=function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(140),a=n(200);e.exports=function(e,t){var n=null==e?null:void 0!==r&&a(e)||e[\"@@iterator\"];if(null!=n){var o,i,s=[],c=!0,u=!1;try{for(n=n.call(e);!(c=(o=n.next()).done)&&(s.push(o.value),!t||s.length!==t);c=!0);}catch(e){u=!0,i=e}finally{try{c||null==n.return||n.return()}finally{if(u)throw i}}return s}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){n(74);var r=n(496),a=n(83),o=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.entries;return e===o||e instanceof Array&&t===o.entries||i.hasOwnProperty(a(e))?r:t}},function(e,t,n){var r=n(497);e.exports=r},function(e,t,n){n(126);var r=n(38);e.exports=r(\"Array\").entries},function(e,t,n){var r=n(499);e.exports=r},function(e,t,n){n(500);var r=n(38);e.exports=r(\"Array\").forEach},function(e,t,n){\"use strict\";var r=n(21),a=n(501);r({target:\"Array\",proto:!0,forced:[].forEach!=a},{forEach:a})},function(e,t,n){\"use strict\";var r=n(73).forEach,a=n(94)(\"forEach\");e.exports=a?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},function(e,t,n){var r=n(503);e.exports=r},function(e,t,n){var r=n(504),a=Array.prototype;e.exports=function(e){var t=e.sort;return e===a||e instanceof Array&&t===a.sort?r:t}},function(e,t,n){n(505);var r=n(38);e.exports=r(\"Array\").sort},function(e,t,n){\"use strict\";var r=n(21),a=n(66),o=n(53),i=n(60),s=n(34),c=n(506),u=n(94),l=n(507),p=n(508),f=n(106),d=n(509),h=[],m=h.sort,v=s((function(){h.sort(void 0)})),g=s((function(){h.sort(null)})),y=u(\"sort\"),b=!s((function(){if(f)return f<70;if(!(l&&l>3)){if(p)return!0;if(d)return d<603;var e,t,n,r,a=\"\";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)h.push({k:t+r,v:n})}for(h.sort((function(e,t){return t.v-e.v})),r=0;r<h.length;r++)t=h[r].k.charAt(0),a.charAt(a.length-1)!==t&&(a+=t);return\"DGBEFHACIJK\"!==a}}));r({target:\"Array\",proto:!0,forced:v||!g||!y||!b},{sort:function(e){void 0!==e&&a(e);var t=o(this);if(b)return void 0===e?m.call(t):m.call(t,e);var n,r,s=[],u=i(t.length);for(r=0;r<u;r++)r in t&&s.push(t[r]);for(n=(s=c(s,function(e){return function(t,n){return void 0===n?-1:void 0===t?1:void 0!==e?+e(t,n)||0:String(t)>String(n)?1:-1}}(e))).length,r=0;r<n;)t[r]=s[r++];for(;r<u;)delete t[r++];return t}})},function(e,t){var n=Math.floor,r=function(e,t){var i=e.length,s=n(i/2);return i<8?a(e,t):o(r(e.slice(0,s),t),r(e.slice(s),t),t)},a=function(e,t){for(var n,r,a=e.length,o=1;o<a;){for(r=o,n=e[o];r&&t(e[r-1],n)>0;)e[r]=e[--r];r!==o++&&(e[r]=n)}return e},o=function(e,t,n){for(var r=e.length,a=t.length,o=0,i=0,s=[];o<r||i<a;)o<r&&i<a?s.push(n(e[o],t[i])<=0?e[o++]:t[i++]):s.push(o<r?e[o++]:t[i++]);return s};e.exports=r},function(e,t,n){var r=n(91).match(/firefox\\/(\\d+)/i);e.exports=!!r&&+r[1]},function(e,t,n){var r=n(91);e.exports=/MSIE|Trident/.test(r)},function(e,t,n){var r=n(91).match(/AppleWebKit\\/(\\d+)\\./);e.exports=!!r&&+r[1]},function(e,t,n){var r=n(511);e.exports=r},function(e,t,n){var r=n(512),a=Array.prototype;e.exports=function(e){var t=e.some;return e===a||e instanceof Array&&t===a.some?r:t}},function(e,t,n){n(513);var r=n(38);e.exports=r(\"Array\").some},function(e,t,n){\"use strict\";var r=n(21),a=n(73).some;r({target:\"Array\",proto:!0,forced:!n(94)(\"some\")},{some:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(515);e.exports=r},function(e,t,n){var r=n(516),a=n(518),o=Array.prototype,i=String.prototype;e.exports=function(e){var t=e.includes;return e===o||e instanceof Array&&t===o.includes?r:\"string\"==typeof e||e===i||e instanceof String&&t===i.includes?a:t}},function(e,t,n){n(517);var r=n(38);e.exports=r(\"Array\").includes},function(e,t,n){\"use strict\";var r=n(21),a=n(189).includes,o=n(197);r({target:\"Array\",proto:!0},{includes:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}}),o(\"includes\")},function(e,t,n){n(519);var r=n(38);e.exports=r(\"String\").includes},function(e,t,n){\"use strict\";var r=n(21),a=n(323),o=n(89);r({target:\"String\",proto:!0,forced:!n(324)(\"includes\")},{includes:function(e){return!!~String(o(this)).indexOf(a(e),arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(42),a=n(120),o=n(37)(\"match\");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:\"RegExp\"==a(e))}},function(e,t,n){var r=n(325);e.exports=r},function(e,t,n){n(523);var r=n(38);e.exports=r(\"Array\").indexOf},function(e,t,n){\"use strict\";var r=n(21),a=n(189).indexOf,o=n(94),i=[].indexOf,s=!!i&&1/[1].indexOf(1,-0)<0,c=o(\"indexOf\");r({target:\"Array\",proto:!0,forced:s||!c},{indexOf:function(e){return s?i.apply(this,arguments)||0:a(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(525);e.exports=r},function(e,t,n){var r=n(526),a=Array.prototype;e.exports=function(e){var t=e.find;return e===a||e instanceof Array&&t===a.find?r:t}},function(e,t,n){n(527);var r=n(38);e.exports=r(\"Array\").find},function(e,t,n){\"use strict\";var r=n(21),a=n(73).find,o=n(197),i=\"find\",s=!0;i in[]&&Array(1).find((function(){s=!1})),r({target:\"Array\",proto:!0,forced:s},{find:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}}),o(i)},function(e,t,n){var r=n(529);e.exports=r},function(e,t,n){var r=n(530),a=String.prototype;e.exports=function(e){var t=e.startsWith;return\"string\"==typeof e||e===a||e instanceof String&&t===a.startsWith?r:t}},function(e,t,n){n(531);var r=n(38);e.exports=r(\"String\").startsWith},function(e,t,n){\"use strict\";var r,a=n(21),o=n(104).f,i=n(60),s=n(323),c=n(89),u=n(324),l=n(81),p=\"\".startsWith,f=Math.min,d=u(\"startsWith\");a({target:\"String\",proto:!0,forced:!!(l||d||(r=o(String.prototype,\"startsWith\"),!r||r.writable))&&!d},{startsWith:function(e){var t=String(c(this));s(e);var n=i(f(arguments.length>1?arguments[1]:void 0,t.length)),r=String(e);return p?p.call(t,r,n):t.slice(n,n+r.length)===r}})},function(e,t,n){var r=n(533);e.exports=r},function(e,t,n){var r=n(534),a=String.prototype;e.exports=function(e){var t=e.trim;return\"string\"==typeof e||e===a||e instanceof String&&t===a.trim?r:t}},function(e,t,n){n(535);var r=n(38);e.exports=r(\"String\").trim},function(e,t,n){\"use strict\";var r=n(21),a=n(536).trim;r({target:\"String\",proto:!0,forced:n(537)(\"trim\")},{trim:function(){return a(this)}})},function(e,t,n){var r=n(89),a=\"[\"+n(326)+\"]\",o=RegExp(\"^\"+a+a+\"*\"),i=RegExp(a+a+\"*$\"),s=function(e){return function(t){var n=String(r(t));return 1&e&&(n=n.replace(o,\"\")),2&e&&(n=n.replace(i,\"\")),n}};e.exports={start:s(1),end:s(2),trim:s(3)}},function(e,t,n){var r=n(34),a=n(326);e.exports=function(e){return r((function(){return!!a[e]()||\"​᠎\"!=\"​᠎\"[e]()||a[e].name!==e}))}},function(e,t,n){var r=n(76),a=n(216);e.exports=function(e){return a(r(e).toLowerCase())}},function(e,t,n){var r=n(109),a=Object.prototype,o=a.hasOwnProperty,i=a.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=o.call(e,s),n=e[s];try{e[s]=void 0;var r=!0}catch(e){}var a=i.call(e);return r&&(t?e[s]=n:delete e[s]),a}},function(e,t){var n=Object.prototype.toString;e.exports=function(e){return n.call(e)}},function(e,t,n){var r=n(542),a=n(331),o=n(543),i=n(76);e.exports=function(e){return function(t){t=i(t);var n=a(t)?o(t):void 0,s=n?n[0]:t.charAt(0),c=n?r(n,1).join(\"\"):t.slice(1);return s[e]()+c}}},function(e,t,n){var r=n(330);e.exports=function(e,t,n){var a=e.length;return n=void 0===n?a:n,!t&&n>=a?e:r(e,t,n)}},function(e,t,n){var r=n(544),a=n(331),o=n(545);e.exports=function(e){return a(e)?o(e):r(e)}},function(e,t){e.exports=function(e){return e.split(\"\")}},function(e,t){var n=\"[\\\\ud800-\\\\udfff]\",r=\"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\",a=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",o=\"[^\\\\ud800-\\\\udfff]\",i=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",s=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",c=\"(?:\"+r+\"|\"+a+\")\"+\"?\",u=\"[\\\\ufe0e\\\\ufe0f]?\",l=u+c+(\"(?:\\\\u200d(?:\"+[o,i,s].join(\"|\")+\")\"+u+c+\")*\"),p=\"(?:\"+[o+r+\"?\",r,i,s,n].join(\"|\")+\")\",f=RegExp(a+\"(?=\"+a+\")|\"+p+l,\"g\");e.exports=function(e){return e.match(f)||[]}},function(e,t,n){var r=n(332),a=n(547),o=n(550),i=RegExp(\"['’]\",\"g\");e.exports=function(e){return function(t){return r(o(a(t).replace(i,\"\")),e,\"\")}}},function(e,t,n){var r=n(548),a=n(76),o=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,i=RegExp(\"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\",\"g\");e.exports=function(e){return(e=a(e))&&e.replace(o,r).replace(i,\"\")}},function(e,t,n){var r=n(549)({\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ã\":\"A\",\"Ä\":\"A\",\"Å\":\"A\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ã\":\"a\",\"ä\":\"a\",\"å\":\"a\",\"Ç\":\"C\",\"ç\":\"c\",\"Ð\":\"D\",\"ð\":\"d\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ë\":\"E\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ë\":\"e\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ï\":\"I\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ï\":\"i\",\"Ñ\":\"N\",\"ñ\":\"n\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Õ\":\"O\",\"Ö\":\"O\",\"Ø\":\"O\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"õ\":\"o\",\"ö\":\"o\",\"ø\":\"o\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ü\":\"U\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ü\":\"u\",\"Ý\":\"Y\",\"ý\":\"y\",\"ÿ\":\"y\",\"Æ\":\"Ae\",\"æ\":\"ae\",\"Þ\":\"Th\",\"þ\":\"th\",\"ß\":\"ss\",\"Ā\":\"A\",\"Ă\":\"A\",\"Ą\":\"A\",\"ā\":\"a\",\"ă\":\"a\",\"ą\":\"a\",\"Ć\":\"C\",\"Ĉ\":\"C\",\"Ċ\":\"C\",\"Č\":\"C\",\"ć\":\"c\",\"ĉ\":\"c\",\"ċ\":\"c\",\"č\":\"c\",\"Ď\":\"D\",\"Đ\":\"D\",\"ď\":\"d\",\"đ\":\"d\",\"Ē\":\"E\",\"Ĕ\":\"E\",\"Ė\":\"E\",\"Ę\":\"E\",\"Ě\":\"E\",\"ē\":\"e\",\"ĕ\":\"e\",\"ė\":\"e\",\"ę\":\"e\",\"ě\":\"e\",\"Ĝ\":\"G\",\"Ğ\":\"G\",\"Ġ\":\"G\",\"Ģ\":\"G\",\"ĝ\":\"g\",\"ğ\":\"g\",\"ġ\":\"g\",\"ģ\":\"g\",\"Ĥ\":\"H\",\"Ħ\":\"H\",\"ĥ\":\"h\",\"ħ\":\"h\",\"Ĩ\":\"I\",\"Ī\":\"I\",\"Ĭ\":\"I\",\"Į\":\"I\",\"İ\":\"I\",\"ĩ\":\"i\",\"ī\":\"i\",\"ĭ\":\"i\",\"į\":\"i\",\"ı\":\"i\",\"Ĵ\":\"J\",\"ĵ\":\"j\",\"Ķ\":\"K\",\"ķ\":\"k\",\"ĸ\":\"k\",\"Ĺ\":\"L\",\"Ļ\":\"L\",\"Ľ\":\"L\",\"Ŀ\":\"L\",\"Ł\":\"L\",\"ĺ\":\"l\",\"ļ\":\"l\",\"ľ\":\"l\",\"ŀ\":\"l\",\"ł\":\"l\",\"Ń\":\"N\",\"Ņ\":\"N\",\"Ň\":\"N\",\"Ŋ\":\"N\",\"ń\":\"n\",\"ņ\":\"n\",\"ň\":\"n\",\"ŋ\":\"n\",\"Ō\":\"O\",\"Ŏ\":\"O\",\"Ő\":\"O\",\"ō\":\"o\",\"ŏ\":\"o\",\"ő\":\"o\",\"Ŕ\":\"R\",\"Ŗ\":\"R\",\"Ř\":\"R\",\"ŕ\":\"r\",\"ŗ\":\"r\",\"ř\":\"r\",\"Ś\":\"S\",\"Ŝ\":\"S\",\"Ş\":\"S\",\"Š\":\"S\",\"ś\":\"s\",\"ŝ\":\"s\",\"ş\":\"s\",\"š\":\"s\",\"Ţ\":\"T\",\"Ť\":\"T\",\"Ŧ\":\"T\",\"ţ\":\"t\",\"ť\":\"t\",\"ŧ\":\"t\",\"Ũ\":\"U\",\"Ū\":\"U\",\"Ŭ\":\"U\",\"Ů\":\"U\",\"Ű\":\"U\",\"Ų\":\"U\",\"ũ\":\"u\",\"ū\":\"u\",\"ŭ\":\"u\",\"ů\":\"u\",\"ű\":\"u\",\"ų\":\"u\",\"Ŵ\":\"W\",\"ŵ\":\"w\",\"Ŷ\":\"Y\",\"ŷ\":\"y\",\"Ÿ\":\"Y\",\"Ź\":\"Z\",\"Ż\":\"Z\",\"Ž\":\"Z\",\"ź\":\"z\",\"ż\":\"z\",\"ž\":\"z\",\"Ĳ\":\"IJ\",\"ĳ\":\"ij\",\"Œ\":\"Oe\",\"œ\":\"oe\",\"ŉ\":\"'n\",\"ſ\":\"s\"});e.exports=r},function(e,t){e.exports=function(e){return function(t){return null==e?void 0:e[t]}}},function(e,t,n){var r=n(551),a=n(552),o=n(76),i=n(553);e.exports=function(e,t,n){return e=o(e),void 0===(t=n?void 0:t)?a(e)?i(e):r(e):e.match(t)||[]}},function(e,t){var n=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;e.exports=function(e){return e.match(n)||[]}},function(e,t){var n=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;e.exports=function(e){return n.test(e)}},function(e,t){var n=\"\\\\u2700-\\\\u27bf\",r=\"a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\",a=\"A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\",o=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",i=\"[\"+o+\"]\",s=\"\\\\d+\",c=\"[\\\\u2700-\\\\u27bf]\",u=\"[\"+r+\"]\",l=\"[^\\\\ud800-\\\\udfff\"+o+s+n+r+a+\"]\",p=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",f=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",d=\"[\"+a+\"]\",h=\"(?:\"+u+\"|\"+l+\")\",m=\"(?:\"+d+\"|\"+l+\")\",v=\"(?:['’](?:d|ll|m|re|s|t|ve))?\",g=\"(?:['’](?:D|LL|M|RE|S|T|VE))?\",y=\"(?:[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]|\\\\ud83c[\\\\udffb-\\\\udfff])?\",b=\"[\\\\ufe0e\\\\ufe0f]?\",E=b+y+(\"(?:\\\\u200d(?:\"+[\"[^\\\\ud800-\\\\udfff]\",p,f].join(\"|\")+\")\"+b+y+\")*\"),x=\"(?:\"+[c,p,f].join(\"|\")+\")\"+E,S=RegExp([d+\"?\"+u+\"+\"+v+\"(?=\"+[i,d,\"$\"].join(\"|\")+\")\",m+\"+\"+g+\"(?=\"+[i,d+h,\"$\"].join(\"|\")+\")\",d+\"?\"+h+\"+\"+v,d+\"+\"+g,\"\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\",\"\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\",s,x].join(\"|\"),\"g\");e.exports=function(e){return e.match(S)||[]}},function(e,t,n){var r=n(555),a=n(153),o=n(202);e.exports=function(){this.size=0,this.__data__={hash:new r,map:new(o||a),string:new r}}},function(e,t,n){var r=n(556),a=n(561),o=n(562),i=n(563),s=n(564);function c(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}c.prototype.clear=r,c.prototype.delete=a,c.prototype.get=o,c.prototype.has=i,c.prototype.set=s,e.exports=c},function(e,t,n){var r=n(152);e.exports=function(){this.__data__=r?r(null):{},this.size=0}},function(e,t,n){var r=n(101),a=n(558),o=n(50),i=n(333),s=/^\\[object .+?Constructor\\]$/,c=Function.prototype,u=Object.prototype,l=c.toString,p=u.hasOwnProperty,f=RegExp(\"^\"+l.call(p).replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");e.exports=function(e){return!(!o(e)||a(e))&&(r(e)?f:s).test(i(e))}},function(e,t,n){var r,a=n(559),o=(r=/[^.]+$/.exec(a&&a.keys&&a.keys.IE_PROTO||\"\"))?\"Symbol(src)_1.\"+r:\"\";e.exports=function(e){return!!o&&o in e}},function(e,t,n){var r=n(62)[\"__core-js_shared__\"];e.exports=r},function(e,t){e.exports=function(e,t){return null==e?void 0:e[t]}},function(e,t){e.exports=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},function(e,t,n){var r=n(152),a=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;if(r){var n=t[e];return\"__lodash_hash_undefined__\"===n?void 0:n}return a.call(t,e)?t[e]:void 0}},function(e,t,n){var r=n(152),a=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;return r?void 0!==t[e]:a.call(t,e)}},function(e,t,n){var r=n(152);e.exports=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=r&&void 0===t?\"__lodash_hash_undefined__\":t,this}},function(e,t){e.exports=function(){this.__data__=[],this.size=0}},function(e,t,n){var r=n(154),a=Array.prototype.splice;e.exports=function(e){var t=this.__data__,n=r(t,e);return!(n<0)&&(n==t.length-1?t.pop():a.call(t,n,1),--this.size,!0)}},function(e,t,n){var r=n(154);e.exports=function(e){var t=this.__data__,n=r(t,e);return n<0?void 0:t[n][1]}},function(e,t,n){var r=n(154);e.exports=function(e){return r(this.__data__,e)>-1}},function(e,t,n){var r=n(154);e.exports=function(e,t){var n=this.__data__,a=r(n,e);return a<0?(++this.size,n.push([e,t])):n[a][1]=t,this}},function(e,t,n){var r=n(155);e.exports=function(e){var t=r(this,e).delete(e);return this.size-=t?1:0,t}},function(e,t){e.exports=function(e){var t=typeof e;return\"string\"==t||\"number\"==t||\"symbol\"==t||\"boolean\"==t?\"__proto__\"!==e:null===e}},function(e,t,n){var r=n(155);e.exports=function(e){return r(this,e).get(e)}},function(e,t,n){var r=n(155);e.exports=function(e){return r(this,e).has(e)}},function(e,t,n){var r=n(155);e.exports=function(e,t){var n=r(this,e),a=n.size;return n.set(e,t),this.size+=n.size==a?0:1,this}},function(e,t,n){var r=n(156),a=n(98),o=n(97);e.exports=function(e){return function(t,n,i){var s=Object(t);if(!a(t)){var c=r(n,3);t=o(t),n=function(e){return c(s[e],e,s)}}var u=e(t,n,i);return u>-1?s[c?t[u]:u]:void 0}}},function(e,t,n){var r=n(577),a=n(602),o=n(345);e.exports=function(e){var t=a(e);return 1==t.length&&t[0][2]?o(t[0][0],t[0][1]):function(n){return n===e||r(n,e,t)}}},function(e,t,n){var r=n(203),a=n(334);e.exports=function(e,t,n,o){var i=n.length,s=i,c=!o;if(null==e)return!s;for(e=Object(e);i--;){var u=n[i];if(c&&u[2]?u[1]!==e[u[0]]:!(u[0]in e))return!1}for(;++i<s;){var l=(u=n[i])[0],p=e[l],f=u[1];if(c&&u[2]){if(void 0===p&&!(l in e))return!1}else{var d=new r;if(o)var h=o(p,f,l,e,t,d);if(!(void 0===h?a(f,p,3,o,d):h))return!1}}return!0}},function(e,t,n){var r=n(153);e.exports=function(){this.__data__=new r,this.size=0}},function(e,t){e.exports=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}},function(e,t){e.exports=function(e){return this.__data__.get(e)}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t,n){var r=n(153),a=n(202),o=n(201);e.exports=function(e,t){var n=this.__data__;if(n instanceof r){var i=n.__data__;if(!a||i.length<199)return i.push([e,t]),this.size=++n.size,this;n=this.__data__=new o(i)}return n.set(e,t),this.size=n.size,this}},function(e,t,n){var r=n(203),a=n(335),o=n(588),i=n(591),s=n(129),c=n(45),u=n(158),l=n(207),p=\"[object Arguments]\",f=\"[object Array]\",d=\"[object Object]\",h=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,m,v,g){var y=c(e),b=c(t),E=y?f:s(e),x=b?f:s(t),S=(E=E==p?d:E)==d,w=(x=x==p?d:x)==d,j=E==x;if(j&&u(e)){if(!u(t))return!1;y=!0,S=!1}if(j&&!S)return g||(g=new r),y||l(e)?a(e,t,n,m,v,g):o(e,t,E,n,m,v,g);if(!(1&n)){var O=S&&h.call(e,\"__wrapped__\"),C=w&&h.call(t,\"__wrapped__\");if(O||C){var _=O?e.value():e,A=C?t.value():t;return g||(g=new r),v(_,A,n,m,g)}}return!!j&&(g||(g=new r),i(e,t,n,m,v,g))}},function(e,t,n){var r=n(201),a=n(585),o=n(586);function i(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new r;++t<n;)this.add(e[t])}i.prototype.add=i.prototype.push=a,i.prototype.has=o,e.exports=i},function(e,t){e.exports=function(e){return this.__data__.set(e,\"__lodash_hash_undefined__\"),this}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t){e.exports=function(e,t){return e.has(t)}},function(e,t,n){var r=n(109),a=n(337),o=n(100),i=n(335),s=n(589),c=n(590),u=r?r.prototype:void 0,l=u?u.valueOf:void 0;e.exports=function(e,t,n,r,u,p,f){switch(n){case\"[object DataView]\":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case\"[object ArrayBuffer]\":return!(e.byteLength!=t.byteLength||!p(new a(e),new a(t)));case\"[object Boolean]\":case\"[object Date]\":case\"[object Number]\":return o(+e,+t);case\"[object Error]\":return e.name==t.name&&e.message==t.message;case\"[object RegExp]\":case\"[object String]\":return e==t+\"\";case\"[object Map]\":var d=s;case\"[object Set]\":var h=1&r;if(d||(d=c),e.size!=t.size&&!h)return!1;var m=f.get(e);if(m)return m==t;r|=2,f.set(e,t);var v=i(d(e),d(t),r,u,p,f);return f.delete(e),v;case\"[object Symbol]\":if(l)return l.call(e)==l.call(t)}return!1}},function(e,t){e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e,r){n[++t]=[r,e]})),n}},function(e,t){e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e){n[++t]=e})),n}},function(e,t,n){var r=n(338),a=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,o,i,s){var c=1&n,u=r(e),l=u.length;if(l!=r(t).length&&!c)return!1;for(var p=l;p--;){var f=u[p];if(!(c?f in t:a.call(t,f)))return!1}var d=s.get(e),h=s.get(t);if(d&&h)return d==t&&h==e;var m=!0;s.set(e,t),s.set(t,e);for(var v=c;++p<l;){var g=e[f=u[p]],y=t[f];if(o)var b=c?o(y,g,f,t,e,s):o(g,y,f,e,t,s);if(!(void 0===b?g===y||i(g,y,n,o,s):b)){m=!1;break}v||(v=\"constructor\"==f)}if(m&&!v){var E=e.constructor,x=t.constructor;E==x||!(\"constructor\"in e)||!(\"constructor\"in t)||\"function\"==typeof E&&E instanceof E&&\"function\"==typeof x&&x instanceof x||(m=!1)}return s.delete(e),s.delete(t),m}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,a=0,o=[];++n<r;){var i=e[n];t(i,n,e)&&(o[a++]=i)}return o}},function(e,t){e.exports=function(e,t){for(var n=-1,r=Array(e);++n<e;)r[n]=t(n);return r}},function(e,t,n){var r=n(95),a=n(75);e.exports=function(e){return a(e)&&\"[object Arguments]\"==r(e)}},function(e,t){e.exports=function(){return!1}},function(e,t,n){var r=n(95),a=n(208),o=n(75),i={};i[\"[object Float32Array]\"]=i[\"[object Float64Array]\"]=i[\"[object Int8Array]\"]=i[\"[object Int16Array]\"]=i[\"[object Int32Array]\"]=i[\"[object Uint8Array]\"]=i[\"[object Uint8ClampedArray]\"]=i[\"[object Uint16Array]\"]=i[\"[object Uint32Array]\"]=!0,i[\"[object Arguments]\"]=i[\"[object Array]\"]=i[\"[object ArrayBuffer]\"]=i[\"[object Boolean]\"]=i[\"[object DataView]\"]=i[\"[object Date]\"]=i[\"[object Error]\"]=i[\"[object Function]\"]=i[\"[object Map]\"]=i[\"[object Number]\"]=i[\"[object Object]\"]=i[\"[object RegExp]\"]=i[\"[object Set]\"]=i[\"[object String]\"]=i[\"[object WeakMap]\"]=!1,e.exports=function(e){return o(e)&&a(e.length)&&!!i[r(e)]}},function(e,t,n){var r=n(343)(Object.keys,Object);e.exports=r},function(e,t,n){var r=n(96)(n(62),\"DataView\");e.exports=r},function(e,t,n){var r=n(96)(n(62),\"Promise\");e.exports=r},function(e,t,n){var r=n(96)(n(62),\"Set\");e.exports=r},function(e,t,n){var r=n(96)(n(62),\"WeakMap\");e.exports=r},function(e,t,n){var r=n(344),a=n(97);e.exports=function(e){for(var t=a(e),n=t.length;n--;){var o=t[n],i=e[o];t[n]=[o,i,r(i)]}return t}},function(e,t,n){var r=n(334),a=n(39),o=n(346),i=n(211),s=n(344),c=n(345),u=n(111);e.exports=function(e,t){return i(e)&&s(t)?c(u(e),t):function(n){var i=a(n,e);return void 0===i&&i===t?o(n,e):r(t,i,3)}}},function(e,t,n){var r=n(605),a=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,o=/\\\\(\\\\)?/g,i=r((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(\"\"),e.replace(a,(function(e,n,r,a){t.push(r?a.replace(o,\"$1\"):n||e)})),t}));e.exports=i},function(e,t,n){var r=n(217);e.exports=function(e){var t=r(e,(function(e){return 500===n.size&&n.clear(),e})),n=t.cache;return t}},function(e,t){e.exports=function(e,t){return null!=e&&t in Object(e)}},function(e,t,n){var r=n(110),a=n(157),o=n(45),i=n(159),s=n(208),c=n(111);e.exports=function(e,t,n){for(var u=-1,l=(t=r(t,e)).length,p=!1;++u<l;){var f=c(t[u]);if(!(p=null!=e&&n(e,f)))break;e=e[f]}return p||++u!=l?p:!!(l=null==e?0:e.length)&&s(l)&&i(f,l)&&(o(e)||a(e))}},function(e,t,n){var r=n(609),a=n(610),o=n(211),i=n(111);e.exports=function(e){return o(e)?r(i(e)):a(e)}},function(e,t){e.exports=function(e){return function(t){return null==t?void 0:t[e]}}},function(e,t,n){var r=n(160);e.exports=function(e){return function(t){return r(t,e)}}},function(e,t,n){var r=n(612),a=n(156),o=n(347),i=Math.max;e.exports=function(e,t,n){var s=null==e?0:e.length;if(!s)return-1;var c=null==n?0:o(n);return c<0&&(c=i(s+c,0)),r(e,a(t,3),c)}},function(e,t){e.exports=function(e,t,n,r){for(var a=e.length,o=n+(r?1:-1);r?o--:++o<a;)if(t(e[o],o,e))return o;return-1}},function(e,t,n){var r=n(348),a=1/0;e.exports=function(e){return e?(e=r(e))===a||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},function(e,t,n){var r=n(615),a=/^\\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(a,\"\"):e}},function(e,t){var n=/\\s/;e.exports=function(e){for(var t=e.length;t--&&n.test(e.charAt(t)););return t}},function(e,t,n){var r=n(349);e.exports=function(e,t){var n;return r(e,(function(e,r,a){return!(n=t(e,r,a))})),!!n}},function(e,t,n){var r=n(618),a=n(97);e.exports=function(e,t){return e&&r(e,t,a)}},function(e,t,n){var r=n(619)();e.exports=r},function(e,t){e.exports=function(e){return function(t,n,r){for(var a=-1,o=Object(t),i=r(t),s=i.length;s--;){var c=i[e?s:++a];if(!1===n(o[c],c,o))break}return t}}},function(e,t,n){var r=n(98);e.exports=function(e,t){return function(n,a){if(null==n)return n;if(!r(n))return e(n,a);for(var o=n.length,i=t?o:-1,s=Object(n);(t?i--:++i<o)&&!1!==a(s[i],i,s););return n}}},function(e,t){var n,r,a=e.exports={};function o(){throw new Error(\"setTimeout has not been defined\")}function i(){throw new Error(\"clearTimeout has not been defined\")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===o||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n=\"function\"==typeof setTimeout?setTimeout:o}catch(e){n=o}try{r=\"function\"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var c,u=[],l=!1,p=-1;function f(){l&&c&&(l=!1,c.length?u=c.concat(u):p=-1,u.length&&d())}function d(){if(!l){var e=s(f);l=!0;for(var t=u.length;t;){for(c=u,u=[];++p<t;)c&&c[p].run();p=-1,t=u.length}c=null,l=!1,function(e){if(r===clearTimeout)return clearTimeout(e);if((r===i||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}(e)}}function h(e,t){this.fun=e,this.array=t}function m(){}a.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];u.push(new h(e,t)),1!==u.length||l||s(d)},h.prototype.run=function(){this.fun.apply(null,this.array)},a.title=\"browser\",a.browser=!0,a.env={},a.argv=[],a.version=\"\",a.versions={},a.on=m,a.addListener=m,a.once=m,a.off=m,a.removeListener=m,a.removeAllListeners=m,a.emit=m,a.prependListener=m,a.prependOnceListener=m,a.listeners=function(e){return[]},a.binding=function(e){throw new Error(\"process.binding is not supported\")},a.cwd=function(){return\"/\"},a.chdir=function(e){throw new Error(\"process.chdir is not supported\")},a.umask=function(){return 0}},function(e,t){var n={\"&\":\"&amp;\",'\"':\"&quot;\",\"'\":\"&apos;\",\"<\":\"&lt;\",\">\":\"&gt;\"};e.exports=function(e){return e&&e.replace?e.replace(/([&\"<>'])/g,(function(e,t){return n[t]})):e}},function(e,t){e.exports=require(\"stream\")},function(e,t,n){var r=n(625);e.exports=r},function(e,t,n){var r=n(626),a=Array.prototype;e.exports=function(e){var t=e.every;return e===a||e instanceof Array&&t===a.every?r:t}},function(e,t,n){n(627);var r=n(38);e.exports=r(\"Array\").every},function(e,t,n){\"use strict\";var r=n(21),a=n(73).every;r({target:\"Array\",proto:!0,forced:!n(94)(\"every\")},{every:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t){e.exports=function(e,t,n,r,a){return a(e,(function(e,a,o){n=r?(r=!1,e):t(n,e,a,o)})),n}},function(e,t,n){var r=n(305);e.exports=r},function(e,t,n){var r=n(631);e.exports=r},function(e,t,n){n(294);var r=n(31);e.exports=r.Object.getOwnPropertySymbols},function(e,t,n){e.exports=n(633)},function(e,t,n){var r=n(304);e.exports=r},function(e,t,n){e.exports=n(635)},function(e,t,n){var r=n(636);e.exports=r},function(e,t,n){n(637);var r=n(31).Object,a=e.exports=function(e,t){return r.getOwnPropertyDescriptor(e,t)};r.getOwnPropertyDescriptor.sham&&(a.sham=!0)},function(e,t,n){var r=n(21),a=n(34),o=n(57),i=n(104).f,s=n(43),c=a((function(){i(1)}));r({target:\"Object\",stat:!0,forced:!s||c,sham:!s},{getOwnPropertyDescriptor:function(e,t){return i(o(e),t)}})},function(e,t,n){e.exports=n(639)},function(e,t,n){var r=n(322);e.exports=r},function(e,t,n){e.exports=n(641)},function(e,t,n){var r=n(642);e.exports=r},function(e,t,n){n(643);var r=n(31);e.exports=r.Object.getOwnPropertyDescriptors},function(e,t,n){var r=n(21),a=n(43),o=n(644),i=n(57),s=n(104),c=n(122);r({target:\"Object\",stat:!0,sham:!a},{getOwnPropertyDescriptors:function(e){for(var t,n,r=i(e),a=s.f,u=o(r),l={},p=0;u.length>p;)void 0!==(n=a(r,t=u[p++]))&&c(l,t,n);return l}})},function(e,t,n){var r=n(61),a=n(192),o=n(193),i=n(46);e.exports=r(\"Reflect\",\"ownKeys\")||function(e){var t=a.f(i(e)),n=o.f;return n?t.concat(n(e)):t}},function(e,t,n){e.exports=n(646)},function(e,t,n){var r=n(647);e.exports=r},function(e,t,n){n(648);var r=n(31).Object,a=e.exports=function(e,t){return r.defineProperties(e,t)};r.defineProperties.sham&&(a.sham=!0)},function(e,t,n){var r=n(21),a=n(43);r({target:\"Object\",stat:!0,forced:!a,sham:!a},{defineProperties:n(188)})},function(e,t,n){var r=n(325);e.exports=r},function(e,t,n){var r=n(351),a=n(353);e.exports=function(e,t){if(null==e)return{};var n,o,i={},s=r(e);for(o=0;o<s.length;o++)n=s[o],a(t).call(t,n)>=0||(i[n]=e[n]);return i},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(652)},function(e,t,n){var r=n(354);n(659),n(660),n(661),n(662),e.exports=r},function(e,t,n){\"use strict\";var r,a,o,i,s=n(21),c=n(81),u=n(36),l=n(61),p=n(356),f=n(93),d=n(130),h=n(148),m=n(82),v=n(357),g=n(42),y=n(66),b=n(112),E=n(298),x=n(99),S=n(319),w=n(358),j=n(359).set,O=n(654),C=n(361),_=n(656),A=n(131),k=n(161),I=n(67),P=n(292),T=n(37),R=n(657),N=n(149),M=n(106),q=T(\"species\"),D=\"Promise\",B=I.get,L=I.set,U=I.getterFor(D),V=p&&p.prototype,z=p,F=V,J=u.TypeError,W=u.document,H=u.process,$=A.f,Y=$,K=!!(W&&W.createEvent&&u.dispatchEvent),G=\"function\"==typeof PromiseRejectionEvent,Z=\"unhandledrejection\",X=!1,Q=P(D,(function(){var e=E(z)!==String(z);if(!e&&66===M)return!0;if(c&&!F.finally)return!0;if(M>=51&&/native code/.test(z))return!1;var t=new z((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};return(t.constructor={})[q]=n,!(X=t.then((function(){}))instanceof n)||!e&&R&&!G})),ee=Q||!S((function(e){z.all(e).catch((function(){}))})),te=function(e){var t;return!(!g(e)||\"function\"!=typeof(t=e.then))&&t},ne=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;O((function(){for(var r=e.value,a=1==e.state,o=0;n.length>o;){var i,s,c,u=n[o++],l=a?u.ok:u.fail,p=u.resolve,f=u.reject,d=u.domain;try{l?(a||(2===e.rejection&&ie(e),e.rejection=1),!0===l?i=r:(d&&d.enter(),i=l(r),d&&(d.exit(),c=!0)),i===u.promise?f(J(\"Promise-chain cycle\")):(s=te(i))?s.call(i,p,f):p(i)):f(r)}catch(e){d&&!c&&d.exit(),f(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&ae(e)}))}},re=function(e,t,n){var r,a;K?((r=W.createEvent(\"Event\")).promise=t,r.reason=n,r.initEvent(e,!1,!0),u.dispatchEvent(r)):r={promise:t,reason:n},!G&&(a=u[\"on\"+e])?a(r):e===Z&&_(\"Unhandled promise rejection\",n)},ae=function(e){j.call(u,(function(){var t,n=e.facade,r=e.value;if(oe(e)&&(t=k((function(){N?H.emit(\"unhandledRejection\",r,n):re(Z,n,r)})),e.rejection=N||oe(e)?2:1,t.error))throw t.value}))},oe=function(e){return 1!==e.rejection&&!e.parent},ie=function(e){j.call(u,(function(){var t=e.facade;N?H.emit(\"rejectionHandled\",t):re(\"rejectionhandled\",t,e.value)}))},se=function(e,t,n){return function(r){e(t,r,n)}},ce=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,ne(e,!0))},ue=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw J(\"Promise can't be resolved itself\");var r=te(t);r?O((function(){var n={done:!1};try{r.call(t,se(ue,n,e),se(ce,n,e))}catch(t){ce(n,t,e)}})):(e.value=t,e.state=1,ne(e,!1))}catch(t){ce({done:!1},t,e)}}};if(Q&&(F=(z=function(e){b(this,z,D),y(e),r.call(this);var t=B(this);try{e(se(ue,t),se(ce,t))}catch(e){ce(t,e)}}).prototype,(r=function(e){L(this,{type:D,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=d(F,{then:function(e,t){var n=U(this),r=$(w(this,z));return r.ok=\"function\"!=typeof e||e,r.fail=\"function\"==typeof t&&t,r.domain=N?H.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&ne(n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),a=function(){var e=new r,t=B(e);this.promise=e,this.resolve=se(ue,t),this.reject=se(ce,t)},A.f=$=function(e){return e===z||e===o?new a(e):Y(e)},!c&&\"function\"==typeof p&&V!==Object.prototype)){i=V.then,X||(f(V,\"then\",(function(e,t){var n=this;return new z((function(e,t){i.call(n,e,t)})).then(e,t)}),{unsafe:!0}),f(V,\"catch\",F.catch,{unsafe:!0}));try{delete V.constructor}catch(e){}h&&h(V,F)}s({global:!0,wrap:!0,forced:Q},{Promise:z}),m(z,D,!1,!0),v(D),o=l(D),s({target:D,stat:!0,forced:Q},{reject:function(e){var t=$(this);return t.reject.call(void 0,e),t.promise}}),s({target:D,stat:!0,forced:c||Q},{resolve:function(e){return C(c&&this===o?z:this,e)}}),s({target:D,stat:!0,forced:ee},{all:function(e){var t=this,n=$(t),r=n.resolve,a=n.reject,o=k((function(){var n=y(t.resolve),o=[],i=0,s=1;x(e,(function(e){var c=i++,u=!1;o.push(void 0),s++,n.call(t,e).then((function(e){u||(u=!0,o[c]=e,--s||r(o))}),a)})),--s||r(o)}));return o.error&&a(o.value),n.promise},race:function(e){var t=this,n=$(t),r=n.reject,a=k((function(){var a=y(t.resolve);x(e,(function(e){a.call(t,e).then(n.resolve,r)}))}));return a.error&&r(a.value),n.promise}})},function(e,t,n){var r,a,o,i,s,c,u,l,p=n(36),f=n(104).f,d=n(359).set,h=n(360),m=n(655),v=n(149),g=p.MutationObserver||p.WebKitMutationObserver,y=p.document,b=p.process,E=p.Promise,x=f(p,\"queueMicrotask\"),S=x&&x.value;S||(r=function(){var e,t;for(v&&(e=b.domain)&&e.exit();a;){t=a.fn,a=a.next;try{t()}catch(e){throw a?i():o=void 0,e}}o=void 0,e&&e.enter()},h||v||m||!g||!y?E&&E.resolve?((u=E.resolve(void 0)).constructor=E,l=u.then,i=function(){l.call(u,r)}):i=v?function(){b.nextTick(r)}:function(){d.call(p,r)}:(s=!0,c=y.createTextNode(\"\"),new g(r).observe(c,{characterData:!0}),i=function(){c.data=s=!s})),e.exports=S||function(e){var t={fn:e,next:void 0};o&&(o.next=t),a||(a=t,i()),o=t}},function(e,t,n){var r=n(91);e.exports=/web0s(?!.*chrome)/i.test(r)},function(e,t,n){var r=n(36);e.exports=function(e,t){var n=r.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},function(e,t){e.exports=\"object\"==typeof window},function(e,t,n){\"use strict\";var r=n(21),a=n(81),o=n(356),i=n(34),s=n(61),c=n(358),u=n(361),l=n(93);if(r({target:\"Promise\",proto:!0,real:!0,forced:!!o&&i((function(){o.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=c(this,s(\"Promise\")),n=\"function\"==typeof e;return this.then(n?function(n){return u(t,e()).then((function(){return n}))}:e,n?function(n){return u(t,e()).then((function(){throw n}))}:e)}}),!a&&\"function\"==typeof o){var p=s(\"Promise\").prototype.finally;o.prototype.finally!==p&&l(o.prototype,\"finally\",p,{unsafe:!0})}},function(e,t,n){n(355)},function(e,t,n){n(362)},function(e,t,n){\"use strict\";var r=n(21),a=n(131),o=n(161);r({target:\"Promise\",stat:!0},{try:function(e){var t=a.f(this),n=o(e);return(n.error?t.reject:t.resolve)(n.value),t.promise}})},function(e,t,n){n(363)},function(e,t){e.exports=require(\"regenerator-runtime\")},function(e,t,n){var r=n(306);e.exports=r},function(e,t,n){var r=n(354);e.exports=r},function(e,t,n){var r=n(667);e.exports=r},function(e,t,n){n(668);var r=n(31);e.exports=r.Object.values},function(e,t,n){var r=n(21),a=n(364).values;r({target:\"Object\",stat:!0},{values:function(e){return a(e)}})},function(e,t,n){var r=n(670);e.exports=r},function(e,t,n){n(671);var r=n(31);e.exports=r.Date.now},function(e,t,n){n(21)({target:\"Date\",stat:!0},{now:function(){return(new Date).getTime()}})},function(e,t,n){var r=n(62);e.exports=function(){return r.Date.now()}},function(e,t,n){e.exports=n(674)},function(e,t,n){var r=n(308);e.exports=r},function(e,t,n){e.exports=n(676)},function(e,t,n){var r=n(677);e.exports=r},function(e,t,n){n(678);var r=n(31).Object;e.exports=function(e,t){return r.create(e,t)}},function(e,t,n){n(21)({target:\"Object\",stat:!0,sham:!n(43)},{create:n(92)})},function(e,t,n){var r=n(368);function a(t,n){return e.exports=a=r||function(e,t){return e.__proto__=t,e},e.exports.default=e.exports,e.exports.__esModule=!0,a(t,n)}e.exports=a,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(681);e.exports=r},function(e,t,n){n(682);var r=n(31);e.exports=r.Object.setPrototypeOf},function(e,t,n){n(21)({target:\"Object\",stat:!0},{setPrototypeOf:n(148)})},function(e,t,n){var r=n(684);e.exports=r},function(e,t,n){n(685);var r=n(31);e.exports=r.Reflect.construct},function(e,t,n){var r=n(21),a=n(61),o=n(66),i=n(46),s=n(42),c=n(92),u=n(307),l=n(34),p=a(\"Reflect\",\"construct\"),f=l((function(){function e(){}return!(p((function(){}),[],e)instanceof e)})),d=!l((function(){p((function(){}))})),h=f||d;r({target:\"Reflect\",stat:!0,forced:h,sham:h},{construct:function(e,t){o(e),i(t);var n=arguments.length<3?e:o(arguments[2]);if(d&&!f)return p(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var r=[null];return r.push.apply(r,t),new(u.apply(e,r))}var a=n.prototype,l=c(s(a)?a:Object.prototype),h=Function.apply.call(e,l,t);return s(h)?h:l}})},function(e,t,n){var r=n(368),a=n(687);function o(t){return e.exports=o=r?a:function(e){return e.__proto__||a(e)},e.exports.default=e.exports,e.exports.__esModule=!0,o(t)}e.exports=o,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(688)},function(e,t,n){var r=n(689);e.exports=r},function(e,t,n){n(690);var r=n(31);e.exports=r.Object.getPrototypeOf},function(e,t,n){var r=n(21),a=n(34),o=n(53),i=n(147),s=n(303);r({target:\"Object\",stat:!0,forced:a((function(){i(1)})),sham:!s},{getPrototypeOf:function(e){return i(o(e))}})},function(e,t,n){var r=n(369);e.exports=function(){if(\"undefined\"==typeof Reflect||!r)return!1;if(r.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(r(Boolean,[],(function(){}))),!0}catch(e){return!1}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(18).default,a=n(10);e.exports=function(e,t){return!t||\"object\"!==r(t)&&\"function\"!=typeof t?a(e):t},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n<r&&!1!==t(e[n],n,e););return e}},function(e,t,n){var r=n(113),a=n(97);e.exports=function(e,t){return e&&r(t,a(t),e)}},function(e,t,n){var r=n(113),a=n(213);e.exports=function(e,t){return e&&r(t,a(t),e)}},function(e,t,n){var r=n(50),a=n(128),o=n(697),i=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return o(e);var t=a(e),n=[];for(var s in e)(\"constructor\"!=s||!t&&i.call(e,s))&&n.push(s);return n}},function(e,t){e.exports=function(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);return t}},function(e,t,n){(function(e){var r=n(62),a=t&&!t.nodeType&&t,o=a&&\"object\"==typeof e&&e&&!e.nodeType&&e,i=o&&o.exports===a?r.Buffer:void 0,s=i?i.allocUnsafe:void 0;e.exports=function(e,t){if(t)return e.slice();var n=e.length,r=s?s(n):new e.constructor(n);return e.copy(r),r}}).call(this,n(206)(e))},function(e,t){e.exports=function(e,t){var n=-1,r=e.length;for(t||(t=Array(r));++n<r;)t[n]=e[n];return t}},function(e,t,n){var r=n(113),a=n(205);e.exports=function(e,t){return r(e,a(e),t)}},function(e,t,n){var r=n(113),a=n(371);e.exports=function(e,t){return r(e,a(e),t)}},function(e,t){var n=Object.prototype.hasOwnProperty;e.exports=function(e){var t=e.length,r=new e.constructor(t);return t&&\"string\"==typeof e[0]&&n.call(e,\"index\")&&(r.index=e.index,r.input=e.input),r}},function(e,t,n){var r=n(215),a=n(704),o=n(705),i=n(706),s=n(707);e.exports=function(e,t,n){var c=e.constructor;switch(t){case\"[object ArrayBuffer]\":return r(e);case\"[object Boolean]\":case\"[object Date]\":return new c(+e);case\"[object DataView]\":return a(e,n);case\"[object Float32Array]\":case\"[object Float64Array]\":case\"[object Int8Array]\":case\"[object Int16Array]\":case\"[object Int32Array]\":case\"[object Uint8Array]\":case\"[object Uint8ClampedArray]\":case\"[object Uint16Array]\":case\"[object Uint32Array]\":return s(e,n);case\"[object Map]\":return new c;case\"[object Number]\":case\"[object String]\":return new c(e);case\"[object RegExp]\":return o(e);case\"[object Set]\":return new c;case\"[object Symbol]\":return i(e)}}},function(e,t,n){var r=n(215);e.exports=function(e,t){var n=t?r(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}},function(e,t){var n=/\\w*$/;e.exports=function(e){var t=new e.constructor(e.source,n.exec(e));return t.lastIndex=e.lastIndex,t}},function(e,t,n){var r=n(109),a=r?r.prototype:void 0,o=a?a.valueOf:void 0;e.exports=function(e){return o?Object(o.call(e)):{}}},function(e,t,n){var r=n(215);e.exports=function(e,t){var n=t?r(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}},function(e,t,n){var r=n(709),a=n(214),o=n(128);e.exports=function(e){return\"function\"!=typeof e.constructor||o(e)?{}:r(a(e))}},function(e,t,n){var r=n(50),a=Object.create,o=function(){function e(){}return function(t){if(!r(t))return{};if(a)return a(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();e.exports=o},function(e,t,n){var r=n(711),a=n(209),o=n(210),i=o&&o.isMap,s=i?a(i):r;e.exports=s},function(e,t,n){var r=n(129),a=n(75);e.exports=function(e){return a(e)&&\"[object Map]\"==r(e)}},function(e,t,n){var r=n(713),a=n(209),o=n(210),i=o&&o.isSet,s=i?a(i):r;e.exports=s},function(e,t,n){var r=n(129),a=n(75);e.exports=function(e){return a(e)&&\"[object Set]\"==r(e)}},function(e,t,n){var r=n(110),a=n(715),o=n(716),i=n(111);e.exports=function(e,t){return t=r(t,e),null==(e=o(e,t))||delete e[i(a(t))]}},function(e,t){e.exports=function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}},function(e,t,n){var r=n(160),a=n(330);e.exports=function(e,t){return t.length<2?e:r(e,a(t,0,-1))}},function(e,t,n){var r=n(132);e.exports=function(e){return r(e)?void 0:e}},function(e,t,n){var r=n(719);e.exports=function(e){return(null==e?0:e.length)?r(e,1):[]}},function(e,t,n){var r=n(204),a=n(720);e.exports=function e(t,n,o,i,s){var c=-1,u=t.length;for(o||(o=a),s||(s=[]);++c<u;){var l=t[c];n>0&&o(l)?n>1?e(l,n-1,o,i,s):r(s,l):i||(s[s.length]=l)}return s}},function(e,t,n){var r=n(109),a=n(157),o=n(45),i=r?r.isConcatSpreadable:void 0;e.exports=function(e){return o(e)||a(e)||!!(i&&e&&e[i])}},function(e,t){e.exports=function(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}},function(e,t,n){var r=n(723),a=n(367),o=n(212),i=a?function(e,t){return a(e,\"toString\",{configurable:!0,enumerable:!1,value:r(t),writable:!0})}:o;e.exports=i},function(e,t){e.exports=function(e){return function(){return e}}},function(e,t){var n=Date.now;e.exports=function(e){var t=0,r=0;return function(){var a=n(),o=16-(a-r);if(r=a,o>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}},function(e,t,n){var r=n(726);e.exports=r},function(e,t,n){var r=n(727),a=String.prototype;e.exports=function(e){var t=e.repeat;return\"string\"==typeof e||e===a||e instanceof String&&t===a.repeat?r:t}},function(e,t,n){n(728);var r=n(38);e.exports=r(\"String\").repeat},function(e,t,n){n(21)({target:\"String\",proto:!0},{repeat:n(729)})},function(e,t,n){\"use strict\";var r=n(105),a=n(89);e.exports=function(e){var t=String(a(this)),n=\"\",o=r(e);if(o<0||o==1/0)throw RangeError(\"Wrong number of repetitions\");for(;o>0;(o>>>=1)&&(t+=t))1&o&&(n+=t);return n}},function(e,t,n){var r=n(315);e.exports=r},function(e,t,n){var r=n(732);e.exports=r},function(e,t,n){n(733);var r=n(31);e.exports=r.Object.entries},function(e,t,n){var r=n(21),a=n(364).entries;r({target:\"Object\",stat:!0},{entries:function(e){return a(e)}})},function(e,t,n){var r=n(735),a=n(346);e.exports=function(e,t){return r(e,t,(function(t,n){return a(e,n)}))}},function(e,t,n){var r=n(160),a=n(365),o=n(110);e.exports=function(e,t,n){for(var i=-1,s=t.length,c={};++i<s;){var u=t[i],l=r(e,u);n(l,u)&&a(c,o(u,e),l)}return c}},function(e,t,n){var r=n(737);e.exports=r},function(e,t,n){var r=n(738),a=Array.prototype;e.exports=function(e){var t=e.splice;return e===a||e instanceof Array&&t===a.splice?r:t}},function(e,t,n){n(739);var r=n(38);e.exports=r(\"Array\").splice},function(e,t,n){\"use strict\";var r=n(21),a=n(190),o=n(105),i=n(60),s=n(53),c=n(184),u=n(122),l=n(123)(\"splice\"),p=Math.max,f=Math.min,d=9007199254740991,h=\"Maximum allowed length exceeded\";r({target:\"Array\",proto:!0,forced:!l},{splice:function(e,t){var n,r,l,m,v,g,y=s(this),b=i(y.length),E=a(e,b),x=arguments.length;if(0===x?n=r=0:1===x?(n=0,r=b-E):(n=x-2,r=f(p(o(t),0),b-E)),b+n-r>d)throw TypeError(h);for(l=c(y,r),m=0;m<r;m++)(v=E+m)in y&&u(l,m,y[v]);if(l.length=r,n<r){for(m=E;m<b-r;m++)g=m+n,(v=m+r)in y?y[g]=y[v]:delete y[g];for(m=b;m>b-r+n;m--)delete y[m-1]}else if(n>r)for(m=b-r;m>E;m--)g=m+n-1,(v=m+r-1)in y?y[g]=y[v]:delete y[g];for(m=0;m<n;m++)y[m+E]=arguments[m+2];return y.length=b-r+n,l}})},function(e,t,n){var r=n(741);e.exports=r},function(e,t,n){n(145),n(742),n(74);var r=n(31);e.exports=r.WeakMap},function(e,t,n){\"use strict\";var r,a=n(36),o=n(130),i=n(163),s=n(377),c=n(744),u=n(42),l=n(67).enforce,p=n(297),f=!a.ActiveXObject&&\"ActiveXObject\"in a,d=Object.isExtensible,h=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},m=e.exports=s(\"WeakMap\",h,c);if(p&&f){r=c.getConstructor(h,\"WeakMap\",!0),i.REQUIRED=!0;var v=m.prototype,g=v.delete,y=v.has,b=v.get,E=v.set;o(v,{delete:function(e){if(u(e)&&!d(e)){var t=l(this);return t.frozen||(t.frozen=new r),g.call(this,e)||t.frozen.delete(e)}return g.call(this,e)},has:function(e){if(u(e)&&!d(e)){var t=l(this);return t.frozen||(t.frozen=new r),y.call(this,e)||t.frozen.has(e)}return y.call(this,e)},get:function(e){if(u(e)&&!d(e)){var t=l(this);return t.frozen||(t.frozen=new r),y.call(this,e)?b.call(this,e):t.frozen.get(e)}return b.call(this,e)},set:function(e,t){if(u(e)&&!d(e)){var n=l(this);n.frozen||(n.frozen=new r),y.call(this,e)?E.call(this,e,t):n.frozen.set(e,t)}else E.call(this,e,t);return this}})}},function(e,t,n){var r=n(34);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},function(e,t,n){\"use strict\";var r=n(130),a=n(163).getWeakData,o=n(46),i=n(42),s=n(112),c=n(99),u=n(73),l=n(49),p=n(67),f=p.set,d=p.getterFor,h=u.find,m=u.findIndex,v=0,g=function(e){return e.frozen||(e.frozen=new y)},y=function(){this.entries=[]},b=function(e,t){return h(e.entries,(function(e){return e[0]===t}))};y.prototype={get:function(e){var t=b(this,e);if(t)return t[1]},has:function(e){return!!b(this,e)},set:function(e,t){var n=b(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=m(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,u){var p=e((function(e,r){s(e,p,t),f(e,{type:t,id:v++,frozen:void 0}),null!=r&&c(r,e[u],{that:e,AS_ENTRIES:n})})),h=d(t),m=function(e,t,n){var r=h(e),i=a(o(t),!0);return!0===i?g(r).set(t,n):i[r.id]=n,e};return r(p.prototype,{delete:function(e){var t=h(this);if(!i(e))return!1;var n=a(e);return!0===n?g(t).delete(e):n&&l(n,t.id)&&delete n[t.id]},has:function(e){var t=h(this);if(!i(e))return!1;var n=a(e);return!0===n?g(t).has(e):n&&l(n,t.id)}}),r(p.prototype,n?{get:function(e){var t=h(this);if(i(e)){var n=a(e);return!0===n?g(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return m(this,e,t)}}:{add:function(e){return m(this,e,!0)}}),p}}},function(e,t){e.exports=function(e,t,n){return e==e&&(void 0!==n&&(e=e<=n?e:n),void 0!==t&&(e=e>=t?e:t)),e}},function(e,t,n){var r=n(747),a=n(350);e.exports=function(e){return r((function(t,n){var r=-1,o=n.length,i=o>1?n[o-1]:void 0,s=o>2?n[2]:void 0;for(i=e.length>3&&\"function\"==typeof i?(o--,i):void 0,s&&a(n[0],n[1],s)&&(i=o<3?void 0:i,o=1),t=Object(t);++r<o;){var c=n[r];c&&e(t,c,r,i)}return t}))}},function(e,t,n){var r=n(212),a=n(374),o=n(375);e.exports=function(e,t){return o(a(e,t,r),e+\"\")}},function(e,t,n){var r=n(749);e.exports=r},function(e,t,n){n(750),n(753),n(379);var r=n(31);e.exports=r.URL},function(e,t,n){\"use strict\";n(107);var r,a=n(21),o=n(43),i=n(378),s=n(36),c=n(188),u=n(93),l=n(112),p=n(49),f=n(309),d=n(316),h=n(300).codeAt,m=n(751),v=n(82),g=n(379),y=n(67),b=s.URL,E=g.URLSearchParams,x=g.getState,S=y.set,w=y.getterFor(\"URL\"),j=Math.floor,O=Math.pow,C=\"Invalid scheme\",_=\"Invalid host\",A=\"Invalid port\",k=/[A-Za-z]/,I=/[\\d+-.A-Za-z]/,P=/\\d/,T=/^0x/i,R=/^[0-7]+$/,N=/^\\d+$/,M=/^[\\dA-Fa-f]+$/,q=/[\\0\\t\\n\\r #%/:<>?@[\\\\\\]^|]/,D=/[\\0\\t\\n\\r #/:<>?@[\\\\\\]^|]/,B=/^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g,L=/[\\t\\n\\r]/g,U=function(e,t){var n,r,a;if(\"[\"==t.charAt(0)){if(\"]\"!=t.charAt(t.length-1))return _;if(!(n=z(t.slice(1,-1))))return _;e.host=n}else if(G(e)){if(t=m(t),q.test(t))return _;if(null===(n=V(t)))return _;e.host=n}else{if(D.test(t))return _;for(n=\"\",r=d(t),a=0;a<r.length;a++)n+=Y(r[a],J);e.host=n}},V=function(e){var t,n,r,a,o,i,s,c=e.split(\".\");if(c.length&&\"\"==c[c.length-1]&&c.pop(),(t=c.length)>4)return e;for(n=[],r=0;r<t;r++){if(\"\"==(a=c[r]))return e;if(o=10,a.length>1&&\"0\"==a.charAt(0)&&(o=T.test(a)?16:8,a=a.slice(8==o?1:2)),\"\"===a)i=0;else{if(!(10==o?N:8==o?R:M).test(a))return e;i=parseInt(a,o)}n.push(i)}for(r=0;r<t;r++)if(i=n[r],r==t-1){if(i>=O(256,5-t))return null}else if(i>255)return null;for(s=n.pop(),r=0;r<n.length;r++)s+=n[r]*O(256,3-r);return s},z=function(e){var t,n,r,a,o,i,s,c=[0,0,0,0,0,0,0,0],u=0,l=null,p=0,f=function(){return e.charAt(p)};if(\":\"==f()){if(\":\"!=e.charAt(1))return;p+=2,l=++u}for(;f();){if(8==u)return;if(\":\"!=f()){for(t=n=0;n<4&&M.test(f());)t=16*t+parseInt(f(),16),p++,n++;if(\".\"==f()){if(0==n)return;if(p-=n,u>6)return;for(r=0;f();){if(a=null,r>0){if(!(\".\"==f()&&r<4))return;p++}if(!P.test(f()))return;for(;P.test(f());){if(o=parseInt(f(),10),null===a)a=o;else{if(0==a)return;a=10*a+o}if(a>255)return;p++}c[u]=256*c[u]+a,2!=++r&&4!=r||u++}if(4!=r)return;break}if(\":\"==f()){if(p++,!f())return}else if(f())return;c[u++]=t}else{if(null!==l)return;p++,l=++u}}if(null!==l)for(i=u-l,u=7;0!=u&&i>0;)s=c[u],c[u--]=c[l+i-1],c[l+--i]=s;else if(8!=u)return;return c},F=function(e){var t,n,r,a;if(\"number\"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=j(e/256);return t.join(\".\")}if(\"object\"==typeof e){for(t=\"\",r=function(e){for(var t=null,n=1,r=null,a=0,o=0;o<8;o++)0!==e[o]?(a>n&&(t=r,n=a),r=null,a=0):(null===r&&(r=o),++a);return a>n&&(t=r,n=a),t}(e),n=0;n<8;n++)a&&0===e[n]||(a&&(a=!1),r===n?(t+=n?\":\":\"::\",a=!0):(t+=e[n].toString(16),n<7&&(t+=\":\")));return\"[\"+t+\"]\"}return e},J={},W=f({},J,{\" \":1,'\"':1,\"<\":1,\">\":1,\"`\":1}),H=f({},W,{\"#\":1,\"?\":1,\"{\":1,\"}\":1}),$=f({},H,{\"/\":1,\":\":1,\";\":1,\"=\":1,\"@\":1,\"[\":1,\"\\\\\":1,\"]\":1,\"^\":1,\"|\":1}),Y=function(e,t){var n=h(e,0);return n>32&&n<127&&!p(t,e)?e:encodeURIComponent(e)},K={ftp:21,file:null,http:80,https:443,ws:80,wss:443},G=function(e){return p(K,e.scheme)},Z=function(e){return\"\"!=e.username||\"\"!=e.password},X=function(e){return!e.host||e.cannotBeABaseURL||\"file\"==e.scheme},Q=function(e,t){var n;return 2==e.length&&k.test(e.charAt(0))&&(\":\"==(n=e.charAt(1))||!t&&\"|\"==n)},ee=function(e){var t;return e.length>1&&Q(e.slice(0,2))&&(2==e.length||\"/\"===(t=e.charAt(2))||\"\\\\\"===t||\"?\"===t||\"#\"===t)},te=function(e){var t=e.path,n=t.length;!n||\"file\"==e.scheme&&1==n&&Q(t[0],!0)||t.pop()},ne=function(e){return\".\"===e||\"%2e\"===e.toLowerCase()},re={},ae={},oe={},ie={},se={},ce={},ue={},le={},pe={},fe={},de={},he={},me={},ve={},ge={},ye={},be={},Ee={},xe={},Se={},we={},je=function(e,t,n,a){var o,i,s,c,u,l=n||re,f=0,h=\"\",m=!1,v=!1,g=!1;for(n||(e.scheme=\"\",e.username=\"\",e.password=\"\",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(B,\"\")),t=t.replace(L,\"\"),o=d(t);f<=o.length;){switch(i=o[f],l){case re:if(!i||!k.test(i)){if(n)return C;l=oe;continue}h+=i.toLowerCase(),l=ae;break;case ae:if(i&&(I.test(i)||\"+\"==i||\"-\"==i||\".\"==i))h+=i.toLowerCase();else{if(\":\"!=i){if(n)return C;h=\"\",l=oe,f=0;continue}if(n&&(G(e)!=p(K,h)||\"file\"==h&&(Z(e)||null!==e.port)||\"file\"==e.scheme&&!e.host))return;if(e.scheme=h,n)return void(G(e)&&K[e.scheme]==e.port&&(e.port=null));h=\"\",\"file\"==e.scheme?l=ve:G(e)&&a&&a.scheme==e.scheme?l=ie:G(e)?l=le:\"/\"==o[f+1]?(l=se,f++):(e.cannotBeABaseURL=!0,e.path.push(\"\"),l=xe)}break;case oe:if(!a||a.cannotBeABaseURL&&\"#\"!=i)return C;if(a.cannotBeABaseURL&&\"#\"==i){e.scheme=a.scheme,e.path=a.path.slice(),e.query=a.query,e.fragment=\"\",e.cannotBeABaseURL=!0,l=we;break}l=\"file\"==a.scheme?ve:ce;continue;case ie:if(\"/\"!=i||\"/\"!=o[f+1]){l=ce;continue}l=pe,f++;break;case se:if(\"/\"==i){l=fe;break}l=Ee;continue;case ce:if(e.scheme=a.scheme,i==r)e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,e.path=a.path.slice(),e.query=a.query;else if(\"/\"==i||\"\\\\\"==i&&G(e))l=ue;else if(\"?\"==i)e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,e.path=a.path.slice(),e.query=\"\",l=Se;else{if(\"#\"!=i){e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,e.path=a.path.slice(),e.path.pop(),l=Ee;continue}e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,e.path=a.path.slice(),e.query=a.query,e.fragment=\"\",l=we}break;case ue:if(!G(e)||\"/\"!=i&&\"\\\\\"!=i){if(\"/\"!=i){e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,l=Ee;continue}l=fe}else l=pe;break;case le:if(l=pe,\"/\"!=i||\"/\"!=h.charAt(f+1))continue;f++;break;case pe:if(\"/\"!=i&&\"\\\\\"!=i){l=fe;continue}break;case fe:if(\"@\"==i){m&&(h=\"%40\"+h),m=!0,s=d(h);for(var y=0;y<s.length;y++){var b=s[y];if(\":\"!=b||g){var E=Y(b,$);g?e.password+=E:e.username+=E}else g=!0}h=\"\"}else if(i==r||\"/\"==i||\"?\"==i||\"#\"==i||\"\\\\\"==i&&G(e)){if(m&&\"\"==h)return\"Invalid authority\";f-=d(h).length+1,h=\"\",l=de}else h+=i;break;case de:case he:if(n&&\"file\"==e.scheme){l=ye;continue}if(\":\"!=i||v){if(i==r||\"/\"==i||\"?\"==i||\"#\"==i||\"\\\\\"==i&&G(e)){if(G(e)&&\"\"==h)return _;if(n&&\"\"==h&&(Z(e)||null!==e.port))return;if(c=U(e,h))return c;if(h=\"\",l=be,n)return;continue}\"[\"==i?v=!0:\"]\"==i&&(v=!1),h+=i}else{if(\"\"==h)return _;if(c=U(e,h))return c;if(h=\"\",l=me,n==he)return}break;case me:if(!P.test(i)){if(i==r||\"/\"==i||\"?\"==i||\"#\"==i||\"\\\\\"==i&&G(e)||n){if(\"\"!=h){var x=parseInt(h,10);if(x>65535)return A;e.port=G(e)&&x===K[e.scheme]?null:x,h=\"\"}if(n)return;l=be;continue}return A}h+=i;break;case ve:if(e.scheme=\"file\",\"/\"==i||\"\\\\\"==i)l=ge;else{if(!a||\"file\"!=a.scheme){l=Ee;continue}if(i==r)e.host=a.host,e.path=a.path.slice(),e.query=a.query;else if(\"?\"==i)e.host=a.host,e.path=a.path.slice(),e.query=\"\",l=Se;else{if(\"#\"!=i){ee(o.slice(f).join(\"\"))||(e.host=a.host,e.path=a.path.slice(),te(e)),l=Ee;continue}e.host=a.host,e.path=a.path.slice(),e.query=a.query,e.fragment=\"\",l=we}}break;case ge:if(\"/\"==i||\"\\\\\"==i){l=ye;break}a&&\"file\"==a.scheme&&!ee(o.slice(f).join(\"\"))&&(Q(a.path[0],!0)?e.path.push(a.path[0]):e.host=a.host),l=Ee;continue;case ye:if(i==r||\"/\"==i||\"\\\\\"==i||\"?\"==i||\"#\"==i){if(!n&&Q(h))l=Ee;else if(\"\"==h){if(e.host=\"\",n)return;l=be}else{if(c=U(e,h))return c;if(\"localhost\"==e.host&&(e.host=\"\"),n)return;h=\"\",l=be}continue}h+=i;break;case be:if(G(e)){if(l=Ee,\"/\"!=i&&\"\\\\\"!=i)continue}else if(n||\"?\"!=i)if(n||\"#\"!=i){if(i!=r&&(l=Ee,\"/\"!=i))continue}else e.fragment=\"\",l=we;else e.query=\"\",l=Se;break;case Ee:if(i==r||\"/\"==i||\"\\\\\"==i&&G(e)||!n&&(\"?\"==i||\"#\"==i)){if(\"..\"===(u=(u=h).toLowerCase())||\"%2e.\"===u||\".%2e\"===u||\"%2e%2e\"===u?(te(e),\"/\"==i||\"\\\\\"==i&&G(e)||e.path.push(\"\")):ne(h)?\"/\"==i||\"\\\\\"==i&&G(e)||e.path.push(\"\"):(\"file\"==e.scheme&&!e.path.length&&Q(h)&&(e.host&&(e.host=\"\"),h=h.charAt(0)+\":\"),e.path.push(h)),h=\"\",\"file\"==e.scheme&&(i==r||\"?\"==i||\"#\"==i))for(;e.path.length>1&&\"\"===e.path[0];)e.path.shift();\"?\"==i?(e.query=\"\",l=Se):\"#\"==i&&(e.fragment=\"\",l=we)}else h+=Y(i,H);break;case xe:\"?\"==i?(e.query=\"\",l=Se):\"#\"==i?(e.fragment=\"\",l=we):i!=r&&(e.path[0]+=Y(i,J));break;case Se:n||\"#\"!=i?i!=r&&(\"'\"==i&&G(e)?e.query+=\"%27\":e.query+=\"#\"==i?\"%23\":Y(i,J)):(e.fragment=\"\",l=we);break;case we:i!=r&&(e.fragment+=Y(i,W))}f++}},Oe=function(e){var t,n,r=l(this,Oe,\"URL\"),a=arguments.length>1?arguments[1]:void 0,i=String(e),s=S(r,{type:\"URL\"});if(void 0!==a)if(a instanceof Oe)t=w(a);else if(n=je(t={},String(a)))throw TypeError(n);if(n=je(s,i,null,t))throw TypeError(n);var c=s.searchParams=new E,u=x(c);u.updateSearchParams(s.query),u.updateURL=function(){s.query=String(c)||null},o||(r.href=_e.call(r),r.origin=Ae.call(r),r.protocol=ke.call(r),r.username=Ie.call(r),r.password=Pe.call(r),r.host=Te.call(r),r.hostname=Re.call(r),r.port=Ne.call(r),r.pathname=Me.call(r),r.search=qe.call(r),r.searchParams=De.call(r),r.hash=Be.call(r))},Ce=Oe.prototype,_e=function(){var e=w(this),t=e.scheme,n=e.username,r=e.password,a=e.host,o=e.port,i=e.path,s=e.query,c=e.fragment,u=t+\":\";return null!==a?(u+=\"//\",Z(e)&&(u+=n+(r?\":\"+r:\"\")+\"@\"),u+=F(a),null!==o&&(u+=\":\"+o)):\"file\"==t&&(u+=\"//\"),u+=e.cannotBeABaseURL?i[0]:i.length?\"/\"+i.join(\"/\"):\"\",null!==s&&(u+=\"?\"+s),null!==c&&(u+=\"#\"+c),u},Ae=function(){var e=w(this),t=e.scheme,n=e.port;if(\"blob\"==t)try{return new Oe(t.path[0]).origin}catch(e){return\"null\"}return\"file\"!=t&&G(e)?t+\"://\"+F(e.host)+(null!==n?\":\"+n:\"\"):\"null\"},ke=function(){return w(this).scheme+\":\"},Ie=function(){return w(this).username},Pe=function(){return w(this).password},Te=function(){var e=w(this),t=e.host,n=e.port;return null===t?\"\":null===n?F(t):F(t)+\":\"+n},Re=function(){var e=w(this).host;return null===e?\"\":F(e)},Ne=function(){var e=w(this).port;return null===e?\"\":String(e)},Me=function(){var e=w(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?\"/\"+t.join(\"/\"):\"\"},qe=function(){var e=w(this).query;return e?\"?\"+e:\"\"},De=function(){return w(this).searchParams},Be=function(){var e=w(this).fragment;return e?\"#\"+e:\"\"},Le=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&c(Ce,{href:Le(_e,(function(e){var t=w(this),n=String(e),r=je(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)})),origin:Le(Ae),protocol:Le(ke,(function(e){var t=w(this);je(t,String(e)+\":\",re)})),username:Le(Ie,(function(e){var t=w(this),n=d(String(e));if(!X(t)){t.username=\"\";for(var r=0;r<n.length;r++)t.username+=Y(n[r],$)}})),password:Le(Pe,(function(e){var t=w(this),n=d(String(e));if(!X(t)){t.password=\"\";for(var r=0;r<n.length;r++)t.password+=Y(n[r],$)}})),host:Le(Te,(function(e){var t=w(this);t.cannotBeABaseURL||je(t,String(e),de)})),hostname:Le(Re,(function(e){var t=w(this);t.cannotBeABaseURL||je(t,String(e),he)})),port:Le(Ne,(function(e){var t=w(this);X(t)||(\"\"==(e=String(e))?t.port=null:je(t,e,me))})),pathname:Le(Me,(function(e){var t=w(this);t.cannotBeABaseURL||(t.path=[],je(t,e+\"\",be))})),search:Le(qe,(function(e){var t=w(this);\"\"==(e=String(e))?t.query=null:(\"?\"==e.charAt(0)&&(e=e.slice(1)),t.query=\"\",je(t,e,Se)),x(t.searchParams).updateSearchParams(t.query)})),searchParams:Le(De),hash:Le(Be,(function(e){var t=w(this);\"\"!=(e=String(e))?(\"#\"==e.charAt(0)&&(e=e.slice(1)),t.fragment=\"\",je(t,e,we)):t.fragment=null}))}),u(Ce,\"toJSON\",(function(){return _e.call(this)}),{enumerable:!0}),u(Ce,\"toString\",(function(){return _e.call(this)}),{enumerable:!0}),b){var Ue=b.createObjectURL,Ve=b.revokeObjectURL;Ue&&u(Oe,\"createObjectURL\",(function(e){return Ue.apply(b,arguments)})),Ve&&u(Oe,\"revokeObjectURL\",(function(e){return Ve.apply(b,arguments)}))}v(Oe,\"URL\"),a({global:!0,forced:!i,sham:!o},{URL:Oe})},function(e,t,n){\"use strict\";var r=2147483647,a=/[^\\0-\\u007E]/,o=/[.\\u3002\\uFF0E\\uFF61]/g,i=\"Overflow: input needs wider integers to process\",s=Math.floor,c=String.fromCharCode,u=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?s(e/700):e>>1,e+=s(e/t);e>455;r+=36)e=s(e/35);return s(r+36*e/(e+38))},p=function(e){var t,n,a=[],o=(e=function(e){for(var t=[],n=0,r=e.length;n<r;){var a=e.charCodeAt(n++);if(a>=55296&&a<=56319&&n<r){var o=e.charCodeAt(n++);56320==(64512&o)?t.push(((1023&a)<<10)+(1023&o)+65536):(t.push(a),n--)}else t.push(a)}return t}(e)).length,p=128,f=0,d=72;for(t=0;t<e.length;t++)(n=e[t])<128&&a.push(c(n));var h=a.length,m=h;for(h&&a.push(\"-\");m<o;){var v=r;for(t=0;t<e.length;t++)(n=e[t])>=p&&n<v&&(v=n);var g=m+1;if(v-p>s((r-f)/g))throw RangeError(i);for(f+=(v-p)*g,p=v,t=0;t<e.length;t++){if((n=e[t])<p&&++f>r)throw RangeError(i);if(n==p){for(var y=f,b=36;;b+=36){var E=b<=d?1:b>=d+26?26:b-d;if(y<E)break;var x=y-E,S=36-E;a.push(c(u(E+x%S))),y=s(x/S)}a.push(c(u(y))),d=l(f,g,m==h),f=0,++m}}++f,++p}return a.join(\"\")};e.exports=function(e){var t,n,r=[],i=e.toLowerCase().replace(o,\".\").split(\".\");for(t=0;t<i.length;t++)n=i[t],r.push(a.test(n)?\"xn--\"+p(n):n);return r.join(\".\")}},function(e,t,n){var r=n(46),a=n(127);e.exports=function(e){var t=a(e);if(\"function\"!=typeof t)throw TypeError(String(e)+\" is not iterable\");return r(t.call(e))}},function(e,t){},function(e,t,n){n(755);var r=n(31);e.exports=r.setTimeout},function(e,t,n){var r=n(21),a=n(36),o=n(91),i=[].slice,s=function(e){return function(t,n){var r=arguments.length>2,a=r?i.call(arguments,2):void 0;return e(r?function(){(\"function\"==typeof t?t:Function(t)).apply(this,a)}:t,n)}};r({global:!0,bind:!0,forced:/MSIE .\\./.test(o)},{setTimeout:s(a.setTimeout),setInterval:s(a.setInterval)})},function(e,t,n){var r=n(757);e.exports=r},function(e,t,n){n(758),n(145),n(107),n(74);var r=n(31);e.exports=r.Map},function(e,t,n){\"use strict\";var r=n(377),a=n(759);e.exports=r(\"Map\",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),a)},function(e,t,n){\"use strict\";var r=n(59).f,a=n(92),o=n(130),i=n(90),s=n(112),c=n(99),u=n(196),l=n(357),p=n(43),f=n(163).fastKey,d=n(67),h=d.set,m=d.getterFor;e.exports={getConstructor:function(e,t,n,u){var l=e((function(e,r){s(e,l,t),h(e,{type:t,index:a(null),first:void 0,last:void 0,size:0}),p||(e.size=0),null!=r&&c(r,e[u],{that:e,AS_ENTRIES:n})})),d=m(t),v=function(e,t,n){var r,a,o=d(e),i=g(e,t);return i?i.value=n:(o.last=i={index:a=f(t,!0),key:t,value:n,previous:r=o.last,next:void 0,removed:!1},o.first||(o.first=i),r&&(r.next=i),p?o.size++:e.size++,\"F\"!==a&&(o.index[a]=i)),e},g=function(e,t){var n,r=d(e),a=f(t);if(\"F\"!==a)return r.index[a];for(n=r.first;n;n=n.next)if(n.key==t)return n};return o(l.prototype,{clear:function(){for(var e=d(this),t=e.index,n=e.first;n;)n.removed=!0,n.previous&&(n.previous=n.previous.next=void 0),delete t[n.index],n=n.next;e.first=e.last=void 0,p?e.size=0:this.size=0},delete:function(e){var t=this,n=d(t),r=g(t,e);if(r){var a=r.next,o=r.previous;delete n.index[r.index],r.removed=!0,o&&(o.next=a),a&&(a.previous=o),n.first==r&&(n.first=a),n.last==r&&(n.last=o),p?n.size--:t.size--}return!!r},forEach:function(e){for(var t,n=d(this),r=i(e,arguments.length>1?arguments[1]:void 0,3);t=t?t.next:n.first;)for(r(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!g(this,e)}}),o(l.prototype,n?{get:function(e){var t=g(this,e);return t&&t.value},set:function(e,t){return v(this,0===e?0:e,t)}}:{add:function(e){return v(this,e=0===e?0:e,e)}}),p&&r(l.prototype,\"size\",{get:function(){return d(this).size}}),l},setStrong:function(e,t,n){var r=t+\" Iterator\",a=m(t),o=m(r);u(e,t,(function(e,t){h(this,{type:r,target:e,state:a(e),kind:t,last:void 0})}),(function(){for(var e=o(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?\"keys\"==t?{value:n.key,done:!1}:\"values\"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),n?\"entries\":\"values\",!n,!0),l(t)}}},function(e,t,n){n(74);var r=n(761),a=n(83),o=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.keys;return e===o||e instanceof Array&&t===o.keys||i.hasOwnProperty(a(e))?r:t}},function(e,t,n){var r=n(762);e.exports=r},function(e,t,n){n(126);var r=n(38);e.exports=r(\"Array\").keys},function(e,t,n){n(74);var r=n(764),a=n(83),o=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.values;return e===o||e instanceof Array&&t===o.values||i.hasOwnProperty(a(e))?r:t}},function(e,t,n){var r=n(765);e.exports=r},function(e,t,n){n(126);var r=n(38);e.exports=r(\"Array\").values},function(e,t,n){var r=n(767);e.exports=r},function(e,t,n){var r=n(768),a=Array.prototype;e.exports=function(e){var t=e.lastIndexOf;return e===a||e instanceof Array&&t===a.lastIndexOf?r:t}},function(e,t,n){n(769);var r=n(38);e.exports=r(\"Array\").lastIndexOf},function(e,t,n){var r=n(21),a=n(770);r({target:\"Array\",proto:!0,forced:a!==[].lastIndexOf},{lastIndexOf:a})},function(e,t,n){\"use strict\";var r=n(57),a=n(105),o=n(60),i=n(94),s=Math.min,c=[].lastIndexOf,u=!!c&&1/[1].lastIndexOf(1,-0)<0,l=i(\"lastIndexOf\"),p=u||!l;e.exports=p?function(e){if(u)return c.apply(this,arguments)||0;var t=r(this),n=o(t.length),i=n-1;for(arguments.length>1&&(i=s(i,a(arguments[1]))),i<0&&(i=n+i);i>=0;i--)if(i in t&&t[i]===e)return i||0;return-1}:c},function(e,t,n){var r={\"./all.js\":274,\"./auth/actions.js\":71,\"./auth/index.js\":237,\"./auth/reducers.js\":238,\"./auth/selectors.js\":239,\"./auth/spec-wrap-actions.js\":240,\"./configs/actions.js\":117,\"./configs/helpers.js\":134,\"./configs/index.js\":276,\"./configs/reducers.js\":245,\"./configs/selectors.js\":244,\"./configs/spec-actions.js\":243,\"./deep-linking/helpers.js\":138,\"./deep-linking/index.js\":246,\"./deep-linking/layout.js\":247,\"./deep-linking/operation-tag-wrapper.jsx\":249,\"./deep-linking/operation-wrapper.jsx\":248,\"./download-url.js\":242,\"./err/actions.js\":52,\"./err/error-transformers/hook.js\":103,\"./err/error-transformers/transformers/not-of-type.js\":220,\"./err/error-transformers/transformers/parameter-oneof.js\":221,\"./err/index.js\":218,\"./err/reducers.js\":219,\"./err/selectors.js\":222,\"./filter/index.js\":250,\"./filter/opsFilter.js\":251,\"./layout/actions.js\":86,\"./layout/index.js\":223,\"./layout/reducers.js\":224,\"./layout/selectors.js\":225,\"./layout/spec-extensions/wrap-selector.js\":226,\"./logs/index.js\":235,\"./oas3/actions.js\":48,\"./oas3/auth-extensions/wrap-selectors.js\":255,\"./oas3/components/callbacks.jsx\":258,\"./oas3/components/http-auth.jsx\":263,\"./oas3/components/index.js\":257,\"./oas3/components/operation-link.jsx\":259,\"./oas3/components/operation-servers.jsx\":264,\"./oas3/components/request-body-editor.jsx\":262,\"./oas3/components/request-body.jsx\":135,\"./oas3/components/servers-container.jsx\":261,\"./oas3/components/servers.jsx\":260,\"./oas3/helpers.jsx\":32,\"./oas3/index.js\":253,\"./oas3/reducers.js\":273,\"./oas3/selectors.js\":272,\"./oas3/spec-extensions/selectors.js\":256,\"./oas3/spec-extensions/wrap-selectors.js\":254,\"./oas3/wrap-components/auth-item.jsx\":267,\"./oas3/wrap-components/index.js\":265,\"./oas3/wrap-components/json-schema-string.jsx\":271,\"./oas3/wrap-components/markdown.jsx\":266,\"./oas3/wrap-components/model.jsx\":270,\"./oas3/wrap-components/online-validator-badge.js\":269,\"./oas3/wrap-components/version-stamp.jsx\":268,\"./on-complete/index.js\":252,\"./request-snippets/fn.js\":133,\"./request-snippets/index.js\":232,\"./request-snippets/request-snippets.jsx\":234,\"./request-snippets/selectors.js\":233,\"./samples/fn.js\":115,\"./samples/index.js\":231,\"./spec/actions.js\":41,\"./spec/index.js\":227,\"./spec/reducers.js\":228,\"./spec/selectors.js\":77,\"./spec/wrap-actions.js\":229,\"./swagger-js/configs-wrap-actions.js\":236,\"./swagger-js/index.js\":275,\"./util/index.js\":241,\"./view/index.js\":230,\"./view/root-injects.jsx\":137};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error(\"Cannot find module '\"+e+\"'\");throw t.code=\"MODULE_NOT_FOUND\",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=771},function(e,t,n){\"use strict\";n.r(t);var r={};n.r(r),n.d(r,\"Container\",(function(){return xn})),n.d(r,\"Col\",(function(){return wn})),n.d(r,\"Row\",(function(){return jn})),n.d(r,\"Button\",(function(){return On})),n.d(r,\"TextArea\",(function(){return Cn})),n.d(r,\"Input\",(function(){return _n})),n.d(r,\"Select\",(function(){return An})),n.d(r,\"Link\",(function(){return kn})),n.d(r,\"Collapse\",(function(){return Pn}));var a={};n.r(a),n.d(a,\"JsonSchemaForm\",(function(){return br})),n.d(a,\"JsonSchema_string\",(function(){return Er})),n.d(a,\"JsonSchema_array\",(function(){return xr})),n.d(a,\"JsonSchemaArrayItemText\",(function(){return Sr})),n.d(a,\"JsonSchemaArrayItemFile\",(function(){return wr})),n.d(a,\"JsonSchema_boolean\",(function(){return jr})),n.d(a,\"JsonSchema_object\",(function(){return Cr}));var o=n(18),i=n.n(o),s=n(2),c=n.n(s),u=n(12),l=n.n(u),p=n(15),f=n.n(p),d=n(30),h=n.n(d),m=n(68),v=n.n(m),g=n(3),y=n.n(g),b=n(6),E=n.n(b),x=n(7),S=n.n(x),w=n(33),j=n.n(w),O=n(20),C=n.n(O),_=n(19),A=n.n(_),k=n(22),I=n.n(k),P=n(28),T=n.n(P),R=n(4),N=n.n(R),M=n(0),q=n.n(M),D=n(139),B=n(1),L=n.n(B),U=n(381),V=n(114),z=n(382),F=n.n(z),J=n(52),W=n(25),H=n(5),$=function(e){return e};var Y=function(){function e(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};E()(this,e),v()(this,{state:{},plugins:[],pluginsOptions:{},system:{configs:{},fn:{},components:{},rootInjects:{},statePlugins:{}},boundSystem:{},toolbox:{}},n),this.getSystem=j()(t=this._getSystem).call(t,this),this.store=Q($,Object(B.fromJS)(this.state),this.getSystem),this.buildSystem(!1),this.register(this.plugins)}return S()(e,[{key:\"getStore\",value:function(){return this.store}},{key:\"register\",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=K(e,this.getSystem(),this.pluginsOptions);Z(this.system,n),t&&this.buildSystem();var r=G.call(this.system,e,this.getSystem());r&&this.buildSystem()}},{key:\"buildSystem\",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.getStore().dispatch,n=this.getStore().getState;this.boundSystem=C()({},this.getRootInjects(),this.getWrappedAndBoundActions(t),this.getWrappedAndBoundSelectors(n,this.getSystem),this.getStateThunks(n),this.getFn(),this.getConfigs()),e&&this.rebuildReducer()}},{key:\"_getSystem\",value:function(){return this.boundSystem}},{key:\"getRootInjects\",value:function(){var e,t,n;return C()({getSystem:this.getSystem,getStore:j()(e=this.getStore).call(e,this),getComponents:j()(t=this.getComponents).call(t,this),getState:this.getStore().getState,getConfigs:j()(n=this._getConfigs).call(n,this),Im:L.a,React:q.a},this.system.rootInjects||{})}},{key:\"_getConfigs\",value:function(){return this.system.configs}},{key:\"getConfigs\",value:function(){return{configs:this.system.configs}}},{key:\"setConfigs\",value:function(e){this.system.configs=e}},{key:\"rebuildReducer\",value:function(){var e,t,n,r;this.store.replaceReducer((r=this.system.statePlugins,e=Object(H.x)(r,(function(e){return e.reducers})),n=T()(t=f()(e)).call(t,(function(t,n){return t[n]=function(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new B.Map,n=arguments.length>1?arguments[1]:void 0;if(!e)return t;var r=e[n.type];if(r){var a=X(r)(t,n);return null===a?t:a}return t}}(e[n]),t}),{}),f()(n).length?Object(U.combineReducers)(n):$))}},{key:\"getType\",value:function(e){var t=e[0].toUpperCase()+A()(e).call(e,1);return Object(H.y)(this.system.statePlugins,(function(n,r){var a=n[e];if(a)return y()({},r+t,a)}))}},{key:\"getSelectors\",value:function(){return this.getType(\"selectors\")}},{key:\"getActions\",value:function(){var e=this.getType(\"actions\");return Object(H.x)(e,(function(e){return Object(H.y)(e,(function(e,t){if(Object(H.r)(e))return y()({},t,e)}))}))}},{key:\"getWrappedAndBoundActions\",value:function(e){var t=this,n=this.getBoundActions(e);return Object(H.x)(n,(function(e,n){var r=t.system.statePlugins[A()(n).call(n,0,-7)].wrapActions;return r?Object(H.x)(e,(function(e,n){var a=r[n];return a?(I()(a)||(a=[a]),T()(a).call(a,(function(e,n){var r=function(){return n(e,t.getSystem()).apply(void 0,arguments)};if(!Object(H.r)(r))throw new TypeError(\"wrapActions needs to return a function that returns a new function (ie the wrapped action)\");return X(r)}),e||Function.prototype)):e})):e}))}},{key:\"getWrappedAndBoundSelectors\",value:function(e,t){var n=this,r=this.getBoundSelectors(e,t);return Object(H.x)(r,(function(t,r){var a=[A()(r).call(r,0,-9)],o=n.system.statePlugins[a].wrapSelectors;return o?Object(H.x)(t,(function(t,r){var i=o[r];return i?(I()(i)||(i=[i]),T()(i).call(i,(function(t,r){var o=function(){for(var o,i=arguments.length,s=new Array(i),u=0;u<i;u++)s[u]=arguments[u];return r(t,n.getSystem()).apply(void 0,c()(o=[e().getIn(a)]).call(o,s))};if(!Object(H.r)(o))throw new TypeError(\"wrapSelector needs to return a function that returns a new function (ie the wrapped action)\");return o}),t||Function.prototype)):t})):t}))}},{key:\"getStates\",value:function(e){var t;return T()(t=f()(this.system.statePlugins)).call(t,(function(t,n){return t[n]=e.get(n),t}),{})}},{key:\"getStateThunks\",value:function(e){var t;return T()(t=f()(this.system.statePlugins)).call(t,(function(t,n){return t[n]=function(){return e().get(n)},t}),{})}},{key:\"getFn\",value:function(){return{fn:this.system.fn}}},{key:\"getComponents\",value:function(e){var t=this,n=this.system.components[e];return I()(n)?T()(n).call(n,(function(e,n){return n(e,t.getSystem())})):void 0!==e?this.system.components[e]:this.system.components}},{key:\"getBoundSelectors\",value:function(e,t){return Object(H.x)(this.getSelectors(),(function(n,r){var a=[A()(r).call(r,0,-9)],o=function(){return e().getIn(a)};return Object(H.x)(n,(function(e){return function(){for(var n,r=arguments.length,a=new Array(r),i=0;i<r;i++)a[i]=arguments[i];var s=X(e).apply(null,c()(n=[o()]).call(n,a));return\"function\"==typeof s&&(s=X(s)(t())),s}}))}))}},{key:\"getBoundActions\",value:function(e){e=e||this.getStore().dispatch;var t=this.getActions(),n=function e(t){return\"function\"!=typeof t?Object(H.x)(t,(function(t){return e(t)})):function(){var e=null;try{e=t.apply(void 0,arguments)}catch(t){e={type:J.NEW_THROWN_ERR,error:!0,payload:Object(V.serializeError)(t)}}finally{return e}}};return Object(H.x)(t,(function(t){return Object(D.bindActionCreators)(n(t),e)}))}},{key:\"getMapStateToProps\",value:function(){var e=this;return function(){return C()({},e.getSystem())}}},{key:\"getMapDispatchToProps\",value:function(e){var t=this;return function(n){return v()({},t.getWrappedAndBoundActions(n),t.getFn(),e)}}}]),e}();function K(e,t,n){if(Object(H.t)(e)&&!Object(H.p)(e))return F()({},e);if(Object(H.s)(e))return K(e(t),t,n);if(Object(H.p)(e)){var r,a=\"chain\"===n.pluginLoadType?t.getComponents():{};return T()(r=N()(e).call(e,(function(e){return K(e,t,n)}))).call(r,Z,a)}return{}}function G(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=r.hasLoaded,o=a;return Object(H.t)(e)&&!Object(H.p)(e)&&\"function\"==typeof e.afterLoad&&(o=!0,X(e.afterLoad).call(this,t)),Object(H.s)(e)?G.call(this,e(t),t,{hasLoaded:o}):Object(H.p)(e)?N()(e).call(e,(function(e){return G.call(n,e,t,{hasLoaded:o})})):o}function Z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!Object(H.t)(e))return{};if(!Object(H.t)(t))return e;t.wrapComponents&&(Object(H.x)(t.wrapComponents,(function(n,r){var a=e.components&&e.components[r];a&&I()(a)?(e.components[r]=c()(a).call(a,[n]),delete t.wrapComponents[r]):a&&(e.components[r]=[a,n],delete t.wrapComponents[r])})),f()(t.wrapComponents).length||delete t.wrapComponents);var n=e.statePlugins;if(Object(H.t)(n))for(var r in n){var a=n[r];if(Object(H.t)(a)){var o=a.wrapActions,i=a.wrapSelectors;if(Object(H.t)(o))for(var s in o){var u,l=o[s];if(I()(l)||(l=[l],o[s]=l),t&&t.statePlugins&&t.statePlugins[r]&&t.statePlugins[r].wrapActions&&t.statePlugins[r].wrapActions[s])t.statePlugins[r].wrapActions[s]=c()(u=o[s]).call(u,t.statePlugins[r].wrapActions[s])}if(Object(H.t)(i))for(var p in i){var d,h=i[p];if(I()(h)||(h=[h],i[p]=h),t&&t.statePlugins&&t.statePlugins[r]&&t.statePlugins[r].wrapSelectors&&t.statePlugins[r].wrapSelectors[p])t.statePlugins[r].wrapSelectors[p]=c()(d=i[p]).call(d,t.statePlugins[r].wrapSelectors[p])}}}return v()(e,t)}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.logErrors,r=void 0===n||n;return\"function\"!=typeof e?e:function(){try{for(var t,n=arguments.length,a=new Array(n),o=0;o<n;o++)a[o]=arguments[o];return e.call.apply(e,c()(t=[this]).call(t,a))}catch(e){return r&&console.error(e),null}}}function Q(e,t,n){return function(e,t,n){var r=[Object(H.J)(n)],a=W.a.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__||D.compose;return Object(D.createStore)(e,t,a(D.applyMiddleware.apply(void 0,r)))}(e,t,n)}var ee=n(218),te=n(223),ne=n(227),re=n(230),ae=n(231),oe=n(232),ie=n(235),se=n(275),ce=n(237),ue=n(241),le=n(242),pe=n(276),fe=n(246),de=n(250),he=n(252),me=n(10),ve=n.n(me),ge=n(8),ye=n.n(ge),be=n(9),Ee=n.n(be),xe=n(17),Se=n.n(xe),we=(n(11),n(26),n(51)),je=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"toggleShown\",(function(){var e=a.props,t=e.layoutActions,n=e.tag,r=e.operationId,o=e.isShown,i=a.getResolvedSubtree();o||void 0!==i||a.requestResolvedSubtree(),t.show([\"operations\",n,r],!o)})),y()(ve()(a),\"onCancelClick\",(function(){a.setState({tryItOutEnabled:!a.state.tryItOutEnabled})})),y()(ve()(a),\"onTryoutClick\",(function(){a.setState({tryItOutEnabled:!a.state.tryItOutEnabled})})),y()(ve()(a),\"onExecute\",(function(){a.setState({executeInProgress:!0})})),y()(ve()(a),\"getResolvedSubtree\",(function(){var e=a.props,t=e.specSelectors,n=e.path,r=e.method,o=e.specPath;return o?t.specResolvedSubtree(o.toJS()):t.specResolvedSubtree([\"paths\",n,r])})),y()(ve()(a),\"requestResolvedSubtree\",(function(){var e=a.props,t=e.specActions,n=e.path,r=e.method,o=e.specPath;return o?t.requestResolvedSubtree(o.toJS()):t.requestResolvedSubtree([\"paths\",n,r])}));var o=e.getConfigs().tryItOutEnabled;return a.state={tryItOutEnabled:!0===o||\"true\"===o,executeInProgress:!1},a}return S()(n,[{key:\"mapStateToProps\",value:function(e,t){var n,r=t.op,a=t.layoutSelectors,o=(0,t.getConfigs)(),i=o.docExpansion,s=o.deepLinking,u=o.displayOperationId,l=o.displayRequestDuration,p=o.supportedSubmitMethods,f=a.showSummary(),d=r.getIn([\"operation\",\"__originalOperationId\"])||r.getIn([\"operation\",\"operationId\"])||Object(we.e)(r.get(\"operation\"),t.path,t.method)||r.get(\"id\"),h=[\"operations\",t.tag,d],m=s&&\"false\"!==s,v=Se()(p).call(p,t.method)>=0&&(void 0===t.allowTryItOut?t.specSelectors.allowTryItOutFor(t.path,t.method):t.allowTryItOut),g=r.getIn([\"operation\",\"security\"])||t.specSelectors.security();return{operationId:d,isDeepLinkingEnabled:m,showSummary:f,displayOperationId:u,displayRequestDuration:l,allowTryItOut:v,security:g,isAuthorized:t.authSelectors.isAuthorized(g),isShown:a.isShown(h,\"full\"===i),jumpToKey:c()(n=\"paths.\".concat(t.path,\".\")).call(n,t.method),response:t.specSelectors.responseFor(t.path,t.method),request:t.specSelectors.requestFor(t.path,t.method)}}},{key:\"componentDidMount\",value:function(){var e=this.props.isShown,t=this.getResolvedSubtree();e&&void 0===t&&this.requestResolvedSubtree()}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.response,n=e.isShown,r=this.getResolvedSubtree();t!==this.props.response&&this.setState({executeInProgress:!1}),n&&void 0===r&&this.requestResolvedSubtree()}},{key:\"render\",value:function(){var e=this.props,t=e.op,n=e.tag,r=e.path,a=e.method,o=e.security,i=e.isAuthorized,s=e.operationId,c=e.showSummary,u=e.isShown,l=e.jumpToKey,p=e.allowTryItOut,f=e.response,d=e.request,h=e.displayOperationId,m=e.displayRequestDuration,v=e.isDeepLinkingEnabled,g=e.specPath,y=e.specSelectors,b=e.specActions,E=e.getComponent,x=e.getConfigs,S=e.layoutSelectors,w=e.layoutActions,j=e.authActions,O=e.authSelectors,C=e.oas3Actions,_=e.oas3Selectors,A=e.fn,k=E(\"operation\"),I=this.getResolvedSubtree()||Object(B.Map)(),P=Object(B.fromJS)({op:I,tag:n,path:r,summary:t.getIn([\"operation\",\"summary\"])||\"\",deprecated:I.get(\"deprecated\")||t.getIn([\"operation\",\"deprecated\"])||!1,method:a,security:o,isAuthorized:i,operationId:s,originalOperationId:I.getIn([\"operation\",\"__originalOperationId\"]),showSummary:c,isShown:u,jumpToKey:l,allowTryItOut:p,request:d,displayOperationId:h,displayRequestDuration:m,isDeepLinkingEnabled:v,executeInProgress:this.state.executeInProgress,tryItOutEnabled:this.state.tryItOutEnabled});return q.a.createElement(k,{operation:P,response:f,request:d,isShown:u,toggleShown:this.toggleShown,onTryoutClick:this.onTryoutClick,onCancelClick:this.onCancelClick,onExecute:this.onExecute,specPath:g,specActions:b,specSelectors:y,oas3Actions:C,oas3Selectors:_,layoutActions:w,layoutSelectors:S,authActions:j,authSelectors:O,getComponent:E,getConfigs:x,fn:A})}}]),n}(M.PureComponent);y()(je,\"defaultProps\",{showSummary:!0,response:null,allowTryItOut:!0,displayOperationId:!1,displayRequestDuration:!1});var Oe=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"getLayout\",value:function(){var e=this.props,t=e.getComponent,n=e.layoutSelectors.current(),r=t(n,!0);return r||function(){return q.a.createElement(\"h1\",null,' No layout defined for \"',n,'\" ')}}},{key:\"render\",value:function(){var e=this.getLayout();return q.a.createElement(e,null)}}]),n}(q.a.Component);Oe.defaultProps={};var Ce=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"close\",(function(){r.props.authActions.showDefinitions(!1)})),r}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.authSelectors,r=t.authActions,a=t.getComponent,o=t.errSelectors,i=t.specSelectors,s=t.fn.AST,c=void 0===s?{}:s,u=n.shownDefinitions(),l=a(\"auths\");return q.a.createElement(\"div\",{className:\"dialog-ux\"},q.a.createElement(\"div\",{className:\"backdrop-ux\"}),q.a.createElement(\"div\",{className:\"modal-ux\"},q.a.createElement(\"div\",{className:\"modal-dialog-ux\"},q.a.createElement(\"div\",{className:\"modal-ux-inner\"},q.a.createElement(\"div\",{className:\"modal-ux-header\"},q.a.createElement(\"h3\",null,\"Available authorizations\"),q.a.createElement(\"button\",{type:\"button\",className:\"close-modal\",onClick:this.close},q.a.createElement(\"svg\",{width:\"20\",height:\"20\"},q.a.createElement(\"use\",{href:\"#close\",xlinkHref:\"#close\"})))),q.a.createElement(\"div\",{className:\"modal-ux-content\"},N()(e=u.valueSeq()).call(e,(function(e,t){return q.a.createElement(l,{key:t,AST:c,definitions:e,getComponent:a,errSelectors:o,authSelectors:n,authActions:r,specSelectors:i})})))))))}}]),n}(q.a.Component),_e=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.isAuthorized,n=e.showPopup,r=e.onClick,a=(0,e.getComponent)(\"authorizationPopup\",!0);return q.a.createElement(\"div\",{className:\"auth-wrapper\"},q.a.createElement(\"button\",{className:t?\"btn authorize locked\":\"btn authorize unlocked\",onClick:r},q.a.createElement(\"span\",null,\"Authorize\"),q.a.createElement(\"svg\",{width:\"20\",height:\"20\"},q.a.createElement(\"use\",{href:t?\"#locked\":\"#unlocked\",xlinkHref:t?\"#locked\":\"#unlocked\"}))),n&&q.a.createElement(a,null))}}]),n}(q.a.Component),Ae=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.authActions,n=e.authSelectors,r=e.specSelectors,a=e.getComponent,o=r.securityDefinitions(),i=n.definitionsToAuthorize(),s=a(\"authorizeBtn\");return o?q.a.createElement(s,{onClick:function(){return t.showDefinitions(i)},isAuthorized:!!n.authorized().size,showPopup:!!n.shownDefinitions(),getComponent:a}):null}}]),n}(q.a.Component),ke=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onClick\",(function(e){e.stopPropagation();var t=r.props.onClick;t&&t()})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props.isAuthorized;return q.a.createElement(\"button\",{className:e?\"authorization__btn locked\":\"authorization__btn unlocked\",\"aria-label\":e?\"authorization button locked\":\"authorization button unlocked\",onClick:this.onClick},q.a.createElement(\"svg\",{width:\"20\",height:\"20\"},q.a.createElement(\"use\",{href:e?\"#locked\":\"#unlocked\",xlinkHref:e?\"#locked\":\"#unlocked\"})))}}]),n}(q.a.Component),Ie=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;return E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"onAuthChange\",(function(e){var t=e.name;a.setState(y()({},t,e))})),y()(ve()(a),\"submitAuth\",(function(e){e.preventDefault(),a.props.authActions.authorizeWithPersistOption(a.state)})),y()(ve()(a),\"logoutClick\",(function(e){e.preventDefault();var t=a.props,n=t.authActions,r=t.definitions,o=N()(r).call(r,(function(e,t){return t})).toArray();a.setState(T()(o).call(o,(function(e,t){return e[t]=\"\",e}),{})),n.logoutWithPersistOption(o)})),y()(ve()(a),\"close\",(function(e){e.preventDefault(),a.props.authActions.showDefinitions(!1)})),a.state={},a}return S()(n,[{key:\"render\",value:function(){var e,t=this,n=this.props,r=n.definitions,a=n.getComponent,o=n.authSelectors,i=n.errSelectors,s=a(\"AuthItem\"),c=a(\"oauth2\",!0),u=a(\"Button\"),p=o.authorized(),f=l()(r).call(r,(function(e,t){return!!p.get(t)})),d=l()(r).call(r,(function(e){return\"oauth2\"!==e.get(\"type\")})),h=l()(r).call(r,(function(e){return\"oauth2\"===e.get(\"type\")}));return q.a.createElement(\"div\",{className:\"auth-container\"},!!d.size&&q.a.createElement(\"form\",{onSubmit:this.submitAuth},N()(d).call(d,(function(e,n){return q.a.createElement(s,{key:n,schema:e,name:n,getComponent:a,onAuthChange:t.onAuthChange,authorized:p,errSelectors:i})})).toArray(),q.a.createElement(\"div\",{className:\"auth-btn-wrapper\"},d.size===f.size?q.a.createElement(u,{className:\"btn modal-btn auth\",onClick:this.logoutClick},\"Logout\"):q.a.createElement(u,{type:\"submit\",className:\"btn modal-btn auth authorize\"},\"Authorize\"),q.a.createElement(u,{className:\"btn modal-btn auth btn-done\",onClick:this.close},\"Close\"))),h&&h.size?q.a.createElement(\"div\",null,q.a.createElement(\"div\",{className:\"scope-def\"},q.a.createElement(\"p\",null,\"Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.\"),q.a.createElement(\"p\",null,\"API requires the following scopes. Select which ones you want to grant to Swagger UI.\")),N()(e=l()(r).call(r,(function(e){return\"oauth2\"===e.get(\"type\")}))).call(e,(function(e,t){return q.a.createElement(\"div\",{key:t},q.a.createElement(c,{authorized:p,schema:e,name:t}))})).toArray()):null)}}]),n}(q.a.Component),Pe=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.schema,r=t.name,a=t.getComponent,o=t.onAuthChange,i=t.authorized,s=t.errSelectors,c=a(\"apiKeyAuth\"),u=a(\"basicAuth\"),l=n.get(\"type\");switch(l){case\"apiKey\":e=q.a.createElement(c,{key:r,schema:n,name:r,errSelectors:s,authorized:i,getComponent:a,onChange:o});break;case\"basic\":e=q.a.createElement(u,{key:r,schema:n,name:r,errSelectors:s,authorized:i,getComponent:a,onChange:o});break;default:e=q.a.createElement(\"div\",{key:r},\"Unknown security definition type \",l)}return q.a.createElement(\"div\",{key:\"\".concat(r,\"-jump\")},e)}}]),n}(q.a.Component),Te=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props.error,t=e.get(\"level\"),n=e.get(\"message\"),r=e.get(\"source\");return q.a.createElement(\"div\",{className:\"errors\"},q.a.createElement(\"b\",null,r,\" \",t),q.a.createElement(\"span\",null,n))}}]),n}(q.a.Component),Re=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"onChange\",(function(e){var t=a.props.onChange,n=e.target.value,r=C()({},a.state,{value:n});a.setState(r),t(r)}));var o=a.props,i=o.name,s=o.schema,c=a.getValue();return a.state={name:i,schema:s,value:c},a}return S()(n,[{key:\"getValue\",value:function(){var e=this.props,t=e.name,n=e.authorized;return n&&n.getIn([t,\"value\"])}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.schema,a=n.getComponent,o=n.errSelectors,i=n.name,s=a(\"Input\"),c=a(\"Row\"),u=a(\"Col\"),p=a(\"authError\"),f=a(\"Markdown\",!0),d=a(\"JumpToPath\",!0),h=this.getValue(),m=l()(e=o.allErrors()).call(e,(function(e){return e.get(\"authId\")===i}));return q.a.createElement(\"div\",null,q.a.createElement(\"h4\",null,q.a.createElement(\"code\",null,i||r.get(\"name\")),\"  (apiKey)\",q.a.createElement(d,{path:[\"securityDefinitions\",i]})),h&&q.a.createElement(\"h6\",null,\"Authorized\"),q.a.createElement(c,null,q.a.createElement(f,{source:r.get(\"description\")})),q.a.createElement(c,null,q.a.createElement(\"p\",null,\"Name: \",q.a.createElement(\"code\",null,r.get(\"name\")))),q.a.createElement(c,null,q.a.createElement(\"p\",null,\"In: \",q.a.createElement(\"code\",null,r.get(\"in\")))),q.a.createElement(c,null,q.a.createElement(\"label\",null,\"Value:\"),h?q.a.createElement(\"code\",null,\" ****** \"):q.a.createElement(u,null,q.a.createElement(s,{type:\"text\",onChange:this.onChange,autoFocus:!0}))),N()(t=m.valueSeq()).call(t,(function(e,t){return q.a.createElement(p,{error:e,key:t})})))}}]),n}(q.a.Component),Ne=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"onChange\",(function(e){var t=a.props.onChange,n=e.target,r=n.value,o=n.name,i=a.state.value;i[o]=r,a.setState({value:i}),t(a.state)}));var o=a.props,i=o.schema,s=o.name,c=a.getValue().username;return a.state={name:s,schema:i,value:c?{username:c}:{}},a}return S()(n,[{key:\"getValue\",value:function(){var e=this.props,t=e.authorized,n=e.name;return t&&t.getIn([n,\"value\"])||{}}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.schema,a=n.getComponent,o=n.name,i=n.errSelectors,s=a(\"Input\"),c=a(\"Row\"),u=a(\"Col\"),p=a(\"authError\"),f=a(\"JumpToPath\",!0),d=a(\"Markdown\",!0),h=this.getValue().username,m=l()(e=i.allErrors()).call(e,(function(e){return e.get(\"authId\")===o}));return q.a.createElement(\"div\",null,q.a.createElement(\"h4\",null,\"Basic authorization\",q.a.createElement(f,{path:[\"securityDefinitions\",o]})),h&&q.a.createElement(\"h6\",null,\"Authorized\"),q.a.createElement(c,null,q.a.createElement(d,{source:r.get(\"description\")})),q.a.createElement(c,null,q.a.createElement(\"label\",null,\"Username:\"),h?q.a.createElement(\"code\",null,\" \",h,\" \"):q.a.createElement(u,null,q.a.createElement(s,{type:\"text\",required:\"required\",name:\"username\",onChange:this.onChange,autoFocus:!0}))),q.a.createElement(c,null,q.a.createElement(\"label\",null,\"Password:\"),h?q.a.createElement(\"code\",null,\" ****** \"):q.a.createElement(u,null,q.a.createElement(s,{autoComplete:\"new-password\",name:\"password\",type:\"password\",onChange:this.onChange}))),N()(t=m.valueSeq()).call(t,(function(e,t){return q.a.createElement(p,{error:e,key:t})})))}}]),n}(q.a.Component);function Me(e){var t=e.example,n=e.showValue,r=e.getComponent,a=e.getConfigs,o=r(\"Markdown\",!0),i=r(\"highlightCode\");return t?q.a.createElement(\"div\",{className:\"example\"},t.get(\"description\")?q.a.createElement(\"section\",{className:\"example__section\"},q.a.createElement(\"div\",{className:\"example__section-header\"},\"Example Description\"),q.a.createElement(\"p\",null,q.a.createElement(o,{source:t.get(\"description\")}))):null,n&&t.has(\"value\")?q.a.createElement(\"section\",{className:\"example__section\"},q.a.createElement(\"div\",{className:\"example__section-header\"},\"Example Value\"),q.a.createElement(i,{getConfigs:a,value:Object(H.I)(t.get(\"value\"))})):null):null}var qe=n(407),De=n.n(qe),Be=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"_onSelect\",(function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isSyntheticChange,a=void 0!==n&&n;\"function\"==typeof r.props.onSelect&&r.props.onSelect(e,{isSyntheticChange:a})})),y()(ve()(r),\"_onDomSelect\",(function(e){if(\"function\"==typeof r.props.onSelect){var t=e.target.selectedOptions[0].getAttribute(\"value\");r._onSelect(t,{isSyntheticChange:!1})}})),y()(ve()(r),\"getCurrentExample\",(function(){var e=r.props,t=e.examples,n=e.currentExampleKey,a=t.get(n),o=t.keySeq().first(),i=t.get(o);return a||i||De()({})})),r}return S()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.onSelect,n=e.examples;if(\"function\"==typeof t){var r=n.first(),a=n.keyOf(r);this._onSelect(a,{isSyntheticChange:!0})}}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.currentExampleKey,n=e.examples;if(n!==this.props.examples&&!n.has(t)){var r=n.first(),a=n.keyOf(r);this._onSelect(a,{isSyntheticChange:!0})}}},{key:\"render\",value:function(){var e=this.props,t=e.examples,n=e.currentExampleKey,r=e.isValueModified,a=e.isModifiedValueAvailable,o=e.showLabels;return q.a.createElement(\"div\",{className:\"examples-select\"},o?q.a.createElement(\"span\",{className:\"examples-select__section-label\"},\"Examples: \"):null,q.a.createElement(\"select\",{className:\"examples-select-element\",onChange:this._onDomSelect,value:a&&r?\"__MODIFIED__VALUE__\":n||\"\"},a?q.a.createElement(\"option\",{value:\"__MODIFIED__VALUE__\"},\"[Modified value]\"):null,N()(t).call(t,(function(e,t){return q.a.createElement(\"option\",{key:t,value:t},e.get(\"summary\")||t)})).valueSeq()))}}]),n}(q.a.PureComponent);y()(Be,\"defaultProps\",{examples:L.a.Map({}),onSelect:function(){for(var e,t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(e=console).log.apply(e,c()(t=[\"DEBUG: ExamplesSelect was not given an onSelect callback\"]).call(t,r))},currentExampleKey:null,showLabels:!0});var Le=function(e){return B.List.isList(e)?e:Object(H.I)(e)},Ue=function(e){ye()(n,e);var t=Ee()(n);function n(e){var r;E()(this,n),r=t.call(this,e),y()(ve()(r),\"_getStateForCurrentNamespace\",(function(){var e=r.props.currentNamespace;return(r.state[e]||Object(B.Map)()).toObject()})),y()(ve()(r),\"_setStateForCurrentNamespace\",(function(e){var t=r.props.currentNamespace;return r._setStateForNamespace(t,e)})),y()(ve()(r),\"_setStateForNamespace\",(function(e,t){var n=(r.state[e]||Object(B.Map)()).mergeDeep(t);return r.setState(y()({},e,n))})),y()(ve()(r),\"_isCurrentUserInputSameAsExampleValue\",(function(){var e=r.props.currentUserInputValue;return r._getCurrentExampleValue()===e})),y()(ve()(r),\"_getValueForExample\",(function(e,t){var n=(t||r.props).examples;return Le((n||Object(B.Map)({})).getIn([e,\"value\"]))})),y()(ve()(r),\"_getCurrentExampleValue\",(function(e){var t=(e||r.props).currentKey;return r._getValueForExample(t,e||r.props)})),y()(ve()(r),\"_onExamplesSelect\",(function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isSyntheticChange,a=r.props,o=a.onSelect,i=a.updateValue,s=a.currentUserInputValue,u=a.userHasEditedBody,l=r._getStateForCurrentNamespace(),p=l.lastUserEditedValue,f=r._getValueForExample(e);if(\"__MODIFIED__VALUE__\"===e)return i(Le(p)),r._setStateForCurrentNamespace({isModifiedValueSelected:!0});if(\"function\"==typeof o){for(var d,h=arguments.length,m=new Array(h>2?h-2:0),v=2;v<h;v++)m[v-2]=arguments[v];o.apply(void 0,c()(d=[e,{isSyntheticChange:n}]).call(d,m))}r._setStateForCurrentNamespace({lastDownstreamValue:f,isModifiedValueSelected:n&&u||!!s&&s!==f}),n||\"function\"==typeof i&&i(Le(f))}));var a=r._getCurrentExampleValue();return r.state=y()({},e.currentNamespace,Object(B.Map)({lastUserEditedValue:r.props.currentUserInputValue,lastDownstreamValue:a,isModifiedValueSelected:r.props.userHasEditedBody||r.props.currentUserInputValue!==a})),r}return S()(n,[{key:\"componentWillUnmount\",value:function(){this.props.setRetainRequestBodyValueFlag(!1)}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.currentUserInputValue,n=e.examples,r=e.onSelect,a=e.userHasEditedBody,o=this._getStateForCurrentNamespace(),i=o.lastUserEditedValue,s=o.lastDownstreamValue,c=this._getValueForExample(e.currentKey,e),u=l()(n).call(n,(function(e){return e.get(\"value\")===t||Object(H.I)(e.get(\"value\"))===t}));u.size?r(u.has(e.currentKey)?e.currentKey:u.keySeq().first(),{isSyntheticChange:!0}):t!==this.props.currentUserInputValue&&t!==i&&t!==s&&(this.props.setRetainRequestBodyValueFlag(!0),this._setStateForNamespace(e.currentNamespace,{lastUserEditedValue:e.currentUserInputValue,isModifiedValueSelected:a||t!==c}))}},{key:\"render\",value:function(){var e=this.props,t=e.currentUserInputValue,n=e.examples,r=e.currentKey,a=e.getComponent,o=e.userHasEditedBody,i=this._getStateForCurrentNamespace(),s=i.lastDownstreamValue,c=i.lastUserEditedValue,u=i.isModifiedValueSelected,l=a(\"ExamplesSelect\");return q.a.createElement(l,{examples:n,currentExampleKey:r,onSelect:this._onExamplesSelect,isModifiedValueAvailable:!!c&&c!==s,isValueModified:void 0!==t&&u&&t!==this._getCurrentExampleValue()||o})}}]),n}(q.a.PureComponent);y()(Ue,\"defaultProps\",{userHasEditedBody:!1,examples:Object(B.Map)({}),currentNamespace:\"__DEFAULT__NAMESPACE__\",setRetainRequestBodyValueFlag:function(){},onSelect:function(){for(var e,t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(e=console).log.apply(e,c()(t=[\"ExamplesSelectValueRetainer: no `onSelect` function was provided\"]).call(t,r))},updateValue:function(){for(var e,t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(e=console).log.apply(e,c()(t=[\"ExamplesSelectValueRetainer: no `updateValue` function was provided\"]).call(t,r))}});var Ve=n(169),ze=n.n(Ve),Fe=n(102),Je=n.n(Fe),We=n(29),He=n.n(We),$e=n(78),Ye=n.n($e);var Ke=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"close\",(function(e){e.preventDefault(),a.props.authActions.showDefinitions(!1)})),y()(ve()(a),\"authorize\",(function(){var e=a.props,t=e.authActions,n=e.errActions,r=e.getConfigs,o=e.authSelectors,i=e.oas3Selectors,s=r(),c=o.getConfigs();n.clear({authId:name,type:\"auth\",source:\"auth\"}),function(e){var t=e.auth,n=e.authActions,r=e.errActions,a=e.configs,o=e.authConfigs,i=void 0===o?{}:o,s=e.currentServer,c=t.schema,u=t.scopes,l=t.name,p=t.clientId,f=c.get(\"flow\"),d=[];switch(f){case\"password\":return void n.authorizePassword(t);case\"application\":return void n.authorizeApplication(t);case\"accessCode\":d.push(\"response_type=code\");break;case\"implicit\":d.push(\"response_type=token\");break;case\"clientCredentials\":case\"client_credentials\":return void n.authorizeApplication(t);case\"authorizationCode\":case\"authorization_code\":d.push(\"response_type=code\")}\"string\"==typeof p&&d.push(\"client_id=\"+encodeURIComponent(p));var h=a.oauth2RedirectUrl;if(void 0!==h){d.push(\"redirect_uri=\"+encodeURIComponent(h));var m=[];if(I()(u)?m=u:L.a.List.isList(u)&&(m=u.toArray()),m.length>0){var v=i.scopeSeparator||\" \";d.push(\"scope=\"+encodeURIComponent(m.join(v)))}var g=Object(H.a)(new Date);if(d.push(\"state=\"+encodeURIComponent(g)),void 0!==i.realm&&d.push(\"realm=\"+encodeURIComponent(i.realm)),(\"authorizationCode\"===f||\"authorization_code\"===f||\"accessCode\"===f)&&i.usePkceWithAuthorizationCodeGrant){var y=Object(H.j)(),b=Object(H.c)(y);d.push(\"code_challenge=\"+b),d.push(\"code_challenge_method=S256\"),t.codeVerifier=y}var E=i.additionalQueryStringParams;for(var x in E){var S;void 0!==E[x]&&d.push(N()(S=[x,E[x]]).call(S,encodeURIComponent).join(\"=\"))}var w,j=c.get(\"authorizationUrl\"),O=[s?Ye()(Object(H.F)(j),s,!0).toString():Object(H.F)(j),d.join(\"&\")].join(-1===Se()(j).call(j,\"?\")?\"?\":\"&\");w=\"implicit\"===f?n.preAuthorizeImplicit:i.useBasicAuthenticationWithAccessCodeGrant?n.authorizeAccessCodeWithBasicAuthentication:n.authorizeAccessCodeWithFormParams,W.a.swaggerUIRedirectOauth2={auth:t,state:g,redirectUrl:h,callback:w,errCb:r.newAuthErr},W.a.open(O)}else r.newAuthErr({authId:l,source:\"validation\",level:\"error\",message:\"oauth2RedirectUrl configuration is not passed. Oauth2 authorization cannot be performed.\"})}({auth:a.state,currentServer:i.serverEffectiveValue(i.selectedServer()),authActions:t,errActions:n,configs:s,authConfigs:c})})),y()(ve()(a),\"onScopeChange\",(function(e){var t,n,r=e.target,o=r.checked,i=r.dataset.value;if(o&&-1===Se()(t=a.state.scopes).call(t,i)){var s,u=c()(s=a.state.scopes).call(s,[i]);a.setState({scopes:u})}else if(!o&&Se()(n=a.state.scopes).call(n,i)>-1){var p;a.setState({scopes:l()(p=a.state.scopes).call(p,(function(e){return e!==i}))})}})),y()(ve()(a),\"onInputChange\",(function(e){var t=e.target,n=t.dataset.name,r=t.value,o=y()({},n,r);a.setState(o)})),y()(ve()(a),\"selectScopes\",(function(e){var t;e.target.dataset.all?a.setState({scopes:ze()(Je()(t=a.props.schema.get(\"allowedScopes\")||a.props.schema.get(\"scopes\")).call(t))}):a.setState({scopes:[]})})),y()(ve()(a),\"logout\",(function(e){e.preventDefault();var t=a.props,n=t.authActions,r=t.errActions,o=t.name;r.clear({authId:o,type:\"auth\",source:\"auth\"}),n.logoutWithPersistOption([o])}));var o=a.props,i=o.name,s=o.schema,u=o.authorized,p=o.authSelectors,f=u&&u.get(i),d=p.getConfigs()||{},h=f&&f.get(\"username\")||\"\",m=f&&f.get(\"clientId\")||d.clientId||\"\",v=f&&f.get(\"clientSecret\")||d.clientSecret||\"\",g=f&&f.get(\"passwordType\")||\"basic\",b=f&&f.get(\"scopes\")||d.scopes||[];return\"string\"==typeof b&&(b=b.split(d.scopeSeparator||\" \")),a.state={appName:d.appName,name:i,schema:s,scopes:b,clientId:m,clientSecret:v,username:h,password:\"\",passwordType:g},a}return S()(n,[{key:\"render\",value:function(){var e,t,n=this,r=this.props,a=r.schema,o=r.getComponent,i=r.authSelectors,s=r.errSelectors,u=r.name,p=r.specSelectors,f=o(\"Input\"),d=o(\"Row\"),h=o(\"Col\"),m=o(\"Button\"),v=o(\"authError\"),g=o(\"JumpToPath\",!0),y=o(\"Markdown\",!0),b=o(\"InitializedInput\"),E=p.isOAS3,x=E()?a.get(\"openIdConnectUrl\"):null,S=\"implicit\",w=\"password\",j=E()?x?\"authorization_code\":\"authorizationCode\":\"accessCode\",O=E()?x?\"client_credentials\":\"clientCredentials\":\"application\",C=a.get(\"flow\"),_=a.get(\"allowedScopes\")||a.get(\"scopes\"),A=!!i.authorized().get(u),k=l()(e=s.allErrors()).call(e,(function(e){return e.get(\"authId\")===u})),I=!l()(k).call(k,(function(e){return\"validation\"===e.get(\"source\")})).size,P=a.get(\"description\");return q.a.createElement(\"div\",null,q.a.createElement(\"h4\",null,u,\" (OAuth2, \",a.get(\"flow\"),\") \",q.a.createElement(g,{path:[\"securityDefinitions\",u]})),this.state.appName?q.a.createElement(\"h5\",null,\"Application: \",this.state.appName,\" \"):null,P&&q.a.createElement(y,{source:a.get(\"description\")}),A&&q.a.createElement(\"h6\",null,\"Authorized\"),x&&q.a.createElement(\"p\",null,\"OpenID Connect URL: \",q.a.createElement(\"code\",null,x)),(C===S||C===j)&&q.a.createElement(\"p\",null,\"Authorization URL: \",q.a.createElement(\"code\",null,a.get(\"authorizationUrl\"))),(C===w||C===j||C===O)&&q.a.createElement(\"p\",null,\"Token URL:\",q.a.createElement(\"code\",null,\" \",a.get(\"tokenUrl\"))),q.a.createElement(\"p\",{className:\"flow\"},\"Flow: \",q.a.createElement(\"code\",null,a.get(\"flow\"))),C!==w?null:q.a.createElement(d,null,q.a.createElement(d,null,q.a.createElement(\"label\",{htmlFor:\"oauth_username\"},\"username:\"),A?q.a.createElement(\"code\",null,\" \",this.state.username,\" \"):q.a.createElement(h,{tablet:10,desktop:10},q.a.createElement(\"input\",{id:\"oauth_username\",type:\"text\",\"data-name\":\"username\",onChange:this.onInputChange,autoFocus:!0}))),q.a.createElement(d,null,q.a.createElement(\"label\",{htmlFor:\"oauth_password\"},\"password:\"),A?q.a.createElement(\"code\",null,\" ****** \"):q.a.createElement(h,{tablet:10,desktop:10},q.a.createElement(\"input\",{id:\"oauth_password\",type:\"password\",\"data-name\":\"password\",onChange:this.onInputChange}))),q.a.createElement(d,null,q.a.createElement(\"label\",{htmlFor:\"password_type\"},\"Client credentials location:\"),A?q.a.createElement(\"code\",null,\" \",this.state.passwordType,\" \"):q.a.createElement(h,{tablet:10,desktop:10},q.a.createElement(\"select\",{id:\"password_type\",\"data-name\":\"passwordType\",onChange:this.onInputChange},q.a.createElement(\"option\",{value:\"basic\"},\"Authorization header\"),q.a.createElement(\"option\",{value:\"request-body\"},\"Request body\"))))),(C===O||C===S||C===j||C===w)&&(!A||A&&this.state.clientId)&&q.a.createElement(d,null,q.a.createElement(\"label\",{htmlFor:\"client_id\"},\"client_id:\"),A?q.a.createElement(\"code\",null,\" ****** \"):q.a.createElement(h,{tablet:10,desktop:10},q.a.createElement(b,{id:\"client_id\",type:\"text\",required:C===w,initialValue:this.state.clientId,\"data-name\":\"clientId\",onChange:this.onInputChange}))),(C===O||C===j||C===w)&&q.a.createElement(d,null,q.a.createElement(\"label\",{htmlFor:\"client_secret\"},\"client_secret:\"),A?q.a.createElement(\"code\",null,\" ****** \"):q.a.createElement(h,{tablet:10,desktop:10},q.a.createElement(b,{id:\"client_secret\",initialValue:this.state.clientSecret,type:\"password\",\"data-name\":\"clientSecret\",onChange:this.onInputChange}))),!A&&_&&_.size?q.a.createElement(\"div\",{className:\"scopes\"},q.a.createElement(\"h2\",null,\"Scopes:\",q.a.createElement(\"a\",{onClick:this.selectScopes,\"data-all\":!0},\"select all\"),q.a.createElement(\"a\",{onClick:this.selectScopes},\"select none\")),N()(_).call(_,(function(e,t){var r,a,o,i,s;return q.a.createElement(d,{key:t},q.a.createElement(\"div\",{className:\"checkbox\"},q.a.createElement(f,{\"data-value\":t,id:c()(r=c()(a=\"\".concat(t,\"-\")).call(a,C,\"-checkbox-\")).call(r,n.state.name),disabled:A,checked:He()(o=n.state.scopes).call(o,t),type:\"checkbox\",onChange:n.onScopeChange}),q.a.createElement(\"label\",{htmlFor:c()(i=c()(s=\"\".concat(t,\"-\")).call(s,C,\"-checkbox-\")).call(i,n.state.name)},q.a.createElement(\"span\",{className:\"item\"}),q.a.createElement(\"div\",{className:\"text\"},q.a.createElement(\"p\",{className:\"name\"},t),q.a.createElement(\"p\",{className:\"description\"},e)))))})).toArray()):null,N()(t=k.valueSeq()).call(t,(function(e,t){return q.a.createElement(v,{error:e,key:t})})),q.a.createElement(\"div\",{className:\"auth-btn-wrapper\"},I&&(A?q.a.createElement(m,{className:\"btn modal-btn auth authorize\",onClick:this.logout},\"Logout\"):q.a.createElement(m,{className:\"btn modal-btn auth authorize\",onClick:this.authorize},\"Authorize\")),q.a.createElement(m,{className:\"btn modal-btn auth btn-done\",onClick:this.close},\"Close\")))}}]),n}(q.a.Component),Ge=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onClick\",(function(){var e=r.props,t=e.specActions,n=e.path,a=e.method;t.clearResponse(n,a),t.clearRequest(n,a)})),r}return S()(n,[{key:\"render\",value:function(){return q.a.createElement(\"button\",{className:\"btn btn-clear opblock-control__btn\",onClick:this.onClick},\"Clear\")}}]),n}(M.Component),Ze=function(e){var t=e.headers;return q.a.createElement(\"div\",null,q.a.createElement(\"h5\",null,\"Response headers\"),q.a.createElement(\"pre\",{className:\"microlight\"},t))},Xe=function(e){var t=e.duration;return q.a.createElement(\"div\",null,q.a.createElement(\"h5\",null,\"Request duration\"),q.a.createElement(\"pre\",{className:\"microlight\"},t,\" ms\"))},Qe=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"shouldComponentUpdate\",value:function(e){return this.props.response!==e.response||this.props.path!==e.path||this.props.method!==e.method||this.props.displayRequestDuration!==e.displayRequestDuration}},{key:\"render\",value:function(){var e,t=this.props,n=t.response,r=t.getComponent,a=t.getConfigs,o=t.displayRequestDuration,i=t.specSelectors,s=t.path,u=t.method,l=a(),p=l.showMutatedRequest,d=l.requestSnippetsEnabled,h=p?i.mutatedRequestFor(s,u):i.requestFor(s,u),m=n.get(\"status\"),v=h.get(\"url\"),g=n.get(\"headers\").toJS(),y=n.get(\"notDocumented\"),b=n.get(\"error\"),E=n.get(\"text\"),x=n.get(\"duration\"),S=f()(g),w=g[\"content-type\"]||g[\"Content-Type\"],j=r(\"responseBody\"),O=N()(S).call(S,(function(e){var t=I()(g[e])?g[e].join():g[e];return q.a.createElement(\"span\",{className:\"headerline\",key:e},\" \",e,\": \",t,\" \")})),C=0!==O.length,_=r(\"Markdown\",!0),A=r(\"RequestSnippets\",!0),k=r(\"curl\");return q.a.createElement(\"div\",null,h&&(!0===d||\"true\"===d?q.a.createElement(A,{request:h}):q.a.createElement(k,{request:h,getConfigs:a})),v&&q.a.createElement(\"div\",null,q.a.createElement(\"h4\",null,\"Request URL\"),q.a.createElement(\"div\",{className:\"request-url\"},q.a.createElement(\"pre\",{className:\"microlight\"},v))),q.a.createElement(\"h4\",null,\"Server response\"),q.a.createElement(\"table\",{className:\"responses-table live-responses-table\"},q.a.createElement(\"thead\",null,q.a.createElement(\"tr\",{className:\"responses-header\"},q.a.createElement(\"td\",{className:\"col_header response-col_status\"},\"Code\"),q.a.createElement(\"td\",{className:\"col_header response-col_description\"},\"Details\"))),q.a.createElement(\"tbody\",null,q.a.createElement(\"tr\",{className:\"response\"},q.a.createElement(\"td\",{className:\"response-col_status\"},m,y?q.a.createElement(\"div\",{className:\"response-undocumented\"},q.a.createElement(\"i\",null,\" Undocumented \")):null),q.a.createElement(\"td\",{className:\"response-col_description\"},b?q.a.createElement(_,{source:c()(e=\"\".concat(\"\"!==n.get(\"name\")?\"\".concat(n.get(\"name\"),\": \"):\"\")).call(e,n.get(\"message\"))}):null,E?q.a.createElement(j,{content:E,contentType:w,url:v,headers:g,getConfigs:a,getComponent:r}):null,C?q.a.createElement(Ze,{headers:O}):null,o&&x?q.a.createElement(Xe,{duration:x}):null)))))}}]),n}(q.a.Component),et=n(176),tt=[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\"],nt=c()(tt).call(tt,[\"trace\"]),rt=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"renderOperationTag\",(function(e,t){var n=r.props,a=n.specSelectors,o=n.getComponent,i=n.oas3Selectors,s=n.layoutSelectors,u=n.layoutActions,l=n.getConfigs,p=o(\"OperationContainer\",!0),f=o(\"OperationTag\"),d=e.get(\"operations\");return q.a.createElement(f,{key:\"operation-\"+t,tagObj:e,tag:t,oas3Selectors:i,layoutSelectors:s,layoutActions:u,getConfigs:l,getComponent:o,specUrl:a.url()},q.a.createElement(\"div\",{className:\"operation-tag-content\"},N()(d).call(d,(function(e){var n,r=e.get(\"path\"),o=e.get(\"method\"),i=L.a.List([\"paths\",r,o]),s=a.isOAS3()?nt:tt;return-1===Se()(s).call(s,o)?null:q.a.createElement(p,{key:c()(n=\"\".concat(r,\"-\")).call(n,o),specPath:i,op:e,path:r,method:o,tag:t})})).toArray()))})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props.specSelectors.taggedOperations();return 0===e.size?q.a.createElement(\"h3\",null,\" No operations defined in spec!\"):q.a.createElement(\"div\",null,N()(e).call(e,this.renderOperationTag).toArray(),e.size<1?q.a.createElement(\"h3\",null,\" No operations defined in spec! \"):null)}}]),n}(q.a.Component),at=n(79),ot=n.n(at);function it(e){return e.match(/^(?:[a-z]+:)?\\/\\//i)}function st(e,t){return e?it(e)?(n=e).match(/^\\/\\//i)?c()(r=\"\".concat(window.location.protocol)).call(r,n):n:new ot.a(e,t).href:t;var n,r}function ct(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.selectedServer,a=void 0===r?\"\":r;if(e){if(it(e))return e;var o=st(a,t);return it(o)?new ot.a(e,o).href:new ot.a(e,window.location.href).href}}var ut=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.tagObj,r=t.tag,a=t.children,o=t.oas3Selectors,i=t.layoutSelectors,s=t.layoutActions,c=t.getConfigs,u=t.getComponent,l=t.specUrl,p=c(),f=p.docExpansion,d=p.deepLinking,h=d&&\"false\"!==d,m=u(\"Collapse\"),v=u(\"Markdown\",!0),g=u(\"DeepLink\"),y=u(\"Link\"),b=n.getIn([\"tagDetails\",\"description\"],null),E=n.getIn([\"tagDetails\",\"externalDocs\",\"description\"]),x=n.getIn([\"tagDetails\",\"externalDocs\",\"url\"]);e=Object(H.s)(o)&&Object(H.s)(o.selectedServer)?ct(x,l,{selectedServer:o.selectedServer()}):x;var S=[\"operations-tag\",r],w=i.isShown(S,\"full\"===f||\"list\"===f);return q.a.createElement(\"div\",{className:w?\"opblock-tag-section is-open\":\"opblock-tag-section\"},q.a.createElement(\"h3\",{onClick:function(){return s.show(S,!w)},className:b?\"opblock-tag\":\"opblock-tag no-desc\",id:N()(S).call(S,(function(e){return Object(H.g)(e)})).join(\"-\"),\"data-tag\":r,\"data-is-open\":w},q.a.createElement(g,{enabled:h,isShown:w,path:Object(H.d)(r),text:r}),b?q.a.createElement(\"small\",null,q.a.createElement(v,{source:b})):q.a.createElement(\"small\",null),q.a.createElement(\"div\",null,E?q.a.createElement(\"small\",null,E,e?\": \":null,e?q.a.createElement(y,{href:Object(H.F)(e),onClick:function(e){return e.stopPropagation()},target:\"_blank\"},e):null):null),q.a.createElement(\"button\",{\"aria-expanded\":w,className:\"expand-operation\",title:w?\"Collapse operation\":\"Expand operation\",onClick:function(){return s.show(S,!w)}},q.a.createElement(\"svg\",{className:\"arrow\",width:\"20\",height:\"20\",\"aria-hidden\":\"true\",focusable:\"false\"},q.a.createElement(\"use\",{href:w?\"#large-arrow-up\":\"#large-arrow-down\",xlinkHref:w?\"#large-arrow-up\":\"#large-arrow-down\"})))),q.a.createElement(m,{isOpened:w},a))}}]),n}(q.a.Component);y()(ut,\"defaultProps\",{tagObj:L.a.fromJS({}),tag:\"\"});var lt=function(e){ye()(r,e);var t=Ee()(r);function r(){return E()(this,r),t.apply(this,arguments)}return S()(r,[{key:\"render\",value:function(){var e=this.props,t=e.specPath,r=e.response,a=e.request,o=e.toggleShown,i=e.onTryoutClick,s=e.onCancelClick,c=e.onExecute,u=e.fn,l=e.getComponent,p=e.getConfigs,f=e.specActions,d=e.specSelectors,h=e.authActions,m=e.authSelectors,v=e.oas3Actions,g=e.oas3Selectors,y=this.props.operation,b=y.toJS(),E=b.deprecated,x=b.isShown,S=b.path,w=b.method,j=b.op,O=b.tag,C=b.operationId,_=b.allowTryItOut,A=b.displayRequestDuration,k=b.tryItOutEnabled,I=b.executeInProgress,P=j.description,T=j.externalDocs,R=j.schemes,N=T?ct(T.url,d.url(),{selectedServer:g.selectedServer()}):\"\",M=y.getIn([\"op\"]),D=M.get(\"responses\"),B=Object(H.n)(M,[\"parameters\"]),L=d.operationScheme(S,w),U=[\"operations\",O,C],V=Object(H.m)(M),z=l(\"responses\"),F=l(\"parameters\"),J=l(\"execute\"),W=l(\"clear\"),$=l(\"Collapse\"),Y=l(\"Markdown\",!0),K=l(\"schemes\"),G=l(\"OperationServers\"),Z=l(\"OperationExt\"),X=l(\"OperationSummary\"),Q=l(\"Link\"),ee=p().showExtensions;if(D&&r&&r.size>0){var te=!D.get(String(r.get(\"status\")))&&!D.get(\"default\");r=r.set(\"notDocumented\",te)}var ne=[S,w];return q.a.createElement(\"div\",{className:E?\"opblock opblock-deprecated\":x?\"opblock opblock-\".concat(w,\" is-open\"):\"opblock opblock-\".concat(w),id:Object(H.g)(U.join(\"-\"))},q.a.createElement(X,{operationProps:y,isShown:x,toggleShown:o,getComponent:l,authActions:h,authSelectors:m,specPath:t}),q.a.createElement($,{isOpened:x},q.a.createElement(\"div\",{className:\"opblock-body\"},M&&M.size||null===M?null:q.a.createElement(\"img\",{height:\"32px\",width:\"32px\",src:n(380),className:\"opblock-loading-animation\"}),E&&q.a.createElement(\"h4\",{className:\"opblock-title_normal\"},\" Warning: Deprecated\"),P&&q.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},q.a.createElement(\"div\",{className:\"opblock-description\"},q.a.createElement(Y,{source:P}))),N?q.a.createElement(\"div\",{className:\"opblock-external-docs-wrapper\"},q.a.createElement(\"h4\",{className:\"opblock-title_normal\"},\"Find more details\"),q.a.createElement(\"div\",{className:\"opblock-external-docs\"},q.a.createElement(\"span\",{className:\"opblock-external-docs__description\"},q.a.createElement(Y,{source:T.description})),q.a.createElement(Q,{target:\"_blank\",className:\"opblock-external-docs__link\",href:Object(H.F)(N)},N))):null,M&&M.size?q.a.createElement(F,{parameters:B,specPath:t.push(\"parameters\"),operation:M,onChangeKey:ne,onTryoutClick:i,onCancelClick:s,tryItOutEnabled:k,allowTryItOut:_,fn:u,getComponent:l,specActions:f,specSelectors:d,pathMethod:[S,w],getConfigs:p,oas3Actions:v,oas3Selectors:g}):null,k?q.a.createElement(G,{getComponent:l,path:S,method:w,operationServers:M.get(\"servers\"),pathServers:d.paths().getIn([S,\"servers\"]),getSelectedServer:g.selectedServer,setSelectedServer:v.setSelectedServer,setServerVariableValue:v.setServerVariableValue,getServerVariable:g.serverVariableValue,getEffectiveServerValue:g.serverEffectiveValue}):null,k&&_&&R&&R.size?q.a.createElement(\"div\",{className:\"opblock-schemes\"},q.a.createElement(K,{schemes:R,path:S,method:w,specActions:f,currentScheme:L})):null,q.a.createElement(\"div\",{className:k&&r&&_?\"btn-group\":\"execute-wrapper\"},k&&_?q.a.createElement(J,{operation:M,specActions:f,specSelectors:d,oas3Selectors:g,oas3Actions:v,path:S,method:w,onExecute:c,disabled:I}):null,k&&r&&_?q.a.createElement(W,{specActions:f,path:S,method:w}):null),I?q.a.createElement(\"div\",{className:\"loading-container\"},q.a.createElement(\"div\",{className:\"loading\"})):null,D?q.a.createElement(z,{responses:D,request:a,tryItOutResponse:r,getComponent:l,getConfigs:p,specSelectors:d,oas3Actions:v,oas3Selectors:g,specActions:f,produces:d.producesOptionsFor([S,w]),producesValue:d.currentProducesFor([S,w]),specPath:t.push(\"responses\"),path:S,method:w,displayRequestDuration:A,fn:u}):null,ee&&V.size?q.a.createElement(Z,{extensions:V,getComponent:l}):null)))}}]),r}(M.PureComponent);y()(lt,\"defaultProps\",{operation:null,response:null,request:null,specPath:Object(B.List)(),summary:\"\"});var pt=n(76),ft=n.n(pt),dt=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.isShown,r=t.toggleShown,a=t.getComponent,o=t.authActions,i=t.authSelectors,s=t.operationProps,u=t.specPath,l=s.toJS(),p=l.summary,f=l.isAuthorized,d=l.method,h=l.op,m=l.showSummary,v=l.path,g=l.operationId,y=l.originalOperationId,b=l.displayOperationId,E=h.summary,x=s.get(\"security\"),S=a(\"authorizeOperationBtn\"),w=a(\"OperationSummaryMethod\"),j=a(\"OperationSummaryPath\"),O=a(\"JumpToPath\",!0),C=x&&!!x.count(),_=C&&1===x.size&&x.first().isEmpty(),A=!C||_;return q.a.createElement(\"div\",{className:\"opblock-summary opblock-summary-\".concat(d)},q.a.createElement(\"button\",{\"aria-label\":c()(e=\"\".concat(d,\" \")).call(e,v.replace(/\\//g,\"​/\")),\"aria-expanded\":n,className:\"opblock-summary-control\",onClick:r},q.a.createElement(w,{method:d}),q.a.createElement(j,{getComponent:a,operationProps:s,specPath:u}),m?q.a.createElement(\"div\",{className:\"opblock-summary-description\"},ft()(E||p)):null,b&&(y||g)?q.a.createElement(\"span\",{className:\"opblock-summary-operation-id\"},y||g):null,q.a.createElement(\"svg\",{className:\"arrow\",width:\"20\",height:\"20\",\"aria-hidden\":\"true\",focusable:\"false\"},q.a.createElement(\"use\",{href:n?\"#large-arrow-up\":\"#large-arrow-down\",xlinkHref:n?\"#large-arrow-up\":\"#large-arrow-down\"}))),A?null:q.a.createElement(S,{isAuthorized:f,onClick:function(){var e=i.definitionsForRequirements(x);o.showDefinitions(e)}}),q.a.createElement(O,{path:u}))}}]),n}(M.PureComponent);y()(dt,\"defaultProps\",{operationProps:null,specPath:Object(B.List)(),summary:\"\"});var ht=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props.method;return q.a.createElement(\"span\",{className:\"opblock-summary-method\"},e.toUpperCase())}}]),n}(M.PureComponent);y()(ht,\"defaultProps\",{operationProps:null});var mt=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onCopyCapture\",(function(e){e.clipboardData.setData(\"text/plain\",r.props.operationProps.get(\"path\")),e.preventDefault()})),r}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.getComponent,r=t.operationProps.toJS(),a=r.deprecated,o=r.isShown,i=r.path,s=r.tag,u=r.operationId,l=r.isDeepLinkingEnabled,p=n(\"DeepLink\");return q.a.createElement(\"span\",{className:a?\"opblock-summary-path__deprecated\":\"opblock-summary-path\",onCopyCapture:this.onCopyCapture,\"data-path\":i},q.a.createElement(p,{enabled:l,isShown:o,path:Object(H.d)(c()(e=\"\".concat(s,\"/\")).call(e,u)),text:i.replace(/\\//g,\"​/\")}))}}]),n}(M.PureComponent),vt=n(13),gt=n.n(vt),yt=function(e){var t,n=e.extensions,r=(0,e.getComponent)(\"OperationExtRow\");return q.a.createElement(\"div\",{className:\"opblock-section\"},q.a.createElement(\"div\",{className:\"opblock-section-header\"},q.a.createElement(\"h4\",null,\"Extensions\")),q.a.createElement(\"div\",{className:\"table-container\"},q.a.createElement(\"table\",null,q.a.createElement(\"thead\",null,q.a.createElement(\"tr\",null,q.a.createElement(\"td\",{className:\"col_header\"},\"Field\"),q.a.createElement(\"td\",{className:\"col_header\"},\"Value\"))),q.a.createElement(\"tbody\",null,N()(t=n.entrySeq()).call(t,(function(e){var t,n=gt()(e,2),a=n[0],o=n[1];return q.a.createElement(r,{key:c()(t=\"\".concat(a,\"-\")).call(t,o),xKey:a,xVal:o})}))))))},bt=function(e){var t=e.xKey,n=e.xVal,r=n?n.toJS?n.toJS():n:null;return q.a.createElement(\"tr\",null,q.a.createElement(\"td\",null,t),q.a.createElement(\"td\",null,h()(r)))},Et=n(80),xt=n(39),St=n.n(xt),wt=n(408),jt=n.n(wt),Ot=n(116),Ct=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"downloadText\",(function(){jt()(r.props.value,r.props.fileName||\"response.txt\")})),y()(ve()(r),\"preventYScrollingBeyondElement\",(function(e){var t=e.target,n=e.nativeEvent.deltaY,r=t.scrollHeight,a=t.offsetHeight,o=t.scrollTop;r>a&&(0===o&&n<0||a+o>=r&&n>0)&&e.preventDefault()})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.value,n=e.className,r=e.downloadable,a=e.getConfigs,o=e.canCopy,i=e.language,s=a?a():{syntaxHighlight:{activated:!0,theme:\"agate\"}};n=n||\"\";var c=St()(s,\"syntaxHighlight.activated\")?q.a.createElement(Et.a,{language:i,className:n+\" microlight\",onWheel:this.preventYScrollingBeyondElement,style:Object(Et.b)(St()(s,\"syntaxHighlight.theme\"))},t):q.a.createElement(\"pre\",{onWheel:this.preventYScrollingBeyondElement,className:n+\" microlight\"},t);return q.a.createElement(\"div\",{className:\"highlight-code\"},r?q.a.createElement(\"div\",{className:\"download-contents\",onClick:this.downloadText},\"Download\"):null,o?q.a.createElement(\"div\",{className:\"copy-to-clipboard\"},q.a.createElement(Ot.CopyToClipboard,{text:t},q.a.createElement(\"button\",null))):null,c)}}]),n}(M.Component);var _t=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onChangeProducesWrapper\",(function(e){return r.props.specActions.changeProducesValue([r.props.path,r.props.method],e)})),y()(ve()(r),\"onResponseContentTypeChange\",(function(e){var t=e.controlsAcceptHeader,n=e.value,a=r.props,o=a.oas3Actions,i=a.path,s=a.method;t&&o.setResponseContentType({value:n,path:i,method:s})})),r}return S()(n,[{key:\"render\",value:function(){var e,t,r=this,a=this.props,o=a.responses,i=a.tryItOutResponse,s=a.getComponent,u=a.getConfigs,l=a.specSelectors,p=a.fn,f=a.producesValue,d=a.displayRequestDuration,h=a.specPath,m=a.path,v=a.method,g=a.oas3Selectors,y=a.oas3Actions,b=Object(H.f)(o),E=s(\"contentType\"),x=s(\"liveResponse\"),S=s(\"response\"),w=this.props.produces&&this.props.produces.size?this.props.produces:n.defaultProps.produces,j=l.isOAS3()?Object(H.k)(o):null,O=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"_\";return e.replace(/[^\\w-]/g,t)}(c()(e=\"\".concat(v)).call(e,m,\"_responses\")),C=\"\".concat(O,\"_select\");return q.a.createElement(\"div\",{className:\"responses-wrapper\"},q.a.createElement(\"div\",{className:\"opblock-section-header\"},q.a.createElement(\"h4\",null,\"Responses\"),l.isOAS3()?null:q.a.createElement(\"label\",{htmlFor:C},q.a.createElement(\"span\",null,\"Response content type\"),q.a.createElement(E,{value:f,ariaControls:O,ariaLabel:\"Response content type\",className:\"execute-content-type\",contentTypes:w,controlId:C,onChange:this.onChangeProducesWrapper}))),q.a.createElement(\"div\",{className:\"responses-inner\"},i?q.a.createElement(\"div\",null,q.a.createElement(x,{response:i,getComponent:s,getConfigs:u,specSelectors:l,path:this.props.path,method:this.props.method,displayRequestDuration:d}),q.a.createElement(\"h4\",null,\"Responses\")):null,q.a.createElement(\"table\",{\"aria-live\":\"polite\",className:\"responses-table\",id:O,role:\"region\"},q.a.createElement(\"thead\",null,q.a.createElement(\"tr\",{className:\"responses-header\"},q.a.createElement(\"td\",{className:\"col_header response-col_status\"},\"Code\"),q.a.createElement(\"td\",{className:\"col_header response-col_description\"},\"Description\"),l.isOAS3()?q.a.createElement(\"td\",{className:\"col col_header response-col_links\"},\"Links\"):null)),q.a.createElement(\"tbody\",null,N()(t=o.entrySeq()).call(t,(function(e){var t=gt()(e,2),n=t[0],a=t[1],o=i&&i.get(\"status\")==n?\"response_current\":\"\";return q.a.createElement(S,{key:n,path:m,method:v,specPath:h.push(n),isDefault:b===n,fn:p,className:o,code:n,response:a,specSelectors:l,controlsAcceptHeader:a===j,onContentTypeChange:r.onResponseContentTypeChange,contentType:f,getConfigs:u,activeExamplesKey:g.activeExamplesMember(m,v,\"responses\",n),oas3Actions:y,getComponent:s})})).toArray()))))}}]),n}(q.a.Component);y()(_t,\"defaultProps\",{tryItOutResponse:null,produces:Object(B.fromJS)([\"application/json\"]),displayRequestDuration:!1});var At=n(24),kt=n.n(At),It=n(409),Pt=n.n(It),Tt=n(54),Rt=n.n(Tt),Nt=n(85),Mt=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;return E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"_onContentTypeChange\",(function(e){var t=a.props,n=t.onContentTypeChange,r=t.controlsAcceptHeader;a.setState({responseContentType:e}),n({value:e,controlsAcceptHeader:r})})),y()(ve()(a),\"getTargetExamplesKey\",(function(){var e=a.props,t=e.response,n=e.contentType,r=e.activeExamplesKey,o=a.state.responseContentType||n,i=t.getIn([\"content\",o],Object(B.Map)({})).get(\"examples\",null).keySeq().first();return r||i})),a.state={responseContentType:\"\"},a}return S()(n,[{key:\"render\",value:function(){var e,t,n,r,a,o=this.props,i=o.path,s=o.method,u=o.code,l=o.response,p=o.className,f=o.specPath,d=o.fn,h=o.getComponent,m=o.getConfigs,v=o.specSelectors,g=o.contentType,y=o.controlsAcceptHeader,b=o.oas3Actions,E=d.inferSchema,x=v.isOAS3(),S=m().showExtensions,w=S?Object(H.m)(l):null,j=l.get(\"headers\"),O=l.get(\"links\"),C=h(\"ResponseExtension\"),_=h(\"headers\"),A=h(\"highlightCode\"),k=h(\"modelExample\"),I=h(\"Markdown\",!0),P=h(\"operationLink\"),T=h(\"contentType\"),R=h(\"ExamplesSelect\"),M=h(\"Example\"),D=this.state.responseContentType||g,L=l.getIn([\"content\",D],Object(B.Map)({})),U=L.get(\"examples\",null);if(x){var V=L.get(\"schema\");n=V?E(V.toJS()):null,r=V?Object(B.List)([\"content\",this.state.responseContentType,\"schema\"]):f}else n=l.get(\"schema\"),r=l.has(\"schema\")?f.push(\"schema\"):f;var z,F=!1,J={includeReadOnly:!0};if(x){var W;if(z=null===(W=L.get(\"schema\"))||void 0===W?void 0:W.toJS(),U){var $=this.getTargetExamplesKey(),Y=function(e){return e.get(\"value\")};void 0===(a=Y(U.get($,Object(B.Map)({}))))&&(a=Y(Pt()(U).call(U).next().value)),F=!0}else void 0!==L.get(\"example\")&&(a=L.get(\"example\"),F=!0)}else{z=n,J=kt()(kt()({},J),{},{includeWriteOnly:!0});var K=l.getIn([\"examples\",D]);K&&(a=K,F=!0)}var G=function(e,t,n){if(null!=e){var r=null;return Object(Nt.a)(e)&&(r=\"json\"),q.a.createElement(\"div\",null,q.a.createElement(t,{className:\"example\",getConfigs:n,language:r,value:Object(H.I)(e)}))}return null}(Object(H.o)(z,D,J,F?a:void 0),A,m);return q.a.createElement(\"tr\",{className:\"response \"+(p||\"\"),\"data-code\":u},q.a.createElement(\"td\",{className:\"response-col_status\"},u),q.a.createElement(\"td\",{className:\"response-col_description\"},q.a.createElement(\"div\",{className:\"response-col_description__inner\"},q.a.createElement(I,{source:l.get(\"description\")})),S&&w.size?N()(e=w.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(C,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),xKey:r,xVal:a})})):null,x&&l.get(\"content\")?q.a.createElement(\"section\",{className:\"response-controls\"},q.a.createElement(\"div\",{className:Rt()(\"response-control-media-type\",{\"response-control-media-type--accept-controller\":y})},q.a.createElement(\"small\",{className:\"response-control-media-type__title\"},\"Media type\"),q.a.createElement(T,{value:this.state.responseContentType,contentTypes:l.get(\"content\")?l.get(\"content\").keySeq():Object(B.Seq)(),onChange:this._onContentTypeChange,ariaLabel:\"Media Type\"}),y?q.a.createElement(\"small\",{className:\"response-control-media-type__accept-message\"},\"Controls \",q.a.createElement(\"code\",null,\"Accept\"),\" header.\"):null),U?q.a.createElement(\"div\",{className:\"response-control-examples\"},q.a.createElement(\"small\",{className:\"response-control-examples__title\"},\"Examples\"),q.a.createElement(R,{examples:U,currentExampleKey:this.getTargetExamplesKey(),onSelect:function(e){return b.setActiveExamplesMember({name:e,pathMethod:[i,s],contextType:\"responses\",contextName:u})},showLabels:!1})):null):null,G||n?q.a.createElement(k,{specPath:r,getComponent:h,getConfigs:m,specSelectors:v,schema:Object(H.i)(n),example:G,includeReadOnly:!0}):null,x&&U?q.a.createElement(M,{example:U.get(this.getTargetExamplesKey(),Object(B.Map)({})),getComponent:h,getConfigs:m,omitValue:!0}):null,j?q.a.createElement(_,{headers:j,getComponent:h}):null),x?q.a.createElement(\"td\",{className:\"response-col_links\"},O?N()(t=O.toSeq().entrySeq()).call(t,(function(e){var t=gt()(e,2),n=t[0],r=t[1];return q.a.createElement(P,{key:n,name:n,link:r,getComponent:h})})):q.a.createElement(\"i\",null,\"No links\")):null)}}]),n}(q.a.Component);y()(Mt,\"defaultProps\",{response:Object(B.fromJS)({}),onContentTypeChange:function(){}});var qt=function(e){var t=e.xKey,n=e.xVal;return q.a.createElement(\"div\",{className:\"response__extension\"},t,\": \",String(n))},Dt=n(410),Bt=n.n(Dt),Lt=n(411),Ut=n.n(Lt),Vt=n(287),zt=n.n(Vt),Ft=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"state\",{parsedContent:null}),y()(ve()(r),\"updateParsedContent\",(function(e){var t=r.props.content;if(e!==t)if(t&&t instanceof Blob){var n=new FileReader;n.onload=function(){r.setState({parsedContent:n.result})},n.readAsText(t)}else r.setState({parsedContent:t.toString()})})),r}return S()(n,[{key:\"componentDidMount\",value:function(){this.updateParsedContent(null)}},{key:\"componentDidUpdate\",value:function(e){this.updateParsedContent(e.content)}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.content,a=n.contentType,o=n.url,i=n.headers,s=void 0===i?{}:i,c=n.getConfigs,u=n.getComponent,l=this.state.parsedContent,p=u(\"highlightCode\"),f=\"response_\"+(new Date).getTime();if(o=o||\"\",/^application\\/octet-stream/i.test(a)||s[\"Content-Disposition\"]&&/attachment/i.test(s[\"Content-Disposition\"])||s[\"content-disposition\"]&&/attachment/i.test(s[\"content-disposition\"])||s[\"Content-Description\"]&&/File Transfer/i.test(s[\"Content-Description\"])||s[\"content-description\"]&&/File Transfer/i.test(s[\"content-description\"]))if(\"Blob\"in window){var d=a||\"text/html\",m=r instanceof Blob?r:new Blob([r],{type:d}),v=ot.a.createObjectURL(m),g=[d,o.substr(Bt()(o).call(o,\"/\")+1),v].join(\":\"),y=s[\"content-disposition\"]||s[\"Content-Disposition\"];if(void 0!==y){var b=Object(H.h)(y);null!==b&&(g=b)}t=W.a.navigator&&W.a.navigator.msSaveOrOpenBlob?q.a.createElement(\"div\",null,q.a.createElement(\"a\",{href:v,onClick:function(){return W.a.navigator.msSaveOrOpenBlob(m,g)}},\"Download file\")):q.a.createElement(\"div\",null,q.a.createElement(\"a\",{href:v,download:g},\"Download file\"))}else t=q.a.createElement(\"pre\",{className:\"microlight\"},\"Download headers detected but your browser does not support downloading binary via XHR (Blob).\");else if(/json/i.test(a)){var E=null;Object(Nt.a)(r)&&(E=\"json\");try{e=h()(JSON.parse(r),null,\"  \")}catch(t){e=\"can't parse JSON.  Raw result:\\n\\n\"+r}t=q.a.createElement(p,{language:E,downloadable:!0,fileName:\"\".concat(f,\".json\"),value:e,getConfigs:c,canCopy:!0})}else/xml/i.test(a)?(e=Ut()(r,{textNodesOnSameLine:!0,indentor:\"  \"}),t=q.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".xml\"),value:e,getConfigs:c,canCopy:!0})):t=\"text/html\"===zt()(a)||/text\\/plain/.test(a)?q.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".html\"),value:r,getConfigs:c,canCopy:!0}):\"text/csv\"===zt()(a)||/text\\/csv/.test(a)?q.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".csv\"),value:r,getConfigs:c,canCopy:!0}):/^image\\//i.test(a)?He()(a).call(a,\"svg\")?q.a.createElement(\"div\",null,\" \",r,\" \"):q.a.createElement(\"img\",{className:\"full-width\",src:ot.a.createObjectURL(r)}):/^audio\\//i.test(a)?q.a.createElement(\"pre\",{className:\"microlight\"},q.a.createElement(\"audio\",{controls:!0},q.a.createElement(\"source\",{src:o,type:a}))):\"string\"==typeof r?q.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".txt\"),value:r,getConfigs:c,canCopy:!0}):r.size>0?l?q.a.createElement(\"div\",null,q.a.createElement(\"p\",{className:\"i\"},\"Unrecognized response type; displaying content as text.\"),q.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".txt\"),value:l,getConfigs:c,canCopy:!0})):q.a.createElement(\"p\",{className:\"i\"},\"Unrecognized response type; unable to display.\"):null;return t?q.a.createElement(\"div\",null,q.a.createElement(\"h5\",null,\"Response body\"),t):null}}]),n}(q.a.PureComponent),Jt=n(14),Wt=n.n(Jt),Ht=n(167),$t=n.n(Ht),Yt=function(e){ye()(n,e);var t=Ee()(n);function n(e){var r;return E()(this,n),r=t.call(this,e),y()(ve()(r),\"onChange\",(function(e,t,n){var a=r.props;(0,a.specActions.changeParamByIdentity)(a.onChangeKey,e,t,n)})),y()(ve()(r),\"onChangeConsumesWrapper\",(function(e){var t=r.props;(0,t.specActions.changeConsumesValue)(t.onChangeKey,e)})),y()(ve()(r),\"toggleTab\",(function(e){return\"parameters\"===e?r.setState({parametersVisible:!0,callbackVisible:!1}):\"callbacks\"===e?r.setState({callbackVisible:!0,parametersVisible:!1}):void 0})),y()(ve()(r),\"onChangeMediaType\",(function(e){var t=e.value,n=e.pathMethod,a=r.props,o=a.specActions,i=a.oas3Selectors,s=a.oas3Actions,c=i.hasUserEditedBody.apply(i,Wt()(n)),u=i.shouldRetainRequestBodyValue.apply(i,Wt()(n));s.setRequestContentType({value:t,pathMethod:n}),s.initRequestBodyValidateError({pathMethod:n}),c||(u||s.setRequestBodyValue({value:void 0,pathMethod:n}),o.clearResponse.apply(o,Wt()(n)),o.clearRequest.apply(o,Wt()(n)),o.clearValidateParams(n))})),r.state={callbackVisible:!1,parametersVisible:!0},r}return S()(n,[{key:\"render\",value:function(){var e,t,n=this,r=this.props,a=r.onTryoutClick,o=r.parameters,i=r.allowTryItOut,s=r.tryItOutEnabled,u=r.specPath,l=r.fn,p=r.getComponent,f=r.getConfigs,d=r.specSelectors,h=r.specActions,m=r.pathMethod,v=r.oas3Actions,g=r.oas3Selectors,y=r.operation,b=p(\"parameterRow\"),E=p(\"TryItOutButton\"),x=p(\"contentType\"),S=p(\"Callbacks\",!0),w=p(\"RequestBody\",!0),j=s&&i,O=d.isOAS3(),C=y.get(\"requestBody\"),_=T()(e=$t()(T()(o).call(o,(function(e,t){var n,r=t.get(\"in\");return null!==(n=e[r])&&void 0!==n||(e[r]=[]),e[r].push(t),e}),{}))).call(e,(function(e,t){return c()(e).call(e,t)}),[]);return q.a.createElement(\"div\",{className:\"opblock-section\"},q.a.createElement(\"div\",{className:\"opblock-section-header\"},O?q.a.createElement(\"div\",{className:\"tab-header\"},q.a.createElement(\"div\",{onClick:function(){return n.toggleTab(\"parameters\")},className:\"tab-item \".concat(this.state.parametersVisible&&\"active\")},q.a.createElement(\"h4\",{className:\"opblock-title\"},q.a.createElement(\"span\",null,\"Parameters\"))),y.get(\"callbacks\")?q.a.createElement(\"div\",{onClick:function(){return n.toggleTab(\"callbacks\")},className:\"tab-item \".concat(this.state.callbackVisible&&\"active\")},q.a.createElement(\"h4\",{className:\"opblock-title\"},q.a.createElement(\"span\",null,\"Callbacks\"))):null):q.a.createElement(\"div\",{className:\"tab-header\"},q.a.createElement(\"h4\",{className:\"opblock-title\"},\"Parameters\")),i?q.a.createElement(E,{isOAS3:d.isOAS3(),hasUserEditedBody:g.hasUserEditedBody.apply(g,Wt()(m)),enabled:s,onCancelClick:this.props.onCancelClick,onTryoutClick:a,onResetClick:function(){return v.setRequestBodyValue({value:void 0,pathMethod:m})}}):null),this.state.parametersVisible?q.a.createElement(\"div\",{className:\"parameters-container\"},_.length?q.a.createElement(\"div\",{className:\"table-container\"},q.a.createElement(\"table\",{className:\"parameters\"},q.a.createElement(\"thead\",null,q.a.createElement(\"tr\",null,q.a.createElement(\"th\",{className:\"col_header parameters-col_name\"},\"Name\"),q.a.createElement(\"th\",{className:\"col_header parameters-col_description\"},\"Description\"))),q.a.createElement(\"tbody\",null,N()(_).call(_,(function(e,t){var r;return q.a.createElement(b,{fn:l,specPath:u.push(t.toString()),getComponent:p,getConfigs:f,rawParam:e,param:d.parameterWithMetaByIdentity(m,e),key:c()(r=\"\".concat(e.get(\"in\"),\".\")).call(r,e.get(\"name\")),onChange:n.onChange,onChangeConsumes:n.onChangeConsumesWrapper,specSelectors:d,specActions:h,oas3Actions:v,oas3Selectors:g,pathMethod:m,isExecute:j})}))))):q.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},q.a.createElement(\"p\",null,\"No parameters\"))):null,this.state.callbackVisible?q.a.createElement(\"div\",{className:\"callbacks-container opblock-description-wrapper\"},q.a.createElement(S,{callbacks:Object(B.Map)(y.get(\"callbacks\")),specPath:A()(u).call(u,0,-1).push(\"callbacks\")})):null,O&&C&&this.state.parametersVisible&&q.a.createElement(\"div\",{className:\"opblock-section opblock-section-request-body\"},q.a.createElement(\"div\",{className:\"opblock-section-header\"},q.a.createElement(\"h4\",{className:\"opblock-title parameter__name \".concat(C.get(\"required\")&&\"required\")},\"Request body\"),q.a.createElement(\"label\",null,q.a.createElement(x,{value:g.requestContentType.apply(g,Wt()(m)),contentTypes:C.get(\"content\",Object(B.List)()).keySeq(),onChange:function(e){n.onChangeMediaType({value:e,pathMethod:m})},className:\"body-param-content-type\",ariaLabel:\"Request content type\"}))),q.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},q.a.createElement(w,{setRetainRequestBodyValueFlag:function(e){return v.setRetainRequestBodyValueFlag({value:e,pathMethod:m})},userHasEditedBody:g.hasUserEditedBody.apply(g,Wt()(m)),specPath:A()(u).call(u,0,-1).push(\"requestBody\"),requestBody:C,requestBodyValue:g.requestBodyValue.apply(g,Wt()(m)),requestBodyInclusionSetting:g.requestBodyInclusionSetting.apply(g,Wt()(m)),requestBodyErrors:g.requestBodyErrors.apply(g,Wt()(m)),isExecute:j,getConfigs:f,activeExamplesKey:g.activeExamplesMember.apply(g,c()(t=Wt()(m)).call(t,[\"requestBody\",\"requestBody\"])),updateActiveExamplesKey:function(e){n.props.oas3Actions.setActiveExamplesMember({name:e,pathMethod:n.props.pathMethod,contextType:\"requestBody\",contextName:\"requestBody\"})},onChange:function(e,t){if(t){var n=g.requestBodyValue.apply(g,Wt()(m)),r=B.Map.isMap(n)?n:Object(B.Map)();return v.setRequestBodyValue({pathMethod:m,value:r.setIn(t,e)})}v.setRequestBodyValue({value:e,pathMethod:m})},onChangeIncludeEmpty:function(e,t){v.setRequestBodyInclusion({pathMethod:m,value:t,name:e})},contentType:g.requestContentType.apply(g,Wt()(m))}))))}}]),n}(M.Component);y()(Yt,\"defaultProps\",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,tryItOutEnabled:!1,allowTryItOut:!0,onChangeKey:[],specPath:[]});var Kt=function(e){var t=e.xKey,n=e.xVal;return q.a.createElement(\"div\",{className:\"parameter__extension\"},t,\": \",String(n))},Gt={onChange:function(){},isIncludedOptions:{}},Zt=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onCheckboxChange\",(function(e){(0,r.props.onChange)(e.target.checked)})),r}return S()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.isIncludedOptions,n=e.onChange,r=t.shouldDispatchInit,a=t.defaultValue;r&&n(a)}},{key:\"render\",value:function(){var e=this.props,t=e.isIncluded,n=e.isDisabled;return q.a.createElement(\"div\",null,q.a.createElement(\"label\",{className:Rt()(\"parameter__empty_value_toggle\",{disabled:n})},q.a.createElement(\"input\",{type:\"checkbox\",disabled:n,checked:!n&&t,onChange:this.onCheckboxChange}),\"Send empty value\"))}}]),n}(M.Component);y()(Zt,\"defaultProps\",Gt);var Xt=n(118),Qt=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;return E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"onChangeWrapper\",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=a.props,r=n.onChange,o=n.rawParam;return r(o,\"\"===e||e&&0===e.size?null:e,t)})),y()(ve()(a),\"_onExampleSelect\",(function(e){a.props.oas3Actions.setActiveExamplesMember({name:e,pathMethod:a.props.pathMethod,contextType:\"parameters\",contextName:a.getParamKey()})})),y()(ve()(a),\"onChangeIncludeEmpty\",(function(e){var t=a.props,n=t.specActions,r=t.param,o=t.pathMethod,i=r.get(\"name\"),s=r.get(\"in\");return n.updateEmptyParamInclusion(o,i,s,e)})),y()(ve()(a),\"setDefaultValue\",(function(){var e=a.props,t=e.specSelectors,n=e.pathMethod,r=e.rawParam,o=e.oas3Selectors,i=t.parameterWithMetaByIdentity(n,r)||Object(B.Map)(),s=Object(Xt.a)(i,{isOAS3:t.isOAS3()}).schema,u=i.get(\"content\",Object(B.Map)()).keySeq().first(),l=s?Object(H.o)(s.toJS(),u,{includeWriteOnly:!0}):null;if(i&&void 0===i.get(\"value\")&&\"body\"!==i.get(\"in\")){var p;if(t.isSwagger2())p=void 0!==i.get(\"x-example\")?i.get(\"x-example\"):void 0!==i.getIn([\"schema\",\"example\"])?i.getIn([\"schema\",\"example\"]):s&&s.getIn([\"default\"]);else if(t.isOAS3()){var f,d=o.activeExamplesMember.apply(o,c()(f=Wt()(n)).call(f,[\"parameters\",a.getParamKey()]));p=void 0!==i.getIn([\"examples\",d,\"value\"])?i.getIn([\"examples\",d,\"value\"]):void 0!==i.getIn([\"content\",u,\"example\"])?i.getIn([\"content\",u,\"example\"]):void 0!==i.get(\"example\")?i.get(\"example\"):void 0!==(s&&s.get(\"example\"))?s&&s.get(\"example\"):void 0!==(s&&s.get(\"default\"))?s&&s.get(\"default\"):i.get(\"default\")}void 0===p||B.List.isList(p)||(p=Object(H.I)(p)),void 0!==p?a.onChangeWrapper(p):s&&\"object\"===s.get(\"type\")&&l&&!i.get(\"examples\")&&a.onChangeWrapper(B.List.isList(l)?l:Object(H.I)(l))}})),a.setDefaultValue(),a}return S()(n,[{key:\"componentWillReceiveProps\",value:function(e){var t,n=e.specSelectors,r=e.pathMethod,a=e.rawParam,o=n.isOAS3(),i=n.parameterWithMetaByIdentity(r,a)||new B.Map;if(i=i.isEmpty()?a:i,o){var s=Object(Xt.a)(i,{isOAS3:o}).schema;t=s?s.get(\"enum\"):void 0}else t=i?i.get(\"enum\"):void 0;var c,u=i?i.get(\"value\"):void 0;void 0!==u?c=u:a.get(\"required\")&&t&&t.size&&(c=t.first()),void 0!==c&&c!==u&&this.onChangeWrapper(Object(H.w)(c)),this.setDefaultValue()}},{key:\"getParamKey\",value:function(){var e,t=this.props.param;return t?c()(e=\"\".concat(t.get(\"name\"),\"-\")).call(e,t.get(\"in\")):null}},{key:\"render\",value:function(){var e,t,n,r,a=this.props,o=a.param,i=a.rawParam,s=a.getComponent,u=a.getConfigs,l=a.isExecute,p=a.fn,f=a.onChangeConsumes,d=a.specSelectors,h=a.pathMethod,m=a.specPath,v=a.oas3Selectors,g=d.isOAS3(),y=u(),b=y.showExtensions,E=y.showCommonExtensions;if(o||(o=i),!i)return null;var x,S,w,j,O=s(\"JsonSchemaForm\"),C=s(\"ParamBody\"),_=o.get(\"in\"),A=\"body\"!==_?null:q.a.createElement(C,{getComponent:s,getConfigs:u,fn:p,param:o,consumes:d.consumesOptionsFor(h),consumesValue:d.contentTypeValues(h).get(\"requestContentType\"),onChange:this.onChangeWrapper,onChangeConsumes:f,isExecute:l,specSelectors:d,pathMethod:h}),k=s(\"modelExample\"),I=s(\"Markdown\",!0),P=s(\"ParameterExt\"),T=s(\"ParameterIncludeEmpty\"),R=s(\"ExamplesSelectValueRetainer\"),M=s(\"Example\"),D=Object(Xt.a)(o,{isOAS3:g}).schema,L=d.parameterWithMetaByIdentity(h,i)||Object(B.Map)(),U=D?D.get(\"format\"):null,V=D?D.get(\"type\"):null,z=D?D.getIn([\"items\",\"type\"]):null,F=\"formData\"===_,J=\"FormData\"in W.a,$=o.get(\"required\"),Y=L?L.get(\"value\"):\"\",K=E?Object(H.l)(D):null,G=b?Object(H.m)(o):null,Z=!1;return void 0!==o&&D&&(x=D.get(\"items\")),void 0!==x?(S=x.get(\"enum\"),w=x.get(\"default\")):D&&(S=D.get(\"enum\")),S&&S.size&&S.size>0&&(Z=!0),void 0!==o&&(D&&(w=D.get(\"default\")),void 0===w&&(w=o.get(\"default\")),void 0===(j=o.get(\"example\"))&&(j=o.get(\"x-example\"))),q.a.createElement(\"tr\",{\"data-param-name\":o.get(\"name\"),\"data-param-in\":o.get(\"in\")},q.a.createElement(\"td\",{className:\"parameters-col_name\"},q.a.createElement(\"div\",{className:$?\"parameter__name required\":\"parameter__name\"},o.get(\"name\"),$?q.a.createElement(\"span\",null,\" *\"):null),q.a.createElement(\"div\",{className:\"parameter__type\"},V,z&&\"[\".concat(z,\"]\"),U&&q.a.createElement(\"span\",{className:\"prop-format\"},\"($\",U,\")\")),q.a.createElement(\"div\",{className:\"parameter__deprecated\"},g&&o.get(\"deprecated\")?\"deprecated\":null),q.a.createElement(\"div\",{className:\"parameter__in\"},\"(\",o.get(\"in\"),\")\"),E&&K.size?N()(e=K.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(P,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),xKey:r,xVal:a})})):null,b&&G.size?N()(t=G.entrySeq()).call(t,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(P,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),xKey:r,xVal:a})})):null),q.a.createElement(\"td\",{className:\"parameters-col_description\"},o.get(\"description\")?q.a.createElement(I,{source:o.get(\"description\")}):null,!A&&l||!Z?null:q.a.createElement(I,{className:\"parameter__enum\",source:\"<i>Available values</i> : \"+N()(S).call(S,(function(e){return e})).toArray().join(\", \")}),!A&&l||void 0===w?null:q.a.createElement(I,{className:\"parameter__default\",source:\"<i>Default value</i> : \"+w}),!A&&l||void 0===j?null:q.a.createElement(I,{source:\"<i>Example</i> : \"+j}),F&&!J&&q.a.createElement(\"div\",null,\"Error: your browser does not support FormData\"),g&&o.get(\"examples\")?q.a.createElement(\"section\",{className:\"parameter-controls\"},q.a.createElement(R,{examples:o.get(\"examples\"),onSelect:this._onExampleSelect,updateValue:this.onChangeWrapper,getComponent:s,defaultToFirstExample:!0,currentKey:v.activeExamplesMember.apply(v,c()(n=Wt()(h)).call(n,[\"parameters\",this.getParamKey()])),currentUserInputValue:Y})):null,A?null:q.a.createElement(O,{fn:p,getComponent:s,value:Y,required:$,disabled:!l,description:o.get(\"name\"),onChange:this.onChangeWrapper,errors:L.get(\"errors\"),schema:D}),A&&D?q.a.createElement(k,{getComponent:s,specPath:m.push(\"schema\"),getConfigs:u,isExecute:l,specSelectors:d,schema:D,example:A,includeWriteOnly:!0}):null,!A&&l&&o.get(\"allowEmptyValue\")?q.a.createElement(T,{onChange:this.onChangeIncludeEmpty,isIncluded:d.parameterInclusionSettingFor(h,o.get(\"name\"),o.get(\"in\")),isDisabled:!Object(H.q)(Y)}):null,g&&o.get(\"examples\")?q.a.createElement(M,{example:o.getIn([\"examples\",v.activeExamplesMember.apply(v,c()(r=Wt()(h)).call(r,[\"parameters\",this.getParamKey()]))]),getComponent:s,getConfigs:u}):null))}}]),n}(M.Component),en=n(23),tn=n.n(en),nn=n(175),rn=n.n(nn),an=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"handleValidateParameters\",(function(){var e=r.props,t=e.specSelectors,n=e.specActions,a=e.path,o=e.method;return n.validateParams([a,o]),t.validateBeforeExecute([a,o])})),y()(ve()(r),\"handleValidateRequestBody\",(function(){var e=r.props,t=e.path,n=e.method,a=e.specSelectors,o=e.oas3Selectors,i=e.oas3Actions,s={missingBodyValue:!1,missingRequiredKeys:[]};i.clearRequestBodyValidateError({path:t,method:n});var c=a.getOAS3RequiredRequestBodyContentType([t,n]),u=o.requestBodyValue(t,n),l=o.validateBeforeExecute([t,n]),p=o.requestContentType(t,n);if(!l)return s.missingBodyValue=!0,i.setRequestBodyValidateError({path:t,method:n,validationErrors:s}),!1;if(!c)return!0;var f=o.validateShallowRequired({oas3RequiredRequestBodyContentType:c,oas3RequestContentType:p,oas3RequestBodyValue:u});return!f||f.length<1||(tn()(f).call(f,(function(e){s.missingRequiredKeys.push(e)})),i.setRequestBodyValidateError({path:t,method:n,validationErrors:s}),!1)})),y()(ve()(r),\"handleValidationResultPass\",(function(){var e=r.props,t=e.specActions,n=e.operation,a=e.path,o=e.method;r.props.onExecute&&r.props.onExecute(),t.execute({operation:n,path:a,method:o})})),y()(ve()(r),\"handleValidationResultFail\",(function(){var e=r.props,t=e.specActions,n=e.path,a=e.method;t.clearValidateParams([n,a]),rn()((function(){t.validateParams([n,a])}),40)})),y()(ve()(r),\"handleValidationResult\",(function(e){e?r.handleValidationResultPass():r.handleValidationResultFail()})),y()(ve()(r),\"onClick\",(function(){var e=r.handleValidateParameters(),t=r.handleValidateRequestBody(),n=e&&t;r.handleValidationResult(n)})),y()(ve()(r),\"onChangeProducesWrapper\",(function(e){return r.props.specActions.changeProducesValue([r.props.path,r.props.method],e)})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props.disabled;return q.a.createElement(\"button\",{className:\"btn execute opblock-control__btn\",onClick:this.onClick,disabled:e},\"Execute\")}}]),n}(M.Component),on=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.headers,r=t.getComponent,a=r(\"Property\"),o=r(\"Markdown\",!0);return n&&n.size?q.a.createElement(\"div\",{className:\"headers-wrapper\"},q.a.createElement(\"h4\",{className:\"headers__title\"},\"Headers:\"),q.a.createElement(\"table\",{className:\"headers\"},q.a.createElement(\"thead\",null,q.a.createElement(\"tr\",{className:\"header-row\"},q.a.createElement(\"th\",{className:\"header-col\"},\"Name\"),q.a.createElement(\"th\",{className:\"header-col\"},\"Description\"),q.a.createElement(\"th\",{className:\"header-col\"},\"Type\"))),q.a.createElement(\"tbody\",null,N()(e=n.entrySeq()).call(e,(function(e){var t=gt()(e,2),n=t[0],r=t[1];if(!L.a.Map.isMap(r))return null;var i=r.get(\"description\"),s=r.getIn([\"schema\"])?r.getIn([\"schema\",\"type\"]):r.getIn([\"type\"]),c=r.getIn([\"schema\",\"example\"]);return q.a.createElement(\"tr\",{key:n},q.a.createElement(\"td\",{className:\"header-col\"},n),q.a.createElement(\"td\",{className:\"header-col\"},i?q.a.createElement(o,{source:i}):null),q.a.createElement(\"td\",{className:\"header-col\"},s,\" \",c?q.a.createElement(a,{propKey:\"Example\",propVal:c,propClass:\"header-example\"}):null))})).toArray()))):null}}]),n}(q.a.Component),sn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.editorActions,n=e.errSelectors,r=e.layoutSelectors,a=e.layoutActions,o=(0,e.getComponent)(\"Collapse\");if(t&&t.jumpToLine)var i=t.jumpToLine;var s=n.allErrors(),c=l()(s).call(s,(function(e){return\"thrown\"===e.get(\"type\")||\"error\"===e.get(\"level\")}));if(!c||c.count()<1)return null;var u=r.isShown([\"errorPane\"],!0),p=c.sortBy((function(e){return e.get(\"line\")}));return q.a.createElement(\"pre\",{className:\"errors-wrapper\"},q.a.createElement(\"hgroup\",{className:\"error\"},q.a.createElement(\"h4\",{className:\"errors__title\"},\"Errors\"),q.a.createElement(\"button\",{className:\"btn errors__clear-btn\",onClick:function(){return a.show([\"errorPane\"],!u)}},u?\"Hide\":\"Show\")),q.a.createElement(o,{isOpened:u,animated:!0},q.a.createElement(\"div\",{className:\"errors\"},N()(p).call(p,(function(e,t){var n=e.get(\"type\");return\"thrown\"===n||\"auth\"===n?q.a.createElement(cn,{key:t,error:e.get(\"error\")||e,jumpToLine:i}):\"spec\"===n?q.a.createElement(un,{key:t,error:e,jumpToLine:i}):void 0})))))}}]),n}(q.a.Component),cn=function(e){var t=e.error,n=e.jumpToLine;if(!t)return null;var r=t.get(\"line\");return q.a.createElement(\"div\",{className:\"error-wrapper\"},t?q.a.createElement(\"div\",null,q.a.createElement(\"h4\",null,t.get(\"source\")&&t.get(\"level\")?ln(t.get(\"source\"))+\" \"+t.get(\"level\"):\"\",t.get(\"path\")?q.a.createElement(\"small\",null,\" at \",t.get(\"path\")):null),q.a.createElement(\"span\",{className:\"message thrown\"},t.get(\"message\")),q.a.createElement(\"div\",{className:\"error-line\"},r&&n?q.a.createElement(\"a\",{onClick:j()(n).call(n,null,r)},\"Jump to line \",r):null)):null)},un=function(e){var t=e.error,n=e.jumpToLine,r=null;return t.get(\"path\")?r=B.List.isList(t.get(\"path\"))?q.a.createElement(\"small\",null,\"at \",t.get(\"path\").join(\".\")):q.a.createElement(\"small\",null,\"at \",t.get(\"path\")):t.get(\"line\")&&!n&&(r=q.a.createElement(\"small\",null,\"on line \",t.get(\"line\"))),q.a.createElement(\"div\",{className:\"error-wrapper\"},t?q.a.createElement(\"div\",null,q.a.createElement(\"h4\",null,ln(t.get(\"source\"))+\" \"+t.get(\"level\"),\" \",r),q.a.createElement(\"span\",{className:\"message\"},t.get(\"message\")),q.a.createElement(\"div\",{className:\"error-line\"},n?q.a.createElement(\"a\",{onClick:j()(n).call(n,null,t.get(\"line\"))},\"Jump to line \",t.get(\"line\")):null)):null)};function ln(e){var t;return N()(t=(e||\"\").split(\" \")).call(t,(function(e){return e[0].toUpperCase()+A()(e).call(e,1)})).join(\" \")}cn.defaultProps={jumpToLine:null};var pn=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onChangeWrapper\",(function(e){return r.props.onChange(e.target.value)})),r}return S()(n,[{key:\"componentDidMount\",value:function(){this.props.contentTypes&&this.props.onChange(this.props.contentTypes.first())}},{key:\"componentWillReceiveProps\",value:function(e){var t;e.contentTypes&&e.contentTypes.size&&(He()(t=e.contentTypes).call(t,e.value)||e.onChange(e.contentTypes.first()))}},{key:\"render\",value:function(){var e=this.props,t=e.ariaControls,n=e.ariaLabel,r=e.className,a=e.contentTypes,o=e.controlId,i=e.value;return a&&a.size?q.a.createElement(\"div\",{className:\"content-type-wrapper \"+(r||\"\")},q.a.createElement(\"select\",{\"aria-controls\":t,\"aria-label\":n,className:\"content-type\",id:o,onChange:this.onChangeWrapper,value:i||\"\"},N()(a).call(a,(function(e){return q.a.createElement(\"option\",{key:e,value:e},e)})).toArray())):null}}]),n}(q.a.Component);y()(pn,\"defaultProps\",{onChange:function(){},value:null,contentTypes:Object(B.fromJS)([\"application/json\"])});var fn=n(27),dn=n.n(fn),hn=n(47),mn=n.n(hn),vn=n(84),gn=n.n(vn),yn=[\"fullscreen\",\"full\"],bn=[\"hide\",\"keepContents\",\"mobile\",\"tablet\",\"desktop\",\"large\"];function En(){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return gn()(e=l()(n).call(n,(function(e){return!!e})).join(\" \")).call(e)}var xn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.fullscreen,n=e.full,r=mn()(e,yn);if(t)return q.a.createElement(\"section\",r);var a=\"swagger-container\"+(n?\"-full\":\"\");return q.a.createElement(\"section\",dn()({},r,{className:En(r.className,a)}))}}]),n}(q.a.Component),Sn={mobile:\"\",tablet:\"-tablet\",desktop:\"-desktop\",large:\"-hd\"},wn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.hide,r=t.keepContents,a=(t.mobile,t.tablet,t.desktop,t.large,mn()(t,bn));if(n&&!r)return q.a.createElement(\"span\",null);var o=[];for(var i in Sn)if(Object.prototype.hasOwnProperty.call(Sn,i)){var s=Sn[i];if(i in this.props){var u=this.props[i];if(u<1){o.push(\"none\"+s);continue}o.push(\"block\"+s),o.push(\"col-\"+u+s)}}n&&o.push(\"hidden\");var l=En.apply(void 0,c()(e=[a.className]).call(e,o));return q.a.createElement(\"section\",dn()({},a,{className:l}))}}]),n}(q.a.Component),jn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){return q.a.createElement(\"div\",dn()({},this.props,{className:En(this.props.className,\"wrapper\")}))}}]),n}(q.a.Component),On=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){return q.a.createElement(\"button\",dn()({},this.props,{className:En(this.props.className,\"button\")}))}}]),n}(q.a.Component);y()(On,\"defaultProps\",{className:\"\"});var Cn=function(e){return q.a.createElement(\"textarea\",e)},_n=function(e){return q.a.createElement(\"input\",e)},An=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a,o;return E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"onChange\",(function(e){var t,n,r=a.props,o=r.onChange,i=r.multiple,s=A()([]).call(e.target.options);i?t=N()(n=l()(s).call(s,(function(e){return e.selected}))).call(n,(function(e){return e.value})):t=e.target.value;a.setState({value:t}),o&&o(t)})),o=e.value?e.value:e.multiple?[\"\"]:\"\",a.state={value:o},a}return S()(n,[{key:\"componentWillReceiveProps\",value:function(e){e.value!==this.props.value&&this.setState({value:e.value})}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.allowedValues,a=n.multiple,o=n.allowEmptyValue,i=n.disabled,s=(null===(e=this.state.value)||void 0===e||null===(t=e.toJS)||void 0===t?void 0:t.call(e))||this.state.value;return q.a.createElement(\"select\",{className:this.props.className,multiple:a,value:s,onChange:this.onChange,disabled:i},o?q.a.createElement(\"option\",{value:\"\"},\"--\"):null,N()(r).call(r,(function(e,t){return q.a.createElement(\"option\",{key:t,value:String(e)},String(e))})))}}]),n}(q.a.Component);y()(An,\"defaultProps\",{multiple:!1,allowEmptyValue:!0});var kn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){return q.a.createElement(\"a\",dn()({},this.props,{rel:\"noopener noreferrer\",className:En(this.props.className,\"link\")}))}}]),n}(q.a.Component),In=function(e){var t=e.children;return q.a.createElement(\"div\",{className:\"no-margin\"},\" \",t,\" \")},Pn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"renderNotAnimated\",value:function(){return this.props.isOpened?q.a.createElement(In,null,this.props.children):q.a.createElement(\"noscript\",null)}},{key:\"render\",value:function(){var e=this.props,t=e.animated,n=e.isOpened,r=e.children;return t?(r=n?r:null,q.a.createElement(In,null,r)):this.renderNotAnimated()}}]),n}(q.a.Component);y()(Pn,\"defaultProps\",{isOpened:!1,animated:!1});var Tn=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r,a;E()(this,n);for(var o=arguments.length,i=new Array(o),s=0;s<o;s++)i[s]=arguments[s];return(a=t.call.apply(t,c()(e=[this]).call(e,i))).setTagShown=j()(r=a._setTagShown).call(r,ve()(a)),a}return S()(n,[{key:\"_setTagShown\",value:function(e,t){this.props.layoutActions.show(e,t)}},{key:\"showOp\",value:function(e,t){this.props.layoutActions.show(e,t)}},{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.layoutSelectors,r=e.layoutActions,a=e.getComponent,o=t.taggedOperations(),i=a(\"Collapse\");return q.a.createElement(\"div\",null,q.a.createElement(\"h4\",{className:\"overview-title\"},\"Overview\"),N()(o).call(o,(function(e,t){var a=e.get(\"operations\"),o=[\"overview-tags\",t],s=n.isShown(o,!0);return q.a.createElement(\"div\",{key:\"overview-\"+t},q.a.createElement(\"h4\",{onClick:function(){return r.show(o,!s)},className:\"link overview-tag\"},\" \",s?\"-\":\"+\",t),q.a.createElement(i,{isOpened:s,animated:!0},N()(a).call(a,(function(e){var t=e.toObject(),a=t.path,o=t.method,i=t.id,s=\"operations\",c=i,u=n.isShown([s,c]);return q.a.createElement(Rn,{key:i,path:a,method:o,id:a+\"-\"+o,shown:u,showOpId:c,showOpIdPrefix:s,href:\"#operation-\".concat(c),onClick:r.show})})).toArray()))})).toArray(),o.size<1&&q.a.createElement(\"h3\",null,\" No operations defined in spec! \"))}}]),n}(q.a.Component),Rn=function(e){ye()(n,e);var t=Ee()(n);function n(e){var r,a;return E()(this,n),(a=t.call(this,e)).onClick=j()(r=a._onClick).call(r,ve()(a)),a}return S()(n,[{key:\"_onClick\",value:function(){var e=this.props,t=e.showOpId,n=e.showOpIdPrefix;(0,e.onClick)([n,t],!e.shown)}},{key:\"render\",value:function(){var e=this.props,t=e.id,n=e.method,r=e.shown,a=e.href;return q.a.createElement(kn,{href:a,onClick:this.onClick,className:\"block opblock-link \".concat(r?\"shown\":\"\")},q.a.createElement(\"div\",null,q.a.createElement(\"small\",{className:\"bold-label-\".concat(n)},n.toUpperCase()),q.a.createElement(\"span\",{className:\"bold-label\"},t)))}}]),n}(q.a.Component),Nn=[\"value\",\"defaultValue\",\"initialValue\"],Mn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"componentDidMount\",value:function(){this.props.initialValue&&(this.inputRef.value=this.props.initialValue)}},{key:\"render\",value:function(){var e=this,t=this.props,n=(t.value,t.defaultValue,t.initialValue,mn()(t,Nn));return q.a.createElement(\"input\",dn()({},n,{ref:function(t){return e.inputRef=t}}))}}]),n}(q.a.Component),qn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.host,n=e.basePath;return q.a.createElement(\"pre\",{className:\"base-url\"},\"[ Base URL: \",t,n,\" ]\")}}]),n}(q.a.Component),Dn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.data,n=e.getComponent,r=e.selectedServer,a=e.url,o=t.get(\"name\")||\"the developer\",i=ct(t.get(\"url\"),a,{selectedServer:r}),s=t.get(\"email\"),c=n(\"Link\");return q.a.createElement(\"div\",{className:\"info__contact\"},i&&q.a.createElement(\"div\",null,q.a.createElement(c,{href:Object(H.F)(i),target:\"_blank\"},o,\" - Website\")),s&&q.a.createElement(c,{href:Object(H.F)(\"mailto:\".concat(s))},i?\"Send email to \".concat(o):\"Contact \".concat(o)))}}]),n}(q.a.Component),Bn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.license,n=e.getComponent,r=e.selectedServer,a=e.url,o=n(\"Link\"),i=t.get(\"name\")||\"License\",s=ct(t.get(\"url\"),a,{selectedServer:r});return q.a.createElement(\"div\",{className:\"info__license\"},s?q.a.createElement(o,{target:\"_blank\",href:Object(H.F)(s)},i):q.a.createElement(\"span\",null,i))}}]),n}(q.a.Component),Ln=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.url,n=(0,e.getComponent)(\"Link\");return q.a.createElement(n,{target:\"_blank\",href:Object(H.F)(t)},q.a.createElement(\"span\",{className:\"url\"},\" \",t))}}]),n}(q.a.PureComponent),Un=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.info,n=e.url,r=e.host,a=e.basePath,o=e.getComponent,i=e.externalDocs,s=e.selectedServer,c=e.url,u=t.get(\"version\"),l=t.get(\"description\"),p=t.get(\"title\"),f=ct(t.get(\"termsOfService\"),c,{selectedServer:s}),d=t.get(\"contact\"),h=t.get(\"license\"),m=ct(i&&i.get(\"url\"),c,{selectedServer:s}),v=i&&i.get(\"description\"),g=o(\"Markdown\",!0),y=o(\"Link\"),b=o(\"VersionStamp\"),E=o(\"InfoUrl\"),x=o(\"InfoBasePath\");return q.a.createElement(\"div\",{className:\"info\"},q.a.createElement(\"hgroup\",{className:\"main\"},q.a.createElement(\"h2\",{className:\"title\"},p,u&&q.a.createElement(b,{version:u})),r||a?q.a.createElement(x,{host:r,basePath:a}):null,n&&q.a.createElement(E,{getComponent:o,url:n})),q.a.createElement(\"div\",{className:\"description\"},q.a.createElement(g,{source:l})),f&&q.a.createElement(\"div\",{className:\"info__tos\"},q.a.createElement(y,{target:\"_blank\",href:Object(H.F)(f)},\"Terms of service\")),d&&d.size?q.a.createElement(Dn,{getComponent:o,data:d,selectedServer:s,url:n}):null,h&&h.size?q.a.createElement(Bn,{getComponent:o,license:h,selectedServer:s,url:n}):null,m?q.a.createElement(y,{className:\"info__extdocs\",target:\"_blank\",href:Object(H.F)(m)},v||m):null)}}]),n}(q.a.Component),Vn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.getComponent,r=e.oas3Selectors,a=t.info(),o=t.url(),i=t.basePath(),s=t.host(),c=t.externalDocs(),u=r.selectedServer(),l=n(\"info\");return q.a.createElement(\"div\",null,a&&a.count()?q.a.createElement(l,{info:a,url:o,host:s,basePath:i,externalDocs:c,getComponent:n,selectedServer:u}):null)}}]),n}(q.a.Component),zn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){return null}}]),n}(q.a.Component),Fn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){return q.a.createElement(\"div\",{className:\"footer\"})}}]),n}(q.a.Component),Jn=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onFilterChange\",(function(e){var t=e.target.value;r.props.layoutActions.updateFilter(t)})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.layoutSelectors,r=(0,e.getComponent)(\"Col\"),a=\"loading\"===t.loadingStatus(),o=\"failed\"===t.loadingStatus(),i=n.currentFilter(),s=[\"operation-filter-input\"];return o&&s.push(\"failed\"),a&&s.push(\"loading\"),q.a.createElement(\"div\",null,null===i||!1===i||\"false\"===i?null:q.a.createElement(\"div\",{className:\"filter-container\"},q.a.createElement(r,{className:\"filter wrapper\",mobile:12},q.a.createElement(\"input\",{className:s.join(\" \"),placeholder:\"Filter by tag\",type:\"text\",onChange:this.onFilterChange,value:!0===i||\"true\"===i?\"\":i,disabled:a}))))}}]),n}(q.a.Component),Wn=Function.prototype,Hn=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;return E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"updateValues\",(function(e){var t=e.param,n=e.isExecute,r=e.consumesValue,o=void 0===r?\"\":r,i=/xml/i.test(o),s=/json/i.test(o),c=i?t.get(\"value_xml\"):t.get(\"value\");if(void 0!==c){var u=!c&&s?\"{}\":c;a.setState({value:u}),a.onChange(u,{isXml:i,isEditBox:n})}else i?a.onChange(a.sample(\"xml\"),{isXml:i,isEditBox:n}):a.onChange(a.sample(),{isEditBox:n})})),y()(ve()(a),\"sample\",(function(e){var t=a.props,n=t.param,r=(0,t.fn.inferSchema)(n.toJS());return Object(H.o)(r,e,{includeWriteOnly:!0})})),y()(ve()(a),\"onChange\",(function(e,t){var n=t.isEditBox,r=t.isXml;a.setState({value:e,isEditBox:n}),a._onChange(e,r)})),y()(ve()(a),\"_onChange\",(function(e,t){(a.props.onChange||Wn)(e,t)})),y()(ve()(a),\"handleOnChange\",(function(e){var t=a.props.consumesValue,n=/xml/i.test(t),r=e.target.value;a.onChange(r,{isXml:n})})),y()(ve()(a),\"toggleIsEditBox\",(function(){return a.setState((function(e){return{isEditBox:!e.isEditBox}}))})),a.state={isEditBox:!1,value:\"\"},a}return S()(n,[{key:\"componentDidMount\",value:function(){this.updateValues.call(this,this.props)}},{key:\"componentWillReceiveProps\",value:function(e){this.updateValues.call(this,e)}},{key:\"render\",value:function(){var e=this.props,t=e.onChangeConsumes,r=e.param,a=e.isExecute,o=e.specSelectors,i=e.pathMethod,s=e.getConfigs,c=e.getComponent,u=c(\"Button\"),l=c(\"TextArea\"),p=c(\"highlightCode\"),f=c(\"contentType\"),d=(o?o.parameterWithMetaByIdentity(i,r):r).get(\"errors\",Object(B.List)()),h=o.contentTypeValues(i).get(\"requestContentType\"),m=this.props.consumes&&this.props.consumes.size?this.props.consumes:n.defaultProp.consumes,v=this.state,g=v.value,y=v.isEditBox,b=null;return Object(Nt.a)(g)&&(b=\"json\"),q.a.createElement(\"div\",{className:\"body-param\",\"data-param-name\":r.get(\"name\"),\"data-param-in\":r.get(\"in\")},y&&a?q.a.createElement(l,{className:\"body-param__text\"+(d.count()?\" invalid\":\"\"),value:g,onChange:this.handleOnChange}):g&&q.a.createElement(p,{className:\"body-param__example\",language:b,getConfigs:s,value:g}),q.a.createElement(\"div\",{className:\"body-param-options\"},a?q.a.createElement(\"div\",{className:\"body-param-edit\"},q.a.createElement(u,{className:y?\"btn cancel body-param__example-edit\":\"btn edit body-param__example-edit\",onClick:this.toggleIsEditBox},y?\"Cancel\":\"Edit\")):null,q.a.createElement(\"label\",{htmlFor:\"\"},q.a.createElement(\"span\",null,\"Parameter content type\"),q.a.createElement(f,{value:h,contentTypes:m,onChange:t,className:\"body-param-content-type\",ariaLabel:\"Parameter content type\"}))))}}]),n}(M.PureComponent);y()(Hn,\"defaultProp\",{consumes:Object(B.fromJS)([\"application/json\"]),param:Object(B.fromJS)({}),onChange:Wn,onChangeConsumes:Wn});var $n=n(133),Yn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.request,n=e.getConfigs,r=Object($n.requestSnippetGenerator_curl_bash)(t),a=n(),o=St()(a,\"syntaxHighlight.activated\")?q.a.createElement(Et.a,{language:\"bash\",className:\"curl microlight\",onWheel:this.preventYScrollingBeyondElement,style:Object(Et.b)(St()(a,\"syntaxHighlight.theme\"))},r):q.a.createElement(\"textarea\",{readOnly:!0,className:\"curl\",value:r});return q.a.createElement(\"div\",{className:\"curl-command\"},q.a.createElement(\"h4\",null,\"Curl\"),q.a.createElement(\"div\",{className:\"copy-to-clipboard\"},q.a.createElement(Ot.CopyToClipboard,{text:r},q.a.createElement(\"button\",null))),q.a.createElement(\"div\",null,o))}}]),n}(q.a.Component),Kn=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onChange\",(function(e){r.setScheme(e.target.value)})),y()(ve()(r),\"setScheme\",(function(e){var t=r.props,n=t.path,a=t.method;t.specActions.setScheme(e,n,a)})),r}return S()(n,[{key:\"componentWillMount\",value:function(){var e=this.props.schemes;this.setScheme(e.first())}},{key:\"componentWillReceiveProps\",value:function(e){var t;this.props.currentScheme&&He()(t=e.schemes).call(t,this.props.currentScheme)||this.setScheme(e.schemes.first())}},{key:\"render\",value:function(){var e,t=this.props,n=t.schemes,r=t.currentScheme;return q.a.createElement(\"label\",{htmlFor:\"schemes\"},q.a.createElement(\"span\",{className:\"schemes-title\"},\"Schemes\"),q.a.createElement(\"select\",{onChange:this.onChange,value:r},N()(e=n.valueSeq()).call(e,(function(e){return q.a.createElement(\"option\",{value:e,key:e},e)})).toArray()))}}]),n}(q.a.Component),Gn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specActions,n=e.specSelectors,r=e.getComponent,a=n.operationScheme(),o=n.schemes(),i=r(\"schemes\");return o&&o.size?q.a.createElement(i,{currentScheme:a,schemes:o,specActions:t}):null}}]),n}(q.a.Component),Zn=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"toggleCollapsed\",(function(){a.props.onToggle&&a.props.onToggle(a.props.modelName,!a.state.expanded),a.setState({expanded:!a.state.expanded})})),y()(ve()(a),\"onLoad\",(function(e){if(e&&a.props.layoutSelectors){var t=a.props.layoutSelectors.getScrollToKey();L.a.is(t,a.props.specPath)&&a.toggleCollapsed(),a.props.layoutActions.readyToScroll(a.props.specPath,e.parentElement)}}));var o=a.props,i=o.expanded,s=o.collapsedContent;return a.state={expanded:i,collapsedContent:s||n.defaultProps.collapsedContent},a}return S()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.hideSelfOnExpand,n=e.expanded,r=e.modelName;t&&n&&this.props.onToggle(r,n)}},{key:\"componentWillReceiveProps\",value:function(e){this.props.expanded!==e.expanded&&this.setState({expanded:e.expanded})}},{key:\"render\",value:function(){var e=this.props,t=e.title,n=e.classes;return this.state.expanded&&this.props.hideSelfOnExpand?q.a.createElement(\"span\",{className:n||\"\"},this.props.children):q.a.createElement(\"span\",{className:n||\"\",ref:this.onLoad},q.a.createElement(\"button\",{\"aria-expanded\":this.state.expanded,className:\"model-box-control\",onClick:this.toggleCollapsed},t&&q.a.createElement(\"span\",{className:\"pointer\"},t),q.a.createElement(\"span\",{className:\"model-toggle\"+(this.state.expanded?\"\":\" collapsed\")}),!this.state.expanded&&q.a.createElement(\"span\",null,this.state.collapsedContent)),this.state.expanded&&this.props.children)}}]),n}(M.Component);y()(Zn,\"defaultProps\",{collapsedContent:\"{...}\",expanded:!1,title:null,onToggle:function(){},hideSelfOnExpand:!1,specPath:L.a.List([])});var Xn=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"activeTab\",(function(e){var t=e.target.dataset.name;a.setState({activeTab:t})}));var o=a.props,i=o.getConfigs,s=o.isExecute,c=i().defaultModelRendering,u=c;return\"example\"!==c&&\"model\"!==c&&(u=\"example\"),s&&(u=\"example\"),a.state={activeTab:u},a}return S()(n,[{key:\"componentWillReceiveProps\",value:function(e){e.isExecute&&!this.props.isExecute&&this.props.example&&this.setState({activeTab:\"example\"})}},{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.specSelectors,r=e.schema,a=e.example,o=e.isExecute,i=e.getConfigs,s=e.specPath,c=e.includeReadOnly,u=e.includeWriteOnly,l=i().defaultModelExpandDepth,p=t(\"ModelWrapper\"),f=t(\"highlightCode\"),d=n.isOAS3();return q.a.createElement(\"div\",{className:\"model-example\"},q.a.createElement(\"ul\",{className:\"tab\"},q.a.createElement(\"li\",{className:\"tabitem\"+(\"example\"===this.state.activeTab?\" active\":\"\")},q.a.createElement(\"a\",{className:\"tablinks\",\"data-name\":\"example\",onClick:this.activeTab},o?\"Edit Value\":\"Example Value\")),r?q.a.createElement(\"li\",{className:\"tabitem\"+(\"model\"===this.state.activeTab?\" active\":\"\")},q.a.createElement(\"a\",{className:\"tablinks\"+(o?\" inactive\":\"\"),\"data-name\":\"model\",onClick:this.activeTab},d?\"Schema\":\"Model\")):null),q.a.createElement(\"div\",null,\"example\"===this.state.activeTab?a||q.a.createElement(f,{value:\"(no example available)\",getConfigs:i}):null,\"model\"===this.state.activeTab&&q.a.createElement(p,{schema:r,getComponent:t,getConfigs:i,specSelectors:n,expandDepth:l,specPath:s,includeReadOnly:c,includeWriteOnly:u})))}}]),n}(q.a.Component),Qn=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onToggle\",(function(e,t){r.props.layoutActions&&r.props.layoutActions.show(r.props.fullPath,t)})),r}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.getComponent,r=t.getConfigs,a=n(\"Model\");return this.props.layoutSelectors&&(e=this.props.layoutSelectors.isShown(this.props.fullPath)),q.a.createElement(\"div\",{className:\"model-box\"},q.a.createElement(a,dn()({},this.props,{getConfigs:r,expanded:e,depth:1,onToggle:this.onToggle,expandDepth:this.props.expandDepth||0})))}}]),n}(M.Component),er=n(177),tr=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"getSchemaBasePath\",(function(){return r.props.specSelectors.isOAS3()?[\"components\",\"schemas\"]:[\"definitions\"]})),y()(ve()(r),\"getCollapsedContent\",(function(){return\" \"})),y()(ve()(r),\"handleToggle\",(function(e,t){var n,a;(r.props.layoutActions.show(c()(n=[]).call(n,Wt()(r.getSchemaBasePath()),[e]),t),t)&&r.props.specActions.requestResolvedSubtree(c()(a=[]).call(a,Wt()(r.getSchemaBasePath()),[e]))})),y()(ve()(r),\"onLoadModels\",(function(e){e&&r.props.layoutActions.readyToScroll(r.getSchemaBasePath(),e)})),y()(ve()(r),\"onLoadModel\",(function(e){if(e){var t,n=e.getAttribute(\"data-name\");r.props.layoutActions.readyToScroll(c()(t=[]).call(t,Wt()(r.getSchemaBasePath()),[n]),e)}})),r}return S()(n,[{key:\"render\",value:function(){var e,t=this,n=this.props,r=n.specSelectors,a=n.getComponent,o=n.layoutSelectors,i=n.layoutActions,s=n.getConfigs,u=r.definitions(),l=s(),p=l.docExpansion,f=l.defaultModelsExpandDepth;if(!u.size||f<0)return null;var d=this.getSchemaBasePath(),h=o.isShown(d,f>0&&\"none\"!==p),m=r.isOAS3(),v=a(\"ModelWrapper\"),g=a(\"Collapse\"),y=a(\"ModelCollapse\"),b=a(\"JumpToPath\");return q.a.createElement(\"section\",{className:h?\"models is-open\":\"models\",ref:this.onLoadModels},q.a.createElement(\"h4\",null,q.a.createElement(\"button\",{\"aria-expanded\":h,className:\"models-control\",onClick:function(){return i.show(d,!h)}},q.a.createElement(\"span\",null,m?\"Schemas\":\"Models\"),q.a.createElement(\"svg\",{width:\"20\",height:\"20\",\"aria-hidden\":\"true\",focusable:\"false\"},q.a.createElement(\"use\",{xlinkHref:h?\"#large-arrow-up\":\"#large-arrow-down\"})))),q.a.createElement(g,{isOpened:h},N()(e=u.entrySeq()).call(e,(function(e){var n,u=gt()(e,1)[0],l=c()(n=[]).call(n,Wt()(d),[u]),p=L.a.List(l),h=r.specResolvedSubtree(l),m=r.specJson().getIn(l),g=B.Map.isMap(h)?h:L.a.Map(),E=B.Map.isMap(m)?m:L.a.Map(),x=g.get(\"title\")||E.get(\"title\")||u,S=o.isShown(l,!1);S&&0===g.size&&E.size>0&&t.props.specActions.requestResolvedSubtree(l);var w=q.a.createElement(v,{name:u,expandDepth:f,schema:g||L.a.Map(),displayName:x,fullPath:l,specPath:p,getComponent:a,specSelectors:r,getConfigs:s,layoutSelectors:o,layoutActions:i,includeReadOnly:!0,includeWriteOnly:!0}),j=q.a.createElement(\"span\",{className:\"model-box\"},q.a.createElement(\"span\",{className:\"model model-title\"},x));return q.a.createElement(\"div\",{id:\"model-\".concat(u),className:\"model-container\",key:\"models-section-\".concat(u),\"data-name\":u,ref:t.onLoadModel},q.a.createElement(\"span\",{className:\"models-jump-to-path\"},q.a.createElement(b,{specPath:p})),q.a.createElement(y,{classes:\"model-box\",collapsedContent:t.getCollapsedContent(u),onToggle:t.handleToggle,title:j,displayName:x,modelName:u,specPath:p,layoutSelectors:o,layoutActions:i,hideSelfOnExpand:!0,expanded:f>0&&S},w))})).toArray()))}}]),n}(M.Component),nr=function(e){var t=e.value,n=(0,e.getComponent)(\"ModelCollapse\"),r=q.a.createElement(\"span\",null,\"Array [ \",t.count(),\" ]\");return q.a.createElement(\"span\",{className:\"prop-enum\"},\"Enum:\",q.a.createElement(\"br\",null),q.a.createElement(n,{collapsedContent:r},\"[ \",t.join(\", \"),\" ]\"))},rr=[\"schema\",\"name\",\"displayName\",\"isRef\",\"getComponent\",\"getConfigs\",\"depth\",\"onToggle\",\"expanded\",\"specPath\"],ar=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t,n,r,a=this.props,o=a.schema,i=a.name,s=a.displayName,u=a.isRef,p=a.getComponent,f=a.getConfigs,d=a.depth,m=a.onToggle,v=a.expanded,g=a.specPath,y=mn()(a,rr),b=y.specSelectors,E=y.expandDepth,x=y.includeReadOnly,S=y.includeWriteOnly,w=b.isOAS3;if(!o)return null;var j=f().showExtensions,O=o.get(\"description\"),C=o.get(\"properties\"),_=o.get(\"additionalProperties\"),k=o.get(\"title\")||s||i,I=o.get(\"required\"),P=l()(o).call(o,(function(e,t){var n;return-1!==Se()(n=[\"maxProperties\",\"minProperties\",\"nullable\",\"example\"]).call(n,t)})),T=o.get(\"deprecated\"),R=p(\"JumpToPath\",!0),M=p(\"Markdown\",!0),D=p(\"Model\"),L=p(\"ModelCollapse\"),U=p(\"Property\"),V=function(){return q.a.createElement(\"span\",{className:\"model-jump-to-path\"},q.a.createElement(R,{specPath:g}))},z=q.a.createElement(\"span\",null,q.a.createElement(\"span\",null,\"{\"),\"...\",q.a.createElement(\"span\",null,\"}\"),u?q.a.createElement(V,null):\"\"),F=b.isOAS3()?o.get(\"anyOf\"):null,J=b.isOAS3()?o.get(\"oneOf\"):null,W=b.isOAS3()?o.get(\"not\"):null,H=k&&q.a.createElement(\"span\",{className:\"model-title\"},u&&o.get(\"$$ref\")&&q.a.createElement(\"span\",{className:\"model-hint\"},o.get(\"$$ref\")),q.a.createElement(\"span\",{className:\"model-title__text\"},k));return q.a.createElement(\"span\",{className:\"model\"},q.a.createElement(L,{modelName:i,title:H,onToggle:m,expanded:!!v||d<=E,collapsedContent:z},q.a.createElement(\"span\",{className:\"brace-open object\"},\"{\"),u?q.a.createElement(V,null):null,q.a.createElement(\"span\",{className:\"inner-object\"},q.a.createElement(\"table\",{className:\"model\"},q.a.createElement(\"tbody\",null,O?q.a.createElement(\"tr\",{className:\"description\"},q.a.createElement(\"td\",null,\"description:\"),q.a.createElement(\"td\",null,q.a.createElement(M,{source:O}))):null,T?q.a.createElement(\"tr\",{className:\"property\"},q.a.createElement(\"td\",null,\"deprecated:\"),q.a.createElement(\"td\",null,\"true\")):null,C&&C.size?N()(e=l()(t=C.entrySeq()).call(t,(function(e){var t=gt()(e,2)[1];return(!t.get(\"readOnly\")||x)&&(!t.get(\"writeOnly\")||S)}))).call(e,(function(e){var t,n,r=gt()(e,2),a=r[0],o=r[1],s=w()&&o.get(\"deprecated\"),u=B.List.isList(I)&&I.contains(a),l=[\"property-row\"];return s&&l.push(\"deprecated\"),u&&l.push(\"required\"),q.a.createElement(\"tr\",{key:a,className:l.join(\" \")},q.a.createElement(\"td\",null,a,u&&q.a.createElement(\"span\",{className:\"star\"},\"*\")),q.a.createElement(\"td\",null,q.a.createElement(D,dn()({key:c()(t=c()(n=\"object-\".concat(i,\"-\")).call(n,a,\"_\")).call(t,o)},y,{required:u,getComponent:p,specPath:g.push(\"properties\",a),getConfigs:f,schema:o,depth:d+1}))))})).toArray():null,j?q.a.createElement(\"tr\",null,q.a.createElement(\"td\",null,\" \")):null,j?N()(n=o.entrySeq()).call(n,(function(e){var t=gt()(e,2),n=t[0],r=t[1];if(\"x-\"===A()(n).call(n,0,2)){var a=r?r.toJS?r.toJS():r:null;return q.a.createElement(\"tr\",{key:n,className:\"extension\"},q.a.createElement(\"td\",null,n),q.a.createElement(\"td\",null,h()(a)))}})).toArray():null,_&&_.size?q.a.createElement(\"tr\",null,q.a.createElement(\"td\",null,\"< * >:\"),q.a.createElement(\"td\",null,q.a.createElement(D,dn()({},y,{required:!1,getComponent:p,specPath:g.push(\"additionalProperties\"),getConfigs:f,schema:_,depth:d+1})))):null,F?q.a.createElement(\"tr\",null,q.a.createElement(\"td\",null,\"anyOf ->\"),q.a.createElement(\"td\",null,N()(F).call(F,(function(e,t){return q.a.createElement(\"div\",{key:t},q.a.createElement(D,dn()({},y,{required:!1,getComponent:p,specPath:g.push(\"anyOf\",t),getConfigs:f,schema:e,depth:d+1})))})))):null,J?q.a.createElement(\"tr\",null,q.a.createElement(\"td\",null,\"oneOf ->\"),q.a.createElement(\"td\",null,N()(J).call(J,(function(e,t){return q.a.createElement(\"div\",{key:t},q.a.createElement(D,dn()({},y,{required:!1,getComponent:p,specPath:g.push(\"oneOf\",t),getConfigs:f,schema:e,depth:d+1})))})))):null,W?q.a.createElement(\"tr\",null,q.a.createElement(\"td\",null,\"not ->\"),q.a.createElement(\"td\",null,q.a.createElement(\"div\",null,q.a.createElement(D,dn()({},y,{required:!1,getComponent:p,specPath:g.push(\"not\"),getConfigs:f,schema:W,depth:d+1}))))):null))),q.a.createElement(\"span\",{className:\"brace-close\"},\"}\")),P.size?N()(r=P.entrySeq()).call(r,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(U,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),propKey:r,propVal:a,propClass:\"property\"})})):null)}}]),n}(M.Component),or=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.getComponent,r=t.getConfigs,a=t.schema,o=t.depth,i=t.expandDepth,s=t.name,u=t.displayName,p=t.specPath,f=a.get(\"description\"),d=a.get(\"items\"),h=a.get(\"title\")||u||s,m=l()(a).call(a,(function(e,t){var n;return-1===Se()(n=[\"type\",\"items\",\"description\",\"$$ref\"]).call(n,t)})),v=n(\"Markdown\",!0),g=n(\"ModelCollapse\"),y=n(\"Model\"),b=n(\"Property\"),E=h&&q.a.createElement(\"span\",{className:\"model-title\"},q.a.createElement(\"span\",{className:\"model-title__text\"},h));return q.a.createElement(\"span\",{className:\"model\"},q.a.createElement(g,{title:E,expanded:o<=i,collapsedContent:\"[...]\"},\"[\",m.size?N()(e=m.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(b,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),propKey:r,propVal:a,propClass:\"property\"})})):null,f?q.a.createElement(v,{source:f}):m.size?q.a.createElement(\"div\",{className:\"markdown\"}):null,q.a.createElement(\"span\",null,q.a.createElement(y,dn()({},this.props,{getConfigs:r,specPath:p.push(\"items\"),name:null,schema:d,required:!1,depth:o+1}))),\"]\"))}}]),n}(M.Component),ir=\"property primitive\",sr=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t,n,r=this.props,a=r.schema,o=r.getComponent,i=r.getConfigs,s=r.name,u=r.displayName,p=r.depth,f=i().showExtensions;if(!a||!a.get)return q.a.createElement(\"div\",null);var d=a.get(\"type\"),h=a.get(\"format\"),m=a.get(\"xml\"),v=a.get(\"enum\"),g=a.get(\"title\")||u||s,y=a.get(\"description\"),b=Object(H.m)(a),E=l()(a).call(a,(function(e,t){var n;return-1===Se()(n=[\"enum\",\"type\",\"format\",\"description\",\"$$ref\"]).call(n,t)})).filterNot((function(e,t){return b.has(t)})),x=o(\"Markdown\",!0),S=o(\"EnumModel\"),w=o(\"Property\");return q.a.createElement(\"span\",{className:\"model\"},q.a.createElement(\"span\",{className:\"prop\"},s&&q.a.createElement(\"span\",{className:\"\".concat(1===p&&\"model-title\",\" prop-name\")},g),q.a.createElement(\"span\",{className:\"prop-type\"},d),h&&q.a.createElement(\"span\",{className:\"prop-format\"},\"($\",h,\")\"),E.size?N()(e=E.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(w,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),propKey:r,propVal:a,propClass:ir})})):null,f&&b.size?N()(t=b.entrySeq()).call(t,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(w,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),propKey:r,propVal:a,propClass:ir})})):null,y?q.a.createElement(x,{source:y}):null,m&&m.size?q.a.createElement(\"span\",null,q.a.createElement(\"br\",null),q.a.createElement(\"span\",{className:ir},\"xml:\"),N()(n=m.entrySeq()).call(n,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(\"span\",{key:c()(t=\"\".concat(r,\"-\")).call(t,a),className:ir},q.a.createElement(\"br\",null),\"   \",r,\": \",String(a))})).toArray()):null,v&&q.a.createElement(S,{value:v,getComponent:o})))}}]),n}(M.Component),cr=function(e){var t=e.propKey,n=e.propVal,r=e.propClass;return q.a.createElement(\"span\",{className:r},q.a.createElement(\"br\",null),t,\": \",String(n))},ur=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.onTryoutClick,n=e.onCancelClick,r=e.onResetClick,a=e.enabled,o=e.hasUserEditedBody,i=e.isOAS3&&o;return q.a.createElement(\"div\",{className:i?\"try-out btn-group\":\"try-out\"},a?q.a.createElement(\"button\",{className:\"btn try-out__btn cancel\",onClick:n},\"Cancel\"):q.a.createElement(\"button\",{className:\"btn try-out__btn\",onClick:t},\"Try it out \"),i&&q.a.createElement(\"button\",{className:\"btn try-out__btn reset\",onClick:r},\"Reset\"))}}]),n}(q.a.Component);y()(ur,\"defaultProps\",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,onResetClick:Function.prototype,enabled:!1,hasUserEditedBody:!1,isOAS3:!1});var lr=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.bypass,n=e.isSwagger2,r=e.isOAS3,a=e.alsoShow;return t?q.a.createElement(\"div\",null,this.props.children):n&&r?q.a.createElement(\"div\",{className:\"version-pragma\"},a,q.a.createElement(\"div\",{className:\"version-pragma__message version-pragma__message--ambiguous\"},q.a.createElement(\"div\",null,q.a.createElement(\"h3\",null,\"Unable to render this definition\"),q.a.createElement(\"p\",null,q.a.createElement(\"code\",null,\"swagger\"),\" and \",q.a.createElement(\"code\",null,\"openapi\"),\" fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields.\"),q.a.createElement(\"p\",null,\"Supported version fields are \",q.a.createElement(\"code\",null,\"swagger: \",'\"2.0\"'),\" and those that match \",q.a.createElement(\"code\",null,\"openapi: 3.0.n\"),\" (for example, \",q.a.createElement(\"code\",null,\"openapi: 3.0.0\"),\").\")))):n||r?q.a.createElement(\"div\",null,this.props.children):q.a.createElement(\"div\",{className:\"version-pragma\"},a,q.a.createElement(\"div\",{className:\"version-pragma__message version-pragma__message--missing\"},q.a.createElement(\"div\",null,q.a.createElement(\"h3\",null,\"Unable to render this definition\"),q.a.createElement(\"p\",null,\"The provided definition does not specify a valid version field.\"),q.a.createElement(\"p\",null,\"Please indicate a valid Swagger or OpenAPI version field. Supported version fields are \",q.a.createElement(\"code\",null,\"swagger: \",'\"2.0\"'),\" and those that match \",q.a.createElement(\"code\",null,\"openapi: 3.0.n\"),\" (for example, \",q.a.createElement(\"code\",null,\"openapi: 3.0.0\"),\").\"))))}}]),n}(q.a.PureComponent);y()(lr,\"defaultProps\",{alsoShow:null,children:null,bypass:!1});var pr=function(e){var t=e.version;return q.a.createElement(\"small\",null,q.a.createElement(\"pre\",{className:\"version\"},\" \",t,\" \"))},fr=function(e){var t=e.enabled,n=e.path,r=e.text;return q.a.createElement(\"a\",{className:\"nostyle\",onClick:t?function(e){return e.preventDefault()}:null,href:t?\"#/\".concat(n):null},q.a.createElement(\"span\",null,r))},dr=function(){return q.a.createElement(\"div\",null,q.a.createElement(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",xmlnsXlink:\"http://www.w3.org/1999/xlink\",className:\"svg-assets\"},q.a.createElement(\"defs\",null,q.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"unlocked\"},q.a.createElement(\"path\",{d:\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"locked\"},q.a.createElement(\"path\",{d:\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"close\"},q.a.createElement(\"path\",{d:\"M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"large-arrow\"},q.a.createElement(\"path\",{d:\"M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"large-arrow-down\"},q.a.createElement(\"path\",{d:\"M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"large-arrow-up\"},q.a.createElement(\"path\",{d:\"M 17.418 14.908 C 17.69 15.176 18.127 15.176 18.397 14.908 C 18.667 14.64 18.668 14.207 18.397 13.939 L 10.489 6.109 C 10.219 5.841 9.782 5.841 9.51 6.109 L 1.602 13.939 C 1.332 14.207 1.332 14.64 1.602 14.908 C 1.873 15.176 2.311 15.176 2.581 14.908 L 10 7.767 L 17.418 14.908 Z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 24 24\",id:\"jump-to\"},q.a.createElement(\"path\",{d:\"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 24 24\",id:\"expand\"},q.a.createElement(\"path\",{d:\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"})))))},hr=n(179),mr=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.errSelectors,n=e.specSelectors,r=e.getComponent,a=r(\"SvgAssets\"),o=r(\"InfoContainer\",!0),i=r(\"VersionPragmaFilter\"),s=r(\"operations\",!0),c=r(\"Models\",!0),u=r(\"Row\"),l=r(\"Col\"),p=r(\"errors\",!0),f=r(\"ServersContainer\",!0),d=r(\"SchemesContainer\",!0),h=r(\"AuthorizeBtnContainer\",!0),m=r(\"FilterContainer\",!0),v=n.isSwagger2(),g=n.isOAS3(),y=!n.specStr(),b=n.loadingStatus(),E=null;if(\"loading\"===b&&(E=q.a.createElement(\"div\",{className:\"info\"},q.a.createElement(\"div\",{className:\"loading-container\"},q.a.createElement(\"div\",{className:\"loading\"})))),\"failed\"===b&&(E=q.a.createElement(\"div\",{className:\"info\"},q.a.createElement(\"div\",{className:\"loading-container\"},q.a.createElement(\"h4\",{className:\"title\"},\"Failed to load API definition.\"),q.a.createElement(p,null)))),\"failedConfig\"===b){var x=t.lastError(),S=x?x.get(\"message\"):\"\";E=q.a.createElement(\"div\",{className:\"info failed-config\"},q.a.createElement(\"div\",{className:\"loading-container\"},q.a.createElement(\"h4\",{className:\"title\"},\"Failed to load remote configuration.\"),q.a.createElement(\"p\",null,S)))}if(!E&&y&&(E=q.a.createElement(\"h4\",null,\"No API definition provided.\")),E)return q.a.createElement(\"div\",{className:\"swagger-ui\"},q.a.createElement(\"div\",{className:\"loading-container\"},E));var w=n.servers(),j=n.schemes(),O=w&&w.size,C=j&&j.size,_=!!n.securityDefinitions();return q.a.createElement(\"div\",{className:\"swagger-ui\"},q.a.createElement(a,null),q.a.createElement(i,{isSwagger2:v,isOAS3:g,alsoShow:q.a.createElement(p,null)},q.a.createElement(p,null),q.a.createElement(u,{className:\"information-container\"},q.a.createElement(l,{mobile:12},q.a.createElement(o,null))),O||C||_?q.a.createElement(\"div\",{className:\"scheme-container\"},q.a.createElement(l,{className:\"schemes wrapper\",mobile:12},O?q.a.createElement(f,null):null,C?q.a.createElement(d,null):null,_?q.a.createElement(h,null):null)):null,q.a.createElement(m,null),q.a.createElement(u,null,q.a.createElement(l,{mobile:12,desktop:12},q.a.createElement(s,null))),q.a.createElement(u,null,q.a.createElement(l,{mobile:12,desktop:12},q.a.createElement(c,null)))))}}]),n}(q.a.Component),vr=n(288),gr=n.n(vr),yr={value:\"\",onChange:function(){},schema:{},keyName:\"\",required:!1,errors:Object(B.List)()},br=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.dispatchInitialValue,n=e.value,r=e.onChange;t?r(n):!1===t&&r(\"\")}},{key:\"render\",value:function(){var e,t=this.props,n=t.schema,r=t.errors,a=t.value,o=t.onChange,i=t.getComponent,s=t.fn,u=t.disabled,l=n&&n.get?n.get(\"format\"):null,p=n&&n.get?n.get(\"type\"):null,f=function(e){return i(e,!1,{failSilently:!0})},d=p?f(l?c()(e=\"JsonSchema_\".concat(p,\"_\")).call(e,l):\"JsonSchema_\".concat(p)):i(\"JsonSchema_string\");return d||(d=i(\"JsonSchema_string\")),q.a.createElement(d,dn()({},this.props,{errors:r,fn:s,getComponent:i,value:a,onChange:o,schema:n,disabled:u}))}}]),n}(M.Component);y()(br,\"defaultProps\",yr);var Er=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onChange\",(function(e){var t=r.props.schema&&\"file\"===r.props.schema.get(\"type\")?e.target.files[0]:e.target.value;r.props.onChange(t,r.props.keyName)})),y()(ve()(r),\"onEnumChange\",(function(e){return r.props.onChange(e)})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.schema,a=e.errors,o=e.required,i=e.description,s=e.disabled,c=r&&r.get?r.get(\"enum\"):null,u=r&&r.get?r.get(\"format\"):null,l=r&&r.get?r.get(\"type\"):null,p=r&&r.get?r.get(\"in\"):null;if(n||(n=\"\"),a=a.toJS?a.toJS():[],c){var f=t(\"Select\");return q.a.createElement(f,{className:a.length?\"invalid\":\"\",title:a.length?a:\"\",allowedValues:c,value:n,allowEmptyValue:!o,disabled:s,onChange:this.onEnumChange})}var d=s||p&&\"formData\"===p&&!(\"FormData\"in window),h=t(\"Input\");return l&&\"file\"===l?q.a.createElement(h,{type:\"file\",className:a.length?\"invalid\":\"\",title:a.length?a:\"\",onChange:this.onChange,disabled:d}):q.a.createElement(gr.a,{type:u&&\"password\"===u?\"password\":\"text\",className:a.length?\"invalid\":\"\",title:a.length?a:\"\",value:n,minLength:0,debounceTimeout:350,placeholder:i,onChange:this.onChange,disabled:d})}}]),n}(M.Component);y()(Er,\"defaultProps\",yr);var xr=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;return E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"onChange\",(function(){a.props.onChange(a.state.value)})),y()(ve()(a),\"onItemChange\",(function(e,t){a.setState((function(n){return{value:n.value.set(t,e)}}),a.onChange)})),y()(ve()(a),\"removeItem\",(function(e){a.setState((function(t){return{value:t.value.delete(e)}}),a.onChange)})),y()(ve()(a),\"addItem\",(function(){var e=_r(a.state.value);a.setState((function(){return{value:e.push(Object(H.o)(a.state.schema.get(\"items\"),!1,{includeWriteOnly:!0}))}}),a.onChange)})),y()(ve()(a),\"onEnumChange\",(function(e){a.setState((function(){return{value:e}}),a.onChange)})),a.state={value:_r(e.value),schema:e.schema},a}return S()(n,[{key:\"componentWillReceiveProps\",value:function(e){var t=_r(e.value);t!==this.state.value&&this.setState({value:t}),e.schema!==this.state.schema&&this.setState({schema:e.schema})}},{key:\"render\",value:function(){var e,t=this,n=this.props,r=n.getComponent,a=n.required,o=n.schema,i=n.errors,s=n.fn,u=n.disabled;i=i.toJS?i.toJS():I()(i)?i:[];var p,f,d=l()(i).call(i,(function(e){return\"string\"==typeof e})),h=N()(e=l()(i).call(i,(function(e){return void 0!==e.needRemove}))).call(e,(function(e){return e.error})),m=this.state.value,v=!!(m&&m.count&&m.count()>0),g=o.getIn([\"items\",\"enum\"]),y=o.getIn([\"items\",\"type\"]),b=o.getIn([\"items\",\"format\"]),E=o.get(\"items\"),x=!1,S=\"file\"===y||\"string\"===y&&\"binary\"===b;y&&b?p=r(c()(f=\"JsonSchema_\".concat(y,\"_\")).call(f,b)):\"boolean\"!==y&&\"array\"!==y&&\"object\"!==y||(p=r(\"JsonSchema_\".concat(y)));if(p||S||(x=!0),g){var w=r(\"Select\");return q.a.createElement(w,{className:i.length?\"invalid\":\"\",title:i.length?i:\"\",multiple:!0,value:m,disabled:u,allowedValues:g,allowEmptyValue:!a,onChange:this.onEnumChange})}var j=r(\"Button\");return q.a.createElement(\"div\",{className:\"json-schema-array\"},v?N()(m).call(m,(function(e,n){var a,o=Object(B.fromJS)(Wt()(N()(a=l()(i).call(i,(function(e){return e.index===n}))).call(a,(function(e){return e.error}))));return q.a.createElement(\"div\",{key:n,className:\"json-schema-form-item\"},S?q.a.createElement(wr,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:u,errors:o,getComponent:r}):x?q.a.createElement(Sr,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:u,errors:o}):q.a.createElement(p,dn()({},t.props,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:u,errors:o,schema:E,getComponent:r,fn:s})),u?null:q.a.createElement(j,{className:\"btn btn-sm json-schema-form-item-remove \".concat(h.length?\"invalid\":null),title:h.length?h:\"\",onClick:function(){return t.removeItem(n)}},\" - \"))})):null,u?null:q.a.createElement(j,{className:\"btn btn-sm json-schema-form-item-add \".concat(d.length?\"invalid\":null),title:d.length?d:\"\",onClick:this.addItem},\"Add \",y?\"\".concat(y,\" \"):\"\",\"item\"))}}]),n}(M.PureComponent);y()(xr,\"defaultProps\",yr);var Sr=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onChange\",(function(e){var t=e.target.value;r.props.onChange(t,r.props.keyName)})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.value,n=e.errors,r=e.description,a=e.disabled;return t||(t=\"\"),n=n.toJS?n.toJS():[],q.a.createElement(gr.a,{type:\"text\",className:n.length?\"invalid\":\"\",title:n.length?n:\"\",value:t,minLength:0,debounceTimeout:350,placeholder:r,onChange:this.onChange,disabled:a})}}]),n}(M.Component);y()(Sr,\"defaultProps\",yr);var wr=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onFileChange\",(function(e){var t=e.target.files[0];r.props.onChange(t,r.props.keyName)})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.errors,r=e.disabled,a=t(\"Input\"),o=r||!(\"FormData\"in window);return q.a.createElement(a,{type:\"file\",className:n.length?\"invalid\":\"\",title:n.length?n:\"\",onChange:this.onFileChange,disabled:o})}}]),n}(M.Component);y()(wr,\"defaultProps\",yr);var jr=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onEnumChange\",(function(e){return r.props.onChange(e)})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.errors,a=e.schema,o=e.required,i=e.disabled;r=r.toJS?r.toJS():[];var s=a&&a.get?a.get(\"enum\"):null,c=!s||!o,u=!s&&Object(B.fromJS)([\"true\",\"false\"]),l=t(\"Select\");return q.a.createElement(l,{className:r.length?\"invalid\":\"\",title:r.length?r:\"\",value:String(n),disabled:i,allowedValues:s||u,allowEmptyValue:c,onChange:this.onEnumChange})}}]),n}(M.Component);y()(jr,\"defaultProps\",yr);var Or=function(e){return N()(e).call(e,(function(e){var t,n=void 0!==e.propKey?e.propKey:e.index,r=\"string\"==typeof e?e:\"string\"==typeof e.error?e.error:null;if(!n&&r)return r;for(var a=e.error,o=\"/\".concat(e.propKey);\"object\"===i()(a);){var s=void 0!==a.propKey?a.propKey:a.index;if(void 0===s)break;if(o+=\"/\".concat(s),!a.error)break;a=a.error}return c()(t=\"\".concat(o,\": \")).call(t,a)}))},Cr=function(e){ye()(n,e);var t=Ee()(n);function n(){var e;return E()(this,n),e=t.call(this),y()(ve()(e),\"onChange\",(function(t){e.props.onChange(t)})),y()(ve()(e),\"handleOnChange\",(function(t){var n=t.target.value;e.onChange(n)})),e}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.errors,a=e.disabled,o=t(\"TextArea\");return r=r.toJS?r.toJS():I()(r)?r:[],q.a.createElement(\"div\",null,q.a.createElement(o,{className:Rt()({invalid:r.length}),title:r.length?Or(r).join(\", \"):\"\",value:Object(H.I)(n),disabled:a,onChange:this.handleOnChange}))}}]),n}(M.PureComponent);function _r(e){return B.List.isList(e)?e:I()(e)?Object(B.fromJS)(e):Object(B.List)()}y()(Cr,\"defaultProps\",yr);var Ar=function(){var e={components:{App:Oe,authorizationPopup:Ce,authorizeBtn:_e,AuthorizeBtnContainer:Ae,authorizeOperationBtn:ke,auths:Ie,AuthItem:Pe,authError:Te,oauth2:Ke,apiKeyAuth:Re,basicAuth:Ne,clear:Ge,liveResponse:Qe,InitializedInput:Mn,info:Un,InfoContainer:Vn,JumpToPath:zn,onlineValidatorBadge:et.a,operations:rt,operation:lt,OperationSummary:dt,OperationSummaryMethod:ht,OperationSummaryPath:mt,highlightCode:Ct,responses:_t,response:Mt,ResponseExtension:qt,responseBody:Ft,parameters:Yt,parameterRow:Qt,execute:an,headers:on,errors:sn,contentType:pn,overview:Tn,footer:Fn,FilterContainer:Jn,ParamBody:Hn,curl:Yn,schemes:Kn,SchemesContainer:Gn,modelExample:Xn,ModelWrapper:Qn,ModelCollapse:Zn,Model:er.a,Models:tr,EnumModel:nr,ObjectModel:ar,ArrayModel:or,PrimitiveModel:sr,Property:cr,TryItOutButton:ur,Markdown:hr.a,BaseLayout:mr,VersionPragmaFilter:lr,VersionStamp:pr,OperationExt:yt,OperationExtRow:bt,ParameterExt:Kt,ParameterIncludeEmpty:Zt,OperationTag:ut,OperationContainer:je,DeepLink:fr,InfoUrl:Ln,InfoBasePath:qn,SvgAssets:dr,Example:Me,ExamplesSelect:Be,ExamplesSelectValueRetainer:Ue}},t={components:r},n={components:a};return[pe.default,ue.default,ie.default,re.default,ne.default,ee.default,te.default,ae.default,e,t,se.default,n,ce.default,le.default,fe.default,de.default,he.default,oe.default]},kr=n(253);function Ir(){return[Ar,kr.default]}var Pr=n(274);var Tr=!0,Rr=\"gee40b00\",Nr=\"3.52.0\",Mr=\"ip-172-31-21-173\",qr=\"Mon, 09 Aug 2021 15:13:17 GMT\";function Dr(e){var t;W.a.versions=W.a.versions||{},W.a.versions.swaggerUi={version:Nr,gitRevision:Rr,gitDirty:Tr,buildTimestamp:qr,machine:Mr};var n={dom_id:null,domNode:null,spec:{},url:\"\",urls:null,layout:\"BaseLayout\",docExpansion:\"list\",maxDisplayedTags:null,filter:null,validatorUrl:\"https://validator.swagger.io/validator\",oauth2RedirectUrl:c()(t=\"\".concat(window.location.protocol,\"//\")).call(t,window.location.host,\"/oauth2-redirect.html\"),persistAuthorization:!1,configs:{},custom:{},displayOperationId:!1,displayRequestDuration:!1,deepLinking:!1,tryItOutEnabled:!1,requestInterceptor:function(e){return e},responseInterceptor:function(e){return e},showMutatedRequest:!0,defaultModelRendering:\"example\",defaultModelExpandDepth:1,defaultModelsExpandDepth:1,showExtensions:!1,showCommonExtensions:!1,withCredentials:void 0,requestSnippetsEnabled:!1,requestSnippets:{generators:{curl_bash:{title:\"cURL (bash)\",syntax:\"bash\"},curl_powershell:{title:\"cURL (PowerShell)\",syntax:\"powershell\"},curl_cmd:{title:\"cURL (CMD)\",syntax:\"bash\"}},defaultExpanded:!0,languagesMask:null},supportedSubmitMethods:[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\",\"trace\"],presets:[Ir],plugins:[],pluginsOptions:{pluginLoadType:\"legacy\"},initialState:{},fn:{},components:{},syntaxHighlight:{activated:!0,theme:\"agate\"}},r=Object(H.C)(),a=e.domNode;delete e.domNode;var o=v()({},n,e,r),s={system:{configs:o.configs},plugins:o.presets,pluginsOptions:o.pluginsOptions,state:v()({layout:{layout:o.layout,filter:l()(o)},spec:{spec:\"\",url:o.url},requestSnippets:o.requestSnippets},o.initialState)};if(o.initialState)for(var u in o.initialState)Object.prototype.hasOwnProperty.call(o.initialState,u)&&void 0===o.initialState[u]&&delete s.state[u];var p=new Y(s);p.register([o.plugins,function(){return{fn:o.fn,components:o.components,state:o.state}}]);var d=p.getSystem(),m=function(e){var t=d.specSelectors.getLocalConfig?d.specSelectors.getLocalConfig():{},n=v()({},t,o,e||{},r);if(a&&(n.domNode=a),p.setConfigs(n),d.configsActions.loaded(),null!==e&&(!r.url&&\"object\"===i()(n.spec)&&f()(n.spec).length?(d.specActions.updateUrl(\"\"),d.specActions.updateLoadingStatus(\"success\"),d.specActions.updateSpec(h()(n.spec))):d.specActions.download&&n.url&&!n.urls&&(d.specActions.updateUrl(n.url),d.specActions.download(n.url))),n.domNode)d.render(n.domNode,\"App\");else if(n.dom_id){var s=document.querySelector(n.dom_id);d.render(s,\"App\")}else null===n.dom_id||null===n.domNode||console.error(\"Skipped rendering: no `dom_id` or `domNode` was specified\");return d},g=r.config||o.configUrl;return g&&d.specActions&&d.specActions.getConfigByUrl?(d.specActions.getConfigByUrl({url:g,loadRemoteConfig:!0,requestInterceptor:o.requestInterceptor,responseInterceptor:o.responseInterceptor},m),d):m()}Dr.presets={apis:Ir},Dr.plugins=Pr.default;t.default=Dr}]).default;\n//# sourceMappingURL=swagger-ui-es-bundle-core.js.map"
  },
  {
    "path": "assembly/assembly-swagger-war/src/main/webapp/swagger-ui-es-bundle.js",
    "content": "/*! For license information please see swagger-ui-es-bundle.js.LICENSE.txt */\nmodule.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"/dist\",n(n.s=543)}([function(e,t,n){\"use strict\";e.exports=n(132)},function(e,t,n){e.exports=function(){\"use strict\";var e=Array.prototype.slice;function t(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function n(e){return i(e)?e:J(e)}function r(e){return s(e)?e:K(e)}function o(e){return u(e)?e:Y(e)}function a(e){return i(e)&&!c(e)?e:G(e)}function i(e){return!(!e||!e[p])}function s(e){return!(!e||!e[f])}function u(e){return!(!e||!e[h])}function c(e){return s(e)||u(e)}function l(e){return!(!e||!e[d])}t(r,n),t(o,n),t(a,n),n.isIterable=i,n.isKeyed=s,n.isIndexed=u,n.isAssociative=c,n.isOrdered=l,n.Keyed=r,n.Indexed=o,n.Set=a;var p=\"@@__IMMUTABLE_ITERABLE__@@\",f=\"@@__IMMUTABLE_KEYED__@@\",h=\"@@__IMMUTABLE_INDEXED__@@\",d=\"@@__IMMUTABLE_ORDERED__@@\",m=\"delete\",v=5,g=1<<v,y=g-1,b={},_={value:!1},w={value:!1};function x(e){return e.value=!1,e}function E(e){e&&(e.value=!0)}function S(){}function C(e,t){t=t||0;for(var n=Math.max(0,e.length-t),r=new Array(n),o=0;o<n;o++)r[o]=e[o+t];return r}function A(e){return void 0===e.size&&(e.size=e.__iterate(O)),e.size}function k(e,t){if(\"number\"!=typeof t){var n=t>>>0;if(\"\"+n!==t||4294967295===n)return NaN;t=n}return t<0?A(e)+t:t}function O(){return!0}function j(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function T(e,t){return P(e,t,0)}function I(e,t){return P(e,t,t)}function P(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}var N=0,M=1,R=2,D=\"function\"==typeof Symbol&&Symbol.iterator,L=\"@@iterator\",B=D||L;function F(e){this.next=e}function U(e,t,n,r){var o=0===e?t:1===e?n:[t,n];return r?r.value=o:r={value:o,done:!1},r}function q(){return{value:void 0,done:!0}}function z(e){return!!H(e)}function V(e){return e&&\"function\"==typeof e.next}function W(e){var t=H(e);return t&&t.call(e)}function H(e){var t=e&&(D&&e[D]||e[L]);if(\"function\"==typeof t)return t}function $(e){return e&&\"number\"==typeof e.length}function J(e){return null==e?ie():i(e)?e.toSeq():ce(e)}function K(e){return null==e?ie().toKeyedSeq():i(e)?s(e)?e.toSeq():e.fromEntrySeq():se(e)}function Y(e){return null==e?ie():i(e)?s(e)?e.entrySeq():e.toIndexedSeq():ue(e)}function G(e){return(null==e?ie():i(e)?s(e)?e.entrySeq():e:ue(e)).toSetSeq()}F.prototype.toString=function(){return\"[Iterator]\"},F.KEYS=N,F.VALUES=M,F.ENTRIES=R,F.prototype.inspect=F.prototype.toSource=function(){return this.toString()},F.prototype[B]=function(){return this},t(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString(\"Seq {\",\"}\")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(e,t){return pe(this,e,t,!0)},J.prototype.__iterator=function(e,t){return fe(this,e,t,!0)},t(K,J),K.prototype.toKeyedSeq=function(){return this},t(Y,J),Y.of=function(){return Y(arguments)},Y.prototype.toIndexedSeq=function(){return this},Y.prototype.toString=function(){return this.__toString(\"Seq [\",\"]\")},Y.prototype.__iterate=function(e,t){return pe(this,e,t,!1)},Y.prototype.__iterator=function(e,t){return fe(this,e,t,!1)},t(G,J),G.of=function(){return G(arguments)},G.prototype.toSetSeq=function(){return this},J.isSeq=ae,J.Keyed=K,J.Set=G,J.Indexed=Y;var Z,X,Q,ee=\"@@__IMMUTABLE_SEQ__@@\";function te(e){this._array=e,this.size=e.length}function ne(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function re(e){this._iterable=e,this.size=e.length||e.size}function oe(e){this._iterator=e,this._iteratorCache=[]}function ae(e){return!(!e||!e[ee])}function ie(){return Z||(Z=new te([]))}function se(e){var t=Array.isArray(e)?new te(e).fromEntrySeq():V(e)?new oe(e).fromEntrySeq():z(e)?new re(e).fromEntrySeq():\"object\"==typeof e?new ne(e):void 0;if(!t)throw new TypeError(\"Expected Array or iterable object of [k, v] entries, or keyed object: \"+e);return t}function ue(e){var t=le(e);if(!t)throw new TypeError(\"Expected Array or iterable object of values: \"+e);return t}function ce(e){var t=le(e)||\"object\"==typeof e&&new ne(e);if(!t)throw new TypeError(\"Expected Array or iterable object of values, or keyed object: \"+e);return t}function le(e){return $(e)?new te(e):V(e)?new oe(e):z(e)?new re(e):void 0}function pe(e,t,n,r){var o=e._cache;if(o){for(var a=o.length-1,i=0;i<=a;i++){var s=o[n?a-i:i];if(!1===t(s[1],r?s[0]:i,e))return i+1}return i}return e.__iterateUncached(t,n)}function fe(e,t,n,r){var o=e._cache;if(o){var a=o.length-1,i=0;return new F((function(){var e=o[n?a-i:i];return i++>a?q():U(t,r?e[0]:i-1,e[1])}))}return e.__iteratorUncached(t,n)}function he(e,t){return t?de(t,e,\"\",{\"\":e}):me(e)}function de(e,t,n,r){return Array.isArray(t)?e.call(r,n,Y(t).map((function(n,r){return de(e,n,r,t)}))):ve(t)?e.call(r,n,K(t).map((function(n,r){return de(e,n,r,t)}))):t}function me(e){return Array.isArray(e)?Y(e).map(me).toList():ve(e)?K(e).map(me).toMap():e}function ve(e){return e&&(e.constructor===Object||void 0===e.constructor)}function ge(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if(\"function\"==typeof e.valueOf&&\"function\"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!(\"function\"!=typeof e.equals||\"function\"!=typeof t.equals||!e.equals(t))}function ye(e,t){if(e===t)return!0;if(!i(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||s(e)!==s(t)||u(e)!==u(t)||l(e)!==l(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!c(e);if(l(e)){var r=e.entries();return t.every((function(e,t){var o=r.next().value;return o&&ge(o[1],e)&&(n||ge(o[0],t))}))&&r.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)\"function\"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var a=e;e=t,t=a}var p=!0,f=t.__iterate((function(t,r){if(n?!e.has(t):o?!ge(t,e.get(r,b)):!ge(e.get(r,b),t))return p=!1,!1}));return p&&e.size===f}function be(e,t){if(!(this instanceof be))return new be(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(X)return X;X=this}}function _e(e,t){if(!e)throw new Error(t)}function we(e,t,n){if(!(this instanceof we))return new we(e,t,n);if(_e(0!==n,\"Cannot step a Range by 0\"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),t<e&&(n=-n),this._start=e,this._end=t,this._step=n,this.size=Math.max(0,Math.ceil((t-e)/n-1)+1),0===this.size){if(Q)return Q;Q=this}}function xe(){throw TypeError(\"Abstract\")}function Ee(){}function Se(){}function Ce(){}J.prototype[ee]=!0,t(te,Y),te.prototype.get=function(e,t){return this.has(e)?this._array[k(this,e)]:t},te.prototype.__iterate=function(e,t){for(var n=this._array,r=n.length-1,o=0;o<=r;o++)if(!1===e(n[t?r-o:o],o,this))return o+1;return o},te.prototype.__iterator=function(e,t){var n=this._array,r=n.length-1,o=0;return new F((function(){return o>r?q():U(e,o,n[t?r-o++:o++])}))},t(ne,K),ne.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},ne.prototype.has=function(e){return this._object.hasOwnProperty(e)},ne.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,o=r.length-1,a=0;a<=o;a++){var i=r[t?o-a:a];if(!1===e(n[i],i,this))return a+1}return a},ne.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,o=r.length-1,a=0;return new F((function(){var i=r[t?o-a:a];return a++>o?q():U(e,i,n[i])}))},ne.prototype[d]=!0,t(re,Y),re.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=W(this._iterable),r=0;if(V(n))for(var o;!(o=n.next()).done&&!1!==e(o.value,r++,this););return r},re.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=W(this._iterable);if(!V(n))return new F(q);var r=0;return new F((function(){var t=n.next();return t.done?t:U(e,r++,t.value)}))},t(oe,Y),oe.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n,r=this._iterator,o=this._iteratorCache,a=0;a<o.length;)if(!1===e(o[a],a++,this))return a;for(;!(n=r.next()).done;){var i=n.value;if(o[a]=i,!1===e(i,a++,this))break}return a},oe.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=this._iterator,r=this._iteratorCache,o=0;return new F((function(){if(o>=r.length){var t=n.next();if(t.done)return t;r[o]=t.value}return U(e,o,r[o++])}))},t(be,Y),be.prototype.toString=function(){return 0===this.size?\"Repeat []\":\"Repeat [ \"+this._value+\" \"+this.size+\" times ]\"},be.prototype.get=function(e,t){return this.has(e)?this._value:t},be.prototype.includes=function(e){return ge(this._value,e)},be.prototype.slice=function(e,t){var n=this.size;return j(e,t,n)?this:new be(this._value,I(t,n)-T(e,n))},be.prototype.reverse=function(){return this},be.prototype.indexOf=function(e){return ge(this._value,e)?0:-1},be.prototype.lastIndexOf=function(e){return ge(this._value,e)?this.size:-1},be.prototype.__iterate=function(e,t){for(var n=0;n<this.size;n++)if(!1===e(this._value,n,this))return n+1;return n},be.prototype.__iterator=function(e,t){var n=this,r=0;return new F((function(){return r<n.size?U(e,r++,n._value):q()}))},be.prototype.equals=function(e){return e instanceof be?ge(this._value,e._value):ye(e)},t(we,Y),we.prototype.toString=function(){return 0===this.size?\"Range []\":\"Range [ \"+this._start+\"...\"+this._end+(1!==this._step?\" by \"+this._step:\"\")+\" ]\"},we.prototype.get=function(e,t){return this.has(e)?this._start+k(this,e)*this._step:t},we.prototype.includes=function(e){var t=(e-this._start)/this._step;return t>=0&&t<this.size&&t===Math.floor(t)},we.prototype.slice=function(e,t){return j(e,t,this.size)?this:(e=T(e,this.size),(t=I(t,this.size))<=e?new we(0,0):new we(this.get(e,this._end),this.get(t,this._end),this._step))},we.prototype.indexOf=function(e){var t=e-this._start;if(t%this._step==0){var n=t/this._step;if(n>=0&&n<this.size)return n}return-1},we.prototype.lastIndexOf=function(e){return this.indexOf(e)},we.prototype.__iterate=function(e,t){for(var n=this.size-1,r=this._step,o=t?this._start+n*r:this._start,a=0;a<=n;a++){if(!1===e(o,a,this))return a+1;o+=t?-r:r}return a},we.prototype.__iterator=function(e,t){var n=this.size-1,r=this._step,o=t?this._start+n*r:this._start,a=0;return new F((function(){var i=o;return o+=t?-r:r,a>n?q():U(e,a++,i)}))},we.prototype.equals=function(e){return e instanceof we?this._start===e._start&&this._end===e._end&&this._step===e._step:ye(this,e)},t(xe,n),t(Ee,xe),t(Se,xe),t(Ce,xe),xe.Keyed=Ee,xe.Indexed=Se,xe.Set=Ce;var Ae=\"function\"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),r=65535&(t|=0);return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0};function ke(e){return e>>>1&1073741824|3221225471&e}function Oe(e){if(!1===e||null==e)return 0;if(\"function\"==typeof e.valueOf&&(!1===(e=e.valueOf())||null==e))return 0;if(!0===e)return 1;var t=typeof e;if(\"number\"===t){if(e!=e||e===1/0)return 0;var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)n^=e/=4294967295;return ke(n)}if(\"string\"===t)return e.length>Fe?je(e):Te(e);if(\"function\"==typeof e.hashCode)return e.hashCode();if(\"object\"===t)return Ie(e);if(\"function\"==typeof e.toString)return Te(e.toString());throw new Error(\"Value type \"+t+\" cannot be hashed.\")}function je(e){var t=ze[e];return void 0===t&&(t=Te(e),qe===Ue&&(qe=0,ze={}),qe++,ze[e]=t),t}function Te(e){for(var t=0,n=0;n<e.length;n++)t=31*t+e.charCodeAt(n)|0;return ke(t)}function Ie(e){var t;if(De&&void 0!==(t=Re.get(e)))return t;if(void 0!==(t=e[Be]))return t;if(!Ne){if(void 0!==(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[Be]))return t;if(void 0!==(t=Me(e)))return t}if(t=++Le,1073741824&Le&&(Le=0),De)Re.set(e,t);else{if(void 0!==Pe&&!1===Pe(e))throw new Error(\"Non-extensible objects are not allowed as keys.\");if(Ne)Object.defineProperty(e,Be,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[Be]=t;else{if(void 0===e.nodeType)throw new Error(\"Unable to set a non-enumerable property on object.\");e[Be]=t}}return t}var Pe=Object.isExtensible,Ne=function(){try{return Object.defineProperty({},\"@\",{}),!0}catch(e){return!1}}();function Me(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}var Re,De=\"function\"==typeof WeakMap;De&&(Re=new WeakMap);var Le=0,Be=\"__immutablehash__\";\"function\"==typeof Symbol&&(Be=Symbol(Be));var Fe=16,Ue=255,qe=0,ze={};function Ve(e){_e(e!==1/0,\"Cannot perform this action with an infinite size.\")}function We(e){return null==e?ot():He(e)&&!l(e)?e:ot().withMutations((function(t){var n=r(e);Ve(n.size),n.forEach((function(e,n){return t.set(n,e)}))}))}function He(e){return!(!e||!e[Je])}t(We,Ee),We.of=function(){var t=e.call(arguments,0);return ot().withMutations((function(e){for(var n=0;n<t.length;n+=2){if(n+1>=t.length)throw new Error(\"Missing value for key: \"+t[n]);e.set(t[n],t[n+1])}}))},We.prototype.toString=function(){return this.__toString(\"Map {\",\"}\")},We.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},We.prototype.set=function(e,t){return at(this,e,t)},We.prototype.setIn=function(e,t){return this.updateIn(e,b,(function(){return t}))},We.prototype.remove=function(e){return at(this,e,b)},We.prototype.deleteIn=function(e){return this.updateIn(e,(function(){return b}))},We.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},We.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=vt(this,xn(e),t,n);return r===b?void 0:r},We.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):ot()},We.prototype.merge=function(){return ft(this,void 0,arguments)},We.prototype.mergeWith=function(t){return ft(this,t,e.call(arguments,1))},We.prototype.mergeIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,ot(),(function(e){return\"function\"==typeof e.merge?e.merge.apply(e,n):n[n.length-1]}))},We.prototype.mergeDeep=function(){return ft(this,ht,arguments)},We.prototype.mergeDeepWith=function(t){var n=e.call(arguments,1);return ft(this,dt(t),n)},We.prototype.mergeDeepIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,ot(),(function(e){return\"function\"==typeof e.mergeDeep?e.mergeDeep.apply(e,n):n[n.length-1]}))},We.prototype.sort=function(e){return zt(pn(this,e))},We.prototype.sortBy=function(e,t){return zt(pn(this,t,e))},We.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},We.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new S)},We.prototype.asImmutable=function(){return this.__ensureOwner()},We.prototype.wasAltered=function(){return this.__altered},We.prototype.__iterator=function(e,t){return new et(this,e,t)},We.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate((function(t){return r++,e(t[1],t[0],n)}),t),r},We.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?rt(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},We.isMap=He;var $e,Je=\"@@__IMMUTABLE_MAP__@@\",Ke=We.prototype;function Ye(e,t){this.ownerID=e,this.entries=t}function Ge(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function Ze(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function Xe(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function Qe(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function et(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&nt(e._root)}function tt(e,t){return U(e,t[0],t[1])}function nt(e,t){return{node:e,index:0,__prev:t}}function rt(e,t,n,r){var o=Object.create(Ke);return o.size=e,o._root=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function ot(){return $e||($e=rt(0))}function at(e,t,n){var r,o;if(e._root){var a=x(_),i=x(w);if(r=it(e._root,e.__ownerID,0,void 0,t,n,a,i),!i.value)return e;o=e.size+(a.value?n===b?-1:1:0)}else{if(n===b)return e;o=1,r=new Ye(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=o,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?rt(o,r):ot()}function it(e,t,n,r,o,a,i,s){return e?e.update(t,n,r,o,a,i,s):a===b?e:(E(s),E(i),new Qe(t,r,[o,a]))}function st(e){return e.constructor===Qe||e.constructor===Xe}function ut(e,t,n,r,o){if(e.keyHash===r)return new Xe(t,r,[e.entry,o]);var a,i=(0===n?e.keyHash:e.keyHash>>>n)&y,s=(0===n?r:r>>>n)&y;return new Ge(t,1<<i|1<<s,i===s?[ut(e,t,n+v,r,o)]:(a=new Qe(t,r,o),i<s?[e,a]:[a,e]))}function ct(e,t,n,r){e||(e=new S);for(var o=new Qe(e,Oe(n),[n,r]),a=0;a<t.length;a++){var i=t[a];o=o.update(e,0,void 0,i[0],i[1])}return o}function lt(e,t,n,r){for(var o=0,a=0,i=new Array(n),s=0,u=1,c=t.length;s<c;s++,u<<=1){var l=t[s];void 0!==l&&s!==r&&(o|=u,i[a++]=l)}return new Ge(e,o,i)}function pt(e,t,n,r,o){for(var a=0,i=new Array(g),s=0;0!==n;s++,n>>>=1)i[s]=1&n?t[a++]:void 0;return i[r]=o,new Ze(e,a+1,i)}function ft(e,t,n){for(var o=[],a=0;a<n.length;a++){var s=n[a],u=r(s);i(s)||(u=u.map((function(e){return he(e)}))),o.push(u)}return mt(e,t,o)}function ht(e,t,n){return e&&e.mergeDeep&&i(t)?e.mergeDeep(t):ge(e,t)?e:t}function dt(e){return function(t,n,r){if(t&&t.mergeDeepWith&&i(n))return t.mergeDeepWith(e,n);var o=e(t,n,r);return ge(t,o)?t:o}}function mt(e,t,n){return 0===(n=n.filter((function(e){return 0!==e.size}))).length?e:0!==e.size||e.__ownerID||1!==n.length?e.withMutations((function(e){for(var r=t?function(n,r){e.update(r,b,(function(e){return e===b?n:t(e,n,r)}))}:function(t,n){e.set(n,t)},o=0;o<n.length;o++)n[o].forEach(r)})):e.constructor(n[0])}function vt(e,t,n,r){var o=e===b,a=t.next();if(a.done){var i=o?n:e,s=r(i);return s===i?e:s}_e(o||e&&e.set,\"invalid keyPath\");var u=a.value,c=o?b:e.get(u,b),l=vt(c,t,n,r);return l===c?e:l===b?e.remove(u):(o?ot():e).set(u,l)}function gt(e){return e=(e=(858993459&(e-=e>>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function yt(e,t,n,r){var o=r?e:C(e);return o[t]=n,o}function bt(e,t,n,r){var o=e.length+1;if(r&&t+1===o)return e[t]=n,e;for(var a=new Array(o),i=0,s=0;s<o;s++)s===t?(a[s]=n,i=-1):a[s]=e[s+i];return a}function _t(e,t,n){var r=e.length-1;if(n&&t===r)return e.pop(),e;for(var o=new Array(r),a=0,i=0;i<r;i++)i===t&&(a=1),o[i]=e[i+a];return o}Ke[Je]=!0,Ke[m]=Ke.remove,Ke.removeIn=Ke.deleteIn,Ye.prototype.get=function(e,t,n,r){for(var o=this.entries,a=0,i=o.length;a<i;a++)if(ge(n,o[a][0]))return o[a][1];return r},Ye.prototype.update=function(e,t,n,r,o,a,i){for(var s=o===b,u=this.entries,c=0,l=u.length;c<l&&!ge(r,u[c][0]);c++);var p=c<l;if(p?u[c][1]===o:s)return this;if(E(i),(s||!p)&&E(a),!s||1!==u.length){if(!p&&!s&&u.length>=wt)return ct(e,u,r,o);var f=e&&e===this.ownerID,h=f?u:C(u);return p?s?c===l-1?h.pop():h[c]=h.pop():h[c]=[r,o]:h.push([r,o]),f?(this.entries=h,this):new Ye(e,h)}},Ge.prototype.get=function(e,t,n,r){void 0===t&&(t=Oe(n));var o=1<<((0===e?t:t>>>e)&y),a=this.bitmap;return 0==(a&o)?r:this.nodes[gt(a&o-1)].get(e+v,t,n,r)},Ge.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=Oe(r));var s=(0===t?n:n>>>t)&y,u=1<<s,c=this.bitmap,l=0!=(c&u);if(!l&&o===b)return this;var p=gt(c&u-1),f=this.nodes,h=l?f[p]:void 0,d=it(h,e,t+v,n,r,o,a,i);if(d===h)return this;if(!l&&d&&f.length>=xt)return pt(e,f,c,s,d);if(l&&!d&&2===f.length&&st(f[1^p]))return f[1^p];if(l&&d&&1===f.length&&st(d))return d;var m=e&&e===this.ownerID,g=l?d?c:c^u:c|u,_=l?d?yt(f,p,d,m):_t(f,p,m):bt(f,p,d,m);return m?(this.bitmap=g,this.nodes=_,this):new Ge(e,g,_)},Ze.prototype.get=function(e,t,n,r){void 0===t&&(t=Oe(n));var o=(0===e?t:t>>>e)&y,a=this.nodes[o];return a?a.get(e+v,t,n,r):r},Ze.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=Oe(r));var s=(0===t?n:n>>>t)&y,u=o===b,c=this.nodes,l=c[s];if(u&&!l)return this;var p=it(l,e,t+v,n,r,o,a,i);if(p===l)return this;var f=this.count;if(l){if(!p&&--f<Et)return lt(e,c,f,s)}else f++;var h=e&&e===this.ownerID,d=yt(c,s,p,h);return h?(this.count=f,this.nodes=d,this):new Ze(e,f,d)},Xe.prototype.get=function(e,t,n,r){for(var o=this.entries,a=0,i=o.length;a<i;a++)if(ge(n,o[a][0]))return o[a][1];return r},Xe.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=Oe(r));var s=o===b;if(n!==this.keyHash)return s?this:(E(i),E(a),ut(this,e,t,n,[r,o]));for(var u=this.entries,c=0,l=u.length;c<l&&!ge(r,u[c][0]);c++);var p=c<l;if(p?u[c][1]===o:s)return this;if(E(i),(s||!p)&&E(a),s&&2===l)return new Qe(e,this.keyHash,u[1^c]);var f=e&&e===this.ownerID,h=f?u:C(u);return p?s?c===l-1?h.pop():h[c]=h.pop():h[c]=[r,o]:h.push([r,o]),f?(this.entries=h,this):new Xe(e,this.keyHash,h)},Qe.prototype.get=function(e,t,n,r){return ge(n,this.entry[0])?this.entry[1]:r},Qe.prototype.update=function(e,t,n,r,o,a,i){var s=o===b,u=ge(r,this.entry[0]);return(u?o===this.entry[1]:s)?this:(E(i),s?void E(a):u?e&&e===this.ownerID?(this.entry[1]=o,this):new Qe(e,this.keyHash,[r,o]):(E(a),ut(this,e,t,Oe(r),[r,o])))},Ye.prototype.iterate=Xe.prototype.iterate=function(e,t){for(var n=this.entries,r=0,o=n.length-1;r<=o;r++)if(!1===e(n[t?o-r:r]))return!1},Ge.prototype.iterate=Ze.prototype.iterate=function(e,t){for(var n=this.nodes,r=0,o=n.length-1;r<=o;r++){var a=n[t?o-r:r];if(a&&!1===a.iterate(e,t))return!1}},Qe.prototype.iterate=function(e,t){return e(this.entry)},t(et,F),et.prototype.next=function(){for(var e=this._type,t=this._stack;t;){var n,r=t.node,o=t.index++;if(r.entry){if(0===o)return tt(e,r.entry)}else if(r.entries){if(o<=(n=r.entries.length-1))return tt(e,r.entries[this._reverse?n-o:o])}else if(o<=(n=r.nodes.length-1)){var a=r.nodes[this._reverse?n-o:o];if(a){if(a.entry)return tt(e,a.entry);t=this._stack=nt(a,t)}continue}t=this._stack=this._stack.__prev}return q()};var wt=g/4,xt=g/2,Et=g/4;function St(e){var t=Mt();if(null==e)return t;if(Ct(e))return e;var n=o(e),r=n.size;return 0===r?t:(Ve(r),r>0&&r<g?Nt(0,r,v,null,new Ot(n.toArray())):t.withMutations((function(e){e.setSize(r),n.forEach((function(t,n){return e.set(n,t)}))})))}function Ct(e){return!(!e||!e[At])}t(St,Se),St.of=function(){return this(arguments)},St.prototype.toString=function(){return this.__toString(\"List [\",\"]\")},St.prototype.get=function(e,t){if((e=k(this,e))>=0&&e<this.size){var n=Bt(this,e+=this._origin);return n&&n.array[e&y]}return t},St.prototype.set=function(e,t){return Rt(this,e,t)},St.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},St.prototype.insert=function(e,t){return this.splice(e,0,t)},St.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=v,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):Mt()},St.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations((function(n){Ft(n,0,t+e.length);for(var r=0;r<e.length;r++)n.set(t+r,e[r])}))},St.prototype.pop=function(){return Ft(this,0,-1)},St.prototype.unshift=function(){var e=arguments;return this.withMutations((function(t){Ft(t,-e.length);for(var n=0;n<e.length;n++)t.set(n,e[n])}))},St.prototype.shift=function(){return Ft(this,1)},St.prototype.merge=function(){return Ut(this,void 0,arguments)},St.prototype.mergeWith=function(t){return Ut(this,t,e.call(arguments,1))},St.prototype.mergeDeep=function(){return Ut(this,ht,arguments)},St.prototype.mergeDeepWith=function(t){var n=e.call(arguments,1);return Ut(this,dt(t),n)},St.prototype.setSize=function(e){return Ft(this,0,e)},St.prototype.slice=function(e,t){var n=this.size;return j(e,t,n)?this:Ft(this,T(e,n),I(t,n))},St.prototype.__iterator=function(e,t){var n=0,r=Pt(this,t);return new F((function(){var t=r();return t===It?q():U(e,n++,t)}))},St.prototype.__iterate=function(e,t){for(var n,r=0,o=Pt(this,t);(n=o())!==It&&!1!==e(n,r++,this););return r},St.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Nt(this._origin,this._capacity,this._level,this._root,this._tail,e,this.__hash):(this.__ownerID=e,this)},St.isList=Ct;var At=\"@@__IMMUTABLE_LIST__@@\",kt=St.prototype;function Ot(e,t){this.array=e,this.ownerID=t}kt[At]=!0,kt[m]=kt.remove,kt.setIn=Ke.setIn,kt.deleteIn=kt.removeIn=Ke.removeIn,kt.update=Ke.update,kt.updateIn=Ke.updateIn,kt.mergeIn=Ke.mergeIn,kt.mergeDeepIn=Ke.mergeDeepIn,kt.withMutations=Ke.withMutations,kt.asMutable=Ke.asMutable,kt.asImmutable=Ke.asImmutable,kt.wasAltered=Ke.wasAltered,Ot.prototype.removeBefore=function(e,t,n){if(n===t?1<<t:0===this.array.length)return this;var r=n>>>t&y;if(r>=this.array.length)return new Ot([],e);var o,a=0===r;if(t>0){var i=this.array[r];if((o=i&&i.removeBefore(e,t-v,n))===i&&a)return this}if(a&&!o)return this;var s=Lt(this,e);if(!a)for(var u=0;u<r;u++)s.array[u]=void 0;return o&&(s.array[r]=o),s},Ot.prototype.removeAfter=function(e,t,n){if(n===(t?1<<t:0)||0===this.array.length)return this;var r,o=n-1>>>t&y;if(o>=this.array.length)return this;if(t>0){var a=this.array[o];if((r=a&&a.removeAfter(e,t-v,n))===a&&o===this.array.length-1)return this}var i=Lt(this,e);return i.array.splice(o+1),r&&(i.array[o]=r),i};var jt,Tt,It={};function Pt(e,t){var n=e._origin,r=e._capacity,o=qt(r),a=e._tail;return i(e._root,e._level,0);function i(e,t,n){return 0===t?s(e,n):u(e,t,n)}function s(e,i){var s=i===o?a&&a.array:e&&e.array,u=i>n?0:n-i,c=r-i;return c>g&&(c=g),function(){if(u===c)return It;var e=t?--c:u++;return s&&s[e]}}function u(e,o,a){var s,u=e&&e.array,c=a>n?0:n-a>>o,l=1+(r-a>>o);return l>g&&(l=g),function(){for(;;){if(s){var e=s();if(e!==It)return e;s=null}if(c===l)return It;var n=t?--l:c++;s=i(u&&u[n],o-v,a+(n<<o))}}}}function Nt(e,t,n,r,o,a,i){var s=Object.create(kt);return s.size=t-e,s._origin=e,s._capacity=t,s._level=n,s._root=r,s._tail=o,s.__ownerID=a,s.__hash=i,s.__altered=!1,s}function Mt(){return jt||(jt=Nt(0,0,v))}function Rt(e,t,n){if((t=k(e,t))!=t)return e;if(t>=e.size||t<0)return e.withMutations((function(e){t<0?Ft(e,t).set(0,n):Ft(e,0,t+1).set(t,n)}));t+=e._origin;var r=e._tail,o=e._root,a=x(w);return t>=qt(e._capacity)?r=Dt(r,e.__ownerID,0,t,n,a):o=Dt(o,e.__ownerID,e._level,t,n,a),a.value?e.__ownerID?(e._root=o,e._tail=r,e.__hash=void 0,e.__altered=!0,e):Nt(e._origin,e._capacity,e._level,o,r):e}function Dt(e,t,n,r,o,a){var i,s=r>>>n&y,u=e&&s<e.array.length;if(!u&&void 0===o)return e;if(n>0){var c=e&&e.array[s],l=Dt(c,t,n-v,r,o,a);return l===c?e:((i=Lt(e,t)).array[s]=l,i)}return u&&e.array[s]===o?e:(E(a),i=Lt(e,t),void 0===o&&s===i.array.length-1?i.array.pop():i.array[s]=o,i)}function Lt(e,t){return t&&e&&t===e.ownerID?e:new Ot(e?e.array.slice():[],t)}function Bt(e,t){if(t>=qt(e._capacity))return e._tail;if(t<1<<e._level+v){for(var n=e._root,r=e._level;n&&r>0;)n=n.array[t>>>r&y],r-=v;return n}}function Ft(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new S,o=e._origin,a=e._capacity,i=o+t,s=void 0===n?a:n<0?a+n:o+n;if(i===o&&s===a)return e;if(i>=s)return e.clear();for(var u=e._level,c=e._root,l=0;i+l<0;)c=new Ot(c&&c.array.length?[void 0,c]:[],r),l+=1<<(u+=v);l&&(i+=l,o+=l,s+=l,a+=l);for(var p=qt(a),f=qt(s);f>=1<<u+v;)c=new Ot(c&&c.array.length?[c]:[],r),u+=v;var h=e._tail,d=f<p?Bt(e,s-1):f>p?new Ot([],r):h;if(h&&f>p&&i<a&&h.array.length){for(var m=c=Lt(c,r),g=u;g>v;g-=v){var b=p>>>g&y;m=m.array[b]=Lt(m.array[b],r)}m.array[p>>>v&y]=h}if(s<a&&(d=d&&d.removeAfter(r,0,s)),i>=f)i-=f,s-=f,u=v,c=null,d=d&&d.removeBefore(r,0,i);else if(i>o||f<p){for(l=0;c;){var _=i>>>u&y;if(_!==f>>>u&y)break;_&&(l+=(1<<u)*_),u-=v,c=c.array[_]}c&&i>o&&(c=c.removeBefore(r,u,i-l)),c&&f<p&&(c=c.removeAfter(r,u,f-l)),l&&(i-=l,s-=l)}return e.__ownerID?(e.size=s-i,e._origin=i,e._capacity=s,e._level=u,e._root=c,e._tail=d,e.__hash=void 0,e.__altered=!0,e):Nt(i,s,u,c,d)}function Ut(e,t,n){for(var r=[],a=0,s=0;s<n.length;s++){var u=n[s],c=o(u);c.size>a&&(a=c.size),i(u)||(c=c.map((function(e){return he(e)}))),r.push(c)}return a>e.size&&(e=e.setSize(a)),mt(e,t,r)}function qt(e){return e<g?0:e-1>>>v<<v}function zt(e){return null==e?Ht():Vt(e)?e:Ht().withMutations((function(t){var n=r(e);Ve(n.size),n.forEach((function(e,n){return t.set(n,e)}))}))}function Vt(e){return He(e)&&l(e)}function Wt(e,t,n,r){var o=Object.create(zt.prototype);return o.size=e?e.size:0,o._map=e,o._list=t,o.__ownerID=n,o.__hash=r,o}function Ht(){return Tt||(Tt=Wt(ot(),Mt()))}function $t(e,t,n){var r,o,a=e._map,i=e._list,s=a.get(t),u=void 0!==s;if(n===b){if(!u)return e;i.size>=g&&i.size>=2*a.size?(r=(o=i.filter((function(e,t){return void 0!==e&&s!==t}))).toKeyedSeq().map((function(e){return e[0]})).flip().toMap(),e.__ownerID&&(r.__ownerID=o.__ownerID=e.__ownerID)):(r=a.remove(t),o=s===i.size-1?i.pop():i.set(s,void 0))}else if(u){if(n===i.get(s)[1])return e;r=a,o=i.set(s,[t,n])}else r=a.set(t,i.size),o=i.set(i.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=o,e.__hash=void 0,e):Wt(r,o)}function Jt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function Kt(e){this._iter=e,this.size=e.size}function Yt(e){this._iter=e,this.size=e.size}function Gt(e){this._iter=e,this.size=e.size}function Zt(e){var t=bn(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=_n,t.__iterateUncached=function(t,n){var r=this;return e.__iterate((function(e,n){return!1!==t(n,e,r)}),n)},t.__iteratorUncached=function(t,n){if(t===R){var r=e.__iterator(t,n);return new F((function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e}))}return e.__iterator(t===M?N:M,n)},t}function Xt(e,t,n){var r=bn(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,o){var a=e.get(r,b);return a===b?o:t.call(n,a,r,e)},r.__iterateUncached=function(r,o){var a=this;return e.__iterate((function(e,o,i){return!1!==r(t.call(n,e,o,i),o,a)}),o)},r.__iteratorUncached=function(r,o){var a=e.__iterator(R,o);return new F((function(){var o=a.next();if(o.done)return o;var i=o.value,s=i[0];return U(r,s,t.call(n,i[1],s,e),o)}))},r}function Qt(e,t){var n=bn(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=Zt(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=_n,n.__iterate=function(t,n){var r=this;return e.__iterate((function(e,n){return t(e,n,r)}),!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function en(e,t,n,r){var o=bn(e);return r&&(o.has=function(r){var o=e.get(r,b);return o!==b&&!!t.call(n,o,r,e)},o.get=function(r,o){var a=e.get(r,b);return a!==b&&t.call(n,a,r,e)?a:o}),o.__iterateUncached=function(o,a){var i=this,s=0;return e.__iterate((function(e,a,u){if(t.call(n,e,a,u))return s++,o(e,r?a:s-1,i)}),a),s},o.__iteratorUncached=function(o,a){var i=e.__iterator(R,a),s=0;return new F((function(){for(;;){var a=i.next();if(a.done)return a;var u=a.value,c=u[0],l=u[1];if(t.call(n,l,c,e))return U(o,r?c:s++,l,a)}}))},o}function tn(e,t,n){var r=We().asMutable();return e.__iterate((function(o,a){r.update(t.call(n,o,a,e),0,(function(e){return e+1}))})),r.asImmutable()}function nn(e,t,n){var r=s(e),o=(l(e)?zt():We()).asMutable();e.__iterate((function(a,i){o.update(t.call(n,a,i,e),(function(e){return(e=e||[]).push(r?[i,a]:a),e}))}));var a=yn(e);return o.map((function(t){return mn(e,a(t))}))}function rn(e,t,n,r){var o=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n===1/0?n=o:n|=0),j(t,n,o))return e;var a=T(t,o),i=I(n,o);if(a!=a||i!=i)return rn(e.toSeq().cacheResult(),t,n,r);var s,u=i-a;u==u&&(s=u<0?0:u);var c=bn(e);return c.size=0===s?s:e.size&&s||void 0,!r&&ae(e)&&s>=0&&(c.get=function(t,n){return(t=k(this,t))>=0&&t<s?e.get(t+a,n):n}),c.__iterateUncached=function(t,n){var o=this;if(0===s)return 0;if(n)return this.cacheResult().__iterate(t,n);var i=0,u=!0,c=0;return e.__iterate((function(e,n){if(!u||!(u=i++<a))return c++,!1!==t(e,r?n:c-1,o)&&c!==s})),c},c.__iteratorUncached=function(t,n){if(0!==s&&n)return this.cacheResult().__iterator(t,n);var o=0!==s&&e.__iterator(t,n),i=0,u=0;return new F((function(){for(;i++<a;)o.next();if(++u>s)return q();var e=o.next();return r||t===M?e:U(t,u-1,t===N?void 0:e.value[1],e)}))},c}function on(e,t,n){var r=bn(e);return r.__iterateUncached=function(r,o){var a=this;if(o)return this.cacheResult().__iterate(r,o);var i=0;return e.__iterate((function(e,o,s){return t.call(n,e,o,s)&&++i&&r(e,o,a)})),i},r.__iteratorUncached=function(r,o){var a=this;if(o)return this.cacheResult().__iterator(r,o);var i=e.__iterator(R,o),s=!0;return new F((function(){if(!s)return q();var e=i.next();if(e.done)return e;var o=e.value,u=o[0],c=o[1];return t.call(n,c,u,a)?r===R?e:U(r,u,c,e):(s=!1,q())}))},r}function an(e,t,n,r){var o=bn(e);return o.__iterateUncached=function(o,a){var i=this;if(a)return this.cacheResult().__iterate(o,a);var s=!0,u=0;return e.__iterate((function(e,a,c){if(!s||!(s=t.call(n,e,a,c)))return u++,o(e,r?a:u-1,i)})),u},o.__iteratorUncached=function(o,a){var i=this;if(a)return this.cacheResult().__iterator(o,a);var s=e.__iterator(R,a),u=!0,c=0;return new F((function(){var e,a,l;do{if((e=s.next()).done)return r||o===M?e:U(o,c++,o===N?void 0:e.value[1],e);var p=e.value;a=p[0],l=p[1],u&&(u=t.call(n,l,a,i))}while(u);return o===R?e:U(o,a,l,e)}))},o}function sn(e,t){var n=s(e),o=[e].concat(t).map((function(e){return i(e)?n&&(e=r(e)):e=n?se(e):ue(Array.isArray(e)?e:[e]),e})).filter((function(e){return 0!==e.size}));if(0===o.length)return e;if(1===o.length){var a=o[0];if(a===e||n&&s(a)||u(e)&&u(a))return a}var c=new te(o);return n?c=c.toKeyedSeq():u(e)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=o.reduce((function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}}),0),c}function un(e,t,n){var r=bn(e);return r.__iterateUncached=function(r,o){var a=0,s=!1;function u(e,c){var l=this;e.__iterate((function(e,o){return(!t||c<t)&&i(e)?u(e,c+1):!1===r(e,n?o:a++,l)&&(s=!0),!s}),o)}return u(e,0),a},r.__iteratorUncached=function(r,o){var a=e.__iterator(r,o),s=[],u=0;return new F((function(){for(;a;){var e=a.next();if(!1===e.done){var c=e.value;if(r===R&&(c=c[1]),t&&!(s.length<t)||!i(c))return n?e:U(r,u++,c,e);s.push(a),a=c.__iterator(r,o)}else a=s.pop()}return q()}))},r}function cn(e,t,n){var r=yn(e);return e.toSeq().map((function(o,a){return r(t.call(n,o,a,e))})).flatten(!0)}function ln(e,t){var n=bn(e);return n.size=e.size&&2*e.size-1,n.__iterateUncached=function(n,r){var o=this,a=0;return e.__iterate((function(e,r){return(!a||!1!==n(t,a++,o))&&!1!==n(e,a++,o)}),r),a},n.__iteratorUncached=function(n,r){var o,a=e.__iterator(M,r),i=0;return new F((function(){return(!o||i%2)&&(o=a.next()).done?o:i%2?U(n,i++,t):U(n,i++,o.value,o)}))},n}function pn(e,t,n){t||(t=wn);var r=s(e),o=0,a=e.toSeq().map((function(t,r){return[r,t,o++,n?n(t,r,e):t]})).toArray();return a.sort((function(e,n){return t(e[3],n[3])||e[2]-n[2]})).forEach(r?function(e,t){a[t].length=2}:function(e,t){a[t]=e[1]}),r?K(a):u(e)?Y(a):G(a)}function fn(e,t,n){if(t||(t=wn),n){var r=e.toSeq().map((function(t,r){return[t,n(t,r,e)]})).reduce((function(e,n){return hn(t,e[1],n[1])?n:e}));return r&&r[0]}return e.reduce((function(e,n){return hn(t,e,n)?n:e}))}function hn(e,t,n){var r=e(n,t);return 0===r&&n!==t&&(null==n||n!=n)||r>0}function dn(e,t,r){var o=bn(e);return o.size=new te(r).map((function(e){return e.size})).min(),o.__iterate=function(e,t){for(var n,r=this.__iterator(M,t),o=0;!(n=r.next()).done&&!1!==e(n.value,o++,this););return o},o.__iteratorUncached=function(e,o){var a=r.map((function(e){return e=n(e),W(o?e.reverse():e)})),i=0,s=!1;return new F((function(){var n;return s||(n=a.map((function(e){return e.next()})),s=n.some((function(e){return e.done}))),s?q():U(e,i++,t.apply(null,n.map((function(e){return e.value}))))}))},o}function mn(e,t){return ae(e)?t:e.constructor(t)}function vn(e){if(e!==Object(e))throw new TypeError(\"Expected [K, V] tuple: \"+e)}function gn(e){return Ve(e.size),A(e)}function yn(e){return s(e)?r:u(e)?o:a}function bn(e){return Object.create((s(e)?K:u(e)?Y:G).prototype)}function _n(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function wn(e,t){return e>t?1:e<t?-1:0}function xn(e){var t=W(e);if(!t){if(!$(e))throw new TypeError(\"Expected iterable or array-like: \"+e);t=W(n(e))}return t}function En(e,t){var n,r=function(a){if(a instanceof r)return a;if(!(this instanceof r))return new r(a);if(!n){n=!0;var i=Object.keys(e);kn(o,i),o.size=i.length,o._name=t,o._keys=i,o._defaultValues=e}this._map=We(a)},o=r.prototype=Object.create(Sn);return o.constructor=r,r}t(zt,We),zt.of=function(){return this(arguments)},zt.prototype.toString=function(){return this.__toString(\"OrderedMap {\",\"}\")},zt.prototype.get=function(e,t){var n=this._map.get(e);return void 0!==n?this._list.get(n)[1]:t},zt.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):Ht()},zt.prototype.set=function(e,t){return $t(this,e,t)},zt.prototype.remove=function(e){return $t(this,e,b)},zt.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},zt.prototype.__iterate=function(e,t){var n=this;return this._list.__iterate((function(t){return t&&e(t[1],t[0],n)}),t)},zt.prototype.__iterator=function(e,t){return this._list.fromEntrySeq().__iterator(e,t)},zt.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e),n=this._list.__ensureOwner(e);return e?Wt(t,n,e,this.__hash):(this.__ownerID=e,this._map=t,this._list=n,this)},zt.isOrderedMap=Vt,zt.prototype[d]=!0,zt.prototype[m]=zt.prototype.remove,t(Jt,K),Jt.prototype.get=function(e,t){return this._iter.get(e,t)},Jt.prototype.has=function(e){return this._iter.has(e)},Jt.prototype.valueSeq=function(){return this._iter.valueSeq()},Jt.prototype.reverse=function(){var e=this,t=Qt(this,!0);return this._useKeys||(t.valueSeq=function(){return e._iter.toSeq().reverse()}),t},Jt.prototype.map=function(e,t){var n=this,r=Xt(this,e,t);return this._useKeys||(r.valueSeq=function(){return n._iter.toSeq().map(e,t)}),r},Jt.prototype.__iterate=function(e,t){var n,r=this;return this._iter.__iterate(this._useKeys?function(t,n){return e(t,n,r)}:(n=t?gn(this):0,function(o){return e(o,t?--n:n++,r)}),t)},Jt.prototype.__iterator=function(e,t){if(this._useKeys)return this._iter.__iterator(e,t);var n=this._iter.__iterator(M,t),r=t?gn(this):0;return new F((function(){var o=n.next();return o.done?o:U(e,t?--r:r++,o.value,o)}))},Jt.prototype[d]=!0,t(Kt,Y),Kt.prototype.includes=function(e){return this._iter.includes(e)},Kt.prototype.__iterate=function(e,t){var n=this,r=0;return this._iter.__iterate((function(t){return e(t,r++,n)}),t)},Kt.prototype.__iterator=function(e,t){var n=this._iter.__iterator(M,t),r=0;return new F((function(){var t=n.next();return t.done?t:U(e,r++,t.value,t)}))},t(Yt,G),Yt.prototype.has=function(e){return this._iter.includes(e)},Yt.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate((function(t){return e(t,t,n)}),t)},Yt.prototype.__iterator=function(e,t){var n=this._iter.__iterator(M,t);return new F((function(){var t=n.next();return t.done?t:U(e,t.value,t.value,t)}))},t(Gt,K),Gt.prototype.entrySeq=function(){return this._iter.toSeq()},Gt.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate((function(t){if(t){vn(t);var r=i(t);return e(r?t.get(1):t[1],r?t.get(0):t[0],n)}}),t)},Gt.prototype.__iterator=function(e,t){var n=this._iter.__iterator(M,t);return new F((function(){for(;;){var t=n.next();if(t.done)return t;var r=t.value;if(r){vn(r);var o=i(r);return U(e,o?r.get(0):r[0],o?r.get(1):r[1],t)}}}))},Kt.prototype.cacheResult=Jt.prototype.cacheResult=Yt.prototype.cacheResult=Gt.prototype.cacheResult=_n,t(En,Ee),En.prototype.toString=function(){return this.__toString(An(this)+\" {\",\"}\")},En.prototype.has=function(e){return this._defaultValues.hasOwnProperty(e)},En.prototype.get=function(e,t){if(!this.has(e))return t;var n=this._defaultValues[e];return this._map?this._map.get(e,n):n},En.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var e=this.constructor;return e._empty||(e._empty=Cn(this,ot()))},En.prototype.set=function(e,t){if(!this.has(e))throw new Error('Cannot set unknown key \"'+e+'\" on '+An(this));if(this._map&&!this._map.has(e)&&t===this._defaultValues[e])return this;var n=this._map&&this._map.set(e,t);return this.__ownerID||n===this._map?this:Cn(this,n)},En.prototype.remove=function(e){if(!this.has(e))return this;var t=this._map&&this._map.remove(e);return this.__ownerID||t===this._map?this:Cn(this,t)},En.prototype.wasAltered=function(){return this._map.wasAltered()},En.prototype.__iterator=function(e,t){var n=this;return r(this._defaultValues).map((function(e,t){return n.get(t)})).__iterator(e,t)},En.prototype.__iterate=function(e,t){var n=this;return r(this._defaultValues).map((function(e,t){return n.get(t)})).__iterate(e,t)},En.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map&&this._map.__ensureOwner(e);return e?Cn(this,t,e):(this.__ownerID=e,this._map=t,this)};var Sn=En.prototype;function Cn(e,t,n){var r=Object.create(Object.getPrototypeOf(e));return r._map=t,r.__ownerID=n,r}function An(e){return e._name||e.constructor.name||\"Record\"}function kn(e,t){try{t.forEach(On.bind(void 0,e))}catch(e){}}function On(e,t){Object.defineProperty(e,t,{get:function(){return this.get(t)},set:function(e){_e(this.__ownerID,\"Cannot set on an immutable record.\"),this.set(t,e)}})}function jn(e){return null==e?Dn():Tn(e)&&!l(e)?e:Dn().withMutations((function(t){var n=a(e);Ve(n.size),n.forEach((function(e){return t.add(e)}))}))}function Tn(e){return!(!e||!e[Pn])}Sn[m]=Sn.remove,Sn.deleteIn=Sn.removeIn=Ke.removeIn,Sn.merge=Ke.merge,Sn.mergeWith=Ke.mergeWith,Sn.mergeIn=Ke.mergeIn,Sn.mergeDeep=Ke.mergeDeep,Sn.mergeDeepWith=Ke.mergeDeepWith,Sn.mergeDeepIn=Ke.mergeDeepIn,Sn.setIn=Ke.setIn,Sn.update=Ke.update,Sn.updateIn=Ke.updateIn,Sn.withMutations=Ke.withMutations,Sn.asMutable=Ke.asMutable,Sn.asImmutable=Ke.asImmutable,t(jn,Ce),jn.of=function(){return this(arguments)},jn.fromKeys=function(e){return this(r(e).keySeq())},jn.prototype.toString=function(){return this.__toString(\"Set {\",\"}\")},jn.prototype.has=function(e){return this._map.has(e)},jn.prototype.add=function(e){return Mn(this,this._map.set(e,!0))},jn.prototype.remove=function(e){return Mn(this,this._map.remove(e))},jn.prototype.clear=function(){return Mn(this,this._map.clear())},jn.prototype.union=function(){var t=e.call(arguments,0);return 0===(t=t.filter((function(e){return 0!==e.size}))).length?this:0!==this.size||this.__ownerID||1!==t.length?this.withMutations((function(e){for(var n=0;n<t.length;n++)a(t[n]).forEach((function(t){return e.add(t)}))})):this.constructor(t[0])},jn.prototype.intersect=function(){var t=e.call(arguments,0);if(0===t.length)return this;t=t.map((function(e){return a(e)}));var n=this;return this.withMutations((function(e){n.forEach((function(n){t.every((function(e){return e.includes(n)}))||e.remove(n)}))}))},jn.prototype.subtract=function(){var t=e.call(arguments,0);if(0===t.length)return this;t=t.map((function(e){return a(e)}));var n=this;return this.withMutations((function(e){n.forEach((function(n){t.some((function(e){return e.includes(n)}))&&e.remove(n)}))}))},jn.prototype.merge=function(){return this.union.apply(this,arguments)},jn.prototype.mergeWith=function(t){var n=e.call(arguments,1);return this.union.apply(this,n)},jn.prototype.sort=function(e){return Ln(pn(this,e))},jn.prototype.sortBy=function(e,t){return Ln(pn(this,t,e))},jn.prototype.wasAltered=function(){return this._map.wasAltered()},jn.prototype.__iterate=function(e,t){var n=this;return this._map.__iterate((function(t,r){return e(r,r,n)}),t)},jn.prototype.__iterator=function(e,t){return this._map.map((function(e,t){return t})).__iterator(e,t)},jn.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e);return e?this.__make(t,e):(this.__ownerID=e,this._map=t,this)},jn.isSet=Tn;var In,Pn=\"@@__IMMUTABLE_SET__@@\",Nn=jn.prototype;function Mn(e,t){return e.__ownerID?(e.size=t.size,e._map=t,e):t===e._map?e:0===t.size?e.__empty():e.__make(t)}function Rn(e,t){var n=Object.create(Nn);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function Dn(){return In||(In=Rn(ot()))}function Ln(e){return null==e?zn():Bn(e)?e:zn().withMutations((function(t){var n=a(e);Ve(n.size),n.forEach((function(e){return t.add(e)}))}))}function Bn(e){return Tn(e)&&l(e)}Nn[Pn]=!0,Nn[m]=Nn.remove,Nn.mergeDeep=Nn.merge,Nn.mergeDeepWith=Nn.mergeWith,Nn.withMutations=Ke.withMutations,Nn.asMutable=Ke.asMutable,Nn.asImmutable=Ke.asImmutable,Nn.__empty=Dn,Nn.__make=Rn,t(Ln,jn),Ln.of=function(){return this(arguments)},Ln.fromKeys=function(e){return this(r(e).keySeq())},Ln.prototype.toString=function(){return this.__toString(\"OrderedSet {\",\"}\")},Ln.isOrderedSet=Bn;var Fn,Un=Ln.prototype;function qn(e,t){var n=Object.create(Un);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function zn(){return Fn||(Fn=qn(Ht()))}function Vn(e){return null==e?Yn():Wn(e)?e:Yn().unshiftAll(e)}function Wn(e){return!(!e||!e[$n])}Un[d]=!0,Un.__empty=zn,Un.__make=qn,t(Vn,Se),Vn.of=function(){return this(arguments)},Vn.prototype.toString=function(){return this.__toString(\"Stack [\",\"]\")},Vn.prototype.get=function(e,t){var n=this._head;for(e=k(this,e);n&&e--;)n=n.next;return n?n.value:t},Vn.prototype.peek=function(){return this._head&&this._head.value},Vn.prototype.push=function(){if(0===arguments.length)return this;for(var e=this.size+arguments.length,t=this._head,n=arguments.length-1;n>=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):Kn(e,t)},Vn.prototype.pushAll=function(e){if(0===(e=o(e)).size)return this;Ve(e.size);var t=this.size,n=this._head;return e.reverse().forEach((function(e){t++,n={value:e,next:n}})),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):Kn(t,n)},Vn.prototype.pop=function(){return this.slice(1)},Vn.prototype.unshift=function(){return this.push.apply(this,arguments)},Vn.prototype.unshiftAll=function(e){return this.pushAll(e)},Vn.prototype.shift=function(){return this.pop.apply(this,arguments)},Vn.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Yn()},Vn.prototype.slice=function(e,t){if(j(e,t,this.size))return this;var n=T(e,this.size);if(I(t,this.size)!==this.size)return Se.prototype.slice.call(this,e,t);for(var r=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=r,this._head=o,this.__hash=void 0,this.__altered=!0,this):Kn(r,o)},Vn.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Kn(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Vn.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&!1!==e(r.value,n++,this);)r=r.next;return n},Vn.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new F((function(){if(r){var t=r.value;return r=r.next,U(e,n++,t)}return q()}))},Vn.isStack=Wn;var Hn,$n=\"@@__IMMUTABLE_STACK__@@\",Jn=Vn.prototype;function Kn(e,t,n,r){var o=Object.create(Jn);return o.size=e,o._head=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Yn(){return Hn||(Hn=Kn(0))}function Gn(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}Jn[$n]=!0,Jn.withMutations=Ke.withMutations,Jn.asMutable=Ke.asMutable,Jn.asImmutable=Ke.asImmutable,Jn.wasAltered=Ke.wasAltered,n.Iterator=F,Gn(n,{toArray:function(){Ve(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate((function(t,n){e[n]=t})),e},toIndexedSeq:function(){return new Kt(this)},toJS:function(){return this.toSeq().map((function(e){return e&&\"function\"==typeof e.toJS?e.toJS():e})).__toJS()},toJSON:function(){return this.toSeq().map((function(e){return e&&\"function\"==typeof e.toJSON?e.toJSON():e})).__toJS()},toKeyedSeq:function(){return new Jt(this,!0)},toMap:function(){return We(this.toKeyedSeq())},toObject:function(){Ve(this.size);var e={};return this.__iterate((function(t,n){e[n]=t})),e},toOrderedMap:function(){return zt(this.toKeyedSeq())},toOrderedSet:function(){return Ln(s(this)?this.valueSeq():this)},toSet:function(){return jn(s(this)?this.valueSeq():this)},toSetSeq:function(){return new Yt(this)},toSeq:function(){return u(this)?this.toIndexedSeq():s(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Vn(s(this)?this.valueSeq():this)},toList:function(){return St(s(this)?this.valueSeq():this)},toString:function(){return\"[Iterable]\"},__toString:function(e,t){return 0===this.size?e+t:e+\" \"+this.toSeq().map(this.__toStringMapper).join(\", \")+\" \"+t},concat:function(){return mn(this,sn(this,e.call(arguments,0)))},includes:function(e){return this.some((function(t){return ge(t,e)}))},entries:function(){return this.__iterator(R)},every:function(e,t){Ve(this.size);var n=!0;return this.__iterate((function(r,o,a){if(!e.call(t,r,o,a))return n=!1,!1})),n},filter:function(e,t){return mn(this,en(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},forEach:function(e,t){return Ve(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){Ve(this.size),e=void 0!==e?\"\"+e:\",\";var t=\"\",n=!0;return this.__iterate((function(r){n?n=!1:t+=e,t+=null!=r?r.toString():\"\"})),t},keys:function(){return this.__iterator(N)},map:function(e,t){return mn(this,Xt(this,e,t))},reduce:function(e,t,n){var r,o;return Ve(this.size),arguments.length<2?o=!0:r=t,this.__iterate((function(t,a,i){o?(o=!1,r=t):r=e.call(n,r,t,a,i)})),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return mn(this,Qt(this,!0))},slice:function(e,t){return mn(this,rn(this,e,t,!0))},some:function(e,t){return!this.every(tr(e),t)},sort:function(e){return mn(this,pn(this,e))},values:function(){return this.__iterator(M)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(e,t){return A(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return tn(this,e,t)},equals:function(e){return ye(this,e)},entrySeq:function(){var e=this;if(e._cache)return new te(e._cache);var t=e.toSeq().map(er).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(tr(e),t)},findEntry:function(e,t,n){var r=n;return this.__iterate((function(n,o,a){if(e.call(t,n,o,a))return r=[o,n],!1})),r},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(O)},flatMap:function(e,t){return mn(this,cn(this,e,t))},flatten:function(e){return mn(this,un(this,e,!0))},fromEntrySeq:function(){return new Gt(this)},get:function(e,t){return this.find((function(t,n){return ge(n,e)}),void 0,t)},getIn:function(e,t){for(var n,r=this,o=xn(e);!(n=o.next()).done;){var a=n.value;if((r=r&&r.get?r.get(a,b):b)===b)return t}return r},groupBy:function(e,t){return nn(this,e,t)},has:function(e){return this.get(e,b)!==b},hasIn:function(e){return this.getIn(e,b)!==b},isSubset:function(e){return e=\"function\"==typeof e.includes?e:n(e),this.every((function(t){return e.includes(t)}))},isSuperset:function(e){return(e=\"function\"==typeof e.isSubset?e:n(e)).isSubset(this)},keyOf:function(e){return this.findKey((function(t){return ge(t,e)}))},keySeq:function(){return this.toSeq().map(Qn).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return fn(this,e)},maxBy:function(e,t){return fn(this,t,e)},min:function(e){return fn(this,e?nr(e):ar)},minBy:function(e,t){return fn(this,t?nr(t):ar,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return mn(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return mn(this,an(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(tr(e),t)},sortBy:function(e,t){return mn(this,pn(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return mn(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return mn(this,on(this,e,t))},takeUntil:function(e,t){return this.takeWhile(tr(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=ir(this))}});var Zn=n.prototype;Zn[p]=!0,Zn[B]=Zn.values,Zn.__toJS=Zn.toArray,Zn.__toStringMapper=rr,Zn.inspect=Zn.toSource=function(){return this.toString()},Zn.chain=Zn.flatMap,Zn.contains=Zn.includes,Gn(r,{flip:function(){return mn(this,Zt(this))},mapEntries:function(e,t){var n=this,r=0;return mn(this,this.toSeq().map((function(o,a){return e.call(t,[a,o],r++,n)})).fromEntrySeq())},mapKeys:function(e,t){var n=this;return mn(this,this.toSeq().flip().map((function(r,o){return e.call(t,r,o,n)})).flip())}});var Xn=r.prototype;function Qn(e,t){return t}function er(e,t){return[t,e]}function tr(e){return function(){return!e.apply(this,arguments)}}function nr(e){return function(){return-e.apply(this,arguments)}}function rr(e){return\"string\"==typeof e?JSON.stringify(e):String(e)}function or(){return C(arguments)}function ar(e,t){return e<t?1:e>t?-1:0}function ir(e){if(e.size===1/0)return 0;var t=l(e),n=s(e),r=t?1:0;return sr(e.__iterate(n?t?function(e,t){r=31*r+ur(Oe(e),Oe(t))|0}:function(e,t){r=r+ur(Oe(e),Oe(t))|0}:t?function(e){r=31*r+Oe(e)|0}:function(e){r=r+Oe(e)|0}),r)}function sr(e,t){return t=Ae(t,3432918353),t=Ae(t<<15|t>>>-15,461845907),t=Ae(t<<13|t>>>-13,5),t=Ae((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=ke((t=Ae(t^t>>>13,3266489909))^t>>>16)}function ur(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}return Xn[f]=!0,Xn[B]=Zn.entries,Xn.__toJS=Zn.toObject,Xn.__toStringMapper=function(e,t){return JSON.stringify(t)+\": \"+rr(e)},Gn(o,{toKeyedSeq:function(){return new Jt(this,!1)},filter:function(e,t){return mn(this,en(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return mn(this,Qt(this,!1))},slice:function(e,t){return mn(this,rn(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=T(e,e<0?this.count():this.size);var r=this.slice(0,e);return mn(this,1===n?r:r.concat(C(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(e){return mn(this,un(this,e,!1))},get:function(e,t){return(e=k(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find((function(t,n){return n===e}),void 0,t)},has:function(e){return(e=k(this,e))>=0&&(void 0!==this.size?this.size===1/0||e<this.size:-1!==this.indexOf(e))},interpose:function(e){return mn(this,ln(this,e))},interleave:function(){var e=[this].concat(C(arguments)),t=dn(this.toSeq(),Y.of,e),n=t.flatten(!0);return t.size&&(n.size=t.size*e.length),mn(this,n)},keySeq:function(){return we(0,this.size)},last:function(){return this.get(-1)},skipWhile:function(e,t){return mn(this,an(this,e,t,!1))},zip:function(){return mn(this,dn(this,or,[this].concat(C(arguments))))},zipWith:function(e){var t=C(arguments);return t[0]=this,mn(this,dn(this,e,t))}}),o.prototype[h]=!0,o.prototype[d]=!0,Gn(a,{get:function(e,t){return this.has(e)?e:t},includes:function(e){return this.has(e)},keySeq:function(){return this.valueSeq()}}),a.prototype.has=Zn.includes,a.prototype.contains=a.prototype.includes,Gn(K,r.prototype),Gn(Y,o.prototype),Gn(G,a.prototype),Gn(Ee,r.prototype),Gn(Se,o.prototype),Gn(Ce,a.prototype),{Iterable:n,Seq:J,Collection:xe,Map:We,OrderedMap:zt,List:St,Stack:Vn,Set:jn,OrderedSet:Ln,Record:En,Range:we,Repeat:be,is:ge,fromJS:he}}()},function(e,t,n){e.exports=n(577)},function(e,t,n){var r=n(240);e.exports=function(e,t,n){return t in e?r(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(608)},function(e,t,n){\"use strict\";(function(e){n.d(t,\"z\",(function(){return ye})),n.d(t,\"i\",(function(){return be})),n.d(t,\"v\",(function(){return _e})),n.d(t,\"r\",(function(){return we})),n.d(t,\"t\",(function(){return xe})),n.d(t,\"s\",(function(){return Ee})),n.d(t,\"p\",(function(){return Se})),n.d(t,\"u\",(function(){return Ce})),n.d(t,\"x\",(function(){return Ae})),n.d(t,\"y\",(function(){return ke})),n.d(t,\"J\",(function(){return Oe})),n.d(t,\"f\",(function(){return je})),n.d(t,\"n\",(function(){return Te})),n.d(t,\"h\",(function(){return Ie})),n.d(t,\"D\",(function(){return Pe})),n.d(t,\"K\",(function(){return Me})),n.d(t,\"o\",(function(){return Ue})),n.d(t,\"C\",(function(){return qe})),n.d(t,\"a\",(function(){return ze})),n.d(t,\"H\",(function(){return Ve})),n.d(t,\"b\",(function(){return We})),n.d(t,\"G\",(function(){return He})),n.d(t,\"F\",(function(){return $e})),n.d(t,\"E\",(function(){return Je})),n.d(t,\"k\",(function(){return Ke})),n.d(t,\"d\",(function(){return Ye})),n.d(t,\"g\",(function(){return Ge})),n.d(t,\"m\",(function(){return Ze})),n.d(t,\"l\",(function(){return Xe})),n.d(t,\"e\",(function(){return Qe})),n.d(t,\"I\",(function(){return et})),n.d(t,\"w\",(function(){return tt})),n.d(t,\"A\",(function(){return nt})),n.d(t,\"B\",(function(){return rt})),n.d(t,\"j\",(function(){return ot})),n.d(t,\"c\",(function(){return at})),n.d(t,\"q\",(function(){return st}));var r=n(14),o=n.n(r),a=(n(13),n(18)),i=n.n(a),s=n(49),u=n.n(s),c=n(22),l=n.n(c),p=n(4),f=n.n(p),h=n(82),d=n.n(h),m=n(2),v=n.n(m),g=n(23),y=n.n(g),b=n(12),_=n.n(b),w=n(15),x=n.n(w),E=(n(36),n(29)),S=n.n(E),C=n(20),A=n.n(C),k=n(208),O=n.n(k),j=n(19),T=n.n(j),I=n(75),P=n.n(I),N=(n(31),n(32)),M=n.n(N),R=n(17),D=n.n(R),L=n(64),B=n.n(L),F=n(172),U=n.n(F),q=n(101),z=n.n(q),V=n(1),W=n.n(V),H=n(511),$=n(512),J=n.n($),K=n(284),Y=n.n(K),G=n(285),Z=n.n(G),X=n(209),Q=n.n(X),ee=n(346),te=n.n(ee),ne=n(123),re=n.n(ne),oe=n(124),ae=n.n(oe),ie=n(146),se=n(26),ue=n(514),ce=n.n(ue),le=n(149),pe=n(515),fe=n.n(pe),he=n(516),de=n.n(he),me=n(74),ve=\"default\",ge=function(e){return W.a.Iterable.isIterable(e)};function ye(e){return xe(e)?ge(e)?e.toJS():e:{}}function be(e){var t,n;if(ge(e))return e;if(e instanceof se.a.File)return e;if(!xe(e))return e;if(l()(e))return f()(n=W.a.Seq(e)).call(n,be).toList();if(ae()(d()(e))){var r,o=function(e){if(!ae()(d()(e)))return e;var t,n={},r=\"_**[]\",o={},a=u()(d()(e).call(e));try{for(a.s();!(t=a.n()).done;){var i=t.value;if(n[i[0]]||o[i[0]]&&o[i[0]].containsMultiple){var s,c,l,p;if(!o[i[0]])o[i[0]]={containsMultiple:!0,length:1},n[v()(l=v()(p=\"\".concat(i[0])).call(p,r)).call(l,o[i[0]].length)]=n[i[0]],delete n[i[0]];o[i[0]].length+=1,n[v()(s=v()(c=\"\".concat(i[0])).call(c,r)).call(s,o[i[0]].length)]=i[1]}else n[i[0]]=i[1]}}catch(e){a.e(e)}finally{a.f()}return n}(e);return f()(r=W.a.OrderedMap(o)).call(r,be)}return f()(t=W.a.OrderedMap(e)).call(t,be)}function _e(e){return l()(e)?e:[e]}function we(e){return\"function\"==typeof e}function xe(e){return!!e&&\"object\"===i()(e)}function Ee(e){return\"function\"==typeof e}function Se(e){return l()(e)}var Ce=Z.a;function Ae(e,t){var n;return S()(n=x()(e)).call(n,(function(n,r){return n[r]=t(e[r],r),n}),{})}function ke(e,t){var n;return S()(n=x()(e)).call(n,(function(n,r){var o=t(e[r],r);return o&&\"object\"===i()(o)&&A()(n,o),n}),{})}function Oe(e){return function(t){t.dispatch,t.getState;return function(t){return function(n){return\"function\"==typeof n?n(e()):t(n)}}}}function je(e){var t,n=e.keySeq();return n.contains(ve)?ve:O()(t=_()(n).call(n,(function(e){return\"2\"===(e+\"\")[0]}))).call(t).first()}function Te(e,t){if(!W.a.Iterable.isIterable(e))return W.a.List();var n=e.getIn(l()(t)?t:[t]);return W.a.List.isList(n)?n:W.a.List()}function Ie(e){var t,n=[/filename\\*=[^']+'\\w*'\"([^\"]+)\";?/i,/filename\\*=[^']+'\\w*'([^;]+);?/i,/filename=\"([^;]*);?\"/i,/filename=([^;]*);?/i];if(P()(n).call(n,(function(n){return null!==(t=n.exec(e))})),null!==t&&t.length>1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function Pe(e){return t=e.replace(/\\.[^./]*$/,\"\"),Y()(J()(t));var t}function Ne(e,t,n,r,a){if(!t)return[];var s=[],u=t.get(\"nullable\"),c=t.get(\"required\"),p=t.get(\"maximum\"),h=t.get(\"minimum\"),d=t.get(\"type\"),m=t.get(\"format\"),g=t.get(\"maxLength\"),b=t.get(\"minLength\"),w=t.get(\"uniqueItems\"),x=t.get(\"maxItems\"),E=t.get(\"minItems\"),S=t.get(\"pattern\"),C=n||!0===c,A=null!=e;if(u&&null===e||!d||!(C||A&&\"array\"===d||!(!C&&!A)))return[];var k=\"string\"===d&&e,O=\"array\"===d&&l()(e)&&e.length,j=\"array\"===d&&W.a.List.isList(e)&&e.count(),T=[k,O,j,\"array\"===d&&\"string\"==typeof e&&e,\"file\"===d&&e instanceof se.a.File,\"boolean\"===d&&(e||!1===e),\"number\"===d&&(e||0===e),\"integer\"===d&&(e||0===e),\"object\"===d&&\"object\"===i()(e)&&null!==e,\"object\"===d&&\"string\"==typeof e&&e],I=P()(T).call(T,(function(e){return!!e}));if(C&&!I&&!r)return s.push(\"Required field is not provided\"),s;if(\"object\"===d&&(null===a||\"application/json\"===a)){var N,M=e;if(\"string\"==typeof e)try{M=JSON.parse(e)}catch(e){return s.push(\"Parameter string value must be valid JSON\"),s}if(t&&t.has(\"required\")&&Ee(c.isList)&&c.isList()&&y()(c).call(c,(function(e){void 0===M[e]&&s.push({propKey:e,error:\"Required property not found\"})})),t&&t.has(\"properties\"))y()(N=t.get(\"properties\")).call(N,(function(e,t){var n=Ne(M[t],e,!1,r,a);s.push.apply(s,o()(f()(n).call(n,(function(e){return{propKey:t,error:e}}))))}))}if(S){var R=function(e,t){if(!new RegExp(t).test(e))return\"Value must follow pattern \"+t}(e,S);R&&s.push(R)}if(E&&\"array\"===d){var D=function(e,t){var n;if(!e&&t>=1||e&&e.length<t)return v()(n=\"Array must contain at least \".concat(t,\" item\")).call(n,1===t?\"\":\"s\")}(e,E);D&&s.push(D)}if(x&&\"array\"===d){var L=function(e,t){var n;if(e&&e.length>t)return v()(n=\"Array must not contain more then \".concat(t,\" item\")).call(n,1===t?\"\":\"s\")}(e,x);L&&s.push({needRemove:!0,error:L})}if(w&&\"array\"===d){var B=function(e,t){if(e&&(\"true\"===t||!0===t)){var n=Object(V.fromJS)(e),r=n.toSet();if(e.length>r.size){var o=Object(V.Set)();if(y()(n).call(n,(function(e,t){_()(n).call(n,(function(t){return Ee(t.equals)?t.equals(e):t===e})).size>1&&(o=o.add(t))})),0!==o.size)return f()(o).call(o,(function(e){return{index:e,error:\"No duplicates allowed.\"}})).toArray()}}}(e,w);B&&s.push.apply(s,o()(B))}if(g||0===g){var F=function(e,t){var n;if(e.length>t)return v()(n=\"Value must be no longer than \".concat(t,\" character\")).call(n,1!==t?\"s\":\"\")}(e,g);F&&s.push(F)}if(b){var U=function(e,t){var n;if(e.length<t)return v()(n=\"Value must be at least \".concat(t,\" character\")).call(n,1!==t?\"s\":\"\")}(e,b);U&&s.push(U)}if(p||0===p){var q=function(e,t){if(e>t)return\"Value must be less than \".concat(t)}(e,p);q&&s.push(q)}if(h||0===h){var z=function(e,t){if(e<t)return\"Value must be greater than \".concat(t)}(e,h);z&&s.push(z)}if(\"string\"===d){var H;if(!(H=\"date-time\"===m?function(e){if(isNaN(Date.parse(e)))return\"Value must be a DateTime\"}(e):\"uuid\"===m?function(e){if(e=e.toString().toLowerCase(),!/^[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[)}]?$/.test(e))return\"Value must be a Guid\"}(e):function(e){if(e&&\"string\"!=typeof e)return\"Value must be a string\"}(e)))return s;s.push(H)}else if(\"boolean\"===d){var $=function(e){if(\"true\"!==e&&\"false\"!==e&&!0!==e&&!1!==e)return\"Value must be a boolean\"}(e);if(!$)return s;s.push($)}else if(\"number\"===d){var J=function(e){if(!/^-?\\d+(\\.?\\d+)?$/.test(e))return\"Value must be a number\"}(e);if(!J)return s;s.push(J)}else if(\"integer\"===d){var K=function(e){if(!/^-?\\d+$/.test(e))return\"Value must be an integer\"}(e);if(!K)return s;s.push(K)}else if(\"array\"===d){if(!O&&!j)return s;e&&y()(e).call(e,(function(e,n){var i=Ne(e,t.get(\"items\"),!1,r,a);s.push.apply(s,o()(f()(i).call(i,(function(e){return{index:n,error:e}}))))}))}else if(\"file\"===d){var Y=function(e){if(e&&!(e instanceof se.a.File))return\"Value must be a file\"}(e);if(!Y)return s;s.push(Y)}return s}var Me=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,o=void 0!==r&&r,a=n.bypassRequiredCheck,i=void 0!==a&&a,s=e.get(\"required\"),u=Object(le.a)(e,{isOAS3:o}),c=u.schema,l=u.parameterContentMediaType;return Ne(t,c,s,i,l)},Re=function(e,t,n){if(e&&(!e.xml||!e.xml.name)){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n\\x3c!-- XML example cannot be generated; root element name is undefined --\\x3e':null;var r=e.$$ref.match(/\\S*\\/(\\S+)$/);e.xml.name=r[1]}return Object(ie.memoizedCreateXMLExample)(e,t,n)},De=[{when:/json/,shouldStringifyTypes:[\"string\"]}],Le=[\"object\"],Be=function(e,t,n,r){var a=Object(ie.memoizedSampleFromSchema)(e,t,r),s=i()(a),u=S()(De).call(De,(function(e,t){var r;return t.when.test(n)?v()(r=[]).call(r,o()(e),o()(t.shouldStringifyTypes)):e}),Le);return te()(u,(function(e){return e===s}))?M()(a,null,2):a},Fe=function(e,t,n,r){var o,a=Be(e,t,n,r);try{\"\\n\"===(o=me.a.dump(me.a.load(a),{lineWidth:-1}))[o.length-1]&&(o=T()(o).call(o,0,o.length-1))}catch(e){return console.error(e),\"error: could not generate yaml example\"}return o.replace(/\\t/g,\"  \")},Ue=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return e&&Ee(e.toJS)&&(e=e.toJS()),r&&Ee(r.toJS)&&(r=r.toJS()),/xml/.test(t)?Re(e,n,r):/(yaml|yml)/.test(t)?Fe(e,n,t,r):Be(e,n,t,r)},qe=function(){var e={},t=se.a.location.search;if(!t)return{};if(\"\"!=t){var n=t.substr(1).split(\"&\");for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(r=n[r].split(\"=\"),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||\"\")}return e},ze=function(t){return(t instanceof e?t:e.from(t.toString(),\"utf-8\")).toString(\"base64\")},Ve={operationsSorter:{alpha:function(e,t){return e.get(\"path\").localeCompare(t.get(\"path\"))},method:function(e,t){return e.get(\"method\").localeCompare(t.get(\"method\"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},We=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&\"\"!==r&&t.push([n,\"=\",encodeURIComponent(r).replace(/%20/g,\"+\")].join(\"\"))}return t.join(\"&\")},He=function(e,t,n){return!!Q()(n,(function(n){return re()(e[n],t[n])}))};function $e(e){return\"string\"!=typeof e||\"\"===e?\"\":Object(H.sanitizeUrl)(e)}function Je(e){return!(!e||D()(e).call(e,\"localhost\")>=0||D()(e).call(e,\"127.0.0.1\")>=0||\"none\"===e)}function Ke(e){if(!W.a.OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=B()(e).call(e,(function(e,t){return U()(t).call(t,\"2\")&&x()(e.get(\"content\")||{}).length>0})),n=e.get(\"default\")||W.a.OrderedMap(),r=(n.get(\"content\")||W.a.OrderedMap()).keySeq().toJS().length?n:null;return t||r}var Ye=function(e){return\"string\"==typeof e||e instanceof String?z()(e).call(e).replace(/\\s/g,\"%20\"):\"\"},Ge=function(e){return ce()(Ye(e).replace(/%20/g,\"_\"))},Ze=function(e){return _()(e).call(e,(function(e,t){return/^x-/.test(t)}))},Xe=function(e){return _()(e).call(e,(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)}))};function Qe(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if(\"object\"!==i()(e)||l()(e)||null===e||!t)return e;var o=A()({},e);return y()(n=x()(o)).call(n,(function(e){e===t&&r(o[e],e)?delete o[e]:o[e]=Qe(o[e],t,r)})),o}function et(e){if(\"string\"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),\"object\"===i()(e)&&null!==e)try{return M()(e,null,2)}catch(t){return String(e)}return null==e?\"\":e.toString()}function tt(e){return\"number\"==typeof e?e.toString():e}function nt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,o=t.allowHashes,a=void 0===o||o;if(!W.a.Map.isMap(e))throw new Error(\"paramToIdentifier: received a non-Im.Map parameter as input\");var i,s,u,c=e.get(\"name\"),l=e.get(\"in\"),p=[];e&&e.hashCode&&l&&c&&a&&p.push(v()(i=v()(s=\"\".concat(l,\".\")).call(s,c,\".hash-\")).call(i,e.hashCode()));l&&c&&p.push(v()(u=\"\".concat(l,\".\")).call(u,c));return p.push(c),r?p:p[0]||\"\"}function rt(e,t){var n,r=nt(e,{returnAll:!0});return _()(n=f()(r).call(r,(function(e){return t[e]}))).call(n,(function(e){return void 0!==e}))[0]}function ot(){return it(fe()(32).toString(\"base64\"))}function at(e){return it(de()(\"sha256\").update(e).digest(\"base64\"))}function it(e){return e.replace(/\\+/g,\"-\").replace(/\\//g,\"_\").replace(/=/g,\"\")}var st=function(e){return!e||!(!ge(e)||!e.isEmpty())}}).call(this,n(73).Buffer)},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(240);function o(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),r(e,o.key,o)}}e.exports=function(e,t,n){return t&&o(e.prototype,t),n&&o(e,n),e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(899),o=n(903);e.exports=function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=r(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&o(e,t)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(466),o=n(910),a=n(915),i=n(916);e.exports=function(e){var t=a();return function(){var n,a=o(e);if(t){var s=o(this).constructor;n=r(a,arguments,s)}else n=a.apply(this,arguments);return i(this,n)}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(994)()},function(e,t,n){e.exports=n(580)},function(e,t,n){var r=n(399),o=n(641),a=n(185),i=n(400);e.exports=function(e,t){return r(e)||o(e,t)||a(e,t)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(632),o=n(392),a=n(185),i=n(640);e.exports=function(e){return r(e)||o(e)||a(e)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(583)},function(e,t,n){\"use strict\";function r(e,t){return e===t}function o(e,t,n){if(null===t||null===n||t.length!==n.length)return!1;for(var r=t.length,o=0;o<r;o++)if(!e(t[o],n[o]))return!1;return!0}function a(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return\"function\"==typeof e}))){var n=t.map((function(e){return typeof e})).join(\", \");throw new Error(\"Selector creators expect all input-selectors to be functions, instead received the following types: [\"+n+\"]\")}return t}n.d(t,\"a\",(function(){return i}));var i=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return function(){for(var t=arguments.length,r=Array(t),o=0;o<t;o++)r[o]=arguments[o];var i=0,s=r.pop(),u=a(r),c=e.apply(void 0,[function(){return i++,s.apply(null,arguments)}].concat(n)),l=e((function(){for(var e=[],t=u.length,n=0;n<t;n++)e.push(u[n].apply(null,arguments));return c.apply(null,e)}));return l.resultFunc=s,l.dependencies=u,l.recomputations=function(){return i},l.resetRecomputations=function(){return i=0},l}}((function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r,n=null,a=null;return function(){return o(t,n,arguments)||(a=e.apply(null,arguments)),n=arguments,a}}))},function(e,t,n){e.exports=n(668)},function(e,t,n){var r=n(175),o=n(572);function a(t){return\"function\"==typeof r&&\"symbol\"==typeof o?(e.exports=a=function(e){return typeof e},e.exports.default=e.exports,e.exports.__esModule=!0):(e.exports=a=function(e){return e&&\"function\"==typeof r&&e.constructor===r&&e!==r.prototype?\"symbol\":typeof e},e.exports.default=e.exports,e.exports.__esModule=!0),a(t)}e.exports=a,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(598)},function(e,t,n){e.exports=n(596)},function(e,t,n){\"use strict\";var r=n(40),o=n(127).f,a=n(362),i=n(34),s=n(107),u=n(67),c=n(55),l=function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t};e.exports=function(e,t){var n,p,f,h,d,m,v,g,y=e.target,b=e.global,_=e.stat,w=e.proto,x=b?r:_?r[y]:(r[y]||{}).prototype,E=b?i:i[y]||(i[y]={}),S=E.prototype;for(f in t)n=!a(b?f:y+(_?\".\":\"#\")+f,e.forced)&&x&&c(x,f),d=E[f],n&&(m=e.noTargetGet?(g=o(x,f))&&g.value:x[f]),h=n&&m?m:t[f],n&&typeof d==typeof h||(v=e.bind&&n?s(h,r):e.wrap&&n?l(h):w&&\"function\"==typeof h?s(Function.call,h):h,(e.sham||h&&h.sham||d&&d.sham)&&u(v,\"sham\",!0),E[f]=v,w&&(c(i,p=y+\"Prototype\")||u(i,p,{}),i[p][f]=h,e.real&&S&&!S[f]&&u(S,f,h)))}},function(e,t,n){e.exports=n(601)},function(e,t,n){e.exports=n(401)},function(e,t,n){var r=n(448),o=n(449),a=n(854),i=n(856),s=n(860),u=n(862),c=n(867),l=n(240),p=n(3);function f(e,t){var n=r(e);if(o){var s=o(e);t&&(s=a(s).call(s,(function(t){return i(e,t).enumerable}))),n.push.apply(n,s)}return n}e.exports=function(e){for(var t=1;t<arguments.length;t++){var n,r=null!=arguments[t]?arguments[t]:{};if(t%2)s(n=f(Object(r),!0)).call(n,(function(t){p(e,t,r[t])}));else if(u)c(e,u(r));else{var o;s(o=f(Object(r))).call(o,(function(t){l(e,t,i(r,t))}))}}return e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var u;if(void 0===t)u=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[n,r,o,a,i,s],l=0;(u=new Error(t.replace(/%s/g,(function(){return c[l++]})))).name=\"Invariant Violation\"}throw u.framesToPop=1,u}}},function(e,t,n){\"use strict\";t.a=function(){var e={location:{},history:{},open:function(){},close:function(){},File:function(){}};if(\"undefined\"==typeof window)return e;try{e=window;for(var t=0,n=[\"File\",\"Blob\",\"FormData\"];t<n.length;t++){var r=n[t];r in window&&(e[r]=window[r])}}catch(e){console.error(e)}return e}()},function(e,t,n){\"use strict\";var r,o=n(1),a=\"<<anonymous>>\",i=function(){invariant(!1,\"ImmutablePropTypes type checking code is stripped in production.\")};i.isRequired=i;var s=function(){return i};function u(e){var t=typeof e;return Array.isArray(e)?\"array\":e instanceof RegExp?\"object\":e instanceof o.Iterable?\"Immutable.\"+e.toSource().split(\" \")[0]:t}function c(e){function t(t,n,r,o,i,s){for(var u=arguments.length,c=Array(u>6?u-6:0),l=6;l<u;l++)c[l-6]=arguments[l];if(s=s||r,o=o||a,null!=n[r])return e.apply(void 0,[n,r,o,i,s].concat(c));var p=i;return t?new Error(\"Required \"+p+\" `\"+s+\"` was not specified in `\"+o+\"`.\"):void 0}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}function l(e,t){return n=\"Iterable.\"+e,r=function(e){return o.Iterable.isIterable(e)&&t(e)},c((function(e,t,o,a,i){var s=e[t];if(!r(s)){var c=u(s);return new Error(\"Invalid \"+a+\" `\"+i+\"` of type `\"+c+\"` supplied to `\"+o+\"`, expected `\"+n+\"`.\")}return null}));var n,r}(r={listOf:s,mapOf:s,orderedMapOf:s,setOf:s,orderedSetOf:s,stackOf:s,iterableOf:s,recordOf:s,shape:s,contains:s,mapContains:s,orderedMapContains:s,list:i,map:i,orderedMap:i,set:i,orderedSet:i,stack:i,seq:i,record:i,iterable:i}).iterable.indexed=l(\"Indexed\",o.Iterable.isIndexed),r.iterable.keyed=l(\"Keyed\",o.Iterable.isKeyed),e.exports=r},function(e,t,n){var r=n(897);function o(){return e.exports=o=r||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},e.exports.default=e.exports,e.exports.__esModule=!0,o.apply(this,arguments)}e.exports=o,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(603)},function(e,t,n){\"use strict\";e.exports=function(e){for(var t=arguments.length-1,n=\"Minified React error #\"+e+\"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=\"+e,r=0;r<t;r++)n+=\"&args[]=\"+encodeURIComponent(arguments[r+1]);n+=\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\";var o=new Error(n);throw o.name=\"Invariant Violation\",o.framesToPop=1,o}},function(e,t,n){e.exports=n(661)},function(e,t,n){e.exports=n(585)},function(e,t,n){\"use strict\";var r=n(79);e.exports=r},function(e,t){e.exports={}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"isOAS3\",(function(){return c})),n.d(t,\"isSwagger2\",(function(){return l})),n.d(t,\"OAS3ComponentWrapFactory\",(function(){return p}));var r=n(28),o=n.n(r),a=n(172),i=n.n(a),s=n(0),u=n.n(s);function c(e){var t=e.get(\"openapi\");return\"string\"==typeof t&&(i()(t).call(t,\"3.0.\")&&t.length>4)}function l(e){var t=e.get(\"swagger\");return\"string\"==typeof t&&i()(t).call(t,\"2.0\")}function p(e){return function(t,n){return function(r){return n&&n.specSelectors&&n.specSelectors.specJson?c(n.specSelectors.specJson())?u.a.createElement(e,o()({},r,n,{Ori:t})):u.a.createElement(t,r):(console.warn(\"OAS3 wrapper: couldn't get spec\"),null)}}}},function(e,t,n){e.exports=n(592)},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){\"use strict\";var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;function i(e){if(null==e)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String(\"abc\");if(e[5]=\"de\",\"5\"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t[\"_\"+String.fromCharCode(n)]=n;if(\"0123456789\"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(\"\"))return!1;var r={};return\"abcdefghijklmnopqrst\".split(\"\").forEach((function(e){r[e]=e})),\"abcdefghijklmnopqrst\"===Object.keys(Object.assign({},r)).join(\"\")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,u=i(e),c=1;c<arguments.length;c++){for(var l in n=Object(arguments[c]))o.call(n,l)&&(u[l]=n[l]);if(r){s=r(n);for(var p=0;p<s.length;p++)a.call(n,s[p])&&(u[s[p]]=n[s[p]])}}return u}},function(e,t,n){e.exports=n(885)},function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n(\"object\"==typeof globalThis&&globalThis)||n(\"object\"==typeof window&&window)||n(\"object\"==typeof self&&self)||n(\"object\"==typeof t&&t)||function(){return this}()||Function(\"return this\")()}).call(this,n(51))},function(e,t,n){var r=n(40),o=n(227),a=n(55),i=n(179),s=n(229),u=n(363),c=o(\"wks\"),l=r.Symbol,p=u?l:l&&l.withoutSetter||i;e.exports=function(e){return a(c,e)&&(s||\"string\"==typeof c[e])||(s&&a(l,e)?c[e]=l[e]:c[e]=p(\"Symbol.\"+e)),c[e]}},function(e,t,n){var r=n(34);e.exports=function(e){return r[e+\"Prototype\"]}},function(e,t,n){var r=n(196);e.exports=function(e,t,n){var o=null==e?void 0:r(e,t);return void 0===o?n:o}},function(e,t,n){var r=n(34),o=n(55),a=n(236),i=n(68).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});o(t,e)||i(t,e,{value:a.f(e)})}},function(e,t,n){\"use strict\";var r=n(30),o=n(140),a=n(467),i=(n(25),o.ID_ATTRIBUTE_NAME),s=a,u=\"__reactInternalInstance$\"+Math.random().toString(36).slice(2);function c(e,t){return 1===e.nodeType&&e.getAttribute(i)===String(t)||8===e.nodeType&&e.nodeValue===\" react-text: \"+t+\" \"||8===e.nodeType&&e.nodeValue===\" react-empty: \"+t+\" \"}function l(e){for(var t;t=e._renderedComponent;)e=t;return e}function p(e,t){var n=l(e);n._hostNode=t,t[u]=n}function f(e,t){if(!(e._flags&s.hasCachedChildNodes)){var n=e._renderedChildren,o=t.firstChild;e:for(var a in n)if(n.hasOwnProperty(a)){var i=n[a],u=l(i)._domID;if(0!==u){for(;null!==o;o=o.nextSibling)if(c(o,u)){p(i,o);continue e}r(\"32\",u)}}e._flags|=s.hasCachedChildNodes}}function h(e){if(e[u])return e[u];for(var t,n,r=[];!e[u];){if(r.push(e),!e.parentNode)return null;e=e.parentNode}for(;e&&(n=e[u]);e=r.pop())t=n,r.length&&f(n,e);return t}var d={getClosestInstanceFromNode:h,getInstanceFromNode:function(e){var t=h(e);return null!=t&&t._hostNode===e?t:null},getNodeFromInstance:function(e){if(void 0===e._hostNode&&r(\"33\"),e._hostNode)return e._hostNode;for(var t=[];!e._hostNode;)t.push(e),e._hostParent||r(\"34\"),e=e._hostParent;for(;t.length;e=t.pop())f(e,e._hostNode);return e._hostNode},precacheChildNodes:f,precacheNode:p,uncacheNode:function(e){var t=e._hostNode;t&&(delete t[u],e._hostNode=null)}};e.exports=d},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_SPEC\",(function(){return ee})),n.d(t,\"UPDATE_URL\",(function(){return te})),n.d(t,\"UPDATE_JSON\",(function(){return ne})),n.d(t,\"UPDATE_PARAM\",(function(){return re})),n.d(t,\"UPDATE_EMPTY_PARAM_INCLUSION\",(function(){return oe})),n.d(t,\"VALIDATE_PARAMS\",(function(){return ae})),n.d(t,\"SET_RESPONSE\",(function(){return ie})),n.d(t,\"SET_REQUEST\",(function(){return se})),n.d(t,\"SET_MUTATED_REQUEST\",(function(){return ue})),n.d(t,\"LOG_REQUEST\",(function(){return ce})),n.d(t,\"CLEAR_RESPONSE\",(function(){return le})),n.d(t,\"CLEAR_REQUEST\",(function(){return pe})),n.d(t,\"CLEAR_VALIDATE_PARAMS\",(function(){return fe})),n.d(t,\"UPDATE_OPERATION_META_VALUE\",(function(){return he})),n.d(t,\"UPDATE_RESOLVED\",(function(){return de})),n.d(t,\"UPDATE_RESOLVED_SUBTREE\",(function(){return me})),n.d(t,\"SET_SCHEME\",(function(){return ve})),n.d(t,\"updateSpec\",(function(){return ge})),n.d(t,\"updateResolved\",(function(){return ye})),n.d(t,\"updateUrl\",(function(){return be})),n.d(t,\"updateJsonSpec\",(function(){return _e})),n.d(t,\"parseToJson\",(function(){return we})),n.d(t,\"resolveSpec\",(function(){return Ee})),n.d(t,\"requestResolvedSubtree\",(function(){return Ae})),n.d(t,\"changeParam\",(function(){return ke})),n.d(t,\"changeParamByIdentity\",(function(){return Oe})),n.d(t,\"updateResolvedSubtree\",(function(){return je})),n.d(t,\"invalidateResolvedSubtreeCache\",(function(){return Te})),n.d(t,\"validateParams\",(function(){return Ie})),n.d(t,\"updateEmptyParamInclusion\",(function(){return Pe})),n.d(t,\"clearValidateParams\",(function(){return Ne})),n.d(t,\"changeConsumesValue\",(function(){return Me})),n.d(t,\"changeProducesValue\",(function(){return Re})),n.d(t,\"setResponse\",(function(){return De})),n.d(t,\"setRequest\",(function(){return Le})),n.d(t,\"setMutatedRequest\",(function(){return Be})),n.d(t,\"logRequest\",(function(){return Fe})),n.d(t,\"executeRequest\",(function(){return Ue})),n.d(t,\"execute\",(function(){return qe})),n.d(t,\"clearResponse\",(function(){return ze})),n.d(t,\"clearRequest\",(function(){return Ve})),n.d(t,\"setScheme\",(function(){return We}));var r=n(24),o=n.n(r),a=n(53),i=n.n(a),s=n(76),u=n.n(s),c=n(18),l=n.n(c),p=n(39),f=n.n(p),h=n(22),d=n.n(h),m=n(4),v=n.n(m),g=n(348),y=n.n(g),b=n(29),_=n.n(b),w=n(210),x=n.n(w),E=n(65),S=n.n(E),C=n(12),A=n.n(C),k=n(211),O=n.n(k),j=n(17),T=n.n(j),I=n(23),P=n.n(I),N=n(2),M=n.n(N),R=n(15),D=n.n(R),L=n(20),B=n.n(L),F=n(349),U=n.n(F),q=n(74),z=n(1),V=n(94),W=n.n(V),H=n(145),$=n(212),J=n.n($),K=n(518),Y=n.n(K),G=n(350),Z=n.n(G),X=n(5),Q=[\"path\",\"method\"],ee=\"spec_update_spec\",te=\"spec_update_url\",ne=\"spec_update_json\",re=\"spec_update_param\",oe=\"spec_update_empty_param_inclusion\",ae=\"spec_validate_param\",ie=\"spec_set_response\",se=\"spec_set_request\",ue=\"spec_set_mutated_request\",ce=\"spec_log_request\",le=\"spec_clear_response\",pe=\"spec_clear_request\",fe=\"spec_clear_validate_param\",he=\"spec_update_operation_meta_value\",de=\"spec_update_resolved\",me=\"spec_update_resolved_subtree\",ve=\"set_scheme\";function ge(e){var t,n=(t=e,J()(t)?t:\"\").replace(/\\t/g,\"  \");if(\"string\"==typeof e)return{type:ee,payload:n}}function ye(e){return{type:de,payload:e}}function be(e){return{type:te,payload:e}}function _e(e){return{type:ne,payload:e}}var we=function(e){return function(t){var n=t.specActions,r=t.specSelectors,o=t.errActions,a=r.specStr,i=null;try{e=e||a(),o.clear({source:\"parser\"}),i=q.a.load(e)}catch(e){return console.error(e),o.newSpecErr({source:\"parser\",level:\"error\",message:e.reason,line:e.mark&&e.mark.line?e.mark.line+1:void 0})}return i&&\"object\"===l()(i)?n.updateJsonSpec(i):{}}},xe=!1,Ee=function(e,t){return function(n){var r=n.specActions,o=n.specSelectors,a=n.errActions,i=n.fn,s=i.fetch,u=i.resolve,c=i.AST,l=void 0===c?{}:c,p=n.getConfigs;xe||(console.warn(\"specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!\"),xe=!0);var f=p(),h=f.modelPropertyMacro,m=f.parameterMacro,g=f.requestInterceptor,b=f.responseInterceptor;void 0===e&&(e=o.specJson()),void 0===t&&(t=o.url());var _=l.getLineNumberForPath?l.getLineNumberForPath:function(){},w=o.specStr();return u({fetch:s,spec:e,baseDoc:t,modelPropertyMacro:h,parameterMacro:m,requestInterceptor:g,responseInterceptor:b}).then((function(e){var t=e.spec,n=e.errors;if(a.clear({type:\"thrown\"}),d()(n)&&n.length>0){var o=v()(n).call(n,(function(e){return console.error(e),e.line=e.fullPath?_(w,e.fullPath):null,e.path=e.fullPath?e.fullPath.join(\".\"):null,e.level=\"error\",e.type=\"thrown\",e.source=\"resolver\",y()(e,\"message\",{enumerable:!0,value:e.message}),e}));a.newThrownErrBatch(o)}return r.updateResolved(t)}))}},Se=[],Ce=Y()(u()(f.a.mark((function e(){var t,n,r,o,a,i,s,c,l,p,h,m,g,b,w,E,C,k;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Se.system){e.next=4;break}return console.error(\"debResolveSubtrees: don't have a system to operate on, aborting.\"),e.abrupt(\"return\");case 4:if(n=t.errActions,r=t.errSelectors,o=t.fn,a=o.resolveSubtree,i=o.fetch,s=o.AST,c=void 0===s?{}:s,l=t.specSelectors,p=t.specActions,a){e.next=8;break}return console.error(\"Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing.\"),e.abrupt(\"return\");case 8:return h=c.getLineNumberForPath?c.getLineNumberForPath:function(){},m=l.specStr(),g=t.getConfigs(),b=g.modelPropertyMacro,w=g.parameterMacro,E=g.requestInterceptor,C=g.responseInterceptor,e.prev=11,e.next=14,_()(Se).call(Se,function(){var e=u()(f.a.mark((function e(t,o){var s,c,p,g,_,k,j,T,I;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return s=e.sent,c=s.resultMap,p=s.specWithCurrentSubtrees,e.next=7,a(p,o,{baseDoc:l.url(),modelPropertyMacro:b,parameterMacro:w,requestInterceptor:E,responseInterceptor:C});case 7:if(g=e.sent,_=g.errors,k=g.spec,r.allErrors().size&&n.clearBy((function(e){var t;return\"thrown\"!==e.get(\"type\")||\"resolver\"!==e.get(\"source\")||!x()(t=e.get(\"fullPath\")).call(t,(function(e,t){return e===o[t]||void 0===o[t]}))})),d()(_)&&_.length>0&&(j=v()(_).call(_,(function(e){return e.line=e.fullPath?h(m,e.fullPath):null,e.path=e.fullPath?e.fullPath.join(\".\"):null,e.level=\"error\",e.type=\"thrown\",e.source=\"resolver\",y()(e,\"message\",{enumerable:!0,value:e.message}),e})),n.newThrownErrBatch(j)),!k||!l.isOAS3()||\"components\"!==o[0]||\"securitySchemes\"!==o[1]){e.next=15;break}return e.next=15,S.a.all(v()(T=A()(I=O()(k)).call(I,(function(e){return\"openIdConnect\"===e.type}))).call(T,function(){var e=u()(f.a.mark((function e(t){var n,r;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={url:t.openIdConnectUrl,requestInterceptor:E,responseInterceptor:C},e.prev=1,e.next=4,i(n);case 4:(r=e.sent)instanceof Error||r.status>=400?console.error(r.statusText+\" \"+n.url):t.openIdConnectData=JSON.parse(r.text),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(1),console.error(e.t0);case 11:case\"end\":return e.stop()}}),e,null,[[1,8]])})));return function(t){return e.apply(this,arguments)}}()));case 15:return Z()(c,o,k),Z()(p,o,k),e.abrupt(\"return\",{resultMap:c,specWithCurrentSubtrees:p});case 18:case\"end\":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),S.a.resolve({resultMap:(l.specResolvedSubtree([])||Object(z.Map)()).toJS(),specWithCurrentSubtrees:l.specJson().toJS()}));case 14:k=e.sent,delete Se.system,Se=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:p.updateResolvedSubtree([],k.resultMap);case 23:case\"end\":return e.stop()}}),e,null,[[11,19]])}))),35),Ae=function(e){return function(t){var n;T()(n=v()(Se).call(Se,(function(e){return e.join(\"@@\")}))).call(n,e.join(\"@@\"))>-1||(Se.push(e),Se.system=t,Ce())}};function ke(e,t,n,r,o){return{type:re,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:o}}}function Oe(e,t,n,r){return{type:re,payload:{path:e,param:t,value:n,isXml:r}}}var je=function(e,t){return{type:me,payload:{path:e,value:t}}},Te=function(){return{type:me,payload:{path:[],value:Object(z.Map)()}}},Ie=function(e,t){return{type:ae,payload:{pathMethod:e,isOAS3:t}}},Pe=function(e,t,n,r){return{type:oe,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};function Ne(e){return{type:fe,payload:{pathMethod:e}}}function Me(e,t){return{type:he,payload:{path:e,value:t,key:\"consumes_value\"}}}function Re(e,t){return{type:he,payload:{path:e,value:t,key:\"produces_value\"}}}var De=function(e,t,n){return{payload:{path:e,method:t,res:n},type:ie}},Le=function(e,t,n){return{payload:{path:e,method:t,req:n},type:se}},Be=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ue}},Fe=function(e){return{payload:e,type:ce}},Ue=function(e){return function(t){var n,r,o=t.fn,a=t.specActions,i=t.specSelectors,s=t.getConfigs,c=t.oas3Selectors,l=e.pathName,p=e.method,h=e.operation,m=s(),g=m.requestInterceptor,y=m.responseInterceptor,b=h.toJS();h&&h.get(\"parameters\")&&P()(n=A()(r=h.get(\"parameters\")).call(r,(function(e){return e&&!0===e.get(\"allowEmptyValue\")}))).call(n,(function(t){if(i.parameterInclusionSettingFor([l,p],t.get(\"name\"),t.get(\"in\"))){e.parameters=e.parameters||{};var n=Object(X.B)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get(\"name\")]=\"\")}}));if(e.contextUrl=W()(i.url()).toString(),b&&b.operationId?e.operationId=b.operationId:b&&l&&p&&(e.operationId=o.opId(b,l,p)),i.isOAS3()){var _,w=M()(_=\"\".concat(l,\":\")).call(_,p);e.server=c.selectedServer(w)||c.selectedServer();var x=c.serverVariables({server:e.server,namespace:w}).toJS(),E=c.serverVariables({server:e.server}).toJS();e.serverVariables=D()(x).length?x:E,e.requestContentType=c.requestContentType(l,p),e.responseContentType=c.responseContentType(l,p)||\"*/*\";var S,C=c.requestBodyValue(l,p),k=c.requestBodyInclusionSetting(l,p);if(C&&C.toJS)e.requestBody=A()(S=v()(C).call(C,(function(e){return z.Map.isMap(e)?e.get(\"value\"):e}))).call(S,(function(e,t){return(d()(e)?0!==e.length:!Object(X.q)(e))||k.get(t)})).toJS();else e.requestBody=C}var O=B()({},e);O=o.buildRequest(O),a.setRequest(e.pathName,e.method,O);var j=function(){var t=u()(f.a.mark((function t(n){var r,o;return f.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,g.apply(undefined,[n]);case 2:return r=t.sent,o=B()({},r),a.setMutatedRequest(e.pathName,e.method,o),t.abrupt(\"return\",r);case 6:case\"end\":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();e.requestInterceptor=j,e.responseInterceptor=y;var T=U()();return o.execute(e).then((function(t){t.duration=U()()-T,a.setResponse(e.pathName,e.method,t)})).catch((function(t){\"Failed to fetch\"===t.message&&(t.name=\"\",t.message='**Failed to fetch.**  \\n**Possible Reasons:** \\n  - CORS \\n  - Network Failure \\n  - URL scheme must be \"http\" or \"https\" for CORS request.'),a.setResponse(e.pathName,e.method,{error:!0,err:Object(H.serializeError)(t)})}))}},qe=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=i()(e,Q);return function(e){var a=e.fn.fetch,i=e.specSelectors,s=e.specActions,u=i.specJsonWithResolvedSubtrees().toJS(),c=i.operationScheme(t,n),l=i.contentTypeValues([t,n]).toJS(),p=l.requestContentType,f=l.responseContentType,h=/xml/i.test(p),d=i.parameterValues([t,n],h).toJS();return s.executeRequest(o()(o()({},r),{},{fetch:a,spec:u,pathName:t,method:n,parameters:d,requestContentType:p,scheme:c,responseContentType:f}))}};function ze(e,t){return{type:le,payload:{path:e,method:t}}}function Ve(e,t){return{type:pe,payload:{path:e,method:t}}}function We(e,t,n){return{type:ve,payload:{scheme:e,path:t,method:n}}}},function(e,t){e.exports=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e}},function(e,t,n){var r=n(37);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){var r=n(175),o=n(243),a=n(242),i=n(185);e.exports=function(e,t){var n=void 0!==r&&o(e)||e[\"@@iterator\"];if(!n){if(a(e)||(n=i(e))||t&&e&&\"number\"==typeof e.length){n&&(e=n);var s=0,u=function(){};return{s:u,n:function(){return s>=e.length?{done:!0}:{done:!1,value:e[s++]}},e:function(e){throw e},f:u}}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 c,l=!0,p=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return l=e.done,e},e:function(e){p=!0,c=e},f:function(){try{l||null==n.return||n.return()}finally{if(p)throw c}}}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){var n=Array.isArray;e.exports=n},function(e,t){var n;n=function(){return this}();try{n=n||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(n=window)}e.exports=n},function(e,t,n){var r=n(47);e.exports=function(e){if(!r(e))throw TypeError(String(e)+\" is not an object\");return e}},function(e,t,n){var r=n(449),o=n(450),a=n(872);e.exports=function(e,t){if(null==e)return{};var n,i,s=a(e,t);if(r){var u=r(e);for(i=0;i<u.length;i++)n=u[i],o(t).call(t,n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_SELECTED_SERVER\",(function(){return r})),n.d(t,\"UPDATE_REQUEST_BODY_VALUE\",(function(){return o})),n.d(t,\"UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG\",(function(){return a})),n.d(t,\"UPDATE_REQUEST_BODY_INCLUSION\",(function(){return i})),n.d(t,\"UPDATE_ACTIVE_EXAMPLES_MEMBER\",(function(){return s})),n.d(t,\"UPDATE_REQUEST_CONTENT_TYPE\",(function(){return u})),n.d(t,\"UPDATE_RESPONSE_CONTENT_TYPE\",(function(){return c})),n.d(t,\"UPDATE_SERVER_VARIABLE_VALUE\",(function(){return l})),n.d(t,\"SET_REQUEST_BODY_VALIDATE_ERROR\",(function(){return p})),n.d(t,\"CLEAR_REQUEST_BODY_VALIDATE_ERROR\",(function(){return f})),n.d(t,\"CLEAR_REQUEST_BODY_VALUE\",(function(){return h})),n.d(t,\"setSelectedServer\",(function(){return d})),n.d(t,\"setRequestBodyValue\",(function(){return m})),n.d(t,\"setRetainRequestBodyValueFlag\",(function(){return v})),n.d(t,\"setRequestBodyInclusion\",(function(){return g})),n.d(t,\"setActiveExamplesMember\",(function(){return y})),n.d(t,\"setRequestContentType\",(function(){return b})),n.d(t,\"setResponseContentType\",(function(){return _})),n.d(t,\"setServerVariableValue\",(function(){return w})),n.d(t,\"setRequestBodyValidateError\",(function(){return x})),n.d(t,\"clearRequestBodyValidateError\",(function(){return E})),n.d(t,\"initRequestBodyValidateError\",(function(){return S})),n.d(t,\"clearRequestBodyValue\",(function(){return C}));var r=\"oas3_set_servers\",o=\"oas3_set_request_body_value\",a=\"oas3_set_request_body_retain_flag\",i=\"oas3_set_request_body_inclusion\",s=\"oas3_set_active_examples_member\",u=\"oas3_set_request_content_type\",c=\"oas3_set_response_content_type\",l=\"oas3_set_server_variable_value\",p=\"oas3_set_request_body_validate_error\",f=\"oas3_clear_request_body_validate_error\",h=\"oas3_clear_request_body_value\";function d(e,t){return{type:r,payload:{selectedServerUrl:e,namespace:t}}}function m(e){var t=e.value,n=e.pathMethod;return{type:o,payload:{value:t,pathMethod:n}}}var v=function(e){var t=e.value,n=e.pathMethod;return{type:a,payload:{value:t,pathMethod:n}}};function g(e){var t=e.value,n=e.pathMethod,r=e.name;return{type:i,payload:{value:t,pathMethod:n,name:r}}}function y(e){var t=e.name,n=e.pathMethod,r=e.contextType,o=e.contextName;return{type:s,payload:{name:t,pathMethod:n,contextType:r,contextName:o}}}function b(e){var t=e.value,n=e.pathMethod;return{type:u,payload:{value:t,pathMethod:n}}}function _(e){var t=e.value,n=e.path,r=e.method;return{type:c,payload:{value:t,path:n,method:r}}}function w(e){var t=e.server,n=e.namespace,r=e.key,o=e.val;return{type:l,payload:{server:t,namespace:n,key:r,val:o}}}var x=function(e){var t=e.path,n=e.method,r=e.validationErrors;return{type:p,payload:{path:t,method:n,validationErrors:r}}},E=function(e){var t=e.path,n=e.method;return{type:f,payload:{path:t,method:n}}},S=function(e){var t=e.pathMethod;return{type:f,payload:{path:t[0],method:t[1]}}},C=function(e){var t=e.pathMethod;return{type:h,payload:{pathMethod:t}}}},function(e,t,n){var r=n(60),o={}.hasOwnProperty;e.exports=Object.hasOwn||function(e,t){return o.call(r(e),t)}},function(e,t,n){\"use strict\";var r=!(\"undefined\"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:r,canUseWorkers:\"undefined\"!=typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen,isInWorker:!r};e.exports=o},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&(\"object\"==t||\"function\"==t)}},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return m})),n.d(t,\"e\",(function(){return v})),n.d(t,\"c\",(function(){return y})),n.d(t,\"a\",(function(){return b})),n.d(t,\"d\",(function(){return _}));var r=n(49),o=n.n(r),a=n(18),i=n.n(a),s=n(2),u=n.n(s),c=n(57),l=n.n(c),p=n(356),f=n.n(p),h=function(e){return String.prototype.toLowerCase.call(e)},d=function(e){return e.replace(/[^\\w]/gi,\"_\")};function m(e){var t=e.openapi;return!!t&&f()(t,\"3\")}function v(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=r.v2OperationIdCompatibilityMode;if(!e||\"object\"!==i()(e))return null;var a=(e.operationId||\"\").replace(/\\s/g,\"\");return a.length?d(e.operationId):g(t,n,{v2OperationIdCompatibilityMode:o})}function g(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=r.v2OperationIdCompatibilityMode;if(o){var a,i,s=u()(a=\"\".concat(t.toLowerCase(),\"_\")).call(a,e).replace(/[\\s!@#$%^&*()_+=[{\\]};:<>|./?,\\\\'\"\"-]/g,\"_\");return(s=s||u()(i=\"\".concat(e.substring(1),\"_\")).call(i,t)).replace(/((_){2,})/g,\"_\").replace(/^(_)*/g,\"\").replace(/([_])*$/g,\"\")}return u()(n=\"\".concat(h(t))).call(n,d(e))}function y(e,t){var n;return u()(n=\"\".concat(h(t),\"-\")).call(n,e)}function b(e,t){return e&&e.paths?function(e,t){return function(e,t,n){if(!e||\"object\"!==i()(e)||!e.paths||\"object\"!==i()(e.paths))return null;var r=e.paths;for(var o in r)for(var a in r[o])if(\"PARAMETERS\"!==a.toUpperCase()){var s=r[o][a];if(s&&\"object\"===i()(s)){var u={spec:e,pathName:o,method:a.toUpperCase(),operation:s},c=t(u);if(n&&c)return u}}return}(e,t,!0)||null}(e,(function(e){var n=e.pathName,r=e.method,o=e.operation;if(!o||\"object\"!==i()(o))return!1;var a=o.operationId;return[v(o,n,r),y(n,r),a].some((function(e){return e&&e===t}))})):null}function _(e){var t=e.spec,n=t.paths,r={};if(!n||t.$$normalized)return e;for(var a in n){var i=n[a];if(l()(i)){var s=i.parameters,c=function(e){var n=i[e];if(!l()(n))return\"continue\";var c=v(n,a,e);if(c){r[c]?r[c].push(n):r[c]=[n];var p=r[c];if(p.length>1)p.forEach((function(e,t){var n;e.__originalOperationId=e.__originalOperationId||e.operationId,e.operationId=u()(n=\"\".concat(c)).call(n,t+1)}));else if(void 0!==n.operationId){var f=p[0];f.__originalOperationId=f.__originalOperationId||n.operationId,f.operationId=c}}if(\"parameters\"!==e){var h=[],d={};for(var m in t)\"produces\"!==m&&\"consumes\"!==m&&\"security\"!==m||(d[m]=t[m],h.push(d));if(s&&(d.parameters=s,h.push(d)),h.length){var g,y=o()(h);try{for(y.s();!(g=y.n()).done;){var b=g.value;for(var _ in b)if(n[_]){if(\"parameters\"===_){var w,x=o()(b[_]);try{var E=function(){var e=w.value;n[_].some((function(t){return t.name&&t.name===e.name||t.$ref&&t.$ref===e.$ref||t.$$ref&&t.$$ref===e.$$ref||t===e}))||n[_].push(e)};for(x.s();!(w=x.n()).done;)E()}catch(e){x.e(e)}finally{x.f()}}}else n[_]=b[_]}}catch(e){y.e(e)}finally{y.f()}}}};for(var p in i)c(p)}}return t.$$normalized=!0,e}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"NEW_THROWN_ERR\",(function(){return o})),n.d(t,\"NEW_THROWN_ERR_BATCH\",(function(){return a})),n.d(t,\"NEW_SPEC_ERR\",(function(){return i})),n.d(t,\"NEW_SPEC_ERR_BATCH\",(function(){return s})),n.d(t,\"NEW_AUTH_ERR\",(function(){return u})),n.d(t,\"CLEAR\",(function(){return c})),n.d(t,\"CLEAR_BY\",(function(){return l})),n.d(t,\"newThrownErr\",(function(){return p})),n.d(t,\"newThrownErrBatch\",(function(){return f})),n.d(t,\"newSpecErr\",(function(){return h})),n.d(t,\"newSpecErrBatch\",(function(){return d})),n.d(t,\"newAuthErr\",(function(){return m})),n.d(t,\"clear\",(function(){return v})),n.d(t,\"clearBy\",(function(){return g}));var r=n(145),o=\"err_new_thrown_err\",a=\"err_new_thrown_err_batch\",i=\"err_new_spec_err\",s=\"err_new_spec_err_batch\",u=\"err_new_auth_err\",c=\"err_clear\",l=\"err_clear_by\";function p(e){return{type:o,payload:Object(r.serializeError)(e)}}function f(e){return{type:a,payload:e}}function h(e){return{type:i,payload:e}}function d(e){return{type:s,payload:e}}function m(e){return{type:u,payload:e}}function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:c,payload:e}}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:l,payload:e}}},function(e,t,n){var r=n(106);e.exports=function(e){return Object(r(e))}},function(e,t){\"function\"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t,n){var r=n(73),o=r.Buffer;function a(e,t){for(var n in e)t[n]=e[n]}function i(e,t,n){return o(e,t,n)}o.from&&o.alloc&&o.allocUnsafe&&o.allocUnsafeSlow?e.exports=r:(a(r,t),t.Buffer=i),a(o,i),i.from=function(e,t,n){if(\"number\"==typeof e)throw new TypeError(\"Argument must not be a number\");return o(e,t,n)},i.alloc=function(e,t,n){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");var r=o(e);return void 0!==t?\"string\"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},i.allocUnsafe=function(e){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");return o(e)},i.allocUnsafeSlow=function(e){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");return r.SlowBuffer(e)}},function(e,t,n){var r;!function(){\"use strict\";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var a=typeof r;if(\"string\"===a||\"number\"===a)e.push(r);else if(Array.isArray(r)){if(r.length){var i=o.apply(null,r);i&&e.push(i)}}else if(\"object\"===a)if(r.toString===Object.prototype.toString)for(var s in r)n.call(r,s)&&r[s]&&e.push(s);else e.push(r.toString())}}return e.join(\" \")}e.exports?(o.default=o,e.exports=o):void 0===(r=function(){return o}.apply(t,[]))||(e.exports=r)}()},function(e,t,n){e.exports=n(671)},function(e,t,n){e.exports=n(887)},function(e,t,n){var r=n(177),o=n(106);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(48),o=n(68),a=n(105);e.exports=r?function(e,t,n){return o.f(e,t,a(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(48),o=n(361),a=n(52),i=n(178),s=Object.defineProperty;t.f=r?s:function(e,t,n){if(a(e),t=i(t,!0),a(n),o)try{return s(e,t,n)}catch(e){}if(\"get\"in n||\"set\"in n)throw TypeError(\"Accessors not supported\");return\"value\"in n&&(e[t]=n.value),e}},function(e,t,n){var r=n(128),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t,n){var r=n(34),o=n(40),a=function(e){return\"function\"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?a(r[e])||a(o[e]):r[e]&&r[e][t]||o[e]&&o[e][t]}},function(e,t,n){var r=n(407),o=\"object\"==typeof self&&self&&self.Object===Object&&self,a=r||o||Function(\"return this\")();e.exports=a},function(e,t,n){\"use strict\";e.exports={debugTool:null}},function(e,t,n){\"use strict\";(function(e){var r=n(588),o=n(589),a=n(376);function i(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(i()<t)throw new RangeError(\"Invalid typed array length\");return u.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=u.prototype:(null===e&&(e=new u(t)),e.length=t),e}function u(e,t,n){if(!(u.TYPED_ARRAY_SUPPORT||this instanceof u))return new u(e,t,n);if(\"number\"==typeof e){if(\"string\"==typeof t)throw new Error(\"If encoding is specified then the first argument must be a string\");return p(this,e)}return c(this,e,t,n)}function c(e,t,n,r){if(\"number\"==typeof t)throw new TypeError('\"value\" argument must not be a number');return\"undefined\"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,n,r){if(t.byteLength,n<0||t.byteLength<n)throw new RangeError(\"'offset' is out of bounds\");if(t.byteLength<n+(r||0))throw new RangeError(\"'length' is out of bounds\");t=void 0===n&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,n):new Uint8Array(t,n,r);u.TYPED_ARRAY_SUPPORT?(e=t).__proto__=u.prototype:e=f(e,t);return e}(e,t,n,r):\"string\"==typeof t?function(e,t,n){\"string\"==typeof n&&\"\"!==n||(n=\"utf8\");if(!u.isEncoding(n))throw new TypeError('\"encoding\" must be a valid string encoding');var r=0|d(t,n),o=(e=s(e,r)).write(t,n);o!==r&&(e=e.slice(0,o));return e}(e,t,n):function(e,t){if(u.isBuffer(t)){var n=0|h(t.length);return 0===(e=s(e,n)).length||t.copy(e,0,0,n),e}if(t){if(\"undefined\"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||\"length\"in t)return\"number\"!=typeof t.length||(r=t.length)!=r?s(e,0):f(e,t);if(\"Buffer\"===t.type&&a(t.data))return f(e,t.data)}var r;throw new TypeError(\"First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.\")}(e,t)}function l(e){if(\"number\"!=typeof e)throw new TypeError('\"size\" argument must be a number');if(e<0)throw new RangeError('\"size\" argument must not be negative')}function p(e,t){if(l(t),e=s(e,t<0?0:0|h(t)),!u.TYPED_ARRAY_SUPPORT)for(var n=0;n<t;++n)e[n]=0;return e}function f(e,t){var n=t.length<0?0:0|h(t.length);e=s(e,n);for(var r=0;r<n;r+=1)e[r]=255&t[r];return e}function h(e){if(e>=i())throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+i().toString(16)+\" bytes\");return 0|e}function d(e,t){if(u.isBuffer(e))return e.length;if(\"undefined\"!=typeof ArrayBuffer&&\"function\"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;\"string\"!=typeof e&&(e=\"\"+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case\"ascii\":case\"latin1\":case\"binary\":return n;case\"utf8\":case\"utf-8\":case void 0:return q(e).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*n;case\"hex\":return n>>>1;case\"base64\":return z(e).length;default:if(r)return q(e).length;t=(\"\"+t).toLowerCase(),r=!0}}function m(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return\"\";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return\"\";if((n>>>=0)<=(t>>>=0))return\"\";for(e||(e=\"utf8\");;)switch(e){case\"hex\":return T(this,t,n);case\"utf8\":case\"utf-8\":return A(this,t,n);case\"ascii\":return O(this,t,n);case\"latin1\":case\"binary\":return j(this,t,n);case\"base64\":return C(this,t,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return I(this,t,n);default:if(r)throw new TypeError(\"Unknown encoding: \"+e);e=(e+\"\").toLowerCase(),r=!0}}function v(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function g(e,t,n,r,o){if(0===e.length)return-1;if(\"string\"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if(\"string\"==typeof t&&(t=u.from(t,r)),u.isBuffer(t))return 0===t.length?-1:y(e,t,n,r,o);if(\"number\"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&\"function\"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,r,o);throw new TypeError(\"val must be string, number or Buffer\")}function y(e,t,n,r,o){var a,i=1,s=e.length,u=t.length;if(void 0!==r&&(\"ucs2\"===(r=String(r).toLowerCase())||\"ucs-2\"===r||\"utf16le\"===r||\"utf-16le\"===r)){if(e.length<2||t.length<2)return-1;i=2,s/=2,u/=2,n/=2}function c(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(o){var l=-1;for(a=n;a<s;a++)if(c(e,a)===c(t,-1===l?0:a-l)){if(-1===l&&(l=a),a-l+1===u)return l*i}else-1!==l&&(a-=a-l),l=-1}else for(n+u>s&&(n=s-u),a=n;a>=0;a--){for(var p=!0,f=0;f<u;f++)if(c(e,a+f)!==c(t,f)){p=!1;break}if(p)return a}return-1}function b(e,t,n,r){n=Number(n)||0;var o=e.length-n;r?(r=Number(r))>o&&(r=o):r=o;var a=t.length;if(a%2!=0)throw new TypeError(\"Invalid hex string\");r>a/2&&(r=a/2);for(var i=0;i<r;++i){var s=parseInt(t.substr(2*i,2),16);if(isNaN(s))return i;e[n+i]=s}return i}function _(e,t,n,r){return V(q(t,e.length-n),e,n,r)}function w(e,t,n,r){return V(function(e){for(var t=[],n=0;n<e.length;++n)t.push(255&e.charCodeAt(n));return t}(t),e,n,r)}function x(e,t,n,r){return w(e,t,n,r)}function E(e,t,n,r){return V(z(t),e,n,r)}function S(e,t,n,r){return V(function(e,t){for(var n,r,o,a=[],i=0;i<e.length&&!((t-=2)<0);++i)r=(n=e.charCodeAt(i))>>8,o=n%256,a.push(o),a.push(r);return a}(t,e.length-n),e,n,r)}function C(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function A(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o<n;){var a,i,s,u,c=e[o],l=null,p=c>239?4:c>223?3:c>191?2:1;if(o+p<=n)switch(p){case 1:c<128&&(l=c);break;case 2:128==(192&(a=e[o+1]))&&(u=(31&c)<<6|63&a)>127&&(l=u);break;case 3:a=e[o+1],i=e[o+2],128==(192&a)&&128==(192&i)&&(u=(15&c)<<12|(63&a)<<6|63&i)>2047&&(u<55296||u>57343)&&(l=u);break;case 4:a=e[o+1],i=e[o+2],s=e[o+3],128==(192&a)&&128==(192&i)&&128==(192&s)&&(u=(15&c)<<18|(63&a)<<12|(63&i)<<6|63&s)>65535&&u<1114112&&(l=u)}null===l?(l=65533,p=1):l>65535&&(l-=65536,r.push(l>>>10&1023|55296),l=56320|1023&l),r.push(l),o+=p}return function(e){var t=e.length;if(t<=k)return String.fromCharCode.apply(String,e);var n=\"\",r=0;for(;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=k));return n}(r)}t.Buffer=u,t.SlowBuffer=function(e){+e!=e&&(e=0);return u.alloc(+e)},t.INSPECT_MAX_BYTES=50,u.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&\"function\"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),t.kMaxLength=i(),u.poolSize=8192,u._augment=function(e){return e.__proto__=u.prototype,e},u.from=function(e,t,n){return c(null,e,t,n)},u.TYPED_ARRAY_SUPPORT&&(u.prototype.__proto__=Uint8Array.prototype,u.__proto__=Uint8Array,\"undefined\"!=typeof Symbol&&Symbol.species&&u[Symbol.species]===u&&Object.defineProperty(u,Symbol.species,{value:null,configurable:!0})),u.alloc=function(e,t,n){return function(e,t,n,r){return l(t),t<=0?s(e,t):void 0!==n?\"string\"==typeof r?s(e,t).fill(n,r):s(e,t).fill(n):s(e,t)}(null,e,t,n)},u.allocUnsafe=function(e){return p(null,e)},u.allocUnsafeSlow=function(e){return p(null,e)},u.isBuffer=function(e){return!(null==e||!e._isBuffer)},u.compare=function(e,t){if(!u.isBuffer(e)||!u.isBuffer(t))throw new TypeError(\"Arguments must be Buffers\");if(e===t)return 0;for(var n=e.length,r=t.length,o=0,a=Math.min(n,r);o<a;++o)if(e[o]!==t[o]){n=e[o],r=t[o];break}return n<r?-1:r<n?1:0},u.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"latin1\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},u.concat=function(e,t){if(!a(e))throw new TypeError('\"list\" argument must be an Array of Buffers');if(0===e.length)return u.alloc(0);var n;if(void 0===t)for(t=0,n=0;n<e.length;++n)t+=e[n].length;var r=u.allocUnsafe(t),o=0;for(n=0;n<e.length;++n){var i=e[n];if(!u.isBuffer(i))throw new TypeError('\"list\" argument must be an Array of Buffers');i.copy(r,o),o+=i.length}return r},u.byteLength=d,u.prototype._isBuffer=!0,u.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var t=0;t<e;t+=2)v(this,t,t+1);return this},u.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError(\"Buffer size must be a multiple of 32-bits\");for(var t=0;t<e;t+=4)v(this,t,t+3),v(this,t+1,t+2);return this},u.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError(\"Buffer size must be a multiple of 64-bits\");for(var t=0;t<e;t+=8)v(this,t,t+7),v(this,t+1,t+6),v(this,t+2,t+5),v(this,t+3,t+4);return this},u.prototype.toString=function(){var e=0|this.length;return 0===e?\"\":0===arguments.length?A(this,0,e):m.apply(this,arguments)},u.prototype.equals=function(e){if(!u.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");return this===e||0===u.compare(this,e)},u.prototype.inspect=function(){var e=\"\",n=t.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString(\"hex\",0,n).match(/.{2}/g).join(\" \"),this.length>n&&(e+=\" ... \")),\"<Buffer \"+e+\">\"},u.prototype.compare=function(e,t,n,r,o){if(!u.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError(\"out of range index\");if(r>=o&&t>=n)return 0;if(r>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var a=(o>>>=0)-(r>>>=0),i=(n>>>=0)-(t>>>=0),s=Math.min(a,i),c=this.slice(r,o),l=e.slice(t,n),p=0;p<s;++p)if(c[p]!==l[p]){a=c[p],i=l[p];break}return a<i?-1:i<a?1:0},u.prototype.includes=function(e,t,n){return-1!==this.indexOf(e,t,n)},u.prototype.indexOf=function(e,t,n){return g(this,e,t,n,!0)},u.prototype.lastIndexOf=function(e,t,n){return g(this,e,t,n,!1)},u.prototype.write=function(e,t,n,r){if(void 0===t)r=\"utf8\",n=this.length,t=0;else if(void 0===n&&\"string\"==typeof t)r=t,n=this.length,t=0;else{if(!isFinite(t))throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");t|=0,isFinite(n)?(n|=0,void 0===r&&(r=\"utf8\")):(r=n,n=void 0)}var o=this.length-t;if((void 0===n||n>o)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");r||(r=\"utf8\");for(var a=!1;;)switch(r){case\"hex\":return b(this,e,t,n);case\"utf8\":case\"utf-8\":return _(this,e,t,n);case\"ascii\":return w(this,e,t,n);case\"latin1\":case\"binary\":return x(this,e,t,n);case\"base64\":return E(this,e,t,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return S(this,e,t,n);default:if(a)throw new TypeError(\"Unknown encoding: \"+r);r=(\"\"+r).toLowerCase(),a=!0}},u.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var k=4096;function O(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var o=t;o<n;++o)r+=String.fromCharCode(127&e[o]);return r}function j(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var o=t;o<n;++o)r+=String.fromCharCode(e[o]);return r}function T(e,t,n){var r=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>r)&&(n=r);for(var o=\"\",a=t;a<n;++a)o+=U(e[a]);return o}function I(e,t,n){for(var r=e.slice(t,n),o=\"\",a=0;a<r.length;a+=2)o+=String.fromCharCode(r[a]+256*r[a+1]);return o}function P(e,t,n){if(e%1!=0||e<0)throw new RangeError(\"offset is not uint\");if(e+t>n)throw new RangeError(\"Trying to access beyond buffer length\")}function N(e,t,n,r,o,a){if(!u.isBuffer(e))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(t>o||t<a)throw new RangeError('\"value\" argument is out of bounds');if(n+r>e.length)throw new RangeError(\"Index out of range\")}function M(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,a=Math.min(e.length-n,2);o<a;++o)e[n+o]=(t&255<<8*(r?o:1-o))>>>8*(r?o:1-o)}function R(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,a=Math.min(e.length-n,4);o<a;++o)e[n+o]=t>>>8*(r?o:3-o)&255}function D(e,t,n,r,o,a){if(n+r>e.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"Index out of range\")}function L(e,t,n,r,a){return a||D(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function B(e,t,n,r,a){return a||D(e,0,n,8),o.write(e,t,n,r,52,8),n+8}u.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t<e&&(t=e),u.TYPED_ARRAY_SUPPORT)(n=this.subarray(e,t)).__proto__=u.prototype;else{var o=t-e;n=new u(o,void 0);for(var a=0;a<o;++a)n[a]=this[a+e]}return n},u.prototype.readUIntLE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=this[e],o=1,a=0;++a<t&&(o*=256);)r+=this[e+a]*o;return r},u.prototype.readUIntBE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=this[e+--t],o=1;t>0&&(o*=256);)r+=this[e+--t]*o;return r},u.prototype.readUInt8=function(e,t){return t||P(e,1,this.length),this[e]},u.prototype.readUInt16LE=function(e,t){return t||P(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUInt16BE=function(e,t){return t||P(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUInt32LE=function(e,t){return t||P(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUInt32BE=function(e,t){return t||P(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=this[e],o=1,a=0;++a<t&&(o*=256);)r+=this[e+a]*o;return r>=(o*=128)&&(r-=Math.pow(2,8*t)),r},u.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=t,o=1,a=this[e+--r];r>0&&(o*=256);)a+=this[e+--r]*o;return a>=(o*=128)&&(a-=Math.pow(2,8*t)),a},u.prototype.readInt8=function(e,t){return t||P(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||P(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(e,t){t||P(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(e,t){return t||P(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||P(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||P(e,4,this.length),o.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||P(e,4,this.length),o.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||P(e,8,this.length),o.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||P(e,8,this.length),o.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||N(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,a=0;for(this[t]=255&e;++a<n&&(o*=256);)this[t+a]=e/o&255;return t+n},u.prototype.writeUIntBE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||N(this,e,t,n,Math.pow(2,8*n)-1,0);var o=n-1,a=1;for(this[t+o]=255&e;--o>=0&&(a*=256);)this[t+o]=e/a&255;return t+n},u.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,1,255,0),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},u.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):M(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):M(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);N(this,e,t,n,o-1,-o)}var a=0,i=1,s=0;for(this[t]=255&e;++a<n&&(i*=256);)e<0&&0===s&&0!==this[t+a-1]&&(s=1),this[t+a]=(e/i>>0)-s&255;return t+n},u.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);N(this,e,t,n,o-1,-o)}var a=n-1,i=1,s=0;for(this[t+a]=255&e;--a>=0&&(i*=256);)e<0&&0===s&&0!==this[t+a+1]&&(s=1),this[t+a]=(e/i>>0)-s&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):M(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):M(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,n){return L(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return L(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return B(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return B(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError(\"targetStart out of bounds\");if(n<0||n>=this.length)throw new RangeError(\"sourceStart out of bounds\");if(r<0)throw new RangeError(\"sourceEnd out of bounds\");r>this.length&&(r=this.length),e.length-t<r-n&&(r=e.length-t+n);var o,a=r-n;if(this===e&&n<t&&t<r)for(o=a-1;o>=0;--o)e[o+t]=this[o+n];else if(a<1e3||!u.TYPED_ARRAY_SUPPORT)for(o=0;o<a;++o)e[o+t]=this[o+n];else Uint8Array.prototype.set.call(e,this.subarray(n,n+a),t);return a},u.prototype.fill=function(e,t,n,r){if(\"string\"==typeof e){if(\"string\"==typeof t?(r=t,t=0,n=this.length):\"string\"==typeof n&&(r=n,n=this.length),1===e.length){var o=e.charCodeAt(0);o<256&&(e=o)}if(void 0!==r&&\"string\"!=typeof r)throw new TypeError(\"encoding must be a string\");if(\"string\"==typeof r&&!u.isEncoding(r))throw new TypeError(\"Unknown encoding: \"+r)}else\"number\"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<n)throw new RangeError(\"Out of range index\");if(n<=t)return this;var a;if(t>>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),\"number\"==typeof e)for(a=t;a<n;++a)this[a]=e;else{var i=u.isBuffer(e)?e:q(new u(e,r).toString()),s=i.length;for(a=0;a<n-t;++a)this[a+t]=i[a%s]}return this};var F=/[^+\\/0-9A-Za-z-_]/g;function U(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function q(e,t){var n;t=t||1/0;for(var r=e.length,o=null,a=[],i=0;i<r;++i){if((n=e.charCodeAt(i))>55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(i+1===r){(t-=3)>-1&&a.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&a.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&a.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;a.push(n)}else if(n<2048){if((t-=2)<0)break;a.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;a.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error(\"Invalid code point\");if((t-=4)<0)break;a.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return a}function z(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}(e).replace(F,\"\")).length<2)return\"\";for(;e.length%4!=0;)e+=\"=\";return e}(e))}function V(e,t,n,r){for(var o=0;o<r&&!(o+n>=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,n(51))},function(e,t,n){\"use strict\";function r(e){return null==e}var o={isNothing:r,isObject:function(e){return\"object\"==typeof e&&null!==e},toArray:function(e){return Array.isArray(e)?e:r(e)?[]:[e]},repeat:function(e,t){var n,r=\"\";for(n=0;n<t;n+=1)r+=e;return r},isNegativeZero:function(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e},extend:function(e,t){var n,r,o,a;if(t)for(n=0,r=(a=Object.keys(t)).length;n<r;n+=1)e[o=a[n]]=t[o];return e}};function a(e,t){var n=\"\",r=e.reason||\"(unknown reason)\";return e.mark?(e.mark.name&&(n+='in \"'+e.mark.name+'\" '),n+=\"(\"+(e.mark.line+1)+\":\"+(e.mark.column+1)+\")\",!t&&e.mark.snippet&&(n+=\"\\n\\n\"+e.mark.snippet),r+\" \"+n):r}function i(e,t){Error.call(this),this.name=\"YAMLException\",this.reason=e,this.mark=t,this.message=a(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||\"\"}i.prototype=Object.create(Error.prototype),i.prototype.constructor=i,i.prototype.toString=function(e){return this.name+\": \"+a(this,e)};var s=i;function u(e,t,n,r,o){var a=\"\",i=\"\",s=Math.floor(o/2)-1;return r-t>s&&(t=r-s+(a=\" ... \").length),n-r>s&&(n=r+s-(i=\" ...\").length),{str:a+e.slice(t,n).replace(/\\t/g,\"→\")+i,pos:r-t+a.length}}function c(e,t){return o.repeat(\" \",t-e.length)+e}var l=function(e,t){if(t=Object.create(t||null),!e.buffer)return null;t.maxLength||(t.maxLength=79),\"number\"!=typeof t.indent&&(t.indent=1),\"number\"!=typeof t.linesBefore&&(t.linesBefore=3),\"number\"!=typeof t.linesAfter&&(t.linesAfter=2);for(var n,r=/\\r?\\n|\\r|\\0/g,a=[0],i=[],s=-1;n=r.exec(e.buffer);)i.push(n.index),a.push(n.index+n[0].length),e.position<=n.index&&s<0&&(s=a.length-2);s<0&&(s=a.length-1);var l,p,f=\"\",h=Math.min(e.line+t.linesAfter,i.length).toString().length,d=t.maxLength-(t.indent+h+3);for(l=1;l<=t.linesBefore&&!(s-l<0);l++)p=u(e.buffer,a[s-l],i[s-l],e.position-(a[s]-a[s-l]),d),f=o.repeat(\" \",t.indent)+c((e.line-l+1).toString(),h)+\" | \"+p.str+\"\\n\"+f;for(p=u(e.buffer,a[s],i[s],e.position,d),f+=o.repeat(\" \",t.indent)+c((e.line+1).toString(),h)+\" | \"+p.str+\"\\n\",f+=o.repeat(\"-\",t.indent+h+3+p.pos)+\"^\\n\",l=1;l<=t.linesAfter&&!(s+l>=i.length);l++)p=u(e.buffer,a[s+l],i[s+l],e.position-(a[s]-a[s+l]),d),f+=o.repeat(\" \",t.indent)+c((e.line+l+1).toString(),h)+\" | \"+p.str+\"\\n\";return f.replace(/\\n$/,\"\")},p=[\"kind\",\"multi\",\"resolve\",\"construct\",\"instanceOf\",\"predicate\",\"represent\",\"representName\",\"defaultStyle\",\"styleAliases\"],f=[\"scalar\",\"sequence\",\"mapping\"];var h=function(e,t){if(t=t||{},Object.keys(t).forEach((function(t){if(-1===p.indexOf(t))throw new s('Unknown option \"'+t+'\" is met in definition of \"'+e+'\" YAML type.')})),this.options=t,this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=function(e){var t={};return null!==e&&Object.keys(e).forEach((function(n){e[n].forEach((function(e){t[String(e)]=n}))})),t}(t.styleAliases||null),-1===f.indexOf(this.kind))throw new s('Unknown kind \"'+this.kind+'\" is specified for \"'+e+'\" YAML type.')};function d(e,t){var n=[];return e[t].forEach((function(e){var t=n.length;n.forEach((function(n,r){n.tag===e.tag&&n.kind===e.kind&&n.multi===e.multi&&(t=r)})),n[t]=e})),n}function m(e){return this.extend(e)}m.prototype.extend=function(e){var t=[],n=[];if(e instanceof h)n.push(e);else if(Array.isArray(e))n=n.concat(e);else{if(!e||!Array.isArray(e.implicit)&&!Array.isArray(e.explicit))throw new s(\"Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })\");e.implicit&&(t=t.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit))}t.forEach((function(e){if(!(e instanceof h))throw new s(\"Specified list of YAML types (or a single Type object) contains a non-Type object.\");if(e.loadKind&&\"scalar\"!==e.loadKind)throw new s(\"There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.\");if(e.multi)throw new s(\"There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.\")})),n.forEach((function(e){if(!(e instanceof h))throw new s(\"Specified list of YAML types (or a single Type object) contains a non-Type object.\")}));var r=Object.create(m.prototype);return r.implicit=(this.implicit||[]).concat(t),r.explicit=(this.explicit||[]).concat(n),r.compiledImplicit=d(r,\"implicit\"),r.compiledExplicit=d(r,\"explicit\"),r.compiledTypeMap=function(){var e,t,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function r(e){e.multi?(n.multi[e.kind].push(e),n.multi.fallback.push(e)):n[e.kind][e.tag]=n.fallback[e.tag]=e}for(e=0,t=arguments.length;e<t;e+=1)arguments[e].forEach(r);return n}(r.compiledImplicit,r.compiledExplicit),r};var v=m,g=new h(\"tag:yaml.org,2002:str\",{kind:\"scalar\",construct:function(e){return null!==e?e:\"\"}}),y=new h(\"tag:yaml.org,2002:seq\",{kind:\"sequence\",construct:function(e){return null!==e?e:[]}}),b=new h(\"tag:yaml.org,2002:map\",{kind:\"mapping\",construct:function(e){return null!==e?e:{}}}),_=new v({explicit:[g,y,b]});var w=new h(\"tag:yaml.org,2002:null\",{kind:\"scalar\",resolve:function(e){if(null===e)return!0;var t=e.length;return 1===t&&\"~\"===e||4===t&&(\"null\"===e||\"Null\"===e||\"NULL\"===e)},construct:function(){return null},predicate:function(e){return null===e},represent:{canonical:function(){return\"~\"},lowercase:function(){return\"null\"},uppercase:function(){return\"NULL\"},camelcase:function(){return\"Null\"},empty:function(){return\"\"}},defaultStyle:\"lowercase\"});var x=new h(\"tag:yaml.org,2002:bool\",{kind:\"scalar\",resolve:function(e){if(null===e)return!1;var t=e.length;return 4===t&&(\"true\"===e||\"True\"===e||\"TRUE\"===e)||5===t&&(\"false\"===e||\"False\"===e||\"FALSE\"===e)},construct:function(e){return\"true\"===e||\"True\"===e||\"TRUE\"===e},predicate:function(e){return\"[object Boolean]\"===Object.prototype.toString.call(e)},represent:{lowercase:function(e){return e?\"true\":\"false\"},uppercase:function(e){return e?\"TRUE\":\"FALSE\"},camelcase:function(e){return e?\"True\":\"False\"}},defaultStyle:\"lowercase\"});function E(e){return 48<=e&&e<=55}function S(e){return 48<=e&&e<=57}var C=new h(\"tag:yaml.org,2002:int\",{kind:\"scalar\",resolve:function(e){if(null===e)return!1;var t,n,r=e.length,o=0,a=!1;if(!r)return!1;if(\"-\"!==(t=e[o])&&\"+\"!==t||(t=e[++o]),\"0\"===t){if(o+1===r)return!0;if(\"b\"===(t=e[++o])){for(o++;o<r;o++)if(\"_\"!==(t=e[o])){if(\"0\"!==t&&\"1\"!==t)return!1;a=!0}return a&&\"_\"!==t}if(\"x\"===t){for(o++;o<r;o++)if(\"_\"!==(t=e[o])){if(!(48<=(n=e.charCodeAt(o))&&n<=57||65<=n&&n<=70||97<=n&&n<=102))return!1;a=!0}return a&&\"_\"!==t}if(\"o\"===t){for(o++;o<r;o++)if(\"_\"!==(t=e[o])){if(!E(e.charCodeAt(o)))return!1;a=!0}return a&&\"_\"!==t}}if(\"_\"===t)return!1;for(;o<r;o++)if(\"_\"!==(t=e[o])){if(!S(e.charCodeAt(o)))return!1;a=!0}return!(!a||\"_\"===t)},construct:function(e){var t,n=e,r=1;if(-1!==n.indexOf(\"_\")&&(n=n.replace(/_/g,\"\")),\"-\"!==(t=n[0])&&\"+\"!==t||(\"-\"===t&&(r=-1),t=(n=n.slice(1))[0]),\"0\"===n)return 0;if(\"0\"===t){if(\"b\"===n[1])return r*parseInt(n.slice(2),2);if(\"x\"===n[1])return r*parseInt(n.slice(2),16);if(\"o\"===n[1])return r*parseInt(n.slice(2),8)}return r*parseInt(n,10)},predicate:function(e){return\"[object Number]\"===Object.prototype.toString.call(e)&&e%1==0&&!o.isNegativeZero(e)},represent:{binary:function(e){return e>=0?\"0b\"+e.toString(2):\"-0b\"+e.toString(2).slice(1)},octal:function(e){return e>=0?\"0o\"+e.toString(8):\"-0o\"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?\"0x\"+e.toString(16).toUpperCase():\"-0x\"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:\"decimal\",styleAliases:{binary:[2,\"bin\"],octal:[8,\"oct\"],decimal:[10,\"dec\"],hexadecimal:[16,\"hex\"]}}),A=new RegExp(\"^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");var k=/^[-+]?[0-9]+e/;var O=new h(\"tag:yaml.org,2002:float\",{kind:\"scalar\",resolve:function(e){return null!==e&&!(!A.test(e)||\"_\"===e[e.length-1])},construct:function(e){var t,n;return n=\"-\"===(t=e.replace(/_/g,\"\").toLowerCase())[0]?-1:1,\"+-\".indexOf(t[0])>=0&&(t=t.slice(1)),\".inf\"===t?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:\".nan\"===t?NaN:n*parseFloat(t,10)},predicate:function(e){return\"[object Number]\"===Object.prototype.toString.call(e)&&(e%1!=0||o.isNegativeZero(e))},represent:function(e,t){var n;if(isNaN(e))switch(t){case\"lowercase\":return\".nan\";case\"uppercase\":return\".NAN\";case\"camelcase\":return\".NaN\"}else if(Number.POSITIVE_INFINITY===e)switch(t){case\"lowercase\":return\".inf\";case\"uppercase\":return\".INF\";case\"camelcase\":return\".Inf\"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case\"lowercase\":return\"-.inf\";case\"uppercase\":return\"-.INF\";case\"camelcase\":return\"-.Inf\"}else if(o.isNegativeZero(e))return\"-0.0\";return n=e.toString(10),k.test(n)?n.replace(\"e\",\".e\"):n},defaultStyle:\"lowercase\"}),j=_.extend({implicit:[w,x,C,O]}),T=j,I=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\"),P=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");var N=new h(\"tag:yaml.org,2002:timestamp\",{kind:\"scalar\",resolve:function(e){return null!==e&&(null!==I.exec(e)||null!==P.exec(e))},construct:function(e){var t,n,r,o,a,i,s,u,c=0,l=null;if(null===(t=I.exec(e))&&(t=P.exec(e)),null===t)throw new Error(\"Date resolve error\");if(n=+t[1],r=+t[2]-1,o=+t[3],!t[4])return new Date(Date.UTC(n,r,o));if(a=+t[4],i=+t[5],s=+t[6],t[7]){for(c=t[7].slice(0,3);c.length<3;)c+=\"0\";c=+c}return t[9]&&(l=6e4*(60*+t[10]+ +(t[11]||0)),\"-\"===t[9]&&(l=-l)),u=new Date(Date.UTC(n,r,o,a,i,s,c)),l&&u.setTime(u.getTime()-l),u},instanceOf:Date,represent:function(e){return e.toISOString()}});var M=new h(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:function(e){return\"<<\"===e||null===e}}),R=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r\";var D=new h(\"tag:yaml.org,2002:binary\",{kind:\"scalar\",resolve:function(e){if(null===e)return!1;var t,n,r=0,o=e.length,a=R;for(n=0;n<o;n++)if(!((t=a.indexOf(e.charAt(n)))>64)){if(t<0)return!1;r+=6}return r%8==0},construct:function(e){var t,n,r=e.replace(/[\\r\\n=]/g,\"\"),o=r.length,a=R,i=0,s=[];for(t=0;t<o;t++)t%4==0&&t&&(s.push(i>>16&255),s.push(i>>8&255),s.push(255&i)),i=i<<6|a.indexOf(r.charAt(t));return 0===(n=o%4*6)?(s.push(i>>16&255),s.push(i>>8&255),s.push(255&i)):18===n?(s.push(i>>10&255),s.push(i>>2&255)):12===n&&s.push(i>>4&255),new Uint8Array(s)},predicate:function(e){return\"[object Uint8Array]\"===Object.prototype.toString.call(e)},represent:function(e){var t,n,r=\"\",o=0,a=e.length,i=R;for(t=0;t<a;t++)t%3==0&&t&&(r+=i[o>>18&63],r+=i[o>>12&63],r+=i[o>>6&63],r+=i[63&o]),o=(o<<8)+e[t];return 0===(n=a%3)?(r+=i[o>>18&63],r+=i[o>>12&63],r+=i[o>>6&63],r+=i[63&o]):2===n?(r+=i[o>>10&63],r+=i[o>>4&63],r+=i[o<<2&63],r+=i[64]):1===n&&(r+=i[o>>2&63],r+=i[o<<4&63],r+=i[64],r+=i[64]),r}}),L=Object.prototype.hasOwnProperty,B=Object.prototype.toString;var F=new h(\"tag:yaml.org,2002:omap\",{kind:\"sequence\",resolve:function(e){if(null===e)return!0;var t,n,r,o,a,i=[],s=e;for(t=0,n=s.length;t<n;t+=1){if(r=s[t],a=!1,\"[object Object]\"!==B.call(r))return!1;for(o in r)if(L.call(r,o)){if(a)return!1;a=!0}if(!a)return!1;if(-1!==i.indexOf(o))return!1;i.push(o)}return!0},construct:function(e){return null!==e?e:[]}}),U=Object.prototype.toString;var q=new h(\"tag:yaml.org,2002:pairs\",{kind:\"sequence\",resolve:function(e){if(null===e)return!0;var t,n,r,o,a,i=e;for(a=new Array(i.length),t=0,n=i.length;t<n;t+=1){if(r=i[t],\"[object Object]\"!==U.call(r))return!1;if(1!==(o=Object.keys(r)).length)return!1;a[t]=[o[0],r[o[0]]]}return!0},construct:function(e){if(null===e)return[];var t,n,r,o,a,i=e;for(a=new Array(i.length),t=0,n=i.length;t<n;t+=1)r=i[t],o=Object.keys(r),a[t]=[o[0],r[o[0]]];return a}}),z=Object.prototype.hasOwnProperty;var V=new h(\"tag:yaml.org,2002:set\",{kind:\"mapping\",resolve:function(e){if(null===e)return!0;var t,n=e;for(t in n)if(z.call(n,t)&&null!==n[t])return!1;return!0},construct:function(e){return null!==e?e:{}}}),W=T.extend({implicit:[N,M],explicit:[D,F,q,V]}),H=Object.prototype.hasOwnProperty,$=/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,J=/[\\x85\\u2028\\u2029]/,K=/[,\\[\\]\\{\\}]/,Y=/^(?:!|!!|![a-z\\-]+!)$/i,G=/^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;function Z(e){return Object.prototype.toString.call(e)}function X(e){return 10===e||13===e}function Q(e){return 9===e||32===e}function ee(e){return 9===e||32===e||10===e||13===e}function te(e){return 44===e||91===e||93===e||123===e||125===e}function ne(e){var t;return 48<=e&&e<=57?e-48:97<=(t=32|e)&&t<=102?t-97+10:-1}function re(e){return 48===e?\"\\0\":97===e?\"\u0007\":98===e?\"\\b\":116===e||9===e?\"\\t\":110===e?\"\\n\":118===e?\"\\v\":102===e?\"\\f\":114===e?\"\\r\":101===e?\"\u001b\":32===e?\" \":34===e?'\"':47===e?\"/\":92===e?\"\\\\\":78===e?\"\":95===e?\" \":76===e?\"\\u2028\":80===e?\"\\u2029\":\"\"}function oe(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(55296+(e-65536>>10),56320+(e-65536&1023))}for(var ae=new Array(256),ie=new Array(256),se=0;se<256;se++)ae[se]=re(se)?1:0,ie[se]=re(se);function ue(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||W,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function ce(e,t){var n={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return n.snippet=l(n),new s(t,n)}function le(e,t){throw ce(e,t)}function pe(e,t){e.onWarning&&e.onWarning.call(null,ce(e,t))}var fe={YAML:function(e,t,n){var r,o,a;null!==e.version&&le(e,\"duplication of %YAML directive\"),1!==n.length&&le(e,\"YAML directive accepts exactly one argument\"),null===(r=/^([0-9]+)\\.([0-9]+)$/.exec(n[0]))&&le(e,\"ill-formed argument of the YAML directive\"),o=parseInt(r[1],10),a=parseInt(r[2],10),1!==o&&le(e,\"unacceptable YAML version of the document\"),e.version=n[0],e.checkLineBreaks=a<2,1!==a&&2!==a&&pe(e,\"unsupported YAML version of the document\")},TAG:function(e,t,n){var r,o;2!==n.length&&le(e,\"TAG directive accepts exactly two arguments\"),r=n[0],o=n[1],Y.test(r)||le(e,\"ill-formed tag handle (first argument) of the TAG directive\"),H.call(e.tagMap,r)&&le(e,'there is a previously declared suffix for \"'+r+'\" tag handle'),G.test(o)||le(e,\"ill-formed tag prefix (second argument) of the TAG directive\");try{o=decodeURIComponent(o)}catch(t){le(e,\"tag prefix is malformed: \"+o)}e.tagMap[r]=o}};function he(e,t,n,r){var o,a,i,s;if(t<n){if(s=e.input.slice(t,n),r)for(o=0,a=s.length;o<a;o+=1)9===(i=s.charCodeAt(o))||32<=i&&i<=1114111||le(e,\"expected valid JSON character\");else $.test(s)&&le(e,\"the stream contains non-printable characters\");e.result+=s}}function de(e,t,n,r){var a,i,s,u;for(o.isObject(n)||le(e,\"cannot merge mappings; the provided source object is unacceptable\"),s=0,u=(a=Object.keys(n)).length;s<u;s+=1)i=a[s],H.call(t,i)||(t[i]=n[i],r[i]=!0)}function me(e,t,n,r,o,a,i,s,u){var c,l;if(Array.isArray(o))for(c=0,l=(o=Array.prototype.slice.call(o)).length;c<l;c+=1)Array.isArray(o[c])&&le(e,\"nested arrays are not supported inside keys\"),\"object\"==typeof o&&\"[object Object]\"===Z(o[c])&&(o[c]=\"[object Object]\");if(\"object\"==typeof o&&\"[object Object]\"===Z(o)&&(o=\"[object Object]\"),o=String(o),null===t&&(t={}),\"tag:yaml.org,2002:merge\"===r)if(Array.isArray(a))for(c=0,l=a.length;c<l;c+=1)de(e,t,a[c],n);else de(e,t,a,n);else e.json||H.call(n,o)||!H.call(t,o)||(e.line=i||e.line,e.lineStart=s||e.lineStart,e.position=u||e.position,le(e,\"duplicated mapping key\")),\"__proto__\"===o?Object.defineProperty(t,o,{configurable:!0,enumerable:!0,writable:!0,value:a}):t[o]=a,delete n[o];return t}function ve(e){var t;10===(t=e.input.charCodeAt(e.position))?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):le(e,\"a line break is expected\"),e.line+=1,e.lineStart=e.position,e.firstTabInLine=-1}function ge(e,t,n){for(var r=0,o=e.input.charCodeAt(e.position);0!==o;){for(;Q(o);)9===o&&-1===e.firstTabInLine&&(e.firstTabInLine=e.position),o=e.input.charCodeAt(++e.position);if(t&&35===o)do{o=e.input.charCodeAt(++e.position)}while(10!==o&&13!==o&&0!==o);if(!X(o))break;for(ve(e),o=e.input.charCodeAt(e.position),r++,e.lineIndent=0;32===o;)e.lineIndent++,o=e.input.charCodeAt(++e.position)}return-1!==n&&0!==r&&e.lineIndent<n&&pe(e,\"deficient indentation\"),r}function ye(e){var t,n=e.position;return!(45!==(t=e.input.charCodeAt(n))&&46!==t||t!==e.input.charCodeAt(n+1)||t!==e.input.charCodeAt(n+2)||(n+=3,0!==(t=e.input.charCodeAt(n))&&!ee(t)))}function be(e,t){1===t?e.result+=\" \":t>1&&(e.result+=o.repeat(\"\\n\",t-1))}function _e(e,t){var n,r,o=e.tag,a=e.anchor,i=[],s=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=i),r=e.input.charCodeAt(e.position);0!==r&&(-1!==e.firstTabInLine&&(e.position=e.firstTabInLine,le(e,\"tab characters must not be used in indentation\")),45===r)&&ee(e.input.charCodeAt(e.position+1));)if(s=!0,e.position++,ge(e,!0,-1)&&e.lineIndent<=t)i.push(null),r=e.input.charCodeAt(e.position);else if(n=e.line,Ee(e,t,3,!1,!0),i.push(e.result),ge(e,!0,-1),r=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==r)le(e,\"bad indentation of a sequence entry\");else if(e.lineIndent<t)break;return!!s&&(e.tag=o,e.anchor=a,e.kind=\"sequence\",e.result=i,!0)}function we(e){var t,n,r,o,a=!1,i=!1;if(33!==(o=e.input.charCodeAt(e.position)))return!1;if(null!==e.tag&&le(e,\"duplication of a tag property\"),60===(o=e.input.charCodeAt(++e.position))?(a=!0,o=e.input.charCodeAt(++e.position)):33===o?(i=!0,n=\"!!\",o=e.input.charCodeAt(++e.position)):n=\"!\",t=e.position,a){do{o=e.input.charCodeAt(++e.position)}while(0!==o&&62!==o);e.position<e.length?(r=e.input.slice(t,e.position),o=e.input.charCodeAt(++e.position)):le(e,\"unexpected end of the stream within a verbatim tag\")}else{for(;0!==o&&!ee(o);)33===o&&(i?le(e,\"tag suffix cannot contain exclamation marks\"):(n=e.input.slice(t-1,e.position+1),Y.test(n)||le(e,\"named tag handle cannot contain such characters\"),i=!0,t=e.position+1)),o=e.input.charCodeAt(++e.position);r=e.input.slice(t,e.position),K.test(r)&&le(e,\"tag suffix cannot contain flow indicator characters\")}r&&!G.test(r)&&le(e,\"tag name cannot contain such characters: \"+r);try{r=decodeURIComponent(r)}catch(t){le(e,\"tag name is malformed: \"+r)}return a?e.tag=r:H.call(e.tagMap,n)?e.tag=e.tagMap[n]+r:\"!\"===n?e.tag=\"!\"+r:\"!!\"===n?e.tag=\"tag:yaml.org,2002:\"+r:le(e,'undeclared tag handle \"'+n+'\"'),!0}function xe(e){var t,n;if(38!==(n=e.input.charCodeAt(e.position)))return!1;for(null!==e.anchor&&le(e,\"duplication of an anchor property\"),n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!ee(n)&&!te(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&le(e,\"name of an anchor node must contain at least one character\"),e.anchor=e.input.slice(t,e.position),!0}function Ee(e,t,n,r,a){var i,s,u,c,l,p,f,h,d,m=1,v=!1,g=!1;if(null!==e.listener&&e.listener(\"open\",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null,i=s=u=4===n||3===n,r&&ge(e,!0,-1)&&(v=!0,e.lineIndent>t?m=1:e.lineIndent===t?m=0:e.lineIndent<t&&(m=-1)),1===m)for(;we(e)||xe(e);)ge(e,!0,-1)?(v=!0,u=i,e.lineIndent>t?m=1:e.lineIndent===t?m=0:e.lineIndent<t&&(m=-1)):u=!1;if(u&&(u=v||a),1!==m&&4!==n||(h=1===n||2===n?t:t+1,d=e.position-e.lineStart,1===m?u&&(_e(e,d)||function(e,t,n){var r,o,a,i,s,u,c,l=e.tag,p=e.anchor,f={},h=Object.create(null),d=null,m=null,v=null,g=!1,y=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=f),c=e.input.charCodeAt(e.position);0!==c;){if(g||-1===e.firstTabInLine||(e.position=e.firstTabInLine,le(e,\"tab characters must not be used in indentation\")),r=e.input.charCodeAt(e.position+1),a=e.line,63!==c&&58!==c||!ee(r)){if(i=e.line,s=e.lineStart,u=e.position,!Ee(e,n,2,!1,!0))break;if(e.line===a){for(c=e.input.charCodeAt(e.position);Q(c);)c=e.input.charCodeAt(++e.position);if(58===c)ee(c=e.input.charCodeAt(++e.position))||le(e,\"a whitespace character is expected after the key-value separator within a block mapping\"),g&&(me(e,f,h,d,m,null,i,s,u),d=m=v=null),y=!0,g=!1,o=!1,d=e.tag,m=e.result;else{if(!y)return e.tag=l,e.anchor=p,!0;le(e,\"can not read an implicit mapping pair; a colon is missed\")}}else{if(!y)return e.tag=l,e.anchor=p,!0;le(e,\"can not read a block mapping entry; a multiline key may not be an implicit key\")}}else 63===c?(g&&(me(e,f,h,d,m,null,i,s,u),d=m=v=null),y=!0,g=!0,o=!0):g?(g=!1,o=!0):le(e,\"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line\"),e.position+=1,c=r;if((e.line===a||e.lineIndent>t)&&(g&&(i=e.line,s=e.lineStart,u=e.position),Ee(e,t,4,!0,o)&&(g?m=e.result:v=e.result),g||(me(e,f,h,d,m,v,i,s,u),d=m=v=null),ge(e,!0,-1),c=e.input.charCodeAt(e.position)),(e.line===a||e.lineIndent>t)&&0!==c)le(e,\"bad indentation of a mapping entry\");else if(e.lineIndent<t)break}return g&&me(e,f,h,d,m,null,i,s,u),y&&(e.tag=l,e.anchor=p,e.kind=\"mapping\",e.result=f),y}(e,d,h))||function(e,t){var n,r,o,a,i,s,u,c,l,p,f,h,d=!0,m=e.tag,v=e.anchor,g=Object.create(null);if(91===(h=e.input.charCodeAt(e.position)))i=93,c=!1,a=[];else{if(123!==h)return!1;i=125,c=!0,a={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=a),h=e.input.charCodeAt(++e.position);0!==h;){if(ge(e,!0,t),(h=e.input.charCodeAt(e.position))===i)return e.position++,e.tag=m,e.anchor=v,e.kind=c?\"mapping\":\"sequence\",e.result=a,!0;d?44===h&&le(e,\"expected the node content, but found ','\"):le(e,\"missed comma between flow collection entries\"),f=null,s=u=!1,63===h&&ee(e.input.charCodeAt(e.position+1))&&(s=u=!0,e.position++,ge(e,!0,t)),n=e.line,r=e.lineStart,o=e.position,Ee(e,t,1,!1,!0),p=e.tag,l=e.result,ge(e,!0,t),h=e.input.charCodeAt(e.position),!u&&e.line!==n||58!==h||(s=!0,h=e.input.charCodeAt(++e.position),ge(e,!0,t),Ee(e,t,1,!1,!0),f=e.result),c?me(e,a,g,p,l,f,n,r,o):s?a.push(me(e,null,g,p,l,f,n,r,o)):a.push(l),ge(e,!0,t),44===(h=e.input.charCodeAt(e.position))?(d=!0,h=e.input.charCodeAt(++e.position)):d=!1}le(e,\"unexpected end of the stream within a flow collection\")}(e,h)?g=!0:(s&&function(e,t){var n,r,a,i,s,u=1,c=!1,l=!1,p=t,f=0,h=!1;if(124===(i=e.input.charCodeAt(e.position)))r=!1;else{if(62!==i)return!1;r=!0}for(e.kind=\"scalar\",e.result=\"\";0!==i;)if(43===(i=e.input.charCodeAt(++e.position))||45===i)1===u?u=43===i?3:2:le(e,\"repeat of a chomping mode identifier\");else{if(!((a=48<=(s=i)&&s<=57?s-48:-1)>=0))break;0===a?le(e,\"bad explicit indentation width of a block scalar; it cannot be less than one\"):l?le(e,\"repeat of an indentation width identifier\"):(p=t+a-1,l=!0)}if(Q(i)){do{i=e.input.charCodeAt(++e.position)}while(Q(i));if(35===i)do{i=e.input.charCodeAt(++e.position)}while(!X(i)&&0!==i)}for(;0!==i;){for(ve(e),e.lineIndent=0,i=e.input.charCodeAt(e.position);(!l||e.lineIndent<p)&&32===i;)e.lineIndent++,i=e.input.charCodeAt(++e.position);if(!l&&e.lineIndent>p&&(p=e.lineIndent),X(i))f++;else{if(e.lineIndent<p){3===u?e.result+=o.repeat(\"\\n\",c?1+f:f):1===u&&c&&(e.result+=\"\\n\");break}for(r?Q(i)?(h=!0,e.result+=o.repeat(\"\\n\",c?1+f:f)):h?(h=!1,e.result+=o.repeat(\"\\n\",f+1)):0===f?c&&(e.result+=\" \"):e.result+=o.repeat(\"\\n\",f):e.result+=o.repeat(\"\\n\",c?1+f:f),c=!0,l=!0,f=0,n=e.position;!X(i)&&0!==i;)i=e.input.charCodeAt(++e.position);he(e,n,e.position,!1)}}return!0}(e,h)||function(e,t){var n,r,o;if(39!==(n=e.input.charCodeAt(e.position)))return!1;for(e.kind=\"scalar\",e.result=\"\",e.position++,r=o=e.position;0!==(n=e.input.charCodeAt(e.position));)if(39===n){if(he(e,r,e.position,!0),39!==(n=e.input.charCodeAt(++e.position)))return!0;r=e.position,e.position++,o=e.position}else X(n)?(he(e,r,o,!0),be(e,ge(e,!1,t)),r=o=e.position):e.position===e.lineStart&&ye(e)?le(e,\"unexpected end of the document within a single quoted scalar\"):(e.position++,o=e.position);le(e,\"unexpected end of the stream within a single quoted scalar\")}(e,h)||function(e,t){var n,r,o,a,i,s,u;if(34!==(s=e.input.charCodeAt(e.position)))return!1;for(e.kind=\"scalar\",e.result=\"\",e.position++,n=r=e.position;0!==(s=e.input.charCodeAt(e.position));){if(34===s)return he(e,n,e.position,!0),e.position++,!0;if(92===s){if(he(e,n,e.position,!0),X(s=e.input.charCodeAt(++e.position)))ge(e,!1,t);else if(s<256&&ae[s])e.result+=ie[s],e.position++;else if((i=120===(u=s)?2:117===u?4:85===u?8:0)>0){for(o=i,a=0;o>0;o--)(i=ne(s=e.input.charCodeAt(++e.position)))>=0?a=(a<<4)+i:le(e,\"expected hexadecimal character\");e.result+=oe(a),e.position++}else le(e,\"unknown escape sequence\");n=r=e.position}else X(s)?(he(e,n,r,!0),be(e,ge(e,!1,t)),n=r=e.position):e.position===e.lineStart&&ye(e)?le(e,\"unexpected end of the document within a double quoted scalar\"):(e.position++,r=e.position)}le(e,\"unexpected end of the stream within a double quoted scalar\")}(e,h)?g=!0:!function(e){var t,n,r;if(42!==(r=e.input.charCodeAt(e.position)))return!1;for(r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!ee(r)&&!te(r);)r=e.input.charCodeAt(++e.position);return e.position===t&&le(e,\"name of an alias node must contain at least one character\"),n=e.input.slice(t,e.position),H.call(e.anchorMap,n)||le(e,'unidentified alias \"'+n+'\"'),e.result=e.anchorMap[n],ge(e,!0,-1),!0}(e)?function(e,t,n){var r,o,a,i,s,u,c,l,p=e.kind,f=e.result;if(ee(l=e.input.charCodeAt(e.position))||te(l)||35===l||38===l||42===l||33===l||124===l||62===l||39===l||34===l||37===l||64===l||96===l)return!1;if((63===l||45===l)&&(ee(r=e.input.charCodeAt(e.position+1))||n&&te(r)))return!1;for(e.kind=\"scalar\",e.result=\"\",o=a=e.position,i=!1;0!==l;){if(58===l){if(ee(r=e.input.charCodeAt(e.position+1))||n&&te(r))break}else if(35===l){if(ee(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&ye(e)||n&&te(l))break;if(X(l)){if(s=e.line,u=e.lineStart,c=e.lineIndent,ge(e,!1,-1),e.lineIndent>=t){i=!0,l=e.input.charCodeAt(e.position);continue}e.position=a,e.line=s,e.lineStart=u,e.lineIndent=c;break}}i&&(he(e,o,a,!1),be(e,e.line-s),o=a=e.position,i=!1),Q(l)||(a=e.position+1),l=e.input.charCodeAt(++e.position)}return he(e,o,a,!1),!!e.result||(e.kind=p,e.result=f,!1)}(e,h,1===n)&&(g=!0,null===e.tag&&(e.tag=\"?\")):(g=!0,null===e.tag&&null===e.anchor||le(e,\"alias node should not have any properties\")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===m&&(g=u&&_e(e,d))),null===e.tag)null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);else if(\"?\"===e.tag){for(null!==e.result&&\"scalar\"!==e.kind&&le(e,'unacceptable node kind for !<?> tag; it should be \"scalar\", not \"'+e.kind+'\"'),c=0,l=e.implicitTypes.length;c<l;c+=1)if((f=e.implicitTypes[c]).resolve(e.result)){e.result=f.construct(e.result),e.tag=f.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else if(\"!\"!==e.tag){if(H.call(e.typeMap[e.kind||\"fallback\"],e.tag))f=e.typeMap[e.kind||\"fallback\"][e.tag];else for(f=null,c=0,l=(p=e.typeMap.multi[e.kind||\"fallback\"]).length;c<l;c+=1)if(e.tag.slice(0,p[c].tag.length)===p[c].tag){f=p[c];break}f||le(e,\"unknown tag !<\"+e.tag+\">\"),null!==e.result&&f.kind!==e.kind&&le(e,\"unacceptable node kind for !<\"+e.tag+'> tag; it should be \"'+f.kind+'\", not \"'+e.kind+'\"'),f.resolve(e.result,e.tag)?(e.result=f.construct(e.result,e.tag),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):le(e,\"cannot resolve a node with !<\"+e.tag+\"> explicit tag\")}return null!==e.listener&&e.listener(\"close\",e),null!==e.tag||null!==e.anchor||g}function Se(e){var t,n,r,o,a=e.position,i=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);0!==(o=e.input.charCodeAt(e.position))&&(ge(e,!0,-1),o=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==o));){for(i=!0,o=e.input.charCodeAt(++e.position),t=e.position;0!==o&&!ee(o);)o=e.input.charCodeAt(++e.position);for(r=[],(n=e.input.slice(t,e.position)).length<1&&le(e,\"directive name must not be less than one character in length\");0!==o;){for(;Q(o);)o=e.input.charCodeAt(++e.position);if(35===o){do{o=e.input.charCodeAt(++e.position)}while(0!==o&&!X(o));break}if(X(o))break;for(t=e.position;0!==o&&!ee(o);)o=e.input.charCodeAt(++e.position);r.push(e.input.slice(t,e.position))}0!==o&&ve(e),H.call(fe,n)?fe[n](e,n,r):pe(e,'unknown document directive \"'+n+'\"')}ge(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,ge(e,!0,-1)):i&&le(e,\"directives end mark is expected\"),Ee(e,e.lineIndent-1,4,!1,!0),ge(e,!0,-1),e.checkLineBreaks&&J.test(e.input.slice(a,e.position))&&pe(e,\"non-ASCII line breaks are interpreted as content\"),e.documents.push(e.result),e.position===e.lineStart&&ye(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,ge(e,!0,-1)):e.position<e.length-1&&le(e,\"end of the stream or a document separator is expected\")}function Ce(e,t){t=t||{},0!==(e=String(e)).length&&(10!==e.charCodeAt(e.length-1)&&13!==e.charCodeAt(e.length-1)&&(e+=\"\\n\"),65279===e.charCodeAt(0)&&(e=e.slice(1)));var n=new ue(e,t),r=e.indexOf(\"\\0\");for(-1!==r&&(n.position=r,le(n,\"null byte is not allowed in input\")),n.input+=\"\\0\";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)Se(n);return n.documents}var Ae={loadAll:function(e,t,n){null!==t&&\"object\"==typeof t&&void 0===n&&(n=t,t=null);var r=Ce(e,n);if(\"function\"!=typeof t)return r;for(var o=0,a=r.length;o<a;o+=1)t(r[o])},load:function(e,t){var n=Ce(e,t);if(0!==n.length){if(1===n.length)return n[0];throw new s(\"expected a single document in the stream, but found more\")}}},ke=Object.prototype.toString,Oe=Object.prototype.hasOwnProperty,je=65279,Te={0:\"\\\\0\",7:\"\\\\a\",8:\"\\\\b\",9:\"\\\\t\",10:\"\\\\n\",11:\"\\\\v\",12:\"\\\\f\",13:\"\\\\r\",27:\"\\\\e\",34:'\\\\\"',92:\"\\\\\\\\\",133:\"\\\\N\",160:\"\\\\_\",8232:\"\\\\L\",8233:\"\\\\P\"},Ie=[\"y\",\"Y\",\"yes\",\"Yes\",\"YES\",\"on\",\"On\",\"ON\",\"n\",\"N\",\"no\",\"No\",\"NO\",\"off\",\"Off\",\"OFF\"],Pe=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;function Ne(e){var t,n,r;if(t=e.toString(16).toUpperCase(),e<=255)n=\"x\",r=2;else if(e<=65535)n=\"u\",r=4;else{if(!(e<=4294967295))throw new s(\"code point within a string may not be greater than 0xFFFFFFFF\");n=\"U\",r=8}return\"\\\\\"+n+o.repeat(\"0\",r-t.length)+t}function Me(e){this.schema=e.schema||W,this.indent=Math.max(1,e.indent||2),this.noArrayIndent=e.noArrayIndent||!1,this.skipInvalid=e.skipInvalid||!1,this.flowLevel=o.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=function(e,t){var n,r,o,a,i,s,u;if(null===t)return{};for(n={},o=0,a=(r=Object.keys(t)).length;o<a;o+=1)i=r[o],s=String(t[i]),\"!!\"===i.slice(0,2)&&(i=\"tag:yaml.org,2002:\"+i.slice(2)),(u=e.compiledTypeMap.fallback[i])&&Oe.call(u.styleAliases,s)&&(s=u.styleAliases[s]),n[i]=s;return n}(this.schema,e.styles||null),this.sortKeys=e.sortKeys||!1,this.lineWidth=e.lineWidth||80,this.noRefs=e.noRefs||!1,this.noCompatMode=e.noCompatMode||!1,this.condenseFlow=e.condenseFlow||!1,this.quotingType='\"'===e.quotingType?2:1,this.forceQuotes=e.forceQuotes||!1,this.replacer=\"function\"==typeof e.replacer?e.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result=\"\",this.duplicates=[],this.usedDuplicates=null}function Re(e,t){for(var n,r=o.repeat(\" \",t),a=0,i=-1,s=\"\",u=e.length;a<u;)-1===(i=e.indexOf(\"\\n\",a))?(n=e.slice(a),a=u):(n=e.slice(a,i+1),a=i+1),n.length&&\"\\n\"!==n&&(s+=r),s+=n;return s}function De(e,t){return\"\\n\"+o.repeat(\" \",e.indent*t)}function Le(e){return 32===e||9===e}function Be(e){return 32<=e&&e<=126||161<=e&&e<=55295&&8232!==e&&8233!==e||57344<=e&&e<=65533&&e!==je||65536<=e&&e<=1114111}function Fe(e){return Be(e)&&e!==je&&13!==e&&10!==e}function Ue(e,t,n){var r=Fe(e),o=r&&!Le(e);return(n?r:r&&44!==e&&91!==e&&93!==e&&123!==e&&125!==e)&&35!==e&&!(58===t&&!o)||Fe(t)&&!Le(t)&&35===e||58===t&&o}function qe(e,t){var n,r=e.charCodeAt(t);return r>=55296&&r<=56319&&t+1<e.length&&(n=e.charCodeAt(t+1))>=56320&&n<=57343?1024*(r-55296)+n-56320+65536:r}function ze(e){return/^\\n* /.test(e)}function Ve(e,t,n,r,o,a,i,s){var u,c,l=0,p=null,f=!1,h=!1,d=-1!==r,m=-1,v=Be(c=qe(e,0))&&c!==je&&!Le(c)&&45!==c&&63!==c&&58!==c&&44!==c&&91!==c&&93!==c&&123!==c&&125!==c&&35!==c&&38!==c&&42!==c&&33!==c&&124!==c&&61!==c&&62!==c&&39!==c&&34!==c&&37!==c&&64!==c&&96!==c&&function(e){return!Le(e)&&58!==e}(qe(e,e.length-1));if(t||i)for(u=0;u<e.length;l>=65536?u+=2:u++){if(!Be(l=qe(e,u)))return 5;v=v&&Ue(l,p,s),p=l}else{for(u=0;u<e.length;l>=65536?u+=2:u++){if(10===(l=qe(e,u)))f=!0,d&&(h=h||u-m-1>r&&\" \"!==e[m+1],m=u);else if(!Be(l))return 5;v=v&&Ue(l,p,s),p=l}h=h||d&&u-m-1>r&&\" \"!==e[m+1]}return f||h?n>9&&ze(e)?5:i?2===a?5:2:h?4:3:!v||i||o(e)?2===a?5:2:1}function We(e,t,n,r,o){e.dump=function(){if(0===t.length)return 2===e.quotingType?'\"\"':\"''\";if(!e.noCompatMode&&(-1!==Ie.indexOf(t)||Pe.test(t)))return 2===e.quotingType?'\"'+t+'\"':\"'\"+t+\"'\";var a=e.indent*Math.max(1,n),i=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-a),u=r||e.flowLevel>-1&&n>=e.flowLevel;switch(Ve(t,u,e.indent,i,(function(t){return function(e,t){var n,r;for(n=0,r=e.implicitTypes.length;n<r;n+=1)if(e.implicitTypes[n].resolve(t))return!0;return!1}(e,t)}),e.quotingType,e.forceQuotes&&!r,o)){case 1:return t;case 2:return\"'\"+t.replace(/'/g,\"''\")+\"'\";case 3:return\"|\"+He(t,e.indent)+$e(Re(t,a));case 4:return\">\"+He(t,e.indent)+$e(Re(function(e,t){var n,r,o=/(\\n+)([^\\n]*)/g,a=(s=e.indexOf(\"\\n\"),s=-1!==s?s:e.length,o.lastIndex=s,Je(e.slice(0,s),t)),i=\"\\n\"===e[0]||\" \"===e[0];var s;for(;r=o.exec(e);){var u=r[1],c=r[2];n=\" \"===c[0],a+=u+(i||n||\"\"===c?\"\":\"\\n\")+Je(c,t),i=n}return a}(t,i),a));case 5:return'\"'+function(e){for(var t,n=\"\",r=0,o=0;o<e.length;r>=65536?o+=2:o++)r=qe(e,o),!(t=Te[r])&&Be(r)?(n+=e[o],r>=65536&&(n+=e[o+1])):n+=t||Ne(r);return n}(t)+'\"';default:throw new s(\"impossible error: invalid scalar style\")}}()}function He(e,t){var n=ze(e)?String(t):\"\",r=\"\\n\"===e[e.length-1];return n+(r&&(\"\\n\"===e[e.length-2]||\"\\n\"===e)?\"+\":r?\"\":\"-\")+\"\\n\"}function $e(e){return\"\\n\"===e[e.length-1]?e.slice(0,-1):e}function Je(e,t){if(\"\"===e||\" \"===e[0])return e;for(var n,r,o=/ [^ ]/g,a=0,i=0,s=0,u=\"\";n=o.exec(e);)(s=n.index)-a>t&&(r=i>a?i:s,u+=\"\\n\"+e.slice(a,r),a=r+1),i=s;return u+=\"\\n\",e.length-a>t&&i>a?u+=e.slice(a,i)+\"\\n\"+e.slice(i+1):u+=e.slice(a),u.slice(1)}function Ke(e,t,n,r){var o,a,i,s=\"\",u=e.tag;for(o=0,a=n.length;o<a;o+=1)i=n[o],e.replacer&&(i=e.replacer.call(n,String(o),i)),(Ge(e,t+1,i,!0,!0,!1,!0)||void 0===i&&Ge(e,t+1,null,!0,!0,!1,!0))&&(r&&\"\"===s||(s+=De(e,t)),e.dump&&10===e.dump.charCodeAt(0)?s+=\"-\":s+=\"- \",s+=e.dump);e.tag=u,e.dump=s||\"[]\"}function Ye(e,t,n){var r,o,a,i,u,c;for(a=0,i=(o=n?e.explicitTypes:e.implicitTypes).length;a<i;a+=1)if(((u=o[a]).instanceOf||u.predicate)&&(!u.instanceOf||\"object\"==typeof t&&t instanceof u.instanceOf)&&(!u.predicate||u.predicate(t))){if(n?u.multi&&u.representName?e.tag=u.representName(t):e.tag=u.tag:e.tag=\"?\",u.represent){if(c=e.styleMap[u.tag]||u.defaultStyle,\"[object Function]\"===ke.call(u.represent))r=u.represent(t,c);else{if(!Oe.call(u.represent,c))throw new s(\"!<\"+u.tag+'> tag resolver accepts not \"'+c+'\" style');r=u.represent[c](t,c)}e.dump=r}return!0}return!1}function Ge(e,t,n,r,o,a,i){e.tag=null,e.dump=n,Ye(e,n,!1)||Ye(e,n,!0);var u,c=ke.call(e.dump),l=r;r&&(r=e.flowLevel<0||e.flowLevel>t);var p,f,h=\"[object Object]\"===c||\"[object Array]\"===c;if(h&&(f=-1!==(p=e.duplicates.indexOf(n))),(null!==e.tag&&\"?\"!==e.tag||f||2!==e.indent&&t>0)&&(o=!1),f&&e.usedDuplicates[p])e.dump=\"*ref_\"+p;else{if(h&&f&&!e.usedDuplicates[p]&&(e.usedDuplicates[p]=!0),\"[object Object]\"===c)r&&0!==Object.keys(e.dump).length?(!function(e,t,n,r){var o,a,i,u,c,l,p=\"\",f=e.tag,h=Object.keys(n);if(!0===e.sortKeys)h.sort();else if(\"function\"==typeof e.sortKeys)h.sort(e.sortKeys);else if(e.sortKeys)throw new s(\"sortKeys must be a boolean or a function\");for(o=0,a=h.length;o<a;o+=1)l=\"\",r&&\"\"===p||(l+=De(e,t)),u=n[i=h[o]],e.replacer&&(u=e.replacer.call(n,i,u)),Ge(e,t+1,i,!0,!0,!0)&&((c=null!==e.tag&&\"?\"!==e.tag||e.dump&&e.dump.length>1024)&&(e.dump&&10===e.dump.charCodeAt(0)?l+=\"?\":l+=\"? \"),l+=e.dump,c&&(l+=De(e,t)),Ge(e,t+1,u,!0,c)&&(e.dump&&10===e.dump.charCodeAt(0)?l+=\":\":l+=\": \",p+=l+=e.dump));e.tag=f,e.dump=p||\"{}\"}(e,t,e.dump,o),f&&(e.dump=\"&ref_\"+p+e.dump)):(!function(e,t,n){var r,o,a,i,s,u=\"\",c=e.tag,l=Object.keys(n);for(r=0,o=l.length;r<o;r+=1)s=\"\",\"\"!==u&&(s+=\", \"),e.condenseFlow&&(s+='\"'),i=n[a=l[r]],e.replacer&&(i=e.replacer.call(n,a,i)),Ge(e,t,a,!1,!1)&&(e.dump.length>1024&&(s+=\"? \"),s+=e.dump+(e.condenseFlow?'\"':\"\")+\":\"+(e.condenseFlow?\"\":\" \"),Ge(e,t,i,!1,!1)&&(u+=s+=e.dump));e.tag=c,e.dump=\"{\"+u+\"}\"}(e,t,e.dump),f&&(e.dump=\"&ref_\"+p+\" \"+e.dump));else if(\"[object Array]\"===c)r&&0!==e.dump.length?(e.noArrayIndent&&!i&&t>0?Ke(e,t-1,e.dump,o):Ke(e,t,e.dump,o),f&&(e.dump=\"&ref_\"+p+e.dump)):(!function(e,t,n){var r,o,a,i=\"\",s=e.tag;for(r=0,o=n.length;r<o;r+=1)a=n[r],e.replacer&&(a=e.replacer.call(n,String(r),a)),(Ge(e,t,a,!1,!1)||void 0===a&&Ge(e,t,null,!1,!1))&&(\"\"!==i&&(i+=\",\"+(e.condenseFlow?\"\":\" \")),i+=e.dump);e.tag=s,e.dump=\"[\"+i+\"]\"}(e,t,e.dump),f&&(e.dump=\"&ref_\"+p+\" \"+e.dump));else{if(\"[object String]\"!==c){if(\"[object Undefined]\"===c)return!1;if(e.skipInvalid)return!1;throw new s(\"unacceptable kind of an object to dump \"+c)}\"?\"!==e.tag&&We(e,e.dump,t,a,l)}null!==e.tag&&\"?\"!==e.tag&&(u=encodeURI(\"!\"===e.tag[0]?e.tag.slice(1):e.tag).replace(/!/g,\"%21\"),u=\"!\"===e.tag[0]?\"!\"+u:\"tag:yaml.org,2002:\"===u.slice(0,18)?\"!!\"+u.slice(18):\"!<\"+u+\">\",e.dump=u+\" \"+e.dump)}return!0}function Ze(e,t){var n,r,o=[],a=[];for(Xe(e,o,a),n=0,r=a.length;n<r;n+=1)t.duplicates.push(o[a[n]]);t.usedDuplicates=new Array(r)}function Xe(e,t,n){var r,o,a;if(null!==e&&\"object\"==typeof e)if(-1!==(o=t.indexOf(e)))-1===n.indexOf(o)&&n.push(o);else if(t.push(e),Array.isArray(e))for(o=0,a=e.length;o<a;o+=1)Xe(e[o],t,n);else for(o=0,a=(r=Object.keys(e)).length;o<a;o+=1)Xe(e[r[o]],t,n)}function Qe(e,t){return function(){throw new Error(\"Function yaml.\"+e+\" is removed in js-yaml 4. Use yaml.\"+t+\" instead, which is now safe by default.\")}}var et={Type:h,Schema:v,FAILSAFE_SCHEMA:_,JSON_SCHEMA:j,CORE_SCHEMA:T,DEFAULT_SCHEMA:W,load:Ae.load,loadAll:Ae.loadAll,dump:{dump:function(e,t){var n=new Me(t=t||{});n.noRefs||Ze(e,n);var r=e;return n.replacer&&(r=n.replacer.call({\"\":r},\"\",r)),Ge(n,0,r,!0,!0)?n.dump+\"\\n\":\"\"}}.dump,YAMLException:s,types:{binary:D,float:O,map:b,null:w,pairs:q,set:V,timestamp:N,bool:x,int:C,merge:M,omap:F,seq:y,str:g},safeLoad:Qe(\"safeLoad\",\"load\"),safeLoadAll:Qe(\"safeLoadAll\",\"loadAll\"),safeDump:Qe(\"safeDump\",\"dump\")};t.a=et},function(e,t,n){e.exports=n(657)},function(e,t,n){var r=n(873);function o(e,t,n,o,a,i,s){try{var u=e[i](s),c=u.value}catch(e){return void n(e)}u.done?t(c):r.resolve(c).then(o,a)}e.exports=function(e){return function(){var t=this,n=arguments;return new r((function(r,a){var i=e.apply(t,n);function s(e){o(i,r,a,s,u,\"next\",e)}function u(e){o(i,r,a,s,u,\"throw\",e)}s(void 0)}))}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e){if(\"function\"!=typeof e)throw TypeError(String(e)+\" is not a function\");return e}},function(e,t,n){var r,o,a,i=n(367),s=n(40),u=n(47),c=n(67),l=n(55),p=n(228),f=n(181),h=n(156),d=\"Object already initialized\",m=s.WeakMap;if(i||p.state){var v=p.state||(p.state=new m),g=v.get,y=v.has,b=v.set;r=function(e,t){if(y.call(v,e))throw new TypeError(d);return t.facade=e,b.call(v,e,t),t},o=function(e){return g.call(v,e)||{}},a=function(e){return y.call(v,e)}}else{var _=f(\"state\");h[_]=!0,r=function(e,t){if(l(e,_))throw new TypeError(d);return t.facade=e,c(e,_,t),t},o=function(e){return l(e,_)?e[_]:{}},a=function(e){return l(e,_)}}e.exports={set:r,get:o,has:a,enforce:function(e){return a(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!u(t)||(n=o(t)).type!==e)throw TypeError(\"Incompatible receiver, \"+e+\" required\");return n}}}},function(e,t,n){\"use strict\";function r(e){return function(){return e}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},e.exports=o},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(471),i=n(122),s=n(472),u=n(141),c=n(202),l=n(25),p=[],f=0,h=a.getPooled(),d=!1,m=null;function v(){x.ReactReconcileTransaction&&m||r(\"123\")}var g=[{initialize:function(){this.dirtyComponentsLength=p.length},close:function(){this.dirtyComponentsLength!==p.length?(p.splice(0,this.dirtyComponentsLength),w()):p.length=0}},{initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}}];function y(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=a.getPooled(),this.reconcileTransaction=x.ReactReconcileTransaction.getPooled(!0)}function b(e,t){return e._mountOrder-t._mountOrder}function _(e){var t=e.dirtyComponentsLength;t!==p.length&&r(\"124\",t,p.length),p.sort(b),f++;for(var n=0;n<t;n++){var o,a=p[n],i=a._pendingCallbacks;if(a._pendingCallbacks=null,s.logTopLevelRenders){var c=a;a._currentElement.type.isReactTopLevelWrapper&&(c=a._renderedComponent),o=\"React update: \"+c.getName(),console.time(o)}if(u.performUpdateIfNecessary(a,e.reconcileTransaction,f),o&&console.timeEnd(o),i)for(var l=0;l<i.length;l++)e.callbackQueue.enqueue(i[l],a.getPublicInstance())}}o(y.prototype,c,{getTransactionWrappers:function(){return g},destructor:function(){this.dirtyComponentsLength=null,a.release(this.callbackQueue),this.callbackQueue=null,x.ReactReconcileTransaction.release(this.reconcileTransaction),this.reconcileTransaction=null},perform:function(e,t,n){return c.perform.call(this,this.reconcileTransaction.perform,this.reconcileTransaction,e,t,n)}}),i.addPoolingTo(y);var w=function(){for(;p.length||d;){if(p.length){var e=y.getPooled();e.perform(_,null,e),y.release(e)}if(d){d=!1;var t=h;h=a.getPooled(),t.notifyAll(),a.release(t)}}};var x={ReactReconcileTransaction:null,batchedUpdates:function(e,t,n,r,o,a){return v(),m.batchedUpdates(e,t,n,r,o,a)},enqueueUpdate:function e(t){v(),m.isBatchingUpdates?(p.push(t),null==t._updateBatchNumber&&(t._updateBatchNumber=f+1)):m.batchedUpdates(e,t)},flushBatchedUpdates:w,injection:{injectReconcileTransaction:function(e){e||r(\"126\"),x.ReactReconcileTransaction=e},injectBatchingStrategy:function(e){e||r(\"127\"),\"function\"!=typeof e.batchedUpdates&&r(\"128\"),\"boolean\"!=typeof e.isBatchingUpdates&&r(\"129\"),m=e}},asap:function(e,t){l(m.isBatchingUpdates,\"ReactUpdates.asap: Can't enqueue an asap callback in a context whereupdates are not being batched.\"),h.enqueue(e,t),d=!0}};e.exports=x},function(e,t,n){\"use strict\";(function(t){function n(e){return e instanceof t||e instanceof Date||e instanceof RegExp}function r(e){if(e instanceof t){var n=t.alloc?t.alloc(e.length):new t(e.length);return e.copy(n),n}if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e);throw new Error(\"Unexpected situation\")}function o(e){var t=[];return e.forEach((function(e,a){\"object\"==typeof e&&null!==e?Array.isArray(e)?t[a]=o(e):n(e)?t[a]=r(e):t[a]=i({},e):t[a]=e})),t}function a(e,t){return\"__proto__\"===t?void 0:e[t]}var i=e.exports=function(){if(arguments.length<1||\"object\"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var e,t,s=arguments[0],u=Array.prototype.slice.call(arguments,1);return u.forEach((function(u){\"object\"!=typeof u||null===u||Array.isArray(u)||Object.keys(u).forEach((function(c){return t=a(s,c),(e=a(u,c))===s?void 0:\"object\"!=typeof e||null===e?void(s[c]=e):Array.isArray(e)?void(s[c]=o(e)):n(e)?void(s[c]=r(e)):\"object\"!=typeof t||null===t||Array.isArray(t)?void(s[c]=i({},e)):void(s[c]=i(t,e))}))})),s}}).call(this,n(73).Buffer)},function(e,t,n){e.exports=n(642)},function(e,t,n){\"use strict\";var r=n(1075),o=n(1076);function a(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}t.parse=b,t.resolve=function(e,t){return b(e,!1,!0).resolve(t)},t.resolveObject=function(e,t){return e?b(e,!1,!0).resolveObject(t):t},t.format=function(e){o.isString(e)&&(e=b(e));return e instanceof a?e.format():a.prototype.format.call(e)},t.Url=a;var i=/^([a-z0-9.+-]+:)/i,s=/:[0-9]*$/,u=/^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,c=[\"{\",\"}\",\"|\",\"\\\\\",\"^\",\"`\"].concat([\"<\",\">\",'\"',\"`\",\" \",\"\\r\",\"\\n\",\"\\t\"]),l=[\"'\"].concat(c),p=[\"%\",\"/\",\"?\",\";\",\"#\"].concat(l),f=[\"/\",\"?\",\"#\"],h=/^[+a-z0-9A-Z_-]{0,63}$/,d=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,m={javascript:!0,\"javascript:\":!0},v={javascript:!0,\"javascript:\":!0},g={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,\"http:\":!0,\"https:\":!0,\"ftp:\":!0,\"gopher:\":!0,\"file:\":!0},y=n(1077);function b(e,t,n){if(e&&o.isObject(e)&&e instanceof a)return e;var r=new a;return r.parse(e,t,n),r}a.prototype.parse=function(e,t,n){if(!o.isString(e))throw new TypeError(\"Parameter 'url' must be a string, not \"+typeof e);var a=e.indexOf(\"?\"),s=-1!==a&&a<e.indexOf(\"#\")?\"?\":\"#\",c=e.split(s);c[0]=c[0].replace(/\\\\/g,\"/\");var b=e=c.join(s);if(b=b.trim(),!n&&1===e.split(\"#\").length){var _=u.exec(b);if(_)return this.path=b,this.href=b,this.pathname=_[1],_[2]?(this.search=_[2],this.query=t?y.parse(this.search.substr(1)):this.search.substr(1)):t&&(this.search=\"\",this.query={}),this}var w=i.exec(b);if(w){var x=(w=w[0]).toLowerCase();this.protocol=x,b=b.substr(w.length)}if(n||w||b.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)){var E=\"//\"===b.substr(0,2);!E||w&&v[w]||(b=b.substr(2),this.slashes=!0)}if(!v[w]&&(E||w&&!g[w])){for(var S,C,A=-1,k=0;k<f.length;k++){-1!==(O=b.indexOf(f[k]))&&(-1===A||O<A)&&(A=O)}-1!==(C=-1===A?b.lastIndexOf(\"@\"):b.lastIndexOf(\"@\",A))&&(S=b.slice(0,C),b=b.slice(C+1),this.auth=decodeURIComponent(S)),A=-1;for(k=0;k<p.length;k++){var O;-1!==(O=b.indexOf(p[k]))&&(-1===A||O<A)&&(A=O)}-1===A&&(A=b.length),this.host=b.slice(0,A),b=b.slice(A),this.parseHost(),this.hostname=this.hostname||\"\";var j=\"[\"===this.hostname[0]&&\"]\"===this.hostname[this.hostname.length-1];if(!j)for(var T=this.hostname.split(/\\./),I=(k=0,T.length);k<I;k++){var P=T[k];if(P&&!P.match(h)){for(var N=\"\",M=0,R=P.length;M<R;M++)P.charCodeAt(M)>127?N+=\"x\":N+=P[M];if(!N.match(h)){var D=T.slice(0,k),L=T.slice(k+1),B=P.match(d);B&&(D.push(B[1]),L.unshift(B[2])),L.length&&(b=\"/\"+L.join(\".\")+b),this.hostname=D.join(\".\");break}}}this.hostname.length>255?this.hostname=\"\":this.hostname=this.hostname.toLowerCase(),j||(this.hostname=r.toASCII(this.hostname));var F=this.port?\":\"+this.port:\"\",U=this.hostname||\"\";this.host=U+F,this.href+=this.host,j&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),\"/\"!==b[0]&&(b=\"/\"+b))}if(!m[x])for(k=0,I=l.length;k<I;k++){var q=l[k];if(-1!==b.indexOf(q)){var z=encodeURIComponent(q);z===q&&(z=escape(q)),b=b.split(q).join(z)}}var V=b.indexOf(\"#\");-1!==V&&(this.hash=b.substr(V),b=b.slice(0,V));var W=b.indexOf(\"?\");if(-1!==W?(this.search=b.substr(W),this.query=b.substr(W+1),t&&(this.query=y.parse(this.query)),b=b.slice(0,W)):t&&(this.search=\"\",this.query={}),b&&(this.pathname=b),g[x]&&this.hostname&&!this.pathname&&(this.pathname=\"/\"),this.pathname||this.search){F=this.pathname||\"\";var H=this.search||\"\";this.path=F+H}return this.href=this.format(),this},a.prototype.format=function(){var e=this.auth||\"\";e&&(e=(e=encodeURIComponent(e)).replace(/%3A/i,\":\"),e+=\"@\");var t=this.protocol||\"\",n=this.pathname||\"\",r=this.hash||\"\",a=!1,i=\"\";this.host?a=e+this.host:this.hostname&&(a=e+(-1===this.hostname.indexOf(\":\")?this.hostname:\"[\"+this.hostname+\"]\"),this.port&&(a+=\":\"+this.port)),this.query&&o.isObject(this.query)&&Object.keys(this.query).length&&(i=y.stringify(this.query));var s=this.search||i&&\"?\"+i||\"\";return t&&\":\"!==t.substr(-1)&&(t+=\":\"),this.slashes||(!t||g[t])&&!1!==a?(a=\"//\"+(a||\"\"),n&&\"/\"!==n.charAt(0)&&(n=\"/\"+n)):a||(a=\"\"),r&&\"#\"!==r.charAt(0)&&(r=\"#\"+r),s&&\"?\"!==s.charAt(0)&&(s=\"?\"+s),t+a+(n=n.replace(/[?#]/g,(function(e){return encodeURIComponent(e)})))+(s=s.replace(\"#\",\"%23\"))+r},a.prototype.resolve=function(e){return this.resolveObject(b(e,!1,!0)).format()},a.prototype.resolveObject=function(e){if(o.isString(e)){var t=new a;t.parse(e,!1,!0),e=t}for(var n=new a,r=Object.keys(this),i=0;i<r.length;i++){var s=r[i];n[s]=this[s]}if(n.hash=e.hash,\"\"===e.href)return n.href=n.format(),n;if(e.slashes&&!e.protocol){for(var u=Object.keys(e),c=0;c<u.length;c++){var l=u[c];\"protocol\"!==l&&(n[l]=e[l])}return g[n.protocol]&&n.hostname&&!n.pathname&&(n.path=n.pathname=\"/\"),n.href=n.format(),n}if(e.protocol&&e.protocol!==n.protocol){if(!g[e.protocol]){for(var p=Object.keys(e),f=0;f<p.length;f++){var h=p[f];n[h]=e[h]}return n.href=n.format(),n}if(n.protocol=e.protocol,e.host||v[e.protocol])n.pathname=e.pathname;else{for(var d=(e.pathname||\"\").split(\"/\");d.length&&!(e.host=d.shift()););e.host||(e.host=\"\"),e.hostname||(e.hostname=\"\"),\"\"!==d[0]&&d.unshift(\"\"),d.length<2&&d.unshift(\"\"),n.pathname=d.join(\"/\")}if(n.search=e.search,n.query=e.query,n.host=e.host||\"\",n.auth=e.auth,n.hostname=e.hostname||e.host,n.port=e.port,n.pathname||n.search){var m=n.pathname||\"\",y=n.search||\"\";n.path=m+y}return n.slashes=n.slashes||e.slashes,n.href=n.format(),n}var b=n.pathname&&\"/\"===n.pathname.charAt(0),_=e.host||e.pathname&&\"/\"===e.pathname.charAt(0),w=_||b||n.host&&e.pathname,x=w,E=n.pathname&&n.pathname.split(\"/\")||[],S=(d=e.pathname&&e.pathname.split(\"/\")||[],n.protocol&&!g[n.protocol]);if(S&&(n.hostname=\"\",n.port=null,n.host&&(\"\"===E[0]?E[0]=n.host:E.unshift(n.host)),n.host=\"\",e.protocol&&(e.hostname=null,e.port=null,e.host&&(\"\"===d[0]?d[0]=e.host:d.unshift(e.host)),e.host=null),w=w&&(\"\"===d[0]||\"\"===E[0])),_)n.host=e.host||\"\"===e.host?e.host:n.host,n.hostname=e.hostname||\"\"===e.hostname?e.hostname:n.hostname,n.search=e.search,n.query=e.query,E=d;else if(d.length)E||(E=[]),E.pop(),E=E.concat(d),n.search=e.search,n.query=e.query;else if(!o.isNullOrUndefined(e.search)){if(S)n.hostname=n.host=E.shift(),(j=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\"))&&(n.auth=j.shift(),n.host=n.hostname=j.shift());return n.search=e.search,n.query=e.query,o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.href=n.format(),n}if(!E.length)return n.pathname=null,n.search?n.path=\"/\"+n.search:n.path=null,n.href=n.format(),n;for(var C=E.slice(-1)[0],A=(n.host||e.host||E.length>1)&&(\".\"===C||\"..\"===C)||\"\"===C,k=0,O=E.length;O>=0;O--)\".\"===(C=E[O])?E.splice(O,1):\"..\"===C?(E.splice(O,1),k++):k&&(E.splice(O,1),k--);if(!w&&!x)for(;k--;k)E.unshift(\"..\");!w||\"\"===E[0]||E[0]&&\"/\"===E[0].charAt(0)||E.unshift(\"\"),A&&\"/\"!==E.join(\"/\").substr(-1)&&E.push(\"\");var j,T=\"\"===E[0]||E[0]&&\"/\"===E[0].charAt(0);S&&(n.hostname=n.host=T?\"\":E.length?E.shift():\"\",(j=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\"))&&(n.auth=j.shift(),n.host=n.hostname=j.shift()));return(w=w||n.host&&E.length)&&!T&&E.unshift(\"\"),E.length?n.pathname=E.join(\"/\"):(n.pathname=null,n.path=null),o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},a.prototype.parseHost=function(){var e=this.host,t=s.exec(e);t&&(\":\"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"SHOW_AUTH_POPUP\",(function(){return h})),n.d(t,\"AUTHORIZE\",(function(){return d})),n.d(t,\"LOGOUT\",(function(){return m})),n.d(t,\"PRE_AUTHORIZE_OAUTH2\",(function(){return v})),n.d(t,\"AUTHORIZE_OAUTH2\",(function(){return g})),n.d(t,\"VALIDATE\",(function(){return y})),n.d(t,\"CONFIGURE_AUTH\",(function(){return b})),n.d(t,\"RESTORE_AUTHORIZATION\",(function(){return _})),n.d(t,\"showDefinitions\",(function(){return w})),n.d(t,\"authorize\",(function(){return x})),n.d(t,\"authorizeWithPersistOption\",(function(){return E})),n.d(t,\"logout\",(function(){return S})),n.d(t,\"logoutWithPersistOption\",(function(){return C})),n.d(t,\"preAuthorizeImplicit\",(function(){return A})),n.d(t,\"authorizeOauth2\",(function(){return k})),n.d(t,\"authorizeOauth2WithPersistOption\",(function(){return O})),n.d(t,\"authorizePassword\",(function(){return j})),n.d(t,\"authorizeApplication\",(function(){return T})),n.d(t,\"authorizeAccessCodeWithFormParams\",(function(){return I})),n.d(t,\"authorizeAccessCodeWithBasicAuthentication\",(function(){return P})),n.d(t,\"authorizeRequest\",(function(){return N})),n.d(t,\"configureAuth\",(function(){return M})),n.d(t,\"restoreAuthorization\",(function(){return R})),n.d(t,\"persistAuthorizationIfNeeded\",(function(){return D}));var r=n(18),o=n.n(r),a=n(32),i=n.n(a),s=n(20),u=n.n(s),c=n(94),l=n.n(c),p=n(26),f=n(5),h=\"show_popup\",d=\"authorize\",m=\"logout\",v=\"pre_authorize_oauth2\",g=\"authorize_oauth2\",y=\"validate\",b=\"configure_auth\",_=\"restore_authorization\";function w(e){return{type:h,payload:e}}function x(e){return{type:d,payload:e}}var E=function(e){return function(t){var n=t.authActions;n.authorize(e),n.persistAuthorizationIfNeeded()}};function S(e){return{type:m,payload:e}}var C=function(e){return function(t){var n=t.authActions;n.logout(e),n.persistAuthorizationIfNeeded()}},A=function(e){return function(t){var n=t.authActions,r=t.errActions,o=e.auth,a=e.token,s=e.isValid,u=o.schema,c=o.name,l=u.get(\"flow\");delete p.a.swaggerUIRedirectOauth2,\"accessCode\"===l||s||r.newAuthErr({authId:c,source:\"auth\",level:\"warning\",message:\"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server\"}),a.error?r.newAuthErr({authId:c,source:\"auth\",level:\"error\",message:i()(a)}):n.authorizeOauth2WithPersistOption({auth:o,token:a})}};function k(e){return{type:g,payload:e}}var O=function(e){return function(t){var n=t.authActions;n.authorizeOauth2(e),n.persistAuthorizationIfNeeded()}},j=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.name,a=e.username,i=e.password,s=e.passwordType,c=e.clientId,l=e.clientSecret,p={grant_type:\"password\",scope:e.scopes.join(\" \"),username:a,password:i},h={};switch(s){case\"request-body\":!function(e,t,n){t&&u()(e,{client_id:t});n&&u()(e,{client_secret:n})}(p,c,l);break;case\"basic\":h.Authorization=\"Basic \"+Object(f.a)(c+\":\"+l);break;default:console.warn(\"Warning: invalid passwordType \".concat(s,\" was passed, not including client id and secret\"))}return n.authorizeRequest({body:Object(f.b)(p),url:r.get(\"tokenUrl\"),name:o,headers:h,query:{},auth:e})}};var T=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.scopes,a=e.name,i=e.clientId,s=e.clientSecret,u={Authorization:\"Basic \"+Object(f.a)(i+\":\"+s)},c={grant_type:\"client_credentials\",scope:o.join(\" \")};return n.authorizeRequest({body:Object(f.b)(c),name:a,url:r.get(\"tokenUrl\"),auth:e,headers:u})}},I=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,a=t.name,i=t.clientId,s=t.clientSecret,u=t.codeVerifier,c={grant_type:\"authorization_code\",code:t.code,client_id:i,client_secret:s,redirect_uri:n,code_verifier:u};return r.authorizeRequest({body:Object(f.b)(c),name:a,url:o.get(\"tokenUrl\"),auth:t})}},P=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,a=t.name,i=t.clientId,s=t.clientSecret,u=t.codeVerifier,c={Authorization:\"Basic \"+Object(f.a)(i+\":\"+s)},l={grant_type:\"authorization_code\",code:t.code,client_id:i,redirect_uri:n,code_verifier:u};return r.authorizeRequest({body:Object(f.b)(l),name:a,url:o.get(\"tokenUrl\"),auth:t,headers:c})}},N=function(e){return function(t){var n,r=t.fn,a=t.getConfigs,s=t.authActions,c=t.errActions,p=t.oas3Selectors,f=t.specSelectors,h=t.authSelectors,d=e.body,m=e.query,v=void 0===m?{}:m,g=e.headers,y=void 0===g?{}:g,b=e.name,_=e.url,w=e.auth,x=(h.getConfigs()||{}).additionalQueryStringParams;if(f.isOAS3()){var E=p.serverEffectiveValue(p.selectedServer());n=l()(_,E,!0)}else n=l()(_,f.url(),!0);\"object\"===o()(x)&&(n.query=u()({},n.query,x));var S=n.toString(),C=u()({Accept:\"application/json, text/plain, */*\",\"Content-Type\":\"application/x-www-form-urlencoded\",\"X-Requested-With\":\"XMLHttpRequest\"},y);r.fetch({url:S,method:\"post\",headers:C,query:v,body:d,requestInterceptor:a().requestInterceptor,responseInterceptor:a().responseInterceptor}).then((function(e){var t=JSON.parse(e.data),n=t&&(t.error||\"\"),r=t&&(t.parseError||\"\");e.ok?n||r?c.newAuthErr({authId:b,level:\"error\",source:\"auth\",message:i()(t)}):s.authorizeOauth2WithPersistOption({auth:w,token:t}):c.newAuthErr({authId:b,level:\"error\",source:\"auth\",message:e.statusText})})).catch((function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r=\"string\"==typeof n?JSON.parse(n):n;r.error&&(t+=\", error: \".concat(r.error)),r.error_description&&(t+=\", description: \".concat(r.error_description))}catch(e){}}c.newAuthErr({authId:b,level:\"error\",source:\"auth\",message:t})}))}};function M(e){return{type:b,payload:e}}function R(e){return{type:_,payload:e}}var D=function(){return function(e){var t=e.authSelectors;if((0,e.getConfigs)().persistAuthorization){var n=t.authorized();localStorage.setItem(\"authorized\",i()(n.toJS()))}}}},function(e,t,n){var r=n(1048);e.exports=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?Object(arguments[t]):{},o=Object.keys(n);\"function\"==typeof Object.getOwnPropertySymbols&&(o=o.concat(Object.getOwnPropertySymbols(n).filter((function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable})))),o.forEach((function(t){r(e,t,n[t])}))}return e}},function(e,t,n){var r=n(107),o=n(177),a=n(60),i=n(69),s=n(226),u=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,l=4==e,p=6==e,f=7==e,h=5==e||p;return function(d,m,v,g){for(var y,b,_=a(d),w=o(_),x=r(m,v,3),E=i(w.length),S=0,C=g||s,A=t?C(d,E):n||f?C(d,0):void 0;E>S;S++)if((h||S in w)&&(b=x(y=w[S],S,_),e))if(t)A[S]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return S;case 2:u.call(A,y)}else switch(e){case 4:return!1;case 7:u.call(A,y)}return p?-1:c||l?l:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},function(e,t,n){n(157);var r=n(576),o=n(40),a=n(99),i=n(67),s=n(131),u=n(41)(\"toStringTag\");for(var c in r){var l=o[c],p=l&&l.prototype;p&&a(p)!==u&&i(p,u,c),s[c]=s.Array}},function(e,t,n){\"use strict\";e.exports={current:null}},function(e,t){e.exports=function(e){return null!=e&&\"object\"==typeof e}},function(e,t){var n,r,o=e.exports={};function a(){throw new Error(\"setTimeout has not been defined\")}function i(){throw new Error(\"clearTimeout has not been defined\")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===a||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n=\"function\"==typeof setTimeout?setTimeout:a}catch(e){n=a}try{r=\"function\"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var u,c=[],l=!1,p=-1;function f(){l&&u&&(l=!1,u.length?c=u.concat(c):p=-1,c.length&&h())}function h(){if(!l){var e=s(f);l=!0;for(var t=c.length;t;){for(u=c,c=[];++p<t;)u&&u[p].run();p=-1,t=c.length}u=null,l=!1,function(e){if(r===clearTimeout)return clearTimeout(e);if((r===i||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}(e)}}function d(e,t){this.fun=e,this.array=t}function m(){}o.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];c.push(new d(e,t)),1!==c.length||l||s(h)},d.prototype.run=function(){this.fun.apply(null,this.array)},o.title=\"browser\",o.browser=!0,o.env={},o.argv=[],o.version=\"\",o.versions={},o.on=m,o.addListener=m,o.once=m,o.off=m,o.removeListener=m,o.removeAllListeners=m,o.emit=m,o.prependListener=m,o.prependOnceListener=m,o.listeners=function(e){return[]},o.binding=function(e){throw new Error(\"process.binding is not supported\")},o.cwd=function(){return\"/\"},o.chdir=function(e){throw new Error(\"process.chdir is not supported\")},o.umask=function(){return 0}},function(e,t,n){\"use strict\";var r=n(38),o=n(122),a=n(79),i=(n(33),[\"dispatchConfig\",\"_targetInst\",\"nativeEvent\",\"isDefaultPrevented\",\"isPropagationStopped\",\"_dispatchListeners\",\"_dispatchInstances\"]),s={type:null,target:null,currentTarget:a.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};function u(e,t,n,r){this.dispatchConfig=e,this._targetInst=t,this.nativeEvent=n;var o=this.constructor.Interface;for(var i in o)if(o.hasOwnProperty(i)){0;var s=o[i];s?this[i]=s(n):\"target\"===i?this.target=r:this[i]=n[i]}var u=null!=n.defaultPrevented?n.defaultPrevented:!1===n.returnValue;return this.isDefaultPrevented=u?a.thatReturnsTrue:a.thatReturnsFalse,this.isPropagationStopped=a.thatReturnsFalse,this}r(u.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():\"unknown\"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=a.thatReturnsTrue)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():\"unknown\"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=a.thatReturnsTrue)},persist:function(){this.isPersistent=a.thatReturnsTrue},isPersistent:a.thatReturnsFalse,destructor:function(){var e=this.constructor.Interface;for(var t in e)this[t]=null;for(var n=0;n<i.length;n++)this[i[n]]=null}}),u.Interface=s,u.augmentClass=function(e,t){var n=this,a=function(){};a.prototype=n.prototype;var i=new a;r(i,e.prototype),e.prototype=i,e.prototype.constructor=e,e.Interface=r({},n.Interface,t),e.augmentClass=n.augmentClass,o.addPoolingTo(e,o.fourArgumentPooler)},o.addPoolingTo(u,o.fourArgumentPooler),e.exports=u},function(e,t,n){var r=n(406);e.exports=function(e){return null==e?\"\":r(e)}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"lastError\",(function(){return M})),n.d(t,\"url\",(function(){return R})),n.d(t,\"specStr\",(function(){return D})),n.d(t,\"specSource\",(function(){return L})),n.d(t,\"specJson\",(function(){return B})),n.d(t,\"specResolved\",(function(){return F})),n.d(t,\"specResolvedSubtree\",(function(){return U})),n.d(t,\"specJsonWithResolvedSubtrees\",(function(){return z})),n.d(t,\"spec\",(function(){return V})),n.d(t,\"isOAS3\",(function(){return W})),n.d(t,\"info\",(function(){return H})),n.d(t,\"externalDocs\",(function(){return $})),n.d(t,\"version\",(function(){return J})),n.d(t,\"semver\",(function(){return K})),n.d(t,\"paths\",(function(){return Y})),n.d(t,\"operations\",(function(){return G})),n.d(t,\"consumes\",(function(){return Z})),n.d(t,\"produces\",(function(){return X})),n.d(t,\"security\",(function(){return Q})),n.d(t,\"securityDefinitions\",(function(){return ee})),n.d(t,\"findDefinition\",(function(){return te})),n.d(t,\"definitions\",(function(){return ne})),n.d(t,\"basePath\",(function(){return re})),n.d(t,\"host\",(function(){return oe})),n.d(t,\"schemes\",(function(){return ae})),n.d(t,\"operationsWithRootInherited\",(function(){return ie})),n.d(t,\"tags\",(function(){return se})),n.d(t,\"tagDetails\",(function(){return ue})),n.d(t,\"operationsWithTags\",(function(){return ce})),n.d(t,\"taggedOperations\",(function(){return le})),n.d(t,\"responses\",(function(){return pe})),n.d(t,\"requests\",(function(){return fe})),n.d(t,\"mutatedRequests\",(function(){return he})),n.d(t,\"responseFor\",(function(){return de})),n.d(t,\"requestFor\",(function(){return me})),n.d(t,\"mutatedRequestFor\",(function(){return ve})),n.d(t,\"allowTryItOutFor\",(function(){return ge})),n.d(t,\"parameterWithMetaByIdentity\",(function(){return ye})),n.d(t,\"parameterInclusionSettingFor\",(function(){return be})),n.d(t,\"parameterWithMeta\",(function(){return _e})),n.d(t,\"operationWithMeta\",(function(){return we})),n.d(t,\"getParameter\",(function(){return xe})),n.d(t,\"hasHost\",(function(){return Ee})),n.d(t,\"parameterValues\",(function(){return Se})),n.d(t,\"parametersIncludeIn\",(function(){return Ce})),n.d(t,\"parametersIncludeType\",(function(){return Ae})),n.d(t,\"contentTypeValues\",(function(){return ke})),n.d(t,\"currentProducesFor\",(function(){return Oe})),n.d(t,\"producesOptionsFor\",(function(){return je})),n.d(t,\"consumesOptionsFor\",(function(){return Te})),n.d(t,\"operationScheme\",(function(){return Ie})),n.d(t,\"canExecuteScheme\",(function(){return Pe})),n.d(t,\"validateBeforeExecute\",(function(){return Ne})),n.d(t,\"getOAS3RequiredRequestBodyContentType\",(function(){return Me})),n.d(t,\"isMediaTypeSchemaPropertiesEqual\",(function(){return Re}));var r=n(13),o=n.n(r),a=n(14),i=n.n(a),s=n(2),u=n.n(s),c=n(19),l=n.n(c),p=n(23),f=n.n(p),h=n(17),d=n.n(h),m=n(4),v=n.n(m),g=n(12),y=n.n(g),b=n(64),_=n.n(b),w=n(29),x=n.n(w),E=n(208),S=n.n(E),C=n(75),A=n.n(C),k=n(22),O=n.n(k),j=n(16),T=n(5),I=n(1),P=[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\",\"trace\"],N=function(e){return e||Object(I.Map)()},M=Object(j.a)(N,(function(e){return e.get(\"lastError\")})),R=Object(j.a)(N,(function(e){return e.get(\"url\")})),D=Object(j.a)(N,(function(e){return e.get(\"spec\")||\"\"})),L=Object(j.a)(N,(function(e){return e.get(\"specSource\")||\"not-editor\"})),B=Object(j.a)(N,(function(e){return e.get(\"json\",Object(I.Map)())})),F=Object(j.a)(N,(function(e){return e.get(\"resolved\",Object(I.Map)())})),U=function(e,t){var n;return e.getIn(u()(n=[\"resolvedSubtrees\"]).call(n,i()(t)),void 0)},q=function e(t,n){return I.Map.isMap(t)&&I.Map.isMap(n)?n.get(\"$$ref\")?n:Object(I.OrderedMap)().mergeWith(e,t,n):n},z=Object(j.a)(N,(function(e){return Object(I.OrderedMap)().mergeWith(q,e.get(\"json\"),e.get(\"resolvedSubtrees\"))})),V=function(e){return B(e)},W=Object(j.a)(V,(function(){return!1})),H=Object(j.a)(V,(function(e){return De(e&&e.get(\"info\"))})),$=Object(j.a)(V,(function(e){return De(e&&e.get(\"externalDocs\"))})),J=Object(j.a)(H,(function(e){return e&&e.get(\"version\")})),K=Object(j.a)(J,(function(e){var t;return l()(t=/v?([0-9]*)\\.([0-9]*)\\.([0-9]*)/i.exec(e)).call(t,1)})),Y=Object(j.a)(z,(function(e){return e.get(\"paths\")})),G=Object(j.a)(Y,(function(e){if(!e||e.size<1)return Object(I.List)();var t=Object(I.List)();return e&&f()(e)?(f()(e).call(e,(function(e,n){if(!e||!f()(e))return{};f()(e).call(e,(function(e,r){var o;d()(P).call(P,r)<0||(t=t.push(Object(I.fromJS)({path:n,method:r,operation:e,id:u()(o=\"\".concat(r,\"-\")).call(o,n)})))}))})),t):Object(I.List)()})),Z=Object(j.a)(V,(function(e){return Object(I.Set)(e.get(\"consumes\"))})),X=Object(j.a)(V,(function(e){return Object(I.Set)(e.get(\"produces\"))})),Q=Object(j.a)(V,(function(e){return e.get(\"security\",Object(I.List)())})),ee=Object(j.a)(V,(function(e){return e.get(\"securityDefinitions\")})),te=function(e,t){var n=e.getIn([\"resolvedSubtrees\",\"definitions\",t],null),r=e.getIn([\"json\",\"definitions\",t],null);return n||r||null},ne=Object(j.a)(V,(function(e){var t=e.get(\"definitions\");return I.Map.isMap(t)?t:Object(I.Map)()})),re=Object(j.a)(V,(function(e){return e.get(\"basePath\")})),oe=Object(j.a)(V,(function(e){return e.get(\"host\")})),ae=Object(j.a)(V,(function(e){return e.get(\"schemes\",Object(I.Map)())})),ie=Object(j.a)(G,Z,X,(function(e,t,n){return v()(e).call(e,(function(e){return e.update(\"operation\",(function(e){if(e){if(!I.Map.isMap(e))return;return e.withMutations((function(e){return e.get(\"consumes\")||e.update(\"consumes\",(function(e){return Object(I.Set)(e).merge(t)})),e.get(\"produces\")||e.update(\"produces\",(function(e){return Object(I.Set)(e).merge(n)})),e}))}return Object(I.Map)()}))}))})),se=Object(j.a)(V,(function(e){var t=e.get(\"tags\",Object(I.List)());return I.List.isList(t)?y()(t).call(t,(function(e){return I.Map.isMap(e)})):Object(I.List)()})),ue=function(e,t){var n,r=se(e)||Object(I.List)();return _()(n=y()(r).call(r,I.Map.isMap)).call(n,(function(e){return e.get(\"name\")===t}),Object(I.Map)())},ce=Object(j.a)(ie,se,(function(e,t){return x()(e).call(e,(function(e,t){var n=Object(I.Set)(t.getIn([\"operation\",\"tags\"]));return n.count()<1?e.update(\"default\",Object(I.List)(),(function(e){return e.push(t)})):x()(n).call(n,(function(e,n){return e.update(n,Object(I.List)(),(function(e){return e.push(t)}))}),e)}),x()(t).call(t,(function(e,t){return e.set(t.get(\"name\"),Object(I.List)())}),Object(I.OrderedMap)()))})),le=function(e){return function(t){var n,r=(0,t.getConfigs)(),o=r.tagsSorter,a=r.operationsSorter;return v()(n=ce(e).sortBy((function(e,t){return t}),(function(e,t){var n=\"function\"==typeof o?o:T.H.tagsSorter[o];return n?n(e,t):null}))).call(n,(function(t,n){var r=\"function\"==typeof a?a:T.H.operationsSorter[a],o=r?S()(t).call(t,r):t;return Object(I.Map)({tagDetails:ue(e,n),operations:o})}))}},pe=Object(j.a)(N,(function(e){return e.get(\"responses\",Object(I.Map)())})),fe=Object(j.a)(N,(function(e){return e.get(\"requests\",Object(I.Map)())})),he=Object(j.a)(N,(function(e){return e.get(\"mutatedRequests\",Object(I.Map)())})),de=function(e,t,n){return pe(e).getIn([t,n],null)},me=function(e,t,n){return fe(e).getIn([t,n],null)},ve=function(e,t,n){return he(e).getIn([t,n],null)},ge=function(){return!0},ye=function(e,t,n){var r,o,a=z(e).getIn(u()(r=[\"paths\"]).call(r,i()(t),[\"parameters\"]),Object(I.OrderedMap)()),s=e.getIn(u()(o=[\"meta\",\"paths\"]).call(o,i()(t),[\"parameters\"]),Object(I.OrderedMap)()),c=v()(a).call(a,(function(e){var t,r,o,a=s.get(u()(t=\"\".concat(n.get(\"in\"),\".\")).call(t,n.get(\"name\"))),i=s.get(u()(r=u()(o=\"\".concat(n.get(\"in\"),\".\")).call(o,n.get(\"name\"),\".hash-\")).call(r,n.hashCode()));return Object(I.OrderedMap)().merge(e,a,i)}));return _()(c).call(c,(function(e){return e.get(\"in\")===n.get(\"in\")&&e.get(\"name\")===n.get(\"name\")}),Object(I.OrderedMap)())},be=function(e,t,n,r){var o,a,s=u()(o=\"\".concat(r,\".\")).call(o,n);return e.getIn(u()(a=[\"meta\",\"paths\"]).call(a,i()(t),[\"parameter_inclusions\",s]),!1)},_e=function(e,t,n,r){var o,a=z(e).getIn(u()(o=[\"paths\"]).call(o,i()(t),[\"parameters\"]),Object(I.OrderedMap)()),s=_()(a).call(a,(function(e){return e.get(\"in\")===r&&e.get(\"name\")===n}),Object(I.OrderedMap)());return ye(e,t,s)},we=function(e,t,n){var r,o=z(e).getIn([\"paths\",t,n],Object(I.OrderedMap)()),a=e.getIn([\"meta\",\"paths\",t,n],Object(I.OrderedMap)()),i=v()(r=o.get(\"parameters\",Object(I.List)())).call(r,(function(r){return ye(e,[t,n],r)}));return Object(I.OrderedMap)().merge(o,a).set(\"parameters\",i)};function xe(e,t,n,r){var o;t=t||[];var a=e.getIn(u()(o=[\"meta\",\"paths\"]).call(o,i()(t),[\"parameters\"]),Object(I.fromJS)([]));return _()(a).call(a,(function(e){return I.Map.isMap(e)&&e.get(\"name\")===n&&e.get(\"in\")===r}))||Object(I.Map)()}var Ee=Object(j.a)(V,(function(e){var t=e.get(\"host\");return\"string\"==typeof t&&t.length>0&&\"/\"!==t[0]}));function Se(e,t,n){var r;t=t||[];var o=we.apply(void 0,u()(r=[e]).call(r,i()(t))).get(\"parameters\",Object(I.List)());return x()(o).call(o,(function(e,t){var r=n&&\"body\"===t.get(\"in\")?t.get(\"value_xml\"):t.get(\"value\");return e.set(Object(T.A)(t,{allowHashes:!1}),r)}),Object(I.fromJS)({}))}function Ce(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(I.List.isList(e))return A()(e).call(e,(function(e){return I.Map.isMap(e)&&e.get(\"in\")===t}))}function Ae(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(I.List.isList(e))return A()(e).call(e,(function(e){return I.Map.isMap(e)&&e.get(\"type\")===t}))}function ke(e,t){var n,r;t=t||[];var o=z(e).getIn(u()(n=[\"paths\"]).call(n,i()(t)),Object(I.fromJS)({})),a=e.getIn(u()(r=[\"meta\",\"paths\"]).call(r,i()(t)),Object(I.fromJS)({})),s=Oe(e,t),c=o.get(\"parameters\")||new I.List,l=a.get(\"consumes_value\")?a.get(\"consumes_value\"):Ae(c,\"file\")?\"multipart/form-data\":Ae(c,\"formData\")?\"application/x-www-form-urlencoded\":void 0;return Object(I.fromJS)({requestContentType:l,responseContentType:s})}function Oe(e,t){var n,r;t=t||[];var o=z(e).getIn(u()(n=[\"paths\"]).call(n,i()(t)),null);if(null!==o){var a=e.getIn(u()(r=[\"meta\",\"paths\"]).call(r,i()(t),[\"produces_value\"]),null),s=o.getIn([\"produces\",0],null);return a||s||\"application/json\"}}function je(e,t){var n;t=t||[];var r=z(e),a=r.getIn(u()(n=[\"paths\"]).call(n,i()(t)),null);if(null!==a){var s=t,c=o()(s,1)[0],l=a.get(\"produces\",null),p=r.getIn([\"paths\",c,\"produces\"],null),f=r.getIn([\"produces\"],null);return l||p||f}}function Te(e,t){var n;t=t||[];var r=z(e),a=r.getIn(u()(n=[\"paths\"]).call(n,i()(t)),null);if(null!==a){var s=t,c=o()(s,1)[0],l=a.get(\"consumes\",null),p=r.getIn([\"paths\",c,\"consumes\"],null),f=r.getIn([\"consumes\"],null);return l||p||f}}var Ie=function(e,t,n){var r=e.get(\"url\").match(/^([a-z][a-z0-9+\\-.]*):/),o=O()(r)?r[1]:null;return e.getIn([\"scheme\",t,n])||e.getIn([\"scheme\",\"_defaultScheme\"])||o||\"\"},Pe=function(e,t,n){var r;return d()(r=[\"http\",\"https\"]).call(r,Ie(e,t,n))>-1},Ne=function(e,t){var n;t=t||[];var r=e.getIn(u()(n=[\"meta\",\"paths\"]).call(n,i()(t),[\"parameters\"]),Object(I.fromJS)([])),o=!0;return f()(r).call(r,(function(e){var t=e.get(\"errors\");t&&t.count()&&(o=!1)})),o},Me=function(e,t){var n,r,o={requestBody:!1,requestContentType:{}},a=e.getIn(u()(n=[\"resolvedSubtrees\",\"paths\"]).call(n,i()(t),[\"requestBody\"]),Object(I.fromJS)([]));return a.size<1||(a.getIn([\"required\"])&&(o.requestBody=a.getIn([\"required\"])),f()(r=a.getIn([\"content\"]).entrySeq()).call(r,(function(e){var t=e[0];if(e[1].getIn([\"schema\",\"required\"])){var n=e[1].getIn([\"schema\",\"required\"]).toJS();o.requestContentType[t]=n}}))),o},Re=function(e,t,n,r){var o;if((n||r)&&n===r)return!0;var a=e.getIn(u()(o=[\"resolvedSubtrees\",\"paths\"]).call(o,i()(t),[\"requestBody\",\"content\"]),Object(I.fromJS)([]));if(a.size<2||!n||!r)return!1;var s=a.getIn([n,\"schema\",\"properties\"],Object(I.fromJS)([])),c=a.getIn([r,\"schema\",\"properties\"],Object(I.fromJS)([]));return!!s.equals(c)};function De(e){return I.Map.isMap(e)?e:new I.Map}},function(e,t,n){\"use strict\";(function(t){var r=n(894),o=n(895),a=/^[A-Za-z][A-Za-z0-9+-.]*:[\\\\/]+/,i=/^([a-z][a-z0-9.+-]*:)?([\\\\/]{1,})?([\\S\\s]*)/i,s=new RegExp(\"^[\\\\x09\\\\x0A\\\\x0B\\\\x0C\\\\x0D\\\\x20\\\\xA0\\\\u1680\\\\u180E\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200A\\\\u202F\\\\u205F\\\\u3000\\\\u2028\\\\u2029\\\\uFEFF]+\");function u(e){return(e||\"\").toString().replace(s,\"\")}var c=[[\"#\",\"hash\"],[\"?\",\"query\"],function(e){return e.replace(\"\\\\\",\"/\")},[\"/\",\"pathname\"],[\"@\",\"auth\",1],[NaN,\"host\",void 0,1,1],[/:(\\d+)$/,\"port\",void 0,1],[NaN,\"hostname\",void 0,1,1]],l={hash:1,query:1};function p(e){var n,r=(\"undefined\"!=typeof window?window:void 0!==t?t:\"undefined\"!=typeof self?self:{}).location||{},o={},i=typeof(e=e||r);if(\"blob:\"===e.protocol)o=new h(unescape(e.pathname),{});else if(\"string\"===i)for(n in o=new h(e,{}),l)delete o[n];else if(\"object\"===i){for(n in e)n in l||(o[n]=e[n]);void 0===o.slashes&&(o.slashes=a.test(e.href))}return o}function f(e){e=u(e);var t=i.exec(e);return{protocol:t[1]?t[1].toLowerCase():\"\",slashes:!!(t[2]&&t[2].length>=2),rest:t[2]&&1===t[2].length?\"/\"+t[3]:t[3]}}function h(e,t,n){if(e=u(e),!(this instanceof h))return new h(e,t,n);var a,i,s,l,d,m,v=c.slice(),g=typeof t,y=this,b=0;for(\"object\"!==g&&\"string\"!==g&&(n=t,t=null),n&&\"function\"!=typeof n&&(n=o.parse),t=p(t),a=!(i=f(e||\"\")).protocol&&!i.slashes,y.slashes=i.slashes||a&&t.slashes,y.protocol=i.protocol||t.protocol||\"\",e=i.rest,i.slashes||(v[3]=[/(.*)/,\"pathname\"]);b<v.length;b++)\"function\"!=typeof(l=v[b])?(s=l[0],m=l[1],s!=s?y[m]=e:\"string\"==typeof s?~(d=e.indexOf(s))&&(\"number\"==typeof l[2]?(y[m]=e.slice(0,d),e=e.slice(d+l[2])):(y[m]=e.slice(d),e=e.slice(0,d))):(d=s.exec(e))&&(y[m]=d[1],e=e.slice(0,d.index)),y[m]=y[m]||a&&l[3]&&t[m]||\"\",l[4]&&(y[m]=y[m].toLowerCase())):e=l(e);n&&(y.query=n(y.query)),a&&t.slashes&&\"/\"!==y.pathname.charAt(0)&&(\"\"!==y.pathname||\"\"!==t.pathname)&&(y.pathname=function(e,t){if(\"\"===e)return t;for(var n=(t||\"/\").split(\"/\").slice(0,-1).concat(e.split(\"/\")),r=n.length,o=n[r-1],a=!1,i=0;r--;)\".\"===n[r]?n.splice(r,1):\"..\"===n[r]?(n.splice(r,1),i++):i&&(0===r&&(a=!0),n.splice(r,1),i--);return a&&n.unshift(\"\"),\".\"!==o&&\"..\"!==o||n.push(\"\"),n.join(\"/\")}(y.pathname,t.pathname)),\"/\"!==y.pathname.charAt(0)&&y.hostname&&(y.pathname=\"/\"+y.pathname),r(y.port,y.protocol)||(y.host=y.hostname,y.port=\"\"),y.username=y.password=\"\",y.auth&&(l=y.auth.split(\":\"),y.username=l[0]||\"\",y.password=l[1]||\"\"),y.origin=y.protocol&&y.host&&\"file:\"!==y.protocol?y.protocol+\"//\"+y.host:\"null\",y.href=y.toString()}h.prototype={set:function(e,t,n){var a=this;switch(e){case\"query\":\"string\"==typeof t&&t.length&&(t=(n||o.parse)(t)),a[e]=t;break;case\"port\":a[e]=t,r(t,a.protocol)?t&&(a.host=a.hostname+\":\"+t):(a.host=a.hostname,a[e]=\"\");break;case\"hostname\":a[e]=t,a.port&&(t+=\":\"+a.port),a.host=t;break;case\"host\":a[e]=t,/:\\d+$/.test(t)?(t=t.split(\":\"),a.port=t.pop(),a.hostname=t.join(\":\")):(a.hostname=t,a.port=\"\");break;case\"protocol\":a.protocol=t.toLowerCase(),a.slashes=!n;break;case\"pathname\":case\"hash\":if(t){var i=\"pathname\"===e?\"/\":\"#\";a[e]=t.charAt(0)!==i?i+t:t}else a[e]=t;break;default:a[e]=t}for(var s=0;s<c.length;s++){var u=c[s];u[4]&&(a[u[1]]=a[u[1]].toLowerCase())}return a.origin=a.protocol&&a.host&&\"file:\"!==a.protocol?a.protocol+\"//\"+a.host:\"null\",a.href=a.toString(),a},toString:function(e){e&&\"function\"==typeof e||(e=o.stringify);var t,n=this,r=n.protocol;r&&\":\"!==r.charAt(r.length-1)&&(r+=\":\");var a=r+(n.slashes?\"//\":\"\");return n.username&&(a+=n.username,n.password&&(a+=\":\"+n.password),a+=\"@\"),a+=n.host+n.pathname,(t=\"object\"==typeof n.query?e(n.query):n.query)&&(a+=\"?\"!==t.charAt(0)?\"?\"+t:t),n.hash&&(a+=n.hash),a}},h.extractProtocol=f,h.location=p,h.trimLeft=u,h.qs=o,e.exports=h}).call(this,n(51))},function(e,t,n){e.exports=n(1083)},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return ee})),n.d(t,\"a\",(function(){return D}));var r=n(15),o=n.n(r),a=n(31),i=n.n(a),s=n(522),u=n.n(s),c=n(523),l=n.n(c),p=n(85),f=n.n(p),h=n(0),d=n.n(h),m=n(524),v=n.n(m);var g={};function y(e){if(0===e.length||1===e.length)return e;var t,n,r=e.join(\".\");return g[r]||(g[r]=0===(n=(t=e).length)||1===n?t:2===n?[t[0],t[1],\"\".concat(t[0],\".\").concat(t[1]),\"\".concat(t[1],\".\").concat(t[0])]:3===n?[t[0],t[1],t[2],\"\".concat(t[0],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[0]),\"\".concat(t[1],\".\").concat(t[2]),\"\".concat(t[2],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[1],\".\").concat(t[2]),\"\".concat(t[0],\".\").concat(t[2],\".\").concat(t[1]),\"\".concat(t[1],\".\").concat(t[0],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[2],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[0],\".\").concat(t[1]),\"\".concat(t[2],\".\").concat(t[1],\".\").concat(t[0])]:n>=4?[t[0],t[1],t[2],t[3],\"\".concat(t[0],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[2]),\"\".concat(t[0],\".\").concat(t[3]),\"\".concat(t[1],\".\").concat(t[0]),\"\".concat(t[1],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[3]),\"\".concat(t[2],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[1]),\"\".concat(t[2],\".\").concat(t[3]),\"\".concat(t[3],\".\").concat(t[0]),\"\".concat(t[3],\".\").concat(t[1]),\"\".concat(t[3],\".\").concat(t[2]),\"\".concat(t[0],\".\").concat(t[1],\".\").concat(t[2]),\"\".concat(t[0],\".\").concat(t[1],\".\").concat(t[3]),\"\".concat(t[0],\".\").concat(t[2],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[2],\".\").concat(t[3]),\"\".concat(t[0],\".\").concat(t[3],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[3],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[0],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[0],\".\").concat(t[3]),\"\".concat(t[1],\".\").concat(t[2],\".\").concat(t[0]),\"\".concat(t[1],\".\").concat(t[2],\".\").concat(t[3]),\"\".concat(t[1],\".\").concat(t[3],\".\").concat(t[0]),\"\".concat(t[1],\".\").concat(t[3],\".\").concat(t[2]),\"\".concat(t[2],\".\").concat(t[0],\".\").concat(t[1]),\"\".concat(t[2],\".\").concat(t[0],\".\").concat(t[3]),\"\".concat(t[2],\".\").concat(t[1],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[1],\".\").concat(t[3]),\"\".concat(t[2],\".\").concat(t[3],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[3],\".\").concat(t[1]),\"\".concat(t[3],\".\").concat(t[0],\".\").concat(t[1]),\"\".concat(t[3],\".\").concat(t[0],\".\").concat(t[2]),\"\".concat(t[3],\".\").concat(t[1],\".\").concat(t[0]),\"\".concat(t[3],\".\").concat(t[1],\".\").concat(t[2]),\"\".concat(t[3],\".\").concat(t[2],\".\").concat(t[0]),\"\".concat(t[3],\".\").concat(t[2],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[1],\".\").concat(t[2],\".\").concat(t[3]),\"\".concat(t[0],\".\").concat(t[1],\".\").concat(t[3],\".\").concat(t[2]),\"\".concat(t[0],\".\").concat(t[2],\".\").concat(t[1],\".\").concat(t[3]),\"\".concat(t[0],\".\").concat(t[2],\".\").concat(t[3],\".\").concat(t[1]),\"\".concat(t[0],\".\").concat(t[3],\".\").concat(t[1],\".\").concat(t[2]),\"\".concat(t[0],\".\").concat(t[3],\".\").concat(t[2],\".\").concat(t[1]),\"\".concat(t[1],\".\").concat(t[0],\".\").concat(t[2],\".\").concat(t[3]),\"\".concat(t[1],\".\").concat(t[0],\".\").concat(t[3],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[2],\".\").concat(t[0],\".\").concat(t[3]),\"\".concat(t[1],\".\").concat(t[2],\".\").concat(t[3],\".\").concat(t[0]),\"\".concat(t[1],\".\").concat(t[3],\".\").concat(t[0],\".\").concat(t[2]),\"\".concat(t[1],\".\").concat(t[3],\".\").concat(t[2],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[0],\".\").concat(t[1],\".\").concat(t[3]),\"\".concat(t[2],\".\").concat(t[0],\".\").concat(t[3],\".\").concat(t[1]),\"\".concat(t[2],\".\").concat(t[1],\".\").concat(t[0],\".\").concat(t[3]),\"\".concat(t[2],\".\").concat(t[1],\".\").concat(t[3],\".\").concat(t[0]),\"\".concat(t[2],\".\").concat(t[3],\".\").concat(t[0],\".\").concat(t[1]),\"\".concat(t[2],\".\").concat(t[3],\".\").concat(t[1],\".\").concat(t[0]),\"\".concat(t[3],\".\").concat(t[0],\".\").concat(t[1],\".\").concat(t[2]),\"\".concat(t[3],\".\").concat(t[0],\".\").concat(t[2],\".\").concat(t[1]),\"\".concat(t[3],\".\").concat(t[1],\".\").concat(t[0],\".\").concat(t[2]),\"\".concat(t[3],\".\").concat(t[1],\".\").concat(t[2],\".\").concat(t[0]),\"\".concat(t[3],\".\").concat(t[2],\".\").concat(t[0],\".\").concat(t[1]),\"\".concat(t[3],\".\").concat(t[2],\".\").concat(t[1],\".\").concat(t[0])]:void 0),g[r]}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=e.filter((function(e){return\"token\"!==e})),o=y(r);return o.reduce((function(e,t){return f()({},e,n[t])}),t)}function _(e){return e.join(\" \")}function w(e){var t=e.node,n=e.stylesheet,r=e.style,o=void 0===r?{}:r,a=e.useInlineStyles,i=e.key,s=t.properties,u=t.type,c=t.tagName,l=t.value;if(\"text\"===u)return l;if(c){var p,h=function(e,t){var n=0;return function(r){return n+=1,r.map((function(r,o){return w({node:r,stylesheet:e,useInlineStyles:t,key:\"code-segment-\".concat(n,\"-\").concat(o)})}))}}(n,a);if(a){var m=Object.keys(n).reduce((function(e,t){return t.split(\".\").forEach((function(t){e.includes(t)||e.push(t)})),e}),[]),g=s.className&&s.className.includes(\"token\")?[\"token\"]:[],y=s.className&&g.concat(s.className.filter((function(e){return!m.includes(e)})));p=f()({},s,{className:_(y)||void 0,style:b(s.className,Object.assign({},s.style,o),n)})}else p=f()({},s,{className:_(s.className)});var x=h(t.children);return d.a.createElement(c,v()({key:i},p),x)}}var x=/\\n/g;function E(e){var t=e.codeString,n=e.codeStyle,r=e.containerStyle,o=void 0===r?{float:\"left\",paddingRight:\"10px\"}:r,a=e.numberStyle,i=void 0===a?{}:a,s=e.startingLineNumber;return d.a.createElement(\"code\",{style:Object.assign({},n,o)},function(e){var t=e.lines,n=e.startingLineNumber,r=e.style;return t.map((function(e,t){var o=t+n;return d.a.createElement(\"span\",{key:\"line-\".concat(t),className:\"react-syntax-highlighter-line-number\",style:\"function\"==typeof r?r(o):r},\"\".concat(o,\"\\n\"))}))}({lines:t.replace(/\\n$/,\"\").split(\"\\n\"),style:i,startingLineNumber:s}))}function S(e,t){return{type:\"element\",tagName:\"span\",properties:{key:\"line-number--\".concat(e),className:[\"comment\",\"linenumber\",\"react-syntax-highlighter-line-number\"],style:t},children:[{type:\"text\",value:e}]}}function C(e,t,n){var r,o={display:\"inline-block\",minWidth:(r=n,\"\".concat(r.toString().length,\".25em\")),paddingRight:\"1em\",textAlign:\"right\",userSelect:\"none\"},a=\"function\"==typeof e?e(t):e;return f()({},o,a)}function A(e){var t=e.children,n=e.lineNumber,r=e.lineNumberStyle,o=e.largestLineNumber,a=e.showInlineLineNumbers,i=e.lineProps,s=void 0===i?{}:i,u=e.className,c=void 0===u?[]:u,l=e.showLineNumbers,p=e.wrapLongLines,h=\"function\"==typeof s?s(n):s;if(h.className=c,n&&a){var d=C(r,n,o);t.unshift(S(n,d))}return p&l&&(h.style=f()({},h.style,{display:\"flex\"})),{type:\"element\",tagName:\"span\",properties:h,children:t}}function k(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=0;r<e.length;r++){var o=e[r];if(\"text\"===o.type)n.push(A({children:[o],className:l()(new Set(t))}));else if(o.children){var a=t.concat(o.properties.className);n=n.concat(k(o.children,a))}}return n}function O(e,t,n,r,o,a,i,s,u){var c,l=k(e.value),p=[],f=-1,h=0;function d(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return A({children:e,lineNumber:t,lineNumberStyle:s,largestLineNumber:i,showInlineLineNumbers:o,lineProps:n,className:a,showLineNumbers:r,wrapLongLines:u})}function m(e,t){if(r&&t&&o){var n=C(s,t,i);e.unshift(S(t,n))}return e}function v(e,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return t||r.length>0?d(e,n,r):m(e,n)}for(var g=function(){var e=l[h],t=e.children[0].value;if(t.match(x)){var n=t.split(\"\\n\");n.forEach((function(t,o){var i=r&&p.length+a,s={type:\"text\",value:\"\".concat(t,\"\\n\")};if(0===o){var u=v(l.slice(f+1,h).concat(A({children:[s],className:e.properties.className})),i);p.push(u)}else if(o===n.length-1){if(l[h+1]&&l[h+1].children&&l[h+1].children[0]){var c=A({children:[{type:\"text\",value:\"\".concat(t)}],className:e.properties.className});l.splice(h+1,0,c)}else{var d=v([s],i,e.properties.className);p.push(d)}}else{var m=v([s],i,e.properties.className);p.push(m)}})),f=h}h++};h<l.length;)g();if(f!==l.length-1){var y=l.slice(f+1,l.length);if(y&&y.length){var b=v(y,r&&p.length+a);p.push(b)}}return t?p:(c=[]).concat.apply(c,p)}function j(e){var t=e.rows,n=e.stylesheet,r=e.useInlineStyles;return t.map((function(e,t){return w({node:e,stylesheet:n,useInlineStyles:r,key:\"code-segement\".concat(t)})}))}function T(e){return e&&void 0!==e.highlightAuto}var I,P,N=n(352),M=n.n(N),R=(I=M.a,P={},function(e){var t=e.language,n=e.children,r=e.style,o=void 0===r?P:r,a=e.customStyle,i=void 0===a?{}:a,s=e.codeTagProps,c=void 0===s?{className:t?\"language-\".concat(t):void 0,style:f()({},o['code[class*=\"language-\"]'],o['code[class*=\"language-'.concat(t,'\"]')])}:s,l=e.useInlineStyles,p=void 0===l||l,h=e.showLineNumbers,m=void 0!==h&&h,v=e.showInlineLineNumbers,g=void 0===v||v,y=e.startingLineNumber,b=void 0===y?1:y,_=e.lineNumberContainerStyle,w=e.lineNumberStyle,x=void 0===w?{}:w,S=e.wrapLines,C=e.wrapLongLines,A=void 0!==C&&C,k=e.lineProps,N=void 0===k?{}:k,M=e.renderer,R=e.PreTag,D=void 0===R?\"pre\":R,L=e.CodeTag,B=void 0===L?\"code\":L,F=e.code,U=void 0===F?Array.isArray(n)?n[0]:n:F,q=e.astGenerator,z=u()(e,[\"language\",\"children\",\"style\",\"customStyle\",\"codeTagProps\",\"useInlineStyles\",\"showLineNumbers\",\"showInlineLineNumbers\",\"startingLineNumber\",\"lineNumberContainerStyle\",\"lineNumberStyle\",\"wrapLines\",\"wrapLongLines\",\"lineProps\",\"renderer\",\"PreTag\",\"CodeTag\",\"code\",\"astGenerator\"]);q=q||I;var V=m?d.a.createElement(E,{containerStyle:_,codeStyle:c.style||{},numberStyle:x,startingLineNumber:b,codeString:U}):null,W=o.hljs||o['pre[class*=\"language-\"]']||{backgroundColor:\"#fff\"},H=T(q)?\"hljs\":\"prismjs\",$=p?Object.assign({},z,{style:Object.assign({},W,i)}):Object.assign({},z,{className:z.className?\"\".concat(H,\" \").concat(z.className):H,style:Object.assign({},i)});if(!q)return d.a.createElement(D,$,V,d.a.createElement(B,c,U));(void 0===S&&M||A)&&(S=!0),M=M||j;var J=[{type:\"text\",value:U}],K=function(e){var t=e.astGenerator,n=e.language,r=e.code,o=e.defaultCodeValue;if(T(t)){var a=function(e,t){return-1!==e.listLanguages().indexOf(t)}(t,n);return\"text\"===n?{value:o,language:\"text\"}:a?t.highlight(n,r):t.highlightAuto(r)}try{return n&&\"text\"!==n?{value:t.highlight(r,n)}:{value:o}}catch(e){return{value:o}}}({astGenerator:q,language:t,code:U,defaultCodeValue:J});null===K.language&&(K.value=J);var Y=O(K,S,N,m,g,b,K.value.length+b,x,A);return c.style=A?f()({},c.style,{whiteSpace:\"pre-wrap\"}):f()({},c.style,{whiteSpace:\"pre\"}),d.a.createElement(D,$,d.a.createElement(B,c,!g&&V,M({rows:Y,stylesheet:o,useInlineStyles:p})))});R.registerLanguage=M.a.registerLanguage;var D=R,L=n(526),B=n.n(L).a,F=n(525),U=n.n(F).a,q=n(527),z=n.n(q).a,V=n(530),W=n.n(V).a,H=n(528),$=n.n(H).a,J=n(529),K=n.n(J).a,Y=n(531),G=n.n(Y).a,Z={hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#333\",color:\"white\"},\"hljs-name\":{fontWeight:\"bold\"},\"hljs-strong\":{fontWeight:\"bold\"},\"hljs-code\":{fontStyle:\"italic\",color:\"#888\"},\"hljs-emphasis\":{fontStyle:\"italic\"},\"hljs-tag\":{color:\"#62c8f3\"},\"hljs-variable\":{color:\"#ade5fc\"},\"hljs-template-variable\":{color:\"#ade5fc\"},\"hljs-selector-id\":{color:\"#ade5fc\"},\"hljs-selector-class\":{color:\"#ade5fc\"},\"hljs-string\":{color:\"#a2fca2\"},\"hljs-bullet\":{color:\"#d36363\"},\"hljs-type\":{color:\"#ffa\"},\"hljs-title\":{color:\"#ffa\"},\"hljs-section\":{color:\"#ffa\"},\"hljs-attribute\":{color:\"#ffa\"},\"hljs-quote\":{color:\"#ffa\"},\"hljs-built_in\":{color:\"#ffa\"},\"hljs-builtin-name\":{color:\"#ffa\"},\"hljs-number\":{color:\"#d36363\"},\"hljs-symbol\":{color:\"#d36363\"},\"hljs-keyword\":{color:\"#fcc28c\"},\"hljs-selector-tag\":{color:\"#fcc28c\"},\"hljs-literal\":{color:\"#fcc28c\"},\"hljs-comment\":{color:\"#888\"},\"hljs-deletion\":{color:\"#333\",backgroundColor:\"#fc9b9b\"},\"hljs-regexp\":{color:\"#c6b4f0\"},\"hljs-link\":{color:\"#c6b4f0\"},\"hljs-meta\":{color:\"#fc9b9b\"},\"hljs-addition\":{backgroundColor:\"#a2fca2\",color:\"#333\"}};D.registerLanguage(\"json\",U),D.registerLanguage(\"js\",B),D.registerLanguage(\"xml\",z),D.registerLanguage(\"yaml\",$),D.registerLanguage(\"http\",K),D.registerLanguage(\"bash\",W),D.registerLanguage(\"powershell\",G),D.registerLanguage(\"javascript\",B);var X={agate:Z,arta:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#222\",color:\"#aaa\"},\"hljs-subst\":{color:\"#aaa\"},\"hljs-section\":{color:\"#fff\",fontWeight:\"bold\"},\"hljs-comment\":{color:\"#444\"},\"hljs-quote\":{color:\"#444\"},\"hljs-meta\":{color:\"#444\"},\"hljs-string\":{color:\"#ffcc33\"},\"hljs-symbol\":{color:\"#ffcc33\"},\"hljs-bullet\":{color:\"#ffcc33\"},\"hljs-regexp\":{color:\"#ffcc33\"},\"hljs-number\":{color:\"#00cc66\"},\"hljs-addition\":{color:\"#00cc66\"},\"hljs-built_in\":{color:\"#32aaee\"},\"hljs-builtin-name\":{color:\"#32aaee\"},\"hljs-literal\":{color:\"#32aaee\"},\"hljs-type\":{color:\"#32aaee\"},\"hljs-template-variable\":{color:\"#32aaee\"},\"hljs-attribute\":{color:\"#32aaee\"},\"hljs-link\":{color:\"#32aaee\"},\"hljs-keyword\":{color:\"#6644aa\"},\"hljs-selector-tag\":{color:\"#6644aa\"},\"hljs-name\":{color:\"#6644aa\"},\"hljs-selector-id\":{color:\"#6644aa\"},\"hljs-selector-class\":{color:\"#6644aa\"},\"hljs-title\":{color:\"#bb1166\"},\"hljs-variable\":{color:\"#bb1166\"},\"hljs-deletion\":{color:\"#bb1166\"},\"hljs-template-tag\":{color:\"#bb1166\"},\"hljs-doctag\":{fontWeight:\"bold\"},\"hljs-strong\":{fontWeight:\"bold\"},\"hljs-emphasis\":{fontStyle:\"italic\"}},monokai:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#272822\",color:\"#ddd\"},\"hljs-tag\":{color:\"#f92672\"},\"hljs-keyword\":{color:\"#f92672\",fontWeight:\"bold\"},\"hljs-selector-tag\":{color:\"#f92672\",fontWeight:\"bold\"},\"hljs-literal\":{color:\"#f92672\",fontWeight:\"bold\"},\"hljs-strong\":{color:\"#f92672\"},\"hljs-name\":{color:\"#f92672\"},\"hljs-code\":{color:\"#66d9ef\"},\"hljs-class .hljs-title\":{color:\"white\"},\"hljs-attribute\":{color:\"#bf79db\"},\"hljs-symbol\":{color:\"#bf79db\"},\"hljs-regexp\":{color:\"#bf79db\"},\"hljs-link\":{color:\"#bf79db\"},\"hljs-string\":{color:\"#a6e22e\"},\"hljs-bullet\":{color:\"#a6e22e\"},\"hljs-subst\":{color:\"#a6e22e\"},\"hljs-title\":{color:\"#a6e22e\",fontWeight:\"bold\"},\"hljs-section\":{color:\"#a6e22e\",fontWeight:\"bold\"},\"hljs-emphasis\":{color:\"#a6e22e\"},\"hljs-type\":{color:\"#a6e22e\",fontWeight:\"bold\"},\"hljs-built_in\":{color:\"#a6e22e\"},\"hljs-builtin-name\":{color:\"#a6e22e\"},\"hljs-selector-attr\":{color:\"#a6e22e\"},\"hljs-selector-pseudo\":{color:\"#a6e22e\"},\"hljs-addition\":{color:\"#a6e22e\"},\"hljs-variable\":{color:\"#a6e22e\"},\"hljs-template-tag\":{color:\"#a6e22e\"},\"hljs-template-variable\":{color:\"#a6e22e\"},\"hljs-comment\":{color:\"#75715e\"},\"hljs-quote\":{color:\"#75715e\"},\"hljs-deletion\":{color:\"#75715e\"},\"hljs-meta\":{color:\"#75715e\"},\"hljs-doctag\":{fontWeight:\"bold\"},\"hljs-selector-id\":{fontWeight:\"bold\"}},nord:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#2E3440\",color:\"#D8DEE9\"},\"hljs-subst\":{color:\"#D8DEE9\"},\"hljs-selector-tag\":{color:\"#81A1C1\"},\"hljs-selector-id\":{color:\"#8FBCBB\",fontWeight:\"bold\"},\"hljs-selector-class\":{color:\"#8FBCBB\"},\"hljs-selector-attr\":{color:\"#8FBCBB\"},\"hljs-selector-pseudo\":{color:\"#88C0D0\"},\"hljs-addition\":{backgroundColor:\"rgba(163, 190, 140, 0.5)\"},\"hljs-deletion\":{backgroundColor:\"rgba(191, 97, 106, 0.5)\"},\"hljs-built_in\":{color:\"#8FBCBB\"},\"hljs-type\":{color:\"#8FBCBB\"},\"hljs-class\":{color:\"#8FBCBB\"},\"hljs-function\":{color:\"#88C0D0\"},\"hljs-function > .hljs-title\":{color:\"#88C0D0\"},\"hljs-keyword\":{color:\"#81A1C1\"},\"hljs-literal\":{color:\"#81A1C1\"},\"hljs-symbol\":{color:\"#81A1C1\"},\"hljs-number\":{color:\"#B48EAD\"},\"hljs-regexp\":{color:\"#EBCB8B\"},\"hljs-string\":{color:\"#A3BE8C\"},\"hljs-title\":{color:\"#8FBCBB\"},\"hljs-params\":{color:\"#D8DEE9\"},\"hljs-bullet\":{color:\"#81A1C1\"},\"hljs-code\":{color:\"#8FBCBB\"},\"hljs-emphasis\":{fontStyle:\"italic\"},\"hljs-formula\":{color:\"#8FBCBB\"},\"hljs-strong\":{fontWeight:\"bold\"},\"hljs-link:hover\":{textDecoration:\"underline\"},\"hljs-quote\":{color:\"#4C566A\"},\"hljs-comment\":{color:\"#4C566A\"},\"hljs-doctag\":{color:\"#8FBCBB\"},\"hljs-meta\":{color:\"#5E81AC\"},\"hljs-meta-keyword\":{color:\"#5E81AC\"},\"hljs-meta-string\":{color:\"#A3BE8C\"},\"hljs-attr\":{color:\"#8FBCBB\"},\"hljs-attribute\":{color:\"#D8DEE9\"},\"hljs-builtin-name\":{color:\"#81A1C1\"},\"hljs-name\":{color:\"#81A1C1\"},\"hljs-section\":{color:\"#88C0D0\"},\"hljs-tag\":{color:\"#81A1C1\"},\"hljs-variable\":{color:\"#D8DEE9\"},\"hljs-template-variable\":{color:\"#D8DEE9\"},\"hljs-template-tag\":{color:\"#5E81AC\"},\"abnf .hljs-attribute\":{color:\"#88C0D0\"},\"abnf .hljs-symbol\":{color:\"#EBCB8B\"},\"apache .hljs-attribute\":{color:\"#88C0D0\"},\"apache .hljs-section\":{color:\"#81A1C1\"},\"arduino .hljs-built_in\":{color:\"#88C0D0\"},\"aspectj .hljs-meta\":{color:\"#D08770\"},\"aspectj > .hljs-title\":{color:\"#88C0D0\"},\"bnf .hljs-attribute\":{color:\"#8FBCBB\"},\"clojure .hljs-name\":{color:\"#88C0D0\"},\"clojure .hljs-symbol\":{color:\"#EBCB8B\"},\"coq .hljs-built_in\":{color:\"#88C0D0\"},\"cpp .hljs-meta-string\":{color:\"#8FBCBB\"},\"css .hljs-built_in\":{color:\"#88C0D0\"},\"css .hljs-keyword\":{color:\"#D08770\"},\"diff .hljs-meta\":{color:\"#8FBCBB\"},\"ebnf .hljs-attribute\":{color:\"#8FBCBB\"},\"glsl .hljs-built_in\":{color:\"#88C0D0\"},\"groovy .hljs-meta:not(:first-child)\":{color:\"#D08770\"},\"haxe .hljs-meta\":{color:\"#D08770\"},\"java .hljs-meta\":{color:\"#D08770\"},\"ldif .hljs-attribute\":{color:\"#8FBCBB\"},\"lisp .hljs-name\":{color:\"#88C0D0\"},\"lua .hljs-built_in\":{color:\"#88C0D0\"},\"moonscript .hljs-built_in\":{color:\"#88C0D0\"},\"nginx .hljs-attribute\":{color:\"#88C0D0\"},\"nginx .hljs-section\":{color:\"#5E81AC\"},\"pf .hljs-built_in\":{color:\"#88C0D0\"},\"processing .hljs-built_in\":{color:\"#88C0D0\"},\"scss .hljs-keyword\":{color:\"#81A1C1\"},\"stylus .hljs-keyword\":{color:\"#81A1C1\"},\"swift .hljs-meta\":{color:\"#D08770\"},\"vim .hljs-built_in\":{color:\"#88C0D0\",fontStyle:\"italic\"},\"yaml .hljs-meta\":{color:\"#D08770\"}},obsidian:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#282b2e\",color:\"#e0e2e4\"},\"hljs-keyword\":{color:\"#93c763\",fontWeight:\"bold\"},\"hljs-selector-tag\":{color:\"#93c763\",fontWeight:\"bold\"},\"hljs-literal\":{color:\"#93c763\",fontWeight:\"bold\"},\"hljs-selector-id\":{color:\"#93c763\"},\"hljs-number\":{color:\"#ffcd22\"},\"hljs-attribute\":{color:\"#668bb0\"},\"hljs-code\":{color:\"white\"},\"hljs-class .hljs-title\":{color:\"white\"},\"hljs-section\":{color:\"white\",fontWeight:\"bold\"},\"hljs-regexp\":{color:\"#d39745\"},\"hljs-link\":{color:\"#d39745\"},\"hljs-meta\":{color:\"#557182\"},\"hljs-tag\":{color:\"#8cbbad\"},\"hljs-name\":{color:\"#8cbbad\",fontWeight:\"bold\"},\"hljs-bullet\":{color:\"#8cbbad\"},\"hljs-subst\":{color:\"#8cbbad\"},\"hljs-emphasis\":{color:\"#8cbbad\"},\"hljs-type\":{color:\"#8cbbad\",fontWeight:\"bold\"},\"hljs-built_in\":{color:\"#8cbbad\"},\"hljs-selector-attr\":{color:\"#8cbbad\"},\"hljs-selector-pseudo\":{color:\"#8cbbad\"},\"hljs-addition\":{color:\"#8cbbad\"},\"hljs-variable\":{color:\"#8cbbad\"},\"hljs-template-tag\":{color:\"#8cbbad\"},\"hljs-template-variable\":{color:\"#8cbbad\"},\"hljs-string\":{color:\"#ec7600\"},\"hljs-symbol\":{color:\"#ec7600\"},\"hljs-comment\":{color:\"#818e96\"},\"hljs-quote\":{color:\"#818e96\"},\"hljs-deletion\":{color:\"#818e96\"},\"hljs-selector-class\":{color:\"#A082BD\"},\"hljs-doctag\":{fontWeight:\"bold\"},\"hljs-title\":{fontWeight:\"bold\"},\"hljs-strong\":{fontWeight:\"bold\"}},\"tomorrow-night\":{\"hljs-comment\":{color:\"#969896\"},\"hljs-quote\":{color:\"#969896\"},\"hljs-variable\":{color:\"#cc6666\"},\"hljs-template-variable\":{color:\"#cc6666\"},\"hljs-tag\":{color:\"#cc6666\"},\"hljs-name\":{color:\"#cc6666\"},\"hljs-selector-id\":{color:\"#cc6666\"},\"hljs-selector-class\":{color:\"#cc6666\"},\"hljs-regexp\":{color:\"#cc6666\"},\"hljs-deletion\":{color:\"#cc6666\"},\"hljs-number\":{color:\"#de935f\"},\"hljs-built_in\":{color:\"#de935f\"},\"hljs-builtin-name\":{color:\"#de935f\"},\"hljs-literal\":{color:\"#de935f\"},\"hljs-type\":{color:\"#de935f\"},\"hljs-params\":{color:\"#de935f\"},\"hljs-meta\":{color:\"#de935f\"},\"hljs-link\":{color:\"#de935f\"},\"hljs-attribute\":{color:\"#f0c674\"},\"hljs-string\":{color:\"#b5bd68\"},\"hljs-symbol\":{color:\"#b5bd68\"},\"hljs-bullet\":{color:\"#b5bd68\"},\"hljs-addition\":{color:\"#b5bd68\"},\"hljs-title\":{color:\"#81a2be\"},\"hljs-section\":{color:\"#81a2be\"},\"hljs-keyword\":{color:\"#b294bb\"},\"hljs-selector-tag\":{color:\"#b294bb\"},hljs:{display:\"block\",overflowX:\"auto\",background:\"#1d1f21\",color:\"#c5c8c6\",padding:\"0.5em\"},\"hljs-emphasis\":{fontStyle:\"italic\"},\"hljs-strong\":{fontWeight:\"bold\"}}},Q=o()(X),ee=function(e){return i()(Q).call(Q,e)?X[e]:(console.warn(\"Request style '\".concat(e,\"' is not available, returning default instead\")),Z)}},function(e,t){e.exports=!0},function(e,t,n){var r=n(237),o=n(68).f,a=n(67),i=n(55),s=n(548),u=n(41)(\"toStringTag\");e.exports=function(e,t,n,c){if(e){var l=n?e:e.prototype;i(l,u)||o(l,u,{configurable:!0,value:t}),c&&!r&&a(l,\"toString\",s)}}},function(e,t,n){var r=n(237),o=n(151),a=n(41)(\"toStringTag\"),i=\"Arguments\"==o(function(){return arguments}());e.exports=r?o:function(e){var t,n,r;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),a))?n:i?o(t):\"Object\"==(r=o(t))&&\"function\"==typeof t.callee?\"Arguments\":r}},function(e,t,n){\"use strict\";e.exports=function(e){if(\"function\"!=typeof e)throw new TypeError(e+\" is not a function\");return e}},function(e,t,n){e.exports=n(679)},function(e,t,n){\"use strict\";function r(e){return function(e){try{return!!JSON.parse(e)}catch(e){return null}}(e)?\"json\":null}n.d(t,\"a\",(function(){return r}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_LAYOUT\",(function(){return o})),n.d(t,\"UPDATE_FILTER\",(function(){return a})),n.d(t,\"UPDATE_MODE\",(function(){return i})),n.d(t,\"SHOW\",(function(){return s})),n.d(t,\"updateLayout\",(function(){return u})),n.d(t,\"updateFilter\",(function(){return c})),n.d(t,\"show\",(function(){return l})),n.d(t,\"changeMode\",(function(){return p}));var r=n(5),o=\"layout_update_layout\",a=\"layout_update_filter\",i=\"layout_update_mode\",s=\"layout_show\";function u(e){return{type:o,payload:e}}function c(e){return{type:a,payload:e}}function l(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=Object(r.v)(e),{type:s,payload:{thing:e,shown:t}}}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";return e=Object(r.v)(e),{type:i,payload:{thing:e,mode:t}}}},function(e,t,n){var r=n(421),o=n(161),a=n(192),i=n(50),s=n(115),u=n(193),c=n(160),l=n(249),p=Object.prototype.hasOwnProperty;e.exports=function(e){if(null==e)return!0;if(s(e)&&(i(e)||\"string\"==typeof e||\"function\"==typeof e.splice||u(e)||l(e)||a(e)))return!e.length;var t=o(e);if(\"[object Map]\"==t||\"[object Set]\"==t)return!e.size;if(c(e))return!r(e).length;for(var n in e)if(p.call(e,n))return!1;return!0}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){e.exports=function(e){if(null==e)throw TypeError(\"Can't call method on \"+e);return e}},function(e,t,n){var r=n(77);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){var r=n(70);e.exports=r(\"navigator\",\"userAgent\")||\"\"},function(e,t,n){var r,o=n(52),a=n(230),i=n(233),s=n(156),u=n(366),c=n(225),l=n(181),p=l(\"IE_PROTO\"),f=function(){},h=function(e){return\"<script>\"+e+\"</\"+\"script>\"},d=function(){try{r=document.domain&&new ActiveXObject(\"htmlfile\")}catch(e){}var e,t;d=r?function(e){e.write(h(\"\")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):((t=c(\"iframe\")).style.display=\"none\",u.appendChild(t),t.src=String(\"javascript:\"),(e=t.contentWindow.document).open(),e.write(h(\"document.F=Object\")),e.close(),e.F);for(var n=i.length;n--;)delete d.prototype[i[n]];return d()};s[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(f.prototype=o(e),n=new f,f.prototype=null,n[p]=e):n=d(),void 0===t?n:a(n,t)}},function(e,t,n){var r=n(67);e.exports=function(e,t,n,o){o&&o.enumerable?e[t]=n:r(e,t,n)}},function(e,t,n){\"use strict\";var r=n(37);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},function(e,t,n){var r=n(134),o=n(686),a=n(687),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?\"[object Undefined]\":\"[object Null]\":i&&i in Object(e)?o(e):a(e)}},function(e,t,n){var r=n(704),o=n(707);e.exports=function(e,t){var n=o(e,t);return r(n)?n:void 0}},function(e,t,n){var r=n(420),o=n(421),a=n(115);e.exports=function(e){return a(e)?r(e):o(e)}},function(e,t,n){var r=n(124),o=n(250);e.exports=function(e){return null!=e&&o(e.length)&&!r(e)}},function(e,t,n){\"use strict\";var r=n(197),o=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t};e.exports=p;var a=n(162);a.inherits=n(61);var i=n(430),s=n(257);a.inherits(p,i);for(var u=o(s.prototype),c=0;c<u.length;c++){var l=u[c];p.prototype[l]||(p.prototype[l]=s.prototype[l])}function p(e){if(!(this instanceof p))return new p(e);i.call(this,e),s.call(this,e),e&&!1===e.readable&&(this.readable=!1),e&&!1===e.writable&&(this.writable=!1),this.allowHalfOpen=!0,e&&!1===e.allowHalfOpen&&(this.allowHalfOpen=!1),this.once(\"end\",f)}function f(){this.allowHalfOpen||this._writableState.ended||r.nextTick(h,this)}function h(e){e.end()}Object.defineProperty(p.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),Object.defineProperty(p.prototype,\"destroyed\",{get:function(){return void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed&&this._writableState.destroyed)},set:function(e){void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed=e,this._writableState.destroyed=e)}}),p.prototype._destroy=function(e,t){this.push(null),this.end(),r.nextTick(t,e)}},function(e,t,n){\"use strict\";var r=n(780)();e.exports=function(e){return e!==r&&null!==e}},function(e,t,n){\"use strict\";var r=n(781),o=Math.max;e.exports=function(e){return o(0,r(e))}},function(e,t,n){},function(e,t,n){\"use strict\";var r=n(441),o=n(795),a=n(438),i=n(436),s=n(799);(e.exports=function(e,t){var n,o,u,c,l;return arguments.length<2||\"string\"!=typeof e?(c=t,t=e,e=null):c=arguments[2],r(e)?(n=s.call(e,\"c\"),o=s.call(e,\"e\"),u=s.call(e,\"w\")):(n=u=!0,o=!1),l={value:t,configurable:n,enumerable:o,writable:u},c?a(i(c),l):l}).gs=function(e,t,n){var u,c,l,p;return\"string\"!=typeof e?(l=n,n=t,t=e,e=null):l=arguments[3],r(t)?o(t)?r(n)?o(n)||(l=n,n=void 0):n=void 0:(l=t,t=n=void 0):t=void 0,r(e)?(u=s.call(e,\"c\"),c=s.call(e,\"e\")):(u=!0,c=!1),p={get:t,set:n,configurable:u,enumerable:c},l?a(i(l),p):p}},function(e,t,n){var r=n(52),o=n(397),a=n(69),i=n(107),s=n(159),u=n(396),c=function(e,t){this.stopped=e,this.result=t};e.exports=function(e,t,n){var l,p,f,h,d,m,v,g=n&&n.that,y=!(!n||!n.AS_ENTRIES),b=!(!n||!n.IS_ITERATOR),_=!(!n||!n.INTERRUPTED),w=i(t,g,1+y+_),x=function(e){return l&&u(l),new c(!0,e)},E=function(e){return y?(r(e),_?w(e[0],e[1],x):w(e[0],e[1])):_?w(e,x):w(e)};if(b)l=e;else{if(\"function\"!=typeof(p=s(e)))throw TypeError(\"Target is not iterable\");if(o(p)){for(f=0,h=a(e.length);h>f;f++)if((d=E(e[f]))&&d instanceof c)return d;return new c(!1)}l=p.call(e)}for(m=l.next;!(v=m.call(l)).done;){try{d=E(v.value)}catch(e){throw u(l),e}if(\"object\"==typeof d&&d&&d instanceof c)return d}return new c(!1)}},function(e,t,n){\"use strict\";var r=n(30),o=(n(25),function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)}),a=function(e){var t=this;e instanceof t||r(\"25\"),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},i=o,s={addPoolingTo:function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||i,n.poolSize||(n.poolSize=10),n.release=a,n},oneArgumentPooler:o,twoArgumentPooler:function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},threeArgumentPooler:function(e,t,n){var r=this;if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,e,t,n),o}return new r(e,t,n)},fourArgumentPooler:function(e,t,n,r){var o=this;if(o.instancePool.length){var a=o.instancePool.pop();return o.call(a,e,t,n,r),a}return new o(e,t,n,r)}};e.exports=s},function(e,t){e.exports=function(e,t){return e===t||e!=e&&t!=t}},function(e,t,n){var r=n(112),o=n(57);e.exports=function(e){if(!o(e))return!1;var t=r(e);return\"[object Function]\"==t||\"[object GeneratorFunction]\"==t||\"[object AsyncFunction]\"==t||\"[object Proxy]\"==t}},function(e,t,n){e.exports=n(1095)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return l}));var r=n(12),o=n.n(r),a=n(4),i=n.n(a),s=n(517),u=n.n(s),c=[n(288),n(289)];function l(e){var t,n={jsSpec:{}},r=u()(c,(function(e,t){try{var r=t.transform(e,n);return o()(r).call(r,(function(e){return!!e}))}catch(t){return console.error(\"Transformer error:\",t),e}}),e);return i()(t=o()(r).call(r,(function(e){return!!e}))).call(t,(function(e){return!e.get(\"line\")&&e.get(\"path\"),e}))}},function(e,t,n){var r=n(48),o=n(176),a=n(105),i=n(66),s=n(178),u=n(55),c=n(361),l=Object.getOwnPropertyDescriptor;t.f=r?l:function(e,t){if(e=i(e),t=s(t,!0),c)try{return l(e,t)}catch(e){}if(u(e,t))return a(!o.f.call(e,t),e[t])}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r,o,a=n(40),i=n(108),s=a.process,u=s&&s.versions,c=u&&u.v8;c?o=(r=c.split(\".\"))[0]<4?1:r[0]+r[1]:i&&(!(r=i.match(/Edge\\/(\\d+)/))||r[1]>=74)&&(r=i.match(/Chrome\\/(\\d+)/))&&(o=r[1]),e.exports=o&&+o},function(e,t,n){\"use strict\";var r=n(370).charAt,o=n(78),a=n(238),i=\"String Iterator\",s=o.set,u=o.getterFor(i);a(String,\"String\",(function(e){s(this,{type:i,string:String(e),index:0})}),(function(){var e,t=u(this),n=t.string,o=t.index;return o>=n.length?{value:void 0,done:!0}:(e=r(n,o),t.index+=e.length,{value:e,done:!1})}))},function(e,t){e.exports={}},function(e,t,n){\"use strict\";var r=n(38),o=n(383),a=n(613),i=n(618),s=n(133),u=n(619),c=n(623),l=n(624),p=n(626),f=s.createElement,h=s.createFactory,d=s.cloneElement,m=r,v={Children:{map:a.map,forEach:a.forEach,count:a.count,toArray:a.toArray,only:p},Component:o.Component,PureComponent:o.PureComponent,createElement:f,cloneElement:d,isValidElement:s.isValidElement,PropTypes:u,createClass:l,createFactory:h,createMixin:function(e){return e},DOM:i,version:c,__spread:m};e.exports=v},function(e,t,n){\"use strict\";var r=n(38),o=n(88),a=(n(33),n(385),Object.prototype.hasOwnProperty),i=n(386),s={key:!0,ref:!0,__self:!0,__source:!0};function u(e){return void 0!==e.ref}function c(e){return void 0!==e.key}var l=function(e,t,n,r,o,a,s){return{$$typeof:i,type:e,key:t,ref:n,props:s,_owner:a}};l.createElement=function(e,t,n){var r,i={},p=null,f=null;if(null!=t)for(r in u(t)&&(f=t.ref),c(t)&&(p=\"\"+t.key),void 0===t.__self?null:t.__self,void 0===t.__source?null:t.__source,t)a.call(t,r)&&!s.hasOwnProperty(r)&&(i[r]=t[r]);var h=arguments.length-2;if(1===h)i.children=n;else if(h>1){for(var d=Array(h),m=0;m<h;m++)d[m]=arguments[m+2];0,i.children=d}if(e&&e.defaultProps){var v=e.defaultProps;for(r in v)void 0===i[r]&&(i[r]=v[r])}return l(e,p,f,0,0,o.current,i)},l.createFactory=function(e){var t=l.createElement.bind(null,e);return t.type=e,t},l.cloneAndReplaceKey=function(e,t){return l(e.type,t,e.ref,e._self,e._source,e._owner,e.props)},l.cloneElement=function(e,t,n){var i,p,f=r({},e.props),h=e.key,d=e.ref,m=(e._self,e._source,e._owner);if(null!=t)for(i in u(t)&&(d=t.ref,m=o.current),c(t)&&(h=\"\"+t.key),e.type&&e.type.defaultProps&&(p=e.type.defaultProps),t)a.call(t,i)&&!s.hasOwnProperty(i)&&(void 0===t[i]&&void 0!==p?f[i]=p[i]:f[i]=t[i]);var v=arguments.length-2;if(1===v)f.children=n;else if(v>1){for(var g=Array(v),y=0;y<v;y++)g[y]=arguments[y+2];f.children=g}return l(e.type,h,d,0,0,m,f)},l.isValidElement=function(e){return\"object\"==typeof e&&null!==e&&e.$$typeof===i},e.exports=l},function(e,t,n){var r=n(71).Symbol;e.exports=r},function(e,t,n){var r=n(50),o=n(253),a=n(751),i=n(92);e.exports=function(e,t){return r(e)?e:o(e,t)?[e]:a(i(e))}},function(e,t,n){var r=n(186);e.exports=function(e){if(\"string\"==typeof e||r(e))return e;var t=e+\"\";return\"0\"==t&&1/e==-Infinity?\"-0\":t}},function(e,t,n){\"use strict\";var r=n(117);e.exports=function(e){if(!r(e))throw new TypeError(\"Cannot use null or undefined\");return e}},function(e,t,n){var r=n(62).Buffer;function o(e,t){this._block=r.alloc(e),this._finalSize=t,this._blockSize=e,this._len=0}o.prototype.update=function(e,t){\"string\"==typeof e&&(t=t||\"utf8\",e=r.from(e,t));for(var n=this._block,o=this._blockSize,a=e.length,i=this._len,s=0;s<a;){for(var u=i%o,c=Math.min(a-s,o-u),l=0;l<c;l++)n[u+l]=e[s+l];s+=c,(i+=c)%o==0&&this._update(n)}return this._len+=a,this},o.prototype.digest=function(e){var t=this._len%this._blockSize;this._block[t]=128,this._block.fill(0,t+1),t>=this._finalSize&&(this._update(this._block),this._block.fill(0));var n=8*this._len;if(n<=4294967295)this._block.writeUInt32BE(n,this._blockSize-4);else{var r=(4294967295&n)>>>0,o=(n-r)/4294967296;this._block.writeUInt32BE(o,this._blockSize-8),this._block.writeUInt32BE(r,this._blockSize-4)}this._update(this._block);var a=this._hash();return e?a.toString(e):a},o.prototype._update=function(){throw new Error(\"_update must be implemented by subclass\")},e.exports=o},function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError(\"Incorrect \"+(n?n+\" \":\"\")+\"invocation\");return e}},function(e,t,n){\"use strict\";var r=n(30);n(25);function o(e,t){return(e&t)===t}var a={MUST_USE_PROPERTY:1,HAS_BOOLEAN_VALUE:4,HAS_NUMERIC_VALUE:8,HAS_POSITIVE_NUMERIC_VALUE:24,HAS_OVERLOADED_BOOLEAN_VALUE:32,injectDOMPropertyConfig:function(e){var t=a,n=e.Properties||{},i=e.DOMAttributeNamespaces||{},u=e.DOMAttributeNames||{},c=e.DOMPropertyNames||{},l=e.DOMMutationMethods||{};for(var p in e.isCustomAttribute&&s._isCustomAttributeFunctions.push(e.isCustomAttribute),n){s.properties.hasOwnProperty(p)&&r(\"48\",p);var f=p.toLowerCase(),h=n[p],d={attributeName:f,attributeNamespace:null,propertyName:p,mutationMethod:null,mustUseProperty:o(h,t.MUST_USE_PROPERTY),hasBooleanValue:o(h,t.HAS_BOOLEAN_VALUE),hasNumericValue:o(h,t.HAS_NUMERIC_VALUE),hasPositiveNumericValue:o(h,t.HAS_POSITIVE_NUMERIC_VALUE),hasOverloadedBooleanValue:o(h,t.HAS_OVERLOADED_BOOLEAN_VALUE)};if(d.hasBooleanValue+d.hasNumericValue+d.hasOverloadedBooleanValue<=1||r(\"50\",p),u.hasOwnProperty(p)){var m=u[p];d.attributeName=m}i.hasOwnProperty(p)&&(d.attributeNamespace=i[p]),c.hasOwnProperty(p)&&(d.propertyName=c[p]),l.hasOwnProperty(p)&&(d.mutationMethod=l[p]),s.properties[p]=d}}},i=\":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\",s={ID_ATTRIBUTE_NAME:\"data-reactid\",ROOT_ATTRIBUTE_NAME:\"data-reactroot\",ATTRIBUTE_NAME_START_CHAR:i,ATTRIBUTE_NAME_CHAR:i+\"\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\",properties:{},getPossibleStandardName:null,_isCustomAttributeFunctions:[],isCustomAttribute:function(e){for(var t=0;t<s._isCustomAttributeFunctions.length;t++){if((0,s._isCustomAttributeFunctions[t])(e))return!0}return!1},injection:a};e.exports=s},function(e,t,n){\"use strict\";var r=n(925);n(72),n(33);function o(){r.attachRefs(this,this._currentElement)}var a={mountComponent:function(e,t,n,r,a,i){var s=e.mountComponent(t,n,r,a,i);return e._currentElement&&null!=e._currentElement.ref&&t.getReactMountReady().enqueue(o,e),s},getHostNode:function(e){return e.getHostNode()},unmountComponent:function(e,t){r.detachRefs(e,e._currentElement),e.unmountComponent(t)},receiveComponent:function(e,t,n,a){var i=e._currentElement;if(t!==i||a!==e._context){0;var s=r.shouldUpdateRefs(i,t);s&&r.detachRefs(e,i),e.receiveComponent(t,n,a),s&&e._currentElement&&null!=e._currentElement.ref&&n.getReactMountReady().enqueue(o,e)}},performUpdateIfNecessary:function(e,t,n){e._updateBatchNumber===n&&e.performUpdateIfNecessary(t)}};e.exports=a},function(e,t,n){\"use strict\";var r=n(268),o=n(204),a=n(269),i=n(476),s=\"undefined\"!=typeof document&&\"number\"==typeof document.documentMode||\"undefined\"!=typeof navigator&&\"string\"==typeof navigator.userAgent&&/\\bEdge\\/\\d/.test(navigator.userAgent);function u(e){if(s){var t=e.node,n=e.children;if(n.length)for(var r=0;r<n.length;r++)c(t,n[r],null);else null!=e.html?o(t,e.html):null!=e.text&&i(t,e.text)}}var c=a((function(e,t,n){11===t.node.nodeType||1===t.node.nodeType&&\"object\"===t.node.nodeName.toLowerCase()&&(null==t.node.namespaceURI||t.node.namespaceURI===r.html)?(u(t),e.insertBefore(t.node,n)):(e.insertBefore(t.node,n),u(t))}));function l(){return this.node.nodeName}function p(e){return{node:e,children:[],html:null,text:null,toString:l}}p.insertTreeBefore=c,p.replaceChildWithTree=function(e,t){e.parentNode.replaceChild(t.node,e),u(t)},p.queueChild=function(e,t){s?e.children.push(t):e.node.appendChild(t.node)},p.queueHTML=function(e,t){s?e.html=t:o(e.node,t)},p.queueText=function(e,t){s?e.text=t:i(e.node,t)},e.exports=p},function(e,t,n){var r=n(201),o=n(463);e.exports=function(e,t,n,a){var i=!n;n||(n={});for(var s=-1,u=t.length;++s<u;){var c=t[s],l=a?a(n[c],e[c],c,n,e):void 0;void 0===l&&(l=e[c]),i?o(n,c,l):r(n,c,l)}return n}},function(e,t,n){var r=n(112),o=n(278),a=n(89),i=Function.prototype,s=Object.prototype,u=i.toString,c=s.hasOwnProperty,l=u.call(Object);e.exports=function(e){if(!a(e)||\"[object Object]\"!=r(e))return!1;var t=o(e);if(null===t)return!0;var n=c.call(t,\"constructor\")&&t.constructor;return\"function\"==typeof n&&n instanceof n&&u.call(n)==l}},function(e,t,n){\"use strict\";(function(t){class n extends Error{constructor(e){super(n._prepareSuperMessage(e)),Object.defineProperty(this,\"name\",{value:\"NonError\",configurable:!0,writable:!0}),Error.captureStackTrace&&Error.captureStackTrace(this,n)}static _prepareSuperMessage(e){try{return JSON.stringify(e)}catch{return String(e)}}}const r=[{property:\"name\",enumerable:!1},{property:\"message\",enumerable:!1},{property:\"stack\",enumerable:!1},{property:\"code\",enumerable:!0}],o=Symbol(\".toJSON called\"),a=({from:e,seen:n,to_:i,forceEnumerable:s,maxDepth:u,depth:c})=>{const l=i||(Array.isArray(e)?[]:{});if(n.push(e),c>=u)return l;if(\"function\"==typeof e.toJSON&&!0!==e[o])return(e=>{e[o]=!0;const t=e.toJSON();return delete e[o],t})(e);for(const[r,o]of Object.entries(e))\"function\"==typeof t&&t.isBuffer(o)?l[r]=\"[object Buffer]\":\"function\"!=typeof o&&(o&&\"object\"==typeof o?n.includes(e[r])?l[r]=\"[Circular]\":(c++,l[r]=a({from:e[r],seen:n.slice(),forceEnumerable:s,maxDepth:u,depth:c})):l[r]=o);for(const{property:t,enumerable:n}of r)\"string\"==typeof e[t]&&Object.defineProperty(l,t,{value:e[t],enumerable:!!s||n,configurable:!0,writable:!0});return l};e.exports={serializeError:(e,t={})=>{const{maxDepth:n=Number.POSITIVE_INFINITY}=t;return\"object\"==typeof e&&null!==e?a({from:e,seen:[],forceEnumerable:!0,maxDepth:n,depth:0}):\"function\"==typeof e?`[Function: ${e.name||\"anonymous\"}]`:e},deserializeError:(e,t={})=>{const{maxDepth:r=Number.POSITIVE_INFINITY}=t;if(e instanceof Error)return e;if(\"object\"==typeof e&&null!==e&&!Array.isArray(e)){const t=new Error;return a({from:e,seen:[],to_:t,maxDepth:r,depth:0}),t}return new n(e)}}}).call(this,n(73).Buffer)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"sampleFromSchemaGeneric\",(function(){return B})),n.d(t,\"inferSchema\",(function(){return F})),n.d(t,\"createXMLExample\",(function(){return U})),n.d(t,\"sampleFromSchema\",(function(){return q})),n.d(t,\"memoizedCreateXMLExample\",(function(){return z})),n.d(t,\"memoizedSampleFromSchema\",(function(){return V}));var r=n(18),o=n.n(r),a=n(2),i=n.n(a),s=n(17),u=n.n(s),c=n(23),l=n.n(c),p=n(22),f=n.n(p),h=n(31),d=n.n(h),m=n(75),v=n.n(m),g=n(19),y=n.n(g),b=n(64),_=n.n(b),w=n(4),x=n.n(w),E=n(5),S=n(513),C=n.n(S),A=n(347),k=n.n(A),O=n(104),j=n.n(O),T={string:function(){return\"string\"},string_email:function(){return\"user@example.com\"},\"string_date-time\":function(){return(new Date).toISOString()},string_date:function(){return(new Date).toISOString().substring(0,10)},string_uuid:function(){return\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"},string_hostname:function(){return\"example.com\"},string_ipv4:function(){return\"198.51.100.42\"},string_ipv6:function(){return\"2001:0db8:5b96:0000:0000:426f:8e17:642a\"},number:function(){return 0},number_float:function(){return 0},integer:function(){return 0},boolean:function(e){return\"boolean\"!=typeof e.default||e.default}},I=function(e){var t,n=e=Object(E.z)(e),r=n.type,o=n.format,a=T[i()(t=\"\".concat(r,\"_\")).call(t,o)]||T[r];return Object(E.s)(a)?a(e):\"Unknown Type: \"+e.type},P=function(e){return Object(E.e)(e,\"$$ref\",(function(e){return\"string\"==typeof e&&u()(e).call(e,\"#\")>-1}))},N=[\"maxProperties\",\"minProperties\"],M=[\"minItems\",\"maxItems\"],R=[\"minimum\",\"maximum\",\"exclusiveMinimum\",\"exclusiveMaximum\"],D=[\"minLength\",\"maxLength\"],L=function e(t,n){var r,o,a,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},c=function(e){void 0===n[e]&&void 0!==t[e]&&(n[e]=t[e])};(l()(r=i()(o=[\"example\",\"default\",\"enum\",\"xml\",\"type\"]).call(o,N,M,R,D)).call(r,(function(e){return c(e)})),void 0!==t.required&&f()(t.required))&&(void 0!==n.required&&n.required.length||(n.required=[]),l()(a=t.required).call(a,(function(e){var t;d()(t=n.required).call(t,e)||n.required.push(e)})));if(t.properties){n.properties||(n.properties={});var p=Object(E.z)(t.properties);for(var h in p){var m;if(Object.prototype.hasOwnProperty.call(p,h))if(!p[h]||!p[h].deprecated)if(!p[h]||!p[h].readOnly||s.includeReadOnly)if(!p[h]||!p[h].writeOnly||s.includeWriteOnly)if(!n.properties[h])n.properties[h]=p[h],!t.required&&f()(t.required)&&-1!==u()(m=t.required).call(m,h)&&(n.required?n.required.push(h):n.required=[h])}}return t.items&&(n.items||(n.items={}),n.items=e(t.items,n.items,s)),n},B=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3];t&&Object(E.s)(t.toJS)&&(t=t.toJS());var s=void 0!==r||t&&void 0!==t.example||t&&void 0!==t.default,c=!s&&t&&t.oneOf&&t.oneOf.length>0,p=!s&&t&&t.anyOf&&t.anyOf.length>0;if(!s&&(c||p)){var h=Object(E.z)(c?t.oneOf[0]:t.anyOf[0]);if(L(h,t,n),!t.xml&&h.xml&&(t.xml=h.xml),void 0!==t.example&&void 0!==h.example)s=!0;else if(h.properties){t.properties||(t.properties={});var m=Object(E.z)(h.properties);for(var g in m){var b;if(Object.prototype.hasOwnProperty.call(m,g))if(!m[g]||!m[g].deprecated)if(!m[g]||!m[g].readOnly||n.includeReadOnly)if(!m[g]||!m[g].writeOnly||n.includeWriteOnly)if(!t.properties[g])t.properties[g]=m[g],!h.required&&f()(h.required)&&-1!==u()(b=h.required).call(b,g)&&(t.required?t.required.push(g):t.required=[g])}}}var w,S={},C=t||{},A=C.xml,k=C.type,O=C.example,T=C.properties,D=C.additionalProperties,B=C.items,F=n.includeReadOnly,U=n.includeWriteOnly,q=A=A||{},z=q.name,V=q.prefix,W=q.namespace,H={};if(a&&(w=(V?V+\":\":\"\")+(z=z||\"notagname\"),W)){var $=V?\"xmlns:\"+V:\"xmlns\";S[$]=W}a&&(H[w]=[]);var J=function(e){return v()(e).call(e,(function(e){return Object.prototype.hasOwnProperty.call(t,e)}))};t&&!k&&(T||D||J(N)?k=\"object\":B||J(M)?k=\"array\":J(R)?(k=\"number\",t.type=\"number\"):s||t.enum||(k=\"string\",t.type=\"string\"));var K,Y,G=function(e){var n,r,o,a,i;null!==(null===(n=t)||void 0===n?void 0:n.maxItems)&&void 0!==(null===(r=t)||void 0===r?void 0:r.maxItems)&&(e=y()(e).call(e,0,null===(i=t)||void 0===i?void 0:i.maxItems));if(null!==(null===(o=t)||void 0===o?void 0:o.minItems)&&void 0!==(null===(a=t)||void 0===a?void 0:a.minItems))for(var s=0;e.length<(null===(u=t)||void 0===u?void 0:u.minItems);){var u;e.push(e[s++%e.length])}return e},Z=Object(E.z)(T),X=0,Q=function(){return t&&null!==t.maxProperties&&void 0!==t.maxProperties&&X>=t.maxProperties},ee=function(){if(!t||!t.required)return 0;var e,n,r=0;a?l()(e=t.required).call(e,(function(e){return r+=void 0===H[e]?0:1})):l()(n=t.required).call(n,(function(e){var t;return r+=void 0===(null===(t=H[w])||void 0===t?void 0:_()(t).call(t,(function(t){return void 0!==t[e]})))?0:1}));return t.required.length-r},te=function(e){var n;return!(t&&t.required&&t.required.length)||!d()(n=t.required).call(n,e)},ne=function(e){return!t||null===t.maxProperties||void 0===t.maxProperties||!Q()&&(!te(e)||t.maxProperties-X-ee()>0)};if(K=a?function(r){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(t&&Z[r]){if(Z[r].xml=Z[r].xml||{},Z[r].xml.attribute){var s=f()(Z[r].enum)?Z[r].enum[0]:void 0,u=Z[r].example,c=Z[r].default;return void(S[Z[r].xml.name||r]=void 0!==u?u:void 0!==c?c:void 0!==s?s:I(Z[r]))}Z[r].xml.name=Z[r].xml.name||r}else Z[r]||!1===D||(Z[r]={xml:{name:r}});var l,p=e(t&&Z[r]||void 0,n,o,a);ne(r)&&(X++,f()(p)?H[w]=i()(l=H[w]).call(l,p):H[w].push(p))}:function(t,r){ne(t)&&(H[t]=e(Z[t],n,r,a),X++)},s){var re;if(re=P(void 0!==r?r:void 0!==O?O:t.default),!a){if(\"number\"==typeof re&&\"string\"===k)return\"\".concat(re);if(\"string\"!=typeof re||\"string\"===k)return re;try{return JSON.parse(re)}catch(e){return re}}if(t||(k=f()(re)?\"array\":o()(re)),\"array\"===k){if(!f()(re)){if(\"string\"==typeof re)return re;re=[re]}var oe=t?t.items:void 0;oe&&(oe.xml=oe.xml||A||{},oe.xml.name=oe.xml.name||A.name);var ae=x()(re).call(re,(function(t){return e(oe,n,t,a)}));return ae=G(ae),A.wrapped?(H[w]=ae,j()(S)||H[w].push({_attr:S})):H=ae,H}if(\"object\"===k){if(\"string\"==typeof re)return re;for(var ie in re)Object.prototype.hasOwnProperty.call(re,ie)&&(t&&Z[ie]&&Z[ie].readOnly&&!F||t&&Z[ie]&&Z[ie].writeOnly&&!U||(t&&Z[ie]&&Z[ie].xml&&Z[ie].xml.attribute?S[Z[ie].xml.name||ie]=re[ie]:K(ie,re[ie])));return j()(S)||H[w].push({_attr:S}),H}return H[w]=j()(S)?re:[{_attr:S},re],H}if(\"object\"===k){for(var se in Z)Object.prototype.hasOwnProperty.call(Z,se)&&(Z[se]&&Z[se].deprecated||Z[se]&&Z[se].readOnly&&!F||Z[se]&&Z[se].writeOnly&&!U||K(se));if(a&&S&&H[w].push({_attr:S}),Q())return H;if(!0===D)a?H[w].push({additionalProp:\"Anything can be here\"}):H.additionalProp1={},X++;else if(D){var ue=Object(E.z)(D),ce=e(ue,n,void 0,a);if(a&&ue.xml&&ue.xml.name&&\"notagname\"!==ue.xml.name)H[w].push(ce);else for(var le=null!==t.minProperties&&void 0!==t.minProperties&&X<t.minProperties?t.minProperties-X:4,pe=1;pe<le;pe++){if(Q())return H;if(a){var fe={};fe[\"additionalProp\"+pe]=ce.notagname,H[w].push(fe)}else H[\"additionalProp\"+pe]=ce;X++}}return H}if(\"array\"===k){if(!B)return;var he,de,me;if(a)B.xml=B.xml||(null===(de=t)||void 0===de?void 0:de.xml)||{},B.xml.name=B.xml.name||A.name;if(f()(B.anyOf))he=x()(me=B.anyOf).call(me,(function(t){return e(L(B,t,n),n,void 0,a)}));else if(f()(B.oneOf)){var ve;he=x()(ve=B.oneOf).call(ve,(function(t){return e(L(B,t,n),n,void 0,a)}))}else{if(!(!a||a&&A.wrapped))return e(B,n,void 0,a);he=[e(B,n,void 0,a)]}return he=G(he),a&&A.wrapped?(H[w]=he,j()(S)||H[w].push({_attr:S}),H):he}if(t&&f()(t.enum))Y=Object(E.v)(t.enum)[0];else{if(!t)return;if(\"number\"==typeof(Y=I(t))){var ge=t.minimum;null!=ge&&(t.exclusiveMinimum&&ge++,Y=ge);var ye=t.maximum;null!=ye&&(t.exclusiveMaximum&&ye--,Y=ye)}if(\"string\"==typeof Y&&(null!==t.maxLength&&void 0!==t.maxLength&&(Y=y()(Y).call(Y,0,t.maxLength)),null!==t.minLength&&void 0!==t.minLength))for(var be=0;Y.length<t.minLength;)Y+=Y[be++%Y.length]}if(\"file\"!==k)return a?(H[w]=j()(S)?Y:[{_attr:S},Y],H):Y},F=function(e){return e.schema&&(e=e.schema),e.properties&&(e.type=\"object\"),e},U=function(e,t,n){var r=B(e,t,n,!0);if(r)return\"string\"==typeof r?r:C()(r,{declaration:!0,indent:\"\\t\"})},q=function(e,t,n){return B(e,t,n,!1)},z=k()(U),V=k()(q)},function(e,t,n){\"use strict\";var r=n(1037).CopyToClipboard;r.CopyToClipboard=r,e.exports=r},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_CONFIGS\",(function(){return a})),n.d(t,\"TOGGLE_CONFIGS\",(function(){return i})),n.d(t,\"update\",(function(){return s})),n.d(t,\"toggle\",(function(){return u})),n.d(t,\"loaded\",(function(){return c}));var r=n(3),o=n.n(r),a=\"configs_update\",i=\"configs_toggle\";function s(e,t){return{type:a,payload:o()({},e,t)}}function u(e){return{type:i,payload:e}}var c=function(){return function(e){var t=e.getConfigs,n=e.authActions;if(t().persistAuthorization){var r=localStorage.getItem(\"authorized\");r&&n.restoreAuthorization({authorized:JSON.parse(r)})}}}},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return l}));var r=n(12),o=n.n(r),a=n(31),i=n.n(a),s=n(1),u=n.n(s),c=u.a.Set.of(\"type\",\"format\",\"items\",\"default\",\"maximum\",\"exclusiveMaximum\",\"minimum\",\"exclusiveMinimum\",\"maxLength\",\"minLength\",\"pattern\",\"maxItems\",\"minItems\",\"uniqueItems\",\"enum\",\"multipleOf\");function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isOAS3;if(!u.a.Map.isMap(e))return{schema:u.a.Map(),parameterContentMediaType:null};if(!n)return\"body\"===e.get(\"in\")?{schema:e.get(\"schema\",u.a.Map()),parameterContentMediaType:null}:{schema:o()(e).call(e,(function(e,t){return i()(c).call(c,t)})),parameterContentMediaType:null};if(e.get(\"content\")){var r=e.get(\"content\",u.a.Map({})).keySeq(),a=r.first();return{schema:e.getIn([\"content\",a,\"schema\"],u.a.Map()),parameterContentMediaType:a}}return{schema:e.get(\"schema\",u.a.Map()),parameterContentMediaType:null}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"createStore\",(function(){return C})),n.d(t,\"combineReducers\",(function(){return k})),n.d(t,\"bindActionCreators\",(function(){return j})),n.d(t,\"applyMiddleware\",(function(){return P})),n.d(t,\"compose\",(function(){return T}));var r=n(508),o=\"object\"==typeof self&&self&&self.Object===Object&&self,a=(r.a||o||Function(\"return this\")()).Symbol,i=Object.prototype,s=i.hasOwnProperty,u=i.toString,c=a?a.toStringTag:void 0;var l=function(e){var t=s.call(e,c),n=e[c];try{e[c]=void 0;var r=!0}catch(e){}var o=u.call(e);return r&&(t?e[c]=n:delete e[c]),o},p=Object.prototype.toString;var f=function(e){return p.call(e)},h=a?a.toStringTag:void 0;var d=function(e){return null==e?void 0===e?\"[object Undefined]\":\"[object Null]\":h&&h in Object(e)?l(e):f(e)};var m=function(e,t){return function(n){return e(t(n))}}(Object.getPrototypeOf,Object);var v=function(e){return null!=e&&\"object\"==typeof e},g=Function.prototype,y=Object.prototype,b=g.toString,_=y.hasOwnProperty,w=b.call(Object);var x=function(e){if(!v(e)||\"[object Object]\"!=d(e))return!1;var t=m(e);if(null===t)return!0;var n=_.call(t,\"constructor\")&&t.constructor;return\"function\"==typeof n&&n instanceof n&&b.call(n)==w},E=n(345),S=\"@@redux/INIT\";function C(e,t,n){var r;if(\"function\"==typeof t&&void 0===n&&(n=t,t=void 0),void 0!==n){if(\"function\"!=typeof n)throw new Error(\"Expected the enhancer to be a function.\");return n(C)(e,t)}if(\"function\"!=typeof e)throw new Error(\"Expected the reducer to be a function.\");var o=e,a=t,i=[],s=i,u=!1;function c(){s===i&&(s=i.slice())}function l(){return a}function p(e){if(\"function\"!=typeof e)throw new Error(\"Expected listener to be a function.\");var t=!0;return c(),s.push(e),function(){if(t){t=!1,c();var n=s.indexOf(e);s.splice(n,1)}}}function f(e){if(!x(e))throw new Error(\"Actions must be plain objects. Use custom middleware for async actions.\");if(void 0===e.type)throw new Error('Actions may not have an undefined \"type\" property. Have you misspelled a constant?');if(u)throw new Error(\"Reducers may not dispatch actions.\");try{u=!0,a=o(a,e)}finally{u=!1}for(var t=i=s,n=0;n<t.length;n++){(0,t[n])()}return e}return f({type:S}),(r={dispatch:f,subscribe:p,getState:l,replaceReducer:function(e){if(\"function\"!=typeof e)throw new Error(\"Expected the nextReducer to be a function.\");o=e,f({type:S})}})[E.a]=function(){var e,t=p;return(e={subscribe:function(e){if(\"object\"!=typeof e)throw new TypeError(\"Expected the observer to be an object.\");function n(){e.next&&e.next(l())}return n(),{unsubscribe:t(n)}}})[E.a]=function(){return this},e},r}function A(e,t){var n=t&&t.type;return\"Given action \"+(n&&'\"'+n.toString()+'\"'||\"an action\")+', reducer \"'+e+'\" returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.'}function k(e){for(var t=Object.keys(e),n={},r=0;r<t.length;r++){var o=t[r];0,\"function\"==typeof e[o]&&(n[o]=e[o])}var a=Object.keys(n);var i=void 0;try{!function(e){Object.keys(e).forEach((function(t){var n=e[t];if(void 0===n(void 0,{type:S}))throw new Error('Reducer \"'+t+\"\\\" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.\");if(void 0===n(void 0,{type:\"@@redux/PROBE_UNKNOWN_ACTION_\"+Math.random().toString(36).substring(7).split(\"\").join(\".\")}))throw new Error('Reducer \"'+t+\"\\\" returned undefined when probed with a random type. Don't try to handle \"+S+' or other actions in \"redux/*\" namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.')}))}(n)}catch(e){i=e}return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];if(i)throw i;for(var r=!1,o={},s=0;s<a.length;s++){var u=a[s],c=n[u],l=e[u],p=c(l,t);if(void 0===p){var f=A(u,t);throw new Error(f)}o[u]=p,r=r||p!==l}return r?o:e}}function O(e,t){return function(){return t(e.apply(void 0,arguments))}}function j(e,t){if(\"function\"==typeof e)return O(e,t);if(\"object\"!=typeof e||null===e)throw new Error(\"bindActionCreators expected an object or a function, instead received \"+(null===e?\"null\":typeof e)+'. Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?');for(var n=Object.keys(e),r={},o=0;o<n.length;o++){var a=n[o],i=e[a];\"function\"==typeof i&&(r[a]=O(i,t))}return r}function T(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return 0===t.length?function(e){return e}:1===t.length?t[0]:t.reduce((function(e,t){return function(){return e(t.apply(void 0,arguments))}}))}var I=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};function P(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){return function(n,r,o){var a,i=e(n,r,o),s=i.dispatch,u={getState:i.getState,dispatch:function(e){return s(e)}};return a=t.map((function(e){return e(u)})),s=T.apply(void 0,a)(i.dispatch),I({},i,{dispatch:s})}}}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r=n(151);e.exports=Array.isArray||function(e){return\"Array\"==r(e)}},function(e,t,n){\"use strict\";var r=n(178),o=n(68),a=n(105);e.exports=function(e,t,n){var i=r(t);i in e?o.f(e,i,a(0,n)):e[i]=n}},function(e,t,n){var r=n(37),o=n(41),a=n(129),i=o(\"species\");e.exports=function(e){return a>=51||!r((function(){var t=[];return(t.constructor={})[i]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},function(e,t,n){var r=n(365),o=n(233);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t){e.exports={}},function(e,t,n){\"use strict\";var r=n(66),o=n(239),a=n(131),i=n(78),s=n(238),u=\"Array Iterator\",c=i.set,l=i.getterFor(u);e.exports=s(Array,\"Array\",(function(e,t){c(this,{type:u,target:r(e),index:0,kind:t})}),(function(){var e=l(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):\"keys\"==n?{value:r,done:!1}:\"values\"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),\"values\"),a.Arguments=a.Array,o(\"keys\"),o(\"values\"),o(\"entries\")},function(e,t,n){\"use strict\";e.exports=function(e){for(var t=arguments.length-1,n=\"Minified React error #\"+e+\"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=\"+e,r=0;r<t;r++)n+=\"&args[]=\"+encodeURIComponent(arguments[r+1]);n+=\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\";var o=new Error(n);throw o.name=\"Invariant Violation\",o.framesToPop=1,o}},function(e,t,n){var r=n(99),o=n(131),a=n(41)(\"iterator\");e.exports=function(e){if(null!=e)return e[a]||e[\"@@iterator\"]||o[r(e)]}},function(e,t){var n=Object.prototype;e.exports=function(e){var t=e&&e.constructor;return e===(\"function\"==typeof t&&t.prototype||n)}},function(e,t,n){var r=n(745),o=n(245),a=n(746),i=n(747),s=n(748),u=n(112),c=n(412),l=\"[object Map]\",p=\"[object Promise]\",f=\"[object Set]\",h=\"[object WeakMap]\",d=\"[object DataView]\",m=c(r),v=c(o),g=c(a),y=c(i),b=c(s),_=u;(r&&_(new r(new ArrayBuffer(1)))!=d||o&&_(new o)!=l||a&&_(a.resolve())!=p||i&&_(new i)!=f||s&&_(new s)!=h)&&(_=function(e){var t=u(e),n=\"[object Object]\"==t?e.constructor:void 0,r=n?c(n):\"\";if(r)switch(r){case m:return d;case v:return l;case g:return p;case y:return f;case b:return h}return t}),e.exports=_},function(e,t,n){(function(e){function n(e){return Object.prototype.toString.call(e)}t.isArray=function(e){return Array.isArray?Array.isArray(e):\"[object Array]\"===n(e)},t.isBoolean=function(e){return\"boolean\"==typeof e},t.isNull=function(e){return null===e},t.isNullOrUndefined=function(e){return null==e},t.isNumber=function(e){return\"number\"==typeof e},t.isString=function(e){return\"string\"==typeof e},t.isSymbol=function(e){return\"symbol\"==typeof e},t.isUndefined=function(e){return void 0===e},t.isRegExp=function(e){return\"[object RegExp]\"===n(e)},t.isObject=function(e){return\"object\"==typeof e&&null!==e},t.isDate=function(e){return\"[object Date]\"===n(e)},t.isError=function(e){return\"[object Error]\"===n(e)||e instanceof Error},t.isFunction=function(e){return\"function\"==typeof e},t.isPrimitive=function(e){return null===e||\"boolean\"==typeof e||\"number\"==typeof e||\"string\"==typeof e||\"symbol\"==typeof e||void 0===e},t.isBuffer=e.isBuffer}).call(this,n(73).Buffer)},function(e,t,n){var r=n(110);e.exports=function(e,t,n){for(var o in t)n&&n.unsafe&&e[o]?e[o]=t[o]:r(e,o,t[o],n);return e}},function(e,t,n){\"use strict\";var r=n(77),o=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError(\"Bad Promise constructor\");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new o(e)}},function(e,t,n){\"use strict\";var r=n(166),o=n(262),a=n(468),i=n(469),s=(n(33),r.getListener);function u(e,t,n){var r=function(e,t,n){var r=t.dispatchConfig.phasedRegistrationNames[n];return s(e,r)}(e,n,t);r&&(n._dispatchListeners=a(n._dispatchListeners,r),n._dispatchInstances=a(n._dispatchInstances,e))}function c(e){e&&e.dispatchConfig.phasedRegistrationNames&&o.traverseTwoPhase(e._targetInst,u,e)}function l(e){if(e&&e.dispatchConfig.phasedRegistrationNames){var t=e._targetInst,n=t?o.getParentInstance(t):null;o.traverseTwoPhase(n,u,e)}}function p(e,t,n){if(n&&n.dispatchConfig.registrationName){var r=n.dispatchConfig.registrationName,o=s(e,r);o&&(n._dispatchListeners=a(n._dispatchListeners,o),n._dispatchInstances=a(n._dispatchInstances,e))}}function f(e){e&&e.dispatchConfig.registrationName&&p(e._targetInst,0,e)}var h={accumulateTwoPhaseDispatches:function(e){i(e,c)},accumulateTwoPhaseDispatchesSkipTarget:function(e){i(e,l)},accumulateDirectDispatches:function(e){i(e,f)},accumulateEnterLeaveDispatches:function(e,t,n,r){o.traverseEnterLeave(n,r,p,e,t)}};e.exports=h},function(e,t,n){\"use strict\";var r=n(30),o=n(261),a=n(262),i=n(263),s=n(468),u=n(469),c=(n(25),{}),l=null,p=function(e,t){e&&(a.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))},f=function(e){return p(e,!0)},h=function(e){return p(e,!1)},d=function(e){return\".\"+e._rootNodeID};var m={injection:{injectEventPluginOrder:o.injectEventPluginOrder,injectEventPluginsByName:o.injectEventPluginsByName},putListener:function(e,t,n){\"function\"!=typeof n&&r(\"94\",t,typeof n);var a=d(e);(c[t]||(c[t]={}))[a]=n;var i=o.registrationNameModules[t];i&&i.didPutListener&&i.didPutListener(e,t,n)},getListener:function(e,t){var n=c[t];if(function(e,t,n){switch(e){case\"onClick\":case\"onClickCapture\":case\"onDoubleClick\":case\"onDoubleClickCapture\":case\"onMouseDown\":case\"onMouseDownCapture\":case\"onMouseMove\":case\"onMouseMoveCapture\":case\"onMouseUp\":case\"onMouseUpCapture\":return!(!n.disabled||(r=t,\"button\"!==r&&\"input\"!==r&&\"select\"!==r&&\"textarea\"!==r));default:return!1}var r}(t,e._currentElement.type,e._currentElement.props))return null;var r=d(e);return n&&n[r]},deleteListener:function(e,t){var n=o.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t);var r=c[t];r&&delete r[d(e)]},deleteAllListeners:function(e){var t=d(e);for(var n in c)if(c.hasOwnProperty(n)&&c[n][t]){var r=o.registrationNameModules[n];r&&r.willDeleteListener&&r.willDeleteListener(e,n),delete c[n][t]}},extractEvents:function(e,t,n,r){for(var a,i=o.plugins,u=0;u<i.length;u++){var c=i[u];if(c){var l=c.extractEvents(e,t,n,r);l&&(a=s(a,l))}}return a},enqueueEvents:function(e){e&&(l=s(l,e))},processEventQueue:function(e){var t=l;l=null,u(t,e?f:h),l&&r(\"95\"),i.rethrowCaughtError()},__purge:function(){c={}},__getListenerBank:function(){return c}};e.exports=m},function(e,t,n){\"use strict\";var r=n(91),o=n(264),a={view:function(e){if(e.view)return e.view;var t=o(e);if(t.window===t)return t;var n=t.ownerDocument;return n?n.defaultView||n.parentWindow:window},detail:function(e){return e.detail||0}};function i(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(i,a),e.exports=i},function(e,t,n){\"use strict\";var r={remove:function(e){e._reactInternalInstance=void 0},get:function(e){return e._reactInternalInstance},has:function(e){return void 0!==e._reactInternalInstance},set:function(e,t){e._reactInternalInstance=t}};e.exports=r},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"requestSnippetGenerator_curl_powershell\",(function(){return N})),n.d(t,\"requestSnippetGenerator_curl_bash\",(function(){return M})),n.d(t,\"requestSnippetGenerator_curl_cmd\",(function(){return R}));var r=n(14),o=n.n(r),a=n(13),i=n.n(a),s=n(49),u=n.n(s),c=n(17),l=n.n(c),p=n(101),f=n.n(p),h=n(2),d=n.n(h),m=n(32),v=n.n(m),g=n(4),y=n.n(g),b=n(521),_=n.n(b),w=n(82),x=n.n(w),E=n(31),S=n.n(E),C=n(26),A=n(1),k=function(e){var t,n=\"_**[]\";return l()(e).call(e,n)<0?e:f()(t=e.split(n)[0]).call(t)},O=function(e){return\"-d \"===e||/^[_\\/-]/g.test(e)?e:\"'\"+e.replace(/'/g,\"'\\\\''\")+\"'\"},j=function(e){return\"-d \"===(e=e.replace(/\\^/g,\"^^\").replace(/\\\\\"/g,'\\\\\\\\\"').replace(/\"/g,'\"\"').replace(/\\n/g,\"^\\n\"))?e.replace(/-d /g,\"-d ^\\n\"):/^[_\\/-]/g.test(e)?e:'\"'+e+'\"'},T=function(e){return\"-d \"===e?e:/\\n/.test(e)?'@\"\\n'+e.replace(/\"/g,'\\\\\"').replace(/`/g,\"``\").replace(/\\$/,\"`$\")+'\\n\"@':/^[_\\/-]/g.test(e)?e:\"'\"+e.replace(/\"/g,'\"\"').replace(/'/g,\"''\")+\"'\"};function I(e){var t,n=[],r=u()(e.get(\"body\").entrySeq());try{for(r.s();!(t=r.n()).done;){var o,a,s,c=i()(t.value,2),l=c[0],p=c[1],f=k(l);if(p instanceof C.a.File)n.push(d()(o=d()(a='  \"'.concat(f,'\": {\\n    \"name\": \"')).call(a,p.name,'\"')).call(o,p.type?',\\n    \"type\": \"'.concat(p.type,'\"'):\"\",\"\\n  }\"));else n.push(d()(s='  \"'.concat(f,'\": ')).call(s,v()(p,null,2).replace(/(\\r\\n|\\r|\\n)/g,\"\\n  \")))}}catch(e){r.e(e)}finally{r.f()}return\"{\\n\".concat(n.join(\",\\n\"),\"\\n}\")}var P=function(e,t,n){var r,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",s=!1,c=\"\",l=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return c+=\" \"+y()(n).call(n,t).join(\" \")},p=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return c+=y()(n).call(n,t).join(\" \")},f=function(){return c+=\" \".concat(n)},h=function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;return c+=_()(e=\"  \").call(e,t)},m=e.get(\"headers\");if(c+=\"curl\"+a,e.has(\"curlOptions\")&&l.apply(void 0,o()(e.get(\"curlOptions\"))),l(\"-X\",e.get(\"method\")),f(),h(),p(\"\".concat(e.get(\"url\"))),m&&m.size){var g,b,w=u()(x()(g=e.get(\"headers\")).call(g));try{for(w.s();!(b=w.n()).done;){var E,O=b.value;f(),h();var j=i()(O,2),T=j[0],P=j[1];p(\"-H\",d()(E=\"\".concat(T,\": \")).call(E,P)),s=s||/^content-type$/i.test(T)&&/^multipart\\/form-data$/i.test(P)}}catch(e){w.e(e)}finally{w.f()}}if(e.get(\"body\"))if(s&&S()(r=[\"POST\",\"PUT\",\"PATCH\"]).call(r,e.get(\"method\"))){var N,M=u()(e.get(\"body\").entrySeq());try{for(M.s();!(N=M.n()).done;){var R,D,L,B=i()(N.value,2),F=B[0],U=B[1],q=k(F);if(f(),h(),p(\"-F\"),U instanceof C.a.File)l(d()(R=d()(D=\"\".concat(q,\"=@\")).call(D,U.name)).call(R,U.type?\";type=\".concat(U.type):\"\"));else l(d()(L=\"\".concat(q,\"=\")).call(L,U))}}catch(e){M.e(e)}finally{M.f()}}else{f(),h(),p(\"-d \");var z=e.get(\"body\");A.Map.isMap(z)?p(I(e)):(\"string\"!=typeof z&&(z=v()(z)),p(z))}else e.get(\"body\")||\"POST\"!==e.get(\"method\")||(f(),h(),p(\"-d ''\"));return c},N=function(e){return P(e,T,\"`\\n\",\".exe\")},M=function(e){return P(e,O,\"\\\\\\n\")},R=function(e){return P(e,j,\"^\\n\")}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"parseYamlConfig\",(function(){return o}));var r=n(74),o=function(e,t){try{return r.a.load(e)}catch(e){return t&&t.errActions.newThrownErr(new Error(e)),{}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"getDefaultRequestBodyValue\",(function(){return _}));var r=n(13),o=n.n(r),a=n(4),i=n.n(a),s=n(17),u=n.n(s),c=n(31),l=n.n(c),p=n(2),f=n.n(p),h=n(22),d=n.n(h),m=n(0),v=n.n(m),g=(n(11),n(27),n(1)),y=n(5),b=n(102),_=function(e,t,n){var r=e.getIn([\"content\",t]),o=r.get(\"schema\").toJS(),a=void 0!==r.get(\"examples\"),i=r.get(\"example\"),s=a?r.getIn([\"examples\",n,\"value\"]):i,u=Object(y.o)(o,t,{includeWriteOnly:!0},s);return Object(y.I)(u)};t.default=function(e){var t=e.userHasEditedBody,n=e.requestBody,r=e.requestBodyValue,a=e.requestBodyInclusionSetting,s=e.requestBodyErrors,c=e.getComponent,p=e.getConfigs,h=e.specSelectors,m=e.fn,w=e.contentType,x=e.isExecute,E=e.specPath,S=e.onChange,C=e.onChangeIncludeEmpty,A=e.activeExamplesKey,k=e.updateActiveExamplesKey,O=e.setRetainRequestBodyValueFlag,j=function(e){var t={key:e,shouldDispatchInit:!1,defaultValue:!0};return\"no value\"===a.get(e,\"no value\")&&(t.shouldDispatchInit=!0),t},T=c(\"Markdown\",!0),I=c(\"modelExample\"),P=c(\"RequestBodyEditor\"),N=c(\"highlightCode\"),M=c(\"ExamplesSelectValueRetainer\"),R=c(\"Example\"),D=c(\"ParameterIncludeEmpty\"),L=p().showCommonExtensions,B=n&&n.get(\"description\")||null,F=n&&n.get(\"content\")||new g.OrderedMap;w=w||F.keySeq().first()||\"\";var U=F.get(w,Object(g.OrderedMap)()),q=U.get(\"schema\",Object(g.OrderedMap)()),z=U.get(\"examples\",null),V=null==z?void 0:i()(z).call(z,(function(e,t){var r,o=null===(r=e)||void 0===r?void 0:r.get(\"value\",null);return o&&(e=e.set(\"value\",_(n,w,t),o)),e}));if(s=g.List.isList(s)?s:Object(g.List)(),!U.size)return null;var W=\"object\"===U.getIn([\"schema\",\"type\"]),H=\"binary\"===U.getIn([\"schema\",\"format\"]),$=\"base64\"===U.getIn([\"schema\",\"format\"]);if(\"application/octet-stream\"===w||0===u()(w).call(w,\"image/\")||0===u()(w).call(w,\"audio/\")||0===u()(w).call(w,\"video/\")||H||$){var J=c(\"Input\");return x?v.a.createElement(J,{type:\"file\",onChange:function(e){S(e.target.files[0])}}):v.a.createElement(\"i\",null,\"Example values are not available for \",v.a.createElement(\"code\",null,w),\" media types.\")}if(W&&(\"application/x-www-form-urlencoded\"===w||0===u()(w).call(w,\"multipart/\"))&&q.get(\"properties\",Object(g.OrderedMap)()).size>0){var K,Y=c(\"JsonSchemaForm\"),G=c(\"ParameterExt\"),Z=q.get(\"properties\",Object(g.OrderedMap)());return r=g.Map.isMap(r)?r:Object(g.OrderedMap)(),v.a.createElement(\"div\",{className:\"table-container\"},B&&v.a.createElement(T,{source:B}),v.a.createElement(\"table\",null,v.a.createElement(\"tbody\",null,g.Map.isMap(Z)&&i()(K=Z.entrySeq()).call(K,(function(e){var t,n,u=o()(e,2),p=u[0],h=u[1];if(!h.get(\"readOnly\")){var b=L?Object(y.l)(h):null,_=l()(t=q.get(\"required\",Object(g.List)())).call(t,p),w=h.get(\"type\"),E=h.get(\"format\"),A=h.get(\"description\"),k=r.getIn([p,\"value\"]),O=r.getIn([p,\"errors\"])||s,I=a.get(p)||!1,P=h.has(\"default\")||h.has(\"example\")||h.hasIn([\"items\",\"example\"])||h.hasIn([\"items\",\"default\"]),N=h.has(\"enum\")&&(1===h.get(\"enum\").size||_),M=P||N,R=\"\";\"array\"!==w||M||(R=[]),(\"object\"===w||M)&&(R=Object(y.o)(h,!1,{includeWriteOnly:!0})),\"string\"!=typeof R&&\"object\"===w&&(R=Object(y.I)(R)),\"string\"==typeof R&&\"array\"===w&&(R=JSON.parse(R));var B=\"string\"===w&&(\"binary\"===E||\"base64\"===E);return v.a.createElement(\"tr\",{key:p,className:\"parameters\",\"data-property-name\":p},v.a.createElement(\"td\",{className:\"parameters-col_name\"},v.a.createElement(\"div\",{className:_?\"parameter__name required\":\"parameter__name\"},p,_?v.a.createElement(\"span\",null,\" *\"):null),v.a.createElement(\"div\",{className:\"parameter__type\"},w,E&&v.a.createElement(\"span\",{className:\"prop-format\"},\"($\",E,\")\"),L&&b.size?i()(n=b.entrySeq()).call(n,(function(e){var t,n=o()(e,2),r=n[0],a=n[1];return v.a.createElement(G,{key:f()(t=\"\".concat(r,\"-\")).call(t,a),xKey:r,xVal:a})})):null),v.a.createElement(\"div\",{className:\"parameter__deprecated\"},h.get(\"deprecated\")?\"deprecated\":null)),v.a.createElement(\"td\",{className:\"parameters-col_description\"},v.a.createElement(T,{source:A}),x?v.a.createElement(\"div\",null,v.a.createElement(Y,{fn:m,dispatchInitialValue:!B,schema:h,description:p,getComponent:c,value:void 0===k?R:k,required:_,errors:O,onChange:function(e){S(e,[p])}}),_?null:v.a.createElement(D,{onChange:function(e){return C(p,e)},isIncluded:I,isIncludedOptions:j(p),isDisabled:d()(k)?0!==k.length:!Object(y.q)(k)})):null))}})))))}var X=_(n,w,A),Q=null;return Object(b.a)(X)&&(Q=\"json\"),v.a.createElement(\"div\",null,B&&v.a.createElement(T,{source:B}),V?v.a.createElement(M,{userHasEditedBody:t,examples:V,currentKey:A,currentUserInputValue:r,onSelect:function(e){k(e)},updateValue:S,defaultToFirstExample:!0,getComponent:c,setRetainRequestBodyValueFlag:O}):null,x?v.a.createElement(\"div\",null,v.a.createElement(P,{value:r,errors:s,defaultValue:X,onChange:S,getComponent:c})):v.a.createElement(I,{getComponent:c,getConfigs:p,specSelectors:h,expandDepth:1,isExecute:x,schema:U.get(\"schema\"),specPath:E.push(\"content\",w),example:v.a.createElement(N,{className:\"body-param__example\",getConfigs:p,language:Q,value:Object(y.I)(r)||X}),includeWriteOnly:!0}),V?v.a.createElement(R,{example:V.get(A),getComponent:c,getConfigs:p}):null)}},function(e,t,n){e.exports=n(675)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"makeMappedContainer\",(function(){return O})),n.d(t,\"render\",(function(){return j})),n.d(t,\"getComponent\",(function(){return P}));var r=n(18),o=n.n(r),a=n(28),i=n.n(a),s=n(6),u=n.n(s),c=n(7),l=n.n(c),p=n(8),f=n.n(p),h=n(9),d=n.n(h),m=n(20),v=n.n(m),g=n(15),y=n.n(g),b=n(0),_=n.n(b),w=n(519),x=n.n(w),E=n(351),S=n(520),C=n.n(S),A=function(e,t,n){var r=function(e,t){return function(n){f()(o,n);var r=d()(o);function o(){return u()(this,o),r.apply(this,arguments)}return l()(o,[{key:\"render\",value:function(){return _.a.createElement(t,i()({},e(),this.props,this.context))}}]),o}(b.Component)}(e,t),o=Object(E.connect)((function(n,r){var o=v()({},r,e());return(t.prototype.mapStateToProps||function(e){return{state:e}})(n,o)}))(r);return n?function(e,t){return function(n){f()(o,n);var r=d()(o);function o(){return u()(this,o),r.apply(this,arguments)}return l()(o,[{key:\"render\",value:function(){return _.a.createElement(E.Provider,{store:e},_.a.createElement(t,i()({},this.props,this.context)))}}]),o}(b.Component)}(n,o):o},k=function(e,t,n,r){for(var o in t){var a=t[o];\"function\"==typeof a&&a(n[o],r[o],e())}},O=function(e,t,n,r,o,a){return function(t){f()(i,t);var r=d()(i);function i(t,n){var o;return u()(this,i),o=r.call(this,t,n),k(e,a,t,{}),o}return l()(i,[{key:\"componentWillReceiveProps\",value:function(t){k(e,a,t,this.props)}},{key:\"render\",value:function(){var e=C()(this.props,a?y()(a):[]),t=n(o,\"root\");return _.a.createElement(t,e)}}]),i}(b.Component)},j=function(e,t,n,r,o){var a=n(e,t,r,\"App\",\"root\");x.a.render(_.a.createElement(a,null),o)},T=function(e){var t=e.name;return _.a.createElement(\"div\",{className:\"fallback\"},\"😱 \",_.a.createElement(\"i\",null,\"Could not render \",\"t\"===t?\"this component\":t,\", see the console.\"))},I=function(e){var t=function(e){return!(e.prototype&&e.prototype.isReactComponent)}(e)?function(e){return function(t){f()(r,t);var n=d()(r);function r(){return u()(this,r),n.apply(this,arguments)}return l()(r,[{key:\"render\",value:function(){return e(this.props)}}]),r}(b.Component)}(e):e,n=t.prototype.render;return t.prototype.render=function(){try{for(var e=arguments.length,r=new Array(e),o=0;o<e;o++)r[o]=arguments[o];return n.apply(this,r)}catch(e){return console.error(e),_.a.createElement(T,{error:e,name:t.name})}},t},P=function(e,t,n,r,a){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};if(\"string\"!=typeof r)throw new TypeError(\"Need a string, to fetch a component. Was given a \"+o()(r));var s=n(r);return s?a?\"root\"===a?A(e,s,t()):A(e,I(s)):I(s):(i.failSilently||e().log.warn(\"Could not find component:\",r),null)}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"setHash\",(function(){return r}));var r=function(e){return e?history.pushState(null,null,\"#\".concat(e)):window.location.hash=\"\"}},function(e,t,n){e.exports=n(544)},function(e,t,n){\"use strict\";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,a=o&&!r.call({1:2},1);t.f=a?function(e){var t=o(this,e);return!!t&&t.enumerable}:r},function(e,t,n){var r=n(37),o=n(151),a=\"\".split;e.exports=r((function(){return!Object(\"z\").propertyIsEnumerable(0)}))?function(e){return\"String\"==o(e)?a.call(e,\"\"):Object(e)}:Object},function(e,t,n){var r=n(47);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&\"function\"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if(\"function\"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&\"function\"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError(\"Can't convert object to primitive value\")}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return\"Symbol(\"+String(void 0===e?\"\":e)+\")_\"+(++n+r).toString(36)}},function(e,t){},function(e,t,n){var r=n(227),o=n(179),a=r(\"keys\");e.exports=function(e){return a[e]||(a[e]=o(e))}},function(e,t,n){var r=n(55),o=n(60),a=n(181),i=n(373),s=a(\"IE_PROTO\"),u=Object.prototype;e.exports=i?Object.getPrototypeOf:function(e){return e=o(e),r(e,s)?e[s]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?u:null}},function(e,t,n){var r=n(52),o=n(575);e.exports=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,a){return r(n),o(a),t?e.call(n,a):n.__proto__=a,n}}():void 0)},function(e,t,n){var r=n(151),o=n(40);e.exports=\"process\"==r(o.process)},function(e,t,n){var r=n(638),o=n(393),a=n(391);e.exports=function(e,t){var n;if(e){if(\"string\"==typeof e)return a(e,t);var i=r(n=Object.prototype.toString.call(e)).call(n,8,-1);return\"Object\"===i&&e.constructor&&(i=e.constructor.name),\"Map\"===i||\"Set\"===i?o(e):\"Arguments\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(e,t):void 0}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(112),o=n(89);e.exports=function(e){return\"symbol\"==typeof e||o(e)&&\"[object Symbol]\"==r(e)}},function(e,t,n){var r=n(113)(Object,\"create\");e.exports=r},function(e,t,n){var r=n(712),o=n(713),a=n(714),i=n(715),s=n(716);function u(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}u.prototype.clear=r,u.prototype.delete=o,u.prototype.get=a,u.prototype.has=i,u.prototype.set=s,e.exports=u},function(e,t,n){var r=n(123);e.exports=function(e,t){for(var n=e.length;n--;)if(r(e[n][0],t))return n;return-1}},function(e,t,n){var r=n(718);e.exports=function(e,t){var n=e.__data__;return r(t)?n[\"string\"==typeof t?\"string\":\"hash\"]:n.map}},function(e,t,n){var r=n(723),o=n(750),a=n(254),i=n(50),s=n(755);e.exports=function(e){return\"function\"==typeof e?e:null==e?a:\"object\"==typeof e?i(e)?o(e[0],e[1]):r(e):s(e)}},function(e,t,n){var r=n(741),o=n(89),a=Object.prototype,i=a.hasOwnProperty,s=a.propertyIsEnumerable,u=r(function(){return arguments}())?r:function(e){return o(e)&&i.call(e,\"callee\")&&!s.call(e,\"callee\")};e.exports=u},function(e,t,n){(function(e){var r=n(71),o=n(742),a=t&&!t.nodeType&&t,i=a&&\"object\"==typeof e&&e&&!e.nodeType&&e,s=i&&i.exports===a?r.Buffer:void 0,u=(s?s.isBuffer:void 0)||o;e.exports=u}).call(this,n(194)(e))},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,\"loaded\",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,\"id\",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t){var n=/^(?:0|[1-9]\\d*)$/;e.exports=function(e,t){var r=typeof e;return!!(t=null==t?9007199254740991:t)&&(\"number\"==r||\"symbol\"!=r&&n.test(e))&&e>-1&&e%1==0&&e<t}},function(e,t,n){var r=n(135),o=n(136);e.exports=function(e,t){for(var n=0,a=(t=r(t,e)).length;null!=e&&n<a;)e=e[o(t[n++])];return n&&n==a?e:void 0}},function(e,t,n){\"use strict\";(function(t){!t.version||0===t.version.indexOf(\"v0.\")||0===t.version.indexOf(\"v1.\")&&0!==t.version.indexOf(\"v1.8.\")?e.exports={nextTick:function(e,n,r,o){if(\"function\"!=typeof e)throw new TypeError('\"callback\" argument must be a function');var a,i,s=arguments.length;switch(s){case 0:case 1:return t.nextTick(e);case 2:return t.nextTick((function(){e.call(null,n)}));case 3:return t.nextTick((function(){e.call(null,n,r)}));case 4:return t.nextTick((function(){e.call(null,n,r,o)}));default:for(a=new Array(s-1),i=0;i<a.length;)a[i++]=arguments[i];return t.nextTick((function(){e.apply(null,a)}))}}}:e.exports=t}).call(this,n(90))},function(e,t,n){\"use strict\";e.exports=n(786)(\"forEach\")},function(e,t,n){\"use strict\";e.exports=n(809)()?globalThis:n(810)},function(e,t){e.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},function(e,t,n){var r=n(463),o=n(123),a=Object.prototype.hasOwnProperty;e.exports=function(e,t,n){var i=e[t];a.call(e,t)&&o(i,n)&&(void 0!==n||t in e)||r(e,t,n)}},function(e,t,n){\"use strict\";var r=n(30),o=(n(25),{}),a={reinitializeTransaction:function(){this.transactionWrappers=this.getTransactionWrappers(),this.wrapperInitData?this.wrapperInitData.length=0:this.wrapperInitData=[],this._isInTransaction=!1},_isInTransaction:!1,getTransactionWrappers:null,isInTransaction:function(){return!!this._isInTransaction},perform:function(e,t,n,o,a,i,s,u){var c,l;this.isInTransaction()&&r(\"27\");try{this._isInTransaction=!0,c=!0,this.initializeAll(0),l=e.call(t,n,o,a,i,s,u),c=!1}finally{try{if(c)try{this.closeAll(0)}catch(e){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return l},initializeAll:function(e){for(var t=this.transactionWrappers,n=e;n<t.length;n++){var r=t[n];try{this.wrapperInitData[n]=o,this.wrapperInitData[n]=r.initialize?r.initialize.call(this):null}finally{if(this.wrapperInitData[n]===o)try{this.initializeAll(n+1)}catch(e){}}}},closeAll:function(e){this.isInTransaction()||r(\"28\");for(var t=this.transactionWrappers,n=e;n<t.length;n++){var a,i=t[n],s=this.wrapperInitData[n];try{a=!0,s!==o&&i.close&&i.close.call(this,s),a=!1}finally{if(a)try{this.closeAll(n+1)}catch(e){}}}this.wrapperInitData.length=0}};e.exports=a},function(e,t,n){\"use strict\";var r=n(167),o=n(475),a={screenX:null,screenY:null,clientX:null,clientY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:n(266),button:function(e){var t=e.button;return\"which\"in e?t:2===t?2:4===t?1:0},buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)},pageX:function(e){return\"pageX\"in e?e.pageX:e.clientX+o.currentScrollLeft},pageY:function(e){return\"pageY\"in e?e.pageY:e.clientY+o.currentScrollTop}};function i(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(i,a),e.exports=i},function(e,t,n){\"use strict\";var r,o=n(56),a=n(268),i=/^[ \\r\\n\\t\\f]/,s=/<(!--|link|noscript|meta|script|style)[ \\r\\n\\t\\f\\/>]/,u=n(269)((function(e,t){if(e.namespaceURI!==a.svg||\"innerHTML\"in e)e.innerHTML=t;else{(r=r||document.createElement(\"div\")).innerHTML=\"<svg>\"+t+\"</svg>\";for(var n=r.firstChild;n.firstChild;)e.appendChild(n.firstChild)}}));if(o.canUseDOM){var c=document.createElement(\"div\");c.innerHTML=\" \",\"\"===c.innerHTML&&(u=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),i.test(t)||\"<\"===t[0]&&s.test(t)){e.innerHTML=String.fromCharCode(65279)+t;var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t}),c=null}e.exports=u},function(e,t,n){\"use strict\";var r=/[\"'&<>]/;e.exports=function(e){return\"boolean\"==typeof e||\"number\"==typeof e?\"\"+e:function(e){var t,n=\"\"+e,o=r.exec(n);if(!o)return n;var a=\"\",i=0,s=0;for(i=o.index;i<n.length;i++){switch(n.charCodeAt(i)){case 34:t=\"&quot;\";break;case 38:t=\"&amp;\";break;case 39:t=\"&#x27;\";break;case 60:t=\"&lt;\";break;case 62:t=\"&gt;\";break;default:continue}s!==i&&(a+=n.substring(s,i)),s=i+1,a+=t}return s!==i?a+n.substring(s,i):a}(e)}},function(e,t,n){\"use strict\";var r,o=n(38),a=n(261),i=n(946),s=n(475),u=n(947),c=n(265),l={},p=!1,f=0,h={topAbort:\"abort\",topAnimationEnd:u(\"animationend\")||\"animationend\",topAnimationIteration:u(\"animationiteration\")||\"animationiteration\",topAnimationStart:u(\"animationstart\")||\"animationstart\",topBlur:\"blur\",topCanPlay:\"canplay\",topCanPlayThrough:\"canplaythrough\",topChange:\"change\",topClick:\"click\",topCompositionEnd:\"compositionend\",topCompositionStart:\"compositionstart\",topCompositionUpdate:\"compositionupdate\",topContextMenu:\"contextmenu\",topCopy:\"copy\",topCut:\"cut\",topDoubleClick:\"dblclick\",topDrag:\"drag\",topDragEnd:\"dragend\",topDragEnter:\"dragenter\",topDragExit:\"dragexit\",topDragLeave:\"dragleave\",topDragOver:\"dragover\",topDragStart:\"dragstart\",topDrop:\"drop\",topDurationChange:\"durationchange\",topEmptied:\"emptied\",topEncrypted:\"encrypted\",topEnded:\"ended\",topError:\"error\",topFocus:\"focus\",topInput:\"input\",topKeyDown:\"keydown\",topKeyPress:\"keypress\",topKeyUp:\"keyup\",topLoadedData:\"loadeddata\",topLoadedMetadata:\"loadedmetadata\",topLoadStart:\"loadstart\",topMouseDown:\"mousedown\",topMouseMove:\"mousemove\",topMouseOut:\"mouseout\",topMouseOver:\"mouseover\",topMouseUp:\"mouseup\",topPaste:\"paste\",topPause:\"pause\",topPlay:\"play\",topPlaying:\"playing\",topProgress:\"progress\",topRateChange:\"ratechange\",topScroll:\"scroll\",topSeeked:\"seeked\",topSeeking:\"seeking\",topSelectionChange:\"selectionchange\",topStalled:\"stalled\",topSuspend:\"suspend\",topTextInput:\"textInput\",topTimeUpdate:\"timeupdate\",topTouchCancel:\"touchcancel\",topTouchEnd:\"touchend\",topTouchMove:\"touchmove\",topTouchStart:\"touchstart\",topTransitionEnd:u(\"transitionend\")||\"transitionend\",topVolumeChange:\"volumechange\",topWaiting:\"waiting\",topWheel:\"wheel\"},d=\"_reactListenersID\"+String(Math.random()).slice(2);var m=o({},i,{ReactEventListener:null,injection:{injectReactEventListener:function(e){e.setHandleTopLevel(m.handleTopLevel),m.ReactEventListener=e}},setEnabled:function(e){m.ReactEventListener&&m.ReactEventListener.setEnabled(e)},isEnabled:function(){return!(!m.ReactEventListener||!m.ReactEventListener.isEnabled())},listenTo:function(e,t){for(var n=t,r=function(e){return Object.prototype.hasOwnProperty.call(e,d)||(e[d]=f++,l[e[d]]={}),l[e[d]]}(n),o=a.registrationNameDependencies[e],i=0;i<o.length;i++){var s=o[i];r.hasOwnProperty(s)&&r[s]||(\"topWheel\"===s?c(\"wheel\")?m.ReactEventListener.trapBubbledEvent(\"topWheel\",\"wheel\",n):c(\"mousewheel\")?m.ReactEventListener.trapBubbledEvent(\"topWheel\",\"mousewheel\",n):m.ReactEventListener.trapBubbledEvent(\"topWheel\",\"DOMMouseScroll\",n):\"topScroll\"===s?c(\"scroll\",!0)?m.ReactEventListener.trapCapturedEvent(\"topScroll\",\"scroll\",n):m.ReactEventListener.trapBubbledEvent(\"topScroll\",\"scroll\",m.ReactEventListener.WINDOW_HANDLE):\"topFocus\"===s||\"topBlur\"===s?(c(\"focus\",!0)?(m.ReactEventListener.trapCapturedEvent(\"topFocus\",\"focus\",n),m.ReactEventListener.trapCapturedEvent(\"topBlur\",\"blur\",n)):c(\"focusin\")&&(m.ReactEventListener.trapBubbledEvent(\"topFocus\",\"focusin\",n),m.ReactEventListener.trapBubbledEvent(\"topBlur\",\"focusout\",n)),r.topBlur=!0,r.topFocus=!0):h.hasOwnProperty(s)&&m.ReactEventListener.trapBubbledEvent(s,h[s],n),r[s]=!0)}},trapBubbledEvent:function(e,t,n){return m.ReactEventListener.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return m.ReactEventListener.trapCapturedEvent(e,t,n)},supportsEventPageXY:function(){if(!document.createEvent)return!1;var e=document.createEvent(\"MouseEvent\");return null!=e&&\"pageX\"in e},ensureScrollValueMonitoring:function(){if(void 0===r&&(r=m.supportsEventPageXY()),!r&&!p){var e=s.refreshScrollValues;m.ReactEventListener.monitorScrollValue(e),p=!0}}});e.exports=m},function(e,t,n){var r=n(156),o=n(47),a=n(55),i=n(68).f,s=n(179),u=n(1073),c=s(\"meta\"),l=0,p=Object.isExtensible||function(){return!0},f=function(e){i(e,c,{value:{objectID:\"O\"+ ++l,weakData:{}}})},h=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!o(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!a(e,c)){if(!p(e))return\"F\";if(!t)return\"E\";f(e)}return e[c].objectID},getWeakData:function(e,t){if(!a(e,c)){if(!p(e))return!0;if(!t)return!1;f(e)}return e[c].weakData},onFreeze:function(e){return u&&h.REQUIRED&&p(e)&&!a(e,c)&&f(e),e}};r[c]=!0},function(e,t,n){e.exports=n(649)},function(e,t,n){var r=n(722)(n(758));e.exports=r},function(e,t,n){e.exports=n(846)},function(e,t,n){e.exports=n(888)},function(e,t,n){var r=n(112),o=n(50),a=n(89);e.exports=function(e){return\"string\"==typeof e||!o(e)&&a(e)&&\"[object String]\"==r(e)}},function(e,t,n){e.exports=n(1049)},function(e,t,n){e.exports=n(1050)},function(e,t,n){var r=n(1064),o=n(497)((function(e,t){return null==e?{}:r(e,t)}));e.exports=o},function(e,t,n){var r=n(201),o=n(143),a=n(1081),i=n(115),s=n(160),u=n(114),c=Object.prototype.hasOwnProperty,l=a((function(e,t){if(s(t)||i(t))o(t,u(t),e);else for(var n in t)c.call(t,n)&&r(e,n,t[n])}));e.exports=l},function(e,t,n){(function(t){!function(){\"use strict\";e.exports=function(e){return(e instanceof t?e:t.from(e.toString(),\"binary\")).toString(\"base64\")}}()}).call(this,n(73).Buffer)},function(e,t,n){e.exports=n(1089)},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return k}));var r=n(18),o=n.n(r),a=n(6),i=n.n(a),s=n(7),u=n.n(s),c=n(10),l=n.n(c),p=n(8),f=n.n(p),h=n(9),d=n.n(h),m=n(3),v=n.n(m),g=n(15),y=n.n(g),b=n(2),_=n.n(b),w=n(0),x=n.n(w),E=n(94),S=n.n(E),C=(n(11),n(5)),A=n(26),k=function(e){f()(n,e);var t=d()(n);function n(e,r){var o;i()(this,n),o=t.call(this,e,r),v()(l()(o),\"getDefinitionUrl\",(function(){var e=o.props.specSelectors;return new S.a(e.url(),A.a.location).toString()}));var a=(0,e.getConfigs)().validatorUrl;return o.state={url:o.getDefinitionUrl(),validatorUrl:void 0===a?\"https://validator.swagger.io/validator\":a},o}return u()(n,[{key:\"componentWillReceiveProps\",value:function(e){var t=(0,e.getConfigs)().validatorUrl;this.setState({url:this.getDefinitionUrl(),validatorUrl:void 0===t?\"https://validator.swagger.io/validator\":t})}},{key:\"render\",value:function(){var e,t,n=(0,this.props.getConfigs)().spec,r=Object(C.F)(this.state.validatorUrl);return\"object\"===o()(n)&&y()(n).length?null:this.state.url&&Object(C.E)(this.state.validatorUrl)&&Object(C.E)(this.state.url)?x.a.createElement(\"span\",{className:\"float-right\"},x.a.createElement(\"a\",{target:\"_blank\",rel:\"noopener noreferrer\",href:_()(e=\"\".concat(r,\"/debug?url=\")).call(e,encodeURIComponent(this.state.url))},x.a.createElement(O,{src:_()(t=\"\".concat(r,\"?url=\")).call(t,encodeURIComponent(this.state.url)),alt:\"Online validator badge\"}))):null}}]),n}(x.a.Component),O=function(e){f()(n,e);var t=d()(n);function n(e){var r;return i()(this,n),(r=t.call(this,e)).state={loaded:!1,error:!1},r}return u()(n,[{key:\"componentDidMount\",value:function(){var e=this,t=new Image;t.onload=function(){e.setState({loaded:!0})},t.onerror=function(){e.setState({error:!0})},t.src=this.props.src}},{key:\"componentWillReceiveProps\",value:function(e){var t=this;if(e.src!==this.props.src){var n=new Image;n.onload=function(){t.setState({loaded:!0})},n.onerror=function(){t.setState({error:!0})},n.src=e.src}}},{key:\"render\",value:function(){return this.state.error?x.a.createElement(\"img\",{alt:\"Error\"}):this.state.loaded?x.a.createElement(\"img\",{src:this.props.src,alt:this.props.alt}):null}}]),n}(x.a.Component)},function(e,t,n){\"use strict\";var r;function o(e){return(r=r||document.createElement(\"textarea\")).innerHTML=\"&\"+e+\";\",r.value}n.d(t,\"a\",(function(){return ke}));var a=Object.prototype.hasOwnProperty;function i(e,t){return!!e&&a.call(e,t)}function s(e){var t=[].slice.call(arguments,1);return t.forEach((function(t){if(t){if(\"object\"!=typeof t)throw new TypeError(t+\"must be object\");Object.keys(t).forEach((function(n){e[n]=t[n]}))}})),e}var u=/\\\\([\\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;function c(e){return e.indexOf(\"\\\\\")<0?e:e.replace(u,\"$1\")}function l(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function p(e){if(e>65535){var t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}var f=/&([a-z#][a-z0-9]{1,31});/gi,h=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;function d(e,t){var n=0,r=o(t);return t!==r?r:35===t.charCodeAt(0)&&h.test(t)&&l(n=\"x\"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?p(n):e}function m(e){return e.indexOf(\"&\")<0?e:e.replace(f,d)}var v=/[&<>\"]/,g=/[&<>\"]/g,y={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\"};function b(e){return y[e]}function _(e){return v.test(e)?e.replace(g,b):e}var w={};function x(e,t){return++t>=e.length-2?t:\"paragraph_open\"===e[t].type&&e[t].tight&&\"inline\"===e[t+1].type&&0===e[t+1].content.length&&\"paragraph_close\"===e[t+2].type&&e[t+2].tight?x(e,t+2):t}w.blockquote_open=function(){return\"<blockquote>\\n\"},w.blockquote_close=function(e,t){return\"</blockquote>\"+E(e,t)},w.code=function(e,t){return e[t].block?\"<pre><code>\"+_(e[t].content)+\"</code></pre>\"+E(e,t):\"<code>\"+_(e[t].content)+\"</code>\"},w.fence=function(e,t,n,r,o){var a,s,u=e[t],l=\"\",p=n.langPrefix;if(u.params){if(s=(a=u.params.split(/\\s+/g)).join(\" \"),i(o.rules.fence_custom,a[0]))return o.rules.fence_custom[a[0]](e,t,n,r,o);l=' class=\"'+p+_(m(c(s)))+'\"'}return\"<pre><code\"+l+\">\"+(n.highlight&&n.highlight.apply(n.highlight,[u.content].concat(a))||_(u.content))+\"</code></pre>\"+E(e,t)},w.fence_custom={},w.heading_open=function(e,t){return\"<h\"+e[t].hLevel+\">\"},w.heading_close=function(e,t){return\"</h\"+e[t].hLevel+\">\\n\"},w.hr=function(e,t,n){return(n.xhtmlOut?\"<hr />\":\"<hr>\")+E(e,t)},w.bullet_list_open=function(){return\"<ul>\\n\"},w.bullet_list_close=function(e,t){return\"</ul>\"+E(e,t)},w.list_item_open=function(){return\"<li>\"},w.list_item_close=function(){return\"</li>\\n\"},w.ordered_list_open=function(e,t){var n=e[t];return\"<ol\"+(n.order>1?' start=\"'+n.order+'\"':\"\")+\">\\n\"},w.ordered_list_close=function(e,t){return\"</ol>\"+E(e,t)},w.paragraph_open=function(e,t){return e[t].tight?\"\":\"<p>\"},w.paragraph_close=function(e,t){var n=!(e[t].tight&&t&&\"inline\"===e[t-1].type&&!e[t-1].content);return(e[t].tight?\"\":\"</p>\")+(n?E(e,t):\"\")},w.link_open=function(e,t,n){var r=e[t].title?' title=\"'+_(m(e[t].title))+'\"':\"\",o=n.linkTarget?' target=\"'+n.linkTarget+'\"':\"\";return'<a href=\"'+_(e[t].href)+'\"'+r+o+\">\"},w.link_close=function(){return\"</a>\"},w.image=function(e,t,n){var r=' src=\"'+_(e[t].src)+'\"',o=e[t].title?' title=\"'+_(m(e[t].title))+'\"':\"\";return\"<img\"+r+(' alt=\"'+(e[t].alt?_(m(c(e[t].alt))):\"\")+'\"')+o+(n.xhtmlOut?\" /\":\"\")+\">\"},w.table_open=function(){return\"<table>\\n\"},w.table_close=function(){return\"</table>\\n\"},w.thead_open=function(){return\"<thead>\\n\"},w.thead_close=function(){return\"</thead>\\n\"},w.tbody_open=function(){return\"<tbody>\\n\"},w.tbody_close=function(){return\"</tbody>\\n\"},w.tr_open=function(){return\"<tr>\"},w.tr_close=function(){return\"</tr>\\n\"},w.th_open=function(e,t){var n=e[t];return\"<th\"+(n.align?' style=\"text-align:'+n.align+'\"':\"\")+\">\"},w.th_close=function(){return\"</th>\"},w.td_open=function(e,t){var n=e[t];return\"<td\"+(n.align?' style=\"text-align:'+n.align+'\"':\"\")+\">\"},w.td_close=function(){return\"</td>\"},w.strong_open=function(){return\"<strong>\"},w.strong_close=function(){return\"</strong>\"},w.em_open=function(){return\"<em>\"},w.em_close=function(){return\"</em>\"},w.del_open=function(){return\"<del>\"},w.del_close=function(){return\"</del>\"},w.ins_open=function(){return\"<ins>\"},w.ins_close=function(){return\"</ins>\"},w.mark_open=function(){return\"<mark>\"},w.mark_close=function(){return\"</mark>\"},w.sub=function(e,t){return\"<sub>\"+_(e[t].content)+\"</sub>\"},w.sup=function(e,t){return\"<sup>\"+_(e[t].content)+\"</sup>\"},w.hardbreak=function(e,t,n){return n.xhtmlOut?\"<br />\\n\":\"<br>\\n\"},w.softbreak=function(e,t,n){return n.breaks?n.xhtmlOut?\"<br />\\n\":\"<br>\\n\":\"\\n\"},w.text=function(e,t){return _(e[t].content)},w.htmlblock=function(e,t){return e[t].content},w.htmltag=function(e,t){return e[t].content},w.abbr_open=function(e,t){return'<abbr title=\"'+_(m(e[t].title))+'\">'},w.abbr_close=function(){return\"</abbr>\"},w.footnote_ref=function(e,t){var n=Number(e[t].id+1).toString(),r=\"fnref\"+n;return e[t].subId>0&&(r+=\":\"+e[t].subId),'<sup class=\"footnote-ref\"><a href=\"#fn'+n+'\" id=\"'+r+'\">['+n+\"]</a></sup>\"},w.footnote_block_open=function(e,t,n){return(n.xhtmlOut?'<hr class=\"footnotes-sep\" />\\n':'<hr class=\"footnotes-sep\">\\n')+'<section class=\"footnotes\">\\n<ol class=\"footnotes-list\">\\n'},w.footnote_block_close=function(){return\"</ol>\\n</section>\\n\"},w.footnote_open=function(e,t){return'<li id=\"fn'+Number(e[t].id+1).toString()+'\"  class=\"footnote-item\">'},w.footnote_close=function(){return\"</li>\\n\"},w.footnote_anchor=function(e,t){var n=\"fnref\"+Number(e[t].id+1).toString();return e[t].subId>0&&(n+=\":\"+e[t].subId),' <a href=\"#'+n+'\" class=\"footnote-backref\">↩</a>'},w.dl_open=function(){return\"<dl>\\n\"},w.dt_open=function(){return\"<dt>\"},w.dd_open=function(){return\"<dd>\"},w.dl_close=function(){return\"</dl>\\n\"},w.dt_close=function(){return\"</dt>\\n\"},w.dd_close=function(){return\"</dd>\\n\"};var E=w.getBreak=function(e,t){return(t=x(e,t))<e.length&&\"list_item_close\"===e[t].type?\"\":\"\\n\"};function S(){this.rules=s({},w),this.getBreak=w.getBreak}function C(){this.__rules__=[],this.__cache__=null}function A(e,t,n,r,o){this.src=e,this.env=r,this.options=n,this.parser=t,this.tokens=o,this.pos=0,this.posMax=this.src.length,this.level=0,this.pending=\"\",this.pendingLevel=0,this.cache=[],this.isInLabel=!1,this.linkLevel=0,this.linkContent=\"\",this.labelUnmatchedScopes=0}function k(e,t){var n,r,o,a=-1,i=e.posMax,s=e.pos,u=e.isInLabel;if(e.isInLabel)return-1;if(e.labelUnmatchedScopes)return e.labelUnmatchedScopes--,-1;for(e.pos=t+1,e.isInLabel=!0,n=1;e.pos<i;){if(91===(o=e.src.charCodeAt(e.pos)))n++;else if(93===o&&0===--n){r=!0;break}e.parser.skipToken(e)}return r?(a=e.pos,e.labelUnmatchedScopes=0):e.labelUnmatchedScopes=n-1,e.pos=s,e.isInLabel=u,a}function O(e,t,n,r){var o,a,i,s,u,c;if(42!==e.charCodeAt(0))return-1;if(91!==e.charCodeAt(1))return-1;if(-1===e.indexOf(\"]:\"))return-1;if((a=k(o=new A(e,t,n,r,[]),1))<0||58!==e.charCodeAt(a+1))return-1;for(s=o.posMax,i=a+2;i<s&&10!==o.src.charCodeAt(i);i++);return u=e.slice(2,a),0===(c=e.slice(a+2,i).trim()).length?-1:(r.abbreviations||(r.abbreviations={}),void 0===r.abbreviations[\":\"+u]&&(r.abbreviations[\":\"+u]=c),i)}function j(e){var t=m(e);try{t=decodeURI(t)}catch(e){}return encodeURI(t)}function T(e,t){var n,r,o,a=t,i=e.posMax;if(60===e.src.charCodeAt(t)){for(t++;t<i;){if(10===(n=e.src.charCodeAt(t)))return!1;if(62===n)return o=j(c(e.src.slice(a+1,t))),!!e.parser.validateLink(o)&&(e.pos=t+1,e.linkContent=o,!0);92===n&&t+1<i?t+=2:t++}return!1}for(r=0;t<i&&32!==(n=e.src.charCodeAt(t))&&!(n<32||127===n);)if(92===n&&t+1<i)t+=2;else{if(40===n&&++r>1)break;if(41===n&&--r<0)break;t++}return a!==t&&(o=c(e.src.slice(a,t)),!!e.parser.validateLink(o)&&(e.linkContent=o,e.pos=t,!0))}function I(e,t){var n,r=t,o=e.posMax,a=e.src.charCodeAt(t);if(34!==a&&39!==a&&40!==a)return!1;for(t++,40===a&&(a=41);t<o;){if((n=e.src.charCodeAt(t))===a)return e.pos=t+1,e.linkContent=c(e.src.slice(r+1,t)),!0;92===n&&t+1<o?t+=2:t++}return!1}function P(e){return e.trim().replace(/\\s+/g,\" \").toUpperCase()}function N(e,t,n,r){var o,a,i,s,u,c,l,p,f;if(91!==e.charCodeAt(0))return-1;if(-1===e.indexOf(\"]:\"))return-1;if((a=k(o=new A(e,t,n,r,[]),0))<0||58!==e.charCodeAt(a+1))return-1;for(s=o.posMax,i=a+2;i<s&&(32===(u=o.src.charCodeAt(i))||10===u);i++);if(!T(o,i))return-1;for(l=o.linkContent,c=i=o.pos,i+=1;i<s&&(32===(u=o.src.charCodeAt(i))||10===u);i++);for(i<s&&c!==i&&I(o,i)?(p=o.linkContent,i=o.pos):(p=\"\",i=c);i<s&&32===o.src.charCodeAt(i);)i++;return i<s&&10!==o.src.charCodeAt(i)?-1:(f=P(e.slice(1,a)),void 0===r.references[f]&&(r.references[f]={title:p,href:l}),i)}S.prototype.renderInline=function(e,t,n){for(var r=this.rules,o=e.length,a=0,i=\"\";o--;)i+=r[e[a].type](e,a++,t,n,this);return i},S.prototype.render=function(e,t,n){for(var r=this.rules,o=e.length,a=-1,i=\"\";++a<o;)\"inline\"===e[a].type?i+=this.renderInline(e[a].children,t,n):i+=r[e[a].type](e,a,t,n,this);return i},C.prototype.__find__=function(e){for(var t=this.__rules__.length,n=-1;t--;)if(this.__rules__[++n].name===e)return n;return-1},C.prototype.__compile__=function(){var e=this,t=[\"\"];e.__rules__.forEach((function(e){e.enabled&&e.alt.forEach((function(e){t.indexOf(e)<0&&t.push(e)}))})),e.__cache__={},t.forEach((function(t){e.__cache__[t]=[],e.__rules__.forEach((function(n){n.enabled&&(t&&n.alt.indexOf(t)<0||e.__cache__[t].push(n.fn))}))}))},C.prototype.at=function(e,t,n){var r=this.__find__(e),o=n||{};if(-1===r)throw new Error(\"Parser rule not found: \"+e);this.__rules__[r].fn=t,this.__rules__[r].alt=o.alt||[],this.__cache__=null},C.prototype.before=function(e,t,n,r){var o=this.__find__(e),a=r||{};if(-1===o)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o,0,{name:t,enabled:!0,fn:n,alt:a.alt||[]}),this.__cache__=null},C.prototype.after=function(e,t,n,r){var o=this.__find__(e),a=r||{};if(-1===o)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o+1,0,{name:t,enabled:!0,fn:n,alt:a.alt||[]}),this.__cache__=null},C.prototype.push=function(e,t,n){var r=n||{};this.__rules__.push({name:e,enabled:!0,fn:t,alt:r.alt||[]}),this.__cache__=null},C.prototype.enable=function(e,t){e=Array.isArray(e)?e:[e],t&&this.__rules__.forEach((function(e){e.enabled=!1})),e.forEach((function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!0}),this),this.__cache__=null},C.prototype.disable=function(e){(e=Array.isArray(e)?e:[e]).forEach((function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!1}),this),this.__cache__=null},C.prototype.getRules=function(e){return null===this.__cache__&&this.__compile__(),this.__cache__[e]||[]},A.prototype.pushPending=function(){this.tokens.push({type:\"text\",content:this.pending,level:this.pendingLevel}),this.pending=\"\"},A.prototype.push=function(e){this.pending&&this.pushPending(),this.tokens.push(e),this.pendingLevel=this.level},A.prototype.cacheSet=function(e,t){for(var n=this.cache.length;n<=e;n++)this.cache.push(0);this.cache[e]=t},A.prototype.cacheGet=function(e){return e<this.cache.length?this.cache[e]:0};var M=\" \\n()[]'\\\".,!?-\";function R(e){return e.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g,\"\\\\$1\")}var D=/\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/,L=/\\((c|tm|r|p)\\)/gi,B={c:\"©\",r:\"®\",p:\"§\",tm:\"™\"};var F=/['\"]/,U=/['\"]/g,q=/[-\\s()\\[\\]]/;function z(e,t){return!(t<0||t>=e.length)&&!q.test(e[t])}function V(e,t,n){return e.substr(0,t)+n+e.substr(t+1)}var W=[[\"block\",function(e){e.inlineMode?e.tokens.push({type:\"inline\",content:e.src.replace(/\\n/g,\" \").trim(),level:0,lines:[0,1],children:[]}):e.block.parse(e.src,e.options,e.env,e.tokens)}],[\"abbr\",function(e){var t,n,r,o,a=e.tokens;if(!e.inlineMode)for(t=1,n=a.length-1;t<n;t++)if(\"paragraph_open\"===a[t-1].type&&\"inline\"===a[t].type&&\"paragraph_close\"===a[t+1].type){for(r=a[t].content;r.length&&!((o=O(r,e.inline,e.options,e.env))<0);)r=r.slice(o).trim();a[t].content=r,r.length||(a[t-1].tight=!0,a[t+1].tight=!0)}}],[\"references\",function(e){var t,n,r,o,a=e.tokens;if(e.env.references=e.env.references||{},!e.inlineMode)for(t=1,n=a.length-1;t<n;t++)if(\"inline\"===a[t].type&&\"paragraph_open\"===a[t-1].type&&\"paragraph_close\"===a[t+1].type){for(r=a[t].content;r.length&&!((o=N(r,e.inline,e.options,e.env))<0);)r=r.slice(o).trim();a[t].content=r,r.length||(a[t-1].tight=!0,a[t+1].tight=!0)}}],[\"inline\",function(e){var t,n,r,o=e.tokens;for(n=0,r=o.length;n<r;n++)\"inline\"===(t=o[n]).type&&e.inline.parse(t.content,e.options,e.env,t.children)}],[\"footnote_tail\",function(e){var t,n,r,o,a,i,s,u,c,l=0,p=!1,f={};if(e.env.footnotes&&(e.tokens=e.tokens.filter((function(e){return\"footnote_reference_open\"===e.type?(p=!0,u=[],c=e.label,!1):\"footnote_reference_close\"===e.type?(p=!1,f[\":\"+c]=u,!1):(p&&u.push(e),!p)})),e.env.footnotes.list)){for(i=e.env.footnotes.list,e.tokens.push({type:\"footnote_block_open\",level:l++}),t=0,n=i.length;t<n;t++){for(e.tokens.push({type:\"footnote_open\",id:t,level:l++}),i[t].tokens?((s=[]).push({type:\"paragraph_open\",tight:!1,level:l++}),s.push({type:\"inline\",content:\"\",level:l,children:i[t].tokens}),s.push({type:\"paragraph_close\",tight:!1,level:--l})):i[t].label&&(s=f[\":\"+i[t].label]),e.tokens=e.tokens.concat(s),a=\"paragraph_close\"===e.tokens[e.tokens.length-1].type?e.tokens.pop():null,o=i[t].count>0?i[t].count:1,r=0;r<o;r++)e.tokens.push({type:\"footnote_anchor\",id:t,subId:r,level:l});a&&e.tokens.push(a),e.tokens.push({type:\"footnote_close\",level:--l})}e.tokens.push({type:\"footnote_block_close\",level:--l})}}],[\"abbr2\",function(e){var t,n,r,o,a,i,s,u,c,l,p,f,h=e.tokens;if(e.env.abbreviations)for(e.env.abbrRegExp||(f=\"(^|[\"+M.split(\"\").map(R).join(\"\")+\"])(\"+Object.keys(e.env.abbreviations).map((function(e){return e.substr(1)})).sort((function(e,t){return t.length-e.length})).map(R).join(\"|\")+\")($|[\"+M.split(\"\").map(R).join(\"\")+\"])\",e.env.abbrRegExp=new RegExp(f,\"g\")),l=e.env.abbrRegExp,n=0,r=h.length;n<r;n++)if(\"inline\"===h[n].type)for(t=(o=h[n].children).length-1;t>=0;t--)if(\"text\"===(a=o[t]).type){for(u=0,i=a.content,l.lastIndex=0,c=a.level,s=[];p=l.exec(i);)l.lastIndex>u&&s.push({type:\"text\",content:i.slice(u,p.index+p[1].length),level:c}),s.push({type:\"abbr_open\",title:e.env.abbreviations[\":\"+p[2]],level:c++}),s.push({type:\"text\",content:p[2],level:c}),s.push({type:\"abbr_close\",level:--c}),u=l.lastIndex-p[3].length;s.length&&(u<i.length&&s.push({type:\"text\",content:i.slice(u),level:c}),h[n].children=o=[].concat(o.slice(0,t),s,o.slice(t+1)))}}],[\"replacements\",function(e){var t,n,r,o,a,i;if(e.options.typographer)for(a=e.tokens.length-1;a>=0;a--)if(\"inline\"===e.tokens[a].type)for(t=(o=e.tokens[a].children).length-1;t>=0;t--)\"text\"===(n=o[t]).type&&(r=n.content,r=(i=r).indexOf(\"(\")<0?i:i.replace(L,(function(e,t){return B[t.toLowerCase()]})),D.test(r)&&(r=r.replace(/\\+-/g,\"±\").replace(/\\.{2,}/g,\"…\").replace(/([?!])…/g,\"$1..\").replace(/([?!]){4,}/g,\"$1$1$1\").replace(/,{2,}/g,\",\").replace(/(^|[^-])---([^-]|$)/gm,\"$1—$2\").replace(/(^|\\s)--(\\s|$)/gm,\"$1–$2\").replace(/(^|[^-\\s])--([^-\\s]|$)/gm,\"$1–$2\")),n.content=r)}],[\"smartquotes\",function(e){var t,n,r,o,a,i,s,u,c,l,p,f,h,d,m,v,g;if(e.options.typographer)for(g=[],m=e.tokens.length-1;m>=0;m--)if(\"inline\"===e.tokens[m].type)for(v=e.tokens[m].children,g.length=0,t=0;t<v.length;t++)if(\"text\"===(n=v[t]).type&&!F.test(n.text)){for(s=v[t].level,h=g.length-1;h>=0&&!(g[h].level<=s);h--);g.length=h+1,a=0,i=(r=n.content).length;e:for(;a<i&&(U.lastIndex=a,o=U.exec(r));)if(u=!z(r,o.index-1),a=o.index+1,d=\"'\"===o[0],(c=!z(r,a))||u){if(p=!c,f=!u)for(h=g.length-1;h>=0&&(l=g[h],!(g[h].level<s));h--)if(l.single===d&&g[h].level===s){l=g[h],d?(v[l.token].content=V(v[l.token].content,l.pos,e.options.quotes[2]),n.content=V(n.content,o.index,e.options.quotes[3])):(v[l.token].content=V(v[l.token].content,l.pos,e.options.quotes[0]),n.content=V(n.content,o.index,e.options.quotes[1])),g.length=h;continue e}p?g.push({token:t,pos:o.index,single:d,level:s}):f&&d&&(n.content=V(n.content,o.index,\"’\"))}else d&&(n.content=V(n.content,o.index,\"’\"))}}]];function H(){this.options={},this.ruler=new C;for(var e=0;e<W.length;e++)this.ruler.push(W[e][0],W[e][1])}function $(e,t,n,r,o){var a,i,s,u,c,l,p;for(this.src=e,this.parser=t,this.options=n,this.env=r,this.tokens=o,this.bMarks=[],this.eMarks=[],this.tShift=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.parentType=\"root\",this.ddIndent=-1,this.level=0,this.result=\"\",l=0,p=!1,s=u=l=0,c=(i=this.src).length;u<c;u++){if(a=i.charCodeAt(u),!p){if(32===a){l++;continue}p=!0}10!==a&&u!==c-1||(10!==a&&u++,this.bMarks.push(s),this.eMarks.push(u),this.tShift.push(l),p=!1,l=0,s=u+1)}this.bMarks.push(i.length),this.eMarks.push(i.length),this.tShift.push(0),this.lineMax=this.bMarks.length-1}function J(e,t){var n,r,o;return(r=e.bMarks[t]+e.tShift[t])>=(o=e.eMarks[t])||42!==(n=e.src.charCodeAt(r++))&&45!==n&&43!==n||r<o&&32!==e.src.charCodeAt(r)?-1:r}function K(e,t){var n,r=e.bMarks[t]+e.tShift[t],o=e.eMarks[t];if(r+1>=o)return-1;if((n=e.src.charCodeAt(r++))<48||n>57)return-1;for(;;){if(r>=o)return-1;if(!((n=e.src.charCodeAt(r++))>=48&&n<=57)){if(41===n||46===n)break;return-1}}return r<o&&32!==e.src.charCodeAt(r)?-1:r}H.prototype.process=function(e){var t,n,r;for(t=0,n=(r=this.ruler.getRules(\"\")).length;t<n;t++)r[t](e)},$.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},$.prototype.skipEmptyLines=function(e){for(var t=this.lineMax;e<t&&!(this.bMarks[e]+this.tShift[e]<this.eMarks[e]);e++);return e},$.prototype.skipSpaces=function(e){for(var t=this.src.length;e<t&&32===this.src.charCodeAt(e);e++);return e},$.prototype.skipChars=function(e,t){for(var n=this.src.length;e<n&&this.src.charCodeAt(e)===t;e++);return e},$.prototype.skipCharsBack=function(e,t,n){if(e<=n)return e;for(;e>n;)if(t!==this.src.charCodeAt(--e))return e+1;return e},$.prototype.getLines=function(e,t,n,r){var o,a,i,s,u,c=e;if(e>=t)return\"\";if(c+1===t)return a=this.bMarks[c]+Math.min(this.tShift[c],n),i=r?this.eMarks[c]+1:this.eMarks[c],this.src.slice(a,i);for(s=new Array(t-e),o=0;c<t;c++,o++)(u=this.tShift[c])>n&&(u=n),u<0&&(u=0),a=this.bMarks[c]+u,i=c+1<t||r?this.eMarks[c]+1:this.eMarks[c],s[o]=this.src.slice(a,i);return s.join(\"\")};var Y={};[\"article\",\"aside\",\"button\",\"blockquote\",\"body\",\"canvas\",\"caption\",\"col\",\"colgroup\",\"dd\",\"div\",\"dl\",\"dt\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hgroup\",\"hr\",\"iframe\",\"li\",\"map\",\"object\",\"ol\",\"output\",\"p\",\"pre\",\"progress\",\"script\",\"section\",\"style\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"tr\",\"thead\",\"ul\",\"video\"].forEach((function(e){Y[e]=!0}));var G=/^<([a-zA-Z]{1,15})[\\s\\/>]/,Z=/^<\\/([a-zA-Z]{1,15})[\\s>]/;function X(e,t){var n=e.bMarks[t]+e.blkIndent,r=e.eMarks[t];return e.src.substr(n,r-n)}function Q(e,t){var n,r,o=e.bMarks[t]+e.tShift[t],a=e.eMarks[t];return o>=a||126!==(r=e.src.charCodeAt(o++))&&58!==r||o===(n=e.skipSpaces(o))||n>=a?-1:n}var ee=[[\"code\",function(e,t,n){var r,o;if(e.tShift[t]-e.blkIndent<4)return!1;for(o=r=t+1;r<n;)if(e.isEmpty(r))r++;else{if(!(e.tShift[r]-e.blkIndent>=4))break;o=++r}return e.line=r,e.tokens.push({type:\"code\",content:e.getLines(t,o,4+e.blkIndent,!0),block:!0,lines:[t,e.line],level:e.level}),!0}],[\"fences\",function(e,t,n,r){var o,a,i,s,u,c=!1,l=e.bMarks[t]+e.tShift[t],p=e.eMarks[t];if(l+3>p)return!1;if(126!==(o=e.src.charCodeAt(l))&&96!==o)return!1;if(u=l,(a=(l=e.skipChars(l,o))-u)<3)return!1;if((i=e.src.slice(l,p).trim()).indexOf(\"`\")>=0)return!1;if(r)return!0;for(s=t;!(++s>=n)&&!((l=u=e.bMarks[s]+e.tShift[s])<(p=e.eMarks[s])&&e.tShift[s]<e.blkIndent);)if(e.src.charCodeAt(l)===o&&!(e.tShift[s]-e.blkIndent>=4||(l=e.skipChars(l,o))-u<a||(l=e.skipSpaces(l))<p)){c=!0;break}return a=e.tShift[t],e.line=s+(c?1:0),e.tokens.push({type:\"fence\",params:i,content:e.getLines(t+1,s,a,!0),lines:[t,e.line],level:e.level}),!0},[\"paragraph\",\"blockquote\",\"list\"]],[\"blockquote\",function(e,t,n,r){var o,a,i,s,u,c,l,p,f,h,d,m=e.bMarks[t]+e.tShift[t],v=e.eMarks[t];if(m>v)return!1;if(62!==e.src.charCodeAt(m++))return!1;if(e.level>=e.options.maxNesting)return!1;if(r)return!0;for(32===e.src.charCodeAt(m)&&m++,u=e.blkIndent,e.blkIndent=0,s=[e.bMarks[t]],e.bMarks[t]=m,a=(m=m<v?e.skipSpaces(m):m)>=v,i=[e.tShift[t]],e.tShift[t]=m-e.bMarks[t],p=e.parser.ruler.getRules(\"blockquote\"),o=t+1;o<n&&!((m=e.bMarks[o]+e.tShift[o])>=(v=e.eMarks[o]));o++)if(62!==e.src.charCodeAt(m++)){if(a)break;for(d=!1,f=0,h=p.length;f<h;f++)if(p[f](e,o,n,!0)){d=!0;break}if(d)break;s.push(e.bMarks[o]),i.push(e.tShift[o]),e.tShift[o]=-1337}else 32===e.src.charCodeAt(m)&&m++,s.push(e.bMarks[o]),e.bMarks[o]=m,a=(m=m<v?e.skipSpaces(m):m)>=v,i.push(e.tShift[o]),e.tShift[o]=m-e.bMarks[o];for(c=e.parentType,e.parentType=\"blockquote\",e.tokens.push({type:\"blockquote_open\",lines:l=[t,0],level:e.level++}),e.parser.tokenize(e,t,o),e.tokens.push({type:\"blockquote_close\",level:--e.level}),e.parentType=c,l[1]=e.line,f=0;f<i.length;f++)e.bMarks[f+t]=s[f],e.tShift[f+t]=i[f];return e.blkIndent=u,!0},[\"paragraph\",\"blockquote\",\"list\"]],[\"hr\",function(e,t,n,r){var o,a,i,s=e.bMarks[t],u=e.eMarks[t];if((s+=e.tShift[t])>u)return!1;if(42!==(o=e.src.charCodeAt(s++))&&45!==o&&95!==o)return!1;for(a=1;s<u;){if((i=e.src.charCodeAt(s++))!==o&&32!==i)return!1;i===o&&a++}return!(a<3)&&(r||(e.line=t+1,e.tokens.push({type:\"hr\",lines:[t,e.line],level:e.level})),!0)},[\"paragraph\",\"blockquote\",\"list\"]],[\"list\",function(e,t,n,r){var o,a,i,s,u,c,l,p,f,h,d,m,v,g,y,b,_,w,x,E,S,C=!0;if((p=K(e,t))>=0)m=!0;else{if(!((p=J(e,t))>=0))return!1;m=!1}if(e.level>=e.options.maxNesting)return!1;if(d=e.src.charCodeAt(p-1),r)return!0;for(g=e.tokens.length,m?(l=e.bMarks[t]+e.tShift[t],h=Number(e.src.substr(l,p-l-1)),e.tokens.push({type:\"ordered_list_open\",order:h,lines:b=[t,0],level:e.level++})):e.tokens.push({type:\"bullet_list_open\",lines:b=[t,0],level:e.level++}),o=t,y=!1,w=e.parser.ruler.getRules(\"list\");!(!(o<n)||((f=(v=e.skipSpaces(p))>=e.eMarks[o]?1:v-p)>4&&(f=1),f<1&&(f=1),a=p-e.bMarks[o]+f,e.tokens.push({type:\"list_item_open\",lines:_=[t,0],level:e.level++}),s=e.blkIndent,u=e.tight,i=e.tShift[t],c=e.parentType,e.tShift[t]=v-e.bMarks[t],e.blkIndent=a,e.tight=!0,e.parentType=\"list\",e.parser.tokenize(e,t,n,!0),e.tight&&!y||(C=!1),y=e.line-t>1&&e.isEmpty(e.line-1),e.blkIndent=s,e.tShift[t]=i,e.tight=u,e.parentType=c,e.tokens.push({type:\"list_item_close\",level:--e.level}),o=t=e.line,_[1]=o,v=e.bMarks[t],o>=n)||e.isEmpty(o)||e.tShift[o]<e.blkIndent);){for(S=!1,x=0,E=w.length;x<E;x++)if(w[x](e,o,n,!0)){S=!0;break}if(S)break;if(m){if((p=K(e,o))<0)break}else if((p=J(e,o))<0)break;if(d!==e.src.charCodeAt(p-1))break}return e.tokens.push({type:m?\"ordered_list_close\":\"bullet_list_close\",level:--e.level}),b[1]=o,e.line=o,C&&function(e,t){var n,r,o=e.level+2;for(n=t+2,r=e.tokens.length-2;n<r;n++)e.tokens[n].level===o&&\"paragraph_open\"===e.tokens[n].type&&(e.tokens[n+2].tight=!0,e.tokens[n].tight=!0,n+=2)}(e,g),!0},[\"paragraph\",\"blockquote\"]],[\"footnote\",function(e,t,n,r){var o,a,i,s,u,c=e.bMarks[t]+e.tShift[t],l=e.eMarks[t];if(c+4>l)return!1;if(91!==e.src.charCodeAt(c))return!1;if(94!==e.src.charCodeAt(c+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(s=c+2;s<l;s++){if(32===e.src.charCodeAt(s))return!1;if(93===e.src.charCodeAt(s))break}return s!==c+2&&(!(s+1>=l||58!==e.src.charCodeAt(++s))&&(r||(s++,e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.refs||(e.env.footnotes.refs={}),u=e.src.slice(c+2,s-2),e.env.footnotes.refs[\":\"+u]=-1,e.tokens.push({type:\"footnote_reference_open\",label:u,level:e.level++}),o=e.bMarks[t],a=e.tShift[t],i=e.parentType,e.tShift[t]=e.skipSpaces(s)-s,e.bMarks[t]=s,e.blkIndent+=4,e.parentType=\"footnote\",e.tShift[t]<e.blkIndent&&(e.tShift[t]+=e.blkIndent,e.bMarks[t]-=e.blkIndent),e.parser.tokenize(e,t,n,!0),e.parentType=i,e.blkIndent-=4,e.tShift[t]=a,e.bMarks[t]=o,e.tokens.push({type:\"footnote_reference_close\",level:--e.level})),!0))},[\"paragraph\"]],[\"heading\",function(e,t,n,r){var o,a,i,s=e.bMarks[t]+e.tShift[t],u=e.eMarks[t];if(s>=u)return!1;if(35!==(o=e.src.charCodeAt(s))||s>=u)return!1;for(a=1,o=e.src.charCodeAt(++s);35===o&&s<u&&a<=6;)a++,o=e.src.charCodeAt(++s);return!(a>6||s<u&&32!==o)&&(r||(u=e.skipCharsBack(u,32,s),(i=e.skipCharsBack(u,35,s))>s&&32===e.src.charCodeAt(i-1)&&(u=i),e.line=t+1,e.tokens.push({type:\"heading_open\",hLevel:a,lines:[t,e.line],level:e.level}),s<u&&e.tokens.push({type:\"inline\",content:e.src.slice(s,u).trim(),level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:a,level:e.level})),!0)},[\"paragraph\",\"blockquote\"]],[\"lheading\",function(e,t,n){var r,o,a,i=t+1;return!(i>=n)&&(!(e.tShift[i]<e.blkIndent)&&(!(e.tShift[i]-e.blkIndent>3)&&(!((o=e.bMarks[i]+e.tShift[i])>=(a=e.eMarks[i]))&&((45===(r=e.src.charCodeAt(o))||61===r)&&(o=e.skipChars(o,r),!((o=e.skipSpaces(o))<a)&&(o=e.bMarks[t]+e.tShift[t],e.line=i+1,e.tokens.push({type:\"heading_open\",hLevel:61===r?1:2,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:e.src.slice(o,e.eMarks[t]).trim(),level:e.level+1,lines:[t,e.line-1],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:61===r?1:2,level:e.level}),!0))))))}],[\"htmlblock\",function(e,t,n,r){var o,a,i,s=e.bMarks[t],u=e.eMarks[t],c=e.tShift[t];if(s+=c,!e.options.html)return!1;if(c>3||s+2>=u)return!1;if(60!==e.src.charCodeAt(s))return!1;if(33===(o=e.src.charCodeAt(s+1))||63===o){if(r)return!0}else{if(47!==o&&!function(e){var t=32|e;return t>=97&&t<=122}(o))return!1;if(47===o){if(!(a=e.src.slice(s,u).match(Z)))return!1}else if(!(a=e.src.slice(s,u).match(G)))return!1;if(!0!==Y[a[1].toLowerCase()])return!1;if(r)return!0}for(i=t+1;i<e.lineMax&&!e.isEmpty(i);)i++;return e.line=i,e.tokens.push({type:\"htmlblock\",level:e.level,lines:[t,e.line],content:e.getLines(t,i,0,!0)}),!0},[\"paragraph\",\"blockquote\"]],[\"table\",function(e,t,n,r){var o,a,i,s,u,c,l,p,f,h,d;if(t+2>n)return!1;if(u=t+1,e.tShift[u]<e.blkIndent)return!1;if((i=e.bMarks[u]+e.tShift[u])>=e.eMarks[u])return!1;if(124!==(o=e.src.charCodeAt(i))&&45!==o&&58!==o)return!1;if(a=X(e,t+1),!/^[-:| ]+$/.test(a))return!1;if((c=a.split(\"|\"))<=2)return!1;for(p=[],s=0;s<c.length;s++){if(!(f=c[s].trim())){if(0===s||s===c.length-1)continue;return!1}if(!/^:?-+:?$/.test(f))return!1;58===f.charCodeAt(f.length-1)?p.push(58===f.charCodeAt(0)?\"center\":\"right\"):58===f.charCodeAt(0)?p.push(\"left\"):p.push(\"\")}if(-1===(a=X(e,t).trim()).indexOf(\"|\"))return!1;if(c=a.replace(/^\\||\\|$/g,\"\").split(\"|\"),p.length!==c.length)return!1;if(r)return!0;for(e.tokens.push({type:\"table_open\",lines:h=[t,0],level:e.level++}),e.tokens.push({type:\"thead_open\",lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"tr_open\",lines:[t,t+1],level:e.level++}),s=0;s<c.length;s++)e.tokens.push({type:\"th_open\",align:p[s],lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"inline\",content:c[s].trim(),lines:[t,t+1],level:e.level,children:[]}),e.tokens.push({type:\"th_close\",level:--e.level});for(e.tokens.push({type:\"tr_close\",level:--e.level}),e.tokens.push({type:\"thead_close\",level:--e.level}),e.tokens.push({type:\"tbody_open\",lines:d=[t+2,0],level:e.level++}),u=t+2;u<n&&!(e.tShift[u]<e.blkIndent)&&-1!==(a=X(e,u).trim()).indexOf(\"|\");u++){for(c=a.replace(/^\\||\\|$/g,\"\").split(\"|\"),e.tokens.push({type:\"tr_open\",level:e.level++}),s=0;s<c.length;s++)e.tokens.push({type:\"td_open\",align:p[s],level:e.level++}),l=c[s].substring(124===c[s].charCodeAt(0)?1:0,124===c[s].charCodeAt(c[s].length-1)?c[s].length-1:c[s].length).trim(),e.tokens.push({type:\"inline\",content:l,level:e.level,children:[]}),e.tokens.push({type:\"td_close\",level:--e.level});e.tokens.push({type:\"tr_close\",level:--e.level})}return e.tokens.push({type:\"tbody_close\",level:--e.level}),e.tokens.push({type:\"table_close\",level:--e.level}),h[1]=d[1]=u,e.line=u,!0},[\"paragraph\"]],[\"deflist\",function(e,t,n,r){var o,a,i,s,u,c,l,p,f,h,d,m,v,g;if(r)return!(e.ddIndent<0)&&Q(e,t)>=0;if(l=t+1,e.isEmpty(l)&&++l>n)return!1;if(e.tShift[l]<e.blkIndent)return!1;if((o=Q(e,l))<0)return!1;if(e.level>=e.options.maxNesting)return!1;c=e.tokens.length,e.tokens.push({type:\"dl_open\",lines:u=[t,0],level:e.level++}),i=t,a=l;e:for(;;){for(g=!0,v=!1,e.tokens.push({type:\"dt_open\",lines:[i,i],level:e.level++}),e.tokens.push({type:\"inline\",content:e.getLines(i,i+1,e.blkIndent,!1).trim(),level:e.level+1,lines:[i,i],children:[]}),e.tokens.push({type:\"dt_close\",level:--e.level});;){if(e.tokens.push({type:\"dd_open\",lines:s=[l,0],level:e.level++}),m=e.tight,f=e.ddIndent,p=e.blkIndent,d=e.tShift[a],h=e.parentType,e.blkIndent=e.ddIndent=e.tShift[a]+2,e.tShift[a]=o-e.bMarks[a],e.tight=!0,e.parentType=\"deflist\",e.parser.tokenize(e,a,n,!0),e.tight&&!v||(g=!1),v=e.line-a>1&&e.isEmpty(e.line-1),e.tShift[a]=d,e.tight=m,e.parentType=h,e.blkIndent=p,e.ddIndent=f,e.tokens.push({type:\"dd_close\",level:--e.level}),s[1]=l=e.line,l>=n)break e;if(e.tShift[l]<e.blkIndent)break e;if((o=Q(e,l))<0)break;a=l}if(l>=n)break;if(i=l,e.isEmpty(i))break;if(e.tShift[i]<e.blkIndent)break;if((a=i+1)>=n)break;if(e.isEmpty(a)&&a++,a>=n)break;if(e.tShift[a]<e.blkIndent)break;if((o=Q(e,a))<0)break}return e.tokens.push({type:\"dl_close\",level:--e.level}),u[1]=l,e.line=l,g&&function(e,t){var n,r,o=e.level+2;for(n=t+2,r=e.tokens.length-2;n<r;n++)e.tokens[n].level===o&&\"paragraph_open\"===e.tokens[n].type&&(e.tokens[n+2].tight=!0,e.tokens[n].tight=!0,n+=2)}(e,c),!0},[\"paragraph\"]],[\"paragraph\",function(e,t){var n,r,o,a,i,s,u=t+1;if(u<(n=e.lineMax)&&!e.isEmpty(u))for(s=e.parser.ruler.getRules(\"paragraph\");u<n&&!e.isEmpty(u);u++)if(!(e.tShift[u]-e.blkIndent>3)){for(o=!1,a=0,i=s.length;a<i;a++)if(s[a](e,u,n,!0)){o=!0;break}if(o)break}return r=e.getLines(t,u,e.blkIndent,!1).trim(),e.line=u,r.length&&(e.tokens.push({type:\"paragraph_open\",tight:!1,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:r,level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"paragraph_close\",tight:!1,level:e.level})),!0}]];function te(){this.ruler=new C;for(var e=0;e<ee.length;e++)this.ruler.push(ee[e][0],ee[e][1],{alt:(ee[e][2]||[]).slice()})}te.prototype.tokenize=function(e,t,n){for(var r,o=this.ruler.getRules(\"\"),a=o.length,i=t,s=!1;i<n&&(e.line=i=e.skipEmptyLines(i),!(i>=n))&&!(e.tShift[i]<e.blkIndent);){for(r=0;r<a&&!o[r](e,i,n,!1);r++);if(e.tight=!s,e.isEmpty(e.line-1)&&(s=!0),(i=e.line)<n&&e.isEmpty(i)){if(s=!0,++i<n&&\"list\"===e.parentType&&e.isEmpty(i))break;e.line=i}}};var ne=/[\\n\\t]/g,re=/\\r[\\n\\u0085]|[\\u2424\\u2028\\u0085]/g,oe=/\\u00a0/g;function ae(e){switch(e){case 10:case 92:case 96:case 42:case 95:case 94:case 91:case 93:case 33:case 38:case 60:case 62:case 123:case 125:case 36:case 37:case 64:case 126:case 43:case 61:case 58:return!0;default:return!1}}te.prototype.parse=function(e,t,n,r){var o,a=0,i=0;if(!e)return[];(e=(e=e.replace(oe,\" \")).replace(re,\"\\n\")).indexOf(\"\\t\")>=0&&(e=e.replace(ne,(function(t,n){var r;return 10===e.charCodeAt(n)?(a=n+1,i=0,t):(r=\"    \".slice((n-a-i)%4),i=n-a+1,r)}))),o=new $(e,this,t,n,r),this.tokenize(o,o.line,o.lineMax)};for(var ie=[],se=0;se<256;se++)ie.push(0);function ue(e){return e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122}function ce(e,t){var n,r,o,a=t,i=!0,s=!0,u=e.posMax,c=e.src.charCodeAt(t);for(n=t>0?e.src.charCodeAt(t-1):-1;a<u&&e.src.charCodeAt(a)===c;)a++;return a>=u&&(i=!1),(o=a-t)>=4?i=s=!1:(32!==(r=a<u?e.src.charCodeAt(a):-1)&&10!==r||(i=!1),32!==n&&10!==n||(s=!1),95===c&&(ue(n)&&(i=!1),ue(r)&&(s=!1))),{can_open:i,can_close:s,delims:o}}\"\\\\!\\\"#$%&'()*+,./:;<=>?@[]^_`{|}~-\".split(\"\").forEach((function(e){ie[e.charCodeAt(0)]=1}));var le=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;var pe=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;var fe=[\"coap\",\"doi\",\"javascript\",\"aaa\",\"aaas\",\"about\",\"acap\",\"cap\",\"cid\",\"crid\",\"data\",\"dav\",\"dict\",\"dns\",\"file\",\"ftp\",\"geo\",\"go\",\"gopher\",\"h323\",\"http\",\"https\",\"iax\",\"icap\",\"im\",\"imap\",\"info\",\"ipp\",\"iris\",\"iris.beep\",\"iris.xpc\",\"iris.xpcs\",\"iris.lwz\",\"ldap\",\"mailto\",\"mid\",\"msrp\",\"msrps\",\"mtqp\",\"mupdate\",\"news\",\"nfs\",\"ni\",\"nih\",\"nntp\",\"opaquelocktoken\",\"pop\",\"pres\",\"rtsp\",\"service\",\"session\",\"shttp\",\"sieve\",\"sip\",\"sips\",\"sms\",\"snmp\",\"soap.beep\",\"soap.beeps\",\"tag\",\"tel\",\"telnet\",\"tftp\",\"thismessage\",\"tn3270\",\"tip\",\"tv\",\"urn\",\"vemmi\",\"ws\",\"wss\",\"xcon\",\"xcon-userid\",\"xmlrpc.beep\",\"xmlrpc.beeps\",\"xmpp\",\"z39.50r\",\"z39.50s\",\"adiumxtra\",\"afp\",\"afs\",\"aim\",\"apt\",\"attachment\",\"aw\",\"beshare\",\"bitcoin\",\"bolo\",\"callto\",\"chrome\",\"chrome-extension\",\"com-eventbrite-attendee\",\"content\",\"cvs\",\"dlna-playsingle\",\"dlna-playcontainer\",\"dtn\",\"dvb\",\"ed2k\",\"facetime\",\"feed\",\"finger\",\"fish\",\"gg\",\"git\",\"gizmoproject\",\"gtalk\",\"hcp\",\"icon\",\"ipn\",\"irc\",\"irc6\",\"ircs\",\"itms\",\"jar\",\"jms\",\"keyparc\",\"lastfm\",\"ldaps\",\"magnet\",\"maps\",\"market\",\"message\",\"mms\",\"ms-help\",\"msnim\",\"mumble\",\"mvn\",\"notes\",\"oid\",\"palm\",\"paparazzi\",\"platform\",\"proxy\",\"psyc\",\"query\",\"res\",\"resource\",\"rmi\",\"rsync\",\"rtmp\",\"secondlife\",\"sftp\",\"sgn\",\"skype\",\"smb\",\"soldat\",\"spotify\",\"ssh\",\"steam\",\"svn\",\"teamspeak\",\"things\",\"udp\",\"unreal\",\"ut2004\",\"ventrilo\",\"view-source\",\"webcal\",\"wtai\",\"wyciwyg\",\"xfire\",\"xri\",\"ymsgr\"],he=/^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,de=/^<([a-zA-Z.\\-]{1,25}):([^<>\\x00-\\x20]*)>/;function me(e,t){return e=e.source,t=t||\"\",function n(r,o){return r?(o=o.source||o,e=e.replace(r,o),n):new RegExp(e,t)}}var ve=me(/(?:unquoted|single_quoted|double_quoted)/)(\"unquoted\",/[^\"'=<>`\\x00-\\x20]+/)(\"single_quoted\",/'[^']*'/)(\"double_quoted\",/\"[^\"]*\"/)(),ge=me(/(?:\\s+attr_name(?:\\s*=\\s*attr_value)?)/)(\"attr_name\",/[a-zA-Z_:][a-zA-Z0-9:._-]*/)(\"attr_value\",ve)(),ye=me(/<[A-Za-z][A-Za-z0-9]*attribute*\\s*\\/?>/)(\"attribute\",ge)(),be=me(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)(\"open_tag\",ye)(\"close_tag\",/<\\/[A-Za-z][A-Za-z0-9]*\\s*>/)(\"comment\",/<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->/)(\"processing\",/<[?].*?[?]>/)(\"declaration\",/<![A-Z]+\\s+[^>]*>/)(\"cdata\",/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/)();var _e=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,we=/^&([a-z][a-z0-9]{1,31});/i;var xe=[[\"text\",function(e,t){for(var n=e.pos;n<e.posMax&&!ae(e.src.charCodeAt(n));)n++;return n!==e.pos&&(t||(e.pending+=e.src.slice(e.pos,n)),e.pos=n,!0)}],[\"newline\",function(e,t){var n,r,o=e.pos;if(10!==e.src.charCodeAt(o))return!1;if(n=e.pending.length-1,r=e.posMax,!t)if(n>=0&&32===e.pending.charCodeAt(n))if(n>=1&&32===e.pending.charCodeAt(n-1)){for(var a=n-2;a>=0;a--)if(32!==e.pending.charCodeAt(a)){e.pending=e.pending.substring(0,a+1);break}e.push({type:\"hardbreak\",level:e.level})}else e.pending=e.pending.slice(0,-1),e.push({type:\"softbreak\",level:e.level});else e.push({type:\"softbreak\",level:e.level});for(o++;o<r&&32===e.src.charCodeAt(o);)o++;return e.pos=o,!0}],[\"escape\",function(e,t){var n,r=e.pos,o=e.posMax;if(92!==e.src.charCodeAt(r))return!1;if(++r<o){if((n=e.src.charCodeAt(r))<256&&0!==ie[n])return t||(e.pending+=e.src[r]),e.pos+=2,!0;if(10===n){for(t||e.push({type:\"hardbreak\",level:e.level}),r++;r<o&&32===e.src.charCodeAt(r);)r++;return e.pos=r,!0}}return t||(e.pending+=\"\\\\\"),e.pos++,!0}],[\"backticks\",function(e,t){var n,r,o,a,i,s=e.pos;if(96!==e.src.charCodeAt(s))return!1;for(n=s,s++,r=e.posMax;s<r&&96===e.src.charCodeAt(s);)s++;for(o=e.src.slice(n,s),a=i=s;-1!==(a=e.src.indexOf(\"`\",i));){for(i=a+1;i<r&&96===e.src.charCodeAt(i);)i++;if(i-a===o.length)return t||e.push({type:\"code\",content:e.src.slice(s,a).replace(/[ \\n]+/g,\" \").trim(),block:!1,level:e.level}),e.pos=i,!0}return t||(e.pending+=o),e.pos+=o.length,!0}],[\"del\",function(e,t){var n,r,o,a,i,s=e.posMax,u=e.pos;if(126!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=s)return!1;if(126!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(a=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),126===a)return!1;if(126===i)return!1;if(32===i||10===i)return!1;for(r=u+2;r<s&&126===e.src.charCodeAt(r);)r++;if(r>u+3)return e.pos+=r-u,t||(e.pending+=e.src.slice(u,r)),!0;for(e.pos=u+2,o=1;e.pos+1<s;){if(126===e.src.charCodeAt(e.pos)&&126===e.src.charCodeAt(e.pos+1)&&(a=e.src.charCodeAt(e.pos-1),126!==(i=e.pos+2<s?e.src.charCodeAt(e.pos+2):-1)&&126!==a&&(32!==a&&10!==a?o--:32!==i&&10!==i&&o++,o<=0))){n=!0;break}e.parser.skipToken(e)}return n?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"del_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"del_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=s,!0):(e.pos=u,!1)}],[\"ins\",function(e,t){var n,r,o,a,i,s=e.posMax,u=e.pos;if(43!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=s)return!1;if(43!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(a=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),43===a)return!1;if(43===i)return!1;if(32===i||10===i)return!1;for(r=u+2;r<s&&43===e.src.charCodeAt(r);)r++;if(r!==u+2)return e.pos+=r-u,t||(e.pending+=e.src.slice(u,r)),!0;for(e.pos=u+2,o=1;e.pos+1<s;){if(43===e.src.charCodeAt(e.pos)&&43===e.src.charCodeAt(e.pos+1)&&(a=e.src.charCodeAt(e.pos-1),43!==(i=e.pos+2<s?e.src.charCodeAt(e.pos+2):-1)&&43!==a&&(32!==a&&10!==a?o--:32!==i&&10!==i&&o++,o<=0))){n=!0;break}e.parser.skipToken(e)}return n?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"ins_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"ins_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=s,!0):(e.pos=u,!1)}],[\"mark\",function(e,t){var n,r,o,a,i,s=e.posMax,u=e.pos;if(61!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=s)return!1;if(61!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(a=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),61===a)return!1;if(61===i)return!1;if(32===i||10===i)return!1;for(r=u+2;r<s&&61===e.src.charCodeAt(r);)r++;if(r!==u+2)return e.pos+=r-u,t||(e.pending+=e.src.slice(u,r)),!0;for(e.pos=u+2,o=1;e.pos+1<s;){if(61===e.src.charCodeAt(e.pos)&&61===e.src.charCodeAt(e.pos+1)&&(a=e.src.charCodeAt(e.pos-1),61!==(i=e.pos+2<s?e.src.charCodeAt(e.pos+2):-1)&&61!==a&&(32!==a&&10!==a?o--:32!==i&&10!==i&&o++,o<=0))){n=!0;break}e.parser.skipToken(e)}return n?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"mark_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"mark_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=s,!0):(e.pos=u,!1)}],[\"emphasis\",function(e,t){var n,r,o,a,i,s,u,c=e.posMax,l=e.pos,p=e.src.charCodeAt(l);if(95!==p&&42!==p)return!1;if(t)return!1;if(n=(u=ce(e,l)).delims,!u.can_open)return e.pos+=n,t||(e.pending+=e.src.slice(l,e.pos)),!0;if(e.level>=e.options.maxNesting)return!1;for(e.pos=l+n,s=[n];e.pos<c;)if(e.src.charCodeAt(e.pos)!==p)e.parser.skipToken(e);else{if(r=(u=ce(e,e.pos)).delims,u.can_close){for(a=s.pop(),i=r;a!==i;){if(i<a){s.push(a-i);break}if(i-=a,0===s.length)break;e.pos+=a,a=s.pop()}if(0===s.length){n=a,o=!0;break}e.pos+=r;continue}u.can_open&&s.push(r),e.pos+=r}return o?(e.posMax=e.pos,e.pos=l+n,t||(2!==n&&3!==n||e.push({type:\"strong_open\",level:e.level++}),1!==n&&3!==n||e.push({type:\"em_open\",level:e.level++}),e.parser.tokenize(e),1!==n&&3!==n||e.push({type:\"em_close\",level:--e.level}),2!==n&&3!==n||e.push({type:\"strong_close\",level:--e.level})),e.pos=e.posMax+n,e.posMax=c,!0):(e.pos=l,!1)}],[\"sub\",function(e,t){var n,r,o=e.posMax,a=e.pos;if(126!==e.src.charCodeAt(a))return!1;if(t)return!1;if(a+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=a+1;e.pos<o;){if(126===e.src.charCodeAt(e.pos)){n=!0;break}e.parser.skipToken(e)}return n&&a+1!==e.pos?(r=e.src.slice(a+1,e.pos)).match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=a,!1):(e.posMax=e.pos,e.pos=a+1,t||e.push({type:\"sub\",level:e.level,content:r.replace(le,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=a,!1)}],[\"sup\",function(e,t){var n,r,o=e.posMax,a=e.pos;if(94!==e.src.charCodeAt(a))return!1;if(t)return!1;if(a+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=a+1;e.pos<o;){if(94===e.src.charCodeAt(e.pos)){n=!0;break}e.parser.skipToken(e)}return n&&a+1!==e.pos?(r=e.src.slice(a+1,e.pos)).match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=a,!1):(e.posMax=e.pos,e.pos=a+1,t||e.push({type:\"sup\",level:e.level,content:r.replace(pe,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=a,!1)}],[\"links\",function(e,t){var n,r,o,a,i,s,u,c,l=!1,p=e.pos,f=e.posMax,h=e.pos,d=e.src.charCodeAt(h);if(33===d&&(l=!0,d=e.src.charCodeAt(++h)),91!==d)return!1;if(e.level>=e.options.maxNesting)return!1;if(n=h+1,(r=k(e,h))<0)return!1;if((s=r+1)<f&&40===e.src.charCodeAt(s)){for(s++;s<f&&(32===(c=e.src.charCodeAt(s))||10===c);s++);if(s>=f)return!1;for(h=s,T(e,s)?(a=e.linkContent,s=e.pos):a=\"\",h=s;s<f&&(32===(c=e.src.charCodeAt(s))||10===c);s++);if(s<f&&h!==s&&I(e,s))for(i=e.linkContent,s=e.pos;s<f&&(32===(c=e.src.charCodeAt(s))||10===c);s++);else i=\"\";if(s>=f||41!==e.src.charCodeAt(s))return e.pos=p,!1;s++}else{if(e.linkLevel>0)return!1;for(;s<f&&(32===(c=e.src.charCodeAt(s))||10===c);s++);if(s<f&&91===e.src.charCodeAt(s)&&(h=s+1,(s=k(e,s))>=0?o=e.src.slice(h,s++):s=h-1),o||(void 0===o&&(s=r+1),o=e.src.slice(n,r)),!(u=e.env.references[P(o)]))return e.pos=p,!1;a=u.href,i=u.title}return t||(e.pos=n,e.posMax=r,l?e.push({type:\"image\",src:a,title:i,alt:e.src.substr(n,r-n),level:e.level}):(e.push({type:\"link_open\",href:a,title:i,level:e.level++}),e.linkLevel++,e.parser.tokenize(e),e.linkLevel--,e.push({type:\"link_close\",level:--e.level}))),e.pos=s,e.posMax=f,!0}],[\"footnote_inline\",function(e,t){var n,r,o,a,i=e.posMax,s=e.pos;return!(s+2>=i)&&(94===e.src.charCodeAt(s)&&(91===e.src.charCodeAt(s+1)&&(!(e.level>=e.options.maxNesting)&&(n=s+2,!((r=k(e,s+1))<0)&&(t||(e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.list||(e.env.footnotes.list=[]),o=e.env.footnotes.list.length,e.pos=n,e.posMax=r,e.push({type:\"footnote_ref\",id:o,level:e.level}),e.linkLevel++,a=e.tokens.length,e.parser.tokenize(e),e.env.footnotes.list[o]={tokens:e.tokens.splice(a)},e.linkLevel--),e.pos=r+1,e.posMax=i,!0)))))}],[\"footnote_ref\",function(e,t){var n,r,o,a,i=e.posMax,s=e.pos;if(s+3>i)return!1;if(!e.env.footnotes||!e.env.footnotes.refs)return!1;if(91!==e.src.charCodeAt(s))return!1;if(94!==e.src.charCodeAt(s+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(r=s+2;r<i;r++){if(32===e.src.charCodeAt(r))return!1;if(10===e.src.charCodeAt(r))return!1;if(93===e.src.charCodeAt(r))break}return r!==s+2&&(!(r>=i)&&(r++,n=e.src.slice(s+2,r-1),void 0!==e.env.footnotes.refs[\":\"+n]&&(t||(e.env.footnotes.list||(e.env.footnotes.list=[]),e.env.footnotes.refs[\":\"+n]<0?(o=e.env.footnotes.list.length,e.env.footnotes.list[o]={label:n,count:0},e.env.footnotes.refs[\":\"+n]=o):o=e.env.footnotes.refs[\":\"+n],a=e.env.footnotes.list[o].count,e.env.footnotes.list[o].count++,e.push({type:\"footnote_ref\",id:o,subId:a,level:e.level})),e.pos=r,e.posMax=i,!0)))}],[\"autolink\",function(e,t){var n,r,o,a,i,s=e.pos;return 60===e.src.charCodeAt(s)&&(!((n=e.src.slice(s)).indexOf(\">\")<0)&&((r=n.match(de))?!(fe.indexOf(r[1].toLowerCase())<0)&&(i=j(a=r[0].slice(1,-1)),!!e.parser.validateLink(a)&&(t||(e.push({type:\"link_open\",href:i,level:e.level}),e.push({type:\"text\",content:a,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=r[0].length,!0)):!!(o=n.match(he))&&(i=j(\"mailto:\"+(a=o[0].slice(1,-1))),!!e.parser.validateLink(i)&&(t||(e.push({type:\"link_open\",href:i,level:e.level}),e.push({type:\"text\",content:a,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=o[0].length,!0))))}],[\"htmltag\",function(e,t){var n,r,o,a=e.pos;return!!e.options.html&&(o=e.posMax,!(60!==e.src.charCodeAt(a)||a+2>=o)&&(!(33!==(n=e.src.charCodeAt(a+1))&&63!==n&&47!==n&&!function(e){var t=32|e;return t>=97&&t<=122}(n))&&(!!(r=e.src.slice(a).match(be))&&(t||e.push({type:\"htmltag\",content:e.src.slice(a,a+r[0].length),level:e.level}),e.pos+=r[0].length,!0))))}],[\"entity\",function(e,t){var n,r,a=e.pos,i=e.posMax;if(38!==e.src.charCodeAt(a))return!1;if(a+1<i)if(35===e.src.charCodeAt(a+1)){if(r=e.src.slice(a).match(_e))return t||(n=\"x\"===r[1][0].toLowerCase()?parseInt(r[1].slice(1),16):parseInt(r[1],10),e.pending+=l(n)?p(n):p(65533)),e.pos+=r[0].length,!0}else if(r=e.src.slice(a).match(we)){var s=o(r[1]);if(r[1]!==s)return t||(e.pending+=s),e.pos+=r[0].length,!0}return t||(e.pending+=\"&\"),e.pos++,!0}]];function Ee(){this.ruler=new C;for(var e=0;e<xe.length;e++)this.ruler.push(xe[e][0],xe[e][1]);this.validateLink=Se}function Se(e){var t=e.trim().toLowerCase();return-1===(t=m(t)).indexOf(\":\")||-1===[\"vbscript\",\"javascript\",\"file\",\"data\"].indexOf(t.split(\":\")[0])}Ee.prototype.skipToken=function(e){var t,n,r=this.ruler.getRules(\"\"),o=r.length,a=e.pos;if((n=e.cacheGet(a))>0)e.pos=n;else{for(t=0;t<o;t++)if(r[t](e,!0))return void e.cacheSet(a,e.pos);e.pos++,e.cacheSet(a,e.pos)}},Ee.prototype.tokenize=function(e){for(var t,n,r=this.ruler.getRules(\"\"),o=r.length,a=e.posMax;e.pos<a;){for(n=0;n<o&&!(t=r[n](e,!1));n++);if(t){if(e.pos>=a)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},Ee.prototype.parse=function(e,t,n,r){var o=new A(e,this,t,n,r);this.tokenize(o)};var Ce={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"replacements\",\"smartquotes\",\"references\",\"abbr2\",\"footnote_tail\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"footnote\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\",\"table\"]},inline:{rules:[\"autolink\",\"backticks\",\"del\",\"emphasis\",\"entity\",\"escape\",\"footnote_ref\",\"htmltag\",\"links\",\"newline\",\"text\"]}}},full:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"abbr2\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\"]},inline:{rules:[\"autolink\",\"backticks\",\"emphasis\",\"entity\",\"escape\",\"htmltag\",\"links\",\"newline\",\"text\"]}}}};function Ae(e,t,n){this.src=t,this.env=n,this.options=e.options,this.tokens=[],this.inlineMode=!1,this.inline=e.inline,this.block=e.block,this.renderer=e.renderer,this.typographer=e.typographer}function ke(e,t){\"string\"!=typeof e&&(t=e,e=\"default\"),t&&null!=t.linkify&&console.warn(\"linkify option is removed. Use linkify plugin instead:\\n\\nimport Remarkable from 'remarkable';\\nimport linkify from 'remarkable/linkify';\\nnew Remarkable().use(linkify)\\n\"),this.inline=new Ee,this.block=new te,this.core=new H,this.renderer=new S,this.ruler=new C,this.options={},this.configure(Ce[e]),this.set(t||{})}ke.prototype.set=function(e){s(this.options,e)},ke.prototype.configure=function(e){var t=this;if(!e)throw new Error(\"Wrong `remarkable` preset, check name/content\");e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach((function(n){e.components[n].rules&&t[n].ruler.enable(e.components[n].rules,!0)}))},ke.prototype.use=function(e,t){return e(this,t),this},ke.prototype.parse=function(e,t){var n=new Ae(this,e,t);return this.core.process(n),n.tokens},ke.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)},ke.prototype.parseInline=function(e,t){var n=new Ae(this,e,t);return n.inlineMode=!0,this.core.process(n),n.tokens},ke.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)}},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return ve}));var r=n(0),o=n.n(r),a=(n(11),n(220));function i(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1}function s(e,t){for(var n=e.length-1;n>=0;n--)!0===t(e[n])&&e.splice(n,1)}function u(e){throw new Error(\"Unhandled case for value: '\"+e+\"'\")}var c=function(){function e(e){void 0===e&&(e={}),this.tagName=\"\",this.attrs={},this.innerHTML=\"\",this.whitespaceRegex=/\\s+/,this.tagName=e.tagName||\"\",this.attrs=e.attrs||{},this.innerHTML=e.innerHtml||e.innerHTML||\"\"}return e.prototype.setTagName=function(e){return this.tagName=e,this},e.prototype.getTagName=function(){return this.tagName||\"\"},e.prototype.setAttr=function(e,t){return this.getAttrs()[e]=t,this},e.prototype.getAttr=function(e){return this.getAttrs()[e]},e.prototype.setAttrs=function(e){return Object.assign(this.getAttrs(),e),this},e.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},e.prototype.setClass=function(e){return this.setAttr(\"class\",e)},e.prototype.addClass=function(e){for(var t,n=this.getClass(),r=this.whitespaceRegex,o=n?n.split(r):[],a=e.split(r);t=a.shift();)-1===i(o,t)&&o.push(t);return this.getAttrs().class=o.join(\" \"),this},e.prototype.removeClass=function(e){for(var t,n=this.getClass(),r=this.whitespaceRegex,o=n?n.split(r):[],a=e.split(r);o.length&&(t=a.shift());){var s=i(o,t);-1!==s&&o.splice(s,1)}return this.getAttrs().class=o.join(\" \"),this},e.prototype.getClass=function(){return this.getAttrs().class||\"\"},e.prototype.hasClass=function(e){return-1!==(\" \"+this.getClass()+\" \").indexOf(\" \"+e+\" \")},e.prototype.setInnerHTML=function(e){return this.innerHTML=e,this},e.prototype.setInnerHtml=function(e){return this.setInnerHTML(e)},e.prototype.getInnerHTML=function(){return this.innerHTML||\"\"},e.prototype.getInnerHtml=function(){return this.getInnerHTML()},e.prototype.toAnchorString=function(){var e=this.getTagName(),t=this.buildAttrsStr();return[\"<\",e,t=t?\" \"+t:\"\",\">\",this.getInnerHtml(),\"</\",e,\">\"].join(\"\")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return\"\";var e=this.getAttrs(),t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n+'=\"'+e[n]+'\"');return t.join(\" \")},e}();var l=function(){function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this.className=\"\",this.newWindow=e.newWindow||!1,this.truncate=e.truncate||{},this.className=e.className||\"\"}return e.prototype.build=function(e){return new c({tagName:\"a\",attrs:this.createAttrs(e),innerHtml:this.processAnchorText(e.getAnchorText())})},e.prototype.createAttrs=function(e){var t={href:e.getAnchorHref()},n=this.createCssClass(e);return n&&(t.class=n),this.newWindow&&(t.target=\"_blank\",t.rel=\"noopener noreferrer\"),this.truncate&&this.truncate.length&&this.truncate.length<e.getAnchorText().length&&(t.title=e.getAnchorHref()),t},e.prototype.createCssClass=function(e){var t=this.className;if(t){for(var n=[t],r=e.getCssClassSuffixes(),o=0,a=r.length;o<a;o++)n.push(t+\"-\"+r[o]);return n.join(\" \")}return\"\"},e.prototype.processAnchorText=function(e){return e=this.doTruncate(e)},e.prototype.doTruncate=function(e){var t=this.truncate;if(!t||!t.length)return e;var n=t.length,r=t.location;return\"smart\"===r?function(e,t,n){var r,o;null==n?(n=\"&hellip;\",o=3,r=8):(o=n.length,r=n.length);var a=function(e){var t=\"\";return e.scheme&&e.host&&(t+=e.scheme+\"://\"),e.host&&(t+=e.host),e.path&&(t+=\"/\"+e.path),e.query&&(t+=\"?\"+e.query),e.fragment&&(t+=\"#\"+e.fragment),t},i=function(e,t){var r=t/2,o=Math.ceil(r),a=-1*Math.floor(r),i=\"\";return a<0&&(i=e.substr(a)),e.substr(0,o)+n+i};if(e.length<=t)return e;var s=t-o,u=function(e){var t={},n=e,r=n.match(/^([a-z]+):\\/\\//i);return r&&(t.scheme=r[1],n=n.substr(r[0].length)),(r=n.match(/^(.*?)(?=(\\?|#|\\/|$))/i))&&(t.host=r[1],n=n.substr(r[0].length)),(r=n.match(/^\\/(.*?)(?=(\\?|#|$))/i))&&(t.path=r[1],n=n.substr(r[0].length)),(r=n.match(/^\\?(.*?)(?=(#|$))/i))&&(t.query=r[1],n=n.substr(r[0].length)),(r=n.match(/^#(.*?)$/i))&&(t.fragment=r[1]),t}(e);if(u.query){var c=u.query.match(/^(.*?)(?=(\\?|\\#))(.*?)$/i);c&&(u.query=u.query.substr(0,c[1].length),e=a(u))}if(e.length<=t)return e;if(u.host&&(u.host=u.host.replace(/^www\\./,\"\"),e=a(u)),e.length<=t)return e;var l=\"\";if(u.host&&(l+=u.host),l.length>=s)return u.host.length==t?(u.host.substr(0,t-o)+n).substr(0,s+r):i(l,s).substr(0,s+r);var p=\"\";if(u.path&&(p+=\"/\"+u.path),u.query&&(p+=\"?\"+u.query),p){if((l+p).length>=s)return(l+p).length==t?(l+p).substr(0,t):(l+i(p,s-l.length)).substr(0,s+r);l+=p}if(u.fragment){var f=\"#\"+u.fragment;if((l+f).length>=s)return(l+f).length==t?(l+f).substr(0,t):(l+i(f,s-l.length)).substr(0,s+r);l+=f}if(u.scheme&&u.host){var h=u.scheme+\"://\";if((l+h).length<s)return(h+l).substr(0,t)}if(l.length<=t)return l;var d=\"\";return s>0&&(d=l.substr(-1*Math.floor(s/2))),(l.substr(0,Math.ceil(s/2))+n+d).substr(0,s+r)}(e,n):\"middle\"===r?function(e,t,n){if(e.length<=t)return e;var r,o;null==n?(n=\"&hellip;\",r=8,o=3):(r=n.length,o=n.length);var a=t-o,i=\"\";return a>0&&(i=e.substr(-1*Math.floor(a/2))),(e.substr(0,Math.ceil(a/2))+n+i).substr(0,a+r)}(e,n):function(e,t,n){return function(e,t,n){var r;return e.length>t&&(null==n?(n=\"&hellip;\",r=3):r=n.length,e=e.substring(0,t-r)+n),e}(e,t,n)}(e,n)},e}(),p=function(){function e(e){this.__jsduckDummyDocProp=null,this.matchedText=\"\",this.offset=0,this.tagBuilder=e.tagBuilder,this.matchedText=e.matchedText,this.offset=e.offset}return e.prototype.getMatchedText=function(){return this.matchedText},e.prototype.setOffset=function(e){this.offset=e},e.prototype.getOffset=function(){return this.offset},e.prototype.getCssClassSuffixes=function(){return[this.getType()]},e.prototype.buildTag=function(){return this.tagBuilder.build(this)},e}(),f=function(e,t){return(f=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function h(e,t){function n(){this.constructor=e}f(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var d=function(){return(d=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};var m,v=function(e){function t(t){var n=e.call(this,t)||this;return n.email=\"\",n.email=t.email,n}return h(t,e),t.prototype.getType=function(){return\"email\"},t.prototype.getEmail=function(){return this.email},t.prototype.getAnchorHref=function(){return\"mailto:\"+this.email},t.prototype.getAnchorText=function(){return this.email},t}(p),g=function(e){function t(t){var n=e.call(this,t)||this;return n.serviceName=\"\",n.hashtag=\"\",n.serviceName=t.serviceName,n.hashtag=t.hashtag,n}return h(t,e),t.prototype.getType=function(){return\"hashtag\"},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getHashtag=function(){return this.hashtag},t.prototype.getAnchorHref=function(){var e=this.serviceName,t=this.hashtag;switch(e){case\"twitter\":return\"https://twitter.com/hashtag/\"+t;case\"facebook\":return\"https://www.facebook.com/hashtag/\"+t;case\"instagram\":return\"https://instagram.com/explore/tags/\"+t;default:throw new Error(\"Unknown service name to point hashtag to: \"+e)}},t.prototype.getAnchorText=function(){return\"#\"+this.hashtag},t}(p),y=function(e){function t(t){var n=e.call(this,t)||this;return n.serviceName=\"twitter\",n.mention=\"\",n.mention=t.mention,n.serviceName=t.serviceName,n}return h(t,e),t.prototype.getType=function(){return\"mention\"},t.prototype.getMention=function(){return this.mention},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getAnchorHref=function(){switch(this.serviceName){case\"twitter\":return\"https://twitter.com/\"+this.mention;case\"instagram\":return\"https://instagram.com/\"+this.mention;case\"soundcloud\":return\"https://soundcloud.com/\"+this.mention;default:throw new Error(\"Unknown service name to point mention to: \"+this.serviceName)}},t.prototype.getAnchorText=function(){return\"@\"+this.mention},t.prototype.getCssClassSuffixes=function(){var t=e.prototype.getCssClassSuffixes.call(this),n=this.getServiceName();return n&&t.push(n),t},t}(p),b=function(e){function t(t){var n=e.call(this,t)||this;return n.number=\"\",n.plusSign=!1,n.number=t.number,n.plusSign=t.plusSign,n}return h(t,e),t.prototype.getType=function(){return\"phone\"},t.prototype.getPhoneNumber=function(){return this.number},t.prototype.getNumber=function(){return this.getPhoneNumber()},t.prototype.getAnchorHref=function(){return\"tel:\"+(this.plusSign?\"+\":\"\")+this.number},t.prototype.getAnchorText=function(){return this.matchedText},t}(p),_=function(e){function t(t){var n=e.call(this,t)||this;return n.url=\"\",n.urlMatchType=\"scheme\",n.protocolUrlMatch=!1,n.protocolRelativeMatch=!1,n.stripPrefix={scheme:!0,www:!0},n.stripTrailingSlash=!0,n.decodePercentEncoding=!0,n.schemePrefixRegex=/^(https?:\\/\\/)?/i,n.wwwPrefixRegex=/^(https?:\\/\\/)?(www\\.)?/i,n.protocolRelativeRegex=/^\\/\\//,n.protocolPrepended=!1,n.urlMatchType=t.urlMatchType,n.url=t.url,n.protocolUrlMatch=t.protocolUrlMatch,n.protocolRelativeMatch=t.protocolRelativeMatch,n.stripPrefix=t.stripPrefix,n.stripTrailingSlash=t.stripTrailingSlash,n.decodePercentEncoding=t.decodePercentEncoding,n}return h(t,e),t.prototype.getType=function(){return\"url\"},t.prototype.getUrlMatchType=function(){return this.urlMatchType},t.prototype.getUrl=function(){var e=this.url;return this.protocolRelativeMatch||this.protocolUrlMatch||this.protocolPrepended||(e=this.url=\"http://\"+e,this.protocolPrepended=!0),e},t.prototype.getAnchorHref=function(){return this.getUrl().replace(/&amp;/g,\"&\")},t.prototype.getAnchorText=function(){var e=this.getMatchedText();return this.protocolRelativeMatch&&(e=this.stripProtocolRelativePrefix(e)),this.stripPrefix.scheme&&(e=this.stripSchemePrefix(e)),this.stripPrefix.www&&(e=this.stripWwwPrefix(e)),this.stripTrailingSlash&&(e=this.removeTrailingSlash(e)),this.decodePercentEncoding&&(e=this.removePercentEncoding(e)),e},t.prototype.stripSchemePrefix=function(e){return e.replace(this.schemePrefixRegex,\"\")},t.prototype.stripWwwPrefix=function(e){return e.replace(this.wwwPrefixRegex,\"$1\")},t.prototype.stripProtocolRelativePrefix=function(e){return e.replace(this.protocolRelativeRegex,\"\")},t.prototype.removeTrailingSlash=function(e){return\"/\"===e.charAt(e.length-1)&&(e=e.slice(0,-1)),e},t.prototype.removePercentEncoding=function(e){var t=e.replace(/%22/gi,\"&quot;\").replace(/%26/gi,\"&amp;\").replace(/%27/gi,\"&#39;\").replace(/%3C/gi,\"&lt;\").replace(/%3E/gi,\"&gt;\");try{return decodeURIComponent(t)}catch(e){return t}},t}(p),w=function(e){this.__jsduckDummyDocProp=null,this.tagBuilder=e.tagBuilder},x=/[A-Za-z]/,E=/[\\d]/,S=/[\\D]/,C=/\\s/,A=/['\"]/,k=/[\\x00-\\x1F\\x7F]/,O=/A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC/.source,j=O+/\\u2700-\\u27bf\\udde6-\\uddff\\ud800-\\udbff\\udc00-\\udfff\\ufe0e\\ufe0f\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0\\ud83c\\udffb-\\udfff\\u200d\\u3299\\u3297\\u303d\\u3030\\u24c2\\ud83c\\udd70-\\udd71\\udd7e-\\udd7f\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01-\\ude02\\ude1a\\ude2f\\ude32-\\ude3a\\ude50-\\ude51\\u203c\\u2049\\u25aa-\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u00a9\\u00ae\\u2122\\u2139\\udc04\\u2600-\\u26FF\\u2b05\\u2b06\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u231a\\u231b\\u2328\\u23cf\\u23e9-\\u23f3\\u23f8-\\u23fa\\udccf\\u2935\\u2934\\u2190-\\u21ff/.source+/\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F/.source,T=/0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19/.source,I=j+T,P=j+T,N=\"(?:[\"+T+\"]{1,3}\\\\.){3}[\"+T+\"]{1,3}\",M=\"[\"+P+\"](?:[\"+P+\"\\\\-]{0,61}[\"+P+\"])?\",R=function(e){return\"(?=(\"+M+\"))\\\\\"+e},D=function(e){return\"(?:\"+R(e)+\"(?:\\\\.\"+R(e+1)+\"){0,126}|\"+N+\")\"},L=(new RegExp(\"[\"+P+\".\\\\-]*[\"+P+\"\\\\-]\"),new RegExp(\"[\"+P+\"]\")),B=/(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|vermögensberatung|xn--3oq18vl8pn36a|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|vermögensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|afamilycompany|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbb9fbpob|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|spreadbetting|travelchannel|wolterskluwer|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|rightathome|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--estv75g|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--kpu716f|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pbt977c|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|சிங்கப்பூர்|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nationwide|newholland|nextdirect|onyourside|properties|protection|prudential|realestate|republican|restaurant|schaeffler|swiftcover|tatamotors|technology|telefonica|university|vistaprint|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|fujixerox|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|honeywell|institute|insurance|kuokgroup|ladbrokes|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|scjohnson|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--tckwe|xn--vhquv|yodobashi|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|budapest|builders|business|capetown|catering|catholic|chrysler|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|esurance|etisalat|everbank|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|movistar|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|symantec|training|uconnect|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|السعودية|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|cartier|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|iselect|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lancome|lanxess|lasalle|latrobe|leclerc|liaison|limited|lincoln|markets|metlife|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|shriram|singles|staples|starhub|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|католик|اتصالات|الجزائر|العليان|پاکستان|كاثوليك|موبايلي|இந்தியா|abarth|abbott|abbvie|active|africa|agency|airbus|airtel|alipay|alsace|alstom|anquan|aramco|author|bayern|beauty|berlin|bharti|blanco|bostik|boston|broker|camera|career|caseih|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|mobily|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|piaget|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|warman|webcam|xihuan|yachts|yandex|zappos|москва|онлайн|ابوظبي|ارامكو|الاردن|المغرب|امارات|فلسطين|مليسيا|भारतम्|இலங்கை|ファッション|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|dodge|drive|dubai|earth|edeka|email|epost|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glade|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|intel|irish|iveco|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|lixil|loans|locus|lotte|lotto|lupin|macys|mango|media|miami|money|mopar|movie|nadex|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|zippo|ایران|بازار|بھارت|سودان|سورية|همراه|भारोत|संगठन|বাংলা|భారత్|ഭാരതം|嘉里大酒店|aarp|able|adac|aero|aigo|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|doha|duck|duns|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|raid|read|reit|rent|rest|rich|rmit|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scor|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|дети|сайт|بارت|بيتك|ڀارت|تونس|شبكة|عراق|عمان|موقع|भारत|ভারত|ভাৰত|ਭਾਰਤ|ભારત|ଭାରତ|ಭಾರತ|ලංකා|グーグル|クラウド|ポイント|大众汽车|组织机构|電訊盈科|香格里拉|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bnl|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceb|ceo|cfa|cfd|com|crs|csc|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jcp|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|off|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|qvc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|srl|srt|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|бел|ком|қаз|мкд|мон|орг|рус|срб|укр|հայ|קום|عرب|قطر|كوم|مصر|कॉम|नेट|คอม|ไทย|ストア|セール|みんな|中文网|天主教|我爱你|新加坡|淡马锡|诺基亚|飞利浦|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|ελ|бг|ею|рф|გე|닷넷|닷컴|삼성|한국|コム|世界|中信|中国|中國|企业|佛山|信息|健康|八卦|公司|公益|台湾|台灣|商城|商店|商标|嘉里|在线|大拿|娱乐|家電|工行|广东|微博|慈善|手机|手表|招聘|政务|政府|新闻|时尚|書籍|机构|游戏|澳門|点看|珠宝|移动|网址|网店|网站|网络|联通|谷歌|购物|通販|集团|食品|餐厅|香港)/,F=new RegExp(\"[\"+P+\"!#$%&'*+/=?^_`{|}~-]\"),U=new RegExp(\"^\"+B.source+\"$\"),q=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.localPartCharRegex=F,t.strictTldRegex=U,t}return h(t,e),t.prototype.parseMatches=function(e){for(var t=this.tagBuilder,n=this.localPartCharRegex,r=this.strictTldRegex,o=[],a=e.length,i=new z,s={m:\"a\",a:\"i\",i:\"l\",l:\"t\",t:\"o\",o:\":\"},c=0,l=0,p=i;c<a;){var f=e.charAt(c);switch(l){case 0:h(f);break;case 1:m(e.charAt(c-1),f);break;case 2:g(f);break;case 3:y(f);break;case 4:b(f);break;case 5:_(f);break;case 6:w(f);break;case 7:x(f);break;default:u(l)}c++}return C(),o;function h(e){\"m\"===e?E(1):n.test(e)&&E()}function m(e,t){\":\"===e?n.test(t)?(l=2,p=new z(d({},p,{hasMailtoPrefix:!0}))):S():s[e]===t||(n.test(t)?l=2:\".\"===t?l=3:\"@\"===t?l=4:S())}function g(e){\".\"===e?l=3:\"@\"===e?l=4:n.test(e)||S()}function y(e){\".\"===e||\"@\"===e?S():n.test(e)?l=2:S()}function b(e){L.test(e)?l=5:S()}function _(e){\".\"===e?l=7:\"-\"===e?l=6:L.test(e)||C()}function w(e){\"-\"===e||\".\"===e?C():L.test(e)?l=5:C()}function x(e){\".\"===e||\"-\"===e?C():L.test(e)?(l=5,p=new z(d({},p,{hasDomainDot:!0}))):C()}function E(e){void 0===e&&(e=2),l=e,p=new z({idx:c})}function S(){l=0,p=i}function C(){if(p.hasDomainDot){var n=e.slice(p.idx,c);/[-.]$/.test(n)&&(n=n.slice(0,-1));var a=p.hasMailtoPrefix?n.slice(\"mailto:\".length):n;(function(e){var t=(e.split(\".\").pop()||\"\").toLowerCase();return r.test(t)})(a)&&o.push(new v({tagBuilder:t,matchedText:n,offset:p.idx,email:a}))}S()}},t}(w),z=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.hasMailtoPrefix=!!e.hasMailtoPrefix,this.hasDomainDot=!!e.hasDomainDot},V=function(){function e(){}return e.isValid=function(e,t){return!(t&&!this.isValidUriScheme(t)||this.urlMatchDoesNotHaveProtocolOrDot(e,t)||this.urlMatchDoesNotHaveAtLeastOneWordChar(e,t)&&!this.isValidIpAddress(e)||this.containsMultipleDots(e))},e.isValidIpAddress=function(e){var t=new RegExp(this.hasFullProtocolRegex.source+this.ipRegex.source);return null!==e.match(t)},e.containsMultipleDots=function(e){var t=e;return this.hasFullProtocolRegex.test(e)&&(t=e.split(\"://\")[1]),t.split(\"/\")[0].indexOf(\"..\")>-1},e.isValidUriScheme=function(e){var t=e.match(this.uriSchemeRegex),n=t&&t[0].toLowerCase();return\"javascript:\"!==n&&\"vbscript:\"!==n},e.urlMatchDoesNotHaveProtocolOrDot=function(e,t){return!(!e||t&&this.hasFullProtocolRegex.test(t)||-1!==e.indexOf(\".\"))},e.urlMatchDoesNotHaveAtLeastOneWordChar=function(e,t){return!(!e||!t)&&(!this.hasFullProtocolRegex.test(t)&&!this.hasWordCharAfterProtocolRegex.test(e))},e.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\\/\\//,e.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,e.hasWordCharAfterProtocolRegex=new RegExp(\":[^\\\\s]*?[\"+O+\"]\"),e.ipRegex=/[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?(:[0-9]*)?\\/?$/,e}(),W=(m=new RegExp(\"[/?#](?:[\"+P+\"\\\\-+&@#/%=~_()|'$*\\\\[\\\\]{}?!:,.;^✓]*[\"+P+\"\\\\-+&@#/%=~_()|'$*\\\\[\\\\]{}✓])?\"),new RegExp([\"(?:\",\"(\",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\\/\\/)(?!\\d+\\/?)(?:\\/\\/)?)/.source,D(2),\")\",\"|\",\"(\",\"(//)?\",/(?:www\\.)/.source,D(6),\")\",\"|\",\"(\",\"(//)?\",D(10)+\"\\\\.\",B.source,\"(?![-\"+I+\"])\",\")\",\")\",\"(?::[0-9]+)?\",\"(?:\"+m.source+\")?\"].join(\"\"),\"gi\")),H=new RegExp(\"[\"+P+\"]\"),$=function(e){function t(t){var n=e.call(this,t)||this;return n.stripPrefix={scheme:!0,www:!0},n.stripTrailingSlash=!0,n.decodePercentEncoding=!0,n.matcherRegex=W,n.wordCharRegExp=H,n.stripPrefix=t.stripPrefix,n.stripTrailingSlash=t.stripTrailingSlash,n.decodePercentEncoding=t.decodePercentEncoding,n}return h(t,e),t.prototype.parseMatches=function(e){for(var t,n=this.matcherRegex,r=this.stripPrefix,o=this.stripTrailingSlash,a=this.decodePercentEncoding,i=this.tagBuilder,s=[],u=function(){var n=t[0],u=t[1],l=t[4],p=t[5],f=t[9],h=t.index,d=p||f,m=e.charAt(h-1);if(!V.isValid(n,u))return\"continue\";if(h>0&&\"@\"===m)return\"continue\";if(h>0&&d&&c.wordCharRegExp.test(m))return\"continue\";if(/\\?$/.test(n)&&(n=n.substr(0,n.length-1)),c.matchHasUnbalancedClosingParen(n))n=n.substr(0,n.length-1);else{var v=c.matchHasInvalidCharAfterTld(n,u);v>-1&&(n=n.substr(0,v))}var g=[\"http://\",\"https://\"].find((function(e){return!!u&&-1!==u.indexOf(e)}));if(g){var y=n.indexOf(g);n=n.substr(y),u=u.substr(y),h+=y}var b=u?\"scheme\":l?\"www\":\"tld\",w=!!u;s.push(new _({tagBuilder:i,matchedText:n,offset:h,urlMatchType:b,url:n,protocolUrlMatch:w,protocolRelativeMatch:!!d,stripPrefix:r,stripTrailingSlash:o,decodePercentEncoding:a}))},c=this;null!==(t=n.exec(e));)u();return s},t.prototype.matchHasUnbalancedClosingParen=function(e){var t,n=e.charAt(e.length-1);if(\")\"===n)t=\"(\";else if(\"]\"===n)t=\"[\";else{if(\"}\"!==n)return!1;t=\"{\"}for(var r=0,o=0,a=e.length-1;o<a;o++){var i=e.charAt(o);i===t?r++:i===n&&(r=Math.max(r-1,0))}return 0===r},t.prototype.matchHasInvalidCharAfterTld=function(e,t){if(!e)return-1;var n=0;t&&(n=e.indexOf(\":\"),e=e.slice(n));var r=new RegExp(\"^((.?//)?[-.\"+P+\"]*[-\"+P+\"]\\\\.[-\"+P+\"]+)\").exec(e);return null===r?-1:(n+=r[1].length,e=e.slice(r[1].length),/^[^-.A-Za-z0-9:\\/?#]/.test(e)?n:-1)},t}(w),J=new RegExp(\"#[_\"+P+\"]{1,139}(?![_\"+P+\"])\",\"g\"),K=new RegExp(\"[^\"+P+\"]\"),Y=function(e){function t(t){var n=e.call(this,t)||this;return n.serviceName=\"twitter\",n.matcherRegex=J,n.nonWordCharRegex=K,n.serviceName=t.serviceName,n}return h(t,e),t.prototype.parseMatches=function(e){for(var t,n=this.matcherRegex,r=this.nonWordCharRegex,o=this.serviceName,a=this.tagBuilder,i=[];null!==(t=n.exec(e));){var s=t.index,u=e.charAt(s-1);if(0===s||r.test(u)){var c=t[0],l=t[0].slice(1);i.push(new g({tagBuilder:a,matchedText:c,offset:s,serviceName:o,hashtag:l}))}}return i},t}(w),G=/(?:(?:(?:(\\+)?\\d{1,3}[-\\040.]?)?\\(?\\d{3}\\)?[-\\040.]?\\d{3}[-\\040.]?\\d{4})|(?:(\\+)(?:9[976]\\d|8[987530]\\d|6[987]\\d|5[90]\\d|42\\d|3[875]\\d|2[98654321]\\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\\040.]?(?:\\d[-\\040.]?){6,12}\\d+))([,;]+[0-9]+#?)*/g,Z=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.matcherRegex=G,t}return h(t,e),t.prototype.parseMatches=function(e){for(var t,n=this.matcherRegex,r=this.tagBuilder,o=[];null!==(t=n.exec(e));){var a=t[0],i=a.replace(/[^0-9,;#]/g,\"\"),s=!(!t[1]&&!t[2]),u=0==t.index?\"\":e.substr(t.index-1,1),c=e.substr(t.index+a.length,1),l=!u.match(/\\d/)&&!c.match(/\\d/);this.testMatch(t[3])&&this.testMatch(a)&&l&&o.push(new b({tagBuilder:r,matchedText:a,offset:t.index,number:i,plusSign:s}))}return o},t.prototype.testMatch=function(e){return S.test(e)},t}(w),X=new RegExp(\"@[_\"+P+\"]{1,50}(?![_\"+P+\"])\",\"g\"),Q=new RegExp(\"@[_.\"+P+\"]{1,30}(?![_\"+P+\"])\",\"g\"),ee=new RegExp(\"@[-_.\"+P+\"]{1,50}(?![-_\"+P+\"])\",\"g\"),te=new RegExp(\"[^\"+P+\"]\"),ne=function(e){function t(t){var n=e.call(this,t)||this;return n.serviceName=\"twitter\",n.matcherRegexes={twitter:X,instagram:Q,soundcloud:ee},n.nonWordCharRegex=te,n.serviceName=t.serviceName,n}return h(t,e),t.prototype.parseMatches=function(e){var t,n=this.serviceName,r=this.matcherRegexes[this.serviceName],o=this.nonWordCharRegex,a=this.tagBuilder,i=[];if(!r)return i;for(;null!==(t=r.exec(e));){var s=t.index,u=e.charAt(s-1);if(0===s||o.test(u)){var c=t[0].replace(/\\.+$/g,\"\"),l=c.slice(1);i.push(new y({tagBuilder:a,matchedText:c,offset:s,serviceName:n,mention:l}))}}return i},t}(w);function re(e,t){for(var n,r=t.onOpenTag,o=t.onCloseTag,a=t.onText,i=t.onComment,s=t.onDoctype,c=new oe,l=0,p=e.length,f=0,h=0,m=c;l<p;){var v=e.charAt(l);switch(f){case 0:g(v);break;case 1:y(v);break;case 2:_(v);break;case 3:b(v);break;case 4:w(v);break;case 5:S(v);break;case 6:O(v);break;case 7:j(v);break;case 8:T(v);break;case 9:I(v);break;case 10:P(v);break;case 11:N(v);break;case 12:M(v);break;case 13:R(v);break;case 14:D(v);break;case 15:L(v);break;case 16:B(v);break;case 17:F(v);break;case 18:U(v);break;case 19:q(v);break;case 20:z(v);break;default:u(f)}l++}function g(e){\"<\"===e&&W()}function y(e){\"!\"===e?f=13:\"/\"===e?(f=2,m=new oe(d({},m,{isClosing:!0}))):\"<\"===e?W():x.test(e)?(f=3,m=new oe(d({},m,{isOpening:!0}))):(f=0,m=c)}function b(e){C.test(e)?(m=new oe(d({},m,{name:$()})),f=4):\"<\"===e?W():\"/\"===e?(m=new oe(d({},m,{name:$()})),f=12):\">\"===e?(m=new oe(d({},m,{name:$()})),H()):x.test(e)||E.test(e)||\":\"===e||V()}function _(e){\">\"===e?V():x.test(e)?f=3:V()}function w(e){C.test(e)||(\"/\"===e?f=12:\">\"===e?H():\"<\"===e?W():\"=\"===e||A.test(e)||k.test(e)?V():f=5)}function S(e){C.test(e)?f=6:\"/\"===e?f=12:\"=\"===e?f=7:\">\"===e?H():\"<\"===e?W():A.test(e)&&V()}function O(e){C.test(e)||(\"/\"===e?f=12:\"=\"===e?f=7:\">\"===e?H():\"<\"===e?W():A.test(e)?V():f=5)}function j(e){C.test(e)||('\"'===e?f=8:\"'\"===e?f=9:/[>=`]/.test(e)?V():\"<\"===e?W():f=10)}function T(e){'\"'===e&&(f=11)}function I(e){\"'\"===e&&(f=11)}function P(e){C.test(e)?f=4:\">\"===e?H():\"<\"===e&&W()}function N(e){C.test(e)?f=4:\"/\"===e?f=12:\">\"===e?H():\"<\"===e?W():(f=4,l--)}function M(e){\">\"===e?(m=new oe(d({},m,{isClosing:!0})),H()):f=4}function R(t){\"--\"===e.substr(l,2)?(l+=2,m=new oe(d({},m,{type:\"comment\"})),f=14):\"DOCTYPE\"===e.substr(l,7).toUpperCase()?(l+=7,m=new oe(d({},m,{type:\"doctype\"})),f=20):V()}function D(e){\"-\"===e?f=15:\">\"===e?V():f=16}function L(e){\"-\"===e?f=18:\">\"===e?V():f=16}function B(e){\"-\"===e&&(f=17)}function F(e){f=\"-\"===e?18:16}function U(e){\">\"===e?H():\"!\"===e?f=19:\"-\"===e||(f=16)}function q(e){\"-\"===e?f=17:\">\"===e?H():f=16}function z(e){\">\"===e?H():\"<\"===e&&W()}function V(){f=0,m=c}function W(){f=1,m=new oe({idx:l})}function H(){var t=e.slice(h,m.idx);t&&a(t,h),\"comment\"===m.type?i(m.idx):\"doctype\"===m.type?s(m.idx):(m.isOpening&&r(m.name,m.idx),m.isClosing&&o(m.name,m.idx)),V(),h=l+1}function $(){var t=m.idx+(m.isClosing?2:1);return e.slice(t,l).toLowerCase()}h<l&&(n=e.slice(h,l),a(n,h),h=l+1)}var oe=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.type=e.type||\"tag\",this.name=e.name||\"\",this.isOpening=!!e.isOpening,this.isClosing=!!e.isClosing},ae=function(){function e(t){void 0===t&&(t={}),this.version=e.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:\"end\"},this.className=\"\",this.replaceFn=null,this.context=void 0,this.sanitizeHtml=!1,this.matchers=null,this.tagBuilder=null,this.urls=this.normalizeUrlsCfg(t.urls),this.email=\"boolean\"==typeof t.email?t.email:this.email,this.phone=\"boolean\"==typeof t.phone?t.phone:this.phone,this.hashtag=t.hashtag||this.hashtag,this.mention=t.mention||this.mention,this.newWindow=\"boolean\"==typeof t.newWindow?t.newWindow:this.newWindow,this.stripPrefix=this.normalizeStripPrefixCfg(t.stripPrefix),this.stripTrailingSlash=\"boolean\"==typeof t.stripTrailingSlash?t.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding=\"boolean\"==typeof t.decodePercentEncoding?t.decodePercentEncoding:this.decodePercentEncoding,this.sanitizeHtml=t.sanitizeHtml||!1;var n=this.mention;if(!1!==n&&\"twitter\"!==n&&\"instagram\"!==n&&\"soundcloud\"!==n)throw new Error(\"invalid `mention` cfg - see docs\");var r=this.hashtag;if(!1!==r&&\"twitter\"!==r&&\"facebook\"!==r&&\"instagram\"!==r)throw new Error(\"invalid `hashtag` cfg - see docs\");this.truncate=this.normalizeTruncateCfg(t.truncate),this.className=t.className||this.className,this.replaceFn=t.replaceFn||this.replaceFn,this.context=t.context||this}return e.link=function(t,n){return new e(n).link(t)},e.parse=function(t,n){return new e(n).parse(t)},e.prototype.normalizeUrlsCfg=function(e){return null==e&&(e=!0),\"boolean\"==typeof e?{schemeMatches:e,wwwMatches:e,tldMatches:e}:{schemeMatches:\"boolean\"!=typeof e.schemeMatches||e.schemeMatches,wwwMatches:\"boolean\"!=typeof e.wwwMatches||e.wwwMatches,tldMatches:\"boolean\"!=typeof e.tldMatches||e.tldMatches}},e.prototype.normalizeStripPrefixCfg=function(e){return null==e&&(e=!0),\"boolean\"==typeof e?{scheme:e,www:e}:{scheme:\"boolean\"!=typeof e.scheme||e.scheme,www:\"boolean\"!=typeof e.www||e.www}},e.prototype.normalizeTruncateCfg=function(e){return\"number\"==typeof e?{length:e,location:\"end\"}:function(e,t){for(var n in t)t.hasOwnProperty(n)&&void 0===e[n]&&(e[n]=t[n]);return e}(e||{},{length:Number.POSITIVE_INFINITY,location:\"end\"})},e.prototype.parse=function(e){var t=this,n=[\"a\",\"style\",\"script\"],r=0,o=[];return re(e,{onOpenTag:function(e){n.indexOf(e)>=0&&r++},onText:function(e,n){if(0===r){var a=function(e,t){if(!t.global)throw new Error(\"`splitRegex` must have the 'g' flag set\");for(var n,r=[],o=0;n=t.exec(e);)r.push(e.substring(o,n.index)),r.push(n[0]),o=n.index+n[0].length;return r.push(e.substring(o)),r}(e,/(&nbsp;|&#160;|&lt;|&#60;|&gt;|&#62;|&quot;|&#34;|&#39;)/gi),i=n;a.forEach((function(e,n){if(n%2==0){var r=t.parseText(e,i);o.push.apply(o,r)}i+=e.length}))}},onCloseTag:function(e){n.indexOf(e)>=0&&(r=Math.max(r-1,0))},onComment:function(e){},onDoctype:function(e){}}),o=this.compactMatches(o),o=this.removeUnwantedMatches(o)},e.prototype.compactMatches=function(e){e.sort((function(e,t){return e.getOffset()-t.getOffset()}));for(var t=0;t<e.length-1;t++){var n=e[t],r=n.getOffset(),o=n.getMatchedText().length,a=r+o;if(t+1<e.length){if(e[t+1].getOffset()===r){var i=e[t+1].getMatchedText().length>o?t:t+1;e.splice(i,1);continue}e[t+1].getOffset()<a&&e.splice(t+1,1)}}return e},e.prototype.removeUnwantedMatches=function(e){return this.hashtag||s(e,(function(e){return\"hashtag\"===e.getType()})),this.email||s(e,(function(e){return\"email\"===e.getType()})),this.phone||s(e,(function(e){return\"phone\"===e.getType()})),this.mention||s(e,(function(e){return\"mention\"===e.getType()})),this.urls.schemeMatches||s(e,(function(e){return\"url\"===e.getType()&&\"scheme\"===e.getUrlMatchType()})),this.urls.wwwMatches||s(e,(function(e){return\"url\"===e.getType()&&\"www\"===e.getUrlMatchType()})),this.urls.tldMatches||s(e,(function(e){return\"url\"===e.getType()&&\"tld\"===e.getUrlMatchType()})),e},e.prototype.parseText=function(e,t){void 0===t&&(t=0),t=t||0;for(var n=this.getMatchers(),r=[],o=0,a=n.length;o<a;o++){for(var i=n[o].parseMatches(e),s=0,u=i.length;s<u;s++)i[s].setOffset(t+i[s].getOffset());r.push.apply(r,i)}return r},e.prototype.link=function(e){if(!e)return\"\";this.sanitizeHtml&&(e=e.replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\"));for(var t=this.parse(e),n=[],r=0,o=0,a=t.length;o<a;o++){var i=t[o];n.push(e.substring(r,i.getOffset())),n.push(this.createMatchReturnVal(i)),r=i.getOffset()+i.getMatchedText().length}return n.push(e.substring(r)),n.join(\"\")},e.prototype.createMatchReturnVal=function(e){var t;return this.replaceFn&&(t=this.replaceFn.call(this.context,e)),\"string\"==typeof t?t:!1===t?e.getMatchedText():t instanceof c?t.toAnchorString():e.buildTag().toAnchorString()},e.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var e=this.getTagBuilder(),t=[new Y({tagBuilder:e,serviceName:this.hashtag}),new q({tagBuilder:e}),new Z({tagBuilder:e}),new ne({tagBuilder:e,serviceName:this.mention}),new $({tagBuilder:e,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=t},e.prototype.getTagBuilder=function(){var e=this.tagBuilder;return e||(e=this.tagBuilder=new l({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),e},e.version=\"3.14.1\",e.AnchorTagBuilder=l,e.HtmlTag=c,e.matcher={Email:q,Hashtag:Y,Matcher:w,Mention:ne,Phone:Z,Url:$},e.match={Email:v,Hashtag:g,Match:p,Mention:y,Phone:b,Url:_},e}(),ie=/www|@|\\:\\/\\//;function se(e){return/^<\\/a\\s*>/i.test(e)}function ue(){var e=[],t=new ae({stripPrefix:!1,url:!0,email:!0,replaceFn:function(t){switch(t.getType()){case\"url\":e.push({text:t.matchedText,url:t.getUrl()});break;case\"email\":e.push({text:t.matchedText,url:\"mailto:\"+t.getEmail().replace(/^mailto:/i,\"\")})}return!1}});return{links:e,autolinker:t}}function ce(e){var t,n,r,o,a,i,s,u,c,l,p,f,h,d,m=e.tokens,v=null;for(n=0,r=m.length;n<r;n++)if(\"inline\"===m[n].type)for(p=0,t=(o=m[n].children).length-1;t>=0;t--)if(\"link_close\"!==(a=o[t]).type){if(\"htmltag\"===a.type&&(d=a.content,/^<a[>\\s]/i.test(d)&&p>0&&p--,se(a.content)&&p++),!(p>0)&&\"text\"===a.type&&ie.test(a.content)){if(v||(f=(v=ue()).links,h=v.autolinker),i=a.content,f.length=0,h.link(i),!f.length)continue;for(s=[],l=a.level,u=0;u<f.length;u++)e.inline.validateLink(f[u].url)&&((c=i.indexOf(f[u].text))&&s.push({type:\"text\",content:i.slice(0,c),level:l}),s.push({type:\"link_open\",href:f[u].url,title:\"\",level:l++}),s.push({type:\"text\",content:f[u].text,level:l}),s.push({type:\"link_close\",level:--l}),i=i.slice(c+f[u].text.length));i.length&&s.push({type:\"text\",content:i,level:l}),m[n].children=o=[].concat(o.slice(0,t),s,o.slice(t+1))}}else for(t--;o[t].level!==a.level&&\"link_open\"!==o[t].type;)t--}function le(e){e.core.ruler.push(\"linkify\",ce)}var pe=n(224),fe=n.n(pe),he=n(63),de=n.n(he);function me(e){var t=e.source,n=e.className,r=void 0===n?\"\":n,i=e.getConfigs;if(\"string\"!=typeof t)return null;var s=new a.a({html:!0,typographer:!0,breaks:!0,linkTarget:\"_blank\"}).use(le);s.core.ruler.disable([\"replacements\",\"smartquotes\"]);var u=i().useUnsafeMarkdown,c=s.render(t),l=ve(c,{useUnsafeMarkdown:u});return t&&c&&l?o.a.createElement(\"div\",{className:de()(r,\"markdown\"),dangerouslySetInnerHTML:{__html:l}}):null}fe.a.addHook&&fe.a.addHook(\"beforeSanitizeElements\",(function(e){return e.href&&e.setAttribute(\"rel\",\"noopener noreferrer\"),e})),me.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}};t.a=me;function ve(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.useUnsafeMarkdown,r=void 0!==n&&n,o=r,a=r?[]:[\"style\",\"class\"];return r&&!ve.hasWarnedAboutDeprecation&&(console.warn(\"useUnsafeMarkdown display configuration parameter is deprecated since >3.26.0 and will be removed in v4.0.0.\"),ve.hasWarnedAboutDeprecation=!0),fe.a.sanitize(e,{ADD_ATTR:[\"target\"],FORBID_TAGS:[\"style\",\"form\"],ALLOW_DATA_ATTR:o,FORBID_ATTR:a})}ve.hasWarnedAboutDeprecation=!1},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return R}));var r=n(28),o=n.n(r),a=n(6),i=n.n(a),s=n(7),u=n.n(s),c=n(10),l=n.n(c),p=n(8),f=n.n(p),h=n(9),d=n.n(h),m=n(3),v=n.n(m),g=n(2),y=n.n(g),b=n(17),_=n.n(b),w=n(4),x=n.n(w),E=n(0),S=n.n(E),C=n(1),A=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},k=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();function O(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function j(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}var T=function(e){function t(){return O(this,t),j(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),k(t,[{key:\"shouldComponentUpdate\",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=this.state||{};return!(this.updateOnProps||Object.keys(A({},e,this.props))).every((function(n){return Object(C.is)(e[n],t.props[n])}))||!(this.updateOnStates||Object.keys(A({},n,r))).every((function(e){return Object(C.is)(n[e],r[e])}))}}]),t}(S.a.Component),I=n(27),P=n.n(I),N=n(11),M=n.n(N),R=function(e){f()(r,e);var t=d()(r);function r(){var e,n;i()(this,r);for(var o=arguments.length,a=new Array(o),s=0;s<o;s++)a[s]=arguments[s];return n=t.call.apply(t,y()(e=[this]).call(e,a)),v()(l()(n),\"getModelName\",(function(e){return-1!==_()(e).call(e,\"#/definitions/\")?e.replace(/^.*#\\/definitions\\//,\"\"):-1!==_()(e).call(e,\"#/components/schemas/\")?e.replace(/^.*#\\/components\\/schemas\\//,\"\"):void 0})),v()(l()(n),\"getRefSchema\",(function(e){return n.props.specSelectors.findDefinition(e)})),n}return u()(r,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,r=e.getConfigs,a=e.specSelectors,i=e.schema,s=e.required,u=e.name,c=e.isRef,l=e.specPath,p=e.displayName,f=e.includeReadOnly,h=e.includeWriteOnly,d=t(\"ObjectModel\"),m=t(\"ArrayModel\"),v=t(\"PrimitiveModel\"),g=\"object\",y=i&&i.get(\"$$ref\");if(!u&&y&&(u=this.getModelName(y)),!i&&y&&(i=this.getRefSchema(u)),!i)return S.a.createElement(\"span\",{className:\"model model-title\"},S.a.createElement(\"span\",{className:\"model-title__text\"},p||u),S.a.createElement(\"img\",{src:n(506),height:\"20px\",width:\"20px\"}));var b=a.isOAS3()&&i.get(\"deprecated\");switch(c=void 0!==c?c:!!y,g=i&&i.get(\"type\")||g){case\"object\":return S.a.createElement(d,o()({className:\"object\"},this.props,{specPath:l,getConfigs:r,schema:i,name:u,deprecated:b,isRef:c,includeReadOnly:f,includeWriteOnly:h}));case\"array\":return S.a.createElement(m,o()({className:\"array\"},this.props,{getConfigs:r,schema:i,name:u,deprecated:b,required:s,includeReadOnly:f,includeWriteOnly:h}));case\"string\":case\"number\":case\"integer\":case\"boolean\":default:return S.a.createElement(v,o()({},this.props,{getComponent:t,getConfigs:r,schema:i,name:u,deprecated:b,required:s}))}}}]),r}(T);v()(R,\"propTypes\",{schema:x()(P.a).isRequired,getComponent:M.a.func.isRequired,getConfigs:M.a.func.isRequired,specSelectors:M.a.object.isRequired,name:M.a.string,displayName:M.a.string,isRef:M.a.bool,required:M.a.bool,expandDepth:M.a.number,depth:M.a.number,specPath:P.a.list.isRequired,includeReadOnly:M.a.bool,includeWriteOnly:M.a.bool})},function(e,t,n){\"use strict\";var r=n(1053),o=n(1063),a=n(283);e.exports={formats:a,parse:o,stringify:r}},function(e,t,n){e.exports=function(){\"use strict\";function e(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var t=Object.hasOwnProperty,n=Object.setPrototypeOf,r=Object.isFrozen,o=Object.getPrototypeOf,a=Object.getOwnPropertyDescriptor,i=Object.freeze,s=Object.seal,u=Object.create,c=\"undefined\"!=typeof Reflect&&Reflect,l=c.apply,p=c.construct;l||(l=function(e,t,n){return e.apply(t,n)}),i||(i=function(e){return e}),s||(s=function(e){return e}),p||(p=function(t,n){return new(Function.prototype.bind.apply(t,[null].concat(e(n))))});var f=x(Array.prototype.forEach),h=x(Array.prototype.pop),d=x(Array.prototype.push),m=x(String.prototype.toLowerCase),v=x(String.prototype.match),g=x(String.prototype.replace),y=x(String.prototype.indexOf),b=x(String.prototype.trim),_=x(RegExp.prototype.test),w=E(TypeError);function x(e){return function(t){for(var n=arguments.length,r=Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return l(e,t,r)}}function E(e){return function(){for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];return p(e,n)}}function S(e,t){n&&n(e,null);for(var o=t.length;o--;){var a=t[o];if(\"string\"==typeof a){var i=m(a);i!==a&&(r(t)||(t[o]=i),a=i)}e[a]=!0}return e}function C(e){var n=u(null),r=void 0;for(r in e)l(t,e,[r])&&(n[r]=e[r]);return n}function A(e,t){for(;null!==e;){var n=a(e,t);if(n){if(n.get)return x(n.get);if(\"function\"==typeof n.value)return x(n.value)}e=o(e)}function r(e){return console.warn(\"fallback value for\",e),null}return r}var k=i([\"a\",\"abbr\",\"acronym\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"bdi\",\"bdo\",\"big\",\"blink\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"center\",\"cite\",\"code\",\"col\",\"colgroup\",\"content\",\"data\",\"datalist\",\"dd\",\"decorator\",\"del\",\"details\",\"dfn\",\"dialog\",\"dir\",\"div\",\"dl\",\"dt\",\"element\",\"em\",\"fieldset\",\"figcaption\",\"figure\",\"font\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"img\",\"input\",\"ins\",\"kbd\",\"label\",\"legend\",\"li\",\"main\",\"map\",\"mark\",\"marquee\",\"menu\",\"menuitem\",\"meter\",\"nav\",\"nobr\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"picture\",\"pre\",\"progress\",\"q\",\"rp\",\"rt\",\"ruby\",\"s\",\"samp\",\"section\",\"select\",\"shadow\",\"small\",\"source\",\"spacer\",\"span\",\"strike\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"tr\",\"track\",\"tt\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"]),O=i([\"svg\",\"a\",\"altglyph\",\"altglyphdef\",\"altglyphitem\",\"animatecolor\",\"animatemotion\",\"animatetransform\",\"circle\",\"clippath\",\"defs\",\"desc\",\"ellipse\",\"filter\",\"font\",\"g\",\"glyph\",\"glyphref\",\"hkern\",\"image\",\"line\",\"lineargradient\",\"marker\",\"mask\",\"metadata\",\"mpath\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialgradient\",\"rect\",\"stop\",\"style\",\"switch\",\"symbol\",\"text\",\"textpath\",\"title\",\"tref\",\"tspan\",\"view\",\"vkern\"]),j=i([\"feBlend\",\"feColorMatrix\",\"feComponentTransfer\",\"feComposite\",\"feConvolveMatrix\",\"feDiffuseLighting\",\"feDisplacementMap\",\"feDistantLight\",\"feFlood\",\"feFuncA\",\"feFuncB\",\"feFuncG\",\"feFuncR\",\"feGaussianBlur\",\"feMerge\",\"feMergeNode\",\"feMorphology\",\"feOffset\",\"fePointLight\",\"feSpecularLighting\",\"feSpotLight\",\"feTile\",\"feTurbulence\"]),T=i([\"animate\",\"color-profile\",\"cursor\",\"discard\",\"fedropshadow\",\"feimage\",\"font-face\",\"font-face-format\",\"font-face-name\",\"font-face-src\",\"font-face-uri\",\"foreignobject\",\"hatch\",\"hatchpath\",\"mesh\",\"meshgradient\",\"meshpatch\",\"meshrow\",\"missing-glyph\",\"script\",\"set\",\"solidcolor\",\"unknown\",\"use\"]),I=i([\"math\",\"menclose\",\"merror\",\"mfenced\",\"mfrac\",\"mglyph\",\"mi\",\"mlabeledtr\",\"mmultiscripts\",\"mn\",\"mo\",\"mover\",\"mpadded\",\"mphantom\",\"mroot\",\"mrow\",\"ms\",\"mspace\",\"msqrt\",\"mstyle\",\"msub\",\"msup\",\"msubsup\",\"mtable\",\"mtd\",\"mtext\",\"mtr\",\"munder\",\"munderover\"]),P=i([\"maction\",\"maligngroup\",\"malignmark\",\"mlongdiv\",\"mscarries\",\"mscarry\",\"msgroup\",\"mstack\",\"msline\",\"msrow\",\"semantics\",\"annotation\",\"annotation-xml\",\"mprescripts\",\"none\"]),N=i([\"#text\"]),M=i([\"accept\",\"action\",\"align\",\"alt\",\"autocapitalize\",\"autocomplete\",\"autopictureinpicture\",\"autoplay\",\"background\",\"bgcolor\",\"border\",\"capture\",\"cellpadding\",\"cellspacing\",\"checked\",\"cite\",\"class\",\"clear\",\"color\",\"cols\",\"colspan\",\"controls\",\"controlslist\",\"coords\",\"crossorigin\",\"datetime\",\"decoding\",\"default\",\"dir\",\"disabled\",\"disablepictureinpicture\",\"disableremoteplayback\",\"download\",\"draggable\",\"enctype\",\"enterkeyhint\",\"face\",\"for\",\"headers\",\"height\",\"hidden\",\"high\",\"href\",\"hreflang\",\"id\",\"inputmode\",\"integrity\",\"ismap\",\"kind\",\"label\",\"lang\",\"list\",\"loading\",\"loop\",\"low\",\"max\",\"maxlength\",\"media\",\"method\",\"min\",\"minlength\",\"multiple\",\"muted\",\"name\",\"noshade\",\"novalidate\",\"nowrap\",\"open\",\"optimum\",\"pattern\",\"placeholder\",\"playsinline\",\"poster\",\"preload\",\"pubdate\",\"radiogroup\",\"readonly\",\"rel\",\"required\",\"rev\",\"reversed\",\"role\",\"rows\",\"rowspan\",\"spellcheck\",\"scope\",\"selected\",\"shape\",\"size\",\"sizes\",\"span\",\"srclang\",\"start\",\"src\",\"srcset\",\"step\",\"style\",\"summary\",\"tabindex\",\"title\",\"translate\",\"type\",\"usemap\",\"valign\",\"value\",\"width\",\"xmlns\",\"slot\"]),R=i([\"accent-height\",\"accumulate\",\"additive\",\"alignment-baseline\",\"ascent\",\"attributename\",\"attributetype\",\"azimuth\",\"basefrequency\",\"baseline-shift\",\"begin\",\"bias\",\"by\",\"class\",\"clip\",\"clippathunits\",\"clip-path\",\"clip-rule\",\"color\",\"color-interpolation\",\"color-interpolation-filters\",\"color-profile\",\"color-rendering\",\"cx\",\"cy\",\"d\",\"dx\",\"dy\",\"diffuseconstant\",\"direction\",\"display\",\"divisor\",\"dur\",\"edgemode\",\"elevation\",\"end\",\"fill\",\"fill-opacity\",\"fill-rule\",\"filter\",\"filterunits\",\"flood-color\",\"flood-opacity\",\"font-family\",\"font-size\",\"font-size-adjust\",\"font-stretch\",\"font-style\",\"font-variant\",\"font-weight\",\"fx\",\"fy\",\"g1\",\"g2\",\"glyph-name\",\"glyphref\",\"gradientunits\",\"gradienttransform\",\"height\",\"href\",\"id\",\"image-rendering\",\"in\",\"in2\",\"k\",\"k1\",\"k2\",\"k3\",\"k4\",\"kerning\",\"keypoints\",\"keysplines\",\"keytimes\",\"lang\",\"lengthadjust\",\"letter-spacing\",\"kernelmatrix\",\"kernelunitlength\",\"lighting-color\",\"local\",\"marker-end\",\"marker-mid\",\"marker-start\",\"markerheight\",\"markerunits\",\"markerwidth\",\"maskcontentunits\",\"maskunits\",\"max\",\"mask\",\"media\",\"method\",\"mode\",\"min\",\"name\",\"numoctaves\",\"offset\",\"operator\",\"opacity\",\"order\",\"orient\",\"orientation\",\"origin\",\"overflow\",\"paint-order\",\"path\",\"pathlength\",\"patterncontentunits\",\"patterntransform\",\"patternunits\",\"points\",\"preservealpha\",\"preserveaspectratio\",\"primitiveunits\",\"r\",\"rx\",\"ry\",\"radius\",\"refx\",\"refy\",\"repeatcount\",\"repeatdur\",\"restart\",\"result\",\"rotate\",\"scale\",\"seed\",\"shape-rendering\",\"specularconstant\",\"specularexponent\",\"spreadmethod\",\"startoffset\",\"stddeviation\",\"stitchtiles\",\"stop-color\",\"stop-opacity\",\"stroke-dasharray\",\"stroke-dashoffset\",\"stroke-linecap\",\"stroke-linejoin\",\"stroke-miterlimit\",\"stroke-opacity\",\"stroke\",\"stroke-width\",\"style\",\"surfacescale\",\"systemlanguage\",\"tabindex\",\"targetx\",\"targety\",\"transform\",\"text-anchor\",\"text-decoration\",\"text-rendering\",\"textlength\",\"type\",\"u1\",\"u2\",\"unicode\",\"values\",\"viewbox\",\"visibility\",\"version\",\"vert-adv-y\",\"vert-origin-x\",\"vert-origin-y\",\"width\",\"word-spacing\",\"wrap\",\"writing-mode\",\"xchannelselector\",\"ychannelselector\",\"x\",\"x1\",\"x2\",\"xmlns\",\"y\",\"y1\",\"y2\",\"z\",\"zoomandpan\"]),D=i([\"accent\",\"accentunder\",\"align\",\"bevelled\",\"close\",\"columnsalign\",\"columnlines\",\"columnspan\",\"denomalign\",\"depth\",\"dir\",\"display\",\"displaystyle\",\"encoding\",\"fence\",\"frame\",\"height\",\"href\",\"id\",\"largeop\",\"length\",\"linethickness\",\"lspace\",\"lquote\",\"mathbackground\",\"mathcolor\",\"mathsize\",\"mathvariant\",\"maxsize\",\"minsize\",\"movablelimits\",\"notation\",\"numalign\",\"open\",\"rowalign\",\"rowlines\",\"rowspacing\",\"rowspan\",\"rspace\",\"rquote\",\"scriptlevel\",\"scriptminsize\",\"scriptsizemultiplier\",\"selection\",\"separator\",\"separators\",\"stretchy\",\"subscriptshift\",\"supscriptshift\",\"symmetric\",\"voffset\",\"width\",\"xmlns\"]),L=i([\"xlink:href\",\"xml:id\",\"xlink:title\",\"xml:space\",\"xmlns:xlink\"]),B=s(/\\{\\{[\\s\\S]*|[\\s\\S]*\\}\\}/gm),F=s(/<%[\\s\\S]*|[\\s\\S]*%>/gm),U=s(/^data-[\\-\\w.\\u00B7-\\uFFFF]/),q=s(/^aria-[\\-\\w]+$/),z=s(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i),V=s(/^(?:\\w+script|data):/i),W=s(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g),H=\"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};function $(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var J=function(){return\"undefined\"==typeof window?null:window},K=function(e,t){if(\"object\"!==(void 0===e?\"undefined\":H(e))||\"function\"!=typeof e.createPolicy)return null;var n=null,r=\"data-tt-policy-suffix\";t.currentScript&&t.currentScript.hasAttribute(r)&&(n=t.currentScript.getAttribute(r));var o=\"dompurify\"+(n?\"#\"+n:\"\");try{return e.createPolicy(o,{createHTML:function(e){return e}})}catch(e){return console.warn(\"TrustedTypes policy \"+o+\" could not be created.\"),null}};function Y(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:J(),t=function(e){return Y(e)};if(t.version=\"2.2.9\",t.removed=[],!e||!e.document||9!==e.document.nodeType)return t.isSupported=!1,t;var n=e.document,r=e.document,o=e.DocumentFragment,a=e.HTMLTemplateElement,s=e.Node,u=e.Element,c=e.NodeFilter,l=e.NamedNodeMap,p=void 0===l?e.NamedNodeMap||e.MozNamedAttrMap:l,x=e.Text,E=e.Comment,G=e.DOMParser,Z=e.trustedTypes,X=u.prototype,Q=A(X,\"cloneNode\"),ee=A(X,\"nextSibling\"),te=A(X,\"childNodes\"),ne=A(X,\"parentNode\");if(\"function\"==typeof a){var re=r.createElement(\"template\");re.content&&re.content.ownerDocument&&(r=re.content.ownerDocument)}var oe=K(Z,n),ae=oe&&De?oe.createHTML(\"\"):\"\",ie=r,se=ie.implementation,ue=ie.createNodeIterator,ce=ie.createDocumentFragment,le=n.importNode,pe={};try{pe=C(r).documentMode?r.documentMode:{}}catch(e){}var fe={};t.isSupported=\"function\"==typeof ne&&se&&void 0!==se.createHTMLDocument&&9!==pe;var he=B,de=F,me=U,ve=q,ge=V,ye=W,be=z,_e=null,we=S({},[].concat($(k),$(O),$(j),$(I),$(N))),xe=null,Ee=S({},[].concat($(M),$(R),$(D),$(L))),Se=null,Ce=null,Ae=!0,ke=!0,Oe=!1,je=!1,Te=!1,Ie=!1,Pe=!1,Ne=!1,Me=!1,Re=!0,De=!1,Le=!0,Be=!0,Fe=!1,Ue={},qe=S({},[\"annotation-xml\",\"audio\",\"colgroup\",\"desc\",\"foreignobject\",\"head\",\"iframe\",\"math\",\"mi\",\"mn\",\"mo\",\"ms\",\"mtext\",\"noembed\",\"noframes\",\"noscript\",\"plaintext\",\"script\",\"style\",\"svg\",\"template\",\"thead\",\"title\",\"video\",\"xmp\"]),ze=null,Ve=S({},[\"audio\",\"video\",\"img\",\"source\",\"image\",\"track\"]),We=null,He=S({},[\"alt\",\"class\",\"for\",\"id\",\"label\",\"name\",\"pattern\",\"placeholder\",\"summary\",\"title\",\"value\",\"style\",\"xmlns\"]),$e=\"http://www.w3.org/1998/Math/MathML\",Je=\"http://www.w3.org/2000/svg\",Ke=\"http://www.w3.org/1999/xhtml\",Ye=Ke,Ge=!1,Ze=null,Xe=r.createElement(\"form\"),Qe=function(e){Ze&&Ze===e||(e&&\"object\"===(void 0===e?\"undefined\":H(e))||(e={}),e=C(e),_e=\"ALLOWED_TAGS\"in e?S({},e.ALLOWED_TAGS):we,xe=\"ALLOWED_ATTR\"in e?S({},e.ALLOWED_ATTR):Ee,We=\"ADD_URI_SAFE_ATTR\"in e?S(C(He),e.ADD_URI_SAFE_ATTR):He,ze=\"ADD_DATA_URI_TAGS\"in e?S(C(Ve),e.ADD_DATA_URI_TAGS):Ve,Se=\"FORBID_TAGS\"in e?S({},e.FORBID_TAGS):{},Ce=\"FORBID_ATTR\"in e?S({},e.FORBID_ATTR):{},Ue=\"USE_PROFILES\"in e&&e.USE_PROFILES,Ae=!1!==e.ALLOW_ARIA_ATTR,ke=!1!==e.ALLOW_DATA_ATTR,Oe=e.ALLOW_UNKNOWN_PROTOCOLS||!1,je=e.SAFE_FOR_TEMPLATES||!1,Te=e.WHOLE_DOCUMENT||!1,Ne=e.RETURN_DOM||!1,Me=e.RETURN_DOM_FRAGMENT||!1,Re=!1!==e.RETURN_DOM_IMPORT,De=e.RETURN_TRUSTED_TYPE||!1,Pe=e.FORCE_BODY||!1,Le=!1!==e.SANITIZE_DOM,Be=!1!==e.KEEP_CONTENT,Fe=e.IN_PLACE||!1,be=e.ALLOWED_URI_REGEXP||be,Ye=e.NAMESPACE||Ke,je&&(ke=!1),Me&&(Ne=!0),Ue&&(_e=S({},[].concat($(N))),xe=[],!0===Ue.html&&(S(_e,k),S(xe,M)),!0===Ue.svg&&(S(_e,O),S(xe,R),S(xe,L)),!0===Ue.svgFilters&&(S(_e,j),S(xe,R),S(xe,L)),!0===Ue.mathMl&&(S(_e,I),S(xe,D),S(xe,L))),e.ADD_TAGS&&(_e===we&&(_e=C(_e)),S(_e,e.ADD_TAGS)),e.ADD_ATTR&&(xe===Ee&&(xe=C(xe)),S(xe,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&S(We,e.ADD_URI_SAFE_ATTR),Be&&(_e[\"#text\"]=!0),Te&&S(_e,[\"html\",\"head\",\"body\"]),_e.table&&(S(_e,[\"tbody\"]),delete Se.tbody),i&&i(e),Ze=e)},et=S({},[\"mi\",\"mo\",\"mn\",\"ms\",\"mtext\"]),tt=S({},[\"foreignobject\",\"desc\",\"title\",\"annotation-xml\"]),nt=S({},O);S(nt,j),S(nt,T);var rt=S({},I);S(rt,P);var ot=function(e){var t=ne(e);t&&t.tagName||(t={namespaceURI:Ke,tagName:\"template\"});var n=m(e.tagName),r=m(t.tagName);if(e.namespaceURI===Je)return t.namespaceURI===Ke?\"svg\"===n:t.namespaceURI===$e?\"svg\"===n&&(\"annotation-xml\"===r||et[r]):Boolean(nt[n]);if(e.namespaceURI===$e)return t.namespaceURI===Ke?\"math\"===n:t.namespaceURI===Je?\"math\"===n&&tt[r]:Boolean(rt[n]);if(e.namespaceURI===Ke){if(t.namespaceURI===Je&&!tt[r])return!1;if(t.namespaceURI===$e&&!et[r])return!1;var o=S({},[\"title\",\"style\",\"font\",\"a\",\"script\"]);return!rt[n]&&(o[n]||!nt[n])}return!1},at=function(e){d(t.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=ae}catch(t){e.remove()}}},it=function(e,n){try{d(t.removed,{attribute:n.getAttributeNode(e),from:n})}catch(e){d(t.removed,{attribute:null,from:n})}if(n.removeAttribute(e),\"is\"===e&&!xe[e])if(Ne||Me)try{at(n)}catch(e){}else try{n.setAttribute(e,\"\")}catch(e){}},st=function(e){var t=void 0,n=void 0;if(Pe)e=\"<remove></remove>\"+e;else{var o=v(e,/^[\\r\\n\\t ]+/);n=o&&o[0]}var a=oe?oe.createHTML(e):e;if(Ye===Ke)try{t=(new G).parseFromString(a,\"text/html\")}catch(e){}if(!t||!t.documentElement){t=se.createDocument(Ye,\"template\",null);try{t.documentElement.innerHTML=Ge?\"\":a}catch(e){}}var i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Te?t.documentElement:i},ut=function(e){return ue.call(e.ownerDocument||e,e,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT,null,!1)},ct=function(e){return!(e instanceof x||e instanceof E||\"string\"==typeof e.nodeName&&\"string\"==typeof e.textContent&&\"function\"==typeof e.removeChild&&e.attributes instanceof p&&\"function\"==typeof e.removeAttribute&&\"function\"==typeof e.setAttribute&&\"string\"==typeof e.namespaceURI&&\"function\"==typeof e.insertBefore)},lt=function(e){return\"object\"===(void 0===s?\"undefined\":H(s))?e instanceof s:e&&\"object\"===(void 0===e?\"undefined\":H(e))&&\"number\"==typeof e.nodeType&&\"string\"==typeof e.nodeName},pt=function(e,n,r){fe[e]&&f(fe[e],(function(e){e.call(t,n,r,Ze)}))},ft=function(e){var n=void 0;if(pt(\"beforeSanitizeElements\",e,null),ct(e))return at(e),!0;if(v(e.nodeName,/[\\u0080-\\uFFFF]/))return at(e),!0;var r=m(e.nodeName);if(pt(\"uponSanitizeElement\",e,{tagName:r,allowedTags:_e}),!lt(e.firstElementChild)&&(!lt(e.content)||!lt(e.content.firstElementChild))&&_(/<[/\\w]/g,e.innerHTML)&&_(/<[/\\w]/g,e.textContent))return at(e),!0;if(!_e[r]||Se[r]){if(Be&&!qe[r]){var o=ne(e)||e.parentNode,a=te(e)||e.childNodes;if(a&&o)for(var i=a.length-1;i>=0;--i)o.insertBefore(Q(a[i],!0),ee(e))}return at(e),!0}return e instanceof u&&!ot(e)?(at(e),!0):\"noscript\"!==r&&\"noembed\"!==r||!_(/<\\/no(script|embed)/i,e.innerHTML)?(je&&3===e.nodeType&&(n=e.textContent,n=g(n,he,\" \"),n=g(n,de,\" \"),e.textContent!==n&&(d(t.removed,{element:e.cloneNode()}),e.textContent=n)),pt(\"afterSanitizeElements\",e,null),!1):(at(e),!0)},ht=function(e,t,n){if(Le&&(\"id\"===t||\"name\"===t)&&(n in r||n in Xe))return!1;if(ke&&_(me,t));else if(Ae&&_(ve,t));else{if(!xe[t]||Ce[t])return!1;if(We[t]);else if(_(be,g(n,ye,\"\")));else if(\"src\"!==t&&\"xlink:href\"!==t&&\"href\"!==t||\"script\"===e||0!==y(n,\"data:\")||!ze[e])if(Oe&&!_(ge,g(n,ye,\"\")));else if(n)return!1}return!0},dt=function(e){var n=void 0,r=void 0,o=void 0,a=void 0;pt(\"beforeSanitizeAttributes\",e,null);var i=e.attributes;if(i){var s={attrName:\"\",attrValue:\"\",keepAttr:!0,allowedAttributes:xe};for(a=i.length;a--;){var u=n=i[a],c=u.name,l=u.namespaceURI;if(r=b(n.value),o=m(c),s.attrName=o,s.attrValue=r,s.keepAttr=!0,s.forceKeepAttr=void 0,pt(\"uponSanitizeAttribute\",e,s),r=s.attrValue,!s.forceKeepAttr&&(it(c,e),s.keepAttr))if(_(/\\/>/i,r))it(c,e);else{je&&(r=g(r,he,\" \"),r=g(r,de,\" \"));var p=e.nodeName.toLowerCase();if(ht(p,o,r))try{l?e.setAttributeNS(l,c,r):e.setAttribute(c,r),h(t.removed)}catch(e){}}}pt(\"afterSanitizeAttributes\",e,null)}},mt=function e(t){var n=void 0,r=ut(t);for(pt(\"beforeSanitizeShadowDOM\",t,null);n=r.nextNode();)pt(\"uponSanitizeShadowNode\",n,null),ft(n)||(n.content instanceof o&&e(n.content),dt(n));pt(\"afterSanitizeShadowDOM\",t,null)};return t.sanitize=function(r,a){var i=void 0,u=void 0,c=void 0,l=void 0,p=void 0;if((Ge=!r)&&(r=\"\\x3c!--\\x3e\"),\"string\"!=typeof r&&!lt(r)){if(\"function\"!=typeof r.toString)throw w(\"toString is not a function\");if(\"string\"!=typeof(r=r.toString()))throw w(\"dirty is not a string, aborting\")}if(!t.isSupported){if(\"object\"===H(e.toStaticHTML)||\"function\"==typeof e.toStaticHTML){if(\"string\"==typeof r)return e.toStaticHTML(r);if(lt(r))return e.toStaticHTML(r.outerHTML)}return r}if(Ie||Qe(a),t.removed=[],\"string\"==typeof r&&(Fe=!1),Fe);else if(r instanceof s)1===(u=(i=st(\"\\x3c!----\\x3e\")).ownerDocument.importNode(r,!0)).nodeType&&\"BODY\"===u.nodeName||\"HTML\"===u.nodeName?i=u:i.appendChild(u);else{if(!Ne&&!je&&!Te&&-1===r.indexOf(\"<\"))return oe&&De?oe.createHTML(r):r;if(!(i=st(r)))return Ne?null:ae}i&&Pe&&at(i.firstChild);for(var f=ut(Fe?r:i);c=f.nextNode();)3===c.nodeType&&c===l||ft(c)||(c.content instanceof o&&mt(c.content),dt(c),l=c);if(l=null,Fe)return r;if(Ne){if(Me)for(p=ce.call(i.ownerDocument);i.firstChild;)p.appendChild(i.firstChild);else p=i;return Re&&(p=le.call(n,p,!0)),p}var h=Te?i.outerHTML:i.innerHTML;return je&&(h=g(h,he,\" \"),h=g(h,de,\" \")),oe&&De?oe.createHTML(h):h},t.setConfig=function(e){Qe(e),Ie=!0},t.clearConfig=function(){Ze=null,Ie=!1},t.isValidAttribute=function(e,t,n){Ze||Qe({});var r=m(e),o=m(t);return ht(r,o,n)},t.addHook=function(e,t){\"function\"==typeof t&&(fe[e]=fe[e]||[],d(fe[e],t))},t.removeHook=function(e){fe[e]&&h(fe[e])},t.removeHooks=function(e){fe[e]&&(fe[e]=[])},t.removeAllHooks=function(){fe={}},t}return Y()}()},function(e,t,n){var r=n(40),o=n(47),a=r.document,i=o(a)&&o(a.createElement);e.exports=function(e){return i?a.createElement(e):{}}},function(e,t,n){var r=n(47),o=n(152),a=n(41)(\"species\");e.exports=function(e,t){var n;return o(e)&&(\"function\"!=typeof(n=e.constructor)||n!==Array&&!o(n.prototype)?r(n)&&null===(n=n[a])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},function(e,t,n){var r=n(97),o=n(228);(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})(\"versions\",[]).push({version:\"3.15.1\",mode:r?\"pure\":\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"})},function(e,t,n){var r=n(40),o=n(546),a=\"__core-js_shared__\",i=r[a]||o(a,{});e.exports=i},function(e,t,n){var r=n(129),o=n(37);e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(e,t,n){var r=n(48),o=n(68),a=n(52),i=n(155);e.exports=r?Object.defineProperties:function(e,t){a(e);for(var n,r=i(t),s=r.length,u=0;s>u;)o.f(e,n=r[u++],t[n]);return e}},function(e,t,n){var r=n(66),o=n(69),a=n(232),i=function(e){return function(t,n,i){var s,u=r(t),c=o(u.length),l=a(i,c);if(e&&n!=n){for(;c>l;)if((s=u[l++])!=s)return!0}else for(;c>l;l++)if((e||l in u)&&u[l]===n)return e||l||0;return!e&&-1}};e.exports={includes:i(!0),indexOf:i(!1)}},function(e,t,n){var r=n(128),o=Math.max,a=Math.min;e.exports=function(e,t){var n=r(e);return n<0?o(n+t,0):a(n,t)}},function(e,t){e.exports=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"]},function(e,t,n){var r=n(365),o=n(233).concat(\"length\",\"prototype\");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var r=n(41);t.f=r},function(e,t,n){var r={};r[n(41)(\"toStringTag\")]=\"z\",e.exports=\"[object z]\"===String(r)},function(e,t,n){\"use strict\";var r=n(21),o=n(371),a=n(182),i=n(183),s=n(98),u=n(67),c=n(110),l=n(41),p=n(97),f=n(131),h=n(372),d=h.IteratorPrototype,m=h.BUGGY_SAFARI_ITERATORS,v=l(\"iterator\"),g=\"keys\",y=\"values\",b=\"entries\",_=function(){return this};e.exports=function(e,t,n,l,h,w,x){o(n,t,l);var E,S,C,A=function(e){if(e===h&&I)return I;if(!m&&e in j)return j[e];switch(e){case g:case y:case b:return function(){return new n(this,e)}}return function(){return new n(this)}},k=t+\" Iterator\",O=!1,j=e.prototype,T=j[v]||j[\"@@iterator\"]||h&&j[h],I=!m&&T||A(h),P=\"Array\"==t&&j.entries||T;if(P&&(E=a(P.call(new e)),d!==Object.prototype&&E.next&&(p||a(E)===d||(i?i(E,d):\"function\"!=typeof E[v]&&u(E,v,_)),s(E,k,!0,!0),p&&(f[k]=_))),h==y&&T&&T.name!==y&&(O=!0,I=function(){return T.call(this)}),p&&!x||j[v]===I||u(j,v,I),f[t]=I,h)if(S={values:A(y),keys:w?I:A(g),entries:A(b)},x)for(C in S)(m||O||!(C in j))&&c(j,C,S[C]);else r({target:t,proto:!0,forced:m||O},S);return S}},function(e,t){e.exports=function(){}},function(e,t,n){e.exports=n(590)},function(e,t,n){\"use strict\";e.exports={}},function(e,t,n){e.exports=n(633)},function(e,t,n){e.exports=n(634)},function(e,t,n){var r=n(701),o=n(717),a=n(719),i=n(720),s=n(721);function u(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}u.prototype.clear=r,u.prototype.delete=o,u.prototype.get=a,u.prototype.has=i,u.prototype.set=s,e.exports=u},function(e,t,n){var r=n(113)(n(71),\"Map\");e.exports=r},function(e,t,n){var r=n(188),o=n(725),a=n(726),i=n(727),s=n(728),u=n(729);function c(e){var t=this.__data__=new r(e);this.size=t.size}c.prototype.clear=o,c.prototype.delete=a,c.prototype.get=i,c.prototype.has=s,c.prototype.set=u,e.exports=c},function(e,t){e.exports=function(e,t){for(var n=-1,r=t.length,o=e.length;++n<r;)e[o+n]=t[n];return e}},function(e,t,n){var r=n(739),o=n(419),a=Object.prototype.propertyIsEnumerable,i=Object.getOwnPropertySymbols,s=i?function(e){return null==e?[]:(e=Object(e),r(i(e),(function(t){return a.call(e,t)})))}:o;e.exports=s},function(e,t,n){var r=n(743),o=n(251),a=n(252),i=a&&a.isTypedArray,s=i?o(i):r;e.exports=s},function(e,t){e.exports=function(e){return\"number\"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,n){(function(e){var r=n(407),o=t&&!t.nodeType&&t,a=o&&\"object\"==typeof e&&e&&!e.nodeType&&e,i=a&&a.exports===o&&r.process,s=function(){try{var e=a&&a.require&&a.require(\"util\").types;return e||i&&i.binding&&i.binding(\"util\")}catch(e){}}();e.exports=s}).call(this,n(194)(e))},function(e,t,n){var r=n(50),o=n(186),a=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,i=/^\\w*$/;e.exports=function(e,t){if(r(e))return!1;var n=typeof e;return!(\"number\"!=n&&\"symbol\"!=n&&\"boolean\"!=n&&null!=e&&!o(e))||(i.test(e)||!a.test(e)||null!=t&&e in Object(t))}},function(e,t){e.exports=function(e){return e}},function(e,t,n){\"use strict\";var r,o=\"object\"==typeof Reflect?Reflect:null,a=o&&\"function\"==typeof o.apply?o.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};r=o&&\"function\"==typeof o.ownKeys?o.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var i=Number.isNaN||function(e){return e!=e};function s(){s.init.call(this)}e.exports=s,e.exports.once=function(e,t){return new Promise((function(n,r){function o(){void 0!==a&&e.removeListener(\"error\",a),n([].slice.call(arguments))}var a;\"error\"!==t&&(a=function(n){e.removeListener(t,o),r(n)},e.once(\"error\",a)),e.once(t,o)}))},s.EventEmitter=s,s.prototype._events=void 0,s.prototype._eventsCount=0,s.prototype._maxListeners=void 0;var u=10;function c(e){if(\"function\"!=typeof e)throw new TypeError('The \"listener\" argument must be of type Function. Received type '+typeof e)}function l(e){return void 0===e._maxListeners?s.defaultMaxListeners:e._maxListeners}function p(e,t,n,r){var o,a,i,s;if(c(n),void 0===(a=e._events)?(a=e._events=Object.create(null),e._eventsCount=0):(void 0!==a.newListener&&(e.emit(\"newListener\",t,n.listener?n.listener:n),a=e._events),i=a[t]),void 0===i)i=a[t]=n,++e._eventsCount;else if(\"function\"==typeof i?i=a[t]=r?[n,i]:[i,n]:r?i.unshift(n):i.push(n),(o=l(e))>0&&i.length>o&&!i.warned){i.warned=!0;var u=new Error(\"Possible EventEmitter memory leak detected. \"+i.length+\" \"+String(t)+\" listeners added. Use emitter.setMaxListeners() to increase limit\");u.name=\"MaxListenersExceededWarning\",u.emitter=e,u.type=t,u.count=i.length,s=u,console&&console.warn&&console.warn(s)}return e}function f(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function h(e,t,n){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},o=f.bind(r);return o.listener=n,r.wrapFn=o,o}function d(e,t,n){var r=e._events;if(void 0===r)return[];var o=r[t];return void 0===o?[]:\"function\"==typeof o?n?[o.listener||o]:[o]:n?function(e){for(var t=new Array(e.length),n=0;n<t.length;++n)t[n]=e[n].listener||e[n];return t}(o):v(o,o.length)}function m(e){var t=this._events;if(void 0!==t){var n=t[e];if(\"function\"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function v(e,t){for(var n=new Array(t),r=0;r<t;++r)n[r]=e[r];return n}Object.defineProperty(s,\"defaultMaxListeners\",{enumerable:!0,get:function(){return u},set:function(e){if(\"number\"!=typeof e||e<0||i(e))throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received '+e+\".\");u=e}}),s.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},s.prototype.setMaxListeners=function(e){if(\"number\"!=typeof e||e<0||i(e))throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received '+e+\".\");return this._maxListeners=e,this},s.prototype.getMaxListeners=function(){return l(this)},s.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var r=\"error\"===e,o=this._events;if(void 0!==o)r=r&&void 0===o.error;else if(!r)return!1;if(r){var i;if(t.length>0&&(i=t[0]),i instanceof Error)throw i;var s=new Error(\"Unhandled error.\"+(i?\" (\"+i.message+\")\":\"\"));throw s.context=i,s}var u=o[e];if(void 0===u)return!1;if(\"function\"==typeof u)a(u,this,t);else{var c=u.length,l=v(u,c);for(n=0;n<c;++n)a(l[n],this,t)}return!0},s.prototype.addListener=function(e,t){return p(this,e,t,!1)},s.prototype.on=s.prototype.addListener,s.prototype.prependListener=function(e,t){return p(this,e,t,!0)},s.prototype.once=function(e,t){return c(t),this.on(e,h(this,e,t)),this},s.prototype.prependOnceListener=function(e,t){return c(t),this.prependListener(e,h(this,e,t)),this},s.prototype.removeListener=function(e,t){var n,r,o,a,i;if(c(t),void 0===(r=this._events))return this;if(void 0===(n=r[e]))return this;if(n===t||n.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit(\"removeListener\",e,n.listener||t));else if(\"function\"!=typeof n){for(o=-1,a=n.length-1;a>=0;a--)if(n[a]===t||n[a].listener===t){i=n[a].listener,o=a;break}if(o<0)return this;0===o?n.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(n,o),1===n.length&&(r[e]=n[0]),void 0!==r.removeListener&&this.emit(\"removeListener\",e,i||t)}return this},s.prototype.off=s.prototype.removeListener,s.prototype.removeAllListeners=function(e){var t,n,r;if(void 0===(n=this._events))return this;if(void 0===n.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==n[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete n[e]),this;if(0===arguments.length){var o,a=Object.keys(n);for(r=0;r<a.length;++r)\"removeListener\"!==(o=a[r])&&this.removeAllListeners(o);return this.removeAllListeners(\"removeListener\"),this._events=Object.create(null),this._eventsCount=0,this}if(\"function\"==typeof(t=n[e]))this.removeListener(e,t);else if(void 0!==t)for(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this},s.prototype.listeners=function(e){return d(this,e,!0)},s.prototype.rawListeners=function(e){return d(this,e,!1)},s.listenerCount=function(e,t){return\"function\"==typeof e.listenerCount?e.listenerCount(t):m.call(e,t)},s.prototype.listenerCount=m,s.prototype.eventNames=function(){return this._eventsCount>0?r(this._events):[]}},function(e,t,n){(t=e.exports=n(430)).Stream=t,t.Readable=t,t.Writable=n(257),t.Duplex=n(116),t.Transform=n(435),t.PassThrough=n(775)},function(e,t,n){\"use strict\";(function(t,r,o){var a=n(197);function i(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,n){var r=e.entry;e.entry=null;for(;r;){var o=r.callback;t.pendingcb--,o(n),r=r.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}(t,e)}}e.exports=y;var s,u=!t.browser&&[\"v0.10\",\"v0.9.\"].indexOf(t.version.slice(0,5))>-1?r:a.nextTick;y.WritableState=g;var c=n(162);c.inherits=n(61);var l={deprecate:n(774)},p=n(431),f=n(62).Buffer,h=o.Uint8Array||function(){};var d,m=n(432);function v(){}function g(e,t){s=s||n(116),e=e||{};var r=t instanceof s;this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var o=e.highWaterMark,c=e.writableHighWaterMark,l=this.objectMode?16:16384;this.highWaterMark=o||0===o?o:r&&(c||0===c)?c:l,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var p=!1===e.decodeStrings;this.decodeStrings=!p,this.defaultEncoding=e.defaultEncoding||\"utf8\",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var n=e._writableState,r=n.sync,o=n.writecb;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(n),t)!function(e,t,n,r,o){--t.pendingcb,n?(a.nextTick(o,r),a.nextTick(S,e,t),e._writableState.errorEmitted=!0,e.emit(\"error\",r)):(o(r),e._writableState.errorEmitted=!0,e.emit(\"error\",r),S(e,t))}(e,n,r,t,o);else{var i=x(n);i||n.corked||n.bufferProcessing||!n.bufferedRequest||w(e,n),r?u(_,e,n,i,o):_(e,n,i,o)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new i(this)}function y(e){if(s=s||n(116),!(d.call(y,this)||this instanceof s))return new y(e);this._writableState=new g(e,this),this.writable=!0,e&&(\"function\"==typeof e.write&&(this._write=e.write),\"function\"==typeof e.writev&&(this._writev=e.writev),\"function\"==typeof e.destroy&&(this._destroy=e.destroy),\"function\"==typeof e.final&&(this._final=e.final)),p.call(this)}function b(e,t,n,r,o,a,i){t.writelen=r,t.writecb=i,t.writing=!0,t.sync=!0,n?e._writev(o,t.onwrite):e._write(o,a,t.onwrite),t.sync=!1}function _(e,t,n,r){n||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit(\"drain\"))}(e,t),t.pendingcb--,r(),S(e,t)}function w(e,t){t.bufferProcessing=!0;var n=t.bufferedRequest;if(e._writev&&n&&n.next){var r=t.bufferedRequestCount,o=new Array(r),a=t.corkedRequestsFree;a.entry=n;for(var s=0,u=!0;n;)o[s]=n,n.isBuf||(u=!1),n=n.next,s+=1;o.allBuffers=u,b(e,t,!0,t.length,o,\"\",a.finish),t.pendingcb++,t.lastBufferedRequest=null,a.next?(t.corkedRequestsFree=a.next,a.next=null):t.corkedRequestsFree=new i(t),t.bufferedRequestCount=0}else{for(;n;){var c=n.chunk,l=n.encoding,p=n.callback;if(b(e,t,!1,t.objectMode?1:c.length,c,l,p),n=n.next,t.bufferedRequestCount--,t.writing)break}null===n&&(t.lastBufferedRequest=null)}t.bufferedRequest=n,t.bufferProcessing=!1}function x(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function E(e,t){e._final((function(n){t.pendingcb--,n&&e.emit(\"error\",n),t.prefinished=!0,e.emit(\"prefinish\"),S(e,t)}))}function S(e,t){var n=x(t);return n&&(!function(e,t){t.prefinished||t.finalCalled||(\"function\"==typeof e._final?(t.pendingcb++,t.finalCalled=!0,a.nextTick(E,e,t)):(t.prefinished=!0,e.emit(\"prefinish\")))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit(\"finish\"))),n}c.inherits(y,p),g.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(g.prototype,\"buffer\",{get:l.deprecate((function(){return this.getBuffer()}),\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch(e){}}(),\"function\"==typeof Symbol&&Symbol.hasInstance&&\"function\"==typeof Function.prototype[Symbol.hasInstance]?(d=Function.prototype[Symbol.hasInstance],Object.defineProperty(y,Symbol.hasInstance,{value:function(e){return!!d.call(this,e)||this===y&&(e&&e._writableState instanceof g)}})):d=function(e){return e instanceof this},y.prototype.pipe=function(){this.emit(\"error\",new Error(\"Cannot pipe, not readable\"))},y.prototype.write=function(e,t,n){var r,o=this._writableState,i=!1,s=!o.objectMode&&(r=e,f.isBuffer(r)||r instanceof h);return s&&!f.isBuffer(e)&&(e=function(e){return f.from(e)}(e)),\"function\"==typeof t&&(n=t,t=null),s?t=\"buffer\":t||(t=o.defaultEncoding),\"function\"!=typeof n&&(n=v),o.ended?function(e,t){var n=new Error(\"write after end\");e.emit(\"error\",n),a.nextTick(t,n)}(this,n):(s||function(e,t,n,r){var o=!0,i=!1;return null===n?i=new TypeError(\"May not write null values to stream\"):\"string\"==typeof n||void 0===n||t.objectMode||(i=new TypeError(\"Invalid non-string/buffer chunk\")),i&&(e.emit(\"error\",i),a.nextTick(r,i),o=!1),o}(this,o,e,n))&&(o.pendingcb++,i=function(e,t,n,r,o,a){if(!n){var i=function(e,t,n){e.objectMode||!1===e.decodeStrings||\"string\"!=typeof t||(t=f.from(t,n));return t}(t,r,o);r!==i&&(n=!0,o=\"buffer\",r=i)}var s=t.objectMode?1:r.length;t.length+=s;var u=t.length<t.highWaterMark;u||(t.needDrain=!0);if(t.writing||t.corked){var c=t.lastBufferedRequest;t.lastBufferedRequest={chunk:r,encoding:o,isBuf:n,callback:a,next:null},c?c.next=t.lastBufferedRequest:t.bufferedRequest=t.lastBufferedRequest,t.bufferedRequestCount+=1}else b(e,t,!1,s,r,o,a);return u}(this,o,s,e,t,n)),i},y.prototype.cork=function(){this._writableState.corked++},y.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.finished||e.bufferProcessing||!e.bufferedRequest||w(this,e))},y.prototype.setDefaultEncoding=function(e){if(\"string\"==typeof e&&(e=e.toLowerCase()),!([\"hex\",\"utf8\",\"utf-8\",\"ascii\",\"binary\",\"base64\",\"ucs2\",\"ucs-2\",\"utf16le\",\"utf-16le\",\"raw\"].indexOf((e+\"\").toLowerCase())>-1))throw new TypeError(\"Unknown encoding: \"+e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(y.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),y.prototype._write=function(e,t,n){n(new Error(\"_write() is not implemented\"))},y.prototype._writev=null,y.prototype.end=function(e,t,n){var r=this._writableState;\"function\"==typeof e?(n=e,e=null,t=null):\"function\"==typeof t&&(n=t,t=null),null!=e&&this.write(e,t),r.corked&&(r.corked=1,this.uncork()),r.ending||r.finished||function(e,t,n){t.ending=!0,S(e,t),n&&(t.finished?a.nextTick(n):e.once(\"finish\",n));t.ended=!0,e.writable=!1}(this,r,n)},Object.defineProperty(y.prototype,\"destroyed\",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),y.prototype.destroy=m.destroy,y.prototype._undestroy=m.undestroy,y.prototype._destroy=function(e,t){this.end(),t(e)}}).call(this,n(90),n(433).setImmediate,n(51))},function(e,t,n){\"use strict\";e.exports=n(805)()?Array.from:n(806)},function(e,t,n){\"use strict\";var r=n(823),o=n(118),a=n(137),i=Array.prototype.indexOf,s=Object.prototype.hasOwnProperty,u=Math.abs,c=Math.floor;e.exports=function(e){var t,n,l,p;if(!r(e))return i.apply(this,arguments);for(n=o(a(this).length),l=arguments[1],t=l=isNaN(l)?0:l>=0?c(l):o(this.length)-c(u(l));t<n;++t)if(s.call(this,t)&&(p=this[t],r(p)))return t;return-1}},function(e,t,n){\"use strict\";(function(t,n){var r=function(e){if(\"function\"!=typeof e)throw new TypeError(e+\" is not a function\");return e},o=function(e){var t,n,o=document.createTextNode(\"\"),a=0;return new e((function(){var e;if(t)n&&(t=n.concat(t));else{if(!n)return;t=n}if(n=t,t=null,\"function\"==typeof n)return e=n,n=null,void e();for(o.data=a=++a%2;n;)e=n.shift(),n.length||(n=null),e()})).observe(o,{characterData:!0}),function(e){r(e),t?\"function\"==typeof t?t=[t,e]:t.push(e):(t=e,o.data=a=++a%2)}};e.exports=function(){if(\"object\"==typeof t&&t&&\"function\"==typeof t.nextTick)return t.nextTick;if(\"function\"==typeof queueMicrotask)return function(e){queueMicrotask(r(e))};if(\"object\"==typeof document&&document){if(\"function\"==typeof MutationObserver)return o(MutationObserver);if(\"function\"==typeof WebKitMutationObserver)return o(WebKitMutationObserver)}return\"function\"==typeof n?function(e){n(r(e))}:\"function\"==typeof setTimeout||\"object\"==typeof setTimeout?function(e){setTimeout(r(e),0)}:null}()}).call(this,n(90),n(433).setImmediate)},function(e,t,n){\"use strict\";var r=n(30),o=(n(25),null),a={};function i(){if(o)for(var e in a){var t=a[e],n=o.indexOf(e);if(n>-1||r(\"96\",e),!c.plugins[n]){t.extractEvents||r(\"97\",e),c.plugins[n]=t;var i=t.eventTypes;for(var u in i)s(i[u],t,u)||r(\"98\",u,e)}}}function s(e,t,n){c.eventNameDispatchConfigs.hasOwnProperty(n)&&r(\"99\",n),c.eventNameDispatchConfigs[n]=e;var o=e.phasedRegistrationNames;if(o){for(var a in o){if(o.hasOwnProperty(a))u(o[a],t,n)}return!0}return!!e.registrationName&&(u(e.registrationName,t,n),!0)}function u(e,t,n){c.registrationNameModules[e]&&r(\"100\",e),c.registrationNameModules[e]=t,c.registrationNameDependencies[e]=t.eventTypes[n].dependencies}var c={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},possibleRegistrationNames:null,injectEventPluginOrder:function(e){o&&r(\"101\"),o=Array.prototype.slice.call(e),i()},injectEventPluginsByName:function(e){var t=!1;for(var n in e)if(e.hasOwnProperty(n)){var o=e[n];a.hasOwnProperty(n)&&a[n]===o||(a[n]&&r(\"102\",n),a[n]=o,t=!0)}t&&i()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return c.registrationNameModules[t.registrationName]||null;if(void 0!==t.phasedRegistrationNames){var n=t.phasedRegistrationNames;for(var r in n)if(n.hasOwnProperty(r)){var o=c.registrationNameModules[n[r]];if(o)return o}}return null},_resetEventPlugins:function(){for(var e in o=null,a)a.hasOwnProperty(e)&&delete a[e];c.plugins.length=0;var t=c.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=c.registrationNameModules;for(var i in r)r.hasOwnProperty(i)&&delete r[i]}};e.exports=c},function(e,t,n){\"use strict\";var r,o,a=n(30),i=n(263);n(25),n(33);function s(e,t,n,r){var o=e.type||\"unknown-event\";e.currentTarget=u.getNodeFromInstance(r),t?i.invokeGuardedCallbackWithCatch(o,n,e):i.invokeGuardedCallback(o,n,e),e.currentTarget=null}var u={isEndish:function(e){return\"topMouseUp\"===e||\"topTouchEnd\"===e||\"topTouchCancel\"===e},isMoveish:function(e){return\"topMouseMove\"===e||\"topTouchMove\"===e},isStartish:function(e){return\"topMouseDown\"===e||\"topTouchStart\"===e},executeDirectDispatch:function(e){var t=e._dispatchListeners,n=e._dispatchInstances;Array.isArray(t)&&a(\"103\"),e.currentTarget=t?u.getNodeFromInstance(n):null;var r=t?t(e):null;return e.currentTarget=null,e._dispatchListeners=null,e._dispatchInstances=null,r},executeDispatchesInOrder:function(e,t){var n=e._dispatchListeners,r=e._dispatchInstances;if(Array.isArray(n))for(var o=0;o<n.length&&!e.isPropagationStopped();o++)s(e,t,n[o],r[o]);else n&&s(e,t,n,r);e._dispatchListeners=null,e._dispatchInstances=null},executeDispatchesInOrderStopAtTrue:function(e){var t=function(e){var t=e._dispatchListeners,n=e._dispatchInstances;if(Array.isArray(t)){for(var r=0;r<t.length&&!e.isPropagationStopped();r++)if(t[r](e,n[r]))return n[r]}else if(t&&t(e,n))return n;return null}(e);return e._dispatchInstances=null,e._dispatchListeners=null,t},hasDispatches:function(e){return!!e._dispatchListeners},getInstanceFromNode:function(e){return r.getInstanceFromNode(e)},getNodeFromInstance:function(e){return r.getNodeFromInstance(e)},isAncestor:function(e,t){return o.isAncestor(e,t)},getLowestCommonAncestor:function(e,t){return o.getLowestCommonAncestor(e,t)},getParentInstance:function(e){return o.getParentInstance(e)},traverseTwoPhase:function(e,t,n){return o.traverseTwoPhase(e,t,n)},traverseEnterLeave:function(e,t,n,r,a){return o.traverseEnterLeave(e,t,n,r,a)},injection:{injectComponentTree:function(e){r=e},injectTreeTraversal:function(e){o=e}}};e.exports=u},function(e,t,n){\"use strict\";var r=null;function o(e,t,n){try{t(n)}catch(e){null===r&&(r=e)}}var a={invokeGuardedCallback:o,invokeGuardedCallbackWithCatch:o,rethrowCaughtError:function(){if(r){var e=r;throw r=null,e}}};e.exports=a},function(e,t,n){\"use strict\";e.exports=function(e){var t=e.target||e.srcElement||window;return t.correspondingUseElement&&(t=t.correspondingUseElement),3===t.nodeType?t.parentNode:t}},function(e,t,n){\"use strict\";var r,o=n(56);o.canUseDOM&&(r=document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature(\"\",\"\")),e.exports=function(e,t){if(!o.canUseDOM||t&&!(\"addEventListener\"in document))return!1;var n=\"on\"+e,a=n in document;if(!a){var i=document.createElement(\"div\");i.setAttribute(n,\"return;\"),a=\"function\"==typeof i[n]}return!a&&r&&\"wheel\"===e&&(a=document.implementation.hasFeature(\"Events.wheel\",\"3.0\")),a}},function(e,t,n){\"use strict\";var r={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function o(e){var t=this.nativeEvent;if(t.getModifierState)return t.getModifierState(e);var n=r[e];return!!n&&!!t[n]}e.exports=function(e){return o}},function(e,t,n){\"use strict\";var r=n(142),o=n(931),a=(n(45),n(72),n(269)),i=n(204),s=n(476);function u(e,t){return Array.isArray(t)&&(t=t[1]),t?t.nextSibling:e.firstChild}var c=a((function(e,t,n){e.insertBefore(t,n)}));function l(e,t,n){r.insertTreeBefore(e,t,n)}function p(e,t,n){Array.isArray(t)?function(e,t,n,r){var o=t;for(;;){var a=o.nextSibling;if(c(e,o,r),o===n)break;o=a}}(e,t[0],t[1],n):c(e,t,n)}function f(e,t){if(Array.isArray(t)){var n=t[1];h(e,t=t[0],n),e.removeChild(n)}e.removeChild(t)}function h(e,t,n){for(;;){var r=t.nextSibling;if(r===n)break;e.removeChild(r)}}var d={dangerouslyReplaceNodeWithMarkup:o.dangerouslyReplaceNodeWithMarkup,replaceDelimitedText:function(e,t,n){var r=e.parentNode,o=e.nextSibling;o===t?n&&c(r,document.createTextNode(n),o):n?(s(o,n),h(r,o,t)):h(r,e,t)},processUpdates:function(e,t){for(var n=0;n<t.length;n++){var r=t[n];switch(r.type){case\"INSERT_MARKUP\":l(e,r.content,u(e,r.afterNode));break;case\"MOVE_EXISTING\":p(e,r.fromNode,u(e,r.afterNode));break;case\"SET_MARKUP\":i(e,r.content);break;case\"TEXT_CONTENT\":s(e,r.content);break;case\"REMOVE_NODE\":f(e,r.fromNode)}}}};e.exports=d},function(e,t,n){\"use strict\";e.exports={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"}},function(e,t,n){\"use strict\";e.exports=function(e){return\"undefined\"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(t,n,r,o){MSApp.execUnsafeLocalFunction((function(){return e(t,n,r,o)}))}:e}},function(e,t,n){\"use strict\";var r=n(30),o=n(949),a=n(387)(n(132).isValidElement),i=(n(25),n(33),{button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0});function s(e){null!=e.checkedLink&&null!=e.valueLink&&r(\"87\")}function u(e){s(e),(null!=e.value||null!=e.onChange)&&r(\"88\")}function c(e){s(e),(null!=e.checked||null!=e.onChange)&&r(\"89\")}var l={value:function(e,t,n){return!e[t]||i[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error(\"You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.\")},checked:function(e,t,n){return!e[t]||e.onChange||e.readOnly||e.disabled?null:new Error(\"You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.\")},onChange:a.func},p={};function f(e){if(e){var t=e.getName();if(t)return\" Check the render method of `\"+t+\"`.\"}return\"\"}var h={checkPropTypes:function(e,t,n){for(var r in l){if(l.hasOwnProperty(r))var a=l[r](t,r,e,\"prop\",null,o);if(a instanceof Error&&!(a.message in p)){p[a.message]=!0;f(n)}}},getValue:function(e){return e.valueLink?(u(e),e.valueLink.value):e.value},getChecked:function(e){return e.checkedLink?(c(e),e.checkedLink.value):e.checked},executeOnChange:function(e,t){return e.valueLink?(u(e),e.valueLink.requestChange(t.target.value)):e.checkedLink?(c(e),e.checkedLink.requestChange(t.target.checked)):e.onChange?e.onChange.call(void 0,t):void 0}};e.exports=h},function(e,t,n){\"use strict\";var r=n(30),o=(n(25),!1),a={replaceNodeWithMarkup:null,processChildrenUpdates:null,injection:{injectEnvironment:function(e){o&&r(\"104\"),a.replaceNodeWithMarkup=e.replaceNodeWithMarkup,a.processChildrenUpdates=e.processChildrenUpdates,o=!0}}};e.exports=a},function(e,t,n){\"use strict\";var r=Object.prototype.hasOwnProperty;function o(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!=e&&t!=t}e.exports=function(e,t){if(o(e,t))return!0;if(\"object\"!=typeof e||null===e||\"object\"!=typeof t||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(var i=0;i<n.length;i++)if(!r.call(t,n[i])||!o(e[n[i]],t[n[i]]))return!1;return!0}},function(e,t,n){\"use strict\";e.exports=function(e,t){var n=null===e||!1===e,r=null===t||!1===t;if(n||r)return n===r;var o=typeof e,a=typeof t;return\"string\"===o||\"number\"===o?\"string\"===a||\"number\"===a:\"object\"===a&&e.type===t.type&&e.key===t.key}},function(e,t,n){\"use strict\";var r={escape:function(e){var t={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+e).replace(/[=:]/g,(function(e){return t[e]}))},unescape:function(e){var t={\"=0\":\"=\",\"=2\":\":\"};return(\"\"+(\".\"===e[0]&&\"$\"===e[1]?e.substring(2):e.substring(1))).replace(/(=0|=2)/g,(function(e){return t[e]}))}};e.exports=r},function(e,t,n){\"use strict\";var r=n(30),o=(n(88),n(168)),a=(n(72),n(80));n(25),n(33);function i(e){a.enqueueUpdate(e)}function s(e,t){var n=o.get(e);return n||null}var u={isMounted:function(e){var t=o.get(e);return!!t&&!!t._renderedComponent},enqueueCallback:function(e,t,n){u.validateCallback(t,n);var r=s(e);if(!r)return null;r._pendingCallbacks?r._pendingCallbacks.push(t):r._pendingCallbacks=[t],i(r)},enqueueCallbackInternal:function(e,t){e._pendingCallbacks?e._pendingCallbacks.push(t):e._pendingCallbacks=[t],i(e)},enqueueForceUpdate:function(e){var t=s(e);t&&(t._pendingForceUpdate=!0,i(t))},enqueueReplaceState:function(e,t,n){var r=s(e);r&&(r._pendingStateQueue=[t],r._pendingReplaceState=!0,null!=n&&(u.validateCallback(n,\"replaceState\"),r._pendingCallbacks?r._pendingCallbacks.push(n):r._pendingCallbacks=[n]),i(r))},enqueueSetState:function(e,t){var n=s(e);n&&((n._pendingStateQueue||(n._pendingStateQueue=[])).push(t),i(n))},enqueueElementInternal:function(e,t,n){e._pendingElement=t,e._context=n,i(e)},validateCallback:function(e,t){e&&\"function\"!=typeof e&&r(\"122\",t,function(e){var t=typeof e;if(\"object\"!==t)return t;var n=e.constructor&&e.constructor.name||t,r=Object.keys(e);return r.length>0&&r.length<20?n+\" (keys: \"+r.join(\", \")+\")\":n}(e))}};e.exports=u},function(e,t,n){\"use strict\";n(38);var r=n(79),o=(n(33),r);e.exports=o},function(e,t,n){\"use strict\";e.exports=function(e){var t,n=e.keyCode;return\"charCode\"in e?0===(t=e.charCode)&&13===n&&(t=13):t=n,t>=32||13===t?t:0}},function(e,t,n){var r=n(422)(Object.getPrototypeOf,Object);e.exports=r},function(e,t,n){var r=n(420),o=n(1003),a=n(115);e.exports=function(e){return a(e)?r(e,!0):o(e)}},function(e,t,n){var r=n(416);e.exports=function(e){var t=new e.constructor(e.byteLength);return new r(t).set(new r(e)),t}},function(e,t,n){\"use strict\";var r,o=SyntaxError,a=Function,i=TypeError,s=function(e){try{return a('\"use strict\"; return ('+e+\").constructor;\")()}catch(e){}},u=Object.getOwnPropertyDescriptor;if(u)try{u({},\"\")}catch(e){u=null}var c=function(){throw new i},l=u?function(){try{return c}catch(e){try{return u(arguments,\"callee\").get}catch(e){return c}}}():c,p=n(1055)(),f=Object.getPrototypeOf||function(e){return e.__proto__},h={},d=\"undefined\"==typeof Uint8Array?r:f(Uint8Array),m={\"%AggregateError%\":\"undefined\"==typeof AggregateError?r:AggregateError,\"%Array%\":Array,\"%ArrayBuffer%\":\"undefined\"==typeof ArrayBuffer?r:ArrayBuffer,\"%ArrayIteratorPrototype%\":p?f([][Symbol.iterator]()):r,\"%AsyncFromSyncIteratorPrototype%\":r,\"%AsyncFunction%\":h,\"%AsyncGenerator%\":h,\"%AsyncGeneratorFunction%\":h,\"%AsyncIteratorPrototype%\":h,\"%Atomics%\":\"undefined\"==typeof Atomics?r:Atomics,\"%BigInt%\":\"undefined\"==typeof BigInt?r:BigInt,\"%Boolean%\":Boolean,\"%DataView%\":\"undefined\"==typeof DataView?r:DataView,\"%Date%\":Date,\"%decodeURI%\":decodeURI,\"%decodeURIComponent%\":decodeURIComponent,\"%encodeURI%\":encodeURI,\"%encodeURIComponent%\":encodeURIComponent,\"%Error%\":Error,\"%eval%\":eval,\"%EvalError%\":EvalError,\"%Float32Array%\":\"undefined\"==typeof Float32Array?r:Float32Array,\"%Float64Array%\":\"undefined\"==typeof Float64Array?r:Float64Array,\"%FinalizationRegistry%\":\"undefined\"==typeof FinalizationRegistry?r:FinalizationRegistry,\"%Function%\":a,\"%GeneratorFunction%\":h,\"%Int8Array%\":\"undefined\"==typeof Int8Array?r:Int8Array,\"%Int16Array%\":\"undefined\"==typeof Int16Array?r:Int16Array,\"%Int32Array%\":\"undefined\"==typeof Int32Array?r:Int32Array,\"%isFinite%\":isFinite,\"%isNaN%\":isNaN,\"%IteratorPrototype%\":p?f(f([][Symbol.iterator]())):r,\"%JSON%\":\"object\"==typeof JSON?JSON:r,\"%Map%\":\"undefined\"==typeof Map?r:Map,\"%MapIteratorPrototype%\":\"undefined\"!=typeof Map&&p?f((new Map)[Symbol.iterator]()):r,\"%Math%\":Math,\"%Number%\":Number,\"%Object%\":Object,\"%parseFloat%\":parseFloat,\"%parseInt%\":parseInt,\"%Promise%\":\"undefined\"==typeof Promise?r:Promise,\"%Proxy%\":\"undefined\"==typeof Proxy?r:Proxy,\"%RangeError%\":RangeError,\"%ReferenceError%\":ReferenceError,\"%Reflect%\":\"undefined\"==typeof Reflect?r:Reflect,\"%RegExp%\":RegExp,\"%Set%\":\"undefined\"==typeof Set?r:Set,\"%SetIteratorPrototype%\":\"undefined\"!=typeof Set&&p?f((new Set)[Symbol.iterator]()):r,\"%SharedArrayBuffer%\":\"undefined\"==typeof SharedArrayBuffer?r:SharedArrayBuffer,\"%String%\":String,\"%StringIteratorPrototype%\":p?f(\"\"[Symbol.iterator]()):r,\"%Symbol%\":p?Symbol:r,\"%SyntaxError%\":o,\"%ThrowTypeError%\":l,\"%TypedArray%\":d,\"%TypeError%\":i,\"%Uint8Array%\":\"undefined\"==typeof Uint8Array?r:Uint8Array,\"%Uint8ClampedArray%\":\"undefined\"==typeof Uint8ClampedArray?r:Uint8ClampedArray,\"%Uint16Array%\":\"undefined\"==typeof Uint16Array?r:Uint16Array,\"%Uint32Array%\":\"undefined\"==typeof Uint32Array?r:Uint32Array,\"%URIError%\":URIError,\"%WeakMap%\":\"undefined\"==typeof WeakMap?r:WeakMap,\"%WeakRef%\":\"undefined\"==typeof WeakRef?r:WeakRef,\"%WeakSet%\":\"undefined\"==typeof WeakSet?r:WeakSet},v=function e(t){var n;if(\"%AsyncFunction%\"===t)n=s(\"async function () {}\");else if(\"%GeneratorFunction%\"===t)n=s(\"function* () {}\");else if(\"%AsyncGeneratorFunction%\"===t)n=s(\"async function* () {}\");else if(\"%AsyncGenerator%\"===t){var r=e(\"%AsyncGeneratorFunction%\");r&&(n=r.prototype)}else if(\"%AsyncIteratorPrototype%\"===t){var o=e(\"%AsyncGenerator%\");o&&(n=f(o.prototype))}return m[t]=n,n},g={\"%ArrayBufferPrototype%\":[\"ArrayBuffer\",\"prototype\"],\"%ArrayPrototype%\":[\"Array\",\"prototype\"],\"%ArrayProto_entries%\":[\"Array\",\"prototype\",\"entries\"],\"%ArrayProto_forEach%\":[\"Array\",\"prototype\",\"forEach\"],\"%ArrayProto_keys%\":[\"Array\",\"prototype\",\"keys\"],\"%ArrayProto_values%\":[\"Array\",\"prototype\",\"values\"],\"%AsyncFunctionPrototype%\":[\"AsyncFunction\",\"prototype\"],\"%AsyncGenerator%\":[\"AsyncGeneratorFunction\",\"prototype\"],\"%AsyncGeneratorPrototype%\":[\"AsyncGeneratorFunction\",\"prototype\",\"prototype\"],\"%BooleanPrototype%\":[\"Boolean\",\"prototype\"],\"%DataViewPrototype%\":[\"DataView\",\"prototype\"],\"%DatePrototype%\":[\"Date\",\"prototype\"],\"%ErrorPrototype%\":[\"Error\",\"prototype\"],\"%EvalErrorPrototype%\":[\"EvalError\",\"prototype\"],\"%Float32ArrayPrototype%\":[\"Float32Array\",\"prototype\"],\"%Float64ArrayPrototype%\":[\"Float64Array\",\"prototype\"],\"%FunctionPrototype%\":[\"Function\",\"prototype\"],\"%Generator%\":[\"GeneratorFunction\",\"prototype\"],\"%GeneratorPrototype%\":[\"GeneratorFunction\",\"prototype\",\"prototype\"],\"%Int8ArrayPrototype%\":[\"Int8Array\",\"prototype\"],\"%Int16ArrayPrototype%\":[\"Int16Array\",\"prototype\"],\"%Int32ArrayPrototype%\":[\"Int32Array\",\"prototype\"],\"%JSONParse%\":[\"JSON\",\"parse\"],\"%JSONStringify%\":[\"JSON\",\"stringify\"],\"%MapPrototype%\":[\"Map\",\"prototype\"],\"%NumberPrototype%\":[\"Number\",\"prototype\"],\"%ObjectPrototype%\":[\"Object\",\"prototype\"],\"%ObjProto_toString%\":[\"Object\",\"prototype\",\"toString\"],\"%ObjProto_valueOf%\":[\"Object\",\"prototype\",\"valueOf\"],\"%PromisePrototype%\":[\"Promise\",\"prototype\"],\"%PromiseProto_then%\":[\"Promise\",\"prototype\",\"then\"],\"%Promise_all%\":[\"Promise\",\"all\"],\"%Promise_reject%\":[\"Promise\",\"reject\"],\"%Promise_resolve%\":[\"Promise\",\"resolve\"],\"%RangeErrorPrototype%\":[\"RangeError\",\"prototype\"],\"%ReferenceErrorPrototype%\":[\"ReferenceError\",\"prototype\"],\"%RegExpPrototype%\":[\"RegExp\",\"prototype\"],\"%SetPrototype%\":[\"Set\",\"prototype\"],\"%SharedArrayBufferPrototype%\":[\"SharedArrayBuffer\",\"prototype\"],\"%StringPrototype%\":[\"String\",\"prototype\"],\"%SymbolPrototype%\":[\"Symbol\",\"prototype\"],\"%SyntaxErrorPrototype%\":[\"SyntaxError\",\"prototype\"],\"%TypedArrayPrototype%\":[\"TypedArray\",\"prototype\"],\"%TypeErrorPrototype%\":[\"TypeError\",\"prototype\"],\"%Uint8ArrayPrototype%\":[\"Uint8Array\",\"prototype\"],\"%Uint8ClampedArrayPrototype%\":[\"Uint8ClampedArray\",\"prototype\"],\"%Uint16ArrayPrototype%\":[\"Uint16Array\",\"prototype\"],\"%Uint32ArrayPrototype%\":[\"Uint32Array\",\"prototype\"],\"%URIErrorPrototype%\":[\"URIError\",\"prototype\"],\"%WeakMapPrototype%\":[\"WeakMap\",\"prototype\"],\"%WeakSetPrototype%\":[\"WeakSet\",\"prototype\"]},y=n(282),b=n(1058),_=y.call(Function.call,Array.prototype.concat),w=y.call(Function.apply,Array.prototype.splice),x=y.call(Function.call,String.prototype.replace),E=y.call(Function.call,String.prototype.slice),S=/[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g,C=/\\\\(\\\\)?/g,A=function(e){var t=E(e,0,1),n=E(e,-1);if(\"%\"===t&&\"%\"!==n)throw new o(\"invalid intrinsic syntax, expected closing `%`\");if(\"%\"===n&&\"%\"!==t)throw new o(\"invalid intrinsic syntax, expected opening `%`\");var r=[];return x(e,S,(function(e,t,n,o){r[r.length]=n?x(o,C,\"$1\"):t||e})),r},k=function(e,t){var n,r=e;if(b(g,r)&&(r=\"%\"+(n=g[r])[0]+\"%\"),b(m,r)){var a=m[r];if(a===h&&(a=v(r)),void 0===a&&!t)throw new i(\"intrinsic \"+e+\" exists, but is not available. Please file an issue!\");return{alias:n,name:r,value:a}}throw new o(\"intrinsic \"+e+\" does not exist!\")};e.exports=function(e,t){if(\"string\"!=typeof e||0===e.length)throw new i(\"intrinsic name must be a non-empty string\");if(arguments.length>1&&\"boolean\"!=typeof t)throw new i('\"allowMissing\" argument must be a boolean');var n=A(e),r=n.length>0?n[0]:\"\",a=k(\"%\"+r+\"%\",t),s=a.name,c=a.value,l=!1,p=a.alias;p&&(r=p[0],w(n,_([0,1],p)));for(var f=1,h=!0;f<n.length;f+=1){var d=n[f],v=E(d,0,1),g=E(d,-1);if(('\"'===v||\"'\"===v||\"`\"===v||'\"'===g||\"'\"===g||\"`\"===g)&&v!==g)throw new o(\"property names with quotes must have matching quotes\");if(\"constructor\"!==d&&h||(l=!0),b(m,s=\"%\"+(r+=\".\"+d)+\"%\"))c=m[s];else if(null!=c){if(!(d in c)){if(!t)throw new i(\"base intrinsic for \"+e+\" exists, but the property is not available.\");return}if(u&&f+1>=n.length){var y=u(c,d);c=(h=!!y)&&\"get\"in y&&!(\"originalValue\"in y.get)?y.get:c[d]}else h=b(c,d),c=c[d];h&&!l&&(m[s]=c)}}return c}},function(e,t,n){\"use strict\";var r=n(1057);e.exports=Function.prototype.bind||r},function(e,t,n){\"use strict\";var r=String.prototype.replace,o=/%20/g,a=\"RFC1738\",i=\"RFC3986\";e.exports={default:i,formatters:{RFC1738:function(e){return r.call(e,o,\"+\")},RFC3986:function(e){return String(e)}},RFC1738:a,RFC3986:i}},function(e,t,n){var r=n(688)(\"toUpperCase\");e.exports=r},function(e,t,n){var r=n(244);function o(e,t){if(\"function\"!=typeof e||null!=t&&\"function\"!=typeof t)throw new TypeError(\"Expected a function\");var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],a=n.cache;if(a.has(o))return a.get(o);var i=e.apply(this,r);return n.cache=a.set(o,i)||a,i};return n.cache=new(o.Cache||r),n}o.Cache=r,e.exports=o},function(e,t,n){\"use strict\";n.r(t);var r=n(287),o=n(59),a=n(290);t.default=function(e){return{statePlugins:{err:{reducers:Object(r.default)(e),actions:o,selectors:a}}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(3),o=n.n(r),a=n(20),i=n.n(a),s=n(4),u=n.n(s),c=n(2),l=n.n(c),p=n(12),f=n.n(p),h=n(210),d=n.n(h),m=n(59),v=n(1),g=n(126),y={line:0,level:\"error\",message:\"Unknown error\"};t.default=function(){var e;return e={},o()(e,m.NEW_THROWN_ERR,(function(e,t){var n=t.payload,r=i()(y,n,{type:\"thrown\"});return e.update(\"errors\",(function(e){return(e||Object(v.List)()).push(Object(v.fromJS)(r))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),o()(e,m.NEW_THROWN_ERR_BATCH,(function(e,t){var n=t.payload;return n=u()(n).call(n,(function(e){return Object(v.fromJS)(i()(y,e,{type:\"thrown\"}))})),e.update(\"errors\",(function(e){var t;return l()(t=e||Object(v.List)()).call(t,Object(v.fromJS)(n))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),o()(e,m.NEW_SPEC_ERR,(function(e,t){var n=t.payload,r=Object(v.fromJS)(n);return r=r.set(\"type\",\"spec\"),e.update(\"errors\",(function(e){return(e||Object(v.List)()).push(Object(v.fromJS)(r)).sortBy((function(e){return e.get(\"line\")}))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),o()(e,m.NEW_SPEC_ERR_BATCH,(function(e,t){var n=t.payload;return n=u()(n).call(n,(function(e){return Object(v.fromJS)(i()(y,e,{type:\"spec\"}))})),e.update(\"errors\",(function(e){var t;return l()(t=e||Object(v.List)()).call(t,Object(v.fromJS)(n))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),o()(e,m.NEW_AUTH_ERR,(function(e,t){var n=t.payload,r=Object(v.fromJS)(i()({},n));return r=r.set(\"type\",\"auth\"),e.update(\"errors\",(function(e){return(e||Object(v.List)()).push(Object(v.fromJS)(r))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),o()(e,m.CLEAR,(function(e,t){var n,r=t.payload;if(!r||!e.get(\"errors\"))return e;var o=f()(n=e.get(\"errors\")).call(n,(function(e){var t;return d()(t=e.keySeq()).call(t,(function(t){var n=e.get(t),o=r[t];return!o||n!==o}))}));return e.merge({errors:o})})),o()(e,m.CLEAR_BY,(function(e,t){var n,r=t.payload;if(!r||\"function\"!=typeof r)return e;var o=f()(n=e.get(\"errors\")).call(n,(function(e){return r(e)}));return e.merge({errors:o})})),e}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"transform\",(function(){return p}));var r=n(4),o=n.n(r),a=n(17),i=n.n(a),s=n(19),u=n.n(s),c=n(29),l=n.n(c);function p(e){return o()(e).call(e,(function(e){var t,n=\"is not of a type(s)\",r=i()(t=e.get(\"message\")).call(t,n);if(r>-1){var o,a,s=u()(o=e.get(\"message\")).call(o,r+n.length).split(\",\");return e.set(\"message\",u()(a=e.get(\"message\")).call(a,0,r)+function(e){return l()(e).call(e,(function(e,t,n,r){return n===r.length-1&&r.length>1?e+\"or \"+t:r[n+1]&&r.length>2?e+t+\", \":r[n+1]?e+t+\" \":e+t}),\"should be a\")}(s))}return e}))}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"transform\",(function(){return r}));n(4),n(17),n(43),n(1);function r(e,t){t.jsSpec;return e}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"allErrors\",(function(){return a})),n.d(t,\"lastError\",(function(){return i}));var r=n(1),o=n(16),a=Object(o.a)((function(e){return e}),(function(e){return e.get(\"errors\",Object(r.List)())})),i=Object(o.a)(a,(function(e){return e.last()}))},function(e,t,n){\"use strict\";n.r(t);var r=n(292),o=n(103),a=n(293),i=n(294);t.default=function(){return{statePlugins:{layout:{reducers:r.default,actions:o,selectors:a},spec:{wrapSelectors:i}}}}},function(e,t,n){\"use strict\";n.r(t);var r,o=n(3),a=n.n(o),i=n(2),s=n.n(i),u=n(1),c=n(103);t.default=(r={},a()(r,c.UPDATE_LAYOUT,(function(e,t){return e.set(\"layout\",t.payload)})),a()(r,c.UPDATE_FILTER,(function(e,t){return e.set(\"filter\",t.payload)})),a()(r,c.SHOW,(function(e,t){var n=t.payload.shown,r=Object(u.fromJS)(t.payload.thing);return e.update(\"shown\",Object(u.fromJS)({}),(function(e){return e.set(r,n)}))})),a()(r,c.UPDATE_MODE,(function(e,t){var n,r=t.payload.thing,o=t.payload.mode;return e.setIn(s()(n=[\"modes\"]).call(n,r),(o||\"\")+\"\")})),r)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"current\",(function(){return l})),n.d(t,\"currentFilter\",(function(){return p})),n.d(t,\"isShown\",(function(){return f})),n.d(t,\"whatMode\",(function(){return h})),n.d(t,\"showSummary\",(function(){return d}));var r=n(14),o=n.n(r),a=n(2),i=n.n(a),s=n(16),u=n(5),c=n(1),l=function(e){return e.get(\"layout\")},p=function(e){return e.get(\"filter\")},f=function(e,t,n){return t=Object(u.v)(t),e.get(\"shown\",Object(c.fromJS)({})).get(Object(c.fromJS)(t),n)},h=function(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\";return t=Object(u.v)(t),e.getIn(i()(n=[\"modes\"]).call(n,o()(t)),r)},d=Object(s.a)((function(e){return e}),(function(e){return!f(e,\"editor\")}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"taggedOperations\",(function(){return s}));var r=n(2),o=n.n(r),a=n(19),i=n.n(a),s=function(e,t){return function(n){for(var r,a=arguments.length,s=new Array(a>1?a-1:0),u=1;u<a;u++)s[u-1]=arguments[u];var c=e.apply(void 0,o()(r=[n]).call(r,s)),l=t.getSystem(),p=l.fn,f=l.layoutSelectors,h=l.getConfigs,d=h(),m=d.maxDisplayedTags,v=f.currentFilter();return v&&!0!==v&&\"true\"!==v&&\"false\"!==v&&(c=p.opsFilter(c,v)),m&&!isNaN(m)&&m>=0&&(c=i()(c).call(c,0,m)),c}}},function(e,t,n){\"use strict\";n.r(t);var r=n(296),o=n(46),a=n(93),i=n(297);t.default=function(){return{statePlugins:{spec:{wrapActions:i,reducers:r.default,actions:o,selectors:a}}}}},function(e,t,n){\"use strict\";n.r(t);var r,o=n(3),a=n.n(o),i=n(14),s=n.n(i),u=n(2),c=n.n(u),l=n(29),p=n.n(l),f=n(4),h=n.n(f),d=n(20),m=n.n(d),v=n(1),g=n(5),y=n(26),b=n(93),_=n(46);t.default=(r={},a()(r,_.UPDATE_SPEC,(function(e,t){return\"string\"==typeof t.payload?e.set(\"spec\",t.payload):e})),a()(r,_.UPDATE_URL,(function(e,t){return e.set(\"url\",t.payload+\"\")})),a()(r,_.UPDATE_JSON,(function(e,t){return e.set(\"json\",Object(g.i)(t.payload))})),a()(r,_.UPDATE_RESOLVED,(function(e,t){return e.setIn([\"resolved\"],Object(g.i)(t.payload))})),a()(r,_.UPDATE_RESOLVED_SUBTREE,(function(e,t){var n,r=t.payload,o=r.value,a=r.path;return e.setIn(c()(n=[\"resolvedSubtrees\"]).call(n,s()(a)),Object(g.i)(o))})),a()(r,_.UPDATE_PARAM,(function(e,t){var n,r,o=t.payload,a=o.path,i=o.paramName,u=o.paramIn,l=o.param,p=o.value,f=o.isXml,h=l?Object(g.A)(l):c()(n=\"\".concat(u,\".\")).call(n,i),d=f?\"value_xml\":\"value\";return e.setIn(c()(r=[\"meta\",\"paths\"]).call(r,s()(a),[\"parameters\",h,d]),p)})),a()(r,_.UPDATE_EMPTY_PARAM_INCLUSION,(function(e,t){var n,r,o=t.payload,a=o.pathMethod,i=o.paramName,u=o.paramIn,l=o.includeEmptyValue;if(!i||!u)return console.warn(\"Warning: UPDATE_EMPTY_PARAM_INCLUSION could not generate a paramKey.\"),e;var p=c()(n=\"\".concat(u,\".\")).call(n,i);return e.setIn(c()(r=[\"meta\",\"paths\"]).call(r,s()(a),[\"parameter_inclusions\",p]),l)})),a()(r,_.VALIDATE_PARAMS,(function(e,t){var n,r,o=t.payload,a=o.pathMethod,i=o.isOAS3,u=Object(b.specJsonWithResolvedSubtrees)(e).getIn(c()(n=[\"paths\"]).call(n,s()(a))),l=Object(b.parameterValues)(e,a).toJS();return e.updateIn(c()(r=[\"meta\",\"paths\"]).call(r,s()(a),[\"parameters\"]),Object(v.fromJS)({}),(function(t){var n;return p()(n=u.get(\"parameters\",Object(v.List)())).call(n,(function(t,n){var r=Object(g.B)(n,l),o=Object(b.parameterInclusionSettingFor)(e,a,n.get(\"name\"),n.get(\"in\")),s=Object(g.K)(n,r,{bypassRequiredCheck:o,isOAS3:i});return t.setIn([Object(g.A)(n),\"errors\"],Object(v.fromJS)(s))}),t)}))})),a()(r,_.CLEAR_VALIDATE_PARAMS,(function(e,t){var n,r=t.payload.pathMethod;return e.updateIn(c()(n=[\"meta\",\"paths\"]).call(n,s()(r),[\"parameters\"]),Object(v.fromJS)([]),(function(e){return h()(e).call(e,(function(e){return e.set(\"errors\",Object(v.fromJS)([]))}))}))})),a()(r,_.SET_RESPONSE,(function(e,t){var n,r=t.payload,o=r.res,a=r.path,i=r.method;(n=o.error?m()({error:!0,name:o.err.name,message:o.err.message,statusCode:o.err.statusCode},o.err.response):o).headers=n.headers||{};var s=e.setIn([\"responses\",a,i],Object(g.i)(n));return y.a.Blob&&o.data instanceof y.a.Blob&&(s=s.setIn([\"responses\",a,i,\"text\"],o.data)),s})),a()(r,_.SET_REQUEST,(function(e,t){var n=t.payload,r=n.req,o=n.path,a=n.method;return e.setIn([\"requests\",o,a],Object(g.i)(r))})),a()(r,_.SET_MUTATED_REQUEST,(function(e,t){var n=t.payload,r=n.req,o=n.path,a=n.method;return e.setIn([\"mutatedRequests\",o,a],Object(g.i)(r))})),a()(r,_.UPDATE_OPERATION_META_VALUE,(function(e,t){var n,r,o,a,i,u,l=t.payload,p=l.path,f=l.value,h=l.key,d=c()(n=[\"paths\"]).call(n,s()(p)),m=c()(r=[\"meta\",\"paths\"]).call(r,s()(p));return e.getIn(c()(o=[\"json\"]).call(o,s()(d)))||e.getIn(c()(a=[\"resolved\"]).call(a,s()(d)))||e.getIn(c()(i=[\"resolvedSubtrees\"]).call(i,s()(d)))?e.setIn(c()(u=[]).call(u,s()(m),[h]),Object(v.fromJS)(f)):e})),a()(r,_.CLEAR_RESPONSE,(function(e,t){var n=t.payload,r=n.path,o=n.method;return e.deleteIn([\"responses\",r,o])})),a()(r,_.CLEAR_REQUEST,(function(e,t){var n=t.payload,r=n.path,o=n.method;return e.deleteIn([\"requests\",r,o])})),a()(r,_.SET_SCHEME,(function(e,t){var n=t.payload,r=n.scheme,o=n.path,a=n.method;return o&&a?e.setIn([\"scheme\",o,a],r):o||a?void 0:e.setIn([\"scheme\",\"_defaultScheme\"],r)})),r)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"updateSpec\",(function(){return c})),n.d(t,\"updateJsonSpec\",(function(){return l})),n.d(t,\"executeRequest\",(function(){return p})),n.d(t,\"validateParams\",(function(){return f}));var r=n(15),o=n.n(r),a=n(23),i=n.n(a),s=n(43),u=n.n(s),c=function(e,t){var n=t.specActions;return function(){e.apply(void 0,arguments),n.parseToJson.apply(n,arguments)}},l=function(e,t){var n=t.specActions;return function(){for(var t=arguments.length,r=new Array(t),a=0;a<t;a++)r[a]=arguments[a];e.apply(void 0,r),n.invalidateResolvedSubtreeCache();var s=r[0],c=u()(s,[\"paths\"])||{},l=o()(c);i()(l).call(l,(function(e){u()(c,[e]).$ref&&n.requestResolvedSubtree([\"paths\",e])})),n.requestResolvedSubtree([\"components\",\"securitySchemes\"])}},p=function(e,t){var n=t.specActions;return function(t){return n.logRequest(t),e(t)}},f=function(e,t){var n=t.specSelectors;return function(t){return e(t,n.isOAS3())}}},function(e,t,n){\"use strict\";n.r(t);var r=n(36),o=n.n(r),a=n(173),i=n(5);t.default=function(e){var t=e.getComponents,n=e.getStore,r=e.getSystem,s=a.getComponent,u=a.render,c=a.makeMappedContainer,l=Object(i.u)(o()(s).call(s,null,r,n,t));return{rootInjects:{getComponent:l,makeMappedContainer:Object(i.u)(o()(c).call(c,null,r,n,l,t)),render:o()(u).call(u,null,r,n,s,t)}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(146);t.default=function(){return{fn:r}}},function(e,t,n){\"use strict\";n.r(t);var r=n(169),o=n(301),a=n(302);t.default=function(){return{components:{RequestSnippets:a.RequestSnippets},fn:r,statePlugins:{requestSnippets:{selectors:o}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"getGenerators\",(function(){return f})),n.d(t,\"getSnippetGenerators\",(function(){return h})),n.d(t,\"getActiveLanguage\",(function(){return d})),n.d(t,\"getDefaultExpanded\",(function(){return m}));var r=n(12),o=n.n(r),a=n(31),i=n.n(a),s=n(4),u=n.n(s),c=n(16),l=n(1),p=function(e){return e||Object(l.Map)()},f=Object(c.a)(p,(function(e){var t=e.get(\"languages\"),n=e.get(\"generators\",Object(l.Map)());return t?o()(n).call(n,(function(e,n){return i()(t).call(t,n)})):n})),h=function(e){return function(t){var n,r,a=t.fn;return o()(n=u()(r=f(e)).call(r,(function(e,t){var n=function(e){return a[\"requestSnippetGenerator_\".concat(e)]}(t);return\"function\"!=typeof n?null:e.set(\"fn\",n)}))).call(n,(function(e){return e}))}},d=Object(c.a)(p,(function(e){return e.get(\"activeLanguage\")})),m=Object(c.a)(p,(function(e){return e.get(\"defaultExpanded\")}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"RequestSnippets\",(function(){return w}));var r=n(13),o=n.n(r),a=n(6),i=n.n(a),s=n(7),u=n.n(s),c=n(8),l=n.n(c),p=n(9),f=n.n(p),h=n(4),d=n.n(h),m=n(0),v=n.n(m),g=n(147),y=(n(11),n(43)),b=n.n(y),_=n(96),w=function(e){l()(n,e);var t=f()(n);function n(){var e,r,o,a,s,u;return i()(this,n),(u=t.call(this)).state={activeLanguage:null===(e=u.props)||void 0===e||null===(r=e.requestSnippetsSelectors)||void 0===r||null===(o=r.getSnippetGenerators())||void 0===o?void 0:o.keySeq().first(),expanded:null===(a=u.props)||void 0===a||null===(s=a.requestSnippetsSelectors)||void 0===s?void 0:s.getDefaultExpanded()},u}return u()(n,[{key:\"render\",value:function(){var e,t,n,r,a=this,i=this.props,s=i.request,u=i.getConfigs,c=i.requestSnippetsSelectors.getSnippetGenerators(),l=this.state.activeLanguage||c.keySeq().first(),p=c.get(l),f=p.get(\"fn\")(s),h={cursor:\"pointer\",lineHeight:1,display:\"inline-flex\",backgroundColor:\"rgb(250, 250, 250)\",paddingBottom:\"0\",paddingTop:\"0\",border:\"1px solid rgb(51, 51, 51)\",borderRadius:\"4px 4px 0 0\",boxShadow:\"none\",borderBottom:\"none\"},m={cursor:\"pointer\",lineHeight:1,display:\"inline-flex\",backgroundColor:\"rgb(51, 51, 51)\",boxShadow:\"none\",border:\"1px solid rgb(51, 51, 51)\",paddingBottom:\"0\",paddingTop:\"0\",borderRadius:\"4px 4px 0 0\",marginTop:\"-5px\",marginRight:\"-5px\",marginLeft:\"-5px\",zIndex:\"9999\",borderBottom:\"none\"},y=function(e){return e===l?m:h},w=u(),x=null!=w&&null!==(e=w.syntaxHighlight)&&void 0!==e&&e.activated?v.a.createElement(_.a,{language:p.get(\"syntax\"),className:\"curl microlight\",onWheel:function(e){return this.preventYScrollingBeyondElement(e)},style:Object(_.b)(b()(w,\"syntaxHighlight.theme\"))},f):v.a.createElement(\"textarea\",{readOnly:!0,className:\"curl\",value:f}),E=void 0===this.state.expanded?null===(t=this.props)||void 0===t||null===(n=t.requestSnippetsSelectors)||void 0===n?void 0:n.getDefaultExpanded():this.state.expanded;return v.a.createElement(\"div\",null,v.a.createElement(\"div\",{style:{width:\"100%\",display:\"flex\",justifyContent:\"flex-start\",alignItems:\"center\",marginBottom:\"15px\"}},v.a.createElement(\"h4\",{style:{cursor:\"pointer\"},onClick:function(){return a.setState({expanded:!E})}},\"Snippets\"),v.a.createElement(\"button\",{onClick:function(){return a.setState({expanded:!E})},style:{border:\"none\",background:\"none\"},title:E?\"Collapse operation\":\"Expand operation\"},v.a.createElement(\"svg\",{className:\"arrow\",width:\"10\",height:\"10\"},v.a.createElement(\"use\",{href:E?\"#large-arrow-down\":\"#large-arrow\",xlinkHref:E?\"#large-arrow-down\":\"#large-arrow\"})))),E&&v.a.createElement(\"div\",{className:\"curl-command\"},v.a.createElement(\"div\",{style:{paddingLeft:\"15px\",paddingRight:\"10px\",width:\"100%\",display:\"flex\"}},d()(r=c.entrySeq()).call(r,(function(e){var t=o()(e,2),n=t[0],r=t[1];return v.a.createElement(\"div\",{style:y(n),className:\"btn\",key:n,onClick:function(){return function(e){l!==e&&a.setState({activeLanguage:e})}(n)}},v.a.createElement(\"h4\",{style:n===l?{color:\"white\"}:{}},r.get(\"title\")))}))),v.a.createElement(\"div\",{className:\"copy-to-clipboard\"},v.a.createElement(g.CopyToClipboard,{text:f},v.a.createElement(\"button\",null))),v.a.createElement(\"div\",null,x)))}}]),n}(v.a.Component)},function(e,t,n){\"use strict\";n.r(t);var r=n(36),o=n.n(r);t.default=function(e){var t=e.configs,n={debug:0,info:1,log:2,warn:3,error:4},r=function(e){return n[e]||-1},a=t.logLevel,i=r(a);function s(e){for(var t,n=arguments.length,o=new Array(n>1?n-1:0),a=1;a<n;a++)o[a-1]=arguments[a];r(e)>=i&&(t=console)[e].apply(t,o)}return s.warn=o()(s).call(s,null,\"warn\"),s.error=o()(s).call(s,null,\"error\"),s.info=o()(s).call(s,null,\"info\"),s.debug=o()(s).call(s,null,\"debug\"),{rootInjects:{log:s}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"loaded\",(function(){return r}));var r=function(e,t){return function(){e.apply(void 0,arguments);var n=t.getConfigs().withCredentials;void 0!==n&&(t.fn.fetch.withCredentials=\"string\"==typeof n?\"true\"===n:!!n)}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"preauthorizeBasic\",(function(){return h})),n.d(t,\"preauthorizeApiKey\",(function(){return d}));var r=n(3),o=n.n(r),a=n(36),i=n.n(a),s=n(2),u=n.n(s),c=n(306),l=n(84),p=n(307),f=n(308);function h(e,t,n,r){var a,i=e.authActions.authorize,s=e.specSelectors,c=s.specJson,l=(0,s.isOAS3)()?[\"components\",\"securitySchemes\"]:[\"securityDefinitions\"],p=c().getIn(u()(a=[]).call(a,l,[t]));return p?i(o()({},t,{value:{username:n,password:r},schema:p.toJS()})):null}function d(e,t,n){var r,a=e.authActions.authorize,i=e.specSelectors,s=i.specJson,c=(0,i.isOAS3)()?[\"components\",\"securitySchemes\"]:[\"securityDefinitions\"],l=s().getIn(u()(r=[]).call(r,c,[t]));return l?a(o()({},t,{value:n,schema:l.toJS()})):null}t.default=function(){return{afterLoad:function(e){this.rootInjects=this.rootInjects||{},this.rootInjects.initOAuth=e.authActions.configureAuth,this.rootInjects.preauthorizeApiKey=i()(d).call(d,null,e),this.rootInjects.preauthorizeBasic=i()(h).call(h,null,e)},statePlugins:{auth:{reducers:c.default,actions:l,selectors:p},spec:{wrapActions:f}}}}},function(e,t,n){\"use strict\";n.r(t);var r,o=n(3),a=n.n(o),i=n(13),s=n.n(i),u=n(23),c=n.n(u),l=n(20),p=n.n(l),f=n(1),h=n(5),d=n(84);t.default=(r={},a()(r,d.SHOW_AUTH_POPUP,(function(e,t){var n=t.payload;return e.set(\"showDefinitions\",n)})),a()(r,d.AUTHORIZE,(function(e,t){var n,r=t.payload,o=Object(f.fromJS)(r),a=e.get(\"authorized\")||Object(f.Map)();return c()(n=o.entrySeq()).call(n,(function(t){var n=s()(t,2),r=n[0],o=n[1];if(!Object(h.s)(o.getIn))return e.set(\"authorized\",a);var i=o.getIn([\"schema\",\"type\"]);if(\"apiKey\"===i||\"http\"===i)a=a.set(r,o);else if(\"basic\"===i){var u=o.getIn([\"value\",\"username\"]),c=o.getIn([\"value\",\"password\"]);a=(a=a.setIn([r,\"value\"],{username:u,header:\"Basic \"+Object(h.a)(u+\":\"+c)})).setIn([r,\"schema\"],o.get(\"schema\"))}})),e.set(\"authorized\",a)})),a()(r,d.AUTHORIZE_OAUTH2,(function(e,t){var n,r=t.payload,o=r.auth,a=r.token;o.token=p()({},a),n=Object(f.fromJS)(o);var i=e.get(\"authorized\")||Object(f.Map)();return i=i.set(n.get(\"name\"),n),e.set(\"authorized\",i)})),a()(r,d.LOGOUT,(function(e,t){var n=t.payload,r=e.get(\"authorized\").withMutations((function(e){c()(n).call(n,(function(t){e.delete(t)}))}));return e.set(\"authorized\",r)})),a()(r,d.CONFIGURE_AUTH,(function(e,t){var n=t.payload;return e.set(\"configs\",n)})),a()(r,d.RESTORE_AUTHORIZATION,(function(e,t){var n=t.payload;return e.set(\"authorized\",Object(f.fromJS)(n.authorized))})),r)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"shownDefinitions\",(function(){return _})),n.d(t,\"definitionsToAuthorize\",(function(){return w})),n.d(t,\"getDefinitionsByNames\",(function(){return x})),n.d(t,\"definitionsForRequirements\",(function(){return E})),n.d(t,\"authorized\",(function(){return S})),n.d(t,\"isAuthorized\",(function(){return C})),n.d(t,\"getConfigs\",(function(){return A}));var r=n(13),o=n.n(r),a=n(23),i=n.n(a),s=n(12),u=n.n(s),c=n(75),l=n.n(c),p=n(17),f=n.n(p),h=n(4),d=n.n(h),m=n(15),v=n.n(m),g=n(16),y=n(1),b=function(e){return e},_=Object(g.a)(b,(function(e){return e.get(\"showDefinitions\")})),w=Object(g.a)(b,(function(){return function(e){var t,n=e.specSelectors.securityDefinitions()||Object(y.Map)({}),r=Object(y.List)();return i()(t=n.entrySeq()).call(t,(function(e){var t=o()(e,2),n=t[0],a=t[1],i=Object(y.Map)();i=i.set(n,a),r=r.push(i)})),r}})),x=function(e,t){return function(e){var n,r=e.specSelectors;console.warn(\"WARNING: getDefinitionsByNames is deprecated and will be removed in the next major version.\");var a=r.securityDefinitions(),s=Object(y.List)();return i()(n=t.valueSeq()).call(n,(function(e){var t,n=Object(y.Map)();i()(t=e.entrySeq()).call(t,(function(e){var t,r,s=o()(e,2),u=s[0],c=s[1],l=a.get(u);\"oauth2\"===l.get(\"type\")&&c.size&&(t=l.get(\"scopes\"),i()(r=t.keySeq()).call(r,(function(e){c.contains(e)||(t=t.delete(e))})),l=l.set(\"allowedScopes\",t));n=n.set(u,l)})),s=s.push(n)})),s}},E=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Object(y.List)();return function(e){var n=e.authSelectors.definitionsToAuthorize()||Object(y.List)();return u()(n).call(n,(function(e){return l()(t).call(t,(function(t){return t.get(e.keySeq().first())}))}))}},S=Object(g.a)(b,(function(e){return e.get(\"authorized\")||Object(y.Map)()})),C=function(e,t){return function(e){var n,r=e.authSelectors.authorized();return y.List.isList(t)?!!u()(n=t.toJS()).call(n,(function(e){var t,n;return-1===f()(t=d()(n=v()(e)).call(n,(function(e){return!!r.get(e)}))).call(t,!1)})).length:null}},A=Object(g.a)(b,(function(e){return e.get(\"configs\")}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"execute\",(function(){return a}));var r=n(24),o=n.n(r),a=function(e,t){var n=t.authSelectors,r=t.specSelectors;return function(t){var a=t.path,i=t.method,s=t.operation,u=t.extras,c={authorized:n.authorized()&&n.authorized().toJS(),definitions:r.securityDefinitions()&&r.securityDefinitions().toJS(),specSecurity:r.security()&&r.security().toJS()};return e(o()({path:a,method:i,operation:s,securities:c},u))}}},function(e,t,n){\"use strict\";n.r(t);var r=n(5);t.default=function(){return{fn:{shallowEqualKeys:r.G}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return v}));var r=n(20),o=n.n(r),a=n(95),i=n.n(a),s=n(2),u=n.n(s),c=n(17),l=n.n(c),p=n(32),f=n.n(p),h=n(16),d=n(1),m=n(26);function v(e){var t=e.fn;return{statePlugins:{spec:{actions:{download:function(e){return function(n){var r=n.errActions,a=n.specSelectors,s=n.specActions,c=n.getConfigs,l=t.fetch,p=c();function f(t){if(t instanceof Error||t.status>=400)return s.updateLoadingStatus(\"failed\"),r.newThrownErr(o()(new Error((t.message||t.statusText)+\" \"+e),{source:\"fetch\"})),void(!t.status&&t instanceof Error&&function(){try{var t;if(\"URL\"in m.a?t=new i.a(e):(t=document.createElement(\"a\")).href=e,\"https:\"!==t.protocol&&\"https:\"===m.a.location.protocol){var n=o()(new Error(\"Possible mixed-content issue? The page was loaded over https:// but a \".concat(t.protocol,\"// URL was specified. Check that you are not attempting to load mixed content.\")),{source:\"fetch\"});return void r.newThrownErr(n)}if(t.origin!==m.a.location.origin){var a,s=o()(new Error(u()(a=\"Possible cross-origin (CORS) issue? The URL origin (\".concat(t.origin,\") does not match the page (\")).call(a,m.a.location.origin,\"). Check the server returns the correct 'Access-Control-Allow-*' headers.\")),{source:\"fetch\"});r.newThrownErr(s)}}catch(e){return}}());s.updateLoadingStatus(\"success\"),s.updateSpec(t.text),a.url()!==e&&s.updateUrl(e)}e=e||a.url(),s.updateLoadingStatus(\"loading\"),r.clear({source:\"fetch\"}),l({url:e,loadSpec:!0,requestInterceptor:p.requestInterceptor||function(e){return e},responseInterceptor:p.responseInterceptor||function(e){return e},credentials:\"same-origin\",headers:{Accept:\"application/json,*/*\"}}).then(f,f)}},updateLoadingStatus:function(e){var t,n=[null,\"loading\",\"failed\",\"success\",\"failedConfig\"];-1===l()(n).call(n,e)&&console.error(u()(t=\"Error: \".concat(e,\" is not one of \")).call(t,f()(n)));return{type:\"spec_update_loading_status\",payload:e}}},reducers:{spec_update_loading_status:function(e,t){return\"string\"==typeof t.payload?e.set(\"loadingStatus\",t.payload):e}},selectors:{loadingStatus:Object(h.a)((function(e){return e||Object(d.Map)()}),(function(e){return e.get(\"loadingStatus\")||null}))}}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"downloadConfig\",(function(){return o})),n.d(t,\"getConfigByUrl\",(function(){return a}));var r=n(170),o=function(e){return function(t){return(0,t.fn.fetch)(e)}},a=function(e,t){return function(n){var o=n.specActions;if(e)return o.downloadConfig(e).then(a,a);function a(n){n instanceof Error||n.status>=400?(o.updateLoadingStatus(\"failedConfig\"),o.updateLoadingStatus(\"failedConfig\"),o.updateUrl(\"\"),console.error(n.statusText+\" \"+e.url),t(null)):t(Object(r.parseYamlConfig)(n.text))}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"get\",(function(){return a}));var r=n(22),o=n.n(r),a=function(e,t){return e.getIn(o()(t)?t:[t])}},function(e,t,n){\"use strict\";n.r(t);var r,o=n(3),a=n.n(o),i=n(1),s=n(148);t.default=(r={},a()(r,s.UPDATE_CONFIGS,(function(e,t){return e.merge(Object(i.fromJS)(t.payload))})),a()(r,s.TOGGLE_CONFIGS,(function(e,t){var n=t.payload,r=e.get(n);return e.set(n,!r)})),r)},function(e,t,n){\"use strict\";n.r(t);var r=n(315),o=n(316),a=n(317);t.default=function(){return[r.default,{statePlugins:{configs:{wrapActions:{loaded:function(e,t){return function(){e.apply(void 0,arguments);var n=decodeURIComponent(window.location.hash);t.layoutActions.parseDeepLinkHash(n)}}}}},wrapComponents:{operation:o.default,OperationTag:a.default}}]}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"show\",(function(){return A})),n.d(t,\"scrollTo\",(function(){return k})),n.d(t,\"parseDeepLinkHash\",(function(){return O})),n.d(t,\"readyToScroll\",(function(){return j})),n.d(t,\"scrollToElement\",(function(){return T})),n.d(t,\"clearScrollTo\",(function(){return I}));var r,o=n(3),a=n.n(o),i=n(13),s=n.n(i),u=n(22),c=n.n(u),l=n(2),p=n.n(l),f=n(19),h=n.n(f),d=n(4),m=n.n(d),v=n(17),g=n.n(v),y=n(174),b=n(537),_=n.n(b),w=n(5),x=n(1),E=n.n(x),S=\"layout_scroll_to\",C=\"layout_clear_scroll\",A=function(e,t){var n=t.getConfigs,r=t.layoutSelectors;return function(){for(var t=arguments.length,o=new Array(t),a=0;a<t;a++)o[a]=arguments[a];if(e.apply(void 0,o),n().deepLinking)try{var i=o[0],u=o[1];i=c()(i)?i:[i];var l=r.urlHashArrayFromIsShownKey(i);if(!l.length)return;var f,h=s()(l,2),d=h[0],m=h[1];if(!u)return Object(y.setHash)(\"/\");if(2===l.length)Object(y.setHash)(Object(w.d)(p()(f=\"/\".concat(encodeURIComponent(d),\"/\")).call(f,encodeURIComponent(m))));else 1===l.length&&Object(y.setHash)(Object(w.d)(\"/\".concat(encodeURIComponent(d))))}catch(e){console.error(e)}}},k=function(e){return{type:S,payload:c()(e)?e:[e]}},O=function(e){return function(t){var n=t.layoutActions,r=t.layoutSelectors;if((0,t.getConfigs)().deepLinking&&e){var o,a=h()(e).call(e,1);\"!\"===a[0]&&(a=h()(a).call(a,1)),\"/\"===a[0]&&(a=h()(a).call(a,1));var i=m()(o=a.split(\"/\")).call(o,(function(e){return e||\"\"})),u=r.isShownKeyFromUrlHashArray(i),c=s()(u,3),l=c[0],p=c[1],f=void 0===p?\"\":p,d=c[2],v=void 0===d?\"\":d;if(\"operations\"===l){var y=r.isShownKeyFromUrlHashArray([f]);g()(f).call(f,\"_\")>-1&&(console.warn(\"Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead.\"),n.show(m()(y).call(y,(function(e){return e.replace(/_/g,\" \")})),!0)),n.show(y,!0)}(g()(f).call(f,\"_\")>-1||g()(v).call(v,\"_\")>-1)&&(console.warn(\"Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead.\"),n.show(m()(u).call(u,(function(e){return e.replace(/_/g,\" \")})),!0)),n.show(u,!0),n.scrollTo(u)}}},j=function(e,t){return function(n){var r=n.layoutSelectors.getScrollToKey();E.a.is(r,Object(x.fromJS)(e))&&(n.layoutActions.scrollToElement(t),n.layoutActions.clearScrollTo())}},T=function(e,t){return function(n){try{t=t||n.fn.getScrollParent(e),_.a.createScroller(t).to(e)}catch(e){console.error(e)}}},I=function(){return{type:C}};t.default={fn:{getScrollParent:function(e,t){var n=document.documentElement,r=getComputedStyle(e),o=\"absolute\"===r.position,a=t?/(auto|scroll|hidden)/:/(auto|scroll)/;if(\"fixed\"===r.position)return n;for(var i=e;i=i.parentElement;)if(r=getComputedStyle(i),(!o||\"static\"!==r.position)&&a.test(r.overflow+r.overflowY+r.overflowX))return i;return n}},statePlugins:{layout:{actions:{scrollToElement:T,scrollTo:k,clearScrollTo:I,readyToScroll:j,parseDeepLinkHash:O},selectors:{getScrollToKey:function(e){return e.get(\"scrollToKey\")},isShownKeyFromUrlHashArray:function(e,t){var n=s()(t,2),r=n[0],o=n[1];return o?[\"operations\",r,o]:r?[\"operations-tag\",r]:[]},urlHashArrayFromIsShownKey:function(e,t){var n=s()(t,3),r=n[0],o=n[1],a=n[2];return\"operations\"==r?[o,a]:\"operations-tag\"==r?[o]:[]}},reducers:(r={},a()(r,S,(function(e,t){return e.set(\"scrollToKey\",E.a.fromJS(t.payload))})),a()(r,C,(function(e){return e.delete(\"scrollToKey\")})),r),wrapActions:{show:A}}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(6),o=n.n(r),a=n(7),i=n.n(a),s=n(10),u=n.n(s),c=n(8),l=n.n(c),p=n(9),f=n.n(p),h=n(3),d=n.n(h),m=n(2),v=n.n(m),g=n(0),y=n.n(g);n(27);t.default=function(e,t){return function(n){l()(a,n);var r=f()(a);function a(){var e,n;o()(this,a);for(var i=arguments.length,s=new Array(i),c=0;c<i;c++)s[c]=arguments[c];return n=r.call.apply(r,v()(e=[this]).call(e,s)),d()(u()(n),\"onLoad\",(function(e){var r=n.props.operation,o=r.toObject(),a=o.tag,i=o.operationId,s=r.toObject().isShownKey;s=s||[\"operations\",a,i],t.layoutActions.readyToScroll(s,e)})),n}return i()(a,[{key:\"render\",value:function(){return y.a.createElement(\"span\",{ref:this.onLoad},y.a.createElement(e,this.props))}}]),a}(y.a.Component)}},function(e,t,n){\"use strict\";n.r(t);var r=n(6),o=n.n(r),a=n(7),i=n.n(a),s=n(10),u=n.n(s),c=n(8),l=n.n(c),p=n(9),f=n.n(p),h=n(3),d=n.n(h),m=n(2),v=n.n(m),g=n(0),y=n.n(g);n(11);t.default=function(e,t){return function(n){l()(a,n);var r=f()(a);function a(){var e,n;o()(this,a);for(var i=arguments.length,s=new Array(i),c=0;c<i;c++)s[c]=arguments[c];return n=r.call.apply(r,v()(e=[this]).call(e,s)),d()(u()(n),\"onLoad\",(function(e){var r=[\"operations-tag\",n.props.tag];t.layoutActions.readyToScroll(r,e)})),n}return i()(a,[{key:\"render\",value:function(){return y.a.createElement(\"span\",{ref:this.onLoad},y.a.createElement(e,this.props))}}]),a}(y.a.Component)}},function(e,t,n){\"use strict\";n.r(t);var r=n(319);t.default=function(){return{fn:{opsFilter:r.default}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(12),o=n.n(r),a=n(17),i=n.n(a);t.default=function(e,t){return o()(e).call(e,(function(e,n){return-1!==i()(n).call(n,t)}))}},function(e,t,n){\"use strict\";n.r(t);var r=n(218),o=n.n(r),a=!1;t.default=function(){return{statePlugins:{spec:{wrapActions:{updateSpec:function(e){return function(){return a=!0,e.apply(void 0,arguments)}},updateJsonSpec:function(e,t){return function(){var n=t.getConfigs().onComplete;return a&&\"function\"==typeof n&&(o()(n,0),a=!1),e.apply(void 0,arguments)}}}}}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(322),o=n(323),a=n(324),i=n(325),s=n(333),u=n(54),c=n(340),l=n(341);t.default=function(){return{components:i.default,wrapComponents:s.default,statePlugins:{spec:{wrapSelectors:r,selectors:a},auth:{wrapSelectors:o},oas3:{actions:u,reducers:l.default,selectors:c}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"definitions\",(function(){return h})),n.d(t,\"hasHost\",(function(){return d})),n.d(t,\"securityDefinitions\",(function(){return m})),n.d(t,\"host\",(function(){return v})),n.d(t,\"basePath\",(function(){return g})),n.d(t,\"consumes\",(function(){return y})),n.d(t,\"produces\",(function(){return b})),n.d(t,\"schemes\",(function(){return _})),n.d(t,\"servers\",(function(){return w})),n.d(t,\"isOAS3\",(function(){return x})),n.d(t,\"isSwagger2\",(function(){return E}));var r=n(16),o=n(93),a=n(1),i=n(35);function s(e){return function(t,n){return function(){var r=n.getSystem().specSelectors.specJson();return Object(i.isOAS3)(r)?e.apply(void 0,arguments):t.apply(void 0,arguments)}}}var u=function(e){return e||Object(a.Map)()},c=s(Object(r.a)((function(){return null}))),l=Object(r.a)(u,(function(e){return e.get(\"json\",Object(a.Map)())})),p=Object(r.a)(u,(function(e){return e.get(\"resolved\",Object(a.Map)())})),f=function(e){var t=p(e);return t.count()<1&&(t=l(e)),t},h=s(Object(r.a)(f,(function(e){var t=e.getIn([\"components\",\"schemas\"]);return a.Map.isMap(t)?t:Object(a.Map)()}))),d=s((function(e){return f(e).hasIn([\"servers\",0])})),m=s(Object(r.a)(o.specJsonWithResolvedSubtrees,(function(e){return e.getIn([\"components\",\"securitySchemes\"])||null}))),v=c,g=c,y=c,b=c,_=c,w=s(Object(r.a)(f,(function(e){return e.getIn([\"servers\"])||Object(a.Map)()}))),x=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return Object(i.isOAS3)(a.Map.isMap(e)?e:Object(a.Map)())}},E=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return Object(i.isSwagger2)(a.Map.isMap(e)?e:Object(a.Map)())}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"definitionsToAuthorize\",(function(){return b}));var r=n(3),o=n.n(r),a=n(13),i=n.n(a),s=n(2),u=n.n(s),c=n(23),l=n.n(c),p=n(12),f=n.n(p),h=n(29),d=n.n(h),m=n(16),v=n(1),g=n(35);var y,b=(y=Object(m.a)((function(e){return e}),(function(e){return e.specSelectors.securityDefinitions()}),(function(e,t){var n,r=Object(v.List)();return t?(l()(n=t.entrySeq()).call(n,(function(e){var t,n=i()(e,2),a=n[0],s=n[1],u=s.get(\"type\");if(\"oauth2\"===u&&l()(t=s.get(\"flows\").entrySeq()).call(t,(function(e){var t=i()(e,2),n=t[0],u=t[1],c=Object(v.fromJS)({flow:n,authorizationUrl:u.get(\"authorizationUrl\"),tokenUrl:u.get(\"tokenUrl\"),scopes:u.get(\"scopes\"),type:s.get(\"type\"),description:s.get(\"description\")});r=r.push(new v.Map(o()({},a,f()(c).call(c,(function(e){return void 0!==e})))))})),\"http\"!==u&&\"apiKey\"!==u||(r=r.push(new v.Map(o()({},a,s)))),\"openIdConnect\"===u&&s.get(\"openIdConnectData\")){var c=s.get(\"openIdConnectData\"),p=c.get(\"grant_types_supported\")||[\"authorization_code\",\"implicit\"];l()(p).call(p,(function(e){var t,n=c.get(\"scopes_supported\")&&d()(t=c.get(\"scopes_supported\")).call(t,(function(e,t){return e.set(t,\"\")}),new v.Map),i=Object(v.fromJS)({flow:e,authorizationUrl:c.get(\"authorization_endpoint\"),tokenUrl:c.get(\"token_endpoint\"),scopes:n,type:\"oauth2\",openIdConnectUrl:s.get(\"openIdConnectUrl\")});r=r.push(new v.Map(o()({},a,f()(i).call(i,(function(e){return void 0!==e})))))}))}})),r):r})),function(e,t){return function(){for(var n=t.getSystem().specSelectors.specJson(),r=arguments.length,o=new Array(r),a=0;a<r;a++)o[a]=arguments[a];if(Object(g.isOAS3)(n)){var i,s=t.getState().getIn([\"spec\",\"resolvedSubtrees\",\"components\",\"securitySchemes\"]);return y.apply(void 0,u()(i=[t,s]).call(i,o))}return e.apply(void 0,o)}})},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"servers\",(function(){return l})),n.d(t,\"isSwagger2\",(function(){return p}));var r=n(16),o=n(1),a=n(35);var i,s=function(e){return e||Object(o.Map)()},u=Object(r.a)(s,(function(e){return e.get(\"json\",Object(o.Map)())})),c=Object(r.a)(s,(function(e){return e.get(\"resolved\",Object(o.Map)())})),l=(i=Object(r.a)((function(e){var t=c(e);return t.count()<1&&(t=u(e)),t}),(function(e){return e.getIn([\"servers\"])||Object(o.Map)()})),function(){return function(e){var t=e.getSystem().specSelectors.specJson();if(Object(a.isOAS3)(t)){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return i.apply(void 0,r)}return null}}),p=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return Object(a.isSwagger2)(e)}}},function(e,t,n){\"use strict\";n.r(t);var r=n(326),o=n(171),a=n(327),i=n(328),s=n(329),u=n(330),c=n(331),l=n(332);t.default={Callbacks:r.default,HttpAuth:c.default,RequestBody:o.default,Servers:i.default,ServersContainer:s.default,RequestBodyEditor:u.default,OperationServers:l.default,operationLink:a.default}},function(e,t,n){\"use strict\";n.r(t);var r=n(28),o=n.n(r),a=n(13),i=n.n(a),s=n(4),u=n.n(s),c=n(0),l=n.n(c),p=(n(11),n(27),n(1));t.default=function(e){var t,n=e.callbacks,r=e.getComponent,a=e.specPath,s=r(\"OperationContainer\",!0);if(!n)return l.a.createElement(\"span\",null,\"No callbacks\");var c=u()(t=n.entrySeq()).call(t,(function(t){var n,r=i()(t,2),c=r[0],f=r[1];return l.a.createElement(\"div\",{key:c},l.a.createElement(\"h2\",null,c),u()(n=f.entrySeq()).call(n,(function(t){var n,r=i()(t,2),f=r[0],h=r[1];return\"$$ref\"===f?null:l.a.createElement(\"div\",{key:f},u()(n=h.entrySeq()).call(n,(function(t){var n=i()(t,2),r=n[0],u=n[1];if(\"$$ref\"===r)return null;var h=Object(p.fromJS)({operation:u});return l.a.createElement(s,o()({},e,{op:h,key:r,tag:\"\",method:r,path:f,specPath:a.push(c,f,r),allowTryItOut:!1}))})))})))}));return l.a.createElement(\"div\",null,c)}},function(e,t,n){\"use strict\";n.r(t);var r=n(6),o=n.n(r),a=n(7),i=n.n(a),s=n(8),u=n.n(s),c=n(9),l=n.n(c),p=n(32),f=n.n(p),h=n(4),d=n.n(h),m=n(0),v=n.n(m),g=(n(11),n(27),function(e){u()(n,e);var t=l()(n);function n(){return o()(this,n),t.apply(this,arguments)}return i()(n,[{key:\"render\",value:function(){var e=this.props,t=e.link,n=e.name,r=(0,e.getComponent)(\"Markdown\",!0),o=t.get(\"operationId\")||t.get(\"operationRef\"),a=t.get(\"parameters\")&&t.get(\"parameters\").toJS(),i=t.get(\"description\");return v.a.createElement(\"div\",{className:\"operation-link\"},v.a.createElement(\"div\",{className:\"description\"},v.a.createElement(\"b\",null,v.a.createElement(\"code\",null,n)),i?v.a.createElement(r,{source:i}):null),v.a.createElement(\"pre\",null,\"Operation `\",o,\"`\",v.a.createElement(\"br\",null),v.a.createElement(\"br\",null),\"Parameters \",function(e,t){var n;if(\"string\"!=typeof t)return\"\";return d()(n=t.split(\"\\n\")).call(n,(function(t,n){return n>0?Array(e+1).join(\" \")+t:t})).join(\"\\n\")}(0,f()(a,null,2))||\"{}\",v.a.createElement(\"br\",null)))}}]),n}(m.Component));t.default=g},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return A}));var r=n(13),o=n.n(r),a=n(6),i=n.n(a),s=n(7),u=n.n(s),c=n(10),l=n.n(c),p=n(8),f=n.n(p),h=n(9),d=n.n(h),m=n(3),v=n.n(m),g=n(2),y=n.n(g),b=n(64),_=n.n(b),w=n(4),x=n.n(w),E=n(0),S=n.n(E),C=n(1),A=(n(11),n(27),function(e){f()(n,e);var t=d()(n);function n(){var e,r;i()(this,n);for(var o=arguments.length,a=new Array(o),s=0;s<o;s++)a[s]=arguments[s];return r=t.call.apply(t,y()(e=[this]).call(e,a)),v()(l()(r),\"onServerChange\",(function(e){r.setServer(e.target.value)})),v()(l()(r),\"onServerVariableValueChange\",(function(e){var t=r.props,n=t.setServerVariableValue,o=t.currentServer,a=e.target.getAttribute(\"data-variable\"),i=e.target.value;\"function\"==typeof n&&n({server:o,key:a,val:i})})),v()(l()(r),\"setServer\",(function(e){(0,r.props.setSelectedServer)(e)})),r}return u()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.servers;e.currentServer||this.setServer(t.first().get(\"url\"))}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.servers,n=e.setServerVariableValue,r=e.getServerVariable;if(this.props.currentServer!==e.currentServer||this.props.servers!==e.servers){var o=_()(t).call(t,(function(t){return t.get(\"url\")===e.currentServer}));if(!o)return this.setServer(t.first().get(\"url\"));var a=o.get(\"variables\")||Object(C.OrderedMap)();x()(a).call(a,(function(t,o){r(e.currentServer,o)||n({server:e.currentServer,key:o,val:t.get(\"default\")||\"\"})}))}}},{key:\"render\",value:function(){var e,t,n=this,r=this.props,a=r.servers,i=r.currentServer,s=r.getServerVariable,u=r.getEffectiveServerValue,c=(_()(a).call(a,(function(e){return e.get(\"url\")===i}))||Object(C.OrderedMap)()).get(\"variables\")||Object(C.OrderedMap)(),l=0!==c.size;return S.a.createElement(\"div\",{className:\"servers\"},S.a.createElement(\"label\",{htmlFor:\"servers\"},S.a.createElement(\"select\",{onChange:this.onServerChange,value:i},x()(e=a.valueSeq()).call(e,(function(e){return S.a.createElement(\"option\",{value:e.get(\"url\"),key:e.get(\"url\")},e.get(\"url\"),e.get(\"description\")&&\" - \".concat(e.get(\"description\")))})).toArray())),l?S.a.createElement(\"div\",null,S.a.createElement(\"div\",{className:\"computed-url\"},\"Computed URL:\",S.a.createElement(\"code\",null,u(i))),S.a.createElement(\"h4\",null,\"Server variables\"),S.a.createElement(\"table\",null,S.a.createElement(\"tbody\",null,x()(t=c.entrySeq()).call(t,(function(e){var t,r=o()(e,2),a=r[0],u=r[1];return S.a.createElement(\"tr\",{key:a},S.a.createElement(\"td\",null,a),S.a.createElement(\"td\",null,u.get(\"enum\")?S.a.createElement(\"select\",{\"data-variable\":a,onChange:n.onServerVariableValueChange},x()(t=u.get(\"enum\")).call(t,(function(e){return S.a.createElement(\"option\",{selected:e===s(i,a),key:e,value:e},e)}))):S.a.createElement(\"input\",{type:\"text\",value:s(i,a)||\"\",onChange:n.onServerVariableValueChange,\"data-variable\":a})))}))))):null)}}]),n}(S.a.Component))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return h}));var r=n(6),o=n.n(r),a=n(7),i=n.n(a),s=n(8),u=n.n(s),c=n(9),l=n.n(c),p=n(0),f=n.n(p),h=(n(11),function(e){u()(n,e);var t=l()(n);function n(){return o()(this,n),t.apply(this,arguments)}return i()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.oas3Selectors,r=e.oas3Actions,o=e.getComponent,a=t.servers(),i=o(\"Servers\");return a&&a.size?f.a.createElement(\"div\",null,f.a.createElement(\"span\",{className:\"servers-title\"},\"Servers\"),f.a.createElement(i,{servers:a,currentServer:n.selectedServer(),setSelectedServer:r.setSelectedServer,setServerVariableValue:r.setServerVariableValue,getServerVariable:n.serverVariableValue,getEffectiveServerValue:n.serverEffectiveValue})):null}}]),n}(f.a.Component))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return w}));var r=n(6),o=n.n(r),a=n(7),i=n.n(a),s=n(10),u=n.n(s),c=n(8),l=n.n(c),p=n(9),f=n.n(p),h=n(3),d=n.n(h),m=n(0),v=n.n(m),g=(n(11),n(63)),y=n.n(g),b=n(5),_=Function.prototype,w=function(e){l()(n,e);var t=f()(n);function n(e,r){var a;return o()(this,n),a=t.call(this,e,r),d()(u()(a),\"applyDefaultValue\",(function(e){var t=e||a.props,n=t.onChange,r=t.defaultValue;return a.setState({value:r}),n(r)})),d()(u()(a),\"onChange\",(function(e){a.props.onChange(Object(b.I)(e))})),d()(u()(a),\"onDomChange\",(function(e){var t=e.target.value;a.setState({value:t},(function(){return a.onChange(t)}))})),a.state={value:Object(b.I)(e.value)||e.defaultValue},e.onChange(e.value),a}return i()(n,[{key:\"componentWillReceiveProps\",value:function(e){this.props.value!==e.value&&e.value!==this.state.value&&this.setState({value:Object(b.I)(e.value)}),!e.value&&e.defaultValue&&this.state.value&&this.applyDefaultValue(e)}},{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.errors,r=this.state.value,o=n.size>0,a=t(\"TextArea\");return v.a.createElement(\"div\",{className:\"body-param\"},v.a.createElement(a,{className:y()(\"body-param__text\",{invalid:o}),title:n.size?n.join(\", \"):\"\",value:r,onChange:this.onDomChange}))}}]),n}(m.PureComponent);d()(w,\"defaultProps\",{onChange:_,userHasEditedBody:!1})},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return E}));var r=n(6),o=n.n(r),a=n(7),i=n.n(a),s=n(10),u=n.n(s),c=n(8),l=n.n(c),p=n(9),f=n.n(p),h=n(3),d=n.n(h),m=n(20),v=n.n(m),g=n(12),y=n.n(g),b=n(4),_=n.n(b),w=n(0),x=n.n(w),E=(n(11),function(e){l()(n,e);var t=f()(n);function n(e,r){var a;o()(this,n),a=t.call(this,e,r),d()(u()(a),\"onChange\",(function(e){var t=a.props.onChange,n=e.target,r=n.value,o=n.name,i=v()({},a.state.value);o?i[o]=r:i=r,a.setState({value:i},(function(){return t(a.state)}))}));var i=a.props,s=i.name,c=i.schema,l=a.getValue();return a.state={name:s,schema:c,value:l},a}return i()(n,[{key:\"getValue\",value:function(){var e=this.props,t=e.name,n=e.authorized;return n&&n.getIn([t,\"value\"])}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.schema,o=n.getComponent,a=n.errSelectors,i=n.name,s=o(\"Input\"),u=o(\"Row\"),c=o(\"Col\"),l=o(\"authError\"),p=o(\"Markdown\",!0),f=o(\"JumpToPath\",!0),h=(r.get(\"scheme\")||\"\").toLowerCase(),d=this.getValue(),m=y()(e=a.allErrors()).call(e,(function(e){return e.get(\"authId\")===i}));if(\"basic\"===h){var v,g=d?d.get(\"username\"):null;return x.a.createElement(\"div\",null,x.a.createElement(\"h4\",null,x.a.createElement(\"code\",null,i||r.get(\"name\")),\"  (http, Basic)\",x.a.createElement(f,{path:[\"securityDefinitions\",i]})),g&&x.a.createElement(\"h6\",null,\"Authorized\"),x.a.createElement(u,null,x.a.createElement(p,{source:r.get(\"description\")})),x.a.createElement(u,null,x.a.createElement(\"label\",null,\"Username:\"),g?x.a.createElement(\"code\",null,\" \",g,\" \"):x.a.createElement(c,null,x.a.createElement(s,{type:\"text\",required:\"required\",name:\"username\",onChange:this.onChange,autoFocus:!0}))),x.a.createElement(u,null,x.a.createElement(\"label\",null,\"Password:\"),g?x.a.createElement(\"code\",null,\" ****** \"):x.a.createElement(c,null,x.a.createElement(s,{autoComplete:\"new-password\",name:\"password\",type:\"password\",onChange:this.onChange}))),_()(v=m.valueSeq()).call(v,(function(e,t){return x.a.createElement(l,{error:e,key:t})})))}return\"bearer\"===h?x.a.createElement(\"div\",null,x.a.createElement(\"h4\",null,x.a.createElement(\"code\",null,i||r.get(\"name\")),\"  (http, Bearer)\",x.a.createElement(f,{path:[\"securityDefinitions\",i]})),d&&x.a.createElement(\"h6\",null,\"Authorized\"),x.a.createElement(u,null,x.a.createElement(p,{source:r.get(\"description\")})),x.a.createElement(u,null,x.a.createElement(\"label\",null,\"Value:\"),d?x.a.createElement(\"code\",null,\" ****** \"):x.a.createElement(c,null,x.a.createElement(s,{type:\"text\",onChange:this.onChange,autoFocus:!0}))),_()(t=m.valueSeq()).call(t,(function(e,t){return x.a.createElement(l,{error:e,key:t})}))):x.a.createElement(\"div\",null,x.a.createElement(\"em\",null,x.a.createElement(\"b\",null,i),\" HTTP authentication: unsupported scheme \",\"'\".concat(h,\"'\")))}}]),n}(x.a.Component))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return w}));var r=n(24),o=n.n(r),a=n(6),i=n.n(a),s=n(7),u=n.n(s),c=n(10),l=n.n(c),p=n(8),f=n.n(p),h=n(9),d=n.n(h),m=n(3),v=n.n(m),g=n(2),y=n.n(g),b=n(0),_=n.n(b),w=(n(11),n(27),function(e){f()(n,e);var t=d()(n);function n(){var e,r;i()(this,n);for(var a=arguments.length,s=new Array(a),u=0;u<a;u++)s[u]=arguments[u];return r=t.call.apply(t,y()(e=[this]).call(e,s)),v()(l()(r),\"setSelectedServer\",(function(e){var t,n=r.props,o=n.path,a=n.method;return r.forceUpdate(),r.props.setSelectedServer(e,y()(t=\"\".concat(o,\":\")).call(t,a))})),v()(l()(r),\"setServerVariableValue\",(function(e){var t,n=r.props,a=n.path,i=n.method;return r.forceUpdate(),r.props.setServerVariableValue(o()(o()({},e),{},{namespace:y()(t=\"\".concat(a,\":\")).call(t,i)}))})),v()(l()(r),\"getSelectedServer\",(function(){var e,t=r.props,n=t.path,o=t.method;return r.props.getSelectedServer(y()(e=\"\".concat(n,\":\")).call(e,o))})),v()(l()(r),\"getServerVariable\",(function(e,t){var n,o=r.props,a=o.path,i=o.method;return r.props.getServerVariable({namespace:y()(n=\"\".concat(a,\":\")).call(n,i),server:e},t)})),v()(l()(r),\"getEffectiveServerValue\",(function(e){var t,n=r.props,o=n.path,a=n.method;return r.props.getEffectiveServerValue({server:e,namespace:y()(t=\"\".concat(o,\":\")).call(t,a)})})),r}return u()(n,[{key:\"render\",value:function(){var e=this.props,t=e.operationServers,n=e.pathServers,r=e.getComponent;if(!t&&!n)return null;var o=r(\"Servers\"),a=t||n,i=t?\"operation\":\"path\";return _.a.createElement(\"div\",{className:\"opblock-section operation-servers\"},_.a.createElement(\"div\",{className:\"opblock-section-header\"},_.a.createElement(\"div\",{className:\"tab-header\"},_.a.createElement(\"h4\",{className:\"opblock-title\"},\"Servers\"))),_.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},_.a.createElement(\"h4\",{className:\"message\"},\"These \",i,\"-level options override the global server options.\"),_.a.createElement(o,{servers:a,currentServer:this.getSelectedServer(),setSelectedServer:this.setSelectedServer,setServerVariableValue:this.setServerVariableValue,getServerVariable:this.getServerVariable,getEffectiveServerValue:this.getEffectiveServerValue})))}}]),n}(_.a.Component))},function(e,t,n){\"use strict\";n.r(t);var r=n(334),o=n(335),a=n(336),i=n(337),s=n(338),u=n(339);t.default={Markdown:r.default,AuthItem:o.default,JsonSchema_string:u.default,VersionStamp:a.default,model:s.default,onlineValidatorBadge:i.default}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"Markdown\",(function(){return h}));var r=n(101),o=n.n(r),a=n(0),i=n.n(a),s=(n(11),n(63)),u=n.n(s),c=n(220),l=n(35),p=n(221),f=new c.a(\"commonmark\");f.block.ruler.enable([\"table\"]),f.set({linkTarget:\"_blank\"});var h=function(e){var t=e.source,n=e.className,r=void 0===n?\"\":n,a=e.getConfigs;if(\"string\"!=typeof t)return null;if(t){var s,c=a().useUnsafeMarkdown,l=f.render(t),h=Object(p.b)(l,{useUnsafeMarkdown:c});return\"string\"==typeof h&&(s=o()(h).call(h)),i.a.createElement(\"div\",{dangerouslySetInnerHTML:{__html:s},className:u()(r,\"renderedMarkdown\")})}return null};h.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}},t.default=Object(l.OAS3ComponentWrapFactory)(h)},function(e,t,n){\"use strict\";n.r(t);var r=n(53),o=n.n(r),a=n(0),i=n.n(a),s=n(35),u=[\"Ori\"];t.default=Object(s.OAS3ComponentWrapFactory)((function(e){var t=e.Ori,n=o()(e,u),r=n.schema,a=n.getComponent,s=n.errSelectors,c=n.authorized,l=n.onAuthChange,p=n.name,f=a(\"HttpAuth\");return\"http\"===r.get(\"type\")?i.a.createElement(f,{key:p,schema:r,name:p,errSelectors:s,authorized:c,getComponent:a,onChange:l}):i.a.createElement(t,n)}))},function(e,t,n){\"use strict\";n.r(t);var r=n(0),o=n.n(r),a=n(35);t.default=Object(a.OAS3ComponentWrapFactory)((function(e){var t=e.Ori;return o.a.createElement(\"span\",null,o.a.createElement(t,e),o.a.createElement(\"small\",{className:\"version-stamp\"},o.a.createElement(\"pre\",{className:\"version\"},\"OAS3\")))}))},function(e,t,n){\"use strict\";n.r(t);var r=n(35),o=n(219);t.default=Object(r.OAS3ComponentWrapFactory)(o.a)},function(e,t,n){\"use strict\";n.r(t);var r=n(28),o=n.n(r),a=n(6),i=n.n(a),s=n(7),u=n.n(s),c=n(8),l=n.n(c),p=n(9),f=n.n(p),h=n(0),d=n.n(h),m=(n(11),n(35)),v=n(222),g=function(e){l()(n,e);var t=f()(n);function n(){return i()(this,n),t.apply(this,arguments)}return u()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getConfigs,n=[\"model-box\"],r=null;return!0===e.schema.get(\"deprecated\")&&(n.push(\"deprecated\"),r=d.a.createElement(\"span\",{className:\"model-deprecated-warning\"},\"Deprecated:\")),d.a.createElement(\"div\",{className:n.join(\" \")},r,d.a.createElement(v.a,o()({},this.props,{getConfigs:t,depth:1,expandDepth:this.props.expandDepth||0})))}}]),n}(h.Component);t.default=Object(m.OAS3ComponentWrapFactory)(g)},function(e,t,n){\"use strict\";n.r(t);var r=n(53),o=n.n(r),a=n(0),i=n.n(a),s=n(35),u=[\"Ori\"];t.default=Object(s.OAS3ComponentWrapFactory)((function(e){var t=e.Ori,n=o()(e,u),r=n.schema,a=n.getComponent,s=n.errors,c=n.onChange,l=r&&r.get?r.get(\"format\"):null,p=r&&r.get?r.get(\"type\"):null,f=a(\"Input\");return p&&\"string\"===p&&l&&(\"binary\"===l||\"base64\"===l)?i.a.createElement(f,{type:\"file\",className:s.length?\"invalid\":\"\",title:s.length?s:\"\",onChange:function(e){c(e.target.files[0])},disabled:t.isDisabled}):i.a.createElement(t,n)}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"selectedServer\",(function(){return w})),n.d(t,\"requestBodyValue\",(function(){return x})),n.d(t,\"shouldRetainRequestBodyValue\",(function(){return E})),n.d(t,\"hasUserEditedBody\",(function(){return S})),n.d(t,\"requestBodyInclusionSetting\",(function(){return C})),n.d(t,\"requestBodyErrors\",(function(){return A})),n.d(t,\"activeExamplesMember\",(function(){return k})),n.d(t,\"requestContentType\",(function(){return O})),n.d(t,\"responseContentType\",(function(){return j})),n.d(t,\"serverVariableValue\",(function(){return T})),n.d(t,\"serverVariables\",(function(){return I})),n.d(t,\"serverEffectiveValue\",(function(){return P})),n.d(t,\"validateBeforeExecute\",(function(){return N})),n.d(t,\"validateShallowRequired\",(function(){return M}));var r=n(14),o=n.n(r),a=n(2),i=n.n(a),s=n(4),u=n.n(s),c=n(23),l=n.n(c),p=n(15),f=n.n(p),h=n(17),d=n.n(h),m=n(1),v=n(35),g=n(171),y=n(5);function b(e){return function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return function(t){var r=t.getSystem().specSelectors.specJson();return Object(v.isOAS3)(r)?e.apply(void 0,n):null}}}var _,w=b((function(e,t){var n=t?[t,\"selectedServer\"]:[\"selectedServer\"];return e.getIn(n)||\"\"})),x=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"bodyValue\"])||null})),E=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"retainBodyValue\"])||!1})),S=function(e,t,n){return function(e){var r=e.getSystem(),o=r.oas3Selectors,a=r.specSelectors,i=a.specJson();if(Object(v.isOAS3)(i)){var s=!1,u=o.requestContentType(t,n),c=o.requestBodyValue(t,n);if(m.Map.isMap(c)&&(c=Object(y.I)(c.mapEntries((function(e){return m.Map.isMap(e[1])?[e[0],e[1].get(\"value\")]:e})).toJS())),m.List.isList(c)&&(c=Object(y.I)(c)),u){var l=Object(g.getDefaultRequestBodyValue)(a.specResolvedSubtree([\"paths\",t,n,\"requestBody\"]),u,o.activeExamplesMember(t,n,\"requestBody\",\"requestBody\"));s=!!c&&c!==l}return s}return null}},C=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"bodyInclusion\"])||Object(m.Map)()})),A=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"errors\"])||null})),k=b((function(e,t,n,r,o){return e.getIn([\"examples\",t,n,r,o,\"activeExample\"])||null})),O=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"requestContentType\"])||null})),j=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"responseContentType\"])||null})),T=b((function(e,t,n){var r;if(\"string\"!=typeof t){var o=t.server,a=t.namespace;r=a?[a,\"serverVariableValues\",o,n]:[\"serverVariableValues\",o,n]}else{r=[\"serverVariableValues\",t,n]}return e.getIn(r)||null})),I=b((function(e,t){var n;if(\"string\"!=typeof t){var r=t.server,o=t.namespace;n=o?[o,\"serverVariableValues\",r]:[\"serverVariableValues\",r]}else{n=[\"serverVariableValues\",t]}return e.getIn(n)||Object(m.OrderedMap)()})),P=b((function(e,t){var n,r;if(\"string\"!=typeof t){var o=t.server,a=t.namespace;r=o,n=a?e.getIn([a,\"serverVariableValues\",r]):e.getIn([\"serverVariableValues\",r])}else r=t,n=e.getIn([\"serverVariableValues\",r]);n=n||Object(m.OrderedMap)();var i=r;return u()(n).call(n,(function(e,t){i=i.replace(new RegExp(\"{\".concat(t,\"}\"),\"g\"),e)})),i})),N=(_=function(e,t){return function(e,t){var n;return t=t||[],!!e.getIn(i()(n=[\"requestData\"]).call(n,o()(t),[\"bodyValue\"]))}(e,t)},function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){var n,r,a=e.getSystem().specSelectors.specJson(),s=i()(n=[]).call(n,t)[1]||[];return!a.getIn(i()(r=[\"paths\"]).call(r,o()(s),[\"requestBody\",\"required\"]))||_.apply(void 0,t)}}),M=function(e,t){var n,r=t.oas3RequiredRequestBodyContentType,o=t.oas3RequestContentType,a=t.oas3RequestBodyValue,i=[];if(!m.Map.isMap(a))return i;var s=[];return l()(n=f()(r.requestContentType)).call(n,(function(e){if(e===o){var t=r.requestContentType[e];l()(t).call(t,(function(e){d()(s).call(s,e)<0&&s.push(e)}))}})),l()(s).call(s,(function(e){a.getIn([e,\"value\"])||i.push(e)})),i}},function(e,t,n){\"use strict\";n.r(t);var r,o=n(3),a=n.n(o),i=n(359),s=n.n(i),u=n(13),c=n.n(u),l=n(125),p=n.n(l),f=n(19),h=n.n(f),d=n(23),m=n.n(d),v=n(29),g=n.n(v),y=n(1),b=n(54);t.default=(r={},a()(r,b.UPDATE_SELECTED_SERVER,(function(e,t){var n=t.payload,r=n.selectedServerUrl,o=n.namespace,a=o?[o,\"selectedServer\"]:[\"selectedServer\"];return e.setIn(a,r)})),a()(r,b.UPDATE_REQUEST_BODY_VALUE,(function(e,t){var n=t.payload,r=n.value,o=n.pathMethod,a=c()(o,2),i=a[0],u=a[1];if(!y.Map.isMap(r))return e.setIn([\"requestData\",i,u,\"bodyValue\"],r);var l,f=e.getIn([\"requestData\",i,u,\"bodyValue\"])||Object(y.Map)();y.Map.isMap(f)||(f=Object(y.Map)());var d=p()(r).call(r),v=s()(d),g=h()(v).call(v,0);return m()(g).call(g,(function(e){var t=r.getIn([e]);f.has(e)&&y.Map.isMap(t)||(l=f.setIn([e,\"value\"],t))})),e.setIn([\"requestData\",i,u,\"bodyValue\"],l)})),a()(r,b.UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG,(function(e,t){var n=t.payload,r=n.value,o=n.pathMethod,a=c()(o,2),i=a[0],s=a[1];return e.setIn([\"requestData\",i,s,\"retainBodyValue\"],r)})),a()(r,b.UPDATE_REQUEST_BODY_INCLUSION,(function(e,t){var n=t.payload,r=n.value,o=n.pathMethod,a=n.name,i=c()(o,2),s=i[0],u=i[1];return e.setIn([\"requestData\",s,u,\"bodyInclusion\",a],r)})),a()(r,b.UPDATE_ACTIVE_EXAMPLES_MEMBER,(function(e,t){var n=t.payload,r=n.name,o=n.pathMethod,a=n.contextType,i=n.contextName,s=c()(o,2),u=s[0],l=s[1];return e.setIn([\"examples\",u,l,a,i,\"activeExample\"],r)})),a()(r,b.UPDATE_REQUEST_CONTENT_TYPE,(function(e,t){var n=t.payload,r=n.value,o=n.pathMethod,a=c()(o,2),i=a[0],s=a[1];return e.setIn([\"requestData\",i,s,\"requestContentType\"],r)})),a()(r,b.UPDATE_RESPONSE_CONTENT_TYPE,(function(e,t){var n=t.payload,r=n.value,o=n.path,a=n.method;return e.setIn([\"requestData\",o,a,\"responseContentType\"],r)})),a()(r,b.UPDATE_SERVER_VARIABLE_VALUE,(function(e,t){var n=t.payload,r=n.server,o=n.namespace,a=n.key,i=n.val,s=o?[o,\"serverVariableValues\",r,a]:[\"serverVariableValues\",r,a];return e.setIn(s,i)})),a()(r,b.SET_REQUEST_BODY_VALIDATE_ERROR,(function(e,t){var n=t.payload,r=n.path,o=n.method,a=n.validationErrors,i=[];if(i.push(\"Required field is not provided\"),a.missingBodyValue)return e.setIn([\"requestData\",r,o,\"errors\"],Object(y.fromJS)(i));if(a.missingRequiredKeys&&a.missingRequiredKeys.length>0){var s=a.missingRequiredKeys;return e.updateIn([\"requestData\",r,o,\"bodyValue\"],Object(y.fromJS)({}),(function(e){return g()(s).call(s,(function(e,t){return e.setIn([t,\"errors\"],Object(y.fromJS)(i))}),e)}))}return console.warn(\"unexpected result: SET_REQUEST_BODY_VALIDATE_ERROR\"),e})),a()(r,b.CLEAR_REQUEST_BODY_VALIDATE_ERROR,(function(e,t){var n=t.payload,r=n.path,o=n.method,a=e.getIn([\"requestData\",r,o,\"bodyValue\"]);if(!y.Map.isMap(a))return e.setIn([\"requestData\",r,o,\"errors\"],Object(y.fromJS)([]));var i=p()(a).call(a),u=s()(i),c=h()(u).call(u,0);return c?e.updateIn([\"requestData\",r,o,\"bodyValue\"],Object(y.fromJS)({}),(function(e){return g()(c).call(c,(function(e,t){return e.setIn([t,\"errors\"],Object(y.fromJS)([]))}),e)})):e})),a()(r,b.CLEAR_REQUEST_BODY_VALUE,(function(e,t){var n=t.payload.pathMethod,r=c()(n,2),o=r[0],a=r[1],i=e.getIn([\"requestData\",o,a,\"bodyValue\"]);return i?y.Map.isMap(i)?e.setIn([\"requestData\",o,a,\"bodyValue\"],Object(y.Map)()):e.setIn([\"requestData\",o,a,\"bodyValue\"],\"\"):e})),r)},function(e,t,n){\"use strict\";n.r(t);var r,o=n(23),a=n.n(o),i=n(125),s=n.n(i),u=n(5),c=n(1109),l={};a()(r=s()(c).call(c)).call(r,(function(e){if(\"./index.js\"!==e){var t=c(e);l[Object(u.D)(e)]=t.default?t.default:t}})),t.default=l},function(e,t,n){\"use strict\";n.r(t);var r={};n.r(r),n.d(r,\"JsonPatchError\",(function(){return $e})),n.d(r,\"deepClone\",(function(){return Je})),n.d(r,\"getValueByPointer\",(function(){return Ge})),n.d(r,\"applyOperation\",(function(){return Ze})),n.d(r,\"applyPatch\",(function(){return Xe})),n.d(r,\"applyReducer\",(function(){return Qe})),n.d(r,\"validator\",(function(){return et})),n.d(r,\"validate\",(function(){return tt})),n.d(r,\"_areEquals\",(function(){return nt}));var o={};n.r(o),n.d(o,\"unobserve\",(function(){return it})),n.d(o,\"observe\",(function(){return st})),n.d(o,\"generate\",(function(){return ut})),n.d(o,\"compare\",(function(){return lt}));var a={};n.r(a),n.d(a,\"path\",(function(){return Fn})),n.d(a,\"query\",(function(){return Un})),n.d(a,\"header\",(function(){return zn})),n.d(a,\"cookie\",(function(){return Vn}));var i=n(2),s=n.n(i),u=n(76),c=n.n(u),l=n(39),p=n.n(l),f=n(49),h=n.n(f),d=n(18),m=n.n(d),v=n(13),g=n.n(v),y=n(31),b=n.n(y),_=n(82),w=n.n(_),x=n(213),E=n.n(x),S=n(32),C=n.n(S),A=n(4),k=n.n(A),O=n(15),j=n.n(O),T=n(214),I=n.n(T),P=n(12),N=n.n(P),M=(n(501),n(223)),R=n.n(M),D=n(74),L=n(215),B=n.n(L),F=n(124),U=n.n(F),q=n(73),z=n(353),V=n(14),W=n.n(V),H=n(19),$=n.n(H),J=n(73).Buffer,K=function(e){return\":/?#[]@!$&'()*+,;=\".indexOf(e)>-1},Y=function(e){return/^[a-z0-9\\-._~]+$/i.test(e)};function G(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=n.escape,o=arguments.length>2?arguments[2]:void 0;return\"number\"==typeof e&&(e=e.toString()),\"string\"==typeof e&&e.length&&r?o?JSON.parse(e):k()(t=W()(e)).call(t,(function(e){var t,n;return Y(e)||K(e)&&\"unsafe\"===r?e:k()(t=k()(n=J.from(e).toJSON().data||[]).call(n,(function(e){var t;return $()(t=\"0\".concat(e.toString(16).toUpperCase())).call(t,-2)}))).call(t,(function(e){return\"%\".concat(e)})).join(\"\")})).join(\"\"):e}function Z(e){var t=e.value;return Array.isArray(t)?function(e){var t=e.key,n=e.value,r=e.style,o=e.explode,a=e.escape,i=function(e){return G(e,{escape:a})};if(\"simple\"===r)return k()(n).call(n,(function(e){return i(e)})).join(\",\");if(\"label\"===r)return\".\".concat(k()(n).call(n,(function(e){return i(e)})).join(\".\"));if(\"matrix\"===r)return k()(n).call(n,(function(e){return i(e)})).reduce((function(e,n){var r,a,i;return!e||o?s()(a=s()(i=\"\".concat(e||\"\",\";\")).call(i,t,\"=\")).call(a,n):s()(r=\"\".concat(e,\",\")).call(r,n)}),\"\");if(\"form\"===r){var u=o?\"&\".concat(t,\"=\"):\",\";return k()(n).call(n,(function(e){return i(e)})).join(u)}if(\"spaceDelimited\"===r){var c=o?\"\".concat(t,\"=\"):\"\";return k()(n).call(n,(function(e){return i(e)})).join(\" \".concat(c))}if(\"pipeDelimited\"===r){var l=o?\"\".concat(t,\"=\"):\"\";return k()(n).call(n,(function(e){return i(e)})).join(\"|\".concat(l))}return}(e):\"object\"===m()(t)?function(e){var t=e.key,n=e.value,r=e.style,o=e.explode,a=e.escape,i=function(e){return G(e,{escape:a})},u=j()(n);if(\"simple\"===r)return u.reduce((function(e,t){var r,a,u,c=i(n[t]),l=o?\"=\":\",\",p=e?\"\".concat(e,\",\"):\"\";return s()(r=s()(a=s()(u=\"\".concat(p)).call(u,t)).call(a,l)).call(r,c)}),\"\");if(\"label\"===r)return u.reduce((function(e,t){var r,a,u,c=i(n[t]),l=o?\"=\":\".\",p=e?\"\".concat(e,\".\"):\".\";return s()(r=s()(a=s()(u=\"\".concat(p)).call(u,t)).call(a,l)).call(r,c)}),\"\");if(\"matrix\"===r&&o)return u.reduce((function(e,t){var r,o,a=i(n[t]),u=e?\"\".concat(e,\";\"):\";\";return s()(r=s()(o=\"\".concat(u)).call(o,t,\"=\")).call(r,a)}),\"\");if(\"matrix\"===r)return u.reduce((function(e,r){var o,a,u=i(n[r]),c=e?\"\".concat(e,\",\"):\";\".concat(t,\"=\");return s()(o=s()(a=\"\".concat(c)).call(a,r,\",\")).call(o,u)}),\"\");if(\"form\"===r)return u.reduce((function(e,t){var r,a,u,c,l=i(n[t]),p=e?s()(r=\"\".concat(e)).call(r,o?\"&\":\",\"):\"\",f=o?\"=\":\",\";return s()(a=s()(u=s()(c=\"\".concat(p)).call(c,t)).call(u,f)).call(a,l)}),\"\");return}(e):function(e){var t,n=e.key,r=e.value,o=e.style,a=e.escape,i=function(e){return G(e,{escape:a})};if(\"simple\"===o)return i(r);if(\"label\"===o)return\".\".concat(i(r));if(\"matrix\"===o)return s()(t=\";\".concat(n,\"=\")).call(t,i(r));if(\"form\"===o)return i(r);if(\"deepObject\"===o)return i(r,{},!0);return}(e)}var X=function(e,t){t.body=e},Q={serializeRes:oe,mergeInQueryOrForm:me};function ee(e){return te.apply(this,arguments)}function te(){return(te=c()(p.a.mark((function e(t){var n,r,o,a,i,s=arguments;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=s.length>1&&void 0!==s[1]?s[1]:{},\"object\"===m()(t)&&(t=(n=t).url),n.headers=n.headers||{},Q.mergeInQueryOrForm(n),n.headers&&j()(n.headers).forEach((function(e){var t=n.headers[e];\"string\"==typeof t&&(n.headers[e]=t.replace(/\\n+/g,\" \"))})),!n.requestInterceptor){e.next=12;break}return e.next=8,n.requestInterceptor(n);case 8:if(e.t0=e.sent,e.t0){e.next=11;break}e.t0=n;case 11:n=e.t0;case 12:return r=n.headers[\"content-type\"]||n.headers[\"Content-Type\"],/multipart\\/form-data/i.test(r)&&n.body instanceof z.FormData&&(delete n.headers[\"content-type\"],delete n.headers[\"Content-Type\"]),e.prev=14,e.next=17,(n.userFetch||fetch)(n.url,n);case 17:return o=e.sent,e.next=20,Q.serializeRes(o,t,n);case 20:if(o=e.sent,!n.responseInterceptor){e.next=28;break}return e.next=24,n.responseInterceptor(o);case 24:if(e.t1=e.sent,e.t1){e.next=27;break}e.t1=o;case 27:o=e.t1;case 28:e.next=39;break;case 30:if(e.prev=30,e.t2=e.catch(14),o){e.next=34;break}throw e.t2;case 34:throw(a=new Error(o.statusText||\"response status is \".concat(o.status))).status=o.status,a.statusCode=o.status,a.responseError=e.t2,a;case 39:if(o.ok){e.next=45;break}throw(i=new Error(o.statusText||\"response status is \".concat(o.status))).status=o.status,i.statusCode=o.status,i.response=o,i;case 45:return e.abrupt(\"return\",o);case 46:case\"end\":return e.stop()}}),e,null,[[14,30]])})))).apply(this,arguments)}var ne=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\";return/(json|xml|yaml|text)\\b/.test(e)};function re(e,t){return t&&(0===t.indexOf(\"application/json\")||t.indexOf(\"+json\")>0)?JSON.parse(e):D.a.load(e)}function oe(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.loadSpec,o=void 0!==r&&r,a={ok:e.ok,url:e.url||t,status:e.status,statusText:e.statusText,headers:ie(e.headers)},i=a.headers[\"content-type\"],s=o||ne(i),u=s?e.text:e.blob||e.buffer;return u.call(e).then((function(e){if(a.text=e,a.data=e,s)try{var t=re(e,i);a.body=t,a.obj=t}catch(e){a.parseError=e}return a}))}function ae(e){return b()(e).call(e,\", \")?e.split(\", \"):e}function ie(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return U()(w()(e))?E()(w()(e).call(e)).reduce((function(e,t){var n=g()(t,2),r=n[0],o=n[1];return e[r]=ae(o),e}),{}):{}}function se(e,t){return t||\"undefined\"==typeof navigator||(t=navigator),t&&\"ReactNative\"===t.product?!(!e||\"object\"!==m()(e)||\"string\"!=typeof e.uri):\"undefined\"!=typeof File&&e instanceof File||(\"undefined\"!=typeof Blob&&e instanceof Blob||(void 0!==q.Buffer&&e instanceof q.Buffer||null!==e&&\"object\"===m()(e)&&\"function\"==typeof e.pipe))}function ue(e,t){return Array.isArray(e)&&e.some((function(e){return se(e,t)}))}var ce={form:\",\",spaceDelimited:\"%20\",pipeDelimited:\"|\"},le={csv:\",\",ssv:\"%20\",tsv:\"%09\",pipes:\"|\"};function pe(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=t.collectionFormat,o=t.allowEmptyValue,a=t.serializationOption,i=t.encoding,s=\"object\"!==m()(t)||Array.isArray(t)?t:t.value,u=n?function(e){return e.toString()}:function(e){return encodeURIComponent(e)},c=u(e);if(void 0===s&&o)return[[c,\"\"]];if(se(s)||ue(s))return[[c,s]];if(a)return fe(e,s,n,a);if(i){if([m()(i.style),m()(i.explode),m()(i.allowReserved)].some((function(e){return\"undefined\"!==e})))return fe(e,s,n,B()(i,[\"style\",\"explode\",\"allowReserved\"]));if(i.contentType){if(\"application/json\"===i.contentType){var l=\"string\"==typeof s?s:C()(s);return[[c,u(l)]]}return[[c,u(s.toString())]]}return\"object\"!==m()(s)?[[c,u(s)]]:Array.isArray(s)&&s.every((function(e){return\"object\"!==m()(e)}))?[[c,k()(s).call(s,u).join(\",\")]]:[[c,u(C()(s))]]}return\"object\"!==m()(s)?[[c,u(s)]]:Array.isArray(s)?\"multi\"===r?[[c,k()(s).call(s,u)]]:[[c,k()(s).call(s,u).join(le[r||\"csv\"])]]:[[c,\"\"]]}function fe(e,t,n,r){var o,a,i,u=r.style||\"form\",c=void 0===r.explode?\"form\"===u:r.explode,l=!n&&(r&&r.allowReserved?\"unsafe\":\"reserved\"),p=function(e){return G(e,{escape:l})},f=n?function(e){return e}:function(e){return G(e,{escape:l})};return\"object\"!==m()(t)?[[f(e),p(t)]]:Array.isArray(t)?c?[[f(e),k()(t).call(t,p)]]:[[f(e),k()(t).call(t,p).join(ce[u])]]:\"deepObject\"===u?k()(a=j()(t)).call(a,(function(n){var r;return[f(s()(r=\"\".concat(e,\"[\")).call(r,n,\"]\")),p(t[n])]})):c?k()(i=j()(t)).call(i,(function(e){return[f(e),p(t[e])]})):[[f(e),k()(o=j()(t)).call(o,(function(e){var n;return[s()(n=\"\".concat(f(e),\",\")).call(n,p(t[e]))]})).join(\",\")]]}function he(e){return I()(e).reduce((function(e,t){var n,r=g()(t,2),o=r[0],a=r[1],i=h()(pe(o,a,!0));try{for(i.s();!(n=i.n()).done;){var s=g()(n.value,2),u=s[0],c=s[1];if(Array.isArray(c)){var l,p=h()(c);try{for(p.s();!(l=p.n()).done;){var f=l.value;e.append(u,f)}}catch(e){p.e(e)}finally{p.f()}}else e.append(u,c)}}catch(e){i.e(e)}finally{i.f()}return e}),new z.FormData)}function de(e){var t=j()(e).reduce((function(t,n){var r,o=h()(pe(n,e[n]));try{for(o.s();!(r=o.n()).done;){var a=g()(r.value,2),i=a[0],s=a[1];t[i]=s}}catch(e){o.e(e)}finally{o.f()}return t}),{});return R.a.stringify(t,{encode:!1,indices:!1})||\"\"}function me(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,n=void 0===t?\"\":t,r=e.query,o=e.form,a=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=N()(t).call(t,(function(e){return e})).join(\"&\");return r?\"?\".concat(r):\"\"};if(o){var i=j()(o).some((function(e){var t=o[e].value;return se(t)||ue(t)})),s=e.headers[\"content-type\"]||e.headers[\"Content-Type\"];if(i||/multipart\\/form-data/i.test(s)){var u=he(e.form);X(u,e)}else e.body=de(o);delete e.form}if(r){var c=n.split(\"?\"),l=g()(c,2),p=l[0],f=l[1],h=\"\";if(f){var d=R.a.parse(f),m=j()(r);m.forEach((function(e){return delete d[e]})),h=R.a.stringify(d,{encode:!0})}var v=a(h,de(r));e.url=p+v,delete e.query}return e}var ve,ge=n(24),ye=n.n(ge),be=n(6),_e=n.n(be),we=n(7),xe=n.n(we),Ee=n(20),Se=n.n(Ee),Ce=n(65),Ae=n.n(Ce),ke=n(532),Oe=n.n(ke),je=n(209),Te=n.n(je),Ie=n(354),Pe=n.n(Ie),Ne=n(3),Me=n.n(Ne),Re=(ve=function(e,t){return(ve=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},function(e,t){function n(){this.constructor=e}ve(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),De=Object.prototype.hasOwnProperty;function Le(e,t){return De.call(e,t)}function Be(e){if(Array.isArray(e)){for(var t=new Array(e.length),n=0;n<t.length;n++)t[n]=\"\"+n;return t}if(Object.keys)return Object.keys(e);t=[];for(var r in e)Le(e,r)&&t.push(r);return t}function Fe(e){switch(typeof e){case\"object\":return JSON.parse(JSON.stringify(e));case\"undefined\":return null;default:return e}}function Ue(e){for(var t,n=0,r=e.length;n<r;){if(!((t=e.charCodeAt(n))>=48&&t<=57))return!1;n++}return!0}function qe(e){return-1===e.indexOf(\"/\")&&-1===e.indexOf(\"~\")?e:e.replace(/~/g,\"~0\").replace(/\\//g,\"~1\")}function ze(e){return e.replace(/~1/g,\"/\").replace(/~0/g,\"~\")}function Ve(e){if(void 0===e)return!0;if(e)if(Array.isArray(e)){for(var t=0,n=e.length;t<n;t++)if(Ve(e[t]))return!0}else if(\"object\"==typeof e){var r=Be(e),o=r.length;for(t=0;t<o;t++)if(Ve(e[r[t]]))return!0}return!1}function We(e,t){var n=[e];for(var r in t){var o=\"object\"==typeof t[r]?JSON.stringify(t[r],null,2):t[r];void 0!==o&&n.push(r+\": \"+o)}return n.join(\"\\n\")}var He=function(e){function t(t,n,r,o,a){var i=this.constructor,s=e.call(this,We(t,{name:n,index:r,operation:o,tree:a}))||this;return s.name=n,s.index=r,s.operation=o,s.tree=a,Object.setPrototypeOf(s,i.prototype),s.message=We(t,{name:n,index:r,operation:o,tree:a}),s}return Re(t,e),t}(Error),$e=He,Je=Fe,Ke={add:function(e,t,n){return e[t]=this.value,{newDocument:n}},remove:function(e,t,n){var r=e[t];return delete e[t],{newDocument:n,removed:r}},replace:function(e,t,n){var r=e[t];return e[t]=this.value,{newDocument:n,removed:r}},move:function(e,t,n){var r=Ge(n,this.path);r&&(r=Fe(r));var o=Ze(n,{op:\"remove\",path:this.from}).removed;return Ze(n,{op:\"add\",path:this.path,value:o}),{newDocument:n,removed:r}},copy:function(e,t,n){var r=Ge(n,this.from);return Ze(n,{op:\"add\",path:this.path,value:Fe(r)}),{newDocument:n}},test:function(e,t,n){return{newDocument:n,test:nt(e[t],this.value)}},_get:function(e,t,n){return this.value=e[t],{newDocument:n}}},Ye={add:function(e,t,n){return Ue(t)?e.splice(t,0,this.value):e[t]=this.value,{newDocument:n,index:t}},remove:function(e,t,n){return{newDocument:n,removed:e.splice(t,1)[0]}},replace:function(e,t,n){var r=e[t];return e[t]=this.value,{newDocument:n,removed:r}},move:Ke.move,copy:Ke.copy,test:Ke.test,_get:Ke._get};function Ge(e,t){if(\"\"==t)return e;var n={op:\"_get\",path:t};return Ze(e,n),n.value}function Ze(e,t,n,r,o,a){if(void 0===n&&(n=!1),void 0===r&&(r=!0),void 0===o&&(o=!0),void 0===a&&(a=0),n&&(\"function\"==typeof n?n(t,0,e,t.path):et(t,0)),\"\"===t.path){var i={newDocument:e};if(\"add\"===t.op)return i.newDocument=t.value,i;if(\"replace\"===t.op)return i.newDocument=t.value,i.removed=e,i;if(\"move\"===t.op||\"copy\"===t.op)return i.newDocument=Ge(e,t.from),\"move\"===t.op&&(i.removed=e),i;if(\"test\"===t.op){if(i.test=nt(e,t.value),!1===i.test)throw new $e(\"Test operation failed\",\"TEST_OPERATION_FAILED\",a,t,e);return i.newDocument=e,i}if(\"remove\"===t.op)return i.removed=e,i.newDocument=null,i;if(\"_get\"===t.op)return t.value=e,i;if(n)throw new $e(\"Operation `op` property is not one of operations defined in RFC-6902\",\"OPERATION_OP_INVALID\",a,t,e);return i}r||(e=Fe(e));var s=(t.path||\"\").split(\"/\"),u=e,c=1,l=s.length,p=void 0,f=void 0,h=void 0;for(h=\"function\"==typeof n?n:et;;){if(f=s[c],o&&\"__proto__\"==f)throw new TypeError(\"JSON-Patch: modifying `__proto__` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README\");if(n&&void 0===p&&(void 0===u[f]?p=s.slice(0,c).join(\"/\"):c==l-1&&(p=t.path),void 0!==p&&h(t,0,e,p)),c++,Array.isArray(u)){if(\"-\"===f)f=u.length;else{if(n&&!Ue(f))throw new $e(\"Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index\",\"OPERATION_PATH_ILLEGAL_ARRAY_INDEX\",a,t,e);Ue(f)&&(f=~~f)}if(c>=l){if(n&&\"add\"===t.op&&f>u.length)throw new $e(\"The specified index MUST NOT be greater than the number of elements in the array\",\"OPERATION_VALUE_OUT_OF_BOUNDS\",a,t,e);if(!1===(i=Ye[t.op].call(t,u,f,e)).test)throw new $e(\"Test operation failed\",\"TEST_OPERATION_FAILED\",a,t,e);return i}}else if(f&&-1!=f.indexOf(\"~\")&&(f=ze(f)),c>=l){if(!1===(i=Ke[t.op].call(t,u,f,e)).test)throw new $e(\"Test operation failed\",\"TEST_OPERATION_FAILED\",a,t,e);return i}u=u[f]}}function Xe(e,t,n,r,o){if(void 0===r&&(r=!0),void 0===o&&(o=!0),n&&!Array.isArray(t))throw new $e(\"Patch sequence must be an array\",\"SEQUENCE_NOT_AN_ARRAY\");r||(e=Fe(e));for(var a=new Array(t.length),i=0,s=t.length;i<s;i++)a[i]=Ze(e,t[i],n,!0,o,i),e=a[i].newDocument;return a.newDocument=e,a}function Qe(e,t,n){var r=Ze(e,t);if(!1===r.test)throw new $e(\"Test operation failed\",\"TEST_OPERATION_FAILED\",n,t,e);return r.newDocument}function et(e,t,n,r){if(\"object\"!=typeof e||null===e||Array.isArray(e))throw new $e(\"Operation is not an object\",\"OPERATION_NOT_AN_OBJECT\",t,e,n);if(!Ke[e.op])throw new $e(\"Operation `op` property is not one of operations defined in RFC-6902\",\"OPERATION_OP_INVALID\",t,e,n);if(\"string\"!=typeof e.path)throw new $e(\"Operation `path` property is not a string\",\"OPERATION_PATH_INVALID\",t,e,n);if(0!==e.path.indexOf(\"/\")&&e.path.length>0)throw new $e('Operation `path` property must start with \"/\"',\"OPERATION_PATH_INVALID\",t,e,n);if((\"move\"===e.op||\"copy\"===e.op)&&\"string\"!=typeof e.from)throw new $e(\"Operation `from` property is not present (applicable in `move` and `copy` operations)\",\"OPERATION_FROM_REQUIRED\",t,e,n);if((\"add\"===e.op||\"replace\"===e.op||\"test\"===e.op)&&void 0===e.value)throw new $e(\"Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)\",\"OPERATION_VALUE_REQUIRED\",t,e,n);if((\"add\"===e.op||\"replace\"===e.op||\"test\"===e.op)&&Ve(e.value))throw new $e(\"Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)\",\"OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED\",t,e,n);if(n)if(\"add\"==e.op){var o=e.path.split(\"/\").length,a=r.split(\"/\").length;if(o!==a+1&&o!==a)throw new $e(\"Cannot perform an `add` operation at the desired path\",\"OPERATION_PATH_CANNOT_ADD\",t,e,n)}else if(\"replace\"===e.op||\"remove\"===e.op||\"_get\"===e.op){if(e.path!==r)throw new $e(\"Cannot perform the operation at a path that does not exist\",\"OPERATION_PATH_UNRESOLVABLE\",t,e,n)}else if(\"move\"===e.op||\"copy\"===e.op){var i=tt([{op:\"_get\",path:e.from,value:void 0}],n);if(i&&\"OPERATION_PATH_UNRESOLVABLE\"===i.name)throw new $e(\"Cannot perform the operation from a path that does not exist\",\"OPERATION_FROM_UNRESOLVABLE\",t,e,n)}}function tt(e,t,n){try{if(!Array.isArray(e))throw new $e(\"Patch sequence must be an array\",\"SEQUENCE_NOT_AN_ARRAY\");if(t)Xe(Fe(t),Fe(e),n||!0);else{n=n||et;for(var r=0;r<e.length;r++)n(e[r],r,t,void 0)}}catch(e){if(e instanceof $e)return e;throw e}}function nt(e,t){if(e===t)return!0;if(e&&t&&\"object\"==typeof e&&\"object\"==typeof t){var n,r,o,a=Array.isArray(e),i=Array.isArray(t);if(a&&i){if((r=e.length)!=t.length)return!1;for(n=r;0!=n--;)if(!nt(e[n],t[n]))return!1;return!0}if(a!=i)return!1;var s=Object.keys(e);if((r=s.length)!==Object.keys(t).length)return!1;for(n=r;0!=n--;)if(!t.hasOwnProperty(s[n]))return!1;for(n=r;0!=n--;)if(!nt(e[o=s[n]],t[o]))return!1;return!0}return e!=e&&t!=t}var rt=new WeakMap,ot=function(e){this.observers=new Map,this.obj=e},at=function(e,t){this.callback=e,this.observer=t};function it(e,t){t.unobserve()}function st(e,t){var n,r=function(e){return rt.get(e)}(e);if(r){var o=function(e,t){return e.observers.get(t)}(r,t);n=o&&o.observer}else r=new ot(e),rt.set(e,r);if(n)return n;if(n={},r.value=Fe(e),t){n.callback=t,n.next=null;var a=function(){ut(n)},i=function(){clearTimeout(n.next),n.next=setTimeout(a)};\"undefined\"!=typeof window&&(window.addEventListener(\"mouseup\",i),window.addEventListener(\"keyup\",i),window.addEventListener(\"mousedown\",i),window.addEventListener(\"keydown\",i),window.addEventListener(\"change\",i))}return n.patches=[],n.object=e,n.unobserve=function(){ut(n),clearTimeout(n.next),function(e,t){e.observers.delete(t.callback)}(r,n),\"undefined\"!=typeof window&&(window.removeEventListener(\"mouseup\",i),window.removeEventListener(\"keyup\",i),window.removeEventListener(\"mousedown\",i),window.removeEventListener(\"keydown\",i),window.removeEventListener(\"change\",i))},r.observers.set(t,new at(t,n)),n}function ut(e,t){void 0===t&&(t=!1);var n=rt.get(e.object);ct(n.value,e.object,e.patches,\"\",t),e.patches.length&&Xe(n.value,e.patches);var r=e.patches;return r.length>0&&(e.patches=[],e.callback&&e.callback(r)),r}function ct(e,t,n,r,o){if(t!==e){\"function\"==typeof t.toJSON&&(t=t.toJSON());for(var a=Be(t),i=Be(e),s=!1,u=i.length-1;u>=0;u--){var c=e[p=i[u]];if(!Le(t,p)||void 0===t[p]&&void 0!==c&&!1===Array.isArray(t))Array.isArray(e)===Array.isArray(t)?(o&&n.push({op:\"test\",path:r+\"/\"+qe(p),value:Fe(c)}),n.push({op:\"remove\",path:r+\"/\"+qe(p)}),s=!0):(o&&n.push({op:\"test\",path:r,value:e}),n.push({op:\"replace\",path:r,value:t}),!0);else{var l=t[p];\"object\"==typeof c&&null!=c&&\"object\"==typeof l&&null!=l?ct(c,l,n,r+\"/\"+qe(p),o):c!==l&&(!0,o&&n.push({op:\"test\",path:r+\"/\"+qe(p),value:Fe(c)}),n.push({op:\"replace\",path:r+\"/\"+qe(p),value:Fe(l)}))}}if(s||a.length!=i.length)for(u=0;u<a.length;u++){var p;Le(e,p=a[u])||void 0===t[p]||n.push({op:\"add\",path:r+\"/\"+qe(p),value:Fe(t[p])})}}}function lt(e,t,n){void 0===n&&(n=!1);var r=[];return ct(e,t,r,\"\",n),r}Object.assign({},r,o,{JsonPatchError:He,deepClone:Fe,escapePathComponent:qe,unescapePathComponent:ze});var pt=n(81),ft=n.n(pt),ht=n(533),dt=n.n(ht),mt={add:function(e,t){return{op:\"add\",path:e,value:t}},replace:gt,remove:function(e){return{op:\"remove\",path:e}},merge:function(e,t){return{type:\"mutation\",op:\"merge\",path:e,value:t}},mergeDeep:function(e,t){return{type:\"mutation\",op:\"mergeDeep\",path:e,value:t}},context:function(e,t){return{type:\"context\",path:e,value:t}},getIn:function(e,t){return t.reduce((function(e,t){return void 0!==t&&e?e[t]:e}),e)},applyPatch:function(e,t,n){if(n=n||{},\"merge\"===(t=ye()(ye()({},t),{},{path:t.path&&vt(t.path)})).op){var r=Tt(e,t.path);Se()(r,t.value),Xe(e,[gt(t.path,r)])}else if(\"mergeDeep\"===t.op){var o=Tt(e,t.path);for(var a in t.value){var i=t.value[a],u=Array.isArray(i);if(u){var c=o[a]||[];o[a]=s()(c).call(c,i)}else if(St(i)&&!u){var l=ye()({},o[a]);for(var p in i){if(Object.prototype.hasOwnProperty.call(l,p)){l=ft()(dt()(l),i);break}Se()(l,Me()({},p,i[p]))}o[a]=l}else o[a]=i}}else if(\"add\"===t.op&&\"\"===t.path&&St(t.value)){var f=j()(t.value).reduce((function(e,n){return e.push({op:\"add\",path:\"/\".concat(vt(n)),value:t.value[n]}),e}),[]);Xe(e,f)}else if(\"replace\"===t.op&&\"\"===t.path){var h=t.value;n.allowMetaPatches&&t.meta&&Ot(t)&&(Array.isArray(t.value)||St(t.value))&&(h=ye()(ye()({},h),t.meta)),e=h}else if(Xe(e,[t]),n.allowMetaPatches&&t.meta&&Ot(t)&&(Array.isArray(t.value)||St(t.value))){var d=Tt(e,t.path),m=ye()(ye()({},d),t.meta);Xe(e,[gt(t.path,m)])}return e},parentPathMatch:function(e,t){if(!Array.isArray(t))return!1;for(var n=0,r=t.length;n<r;n+=1)if(t[n]!==e[n])return!1;return!0},flatten:xt,fullyNormalizeArray:function(e){return Et(xt(wt(e)))},normalizeArray:wt,isPromise:function(e){return St(e)&&Ct(e.then)},forEachNew:function(e,t){try{return yt(e,_t,t)}catch(e){return e}},forEachNewPrimitive:function(e,t){try{return yt(e,bt,t)}catch(e){return e}},isJsonPatch:At,isContextPatch:function(e){return jt(e)&&\"context\"===e.type},isPatch:jt,isMutation:kt,isAdditiveMutation:Ot,isGenerator:function(e){return\"[object GeneratorFunction]\"===Object.prototype.toString.call(e)},isFunction:Ct,isObject:St,isError:function(e){return e instanceof Error}};function vt(e){return Array.isArray(e)?e.length<1?\"\":\"/\".concat(k()(e).call(e,(function(e){return(e+\"\").replace(/~/g,\"~0\").replace(/\\//g,\"~1\")})).join(\"/\")):e}function gt(e,t,n){return{op:\"replace\",path:e,value:t,meta:n}}function yt(e,t,n){var r;return Et(xt(k()(r=N()(e).call(e,Ot)).call(r,(function(e){return t(e.value,n,e.path)}))||[]))}function bt(e,t,n){return n=n||[],Array.isArray(e)?k()(e).call(e,(function(e,r){return bt(e,t,s()(n).call(n,r))})):St(e)?k()(r=j()(e)).call(r,(function(r){return bt(e[r],t,s()(n).call(n,r))})):t(e,n[n.length-1],n);var r}function _t(e,t,n){var r=[];if((n=n||[]).length>0){var o=t(e,n[n.length-1],n);o&&(r=s()(r).call(r,o))}if(Array.isArray(e)){var a=k()(e).call(e,(function(e,r){return _t(e,t,s()(n).call(n,r))}));a&&(r=s()(r).call(r,a))}else if(St(e)){var i,u=k()(i=j()(e)).call(i,(function(r){return _t(e[r],t,s()(n).call(n,r))}));u&&(r=s()(r).call(r,u))}return r=xt(r)}function wt(e){return Array.isArray(e)?e:[e]}function xt(e){var t;return s()(t=[]).apply(t,W()(k()(e).call(e,(function(e){return Array.isArray(e)?xt(e):e}))))}function Et(e){return N()(e).call(e,(function(e){return void 0!==e}))}function St(e){return e&&\"object\"===m()(e)}function Ct(e){return e&&\"function\"==typeof e}function At(e){if(jt(e)){var t=e.op;return\"add\"===t||\"remove\"===t||\"replace\"===t}return!1}function kt(e){return At(e)||jt(e)&&\"mutation\"===e.type}function Ot(e){return kt(e)&&(\"add\"===e.op||\"replace\"===e.op||\"merge\"===e.op||\"mergeDeep\"===e.op)}function jt(e){return e&&\"object\"===m()(e)}function Tt(e,t){try{return Ge(e,t)}catch(e){return console.error(e),{}}}var It=n(534),Pt=n.n(It),Nt=n(355),Mt=n.n(Nt),Rt=n(83),Dt=n.n(Rt);function Lt(e,t){function n(){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack;for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];this.message=n[0],t&&t.apply(this,n)}return n.prototype=new Error,n.prototype.name=e,n.prototype.constructor=n,n}var Bt=n(535),Ft=n.n(Bt),Ut=n(212),qt=n.n(Ut),zt=[\"properties\"],Vt=[\"properties\"],Wt=[\"definitions\",\"parameters\",\"responses\",\"securityDefinitions\",\"components/schemas\",\"components/responses\",\"components/parameters\",\"components/securitySchemes\"],Ht=[\"schema/example\",\"items/example\"];function $t(e){var t=e[e.length-1],n=e[e.length-2],r=e.join(\"/\");return zt.indexOf(t)>-1&&-1===Vt.indexOf(n)||Wt.indexOf(r)>-1||Ht.some((function(e){return r.indexOf(e)>-1}))}function Jt(e,t){var n,r=e.split(\"#\"),o=g()(r,2),a=o[0],i=o[1],u=Dt.a.resolve(a||\"\",t||\"\");return i?s()(n=\"\".concat(u,\"#\")).call(n,i):u}var Kt=\"application/json, application/yaml\",Yt=new RegExp(\"^([a-z]+://|//)\",\"i\"),Gt=Lt(\"JSONRefError\",(function(e,t,n){this.originalError=n,Se()(this,t||{})})),Zt={},Xt=new Pt.a,Qt=[function(e){return\"paths\"===e[0]&&\"responses\"===e[3]&&\"examples\"===e[5]},function(e){return\"paths\"===e[0]&&\"responses\"===e[3]&&\"content\"===e[5]&&\"example\"===e[7]},function(e){return\"paths\"===e[0]&&\"responses\"===e[3]&&\"content\"===e[5]&&\"examples\"===e[7]&&\"value\"===e[9]},function(e){return\"paths\"===e[0]&&\"requestBody\"===e[3]&&\"content\"===e[4]&&\"example\"===e[6]},function(e){return\"paths\"===e[0]&&\"requestBody\"===e[3]&&\"content\"===e[4]&&\"examples\"===e[6]&&\"value\"===e[8]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"example\"===e[4]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"example\"===e[5]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"examples\"===e[4]&&\"value\"===e[6]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"examples\"===e[5]&&\"value\"===e[7]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"content\"===e[4]&&\"example\"===e[6]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"content\"===e[4]&&\"examples\"===e[6]&&\"value\"===e[8]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"content\"===e[4]&&\"example\"===e[7]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"content\"===e[5]&&\"examples\"===e[7]&&\"value\"===e[9]}],en={key:\"$ref\",plugin:function(e,t,n,r){var o=r.getInstance(),a=$()(n).call(n,0,-1);if(!$t(a)&&(i=a,!Qt.some((function(e){return e(i)})))){var i,u=r.getContext(n).baseDoc;if(\"string\"!=typeof e)return new Gt(\"$ref: must be a string (JSON-Ref)\",{$ref:e,baseDoc:u,fullPath:n});var c,l,p,f=an(e),h=f[0],d=f[1]||\"\";try{c=u||h?rn(h,u):null}catch(t){return on(t,{pointer:d,$ref:e,basePath:c,fullPath:n})}if(function(e,t,n,r){var o,a,i=Xt.get(r);i||(i={},Xt.set(r,i));var u=function(e){if(0===e.length)return\"\";return\"/\".concat(k()(e).call(e,fn).join(\"/\"))}(n),c=s()(o=\"\".concat(t||\"<specmap-base>\",\"#\")).call(o,e),l=u.replace(/allOf\\/\\d+\\/?/g,\"\"),p=r.contextTree.get([]).baseDoc;if(t===p&&hn(l,e))return!0;var f=\"\";if(n.some((function(e){var t;return f=s()(t=\"\".concat(f,\"/\")).call(t,fn(e)),i[f]&&i[f].some((function(e){return hn(e,c)||hn(c,e)}))})))return!0;return void(i[l]=s()(a=i[l]||[]).call(a,c))}(d,c,a,r)&&!o.useCircularStructures){var m=Jt(e,c);return e===m?null:mt.replace(n,m)}if(null==c?(p=ln(d),void 0===(l=r.get(p))&&(l=new Gt(\"Could not resolve reference: \".concat(e),{pointer:d,$ref:e,baseDoc:u,fullPath:n}))):l=null!=(l=sn(c,d)).__value?l.__value:l.catch((function(t){throw on(t,{pointer:d,$ref:e,baseDoc:u,fullPath:n})})),l instanceof Error)return[mt.remove(n),l];var v=Jt(e,c),g=mt.replace(a,l,{$$ref:v});if(c&&c!==u)return[g,mt.context(a,{baseDoc:c})];try{if(!function(e,t){var n=[e];return t.path.reduce((function(e,t){return n.push(e[t]),e[t]}),e),r(t.value);function r(e){return mt.isObject(e)&&(n.indexOf(e)>=0||j()(e).some((function(t){return r(e[t])})))}}(r.state,g)||o.useCircularStructures)return g}catch(e){return null}}}},tn=Se()(en,{docCache:Zt,absoluteify:rn,clearCache:function(e){void 0!==e?delete Zt[e]:j()(Zt).forEach((function(e){delete Zt[e]}))},JSONRefError:Gt,wrapError:on,getDoc:un,split:an,extractFromDoc:sn,fetchJSON:function(e){return fetch(e,{headers:{Accept:Kt},loadSpec:!0}).then((function(e){return e.text()})).then((function(e){return D.a.load(e)}))},extract:cn,jsonPointerToArray:ln,unescapeJsonPointerToken:pn}),nn=tn;function rn(e,t){if(!Yt.test(e)){var n;if(!t)throw new Gt(s()(n=\"Tried to resolve a relative URL, without having a basePath. path: '\".concat(e,\"' basePath: '\")).call(n,t,\"'\"));return Dt.a.resolve(t,e)}return e}function on(e,t){var n,r;e&&e.response&&e.response.body?n=s()(r=\"\".concat(e.response.body.code,\" \")).call(r,e.response.body.message):n=e.message;return new Gt(\"Could not resolve reference: \".concat(n),t,e)}function an(e){return(e+\"\").split(\"#\")}function sn(e,t){var n=Zt[e];if(n&&!mt.isPromise(n))try{var r=cn(t,n);return Se()(Ae.a.resolve(r),{__value:r})}catch(e){return Ae.a.reject(e)}return un(e).then((function(e){return cn(t,e)}))}function un(e){var t=Zt[e];return t?mt.isPromise(t)?t:Ae.a.resolve(t):(Zt[e]=tn.fetchJSON(e).then((function(t){return Zt[e]=t,t})),Zt[e])}function cn(e,t){var n=ln(e);if(n.length<1)return t;var r=mt.getIn(t,n);if(void 0===r)throw new Gt(\"Could not resolve pointer: \".concat(e,\" does not exist in document\"),{pointer:e});return r}function ln(e){var t;if(\"string\"!=typeof e)throw new TypeError(\"Expected a string, got a \".concat(m()(e)));return\"/\"===e[0]&&(e=e.substr(1)),\"\"===e?[]:k()(t=e.split(\"/\")).call(t,pn)}function pn(e){return\"string\"!=typeof e?e:Mt.a.unescape(e.replace(/~1/g,\"/\").replace(/~0/g,\"~\"))}function fn(e){return Mt.a.escape(e.replace(/~/g,\"~0\").replace(/\\//g,\"~1\"))}function hn(e,t){if(!(n=t)||\"/\"===n||\"#\"===n)return!0;var n,r=e.charAt(t.length),o=$()(t).call(t,-1);return 0===e.indexOf(t)&&(!r||\"/\"===r||\"#\"===r)&&\"#\"!==o}var dn=n(104),mn=n.n(dn),vn={key:\"allOf\",plugin:function(e,t,n,r,o){if(!o.meta||!o.meta.$$ref){var a=$()(n).call(n,0,-1);if(!$t(a)){if(!Array.isArray(e)){var i=new TypeError(\"allOf must be an array\");return i.fullPath=n,i}var u=!1,c=o.value;if(a.forEach((function(e){c&&(c=c[e])})),c=ye()({},c),!mn()(c)){delete c.allOf;var l,p=[];if(p.push(r.replace(a,{})),e.forEach((function(e,t){if(!r.isObject(e)){if(u)return null;u=!0;var o=new TypeError(\"Elements in allOf must be objects\");return o.fullPath=n,p.push(o)}p.push(r.mergeDeep(a,e));var i=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.specmap,o=n.getBaseUrlForNodePath,a=void 0===o?function(e){var n;return r.getContext(s()(n=[]).call(n,W()(t),W()(e))).baseDoc}:o,i=n.targetKeys,u=void 0===i?[\"$ref\",\"$$ref\"]:i,c=[];return Ft()(e).forEach((function(){if(b()(u).call(u,this.key)&&qt()(this.node)){var e=this.path,n=s()(t).call(t,this.path),o=Jt(this.node,a(e));c.push(r.replace(n,o))}})),c}(e,$()(n).call(n,0,-1),{getBaseUrlForNodePath:function(e){var o;return r.getContext(s()(o=[]).call(o,W()(n),[t],W()(e))).baseDoc},specmap:r});p.push.apply(p,W()(i))})),p.push(r.mergeDeep(a,c)),!c.$$ref)p.push(r.remove(s()(l=[]).call(l,a,\"$$ref\")));return p}}}}},gn={key:\"parameters\",plugin:function(e,t,n,r){if(Array.isArray(e)&&e.length){var o=Se()([],e),a=$()(n).call(n,0,-1),i=ye()({},mt.getIn(r.spec,a));return e.forEach((function(e,t){try{o[t].default=r.parameterMacro(i,e)}catch(e){var a=new Error(e);return a.fullPath=n,a}})),mt.replace(n,o)}return mt.replace(n,e)}},yn={key:\"properties\",plugin:function(e,t,n,r){var o=ye()({},e);for(var a in e)try{o[a].default=r.modelPropertyMacro(o[a])}catch(e){var i=new Error(e);return i.fullPath=n,i}return mt.replace(n,o)}},bn=function(){function e(t){_e()(this,e),this.root=_n(t||{})}return xe()(e,[{key:\"set\",value:function(e,t){var n=this.getParent(e,!0);if(n){var r=e[e.length-1],o=n.children;o[r]?wn(o[r],t,n):o[r]=_n(t,n)}else wn(this.root,t,null)}},{key:\"get\",value:function(e){if((e=e||[]).length<1)return this.root.value;for(var t,n,r=this.root,o=0;o<e.length&&(n=e[o],(t=r.children)[n]);o+=1)r=t[n];return r&&r.protoValue}},{key:\"getParent\",value:function(e,t){return!e||e.length<1?null:e.length<2?this.root:$()(e).call(e,0,-1).reduce((function(e,n){if(!e)return e;var r=e.children;return!r[n]&&t&&(r[n]=_n(null,e)),r[n]}),this.root)}}]),e}();function _n(e,t){return wn({children:{}},e,t)}function wn(e,t,n){return e.value=t||{},e.protoValue=n?ye()(ye()({},n.protoValue),e.value):e.value,j()(e.children).forEach((function(t){var n=e.children[t];e.children[t]=wn(n,n.value,e)})),e}var xn=function(){function e(t){var n,r,o=this;_e()(this,e),Se()(this,{spec:\"\",debugLevel:\"info\",plugins:[],pluginHistory:{},errors:[],mutations:[],promisedPatches:[],state:{},patches:[],context:{},contextTree:new bn,showDebug:!1,allPatches:[],pluginProp:\"specMap\",libMethods:Se()(Object.create(this),mt,{getInstance:function(){return o}}),allowMetaPatches:!1},t),this.get=this._get.bind(this),this.getContext=this._getContext.bind(this),this.hasRun=this._hasRun.bind(this),this.wrappedPlugins=N()(n=k()(r=this.plugins).call(r,this.wrapPlugin.bind(this))).call(n,mt.isFunction),this.patches.push(mt.add([],this.spec)),this.patches.push(mt.context([],this.context)),this.updatePatches(this.patches)}return xe()(e,[{key:\"debug\",value:function(e){if(this.debugLevel===e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];(t=console).log.apply(t,r)}}},{key:\"verbose\",value:function(e){if(\"verbose\"===this.debugLevel){for(var t,n,r=arguments.length,o=new Array(r>1?r-1:0),a=1;a<r;a++)o[a-1]=arguments[a];(t=console).log.apply(t,s()(n=[\"[\".concat(e,\"]   \")]).call(n,o))}}},{key:\"wrapPlugin\",value:function(e,t){var n,r,o,a=this.pathDiscriminator,i=null;return e[this.pluginProp]?(i=e,n=e[this.pluginProp]):mt.isFunction(e)?n=e:mt.isObject(e)&&(r=e,o=function(e,t){return!Array.isArray(e)||e.every((function(e,n){return e===t[n]}))},n=p.a.mark((function e(t,n){var i,u,c,l,f,d;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:d=function(e,t,c){var l,f,h,m,v,g,y,b,_,w,x,E,S;return p.a.wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(mt.isObject(e)){i.next=6;break}if(r.key!==t[t.length-1]){i.next=4;break}return i.next=4,r.plugin(e,r.key,t,n);case 4:i.next=30;break;case 6:l=t.length-1,f=t[l],h=t.indexOf(\"properties\"),m=\"properties\"===f&&l===h,v=n.allowMetaPatches&&u[e.$$ref],g=0,y=j()(e);case 12:if(!(g<y.length)){i.next=30;break}if(b=y[g],_=e[b],w=s()(t).call(t,b),x=mt.isObject(_),E=e.$$ref,v){i.next=22;break}if(!x){i.next=22;break}return n.allowMetaPatches&&E&&(u[E]=!0),i.delegateYield(d(_,w,c),\"t0\",22);case 22:if(m||b!==r.key){i.next=27;break}if(S=o(a,t),a&&!S){i.next=27;break}return i.next=27,r.plugin(_,b,w,n,c);case 27:g++,i.next=12;break;case 30:case\"end\":return i.stop()}}),i)},i=p.a.mark(d),u={},c=h()(N()(t).call(t,mt.isAdditiveMutation)),e.prev=4,c.s();case 6:if((l=c.n()).done){e.next=11;break}return f=l.value,e.delegateYield(d(f.value,f.path,f),\"t0\",9);case 9:e.next=6;break;case 11:e.next=16;break;case 13:e.prev=13,e.t1=e.catch(4),c.e(e.t1);case 16:return e.prev=16,c.f(),e.finish(16);case 19:case\"end\":return e.stop()}}),e,null,[[4,13,16,19]])}))),Se()(n.bind(i),{pluginName:e.name||t,isGenerator:mt.isGenerator(n)})}},{key:\"nextPlugin\",value:function(){var e=this;return Te()(this.wrappedPlugins,(function(t){return e.getMutationsForPlugin(t).length>0}))}},{key:\"nextPromisedPatch\",value:function(){var e;if(this.promisedPatches.length>0)return Ae.a.race(k()(e=this.promisedPatches).call(e,(function(e){return e.value})))}},{key:\"getPluginHistory\",value:function(e){var t=this.constructor.getPluginName(e);return this.pluginHistory[t]||[]}},{key:\"getPluginRunCount\",value:function(e){return this.getPluginHistory(e).length}},{key:\"getPluginHistoryTip\",value:function(e){var t=this.getPluginHistory(e);return t&&t[t.length-1]||{}}},{key:\"getPluginMutationIndex\",value:function(e){var t=this.getPluginHistoryTip(e).mutationIndex;return\"number\"!=typeof t?-1:t}},{key:\"updatePluginHistory\",value:function(e,t){var n=this.constructor.getPluginName(e);this.pluginHistory[n]=this.pluginHistory[n]||[],this.pluginHistory[n].push(t)}},{key:\"updatePatches\",value:function(e){var t=this;mt.normalizeArray(e).forEach((function(e){if(e instanceof Error)t.errors.push(e);else try{if(!mt.isObject(e))return void t.debug(\"updatePatches\",\"Got a non-object patch\",e);if(t.showDebug&&t.allPatches.push(e),mt.isPromise(e.value))return t.promisedPatches.push(e),void t.promisedPatchThen(e);if(mt.isContextPatch(e))return void t.setContext(e.path,e.value);if(mt.isMutation(e))return void t.updateMutations(e)}catch(e){console.error(e),t.errors.push(e)}}))}},{key:\"updateMutations\",value:function(e){\"object\"===m()(e.value)&&!Array.isArray(e.value)&&this.allowMetaPatches&&(e.value=ye()({},e.value));var t=mt.applyPatch(this.state,e,{allowMetaPatches:this.allowMetaPatches});t&&(this.mutations.push(e),this.state=t)}},{key:\"removePromisedPatch\",value:function(e){var t,n=this.promisedPatches.indexOf(e);n<0?this.debug(\"Tried to remove a promisedPatch that isn't there!\"):Oe()(t=this.promisedPatches).call(t,n,1)}},{key:\"promisedPatchThen\",value:function(e){var t=this;return e.value=e.value.then((function(n){var r=ye()(ye()({},e),{},{value:n});t.removePromisedPatch(e),t.updatePatches(r)})).catch((function(n){t.removePromisedPatch(e),t.updatePatches(n)})),e.value}},{key:\"getMutations\",value:function(e,t){var n;return e=e||0,\"number\"!=typeof t&&(t=this.mutations.length),$()(n=this.mutations).call(n,e,t)}},{key:\"getCurrentMutations\",value:function(){return this.getMutationsForPlugin(this.getCurrentPlugin())}},{key:\"getMutationsForPlugin\",value:function(e){var t=this.getPluginMutationIndex(e);return this.getMutations(t+1)}},{key:\"getCurrentPlugin\",value:function(){return this.currentPlugin}},{key:\"getLib\",value:function(){return this.libMethods}},{key:\"_get\",value:function(e){return mt.getIn(this.state,e)}},{key:\"_getContext\",value:function(e){return this.contextTree.get(e)}},{key:\"setContext\",value:function(e,t){return this.contextTree.set(e,t)}},{key:\"_hasRun\",value:function(e){return this.getPluginRunCount(this.getCurrentPlugin())>(e||0)}},{key:\"dispatch\",value:function(){var e,t=this,n=this,r=this.nextPlugin();if(!r){var o=this.nextPromisedPatch();if(o)return o.then((function(){return t.dispatch()})).catch((function(){return t.dispatch()}));var a={spec:this.state,errors:this.errors};return this.showDebug&&(a.patches=this.allPatches),Ae.a.resolve(a)}if(n.pluginCount=n.pluginCount||{},n.pluginCount[r]=(n.pluginCount[r]||0)+1,n.pluginCount[r]>100)return Ae.a.resolve({spec:n.state,errors:s()(e=n.errors).call(e,new Error(\"We've reached a hard limit of \".concat(100,\" plugin runs\")))});if(r!==this.currentPlugin&&this.promisedPatches.length){var i,u=k()(i=this.promisedPatches).call(i,(function(e){return e.value}));return Ae.a.all(k()(u).call(u,(function(e){return e.then(Pe.a,Pe.a)}))).then((function(){return t.dispatch()}))}return function(){n.currentPlugin=r;var e=n.getCurrentMutations(),t=n.mutations.length-1;try{if(r.isGenerator){var o,a=h()(r(e,n.getLib()));try{for(a.s();!(o=a.n()).done;){c(o.value)}}catch(e){a.e(e)}finally{a.f()}}else{c(r(e,n.getLib()))}}catch(e){console.error(e),c([Se()(Object.create(e),{plugin:r})])}finally{n.updatePluginHistory(r,{mutationIndex:t})}return n.dispatch()}();function c(e){e&&(e=mt.fullyNormalizeArray(e),n.updatePatches(e,r))}}}],[{key:\"getPluginName\",value:function(e){return e.pluginName}},{key:\"getPatchesOfType\",value:function(e,t){return N()(e).call(e,t)}}]),e}();var En={refs:nn,allOf:vn,parameters:gn,properties:yn},Sn=n(58);function Cn(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.requestInterceptor,r=t.responseInterceptor,o=e.withCredentials?\"include\":\"same-origin\";return function(t){return e({url:t,loadSpec:!0,requestInterceptor:n,responseInterceptor:r,headers:{Accept:Kt},credentials:o}).then((function(e){return e.body}))}}function An(e){var t=e.fetch,n=e.spec,r=e.url,o=e.mode,a=e.allowMetaPatches,i=void 0===a||a,s=e.pathDiscriminator,u=e.modelPropertyMacro,l=e.parameterMacro,f=e.requestInterceptor,h=e.responseInterceptor,d=e.skipNormalization,m=e.useCircularStructures,v=e.http,g=e.baseDoc;return g=g||r,v=t||v||ee,n?y(n):Cn(v,{requestInterceptor:f,responseInterceptor:h})(g).then(y);function y(e){g&&(En.refs.docCache[g]=e),En.refs.fetchJSON=Cn(v,{requestInterceptor:f,responseInterceptor:h});var t,n=[En.refs];return\"function\"==typeof l&&n.push(En.parameters),\"function\"==typeof u&&n.push(En.properties),\"strict\"!==o&&n.push(En.allOf),(t={spec:e,context:{baseDoc:g},plugins:n,allowMetaPatches:i,pathDiscriminator:s,parameterMacro:l,modelPropertyMacro:u,useCircularStructures:m},new xn(t).dispatch()).then(d?function(){var e=c()(p.a.mark((function e(t){return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt(\"return\",t);case 1:case\"end\":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}():Sn.d)}}var kn=n(53),On=n.n(kn),jn=n(43),Tn=n.n(jn),In=n(144),Pn=n.n(In),Nn=n(50),Mn=n.n(Nn),Rn=n(536),Dn=n.n(Rn),Ln={body:function(e){var t=e.req,n=e.value;t.body=n},header:function(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{},void 0!==r&&(t.headers[n.name]=r)},query:function(e){var t=e.req,n=e.value,r=e.parameter;t.query=t.query||{},!1===n&&\"boolean\"===r.type&&(n=\"false\");0===n&&[\"number\",\"integer\"].indexOf(r.type)>-1&&(n=\"0\");if(n)t.query[r.name]={collectionFormat:r.collectionFormat,value:n};else if(r.allowEmptyValue&&void 0!==n){var o=r.name;t.query[o]=t.query[o]||{},t.query[o].allowEmptyValue=!0}},path:function(e){var t=e.req,n=e.value,r=e.parameter;t.url=t.url.split(\"{\".concat(r.name,\"}\")).join(encodeURIComponent(n))},formData:function(e){var t=e.req,n=e.value,r=e.parameter;(n||r.allowEmptyValue)&&(t.form=t.form||{},t.form[r.name]={value:n,allowEmptyValue:r.allowEmptyValue,collectionFormat:r.collectionFormat})}};function Bn(e,t){return b()(t).call(t,\"application/json\")?\"string\"==typeof e?e:C()(e):e.toString()}function Fn(e){var t=e.req,n=e.value,r=e.parameter,o=r.name,a=r.style,i=r.explode,s=r.content;if(s){var u=j()(s)[0];t.url=t.url.split(\"{\".concat(o,\"}\")).join(G(Bn(n,u),{escape:!0}))}else{var c=Z({key:r.name,value:n,style:a||\"simple\",explode:i||!1,escape:!0});t.url=t.url.split(\"{\".concat(o,\"}\")).join(c)}}function Un(e){var t=e.req,n=e.value,r=e.parameter;if(t.query=t.query||{},r.content){var o=j()(r.content)[0];t.query[r.name]=Bn(n,o)}else if(!1===n&&(n=\"false\"),0===n&&(n=\"0\"),n)t.query[r.name]={value:n,serializationOption:B()(r,[\"style\",\"explode\",\"allowReserved\"])};else if(r.allowEmptyValue&&void 0!==n){var a=r.name;t.query[a]=t.query[a]||{},t.query[a].allowEmptyValue=!0}}var qn=[\"accept\",\"authorization\",\"content-type\"];function zn(e){var t=e.req,n=e.parameter,r=e.value;if(t.headers=t.headers||{},!(qn.indexOf(n.name.toLowerCase())>-1))if(n.content){var o=j()(n.content)[0];t.headers[n.name]=Bn(r,o)}else void 0!==r&&(t.headers[n.name]=Z({key:n.name,value:r,style:n.style||\"simple\",explode:void 0!==n.explode&&n.explode,escape:!1}))}function Vn(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{};var o=m()(r);if(n.content){var a,i=j()(n.content)[0];t.headers.Cookie=s()(a=\"\".concat(n.name,\"=\")).call(a,Bn(r,i))}else if(\"undefined\"!==o){var u=\"object\"===o&&!Array.isArray(r)&&n.explode?\"\":\"\".concat(n.name,\"=\");t.headers.Cookie=u+Z({key:n.name,value:r,escape:!1,style:n.style||\"form\",explode:void 0!==n.explode&&n.explode})}}var Wn=n(216),Hn=n.n(Wn),$n=n(217),Jn=n.n($n);function Kn(e,t){var n=e.operation,r=e.requestBody,o=e.securities,a=e.spec,i=e.attachContentTypeForEmptyPayload,u=e.requestContentType;t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,o=e.operation,a=void 0===o?{}:o,i=e.spec,u=Hn()({},t),c=r.authorized,l=void 0===c?{}:c,p=a.security||i.security||[],f=l&&!!j()(l).length,h=Tn()(i,[\"components\",\"securitySchemes\"])||{};if(u.headers=u.headers||{},u.query=u.query||{},!j()(r).length||!f||!p||Array.isArray(a.security)&&!a.security.length)return t;return p.forEach((function(e){j()(e).forEach((function(e){var t=l[e],n=h[e];if(t){var r=t.value||t,o=n.type;if(t)if(\"apiKey\"===o)\"query\"===n.in&&(u.query[n.name]=r),\"header\"===n.in&&(u.headers[n.name]=r),\"cookie\"===n.in&&(u.cookies[n.name]=r);else if(\"http\"===o){if(/^basic$/i.test(n.scheme)){var a,i=r.username||\"\",c=r.password||\"\",p=Jn()(s()(a=\"\".concat(i,\":\")).call(a,c));u.headers.Authorization=\"Basic \".concat(p)}/^bearer$/i.test(n.scheme)&&(u.headers.Authorization=\"Bearer \".concat(r))}else if(\"oauth2\"===o||\"openIdConnect\"===o){var f,d=t.token||{},m=d[n[\"x-tokenName\"]||\"access_token\"],v=d.token_type;v&&\"bearer\"!==v.toLowerCase()||(v=\"Bearer\"),u.headers.Authorization=s()(f=\"\".concat(v,\" \")).call(f,m)}}}))})),u}({request:t,securities:o,operation:n,spec:a});var c=n.requestBody||{},l=j()(c.content||{}),p=u&&l.indexOf(u)>-1;if(r||i){if(u&&p)t.headers[\"Content-Type\"]=u;else if(!u){var f=l[0];f&&(t.headers[\"Content-Type\"]=f,u=f)}}else u&&p&&(t.headers[\"Content-Type\"]=u);if(!e.responseContentType&&n.responses){var h,d=N()(h=I()(n.responses)).call(h,(function(e){var t=g()(e,2),n=t[0],r=t[1],o=parseInt(n,10);return o>=200&&o<300&&Pn()(r.content)})).reduce((function(e,t){var n=g()(t,2)[1];return s()(e).call(e,j()(n.content))}),[]);d.length>0&&(t.headers.accept=d.join(\", \"))}if(r)if(u){if(l.indexOf(u)>-1)if(\"application/x-www-form-urlencoded\"===u||\"multipart/form-data\"===u)if(\"object\"===m()(r)){var v=(c.content[u]||{}).encoding||{};t.form={},j()(r).forEach((function(e){t.form[e]={value:r[e],encoding:v[e]||{}}}))}else t.form=r;else t.body=r}else t.body=r;return t}function Yn(e,t){var n,r,o=e.spec,a=e.operation,i=e.securities,u=e.requestContentType,c=e.responseContentType,l=e.attachContentTypeForEmptyPayload;if((t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,o=e.operation,a=void 0===o?{}:o,i=e.spec,u=Hn()({},t),c=r.authorized,l=void 0===c?{}:c,p=r.specSecurity,f=void 0===p?[]:p,h=a.security||f,d=l&&!!j()(l).length,m=i.securityDefinitions;if(u.headers=u.headers||{},u.query=u.query||{},!j()(r).length||!d||!h||Array.isArray(a.security)&&!a.security.length)return t;return h.forEach((function(e){j()(e).forEach((function(e){var t=l[e];if(t){var n=t.token,r=t.value||t,o=m[e],a=o.type,i=o[\"x-tokenName\"]||\"access_token\",c=n&&n[i],p=n&&n.token_type;if(t)if(\"apiKey\"===a){var f=\"query\"===o.in?\"query\":\"headers\";u[f]=u[f]||{},u[f][o.name]=r}else if(\"basic\"===a)if(r.header)u.headers.authorization=r.header;else{var h,d=r.username||\"\",v=r.password||\"\";r.base64=Jn()(s()(h=\"\".concat(d,\":\")).call(h,v)),u.headers.authorization=\"Basic \".concat(r.base64)}else if(\"oauth2\"===a&&c){var g;p=p&&\"bearer\"!==p.toLowerCase()?p:\"Bearer\",u.headers.authorization=s()(g=\"\".concat(p,\" \")).call(g,c)}}}))})),u}({request:t,securities:i,operation:a,spec:o})).body||t.form||l)if(u)t.headers[\"Content-Type\"]=u;else if(Array.isArray(a.consumes)){var p=g()(a.consumes,1);t.headers[\"Content-Type\"]=p[0]}else if(Array.isArray(o.consumes)){var f=g()(o.consumes,1);t.headers[\"Content-Type\"]=f[0]}else a.parameters&&N()(n=a.parameters).call(n,(function(e){return\"file\"===e.type})).length?t.headers[\"Content-Type\"]=\"multipart/form-data\":a.parameters&&N()(r=a.parameters).call(r,(function(e){return\"formData\"===e.in})).length&&(t.headers[\"Content-Type\"]=\"application/x-www-form-urlencoded\");else if(u){var h,d,m=a.parameters&&N()(h=a.parameters).call(h,(function(e){return\"body\"===e.in})).length>0,v=a.parameters&&N()(d=a.parameters).call(d,(function(e){return\"formData\"===e.in})).length>0;(m||v)&&(t.headers[\"Content-Type\"]=u)}return!c&&Array.isArray(a.produces)&&a.produces.length>0&&(t.headers.accept=a.produces.join(\", \")),t}var Gn=[\"http\",\"fetch\",\"spec\",\"operationId\",\"pathName\",\"method\",\"parameters\",\"securities\"],Zn=function(e){return Array.isArray(e)?e:[]},Xn=Lt(\"OperationNotFoundError\",(function(e,t,n){this.originalError=n,Se()(this,t||{})})),Qn={buildRequest:tr};function er(e){var t=e.http,n=e.fetch,r=e.spec,o=e.operationId,a=e.pathName,i=e.method,s=e.parameters,u=e.securities,c=On()(e,Gn),l=t||n||ee;a&&i&&!o&&(o=Object(Sn.c)(a,i));var p=Qn.buildRequest(ye()({spec:r,operationId:o,parameters:s,securities:u,http:l},c));return p.body&&(Pn()(p.body)||Mn()(p.body))&&(p.body=C()(p.body)),l(p)}function tr(e){var t,n,r=e.spec,o=e.operationId,i=e.responseContentType,u=e.scheme,c=e.requestInterceptor,l=e.responseInterceptor,p=e.contextUrl,f=e.userFetch,h=e.server,d=e.serverVariables,m=e.http,v=e.parameters,y=e.parameterBuilders,b=Object(Sn.b)(r);y||(y=b?a:Ln);var _={url:\"\",credentials:m&&m.withCredentials?\"include\":\"same-origin\",headers:{},cookies:{}};c&&(_.requestInterceptor=c),l&&(_.responseInterceptor=l),f&&(_.userFetch=f);var w=Object(Sn.a)(r,o);if(!w)throw new Xn(\"Operation \".concat(o,\" not found\"));var x,E=w.operation,S=void 0===E?{}:E,C=w.method,A=w.pathName;if(_.url+=(x={spec:r,scheme:u,contextUrl:p,server:h,serverVariables:d,pathName:A,method:C},Object(Sn.b)(x.spec)?function(e){var t=e.spec,n=e.pathName,r=e.method,o=e.server,a=e.contextUrl,i=e.serverVariables,u=void 0===i?{}:i,c=Tn()(t,[\"paths\",n,(r||\"\").toLowerCase(),\"servers\"])||Tn()(t,[\"paths\",n,\"servers\"])||Tn()(t,[\"servers\"]),l=\"\",p=null;if(o&&c&&c.length){var f=k()(c).call(c,(function(e){return e.url}));f.indexOf(o)>-1&&(l=o,p=c[f.indexOf(o)])}if(!l&&c&&c.length){l=c[0].url;var h=g()(c,1);p=h[0]}return l.indexOf(\"{\")>-1&&function(e){for(var t,n=[],r=/{([^}]+)}/g;t=r.exec(e);)n.push(t[1]);return n}(l).forEach((function(e){if(p.variables&&p.variables[e]){var t=p.variables[e],n=u[e]||t.default,r=new RegExp(\"{\".concat(e,\"}\"),\"g\");l=l.replace(r,n)}})),function(){var e,t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",o=n&&r?Dt.a.parse(Dt.a.resolve(r,n)):Dt.a.parse(n),a=Dt.a.parse(r),i=nr(o.protocol)||nr(a.protocol)||\"\",u=o.host||a.host,c=o.pathname||\"\";return\"/\"===(e=i&&u?s()(t=\"\".concat(i,\"://\")).call(t,u+c):c)[e.length-1]?$()(e).call(e,0,-1):e}(l,a)}(x):function(e){var t,n,r=e.spec,o=e.scheme,a=e.contextUrl,i=void 0===a?\"\":a,u=Dt.a.parse(i),c=Array.isArray(r.schemes)?r.schemes[0]:null,l=o||c||nr(u.protocol)||\"http\",p=r.host||u.host||\"\",f=r.basePath||\"\";return\"/\"===(t=l&&p?s()(n=\"\".concat(l,\"://\")).call(n,p+f):f)[t.length-1]?$()(t).call(t,0,-1):t}(x)),!o)return delete _.cookies,_;_.url+=A,_.method=\"\".concat(C).toUpperCase(),v=v||{};var O=r.paths[A]||{};i&&(_.headers.accept=i);var T=function(e){var t={};e.forEach((function(e){t[e.in]||(t[e.in]={}),t[e.in][e.name]=e}));var n=[];return j()(t).forEach((function(e){j()(t[e]).forEach((function(r){n.push(t[e][r])}))})),n}(s()(t=s()(n=[]).call(n,Zn(S.parameters))).call(t,Zn(O.parameters)));T.forEach((function(e){var t,n,o=y[e.in];if(\"body\"===e.in&&e.schema&&e.schema.properties&&(t=v),void 0===(t=e&&e.name&&v[e.name]))t=e&&e.name&&v[s()(n=\"\".concat(e.in,\".\")).call(n,e.name)];else if(function(e,t){return N()(t).call(t,(function(t){return t.name===e}))}(e.name,T).length>1){var a;console.warn(s()(a=\"Parameter '\".concat(e.name,\"' is ambiguous because the defined spec has more than one parameter with the name: '\")).call(a,e.name,\"' and the passed-in parameter values did not define an 'in' value.\"))}if(null!==t){if(void 0!==e.default&&void 0===t&&(t=e.default),void 0===t&&e.required&&!e.allowEmptyValue)throw new Error(\"Required parameter \".concat(e.name,\" is not provided\"));if(b&&e.schema&&\"object\"===e.schema.type&&\"string\"==typeof t)try{t=JSON.parse(t)}catch(e){throw new Error(\"Could not parse object parameter value string as JSON\")}o&&o({req:_,parameter:e,value:t,operation:S,spec:r})}}));var I=ye()(ye()({},e),{},{operation:S});if((_=b?Kn(I,_):Yn(I,_)).cookies&&j()(_.cookies).length){var P=j()(_.cookies).reduce((function(e,t){var n=_.cookies[t];return e+(e?\"&\":\"\")+Dn.a.serialize(t,n)}),\"\");_.headers.Cookie=P}return _.cookies&&delete _.cookies,me(_),_}var nr=function(e){return e?e.replace(/\\W/g,\"\"):null};function rr(e,t){return or.apply(this,arguments)}function or(){return(or=c()(p.a.mark((function e(t,n){var r,o,a,i,s,u,c,l,f,h,d,m,v=arguments;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=v.length>2&&void 0!==v[2]?v[2]:{},o=r.returnEntireTree,a=r.baseDoc,i=r.requestInterceptor,s=r.responseInterceptor,u=r.parameterMacro,c=r.modelPropertyMacro,l=r.useCircularStructures,f={pathDiscriminator:n,baseDoc:a,requestInterceptor:i,responseInterceptor:s,parameterMacro:u,modelPropertyMacro:c,useCircularStructures:l},h=Object(Sn.d)({spec:t}),d=h.spec,e.next=6,An(ye()(ye()({},f),{},{spec:d,allowMetaPatches:!0,skipNormalization:!0}));case 6:return m=e.sent,!o&&Array.isArray(n)&&n.length&&(m.spec=Tn()(m.spec,n)||null),e.abrupt(\"return\",m);case 9:case\"end\":return e.stop()}}),e)})))).apply(this,arguments)}var ar=n(304);t.default=function(e){var t,n,r,o=e.configs,a=e.getConfigs;return{fn:{fetch:(t=ee,n=o.preFetch,r=o.postFetch,r=r||function(e){return e},n=n||function(e){return e},function(e){return\"string\"==typeof e&&(e={url:e}),Q.mergeInQueryOrForm(e),e=n(e),r(t(e))}),buildRequest:tr,execute:er,resolve:An,resolveSubtree:function(e,t,n){var r;if(void 0===n){var o=a();n={modelPropertyMacro:o.modelPropertyMacro,parameterMacro:o.parameterMacro,requestInterceptor:o.requestInterceptor,responseInterceptor:o.responseInterceptor}}for(var i=arguments.length,u=new Array(i>3?i-3:0),c=3;c<i;c++)u[c-3]=arguments[c];return rr.apply(void 0,s()(r=[e,t,n]).call(r,u))},serializeRes:oe,opId:Sn.e},statePlugins:{configs:{wrapActions:ar}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return c}));var r=n(170),o=n(148),a=n(311),i=n(312),s=n(313),u={getLocalConfig:function(){return Object(r.parseYamlConfig)('---\\nurl: \"https://petstore.swagger.io/v2/swagger.json\"\\ndom_id: \"#swagger-ui\"\\nvalidatorUrl: \"https://validator.swagger.io/validator\"\\n')}};function c(){return{statePlugins:{spec:{actions:a,selectors:u},configs:{reducers:s.default,actions:o,selectors:i}}}}},function(e,t,n){\"use strict\";(function(e,r){var o,a=n(507);o=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==e?e:r;var i=Object(a.a)(o);t.a=i}).call(this,n(51),n(627)(e))},function(e,t,n){var r=n(415),o=n(191),a=n(763),i=n(50),s=n(429);e.exports=function(e,t,n){var u=i(e)?r:a;return n&&s(e,t,n)&&(t=void 0),u(e,o(t,3))}},function(e,t,n){\"use strict\";var r=n(436),o=n(437),a=n(785);e.exports=function(e){var t,i=r(arguments[1]);return i.normalizer||0!==(t=i.length=o(i.length,e.length,i.async))&&(i.primitive?!1===t?i.normalizer=n(820):t>1&&(i.normalizer=n(821)(t)):i.normalizer=!1===t?n(822)():1===t?n(826)():n(827)(t)),i.async&&n(828),i.promise&&n(829),i.dispose&&n(835),i.maxAge&&n(836),i.max&&n(839),i.refCounter&&n(841),a(e,i)}},function(e,t,n){e.exports=n(886)},function(e,t,n){e.exports=n(891)},function(e,t,n){var r=n(462);e.exports=function(e,t,n){return null==e?e:r(e,t,n)}},function(e,t,n){\"use strict\";t.__esModule=!0,t.connect=t.Provider=void 0;var r=a(n(993)),o=a(n(995));function a(e){return e&&e.__esModule?e:{default:e}}t.Provider=r.default,t.connect=o.default},function(e,t,n){\"use strict\";var r=n(1040),o=n(1041);t.highlight=i,t.highlightAuto=function(e,t){var n,s,u,c,l=t||{},p=l.subset||r.listLanguages(),f=l.prefix,h=p.length,d=-1;null==f&&(f=a);if(\"string\"!=typeof e)throw o(\"Expected `string` for value, got `%s`\",e);s={relevance:0,language:null,value:[]},n={relevance:0,language:null,value:[]};for(;++d<h;)c=p[d],r.getLanguage(c)&&((u=i(c,e,t)).language=c,u.relevance>s.relevance&&(s=u),u.relevance>n.relevance&&(s=n,n=u));s.language&&(n.secondBest=s);return n},t.registerLanguage=function(e,t){r.registerLanguage(e,t)},t.listLanguages=function(){return r.listLanguages()},t.registerAlias=function(e,t){var n,o=e;t&&((o={})[e]=t);for(n in o)r.registerAliases(o[n],{languageName:n})},s.prototype.addText=function(e){var t,n,r=this.stack;if(\"\"===e)return;t=r[r.length-1],(n=t.children[t.children.length-1])&&\"text\"===n.type?n.value+=e:t.children.push({type:\"text\",value:e})},s.prototype.addKeyword=function(e,t){this.openNode(t),this.addText(e),this.closeNode()},s.prototype.addSublanguage=function(e,t){var n=this.stack,r=n[n.length-1],o=e.rootNode.children,a=t?{type:\"element\",tagName:\"span\",properties:{className:[t]},children:o}:o;r.children=r.children.concat(a)},s.prototype.openNode=function(e){var t=this.stack,n=this.options.classPrefix+e,r=t[t.length-1],o={type:\"element\",tagName:\"span\",properties:{className:[n]},children:[]};r.children.push(o),t.push(o)},s.prototype.closeNode=function(){this.stack.pop()},s.prototype.closeAllNodes=u,s.prototype.finalize=u,s.prototype.toHTML=function(){return\"\"};var a=\"hljs-\";function i(e,t,n){var i,u=r.configure({}),c=(n||{}).prefix;if(\"string\"!=typeof e)throw o(\"Expected `string` for name, got `%s`\",e);if(!r.getLanguage(e))throw o(\"Unknown language: `%s` is not registered\",e);if(\"string\"!=typeof t)throw o(\"Expected `string` for value, got `%s`\",t);if(null==c&&(c=a),r.configure({__emitter:s,classPrefix:c}),i=r.highlight(e,t,!0),r.configure(u||{}),i.errorRaised)throw i.errorRaised;return{relevance:i.relevance,language:i.language,value:i.emitter.rootNode.children}}function s(e){this.options=e,this.rootNode={children:[]},this.stack=[this.rootNode]}function u(){}},function(e,t,n){\"use strict\";function r(e){return\"undefined\"!=typeof globalThis?globalThis[e]:\"undefined\"!=typeof self?self[e]:window[e]}Object.defineProperty(t,\"__esModule\",{value:!0}),t.File=t.Blob=t.FormData=void 0,t.FormData=r(\"FormData\"),t.Blob=r(\"Blob\"),t.File=r(\"File\")},function(e,t){e.exports=function(){}},function(e,t,n){\"use strict\";var r=t,o=n(73).Buffer;function a(e,t){try{return decodeURIComponent(e)}catch(n){return r.unescapeBuffer(e,t).toString()}}r.unescapeBuffer=function(e,t){for(var n,r,a,i=new o(e.length),s=0,u=0,c=0;u<=e.length;u++){var l=u<e.length?e.charCodeAt(u):NaN;switch(s){case 0:switch(l){case 37:n=0,r=0,s=1;break;case 43:t&&(l=32);default:i[c++]=l}break;case 1:if(a=l,l>=48&&l<=57)n=l-48;else if(l>=65&&l<=70)n=l-65+10;else{if(!(l>=97&&l<=102)){i[c++]=37,i[c++]=l,s=0;break}n=l-97+10}s=2;break;case 2:if(s=0,l>=48&&l<=57)r=l-48;else if(l>=65&&l<=70)r=l-65+10;else{if(!(l>=97&&l<=102)){i[c++]=37,i[c++]=a,i[c++]=l;break}r=l-97+10}i[c++]=16*n+r}}return i.slice(0,c-1)},r.unescape=a;for(var i=new Array(256),s=0;s<256;++s)i[s]=\"%\"+((s<16?\"0\":\"\")+s.toString(16)).toUpperCase();r.escape=function(e){\"string\"!=typeof e&&(e+=\"\");for(var t=\"\",n=0,r=0;r<e.length;++r){var o=e.charCodeAt(r);if(!(33===o||45===o||46===o||95===o||126===o||o>=39&&o<=42||o>=48&&o<=57||o>=65&&o<=90||o>=97&&o<=122))if(r-n>0&&(t+=e.slice(n,r)),o<128)n=r+1,t+=i[o];else if(o<2048)n=r+1,t+=i[192|o>>6]+i[128|63&o];else if(o<55296||o>=57344)n=r+1,t+=i[224|o>>12]+i[128|o>>6&63]+i[128|63&o];else{var a;if(!(++r<e.length))throw new URIError(\"URI malformed\");a=1023&e.charCodeAt(r),n=r+1,t+=i[240|(o=65536+((1023&o)<<10|a))>>18]+i[128|o>>12&63]+i[128|o>>6&63]+i[128|63&o]}}return 0===n?e:n<e.length?t+e.slice(n):t};var u=function(e){return\"string\"==typeof e?e:\"number\"==typeof e&&isFinite(e)?\"\"+e:\"boolean\"==typeof e?e?\"true\":\"false\":\"\"};function c(e,t){try{return t(e)}catch(t){return r.unescape(e,!0)}}r.stringify=r.encode=function(e,t,n,o){t=t||\"&\",n=n||\"=\";var a=r.escape;if(o&&\"function\"==typeof o.encodeURIComponent&&(a=o.encodeURIComponent),null!==e&&\"object\"==typeof e){for(var i=Object.keys(e),s=i.length,c=s-1,l=\"\",p=0;p<s;++p){var f=i[p],h=e[f],d=a(u(f))+n;if(Array.isArray(h)){for(var m=h.length,v=m-1,g=0;g<m;++g)l+=d+a(u(h[g])),g<v&&(l+=t);m&&p<c&&(l+=t)}else l+=d+a(u(h)),p<c&&(l+=t)}return l}return\"\"},r.parse=r.decode=function(e,t,n,o){t=t||\"&\",n=n||\"=\";var i={};if(\"string\"!=typeof e||0===e.length)return i;\"string\"!=typeof t&&(t+=\"\");var s=n.length,u=t.length,l=1e3;o&&\"number\"==typeof o.maxKeys&&(l=o.maxKeys);var p=1/0;l>0&&(p=l);var f=r.unescape;o&&\"function\"==typeof o.decodeURIComponent&&(f=o.decodeURIComponent);for(var h=f!==a,d=[],m=0,v=0,g=0,y=\"\",b=\"\",_=h,w=h,x=0,E=0;E<e.length;++E){var S=e.charCodeAt(E);if(S!==t.charCodeAt(v)){if(v=0,w||(37===S?x=1:x>0&&(S>=48&&S<=57||S>=65&&S<=70||S>=97&&S<=102)?3==++x&&(w=!0):x=0),g<s){if(S===n.charCodeAt(g)){if(++g===s)m<(A=E-g+1)&&(y+=e.slice(m,A)),x=0,m=E+1;continue}g=0,_||(37===S?x=1:x>0&&(S>=48&&S<=57||S>=65&&S<=70||S>=97&&S<=102)?3==++x&&(_=!0):x=0)}43===S&&(g<s?(E-m>0&&(y+=e.slice(m,E)),y+=\"%20\",_=!0):(E-m>0&&(b+=e.slice(m,E)),b+=\"%20\",w=!0),m=E+1)}else if(++v===u){var C,A=E-v+1;if(g<s?m<A&&(y+=e.slice(m,A)):m<A&&(b+=e.slice(m,A)),_&&(y=c(y,f)),w&&(b=c(b,f)),-1===d.indexOf(y))i[y]=b,d[d.length]=y;else(C=i[y])instanceof Array?C[C.length]=b:i[y]=[C,b];if(0==--p)break;_=w=h,x=0,y=b=\"\",m=E+1,v=g=0}}p>0&&(m<e.length||g>0)&&(m<e.length&&(g<s?y+=e.slice(m):v<u&&(b+=e.slice(m))),_&&(y=c(y,f)),w&&(b=c(b,f)),-1===d.indexOf(y)?(i[y]=b,d[d.length]=y):(C=i[y])instanceof Array?C[C.length]=b:i[y]=[C,b]);return i}},function(e,t,n){var r=n(1080),o=n(406),a=n(426),i=n(92);e.exports=function(e,t,n){return e=i(e),n=null==n?0:r(a(n),0,e.length),t=o(t),e.slice(n,n+t.length)==t}},function(e,t,n){var r=n(92);e.exports=function(e){return r(e).toLowerCase()}},function(e,t,n){\"use strict\";var r=n(1107).DebounceInput;r.DebounceInput=r,e.exports=r},function(e,t,n){var r=n(399),o=n(392),a=n(185),i=n(400);e.exports=function(e){return r(e)||o(e)||a(e)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";var r=n(21),o=n(37),a=n(152),i=n(47),s=n(60),u=n(69),c=n(153),l=n(226),p=n(154),f=n(41),h=n(129),d=f(\"isConcatSpreadable\"),m=9007199254740991,v=\"Maximum allowed index exceeded\",g=h>=51||!o((function(){var e=[];return e[d]=!1,e.concat()[0]!==e})),y=p(\"concat\"),b=function(e){if(!i(e))return!1;var t=e[d];return void 0!==t?!!t:a(e)};r({target:\"Array\",proto:!0,forced:!g||!y},{concat:function(e){var t,n,r,o,a,i=s(this),p=l(i,0),f=0;for(t=-1,r=arguments.length;t<r;t++)if(b(a=-1===t?i:arguments[t])){if(f+(o=u(a.length))>m)throw TypeError(v);for(n=0;n<o;n++,f++)n in a&&c(p,f,a[n])}else{if(f>=m)throw TypeError(v);c(p,f++,a)}return p.length=f,p}})},function(e,t,n){var r=n(48),o=n(37),a=n(225);e.exports=!r&&!o((function(){return 7!=Object.defineProperty(a(\"div\"),\"a\",{get:function(){return 7}}).a}))},function(e,t,n){var r=n(37),o=/#|\\.prototype\\./,a=function(e,t){var n=s[i(e)];return n==c||n!=u&&(\"function\"==typeof t?r(t):!!t)},i=a.normalize=function(e){return String(e).replace(o,\".\").toLowerCase()},s=a.data={},u=a.NATIVE=\"N\",c=a.POLYFILL=\"P\";e.exports=a},function(e,t,n){var r=n(229);e.exports=r&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator},function(e,t,n){\"use strict\";var r=n(21),o=n(40),a=n(70),i=n(97),s=n(48),u=n(229),c=n(363),l=n(37),p=n(55),f=n(152),h=n(47),d=n(52),m=n(60),v=n(66),g=n(178),y=n(105),b=n(109),_=n(155),w=n(234),x=n(547),E=n(235),S=n(127),C=n(68),A=n(176),k=n(67),O=n(110),j=n(227),T=n(181),I=n(156),P=n(179),N=n(41),M=n(236),R=n(44),D=n(98),L=n(78),B=n(86).forEach,F=T(\"hidden\"),U=\"Symbol\",q=N(\"toPrimitive\"),z=L.set,V=L.getterFor(U),W=Object.prototype,H=o.Symbol,$=a(\"JSON\",\"stringify\"),J=S.f,K=C.f,Y=x.f,G=A.f,Z=j(\"symbols\"),X=j(\"op-symbols\"),Q=j(\"string-to-symbol-registry\"),ee=j(\"symbol-to-string-registry\"),te=j(\"wks\"),ne=o.QObject,re=!ne||!ne.prototype||!ne.prototype.findChild,oe=s&&l((function(){return 7!=b(K({},\"a\",{get:function(){return K(this,\"a\",{value:7}).a}})).a}))?function(e,t,n){var r=J(W,t);r&&delete W[t],K(e,t,n),r&&e!==W&&K(W,t,r)}:K,ae=function(e,t){var n=Z[e]=b(H.prototype);return z(n,{type:U,tag:e,description:t}),s||(n.description=t),n},ie=c?function(e){return\"symbol\"==typeof e}:function(e){return Object(e)instanceof H},se=function(e,t,n){e===W&&se(X,t,n),d(e);var r=g(t,!0);return d(n),p(Z,r)?(n.enumerable?(p(e,F)&&e[F][r]&&(e[F][r]=!1),n=b(n,{enumerable:y(0,!1)})):(p(e,F)||K(e,F,y(1,{})),e[F][r]=!0),oe(e,r,n)):K(e,r,n)},ue=function(e,t){d(e);var n=v(t),r=_(n).concat(fe(n));return B(r,(function(t){s&&!ce.call(n,t)||se(e,t,n[t])})),e},ce=function(e){var t=g(e,!0),n=G.call(this,t);return!(this===W&&p(Z,t)&&!p(X,t))&&(!(n||!p(this,t)||!p(Z,t)||p(this,F)&&this[F][t])||n)},le=function(e,t){var n=v(e),r=g(t,!0);if(n!==W||!p(Z,r)||p(X,r)){var o=J(n,r);return!o||!p(Z,r)||p(n,F)&&n[F][r]||(o.enumerable=!0),o}},pe=function(e){var t=Y(v(e)),n=[];return B(t,(function(e){p(Z,e)||p(I,e)||n.push(e)})),n},fe=function(e){var t=e===W,n=Y(t?X:v(e)),r=[];return B(n,(function(e){!p(Z,e)||t&&!p(W,e)||r.push(Z[e])})),r};(u||(O((H=function(){if(this instanceof H)throw TypeError(\"Symbol is not a constructor\");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=P(e),n=function(e){this===W&&n.call(X,e),p(this,F)&&p(this[F],t)&&(this[F][t]=!1),oe(this,t,y(1,e))};return s&&re&&oe(W,t,{configurable:!0,set:n}),ae(t,e)}).prototype,\"toString\",(function(){return V(this).tag})),O(H,\"withoutSetter\",(function(e){return ae(P(e),e)})),A.f=ce,C.f=se,S.f=le,w.f=x.f=pe,E.f=fe,M.f=function(e){return ae(N(e),e)},s&&(K(H.prototype,\"description\",{configurable:!0,get:function(){return V(this).description}}),i||O(W,\"propertyIsEnumerable\",ce,{unsafe:!0}))),r({global:!0,wrap:!0,forced:!u,sham:!u},{Symbol:H}),B(_(te),(function(e){R(e)})),r({target:U,stat:!0,forced:!u},{for:function(e){var t=String(e);if(p(Q,t))return Q[t];var n=H(t);return Q[t]=n,ee[n]=t,n},keyFor:function(e){if(!ie(e))throw TypeError(e+\" is not a symbol\");if(p(ee,e))return ee[e]},useSetter:function(){re=!0},useSimple:function(){re=!1}}),r({target:\"Object\",stat:!0,forced:!u,sham:!s},{create:function(e,t){return void 0===t?b(e):ue(b(e),t)},defineProperty:se,defineProperties:ue,getOwnPropertyDescriptor:le}),r({target:\"Object\",stat:!0,forced:!u},{getOwnPropertyNames:pe,getOwnPropertySymbols:fe}),r({target:\"Object\",stat:!0,forced:l((function(){E.f(1)}))},{getOwnPropertySymbols:function(e){return E.f(m(e))}}),$)&&r({target:\"JSON\",stat:!0,forced:!u||l((function(){var e=H();return\"[null]\"!=$([e])||\"{}\"!=$({a:e})||\"{}\"!=$(Object(e))}))},{stringify:function(e,t,n){for(var r,o=[e],a=1;arguments.length>a;)o.push(arguments[a++]);if(r=t,(h(t)||void 0!==e)&&!ie(e))return f(t)||(t=function(e,t){if(\"function\"==typeof r&&(t=r.call(this,e,t)),!ie(t))return t}),o[1]=t,$.apply(null,o)}});H.prototype[q]||k(H.prototype,q,H.prototype.valueOf),D(H,U),I[F]=!0},function(e,t,n){var r=n(55),o=n(66),a=n(231).indexOf,i=n(156);e.exports=function(e,t){var n,s=o(e),u=0,c=[];for(n in s)!r(i,n)&&r(s,n)&&c.push(n);for(;t.length>u;)r(s,n=t[u++])&&(~a(c,n)||c.push(n));return c}},function(e,t,n){var r=n(70);e.exports=r(\"document\",\"documentElement\")},function(e,t,n){var r=n(40),o=n(368),a=r.WeakMap;e.exports=\"function\"==typeof a&&/native code/.test(o(a))},function(e,t,n){var r=n(228),o=Function.toString;\"function\"!=typeof r.inspectSource&&(r.inspectSource=function(e){return o.call(e)}),e.exports=r.inspectSource},function(e,t,n){n(44)(\"iterator\")},function(e,t,n){var r=n(128),o=n(106),a=function(e){return function(t,n){var a,i,s=String(o(t)),u=r(n),c=s.length;return u<0||u>=c?e?\"\":void 0:(a=s.charCodeAt(u))<55296||a>56319||u+1===c||(i=s.charCodeAt(u+1))<56320||i>57343?e?s.charAt(u):a:e?s.slice(u,u+2):i-56320+(a-55296<<10)+65536}};e.exports={codeAt:a(!1),charAt:a(!0)}},function(e,t,n){\"use strict\";var r=n(372).IteratorPrototype,o=n(109),a=n(105),i=n(98),s=n(131),u=function(){return this};e.exports=function(e,t,n){var c=t+\" Iterator\";return e.prototype=o(r,{next:a(1,n)}),i(e,c,!1,!0),s[c]=u,e}},function(e,t,n){\"use strict\";var r,o,a,i=n(37),s=n(182),u=n(67),c=n(55),l=n(41),p=n(97),f=l(\"iterator\"),h=!1;[].keys&&(\"next\"in(a=[].keys())?(o=s(s(a)))!==Object.prototype&&(r=o):h=!0);var d=null==r||i((function(){var e={};return r[f].call(e)!==e}));d&&(r={}),p&&!d||c(r,f)||u(r,f,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:h}},function(e,t,n){var r=n(37);e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},function(e,t,n){var r=n(581),o=Array.prototype;e.exports=function(e){var t=e.filter;return e===o||e instanceof Array&&t===o.filter?r:t}},function(e,t,n){n(584);var r=n(34);e.exports=r.Object.keys},function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return\"[object Array]\"==n.call(e)}},function(e,t,n){n(591);var r=n(34).Object,o=e.exports=function(e,t,n){return r.defineProperty(e,t,n)};r.defineProperty.sham&&(o.sham=!0)},function(e,t,n){\"use strict\";var r=n(77),o=n(47),a=[].slice,i={},s=function(e,t,n){if(!(t in i)){for(var r=[],o=0;o<t;o++)r[o]=\"a[\"+o+\"]\";i[t]=Function(\"C,a\",\"return new C(\"+r.join(\",\")+\")\")}return i[t](e,n)};e.exports=Function.bind||function(e){var t=r(this),n=a.call(arguments,1),i=function(){var r=n.concat(a.call(arguments));return this instanceof i?s(t,r.length,r):t.apply(e,r)};return o(t.prototype)&&(i.prototype=t.prototype),i}},function(e,t,n){n(597);var r=n(34);e.exports=r.Object.assign},function(e,t,n){\"use strict\";var r=n(48),o=n(37),a=n(155),i=n(235),s=n(176),u=n(60),c=n(177),l=Object.assign,p=Object.defineProperty;e.exports=!l||o((function(){if(r&&1!==l({b:1},l(p({},\"a\",{enumerable:!0,get:function(){p(this,\"b\",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),o=\"abcdefghijklmnopqrst\";return e[n]=7,o.split(\"\").forEach((function(e){t[e]=e})),7!=l({},e)[n]||a(l({},t)).join(\"\")!=o}))?function(e,t){for(var n=u(e),o=arguments.length,l=1,p=i.f,f=s.f;o>l;)for(var h,d=c(arguments[l++]),m=p?a(d).concat(p(d)):a(d),v=m.length,g=0;v>g;)h=m[g++],r&&!f.call(d,h)||(n[h]=d[h]);return n}:l},function(e,t,n){var r=n(599),o=Array.prototype;e.exports=function(e){var t=e.slice;return e===o||e instanceof Array&&t===o.slice?r:t}},function(e,t,n){n(602);var r=n(34);e.exports=r.Array.isArray},function(e,t,n){\"use strict\";var r=n(158),o=n(38),a=n(384),i=(n(385),n(241));n(25),n(612);function s(e,t,n){this.props=e,this.context=t,this.refs=i,this.updater=n||a}function u(e,t,n){this.props=e,this.context=t,this.refs=i,this.updater=n||a}function c(){}s.prototype.isReactComponent={},s.prototype.setState=function(e,t){\"object\"!=typeof e&&\"function\"!=typeof e&&null!=e&&r(\"85\"),this.updater.enqueueSetState(this,e),t&&this.updater.enqueueCallback(this,t,\"setState\")},s.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this),e&&this.updater.enqueueCallback(this,e,\"forceUpdate\")},c.prototype=s.prototype,u.prototype=new c,u.prototype.constructor=u,o(u.prototype,s.prototype),u.prototype.isPureReactComponent=!0,e.exports={Component:s,PureComponent:u}},function(e,t,n){\"use strict\";n(33);var r={isMounted:function(e){return!1},enqueueCallback:function(e,t){},enqueueForceUpdate:function(e){},enqueueReplaceState:function(e,t){},enqueueSetState:function(e,t){}};e.exports=r},function(e,t,n){\"use strict\";e.exports=!1},function(e,t,n){\"use strict\";var r=\"function\"==typeof Symbol&&Symbol.for&&Symbol.for(\"react.element\")||60103;e.exports=r},function(e,t,n){\"use strict\";var r=n(620);e.exports=function(e){return r(e,!1)}},function(e,t,n){\"use strict\";e.exports=n(621)},function(e,t,n){\"use strict\";e.exports=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\"},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e){return e&&\"@@redux/INIT\"===e.type?\"initialState argument passed to createStore\":\"previous state received by the reducer\"},e.exports=t.default},function(e,t){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(175),o=n(243),a=n(393);e.exports=function(e){if(void 0!==r&&null!=o(e)||null!=e[\"@@iterator\"])return a(e)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(635)},function(e,t,n){n(130),n(636);var r=n(34);e.exports=r.Array.from},function(e,t,n){\"use strict\";var r=n(107),o=n(60),a=n(637),i=n(397),s=n(69),u=n(153),c=n(159);e.exports=function(e){var t,n,l,p,f,h,d=o(e),m=\"function\"==typeof this?this:Array,v=arguments.length,g=v>1?arguments[1]:void 0,y=void 0!==g,b=c(d),_=0;if(y&&(g=r(g,v>2?arguments[2]:void 0,2)),null==b||m==Array&&i(b))for(n=new m(t=s(d.length));t>_;_++)h=y?g(d[_],_):d[_],u(n,_,h);else for(f=(p=b.call(d)).next,n=new m;!(l=f.call(p)).done;_++)h=y?a(p,g,[l.value,_],!0):l.value,u(n,_,h);return n.length=_,n}},function(e,t,n){var r=n(52);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},function(e,t,n){var r=n(41),o=n(131),a=r(\"iterator\"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(o.Array===e||i[a]===e)}},function(e,t,n){var r=n(41)(\"iterator\"),o=!1;try{var a=0,i={next:function(){return{done:!!a++}},return:function(){o=!0}};i[r]=function(){return this},Array.from(i,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var a={};a[r]=function(){return{next:function(){return{done:n=!0}}}},e(a)}catch(e){}return n}},function(e,t,n){var r=n(242);e.exports=function(e){if(r(e))return e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){n(87);var r=n(645),o=n(99),a=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.forEach;return e===a||e instanceof Array&&t===a.forEach||i.hasOwnProperty(o(e))?r:t}},function(e,t,n){var r=n(667);e.exports=function(e){if(r(e))throw TypeError(\"The method doesn't accept regular expressions\");return e}},function(e,t,n){var r=n(41)(\"match\");e.exports=function(e){var t=/./;try{\"/./\"[e](t)}catch(n){try{return t[r]=!1,\"/./\"[e](t)}catch(e){}}return!1}},function(e,t,n){var r=n(669),o=Array.prototype;e.exports=function(e){var t=e.indexOf;return e===o||e instanceof Array&&t===o.indexOf?r:t}},function(e,t){e.exports=\"\\t\\n\\v\\f\\r                　\\u2028\\u2029\\ufeff\"},function(e,t,n){var r=n(134),o=n(408),a=n(50),i=n(186),s=r?r.prototype:void 0,u=s?s.toString:void 0;e.exports=function e(t){if(\"string\"==typeof t)return t;if(a(t))return o(t,e)+\"\";if(i(t))return u?u.call(t):\"\";var n=t+\"\";return\"0\"==n&&1/t==-Infinity?\"-0\":n}},function(e,t,n){(function(t){var n=\"object\"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(this,n(51))},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}},function(e,t){e.exports=function(e,t,n){var r=-1,o=e.length;t<0&&(t=-t>o?0:o+t),(n=n>o?o:n)<0&&(n+=o),o=t>n?0:n-t>>>0,t>>>=0;for(var a=Array(o);++r<o;)a[r]=e[r+t];return a}},function(e,t){var n=RegExp(\"[\\\\u200d\\\\ud800-\\\\udfff\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff\\\\ufe0e\\\\ufe0f]\");e.exports=function(e){return n.test(e)}},function(e,t){e.exports=function(e,t,n,r){var o=-1,a=null==e?0:e.length;for(r&&a&&(n=e[++o]);++o<a;)n=t(n,e[o],o,e);return n}},function(e,t){var n=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return n.call(e)}catch(e){}try{return e+\"\"}catch(e){}}return\"\"}},function(e,t,n){var r=n(730),o=n(89);e.exports=function e(t,n,a,i,s){return t===n||(null==t||null==n||!o(t)&&!o(n)?t!=t&&n!=n:r(t,n,a,i,e,s))}},function(e,t,n){var r=n(731),o=n(415),a=n(734);e.exports=function(e,t,n,i,s,u){var c=1&n,l=e.length,p=t.length;if(l!=p&&!(c&&p>l))return!1;var f=u.get(e),h=u.get(t);if(f&&h)return f==t&&h==e;var d=-1,m=!0,v=2&n?new r:void 0;for(u.set(e,t),u.set(t,e);++d<l;){var g=e[d],y=t[d];if(i)var b=c?i(y,g,d,t,e,u):i(g,y,d,e,t,u);if(void 0!==b){if(b)continue;m=!1;break}if(v){if(!o(t,(function(e,t){if(!a(v,t)&&(g===e||s(g,e,n,i,u)))return v.push(t)}))){m=!1;break}}else if(g!==y&&!s(g,y,n,i,u)){m=!1;break}}return u.delete(e),u.delete(t),m}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n<r;)if(t(e[n],n,e))return!0;return!1}},function(e,t,n){var r=n(71).Uint8Array;e.exports=r},function(e,t,n){var r=n(418),o=n(248),a=n(114);e.exports=function(e){return r(e,a,o)}},function(e,t,n){var r=n(247),o=n(50);e.exports=function(e,t,n){var a=t(e);return o(e)?a:r(a,n(e))}},function(e,t){e.exports=function(){return[]}},function(e,t,n){var r=n(740),o=n(192),a=n(50),i=n(193),s=n(195),u=n(249),c=Object.prototype.hasOwnProperty;e.exports=function(e,t){var n=a(e),l=!n&&o(e),p=!n&&!l&&i(e),f=!n&&!l&&!p&&u(e),h=n||l||p||f,d=h?r(e.length,String):[],m=d.length;for(var v in e)!t&&!c.call(e,v)||h&&(\"length\"==v||p&&(\"offset\"==v||\"parent\"==v)||f&&(\"buffer\"==v||\"byteLength\"==v||\"byteOffset\"==v)||s(v,m))||d.push(v);return d}},function(e,t,n){var r=n(160),o=n(744),a=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return o(e);var t=[];for(var n in Object(e))a.call(e,n)&&\"constructor\"!=n&&t.push(n);return t}},function(e,t){e.exports=function(e,t){return function(n){return e(t(n))}}},function(e,t,n){var r=n(57);e.exports=function(e){return e==e&&!r(e)}},function(e,t){e.exports=function(e,t){return function(n){return null!=n&&(n[e]===t&&(void 0!==t||e in Object(n)))}}},function(e,t,n){var r=n(753),o=n(754);e.exports=function(e,t){return null!=e&&o(e,t,r)}},function(e,t,n){var r=n(760);e.exports=function(e){var t=r(e),n=t%1;return t==t?n?t-n:t:0}},function(e,t,n){var r=n(761),o=n(57),a=n(186),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,u=/^0o[0-7]+$/i,c=parseInt;e.exports=function(e){if(\"number\"==typeof e)return e;if(a(e))return NaN;if(o(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=r(e);var n=s.test(e);return n||u.test(e)?c(e.slice(2),n?2:8):i.test(e)?NaN:+e}},function(e,t,n){var r=n(764),o=n(767)(r);e.exports=o},function(e,t,n){var r=n(123),o=n(115),a=n(195),i=n(57);e.exports=function(e,t,n){if(!i(n))return!1;var s=typeof t;return!!(\"number\"==s?o(n)&&a(t,n.length):\"string\"==s&&t in n)&&r(n[t],e)}},function(e,t,n){\"use strict\";(function(t,r){var o=n(197);e.exports=b;var a,i=n(376);b.ReadableState=y;n(255).EventEmitter;var s=function(e,t){return e.listeners(t).length},u=n(431),c=n(62).Buffer,l=t.Uint8Array||function(){};var p=n(162);p.inherits=n(61);var f=n(770),h=void 0;h=f&&f.debuglog?f.debuglog(\"stream\"):function(){};var d,m=n(771),v=n(432);p.inherits(b,u);var g=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];function y(e,t){e=e||{};var r=t instanceof(a=a||n(116));this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var o=e.highWaterMark,i=e.readableHighWaterMark,s=this.objectMode?16:16384;this.highWaterMark=o||0===o?o:r&&(i||0===i)?i:s,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new m,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||\"utf8\",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(d||(d=n(434).StringDecoder),this.decoder=new d(e.encoding),this.encoding=e.encoding)}function b(e){if(a=a||n(116),!(this instanceof b))return new b(e);this._readableState=new y(e,this),this.readable=!0,e&&(\"function\"==typeof e.read&&(this._read=e.read),\"function\"==typeof e.destroy&&(this._destroy=e.destroy)),u.call(this)}function _(e,t,n,r,o){var a,i=e._readableState;null===t?(i.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var n=t.decoder.end();n&&n.length&&(t.buffer.push(n),t.length+=t.objectMode?1:n.length)}t.ended=!0,S(e)}(e,i)):(o||(a=function(e,t){var n;r=t,c.isBuffer(r)||r instanceof l||\"string\"==typeof t||void 0===t||e.objectMode||(n=new TypeError(\"Invalid non-string/buffer chunk\"));var r;return n}(i,t)),a?e.emit(\"error\",a):i.objectMode||t&&t.length>0?(\"string\"==typeof t||i.objectMode||Object.getPrototypeOf(t)===c.prototype||(t=function(e){return c.from(e)}(t)),r?i.endEmitted?e.emit(\"error\",new Error(\"stream.unshift() after end event\")):w(e,i,t,!0):i.ended?e.emit(\"error\",new Error(\"stream.push() after EOF\")):(i.reading=!1,i.decoder&&!n?(t=i.decoder.write(t),i.objectMode||0!==t.length?w(e,i,t,!1):A(e,i)):w(e,i,t,!1))):r||(i.reading=!1));return function(e){return!e.ended&&(e.needReadable||e.length<e.highWaterMark||0===e.length)}(i)}function w(e,t,n,r){t.flowing&&0===t.length&&!t.sync?(e.emit(\"data\",n),e.read(0)):(t.length+=t.objectMode?1:n.length,r?t.buffer.unshift(n):t.buffer.push(n),t.needReadable&&S(e)),A(e,t)}Object.defineProperty(b.prototype,\"destroyed\",{get:function(){return void 0!==this._readableState&&this._readableState.destroyed},set:function(e){this._readableState&&(this._readableState.destroyed=e)}}),b.prototype.destroy=v.destroy,b.prototype._undestroy=v.undestroy,b.prototype._destroy=function(e,t){this.push(null),t(e)},b.prototype.push=function(e,t){var n,r=this._readableState;return r.objectMode?n=!0:\"string\"==typeof e&&((t=t||r.defaultEncoding)!==r.encoding&&(e=c.from(e,t),t=\"\"),n=!0),_(this,e,t,!1,n)},b.prototype.unshift=function(e){return _(this,e,null,!0,!1)},b.prototype.isPaused=function(){return!1===this._readableState.flowing},b.prototype.setEncoding=function(e){return d||(d=n(434).StringDecoder),this._readableState.decoder=new d(e),this._readableState.encoding=e,this};var x=8388608;function E(e,t){return e<=0||0===t.length&&t.ended?0:t.objectMode?1:e!=e?t.flowing&&t.length?t.buffer.head.data.length:t.length:(e>t.highWaterMark&&(t.highWaterMark=function(e){return e>=x?e=x:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function S(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(h(\"emitReadable\",t.flowing),t.emittedReadable=!0,t.sync?o.nextTick(C,e):C(e))}function C(e){h(\"emit readable\"),e.emit(\"readable\"),T(e)}function A(e,t){t.readingMore||(t.readingMore=!0,o.nextTick(k,e,t))}function k(e,t){for(var n=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length<t.highWaterMark&&(h(\"maybeReadMore read 0\"),e.read(0),n!==t.length);)n=t.length;t.readingMore=!1}function O(e){h(\"readable nexttick read 0\"),e.read(0)}function j(e,t){t.reading||(h(\"resume read 0\"),e.read(0)),t.resumeScheduled=!1,t.awaitDrain=0,e.emit(\"resume\"),T(e),t.flowing&&!t.reading&&e.read(0)}function T(e){var t=e._readableState;for(h(\"flow\",t.flowing);t.flowing&&null!==e.read(););}function I(e,t){return 0===t.length?null:(t.objectMode?n=t.buffer.shift():!e||e>=t.length?(n=t.decoder?t.buffer.join(\"\"):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):n=function(e,t,n){var r;e<t.head.data.length?(r=t.head.data.slice(0,e),t.head.data=t.head.data.slice(e)):r=e===t.head.data.length?t.shift():n?function(e,t){var n=t.head,r=1,o=n.data;e-=o.length;for(;n=n.next;){var a=n.data,i=e>a.length?a.length:e;if(i===a.length?o+=a:o+=a.slice(0,e),0===(e-=i)){i===a.length?(++r,n.next?t.head=n.next:t.head=t.tail=null):(t.head=n,n.data=a.slice(i));break}++r}return t.length-=r,o}(e,t):function(e,t){var n=c.allocUnsafe(e),r=t.head,o=1;r.data.copy(n),e-=r.data.length;for(;r=r.next;){var a=r.data,i=e>a.length?a.length:e;if(a.copy(n,n.length-e,0,i),0===(e-=i)){i===a.length?(++o,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=a.slice(i));break}++o}return t.length-=o,n}(e,t);return r}(e,t.buffer,t.decoder),n);var n}function P(e){var t=e._readableState;if(t.length>0)throw new Error('\"endReadable()\" called on non-empty stream');t.endEmitted||(t.ended=!0,o.nextTick(N,t,e))}function N(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit(\"end\"))}function M(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1}b.prototype.read=function(e){h(\"read\",e),e=parseInt(e,10);var t=this._readableState,n=e;if(0!==e&&(t.emittedReadable=!1),0===e&&t.needReadable&&(t.length>=t.highWaterMark||t.ended))return h(\"read: emitReadable\",t.length,t.ended),0===t.length&&t.ended?P(this):S(this),null;if(0===(e=E(e,t))&&t.ended)return 0===t.length&&P(this),null;var r,o=t.needReadable;return h(\"need readable\",o),(0===t.length||t.length-e<t.highWaterMark)&&h(\"length less than watermark\",o=!0),t.ended||t.reading?h(\"reading or ended\",o=!1):o&&(h(\"do read\"),t.reading=!0,t.sync=!0,0===t.length&&(t.needReadable=!0),this._read(t.highWaterMark),t.sync=!1,t.reading||(e=E(n,t))),null===(r=e>0?I(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),n!==e&&t.ended&&P(this)),null!==r&&this.emit(\"data\",r),r},b.prototype._read=function(e){this.emit(\"error\",new Error(\"_read() is not implemented\"))},b.prototype.pipe=function(e,t){var n=this,a=this._readableState;switch(a.pipesCount){case 0:a.pipes=e;break;case 1:a.pipes=[a.pipes,e];break;default:a.pipes.push(e)}a.pipesCount+=1,h(\"pipe count=%d opts=%j\",a.pipesCount,t);var u=(!t||!1!==t.end)&&e!==r.stdout&&e!==r.stderr?l:b;function c(t,r){h(\"onunpipe\"),t===n&&r&&!1===r.hasUnpiped&&(r.hasUnpiped=!0,h(\"cleanup\"),e.removeListener(\"close\",g),e.removeListener(\"finish\",y),e.removeListener(\"drain\",p),e.removeListener(\"error\",v),e.removeListener(\"unpipe\",c),n.removeListener(\"end\",l),n.removeListener(\"end\",b),n.removeListener(\"data\",m),f=!0,!a.awaitDrain||e._writableState&&!e._writableState.needDrain||p())}function l(){h(\"onend\"),e.end()}a.endEmitted?o.nextTick(u):n.once(\"end\",u),e.on(\"unpipe\",c);var p=function(e){return function(){var t=e._readableState;h(\"pipeOnDrain\",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&s(e,\"data\")&&(t.flowing=!0,T(e))}}(n);e.on(\"drain\",p);var f=!1;var d=!1;function m(t){h(\"ondata\"),d=!1,!1!==e.write(t)||d||((1===a.pipesCount&&a.pipes===e||a.pipesCount>1&&-1!==M(a.pipes,e))&&!f&&(h(\"false write response, pause\",n._readableState.awaitDrain),n._readableState.awaitDrain++,d=!0),n.pause())}function v(t){h(\"onerror\",t),b(),e.removeListener(\"error\",v),0===s(e,\"error\")&&e.emit(\"error\",t)}function g(){e.removeListener(\"finish\",y),b()}function y(){h(\"onfinish\"),e.removeListener(\"close\",g),b()}function b(){h(\"unpipe\"),n.unpipe(e)}return n.on(\"data\",m),function(e,t,n){if(\"function\"==typeof e.prependListener)return e.prependListener(t,n);e._events&&e._events[t]?i(e._events[t])?e._events[t].unshift(n):e._events[t]=[n,e._events[t]]:e.on(t,n)}(e,\"error\",v),e.once(\"close\",g),e.once(\"finish\",y),e.emit(\"pipe\",n),a.flowing||(h(\"pipe resume\"),n.resume()),e},b.prototype.unpipe=function(e){var t=this._readableState,n={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit(\"unpipe\",this,n)),this;if(!e){var r=t.pipes,o=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var a=0;a<o;a++)r[a].emit(\"unpipe\",this,n);return this}var i=M(t.pipes,e);return-1===i||(t.pipes.splice(i,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit(\"unpipe\",this,n)),this},b.prototype.on=function(e,t){var n=u.prototype.on.call(this,e,t);if(\"data\"===e)!1!==this._readableState.flowing&&this.resume();else if(\"readable\"===e){var r=this._readableState;r.endEmitted||r.readableListening||(r.readableListening=r.needReadable=!0,r.emittedReadable=!1,r.reading?r.length&&S(this):o.nextTick(O,this))}return n},b.prototype.addListener=b.prototype.on,b.prototype.resume=function(){var e=this._readableState;return e.flowing||(h(\"resume\"),e.flowing=!0,function(e,t){t.resumeScheduled||(t.resumeScheduled=!0,o.nextTick(j,e,t))}(this,e)),this},b.prototype.pause=function(){return h(\"call pause flowing=%j\",this._readableState.flowing),!1!==this._readableState.flowing&&(h(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this},b.prototype.wrap=function(e){var t=this,n=this._readableState,r=!1;for(var o in e.on(\"end\",(function(){if(h(\"wrapped end\"),n.decoder&&!n.ended){var e=n.decoder.end();e&&e.length&&t.push(e)}t.push(null)})),e.on(\"data\",(function(o){(h(\"wrapped data\"),n.decoder&&(o=n.decoder.write(o)),n.objectMode&&null==o)||(n.objectMode||o&&o.length)&&(t.push(o)||(r=!0,e.pause()))})),e)void 0===this[o]&&\"function\"==typeof e[o]&&(this[o]=function(t){return function(){return e[t].apply(e,arguments)}}(o));for(var a=0;a<g.length;a++)e.on(g[a],this.emit.bind(this,g[a]));return this._read=function(t){h(\"wrapped _read\",t),r&&(r=!1,e.resume())},this},Object.defineProperty(b.prototype,\"readableHighWaterMark\",{enumerable:!1,get:function(){return this._readableState.highWaterMark}}),b._fromList=I}).call(this,n(51),n(90))},function(e,t,n){e.exports=n(255).EventEmitter},function(e,t,n){\"use strict\";var r=n(197);function o(e,t){e.emit(\"error\",t)}e.exports={destroy:function(e,t){var n=this,a=this._readableState&&this._readableState.destroyed,i=this._writableState&&this._writableState.destroyed;return a||i?(t?t(e):!e||this._writableState&&this._writableState.errorEmitted||r.nextTick(o,this,e),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(e||null,(function(e){!t&&e?(r.nextTick(o,n,e),n._writableState&&(n._writableState.errorEmitted=!0)):t&&t(e)})),this)},undestroy:function(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}}},function(e,t,n){(function(e){var r=void 0!==e&&e||\"undefined\"!=typeof self&&self||window,o=Function.prototype.apply;function a(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new a(o.call(setTimeout,r,arguments),clearTimeout)},t.setInterval=function(){return new a(o.call(setInterval,r,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},a.prototype.unref=a.prototype.ref=function(){},a.prototype.close=function(){this._clearFn.call(r,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(773),t.setImmediate=\"undefined\"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate=\"undefined\"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(51))},function(e,t,n){\"use strict\";var r=n(62).Buffer,o=r.isEncoding||function(e){switch((e=\"\"+e)&&e.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};function a(e){var t;switch(this.encoding=function(e){var t=function(e){if(!e)return\"utf8\";for(var t;;)switch(e){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return e;default:if(t)return;e=(\"\"+e).toLowerCase(),t=!0}}(e);if(\"string\"!=typeof t&&(r.isEncoding===o||!o(e)))throw new Error(\"Unknown encoding: \"+e);return t||e}(e),this.encoding){case\"utf16le\":this.text=u,this.end=c,t=4;break;case\"utf8\":this.fillLast=s,t=4;break;case\"base64\":this.text=l,this.end=p,t=3;break;default:return this.write=f,void(this.end=h)}this.lastNeed=0,this.lastTotal=0,this.lastChar=r.allocUnsafe(t)}function i(e){return e<=127?0:e>>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function s(e){var t=this.lastTotal-this.lastNeed,n=function(e,t,n){if(128!=(192&t[0]))return e.lastNeed=0,\"�\";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,\"�\";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,\"�\"}}(this,e);return void 0!==n?n:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function u(e,t){if((e.length-t)%2==0){var n=e.toString(\"utf16le\",t);if(n){var r=n.charCodeAt(n.length-1);if(r>=55296&&r<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],n.slice(0,-1)}return n}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString(\"utf16le\",t,e.length-1)}function c(e){var t=e&&e.length?this.write(e):\"\";if(this.lastNeed){var n=this.lastTotal-this.lastNeed;return t+this.lastChar.toString(\"utf16le\",0,n)}return t}function l(e,t){var n=(e.length-t)%3;return 0===n?e.toString(\"base64\",t):(this.lastNeed=3-n,this.lastTotal=3,1===n?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString(\"base64\",t,e.length-n))}function p(e){var t=e&&e.length?this.write(e):\"\";return this.lastNeed?t+this.lastChar.toString(\"base64\",0,3-this.lastNeed):t}function f(e){return e.toString(this.encoding)}function h(e){return e&&e.length?this.write(e):\"\"}t.StringDecoder=a,a.prototype.write=function(e){if(0===e.length)return\"\";var t,n;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return\"\";n=this.lastNeed,this.lastNeed=0}else n=0;return n<e.length?t?t+this.text(e,n):this.text(e,n):t||\"\"},a.prototype.end=function(e){var t=e&&e.length?this.write(e):\"\";return this.lastNeed?t+\"�\":t},a.prototype.text=function(e,t){var n=function(e,t,n){var r=t.length-1;if(r<n)return 0;var o=i(t[r]);if(o>=0)return o>0&&(e.lastNeed=o-1),o;if(--r<n||-2===o)return 0;if((o=i(t[r]))>=0)return o>0&&(e.lastNeed=o-2),o;if(--r<n||-2===o)return 0;if((o=i(t[r]))>=0)return o>0&&(2===o?o=0:e.lastNeed=o-3),o;return 0}(this,e,t);if(!this.lastNeed)return e.toString(\"utf8\",t);this.lastTotal=n;var r=e.length-(n-this.lastNeed);return e.copy(this.lastChar,0,r),e.toString(\"utf8\",t,r)},a.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},function(e,t,n){\"use strict\";e.exports=i;var r=n(116),o=n(162);function a(e,t){var n=this._transformState;n.transforming=!1;var r=n.writecb;if(!r)return this.emit(\"error\",new Error(\"write callback called multiple times\"));n.writechunk=null,n.writecb=null,null!=t&&this.push(t),r(e);var o=this._readableState;o.reading=!1,(o.needReadable||o.length<o.highWaterMark)&&this._read(o.highWaterMark)}function i(e){if(!(this instanceof i))return new i(e);r.call(this,e),this._transformState={afterTransform:a.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,e&&(\"function\"==typeof e.transform&&(this._transform=e.transform),\"function\"==typeof e.flush&&(this._flush=e.flush)),this.on(\"prefinish\",s)}function s(){var e=this;\"function\"==typeof this._flush?this._flush((function(t,n){u(e,t,n)})):u(this,null,null)}function u(e,t,n){if(t)return e.emit(\"error\",t);if(null!=n&&e.push(n),e._writableState.length)throw new Error(\"Calling transform done when ws.length != 0\");if(e._transformState.transforming)throw new Error(\"Calling transform done when still transforming\");return e.push(null)}o.inherits=n(61),o.inherits(i,r),i.prototype.push=function(e,t){return this._transformState.needTransform=!1,r.prototype.push.call(this,e,t)},i.prototype._transform=function(e,t,n){throw new Error(\"_transform() is not implemented\")},i.prototype._write=function(e,t,n){var r=this._transformState;if(r.writecb=n,r.writechunk=e,r.writeencoding=t,!r.transforming){var o=this._readableState;(r.needTransform||o.needReadable||o.length<o.highWaterMark)&&this._read(o.highWaterMark)}},i.prototype._read=function(e){var t=this._transformState;null!==t.writechunk&&t.writecb&&!t.transforming?(t.transforming=!0,this._transform(t.writechunk,t.writeencoding,t.afterTransform)):t.needTransform=!0},i.prototype._destroy=function(e,t){var n=this;r.prototype._destroy.call(this,e,(function(e){t(e),n.emit(\"close\")}))}},function(e,t,n){\"use strict\";var r=n(117),o=Array.prototype.forEach,a=Object.create,i=function(e,t){var n;for(n in e)t[n]=e[n]};e.exports=function(e){var t=a(null);return o.call(arguments,(function(e){r(e)&&i(Object(e),t)})),t}},function(e,t,n){\"use strict\";var r=n(118);e.exports=function(e,t,n){var o;return isNaN(e)?(o=t)>=0?n&&o?o-1:o:1:!1!==e&&r(e)}},function(e,t,n){\"use strict\";e.exports=n(789)()?Object.assign:n(790)},function(e,t,n){\"use strict\";var r,o,a,i,s,u=n(118),c=function(e,t){return t};try{Object.defineProperty(c,\"length\",{configurable:!0,writable:!1,enumerable:!1,value:1})}catch(e){}1===c.length?(r={configurable:!0,writable:!1,enumerable:!1},o=Object.defineProperty,e.exports=function(e,t){return t=u(t),e.length===t?e:(r.value=t,o(e,\"length\",r))}):(i=n(440),s=[],a=function(e){var t,n=0;if(s[e])return s[e];for(t=[];e--;)t.push(\"a\"+(++n).toString(36));return new Function(\"fn\",\"return function (\"+t.join(\", \")+\") { return fn.apply(this, arguments); };\")},e.exports=function(e,t){var n;if(t=u(t),e.length===t)return e;n=a(t)(e);try{i(n,e)}catch(e){}return n})},function(e,t,n){\"use strict\";var r=n(137),o=Object.defineProperty,a=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,s=Object.getOwnPropertySymbols;e.exports=function(e,t){var n,u=Object(r(t));if(e=Object(r(e)),i(u).forEach((function(r){try{o(e,r,a(t,r))}catch(e){n=e}})),\"function\"==typeof s&&s(u).forEach((function(r){try{o(e,r,a(t,r))}catch(e){n=e}})),void 0!==n)throw n;return e}},function(e,t,n){\"use strict\";e.exports=function(e){return null!=e}},function(e,t,n){\"use strict\";var r=n(812);e.exports=function(e){if(!r(e))throw new TypeError(e+\" is not a symbol\");return e}},function(e,t,n){\"use strict\";var r=n(100),o=n(198),a=Function.prototype.call;e.exports=function(e,t){var n={},i=arguments[2];return r(t),o(e,(function(e,r,o,s){n[r]=a.call(t,i,e,r,o,s)})),n}},function(e,t,n){\"use strict\";e.exports=function(e){return\"function\"==typeof e}},function(e,t){function n(e){return!!e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"function\"==typeof e.then}e.exports=n,e.exports.default=n},function(e,t,n){var r=n(61),o=n(138),a=n(62).Buffer,i=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],s=new Array(64);function u(){this.init(),this._w=s,o.call(this,64,56)}function c(e,t,n){return n^e&(t^n)}function l(e,t,n){return e&t|n&(e|t)}function p(e){return(e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10)}function f(e){return(e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7)}function h(e){return(e>>>7|e<<25)^(e>>>18|e<<14)^e>>>3}r(u,o),u.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},u.prototype._update=function(e){for(var t,n=this._w,r=0|this._a,o=0|this._b,a=0|this._c,s=0|this._d,u=0|this._e,d=0|this._f,m=0|this._g,v=0|this._h,g=0;g<16;++g)n[g]=e.readInt32BE(4*g);for(;g<64;++g)n[g]=0|(((t=n[g-2])>>>17|t<<15)^(t>>>19|t<<13)^t>>>10)+n[g-7]+h(n[g-15])+n[g-16];for(var y=0;y<64;++y){var b=v+f(u)+c(u,d,m)+i[y]+n[y]|0,_=p(r)+l(r,o,a)|0;v=m,m=d,d=u,u=s+b|0,s=a,a=o,o=r,r=b+_|0}this._a=r+this._a|0,this._b=o+this._b|0,this._c=a+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0,this._f=d+this._f|0,this._g=m+this._g|0,this._h=v+this._h|0},u.prototype._hash=function(){var e=a.allocUnsafe(32);return e.writeInt32BE(this._a,0),e.writeInt32BE(this._b,4),e.writeInt32BE(this._c,8),e.writeInt32BE(this._d,12),e.writeInt32BE(this._e,16),e.writeInt32BE(this._f,20),e.writeInt32BE(this._g,24),e.writeInt32BE(this._h,28),e},e.exports=u},function(e,t,n){var r=n(61),o=n(138),a=n(62).Buffer,i=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],s=new Array(160);function u(){this.init(),this._w=s,o.call(this,128,112)}function c(e,t,n){return n^e&(t^n)}function l(e,t,n){return e&t|n&(e|t)}function p(e,t){return(e>>>28|t<<4)^(t>>>2|e<<30)^(t>>>7|e<<25)}function f(e,t){return(e>>>14|t<<18)^(e>>>18|t<<14)^(t>>>9|e<<23)}function h(e,t){return(e>>>1|t<<31)^(e>>>8|t<<24)^e>>>7}function d(e,t){return(e>>>1|t<<31)^(e>>>8|t<<24)^(e>>>7|t<<25)}function m(e,t){return(e>>>19|t<<13)^(t>>>29|e<<3)^e>>>6}function v(e,t){return(e>>>19|t<<13)^(t>>>29|e<<3)^(e>>>6|t<<26)}function g(e,t){return e>>>0<t>>>0?1:0}r(u,o),u.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},u.prototype._update=function(e){for(var t=this._w,n=0|this._ah,r=0|this._bh,o=0|this._ch,a=0|this._dh,s=0|this._eh,u=0|this._fh,y=0|this._gh,b=0|this._hh,_=0|this._al,w=0|this._bl,x=0|this._cl,E=0|this._dl,S=0|this._el,C=0|this._fl,A=0|this._gl,k=0|this._hl,O=0;O<32;O+=2)t[O]=e.readInt32BE(4*O),t[O+1]=e.readInt32BE(4*O+4);for(;O<160;O+=2){var j=t[O-30],T=t[O-30+1],I=h(j,T),P=d(T,j),N=m(j=t[O-4],T=t[O-4+1]),M=v(T,j),R=t[O-14],D=t[O-14+1],L=t[O-32],B=t[O-32+1],F=P+D|0,U=I+R+g(F,P)|0;U=(U=U+N+g(F=F+M|0,M)|0)+L+g(F=F+B|0,B)|0,t[O]=U,t[O+1]=F}for(var q=0;q<160;q+=2){U=t[q],F=t[q+1];var z=l(n,r,o),V=l(_,w,x),W=p(n,_),H=p(_,n),$=f(s,S),J=f(S,s),K=i[q],Y=i[q+1],G=c(s,u,y),Z=c(S,C,A),X=k+J|0,Q=b+$+g(X,k)|0;Q=(Q=(Q=Q+G+g(X=X+Z|0,Z)|0)+K+g(X=X+Y|0,Y)|0)+U+g(X=X+F|0,F)|0;var ee=H+V|0,te=W+z+g(ee,H)|0;b=y,k=A,y=u,A=C,u=s,C=S,s=a+Q+g(S=E+X|0,E)|0,a=o,E=x,o=r,x=w,r=n,w=_,n=Q+te+g(_=X+ee|0,X)|0}this._al=this._al+_|0,this._bl=this._bl+w|0,this._cl=this._cl+x|0,this._dl=this._dl+E|0,this._el=this._el+S|0,this._fl=this._fl+C|0,this._gl=this._gl+A|0,this._hl=this._hl+k|0,this._ah=this._ah+n+g(this._al,_)|0,this._bh=this._bh+r+g(this._bl,w)|0,this._ch=this._ch+o+g(this._cl,x)|0,this._dh=this._dh+a+g(this._dl,E)|0,this._eh=this._eh+s+g(this._el,S)|0,this._fh=this._fh+u+g(this._fl,C)|0,this._gh=this._gh+y+g(this._gl,A)|0,this._hh=this._hh+b+g(this._hl,k)|0},u.prototype._hash=function(){var e=a.allocUnsafe(64);function t(t,n,r){e.writeInt32BE(t,r),e.writeInt32BE(n,r+4)}return t(this._ah,this._al,0),t(this._bh,this._bl,8),t(this._ch,this._cl,16),t(this._dh,this._dl,24),t(this._eh,this._el,32),t(this._fh,this._fl,40),t(this._gh,this._gl,48),t(this._hh,this._hl,56),e},e.exports=u},function(e,t,n){e.exports=n(851)},function(e,t,n){e.exports=n(852)},function(e,t,n){e.exports=n(871)},function(e,t,n){n(452),n(180),n(875),n(459),n(460),n(880),n(130),n(87);var r=n(34);e.exports=r.Promise},function(e,t,n){\"use strict\";var r=n(21),o=n(182),a=n(183),i=n(109),s=n(67),u=n(105),c=n(121),l=function(e,t){var n=this;if(!(n instanceof l))return new l(e,t);a&&(n=a(new Error(void 0),o(n))),void 0!==t&&s(n,\"message\",String(t));var r=[];return c(e,r.push,{that:r}),s(n,\"errors\",r),n};l.prototype=i(Error.prototype,{constructor:u(5,l),message:u(5,\"\"),name:u(5,\"AggregateError\")}),r({global:!0},{AggregateError:l})},function(e,t,n){var r=n(40);e.exports=r.Promise},function(e,t,n){\"use strict\";var r=n(70),o=n(68),a=n(41),i=n(48),s=a(\"species\");e.exports=function(e){var t=r(e),n=o.f;i&&t&&!t[s]&&n(t,s,{configurable:!0,get:function(){return this}})}},function(e,t,n){var r=n(52),o=n(77),a=n(41)(\"species\");e.exports=function(e,t){var n,i=r(e).constructor;return void 0===i||null==(n=r(i)[a])?t:o(n)}},function(e,t,n){var r,o,a,i=n(40),s=n(37),u=n(107),c=n(366),l=n(225),p=n(457),f=n(184),h=i.location,d=i.setImmediate,m=i.clearImmediate,v=i.process,g=i.MessageChannel,y=i.Dispatch,b=0,_={},w=\"onreadystatechange\",x=function(e){if(_.hasOwnProperty(e)){var t=_[e];delete _[e],t()}},E=function(e){return function(){x(e)}},S=function(e){x(e.data)},C=function(e){i.postMessage(e+\"\",h.protocol+\"//\"+h.host)};d&&m||(d=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return _[++b]=function(){(\"function\"==typeof e?e:Function(e)).apply(void 0,t)},r(b),b},m=function(e){delete _[e]},f?r=function(e){v.nextTick(E(e))}:y&&y.now?r=function(e){y.now(E(e))}:g&&!p?(a=(o=new g).port2,o.port1.onmessage=S,r=u(a.postMessage,a,1)):i.addEventListener&&\"function\"==typeof postMessage&&!i.importScripts&&h&&\"file:\"!==h.protocol&&!s(C)?(r=C,i.addEventListener(\"message\",S,!1)):r=w in l(\"script\")?function(e){c.appendChild(l(\"script\")).onreadystatechange=function(){c.removeChild(this),x(e)}}:function(e){setTimeout(E(e),0)}),e.exports={set:d,clear:m}},function(e,t,n){var r=n(108);e.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(r)},function(e,t,n){var r=n(52),o=n(47),a=n(164);e.exports=function(e,t){if(r(e),o(t)&&t.constructor===e)return t;var n=a.f(e);return(0,n.resolve)(t),n.promise}},function(e,t,n){\"use strict\";var r=n(21),o=n(77),a=n(164),i=n(200),s=n(121);r({target:\"Promise\",stat:!0},{allSettled:function(e){var t=this,n=a.f(t),r=n.resolve,u=n.reject,c=i((function(){var n=o(t.resolve),a=[],i=0,u=1;s(e,(function(e){var o=i++,s=!1;a.push(void 0),u++,n.call(t,e).then((function(e){s||(s=!0,a[o]={status:\"fulfilled\",value:e},--u||r(a))}),(function(e){s||(s=!0,a[o]={status:\"rejected\",reason:e},--u||r(a))}))})),--u||r(a)}));return c.error&&u(c.value),n.promise}})},function(e,t,n){\"use strict\";var r=n(21),o=n(77),a=n(70),i=n(164),s=n(200),u=n(121),c=\"No one promise resolved\";r({target:\"Promise\",stat:!0},{any:function(e){var t=this,n=i.f(t),r=n.resolve,l=n.reject,p=s((function(){var n=o(t.resolve),i=[],s=0,p=1,f=!1;u(e,(function(e){var o=s++,u=!1;i.push(void 0),p++,n.call(t,e).then((function(e){u||f||(f=!0,r(e))}),(function(e){u||f||(u=!0,i[o]=e,--p||l(new(a(\"AggregateError\"))(i,c)))}))})),--p||l(new(a(\"AggregateError\"))(i,c))}));return p.error&&l(p.value),n.promise}})},function(e,t,n){var r=n(48),o=n(155),a=n(66),i=n(176).f,s=function(e){return function(t){for(var n,s=a(t),u=o(s),c=u.length,l=0,p=[];c>l;)n=u[l++],r&&!i.call(s,n)||p.push(e?[n,s[n]]:s[n]);return p}};e.exports={entries:s(!0),values:s(!1)}},function(e,t,n){var r=n(201),o=n(135),a=n(195),i=n(57),s=n(136);e.exports=function(e,t,n,u){if(!i(e))return e;for(var c=-1,l=(t=o(t,e)).length,p=l-1,f=e;null!=f&&++c<l;){var h=s(t[c]),d=n;if(\"__proto__\"===h||\"constructor\"===h||\"prototype\"===h)return e;if(c!=p){var m=f[h];void 0===(d=u?u(m,h,f):void 0)&&(d=i(m)?m:a(t[c+1])?[]:{})}r(f,h,d),f=f[h]}return e}},function(e,t,n){var r=n(464);e.exports=function(e,t,n){\"__proto__\"==t&&r?r(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}},function(e,t,n){var r=n(113),o=function(){try{var e=r(Object,\"defineProperty\");return e({},\"\",{}),e}catch(e){}}();e.exports=o},function(e,t,n){e.exports=n(904)},function(e,t,n){e.exports=n(907)},function(e,t,n){\"use strict\";e.exports={hasCachedChildNodes:1}},function(e,t,n){\"use strict\";var r=n(30);n(25);e.exports=function(e,t){return null==t&&r(\"30\"),null==e?t:Array.isArray(e)?Array.isArray(t)?(e.push.apply(e,t),e):(e.push(t),e):Array.isArray(t)?[e].concat(t):[e,t]}},function(e,t,n){\"use strict\";e.exports=function(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}},function(e,t,n){\"use strict\";var r=n(56),o=null;e.exports=function(){return!o&&r.canUseDOM&&(o=\"textContent\"in document.documentElement?\"textContent\":\"innerText\"),o}},function(e,t,n){\"use strict\";var r=n(30);var o=n(122),a=(n(25),function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this._callbacks=null,this._contexts=null,this._arg=t}return e.prototype.enqueue=function(e,t){this._callbacks=this._callbacks||[],this._callbacks.push(e),this._contexts=this._contexts||[],this._contexts.push(t)},e.prototype.notifyAll=function(){var e=this._callbacks,t=this._contexts,n=this._arg;if(e&&t){e.length!==t.length&&r(\"24\"),this._callbacks=null,this._contexts=null;for(var o=0;o<e.length;o++)e[o].call(t[o],n);e.length=0,t.length=0}},e.prototype.checkpoint=function(){return this._callbacks?this._callbacks.length:0},e.prototype.rollback=function(e){this._callbacks&&this._contexts&&(this._callbacks.length=e,this._contexts.length=e)},e.prototype.reset=function(){this._callbacks=null,this._contexts=null},e.prototype.destructor=function(){this.reset()},e}());e.exports=o.addPoolingTo(a)},function(e,t,n){\"use strict\";e.exports={logTopLevelRenders:!1}},function(e,t,n){\"use strict\";var r=n(45);function o(e){var t=e.type,n=e.nodeName;return n&&\"input\"===n.toLowerCase()&&(\"checkbox\"===t||\"radio\"===t)}function a(e){return e._wrapperState.valueTracker}var i={_getTrackerFromNode:function(e){return a(r.getInstanceFromNode(e))},track:function(e){if(!a(e)){var t=r.getNodeFromInstance(e),n=o(t)?\"checked\":\"value\",i=Object.getOwnPropertyDescriptor(t.constructor.prototype,n),s=\"\"+t[n];t.hasOwnProperty(n)||\"function\"!=typeof i.get||\"function\"!=typeof i.set||(Object.defineProperty(t,n,{enumerable:i.enumerable,configurable:!0,get:function(){return i.get.call(this)},set:function(e){s=\"\"+e,i.set.call(this,e)}}),function(e,t){e._wrapperState.valueTracker=t}(e,{getValue:function(){return s},setValue:function(e){s=\"\"+e},stopTracking:function(){!function(e){e._wrapperState.valueTracker=null}(e),delete t[n]}}))}},updateValueIfChanged:function(e){if(!e)return!1;var t=a(e);if(!t)return i.track(e),!0;var n,s,u=t.getValue(),c=((n=r.getNodeFromInstance(e))&&(s=o(n)?\"\"+n.checked:n.value),s);return c!==u&&(t.setValue(c),!0)},stopTracking:function(e){var t=a(e);t&&t.stopTracking()}};e.exports=i},function(e,t,n){\"use strict\";var r={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};e.exports=function(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return\"input\"===t?!!r[e.type]:\"textarea\"===t}},function(e,t,n){\"use strict\";var r={currentScrollLeft:0,currentScrollTop:0,refreshScrollValues:function(e){r.currentScrollLeft=e.x,r.currentScrollTop=e.y}};e.exports=r},function(e,t,n){\"use strict\";var r=n(56),o=n(205),a=n(204),i=function(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t};r.canUseDOM&&(\"textContent\"in document.documentElement||(i=function(e,t){3!==e.nodeType?a(e,o(t)):e.nodeValue=t})),e.exports=i},function(e,t,n){\"use strict\";e.exports=function(e){try{e.focus()}catch(e){}}},function(e,t,n){\"use strict\";var r={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0};var o=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(r).forEach((function(e){o.forEach((function(t){r[function(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}(t,e)]=r[e]}))}));var a={isUnitlessNumber:r,shorthandPropertyExpansions:{background:{backgroundAttachment:!0,backgroundColor:!0,backgroundImage:!0,backgroundPositionX:!0,backgroundPositionY:!0,backgroundRepeat:!0},backgroundPosition:{backgroundPositionX:!0,backgroundPositionY:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0},outline:{outlineWidth:!0,outlineStyle:!0,outlineColor:!0}}};e.exports=a},function(e,t,n){\"use strict\";var r=n(140),o=(n(45),n(72),n(945)),a=(n(33),new RegExp(\"^[\"+r.ATTRIBUTE_NAME_START_CHAR+\"][\"+r.ATTRIBUTE_NAME_CHAR+\"]*$\")),i={},s={};function u(e){return!!s.hasOwnProperty(e)||!i.hasOwnProperty(e)&&(a.test(e)?(s[e]=!0,!0):(i[e]=!0,!1))}function c(e,t){return null==t||e.hasBooleanValue&&!t||e.hasNumericValue&&isNaN(t)||e.hasPositiveNumericValue&&t<1||e.hasOverloadedBooleanValue&&!1===t}var l={createMarkupForID:function(e){return r.ID_ATTRIBUTE_NAME+\"=\"+o(e)},setAttributeForID:function(e,t){e.setAttribute(r.ID_ATTRIBUTE_NAME,t)},createMarkupForRoot:function(){return r.ROOT_ATTRIBUTE_NAME+'=\"\"'},setAttributeForRoot:function(e){e.setAttribute(r.ROOT_ATTRIBUTE_NAME,\"\")},createMarkupForProperty:function(e,t){var n=r.properties.hasOwnProperty(e)?r.properties[e]:null;if(n){if(c(n,t))return\"\";var a=n.attributeName;return n.hasBooleanValue||n.hasOverloadedBooleanValue&&!0===t?a+'=\"\"':a+\"=\"+o(t)}return r.isCustomAttribute(e)?null==t?\"\":e+\"=\"+o(t):null},createMarkupForCustomAttribute:function(e,t){return u(e)&&null!=t?e+\"=\"+o(t):\"\"},setValueForProperty:function(e,t,n){var o=r.properties.hasOwnProperty(t)?r.properties[t]:null;if(o){var a=o.mutationMethod;if(a)a(e,n);else{if(c(o,n))return void this.deleteValueForProperty(e,t);if(o.mustUseProperty)e[o.propertyName]=n;else{var i=o.attributeName,s=o.attributeNamespace;s?e.setAttributeNS(s,i,\"\"+n):o.hasBooleanValue||o.hasOverloadedBooleanValue&&!0===n?e.setAttribute(i,\"\"):e.setAttribute(i,\"\"+n)}}}else if(r.isCustomAttribute(t))return void l.setValueForAttribute(e,t,n)},setValueForAttribute:function(e,t,n){u(t)&&(null==n?e.removeAttribute(t):e.setAttribute(t,\"\"+n))},deleteValueForAttribute:function(e,t){e.removeAttribute(t)},deleteValueForProperty:function(e,t){var n=r.properties.hasOwnProperty(t)?r.properties[t]:null;if(n){var o=n.mutationMethod;if(o)o(e,void 0);else if(n.mustUseProperty){var a=n.propertyName;n.hasBooleanValue?e[a]=!1:e[a]=\"\"}else e.removeAttribute(n.attributeName)}else r.isCustomAttribute(t)&&e.removeAttribute(t)}};e.exports=l},function(e,t,n){\"use strict\";var r=n(38),o=n(270),a=n(45),i=n(80),s=(n(33),!1);function u(){if(this._rootNodeID&&this._wrapperState.pendingUpdate){this._wrapperState.pendingUpdate=!1;var e=this._currentElement.props,t=o.getValue(e);null!=t&&c(this,Boolean(e.multiple),t)}}function c(e,t,n){var r,o,i=a.getNodeFromInstance(e).options;if(t){for(r={},o=0;o<n.length;o++)r[\"\"+n[o]]=!0;for(o=0;o<i.length;o++){var s=r.hasOwnProperty(i[o].value);i[o].selected!==s&&(i[o].selected=s)}}else{for(r=\"\"+n,o=0;o<i.length;o++)if(i[o].value===r)return void(i[o].selected=!0);i.length&&(i[0].selected=!0)}}var l={getHostProps:function(e,t){return r({},t,{onChange:e._wrapperState.onChange,value:void 0})},mountWrapper:function(e,t){var n=o.getValue(t);e._wrapperState={pendingUpdate:!1,initialValue:null!=n?n:t.defaultValue,listeners:null,onChange:p.bind(e),wasMultiple:Boolean(t.multiple)},void 0===t.value||void 0===t.defaultValue||s||(s=!0)},getSelectValueContext:function(e){return e._wrapperState.initialValue},postUpdateWrapper:function(e){var t=e._currentElement.props;e._wrapperState.initialValue=void 0;var n=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=Boolean(t.multiple);var r=o.getValue(t);null!=r?(e._wrapperState.pendingUpdate=!1,c(e,Boolean(t.multiple),r)):n!==Boolean(t.multiple)&&(null!=t.defaultValue?c(e,Boolean(t.multiple),t.defaultValue):c(e,Boolean(t.multiple),t.multiple?[]:\"\"))}};function p(e){var t=this._currentElement.props,n=o.executeOnChange(t,e);return this._rootNodeID&&(this._wrapperState.pendingUpdate=!0),i.asap(u,this),n}e.exports=l},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(954),i=n(483),s=n(484),u=(n(955),n(25),n(33),function(e){this.construct(e)});function c(e,t){var n;if(null===e||!1===e)n=i.create(c);else if(\"object\"==typeof e){var o=e,a=o.type;if(\"function\"!=typeof a&&\"string\"!=typeof a){var l=\"\";0,l+=function(e){if(e){var t=e.getName();if(t)return\" Check the render method of `\"+t+\"`.\"}return\"\"}(o._owner),r(\"130\",null==a?a:typeof a,l)}\"string\"==typeof o.type?n=s.createInternalComponent(o):!function(e){return\"function\"==typeof e&&void 0!==e.prototype&&\"function\"==typeof e.prototype.mountComponent&&\"function\"==typeof e.prototype.receiveComponent}(o.type)?n=new u(o):(n=new o.type(o)).getHostNode||(n.getHostNode=n.getNativeNode)}else\"string\"==typeof e||\"number\"==typeof e?n=s.createInstanceForText(e):r(\"131\",typeof e);return n._mountIndex=0,n._mountImage=null,n}o(u.prototype,a,{_instantiateReactComponent:c}),e.exports=c},function(e,t,n){\"use strict\";var r=n(30),o=n(132),a=(n(25),{HOST:0,COMPOSITE:1,EMPTY:2,getType:function(e){return null===e||!1===e?a.EMPTY:o.isValidElement(e)?\"function\"==typeof e.type?a.COMPOSITE:a.HOST:void r(\"26\",e)}});e.exports=a},function(e,t,n){\"use strict\";var r,o={injectEmptyComponentFactory:function(e){r=e}},a={create:function(e){return r(e)}};a.injection=o,e.exports=a},function(e,t,n){\"use strict\";var r=n(30),o=(n(25),null),a=null;var i={createInternalComponent:function(e){return o||r(\"111\",e.type),new o(e)},createInstanceForText:function(e){return new a(e)},isTextComponent:function(e){return e instanceof a},injection:{injectGenericComponentClass:function(e){o=e},injectTextComponentClass:function(e){a=e}}};e.exports=i},function(e,t,n){\"use strict\";var r=n(30),o=(n(88),n(956)),a=n(957),i=(n(25),n(274));n(33);function s(e,t){return e&&\"object\"==typeof e&&null!=e.key?i.escape(e.key):t.toString(36)}function u(e,t,n,c){var l,p=typeof e;if(\"undefined\"!==p&&\"boolean\"!==p||(e=null),null===e||\"string\"===p||\"number\"===p||\"object\"===p&&e.$$typeof===o)return n(c,e,\"\"===t?\".\"+s(e,0):t),1;var f=0,h=\"\"===t?\".\":t+\":\";if(Array.isArray(e))for(var d=0;d<e.length;d++)f+=u(l=e[d],h+s(l,d),n,c);else{var m=a(e);if(m){var v,g=m.call(e);if(m!==e.entries)for(var y=0;!(v=g.next()).done;)f+=u(l=v.value,h+s(l,y++),n,c);else for(;!(v=g.next()).done;){var b=v.value;b&&(f+=u(l=b[1],h+i.escape(b[0])+\":\"+s(l,0),n,c))}}else if(\"object\"===p){var _=String(e);r(\"31\",\"[object Object]\"===_?\"object with keys {\"+Object.keys(e).join(\", \")+\"}\":_,\"\")}}return f}e.exports=function(e,t,n){return null==e?0:u(e,\"\",t,n)}},function(e,t,n){\"use strict\";var r,o,a,i,s,u,c,l=n(158),p=n(88);n(25),n(33);function f(e){var t=Function.prototype.toString,n=Object.prototype.hasOwnProperty,r=RegExp(\"^\"+t.call(n).replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");try{var o=t.call(e);return r.test(o)}catch(e){return!1}}if(\"function\"==typeof Array.from&&\"function\"==typeof Map&&f(Map)&&null!=Map.prototype&&\"function\"==typeof Map.prototype.keys&&f(Map.prototype.keys)&&\"function\"==typeof Set&&f(Set)&&null!=Set.prototype&&\"function\"==typeof Set.prototype.keys&&f(Set.prototype.keys)){var h=new Map,d=new Set;r=function(e,t){h.set(e,t)},o=function(e){return h.get(e)},a=function(e){h.delete(e)},i=function(){return Array.from(h.keys())},s=function(e){d.add(e)},u=function(e){d.delete(e)},c=function(){return Array.from(d.keys())}}else{var m={},v={},g=function(e){return\".\"+e},y=function(e){return parseInt(e.substr(1),10)};r=function(e,t){var n=g(e);m[n]=t},o=function(e){var t=g(e);return m[t]},a=function(e){var t=g(e);delete m[t]},i=function(){return Object.keys(m).map(y)},s=function(e){var t=g(e);v[t]=!0},u=function(e){var t=g(e);delete v[t]},c=function(){return Object.keys(v).map(y)}}var b=[];function _(e){var t=o(e);if(t){var n=t.childIDs;a(e),n.forEach(_)}}function w(e,t,n){return\"\\n    in \"+(e||\"Unknown\")+(t?\" (at \"+t.fileName.replace(/^.*[\\\\\\/]/,\"\")+\":\"+t.lineNumber+\")\":n?\" (created by \"+n+\")\":\"\")}function x(e){return null==e?\"#empty\":\"string\"==typeof e||\"number\"==typeof e?\"#text\":\"string\"==typeof e.type?e.type:e.type.displayName||e.type.name||\"Unknown\"}function E(e){var t,n=S.getDisplayName(e),r=S.getElement(e),o=S.getOwnerID(e);return o&&(t=S.getDisplayName(o)),w(n,r&&r._source,t)}var S={onSetChildren:function(e,t){var n=o(e);n||l(\"144\"),n.childIDs=t;for(var r=0;r<t.length;r++){var a=t[r],i=o(a);i||l(\"140\"),null==i.childIDs&&\"object\"==typeof i.element&&null!=i.element&&l(\"141\"),i.isMounted||l(\"71\"),null==i.parentID&&(i.parentID=e),i.parentID!==e&&l(\"142\",a,i.parentID,e)}},onBeforeMountComponent:function(e,t,n){r(e,{element:t,parentID:n,text:null,childIDs:[],isMounted:!1,updateCount:0})},onBeforeUpdateComponent:function(e,t){var n=o(e);n&&n.isMounted&&(n.element=t)},onMountComponent:function(e){var t=o(e);t||l(\"144\"),t.isMounted=!0,0===t.parentID&&s(e)},onUpdateComponent:function(e){var t=o(e);t&&t.isMounted&&t.updateCount++},onUnmountComponent:function(e){var t=o(e);t&&(t.isMounted=!1,0===t.parentID&&u(e));b.push(e)},purgeUnmountedComponents:function(){if(!S._preventPurging){for(var e=0;e<b.length;e++){_(b[e])}b.length=0}},isMounted:function(e){var t=o(e);return!!t&&t.isMounted},getCurrentStackAddendum:function(e){var t=\"\";if(e){var n=x(e),r=e._owner;t+=w(n,e._source,r&&r.getName())}var o=p.current,a=o&&o._debugID;return t+=S.getStackAddendumByID(a)},getStackAddendumByID:function(e){for(var t=\"\";e;)t+=E(e),e=S.getParentID(e);return t},getChildIDs:function(e){var t=o(e);return t?t.childIDs:[]},getDisplayName:function(e){var t=S.getElement(e);return t?x(t):null},getElement:function(e){var t=o(e);return t?t.element:null},getOwnerID:function(e){var t=S.getElement(e);return t&&t._owner?t._owner._debugID:null},getParentID:function(e){var t=o(e);return t?t.parentID:null},getSource:function(e){var t=o(e),n=t?t.element:null;return null!=n?n._source:null},getText:function(e){var t=S.getElement(e);return\"string\"==typeof t?t:\"number\"==typeof t?\"\"+t:null},getUpdateCount:function(e){var t=o(e);return t?t.updateCount:0},getRootIDs:c,getRegisteredIDs:i,pushNonStandardWarningStack:function(e,t){if(\"function\"==typeof console.reactStack){var n=[],r=p.current,o=r&&r._debugID;try{for(e&&n.push({name:o?S.getDisplayName(o):null,fileName:t?t.fileName:null,lineNumber:t?t.lineNumber:null});o;){var a=S.getElement(o),i=S.getParentID(o),s=S.getOwnerID(o),u=s?S.getDisplayName(s):null,c=a&&a._source;n.push({name:u,fileName:c?c.fileName:null,lineNumber:c?c.lineNumber:null}),o=i}}catch(e){}console.reactStack(n)}},popNonStandardWarningStack:function(){\"function\"==typeof console.reactStackEnd&&console.reactStackEnd()}};e.exports=S},function(e,t,n){\"use strict\";var r=n(79),o={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent(\"on\"+t,n),{remove:function(){e.detachEvent(\"on\"+t,n)}}):void 0},capture:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!0),{remove:function(){e.removeEventListener(t,n,!0)}}):{remove:r}},registerDefault:function(){}};e.exports=o},function(e,t,n){\"use strict\";var r=n(969),o=n(971),a=n(477),i=n(489);var s={hasSelectionCapabilities:function(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(\"input\"===t&&\"text\"===e.type||\"textarea\"===t||\"true\"===e.contentEditable)},getSelectionInformation:function(){var e=i();return{focusedElem:e,selectionRange:s.hasSelectionCapabilities(e)?s.getSelection(e):null}},restoreSelection:function(e){var t,n=i(),r=e.focusedElem,u=e.selectionRange;n!==r&&(t=r,o(document.documentElement,t))&&(s.hasSelectionCapabilities(r)&&s.setSelection(r,u),a(r))},getSelection:function(e){var t;if(\"selectionStart\"in e)t={start:e.selectionStart,end:e.selectionEnd};else if(document.selection&&e.nodeName&&\"input\"===e.nodeName.toLowerCase()){var n=document.selection.createRange();n.parentElement()===e&&(t={start:-n.moveStart(\"character\",-e.value.length),end:-n.moveEnd(\"character\",-e.value.length)})}else t=r.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,o=t.end;if(void 0===o&&(o=n),\"selectionStart\"in e)e.selectionStart=n,e.selectionEnd=Math.min(o,e.value.length);else if(document.selection&&e.nodeName&&\"input\"===e.nodeName.toLowerCase()){var a=e.createTextRange();a.collapse(!0),a.moveStart(\"character\",n),a.moveEnd(\"character\",o-n),a.select()}else r.setOffsets(e,t)}};e.exports=s},function(e,t,n){\"use strict\";e.exports=function(e){if(void 0===(e=e||(\"undefined\"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}},function(e,t,n){\"use strict\";var r=n(30),o=n(142),a=n(140),i=n(132),s=n(206),u=(n(88),n(45)),c=n(986),l=n(987),p=n(472),f=n(168),h=(n(72),n(988)),d=n(141),m=n(275),v=n(80),g=n(241),y=n(481),b=(n(25),n(204)),_=n(273),w=(n(33),a.ID_ATTRIBUTE_NAME),x=a.ROOT_ATTRIBUTE_NAME,E={};function S(e){return e?9===e.nodeType?e.documentElement:e.firstChild:null}function C(e,t,n,r,o){var a;if(p.logTopLevelRenders){var i=e._currentElement.props.child.type;a=\"React mount: \"+(\"string\"==typeof i?i:i.displayName||i.name),console.time(a)}var s=d.mountComponent(e,n,null,c(e,t),o,0);a&&console.timeEnd(a),e._renderedComponent._topLevelWrapper=e,N._mountImageIntoNode(s,t,e,r,n)}function A(e,t,n,r){var o=v.ReactReconcileTransaction.getPooled(!n&&l.useCreateElement);o.perform(C,null,e,t,o,n,r),v.ReactReconcileTransaction.release(o)}function k(e,t,n){for(0,d.unmountComponent(e,n),9===t.nodeType&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)}function O(e){var t=S(e);if(t){var n=u.getInstanceFromNode(t);return!(!n||!n._hostParent)}}function j(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function T(e){var t=function(e){var t=S(e),n=t&&u.getInstanceFromNode(t);return n&&!n._hostParent?n:null}(e);return t?t._hostContainerInfo._topLevelWrapper:null}var I=1,P=function(){this.rootID=I++};P.prototype.isReactComponent={},P.prototype.render=function(){return this.props.child},P.isReactTopLevelWrapper=!0;var N={TopLevelWrapper:P,_instancesByReactRootID:E,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,r,o){return N.scrollMonitor(r,(function(){m.enqueueElementInternal(e,t,n),o&&m.enqueueCallbackInternal(e,o)})),e},_renderNewRootComponent:function(e,t,n,o){j(t)||r(\"37\"),s.ensureScrollValueMonitoring();var a=y(e,!1);v.batchedUpdates(A,a,t,n,o);var i=a._instance.rootID;return E[i]=a,a},renderSubtreeIntoContainer:function(e,t,n,o){return null!=e&&f.has(e)||r(\"38\"),N._renderSubtreeIntoContainer(e,t,n,o)},_renderSubtreeIntoContainer:function(e,t,n,o){m.validateCallback(o,\"ReactDOM.render\"),i.isValidElement(t)||r(\"39\",\"string\"==typeof t?\" Instead of passing a string like 'div', pass React.createElement('div') or <div />.\":\"function\"==typeof t?\" Instead of passing a class like Foo, pass React.createElement(Foo) or <Foo />.\":null!=t&&void 0!==t.props?\" This may be caused by unintentionally loading two independent copies of React.\":\"\");var a,s=i.createElement(P,{child:t});if(e){var u=f.get(e);a=u._processChildContext(u._context)}else a=g;var c=T(n);if(c){var l=c._currentElement.props.child;if(_(l,t)){var p=c._renderedComponent.getPublicInstance(),h=o&&function(){o.call(p)};return N._updateRootComponent(c,s,a,n,h),p}N.unmountComponentAtNode(n)}var d,v=S(n),y=v&&!(!(d=v).getAttribute||!d.getAttribute(w)),b=O(n),x=y&&!c&&!b,E=N._renderNewRootComponent(s,n,x,a)._renderedComponent.getPublicInstance();return o&&o.call(E),E},render:function(e,t,n){return N._renderSubtreeIntoContainer(null,e,t,n)},unmountComponentAtNode:function(e){j(e)||r(\"40\");var t=T(e);if(!t){O(e),1===e.nodeType&&e.hasAttribute(x);return!1}return delete E[t._instance.rootID],v.batchedUpdates(k,t,e,!1),!0},_mountImageIntoNode:function(e,t,n,a,i){if(j(t)||r(\"41\"),a){var s=S(t);if(h.canReuseMarkup(e,s))return void u.precacheNode(n,s);var c=s.getAttribute(h.CHECKSUM_ATTR_NAME);s.removeAttribute(h.CHECKSUM_ATTR_NAME);var l=s.outerHTML;s.setAttribute(h.CHECKSUM_ATTR_NAME,c);var p=e,f=function(e,t){for(var n=Math.min(e.length,t.length),r=0;r<n;r++)if(e.charAt(r)!==t.charAt(r))return r;return e.length===t.length?-1:n}(p,l),d=\" (client) \"+p.substring(f-20,f+20)+\"\\n (server) \"+l.substring(f-20,f+20);9===t.nodeType&&r(\"42\",d)}if(9===t.nodeType&&r(\"43\"),i.useCreateElement){for(;t.lastChild;)t.removeChild(t.lastChild);o.insertTreeBefore(t,e,null)}else b(t,e),u.precacheNode(n,t.firstChild)}};e.exports=N},function(e,t,n){\"use strict\";var r=n(482);e.exports=function(e){for(var t;(t=e._renderedNodeType)===r.COMPOSITE;)e=e._renderedComponent;return t===r.HOST?e._renderedComponent:t===r.EMPTY?null:void 0}},function(e,t,n){\"use strict\";t.__esModule=!0;var r,o=n(11),a=(r=o)&&r.__esModule?r:{default:r};t.default=a.default.shape({subscribe:a.default.func.isRequired,dispatch:a.default.func.isRequired,getState:a.default.func.isRequired})},function(e,t,n){\"use strict\";t.__esModule=!0,t.default=function(e){\"undefined\"!=typeof console&&\"function\"==typeof console.error&&console.error(e);try{throw new Error(e)}catch(e){}}},function(e,t,n){var r=n(246),o=n(1e3),a=n(201),i=n(1001),s=n(1002),u=n(1005),c=n(1006),l=n(1007),p=n(1008),f=n(417),h=n(496),d=n(161),m=n(1009),v=n(1010),g=n(1015),y=n(50),b=n(193),_=n(1017),w=n(57),x=n(1019),E=n(114),S=n(279),C=\"[object Arguments]\",A=\"[object Function]\",k=\"[object Object]\",O={};O[C]=O[\"[object Array]\"]=O[\"[object ArrayBuffer]\"]=O[\"[object DataView]\"]=O[\"[object Boolean]\"]=O[\"[object Date]\"]=O[\"[object Float32Array]\"]=O[\"[object Float64Array]\"]=O[\"[object Int8Array]\"]=O[\"[object Int16Array]\"]=O[\"[object Int32Array]\"]=O[\"[object Map]\"]=O[\"[object Number]\"]=O[k]=O[\"[object RegExp]\"]=O[\"[object Set]\"]=O[\"[object String]\"]=O[\"[object Symbol]\"]=O[\"[object Uint8Array]\"]=O[\"[object Uint8ClampedArray]\"]=O[\"[object Uint16Array]\"]=O[\"[object Uint32Array]\"]=!0,O[\"[object Error]\"]=O[A]=O[\"[object WeakMap]\"]=!1,e.exports=function e(t,n,j,T,I,P){var N,M=1&n,R=2&n,D=4&n;if(j&&(N=I?j(t,T,I,P):j(t)),void 0!==N)return N;if(!w(t))return t;var L=y(t);if(L){if(N=m(t),!M)return c(t,N)}else{var B=d(t),F=B==A||\"[object GeneratorFunction]\"==B;if(b(t))return u(t,M);if(B==k||B==C||F&&!I){if(N=R||F?{}:g(t),!M)return R?p(t,s(N,t)):l(t,i(N,t))}else{if(!O[B])return I?t:{};N=v(t,B,M)}}P||(P=new r);var U=P.get(t);if(U)return U;P.set(t,N),x(t)?t.forEach((function(r){N.add(e(r,n,j,r,t,P))})):_(t)&&t.forEach((function(r,o){N.set(o,e(r,n,j,o,t,P))}));var q=L?void 0:(D?R?h:f:R?S:E)(t);return o(q||t,(function(r,o){q&&(r=t[o=r]),a(N,o,e(r,n,j,o,t,P))})),N}},function(e,t,n){var r=n(247),o=n(278),a=n(248),i=n(419),s=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)r(t,a(e)),e=o(e);return t}:i;e.exports=s},function(e,t,n){var r=n(418),o=n(495),a=n(279);e.exports=function(e){return r(e,a,o)}},function(e,t,n){var r=n(1025),o=n(498),a=n(499);e.exports=function(e){return a(o(e,void 0,r),e+\"\")}},function(e,t,n){var r=n(1028),o=Math.max;e.exports=function(e,t,n){return t=o(void 0===t?e.length-1:t,0),function(){for(var a=arguments,i=-1,s=o(a.length-t,0),u=Array(s);++i<s;)u[i]=a[t+i];i=-1;for(var c=Array(t+1);++i<t;)c[i]=a[i];return c[t]=n(u),r(e,this,c)}}},function(e,t,n){var r=n(1029),o=n(1031)(r);e.exports=o},function(e,t){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}},function(e,t){!function(e){!function(t){var n=\"URLSearchParams\"in e,r=\"Symbol\"in e&&\"iterator\"in Symbol,o=\"FileReader\"in e&&\"Blob\"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),a=\"FormData\"in e,i=\"ArrayBuffer\"in e;if(i)var s=[\"[object Int8Array]\",\"[object Uint8Array]\",\"[object Uint8ClampedArray]\",\"[object Int16Array]\",\"[object Uint16Array]\",\"[object Int32Array]\",\"[object Uint32Array]\",\"[object Float32Array]\",\"[object Float64Array]\"],u=ArrayBuffer.isView||function(e){return e&&s.indexOf(Object.prototype.toString.call(e))>-1};function c(e){if(\"string\"!=typeof e&&(e=String(e)),/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(e))throw new TypeError(\"Invalid character in header field name\");return e.toLowerCase()}function l(e){return\"string\"!=typeof e&&(e=String(e)),e}function p(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return r&&(t[Symbol.iterator]=function(){return t}),t}function f(e){this.map={},e instanceof f?e.forEach((function(e,t){this.append(t,e)}),this):Array.isArray(e)?e.forEach((function(e){this.append(e[0],e[1])}),this):e&&Object.getOwnPropertyNames(e).forEach((function(t){this.append(t,e[t])}),this)}function h(e){if(e.bodyUsed)return Promise.reject(new TypeError(\"Already read\"));e.bodyUsed=!0}function d(e){return new Promise((function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}}))}function m(e){var t=new FileReader,n=d(t);return t.readAsArrayBuffer(e),n}function v(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function g(){return this.bodyUsed=!1,this._initBody=function(e){var t;this._bodyInit=e,e?\"string\"==typeof e?this._bodyText=e:o&&Blob.prototype.isPrototypeOf(e)?this._bodyBlob=e:a&&FormData.prototype.isPrototypeOf(e)?this._bodyFormData=e:n&&URLSearchParams.prototype.isPrototypeOf(e)?this._bodyText=e.toString():i&&o&&((t=e)&&DataView.prototype.isPrototypeOf(t))?(this._bodyArrayBuffer=v(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):i&&(ArrayBuffer.prototype.isPrototypeOf(e)||u(e))?this._bodyArrayBuffer=v(e):this._bodyText=e=Object.prototype.toString.call(e):this._bodyText=\"\",this.headers.get(\"content-type\")||(\"string\"==typeof e?this.headers.set(\"content-type\",\"text/plain;charset=UTF-8\"):this._bodyBlob&&this._bodyBlob.type?this.headers.set(\"content-type\",this._bodyBlob.type):n&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"))},o&&(this.blob=function(){var e=h(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error(\"could not read FormData body as blob\");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?h(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(m)}),this.text=function(){var e,t,n,r=h(this);if(r)return r;if(this._bodyBlob)return e=this._bodyBlob,t=new FileReader,n=d(t),t.readAsText(e),n;if(this._bodyArrayBuffer)return Promise.resolve(function(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join(\"\")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error(\"could not read FormData body as text\");return Promise.resolve(this._bodyText)},a&&(this.formData=function(){return this.text().then(_)}),this.json=function(){return this.text().then(JSON.parse)},this}f.prototype.append=function(e,t){e=c(e),t=l(t);var n=this.map[e];this.map[e]=n?n+\", \"+t:t},f.prototype.delete=function(e){delete this.map[c(e)]},f.prototype.get=function(e){return e=c(e),this.has(e)?this.map[e]:null},f.prototype.has=function(e){return this.map.hasOwnProperty(c(e))},f.prototype.set=function(e,t){this.map[c(e)]=l(t)},f.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},f.prototype.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),p(e)},f.prototype.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),p(e)},f.prototype.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),p(e)},r&&(f.prototype[Symbol.iterator]=f.prototype.entries);var y=[\"DELETE\",\"GET\",\"HEAD\",\"OPTIONS\",\"POST\",\"PUT\"];function b(e,t){var n,r,o=(t=t||{}).body;if(e instanceof b){if(e.bodyUsed)throw new TypeError(\"Already read\");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new f(e.headers)),this.method=e.method,this.mode=e.mode,this.signal=e.signal,o||null==e._bodyInit||(o=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||\"same-origin\",!t.headers&&this.headers||(this.headers=new f(t.headers)),this.method=(n=t.method||this.method||\"GET\",r=n.toUpperCase(),y.indexOf(r)>-1?r:n),this.mode=t.mode||this.mode||null,this.signal=t.signal||this.signal,this.referrer=null,(\"GET\"===this.method||\"HEAD\"===this.method)&&o)throw new TypeError(\"Body not allowed for GET or HEAD requests\");this._initBody(o)}function _(e){var t=new FormData;return e.trim().split(\"&\").forEach((function(e){if(e){var n=e.split(\"=\"),r=n.shift().replace(/\\+/g,\" \"),o=n.join(\"=\").replace(/\\+/g,\" \");t.append(decodeURIComponent(r),decodeURIComponent(o))}})),t}function w(e,t){t||(t={}),this.type=\"default\",this.status=void 0===t.status?200:t.status,this.ok=this.status>=200&&this.status<300,this.statusText=\"statusText\"in t?t.statusText:\"OK\",this.headers=new f(t.headers),this.url=t.url||\"\",this._initBody(e)}b.prototype.clone=function(){return new b(this,{body:this._bodyInit})},g.call(b.prototype),g.call(w.prototype),w.prototype.clone=function(){return new w(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new f(this.headers),url:this.url})},w.error=function(){var e=new w(null,{status:0,statusText:\"\"});return e.type=\"error\",e};var x=[301,302,303,307,308];w.redirect=function(e,t){if(-1===x.indexOf(t))throw new RangeError(\"Invalid status code\");return new w(null,{status:t,headers:{location:e}})},t.DOMException=e.DOMException;try{new t.DOMException}catch(e){t.DOMException=function(e,t){this.message=e,this.name=t;var n=Error(e);this.stack=n.stack},t.DOMException.prototype=Object.create(Error.prototype),t.DOMException.prototype.constructor=t.DOMException}function E(e,n){return new Promise((function(r,a){var i=new b(e,n);if(i.signal&&i.signal.aborted)return a(new t.DOMException(\"Aborted\",\"AbortError\"));var s=new XMLHttpRequest;function u(){s.abort()}s.onload=function(){var e,t,n={status:s.status,statusText:s.statusText,headers:(e=s.getAllResponseHeaders()||\"\",t=new f,e.replace(/\\r?\\n[\\t ]+/g,\" \").split(/\\r?\\n/).forEach((function(e){var n=e.split(\":\"),r=n.shift().trim();if(r){var o=n.join(\":\").trim();t.append(r,o)}})),t)};n.url=\"responseURL\"in s?s.responseURL:n.headers.get(\"X-Request-URL\");var o=\"response\"in s?s.response:s.responseText;r(new w(o,n))},s.onerror=function(){a(new TypeError(\"Network request failed\"))},s.ontimeout=function(){a(new TypeError(\"Network request failed\"))},s.onabort=function(){a(new t.DOMException(\"Aborted\",\"AbortError\"))},s.open(i.method,i.url,!0),\"include\"===i.credentials?s.withCredentials=!0:\"omit\"===i.credentials&&(s.withCredentials=!1),\"responseType\"in s&&o&&(s.responseType=\"blob\"),i.headers.forEach((function(e,t){s.setRequestHeader(t,e)})),i.signal&&(i.signal.addEventListener(\"abort\",u),s.onreadystatechange=function(){4===s.readyState&&i.signal.removeEventListener(\"abort\",u)}),s.send(void 0===i._bodyInit?null:i._bodyInit)}))}E.polyfill=!0,e.fetch||(e.fetch=E,e.Headers=f,e.Request=b,e.Response=w),t.Headers=f,t.Request=b,t.Response=w,t.fetch=E,Object.defineProperty(t,\"__esModule\",{value:!0})}({})}(\"undefined\"!=typeof self?self:this)},function(e,t,n){\"use strict\";var r=n(283),o=Object.prototype.hasOwnProperty,a=Array.isArray,i=function(){for(var e=[],t=0;t<256;++t)e.push(\"%\"+((t<16?\"0\":\"\")+t.toString(16)).toUpperCase());return e}(),s=function(e,t){for(var n=t&&t.plainObjects?Object.create(null):{},r=0;r<e.length;++r)void 0!==e[r]&&(n[r]=e[r]);return n};e.exports={arrayToObject:s,assign:function(e,t){return Object.keys(t).reduce((function(e,n){return e[n]=t[n],e}),e)},combine:function(e,t){return[].concat(e,t)},compact:function(e){for(var t=[{obj:{o:e},prop:\"o\"}],n=[],r=0;r<t.length;++r)for(var o=t[r],i=o.obj[o.prop],s=Object.keys(i),u=0;u<s.length;++u){var c=s[u],l=i[c];\"object\"==typeof l&&null!==l&&-1===n.indexOf(l)&&(t.push({obj:i,prop:c}),n.push(l))}return function(e){for(;e.length>1;){var t=e.pop(),n=t.obj[t.prop];if(a(n)){for(var r=[],o=0;o<n.length;++o)void 0!==n[o]&&r.push(n[o]);t.obj[t.prop]=r}}}(t),e},decode:function(e,t,n){var r=e.replace(/\\+/g,\" \");if(\"iso-8859-1\"===n)return r.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(r)}catch(e){return r}},encode:function(e,t,n,o,a){if(0===e.length)return e;var s=e;if(\"symbol\"==typeof e?s=Symbol.prototype.toString.call(e):\"string\"!=typeof e&&(s=String(e)),\"iso-8859-1\"===n)return escape(s).replace(/%u[0-9a-f]{4}/gi,(function(e){return\"%26%23\"+parseInt(e.slice(2),16)+\"%3B\"}));for(var u=\"\",c=0;c<s.length;++c){var l=s.charCodeAt(c);45===l||46===l||95===l||126===l||l>=48&&l<=57||l>=65&&l<=90||l>=97&&l<=122||a===r.RFC1738&&(40===l||41===l)?u+=s.charAt(c):l<128?u+=i[l]:l<2048?u+=i[192|l>>6]+i[128|63&l]:l<55296||l>=57344?u+=i[224|l>>12]+i[128|l>>6&63]+i[128|63&l]:(c+=1,l=65536+((1023&l)<<10|1023&s.charCodeAt(c)),u+=i[240|l>>18]+i[128|l>>12&63]+i[128|l>>6&63]+i[128|63&l])}return u},isBuffer:function(e){return!(!e||\"object\"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return\"[object RegExp]\"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(a(e)){for(var n=[],r=0;r<e.length;r+=1)n.push(t(e[r]));return n}return t(e)},merge:function e(t,n,r){if(!n)return t;if(\"object\"!=typeof n){if(a(t))t.push(n);else{if(!t||\"object\"!=typeof t)return[t,n];(r&&(r.plainObjects||r.allowPrototypes)||!o.call(Object.prototype,n))&&(t[n]=!0)}return t}if(!t||\"object\"!=typeof t)return[t].concat(n);var i=t;return a(t)&&!a(n)&&(i=s(t,r)),a(t)&&a(n)?(n.forEach((function(n,a){if(o.call(t,a)){var i=t[a];i&&\"object\"==typeof i&&n&&\"object\"==typeof n?t[a]=e(i,n,r):t.push(n)}else t[a]=n})),t):Object.keys(n).reduce((function(t,a){var i=n[a];return o.call(t,a)?t[a]=e(t[a],i,r):t[a]=i,t}),i)}}},function(e,t,n){\"use strict\";var r=n(21),o=n(40),a=n(207),i=n(37),s=n(67),u=n(121),c=n(139),l=n(47),p=n(98),f=n(68).f,h=n(86).forEach,d=n(48),m=n(78),v=m.set,g=m.getterFor;e.exports=function(e,t,n){var m,y=-1!==e.indexOf(\"Map\"),b=-1!==e.indexOf(\"Weak\"),_=y?\"set\":\"add\",w=o[e],x=w&&w.prototype,E={};if(d&&\"function\"==typeof w&&(b||x.forEach&&!i((function(){(new w).entries().next()})))){m=t((function(t,n){v(c(t,m,e),{type:e,collection:new w}),null!=n&&u(n,t[_],{that:t,AS_ENTRIES:y})}));var S=g(e);h([\"add\",\"clear\",\"delete\",\"forEach\",\"get\",\"has\",\"set\",\"keys\",\"values\",\"entries\"],(function(e){var t=\"add\"==e||\"set\"==e;!(e in x)||b&&\"clear\"==e||s(m.prototype,e,(function(n,r){var o=S(this).collection;if(!t&&b&&!l(n))return\"get\"==e&&void 0;var a=o[e](0===n?0:n,r);return t?this:a}))})),b||f(m.prototype,\"size\",{configurable:!0,get:function(){return S(this).collection.size}})}else m=n.getConstructor(t,e,y,_),a.REQUIRED=!0;return p(m,e,!1,!0),E[e]=m,r({global:!0,forced:!0},E),b||n.setStrong(m,e,y),m}},function(e,t,n){var r=n(37),o=n(41),a=n(97),i=o(\"iterator\");e.exports=!r((function(){var e=new URL(\"b?a=1&b=2&c=3\",\"http://a\"),t=e.searchParams,n=\"\";return e.pathname=\"c%20d\",t.forEach((function(e,r){t.delete(\"b\"),n+=r+e})),a&&!e.toJSON||!t.sort||\"http://a/c%20d?a=1&c=3\"!==e.href||\"3\"!==t.get(\"c\")||\"a=1\"!==String(new URLSearchParams(\"?a=1\"))||!t[i]||\"a\"!==new URL(\"https://a@b\").username||\"b\"!==new URLSearchParams(new URLSearchParams(\"a=b\")).get(\"a\")||\"xn--e1aybc\"!==new URL(\"http://тест\").host||\"#%D0%B1\"!==new URL(\"http://a#б\").hash||\"a1c3\"!==n||\"x\"!==new URL(\"http://x\",void 0).host}))},function(e,t,n){\"use strict\";n(157);var r=n(21),o=n(70),a=n(504),i=n(110),s=n(163),u=n(98),c=n(371),l=n(78),p=n(139),f=n(55),h=n(107),d=n(99),m=n(52),v=n(47),g=n(109),y=n(105),b=n(1087),_=n(159),w=n(41),x=o(\"fetch\"),E=o(\"Headers\"),S=w(\"iterator\"),C=\"URLSearchParams\",A=\"URLSearchParamsIterator\",k=l.set,O=l.getterFor(C),j=l.getterFor(A),T=/\\+/g,I=Array(4),P=function(e){return I[e-1]||(I[e-1]=RegExp(\"((?:%[\\\\da-f]{2}){\"+e+\"})\",\"gi\"))},N=function(e){try{return decodeURIComponent(e)}catch(t){return e}},M=function(e){var t=e.replace(T,\" \"),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(P(n--),N);return t}},R=/[!'()~]|%20/g,D={\"!\":\"%21\",\"'\":\"%27\",\"(\":\"%28\",\")\":\"%29\",\"~\":\"%7E\",\"%20\":\"+\"},L=function(e){return D[e]},B=function(e){return encodeURIComponent(e).replace(R,L)},F=function(e,t){if(t)for(var n,r,o=t.split(\"&\"),a=0;a<o.length;)(n=o[a++]).length&&(r=n.split(\"=\"),e.push({key:M(r.shift()),value:M(r.join(\"=\"))}))},U=function(e){this.entries.length=0,F(this.entries,e)},q=function(e,t){if(e<t)throw TypeError(\"Not enough arguments\")},z=c((function(e,t){k(this,{type:A,iterator:b(O(e).entries),kind:t})}),\"Iterator\",(function(){var e=j(this),t=e.kind,n=e.iterator.next(),r=n.value;return n.done||(n.value=\"keys\"===t?r.key:\"values\"===t?r.value:[r.key,r.value]),n})),V=function(){p(this,V,C);var e,t,n,r,o,a,i,s,u,c=arguments.length>0?arguments[0]:void 0,l=this,h=[];if(k(l,{type:C,entries:h,updateURL:function(){},updateSearchParams:U}),void 0!==c)if(v(c))if(\"function\"==typeof(e=_(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((i=(a=(o=b(m(r.value))).next).call(o)).done||(s=a.call(o)).done||!a.call(o).done)throw TypeError(\"Expected sequence with length 2\");h.push({key:i.value+\"\",value:s.value+\"\"})}else for(u in c)f(c,u)&&h.push({key:u,value:c[u]+\"\"});else F(h,\"string\"==typeof c?\"?\"===c.charAt(0)?c.slice(1):c:c+\"\")},W=V.prototype;s(W,{append:function(e,t){q(arguments.length,2);var n=O(this);n.entries.push({key:e+\"\",value:t+\"\"}),n.updateURL()},delete:function(e){q(arguments.length,1);for(var t=O(this),n=t.entries,r=e+\"\",o=0;o<n.length;)n[o].key===r?n.splice(o,1):o++;t.updateURL()},get:function(e){q(arguments.length,1);for(var t=O(this).entries,n=e+\"\",r=0;r<t.length;r++)if(t[r].key===n)return t[r].value;return null},getAll:function(e){q(arguments.length,1);for(var t=O(this).entries,n=e+\"\",r=[],o=0;o<t.length;o++)t[o].key===n&&r.push(t[o].value);return r},has:function(e){q(arguments.length,1);for(var t=O(this).entries,n=e+\"\",r=0;r<t.length;)if(t[r++].key===n)return!0;return!1},set:function(e,t){q(arguments.length,1);for(var n,r=O(this),o=r.entries,a=!1,i=e+\"\",s=t+\"\",u=0;u<o.length;u++)(n=o[u]).key===i&&(a?o.splice(u--,1):(a=!0,n.value=s));a||o.push({key:i,value:s}),r.updateURL()},sort:function(){var e,t,n,r=O(this),o=r.entries,a=o.slice();for(o.length=0,n=0;n<a.length;n++){for(e=a[n],t=0;t<n;t++)if(o[t].key>e.key){o.splice(t,0,e);break}t===n&&o.push(e)}r.updateURL()},forEach:function(e){for(var t,n=O(this).entries,r=h(e,arguments.length>1?arguments[1]:void 0,3),o=0;o<n.length;)r((t=n[o++]).value,t.key,this)},keys:function(){return new z(this,\"keys\")},values:function(){return new z(this,\"values\")},entries:function(){return new z(this,\"entries\")}},{enumerable:!0}),i(W,S,W.entries),i(W,\"toString\",(function(){for(var e,t=O(this).entries,n=[],r=0;r<t.length;)e=t[r++],n.push(B(e.key)+\"=\"+B(e.value));return n.join(\"&\")}),{enumerable:!0}),u(V,C),r({global:!0,forced:!a},{URLSearchParams:V}),a||\"function\"!=typeof x||\"function\"!=typeof E||r({global:!0,enumerable:!0,forced:!0},{fetch:function(e){var t,n,r,o=[e];return arguments.length>1&&(v(t=arguments[1])&&(n=t.body,d(n)===C&&((r=t.headers?new E(t.headers):new E).has(\"content-type\")||r.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"),t=g(t,{body:y(0,String(n)),headers:y(0,r)}))),o.push(t)),x.apply(this,o)}}),e.exports={URLSearchParams:V,getState:O}},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwcHgiICBoZWlnaHQ9IjIwMHB4IiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGNsYXNzPSJsZHMtcm9sbGluZyIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IGJhY2tncm91bmQtcG9zaXRpb246IGluaXRpYWwgaW5pdGlhbDsgYmFja2dyb3VuZC1yZXBlYXQ6IGluaXRpYWwgaW5pdGlhbDsiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIGZpbGw9Im5vbmUiIG5nLWF0dHItc3Ryb2tlPSJ7e2NvbmZpZy5jb2xvcn19IiBuZy1hdHRyLXN0cm9rZS13aWR0aD0ie3tjb25maWcud2lkdGh9fSIgbmctYXR0ci1yPSJ7e2NvbmZpZy5yYWRpdXN9fSIgbmctYXR0ci1zdHJva2UtZGFzaGFycmF5PSJ7e2NvbmZpZy5kYXNoYXJyYXl9fSIgc3Ryb2tlPSIjNTU1NTU1IiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgY2FsY01vZGU9ImxpbmVhciIgdmFsdWVzPSIwIDUwIDUwOzM2MCA1MCA1MCIga2V5VGltZXM9IjA7MSIgZHVyPSIxcyIgYmVnaW49IjBzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvY2lyY2xlPjwvc3ZnPgo=\"},function(e,t,n){\"use strict\";function r(e){var t,n=e.Symbol;return\"function\"==typeof n?n.observable?t=n.observable:(t=n(\"observable\"),n.observable=t):t=\"@@observable\",t}n.d(t,\"a\",(function(){return r}))},function(e,t,n){\"use strict\";(function(e){var n=\"object\"==typeof e&&e&&e.Object===Object&&e;t.a=n}).call(this,n(51))},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.combineReducers=void 0;var r,o=n(628),a=(r=o)&&r.__esModule?r:{default:r};t.combineReducers=a.default},function(e,t,n){\"use strict\";var r=\"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};function o(e){return null===e?\"null\":void 0===e?\"undefined\":\"object\"===(void 0===e?\"undefined\":r(e))?Array.isArray(e)?\"array\":\"object\":void 0===e?\"undefined\":r(e)}function a(e){return\"object\"===o(e)?s(e):\"array\"===o(e)?i(e):e}function i(e){return e.map(a)}function s(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=a(e[n]));return t}function u(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={arrayBehaviour:n.arrayBehaviour||\"replace\"},a=t.map((function(e){return e||{}})),c=e||{},l=0;l<a.length;l++)for(var p=a[l],f=Object.keys(p),h=0;h<f.length;h++){var d=f[h],m=p[d],v=o(m),g=o(c[d]);if(\"object\"===v)if(\"undefined\"!==g){var y=\"object\"===g?c[d]:{};c[d]=u({},[y,s(m)],r)}else c[d]=s(m);else if(\"array\"===v)if(\"array\"===g){var b=i(m);c[d]=\"merge\"===r.arrayBehaviour?c[d].concat(b):b}else c[d]=i(m);else c[d]=m}return c}e.exports=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return u(e,n)},e.exports.noMutate=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return u({},t)},e.exports.withOptions=function(e,t,n){return u(e,t,n)}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.sanitizeUrl=void 0;var r=/^([^\\w]*)(javascript|data|vbscript)/im,o=/[\\u0000-\\u001F\\u007F-\\u009F\\u2000-\\u200D\\uFEFF]/gim,a=/^([^:]+):/gm,i=[\".\",\"/\"];t.sanitizeUrl=function(e){if(!e)return\"about:blank\";var t=e.replace(o,\"\").trim();if(function(e){return i.indexOf(e[0])>-1}(t))return t;var n=t.match(a);if(!n)return t;var s=n[0];return r.test(s)?\"about:blank\":t}},function(e,t,n){var r=n(685),o=n(693)((function(e,t,n){return t=t.toLowerCase(),e+(n?r(t):t)}));e.exports=o},function(e,t,n){(function(t){var r=n(768),o=n(769).Stream;function a(e,t,n){n=n||0;var o,i,s=(o=t,new Array(n||0).join(o||\"\")),u=e;if(\"object\"==typeof e&&((u=e[i=Object.keys(e)[0]])&&u._elem))return u._elem.name=i,u._elem.icount=n,u._elem.indent=t,u._elem.indents=s,u._elem.interrupt=u,u._elem;var c,l=[],p=[];function f(e){Object.keys(e).forEach((function(t){l.push(function(e,t){return e+'=\"'+r(t)+'\"'}(t,e[t]))}))}switch(typeof u){case\"object\":if(null===u)break;u._attr&&f(u._attr),u._cdata&&p.push((\"<![CDATA[\"+u._cdata).replace(/\\]\\]>/g,\"]]]]><![CDATA[>\")+\"]]>\"),u.forEach&&(c=!1,p.push(\"\"),u.forEach((function(e){\"object\"==typeof e?\"_attr\"==Object.keys(e)[0]?f(e._attr):p.push(a(e,t,n+1)):(p.pop(),c=!0,p.push(r(e)))})),c||p.push(\"\"));break;default:p.push(r(u))}return{name:i,interrupt:!1,attributes:l,content:p,icount:n,indents:s,indent:t}}function i(e,t,n){if(\"object\"!=typeof t)return e(!1,t);var r=t.interrupt?1:t.content.length;function o(){for(;t.content.length;){var o=t.content.shift();if(void 0!==o){if(a(o))return;i(e,o)}}e(!1,(r>1?t.indents:\"\")+(t.name?\"</\"+t.name+\">\":\"\")+(t.indent&&!n?\"\\n\":\"\")),n&&n()}function a(t){return!!t.interrupt&&(t.interrupt.append=e,t.interrupt.end=o,t.interrupt=!1,e(!0),!0)}if(e(!1,t.indents+(t.name?\"<\"+t.name:\"\")+(t.attributes.length?\" \"+t.attributes.join(\" \"):\"\")+(r?t.name?\">\":\"\":t.name?\"/>\":\"\")+(t.indent&&r>1?\"\\n\":\"\")),!r)return e(!1,t.indent?\"\\n\":\"\");a(t)||o()}e.exports=function(e,n){\"object\"!=typeof n&&(n={indent:n});var r,s,u=n.stream?new o:null,c=\"\",l=!1,p=n.indent?!0===n.indent?\"    \":n.indent:\"\",f=!0;function h(e){f?t.nextTick(e):e()}function d(e,t){if(void 0!==t&&(c+=t),e&&!l&&(u=u||new o,l=!0),e&&l){var n=c;h((function(){u.emit(\"data\",n)})),c=\"\"}}function m(e,t){i(d,a(e,p,p?1:0),t)}function v(){if(u){var e=c;h((function(){u.emit(\"data\",e),u.emit(\"end\"),u.readable=!1,u.emit(\"close\")}))}}return h((function(){f=!1})),n.declaration&&(r=n.declaration,s={version:\"1.0\",encoding:r.encoding||\"UTF-8\"},r.standalone&&(s.standalone=r.standalone),m({\"?xml\":{_attr:s}}),c=c.replace(\"/>\",\"?>\")),e&&e.forEach?e.forEach((function(t,n){var r;n+1===e.length&&(r=v),m(t,r)})):m(e,v),u?(u.readable=!0,u):c},e.exports.element=e.exports.Element=function(){var e=Array.prototype.slice.call(arguments),t={_elem:a(e),push:function(e){if(!this.append)throw new Error(\"not assigned to a parent!\");var t=this,n=this._elem.indent;i(this.append,a(e,n,this._elem.icount+(n?1:0)),(function(){t.append(!0)}))},close:function(e){void 0!==e&&this.push(e),this.end&&this.end()}};return t}}).call(this,n(90))},function(e,t,n){(function(t){var n;n=void 0!==t?t:this,e.exports=function(e){if(e.CSS&&e.CSS.escape)return e.CSS.escape;var t=function(e){if(0==arguments.length)throw new TypeError(\"`CSS.escape` requires an argument.\");for(var t,n=String(e),r=n.length,o=-1,a=\"\",i=n.charCodeAt(0);++o<r;)0!=(t=n.charCodeAt(o))?a+=t>=1&&t<=31||127==t||0==o&&t>=48&&t<=57||1==o&&t>=48&&t<=57&&45==i?\"\\\\\"+t.toString(16)+\" \":0==o&&1==r&&45==t||!(t>=128||45==t||95==t||t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122)?\"\\\\\"+n.charAt(o):n.charAt(o):a+=\"�\";return a};return e.CSS||(e.CSS={}),e.CSS.escape=t,t}(n)}).call(this,n(51))},function(e,t,n){\"use strict\";(function(t,r){var o=65536,a=4294967295;var i=n(62).Buffer,s=t.crypto||t.msCrypto;s&&s.getRandomValues?e.exports=function(e,t){if(e>a)throw new RangeError(\"requested too many random bytes\");var n=i.allocUnsafe(e);if(e>0)if(e>o)for(var u=0;u<e;u+=o)s.getRandomValues(n.slice(u,u+o));else s.getRandomValues(n);if(\"function\"==typeof t)return r.nextTick((function(){t(null,n)}));return n}:e.exports=function(){throw new Error(\"Secure random number generation is not supported by this browser.\\nUse Chrome, Firefox or Internet Explorer 11\")}}).call(this,n(51),n(90))},function(e,t,n){(t=e.exports=function(e){e=e.toLowerCase();var n=t[e];if(!n)throw new Error(e+\" is not supported (we accept pull requests)\");return new n}).sha=n(842),t.sha1=n(843),t.sha224=n(844),t.sha256=n(446),t.sha384=n(845),t.sha512=n(447)},function(e,t,n){var r=n(411),o=n(428),a=n(191),i=n(850),s=n(50);e.exports=function(e,t,n){var u=s(e)?r:i,c=arguments.length<3;return u(e,a(t,4),n,c,o)}},function(e,t,n){var r=n(57),o=n(896),a=n(427),i=Math.max,s=Math.min;e.exports=function(e,t,n){var u,c,l,p,f,h,d=0,m=!1,v=!1,g=!0;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");function y(t){var n=u,r=c;return u=c=void 0,d=t,p=e.apply(r,n)}function b(e){return d=e,f=setTimeout(w,t),m?y(e):p}function _(e){var n=e-h;return void 0===h||n>=t||n<0||v&&e-d>=l}function w(){var e=o();if(_(e))return x(e);f=setTimeout(w,function(e){var n=t-(e-h);return v?s(n,l-(e-d)):n}(e))}function x(e){return f=void 0,g&&u?y(e):(u=c=void 0,p)}function E(){var e=o(),n=_(e);if(u=arguments,c=this,h=e,n){if(void 0===f)return b(h);if(v)return clearTimeout(f),f=setTimeout(w,t),y(h)}return void 0===f&&(f=setTimeout(w,t)),p}return t=a(t)||0,r(n)&&(m=!!n.leading,l=(v=\"maxWait\"in n)?i(a(n.maxWait)||0,t):l,g=\"trailing\"in n?!!n.trailing:g),E.cancel=function(){void 0!==f&&clearTimeout(f),d=0,u=h=c=f=void 0},E.flush=function(){return void 0===f?p:x(o())},E}},function(e,t,n){\"use strict\";e.exports=n(917)},function(e,t,n){var r=n(408),o=n(494),a=n(1021),i=n(135),s=n(143),u=n(1024),c=n(497),l=n(496),p=c((function(e,t){var n={};if(null==e)return n;var c=!1;t=r(t,(function(t){return t=i(t,e),c||(c=t.length>1),t})),s(e,l(e),n),c&&(n=o(n,7,u));for(var p=t.length;p--;)a(n,t[p]);return n}));e.exports=p},function(e,t,n){e.exports=n(1032)},function(e,t,n){var r=n(1043);e.exports=function(e,t){if(null==e)return{};var n,o,a=r(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}},function(e,t,n){var r=n(1044),o=n(1045),a=n(1046),i=n(1047);e.exports=function(e){return r(e)||o(e)||a(e)||i()}},function(e,t){function n(){return e.exports=n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},n.apply(this,arguments)}e.exports=n},function(e,t){e.exports=function(e){const t={literal:\"true false null\"},n=[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],r=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],o={end:\",\",endsWithParent:!0,excludeEnd:!0,contains:r,keywords:t},a={begin:/\\{/,end:/\\}/,contains:[{className:\"attr\",begin:/\"/,end:/\"/,contains:[e.BACKSLASH_ESCAPE],illegal:\"\\\\n\"},e.inherit(o,{begin:/:/})].concat(n),illegal:\"\\\\S\"},i={begin:\"\\\\[\",end:\"\\\\]\",contains:[e.inherit(o)],illegal:\"\\\\S\"};return r.push(a,i),n.forEach((function(e){r.push(e)})),{name:\"JSON\",contains:r,keywords:t,illegal:\"\\\\S\"}}},function(e,t){const n=\"[A-Za-z$_][0-9A-Za-z$_]*\",r=[\"as\",\"in\",\"of\",\"if\",\"for\",\"while\",\"finally\",\"var\",\"new\",\"function\",\"do\",\"return\",\"void\",\"else\",\"break\",\"catch\",\"instanceof\",\"with\",\"throw\",\"case\",\"default\",\"try\",\"switch\",\"continue\",\"typeof\",\"delete\",\"let\",\"yield\",\"const\",\"class\",\"debugger\",\"async\",\"await\",\"static\",\"import\",\"from\",\"export\",\"extends\"],o=[\"true\",\"false\",\"null\",\"undefined\",\"NaN\",\"Infinity\"],a=[].concat([\"setInterval\",\"setTimeout\",\"clearInterval\",\"clearTimeout\",\"require\",\"exports\",\"eval\",\"isFinite\",\"isNaN\",\"parseFloat\",\"parseInt\",\"decodeURI\",\"decodeURIComponent\",\"encodeURI\",\"encodeURIComponent\",\"escape\",\"unescape\"],[\"arguments\",\"this\",\"super\",\"console\",\"window\",\"document\",\"localStorage\",\"module\",\"global\"],[\"Intl\",\"DataView\",\"Number\",\"Math\",\"Date\",\"String\",\"RegExp\",\"Object\",\"Function\",\"Boolean\",\"Error\",\"Symbol\",\"Set\",\"Map\",\"WeakSet\",\"WeakMap\",\"Proxy\",\"Reflect\",\"JSON\",\"Promise\",\"Float64Array\",\"Int16Array\",\"Int32Array\",\"Int8Array\",\"Uint16Array\",\"Uint32Array\",\"Float32Array\",\"Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"ArrayBuffer\"],[\"EvalError\",\"InternalError\",\"RangeError\",\"ReferenceError\",\"SyntaxError\",\"TypeError\",\"URIError\"]);function i(e){return s(\"(?=\",e,\")\")}function s(...e){return e.map((e=>{return(t=e)?\"string\"==typeof t?t:t.source:null;var t})).join(\"\")}e.exports=function(e){const t=n,u=\"<>\",c=\"</>\",l={begin:/<[A-Za-z0-9\\\\._:-]+/,end:/\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,isTrulyOpeningTag:(e,t)=>{const n=e[0].length+e.index,r=e.input[n];\"<\"!==r?\">\"===r&&(((e,{after:t})=>{const n=\"</\"+e[0].slice(1);return-1!==e.input.indexOf(n,t)})(e,{after:n})||t.ignoreMatch()):t.ignoreMatch()}},p={$pattern:n,keyword:r.join(\" \"),literal:o.join(\" \"),built_in:a.join(\" \")},f=\"\\\\.([0-9](_?[0-9])*)\",h=\"0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*\",d={className:\"number\",variants:[{begin:`(\\\\b(${h})((${f})|\\\\.)?|(${f}))[eE][+-]?([0-9](_?[0-9])*)\\\\b`},{begin:`\\\\b(${h})\\\\b((${f})\\\\b|\\\\.)?|(${f})\\\\b`},{begin:\"\\\\b(0|[1-9](_?[0-9])*)n\\\\b\"},{begin:\"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\"},{begin:\"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\"},{begin:\"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\"},{begin:\"\\\\b0[0-7]+n?\\\\b\"}],relevance:0},m={className:\"subst\",begin:\"\\\\$\\\\{\",end:\"\\\\}\",keywords:p,contains:[]},v={begin:\"html`\",end:\"\",starts:{end:\"`\",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,m],subLanguage:\"xml\"}},g={begin:\"css`\",end:\"\",starts:{end:\"`\",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,m],subLanguage:\"css\"}},y={className:\"string\",begin:\"`\",end:\"`\",contains:[e.BACKSLASH_ESCAPE,m]},b={className:\"comment\",variants:[e.COMMENT(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,contains:[{className:\"doctag\",begin:\"@[A-Za-z]+\",contains:[{className:\"type\",begin:\"\\\\{\",end:\"\\\\}\",relevance:0},{className:\"variable\",begin:t+\"(?=\\\\s*(-)|$)\",endsParent:!0,relevance:0},{begin:/(?=[^\\n])\\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},_=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,v,g,y,d,e.REGEXP_MODE];m.contains=_.concat({begin:/\\{/,end:/\\}/,keywords:p,contains:[\"self\"].concat(_)});const w=[].concat(b,m.contains),x=w.concat([{begin:/\\(/,end:/\\)/,keywords:p,contains:[\"self\"].concat(w)}]),E={className:\"params\",begin:/\\(/,end:/\\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:x};return{name:\"Javascript\",aliases:[\"js\",\"jsx\",\"mjs\",\"cjs\"],keywords:p,exports:{PARAMS_CONTAINS:x},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:\"shebang\",binary:\"node\",relevance:5}),{label:\"use_strict\",className:\"meta\",relevance:10,begin:/^\\s*['\"]use (strict|asm)['\"]/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,v,g,y,b,d,{begin:s(/[{,\\n]\\s*/,i(s(/(((\\/\\/.*$)|(\\/\\*(\\*[^/]|[^*])*\\*\\/))\\s*)*/,t+\"\\\\s*:\"))),relevance:0,contains:[{className:\"attr\",begin:t+i(\"\\\\s*:\"),relevance:0}]},{begin:\"(\"+e.RE_STARTERS_RE+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",keywords:\"return throw case\",contains:[b,e.REGEXP_MODE,{className:\"function\",begin:\"(\\\\([^()]*(\\\\([^()]*(\\\\([^()]*\\\\)[^()]*)*\\\\)[^()]*)*\\\\)|\"+e.UNDERSCORE_IDENT_RE+\")\\\\s*=>\",returnBegin:!0,end:\"\\\\s*=>\",contains:[{className:\"params\",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\\(\\s*\\)/,skip:!0},{begin:/\\(/,end:/\\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:x}]}]},{begin:/,/,relevance:0},{className:\"\",begin:/\\s/,end:/\\s*/,skip:!0},{variants:[{begin:u,end:c},{begin:l.begin,\"on:begin\":l.isTrulyOpeningTag,end:l.end}],subLanguage:\"xml\",contains:[{begin:l.begin,end:l.end,skip:!0,contains:[\"self\"]}]}],relevance:0},{className:\"function\",beginKeywords:\"function\",end:/[{;]/,excludeEnd:!0,keywords:p,contains:[\"self\",e.inherit(e.TITLE_MODE,{begin:t}),E],illegal:/%/},{beginKeywords:\"while if switch catch for\"},{className:\"function\",begin:e.UNDERSCORE_IDENT_RE+\"\\\\([^()]*(\\\\([^()]*(\\\\([^()]*\\\\)[^()]*)*\\\\)[^()]*)*\\\\)\\\\s*\\\\{\",returnBegin:!0,contains:[E,e.inherit(e.TITLE_MODE,{begin:t})]},{variants:[{begin:\"\\\\.\"+t},{begin:\"\\\\$\"+t}],relevance:0},{className:\"class\",beginKeywords:\"class\",end:/[{;=]/,excludeEnd:!0,illegal:/[:\"[\\]]/,contains:[{beginKeywords:\"extends\"},e.UNDERSCORE_TITLE_MODE]},{begin:/\\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:t}),\"self\",E]},{begin:\"(get|set)\\\\s+(?=\"+t+\"\\\\()\",end:/\\{/,keywords:\"get set\",contains:[e.inherit(e.TITLE_MODE,{begin:t}),{begin:/\\(\\)/},E]},{begin:/\\$[(.]/}]}}},function(e,t){function n(e){return e?\"string\"==typeof e?e:e.source:null}function r(e){return o(\"(?=\",e,\")\")}function o(...e){return e.map((e=>n(e))).join(\"\")}function a(...e){return\"(\"+e.map((e=>n(e))).join(\"|\")+\")\"}e.exports=function(e){const t=o(/[A-Z_]/,o(\"(\",/[A-Z0-9_.-]+:/,\")?\"),/[A-Z0-9_.-]*/),n={className:\"symbol\",begin:\"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;\"},i={begin:\"\\\\s\",contains:[{className:\"meta-keyword\",begin:\"#?[a-z_][a-z1-9_-]+\",illegal:\"\\\\n\"}]},s=e.inherit(i,{begin:\"\\\\(\",end:\"\\\\)\"}),u=e.inherit(e.APOS_STRING_MODE,{className:\"meta-string\"}),c=e.inherit(e.QUOTE_STRING_MODE,{className:\"meta-string\"}),l={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:\"attr\",begin:\"[A-Za-z0-9\\\\._:-]+\",relevance:0},{begin:/=\\s*/,relevance:0,contains:[{className:\"string\",endsParent:!0,variants:[{begin:/\"/,end:/\"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\\s\"'=<>`]+/}]}]}]};return{name:\"HTML, XML\",aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\",\"wsf\",\"svg\"],case_insensitive:!0,contains:[{className:\"meta\",begin:\"<![a-z]\",end:\">\",relevance:10,contains:[i,c,u,s,{begin:\"\\\\[\",end:\"\\\\]\",contains:[{className:\"meta\",begin:\"<![a-z]\",end:\">\",contains:[i,s,c,u]}]}]},e.COMMENT(\"\\x3c!--\",\"--\\x3e\",{relevance:10}),{begin:\"<!\\\\[CDATA\\\\[\",end:\"\\\\]\\\\]>\",relevance:10},n,{className:\"meta\",begin:/<\\?xml/,end:/\\?>/,relevance:10},{className:\"tag\",begin:\"<style(?=\\\\s|>)\",end:\">\",keywords:{name:\"style\"},contains:[l],starts:{end:\"</style>\",returnEnd:!0,subLanguage:[\"css\",\"xml\"]}},{className:\"tag\",begin:\"<script(?=\\\\s|>)\",end:\">\",keywords:{name:\"script\"},contains:[l],starts:{end:/<\\/script>/,returnEnd:!0,subLanguage:[\"javascript\",\"handlebars\",\"xml\"]}},{className:\"tag\",begin:/<>|<\\/>/},{className:\"tag\",begin:o(/</,r(o(t,a(/\\/>/,/>/,/\\s/)))),end:/\\/?>/,contains:[{className:\"name\",begin:t,relevance:0,starts:l}]},{className:\"tag\",begin:o(/<\\//,r(o(t,/>/))),contains:[{className:\"name\",begin:t,relevance:0},{begin:/>/,relevance:0}]}]}}},function(e,t){e.exports=function(e){var t=\"true false yes no null\",n=\"[\\\\w#;/?:@&=+$,.~*'()[\\\\]]+\",r={className:\"string\",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/\"/,end:/\"/},{begin:/\\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:\"template-variable\",variants:[{begin:/\\{\\{/,end:/\\}\\}/},{begin:/%\\{/,end:/\\}/}]}]},o=e.inherit(r,{variants:[{begin:/'/,end:/'/},{begin:/\"/,end:/\"/},{begin:/[^\\s,{}[\\]]+/}]}),a={className:\"number\",begin:\"\\\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\\\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\\\.[0-9]*)?([ \\\\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\\\b\"},i={end:\",\",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:t,relevance:0},s={begin:/\\{/,end:/\\}/,contains:[i],illegal:\"\\\\n\",relevance:0},u={begin:\"\\\\[\",end:\"\\\\]\",contains:[i],illegal:\"\\\\n\",relevance:0},c=[{className:\"attr\",variants:[{begin:\"\\\\w[\\\\w :\\\\/.-]*:(?=[ \\t]|$)\"},{begin:'\"\\\\w[\\\\w :\\\\/.-]*\":(?=[ \\t]|$)'},{begin:\"'\\\\w[\\\\w :\\\\/.-]*':(?=[ \\t]|$)\"}]},{className:\"meta\",begin:\"^---\\\\s*$\",relevance:10},{className:\"string\",begin:\"[\\\\|>]([1-9]?[+-])?[ ]*\\\\n( +)[^ ][^\\\\n]*\\\\n(\\\\2[^\\\\n]+\\\\n?)*\"},{begin:\"<%[%=-]?\",end:\"[%-]?%>\",subLanguage:\"ruby\",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:\"type\",begin:\"!\\\\w+!\"+n},{className:\"type\",begin:\"!<\"+n+\">\"},{className:\"type\",begin:\"!\"+n},{className:\"type\",begin:\"!!\"+n},{className:\"meta\",begin:\"&\"+e.UNDERSCORE_IDENT_RE+\"$\"},{className:\"meta\",begin:\"\\\\*\"+e.UNDERSCORE_IDENT_RE+\"$\"},{className:\"bullet\",begin:\"-(?=[ ]|$)\",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},a,{className:\"number\",begin:e.C_NUMBER_RE+\"\\\\b\",relevance:0},s,u,r],l=[...c];return l.pop(),l.push(o),i.contains=l,{name:\"YAML\",case_insensitive:!0,aliases:[\"yml\",\"YAML\"],contains:c}}},function(e,t){e.exports=function(e){var t=\"HTTP/[0-9\\\\.]+\";return{name:\"HTTP\",aliases:[\"https\"],illegal:\"\\\\S\",contains:[{begin:\"^\"+t,end:\"$\",contains:[{className:\"number\",begin:\"\\\\b\\\\d{3}\\\\b\"}]},{begin:\"^[A-Z]+ (.*?) \"+t+\"$\",returnBegin:!0,end:\"$\",contains:[{className:\"string\",begin:\" \",end:\" \",excludeBegin:!0,excludeEnd:!0},{begin:t},{className:\"keyword\",begin:\"[A-Z]+\"}]},{className:\"attribute\",begin:\"^\\\\w\",end:\": \",excludeEnd:!0,illegal:\"\\\\n|\\\\s|=\",starts:{end:\"$\",relevance:0}},{begin:\"\\\\n\\\\n\",starts:{subLanguage:[],endsWithParent:!0}}]}}},function(e,t){function n(...e){return e.map((e=>{return(t=e)?\"string\"==typeof t?t:t.source:null;var t})).join(\"\")}e.exports=function(e){const t={},r={begin:/\\$\\{/,end:/\\}/,contains:[\"self\",{begin:/:-/,contains:[t]}]};Object.assign(t,{className:\"variable\",variants:[{begin:n(/\\$[\\w\\d#@][\\w\\d_]*/,\"(?![\\\\w\\\\d])(?![$])\")},r]});const o={className:\"subst\",begin:/\\$\\(/,end:/\\)/,contains:[e.BACKSLASH_ESCAPE]},a={begin:/<<-?\\s*(?=\\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\\w+)/,end:/(\\w+)/,className:\"string\"})]}},i={className:\"string\",begin:/\"/,end:/\"/,contains:[e.BACKSLASH_ESCAPE,t,o]};o.contains.push(i);const s={begin:/\\$\\(\\(/,end:/\\)\\)/,contains:[{begin:/\\d+#[0-9a-f]+/,className:\"number\"},e.NUMBER_MODE,t]},u=e.SHEBANG({binary:`(${[\"fish\",\"bash\",\"zsh\",\"sh\",\"csh\",\"ksh\",\"tcsh\",\"dash\",\"scsh\"].join(\"|\")})`,relevance:10}),c={className:\"function\",begin:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\\w[\\w\\d_]*/})],relevance:0};return{name:\"Bash\",aliases:[\"sh\",\"zsh\"],keywords:{$pattern:/\\b[a-z._-]+\\b/,keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\"},contains:[u,e.SHEBANG(),c,s,e.HASH_COMMENT_MODE,a,i,{className:\"\",begin:/\\\\\"/},{className:\"string\",begin:/'/,end:/'/},t]}}},function(e,t){e.exports=function(e){const t={$pattern:/-?[A-z\\.\\-]+\\b/,keyword:\"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter\",built_in:\"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write\"},n={begin:\"`[\\\\s\\\\S]\",relevance:0},r={className:\"variable\",variants:[{begin:/\\$\\B/},{className:\"keyword\",begin:/\\$this/},{begin:/\\$[\\w\\d][\\w\\d_:]*/}]},o={className:\"string\",variants:[{begin:/\"/,end:/\"/},{begin:/@\"/,end:/^\"@/}],contains:[n,r,{className:\"variable\",begin:/\\$[A-z]/,end:/[^A-z]/}]},a={className:\"string\",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},i=e.inherit(e.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,end:/#>/}],contains:[{className:\"doctag\",variants:[{begin:/\\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\\s+\\S+/}]}]}),s={className:\"built_in\",variants:[{begin:\"(\".concat(\"Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Complete|Confirm|Deny|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where\",\")+(-)[\\\\w\\\\d]+\")}]},u={className:\"class\",beginKeywords:\"class enum\",end:/\\s*[{]/,excludeEnd:!0,relevance:0,contains:[e.TITLE_MODE]},c={className:\"function\",begin:/function\\s+/,end:/\\s*\\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,contains:[{begin:\"function\",relevance:0,className:\"keyword\"},{className:\"title\",begin:/\\w[\\w\\d]*((-)[\\w\\d]+)*/,relevance:0},{begin:/\\(/,end:/\\)/,className:\"params\",relevance:0,contains:[r]}]},l={begin:/using\\s/,end:/$/,returnBegin:!0,contains:[o,a,{className:\"keyword\",begin:/(using|assembly|command|module|namespace|type)/}]},p={variants:[{className:\"operator\",begin:\"(\".concat(\"-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor\",\")\\\\b\")},{className:\"literal\",begin:/(-)[\\w\\d]+/,relevance:0}]},f={className:\"function\",begin:/\\[.*\\]\\s*[\\w]+[ ]??\\(/,end:/$/,returnBegin:!0,relevance:0,contains:[{className:\"keyword\",begin:\"(\".concat(t.keyword.toString().replace(/\\s/g,\"|\"),\")\\\\b\"),endsParent:!0,relevance:0},e.inherit(e.TITLE_MODE,{endsParent:!0})]},h=[f,i,n,e.NUMBER_MODE,o,a,s,r,{className:\"literal\",begin:/\\$(null|true|false)\\b/},{className:\"selector-tag\",begin:/@\\B/,relevance:0}],d={begin:/\\[/,end:/\\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat(\"self\",h,{begin:\"(\"+[\"string\",\"char\",\"byte\",\"int\",\"long\",\"bool\",\"decimal\",\"single\",\"double\",\"DateTime\",\"xml\",\"array\",\"hashtable\",\"void\"].join(\"|\")+\")\",className:\"built_in\",relevance:0},{className:\"type\",begin:/[\\.\\w\\d]+/,relevance:0})};return f.contains.unshift(d),{name:\"PowerShell\",aliases:[\"ps\",\"ps1\"],case_insensitive:!0,keywords:t,contains:h.concat(u,c,l,p,d)}}},function(e,t,n){e.exports=n(1066)},function(e,t,n){var r=n(494);e.exports=function(e){return r(e,5)}},function(e,t,n){e.exports=n(1070)},function(e,t){var n=e.exports=function(e){return new r(e)};function r(e){this.value=e}function o(e,t,n){var r=[],o=[],s=!0;return function e(p){var f=n?a(p):p,h={},d=!0,m={node:f,node_:p,path:[].concat(r),parent:o[o.length-1],parents:o,key:r.slice(-1)[0],isRoot:0===r.length,level:r.length,circular:null,update:function(e,t){m.isRoot||(m.parent.node[m.key]=e),m.node=e,t&&(d=!1)},delete:function(e){delete m.parent.node[m.key],e&&(d=!1)},remove:function(e){u(m.parent.node)?m.parent.node.splice(m.key,1):delete m.parent.node[m.key],e&&(d=!1)},keys:null,before:function(e){h.before=e},after:function(e){h.after=e},pre:function(e){h.pre=e},post:function(e){h.post=e},stop:function(){s=!1},block:function(){d=!1}};if(!s)return m;function v(){if(\"object\"==typeof m.node&&null!==m.node){m.keys&&m.node_===m.node||(m.keys=i(m.node)),m.isLeaf=0==m.keys.length;for(var e=0;e<o.length;e++)if(o[e].node_===p){m.circular=o[e];break}}else m.isLeaf=!0,m.keys=null;m.notLeaf=!m.isLeaf,m.notRoot=!m.isRoot}v();var g=t.call(m,m.node);return void 0!==g&&m.update&&m.update(g),h.before&&h.before.call(m,m.node),d?(\"object\"!=typeof m.node||null===m.node||m.circular||(o.push(m),v(),c(m.keys,(function(t,o){r.push(t),h.pre&&h.pre.call(m,m.node[t],t);var a=e(m.node[t]);n&&l.call(m.node,t)&&(m.node[t]=a.node),a.isLast=o==m.keys.length-1,a.isFirst=0==o,h.post&&h.post.call(m,a),r.pop()})),o.pop()),h.after&&h.after.call(m,m.node),m):m}(e).node}function a(e){if(\"object\"==typeof e&&null!==e){var t;if(u(e))t=[];else if(\"[object Date]\"===s(e))t=new Date(e.getTime?e.getTime():e);else if(function(e){return\"[object RegExp]\"===s(e)}(e))t=new RegExp(e);else if(function(e){return\"[object Error]\"===s(e)}(e))t={message:e.message};else if(function(e){return\"[object Boolean]\"===s(e)}(e))t=new Boolean(e);else if(function(e){return\"[object Number]\"===s(e)}(e))t=new Number(e);else if(function(e){return\"[object String]\"===s(e)}(e))t=new String(e);else if(Object.create&&Object.getPrototypeOf)t=Object.create(Object.getPrototypeOf(e));else if(e.constructor===Object)t={};else{var n=e.constructor&&e.constructor.prototype||e.__proto__||{},r=function(){};r.prototype=n,t=new r}return c(i(e),(function(n){t[n]=e[n]})),t}return e}r.prototype.get=function(e){for(var t=this.value,n=0;n<e.length;n++){var r=e[n];if(!t||!l.call(t,r)){t=void 0;break}t=t[r]}return t},r.prototype.has=function(e){for(var t=this.value,n=0;n<e.length;n++){var r=e[n];if(!t||!l.call(t,r))return!1;t=t[r]}return!0},r.prototype.set=function(e,t){for(var n=this.value,r=0;r<e.length-1;r++){var o=e[r];l.call(n,o)||(n[o]={}),n=n[o]}return n[e[r]]=t,t},r.prototype.map=function(e){return o(this.value,e,!0)},r.prototype.forEach=function(e){return this.value=o(this.value,e,!1),this.value},r.prototype.reduce=function(e,t){var n=1===arguments.length,r=n?this.value:t;return this.forEach((function(t){this.isRoot&&n||(r=e.call(this,r,t))})),r},r.prototype.paths=function(){var e=[];return this.forEach((function(t){e.push(this.path)})),e},r.prototype.nodes=function(){var e=[];return this.forEach((function(t){e.push(this.node)})),e},r.prototype.clone=function(){var e=[],t=[];return function n(r){for(var o=0;o<e.length;o++)if(e[o]===r)return t[o];if(\"object\"==typeof r&&null!==r){var s=a(r);return e.push(r),t.push(s),c(i(r),(function(e){s[e]=n(r[e])})),e.pop(),t.pop(),s}return r}(this.value)};var i=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t};function s(e){return Object.prototype.toString.call(e)}var u=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},c=function(e,t){if(e.forEach)return e.forEach(t);for(var n=0;n<e.length;n++)t(e[n],n,e)};c(i(r.prototype),(function(e){n[e]=function(t){var n=[].slice.call(arguments,1),o=new r(t);return o[e].apply(o,n)}}));var l=Object.hasOwnProperty||function(e,t){return t in e}},function(e,t,n){\"use strict\";t.parse=function(e,t){if(\"string\"!=typeof e)throw new TypeError(\"argument str must be a string\");for(var n={},o=t||{},i=e.split(a),u=o.decode||r,c=0;c<i.length;c++){var l=i[c],p=l.indexOf(\"=\");if(!(p<0)){var f=l.substr(0,p).trim(),h=l.substr(++p,l.length).trim();'\"'==h[0]&&(h=h.slice(1,-1)),null==n[f]&&(n[f]=s(h,u))}}return n},t.serialize=function(e,t,n){var r=n||{},a=r.encode||o;if(\"function\"!=typeof a)throw new TypeError(\"option encode is invalid\");if(!i.test(e))throw new TypeError(\"argument name is invalid\");var s=a(t);if(s&&!i.test(s))throw new TypeError(\"argument val is invalid\");var u=e+\"=\"+s;if(null!=r.maxAge){var c=r.maxAge-0;if(isNaN(c)||!isFinite(c))throw new TypeError(\"option maxAge is invalid\");u+=\"; Max-Age=\"+Math.floor(c)}if(r.domain){if(!i.test(r.domain))throw new TypeError(\"option domain is invalid\");u+=\"; Domain=\"+r.domain}if(r.path){if(!i.test(r.path))throw new TypeError(\"option path is invalid\");u+=\"; Path=\"+r.path}if(r.expires){if(\"function\"!=typeof r.expires.toUTCString)throw new TypeError(\"option expires is invalid\");u+=\"; Expires=\"+r.expires.toUTCString()}r.httpOnly&&(u+=\"; HttpOnly\");r.secure&&(u+=\"; Secure\");if(r.sameSite){switch(\"string\"==typeof r.sameSite?r.sameSite.toLowerCase():r.sameSite){case!0:u+=\"; SameSite=Strict\";break;case\"lax\":u+=\"; SameSite=Lax\";break;case\"strict\":u+=\"; SameSite=Strict\";break;case\"none\":u+=\"; SameSite=None\";break;default:throw new TypeError(\"option sameSite is invalid\")}}return u};var r=decodeURIComponent,o=encodeURIComponent,a=/; */,i=/^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;function s(e,t){try{return t(e)}catch(t){return e}}},function(e,t,n){var r,o,a;o=[],r=function(){\"use strict\";var e=function(e){return e&&\"getComputedStyle\"in window&&\"smooth\"===window.getComputedStyle(e)[\"scroll-behavior\"]};if(\"undefined\"==typeof window||!(\"document\"in window))return{};var t=function(t,n,r){var o;n=n||999,r||0===r||(r=9);var a=function(e){o=e},i=function(){clearTimeout(o),a(0)},s=function(e){return Math.max(0,t.getTopOf(e)-r)},u=function(r,o,s){if(i(),0===o||o&&o<0||e(t.body))t.toY(r),s&&s();else{var u=t.getY(),c=Math.max(0,r)-u,l=(new Date).getTime();o=o||Math.min(Math.abs(c),n),function e(){a(setTimeout((function(){var n=Math.min(1,((new Date).getTime()-l)/o),r=Math.max(0,Math.floor(u+c*(n<.5?2*n*n:n*(4-2*n)-1)));t.toY(r),n<1&&t.getHeight()+r<t.body.scrollHeight?e():(setTimeout(i,99),s&&s())}),9))}()}},c=function(e,t,n){u(s(e),t,n)},l=function(e,n,o){var a=e.getBoundingClientRect().height,i=t.getTopOf(e)+a,l=t.getHeight(),p=t.getY(),f=p+l;s(e)<p||a+r>l?c(e,n,o):i+r>f?u(i-l+r,n,o):o&&o()},p=function(e,n,r,o){u(Math.max(0,t.getTopOf(e)-t.getHeight()/2+(r||e.getBoundingClientRect().height/2)),n,o)};return{setup:function(e,t){return(0===e||e)&&(n=e),(0===t||t)&&(r=t),{defaultDuration:n,edgeOffset:r}},to:c,toY:u,intoView:l,center:p,stop:i,moving:function(){return!!o},getY:t.getY,getTopOf:t.getTopOf}},n=document.documentElement,r=function(){return window.scrollY||n.scrollTop},o=t({body:document.scrollingElement||document.body,toY:function(e){window.scrollTo(0,e)},getY:r,getHeight:function(){return window.innerHeight||n.clientHeight},getTopOf:function(e){return e.getBoundingClientRect().top+r()-n.offsetTop}});if(o.createScroller=function(e,r,o){return t({body:e,toY:function(t){e.scrollTop=t},getY:function(){return e.scrollTop},getHeight:function(){return Math.min(e.clientHeight,window.innerHeight||n.clientHeight)},getTopOf:function(e){return e.offsetTop}},r,o)},\"addEventListener\"in window&&!window.noZensmooth&&!e(document.body)){var a=\"history\"in window&&\"pushState\"in history,i=a&&\"scrollRestoration\"in history;i&&(history.scrollRestoration=\"auto\"),window.addEventListener(\"load\",(function(){i&&(setTimeout((function(){history.scrollRestoration=\"manual\"}),9),window.addEventListener(\"popstate\",(function(e){e.state&&\"zenscrollY\"in e.state&&o.toY(e.state.zenscrollY)}),!1)),window.location.hash&&setTimeout((function(){var e=o.setup().edgeOffset;if(e){var t=document.getElementById(window.location.href.split(\"#\")[1]);if(t){var n=Math.max(0,o.getTopOf(t)-e),r=o.getY()-n;0<=r&&r<9&&window.scrollTo(0,n)}}}),9)}),!1);var s=new RegExp(\"(^|\\\\s)noZensmooth(\\\\s|$)\");window.addEventListener(\"click\",(function(e){for(var t=e.target;t&&\"A\"!==t.tagName;)t=t.parentNode;if(!(!t||1!==e.which||e.shiftKey||e.metaKey||e.ctrlKey||e.altKey)){if(i){var n=history.state&&\"object\"==typeof history.state?history.state:{};n.zenscrollY=o.getY();try{history.replaceState(n,\"\")}catch(e){}}var r=t.getAttribute(\"href\")||\"\";if(0===r.indexOf(\"#\")&&!s.test(t.className)){var u=0,c=document.getElementById(r.substring(1));if(\"#\"!==r){if(!c)return;u=o.getTopOf(c)}e.preventDefault();var l=function(){window.location=r},p=o.setup().edgeOffset;p&&(u=Math.max(0,u-p),a&&(l=function(){history.pushState({},\"\",r)})),o.toY(u,null,l)}}}),!1)}return o}(),void 0===(a=\"function\"==typeof r?r.apply(t,o):r)||(e.exports=a)},function(e,t,n){e.exports=n(1091)},function(e,t){e.exports=function(e,t,n,r){var o=new Blob(void 0!==r?[r,e]:[e],{type:n||\"application/octet-stream\"});if(void 0!==window.navigator.msSaveBlob)window.navigator.msSaveBlob(o,t);else{var a=window.URL&&window.URL.createObjectURL?window.URL.createObjectURL(o):window.webkitURL.createObjectURL(o),i=document.createElement(\"a\");i.style.display=\"none\",i.href=a,i.setAttribute(\"download\",t),void 0===i.download&&i.setAttribute(\"target\",\"_blank\"),document.body.appendChild(i),i.click(),setTimeout((function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)}),200)}}},function(e,t,n){e.exports=n(1098)},function(e,t,n){e.exports=n(1101)},function(e,t,n){\"use strict\";var r=n(1106),o=function(e){return/<\\/+[^>]+>/.test(e)},a=function(e){return/<[^>]+\\/>/.test(e)};function i(e){return e.split(/(<\\/?[^>]+>)/g).filter((function(e){return\"\"!==e.trim()})).map((function(e){return{value:e,type:s(e)}}))}function s(e){return o(e)?\"ClosingTag\":function(e){return function(e){return/<[^>!]+>/.test(e)}(e)&&!o(e)&&!a(e)}(e)?\"OpeningTag\":a(e)?\"SelfClosingTag\":\"Text\"}e.exports=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.indentor,o=t.textNodesOnSameLine,a=0,s=[];n=n||\"    \";var u=i(e).map((function(e,t,i){var u=e.value,c=e.type;\"ClosingTag\"===c&&a--;var l=r(n,a),p=l+u;if(\"OpeningTag\"===c&&a++,o){var f=i[t-1],h=i[t-2];\"ClosingTag\"===c&&\"Text\"===f.type&&\"OpeningTag\"===h.type&&(p=\"\"+l+h.value+f.value+u,s.push(t-2,t-1))}return p}));return s.forEach((function(e){return u[e]=null})),u.filter((function(e){return!!e})).join(\"\\n\")}},function(e,t,n){e.exports=n(1110)},function(e,t,n){var r=n(545);n(565),n(566),n(567),n(568),n(569),n(570),n(571),e.exports=r},function(e,t,n){n(360),n(180),n(364),n(549),n(550),n(551),n(552),n(369),n(553),n(554),n(555),n(556),n(557),n(558),n(559),n(560),n(561),n(562),n(563),n(564);var r=n(34);e.exports=r.Symbol},function(e,t,n){var r=n(40),o=n(67);e.exports=function(e,t){try{o(r,e,t)}catch(n){r[e]=t}return t}},function(e,t,n){var r=n(66),o=n(234).f,a={}.toString,i=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return i&&\"[object Window]\"==a.call(e)?function(e){try{return o(e)}catch(e){return i.slice()}}(e):o(r(e))}},function(e,t,n){\"use strict\";var r=n(237),o=n(99);e.exports=r?{}.toString:function(){return\"[object \"+o(this)+\"]\"}},function(e,t,n){n(44)(\"asyncIterator\")},function(e,t){},function(e,t,n){n(44)(\"hasInstance\")},function(e,t,n){n(44)(\"isConcatSpreadable\")},function(e,t,n){n(44)(\"match\")},function(e,t,n){n(44)(\"matchAll\")},function(e,t,n){n(44)(\"replace\")},function(e,t,n){n(44)(\"search\")},function(e,t,n){n(44)(\"species\")},function(e,t,n){n(44)(\"split\")},function(e,t,n){n(44)(\"toPrimitive\")},function(e,t,n){n(44)(\"toStringTag\")},function(e,t,n){n(44)(\"unscopables\")},function(e,t,n){var r=n(40);n(98)(r.JSON,\"JSON\",!0)},function(e,t){},function(e,t){},function(e,t,n){n(44)(\"asyncDispose\")},function(e,t,n){n(44)(\"dispose\")},function(e,t,n){n(44)(\"matcher\")},function(e,t,n){n(44)(\"metadata\")},function(e,t,n){n(44)(\"observable\")},function(e,t,n){n(44)(\"patternMatch\")},function(e,t,n){n(44)(\"replaceAll\")},function(e,t,n){e.exports=n(573)},function(e,t,n){var r=n(574);e.exports=r},function(e,t,n){n(369),n(130),n(87);var r=n(236);e.exports=r.f(\"iterator\")},function(e,t,n){var r=n(47);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError(\"Can't set \"+String(e)+\" as a prototype\");return e}},function(e,t){e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(e,t,n){var r=n(578);e.exports=r},function(e,t,n){var r=n(579),o=Array.prototype;e.exports=function(e){var t=e.concat;return e===o||e instanceof Array&&t===o.concat?r:t}},function(e,t,n){n(360);var r=n(42);e.exports=r(\"Array\").concat},function(e,t,n){var r=n(374);e.exports=r},function(e,t,n){n(582);var r=n(42);e.exports=r(\"Array\").filter},function(e,t,n){\"use strict\";var r=n(21),o=n(86).filter;r({target:\"Array\",proto:!0,forced:!n(154)(\"filter\")},{filter:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(375);e.exports=r},function(e,t,n){var r=n(21),o=n(60),a=n(155);r({target:\"Object\",stat:!0,forced:n(37)((function(){a(1)}))},{keys:function(e){return a(o(e))}})},function(e,t,n){var r=n(586);e.exports=r},function(e,t,n){n(587);var r=n(34);r.JSON||(r.JSON={stringify:JSON.stringify}),e.exports=function(e,t,n){return r.JSON.stringify.apply(null,arguments)}},function(e,t,n){var r=n(21),o=n(70),a=n(37),i=o(\"JSON\",\"stringify\"),s=/[\\uD800-\\uDFFF]/g,u=/^[\\uD800-\\uDBFF]$/,c=/^[\\uDC00-\\uDFFF]$/,l=function(e,t,n){var r=n.charAt(t-1),o=n.charAt(t+1);return u.test(e)&&!c.test(o)||c.test(e)&&!u.test(r)?\"\\\\u\"+e.charCodeAt(0).toString(16):e},p=a((function(){return'\"\\\\udf06\\\\ud834\"'!==i(\"\\udf06\\ud834\")||'\"\\\\udead\"'!==i(\"\\udead\")}));i&&r({target:\"JSON\",stat:!0,forced:p},{stringify:function(e,t,n){var r=i.apply(null,arguments);return\"string\"==typeof r?r.replace(s,l):r}})},function(e,t,n){\"use strict\";t.byteLength=function(e){var t=c(e),n=t[0],r=t[1];return 3*(n+r)/4-r},t.toByteArray=function(e){var t,n,r=c(e),i=r[0],s=r[1],u=new a(function(e,t,n){return 3*(t+n)/4-n}(0,i,s)),l=0,p=s>0?i-4:i;for(n=0;n<p;n+=4)t=o[e.charCodeAt(n)]<<18|o[e.charCodeAt(n+1)]<<12|o[e.charCodeAt(n+2)]<<6|o[e.charCodeAt(n+3)],u[l++]=t>>16&255,u[l++]=t>>8&255,u[l++]=255&t;2===s&&(t=o[e.charCodeAt(n)]<<2|o[e.charCodeAt(n+1)]>>4,u[l++]=255&t);1===s&&(t=o[e.charCodeAt(n)]<<10|o[e.charCodeAt(n+1)]<<4|o[e.charCodeAt(n+2)]>>2,u[l++]=t>>8&255,u[l++]=255&t);return u},t.fromByteArray=function(e){for(var t,n=e.length,o=n%3,a=[],i=16383,s=0,u=n-o;s<u;s+=i)a.push(l(e,s,s+i>u?u:s+i));1===o?(t=e[n-1],a.push(r[t>>2]+r[t<<4&63]+\"==\")):2===o&&(t=(e[n-2]<<8)+e[n-1],a.push(r[t>>10]+r[t>>4&63]+r[t<<2&63]+\"=\"));return a.join(\"\")};for(var r=[],o=[],a=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,i=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",s=0,u=i.length;s<u;++s)r[s]=i[s],o[i.charCodeAt(s)]=s;function c(e){var t=e.length;if(t%4>0)throw new Error(\"Invalid string. Length must be a multiple of 4\");var n=e.indexOf(\"=\");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function l(e,t,n){for(var o,a,i=[],s=t;s<n;s+=3)o=(e[s]<<16&16711680)+(e[s+1]<<8&65280)+(255&e[s+2]),i.push(r[(a=o)>>18&63]+r[a>>12&63]+r[a>>6&63]+r[63&a]);return i.join(\"\")}o[\"-\".charCodeAt(0)]=62,o[\"_\".charCodeAt(0)]=63},function(e,t){t.read=function(e,t,n,r,o){var a,i,s=8*o-r-1,u=(1<<s)-1,c=u>>1,l=-7,p=n?o-1:0,f=n?-1:1,h=e[t+p];for(p+=f,a=h&(1<<-l)-1,h>>=-l,l+=s;l>0;a=256*a+e[t+p],p+=f,l-=8);for(i=a&(1<<-l)-1,a>>=-l,l+=r;l>0;i=256*i+e[t+p],p+=f,l-=8);if(0===a)a=1-c;else{if(a===u)return i?NaN:1/0*(h?-1:1);i+=Math.pow(2,r),a-=c}return(h?-1:1)*i*Math.pow(2,a-r)},t.write=function(e,t,n,r,o,a){var i,s,u,c=8*a-o-1,l=(1<<c)-1,p=l>>1,f=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:a-1,d=r?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,i=l):(i=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-i))<1&&(i--,u*=2),(t+=i+p>=1?f/u:f*Math.pow(2,1-p))*u>=2&&(i++,u/=2),i+p>=l?(s=0,i=l):i+p>=1?(s=(t*u-1)*Math.pow(2,o),i+=p):(s=t*Math.pow(2,p-1)*Math.pow(2,o),i=0));o>=8;e[n+h]=255&s,h+=d,s/=256,o-=8);for(i=i<<o|s,c+=o;c>0;e[n+h]=255&i,h+=d,i/=256,c-=8);e[n+h-d]|=128*m}},function(e,t,n){var r=n(377);e.exports=r},function(e,t,n){var r=n(21),o=n(48);r({target:\"Object\",stat:!0,forced:!o,sham:!o},{defineProperty:n(68).f})},function(e,t,n){var r=n(593);e.exports=r},function(e,t,n){var r=n(594),o=Function.prototype;e.exports=function(e){var t=e.bind;return e===o||e instanceof Function&&t===o.bind?r:t}},function(e,t,n){n(595);var r=n(42);e.exports=r(\"Function\").bind},function(e,t,n){n(21)({target:\"Function\",proto:!0},{bind:n(378)})},function(e,t,n){var r=n(379);e.exports=r},function(e,t,n){var r=n(21),o=n(380);r({target:\"Object\",stat:!0,forced:Object.assign!==o},{assign:o})},function(e,t,n){var r=n(381);e.exports=r},function(e,t,n){n(600);var r=n(42);e.exports=r(\"Array\").slice},function(e,t,n){\"use strict\";var r=n(21),o=n(47),a=n(152),i=n(232),s=n(69),u=n(66),c=n(153),l=n(41),p=n(154)(\"slice\"),f=l(\"species\"),h=[].slice,d=Math.max;r({target:\"Array\",proto:!0,forced:!p},{slice:function(e,t){var n,r,l,p=u(this),m=s(p.length),v=i(e,m),g=i(void 0===t?m:t,m);if(a(p)&&(\"function\"!=typeof(n=p.constructor)||n!==Array&&!a(n.prototype)?o(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return h.call(p,v,g);for(r=new(void 0===n?Array:n)(d(g-v,0)),l=0;v<g;v++,l++)v in p&&c(r,l,p[v]);return r.length=l,r}})},function(e,t,n){var r=n(382);e.exports=r},function(e,t,n){n(21)({target:\"Array\",stat:!0},{isArray:n(152)})},function(e,t,n){var r=n(604);e.exports=r},function(e,t,n){var r=n(605),o=Array.prototype;e.exports=function(e){var t=e.reduce;return e===o||e instanceof Array&&t===o.reduce?r:t}},function(e,t,n){n(606);var r=n(42);e.exports=r(\"Array\").reduce},function(e,t,n){\"use strict\";var r=n(21),o=n(607).left,a=n(111),i=n(129),s=n(184);r({target:\"Array\",proto:!0,forced:!a(\"reduce\")||!s&&i>79&&i<83},{reduce:function(e){return o(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(77),o=n(60),a=n(177),i=n(69),s=function(e){return function(t,n,s,u){r(n);var c=o(t),l=a(c),p=i(c.length),f=e?p-1:0,h=e?-1:1;if(s<2)for(;;){if(f in l){u=l[f],f+=h;break}if(f+=h,e?f<0:p<=f)throw TypeError(\"Reduce of empty array with no initial value\")}for(;e?f>=0:p>f;f+=h)f in l&&(u=n(u,l[f],f,c));return u}};e.exports={left:s(!1),right:s(!0)}},function(e,t,n){var r=n(609);e.exports=r},function(e,t,n){var r=n(610),o=Array.prototype;e.exports=function(e){var t=e.map;return e===o||e instanceof Array&&t===o.map?r:t}},function(e,t,n){n(611);var r=n(42);e.exports=r(\"Array\").map},function(e,t,n){\"use strict\";var r=n(21),o=n(86).map;r({target:\"Array\",proto:!0,forced:!n(154)(\"map\")},{map:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){\"use strict\";e.exports=function(){}},function(e,t,n){\"use strict\";var r=n(614),o=n(133),a=n(79),i=n(615),s=r.twoArgumentPooler,u=r.fourArgumentPooler,c=/\\/+/g;function l(e){return(\"\"+e).replace(c,\"$&/\")}function p(e,t){this.func=e,this.context=t,this.count=0}function f(e,t,n){var r=e.func,o=e.context;r.call(o,t,e.count++)}function h(e,t,n,r){this.result=e,this.keyPrefix=t,this.func=n,this.context=r,this.count=0}function d(e,t,n){var r=e.result,i=e.keyPrefix,s=e.func,u=e.context,c=s.call(u,t,e.count++);Array.isArray(c)?m(c,r,n,a.thatReturnsArgument):null!=c&&(o.isValidElement(c)&&(c=o.cloneAndReplaceKey(c,i+(!c.key||t&&t.key===c.key?\"\":l(c.key)+\"/\")+n)),r.push(c))}function m(e,t,n,r,o){var a=\"\";null!=n&&(a=l(n)+\"/\");var s=h.getPooled(t,a,r,o);i(e,d,s),h.release(s)}function v(e,t,n){return null}p.prototype.destructor=function(){this.func=null,this.context=null,this.count=0},r.addPoolingTo(p,s),h.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},r.addPoolingTo(h,u);var g={forEach:function(e,t,n){if(null==e)return e;var r=p.getPooled(t,n);i(e,f,r),p.release(r)},map:function(e,t,n){if(null==e)return e;var r=[];return m(e,r,null,t,n),r},mapIntoWithKeyPrefixInternal:m,count:function(e,t){return i(e,v,null)},toArray:function(e){var t=[];return m(e,t,null,a.thatReturnsArgument),t}};e.exports=g},function(e,t,n){\"use strict\";var r=n(158),o=(n(25),function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)}),a=function(e){var t=this;e instanceof t||r(\"25\"),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},i=o,s={addPoolingTo:function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||i,n.poolSize||(n.poolSize=10),n.release=a,n},oneArgumentPooler:o,twoArgumentPooler:function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},threeArgumentPooler:function(e,t,n){var r=this;if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,e,t,n),o}return new r(e,t,n)},fourArgumentPooler:function(e,t,n,r){var o=this;if(o.instancePool.length){var a=o.instancePool.pop();return o.call(a,e,t,n,r),a}return new o(e,t,n,r)}};e.exports=s},function(e,t,n){\"use strict\";var r=n(158),o=(n(88),n(386)),a=n(616),i=(n(25),n(617));n(33);function s(e,t){return e&&\"object\"==typeof e&&null!=e.key?i.escape(e.key):t.toString(36)}function u(e,t,n,c){var l,p=typeof e;if(\"undefined\"!==p&&\"boolean\"!==p||(e=null),null===e||\"string\"===p||\"number\"===p||\"object\"===p&&e.$$typeof===o)return n(c,e,\"\"===t?\".\"+s(e,0):t),1;var f=0,h=\"\"===t?\".\":t+\":\";if(Array.isArray(e))for(var d=0;d<e.length;d++)f+=u(l=e[d],h+s(l,d),n,c);else{var m=a(e);if(m){var v,g=m.call(e);if(m!==e.entries)for(var y=0;!(v=g.next()).done;)f+=u(l=v.value,h+s(l,y++),n,c);else for(;!(v=g.next()).done;){var b=v.value;b&&(f+=u(l=b[1],h+i.escape(b[0])+\":\"+s(l,0),n,c))}}else if(\"object\"===p){var _=String(e);r(\"31\",\"[object Object]\"===_?\"object with keys {\"+Object.keys(e).join(\", \")+\"}\":_,\"\")}}return f}e.exports=function(e,t,n){return null==e?0:u(e,\"\",t,n)}},function(e,t,n){\"use strict\";var r=\"function\"==typeof Symbol&&Symbol.iterator;e.exports=function(e){var t=e&&(r&&e[r]||e[\"@@iterator\"]);if(\"function\"==typeof t)return t}},function(e,t,n){\"use strict\";var r={escape:function(e){var t={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+e).replace(/[=:]/g,(function(e){return t[e]}))},unescape:function(e){var t={\"=0\":\"=\",\"=2\":\":\"};return(\"\"+(\".\"===e[0]&&\"$\"===e[1]?e.substring(2):e.substring(1))).replace(/(=0|=2)/g,(function(e){return t[e]}))}};e.exports=r},function(e,t,n){\"use strict\";var r=n(133).createFactory,o={a:r(\"a\"),abbr:r(\"abbr\"),address:r(\"address\"),area:r(\"area\"),article:r(\"article\"),aside:r(\"aside\"),audio:r(\"audio\"),b:r(\"b\"),base:r(\"base\"),bdi:r(\"bdi\"),bdo:r(\"bdo\"),big:r(\"big\"),blockquote:r(\"blockquote\"),body:r(\"body\"),br:r(\"br\"),button:r(\"button\"),canvas:r(\"canvas\"),caption:r(\"caption\"),cite:r(\"cite\"),code:r(\"code\"),col:r(\"col\"),colgroup:r(\"colgroup\"),data:r(\"data\"),datalist:r(\"datalist\"),dd:r(\"dd\"),del:r(\"del\"),details:r(\"details\"),dfn:r(\"dfn\"),dialog:r(\"dialog\"),div:r(\"div\"),dl:r(\"dl\"),dt:r(\"dt\"),em:r(\"em\"),embed:r(\"embed\"),fieldset:r(\"fieldset\"),figcaption:r(\"figcaption\"),figure:r(\"figure\"),footer:r(\"footer\"),form:r(\"form\"),h1:r(\"h1\"),h2:r(\"h2\"),h3:r(\"h3\"),h4:r(\"h4\"),h5:r(\"h5\"),h6:r(\"h6\"),head:r(\"head\"),header:r(\"header\"),hgroup:r(\"hgroup\"),hr:r(\"hr\"),html:r(\"html\"),i:r(\"i\"),iframe:r(\"iframe\"),img:r(\"img\"),input:r(\"input\"),ins:r(\"ins\"),kbd:r(\"kbd\"),keygen:r(\"keygen\"),label:r(\"label\"),legend:r(\"legend\"),li:r(\"li\"),link:r(\"link\"),main:r(\"main\"),map:r(\"map\"),mark:r(\"mark\"),menu:r(\"menu\"),menuitem:r(\"menuitem\"),meta:r(\"meta\"),meter:r(\"meter\"),nav:r(\"nav\"),noscript:r(\"noscript\"),object:r(\"object\"),ol:r(\"ol\"),optgroup:r(\"optgroup\"),option:r(\"option\"),output:r(\"output\"),p:r(\"p\"),param:r(\"param\"),picture:r(\"picture\"),pre:r(\"pre\"),progress:r(\"progress\"),q:r(\"q\"),rp:r(\"rp\"),rt:r(\"rt\"),ruby:r(\"ruby\"),s:r(\"s\"),samp:r(\"samp\"),script:r(\"script\"),section:r(\"section\"),select:r(\"select\"),small:r(\"small\"),source:r(\"source\"),span:r(\"span\"),strong:r(\"strong\"),style:r(\"style\"),sub:r(\"sub\"),summary:r(\"summary\"),sup:r(\"sup\"),table:r(\"table\"),tbody:r(\"tbody\"),td:r(\"td\"),textarea:r(\"textarea\"),tfoot:r(\"tfoot\"),th:r(\"th\"),thead:r(\"thead\"),time:r(\"time\"),title:r(\"title\"),tr:r(\"tr\"),track:r(\"track\"),u:r(\"u\"),ul:r(\"ul\"),var:r(\"var\"),video:r(\"video\"),wbr:r(\"wbr\"),circle:r(\"circle\"),clipPath:r(\"clipPath\"),defs:r(\"defs\"),ellipse:r(\"ellipse\"),g:r(\"g\"),image:r(\"image\"),line:r(\"line\"),linearGradient:r(\"linearGradient\"),mask:r(\"mask\"),path:r(\"path\"),pattern:r(\"pattern\"),polygon:r(\"polygon\"),polyline:r(\"polyline\"),radialGradient:r(\"radialGradient\"),rect:r(\"rect\"),stop:r(\"stop\"),svg:r(\"svg\"),text:r(\"text\"),tspan:r(\"tspan\")};e.exports=o},function(e,t,n){\"use strict\";var r=n(133).isValidElement,o=n(387);e.exports=o(r)},function(e,t,n){\"use strict\";var r=n(388),o=n(38),a=n(389),i=n(622),s=Function.call.bind(Object.prototype.hasOwnProperty);function u(){return null}e.exports=function(e,t){var n=\"function\"==typeof Symbol&&Symbol.iterator;var c=\"<<anonymous>>\",l={array:d(\"array\"),bool:d(\"boolean\"),func:d(\"function\"),number:d(\"number\"),object:d(\"object\"),string:d(\"string\"),symbol:d(\"symbol\"),any:h(u),arrayOf:function(e){return h((function(t,n,r,o,i){if(\"function\"!=typeof e)return new f(\"Property `\"+i+\"` of component `\"+r+\"` has invalid PropType notation inside arrayOf.\");var s=t[n];if(!Array.isArray(s))return new f(\"Invalid \"+o+\" `\"+i+\"` of type `\"+v(s)+\"` supplied to `\"+r+\"`, expected an array.\");for(var u=0;u<s.length;u++){var c=e(s,u,r,o,i+\"[\"+u+\"]\",a);if(c instanceof Error)return c}return null}))},element:h((function(t,n,r,o,a){var i=t[n];return e(i)?null:new f(\"Invalid \"+o+\" `\"+a+\"` of type `\"+v(i)+\"` supplied to `\"+r+\"`, expected a single ReactElement.\")})),elementType:h((function(e,t,n,o,a){var i=e[t];return r.isValidElementType(i)?null:new f(\"Invalid \"+o+\" `\"+a+\"` of type `\"+v(i)+\"` supplied to `\"+n+\"`, expected a single ReactElement type.\")})),instanceOf:function(e){return h((function(t,n,r,o,a){if(!(t[n]instanceof e)){var i=e.name||c;return new f(\"Invalid \"+o+\" `\"+a+\"` of type `\"+(((s=t[n]).constructor&&s.constructor.name?s.constructor.name:c)+\"` supplied to `\")+r+\"`, expected instance of `\"+i+\"`.\")}var s;return null}))},node:h((function(e,t,n,r,o){return m(e[t])?null:new f(\"Invalid \"+r+\" `\"+o+\"` supplied to `\"+n+\"`, expected a ReactNode.\")})),objectOf:function(e){return h((function(t,n,r,o,i){if(\"function\"!=typeof e)return new f(\"Property `\"+i+\"` of component `\"+r+\"` has invalid PropType notation inside objectOf.\");var u=t[n],c=v(u);if(\"object\"!==c)return new f(\"Invalid \"+o+\" `\"+i+\"` of type `\"+c+\"` supplied to `\"+r+\"`, expected an object.\");for(var l in u)if(s(u,l)){var p=e(u,l,r,o,i+\".\"+l,a);if(p instanceof Error)return p}return null}))},oneOf:function(e){if(!Array.isArray(e))return u;return h((function(t,n,r,o,a){for(var i=t[n],s=0;s<e.length;s++)if(p(i,e[s]))return null;var u=JSON.stringify(e,(function(e,t){return\"symbol\"===g(t)?String(t):t}));return new f(\"Invalid \"+o+\" `\"+a+\"` of value `\"+String(i)+\"` supplied to `\"+r+\"`, expected one of \"+u+\".\")}))},oneOfType:function(e){if(!Array.isArray(e))return u;for(var t=0;t<e.length;t++){var n=e[t];if(\"function\"!=typeof n)return y(n),u}return h((function(t,n,r,o,i){for(var s=0;s<e.length;s++)if(null==(0,e[s])(t,n,r,o,i,a))return null;return new f(\"Invalid \"+o+\" `\"+i+\"` supplied to `\"+r+\"`.\")}))},shape:function(e){return h((function(t,n,r,o,i){var s=t[n],u=v(s);if(\"object\"!==u)return new f(\"Invalid \"+o+\" `\"+i+\"` of type `\"+u+\"` supplied to `\"+r+\"`, expected `object`.\");for(var c in e){var l=e[c];if(l){var p=l(s,c,r,o,i+\".\"+c,a);if(p)return p}}return null}))},exact:function(e){return h((function(t,n,r,i,s){var u=t[n],c=v(u);if(\"object\"!==c)return new f(\"Invalid \"+i+\" `\"+s+\"` of type `\"+c+\"` supplied to `\"+r+\"`, expected `object`.\");var l=o({},t[n],e);for(var p in l){var h=e[p];if(!h)return new f(\"Invalid \"+i+\" `\"+s+\"` key `\"+p+\"` supplied to `\"+r+\"`.\\nBad object: \"+JSON.stringify(t[n],null,\"  \")+\"\\nValid keys: \"+JSON.stringify(Object.keys(e),null,\"  \"));var d=h(u,p,r,i,s+\".\"+p,a);if(d)return d}return null}))}};function p(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}function f(e){this.message=e,this.stack=\"\"}function h(e){function n(n,r,o,i,s,u,l){if((i=i||c,u=u||o,l!==a)&&t){var p=new Error(\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use `PropTypes.checkPropTypes()` to call them. Read more at http://fb.me/use-check-prop-types\");throw p.name=\"Invariant Violation\",p}return null==r[o]?n?null===r[o]?new f(\"The \"+s+\" `\"+u+\"` is marked as required in `\"+i+\"`, but its value is `null`.\"):new f(\"The \"+s+\" `\"+u+\"` is marked as required in `\"+i+\"`, but its value is `undefined`.\"):null:e(r,o,i,s,u)}var r=n.bind(null,!1);return r.isRequired=n.bind(null,!0),r}function d(e){return h((function(t,n,r,o,a,i){var s=t[n];return v(s)!==e?new f(\"Invalid \"+o+\" `\"+a+\"` of type `\"+g(s)+\"` supplied to `\"+r+\"`, expected `\"+e+\"`.\"):null}))}function m(t){switch(typeof t){case\"number\":case\"string\":case\"undefined\":return!0;case\"boolean\":return!t;case\"object\":if(Array.isArray(t))return t.every(m);if(null===t||e(t))return!0;var r=function(e){var t=e&&(n&&e[n]||e[\"@@iterator\"]);if(\"function\"==typeof t)return t}(t);if(!r)return!1;var o,a=r.call(t);if(r!==t.entries){for(;!(o=a.next()).done;)if(!m(o.value))return!1}else for(;!(o=a.next()).done;){var i=o.value;if(i&&!m(i[1]))return!1}return!0;default:return!1}}function v(e){var t=typeof e;return Array.isArray(e)?\"array\":e instanceof RegExp?\"object\":function(e,t){return\"symbol\"===e||!!t&&(\"Symbol\"===t[\"@@toStringTag\"]||\"function\"==typeof Symbol&&t instanceof Symbol)}(t,e)?\"symbol\":t}function g(e){if(null==e)return\"\"+e;var t=v(e);if(\"object\"===t){if(e instanceof Date)return\"date\";if(e instanceof RegExp)return\"regexp\"}return t}function y(e){var t=g(e);switch(t){case\"array\":case\"object\":return\"an \"+t;case\"boolean\":case\"date\":case\"regexp\":return\"a \"+t;default:return t}}return f.prototype=Error.prototype,l.checkPropTypes=i,l.resetWarningCache=i.resetWarningCache,l.PropTypes=l,l}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=\"function\"==typeof Symbol&&Symbol.for,o=r?Symbol.for(\"react.element\"):60103,a=r?Symbol.for(\"react.portal\"):60106,i=r?Symbol.for(\"react.fragment\"):60107,s=r?Symbol.for(\"react.strict_mode\"):60108,u=r?Symbol.for(\"react.profiler\"):60114,c=r?Symbol.for(\"react.provider\"):60109,l=r?Symbol.for(\"react.context\"):60110,p=r?Symbol.for(\"react.async_mode\"):60111,f=r?Symbol.for(\"react.concurrent_mode\"):60111,h=r?Symbol.for(\"react.forward_ref\"):60112,d=r?Symbol.for(\"react.suspense\"):60113,m=r?Symbol.for(\"react.memo\"):60115,v=r?Symbol.for(\"react.lazy\"):60116;function g(e){if(\"object\"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case o:switch(e=e.type){case p:case f:case i:case u:case s:case d:return e;default:switch(e=e&&e.$$typeof){case l:case h:case c:return e;default:return t}}case v:case m:case a:return t}}}function y(e){return g(e)===f}t.typeOf=g,t.AsyncMode=p,t.ConcurrentMode=f,t.ContextConsumer=l,t.ContextProvider=c,t.Element=o,t.ForwardRef=h,t.Fragment=i,t.Lazy=v,t.Memo=m,t.Portal=a,t.Profiler=u,t.StrictMode=s,t.Suspense=d,t.isValidElementType=function(e){return\"string\"==typeof e||\"function\"==typeof e||e===i||e===f||e===u||e===s||e===d||\"object\"==typeof e&&null!==e&&(e.$$typeof===v||e.$$typeof===m||e.$$typeof===c||e.$$typeof===l||e.$$typeof===h)},t.isAsyncMode=function(e){return y(e)||g(e)===p},t.isConcurrentMode=y,t.isContextConsumer=function(e){return g(e)===l},t.isContextProvider=function(e){return g(e)===c},t.isElement=function(e){return\"object\"==typeof e&&null!==e&&e.$$typeof===o},t.isForwardRef=function(e){return g(e)===h},t.isFragment=function(e){return g(e)===i},t.isLazy=function(e){return g(e)===v},t.isMemo=function(e){return g(e)===m},t.isPortal=function(e){return g(e)===a},t.isProfiler=function(e){return g(e)===u},t.isStrictMode=function(e){return g(e)===s},t.isSuspense=function(e){return g(e)===d}},function(e,t,n){\"use strict\";function r(e,t,n,r,o){}r.resetWarningCache=function(){0},e.exports=r},function(e,t,n){\"use strict\";e.exports=\"15.7.0\"},function(e,t,n){\"use strict\";var r=n(383).Component,o=n(133).isValidElement,a=n(384),i=n(625);e.exports=i(r,o,a)},function(e,t,n){\"use strict\";var r=n(38),o={};function a(e,t,n,r,o,a,i,s){if(!e){var u;if(void 0===t)u=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[n,r,o,a,i,s],l=0;(u=new Error(t.replace(/%s/g,(function(){return c[l++]})))).name=\"Invariant Violation\"}throw u.framesToPop=1,u}}var i=\"mixins\";e.exports=function(e,t,n){var s=[],u={mixins:\"DEFINE_MANY\",statics:\"DEFINE_MANY\",propTypes:\"DEFINE_MANY\",contextTypes:\"DEFINE_MANY\",childContextTypes:\"DEFINE_MANY\",getDefaultProps:\"DEFINE_MANY_MERGED\",getInitialState:\"DEFINE_MANY_MERGED\",getChildContext:\"DEFINE_MANY_MERGED\",render:\"DEFINE_ONCE\",componentWillMount:\"DEFINE_MANY\",componentDidMount:\"DEFINE_MANY\",componentWillReceiveProps:\"DEFINE_MANY\",shouldComponentUpdate:\"DEFINE_ONCE\",componentWillUpdate:\"DEFINE_MANY\",componentDidUpdate:\"DEFINE_MANY\",componentWillUnmount:\"DEFINE_MANY\",UNSAFE_componentWillMount:\"DEFINE_MANY\",UNSAFE_componentWillReceiveProps:\"DEFINE_MANY\",UNSAFE_componentWillUpdate:\"DEFINE_MANY\",updateComponent:\"OVERRIDE_BASE\"},c={getDerivedStateFromProps:\"DEFINE_MANY_MERGED\"},l={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)f(e,t[n])},childContextTypes:function(e,t){e.childContextTypes=r({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=r({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=d(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=r({},e.propTypes,t)},statics:function(e,t){!function(e,t){if(!t)return;for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){if(a(!(n in l),'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it as an instance property instead; it will still be accessible on the constructor.',n),n in e)return a(\"DEFINE_MANY_MERGED\"===(c.hasOwnProperty(n)?c[n]:null),\"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",n),void(e[n]=d(e[n],r));e[n]=r}}}(e,t)},autobind:function(){}};function p(e,t){var n=u.hasOwnProperty(t)?u[t]:null;b.hasOwnProperty(t)&&a(\"OVERRIDE_BASE\"===n,\"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.\",t),e&&a(\"DEFINE_MANY\"===n||\"DEFINE_MANY_MERGED\"===n,\"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",t)}function f(e,n){if(n){a(\"function\"!=typeof n,\"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object.\"),a(!t(n),\"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.\");var r=e.prototype,o=r.__reactAutoBindPairs;for(var s in n.hasOwnProperty(i)&&l.mixins(e,n.mixins),n)if(n.hasOwnProperty(s)&&s!==i){var c=n[s],f=r.hasOwnProperty(s);if(p(f,s),l.hasOwnProperty(s))l[s](e,c);else{var h=u.hasOwnProperty(s);if(\"function\"==typeof c&&!h&&!f&&!1!==n.autobind)o.push(s,c),r[s]=c;else if(f){var v=u[s];a(h&&(\"DEFINE_MANY_MERGED\"===v||\"DEFINE_MANY\"===v),\"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.\",v,s),\"DEFINE_MANY_MERGED\"===v?r[s]=d(r[s],c):\"DEFINE_MANY\"===v&&(r[s]=m(r[s],c))}else r[s]=c}}}else;}function h(e,t){for(var n in a(e&&t&&\"object\"==typeof e&&\"object\"==typeof t,\"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.\"),t)t.hasOwnProperty(n)&&(a(void 0===e[n],\"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.\",n),e[n]=t[n]);return e}function d(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return h(o,n),h(o,r),o}}function m(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function v(e,t){return t.bind(e)}var g={componentDidMount:function(){this.__isMounted=!0}},y={componentWillUnmount:function(){this.__isMounted=!1}},b={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e,t)},isMounted:function(){return!!this.__isMounted}},_=function(){};return r(_.prototype,e.prototype,b),function(e){var t=function(e,r,i){this.__reactAutoBindPairs.length&&function(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var r=t[n],o=t[n+1];e[r]=v(e,o)}}(this),this.props=e,this.context=r,this.refs=o,this.updater=i||n,this.state=null;var s=this.getInitialState?this.getInitialState():null;a(\"object\"==typeof s&&!Array.isArray(s),\"%s.getInitialState(): must return an object or null\",t.displayName||\"ReactCompositeComponent\"),this.state=s};for(var r in t.prototype=new _,t.prototype.constructor=t,t.prototype.__reactAutoBindPairs=[],s.forEach(f.bind(null,t)),f(t,g),f(t,e),f(t,y),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),a(t.prototype.render,\"createClass(...): Class specification must implement a `render` method.\"),u)t.prototype[r]||(t.prototype[r]=null);return t}}},function(e,t,n){\"use strict\";var r=n(158),o=n(133);n(25);e.exports=function(e){return o.isValidElement(e)||r(\"143\"),e}},function(e,t){e.exports=function(e){if(!e.webpackPolyfill){var t=Object.create(e);t.children||(t.children=[]),Object.defineProperty(t,\"loaded\",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,\"id\",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,\"exports\",{enumerable:!0}),t.webpackPolyfill=1}return t}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r,o=n(1),a=(r=o)&&r.__esModule?r:{default:r},i=n(629);t.default=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:a.default.Map,n=Object.keys(e);return function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t(),o=arguments[1];return r.withMutations((function(t){n.forEach((function(n){var r=(0,e[n])(t.get(n),o);(0,i.validateNextState)(r,n,o),t.set(n,r)}))}))}},e.exports=t.default},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.validateNextState=t.getUnexpectedInvocationParameterMessage=t.getStateName=void 0;var r=i(n(390)),o=i(n(630)),a=i(n(631));function i(e){return e&&e.__esModule?e:{default:e}}t.getStateName=r.default,t.getUnexpectedInvocationParameterMessage=o.default,t.validateNextState=a.default},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=a(n(1)),o=a(n(390));function a(e){return e&&e.__esModule?e:{default:e}}t.default=function(e,t,n){var a=Object.keys(t);if(!a.length)return\"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.\";var i=(0,o.default)(n);if(!r.default.Iterable.isIterable(e))return\"The \"+i+' is of unexpected type. Expected argument to be an instance of Immutable.Iterable with the following properties: \"'+a.join('\", \"')+'\".';var s=e.keySeq().toArray().filter((function(e){return!t.hasOwnProperty(e)}));return s.length>0?\"Unexpected \"+(1===s.length?\"property\":\"properties\")+' \"'+s.join('\", \"')+'\" found in '+i+'. Expected to find one of the known reducer property names instead: \"'+a.join('\", \"')+'\". Unexpected properties will be ignored.':null},e.exports=t.default},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e,t,n){if(void 0===e)throw new Error('Reducer \"'+t+'\" returned undefined when handling \"'+n.type+'\" action. To ignore an action, you must explicitly return the previous state.')},e.exports=t.default},function(e,t,n){var r=n(242),o=n(391);e.exports=function(e){if(r(e))return o(e)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(382);e.exports=r},function(e,t,n){n(87),n(130);var r=n(159);e.exports=r},function(e,t,n){var r=n(394);e.exports=r},function(e,t,n){var r=n(21),o=n(395);r({target:\"Array\",stat:!0,forced:!n(398)((function(e){Array.from(e)}))},{from:o})},function(e,t,n){var r=n(52),o=n(396);e.exports=function(e,t,n,a){try{return a?t(r(n)[0],n[1]):t(n)}catch(t){throw o(e),t}}},function(e,t,n){e.exports=n(639)},function(e,t,n){var r=n(381);e.exports=r},function(e,t){e.exports=function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(175),o=n(243);e.exports=function(e,t){var n=null==e?null:void 0!==r&&o(e)||e[\"@@iterator\"];if(null!=n){var a,i,s=[],u=!0,c=!1;try{for(n=n.call(e);!(u=(a=n.next()).done)&&(s.push(a.value),!t||s.length!==t);u=!0);}catch(e){c=!0,i=e}finally{try{u||null==n.return||n.return()}finally{if(c)throw i}}return s}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){n(87);var r=n(643),o=n(99),a=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.entries;return e===a||e instanceof Array&&t===a.entries||i.hasOwnProperty(o(e))?r:t}},function(e,t,n){var r=n(644);e.exports=r},function(e,t,n){n(157);var r=n(42);e.exports=r(\"Array\").entries},function(e,t,n){var r=n(646);e.exports=r},function(e,t,n){n(647);var r=n(42);e.exports=r(\"Array\").forEach},function(e,t,n){\"use strict\";var r=n(21),o=n(648);r({target:\"Array\",proto:!0,forced:[].forEach!=o},{forEach:o})},function(e,t,n){\"use strict\";var r=n(86).forEach,o=n(111)(\"forEach\");e.exports=o?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},function(e,t,n){var r=n(650);e.exports=r},function(e,t,n){var r=n(651),o=Array.prototype;e.exports=function(e){var t=e.sort;return e===o||e instanceof Array&&t===o.sort?r:t}},function(e,t,n){n(652);var r=n(42);e.exports=r(\"Array\").sort},function(e,t,n){\"use strict\";var r=n(21),o=n(77),a=n(60),i=n(69),s=n(37),u=n(653),c=n(111),l=n(654),p=n(655),f=n(129),h=n(656),d=[],m=d.sort,v=s((function(){d.sort(void 0)})),g=s((function(){d.sort(null)})),y=c(\"sort\"),b=!s((function(){if(f)return f<70;if(!(l&&l>3)){if(p)return!0;if(h)return h<603;var e,t,n,r,o=\"\";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)d.push({k:t+r,v:n})}for(d.sort((function(e,t){return t.v-e.v})),r=0;r<d.length;r++)t=d[r].k.charAt(0),o.charAt(o.length-1)!==t&&(o+=t);return\"DGBEFHACIJK\"!==o}}));r({target:\"Array\",proto:!0,forced:v||!g||!y||!b},{sort:function(e){void 0!==e&&o(e);var t=a(this);if(b)return void 0===e?m.call(t):m.call(t,e);var n,r,s=[],c=i(t.length);for(r=0;r<c;r++)r in t&&s.push(t[r]);for(n=(s=u(s,function(e){return function(t,n){return void 0===n?-1:void 0===t?1:void 0!==e?+e(t,n)||0:String(t)>String(n)?1:-1}}(e))).length,r=0;r<n;)t[r]=s[r++];for(;r<c;)delete t[r++];return t}})},function(e,t){var n=Math.floor,r=function(e,t){var i=e.length,s=n(i/2);return i<8?o(e,t):a(r(e.slice(0,s),t),r(e.slice(s),t),t)},o=function(e,t){for(var n,r,o=e.length,a=1;a<o;){for(r=a,n=e[a];r&&t(e[r-1],n)>0;)e[r]=e[--r];r!==a++&&(e[r]=n)}return e},a=function(e,t,n){for(var r=e.length,o=t.length,a=0,i=0,s=[];a<r||i<o;)a<r&&i<o?s.push(n(e[a],t[i])<=0?e[a++]:t[i++]):s.push(a<r?e[a++]:t[i++]);return s};e.exports=r},function(e,t,n){var r=n(108).match(/firefox\\/(\\d+)/i);e.exports=!!r&&+r[1]},function(e,t,n){var r=n(108);e.exports=/MSIE|Trident/.test(r)},function(e,t,n){var r=n(108).match(/AppleWebKit\\/(\\d+)\\./);e.exports=!!r&&+r[1]},function(e,t,n){var r=n(658);e.exports=r},function(e,t,n){var r=n(659),o=Array.prototype;e.exports=function(e){var t=e.some;return e===o||e instanceof Array&&t===o.some?r:t}},function(e,t,n){n(660);var r=n(42);e.exports=r(\"Array\").some},function(e,t,n){\"use strict\";var r=n(21),o=n(86).some;r({target:\"Array\",proto:!0,forced:!n(111)(\"some\")},{some:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(662);e.exports=r},function(e,t,n){var r=n(663),o=n(665),a=Array.prototype,i=String.prototype;e.exports=function(e){var t=e.includes;return e===a||e instanceof Array&&t===a.includes?r:\"string\"==typeof e||e===i||e instanceof String&&t===i.includes?o:t}},function(e,t,n){n(664);var r=n(42);e.exports=r(\"Array\").includes},function(e,t,n){\"use strict\";var r=n(21),o=n(231).includes,a=n(239);r({target:\"Array\",proto:!0},{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),a(\"includes\")},function(e,t,n){n(666);var r=n(42);e.exports=r(\"String\").includes},function(e,t,n){\"use strict\";var r=n(21),o=n(402),a=n(106);r({target:\"String\",proto:!0,forced:!n(403)(\"includes\")},{includes:function(e){return!!~String(a(this)).indexOf(o(e),arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(47),o=n(151),a=n(41)(\"match\");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[a])?!!t:\"RegExp\"==o(e))}},function(e,t,n){var r=n(404);e.exports=r},function(e,t,n){n(670);var r=n(42);e.exports=r(\"Array\").indexOf},function(e,t,n){\"use strict\";var r=n(21),o=n(231).indexOf,a=n(111),i=[].indexOf,s=!!i&&1/[1].indexOf(1,-0)<0,u=a(\"indexOf\");r({target:\"Array\",proto:!0,forced:s||!u},{indexOf:function(e){return s?i.apply(this,arguments)||0:o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(672);e.exports=r},function(e,t,n){var r=n(673),o=Array.prototype;e.exports=function(e){var t=e.find;return e===o||e instanceof Array&&t===o.find?r:t}},function(e,t,n){n(674);var r=n(42);e.exports=r(\"Array\").find},function(e,t,n){\"use strict\";var r=n(21),o=n(86).find,a=n(239),i=\"find\",s=!0;i in[]&&Array(1).find((function(){s=!1})),r({target:\"Array\",proto:!0,forced:s},{find:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),a(i)},function(e,t,n){var r=n(676);e.exports=r},function(e,t,n){var r=n(677),o=String.prototype;e.exports=function(e){var t=e.startsWith;return\"string\"==typeof e||e===o||e instanceof String&&t===o.startsWith?r:t}},function(e,t,n){n(678);var r=n(42);e.exports=r(\"String\").startsWith},function(e,t,n){\"use strict\";var r,o=n(21),a=n(127).f,i=n(69),s=n(402),u=n(106),c=n(403),l=n(97),p=\"\".startsWith,f=Math.min,h=c(\"startsWith\");o({target:\"String\",proto:!0,forced:!!(l||h||(r=a(String.prototype,\"startsWith\"),!r||r.writable))&&!h},{startsWith:function(e){var t=String(u(this));s(e);var n=i(f(arguments.length>1?arguments[1]:void 0,t.length)),r=String(e);return p?p.call(t,r,n):t.slice(n,n+r.length)===r}})},function(e,t,n){var r=n(680);e.exports=r},function(e,t,n){var r=n(681),o=String.prototype;e.exports=function(e){var t=e.trim;return\"string\"==typeof e||e===o||e instanceof String&&t===o.trim?r:t}},function(e,t,n){n(682);var r=n(42);e.exports=r(\"String\").trim},function(e,t,n){\"use strict\";var r=n(21),o=n(683).trim;r({target:\"String\",proto:!0,forced:n(684)(\"trim\")},{trim:function(){return o(this)}})},function(e,t,n){var r=n(106),o=\"[\"+n(405)+\"]\",a=RegExp(\"^\"+o+o+\"*\"),i=RegExp(o+o+\"*$\"),s=function(e){return function(t){var n=String(r(t));return 1&e&&(n=n.replace(a,\"\")),2&e&&(n=n.replace(i,\"\")),n}};e.exports={start:s(1),end:s(2),trim:s(3)}},function(e,t,n){var r=n(37),o=n(405);e.exports=function(e){return r((function(){return!!o[e]()||\"​᠎\"!=\"​᠎\"[e]()||o[e].name!==e}))}},function(e,t,n){var r=n(92),o=n(284);e.exports=function(e){return o(r(e).toLowerCase())}},function(e,t,n){var r=n(134),o=Object.prototype,a=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=a.call(e,s),n=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=n:delete e[s]),o}},function(e,t){var n=Object.prototype.toString;e.exports=function(e){return n.call(e)}},function(e,t,n){var r=n(689),o=n(410),a=n(690),i=n(92);e.exports=function(e){return function(t){t=i(t);var n=o(t)?a(t):void 0,s=n?n[0]:t.charAt(0),u=n?r(n,1).join(\"\"):t.slice(1);return s[e]()+u}}},function(e,t,n){var r=n(409);e.exports=function(e,t,n){var o=e.length;return n=void 0===n?o:n,!t&&n>=o?e:r(e,t,n)}},function(e,t,n){var r=n(691),o=n(410),a=n(692);e.exports=function(e){return o(e)?a(e):r(e)}},function(e,t){e.exports=function(e){return e.split(\"\")}},function(e,t){var n=\"[\\\\ud800-\\\\udfff]\",r=\"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\",o=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",a=\"[^\\\\ud800-\\\\udfff]\",i=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",s=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",u=\"(?:\"+r+\"|\"+o+\")\"+\"?\",c=\"[\\\\ufe0e\\\\ufe0f]?\",l=c+u+(\"(?:\\\\u200d(?:\"+[a,i,s].join(\"|\")+\")\"+c+u+\")*\"),p=\"(?:\"+[a+r+\"?\",r,i,s,n].join(\"|\")+\")\",f=RegExp(o+\"(?=\"+o+\")|\"+p+l,\"g\");e.exports=function(e){return e.match(f)||[]}},function(e,t,n){var r=n(411),o=n(694),a=n(697),i=RegExp(\"['’]\",\"g\");e.exports=function(e){return function(t){return r(a(o(t).replace(i,\"\")),e,\"\")}}},function(e,t,n){var r=n(695),o=n(92),a=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,i=RegExp(\"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\",\"g\");e.exports=function(e){return(e=o(e))&&e.replace(a,r).replace(i,\"\")}},function(e,t,n){var r=n(696)({\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ã\":\"A\",\"Ä\":\"A\",\"Å\":\"A\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ã\":\"a\",\"ä\":\"a\",\"å\":\"a\",\"Ç\":\"C\",\"ç\":\"c\",\"Ð\":\"D\",\"ð\":\"d\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ë\":\"E\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ë\":\"e\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ï\":\"I\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ï\":\"i\",\"Ñ\":\"N\",\"ñ\":\"n\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Õ\":\"O\",\"Ö\":\"O\",\"Ø\":\"O\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"õ\":\"o\",\"ö\":\"o\",\"ø\":\"o\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ü\":\"U\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ü\":\"u\",\"Ý\":\"Y\",\"ý\":\"y\",\"ÿ\":\"y\",\"Æ\":\"Ae\",\"æ\":\"ae\",\"Þ\":\"Th\",\"þ\":\"th\",\"ß\":\"ss\",\"Ā\":\"A\",\"Ă\":\"A\",\"Ą\":\"A\",\"ā\":\"a\",\"ă\":\"a\",\"ą\":\"a\",\"Ć\":\"C\",\"Ĉ\":\"C\",\"Ċ\":\"C\",\"Č\":\"C\",\"ć\":\"c\",\"ĉ\":\"c\",\"ċ\":\"c\",\"č\":\"c\",\"Ď\":\"D\",\"Đ\":\"D\",\"ď\":\"d\",\"đ\":\"d\",\"Ē\":\"E\",\"Ĕ\":\"E\",\"Ė\":\"E\",\"Ę\":\"E\",\"Ě\":\"E\",\"ē\":\"e\",\"ĕ\":\"e\",\"ė\":\"e\",\"ę\":\"e\",\"ě\":\"e\",\"Ĝ\":\"G\",\"Ğ\":\"G\",\"Ġ\":\"G\",\"Ģ\":\"G\",\"ĝ\":\"g\",\"ğ\":\"g\",\"ġ\":\"g\",\"ģ\":\"g\",\"Ĥ\":\"H\",\"Ħ\":\"H\",\"ĥ\":\"h\",\"ħ\":\"h\",\"Ĩ\":\"I\",\"Ī\":\"I\",\"Ĭ\":\"I\",\"Į\":\"I\",\"İ\":\"I\",\"ĩ\":\"i\",\"ī\":\"i\",\"ĭ\":\"i\",\"į\":\"i\",\"ı\":\"i\",\"Ĵ\":\"J\",\"ĵ\":\"j\",\"Ķ\":\"K\",\"ķ\":\"k\",\"ĸ\":\"k\",\"Ĺ\":\"L\",\"Ļ\":\"L\",\"Ľ\":\"L\",\"Ŀ\":\"L\",\"Ł\":\"L\",\"ĺ\":\"l\",\"ļ\":\"l\",\"ľ\":\"l\",\"ŀ\":\"l\",\"ł\":\"l\",\"Ń\":\"N\",\"Ņ\":\"N\",\"Ň\":\"N\",\"Ŋ\":\"N\",\"ń\":\"n\",\"ņ\":\"n\",\"ň\":\"n\",\"ŋ\":\"n\",\"Ō\":\"O\",\"Ŏ\":\"O\",\"Ő\":\"O\",\"ō\":\"o\",\"ŏ\":\"o\",\"ő\":\"o\",\"Ŕ\":\"R\",\"Ŗ\":\"R\",\"Ř\":\"R\",\"ŕ\":\"r\",\"ŗ\":\"r\",\"ř\":\"r\",\"Ś\":\"S\",\"Ŝ\":\"S\",\"Ş\":\"S\",\"Š\":\"S\",\"ś\":\"s\",\"ŝ\":\"s\",\"ş\":\"s\",\"š\":\"s\",\"Ţ\":\"T\",\"Ť\":\"T\",\"Ŧ\":\"T\",\"ţ\":\"t\",\"ť\":\"t\",\"ŧ\":\"t\",\"Ũ\":\"U\",\"Ū\":\"U\",\"Ŭ\":\"U\",\"Ů\":\"U\",\"Ű\":\"U\",\"Ų\":\"U\",\"ũ\":\"u\",\"ū\":\"u\",\"ŭ\":\"u\",\"ů\":\"u\",\"ű\":\"u\",\"ų\":\"u\",\"Ŵ\":\"W\",\"ŵ\":\"w\",\"Ŷ\":\"Y\",\"ŷ\":\"y\",\"Ÿ\":\"Y\",\"Ź\":\"Z\",\"Ż\":\"Z\",\"Ž\":\"Z\",\"ź\":\"z\",\"ż\":\"z\",\"ž\":\"z\",\"Ĳ\":\"IJ\",\"ĳ\":\"ij\",\"Œ\":\"Oe\",\"œ\":\"oe\",\"ŉ\":\"'n\",\"ſ\":\"s\"});e.exports=r},function(e,t){e.exports=function(e){return function(t){return null==e?void 0:e[t]}}},function(e,t,n){var r=n(698),o=n(699),a=n(92),i=n(700);e.exports=function(e,t,n){return e=a(e),void 0===(t=n?void 0:t)?o(e)?i(e):r(e):e.match(t)||[]}},function(e,t){var n=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;e.exports=function(e){return e.match(n)||[]}},function(e,t){var n=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;e.exports=function(e){return n.test(e)}},function(e,t){var n=\"\\\\u2700-\\\\u27bf\",r=\"a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\",o=\"A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\",a=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",i=\"[\"+a+\"]\",s=\"\\\\d+\",u=\"[\\\\u2700-\\\\u27bf]\",c=\"[\"+r+\"]\",l=\"[^\\\\ud800-\\\\udfff\"+a+s+n+r+o+\"]\",p=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",f=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",h=\"[\"+o+\"]\",d=\"(?:\"+c+\"|\"+l+\")\",m=\"(?:\"+h+\"|\"+l+\")\",v=\"(?:['’](?:d|ll|m|re|s|t|ve))?\",g=\"(?:['’](?:D|LL|M|RE|S|T|VE))?\",y=\"(?:[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]|\\\\ud83c[\\\\udffb-\\\\udfff])?\",b=\"[\\\\ufe0e\\\\ufe0f]?\",_=b+y+(\"(?:\\\\u200d(?:\"+[\"[^\\\\ud800-\\\\udfff]\",p,f].join(\"|\")+\")\"+b+y+\")*\"),w=\"(?:\"+[u,p,f].join(\"|\")+\")\"+_,x=RegExp([h+\"?\"+c+\"+\"+v+\"(?=\"+[i,h,\"$\"].join(\"|\")+\")\",m+\"+\"+g+\"(?=\"+[i,h+d,\"$\"].join(\"|\")+\")\",h+\"?\"+d+\"+\"+v,h+\"+\"+g,\"\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\",\"\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\",s,w].join(\"|\"),\"g\");e.exports=function(e){return e.match(x)||[]}},function(e,t,n){var r=n(702),o=n(188),a=n(245);e.exports=function(){this.size=0,this.__data__={hash:new r,map:new(a||o),string:new r}}},function(e,t,n){var r=n(703),o=n(708),a=n(709),i=n(710),s=n(711);function u(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}u.prototype.clear=r,u.prototype.delete=o,u.prototype.get=a,u.prototype.has=i,u.prototype.set=s,e.exports=u},function(e,t,n){var r=n(187);e.exports=function(){this.__data__=r?r(null):{},this.size=0}},function(e,t,n){var r=n(124),o=n(705),a=n(57),i=n(412),s=/^\\[object .+?Constructor\\]$/,u=Function.prototype,c=Object.prototype,l=u.toString,p=c.hasOwnProperty,f=RegExp(\"^\"+l.call(p).replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");e.exports=function(e){return!(!a(e)||o(e))&&(r(e)?f:s).test(i(e))}},function(e,t,n){var r,o=n(706),a=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||\"\"))?\"Symbol(src)_1.\"+r:\"\";e.exports=function(e){return!!a&&a in e}},function(e,t,n){var r=n(71)[\"__core-js_shared__\"];e.exports=r},function(e,t){e.exports=function(e,t){return null==e?void 0:e[t]}},function(e,t){e.exports=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},function(e,t,n){var r=n(187),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;if(r){var n=t[e];return\"__lodash_hash_undefined__\"===n?void 0:n}return o.call(t,e)?t[e]:void 0}},function(e,t,n){var r=n(187),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;return r?void 0!==t[e]:o.call(t,e)}},function(e,t,n){var r=n(187);e.exports=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=r&&void 0===t?\"__lodash_hash_undefined__\":t,this}},function(e,t){e.exports=function(){this.__data__=[],this.size=0}},function(e,t,n){var r=n(189),o=Array.prototype.splice;e.exports=function(e){var t=this.__data__,n=r(t,e);return!(n<0)&&(n==t.length-1?t.pop():o.call(t,n,1),--this.size,!0)}},function(e,t,n){var r=n(189);e.exports=function(e){var t=this.__data__,n=r(t,e);return n<0?void 0:t[n][1]}},function(e,t,n){var r=n(189);e.exports=function(e){return r(this.__data__,e)>-1}},function(e,t,n){var r=n(189);e.exports=function(e,t){var n=this.__data__,o=r(n,e);return o<0?(++this.size,n.push([e,t])):n[o][1]=t,this}},function(e,t,n){var r=n(190);e.exports=function(e){var t=r(this,e).delete(e);return this.size-=t?1:0,t}},function(e,t){e.exports=function(e){var t=typeof e;return\"string\"==t||\"number\"==t||\"symbol\"==t||\"boolean\"==t?\"__proto__\"!==e:null===e}},function(e,t,n){var r=n(190);e.exports=function(e){return r(this,e).get(e)}},function(e,t,n){var r=n(190);e.exports=function(e){return r(this,e).has(e)}},function(e,t,n){var r=n(190);e.exports=function(e,t){var n=r(this,e),o=n.size;return n.set(e,t),this.size+=n.size==o?0:1,this}},function(e,t,n){var r=n(191),o=n(115),a=n(114);e.exports=function(e){return function(t,n,i){var s=Object(t);if(!o(t)){var u=r(n,3);t=a(t),n=function(e){return u(s[e],e,s)}}var c=e(t,n,i);return c>-1?s[u?t[c]:c]:void 0}}},function(e,t,n){var r=n(724),o=n(749),a=n(424);e.exports=function(e){var t=o(e);return 1==t.length&&t[0][2]?a(t[0][0],t[0][1]):function(n){return n===e||r(n,e,t)}}},function(e,t,n){var r=n(246),o=n(413);e.exports=function(e,t,n,a){var i=n.length,s=i,u=!a;if(null==e)return!s;for(e=Object(e);i--;){var c=n[i];if(u&&c[2]?c[1]!==e[c[0]]:!(c[0]in e))return!1}for(;++i<s;){var l=(c=n[i])[0],p=e[l],f=c[1];if(u&&c[2]){if(void 0===p&&!(l in e))return!1}else{var h=new r;if(a)var d=a(p,f,l,e,t,h);if(!(void 0===d?o(f,p,3,a,h):d))return!1}}return!0}},function(e,t,n){var r=n(188);e.exports=function(){this.__data__=new r,this.size=0}},function(e,t){e.exports=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}},function(e,t){e.exports=function(e){return this.__data__.get(e)}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t,n){var r=n(188),o=n(245),a=n(244);e.exports=function(e,t){var n=this.__data__;if(n instanceof r){var i=n.__data__;if(!o||i.length<199)return i.push([e,t]),this.size=++n.size,this;n=this.__data__=new a(i)}return n.set(e,t),this.size=n.size,this}},function(e,t,n){var r=n(246),o=n(414),a=n(735),i=n(738),s=n(161),u=n(50),c=n(193),l=n(249),p=\"[object Arguments]\",f=\"[object Array]\",h=\"[object Object]\",d=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,m,v,g){var y=u(e),b=u(t),_=y?f:s(e),w=b?f:s(t),x=(_=_==p?h:_)==h,E=(w=w==p?h:w)==h,S=_==w;if(S&&c(e)){if(!c(t))return!1;y=!0,x=!1}if(S&&!x)return g||(g=new r),y||l(e)?o(e,t,n,m,v,g):a(e,t,_,n,m,v,g);if(!(1&n)){var C=x&&d.call(e,\"__wrapped__\"),A=E&&d.call(t,\"__wrapped__\");if(C||A){var k=C?e.value():e,O=A?t.value():t;return g||(g=new r),v(k,O,n,m,g)}}return!!S&&(g||(g=new r),i(e,t,n,m,v,g))}},function(e,t,n){var r=n(244),o=n(732),a=n(733);function i(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new r;++t<n;)this.add(e[t])}i.prototype.add=i.prototype.push=o,i.prototype.has=a,e.exports=i},function(e,t){e.exports=function(e){return this.__data__.set(e,\"__lodash_hash_undefined__\"),this}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t){e.exports=function(e,t){return e.has(t)}},function(e,t,n){var r=n(134),o=n(416),a=n(123),i=n(414),s=n(736),u=n(737),c=r?r.prototype:void 0,l=c?c.valueOf:void 0;e.exports=function(e,t,n,r,c,p,f){switch(n){case\"[object DataView]\":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case\"[object ArrayBuffer]\":return!(e.byteLength!=t.byteLength||!p(new o(e),new o(t)));case\"[object Boolean]\":case\"[object Date]\":case\"[object Number]\":return a(+e,+t);case\"[object Error]\":return e.name==t.name&&e.message==t.message;case\"[object RegExp]\":case\"[object String]\":return e==t+\"\";case\"[object Map]\":var h=s;case\"[object Set]\":var d=1&r;if(h||(h=u),e.size!=t.size&&!d)return!1;var m=f.get(e);if(m)return m==t;r|=2,f.set(e,t);var v=i(h(e),h(t),r,c,p,f);return f.delete(e),v;case\"[object Symbol]\":if(l)return l.call(e)==l.call(t)}return!1}},function(e,t){e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e,r){n[++t]=[r,e]})),n}},function(e,t){e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e){n[++t]=e})),n}},function(e,t,n){var r=n(417),o=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,a,i,s){var u=1&n,c=r(e),l=c.length;if(l!=r(t).length&&!u)return!1;for(var p=l;p--;){var f=c[p];if(!(u?f in t:o.call(t,f)))return!1}var h=s.get(e),d=s.get(t);if(h&&d)return h==t&&d==e;var m=!0;s.set(e,t),s.set(t,e);for(var v=u;++p<l;){var g=e[f=c[p]],y=t[f];if(a)var b=u?a(y,g,f,t,e,s):a(g,y,f,e,t,s);if(!(void 0===b?g===y||i(g,y,n,a,s):b)){m=!1;break}v||(v=\"constructor\"==f)}if(m&&!v){var _=e.constructor,w=t.constructor;_==w||!(\"constructor\"in e)||!(\"constructor\"in t)||\"function\"==typeof _&&_ instanceof _&&\"function\"==typeof w&&w instanceof w||(m=!1)}return s.delete(e),s.delete(t),m}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,a=[];++n<r;){var i=e[n];t(i,n,e)&&(a[o++]=i)}return a}},function(e,t){e.exports=function(e,t){for(var n=-1,r=Array(e);++n<e;)r[n]=t(n);return r}},function(e,t,n){var r=n(112),o=n(89);e.exports=function(e){return o(e)&&\"[object Arguments]\"==r(e)}},function(e,t){e.exports=function(){return!1}},function(e,t,n){var r=n(112),o=n(250),a=n(89),i={};i[\"[object Float32Array]\"]=i[\"[object Float64Array]\"]=i[\"[object Int8Array]\"]=i[\"[object Int16Array]\"]=i[\"[object Int32Array]\"]=i[\"[object Uint8Array]\"]=i[\"[object Uint8ClampedArray]\"]=i[\"[object Uint16Array]\"]=i[\"[object Uint32Array]\"]=!0,i[\"[object Arguments]\"]=i[\"[object Array]\"]=i[\"[object ArrayBuffer]\"]=i[\"[object Boolean]\"]=i[\"[object DataView]\"]=i[\"[object Date]\"]=i[\"[object Error]\"]=i[\"[object Function]\"]=i[\"[object Map]\"]=i[\"[object Number]\"]=i[\"[object Object]\"]=i[\"[object RegExp]\"]=i[\"[object Set]\"]=i[\"[object String]\"]=i[\"[object WeakMap]\"]=!1,e.exports=function(e){return a(e)&&o(e.length)&&!!i[r(e)]}},function(e,t,n){var r=n(422)(Object.keys,Object);e.exports=r},function(e,t,n){var r=n(113)(n(71),\"DataView\");e.exports=r},function(e,t,n){var r=n(113)(n(71),\"Promise\");e.exports=r},function(e,t,n){var r=n(113)(n(71),\"Set\");e.exports=r},function(e,t,n){var r=n(113)(n(71),\"WeakMap\");e.exports=r},function(e,t,n){var r=n(423),o=n(114);e.exports=function(e){for(var t=o(e),n=t.length;n--;){var a=t[n],i=e[a];t[n]=[a,i,r(i)]}return t}},function(e,t,n){var r=n(413),o=n(43),a=n(425),i=n(253),s=n(423),u=n(424),c=n(136);e.exports=function(e,t){return i(e)&&s(t)?u(c(e),t):function(n){var i=o(n,e);return void 0===i&&i===t?a(n,e):r(t,i,3)}}},function(e,t,n){var r=n(752),o=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,a=/\\\\(\\\\)?/g,i=r((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(\"\"),e.replace(o,(function(e,n,r,o){t.push(r?o.replace(a,\"$1\"):n||e)})),t}));e.exports=i},function(e,t,n){var r=n(285);e.exports=function(e){var t=r(e,(function(e){return 500===n.size&&n.clear(),e})),n=t.cache;return t}},function(e,t){e.exports=function(e,t){return null!=e&&t in Object(e)}},function(e,t,n){var r=n(135),o=n(192),a=n(50),i=n(195),s=n(250),u=n(136);e.exports=function(e,t,n){for(var c=-1,l=(t=r(t,e)).length,p=!1;++c<l;){var f=u(t[c]);if(!(p=null!=e&&n(e,f)))break;e=e[f]}return p||++c!=l?p:!!(l=null==e?0:e.length)&&s(l)&&i(f,l)&&(a(e)||o(e))}},function(e,t,n){var r=n(756),o=n(757),a=n(253),i=n(136);e.exports=function(e){return a(e)?r(i(e)):o(e)}},function(e,t){e.exports=function(e){return function(t){return null==t?void 0:t[e]}}},function(e,t,n){var r=n(196);e.exports=function(e){return function(t){return r(t,e)}}},function(e,t,n){var r=n(759),o=n(191),a=n(426),i=Math.max;e.exports=function(e,t,n){var s=null==e?0:e.length;if(!s)return-1;var u=null==n?0:a(n);return u<0&&(u=i(s+u,0)),r(e,o(t,3),u)}},function(e,t){e.exports=function(e,t,n,r){for(var o=e.length,a=n+(r?1:-1);r?a--:++a<o;)if(t(e[a],a,e))return a;return-1}},function(e,t,n){var r=n(427),o=1/0;e.exports=function(e){return e?(e=r(e))===o||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},function(e,t,n){var r=n(762),o=/^\\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(o,\"\"):e}},function(e,t){var n=/\\s/;e.exports=function(e){for(var t=e.length;t--&&n.test(e.charAt(t)););return t}},function(e,t,n){var r=n(428);e.exports=function(e,t){var n;return r(e,(function(e,r,o){return!(n=t(e,r,o))})),!!n}},function(e,t,n){var r=n(765),o=n(114);e.exports=function(e,t){return e&&r(e,t,o)}},function(e,t,n){var r=n(766)();e.exports=r},function(e,t){e.exports=function(e){return function(t,n,r){for(var o=-1,a=Object(t),i=r(t),s=i.length;s--;){var u=i[e?s:++o];if(!1===n(a[u],u,a))break}return t}}},function(e,t,n){var r=n(115);e.exports=function(e,t){return function(n,o){if(null==n)return n;if(!r(n))return e(n,o);for(var a=n.length,i=t?a:-1,s=Object(n);(t?i--:++i<a)&&!1!==o(s[i],i,s););return n}}},function(e,t){var n={\"&\":\"&amp;\",'\"':\"&quot;\",\"'\":\"&apos;\",\"<\":\"&lt;\",\">\":\"&gt;\"};e.exports=function(e){return e&&e.replace?e.replace(/([&\"<>'])/g,(function(e,t){return n[t]})):e}},function(e,t,n){e.exports=o;var r=n(255).EventEmitter;function o(){r.call(this)}n(61)(o,r),o.Readable=n(256),o.Writable=n(776),o.Duplex=n(777),o.Transform=n(778),o.PassThrough=n(779),o.Stream=o,o.prototype.pipe=function(e,t){var n=this;function o(t){e.writable&&!1===e.write(t)&&n.pause&&n.pause()}function a(){n.readable&&n.resume&&n.resume()}n.on(\"data\",o),e.on(\"drain\",a),e._isStdio||t&&!1===t.end||(n.on(\"end\",s),n.on(\"close\",u));var i=!1;function s(){i||(i=!0,e.end())}function u(){i||(i=!0,\"function\"==typeof e.destroy&&e.destroy())}function c(e){if(l(),0===r.listenerCount(this,\"error\"))throw e}function l(){n.removeListener(\"data\",o),e.removeListener(\"drain\",a),n.removeListener(\"end\",s),n.removeListener(\"close\",u),n.removeListener(\"error\",c),e.removeListener(\"error\",c),n.removeListener(\"end\",l),n.removeListener(\"close\",l),e.removeListener(\"close\",l)}return n.on(\"error\",c),e.on(\"error\",c),n.on(\"end\",l),n.on(\"close\",l),e.on(\"close\",l),e.emit(\"pipe\",n),e}},function(e,t){},function(e,t,n){\"use strict\";var r=n(62).Buffer,o=n(772);e.exports=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.head=null,this.tail=null,this.length=0}return e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return\"\";for(var t=this.head,n=\"\"+t.data;t=t.next;)n+=e+t.data;return n},e.prototype.concat=function(e){if(0===this.length)return r.alloc(0);if(1===this.length)return this.head.data;for(var t,n,o,a=r.allocUnsafe(e>>>0),i=this.head,s=0;i;)t=i.data,n=a,o=s,t.copy(n,o),s+=i.data.length,i=i.next;return a},e}(),o&&o.inspect&&o.inspect.custom&&(e.exports.prototype[o.inspect.custom]=function(){var e=o.inspect({length:this.length});return this.constructor.name+\" \"+e})},function(e,t){},function(e,t,n){(function(e,t){!function(e,n){\"use strict\";if(!e.setImmediate){var r,o,a,i,s,u=1,c={},l=!1,p=e.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(e);f=f&&f.setTimeout?f:e,\"[object process]\"==={}.toString.call(e.process)?r=function(e){t.nextTick((function(){d(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage(\"\",\"*\"),e.onmessage=n,t}}()?e.MessageChannel?((a=new MessageChannel).port1.onmessage=function(e){d(e.data)},r=function(e){a.port2.postMessage(e)}):p&&\"onreadystatechange\"in p.createElement(\"script\")?(o=p.documentElement,r=function(e){var t=p.createElement(\"script\");t.onreadystatechange=function(){d(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):r=function(e){setTimeout(d,0,e)}:(i=\"setImmediate$\"+Math.random()+\"$\",s=function(t){t.source===e&&\"string\"==typeof t.data&&0===t.data.indexOf(i)&&d(+t.data.slice(i.length))},e.addEventListener?e.addEventListener(\"message\",s,!1):e.attachEvent(\"onmessage\",s),r=function(t){e.postMessage(i+t,\"*\")}),f.setImmediate=function(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),n=0;n<t.length;n++)t[n]=arguments[n+1];var o={callback:e,args:t};return c[u]=o,r(u),u++},f.clearImmediate=h}function h(e){delete c[e]}function d(e){if(l)setTimeout(d,0,e);else{var t=c[e];if(t){l=!0;try{!function(e){var t=e.callback,n=e.args;switch(n.length){case 0:t();break;case 1:t(n[0]);break;case 2:t(n[0],n[1]);break;case 3:t(n[0],n[1],n[2]);break;default:t.apply(void 0,n)}}(t)}finally{h(e),l=!1}}}}}(\"undefined\"==typeof self?void 0===e?this:e:self)}).call(this,n(51),n(90))},function(e,t,n){(function(t){function n(e){try{if(!t.localStorage)return!1}catch(e){return!1}var n=t.localStorage[e];return null!=n&&\"true\"===String(n).toLowerCase()}e.exports=function(e,t){if(n(\"noDeprecation\"))return e;var r=!1;return function(){if(!r){if(n(\"throwDeprecation\"))throw new Error(t);n(\"traceDeprecation\")?console.trace(t):console.warn(t),r=!0}return e.apply(this,arguments)}}}).call(this,n(51))},function(e,t,n){\"use strict\";e.exports=a;var r=n(435),o=n(162);function a(e){if(!(this instanceof a))return new a(e);r.call(this,e)}o.inherits=n(61),o.inherits(a,r),a.prototype._transform=function(e,t,n){n(null,e)}},function(e,t,n){e.exports=n(257)},function(e,t,n){e.exports=n(116)},function(e,t,n){e.exports=n(256).Transform},function(e,t,n){e.exports=n(256).PassThrough},function(e,t,n){\"use strict\";e.exports=function(){}},function(e,t,n){\"use strict\";var r=n(782),o=Math.abs,a=Math.floor;e.exports=function(e){return isNaN(e)?0:0!==(e=Number(e))&&isFinite(e)?r(e)*a(o(e)):e}},function(e,t,n){\"use strict\";e.exports=n(783)()?Math.sign:n(784)},function(e,t,n){\"use strict\";e.exports=function(){var e=Math.sign;return\"function\"==typeof e&&(1===e(10)&&-1===e(-20))}},function(e,t,n){\"use strict\";e.exports=function(e){return e=Number(e),isNaN(e)||0===e?e:e>0?1:-1}},function(e,t,n){\"use strict\";var r=n(100),o=n(198),a=n(119),i=n(787),s=n(437);e.exports=function e(t){var n,u,c;if(r(t),(n=Object(arguments[1])).async&&n.promise)throw new Error(\"Options 'async' and 'promise' cannot be used together\");return hasOwnProperty.call(t,\"__memoized__\")&&!n.force?t:(u=s(n.length,t.length,n.async&&a.async),c=i(t,u,n),o(a,(function(e,t){n[t]&&e(n[t],c,n)})),e.__profiler__&&e.__profiler__(c),c.updateEnv(),c.memoized)}},function(e,t,n){\"use strict\";var r=n(100),o=n(137),a=Function.prototype.bind,i=Function.prototype.call,s=Object.keys,u=Object.prototype.propertyIsEnumerable;e.exports=function(e,t){return function(n,c){var l,p=arguments[2],f=arguments[3];return n=Object(o(n)),r(c),l=s(n),f&&l.sort(\"function\"==typeof f?a.call(f,n):void 0),\"function\"!=typeof e&&(e=l[e]),i.call(e,l,(function(e,r){return u.call(n,e)?i.call(c,p,n[e],e,n,r):t}))}}},function(e,t,n){\"use strict\";var r=n(788),o=n(439),a=n(120),i=n(802).methods,s=n(803),u=n(819),c=Function.prototype.apply,l=Function.prototype.call,p=Object.create,f=Object.defineProperties,h=i.on,d=i.emit;e.exports=function(e,t,n){var i,m,v,g,y,b,_,w,x,E,S,C,A,k,O,j=p(null);return m=!1!==t?t:isNaN(e.length)?1:e.length,n.normalizer&&(E=u(n.normalizer),v=E.get,g=E.set,y=E.delete,b=E.clear),null!=n.resolvers&&(O=s(n.resolvers)),k=v?o((function(t){var n,o,a=arguments;if(O&&(a=O(a)),null!==(n=v(a))&&hasOwnProperty.call(j,n))return S&&i.emit(\"get\",n,a,this),j[n];if(o=1===a.length?l.call(e,this,a[0]):c.call(e,this,a),null===n){if(null!==(n=v(a)))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");n=g(a)}else if(hasOwnProperty.call(j,n))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");return j[n]=o,C&&i.emit(\"set\",n,null,o),o}),m):0===t?function(){var t;if(hasOwnProperty.call(j,\"data\"))return S&&i.emit(\"get\",\"data\",arguments,this),j.data;if(t=arguments.length?c.call(e,this,arguments):l.call(e,this),hasOwnProperty.call(j,\"data\"))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");return j.data=t,C&&i.emit(\"set\",\"data\",null,t),t}:function(t){var n,o,a=arguments;if(O&&(a=O(arguments)),o=String(a[0]),hasOwnProperty.call(j,o))return S&&i.emit(\"get\",o,a,this),j[o];if(n=1===a.length?l.call(e,this,a[0]):c.call(e,this,a),hasOwnProperty.call(j,o))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");return j[o]=n,C&&i.emit(\"set\",o,null,n),n},i={original:e,memoized:k,profileName:n.profileName,get:function(e){return O&&(e=O(e)),v?v(e):String(e[0])},has:function(e){return hasOwnProperty.call(j,e)},delete:function(e){var t;hasOwnProperty.call(j,e)&&(y&&y(e),t=j[e],delete j[e],A&&i.emit(\"delete\",e,t))},clear:function(){var e=j;b&&b(),j=p(null),i.emit(\"clear\",e)},on:function(e,t){return\"get\"===e?S=!0:\"set\"===e?C=!0:\"delete\"===e&&(A=!0),h.call(this,e,t)},emit:d,updateEnv:function(){e=i.original}},_=v?o((function(e){var t,n=arguments;O&&(n=O(n)),null!==(t=v(n))&&i.delete(t)}),m):0===t?function(){return i.delete(\"data\")}:function(e){return O&&(e=O(arguments)[0]),i.delete(e)},w=o((function(){var e,n=arguments;return 0===t?j.data:(O&&(n=O(n)),e=v?v(n):String(n[0]),j[e])})),x=o((function(){var e,n=arguments;return 0===t?i.has(\"data\"):(O&&(n=O(n)),null!==(e=v?v(n):String(n[0]))&&i.has(e))})),f(k,{__memoized__:a(!0),delete:a(_),clear:a(i.clear),_get:a(w),_has:a(x)}),i}},function(e,t,n){\"use strict\";var r=n(438),o=n(794),a=n(117),i=Error.captureStackTrace;e.exports=function(t){var n=new Error(t),s=arguments[1],u=arguments[2];return a(u)||o(s)&&(u=s,s=null),a(u)&&r(n,u),a(s)&&(n.code=s),i&&i(n,e.exports),n}},function(e,t,n){\"use strict\";e.exports=function(){var e,t=Object.assign;return\"function\"==typeof t&&(t(e={foo:\"raz\"},{bar:\"dwa\"},{trzy:\"trzy\"}),e.foo+e.bar+e.trzy===\"razdwatrzy\")}},function(e,t,n){\"use strict\";var r=n(791),o=n(137),a=Math.max;e.exports=function(e,t){var n,i,s,u=a(arguments.length,2);for(e=Object(o(e)),s=function(r){try{e[r]=t[r]}catch(e){n||(n=e)}},i=1;i<u;++i)r(t=arguments[i]).forEach(s);if(void 0!==n)throw n;return e}},function(e,t,n){\"use strict\";e.exports=n(792)()?Object.keys:n(793)},function(e,t,n){\"use strict\";e.exports=function(){try{return Object.keys(\"primitive\"),!0}catch(e){return!1}}},function(e,t,n){\"use strict\";var r=n(117),o=Object.keys;e.exports=function(e){return o(r(e)?Object(e):e)}},function(e,t,n){\"use strict\";var r=n(117),o={function:!0,object:!0};e.exports=function(e){return r(e)&&o[typeof e]||!1}},function(e,t,n){\"use strict\";var r=n(796),o=/^\\s*class[\\s{/}]/,a=Function.prototype.toString;e.exports=function(e){return!!r(e)&&!o.test(a.call(e))}},function(e,t,n){\"use strict\";var r=n(797);e.exports=function(e){if(\"function\"!=typeof e)return!1;if(!hasOwnProperty.call(e,\"length\"))return!1;try{if(\"number\"!=typeof e.length)return!1;if(\"function\"!=typeof e.call)return!1;if(\"function\"!=typeof e.apply)return!1}catch(e){return!1}return!r(e)}},function(e,t,n){\"use strict\";var r=n(798);e.exports=function(e){if(!r(e))return!1;try{return!!e.constructor&&e.constructor.prototype===e}catch(e){return!1}}},function(e,t,n){\"use strict\";var r=n(441),o={object:!0,function:!0,undefined:!0};e.exports=function(e){return!!r(e)&&hasOwnProperty.call(o,typeof e)}},function(e,t,n){\"use strict\";e.exports=n(800)()?String.prototype.contains:n(801)},function(e,t,n){\"use strict\";var r=\"razdwatrzy\";e.exports=function(){return\"function\"==typeof r.contains&&(!0===r.contains(\"dwa\")&&!1===r.contains(\"foo\"))}},function(e,t,n){\"use strict\";var r=String.prototype.indexOf;e.exports=function(e){return r.call(this,e,arguments[1])>-1}},function(e,t,n){\"use strict\";var r,o,a,i,s,u,c,l=n(120),p=n(100),f=Function.prototype.apply,h=Function.prototype.call,d=Object.create,m=Object.defineProperty,v=Object.defineProperties,g=Object.prototype.hasOwnProperty,y={configurable:!0,enumerable:!1,writable:!0};o=function(e,t){var n,o;return p(t),o=this,r.call(this,e,n=function(){a.call(o,e,n),f.call(t,this,arguments)}),n.__eeOnceListener__=t,this},s={on:r=function(e,t){var n;return p(t),g.call(this,\"__ee__\")?n=this.__ee__:(n=y.value=d(null),m(this,\"__ee__\",y),y.value=null),n[e]?\"object\"==typeof n[e]?n[e].push(t):n[e]=[n[e],t]:n[e]=t,this},once:o,off:a=function(e,t){var n,r,o,a;if(p(t),!g.call(this,\"__ee__\"))return this;if(!(n=this.__ee__)[e])return this;if(\"object\"==typeof(r=n[e]))for(a=0;o=r[a];++a)o!==t&&o.__eeOnceListener__!==t||(2===r.length?n[e]=r[a?0:1]:r.splice(a,1));else r!==t&&r.__eeOnceListener__!==t||delete n[e];return this},emit:i=function(e){var t,n,r,o,a;if(g.call(this,\"__ee__\")&&(o=this.__ee__[e]))if(\"object\"==typeof o){for(n=arguments.length,a=new Array(n-1),t=1;t<n;++t)a[t-1]=arguments[t];for(o=o.slice(),t=0;r=o[t];++t)f.call(r,this,a)}else switch(arguments.length){case 1:h.call(o,this);break;case 2:h.call(o,this,arguments[1]);break;case 3:h.call(o,this,arguments[1],arguments[2]);break;default:for(n=arguments.length,a=new Array(n-1),t=1;t<n;++t)a[t-1]=arguments[t];f.call(o,this,a)}}},u={on:l(r),once:l(o),off:l(a),emit:l(i)},c=v({},u),e.exports=t=function(e){return null==e?d(c):v(Object(e),u)},t.methods=s},function(e,t,n){\"use strict\";var r,o=n(804),a=n(117),i=n(100),s=Array.prototype.slice;r=function(e){return this.map((function(t,n){return t?t(e[n]):e[n]})).concat(s.call(e,this.length))},e.exports=function(e){return(e=o(e)).forEach((function(e){a(e)&&i(e)})),r.bind(e)}},function(e,t,n){\"use strict\";var r=n(258),o=Array.isArray;e.exports=function(e){return o(e)?e:r(e)}},function(e,t,n){\"use strict\";e.exports=function(){var e,t,n=Array.from;return\"function\"==typeof n&&(t=n(e=[\"raz\",\"dwa\"]),Boolean(t&&t!==e&&\"dwa\"===t[1]))}},function(e,t,n){\"use strict\";var r=n(807).iterator,o=n(816),a=n(817),i=n(118),s=n(100),u=n(137),c=n(117),l=n(818),p=Array.isArray,f=Function.prototype.call,h={configurable:!0,enumerable:!0,writable:!0,value:null},d=Object.defineProperty;e.exports=function(e){var t,n,m,v,g,y,b,_,w,x,E=arguments[1],S=arguments[2];if(e=Object(u(e)),c(E)&&s(E),this&&this!==Array&&a(this))t=this;else{if(!E){if(o(e))return 1!==(g=e.length)?Array.apply(null,e):((v=new Array(1))[0]=e[0],v);if(p(e)){for(v=new Array(g=e.length),n=0;n<g;++n)v[n]=e[n];return v}}v=[]}if(!p(e))if(void 0!==(w=e[r])){for(b=s(w).call(e),t&&(v=new t),_=b.next(),n=0;!_.done;)x=E?f.call(E,S,_.value,n):_.value,t?(h.value=x,d(v,n,h)):v[n]=x,_=b.next(),++n;g=n}else if(l(e)){for(g=e.length,t&&(v=new t),n=0,m=0;n<g;++n)x=e[n],n+1<g&&(y=x.charCodeAt(0))>=55296&&y<=56319&&(x+=e[++n]),x=E?f.call(E,S,x,m):x,t?(h.value=x,d(v,m,h)):v[m]=x,++m;g=m}if(void 0===g)for(g=i(e.length),t&&(v=new t(g)),n=0;n<g;++n)x=E?f.call(E,S,e[n],n):e[n],t?(h.value=x,d(v,n,h)):v[n]=x;return t&&(h.value=null,v.length=g),v}},function(e,t,n){\"use strict\";e.exports=n(808)()?n(199).Symbol:n(811)},function(e,t,n){\"use strict\";var r=n(199),o={object:!0,symbol:!0};e.exports=function(){var e,t=r.Symbol;if(\"function\"!=typeof t)return!1;e=t(\"test symbol\");try{String(e)}catch(e){return!1}return!!o[typeof t.iterator]&&(!!o[typeof t.toPrimitive]&&!!o[typeof t.toStringTag])}},function(e,t,n){\"use strict\";e.exports=function(){return\"object\"==typeof globalThis&&(!!globalThis&&globalThis.Array===Array)}},function(e,t){var n=function(){if(\"object\"==typeof self&&self)return self;if(\"object\"==typeof window&&window)return window;throw new Error(\"Unable to resolve global `this`\")};e.exports=function(){if(this)return this;try{Object.defineProperty(Object.prototype,\"__global__\",{get:function(){return this},configurable:!0})}catch(e){return n()}try{return __global__||n()}finally{delete Object.prototype.__global__}}()},function(e,t,n){\"use strict\";var r,o,a,i=n(120),s=n(442),u=n(199).Symbol,c=n(813),l=n(814),p=n(815),f=Object.create,h=Object.defineProperties,d=Object.defineProperty;if(\"function\"==typeof u)try{String(u()),a=!0}catch(e){}else u=null;o=function(e){if(this instanceof o)throw new TypeError(\"Symbol is not a constructor\");return r(e)},e.exports=r=function e(t){var n;if(this instanceof e)throw new TypeError(\"Symbol is not a constructor\");return a?u(t):(n=f(o.prototype),t=void 0===t?\"\":String(t),h(n,{__description__:i(\"\",t),__name__:i(\"\",c(t))}))},l(r),p(r),h(o.prototype,{constructor:i(r),toString:i(\"\",(function(){return this.__name__}))}),h(r.prototype,{toString:i((function(){return\"Symbol (\"+s(this).__description__+\")\"})),valueOf:i((function(){return s(this)}))}),d(r.prototype,r.toPrimitive,i(\"\",(function(){var e=s(this);return\"symbol\"==typeof e?e:e.toString()}))),d(r.prototype,r.toStringTag,i(\"c\",\"Symbol\")),d(o.prototype,r.toStringTag,i(\"c\",r.prototype[r.toStringTag])),d(o.prototype,r.toPrimitive,i(\"c\",r.prototype[r.toPrimitive]))},function(e,t,n){\"use strict\";e.exports=function(e){return!!e&&(\"symbol\"==typeof e||!!e.constructor&&(\"Symbol\"===e.constructor.name&&\"Symbol\"===e[e.constructor.toStringTag]))}},function(e,t,n){\"use strict\";var r=n(120),o=Object.create,a=Object.defineProperty,i=Object.prototype,s=o(null);e.exports=function(e){for(var t,n,o=0;s[e+(o||\"\")];)++o;return s[e+=o||\"\"]=!0,a(i,t=\"@@\"+e,r.gs(null,(function(e){n||(n=!0,a(this,t,r(e)),n=!1)}))),t}},function(e,t,n){\"use strict\";var r=n(120),o=n(199).Symbol;e.exports=function(e){return Object.defineProperties(e,{hasInstance:r(\"\",o&&o.hasInstance||e(\"hasInstance\")),isConcatSpreadable:r(\"\",o&&o.isConcatSpreadable||e(\"isConcatSpreadable\")),iterator:r(\"\",o&&o.iterator||e(\"iterator\")),match:r(\"\",o&&o.match||e(\"match\")),replace:r(\"\",o&&o.replace||e(\"replace\")),search:r(\"\",o&&o.search||e(\"search\")),species:r(\"\",o&&o.species||e(\"species\")),split:r(\"\",o&&o.split||e(\"split\")),toPrimitive:r(\"\",o&&o.toPrimitive||e(\"toPrimitive\")),toStringTag:r(\"\",o&&o.toStringTag||e(\"toStringTag\")),unscopables:r(\"\",o&&o.unscopables||e(\"unscopables\"))})}},function(e,t,n){\"use strict\";var r=n(120),o=n(442),a=Object.create(null);e.exports=function(e){return Object.defineProperties(e,{for:r((function(t){return a[t]?a[t]:a[t]=e(String(t))})),keyFor:r((function(e){var t;for(t in o(e),a)if(a[t]===e)return t}))})}},function(e,t,n){\"use strict\";var r=Object.prototype.toString,o=r.call(function(){return arguments}());e.exports=function(e){return r.call(e)===o}},function(e,t,n){\"use strict\";var r=Object.prototype.toString,o=RegExp.prototype.test.bind(/^[object [A-Za-z0-9]*Function]$/);e.exports=function(e){return\"function\"==typeof e&&o(r.call(e))}},function(e,t,n){\"use strict\";var r=Object.prototype.toString,o=r.call(\"\");e.exports=function(e){return\"string\"==typeof e||e&&\"object\"==typeof e&&(e instanceof String||r.call(e)===o)||!1}},function(e,t,n){\"use strict\";var r=n(100);e.exports=function(e){var t;return\"function\"==typeof e?{set:e,get:e}:(t={get:r(e.get)},void 0!==e.set?(t.set=r(e.set),e.delete&&(t.delete=r(e.delete)),e.clear&&(t.clear=r(e.clear)),t):(t.set=t.get,t))}},function(e,t,n){\"use strict\";e.exports=function(e){var t,n,r=e.length;if(!r)return\"\u0002\";for(t=String(e[n=0]);--r;)t+=\"\u0001\"+e[++n];return t}},function(e,t,n){\"use strict\";e.exports=function(e){return e?function(t){for(var n=String(t[0]),r=0,o=e;--o;)n+=\"\u0001\"+t[++r];return n}:function(){return\"\"}}},function(e,t,n){\"use strict\";var r=n(259),o=Object.create;e.exports=function(){var e=0,t=[],n=o(null);return{get:function(e){var n,o=0,a=t,i=e.length;if(0===i)return a[i]||null;if(a=a[i]){for(;o<i-1;){if(-1===(n=r.call(a[0],e[o])))return null;a=a[1][n],++o}return-1===(n=r.call(a[0],e[o]))?null:a[1][n]||null}return null},set:function(o){var a,i=0,s=t,u=o.length;if(0===u)s[u]=++e;else{for(s[u]||(s[u]=[[],[]]),s=s[u];i<u-1;)-1===(a=r.call(s[0],o[i]))&&(a=s[0].push(o[i])-1,s[1].push([[],[]])),s=s[1][a],++i;-1===(a=r.call(s[0],o[i]))&&(a=s[0].push(o[i])-1),s[1][a]=++e}return n[e]=o,e},delete:function(e){var o,a=0,i=t,s=n[e],u=s.length,c=[];if(0===u)delete i[u];else if(i=i[u]){for(;a<u-1;){if(-1===(o=r.call(i[0],s[a])))return;c.push(i,o),i=i[1][o],++a}if(-1===(o=r.call(i[0],s[a])))return;for(e=i[1][o],i[0].splice(o,1),i[1].splice(o,1);!i[0].length&&c.length;)o=c.pop(),(i=c.pop())[0].splice(o,1),i[1].splice(o,1)}delete n[e]},clear:function(){t=[],n=o(null)}}}},function(e,t,n){\"use strict\";e.exports=n(824)()?Number.isNaN:n(825)},function(e,t,n){\"use strict\";e.exports=function(){var e=Number.isNaN;return\"function\"==typeof e&&(!e({})&&e(NaN)&&!e(34))}},function(e,t,n){\"use strict\";e.exports=function(e){return e!=e}},function(e,t,n){\"use strict\";var r=n(259);e.exports=function(){var e=0,t=[],n=[];return{get:function(e){var o=r.call(t,e[0]);return-1===o?null:n[o]},set:function(r){return t.push(r[0]),n.push(++e),e},delete:function(e){var o=r.call(n,e);-1!==o&&(t.splice(o,1),n.splice(o,1))},clear:function(){t=[],n=[]}}}},function(e,t,n){\"use strict\";var r=n(259),o=Object.create;e.exports=function(e){var t=0,n=[[],[]],a=o(null);return{get:function(t){for(var o,a=0,i=n;a<e-1;){if(-1===(o=r.call(i[0],t[a])))return null;i=i[1][o],++a}return-1===(o=r.call(i[0],t[a]))?null:i[1][o]||null},set:function(o){for(var i,s=0,u=n;s<e-1;)-1===(i=r.call(u[0],o[s]))&&(i=u[0].push(o[s])-1,u[1].push([[],[]])),u=u[1][i],++s;return-1===(i=r.call(u[0],o[s]))&&(i=u[0].push(o[s])-1),u[1][i]=++t,a[t]=o,t},delete:function(t){for(var o,i=0,s=n,u=[],c=a[t];i<e-1;){if(-1===(o=r.call(s[0],c[i])))return;u.push(s,o),s=s[1][o],++i}if(-1!==(o=r.call(s[0],c[i]))){for(t=s[1][o],s[0].splice(o,1),s[1].splice(o,1);!s[0].length&&u.length;)o=u.pop(),(s=u.pop())[0].splice(o,1),s[1].splice(o,1);delete a[t]}},clear:function(){n=[[],[]],a=o(null)}}}},function(e,t,n){\"use strict\";var r=n(258),o=n(443),a=n(440),i=n(439),s=n(260),u=Array.prototype.slice,c=Function.prototype.apply,l=Object.create;n(119).async=function(e,t){var n,p,f,h=l(null),d=l(null),m=t.memoized,v=t.original;t.memoized=i((function(e){var t=arguments,r=t[t.length-1];return\"function\"==typeof r&&(n=r,t=u.call(t,0,-1)),m.apply(p=this,f=t)}),m);try{a(t.memoized,m)}catch(e){}t.on(\"get\",(function(e){var r,o,a;if(n){if(h[e])return\"function\"==typeof h[e]?h[e]=[h[e],n]:h[e].push(n),void(n=null);r=n,o=p,a=f,n=p=f=null,s((function(){var i;hasOwnProperty.call(d,e)?(i=d[e],t.emit(\"getasync\",e,a,o),c.call(r,i.context,i.args)):(n=r,p=o,f=a,m.apply(o,a))}))}})),t.original=function(){var e,o,a,i;return n?(e=r(arguments),o=function e(n){var o,a,u=e.id;if(null!=u){if(delete e.id,o=h[u],delete h[u],o)return a=r(arguments),t.has(u)&&(n?t.delete(u):(d[u]={context:this,args:a},t.emit(\"setasync\",u,\"function\"==typeof o?1:o.length))),\"function\"==typeof o?i=c.call(o,this,a):o.forEach((function(e){i=c.call(e,this,a)}),this),i}else s(c.bind(e,this,arguments))},a=n,n=p=f=null,e.push(o),i=c.call(v,this,e),o.cb=a,n=o,i):c.call(v,this,arguments)},t.on(\"set\",(function(e){n?(h[e]?\"function\"==typeof h[e]?h[e]=[h[e],n.cb]:h[e].push(n.cb):h[e]=n.cb,delete n.cb,n.id=e,n=null):t.delete(e)})),t.on(\"delete\",(function(e){var n;hasOwnProperty.call(h,e)||d[e]&&(n=d[e],delete d[e],t.emit(\"deleteasync\",e,u.call(n.args,1)))})),t.on(\"clear\",(function(){var e=d;d=l(null),t.emit(\"clearasync\",o(e,(function(e){return u.call(e.args,1)})))}))}},function(e,t,n){\"use strict\";var r=n(443),o=n(830),a=n(831),i=n(833),s=n(445),u=n(260),c=Object.create,l=o(\"then\",\"then:finally\",\"done\",\"done:finally\");n(119).promise=function(e,t){var n=c(null),o=c(null),p=c(null);if(!0===e)e=null;else if(e=a(e),!l[e])throw new TypeError(\"'\"+i(e)+\"' is not valid promise mode\");t.on(\"set\",(function(r,a,i){var c=!1;if(!s(i))return o[r]=i,void t.emit(\"setasync\",r,1);n[r]=1,p[r]=i;var l=function(e){var a=n[r];if(c)throw new Error(\"Memoizee error: Detected unordered then|done & finally resolution, which in turn makes proper detection of success/failure impossible (when in 'done:finally' mode)\\nConsider to rely on 'then' or 'done' mode instead.\");a&&(delete n[r],o[r]=e,t.emit(\"setasync\",r,a))},f=function(){c=!0,n[r]&&(delete n[r],delete p[r],t.delete(r))},h=e;if(h||(h=\"then\"),\"then\"===h){var d=function(){u(f)};\"function\"==typeof(i=i.then((function(e){u(l.bind(this,e))}),d)).finally&&i.finally(d)}else if(\"done\"===h){if(\"function\"!=typeof i.done)throw new Error(\"Memoizee error: Retrieved promise does not implement 'done' in 'done' mode\");i.done(l,f)}else if(\"done:finally\"===h){if(\"function\"!=typeof i.done)throw new Error(\"Memoizee error: Retrieved promise does not implement 'done' in 'done:finally' mode\");if(\"function\"!=typeof i.finally)throw new Error(\"Memoizee error: Retrieved promise does not implement 'finally' in 'done:finally' mode\");i.done(l),i.finally(f)}})),t.on(\"get\",(function(e,r,o){var a;if(n[e])++n[e];else{a=p[e];var i=function(){t.emit(\"getasync\",e,r,o)};s(a)?\"function\"==typeof a.done?a.done(i):a.then((function(){u(i)})):i()}})),t.on(\"delete\",(function(e){if(delete p[e],n[e])delete n[e];else if(hasOwnProperty.call(o,e)){var r=o[e];delete o[e],t.emit(\"deleteasync\",e,[r])}})),t.on(\"clear\",(function(){var e=o;o=c(null),n=c(null),p=c(null),t.emit(\"clearasync\",r(e,(function(e){return[e]})))}))}},function(e,t,n){\"use strict\";var r=Array.prototype.forEach,o=Object.create;e.exports=function(e){var t=o(null);return r.call(arguments,(function(e){t[e]=!0})),t}},function(e,t,n){\"use strict\";var r=n(137),o=n(832);e.exports=function(e){return o(r(e))}},function(e,t,n){\"use strict\";var r=n(444);e.exports=function(e){try{return e&&r(e.toString)?e.toString():String(e)}catch(e){throw new TypeError(\"Passed argument cannot be stringifed\")}}},function(e,t,n){\"use strict\";var r=n(834),o=/[\\n\\r\\u2028\\u2029]/g;e.exports=function(e){var t=r(e);return t.length>100&&(t=t.slice(0,99)+\"…\"),t=t.replace(o,(function(e){return JSON.stringify(e).slice(1,-1)}))}},function(e,t,n){\"use strict\";var r=n(444);e.exports=function(e){try{return e&&r(e.toString)?e.toString():String(e)}catch(e){return\"<Non-coercible to string value>\"}}},function(e,t,n){\"use strict\";var r=n(100),o=n(198),a=n(119),i=Function.prototype.apply;a.dispose=function(e,t,n){var s;if(r(e),n.async&&a.async||n.promise&&a.promise)return t.on(\"deleteasync\",s=function(t,n){i.call(e,null,n)}),void t.on(\"clearasync\",(function(e){o(e,(function(e,t){s(t,e)}))}));t.on(\"delete\",s=function(t,n){e(n)}),t.on(\"clear\",(function(e){o(e,(function(e,t){s(t,e)}))}))}},function(e,t,n){\"use strict\";var r=n(258),o=n(198),a=n(260),i=n(445),s=n(837),u=n(119),c=Function.prototype,l=Math.max,p=Math.min,f=Object.create;u.maxAge=function(e,t,n){var h,d,m,v;(e=s(e))&&(h=f(null),d=n.async&&u.async||n.promise&&u.promise?\"async\":\"\",t.on(\"set\"+d,(function(n){h[n]=setTimeout((function(){t.delete(n)}),e),\"function\"==typeof h[n].unref&&h[n].unref(),v&&(v[n]&&\"nextTick\"!==v[n]&&clearTimeout(v[n]),v[n]=setTimeout((function(){delete v[n]}),m),\"function\"==typeof v[n].unref&&v[n].unref())})),t.on(\"delete\"+d,(function(e){clearTimeout(h[e]),delete h[e],v&&(\"nextTick\"!==v[e]&&clearTimeout(v[e]),delete v[e])})),n.preFetch&&(m=!0===n.preFetch||isNaN(n.preFetch)?.333:l(p(Number(n.preFetch),1),0))&&(v={},m=(1-m)*e,t.on(\"get\"+d,(function(e,o,s){v[e]||(v[e]=\"nextTick\",a((function(){var a;\"nextTick\"===v[e]&&(delete v[e],t.delete(e),n.async&&(o=r(o)).push(c),a=t.memoized.apply(s,o),n.promise&&i(a)&&(\"function\"==typeof a.done?a.done(c,c):a.then(c,c)))})))}))),t.on(\"clear\"+d,(function(){o(h,(function(e){clearTimeout(e)})),h={},v&&(o(v,(function(e){\"nextTick\"!==e&&clearTimeout(e)})),v={})})))}},function(e,t,n){\"use strict\";var r=n(118),o=n(838);e.exports=function(e){if((e=r(e))>o)throw new TypeError(e+\" exceeds maximum possible timeout\");return e}},function(e,t,n){\"use strict\";e.exports=2147483647},function(e,t,n){\"use strict\";var r=n(118),o=n(840),a=n(119);a.max=function(e,t,n){var i,s,u;(e=r(e))&&(s=o(e),i=n.async&&a.async||n.promise&&a.promise?\"async\":\"\",t.on(\"set\"+i,u=function(e){void 0!==(e=s.hit(e))&&t.delete(e)}),t.on(\"get\"+i,u),t.on(\"delete\"+i,s.delete),t.on(\"clear\"+i,s.clear))}},function(e,t,n){\"use strict\";var r=n(118),o=Object.create,a=Object.prototype.hasOwnProperty;e.exports=function(e){var t,n=0,i=1,s=o(null),u=o(null),c=0;return e=r(e),{hit:function(r){var o=u[r],l=++c;if(s[l]=r,u[r]=l,!o){if(++n<=e)return;return r=s[i],t(r),r}if(delete s[o],i===o)for(;!a.call(s,++i);)continue},delete:t=function(e){var t=u[e];if(t&&(delete s[t],delete u[e],--n,i===t)){if(!n)return c=0,void(i=1);for(;!a.call(s,++i);)continue}},clear:function(){n=0,i=1,s=o(null),u=o(null),c=0}}}},function(e,t,n){\"use strict\";var r=n(120),o=n(119),a=Object.create,i=Object.defineProperties;o.refCounter=function(e,t,n){var s,u;s=a(null),u=n.async&&o.async||n.promise&&o.promise?\"async\":\"\",t.on(\"set\"+u,(function(e,t){s[e]=t||1})),t.on(\"get\"+u,(function(e){++s[e]})),t.on(\"delete\"+u,(function(e){delete s[e]})),t.on(\"clear\"+u,(function(){s={}})),i(t.memoized,{deleteRef:r((function(){var e=t.get(arguments);return null===e?null:s[e]?!--s[e]&&(t.delete(e),!0):null})),getRefCount:r((function(){var e=t.get(arguments);return null===e?0:s[e]?s[e]:0}))})}},function(e,t,n){var r=n(61),o=n(138),a=n(62).Buffer,i=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function u(){this.init(),this._w=s,o.call(this,64,56)}function c(e){return e<<30|e>>>2}function l(e,t,n,r){return 0===e?t&n|~t&r:2===e?t&n|t&r|n&r:t^n^r}r(u,o),u.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},u.prototype._update=function(e){for(var t,n=this._w,r=0|this._a,o=0|this._b,a=0|this._c,s=0|this._d,u=0|this._e,p=0;p<16;++p)n[p]=e.readInt32BE(4*p);for(;p<80;++p)n[p]=n[p-3]^n[p-8]^n[p-14]^n[p-16];for(var f=0;f<80;++f){var h=~~(f/20),d=0|((t=r)<<5|t>>>27)+l(h,o,a,s)+u+n[f]+i[h];u=s,s=a,a=c(o),o=r,r=d}this._a=r+this._a|0,this._b=o+this._b|0,this._c=a+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0},u.prototype._hash=function(){var e=a.allocUnsafe(20);return e.writeInt32BE(0|this._a,0),e.writeInt32BE(0|this._b,4),e.writeInt32BE(0|this._c,8),e.writeInt32BE(0|this._d,12),e.writeInt32BE(0|this._e,16),e},e.exports=u},function(e,t,n){var r=n(61),o=n(138),a=n(62).Buffer,i=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function u(){this.init(),this._w=s,o.call(this,64,56)}function c(e){return e<<5|e>>>27}function l(e){return e<<30|e>>>2}function p(e,t,n,r){return 0===e?t&n|~t&r:2===e?t&n|t&r|n&r:t^n^r}r(u,o),u.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},u.prototype._update=function(e){for(var t,n=this._w,r=0|this._a,o=0|this._b,a=0|this._c,s=0|this._d,u=0|this._e,f=0;f<16;++f)n[f]=e.readInt32BE(4*f);for(;f<80;++f)n[f]=(t=n[f-3]^n[f-8]^n[f-14]^n[f-16])<<1|t>>>31;for(var h=0;h<80;++h){var d=~~(h/20),m=c(r)+p(d,o,a,s)+u+n[h]+i[d]|0;u=s,s=a,a=l(o),o=r,r=m}this._a=r+this._a|0,this._b=o+this._b|0,this._c=a+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0},u.prototype._hash=function(){var e=a.allocUnsafe(20);return e.writeInt32BE(0|this._a,0),e.writeInt32BE(0|this._b,4),e.writeInt32BE(0|this._c,8),e.writeInt32BE(0|this._d,12),e.writeInt32BE(0|this._e,16),e},e.exports=u},function(e,t,n){var r=n(61),o=n(446),a=n(138),i=n(62).Buffer,s=new Array(64);function u(){this.init(),this._w=s,a.call(this,64,56)}r(u,o),u.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},u.prototype._hash=function(){var e=i.allocUnsafe(28);return e.writeInt32BE(this._a,0),e.writeInt32BE(this._b,4),e.writeInt32BE(this._c,8),e.writeInt32BE(this._d,12),e.writeInt32BE(this._e,16),e.writeInt32BE(this._f,20),e.writeInt32BE(this._g,24),e},e.exports=u},function(e,t,n){var r=n(61),o=n(447),a=n(138),i=n(62).Buffer,s=new Array(160);function u(){this.init(),this._w=s,a.call(this,128,112)}r(u,o),u.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},u.prototype._hash=function(){var e=i.allocUnsafe(48);function t(t,n,r){e.writeInt32BE(t,r),e.writeInt32BE(n,r+4)}return t(this._ah,this._al,0),t(this._bh,this._bl,8),t(this._ch,this._cl,16),t(this._dh,this._dl,24),t(this._eh,this._el,32),t(this._fh,this._fl,40),e},e.exports=u},function(e,t,n){var r=n(847);e.exports=r},function(e,t,n){var r=n(848),o=Array.prototype;e.exports=function(e){var t=e.every;return e===o||e instanceof Array&&t===o.every?r:t}},function(e,t,n){n(849);var r=n(42);e.exports=r(\"Array\").every},function(e,t,n){\"use strict\";var r=n(21),o=n(86).every;r({target:\"Array\",proto:!0,forced:!n(111)(\"every\")},{every:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t){e.exports=function(e,t,n,r,o){return o(e,(function(e,o,a){n=r?(r=!1,e):t(n,e,o,a)})),n}},function(e,t,n){var r=n(375);e.exports=r},function(e,t,n){var r=n(853);e.exports=r},function(e,t,n){n(364);var r=n(34);e.exports=r.Object.getOwnPropertySymbols},function(e,t,n){e.exports=n(855)},function(e,t,n){var r=n(374);e.exports=r},function(e,t,n){e.exports=n(857)},function(e,t,n){var r=n(858);e.exports=r},function(e,t,n){n(859);var r=n(34).Object,o=e.exports=function(e,t){return r.getOwnPropertyDescriptor(e,t)};r.getOwnPropertyDescriptor.sham&&(o.sham=!0)},function(e,t,n){var r=n(21),o=n(37),a=n(66),i=n(127).f,s=n(48),u=o((function(){i(1)}));r({target:\"Object\",stat:!0,forced:!s||u,sham:!s},{getOwnPropertyDescriptor:function(e,t){return i(a(e),t)}})},function(e,t,n){e.exports=n(861)},function(e,t,n){var r=n(401);e.exports=r},function(e,t,n){e.exports=n(863)},function(e,t,n){var r=n(864);e.exports=r},function(e,t,n){n(865);var r=n(34);e.exports=r.Object.getOwnPropertyDescriptors},function(e,t,n){var r=n(21),o=n(48),a=n(866),i=n(66),s=n(127),u=n(153);r({target:\"Object\",stat:!0,sham:!o},{getOwnPropertyDescriptors:function(e){for(var t,n,r=i(e),o=s.f,c=a(r),l={},p=0;c.length>p;)void 0!==(n=o(r,t=c[p++]))&&u(l,t,n);return l}})},function(e,t,n){var r=n(70),o=n(234),a=n(235),i=n(52);e.exports=r(\"Reflect\",\"ownKeys\")||function(e){var t=o.f(i(e)),n=a.f;return n?t.concat(n(e)):t}},function(e,t,n){e.exports=n(868)},function(e,t,n){var r=n(869);e.exports=r},function(e,t,n){n(870);var r=n(34).Object,o=e.exports=function(e,t){return r.defineProperties(e,t)};r.defineProperties.sham&&(o.sham=!0)},function(e,t,n){var r=n(21),o=n(48);r({target:\"Object\",stat:!0,forced:!o,sham:!o},{defineProperties:n(230)})},function(e,t,n){var r=n(404);e.exports=r},function(e,t,n){var r=n(448),o=n(450);e.exports=function(e,t){if(null==e)return{};var n,a,i={},s=r(e);for(a=0;a<s.length;a++)n=s[a],o(t).call(t,n)>=0||(i[n]=e[n]);return i},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(874)},function(e,t,n){var r=n(451);n(881),n(882),n(883),n(884),e.exports=r},function(e,t,n){\"use strict\";var r,o,a,i,s=n(21),u=n(97),c=n(40),l=n(70),p=n(453),f=n(110),h=n(163),d=n(183),m=n(98),v=n(454),g=n(47),y=n(77),b=n(139),_=n(368),w=n(121),x=n(398),E=n(455),S=n(456).set,C=n(876),A=n(458),k=n(878),O=n(164),j=n(200),T=n(78),I=n(362),P=n(41),N=n(879),M=n(184),R=n(129),D=P(\"species\"),L=\"Promise\",B=T.get,F=T.set,U=T.getterFor(L),q=p&&p.prototype,z=p,V=q,W=c.TypeError,H=c.document,$=c.process,J=O.f,K=J,Y=!!(H&&H.createEvent&&c.dispatchEvent),G=\"function\"==typeof PromiseRejectionEvent,Z=\"unhandledrejection\",X=!1,Q=I(L,(function(){var e=_(z)!==String(z);if(!e&&66===R)return!0;if(u&&!V.finally)return!0;if(R>=51&&/native code/.test(z))return!1;var t=new z((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};return(t.constructor={})[D]=n,!(X=t.then((function(){}))instanceof n)||!e&&N&&!G})),ee=Q||!x((function(e){z.all(e).catch((function(){}))})),te=function(e){var t;return!(!g(e)||\"function\"!=typeof(t=e.then))&&t},ne=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;C((function(){for(var r=e.value,o=1==e.state,a=0;n.length>a;){var i,s,u,c=n[a++],l=o?c.ok:c.fail,p=c.resolve,f=c.reject,h=c.domain;try{l?(o||(2===e.rejection&&ie(e),e.rejection=1),!0===l?i=r:(h&&h.enter(),i=l(r),h&&(h.exit(),u=!0)),i===c.promise?f(W(\"Promise-chain cycle\")):(s=te(i))?s.call(i,p,f):p(i)):f(r)}catch(e){h&&!u&&h.exit(),f(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&oe(e)}))}},re=function(e,t,n){var r,o;Y?((r=H.createEvent(\"Event\")).promise=t,r.reason=n,r.initEvent(e,!1,!0),c.dispatchEvent(r)):r={promise:t,reason:n},!G&&(o=c[\"on\"+e])?o(r):e===Z&&k(\"Unhandled promise rejection\",n)},oe=function(e){S.call(c,(function(){var t,n=e.facade,r=e.value;if(ae(e)&&(t=j((function(){M?$.emit(\"unhandledRejection\",r,n):re(Z,n,r)})),e.rejection=M||ae(e)?2:1,t.error))throw t.value}))},ae=function(e){return 1!==e.rejection&&!e.parent},ie=function(e){S.call(c,(function(){var t=e.facade;M?$.emit(\"rejectionHandled\",t):re(\"rejectionhandled\",t,e.value)}))},se=function(e,t,n){return function(r){e(t,r,n)}},ue=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,ne(e,!0))},ce=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw W(\"Promise can't be resolved itself\");var r=te(t);r?C((function(){var n={done:!1};try{r.call(t,se(ce,n,e),se(ue,n,e))}catch(t){ue(n,t,e)}})):(e.value=t,e.state=1,ne(e,!1))}catch(t){ue({done:!1},t,e)}}};if(Q&&(V=(z=function(e){b(this,z,L),y(e),r.call(this);var t=B(this);try{e(se(ce,t),se(ue,t))}catch(e){ue(t,e)}}).prototype,(r=function(e){F(this,{type:L,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(V,{then:function(e,t){var n=U(this),r=J(E(this,z));return r.ok=\"function\"!=typeof e||e,r.fail=\"function\"==typeof t&&t,r.domain=M?$.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&ne(n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),o=function(){var e=new r,t=B(e);this.promise=e,this.resolve=se(ce,t),this.reject=se(ue,t)},O.f=J=function(e){return e===z||e===a?new o(e):K(e)},!u&&\"function\"==typeof p&&q!==Object.prototype)){i=q.then,X||(f(q,\"then\",(function(e,t){var n=this;return new z((function(e,t){i.call(n,e,t)})).then(e,t)}),{unsafe:!0}),f(q,\"catch\",V.catch,{unsafe:!0}));try{delete q.constructor}catch(e){}d&&d(q,V)}s({global:!0,wrap:!0,forced:Q},{Promise:z}),m(z,L,!1,!0),v(L),a=l(L),s({target:L,stat:!0,forced:Q},{reject:function(e){var t=J(this);return t.reject.call(void 0,e),t.promise}}),s({target:L,stat:!0,forced:u||Q},{resolve:function(e){return A(u&&this===a?z:this,e)}}),s({target:L,stat:!0,forced:ee},{all:function(e){var t=this,n=J(t),r=n.resolve,o=n.reject,a=j((function(){var n=y(t.resolve),a=[],i=0,s=1;w(e,(function(e){var u=i++,c=!1;a.push(void 0),s++,n.call(t,e).then((function(e){c||(c=!0,a[u]=e,--s||r(a))}),o)})),--s||r(a)}));return a.error&&o(a.value),n.promise},race:function(e){var t=this,n=J(t),r=n.reject,o=j((function(){var o=y(t.resolve);w(e,(function(e){o.call(t,e).then(n.resolve,r)}))}));return o.error&&r(o.value),n.promise}})},function(e,t,n){var r,o,a,i,s,u,c,l,p=n(40),f=n(127).f,h=n(456).set,d=n(457),m=n(877),v=n(184),g=p.MutationObserver||p.WebKitMutationObserver,y=p.document,b=p.process,_=p.Promise,w=f(p,\"queueMicrotask\"),x=w&&w.value;x||(r=function(){var e,t;for(v&&(e=b.domain)&&e.exit();o;){t=o.fn,o=o.next;try{t()}catch(e){throw o?i():a=void 0,e}}a=void 0,e&&e.enter()},d||v||m||!g||!y?_&&_.resolve?((c=_.resolve(void 0)).constructor=_,l=c.then,i=function(){l.call(c,r)}):i=v?function(){b.nextTick(r)}:function(){h.call(p,r)}:(s=!0,u=y.createTextNode(\"\"),new g(r).observe(u,{characterData:!0}),i=function(){u.data=s=!s})),e.exports=x||function(e){var t={fn:e,next:void 0};a&&(a.next=t),o||(o=t,i()),a=t}},function(e,t,n){var r=n(108);e.exports=/web0s(?!.*chrome)/i.test(r)},function(e,t,n){var r=n(40);e.exports=function(e,t){var n=r.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},function(e,t){e.exports=\"object\"==typeof window},function(e,t,n){\"use strict\";var r=n(21),o=n(97),a=n(453),i=n(37),s=n(70),u=n(455),c=n(458),l=n(110);if(r({target:\"Promise\",proto:!0,real:!0,forced:!!a&&i((function(){a.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=u(this,s(\"Promise\")),n=\"function\"==typeof e;return this.then(n?function(n){return c(t,e()).then((function(){return n}))}:e,n?function(n){return c(t,e()).then((function(){throw n}))}:e)}}),!o&&\"function\"==typeof a){var p=s(\"Promise\").prototype.finally;a.prototype.finally!==p&&l(a.prototype,\"finally\",p,{unsafe:!0})}},function(e,t,n){n(452)},function(e,t,n){n(459)},function(e,t,n){\"use strict\";var r=n(21),o=n(164),a=n(200);r({target:\"Promise\",stat:!0},{try:function(e){var t=o.f(this),n=a(e);return(n.error?t.reject:t.resolve)(n.value),t.promise}})},function(e,t,n){n(460)},function(e,t,n){var r=function(e){\"use strict\";var t,n=Object.prototype,r=n.hasOwnProperty,o=\"function\"==typeof Symbol?Symbol:{},a=o.iterator||\"@@iterator\",i=o.asyncIterator||\"@@asyncIterator\",s=o.toStringTag||\"@@toStringTag\";function u(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},\"\")}catch(e){u=function(e,t,n){return e[t]=n}}function c(e,t,n,r){var o=t&&t.prototype instanceof v?t:v,a=Object.create(o.prototype),i=new O(r||[]);return a._invoke=function(e,t,n){var r=p;return function(o,a){if(r===h)throw new Error(\"Generator is already running\");if(r===d){if(\"throw\"===o)throw a;return T()}for(n.method=o,n.arg=a;;){var i=n.delegate;if(i){var s=C(i,n);if(s){if(s===m)continue;return s}}if(\"next\"===n.method)n.sent=n._sent=n.arg;else if(\"throw\"===n.method){if(r===p)throw r=d,n.arg;n.dispatchException(n.arg)}else\"return\"===n.method&&n.abrupt(\"return\",n.arg);r=h;var u=l(e,t,n);if(\"normal\"===u.type){if(r=n.done?d:f,u.arg===m)continue;return{value:u.arg,done:n.done}}\"throw\"===u.type&&(r=d,n.method=\"throw\",n.arg=u.arg)}}}(e,n,i),a}function l(e,t,n){try{return{type:\"normal\",arg:e.call(t,n)}}catch(e){return{type:\"throw\",arg:e}}}e.wrap=c;var p=\"suspendedStart\",f=\"suspendedYield\",h=\"executing\",d=\"completed\",m={};function v(){}function g(){}function y(){}var b={};b[a]=function(){return this};var _=Object.getPrototypeOf,w=_&&_(_(j([])));w&&w!==n&&r.call(w,a)&&(b=w);var x=y.prototype=v.prototype=Object.create(b);function E(e){[\"next\",\"throw\",\"return\"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function S(e,t){function n(o,a,i,s){var u=l(e[o],e,a);if(\"throw\"!==u.type){var c=u.arg,p=c.value;return p&&\"object\"==typeof p&&r.call(p,\"__await\")?t.resolve(p.__await).then((function(e){n(\"next\",e,i,s)}),(function(e){n(\"throw\",e,i,s)})):t.resolve(p).then((function(e){c.value=e,i(c)}),(function(e){return n(\"throw\",e,i,s)}))}s(u.arg)}var o;this._invoke=function(e,r){function a(){return new t((function(t,o){n(e,r,t,o)}))}return o=o?o.then(a,a):a()}}function C(e,n){var r=e.iterator[n.method];if(r===t){if(n.delegate=null,\"throw\"===n.method){if(e.iterator.return&&(n.method=\"return\",n.arg=t,C(e,n),\"throw\"===n.method))return m;n.method=\"throw\",n.arg=new TypeError(\"The iterator does not provide a 'throw' method\")}return m}var o=l(r,e.iterator,n.arg);if(\"throw\"===o.type)return n.method=\"throw\",n.arg=o.arg,n.delegate=null,m;var a=o.arg;return a?a.done?(n[e.resultName]=a.value,n.next=e.nextLoc,\"return\"!==n.method&&(n.method=\"next\",n.arg=t),n.delegate=null,m):a:(n.method=\"throw\",n.arg=new TypeError(\"iterator result is not an object\"),n.delegate=null,m)}function A(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 k(e){var t=e.completion||{};t.type=\"normal\",delete t.arg,e.completion=t}function O(e){this.tryEntries=[{tryLoc:\"root\"}],e.forEach(A,this),this.reset(!0)}function j(e){if(e){var n=e[a];if(n)return n.call(e);if(\"function\"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function n(){for(;++o<e.length;)if(r.call(e,o))return n.value=e[o],n.done=!1,n;return n.value=t,n.done=!0,n};return i.next=i}}return{next:T}}function T(){return{value:t,done:!0}}return g.prototype=x.constructor=y,y.constructor=g,g.displayName=u(y,s,\"GeneratorFunction\"),e.isGeneratorFunction=function(e){var t=\"function\"==typeof e&&e.constructor;return!!t&&(t===g||\"GeneratorFunction\"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,y):(e.__proto__=y,u(e,s,\"GeneratorFunction\")),e.prototype=Object.create(x),e},e.awrap=function(e){return{__await:e}},E(S.prototype),S.prototype[i]=function(){return this},e.AsyncIterator=S,e.async=function(t,n,r,o,a){void 0===a&&(a=Promise);var i=new S(c(t,n,r,o),a);return e.isGeneratorFunction(n)?i:i.next().then((function(e){return e.done?e.value:i.next()}))},E(x),u(x,s,\"Generator\"),x[a]=function(){return this},x.toString=function(){return\"[object Generator]\"},e.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var r=t.pop();if(r in e)return n.value=r,n.done=!1,n}return n.done=!0,n}},e.values=j,O.prototype={constructor:O,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=t,this.tryEntries.forEach(k),!e)for(var n in this)\"t\"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=t)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if(\"throw\"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var n=this;function o(r,o){return s.type=\"throw\",s.arg=e,n.next=r,o&&(n.method=\"next\",n.arg=t),!!o}for(var a=this.tryEntries.length-1;a>=0;--a){var i=this.tryEntries[a],s=i.completion;if(\"root\"===i.tryLoc)return o(\"end\");if(i.tryLoc<=this.prev){var u=r.call(i,\"catchLoc\"),c=r.call(i,\"finallyLoc\");if(u&&c){if(this.prev<i.catchLoc)return o(i.catchLoc,!0);if(this.prev<i.finallyLoc)return o(i.finallyLoc)}else if(u){if(this.prev<i.catchLoc)return o(i.catchLoc,!0)}else{if(!c)throw new Error(\"try statement without catch or finally\");if(this.prev<i.finallyLoc)return o(i.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,\"finallyLoc\")&&this.prev<o.finallyLoc){var a=o;break}}a&&(\"break\"===e||\"continue\"===e)&&a.tryLoc<=t&&t<=a.finallyLoc&&(a=null);var i=a?a.completion:{};return i.type=e,i.arg=t,a?(this.method=\"next\",this.next=a.finallyLoc,m):this.complete(i)},complete:function(e,t){if(\"throw\"===e.type)throw e.arg;return\"break\"===e.type||\"continue\"===e.type?this.next=e.arg:\"return\"===e.type?(this.rval=this.arg=e.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===e.type&&t&&(this.next=t),m},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),k(n),m}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if(\"throw\"===r.type){var o=r.arg;k(n)}return o}}throw new Error(\"illegal catch attempt\")},delegateYield:function(e,n,r){return this.delegate={iterator:j(e),resultName:n,nextLoc:r},\"next\"===this.method&&(this.arg=t),m}},e}(e.exports);try{regeneratorRuntime=r}catch(e){Function(\"r\",\"regeneratorRuntime = r\")(r)}},function(e,t,n){var r=n(377);e.exports=r},function(e,t,n){var r=n(451);e.exports=r},function(e,t,n){var r=n(889);e.exports=r},function(e,t,n){n(890);var r=n(34);e.exports=r.Object.values},function(e,t,n){var r=n(21),o=n(461).values;r({target:\"Object\",stat:!0},{values:function(e){return o(e)}})},function(e,t,n){var r=n(892);e.exports=r},function(e,t,n){n(893);var r=n(34);e.exports=r.Date.now},function(e,t,n){n(21)({target:\"Date\",stat:!0},{now:function(){return(new Date).getTime()}})},function(e,t,n){\"use strict\";e.exports=function(e,t){if(t=t.split(\":\")[0],!(e=+e))return!1;switch(t){case\"http\":case\"ws\":return 80!==e;case\"https\":case\"wss\":return 443!==e;case\"ftp\":return 21!==e;case\"gopher\":return 70!==e;case\"file\":return!1}return 0!==e}},function(e,t,n){\"use strict\";var r=Object.prototype.hasOwnProperty;function o(e){try{return decodeURIComponent(e.replace(/\\+/g,\" \"))}catch(e){return null}}function a(e){try{return encodeURIComponent(e)}catch(e){return null}}t.stringify=function(e,t){t=t||\"\";var n,o,i=[];for(o in\"string\"!=typeof t&&(t=\"?\"),e)if(r.call(e,o)){if((n=e[o])||null!=n&&!isNaN(n)||(n=\"\"),o=a(o),n=a(n),null===o||null===n)continue;i.push(o+\"=\"+n)}return i.length?t+i.join(\"&\"):\"\"},t.parse=function(e){for(var t,n=/([^=?#&]+)=?([^&]*)/g,r={};t=n.exec(e);){var a=o(t[1]),i=o(t[2]);null===a||null===i||a in r||(r[a]=i)}return r}},function(e,t,n){var r=n(71);e.exports=function(){return r.Date.now()}},function(e,t,n){e.exports=n(898)},function(e,t,n){var r=n(379);e.exports=r},function(e,t,n){e.exports=n(900)},function(e,t,n){var r=n(901);e.exports=r},function(e,t,n){n(902);var r=n(34).Object;e.exports=function(e,t){return r.create(e,t)}},function(e,t,n){n(21)({target:\"Object\",stat:!0,sham:!n(48)},{create:n(109)})},function(e,t,n){var r=n(465);function o(t,n){return e.exports=o=r||function(e,t){return e.__proto__=t,e},e.exports.default=e.exports,e.exports.__esModule=!0,o(t,n)}e.exports=o,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(905);e.exports=r},function(e,t,n){n(906);var r=n(34);e.exports=r.Object.setPrototypeOf},function(e,t,n){n(21)({target:\"Object\",stat:!0},{setPrototypeOf:n(183)})},function(e,t,n){var r=n(908);e.exports=r},function(e,t,n){n(909);var r=n(34);e.exports=r.Reflect.construct},function(e,t,n){var r=n(21),o=n(70),a=n(77),i=n(52),s=n(47),u=n(109),c=n(378),l=n(37),p=o(\"Reflect\",\"construct\"),f=l((function(){function e(){}return!(p((function(){}),[],e)instanceof e)})),h=!l((function(){p((function(){}))})),d=f||h;r({target:\"Reflect\",stat:!0,forced:d,sham:d},{construct:function(e,t){a(e),i(t);var n=arguments.length<3?e:a(arguments[2]);if(h&&!f)return p(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var r=[null];return r.push.apply(r,t),new(c.apply(e,r))}var o=n.prototype,l=u(s(o)?o:Object.prototype),d=Function.apply.call(e,l,t);return s(d)?d:l}})},function(e,t,n){var r=n(465),o=n(911);function a(t){return e.exports=a=r?o:function(e){return e.__proto__||o(e)},e.exports.default=e.exports,e.exports.__esModule=!0,a(t)}e.exports=a,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(912)},function(e,t,n){var r=n(913);e.exports=r},function(e,t,n){n(914);var r=n(34);e.exports=r.Object.getPrototypeOf},function(e,t,n){var r=n(21),o=n(37),a=n(60),i=n(182),s=n(373);r({target:\"Object\",stat:!0,forced:o((function(){i(1)})),sham:!s},{getPrototypeOf:function(e){return i(a(e))}})},function(e,t,n){var r=n(466);e.exports=function(){if(\"undefined\"==typeof Reflect||!r)return!1;if(r.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(r(Boolean,[],(function(){}))),!0}catch(e){return!1}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(18).default,o=n(10);e.exports=function(e,t){return!t||\"object\"!==r(t)&&\"function\"!=typeof t?o(e):t},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";var r=n(45),o=n(918),a=n(490),i=n(141),s=n(80),u=n(990),c=n(991),l=n(491),p=n(992);n(33);o.inject();var f={findDOMNode:c,render:a.render,unmountComponentAtNode:a.unmountComponentAtNode,version:u,unstable_batchedUpdates:s.batchedUpdates,unstable_renderSubtreeIntoContainer:p};\"undefined\"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&\"function\"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ComponentTree:{getClosestInstanceFromNode:r.getClosestInstanceFromNode,getNodeFromInstance:function(e){return e._renderedComponent&&(e=l(e)),e?r.getNodeFromInstance(e):null}},Mount:a,Reconciler:i}),e.exports=f},function(e,t,n){\"use strict\";var r=n(919),o=n(920),a=n(924),i=n(927),s=n(928),u=n(929),c=n(930),l=n(936),p=n(45),f=n(961),h=n(962),d=n(963),m=n(964),v=n(965),g=n(967),y=n(968),b=n(974),_=n(975),w=n(976),x=!1;e.exports={inject:function(){x||(x=!0,g.EventEmitter.injectReactEventListener(v),g.EventPluginHub.injectEventPluginOrder(i),g.EventPluginUtils.injectComponentTree(p),g.EventPluginUtils.injectTreeTraversal(h),g.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:w,EnterLeaveEventPlugin:s,ChangeEventPlugin:a,SelectEventPlugin:_,BeforeInputEventPlugin:o}),g.HostComponent.injectGenericComponentClass(l),g.HostComponent.injectTextComponentClass(d),g.DOMProperty.injectDOMPropertyConfig(r),g.DOMProperty.injectDOMPropertyConfig(u),g.DOMProperty.injectDOMPropertyConfig(b),g.EmptyComponent.injectEmptyComponentFactory((function(e){return new f(e)})),g.Updates.injectReconcileTransaction(y),g.Updates.injectBatchingStrategy(m),g.Component.injectEnvironment(c))}}},function(e,t,n){\"use strict\";e.exports={Properties:{\"aria-current\":0,\"aria-details\":0,\"aria-disabled\":0,\"aria-hidden\":0,\"aria-invalid\":0,\"aria-keyshortcuts\":0,\"aria-label\":0,\"aria-roledescription\":0,\"aria-autocomplete\":0,\"aria-checked\":0,\"aria-expanded\":0,\"aria-haspopup\":0,\"aria-level\":0,\"aria-modal\":0,\"aria-multiline\":0,\"aria-multiselectable\":0,\"aria-orientation\":0,\"aria-placeholder\":0,\"aria-pressed\":0,\"aria-readonly\":0,\"aria-required\":0,\"aria-selected\":0,\"aria-sort\":0,\"aria-valuemax\":0,\"aria-valuemin\":0,\"aria-valuenow\":0,\"aria-valuetext\":0,\"aria-atomic\":0,\"aria-busy\":0,\"aria-live\":0,\"aria-relevant\":0,\"aria-dropeffect\":0,\"aria-grabbed\":0,\"aria-activedescendant\":0,\"aria-colcount\":0,\"aria-colindex\":0,\"aria-colspan\":0,\"aria-controls\":0,\"aria-describedby\":0,\"aria-errormessage\":0,\"aria-flowto\":0,\"aria-labelledby\":0,\"aria-owns\":0,\"aria-posinset\":0,\"aria-rowcount\":0,\"aria-rowindex\":0,\"aria-rowspan\":0,\"aria-setsize\":0},DOMAttributeNames:{},DOMPropertyNames:{}}},function(e,t,n){\"use strict\";var r=n(165),o=n(56),a=n(921),i=n(922),s=n(923),u=[9,13,27,32],c=o.canUseDOM&&\"CompositionEvent\"in window,l=null;o.canUseDOM&&\"documentMode\"in document&&(l=document.documentMode);var p,f=o.canUseDOM&&\"TextEvent\"in window&&!l&&!(\"object\"==typeof(p=window.opera)&&\"function\"==typeof p.version&&parseInt(p.version(),10)<=12),h=o.canUseDOM&&(!c||l&&l>8&&l<=11);var d=String.fromCharCode(32),m={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"topCompositionEnd\",\"topKeyPress\",\"topTextInput\",\"topPaste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:[\"topBlur\",\"topCompositionEnd\",\"topKeyDown\",\"topKeyPress\",\"topKeyUp\",\"topMouseDown\"]},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",captured:\"onCompositionStartCapture\"},dependencies:[\"topBlur\",\"topCompositionStart\",\"topKeyDown\",\"topKeyPress\",\"topKeyUp\",\"topMouseDown\"]},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:[\"topBlur\",\"topCompositionUpdate\",\"topKeyDown\",\"topKeyPress\",\"topKeyUp\",\"topMouseDown\"]}},v=!1;function g(e,t){switch(e){case\"topKeyUp\":return-1!==u.indexOf(t.keyCode);case\"topKeyDown\":return 229!==t.keyCode;case\"topKeyPress\":case\"topMouseDown\":case\"topBlur\":return!0;default:return!1}}function y(e){var t=e.detail;return\"object\"==typeof t&&\"data\"in t?t.data:null}var b=null;function _(e,t,n,o){var s,u;if(c?s=function(e){switch(e){case\"topCompositionStart\":return m.compositionStart;case\"topCompositionEnd\":return m.compositionEnd;case\"topCompositionUpdate\":return m.compositionUpdate}}(e):b?g(e,n)&&(s=m.compositionEnd):function(e,t){return\"topKeyDown\"===e&&229===t.keyCode}(e,n)&&(s=m.compositionStart),!s)return null;h&&(b||s!==m.compositionStart?s===m.compositionEnd&&b&&(u=b.getData()):b=a.getPooled(o));var l=i.getPooled(s,t,n,o);if(u)l.data=u;else{var p=y(n);null!==p&&(l.data=p)}return r.accumulateTwoPhaseDispatches(l),l}function w(e,t,n,o){var i;if(!(i=f?function(e,t){switch(e){case\"topCompositionEnd\":return y(t);case\"topKeyPress\":return 32!==t.which?null:(v=!0,d);case\"topTextInput\":var n=t.data;return n===d&&v?null:n;default:return null}}(e,n):function(e,t){if(b){if(\"topCompositionEnd\"===e||!c&&g(e,t)){var n=b.getData();return a.release(b),b=null,n}return null}switch(e){case\"topPaste\":return null;case\"topKeyPress\":return t.which&&!function(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.altKey)}(t)?String.fromCharCode(t.which):null;case\"topCompositionEnd\":return h?null:t.data;default:return null}}(e,n)))return null;var u=s.getPooled(m.beforeInput,t,n,o);return u.data=i,r.accumulateTwoPhaseDispatches(u),u}var x={eventTypes:m,extractEvents:function(e,t,n,r){return[_(e,t,n,r),w(e,t,n,r)]}};e.exports=x},function(e,t,n){\"use strict\";var r=n(38),o=n(122),a=n(470);function i(e){this._root=e,this._startText=this.getText(),this._fallbackText=null}r(i.prototype,{destructor:function(){this._root=null,this._startText=null,this._fallbackText=null},getText:function(){return\"value\"in this._root?this._root.value:this._root[a()]},getData:function(){if(this._fallbackText)return this._fallbackText;var e,t,n=this._startText,r=n.length,o=this.getText(),a=o.length;for(e=0;e<r&&n[e]===o[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===o[a-t];t++);var s=t>1?1-t:void 0;return this._fallbackText=o.slice(e,s),this._fallbackText}}),o.addPoolingTo(i),e.exports=i},function(e,t,n){\"use strict\";var r=n(91);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{data:null}),e.exports=o},function(e,t,n){\"use strict\";var r=n(91);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{data:null}),e.exports=o},function(e,t,n){\"use strict\";var r=n(166),o=n(165),a=n(56),i=n(45),s=n(80),u=n(91),c=n(473),l=n(264),p=n(265),f=n(474),h={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:[\"topBlur\",\"topChange\",\"topClick\",\"topFocus\",\"topInput\",\"topKeyDown\",\"topKeyUp\",\"topSelectionChange\"]}};function d(e,t,n){var r=u.getPooled(h.change,e,t,n);return r.type=\"change\",o.accumulateTwoPhaseDispatches(r),r}var m=null,v=null;var g=!1;function y(e){var t=d(v,e,l(e));s.batchedUpdates(b,t)}function b(e){r.enqueueEvents(e),r.processEventQueue(!1)}function _(){m&&(m.detachEvent(\"onchange\",y),m=null,v=null)}function w(e,t){var n=c.updateValueIfChanged(e),r=!0===t.simulated&&I._allowSimulatedPassThrough;if(n||r)return e}function x(e,t){if(\"topChange\"===e)return t}function E(e,t,n){\"topFocus\"===e?(_(),function(e,t){v=t,(m=e).attachEvent(\"onchange\",y)}(t,n)):\"topBlur\"===e&&_()}a.canUseDOM&&(g=p(\"change\")&&(!document.documentMode||document.documentMode>8));var S=!1;function C(){m&&(m.detachEvent(\"onpropertychange\",A),m=null,v=null)}function A(e){\"value\"===e.propertyName&&w(v,e)&&y(e)}function k(e,t,n){\"topFocus\"===e?(C(),function(e,t){v=t,(m=e).attachEvent(\"onpropertychange\",A)}(t,n)):\"topBlur\"===e&&C()}function O(e,t,n){if(\"topSelectionChange\"===e||\"topKeyUp\"===e||\"topKeyDown\"===e)return w(v,n)}function j(e,t,n){if(\"topClick\"===e)return w(t,n)}function T(e,t,n){if(\"topInput\"===e||\"topChange\"===e)return w(t,n)}a.canUseDOM&&(S=p(\"input\")&&(!document.documentMode||document.documentMode>9));var I={eventTypes:h,_allowSimulatedPassThrough:!0,_isInputEventSupported:S,extractEvents:function(e,t,n,r){var o,a,s,u,c=t?i.getNodeFromInstance(t):window;if(\"select\"===(u=(s=c).nodeName&&s.nodeName.toLowerCase())||\"input\"===u&&\"file\"===s.type?g?o=x:a=E:f(c)?S?o=T:(o=O,a=k):function(e){var t=e.nodeName;return t&&\"input\"===t.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)}(c)&&(o=j),o){var l=o(e,t,n);if(l)return d(l,n,r)}a&&a(e,c,t),\"topBlur\"===e&&function(e,t){if(null!=e){var n=e._wrapperState||t._wrapperState;if(n&&n.controlled&&\"number\"===t.type){var r=\"\"+t.value;t.getAttribute(\"value\")!==r&&t.setAttribute(\"value\",r)}}}(t,c)}};e.exports=I},function(e,t,n){\"use strict\";var r=n(926),o={};o.attachRefs=function(e,t){if(null!==t&&\"object\"==typeof t){var n=t.ref;null!=n&&function(e,t,n){\"function\"==typeof e?e(t.getPublicInstance()):r.addComponentAsRefTo(t,e,n)}(n,e,t._owner)}},o.shouldUpdateRefs=function(e,t){var n=null,r=null;null!==e&&\"object\"==typeof e&&(n=e.ref,r=e._owner);var o=null,a=null;return null!==t&&\"object\"==typeof t&&(o=t.ref,a=t._owner),n!==o||\"string\"==typeof o&&a!==r},o.detachRefs=function(e,t){if(null!==t&&\"object\"==typeof t){var n=t.ref;null!=n&&function(e,t,n){\"function\"==typeof e?e(null):r.removeComponentAsRefFrom(t,e,n)}(n,e,t._owner)}},e.exports=o},function(e,t,n){\"use strict\";var r=n(30);n(25);function o(e){return!(!e||\"function\"!=typeof e.attachRef||\"function\"!=typeof e.detachRef)}var a={addComponentAsRefTo:function(e,t,n){o(n)||r(\"119\"),n.attachRef(t,e)},removeComponentAsRefFrom:function(e,t,n){o(n)||r(\"120\");var a=n.getPublicInstance();a&&a.refs[t]===e.getPublicInstance()&&n.detachRef(t)}};e.exports=a},function(e,t,n){\"use strict\";e.exports=[\"ResponderEventPlugin\",\"SimpleEventPlugin\",\"TapEventPlugin\",\"EnterLeaveEventPlugin\",\"ChangeEventPlugin\",\"SelectEventPlugin\",\"BeforeInputEventPlugin\"]},function(e,t,n){\"use strict\";var r=n(165),o=n(45),a=n(203),i={mouseEnter:{registrationName:\"onMouseEnter\",dependencies:[\"topMouseOut\",\"topMouseOver\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"topMouseOut\",\"topMouseOver\"]}},s={eventTypes:i,extractEvents:function(e,t,n,s){if(\"topMouseOver\"===e&&(n.relatedTarget||n.fromElement))return null;if(\"topMouseOut\"!==e&&\"topMouseOver\"!==e)return null;var u,c,l;if(s.window===s)u=s;else{var p=s.ownerDocument;u=p?p.defaultView||p.parentWindow:window}if(\"topMouseOut\"===e){c=t;var f=n.relatedTarget||n.toElement;l=f?o.getClosestInstanceFromNode(f):null}else c=null,l=t;if(c===l)return null;var h=null==c?u:o.getNodeFromInstance(c),d=null==l?u:o.getNodeFromInstance(l),m=a.getPooled(i.mouseLeave,c,n,s);m.type=\"mouseleave\",m.target=h,m.relatedTarget=d;var v=a.getPooled(i.mouseEnter,l,n,s);return v.type=\"mouseenter\",v.target=d,v.relatedTarget=h,r.accumulateEnterLeaveDispatches(m,v,c,l),[m,v]}};e.exports=s},function(e,t,n){\"use strict\";var r=n(140),o=r.injection.MUST_USE_PROPERTY,a=r.injection.HAS_BOOLEAN_VALUE,i=r.injection.HAS_NUMERIC_VALUE,s=r.injection.HAS_POSITIVE_NUMERIC_VALUE,u=r.injection.HAS_OVERLOADED_BOOLEAN_VALUE,c={isCustomAttribute:RegExp.prototype.test.bind(new RegExp(\"^(data|aria)-[\"+r.ATTRIBUTE_NAME_CHAR+\"]*$\")),Properties:{accept:0,acceptCharset:0,accessKey:0,action:0,allowFullScreen:a,allowTransparency:0,alt:0,as:0,async:a,autoComplete:0,autoPlay:a,capture:a,cellPadding:0,cellSpacing:0,charSet:0,challenge:0,checked:o|a,cite:0,classID:0,className:0,cols:s,colSpan:0,content:0,contentEditable:0,contextMenu:0,controls:a,controlsList:0,coords:0,crossOrigin:0,data:0,dateTime:0,default:a,defer:a,dir:0,disabled:a,download:u,draggable:0,encType:0,form:0,formAction:0,formEncType:0,formMethod:0,formNoValidate:a,formTarget:0,frameBorder:0,headers:0,height:0,hidden:a,high:0,href:0,hrefLang:0,htmlFor:0,httpEquiv:0,icon:0,id:0,inputMode:0,integrity:0,is:0,keyParams:0,keyType:0,kind:0,label:0,lang:0,list:0,loop:a,low:0,manifest:0,marginHeight:0,marginWidth:0,max:0,maxLength:0,media:0,mediaGroup:0,method:0,min:0,minLength:0,multiple:o|a,muted:o|a,name:0,nonce:0,noValidate:a,open:a,optimum:0,pattern:0,placeholder:0,playsInline:a,poster:0,preload:0,profile:0,radioGroup:0,readOnly:a,referrerPolicy:0,rel:0,required:a,reversed:a,role:0,rows:s,rowSpan:i,sandbox:0,scope:0,scoped:a,scrolling:0,seamless:a,selected:o|a,shape:0,size:s,sizes:0,span:s,spellCheck:0,src:0,srcDoc:0,srcLang:0,srcSet:0,start:i,step:0,style:0,summary:0,tabIndex:0,target:0,title:0,type:0,useMap:0,value:0,width:0,wmode:0,wrap:0,about:0,datatype:0,inlist:0,prefix:0,property:0,resource:0,typeof:0,vocab:0,autoCapitalize:0,autoCorrect:0,autoSave:0,color:0,itemProp:0,itemScope:a,itemType:0,itemID:0,itemRef:0,results:0,security:0,unselectable:0},DOMAttributeNames:{acceptCharset:\"accept-charset\",className:\"class\",htmlFor:\"for\",httpEquiv:\"http-equiv\"},DOMPropertyNames:{},DOMMutationMethods:{value:function(e,t){if(null==t)return e.removeAttribute(\"value\");(\"number\"!==e.type||!1===e.hasAttribute(\"value\")||e.validity&&!e.validity.badInput&&e.ownerDocument.activeElement!==e)&&e.setAttribute(\"value\",\"\"+t)}}};e.exports=c},function(e,t,n){\"use strict\";var r=n(267),o={processChildrenUpdates:n(935).dangerouslyProcessChildrenUpdates,replaceNodeWithMarkup:r.dangerouslyReplaceNodeWithMarkup};e.exports=o},function(e,t,n){\"use strict\";var r=n(30),o=n(142),a=n(56),i=n(932),s=n(79),u=(n(25),{dangerouslyReplaceNodeWithMarkup:function(e,t){if(a.canUseDOM||r(\"56\"),t||r(\"57\"),\"HTML\"===e.nodeName&&r(\"58\"),\"string\"==typeof t){var n=i(t,s)[0];e.parentNode.replaceChild(n,e)}else o.replaceChildWithTree(e,t)}});e.exports=u},function(e,t,n){\"use strict\";var r=n(56),o=n(933),a=n(934),i=n(25),s=r.canUseDOM?document.createElement(\"div\"):null,u=/^\\s*<(\\w+)/;e.exports=function(e,t){var n=s;s||i(!1);var r=function(e){var t=e.match(u);return t&&t[1].toLowerCase()}(e),c=r&&a(r);if(c){n.innerHTML=c[1]+e+c[2];for(var l=c[0];l--;)n=n.lastChild}else n.innerHTML=e;var p=n.getElementsByTagName(\"script\");p.length&&(t||i(!1),o(p).forEach(t));for(var f=Array.from(n.childNodes);n.lastChild;)n.removeChild(n.lastChild);return f}},function(e,t,n){\"use strict\";var r=n(25);e.exports=function(e){return function(e){return!!e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"length\"in e&&!(\"setInterval\"in e)&&\"number\"!=typeof e.nodeType&&(Array.isArray(e)||\"callee\"in e||\"item\"in e)}(e)?Array.isArray(e)?e.slice():function(e){var t=e.length;if((Array.isArray(e)||\"object\"!=typeof e&&\"function\"!=typeof e)&&r(!1),\"number\"!=typeof t&&r(!1),0===t||t-1 in e||r(!1),\"function\"==typeof e.callee&&r(!1),e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(e){}for(var n=Array(t),o=0;o<t;o++)n[o]=e[o];return n}(e):[e]}},function(e,t,n){\"use strict\";var r=n(56),o=n(25),a=r.canUseDOM?document.createElement(\"div\"):null,i={},s=[1,'<select multiple=\"true\">',\"</select>\"],u=[1,\"<table>\",\"</table>\"],c=[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],l=[1,'<svg xmlns=\"http://www.w3.org/2000/svg\">',\"</svg>\"],p={\"*\":[1,\"?<div>\",\"</div>\"],area:[1,\"<map>\",\"</map>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],param:[1,\"<object>\",\"</object>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],optgroup:s,option:s,caption:u,colgroup:u,tbody:u,tfoot:u,thead:u,td:c,th:c};[\"circle\",\"clipPath\",\"defs\",\"ellipse\",\"g\",\"image\",\"line\",\"linearGradient\",\"mask\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialGradient\",\"rect\",\"stop\",\"text\",\"tspan\"].forEach((function(e){p[e]=l,i[e]=!0})),e.exports=function(e){return a||o(!1),p.hasOwnProperty(e)||(e=\"*\"),i.hasOwnProperty(e)||(a.innerHTML=\"*\"===e?\"<link />\":\"<\"+e+\"></\"+e+\">\",i[e]=!a.firstChild),i[e]?p[e]:null}},function(e,t,n){\"use strict\";var r=n(267),o=n(45),a={dangerouslyProcessChildrenUpdates:function(e,t){var n=o.getNodeFromInstance(e);r.processUpdates(n,t)}};e.exports=a},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(937),i=n(938),s=n(142),u=n(268),c=n(140),l=n(479),p=n(166),f=n(261),h=n(206),d=n(467),m=n(45),v=n(948),g=n(950),y=n(480),b=n(951),_=(n(72),n(952)),w=n(959),x=(n(79),n(205)),E=(n(25),n(265),n(272),n(473)),S=(n(276),n(33),d),C=p.deleteListener,A=m.getNodeFromInstance,k=h.listenTo,O=f.registrationNameModules,j={string:!0,number:!0},T=\"style\",I={children:null,dangerouslySetInnerHTML:null,suppressContentEditableWarning:null};function P(e,t){t&&(W[e._tag]&&(null!=t.children||null!=t.dangerouslySetInnerHTML)&&r(\"137\",e._tag,e._currentElement._owner?\" Check the render method of \"+e._currentElement._owner.getName()+\".\":\"\"),null!=t.dangerouslySetInnerHTML&&(null!=t.children&&r(\"60\"),\"object\"==typeof t.dangerouslySetInnerHTML&&\"__html\"in t.dangerouslySetInnerHTML||r(\"61\")),null!=t.style&&\"object\"!=typeof t.style&&r(\"62\",function(e){if(e){var t=e._currentElement._owner||null;if(t){var n=t.getName();if(n)return\" This DOM node was rendered by `\"+n+\"`.\"}}return\"\"}(e)))}function N(e,t,n,r){if(!(r instanceof w)){0;var o=e._hostContainerInfo,a=o._node&&11===o._node.nodeType?o._node:o._ownerDocument;k(t,a),r.getReactMountReady().enqueue(M,{inst:e,registrationName:t,listener:n})}}function M(){var e=this;p.putListener(e.inst,e.registrationName,e.listener)}function R(){v.postMountWrapper(this)}function D(){b.postMountWrapper(this)}function L(){g.postMountWrapper(this)}var B={topAbort:\"abort\",topCanPlay:\"canplay\",topCanPlayThrough:\"canplaythrough\",topDurationChange:\"durationchange\",topEmptied:\"emptied\",topEncrypted:\"encrypted\",topEnded:\"ended\",topError:\"error\",topLoadedData:\"loadeddata\",topLoadedMetadata:\"loadedmetadata\",topLoadStart:\"loadstart\",topPause:\"pause\",topPlay:\"play\",topPlaying:\"playing\",topProgress:\"progress\",topRateChange:\"ratechange\",topSeeked:\"seeked\",topSeeking:\"seeking\",topStalled:\"stalled\",topSuspend:\"suspend\",topTimeUpdate:\"timeupdate\",topVolumeChange:\"volumechange\",topWaiting:\"waiting\"};function F(){E.track(this)}function U(){var e=this;e._rootNodeID||r(\"63\");var t=A(e);switch(t||r(\"64\"),e._tag){case\"iframe\":case\"object\":e._wrapperState.listeners=[h.trapBubbledEvent(\"topLoad\",\"load\",t)];break;case\"video\":case\"audio\":for(var n in e._wrapperState.listeners=[],B)B.hasOwnProperty(n)&&e._wrapperState.listeners.push(h.trapBubbledEvent(n,B[n],t));break;case\"source\":e._wrapperState.listeners=[h.trapBubbledEvent(\"topError\",\"error\",t)];break;case\"img\":e._wrapperState.listeners=[h.trapBubbledEvent(\"topError\",\"error\",t),h.trapBubbledEvent(\"topLoad\",\"load\",t)];break;case\"form\":e._wrapperState.listeners=[h.trapBubbledEvent(\"topReset\",\"reset\",t),h.trapBubbledEvent(\"topSubmit\",\"submit\",t)];break;case\"input\":case\"select\":case\"textarea\":e._wrapperState.listeners=[h.trapBubbledEvent(\"topInvalid\",\"invalid\",t)]}}function q(){y.postUpdateWrapper(this)}var z={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},V={listing:!0,pre:!0,textarea:!0},W=o({menuitem:!0},z),H=/^[a-zA-Z][a-zA-Z:_\\.\\-\\d]*$/,$={},J={}.hasOwnProperty;function K(e,t){return e.indexOf(\"-\")>=0||null!=t.is}var Y=1;function G(e){var t=e.type;!function(e){J.call($,e)||(H.test(e)||r(\"65\",e),$[e]=!0)}(t),this._currentElement=e,this._tag=t.toLowerCase(),this._namespaceURI=null,this._renderedChildren=null,this._previousStyle=null,this._previousStyleCopy=null,this._hostNode=null,this._hostParent=null,this._rootNodeID=0,this._domID=0,this._hostContainerInfo=null,this._wrapperState=null,this._topLevelWrapper=null,this._flags=0}G.displayName=\"ReactDOMComponent\",G.Mixin={mountComponent:function(e,t,n,r){this._rootNodeID=Y++,this._domID=n._idCounter++,this._hostParent=t,this._hostContainerInfo=n;var o,i,c,p=this._currentElement.props;switch(this._tag){case\"audio\":case\"form\":case\"iframe\":case\"img\":case\"link\":case\"object\":case\"source\":case\"video\":this._wrapperState={listeners:null},e.getReactMountReady().enqueue(U,this);break;case\"input\":v.mountWrapper(this,p,t),p=v.getHostProps(this,p),e.getReactMountReady().enqueue(F,this),e.getReactMountReady().enqueue(U,this);break;case\"option\":g.mountWrapper(this,p,t),p=g.getHostProps(this,p);break;case\"select\":y.mountWrapper(this,p,t),p=y.getHostProps(this,p),e.getReactMountReady().enqueue(U,this);break;case\"textarea\":b.mountWrapper(this,p,t),p=b.getHostProps(this,p),e.getReactMountReady().enqueue(F,this),e.getReactMountReady().enqueue(U,this)}if(P(this,p),null!=t?(o=t._namespaceURI,i=t._tag):n._tag&&(o=n._namespaceURI,i=n._tag),(null==o||o===u.svg&&\"foreignobject\"===i)&&(o=u.html),o===u.html&&(\"svg\"===this._tag?o=u.svg:\"math\"===this._tag&&(o=u.mathml)),this._namespaceURI=o,e.useCreateElement){var f,h=n._ownerDocument;if(o===u.html)if(\"script\"===this._tag){var d=h.createElement(\"div\"),_=this._currentElement.type;d.innerHTML=\"<\"+_+\"></\"+_+\">\",f=d.removeChild(d.firstChild)}else f=p.is?h.createElement(this._currentElement.type,p.is):h.createElement(this._currentElement.type);else f=h.createElementNS(o,this._currentElement.type);m.precacheNode(this,f),this._flags|=S.hasCachedChildNodes,this._hostParent||l.setAttributeForRoot(f),this._updateDOMProperties(null,p,e);var w=s(f);this._createInitialChildren(e,p,r,w),c=w}else{var x=this._createOpenTagMarkupAndPutListeners(e,p),E=this._createContentMarkup(e,p,r);c=!E&&z[this._tag]?x+\"/>\":x+\">\"+E+\"</\"+this._currentElement.type+\">\"}switch(this._tag){case\"input\":e.getReactMountReady().enqueue(R,this),p.autoFocus&&e.getReactMountReady().enqueue(a.focusDOMComponent,this);break;case\"textarea\":e.getReactMountReady().enqueue(D,this),p.autoFocus&&e.getReactMountReady().enqueue(a.focusDOMComponent,this);break;case\"select\":case\"button\":p.autoFocus&&e.getReactMountReady().enqueue(a.focusDOMComponent,this);break;case\"option\":e.getReactMountReady().enqueue(L,this)}return c},_createOpenTagMarkupAndPutListeners:function(e,t){var n=\"<\"+this._currentElement.type;for(var r in t)if(t.hasOwnProperty(r)){var a=t[r];if(null!=a)if(O.hasOwnProperty(r))a&&N(this,r,a,e);else{r===T&&(a&&(a=this._previousStyleCopy=o({},t.style)),a=i.createMarkupForStyles(a,this));var s=null;null!=this._tag&&K(this._tag,t)?I.hasOwnProperty(r)||(s=l.createMarkupForCustomAttribute(r,a)):s=l.createMarkupForProperty(r,a),s&&(n+=\" \"+s)}}return e.renderToStaticMarkup?n:(this._hostParent||(n+=\" \"+l.createMarkupForRoot()),n+=\" \"+l.createMarkupForID(this._domID))},_createContentMarkup:function(e,t,n){var r=\"\",o=t.dangerouslySetInnerHTML;if(null!=o)null!=o.__html&&(r=o.__html);else{var a=j[typeof t.children]?t.children:null,i=null!=a?null:t.children;if(null!=a)r=x(a);else if(null!=i){r=this.mountChildren(i,e,n).join(\"\")}}return V[this._tag]&&\"\\n\"===r.charAt(0)?\"\\n\"+r:r},_createInitialChildren:function(e,t,n,r){var o=t.dangerouslySetInnerHTML;if(null!=o)null!=o.__html&&s.queueHTML(r,o.__html);else{var a=j[typeof t.children]?t.children:null,i=null!=a?null:t.children;if(null!=a)\"\"!==a&&s.queueText(r,a);else if(null!=i)for(var u=this.mountChildren(i,e,n),c=0;c<u.length;c++)s.queueChild(r,u[c])}},receiveComponent:function(e,t,n){var r=this._currentElement;this._currentElement=e,this.updateComponent(t,r,e,n)},updateComponent:function(e,t,n,r){var o=t.props,a=this._currentElement.props;switch(this._tag){case\"input\":o=v.getHostProps(this,o),a=v.getHostProps(this,a);break;case\"option\":o=g.getHostProps(this,o),a=g.getHostProps(this,a);break;case\"select\":o=y.getHostProps(this,o),a=y.getHostProps(this,a);break;case\"textarea\":o=b.getHostProps(this,o),a=b.getHostProps(this,a)}switch(P(this,a),this._updateDOMProperties(o,a,e),this._updateDOMChildren(o,a,e,r),this._tag){case\"input\":v.updateWrapper(this),E.updateValueIfChanged(this);break;case\"textarea\":b.updateWrapper(this);break;case\"select\":e.getReactMountReady().enqueue(q,this)}},_updateDOMProperties:function(e,t,n){var r,a,s;for(r in e)if(!t.hasOwnProperty(r)&&e.hasOwnProperty(r)&&null!=e[r])if(r===T){var u=this._previousStyleCopy;for(a in u)u.hasOwnProperty(a)&&((s=s||{})[a]=\"\");this._previousStyleCopy=null}else O.hasOwnProperty(r)?e[r]&&C(this,r):K(this._tag,e)?I.hasOwnProperty(r)||l.deleteValueForAttribute(A(this),r):(c.properties[r]||c.isCustomAttribute(r))&&l.deleteValueForProperty(A(this),r);for(r in t){var p=t[r],f=r===T?this._previousStyleCopy:null!=e?e[r]:void 0;if(t.hasOwnProperty(r)&&p!==f&&(null!=p||null!=f))if(r===T)if(p?p=this._previousStyleCopy=o({},p):this._previousStyleCopy=null,f){for(a in f)!f.hasOwnProperty(a)||p&&p.hasOwnProperty(a)||((s=s||{})[a]=\"\");for(a in p)p.hasOwnProperty(a)&&f[a]!==p[a]&&((s=s||{})[a]=p[a])}else s=p;else if(O.hasOwnProperty(r))p?N(this,r,p,n):f&&C(this,r);else if(K(this._tag,t))I.hasOwnProperty(r)||l.setValueForAttribute(A(this),r,p);else if(c.properties[r]||c.isCustomAttribute(r)){var h=A(this);null!=p?l.setValueForProperty(h,r,p):l.deleteValueForProperty(h,r)}}s&&i.setValueForStyles(A(this),s,this)},_updateDOMChildren:function(e,t,n,r){var o=j[typeof e.children]?e.children:null,a=j[typeof t.children]?t.children:null,i=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,s=t.dangerouslySetInnerHTML&&t.dangerouslySetInnerHTML.__html,u=null!=o?null:e.children,c=null!=a?null:t.children,l=null!=o||null!=i,p=null!=a||null!=s;null!=u&&null==c?this.updateChildren(null,n,r):l&&!p&&this.updateTextContent(\"\"),null!=a?o!==a&&this.updateTextContent(\"\"+a):null!=s?i!==s&&this.updateMarkup(\"\"+s):null!=c&&this.updateChildren(c,n,r)},getHostNode:function(){return A(this)},unmountComponent:function(e){switch(this._tag){case\"audio\":case\"form\":case\"iframe\":case\"img\":case\"link\":case\"object\":case\"source\":case\"video\":var t=this._wrapperState.listeners;if(t)for(var n=0;n<t.length;n++)t[n].remove();break;case\"input\":case\"textarea\":E.stopTracking(this);break;case\"html\":case\"head\":case\"body\":r(\"66\",this._tag)}this.unmountChildren(e),m.uncacheNode(this),p.deleteAllListeners(this),this._rootNodeID=0,this._domID=0,this._wrapperState=null},getPublicInstance:function(){return A(this)}},o(G.prototype,G.Mixin,_.Mixin),e.exports=G},function(e,t,n){\"use strict\";var r=n(45),o=n(477),a={focusDOMComponent:function(){o(r.getNodeFromInstance(this))}};e.exports=a},function(e,t,n){\"use strict\";var r=n(478),o=n(56),a=(n(72),n(939),n(941)),i=n(942),s=n(944),u=(n(33),s((function(e){return i(e)}))),c=!1,l=\"cssFloat\";if(o.canUseDOM){var p=document.createElement(\"div\").style;try{p.font=\"\"}catch(e){c=!0}void 0===document.documentElement.style.cssFloat&&(l=\"styleFloat\")}var f={createMarkupForStyles:function(e,t){var n=\"\";for(var r in e)if(e.hasOwnProperty(r)){var o=0===r.indexOf(\"--\"),i=e[r];0,null!=i&&(n+=u(r)+\":\",n+=a(r,i,t,o)+\";\")}return n||null},setValueForStyles:function(e,t,n){var o=e.style;for(var i in t)if(t.hasOwnProperty(i)){var s=0===i.indexOf(\"--\");0;var u=a(i,t[i],n,s);if(\"float\"!==i&&\"cssFloat\"!==i||(i=l),s)o.setProperty(i,u);else if(u)o[i]=u;else{var p=c&&r.shorthandPropertyExpansions[i];if(p)for(var f in p)o[f]=\"\";else o[i]=\"\"}}}};e.exports=f},function(e,t,n){\"use strict\";var r=n(940),o=/^-ms-/;e.exports=function(e){return r(e.replace(o,\"ms-\"))}},function(e,t,n){\"use strict\";var r=/-(.)/g;e.exports=function(e){return e.replace(r,(function(e,t){return t.toUpperCase()}))}},function(e,t,n){\"use strict\";var r=n(478),o=(n(33),r.isUnitlessNumber);e.exports=function(e,t,n,r){if(null==t||\"boolean\"==typeof t||\"\"===t)return\"\";var a=isNaN(t);return r||a||0===t||o.hasOwnProperty(e)&&o[e]?\"\"+t:(\"string\"==typeof t&&(t=t.trim()),t+\"px\")}},function(e,t,n){\"use strict\";var r=n(943),o=/^ms-/;e.exports=function(e){return r(e).replace(o,\"-ms-\")}},function(e,t,n){\"use strict\";var r=/([A-Z])/g;e.exports=function(e){return e.replace(r,\"-$1\").toLowerCase()}},function(e,t,n){\"use strict\";e.exports=function(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n]}}},function(e,t,n){\"use strict\";var r=n(205);e.exports=function(e){return'\"'+r(e)+'\"'}},function(e,t,n){\"use strict\";var r=n(166);var o={handleTopLevel:function(e,t,n,o){!function(e){r.enqueueEvents(e),r.processEventQueue(!1)}(r.extractEvents(e,t,n,o))}};e.exports=o},function(e,t,n){\"use strict\";var r=n(56);function o(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n[\"Webkit\"+e]=\"webkit\"+t,n[\"Moz\"+e]=\"moz\"+t,n[\"ms\"+e]=\"MS\"+t,n[\"O\"+e]=\"o\"+t.toLowerCase(),n}var a={animationend:o(\"Animation\",\"AnimationEnd\"),animationiteration:o(\"Animation\",\"AnimationIteration\"),animationstart:o(\"Animation\",\"AnimationStart\"),transitionend:o(\"Transition\",\"TransitionEnd\")},i={},s={};r.canUseDOM&&(s=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete a.animationend.animation,delete a.animationiteration.animation,delete a.animationstart.animation),\"TransitionEvent\"in window||delete a.transitionend.transition),e.exports=function(e){if(i[e])return i[e];if(!a[e])return e;var t=a[e];for(var n in t)if(t.hasOwnProperty(n)&&n in s)return i[e]=t[n];return\"\"}},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(479),i=n(270),s=n(45),u=n(80);n(25),n(33);function c(){this._rootNodeID&&p.updateWrapper(this)}function l(e){return\"checkbox\"===e.type||\"radio\"===e.type?null!=e.checked:null!=e.value}var p={getHostProps:function(e,t){var n=i.getValue(t),r=i.getChecked(t);return o({type:void 0,step:void 0,min:void 0,max:void 0},t,{defaultChecked:void 0,defaultValue:void 0,value:null!=n?n:e._wrapperState.initialValue,checked:null!=r?r:e._wrapperState.initialChecked,onChange:e._wrapperState.onChange})},mountWrapper:function(e,t){var n=t.defaultValue;e._wrapperState={initialChecked:null!=t.checked?t.checked:t.defaultChecked,initialValue:null!=t.value?t.value:n,listeners:null,onChange:f.bind(e),controlled:l(t)}},updateWrapper:function(e){var t=e._currentElement.props,n=t.checked;null!=n&&a.setValueForProperty(s.getNodeFromInstance(e),\"checked\",n||!1);var r=s.getNodeFromInstance(e),o=i.getValue(t);if(null!=o)if(0===o&&\"\"===r.value)r.value=\"0\";else if(\"number\"===t.type){var u=parseFloat(r.value,10)||0;(o!=u||o==u&&r.value!=o)&&(r.value=\"\"+o)}else r.value!==\"\"+o&&(r.value=\"\"+o);else null==t.value&&null!=t.defaultValue&&r.defaultValue!==\"\"+t.defaultValue&&(r.defaultValue=\"\"+t.defaultValue),null==t.checked&&null!=t.defaultChecked&&(r.defaultChecked=!!t.defaultChecked)},postMountWrapper:function(e){var t=e._currentElement.props,n=s.getNodeFromInstance(e);switch(t.type){case\"submit\":case\"reset\":break;case\"color\":case\"date\":case\"datetime\":case\"datetime-local\":case\"month\":case\"time\":case\"week\":n.value=\"\",n.value=n.defaultValue;break;default:n.value=n.value}var r=n.name;\"\"!==r&&(n.name=\"\"),n.defaultChecked=!n.defaultChecked,n.defaultChecked=!n.defaultChecked,\"\"!==r&&(n.name=r)}};function f(e){var t=this._currentElement.props,n=i.executeOnChange(t,e);u.asap(c,this);var o=t.name;if(\"radio\"===t.type&&null!=o){for(var a=s.getNodeFromInstance(this),l=a;l.parentNode;)l=l.parentNode;for(var p=l.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+o)+'][type=\"radio\"]'),f=0;f<p.length;f++){var h=p[f];if(h!==a&&h.form===a.form){var d=s.getInstanceFromNode(h);d||r(\"90\"),u.asap(c,d)}}}return n}e.exports=p},function(e,t,n){\"use strict\";e.exports=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\"},function(e,t,n){\"use strict\";var r=n(38),o=n(132),a=n(45),i=n(480),s=(n(33),!1);function u(e){var t=\"\";return o.Children.forEach(e,(function(e){null!=e&&(\"string\"==typeof e||\"number\"==typeof e?t+=e:s||(s=!0))})),t}var c={mountWrapper:function(e,t,n){var r=null;if(null!=n){var o=n;\"optgroup\"===o._tag&&(o=o._hostParent),null!=o&&\"select\"===o._tag&&(r=i.getSelectValueContext(o))}var a,s=null;if(null!=r)if(a=null!=t.value?t.value+\"\":u(t.children),s=!1,Array.isArray(r)){for(var c=0;c<r.length;c++)if(\"\"+r[c]===a){s=!0;break}}else s=\"\"+r===a;e._wrapperState={selected:s}},postMountWrapper:function(e){var t=e._currentElement.props;null!=t.value&&a.getNodeFromInstance(e).setAttribute(\"value\",t.value)},getHostProps:function(e,t){var n=r({selected:void 0,children:void 0},t);null!=e._wrapperState.selected&&(n.selected=e._wrapperState.selected);var o=u(t.children);return o&&(n.children=o),n}};e.exports=c},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(270),i=n(45),s=n(80);n(25),n(33);function u(){this._rootNodeID&&c.updateWrapper(this)}var c={getHostProps:function(e,t){return null!=t.dangerouslySetInnerHTML&&r(\"91\"),o({},t,{value:void 0,defaultValue:void 0,children:\"\"+e._wrapperState.initialValue,onChange:e._wrapperState.onChange})},mountWrapper:function(e,t){var n=a.getValue(t),o=n;if(null==n){var i=t.defaultValue,s=t.children;null!=s&&(null!=i&&r(\"92\"),Array.isArray(s)&&(s.length<=1||r(\"93\"),s=s[0]),i=\"\"+s),null==i&&(i=\"\"),o=i}e._wrapperState={initialValue:\"\"+o,listeners:null,onChange:l.bind(e)}},updateWrapper:function(e){var t=e._currentElement.props,n=i.getNodeFromInstance(e),r=a.getValue(t);if(null!=r){var o=\"\"+r;o!==n.value&&(n.value=o),null==t.defaultValue&&(n.defaultValue=o)}null!=t.defaultValue&&(n.defaultValue=t.defaultValue)},postMountWrapper:function(e){var t=i.getNodeFromInstance(e),n=t.textContent;n===e._wrapperState.initialValue&&(t.value=n)}};function l(e){var t=this._currentElement.props,n=a.executeOnChange(t,e);return s.asap(u,this),n}e.exports=c},function(e,t,n){\"use strict\";var r=n(30),o=n(271),a=(n(168),n(72),n(88),n(141)),i=n(953),s=(n(79),n(958));n(25);function u(e,t){return t&&(e=e||[]).push(t),e}function c(e,t){o.processChildrenUpdates(e,t)}var l={Mixin:{_reconcilerInstantiateChildren:function(e,t,n){return i.instantiateChildren(e,t,n)},_reconcilerUpdateChildren:function(e,t,n,r,o,a){var u;return u=s(t,0),i.updateChildren(e,u,n,r,o,this,this._hostContainerInfo,a,0),u},mountChildren:function(e,t,n){var r=this._reconcilerInstantiateChildren(e,t,n);this._renderedChildren=r;var o=[],i=0;for(var s in r)if(r.hasOwnProperty(s)){var u=r[s];0;var c=a.mountComponent(u,t,this,this._hostContainerInfo,n,0);u._mountIndex=i++,o.push(c)}return o},updateTextContent:function(e){var t,n=this._renderedChildren;for(var o in i.unmountChildren(n,!1),n)n.hasOwnProperty(o)&&r(\"118\");c(this,[(t=e,{type:\"TEXT_CONTENT\",content:t,fromIndex:null,fromNode:null,toIndex:null,afterNode:null})])},updateMarkup:function(e){var t,n=this._renderedChildren;for(var o in i.unmountChildren(n,!1),n)n.hasOwnProperty(o)&&r(\"118\");c(this,[(t=e,{type:\"SET_MARKUP\",content:t,fromIndex:null,fromNode:null,toIndex:null,afterNode:null})])},updateChildren:function(e,t,n){this._updateChildren(e,t,n)},_updateChildren:function(e,t,n){var r=this._renderedChildren,o={},i=[],s=this._reconcilerUpdateChildren(r,e,i,o,t,n);if(s||r){var l,p=null,f=0,h=0,d=0,m=null;for(l in s)if(s.hasOwnProperty(l)){var v=r&&r[l],g=s[l];v===g?(p=u(p,this.moveChild(v,m,f,h)),h=Math.max(v._mountIndex,h),v._mountIndex=f):(v&&(h=Math.max(v._mountIndex,h)),p=u(p,this._mountChildAtIndex(g,i[d],m,f,t,n)),d++),f++,m=a.getHostNode(g)}for(l in o)o.hasOwnProperty(l)&&(p=u(p,this._unmountChild(r[l],o[l])));p&&c(this,p),this._renderedChildren=s}},unmountChildren:function(e){var t=this._renderedChildren;i.unmountChildren(t,e),this._renderedChildren=null},moveChild:function(e,t,n,r){if(e._mountIndex<r)return function(e,t,n){return{type:\"MOVE_EXISTING\",content:null,fromIndex:e._mountIndex,fromNode:a.getHostNode(e),toIndex:n,afterNode:t}}(e,t,n)},createChild:function(e,t,n){return function(e,t,n){return{type:\"INSERT_MARKUP\",content:e,fromIndex:null,fromNode:null,toIndex:n,afterNode:t}}(n,t,e._mountIndex)},removeChild:function(e,t){return function(e,t){return{type:\"REMOVE_NODE\",content:null,fromIndex:e._mountIndex,fromNode:t,toIndex:null,afterNode:null}}(e,t)},_mountChildAtIndex:function(e,t,n,r,o,a){return e._mountIndex=r,this.createChild(e,n,t)},_unmountChild:function(e,t){var n=this.removeChild(e,t);return e._mountIndex=null,n}}};e.exports=l},function(e,t,n){\"use strict\";(function(t){var r=n(141),o=n(481),a=(n(274),n(273)),i=n(485);n(33);function s(e,t,n,r){var a=void 0===e[n];null!=t&&a&&(e[n]=o(t,!0))}void 0!==t&&t.env;var u={instantiateChildren:function(e,t,n,r){if(null==e)return null;var o={};return i(e,s,o),o},updateChildren:function(e,t,n,i,s,u,c,l,p){if(t||e){var f,h;for(f in t)if(t.hasOwnProperty(f)){var d=(h=e&&e[f])&&h._currentElement,m=t[f];if(null!=h&&a(d,m))r.receiveComponent(h,m,s,l),t[f]=h;else{h&&(i[f]=r.getHostNode(h),r.unmountComponent(h,!1));var v=o(m,!0);t[f]=v;var g=r.mountComponent(v,s,u,c,l,p);n.push(g)}}for(f in e)!e.hasOwnProperty(f)||t&&t.hasOwnProperty(f)||(h=e[f],i[f]=r.getHostNode(h),r.unmountComponent(h,!1))}},unmountChildren:function(e,t){for(var n in e)if(e.hasOwnProperty(n)){var o=e[n];r.unmountComponent(o,t)}}};e.exports=u}).call(this,n(90))},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(132),i=n(271),s=n(88),u=n(263),c=n(168),l=(n(72),n(482)),p=n(141),f=n(241),h=(n(25),n(272)),d=n(273),m=(n(33),0),v=1,g=2;function y(e){}function b(e,t){0}y.prototype.render=function(){var e=c.get(this)._currentElement.type,t=e(this.props,this.context,this.updater);return b(e,t),t};var _=1,w={construct:function(e){this._currentElement=e,this._rootNodeID=0,this._compositeType=null,this._instance=null,this._hostParent=null,this._hostContainerInfo=null,this._updateBatchNumber=null,this._pendingElement=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._renderedNodeType=null,this._renderedComponent=null,this._context=null,this._mountOrder=0,this._topLevelWrapper=null,this._pendingCallbacks=null,this._calledComponentWillUnmount=!1},mountComponent:function(e,t,n,o){this._context=o,this._mountOrder=_++,this._hostParent=t,this._hostContainerInfo=n;var i,s=this._currentElement.props,u=this._processContext(o),l=this._currentElement.type,p=e.getUpdateQueue(),h=function(e){return!(!e.prototype||!e.prototype.isReactComponent)}(l),d=this._constructComponent(h,s,u,p);h||null!=d&&null!=d.render?!function(e){return!(!e.prototype||!e.prototype.isPureReactComponent)}(l)?this._compositeType=m:this._compositeType=v:(i=d,b(),null===d||!1===d||a.isValidElement(d)||r(\"105\",l.displayName||l.name||\"Component\"),d=new y(l),this._compositeType=g),d.props=s,d.context=u,d.refs=f,d.updater=p,this._instance=d,c.set(d,this);var w,x=d.state;return void 0===x&&(d.state=x=null),(\"object\"!=typeof x||Array.isArray(x))&&r(\"106\",this.getName()||\"ReactCompositeComponent\"),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,w=d.unstable_handleError?this.performInitialMountWithErrorHandling(i,t,n,e,o):this.performInitialMount(i,t,n,e,o),d.componentDidMount&&e.getReactMountReady().enqueue(d.componentDidMount,d),w},_constructComponent:function(e,t,n,r){return this._constructComponentWithoutOwner(e,t,n,r)},_constructComponentWithoutOwner:function(e,t,n,r){var o=this._currentElement.type;return e?new o(t,n,r):o(t,n,r)},performInitialMountWithErrorHandling:function(e,t,n,r,o){var a,i=r.checkpoint();try{a=this.performInitialMount(e,t,n,r,o)}catch(s){r.rollback(i),this._instance.unstable_handleError(s),this._pendingStateQueue&&(this._instance.state=this._processPendingState(this._instance.props,this._instance.context)),i=r.checkpoint(),this._renderedComponent.unmountComponent(!0),r.rollback(i),a=this.performInitialMount(e,t,n,r,o)}return a},performInitialMount:function(e,t,n,r,o){var a=this._instance;a.componentWillMount&&(a.componentWillMount(),this._pendingStateQueue&&(a.state=this._processPendingState(a.props,a.context))),void 0===e&&(e=this._renderValidatedComponent());var i=l.getType(e);this._renderedNodeType=i;var s=this._instantiateReactComponent(e,i!==l.EMPTY);return this._renderedComponent=s,p.mountComponent(s,r,t,n,this._processChildContext(o),0)},getHostNode:function(){return p.getHostNode(this._renderedComponent)},unmountComponent:function(e){if(this._renderedComponent){var t=this._instance;if(t.componentWillUnmount&&!t._calledComponentWillUnmount)if(t._calledComponentWillUnmount=!0,e){var n=this.getName()+\".componentWillUnmount()\";u.invokeGuardedCallback(n,t.componentWillUnmount.bind(t))}else t.componentWillUnmount();this._renderedComponent&&(p.unmountComponent(this._renderedComponent,e),this._renderedNodeType=null,this._renderedComponent=null,this._instance=null),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._pendingCallbacks=null,this._pendingElement=null,this._context=null,this._rootNodeID=0,this._topLevelWrapper=null,c.remove(t)}},_maskContext:function(e){var t=this._currentElement.type.contextTypes;if(!t)return f;var n={};for(var r in t)n[r]=e[r];return n},_processContext:function(e){return this._maskContext(e)},_processChildContext:function(e){var t,n=this._currentElement.type,a=this._instance;if(a.getChildContext&&(t=a.getChildContext()),t){for(var i in\"object\"!=typeof n.childContextTypes&&r(\"107\",this.getName()||\"ReactCompositeComponent\"),t)i in n.childContextTypes||r(\"108\",this.getName()||\"ReactCompositeComponent\",i);return o({},e,t)}return e},_checkContextTypes:function(e,t,n){0},receiveComponent:function(e,t,n){var r=this._currentElement,o=this._context;this._pendingElement=null,this.updateComponent(t,r,e,o,n)},performUpdateIfNecessary:function(e){null!=this._pendingElement?p.receiveComponent(this,this._pendingElement,e,this._context):null!==this._pendingStateQueue||this._pendingForceUpdate?this.updateComponent(e,this._currentElement,this._currentElement,this._context,this._context):this._updateBatchNumber=null},updateComponent:function(e,t,n,o,a){var i=this._instance;null==i&&r(\"136\",this.getName()||\"ReactCompositeComponent\");var s,u=!1;this._context===a?s=i.context:(s=this._processContext(a),u=!0);var c=t.props,l=n.props;t!==n&&(u=!0),u&&i.componentWillReceiveProps&&i.componentWillReceiveProps(l,s);var p=this._processPendingState(l,s),f=!0;this._pendingForceUpdate||(i.shouldComponentUpdate?f=i.shouldComponentUpdate(l,p,s):this._compositeType===v&&(f=!h(c,l)||!h(i.state,p))),this._updateBatchNumber=null,f?(this._pendingForceUpdate=!1,this._performComponentUpdate(n,l,p,s,e,a)):(this._currentElement=n,this._context=a,i.props=l,i.state=p,i.context=s)},_processPendingState:function(e,t){var n=this._instance,r=this._pendingStateQueue,a=this._pendingReplaceState;if(this._pendingReplaceState=!1,this._pendingStateQueue=null,!r)return n.state;if(a&&1===r.length)return r[0];for(var i=o({},a?r[0]:n.state),s=a?1:0;s<r.length;s++){var u=r[s];o(i,\"function\"==typeof u?u.call(n,i,e,t):u)}return i},_performComponentUpdate:function(e,t,n,r,o,a){var i,s,u,c=this._instance,l=Boolean(c.componentDidUpdate);l&&(i=c.props,s=c.state,u=c.context),c.componentWillUpdate&&c.componentWillUpdate(t,n,r),this._currentElement=e,this._context=a,c.props=t,c.state=n,c.context=r,this._updateRenderedComponent(o,a),l&&o.getReactMountReady().enqueue(c.componentDidUpdate.bind(c,i,s,u),c)},_updateRenderedComponent:function(e,t){var n=this._renderedComponent,r=n._currentElement,o=this._renderValidatedComponent();if(d(r,o))p.receiveComponent(n,o,e,this._processChildContext(t));else{var a=p.getHostNode(n);p.unmountComponent(n,!1);var i=l.getType(o);this._renderedNodeType=i;var s=this._instantiateReactComponent(o,i!==l.EMPTY);this._renderedComponent=s;var u=p.mountComponent(s,e,this._hostParent,this._hostContainerInfo,this._processChildContext(t),0);this._replaceNodeWithMarkup(a,u,n)}},_replaceNodeWithMarkup:function(e,t,n){i.replaceNodeWithMarkup(e,t,n)},_renderValidatedComponentWithoutOwnerOrContext:function(){return this._instance.render()},_renderValidatedComponent:function(){var e;if(this._compositeType!==g){s.current=this;try{e=this._renderValidatedComponentWithoutOwnerOrContext()}finally{s.current=null}}else e=this._renderValidatedComponentWithoutOwnerOrContext();return null===e||!1===e||a.isValidElement(e)||r(\"109\",this.getName()||\"ReactCompositeComponent\"),e},attachRef:function(e,t){var n=this.getPublicInstance();null==n&&r(\"110\");var o=t.getPublicInstance();(n.refs===f?n.refs={}:n.refs)[e]=o},detachRef:function(e){delete this.getPublicInstance().refs[e]},getName:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null},getPublicInstance:function(){var e=this._instance;return this._compositeType===g?null:e},_instantiateReactComponent:null};e.exports=w},function(e,t,n){\"use strict\";var r=1;e.exports=function(){return r++}},function(e,t,n){\"use strict\";var r=\"function\"==typeof Symbol&&Symbol.for&&Symbol.for(\"react.element\")||60103;e.exports=r},function(e,t,n){\"use strict\";var r=\"function\"==typeof Symbol&&Symbol.iterator;e.exports=function(e){var t=e&&(r&&e[r]||e[\"@@iterator\"]);if(\"function\"==typeof t)return t}},function(e,t,n){\"use strict\";(function(t){n(274);var r=n(485);n(33);function o(e,t,n,r){if(e&&\"object\"==typeof e){var o=e;0,void 0===o[n]&&null!=t&&(o[n]=t)}}void 0!==t&&t.env,e.exports=function(e,t){if(null==e)return e;var n={};return r(e,o,n),n}}).call(this,n(90))},function(e,t,n){\"use strict\";var r=n(38),o=n(122),a=n(202),i=(n(72),n(960)),s=[];var u={enqueue:function(){}};function c(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.useCreateElement=!1,this.updateQueue=new i(this)}var l={getTransactionWrappers:function(){return s},getReactMountReady:function(){return u},getUpdateQueue:function(){return this.updateQueue},destructor:function(){},checkpoint:function(){},rollback:function(){}};r(c.prototype,a,l),o.addPoolingTo(c),e.exports=c},function(e,t,n){\"use strict\";var r=n(275);n(33);var o=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.transaction=t}return e.prototype.isMounted=function(e){return!1},e.prototype.enqueueCallback=function(e,t,n){this.transaction.isInTransaction()&&r.enqueueCallback(e,t,n)},e.prototype.enqueueForceUpdate=function(e){this.transaction.isInTransaction()&&r.enqueueForceUpdate(e)},e.prototype.enqueueReplaceState=function(e,t){this.transaction.isInTransaction()&&r.enqueueReplaceState(e,t)},e.prototype.enqueueSetState=function(e,t){this.transaction.isInTransaction()&&r.enqueueSetState(e,t)},e}();e.exports=o},function(e,t,n){\"use strict\";var r=n(38),o=n(142),a=n(45),i=function(e){this._currentElement=null,this._hostNode=null,this._hostParent=null,this._hostContainerInfo=null,this._domID=0};r(i.prototype,{mountComponent:function(e,t,n,r){var i=n._idCounter++;this._domID=i,this._hostParent=t,this._hostContainerInfo=n;var s=\" react-empty: \"+this._domID+\" \";if(e.useCreateElement){var u=n._ownerDocument.createComment(s);return a.precacheNode(this,u),o(u)}return e.renderToStaticMarkup?\"\":\"\\x3c!--\"+s+\"--\\x3e\"},receiveComponent:function(){},getHostNode:function(){return a.getNodeFromInstance(this)},unmountComponent:function(){a.uncacheNode(this)}}),e.exports=i},function(e,t,n){\"use strict\";var r=n(30);n(25);function o(e,t){\"_hostNode\"in e||r(\"33\"),\"_hostNode\"in t||r(\"33\");for(var n=0,o=e;o;o=o._hostParent)n++;for(var a=0,i=t;i;i=i._hostParent)a++;for(;n-a>0;)e=e._hostParent,n--;for(;a-n>0;)t=t._hostParent,a--;for(var s=n;s--;){if(e===t)return e;e=e._hostParent,t=t._hostParent}return null}e.exports={isAncestor:function(e,t){\"_hostNode\"in e||r(\"35\"),\"_hostNode\"in t||r(\"35\");for(;t;){if(t===e)return!0;t=t._hostParent}return!1},getLowestCommonAncestor:o,getParentInstance:function(e){return\"_hostNode\"in e||r(\"36\"),e._hostParent},traverseTwoPhase:function(e,t,n){for(var r,o=[];e;)o.push(e),e=e._hostParent;for(r=o.length;r-- >0;)t(o[r],\"captured\",n);for(r=0;r<o.length;r++)t(o[r],\"bubbled\",n)},traverseEnterLeave:function(e,t,n,r,a){for(var i=e&&t?o(e,t):null,s=[];e&&e!==i;)s.push(e),e=e._hostParent;for(var u,c=[];t&&t!==i;)c.push(t),t=t._hostParent;for(u=0;u<s.length;u++)n(s[u],\"bubbled\",r);for(u=c.length;u-- >0;)n(c[u],\"captured\",a)}}},function(e,t,n){\"use strict\";var r=n(30),o=n(38),a=n(267),i=n(142),s=n(45),u=n(205),c=(n(25),n(276),function(e){this._currentElement=e,this._stringText=\"\"+e,this._hostNode=null,this._hostParent=null,this._domID=0,this._mountIndex=0,this._closingComment=null,this._commentNodes=null});o(c.prototype,{mountComponent:function(e,t,n,r){var o=n._idCounter++,a=\" react-text: \"+o+\" \",c=\" /react-text \";if(this._domID=o,this._hostParent=t,e.useCreateElement){var l=n._ownerDocument,p=l.createComment(a),f=l.createComment(c),h=i(l.createDocumentFragment());return i.queueChild(h,i(p)),this._stringText&&i.queueChild(h,i(l.createTextNode(this._stringText))),i.queueChild(h,i(f)),s.precacheNode(this,p),this._closingComment=f,h}var d=u(this._stringText);return e.renderToStaticMarkup?d:\"\\x3c!--\"+a+\"--\\x3e\"+d+\"\\x3c!--\"+\" /react-text --\\x3e\"},receiveComponent:function(e,t){if(e!==this._currentElement){this._currentElement=e;var n=\"\"+e;if(n!==this._stringText){this._stringText=n;var r=this.getHostNode();a.replaceDelimitedText(r[0],r[1],n)}}},getHostNode:function(){var e=this._commentNodes;if(e)return e;if(!this._closingComment)for(var t=s.getNodeFromInstance(this).nextSibling;;){if(null==t&&r(\"67\",this._domID),8===t.nodeType&&\" /react-text \"===t.nodeValue){this._closingComment=t;break}t=t.nextSibling}return e=[this._hostNode,this._closingComment],this._commentNodes=e,e},unmountComponent:function(){this._closingComment=null,this._commentNodes=null,s.uncacheNode(this)}}),e.exports=c},function(e,t,n){\"use strict\";var r=n(38),o=n(80),a=n(202),i=n(79),s={initialize:i,close:function(){p.isBatchingUpdates=!1}},u=[{initialize:i,close:o.flushBatchedUpdates.bind(o)},s];function c(){this.reinitializeTransaction()}r(c.prototype,a,{getTransactionWrappers:function(){return u}});var l=new c,p={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,r,o,a){var i=p.isBatchingUpdates;return p.isBatchingUpdates=!0,i?e(t,n,r,o,a):l.perform(e,null,t,n,r,o,a)}};e.exports=p},function(e,t,n){\"use strict\";var r=n(38),o=n(487),a=n(56),i=n(122),s=n(45),u=n(80),c=n(264),l=n(966);function p(e){for(;e._hostParent;)e=e._hostParent;var t=s.getNodeFromInstance(e).parentNode;return s.getClosestInstanceFromNode(t)}function f(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}function h(e){var t=c(e.nativeEvent),n=s.getClosestInstanceFromNode(t),r=n;do{e.ancestors.push(r),r=r&&p(r)}while(r);for(var o=0;o<e.ancestors.length;o++)n=e.ancestors[o],m._handleTopLevel(e.topLevelType,n,e.nativeEvent,c(e.nativeEvent))}function d(e){e(l(window))}r(f.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),i.addPoolingTo(f,i.twoArgumentPooler);var m={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:a.canUseDOM?window:null,setHandleTopLevel:function(e){m._handleTopLevel=e},setEnabled:function(e){m._enabled=!!e},isEnabled:function(){return m._enabled},trapBubbledEvent:function(e,t,n){return n?o.listen(n,t,m.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){return n?o.capture(n,t,m.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var t=d.bind(null,e);o.listen(window,\"scroll\",t)},dispatchEvent:function(e,t){if(m._enabled){var n=f.getPooled(e,t);try{u.batchedUpdates(h,n)}finally{f.release(n)}}}};e.exports=m},function(e,t,n){\"use strict\";e.exports=function(e){return e.Window&&e instanceof e.Window?{x:e.pageXOffset||e.document.documentElement.scrollLeft,y:e.pageYOffset||e.document.documentElement.scrollTop}:{x:e.scrollLeft,y:e.scrollTop}}},function(e,t,n){\"use strict\";var r=n(140),o=n(166),a=n(262),i=n(271),s=n(483),u=n(206),c=n(484),l=n(80),p={Component:i.injection,DOMProperty:r.injection,EmptyComponent:s.injection,EventPluginHub:o.injection,EventPluginUtils:a.injection,EventEmitter:u.injection,HostComponent:c.injection,Updates:l.injection};e.exports=p},function(e,t,n){\"use strict\";var r=n(38),o=n(471),a=n(122),i=n(206),s=n(488),u=(n(72),n(202)),c=n(275),l=[{initialize:s.getSelectionInformation,close:s.restoreSelection},{initialize:function(){var e=i.isEnabled();return i.setEnabled(!1),e},close:function(e){i.setEnabled(e)}},{initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}}];function p(e){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=o.getPooled(null),this.useCreateElement=e}var f={getTransactionWrappers:function(){return l},getReactMountReady:function(){return this.reactMountReady},getUpdateQueue:function(){return c},checkpoint:function(){return this.reactMountReady.checkpoint()},rollback:function(e){this.reactMountReady.rollback(e)},destructor:function(){o.release(this.reactMountReady),this.reactMountReady=null}};r(p.prototype,u,f),a.addPoolingTo(p),e.exports=p},function(e,t,n){\"use strict\";var r=n(56),o=n(970),a=n(470);function i(e,t,n,r){return e===n&&t===r}var s=r.canUseDOM&&\"selection\"in document&&!(\"getSelection\"in window),u={getOffsets:s?function(e){var t=document.selection.createRange(),n=t.text.length,r=t.duplicate();r.moveToElementText(e),r.setEndPoint(\"EndToStart\",t);var o=r.text.length;return{start:o,end:o+n}}:function(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,r=t.anchorOffset,o=t.focusNode,a=t.focusOffset,s=t.getRangeAt(0);try{s.startContainer.nodeType,s.endContainer.nodeType}catch(e){return null}var u=i(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset)?0:s.toString().length,c=s.cloneRange();c.selectNodeContents(e),c.setEnd(s.startContainer,s.startOffset);var l=i(c.startContainer,c.startOffset,c.endContainer,c.endOffset)?0:c.toString().length,p=l+u,f=document.createRange();f.setStart(n,r),f.setEnd(o,a);var h=f.collapsed;return{start:h?p:l,end:h?l:p}},setOffsets:s?function(e,t){var n,r,o=document.selection.createRange().duplicate();void 0===t.end?r=n=t.start:t.start>t.end?(n=t.end,r=t.start):(n=t.start,r=t.end),o.moveToElementText(e),o.moveStart(\"character\",n),o.setEndPoint(\"EndToStart\",o),o.moveEnd(\"character\",r-n),o.select()}:function(e,t){if(window.getSelection){var n=window.getSelection(),r=e[a()].length,i=Math.min(t.start,r),s=void 0===t.end?i:Math.min(t.end,r);if(!n.extend&&i>s){var u=s;s=i,i=u}var c=o(e,i),l=o(e,s);if(c&&l){var p=document.createRange();p.setStart(c.node,c.offset),n.removeAllRanges(),i>s?(n.addRange(p),n.extend(l.node,l.offset)):(p.setEnd(l.node,l.offset),n.addRange(p))}}}};e.exports=u},function(e,t,n){\"use strict\";function r(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function o(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}e.exports=function(e,t){for(var n=r(e),a=0,i=0;n;){if(3===n.nodeType){if(i=a+n.textContent.length,a<=t&&i>=t)return{node:n,offset:t-a};a=i}n=r(o(n))}}},function(e,t,n){\"use strict\";var r=n(972);e.exports=function e(t,n){return!(!t||!n)&&(t===n||!r(t)&&(r(n)?e(t,n.parentNode):\"contains\"in t?t.contains(n):!!t.compareDocumentPosition&&!!(16&t.compareDocumentPosition(n))))}},function(e,t,n){\"use strict\";var r=n(973);e.exports=function(e){return r(e)&&3==e.nodeType}},function(e,t,n){\"use strict\";e.exports=function(e){var t=(e?e.ownerDocument||e:document).defaultView||window;return!(!e||!(\"function\"==typeof t.Node?e instanceof t.Node:\"object\"==typeof e&&\"number\"==typeof e.nodeType&&\"string\"==typeof e.nodeName))}},function(e,t,n){\"use strict\";var r=\"http://www.w3.org/1999/xlink\",o=\"http://www.w3.org/XML/1998/namespace\",a={accentHeight:\"accent-height\",accumulate:0,additive:0,alignmentBaseline:\"alignment-baseline\",allowReorder:\"allowReorder\",alphabetic:0,amplitude:0,arabicForm:\"arabic-form\",ascent:0,attributeName:\"attributeName\",attributeType:\"attributeType\",autoReverse:\"autoReverse\",azimuth:0,baseFrequency:\"baseFrequency\",baseProfile:\"baseProfile\",baselineShift:\"baseline-shift\",bbox:0,begin:0,bias:0,by:0,calcMode:\"calcMode\",capHeight:\"cap-height\",clip:0,clipPath:\"clip-path\",clipRule:\"clip-rule\",clipPathUnits:\"clipPathUnits\",colorInterpolation:\"color-interpolation\",colorInterpolationFilters:\"color-interpolation-filters\",colorProfile:\"color-profile\",colorRendering:\"color-rendering\",contentScriptType:\"contentScriptType\",contentStyleType:\"contentStyleType\",cursor:0,cx:0,cy:0,d:0,decelerate:0,descent:0,diffuseConstant:\"diffuseConstant\",direction:0,display:0,divisor:0,dominantBaseline:\"dominant-baseline\",dur:0,dx:0,dy:0,edgeMode:\"edgeMode\",elevation:0,enableBackground:\"enable-background\",end:0,exponent:0,externalResourcesRequired:\"externalResourcesRequired\",fill:0,fillOpacity:\"fill-opacity\",fillRule:\"fill-rule\",filter:0,filterRes:\"filterRes\",filterUnits:\"filterUnits\",floodColor:\"flood-color\",floodOpacity:\"flood-opacity\",focusable:0,fontFamily:\"font-family\",fontSize:\"font-size\",fontSizeAdjust:\"font-size-adjust\",fontStretch:\"font-stretch\",fontStyle:\"font-style\",fontVariant:\"font-variant\",fontWeight:\"font-weight\",format:0,from:0,fx:0,fy:0,g1:0,g2:0,glyphName:\"glyph-name\",glyphOrientationHorizontal:\"glyph-orientation-horizontal\",glyphOrientationVertical:\"glyph-orientation-vertical\",glyphRef:\"glyphRef\",gradientTransform:\"gradientTransform\",gradientUnits:\"gradientUnits\",hanging:0,horizAdvX:\"horiz-adv-x\",horizOriginX:\"horiz-origin-x\",ideographic:0,imageRendering:\"image-rendering\",in:0,in2:0,intercept:0,k:0,k1:0,k2:0,k3:0,k4:0,kernelMatrix:\"kernelMatrix\",kernelUnitLength:\"kernelUnitLength\",kerning:0,keyPoints:\"keyPoints\",keySplines:\"keySplines\",keyTimes:\"keyTimes\",lengthAdjust:\"lengthAdjust\",letterSpacing:\"letter-spacing\",lightingColor:\"lighting-color\",limitingConeAngle:\"limitingConeAngle\",local:0,markerEnd:\"marker-end\",markerMid:\"marker-mid\",markerStart:\"marker-start\",markerHeight:\"markerHeight\",markerUnits:\"markerUnits\",markerWidth:\"markerWidth\",mask:0,maskContentUnits:\"maskContentUnits\",maskUnits:\"maskUnits\",mathematical:0,mode:0,numOctaves:\"numOctaves\",offset:0,opacity:0,operator:0,order:0,orient:0,orientation:0,origin:0,overflow:0,overlinePosition:\"overline-position\",overlineThickness:\"overline-thickness\",paintOrder:\"paint-order\",panose1:\"panose-1\",pathLength:\"pathLength\",patternContentUnits:\"patternContentUnits\",patternTransform:\"patternTransform\",patternUnits:\"patternUnits\",pointerEvents:\"pointer-events\",points:0,pointsAtX:\"pointsAtX\",pointsAtY:\"pointsAtY\",pointsAtZ:\"pointsAtZ\",preserveAlpha:\"preserveAlpha\",preserveAspectRatio:\"preserveAspectRatio\",primitiveUnits:\"primitiveUnits\",r:0,radius:0,refX:\"refX\",refY:\"refY\",renderingIntent:\"rendering-intent\",repeatCount:\"repeatCount\",repeatDur:\"repeatDur\",requiredExtensions:\"requiredExtensions\",requiredFeatures:\"requiredFeatures\",restart:0,result:0,rotate:0,rx:0,ry:0,scale:0,seed:0,shapeRendering:\"shape-rendering\",slope:0,spacing:0,specularConstant:\"specularConstant\",specularExponent:\"specularExponent\",speed:0,spreadMethod:\"spreadMethod\",startOffset:\"startOffset\",stdDeviation:\"stdDeviation\",stemh:0,stemv:0,stitchTiles:\"stitchTiles\",stopColor:\"stop-color\",stopOpacity:\"stop-opacity\",strikethroughPosition:\"strikethrough-position\",strikethroughThickness:\"strikethrough-thickness\",string:0,stroke:0,strokeDasharray:\"stroke-dasharray\",strokeDashoffset:\"stroke-dashoffset\",strokeLinecap:\"stroke-linecap\",strokeLinejoin:\"stroke-linejoin\",strokeMiterlimit:\"stroke-miterlimit\",strokeOpacity:\"stroke-opacity\",strokeWidth:\"stroke-width\",surfaceScale:\"surfaceScale\",systemLanguage:\"systemLanguage\",tableValues:\"tableValues\",targetX:\"targetX\",targetY:\"targetY\",textAnchor:\"text-anchor\",textDecoration:\"text-decoration\",textRendering:\"text-rendering\",textLength:\"textLength\",to:0,transform:0,u1:0,u2:0,underlinePosition:\"underline-position\",underlineThickness:\"underline-thickness\",unicode:0,unicodeBidi:\"unicode-bidi\",unicodeRange:\"unicode-range\",unitsPerEm:\"units-per-em\",vAlphabetic:\"v-alphabetic\",vHanging:\"v-hanging\",vIdeographic:\"v-ideographic\",vMathematical:\"v-mathematical\",values:0,vectorEffect:\"vector-effect\",version:0,vertAdvY:\"vert-adv-y\",vertOriginX:\"vert-origin-x\",vertOriginY:\"vert-origin-y\",viewBox:\"viewBox\",viewTarget:\"viewTarget\",visibility:0,widths:0,wordSpacing:\"word-spacing\",writingMode:\"writing-mode\",x:0,xHeight:\"x-height\",x1:0,x2:0,xChannelSelector:\"xChannelSelector\",xlinkActuate:\"xlink:actuate\",xlinkArcrole:\"xlink:arcrole\",xlinkHref:\"xlink:href\",xlinkRole:\"xlink:role\",xlinkShow:\"xlink:show\",xlinkTitle:\"xlink:title\",xlinkType:\"xlink:type\",xmlBase:\"xml:base\",xmlns:0,xmlnsXlink:\"xmlns:xlink\",xmlLang:\"xml:lang\",xmlSpace:\"xml:space\",y:0,y1:0,y2:0,yChannelSelector:\"yChannelSelector\",z:0,zoomAndPan:\"zoomAndPan\"},i={Properties:{},DOMAttributeNamespaces:{xlinkActuate:r,xlinkArcrole:r,xlinkHref:r,xlinkRole:r,xlinkShow:r,xlinkTitle:r,xlinkType:r,xmlBase:o,xmlLang:o,xmlSpace:o},DOMAttributeNames:{}};Object.keys(a).forEach((function(e){i.Properties[e]=0,a[e]&&(i.DOMAttributeNames[e]=a[e])})),e.exports=i},function(e,t,n){\"use strict\";var r=n(165),o=n(56),a=n(45),i=n(488),s=n(91),u=n(489),c=n(474),l=n(272),p=o.canUseDOM&&\"documentMode\"in document&&document.documentMode<=11,f={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:[\"topBlur\",\"topContextMenu\",\"topFocus\",\"topKeyDown\",\"topKeyUp\",\"topMouseDown\",\"topMouseUp\",\"topSelectionChange\"]}},h=null,d=null,m=null,v=!1,g=!1;function y(e,t){if(v||null==h||h!==u())return null;var n=function(e){if(\"selectionStart\"in e&&i.hasSelectionCapabilities(e))return{start:e.selectionStart,end:e.selectionEnd};if(window.getSelection){var t=window.getSelection();return{anchorNode:t.anchorNode,anchorOffset:t.anchorOffset,focusNode:t.focusNode,focusOffset:t.focusOffset}}if(document.selection){var n=document.selection.createRange();return{parentElement:n.parentElement(),text:n.text,top:n.boundingTop,left:n.boundingLeft}}}(h);if(!m||!l(m,n)){m=n;var o=s.getPooled(f.select,d,e,t);return o.type=\"select\",o.target=h,r.accumulateTwoPhaseDispatches(o),o}return null}var b={eventTypes:f,extractEvents:function(e,t,n,r){if(!g)return null;var o=t?a.getNodeFromInstance(t):window;switch(e){case\"topFocus\":(c(o)||\"true\"===o.contentEditable)&&(h=o,d=t,m=null);break;case\"topBlur\":h=null,d=null,m=null;break;case\"topMouseDown\":v=!0;break;case\"topContextMenu\":case\"topMouseUp\":return v=!1,y(n,r);case\"topSelectionChange\":if(p)break;case\"topKeyDown\":case\"topKeyUp\":return y(n,r)}return null},didPutListener:function(e,t,n){\"onSelect\"===t&&(g=!0)}};e.exports=b},function(e,t,n){\"use strict\";var r=n(30),o=n(487),a=n(165),i=n(45),s=n(977),u=n(978),c=n(91),l=n(979),p=n(980),f=n(203),h=n(982),d=n(983),m=n(984),v=n(167),g=n(985),y=n(79),b=n(277),_=(n(25),{}),w={};[\"abort\",\"animationEnd\",\"animationIteration\",\"animationStart\",\"blur\",\"canPlay\",\"canPlayThrough\",\"click\",\"contextMenu\",\"copy\",\"cut\",\"doubleClick\",\"drag\",\"dragEnd\",\"dragEnter\",\"dragExit\",\"dragLeave\",\"dragOver\",\"dragStart\",\"drop\",\"durationChange\",\"emptied\",\"encrypted\",\"ended\",\"error\",\"focus\",\"input\",\"invalid\",\"keyDown\",\"keyPress\",\"keyUp\",\"load\",\"loadedData\",\"loadedMetadata\",\"loadStart\",\"mouseDown\",\"mouseMove\",\"mouseOut\",\"mouseOver\",\"mouseUp\",\"paste\",\"pause\",\"play\",\"playing\",\"progress\",\"rateChange\",\"reset\",\"scroll\",\"seeked\",\"seeking\",\"stalled\",\"submit\",\"suspend\",\"timeUpdate\",\"touchCancel\",\"touchEnd\",\"touchMove\",\"touchStart\",\"transitionEnd\",\"volumeChange\",\"waiting\",\"wheel\"].forEach((function(e){var t=e[0].toUpperCase()+e.slice(1),n=\"on\"+t,r=\"top\"+t,o={phasedRegistrationNames:{bubbled:n,captured:n+\"Capture\"},dependencies:[r]};_[e]=o,w[r]=o}));var x={};function E(e){return\".\"+e._rootNodeID}function S(e){return\"button\"===e||\"input\"===e||\"select\"===e||\"textarea\"===e}var C={eventTypes:_,extractEvents:function(e,t,n,o){var i,y=w[e];if(!y)return null;switch(e){case\"topAbort\":case\"topCanPlay\":case\"topCanPlayThrough\":case\"topDurationChange\":case\"topEmptied\":case\"topEncrypted\":case\"topEnded\":case\"topError\":case\"topInput\":case\"topInvalid\":case\"topLoad\":case\"topLoadedData\":case\"topLoadedMetadata\":case\"topLoadStart\":case\"topPause\":case\"topPlay\":case\"topPlaying\":case\"topProgress\":case\"topRateChange\":case\"topReset\":case\"topSeeked\":case\"topSeeking\":case\"topStalled\":case\"topSubmit\":case\"topSuspend\":case\"topTimeUpdate\":case\"topVolumeChange\":case\"topWaiting\":i=c;break;case\"topKeyPress\":if(0===b(n))return null;case\"topKeyDown\":case\"topKeyUp\":i=p;break;case\"topBlur\":case\"topFocus\":i=l;break;case\"topClick\":if(2===n.button)return null;case\"topDoubleClick\":case\"topMouseDown\":case\"topMouseMove\":case\"topMouseUp\":case\"topMouseOut\":case\"topMouseOver\":case\"topContextMenu\":i=f;break;case\"topDrag\":case\"topDragEnd\":case\"topDragEnter\":case\"topDragExit\":case\"topDragLeave\":case\"topDragOver\":case\"topDragStart\":case\"topDrop\":i=h;break;case\"topTouchCancel\":case\"topTouchEnd\":case\"topTouchMove\":case\"topTouchStart\":i=d;break;case\"topAnimationEnd\":case\"topAnimationIteration\":case\"topAnimationStart\":i=s;break;case\"topTransitionEnd\":i=m;break;case\"topScroll\":i=v;break;case\"topWheel\":i=g;break;case\"topCopy\":case\"topCut\":case\"topPaste\":i=u}i||r(\"86\",e);var _=i.getPooled(y,t,n,o);return a.accumulateTwoPhaseDispatches(_),_},didPutListener:function(e,t,n){if(\"onClick\"===t&&!S(e._tag)){var r=E(e),a=i.getNodeFromInstance(e);x[r]||(x[r]=o.listen(a,\"click\",y))}},willDeleteListener:function(e,t){if(\"onClick\"===t&&!S(e._tag)){var n=E(e);x[n].remove(),delete x[n]}}};e.exports=C},function(e,t,n){\"use strict\";var r=n(91);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{animationName:null,elapsedTime:null,pseudoElement:null}),e.exports=o},function(e,t,n){\"use strict\";var r=n(91),o={clipboardData:function(e){return\"clipboardData\"in e?e.clipboardData:window.clipboardData}};function a(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(a,o),e.exports=a},function(e,t,n){\"use strict\";var r=n(167);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{relatedTarget:null}),e.exports=o},function(e,t,n){\"use strict\";var r=n(167),o=n(277),a={key:n(981),location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:n(266),charCode:function(e){return\"keypress\"===e.type?o(e):0},keyCode:function(e){return\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0},which:function(e){return\"keypress\"===e.type?o(e):\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0}};function i(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(i,a),e.exports=i},function(e,t,n){\"use strict\";var r=n(277),o={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},a={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"};e.exports=function(e){if(e.key){var t=o[e.key]||e.key;if(\"Unidentified\"!==t)return t}if(\"keypress\"===e.type){var n=r(e);return 13===n?\"Enter\":String.fromCharCode(n)}return\"keydown\"===e.type||\"keyup\"===e.type?a[e.keyCode]||\"Unidentified\":\"\"}},function(e,t,n){\"use strict\";var r=n(203);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{dataTransfer:null}),e.exports=o},function(e,t,n){\"use strict\";var r=n(167),o={touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:n(266)};function a(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(a,o),e.exports=a},function(e,t,n){\"use strict\";var r=n(91);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{propertyName:null,elapsedTime:null,pseudoElement:null}),e.exports=o},function(e,t,n){\"use strict\";var r=n(203);function o(e,t,n,o){return r.call(this,e,t,n,o)}r.augmentClass(o,{deltaX:function(e){return\"deltaX\"in e?e.deltaX:\"wheelDeltaX\"in e?-e.wheelDeltaX:0},deltaY:function(e){return\"deltaY\"in e?e.deltaY:\"wheelDeltaY\"in e?-e.wheelDeltaY:\"wheelDelta\"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null}),e.exports=o},function(e,t,n){\"use strict\";n(276);e.exports=function(e,t){return{_topLevelWrapper:e,_idCounter:1,_ownerDocument:t?9===t.nodeType?t:t.ownerDocument:null,_node:t,_tag:t?t.nodeName.toLowerCase():null,_namespaceURI:t?t.namespaceURI:null}}},function(e,t,n){\"use strict\";e.exports={useCreateElement:!0,useFiber:!1}},function(e,t,n){\"use strict\";var r=n(989),o=/\\/?>/,a=/^<\\!\\-\\-/,i={CHECKSUM_ATTR_NAME:\"data-react-checksum\",addChecksumToMarkup:function(e){var t=r(e);return a.test(e)?e:e.replace(o,\" \"+i.CHECKSUM_ATTR_NAME+'=\"'+t+'\"$&')},canReuseMarkup:function(e,t){var n=t.getAttribute(i.CHECKSUM_ATTR_NAME);return n=n&&parseInt(n,10),r(e)===n}};e.exports=i},function(e,t,n){\"use strict\";var r=65521;e.exports=function(e){for(var t=1,n=0,o=0,a=e.length,i=-4&a;o<i;){for(var s=Math.min(o+4096,i);o<s;o+=4)n+=(t+=e.charCodeAt(o))+(t+=e.charCodeAt(o+1))+(t+=e.charCodeAt(o+2))+(t+=e.charCodeAt(o+3));t%=r,n%=r}for(;o<a;o++)n+=t+=e.charCodeAt(o);return(t%=r)|(n%=r)<<16}},function(e,t,n){\"use strict\";e.exports=\"15.6.2\"},function(e,t,n){\"use strict\";var r=n(30),o=(n(88),n(45)),a=n(168),i=n(491);n(25),n(33);e.exports=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=a.get(e);if(t)return(t=i(t))?o.getNodeFromInstance(t):null;\"function\"==typeof e.render?r(\"44\"):r(\"45\",Object.keys(e))}},function(e,t,n){\"use strict\";var r=n(490);e.exports=r.renderSubtreeIntoContainer},function(e,t,n){\"use strict\";t.__esModule=!0,t.default=void 0;var r=n(0),o=i(n(11)),a=i(n(492));i(n(493));function i(e){return e&&e.__esModule?e:{default:e}}var s=function(e){function t(n,r){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,t);var o=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}(this,e.call(this,n,r));return o.store=n.store,o}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.getChildContext=function(){return{store:this.store}},t.prototype.render=function(){return r.Children.only(this.props.children)},t}(r.Component);t.default=s,s.propTypes={store:a.default.isRequired,children:o.default.element.isRequired},s.childContextTypes={store:a.default.isRequired}},function(e,t,n){\"use strict\";var r=n(389);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error(\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types\");throw s.name=\"Invariant Violation\",s}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},function(e,t,n){\"use strict\";t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};t.default=function(e,t,n){var l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},w=Boolean(e),x=e||d,E=void 0;E=\"function\"==typeof t?t:t?(0,s.default)(t):m;var S=n||v,C=l.pure,A=void 0===C||C,k=l.withRef,O=void 0!==k&&k,j=A&&S!==v,T=_++;return function(e){var t=\"Connect(\"+g(e)+\")\";var n=function(n){function a(e,r){p(this,a);var o=f(this,n.call(this,e,r));o.version=T,o.store=e.store||r.store,(0,c.default)(o.store,'Could not find \"store\" in either the context or props of \"'+t+'\". Either wrap the root component in a <Provider>, or explicitly pass \"store\" as a prop to \"'+t+'\".');var i=o.store.getState();return o.state={storeState:i},o.clearCache(),o}return h(a,n),a.prototype.shouldComponentUpdate=function(){return!A||this.haveOwnPropsChanged||this.hasStoreStateChanged},a.prototype.computeStateProps=function(e,t){if(!this.finalMapStateToProps)return this.configureFinalMapState(e,t);var n=e.getState();return this.doStatePropsDependOnOwnProps?this.finalMapStateToProps(n,t):this.finalMapStateToProps(n)},a.prototype.configureFinalMapState=function(e,t){var n=x(e.getState(),t),r=\"function\"==typeof n;return this.finalMapStateToProps=r?n:x,this.doStatePropsDependOnOwnProps=1!==this.finalMapStateToProps.length,r?this.computeStateProps(e,t):n},a.prototype.computeDispatchProps=function(e,t){if(!this.finalMapDispatchToProps)return this.configureFinalMapDispatch(e,t);var n=e.dispatch;return this.doDispatchPropsDependOnOwnProps?this.finalMapDispatchToProps(n,t):this.finalMapDispatchToProps(n)},a.prototype.configureFinalMapDispatch=function(e,t){var n=E(e.dispatch,t),r=\"function\"==typeof n;return this.finalMapDispatchToProps=r?n:E,this.doDispatchPropsDependOnOwnProps=1!==this.finalMapDispatchToProps.length,r?this.computeDispatchProps(e,t):n},a.prototype.updateStatePropsIfNeeded=function(){var e=this.computeStateProps(this.store,this.props);return(!this.stateProps||!(0,i.default)(e,this.stateProps))&&(this.stateProps=e,!0)},a.prototype.updateDispatchPropsIfNeeded=function(){var e=this.computeDispatchProps(this.store,this.props);return(!this.dispatchProps||!(0,i.default)(e,this.dispatchProps))&&(this.dispatchProps=e,!0)},a.prototype.updateMergedPropsIfNeeded=function(){var e,t,n,r=(e=this.stateProps,t=this.dispatchProps,n=this.props,S(e,t,n));return!(this.mergedProps&&j&&(0,i.default)(r,this.mergedProps))&&(this.mergedProps=r,!0)},a.prototype.isSubscribed=function(){return\"function\"==typeof this.unsubscribe},a.prototype.trySubscribe=function(){w&&!this.unsubscribe&&(this.unsubscribe=this.store.subscribe(this.handleChange.bind(this)),this.handleChange())},a.prototype.tryUnsubscribe=function(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null)},a.prototype.componentDidMount=function(){this.trySubscribe()},a.prototype.componentWillReceiveProps=function(e){A&&(0,i.default)(e,this.props)||(this.haveOwnPropsChanged=!0)},a.prototype.componentWillUnmount=function(){this.tryUnsubscribe(),this.clearCache()},a.prototype.clearCache=function(){this.dispatchProps=null,this.stateProps=null,this.mergedProps=null,this.haveOwnPropsChanged=!0,this.hasStoreStateChanged=!0,this.haveStatePropsBeenPrecalculated=!1,this.statePropsPrecalculationError=null,this.renderedElement=null,this.finalMapDispatchToProps=null,this.finalMapStateToProps=null},a.prototype.handleChange=function(){if(this.unsubscribe){var e=this.store.getState(),t=this.state.storeState;if(!A||t!==e){if(A&&!this.doStatePropsDependOnOwnProps){var n=b(this.updateStatePropsIfNeeded,this);if(!n)return;n===y&&(this.statePropsPrecalculationError=y.value),this.haveStatePropsBeenPrecalculated=!0}this.hasStoreStateChanged=!0,this.setState({storeState:e})}}},a.prototype.getWrappedInstance=function(){return(0,c.default)(O,\"To access the wrapped instance, you need to specify { withRef: true } as the fourth argument of the connect() call.\"),this.refs.wrappedInstance},a.prototype.render=function(){var t=this.haveOwnPropsChanged,n=this.hasStoreStateChanged,a=this.haveStatePropsBeenPrecalculated,i=this.statePropsPrecalculationError,s=this.renderedElement;if(this.haveOwnPropsChanged=!1,this.hasStoreStateChanged=!1,this.haveStatePropsBeenPrecalculated=!1,this.statePropsPrecalculationError=null,i)throw i;var u=!0,c=!0;A&&s&&(u=n||t&&this.doStatePropsDependOnOwnProps,c=t&&this.doDispatchPropsDependOnOwnProps);var l=!1,p=!1;a?l=!0:u&&(l=this.updateStatePropsIfNeeded()),c&&(p=this.updateDispatchPropsIfNeeded());return!(!!(l||p||t)&&this.updateMergedPropsIfNeeded())&&s?s:(this.renderedElement=O?(0,o.createElement)(e,r({},this.mergedProps,{ref:\"wrappedInstance\"})):(0,o.createElement)(e,this.mergedProps),this.renderedElement)},a}(o.Component);return n.displayName=t,n.WrappedComponent=e,n.contextTypes={store:a.default},n.propTypes={store:a.default},(0,u.default)(n,e)}};var o=n(0),a=l(n(492)),i=l(n(996)),s=l(n(997)),u=(l(n(493)),l(n(144)),l(n(998))),c=l(n(999));function l(e){return e&&e.__esModule?e:{default:e}}function p(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function f(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function h(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var d=function(e){return{}},m=function(e){return{dispatch:e}},v=function(e,t,n){return r({},n,e,t)};function g(e){return e.displayName||e.name||\"Component\"}var y={value:null};function b(e,t){try{return e.apply(t)}catch(e){return y.value=e,y}}var _=0},function(e,t,n){\"use strict\";t.__esModule=!0,t.default=function(e,t){if(e===t)return!0;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(var o=Object.prototype.hasOwnProperty,a=0;a<n.length;a++)if(!o.call(t,n[a])||e[n[a]]!==t[n[a]])return!1;return!0}},function(e,t,n){\"use strict\";t.__esModule=!0,t.default=function(e){return function(t){return(0,r.bindActionCreators)(e,t)}};var r=n(150)},function(e,t,n){\"use strict\";var r=n(388),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function u(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,l=Object.getOwnPropertyNames,p=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,h=Object.getPrototypeOf,d=Object.prototype;e.exports=function e(t,n,r){if(\"string\"!=typeof n){if(d){var o=h(n);o&&o!==d&&e(t,o,r)}var i=l(n);p&&(i=i.concat(p(n)));for(var s=u(t),m=u(n),v=0;v<i.length;++v){var g=i[v];if(!(a[g]||r&&r[g]||m&&m[g]||s&&s[g])){var y=f(n,g);try{c(t,g,y)}catch(e){}}}}return t}},function(e,t,n){\"use strict\";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var u;if(void 0===t)u=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[n,r,o,a,i,s],l=0;(u=new Error(t.replace(/%s/g,(function(){return c[l++]})))).name=\"Invariant Violation\"}throw u.framesToPop=1,u}}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n<r&&!1!==t(e[n],n,e););return e}},function(e,t,n){var r=n(143),o=n(114);e.exports=function(e,t){return e&&r(t,o(t),e)}},function(e,t,n){var r=n(143),o=n(279);e.exports=function(e,t){return e&&r(t,o(t),e)}},function(e,t,n){var r=n(57),o=n(160),a=n(1004),i=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return a(e);var t=o(e),n=[];for(var s in e)(\"constructor\"!=s||!t&&i.call(e,s))&&n.push(s);return n}},function(e,t){e.exports=function(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);return t}},function(e,t,n){(function(e){var r=n(71),o=t&&!t.nodeType&&t,a=o&&\"object\"==typeof e&&e&&!e.nodeType&&e,i=a&&a.exports===o?r.Buffer:void 0,s=i?i.allocUnsafe:void 0;e.exports=function(e,t){if(t)return e.slice();var n=e.length,r=s?s(n):new e.constructor(n);return e.copy(r),r}}).call(this,n(194)(e))},function(e,t){e.exports=function(e,t){var n=-1,r=e.length;for(t||(t=Array(r));++n<r;)t[n]=e[n];return t}},function(e,t,n){var r=n(143),o=n(248);e.exports=function(e,t){return r(e,o(e),t)}},function(e,t,n){var r=n(143),o=n(495);e.exports=function(e,t){return r(e,o(e),t)}},function(e,t){var n=Object.prototype.hasOwnProperty;e.exports=function(e){var t=e.length,r=new e.constructor(t);return t&&\"string\"==typeof e[0]&&n.call(e,\"index\")&&(r.index=e.index,r.input=e.input),r}},function(e,t,n){var r=n(280),o=n(1011),a=n(1012),i=n(1013),s=n(1014);e.exports=function(e,t,n){var u=e.constructor;switch(t){case\"[object ArrayBuffer]\":return r(e);case\"[object Boolean]\":case\"[object Date]\":return new u(+e);case\"[object DataView]\":return o(e,n);case\"[object Float32Array]\":case\"[object Float64Array]\":case\"[object Int8Array]\":case\"[object Int16Array]\":case\"[object Int32Array]\":case\"[object Uint8Array]\":case\"[object Uint8ClampedArray]\":case\"[object Uint16Array]\":case\"[object Uint32Array]\":return s(e,n);case\"[object Map]\":return new u;case\"[object Number]\":case\"[object String]\":return new u(e);case\"[object RegExp]\":return a(e);case\"[object Set]\":return new u;case\"[object Symbol]\":return i(e)}}},function(e,t,n){var r=n(280);e.exports=function(e,t){var n=t?r(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}},function(e,t){var n=/\\w*$/;e.exports=function(e){var t=new e.constructor(e.source,n.exec(e));return t.lastIndex=e.lastIndex,t}},function(e,t,n){var r=n(134),o=r?r.prototype:void 0,a=o?o.valueOf:void 0;e.exports=function(e){return a?Object(a.call(e)):{}}},function(e,t,n){var r=n(280);e.exports=function(e,t){var n=t?r(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}},function(e,t,n){var r=n(1016),o=n(278),a=n(160);e.exports=function(e){return\"function\"!=typeof e.constructor||a(e)?{}:r(o(e))}},function(e,t,n){var r=n(57),o=Object.create,a=function(){function e(){}return function(t){if(!r(t))return{};if(o)return o(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();e.exports=a},function(e,t,n){var r=n(1018),o=n(251),a=n(252),i=a&&a.isMap,s=i?o(i):r;e.exports=s},function(e,t,n){var r=n(161),o=n(89);e.exports=function(e){return o(e)&&\"[object Map]\"==r(e)}},function(e,t,n){var r=n(1020),o=n(251),a=n(252),i=a&&a.isSet,s=i?o(i):r;e.exports=s},function(e,t,n){var r=n(161),o=n(89);e.exports=function(e){return o(e)&&\"[object Set]\"==r(e)}},function(e,t,n){var r=n(135),o=n(1022),a=n(1023),i=n(136);e.exports=function(e,t){return t=r(t,e),null==(e=a(e,t))||delete e[i(o(t))]}},function(e,t){e.exports=function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}},function(e,t,n){var r=n(196),o=n(409);e.exports=function(e,t){return t.length<2?e:r(e,o(t,0,-1))}},function(e,t,n){var r=n(144);e.exports=function(e){return r(e)?void 0:e}},function(e,t,n){var r=n(1026);e.exports=function(e){return(null==e?0:e.length)?r(e,1):[]}},function(e,t,n){var r=n(247),o=n(1027);e.exports=function e(t,n,a,i,s){var u=-1,c=t.length;for(a||(a=o),s||(s=[]);++u<c;){var l=t[u];n>0&&a(l)?n>1?e(l,n-1,a,i,s):r(s,l):i||(s[s.length]=l)}return s}},function(e,t,n){var r=n(134),o=n(192),a=n(50),i=r?r.isConcatSpreadable:void 0;e.exports=function(e){return a(e)||o(e)||!!(i&&e&&e[i])}},function(e,t){e.exports=function(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}},function(e,t,n){var r=n(1030),o=n(464),a=n(254),i=o?function(e,t){return o(e,\"toString\",{configurable:!0,enumerable:!1,value:r(t),writable:!0})}:a;e.exports=i},function(e,t){e.exports=function(e){return function(){return e}}},function(e,t){var n=Date.now;e.exports=function(e){var t=0,r=0;return function(){var o=n(),a=16-(o-r);if(r=o,a>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}},function(e,t,n){var r=n(1033);e.exports=r},function(e,t,n){var r=n(1034),o=String.prototype;e.exports=function(e){var t=e.repeat;return\"string\"==typeof e||e===o||e instanceof String&&t===o.repeat?r:t}},function(e,t,n){n(1035);var r=n(42);e.exports=r(\"String\").repeat},function(e,t,n){n(21)({target:\"String\",proto:!0},{repeat:n(1036)})},function(e,t,n){\"use strict\";var r=n(128),o=n(106);e.exports=function(e){var t=String(o(this)),n=\"\",a=r(e);if(a<0||a==1/0)throw RangeError(\"Wrong number of repetitions\");for(;a>0;(a>>>=1)&&(t+=t))1&a&&(n+=t);return n}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.CopyToClipboard=void 0;var r=a(n(0)),o=a(n(1038));function a(e){return e&&e.__esModule?e:{default:e}}function i(e){return(i=\"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 s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function u(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function c(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function p(e,t){return!t||\"object\"!==i(t)&&\"function\"!=typeof t?h(e):t}function f(e){return(f=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function h(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function d(e,t){return(d=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var v=function(e){function t(){var e,n;c(this,t);for(var a=arguments.length,i=new Array(a),s=0;s<a;s++)i[s]=arguments[s];return m(h(n=p(this,(e=f(t)).call.apply(e,[this].concat(i)))),\"onClick\",(function(e){var t=n.props,a=t.text,i=t.onCopy,s=t.children,u=t.options,c=r.default.Children.only(s),l=(0,o.default)(a,u);i&&i(a,l),c&&c.props&&\"function\"==typeof c.props.onClick&&c.props.onClick(e)})),n}var n,a,i;return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&d(e,t)}(t,e),n=t,(a=[{key:\"render\",value:function(){var e=this.props,t=(e.text,e.onCopy,e.options,e.children),n=u(e,[\"text\",\"onCopy\",\"options\",\"children\"]),o=r.default.Children.only(t);return r.default.cloneElement(o,function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(n,!0).forEach((function(t){m(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(n).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}({},n,{onClick:this.onClick}))}}])&&l(n.prototype,a),i&&l(n,i),t}(r.default.PureComponent);t.CopyToClipboard=v,m(v,\"defaultProps\",{onCopy:void 0,options:void 0})},function(e,t,n){\"use strict\";var r=n(1039),o={\"text/plain\":\"Text\",\"text/html\":\"Url\",default:\"Text\"};e.exports=function(e,t){var n,a,i,s,u,c,l=!1;t||(t={}),n=t.debug||!1;try{if(i=r(),s=document.createRange(),u=document.getSelection(),(c=document.createElement(\"span\")).textContent=e,c.style.all=\"unset\",c.style.position=\"fixed\",c.style.top=0,c.style.clip=\"rect(0, 0, 0, 0)\",c.style.whiteSpace=\"pre\",c.style.webkitUserSelect=\"text\",c.style.MozUserSelect=\"text\",c.style.msUserSelect=\"text\",c.style.userSelect=\"text\",c.addEventListener(\"copy\",(function(r){if(r.stopPropagation(),t.format)if(r.preventDefault(),void 0===r.clipboardData){n&&console.warn(\"unable to use e.clipboardData\"),n&&console.warn(\"trying IE specific stuff\"),window.clipboardData.clearData();var a=o[t.format]||o.default;window.clipboardData.setData(a,e)}else r.clipboardData.clearData(),r.clipboardData.setData(t.format,e);t.onCopy&&(r.preventDefault(),t.onCopy(r.clipboardData))})),document.body.appendChild(c),s.selectNodeContents(c),u.addRange(s),!document.execCommand(\"copy\"))throw new Error(\"copy command was unsuccessful\");l=!0}catch(r){n&&console.error(\"unable to copy using execCommand: \",r),n&&console.warn(\"trying IE specific stuff\");try{window.clipboardData.setData(t.format||\"text\",e),t.onCopy&&t.onCopy(window.clipboardData),l=!0}catch(r){n&&console.error(\"unable to copy using clipboardData: \",r),n&&console.error(\"falling back to prompt\"),a=function(e){var t=(/mac os x/i.test(navigator.userAgent)?\"⌘\":\"Ctrl\")+\"+C\";return e.replace(/#{\\s*key\\s*}/g,t)}(\"message\"in t?t.message:\"Copy to clipboard: #{key}, Enter\"),window.prompt(a,e)}}finally{u&&(\"function\"==typeof u.removeRange?u.removeRange(s):u.removeAllRanges()),c&&document.body.removeChild(c),i()}return l}},function(e,t){e.exports=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var t=document.activeElement,n=[],r=0;r<e.rangeCount;r++)n.push(e.getRangeAt(r));switch(t.tagName.toUpperCase()){case\"INPUT\":case\"TEXTAREA\":t.blur();break;default:t=null}return e.removeAllRanges(),function(){\"Caret\"===e.type&&e.removeAllRanges(),e.rangeCount||n.forEach((function(t){e.addRange(t)})),t&&t.focus()}}},function(e,t){function n(e){return e instanceof Map?e.clear=e.delete=e.set=function(){throw new Error(\"map is read-only\")}:e instanceof Set&&(e.add=e.clear=e.delete=function(){throw new Error(\"set is read-only\")}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((function(t){var r=e[t];\"object\"!=typeof r||Object.isFrozen(r)||n(r)})),e}var r=n,o=n;r.default=o;class a{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function i(e){return e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#x27;\")}function s(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t];return t.forEach((function(e){for(const t in e)n[t]=e[t]})),n}function u(e){return e.nodeName.toLowerCase()}var c=Object.freeze({__proto__:null,escapeHTML:i,inherit:s,nodeStream:function(e){const t=[];return function e(n,r){for(let o=n.firstChild;o;o=o.nextSibling)3===o.nodeType?r+=o.nodeValue.length:1===o.nodeType&&(t.push({event:\"start\",offset:r,node:o}),r=e(o,r),u(o).match(/br|hr|img|input/)||t.push({event:\"stop\",offset:r,node:o}));return r}(e,0),t},mergeStreams:function(e,t,n){let r=0,o=\"\";const a=[];function s(){return e.length&&t.length?e[0].offset!==t[0].offset?e[0].offset<t[0].offset?e:t:\"start\"===t[0].event?e:t:e.length?e:t}function c(e){o+=\"<\"+u(e)+[].map.call(e.attributes,(function(e){return\" \"+e.nodeName+'=\"'+i(e.value)+'\"'})).join(\"\")+\">\"}function l(e){o+=\"</\"+u(e)+\">\"}function p(e){(\"start\"===e.event?c:l)(e.node)}for(;e.length||t.length;){let t=s();if(o+=i(n.substring(r,t[0].offset)),r=t[0].offset,t===e){a.reverse().forEach(l);do{p(t.splice(0,1)[0]),t=s()}while(t===e&&t.length&&t[0].offset===r);a.reverse().forEach(c)}else\"start\"===t[0].event?a.push(t[0].node):a.pop(),p(t.splice(0,1)[0])}return o+i(n.substr(r))}});const l=e=>!!e.kind;class p{constructor(e,t){this.buffer=\"\",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){this.buffer+=i(e)}openNode(e){if(!l(e))return;let t=e.kind;e.sublanguage||(t=`${this.classPrefix}${t}`),this.span(t)}closeNode(e){l(e)&&(this.buffer+=\"</span>\")}value(){return this.buffer}span(e){this.buffer+=`<span class=\"${e}\">`}}class f{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const t={kind:e,children:[]};this.add(t),this.stack.push(t)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){return\"string\"==typeof t?e.addText(t):t.children&&(e.openNode(t),t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){\"string\"!=typeof e&&e.children&&(e.children.every((e=>\"string\"==typeof e))?e.children=[e.children.join(\"\")]:e.children.forEach((e=>{f._collapse(e)})))}}class h extends f{constructor(e){super(),this.options=e}addKeyword(e,t){\"\"!==e&&(this.openNode(t),this.addText(e),this.closeNode())}addText(e){\"\"!==e&&this.add(e)}addSublanguage(e,t){const n=e.root;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){return new p(this,this.options).value()}finalize(){return!0}}function d(e){return e?\"string\"==typeof e?e:e.source:null}const m=\"[a-zA-Z]\\\\w*\",v=\"[a-zA-Z_]\\\\w*\",g=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",y=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",b=\"\\\\b(0b[01]+)\",_={begin:\"\\\\\\\\[\\\\s\\\\S]\",relevance:0},w={className:\"string\",begin:\"'\",end:\"'\",illegal:\"\\\\n\",contains:[_]},x={className:\"string\",begin:'\"',end:'\"',illegal:\"\\\\n\",contains:[_]},E={begin:/\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/},S=function(e,t,n={}){const r=s({className:\"comment\",begin:e,end:t,contains:[]},n);return r.contains.push(E),r.contains.push({className:\"doctag\",begin:\"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):\",relevance:0}),r},C=S(\"//\",\"$\"),A=S(\"/\\\\*\",\"\\\\*/\"),k=S(\"#\",\"$\"),O={className:\"number\",begin:g,relevance:0},j={className:\"number\",begin:y,relevance:0},T={className:\"number\",begin:b,relevance:0},I={className:\"number\",begin:g+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",relevance:0},P={begin:/(?=\\/[^/\\n]*\\/)/,contains:[{className:\"regexp\",begin:/\\//,end:/\\/[gimuy]*/,illegal:/\\n/,contains:[_,{begin:/\\[/,end:/\\]/,relevance:0,contains:[_]}]}]},N={className:\"title\",begin:m,relevance:0},M={className:\"title\",begin:v,relevance:0},R={begin:\"\\\\.\\\\s*[a-zA-Z_]\\\\w*\",relevance:0};var D=Object.freeze({__proto__:null,IDENT_RE:m,UNDERSCORE_IDENT_RE:v,NUMBER_RE:g,C_NUMBER_RE:y,BINARY_NUMBER_RE:b,RE_STARTERS_RE:\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",SHEBANG:(e={})=>{const t=/^#![ ]*\\//;return e.binary&&(e.begin=function(...e){return e.map((e=>d(e))).join(\"\")}(t,/.*\\b/,e.binary,/\\b.*/)),s({className:\"meta\",begin:t,end:/$/,relevance:0,\"on:begin\":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:_,APOS_STRING_MODE:w,QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:E,COMMENT:S,C_LINE_COMMENT_MODE:C,C_BLOCK_COMMENT_MODE:A,HASH_COMMENT_MODE:k,NUMBER_MODE:O,C_NUMBER_MODE:j,BINARY_NUMBER_MODE:T,CSS_NUMBER_MODE:I,REGEXP_MODE:P,TITLE_MODE:N,UNDERSCORE_TITLE_MODE:M,METHOD_GUARD:R,END_SAME_AS_BEGIN:function(e){return Object.assign(e,{\"on:begin\":(e,t)=>{t.data._beginMatch=e[1]},\"on:end\":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}})}});const L=[\"of\",\"and\",\"for\",\"in\",\"not\",\"or\",\"if\",\"then\",\"parent\",\"list\",\"value\"];function B(e){function t(t,n){return new RegExp(d(t),\"m\"+(e.case_insensitive?\"i\":\"\")+(n?\"g\":\"\"))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,t){t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),this.matchAt+=function(e){return new RegExp(e.toString()+\"|\").exec(\"\").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map((e=>e[1]));this.matcherRe=t(function(e,t=\"|\"){const n=/\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./;let r=0,o=\"\";for(let a=0;a<e.length;a++){r+=1;const i=r;let s=d(e[a]);for(a>0&&(o+=t),o+=\"(\";s.length>0;){const e=n.exec(s);if(null==e){o+=s;break}o+=s.substring(0,e.index),s=s.substring(e.index+e[0].length),\"\\\\\"===e[0][0]&&e[1]?o+=\"\\\\\"+String(Number(e[1])+i):(o+=e[0],\"(\"===e[0]&&r++)}o+=\")\"}return o}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e);if(!t)return null;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),r=this.matchIndexes[n];return t.splice(0,n),Object.assign(t,r)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))),t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){this.rules.push([e,t]),\"begin\"===t.type&&this.count++}exec(e){const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex;let n=t.exec(e);if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}return n&&(this.regexIndex+=n.position+1,this.regexIndex===this.count&&this.considerAll()),n}}function o(e,t){\".\"===e.input[e.index-1]&&t.ignoreMatch()}if(e.contains&&e.contains.includes(\"self\"))throw new Error(\"ERR: contains `self` is not supported at the top-level of a language.  See documentation.\");return e.classNameAliases=s(e.classNameAliases||{}),function n(a,i){const u=a;if(a.compiled)return u;a.compiled=!0,a.__beforeBegin=null,a.keywords=a.keywords||a.beginKeywords;let c=null;if(\"object\"==typeof a.keywords&&(c=a.keywords.$pattern,delete a.keywords.$pattern),a.keywords&&(a.keywords=function(e,t){const n={};\"string\"==typeof e?r(\"keyword\",e):Object.keys(e).forEach((function(t){r(t,e[t])}));return n;function r(e,r){t&&(r=r.toLowerCase()),r.split(\" \").forEach((function(t){const r=t.split(\"|\");n[r[0]]=[e,U(r[0],r[1])]}))}}(a.keywords,e.case_insensitive)),a.lexemes&&c)throw new Error(\"ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) \");return u.keywordPatternRe=t(a.lexemes||c||/\\w+/,!0),i&&(a.beginKeywords&&(a.begin=\"\\\\b(\"+a.beginKeywords.split(\" \").join(\"|\")+\")(?!\\\\.)(?=\\\\b|\\\\s)\",a.__beforeBegin=o),a.begin||(a.begin=/\\B|\\b/),u.beginRe=t(a.begin),a.endSameAsBegin&&(a.end=a.begin),a.end||a.endsWithParent||(a.end=/\\B|\\b/),a.end&&(u.endRe=t(a.end)),u.terminator_end=d(a.end)||\"\",a.endsWithParent&&i.terminator_end&&(u.terminator_end+=(a.end?\"|\":\"\")+i.terminator_end)),a.illegal&&(u.illegalRe=t(a.illegal)),void 0===a.relevance&&(a.relevance=1),a.contains||(a.contains=[]),a.contains=[].concat(...a.contains.map((function(e){return function(e){e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(t){return s(e,{variants:null},t)})));if(e.cached_variants)return e.cached_variants;if(F(e))return s(e,{starts:e.starts?s(e.starts):null});if(Object.isFrozen(e))return s(e);return e}(\"self\"===e?a:e)}))),a.contains.forEach((function(e){n(e,u)})),a.starts&&n(a.starts,i),u.matcher=function(e){const t=new r;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:\"begin\"}))),e.terminator_end&&t.addRule(e.terminator_end,{type:\"end\"}),e.illegal&&t.addRule(e.illegal,{type:\"illegal\"}),t}(u),u}(e)}function F(e){return!!e&&(e.endsWithParent||F(e.starts))}function U(e,t){return t?Number(t):function(e){return L.includes(e.toLowerCase())}(e)?0:1}function q(e){const t={props:[\"language\",\"code\",\"autodetect\"],data:function(){return{detectedLanguage:\"\",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?\"\":\"hljs \"+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!e.getLanguage(this.language))return console.warn(`The language \"${this.language}\" you specified could not be found.`),this.unknownLanguage=!0,i(this.code);let t;return this.autoDetect?(t=e.highlightAuto(this.code),this.detectedLanguage=t.language):(t=e.highlight(this.language,this.code,this.ignoreIllegals),this.detectedLanguage=this.language),t.value},autoDetect(){return!this.language||(e=this.autodetect,Boolean(e||\"\"===e));var e},ignoreIllegals:()=>!0},render(e){return e(\"pre\",{},[e(\"code\",{class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{Component:t,VuePlugin:{install(e){e.component(\"highlightjs\",t)}}}}const z=i,V=s,{nodeStream:W,mergeStreams:H}=c,$=Symbol(\"nomatch\");var J=function(e){const t=[],n=Object.create(null),o=Object.create(null),i=[];let s=!0;const u=/(^(<[^>]+>|\\t|)+|\\n)/gm,c=\"Could not find the language '{}', did you forget to load/include a language module?\",l={disableAutodetect:!0,name:\"Plain text\",contains:[]};let p={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\\blang(?:uage)?-([\\w-]+)\\b/i,classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:null,__emitter:h};function f(e){return p.noHighlightRe.test(e)}function d(e,t,n,r){const o={code:t,language:e};E(\"before:highlight\",o);const a=o.result?o.result:m(o.language,o.code,n,r);return a.code=o.code,E(\"after:highlight\",a),a}function m(e,t,r,o){const i=t;function u(e,t){const n=x.case_insensitive?t[0].toLowerCase():t[0];return Object.prototype.hasOwnProperty.call(e.keywords,n)&&e.keywords[n]}function l(){null!=C.subLanguage?function(){if(\"\"===O)return;let e=null;if(\"string\"==typeof C.subLanguage){if(!n[C.subLanguage])return void k.addText(O);e=m(C.subLanguage,O,!0,A[C.subLanguage]),A[C.subLanguage]=e.top}else e=v(O,C.subLanguage.length?C.subLanguage:null);C.relevance>0&&(j+=e.relevance),k.addSublanguage(e.emitter,e.language)}():function(){if(!C.keywords)return void k.addText(O);let e=0;C.keywordPatternRe.lastIndex=0;let t=C.keywordPatternRe.exec(O),n=\"\";for(;t;){n+=O.substring(e,t.index);const r=u(C,t);if(r){const[e,o]=r;k.addText(n),n=\"\",j+=o;const a=x.classNameAliases[e]||e;k.addKeyword(t[0],a)}else n+=t[0];e=C.keywordPatternRe.lastIndex,t=C.keywordPatternRe.exec(O)}n+=O.substr(e),k.addText(n)}(),O=\"\"}function f(e){return e.className&&k.openNode(x.classNameAliases[e.className]||e.className),C=Object.create(e,{parent:{value:C}}),C}function h(e,t,n){let r=function(e,t){const n=e&&e.exec(t);return n&&0===n.index}(e.endRe,n);if(r){if(e[\"on:end\"]){const n=new a(e);e[\"on:end\"](t,n),n.ignore&&(r=!1)}if(r){for(;e.endsParent&&e.parent;)e=e.parent;return e}}if(e.endsWithParent)return h(e.parent,t,n)}function d(e){return 0===C.matcher.regexIndex?(O+=e[0],1):(P=!0,0)}function g(e){const t=e[0],n=e.rule,r=new a(n),o=[n.__beforeBegin,n[\"on:begin\"]];for(const n of o)if(n&&(n(e,r),r.ignore))return d(t);return n&&n.endSameAsBegin&&(n.endRe=new RegExp(t.replace(/[-/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\"),\"m\")),n.skip?O+=t:(n.excludeBegin&&(O+=t),l(),n.returnBegin||n.excludeBegin||(O=t)),f(n),n.returnBegin?0:t.length}function y(e){const t=e[0],n=i.substr(e.index),r=h(C,e,n);if(!r)return $;const o=C;o.skip?O+=t:(o.returnEnd||o.excludeEnd||(O+=t),l(),o.excludeEnd&&(O=t));do{C.className&&k.closeNode(),C.skip||C.subLanguage||(j+=C.relevance),C=C.parent}while(C!==r.parent);return r.starts&&(r.endSameAsBegin&&(r.starts.endRe=r.endRe),f(r.starts)),o.returnEnd?0:t.length}let b={};function w(t,n){const o=n&&n[0];if(O+=t,null==o)return l(),0;if(\"begin\"===b.type&&\"end\"===n.type&&b.index===n.index&&\"\"===o){if(O+=i.slice(n.index,n.index+1),!s){const t=new Error(\"0 width match regex\");throw t.languageName=e,t.badRule=b.rule,t}return 1}if(b=n,\"begin\"===n.type)return g(n);if(\"illegal\"===n.type&&!r){const e=new Error('Illegal lexeme \"'+o+'\" for mode \"'+(C.className||\"<unnamed>\")+'\"');throw e.mode=C,e}if(\"end\"===n.type){const e=y(n);if(e!==$)return e}if(\"illegal\"===n.type&&\"\"===o)return 1;if(I>1e5&&I>3*n.index){throw new Error(\"potential infinite loop, way more iterations than matches\")}return O+=o,o.length}const x=_(e);if(!x)throw console.error(c.replace(\"{}\",e)),new Error('Unknown language: \"'+e+'\"');const E=B(x);let S=\"\",C=o||E;const A={},k=new p.__emitter(p);!function(){const e=[];for(let t=C;t!==x;t=t.parent)t.className&&e.unshift(t.className);e.forEach((e=>k.openNode(e)))}();let O=\"\",j=0,T=0,I=0,P=!1;try{for(C.matcher.considerAll();;){I++,P?P=!1:C.matcher.considerAll(),C.matcher.lastIndex=T;const e=C.matcher.exec(i);if(!e)break;const t=w(i.substring(T,e.index),e);T=e.index+t}return w(i.substr(T)),k.closeAllNodes(),k.finalize(),S=k.toHTML(),{relevance:j,value:S,language:e,illegal:!1,emitter:k,top:C}}catch(t){if(t.message&&t.message.includes(\"Illegal\"))return{illegal:!0,illegalBy:{msg:t.message,context:i.slice(T-100,T+100),mode:t.mode},sofar:S,relevance:0,value:z(i),emitter:k};if(s)return{illegal:!1,relevance:0,value:z(i),emitter:k,language:e,top:C,errorRaised:t};throw t}}function v(e,t){t=t||p.languages||Object.keys(n);const r=function(e){const t={relevance:0,emitter:new p.__emitter(p),value:z(e),illegal:!1,top:l};return t.emitter.addText(e),t}(e),o=t.filter(_).filter(x).map((t=>m(t,e,!1)));o.unshift(r);const a=o.sort(((e,t)=>{if(e.relevance!==t.relevance)return t.relevance-e.relevance;if(e.language&&t.language){if(_(e.language).supersetOf===t.language)return 1;if(_(t.language).supersetOf===e.language)return-1}return 0})),[i,s]=a,u=i;return u.second_best=s,u}function g(e){return p.tabReplace||p.useBR?e.replace(u,(e=>\"\\n\"===e?p.useBR?\"<br>\":e:p.tabReplace?e.replace(/\\t/g,p.tabReplace):e)):e}function y(e){let t=null;const n=function(e){let t=e.className+\" \";t+=e.parentNode?e.parentNode.className:\"\";const n=p.languageDetectRe.exec(t);if(n){const t=_(n[1]);return t||(console.warn(c.replace(\"{}\",n[1])),console.warn(\"Falling back to no-highlight mode for this block.\",e)),t?n[1]:\"no-highlight\"}return t.split(/\\s+/).find((e=>f(e)||_(e)))}(e);if(f(n))return;E(\"before:highlightBlock\",{block:e,language:n}),p.useBR?(t=document.createElement(\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ /]*>/g,\"\\n\")):t=e;const r=t.textContent,a=n?d(n,r,!0):v(r),i=W(t);if(i.length){const e=document.createElement(\"div\");e.innerHTML=a.value,a.value=H(i,W(e),r)}a.value=g(a.value),E(\"after:highlightBlock\",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,t,n){const r=t?o[t]:n,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),e.includes(r)||a.push(r),a.join(\" \").trim()}(e.className,n,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const b=()=>{if(b.called)return;b.called=!0;const e=document.querySelectorAll(\"pre code\");t.forEach.call(e,y)};function _(e){return e=(e||\"\").toLowerCase(),n[e]||n[o[e]]}function w(e,{languageName:t}){\"string\"==typeof e&&(e=[e]),e.forEach((e=>{o[e]=t}))}function x(e){const t=_(e);return t&&!t.disableAutodetect}function E(e,t){const n=e;i.forEach((function(e){e[n]&&e[n](t)}))}Object.assign(e,{highlight:d,highlightAuto:v,fixMarkup:function(e){return console.warn(\"fixMarkup is deprecated and will be removed entirely in v11.0\"),console.warn(\"Please see https://github.com/highlightjs/highlight.js/issues/2534\"),g(e)},highlightBlock:y,configure:function(e){e.useBR&&(console.warn(\"'useBR' option is deprecated and will be removed entirely in v11.0\"),console.warn(\"Please see https://github.com/highlightjs/highlight.js/issues/2559\")),p=V(p,e)},initHighlighting:b,initHighlightingOnLoad:function(){window.addEventListener(\"DOMContentLoaded\",b,!1)},registerLanguage:function(t,r){let o=null;try{o=r(e)}catch(e){if(console.error(\"Language definition for '{}' could not be registered.\".replace(\"{}\",t)),!s)throw e;console.error(e),o=l}o.name||(o.name=t),n[t]=o,o.rawDefinition=r.bind(null,e),o.aliases&&w(o.aliases,{languageName:t})},listLanguages:function(){return Object.keys(n)},getLanguage:_,registerAliases:w,requireLanguage:function(e){console.warn(\"requireLanguage is deprecated and will be removed entirely in the future.\"),console.warn(\"Please see https://github.com/highlightjs/highlight.js/pull/2844\");const t=_(e);if(t)return t;throw new Error(\"The '{}' language is required, but not loaded.\".replace(\"{}\",e))},autoDetection:x,inherit:V,addPlugin:function(e){i.push(e)},vuePlugin:q(e).VuePlugin}),e.debugMode=function(){s=!1},e.safeMode=function(){s=!0},e.versionString=\"10.4.1\";for(const e in D)\"object\"==typeof D[e]&&r(D[e]);return Object.assign(e,D),e}({});e.exports=J},function(e,t,n){\"use strict\";var r=n(1042),o=a(Error);function a(e){return t.displayName=e.displayName||e.name,t;function t(t){return t&&(t=r.apply(null,arguments)),new e(t)}}e.exports=o,o.eval=a(EvalError),o.range=a(RangeError),o.reference=a(ReferenceError),o.syntax=a(SyntaxError),o.type=a(TypeError),o.uri=a(URIError),o.create=a},function(e,t,n){!function(){var t;function n(e){for(var t,n,r,o,a=1,i=[].slice.call(arguments),s=0,u=e.length,c=\"\",l=!1,p=!1,f=function(){return i[a++]},h=function(){for(var n=\"\";/\\d/.test(e[s]);)n+=e[s++],t=e[s];return n.length>0?parseInt(n):null};s<u;++s)if(t=e[s],l)switch(l=!1,\".\"==t?(p=!1,t=e[++s]):\"0\"==t&&\".\"==e[s+1]?(p=!0,t=e[s+=2]):p=!0,o=h(),t){case\"b\":c+=parseInt(f(),10).toString(2);break;case\"c\":c+=\"string\"==typeof(n=f())||n instanceof String?n:String.fromCharCode(parseInt(n,10));break;case\"d\":c+=parseInt(f(),10);break;case\"f\":r=String(parseFloat(f()).toFixed(o||6)),c+=p?r:r.replace(/^0/,\"\");break;case\"j\":c+=JSON.stringify(f());break;case\"o\":c+=\"0\"+parseInt(f(),10).toString(8);break;case\"s\":c+=f();break;case\"x\":c+=\"0x\"+parseInt(f(),10).toString(16);break;case\"X\":c+=\"0x\"+parseInt(f(),10).toString(16).toUpperCase();break;default:c+=t}else\"%\"===t?l=!0:c+=t;return c}(t=e.exports=n).format=n,t.vsprintf=function(e,t){return n.apply(null,[e].concat(t))},\"undefined\"!=typeof console&&\"function\"==typeof console.log&&(t.printf=function(){console.log(n.apply(null,arguments))})}()},function(e,t){e.exports=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}},function(e,t,n){var r=n(500);e.exports=function(e){if(Array.isArray(e))return r(e)}},function(e,t){e.exports=function(e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}},function(e,t,n){var r=n(500);e.exports=function(e,t){if(e){if(\"string\"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return\"Object\"===n&&e.constructor&&(n=e.constructor.name),\"Map\"===n||\"Set\"===n?Array.from(e):\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}},function(e,t){e.exports=function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}},function(e,t){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},function(e,t,n){var r=n(394);e.exports=r},function(e,t,n){var r=n(1051);e.exports=r},function(e,t,n){n(1052);var r=n(34);e.exports=r.Object.entries},function(e,t,n){var r=n(21),o=n(461).entries;r({target:\"Object\",stat:!0},{entries:function(e){return o(e)}})},function(e,t,n){\"use strict\";var r=n(1054),o=n(502),a=n(283),i=Object.prototype.hasOwnProperty,s={brackets:function(e){return e+\"[]\"},comma:\"comma\",indices:function(e,t){return e+\"[\"+t+\"]\"},repeat:function(e){return e}},u=Array.isArray,c=Array.prototype.push,l=function(e,t){c.apply(e,u(t)?t:[t])},p=Date.prototype.toISOString,f=a.default,h={addQueryPrefix:!1,allowDots:!1,charset:\"utf-8\",charsetSentinel:!1,delimiter:\"&\",encode:!0,encoder:o.encode,encodeValuesOnly:!1,format:f,formatter:a.formatters[f],indices:!1,serializeDate:function(e){return p.call(e)},skipNulls:!1,strictNullHandling:!1},d=function e(t,n,a,i,s,c,p,f,d,m,v,g,y,b,_){var w,x=t;if(_.has(t))throw new RangeError(\"Cyclic object value\");if(\"function\"==typeof p?x=p(n,x):x instanceof Date?x=m(x):\"comma\"===a&&u(x)&&(x=o.maybeMap(x,(function(e){return e instanceof Date?m(e):e}))),null===x){if(i)return c&&!y?c(n,h.encoder,b,\"key\",v):n;x=\"\"}if(\"string\"==typeof(w=x)||\"number\"==typeof w||\"boolean\"==typeof w||\"symbol\"==typeof w||\"bigint\"==typeof w||o.isBuffer(x))return c?[g(y?n:c(n,h.encoder,b,\"key\",v))+\"=\"+g(c(x,h.encoder,b,\"value\",v))]:[g(n)+\"=\"+g(String(x))];var E,S=[];if(void 0===x)return S;if(\"comma\"===a&&u(x))E=[{value:x.length>0?x.join(\",\")||null:void 0}];else if(u(p))E=p;else{var C=Object.keys(x);E=f?C.sort(f):C}for(var A=0;A<E.length;++A){var k=E[A],O=\"object\"==typeof k&&void 0!==k.value?k.value:x[k];if(!s||null!==O){var j=u(x)?\"function\"==typeof a?a(n,k):n:n+(d?\".\"+k:\"[\"+k+\"]\");_.set(t,!0);var T=r();l(S,e(O,j,a,i,s,c,p,f,d,m,v,g,y,b,T))}}return S};e.exports=function(e,t){var n,o=e,c=function(e){if(!e)return h;if(null!==e.encoder&&void 0!==e.encoder&&\"function\"!=typeof e.encoder)throw new TypeError(\"Encoder has to be a function.\");var t=e.charset||h.charset;if(void 0!==e.charset&&\"utf-8\"!==e.charset&&\"iso-8859-1\"!==e.charset)throw new TypeError(\"The charset option must be either utf-8, iso-8859-1, or undefined\");var n=a.default;if(void 0!==e.format){if(!i.call(a.formatters,e.format))throw new TypeError(\"Unknown format option provided.\");n=e.format}var r=a.formatters[n],o=h.filter;return(\"function\"==typeof e.filter||u(e.filter))&&(o=e.filter),{addQueryPrefix:\"boolean\"==typeof e.addQueryPrefix?e.addQueryPrefix:h.addQueryPrefix,allowDots:void 0===e.allowDots?h.allowDots:!!e.allowDots,charset:t,charsetSentinel:\"boolean\"==typeof e.charsetSentinel?e.charsetSentinel:h.charsetSentinel,delimiter:void 0===e.delimiter?h.delimiter:e.delimiter,encode:\"boolean\"==typeof e.encode?e.encode:h.encode,encoder:\"function\"==typeof e.encoder?e.encoder:h.encoder,encodeValuesOnly:\"boolean\"==typeof e.encodeValuesOnly?e.encodeValuesOnly:h.encodeValuesOnly,filter:o,format:n,formatter:r,serializeDate:\"function\"==typeof e.serializeDate?e.serializeDate:h.serializeDate,skipNulls:\"boolean\"==typeof e.skipNulls?e.skipNulls:h.skipNulls,sort:\"function\"==typeof e.sort?e.sort:null,strictNullHandling:\"boolean\"==typeof e.strictNullHandling?e.strictNullHandling:h.strictNullHandling}}(t);\"function\"==typeof c.filter?o=(0,c.filter)(\"\",o):u(c.filter)&&(n=c.filter);var p,f=[];if(\"object\"!=typeof o||null===o)return\"\";p=t&&t.arrayFormat in s?t.arrayFormat:t&&\"indices\"in t?t.indices?\"indices\":\"repeat\":\"indices\";var m=s[p];n||(n=Object.keys(o)),c.sort&&n.sort(c.sort);for(var v=r(),g=0;g<n.length;++g){var y=n[g];c.skipNulls&&null===o[y]||l(f,d(o[y],y,m,c.strictNullHandling,c.skipNulls,c.encode?c.encoder:null,c.filter,c.sort,c.allowDots,c.serializeDate,c.format,c.formatter,c.encodeValuesOnly,c.charset,v))}var b=f.join(c.delimiter),_=!0===c.addQueryPrefix?\"?\":\"\";return c.charsetSentinel&&(\"iso-8859-1\"===c.charset?_+=\"utf8=%26%2310003%3B&\":_+=\"utf8=%E2%9C%93&\"),b.length>0?_+b:\"\"}},function(e,t,n){\"use strict\";var r=n(281),o=n(1059),a=n(1061),i=r(\"%TypeError%\"),s=r(\"%WeakMap%\",!0),u=r(\"%Map%\",!0),c=o(\"WeakMap.prototype.get\",!0),l=o(\"WeakMap.prototype.set\",!0),p=o(\"WeakMap.prototype.has\",!0),f=o(\"Map.prototype.get\",!0),h=o(\"Map.prototype.set\",!0),d=o(\"Map.prototype.has\",!0),m=function(e,t){for(var n,r=e;null!==(n=r.next);r=n)if(n.key===t)return r.next=n.next,n.next=e.next,e.next=n,n};e.exports=function(){var e,t,n,r={assert:function(e){if(!r.has(e))throw new i(\"Side channel does not contain \"+a(e))},get:function(r){if(s&&r&&(\"object\"==typeof r||\"function\"==typeof r)){if(e)return c(e,r)}else if(u){if(t)return f(t,r)}else if(n)return function(e,t){var n=m(e,t);return n&&n.value}(n,r)},has:function(r){if(s&&r&&(\"object\"==typeof r||\"function\"==typeof r)){if(e)return p(e,r)}else if(u){if(t)return d(t,r)}else if(n)return function(e,t){return!!m(e,t)}(n,r);return!1},set:function(r,o){s&&r&&(\"object\"==typeof r||\"function\"==typeof r)?(e||(e=new s),l(e,r,o)):u?(t||(t=new u),h(t,r,o)):(n||(n={key:{},next:null}),function(e,t,n){var r=m(e,t);r?r.value=n:e.next={key:t,next:e.next,value:n}}(n,r,o))}};return r}},function(e,t,n){\"use strict\";var r=\"undefined\"!=typeof Symbol&&Symbol,o=n(1056);e.exports=function(){return\"function\"==typeof r&&(\"function\"==typeof Symbol&&(\"symbol\"==typeof r(\"foo\")&&(\"symbol\"==typeof Symbol(\"bar\")&&o())))}},function(e,t,n){\"use strict\";e.exports=function(){if(\"function\"!=typeof Symbol||\"function\"!=typeof Object.getOwnPropertySymbols)return!1;if(\"symbol\"==typeof Symbol.iterator)return!0;var e={},t=Symbol(\"test\"),n=Object(t);if(\"string\"==typeof t)return!1;if(\"[object Symbol]\"!==Object.prototype.toString.call(t))return!1;if(\"[object Symbol]\"!==Object.prototype.toString.call(n))return!1;for(t in e[t]=42,e)return!1;if(\"function\"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if(\"function\"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var r=Object.getOwnPropertySymbols(e);if(1!==r.length||r[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if(\"function\"==typeof Object.getOwnPropertyDescriptor){var o=Object.getOwnPropertyDescriptor(e,t);if(42!==o.value||!0!==o.enumerable)return!1}return!0}},function(e,t,n){\"use strict\";var r=\"Function.prototype.bind called on incompatible \",o=Array.prototype.slice,a=Object.prototype.toString,i=\"[object Function]\";e.exports=function(e){var t=this;if(\"function\"!=typeof t||a.call(t)!==i)throw new TypeError(r+t);for(var n,s=o.call(arguments,1),u=function(){if(this instanceof n){var r=t.apply(this,s.concat(o.call(arguments)));return Object(r)===r?r:this}return t.apply(e,s.concat(o.call(arguments)))},c=Math.max(0,t.length-s.length),l=[],p=0;p<c;p++)l.push(\"$\"+p);if(n=Function(\"binder\",\"return function (\"+l.join(\",\")+\"){ return binder.apply(this,arguments); }\")(u),t.prototype){var f=function(){};f.prototype=t.prototype,n.prototype=new f,f.prototype=null}return n}},function(e,t,n){\"use strict\";var r=n(282);e.exports=r.call(Function.call,Object.prototype.hasOwnProperty)},function(e,t,n){\"use strict\";var r=n(281),o=n(1060),a=o(r(\"String.prototype.indexOf\"));e.exports=function(e,t){var n=r(e,!!t);return\"function\"==typeof n&&a(e,\".prototype.\")>-1?o(n):n}},function(e,t,n){\"use strict\";var r=n(282),o=n(281),a=o(\"%Function.prototype.apply%\"),i=o(\"%Function.prototype.call%\"),s=o(\"%Reflect.apply%\",!0)||r.call(i,a),u=o(\"%Object.getOwnPropertyDescriptor%\",!0),c=o(\"%Object.defineProperty%\",!0),l=o(\"%Math.max%\");if(c)try{c({},\"a\",{value:1})}catch(e){c=null}e.exports=function(e){var t=s(r,i,arguments);if(u&&c){var n=u(t,\"length\");n.configurable&&c(t,\"length\",{value:1+l(0,e.length-(arguments.length-1))})}return t};var p=function(){return s(r,a,arguments)};c?c(e.exports,\"apply\",{value:p}):e.exports.apply=p},function(e,t,n){var r=\"function\"==typeof Map&&Map.prototype,o=Object.getOwnPropertyDescriptor&&r?Object.getOwnPropertyDescriptor(Map.prototype,\"size\"):null,a=r&&o&&\"function\"==typeof o.get?o.get:null,i=r&&Map.prototype.forEach,s=\"function\"==typeof Set&&Set.prototype,u=Object.getOwnPropertyDescriptor&&s?Object.getOwnPropertyDescriptor(Set.prototype,\"size\"):null,c=s&&u&&\"function\"==typeof u.get?u.get:null,l=s&&Set.prototype.forEach,p=\"function\"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,f=\"function\"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,h=Boolean.prototype.valueOf,d=Object.prototype.toString,m=Function.prototype.toString,v=String.prototype.match,g=\"function\"==typeof BigInt?BigInt.prototype.valueOf:null,y=Object.getOwnPropertySymbols,b=\"function\"==typeof Symbol?Symbol.prototype.toString:null,_=Object.prototype.propertyIsEnumerable,w=n(1062).custom,x=w&&A(w)?w:null;function E(e,t,n){var r=\"double\"===(n.quoteStyle||t)?'\"':\"'\";return r+e+r}function S(e){return String(e).replace(/\"/g,\"&quot;\")}function C(e){return\"[object Array]\"===j(e)}function A(e){return\"[object Symbol]\"===j(e)}e.exports=function e(t,n,r,o){var s=n||{};if(O(s,\"quoteStyle\")&&\"single\"!==s.quoteStyle&&\"double\"!==s.quoteStyle)throw new TypeError('option \"quoteStyle\" must be \"single\" or \"double\"');if(O(s,\"maxStringLength\")&&(\"number\"==typeof s.maxStringLength?s.maxStringLength<0&&s.maxStringLength!==1/0:null!==s.maxStringLength))throw new TypeError('option \"maxStringLength\", if provided, must be a positive integer, Infinity, or `null`');var u=!O(s,\"customInspect\")||s.customInspect;if(\"boolean\"!=typeof u)throw new TypeError('option \"customInspect\", if provided, must be `true` or `false`');if(O(s,\"indent\")&&null!==s.indent&&\"\\t\"!==s.indent&&!(parseInt(s.indent,10)===s.indent&&s.indent>0))throw new TypeError('options \"indent\" must be \"\\\\t\", an integer > 0, or `null`');if(void 0===t)return\"undefined\";if(null===t)return\"null\";if(\"boolean\"==typeof t)return t?\"true\":\"false\";if(\"string\"==typeof t)return I(t,s);if(\"number\"==typeof t)return 0===t?1/0/t>0?\"0\":\"-0\":String(t);if(\"bigint\"==typeof t)return String(t)+\"n\";var d=void 0===s.depth?5:s.depth;if(void 0===r&&(r=0),r>=d&&d>0&&\"object\"==typeof t)return C(t)?\"[Array]\":\"[Object]\";var y=function(e,t){var n;if(\"\\t\"===e.indent)n=\"\\t\";else{if(!(\"number\"==typeof e.indent&&e.indent>0))return null;n=Array(e.indent+1).join(\" \")}return{base:n,prev:Array(t+1).join(n)}}(s,r);if(void 0===o)o=[];else if(T(o,t)>=0)return\"[Circular]\";function _(t,n,a){if(n&&(o=o.slice()).push(n),a){var i={depth:s.depth};return O(s,\"quoteStyle\")&&(i.quoteStyle=s.quoteStyle),e(t,i,r+1,o)}return e(t,s,r+1,o)}if(\"function\"==typeof t){var w=function(e){if(e.name)return e.name;var t=v.call(m.call(e),/^function\\s*([\\w$]+)/);if(t)return t[1];return null}(t),k=L(t,_);return\"[Function\"+(w?\": \"+w:\" (anonymous)\")+\"]\"+(k.length>0?\" { \"+k.join(\", \")+\" }\":\"\")}if(A(t)){var P=b.call(t);return\"object\"==typeof t?N(P):P}if(function(e){if(!e||\"object\"!=typeof e)return!1;if(\"undefined\"!=typeof HTMLElement&&e instanceof HTMLElement)return!0;return\"string\"==typeof e.nodeName&&\"function\"==typeof e.getAttribute}(t)){for(var B=\"<\"+String(t.nodeName).toLowerCase(),F=t.attributes||[],U=0;U<F.length;U++)B+=\" \"+F[U].name+\"=\"+E(S(F[U].value),\"double\",s);return B+=\">\",t.childNodes&&t.childNodes.length&&(B+=\"...\"),B+=\"</\"+String(t.nodeName).toLowerCase()+\">\"}if(C(t)){if(0===t.length)return\"[]\";var q=L(t,_);return y&&!function(e){for(var t=0;t<e.length;t++)if(T(e[t],\"\\n\")>=0)return!1;return!0}(q)?\"[\"+D(q,y)+\"]\":\"[ \"+q.join(\", \")+\" ]\"}if(function(e){return\"[object Error]\"===j(e)}(t)){var z=L(t,_);return 0===z.length?\"[\"+String(t)+\"]\":\"{ [\"+String(t)+\"] \"+z.join(\", \")+\" }\"}if(\"object\"==typeof t&&u){if(x&&\"function\"==typeof t[x])return t[x]();if(\"function\"==typeof t.inspect)return t.inspect()}if(function(e){if(!a||!e||\"object\"!=typeof e)return!1;try{a.call(e);try{c.call(e)}catch(e){return!0}return e instanceof Map}catch(e){}return!1}(t)){var V=[];return i.call(t,(function(e,n){V.push(_(n,t,!0)+\" => \"+_(e,t))})),R(\"Map\",a.call(t),V,y)}if(function(e){if(!c||!e||\"object\"!=typeof e)return!1;try{c.call(e);try{a.call(e)}catch(e){return!0}return e instanceof Set}catch(e){}return!1}(t)){var W=[];return l.call(t,(function(e){W.push(_(e,t))})),R(\"Set\",c.call(t),W,y)}if(function(e){if(!p||!e||\"object\"!=typeof e)return!1;try{p.call(e,p);try{f.call(e,f)}catch(e){return!0}return e instanceof WeakMap}catch(e){}return!1}(t))return M(\"WeakMap\");if(function(e){if(!f||!e||\"object\"!=typeof e)return!1;try{f.call(e,f);try{p.call(e,p)}catch(e){return!0}return e instanceof WeakSet}catch(e){}return!1}(t))return M(\"WeakSet\");if(function(e){return\"[object Number]\"===j(e)}(t))return N(_(Number(t)));if(function(e){return\"[object BigInt]\"===j(e)}(t))return N(_(g.call(t)));if(function(e){return\"[object Boolean]\"===j(e)}(t))return N(h.call(t));if(function(e){return\"[object String]\"===j(e)}(t))return N(_(String(t)));if(!function(e){return\"[object Date]\"===j(e)}(t)&&!function(e){return\"[object RegExp]\"===j(e)}(t)){var H=L(t,_);return 0===H.length?\"{}\":y?\"{\"+D(H,y)+\"}\":\"{ \"+H.join(\", \")+\" }\"}return String(t)};var k=Object.prototype.hasOwnProperty||function(e){return e in this};function O(e,t){return k.call(e,t)}function j(e){return d.call(e)}function T(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1}function I(e,t){if(e.length>t.maxStringLength){var n=e.length-t.maxStringLength,r=\"... \"+n+\" more character\"+(n>1?\"s\":\"\");return I(e.slice(0,t.maxStringLength),t)+r}return E(e.replace(/(['\\\\])/g,\"\\\\$1\").replace(/[\\x00-\\x1f]/g,P),\"single\",t)}function P(e){var t=e.charCodeAt(0),n={8:\"b\",9:\"t\",10:\"n\",12:\"f\",13:\"r\"}[t];return n?\"\\\\\"+n:\"\\\\x\"+(t<16?\"0\":\"\")+t.toString(16).toUpperCase()}function N(e){return\"Object(\"+e+\")\"}function M(e){return e+\" { ? }\"}function R(e,t,n,r){return e+\" (\"+t+\") {\"+(r?D(n,r):n.join(\", \"))+\"}\"}function D(e,t){if(0===e.length)return\"\";var n=\"\\n\"+t.prev+t.base;return n+e.join(\",\"+n)+\"\\n\"+t.prev}function L(e,t){var n=C(e),r=[];if(n){r.length=e.length;for(var o=0;o<e.length;o++)r[o]=O(e,o)?t(e[o],e):\"\"}for(var a in e)O(e,a)&&(n&&String(Number(a))===a&&a<e.length||(/[^\\w$]/.test(a)?r.push(t(a,e)+\": \"+t(e[a],e)):r.push(a+\": \"+t(e[a],e))));if(\"function\"==typeof y)for(var i=y(e),s=0;s<i.length;s++)_.call(e,i[s])&&r.push(\"[\"+t(i[s])+\"]: \"+t(e[i[s]],e));return r}},function(e,t){},function(e,t,n){\"use strict\";var r=n(502),o=Object.prototype.hasOwnProperty,a=Array.isArray,i={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:\"utf-8\",charsetSentinel:!1,comma:!1,decoder:r.decode,delimiter:\"&\",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},s=function(e){return e.replace(/&#(\\d+);/g,(function(e,t){return String.fromCharCode(parseInt(t,10))}))},u=function(e,t){return e&&\"string\"==typeof e&&t.comma&&e.indexOf(\",\")>-1?e.split(\",\"):e},c=function(e,t,n,r){if(e){var a=n.allowDots?e.replace(/\\.([^.[]+)/g,\"[$1]\"):e,i=/(\\[[^[\\]]*])/g,s=n.depth>0&&/(\\[[^[\\]]*])/.exec(a),c=s?a.slice(0,s.index):a,l=[];if(c){if(!n.plainObjects&&o.call(Object.prototype,c)&&!n.allowPrototypes)return;l.push(c)}for(var p=0;n.depth>0&&null!==(s=i.exec(a))&&p<n.depth;){if(p+=1,!n.plainObjects&&o.call(Object.prototype,s[1].slice(1,-1))&&!n.allowPrototypes)return;l.push(s[1])}return s&&l.push(\"[\"+a.slice(s.index)+\"]\"),function(e,t,n,r){for(var o=r?t:u(t,n),a=e.length-1;a>=0;--a){var i,s=e[a];if(\"[]\"===s&&n.parseArrays)i=[].concat(o);else{i=n.plainObjects?Object.create(null):{};var c=\"[\"===s.charAt(0)&&\"]\"===s.charAt(s.length-1)?s.slice(1,-1):s,l=parseInt(c,10);n.parseArrays||\"\"!==c?!isNaN(l)&&s!==c&&String(l)===c&&l>=0&&n.parseArrays&&l<=n.arrayLimit?(i=[])[l]=o:i[c]=o:i={0:o}}o=i}return o}(l,t,n,r)}};e.exports=function(e,t){var n=function(e){if(!e)return i;if(null!==e.decoder&&void 0!==e.decoder&&\"function\"!=typeof e.decoder)throw new TypeError(\"Decoder has to be a function.\");if(void 0!==e.charset&&\"utf-8\"!==e.charset&&\"iso-8859-1\"!==e.charset)throw new TypeError(\"The charset option must be either utf-8, iso-8859-1, or undefined\");var t=void 0===e.charset?i.charset:e.charset;return{allowDots:void 0===e.allowDots?i.allowDots:!!e.allowDots,allowPrototypes:\"boolean\"==typeof e.allowPrototypes?e.allowPrototypes:i.allowPrototypes,allowSparse:\"boolean\"==typeof e.allowSparse?e.allowSparse:i.allowSparse,arrayLimit:\"number\"==typeof e.arrayLimit?e.arrayLimit:i.arrayLimit,charset:t,charsetSentinel:\"boolean\"==typeof e.charsetSentinel?e.charsetSentinel:i.charsetSentinel,comma:\"boolean\"==typeof e.comma?e.comma:i.comma,decoder:\"function\"==typeof e.decoder?e.decoder:i.decoder,delimiter:\"string\"==typeof e.delimiter||r.isRegExp(e.delimiter)?e.delimiter:i.delimiter,depth:\"number\"==typeof e.depth||!1===e.depth?+e.depth:i.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:\"boolean\"==typeof e.interpretNumericEntities?e.interpretNumericEntities:i.interpretNumericEntities,parameterLimit:\"number\"==typeof e.parameterLimit?e.parameterLimit:i.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:\"boolean\"==typeof e.plainObjects?e.plainObjects:i.plainObjects,strictNullHandling:\"boolean\"==typeof e.strictNullHandling?e.strictNullHandling:i.strictNullHandling}}(t);if(\"\"===e||null==e)return n.plainObjects?Object.create(null):{};for(var l=\"string\"==typeof e?function(e,t){var n,c={},l=t.ignoreQueryPrefix?e.replace(/^\\?/,\"\"):e,p=t.parameterLimit===1/0?void 0:t.parameterLimit,f=l.split(t.delimiter,p),h=-1,d=t.charset;if(t.charsetSentinel)for(n=0;n<f.length;++n)0===f[n].indexOf(\"utf8=\")&&(\"utf8=%E2%9C%93\"===f[n]?d=\"utf-8\":\"utf8=%26%2310003%3B\"===f[n]&&(d=\"iso-8859-1\"),h=n,n=f.length);for(n=0;n<f.length;++n)if(n!==h){var m,v,g=f[n],y=g.indexOf(\"]=\"),b=-1===y?g.indexOf(\"=\"):y+1;-1===b?(m=t.decoder(g,i.decoder,d,\"key\"),v=t.strictNullHandling?null:\"\"):(m=t.decoder(g.slice(0,b),i.decoder,d,\"key\"),v=r.maybeMap(u(g.slice(b+1),t),(function(e){return t.decoder(e,i.decoder,d,\"value\")}))),v&&t.interpretNumericEntities&&\"iso-8859-1\"===d&&(v=s(v)),g.indexOf(\"[]=\")>-1&&(v=a(v)?[v]:v),o.call(c,m)?c[m]=r.combine(c[m],v):c[m]=v}return c}(e,n):e,p=n.plainObjects?Object.create(null):{},f=Object.keys(l),h=0;h<f.length;++h){var d=f[h],m=c(d,l[d],n,\"string\"==typeof e);p=r.merge(p,m,n)}return!0===n.allowSparse?p:r.compact(p)}},function(e,t,n){var r=n(1065),o=n(425);e.exports=function(e,t){return r(e,t,(function(t,n){return o(e,n)}))}},function(e,t,n){var r=n(196),o=n(462),a=n(135);e.exports=function(e,t,n){for(var i=-1,s=t.length,u={};++i<s;){var c=t[i],l=r(e,c);n(l,c)&&o(u,a(c,e),l)}return u}},function(e,t,n){var r=n(1067);e.exports=r},function(e,t,n){var r=n(1068),o=Array.prototype;e.exports=function(e){var t=e.splice;return e===o||e instanceof Array&&t===o.splice?r:t}},function(e,t,n){n(1069);var r=n(42);e.exports=r(\"Array\").splice},function(e,t,n){\"use strict\";var r=n(21),o=n(232),a=n(128),i=n(69),s=n(60),u=n(226),c=n(153),l=n(154)(\"splice\"),p=Math.max,f=Math.min,h=9007199254740991,d=\"Maximum allowed length exceeded\";r({target:\"Array\",proto:!0,forced:!l},{splice:function(e,t){var n,r,l,m,v,g,y=s(this),b=i(y.length),_=o(e,b),w=arguments.length;if(0===w?n=r=0:1===w?(n=0,r=b-_):(n=w-2,r=f(p(a(t),0),b-_)),b+n-r>h)throw TypeError(d);for(l=u(y,r),m=0;m<r;m++)(v=_+m)in y&&c(l,m,y[v]);if(l.length=r,n<r){for(m=_;m<b-r;m++)g=m+n,(v=m+r)in y?y[g]=y[v]:delete y[g];for(m=b;m>b-r+n;m--)delete y[m-1]}else if(n>r)for(m=b-r;m>_;m--)g=m+n-1,(v=m+r-1)in y?y[g]=y[v]:delete y[g];for(m=0;m<n;m++)y[m+_]=arguments[m+2];return y.length=b-r+n,l}})},function(e,t,n){var r=n(1071);e.exports=r},function(e,t,n){n(180),n(1072),n(87);var r=n(34);e.exports=r.WeakMap},function(e,t,n){\"use strict\";var r,o=n(40),a=n(163),i=n(207),s=n(503),u=n(1074),c=n(47),l=n(78).enforce,p=n(367),f=!o.ActiveXObject&&\"ActiveXObject\"in o,h=Object.isExtensible,d=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},m=e.exports=s(\"WeakMap\",d,u);if(p&&f){r=u.getConstructor(d,\"WeakMap\",!0),i.REQUIRED=!0;var v=m.prototype,g=v.delete,y=v.has,b=v.get,_=v.set;a(v,{delete:function(e){if(c(e)&&!h(e)){var t=l(this);return t.frozen||(t.frozen=new r),g.call(this,e)||t.frozen.delete(e)}return g.call(this,e)},has:function(e){if(c(e)&&!h(e)){var t=l(this);return t.frozen||(t.frozen=new r),y.call(this,e)||t.frozen.has(e)}return y.call(this,e)},get:function(e){if(c(e)&&!h(e)){var t=l(this);return t.frozen||(t.frozen=new r),y.call(this,e)?b.call(this,e):t.frozen.get(e)}return b.call(this,e)},set:function(e,t){if(c(e)&&!h(e)){var n=l(this);n.frozen||(n.frozen=new r),y.call(this,e)?_.call(this,e,t):n.frozen.set(e,t)}else _.call(this,e,t);return this}})}},function(e,t,n){var r=n(37);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},function(e,t,n){\"use strict\";var r=n(163),o=n(207).getWeakData,a=n(52),i=n(47),s=n(139),u=n(121),c=n(86),l=n(55),p=n(78),f=p.set,h=p.getterFor,d=c.find,m=c.findIndex,v=0,g=function(e){return e.frozen||(e.frozen=new y)},y=function(){this.entries=[]},b=function(e,t){return d(e.entries,(function(e){return e[0]===t}))};y.prototype={get:function(e){var t=b(this,e);if(t)return t[1]},has:function(e){return!!b(this,e)},set:function(e,t){var n=b(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=m(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,c){var p=e((function(e,r){s(e,p,t),f(e,{type:t,id:v++,frozen:void 0}),null!=r&&u(r,e[c],{that:e,AS_ENTRIES:n})})),d=h(t),m=function(e,t,n){var r=d(e),i=o(a(t),!0);return!0===i?g(r).set(t,n):i[r.id]=n,e};return r(p.prototype,{delete:function(e){var t=d(this);if(!i(e))return!1;var n=o(e);return!0===n?g(t).delete(e):n&&l(n,t.id)&&delete n[t.id]},has:function(e){var t=d(this);if(!i(e))return!1;var n=o(e);return!0===n?g(t).has(e):n&&l(n,t.id)}}),r(p.prototype,n?{get:function(e){var t=d(this);if(i(e)){var n=o(e);return!0===n?g(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return m(this,e,t)}}:{add:function(e){return m(this,e,!0)}}),p}}},function(e,t,n){(function(e,r){var o;!function(a){t&&t.nodeType,e&&e.nodeType;var i=\"object\"==typeof r&&r;i.global!==i&&i.window!==i&&i.self;var s,u=2147483647,c=36,l=/^xn--/,p=/[^\\x20-\\x7E]/,f=/[\\x2E\\u3002\\uFF0E\\uFF61]/g,h={overflow:\"Overflow: input needs wider integers to process\",\"not-basic\":\"Illegal input >= 0x80 (not a basic code point)\",\"invalid-input\":\"Invalid input\"},d=Math.floor,m=String.fromCharCode;function v(e){throw RangeError(h[e])}function g(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function y(e,t){var n=e.split(\"@\"),r=\"\";return n.length>1&&(r=n[0]+\"@\",e=n[1]),r+g((e=e.replace(f,\".\")).split(\".\"),t).join(\".\")}function b(e){for(var t,n,r=[],o=0,a=e.length;o<a;)(t=e.charCodeAt(o++))>=55296&&t<=56319&&o<a?56320==(64512&(n=e.charCodeAt(o++)))?r.push(((1023&t)<<10)+(1023&n)+65536):(r.push(t),o--):r.push(t);return r}function _(e){return g(e,(function(e){var t=\"\";return e>65535&&(t+=m((e-=65536)>>>10&1023|55296),e=56320|1023&e),t+=m(e)})).join(\"\")}function w(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function x(e,t,n){var r=0;for(e=n?d(e/700):e>>1,e+=d(e/t);e>455;r+=c)e=d(e/35);return d(r+36*e/(e+38))}function E(e){var t,n,r,o,a,i,s,l,p,f,h,m=[],g=e.length,y=0,b=128,w=72;for((n=e.lastIndexOf(\"-\"))<0&&(n=0),r=0;r<n;++r)e.charCodeAt(r)>=128&&v(\"not-basic\"),m.push(e.charCodeAt(r));for(o=n>0?n+1:0;o<g;){for(a=y,i=1,s=c;o>=g&&v(\"invalid-input\"),((l=(h=e.charCodeAt(o++))-48<10?h-22:h-65<26?h-65:h-97<26?h-97:c)>=c||l>d((u-y)/i))&&v(\"overflow\"),y+=l*i,!(l<(p=s<=w?1:s>=w+26?26:s-w));s+=c)i>d(u/(f=c-p))&&v(\"overflow\"),i*=f;w=x(y-a,t=m.length+1,0==a),d(y/t)>u-b&&v(\"overflow\"),b+=d(y/t),y%=t,m.splice(y++,0,b)}return _(m)}function S(e){var t,n,r,o,a,i,s,l,p,f,h,g,y,_,E,S=[];for(g=(e=b(e)).length,t=128,n=0,a=72,i=0;i<g;++i)(h=e[i])<128&&S.push(m(h));for(r=o=S.length,o&&S.push(\"-\");r<g;){for(s=u,i=0;i<g;++i)(h=e[i])>=t&&h<s&&(s=h);for(s-t>d((u-n)/(y=r+1))&&v(\"overflow\"),n+=(s-t)*y,t=s,i=0;i<g;++i)if((h=e[i])<t&&++n>u&&v(\"overflow\"),h==t){for(l=n,p=c;!(l<(f=p<=a?1:p>=a+26?26:p-a));p+=c)E=l-f,_=c-f,S.push(m(w(f+E%_,0))),l=d(E/_);S.push(m(w(l,0))),a=x(n,y,r==o),n=0,++r}++n,++t}return S.join(\"\")}s={version:\"1.3.2\",ucs2:{decode:b,encode:_},decode:E,encode:S,toASCII:function(e){return y(e,(function(e){return p.test(e)?\"xn--\"+S(e):e}))},toUnicode:function(e){return y(e,(function(e){return l.test(e)?E(e.slice(4).toLowerCase()):e}))}},void 0===(o=function(){return s}.call(t,n,t,e))||(e.exports=o)}()}).call(this,n(194)(e),n(51))},function(e,t,n){\"use strict\";e.exports={isString:function(e){return\"string\"==typeof e},isObject:function(e){return\"object\"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},function(e,t,n){\"use strict\";t.decode=t.parse=n(1078),t.encode=t.stringify=n(1079)},function(e,t,n){\"use strict\";function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}e.exports=function(e,t,n,a){t=t||\"&\",n=n||\"=\";var i={};if(\"string\"!=typeof e||0===e.length)return i;var s=/\\+/g;e=e.split(t);var u=1e3;a&&\"number\"==typeof a.maxKeys&&(u=a.maxKeys);var c=e.length;u>0&&c>u&&(c=u);for(var l=0;l<c;++l){var p,f,h,d,m=e[l].replace(s,\"%20\"),v=m.indexOf(n);v>=0?(p=m.substr(0,v),f=m.substr(v+1)):(p=m,f=\"\"),h=decodeURIComponent(p),d=decodeURIComponent(f),r(i,h)?o(i[h])?i[h].push(d):i[h]=[i[h],d]:i[h]=d}return i};var o=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)}},function(e,t,n){\"use strict\";var r=function(e){switch(typeof e){case\"string\":return e;case\"boolean\":return e?\"true\":\"false\";case\"number\":return isFinite(e)?e:\"\";default:return\"\"}};e.exports=function(e,t,n,s){return t=t||\"&\",n=n||\"=\",null===e&&(e=void 0),\"object\"==typeof e?a(i(e),(function(i){var s=encodeURIComponent(r(i))+n;return o(e[i])?a(e[i],(function(e){return s+encodeURIComponent(r(e))})).join(t):s+encodeURIComponent(r(e[i]))})).join(t):s?encodeURIComponent(r(s))+n+encodeURIComponent(r(e)):\"\"};var o=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)};function a(e,t){if(e.map)return e.map(t);for(var n=[],r=0;r<e.length;r++)n.push(t(e[r],r));return n}var i=Object.keys||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t}},function(e,t){e.exports=function(e,t,n){return e==e&&(void 0!==n&&(e=e<=n?e:n),void 0!==t&&(e=e>=t?e:t)),e}},function(e,t,n){var r=n(1082),o=n(429);e.exports=function(e){return r((function(t,n){var r=-1,a=n.length,i=a>1?n[a-1]:void 0,s=a>2?n[2]:void 0;for(i=e.length>3&&\"function\"==typeof i?(a--,i):void 0,s&&o(n[0],n[1],s)&&(i=a<3?void 0:i,a=1),t=Object(t);++r<a;){var u=n[r];u&&e(t,u,r,i)}return t}))}},function(e,t,n){var r=n(254),o=n(498),a=n(499);e.exports=function(e,t){return a(o(e,t,r),e+\"\")}},function(e,t,n){var r=n(1084);e.exports=r},function(e,t,n){n(1085),n(1088),n(505);var r=n(34);e.exports=r.URL},function(e,t,n){\"use strict\";n(130);var r,o=n(21),a=n(48),i=n(504),s=n(40),u=n(230),c=n(110),l=n(139),p=n(55),f=n(380),h=n(395),d=n(370).codeAt,m=n(1086),v=n(98),g=n(505),y=n(78),b=s.URL,_=g.URLSearchParams,w=g.getState,x=y.set,E=y.getterFor(\"URL\"),S=Math.floor,C=Math.pow,A=\"Invalid scheme\",k=\"Invalid host\",O=\"Invalid port\",j=/[A-Za-z]/,T=/[\\d+-.A-Za-z]/,I=/\\d/,P=/^0x/i,N=/^[0-7]+$/,M=/^\\d+$/,R=/^[\\dA-Fa-f]+$/,D=/[\\0\\t\\n\\r #%/:<>?@[\\\\\\]^|]/,L=/[\\0\\t\\n\\r #/:<>?@[\\\\\\]^|]/,B=/^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g,F=/[\\t\\n\\r]/g,U=function(e,t){var n,r,o;if(\"[\"==t.charAt(0)){if(\"]\"!=t.charAt(t.length-1))return k;if(!(n=z(t.slice(1,-1))))return k;e.host=n}else if(G(e)){if(t=m(t),D.test(t))return k;if(null===(n=q(t)))return k;e.host=n}else{if(L.test(t))return k;for(n=\"\",r=h(t),o=0;o<r.length;o++)n+=K(r[o],W);e.host=n}},q=function(e){var t,n,r,o,a,i,s,u=e.split(\".\");if(u.length&&\"\"==u[u.length-1]&&u.pop(),(t=u.length)>4)return e;for(n=[],r=0;r<t;r++){if(\"\"==(o=u[r]))return e;if(a=10,o.length>1&&\"0\"==o.charAt(0)&&(a=P.test(o)?16:8,o=o.slice(8==a?1:2)),\"\"===o)i=0;else{if(!(10==a?M:8==a?N:R).test(o))return e;i=parseInt(o,a)}n.push(i)}for(r=0;r<t;r++)if(i=n[r],r==t-1){if(i>=C(256,5-t))return null}else if(i>255)return null;for(s=n.pop(),r=0;r<n.length;r++)s+=n[r]*C(256,3-r);return s},z=function(e){var t,n,r,o,a,i,s,u=[0,0,0,0,0,0,0,0],c=0,l=null,p=0,f=function(){return e.charAt(p)};if(\":\"==f()){if(\":\"!=e.charAt(1))return;p+=2,l=++c}for(;f();){if(8==c)return;if(\":\"!=f()){for(t=n=0;n<4&&R.test(f());)t=16*t+parseInt(f(),16),p++,n++;if(\".\"==f()){if(0==n)return;if(p-=n,c>6)return;for(r=0;f();){if(o=null,r>0){if(!(\".\"==f()&&r<4))return;p++}if(!I.test(f()))return;for(;I.test(f());){if(a=parseInt(f(),10),null===o)o=a;else{if(0==o)return;o=10*o+a}if(o>255)return;p++}u[c]=256*u[c]+o,2!=++r&&4!=r||c++}if(4!=r)return;break}if(\":\"==f()){if(p++,!f())return}else if(f())return;u[c++]=t}else{if(null!==l)return;p++,l=++c}}if(null!==l)for(i=c-l,c=7;0!=c&&i>0;)s=u[c],u[c--]=u[l+i-1],u[l+--i]=s;else if(8!=c)return;return u},V=function(e){var t,n,r,o;if(\"number\"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=S(e/256);return t.join(\".\")}if(\"object\"==typeof e){for(t=\"\",r=function(e){for(var t=null,n=1,r=null,o=0,a=0;a<8;a++)0!==e[a]?(o>n&&(t=r,n=o),r=null,o=0):(null===r&&(r=a),++o);return o>n&&(t=r,n=o),t}(e),n=0;n<8;n++)o&&0===e[n]||(o&&(o=!1),r===n?(t+=n?\":\":\"::\",o=!0):(t+=e[n].toString(16),n<7&&(t+=\":\")));return\"[\"+t+\"]\"}return e},W={},H=f({},W,{\" \":1,'\"':1,\"<\":1,\">\":1,\"`\":1}),$=f({},H,{\"#\":1,\"?\":1,\"{\":1,\"}\":1}),J=f({},$,{\"/\":1,\":\":1,\";\":1,\"=\":1,\"@\":1,\"[\":1,\"\\\\\":1,\"]\":1,\"^\":1,\"|\":1}),K=function(e,t){var n=d(e,0);return n>32&&n<127&&!p(t,e)?e:encodeURIComponent(e)},Y={ftp:21,file:null,http:80,https:443,ws:80,wss:443},G=function(e){return p(Y,e.scheme)},Z=function(e){return\"\"!=e.username||\"\"!=e.password},X=function(e){return!e.host||e.cannotBeABaseURL||\"file\"==e.scheme},Q=function(e,t){var n;return 2==e.length&&j.test(e.charAt(0))&&(\":\"==(n=e.charAt(1))||!t&&\"|\"==n)},ee=function(e){var t;return e.length>1&&Q(e.slice(0,2))&&(2==e.length||\"/\"===(t=e.charAt(2))||\"\\\\\"===t||\"?\"===t||\"#\"===t)},te=function(e){var t=e.path,n=t.length;!n||\"file\"==e.scheme&&1==n&&Q(t[0],!0)||t.pop()},ne=function(e){return\".\"===e||\"%2e\"===e.toLowerCase()},re={},oe={},ae={},ie={},se={},ue={},ce={},le={},pe={},fe={},he={},de={},me={},ve={},ge={},ye={},be={},_e={},we={},xe={},Ee={},Se=function(e,t,n,o){var a,i,s,u,c,l=n||re,f=0,d=\"\",m=!1,v=!1,g=!1;for(n||(e.scheme=\"\",e.username=\"\",e.password=\"\",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(B,\"\")),t=t.replace(F,\"\"),a=h(t);f<=a.length;){switch(i=a[f],l){case re:if(!i||!j.test(i)){if(n)return A;l=ae;continue}d+=i.toLowerCase(),l=oe;break;case oe:if(i&&(T.test(i)||\"+\"==i||\"-\"==i||\".\"==i))d+=i.toLowerCase();else{if(\":\"!=i){if(n)return A;d=\"\",l=ae,f=0;continue}if(n&&(G(e)!=p(Y,d)||\"file\"==d&&(Z(e)||null!==e.port)||\"file\"==e.scheme&&!e.host))return;if(e.scheme=d,n)return void(G(e)&&Y[e.scheme]==e.port&&(e.port=null));d=\"\",\"file\"==e.scheme?l=ve:G(e)&&o&&o.scheme==e.scheme?l=ie:G(e)?l=le:\"/\"==a[f+1]?(l=se,f++):(e.cannotBeABaseURL=!0,e.path.push(\"\"),l=we)}break;case ae:if(!o||o.cannotBeABaseURL&&\"#\"!=i)return A;if(o.cannotBeABaseURL&&\"#\"==i){e.scheme=o.scheme,e.path=o.path.slice(),e.query=o.query,e.fragment=\"\",e.cannotBeABaseURL=!0,l=Ee;break}l=\"file\"==o.scheme?ve:ue;continue;case ie:if(\"/\"!=i||\"/\"!=a[f+1]){l=ue;continue}l=pe,f++;break;case se:if(\"/\"==i){l=fe;break}l=_e;continue;case ue:if(e.scheme=o.scheme,i==r)e.username=o.username,e.password=o.password,e.host=o.host,e.port=o.port,e.path=o.path.slice(),e.query=o.query;else if(\"/\"==i||\"\\\\\"==i&&G(e))l=ce;else if(\"?\"==i)e.username=o.username,e.password=o.password,e.host=o.host,e.port=o.port,e.path=o.path.slice(),e.query=\"\",l=xe;else{if(\"#\"!=i){e.username=o.username,e.password=o.password,e.host=o.host,e.port=o.port,e.path=o.path.slice(),e.path.pop(),l=_e;continue}e.username=o.username,e.password=o.password,e.host=o.host,e.port=o.port,e.path=o.path.slice(),e.query=o.query,e.fragment=\"\",l=Ee}break;case ce:if(!G(e)||\"/\"!=i&&\"\\\\\"!=i){if(\"/\"!=i){e.username=o.username,e.password=o.password,e.host=o.host,e.port=o.port,l=_e;continue}l=fe}else l=pe;break;case le:if(l=pe,\"/\"!=i||\"/\"!=d.charAt(f+1))continue;f++;break;case pe:if(\"/\"!=i&&\"\\\\\"!=i){l=fe;continue}break;case fe:if(\"@\"==i){m&&(d=\"%40\"+d),m=!0,s=h(d);for(var y=0;y<s.length;y++){var b=s[y];if(\":\"!=b||g){var _=K(b,J);g?e.password+=_:e.username+=_}else g=!0}d=\"\"}else if(i==r||\"/\"==i||\"?\"==i||\"#\"==i||\"\\\\\"==i&&G(e)){if(m&&\"\"==d)return\"Invalid authority\";f-=h(d).length+1,d=\"\",l=he}else d+=i;break;case he:case de:if(n&&\"file\"==e.scheme){l=ye;continue}if(\":\"!=i||v){if(i==r||\"/\"==i||\"?\"==i||\"#\"==i||\"\\\\\"==i&&G(e)){if(G(e)&&\"\"==d)return k;if(n&&\"\"==d&&(Z(e)||null!==e.port))return;if(u=U(e,d))return u;if(d=\"\",l=be,n)return;continue}\"[\"==i?v=!0:\"]\"==i&&(v=!1),d+=i}else{if(\"\"==d)return k;if(u=U(e,d))return u;if(d=\"\",l=me,n==de)return}break;case me:if(!I.test(i)){if(i==r||\"/\"==i||\"?\"==i||\"#\"==i||\"\\\\\"==i&&G(e)||n){if(\"\"!=d){var w=parseInt(d,10);if(w>65535)return O;e.port=G(e)&&w===Y[e.scheme]?null:w,d=\"\"}if(n)return;l=be;continue}return O}d+=i;break;case ve:if(e.scheme=\"file\",\"/\"==i||\"\\\\\"==i)l=ge;else{if(!o||\"file\"!=o.scheme){l=_e;continue}if(i==r)e.host=o.host,e.path=o.path.slice(),e.query=o.query;else if(\"?\"==i)e.host=o.host,e.path=o.path.slice(),e.query=\"\",l=xe;else{if(\"#\"!=i){ee(a.slice(f).join(\"\"))||(e.host=o.host,e.path=o.path.slice(),te(e)),l=_e;continue}e.host=o.host,e.path=o.path.slice(),e.query=o.query,e.fragment=\"\",l=Ee}}break;case ge:if(\"/\"==i||\"\\\\\"==i){l=ye;break}o&&\"file\"==o.scheme&&!ee(a.slice(f).join(\"\"))&&(Q(o.path[0],!0)?e.path.push(o.path[0]):e.host=o.host),l=_e;continue;case ye:if(i==r||\"/\"==i||\"\\\\\"==i||\"?\"==i||\"#\"==i){if(!n&&Q(d))l=_e;else if(\"\"==d){if(e.host=\"\",n)return;l=be}else{if(u=U(e,d))return u;if(\"localhost\"==e.host&&(e.host=\"\"),n)return;d=\"\",l=be}continue}d+=i;break;case be:if(G(e)){if(l=_e,\"/\"!=i&&\"\\\\\"!=i)continue}else if(n||\"?\"!=i)if(n||\"#\"!=i){if(i!=r&&(l=_e,\"/\"!=i))continue}else e.fragment=\"\",l=Ee;else e.query=\"\",l=xe;break;case _e:if(i==r||\"/\"==i||\"\\\\\"==i&&G(e)||!n&&(\"?\"==i||\"#\"==i)){if(\"..\"===(c=(c=d).toLowerCase())||\"%2e.\"===c||\".%2e\"===c||\"%2e%2e\"===c?(te(e),\"/\"==i||\"\\\\\"==i&&G(e)||e.path.push(\"\")):ne(d)?\"/\"==i||\"\\\\\"==i&&G(e)||e.path.push(\"\"):(\"file\"==e.scheme&&!e.path.length&&Q(d)&&(e.host&&(e.host=\"\"),d=d.charAt(0)+\":\"),e.path.push(d)),d=\"\",\"file\"==e.scheme&&(i==r||\"?\"==i||\"#\"==i))for(;e.path.length>1&&\"\"===e.path[0];)e.path.shift();\"?\"==i?(e.query=\"\",l=xe):\"#\"==i&&(e.fragment=\"\",l=Ee)}else d+=K(i,$);break;case we:\"?\"==i?(e.query=\"\",l=xe):\"#\"==i?(e.fragment=\"\",l=Ee):i!=r&&(e.path[0]+=K(i,W));break;case xe:n||\"#\"!=i?i!=r&&(\"'\"==i&&G(e)?e.query+=\"%27\":e.query+=\"#\"==i?\"%23\":K(i,W)):(e.fragment=\"\",l=Ee);break;case Ee:i!=r&&(e.fragment+=K(i,H))}f++}},Ce=function(e){var t,n,r=l(this,Ce,\"URL\"),o=arguments.length>1?arguments[1]:void 0,i=String(e),s=x(r,{type:\"URL\"});if(void 0!==o)if(o instanceof Ce)t=E(o);else if(n=Se(t={},String(o)))throw TypeError(n);if(n=Se(s,i,null,t))throw TypeError(n);var u=s.searchParams=new _,c=w(u);c.updateSearchParams(s.query),c.updateURL=function(){s.query=String(u)||null},a||(r.href=ke.call(r),r.origin=Oe.call(r),r.protocol=je.call(r),r.username=Te.call(r),r.password=Ie.call(r),r.host=Pe.call(r),r.hostname=Ne.call(r),r.port=Me.call(r),r.pathname=Re.call(r),r.search=De.call(r),r.searchParams=Le.call(r),r.hash=Be.call(r))},Ae=Ce.prototype,ke=function(){var e=E(this),t=e.scheme,n=e.username,r=e.password,o=e.host,a=e.port,i=e.path,s=e.query,u=e.fragment,c=t+\":\";return null!==o?(c+=\"//\",Z(e)&&(c+=n+(r?\":\"+r:\"\")+\"@\"),c+=V(o),null!==a&&(c+=\":\"+a)):\"file\"==t&&(c+=\"//\"),c+=e.cannotBeABaseURL?i[0]:i.length?\"/\"+i.join(\"/\"):\"\",null!==s&&(c+=\"?\"+s),null!==u&&(c+=\"#\"+u),c},Oe=function(){var e=E(this),t=e.scheme,n=e.port;if(\"blob\"==t)try{return new Ce(t.path[0]).origin}catch(e){return\"null\"}return\"file\"!=t&&G(e)?t+\"://\"+V(e.host)+(null!==n?\":\"+n:\"\"):\"null\"},je=function(){return E(this).scheme+\":\"},Te=function(){return E(this).username},Ie=function(){return E(this).password},Pe=function(){var e=E(this),t=e.host,n=e.port;return null===t?\"\":null===n?V(t):V(t)+\":\"+n},Ne=function(){var e=E(this).host;return null===e?\"\":V(e)},Me=function(){var e=E(this).port;return null===e?\"\":String(e)},Re=function(){var e=E(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?\"/\"+t.join(\"/\"):\"\"},De=function(){var e=E(this).query;return e?\"?\"+e:\"\"},Le=function(){return E(this).searchParams},Be=function(){var e=E(this).fragment;return e?\"#\"+e:\"\"},Fe=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(a&&u(Ae,{href:Fe(ke,(function(e){var t=E(this),n=String(e),r=Se(t,n);if(r)throw TypeError(r);w(t.searchParams).updateSearchParams(t.query)})),origin:Fe(Oe),protocol:Fe(je,(function(e){var t=E(this);Se(t,String(e)+\":\",re)})),username:Fe(Te,(function(e){var t=E(this),n=h(String(e));if(!X(t)){t.username=\"\";for(var r=0;r<n.length;r++)t.username+=K(n[r],J)}})),password:Fe(Ie,(function(e){var t=E(this),n=h(String(e));if(!X(t)){t.password=\"\";for(var r=0;r<n.length;r++)t.password+=K(n[r],J)}})),host:Fe(Pe,(function(e){var t=E(this);t.cannotBeABaseURL||Se(t,String(e),he)})),hostname:Fe(Ne,(function(e){var t=E(this);t.cannotBeABaseURL||Se(t,String(e),de)})),port:Fe(Me,(function(e){var t=E(this);X(t)||(\"\"==(e=String(e))?t.port=null:Se(t,e,me))})),pathname:Fe(Re,(function(e){var t=E(this);t.cannotBeABaseURL||(t.path=[],Se(t,e+\"\",be))})),search:Fe(De,(function(e){var t=E(this);\"\"==(e=String(e))?t.query=null:(\"?\"==e.charAt(0)&&(e=e.slice(1)),t.query=\"\",Se(t,e,xe)),w(t.searchParams).updateSearchParams(t.query)})),searchParams:Fe(Le),hash:Fe(Be,(function(e){var t=E(this);\"\"!=(e=String(e))?(\"#\"==e.charAt(0)&&(e=e.slice(1)),t.fragment=\"\",Se(t,e,Ee)):t.fragment=null}))}),c(Ae,\"toJSON\",(function(){return ke.call(this)}),{enumerable:!0}),c(Ae,\"toString\",(function(){return ke.call(this)}),{enumerable:!0}),b){var Ue=b.createObjectURL,qe=b.revokeObjectURL;Ue&&c(Ce,\"createObjectURL\",(function(e){return Ue.apply(b,arguments)})),qe&&c(Ce,\"revokeObjectURL\",(function(e){return qe.apply(b,arguments)}))}v(Ce,\"URL\"),o({global:!0,forced:!i,sham:!a},{URL:Ce})},function(e,t,n){\"use strict\";var r=2147483647,o=/[^\\0-\\u007E]/,a=/[.\\u3002\\uFF0E\\uFF61]/g,i=\"Overflow: input needs wider integers to process\",s=Math.floor,u=String.fromCharCode,c=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?s(e/700):e>>1,e+=s(e/t);e>455;r+=36)e=s(e/35);return s(r+36*e/(e+38))},p=function(e){var t,n,o=[],a=(e=function(e){for(var t=[],n=0,r=e.length;n<r;){var o=e.charCodeAt(n++);if(o>=55296&&o<=56319&&n<r){var a=e.charCodeAt(n++);56320==(64512&a)?t.push(((1023&o)<<10)+(1023&a)+65536):(t.push(o),n--)}else t.push(o)}return t}(e)).length,p=128,f=0,h=72;for(t=0;t<e.length;t++)(n=e[t])<128&&o.push(u(n));var d=o.length,m=d;for(d&&o.push(\"-\");m<a;){var v=r;for(t=0;t<e.length;t++)(n=e[t])>=p&&n<v&&(v=n);var g=m+1;if(v-p>s((r-f)/g))throw RangeError(i);for(f+=(v-p)*g,p=v,t=0;t<e.length;t++){if((n=e[t])<p&&++f>r)throw RangeError(i);if(n==p){for(var y=f,b=36;;b+=36){var _=b<=h?1:b>=h+26?26:b-h;if(y<_)break;var w=y-_,x=36-_;o.push(u(c(_+w%x))),y=s(w/x)}o.push(u(c(y))),h=l(f,g,m==d),f=0,++m}}++f,++p}return o.join(\"\")};e.exports=function(e){var t,n,r=[],i=e.toLowerCase().replace(a,\".\").split(\".\");for(t=0;t<i.length;t++)n=i[t],r.push(o.test(n)?\"xn--\"+p(n):n);return r.join(\".\")}},function(e,t,n){var r=n(52),o=n(159);e.exports=function(e){var t=o(e);if(\"function\"!=typeof t)throw TypeError(String(e)+\" is not iterable\");return r(t.call(e))}},function(e,t){},function(e,t,n){n(1090);var r=n(34);e.exports=r.setTimeout},function(e,t,n){var r=n(21),o=n(40),a=n(108),i=[].slice,s=function(e){return function(t,n){var r=arguments.length>2,o=r?i.call(arguments,2):void 0;return e(r?function(){(\"function\"==typeof t?t:Function(t)).apply(this,o)}:t,n)}};r({global:!0,bind:!0,forced:/MSIE .\\./.test(a)},{setTimeout:s(o.setTimeout),setInterval:s(o.setInterval)})},function(e,t,n){var r=n(1092);e.exports=r},function(e,t,n){n(1093),n(180),n(130),n(87);var r=n(34);e.exports=r.Map},function(e,t,n){\"use strict\";var r=n(503),o=n(1094);e.exports=r(\"Map\",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),o)},function(e,t,n){\"use strict\";var r=n(68).f,o=n(109),a=n(163),i=n(107),s=n(139),u=n(121),c=n(238),l=n(454),p=n(48),f=n(207).fastKey,h=n(78),d=h.set,m=h.getterFor;e.exports={getConstructor:function(e,t,n,c){var l=e((function(e,r){s(e,l,t),d(e,{type:t,index:o(null),first:void 0,last:void 0,size:0}),p||(e.size=0),null!=r&&u(r,e[c],{that:e,AS_ENTRIES:n})})),h=m(t),v=function(e,t,n){var r,o,a=h(e),i=g(e,t);return i?i.value=n:(a.last=i={index:o=f(t,!0),key:t,value:n,previous:r=a.last,next:void 0,removed:!1},a.first||(a.first=i),r&&(r.next=i),p?a.size++:e.size++,\"F\"!==o&&(a.index[o]=i)),e},g=function(e,t){var n,r=h(e),o=f(t);if(\"F\"!==o)return r.index[o];for(n=r.first;n;n=n.next)if(n.key==t)return n};return a(l.prototype,{clear:function(){for(var e=h(this),t=e.index,n=e.first;n;)n.removed=!0,n.previous&&(n.previous=n.previous.next=void 0),delete t[n.index],n=n.next;e.first=e.last=void 0,p?e.size=0:this.size=0},delete:function(e){var t=this,n=h(t),r=g(t,e);if(r){var o=r.next,a=r.previous;delete n.index[r.index],r.removed=!0,a&&(a.next=o),o&&(o.previous=a),n.first==r&&(n.first=o),n.last==r&&(n.last=a),p?n.size--:t.size--}return!!r},forEach:function(e){for(var t,n=h(this),r=i(e,arguments.length>1?arguments[1]:void 0,3);t=t?t.next:n.first;)for(r(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!g(this,e)}}),a(l.prototype,n?{get:function(e){var t=g(this,e);return t&&t.value},set:function(e,t){return v(this,0===e?0:e,t)}}:{add:function(e){return v(this,e=0===e?0:e,e)}}),p&&r(l.prototype,\"size\",{get:function(){return h(this).size}}),l},setStrong:function(e,t,n){var r=t+\" Iterator\",o=m(t),a=m(r);c(e,t,(function(e,t){d(this,{type:r,target:e,state:o(e),kind:t,last:void 0})}),(function(){for(var e=a(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?\"keys\"==t?{value:n.key,done:!1}:\"values\"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),n?\"entries\":\"values\",!n,!0),l(t)}}},function(e,t,n){n(87);var r=n(1096),o=n(99),a=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.keys;return e===a||e instanceof Array&&t===a.keys||i.hasOwnProperty(o(e))?r:t}},function(e,t,n){var r=n(1097);e.exports=r},function(e,t,n){n(157);var r=n(42);e.exports=r(\"Array\").keys},function(e,t,n){n(87);var r=n(1099),o=n(99),a=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.values;return e===a||e instanceof Array&&t===a.values||i.hasOwnProperty(o(e))?r:t}},function(e,t,n){var r=n(1100);e.exports=r},function(e,t,n){n(157);var r=n(42);e.exports=r(\"Array\").values},function(e,t,n){var r=n(1102);e.exports=r},function(e,t,n){var r=n(1103),o=Array.prototype;e.exports=function(e){var t=e.lastIndexOf;return e===o||e instanceof Array&&t===o.lastIndexOf?r:t}},function(e,t,n){n(1104);var r=n(42);e.exports=r(\"Array\").lastIndexOf},function(e,t,n){var r=n(21),o=n(1105);r({target:\"Array\",proto:!0,forced:o!==[].lastIndexOf},{lastIndexOf:o})},function(e,t,n){\"use strict\";var r=n(66),o=n(128),a=n(69),i=n(111),s=Math.min,u=[].lastIndexOf,c=!!u&&1/[1].lastIndexOf(1,-0)<0,l=i(\"lastIndexOf\"),p=c||!l;e.exports=p?function(e){if(c)return u.apply(this,arguments)||0;var t=r(this),n=a(t.length),i=n-1;for(arguments.length>1&&(i=s(i,o(arguments[1]))),i<0&&(i=n+i);i>=0;i--)if(i in t&&t[i]===e)return i||0;return-1}:u},function(e,t,n){\"use strict\";var r,o=\"\";e.exports=function(e,t){if(\"string\"!=typeof e)throw new TypeError(\"expected a string\");if(1===t)return e;if(2===t)return e+e;var n=e.length*t;if(r!==e||void 0===r)r=e,o=\"\";else if(o.length>=n)return o.substr(0,n);for(;n>o.length&&t>1;)1&t&&(o+=e),t>>=1,e+=e;return o=(o+=e).substr(0,n)}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.DebounceInput=void 0;var r=a(n(0)),o=a(n(1108));function a(e){return e&&e.__esModule?e:{default:e}}function i(e){return(i=\"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 s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function u(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?u(Object(n),!0).forEach((function(t){v(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):u(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function p(e,t){return(p=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function f(e){var t=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=m(e);if(t){var o=m(this).constructor;n=Reflect.construct(r,arguments,o)}else n=r.apply(this,arguments);return h(this,n)}}function h(e,t){return!t||\"object\"!==i(t)&&\"function\"!=typeof t?d(e):t}function d(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function m(e){return(m=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function v(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var g=function(e){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&p(e,t)}(u,e);var t,n,a,i=f(u);function u(e){var t;!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,u),v(d(t=i.call(this,e)),\"onChange\",(function(e){e.persist();var n=t.state.value,r=t.props.minLength;t.setState({value:e.target.value},(function(){var o=t.state.value;o.length>=r?t.notify(e):n.length>o.length&&t.notify(c(c({},e),{},{target:c(c({},e.target),{},{value:\"\"})}))}))})),v(d(t),\"onKeyDown\",(function(e){\"Enter\"===e.key&&t.forceNotify(e);var n=t.props.onKeyDown;n&&(e.persist(),n(e))})),v(d(t),\"onBlur\",(function(e){t.forceNotify(e);var n=t.props.onBlur;n&&(e.persist(),n(e))})),v(d(t),\"createNotifier\",(function(e){if(e<0)t.notify=function(){return null};else if(0===e)t.notify=t.doNotify;else{var n=(0,o.default)((function(e){t.isDebouncing=!1,t.doNotify(e)}),e);t.notify=function(e){t.isDebouncing=!0,n(e)},t.flush=function(){return n.flush()},t.cancel=function(){t.isDebouncing=!1,n.cancel()}}})),v(d(t),\"doNotify\",(function(){var e=t.props.onChange;e.apply(void 0,arguments)})),v(d(t),\"forceNotify\",(function(e){var n=t.props.debounceTimeout;if(t.isDebouncing||!(n>0)){t.cancel&&t.cancel();var r=t.state.value,o=t.props.minLength;r.length>=o?t.doNotify(e):t.doNotify(c(c({},e),{},{target:c(c({},e.target),{},{value:r})}))}})),t.isDebouncing=!1,t.state={value:void 0===e.value||null===e.value?\"\":e.value};var n=t.props.debounceTimeout;return t.createNotifier(n),t}return t=u,(n=[{key:\"componentDidUpdate\",value:function(e){if(!this.isDebouncing){var t=this.props,n=t.value,r=t.debounceTimeout,o=e.debounceTimeout,a=e.value,i=this.state.value;void 0!==n&&a!==n&&i!==n&&this.setState({value:n}),r!==o&&this.createNotifier(r)}}},{key:\"componentWillUnmount\",value:function(){this.flush&&this.flush()}},{key:\"render\",value:function(){var e,t,n=this.props,o=n.element,a=(n.onChange,n.value,n.minLength,n.debounceTimeout,n.forceNotifyByEnter),i=n.forceNotifyOnBlur,u=n.onKeyDown,l=n.onBlur,p=n.inputRef,f=s(n,[\"element\",\"onChange\",\"value\",\"minLength\",\"debounceTimeout\",\"forceNotifyByEnter\",\"forceNotifyOnBlur\",\"onKeyDown\",\"onBlur\",\"inputRef\"]),h=this.state.value;e=a?{onKeyDown:this.onKeyDown}:u?{onKeyDown:u}:{},t=i?{onBlur:this.onBlur}:l?{onBlur:l}:{};var d=p?{ref:p}:{};return r.default.createElement(o,c(c(c(c({},f),{},{onChange:this.onChange,value:h},e),t),d))}}])&&l(t.prototype,n),a&&l(t,a),u}(r.default.PureComponent);t.DebounceInput=g,v(g,\"defaultProps\",{element:\"input\",type:\"text\",onKeyDown:void 0,onBlur:void 0,value:void 0,minLength:0,debounceTimeout:100,forceNotifyByEnter:!0,forceNotifyOnBlur:!0,inputRef:void 0})},function(e,t,n){(function(t){var n=/^\\s+|\\s+$/g,r=/^[-+]0x[0-9a-f]+$/i,o=/^0b[01]+$/i,a=/^0o[0-7]+$/i,i=parseInt,s=\"object\"==typeof t&&t&&t.Object===Object&&t,u=\"object\"==typeof self&&self&&self.Object===Object&&self,c=s||u||Function(\"return this\")(),l=Object.prototype.toString,p=Math.max,f=Math.min,h=function(){return c.Date.now()};function d(e){var t=typeof e;return!!e&&(\"object\"==t||\"function\"==t)}function m(e){if(\"number\"==typeof e)return e;if(function(e){return\"symbol\"==typeof e||function(e){return!!e&&\"object\"==typeof e}(e)&&\"[object Symbol]\"==l.call(e)}(e))return NaN;if(d(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=d(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=e.replace(n,\"\");var s=o.test(e);return s||a.test(e)?i(e.slice(2),s?2:8):r.test(e)?NaN:+e}e.exports=function(e,t,n){var r,o,a,i,s,u,c=0,l=!1,v=!1,g=!0;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");function y(t){var n=r,a=o;return r=o=void 0,c=t,i=e.apply(a,n)}function b(e){return c=e,s=setTimeout(w,t),l?y(e):i}function _(e){var n=e-u;return void 0===u||n>=t||n<0||v&&e-c>=a}function w(){var e=h();if(_(e))return x(e);s=setTimeout(w,function(e){var n=t-(e-u);return v?f(n,a-(e-c)):n}(e))}function x(e){return s=void 0,g&&r?y(e):(r=o=void 0,i)}function E(){var e=h(),n=_(e);if(r=arguments,o=this,u=e,n){if(void 0===s)return b(u);if(v)return s=setTimeout(w,t),y(u)}return void 0===s&&(s=setTimeout(w,t)),i}return t=m(t)||0,d(n)&&(l=!!n.leading,a=(v=\"maxWait\"in n)?p(m(n.maxWait)||0,t):a,g=\"trailing\"in n?!!n.trailing:g),E.cancel=function(){void 0!==s&&clearTimeout(s),c=0,r=u=o=s=void 0},E.flush=function(){return void 0===s?i:x(h())},E}}).call(this,n(51))},function(e,t,n){var r={\"./all.js\":342,\"./auth/actions.js\":84,\"./auth/index.js\":305,\"./auth/reducers.js\":306,\"./auth/selectors.js\":307,\"./auth/spec-wrap-actions.js\":308,\"./configs/actions.js\":148,\"./configs/helpers.js\":170,\"./configs/index.js\":344,\"./configs/reducers.js\":313,\"./configs/selectors.js\":312,\"./configs/spec-actions.js\":311,\"./deep-linking/helpers.js\":174,\"./deep-linking/index.js\":314,\"./deep-linking/layout.js\":315,\"./deep-linking/operation-tag-wrapper.jsx\":317,\"./deep-linking/operation-wrapper.jsx\":316,\"./download-url.js\":310,\"./err/actions.js\":59,\"./err/error-transformers/hook.js\":126,\"./err/error-transformers/transformers/not-of-type.js\":288,\"./err/error-transformers/transformers/parameter-oneof.js\":289,\"./err/index.js\":286,\"./err/reducers.js\":287,\"./err/selectors.js\":290,\"./filter/index.js\":318,\"./filter/opsFilter.js\":319,\"./layout/actions.js\":103,\"./layout/index.js\":291,\"./layout/reducers.js\":292,\"./layout/selectors.js\":293,\"./layout/spec-extensions/wrap-selector.js\":294,\"./logs/index.js\":303,\"./oas3/actions.js\":54,\"./oas3/auth-extensions/wrap-selectors.js\":323,\"./oas3/components/callbacks.jsx\":326,\"./oas3/components/http-auth.jsx\":331,\"./oas3/components/index.js\":325,\"./oas3/components/operation-link.jsx\":327,\"./oas3/components/operation-servers.jsx\":332,\"./oas3/components/request-body-editor.jsx\":330,\"./oas3/components/request-body.jsx\":171,\"./oas3/components/servers-container.jsx\":329,\"./oas3/components/servers.jsx\":328,\"./oas3/helpers.jsx\":35,\"./oas3/index.js\":321,\"./oas3/reducers.js\":341,\"./oas3/selectors.js\":340,\"./oas3/spec-extensions/selectors.js\":324,\"./oas3/spec-extensions/wrap-selectors.js\":322,\"./oas3/wrap-components/auth-item.jsx\":335,\"./oas3/wrap-components/index.js\":333,\"./oas3/wrap-components/json-schema-string.jsx\":339,\"./oas3/wrap-components/markdown.jsx\":334,\"./oas3/wrap-components/model.jsx\":338,\"./oas3/wrap-components/online-validator-badge.js\":337,\"./oas3/wrap-components/version-stamp.jsx\":336,\"./on-complete/index.js\":320,\"./request-snippets/fn.js\":169,\"./request-snippets/index.js\":300,\"./request-snippets/request-snippets.jsx\":302,\"./request-snippets/selectors.js\":301,\"./samples/fn.js\":146,\"./samples/index.js\":299,\"./spec/actions.js\":46,\"./spec/index.js\":295,\"./spec/reducers.js\":296,\"./spec/selectors.js\":93,\"./spec/wrap-actions.js\":297,\"./swagger-js/configs-wrap-actions.js\":304,\"./swagger-js/index.js\":343,\"./util/index.js\":309,\"./view/index.js\":298,\"./view/root-injects.jsx\":173};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error(\"Cannot find module '\"+e+\"'\");throw t.code=\"MODULE_NOT_FOUND\",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=1109},function(e,t,n){\"use strict\";n.r(t);var r={};n.r(r),n.d(r,\"Container\",(function(){return wn})),n.d(r,\"Col\",(function(){return En})),n.d(r,\"Row\",(function(){return Sn})),n.d(r,\"Button\",(function(){return Cn})),n.d(r,\"TextArea\",(function(){return An})),n.d(r,\"Input\",(function(){return kn})),n.d(r,\"Select\",(function(){return On})),n.d(r,\"Link\",(function(){return jn})),n.d(r,\"Collapse\",(function(){return In}));var o={};n.r(o),n.d(o,\"JsonSchemaForm\",(function(){return br})),n.d(o,\"JsonSchema_string\",(function(){return _r})),n.d(o,\"JsonSchema_array\",(function(){return wr})),n.d(o,\"JsonSchemaArrayItemText\",(function(){return xr})),n.d(o,\"JsonSchemaArrayItemFile\",(function(){return Er})),n.d(o,\"JsonSchema_boolean\",(function(){return Sr})),n.d(o,\"JsonSchema_object\",(function(){return Ar}));var a=n(18),i=n.n(a),s=n(2),u=n.n(s),c=n(12),l=n.n(c),p=n(15),f=n.n(p),h=n(32),d=n.n(h),m=n(81),v=n.n(m),g=n(3),y=n.n(g),b=n(6),_=n.n(b),w=n(7),x=n.n(w),E=n(36),S=n.n(E),C=n(20),A=n.n(C),k=n(19),O=n.n(k),j=n(22),T=n.n(j),I=n(29),P=n.n(I),N=n(4),M=n.n(N),R=n(0),D=n.n(R),L=n(150),B=n(1),F=n.n(B),U=n(509),q=n(145),z=n(510),V=n.n(z),W=n(59),H=n(26),$=n(5),J=function(e){return e};var K=function(){function e(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};_()(this,e),v()(this,{state:{},plugins:[],pluginsOptions:{},system:{configs:{},fn:{},components:{},rootInjects:{},statePlugins:{}},boundSystem:{},toolbox:{}},n),this.getSystem=S()(t=this._getSystem).call(t,this),this.store=Q(J,Object(B.fromJS)(this.state),this.getSystem),this.buildSystem(!1),this.register(this.plugins)}return x()(e,[{key:\"getStore\",value:function(){return this.store}},{key:\"register\",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=Y(e,this.getSystem(),this.pluginsOptions);Z(this.system,n),t&&this.buildSystem();var r=G.call(this.system,e,this.getSystem());r&&this.buildSystem()}},{key:\"buildSystem\",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.getStore().dispatch,n=this.getStore().getState;this.boundSystem=A()({},this.getRootInjects(),this.getWrappedAndBoundActions(t),this.getWrappedAndBoundSelectors(n,this.getSystem),this.getStateThunks(n),this.getFn(),this.getConfigs()),e&&this.rebuildReducer()}},{key:\"_getSystem\",value:function(){return this.boundSystem}},{key:\"getRootInjects\",value:function(){var e,t,n;return A()({getSystem:this.getSystem,getStore:S()(e=this.getStore).call(e,this),getComponents:S()(t=this.getComponents).call(t,this),getState:this.getStore().getState,getConfigs:S()(n=this._getConfigs).call(n,this),Im:F.a,React:D.a},this.system.rootInjects||{})}},{key:\"_getConfigs\",value:function(){return this.system.configs}},{key:\"getConfigs\",value:function(){return{configs:this.system.configs}}},{key:\"setConfigs\",value:function(e){this.system.configs=e}},{key:\"rebuildReducer\",value:function(){var e,t,n,r;this.store.replaceReducer((r=this.system.statePlugins,e=Object($.x)(r,(function(e){return e.reducers})),n=P()(t=f()(e)).call(t,(function(t,n){return t[n]=function(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new B.Map,n=arguments.length>1?arguments[1]:void 0;if(!e)return t;var r=e[n.type];if(r){var o=X(r)(t,n);return null===o?t:o}return t}}(e[n]),t}),{}),f()(n).length?Object(U.combineReducers)(n):J))}},{key:\"getType\",value:function(e){var t=e[0].toUpperCase()+O()(e).call(e,1);return Object($.y)(this.system.statePlugins,(function(n,r){var o=n[e];if(o)return y()({},r+t,o)}))}},{key:\"getSelectors\",value:function(){return this.getType(\"selectors\")}},{key:\"getActions\",value:function(){var e=this.getType(\"actions\");return Object($.x)(e,(function(e){return Object($.y)(e,(function(e,t){if(Object($.r)(e))return y()({},t,e)}))}))}},{key:\"getWrappedAndBoundActions\",value:function(e){var t=this,n=this.getBoundActions(e);return Object($.x)(n,(function(e,n){var r=t.system.statePlugins[O()(n).call(n,0,-7)].wrapActions;return r?Object($.x)(e,(function(e,n){var o=r[n];return o?(T()(o)||(o=[o]),P()(o).call(o,(function(e,n){var r=function(){return n(e,t.getSystem()).apply(void 0,arguments)};if(!Object($.r)(r))throw new TypeError(\"wrapActions needs to return a function that returns a new function (ie the wrapped action)\");return X(r)}),e||Function.prototype)):e})):e}))}},{key:\"getWrappedAndBoundSelectors\",value:function(e,t){var n=this,r=this.getBoundSelectors(e,t);return Object($.x)(r,(function(t,r){var o=[O()(r).call(r,0,-9)],a=n.system.statePlugins[o].wrapSelectors;return a?Object($.x)(t,(function(t,r){var i=a[r];return i?(T()(i)||(i=[i]),P()(i).call(i,(function(t,r){var a=function(){for(var a,i=arguments.length,s=new Array(i),c=0;c<i;c++)s[c]=arguments[c];return r(t,n.getSystem()).apply(void 0,u()(a=[e().getIn(o)]).call(a,s))};if(!Object($.r)(a))throw new TypeError(\"wrapSelector needs to return a function that returns a new function (ie the wrapped action)\");return a}),t||Function.prototype)):t})):t}))}},{key:\"getStates\",value:function(e){var t;return P()(t=f()(this.system.statePlugins)).call(t,(function(t,n){return t[n]=e.get(n),t}),{})}},{key:\"getStateThunks\",value:function(e){var t;return P()(t=f()(this.system.statePlugins)).call(t,(function(t,n){return t[n]=function(){return e().get(n)},t}),{})}},{key:\"getFn\",value:function(){return{fn:this.system.fn}}},{key:\"getComponents\",value:function(e){var t=this,n=this.system.components[e];return T()(n)?P()(n).call(n,(function(e,n){return n(e,t.getSystem())})):void 0!==e?this.system.components[e]:this.system.components}},{key:\"getBoundSelectors\",value:function(e,t){return Object($.x)(this.getSelectors(),(function(n,r){var o=[O()(r).call(r,0,-9)],a=function(){return e().getIn(o)};return Object($.x)(n,(function(e){return function(){for(var n,r=arguments.length,o=new Array(r),i=0;i<r;i++)o[i]=arguments[i];var s=X(e).apply(null,u()(n=[a()]).call(n,o));return\"function\"==typeof s&&(s=X(s)(t())),s}}))}))}},{key:\"getBoundActions\",value:function(e){e=e||this.getStore().dispatch;var t=this.getActions(),n=function e(t){return\"function\"!=typeof t?Object($.x)(t,(function(t){return e(t)})):function(){var e=null;try{e=t.apply(void 0,arguments)}catch(t){e={type:W.NEW_THROWN_ERR,error:!0,payload:Object(q.serializeError)(t)}}finally{return e}}};return Object($.x)(t,(function(t){return Object(L.bindActionCreators)(n(t),e)}))}},{key:\"getMapStateToProps\",value:function(){var e=this;return function(){return A()({},e.getSystem())}}},{key:\"getMapDispatchToProps\",value:function(e){var t=this;return function(n){return v()({},t.getWrappedAndBoundActions(n),t.getFn(),e)}}}]),e}();function Y(e,t,n){if(Object($.t)(e)&&!Object($.p)(e))return V()({},e);if(Object($.s)(e))return Y(e(t),t,n);if(Object($.p)(e)){var r,o=\"chain\"===n.pluginLoadType?t.getComponents():{};return P()(r=M()(e).call(e,(function(e){return Y(e,t,n)}))).call(r,Z,o)}return{}}function G(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=r.hasLoaded,a=o;return Object($.t)(e)&&!Object($.p)(e)&&\"function\"==typeof e.afterLoad&&(a=!0,X(e.afterLoad).call(this,t)),Object($.s)(e)?G.call(this,e(t),t,{hasLoaded:a}):Object($.p)(e)?M()(e).call(e,(function(e){return G.call(n,e,t,{hasLoaded:a})})):a}function Z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!Object($.t)(e))return{};if(!Object($.t)(t))return e;t.wrapComponents&&(Object($.x)(t.wrapComponents,(function(n,r){var o=e.components&&e.components[r];o&&T()(o)?(e.components[r]=u()(o).call(o,[n]),delete t.wrapComponents[r]):o&&(e.components[r]=[o,n],delete t.wrapComponents[r])})),f()(t.wrapComponents).length||delete t.wrapComponents);var n=e.statePlugins;if(Object($.t)(n))for(var r in n){var o=n[r];if(Object($.t)(o)){var a=o.wrapActions,i=o.wrapSelectors;if(Object($.t)(a))for(var s in a){var c,l=a[s];if(T()(l)||(l=[l],a[s]=l),t&&t.statePlugins&&t.statePlugins[r]&&t.statePlugins[r].wrapActions&&t.statePlugins[r].wrapActions[s])t.statePlugins[r].wrapActions[s]=u()(c=a[s]).call(c,t.statePlugins[r].wrapActions[s])}if(Object($.t)(i))for(var p in i){var h,d=i[p];if(T()(d)||(d=[d],i[p]=d),t&&t.statePlugins&&t.statePlugins[r]&&t.statePlugins[r].wrapSelectors&&t.statePlugins[r].wrapSelectors[p])t.statePlugins[r].wrapSelectors[p]=u()(h=i[p]).call(h,t.statePlugins[r].wrapSelectors[p])}}}return v()(e,t)}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.logErrors,r=void 0===n||n;return\"function\"!=typeof e?e:function(){try{for(var t,n=arguments.length,o=new Array(n),a=0;a<n;a++)o[a]=arguments[a];return e.call.apply(e,u()(t=[this]).call(t,o))}catch(e){return r&&console.error(e),null}}}function Q(e,t,n){return function(e,t,n){var r=[Object($.J)(n)],o=H.a.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__||L.compose;return Object(L.createStore)(e,t,o(L.applyMiddleware.apply(void 0,r)))}(e,t,n)}var ee=n(286),te=n(291),ne=n(295),re=n(298),oe=n(299),ae=n(300),ie=n(303),se=n(343),ue=n(305),ce=n(309),le=n(310),pe=n(344),fe=n(314),he=n(318),de=n(320),me=n(10),ve=n.n(me),ge=n(8),ye=n.n(ge),be=n(9),_e=n.n(be),we=n(17),xe=n.n(we),Ee=(n(11),n(27),n(58)),Se=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;_()(this,n),o=t.call(this,e,r),y()(ve()(o),\"toggleShown\",(function(){var e=o.props,t=e.layoutActions,n=e.tag,r=e.operationId,a=e.isShown,i=o.getResolvedSubtree();a||void 0!==i||o.requestResolvedSubtree(),t.show([\"operations\",n,r],!a)})),y()(ve()(o),\"onCancelClick\",(function(){o.setState({tryItOutEnabled:!o.state.tryItOutEnabled})})),y()(ve()(o),\"onTryoutClick\",(function(){o.setState({tryItOutEnabled:!o.state.tryItOutEnabled})})),y()(ve()(o),\"onExecute\",(function(){o.setState({executeInProgress:!0})})),y()(ve()(o),\"getResolvedSubtree\",(function(){var e=o.props,t=e.specSelectors,n=e.path,r=e.method,a=e.specPath;return a?t.specResolvedSubtree(a.toJS()):t.specResolvedSubtree([\"paths\",n,r])})),y()(ve()(o),\"requestResolvedSubtree\",(function(){var e=o.props,t=e.specActions,n=e.path,r=e.method,a=e.specPath;return a?t.requestResolvedSubtree(a.toJS()):t.requestResolvedSubtree([\"paths\",n,r])}));var a=e.getConfigs().tryItOutEnabled;return o.state={tryItOutEnabled:!0===a||\"true\"===a,executeInProgress:!1},o}return x()(n,[{key:\"mapStateToProps\",value:function(e,t){var n,r=t.op,o=t.layoutSelectors,a=(0,t.getConfigs)(),i=a.docExpansion,s=a.deepLinking,c=a.displayOperationId,l=a.displayRequestDuration,p=a.supportedSubmitMethods,f=o.showSummary(),h=r.getIn([\"operation\",\"__originalOperationId\"])||r.getIn([\"operation\",\"operationId\"])||Object(Ee.e)(r.get(\"operation\"),t.path,t.method)||r.get(\"id\"),d=[\"operations\",t.tag,h],m=s&&\"false\"!==s,v=xe()(p).call(p,t.method)>=0&&(void 0===t.allowTryItOut?t.specSelectors.allowTryItOutFor(t.path,t.method):t.allowTryItOut),g=r.getIn([\"operation\",\"security\"])||t.specSelectors.security();return{operationId:h,isDeepLinkingEnabled:m,showSummary:f,displayOperationId:c,displayRequestDuration:l,allowTryItOut:v,security:g,isAuthorized:t.authSelectors.isAuthorized(g),isShown:o.isShown(d,\"full\"===i),jumpToKey:u()(n=\"paths.\".concat(t.path,\".\")).call(n,t.method),response:t.specSelectors.responseFor(t.path,t.method),request:t.specSelectors.requestFor(t.path,t.method)}}},{key:\"componentDidMount\",value:function(){var e=this.props.isShown,t=this.getResolvedSubtree();e&&void 0===t&&this.requestResolvedSubtree()}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.response,n=e.isShown,r=this.getResolvedSubtree();t!==this.props.response&&this.setState({executeInProgress:!1}),n&&void 0===r&&this.requestResolvedSubtree()}},{key:\"render\",value:function(){var e=this.props,t=e.op,n=e.tag,r=e.path,o=e.method,a=e.security,i=e.isAuthorized,s=e.operationId,u=e.showSummary,c=e.isShown,l=e.jumpToKey,p=e.allowTryItOut,f=e.response,h=e.request,d=e.displayOperationId,m=e.displayRequestDuration,v=e.isDeepLinkingEnabled,g=e.specPath,y=e.specSelectors,b=e.specActions,_=e.getComponent,w=e.getConfigs,x=e.layoutSelectors,E=e.layoutActions,S=e.authActions,C=e.authSelectors,A=e.oas3Actions,k=e.oas3Selectors,O=e.fn,j=_(\"operation\"),T=this.getResolvedSubtree()||Object(B.Map)(),I=Object(B.fromJS)({op:T,tag:n,path:r,summary:t.getIn([\"operation\",\"summary\"])||\"\",deprecated:T.get(\"deprecated\")||t.getIn([\"operation\",\"deprecated\"])||!1,method:o,security:a,isAuthorized:i,operationId:s,originalOperationId:T.getIn([\"operation\",\"__originalOperationId\"]),showSummary:u,isShown:c,jumpToKey:l,allowTryItOut:p,request:h,displayOperationId:d,displayRequestDuration:m,isDeepLinkingEnabled:v,executeInProgress:this.state.executeInProgress,tryItOutEnabled:this.state.tryItOutEnabled});return D.a.createElement(j,{operation:I,response:f,request:h,isShown:c,toggleShown:this.toggleShown,onTryoutClick:this.onTryoutClick,onCancelClick:this.onCancelClick,onExecute:this.onExecute,specPath:g,specActions:b,specSelectors:y,oas3Actions:A,oas3Selectors:k,layoutActions:E,layoutSelectors:x,authActions:S,authSelectors:C,getComponent:_,getConfigs:w,fn:O})}}]),n}(R.PureComponent);y()(Se,\"defaultProps\",{showSummary:!0,response:null,allowTryItOut:!0,displayOperationId:!1,displayRequestDuration:!1});var Ce=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"getLayout\",value:function(){var e=this.props,t=e.getComponent,n=e.layoutSelectors.current(),r=t(n,!0);return r||function(){return D.a.createElement(\"h1\",null,' No layout defined for \"',n,'\" ')}}},{key:\"render\",value:function(){var e=this.getLayout();return D.a.createElement(e,null)}}]),n}(D.a.Component);Ce.defaultProps={};var Ae=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"close\",(function(){r.props.authActions.showDefinitions(!1)})),r}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.authSelectors,r=t.authActions,o=t.getComponent,a=t.errSelectors,i=t.specSelectors,s=t.fn.AST,u=void 0===s?{}:s,c=n.shownDefinitions(),l=o(\"auths\");return D.a.createElement(\"div\",{className:\"dialog-ux\"},D.a.createElement(\"div\",{className:\"backdrop-ux\"}),D.a.createElement(\"div\",{className:\"modal-ux\"},D.a.createElement(\"div\",{className:\"modal-dialog-ux\"},D.a.createElement(\"div\",{className:\"modal-ux-inner\"},D.a.createElement(\"div\",{className:\"modal-ux-header\"},D.a.createElement(\"h3\",null,\"Available authorizations\"),D.a.createElement(\"button\",{type:\"button\",className:\"close-modal\",onClick:this.close},D.a.createElement(\"svg\",{width:\"20\",height:\"20\"},D.a.createElement(\"use\",{href:\"#close\",xlinkHref:\"#close\"})))),D.a.createElement(\"div\",{className:\"modal-ux-content\"},M()(e=c.valueSeq()).call(e,(function(e,t){return D.a.createElement(l,{key:t,AST:u,definitions:e,getComponent:o,errSelectors:a,authSelectors:n,authActions:r,specSelectors:i})})))))))}}]),n}(D.a.Component),ke=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.isAuthorized,n=e.showPopup,r=e.onClick,o=(0,e.getComponent)(\"authorizationPopup\",!0);return D.a.createElement(\"div\",{className:\"auth-wrapper\"},D.a.createElement(\"button\",{className:t?\"btn authorize locked\":\"btn authorize unlocked\",onClick:r},D.a.createElement(\"span\",null,\"Authorize\"),D.a.createElement(\"svg\",{width:\"20\",height:\"20\"},D.a.createElement(\"use\",{href:t?\"#locked\":\"#unlocked\",xlinkHref:t?\"#locked\":\"#unlocked\"}))),n&&D.a.createElement(o,null))}}]),n}(D.a.Component),Oe=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.authActions,n=e.authSelectors,r=e.specSelectors,o=e.getComponent,a=r.securityDefinitions(),i=n.definitionsToAuthorize(),s=o(\"authorizeBtn\");return a?D.a.createElement(s,{onClick:function(){return t.showDefinitions(i)},isAuthorized:!!n.authorized().size,showPopup:!!n.shownDefinitions(),getComponent:o}):null}}]),n}(D.a.Component),je=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onClick\",(function(e){e.stopPropagation();var t=r.props.onClick;t&&t()})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props.isAuthorized;return D.a.createElement(\"button\",{className:e?\"authorization__btn locked\":\"authorization__btn unlocked\",\"aria-label\":e?\"authorization button locked\":\"authorization button unlocked\",onClick:this.onClick},D.a.createElement(\"svg\",{width:\"20\",height:\"20\"},D.a.createElement(\"use\",{href:e?\"#locked\":\"#unlocked\",xlinkHref:e?\"#locked\":\"#unlocked\"})))}}]),n}(D.a.Component),Te=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;return _()(this,n),o=t.call(this,e,r),y()(ve()(o),\"onAuthChange\",(function(e){var t=e.name;o.setState(y()({},t,e))})),y()(ve()(o),\"submitAuth\",(function(e){e.preventDefault(),o.props.authActions.authorizeWithPersistOption(o.state)})),y()(ve()(o),\"logoutClick\",(function(e){e.preventDefault();var t=o.props,n=t.authActions,r=t.definitions,a=M()(r).call(r,(function(e,t){return t})).toArray();o.setState(P()(a).call(a,(function(e,t){return e[t]=\"\",e}),{})),n.logoutWithPersistOption(a)})),y()(ve()(o),\"close\",(function(e){e.preventDefault(),o.props.authActions.showDefinitions(!1)})),o.state={},o}return x()(n,[{key:\"render\",value:function(){var e,t=this,n=this.props,r=n.definitions,o=n.getComponent,a=n.authSelectors,i=n.errSelectors,s=o(\"AuthItem\"),u=o(\"oauth2\",!0),c=o(\"Button\"),p=a.authorized(),f=l()(r).call(r,(function(e,t){return!!p.get(t)})),h=l()(r).call(r,(function(e){return\"oauth2\"!==e.get(\"type\")})),d=l()(r).call(r,(function(e){return\"oauth2\"===e.get(\"type\")}));return D.a.createElement(\"div\",{className:\"auth-container\"},!!h.size&&D.a.createElement(\"form\",{onSubmit:this.submitAuth},M()(h).call(h,(function(e,n){return D.a.createElement(s,{key:n,schema:e,name:n,getComponent:o,onAuthChange:t.onAuthChange,authorized:p,errSelectors:i})})).toArray(),D.a.createElement(\"div\",{className:\"auth-btn-wrapper\"},h.size===f.size?D.a.createElement(c,{className:\"btn modal-btn auth\",onClick:this.logoutClick},\"Logout\"):D.a.createElement(c,{type:\"submit\",className:\"btn modal-btn auth authorize\"},\"Authorize\"),D.a.createElement(c,{className:\"btn modal-btn auth btn-done\",onClick:this.close},\"Close\"))),d&&d.size?D.a.createElement(\"div\",null,D.a.createElement(\"div\",{className:\"scope-def\"},D.a.createElement(\"p\",null,\"Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.\"),D.a.createElement(\"p\",null,\"API requires the following scopes. Select which ones you want to grant to Swagger UI.\")),M()(e=l()(r).call(r,(function(e){return\"oauth2\"===e.get(\"type\")}))).call(e,(function(e,t){return D.a.createElement(\"div\",{key:t},D.a.createElement(u,{authorized:p,schema:e,name:t}))})).toArray()):null)}}]),n}(D.a.Component),Ie=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.schema,r=t.name,o=t.getComponent,a=t.onAuthChange,i=t.authorized,s=t.errSelectors,u=o(\"apiKeyAuth\"),c=o(\"basicAuth\"),l=n.get(\"type\");switch(l){case\"apiKey\":e=D.a.createElement(u,{key:r,schema:n,name:r,errSelectors:s,authorized:i,getComponent:o,onChange:a});break;case\"basic\":e=D.a.createElement(c,{key:r,schema:n,name:r,errSelectors:s,authorized:i,getComponent:o,onChange:a});break;default:e=D.a.createElement(\"div\",{key:r},\"Unknown security definition type \",l)}return D.a.createElement(\"div\",{key:\"\".concat(r,\"-jump\")},e)}}]),n}(D.a.Component),Pe=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props.error,t=e.get(\"level\"),n=e.get(\"message\"),r=e.get(\"source\");return D.a.createElement(\"div\",{className:\"errors\"},D.a.createElement(\"b\",null,r,\" \",t),D.a.createElement(\"span\",null,n))}}]),n}(D.a.Component),Ne=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;_()(this,n),o=t.call(this,e,r),y()(ve()(o),\"onChange\",(function(e){var t=o.props.onChange,n=e.target.value,r=A()({},o.state,{value:n});o.setState(r),t(r)}));var a=o.props,i=a.name,s=a.schema,u=o.getValue();return o.state={name:i,schema:s,value:u},o}return x()(n,[{key:\"getValue\",value:function(){var e=this.props,t=e.name,n=e.authorized;return n&&n.getIn([t,\"value\"])}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.schema,o=n.getComponent,a=n.errSelectors,i=n.name,s=o(\"Input\"),u=o(\"Row\"),c=o(\"Col\"),p=o(\"authError\"),f=o(\"Markdown\",!0),h=o(\"JumpToPath\",!0),d=this.getValue(),m=l()(e=a.allErrors()).call(e,(function(e){return e.get(\"authId\")===i}));return D.a.createElement(\"div\",null,D.a.createElement(\"h4\",null,D.a.createElement(\"code\",null,i||r.get(\"name\")),\"  (apiKey)\",D.a.createElement(h,{path:[\"securityDefinitions\",i]})),d&&D.a.createElement(\"h6\",null,\"Authorized\"),D.a.createElement(u,null,D.a.createElement(f,{source:r.get(\"description\")})),D.a.createElement(u,null,D.a.createElement(\"p\",null,\"Name: \",D.a.createElement(\"code\",null,r.get(\"name\")))),D.a.createElement(u,null,D.a.createElement(\"p\",null,\"In: \",D.a.createElement(\"code\",null,r.get(\"in\")))),D.a.createElement(u,null,D.a.createElement(\"label\",null,\"Value:\"),d?D.a.createElement(\"code\",null,\" ****** \"):D.a.createElement(c,null,D.a.createElement(s,{type:\"text\",onChange:this.onChange,autoFocus:!0}))),M()(t=m.valueSeq()).call(t,(function(e,t){return D.a.createElement(p,{error:e,key:t})})))}}]),n}(D.a.Component),Me=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;_()(this,n),o=t.call(this,e,r),y()(ve()(o),\"onChange\",(function(e){var t=o.props.onChange,n=e.target,r=n.value,a=n.name,i=o.state.value;i[a]=r,o.setState({value:i}),t(o.state)}));var a=o.props,i=a.schema,s=a.name,u=o.getValue().username;return o.state={name:s,schema:i,value:u?{username:u}:{}},o}return x()(n,[{key:\"getValue\",value:function(){var e=this.props,t=e.authorized,n=e.name;return t&&t.getIn([n,\"value\"])||{}}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.schema,o=n.getComponent,a=n.name,i=n.errSelectors,s=o(\"Input\"),u=o(\"Row\"),c=o(\"Col\"),p=o(\"authError\"),f=o(\"JumpToPath\",!0),h=o(\"Markdown\",!0),d=this.getValue().username,m=l()(e=i.allErrors()).call(e,(function(e){return e.get(\"authId\")===a}));return D.a.createElement(\"div\",null,D.a.createElement(\"h4\",null,\"Basic authorization\",D.a.createElement(f,{path:[\"securityDefinitions\",a]})),d&&D.a.createElement(\"h6\",null,\"Authorized\"),D.a.createElement(u,null,D.a.createElement(h,{source:r.get(\"description\")})),D.a.createElement(u,null,D.a.createElement(\"label\",null,\"Username:\"),d?D.a.createElement(\"code\",null,\" \",d,\" \"):D.a.createElement(c,null,D.a.createElement(s,{type:\"text\",required:\"required\",name:\"username\",onChange:this.onChange,autoFocus:!0}))),D.a.createElement(u,null,D.a.createElement(\"label\",null,\"Password:\"),d?D.a.createElement(\"code\",null,\" ****** \"):D.a.createElement(c,null,D.a.createElement(s,{autoComplete:\"new-password\",name:\"password\",type:\"password\",onChange:this.onChange}))),M()(t=m.valueSeq()).call(t,(function(e,t){return D.a.createElement(p,{error:e,key:t})})))}}]),n}(D.a.Component);function Re(e){var t=e.example,n=e.showValue,r=e.getComponent,o=e.getConfigs,a=r(\"Markdown\",!0),i=r(\"highlightCode\");return t?D.a.createElement(\"div\",{className:\"example\"},t.get(\"description\")?D.a.createElement(\"section\",{className:\"example__section\"},D.a.createElement(\"div\",{className:\"example__section-header\"},\"Example Description\"),D.a.createElement(\"p\",null,D.a.createElement(a,{source:t.get(\"description\")}))):null,n&&t.has(\"value\")?D.a.createElement(\"section\",{className:\"example__section\"},D.a.createElement(\"div\",{className:\"example__section-header\"},\"Example Value\"),D.a.createElement(i,{getConfigs:o,value:Object($.I)(t.get(\"value\"))})):null):null}var De=n(538),Le=n.n(De),Be=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"_onSelect\",(function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isSyntheticChange,o=void 0!==n&&n;\"function\"==typeof r.props.onSelect&&r.props.onSelect(e,{isSyntheticChange:o})})),y()(ve()(r),\"_onDomSelect\",(function(e){if(\"function\"==typeof r.props.onSelect){var t=e.target.selectedOptions[0].getAttribute(\"value\");r._onSelect(t,{isSyntheticChange:!1})}})),y()(ve()(r),\"getCurrentExample\",(function(){var e=r.props,t=e.examples,n=e.currentExampleKey,o=t.get(n),a=t.keySeq().first(),i=t.get(a);return o||i||Le()({})})),r}return x()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.onSelect,n=e.examples;if(\"function\"==typeof t){var r=n.first(),o=n.keyOf(r);this._onSelect(o,{isSyntheticChange:!0})}}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.currentExampleKey,n=e.examples;if(n!==this.props.examples&&!n.has(t)){var r=n.first(),o=n.keyOf(r);this._onSelect(o,{isSyntheticChange:!0})}}},{key:\"render\",value:function(){var e=this.props,t=e.examples,n=e.currentExampleKey,r=e.isValueModified,o=e.isModifiedValueAvailable,a=e.showLabels;return D.a.createElement(\"div\",{className:\"examples-select\"},a?D.a.createElement(\"span\",{className:\"examples-select__section-label\"},\"Examples: \"):null,D.a.createElement(\"select\",{className:\"examples-select-element\",onChange:this._onDomSelect,value:o&&r?\"__MODIFIED__VALUE__\":n||\"\"},o?D.a.createElement(\"option\",{value:\"__MODIFIED__VALUE__\"},\"[Modified value]\"):null,M()(t).call(t,(function(e,t){return D.a.createElement(\"option\",{key:t,value:t},e.get(\"summary\")||t)})).valueSeq()))}}]),n}(D.a.PureComponent);y()(Be,\"defaultProps\",{examples:F.a.Map({}),onSelect:function(){for(var e,t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=console).log.apply(e,u()(t=[\"DEBUG: ExamplesSelect was not given an onSelect callback\"]).call(t,r))},currentExampleKey:null,showLabels:!0});var Fe=function(e){return B.List.isList(e)?e:Object($.I)(e)},Ue=function(e){ye()(n,e);var t=_e()(n);function n(e){var r;_()(this,n),r=t.call(this,e),y()(ve()(r),\"_getStateForCurrentNamespace\",(function(){var e=r.props.currentNamespace;return(r.state[e]||Object(B.Map)()).toObject()})),y()(ve()(r),\"_setStateForCurrentNamespace\",(function(e){var t=r.props.currentNamespace;return r._setStateForNamespace(t,e)})),y()(ve()(r),\"_setStateForNamespace\",(function(e,t){var n=(r.state[e]||Object(B.Map)()).mergeDeep(t);return r.setState(y()({},e,n))})),y()(ve()(r),\"_isCurrentUserInputSameAsExampleValue\",(function(){var e=r.props.currentUserInputValue;return r._getCurrentExampleValue()===e})),y()(ve()(r),\"_getValueForExample\",(function(e,t){var n=(t||r.props).examples;return Fe((n||Object(B.Map)({})).getIn([e,\"value\"]))})),y()(ve()(r),\"_getCurrentExampleValue\",(function(e){var t=(e||r.props).currentKey;return r._getValueForExample(t,e||r.props)})),y()(ve()(r),\"_onExamplesSelect\",(function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isSyntheticChange,o=r.props,a=o.onSelect,i=o.updateValue,s=o.currentUserInputValue,c=o.userHasEditedBody,l=r._getStateForCurrentNamespace(),p=l.lastUserEditedValue,f=r._getValueForExample(e);if(\"__MODIFIED__VALUE__\"===e)return i(Fe(p)),r._setStateForCurrentNamespace({isModifiedValueSelected:!0});if(\"function\"==typeof a){for(var h,d=arguments.length,m=new Array(d>2?d-2:0),v=2;v<d;v++)m[v-2]=arguments[v];a.apply(void 0,u()(h=[e,{isSyntheticChange:n}]).call(h,m))}r._setStateForCurrentNamespace({lastDownstreamValue:f,isModifiedValueSelected:n&&c||!!s&&s!==f}),n||\"function\"==typeof i&&i(Fe(f))}));var o=r._getCurrentExampleValue();return r.state=y()({},e.currentNamespace,Object(B.Map)({lastUserEditedValue:r.props.currentUserInputValue,lastDownstreamValue:o,isModifiedValueSelected:r.props.userHasEditedBody||r.props.currentUserInputValue!==o})),r}return x()(n,[{key:\"componentWillUnmount\",value:function(){this.props.setRetainRequestBodyValueFlag(!1)}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.currentUserInputValue,n=e.examples,r=e.onSelect,o=e.userHasEditedBody,a=this._getStateForCurrentNamespace(),i=a.lastUserEditedValue,s=a.lastDownstreamValue,u=this._getValueForExample(e.currentKey,e),c=l()(n).call(n,(function(e){return e.get(\"value\")===t||Object($.I)(e.get(\"value\"))===t}));c.size?r(c.has(e.currentKey)?e.currentKey:c.keySeq().first(),{isSyntheticChange:!0}):t!==this.props.currentUserInputValue&&t!==i&&t!==s&&(this.props.setRetainRequestBodyValueFlag(!0),this._setStateForNamespace(e.currentNamespace,{lastUserEditedValue:e.currentUserInputValue,isModifiedValueSelected:o||t!==u}))}},{key:\"render\",value:function(){var e=this.props,t=e.currentUserInputValue,n=e.examples,r=e.currentKey,o=e.getComponent,a=e.userHasEditedBody,i=this._getStateForCurrentNamespace(),s=i.lastDownstreamValue,u=i.lastUserEditedValue,c=i.isModifiedValueSelected,l=o(\"ExamplesSelect\");return D.a.createElement(l,{examples:n,currentExampleKey:r,onSelect:this._onExamplesSelect,isModifiedValueAvailable:!!u&&u!==s,isValueModified:void 0!==t&&c&&t!==this._getCurrentExampleValue()||a})}}]),n}(D.a.PureComponent);y()(Ue,\"defaultProps\",{userHasEditedBody:!1,examples:Object(B.Map)({}),currentNamespace:\"__DEFAULT__NAMESPACE__\",setRetainRequestBodyValueFlag:function(){},onSelect:function(){for(var e,t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=console).log.apply(e,u()(t=[\"ExamplesSelectValueRetainer: no `onSelect` function was provided\"]).call(t,r))},updateValue:function(){for(var e,t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=console).log.apply(e,u()(t=[\"ExamplesSelectValueRetainer: no `updateValue` function was provided\"]).call(t,r))}});var qe=n(213),ze=n.n(qe),Ve=n(125),We=n.n(Ve),He=n(31),$e=n.n(He),Je=n(94),Ke=n.n(Je);var Ye=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;_()(this,n),o=t.call(this,e,r),y()(ve()(o),\"close\",(function(e){e.preventDefault(),o.props.authActions.showDefinitions(!1)})),y()(ve()(o),\"authorize\",(function(){var e=o.props,t=e.authActions,n=e.errActions,r=e.getConfigs,a=e.authSelectors,i=e.oas3Selectors,s=r(),u=a.getConfigs();n.clear({authId:name,type:\"auth\",source:\"auth\"}),function(e){var t=e.auth,n=e.authActions,r=e.errActions,o=e.configs,a=e.authConfigs,i=void 0===a?{}:a,s=e.currentServer,u=t.schema,c=t.scopes,l=t.name,p=t.clientId,f=u.get(\"flow\"),h=[];switch(f){case\"password\":return void n.authorizePassword(t);case\"application\":return void n.authorizeApplication(t);case\"accessCode\":h.push(\"response_type=code\");break;case\"implicit\":h.push(\"response_type=token\");break;case\"clientCredentials\":case\"client_credentials\":return void n.authorizeApplication(t);case\"authorizationCode\":case\"authorization_code\":h.push(\"response_type=code\")}\"string\"==typeof p&&h.push(\"client_id=\"+encodeURIComponent(p));var d=o.oauth2RedirectUrl;if(void 0!==d){h.push(\"redirect_uri=\"+encodeURIComponent(d));var m=[];if(T()(c)?m=c:F.a.List.isList(c)&&(m=c.toArray()),m.length>0){var v=i.scopeSeparator||\" \";h.push(\"scope=\"+encodeURIComponent(m.join(v)))}var g=Object($.a)(new Date);if(h.push(\"state=\"+encodeURIComponent(g)),void 0!==i.realm&&h.push(\"realm=\"+encodeURIComponent(i.realm)),(\"authorizationCode\"===f||\"authorization_code\"===f||\"accessCode\"===f)&&i.usePkceWithAuthorizationCodeGrant){var y=Object($.j)(),b=Object($.c)(y);h.push(\"code_challenge=\"+b),h.push(\"code_challenge_method=S256\"),t.codeVerifier=y}var _=i.additionalQueryStringParams;for(var w in _){var x;void 0!==_[w]&&h.push(M()(x=[w,_[w]]).call(x,encodeURIComponent).join(\"=\"))}var E,S=u.get(\"authorizationUrl\"),C=[s?Ke()(Object($.F)(S),s,!0).toString():Object($.F)(S),h.join(\"&\")].join(-1===xe()(S).call(S,\"?\")?\"?\":\"&\");E=\"implicit\"===f?n.preAuthorizeImplicit:i.useBasicAuthenticationWithAccessCodeGrant?n.authorizeAccessCodeWithBasicAuthentication:n.authorizeAccessCodeWithFormParams,H.a.swaggerUIRedirectOauth2={auth:t,state:g,redirectUrl:d,callback:E,errCb:r.newAuthErr},H.a.open(C)}else r.newAuthErr({authId:l,source:\"validation\",level:\"error\",message:\"oauth2RedirectUrl configuration is not passed. Oauth2 authorization cannot be performed.\"})}({auth:o.state,currentServer:i.serverEffectiveValue(i.selectedServer()),authActions:t,errActions:n,configs:s,authConfigs:u})})),y()(ve()(o),\"onScopeChange\",(function(e){var t,n,r=e.target,a=r.checked,i=r.dataset.value;if(a&&-1===xe()(t=o.state.scopes).call(t,i)){var s,c=u()(s=o.state.scopes).call(s,[i]);o.setState({scopes:c})}else if(!a&&xe()(n=o.state.scopes).call(n,i)>-1){var p;o.setState({scopes:l()(p=o.state.scopes).call(p,(function(e){return e!==i}))})}})),y()(ve()(o),\"onInputChange\",(function(e){var t=e.target,n=t.dataset.name,r=t.value,a=y()({},n,r);o.setState(a)})),y()(ve()(o),\"selectScopes\",(function(e){var t;e.target.dataset.all?o.setState({scopes:ze()(We()(t=o.props.schema.get(\"allowedScopes\")||o.props.schema.get(\"scopes\")).call(t))}):o.setState({scopes:[]})})),y()(ve()(o),\"logout\",(function(e){e.preventDefault();var t=o.props,n=t.authActions,r=t.errActions,a=t.name;r.clear({authId:a,type:\"auth\",source:\"auth\"}),n.logoutWithPersistOption([a])}));var a=o.props,i=a.name,s=a.schema,c=a.authorized,p=a.authSelectors,f=c&&c.get(i),h=p.getConfigs()||{},d=f&&f.get(\"username\")||\"\",m=f&&f.get(\"clientId\")||h.clientId||\"\",v=f&&f.get(\"clientSecret\")||h.clientSecret||\"\",g=f&&f.get(\"passwordType\")||\"basic\",b=f&&f.get(\"scopes\")||h.scopes||[];return\"string\"==typeof b&&(b=b.split(h.scopeSeparator||\" \")),o.state={appName:h.appName,name:i,schema:s,scopes:b,clientId:m,clientSecret:v,username:d,password:\"\",passwordType:g},o}return x()(n,[{key:\"render\",value:function(){var e,t,n=this,r=this.props,o=r.schema,a=r.getComponent,i=r.authSelectors,s=r.errSelectors,c=r.name,p=r.specSelectors,f=a(\"Input\"),h=a(\"Row\"),d=a(\"Col\"),m=a(\"Button\"),v=a(\"authError\"),g=a(\"JumpToPath\",!0),y=a(\"Markdown\",!0),b=a(\"InitializedInput\"),_=p.isOAS3,w=_()?o.get(\"openIdConnectUrl\"):null,x=\"implicit\",E=\"password\",S=_()?w?\"authorization_code\":\"authorizationCode\":\"accessCode\",C=_()?w?\"client_credentials\":\"clientCredentials\":\"application\",A=o.get(\"flow\"),k=o.get(\"allowedScopes\")||o.get(\"scopes\"),O=!!i.authorized().get(c),j=l()(e=s.allErrors()).call(e,(function(e){return e.get(\"authId\")===c})),T=!l()(j).call(j,(function(e){return\"validation\"===e.get(\"source\")})).size,I=o.get(\"description\");return D.a.createElement(\"div\",null,D.a.createElement(\"h4\",null,c,\" (OAuth2, \",o.get(\"flow\"),\") \",D.a.createElement(g,{path:[\"securityDefinitions\",c]})),this.state.appName?D.a.createElement(\"h5\",null,\"Application: \",this.state.appName,\" \"):null,I&&D.a.createElement(y,{source:o.get(\"description\")}),O&&D.a.createElement(\"h6\",null,\"Authorized\"),w&&D.a.createElement(\"p\",null,\"OpenID Connect URL: \",D.a.createElement(\"code\",null,w)),(A===x||A===S)&&D.a.createElement(\"p\",null,\"Authorization URL: \",D.a.createElement(\"code\",null,o.get(\"authorizationUrl\"))),(A===E||A===S||A===C)&&D.a.createElement(\"p\",null,\"Token URL:\",D.a.createElement(\"code\",null,\" \",o.get(\"tokenUrl\"))),D.a.createElement(\"p\",{className:\"flow\"},\"Flow: \",D.a.createElement(\"code\",null,o.get(\"flow\"))),A!==E?null:D.a.createElement(h,null,D.a.createElement(h,null,D.a.createElement(\"label\",{htmlFor:\"oauth_username\"},\"username:\"),O?D.a.createElement(\"code\",null,\" \",this.state.username,\" \"):D.a.createElement(d,{tablet:10,desktop:10},D.a.createElement(\"input\",{id:\"oauth_username\",type:\"text\",\"data-name\":\"username\",onChange:this.onInputChange,autoFocus:!0}))),D.a.createElement(h,null,D.a.createElement(\"label\",{htmlFor:\"oauth_password\"},\"password:\"),O?D.a.createElement(\"code\",null,\" ****** \"):D.a.createElement(d,{tablet:10,desktop:10},D.a.createElement(\"input\",{id:\"oauth_password\",type:\"password\",\"data-name\":\"password\",onChange:this.onInputChange}))),D.a.createElement(h,null,D.a.createElement(\"label\",{htmlFor:\"password_type\"},\"Client credentials location:\"),O?D.a.createElement(\"code\",null,\" \",this.state.passwordType,\" \"):D.a.createElement(d,{tablet:10,desktop:10},D.a.createElement(\"select\",{id:\"password_type\",\"data-name\":\"passwordType\",onChange:this.onInputChange},D.a.createElement(\"option\",{value:\"basic\"},\"Authorization header\"),D.a.createElement(\"option\",{value:\"request-body\"},\"Request body\"))))),(A===C||A===x||A===S||A===E)&&(!O||O&&this.state.clientId)&&D.a.createElement(h,null,D.a.createElement(\"label\",{htmlFor:\"client_id\"},\"client_id:\"),O?D.a.createElement(\"code\",null,\" ****** \"):D.a.createElement(d,{tablet:10,desktop:10},D.a.createElement(b,{id:\"client_id\",type:\"text\",required:A===E,initialValue:this.state.clientId,\"data-name\":\"clientId\",onChange:this.onInputChange}))),(A===C||A===S||A===E)&&D.a.createElement(h,null,D.a.createElement(\"label\",{htmlFor:\"client_secret\"},\"client_secret:\"),O?D.a.createElement(\"code\",null,\" ****** \"):D.a.createElement(d,{tablet:10,desktop:10},D.a.createElement(b,{id:\"client_secret\",initialValue:this.state.clientSecret,type:\"password\",\"data-name\":\"clientSecret\",onChange:this.onInputChange}))),!O&&k&&k.size?D.a.createElement(\"div\",{className:\"scopes\"},D.a.createElement(\"h2\",null,\"Scopes:\",D.a.createElement(\"a\",{onClick:this.selectScopes,\"data-all\":!0},\"select all\"),D.a.createElement(\"a\",{onClick:this.selectScopes},\"select none\")),M()(k).call(k,(function(e,t){var r,o,a,i,s;return D.a.createElement(h,{key:t},D.a.createElement(\"div\",{className:\"checkbox\"},D.a.createElement(f,{\"data-value\":t,id:u()(r=u()(o=\"\".concat(t,\"-\")).call(o,A,\"-checkbox-\")).call(r,n.state.name),disabled:O,checked:$e()(a=n.state.scopes).call(a,t),type:\"checkbox\",onChange:n.onScopeChange}),D.a.createElement(\"label\",{htmlFor:u()(i=u()(s=\"\".concat(t,\"-\")).call(s,A,\"-checkbox-\")).call(i,n.state.name)},D.a.createElement(\"span\",{className:\"item\"}),D.a.createElement(\"div\",{className:\"text\"},D.a.createElement(\"p\",{className:\"name\"},t),D.a.createElement(\"p\",{className:\"description\"},e)))))})).toArray()):null,M()(t=j.valueSeq()).call(t,(function(e,t){return D.a.createElement(v,{error:e,key:t})})),D.a.createElement(\"div\",{className:\"auth-btn-wrapper\"},T&&(O?D.a.createElement(m,{className:\"btn modal-btn auth authorize\",onClick:this.logout},\"Logout\"):D.a.createElement(m,{className:\"btn modal-btn auth authorize\",onClick:this.authorize},\"Authorize\")),D.a.createElement(m,{className:\"btn modal-btn auth btn-done\",onClick:this.close},\"Close\")))}}]),n}(D.a.Component),Ge=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onClick\",(function(){var e=r.props,t=e.specActions,n=e.path,o=e.method;t.clearResponse(n,o),t.clearRequest(n,o)})),r}return x()(n,[{key:\"render\",value:function(){return D.a.createElement(\"button\",{className:\"btn btn-clear opblock-control__btn\",onClick:this.onClick},\"Clear\")}}]),n}(R.Component),Ze=function(e){var t=e.headers;return D.a.createElement(\"div\",null,D.a.createElement(\"h5\",null,\"Response headers\"),D.a.createElement(\"pre\",{className:\"microlight\"},t))},Xe=function(e){var t=e.duration;return D.a.createElement(\"div\",null,D.a.createElement(\"h5\",null,\"Request duration\"),D.a.createElement(\"pre\",{className:\"microlight\"},t,\" ms\"))},Qe=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"shouldComponentUpdate\",value:function(e){return this.props.response!==e.response||this.props.path!==e.path||this.props.method!==e.method||this.props.displayRequestDuration!==e.displayRequestDuration}},{key:\"render\",value:function(){var e,t=this.props,n=t.response,r=t.getComponent,o=t.getConfigs,a=t.displayRequestDuration,i=t.specSelectors,s=t.path,c=t.method,l=o(),p=l.showMutatedRequest,h=l.requestSnippetsEnabled,d=p?i.mutatedRequestFor(s,c):i.requestFor(s,c),m=n.get(\"status\"),v=d.get(\"url\"),g=n.get(\"headers\").toJS(),y=n.get(\"notDocumented\"),b=n.get(\"error\"),_=n.get(\"text\"),w=n.get(\"duration\"),x=f()(g),E=g[\"content-type\"]||g[\"Content-Type\"],S=r(\"responseBody\"),C=M()(x).call(x,(function(e){var t=T()(g[e])?g[e].join():g[e];return D.a.createElement(\"span\",{className:\"headerline\",key:e},\" \",e,\": \",t,\" \")})),A=0!==C.length,k=r(\"Markdown\",!0),O=r(\"RequestSnippets\",!0),j=r(\"curl\");return D.a.createElement(\"div\",null,d&&(!0===h||\"true\"===h?D.a.createElement(O,{request:d}):D.a.createElement(j,{request:d,getConfigs:o})),v&&D.a.createElement(\"div\",null,D.a.createElement(\"h4\",null,\"Request URL\"),D.a.createElement(\"div\",{className:\"request-url\"},D.a.createElement(\"pre\",{className:\"microlight\"},v))),D.a.createElement(\"h4\",null,\"Server response\"),D.a.createElement(\"table\",{className:\"responses-table live-responses-table\"},D.a.createElement(\"thead\",null,D.a.createElement(\"tr\",{className:\"responses-header\"},D.a.createElement(\"td\",{className:\"col_header response-col_status\"},\"Code\"),D.a.createElement(\"td\",{className:\"col_header response-col_description\"},\"Details\"))),D.a.createElement(\"tbody\",null,D.a.createElement(\"tr\",{className:\"response\"},D.a.createElement(\"td\",{className:\"response-col_status\"},m,y?D.a.createElement(\"div\",{className:\"response-undocumented\"},D.a.createElement(\"i\",null,\" Undocumented \")):null),D.a.createElement(\"td\",{className:\"response-col_description\"},b?D.a.createElement(k,{source:u()(e=\"\".concat(\"\"!==n.get(\"name\")?\"\".concat(n.get(\"name\"),\": \"):\"\")).call(e,n.get(\"message\"))}):null,_?D.a.createElement(S,{content:_,contentType:E,url:v,headers:g,getConfigs:o,getComponent:r}):null,A?D.a.createElement(Ze,{headers:C}):null,a&&w?D.a.createElement(Xe,{duration:w}):null)))))}}]),n}(D.a.Component),et=n(219),tt=[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\"],nt=u()(tt).call(tt,[\"trace\"]),rt=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"renderOperationTag\",(function(e,t){var n=r.props,o=n.specSelectors,a=n.getComponent,i=n.oas3Selectors,s=n.layoutSelectors,c=n.layoutActions,l=n.getConfigs,p=a(\"OperationContainer\",!0),f=a(\"OperationTag\"),h=e.get(\"operations\");return D.a.createElement(f,{key:\"operation-\"+t,tagObj:e,tag:t,oas3Selectors:i,layoutSelectors:s,layoutActions:c,getConfigs:l,getComponent:a,specUrl:o.url()},D.a.createElement(\"div\",{className:\"operation-tag-content\"},M()(h).call(h,(function(e){var n,r=e.get(\"path\"),a=e.get(\"method\"),i=F.a.List([\"paths\",r,a]),s=o.isOAS3()?nt:tt;return-1===xe()(s).call(s,a)?null:D.a.createElement(p,{key:u()(n=\"\".concat(r,\"-\")).call(n,a),specPath:i,op:e,path:r,method:a,tag:t})})).toArray()))})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props.specSelectors.taggedOperations();return 0===e.size?D.a.createElement(\"h3\",null,\" No operations defined in spec!\"):D.a.createElement(\"div\",null,M()(e).call(e,this.renderOperationTag).toArray(),e.size<1?D.a.createElement(\"h3\",null,\" No operations defined in spec! \"):null)}}]),n}(D.a.Component),ot=n(95),at=n.n(ot);function it(e){return e.match(/^(?:[a-z]+:)?\\/\\//i)}function st(e,t){return e?it(e)?(n=e).match(/^\\/\\//i)?u()(r=\"\".concat(window.location.protocol)).call(r,n):n:new at.a(e,t).href:t;var n,r}function ut(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.selectedServer,o=void 0===r?\"\":r;if(e){if(it(e))return e;var a=st(o,t);return it(a)?new at.a(e,a).href:new at.a(e,window.location.href).href}}var ct=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.tagObj,r=t.tag,o=t.children,a=t.oas3Selectors,i=t.layoutSelectors,s=t.layoutActions,u=t.getConfigs,c=t.getComponent,l=t.specUrl,p=u(),f=p.docExpansion,h=p.deepLinking,d=h&&\"false\"!==h,m=c(\"Collapse\"),v=c(\"Markdown\",!0),g=c(\"DeepLink\"),y=c(\"Link\"),b=n.getIn([\"tagDetails\",\"description\"],null),_=n.getIn([\"tagDetails\",\"externalDocs\",\"description\"]),w=n.getIn([\"tagDetails\",\"externalDocs\",\"url\"]);e=Object($.s)(a)&&Object($.s)(a.selectedServer)?ut(w,l,{selectedServer:a.selectedServer()}):w;var x=[\"operations-tag\",r],E=i.isShown(x,\"full\"===f||\"list\"===f);return D.a.createElement(\"div\",{className:E?\"opblock-tag-section is-open\":\"opblock-tag-section\"},D.a.createElement(\"h3\",{onClick:function(){return s.show(x,!E)},className:b?\"opblock-tag\":\"opblock-tag no-desc\",id:M()(x).call(x,(function(e){return Object($.g)(e)})).join(\"-\"),\"data-tag\":r,\"data-is-open\":E},D.a.createElement(g,{enabled:d,isShown:E,path:Object($.d)(r),text:r}),b?D.a.createElement(\"small\",null,D.a.createElement(v,{source:b})):D.a.createElement(\"small\",null),D.a.createElement(\"div\",null,_?D.a.createElement(\"small\",null,_,e?\": \":null,e?D.a.createElement(y,{href:Object($.F)(e),onClick:function(e){return e.stopPropagation()},target:\"_blank\"},e):null):null),D.a.createElement(\"button\",{\"aria-expanded\":E,className:\"expand-operation\",title:E?\"Collapse operation\":\"Expand operation\",onClick:function(){return s.show(x,!E)}},D.a.createElement(\"svg\",{className:\"arrow\",width:\"20\",height:\"20\",\"aria-hidden\":\"true\",focusable:\"false\"},D.a.createElement(\"use\",{href:E?\"#large-arrow-up\":\"#large-arrow-down\",xlinkHref:E?\"#large-arrow-up\":\"#large-arrow-down\"})))),D.a.createElement(m,{isOpened:E},o))}}]),n}(D.a.Component);y()(ct,\"defaultProps\",{tagObj:F.a.fromJS({}),tag:\"\"});var lt=function(e){ye()(r,e);var t=_e()(r);function r(){return _()(this,r),t.apply(this,arguments)}return x()(r,[{key:\"render\",value:function(){var e=this.props,t=e.specPath,r=e.response,o=e.request,a=e.toggleShown,i=e.onTryoutClick,s=e.onCancelClick,u=e.onExecute,c=e.fn,l=e.getComponent,p=e.getConfigs,f=e.specActions,h=e.specSelectors,d=e.authActions,m=e.authSelectors,v=e.oas3Actions,g=e.oas3Selectors,y=this.props.operation,b=y.toJS(),_=b.deprecated,w=b.isShown,x=b.path,E=b.method,S=b.op,C=b.tag,A=b.operationId,k=b.allowTryItOut,O=b.displayRequestDuration,j=b.tryItOutEnabled,T=b.executeInProgress,I=S.description,P=S.externalDocs,N=S.schemes,M=P?ut(P.url,h.url(),{selectedServer:g.selectedServer()}):\"\",R=y.getIn([\"op\"]),L=R.get(\"responses\"),B=Object($.n)(R,[\"parameters\"]),F=h.operationScheme(x,E),U=[\"operations\",C,A],q=Object($.m)(R),z=l(\"responses\"),V=l(\"parameters\"),W=l(\"execute\"),H=l(\"clear\"),J=l(\"Collapse\"),K=l(\"Markdown\",!0),Y=l(\"schemes\"),G=l(\"OperationServers\"),Z=l(\"OperationExt\"),X=l(\"OperationSummary\"),Q=l(\"Link\"),ee=p().showExtensions;if(L&&r&&r.size>0){var te=!L.get(String(r.get(\"status\")))&&!L.get(\"default\");r=r.set(\"notDocumented\",te)}var ne=[x,E];return D.a.createElement(\"div\",{className:_?\"opblock opblock-deprecated\":w?\"opblock opblock-\".concat(E,\" is-open\"):\"opblock opblock-\".concat(E),id:Object($.g)(U.join(\"-\"))},D.a.createElement(X,{operationProps:y,isShown:w,toggleShown:a,getComponent:l,authActions:d,authSelectors:m,specPath:t}),D.a.createElement(J,{isOpened:w},D.a.createElement(\"div\",{className:\"opblock-body\"},R&&R.size||null===R?null:D.a.createElement(\"img\",{height:\"32px\",width:\"32px\",src:n(506),className:\"opblock-loading-animation\"}),_&&D.a.createElement(\"h4\",{className:\"opblock-title_normal\"},\" Warning: Deprecated\"),I&&D.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},D.a.createElement(\"div\",{className:\"opblock-description\"},D.a.createElement(K,{source:I}))),M?D.a.createElement(\"div\",{className:\"opblock-external-docs-wrapper\"},D.a.createElement(\"h4\",{className:\"opblock-title_normal\"},\"Find more details\"),D.a.createElement(\"div\",{className:\"opblock-external-docs\"},D.a.createElement(\"span\",{className:\"opblock-external-docs__description\"},D.a.createElement(K,{source:P.description})),D.a.createElement(Q,{target:\"_blank\",className:\"opblock-external-docs__link\",href:Object($.F)(M)},M))):null,R&&R.size?D.a.createElement(V,{parameters:B,specPath:t.push(\"parameters\"),operation:R,onChangeKey:ne,onTryoutClick:i,onCancelClick:s,tryItOutEnabled:j,allowTryItOut:k,fn:c,getComponent:l,specActions:f,specSelectors:h,pathMethod:[x,E],getConfigs:p,oas3Actions:v,oas3Selectors:g}):null,j?D.a.createElement(G,{getComponent:l,path:x,method:E,operationServers:R.get(\"servers\"),pathServers:h.paths().getIn([x,\"servers\"]),getSelectedServer:g.selectedServer,setSelectedServer:v.setSelectedServer,setServerVariableValue:v.setServerVariableValue,getServerVariable:g.serverVariableValue,getEffectiveServerValue:g.serverEffectiveValue}):null,j&&k&&N&&N.size?D.a.createElement(\"div\",{className:\"opblock-schemes\"},D.a.createElement(Y,{schemes:N,path:x,method:E,specActions:f,currentScheme:F})):null,D.a.createElement(\"div\",{className:j&&r&&k?\"btn-group\":\"execute-wrapper\"},j&&k?D.a.createElement(W,{operation:R,specActions:f,specSelectors:h,oas3Selectors:g,oas3Actions:v,path:x,method:E,onExecute:u,disabled:T}):null,j&&r&&k?D.a.createElement(H,{specActions:f,path:x,method:E}):null),T?D.a.createElement(\"div\",{className:\"loading-container\"},D.a.createElement(\"div\",{className:\"loading\"})):null,L?D.a.createElement(z,{responses:L,request:o,tryItOutResponse:r,getComponent:l,getConfigs:p,specSelectors:h,oas3Actions:v,oas3Selectors:g,specActions:f,produces:h.producesOptionsFor([x,E]),producesValue:h.currentProducesFor([x,E]),specPath:t.push(\"responses\"),path:x,method:E,displayRequestDuration:O,fn:c}):null,ee&&q.size?D.a.createElement(Z,{extensions:q,getComponent:l}):null)))}}]),r}(R.PureComponent);y()(lt,\"defaultProps\",{operation:null,response:null,request:null,specPath:Object(B.List)(),summary:\"\"});var pt=n(92),ft=n.n(pt),ht=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.isShown,r=t.toggleShown,o=t.getComponent,a=t.authActions,i=t.authSelectors,s=t.operationProps,c=t.specPath,l=s.toJS(),p=l.summary,f=l.isAuthorized,h=l.method,d=l.op,m=l.showSummary,v=l.path,g=l.operationId,y=l.originalOperationId,b=l.displayOperationId,_=d.summary,w=s.get(\"security\"),x=o(\"authorizeOperationBtn\"),E=o(\"OperationSummaryMethod\"),S=o(\"OperationSummaryPath\"),C=o(\"JumpToPath\",!0),A=w&&!!w.count(),k=A&&1===w.size&&w.first().isEmpty(),O=!A||k;return D.a.createElement(\"div\",{className:\"opblock-summary opblock-summary-\".concat(h)},D.a.createElement(\"button\",{\"aria-label\":u()(e=\"\".concat(h,\" \")).call(e,v.replace(/\\//g,\"​/\")),\"aria-expanded\":n,className:\"opblock-summary-control\",onClick:r},D.a.createElement(E,{method:h}),D.a.createElement(S,{getComponent:o,operationProps:s,specPath:c}),m?D.a.createElement(\"div\",{className:\"opblock-summary-description\"},ft()(_||p)):null,b&&(y||g)?D.a.createElement(\"span\",{className:\"opblock-summary-operation-id\"},y||g):null,D.a.createElement(\"svg\",{className:\"arrow\",width:\"20\",height:\"20\",\"aria-hidden\":\"true\",focusable:\"false\"},D.a.createElement(\"use\",{href:n?\"#large-arrow-up\":\"#large-arrow-down\",xlinkHref:n?\"#large-arrow-up\":\"#large-arrow-down\"}))),O?null:D.a.createElement(x,{isAuthorized:f,onClick:function(){var e=i.definitionsForRequirements(w);a.showDefinitions(e)}}),D.a.createElement(C,{path:c}))}}]),n}(R.PureComponent);y()(ht,\"defaultProps\",{operationProps:null,specPath:Object(B.List)(),summary:\"\"});var dt=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props.method;return D.a.createElement(\"span\",{className:\"opblock-summary-method\"},e.toUpperCase())}}]),n}(R.PureComponent);y()(dt,\"defaultProps\",{operationProps:null});var mt=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onCopyCapture\",(function(e){e.clipboardData.setData(\"text/plain\",r.props.operationProps.get(\"path\")),e.preventDefault()})),r}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.getComponent,r=t.operationProps.toJS(),o=r.deprecated,a=r.isShown,i=r.path,s=r.tag,c=r.operationId,l=r.isDeepLinkingEnabled,p=n(\"DeepLink\");return D.a.createElement(\"span\",{className:o?\"opblock-summary-path__deprecated\":\"opblock-summary-path\",onCopyCapture:this.onCopyCapture,\"data-path\":i},D.a.createElement(p,{enabled:l,isShown:a,path:Object($.d)(u()(e=\"\".concat(s,\"/\")).call(e,c)),text:i.replace(/\\//g,\"​/\")}))}}]),n}(R.PureComponent),vt=n(13),gt=n.n(vt),yt=function(e){var t,n=e.extensions,r=(0,e.getComponent)(\"OperationExtRow\");return D.a.createElement(\"div\",{className:\"opblock-section\"},D.a.createElement(\"div\",{className:\"opblock-section-header\"},D.a.createElement(\"h4\",null,\"Extensions\")),D.a.createElement(\"div\",{className:\"table-container\"},D.a.createElement(\"table\",null,D.a.createElement(\"thead\",null,D.a.createElement(\"tr\",null,D.a.createElement(\"td\",{className:\"col_header\"},\"Field\"),D.a.createElement(\"td\",{className:\"col_header\"},\"Value\"))),D.a.createElement(\"tbody\",null,M()(t=n.entrySeq()).call(t,(function(e){var t,n=gt()(e,2),o=n[0],a=n[1];return D.a.createElement(r,{key:u()(t=\"\".concat(o,\"-\")).call(t,a),xKey:o,xVal:a})}))))))},bt=function(e){var t=e.xKey,n=e.xVal,r=n?n.toJS?n.toJS():n:null;return D.a.createElement(\"tr\",null,D.a.createElement(\"td\",null,t),D.a.createElement(\"td\",null,d()(r)))},_t=n(96),wt=n(43),xt=n.n(wt),Et=n(539),St=n.n(Et),Ct=n(147),At=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"downloadText\",(function(){St()(r.props.value,r.props.fileName||\"response.txt\")})),y()(ve()(r),\"preventYScrollingBeyondElement\",(function(e){var t=e.target,n=e.nativeEvent.deltaY,r=t.scrollHeight,o=t.offsetHeight,a=t.scrollTop;r>o&&(0===a&&n<0||o+a>=r&&n>0)&&e.preventDefault()})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.value,n=e.className,r=e.downloadable,o=e.getConfigs,a=e.canCopy,i=e.language,s=o?o():{syntaxHighlight:{activated:!0,theme:\"agate\"}};n=n||\"\";var u=xt()(s,\"syntaxHighlight.activated\")?D.a.createElement(_t.a,{language:i,className:n+\" microlight\",onWheel:this.preventYScrollingBeyondElement,style:Object(_t.b)(xt()(s,\"syntaxHighlight.theme\"))},t):D.a.createElement(\"pre\",{onWheel:this.preventYScrollingBeyondElement,className:n+\" microlight\"},t);return D.a.createElement(\"div\",{className:\"highlight-code\"},r?D.a.createElement(\"div\",{className:\"download-contents\",onClick:this.downloadText},\"Download\"):null,a?D.a.createElement(\"div\",{className:\"copy-to-clipboard\"},D.a.createElement(Ct.CopyToClipboard,{text:t},D.a.createElement(\"button\",null))):null,u)}}]),n}(R.Component);var kt=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onChangeProducesWrapper\",(function(e){return r.props.specActions.changeProducesValue([r.props.path,r.props.method],e)})),y()(ve()(r),\"onResponseContentTypeChange\",(function(e){var t=e.controlsAcceptHeader,n=e.value,o=r.props,a=o.oas3Actions,i=o.path,s=o.method;t&&a.setResponseContentType({value:n,path:i,method:s})})),r}return x()(n,[{key:\"render\",value:function(){var e,t,r=this,o=this.props,a=o.responses,i=o.tryItOutResponse,s=o.getComponent,c=o.getConfigs,l=o.specSelectors,p=o.fn,f=o.producesValue,h=o.displayRequestDuration,d=o.specPath,m=o.path,v=o.method,g=o.oas3Selectors,y=o.oas3Actions,b=Object($.f)(a),_=s(\"contentType\"),w=s(\"liveResponse\"),x=s(\"response\"),E=this.props.produces&&this.props.produces.size?this.props.produces:n.defaultProps.produces,S=l.isOAS3()?Object($.k)(a):null,C=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"_\";return e.replace(/[^\\w-]/g,t)}(u()(e=\"\".concat(v)).call(e,m,\"_responses\")),A=\"\".concat(C,\"_select\");return D.a.createElement(\"div\",{className:\"responses-wrapper\"},D.a.createElement(\"div\",{className:\"opblock-section-header\"},D.a.createElement(\"h4\",null,\"Responses\"),l.isOAS3()?null:D.a.createElement(\"label\",{htmlFor:A},D.a.createElement(\"span\",null,\"Response content type\"),D.a.createElement(_,{value:f,ariaControls:C,ariaLabel:\"Response content type\",className:\"execute-content-type\",contentTypes:E,controlId:A,onChange:this.onChangeProducesWrapper}))),D.a.createElement(\"div\",{className:\"responses-inner\"},i?D.a.createElement(\"div\",null,D.a.createElement(w,{response:i,getComponent:s,getConfigs:c,specSelectors:l,path:this.props.path,method:this.props.method,displayRequestDuration:h}),D.a.createElement(\"h4\",null,\"Responses\")):null,D.a.createElement(\"table\",{\"aria-live\":\"polite\",className:\"responses-table\",id:C,role:\"region\"},D.a.createElement(\"thead\",null,D.a.createElement(\"tr\",{className:\"responses-header\"},D.a.createElement(\"td\",{className:\"col_header response-col_status\"},\"Code\"),D.a.createElement(\"td\",{className:\"col_header response-col_description\"},\"Description\"),l.isOAS3()?D.a.createElement(\"td\",{className:\"col col_header response-col_links\"},\"Links\"):null)),D.a.createElement(\"tbody\",null,M()(t=a.entrySeq()).call(t,(function(e){var t=gt()(e,2),n=t[0],o=t[1],a=i&&i.get(\"status\")==n?\"response_current\":\"\";return D.a.createElement(x,{key:n,path:m,method:v,specPath:d.push(n),isDefault:b===n,fn:p,className:a,code:n,response:o,specSelectors:l,controlsAcceptHeader:o===S,onContentTypeChange:r.onResponseContentTypeChange,contentType:f,getConfigs:c,activeExamplesKey:g.activeExamplesMember(m,v,\"responses\",n),oas3Actions:y,getComponent:s})})).toArray()))))}}]),n}(D.a.Component);y()(kt,\"defaultProps\",{tryItOutResponse:null,produces:Object(B.fromJS)([\"application/json\"]),displayRequestDuration:!1});var Ot=n(24),jt=n.n(Ot),Tt=n(540),It=n.n(Tt),Pt=n(63),Nt=n.n(Pt),Mt=n(102),Rt=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;return _()(this,n),o=t.call(this,e,r),y()(ve()(o),\"_onContentTypeChange\",(function(e){var t=o.props,n=t.onContentTypeChange,r=t.controlsAcceptHeader;o.setState({responseContentType:e}),n({value:e,controlsAcceptHeader:r})})),y()(ve()(o),\"getTargetExamplesKey\",(function(){var e=o.props,t=e.response,n=e.contentType,r=e.activeExamplesKey,a=o.state.responseContentType||n,i=t.getIn([\"content\",a],Object(B.Map)({})).get(\"examples\",null).keySeq().first();return r||i})),o.state={responseContentType:\"\"},o}return x()(n,[{key:\"render\",value:function(){var e,t,n,r,o,a=this.props,i=a.path,s=a.method,c=a.code,l=a.response,p=a.className,f=a.specPath,h=a.fn,d=a.getComponent,m=a.getConfigs,v=a.specSelectors,g=a.contentType,y=a.controlsAcceptHeader,b=a.oas3Actions,_=h.inferSchema,w=v.isOAS3(),x=m().showExtensions,E=x?Object($.m)(l):null,S=l.get(\"headers\"),C=l.get(\"links\"),A=d(\"ResponseExtension\"),k=d(\"headers\"),O=d(\"highlightCode\"),j=d(\"modelExample\"),T=d(\"Markdown\",!0),I=d(\"operationLink\"),P=d(\"contentType\"),N=d(\"ExamplesSelect\"),R=d(\"Example\"),L=this.state.responseContentType||g,F=l.getIn([\"content\",L],Object(B.Map)({})),U=F.get(\"examples\",null);if(w){var q=F.get(\"schema\");n=q?_(q.toJS()):null,r=q?Object(B.List)([\"content\",this.state.responseContentType,\"schema\"]):f}else n=l.get(\"schema\"),r=l.has(\"schema\")?f.push(\"schema\"):f;var z,V=!1,W={includeReadOnly:!0};if(w){var H;if(z=null===(H=F.get(\"schema\"))||void 0===H?void 0:H.toJS(),U){var J=this.getTargetExamplesKey(),K=function(e){return e.get(\"value\")};void 0===(o=K(U.get(J,Object(B.Map)({}))))&&(o=K(It()(U).call(U).next().value)),V=!0}else void 0!==F.get(\"example\")&&(o=F.get(\"example\"),V=!0)}else{z=n,W=jt()(jt()({},W),{},{includeWriteOnly:!0});var Y=l.getIn([\"examples\",L]);Y&&(o=Y,V=!0)}var G=function(e,t,n){if(null!=e){var r=null;return Object(Mt.a)(e)&&(r=\"json\"),D.a.createElement(\"div\",null,D.a.createElement(t,{className:\"example\",getConfigs:n,language:r,value:Object($.I)(e)}))}return null}(Object($.o)(z,L,W,V?o:void 0),O,m);return D.a.createElement(\"tr\",{className:\"response \"+(p||\"\"),\"data-code\":c},D.a.createElement(\"td\",{className:\"response-col_status\"},c),D.a.createElement(\"td\",{className:\"response-col_description\"},D.a.createElement(\"div\",{className:\"response-col_description__inner\"},D.a.createElement(T,{source:l.get(\"description\")})),x&&E.size?M()(e=E.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(A,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),xKey:r,xVal:o})})):null,w&&l.get(\"content\")?D.a.createElement(\"section\",{className:\"response-controls\"},D.a.createElement(\"div\",{className:Nt()(\"response-control-media-type\",{\"response-control-media-type--accept-controller\":y})},D.a.createElement(\"small\",{className:\"response-control-media-type__title\"},\"Media type\"),D.a.createElement(P,{value:this.state.responseContentType,contentTypes:l.get(\"content\")?l.get(\"content\").keySeq():Object(B.Seq)(),onChange:this._onContentTypeChange,ariaLabel:\"Media Type\"}),y?D.a.createElement(\"small\",{className:\"response-control-media-type__accept-message\"},\"Controls \",D.a.createElement(\"code\",null,\"Accept\"),\" header.\"):null),U?D.a.createElement(\"div\",{className:\"response-control-examples\"},D.a.createElement(\"small\",{className:\"response-control-examples__title\"},\"Examples\"),D.a.createElement(N,{examples:U,currentExampleKey:this.getTargetExamplesKey(),onSelect:function(e){return b.setActiveExamplesMember({name:e,pathMethod:[i,s],contextType:\"responses\",contextName:c})},showLabels:!1})):null):null,G||n?D.a.createElement(j,{specPath:r,getComponent:d,getConfigs:m,specSelectors:v,schema:Object($.i)(n),example:G,includeReadOnly:!0}):null,w&&U?D.a.createElement(R,{example:U.get(this.getTargetExamplesKey(),Object(B.Map)({})),getComponent:d,getConfigs:m,omitValue:!0}):null,S?D.a.createElement(k,{headers:S,getComponent:d}):null),w?D.a.createElement(\"td\",{className:\"response-col_links\"},C?M()(t=C.toSeq().entrySeq()).call(t,(function(e){var t=gt()(e,2),n=t[0],r=t[1];return D.a.createElement(I,{key:n,name:n,link:r,getComponent:d})})):D.a.createElement(\"i\",null,\"No links\")):null)}}]),n}(D.a.Component);y()(Rt,\"defaultProps\",{response:Object(B.fromJS)({}),onContentTypeChange:function(){}});var Dt=function(e){var t=e.xKey,n=e.xVal;return D.a.createElement(\"div\",{className:\"response__extension\"},t,\": \",String(n))},Lt=n(541),Bt=n.n(Lt),Ft=n(542),Ut=n.n(Ft),qt=n(357),zt=n.n(qt),Vt=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"state\",{parsedContent:null}),y()(ve()(r),\"updateParsedContent\",(function(e){var t=r.props.content;if(e!==t)if(t&&t instanceof Blob){var n=new FileReader;n.onload=function(){r.setState({parsedContent:n.result})},n.readAsText(t)}else r.setState({parsedContent:t.toString()})})),r}return x()(n,[{key:\"componentDidMount\",value:function(){this.updateParsedContent(null)}},{key:\"componentDidUpdate\",value:function(e){this.updateParsedContent(e.content)}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.content,o=n.contentType,a=n.url,i=n.headers,s=void 0===i?{}:i,u=n.getConfigs,c=n.getComponent,l=this.state.parsedContent,p=c(\"highlightCode\"),f=\"response_\"+(new Date).getTime();if(a=a||\"\",/^application\\/octet-stream/i.test(o)||s[\"Content-Disposition\"]&&/attachment/i.test(s[\"Content-Disposition\"])||s[\"content-disposition\"]&&/attachment/i.test(s[\"content-disposition\"])||s[\"Content-Description\"]&&/File Transfer/i.test(s[\"Content-Description\"])||s[\"content-description\"]&&/File Transfer/i.test(s[\"content-description\"]))if(\"Blob\"in window){var h=o||\"text/html\",m=r instanceof Blob?r:new Blob([r],{type:h}),v=at.a.createObjectURL(m),g=[h,a.substr(Bt()(a).call(a,\"/\")+1),v].join(\":\"),y=s[\"content-disposition\"]||s[\"Content-Disposition\"];if(void 0!==y){var b=Object($.h)(y);null!==b&&(g=b)}t=H.a.navigator&&H.a.navigator.msSaveOrOpenBlob?D.a.createElement(\"div\",null,D.a.createElement(\"a\",{href:v,onClick:function(){return H.a.navigator.msSaveOrOpenBlob(m,g)}},\"Download file\")):D.a.createElement(\"div\",null,D.a.createElement(\"a\",{href:v,download:g},\"Download file\"))}else t=D.a.createElement(\"pre\",{className:\"microlight\"},\"Download headers detected but your browser does not support downloading binary via XHR (Blob).\");else if(/json/i.test(o)){var _=null;Object(Mt.a)(r)&&(_=\"json\");try{e=d()(JSON.parse(r),null,\"  \")}catch(t){e=\"can't parse JSON.  Raw result:\\n\\n\"+r}t=D.a.createElement(p,{language:_,downloadable:!0,fileName:\"\".concat(f,\".json\"),value:e,getConfigs:u,canCopy:!0})}else/xml/i.test(o)?(e=Ut()(r,{textNodesOnSameLine:!0,indentor:\"  \"}),t=D.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".xml\"),value:e,getConfigs:u,canCopy:!0})):t=\"text/html\"===zt()(o)||/text\\/plain/.test(o)?D.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".html\"),value:r,getConfigs:u,canCopy:!0}):\"text/csv\"===zt()(o)||/text\\/csv/.test(o)?D.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".csv\"),value:r,getConfigs:u,canCopy:!0}):/^image\\//i.test(o)?$e()(o).call(o,\"svg\")?D.a.createElement(\"div\",null,\" \",r,\" \"):D.a.createElement(\"img\",{className:\"full-width\",src:at.a.createObjectURL(r)}):/^audio\\//i.test(o)?D.a.createElement(\"pre\",{className:\"microlight\"},D.a.createElement(\"audio\",{controls:!0},D.a.createElement(\"source\",{src:a,type:o}))):\"string\"==typeof r?D.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".txt\"),value:r,getConfigs:u,canCopy:!0}):r.size>0?l?D.a.createElement(\"div\",null,D.a.createElement(\"p\",{className:\"i\"},\"Unrecognized response type; displaying content as text.\"),D.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".txt\"),value:l,getConfigs:u,canCopy:!0})):D.a.createElement(\"p\",{className:\"i\"},\"Unrecognized response type; unable to display.\"):null;return t?D.a.createElement(\"div\",null,D.a.createElement(\"h5\",null,\"Response body\"),t):null}}]),n}(D.a.PureComponent),Wt=n(14),Ht=n.n(Wt),$t=n(211),Jt=n.n($t),Kt=function(e){ye()(n,e);var t=_e()(n);function n(e){var r;return _()(this,n),r=t.call(this,e),y()(ve()(r),\"onChange\",(function(e,t,n){var o=r.props;(0,o.specActions.changeParamByIdentity)(o.onChangeKey,e,t,n)})),y()(ve()(r),\"onChangeConsumesWrapper\",(function(e){var t=r.props;(0,t.specActions.changeConsumesValue)(t.onChangeKey,e)})),y()(ve()(r),\"toggleTab\",(function(e){return\"parameters\"===e?r.setState({parametersVisible:!0,callbackVisible:!1}):\"callbacks\"===e?r.setState({callbackVisible:!0,parametersVisible:!1}):void 0})),y()(ve()(r),\"onChangeMediaType\",(function(e){var t=e.value,n=e.pathMethod,o=r.props,a=o.specActions,i=o.oas3Selectors,s=o.oas3Actions,u=i.hasUserEditedBody.apply(i,Ht()(n)),c=i.shouldRetainRequestBodyValue.apply(i,Ht()(n));s.setRequestContentType({value:t,pathMethod:n}),s.initRequestBodyValidateError({pathMethod:n}),u||(c||s.setRequestBodyValue({value:void 0,pathMethod:n}),a.clearResponse.apply(a,Ht()(n)),a.clearRequest.apply(a,Ht()(n)),a.clearValidateParams(n))})),r.state={callbackVisible:!1,parametersVisible:!0},r}return x()(n,[{key:\"render\",value:function(){var e,t,n=this,r=this.props,o=r.onTryoutClick,a=r.parameters,i=r.allowTryItOut,s=r.tryItOutEnabled,c=r.specPath,l=r.fn,p=r.getComponent,f=r.getConfigs,h=r.specSelectors,d=r.specActions,m=r.pathMethod,v=r.oas3Actions,g=r.oas3Selectors,y=r.operation,b=p(\"parameterRow\"),_=p(\"TryItOutButton\"),w=p(\"contentType\"),x=p(\"Callbacks\",!0),E=p(\"RequestBody\",!0),S=s&&i,C=h.isOAS3(),A=y.get(\"requestBody\"),k=P()(e=Jt()(P()(a).call(a,(function(e,t){var n,r=t.get(\"in\");return null!==(n=e[r])&&void 0!==n||(e[r]=[]),e[r].push(t),e}),{}))).call(e,(function(e,t){return u()(e).call(e,t)}),[]);return D.a.createElement(\"div\",{className:\"opblock-section\"},D.a.createElement(\"div\",{className:\"opblock-section-header\"},C?D.a.createElement(\"div\",{className:\"tab-header\"},D.a.createElement(\"div\",{onClick:function(){return n.toggleTab(\"parameters\")},className:\"tab-item \".concat(this.state.parametersVisible&&\"active\")},D.a.createElement(\"h4\",{className:\"opblock-title\"},D.a.createElement(\"span\",null,\"Parameters\"))),y.get(\"callbacks\")?D.a.createElement(\"div\",{onClick:function(){return n.toggleTab(\"callbacks\")},className:\"tab-item \".concat(this.state.callbackVisible&&\"active\")},D.a.createElement(\"h4\",{className:\"opblock-title\"},D.a.createElement(\"span\",null,\"Callbacks\"))):null):D.a.createElement(\"div\",{className:\"tab-header\"},D.a.createElement(\"h4\",{className:\"opblock-title\"},\"Parameters\")),i?D.a.createElement(_,{isOAS3:h.isOAS3(),hasUserEditedBody:g.hasUserEditedBody.apply(g,Ht()(m)),enabled:s,onCancelClick:this.props.onCancelClick,onTryoutClick:o,onResetClick:function(){return v.setRequestBodyValue({value:void 0,pathMethod:m})}}):null),this.state.parametersVisible?D.a.createElement(\"div\",{className:\"parameters-container\"},k.length?D.a.createElement(\"div\",{className:\"table-container\"},D.a.createElement(\"table\",{className:\"parameters\"},D.a.createElement(\"thead\",null,D.a.createElement(\"tr\",null,D.a.createElement(\"th\",{className:\"col_header parameters-col_name\"},\"Name\"),D.a.createElement(\"th\",{className:\"col_header parameters-col_description\"},\"Description\"))),D.a.createElement(\"tbody\",null,M()(k).call(k,(function(e,t){var r;return D.a.createElement(b,{fn:l,specPath:c.push(t.toString()),getComponent:p,getConfigs:f,rawParam:e,param:h.parameterWithMetaByIdentity(m,e),key:u()(r=\"\".concat(e.get(\"in\"),\".\")).call(r,e.get(\"name\")),onChange:n.onChange,onChangeConsumes:n.onChangeConsumesWrapper,specSelectors:h,specActions:d,oas3Actions:v,oas3Selectors:g,pathMethod:m,isExecute:S})}))))):D.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},D.a.createElement(\"p\",null,\"No parameters\"))):null,this.state.callbackVisible?D.a.createElement(\"div\",{className:\"callbacks-container opblock-description-wrapper\"},D.a.createElement(x,{callbacks:Object(B.Map)(y.get(\"callbacks\")),specPath:O()(c).call(c,0,-1).push(\"callbacks\")})):null,C&&A&&this.state.parametersVisible&&D.a.createElement(\"div\",{className:\"opblock-section opblock-section-request-body\"},D.a.createElement(\"div\",{className:\"opblock-section-header\"},D.a.createElement(\"h4\",{className:\"opblock-title parameter__name \".concat(A.get(\"required\")&&\"required\")},\"Request body\"),D.a.createElement(\"label\",null,D.a.createElement(w,{value:g.requestContentType.apply(g,Ht()(m)),contentTypes:A.get(\"content\",Object(B.List)()).keySeq(),onChange:function(e){n.onChangeMediaType({value:e,pathMethod:m})},className:\"body-param-content-type\",ariaLabel:\"Request content type\"}))),D.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},D.a.createElement(E,{setRetainRequestBodyValueFlag:function(e){return v.setRetainRequestBodyValueFlag({value:e,pathMethod:m})},userHasEditedBody:g.hasUserEditedBody.apply(g,Ht()(m)),specPath:O()(c).call(c,0,-1).push(\"requestBody\"),requestBody:A,requestBodyValue:g.requestBodyValue.apply(g,Ht()(m)),requestBodyInclusionSetting:g.requestBodyInclusionSetting.apply(g,Ht()(m)),requestBodyErrors:g.requestBodyErrors.apply(g,Ht()(m)),isExecute:S,getConfigs:f,activeExamplesKey:g.activeExamplesMember.apply(g,u()(t=Ht()(m)).call(t,[\"requestBody\",\"requestBody\"])),updateActiveExamplesKey:function(e){n.props.oas3Actions.setActiveExamplesMember({name:e,pathMethod:n.props.pathMethod,contextType:\"requestBody\",contextName:\"requestBody\"})},onChange:function(e,t){if(t){var n=g.requestBodyValue.apply(g,Ht()(m)),r=B.Map.isMap(n)?n:Object(B.Map)();return v.setRequestBodyValue({pathMethod:m,value:r.setIn(t,e)})}v.setRequestBodyValue({value:e,pathMethod:m})},onChangeIncludeEmpty:function(e,t){v.setRequestBodyInclusion({pathMethod:m,value:t,name:e})},contentType:g.requestContentType.apply(g,Ht()(m))}))))}}]),n}(R.Component);y()(Kt,\"defaultProps\",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,tryItOutEnabled:!1,allowTryItOut:!0,onChangeKey:[],specPath:[]});var Yt=function(e){var t=e.xKey,n=e.xVal;return D.a.createElement(\"div\",{className:\"parameter__extension\"},t,\": \",String(n))},Gt={onChange:function(){},isIncludedOptions:{}},Zt=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onCheckboxChange\",(function(e){(0,r.props.onChange)(e.target.checked)})),r}return x()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.isIncludedOptions,n=e.onChange,r=t.shouldDispatchInit,o=t.defaultValue;r&&n(o)}},{key:\"render\",value:function(){var e=this.props,t=e.isIncluded,n=e.isDisabled;return D.a.createElement(\"div\",null,D.a.createElement(\"label\",{className:Nt()(\"parameter__empty_value_toggle\",{disabled:n})},D.a.createElement(\"input\",{type:\"checkbox\",disabled:n,checked:!n&&t,onChange:this.onCheckboxChange}),\"Send empty value\"))}}]),n}(R.Component);y()(Zt,\"defaultProps\",Gt);var Xt=n(149),Qt=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;return _()(this,n),o=t.call(this,e,r),y()(ve()(o),\"onChangeWrapper\",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=o.props,r=n.onChange,a=n.rawParam;return r(a,\"\"===e||e&&0===e.size?null:e,t)})),y()(ve()(o),\"_onExampleSelect\",(function(e){o.props.oas3Actions.setActiveExamplesMember({name:e,pathMethod:o.props.pathMethod,contextType:\"parameters\",contextName:o.getParamKey()})})),y()(ve()(o),\"onChangeIncludeEmpty\",(function(e){var t=o.props,n=t.specActions,r=t.param,a=t.pathMethod,i=r.get(\"name\"),s=r.get(\"in\");return n.updateEmptyParamInclusion(a,i,s,e)})),y()(ve()(o),\"setDefaultValue\",(function(){var e=o.props,t=e.specSelectors,n=e.pathMethod,r=e.rawParam,a=e.oas3Selectors,i=t.parameterWithMetaByIdentity(n,r)||Object(B.Map)(),s=Object(Xt.a)(i,{isOAS3:t.isOAS3()}).schema,c=i.get(\"content\",Object(B.Map)()).keySeq().first(),l=s?Object($.o)(s.toJS(),c,{includeWriteOnly:!0}):null;if(i&&void 0===i.get(\"value\")&&\"body\"!==i.get(\"in\")){var p;if(t.isSwagger2())p=void 0!==i.get(\"x-example\")?i.get(\"x-example\"):void 0!==i.getIn([\"schema\",\"example\"])?i.getIn([\"schema\",\"example\"]):s&&s.getIn([\"default\"]);else if(t.isOAS3()){var f,h=a.activeExamplesMember.apply(a,u()(f=Ht()(n)).call(f,[\"parameters\",o.getParamKey()]));p=void 0!==i.getIn([\"examples\",h,\"value\"])?i.getIn([\"examples\",h,\"value\"]):void 0!==i.getIn([\"content\",c,\"example\"])?i.getIn([\"content\",c,\"example\"]):void 0!==i.get(\"example\")?i.get(\"example\"):void 0!==(s&&s.get(\"example\"))?s&&s.get(\"example\"):void 0!==(s&&s.get(\"default\"))?s&&s.get(\"default\"):i.get(\"default\")}void 0===p||B.List.isList(p)||(p=Object($.I)(p)),void 0!==p?o.onChangeWrapper(p):s&&\"object\"===s.get(\"type\")&&l&&!i.get(\"examples\")&&o.onChangeWrapper(B.List.isList(l)?l:Object($.I)(l))}})),o.setDefaultValue(),o}return x()(n,[{key:\"componentWillReceiveProps\",value:function(e){var t,n=e.specSelectors,r=e.pathMethod,o=e.rawParam,a=n.isOAS3(),i=n.parameterWithMetaByIdentity(r,o)||new B.Map;if(i=i.isEmpty()?o:i,a){var s=Object(Xt.a)(i,{isOAS3:a}).schema;t=s?s.get(\"enum\"):void 0}else t=i?i.get(\"enum\"):void 0;var u,c=i?i.get(\"value\"):void 0;void 0!==c?u=c:o.get(\"required\")&&t&&t.size&&(u=t.first()),void 0!==u&&u!==c&&this.onChangeWrapper(Object($.w)(u)),this.setDefaultValue()}},{key:\"getParamKey\",value:function(){var e,t=this.props.param;return t?u()(e=\"\".concat(t.get(\"name\"),\"-\")).call(e,t.get(\"in\")):null}},{key:\"render\",value:function(){var e,t,n,r,o=this.props,a=o.param,i=o.rawParam,s=o.getComponent,c=o.getConfigs,l=o.isExecute,p=o.fn,f=o.onChangeConsumes,h=o.specSelectors,d=o.pathMethod,m=o.specPath,v=o.oas3Selectors,g=h.isOAS3(),y=c(),b=y.showExtensions,_=y.showCommonExtensions;if(a||(a=i),!i)return null;var w,x,E,S,C=s(\"JsonSchemaForm\"),A=s(\"ParamBody\"),k=a.get(\"in\"),O=\"body\"!==k?null:D.a.createElement(A,{getComponent:s,getConfigs:c,fn:p,param:a,consumes:h.consumesOptionsFor(d),consumesValue:h.contentTypeValues(d).get(\"requestContentType\"),onChange:this.onChangeWrapper,onChangeConsumes:f,isExecute:l,specSelectors:h,pathMethod:d}),j=s(\"modelExample\"),T=s(\"Markdown\",!0),I=s(\"ParameterExt\"),P=s(\"ParameterIncludeEmpty\"),N=s(\"ExamplesSelectValueRetainer\"),R=s(\"Example\"),L=Object(Xt.a)(a,{isOAS3:g}).schema,F=h.parameterWithMetaByIdentity(d,i)||Object(B.Map)(),U=L?L.get(\"format\"):null,q=L?L.get(\"type\"):null,z=L?L.getIn([\"items\",\"type\"]):null,V=\"formData\"===k,W=\"FormData\"in H.a,J=a.get(\"required\"),K=F?F.get(\"value\"):\"\",Y=_?Object($.l)(L):null,G=b?Object($.m)(a):null,Z=!1;return void 0!==a&&L&&(w=L.get(\"items\")),void 0!==w?(x=w.get(\"enum\"),E=w.get(\"default\")):L&&(x=L.get(\"enum\")),x&&x.size&&x.size>0&&(Z=!0),void 0!==a&&(L&&(E=L.get(\"default\")),void 0===E&&(E=a.get(\"default\")),void 0===(S=a.get(\"example\"))&&(S=a.get(\"x-example\"))),D.a.createElement(\"tr\",{\"data-param-name\":a.get(\"name\"),\"data-param-in\":a.get(\"in\")},D.a.createElement(\"td\",{className:\"parameters-col_name\"},D.a.createElement(\"div\",{className:J?\"parameter__name required\":\"parameter__name\"},a.get(\"name\"),J?D.a.createElement(\"span\",null,\" *\"):null),D.a.createElement(\"div\",{className:\"parameter__type\"},q,z&&\"[\".concat(z,\"]\"),U&&D.a.createElement(\"span\",{className:\"prop-format\"},\"($\",U,\")\")),D.a.createElement(\"div\",{className:\"parameter__deprecated\"},g&&a.get(\"deprecated\")?\"deprecated\":null),D.a.createElement(\"div\",{className:\"parameter__in\"},\"(\",a.get(\"in\"),\")\"),_&&Y.size?M()(e=Y.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(I,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),xKey:r,xVal:o})})):null,b&&G.size?M()(t=G.entrySeq()).call(t,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(I,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),xKey:r,xVal:o})})):null),D.a.createElement(\"td\",{className:\"parameters-col_description\"},a.get(\"description\")?D.a.createElement(T,{source:a.get(\"description\")}):null,!O&&l||!Z?null:D.a.createElement(T,{className:\"parameter__enum\",source:\"<i>Available values</i> : \"+M()(x).call(x,(function(e){return e})).toArray().join(\", \")}),!O&&l||void 0===E?null:D.a.createElement(T,{className:\"parameter__default\",source:\"<i>Default value</i> : \"+E}),!O&&l||void 0===S?null:D.a.createElement(T,{source:\"<i>Example</i> : \"+S}),V&&!W&&D.a.createElement(\"div\",null,\"Error: your browser does not support FormData\"),g&&a.get(\"examples\")?D.a.createElement(\"section\",{className:\"parameter-controls\"},D.a.createElement(N,{examples:a.get(\"examples\"),onSelect:this._onExampleSelect,updateValue:this.onChangeWrapper,getComponent:s,defaultToFirstExample:!0,currentKey:v.activeExamplesMember.apply(v,u()(n=Ht()(d)).call(n,[\"parameters\",this.getParamKey()])),currentUserInputValue:K})):null,O?null:D.a.createElement(C,{fn:p,getComponent:s,value:K,required:J,disabled:!l,description:a.get(\"name\"),onChange:this.onChangeWrapper,errors:F.get(\"errors\"),schema:L}),O&&L?D.a.createElement(j,{getComponent:s,specPath:m.push(\"schema\"),getConfigs:c,isExecute:l,specSelectors:h,schema:L,example:O,includeWriteOnly:!0}):null,!O&&l&&a.get(\"allowEmptyValue\")?D.a.createElement(P,{onChange:this.onChangeIncludeEmpty,isIncluded:h.parameterInclusionSettingFor(d,a.get(\"name\"),a.get(\"in\")),isDisabled:!Object($.q)(K)}):null,g&&a.get(\"examples\")?D.a.createElement(R,{example:a.getIn([\"examples\",v.activeExamplesMember.apply(v,u()(r=Ht()(d)).call(r,[\"parameters\",this.getParamKey()]))]),getComponent:s,getConfigs:c}):null))}}]),n}(R.Component),en=n(23),tn=n.n(en),nn=n(218),rn=n.n(nn),on=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"handleValidateParameters\",(function(){var e=r.props,t=e.specSelectors,n=e.specActions,o=e.path,a=e.method;return n.validateParams([o,a]),t.validateBeforeExecute([o,a])})),y()(ve()(r),\"handleValidateRequestBody\",(function(){var e=r.props,t=e.path,n=e.method,o=e.specSelectors,a=e.oas3Selectors,i=e.oas3Actions,s={missingBodyValue:!1,missingRequiredKeys:[]};i.clearRequestBodyValidateError({path:t,method:n});var u=o.getOAS3RequiredRequestBodyContentType([t,n]),c=a.requestBodyValue(t,n),l=a.validateBeforeExecute([t,n]),p=a.requestContentType(t,n);if(!l)return s.missingBodyValue=!0,i.setRequestBodyValidateError({path:t,method:n,validationErrors:s}),!1;if(!u)return!0;var f=a.validateShallowRequired({oas3RequiredRequestBodyContentType:u,oas3RequestContentType:p,oas3RequestBodyValue:c});return!f||f.length<1||(tn()(f).call(f,(function(e){s.missingRequiredKeys.push(e)})),i.setRequestBodyValidateError({path:t,method:n,validationErrors:s}),!1)})),y()(ve()(r),\"handleValidationResultPass\",(function(){var e=r.props,t=e.specActions,n=e.operation,o=e.path,a=e.method;r.props.onExecute&&r.props.onExecute(),t.execute({operation:n,path:o,method:a})})),y()(ve()(r),\"handleValidationResultFail\",(function(){var e=r.props,t=e.specActions,n=e.path,o=e.method;t.clearValidateParams([n,o]),rn()((function(){t.validateParams([n,o])}),40)})),y()(ve()(r),\"handleValidationResult\",(function(e){e?r.handleValidationResultPass():r.handleValidationResultFail()})),y()(ve()(r),\"onClick\",(function(){var e=r.handleValidateParameters(),t=r.handleValidateRequestBody(),n=e&&t;r.handleValidationResult(n)})),y()(ve()(r),\"onChangeProducesWrapper\",(function(e){return r.props.specActions.changeProducesValue([r.props.path,r.props.method],e)})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props.disabled;return D.a.createElement(\"button\",{className:\"btn execute opblock-control__btn\",onClick:this.onClick,disabled:e},\"Execute\")}}]),n}(R.Component),an=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.headers,r=t.getComponent,o=r(\"Property\"),a=r(\"Markdown\",!0);return n&&n.size?D.a.createElement(\"div\",{className:\"headers-wrapper\"},D.a.createElement(\"h4\",{className:\"headers__title\"},\"Headers:\"),D.a.createElement(\"table\",{className:\"headers\"},D.a.createElement(\"thead\",null,D.a.createElement(\"tr\",{className:\"header-row\"},D.a.createElement(\"th\",{className:\"header-col\"},\"Name\"),D.a.createElement(\"th\",{className:\"header-col\"},\"Description\"),D.a.createElement(\"th\",{className:\"header-col\"},\"Type\"))),D.a.createElement(\"tbody\",null,M()(e=n.entrySeq()).call(e,(function(e){var t=gt()(e,2),n=t[0],r=t[1];if(!F.a.Map.isMap(r))return null;var i=r.get(\"description\"),s=r.getIn([\"schema\"])?r.getIn([\"schema\",\"type\"]):r.getIn([\"type\"]),u=r.getIn([\"schema\",\"example\"]);return D.a.createElement(\"tr\",{key:n},D.a.createElement(\"td\",{className:\"header-col\"},n),D.a.createElement(\"td\",{className:\"header-col\"},i?D.a.createElement(a,{source:i}):null),D.a.createElement(\"td\",{className:\"header-col\"},s,\" \",u?D.a.createElement(o,{propKey:\"Example\",propVal:u,propClass:\"header-example\"}):null))})).toArray()))):null}}]),n}(D.a.Component),sn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.editorActions,n=e.errSelectors,r=e.layoutSelectors,o=e.layoutActions,a=(0,e.getComponent)(\"Collapse\");if(t&&t.jumpToLine)var i=t.jumpToLine;var s=n.allErrors(),u=l()(s).call(s,(function(e){return\"thrown\"===e.get(\"type\")||\"error\"===e.get(\"level\")}));if(!u||u.count()<1)return null;var c=r.isShown([\"errorPane\"],!0),p=u.sortBy((function(e){return e.get(\"line\")}));return D.a.createElement(\"pre\",{className:\"errors-wrapper\"},D.a.createElement(\"hgroup\",{className:\"error\"},D.a.createElement(\"h4\",{className:\"errors__title\"},\"Errors\"),D.a.createElement(\"button\",{className:\"btn errors__clear-btn\",onClick:function(){return o.show([\"errorPane\"],!c)}},c?\"Hide\":\"Show\")),D.a.createElement(a,{isOpened:c,animated:!0},D.a.createElement(\"div\",{className:\"errors\"},M()(p).call(p,(function(e,t){var n=e.get(\"type\");return\"thrown\"===n||\"auth\"===n?D.a.createElement(un,{key:t,error:e.get(\"error\")||e,jumpToLine:i}):\"spec\"===n?D.a.createElement(cn,{key:t,error:e,jumpToLine:i}):void 0})))))}}]),n}(D.a.Component),un=function(e){var t=e.error,n=e.jumpToLine;if(!t)return null;var r=t.get(\"line\");return D.a.createElement(\"div\",{className:\"error-wrapper\"},t?D.a.createElement(\"div\",null,D.a.createElement(\"h4\",null,t.get(\"source\")&&t.get(\"level\")?ln(t.get(\"source\"))+\" \"+t.get(\"level\"):\"\",t.get(\"path\")?D.a.createElement(\"small\",null,\" at \",t.get(\"path\")):null),D.a.createElement(\"span\",{className:\"message thrown\"},t.get(\"message\")),D.a.createElement(\"div\",{className:\"error-line\"},r&&n?D.a.createElement(\"a\",{onClick:S()(n).call(n,null,r)},\"Jump to line \",r):null)):null)},cn=function(e){var t=e.error,n=e.jumpToLine,r=null;return t.get(\"path\")?r=B.List.isList(t.get(\"path\"))?D.a.createElement(\"small\",null,\"at \",t.get(\"path\").join(\".\")):D.a.createElement(\"small\",null,\"at \",t.get(\"path\")):t.get(\"line\")&&!n&&(r=D.a.createElement(\"small\",null,\"on line \",t.get(\"line\"))),D.a.createElement(\"div\",{className:\"error-wrapper\"},t?D.a.createElement(\"div\",null,D.a.createElement(\"h4\",null,ln(t.get(\"source\"))+\" \"+t.get(\"level\"),\" \",r),D.a.createElement(\"span\",{className:\"message\"},t.get(\"message\")),D.a.createElement(\"div\",{className:\"error-line\"},n?D.a.createElement(\"a\",{onClick:S()(n).call(n,null,t.get(\"line\"))},\"Jump to line \",t.get(\"line\")):null)):null)};function ln(e){var t;return M()(t=(e||\"\").split(\" \")).call(t,(function(e){return e[0].toUpperCase()+O()(e).call(e,1)})).join(\" \")}un.defaultProps={jumpToLine:null};var pn=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onChangeWrapper\",(function(e){return r.props.onChange(e.target.value)})),r}return x()(n,[{key:\"componentDidMount\",value:function(){this.props.contentTypes&&this.props.onChange(this.props.contentTypes.first())}},{key:\"componentWillReceiveProps\",value:function(e){var t;e.contentTypes&&e.contentTypes.size&&($e()(t=e.contentTypes).call(t,e.value)||e.onChange(e.contentTypes.first()))}},{key:\"render\",value:function(){var e=this.props,t=e.ariaControls,n=e.ariaLabel,r=e.className,o=e.contentTypes,a=e.controlId,i=e.value;return o&&o.size?D.a.createElement(\"div\",{className:\"content-type-wrapper \"+(r||\"\")},D.a.createElement(\"select\",{\"aria-controls\":t,\"aria-label\":n,className:\"content-type\",id:a,onChange:this.onChangeWrapper,value:i||\"\"},M()(o).call(o,(function(e){return D.a.createElement(\"option\",{key:e,value:e},e)})).toArray())):null}}]),n}(D.a.Component);y()(pn,\"defaultProps\",{onChange:function(){},value:null,contentTypes:Object(B.fromJS)([\"application/json\"])});var fn=n(28),hn=n.n(fn),dn=n(53),mn=n.n(dn),vn=n(101),gn=n.n(vn),yn=[\"fullscreen\",\"full\"],bn=[\"hide\",\"keepContents\",\"mobile\",\"tablet\",\"desktop\",\"large\"];function _n(){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return gn()(e=l()(n).call(n,(function(e){return!!e})).join(\" \")).call(e)}var wn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.fullscreen,n=e.full,r=mn()(e,yn);if(t)return D.a.createElement(\"section\",r);var o=\"swagger-container\"+(n?\"-full\":\"\");return D.a.createElement(\"section\",hn()({},r,{className:_n(r.className,o)}))}}]),n}(D.a.Component),xn={mobile:\"\",tablet:\"-tablet\",desktop:\"-desktop\",large:\"-hd\"},En=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.hide,r=t.keepContents,o=(t.mobile,t.tablet,t.desktop,t.large,mn()(t,bn));if(n&&!r)return D.a.createElement(\"span\",null);var a=[];for(var i in xn)if(Object.prototype.hasOwnProperty.call(xn,i)){var s=xn[i];if(i in this.props){var c=this.props[i];if(c<1){a.push(\"none\"+s);continue}a.push(\"block\"+s),a.push(\"col-\"+c+s)}}n&&a.push(\"hidden\");var l=_n.apply(void 0,u()(e=[o.className]).call(e,a));return D.a.createElement(\"section\",hn()({},o,{className:l}))}}]),n}(D.a.Component),Sn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){return D.a.createElement(\"div\",hn()({},this.props,{className:_n(this.props.className,\"wrapper\")}))}}]),n}(D.a.Component),Cn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){return D.a.createElement(\"button\",hn()({},this.props,{className:_n(this.props.className,\"button\")}))}}]),n}(D.a.Component);y()(Cn,\"defaultProps\",{className:\"\"});var An=function(e){return D.a.createElement(\"textarea\",e)},kn=function(e){return D.a.createElement(\"input\",e)},On=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o,a;return _()(this,n),o=t.call(this,e,r),y()(ve()(o),\"onChange\",(function(e){var t,n,r=o.props,a=r.onChange,i=r.multiple,s=O()([]).call(e.target.options);i?t=M()(n=l()(s).call(s,(function(e){return e.selected}))).call(n,(function(e){return e.value})):t=e.target.value;o.setState({value:t}),a&&a(t)})),a=e.value?e.value:e.multiple?[\"\"]:\"\",o.state={value:a},o}return x()(n,[{key:\"componentWillReceiveProps\",value:function(e){e.value!==this.props.value&&this.setState({value:e.value})}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.allowedValues,o=n.multiple,a=n.allowEmptyValue,i=n.disabled,s=(null===(e=this.state.value)||void 0===e||null===(t=e.toJS)||void 0===t?void 0:t.call(e))||this.state.value;return D.a.createElement(\"select\",{className:this.props.className,multiple:o,value:s,onChange:this.onChange,disabled:i},a?D.a.createElement(\"option\",{value:\"\"},\"--\"):null,M()(r).call(r,(function(e,t){return D.a.createElement(\"option\",{key:t,value:String(e)},String(e))})))}}]),n}(D.a.Component);y()(On,\"defaultProps\",{multiple:!1,allowEmptyValue:!0});var jn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){return D.a.createElement(\"a\",hn()({},this.props,{rel:\"noopener noreferrer\",className:_n(this.props.className,\"link\")}))}}]),n}(D.a.Component),Tn=function(e){var t=e.children;return D.a.createElement(\"div\",{className:\"no-margin\"},\" \",t,\" \")},In=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"renderNotAnimated\",value:function(){return this.props.isOpened?D.a.createElement(Tn,null,this.props.children):D.a.createElement(\"noscript\",null)}},{key:\"render\",value:function(){var e=this.props,t=e.animated,n=e.isOpened,r=e.children;return t?(r=n?r:null,D.a.createElement(Tn,null,r)):this.renderNotAnimated()}}]),n}(D.a.Component);y()(In,\"defaultProps\",{isOpened:!1,animated:!1});var Pn=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r,o;_()(this,n);for(var a=arguments.length,i=new Array(a),s=0;s<a;s++)i[s]=arguments[s];return(o=t.call.apply(t,u()(e=[this]).call(e,i))).setTagShown=S()(r=o._setTagShown).call(r,ve()(o)),o}return x()(n,[{key:\"_setTagShown\",value:function(e,t){this.props.layoutActions.show(e,t)}},{key:\"showOp\",value:function(e,t){this.props.layoutActions.show(e,t)}},{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.layoutSelectors,r=e.layoutActions,o=e.getComponent,a=t.taggedOperations(),i=o(\"Collapse\");return D.a.createElement(\"div\",null,D.a.createElement(\"h4\",{className:\"overview-title\"},\"Overview\"),M()(a).call(a,(function(e,t){var o=e.get(\"operations\"),a=[\"overview-tags\",t],s=n.isShown(a,!0);return D.a.createElement(\"div\",{key:\"overview-\"+t},D.a.createElement(\"h4\",{onClick:function(){return r.show(a,!s)},className:\"link overview-tag\"},\" \",s?\"-\":\"+\",t),D.a.createElement(i,{isOpened:s,animated:!0},M()(o).call(o,(function(e){var t=e.toObject(),o=t.path,a=t.method,i=t.id,s=\"operations\",u=i,c=n.isShown([s,u]);return D.a.createElement(Nn,{key:i,path:o,method:a,id:o+\"-\"+a,shown:c,showOpId:u,showOpIdPrefix:s,href:\"#operation-\".concat(u),onClick:r.show})})).toArray()))})).toArray(),a.size<1&&D.a.createElement(\"h3\",null,\" No operations defined in spec! \"))}}]),n}(D.a.Component),Nn=function(e){ye()(n,e);var t=_e()(n);function n(e){var r,o;return _()(this,n),(o=t.call(this,e)).onClick=S()(r=o._onClick).call(r,ve()(o)),o}return x()(n,[{key:\"_onClick\",value:function(){var e=this.props,t=e.showOpId,n=e.showOpIdPrefix;(0,e.onClick)([n,t],!e.shown)}},{key:\"render\",value:function(){var e=this.props,t=e.id,n=e.method,r=e.shown,o=e.href;return D.a.createElement(jn,{href:o,onClick:this.onClick,className:\"block opblock-link \".concat(r?\"shown\":\"\")},D.a.createElement(\"div\",null,D.a.createElement(\"small\",{className:\"bold-label-\".concat(n)},n.toUpperCase()),D.a.createElement(\"span\",{className:\"bold-label\"},t)))}}]),n}(D.a.Component),Mn=[\"value\",\"defaultValue\",\"initialValue\"],Rn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"componentDidMount\",value:function(){this.props.initialValue&&(this.inputRef.value=this.props.initialValue)}},{key:\"render\",value:function(){var e=this,t=this.props,n=(t.value,t.defaultValue,t.initialValue,mn()(t,Mn));return D.a.createElement(\"input\",hn()({},n,{ref:function(t){return e.inputRef=t}}))}}]),n}(D.a.Component),Dn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.host,n=e.basePath;return D.a.createElement(\"pre\",{className:\"base-url\"},\"[ Base URL: \",t,n,\" ]\")}}]),n}(D.a.Component),Ln=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.data,n=e.getComponent,r=e.selectedServer,o=e.url,a=t.get(\"name\")||\"the developer\",i=ut(t.get(\"url\"),o,{selectedServer:r}),s=t.get(\"email\"),u=n(\"Link\");return D.a.createElement(\"div\",{className:\"info__contact\"},i&&D.a.createElement(\"div\",null,D.a.createElement(u,{href:Object($.F)(i),target:\"_blank\"},a,\" - Website\")),s&&D.a.createElement(u,{href:Object($.F)(\"mailto:\".concat(s))},i?\"Send email to \".concat(a):\"Contact \".concat(a)))}}]),n}(D.a.Component),Bn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.license,n=e.getComponent,r=e.selectedServer,o=e.url,a=n(\"Link\"),i=t.get(\"name\")||\"License\",s=ut(t.get(\"url\"),o,{selectedServer:r});return D.a.createElement(\"div\",{className:\"info__license\"},s?D.a.createElement(a,{target:\"_blank\",href:Object($.F)(s)},i):D.a.createElement(\"span\",null,i))}}]),n}(D.a.Component),Fn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.url,n=(0,e.getComponent)(\"Link\");return D.a.createElement(n,{target:\"_blank\",href:Object($.F)(t)},D.a.createElement(\"span\",{className:\"url\"},\" \",t))}}]),n}(D.a.PureComponent),Un=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.info,n=e.url,r=e.host,o=e.basePath,a=e.getComponent,i=e.externalDocs,s=e.selectedServer,u=e.url,c=t.get(\"version\"),l=t.get(\"description\"),p=t.get(\"title\"),f=ut(t.get(\"termsOfService\"),u,{selectedServer:s}),h=t.get(\"contact\"),d=t.get(\"license\"),m=ut(i&&i.get(\"url\"),u,{selectedServer:s}),v=i&&i.get(\"description\"),g=a(\"Markdown\",!0),y=a(\"Link\"),b=a(\"VersionStamp\"),_=a(\"InfoUrl\"),w=a(\"InfoBasePath\");return D.a.createElement(\"div\",{className:\"info\"},D.a.createElement(\"hgroup\",{className:\"main\"},D.a.createElement(\"h2\",{className:\"title\"},p,c&&D.a.createElement(b,{version:c})),r||o?D.a.createElement(w,{host:r,basePath:o}):null,n&&D.a.createElement(_,{getComponent:a,url:n})),D.a.createElement(\"div\",{className:\"description\"},D.a.createElement(g,{source:l})),f&&D.a.createElement(\"div\",{className:\"info__tos\"},D.a.createElement(y,{target:\"_blank\",href:Object($.F)(f)},\"Terms of service\")),h&&h.size?D.a.createElement(Ln,{getComponent:a,data:h,selectedServer:s,url:n}):null,d&&d.size?D.a.createElement(Bn,{getComponent:a,license:d,selectedServer:s,url:n}):null,m?D.a.createElement(y,{className:\"info__extdocs\",target:\"_blank\",href:Object($.F)(m)},v||m):null)}}]),n}(D.a.Component),qn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.getComponent,r=e.oas3Selectors,o=t.info(),a=t.url(),i=t.basePath(),s=t.host(),u=t.externalDocs(),c=r.selectedServer(),l=n(\"info\");return D.a.createElement(\"div\",null,o&&o.count()?D.a.createElement(l,{info:o,url:a,host:s,basePath:i,externalDocs:u,getComponent:n,selectedServer:c}):null)}}]),n}(D.a.Component),zn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){return null}}]),n}(D.a.Component),Vn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){return D.a.createElement(\"div\",{className:\"footer\"})}}]),n}(D.a.Component),Wn=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onFilterChange\",(function(e){var t=e.target.value;r.props.layoutActions.updateFilter(t)})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.layoutSelectors,r=(0,e.getComponent)(\"Col\"),o=\"loading\"===t.loadingStatus(),a=\"failed\"===t.loadingStatus(),i=n.currentFilter(),s=[\"operation-filter-input\"];return a&&s.push(\"failed\"),o&&s.push(\"loading\"),D.a.createElement(\"div\",null,null===i||!1===i||\"false\"===i?null:D.a.createElement(\"div\",{className:\"filter-container\"},D.a.createElement(r,{className:\"filter wrapper\",mobile:12},D.a.createElement(\"input\",{className:s.join(\" \"),placeholder:\"Filter by tag\",type:\"text\",onChange:this.onFilterChange,value:!0===i||\"true\"===i?\"\":i,disabled:o}))))}}]),n}(D.a.Component),Hn=Function.prototype,$n=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;return _()(this,n),o=t.call(this,e,r),y()(ve()(o),\"updateValues\",(function(e){var t=e.param,n=e.isExecute,r=e.consumesValue,a=void 0===r?\"\":r,i=/xml/i.test(a),s=/json/i.test(a),u=i?t.get(\"value_xml\"):t.get(\"value\");if(void 0!==u){var c=!u&&s?\"{}\":u;o.setState({value:c}),o.onChange(c,{isXml:i,isEditBox:n})}else i?o.onChange(o.sample(\"xml\"),{isXml:i,isEditBox:n}):o.onChange(o.sample(),{isEditBox:n})})),y()(ve()(o),\"sample\",(function(e){var t=o.props,n=t.param,r=(0,t.fn.inferSchema)(n.toJS());return Object($.o)(r,e,{includeWriteOnly:!0})})),y()(ve()(o),\"onChange\",(function(e,t){var n=t.isEditBox,r=t.isXml;o.setState({value:e,isEditBox:n}),o._onChange(e,r)})),y()(ve()(o),\"_onChange\",(function(e,t){(o.props.onChange||Hn)(e,t)})),y()(ve()(o),\"handleOnChange\",(function(e){var t=o.props.consumesValue,n=/xml/i.test(t),r=e.target.value;o.onChange(r,{isXml:n})})),y()(ve()(o),\"toggleIsEditBox\",(function(){return o.setState((function(e){return{isEditBox:!e.isEditBox}}))})),o.state={isEditBox:!1,value:\"\"},o}return x()(n,[{key:\"componentDidMount\",value:function(){this.updateValues.call(this,this.props)}},{key:\"componentWillReceiveProps\",value:function(e){this.updateValues.call(this,e)}},{key:\"render\",value:function(){var e=this.props,t=e.onChangeConsumes,r=e.param,o=e.isExecute,a=e.specSelectors,i=e.pathMethod,s=e.getConfigs,u=e.getComponent,c=u(\"Button\"),l=u(\"TextArea\"),p=u(\"highlightCode\"),f=u(\"contentType\"),h=(a?a.parameterWithMetaByIdentity(i,r):r).get(\"errors\",Object(B.List)()),d=a.contentTypeValues(i).get(\"requestContentType\"),m=this.props.consumes&&this.props.consumes.size?this.props.consumes:n.defaultProp.consumes,v=this.state,g=v.value,y=v.isEditBox,b=null;return Object(Mt.a)(g)&&(b=\"json\"),D.a.createElement(\"div\",{className:\"body-param\",\"data-param-name\":r.get(\"name\"),\"data-param-in\":r.get(\"in\")},y&&o?D.a.createElement(l,{className:\"body-param__text\"+(h.count()?\" invalid\":\"\"),value:g,onChange:this.handleOnChange}):g&&D.a.createElement(p,{className:\"body-param__example\",language:b,getConfigs:s,value:g}),D.a.createElement(\"div\",{className:\"body-param-options\"},o?D.a.createElement(\"div\",{className:\"body-param-edit\"},D.a.createElement(c,{className:y?\"btn cancel body-param__example-edit\":\"btn edit body-param__example-edit\",onClick:this.toggleIsEditBox},y?\"Cancel\":\"Edit\")):null,D.a.createElement(\"label\",{htmlFor:\"\"},D.a.createElement(\"span\",null,\"Parameter content type\"),D.a.createElement(f,{value:d,contentTypes:m,onChange:t,className:\"body-param-content-type\",ariaLabel:\"Parameter content type\"}))))}}]),n}(R.PureComponent);y()($n,\"defaultProp\",{consumes:Object(B.fromJS)([\"application/json\"]),param:Object(B.fromJS)({}),onChange:Hn,onChangeConsumes:Hn});var Jn=n(169),Kn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.request,n=e.getConfigs,r=Object(Jn.requestSnippetGenerator_curl_bash)(t),o=n(),a=xt()(o,\"syntaxHighlight.activated\")?D.a.createElement(_t.a,{language:\"bash\",className:\"curl microlight\",onWheel:this.preventYScrollingBeyondElement,style:Object(_t.b)(xt()(o,\"syntaxHighlight.theme\"))},r):D.a.createElement(\"textarea\",{readOnly:!0,className:\"curl\",value:r});return D.a.createElement(\"div\",{className:\"curl-command\"},D.a.createElement(\"h4\",null,\"Curl\"),D.a.createElement(\"div\",{className:\"copy-to-clipboard\"},D.a.createElement(Ct.CopyToClipboard,{text:r},D.a.createElement(\"button\",null))),D.a.createElement(\"div\",null,a))}}]),n}(D.a.Component),Yn=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onChange\",(function(e){r.setScheme(e.target.value)})),y()(ve()(r),\"setScheme\",(function(e){var t=r.props,n=t.path,o=t.method;t.specActions.setScheme(e,n,o)})),r}return x()(n,[{key:\"componentWillMount\",value:function(){var e=this.props.schemes;this.setScheme(e.first())}},{key:\"componentWillReceiveProps\",value:function(e){var t;this.props.currentScheme&&$e()(t=e.schemes).call(t,this.props.currentScheme)||this.setScheme(e.schemes.first())}},{key:\"render\",value:function(){var e,t=this.props,n=t.schemes,r=t.currentScheme;return D.a.createElement(\"label\",{htmlFor:\"schemes\"},D.a.createElement(\"span\",{className:\"schemes-title\"},\"Schemes\"),D.a.createElement(\"select\",{onChange:this.onChange,value:r},M()(e=n.valueSeq()).call(e,(function(e){return D.a.createElement(\"option\",{value:e,key:e},e)})).toArray()))}}]),n}(D.a.Component),Gn=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specActions,n=e.specSelectors,r=e.getComponent,o=n.operationScheme(),a=n.schemes(),i=r(\"schemes\");return a&&a.size?D.a.createElement(i,{currentScheme:o,schemes:a,specActions:t}):null}}]),n}(D.a.Component),Zn=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;_()(this,n),o=t.call(this,e,r),y()(ve()(o),\"toggleCollapsed\",(function(){o.props.onToggle&&o.props.onToggle(o.props.modelName,!o.state.expanded),o.setState({expanded:!o.state.expanded})})),y()(ve()(o),\"onLoad\",(function(e){if(e&&o.props.layoutSelectors){var t=o.props.layoutSelectors.getScrollToKey();F.a.is(t,o.props.specPath)&&o.toggleCollapsed(),o.props.layoutActions.readyToScroll(o.props.specPath,e.parentElement)}}));var a=o.props,i=a.expanded,s=a.collapsedContent;return o.state={expanded:i,collapsedContent:s||n.defaultProps.collapsedContent},o}return x()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.hideSelfOnExpand,n=e.expanded,r=e.modelName;t&&n&&this.props.onToggle(r,n)}},{key:\"componentWillReceiveProps\",value:function(e){this.props.expanded!==e.expanded&&this.setState({expanded:e.expanded})}},{key:\"render\",value:function(){var e=this.props,t=e.title,n=e.classes;return this.state.expanded&&this.props.hideSelfOnExpand?D.a.createElement(\"span\",{className:n||\"\"},this.props.children):D.a.createElement(\"span\",{className:n||\"\",ref:this.onLoad},D.a.createElement(\"button\",{\"aria-expanded\":this.state.expanded,className:\"model-box-control\",onClick:this.toggleCollapsed},t&&D.a.createElement(\"span\",{className:\"pointer\"},t),D.a.createElement(\"span\",{className:\"model-toggle\"+(this.state.expanded?\"\":\" collapsed\")}),!this.state.expanded&&D.a.createElement(\"span\",null,this.state.collapsedContent)),this.state.expanded&&this.props.children)}}]),n}(R.Component);y()(Zn,\"defaultProps\",{collapsedContent:\"{...}\",expanded:!1,title:null,onToggle:function(){},hideSelfOnExpand:!1,specPath:F.a.List([])});var Xn=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;_()(this,n),o=t.call(this,e,r),y()(ve()(o),\"activeTab\",(function(e){var t=e.target.dataset.name;o.setState({activeTab:t})}));var a=o.props,i=a.getConfigs,s=a.isExecute,u=i().defaultModelRendering,c=u;return\"example\"!==u&&\"model\"!==u&&(c=\"example\"),s&&(c=\"example\"),o.state={activeTab:c},o}return x()(n,[{key:\"componentWillReceiveProps\",value:function(e){e.isExecute&&!this.props.isExecute&&this.props.example&&this.setState({activeTab:\"example\"})}},{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.specSelectors,r=e.schema,o=e.example,a=e.isExecute,i=e.getConfigs,s=e.specPath,u=e.includeReadOnly,c=e.includeWriteOnly,l=i().defaultModelExpandDepth,p=t(\"ModelWrapper\"),f=t(\"highlightCode\"),h=n.isOAS3();return D.a.createElement(\"div\",{className:\"model-example\"},D.a.createElement(\"ul\",{className:\"tab\"},D.a.createElement(\"li\",{className:\"tabitem\"+(\"example\"===this.state.activeTab?\" active\":\"\")},D.a.createElement(\"a\",{className:\"tablinks\",\"data-name\":\"example\",onClick:this.activeTab},a?\"Edit Value\":\"Example Value\")),r?D.a.createElement(\"li\",{className:\"tabitem\"+(\"model\"===this.state.activeTab?\" active\":\"\")},D.a.createElement(\"a\",{className:\"tablinks\"+(a?\" inactive\":\"\"),\"data-name\":\"model\",onClick:this.activeTab},h?\"Schema\":\"Model\")):null),D.a.createElement(\"div\",null,\"example\"===this.state.activeTab?o||D.a.createElement(f,{value:\"(no example available)\",getConfigs:i}):null,\"model\"===this.state.activeTab&&D.a.createElement(p,{schema:r,getComponent:t,getConfigs:i,specSelectors:n,expandDepth:l,specPath:s,includeReadOnly:u,includeWriteOnly:c})))}}]),n}(D.a.Component),Qn=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onToggle\",(function(e,t){r.props.layoutActions&&r.props.layoutActions.show(r.props.fullPath,t)})),r}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.getComponent,r=t.getConfigs,o=n(\"Model\");return this.props.layoutSelectors&&(e=this.props.layoutSelectors.isShown(this.props.fullPath)),D.a.createElement(\"div\",{className:\"model-box\"},D.a.createElement(o,hn()({},this.props,{getConfigs:r,expanded:e,depth:1,onToggle:this.onToggle,expandDepth:this.props.expandDepth||0})))}}]),n}(R.Component),er=n(222),tr=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"getSchemaBasePath\",(function(){return r.props.specSelectors.isOAS3()?[\"components\",\"schemas\"]:[\"definitions\"]})),y()(ve()(r),\"getCollapsedContent\",(function(){return\" \"})),y()(ve()(r),\"handleToggle\",(function(e,t){var n,o;(r.props.layoutActions.show(u()(n=[]).call(n,Ht()(r.getSchemaBasePath()),[e]),t),t)&&r.props.specActions.requestResolvedSubtree(u()(o=[]).call(o,Ht()(r.getSchemaBasePath()),[e]))})),y()(ve()(r),\"onLoadModels\",(function(e){e&&r.props.layoutActions.readyToScroll(r.getSchemaBasePath(),e)})),y()(ve()(r),\"onLoadModel\",(function(e){if(e){var t,n=e.getAttribute(\"data-name\");r.props.layoutActions.readyToScroll(u()(t=[]).call(t,Ht()(r.getSchemaBasePath()),[n]),e)}})),r}return x()(n,[{key:\"render\",value:function(){var e,t=this,n=this.props,r=n.specSelectors,o=n.getComponent,a=n.layoutSelectors,i=n.layoutActions,s=n.getConfigs,c=r.definitions(),l=s(),p=l.docExpansion,f=l.defaultModelsExpandDepth;if(!c.size||f<0)return null;var h=this.getSchemaBasePath(),d=a.isShown(h,f>0&&\"none\"!==p),m=r.isOAS3(),v=o(\"ModelWrapper\"),g=o(\"Collapse\"),y=o(\"ModelCollapse\"),b=o(\"JumpToPath\");return D.a.createElement(\"section\",{className:d?\"models is-open\":\"models\",ref:this.onLoadModels},D.a.createElement(\"h4\",null,D.a.createElement(\"button\",{\"aria-expanded\":d,className:\"models-control\",onClick:function(){return i.show(h,!d)}},D.a.createElement(\"span\",null,m?\"Schemas\":\"Models\"),D.a.createElement(\"svg\",{width:\"20\",height:\"20\",\"aria-hidden\":\"true\",focusable:\"false\"},D.a.createElement(\"use\",{xlinkHref:d?\"#large-arrow-up\":\"#large-arrow-down\"})))),D.a.createElement(g,{isOpened:d},M()(e=c.entrySeq()).call(e,(function(e){var n,c=gt()(e,1)[0],l=u()(n=[]).call(n,Ht()(h),[c]),p=F.a.List(l),d=r.specResolvedSubtree(l),m=r.specJson().getIn(l),g=B.Map.isMap(d)?d:F.a.Map(),_=B.Map.isMap(m)?m:F.a.Map(),w=g.get(\"title\")||_.get(\"title\")||c,x=a.isShown(l,!1);x&&0===g.size&&_.size>0&&t.props.specActions.requestResolvedSubtree(l);var E=D.a.createElement(v,{name:c,expandDepth:f,schema:g||F.a.Map(),displayName:w,fullPath:l,specPath:p,getComponent:o,specSelectors:r,getConfigs:s,layoutSelectors:a,layoutActions:i,includeReadOnly:!0,includeWriteOnly:!0}),S=D.a.createElement(\"span\",{className:\"model-box\"},D.a.createElement(\"span\",{className:\"model model-title\"},w));return D.a.createElement(\"div\",{id:\"model-\".concat(c),className:\"model-container\",key:\"models-section-\".concat(c),\"data-name\":c,ref:t.onLoadModel},D.a.createElement(\"span\",{className:\"models-jump-to-path\"},D.a.createElement(b,{specPath:p})),D.a.createElement(y,{classes:\"model-box\",collapsedContent:t.getCollapsedContent(c),onToggle:t.handleToggle,title:S,displayName:w,modelName:c,specPath:p,layoutSelectors:a,layoutActions:i,hideSelfOnExpand:!0,expanded:f>0&&x},E))})).toArray()))}}]),n}(R.Component),nr=function(e){var t=e.value,n=(0,e.getComponent)(\"ModelCollapse\"),r=D.a.createElement(\"span\",null,\"Array [ \",t.count(),\" ]\");return D.a.createElement(\"span\",{className:\"prop-enum\"},\"Enum:\",D.a.createElement(\"br\",null),D.a.createElement(n,{collapsedContent:r},\"[ \",t.join(\", \"),\" ]\"))},rr=[\"schema\",\"name\",\"displayName\",\"isRef\",\"getComponent\",\"getConfigs\",\"depth\",\"onToggle\",\"expanded\",\"specPath\"],or=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t,n,r,o=this.props,a=o.schema,i=o.name,s=o.displayName,c=o.isRef,p=o.getComponent,f=o.getConfigs,h=o.depth,m=o.onToggle,v=o.expanded,g=o.specPath,y=mn()(o,rr),b=y.specSelectors,_=y.expandDepth,w=y.includeReadOnly,x=y.includeWriteOnly,E=b.isOAS3;if(!a)return null;var S=f().showExtensions,C=a.get(\"description\"),A=a.get(\"properties\"),k=a.get(\"additionalProperties\"),j=a.get(\"title\")||s||i,T=a.get(\"required\"),I=l()(a).call(a,(function(e,t){var n;return-1!==xe()(n=[\"maxProperties\",\"minProperties\",\"nullable\",\"example\"]).call(n,t)})),P=a.get(\"deprecated\"),N=p(\"JumpToPath\",!0),R=p(\"Markdown\",!0),L=p(\"Model\"),F=p(\"ModelCollapse\"),U=p(\"Property\"),q=function(){return D.a.createElement(\"span\",{className:\"model-jump-to-path\"},D.a.createElement(N,{specPath:g}))},z=D.a.createElement(\"span\",null,D.a.createElement(\"span\",null,\"{\"),\"...\",D.a.createElement(\"span\",null,\"}\"),c?D.a.createElement(q,null):\"\"),V=b.isOAS3()?a.get(\"anyOf\"):null,W=b.isOAS3()?a.get(\"oneOf\"):null,H=b.isOAS3()?a.get(\"not\"):null,$=j&&D.a.createElement(\"span\",{className:\"model-title\"},c&&a.get(\"$$ref\")&&D.a.createElement(\"span\",{className:\"model-hint\"},a.get(\"$$ref\")),D.a.createElement(\"span\",{className:\"model-title__text\"},j));return D.a.createElement(\"span\",{className:\"model\"},D.a.createElement(F,{modelName:i,title:$,onToggle:m,expanded:!!v||h<=_,collapsedContent:z},D.a.createElement(\"span\",{className:\"brace-open object\"},\"{\"),c?D.a.createElement(q,null):null,D.a.createElement(\"span\",{className:\"inner-object\"},D.a.createElement(\"table\",{className:\"model\"},D.a.createElement(\"tbody\",null,C?D.a.createElement(\"tr\",{className:\"description\"},D.a.createElement(\"td\",null,\"description:\"),D.a.createElement(\"td\",null,D.a.createElement(R,{source:C}))):null,P?D.a.createElement(\"tr\",{className:\"property\"},D.a.createElement(\"td\",null,\"deprecated:\"),D.a.createElement(\"td\",null,\"true\")):null,A&&A.size?M()(e=l()(t=A.entrySeq()).call(t,(function(e){var t=gt()(e,2)[1];return(!t.get(\"readOnly\")||w)&&(!t.get(\"writeOnly\")||x)}))).call(e,(function(e){var t,n,r=gt()(e,2),o=r[0],a=r[1],s=E()&&a.get(\"deprecated\"),c=B.List.isList(T)&&T.contains(o),l=[\"property-row\"];return s&&l.push(\"deprecated\"),c&&l.push(\"required\"),D.a.createElement(\"tr\",{key:o,className:l.join(\" \")},D.a.createElement(\"td\",null,o,c&&D.a.createElement(\"span\",{className:\"star\"},\"*\")),D.a.createElement(\"td\",null,D.a.createElement(L,hn()({key:u()(t=u()(n=\"object-\".concat(i,\"-\")).call(n,o,\"_\")).call(t,a)},y,{required:c,getComponent:p,specPath:g.push(\"properties\",o),getConfigs:f,schema:a,depth:h+1}))))})).toArray():null,S?D.a.createElement(\"tr\",null,D.a.createElement(\"td\",null,\" \")):null,S?M()(n=a.entrySeq()).call(n,(function(e){var t=gt()(e,2),n=t[0],r=t[1];if(\"x-\"===O()(n).call(n,0,2)){var o=r?r.toJS?r.toJS():r:null;return D.a.createElement(\"tr\",{key:n,className:\"extension\"},D.a.createElement(\"td\",null,n),D.a.createElement(\"td\",null,d()(o)))}})).toArray():null,k&&k.size?D.a.createElement(\"tr\",null,D.a.createElement(\"td\",null,\"< * >:\"),D.a.createElement(\"td\",null,D.a.createElement(L,hn()({},y,{required:!1,getComponent:p,specPath:g.push(\"additionalProperties\"),getConfigs:f,schema:k,depth:h+1})))):null,V?D.a.createElement(\"tr\",null,D.a.createElement(\"td\",null,\"anyOf ->\"),D.a.createElement(\"td\",null,M()(V).call(V,(function(e,t){return D.a.createElement(\"div\",{key:t},D.a.createElement(L,hn()({},y,{required:!1,getComponent:p,specPath:g.push(\"anyOf\",t),getConfigs:f,schema:e,depth:h+1})))})))):null,W?D.a.createElement(\"tr\",null,D.a.createElement(\"td\",null,\"oneOf ->\"),D.a.createElement(\"td\",null,M()(W).call(W,(function(e,t){return D.a.createElement(\"div\",{key:t},D.a.createElement(L,hn()({},y,{required:!1,getComponent:p,specPath:g.push(\"oneOf\",t),getConfigs:f,schema:e,depth:h+1})))})))):null,H?D.a.createElement(\"tr\",null,D.a.createElement(\"td\",null,\"not ->\"),D.a.createElement(\"td\",null,D.a.createElement(\"div\",null,D.a.createElement(L,hn()({},y,{required:!1,getComponent:p,specPath:g.push(\"not\"),getConfigs:f,schema:H,depth:h+1}))))):null))),D.a.createElement(\"span\",{className:\"brace-close\"},\"}\")),I.size?M()(r=I.entrySeq()).call(r,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(U,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),propKey:r,propVal:o,propClass:\"property\"})})):null)}}]),n}(R.Component),ar=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.getComponent,r=t.getConfigs,o=t.schema,a=t.depth,i=t.expandDepth,s=t.name,c=t.displayName,p=t.specPath,f=o.get(\"description\"),h=o.get(\"items\"),d=o.get(\"title\")||c||s,m=l()(o).call(o,(function(e,t){var n;return-1===xe()(n=[\"type\",\"items\",\"description\",\"$$ref\"]).call(n,t)})),v=n(\"Markdown\",!0),g=n(\"ModelCollapse\"),y=n(\"Model\"),b=n(\"Property\"),_=d&&D.a.createElement(\"span\",{className:\"model-title\"},D.a.createElement(\"span\",{className:\"model-title__text\"},d));return D.a.createElement(\"span\",{className:\"model\"},D.a.createElement(g,{title:_,expanded:a<=i,collapsedContent:\"[...]\"},\"[\",m.size?M()(e=m.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(b,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),propKey:r,propVal:o,propClass:\"property\"})})):null,f?D.a.createElement(v,{source:f}):m.size?D.a.createElement(\"div\",{className:\"markdown\"}):null,D.a.createElement(\"span\",null,D.a.createElement(y,hn()({},this.props,{getConfigs:r,specPath:p.push(\"items\"),name:null,schema:h,required:!1,depth:a+1}))),\"]\"))}}]),n}(R.Component),ir=\"property primitive\",sr=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e,t,n,r=this.props,o=r.schema,a=r.getComponent,i=r.getConfigs,s=r.name,c=r.displayName,p=r.depth,f=i().showExtensions;if(!o||!o.get)return D.a.createElement(\"div\",null);var h=o.get(\"type\"),d=o.get(\"format\"),m=o.get(\"xml\"),v=o.get(\"enum\"),g=o.get(\"title\")||c||s,y=o.get(\"description\"),b=Object($.m)(o),_=l()(o).call(o,(function(e,t){var n;return-1===xe()(n=[\"enum\",\"type\",\"format\",\"description\",\"$$ref\"]).call(n,t)})).filterNot((function(e,t){return b.has(t)})),w=a(\"Markdown\",!0),x=a(\"EnumModel\"),E=a(\"Property\");return D.a.createElement(\"span\",{className:\"model\"},D.a.createElement(\"span\",{className:\"prop\"},s&&D.a.createElement(\"span\",{className:\"\".concat(1===p&&\"model-title\",\" prop-name\")},g),D.a.createElement(\"span\",{className:\"prop-type\"},h),d&&D.a.createElement(\"span\",{className:\"prop-format\"},\"($\",d,\")\"),_.size?M()(e=_.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(E,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),propKey:r,propVal:o,propClass:ir})})):null,f&&b.size?M()(t=b.entrySeq()).call(t,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(E,{key:u()(t=\"\".concat(r,\"-\")).call(t,o),propKey:r,propVal:o,propClass:ir})})):null,y?D.a.createElement(w,{source:y}):null,m&&m.size?D.a.createElement(\"span\",null,D.a.createElement(\"br\",null),D.a.createElement(\"span\",{className:ir},\"xml:\"),M()(n=m.entrySeq()).call(n,(function(e){var t,n=gt()(e,2),r=n[0],o=n[1];return D.a.createElement(\"span\",{key:u()(t=\"\".concat(r,\"-\")).call(t,o),className:ir},D.a.createElement(\"br\",null),\"   \",r,\": \",String(o))})).toArray()):null,v&&D.a.createElement(x,{value:v,getComponent:a})))}}]),n}(R.Component),ur=function(e){var t=e.propKey,n=e.propVal,r=e.propClass;return D.a.createElement(\"span\",{className:r},D.a.createElement(\"br\",null),t,\": \",String(n))},cr=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.onTryoutClick,n=e.onCancelClick,r=e.onResetClick,o=e.enabled,a=e.hasUserEditedBody,i=e.isOAS3&&a;return D.a.createElement(\"div\",{className:i?\"try-out btn-group\":\"try-out\"},o?D.a.createElement(\"button\",{className:\"btn try-out__btn cancel\",onClick:n},\"Cancel\"):D.a.createElement(\"button\",{className:\"btn try-out__btn\",onClick:t},\"Try it out \"),i&&D.a.createElement(\"button\",{className:\"btn try-out__btn reset\",onClick:r},\"Reset\"))}}]),n}(D.a.Component);y()(cr,\"defaultProps\",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,onResetClick:Function.prototype,enabled:!1,hasUserEditedBody:!1,isOAS3:!1});var lr=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.bypass,n=e.isSwagger2,r=e.isOAS3,o=e.alsoShow;return t?D.a.createElement(\"div\",null,this.props.children):n&&r?D.a.createElement(\"div\",{className:\"version-pragma\"},o,D.a.createElement(\"div\",{className:\"version-pragma__message version-pragma__message--ambiguous\"},D.a.createElement(\"div\",null,D.a.createElement(\"h3\",null,\"Unable to render this definition\"),D.a.createElement(\"p\",null,D.a.createElement(\"code\",null,\"swagger\"),\" and \",D.a.createElement(\"code\",null,\"openapi\"),\" fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields.\"),D.a.createElement(\"p\",null,\"Supported version fields are \",D.a.createElement(\"code\",null,\"swagger: \",'\"2.0\"'),\" and those that match \",D.a.createElement(\"code\",null,\"openapi: 3.0.n\"),\" (for example, \",D.a.createElement(\"code\",null,\"openapi: 3.0.0\"),\").\")))):n||r?D.a.createElement(\"div\",null,this.props.children):D.a.createElement(\"div\",{className:\"version-pragma\"},o,D.a.createElement(\"div\",{className:\"version-pragma__message version-pragma__message--missing\"},D.a.createElement(\"div\",null,D.a.createElement(\"h3\",null,\"Unable to render this definition\"),D.a.createElement(\"p\",null,\"The provided definition does not specify a valid version field.\"),D.a.createElement(\"p\",null,\"Please indicate a valid Swagger or OpenAPI version field. Supported version fields are \",D.a.createElement(\"code\",null,\"swagger: \",'\"2.0\"'),\" and those that match \",D.a.createElement(\"code\",null,\"openapi: 3.0.n\"),\" (for example, \",D.a.createElement(\"code\",null,\"openapi: 3.0.0\"),\").\"))))}}]),n}(D.a.PureComponent);y()(lr,\"defaultProps\",{alsoShow:null,children:null,bypass:!1});var pr=function(e){var t=e.version;return D.a.createElement(\"small\",null,D.a.createElement(\"pre\",{className:\"version\"},\" \",t,\" \"))},fr=function(e){var t=e.enabled,n=e.path,r=e.text;return D.a.createElement(\"a\",{className:\"nostyle\",onClick:t?function(e){return e.preventDefault()}:null,href:t?\"#/\".concat(n):null},D.a.createElement(\"span\",null,r))},hr=function(){return D.a.createElement(\"div\",null,D.a.createElement(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",xmlnsXlink:\"http://www.w3.org/1999/xlink\",className:\"svg-assets\"},D.a.createElement(\"defs\",null,D.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"unlocked\"},D.a.createElement(\"path\",{d:\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"locked\"},D.a.createElement(\"path\",{d:\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"close\"},D.a.createElement(\"path\",{d:\"M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"large-arrow\"},D.a.createElement(\"path\",{d:\"M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"large-arrow-down\"},D.a.createElement(\"path\",{d:\"M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"large-arrow-up\"},D.a.createElement(\"path\",{d:\"M 17.418 14.908 C 17.69 15.176 18.127 15.176 18.397 14.908 C 18.667 14.64 18.668 14.207 18.397 13.939 L 10.489 6.109 C 10.219 5.841 9.782 5.841 9.51 6.109 L 1.602 13.939 C 1.332 14.207 1.332 14.64 1.602 14.908 C 1.873 15.176 2.311 15.176 2.581 14.908 L 10 7.767 L 17.418 14.908 Z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 24 24\",id:\"jump-to\"},D.a.createElement(\"path\",{d:\"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z\"})),D.a.createElement(\"symbol\",{viewBox:\"0 0 24 24\",id:\"expand\"},D.a.createElement(\"path\",{d:\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"})))))},dr=n(221),mr=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.errSelectors,n=e.specSelectors,r=e.getComponent,o=r(\"SvgAssets\"),a=r(\"InfoContainer\",!0),i=r(\"VersionPragmaFilter\"),s=r(\"operations\",!0),u=r(\"Models\",!0),c=r(\"Row\"),l=r(\"Col\"),p=r(\"errors\",!0),f=r(\"ServersContainer\",!0),h=r(\"SchemesContainer\",!0),d=r(\"AuthorizeBtnContainer\",!0),m=r(\"FilterContainer\",!0),v=n.isSwagger2(),g=n.isOAS3(),y=!n.specStr(),b=n.loadingStatus(),_=null;if(\"loading\"===b&&(_=D.a.createElement(\"div\",{className:\"info\"},D.a.createElement(\"div\",{className:\"loading-container\"},D.a.createElement(\"div\",{className:\"loading\"})))),\"failed\"===b&&(_=D.a.createElement(\"div\",{className:\"info\"},D.a.createElement(\"div\",{className:\"loading-container\"},D.a.createElement(\"h4\",{className:\"title\"},\"Failed to load API definition.\"),D.a.createElement(p,null)))),\"failedConfig\"===b){var w=t.lastError(),x=w?w.get(\"message\"):\"\";_=D.a.createElement(\"div\",{className:\"info failed-config\"},D.a.createElement(\"div\",{className:\"loading-container\"},D.a.createElement(\"h4\",{className:\"title\"},\"Failed to load remote configuration.\"),D.a.createElement(\"p\",null,x)))}if(!_&&y&&(_=D.a.createElement(\"h4\",null,\"No API definition provided.\")),_)return D.a.createElement(\"div\",{className:\"swagger-ui\"},D.a.createElement(\"div\",{className:\"loading-container\"},_));var E=n.servers(),S=n.schemes(),C=E&&E.size,A=S&&S.size,k=!!n.securityDefinitions();return D.a.createElement(\"div\",{className:\"swagger-ui\"},D.a.createElement(o,null),D.a.createElement(i,{isSwagger2:v,isOAS3:g,alsoShow:D.a.createElement(p,null)},D.a.createElement(p,null),D.a.createElement(c,{className:\"information-container\"},D.a.createElement(l,{mobile:12},D.a.createElement(a,null))),C||A||k?D.a.createElement(\"div\",{className:\"scheme-container\"},D.a.createElement(l,{className:\"schemes wrapper\",mobile:12},C?D.a.createElement(f,null):null,A?D.a.createElement(h,null):null,k?D.a.createElement(d,null):null)):null,D.a.createElement(m,null),D.a.createElement(c,null,D.a.createElement(l,{mobile:12,desktop:12},D.a.createElement(s,null))),D.a.createElement(c,null,D.a.createElement(l,{mobile:12,desktop:12},D.a.createElement(u,null)))))}}]),n}(D.a.Component),vr=n(358),gr=n.n(vr),yr={value:\"\",onChange:function(){},schema:{},keyName:\"\",required:!1,errors:Object(B.List)()},br=function(e){ye()(n,e);var t=_e()(n);function n(){return _()(this,n),t.apply(this,arguments)}return x()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.dispatchInitialValue,n=e.value,r=e.onChange;t?r(n):!1===t&&r(\"\")}},{key:\"render\",value:function(){var e,t=this.props,n=t.schema,r=t.errors,o=t.value,a=t.onChange,i=t.getComponent,s=t.fn,c=t.disabled,l=n&&n.get?n.get(\"format\"):null,p=n&&n.get?n.get(\"type\"):null,f=function(e){return i(e,!1,{failSilently:!0})},h=p?f(l?u()(e=\"JsonSchema_\".concat(p,\"_\")).call(e,l):\"JsonSchema_\".concat(p)):i(\"JsonSchema_string\");return h||(h=i(\"JsonSchema_string\")),D.a.createElement(h,hn()({},this.props,{errors:r,fn:s,getComponent:i,value:o,onChange:a,schema:n,disabled:c}))}}]),n}(R.Component);y()(br,\"defaultProps\",yr);var _r=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onChange\",(function(e){var t=r.props.schema&&\"file\"===r.props.schema.get(\"type\")?e.target.files[0]:e.target.value;r.props.onChange(t,r.props.keyName)})),y()(ve()(r),\"onEnumChange\",(function(e){return r.props.onChange(e)})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.schema,o=e.errors,a=e.required,i=e.description,s=e.disabled,u=r&&r.get?r.get(\"enum\"):null,c=r&&r.get?r.get(\"format\"):null,l=r&&r.get?r.get(\"type\"):null,p=r&&r.get?r.get(\"in\"):null;if(n||(n=\"\"),o=o.toJS?o.toJS():[],u){var f=t(\"Select\");return D.a.createElement(f,{className:o.length?\"invalid\":\"\",title:o.length?o:\"\",allowedValues:u,value:n,allowEmptyValue:!a,disabled:s,onChange:this.onEnumChange})}var h=s||p&&\"formData\"===p&&!(\"FormData\"in window),d=t(\"Input\");return l&&\"file\"===l?D.a.createElement(d,{type:\"file\",className:o.length?\"invalid\":\"\",title:o.length?o:\"\",onChange:this.onChange,disabled:h}):D.a.createElement(gr.a,{type:c&&\"password\"===c?\"password\":\"text\",className:o.length?\"invalid\":\"\",title:o.length?o:\"\",value:n,minLength:0,debounceTimeout:350,placeholder:i,onChange:this.onChange,disabled:h})}}]),n}(R.Component);y()(_r,\"defaultProps\",yr);var wr=function(e){ye()(n,e);var t=_e()(n);function n(e,r){var o;return _()(this,n),o=t.call(this,e,r),y()(ve()(o),\"onChange\",(function(){o.props.onChange(o.state.value)})),y()(ve()(o),\"onItemChange\",(function(e,t){o.setState((function(n){return{value:n.value.set(t,e)}}),o.onChange)})),y()(ve()(o),\"removeItem\",(function(e){o.setState((function(t){return{value:t.value.delete(e)}}),o.onChange)})),y()(ve()(o),\"addItem\",(function(){var e=kr(o.state.value);o.setState((function(){return{value:e.push(Object($.o)(o.state.schema.get(\"items\"),!1,{includeWriteOnly:!0}))}}),o.onChange)})),y()(ve()(o),\"onEnumChange\",(function(e){o.setState((function(){return{value:e}}),o.onChange)})),o.state={value:kr(e.value),schema:e.schema},o}return x()(n,[{key:\"componentWillReceiveProps\",value:function(e){var t=kr(e.value);t!==this.state.value&&this.setState({value:t}),e.schema!==this.state.schema&&this.setState({schema:e.schema})}},{key:\"render\",value:function(){var e,t=this,n=this.props,r=n.getComponent,o=n.required,a=n.schema,i=n.errors,s=n.fn,c=n.disabled;i=i.toJS?i.toJS():T()(i)?i:[];var p,f,h=l()(i).call(i,(function(e){return\"string\"==typeof e})),d=M()(e=l()(i).call(i,(function(e){return void 0!==e.needRemove}))).call(e,(function(e){return e.error})),m=this.state.value,v=!!(m&&m.count&&m.count()>0),g=a.getIn([\"items\",\"enum\"]),y=a.getIn([\"items\",\"type\"]),b=a.getIn([\"items\",\"format\"]),_=a.get(\"items\"),w=!1,x=\"file\"===y||\"string\"===y&&\"binary\"===b;y&&b?p=r(u()(f=\"JsonSchema_\".concat(y,\"_\")).call(f,b)):\"boolean\"!==y&&\"array\"!==y&&\"object\"!==y||(p=r(\"JsonSchema_\".concat(y)));if(p||x||(w=!0),g){var E=r(\"Select\");return D.a.createElement(E,{className:i.length?\"invalid\":\"\",title:i.length?i:\"\",multiple:!0,value:m,disabled:c,allowedValues:g,allowEmptyValue:!o,onChange:this.onEnumChange})}var S=r(\"Button\");return D.a.createElement(\"div\",{className:\"json-schema-array\"},v?M()(m).call(m,(function(e,n){var o,a=Object(B.fromJS)(Ht()(M()(o=l()(i).call(i,(function(e){return e.index===n}))).call(o,(function(e){return e.error}))));return D.a.createElement(\"div\",{key:n,className:\"json-schema-form-item\"},x?D.a.createElement(Er,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:c,errors:a,getComponent:r}):w?D.a.createElement(xr,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:c,errors:a}):D.a.createElement(p,hn()({},t.props,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:c,errors:a,schema:_,getComponent:r,fn:s})),c?null:D.a.createElement(S,{className:\"btn btn-sm json-schema-form-item-remove \".concat(d.length?\"invalid\":null),title:d.length?d:\"\",onClick:function(){return t.removeItem(n)}},\" - \"))})):null,c?null:D.a.createElement(S,{className:\"btn btn-sm json-schema-form-item-add \".concat(h.length?\"invalid\":null),title:h.length?h:\"\",onClick:this.addItem},\"Add \",y?\"\".concat(y,\" \"):\"\",\"item\"))}}]),n}(R.PureComponent);y()(wr,\"defaultProps\",yr);var xr=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onChange\",(function(e){var t=e.target.value;r.props.onChange(t,r.props.keyName)})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.value,n=e.errors,r=e.description,o=e.disabled;return t||(t=\"\"),n=n.toJS?n.toJS():[],D.a.createElement(gr.a,{type:\"text\",className:n.length?\"invalid\":\"\",title:n.length?n:\"\",value:t,minLength:0,debounceTimeout:350,placeholder:r,onChange:this.onChange,disabled:o})}}]),n}(R.Component);y()(xr,\"defaultProps\",yr);var Er=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onFileChange\",(function(e){var t=e.target.files[0];r.props.onChange(t,r.props.keyName)})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.errors,r=e.disabled,o=t(\"Input\"),a=r||!(\"FormData\"in window);return D.a.createElement(o,{type:\"file\",className:n.length?\"invalid\":\"\",title:n.length?n:\"\",onChange:this.onFileChange,disabled:a})}}]),n}(R.Component);y()(Er,\"defaultProps\",yr);var Sr=function(e){ye()(n,e);var t=_e()(n);function n(){var e,r;_()(this,n);for(var o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return r=t.call.apply(t,u()(e=[this]).call(e,a)),y()(ve()(r),\"onEnumChange\",(function(e){return r.props.onChange(e)})),r}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.errors,o=e.schema,a=e.required,i=e.disabled;r=r.toJS?r.toJS():[];var s=o&&o.get?o.get(\"enum\"):null,u=!s||!a,c=!s&&Object(B.fromJS)([\"true\",\"false\"]),l=t(\"Select\");return D.a.createElement(l,{className:r.length?\"invalid\":\"\",title:r.length?r:\"\",value:String(n),disabled:i,allowedValues:s||c,allowEmptyValue:u,onChange:this.onEnumChange})}}]),n}(R.Component);y()(Sr,\"defaultProps\",yr);var Cr=function(e){return M()(e).call(e,(function(e){var t,n=void 0!==e.propKey?e.propKey:e.index,r=\"string\"==typeof e?e:\"string\"==typeof e.error?e.error:null;if(!n&&r)return r;for(var o=e.error,a=\"/\".concat(e.propKey);\"object\"===i()(o);){var s=void 0!==o.propKey?o.propKey:o.index;if(void 0===s)break;if(a+=\"/\".concat(s),!o.error)break;o=o.error}return u()(t=\"\".concat(a,\": \")).call(t,o)}))},Ar=function(e){ye()(n,e);var t=_e()(n);function n(){var e;return _()(this,n),e=t.call(this),y()(ve()(e),\"onChange\",(function(t){e.props.onChange(t)})),y()(ve()(e),\"handleOnChange\",(function(t){var n=t.target.value;e.onChange(n)})),e}return x()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.errors,o=e.disabled,a=t(\"TextArea\");return r=r.toJS?r.toJS():T()(r)?r:[],D.a.createElement(\"div\",null,D.a.createElement(a,{className:Nt()({invalid:r.length}),title:r.length?Cr(r).join(\", \"):\"\",value:Object($.I)(n),disabled:o,onChange:this.handleOnChange}))}}]),n}(R.PureComponent);function kr(e){return B.List.isList(e)?e:T()(e)?Object(B.fromJS)(e):Object(B.List)()}y()(Ar,\"defaultProps\",yr);var Or=function(){var e={components:{App:Ce,authorizationPopup:Ae,authorizeBtn:ke,AuthorizeBtnContainer:Oe,authorizeOperationBtn:je,auths:Te,AuthItem:Ie,authError:Pe,oauth2:Ye,apiKeyAuth:Ne,basicAuth:Me,clear:Ge,liveResponse:Qe,InitializedInput:Rn,info:Un,InfoContainer:qn,JumpToPath:zn,onlineValidatorBadge:et.a,operations:rt,operation:lt,OperationSummary:ht,OperationSummaryMethod:dt,OperationSummaryPath:mt,highlightCode:At,responses:kt,response:Rt,ResponseExtension:Dt,responseBody:Vt,parameters:Kt,parameterRow:Qt,execute:on,headers:an,errors:sn,contentType:pn,overview:Pn,footer:Vn,FilterContainer:Wn,ParamBody:$n,curl:Kn,schemes:Yn,SchemesContainer:Gn,modelExample:Xn,ModelWrapper:Qn,ModelCollapse:Zn,Model:er.a,Models:tr,EnumModel:nr,ObjectModel:or,ArrayModel:ar,PrimitiveModel:sr,Property:ur,TryItOutButton:cr,Markdown:dr.a,BaseLayout:mr,VersionPragmaFilter:lr,VersionStamp:pr,OperationExt:yt,OperationExtRow:bt,ParameterExt:Yt,ParameterIncludeEmpty:Zt,OperationTag:ct,OperationContainer:Se,DeepLink:fr,InfoUrl:Fn,InfoBasePath:Dn,SvgAssets:hr,Example:Re,ExamplesSelect:Be,ExamplesSelectValueRetainer:Ue}},t={components:r},n={components:o};return[pe.default,ce.default,ie.default,re.default,ne.default,ee.default,te.default,oe.default,e,t,se.default,n,ue.default,le.default,fe.default,he.default,de.default,ae.default]},jr=n(321);function Tr(){return[Or,jr.default]}var Ir=n(342);var Pr=!0,Nr=\"gee40b00\",Mr=\"3.52.0\",Rr=\"ip-172-31-21-173\",Dr=\"Mon, 09 Aug 2021 15:13:17 GMT\";function Lr(e){var t;H.a.versions=H.a.versions||{},H.a.versions.swaggerUi={version:Mr,gitRevision:Nr,gitDirty:Pr,buildTimestamp:Dr,machine:Rr};var n={dom_id:null,domNode:null,spec:{},url:\"\",urls:null,layout:\"BaseLayout\",docExpansion:\"list\",maxDisplayedTags:null,filter:null,validatorUrl:\"https://validator.swagger.io/validator\",oauth2RedirectUrl:u()(t=\"\".concat(window.location.protocol,\"//\")).call(t,window.location.host,\"/oauth2-redirect.html\"),persistAuthorization:!1,configs:{},custom:{},displayOperationId:!1,displayRequestDuration:!1,deepLinking:!1,tryItOutEnabled:!1,requestInterceptor:function(e){return e},responseInterceptor:function(e){return e},showMutatedRequest:!0,defaultModelRendering:\"example\",defaultModelExpandDepth:1,defaultModelsExpandDepth:1,showExtensions:!1,showCommonExtensions:!1,withCredentials:void 0,requestSnippetsEnabled:!1,requestSnippets:{generators:{curl_bash:{title:\"cURL (bash)\",syntax:\"bash\"},curl_powershell:{title:\"cURL (PowerShell)\",syntax:\"powershell\"},curl_cmd:{title:\"cURL (CMD)\",syntax:\"bash\"}},defaultExpanded:!0,languagesMask:null},supportedSubmitMethods:[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\",\"trace\"],presets:[Tr],plugins:[],pluginsOptions:{pluginLoadType:\"legacy\"},initialState:{},fn:{},components:{},syntaxHighlight:{activated:!0,theme:\"agate\"}},r=Object($.C)(),o=e.domNode;delete e.domNode;var a=v()({},n,e,r),s={system:{configs:a.configs},plugins:a.presets,pluginsOptions:a.pluginsOptions,state:v()({layout:{layout:a.layout,filter:l()(a)},spec:{spec:\"\",url:a.url},requestSnippets:a.requestSnippets},a.initialState)};if(a.initialState)for(var c in a.initialState)Object.prototype.hasOwnProperty.call(a.initialState,c)&&void 0===a.initialState[c]&&delete s.state[c];var p=new K(s);p.register([a.plugins,function(){return{fn:a.fn,components:a.components,state:a.state}}]);var h=p.getSystem(),m=function(e){var t=h.specSelectors.getLocalConfig?h.specSelectors.getLocalConfig():{},n=v()({},t,a,e||{},r);if(o&&(n.domNode=o),p.setConfigs(n),h.configsActions.loaded(),null!==e&&(!r.url&&\"object\"===i()(n.spec)&&f()(n.spec).length?(h.specActions.updateUrl(\"\"),h.specActions.updateLoadingStatus(\"success\"),h.specActions.updateSpec(d()(n.spec))):h.specActions.download&&n.url&&!n.urls&&(h.specActions.updateUrl(n.url),h.specActions.download(n.url))),n.domNode)h.render(n.domNode,\"App\");else if(n.dom_id){var s=document.querySelector(n.dom_id);h.render(s,\"App\")}else null===n.dom_id||null===n.domNode||console.error(\"Skipped rendering: no `dom_id` or `domNode` was specified\");return h},g=r.config||a.configUrl;return g&&h.specActions&&h.specActions.getConfigByUrl?(h.specActions.getConfigByUrl({url:g,loadRemoteConfig:!0,requestInterceptor:a.requestInterceptor,responseInterceptor:a.responseInterceptor},m),h):m()}Lr.presets={apis:Tr},Lr.plugins=Ir.default;t.default=Lr}]).default;\n//# sourceMappingURL=swagger-ui-es-bundle.js.map"
  },
  {
    "path": "assembly/assembly-swagger-war/src/main/webapp/swagger-ui-standalone-preset.js",
    "content": "/*! For license information please see swagger-ui-standalone-preset.js.LICENSE.txt */\n!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.SwaggerUIStandalonePreset=e():t.SwaggerUIStandalonePreset=e()}(this,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,\"a\",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p=\"/dist\",n(n.s=233)}([function(t,e,n){t.exports=function(){\"use strict\";var t=Array.prototype.slice;function e(t,e){e&&(t.prototype=Object.create(e.prototype)),t.prototype.constructor=t}function n(t){return u(t)?t:J(t)}function r(t){return s(t)?t:Z(t)}function i(t){return a(t)?t:V(t)}function o(t){return u(t)&&!c(t)?t:X(t)}function u(t){return!(!t||!t[l])}function s(t){return!(!t||!t[p])}function a(t){return!(!t||!t[h])}function c(t){return s(t)||a(t)}function f(t){return!(!t||!t[d])}e(r,n),e(i,n),e(o,n),n.isIterable=u,n.isKeyed=s,n.isIndexed=a,n.isAssociative=c,n.isOrdered=f,n.Keyed=r,n.Indexed=i,n.Set=o;var l=\"@@__IMMUTABLE_ITERABLE__@@\",p=\"@@__IMMUTABLE_KEYED__@@\",h=\"@@__IMMUTABLE_INDEXED__@@\",d=\"@@__IMMUTABLE_ORDERED__@@\",y=\"delete\",v=5,g=1<<v,w=g-1,M={},m={value:!1},_={value:!1};function L(t){return t.value=!1,t}function b(t){t&&(t.value=!0)}function x(){}function j(t,e){e=e||0;for(var n=Math.max(0,t.length-e),r=new Array(n),i=0;i<n;i++)r[i]=t[i+e];return r}function N(t){return void 0===t.size&&(t.size=t.__iterate(D)),t.size}function S(t,e){if(\"number\"!=typeof e){var n=e>>>0;if(\"\"+n!==e||4294967295===n)return NaN;e=n}return e<0?N(t)+e:e}function D(){return!0}function I(t,e,n){return(0===t||void 0!==n&&t<=-n)&&(void 0===e||void 0!==n&&e>=n)}function A(t,e){return T(t,e,0)}function O(t,e){return T(t,e,e)}function T(t,e,n){return void 0===t?n:t<0?Math.max(0,e+t):void 0===e?t:Math.min(e,t)}var C=0,E=1,z=2,k=\"function\"==typeof Symbol&&Symbol.iterator,Y=\"@@iterator\",U=k||Y;function P(t){this.next=t}function R(t,e,n,r){var i=0===t?e:1===t?n:[e,n];return r?r.value=i:r={value:i,done:!1},r}function Q(){return{value:void 0,done:!0}}function F(t){return!!W(t)}function B(t){return t&&\"function\"==typeof t.next}function G(t){var e=W(t);return e&&e.call(t)}function W(t){var e=t&&(k&&t[k]||t[Y]);if(\"function\"==typeof e)return e}function q(t){return t&&\"number\"==typeof t.length}function J(t){return null==t?ut():u(t)?t.toSeq():ct(t)}function Z(t){return null==t?ut().toKeyedSeq():u(t)?s(t)?t.toSeq():t.fromEntrySeq():st(t)}function V(t){return null==t?ut():u(t)?s(t)?t.entrySeq():t.toIndexedSeq():at(t)}function X(t){return(null==t?ut():u(t)?s(t)?t.entrySeq():t:at(t)).toSetSeq()}P.prototype.toString=function(){return\"[Iterator]\"},P.KEYS=C,P.VALUES=E,P.ENTRIES=z,P.prototype.inspect=P.prototype.toSource=function(){return this.toString()},P.prototype[U]=function(){return this},e(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString(\"Seq {\",\"}\")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(t,e){return lt(this,t,e,!0)},J.prototype.__iterator=function(t,e){return pt(this,t,e,!0)},e(Z,J),Z.prototype.toKeyedSeq=function(){return this},e(V,J),V.of=function(){return V(arguments)},V.prototype.toIndexedSeq=function(){return this},V.prototype.toString=function(){return this.__toString(\"Seq [\",\"]\")},V.prototype.__iterate=function(t,e){return lt(this,t,e,!1)},V.prototype.__iterator=function(t,e){return pt(this,t,e,!1)},e(X,J),X.of=function(){return X(arguments)},X.prototype.toSetSeq=function(){return this},J.isSeq=ot,J.Keyed=Z,J.Set=X,J.Indexed=V;var H,K,$,tt=\"@@__IMMUTABLE_SEQ__@@\";function et(t){this._array=t,this.size=t.length}function nt(t){var e=Object.keys(t);this._object=t,this._keys=e,this.size=e.length}function rt(t){this._iterable=t,this.size=t.length||t.size}function it(t){this._iterator=t,this._iteratorCache=[]}function ot(t){return!(!t||!t[tt])}function ut(){return H||(H=new et([]))}function st(t){var e=Array.isArray(t)?new et(t).fromEntrySeq():B(t)?new it(t).fromEntrySeq():F(t)?new rt(t).fromEntrySeq():\"object\"==typeof t?new nt(t):void 0;if(!e)throw new TypeError(\"Expected Array or iterable object of [k, v] entries, or keyed object: \"+t);return e}function at(t){var e=ft(t);if(!e)throw new TypeError(\"Expected Array or iterable object of values: \"+t);return e}function ct(t){var e=ft(t)||\"object\"==typeof t&&new nt(t);if(!e)throw new TypeError(\"Expected Array or iterable object of values, or keyed object: \"+t);return e}function ft(t){return q(t)?new et(t):B(t)?new it(t):F(t)?new rt(t):void 0}function lt(t,e,n,r){var i=t._cache;if(i){for(var o=i.length-1,u=0;u<=o;u++){var s=i[n?o-u:u];if(!1===e(s[1],r?s[0]:u,t))return u+1}return u}return t.__iterateUncached(e,n)}function pt(t,e,n,r){var i=t._cache;if(i){var o=i.length-1,u=0;return new P((function(){var t=i[n?o-u:u];return u++>o?Q():R(e,r?t[0]:u-1,t[1])}))}return t.__iteratorUncached(e,n)}function ht(t,e){return e?dt(e,t,\"\",{\"\":t}):yt(t)}function dt(t,e,n,r){return Array.isArray(e)?t.call(r,n,V(e).map((function(n,r){return dt(t,n,r,e)}))):vt(e)?t.call(r,n,Z(e).map((function(n,r){return dt(t,n,r,e)}))):e}function yt(t){return Array.isArray(t)?V(t).map(yt).toList():vt(t)?Z(t).map(yt).toMap():t}function vt(t){return t&&(t.constructor===Object||void 0===t.constructor)}function gt(t,e){if(t===e||t!=t&&e!=e)return!0;if(!t||!e)return!1;if(\"function\"==typeof t.valueOf&&\"function\"==typeof e.valueOf){if((t=t.valueOf())===(e=e.valueOf())||t!=t&&e!=e)return!0;if(!t||!e)return!1}return!(\"function\"!=typeof t.equals||\"function\"!=typeof e.equals||!t.equals(e))}function wt(t,e){if(t===e)return!0;if(!u(e)||void 0!==t.size&&void 0!==e.size&&t.size!==e.size||void 0!==t.__hash&&void 0!==e.__hash&&t.__hash!==e.__hash||s(t)!==s(e)||a(t)!==a(e)||f(t)!==f(e))return!1;if(0===t.size&&0===e.size)return!0;var n=!c(t);if(f(t)){var r=t.entries();return e.every((function(t,e){var i=r.next().value;return i&&gt(i[1],t)&&(n||gt(i[0],e))}))&&r.next().done}var i=!1;if(void 0===t.size)if(void 0===e.size)\"function\"==typeof t.cacheResult&&t.cacheResult();else{i=!0;var o=t;t=e,e=o}var l=!0,p=e.__iterate((function(e,r){if(n?!t.has(e):i?!gt(e,t.get(r,M)):!gt(t.get(r,M),e))return l=!1,!1}));return l&&t.size===p}function Mt(t,e){if(!(this instanceof Mt))return new Mt(t,e);if(this._value=t,this.size=void 0===e?1/0:Math.max(0,e),0===this.size){if(K)return K;K=this}}function mt(t,e){if(!t)throw new Error(e)}function _t(t,e,n){if(!(this instanceof _t))return new _t(t,e,n);if(mt(0!==n,\"Cannot step a Range by 0\"),t=t||0,void 0===e&&(e=1/0),n=void 0===n?1:Math.abs(n),e<t&&(n=-n),this._start=t,this._end=e,this._step=n,this.size=Math.max(0,Math.ceil((e-t)/n-1)+1),0===this.size){if($)return $;$=this}}function Lt(){throw TypeError(\"Abstract\")}function bt(){}function xt(){}function jt(){}J.prototype[tt]=!0,e(et,V),et.prototype.get=function(t,e){return this.has(t)?this._array[S(this,t)]:e},et.prototype.__iterate=function(t,e){for(var n=this._array,r=n.length-1,i=0;i<=r;i++)if(!1===t(n[e?r-i:i],i,this))return i+1;return i},et.prototype.__iterator=function(t,e){var n=this._array,r=n.length-1,i=0;return new P((function(){return i>r?Q():R(t,i,n[e?r-i++:i++])}))},e(nt,Z),nt.prototype.get=function(t,e){return void 0===e||this.has(t)?this._object[t]:e},nt.prototype.has=function(t){return this._object.hasOwnProperty(t)},nt.prototype.__iterate=function(t,e){for(var n=this._object,r=this._keys,i=r.length-1,o=0;o<=i;o++){var u=r[e?i-o:o];if(!1===t(n[u],u,this))return o+1}return o},nt.prototype.__iterator=function(t,e){var n=this._object,r=this._keys,i=r.length-1,o=0;return new P((function(){var u=r[e?i-o:o];return o++>i?Q():R(t,u,n[u])}))},nt.prototype[d]=!0,e(rt,V),rt.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);var n=G(this._iterable),r=0;if(B(n))for(var i;!(i=n.next()).done&&!1!==t(i.value,r++,this););return r},rt.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var n=G(this._iterable);if(!B(n))return new P(Q);var r=0;return new P((function(){var e=n.next();return e.done?e:R(t,r++,e.value)}))},e(it,V),it.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);for(var n,r=this._iterator,i=this._iteratorCache,o=0;o<i.length;)if(!1===t(i[o],o++,this))return o;for(;!(n=r.next()).done;){var u=n.value;if(i[o]=u,!1===t(u,o++,this))break}return o},it.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var n=this._iterator,r=this._iteratorCache,i=0;return new P((function(){if(i>=r.length){var e=n.next();if(e.done)return e;r[i]=e.value}return R(t,i,r[i++])}))},e(Mt,V),Mt.prototype.toString=function(){return 0===this.size?\"Repeat []\":\"Repeat [ \"+this._value+\" \"+this.size+\" times ]\"},Mt.prototype.get=function(t,e){return this.has(t)?this._value:e},Mt.prototype.includes=function(t){return gt(this._value,t)},Mt.prototype.slice=function(t,e){var n=this.size;return I(t,e,n)?this:new Mt(this._value,O(e,n)-A(t,n))},Mt.prototype.reverse=function(){return this},Mt.prototype.indexOf=function(t){return gt(this._value,t)?0:-1},Mt.prototype.lastIndexOf=function(t){return gt(this._value,t)?this.size:-1},Mt.prototype.__iterate=function(t,e){for(var n=0;n<this.size;n++)if(!1===t(this._value,n,this))return n+1;return n},Mt.prototype.__iterator=function(t,e){var n=this,r=0;return new P((function(){return r<n.size?R(t,r++,n._value):Q()}))},Mt.prototype.equals=function(t){return t instanceof Mt?gt(this._value,t._value):wt(t)},e(_t,V),_t.prototype.toString=function(){return 0===this.size?\"Range []\":\"Range [ \"+this._start+\"...\"+this._end+(1!==this._step?\" by \"+this._step:\"\")+\" ]\"},_t.prototype.get=function(t,e){return this.has(t)?this._start+S(this,t)*this._step:e},_t.prototype.includes=function(t){var e=(t-this._start)/this._step;return e>=0&&e<this.size&&e===Math.floor(e)},_t.prototype.slice=function(t,e){return I(t,e,this.size)?this:(t=A(t,this.size),(e=O(e,this.size))<=t?new _t(0,0):new _t(this.get(t,this._end),this.get(e,this._end),this._step))},_t.prototype.indexOf=function(t){var e=t-this._start;if(e%this._step==0){var n=e/this._step;if(n>=0&&n<this.size)return n}return-1},_t.prototype.lastIndexOf=function(t){return this.indexOf(t)},_t.prototype.__iterate=function(t,e){for(var n=this.size-1,r=this._step,i=e?this._start+n*r:this._start,o=0;o<=n;o++){if(!1===t(i,o,this))return o+1;i+=e?-r:r}return o},_t.prototype.__iterator=function(t,e){var n=this.size-1,r=this._step,i=e?this._start+n*r:this._start,o=0;return new P((function(){var u=i;return i+=e?-r:r,o>n?Q():R(t,o++,u)}))},_t.prototype.equals=function(t){return t instanceof _t?this._start===t._start&&this._end===t._end&&this._step===t._step:wt(this,t)},e(Lt,n),e(bt,Lt),e(xt,Lt),e(jt,Lt),Lt.Keyed=bt,Lt.Indexed=xt,Lt.Set=jt;var Nt=\"function\"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(t,e){var n=65535&(t|=0),r=65535&(e|=0);return n*r+((t>>>16)*r+n*(e>>>16)<<16>>>0)|0};function St(t){return t>>>1&1073741824|3221225471&t}function Dt(t){if(!1===t||null==t)return 0;if(\"function\"==typeof t.valueOf&&(!1===(t=t.valueOf())||null==t))return 0;if(!0===t)return 1;var e=typeof t;if(\"number\"===e){if(t!=t||t===1/0)return 0;var n=0|t;for(n!==t&&(n^=4294967295*t);t>4294967295;)n^=t/=4294967295;return St(n)}if(\"string\"===e)return t.length>Pt?It(t):At(t);if(\"function\"==typeof t.hashCode)return t.hashCode();if(\"object\"===e)return Ot(t);if(\"function\"==typeof t.toString)return At(t.toString());throw new Error(\"Value type \"+e+\" cannot be hashed.\")}function It(t){var e=Ft[t];return void 0===e&&(e=At(t),Qt===Rt&&(Qt=0,Ft={}),Qt++,Ft[t]=e),e}function At(t){for(var e=0,n=0;n<t.length;n++)e=31*e+t.charCodeAt(n)|0;return St(e)}function Ot(t){var e;if(kt&&void 0!==(e=zt.get(t)))return e;if(void 0!==(e=t[Ut]))return e;if(!Ct){if(void 0!==(e=t.propertyIsEnumerable&&t.propertyIsEnumerable[Ut]))return e;if(void 0!==(e=Et(t)))return e}if(e=++Yt,1073741824&Yt&&(Yt=0),kt)zt.set(t,e);else{if(void 0!==Tt&&!1===Tt(t))throw new Error(\"Non-extensible objects are not allowed as keys.\");if(Ct)Object.defineProperty(t,Ut,{enumerable:!1,configurable:!1,writable:!1,value:e});else if(void 0!==t.propertyIsEnumerable&&t.propertyIsEnumerable===t.constructor.prototype.propertyIsEnumerable)t.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},t.propertyIsEnumerable[Ut]=e;else{if(void 0===t.nodeType)throw new Error(\"Unable to set a non-enumerable property on object.\");t[Ut]=e}}return e}var Tt=Object.isExtensible,Ct=function(){try{return Object.defineProperty({},\"@\",{}),!0}catch(t){return!1}}();function Et(t){if(t&&t.nodeType>0)switch(t.nodeType){case 1:return t.uniqueID;case 9:return t.documentElement&&t.documentElement.uniqueID}}var zt,kt=\"function\"==typeof WeakMap;kt&&(zt=new WeakMap);var Yt=0,Ut=\"__immutablehash__\";\"function\"==typeof Symbol&&(Ut=Symbol(Ut));var Pt=16,Rt=255,Qt=0,Ft={};function Bt(t){mt(t!==1/0,\"Cannot perform this action with an infinite size.\")}function Gt(t){return null==t?ie():Wt(t)&&!f(t)?t:ie().withMutations((function(e){var n=r(t);Bt(n.size),n.forEach((function(t,n){return e.set(n,t)}))}))}function Wt(t){return!(!t||!t[Jt])}e(Gt,bt),Gt.of=function(){var e=t.call(arguments,0);return ie().withMutations((function(t){for(var n=0;n<e.length;n+=2){if(n+1>=e.length)throw new Error(\"Missing value for key: \"+e[n]);t.set(e[n],e[n+1])}}))},Gt.prototype.toString=function(){return this.__toString(\"Map {\",\"}\")},Gt.prototype.get=function(t,e){return this._root?this._root.get(0,void 0,t,e):e},Gt.prototype.set=function(t,e){return oe(this,t,e)},Gt.prototype.setIn=function(t,e){return this.updateIn(t,M,(function(){return e}))},Gt.prototype.remove=function(t){return oe(this,t,M)},Gt.prototype.deleteIn=function(t){return this.updateIn(t,(function(){return M}))},Gt.prototype.update=function(t,e,n){return 1===arguments.length?t(this):this.updateIn([t],e,n)},Gt.prototype.updateIn=function(t,e,n){n||(n=e,e=void 0);var r=ve(this,Ln(t),e,n);return r===M?void 0:r},Gt.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):ie()},Gt.prototype.merge=function(){return pe(this,void 0,arguments)},Gt.prototype.mergeWith=function(e){return pe(this,e,t.call(arguments,1))},Gt.prototype.mergeIn=function(e){var n=t.call(arguments,1);return this.updateIn(e,ie(),(function(t){return\"function\"==typeof t.merge?t.merge.apply(t,n):n[n.length-1]}))},Gt.prototype.mergeDeep=function(){return pe(this,he,arguments)},Gt.prototype.mergeDeepWith=function(e){var n=t.call(arguments,1);return pe(this,de(e),n)},Gt.prototype.mergeDeepIn=function(e){var n=t.call(arguments,1);return this.updateIn(e,ie(),(function(t){return\"function\"==typeof t.mergeDeep?t.mergeDeep.apply(t,n):n[n.length-1]}))},Gt.prototype.sort=function(t){return Fe(ln(this,t))},Gt.prototype.sortBy=function(t,e){return Fe(ln(this,e,t))},Gt.prototype.withMutations=function(t){var e=this.asMutable();return t(e),e.wasAltered()?e.__ensureOwner(this.__ownerID):this},Gt.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new x)},Gt.prototype.asImmutable=function(){return this.__ensureOwner()},Gt.prototype.wasAltered=function(){return this.__altered},Gt.prototype.__iterator=function(t,e){return new te(this,t,e)},Gt.prototype.__iterate=function(t,e){var n=this,r=0;return this._root&&this._root.iterate((function(e){return r++,t(e[1],e[0],n)}),e),r},Gt.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?re(this.size,this._root,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Gt.isMap=Wt;var qt,Jt=\"@@__IMMUTABLE_MAP__@@\",Zt=Gt.prototype;function Vt(t,e){this.ownerID=t,this.entries=e}function Xt(t,e,n){this.ownerID=t,this.bitmap=e,this.nodes=n}function Ht(t,e,n){this.ownerID=t,this.count=e,this.nodes=n}function Kt(t,e,n){this.ownerID=t,this.keyHash=e,this.entries=n}function $t(t,e,n){this.ownerID=t,this.keyHash=e,this.entry=n}function te(t,e,n){this._type=e,this._reverse=n,this._stack=t._root&&ne(t._root)}function ee(t,e){return R(t,e[0],e[1])}function ne(t,e){return{node:t,index:0,__prev:e}}function re(t,e,n,r){var i=Object.create(Zt);return i.size=t,i._root=e,i.__ownerID=n,i.__hash=r,i.__altered=!1,i}function ie(){return qt||(qt=re(0))}function oe(t,e,n){var r,i;if(t._root){var o=L(m),u=L(_);if(r=ue(t._root,t.__ownerID,0,void 0,e,n,o,u),!u.value)return t;i=t.size+(o.value?n===M?-1:1:0)}else{if(n===M)return t;i=1,r=new Vt(t.__ownerID,[[e,n]])}return t.__ownerID?(t.size=i,t._root=r,t.__hash=void 0,t.__altered=!0,t):r?re(i,r):ie()}function ue(t,e,n,r,i,o,u,s){return t?t.update(e,n,r,i,o,u,s):o===M?t:(b(s),b(u),new $t(e,r,[i,o]))}function se(t){return t.constructor===$t||t.constructor===Kt}function ae(t,e,n,r,i){if(t.keyHash===r)return new Kt(e,r,[t.entry,i]);var o,u=(0===n?t.keyHash:t.keyHash>>>n)&w,s=(0===n?r:r>>>n)&w;return new Xt(e,1<<u|1<<s,u===s?[ae(t,e,n+v,r,i)]:(o=new $t(e,r,i),u<s?[t,o]:[o,t]))}function ce(t,e,n,r){t||(t=new x);for(var i=new $t(t,Dt(n),[n,r]),o=0;o<e.length;o++){var u=e[o];i=i.update(t,0,void 0,u[0],u[1])}return i}function fe(t,e,n,r){for(var i=0,o=0,u=new Array(n),s=0,a=1,c=e.length;s<c;s++,a<<=1){var f=e[s];void 0!==f&&s!==r&&(i|=a,u[o++]=f)}return new Xt(t,i,u)}function le(t,e,n,r,i){for(var o=0,u=new Array(g),s=0;0!==n;s++,n>>>=1)u[s]=1&n?e[o++]:void 0;return u[r]=i,new Ht(t,o+1,u)}function pe(t,e,n){for(var i=[],o=0;o<n.length;o++){var s=n[o],a=r(s);u(s)||(a=a.map((function(t){return ht(t)}))),i.push(a)}return ye(t,e,i)}function he(t,e,n){return t&&t.mergeDeep&&u(e)?t.mergeDeep(e):gt(t,e)?t:e}function de(t){return function(e,n,r){if(e&&e.mergeDeepWith&&u(n))return e.mergeDeepWith(t,n);var i=t(e,n,r);return gt(e,i)?e:i}}function ye(t,e,n){return 0===(n=n.filter((function(t){return 0!==t.size}))).length?t:0!==t.size||t.__ownerID||1!==n.length?t.withMutations((function(t){for(var r=e?function(n,r){t.update(r,M,(function(t){return t===M?n:e(t,n,r)}))}:function(e,n){t.set(n,e)},i=0;i<n.length;i++)n[i].forEach(r)})):t.constructor(n[0])}function ve(t,e,n,r){var i=t===M,o=e.next();if(o.done){var u=i?n:t,s=r(u);return s===u?t:s}mt(i||t&&t.set,\"invalid keyPath\");var a=o.value,c=i?M:t.get(a,M),f=ve(c,e,n,r);return f===c?t:f===M?t.remove(a):(i?ie():t).set(a,f)}function ge(t){return t=(t=(858993459&(t-=t>>1&1431655765))+(t>>2&858993459))+(t>>4)&252645135,t+=t>>8,127&(t+=t>>16)}function we(t,e,n,r){var i=r?t:j(t);return i[e]=n,i}function Me(t,e,n,r){var i=t.length+1;if(r&&e+1===i)return t[e]=n,t;for(var o=new Array(i),u=0,s=0;s<i;s++)s===e?(o[s]=n,u=-1):o[s]=t[s+u];return o}function me(t,e,n){var r=t.length-1;if(n&&e===r)return t.pop(),t;for(var i=new Array(r),o=0,u=0;u<r;u++)u===e&&(o=1),i[u]=t[u+o];return i}Zt[Jt]=!0,Zt[y]=Zt.remove,Zt.removeIn=Zt.deleteIn,Vt.prototype.get=function(t,e,n,r){for(var i=this.entries,o=0,u=i.length;o<u;o++)if(gt(n,i[o][0]))return i[o][1];return r},Vt.prototype.update=function(t,e,n,r,i,o,u){for(var s=i===M,a=this.entries,c=0,f=a.length;c<f&&!gt(r,a[c][0]);c++);var l=c<f;if(l?a[c][1]===i:s)return this;if(b(u),(s||!l)&&b(o),!s||1!==a.length){if(!l&&!s&&a.length>=_e)return ce(t,a,r,i);var p=t&&t===this.ownerID,h=p?a:j(a);return l?s?c===f-1?h.pop():h[c]=h.pop():h[c]=[r,i]:h.push([r,i]),p?(this.entries=h,this):new Vt(t,h)}},Xt.prototype.get=function(t,e,n,r){void 0===e&&(e=Dt(n));var i=1<<((0===t?e:e>>>t)&w),o=this.bitmap;return 0==(o&i)?r:this.nodes[ge(o&i-1)].get(t+v,e,n,r)},Xt.prototype.update=function(t,e,n,r,i,o,u){void 0===n&&(n=Dt(r));var s=(0===e?n:n>>>e)&w,a=1<<s,c=this.bitmap,f=0!=(c&a);if(!f&&i===M)return this;var l=ge(c&a-1),p=this.nodes,h=f?p[l]:void 0,d=ue(h,t,e+v,n,r,i,o,u);if(d===h)return this;if(!f&&d&&p.length>=Le)return le(t,p,c,s,d);if(f&&!d&&2===p.length&&se(p[1^l]))return p[1^l];if(f&&d&&1===p.length&&se(d))return d;var y=t&&t===this.ownerID,g=f?d?c:c^a:c|a,m=f?d?we(p,l,d,y):me(p,l,y):Me(p,l,d,y);return y?(this.bitmap=g,this.nodes=m,this):new Xt(t,g,m)},Ht.prototype.get=function(t,e,n,r){void 0===e&&(e=Dt(n));var i=(0===t?e:e>>>t)&w,o=this.nodes[i];return o?o.get(t+v,e,n,r):r},Ht.prototype.update=function(t,e,n,r,i,o,u){void 0===n&&(n=Dt(r));var s=(0===e?n:n>>>e)&w,a=i===M,c=this.nodes,f=c[s];if(a&&!f)return this;var l=ue(f,t,e+v,n,r,i,o,u);if(l===f)return this;var p=this.count;if(f){if(!l&&--p<be)return fe(t,c,p,s)}else p++;var h=t&&t===this.ownerID,d=we(c,s,l,h);return h?(this.count=p,this.nodes=d,this):new Ht(t,p,d)},Kt.prototype.get=function(t,e,n,r){for(var i=this.entries,o=0,u=i.length;o<u;o++)if(gt(n,i[o][0]))return i[o][1];return r},Kt.prototype.update=function(t,e,n,r,i,o,u){void 0===n&&(n=Dt(r));var s=i===M;if(n!==this.keyHash)return s?this:(b(u),b(o),ae(this,t,e,n,[r,i]));for(var a=this.entries,c=0,f=a.length;c<f&&!gt(r,a[c][0]);c++);var l=c<f;if(l?a[c][1]===i:s)return this;if(b(u),(s||!l)&&b(o),s&&2===f)return new $t(t,this.keyHash,a[1^c]);var p=t&&t===this.ownerID,h=p?a:j(a);return l?s?c===f-1?h.pop():h[c]=h.pop():h[c]=[r,i]:h.push([r,i]),p?(this.entries=h,this):new Kt(t,this.keyHash,h)},$t.prototype.get=function(t,e,n,r){return gt(n,this.entry[0])?this.entry[1]:r},$t.prototype.update=function(t,e,n,r,i,o,u){var s=i===M,a=gt(r,this.entry[0]);return(a?i===this.entry[1]:s)?this:(b(u),s?void b(o):a?t&&t===this.ownerID?(this.entry[1]=i,this):new $t(t,this.keyHash,[r,i]):(b(o),ae(this,t,e,Dt(r),[r,i])))},Vt.prototype.iterate=Kt.prototype.iterate=function(t,e){for(var n=this.entries,r=0,i=n.length-1;r<=i;r++)if(!1===t(n[e?i-r:r]))return!1},Xt.prototype.iterate=Ht.prototype.iterate=function(t,e){for(var n=this.nodes,r=0,i=n.length-1;r<=i;r++){var o=n[e?i-r:r];if(o&&!1===o.iterate(t,e))return!1}},$t.prototype.iterate=function(t,e){return t(this.entry)},e(te,P),te.prototype.next=function(){for(var t=this._type,e=this._stack;e;){var n,r=e.node,i=e.index++;if(r.entry){if(0===i)return ee(t,r.entry)}else if(r.entries){if(i<=(n=r.entries.length-1))return ee(t,r.entries[this._reverse?n-i:i])}else if(i<=(n=r.nodes.length-1)){var o=r.nodes[this._reverse?n-i:i];if(o){if(o.entry)return ee(t,o.entry);e=this._stack=ne(o,e)}continue}e=this._stack=this._stack.__prev}return Q()};var _e=g/4,Le=g/2,be=g/4;function xe(t){var e=Ee();if(null==t)return e;if(je(t))return t;var n=i(t),r=n.size;return 0===r?e:(Bt(r),r>0&&r<g?Ce(0,r,v,null,new De(n.toArray())):e.withMutations((function(t){t.setSize(r),n.forEach((function(e,n){return t.set(n,e)}))})))}function je(t){return!(!t||!t[Ne])}e(xe,xt),xe.of=function(){return this(arguments)},xe.prototype.toString=function(){return this.__toString(\"List [\",\"]\")},xe.prototype.get=function(t,e){if((t=S(this,t))>=0&&t<this.size){var n=Ue(this,t+=this._origin);return n&&n.array[t&w]}return e},xe.prototype.set=function(t,e){return ze(this,t,e)},xe.prototype.remove=function(t){return this.has(t)?0===t?this.shift():t===this.size-1?this.pop():this.splice(t,1):this},xe.prototype.insert=function(t,e){return this.splice(t,0,e)},xe.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=v,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):Ee()},xe.prototype.push=function(){var t=arguments,e=this.size;return this.withMutations((function(n){Pe(n,0,e+t.length);for(var r=0;r<t.length;r++)n.set(e+r,t[r])}))},xe.prototype.pop=function(){return Pe(this,0,-1)},xe.prototype.unshift=function(){var t=arguments;return this.withMutations((function(e){Pe(e,-t.length);for(var n=0;n<t.length;n++)e.set(n,t[n])}))},xe.prototype.shift=function(){return Pe(this,1)},xe.prototype.merge=function(){return Re(this,void 0,arguments)},xe.prototype.mergeWith=function(e){return Re(this,e,t.call(arguments,1))},xe.prototype.mergeDeep=function(){return Re(this,he,arguments)},xe.prototype.mergeDeepWith=function(e){var n=t.call(arguments,1);return Re(this,de(e),n)},xe.prototype.setSize=function(t){return Pe(this,0,t)},xe.prototype.slice=function(t,e){var n=this.size;return I(t,e,n)?this:Pe(this,A(t,n),O(e,n))},xe.prototype.__iterator=function(t,e){var n=0,r=Te(this,e);return new P((function(){var e=r();return e===Oe?Q():R(t,n++,e)}))},xe.prototype.__iterate=function(t,e){for(var n,r=0,i=Te(this,e);(n=i())!==Oe&&!1!==t(n,r++,this););return r},xe.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Ce(this._origin,this._capacity,this._level,this._root,this._tail,t,this.__hash):(this.__ownerID=t,this)},xe.isList=je;var Ne=\"@@__IMMUTABLE_LIST__@@\",Se=xe.prototype;function De(t,e){this.array=t,this.ownerID=e}Se[Ne]=!0,Se[y]=Se.remove,Se.setIn=Zt.setIn,Se.deleteIn=Se.removeIn=Zt.removeIn,Se.update=Zt.update,Se.updateIn=Zt.updateIn,Se.mergeIn=Zt.mergeIn,Se.mergeDeepIn=Zt.mergeDeepIn,Se.withMutations=Zt.withMutations,Se.asMutable=Zt.asMutable,Se.asImmutable=Zt.asImmutable,Se.wasAltered=Zt.wasAltered,De.prototype.removeBefore=function(t,e,n){if(n===e?1<<e:0===this.array.length)return this;var r=n>>>e&w;if(r>=this.array.length)return new De([],t);var i,o=0===r;if(e>0){var u=this.array[r];if((i=u&&u.removeBefore(t,e-v,n))===u&&o)return this}if(o&&!i)return this;var s=Ye(this,t);if(!o)for(var a=0;a<r;a++)s.array[a]=void 0;return i&&(s.array[r]=i),s},De.prototype.removeAfter=function(t,e,n){if(n===(e?1<<e:0)||0===this.array.length)return this;var r,i=n-1>>>e&w;if(i>=this.array.length)return this;if(e>0){var o=this.array[i];if((r=o&&o.removeAfter(t,e-v,n))===o&&i===this.array.length-1)return this}var u=Ye(this,t);return u.array.splice(i+1),r&&(u.array[i]=r),u};var Ie,Ae,Oe={};function Te(t,e){var n=t._origin,r=t._capacity,i=Qe(r),o=t._tail;return u(t._root,t._level,0);function u(t,e,n){return 0===e?s(t,n):a(t,e,n)}function s(t,u){var s=u===i?o&&o.array:t&&t.array,a=u>n?0:n-u,c=r-u;return c>g&&(c=g),function(){if(a===c)return Oe;var t=e?--c:a++;return s&&s[t]}}function a(t,i,o){var s,a=t&&t.array,c=o>n?0:n-o>>i,f=1+(r-o>>i);return f>g&&(f=g),function(){for(;;){if(s){var t=s();if(t!==Oe)return t;s=null}if(c===f)return Oe;var n=e?--f:c++;s=u(a&&a[n],i-v,o+(n<<i))}}}}function Ce(t,e,n,r,i,o,u){var s=Object.create(Se);return s.size=e-t,s._origin=t,s._capacity=e,s._level=n,s._root=r,s._tail=i,s.__ownerID=o,s.__hash=u,s.__altered=!1,s}function Ee(){return Ie||(Ie=Ce(0,0,v))}function ze(t,e,n){if((e=S(t,e))!=e)return t;if(e>=t.size||e<0)return t.withMutations((function(t){e<0?Pe(t,e).set(0,n):Pe(t,0,e+1).set(e,n)}));e+=t._origin;var r=t._tail,i=t._root,o=L(_);return e>=Qe(t._capacity)?r=ke(r,t.__ownerID,0,e,n,o):i=ke(i,t.__ownerID,t._level,e,n,o),o.value?t.__ownerID?(t._root=i,t._tail=r,t.__hash=void 0,t.__altered=!0,t):Ce(t._origin,t._capacity,t._level,i,r):t}function ke(t,e,n,r,i,o){var u,s=r>>>n&w,a=t&&s<t.array.length;if(!a&&void 0===i)return t;if(n>0){var c=t&&t.array[s],f=ke(c,e,n-v,r,i,o);return f===c?t:((u=Ye(t,e)).array[s]=f,u)}return a&&t.array[s]===i?t:(b(o),u=Ye(t,e),void 0===i&&s===u.array.length-1?u.array.pop():u.array[s]=i,u)}function Ye(t,e){return e&&t&&e===t.ownerID?t:new De(t?t.array.slice():[],e)}function Ue(t,e){if(e>=Qe(t._capacity))return t._tail;if(e<1<<t._level+v){for(var n=t._root,r=t._level;n&&r>0;)n=n.array[e>>>r&w],r-=v;return n}}function Pe(t,e,n){void 0!==e&&(e|=0),void 0!==n&&(n|=0);var r=t.__ownerID||new x,i=t._origin,o=t._capacity,u=i+e,s=void 0===n?o:n<0?o+n:i+n;if(u===i&&s===o)return t;if(u>=s)return t.clear();for(var a=t._level,c=t._root,f=0;u+f<0;)c=new De(c&&c.array.length?[void 0,c]:[],r),f+=1<<(a+=v);f&&(u+=f,i+=f,s+=f,o+=f);for(var l=Qe(o),p=Qe(s);p>=1<<a+v;)c=new De(c&&c.array.length?[c]:[],r),a+=v;var h=t._tail,d=p<l?Ue(t,s-1):p>l?new De([],r):h;if(h&&p>l&&u<o&&h.array.length){for(var y=c=Ye(c,r),g=a;g>v;g-=v){var M=l>>>g&w;y=y.array[M]=Ye(y.array[M],r)}y.array[l>>>v&w]=h}if(s<o&&(d=d&&d.removeAfter(r,0,s)),u>=p)u-=p,s-=p,a=v,c=null,d=d&&d.removeBefore(r,0,u);else if(u>i||p<l){for(f=0;c;){var m=u>>>a&w;if(m!==p>>>a&w)break;m&&(f+=(1<<a)*m),a-=v,c=c.array[m]}c&&u>i&&(c=c.removeBefore(r,a,u-f)),c&&p<l&&(c=c.removeAfter(r,a,p-f)),f&&(u-=f,s-=f)}return t.__ownerID?(t.size=s-u,t._origin=u,t._capacity=s,t._level=a,t._root=c,t._tail=d,t.__hash=void 0,t.__altered=!0,t):Ce(u,s,a,c,d)}function Re(t,e,n){for(var r=[],o=0,s=0;s<n.length;s++){var a=n[s],c=i(a);c.size>o&&(o=c.size),u(a)||(c=c.map((function(t){return ht(t)}))),r.push(c)}return o>t.size&&(t=t.setSize(o)),ye(t,e,r)}function Qe(t){return t<g?0:t-1>>>v<<v}function Fe(t){return null==t?We():Be(t)?t:We().withMutations((function(e){var n=r(t);Bt(n.size),n.forEach((function(t,n){return e.set(n,t)}))}))}function Be(t){return Wt(t)&&f(t)}function Ge(t,e,n,r){var i=Object.create(Fe.prototype);return i.size=t?t.size:0,i._map=t,i._list=e,i.__ownerID=n,i.__hash=r,i}function We(){return Ae||(Ae=Ge(ie(),Ee()))}function qe(t,e,n){var r,i,o=t._map,u=t._list,s=o.get(e),a=void 0!==s;if(n===M){if(!a)return t;u.size>=g&&u.size>=2*o.size?(r=(i=u.filter((function(t,e){return void 0!==t&&s!==e}))).toKeyedSeq().map((function(t){return t[0]})).flip().toMap(),t.__ownerID&&(r.__ownerID=i.__ownerID=t.__ownerID)):(r=o.remove(e),i=s===u.size-1?u.pop():u.set(s,void 0))}else if(a){if(n===u.get(s)[1])return t;r=o,i=u.set(s,[e,n])}else r=o.set(e,u.size),i=u.set(u.size,[e,n]);return t.__ownerID?(t.size=r.size,t._map=r,t._list=i,t.__hash=void 0,t):Ge(r,i)}function Je(t,e){this._iter=t,this._useKeys=e,this.size=t.size}function Ze(t){this._iter=t,this.size=t.size}function Ve(t){this._iter=t,this.size=t.size}function Xe(t){this._iter=t,this.size=t.size}function He(t){var e=Mn(t);return e._iter=t,e.size=t.size,e.flip=function(){return t},e.reverse=function(){var e=t.reverse.apply(this);return e.flip=function(){return t.reverse()},e},e.has=function(e){return t.includes(e)},e.includes=function(e){return t.has(e)},e.cacheResult=mn,e.__iterateUncached=function(e,n){var r=this;return t.__iterate((function(t,n){return!1!==e(n,t,r)}),n)},e.__iteratorUncached=function(e,n){if(e===z){var r=t.__iterator(e,n);return new P((function(){var t=r.next();if(!t.done){var e=t.value[0];t.value[0]=t.value[1],t.value[1]=e}return t}))}return t.__iterator(e===E?C:E,n)},e}function Ke(t,e,n){var r=Mn(t);return r.size=t.size,r.has=function(e){return t.has(e)},r.get=function(r,i){var o=t.get(r,M);return o===M?i:e.call(n,o,r,t)},r.__iterateUncached=function(r,i){var o=this;return t.__iterate((function(t,i,u){return!1!==r(e.call(n,t,i,u),i,o)}),i)},r.__iteratorUncached=function(r,i){var o=t.__iterator(z,i);return new P((function(){var i=o.next();if(i.done)return i;var u=i.value,s=u[0];return R(r,s,e.call(n,u[1],s,t),i)}))},r}function $e(t,e){var n=Mn(t);return n._iter=t,n.size=t.size,n.reverse=function(){return t},t.flip&&(n.flip=function(){var e=He(t);return e.reverse=function(){return t.flip()},e}),n.get=function(n,r){return t.get(e?n:-1-n,r)},n.has=function(n){return t.has(e?n:-1-n)},n.includes=function(e){return t.includes(e)},n.cacheResult=mn,n.__iterate=function(e,n){var r=this;return t.__iterate((function(t,n){return e(t,n,r)}),!n)},n.__iterator=function(e,n){return t.__iterator(e,!n)},n}function tn(t,e,n,r){var i=Mn(t);return r&&(i.has=function(r){var i=t.get(r,M);return i!==M&&!!e.call(n,i,r,t)},i.get=function(r,i){var o=t.get(r,M);return o!==M&&e.call(n,o,r,t)?o:i}),i.__iterateUncached=function(i,o){var u=this,s=0;return t.__iterate((function(t,o,a){if(e.call(n,t,o,a))return s++,i(t,r?o:s-1,u)}),o),s},i.__iteratorUncached=function(i,o){var u=t.__iterator(z,o),s=0;return new P((function(){for(;;){var o=u.next();if(o.done)return o;var a=o.value,c=a[0],f=a[1];if(e.call(n,f,c,t))return R(i,r?c:s++,f,o)}}))},i}function en(t,e,n){var r=Gt().asMutable();return t.__iterate((function(i,o){r.update(e.call(n,i,o,t),0,(function(t){return t+1}))})),r.asImmutable()}function nn(t,e,n){var r=s(t),i=(f(t)?Fe():Gt()).asMutable();t.__iterate((function(o,u){i.update(e.call(n,o,u,t),(function(t){return(t=t||[]).push(r?[u,o]:o),t}))}));var o=wn(t);return i.map((function(e){return yn(t,o(e))}))}function rn(t,e,n,r){var i=t.size;if(void 0!==e&&(e|=0),void 0!==n&&(n===1/0?n=i:n|=0),I(e,n,i))return t;var o=A(e,i),u=O(n,i);if(o!=o||u!=u)return rn(t.toSeq().cacheResult(),e,n,r);var s,a=u-o;a==a&&(s=a<0?0:a);var c=Mn(t);return c.size=0===s?s:t.size&&s||void 0,!r&&ot(t)&&s>=0&&(c.get=function(e,n){return(e=S(this,e))>=0&&e<s?t.get(e+o,n):n}),c.__iterateUncached=function(e,n){var i=this;if(0===s)return 0;if(n)return this.cacheResult().__iterate(e,n);var u=0,a=!0,c=0;return t.__iterate((function(t,n){if(!a||!(a=u++<o))return c++,!1!==e(t,r?n:c-1,i)&&c!==s})),c},c.__iteratorUncached=function(e,n){if(0!==s&&n)return this.cacheResult().__iterator(e,n);var i=0!==s&&t.__iterator(e,n),u=0,a=0;return new P((function(){for(;u++<o;)i.next();if(++a>s)return Q();var t=i.next();return r||e===E?t:R(e,a-1,e===C?void 0:t.value[1],t)}))},c}function on(t,e,n){var r=Mn(t);return r.__iterateUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterate(r,i);var u=0;return t.__iterate((function(t,i,s){return e.call(n,t,i,s)&&++u&&r(t,i,o)})),u},r.__iteratorUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterator(r,i);var u=t.__iterator(z,i),s=!0;return new P((function(){if(!s)return Q();var t=u.next();if(t.done)return t;var i=t.value,a=i[0],c=i[1];return e.call(n,c,a,o)?r===z?t:R(r,a,c,t):(s=!1,Q())}))},r}function un(t,e,n,r){var i=Mn(t);return i.__iterateUncached=function(i,o){var u=this;if(o)return this.cacheResult().__iterate(i,o);var s=!0,a=0;return t.__iterate((function(t,o,c){if(!s||!(s=e.call(n,t,o,c)))return a++,i(t,r?o:a-1,u)})),a},i.__iteratorUncached=function(i,o){var u=this;if(o)return this.cacheResult().__iterator(i,o);var s=t.__iterator(z,o),a=!0,c=0;return new P((function(){var t,o,f;do{if((t=s.next()).done)return r||i===E?t:R(i,c++,i===C?void 0:t.value[1],t);var l=t.value;o=l[0],f=l[1],a&&(a=e.call(n,f,o,u))}while(a);return i===z?t:R(i,o,f,t)}))},i}function sn(t,e){var n=s(t),i=[t].concat(e).map((function(t){return u(t)?n&&(t=r(t)):t=n?st(t):at(Array.isArray(t)?t:[t]),t})).filter((function(t){return 0!==t.size}));if(0===i.length)return t;if(1===i.length){var o=i[0];if(o===t||n&&s(o)||a(t)&&a(o))return o}var c=new et(i);return n?c=c.toKeyedSeq():a(t)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=i.reduce((function(t,e){if(void 0!==t){var n=e.size;if(void 0!==n)return t+n}}),0),c}function an(t,e,n){var r=Mn(t);return r.__iterateUncached=function(r,i){var o=0,s=!1;function a(t,c){var f=this;t.__iterate((function(t,i){return(!e||c<e)&&u(t)?a(t,c+1):!1===r(t,n?i:o++,f)&&(s=!0),!s}),i)}return a(t,0),o},r.__iteratorUncached=function(r,i){var o=t.__iterator(r,i),s=[],a=0;return new P((function(){for(;o;){var t=o.next();if(!1===t.done){var c=t.value;if(r===z&&(c=c[1]),e&&!(s.length<e)||!u(c))return n?t:R(r,a++,c,t);s.push(o),o=c.__iterator(r,i)}else o=s.pop()}return Q()}))},r}function cn(t,e,n){var r=wn(t);return t.toSeq().map((function(i,o){return r(e.call(n,i,o,t))})).flatten(!0)}function fn(t,e){var n=Mn(t);return n.size=t.size&&2*t.size-1,n.__iterateUncached=function(n,r){var i=this,o=0;return t.__iterate((function(t,r){return(!o||!1!==n(e,o++,i))&&!1!==n(t,o++,i)}),r),o},n.__iteratorUncached=function(n,r){var i,o=t.__iterator(E,r),u=0;return new P((function(){return(!i||u%2)&&(i=o.next()).done?i:u%2?R(n,u++,e):R(n,u++,i.value,i)}))},n}function ln(t,e,n){e||(e=_n);var r=s(t),i=0,o=t.toSeq().map((function(e,r){return[r,e,i++,n?n(e,r,t):e]})).toArray();return o.sort((function(t,n){return e(t[3],n[3])||t[2]-n[2]})).forEach(r?function(t,e){o[e].length=2}:function(t,e){o[e]=t[1]}),r?Z(o):a(t)?V(o):X(o)}function pn(t,e,n){if(e||(e=_n),n){var r=t.toSeq().map((function(e,r){return[e,n(e,r,t)]})).reduce((function(t,n){return hn(e,t[1],n[1])?n:t}));return r&&r[0]}return t.reduce((function(t,n){return hn(e,t,n)?n:t}))}function hn(t,e,n){var r=t(n,e);return 0===r&&n!==e&&(null==n||n!=n)||r>0}function dn(t,e,r){var i=Mn(t);return i.size=new et(r).map((function(t){return t.size})).min(),i.__iterate=function(t,e){for(var n,r=this.__iterator(E,e),i=0;!(n=r.next()).done&&!1!==t(n.value,i++,this););return i},i.__iteratorUncached=function(t,i){var o=r.map((function(t){return t=n(t),G(i?t.reverse():t)})),u=0,s=!1;return new P((function(){var n;return s||(n=o.map((function(t){return t.next()})),s=n.some((function(t){return t.done}))),s?Q():R(t,u++,e.apply(null,n.map((function(t){return t.value}))))}))},i}function yn(t,e){return ot(t)?e:t.constructor(e)}function vn(t){if(t!==Object(t))throw new TypeError(\"Expected [K, V] tuple: \"+t)}function gn(t){return Bt(t.size),N(t)}function wn(t){return s(t)?r:a(t)?i:o}function Mn(t){return Object.create((s(t)?Z:a(t)?V:X).prototype)}function mn(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function _n(t,e){return t>e?1:t<e?-1:0}function Ln(t){var e=G(t);if(!e){if(!q(t))throw new TypeError(\"Expected iterable or array-like: \"+t);e=G(n(t))}return e}function bn(t,e){var n,r=function(o){if(o instanceof r)return o;if(!(this instanceof r))return new r(o);if(!n){n=!0;var u=Object.keys(t);Sn(i,u),i.size=u.length,i._name=e,i._keys=u,i._defaultValues=t}this._map=Gt(o)},i=r.prototype=Object.create(xn);return i.constructor=r,r}e(Fe,Gt),Fe.of=function(){return this(arguments)},Fe.prototype.toString=function(){return this.__toString(\"OrderedMap {\",\"}\")},Fe.prototype.get=function(t,e){var n=this._map.get(t);return void 0!==n?this._list.get(n)[1]:e},Fe.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):We()},Fe.prototype.set=function(t,e){return qe(this,t,e)},Fe.prototype.remove=function(t){return qe(this,t,M)},Fe.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},Fe.prototype.__iterate=function(t,e){var n=this;return this._list.__iterate((function(e){return e&&t(e[1],e[0],n)}),e)},Fe.prototype.__iterator=function(t,e){return this._list.fromEntrySeq().__iterator(t,e)},Fe.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map.__ensureOwner(t),n=this._list.__ensureOwner(t);return t?Ge(e,n,t,this.__hash):(this.__ownerID=t,this._map=e,this._list=n,this)},Fe.isOrderedMap=Be,Fe.prototype[d]=!0,Fe.prototype[y]=Fe.prototype.remove,e(Je,Z),Je.prototype.get=function(t,e){return this._iter.get(t,e)},Je.prototype.has=function(t){return this._iter.has(t)},Je.prototype.valueSeq=function(){return this._iter.valueSeq()},Je.prototype.reverse=function(){var t=this,e=$e(this,!0);return this._useKeys||(e.valueSeq=function(){return t._iter.toSeq().reverse()}),e},Je.prototype.map=function(t,e){var n=this,r=Ke(this,t,e);return this._useKeys||(r.valueSeq=function(){return n._iter.toSeq().map(t,e)}),r},Je.prototype.__iterate=function(t,e){var n,r=this;return this._iter.__iterate(this._useKeys?function(e,n){return t(e,n,r)}:(n=e?gn(this):0,function(i){return t(i,e?--n:n++,r)}),e)},Je.prototype.__iterator=function(t,e){if(this._useKeys)return this._iter.__iterator(t,e);var n=this._iter.__iterator(E,e),r=e?gn(this):0;return new P((function(){var i=n.next();return i.done?i:R(t,e?--r:r++,i.value,i)}))},Je.prototype[d]=!0,e(Ze,V),Ze.prototype.includes=function(t){return this._iter.includes(t)},Ze.prototype.__iterate=function(t,e){var n=this,r=0;return this._iter.__iterate((function(e){return t(e,r++,n)}),e)},Ze.prototype.__iterator=function(t,e){var n=this._iter.__iterator(E,e),r=0;return new P((function(){var e=n.next();return e.done?e:R(t,r++,e.value,e)}))},e(Ve,X),Ve.prototype.has=function(t){return this._iter.includes(t)},Ve.prototype.__iterate=function(t,e){var n=this;return this._iter.__iterate((function(e){return t(e,e,n)}),e)},Ve.prototype.__iterator=function(t,e){var n=this._iter.__iterator(E,e);return new P((function(){var e=n.next();return e.done?e:R(t,e.value,e.value,e)}))},e(Xe,Z),Xe.prototype.entrySeq=function(){return this._iter.toSeq()},Xe.prototype.__iterate=function(t,e){var n=this;return this._iter.__iterate((function(e){if(e){vn(e);var r=u(e);return t(r?e.get(1):e[1],r?e.get(0):e[0],n)}}),e)},Xe.prototype.__iterator=function(t,e){var n=this._iter.__iterator(E,e);return new P((function(){for(;;){var e=n.next();if(e.done)return e;var r=e.value;if(r){vn(r);var i=u(r);return R(t,i?r.get(0):r[0],i?r.get(1):r[1],e)}}}))},Ze.prototype.cacheResult=Je.prototype.cacheResult=Ve.prototype.cacheResult=Xe.prototype.cacheResult=mn,e(bn,bt),bn.prototype.toString=function(){return this.__toString(Nn(this)+\" {\",\"}\")},bn.prototype.has=function(t){return this._defaultValues.hasOwnProperty(t)},bn.prototype.get=function(t,e){if(!this.has(t))return e;var n=this._defaultValues[t];return this._map?this._map.get(t,n):n},bn.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var t=this.constructor;return t._empty||(t._empty=jn(this,ie()))},bn.prototype.set=function(t,e){if(!this.has(t))throw new Error('Cannot set unknown key \"'+t+'\" on '+Nn(this));if(this._map&&!this._map.has(t)&&e===this._defaultValues[t])return this;var n=this._map&&this._map.set(t,e);return this.__ownerID||n===this._map?this:jn(this,n)},bn.prototype.remove=function(t){if(!this.has(t))return this;var e=this._map&&this._map.remove(t);return this.__ownerID||e===this._map?this:jn(this,e)},bn.prototype.wasAltered=function(){return this._map.wasAltered()},bn.prototype.__iterator=function(t,e){var n=this;return r(this._defaultValues).map((function(t,e){return n.get(e)})).__iterator(t,e)},bn.prototype.__iterate=function(t,e){var n=this;return r(this._defaultValues).map((function(t,e){return n.get(e)})).__iterate(t,e)},bn.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map&&this._map.__ensureOwner(t);return t?jn(this,e,t):(this.__ownerID=t,this._map=e,this)};var xn=bn.prototype;function jn(t,e,n){var r=Object.create(Object.getPrototypeOf(t));return r._map=e,r.__ownerID=n,r}function Nn(t){return t._name||t.constructor.name||\"Record\"}function Sn(t,e){try{e.forEach(Dn.bind(void 0,t))}catch(t){}}function Dn(t,e){Object.defineProperty(t,e,{get:function(){return this.get(e)},set:function(t){mt(this.__ownerID,\"Cannot set on an immutable record.\"),this.set(e,t)}})}function In(t){return null==t?kn():An(t)&&!f(t)?t:kn().withMutations((function(e){var n=o(t);Bt(n.size),n.forEach((function(t){return e.add(t)}))}))}function An(t){return!(!t||!t[Tn])}xn[y]=xn.remove,xn.deleteIn=xn.removeIn=Zt.removeIn,xn.merge=Zt.merge,xn.mergeWith=Zt.mergeWith,xn.mergeIn=Zt.mergeIn,xn.mergeDeep=Zt.mergeDeep,xn.mergeDeepWith=Zt.mergeDeepWith,xn.mergeDeepIn=Zt.mergeDeepIn,xn.setIn=Zt.setIn,xn.update=Zt.update,xn.updateIn=Zt.updateIn,xn.withMutations=Zt.withMutations,xn.asMutable=Zt.asMutable,xn.asImmutable=Zt.asImmutable,e(In,jt),In.of=function(){return this(arguments)},In.fromKeys=function(t){return this(r(t).keySeq())},In.prototype.toString=function(){return this.__toString(\"Set {\",\"}\")},In.prototype.has=function(t){return this._map.has(t)},In.prototype.add=function(t){return En(this,this._map.set(t,!0))},In.prototype.remove=function(t){return En(this,this._map.remove(t))},In.prototype.clear=function(){return En(this,this._map.clear())},In.prototype.union=function(){var e=t.call(arguments,0);return 0===(e=e.filter((function(t){return 0!==t.size}))).length?this:0!==this.size||this.__ownerID||1!==e.length?this.withMutations((function(t){for(var n=0;n<e.length;n++)o(e[n]).forEach((function(e){return t.add(e)}))})):this.constructor(e[0])},In.prototype.intersect=function(){var e=t.call(arguments,0);if(0===e.length)return this;e=e.map((function(t){return o(t)}));var n=this;return this.withMutations((function(t){n.forEach((function(n){e.every((function(t){return t.includes(n)}))||t.remove(n)}))}))},In.prototype.subtract=function(){var e=t.call(arguments,0);if(0===e.length)return this;e=e.map((function(t){return o(t)}));var n=this;return this.withMutations((function(t){n.forEach((function(n){e.some((function(t){return t.includes(n)}))&&t.remove(n)}))}))},In.prototype.merge=function(){return this.union.apply(this,arguments)},In.prototype.mergeWith=function(e){var n=t.call(arguments,1);return this.union.apply(this,n)},In.prototype.sort=function(t){return Yn(ln(this,t))},In.prototype.sortBy=function(t,e){return Yn(ln(this,e,t))},In.prototype.wasAltered=function(){return this._map.wasAltered()},In.prototype.__iterate=function(t,e){var n=this;return this._map.__iterate((function(e,r){return t(r,r,n)}),e)},In.prototype.__iterator=function(t,e){return this._map.map((function(t,e){return e})).__iterator(t,e)},In.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map.__ensureOwner(t);return t?this.__make(e,t):(this.__ownerID=t,this._map=e,this)},In.isSet=An;var On,Tn=\"@@__IMMUTABLE_SET__@@\",Cn=In.prototype;function En(t,e){return t.__ownerID?(t.size=e.size,t._map=e,t):e===t._map?t:0===e.size?t.__empty():t.__make(e)}function zn(t,e){var n=Object.create(Cn);return n.size=t?t.size:0,n._map=t,n.__ownerID=e,n}function kn(){return On||(On=zn(ie()))}function Yn(t){return null==t?Fn():Un(t)?t:Fn().withMutations((function(e){var n=o(t);Bt(n.size),n.forEach((function(t){return e.add(t)}))}))}function Un(t){return An(t)&&f(t)}Cn[Tn]=!0,Cn[y]=Cn.remove,Cn.mergeDeep=Cn.merge,Cn.mergeDeepWith=Cn.mergeWith,Cn.withMutations=Zt.withMutations,Cn.asMutable=Zt.asMutable,Cn.asImmutable=Zt.asImmutable,Cn.__empty=kn,Cn.__make=zn,e(Yn,In),Yn.of=function(){return this(arguments)},Yn.fromKeys=function(t){return this(r(t).keySeq())},Yn.prototype.toString=function(){return this.__toString(\"OrderedSet {\",\"}\")},Yn.isOrderedSet=Un;var Pn,Rn=Yn.prototype;function Qn(t,e){var n=Object.create(Rn);return n.size=t?t.size:0,n._map=t,n.__ownerID=e,n}function Fn(){return Pn||(Pn=Qn(We()))}function Bn(t){return null==t?Vn():Gn(t)?t:Vn().unshiftAll(t)}function Gn(t){return!(!t||!t[qn])}Rn[d]=!0,Rn.__empty=Fn,Rn.__make=Qn,e(Bn,xt),Bn.of=function(){return this(arguments)},Bn.prototype.toString=function(){return this.__toString(\"Stack [\",\"]\")},Bn.prototype.get=function(t,e){var n=this._head;for(t=S(this,t);n&&t--;)n=n.next;return n?n.value:e},Bn.prototype.peek=function(){return this._head&&this._head.value},Bn.prototype.push=function(){if(0===arguments.length)return this;for(var t=this.size+arguments.length,e=this._head,n=arguments.length-1;n>=0;n--)e={value:arguments[n],next:e};return this.__ownerID?(this.size=t,this._head=e,this.__hash=void 0,this.__altered=!0,this):Zn(t,e)},Bn.prototype.pushAll=function(t){if(0===(t=i(t)).size)return this;Bt(t.size);var e=this.size,n=this._head;return t.reverse().forEach((function(t){e++,n={value:t,next:n}})),this.__ownerID?(this.size=e,this._head=n,this.__hash=void 0,this.__altered=!0,this):Zn(e,n)},Bn.prototype.pop=function(){return this.slice(1)},Bn.prototype.unshift=function(){return this.push.apply(this,arguments)},Bn.prototype.unshiftAll=function(t){return this.pushAll(t)},Bn.prototype.shift=function(){return this.pop.apply(this,arguments)},Bn.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Vn()},Bn.prototype.slice=function(t,e){if(I(t,e,this.size))return this;var n=A(t,this.size);if(O(e,this.size)!==this.size)return xt.prototype.slice.call(this,t,e);for(var r=this.size-n,i=this._head;n--;)i=i.next;return this.__ownerID?(this.size=r,this._head=i,this.__hash=void 0,this.__altered=!0,this):Zn(r,i)},Bn.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Zn(this.size,this._head,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Bn.prototype.__iterate=function(t,e){if(e)return this.reverse().__iterate(t);for(var n=0,r=this._head;r&&!1!==t(r.value,n++,this);)r=r.next;return n},Bn.prototype.__iterator=function(t,e){if(e)return this.reverse().__iterator(t);var n=0,r=this._head;return new P((function(){if(r){var e=r.value;return r=r.next,R(t,n++,e)}return Q()}))},Bn.isStack=Gn;var Wn,qn=\"@@__IMMUTABLE_STACK__@@\",Jn=Bn.prototype;function Zn(t,e,n,r){var i=Object.create(Jn);return i.size=t,i._head=e,i.__ownerID=n,i.__hash=r,i.__altered=!1,i}function Vn(){return Wn||(Wn=Zn(0))}function Xn(t,e){var n=function(n){t.prototype[n]=e[n]};return Object.keys(e).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(e).forEach(n),t}Jn[qn]=!0,Jn.withMutations=Zt.withMutations,Jn.asMutable=Zt.asMutable,Jn.asImmutable=Zt.asImmutable,Jn.wasAltered=Zt.wasAltered,n.Iterator=P,Xn(n,{toArray:function(){Bt(this.size);var t=new Array(this.size||0);return this.valueSeq().__iterate((function(e,n){t[n]=e})),t},toIndexedSeq:function(){return new Ze(this)},toJS:function(){return this.toSeq().map((function(t){return t&&\"function\"==typeof t.toJS?t.toJS():t})).__toJS()},toJSON:function(){return this.toSeq().map((function(t){return t&&\"function\"==typeof t.toJSON?t.toJSON():t})).__toJS()},toKeyedSeq:function(){return new Je(this,!0)},toMap:function(){return Gt(this.toKeyedSeq())},toObject:function(){Bt(this.size);var t={};return this.__iterate((function(e,n){t[n]=e})),t},toOrderedMap:function(){return Fe(this.toKeyedSeq())},toOrderedSet:function(){return Yn(s(this)?this.valueSeq():this)},toSet:function(){return In(s(this)?this.valueSeq():this)},toSetSeq:function(){return new Ve(this)},toSeq:function(){return a(this)?this.toIndexedSeq():s(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Bn(s(this)?this.valueSeq():this)},toList:function(){return xe(s(this)?this.valueSeq():this)},toString:function(){return\"[Iterable]\"},__toString:function(t,e){return 0===this.size?t+e:t+\" \"+this.toSeq().map(this.__toStringMapper).join(\", \")+\" \"+e},concat:function(){return yn(this,sn(this,t.call(arguments,0)))},includes:function(t){return this.some((function(e){return gt(e,t)}))},entries:function(){return this.__iterator(z)},every:function(t,e){Bt(this.size);var n=!0;return this.__iterate((function(r,i,o){if(!t.call(e,r,i,o))return n=!1,!1})),n},filter:function(t,e){return yn(this,tn(this,t,e,!0))},find:function(t,e,n){var r=this.findEntry(t,e);return r?r[1]:n},forEach:function(t,e){return Bt(this.size),this.__iterate(e?t.bind(e):t)},join:function(t){Bt(this.size),t=void 0!==t?\"\"+t:\",\";var e=\"\",n=!0;return this.__iterate((function(r){n?n=!1:e+=t,e+=null!=r?r.toString():\"\"})),e},keys:function(){return this.__iterator(C)},map:function(t,e){return yn(this,Ke(this,t,e))},reduce:function(t,e,n){var r,i;return Bt(this.size),arguments.length<2?i=!0:r=e,this.__iterate((function(e,o,u){i?(i=!1,r=e):r=t.call(n,r,e,o,u)})),r},reduceRight:function(t,e,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return yn(this,$e(this,!0))},slice:function(t,e){return yn(this,rn(this,t,e,!0))},some:function(t,e){return!this.every(er(t),e)},sort:function(t){return yn(this,ln(this,t))},values:function(){return this.__iterator(E)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(t,e){return N(t?this.toSeq().filter(t,e):this)},countBy:function(t,e){return en(this,t,e)},equals:function(t){return wt(this,t)},entrySeq:function(){var t=this;if(t._cache)return new et(t._cache);var e=t.toSeq().map(tr).toIndexedSeq();return e.fromEntrySeq=function(){return t.toSeq()},e},filterNot:function(t,e){return this.filter(er(t),e)},findEntry:function(t,e,n){var r=n;return this.__iterate((function(n,i,o){if(t.call(e,n,i,o))return r=[i,n],!1})),r},findKey:function(t,e){var n=this.findEntry(t,e);return n&&n[0]},findLast:function(t,e,n){return this.toKeyedSeq().reverse().find(t,e,n)},findLastEntry:function(t,e,n){return this.toKeyedSeq().reverse().findEntry(t,e,n)},findLastKey:function(t,e){return this.toKeyedSeq().reverse().findKey(t,e)},first:function(){return this.find(D)},flatMap:function(t,e){return yn(this,cn(this,t,e))},flatten:function(t){return yn(this,an(this,t,!0))},fromEntrySeq:function(){return new Xe(this)},get:function(t,e){return this.find((function(e,n){return gt(n,t)}),void 0,e)},getIn:function(t,e){for(var n,r=this,i=Ln(t);!(n=i.next()).done;){var o=n.value;if((r=r&&r.get?r.get(o,M):M)===M)return e}return r},groupBy:function(t,e){return nn(this,t,e)},has:function(t){return this.get(t,M)!==M},hasIn:function(t){return this.getIn(t,M)!==M},isSubset:function(t){return t=\"function\"==typeof t.includes?t:n(t),this.every((function(e){return t.includes(e)}))},isSuperset:function(t){return(t=\"function\"==typeof t.isSubset?t:n(t)).isSubset(this)},keyOf:function(t){return this.findKey((function(e){return gt(e,t)}))},keySeq:function(){return this.toSeq().map($n).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(t){return this.toKeyedSeq().reverse().keyOf(t)},max:function(t){return pn(this,t)},maxBy:function(t,e){return pn(this,e,t)},min:function(t){return pn(this,t?nr(t):or)},minBy:function(t,e){return pn(this,e?nr(e):or,t)},rest:function(){return this.slice(1)},skip:function(t){return this.slice(Math.max(0,t))},skipLast:function(t){return yn(this,this.toSeq().reverse().skip(t).reverse())},skipWhile:function(t,e){return yn(this,un(this,t,e,!0))},skipUntil:function(t,e){return this.skipWhile(er(t),e)},sortBy:function(t,e){return yn(this,ln(this,e,t))},take:function(t){return this.slice(0,Math.max(0,t))},takeLast:function(t){return yn(this,this.toSeq().reverse().take(t).reverse())},takeWhile:function(t,e){return yn(this,on(this,t,e))},takeUntil:function(t,e){return this.takeWhile(er(t),e)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=ur(this))}});var Hn=n.prototype;Hn[l]=!0,Hn[U]=Hn.values,Hn.__toJS=Hn.toArray,Hn.__toStringMapper=rr,Hn.inspect=Hn.toSource=function(){return this.toString()},Hn.chain=Hn.flatMap,Hn.contains=Hn.includes,Xn(r,{flip:function(){return yn(this,He(this))},mapEntries:function(t,e){var n=this,r=0;return yn(this,this.toSeq().map((function(i,o){return t.call(e,[o,i],r++,n)})).fromEntrySeq())},mapKeys:function(t,e){var n=this;return yn(this,this.toSeq().flip().map((function(r,i){return t.call(e,r,i,n)})).flip())}});var Kn=r.prototype;function $n(t,e){return e}function tr(t,e){return[e,t]}function er(t){return function(){return!t.apply(this,arguments)}}function nr(t){return function(){return-t.apply(this,arguments)}}function rr(t){return\"string\"==typeof t?JSON.stringify(t):String(t)}function ir(){return j(arguments)}function or(t,e){return t<e?1:t>e?-1:0}function ur(t){if(t.size===1/0)return 0;var e=f(t),n=s(t),r=e?1:0;return sr(t.__iterate(n?e?function(t,e){r=31*r+ar(Dt(t),Dt(e))|0}:function(t,e){r=r+ar(Dt(t),Dt(e))|0}:e?function(t){r=31*r+Dt(t)|0}:function(t){r=r+Dt(t)|0}),r)}function sr(t,e){return e=Nt(e,3432918353),e=Nt(e<<15|e>>>-15,461845907),e=Nt(e<<13|e>>>-13,5),e=Nt((e=(e+3864292196|0)^t)^e>>>16,2246822507),e=St((e=Nt(e^e>>>13,3266489909))^e>>>16)}function ar(t,e){return t^e+2654435769+(t<<6)+(t>>2)|0}return Kn[p]=!0,Kn[U]=Hn.entries,Kn.__toJS=Hn.toObject,Kn.__toStringMapper=function(t,e){return JSON.stringify(e)+\": \"+rr(t)},Xn(i,{toKeyedSeq:function(){return new Je(this,!1)},filter:function(t,e){return yn(this,tn(this,t,e,!1))},findIndex:function(t,e){var n=this.findEntry(t,e);return n?n[0]:-1},indexOf:function(t){var e=this.keyOf(t);return void 0===e?-1:e},lastIndexOf:function(t){var e=this.lastKeyOf(t);return void 0===e?-1:e},reverse:function(){return yn(this,$e(this,!1))},slice:function(t,e){return yn(this,rn(this,t,e,!1))},splice:function(t,e){var n=arguments.length;if(e=Math.max(0|e,0),0===n||2===n&&!e)return this;t=A(t,t<0?this.count():this.size);var r=this.slice(0,t);return yn(this,1===n?r:r.concat(j(arguments,2),this.slice(t+e)))},findLastIndex:function(t,e){var n=this.findLastEntry(t,e);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(t){return yn(this,an(this,t,!1))},get:function(t,e){return(t=S(this,t))<0||this.size===1/0||void 0!==this.size&&t>this.size?e:this.find((function(e,n){return n===t}),void 0,e)},has:function(t){return(t=S(this,t))>=0&&(void 0!==this.size?this.size===1/0||t<this.size:-1!==this.indexOf(t))},interpose:function(t){return yn(this,fn(this,t))},interleave:function(){var t=[this].concat(j(arguments)),e=dn(this.toSeq(),V.of,t),n=e.flatten(!0);return e.size&&(n.size=e.size*t.length),yn(this,n)},keySeq:function(){return _t(0,this.size)},last:function(){return this.get(-1)},skipWhile:function(t,e){return yn(this,un(this,t,e,!1))},zip:function(){return yn(this,dn(this,ir,[this].concat(j(arguments))))},zipWith:function(t){var e=j(arguments);return e[0]=this,yn(this,dn(this,t,e))}}),i.prototype[h]=!0,i.prototype[d]=!0,Xn(o,{get:function(t,e){return this.has(t)?t:e},includes:function(t){return this.has(t)},keySeq:function(){return this.valueSeq()}}),o.prototype.has=Hn.includes,o.prototype.contains=o.prototype.includes,Xn(Z,r.prototype),Xn(V,i.prototype),Xn(X,o.prototype),Xn(bt,r.prototype),Xn(xt,i.prototype),Xn(jt,o.prototype),{Iterable:n,Seq:J,Collection:Lt,Map:Gt,OrderedMap:Fe,List:xe,Stack:Bn,Set:In,OrderedSet:Yn,Record:bn,Range:_t,Repeat:Mt,is:gt,fromJS:ht}}()},function(t,e,n){\"use strict\";var r=n(13),i=n(104).f,o=n(237),u=n(10),s=n(106),a=n(24),c=n(21),f=function(t){var e=function(e,n,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,n)}return new t(e,n,r)}return t.apply(this,arguments)};return e.prototype=t.prototype,e};t.exports=function(t,e){var n,l,p,h,d,y,v,g,w=t.target,M=t.global,m=t.stat,_=t.proto,L=M?r:m?r[w]:(r[w]||{}).prototype,b=M?u:u[w]||(u[w]={}),x=b.prototype;for(p in e)n=!o(M?p:w+(m?\".\":\"#\")+p,t.forced)&&L&&c(L,p),d=b[p],n&&(y=t.noTargetGet?(g=i(L,p))&&g.value:L[p]),h=n&&y?y:e[p],n&&typeof d==typeof h||(v=t.bind&&n?s(h,r):t.wrap&&n?f(h):_&&\"function\"==typeof h?s(Function.call,h):h,(t.sham||h&&h.sham||d&&d.sham)&&a(v,\"sham\",!0),b[p]=v,_&&(c(u,l=w+\"Prototype\")||a(u,l,{}),u[l][p]=h,t.real&&x&&!x[p]&&a(x,p,h)))}},function(t,e,n){\"use strict\";t.exports=n(297)},function(t,e,n){t.exports=n(317)},function(t,e,n){var r=n(10),i=n(21),o=n(116),u=n(33).f;t.exports=function(t){var e=r.Symbol||(r.Symbol={});i(e,t)||u(e,t,{value:o.f(t)})}},function(t,e,n){t.exports=n(352)},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(13),i=n(110),o=n(21),u=n(112),s=n(115),a=n(161),c=i(\"wks\"),f=r.Symbol,l=a?f:f&&f.withoutSetter||u;t.exports=function(t){return o(c,t)&&(s||\"string\"==typeof c[t])||(s&&o(f,t)?c[t]=f[t]:c[t]=l(\"Symbol.\"+t)),c[t]}},function(t,e,n){var r=n(10);t.exports=function(t){return r[t+\"Prototype\"]}},function(t,e,n){t.exports=n(320)},function(t,e){t.exports={}},function(t,e,n){t.exports=n(325)},function(t,e,n){\"use strict\";(function(t){n.d(e,\"d\",(function(){return _})),n.d(e,\"c\",(function(){return L})),n.d(e,\"b\",(function(){return x})),n.d(e,\"e\",(function(){return j})),n.d(e,\"f\",(function(){return N})),n.d(e,\"a\",(function(){return S}));n(52),n(220);var r=n(18),i=n.n(r),o=(n(143),n(5)),u=n.n(o),s=n(11),a=n.n(s),c=(n(72),n(3),n(9)),f=n.n(c),l=(n(27),n(28)),p=n.n(l),h=(n(221),n(103),n(144)),d=n.n(h),y=(n(222),n(50),n(51),n(40),n(145),n(41),n(102),n(223),n(224),n(0)),v=n.n(y),g=(n(225),n(226),n(141),n(142)),w=n.n(g),M=(n(227),n(146),n(49),n(70),n(147),n(73)),m=(n(229),n(230),n(231),n(232),n(71),function(t){return v.a.Iterable.isIterable(t)});function _(t){return b(t)?m(t)?t.toJS():t:{}}function L(t){return u()(t)?t:[t]}function b(t){return!!t&&\"object\"===i()(t)}function x(t){return\"function\"==typeof t}w.a;var j=function(){var t={},e=M.a.location.search;if(!e)return{};if(\"\"!=e){var n=e.substr(1).split(\"&\");for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(r=n[r].split(\"=\"),t[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||\"\")}return t},N=function(t){var e;return a()(e=p()(t)).call(e,(function(e){return encodeURIComponent(e)+\"=\"+encodeURIComponent(t[e])})).join(\"&\")};function S(t,e){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if(\"object\"!==i()(t)||u()(t)||null===t||!e)return t;var o=d()({},t);return f()(n=p()(o)).call(n,(function(t){t===e&&r(o[t],t)?delete o[t]:o[t]=S(o[t],e,r)})),o}}).call(this,n(122).Buffer)},function(t,e,n){(function(e){var n=function(t){return t&&t.Math==Math&&t};t.exports=n(\"object\"==typeof globalThis&&globalThis)||n(\"object\"==typeof window&&window)||n(\"object\"==typeof self&&self)||n(\"object\"==typeof e&&e)||function(){return this}()||Function(\"return this\")()}).call(this,n(20))},function(t,e,n){var r=n(149);t.exports=function(t,e,n){return e in t?r(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){t.exports=function(t){return\"object\"==typeof t?null!==t:\"function\"==typeof t}},function(t,e){\"function\"==typeof Object.create?t.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(t,e){t.super_=e;var n=function(){};n.prototype=e.prototype,t.prototype=new n,t.prototype.constructor=t}},function(t,e,n){var r=n(122),i=r.Buffer;function o(t,e){for(var n in t)e[n]=t[n]}function u(t,e,n){return i(t,e,n)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?t.exports=r:(o(r,e),e.Buffer=u),o(i,u),u.from=function(t,e,n){if(\"number\"==typeof t)throw new TypeError(\"Argument must not be a number\");return i(t,e,n)},u.alloc=function(t,e,n){if(\"number\"!=typeof t)throw new TypeError(\"Argument must be a number\");var r=i(t);return void 0!==e?\"string\"==typeof n?r.fill(e,n):r.fill(e):r.fill(0),r},u.allocUnsafe=function(t){if(\"number\"!=typeof t)throw new TypeError(\"Argument must be a number\");return i(t)},u.allocUnsafeSlow=function(t){if(\"number\"!=typeof t)throw new TypeError(\"Argument must be a number\");return r.SlowBuffer(t)}},function(t,e,n){var r=n(80),i=n(291);function o(e){return\"function\"==typeof r&&\"symbol\"==typeof i?(t.exports=o=function(t){return typeof t},t.exports.default=t.exports,t.exports.__esModule=!0):(t.exports=o=function(t){return t&&\"function\"==typeof r&&t.constructor===r&&t!==r.prototype?\"symbol\":typeof t},t.exports.default=t.exports,t.exports.__esModule=!0),o(e)}t.exports=o,t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(42);t.exports=function(t){return Object(r(t))}},function(t,e){var n;n=function(){return this}();try{n=n||new Function(\"return this\")()}catch(t){\"object\"==typeof window&&(n=window)}t.exports=n},function(t,e,n){var r=n(19),i={}.hasOwnProperty;t.exports=Object.hasOwn||function(t,e){return i.call(r(t),e)}},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(6);t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(t,e,n){var r=n(23),i=n(33),o=n(54);t.exports=r?function(t,e,n){return i.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(186),i=\"object\"==typeof self&&self&&self.Object===Object&&self,o=r||i||Function(\"return this\")();t.exports=o},function(t,e){t.exports=function(t){if(void 0===t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return t},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){t.exports=n(356)},function(t,e,n){t.exports=n(360)},function(t,e,n){var r=n(15);t.exports=function(t){if(!r(t))throw TypeError(String(t)+\" is not an object\");return t}},function(t,e,n){var r=n(108),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},function(t,e,n){\"use strict\";t.exports=function(t){if(\"function\"!=typeof t)throw new TypeError(t+\" is not a function\");return t}},function(t,e,n){var r=n(74),i=n(42);t.exports=function(t){return r(i(t))}},function(t,e,n){var r=n(23),i=n(150),o=n(29),u=n(75),s=Object.defineProperty;e.f=r?s:function(t,e,n){if(o(t),e=u(e,!0),o(n),i)try{return s(t,e,n)}catch(t){}if(\"get\"in n||\"set\"in n)throw TypeError(\"Accessors not supported\");return\"value\"in n&&(t[e]=n.value),t}},function(t,e){var n,r,i=t.exports={};function o(){throw new Error(\"setTimeout has not been defined\")}function u(){throw new Error(\"clearTimeout has not been defined\")}function s(t){if(n===setTimeout)return setTimeout(t,0);if((n===o||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}!function(){try{n=\"function\"==typeof setTimeout?setTimeout:o}catch(t){n=o}try{r=\"function\"==typeof clearTimeout?clearTimeout:u}catch(t){r=u}}();var a,c=[],f=!1,l=-1;function p(){f&&a&&(f=!1,a.length?c=a.concat(c):l=-1,c.length&&h())}function h(){if(!f){var t=s(p);f=!0;for(var e=c.length;e;){for(a=c,c=[];++l<e;)a&&a[l].run();l=-1,e=c.length}a=null,f=!1,function(t){if(r===clearTimeout)return clearTimeout(t);if((r===u||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(t);try{r(t)}catch(e){try{return r.call(null,t)}catch(e){return r.call(this,t)}}}(t)}}function d(t,e){this.fun=t,this.array=e}function y(){}i.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];c.push(new d(t,e)),1!==c.length||f||s(h)},d.prototype.run=function(){this.fun.apply(null,this.array)},i.title=\"browser\",i.browser=!0,i.env={},i.argv=[],i.version=\"\",i.versions={},i.on=y,i.addListener=y,i.once=y,i.off=y,i.removeListener=y,i.removeAllListeners=y,i.emit=y,i.prependListener=y,i.prependOnceListener=y,i.listeners=function(t){return[]},i.binding=function(t){throw new Error(\"process.binding is not supported\")},i.cwd=function(){return\"/\"},i.chdir=function(t){throw new Error(\"process.chdir is not supported\")},i.umask=function(){return 0}},function(t,e,n){\"use strict\";var r=n(95),i=Object.keys||function(t){var e=[];for(var n in t)e.push(n);return e};t.exports=l;var o=n(69);o.inherits=n(16);var u=n(201),s=n(137);o.inherits(l,u);for(var a=i(s.prototype),c=0;c<a.length;c++){var f=a[c];l.prototype[f]||(l.prototype[f]=s.prototype[f])}function l(t){if(!(this instanceof l))return new l(t);u.call(this,t),s.call(this,t),t&&!1===t.readable&&(this.readable=!1),t&&!1===t.writable&&(this.writable=!1),this.allowHalfOpen=!0,t&&!1===t.allowHalfOpen&&(this.allowHalfOpen=!1),this.once(\"end\",p)}function p(){this.allowHalfOpen||this._writableState.ended||r.nextTick(h,this)}function h(t){t.end()}Object.defineProperty(l.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),Object.defineProperty(l.prototype,\"destroyed\",{get:function(){return void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed&&this._writableState.destroyed)},set:function(t){void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed=t,this._writableState.destroyed=t)}}),l.prototype._destroy=function(t,e){this.push(null),this.end(),r.nextTick(e,t)}},function(t,e,n){\"use strict\";var r=n(534)();t.exports=function(t){return t!==r&&null!==t}},function(t,e,n){\"use strict\";var r=n(535),i=Math.max;t.exports=function(t){return i(0,r(t))}},function(t,e,n){},function(t,e,n){\"use strict\";var r=n(212),i=n(549),o=n(209),u=n(207),s=n(553);(t.exports=function(t,e){var n,i,a,c,f;return arguments.length<2||\"string\"!=typeof t?(c=e,e=t,t=null):c=arguments[2],r(t)?(n=s.call(t,\"c\"),i=s.call(t,\"e\"),a=s.call(t,\"w\")):(n=a=!0,i=!1),f={value:e,configurable:n,enumerable:i,writable:a},c?o(u(c),f):f}).gs=function(t,e,n){var a,c,f,l;return\"string\"!=typeof t?(f=n,n=e,e=t,t=null):f=arguments[3],r(e)?i(e)?r(n)?i(n)||(f=n,n=void 0):n=void 0:(f=e,e=n=void 0):e=void 0,r(t)?(a=s.call(t,\"c\"),c=s.call(t,\"e\")):(a=!0,c=!1),l={get:e,set:n,configurable:a,enumerable:c},f?o(u(f),l):l}},function(t,e,n){t.exports=n(390)},function(t,e,n){t.exports=n(400)},function(t,e){t.exports=function(t){if(null==t)throw TypeError(\"Can't call method on \"+t);return t}},function(t,e,n){var r=n(106),i=n(74),o=n(19),u=n(30),s=n(160),a=[].push,c=function(t){var e=1==t,n=2==t,c=3==t,f=4==t,l=6==t,p=7==t,h=5==t||l;return function(d,y,v,g){for(var w,M,m=o(d),_=i(m),L=r(y,v,3),b=u(_.length),x=0,j=g||s,N=e?j(d,b):n||p?j(d,0):void 0;b>x;x++)if((h||x in _)&&(M=L(w=_[x],x,m),t))if(e)N[x]=M;else if(M)switch(t){case 3:return!0;case 5:return w;case 6:return x;case 2:a.call(N,w)}else switch(t){case 4:return!1;case 7:a.call(N,w)}return l?-1:c||f?f:N}};t.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},function(t,e){t.exports={}},function(t,e,n){\"use strict\";var r=n(62),i=n(173),o=(n(121),n(172),Object.prototype.hasOwnProperty),u=n(174),s={key:!0,ref:!0,__self:!0,__source:!0};function a(t){return void 0!==t.ref}function c(t){return void 0!==t.key}var f=function(t,e,n,r,i,o,s){return{$$typeof:u,type:t,key:e,ref:n,props:s,_owner:o}};f.createElement=function(t,e,n){var r,u={},l=null,p=null;if(null!=e)for(r in a(e)&&(p=e.ref),c(e)&&(l=\"\"+e.key),void 0===e.__self?null:e.__self,void 0===e.__source?null:e.__source,e)o.call(e,r)&&!s.hasOwnProperty(r)&&(u[r]=e[r]);var h=arguments.length-2;if(1===h)u.children=n;else if(h>1){for(var d=Array(h),y=0;y<h;y++)d[y]=arguments[y+2];0,u.children=d}if(t&&t.defaultProps){var v=t.defaultProps;for(r in v)void 0===u[r]&&(u[r]=v[r])}return f(t,l,p,0,0,i.current,u)},f.createFactory=function(t){var e=f.createElement.bind(null,t);return e.type=t,e},f.cloneAndReplaceKey=function(t,e){return f(t.type,e,t.ref,t._self,t._source,t._owner,t.props)},f.cloneElement=function(t,e,n){var u,l,p=r({},t.props),h=t.key,d=t.ref,y=(t._self,t._source,t._owner);if(null!=e)for(u in a(e)&&(d=e.ref,y=i.current),c(e)&&(h=\"\"+e.key),t.type&&t.type.defaultProps&&(l=t.type.defaultProps),e)o.call(e,u)&&!s.hasOwnProperty(u)&&(void 0===e[u]&&void 0!==l?p[u]=l[u]:p[u]=e[u]);var v=arguments.length-2;if(1===v)p.children=n;else if(v>1){for(var g=Array(v),w=0;w<v;w++)g[w]=arguments[w+2];p.children=g}return f(t.type,h,d,0,0,y,p)},f.isValidElement=function(t){return\"object\"==typeof t&&null!==t&&t.$$typeof===u},t.exports=f},function(t,e,n){var r=n(441),i=n(444);t.exports=function(t,e){var n=i(t,e);return r(n)?n:void 0}},function(t,e,n){\"use strict\";var r=n(36);t.exports=function(t){if(!r(t))throw new TypeError(\"Cannot use null or undefined\");return t}},function(t,e,n){var r=n(17).Buffer;function i(t,e){this._block=r.alloc(t),this._finalSize=e,this._blockSize=t,this._len=0}i.prototype.update=function(t,e){\"string\"==typeof t&&(e=e||\"utf8\",t=r.from(t,e));for(var n=this._block,i=this._blockSize,o=t.length,u=this._len,s=0;s<o;){for(var a=u%i,c=Math.min(o-s,i-a),f=0;f<c;f++)n[a+f]=t[s+f];s+=c,(u+=c)%i==0&&this._update(n)}return this._len+=o,this},i.prototype.digest=function(t){var e=this._len%this._blockSize;this._block[e]=128,this._block.fill(0,e+1),e>=this._finalSize&&(this._update(this._block),this._block.fill(0));var n=8*this._len;if(n<=4294967295)this._block.writeUInt32BE(n,this._blockSize-4);else{var r=(4294967295&n)>>>0,i=(n-r)/4294967296;this._block.writeUInt32BE(i,this._blockSize-8),this._block.writeUInt32BE(r,this._blockSize-4)}this._update(this._block);var o=this._hash();return t?o.toString(t):o},i.prototype._update=function(){throw new Error(\"_update must be implemented by subclass\")},t.exports=i},function(t,e){t.exports=function(t,e){return t===e||t!=t&&e!=e}},function(t,e,n){t.exports=n(385)},function(t,e,n){t.exports=n(386)},function(t,e,n){var r=n(331),i=n(334),o=n(125),u=n(348);t.exports=function(t){return r(t)||i(t)||o(t)||u()},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(194),i=n(196),o=n(129),u=n(22),s=n(68),a=n(130),c=n(195),f=n(132),l=Object.prototype.hasOwnProperty;t.exports=function(t){if(null==t)return!0;if(s(t)&&(u(t)||\"string\"==typeof t||\"function\"==typeof t.splice||a(t)||f(t)||o(t)))return!t.length;var e=i(t);if(\"[object Map]\"==e||\"[object Set]\"==e)return!t.size;if(c(t))return!r(t).length;for(var n in t)if(l.call(t,n))return!1;return!0}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e){t.exports=function(t){if(\"function\"!=typeof t)throw TypeError(String(t)+\" is not a function\");return t}},function(t,e,n){var r=n(10),i=n(13),o=function(t){return\"function\"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?o(r[t])||o(i[t]):r[t]&&r[t][e]||i[t]&&i[t][e]}},function(t,e){t.exports=!0},function(t,e,n){var r=n(55);t.exports=Array.isArray||function(t){return\"Array\"==r(t)}},function(t,e,n){var r,i,o=n(13),u=n(81),s=o.process,a=s&&s.versions,c=a&&a.v8;c?i=(r=c.split(\".\"))[0]<4?1:r[0]+r[1]:u&&(!(r=u.match(/Edge\\/(\\d+)/))||r[1]>=74)&&(r=u.match(/Chrome\\/(\\d+)/))&&(i=r[1]),t.exports=i&&+i},function(t,e,n){var r=n(117),i=n(55),o=n(7)(\"toStringTag\"),u=\"Arguments\"==i(function(){return arguments}());t.exports=r?i:function(t){var e,n,r;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),o))?n:u?i(e):\"Object\"==(r=i(e))&&\"function\"==typeof e.callee?\"Arguments\":r}},function(t,e,n){\"use strict\";var r=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable;function u(t){if(null==t)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(t)}t.exports=function(){try{if(!Object.assign)return!1;var t=new String(\"abc\");if(t[5]=\"de\",\"5\"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},n=0;n<10;n++)e[\"_\"+String.fromCharCode(n)]=n;if(\"0123456789\"!==Object.getOwnPropertyNames(e).map((function(t){return e[t]})).join(\"\"))return!1;var r={};return\"abcdefghijklmnopqrst\".split(\"\").forEach((function(t){r[t]=t})),\"abcdefghijklmnopqrst\"===Object.keys(Object.assign({},r)).join(\"\")}catch(t){return!1}}()?Object.assign:function(t,e){for(var n,s,a=u(t),c=1;c<arguments.length;c++){for(var f in n=Object(arguments[c]))i.call(n,f)&&(a[f]=n[f]);if(r){s=r(n);for(var l=0;l<s.length;l++)o.call(n,s[l])&&(a[s[l]]=n[s[l]])}}return a}},function(t,e,n){\"use strict\";var r=n(6);t.exports=function(t,e){var n=[][t];return!!n&&r((function(){n.call(null,e||function(){throw 1},1)}))}},function(t,e,n){var r=n(419);t.exports=function(t){return null==t?\"\":r(t)}},function(t,e,n){var r=n(87),i=n(421),o=n(422),u=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?\"[object Undefined]\":\"[object Null]\":u&&u in Object(t)?i(t):o(t)}},function(t,e){t.exports=function(t){return null!=t&&\"object\"==typeof t}},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&(\"object\"==e||\"function\"==e)}},function(t,e,n){var r=n(70),i=n(133);t.exports=function(t){return null!=t&&i(t.length)&&!r(t)}},function(t,e,n){(function(t){function n(t){return Object.prototype.toString.call(t)}e.isArray=function(t){return Array.isArray?Array.isArray(t):\"[object Array]\"===n(t)},e.isBoolean=function(t){return\"boolean\"==typeof t},e.isNull=function(t){return null===t},e.isNullOrUndefined=function(t){return null==t},e.isNumber=function(t){return\"number\"==typeof t},e.isString=function(t){return\"string\"==typeof t},e.isSymbol=function(t){return\"symbol\"==typeof t},e.isUndefined=function(t){return void 0===t},e.isRegExp=function(t){return\"[object RegExp]\"===n(t)},e.isObject=function(t){return\"object\"==typeof t&&null!==t},e.isDate=function(t){return\"[object Date]\"===n(t)},e.isError=function(t){return\"[object Error]\"===n(t)||t instanceof Error},e.isFunction=function(t){return\"function\"==typeof t},e.isPrimitive=function(t){return null===t||\"boolean\"==typeof t||\"number\"==typeof t||\"string\"==typeof t||\"symbol\"==typeof t||void 0===t},e.isBuffer=t.isBuffer}).call(this,n(122).Buffer)},function(t,e,n){var r=n(65),i=n(67);t.exports=function(t){if(!i(t))return!1;var e=r(t);return\"[object Function]\"==e||\"[object GeneratorFunction]\"==e||\"[object AsyncFunction]\"==e||\"[object Proxy]\"==e}},function(t,e,n){\"use strict\";function r(t){return null==t}var i={isNothing:r,isObject:function(t){return\"object\"==typeof t&&null!==t},toArray:function(t){return Array.isArray(t)?t:r(t)?[]:[t]},repeat:function(t,e){var n,r=\"\";for(n=0;n<e;n+=1)r+=t;return r},isNegativeZero:function(t){return 0===t&&Number.NEGATIVE_INFINITY===1/t},extend:function(t,e){var n,r,i,o;if(e)for(n=0,r=(o=Object.keys(e)).length;n<r;n+=1)t[i=o[n]]=e[i];return t}};function o(t,e){var n=\"\",r=t.reason||\"(unknown reason)\";return t.mark?(t.mark.name&&(n+='in \"'+t.mark.name+'\" '),n+=\"(\"+(t.mark.line+1)+\":\"+(t.mark.column+1)+\")\",!e&&t.mark.snippet&&(n+=\"\\n\\n\"+t.mark.snippet),r+\" \"+n):r}function u(t,e){Error.call(this),this.name=\"YAMLException\",this.reason=t,this.mark=e,this.message=o(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||\"\"}u.prototype=Object.create(Error.prototype),u.prototype.constructor=u,u.prototype.toString=function(t){return this.name+\": \"+o(this,t)};var s=u;function a(t,e,n,r,i){var o=\"\",u=\"\",s=Math.floor(i/2)-1;return r-e>s&&(e=r-s+(o=\" ... \").length),n-r>s&&(n=r+s-(u=\" ...\").length),{str:o+t.slice(e,n).replace(/\\t/g,\"→\")+u,pos:r-e+o.length}}function c(t,e){return i.repeat(\" \",e-t.length)+t}var f=function(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),\"number\"!=typeof e.indent&&(e.indent=1),\"number\"!=typeof e.linesBefore&&(e.linesBefore=3),\"number\"!=typeof e.linesAfter&&(e.linesAfter=2);for(var n,r=/\\r?\\n|\\r|\\0/g,o=[0],u=[],s=-1;n=r.exec(t.buffer);)u.push(n.index),o.push(n.index+n[0].length),t.position<=n.index&&s<0&&(s=o.length-2);s<0&&(s=o.length-1);var f,l,p=\"\",h=Math.min(t.line+e.linesAfter,u.length).toString().length,d=e.maxLength-(e.indent+h+3);for(f=1;f<=e.linesBefore&&!(s-f<0);f++)l=a(t.buffer,o[s-f],u[s-f],t.position-(o[s]-o[s-f]),d),p=i.repeat(\" \",e.indent)+c((t.line-f+1).toString(),h)+\" | \"+l.str+\"\\n\"+p;for(l=a(t.buffer,o[s],u[s],t.position,d),p+=i.repeat(\" \",e.indent)+c((t.line+1).toString(),h)+\" | \"+l.str+\"\\n\",p+=i.repeat(\"-\",e.indent+h+3+l.pos)+\"^\\n\",f=1;f<=e.linesAfter&&!(s+f>=u.length);f++)l=a(t.buffer,o[s+f],u[s+f],t.position-(o[s]-o[s+f]),d),p+=i.repeat(\" \",e.indent)+c((t.line+f+1).toString(),h)+\" | \"+l.str+\"\\n\";return p.replace(/\\n$/,\"\")},l=[\"kind\",\"multi\",\"resolve\",\"construct\",\"instanceOf\",\"predicate\",\"represent\",\"representName\",\"defaultStyle\",\"styleAliases\"],p=[\"scalar\",\"sequence\",\"mapping\"];var h=function(t,e){if(e=e||{},Object.keys(e).forEach((function(e){if(-1===l.indexOf(e))throw new s('Unknown option \"'+e+'\" is met in definition of \"'+t+'\" YAML type.')})),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=function(t){var e={};return null!==t&&Object.keys(t).forEach((function(n){t[n].forEach((function(t){e[String(t)]=n}))})),e}(e.styleAliases||null),-1===p.indexOf(this.kind))throw new s('Unknown kind \"'+this.kind+'\" is specified for \"'+t+'\" YAML type.')};function d(t,e){var n=[];return t[e].forEach((function(t){var e=n.length;n.forEach((function(n,r){n.tag===t.tag&&n.kind===t.kind&&n.multi===t.multi&&(e=r)})),n[e]=t})),n}function y(t){return this.extend(t)}y.prototype.extend=function(t){var e=[],n=[];if(t instanceof h)n.push(t);else if(Array.isArray(t))n=n.concat(t);else{if(!t||!Array.isArray(t.implicit)&&!Array.isArray(t.explicit))throw new s(\"Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })\");t.implicit&&(e=e.concat(t.implicit)),t.explicit&&(n=n.concat(t.explicit))}e.forEach((function(t){if(!(t instanceof h))throw new s(\"Specified list of YAML types (or a single Type object) contains a non-Type object.\");if(t.loadKind&&\"scalar\"!==t.loadKind)throw new s(\"There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.\");if(t.multi)throw new s(\"There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.\")})),n.forEach((function(t){if(!(t instanceof h))throw new s(\"Specified list of YAML types (or a single Type object) contains a non-Type object.\")}));var r=Object.create(y.prototype);return r.implicit=(this.implicit||[]).concat(e),r.explicit=(this.explicit||[]).concat(n),r.compiledImplicit=d(r,\"implicit\"),r.compiledExplicit=d(r,\"explicit\"),r.compiledTypeMap=function(){var t,e,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function r(t){t.multi?(n.multi[t.kind].push(t),n.multi.fallback.push(t)):n[t.kind][t.tag]=n.fallback[t.tag]=t}for(t=0,e=arguments.length;t<e;t+=1)arguments[t].forEach(r);return n}(r.compiledImplicit,r.compiledExplicit),r};var v=y,g=new h(\"tag:yaml.org,2002:str\",{kind:\"scalar\",construct:function(t){return null!==t?t:\"\"}}),w=new h(\"tag:yaml.org,2002:seq\",{kind:\"sequence\",construct:function(t){return null!==t?t:[]}}),M=new h(\"tag:yaml.org,2002:map\",{kind:\"mapping\",construct:function(t){return null!==t?t:{}}}),m=new v({explicit:[g,w,M]});var _=new h(\"tag:yaml.org,2002:null\",{kind:\"scalar\",resolve:function(t){if(null===t)return!0;var e=t.length;return 1===e&&\"~\"===t||4===e&&(\"null\"===t||\"Null\"===t||\"NULL\"===t)},construct:function(){return null},predicate:function(t){return null===t},represent:{canonical:function(){return\"~\"},lowercase:function(){return\"null\"},uppercase:function(){return\"NULL\"},camelcase:function(){return\"Null\"},empty:function(){return\"\"}},defaultStyle:\"lowercase\"});var L=new h(\"tag:yaml.org,2002:bool\",{kind:\"scalar\",resolve:function(t){if(null===t)return!1;var e=t.length;return 4===e&&(\"true\"===t||\"True\"===t||\"TRUE\"===t)||5===e&&(\"false\"===t||\"False\"===t||\"FALSE\"===t)},construct:function(t){return\"true\"===t||\"True\"===t||\"TRUE\"===t},predicate:function(t){return\"[object Boolean]\"===Object.prototype.toString.call(t)},represent:{lowercase:function(t){return t?\"true\":\"false\"},uppercase:function(t){return t?\"TRUE\":\"FALSE\"},camelcase:function(t){return t?\"True\":\"False\"}},defaultStyle:\"lowercase\"});function b(t){return 48<=t&&t<=55}function x(t){return 48<=t&&t<=57}var j=new h(\"tag:yaml.org,2002:int\",{kind:\"scalar\",resolve:function(t){if(null===t)return!1;var e,n,r=t.length,i=0,o=!1;if(!r)return!1;if(\"-\"!==(e=t[i])&&\"+\"!==e||(e=t[++i]),\"0\"===e){if(i+1===r)return!0;if(\"b\"===(e=t[++i])){for(i++;i<r;i++)if(\"_\"!==(e=t[i])){if(\"0\"!==e&&\"1\"!==e)return!1;o=!0}return o&&\"_\"!==e}if(\"x\"===e){for(i++;i<r;i++)if(\"_\"!==(e=t[i])){if(!(48<=(n=t.charCodeAt(i))&&n<=57||65<=n&&n<=70||97<=n&&n<=102))return!1;o=!0}return o&&\"_\"!==e}if(\"o\"===e){for(i++;i<r;i++)if(\"_\"!==(e=t[i])){if(!b(t.charCodeAt(i)))return!1;o=!0}return o&&\"_\"!==e}}if(\"_\"===e)return!1;for(;i<r;i++)if(\"_\"!==(e=t[i])){if(!x(t.charCodeAt(i)))return!1;o=!0}return!(!o||\"_\"===e)},construct:function(t){var e,n=t,r=1;if(-1!==n.indexOf(\"_\")&&(n=n.replace(/_/g,\"\")),\"-\"!==(e=n[0])&&\"+\"!==e||(\"-\"===e&&(r=-1),e=(n=n.slice(1))[0]),\"0\"===n)return 0;if(\"0\"===e){if(\"b\"===n[1])return r*parseInt(n.slice(2),2);if(\"x\"===n[1])return r*parseInt(n.slice(2),16);if(\"o\"===n[1])return r*parseInt(n.slice(2),8)}return r*parseInt(n,10)},predicate:function(t){return\"[object Number]\"===Object.prototype.toString.call(t)&&t%1==0&&!i.isNegativeZero(t)},represent:{binary:function(t){return t>=0?\"0b\"+t.toString(2):\"-0b\"+t.toString(2).slice(1)},octal:function(t){return t>=0?\"0o\"+t.toString(8):\"-0o\"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?\"0x\"+t.toString(16).toUpperCase():\"-0x\"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:\"decimal\",styleAliases:{binary:[2,\"bin\"],octal:[8,\"oct\"],decimal:[10,\"dec\"],hexadecimal:[16,\"hex\"]}}),N=new RegExp(\"^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");var S=/^[-+]?[0-9]+e/;var D=new h(\"tag:yaml.org,2002:float\",{kind:\"scalar\",resolve:function(t){return null!==t&&!(!N.test(t)||\"_\"===t[t.length-1])},construct:function(t){var e,n;return n=\"-\"===(e=t.replace(/_/g,\"\").toLowerCase())[0]?-1:1,\"+-\".indexOf(e[0])>=0&&(e=e.slice(1)),\".inf\"===e?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:\".nan\"===e?NaN:n*parseFloat(e,10)},predicate:function(t){return\"[object Number]\"===Object.prototype.toString.call(t)&&(t%1!=0||i.isNegativeZero(t))},represent:function(t,e){var n;if(isNaN(t))switch(e){case\"lowercase\":return\".nan\";case\"uppercase\":return\".NAN\";case\"camelcase\":return\".NaN\"}else if(Number.POSITIVE_INFINITY===t)switch(e){case\"lowercase\":return\".inf\";case\"uppercase\":return\".INF\";case\"camelcase\":return\".Inf\"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case\"lowercase\":return\"-.inf\";case\"uppercase\":return\"-.INF\";case\"camelcase\":return\"-.Inf\"}else if(i.isNegativeZero(t))return\"-0.0\";return n=t.toString(10),S.test(n)?n.replace(\"e\",\".e\"):n},defaultStyle:\"lowercase\"}),I=m.extend({implicit:[_,L,j,D]}),A=I,O=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\"),T=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");var C=new h(\"tag:yaml.org,2002:timestamp\",{kind:\"scalar\",resolve:function(t){return null!==t&&(null!==O.exec(t)||null!==T.exec(t))},construct:function(t){var e,n,r,i,o,u,s,a,c=0,f=null;if(null===(e=O.exec(t))&&(e=T.exec(t)),null===e)throw new Error(\"Date resolve error\");if(n=+e[1],r=+e[2]-1,i=+e[3],!e[4])return new Date(Date.UTC(n,r,i));if(o=+e[4],u=+e[5],s=+e[6],e[7]){for(c=e[7].slice(0,3);c.length<3;)c+=\"0\";c=+c}return e[9]&&(f=6e4*(60*+e[10]+ +(e[11]||0)),\"-\"===e[9]&&(f=-f)),a=new Date(Date.UTC(n,r,i,o,u,s,c)),f&&a.setTime(a.getTime()-f),a},instanceOf:Date,represent:function(t){return t.toISOString()}});var E=new h(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:function(t){return\"<<\"===t||null===t}}),z=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r\";var k=new h(\"tag:yaml.org,2002:binary\",{kind:\"scalar\",resolve:function(t){if(null===t)return!1;var e,n,r=0,i=t.length,o=z;for(n=0;n<i;n++)if(!((e=o.indexOf(t.charAt(n)))>64)){if(e<0)return!1;r+=6}return r%8==0},construct:function(t){var e,n,r=t.replace(/[\\r\\n=]/g,\"\"),i=r.length,o=z,u=0,s=[];for(e=0;e<i;e++)e%4==0&&e&&(s.push(u>>16&255),s.push(u>>8&255),s.push(255&u)),u=u<<6|o.indexOf(r.charAt(e));return 0===(n=i%4*6)?(s.push(u>>16&255),s.push(u>>8&255),s.push(255&u)):18===n?(s.push(u>>10&255),s.push(u>>2&255)):12===n&&s.push(u>>4&255),new Uint8Array(s)},predicate:function(t){return\"[object Uint8Array]\"===Object.prototype.toString.call(t)},represent:function(t){var e,n,r=\"\",i=0,o=t.length,u=z;for(e=0;e<o;e++)e%3==0&&e&&(r+=u[i>>18&63],r+=u[i>>12&63],r+=u[i>>6&63],r+=u[63&i]),i=(i<<8)+t[e];return 0===(n=o%3)?(r+=u[i>>18&63],r+=u[i>>12&63],r+=u[i>>6&63],r+=u[63&i]):2===n?(r+=u[i>>10&63],r+=u[i>>4&63],r+=u[i<<2&63],r+=u[64]):1===n&&(r+=u[i>>2&63],r+=u[i<<4&63],r+=u[64],r+=u[64]),r}}),Y=Object.prototype.hasOwnProperty,U=Object.prototype.toString;var P=new h(\"tag:yaml.org,2002:omap\",{kind:\"sequence\",resolve:function(t){if(null===t)return!0;var e,n,r,i,o,u=[],s=t;for(e=0,n=s.length;e<n;e+=1){if(r=s[e],o=!1,\"[object Object]\"!==U.call(r))return!1;for(i in r)if(Y.call(r,i)){if(o)return!1;o=!0}if(!o)return!1;if(-1!==u.indexOf(i))return!1;u.push(i)}return!0},construct:function(t){return null!==t?t:[]}}),R=Object.prototype.toString;var Q=new h(\"tag:yaml.org,2002:pairs\",{kind:\"sequence\",resolve:function(t){if(null===t)return!0;var e,n,r,i,o,u=t;for(o=new Array(u.length),e=0,n=u.length;e<n;e+=1){if(r=u[e],\"[object Object]\"!==R.call(r))return!1;if(1!==(i=Object.keys(r)).length)return!1;o[e]=[i[0],r[i[0]]]}return!0},construct:function(t){if(null===t)return[];var e,n,r,i,o,u=t;for(o=new Array(u.length),e=0,n=u.length;e<n;e+=1)r=u[e],i=Object.keys(r),o[e]=[i[0],r[i[0]]];return o}}),F=Object.prototype.hasOwnProperty;var B=new h(\"tag:yaml.org,2002:set\",{kind:\"mapping\",resolve:function(t){if(null===t)return!0;var e,n=t;for(e in n)if(F.call(n,e)&&null!==n[e])return!1;return!0},construct:function(t){return null!==t?t:{}}}),G=A.extend({implicit:[C,E],explicit:[k,P,Q,B]}),W=Object.prototype.hasOwnProperty,q=/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,J=/[\\x85\\u2028\\u2029]/,Z=/[,\\[\\]\\{\\}]/,V=/^(?:!|!!|![a-z\\-]+!)$/i,X=/^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;function H(t){return Object.prototype.toString.call(t)}function K(t){return 10===t||13===t}function $(t){return 9===t||32===t}function tt(t){return 9===t||32===t||10===t||13===t}function et(t){return 44===t||91===t||93===t||123===t||125===t}function nt(t){var e;return 48<=t&&t<=57?t-48:97<=(e=32|t)&&e<=102?e-97+10:-1}function rt(t){return 48===t?\"\\0\":97===t?\"\u0007\":98===t?\"\\b\":116===t||9===t?\"\\t\":110===t?\"\\n\":118===t?\"\\v\":102===t?\"\\f\":114===t?\"\\r\":101===t?\"\u001b\":32===t?\" \":34===t?'\"':47===t?\"/\":92===t?\"\\\\\":78===t?\"\":95===t?\" \":76===t?\"\\u2028\":80===t?\"\\u2029\":\"\"}function it(t){return t<=65535?String.fromCharCode(t):String.fromCharCode(55296+(t-65536>>10),56320+(t-65536&1023))}for(var ot=new Array(256),ut=new Array(256),st=0;st<256;st++)ot[st]=rt(st)?1:0,ut[st]=rt(st);function at(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||G,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function ct(t,e){var n={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return n.snippet=f(n),new s(e,n)}function ft(t,e){throw ct(t,e)}function lt(t,e){t.onWarning&&t.onWarning.call(null,ct(t,e))}var pt={YAML:function(t,e,n){var r,i,o;null!==t.version&&ft(t,\"duplication of %YAML directive\"),1!==n.length&&ft(t,\"YAML directive accepts exactly one argument\"),null===(r=/^([0-9]+)\\.([0-9]+)$/.exec(n[0]))&&ft(t,\"ill-formed argument of the YAML directive\"),i=parseInt(r[1],10),o=parseInt(r[2],10),1!==i&&ft(t,\"unacceptable YAML version of the document\"),t.version=n[0],t.checkLineBreaks=o<2,1!==o&&2!==o&&lt(t,\"unsupported YAML version of the document\")},TAG:function(t,e,n){var r,i;2!==n.length&&ft(t,\"TAG directive accepts exactly two arguments\"),r=n[0],i=n[1],V.test(r)||ft(t,\"ill-formed tag handle (first argument) of the TAG directive\"),W.call(t.tagMap,r)&&ft(t,'there is a previously declared suffix for \"'+r+'\" tag handle'),X.test(i)||ft(t,\"ill-formed tag prefix (second argument) of the TAG directive\");try{i=decodeURIComponent(i)}catch(e){ft(t,\"tag prefix is malformed: \"+i)}t.tagMap[r]=i}};function ht(t,e,n,r){var i,o,u,s;if(e<n){if(s=t.input.slice(e,n),r)for(i=0,o=s.length;i<o;i+=1)9===(u=s.charCodeAt(i))||32<=u&&u<=1114111||ft(t,\"expected valid JSON character\");else q.test(s)&&ft(t,\"the stream contains non-printable characters\");t.result+=s}}function dt(t,e,n,r){var o,u,s,a;for(i.isObject(n)||ft(t,\"cannot merge mappings; the provided source object is unacceptable\"),s=0,a=(o=Object.keys(n)).length;s<a;s+=1)u=o[s],W.call(e,u)||(e[u]=n[u],r[u]=!0)}function yt(t,e,n,r,i,o,u,s,a){var c,f;if(Array.isArray(i))for(c=0,f=(i=Array.prototype.slice.call(i)).length;c<f;c+=1)Array.isArray(i[c])&&ft(t,\"nested arrays are not supported inside keys\"),\"object\"==typeof i&&\"[object Object]\"===H(i[c])&&(i[c]=\"[object Object]\");if(\"object\"==typeof i&&\"[object Object]\"===H(i)&&(i=\"[object Object]\"),i=String(i),null===e&&(e={}),\"tag:yaml.org,2002:merge\"===r)if(Array.isArray(o))for(c=0,f=o.length;c<f;c+=1)dt(t,e,o[c],n);else dt(t,e,o,n);else t.json||W.call(n,i)||!W.call(e,i)||(t.line=u||t.line,t.lineStart=s||t.lineStart,t.position=a||t.position,ft(t,\"duplicated mapping key\")),\"__proto__\"===i?Object.defineProperty(e,i,{configurable:!0,enumerable:!0,writable:!0,value:o}):e[i]=o,delete n[i];return e}function vt(t){var e;10===(e=t.input.charCodeAt(t.position))?t.position++:13===e?(t.position++,10===t.input.charCodeAt(t.position)&&t.position++):ft(t,\"a line break is expected\"),t.line+=1,t.lineStart=t.position,t.firstTabInLine=-1}function gt(t,e,n){for(var r=0,i=t.input.charCodeAt(t.position);0!==i;){for(;$(i);)9===i&&-1===t.firstTabInLine&&(t.firstTabInLine=t.position),i=t.input.charCodeAt(++t.position);if(e&&35===i)do{i=t.input.charCodeAt(++t.position)}while(10!==i&&13!==i&&0!==i);if(!K(i))break;for(vt(t),i=t.input.charCodeAt(t.position),r++,t.lineIndent=0;32===i;)t.lineIndent++,i=t.input.charCodeAt(++t.position)}return-1!==n&&0!==r&&t.lineIndent<n&&lt(t,\"deficient indentation\"),r}function wt(t){var e,n=t.position;return!(45!==(e=t.input.charCodeAt(n))&&46!==e||e!==t.input.charCodeAt(n+1)||e!==t.input.charCodeAt(n+2)||(n+=3,0!==(e=t.input.charCodeAt(n))&&!tt(e)))}function Mt(t,e){1===e?t.result+=\" \":e>1&&(t.result+=i.repeat(\"\\n\",e-1))}function mt(t,e){var n,r,i=t.tag,o=t.anchor,u=[],s=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=u),r=t.input.charCodeAt(t.position);0!==r&&(-1!==t.firstTabInLine&&(t.position=t.firstTabInLine,ft(t,\"tab characters must not be used in indentation\")),45===r)&&tt(t.input.charCodeAt(t.position+1));)if(s=!0,t.position++,gt(t,!0,-1)&&t.lineIndent<=e)u.push(null),r=t.input.charCodeAt(t.position);else if(n=t.line,bt(t,e,3,!1,!0),u.push(t.result),gt(t,!0,-1),r=t.input.charCodeAt(t.position),(t.line===n||t.lineIndent>e)&&0!==r)ft(t,\"bad indentation of a sequence entry\");else if(t.lineIndent<e)break;return!!s&&(t.tag=i,t.anchor=o,t.kind=\"sequence\",t.result=u,!0)}function _t(t){var e,n,r,i,o=!1,u=!1;if(33!==(i=t.input.charCodeAt(t.position)))return!1;if(null!==t.tag&&ft(t,\"duplication of a tag property\"),60===(i=t.input.charCodeAt(++t.position))?(o=!0,i=t.input.charCodeAt(++t.position)):33===i?(u=!0,n=\"!!\",i=t.input.charCodeAt(++t.position)):n=\"!\",e=t.position,o){do{i=t.input.charCodeAt(++t.position)}while(0!==i&&62!==i);t.position<t.length?(r=t.input.slice(e,t.position),i=t.input.charCodeAt(++t.position)):ft(t,\"unexpected end of the stream within a verbatim tag\")}else{for(;0!==i&&!tt(i);)33===i&&(u?ft(t,\"tag suffix cannot contain exclamation marks\"):(n=t.input.slice(e-1,t.position+1),V.test(n)||ft(t,\"named tag handle cannot contain such characters\"),u=!0,e=t.position+1)),i=t.input.charCodeAt(++t.position);r=t.input.slice(e,t.position),Z.test(r)&&ft(t,\"tag suffix cannot contain flow indicator characters\")}r&&!X.test(r)&&ft(t,\"tag name cannot contain such characters: \"+r);try{r=decodeURIComponent(r)}catch(e){ft(t,\"tag name is malformed: \"+r)}return o?t.tag=r:W.call(t.tagMap,n)?t.tag=t.tagMap[n]+r:\"!\"===n?t.tag=\"!\"+r:\"!!\"===n?t.tag=\"tag:yaml.org,2002:\"+r:ft(t,'undeclared tag handle \"'+n+'\"'),!0}function Lt(t){var e,n;if(38!==(n=t.input.charCodeAt(t.position)))return!1;for(null!==t.anchor&&ft(t,\"duplication of an anchor property\"),n=t.input.charCodeAt(++t.position),e=t.position;0!==n&&!tt(n)&&!et(n);)n=t.input.charCodeAt(++t.position);return t.position===e&&ft(t,\"name of an anchor node must contain at least one character\"),t.anchor=t.input.slice(e,t.position),!0}function bt(t,e,n,r,o){var u,s,a,c,f,l,p,h,d,y=1,v=!1,g=!1;if(null!==t.listener&&t.listener(\"open\",t),t.tag=null,t.anchor=null,t.kind=null,t.result=null,u=s=a=4===n||3===n,r&&gt(t,!0,-1)&&(v=!0,t.lineIndent>e?y=1:t.lineIndent===e?y=0:t.lineIndent<e&&(y=-1)),1===y)for(;_t(t)||Lt(t);)gt(t,!0,-1)?(v=!0,a=u,t.lineIndent>e?y=1:t.lineIndent===e?y=0:t.lineIndent<e&&(y=-1)):a=!1;if(a&&(a=v||o),1!==y&&4!==n||(h=1===n||2===n?e:e+1,d=t.position-t.lineStart,1===y?a&&(mt(t,d)||function(t,e,n){var r,i,o,u,s,a,c,f=t.tag,l=t.anchor,p={},h=Object.create(null),d=null,y=null,v=null,g=!1,w=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=p),c=t.input.charCodeAt(t.position);0!==c;){if(g||-1===t.firstTabInLine||(t.position=t.firstTabInLine,ft(t,\"tab characters must not be used in indentation\")),r=t.input.charCodeAt(t.position+1),o=t.line,63!==c&&58!==c||!tt(r)){if(u=t.line,s=t.lineStart,a=t.position,!bt(t,n,2,!1,!0))break;if(t.line===o){for(c=t.input.charCodeAt(t.position);$(c);)c=t.input.charCodeAt(++t.position);if(58===c)tt(c=t.input.charCodeAt(++t.position))||ft(t,\"a whitespace character is expected after the key-value separator within a block mapping\"),g&&(yt(t,p,h,d,y,null,u,s,a),d=y=v=null),w=!0,g=!1,i=!1,d=t.tag,y=t.result;else{if(!w)return t.tag=f,t.anchor=l,!0;ft(t,\"can not read an implicit mapping pair; a colon is missed\")}}else{if(!w)return t.tag=f,t.anchor=l,!0;ft(t,\"can not read a block mapping entry; a multiline key may not be an implicit key\")}}else 63===c?(g&&(yt(t,p,h,d,y,null,u,s,a),d=y=v=null),w=!0,g=!0,i=!0):g?(g=!1,i=!0):ft(t,\"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line\"),t.position+=1,c=r;if((t.line===o||t.lineIndent>e)&&(g&&(u=t.line,s=t.lineStart,a=t.position),bt(t,e,4,!0,i)&&(g?y=t.result:v=t.result),g||(yt(t,p,h,d,y,v,u,s,a),d=y=v=null),gt(t,!0,-1),c=t.input.charCodeAt(t.position)),(t.line===o||t.lineIndent>e)&&0!==c)ft(t,\"bad indentation of a mapping entry\");else if(t.lineIndent<e)break}return g&&yt(t,p,h,d,y,null,u,s,a),w&&(t.tag=f,t.anchor=l,t.kind=\"mapping\",t.result=p),w}(t,d,h))||function(t,e){var n,r,i,o,u,s,a,c,f,l,p,h,d=!0,y=t.tag,v=t.anchor,g=Object.create(null);if(91===(h=t.input.charCodeAt(t.position)))u=93,c=!1,o=[];else{if(123!==h)return!1;u=125,c=!0,o={}}for(null!==t.anchor&&(t.anchorMap[t.anchor]=o),h=t.input.charCodeAt(++t.position);0!==h;){if(gt(t,!0,e),(h=t.input.charCodeAt(t.position))===u)return t.position++,t.tag=y,t.anchor=v,t.kind=c?\"mapping\":\"sequence\",t.result=o,!0;d?44===h&&ft(t,\"expected the node content, but found ','\"):ft(t,\"missed comma between flow collection entries\"),p=null,s=a=!1,63===h&&tt(t.input.charCodeAt(t.position+1))&&(s=a=!0,t.position++,gt(t,!0,e)),n=t.line,r=t.lineStart,i=t.position,bt(t,e,1,!1,!0),l=t.tag,f=t.result,gt(t,!0,e),h=t.input.charCodeAt(t.position),!a&&t.line!==n||58!==h||(s=!0,h=t.input.charCodeAt(++t.position),gt(t,!0,e),bt(t,e,1,!1,!0),p=t.result),c?yt(t,o,g,l,f,p,n,r,i):s?o.push(yt(t,null,g,l,f,p,n,r,i)):o.push(f),gt(t,!0,e),44===(h=t.input.charCodeAt(t.position))?(d=!0,h=t.input.charCodeAt(++t.position)):d=!1}ft(t,\"unexpected end of the stream within a flow collection\")}(t,h)?g=!0:(s&&function(t,e){var n,r,o,u,s,a=1,c=!1,f=!1,l=e,p=0,h=!1;if(124===(u=t.input.charCodeAt(t.position)))r=!1;else{if(62!==u)return!1;r=!0}for(t.kind=\"scalar\",t.result=\"\";0!==u;)if(43===(u=t.input.charCodeAt(++t.position))||45===u)1===a?a=43===u?3:2:ft(t,\"repeat of a chomping mode identifier\");else{if(!((o=48<=(s=u)&&s<=57?s-48:-1)>=0))break;0===o?ft(t,\"bad explicit indentation width of a block scalar; it cannot be less than one\"):f?ft(t,\"repeat of an indentation width identifier\"):(l=e+o-1,f=!0)}if($(u)){do{u=t.input.charCodeAt(++t.position)}while($(u));if(35===u)do{u=t.input.charCodeAt(++t.position)}while(!K(u)&&0!==u)}for(;0!==u;){for(vt(t),t.lineIndent=0,u=t.input.charCodeAt(t.position);(!f||t.lineIndent<l)&&32===u;)t.lineIndent++,u=t.input.charCodeAt(++t.position);if(!f&&t.lineIndent>l&&(l=t.lineIndent),K(u))p++;else{if(t.lineIndent<l){3===a?t.result+=i.repeat(\"\\n\",c?1+p:p):1===a&&c&&(t.result+=\"\\n\");break}for(r?$(u)?(h=!0,t.result+=i.repeat(\"\\n\",c?1+p:p)):h?(h=!1,t.result+=i.repeat(\"\\n\",p+1)):0===p?c&&(t.result+=\" \"):t.result+=i.repeat(\"\\n\",p):t.result+=i.repeat(\"\\n\",c?1+p:p),c=!0,f=!0,p=0,n=t.position;!K(u)&&0!==u;)u=t.input.charCodeAt(++t.position);ht(t,n,t.position,!1)}}return!0}(t,h)||function(t,e){var n,r,i;if(39!==(n=t.input.charCodeAt(t.position)))return!1;for(t.kind=\"scalar\",t.result=\"\",t.position++,r=i=t.position;0!==(n=t.input.charCodeAt(t.position));)if(39===n){if(ht(t,r,t.position,!0),39!==(n=t.input.charCodeAt(++t.position)))return!0;r=t.position,t.position++,i=t.position}else K(n)?(ht(t,r,i,!0),Mt(t,gt(t,!1,e)),r=i=t.position):t.position===t.lineStart&&wt(t)?ft(t,\"unexpected end of the document within a single quoted scalar\"):(t.position++,i=t.position);ft(t,\"unexpected end of the stream within a single quoted scalar\")}(t,h)||function(t,e){var n,r,i,o,u,s,a;if(34!==(s=t.input.charCodeAt(t.position)))return!1;for(t.kind=\"scalar\",t.result=\"\",t.position++,n=r=t.position;0!==(s=t.input.charCodeAt(t.position));){if(34===s)return ht(t,n,t.position,!0),t.position++,!0;if(92===s){if(ht(t,n,t.position,!0),K(s=t.input.charCodeAt(++t.position)))gt(t,!1,e);else if(s<256&&ot[s])t.result+=ut[s],t.position++;else if((u=120===(a=s)?2:117===a?4:85===a?8:0)>0){for(i=u,o=0;i>0;i--)(u=nt(s=t.input.charCodeAt(++t.position)))>=0?o=(o<<4)+u:ft(t,\"expected hexadecimal character\");t.result+=it(o),t.position++}else ft(t,\"unknown escape sequence\");n=r=t.position}else K(s)?(ht(t,n,r,!0),Mt(t,gt(t,!1,e)),n=r=t.position):t.position===t.lineStart&&wt(t)?ft(t,\"unexpected end of the document within a double quoted scalar\"):(t.position++,r=t.position)}ft(t,\"unexpected end of the stream within a double quoted scalar\")}(t,h)?g=!0:!function(t){var e,n,r;if(42!==(r=t.input.charCodeAt(t.position)))return!1;for(r=t.input.charCodeAt(++t.position),e=t.position;0!==r&&!tt(r)&&!et(r);)r=t.input.charCodeAt(++t.position);return t.position===e&&ft(t,\"name of an alias node must contain at least one character\"),n=t.input.slice(e,t.position),W.call(t.anchorMap,n)||ft(t,'unidentified alias \"'+n+'\"'),t.result=t.anchorMap[n],gt(t,!0,-1),!0}(t)?function(t,e,n){var r,i,o,u,s,a,c,f,l=t.kind,p=t.result;if(tt(f=t.input.charCodeAt(t.position))||et(f)||35===f||38===f||42===f||33===f||124===f||62===f||39===f||34===f||37===f||64===f||96===f)return!1;if((63===f||45===f)&&(tt(r=t.input.charCodeAt(t.position+1))||n&&et(r)))return!1;for(t.kind=\"scalar\",t.result=\"\",i=o=t.position,u=!1;0!==f;){if(58===f){if(tt(r=t.input.charCodeAt(t.position+1))||n&&et(r))break}else if(35===f){if(tt(t.input.charCodeAt(t.position-1)))break}else{if(t.position===t.lineStart&&wt(t)||n&&et(f))break;if(K(f)){if(s=t.line,a=t.lineStart,c=t.lineIndent,gt(t,!1,-1),t.lineIndent>=e){u=!0,f=t.input.charCodeAt(t.position);continue}t.position=o,t.line=s,t.lineStart=a,t.lineIndent=c;break}}u&&(ht(t,i,o,!1),Mt(t,t.line-s),i=o=t.position,u=!1),$(f)||(o=t.position+1),f=t.input.charCodeAt(++t.position)}return ht(t,i,o,!1),!!t.result||(t.kind=l,t.result=p,!1)}(t,h,1===n)&&(g=!0,null===t.tag&&(t.tag=\"?\")):(g=!0,null===t.tag&&null===t.anchor||ft(t,\"alias node should not have any properties\")),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):0===y&&(g=a&&mt(t,d))),null===t.tag)null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);else if(\"?\"===t.tag){for(null!==t.result&&\"scalar\"!==t.kind&&ft(t,'unacceptable node kind for !<?> tag; it should be \"scalar\", not \"'+t.kind+'\"'),c=0,f=t.implicitTypes.length;c<f;c+=1)if((p=t.implicitTypes[c]).resolve(t.result)){t.result=p.construct(t.result),t.tag=p.tag,null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);break}}else if(\"!\"!==t.tag){if(W.call(t.typeMap[t.kind||\"fallback\"],t.tag))p=t.typeMap[t.kind||\"fallback\"][t.tag];else for(p=null,c=0,f=(l=t.typeMap.multi[t.kind||\"fallback\"]).length;c<f;c+=1)if(t.tag.slice(0,l[c].tag.length)===l[c].tag){p=l[c];break}p||ft(t,\"unknown tag !<\"+t.tag+\">\"),null!==t.result&&p.kind!==t.kind&&ft(t,\"unacceptable node kind for !<\"+t.tag+'> tag; it should be \"'+p.kind+'\", not \"'+t.kind+'\"'),p.resolve(t.result,t.tag)?(t.result=p.construct(t.result,t.tag),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):ft(t,\"cannot resolve a node with !<\"+t.tag+\"> explicit tag\")}return null!==t.listener&&t.listener(\"close\",t),null!==t.tag||null!==t.anchor||g}function xt(t){var e,n,r,i,o=t.position,u=!1;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);0!==(i=t.input.charCodeAt(t.position))&&(gt(t,!0,-1),i=t.input.charCodeAt(t.position),!(t.lineIndent>0||37!==i));){for(u=!0,i=t.input.charCodeAt(++t.position),e=t.position;0!==i&&!tt(i);)i=t.input.charCodeAt(++t.position);for(r=[],(n=t.input.slice(e,t.position)).length<1&&ft(t,\"directive name must not be less than one character in length\");0!==i;){for(;$(i);)i=t.input.charCodeAt(++t.position);if(35===i){do{i=t.input.charCodeAt(++t.position)}while(0!==i&&!K(i));break}if(K(i))break;for(e=t.position;0!==i&&!tt(i);)i=t.input.charCodeAt(++t.position);r.push(t.input.slice(e,t.position))}0!==i&&vt(t),W.call(pt,n)?pt[n](t,n,r):lt(t,'unknown document directive \"'+n+'\"')}gt(t,!0,-1),0===t.lineIndent&&45===t.input.charCodeAt(t.position)&&45===t.input.charCodeAt(t.position+1)&&45===t.input.charCodeAt(t.position+2)?(t.position+=3,gt(t,!0,-1)):u&&ft(t,\"directives end mark is expected\"),bt(t,t.lineIndent-1,4,!1,!0),gt(t,!0,-1),t.checkLineBreaks&&J.test(t.input.slice(o,t.position))&&lt(t,\"non-ASCII line breaks are interpreted as content\"),t.documents.push(t.result),t.position===t.lineStart&&wt(t)?46===t.input.charCodeAt(t.position)&&(t.position+=3,gt(t,!0,-1)):t.position<t.length-1&&ft(t,\"end of the stream or a document separator is expected\")}function jt(t,e){e=e||{},0!==(t=String(t)).length&&(10!==t.charCodeAt(t.length-1)&&13!==t.charCodeAt(t.length-1)&&(t+=\"\\n\"),65279===t.charCodeAt(0)&&(t=t.slice(1)));var n=new at(t,e),r=t.indexOf(\"\\0\");for(-1!==r&&(n.position=r,ft(n,\"null byte is not allowed in input\")),n.input+=\"\\0\";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)xt(n);return n.documents}var Nt={loadAll:function(t,e,n){null!==e&&\"object\"==typeof e&&void 0===n&&(n=e,e=null);var r=jt(t,n);if(\"function\"!=typeof e)return r;for(var i=0,o=r.length;i<o;i+=1)e(r[i])},load:function(t,e){var n=jt(t,e);if(0!==n.length){if(1===n.length)return n[0];throw new s(\"expected a single document in the stream, but found more\")}}},St=Object.prototype.toString,Dt=Object.prototype.hasOwnProperty,It=65279,At={0:\"\\\\0\",7:\"\\\\a\",8:\"\\\\b\",9:\"\\\\t\",10:\"\\\\n\",11:\"\\\\v\",12:\"\\\\f\",13:\"\\\\r\",27:\"\\\\e\",34:'\\\\\"',92:\"\\\\\\\\\",133:\"\\\\N\",160:\"\\\\_\",8232:\"\\\\L\",8233:\"\\\\P\"},Ot=[\"y\",\"Y\",\"yes\",\"Yes\",\"YES\",\"on\",\"On\",\"ON\",\"n\",\"N\",\"no\",\"No\",\"NO\",\"off\",\"Off\",\"OFF\"],Tt=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;function Ct(t){var e,n,r;if(e=t.toString(16).toUpperCase(),t<=255)n=\"x\",r=2;else if(t<=65535)n=\"u\",r=4;else{if(!(t<=4294967295))throw new s(\"code point within a string may not be greater than 0xFFFFFFFF\");n=\"U\",r=8}return\"\\\\\"+n+i.repeat(\"0\",r-e.length)+e}function Et(t){this.schema=t.schema||G,this.indent=Math.max(1,t.indent||2),this.noArrayIndent=t.noArrayIndent||!1,this.skipInvalid=t.skipInvalid||!1,this.flowLevel=i.isNothing(t.flowLevel)?-1:t.flowLevel,this.styleMap=function(t,e){var n,r,i,o,u,s,a;if(null===e)return{};for(n={},i=0,o=(r=Object.keys(e)).length;i<o;i+=1)u=r[i],s=String(e[u]),\"!!\"===u.slice(0,2)&&(u=\"tag:yaml.org,2002:\"+u.slice(2)),(a=t.compiledTypeMap.fallback[u])&&Dt.call(a.styleAliases,s)&&(s=a.styleAliases[s]),n[u]=s;return n}(this.schema,t.styles||null),this.sortKeys=t.sortKeys||!1,this.lineWidth=t.lineWidth||80,this.noRefs=t.noRefs||!1,this.noCompatMode=t.noCompatMode||!1,this.condenseFlow=t.condenseFlow||!1,this.quotingType='\"'===t.quotingType?2:1,this.forceQuotes=t.forceQuotes||!1,this.replacer=\"function\"==typeof t.replacer?t.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result=\"\",this.duplicates=[],this.usedDuplicates=null}function zt(t,e){for(var n,r=i.repeat(\" \",e),o=0,u=-1,s=\"\",a=t.length;o<a;)-1===(u=t.indexOf(\"\\n\",o))?(n=t.slice(o),o=a):(n=t.slice(o,u+1),o=u+1),n.length&&\"\\n\"!==n&&(s+=r),s+=n;return s}function kt(t,e){return\"\\n\"+i.repeat(\" \",t.indent*e)}function Yt(t){return 32===t||9===t}function Ut(t){return 32<=t&&t<=126||161<=t&&t<=55295&&8232!==t&&8233!==t||57344<=t&&t<=65533&&t!==It||65536<=t&&t<=1114111}function Pt(t){return Ut(t)&&t!==It&&13!==t&&10!==t}function Rt(t,e,n){var r=Pt(t),i=r&&!Yt(t);return(n?r:r&&44!==t&&91!==t&&93!==t&&123!==t&&125!==t)&&35!==t&&!(58===e&&!i)||Pt(e)&&!Yt(e)&&35===t||58===e&&i}function Qt(t,e){var n,r=t.charCodeAt(e);return r>=55296&&r<=56319&&e+1<t.length&&(n=t.charCodeAt(e+1))>=56320&&n<=57343?1024*(r-55296)+n-56320+65536:r}function Ft(t){return/^\\n* /.test(t)}function Bt(t,e,n,r,i,o,u,s){var a,c,f=0,l=null,p=!1,h=!1,d=-1!==r,y=-1,v=Ut(c=Qt(t,0))&&c!==It&&!Yt(c)&&45!==c&&63!==c&&58!==c&&44!==c&&91!==c&&93!==c&&123!==c&&125!==c&&35!==c&&38!==c&&42!==c&&33!==c&&124!==c&&61!==c&&62!==c&&39!==c&&34!==c&&37!==c&&64!==c&&96!==c&&function(t){return!Yt(t)&&58!==t}(Qt(t,t.length-1));if(e||u)for(a=0;a<t.length;f>=65536?a+=2:a++){if(!Ut(f=Qt(t,a)))return 5;v=v&&Rt(f,l,s),l=f}else{for(a=0;a<t.length;f>=65536?a+=2:a++){if(10===(f=Qt(t,a)))p=!0,d&&(h=h||a-y-1>r&&\" \"!==t[y+1],y=a);else if(!Ut(f))return 5;v=v&&Rt(f,l,s),l=f}h=h||d&&a-y-1>r&&\" \"!==t[y+1]}return p||h?n>9&&Ft(t)?5:u?2===o?5:2:h?4:3:!v||u||i(t)?2===o?5:2:1}function Gt(t,e,n,r,i){t.dump=function(){if(0===e.length)return 2===t.quotingType?'\"\"':\"''\";if(!t.noCompatMode&&(-1!==Ot.indexOf(e)||Tt.test(e)))return 2===t.quotingType?'\"'+e+'\"':\"'\"+e+\"'\";var o=t.indent*Math.max(1,n),u=-1===t.lineWidth?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-o),a=r||t.flowLevel>-1&&n>=t.flowLevel;switch(Bt(e,a,t.indent,u,(function(e){return function(t,e){var n,r;for(n=0,r=t.implicitTypes.length;n<r;n+=1)if(t.implicitTypes[n].resolve(e))return!0;return!1}(t,e)}),t.quotingType,t.forceQuotes&&!r,i)){case 1:return e;case 2:return\"'\"+e.replace(/'/g,\"''\")+\"'\";case 3:return\"|\"+Wt(e,t.indent)+qt(zt(e,o));case 4:return\">\"+Wt(e,t.indent)+qt(zt(function(t,e){var n,r,i=/(\\n+)([^\\n]*)/g,o=(s=t.indexOf(\"\\n\"),s=-1!==s?s:t.length,i.lastIndex=s,Jt(t.slice(0,s),e)),u=\"\\n\"===t[0]||\" \"===t[0];var s;for(;r=i.exec(t);){var a=r[1],c=r[2];n=\" \"===c[0],o+=a+(u||n||\"\"===c?\"\":\"\\n\")+Jt(c,e),u=n}return o}(e,u),o));case 5:return'\"'+function(t){for(var e,n=\"\",r=0,i=0;i<t.length;r>=65536?i+=2:i++)r=Qt(t,i),!(e=At[r])&&Ut(r)?(n+=t[i],r>=65536&&(n+=t[i+1])):n+=e||Ct(r);return n}(e)+'\"';default:throw new s(\"impossible error: invalid scalar style\")}}()}function Wt(t,e){var n=Ft(t)?String(e):\"\",r=\"\\n\"===t[t.length-1];return n+(r&&(\"\\n\"===t[t.length-2]||\"\\n\"===t)?\"+\":r?\"\":\"-\")+\"\\n\"}function qt(t){return\"\\n\"===t[t.length-1]?t.slice(0,-1):t}function Jt(t,e){if(\"\"===t||\" \"===t[0])return t;for(var n,r,i=/ [^ ]/g,o=0,u=0,s=0,a=\"\";n=i.exec(t);)(s=n.index)-o>e&&(r=u>o?u:s,a+=\"\\n\"+t.slice(o,r),o=r+1),u=s;return a+=\"\\n\",t.length-o>e&&u>o?a+=t.slice(o,u)+\"\\n\"+t.slice(u+1):a+=t.slice(o),a.slice(1)}function Zt(t,e,n,r){var i,o,u,s=\"\",a=t.tag;for(i=0,o=n.length;i<o;i+=1)u=n[i],t.replacer&&(u=t.replacer.call(n,String(i),u)),(Xt(t,e+1,u,!0,!0,!1,!0)||void 0===u&&Xt(t,e+1,null,!0,!0,!1,!0))&&(r&&\"\"===s||(s+=kt(t,e)),t.dump&&10===t.dump.charCodeAt(0)?s+=\"-\":s+=\"- \",s+=t.dump);t.tag=a,t.dump=s||\"[]\"}function Vt(t,e,n){var r,i,o,u,a,c;for(o=0,u=(i=n?t.explicitTypes:t.implicitTypes).length;o<u;o+=1)if(((a=i[o]).instanceOf||a.predicate)&&(!a.instanceOf||\"object\"==typeof e&&e instanceof a.instanceOf)&&(!a.predicate||a.predicate(e))){if(n?a.multi&&a.representName?t.tag=a.representName(e):t.tag=a.tag:t.tag=\"?\",a.represent){if(c=t.styleMap[a.tag]||a.defaultStyle,\"[object Function]\"===St.call(a.represent))r=a.represent(e,c);else{if(!Dt.call(a.represent,c))throw new s(\"!<\"+a.tag+'> tag resolver accepts not \"'+c+'\" style');r=a.represent[c](e,c)}t.dump=r}return!0}return!1}function Xt(t,e,n,r,i,o,u){t.tag=null,t.dump=n,Vt(t,n,!1)||Vt(t,n,!0);var a,c=St.call(t.dump),f=r;r&&(r=t.flowLevel<0||t.flowLevel>e);var l,p,h=\"[object Object]\"===c||\"[object Array]\"===c;if(h&&(p=-1!==(l=t.duplicates.indexOf(n))),(null!==t.tag&&\"?\"!==t.tag||p||2!==t.indent&&e>0)&&(i=!1),p&&t.usedDuplicates[l])t.dump=\"*ref_\"+l;else{if(h&&p&&!t.usedDuplicates[l]&&(t.usedDuplicates[l]=!0),\"[object Object]\"===c)r&&0!==Object.keys(t.dump).length?(!function(t,e,n,r){var i,o,u,a,c,f,l=\"\",p=t.tag,h=Object.keys(n);if(!0===t.sortKeys)h.sort();else if(\"function\"==typeof t.sortKeys)h.sort(t.sortKeys);else if(t.sortKeys)throw new s(\"sortKeys must be a boolean or a function\");for(i=0,o=h.length;i<o;i+=1)f=\"\",r&&\"\"===l||(f+=kt(t,e)),a=n[u=h[i]],t.replacer&&(a=t.replacer.call(n,u,a)),Xt(t,e+1,u,!0,!0,!0)&&((c=null!==t.tag&&\"?\"!==t.tag||t.dump&&t.dump.length>1024)&&(t.dump&&10===t.dump.charCodeAt(0)?f+=\"?\":f+=\"? \"),f+=t.dump,c&&(f+=kt(t,e)),Xt(t,e+1,a,!0,c)&&(t.dump&&10===t.dump.charCodeAt(0)?f+=\":\":f+=\": \",l+=f+=t.dump));t.tag=p,t.dump=l||\"{}\"}(t,e,t.dump,i),p&&(t.dump=\"&ref_\"+l+t.dump)):(!function(t,e,n){var r,i,o,u,s,a=\"\",c=t.tag,f=Object.keys(n);for(r=0,i=f.length;r<i;r+=1)s=\"\",\"\"!==a&&(s+=\", \"),t.condenseFlow&&(s+='\"'),u=n[o=f[r]],t.replacer&&(u=t.replacer.call(n,o,u)),Xt(t,e,o,!1,!1)&&(t.dump.length>1024&&(s+=\"? \"),s+=t.dump+(t.condenseFlow?'\"':\"\")+\":\"+(t.condenseFlow?\"\":\" \"),Xt(t,e,u,!1,!1)&&(a+=s+=t.dump));t.tag=c,t.dump=\"{\"+a+\"}\"}(t,e,t.dump),p&&(t.dump=\"&ref_\"+l+\" \"+t.dump));else if(\"[object Array]\"===c)r&&0!==t.dump.length?(t.noArrayIndent&&!u&&e>0?Zt(t,e-1,t.dump,i):Zt(t,e,t.dump,i),p&&(t.dump=\"&ref_\"+l+t.dump)):(!function(t,e,n){var r,i,o,u=\"\",s=t.tag;for(r=0,i=n.length;r<i;r+=1)o=n[r],t.replacer&&(o=t.replacer.call(n,String(r),o)),(Xt(t,e,o,!1,!1)||void 0===o&&Xt(t,e,null,!1,!1))&&(\"\"!==u&&(u+=\",\"+(t.condenseFlow?\"\":\" \")),u+=t.dump);t.tag=s,t.dump=\"[\"+u+\"]\"}(t,e,t.dump),p&&(t.dump=\"&ref_\"+l+\" \"+t.dump));else{if(\"[object String]\"!==c){if(\"[object Undefined]\"===c)return!1;if(t.skipInvalid)return!1;throw new s(\"unacceptable kind of an object to dump \"+c)}\"?\"!==t.tag&&Gt(t,t.dump,e,o,f)}null!==t.tag&&\"?\"!==t.tag&&(a=encodeURI(\"!\"===t.tag[0]?t.tag.slice(1):t.tag).replace(/!/g,\"%21\"),a=\"!\"===t.tag[0]?\"!\"+a:\"tag:yaml.org,2002:\"===a.slice(0,18)?\"!!\"+a.slice(18):\"!<\"+a+\">\",t.dump=a+\" \"+t.dump)}return!0}function Ht(t,e){var n,r,i=[],o=[];for(Kt(t,i,o),n=0,r=o.length;n<r;n+=1)e.duplicates.push(i[o[n]]);e.usedDuplicates=new Array(r)}function Kt(t,e,n){var r,i,o;if(null!==t&&\"object\"==typeof t)if(-1!==(i=e.indexOf(t)))-1===n.indexOf(i)&&n.push(i);else if(e.push(t),Array.isArray(t))for(i=0,o=t.length;i<o;i+=1)Kt(t[i],e,n);else for(i=0,o=(r=Object.keys(t)).length;i<o;i+=1)Kt(t[r[i]],e,n)}function $t(t,e){return function(){throw new Error(\"Function yaml.\"+t+\" is removed in js-yaml 4. Use yaml.\"+e+\" instead, which is now safe by default.\")}}var te={Type:h,Schema:v,FAILSAFE_SCHEMA:m,JSON_SCHEMA:I,CORE_SCHEMA:A,DEFAULT_SCHEMA:G,load:Nt.load,loadAll:Nt.loadAll,dump:{dump:function(t,e){var n=new Et(e=e||{});n.noRefs||Ht(t,n);var r=t;return n.replacer&&(r=n.replacer.call({\"\":r},\"\",r)),Xt(n,0,r,!0,!0)?n.dump+\"\\n\":\"\"}}.dump,YAMLException:s,types:{binary:k,float:D,map:M,null:_,pairs:Q,set:B,timestamp:C,bool:L,int:j,merge:E,omap:P,seq:w,str:g},safeLoad:$t(\"safeLoad\",\"load\"),safeLoadAll:$t(\"safeLoadAll\",\"loadAll\"),safeDump:$t(\"safeDump\",\"dump\")};e.a=te},function(t,e,n){t.exports=n(353)},function(t,e,n){\"use strict\";e.a=function(){var t={location:{},history:{},open:function(){},close:function(){},File:function(){}};if(\"undefined\"==typeof window)return t;try{t=window;for(var e=0,n=[\"File\",\"Blob\",\"FormData\"];e<n.length;e++){var r=n[e];r in window&&(t[r]=window[r])}}catch(t){console.error(t)}return t}()},function(t,e,n){var r=n(6),i=n(55),o=\"\".split;t.exports=r((function(){return!Object(\"z\").propertyIsEnumerable(0)}))?function(t){return\"String\"==i(t)?o.call(t,\"\"):Object(t)}:Object},function(t,e,n){var r=n(15);t.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&\"function\"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if(\"function\"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&\"function\"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError(\"Can't convert object to primitive value\")}},function(t,e,n){var r,i=n(29),o=n(242),u=n(109),s=n(78),a=n(243),c=n(151),f=n(79),l=f(\"IE_PROTO\"),p=function(){},h=function(t){return\"<script>\"+t+\"</\"+\"script>\"},d=function(){try{r=document.domain&&new ActiveXObject(\"htmlfile\")}catch(t){}var t,e;d=r?function(t){t.write(h(\"\")),t.close();var e=t.parentWindow.Object;return t=null,e}(r):((e=c(\"iframe\")).style.display=\"none\",a.appendChild(e),e.src=String(\"javascript:\"),(t=e.contentWindow.document).open(),t.write(h(\"document.F=Object\")),t.close(),t.F);for(var n=u.length;n--;)delete d.prototype[u[n]];return d()};s[l]=!0,t.exports=Object.create||function(t,e){var n;return null!==t?(p.prototype=i(t),n=new p,p.prototype=null,n[l]=t):n=d(),void 0===e?n:o(n,e)}},function(t,e,n){var r=n(152),i=n(109);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e){t.exports={}},function(t,e,n){var r=n(110),i=n(112),o=r(\"keys\");t.exports=function(t){return o[t]||(o[t]=i(t))}},function(t,e,n){t.exports=n(260)},function(t,e,n){var r=n(57);t.exports=r(\"navigator\",\"userAgent\")||\"\"},function(t,e,n){var r=n(6),i=n(7),o=n(60),u=i(\"species\");t.exports=function(t){return o>=51||!r((function(){var e=[];return(e.constructor={})[u]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},function(t,e,n){var r=n(117),i=n(33).f,o=n(24),u=n(21),s=n(265),a=n(7)(\"toStringTag\");t.exports=function(t,e,n,c){if(t){var f=n?t:t.prototype;u(f,a)||i(f,a,{configurable:!0,value:e}),c&&!r&&o(f,\"toString\",s)}}},function(t,e,n){n(168);var r=n(296),i=n(13),o=n(61),u=n(24),s=n(44),a=n(7)(\"toStringTag\");for(var c in r){var f=i[c],l=f&&f.prototype;l&&o(l)!==a&&u(l,a,c),s[c]=s.Array}},function(t,e,n){\"use strict\";t.exports=function(t){for(var e=arguments.length-1,n=\"Minified React error #\"+t+\"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=\"+t,r=0;r<e;r++)n+=\"&args[]=\"+encodeURIComponent(arguments[r+1]);n+=\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\";var i=new Error(n);throw i.name=\"Invariant Violation\",i.framesToPop=1,i}},function(t,e,n){\"use strict\";t.exports=function(t,e,n,r,i,o,u,s){if(!t){var a;if(void 0===e)a=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[n,r,i,o,u,s],f=0;(a=new Error(e.replace(/%s/g,(function(){return c[f++]})))).name=\"Invariant Violation\"}throw a.framesToPop=1,a}}},function(t,e,n){var r=n(25).Symbol;t.exports=r},function(t,e,n){var r=n(65),i=n(66);t.exports=function(t){return\"symbol\"==typeof t||i(t)&&\"[object Symbol]\"==r(t)}},function(t,e,n){var r=n(46)(Object,\"create\");t.exports=r},function(t,e,n){var r=n(449),i=n(450),o=n(451),u=n(452),s=n(453);function a(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}a.prototype.clear=r,a.prototype.delete=i,a.prototype.get=o,a.prototype.has=u,a.prototype.set=s,t.exports=a},function(t,e,n){var r=n(49);t.exports=function(t,e){for(var n=t.length;n--;)if(r(t[n][0],e))return n;return-1}},function(t,e,n){var r=n(455);t.exports=function(t,e){var n=t.__data__;return r(e)?n[\"string\"==typeof e?\"string\":\"hash\"]:n.map}},function(t,e,n){var r=n(483),i=n(194),o=n(68);t.exports=function(t){return o(t)?r(t):i(t)}},function(t,e,n){var r=n(88);t.exports=function(t){if(\"string\"==typeof t||r(t))return t;var e=t+\"\";return\"0\"==e&&1/t==-Infinity?\"-0\":e}},function(t,e,n){\"use strict\";(function(e){!e.version||0===e.version.indexOf(\"v0.\")||0===e.version.indexOf(\"v1.\")&&0!==e.version.indexOf(\"v1.8.\")?t.exports={nextTick:function(t,n,r,i){if(\"function\"!=typeof t)throw new TypeError('\"callback\" argument must be a function');var o,u,s=arguments.length;switch(s){case 0:case 1:return e.nextTick(t);case 2:return e.nextTick((function(){t.call(null,n)}));case 3:return e.nextTick((function(){t.call(null,n,r)}));case 4:return e.nextTick((function(){t.call(null,n,r,i)}));default:for(o=new Array(s-1),u=0;u<o.length;)o[u++]=arguments[u];return e.nextTick((function(){t.apply(null,o)}))}}}:t.exports=e}).call(this,n(34))},function(t,e,n){\"use strict\";t.exports=n(540)(\"forEach\")},function(t,e,n){\"use strict\";t.exports=n(563)()?globalThis:n(564)},function(t,e){t.exports=function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(149);function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),r(t,i.key,i)}}t.exports=function(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(238),i=n(245);t.exports=function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function\");t.prototype=r(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&i(t,e)},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(156),i=n(253),o=n(258),u=n(259);t.exports=function(t){var e=o();return function(){var n,o=i(t);if(e){var s=i(this).constructor;n=r(o,arguments,s)}else n=o.apply(this,arguments);return u(this,n)}},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){t.exports=n(404)},function(t,e,n){t.exports=n(367)},function(t,e,n){var r=n(23),i=n(105),o=n(54),u=n(32),s=n(75),a=n(21),c=n(150),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=u(t),e=s(e,!0),c)try{return f(t,e)}catch(t){}if(a(t,e))return o(!i.f.call(t,e),t[e])}},function(t,e,n){\"use strict\";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,o=i&&!r.call({1:2},1);e.f=o?function(t){var e=i(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(56);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var r=n(32),i=n(30),o=n(153),u=function(t){return function(e,n,u){var s,a=r(e),c=i(a.length),f=o(u,c);if(t&&n!=n){for(;c>f;)if((s=a[f++])!=s)return!0}else for(;c>f;f++)if((t||f in a)&&a[f]===n)return t||f||0;return!t&&-1}};t.exports={includes:u(!0),indexOf:u(!1)}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e){t.exports=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"]},function(t,e,n){var r=n(58),i=n(111);(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})(\"versions\",[]).push({version:\"3.15.1\",mode:r?\"pure\":\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"})},function(t,e,n){var r=n(13),i=n(244),o=\"__core-js_shared__\",u=r[o]||i(o,{});t.exports=u},function(t,e){var n=0,r=Math.random();t.exports=function(t){return\"Symbol(\"+String(void 0===t?\"\":t)+\")_\"+(++n+r).toString(36)}},function(t,e,n){var r=n(21),i=n(19),o=n(79),u=n(158),s=o(\"IE_PROTO\"),a=Object.prototype;t.exports=u?Object.getPrototypeOf:function(t){return t=i(t),r(t,s)?t[s]:\"function\"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?a:null}},function(t,e,n){\"use strict\";var r=n(75),i=n(33),o=n(54);t.exports=function(t,e,n){var u=r(e);u in t?i.f(t,u,o(0,n)):t[u]=n}},function(t,e,n){var r=n(60),i=n(6);t.exports=!!Object.getOwnPropertySymbols&&!i((function(){var t=Symbol();return!String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(t,e,n){var r=n(7);e.f=r},function(t,e,n){var r={};r[n(7)(\"toStringTag\")]=\"z\",t.exports=\"[object z]\"===String(r)},function(t,e,n){var r,i,o,u=n(266),s=n(13),a=n(15),c=n(24),f=n(21),l=n(111),p=n(79),h=n(78),d=\"Object already initialized\",y=s.WeakMap;if(u||l.state){var v=l.state||(l.state=new y),g=v.get,w=v.has,M=v.set;r=function(t,e){if(w.call(v,t))throw new TypeError(d);return e.facade=t,M.call(v,t,e),e},i=function(t){return g.call(v,t)||{}},o=function(t){return w.call(v,t)}}else{var m=p(\"state\");h[m]=!0,r=function(t,e){if(f(t,m))throw new TypeError(d);return e.facade=t,c(t,m,e),e},i=function(t){return f(t,m)?t[m]:{}},o=function(t){return f(t,m)}}t.exports={set:r,get:i,has:o,enforce:function(t){return o(t)?i(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!a(e)||(n=i(e)).type!==t)throw TypeError(\"Incompatible receiver, \"+t+\" required\");return n}}}},function(t,e,n){\"use strict\";var r=n(294).charAt,i=n(118),o=n(166),u=\"String Iterator\",s=i.set,a=i.getterFor(u);o(String,\"String\",(function(t){s(this,{type:u,string:String(t),index:0})}),(function(){var t,e=a(this),n=e.string,i=e.index;return i>=n.length?{value:void 0,done:!0}:(t=r(n,i),e.index+=t.length,{value:t,done:!1})}))},function(t,e){t.exports=function(){}},function(t,e,n){\"use strict\";var r=n(171);t.exports=r},function(t,e,n){\"use strict\";(function(t){var r=n(329),i=n(330),o=n(177);function u(){return a.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(t,e){if(u()<e)throw new RangeError(\"Invalid typed array length\");return a.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e)).__proto__=a.prototype:(null===t&&(t=new a(e)),t.length=e),t}function a(t,e,n){if(!(a.TYPED_ARRAY_SUPPORT||this instanceof a))return new a(t,e,n);if(\"number\"==typeof t){if(\"string\"==typeof e)throw new Error(\"If encoding is specified then the first argument must be a string\");return l(this,t)}return c(this,t,e,n)}function c(t,e,n,r){if(\"number\"==typeof e)throw new TypeError('\"value\" argument must not be a number');return\"undefined\"!=typeof ArrayBuffer&&e instanceof ArrayBuffer?function(t,e,n,r){if(e.byteLength,n<0||e.byteLength<n)throw new RangeError(\"'offset' is out of bounds\");if(e.byteLength<n+(r||0))throw new RangeError(\"'length' is out of bounds\");e=void 0===n&&void 0===r?new Uint8Array(e):void 0===r?new Uint8Array(e,n):new Uint8Array(e,n,r);a.TYPED_ARRAY_SUPPORT?(t=e).__proto__=a.prototype:t=p(t,e);return t}(t,e,n,r):\"string\"==typeof e?function(t,e,n){\"string\"==typeof n&&\"\"!==n||(n=\"utf8\");if(!a.isEncoding(n))throw new TypeError('\"encoding\" must be a valid string encoding');var r=0|d(e,n),i=(t=s(t,r)).write(e,n);i!==r&&(t=t.slice(0,i));return t}(t,e,n):function(t,e){if(a.isBuffer(e)){var n=0|h(e.length);return 0===(t=s(t,n)).length||e.copy(t,0,0,n),t}if(e){if(\"undefined\"!=typeof ArrayBuffer&&e.buffer instanceof ArrayBuffer||\"length\"in e)return\"number\"!=typeof e.length||(r=e.length)!=r?s(t,0):p(t,e);if(\"Buffer\"===e.type&&o(e.data))return p(t,e.data)}var r;throw new TypeError(\"First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.\")}(t,e)}function f(t){if(\"number\"!=typeof t)throw new TypeError('\"size\" argument must be a number');if(t<0)throw new RangeError('\"size\" argument must not be negative')}function l(t,e){if(f(e),t=s(t,e<0?0:0|h(e)),!a.TYPED_ARRAY_SUPPORT)for(var n=0;n<e;++n)t[n]=0;return t}function p(t,e){var n=e.length<0?0:0|h(e.length);t=s(t,n);for(var r=0;r<n;r+=1)t[r]=255&e[r];return t}function h(t){if(t>=u())throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+u().toString(16)+\" bytes\");return 0|t}function d(t,e){if(a.isBuffer(t))return t.length;if(\"undefined\"!=typeof ArrayBuffer&&\"function\"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;\"string\"!=typeof t&&(t=\"\"+t);var n=t.length;if(0===n)return 0;for(var r=!1;;)switch(e){case\"ascii\":case\"latin1\":case\"binary\":return n;case\"utf8\":case\"utf-8\":case void 0:return Q(t).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*n;case\"hex\":return n>>>1;case\"base64\":return F(t).length;default:if(r)return Q(t).length;e=(\"\"+e).toLowerCase(),r=!0}}function y(t,e,n){var r=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return\"\";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return\"\";if((n>>>=0)<=(e>>>=0))return\"\";for(t||(t=\"utf8\");;)switch(t){case\"hex\":return A(this,e,n);case\"utf8\":case\"utf-8\":return N(this,e,n);case\"ascii\":return D(this,e,n);case\"latin1\":case\"binary\":return I(this,e,n);case\"base64\":return j(this,e,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return O(this,e,n);default:if(r)throw new TypeError(\"Unknown encoding: \"+t);t=(t+\"\").toLowerCase(),r=!0}}function v(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}function g(t,e,n,r,i){if(0===t.length)return-1;if(\"string\"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=i?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(i)return-1;n=t.length-1}else if(n<0){if(!i)return-1;n=0}if(\"string\"==typeof e&&(e=a.from(e,r)),a.isBuffer(e))return 0===e.length?-1:w(t,e,n,r,i);if(\"number\"==typeof e)return e&=255,a.TYPED_ARRAY_SUPPORT&&\"function\"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):w(t,[e],n,r,i);throw new TypeError(\"val must be string, number or Buffer\")}function w(t,e,n,r,i){var o,u=1,s=t.length,a=e.length;if(void 0!==r&&(\"ucs2\"===(r=String(r).toLowerCase())||\"ucs-2\"===r||\"utf16le\"===r||\"utf-16le\"===r)){if(t.length<2||e.length<2)return-1;u=2,s/=2,a/=2,n/=2}function c(t,e){return 1===u?t[e]:t.readUInt16BE(e*u)}if(i){var f=-1;for(o=n;o<s;o++)if(c(t,o)===c(e,-1===f?0:o-f)){if(-1===f&&(f=o),o-f+1===a)return f*u}else-1!==f&&(o-=o-f),f=-1}else for(n+a>s&&(n=s-a),o=n;o>=0;o--){for(var l=!0,p=0;p<a;p++)if(c(t,o+p)!==c(e,p)){l=!1;break}if(l)return o}return-1}function M(t,e,n,r){n=Number(n)||0;var i=t.length-n;r?(r=Number(r))>i&&(r=i):r=i;var o=e.length;if(o%2!=0)throw new TypeError(\"Invalid hex string\");r>o/2&&(r=o/2);for(var u=0;u<r;++u){var s=parseInt(e.substr(2*u,2),16);if(isNaN(s))return u;t[n+u]=s}return u}function m(t,e,n,r){return B(Q(e,t.length-n),t,n,r)}function _(t,e,n,r){return B(function(t){for(var e=[],n=0;n<t.length;++n)e.push(255&t.charCodeAt(n));return e}(e),t,n,r)}function L(t,e,n,r){return _(t,e,n,r)}function b(t,e,n,r){return B(F(e),t,n,r)}function x(t,e,n,r){return B(function(t,e){for(var n,r,i,o=[],u=0;u<t.length&&!((e-=2)<0);++u)r=(n=t.charCodeAt(u))>>8,i=n%256,o.push(i),o.push(r);return o}(e,t.length-n),t,n,r)}function j(t,e,n){return 0===e&&n===t.length?r.fromByteArray(t):r.fromByteArray(t.slice(e,n))}function N(t,e,n){n=Math.min(t.length,n);for(var r=[],i=e;i<n;){var o,u,s,a,c=t[i],f=null,l=c>239?4:c>223?3:c>191?2:1;if(i+l<=n)switch(l){case 1:c<128&&(f=c);break;case 2:128==(192&(o=t[i+1]))&&(a=(31&c)<<6|63&o)>127&&(f=a);break;case 3:o=t[i+1],u=t[i+2],128==(192&o)&&128==(192&u)&&(a=(15&c)<<12|(63&o)<<6|63&u)>2047&&(a<55296||a>57343)&&(f=a);break;case 4:o=t[i+1],u=t[i+2],s=t[i+3],128==(192&o)&&128==(192&u)&&128==(192&s)&&(a=(15&c)<<18|(63&o)<<12|(63&u)<<6|63&s)>65535&&a<1114112&&(f=a)}null===f?(f=65533,l=1):f>65535&&(f-=65536,r.push(f>>>10&1023|55296),f=56320|1023&f),r.push(f),i+=l}return function(t){var e=t.length;if(e<=S)return String.fromCharCode.apply(String,t);var n=\"\",r=0;for(;r<e;)n+=String.fromCharCode.apply(String,t.slice(r,r+=S));return n}(r)}e.Buffer=a,e.SlowBuffer=function(t){+t!=t&&(t=0);return a.alloc(+t)},e.INSPECT_MAX_BYTES=50,a.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:function(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()&&\"function\"==typeof t.subarray&&0===t.subarray(1,1).byteLength}catch(t){return!1}}(),e.kMaxLength=u(),a.poolSize=8192,a._augment=function(t){return t.__proto__=a.prototype,t},a.from=function(t,e,n){return c(null,t,e,n)},a.TYPED_ARRAY_SUPPORT&&(a.prototype.__proto__=Uint8Array.prototype,a.__proto__=Uint8Array,\"undefined\"!=typeof Symbol&&Symbol.species&&a[Symbol.species]===a&&Object.defineProperty(a,Symbol.species,{value:null,configurable:!0})),a.alloc=function(t,e,n){return function(t,e,n,r){return f(e),e<=0?s(t,e):void 0!==n?\"string\"==typeof r?s(t,e).fill(n,r):s(t,e).fill(n):s(t,e)}(null,t,e,n)},a.allocUnsafe=function(t){return l(null,t)},a.allocUnsafeSlow=function(t){return l(null,t)},a.isBuffer=function(t){return!(null==t||!t._isBuffer)},a.compare=function(t,e){if(!a.isBuffer(t)||!a.isBuffer(e))throw new TypeError(\"Arguments must be Buffers\");if(t===e)return 0;for(var n=t.length,r=e.length,i=0,o=Math.min(n,r);i<o;++i)if(t[i]!==e[i]){n=t[i],r=e[i];break}return n<r?-1:r<n?1:0},a.isEncoding=function(t){switch(String(t).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"latin1\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},a.concat=function(t,e){if(!o(t))throw new TypeError('\"list\" argument must be an Array of Buffers');if(0===t.length)return a.alloc(0);var n;if(void 0===e)for(e=0,n=0;n<t.length;++n)e+=t[n].length;var r=a.allocUnsafe(e),i=0;for(n=0;n<t.length;++n){var u=t[n];if(!a.isBuffer(u))throw new TypeError('\"list\" argument must be an Array of Buffers');u.copy(r,i),i+=u.length}return r},a.byteLength=d,a.prototype._isBuffer=!0,a.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var e=0;e<t;e+=2)v(this,e,e+1);return this},a.prototype.swap32=function(){var t=this.length;if(t%4!=0)throw new RangeError(\"Buffer size must be a multiple of 32-bits\");for(var e=0;e<t;e+=4)v(this,e,e+3),v(this,e+1,e+2);return this},a.prototype.swap64=function(){var t=this.length;if(t%8!=0)throw new RangeError(\"Buffer size must be a multiple of 64-bits\");for(var e=0;e<t;e+=8)v(this,e,e+7),v(this,e+1,e+6),v(this,e+2,e+5),v(this,e+3,e+4);return this},a.prototype.toString=function(){var t=0|this.length;return 0===t?\"\":0===arguments.length?N(this,0,t):y.apply(this,arguments)},a.prototype.equals=function(t){if(!a.isBuffer(t))throw new TypeError(\"Argument must be a Buffer\");return this===t||0===a.compare(this,t)},a.prototype.inspect=function(){var t=\"\",n=e.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString(\"hex\",0,n).match(/.{2}/g).join(\" \"),this.length>n&&(t+=\" ... \")),\"<Buffer \"+t+\">\"},a.prototype.compare=function(t,e,n,r,i){if(!a.isBuffer(t))throw new TypeError(\"Argument must be a Buffer\");if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),e<0||n>t.length||r<0||i>this.length)throw new RangeError(\"out of range index\");if(r>=i&&e>=n)return 0;if(r>=i)return-1;if(e>=n)return 1;if(this===t)return 0;for(var o=(i>>>=0)-(r>>>=0),u=(n>>>=0)-(e>>>=0),s=Math.min(o,u),c=this.slice(r,i),f=t.slice(e,n),l=0;l<s;++l)if(c[l]!==f[l]){o=c[l],u=f[l];break}return o<u?-1:u<o?1:0},a.prototype.includes=function(t,e,n){return-1!==this.indexOf(t,e,n)},a.prototype.indexOf=function(t,e,n){return g(this,t,e,n,!0)},a.prototype.lastIndexOf=function(t,e,n){return g(this,t,e,n,!1)},a.prototype.write=function(t,e,n,r){if(void 0===e)r=\"utf8\",n=this.length,e=0;else if(void 0===n&&\"string\"==typeof e)r=e,n=this.length,e=0;else{if(!isFinite(e))throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");e|=0,isFinite(n)?(n|=0,void 0===r&&(r=\"utf8\")):(r=n,n=void 0)}var i=this.length-e;if((void 0===n||n>i)&&(n=i),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");r||(r=\"utf8\");for(var o=!1;;)switch(r){case\"hex\":return M(this,t,e,n);case\"utf8\":case\"utf-8\":return m(this,t,e,n);case\"ascii\":return _(this,t,e,n);case\"latin1\":case\"binary\":return L(this,t,e,n);case\"base64\":return b(this,t,e,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return x(this,t,e,n);default:if(o)throw new TypeError(\"Unknown encoding: \"+r);r=(\"\"+r).toLowerCase(),o=!0}},a.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var S=4096;function D(t,e,n){var r=\"\";n=Math.min(t.length,n);for(var i=e;i<n;++i)r+=String.fromCharCode(127&t[i]);return r}function I(t,e,n){var r=\"\";n=Math.min(t.length,n);for(var i=e;i<n;++i)r+=String.fromCharCode(t[i]);return r}function A(t,e,n){var r=t.length;(!e||e<0)&&(e=0),(!n||n<0||n>r)&&(n=r);for(var i=\"\",o=e;o<n;++o)i+=R(t[o]);return i}function O(t,e,n){for(var r=t.slice(e,n),i=\"\",o=0;o<r.length;o+=2)i+=String.fromCharCode(r[o]+256*r[o+1]);return i}function T(t,e,n){if(t%1!=0||t<0)throw new RangeError(\"offset is not uint\");if(t+e>n)throw new RangeError(\"Trying to access beyond buffer length\")}function C(t,e,n,r,i,o){if(!a.isBuffer(t))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(e>i||e<o)throw new RangeError('\"value\" argument is out of bounds');if(n+r>t.length)throw new RangeError(\"Index out of range\")}function E(t,e,n,r){e<0&&(e=65535+e+1);for(var i=0,o=Math.min(t.length-n,2);i<o;++i)t[n+i]=(e&255<<8*(r?i:1-i))>>>8*(r?i:1-i)}function z(t,e,n,r){e<0&&(e=4294967295+e+1);for(var i=0,o=Math.min(t.length-n,4);i<o;++i)t[n+i]=e>>>8*(r?i:3-i)&255}function k(t,e,n,r,i,o){if(n+r>t.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"Index out of range\")}function Y(t,e,n,r,o){return o||k(t,0,n,4),i.write(t,e,n,r,23,4),n+4}function U(t,e,n,r,o){return o||k(t,0,n,8),i.write(t,e,n,r,52,8),n+8}a.prototype.slice=function(t,e){var n,r=this.length;if((t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e<t&&(e=t),a.TYPED_ARRAY_SUPPORT)(n=this.subarray(t,e)).__proto__=a.prototype;else{var i=e-t;n=new a(i,void 0);for(var o=0;o<i;++o)n[o]=this[o+t]}return n},a.prototype.readUIntLE=function(t,e,n){t|=0,e|=0,n||T(t,e,this.length);for(var r=this[t],i=1,o=0;++o<e&&(i*=256);)r+=this[t+o]*i;return r},a.prototype.readUIntBE=function(t,e,n){t|=0,e|=0,n||T(t,e,this.length);for(var r=this[t+--e],i=1;e>0&&(i*=256);)r+=this[t+--e]*i;return r},a.prototype.readUInt8=function(t,e){return e||T(t,1,this.length),this[t]},a.prototype.readUInt16LE=function(t,e){return e||T(t,2,this.length),this[t]|this[t+1]<<8},a.prototype.readUInt16BE=function(t,e){return e||T(t,2,this.length),this[t]<<8|this[t+1]},a.prototype.readUInt32LE=function(t,e){return e||T(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},a.prototype.readUInt32BE=function(t,e){return e||T(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},a.prototype.readIntLE=function(t,e,n){t|=0,e|=0,n||T(t,e,this.length);for(var r=this[t],i=1,o=0;++o<e&&(i*=256);)r+=this[t+o]*i;return r>=(i*=128)&&(r-=Math.pow(2,8*e)),r},a.prototype.readIntBE=function(t,e,n){t|=0,e|=0,n||T(t,e,this.length);for(var r=e,i=1,o=this[t+--r];r>0&&(i*=256);)o+=this[t+--r]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*e)),o},a.prototype.readInt8=function(t,e){return e||T(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},a.prototype.readInt16LE=function(t,e){e||T(t,2,this.length);var n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},a.prototype.readInt16BE=function(t,e){e||T(t,2,this.length);var n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},a.prototype.readInt32LE=function(t,e){return e||T(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},a.prototype.readInt32BE=function(t,e){return e||T(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},a.prototype.readFloatLE=function(t,e){return e||T(t,4,this.length),i.read(this,t,!0,23,4)},a.prototype.readFloatBE=function(t,e){return e||T(t,4,this.length),i.read(this,t,!1,23,4)},a.prototype.readDoubleLE=function(t,e){return e||T(t,8,this.length),i.read(this,t,!0,52,8)},a.prototype.readDoubleBE=function(t,e){return e||T(t,8,this.length),i.read(this,t,!1,52,8)},a.prototype.writeUIntLE=function(t,e,n,r){(t=+t,e|=0,n|=0,r)||C(this,t,e,n,Math.pow(2,8*n)-1,0);var i=1,o=0;for(this[e]=255&t;++o<n&&(i*=256);)this[e+o]=t/i&255;return e+n},a.prototype.writeUIntBE=function(t,e,n,r){(t=+t,e|=0,n|=0,r)||C(this,t,e,n,Math.pow(2,8*n)-1,0);var i=n-1,o=1;for(this[e+i]=255&t;--i>=0&&(o*=256);)this[e+i]=t/o&255;return e+n},a.prototype.writeUInt8=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,1,255,0),a.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},a.prototype.writeUInt16LE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):E(this,t,e,!0),e+2},a.prototype.writeUInt16BE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):E(this,t,e,!1),e+2},a.prototype.writeUInt32LE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):z(this,t,e,!0),e+4},a.prototype.writeUInt32BE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):z(this,t,e,!1),e+4},a.prototype.writeIntLE=function(t,e,n,r){if(t=+t,e|=0,!r){var i=Math.pow(2,8*n-1);C(this,t,e,n,i-1,-i)}var o=0,u=1,s=0;for(this[e]=255&t;++o<n&&(u*=256);)t<0&&0===s&&0!==this[e+o-1]&&(s=1),this[e+o]=(t/u>>0)-s&255;return e+n},a.prototype.writeIntBE=function(t,e,n,r){if(t=+t,e|=0,!r){var i=Math.pow(2,8*n-1);C(this,t,e,n,i-1,-i)}var o=n-1,u=1,s=0;for(this[e+o]=255&t;--o>=0&&(u*=256);)t<0&&0===s&&0!==this[e+o+1]&&(s=1),this[e+o]=(t/u>>0)-s&255;return e+n},a.prototype.writeInt8=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,1,127,-128),a.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},a.prototype.writeInt16LE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):E(this,t,e,!0),e+2},a.prototype.writeInt16BE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):E(this,t,e,!1),e+2},a.prototype.writeInt32LE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,4,2147483647,-2147483648),a.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):z(this,t,e,!0),e+4},a.prototype.writeInt32BE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),a.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):z(this,t,e,!1),e+4},a.prototype.writeFloatLE=function(t,e,n){return Y(this,t,e,!0,n)},a.prototype.writeFloatBE=function(t,e,n){return Y(this,t,e,!1,n)},a.prototype.writeDoubleLE=function(t,e,n){return U(this,t,e,!0,n)},a.prototype.writeDoubleBE=function(t,e,n){return U(this,t,e,!1,n)},a.prototype.copy=function(t,e,n,r){if(n||(n=0),r||0===r||(r=this.length),e>=t.length&&(e=t.length),e||(e=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError(\"targetStart out of bounds\");if(n<0||n>=this.length)throw new RangeError(\"sourceStart out of bounds\");if(r<0)throw new RangeError(\"sourceEnd out of bounds\");r>this.length&&(r=this.length),t.length-e<r-n&&(r=t.length-e+n);var i,o=r-n;if(this===t&&n<e&&e<r)for(i=o-1;i>=0;--i)t[i+e]=this[i+n];else if(o<1e3||!a.TYPED_ARRAY_SUPPORT)for(i=0;i<o;++i)t[i+e]=this[i+n];else Uint8Array.prototype.set.call(t,this.subarray(n,n+o),e);return o},a.prototype.fill=function(t,e,n,r){if(\"string\"==typeof t){if(\"string\"==typeof e?(r=e,e=0,n=this.length):\"string\"==typeof n&&(r=n,n=this.length),1===t.length){var i=t.charCodeAt(0);i<256&&(t=i)}if(void 0!==r&&\"string\"!=typeof r)throw new TypeError(\"encoding must be a string\");if(\"string\"==typeof r&&!a.isEncoding(r))throw new TypeError(\"Unknown encoding: \"+r)}else\"number\"==typeof t&&(t&=255);if(e<0||this.length<e||this.length<n)throw new RangeError(\"Out of range index\");if(n<=e)return this;var o;if(e>>>=0,n=void 0===n?this.length:n>>>0,t||(t=0),\"number\"==typeof t)for(o=e;o<n;++o)this[o]=t;else{var u=a.isBuffer(t)?t:Q(new a(t,r).toString()),s=u.length;for(o=0;o<n-e;++o)this[o+e]=u[o%s]}return this};var P=/[^+\\/0-9A-Za-z-_]/g;function R(t){return t<16?\"0\"+t.toString(16):t.toString(16)}function Q(t,e){var n;e=e||1/0;for(var r=t.length,i=null,o=[],u=0;u<r;++u){if((n=t.charCodeAt(u))>55295&&n<57344){if(!i){if(n>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(u+1===r){(e-=3)>-1&&o.push(239,191,189);continue}i=n;continue}if(n<56320){(e-=3)>-1&&o.push(239,191,189),i=n;continue}n=65536+(i-55296<<10|n-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,n<128){if((e-=1)<0)break;o.push(n)}else if(n<2048){if((e-=2)<0)break;o.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;o.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error(\"Invalid code point\");if((e-=4)<0)break;o.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return o}function F(t){return r.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\\s+|\\s+$/g,\"\")}(t).replace(P,\"\")).length<2)return\"\";for(;t.length%4!=0;)t+=\"=\";return t}(t))}function B(t,e,n,r){for(var i=0;i<r&&!(i+n>=e.length||i>=t.length);++i)e[i+n]=t[i];return i}}).call(this,n(20))},function(t,e,n){t.exports=n(332)},function(t,e,n){t.exports=n(335)},function(t,e,n){var r=n(344),i=n(181),o=n(179);t.exports=function(t,e){var n;if(t){if(\"string\"==typeof t)return o(t,e);var u=r(n=Object.prototype.toString.call(t)).call(n,8,-1);return\"Object\"===u&&t.constructor&&(u=t.constructor.name),\"Map\"===u||\"Set\"===u?i(t):\"Arguments\"===u||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(u)?o(t,e):void 0}},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(438),i=n(454),o=n(456),u=n(457),s=n(458);function a(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}a.prototype.clear=r,a.prototype.delete=i,a.prototype.get=o,a.prototype.has=u,a.prototype.set=s,t.exports=a},function(t,e,n){var r=n(46)(n(25),\"Map\");t.exports=r},function(t,e,n){var r=n(460),i=n(497),o=n(504),u=n(22),s=n(505);t.exports=function(t){return\"function\"==typeof t?t:null==t?o:\"object\"==typeof t?u(t)?i(t[0],t[1]):r(t):s(t)}},function(t,e,n){var r=n(485),i=n(66),o=Object.prototype,u=o.hasOwnProperty,s=o.propertyIsEnumerable,a=r(function(){return arguments}())?r:function(t){return i(t)&&u.call(t,\"callee\")&&!s.call(t,\"callee\")};t.exports=a},function(t,e,n){(function(t){var r=n(25),i=n(486),o=e&&!e.nodeType&&e,u=o&&\"object\"==typeof t&&t&&!t.nodeType&&t,s=u&&u.exports===o?r.Buffer:void 0,a=(s?s.isBuffer:void 0)||i;t.exports=a}).call(this,n(193)(t))},function(t,e){var n=/^(?:0|[1-9]\\d*)$/;t.exports=function(t,e){var r=typeof t;return!!(e=null==e?9007199254740991:e)&&(\"number\"==r||\"symbol\"!=r&&n.test(t))&&t>-1&&t%1==0&&t<e}},function(t,e,n){var r=n(487),i=n(488),o=n(489),u=o&&o.isTypedArray,s=u?i(u):r;t.exports=s},function(t,e){t.exports=function(t){return\"number\"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},function(t,e,n){var r=n(22),i=n(88),o=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,u=/^\\w*$/;t.exports=function(t,e){if(r(t))return!1;var n=typeof t;return!(\"number\"!=n&&\"symbol\"!=n&&\"boolean\"!=n&&null!=t&&!i(t))||(u.test(t)||!o.test(t)||null!=e&&t in Object(e))}},function(t,e,n){\"use strict\";var r,i=\"object\"==typeof Reflect?Reflect:null,o=i&&\"function\"==typeof i.apply?i.apply:function(t,e,n){return Function.prototype.apply.call(t,e,n)};r=i&&\"function\"==typeof i.ownKeys?i.ownKeys:Object.getOwnPropertySymbols?function(t){return Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t))}:function(t){return Object.getOwnPropertyNames(t)};var u=Number.isNaN||function(t){return t!=t};function s(){s.init.call(this)}t.exports=s,t.exports.once=function(t,e){return new Promise((function(n,r){function i(){void 0!==o&&t.removeListener(\"error\",o),n([].slice.call(arguments))}var o;\"error\"!==e&&(o=function(n){t.removeListener(e,i),r(n)},t.once(\"error\",o)),t.once(e,i)}))},s.EventEmitter=s,s.prototype._events=void 0,s.prototype._eventsCount=0,s.prototype._maxListeners=void 0;var a=10;function c(t){if(\"function\"!=typeof t)throw new TypeError('The \"listener\" argument must be of type Function. Received type '+typeof t)}function f(t){return void 0===t._maxListeners?s.defaultMaxListeners:t._maxListeners}function l(t,e,n,r){var i,o,u,s;if(c(n),void 0===(o=t._events)?(o=t._events=Object.create(null),t._eventsCount=0):(void 0!==o.newListener&&(t.emit(\"newListener\",e,n.listener?n.listener:n),o=t._events),u=o[e]),void 0===u)u=o[e]=n,++t._eventsCount;else if(\"function\"==typeof u?u=o[e]=r?[n,u]:[u,n]:r?u.unshift(n):u.push(n),(i=f(t))>0&&u.length>i&&!u.warned){u.warned=!0;var a=new Error(\"Possible EventEmitter memory leak detected. \"+u.length+\" \"+String(e)+\" listeners added. Use emitter.setMaxListeners() to increase limit\");a.name=\"MaxListenersExceededWarning\",a.emitter=t,a.type=e,a.count=u.length,s=a,console&&console.warn&&console.warn(s)}return t}function p(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function h(t,e,n){var r={fired:!1,wrapFn:void 0,target:t,type:e,listener:n},i=p.bind(r);return i.listener=n,r.wrapFn=i,i}function d(t,e,n){var r=t._events;if(void 0===r)return[];var i=r[e];return void 0===i?[]:\"function\"==typeof i?n?[i.listener||i]:[i]:n?function(t){for(var e=new Array(t.length),n=0;n<e.length;++n)e[n]=t[n].listener||t[n];return e}(i):v(i,i.length)}function y(t){var e=this._events;if(void 0!==e){var n=e[t];if(\"function\"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function v(t,e){for(var n=new Array(e),r=0;r<e;++r)n[r]=t[r];return n}Object.defineProperty(s,\"defaultMaxListeners\",{enumerable:!0,get:function(){return a},set:function(t){if(\"number\"!=typeof t||t<0||u(t))throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received '+t+\".\");a=t}}),s.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},s.prototype.setMaxListeners=function(t){if(\"number\"!=typeof t||t<0||u(t))throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received '+t+\".\");return this._maxListeners=t,this},s.prototype.getMaxListeners=function(){return f(this)},s.prototype.emit=function(t){for(var e=[],n=1;n<arguments.length;n++)e.push(arguments[n]);var r=\"error\"===t,i=this._events;if(void 0!==i)r=r&&void 0===i.error;else if(!r)return!1;if(r){var u;if(e.length>0&&(u=e[0]),u instanceof Error)throw u;var s=new Error(\"Unhandled error.\"+(u?\" (\"+u.message+\")\":\"\"));throw s.context=u,s}var a=i[t];if(void 0===a)return!1;if(\"function\"==typeof a)o(a,this,e);else{var c=a.length,f=v(a,c);for(n=0;n<c;++n)o(f[n],this,e)}return!0},s.prototype.addListener=function(t,e){return l(this,t,e,!1)},s.prototype.on=s.prototype.addListener,s.prototype.prependListener=function(t,e){return l(this,t,e,!0)},s.prototype.once=function(t,e){return c(e),this.on(t,h(this,t,e)),this},s.prototype.prependOnceListener=function(t,e){return c(e),this.prependListener(t,h(this,t,e)),this},s.prototype.removeListener=function(t,e){var n,r,i,o,u;if(c(e),void 0===(r=this._events))return this;if(void 0===(n=r[t]))return this;if(n===e||n.listener===e)0==--this._eventsCount?this._events=Object.create(null):(delete r[t],r.removeListener&&this.emit(\"removeListener\",t,n.listener||e));else if(\"function\"!=typeof n){for(i=-1,o=n.length-1;o>=0;o--)if(n[o]===e||n[o].listener===e){u=n[o].listener,i=o;break}if(i<0)return this;0===i?n.shift():function(t,e){for(;e+1<t.length;e++)t[e]=t[e+1];t.pop()}(n,i),1===n.length&&(r[t]=n[0]),void 0!==r.removeListener&&this.emit(\"removeListener\",t,u||e)}return this},s.prototype.off=s.prototype.removeListener,s.prototype.removeAllListeners=function(t){var e,n,r;if(void 0===(n=this._events))return this;if(void 0===n.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==n[t]&&(0==--this._eventsCount?this._events=Object.create(null):delete n[t]),this;if(0===arguments.length){var i,o=Object.keys(n);for(r=0;r<o.length;++r)\"removeListener\"!==(i=o[r])&&this.removeAllListeners(i);return this.removeAllListeners(\"removeListener\"),this._events=Object.create(null),this._eventsCount=0,this}if(\"function\"==typeof(e=n[t]))this.removeListener(t,e);else if(void 0!==e)for(r=e.length-1;r>=0;r--)this.removeListener(t,e[r]);return this},s.prototype.listeners=function(t){return d(this,t,!0)},s.prototype.rawListeners=function(t){return d(this,t,!1)},s.listenerCount=function(t,e){return\"function\"==typeof t.listenerCount?t.listenerCount(e):y.call(t,e)},s.prototype.listenerCount=y,s.prototype.eventNames=function(){return this._eventsCount>0?r(this._events):[]}},function(t,e,n){(e=t.exports=n(201)).Stream=e,e.Readable=e,e.Writable=n(137),e.Duplex=n(35),e.Transform=n(206),e.PassThrough=n(529)},function(t,e,n){\"use strict\";(function(e,r,i){var o=n(95);function u(t){var e=this;this.next=null,this.entry=null,this.finish=function(){!function(t,e,n){var r=t.entry;t.entry=null;for(;r;){var i=r.callback;e.pendingcb--,i(n),r=r.next}e.corkedRequestsFree?e.corkedRequestsFree.next=t:e.corkedRequestsFree=t}(e,t)}}t.exports=w;var s,a=!e.browser&&[\"v0.10\",\"v0.9.\"].indexOf(e.version.slice(0,5))>-1?r:o.nextTick;w.WritableState=g;var c=n(69);c.inherits=n(16);var f={deprecate:n(528)},l=n(202),p=n(17).Buffer,h=i.Uint8Array||function(){};var d,y=n(203);function v(){}function g(t,e){s=s||n(35),t=t||{};var r=e instanceof s;this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode);var i=t.highWaterMark,c=t.writableHighWaterMark,f=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:r&&(c||0===c)?c:f,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var l=!1===t.decodeStrings;this.decodeStrings=!l,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(t){!function(t,e){var n=t._writableState,r=n.sync,i=n.writecb;if(function(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}(n),e)!function(t,e,n,r,i){--e.pendingcb,n?(o.nextTick(i,r),o.nextTick(x,t,e),t._writableState.errorEmitted=!0,t.emit(\"error\",r)):(i(r),t._writableState.errorEmitted=!0,t.emit(\"error\",r),x(t,e))}(t,n,r,e,i);else{var u=L(n);u||n.corked||n.bufferProcessing||!n.bufferedRequest||_(t,n),r?a(m,t,n,u,i):m(t,n,u,i)}}(e,t)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new u(this)}function w(t){if(s=s||n(35),!(d.call(w,this)||this instanceof s))return new w(t);this._writableState=new g(t,this),this.writable=!0,t&&(\"function\"==typeof t.write&&(this._write=t.write),\"function\"==typeof t.writev&&(this._writev=t.writev),\"function\"==typeof t.destroy&&(this._destroy=t.destroy),\"function\"==typeof t.final&&(this._final=t.final)),l.call(this)}function M(t,e,n,r,i,o,u){e.writelen=r,e.writecb=u,e.writing=!0,e.sync=!0,n?t._writev(i,e.onwrite):t._write(i,o,e.onwrite),e.sync=!1}function m(t,e,n,r){n||function(t,e){0===e.length&&e.needDrain&&(e.needDrain=!1,t.emit(\"drain\"))}(t,e),e.pendingcb--,r(),x(t,e)}function _(t,e){e.bufferProcessing=!0;var n=e.bufferedRequest;if(t._writev&&n&&n.next){var r=e.bufferedRequestCount,i=new Array(r),o=e.corkedRequestsFree;o.entry=n;for(var s=0,a=!0;n;)i[s]=n,n.isBuf||(a=!1),n=n.next,s+=1;i.allBuffers=a,M(t,e,!0,e.length,i,\"\",o.finish),e.pendingcb++,e.lastBufferedRequest=null,o.next?(e.corkedRequestsFree=o.next,o.next=null):e.corkedRequestsFree=new u(e),e.bufferedRequestCount=0}else{for(;n;){var c=n.chunk,f=n.encoding,l=n.callback;if(M(t,e,!1,e.objectMode?1:c.length,c,f,l),n=n.next,e.bufferedRequestCount--,e.writing)break}null===n&&(e.lastBufferedRequest=null)}e.bufferedRequest=n,e.bufferProcessing=!1}function L(t){return t.ending&&0===t.length&&null===t.bufferedRequest&&!t.finished&&!t.writing}function b(t,e){t._final((function(n){e.pendingcb--,n&&t.emit(\"error\",n),e.prefinished=!0,t.emit(\"prefinish\"),x(t,e)}))}function x(t,e){var n=L(e);return n&&(!function(t,e){e.prefinished||e.finalCalled||(\"function\"==typeof t._final?(e.pendingcb++,e.finalCalled=!0,o.nextTick(b,t,e)):(e.prefinished=!0,t.emit(\"prefinish\")))}(t,e),0===e.pendingcb&&(e.finished=!0,t.emit(\"finish\"))),n}c.inherits(w,l),g.prototype.getBuffer=function(){for(var t=this.bufferedRequest,e=[];t;)e.push(t),t=t.next;return e},function(){try{Object.defineProperty(g.prototype,\"buffer\",{get:f.deprecate((function(){return this.getBuffer()}),\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch(t){}}(),\"function\"==typeof Symbol&&Symbol.hasInstance&&\"function\"==typeof Function.prototype[Symbol.hasInstance]?(d=Function.prototype[Symbol.hasInstance],Object.defineProperty(w,Symbol.hasInstance,{value:function(t){return!!d.call(this,t)||this===w&&(t&&t._writableState instanceof g)}})):d=function(t){return t instanceof this},w.prototype.pipe=function(){this.emit(\"error\",new Error(\"Cannot pipe, not readable\"))},w.prototype.write=function(t,e,n){var r,i=this._writableState,u=!1,s=!i.objectMode&&(r=t,p.isBuffer(r)||r instanceof h);return s&&!p.isBuffer(t)&&(t=function(t){return p.from(t)}(t)),\"function\"==typeof e&&(n=e,e=null),s?e=\"buffer\":e||(e=i.defaultEncoding),\"function\"!=typeof n&&(n=v),i.ended?function(t,e){var n=new Error(\"write after end\");t.emit(\"error\",n),o.nextTick(e,n)}(this,n):(s||function(t,e,n,r){var i=!0,u=!1;return null===n?u=new TypeError(\"May not write null values to stream\"):\"string\"==typeof n||void 0===n||e.objectMode||(u=new TypeError(\"Invalid non-string/buffer chunk\")),u&&(t.emit(\"error\",u),o.nextTick(r,u),i=!1),i}(this,i,t,n))&&(i.pendingcb++,u=function(t,e,n,r,i,o){if(!n){var u=function(t,e,n){t.objectMode||!1===t.decodeStrings||\"string\"!=typeof e||(e=p.from(e,n));return e}(e,r,i);r!==u&&(n=!0,i=\"buffer\",r=u)}var s=e.objectMode?1:r.length;e.length+=s;var a=e.length<e.highWaterMark;a||(e.needDrain=!0);if(e.writing||e.corked){var c=e.lastBufferedRequest;e.lastBufferedRequest={chunk:r,encoding:i,isBuf:n,callback:o,next:null},c?c.next=e.lastBufferedRequest:e.bufferedRequest=e.lastBufferedRequest,e.bufferedRequestCount+=1}else M(t,e,!1,s,r,i,o);return a}(this,i,s,t,e,n)),u},w.prototype.cork=function(){this._writableState.corked++},w.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,t.writing||t.corked||t.finished||t.bufferProcessing||!t.bufferedRequest||_(this,t))},w.prototype.setDefaultEncoding=function(t){if(\"string\"==typeof t&&(t=t.toLowerCase()),!([\"hex\",\"utf8\",\"utf-8\",\"ascii\",\"binary\",\"base64\",\"ucs2\",\"ucs-2\",\"utf16le\",\"utf-16le\",\"raw\"].indexOf((t+\"\").toLowerCase())>-1))throw new TypeError(\"Unknown encoding: \"+t);return this._writableState.defaultEncoding=t,this},Object.defineProperty(w.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),w.prototype._write=function(t,e,n){n(new Error(\"_write() is not implemented\"))},w.prototype._writev=null,w.prototype.end=function(t,e,n){var r=this._writableState;\"function\"==typeof t?(n=t,t=null,e=null):\"function\"==typeof e&&(n=e,e=null),null!=t&&this.write(t,e),r.corked&&(r.corked=1,this.uncork()),r.ending||r.finished||function(t,e,n){e.ending=!0,x(t,e),n&&(e.finished?o.nextTick(n):t.once(\"finish\",n));e.ended=!0,t.writable=!1}(this,r,n)},Object.defineProperty(w.prototype,\"destroyed\",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(t){this._writableState&&(this._writableState.destroyed=t)}}),w.prototype.destroy=y.destroy,w.prototype._undestroy=y.undestroy,w.prototype._destroy=function(t,e){this.end(),e(t)}}).call(this,n(34),n(204).setImmediate,n(20))},function(t,e,n){\"use strict\";t.exports=n(559)()?Array.from:n(560)},function(t,e,n){\"use strict\";var r=n(577),i=n(37),o=n(47),u=Array.prototype.indexOf,s=Object.prototype.hasOwnProperty,a=Math.abs,c=Math.floor;t.exports=function(t){var e,n,f,l;if(!r(t))return u.apply(this,arguments);for(n=i(o(this).length),f=arguments[1],e=f=isNaN(f)?0:f>=0?c(f):i(this.length)-c(a(f));e<n;++e)if(s.call(this,e)&&(l=this[e],r(l)))return e;return-1}},function(t,e,n){\"use strict\";(function(e,n){var r=function(t){if(\"function\"!=typeof t)throw new TypeError(t+\" is not a function\");return t},i=function(t){var e,n,i=document.createTextNode(\"\"),o=0;return new t((function(){var t;if(e)n&&(e=n.concat(e));else{if(!n)return;e=n}if(n=e,e=null,\"function\"==typeof n)return t=n,n=null,void t();for(i.data=o=++o%2;n;)t=n.shift(),n.length||(n=null),t()})).observe(i,{characterData:!0}),function(t){r(t),e?\"function\"==typeof e?e=[e,t]:e.push(t):(e=t,i.data=o=++o%2)}};t.exports=function(){if(\"object\"==typeof e&&e&&\"function\"==typeof e.nextTick)return e.nextTick;if(\"function\"==typeof queueMicrotask)return function(t){queueMicrotask(r(t))};if(\"object\"==typeof document&&document){if(\"function\"==typeof MutationObserver)return i(MutationObserver);if(\"function\"==typeof WebKitMutationObserver)return i(WebKitMutationObserver)}return\"function\"==typeof n?function(t){n(r(t))}:\"function\"==typeof setTimeout||\"object\"==typeof setTimeout?function(t){setTimeout(r(t),0)}:null}()}).call(this,n(34),n(204).setImmediate)},function(t,e,n){var r=n(423)(\"toUpperCase\");t.exports=r},function(t,e,n){var r=n(126);function i(t,e){if(\"function\"!=typeof t||null!=e&&\"function\"!=typeof e)throw new TypeError(\"Expected a function\");var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var u=t.apply(this,r);return n.cache=o.set(i,u)||o,u};return n.cache=new(i.Cache||r),n}i.Cache=r,t.exports=i},function(t,e,n){var r=n(80),i=n(124),o=n(123),u=n(125);t.exports=function(t,e){var n=void 0!==r&&i(t)||t[\"@@iterator\"];if(!n){if(o(t)||(n=u(t))||e&&t&&\"number\"==typeof t.length){n&&(t=n);var s=0,a=function(){};return{s:a,n:function(){return s>=t.length?{done:!0}:{done:!1,value:t[s++]}},e:function(t){throw t},f:a}}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 c,f=!0,l=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return f=t.done,t},e:function(t){l=!0,c=t},f:function(){try{f||null==n.return||n.return()}finally{if(l)throw c}}}},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){t.exports=n(373)},function(t,e,n){t.exports=n(397)},function(t,e,n){var r=n(192),i=n(128),o=n(515),u=n(22),s=n(521);t.exports=function(t,e,n){var a=u(t)?r:o;return n&&s(t,e,n)&&(e=void 0),a(t,i(e,3))}},function(t,e,n){\"use strict\";n.d(e,\"a\",(function(){return P})),n.d(e,\"b\",(function(){return R}));var r=n(18),i=n.n(r),o=n(3),u=n.n(o),s=n(41),a=n.n(s),c=n(9),f=n.n(c),l=n(5),p=n.n(l),h=n(40),d=n.n(h),y=n(51),v=n.n(y),g=n(50),w=n.n(g),M=n(102),m=n.n(M),_=n(11),L=n.n(_),b=n(12),x=n(228),j=n.n(x),N=n(148),S=n.n(N),D=n(53),I=n.n(D),A={string:function(){return\"string\"},string_email:function(){return\"user@example.com\"},\"string_date-time\":function(){return(new Date).toISOString()},string_date:function(){return(new Date).toISOString().substring(0,10)},string_uuid:function(){return\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"},string_hostname:function(){return\"example.com\"},string_ipv4:function(){return\"198.51.100.42\"},string_ipv6:function(){return\"2001:0db8:5b96:0000:0000:426f:8e17:642a\"},number:function(){return 0},number_float:function(){return 0},integer:function(){return 0},boolean:function(t){return\"boolean\"!=typeof t.default||t.default}},O=function(t){var e,n=t=Object(b.d)(t),r=n.type,i=n.format,o=A[u()(e=\"\".concat(r,\"_\")).call(e,i)]||A[r];return Object(b.b)(o)?o(t):\"Unknown Type: \"+t.type},T=function(t){return Object(b.a)(t,\"$$ref\",(function(t){return\"string\"==typeof t&&a()(t).call(t,\"#\")>-1}))},C=[\"maxProperties\",\"minProperties\"],E=[\"minItems\",\"maxItems\"],z=[\"minimum\",\"maximum\",\"exclusiveMinimum\",\"exclusiveMaximum\"],k=[\"minLength\",\"maxLength\"],Y=function t(e,n){var r,i,o,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},c=function(t){void 0===n[t]&&void 0!==e[t]&&(n[t]=e[t])};(f()(r=u()(i=[\"example\",\"default\",\"enum\",\"xml\",\"type\"]).call(i,C,E,z,k)).call(r,(function(t){return c(t)})),void 0!==e.required&&p()(e.required))&&(void 0!==n.required&&n.required.length||(n.required=[]),f()(o=e.required).call(o,(function(t){var e;d()(e=n.required).call(e,t)||n.required.push(t)})));if(e.properties){n.properties||(n.properties={});var l=Object(b.d)(e.properties);for(var h in l){var y;if(Object.prototype.hasOwnProperty.call(l,h))if(!l[h]||!l[h].deprecated)if(!l[h]||!l[h].readOnly||s.includeReadOnly)if(!l[h]||!l[h].writeOnly||s.includeWriteOnly)if(!n.properties[h])n.properties[h]=l[h],!e.required&&p()(e.required)&&-1!==a()(y=e.required).call(y,h)&&(n.required?n.required.push(h):n.required=[h])}}return e.items&&(n.items||(n.items={}),n.items=t(e.items,n.items,s)),n},U=function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];e&&Object(b.b)(e.toJS)&&(e=e.toJS());var s=void 0!==r||e&&void 0!==e.example||e&&void 0!==e.default,c=!s&&e&&e.oneOf&&e.oneOf.length>0,l=!s&&e&&e.anyOf&&e.anyOf.length>0;if(!s&&(c||l)){var h=Object(b.d)(c?e.oneOf[0]:e.anyOf[0]);if(Y(h,e,n),!e.xml&&h.xml&&(e.xml=h.xml),void 0!==e.example&&void 0!==h.example)s=!0;else if(h.properties){e.properties||(e.properties={});var y=Object(b.d)(h.properties);for(var g in y){var M;if(Object.prototype.hasOwnProperty.call(y,g))if(!y[g]||!y[g].deprecated)if(!y[g]||!y[g].readOnly||n.includeReadOnly)if(!y[g]||!y[g].writeOnly||n.includeWriteOnly)if(!e.properties[g])e.properties[g]=y[g],!h.required&&p()(h.required)&&-1!==a()(M=h.required).call(M,g)&&(e.required?e.required.push(g):e.required=[g])}}}var _,x={},j=e||{},N=j.xml,S=j.type,D=j.example,A=j.properties,k=j.additionalProperties,U=j.items,P=n.includeReadOnly,R=n.includeWriteOnly,Q=N=N||{},F=Q.name,B=Q.prefix,G=Q.namespace,W={};if(o&&(_=(B?B+\":\":\"\")+(F=F||\"notagname\"),G)){var q=B?\"xmlns:\"+B:\"xmlns\";x[q]=G}o&&(W[_]=[]);var J=function(t){return v()(t).call(t,(function(t){return Object.prototype.hasOwnProperty.call(e,t)}))};e&&!S&&(A||k||J(C)?S=\"object\":U||J(E)?S=\"array\":J(z)?(S=\"number\",e.type=\"number\"):s||e.enum||(S=\"string\",e.type=\"string\"));var Z,V,X=function(t){var n,r,i,o,u;null!==(null===(n=e)||void 0===n?void 0:n.maxItems)&&void 0!==(null===(r=e)||void 0===r?void 0:r.maxItems)&&(t=w()(t).call(t,0,null===(u=e)||void 0===u?void 0:u.maxItems));if(null!==(null===(i=e)||void 0===i?void 0:i.minItems)&&void 0!==(null===(o=e)||void 0===o?void 0:o.minItems))for(var s=0;t.length<(null===(a=e)||void 0===a?void 0:a.minItems);){var a;t.push(t[s++%t.length])}return t},H=Object(b.d)(A),K=0,$=function(){return e&&null!==e.maxProperties&&void 0!==e.maxProperties&&K>=e.maxProperties},tt=function(){if(!e||!e.required)return 0;var t,n,r=0;o?f()(t=e.required).call(t,(function(t){return r+=void 0===W[t]?0:1})):f()(n=e.required).call(n,(function(t){var e;return r+=void 0===(null===(e=W[_])||void 0===e?void 0:m()(e).call(e,(function(e){return void 0!==e[t]})))?0:1}));return e.required.length-r},et=function(t){var n;return!(e&&e.required&&e.required.length)||!d()(n=e.required).call(n,t)},nt=function(t){return!e||null===e.maxProperties||void 0===e.maxProperties||!$()&&(!et(t)||e.maxProperties-K-tt()>0)};if(Z=o?function(r){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(e&&H[r]){if(H[r].xml=H[r].xml||{},H[r].xml.attribute){var s=p()(H[r].enum)?H[r].enum[0]:void 0,a=H[r].example,c=H[r].default;return void(x[H[r].xml.name||r]=void 0!==a?a:void 0!==c?c:void 0!==s?s:O(H[r]))}H[r].xml.name=H[r].xml.name||r}else H[r]||!1===k||(H[r]={xml:{name:r}});var f,l=t(e&&H[r]||void 0,n,i,o);nt(r)&&(K++,p()(l)?W[_]=u()(f=W[_]).call(f,l):W[_].push(l))}:function(e,r){nt(e)&&(W[e]=t(H[e],n,r,o),K++)},s){var rt;if(rt=T(void 0!==r?r:void 0!==D?D:e.default),!o){if(\"number\"==typeof rt&&\"string\"===S)return\"\".concat(rt);if(\"string\"!=typeof rt||\"string\"===S)return rt;try{return JSON.parse(rt)}catch(t){return rt}}if(e||(S=p()(rt)?\"array\":i()(rt)),\"array\"===S){if(!p()(rt)){if(\"string\"==typeof rt)return rt;rt=[rt]}var it=e?e.items:void 0;it&&(it.xml=it.xml||N||{},it.xml.name=it.xml.name||N.name);var ot=L()(rt).call(rt,(function(e){return t(it,n,e,o)}));return ot=X(ot),N.wrapped?(W[_]=ot,I()(x)||W[_].push({_attr:x})):W=ot,W}if(\"object\"===S){if(\"string\"==typeof rt)return rt;for(var ut in rt)Object.prototype.hasOwnProperty.call(rt,ut)&&(e&&H[ut]&&H[ut].readOnly&&!P||e&&H[ut]&&H[ut].writeOnly&&!R||(e&&H[ut]&&H[ut].xml&&H[ut].xml.attribute?x[H[ut].xml.name||ut]=rt[ut]:Z(ut,rt[ut])));return I()(x)||W[_].push({_attr:x}),W}return W[_]=I()(x)?rt:[{_attr:x},rt],W}if(\"object\"===S){for(var st in H)Object.prototype.hasOwnProperty.call(H,st)&&(H[st]&&H[st].deprecated||H[st]&&H[st].readOnly&&!P||H[st]&&H[st].writeOnly&&!R||Z(st));if(o&&x&&W[_].push({_attr:x}),$())return W;if(!0===k)o?W[_].push({additionalProp:\"Anything can be here\"}):W.additionalProp1={},K++;else if(k){var at=Object(b.d)(k),ct=t(at,n,void 0,o);if(o&&at.xml&&at.xml.name&&\"notagname\"!==at.xml.name)W[_].push(ct);else for(var ft=null!==e.minProperties&&void 0!==e.minProperties&&K<e.minProperties?e.minProperties-K:4,lt=1;lt<ft;lt++){if($())return W;if(o){var pt={};pt[\"additionalProp\"+lt]=ct.notagname,W[_].push(pt)}else W[\"additionalProp\"+lt]=ct;K++}}return W}if(\"array\"===S){if(!U)return;var ht,dt,yt;if(o)U.xml=U.xml||(null===(dt=e)||void 0===dt?void 0:dt.xml)||{},U.xml.name=U.xml.name||N.name;if(p()(U.anyOf))ht=L()(yt=U.anyOf).call(yt,(function(e){return t(Y(U,e,n),n,void 0,o)}));else if(p()(U.oneOf)){var vt;ht=L()(vt=U.oneOf).call(vt,(function(e){return t(Y(U,e,n),n,void 0,o)}))}else{if(!(!o||o&&N.wrapped))return t(U,n,void 0,o);ht=[t(U,n,void 0,o)]}return ht=X(ht),o&&N.wrapped?(W[_]=ht,I()(x)||W[_].push({_attr:x}),W):ht}if(e&&p()(e.enum))V=Object(b.c)(e.enum)[0];else{if(!e)return;if(\"number\"==typeof(V=O(e))){var gt=e.minimum;null!=gt&&(e.exclusiveMinimum&&gt++,V=gt);var wt=e.maximum;null!=wt&&(e.exclusiveMaximum&&wt--,V=wt)}if(\"string\"==typeof V&&(null!==e.maxLength&&void 0!==e.maxLength&&(V=w()(V).call(V,0,e.maxLength)),null!==e.minLength&&void 0!==e.minLength))for(var Mt=0;V.length<e.minLength;)V+=V[Mt++%V.length]}if(\"file\"!==S)return o?(W[_]=I()(x)?V:[{_attr:x},V],W):V},P=S()((function(t,e,n){var r=U(t,e,n,!0);if(r)return\"string\"==typeof r?r:j()(r,{declaration:!0,indent:\"\\t\"})})),R=S()((function(t,e,n){return U(t,e,n,!1)}))},function(t,e,n){\"use strict\";var r=n(207),i=n(208),o=n(539);t.exports=function(t){var e,u=r(arguments[1]);return u.normalizer||0!==(e=u.length=i(u.length,t.length,u.async))&&(u.primitive?!1===e?u.normalizer=n(574):e>1&&(u.normalizer=n(575)(e)):u.normalizer=!1===e?n(576)():1===e?n(580)():n(581)(e)),u.async&&n(582),u.promise&&n(583),u.dispose&&n(589),u.maxAge&&n(590),u.max&&n(593),u.refCounter&&n(595),o(t,u)}},function(t,e,n){t.exports=n(234)},function(t,e,n){var r=n(23),i=n(6),o=n(151);t.exports=!r&&!i((function(){return 7!=Object.defineProperty(o(\"div\"),\"a\",{get:function(){return 7}}).a}))},function(t,e,n){var r=n(13),i=n(15),o=r.document,u=i(o)&&i(o.createElement);t.exports=function(t){return u?o.createElement(t):{}}},function(t,e,n){var r=n(21),i=n(32),o=n(107).indexOf,u=n(78);t.exports=function(t,e){var n,s=i(t),a=0,c=[];for(n in s)!r(u,n)&&r(s,n)&&c.push(n);for(;e.length>a;)r(s,n=e[a++])&&(~o(c,n)||c.push(n));return c}},function(t,e,n){var r=n(108),i=Math.max,o=Math.min;t.exports=function(t,e){var n=r(t);return n<0?i(n+e,0):o(n,e)}},function(t,e,n){t.exports=n(246)},function(t,e,n){var r=n(29),i=n(249);t.exports=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var t,e=!1,n={};try{(t=Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set).call(n,[]),e=n instanceof Array}catch(t){}return function(n,o){return r(n),i(o),e?t.call(n,o):n.__proto__=o,n}}():void 0)},function(t,e,n){t.exports=n(250)},function(t,e,n){\"use strict\";var r=n(56),i=n(15),o=[].slice,u={},s=function(t,e,n){if(!(e in u)){for(var r=[],i=0;i<e;i++)r[i]=\"a[\"+i+\"]\";u[e]=Function(\"C,a\",\"return new C(\"+r.join(\",\")+\")\")}return u[e](t,n)};t.exports=Function.bind||function(t){var e=r(this),n=o.call(arguments,1),u=function(){var r=n.concat(o.call(arguments));return this instanceof u?s(e,r.length,r):e.apply(t,r)};return i(e.prototype)&&(u.prototype=e.prototype),u}},function(t,e,n){var r=n(6);t.exports=!r((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},function(t,e,n){\"use strict\";var r=n(1),i=n(6),o=n(59),u=n(15),s=n(19),a=n(30),c=n(114),f=n(160),l=n(82),p=n(7),h=n(60),d=p(\"isConcatSpreadable\"),y=9007199254740991,v=\"Maximum allowed index exceeded\",g=h>=51||!i((function(){var t=[];return t[d]=!1,t.concat()[0]!==t})),w=l(\"concat\"),M=function(t){if(!u(t))return!1;var e=t[d];return void 0!==e?!!e:o(t)};r({target:\"Array\",proto:!0,forced:!g||!w},{concat:function(t){var e,n,r,i,o,u=s(this),l=f(u,0),p=0;for(e=-1,r=arguments.length;e<r;e++)if(M(o=-1===e?u:arguments[e])){if(p+(i=a(o.length))>y)throw TypeError(v);for(n=0;n<i;n++,p++)n in o&&c(l,p,o[n])}else{if(p>=y)throw TypeError(v);c(l,p++,o)}return l.length=p,l}})},function(t,e,n){var r=n(15),i=n(59),o=n(7)(\"species\");t.exports=function(t,e){var n;return i(t)&&(\"function\"!=typeof(n=t.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===e?0:e)}},function(t,e,n){var r=n(115);t.exports=r&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator},function(t,e,n){var r=n(152),i=n(109).concat(\"length\",\"prototype\");e.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,n){var r=n(24);t.exports=function(t,e,n,i){i&&i.enumerable?t[e]=n:r(t,e,n)}},function(t,e,n){n(4)(\"iterator\")},function(t,e,n){\"use strict\";var r=n(1),i=n(295),o=n(113),u=n(155),s=n(83),a=n(24),c=n(164),f=n(7),l=n(58),p=n(44),h=n(167),d=h.IteratorPrototype,y=h.BUGGY_SAFARI_ITERATORS,v=f(\"iterator\"),g=\"keys\",w=\"values\",M=\"entries\",m=function(){return this};t.exports=function(t,e,n,f,h,_,L){i(n,e,f);var b,x,j,N=function(t){if(t===h&&O)return O;if(!y&&t in I)return I[t];switch(t){case g:case w:case M:return function(){return new n(this,t)}}return function(){return new n(this)}},S=e+\" Iterator\",D=!1,I=t.prototype,A=I[v]||I[\"@@iterator\"]||h&&I[h],O=!y&&A||N(h),T=\"Array\"==e&&I.entries||A;if(T&&(b=o(T.call(new t)),d!==Object.prototype&&b.next&&(l||o(b)===d||(u?u(b,d):\"function\"!=typeof b[v]&&a(b,v,m)),s(b,S,!0,!0),l&&(p[S]=m))),h==w&&A&&A.name!==w&&(D=!0,O=function(){return A.call(this)}),l&&!L||I[v]===O||a(I,v,O),p[e]=O,h)if(x={values:N(w),keys:_?O:N(g),entries:N(M)},L)for(j in x)(y||D||!(j in I))&&c(I,j,x[j]);else r({target:e,proto:!0,forced:y||D},x);return x}},function(t,e,n){\"use strict\";var r,i,o,u=n(6),s=n(113),a=n(24),c=n(21),f=n(7),l=n(58),p=f(\"iterator\"),h=!1;[].keys&&(\"next\"in(o=[].keys())?(i=s(s(o)))!==Object.prototype&&(r=i):h=!0);var d=null==r||u((function(){var t={};return r[p].call(t)!==t}));d&&(r={}),l&&!d||c(r,p)||a(r,p,(function(){return this})),t.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:h}},function(t,e,n){\"use strict\";var r=n(32),i=n(120),o=n(44),u=n(118),s=n(166),a=\"Array Iterator\",c=u.set,f=u.getterFor(a);t.exports=s(Array,\"Array\",(function(t,e){c(this,{type:a,target:r(t),index:0,kind:e})}),(function(){var t=f(this),e=t.target,n=t.kind,r=t.index++;return!e||r>=e.length?(t.target=void 0,{value:void 0,done:!0}):\"keys\"==n?{value:r,done:!1}:\"values\"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}}),\"values\"),o.Arguments=o.Array,i(\"keys\"),i(\"values\"),i(\"entries\")},function(t,e,n){\"use strict\";var r=n(85),i=n(62),o=n(170),u=(n(172),n(298));n(86),n(299);function s(t,e,n){this.props=t,this.context=e,this.refs=u,this.updater=n||o}function a(t,e,n){this.props=t,this.context=e,this.refs=u,this.updater=n||o}function c(){}s.prototype.isReactComponent={},s.prototype.setState=function(t,e){\"object\"!=typeof t&&\"function\"!=typeof t&&null!=t&&r(\"85\"),this.updater.enqueueSetState(this,t),e&&this.updater.enqueueCallback(this,e,\"setState\")},s.prototype.forceUpdate=function(t){this.updater.enqueueForceUpdate(this),t&&this.updater.enqueueCallback(this,t,\"forceUpdate\")},c.prototype=s.prototype,a.prototype=new c,a.prototype.constructor=a,i(a.prototype,s.prototype),a.prototype.isPureReactComponent=!0,t.exports={Component:s,PureComponent:a}},function(t,e,n){\"use strict\";n(121);var r={isMounted:function(t){return!1},enqueueCallback:function(t,e){},enqueueForceUpdate:function(t){},enqueueReplaceState:function(t,e){},enqueueSetState:function(t,e){}};t.exports=r},function(t,e,n){\"use strict\";function r(t){return function(){return t}}var i=function(){};i.thatReturns=r,i.thatReturnsFalse=r(!1),i.thatReturnsTrue=r(!0),i.thatReturnsNull=r(null),i.thatReturnsThis=function(){return this},i.thatReturnsArgument=function(t){return t},t.exports=i},function(t,e,n){\"use strict\";t.exports=!1},function(t,e,n){\"use strict\";t.exports={current:null}},function(t,e,n){\"use strict\";var r=\"function\"==typeof Symbol&&Symbol.for&&Symbol.for(\"react.element\")||60103;t.exports=r},function(t,e,n){\"use strict\";t.exports=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\"},function(t,e,n){t.exports=n(316)()},function(t,e){var n={}.toString;t.exports=Array.isArray||function(t){return\"[object Array]\"==n.call(t)}},function(t,e,n){n(333);var r=n(10);t.exports=r.Array.isArray},function(t,e){t.exports=function(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(61),i=n(44),o=n(7)(\"iterator\");t.exports=function(t){if(null!=t)return t[o]||t[\"@@iterator\"]||i[r(t)]}},function(t,e,n){t.exports=n(336)},function(t,e,n){var r=n(346),i=Array.prototype;t.exports=function(t){var e=t.slice;return t===i||t instanceof Array&&e===i.slice?r:e}},function(t,e,n){var r=n(396);t.exports=function(t){if(r(t))throw TypeError(\"The method doesn't accept regular expressions\");return t}},function(t,e,n){var r=n(7)(\"match\");t.exports=function(t){var e=/./;try{\"/./\"[t](e)}catch(n){try{return e[r]=!1,\"/./\"[t](e)}catch(t){}}return!1}},function(t,e){t.exports=\"\\t\\n\\v\\f\\r                　\\u2028\\u2029\\ufeff\"},function(t,e,n){(function(e){var n=\"object\"==typeof e&&e&&e.Object===Object&&e;t.exports=n}).call(this,n(20))},function(t,e){var n=RegExp(\"[\\\\u200d\\\\ud800-\\\\udfff\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff\\\\ufe0e\\\\ufe0f]\");t.exports=function(t){return n.test(t)}},function(t,e){var n=Function.prototype.toString;t.exports=function(t){if(null!=t){try{return n.call(t)}catch(t){}try{return t+\"\"}catch(t){}}return\"\"}},function(t,e,n){var r=n(90),i=n(462),o=n(463),u=n(464),s=n(465),a=n(466);function c(t){var e=this.__data__=new r(t);this.size=e.size}c.prototype.clear=i,c.prototype.delete=o,c.prototype.get=u,c.prototype.has=s,c.prototype.set=a,t.exports=c},function(t,e,n){var r=n(467),i=n(66);t.exports=function t(e,n,o,u,s){return e===n||(null==e||null==n||!i(e)&&!i(n)?e!=e&&n!=n:r(e,n,o,u,t,s))}},function(t,e,n){var r=n(468),i=n(192),o=n(471);t.exports=function(t,e,n,u,s,a){var c=1&n,f=t.length,l=e.length;if(f!=l&&!(c&&l>f))return!1;var p=a.get(t),h=a.get(e);if(p&&h)return p==e&&h==t;var d=-1,y=!0,v=2&n?new r:void 0;for(a.set(t,e),a.set(e,t);++d<f;){var g=t[d],w=e[d];if(u)var M=c?u(w,g,d,e,t,a):u(g,w,d,t,e,a);if(void 0!==M){if(M)continue;y=!1;break}if(v){if(!i(e,(function(t,e){if(!o(v,e)&&(g===t||s(g,t,n,u,a)))return v.push(e)}))){y=!1;break}}else if(g!==w&&!s(g,w,n,u,a)){y=!1;break}}return a.delete(t),a.delete(e),y}},function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n<r;)if(e(t[n],n,t))return!0;return!1}},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,\"loaded\",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,\"id\",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,n){var r=n(195),i=n(490),o=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return i(t);var e=[];for(var n in Object(t))o.call(t,n)&&\"constructor\"!=n&&e.push(n);return e}},function(t,e){var n=Object.prototype;t.exports=function(t){var e=t&&t.constructor;return t===(\"function\"==typeof e&&e.prototype||n)}},function(t,e,n){var r=n(492),i=n(127),o=n(493),u=n(494),s=n(495),a=n(65),c=n(188),f=\"[object Map]\",l=\"[object Promise]\",p=\"[object Set]\",h=\"[object WeakMap]\",d=\"[object DataView]\",y=c(r),v=c(i),g=c(o),w=c(u),M=c(s),m=a;(r&&m(new r(new ArrayBuffer(1)))!=d||i&&m(new i)!=f||o&&m(o.resolve())!=l||u&&m(new u)!=p||s&&m(new s)!=h)&&(m=function(t){var e=a(t),n=\"[object Object]\"==e?t.constructor:void 0,r=n?c(n):\"\";if(r)switch(r){case y:return d;case v:return f;case g:return l;case w:return p;case M:return h}return e}),t.exports=m},function(t,e,n){var r=n(67);t.exports=function(t){return t==t&&!r(t)}},function(t,e){t.exports=function(t,e){return function(n){return null!=n&&(n[t]===e&&(void 0!==e||t in Object(n)))}}},function(t,e,n){var r=n(200),i=n(94);t.exports=function(t,e){for(var n=0,o=(e=r(e,t)).length;null!=t&&n<o;)t=t[i(e[n++])];return n&&n==o?t:void 0}},function(t,e,n){var r=n(22),i=n(134),o=n(499),u=n(64);t.exports=function(t,e){return r(t)?t:i(t,e)?[t]:o(u(t))}},function(t,e,n){\"use strict\";(function(e,r){var i=n(95);t.exports=M;var o,u=n(177);M.ReadableState=w;n(135).EventEmitter;var s=function(t,e){return t.listeners(e).length},a=n(202),c=n(17).Buffer,f=e.Uint8Array||function(){};var l=n(69);l.inherits=n(16);var p=n(524),h=void 0;h=p&&p.debuglog?p.debuglog(\"stream\"):function(){};var d,y=n(525),v=n(203);l.inherits(M,a);var g=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];function w(t,e){t=t||{};var r=e instanceof(o=o||n(35));this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode);var i=t.highWaterMark,u=t.readableHighWaterMark,s=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:r&&(u||0===u)?u:s,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new y,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(d||(d=n(205).StringDecoder),this.decoder=new d(t.encoding),this.encoding=t.encoding)}function M(t){if(o=o||n(35),!(this instanceof M))return new M(t);this._readableState=new w(t,this),this.readable=!0,t&&(\"function\"==typeof t.read&&(this._read=t.read),\"function\"==typeof t.destroy&&(this._destroy=t.destroy)),a.call(this)}function m(t,e,n,r,i){var o,u=t._readableState;null===e?(u.reading=!1,function(t,e){if(e.ended)return;if(e.decoder){var n=e.decoder.end();n&&n.length&&(e.buffer.push(n),e.length+=e.objectMode?1:n.length)}e.ended=!0,x(t)}(t,u)):(i||(o=function(t,e){var n;r=e,c.isBuffer(r)||r instanceof f||\"string\"==typeof e||void 0===e||t.objectMode||(n=new TypeError(\"Invalid non-string/buffer chunk\"));var r;return n}(u,e)),o?t.emit(\"error\",o):u.objectMode||e&&e.length>0?(\"string\"==typeof e||u.objectMode||Object.getPrototypeOf(e)===c.prototype||(e=function(t){return c.from(t)}(e)),r?u.endEmitted?t.emit(\"error\",new Error(\"stream.unshift() after end event\")):_(t,u,e,!0):u.ended?t.emit(\"error\",new Error(\"stream.push() after EOF\")):(u.reading=!1,u.decoder&&!n?(e=u.decoder.write(e),u.objectMode||0!==e.length?_(t,u,e,!1):N(t,u)):_(t,u,e,!1))):r||(u.reading=!1));return function(t){return!t.ended&&(t.needReadable||t.length<t.highWaterMark||0===t.length)}(u)}function _(t,e,n,r){e.flowing&&0===e.length&&!e.sync?(t.emit(\"data\",n),t.read(0)):(e.length+=e.objectMode?1:n.length,r?e.buffer.unshift(n):e.buffer.push(n),e.needReadable&&x(t)),N(t,e)}Object.defineProperty(M.prototype,\"destroyed\",{get:function(){return void 0!==this._readableState&&this._readableState.destroyed},set:function(t){this._readableState&&(this._readableState.destroyed=t)}}),M.prototype.destroy=v.destroy,M.prototype._undestroy=v.undestroy,M.prototype._destroy=function(t,e){this.push(null),e(t)},M.prototype.push=function(t,e){var n,r=this._readableState;return r.objectMode?n=!0:\"string\"==typeof t&&((e=e||r.defaultEncoding)!==r.encoding&&(t=c.from(t,e),e=\"\"),n=!0),m(this,t,e,!1,n)},M.prototype.unshift=function(t){return m(this,t,null,!0,!1)},M.prototype.isPaused=function(){return!1===this._readableState.flowing},M.prototype.setEncoding=function(t){return d||(d=n(205).StringDecoder),this._readableState.decoder=new d(t),this._readableState.encoding=t,this};var L=8388608;function b(t,e){return t<=0||0===e.length&&e.ended?0:e.objectMode?1:t!=t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=function(t){return t>=L?t=L:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function x(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(h(\"emitReadable\",e.flowing),e.emittedReadable=!0,e.sync?i.nextTick(j,t):j(t))}function j(t){h(\"emit readable\"),t.emit(\"readable\"),A(t)}function N(t,e){e.readingMore||(e.readingMore=!0,i.nextTick(S,t,e))}function S(t,e){for(var n=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length<e.highWaterMark&&(h(\"maybeReadMore read 0\"),t.read(0),n!==e.length);)n=e.length;e.readingMore=!1}function D(t){h(\"readable nexttick read 0\"),t.read(0)}function I(t,e){e.reading||(h(\"resume read 0\"),t.read(0)),e.resumeScheduled=!1,e.awaitDrain=0,t.emit(\"resume\"),A(t),e.flowing&&!e.reading&&t.read(0)}function A(t){var e=t._readableState;for(h(\"flow\",e.flowing);e.flowing&&null!==t.read(););}function O(t,e){return 0===e.length?null:(e.objectMode?n=e.buffer.shift():!t||t>=e.length?(n=e.decoder?e.buffer.join(\"\"):1===e.buffer.length?e.buffer.head.data:e.buffer.concat(e.length),e.buffer.clear()):n=function(t,e,n){var r;t<e.head.data.length?(r=e.head.data.slice(0,t),e.head.data=e.head.data.slice(t)):r=t===e.head.data.length?e.shift():n?function(t,e){var n=e.head,r=1,i=n.data;t-=i.length;for(;n=n.next;){var o=n.data,u=t>o.length?o.length:t;if(u===o.length?i+=o:i+=o.slice(0,t),0===(t-=u)){u===o.length?(++r,n.next?e.head=n.next:e.head=e.tail=null):(e.head=n,n.data=o.slice(u));break}++r}return e.length-=r,i}(t,e):function(t,e){var n=c.allocUnsafe(t),r=e.head,i=1;r.data.copy(n),t-=r.data.length;for(;r=r.next;){var o=r.data,u=t>o.length?o.length:t;if(o.copy(n,n.length-t,0,u),0===(t-=u)){u===o.length?(++i,r.next?e.head=r.next:e.head=e.tail=null):(e.head=r,r.data=o.slice(u));break}++i}return e.length-=i,n}(t,e);return r}(t,e.buffer,e.decoder),n);var n}function T(t){var e=t._readableState;if(e.length>0)throw new Error('\"endReadable()\" called on non-empty stream');e.endEmitted||(e.ended=!0,i.nextTick(C,e,t))}function C(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit(\"end\"))}function E(t,e){for(var n=0,r=t.length;n<r;n++)if(t[n]===e)return n;return-1}M.prototype.read=function(t){h(\"read\",t),t=parseInt(t,10);var e=this._readableState,n=t;if(0!==t&&(e.emittedReadable=!1),0===t&&e.needReadable&&(e.length>=e.highWaterMark||e.ended))return h(\"read: emitReadable\",e.length,e.ended),0===e.length&&e.ended?T(this):x(this),null;if(0===(t=b(t,e))&&e.ended)return 0===e.length&&T(this),null;var r,i=e.needReadable;return h(\"need readable\",i),(0===e.length||e.length-t<e.highWaterMark)&&h(\"length less than watermark\",i=!0),e.ended||e.reading?h(\"reading or ended\",i=!1):i&&(h(\"do read\"),e.reading=!0,e.sync=!0,0===e.length&&(e.needReadable=!0),this._read(e.highWaterMark),e.sync=!1,e.reading||(t=b(n,e))),null===(r=t>0?O(t,e):null)?(e.needReadable=!0,t=0):e.length-=t,0===e.length&&(e.ended||(e.needReadable=!0),n!==t&&e.ended&&T(this)),null!==r&&this.emit(\"data\",r),r},M.prototype._read=function(t){this.emit(\"error\",new Error(\"_read() is not implemented\"))},M.prototype.pipe=function(t,e){var n=this,o=this._readableState;switch(o.pipesCount){case 0:o.pipes=t;break;case 1:o.pipes=[o.pipes,t];break;default:o.pipes.push(t)}o.pipesCount+=1,h(\"pipe count=%d opts=%j\",o.pipesCount,e);var a=(!e||!1!==e.end)&&t!==r.stdout&&t!==r.stderr?f:M;function c(e,r){h(\"onunpipe\"),e===n&&r&&!1===r.hasUnpiped&&(r.hasUnpiped=!0,h(\"cleanup\"),t.removeListener(\"close\",g),t.removeListener(\"finish\",w),t.removeListener(\"drain\",l),t.removeListener(\"error\",v),t.removeListener(\"unpipe\",c),n.removeListener(\"end\",f),n.removeListener(\"end\",M),n.removeListener(\"data\",y),p=!0,!o.awaitDrain||t._writableState&&!t._writableState.needDrain||l())}function f(){h(\"onend\"),t.end()}o.endEmitted?i.nextTick(a):n.once(\"end\",a),t.on(\"unpipe\",c);var l=function(t){return function(){var e=t._readableState;h(\"pipeOnDrain\",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&s(t,\"data\")&&(e.flowing=!0,A(t))}}(n);t.on(\"drain\",l);var p=!1;var d=!1;function y(e){h(\"ondata\"),d=!1,!1!==t.write(e)||d||((1===o.pipesCount&&o.pipes===t||o.pipesCount>1&&-1!==E(o.pipes,t))&&!p&&(h(\"false write response, pause\",n._readableState.awaitDrain),n._readableState.awaitDrain++,d=!0),n.pause())}function v(e){h(\"onerror\",e),M(),t.removeListener(\"error\",v),0===s(t,\"error\")&&t.emit(\"error\",e)}function g(){t.removeListener(\"finish\",w),M()}function w(){h(\"onfinish\"),t.removeListener(\"close\",g),M()}function M(){h(\"unpipe\"),n.unpipe(t)}return n.on(\"data\",y),function(t,e,n){if(\"function\"==typeof t.prependListener)return t.prependListener(e,n);t._events&&t._events[e]?u(t._events[e])?t._events[e].unshift(n):t._events[e]=[n,t._events[e]]:t.on(e,n)}(t,\"error\",v),t.once(\"close\",g),t.once(\"finish\",w),t.emit(\"pipe\",n),o.flowing||(h(\"pipe resume\"),n.resume()),t},M.prototype.unpipe=function(t){var e=this._readableState,n={hasUnpiped:!1};if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes||(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit(\"unpipe\",this,n)),this;if(!t){var r=e.pipes,i=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var o=0;o<i;o++)r[o].emit(\"unpipe\",this,n);return this}var u=E(e.pipes,t);return-1===u||(e.pipes.splice(u,1),e.pipesCount-=1,1===e.pipesCount&&(e.pipes=e.pipes[0]),t.emit(\"unpipe\",this,n)),this},M.prototype.on=function(t,e){var n=a.prototype.on.call(this,t,e);if(\"data\"===t)!1!==this._readableState.flowing&&this.resume();else if(\"readable\"===t){var r=this._readableState;r.endEmitted||r.readableListening||(r.readableListening=r.needReadable=!0,r.emittedReadable=!1,r.reading?r.length&&x(this):i.nextTick(D,this))}return n},M.prototype.addListener=M.prototype.on,M.prototype.resume=function(){var t=this._readableState;return t.flowing||(h(\"resume\"),t.flowing=!0,function(t,e){e.resumeScheduled||(e.resumeScheduled=!0,i.nextTick(I,t,e))}(this,t)),this},M.prototype.pause=function(){return h(\"call pause flowing=%j\",this._readableState.flowing),!1!==this._readableState.flowing&&(h(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this},M.prototype.wrap=function(t){var e=this,n=this._readableState,r=!1;for(var i in t.on(\"end\",(function(){if(h(\"wrapped end\"),n.decoder&&!n.ended){var t=n.decoder.end();t&&t.length&&e.push(t)}e.push(null)})),t.on(\"data\",(function(i){(h(\"wrapped data\"),n.decoder&&(i=n.decoder.write(i)),n.objectMode&&null==i)||(n.objectMode||i&&i.length)&&(e.push(i)||(r=!0,t.pause()))})),t)void 0===this[i]&&\"function\"==typeof t[i]&&(this[i]=function(e){return function(){return t[e].apply(t,arguments)}}(i));for(var o=0;o<g.length;o++)t.on(g[o],this.emit.bind(this,g[o]));return this._read=function(e){h(\"wrapped _read\",e),r&&(r=!1,t.resume())},this},Object.defineProperty(M.prototype,\"readableHighWaterMark\",{enumerable:!1,get:function(){return this._readableState.highWaterMark}}),M._fromList=O}).call(this,n(20),n(34))},function(t,e,n){t.exports=n(135).EventEmitter},function(t,e,n){\"use strict\";var r=n(95);function i(t,e){t.emit(\"error\",e)}t.exports={destroy:function(t,e){var n=this,o=this._readableState&&this._readableState.destroyed,u=this._writableState&&this._writableState.destroyed;return o||u?(e?e(t):!t||this._writableState&&this._writableState.errorEmitted||r.nextTick(i,this,t),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,(function(t){!e&&t?(r.nextTick(i,n,t),n._writableState&&(n._writableState.errorEmitted=!0)):e&&e(t)})),this)},undestroy:function(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}}},function(t,e,n){(function(t){var r=void 0!==t&&t||\"undefined\"!=typeof self&&self||window,i=Function.prototype.apply;function o(t,e){this._id=t,this._clearFn=e}e.setTimeout=function(){return new o(i.call(setTimeout,r,arguments),clearTimeout)},e.setInterval=function(){return new o(i.call(setInterval,r,arguments),clearInterval)},e.clearTimeout=e.clearInterval=function(t){t&&t.close()},o.prototype.unref=o.prototype.ref=function(){},o.prototype.close=function(){this._clearFn.call(r,this._id)},e.enroll=function(t,e){clearTimeout(t._idleTimeoutId),t._idleTimeout=e},e.unenroll=function(t){clearTimeout(t._idleTimeoutId),t._idleTimeout=-1},e._unrefActive=e.active=function(t){clearTimeout(t._idleTimeoutId);var e=t._idleTimeout;e>=0&&(t._idleTimeoutId=setTimeout((function(){t._onTimeout&&t._onTimeout()}),e))},n(527),e.setImmediate=\"undefined\"!=typeof self&&self.setImmediate||void 0!==t&&t.setImmediate||this&&this.setImmediate,e.clearImmediate=\"undefined\"!=typeof self&&self.clearImmediate||void 0!==t&&t.clearImmediate||this&&this.clearImmediate}).call(this,n(20))},function(t,e,n){\"use strict\";var r=n(17).Buffer,i=r.isEncoding||function(t){switch((t=\"\"+t)&&t.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};function o(t){var e;switch(this.encoding=function(t){var e=function(t){if(!t)return\"utf8\";for(var e;;)switch(t){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return t;default:if(e)return;t=(\"\"+t).toLowerCase(),e=!0}}(t);if(\"string\"!=typeof e&&(r.isEncoding===i||!i(t)))throw new Error(\"Unknown encoding: \"+t);return e||t}(t),this.encoding){case\"utf16le\":this.text=a,this.end=c,e=4;break;case\"utf8\":this.fillLast=s,e=4;break;case\"base64\":this.text=f,this.end=l,e=3;break;default:return this.write=p,void(this.end=h)}this.lastNeed=0,this.lastTotal=0,this.lastChar=r.allocUnsafe(e)}function u(t){return t<=127?0:t>>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function s(t){var e=this.lastTotal-this.lastNeed,n=function(t,e,n){if(128!=(192&e[0]))return t.lastNeed=0,\"�\";if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,\"�\";if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,\"�\"}}(this,t);return void 0!==n?n:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function a(t,e){if((t.length-e)%2==0){var n=t.toString(\"utf16le\",e);if(n){var r=n.charCodeAt(n.length-1);if(r>=55296&&r<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],n.slice(0,-1)}return n}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString(\"utf16le\",e,t.length-1)}function c(t){var e=t&&t.length?this.write(t):\"\";if(this.lastNeed){var n=this.lastTotal-this.lastNeed;return e+this.lastChar.toString(\"utf16le\",0,n)}return e}function f(t,e){var n=(t.length-e)%3;return 0===n?t.toString(\"base64\",e):(this.lastNeed=3-n,this.lastTotal=3,1===n?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString(\"base64\",e,t.length-n))}function l(t){var e=t&&t.length?this.write(t):\"\";return this.lastNeed?e+this.lastChar.toString(\"base64\",0,3-this.lastNeed):e}function p(t){return t.toString(this.encoding)}function h(t){return t&&t.length?this.write(t):\"\"}e.StringDecoder=o,o.prototype.write=function(t){if(0===t.length)return\"\";var e,n;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return\"\";n=this.lastNeed,this.lastNeed=0}else n=0;return n<t.length?e?e+this.text(t,n):this.text(t,n):e||\"\"},o.prototype.end=function(t){var e=t&&t.length?this.write(t):\"\";return this.lastNeed?e+\"�\":e},o.prototype.text=function(t,e){var n=function(t,e,n){var r=e.length-1;if(r<n)return 0;var i=u(e[r]);if(i>=0)return i>0&&(t.lastNeed=i-1),i;if(--r<n||-2===i)return 0;if((i=u(e[r]))>=0)return i>0&&(t.lastNeed=i-2),i;if(--r<n||-2===i)return 0;if((i=u(e[r]))>=0)return i>0&&(2===i?i=0:t.lastNeed=i-3),i;return 0}(this,t,e);if(!this.lastNeed)return t.toString(\"utf8\",e);this.lastTotal=n;var r=t.length-(n-this.lastNeed);return t.copy(this.lastChar,0,r),t.toString(\"utf8\",e,r)},o.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length}},function(t,e,n){\"use strict\";t.exports=u;var r=n(35),i=n(69);function o(t,e){var n=this._transformState;n.transforming=!1;var r=n.writecb;if(!r)return this.emit(\"error\",new Error(\"write callback called multiple times\"));n.writechunk=null,n.writecb=null,null!=e&&this.push(e),r(t);var i=this._readableState;i.reading=!1,(i.needReadable||i.length<i.highWaterMark)&&this._read(i.highWaterMark)}function u(t){if(!(this instanceof u))return new u(t);r.call(this,t),this._transformState={afterTransform:o.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,t&&(\"function\"==typeof t.transform&&(this._transform=t.transform),\"function\"==typeof t.flush&&(this._flush=t.flush)),this.on(\"prefinish\",s)}function s(){var t=this;\"function\"==typeof this._flush?this._flush((function(e,n){a(t,e,n)})):a(this,null,null)}function a(t,e,n){if(e)return t.emit(\"error\",e);if(null!=n&&t.push(n),t._writableState.length)throw new Error(\"Calling transform done when ws.length != 0\");if(t._transformState.transforming)throw new Error(\"Calling transform done when still transforming\");return t.push(null)}i.inherits=n(16),i.inherits(u,r),u.prototype.push=function(t,e){return this._transformState.needTransform=!1,r.prototype.push.call(this,t,e)},u.prototype._transform=function(t,e,n){throw new Error(\"_transform() is not implemented\")},u.prototype._write=function(t,e,n){var r=this._transformState;if(r.writecb=n,r.writechunk=t,r.writeencoding=e,!r.transforming){var i=this._readableState;(r.needTransform||i.needReadable||i.length<i.highWaterMark)&&this._read(i.highWaterMark)}},u.prototype._read=function(t){var e=this._transformState;null!==e.writechunk&&e.writecb&&!e.transforming?(e.transforming=!0,this._transform(e.writechunk,e.writeencoding,e.afterTransform)):e.needTransform=!0},u.prototype._destroy=function(t,e){var n=this;r.prototype._destroy.call(this,t,(function(t){e(t),n.emit(\"close\")}))}},function(t,e,n){\"use strict\";var r=n(36),i=Array.prototype.forEach,o=Object.create,u=function(t,e){var n;for(n in t)e[n]=t[n]};t.exports=function(t){var e=o(null);return i.call(arguments,(function(t){r(t)&&u(Object(t),e)})),e}},function(t,e,n){\"use strict\";var r=n(37);t.exports=function(t,e,n){var i;return isNaN(t)?(i=e)>=0?n&&i?i-1:i:1:!1!==t&&r(t)}},function(t,e,n){\"use strict\";t.exports=n(543)()?Object.assign:n(544)},function(t,e,n){\"use strict\";var r,i,o,u,s,a=n(37),c=function(t,e){return e};try{Object.defineProperty(c,\"length\",{configurable:!0,writable:!1,enumerable:!1,value:1})}catch(t){}1===c.length?(r={configurable:!0,writable:!1,enumerable:!1},i=Object.defineProperty,t.exports=function(t,e){return e=a(e),t.length===e?t:(r.value=e,i(t,\"length\",r))}):(u=n(211),s=[],o=function(t){var e,n=0;if(s[t])return s[t];for(e=[];t--;)e.push(\"a\"+(++n).toString(36));return new Function(\"fn\",\"return function (\"+e.join(\", \")+\") { return fn.apply(this, arguments); };\")},t.exports=function(t,e){var n;if(e=a(e),t.length===e)return t;n=o(e)(t);try{u(n,t)}catch(t){}return n})},function(t,e,n){\"use strict\";var r=n(47),i=Object.defineProperty,o=Object.getOwnPropertyDescriptor,u=Object.getOwnPropertyNames,s=Object.getOwnPropertySymbols;t.exports=function(t,e){var n,a=Object(r(e));if(t=Object(r(t)),u(a).forEach((function(r){try{i(t,r,o(e,r))}catch(t){n=t}})),\"function\"==typeof s&&s(a).forEach((function(r){try{i(t,r,o(e,r))}catch(t){n=t}})),void 0!==n)throw n;return t}},function(t,e,n){\"use strict\";t.exports=function(t){return null!=t}},function(t,e,n){\"use strict\";var r=n(566);t.exports=function(t){if(!r(t))throw new TypeError(t+\" is not a symbol\");return t}},function(t,e,n){\"use strict\";var r=n(31),i=n(96),o=Function.prototype.call;t.exports=function(t,e){var n={},u=arguments[2];return r(e),i(t,(function(t,r,i,s){n[r]=o.call(e,u,t,r,i,s)})),n}},function(t,e,n){\"use strict\";t.exports=function(t){return\"function\"==typeof t}},function(t,e){function n(t){return!!t&&(\"object\"==typeof t||\"function\"==typeof t)&&\"function\"==typeof t.then}t.exports=n,t.exports.default=n},function(t,e,n){var r=n(16),i=n(48),o=n(17).Buffer,u=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],s=new Array(64);function a(){this.init(),this._w=s,i.call(this,64,56)}function c(t,e,n){return n^t&(e^n)}function f(t,e,n){return t&e|n&(t|e)}function l(t){return(t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10)}function p(t){return(t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7)}function h(t){return(t>>>7|t<<25)^(t>>>18|t<<14)^t>>>3}r(a,i),a.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},a.prototype._update=function(t){for(var e,n=this._w,r=0|this._a,i=0|this._b,o=0|this._c,s=0|this._d,a=0|this._e,d=0|this._f,y=0|this._g,v=0|this._h,g=0;g<16;++g)n[g]=t.readInt32BE(4*g);for(;g<64;++g)n[g]=0|(((e=n[g-2])>>>17|e<<15)^(e>>>19|e<<13)^e>>>10)+n[g-7]+h(n[g-15])+n[g-16];for(var w=0;w<64;++w){var M=v+p(a)+c(a,d,y)+u[w]+n[w]|0,m=l(r)+f(r,i,o)|0;v=y,y=d,d=a,a=s+M|0,s=o,o=i,i=r,r=M+m|0}this._a=r+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=s+this._d|0,this._e=a+this._e|0,this._f=d+this._f|0,this._g=y+this._g|0,this._h=v+this._h|0},a.prototype._hash=function(){var t=o.allocUnsafe(32);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t.writeInt32BE(this._h,28),t},t.exports=a},function(t,e,n){var r=n(16),i=n(48),o=n(17).Buffer,u=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],s=new Array(160);function a(){this.init(),this._w=s,i.call(this,128,112)}function c(t,e,n){return n^t&(e^n)}function f(t,e,n){return t&e|n&(t|e)}function l(t,e){return(t>>>28|e<<4)^(e>>>2|t<<30)^(e>>>7|t<<25)}function p(t,e){return(t>>>14|e<<18)^(t>>>18|e<<14)^(e>>>9|t<<23)}function h(t,e){return(t>>>1|e<<31)^(t>>>8|e<<24)^t>>>7}function d(t,e){return(t>>>1|e<<31)^(t>>>8|e<<24)^(t>>>7|e<<25)}function y(t,e){return(t>>>19|e<<13)^(e>>>29|t<<3)^t>>>6}function v(t,e){return(t>>>19|e<<13)^(e>>>29|t<<3)^(t>>>6|e<<26)}function g(t,e){return t>>>0<e>>>0?1:0}r(a,i),a.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},a.prototype._update=function(t){for(var e=this._w,n=0|this._ah,r=0|this._bh,i=0|this._ch,o=0|this._dh,s=0|this._eh,a=0|this._fh,w=0|this._gh,M=0|this._hh,m=0|this._al,_=0|this._bl,L=0|this._cl,b=0|this._dl,x=0|this._el,j=0|this._fl,N=0|this._gl,S=0|this._hl,D=0;D<32;D+=2)e[D]=t.readInt32BE(4*D),e[D+1]=t.readInt32BE(4*D+4);for(;D<160;D+=2){var I=e[D-30],A=e[D-30+1],O=h(I,A),T=d(A,I),C=y(I=e[D-4],A=e[D-4+1]),E=v(A,I),z=e[D-14],k=e[D-14+1],Y=e[D-32],U=e[D-32+1],P=T+k|0,R=O+z+g(P,T)|0;R=(R=R+C+g(P=P+E|0,E)|0)+Y+g(P=P+U|0,U)|0,e[D]=R,e[D+1]=P}for(var Q=0;Q<160;Q+=2){R=e[Q],P=e[Q+1];var F=f(n,r,i),B=f(m,_,L),G=l(n,m),W=l(m,n),q=p(s,x),J=p(x,s),Z=u[Q],V=u[Q+1],X=c(s,a,w),H=c(x,j,N),K=S+J|0,$=M+q+g(K,S)|0;$=($=($=$+X+g(K=K+H|0,H)|0)+Z+g(K=K+V|0,V)|0)+R+g(K=K+P|0,P)|0;var tt=W+B|0,et=G+F+g(tt,W)|0;M=w,S=N,w=a,N=j,a=s,j=x,s=o+$+g(x=b+K|0,b)|0,o=i,b=L,i=r,L=_,r=n,_=m,n=$+et+g(m=K+tt|0,K)|0}this._al=this._al+m|0,this._bl=this._bl+_|0,this._cl=this._cl+L|0,this._dl=this._dl+b|0,this._el=this._el+x|0,this._fl=this._fl+j|0,this._gl=this._gl+N|0,this._hl=this._hl+S|0,this._ah=this._ah+n+g(this._al,m)|0,this._bh=this._bh+r+g(this._bl,_)|0,this._ch=this._ch+i+g(this._cl,L)|0,this._dh=this._dh+o+g(this._dl,b)|0,this._eh=this._eh+s+g(this._el,x)|0,this._fh=this._fh+a+g(this._fl,j)|0,this._gh=this._gh+w+g(this._gl,N)|0,this._hh=this._hh+M+g(this._hl,S)|0},a.prototype._hash=function(){var t=o.allocUnsafe(64);function e(e,n,r){t.writeInt32BE(e,r),t.writeInt32BE(n,r+4)}return e(this._ah,this._al,0),e(this._bh,this._bl,8),e(this._ch,this._cl,16),e(this._dh,this._dl,24),e(this._eh,this._el,32),e(this._fh,this._fl,40),e(this._gh,this._gl,48),e(this._hh,this._hl,56),t},t.exports=a},function(t,e){t.exports=\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgNDA3IDExNiI+DQogIDxkZWZzPg0KICAgIDxzdHlsZT4NCiAgICAgIC5jbHMtMSB7DQogICAgICAgIGNsaXAtcGF0aDogdXJsKCNjbGlwLVNXX1RNLWxvZ28tb24tZGFyayk7DQogICAgICB9DQoNCiAgICAgIC5jbHMtMiB7DQogICAgICAgIGZpbGw6ICNmZmY7DQogICAgICB9DQoNCiAgICAgIC5jbHMtMyB7DQogICAgICAgIGZpbGw6ICM4NWVhMmQ7DQogICAgICB9DQoNCiAgICAgIC5jbHMtNCB7DQogICAgICAgIGZpbGw6ICMxNzM2NDc7DQogICAgICB9DQogICAgPC9zdHlsZT4NCiAgICA8Y2xpcFBhdGggaWQ9ImNsaXAtU1dfVE0tbG9nby1vbi1kYXJrIj4NCiAgICAgIDxyZWN0IHdpZHRoPSI0MDciIGhlaWdodD0iMTE2Ii8+DQogICAgPC9jbGlwUGF0aD4NCiAgPC9kZWZzPg0KICA8ZyBpZD0iU1dfVE0tbG9nby1vbi1kYXJrIiBjbGFzcz0iY2xzLTEiPg0KICAgIDxnIGlkPSJTV19Jbi1Qcm9kdWN0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC4zMDEpIj4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzI5MzYiIGRhdGEtbmFtZT0iUGF0aCAyOTM2IiBjbGFzcz0iY2xzLTIiIGQ9Ik0zNTkuMTUsNzAuNjc0aC0uN1Y2Ni45OTJoLTEuMjZ2LS42aDMuMjE5di42SDM1OS4xNVoiLz4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzI5MzciIGRhdGEtbmFtZT0iUGF0aCAyOTM3IiBjbGFzcz0iY2xzLTIiIGQ9Ik0zNjMuMjE3LDcwLjY3NCwzNjEuOTc1LDY3LjFoLS4wMjNxLjA1LjguMDUsMS40OTR2Mi4wODNoLS42MzZWNjYuMzkxaC45ODdsMS4xOSwzLjQwN2guMDE3bDEuMjI1LTMuNDA3aC45OXY0LjI4M0gzNjUuMVY2OC41NTZjMC0uMjEzLjAwNi0uNDkuMDE2LS44MzJzLjAyLS41NDkuMDI4LS42MjFoLS4wMjNsLTEuMjg2LDMuNTcxWiIvPg0KICAgICAgPHBhdGggaWQ9IlBhdGhfMjkzOCIgZGF0YS1uYW1lPSJQYXRoIDI5MzgiIGNsYXNzPSJjbHMtMyIgZD0iTTUwLjMyOCw5Ny42NjlBNDcuNjQyLDQ3LjY0MiwwLDEsMSw5Ny45NzEsNTAuMDI3LDQ3LjY0Miw0Ny42NDIsMCwwLDEsNTAuMzI4LDk3LjY2OVoiLz4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzI5MzkiIGRhdGEtbmFtZT0iUGF0aCAyOTM5IiBjbGFzcz0iY2xzLTMiIGQ9Ik01MC4zMjgsNC43NjlBNDUuMjU4LDQ1LjI1OCwwLDEsMSw1LjA3LDUwLjAyNyw0NS4yNTgsNDUuMjU4LDAsMCwxLDUwLjMyOCw0Ljc2OW0wLTQuNzY5YTUwLjAyNyw1MC4wMjcsMCwxLDAsNTAuMDI3LDUwLjAyN0E1MC4wMjcsNTAuMDI3LDAsMCwwLDUwLjMyOCwwWiIvPg0KICAgICAgPHBhdGggaWQ9IlBhdGhfMjk0MCIgZGF0YS1uYW1lPSJQYXRoIDI5NDAiIGNsYXNzPSJjbHMtNCIgZD0iTTMxLjgsMzMuODU0Yy0uMTU0LDEuNzEyLjA1OCwzLjQ4Mi0uMDU3LDUuMjEzYTQyLjY2NSw0Mi42NjUsMCwwLDEtLjY5Myw1LjE1Niw5LjUzLDkuNTMsMCwwLDEtNC4xLDUuODI5YzQuMDc5LDIuNjU0LDQuNTQsNi43NzEsNC44MSwxMC45NDYuMTM1LDIuMjUuMDc3LDQuNTIuMzA4LDYuNzUyLjE3MywxLjczMS44NDYsMi4xNzQsMi42MzYsMi4yMzEuNzMuMDIsMS40OCwwLDIuMzI3LDBWNzUuMzNjLTUuMjkuOS05LjY1Ny0uNi0xMC43MzQtNS4wNzlhMzAuNzYsMzAuNzYsMCwwLDEtLjY1NC01Yy0uMTE3LTEuNzg5LjA3Ni0zLjU3OC0uMDU4LTUuMzY3LS4zODYtNC45MDYtMS4wMi02LjU2LTUuNzEzLTYuNzkxdi02LjFBOS4xOTEsOS4xOTEsMCwwLDEsMjAuOSw0Ni44MmMyLjU3Ny0uMTM1LDMuNjc0LS45MjQsNC4yMzEtMy40NjNhMjkuMywyOS4zLDAsMCwwLC40ODEtNC4zMjksODIuMSw4Mi4xLDAsMCwxLC42LTguNDA2Yy42NzMtMy45ODIsMy4xMzYtNS45MDYsNy4yMzQtNi4xMzcsMS4xNTQtLjA1NywyLjMyNywwLDMuNjU1LDB2NS40NjRjLS41NTguMDM4LTEuMDM5LjExNS0xLjUzOS4xMTVDMzIuMjI2LDI5Ljk0OSwzMi4wNTIsMzEuMDg0LDMxLjgsMzMuODU0Wm02LjQwNiwxMi42NThoLS4wNzdhMy41MTUsMy41MTUsMCwxLDAtLjM0Niw3LjAyMWguMjMxYTMuNDYxLDMuNDYxLDAsMCwwLDMuNjU1LTMuMjUxVjUwLjA5YTMuNTIzLDMuNTIzLDAsMCwwLTMuNDYxLTMuNTc4Wm0xMi4wNjIsMGEzLjM3MywzLjM3MywwLDAsMC0zLjQ4MiwzLjI1MSwxLjc5LDEuNzksMCwwLDAsLjAyLjMyNywzLjMsMy4zLDAsMCwwLDMuNTc4LDMuNDQzLDMuMjYzLDMuMjYzLDAsMCwwLDMuNDQzLTMuNTU4LDMuMzA4LDMuMzA4LDAsMCwwLTMuNTU3LTMuNDYzWm0xMi4zNTEsMGEzLjU5MiwzLjU5MiwwLDAsMC0zLjY1NSwzLjQ4MkEzLjUyOSwzLjUyOSwwLDAsMCw2Mi41LDUzLjUzM2guMDM5YzEuNzY5LjMwOSwzLjU1OS0xLjQsMy42NzQtMy40NjJhMy41NzEsMy41NzEsMCwwLDAtMy42LTMuNTU5Wm0xNi45NDguMjg4Yy0yLjIzMi0uMS0zLjM0OC0uODQ2LTMuOS0yLjk2MmEyMS40NDcsMjEuNDQ3LDAsMCwxLS42MzUtNC4xMzZjLS4xNTQtMi41NzgtLjEzNS01LjE3NS0uMzA4LTcuNzUzLS40LTYuMTE3LTQuODI4LTguMjUyLTExLjI1NC03LjE5NXY1LjMxYzEuMDE5LDAsMS44MDgsMCwyLjYuMDE5LDEuMzY2LjAxOSwyLjQuNTM5LDIuNTM5LDIuMDU5LjEzNSwxLjM4NS4xMzUsMi43ODkuMjcsNC4xOTMuMjY5LDIuNzkuNDIyLDUuNjE4LjksOC4zNjlBOC43MTUsOC43MTUsMCwwLDAsNzMuNyw1MC4wNTJjLTMuNCwyLjI4OS00LjQwNiw1LjU1OS00LjU3OCw5LjIzNC0uMSwyLjUyLS4xNTQsNS4wNTktLjI4OSw3LjYtLjExNSwyLjMwOC0uOTIzLDMuMDU4LTMuMjUxLDMuMTE2LS42NTQuMDE5LTEuMjg5LjA3Ny0yLjAxOS4xMTV2NS40NDVjMS4zNjUsMCwyLjYxNi4wNzcsMy44NjYsMCwzLjg4Ni0uMjMxLDYuMjMzLTIuMTE3LDctNS44ODdBNDkuMDc5LDQ5LjA3OSwwLDAsMCw3NSw2My40Yy4xMzUtMS45MjMuMTE2LTMuODY2LjMwOC01Ljc3MS4yODktMi45ODIsMS42NTUtNC4yMTMsNC42MzYtNC40YTQuMDM3LDQuMDM3LDAsMCwwLC44MjgtLjE5MnYtNi4xYy0uNS0uMDU4LS44NDMtLjExNS0xLjIwOC0uMTM1WiIvPg0KICAgICAgPHBhdGggaWQ9IlBhdGhfMjk0MSIgZGF0YS1uYW1lPSJQYXRoIDI5NDEiIGNsYXNzPSJjbHMtMiIgZD0iTTE1Mi4yNzMsNTguMTIyYTExLjIyOCwxMS4yMjgsMCwwLDEtNC4zODQsOS40MjRxLTQuMzgzLDMuMzgyLTExLjksMy4zODItOC4xNCwwLTEyLjUyNC0yLjFWNjMuN2EzMi45LDMyLjksMCwwLDAsNi4xMzcsMS44NzksMzIuMywzMi4zLDAsMCwwLDYuNTc1LjY4OXE1LjMyMiwwLDguMDE1LTIuMDJhNi42MjYsNi42MjYsMCwwLDAsMi42OTItNS42Miw3LjIyMiw3LjIyMiwwLDAsMC0uOTU0LTMuOSw4Ljg4NSw4Ljg4NSwwLDAsMC0zLjE5NC0yLjgsNDQuNjM0LDQ0LjYzNCwwLDAsMC02LjgxLTIuOTExcS02LjM4Ny0yLjI4Ni05LjEyNi01LjQxN2ExMS45NTUsMTEuOTU1LDAsMCwxLTIuNzQtOC4xNzJBMTAuMTY0LDEwLjE2NCwwLDAsMSwxMjguMDM5LDI3cTMuOTc3LTMuMTMxLDEwLjUyLTMuMTMxYTMxLDMxLDAsMCwxLDEyLjU1NSwyLjVMMTQ5LjQ1NSwzMWEyOC4zODIsMjguMzgyLDAsMCwwLTExLjAyMS0yLjM4LDEwLjY2OCwxMC42NjgsMCwwLDAtNi42MDYsMS44MTYsNS45ODQsNS45ODQsMCwwLDAtMi4zOCw1LjA0MSw3LjcyMiw3LjcyMiwwLDAsMCwuODc3LDMuOSw4LjI0Miw4LjI0MiwwLDAsMCwyLjk1OSwyLjc4NiwzNi43LDM2LjcsMCwwLDAsNi4zNzEsMi44cTcuMiwyLjU2Niw5LjkxLDUuNTFBMTAuODQsMTAuODQsMCwwLDEsMTUyLjI3Myw1OC4xMjJaIi8+DQogICAgICA8cGF0aCBpZD0iUGF0aF8yOTQyIiBkYXRhLW5hbWU9IlBhdGggMjk0MiIgY2xhc3M9ImNscy0yIiBkPSJNMTg1LjI4OCw3MC4zLDE3OSw1MC4xN3EtLjU5NC0xLjg0OC0yLjIyMi04LjM5MWgtLjI1MXEtMS4yNTIsNS40NzktMi4xOTIsOC40NTNMMTY3Ljg0OSw3MC4zaC02LjAxMWwtOS4zNjEtMzQuMzE1aDUuNDQ3cTMuMzE4LDEyLjkzMSw1LjA1NywxOS42OTNhODAuMTEyLDgwLjExMiwwLDAsMSwxLjk4OCw5LjExMWguMjVxLjM0NS0xLjc4NSwxLjExMi00LjYxOHQxLjMzLTQuNDkzbDYuMjk0LTE5LjY5M2g1LjYzNWw2LjEzNywxOS42OTNhNjYuMzY5LDY2LjM2OSwwLDAsMSwyLjM3OSw5LjA0OGguMjUxYTMzLjE2MywzMy4xNjMsMCwwLDEsLjY3My0zLjQ3NXEuNTQ4LTIuMzQ3LDYuNTI4LTI1LjI2Nmg1LjM4NUwxOTEuNDU2LDcwLjNaIi8+DQogICAgICA8cGF0aCBpZD0iUGF0aF8yOTQzIiBkYXRhLW5hbWU9IlBhdGggMjk0MyIgY2xhc3M9ImNscy0yIiBkPSJNMjI1LjExNSw3MC4zbC0xLjAzMy00Ljg4NWgtLjI1YTE0LjQ0NiwxNC40NDYsMCwwLDEtNS4xMTksNC4zNjgsMTUuNjA4LDE1LjYwOCwwLDAsMS02LjM3MiwxLjE0M3EtNS4xLDAtOC0yLjYzdC0yLjktNy40ODNxMC0xMC40LDE2LjYyNi0xMC45bDUuODIzLS4xODhWNDcuNnEwLTQuMDM4LTEuNzM4LTUuOTY0VDIxNi42LDM5LjcxM2EyMi42MzMsMjIuNjMzLDAsMCwwLTkuNzA2LDIuNjNsLTEuNi0zLjk3N2EyNC40MzcsMjQuNDM3LDAsMCwxLDUuNTU3LTIuMTYsMjQuMDU2LDI0LjA1NiwwLDAsMSw2LjA1OC0uNzgzcTYuMTM2LDAsOS4xLDIuNzI0dDIuOTU5LDguNzM1VjcwLjNabS0xMS43NDEtMy42NjNBMTAuNTQ5LDEwLjU0OSwwLDAsMCwyMjEsNjMuOTc3YTkuODQ1LDkuODQ1LDAsMCwwLDIuNzcxLTcuNDUxdi0zLjFsLTUuMi4yMTlxLTYuMi4yMTktOC45MzksMS45MjZhNS44LDUuOCwwLDAsMC0yLjc0LDUuMzA2LDUuMzU0LDUuMzU0LDAsMCwwLDEuNzA3LDQuMjksNy4wODEsNy4wODEsMCwwLDAsNC43NzUsMS40NzJaIi8+DQogICAgICA8cGF0aCBpZD0iUGF0aF8yOTQ0IiBkYXRhLW5hbWU9IlBhdGggMjk0NCIgY2xhc3M9ImNscy0yIiBkPSJNMjY0LjYsMzUuOTg3djMuMjg3bC02LjM1Ni43NTJhMTEuMTYsMTEuMTYsMCwwLDEsMi4yNTUsNi44NTYsMTAuMTQ4LDEwLjE0OCwwLDAsMS0zLjQ0NCw4LjA0N3EtMy40NDQsMy05LjQ1NiwzYTE1LjczNCwxNS43MzQsMCwwLDEtMi44OC0uMjVRMjQxLjQsNTkuNDM4LDI0MS40LDYyLjFhMi4yNDIsMi4yNDIsMCwwLDAsMS4xNTksMi4wODIsOC40NTYsOC40NTYsMCwwLDAsMy45NzYuNjczaDYuMDc0cTUuNTczLDAsOC41NjMsMi4zNDhhOC4xNTgsOC4xNTgsMCwwLDEsMi45OSw2LjgyNSw5Ljc0Myw5Ljc0MywwLDAsMS00LjU3MSw4LjY4OHEtNC41NzIsMi45ODktMTMuMzM4LDIuOTktNi43MzIsMC0xMC4zNzktMi41YTguMDg3LDguMDg3LDAsMCwxLTMuNjQ3LTcuMDc2LDcuOTQ2LDcuOTQ2LDAsMCwxLDItNS40MTcsMTAuMjExLDEwLjIxMSwwLDAsMSw1LjYzNi0zLjEsNS40MjksNS40MjksMCwwLDEtMi4yMDctMS44NDcsNC44OSw0Ljg5LDAsMCwxLS44OTMtMi45MTIsNS41Myw1LjUzLDAsMCwxLDEtMy4yODgsMTAuNTI5LDEwLjUyOSwwLDAsMSwzLjE2Mi0yLjcyMyw5LjI3NSw5LjI3NSwwLDAsMS00LjMzNi0zLjcyNiwxMC45NDUsMTAuOTQ1LDAsMCwxLTEuNjc1LTYuMDEycTAtNS42MzQsMy4zODItOC42ODh0OS41OC0zLjA1MmExNy40MzksMTcuNDM5LDAsMCwxLDQuODUzLjYyNlpNMjM3LjIzMyw3Ni4wNjJhNC42Niw0LjY2LDAsMCwwLDIuMzQ4LDQuMjI3LDEyLjk3MywxMi45NzMsMCwwLDAsNi43MzIsMS40NHE2LjU0MywwLDkuNjktMS45NTZhNS45OTIsNS45OTIsMCwwLDAsMy4xNDctNS4zMDdxMC0yLjc4Ny0xLjcyMy0zLjg2N3QtNi40ODEtMS4wOGgtNi4yM2E4LjIwNSw4LjIwNSwwLDAsMC01LjUxLDEuNjksNi4wNDMsNi4wNDMsMCwwLDAtMS45NzMsNC44NTNabTIuODE4LTI5LjA4NmE2Ljk4NCw2Ljk4NCwwLDAsMCwyLjAzNSw1LjQ0OCw4LjEyMyw4LjEyMywwLDAsMCw1LjY2NywxLjg0N3E3LjYwOCwwLDcuNjA4LTcuMzg5LDAtNy43MzMtNy43LTcuNzMzYTcuNjI4LDcuNjI4LDAsMCwwLTUuNjM1LDEuOTcycS0xLjk3NiwxLjk3My0xLjk3NSw1Ljg1NVoiLz4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzI5NDUiIGRhdGEtbmFtZT0iUGF0aCAyOTQ1IiBjbGFzcz0iY2xzLTIiIGQ9Ik0yOTkuMTM2LDM1Ljk4N3YzLjI4N2wtNi4zNTYuNzUyYTExLjE2OCwxMS4xNjgsMCwwLDEsMi4yNTQsNi44NTYsMTAuMTQ1LDEwLjE0NSwwLDAsMS0zLjQ0NCw4LjA0N3EtMy40NDQsMy05LjQ1NSwzYTE1LjczNCwxNS43MzQsMCwwLDEtMi44OC0uMjVxLTMuMzIsMS43NTQtMy4zMTksNC40MTVhMi4yNDMsMi4yNDMsMCwwLDAsMS4xNTgsMi4wODIsOC40NTksOC40NTksMCwwLDAsMy45NzYuNjczaDYuMDc0cTUuNTc0LDAsOC41NjMsMi4zNDhhOC4xNTgsOC4xNTgsMCwwLDEsMi45OSw2LjgyNSw5Ljc0Myw5Ljc0MywwLDAsMS00LjU3MSw4LjY4OHEtNC41NywyLjk4OS0xMy4zMzcsMi45OS02LjczMiwwLTEwLjM3OS0yLjVhOC4wODgsOC4wODgsMCwwLDEtMy42NDgtNy4wNzYsNy45NDcsNy45NDcsMCwwLDEsMi01LjQxNywxMC4yMDcsMTAuMjA3LDAsMCwxLDUuNjM2LTMuMSw1LjQzMiw1LjQzMiwwLDAsMS0yLjIwOC0xLjg0Nyw0Ljg4OSw0Ljg4OSwwLDAsMS0uODkyLTIuOTEyLDUuNTMsNS41MywwLDAsMSwxLTMuMjg4LDEwLjUyOSwxMC41MjksMCwwLDEsMy4xNjItMi43MjMsOS4yNzEsOS4yNzEsMCwwLDEtNC4zMzYtMy43MjYsMTAuOTQ1LDEwLjk0NSwwLDAsMS0xLjY3NS02LjAxMnEwLTUuNjM0LDMuMzgxLTguNjg4dDkuNTgxLTMuMDUyYTE3LjQ0NCwxNy40NDQsMCwwLDEsNC44NTMuNjI2Wk0yNzEuNzcyLDc2LjA2MmE0LjY1OCw0LjY1OCwwLDAsMCwyLjM0OCw0LjIyNywxMi45NjksMTIuOTY5LDAsMCwwLDYuNzMxLDEuNDRxNi41NDQsMCw5LjY5MS0xLjk1NmE1Ljk5Myw1Ljk5MywwLDAsMCwzLjE0Ni01LjMwN3EwLTIuNzg3LTEuNzIyLTMuODY3dC02LjQ4MS0xLjA4aC02LjIzYTguMjA4LDguMjA4LDAsMCwwLTUuNTExLDEuNjlBNi4wNDIsNi4wNDIsMCwwLDAsMjcxLjc3Miw3Ni4wNjJabTIuODE4LTI5LjA4NmE2Ljk4NCw2Ljk4NCwwLDAsMCwyLjAzNSw1LjQ0OCw4LjEyMSw4LjEyMSwwLDAsMCw1LjY2NywxLjg0N3E3LjYwNywwLDcuNjA4LTcuMzg5LDAtNy43MzMtNy43LTcuNzMzYTcuNjI5LDcuNjI5LDAsMCwwLTUuNjM1LDEuOTcycS0xLjk3NSwxLjk3My0xLjk3NSw1Ljg1NVoiLz4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzI5NDYiIGRhdGEtbmFtZT0iUGF0aCAyOTQ2IiBjbGFzcz0iY2xzLTIiIGQ9Ik0zMTYuNzc4LDcwLjkyOHEtNy42MDgsMC0xMi4wMDctNC42MzR0LTQuNC0xMi44NjhxMC04LjMsNC4wODYtMTMuMTgxYTEzLjU3MywxMy41NzMsMCwwLDEsMTAuOTc0LTQuODg0QTEyLjkzOCwxMi45MzgsMCwwLDEsMzI1LjYzOCwzOS42cTMuNzYyLDQuMjQ3LDMuNzYyLDExLjJ2My4yODdIMzA1Ljc1N3EuMTU2LDYuMDQ0LDMuMDUzLDkuMTc0dDguMTU2LDMuMTMxYTI3LjYzMywyNy42MzMsMCwwLDAsMTAuOTU4LTIuMzE3djQuNjM0YTI3LjUsMjcuNSwwLDAsMS01LjIxMywxLjcwNiwyOS4yNTEsMjkuMjUxLDAsMCwxLTUuOTMzLjUxM1ptLTEuNDA5LTMxLjIxNWE4LjQ4OSw4LjQ4OSwwLDAsMC02LjU5MSwyLjY5MiwxMi40MTYsMTIuNDE2LDAsMCwwLTIuOSw3LjQ1MmgxNy45NHEwLTQuOTE2LTIuMTkxLTcuNTNhNy43MTQsNy43MTQsMCwwLDAtNi4yNTgtMi42MTRaIi8+DQogICAgICA8cGF0aCBpZD0iUGF0aF8yOTQ3IiBkYXRhLW5hbWU9IlBhdGggMjk0NyIgY2xhc3M9ImNscy0yIiBkPSJNMzUwLjksMzUuMzYxYTIwLjM4LDIwLjM4LDAsMCwxLDQuMS4zNzVsLS43MjEsNC44MjJhMTcuNzEyLDE3LjcxMiwwLDAsMC0zLjc1Ny0uNDdBOS4xNDIsOS4xNDIsMCwwLDAsMzQzLjQsNDMuNDdhMTIuMzI3LDEyLjMyNywwLDAsMC0yLjk1OSw4LjQyMlY3MC4zaC01LjJWMzUuOTg3aDQuMjlsLjYsNi4zNTZoLjI1YTE1LjA3MiwxNS4wNzIsMCwwLDEsNC42LTUuMTY2LDEwLjM1NiwxMC4zNTYsMCwwLDEsNS45MTktMS44MTZaIi8+DQogICAgICA8cGF0aCBpZD0iUGF0aF8yOTQ4IiBkYXRhLW5hbWU9IlBhdGggMjk0OCIgY2xhc3M9ImNscy0yIiBkPSJNMjU1Ljg1Nyw5Ni42MzhzLTMuNDMtLjM5MS00Ljg1LS4zOTFjLTIuMDU4LDAtMy4xMTEuNzM1LTMuMTExLDIuMTgsMCwxLjU2OC44ODIsMS45MzUsMy43NDgsMi43MTksMy41MjcuOTgsNC44LDEuOTExLDQuOCw0Ljc3NywwLDMuNjc1LTIuMyw1LjI2Ny01LjYxLDUuMjY3YTM1LjY4NywzNS42ODcsMCwwLDEtNS40ODctLjY2MmwuMjctMi4xOHMzLjMwNi40NDEsNS4wNDYuNDQxYzIuMDgyLDAsMy4wMzctLjkzMSwzLjAzNy0yLjcsMC0xLjQyMS0uNzU5LTEuOTEtMy4zMzEtMi41MjMtMy42MjYtLjkzLTUuMTkzLTIuMDMzLTUuMTkzLTQuOTQ4LDAtMy4zODEsMi4yMjktNC43NzYsNS41ODUtNC43NzZhMzcuMiwzNy4yLDAsMCwxLDUuMzE1LjU4N1oiLz4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzI5NDkiIGRhdGEtbmFtZT0iUGF0aCAyOTQ5IiBjbGFzcz0iY2xzLTIiIGQ9Ik0yNjIuOTY3LDk0LjE0SDI2Ny43bDMuNzQ4LDEzLjEwNkwyNzUuMiw5NC4xNGg0Ljc1MnYxNi43OEgyNzcuMlY5Ni40MmgtLjE0NWwtNC4xOTEsMTMuODE2aC0yLjg0MkwyNjUuODMxLDk2LjQyaC0uMTQ1djE0LjVoLTIuNzE5WiIvPg0KICAgICAgPHBhdGggaWQ9IlBhdGhfMjk1MCIgZGF0YS1uYW1lPSJQYXRoIDI5NTAiIGNsYXNzPSJjbHMtMiIgZD0iTTMyMi4wNTcsOTQuMTRIMzM0LjN2Mi40MjVoLTQuNzI4VjExMC45MmgtMi43NDNWOTYuNTY1aC00Ljc3N1oiLz4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzI5NTEiIGRhdGEtbmFtZT0iUGF0aCAyOTUxIiBjbGFzcz0iY2xzLTIiIGQ9Ik0zNDYuMTM3LDk0LjE0YzMuMzMyLDAsNS4xMiwxLjI0OSw1LjEyLDQuMzYxLDAsMi4wMzMtLjYzNywzLjAzNy0xLjk4NCwzLjc3MiwxLjQ0NS41NjMsMi40LDEuNTkyLDIuNCwzLjksMCwzLjQzLTIuMDgxLDQuNzUyLTUuMzM5LDQuNzUyaC02LjU2NlY5NC4xNFptLTMuNjUsMi4zNTJ2NC44aDMuNmMxLjY2NiwwLDIuNC0uODMyLDIuNC0yLjQ3NCwwLTEuNjE3LS44MzMtMi4zMjctMi41LTIuMzI3Wm0wLDcuMXY0Ljk3M2gzLjdjMS42ODksMCwyLjY5NC0uNTM5LDIuNjk0LTIuNTQ4LDAtMS45MTEtMS40MjEtMi40MjUtMi43NDQtMi40MjVaIi8+DQogICAgICA8cGF0aCBpZD0iUGF0aF8yOTUyIiBkYXRhLW5hbWU9IlBhdGggMjk1MiIgY2xhc3M9ImNscy0yIiBkPSJNMzU4LjQxNCw5NC4xNEgzNjl2Mi4zNzdoLTcuODY0djQuNzUxaDYuMzk0VjEwMy42aC02LjM5NHY0LjkyNEgzNjl2Mi40SDM1OC40MTRaIi8+DQogICAgICA8cGF0aCBpZD0iUGF0aF8yOTUzIiBkYXRhLW5hbWU9IlBhdGggMjk1MyIgY2xhc3M9ImNscy0yIiBkPSJNMzc4Ljc0Nyw5NC4xNGg1LjQxNGw0LjE2NCwxNi43OGgtMi43NDRMMzg0LjM0MiwxMDZoLTUuNzc3bC0xLjIzOSw0LjkyM2gtMi43MTlabS4zNjEsOS40NTZoNC43MDhsLTEuNzM3LTcuMTc4aC0xLjIyNVoiLz4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzI5NTQiIGRhdGEtbmFtZT0iUGF0aCAyOTU0IiBjbGFzcz0iY2xzLTIiIGQ9Ik0zOTcuMSwxMDUuOTQ3djQuOTczaC0yLjcxOVY5NC4xNGg2LjM3YzMuNywwLDUuNjgzLDIuMTIsNS42ODMsNS44NDMsMCwyLjM3Ni0uOTU2LDQuNTE5LTIuNzQ0LDUuMzUybDIuNzY5LDUuNTg1SDQwMy40N2wtMi40MjYtNC45NzNabTMuNjUxLTkuNDU1SDM5Ny4xdjcuMWgzLjdjMi4wNTcsMCwyLjg0MS0xLjg1LDIuODQxLTMuNTg5LDAtMS45LS45MzQtMy41MTEtMi44OTQtMy41MTFaIi8+DQogICAgICA8cGF0aCBpZD0iUGF0aF8yOTU1IiBkYXRhLW5hbWU9IlBhdGggMjk1NSIgY2xhc3M9ImNscy0yIiBkPSJNMjkwLjAxMyw5NC4xNGg1LjQxM2w0LjE2NCwxNi43OGgtMi43NDNMMjk1LjYwOCwxMDZoLTUuNzc3bC0xLjIzOSw0LjkyM2gtMi43MTlabS4zNjEsOS40NTZoNC43MDdsLTEuNzM3LTcuMTc4aC0xLjIyNVoiLz4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzI5NTYiIGRhdGEtbmFtZT0iUGF0aCAyOTU2IiBjbGFzcz0iY2xzLTIiIGQ9Ik0zMDguMzYyLDEwNS45NDd2NC45NzNoLTIuNzE5Vjk0LjE0aDYuMzY5YzMuNywwLDUuNjgzLDIuMTIsNS42ODMsNS44NDMsMCwyLjM3Ni0uOTU1LDQuNTE5LTIuNzQzLDUuMzUybDIuNzY4LDUuNTg1aC0yLjk4OWwtMi40MjUtNC45NzNabTMuNjUtOS40NTVoLTMuNjV2Ny4xaDMuN2MyLjA1OCwwLDIuODQxLTEuODUsMi44NDEtMy41ODlDMzE0LjksOTguMSwzMTMuOTcyLDk2LjQ5MiwzMTIuMDEyLDk2LjQ5MloiLz4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzI5NTciIGRhdGEtbmFtZT0iUGF0aCAyOTU3IiBjbGFzcz0iY2xzLTIiIGQ9Ik0xMzAuNjA2LDEwNy42NDNhMy4wMiwzLjAyLDAsMCwxLTEuMTgsMi41MzcsNS4xMTMsNS4xMTMsMCwwLDEtMy4yLjkxLDguMDMsOC4wMywwLDAsMS0zLjM3MS0uNTY0di0xLjM4M2E4Ljc5Myw4Ljc5MywwLDAsMCwxLjY1Mi41MDYsOC42NzIsOC42NzIsMCwwLDAsMS43Ny4xODYsMy41NjUsMy41NjUsMCwwLDAsMi4xNTctLjU0NCwxLjc4MywxLjc4MywwLDAsMCwuNzI1LTEuNTEyLDEuOTQ3LDEuOTQ3LDAsMCwwLS4yNTctMS4wNSwyLjM5MywyLjM5MywwLDAsMC0uODYtLjc1NCwxMi4xNzEsMTIuMTcxLDAsMCwwLTEuODMzLS43ODQsNS44NDIsNS44NDIsMCwwLDEtMi40NTYtMS40NTgsMy4yMTMsMy4yMTMsMCwwLDEtLjczOC0yLjIsMi43MzYsMi43MzYsMCwwLDEsMS4wNzEtMi4yNjcsNC40NDQsNC40NDQsMCwwLDEsMi44MzEtLjg0Myw4LjM0MSw4LjM0MSwwLDAsMSwzLjM4LjY3NWwtLjQ0NywxLjI0N2E3LjYzOSw3LjYzOSwwLDAsMC0yLjk2Ni0uNjQxLDIuODc4LDIuODc4LDAsMCwwLTEuNzc5LjQ4OSwxLjYxMiwxLjYxMiwwLDAsMC0uNjQsMS4zNTcsMi4wODEsMi4wODEsMCwwLDAsLjIzNiwxLjA0OSwyLjIzMSwyLjIzMSwwLDAsMCwuOC43NSw5Ljg3OCw5Ljg3OCwwLDAsMCwxLjcxNS43NTQsNi44LDYuOCwwLDAsMSwyLjY2NywxLjQ4MywyLjkxOSwyLjkxOSwwLDAsMSwuNzIzLDIuMDU3WiIvPg0KICAgICAgPHBhdGggaWQ9IlBhdGhfMjk1OCIgZGF0YS1uYW1lPSJQYXRoIDI5NTgiIGNsYXNzPSJjbHMtMiIgZD0iTTEzNC40NDcsMTAxLjY4NnY1Ljk5MWEyLjQxMSwyLjQxMSwwLDAsMCwuNTE1LDEuNjg2LDIuMDksMi4wOSwwLDAsMCwxLjYwOS41NTYsMi42MjksMi42MjksMCwwLDAsMi4xMi0uNzkyLDQsNCwwLDAsMCwuNjctMi41ODd2LTQuODU0aDEuNHY5LjIzNkgxMzkuNmwtLjItMS4yMzloLS4wNzVhMi43OTMsMi43OTMsMCwwLDEtMS4xOTMsMS4wNDUsNCw0LDAsMCwxLTEuNzQuMzYyLDMuNTI5LDMuNTI5LDAsMCwxLTIuNTI0LS44LDMuNDA5LDMuNDA5LDAsMCwxLS44MzktMi41NjJ2LTYuMDQyWiIvPg0KICAgICAgPHBhdGggaWQ9IlBhdGhfMjk1OSIgZGF0YS1uYW1lPSJQYXRoIDI5NTkiIGNsYXNzPSJjbHMtMiIgZD0iTTE0OC4yMDYsMTExLjA5YTMuOTkzLDMuOTkzLDAsMCwxLTEuNjQ3LS4zMzMsMy4xLDMuMSwwLDAsMS0xLjI1Mi0xLjAyM2gtLjFhMTIuMjY1LDEyLjI2NSwwLDAsMSwuMSwxLjUzM3YzLjhoLTEuNFYxMDEuNjg2aDEuMTM3bC4xOTQsMS4yNjRoLjA2N2EzLjI1NywzLjI1NywwLDAsMSwxLjI1Ni0xLjEsMy44MzEsMy44MzEsMCwwLDEsMS42NDMtLjMzNywzLjQxMywzLjQxMywwLDAsMSwyLjgzNiwxLjI1Niw2LjY4Myw2LjY4MywwLDAsMS0uMDE3LDcuMDU3LDMuNDIsMy40MiwwLDAsMS0yLjgxNywxLjI2NFptLS4yLTguMzg1YTIuNDgyLDIuNDgyLDAsMCwwLTIuMDQ4Ljc4NCw0LjA0MSw0LjA0MSwwLDAsMC0uNjQ5LDIuNDk0di4zMTJhNC42MjUsNC42MjUsMCwwLDAsLjY0OSwyLjc4NSwyLjQ2NywyLjQ2NywwLDAsMCwyLjA4Mi44MzksMi4xNjQsMi4xNjQsMCwwLDAsMS44NzUtLjk2OSw0LjYsNC42LDAsMCwwLC42NzgtMi42NzEsNC40MjgsNC40MjgsMCwwLDAtLjY3OC0yLjY1MSwyLjIzMiwyLjIzMiwwLDAsMC0xLjkxNS0uOTIzWiIvPg0KICAgICAgPHBhdGggaWQ9IlBhdGhfMjk2MCIgZGF0YS1uYW1lPSJQYXRoIDI5NjAiIGNsYXNzPSJjbHMtMiIgZD0iTTE1OS4wMzksMTExLjA5YTMuOTkzLDMuOTkzLDAsMCwxLTEuNjQ3LS4zMzMsMy4xLDMuMSwwLDAsMS0xLjI1Mi0xLjAyM2gtLjFhMTIuMjY1LDEyLjI2NSwwLDAsMSwuMSwxLjUzM3YzLjhoLTEuNFYxMDEuNjg2aDEuMTM3bC4xOTQsMS4yNjRoLjA2N2EzLjI1NywzLjI1NywwLDAsMSwxLjI1Ni0xLjEsMy44MzEsMy44MzEsMCwwLDEsMS42NDMtLjMzNywzLjQxMywzLjQxMywwLDAsMSwyLjgzNiwxLjI1Niw2LjY4Myw2LjY4MywwLDAsMS0uMDE3LDcuMDU3LDMuNDIsMy40MiwwLDAsMS0yLjgxNywxLjI2NFptLS4yLTguMzg1YTIuNDgyLDIuNDgyLDAsMCwwLTIuMDQ4Ljc4NCw0LjA0MSw0LjA0MSwwLDAsMC0uNjQ5LDIuNDk0di4zMTJhNC42MjUsNC42MjUsMCwwLDAsLjY0OSwyLjc4NSwyLjQ2NywyLjQ2NywwLDAsMCwyLjA4Mi44MzksMi4xNjQsMi4xNjQsMCwwLDAsMS44NzUtLjk2OSw0LjYsNC42LDAsMCwwLC42NzgtMi42NzEsNC40MjgsNC40MjgsMCwwLDAtLjY3OC0yLjY1MSwyLjIzMiwyLjIzMiwwLDAsMC0xLjkxMS0uOTIzWiIvPg0KICAgICAgPHBhdGggaWQ9IlBhdGhfMjk2MSIgZGF0YS1uYW1lPSJQYXRoIDI5NjEiIGNsYXNzPSJjbHMtMiIgZD0iTTE3My42MTIsMTA2LjNhNS4wOTMsNS4wOTMsMCwwLDEtMS4xMzcsMy41MjcsNC4wMDUsNC4wMDUsMCwwLDEtMy4xNDMsMS4yNjgsNC4xNzIsNC4xNzIsMCwwLDEtMi4yLS41ODEsMy44NCwzLjg0LDAsMCwxLTEuNDgzLTEuNjY5LDUuOCw1LjgsMCwwLDEtLjUyMi0yLjU0NSw1LjA4Nyw1LjA4NywwLDAsMSwxLjEyOS0zLjUxOCwzLjk5MSwzLjk5MSwwLDAsMSwzLjEzNS0xLjI2LDMuOTA3LDMuOTA3LDAsMCwxLDMuMDgsMS4yOSw1LjA3MSw1LjA3MSwwLDAsMSwxLjE0MSwzLjQ4OFptLTcuMDM2LDBhNC4zODQsNC4zODQsMCwwLDAsLjcwOCwyLjcsMi44MDksMi44MDksMCwwLDAsNC4xNjcsMCw0LjM2NSw0LjM2NSwwLDAsMCwuNzEyLTIuNyw0LjI5Myw0LjI5MywwLDAsMC0uNzEyLTIuNjc1LDIuNSwyLjUsMCwwLDAtMi4xLS45MTUsMi40NjEsMi40NjEsMCwwLDAtMi4wNzIuOSw0LjMzNCw0LjMzNCwwLDAsMC0uNywyLjY5WiIvPg0KICAgICAgPHBhdGggaWQ9IlBhdGhfMjk2MiIgZGF0YS1uYW1lPSJQYXRoIDI5NjIiIGNsYXNzPSJjbHMtMiIgZD0iTTE4MC41MjUsMTAxLjUxN2E1LjUwNiw1LjUwNiwwLDAsMSwxLjEuMWwtLjE5NCwxLjNhNC43ODYsNC43ODYsMCwwLDAtMS4wMTEtLjEyNywyLjQ2LDIuNDYsMCwwLDAtMS45MTcuOTExLDMuMzE4LDMuMzE4LDAsMCwwLS44LDIuMjY3djQuOTU1aC0xLjR2LTkuMjM2aDEuMTU0bC4xNiwxLjcxaC4wNjhhNC4wNTQsNC4wNTQsMCwwLDEsMS4yMzgtMS4zOSwyLjc4NywyLjc4NywwLDAsMSwxLjYtLjQ5WiIvPg0KICAgICAgPHBhdGggaWQ9IlBhdGhfMjk2MyIgZGF0YS1uYW1lPSJQYXRoIDI5NjMiIGNsYXNzPSJjbHMtMiIgZD0iTTE4Ny4zNjMsMTA5LjkzNmE0LjUwNiw0LjUwNiwwLDAsMCwuNzE2LS4wNTUsNC4zODcsNC4zODcsMCwwLDAsLjU0OC0uMTE0djEuMDdhMi41LDIuNSwwLDAsMS0uNjcuMTgxLDUsNSwwLDAsMS0uOC4wNzJxLTIuNjgsMC0yLjY4LTIuODIzdi01LjQ5NGgtMS4zMjNWMTAyLjFsMS4zMjMtLjU4Mi41OS0xLjk3MmguODA5djIuMTQxaDIuNjh2MS4wODdoLTIuNjh2NS40MzVhMS44NjksMS44NjksMCwwLDAsLjQsMS4yODFBMS4zNzcsMS4zNzcsMCwwLDAsMTg3LjM2MywxMDkuOTM2WiIvPg0KICAgICAgPHBhdGggaWQ9IlBhdGhfMjk2NCIgZGF0YS1uYW1lPSJQYXRoIDI5NjQiIGNsYXNzPSJjbHMtMiIgZD0iTTE5NC41MzgsMTExLjA5YTQuMjM5LDQuMjM5LDAsMCwxLTMuMjMxLTEuMjQ3LDQuODI0LDQuODI0LDAsMCwxLTEuMTg0LTMuNDYzLDUuMzU1LDUuMzU1LDAsMCwxLDEuMS0zLjU0OCwzLjY1MiwzLjY1MiwwLDAsMSwyLjk1NC0xLjMxNSwzLjQ4NCwzLjQ4NCwwLDAsMSwyLjc0NywxLjE0Miw0LjM3OCw0LjM3OCwwLDAsMSwxLjAxMSwzLjAxM3YuODg1aC02LjM2MmEzLjY2LDMuNjYsMCwwLDAsLjgyMiwyLjQ2OSwyLjg0MywyLjg0MywwLDAsMCwyLjIuODQzLDcuNDMxLDcuNDMxLDAsMCwwLDIuOTQ5LS42MjR2MS4yNDdhNy4zNzcsNy4zNzcsMCwwLDEtMS40LjQ1OSw3Ljg2Myw3Ljg2MywwLDAsMS0xLjYuMTM5Wm0tLjM3OS04LjRhMi4yODYsMi4yODYsMCwwLDAtMS43NzQuNzI1LDMuMzM3LDMuMzM3LDAsMCwwLS43NzksMi4wMDZoNC44MjhhMy4wNzIsMy4wNzIsMCwwLDAtLjU5LTIuMDI3LDIuMDc2LDIuMDc2LDAsMCwwLTEuNjg1LS43MDZaIi8+DQogICAgICA8cGF0aCBpZD0iUGF0aF8yOTY1IiBkYXRhLW5hbWU9IlBhdGggMjk2NSIgY2xhc3M9ImNscy0yIiBkPSJNMjA2Ljk1MSwxMDkuNjgzaC0uMDc2YTMuMjg3LDMuMjg3LDAsMCwxLTIuOSwxLjQwNywzLjQyNywzLjQyNywwLDAsMS0yLjgxOS0xLjIzOSw1LjQ1Miw1LjQ1MiwwLDAsMS0xLjAwNi0zLjUyMiw1LjU0Miw1LjU0MiwwLDAsMSwxLjAxMS0zLjU0OCwzLjQsMy40LDAsMCwxLDIuODE0LTEuMjY0LDMuMzYxLDMuMzYxLDAsMCwxLDIuODgzLDEuMzY1aC4xMDlsLS4wNTktLjY2NS0uMDM0LS42NDlWOTcuODA5aDEuNHYxMy4xMTNoLTEuMTM4Wm0tMi44LjIzNmEyLjU1MSwyLjU1MSwwLDAsMCwyLjA3OC0uNzc5LDMuOTQ3LDMuOTQ3LDAsMCwwLC42NDQtMi41MTZ2LS4zYTQuNjM4LDQuNjM4LDAsMCwwLS42NTMtMi44LDIuNDgxLDIuNDgxLDAsMCwwLTIuMDg2LS44MzksMi4xNCwyLjE0LDAsMCwwLTEuODgzLjk1Nyw0Ljc2LDQuNzYsMCwwLDAtLjY1MywyLjcsNC41NTQsNC41NTQsMCwwLDAsLjY0OSwyLjY3MSwyLjE5NCwyLjE5NCwwLDAsMCwxLjkwNi45MDZaIi8+DQogICAgICA8cGF0aCBpZD0iUGF0aF8yOTY2IiBkYXRhLW5hbWU9IlBhdGggMjk2NiIgY2xhc3M9ImNscy0yIiBkPSJNMjIwLjcxMiwxMDEuNTM0YTMuNDM1LDMuNDM1LDAsMCwxLDIuODI3LDEuMjQzLDYuNjUzLDYuNjUzLDAsMCwxLS4wMDksNy4wNTMsMy40MTcsMy40MTcsMCwwLDEtMi44MTgsMS4yNiw0LDQsMCwwLDEtMS42NDgtLjMzMywzLjA5NCwzLjA5NCwwLDAsMS0xLjI1MS0xLjAyM2gtLjFsLS4yOTUsMS4xODhoLTFWOTcuODA5aDEuNFYxMDFxMCwxLjA2OS0uMDY4LDEuOTIxaC4wNjhhMy4zMjIsMy4zMjIsMCwwLDEsMi44OTQtMS4zODdabS0uMiwxLjE3MWEyLjQ0LDIuNDQsMCwwLDAtMi4wNjQuODIyLDYuMzM4LDYuMzM4LDAsMCwwLC4wMTcsNS41NTMsMi40NjQsMi40NjQsMCwwLDAsMi4wODEuODM5LDIuMTU4LDIuMTU4LDAsMCwwLDEuOTIyLS45NCw0LjgyOCw0LjgyOCwwLDAsMCwuNjMyLTIuNyw0LjY0NSw0LjY0NSwwLDAsMC0uNjMyLTIuNjg5LDIuMjQyLDIuMjQyLDAsMCwwLTEuOTU5LS44ODVaIi8+DQogICAgICA8cGF0aCBpZD0iUGF0aF8yOTY3IiBkYXRhLW5hbWU9IlBhdGggMjk2NyIgY2xhc3M9ImNscy0yIiBkPSJNMjI1Ljc1OCwxMDEuNjg2aDEuNWwyLjAyMyw1LjI2N2EyMC4xODgsMjAuMTg4LDAsMCwxLC44MjYsMi42aC4wNjdxLjEwOS0uNDMxLjQ1OS0xLjQ3MXQyLjI4OC02LjRoMS41TDIzMC40NTIsMTEyLjJhNS4yNTMsNS4yNTMsMCwwLDEtMS4zNzgsMi4yMTIsMi45MzIsMi45MzIsMCwwLDEtMS45MzQuNjUzLDUuNjU5LDUuNjU5LDAsMCwxLTEuMjY0LS4xNDNWMTEzLjhhNC45LDQuOSwwLDAsMCwxLjAzNy4xLDIuMTM2LDIuMTM2LDAsMCwwLDIuMDU2LTEuNjE4bC41MTQtMS4zMTRaIi8+DQogICAgPC9nPg0KICA8L2c+DQo8L3N2Zz4NCg==\"},function(t,e,n){var r=n(349),i=n(350),o=n(125),u=n(351);t.exports=function(t,e){return r(t)||i(t,e)||o(t,e)||u()},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){t.exports=n(363)},function(t,e,n){t.exports=n(377)},function(t,e,n){t.exports=n(408)},function(t,e,n){t.exports=n(412)},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0}),e.sanitizeUrl=void 0;var r=/^([^\\w]*)(javascript|data|vbscript)/im,i=/[\\u0000-\\u001F\\u007F-\\u009F\\u2000-\\u200D\\uFEFF]/gim,o=/^([^:]+):/gm,u=[\".\",\"/\"];e.sanitizeUrl=function(t){if(!t)return\"about:blank\";var e=t.replace(i,\"\").trim();if(function(t){return u.indexOf(t[0])>-1}(e))return e;var n=e.match(o);if(!n)return e;var s=n[0];return r.test(s)?\"about:blank\":e}},function(t,e,n){var r=n(418),i=n(429)((function(t,e,n){return e=e.toLowerCase(),t+(n?r(e):e)}));t.exports=i},function(t,e,n){var r=n(459)(n(508));t.exports=r},function(t,e,n){(function(e){var r=n(522),i=n(523).Stream;function o(t,e,n){n=n||0;var i,u,s=(i=e,new Array(n||0).join(i||\"\")),a=t;if(\"object\"==typeof t&&((a=t[u=Object.keys(t)[0]])&&a._elem))return a._elem.name=u,a._elem.icount=n,a._elem.indent=e,a._elem.indents=s,a._elem.interrupt=a,a._elem;var c,f=[],l=[];function p(t){Object.keys(t).forEach((function(e){f.push(function(t,e){return t+'=\"'+r(e)+'\"'}(e,t[e]))}))}switch(typeof a){case\"object\":if(null===a)break;a._attr&&p(a._attr),a._cdata&&l.push((\"<![CDATA[\"+a._cdata).replace(/\\]\\]>/g,\"]]]]><![CDATA[>\")+\"]]>\"),a.forEach&&(c=!1,l.push(\"\"),a.forEach((function(t){\"object\"==typeof t?\"_attr\"==Object.keys(t)[0]?p(t._attr):l.push(o(t,e,n+1)):(l.pop(),c=!0,l.push(r(t)))})),c||l.push(\"\"));break;default:l.push(r(a))}return{name:u,interrupt:!1,attributes:f,content:l,icount:n,indents:s,indent:e}}function u(t,e,n){if(\"object\"!=typeof e)return t(!1,e);var r=e.interrupt?1:e.content.length;function i(){for(;e.content.length;){var i=e.content.shift();if(void 0!==i){if(o(i))return;u(t,i)}}t(!1,(r>1?e.indents:\"\")+(e.name?\"</\"+e.name+\">\":\"\")+(e.indent&&!n?\"\\n\":\"\")),n&&n()}function o(e){return!!e.interrupt&&(e.interrupt.append=t,e.interrupt.end=i,e.interrupt=!1,t(!0),!0)}if(t(!1,e.indents+(e.name?\"<\"+e.name:\"\")+(e.attributes.length?\" \"+e.attributes.join(\" \"):\"\")+(r?e.name?\">\":\"\":e.name?\"/>\":\"\")+(e.indent&&r>1?\"\\n\":\"\")),!r)return t(!1,e.indent?\"\\n\":\"\");o(e)||i()}t.exports=function(t,n){\"object\"!=typeof n&&(n={indent:n});var r,s,a=n.stream?new i:null,c=\"\",f=!1,l=n.indent?!0===n.indent?\"    \":n.indent:\"\",p=!0;function h(t){p?e.nextTick(t):t()}function d(t,e){if(void 0!==e&&(c+=e),t&&!f&&(a=a||new i,f=!0),t&&f){var n=c;h((function(){a.emit(\"data\",n)})),c=\"\"}}function y(t,e){u(d,o(t,l,l?1:0),e)}function v(){if(a){var t=c;h((function(){a.emit(\"data\",t),a.emit(\"end\"),a.readable=!1,a.emit(\"close\")}))}}return h((function(){p=!1})),n.declaration&&(r=n.declaration,s={version:\"1.0\",encoding:r.encoding||\"UTF-8\"},r.standalone&&(s.standalone=r.standalone),y({\"?xml\":{_attr:s}}),c=c.replace(\"/>\",\"?>\")),t&&t.forEach?t.forEach((function(e,n){var r;n+1===t.length&&(r=v),y(e,r)})):y(t,v),a?(a.readable=!0,a):c},t.exports.element=t.exports.Element=function(){var t=Array.prototype.slice.call(arguments),e={_elem:o(t),push:function(t){if(!this.append)throw new Error(\"not assigned to a parent!\");var e=this,n=this._elem.indent;u(this.append,o(t,n,this._elem.icount+(n?1:0)),(function(){e.append(!0)}))},close:function(t){void 0!==t&&this.push(t),this.end&&this.end()}};return e}}).call(this,n(34))},function(t,e,n){(function(e){var n;n=void 0!==e?e:this,t.exports=function(t){if(t.CSS&&t.CSS.escape)return t.CSS.escape;var e=function(t){if(0==arguments.length)throw new TypeError(\"`CSS.escape` requires an argument.\");for(var e,n=String(t),r=n.length,i=-1,o=\"\",u=n.charCodeAt(0);++i<r;)0!=(e=n.charCodeAt(i))?o+=e>=1&&e<=31||127==e||0==i&&e>=48&&e<=57||1==i&&e>=48&&e<=57&&45==u?\"\\\\\"+e.toString(16)+\" \":0==i&&1==r&&45==e||!(e>=128||45==e||95==e||e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122)?\"\\\\\"+n.charAt(i):n.charAt(i):o+=\"�\";return o};return t.CSS||(t.CSS={}),t.CSS.escape=e,e}(n)}).call(this,n(20))},function(t,e,n){\"use strict\";n.d(e,\"a\",(function(){return f}));var r=n(27),i=n.n(r),o=n(40),u=n.n(o),s=n(0),a=n.n(s),c=a.a.Set.of(\"type\",\"format\",\"items\",\"default\",\"maximum\",\"exclusiveMaximum\",\"minimum\",\"exclusiveMinimum\",\"maxLength\",\"minLength\",\"pattern\",\"maxItems\",\"minItems\",\"uniqueItems\",\"enum\",\"multipleOf\");function f(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.isOAS3;if(!a.a.Map.isMap(t))return{schema:a.a.Map(),parameterContentMediaType:null};if(!n)return\"body\"===t.get(\"in\")?{schema:t.get(\"schema\",a.a.Map()),parameterContentMediaType:null}:{schema:i()(t).call(t,(function(t,e){return u()(c).call(c,e)})),parameterContentMediaType:null};if(t.get(\"content\")){var r=t.get(\"content\",a.a.Map({})).keySeq(),o=r.first();return{schema:t.getIn([\"content\",o,\"schema\"],a.a.Map()),parameterContentMediaType:o}}return{schema:t.get(\"schema\",a.a.Map()),parameterContentMediaType:null}}},function(t,e,n){\"use strict\";(function(e,r){var i=65536,o=4294967295;var u=n(17).Buffer,s=e.crypto||e.msCrypto;s&&s.getRandomValues?t.exports=function(t,e){if(t>o)throw new RangeError(\"requested too many random bytes\");var n=u.allocUnsafe(t);if(t>0)if(t>i)for(var a=0;a<t;a+=i)s.getRandomValues(n.slice(a,a+i));else s.getRandomValues(n);if(\"function\"==typeof e)return r.nextTick((function(){e(null,n)}));return n}:t.exports=function(){throw new Error(\"Secure random number generation is not supported by this browser.\\nUse Chrome, Firefox or Internet Explorer 11\")}}).call(this,n(20),n(34))},function(t,e,n){(e=t.exports=function(t){t=t.toLowerCase();var n=e[t];if(!n)throw new Error(t+\" is not supported (we accept pull requests)\");return new n}).sha=n(596),e.sha1=n(597),e.sha224=n(598),e.sha256=n(217),e.sha384=n(599),e.sha512=n(218)},function(t,e,n){t.exports=n(600)},function(t,e,n){var r=n(235);t.exports=r},function(t,e,n){n(236);var r=n(10).Object,i=t.exports=function(t,e,n){return r.defineProperty(t,e,n)};r.defineProperty.sham&&(i.sham=!0)},function(t,e,n){var r=n(1),i=n(23);r({target:\"Object\",stat:!0,forced:!i,sham:!i},{defineProperty:n(33).f})},function(t,e,n){var r=n(6),i=/#|\\.prototype\\./,o=function(t,e){var n=s[u(t)];return n==c||n!=a&&(\"function\"==typeof e?r(e):!!e)},u=o.normalize=function(t){return String(t).replace(i,\".\").toLowerCase()},s=o.data={},a=o.NATIVE=\"N\",c=o.POLYFILL=\"P\";t.exports=o},function(t,e,n){t.exports=n(239)},function(t,e,n){var r=n(240);t.exports=r},function(t,e,n){n(241);var r=n(10).Object;t.exports=function(t,e){return r.create(t,e)}},function(t,e,n){n(1)({target:\"Object\",stat:!0,sham:!n(23)},{create:n(76)})},function(t,e,n){var r=n(23),i=n(33),o=n(29),u=n(77);t.exports=r?Object.defineProperties:function(t,e){o(t);for(var n,r=u(e),s=r.length,a=0;s>a;)i.f(t,n=r[a++],e[n]);return t}},function(t,e,n){var r=n(57);t.exports=r(\"document\",\"documentElement\")},function(t,e,n){var r=n(13),i=n(24);t.exports=function(t,e){try{i(r,t,e)}catch(n){r[t]=e}return e}},function(t,e,n){var r=n(154);function i(e,n){return t.exports=i=r||function(t,e){return t.__proto__=e,t},t.exports.default=t.exports,t.exports.__esModule=!0,i(e,n)}t.exports=i,t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(247);t.exports=r},function(t,e,n){n(248);var r=n(10);t.exports=r.Object.setPrototypeOf},function(t,e,n){n(1)({target:\"Object\",stat:!0},{setPrototypeOf:n(155)})},function(t,e,n){var r=n(15);t.exports=function(t){if(!r(t)&&null!==t)throw TypeError(\"Can't set \"+String(t)+\" as a prototype\");return t}},function(t,e,n){var r=n(251);t.exports=r},function(t,e,n){n(252);var r=n(10);t.exports=r.Reflect.construct},function(t,e,n){var r=n(1),i=n(57),o=n(56),u=n(29),s=n(15),a=n(76),c=n(157),f=n(6),l=i(\"Reflect\",\"construct\"),p=f((function(){function t(){}return!(l((function(){}),[],t)instanceof t)})),h=!f((function(){l((function(){}))})),d=p||h;r({target:\"Reflect\",stat:!0,forced:d,sham:d},{construct:function(t,e){o(t),u(e);var n=arguments.length<3?t:o(arguments[2]);if(h&&!p)return l(t,e,n);if(t==n){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var r=[null];return r.push.apply(r,e),new(c.apply(t,r))}var i=n.prototype,f=a(s(i)?i:Object.prototype),d=Function.apply.call(t,f,e);return s(d)?d:f}})},function(t,e,n){var r=n(154),i=n(254);function o(e){return t.exports=o=r?i:function(t){return t.__proto__||i(t)},t.exports.default=t.exports,t.exports.__esModule=!0,o(e)}t.exports=o,t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){t.exports=n(255)},function(t,e,n){var r=n(256);t.exports=r},function(t,e,n){n(257);var r=n(10);t.exports=r.Object.getPrototypeOf},function(t,e,n){var r=n(1),i=n(6),o=n(19),u=n(113),s=n(158);r({target:\"Object\",stat:!0,forced:i((function(){u(1)})),sham:!s},{getPrototypeOf:function(t){return u(o(t))}})},function(t,e,n){var r=n(156);t.exports=function(){if(\"undefined\"==typeof Reflect||!r)return!1;if(r.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(r(Boolean,[],(function(){}))),!0}catch(t){return!1}},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(18).default,i=n(26);t.exports=function(t,e){return!e||\"object\"!==r(e)&&\"function\"!=typeof e?i(t):e},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(261);n(284),n(285),n(286),n(287),n(288),n(289),n(290),t.exports=r},function(t,e,n){n(159),n(262),n(263),n(268),n(269),n(270),n(271),n(165),n(272),n(273),n(274),n(275),n(276),n(277),n(278),n(279),n(280),n(281),n(282),n(283);var r=n(10);t.exports=r.Symbol},function(t,e){},function(t,e,n){\"use strict\";var r=n(1),i=n(13),o=n(57),u=n(58),s=n(23),a=n(115),c=n(161),f=n(6),l=n(21),p=n(59),h=n(15),d=n(29),y=n(19),v=n(32),g=n(75),w=n(54),M=n(76),m=n(77),_=n(162),L=n(264),b=n(163),x=n(104),j=n(33),N=n(105),S=n(24),D=n(164),I=n(110),A=n(79),O=n(78),T=n(112),C=n(7),E=n(116),z=n(4),k=n(83),Y=n(118),U=n(43).forEach,P=A(\"hidden\"),R=\"Symbol\",Q=C(\"toPrimitive\"),F=Y.set,B=Y.getterFor(R),G=Object.prototype,W=i.Symbol,q=o(\"JSON\",\"stringify\"),J=x.f,Z=j.f,V=L.f,X=N.f,H=I(\"symbols\"),K=I(\"op-symbols\"),$=I(\"string-to-symbol-registry\"),tt=I(\"symbol-to-string-registry\"),et=I(\"wks\"),nt=i.QObject,rt=!nt||!nt.prototype||!nt.prototype.findChild,it=s&&f((function(){return 7!=M(Z({},\"a\",{get:function(){return Z(this,\"a\",{value:7}).a}})).a}))?function(t,e,n){var r=J(G,e);r&&delete G[e],Z(t,e,n),r&&t!==G&&Z(G,e,r)}:Z,ot=function(t,e){var n=H[t]=M(W.prototype);return F(n,{type:R,tag:t,description:e}),s||(n.description=e),n},ut=c?function(t){return\"symbol\"==typeof t}:function(t){return Object(t)instanceof W},st=function(t,e,n){t===G&&st(K,e,n),d(t);var r=g(e,!0);return d(n),l(H,r)?(n.enumerable?(l(t,P)&&t[P][r]&&(t[P][r]=!1),n=M(n,{enumerable:w(0,!1)})):(l(t,P)||Z(t,P,w(1,{})),t[P][r]=!0),it(t,r,n)):Z(t,r,n)},at=function(t,e){d(t);var n=v(e),r=m(n).concat(pt(n));return U(r,(function(e){s&&!ct.call(n,e)||st(t,e,n[e])})),t},ct=function(t){var e=g(t,!0),n=X.call(this,e);return!(this===G&&l(H,e)&&!l(K,e))&&(!(n||!l(this,e)||!l(H,e)||l(this,P)&&this[P][e])||n)},ft=function(t,e){var n=v(t),r=g(e,!0);if(n!==G||!l(H,r)||l(K,r)){var i=J(n,r);return!i||!l(H,r)||l(n,P)&&n[P][r]||(i.enumerable=!0),i}},lt=function(t){var e=V(v(t)),n=[];return U(e,(function(t){l(H,t)||l(O,t)||n.push(t)})),n},pt=function(t){var e=t===G,n=V(e?K:v(t)),r=[];return U(n,(function(t){!l(H,t)||e&&!l(G,t)||r.push(H[t])})),r};(a||(D((W=function(){if(this instanceof W)throw TypeError(\"Symbol is not a constructor\");var t=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,e=T(t),n=function(t){this===G&&n.call(K,t),l(this,P)&&l(this[P],e)&&(this[P][e]=!1),it(this,e,w(1,t))};return s&&rt&&it(G,e,{configurable:!0,set:n}),ot(e,t)}).prototype,\"toString\",(function(){return B(this).tag})),D(W,\"withoutSetter\",(function(t){return ot(T(t),t)})),N.f=ct,j.f=st,x.f=ft,_.f=L.f=lt,b.f=pt,E.f=function(t){return ot(C(t),t)},s&&(Z(W.prototype,\"description\",{configurable:!0,get:function(){return B(this).description}}),u||D(G,\"propertyIsEnumerable\",ct,{unsafe:!0}))),r({global:!0,wrap:!0,forced:!a,sham:!a},{Symbol:W}),U(m(et),(function(t){z(t)})),r({target:R,stat:!0,forced:!a},{for:function(t){var e=String(t);if(l($,e))return $[e];var n=W(e);return $[e]=n,tt[n]=e,n},keyFor:function(t){if(!ut(t))throw TypeError(t+\" is not a symbol\");if(l(tt,t))return tt[t]},useSetter:function(){rt=!0},useSimple:function(){rt=!1}}),r({target:\"Object\",stat:!0,forced:!a,sham:!s},{create:function(t,e){return void 0===e?M(t):at(M(t),e)},defineProperty:st,defineProperties:at,getOwnPropertyDescriptor:ft}),r({target:\"Object\",stat:!0,forced:!a},{getOwnPropertyNames:lt,getOwnPropertySymbols:pt}),r({target:\"Object\",stat:!0,forced:f((function(){b.f(1)}))},{getOwnPropertySymbols:function(t){return b.f(y(t))}}),q)&&r({target:\"JSON\",stat:!0,forced:!a||f((function(){var t=W();return\"[null]\"!=q([t])||\"{}\"!=q({a:t})||\"{}\"!=q(Object(t))}))},{stringify:function(t,e,n){for(var r,i=[t],o=1;arguments.length>o;)i.push(arguments[o++]);if(r=e,(h(e)||void 0!==t)&&!ut(t))return p(e)||(e=function(t,e){if(\"function\"==typeof r&&(e=r.call(this,t,e)),!ut(e))return e}),i[1]=e,q.apply(null,i)}});W.prototype[Q]||S(W.prototype,Q,W.prototype.valueOf),k(W,R),O[P]=!0},function(t,e,n){var r=n(32),i=n(162).f,o={}.toString,u=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return u&&\"[object Window]\"==o.call(t)?function(t){try{return i(t)}catch(t){return u.slice()}}(t):i(r(t))}},function(t,e,n){\"use strict\";var r=n(117),i=n(61);t.exports=r?{}.toString:function(){return\"[object \"+i(this)+\"]\"}},function(t,e,n){var r=n(13),i=n(267),o=r.WeakMap;t.exports=\"function\"==typeof o&&/native code/.test(i(o))},function(t,e,n){var r=n(111),i=Function.toString;\"function\"!=typeof r.inspectSource&&(r.inspectSource=function(t){return i.call(t)}),t.exports=r.inspectSource},function(t,e,n){n(4)(\"asyncIterator\")},function(t,e){},function(t,e,n){n(4)(\"hasInstance\")},function(t,e,n){n(4)(\"isConcatSpreadable\")},function(t,e,n){n(4)(\"match\")},function(t,e,n){n(4)(\"matchAll\")},function(t,e,n){n(4)(\"replace\")},function(t,e,n){n(4)(\"search\")},function(t,e,n){n(4)(\"species\")},function(t,e,n){n(4)(\"split\")},function(t,e,n){n(4)(\"toPrimitive\")},function(t,e,n){n(4)(\"toStringTag\")},function(t,e,n){n(4)(\"unscopables\")},function(t,e,n){var r=n(13);n(83)(r.JSON,\"JSON\",!0)},function(t,e){},function(t,e){},function(t,e,n){n(4)(\"asyncDispose\")},function(t,e,n){n(4)(\"dispose\")},function(t,e,n){n(4)(\"matcher\")},function(t,e,n){n(4)(\"metadata\")},function(t,e,n){n(4)(\"observable\")},function(t,e,n){n(4)(\"patternMatch\")},function(t,e,n){n(4)(\"replaceAll\")},function(t,e,n){t.exports=n(292)},function(t,e,n){var r=n(293);t.exports=r},function(t,e,n){n(165),n(119),n(84);var r=n(116);t.exports=r.f(\"iterator\")},function(t,e,n){var r=n(108),i=n(42),o=function(t){return function(e,n){var o,u,s=String(i(e)),a=r(n),c=s.length;return a<0||a>=c?t?\"\":void 0:(o=s.charCodeAt(a))<55296||o>56319||a+1===c||(u=s.charCodeAt(a+1))<56320||u>57343?t?s.charAt(a):o:t?s.slice(a,a+2):u-56320+(o-55296<<10)+65536}};t.exports={codeAt:o(!1),charAt:o(!0)}},function(t,e,n){\"use strict\";var r=n(167).IteratorPrototype,i=n(76),o=n(54),u=n(83),s=n(44),a=function(){return this};t.exports=function(t,e,n){var c=e+\" Iterator\";return t.prototype=i(r,{next:o(1,n)}),u(t,c,!1,!0),s[c]=a,t}},function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,e,n){\"use strict\";var r=n(62),i=n(169),o=n(300),u=n(305),s=n(45),a=n(306),c=n(312),f=n(313),l=n(315),p=s.createElement,h=s.createFactory,d=s.cloneElement,y=r,v={Children:{map:o.map,forEach:o.forEach,count:o.count,toArray:o.toArray,only:l},Component:i.Component,PureComponent:i.PureComponent,createElement:p,cloneElement:d,isValidElement:s.isValidElement,PropTypes:a,createClass:f,createFactory:h,createMixin:function(t){return t},DOM:u,version:c,__spread:y};t.exports=v},function(t,e,n){\"use strict\";t.exports={}},function(t,e,n){\"use strict\";t.exports=function(){}},function(t,e,n){\"use strict\";var r=n(301),i=n(45),o=n(171),u=n(302),s=r.twoArgumentPooler,a=r.fourArgumentPooler,c=/\\/+/g;function f(t){return(\"\"+t).replace(c,\"$&/\")}function l(t,e){this.func=t,this.context=e,this.count=0}function p(t,e,n){var r=t.func,i=t.context;r.call(i,e,t.count++)}function h(t,e,n,r){this.result=t,this.keyPrefix=e,this.func=n,this.context=r,this.count=0}function d(t,e,n){var r=t.result,u=t.keyPrefix,s=t.func,a=t.context,c=s.call(a,e,t.count++);Array.isArray(c)?y(c,r,n,o.thatReturnsArgument):null!=c&&(i.isValidElement(c)&&(c=i.cloneAndReplaceKey(c,u+(!c.key||e&&e.key===c.key?\"\":f(c.key)+\"/\")+n)),r.push(c))}function y(t,e,n,r,i){var o=\"\";null!=n&&(o=f(n)+\"/\");var s=h.getPooled(e,o,r,i);u(t,d,s),h.release(s)}function v(t,e,n){return null}l.prototype.destructor=function(){this.func=null,this.context=null,this.count=0},r.addPoolingTo(l,s),h.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},r.addPoolingTo(h,a);var g={forEach:function(t,e,n){if(null==t)return t;var r=l.getPooled(e,n);u(t,p,r),l.release(r)},map:function(t,e,n){if(null==t)return t;var r=[];return y(t,r,null,e,n),r},mapIntoWithKeyPrefixInternal:y,count:function(t,e){return u(t,v,null)},toArray:function(t){var e=[];return y(t,e,null,o.thatReturnsArgument),e}};t.exports=g},function(t,e,n){\"use strict\";var r=n(85),i=(n(86),function(t){var e=this;if(e.instancePool.length){var n=e.instancePool.pop();return e.call(n,t),n}return new e(t)}),o=function(t){var e=this;t instanceof e||r(\"25\"),t.destructor(),e.instancePool.length<e.poolSize&&e.instancePool.push(t)},u=i,s={addPoolingTo:function(t,e){var n=t;return n.instancePool=[],n.getPooled=e||u,n.poolSize||(n.poolSize=10),n.release=o,n},oneArgumentPooler:i,twoArgumentPooler:function(t,e){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,t,e),r}return new n(t,e)},threeArgumentPooler:function(t,e,n){var r=this;if(r.instancePool.length){var i=r.instancePool.pop();return r.call(i,t,e,n),i}return new r(t,e,n)},fourArgumentPooler:function(t,e,n,r){var i=this;if(i.instancePool.length){var o=i.instancePool.pop();return i.call(o,t,e,n,r),o}return new i(t,e,n,r)}};t.exports=s},function(t,e,n){\"use strict\";var r=n(85),i=(n(173),n(174)),o=n(303),u=(n(86),n(304));n(121);function s(t,e){return t&&\"object\"==typeof t&&null!=t.key?u.escape(t.key):e.toString(36)}function a(t,e,n,c){var f,l=typeof t;if(\"undefined\"!==l&&\"boolean\"!==l||(t=null),null===t||\"string\"===l||\"number\"===l||\"object\"===l&&t.$$typeof===i)return n(c,t,\"\"===e?\".\"+s(t,0):e),1;var p=0,h=\"\"===e?\".\":e+\":\";if(Array.isArray(t))for(var d=0;d<t.length;d++)p+=a(f=t[d],h+s(f,d),n,c);else{var y=o(t);if(y){var v,g=y.call(t);if(y!==t.entries)for(var w=0;!(v=g.next()).done;)p+=a(f=v.value,h+s(f,w++),n,c);else for(;!(v=g.next()).done;){var M=v.value;M&&(p+=a(f=M[1],h+u.escape(M[0])+\":\"+s(f,0),n,c))}}else if(\"object\"===l){var m=String(t);r(\"31\",\"[object Object]\"===m?\"object with keys {\"+Object.keys(t).join(\", \")+\"}\":m,\"\")}}return p}t.exports=function(t,e,n){return null==t?0:a(t,\"\",e,n)}},function(t,e,n){\"use strict\";var r=\"function\"==typeof Symbol&&Symbol.iterator;t.exports=function(t){var e=t&&(r&&t[r]||t[\"@@iterator\"]);if(\"function\"==typeof e)return e}},function(t,e,n){\"use strict\";var r={escape:function(t){var e={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+t).replace(/[=:]/g,(function(t){return e[t]}))},unescape:function(t){var e={\"=0\":\"=\",\"=2\":\":\"};return(\"\"+(\".\"===t[0]&&\"$\"===t[1]?t.substring(2):t.substring(1))).replace(/(=0|=2)/g,(function(t){return e[t]}))}};t.exports=r},function(t,e,n){\"use strict\";var r=n(45).createFactory,i={a:r(\"a\"),abbr:r(\"abbr\"),address:r(\"address\"),area:r(\"area\"),article:r(\"article\"),aside:r(\"aside\"),audio:r(\"audio\"),b:r(\"b\"),base:r(\"base\"),bdi:r(\"bdi\"),bdo:r(\"bdo\"),big:r(\"big\"),blockquote:r(\"blockquote\"),body:r(\"body\"),br:r(\"br\"),button:r(\"button\"),canvas:r(\"canvas\"),caption:r(\"caption\"),cite:r(\"cite\"),code:r(\"code\"),col:r(\"col\"),colgroup:r(\"colgroup\"),data:r(\"data\"),datalist:r(\"datalist\"),dd:r(\"dd\"),del:r(\"del\"),details:r(\"details\"),dfn:r(\"dfn\"),dialog:r(\"dialog\"),div:r(\"div\"),dl:r(\"dl\"),dt:r(\"dt\"),em:r(\"em\"),embed:r(\"embed\"),fieldset:r(\"fieldset\"),figcaption:r(\"figcaption\"),figure:r(\"figure\"),footer:r(\"footer\"),form:r(\"form\"),h1:r(\"h1\"),h2:r(\"h2\"),h3:r(\"h3\"),h4:r(\"h4\"),h5:r(\"h5\"),h6:r(\"h6\"),head:r(\"head\"),header:r(\"header\"),hgroup:r(\"hgroup\"),hr:r(\"hr\"),html:r(\"html\"),i:r(\"i\"),iframe:r(\"iframe\"),img:r(\"img\"),input:r(\"input\"),ins:r(\"ins\"),kbd:r(\"kbd\"),keygen:r(\"keygen\"),label:r(\"label\"),legend:r(\"legend\"),li:r(\"li\"),link:r(\"link\"),main:r(\"main\"),map:r(\"map\"),mark:r(\"mark\"),menu:r(\"menu\"),menuitem:r(\"menuitem\"),meta:r(\"meta\"),meter:r(\"meter\"),nav:r(\"nav\"),noscript:r(\"noscript\"),object:r(\"object\"),ol:r(\"ol\"),optgroup:r(\"optgroup\"),option:r(\"option\"),output:r(\"output\"),p:r(\"p\"),param:r(\"param\"),picture:r(\"picture\"),pre:r(\"pre\"),progress:r(\"progress\"),q:r(\"q\"),rp:r(\"rp\"),rt:r(\"rt\"),ruby:r(\"ruby\"),s:r(\"s\"),samp:r(\"samp\"),script:r(\"script\"),section:r(\"section\"),select:r(\"select\"),small:r(\"small\"),source:r(\"source\"),span:r(\"span\"),strong:r(\"strong\"),style:r(\"style\"),sub:r(\"sub\"),summary:r(\"summary\"),sup:r(\"sup\"),table:r(\"table\"),tbody:r(\"tbody\"),td:r(\"td\"),textarea:r(\"textarea\"),tfoot:r(\"tfoot\"),th:r(\"th\"),thead:r(\"thead\"),time:r(\"time\"),title:r(\"title\"),tr:r(\"tr\"),track:r(\"track\"),u:r(\"u\"),ul:r(\"ul\"),var:r(\"var\"),video:r(\"video\"),wbr:r(\"wbr\"),circle:r(\"circle\"),clipPath:r(\"clipPath\"),defs:r(\"defs\"),ellipse:r(\"ellipse\"),g:r(\"g\"),image:r(\"image\"),line:r(\"line\"),linearGradient:r(\"linearGradient\"),mask:r(\"mask\"),path:r(\"path\"),pattern:r(\"pattern\"),polygon:r(\"polygon\"),polyline:r(\"polyline\"),radialGradient:r(\"radialGradient\"),rect:r(\"rect\"),stop:r(\"stop\"),svg:r(\"svg\"),text:r(\"text\"),tspan:r(\"tspan\")};t.exports=i},function(t,e,n){\"use strict\";var r=n(45).isValidElement,i=n(307);t.exports=i(r)},function(t,e,n){\"use strict\";var r=n(308);t.exports=function(t){return r(t,!1)}},function(t,e,n){\"use strict\";var r=n(309),i=n(62),o=n(175),u=n(311),s=Function.call.bind(Object.prototype.hasOwnProperty);function a(){return null}t.exports=function(t,e){var n=\"function\"==typeof Symbol&&Symbol.iterator;var c=\"<<anonymous>>\",f={array:d(\"array\"),bool:d(\"boolean\"),func:d(\"function\"),number:d(\"number\"),object:d(\"object\"),string:d(\"string\"),symbol:d(\"symbol\"),any:h(a),arrayOf:function(t){return h((function(e,n,r,i,u){if(\"function\"!=typeof t)return new p(\"Property `\"+u+\"` of component `\"+r+\"` has invalid PropType notation inside arrayOf.\");var s=e[n];if(!Array.isArray(s))return new p(\"Invalid \"+i+\" `\"+u+\"` of type `\"+v(s)+\"` supplied to `\"+r+\"`, expected an array.\");for(var a=0;a<s.length;a++){var c=t(s,a,r,i,u+\"[\"+a+\"]\",o);if(c instanceof Error)return c}return null}))},element:h((function(e,n,r,i,o){var u=e[n];return t(u)?null:new p(\"Invalid \"+i+\" `\"+o+\"` of type `\"+v(u)+\"` supplied to `\"+r+\"`, expected a single ReactElement.\")})),elementType:h((function(t,e,n,i,o){var u=t[e];return r.isValidElementType(u)?null:new p(\"Invalid \"+i+\" `\"+o+\"` of type `\"+v(u)+\"` supplied to `\"+n+\"`, expected a single ReactElement type.\")})),instanceOf:function(t){return h((function(e,n,r,i,o){if(!(e[n]instanceof t)){var u=t.name||c;return new p(\"Invalid \"+i+\" `\"+o+\"` of type `\"+(((s=e[n]).constructor&&s.constructor.name?s.constructor.name:c)+\"` supplied to `\")+r+\"`, expected instance of `\"+u+\"`.\")}var s;return null}))},node:h((function(t,e,n,r,i){return y(t[e])?null:new p(\"Invalid \"+r+\" `\"+i+\"` supplied to `\"+n+\"`, expected a ReactNode.\")})),objectOf:function(t){return h((function(e,n,r,i,u){if(\"function\"!=typeof t)return new p(\"Property `\"+u+\"` of component `\"+r+\"` has invalid PropType notation inside objectOf.\");var a=e[n],c=v(a);if(\"object\"!==c)return new p(\"Invalid \"+i+\" `\"+u+\"` of type `\"+c+\"` supplied to `\"+r+\"`, expected an object.\");for(var f in a)if(s(a,f)){var l=t(a,f,r,i,u+\".\"+f,o);if(l instanceof Error)return l}return null}))},oneOf:function(t){if(!Array.isArray(t))return a;return h((function(e,n,r,i,o){for(var u=e[n],s=0;s<t.length;s++)if(l(u,t[s]))return null;var a=JSON.stringify(t,(function(t,e){return\"symbol\"===g(e)?String(e):e}));return new p(\"Invalid \"+i+\" `\"+o+\"` of value `\"+String(u)+\"` supplied to `\"+r+\"`, expected one of \"+a+\".\")}))},oneOfType:function(t){if(!Array.isArray(t))return a;for(var e=0;e<t.length;e++){var n=t[e];if(\"function\"!=typeof n)return w(n),a}return h((function(e,n,r,i,u){for(var s=0;s<t.length;s++)if(null==(0,t[s])(e,n,r,i,u,o))return null;return new p(\"Invalid \"+i+\" `\"+u+\"` supplied to `\"+r+\"`.\")}))},shape:function(t){return h((function(e,n,r,i,u){var s=e[n],a=v(s);if(\"object\"!==a)return new p(\"Invalid \"+i+\" `\"+u+\"` of type `\"+a+\"` supplied to `\"+r+\"`, expected `object`.\");for(var c in t){var f=t[c];if(f){var l=f(s,c,r,i,u+\".\"+c,o);if(l)return l}}return null}))},exact:function(t){return h((function(e,n,r,u,s){var a=e[n],c=v(a);if(\"object\"!==c)return new p(\"Invalid \"+u+\" `\"+s+\"` of type `\"+c+\"` supplied to `\"+r+\"`, expected `object`.\");var f=i({},e[n],t);for(var l in f){var h=t[l];if(!h)return new p(\"Invalid \"+u+\" `\"+s+\"` key `\"+l+\"` supplied to `\"+r+\"`.\\nBad object: \"+JSON.stringify(e[n],null,\"  \")+\"\\nValid keys: \"+JSON.stringify(Object.keys(t),null,\"  \"));var d=h(a,l,r,u,s+\".\"+l,o);if(d)return d}return null}))}};function l(t,e){return t===e?0!==t||1/t==1/e:t!=t&&e!=e}function p(t){this.message=t,this.stack=\"\"}function h(t){function n(n,r,i,u,s,a,f){if((u=u||c,a=a||i,f!==o)&&e){var l=new Error(\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use `PropTypes.checkPropTypes()` to call them. Read more at http://fb.me/use-check-prop-types\");throw l.name=\"Invariant Violation\",l}return null==r[i]?n?null===r[i]?new p(\"The \"+s+\" `\"+a+\"` is marked as required in `\"+u+\"`, but its value is `null`.\"):new p(\"The \"+s+\" `\"+a+\"` is marked as required in `\"+u+\"`, but its value is `undefined`.\"):null:t(r,i,u,s,a)}var r=n.bind(null,!1);return r.isRequired=n.bind(null,!0),r}function d(t){return h((function(e,n,r,i,o,u){var s=e[n];return v(s)!==t?new p(\"Invalid \"+i+\" `\"+o+\"` of type `\"+g(s)+\"` supplied to `\"+r+\"`, expected `\"+t+\"`.\"):null}))}function y(e){switch(typeof e){case\"number\":case\"string\":case\"undefined\":return!0;case\"boolean\":return!e;case\"object\":if(Array.isArray(e))return e.every(y);if(null===e||t(e))return!0;var r=function(t){var e=t&&(n&&t[n]||t[\"@@iterator\"]);if(\"function\"==typeof e)return e}(e);if(!r)return!1;var i,o=r.call(e);if(r!==e.entries){for(;!(i=o.next()).done;)if(!y(i.value))return!1}else for(;!(i=o.next()).done;){var u=i.value;if(u&&!y(u[1]))return!1}return!0;default:return!1}}function v(t){var e=typeof t;return Array.isArray(t)?\"array\":t instanceof RegExp?\"object\":function(t,e){return\"symbol\"===t||!!e&&(\"Symbol\"===e[\"@@toStringTag\"]||\"function\"==typeof Symbol&&e instanceof Symbol)}(e,t)?\"symbol\":e}function g(t){if(null==t)return\"\"+t;var e=v(t);if(\"object\"===e){if(t instanceof Date)return\"date\";if(t instanceof RegExp)return\"regexp\"}return e}function w(t){var e=g(t);switch(e){case\"array\":case\"object\":return\"an \"+e;case\"boolean\":case\"date\":case\"regexp\":return\"a \"+e;default:return e}}return p.prototype=Error.prototype,f.checkPropTypes=u,f.resetWarningCache=u.resetWarningCache,f.PropTypes=f,f}},function(t,e,n){\"use strict\";t.exports=n(310)},function(t,e,n){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=\"function\"==typeof Symbol&&Symbol.for,i=r?Symbol.for(\"react.element\"):60103,o=r?Symbol.for(\"react.portal\"):60106,u=r?Symbol.for(\"react.fragment\"):60107,s=r?Symbol.for(\"react.strict_mode\"):60108,a=r?Symbol.for(\"react.profiler\"):60114,c=r?Symbol.for(\"react.provider\"):60109,f=r?Symbol.for(\"react.context\"):60110,l=r?Symbol.for(\"react.async_mode\"):60111,p=r?Symbol.for(\"react.concurrent_mode\"):60111,h=r?Symbol.for(\"react.forward_ref\"):60112,d=r?Symbol.for(\"react.suspense\"):60113,y=r?Symbol.for(\"react.memo\"):60115,v=r?Symbol.for(\"react.lazy\"):60116;function g(t){if(\"object\"==typeof t&&null!==t){var e=t.$$typeof;switch(e){case i:switch(t=t.type){case l:case p:case u:case a:case s:case d:return t;default:switch(t=t&&t.$$typeof){case f:case h:case c:return t;default:return e}}case v:case y:case o:return e}}}function w(t){return g(t)===p}e.typeOf=g,e.AsyncMode=l,e.ConcurrentMode=p,e.ContextConsumer=f,e.ContextProvider=c,e.Element=i,e.ForwardRef=h,e.Fragment=u,e.Lazy=v,e.Memo=y,e.Portal=o,e.Profiler=a,e.StrictMode=s,e.Suspense=d,e.isValidElementType=function(t){return\"string\"==typeof t||\"function\"==typeof t||t===u||t===p||t===a||t===s||t===d||\"object\"==typeof t&&null!==t&&(t.$$typeof===v||t.$$typeof===y||t.$$typeof===c||t.$$typeof===f||t.$$typeof===h)},e.isAsyncMode=function(t){return w(t)||g(t)===l},e.isConcurrentMode=w,e.isContextConsumer=function(t){return g(t)===f},e.isContextProvider=function(t){return g(t)===c},e.isElement=function(t){return\"object\"==typeof t&&null!==t&&t.$$typeof===i},e.isForwardRef=function(t){return g(t)===h},e.isFragment=function(t){return g(t)===u},e.isLazy=function(t){return g(t)===v},e.isMemo=function(t){return g(t)===y},e.isPortal=function(t){return g(t)===o},e.isProfiler=function(t){return g(t)===a},e.isStrictMode=function(t){return g(t)===s},e.isSuspense=function(t){return g(t)===d}},function(t,e,n){\"use strict\";function r(t,e,n,r,i){}r.resetWarningCache=function(){0},t.exports=r},function(t,e,n){\"use strict\";t.exports=\"15.7.0\"},function(t,e,n){\"use strict\";var r=n(169).Component,i=n(45).isValidElement,o=n(170),u=n(314);t.exports=u(r,i,o)},function(t,e,n){\"use strict\";var r=n(62),i={};function o(t,e,n,r,i,o,u,s){if(!t){var a;if(void 0===e)a=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[n,r,i,o,u,s],f=0;(a=new Error(e.replace(/%s/g,(function(){return c[f++]})))).name=\"Invariant Violation\"}throw a.framesToPop=1,a}}var u=\"mixins\";t.exports=function(t,e,n){var s=[],a={mixins:\"DEFINE_MANY\",statics:\"DEFINE_MANY\",propTypes:\"DEFINE_MANY\",contextTypes:\"DEFINE_MANY\",childContextTypes:\"DEFINE_MANY\",getDefaultProps:\"DEFINE_MANY_MERGED\",getInitialState:\"DEFINE_MANY_MERGED\",getChildContext:\"DEFINE_MANY_MERGED\",render:\"DEFINE_ONCE\",componentWillMount:\"DEFINE_MANY\",componentDidMount:\"DEFINE_MANY\",componentWillReceiveProps:\"DEFINE_MANY\",shouldComponentUpdate:\"DEFINE_ONCE\",componentWillUpdate:\"DEFINE_MANY\",componentDidUpdate:\"DEFINE_MANY\",componentWillUnmount:\"DEFINE_MANY\",UNSAFE_componentWillMount:\"DEFINE_MANY\",UNSAFE_componentWillReceiveProps:\"DEFINE_MANY\",UNSAFE_componentWillUpdate:\"DEFINE_MANY\",updateComponent:\"OVERRIDE_BASE\"},c={getDerivedStateFromProps:\"DEFINE_MANY_MERGED\"},f={displayName:function(t,e){t.displayName=e},mixins:function(t,e){if(e)for(var n=0;n<e.length;n++)p(t,e[n])},childContextTypes:function(t,e){t.childContextTypes=r({},t.childContextTypes,e)},contextTypes:function(t,e){t.contextTypes=r({},t.contextTypes,e)},getDefaultProps:function(t,e){t.getDefaultProps?t.getDefaultProps=d(t.getDefaultProps,e):t.getDefaultProps=e},propTypes:function(t,e){t.propTypes=r({},t.propTypes,e)},statics:function(t,e){!function(t,e){if(!e)return;for(var n in e){var r=e[n];if(e.hasOwnProperty(n)){if(o(!(n in f),'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it as an instance property instead; it will still be accessible on the constructor.',n),n in t)return o(\"DEFINE_MANY_MERGED\"===(c.hasOwnProperty(n)?c[n]:null),\"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",n),void(t[n]=d(t[n],r));t[n]=r}}}(t,e)},autobind:function(){}};function l(t,e){var n=a.hasOwnProperty(e)?a[e]:null;M.hasOwnProperty(e)&&o(\"OVERRIDE_BASE\"===n,\"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.\",e),t&&o(\"DEFINE_MANY\"===n||\"DEFINE_MANY_MERGED\"===n,\"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",e)}function p(t,n){if(n){o(\"function\"!=typeof n,\"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object.\"),o(!e(n),\"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.\");var r=t.prototype,i=r.__reactAutoBindPairs;for(var s in n.hasOwnProperty(u)&&f.mixins(t,n.mixins),n)if(n.hasOwnProperty(s)&&s!==u){var c=n[s],p=r.hasOwnProperty(s);if(l(p,s),f.hasOwnProperty(s))f[s](t,c);else{var h=a.hasOwnProperty(s);if(\"function\"==typeof c&&!h&&!p&&!1!==n.autobind)i.push(s,c),r[s]=c;else if(p){var v=a[s];o(h&&(\"DEFINE_MANY_MERGED\"===v||\"DEFINE_MANY\"===v),\"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.\",v,s),\"DEFINE_MANY_MERGED\"===v?r[s]=d(r[s],c):\"DEFINE_MANY\"===v&&(r[s]=y(r[s],c))}else r[s]=c}}}else;}function h(t,e){for(var n in o(t&&e&&\"object\"==typeof t&&\"object\"==typeof e,\"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.\"),e)e.hasOwnProperty(n)&&(o(void 0===t[n],\"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.\",n),t[n]=e[n]);return t}function d(t,e){return function(){var n=t.apply(this,arguments),r=e.apply(this,arguments);if(null==n)return r;if(null==r)return n;var i={};return h(i,n),h(i,r),i}}function y(t,e){return function(){t.apply(this,arguments),e.apply(this,arguments)}}function v(t,e){return e.bind(t)}var g={componentDidMount:function(){this.__isMounted=!0}},w={componentWillUnmount:function(){this.__isMounted=!1}},M={replaceState:function(t,e){this.updater.enqueueReplaceState(this,t,e)},isMounted:function(){return!!this.__isMounted}},m=function(){};return r(m.prototype,t.prototype,M),function(t){var e=function(t,r,u){this.__reactAutoBindPairs.length&&function(t){for(var e=t.__reactAutoBindPairs,n=0;n<e.length;n+=2){var r=e[n],i=e[n+1];t[r]=v(t,i)}}(this),this.props=t,this.context=r,this.refs=i,this.updater=u||n,this.state=null;var s=this.getInitialState?this.getInitialState():null;o(\"object\"==typeof s&&!Array.isArray(s),\"%s.getInitialState(): must return an object or null\",e.displayName||\"ReactCompositeComponent\"),this.state=s};for(var r in e.prototype=new m,e.prototype.constructor=e,e.prototype.__reactAutoBindPairs=[],s.forEach(p.bind(null,e)),p(e,g),p(e,t),p(e,w),e.getDefaultProps&&(e.defaultProps=e.getDefaultProps()),o(e.prototype.render,\"createClass(...): Class specification must implement a `render` method.\"),a)e.prototype[r]||(e.prototype[r]=null);return e}}},function(t,e,n){\"use strict\";var r=n(85),i=n(45);n(86);t.exports=function(t){return i.isValidElement(t)||r(\"143\"),t}},function(t,e,n){\"use strict\";var r=n(175);function i(){}function o(){}o.resetWarningCache=i,t.exports=function(){function t(t,e,n,i,o,u){if(u!==r){var s=new Error(\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types\");throw s.name=\"Invariant Violation\",s}}function e(){return t}t.isRequired=t;var n={array:t,bool:t,func:t,number:t,object:t,string:t,symbol:t,any:t,arrayOf:e,element:t,elementType:t,instanceOf:e,node:t,objectOf:e,oneOf:e,oneOfType:e,shape:e,exact:e,checkPropTypes:o,resetWarningCache:i};return n.PropTypes=n,n}},function(t,e,n){var r=n(318);t.exports=r},function(t,e,n){var r=n(319),i=Array.prototype;t.exports=function(t){var e=t.concat;return t===i||t instanceof Array&&e===i.concat?r:e}},function(t,e,n){n(159);var r=n(8);t.exports=r(\"Array\").concat},function(t,e,n){n(84);var r=n(321),i=n(61),o=Array.prototype,u={DOMTokenList:!0,NodeList:!0};t.exports=function(t){var e=t.forEach;return t===o||t instanceof Array&&e===o.forEach||u.hasOwnProperty(i(t))?r:e}},function(t,e,n){var r=n(322);t.exports=r},function(t,e,n){n(323);var r=n(8);t.exports=r(\"Array\").forEach},function(t,e,n){\"use strict\";var r=n(1),i=n(324);r({target:\"Array\",proto:!0,forced:[].forEach!=i},{forEach:i})},function(t,e,n){\"use strict\";var r=n(43).forEach,i=n(63)(\"forEach\");t.exports=i?[].forEach:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}},function(t,e,n){var r=n(326);t.exports=r},function(t,e,n){var r=n(327),i=Array.prototype;t.exports=function(t){var e=t.map;return t===i||t instanceof Array&&e===i.map?r:e}},function(t,e,n){n(328);var r=n(8);t.exports=r(\"Array\").map},function(t,e,n){\"use strict\";var r=n(1),i=n(43).map;r({target:\"Array\",proto:!0,forced:!n(82)(\"map\")},{map:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){\"use strict\";e.byteLength=function(t){var e=c(t),n=e[0],r=e[1];return 3*(n+r)/4-r},e.toByteArray=function(t){var e,n,r=c(t),u=r[0],s=r[1],a=new o(function(t,e,n){return 3*(e+n)/4-n}(0,u,s)),f=0,l=s>0?u-4:u;for(n=0;n<l;n+=4)e=i[t.charCodeAt(n)]<<18|i[t.charCodeAt(n+1)]<<12|i[t.charCodeAt(n+2)]<<6|i[t.charCodeAt(n+3)],a[f++]=e>>16&255,a[f++]=e>>8&255,a[f++]=255&e;2===s&&(e=i[t.charCodeAt(n)]<<2|i[t.charCodeAt(n+1)]>>4,a[f++]=255&e);1===s&&(e=i[t.charCodeAt(n)]<<10|i[t.charCodeAt(n+1)]<<4|i[t.charCodeAt(n+2)]>>2,a[f++]=e>>8&255,a[f++]=255&e);return a},e.fromByteArray=function(t){for(var e,n=t.length,i=n%3,o=[],u=16383,s=0,a=n-i;s<a;s+=u)o.push(f(t,s,s+u>a?a:s+u));1===i?(e=t[n-1],o.push(r[e>>2]+r[e<<4&63]+\"==\")):2===i&&(e=(t[n-2]<<8)+t[n-1],o.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+\"=\"));return o.join(\"\")};for(var r=[],i=[],o=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,u=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",s=0,a=u.length;s<a;++s)r[s]=u[s],i[u.charCodeAt(s)]=s;function c(t){var e=t.length;if(e%4>0)throw new Error(\"Invalid string. Length must be a multiple of 4\");var n=t.indexOf(\"=\");return-1===n&&(n=e),[n,n===e?0:4-n%4]}function f(t,e,n){for(var i,o,u=[],s=e;s<n;s+=3)i=(t[s]<<16&16711680)+(t[s+1]<<8&65280)+(255&t[s+2]),u.push(r[(o=i)>>18&63]+r[o>>12&63]+r[o>>6&63]+r[63&o]);return u.join(\"\")}i[\"-\".charCodeAt(0)]=62,i[\"_\".charCodeAt(0)]=63},function(t,e){e.read=function(t,e,n,r,i){var o,u,s=8*i-r-1,a=(1<<s)-1,c=a>>1,f=-7,l=n?i-1:0,p=n?-1:1,h=t[e+l];for(l+=p,o=h&(1<<-f)-1,h>>=-f,f+=s;f>0;o=256*o+t[e+l],l+=p,f-=8);for(u=o&(1<<-f)-1,o>>=-f,f+=r;f>0;u=256*u+t[e+l],l+=p,f-=8);if(0===o)o=1-c;else{if(o===a)return u?NaN:1/0*(h?-1:1);u+=Math.pow(2,r),o-=c}return(h?-1:1)*u*Math.pow(2,o-r)},e.write=function(t,e,n,r,i,o){var u,s,a,c=8*o-i-1,f=(1<<c)-1,l=f>>1,p=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:o-1,d=r?1:-1,y=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,u=f):(u=Math.floor(Math.log(e)/Math.LN2),e*(a=Math.pow(2,-u))<1&&(u--,a*=2),(e+=u+l>=1?p/a:p*Math.pow(2,1-l))*a>=2&&(u++,a/=2),u+l>=f?(s=0,u=f):u+l>=1?(s=(e*a-1)*Math.pow(2,i),u+=l):(s=e*Math.pow(2,l-1)*Math.pow(2,i),u=0));i>=8;t[n+h]=255&s,h+=d,s/=256,i-=8);for(u=u<<i|s,c+=i;c>0;t[n+h]=255&u,h+=d,u/=256,c-=8);t[n+h-d]|=128*y}},function(t,e,n){var r=n(123),i=n(179);t.exports=function(t){if(r(t))return i(t)},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(178);t.exports=r},function(t,e,n){n(1)({target:\"Array\",stat:!0},{isArray:n(59)})},function(t,e,n){var r=n(80),i=n(124),o=n(181);t.exports=function(t){if(void 0!==r&&null!=i(t)||null!=t[\"@@iterator\"])return o(t)},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){n(84),n(119);var r=n(180);t.exports=r},function(t,e,n){var r=n(337);t.exports=r},function(t,e,n){n(119),n(338);var r=n(10);t.exports=r.Array.from},function(t,e,n){var r=n(1),i=n(339);r({target:\"Array\",stat:!0,forced:!n(343)((function(t){Array.from(t)}))},{from:i})},function(t,e,n){\"use strict\";var r=n(106),i=n(19),o=n(340),u=n(342),s=n(30),a=n(114),c=n(180);t.exports=function(t){var e,n,f,l,p,h,d=i(t),y=\"function\"==typeof this?this:Array,v=arguments.length,g=v>1?arguments[1]:void 0,w=void 0!==g,M=c(d),m=0;if(w&&(g=r(g,v>2?arguments[2]:void 0,2)),null==M||y==Array&&u(M))for(n=new y(e=s(d.length));e>m;m++)h=w?g(d[m],m):d[m],a(n,m,h);else for(p=(l=M.call(d)).next,n=new y;!(f=p.call(l)).done;m++)h=w?o(l,g,[f.value,m],!0):f.value,a(n,m,h);return n.length=m,n}},function(t,e,n){var r=n(29),i=n(341);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){throw i(t),e}}},function(t,e,n){var r=n(29);t.exports=function(t){var e=t.return;if(void 0!==e)return r(e.call(t)).value}},function(t,e,n){var r=n(7),i=n(44),o=r(\"iterator\"),u=Array.prototype;t.exports=function(t){return void 0!==t&&(i.Array===t||u[o]===t)}},function(t,e,n){var r=n(7)(\"iterator\"),i=!1;try{var o=0,u={next:function(){return{done:!!o++}},return:function(){i=!0}};u[r]=function(){return this},Array.from(u,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},t(o)}catch(t){}return n}},function(t,e,n){t.exports=n(345)},function(t,e,n){var r=n(182);t.exports=r},function(t,e,n){n(347);var r=n(8);t.exports=r(\"Array\").slice},function(t,e,n){\"use strict\";var r=n(1),i=n(15),o=n(59),u=n(153),s=n(30),a=n(32),c=n(114),f=n(7),l=n(82)(\"slice\"),p=f(\"species\"),h=[].slice,d=Math.max;r({target:\"Array\",proto:!0,forced:!l},{slice:function(t,e){var n,r,f,l=a(this),y=s(l.length),v=u(t,y),g=u(void 0===e?y:e,y);if(o(l)&&(\"function\"!=typeof(n=l.constructor)||n!==Array&&!o(n.prototype)?i(n)&&null===(n=n[p])&&(n=void 0):n=void 0,n===Array||void 0===n))return h.call(l,v,g);for(r=new(void 0===n?Array:n)(d(g-v,0)),f=0;v<g;v++,f++)v in l&&c(r,f,l[v]);return r.length=f,r}})},function(t,e){t.exports=function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(123);t.exports=function(t){if(r(t))return t},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(80),i=n(124);t.exports=function(t,e){var n=null==t?null:void 0!==r&&i(t)||t[\"@@iterator\"];if(null!=n){var o,u,s=[],a=!0,c=!1;try{for(n=n.call(t);!(a=(o=n.next()).done)&&(s.push(o.value),!e||s.length!==e);a=!0);}catch(t){c=!0,u=t}finally{try{a||null==n.return||n.return()}finally{if(c)throw u}}return s}},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){t.exports=function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,n){var r=n(178);t.exports=r},function(t,e,n){n(84);var r=n(354),i=n(61),o=Array.prototype,u={DOMTokenList:!0,NodeList:!0};t.exports=function(t){var e=t.entries;return t===o||t instanceof Array&&e===o.entries||u.hasOwnProperty(i(t))?r:e}},function(t,e,n){var r=n(355);t.exports=r},function(t,e,n){n(168);var r=n(8);t.exports=r(\"Array\").entries},function(t,e,n){var r=n(357);t.exports=r},function(t,e,n){var r=n(358),i=Array.prototype;t.exports=function(t){var e=t.filter;return t===i||t instanceof Array&&e===i.filter?r:e}},function(t,e,n){n(359);var r=n(8);t.exports=r(\"Array\").filter},function(t,e,n){\"use strict\";var r=n(1),i=n(43).filter;r({target:\"Array\",proto:!0,forced:!n(82)(\"filter\")},{filter:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(361);t.exports=r},function(t,e,n){n(362);var r=n(10);t.exports=r.Object.keys},function(t,e,n){var r=n(1),i=n(19),o=n(77);r({target:\"Object\",stat:!0,forced:n(6)((function(){o(1)}))},{keys:function(t){return o(i(t))}})},function(t,e,n){var r=n(364);t.exports=r},function(t,e,n){var r=n(365),i=Function.prototype;t.exports=function(t){var e=t.bind;return t===i||t instanceof Function&&e===i.bind?r:e}},function(t,e,n){n(366);var r=n(8);t.exports=r(\"Function\").bind},function(t,e,n){n(1)({target:\"Function\",proto:!0},{bind:n(157)})},function(t,e,n){var r=n(368);t.exports=r},function(t,e,n){var r=n(369),i=Array.prototype;t.exports=function(t){var e=t.reduce;return t===i||t instanceof Array&&e===i.reduce?r:e}},function(t,e,n){n(370);var r=n(8);t.exports=r(\"Array\").reduce},function(t,e,n){\"use strict\";var r=n(1),i=n(371).left,o=n(63),u=n(60),s=n(372);r({target:\"Array\",proto:!0,forced:!o(\"reduce\")||!s&&u>79&&u<83},{reduce:function(t){return i(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(56),i=n(19),o=n(74),u=n(30),s=function(t){return function(e,n,s,a){r(n);var c=i(e),f=o(c),l=u(c.length),p=t?l-1:0,h=t?-1:1;if(s<2)for(;;){if(p in f){a=f[p],p+=h;break}if(p+=h,t?p<0:l<=p)throw TypeError(\"Reduce of empty array with no initial value\")}for(;t?p>=0:l>p;p+=h)p in f&&(a=n(a,f[p],p,c));return a}};t.exports={left:s(!1),right:s(!0)}},function(t,e,n){var r=n(55),i=n(13);t.exports=\"process\"==r(i.process)},function(t,e,n){var r=n(374);t.exports=r},function(t,e,n){n(375);var r=n(10);t.exports=r.Object.assign},function(t,e,n){var r=n(1),i=n(376);r({target:\"Object\",stat:!0,forced:Object.assign!==i},{assign:i})},function(t,e,n){\"use strict\";var r=n(23),i=n(6),o=n(77),u=n(163),s=n(105),a=n(19),c=n(74),f=Object.assign,l=Object.defineProperty;t.exports=!f||i((function(){if(r&&1!==f({b:1},f(l({},\"a\",{enumerable:!0,get:function(){l(this,\"b\",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},e={},n=Symbol(),i=\"abcdefghijklmnopqrst\";return t[n]=7,i.split(\"\").forEach((function(t){e[t]=t})),7!=f({},t)[n]||o(f({},e)).join(\"\")!=i}))?function(t,e){for(var n=a(t),i=arguments.length,f=1,l=u.f,p=s.f;i>f;)for(var h,d=c(arguments[f++]),y=l?o(d).concat(l(d)):o(d),v=y.length,g=0;v>g;)h=y[g++],r&&!p.call(d,h)||(n[h]=d[h]);return n}:f},function(t,e,n){var r=n(378);t.exports=r},function(t,e,n){var r=n(379),i=Array.prototype;t.exports=function(t){var e=t.sort;return t===i||t instanceof Array&&e===i.sort?r:e}},function(t,e,n){n(380);var r=n(8);t.exports=r(\"Array\").sort},function(t,e,n){\"use strict\";var r=n(1),i=n(56),o=n(19),u=n(30),s=n(6),a=n(381),c=n(63),f=n(382),l=n(383),p=n(60),h=n(384),d=[],y=d.sort,v=s((function(){d.sort(void 0)})),g=s((function(){d.sort(null)})),w=c(\"sort\"),M=!s((function(){if(p)return p<70;if(!(f&&f>3)){if(l)return!0;if(h)return h<603;var t,e,n,r,i=\"\";for(t=65;t<76;t++){switch(e=String.fromCharCode(t),t){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)d.push({k:e+r,v:n})}for(d.sort((function(t,e){return e.v-t.v})),r=0;r<d.length;r++)e=d[r].k.charAt(0),i.charAt(i.length-1)!==e&&(i+=e);return\"DGBEFHACIJK\"!==i}}));r({target:\"Array\",proto:!0,forced:v||!g||!w||!M},{sort:function(t){void 0!==t&&i(t);var e=o(this);if(M)return void 0===t?y.call(e):y.call(e,t);var n,r,s=[],c=u(e.length);for(r=0;r<c;r++)r in e&&s.push(e[r]);for(n=(s=a(s,function(t){return function(e,n){return void 0===n?-1:void 0===e?1:void 0!==t?+t(e,n)||0:String(e)>String(n)?1:-1}}(t))).length,r=0;r<n;)e[r]=s[r++];for(;r<c;)delete e[r++];return e}})},function(t,e){var n=Math.floor,r=function(t,e){var u=t.length,s=n(u/2);return u<8?i(t,e):o(r(t.slice(0,s),e),r(t.slice(s),e),e)},i=function(t,e){for(var n,r,i=t.length,o=1;o<i;){for(r=o,n=t[o];r&&e(t[r-1],n)>0;)t[r]=t[--r];r!==o++&&(t[r]=n)}return t},o=function(t,e,n){for(var r=t.length,i=e.length,o=0,u=0,s=[];o<r||u<i;)o<r&&u<i?s.push(n(t[o],e[u])<=0?t[o++]:e[u++]):s.push(o<r?t[o++]:e[u++]);return s};t.exports=r},function(t,e,n){var r=n(81).match(/firefox\\/(\\d+)/i);t.exports=!!r&&+r[1]},function(t,e,n){var r=n(81);t.exports=/MSIE|Trident/.test(r)},function(t,e,n){var r=n(81).match(/AppleWebKit\\/(\\d+)\\./);t.exports=!!r&&+r[1]},function(t,e,n){var r=n(182);t.exports=r},function(t,e,n){var r=n(387);t.exports=r},function(t,e,n){var r=n(388),i=Array.prototype;t.exports=function(t){var e=t.some;return t===i||t instanceof Array&&e===i.some?r:e}},function(t,e,n){n(389);var r=n(8);t.exports=r(\"Array\").some},function(t,e,n){\"use strict\";var r=n(1),i=n(43).some;r({target:\"Array\",proto:!0,forced:!n(63)(\"some\")},{some:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(391);t.exports=r},function(t,e,n){var r=n(392),i=n(394),o=Array.prototype,u=String.prototype;t.exports=function(t){var e=t.includes;return t===o||t instanceof Array&&e===o.includes?r:\"string\"==typeof t||t===u||t instanceof String&&e===u.includes?i:e}},function(t,e,n){n(393);var r=n(8);t.exports=r(\"Array\").includes},function(t,e,n){\"use strict\";var r=n(1),i=n(107).includes,o=n(120);r({target:\"Array\",proto:!0},{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),o(\"includes\")},function(t,e,n){n(395);var r=n(8);t.exports=r(\"String\").includes},function(t,e,n){\"use strict\";var r=n(1),i=n(183),o=n(42);r({target:\"String\",proto:!0,forced:!n(184)(\"includes\")},{includes:function(t){return!!~String(o(this)).indexOf(i(t),arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(15),i=n(55),o=n(7)(\"match\");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[o])?!!e:\"RegExp\"==i(t))}},function(t,e,n){var r=n(398);t.exports=r},function(t,e,n){n(399);var r=n(10);r.JSON||(r.JSON={stringify:JSON.stringify}),t.exports=function(t,e,n){return r.JSON.stringify.apply(null,arguments)}},function(t,e,n){var r=n(1),i=n(57),o=n(6),u=i(\"JSON\",\"stringify\"),s=/[\\uD800-\\uDFFF]/g,a=/^[\\uD800-\\uDBFF]$/,c=/^[\\uDC00-\\uDFFF]$/,f=function(t,e,n){var r=n.charAt(e-1),i=n.charAt(e+1);return a.test(t)&&!c.test(i)||c.test(t)&&!a.test(r)?\"\\\\u\"+t.charCodeAt(0).toString(16):t},l=o((function(){return'\"\\\\udf06\\\\ud834\"'!==u(\"\\udf06\\ud834\")||'\"\\\\udead\"'!==u(\"\\udead\")}));u&&r({target:\"JSON\",stat:!0,forced:l},{stringify:function(t,e,n){var r=u.apply(null,arguments);return\"string\"==typeof r?r.replace(s,f):r}})},function(t,e,n){var r=n(401);t.exports=r},function(t,e,n){var r=n(402),i=Array.prototype;t.exports=function(t){var e=t.indexOf;return t===i||t instanceof Array&&e===i.indexOf?r:e}},function(t,e,n){n(403);var r=n(8);t.exports=r(\"Array\").indexOf},function(t,e,n){\"use strict\";var r=n(1),i=n(107).indexOf,o=n(63),u=[].indexOf,s=!!u&&1/[1].indexOf(1,-0)<0,a=o(\"indexOf\");r({target:\"Array\",proto:!0,forced:s||!a},{indexOf:function(t){return s?u.apply(this,arguments)||0:i(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(405);t.exports=r},function(t,e,n){var r=n(406),i=Array.prototype;t.exports=function(t){var e=t.find;return t===i||t instanceof Array&&e===i.find?r:e}},function(t,e,n){n(407);var r=n(8);t.exports=r(\"Array\").find},function(t,e,n){\"use strict\";var r=n(1),i=n(43).find,o=n(120),u=\"find\",s=!0;u in[]&&Array(1).find((function(){s=!1})),r({target:\"Array\",proto:!0,forced:s},{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),o(u)},function(t,e,n){var r=n(409);t.exports=r},function(t,e,n){var r=n(410),i=String.prototype;t.exports=function(t){var e=t.startsWith;return\"string\"==typeof t||t===i||t instanceof String&&e===i.startsWith?r:e}},function(t,e,n){n(411);var r=n(8);t.exports=r(\"String\").startsWith},function(t,e,n){\"use strict\";var r,i=n(1),o=n(104).f,u=n(30),s=n(183),a=n(42),c=n(184),f=n(58),l=\"\".startsWith,p=Math.min,h=c(\"startsWith\");i({target:\"String\",proto:!0,forced:!!(f||h||(r=o(String.prototype,\"startsWith\"),!r||r.writable))&&!h},{startsWith:function(t){var e=String(a(this));s(t);var n=u(p(arguments.length>1?arguments[1]:void 0,e.length)),r=String(t);return l?l.call(e,r,n):e.slice(n,n+r.length)===r}})},function(t,e,n){var r=n(413);t.exports=r},function(t,e,n){var r=n(414),i=String.prototype;t.exports=function(t){var e=t.trim;return\"string\"==typeof t||t===i||t instanceof String&&e===i.trim?r:e}},function(t,e,n){n(415);var r=n(8);t.exports=r(\"String\").trim},function(t,e,n){\"use strict\";var r=n(1),i=n(416).trim;r({target:\"String\",proto:!0,forced:n(417)(\"trim\")},{trim:function(){return i(this)}})},function(t,e,n){var r=n(42),i=\"[\"+n(185)+\"]\",o=RegExp(\"^\"+i+i+\"*\"),u=RegExp(i+i+\"*$\"),s=function(t){return function(e){var n=String(r(e));return 1&t&&(n=n.replace(o,\"\")),2&t&&(n=n.replace(u,\"\")),n}};t.exports={start:s(1),end:s(2),trim:s(3)}},function(t,e,n){var r=n(6),i=n(185);t.exports=function(t){return r((function(){return!!i[t]()||\"​᠎\"!=\"​᠎\"[t]()||i[t].name!==t}))}},function(t,e,n){var r=n(64),i=n(141);t.exports=function(t){return i(r(t).toLowerCase())}},function(t,e,n){var r=n(87),i=n(420),o=n(22),u=n(88),s=r?r.prototype:void 0,a=s?s.toString:void 0;t.exports=function t(e){if(\"string\"==typeof e)return e;if(o(e))return i(e,t)+\"\";if(u(e))return a?a.call(e):\"\";var n=e+\"\";return\"0\"==n&&1/e==-Infinity?\"-0\":n}},function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,i=Array(r);++n<r;)i[n]=e(t[n],n,t);return i}},function(t,e,n){var r=n(87),i=Object.prototype,o=i.hasOwnProperty,u=i.toString,s=r?r.toStringTag:void 0;t.exports=function(t){var e=o.call(t,s),n=t[s];try{t[s]=void 0;var r=!0}catch(t){}var i=u.call(t);return r&&(e?t[s]=n:delete t[s]),i}},function(t,e){var n=Object.prototype.toString;t.exports=function(t){return n.call(t)}},function(t,e,n){var r=n(424),i=n(187),o=n(426),u=n(64);t.exports=function(t){return function(e){e=u(e);var n=i(e)?o(e):void 0,s=n?n[0]:e.charAt(0),a=n?r(n,1).join(\"\"):e.slice(1);return s[t]()+a}}},function(t,e,n){var r=n(425);t.exports=function(t,e,n){var i=t.length;return n=void 0===n?i:n,!e&&n>=i?t:r(t,e,n)}},function(t,e){t.exports=function(t,e,n){var r=-1,i=t.length;e<0&&(e=-e>i?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var o=Array(i);++r<i;)o[r]=t[r+e];return o}},function(t,e,n){var r=n(427),i=n(187),o=n(428);t.exports=function(t){return i(t)?o(t):r(t)}},function(t,e){t.exports=function(t){return t.split(\"\")}},function(t,e){var n=\"[\\\\ud800-\\\\udfff]\",r=\"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\",i=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",o=\"[^\\\\ud800-\\\\udfff]\",u=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",s=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",a=\"(?:\"+r+\"|\"+i+\")\"+\"?\",c=\"[\\\\ufe0e\\\\ufe0f]?\",f=c+a+(\"(?:\\\\u200d(?:\"+[o,u,s].join(\"|\")+\")\"+c+a+\")*\"),l=\"(?:\"+[o+r+\"?\",r,u,s,n].join(\"|\")+\")\",p=RegExp(i+\"(?=\"+i+\")|\"+l+f,\"g\");t.exports=function(t){return t.match(p)||[]}},function(t,e,n){var r=n(430),i=n(431),o=n(434),u=RegExp(\"['’]\",\"g\");t.exports=function(t){return function(e){return r(o(i(e).replace(u,\"\")),t,\"\")}}},function(t,e){t.exports=function(t,e,n,r){var i=-1,o=null==t?0:t.length;for(r&&o&&(n=t[++i]);++i<o;)n=e(n,t[i],i,t);return n}},function(t,e,n){var r=n(432),i=n(64),o=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,u=RegExp(\"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\",\"g\");t.exports=function(t){return(t=i(t))&&t.replace(o,r).replace(u,\"\")}},function(t,e,n){var r=n(433)({\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ã\":\"A\",\"Ä\":\"A\",\"Å\":\"A\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ã\":\"a\",\"ä\":\"a\",\"å\":\"a\",\"Ç\":\"C\",\"ç\":\"c\",\"Ð\":\"D\",\"ð\":\"d\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ë\":\"E\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ë\":\"e\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ï\":\"I\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ï\":\"i\",\"Ñ\":\"N\",\"ñ\":\"n\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Õ\":\"O\",\"Ö\":\"O\",\"Ø\":\"O\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"õ\":\"o\",\"ö\":\"o\",\"ø\":\"o\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ü\":\"U\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ü\":\"u\",\"Ý\":\"Y\",\"ý\":\"y\",\"ÿ\":\"y\",\"Æ\":\"Ae\",\"æ\":\"ae\",\"Þ\":\"Th\",\"þ\":\"th\",\"ß\":\"ss\",\"Ā\":\"A\",\"Ă\":\"A\",\"Ą\":\"A\",\"ā\":\"a\",\"ă\":\"a\",\"ą\":\"a\",\"Ć\":\"C\",\"Ĉ\":\"C\",\"Ċ\":\"C\",\"Č\":\"C\",\"ć\":\"c\",\"ĉ\":\"c\",\"ċ\":\"c\",\"č\":\"c\",\"Ď\":\"D\",\"Đ\":\"D\",\"ď\":\"d\",\"đ\":\"d\",\"Ē\":\"E\",\"Ĕ\":\"E\",\"Ė\":\"E\",\"Ę\":\"E\",\"Ě\":\"E\",\"ē\":\"e\",\"ĕ\":\"e\",\"ė\":\"e\",\"ę\":\"e\",\"ě\":\"e\",\"Ĝ\":\"G\",\"Ğ\":\"G\",\"Ġ\":\"G\",\"Ģ\":\"G\",\"ĝ\":\"g\",\"ğ\":\"g\",\"ġ\":\"g\",\"ģ\":\"g\",\"Ĥ\":\"H\",\"Ħ\":\"H\",\"ĥ\":\"h\",\"ħ\":\"h\",\"Ĩ\":\"I\",\"Ī\":\"I\",\"Ĭ\":\"I\",\"Į\":\"I\",\"İ\":\"I\",\"ĩ\":\"i\",\"ī\":\"i\",\"ĭ\":\"i\",\"į\":\"i\",\"ı\":\"i\",\"Ĵ\":\"J\",\"ĵ\":\"j\",\"Ķ\":\"K\",\"ķ\":\"k\",\"ĸ\":\"k\",\"Ĺ\":\"L\",\"Ļ\":\"L\",\"Ľ\":\"L\",\"Ŀ\":\"L\",\"Ł\":\"L\",\"ĺ\":\"l\",\"ļ\":\"l\",\"ľ\":\"l\",\"ŀ\":\"l\",\"ł\":\"l\",\"Ń\":\"N\",\"Ņ\":\"N\",\"Ň\":\"N\",\"Ŋ\":\"N\",\"ń\":\"n\",\"ņ\":\"n\",\"ň\":\"n\",\"ŋ\":\"n\",\"Ō\":\"O\",\"Ŏ\":\"O\",\"Ő\":\"O\",\"ō\":\"o\",\"ŏ\":\"o\",\"ő\":\"o\",\"Ŕ\":\"R\",\"Ŗ\":\"R\",\"Ř\":\"R\",\"ŕ\":\"r\",\"ŗ\":\"r\",\"ř\":\"r\",\"Ś\":\"S\",\"Ŝ\":\"S\",\"Ş\":\"S\",\"Š\":\"S\",\"ś\":\"s\",\"ŝ\":\"s\",\"ş\":\"s\",\"š\":\"s\",\"Ţ\":\"T\",\"Ť\":\"T\",\"Ŧ\":\"T\",\"ţ\":\"t\",\"ť\":\"t\",\"ŧ\":\"t\",\"Ũ\":\"U\",\"Ū\":\"U\",\"Ŭ\":\"U\",\"Ů\":\"U\",\"Ű\":\"U\",\"Ų\":\"U\",\"ũ\":\"u\",\"ū\":\"u\",\"ŭ\":\"u\",\"ů\":\"u\",\"ű\":\"u\",\"ų\":\"u\",\"Ŵ\":\"W\",\"ŵ\":\"w\",\"Ŷ\":\"Y\",\"ŷ\":\"y\",\"Ÿ\":\"Y\",\"Ź\":\"Z\",\"Ż\":\"Z\",\"Ž\":\"Z\",\"ź\":\"z\",\"ż\":\"z\",\"ž\":\"z\",\"Ĳ\":\"IJ\",\"ĳ\":\"ij\",\"Œ\":\"Oe\",\"œ\":\"oe\",\"ŉ\":\"'n\",\"ſ\":\"s\"});t.exports=r},function(t,e){t.exports=function(t){return function(e){return null==t?void 0:t[e]}}},function(t,e,n){var r=n(435),i=n(436),o=n(64),u=n(437);t.exports=function(t,e,n){return t=o(t),void 0===(e=n?void 0:e)?i(t)?u(t):r(t):t.match(e)||[]}},function(t,e){var n=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;t.exports=function(t){return t.match(n)||[]}},function(t,e){var n=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;t.exports=function(t){return n.test(t)}},function(t,e){var n=\"\\\\u2700-\\\\u27bf\",r=\"a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\",i=\"A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\",o=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",u=\"[\"+o+\"]\",s=\"\\\\d+\",a=\"[\\\\u2700-\\\\u27bf]\",c=\"[\"+r+\"]\",f=\"[^\\\\ud800-\\\\udfff\"+o+s+n+r+i+\"]\",l=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",p=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",h=\"[\"+i+\"]\",d=\"(?:\"+c+\"|\"+f+\")\",y=\"(?:\"+h+\"|\"+f+\")\",v=\"(?:['’](?:d|ll|m|re|s|t|ve))?\",g=\"(?:['’](?:D|LL|M|RE|S|T|VE))?\",w=\"(?:[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]|\\\\ud83c[\\\\udffb-\\\\udfff])?\",M=\"[\\\\ufe0e\\\\ufe0f]?\",m=M+w+(\"(?:\\\\u200d(?:\"+[\"[^\\\\ud800-\\\\udfff]\",l,p].join(\"|\")+\")\"+M+w+\")*\"),_=\"(?:\"+[a,l,p].join(\"|\")+\")\"+m,L=RegExp([h+\"?\"+c+\"+\"+v+\"(?=\"+[u,h,\"$\"].join(\"|\")+\")\",y+\"+\"+g+\"(?=\"+[u,h+d,\"$\"].join(\"|\")+\")\",h+\"?\"+d+\"+\"+v,h+\"+\"+g,\"\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\",\"\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\",s,_].join(\"|\"),\"g\");t.exports=function(t){return t.match(L)||[]}},function(t,e,n){var r=n(439),i=n(90),o=n(127);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(o||i),string:new r}}},function(t,e,n){var r=n(440),i=n(445),o=n(446),u=n(447),s=n(448);function a(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}a.prototype.clear=r,a.prototype.delete=i,a.prototype.get=o,a.prototype.has=u,a.prototype.set=s,t.exports=a},function(t,e,n){var r=n(89);t.exports=function(){this.__data__=r?r(null):{},this.size=0}},function(t,e,n){var r=n(70),i=n(442),o=n(67),u=n(188),s=/^\\[object .+?Constructor\\]$/,a=Function.prototype,c=Object.prototype,f=a.toString,l=c.hasOwnProperty,p=RegExp(\"^\"+f.call(l).replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");t.exports=function(t){return!(!o(t)||i(t))&&(r(t)?p:s).test(u(t))}},function(t,e,n){var r,i=n(443),o=(r=/[^.]+$/.exec(i&&i.keys&&i.keys.IE_PROTO||\"\"))?\"Symbol(src)_1.\"+r:\"\";t.exports=function(t){return!!o&&o in t}},function(t,e,n){var r=n(25)[\"__core-js_shared__\"];t.exports=r},function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},function(t,e){t.exports=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}},function(t,e,n){var r=n(89),i=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;if(r){var n=e[t];return\"__lodash_hash_undefined__\"===n?void 0:n}return i.call(e,t)?e[t]:void 0}},function(t,e,n){var r=n(89),i=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;return r?void 0!==e[t]:i.call(e,t)}},function(t,e,n){var r=n(89);t.exports=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=r&&void 0===e?\"__lodash_hash_undefined__\":e,this}},function(t,e){t.exports=function(){this.__data__=[],this.size=0}},function(t,e,n){var r=n(91),i=Array.prototype.splice;t.exports=function(t){var e=this.__data__,n=r(e,t);return!(n<0)&&(n==e.length-1?e.pop():i.call(e,n,1),--this.size,!0)}},function(t,e,n){var r=n(91);t.exports=function(t){var e=this.__data__,n=r(e,t);return n<0?void 0:e[n][1]}},function(t,e,n){var r=n(91);t.exports=function(t){return r(this.__data__,t)>-1}},function(t,e,n){var r=n(91);t.exports=function(t,e){var n=this.__data__,i=r(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this}},function(t,e,n){var r=n(92);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},function(t,e){t.exports=function(t){var e=typeof t;return\"string\"==e||\"number\"==e||\"symbol\"==e||\"boolean\"==e?\"__proto__\"!==t:null===t}},function(t,e,n){var r=n(92);t.exports=function(t){return r(this,t).get(t)}},function(t,e,n){var r=n(92);t.exports=function(t){return r(this,t).has(t)}},function(t,e,n){var r=n(92);t.exports=function(t,e){var n=r(this,t),i=n.size;return n.set(t,e),this.size+=n.size==i?0:1,this}},function(t,e,n){var r=n(128),i=n(68),o=n(93);t.exports=function(t){return function(e,n,u){var s=Object(e);if(!i(e)){var a=r(n,3);e=o(e),n=function(t){return a(s[t],t,s)}}var c=t(e,n,u);return c>-1?s[a?e[c]:c]:void 0}}},function(t,e,n){var r=n(461),i=n(496),o=n(198);t.exports=function(t){var e=i(t);return 1==e.length&&e[0][2]?o(e[0][0],e[0][1]):function(n){return n===t||r(n,t,e)}}},function(t,e,n){var r=n(189),i=n(190);t.exports=function(t,e,n,o){var u=n.length,s=u,a=!o;if(null==t)return!s;for(t=Object(t);u--;){var c=n[u];if(a&&c[2]?c[1]!==t[c[0]]:!(c[0]in t))return!1}for(;++u<s;){var f=(c=n[u])[0],l=t[f],p=c[1];if(a&&c[2]){if(void 0===l&&!(f in t))return!1}else{var h=new r;if(o)var d=o(l,p,f,t,e,h);if(!(void 0===d?i(p,l,3,o,h):d))return!1}}return!0}},function(t,e,n){var r=n(90);t.exports=function(){this.__data__=new r,this.size=0}},function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},function(t,e){t.exports=function(t){return this.__data__.get(t)}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var r=n(90),i=n(127),o=n(126);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var u=n.__data__;if(!i||u.length<199)return u.push([t,e]),this.size=++n.size,this;n=this.__data__=new o(u)}return n.set(t,e),this.size=n.size,this}},function(t,e,n){var r=n(189),i=n(191),o=n(472),u=n(476),s=n(196),a=n(22),c=n(130),f=n(132),l=\"[object Arguments]\",p=\"[object Array]\",h=\"[object Object]\",d=Object.prototype.hasOwnProperty;t.exports=function(t,e,n,y,v,g){var w=a(t),M=a(e),m=w?p:s(t),_=M?p:s(e),L=(m=m==l?h:m)==h,b=(_=_==l?h:_)==h,x=m==_;if(x&&c(t)){if(!c(e))return!1;w=!0,L=!1}if(x&&!L)return g||(g=new r),w||f(t)?i(t,e,n,y,v,g):o(t,e,m,n,y,v,g);if(!(1&n)){var j=L&&d.call(t,\"__wrapped__\"),N=b&&d.call(e,\"__wrapped__\");if(j||N){var S=j?t.value():t,D=N?e.value():e;return g||(g=new r),v(S,D,n,y,g)}}return!!x&&(g||(g=new r),u(t,e,n,y,v,g))}},function(t,e,n){var r=n(126),i=n(469),o=n(470);function u(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new r;++e<n;)this.add(t[e])}u.prototype.add=u.prototype.push=i,u.prototype.has=o,t.exports=u},function(t,e){t.exports=function(t){return this.__data__.set(t,\"__lodash_hash_undefined__\"),this}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e){t.exports=function(t,e){return t.has(e)}},function(t,e,n){var r=n(87),i=n(473),o=n(49),u=n(191),s=n(474),a=n(475),c=r?r.prototype:void 0,f=c?c.valueOf:void 0;t.exports=function(t,e,n,r,c,l,p){switch(n){case\"[object DataView]\":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case\"[object ArrayBuffer]\":return!(t.byteLength!=e.byteLength||!l(new i(t),new i(e)));case\"[object Boolean]\":case\"[object Date]\":case\"[object Number]\":return o(+t,+e);case\"[object Error]\":return t.name==e.name&&t.message==e.message;case\"[object RegExp]\":case\"[object String]\":return t==e+\"\";case\"[object Map]\":var h=s;case\"[object Set]\":var d=1&r;if(h||(h=a),t.size!=e.size&&!d)return!1;var y=p.get(t);if(y)return y==e;r|=2,p.set(t,e);var v=u(h(t),h(e),r,c,l,p);return p.delete(t),v;case\"[object Symbol]\":if(f)return f.call(t)==f.call(e)}return!1}},function(t,e,n){var r=n(25).Uint8Array;t.exports=r},function(t,e){t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t,r){n[++e]=[r,t]})),n}},function(t,e){t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t){n[++e]=t})),n}},function(t,e,n){var r=n(477),i=Object.prototype.hasOwnProperty;t.exports=function(t,e,n,o,u,s){var a=1&n,c=r(t),f=c.length;if(f!=r(e).length&&!a)return!1;for(var l=f;l--;){var p=c[l];if(!(a?p in e:i.call(e,p)))return!1}var h=s.get(t),d=s.get(e);if(h&&d)return h==e&&d==t;var y=!0;s.set(t,e),s.set(e,t);for(var v=a;++l<f;){var g=t[p=c[l]],w=e[p];if(o)var M=a?o(w,g,p,e,t,s):o(g,w,p,t,e,s);if(!(void 0===M?g===w||u(g,w,n,o,s):M)){y=!1;break}v||(v=\"constructor\"==p)}if(y&&!v){var m=t.constructor,_=e.constructor;m==_||!(\"constructor\"in t)||!(\"constructor\"in e)||\"function\"==typeof m&&m instanceof m&&\"function\"==typeof _&&_ instanceof _||(y=!1)}return s.delete(t),s.delete(e),y}},function(t,e,n){var r=n(478),i=n(480),o=n(93);t.exports=function(t){return r(t,o,i)}},function(t,e,n){var r=n(479),i=n(22);t.exports=function(t,e,n){var o=e(t);return i(t)?o:r(o,n(t))}},function(t,e){t.exports=function(t,e){for(var n=-1,r=e.length,i=t.length;++n<r;)t[i+n]=e[n];return t}},function(t,e,n){var r=n(481),i=n(482),o=Object.prototype.propertyIsEnumerable,u=Object.getOwnPropertySymbols,s=u?function(t){return null==t?[]:(t=Object(t),r(u(t),(function(e){return o.call(t,e)})))}:i;t.exports=s},function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,i=0,o=[];++n<r;){var u=t[n];e(u,n,t)&&(o[i++]=u)}return o}},function(t,e){t.exports=function(){return[]}},function(t,e,n){var r=n(484),i=n(129),o=n(22),u=n(130),s=n(131),a=n(132),c=Object.prototype.hasOwnProperty;t.exports=function(t,e){var n=o(t),f=!n&&i(t),l=!n&&!f&&u(t),p=!n&&!f&&!l&&a(t),h=n||f||l||p,d=h?r(t.length,String):[],y=d.length;for(var v in t)!e&&!c.call(t,v)||h&&(\"length\"==v||l&&(\"offset\"==v||\"parent\"==v)||p&&(\"buffer\"==v||\"byteLength\"==v||\"byteOffset\"==v)||s(v,y))||d.push(v);return d}},function(t,e){t.exports=function(t,e){for(var n=-1,r=Array(t);++n<t;)r[n]=e(n);return r}},function(t,e,n){var r=n(65),i=n(66);t.exports=function(t){return i(t)&&\"[object Arguments]\"==r(t)}},function(t,e){t.exports=function(){return!1}},function(t,e,n){var r=n(65),i=n(133),o=n(66),u={};u[\"[object Float32Array]\"]=u[\"[object Float64Array]\"]=u[\"[object Int8Array]\"]=u[\"[object Int16Array]\"]=u[\"[object Int32Array]\"]=u[\"[object Uint8Array]\"]=u[\"[object Uint8ClampedArray]\"]=u[\"[object Uint16Array]\"]=u[\"[object Uint32Array]\"]=!0,u[\"[object Arguments]\"]=u[\"[object Array]\"]=u[\"[object ArrayBuffer]\"]=u[\"[object Boolean]\"]=u[\"[object DataView]\"]=u[\"[object Date]\"]=u[\"[object Error]\"]=u[\"[object Function]\"]=u[\"[object Map]\"]=u[\"[object Number]\"]=u[\"[object Object]\"]=u[\"[object RegExp]\"]=u[\"[object Set]\"]=u[\"[object String]\"]=u[\"[object WeakMap]\"]=!1,t.exports=function(t){return o(t)&&i(t.length)&&!!u[r(t)]}},function(t,e){t.exports=function(t){return function(e){return t(e)}}},function(t,e,n){(function(t){var r=n(186),i=e&&!e.nodeType&&e,o=i&&\"object\"==typeof t&&t&&!t.nodeType&&t,u=o&&o.exports===i&&r.process,s=function(){try{var t=o&&o.require&&o.require(\"util\").types;return t||u&&u.binding&&u.binding(\"util\")}catch(t){}}();t.exports=s}).call(this,n(193)(t))},function(t,e,n){var r=n(491)(Object.keys,Object);t.exports=r},function(t,e){t.exports=function(t,e){return function(n){return t(e(n))}}},function(t,e,n){var r=n(46)(n(25),\"DataView\");t.exports=r},function(t,e,n){var r=n(46)(n(25),\"Promise\");t.exports=r},function(t,e,n){var r=n(46)(n(25),\"Set\");t.exports=r},function(t,e,n){var r=n(46)(n(25),\"WeakMap\");t.exports=r},function(t,e,n){var r=n(197),i=n(93);t.exports=function(t){for(var e=i(t),n=e.length;n--;){var o=e[n],u=t[o];e[n]=[o,u,r(u)]}return e}},function(t,e,n){var r=n(190),i=n(498),o=n(501),u=n(134),s=n(197),a=n(198),c=n(94);t.exports=function(t,e){return u(t)&&s(e)?a(c(t),e):function(n){var u=i(n,t);return void 0===u&&u===e?o(n,t):r(e,u,3)}}},function(t,e,n){var r=n(199);t.exports=function(t,e,n){var i=null==t?void 0:r(t,e);return void 0===i?n:i}},function(t,e,n){var r=n(500),i=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,o=/\\\\(\\\\)?/g,u=r((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(\"\"),t.replace(i,(function(t,n,r,i){e.push(r?i.replace(o,\"$1\"):n||t)})),e}));t.exports=u},function(t,e,n){var r=n(142);t.exports=function(t){var e=r(t,(function(t){return 500===n.size&&n.clear(),t})),n=e.cache;return e}},function(t,e,n){var r=n(502),i=n(503);t.exports=function(t,e){return null!=t&&i(t,e,r)}},function(t,e){t.exports=function(t,e){return null!=t&&e in Object(t)}},function(t,e,n){var r=n(200),i=n(129),o=n(22),u=n(131),s=n(133),a=n(94);t.exports=function(t,e,n){for(var c=-1,f=(e=r(e,t)).length,l=!1;++c<f;){var p=a(e[c]);if(!(l=null!=t&&n(t,p)))break;t=t[p]}return l||++c!=f?l:!!(f=null==t?0:t.length)&&s(f)&&u(p,f)&&(o(t)||i(t))}},function(t,e){t.exports=function(t){return t}},function(t,e,n){var r=n(506),i=n(507),o=n(134),u=n(94);t.exports=function(t){return o(t)?r(u(t)):i(t)}},function(t,e){t.exports=function(t){return function(e){return null==e?void 0:e[t]}}},function(t,e,n){var r=n(199);t.exports=function(t){return function(e){return r(e,t)}}},function(t,e,n){var r=n(509),i=n(128),o=n(510),u=Math.max;t.exports=function(t,e,n){var s=null==t?0:t.length;if(!s)return-1;var a=null==n?0:o(n);return a<0&&(a=u(s+a,0)),r(t,i(e,3),a)}},function(t,e){t.exports=function(t,e,n,r){for(var i=t.length,o=n+(r?1:-1);r?o--:++o<i;)if(e(t[o],o,t))return o;return-1}},function(t,e,n){var r=n(511);t.exports=function(t){var e=r(t),n=e%1;return e==e?n?e-n:e:0}},function(t,e,n){var r=n(512),i=1/0;t.exports=function(t){return t?(t=r(t))===i||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}},function(t,e,n){var r=n(513),i=n(67),o=n(88),u=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,a=/^0o[0-7]+$/i,c=parseInt;t.exports=function(t){if(\"number\"==typeof t)return t;if(o(t))return NaN;if(i(t)){var e=\"function\"==typeof t.valueOf?t.valueOf():t;t=i(e)?e+\"\":e}if(\"string\"!=typeof t)return 0===t?t:+t;t=r(t);var n=s.test(t);return n||a.test(t)?c(t.slice(2),n?2:8):u.test(t)?NaN:+t}},function(t,e,n){var r=n(514),i=/^\\s+/;t.exports=function(t){return t?t.slice(0,r(t)+1).replace(i,\"\"):t}},function(t,e){var n=/\\s/;t.exports=function(t){for(var e=t.length;e--&&n.test(t.charAt(e)););return e}},function(t,e,n){var r=n(516);t.exports=function(t,e){var n;return r(t,(function(t,r,i){return!(n=e(t,r,i))})),!!n}},function(t,e,n){var r=n(517),i=n(520)(r);t.exports=i},function(t,e,n){var r=n(518),i=n(93);t.exports=function(t,e){return t&&r(t,e,i)}},function(t,e,n){var r=n(519)();t.exports=r},function(t,e){t.exports=function(t){return function(e,n,r){for(var i=-1,o=Object(e),u=r(e),s=u.length;s--;){var a=u[t?s:++i];if(!1===n(o[a],a,o))break}return e}}},function(t,e,n){var r=n(68);t.exports=function(t,e){return function(n,i){if(null==n)return n;if(!r(n))return t(n,i);for(var o=n.length,u=e?o:-1,s=Object(n);(e?u--:++u<o)&&!1!==i(s[u],u,s););return n}}},function(t,e,n){var r=n(49),i=n(68),o=n(131),u=n(67);t.exports=function(t,e,n){if(!u(n))return!1;var s=typeof e;return!!(\"number\"==s?i(n)&&o(e,n.length):\"string\"==s&&e in n)&&r(n[e],t)}},function(t,e){var n={\"&\":\"&amp;\",'\"':\"&quot;\",\"'\":\"&apos;\",\"<\":\"&lt;\",\">\":\"&gt;\"};t.exports=function(t){return t&&t.replace?t.replace(/([&\"<>'])/g,(function(t,e){return n[e]})):t}},function(t,e,n){t.exports=i;var r=n(135).EventEmitter;function i(){r.call(this)}n(16)(i,r),i.Readable=n(136),i.Writable=n(530),i.Duplex=n(531),i.Transform=n(532),i.PassThrough=n(533),i.Stream=i,i.prototype.pipe=function(t,e){var n=this;function i(e){t.writable&&!1===t.write(e)&&n.pause&&n.pause()}function o(){n.readable&&n.resume&&n.resume()}n.on(\"data\",i),t.on(\"drain\",o),t._isStdio||e&&!1===e.end||(n.on(\"end\",s),n.on(\"close\",a));var u=!1;function s(){u||(u=!0,t.end())}function a(){u||(u=!0,\"function\"==typeof t.destroy&&t.destroy())}function c(t){if(f(),0===r.listenerCount(this,\"error\"))throw t}function f(){n.removeListener(\"data\",i),t.removeListener(\"drain\",o),n.removeListener(\"end\",s),n.removeListener(\"close\",a),n.removeListener(\"error\",c),t.removeListener(\"error\",c),n.removeListener(\"end\",f),n.removeListener(\"close\",f),t.removeListener(\"close\",f)}return n.on(\"error\",c),t.on(\"error\",c),n.on(\"end\",f),n.on(\"close\",f),t.on(\"close\",f),t.emit(\"pipe\",n),t}},function(t,e){},function(t,e,n){\"use strict\";var r=n(17).Buffer,i=n(526);t.exports=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,t),this.head=null,this.tail=null,this.length=0}return t.prototype.push=function(t){var e={data:t,next:null};this.length>0?this.tail.next=e:this.head=e,this.tail=e,++this.length},t.prototype.unshift=function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length},t.prototype.shift=function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},t.prototype.clear=function(){this.head=this.tail=null,this.length=0},t.prototype.join=function(t){if(0===this.length)return\"\";for(var e=this.head,n=\"\"+e.data;e=e.next;)n+=t+e.data;return n},t.prototype.concat=function(t){if(0===this.length)return r.alloc(0);if(1===this.length)return this.head.data;for(var e,n,i,o=r.allocUnsafe(t>>>0),u=this.head,s=0;u;)e=u.data,n=o,i=s,e.copy(n,i),s+=u.data.length,u=u.next;return o},t}(),i&&i.inspect&&i.inspect.custom&&(t.exports.prototype[i.inspect.custom]=function(){var t=i.inspect({length:this.length});return this.constructor.name+\" \"+t})},function(t,e){},function(t,e,n){(function(t,e){!function(t,n){\"use strict\";if(!t.setImmediate){var r,i,o,u,s,a=1,c={},f=!1,l=t.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(t);p=p&&p.setTimeout?p:t,\"[object process]\"==={}.toString.call(t.process)?r=function(t){e.nextTick((function(){d(t)}))}:!function(){if(t.postMessage&&!t.importScripts){var e=!0,n=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage(\"\",\"*\"),t.onmessage=n,e}}()?t.MessageChannel?((o=new MessageChannel).port1.onmessage=function(t){d(t.data)},r=function(t){o.port2.postMessage(t)}):l&&\"onreadystatechange\"in l.createElement(\"script\")?(i=l.documentElement,r=function(t){var e=l.createElement(\"script\");e.onreadystatechange=function(){d(t),e.onreadystatechange=null,i.removeChild(e),e=null},i.appendChild(e)}):r=function(t){setTimeout(d,0,t)}:(u=\"setImmediate$\"+Math.random()+\"$\",s=function(e){e.source===t&&\"string\"==typeof e.data&&0===e.data.indexOf(u)&&d(+e.data.slice(u.length))},t.addEventListener?t.addEventListener(\"message\",s,!1):t.attachEvent(\"onmessage\",s),r=function(e){t.postMessage(u+e,\"*\")}),p.setImmediate=function(t){\"function\"!=typeof t&&(t=new Function(\"\"+t));for(var e=new Array(arguments.length-1),n=0;n<e.length;n++)e[n]=arguments[n+1];var i={callback:t,args:e};return c[a]=i,r(a),a++},p.clearImmediate=h}function h(t){delete c[t]}function d(t){if(f)setTimeout(d,0,t);else{var e=c[t];if(e){f=!0;try{!function(t){var e=t.callback,n=t.args;switch(n.length){case 0:e();break;case 1:e(n[0]);break;case 2:e(n[0],n[1]);break;case 3:e(n[0],n[1],n[2]);break;default:e.apply(void 0,n)}}(e)}finally{h(t),f=!1}}}}}(\"undefined\"==typeof self?void 0===t?this:t:self)}).call(this,n(20),n(34))},function(t,e,n){(function(e){function n(t){try{if(!e.localStorage)return!1}catch(t){return!1}var n=e.localStorage[t];return null!=n&&\"true\"===String(n).toLowerCase()}t.exports=function(t,e){if(n(\"noDeprecation\"))return t;var r=!1;return function(){if(!r){if(n(\"throwDeprecation\"))throw new Error(e);n(\"traceDeprecation\")?console.trace(e):console.warn(e),r=!0}return t.apply(this,arguments)}}}).call(this,n(20))},function(t,e,n){\"use strict\";t.exports=o;var r=n(206),i=n(69);function o(t){if(!(this instanceof o))return new o(t);r.call(this,t)}i.inherits=n(16),i.inherits(o,r),o.prototype._transform=function(t,e,n){n(null,t)}},function(t,e,n){t.exports=n(137)},function(t,e,n){t.exports=n(35)},function(t,e,n){t.exports=n(136).Transform},function(t,e,n){t.exports=n(136).PassThrough},function(t,e,n){\"use strict\";t.exports=function(){}},function(t,e,n){\"use strict\";var r=n(536),i=Math.abs,o=Math.floor;t.exports=function(t){return isNaN(t)?0:0!==(t=Number(t))&&isFinite(t)?r(t)*o(i(t)):t}},function(t,e,n){\"use strict\";t.exports=n(537)()?Math.sign:n(538)},function(t,e,n){\"use strict\";t.exports=function(){var t=Math.sign;return\"function\"==typeof t&&(1===t(10)&&-1===t(-20))}},function(t,e,n){\"use strict\";t.exports=function(t){return t=Number(t),isNaN(t)||0===t?t:t>0?1:-1}},function(t,e,n){\"use strict\";var r=n(31),i=n(96),o=n(38),u=n(541),s=n(208);t.exports=function t(e){var n,a,c;if(r(e),(n=Object(arguments[1])).async&&n.promise)throw new Error(\"Options 'async' and 'promise' cannot be used together\");return hasOwnProperty.call(e,\"__memoized__\")&&!n.force?e:(a=s(n.length,e.length,n.async&&o.async),c=u(e,a,n),i(o,(function(t,e){n[e]&&t(n[e],c,n)})),t.__profiler__&&t.__profiler__(c),c.updateEnv(),c.memoized)}},function(t,e,n){\"use strict\";var r=n(31),i=n(47),o=Function.prototype.bind,u=Function.prototype.call,s=Object.keys,a=Object.prototype.propertyIsEnumerable;t.exports=function(t,e){return function(n,c){var f,l=arguments[2],p=arguments[3];return n=Object(i(n)),r(c),f=s(n),p&&f.sort(\"function\"==typeof p?o.call(p,n):void 0),\"function\"!=typeof t&&(t=f[t]),u.call(t,f,(function(t,r){return a.call(n,t)?u.call(c,l,n[t],t,n,r):e}))}}},function(t,e,n){\"use strict\";var r=n(542),i=n(210),o=n(39),u=n(556).methods,s=n(557),a=n(573),c=Function.prototype.apply,f=Function.prototype.call,l=Object.create,p=Object.defineProperties,h=u.on,d=u.emit;t.exports=function(t,e,n){var u,y,v,g,w,M,m,_,L,b,x,j,N,S,D,I=l(null);return y=!1!==e?e:isNaN(t.length)?1:t.length,n.normalizer&&(b=a(n.normalizer),v=b.get,g=b.set,w=b.delete,M=b.clear),null!=n.resolvers&&(D=s(n.resolvers)),S=v?i((function(e){var n,i,o=arguments;if(D&&(o=D(o)),null!==(n=v(o))&&hasOwnProperty.call(I,n))return x&&u.emit(\"get\",n,o,this),I[n];if(i=1===o.length?f.call(t,this,o[0]):c.call(t,this,o),null===n){if(null!==(n=v(o)))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");n=g(o)}else if(hasOwnProperty.call(I,n))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");return I[n]=i,j&&u.emit(\"set\",n,null,i),i}),y):0===e?function(){var e;if(hasOwnProperty.call(I,\"data\"))return x&&u.emit(\"get\",\"data\",arguments,this),I.data;if(e=arguments.length?c.call(t,this,arguments):f.call(t,this),hasOwnProperty.call(I,\"data\"))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");return I.data=e,j&&u.emit(\"set\",\"data\",null,e),e}:function(e){var n,i,o=arguments;if(D&&(o=D(arguments)),i=String(o[0]),hasOwnProperty.call(I,i))return x&&u.emit(\"get\",i,o,this),I[i];if(n=1===o.length?f.call(t,this,o[0]):c.call(t,this,o),hasOwnProperty.call(I,i))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");return I[i]=n,j&&u.emit(\"set\",i,null,n),n},u={original:t,memoized:S,profileName:n.profileName,get:function(t){return D&&(t=D(t)),v?v(t):String(t[0])},has:function(t){return hasOwnProperty.call(I,t)},delete:function(t){var e;hasOwnProperty.call(I,t)&&(w&&w(t),e=I[t],delete I[t],N&&u.emit(\"delete\",t,e))},clear:function(){var t=I;M&&M(),I=l(null),u.emit(\"clear\",t)},on:function(t,e){return\"get\"===t?x=!0:\"set\"===t?j=!0:\"delete\"===t&&(N=!0),h.call(this,t,e)},emit:d,updateEnv:function(){t=u.original}},m=v?i((function(t){var e,n=arguments;D&&(n=D(n)),null!==(e=v(n))&&u.delete(e)}),y):0===e?function(){return u.delete(\"data\")}:function(t){return D&&(t=D(arguments)[0]),u.delete(t)},_=i((function(){var t,n=arguments;return 0===e?I.data:(D&&(n=D(n)),t=v?v(n):String(n[0]),I[t])})),L=i((function(){var t,n=arguments;return 0===e?u.has(\"data\"):(D&&(n=D(n)),null!==(t=v?v(n):String(n[0]))&&u.has(t))})),p(S,{__memoized__:o(!0),delete:o(m),clear:o(u.clear),_get:o(_),_has:o(L)}),u}},function(t,e,n){\"use strict\";var r=n(209),i=n(548),o=n(36),u=Error.captureStackTrace;t.exports=function(e){var n=new Error(e),s=arguments[1],a=arguments[2];return o(a)||i(s)&&(a=s,s=null),o(a)&&r(n,a),o(s)&&(n.code=s),u&&u(n,t.exports),n}},function(t,e,n){\"use strict\";t.exports=function(){var t,e=Object.assign;return\"function\"==typeof e&&(e(t={foo:\"raz\"},{bar:\"dwa\"},{trzy:\"trzy\"}),t.foo+t.bar+t.trzy===\"razdwatrzy\")}},function(t,e,n){\"use strict\";var r=n(545),i=n(47),o=Math.max;t.exports=function(t,e){var n,u,s,a=o(arguments.length,2);for(t=Object(i(t)),s=function(r){try{t[r]=e[r]}catch(t){n||(n=t)}},u=1;u<a;++u)r(e=arguments[u]).forEach(s);if(void 0!==n)throw n;return t}},function(t,e,n){\"use strict\";t.exports=n(546)()?Object.keys:n(547)},function(t,e,n){\"use strict\";t.exports=function(){try{return Object.keys(\"primitive\"),!0}catch(t){return!1}}},function(t,e,n){\"use strict\";var r=n(36),i=Object.keys;t.exports=function(t){return i(r(t)?Object(t):t)}},function(t,e,n){\"use strict\";var r=n(36),i={function:!0,object:!0};t.exports=function(t){return r(t)&&i[typeof t]||!1}},function(t,e,n){\"use strict\";var r=n(550),i=/^\\s*class[\\s{/}]/,o=Function.prototype.toString;t.exports=function(t){return!!r(t)&&!i.test(o.call(t))}},function(t,e,n){\"use strict\";var r=n(551);t.exports=function(t){if(\"function\"!=typeof t)return!1;if(!hasOwnProperty.call(t,\"length\"))return!1;try{if(\"number\"!=typeof t.length)return!1;if(\"function\"!=typeof t.call)return!1;if(\"function\"!=typeof t.apply)return!1}catch(t){return!1}return!r(t)}},function(t,e,n){\"use strict\";var r=n(552);t.exports=function(t){if(!r(t))return!1;try{return!!t.constructor&&t.constructor.prototype===t}catch(t){return!1}}},function(t,e,n){\"use strict\";var r=n(212),i={object:!0,function:!0,undefined:!0};t.exports=function(t){return!!r(t)&&hasOwnProperty.call(i,typeof t)}},function(t,e,n){\"use strict\";t.exports=n(554)()?String.prototype.contains:n(555)},function(t,e,n){\"use strict\";var r=\"razdwatrzy\";t.exports=function(){return\"function\"==typeof r.contains&&(!0===r.contains(\"dwa\")&&!1===r.contains(\"foo\"))}},function(t,e,n){\"use strict\";var r=String.prototype.indexOf;t.exports=function(t){return r.call(this,t,arguments[1])>-1}},function(t,e,n){\"use strict\";var r,i,o,u,s,a,c,f=n(39),l=n(31),p=Function.prototype.apply,h=Function.prototype.call,d=Object.create,y=Object.defineProperty,v=Object.defineProperties,g=Object.prototype.hasOwnProperty,w={configurable:!0,enumerable:!1,writable:!0};i=function(t,e){var n,i;return l(e),i=this,r.call(this,t,n=function(){o.call(i,t,n),p.call(e,this,arguments)}),n.__eeOnceListener__=e,this},s={on:r=function(t,e){var n;return l(e),g.call(this,\"__ee__\")?n=this.__ee__:(n=w.value=d(null),y(this,\"__ee__\",w),w.value=null),n[t]?\"object\"==typeof n[t]?n[t].push(e):n[t]=[n[t],e]:n[t]=e,this},once:i,off:o=function(t,e){var n,r,i,o;if(l(e),!g.call(this,\"__ee__\"))return this;if(!(n=this.__ee__)[t])return this;if(\"object\"==typeof(r=n[t]))for(o=0;i=r[o];++o)i!==e&&i.__eeOnceListener__!==e||(2===r.length?n[t]=r[o?0:1]:r.splice(o,1));else r!==e&&r.__eeOnceListener__!==e||delete n[t];return this},emit:u=function(t){var e,n,r,i,o;if(g.call(this,\"__ee__\")&&(i=this.__ee__[t]))if(\"object\"==typeof i){for(n=arguments.length,o=new Array(n-1),e=1;e<n;++e)o[e-1]=arguments[e];for(i=i.slice(),e=0;r=i[e];++e)p.call(r,this,o)}else switch(arguments.length){case 1:h.call(i,this);break;case 2:h.call(i,this,arguments[1]);break;case 3:h.call(i,this,arguments[1],arguments[2]);break;default:for(n=arguments.length,o=new Array(n-1),e=1;e<n;++e)o[e-1]=arguments[e];p.call(i,this,o)}}},a={on:f(r),once:f(i),off:f(o),emit:f(u)},c=v({},a),t.exports=e=function(t){return null==t?d(c):v(Object(t),a)},e.methods=s},function(t,e,n){\"use strict\";var r,i=n(558),o=n(36),u=n(31),s=Array.prototype.slice;r=function(t){return this.map((function(e,n){return e?e(t[n]):t[n]})).concat(s.call(t,this.length))},t.exports=function(t){return(t=i(t)).forEach((function(t){o(t)&&u(t)})),r.bind(t)}},function(t,e,n){\"use strict\";var r=n(138),i=Array.isArray;t.exports=function(t){return i(t)?t:r(t)}},function(t,e,n){\"use strict\";t.exports=function(){var t,e,n=Array.from;return\"function\"==typeof n&&(e=n(t=[\"raz\",\"dwa\"]),Boolean(e&&e!==t&&\"dwa\"===e[1]))}},function(t,e,n){\"use strict\";var r=n(561).iterator,i=n(570),o=n(571),u=n(37),s=n(31),a=n(47),c=n(36),f=n(572),l=Array.isArray,p=Function.prototype.call,h={configurable:!0,enumerable:!0,writable:!0,value:null},d=Object.defineProperty;t.exports=function(t){var e,n,y,v,g,w,M,m,_,L,b=arguments[1],x=arguments[2];if(t=Object(a(t)),c(b)&&s(b),this&&this!==Array&&o(this))e=this;else{if(!b){if(i(t))return 1!==(g=t.length)?Array.apply(null,t):((v=new Array(1))[0]=t[0],v);if(l(t)){for(v=new Array(g=t.length),n=0;n<g;++n)v[n]=t[n];return v}}v=[]}if(!l(t))if(void 0!==(_=t[r])){for(M=s(_).call(t),e&&(v=new e),m=M.next(),n=0;!m.done;)L=b?p.call(b,x,m.value,n):m.value,e?(h.value=L,d(v,n,h)):v[n]=L,m=M.next(),++n;g=n}else if(f(t)){for(g=t.length,e&&(v=new e),n=0,y=0;n<g;++n)L=t[n],n+1<g&&(w=L.charCodeAt(0))>=55296&&w<=56319&&(L+=t[++n]),L=b?p.call(b,x,L,y):L,e?(h.value=L,d(v,y,h)):v[y]=L,++y;g=y}if(void 0===g)for(g=u(t.length),e&&(v=new e(g)),n=0;n<g;++n)L=b?p.call(b,x,t[n],n):t[n],e?(h.value=L,d(v,n,h)):v[n]=L;return e&&(h.value=null,v.length=g),v}},function(t,e,n){\"use strict\";t.exports=n(562)()?n(97).Symbol:n(565)},function(t,e,n){\"use strict\";var r=n(97),i={object:!0,symbol:!0};t.exports=function(){var t,e=r.Symbol;if(\"function\"!=typeof e)return!1;t=e(\"test symbol\");try{String(t)}catch(t){return!1}return!!i[typeof e.iterator]&&(!!i[typeof e.toPrimitive]&&!!i[typeof e.toStringTag])}},function(t,e,n){\"use strict\";t.exports=function(){return\"object\"==typeof globalThis&&(!!globalThis&&globalThis.Array===Array)}},function(t,e){var n=function(){if(\"object\"==typeof self&&self)return self;if(\"object\"==typeof window&&window)return window;throw new Error(\"Unable to resolve global `this`\")};t.exports=function(){if(this)return this;try{Object.defineProperty(Object.prototype,\"__global__\",{get:function(){return this},configurable:!0})}catch(t){return n()}try{return __global__||n()}finally{delete Object.prototype.__global__}}()},function(t,e,n){\"use strict\";var r,i,o,u=n(39),s=n(213),a=n(97).Symbol,c=n(567),f=n(568),l=n(569),p=Object.create,h=Object.defineProperties,d=Object.defineProperty;if(\"function\"==typeof a)try{String(a()),o=!0}catch(t){}else a=null;i=function(t){if(this instanceof i)throw new TypeError(\"Symbol is not a constructor\");return r(t)},t.exports=r=function t(e){var n;if(this instanceof t)throw new TypeError(\"Symbol is not a constructor\");return o?a(e):(n=p(i.prototype),e=void 0===e?\"\":String(e),h(n,{__description__:u(\"\",e),__name__:u(\"\",c(e))}))},f(r),l(r),h(i.prototype,{constructor:u(r),toString:u(\"\",(function(){return this.__name__}))}),h(r.prototype,{toString:u((function(){return\"Symbol (\"+s(this).__description__+\")\"})),valueOf:u((function(){return s(this)}))}),d(r.prototype,r.toPrimitive,u(\"\",(function(){var t=s(this);return\"symbol\"==typeof t?t:t.toString()}))),d(r.prototype,r.toStringTag,u(\"c\",\"Symbol\")),d(i.prototype,r.toStringTag,u(\"c\",r.prototype[r.toStringTag])),d(i.prototype,r.toPrimitive,u(\"c\",r.prototype[r.toPrimitive]))},function(t,e,n){\"use strict\";t.exports=function(t){return!!t&&(\"symbol\"==typeof t||!!t.constructor&&(\"Symbol\"===t.constructor.name&&\"Symbol\"===t[t.constructor.toStringTag]))}},function(t,e,n){\"use strict\";var r=n(39),i=Object.create,o=Object.defineProperty,u=Object.prototype,s=i(null);t.exports=function(t){for(var e,n,i=0;s[t+(i||\"\")];)++i;return s[t+=i||\"\"]=!0,o(u,e=\"@@\"+t,r.gs(null,(function(t){n||(n=!0,o(this,e,r(t)),n=!1)}))),e}},function(t,e,n){\"use strict\";var r=n(39),i=n(97).Symbol;t.exports=function(t){return Object.defineProperties(t,{hasInstance:r(\"\",i&&i.hasInstance||t(\"hasInstance\")),isConcatSpreadable:r(\"\",i&&i.isConcatSpreadable||t(\"isConcatSpreadable\")),iterator:r(\"\",i&&i.iterator||t(\"iterator\")),match:r(\"\",i&&i.match||t(\"match\")),replace:r(\"\",i&&i.replace||t(\"replace\")),search:r(\"\",i&&i.search||t(\"search\")),species:r(\"\",i&&i.species||t(\"species\")),split:r(\"\",i&&i.split||t(\"split\")),toPrimitive:r(\"\",i&&i.toPrimitive||t(\"toPrimitive\")),toStringTag:r(\"\",i&&i.toStringTag||t(\"toStringTag\")),unscopables:r(\"\",i&&i.unscopables||t(\"unscopables\"))})}},function(t,e,n){\"use strict\";var r=n(39),i=n(213),o=Object.create(null);t.exports=function(t){return Object.defineProperties(t,{for:r((function(e){return o[e]?o[e]:o[e]=t(String(e))})),keyFor:r((function(t){var e;for(e in i(t),o)if(o[e]===t)return e}))})}},function(t,e,n){\"use strict\";var r=Object.prototype.toString,i=r.call(function(){return arguments}());t.exports=function(t){return r.call(t)===i}},function(t,e,n){\"use strict\";var r=Object.prototype.toString,i=RegExp.prototype.test.bind(/^[object [A-Za-z0-9]*Function]$/);t.exports=function(t){return\"function\"==typeof t&&i(r.call(t))}},function(t,e,n){\"use strict\";var r=Object.prototype.toString,i=r.call(\"\");t.exports=function(t){return\"string\"==typeof t||t&&\"object\"==typeof t&&(t instanceof String||r.call(t)===i)||!1}},function(t,e,n){\"use strict\";var r=n(31);t.exports=function(t){var e;return\"function\"==typeof t?{set:t,get:t}:(e={get:r(t.get)},void 0!==t.set?(e.set=r(t.set),t.delete&&(e.delete=r(t.delete)),t.clear&&(e.clear=r(t.clear)),e):(e.set=e.get,e))}},function(t,e,n){\"use strict\";t.exports=function(t){var e,n,r=t.length;if(!r)return\"\u0002\";for(e=String(t[n=0]);--r;)e+=\"\u0001\"+t[++n];return e}},function(t,e,n){\"use strict\";t.exports=function(t){return t?function(e){for(var n=String(e[0]),r=0,i=t;--i;)n+=\"\u0001\"+e[++r];return n}:function(){return\"\"}}},function(t,e,n){\"use strict\";var r=n(139),i=Object.create;t.exports=function(){var t=0,e=[],n=i(null);return{get:function(t){var n,i=0,o=e,u=t.length;if(0===u)return o[u]||null;if(o=o[u]){for(;i<u-1;){if(-1===(n=r.call(o[0],t[i])))return null;o=o[1][n],++i}return-1===(n=r.call(o[0],t[i]))?null:o[1][n]||null}return null},set:function(i){var o,u=0,s=e,a=i.length;if(0===a)s[a]=++t;else{for(s[a]||(s[a]=[[],[]]),s=s[a];u<a-1;)-1===(o=r.call(s[0],i[u]))&&(o=s[0].push(i[u])-1,s[1].push([[],[]])),s=s[1][o],++u;-1===(o=r.call(s[0],i[u]))&&(o=s[0].push(i[u])-1),s[1][o]=++t}return n[t]=i,t},delete:function(t){var i,o=0,u=e,s=n[t],a=s.length,c=[];if(0===a)delete u[a];else if(u=u[a]){for(;o<a-1;){if(-1===(i=r.call(u[0],s[o])))return;c.push(u,i),u=u[1][i],++o}if(-1===(i=r.call(u[0],s[o])))return;for(t=u[1][i],u[0].splice(i,1),u[1].splice(i,1);!u[0].length&&c.length;)i=c.pop(),(u=c.pop())[0].splice(i,1),u[1].splice(i,1)}delete n[t]},clear:function(){e=[],n=i(null)}}}},function(t,e,n){\"use strict\";t.exports=n(578)()?Number.isNaN:n(579)},function(t,e,n){\"use strict\";t.exports=function(){var t=Number.isNaN;return\"function\"==typeof t&&(!t({})&&t(NaN)&&!t(34))}},function(t,e,n){\"use strict\";t.exports=function(t){return t!=t}},function(t,e,n){\"use strict\";var r=n(139);t.exports=function(){var t=0,e=[],n=[];return{get:function(t){var i=r.call(e,t[0]);return-1===i?null:n[i]},set:function(r){return e.push(r[0]),n.push(++t),t},delete:function(t){var i=r.call(n,t);-1!==i&&(e.splice(i,1),n.splice(i,1))},clear:function(){e=[],n=[]}}}},function(t,e,n){\"use strict\";var r=n(139),i=Object.create;t.exports=function(t){var e=0,n=[[],[]],o=i(null);return{get:function(e){for(var i,o=0,u=n;o<t-1;){if(-1===(i=r.call(u[0],e[o])))return null;u=u[1][i],++o}return-1===(i=r.call(u[0],e[o]))?null:u[1][i]||null},set:function(i){for(var u,s=0,a=n;s<t-1;)-1===(u=r.call(a[0],i[s]))&&(u=a[0].push(i[s])-1,a[1].push([[],[]])),a=a[1][u],++s;return-1===(u=r.call(a[0],i[s]))&&(u=a[0].push(i[s])-1),a[1][u]=++e,o[e]=i,e},delete:function(e){for(var i,u=0,s=n,a=[],c=o[e];u<t-1;){if(-1===(i=r.call(s[0],c[u])))return;a.push(s,i),s=s[1][i],++u}if(-1!==(i=r.call(s[0],c[u]))){for(e=s[1][i],s[0].splice(i,1),s[1].splice(i,1);!s[0].length&&a.length;)i=a.pop(),(s=a.pop())[0].splice(i,1),s[1].splice(i,1);delete o[e]}},clear:function(){n=[[],[]],o=i(null)}}}},function(t,e,n){\"use strict\";var r=n(138),i=n(214),o=n(211),u=n(210),s=n(140),a=Array.prototype.slice,c=Function.prototype.apply,f=Object.create;n(38).async=function(t,e){var n,l,p,h=f(null),d=f(null),y=e.memoized,v=e.original;e.memoized=u((function(t){var e=arguments,r=e[e.length-1];return\"function\"==typeof r&&(n=r,e=a.call(e,0,-1)),y.apply(l=this,p=e)}),y);try{o(e.memoized,y)}catch(t){}e.on(\"get\",(function(t){var r,i,o;if(n){if(h[t])return\"function\"==typeof h[t]?h[t]=[h[t],n]:h[t].push(n),void(n=null);r=n,i=l,o=p,n=l=p=null,s((function(){var u;hasOwnProperty.call(d,t)?(u=d[t],e.emit(\"getasync\",t,o,i),c.call(r,u.context,u.args)):(n=r,l=i,p=o,y.apply(i,o))}))}})),e.original=function(){var t,i,o,u;return n?(t=r(arguments),i=function t(n){var i,o,a=t.id;if(null!=a){if(delete t.id,i=h[a],delete h[a],i)return o=r(arguments),e.has(a)&&(n?e.delete(a):(d[a]={context:this,args:o},e.emit(\"setasync\",a,\"function\"==typeof i?1:i.length))),\"function\"==typeof i?u=c.call(i,this,o):i.forEach((function(t){u=c.call(t,this,o)}),this),u}else s(c.bind(t,this,arguments))},o=n,n=l=p=null,t.push(i),u=c.call(v,this,t),i.cb=o,n=i,u):c.call(v,this,arguments)},e.on(\"set\",(function(t){n?(h[t]?\"function\"==typeof h[t]?h[t]=[h[t],n.cb]:h[t].push(n.cb):h[t]=n.cb,delete n.cb,n.id=t,n=null):e.delete(t)})),e.on(\"delete\",(function(t){var n;hasOwnProperty.call(h,t)||d[t]&&(n=d[t],delete d[t],e.emit(\"deleteasync\",t,a.call(n.args,1)))})),e.on(\"clear\",(function(){var t=d;d=f(null),e.emit(\"clearasync\",i(t,(function(t){return a.call(t.args,1)})))}))}},function(t,e,n){\"use strict\";var r=n(214),i=n(584),o=n(585),u=n(587),s=n(216),a=n(140),c=Object.create,f=i(\"then\",\"then:finally\",\"done\",\"done:finally\");n(38).promise=function(t,e){var n=c(null),i=c(null),l=c(null);if(!0===t)t=null;else if(t=o(t),!f[t])throw new TypeError(\"'\"+u(t)+\"' is not valid promise mode\");e.on(\"set\",(function(r,o,u){var c=!1;if(!s(u))return i[r]=u,void e.emit(\"setasync\",r,1);n[r]=1,l[r]=u;var f=function(t){var o=n[r];if(c)throw new Error(\"Memoizee error: Detected unordered then|done & finally resolution, which in turn makes proper detection of success/failure impossible (when in 'done:finally' mode)\\nConsider to rely on 'then' or 'done' mode instead.\");o&&(delete n[r],i[r]=t,e.emit(\"setasync\",r,o))},p=function(){c=!0,n[r]&&(delete n[r],delete l[r],e.delete(r))},h=t;if(h||(h=\"then\"),\"then\"===h){var d=function(){a(p)};\"function\"==typeof(u=u.then((function(t){a(f.bind(this,t))}),d)).finally&&u.finally(d)}else if(\"done\"===h){if(\"function\"!=typeof u.done)throw new Error(\"Memoizee error: Retrieved promise does not implement 'done' in 'done' mode\");u.done(f,p)}else if(\"done:finally\"===h){if(\"function\"!=typeof u.done)throw new Error(\"Memoizee error: Retrieved promise does not implement 'done' in 'done:finally' mode\");if(\"function\"!=typeof u.finally)throw new Error(\"Memoizee error: Retrieved promise does not implement 'finally' in 'done:finally' mode\");u.done(f),u.finally(p)}})),e.on(\"get\",(function(t,r,i){var o;if(n[t])++n[t];else{o=l[t];var u=function(){e.emit(\"getasync\",t,r,i)};s(o)?\"function\"==typeof o.done?o.done(u):o.then((function(){a(u)})):u()}})),e.on(\"delete\",(function(t){if(delete l[t],n[t])delete n[t];else if(hasOwnProperty.call(i,t)){var r=i[t];delete i[t],e.emit(\"deleteasync\",t,[r])}})),e.on(\"clear\",(function(){var t=i;i=c(null),n=c(null),l=c(null),e.emit(\"clearasync\",r(t,(function(t){return[t]})))}))}},function(t,e,n){\"use strict\";var r=Array.prototype.forEach,i=Object.create;t.exports=function(t){var e=i(null);return r.call(arguments,(function(t){e[t]=!0})),e}},function(t,e,n){\"use strict\";var r=n(47),i=n(586);t.exports=function(t){return i(r(t))}},function(t,e,n){\"use strict\";var r=n(215);t.exports=function(t){try{return t&&r(t.toString)?t.toString():String(t)}catch(t){throw new TypeError(\"Passed argument cannot be stringifed\")}}},function(t,e,n){\"use strict\";var r=n(588),i=/[\\n\\r\\u2028\\u2029]/g;t.exports=function(t){var e=r(t);return e.length>100&&(e=e.slice(0,99)+\"…\"),e=e.replace(i,(function(t){return JSON.stringify(t).slice(1,-1)}))}},function(t,e,n){\"use strict\";var r=n(215);t.exports=function(t){try{return t&&r(t.toString)?t.toString():String(t)}catch(t){return\"<Non-coercible to string value>\"}}},function(t,e,n){\"use strict\";var r=n(31),i=n(96),o=n(38),u=Function.prototype.apply;o.dispose=function(t,e,n){var s;if(r(t),n.async&&o.async||n.promise&&o.promise)return e.on(\"deleteasync\",s=function(e,n){u.call(t,null,n)}),void e.on(\"clearasync\",(function(t){i(t,(function(t,e){s(e,t)}))}));e.on(\"delete\",s=function(e,n){t(n)}),e.on(\"clear\",(function(t){i(t,(function(t,e){s(e,t)}))}))}},function(t,e,n){\"use strict\";var r=n(138),i=n(96),o=n(140),u=n(216),s=n(591),a=n(38),c=Function.prototype,f=Math.max,l=Math.min,p=Object.create;a.maxAge=function(t,e,n){var h,d,y,v;(t=s(t))&&(h=p(null),d=n.async&&a.async||n.promise&&a.promise?\"async\":\"\",e.on(\"set\"+d,(function(n){h[n]=setTimeout((function(){e.delete(n)}),t),\"function\"==typeof h[n].unref&&h[n].unref(),v&&(v[n]&&\"nextTick\"!==v[n]&&clearTimeout(v[n]),v[n]=setTimeout((function(){delete v[n]}),y),\"function\"==typeof v[n].unref&&v[n].unref())})),e.on(\"delete\"+d,(function(t){clearTimeout(h[t]),delete h[t],v&&(\"nextTick\"!==v[t]&&clearTimeout(v[t]),delete v[t])})),n.preFetch&&(y=!0===n.preFetch||isNaN(n.preFetch)?.333:f(l(Number(n.preFetch),1),0))&&(v={},y=(1-y)*t,e.on(\"get\"+d,(function(t,i,s){v[t]||(v[t]=\"nextTick\",o((function(){var o;\"nextTick\"===v[t]&&(delete v[t],e.delete(t),n.async&&(i=r(i)).push(c),o=e.memoized.apply(s,i),n.promise&&u(o)&&(\"function\"==typeof o.done?o.done(c,c):o.then(c,c)))})))}))),e.on(\"clear\"+d,(function(){i(h,(function(t){clearTimeout(t)})),h={},v&&(i(v,(function(t){\"nextTick\"!==t&&clearTimeout(t)})),v={})})))}},function(t,e,n){\"use strict\";var r=n(37),i=n(592);t.exports=function(t){if((t=r(t))>i)throw new TypeError(t+\" exceeds maximum possible timeout\");return t}},function(t,e,n){\"use strict\";t.exports=2147483647},function(t,e,n){\"use strict\";var r=n(37),i=n(594),o=n(38);o.max=function(t,e,n){var u,s,a;(t=r(t))&&(s=i(t),u=n.async&&o.async||n.promise&&o.promise?\"async\":\"\",e.on(\"set\"+u,a=function(t){void 0!==(t=s.hit(t))&&e.delete(t)}),e.on(\"get\"+u,a),e.on(\"delete\"+u,s.delete),e.on(\"clear\"+u,s.clear))}},function(t,e,n){\"use strict\";var r=n(37),i=Object.create,o=Object.prototype.hasOwnProperty;t.exports=function(t){var e,n=0,u=1,s=i(null),a=i(null),c=0;return t=r(t),{hit:function(r){var i=a[r],f=++c;if(s[f]=r,a[r]=f,!i){if(++n<=t)return;return r=s[u],e(r),r}if(delete s[i],u===i)for(;!o.call(s,++u);)continue},delete:e=function(t){var e=a[t];if(e&&(delete s[e],delete a[t],--n,u===e)){if(!n)return c=0,void(u=1);for(;!o.call(s,++u);)continue}},clear:function(){n=0,u=1,s=i(null),a=i(null),c=0}}}},function(t,e,n){\"use strict\";var r=n(39),i=n(38),o=Object.create,u=Object.defineProperties;i.refCounter=function(t,e,n){var s,a;s=o(null),a=n.async&&i.async||n.promise&&i.promise?\"async\":\"\",e.on(\"set\"+a,(function(t,e){s[t]=e||1})),e.on(\"get\"+a,(function(t){++s[t]})),e.on(\"delete\"+a,(function(t){delete s[t]})),e.on(\"clear\"+a,(function(){s={}})),u(e.memoized,{deleteRef:r((function(){var t=e.get(arguments);return null===t?null:s[t]?!--s[t]&&(e.delete(t),!0):null})),getRefCount:r((function(){var t=e.get(arguments);return null===t?0:s[t]?s[t]:0}))})}},function(t,e,n){var r=n(16),i=n(48),o=n(17).Buffer,u=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function a(){this.init(),this._w=s,i.call(this,64,56)}function c(t){return t<<30|t>>>2}function f(t,e,n,r){return 0===t?e&n|~e&r:2===t?e&n|e&r|n&r:e^n^r}r(a,i),a.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},a.prototype._update=function(t){for(var e,n=this._w,r=0|this._a,i=0|this._b,o=0|this._c,s=0|this._d,a=0|this._e,l=0;l<16;++l)n[l]=t.readInt32BE(4*l);for(;l<80;++l)n[l]=n[l-3]^n[l-8]^n[l-14]^n[l-16];for(var p=0;p<80;++p){var h=~~(p/20),d=0|((e=r)<<5|e>>>27)+f(h,i,o,s)+a+n[p]+u[h];a=s,s=o,o=c(i),i=r,r=d}this._a=r+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=s+this._d|0,this._e=a+this._e|0},a.prototype._hash=function(){var t=o.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},t.exports=a},function(t,e,n){var r=n(16),i=n(48),o=n(17).Buffer,u=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function a(){this.init(),this._w=s,i.call(this,64,56)}function c(t){return t<<5|t>>>27}function f(t){return t<<30|t>>>2}function l(t,e,n,r){return 0===t?e&n|~e&r:2===t?e&n|e&r|n&r:e^n^r}r(a,i),a.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},a.prototype._update=function(t){for(var e,n=this._w,r=0|this._a,i=0|this._b,o=0|this._c,s=0|this._d,a=0|this._e,p=0;p<16;++p)n[p]=t.readInt32BE(4*p);for(;p<80;++p)n[p]=(e=n[p-3]^n[p-8]^n[p-14]^n[p-16])<<1|e>>>31;for(var h=0;h<80;++h){var d=~~(h/20),y=c(r)+l(d,i,o,s)+a+n[h]+u[d]|0;a=s,s=o,o=f(i),i=r,r=y}this._a=r+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=s+this._d|0,this._e=a+this._e|0},a.prototype._hash=function(){var t=o.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},t.exports=a},function(t,e,n){var r=n(16),i=n(217),o=n(48),u=n(17).Buffer,s=new Array(64);function a(){this.init(),this._w=s,o.call(this,64,56)}r(a,i),a.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},a.prototype._hash=function(){var t=u.allocUnsafe(28);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t},t.exports=a},function(t,e,n){var r=n(16),i=n(218),o=n(48),u=n(17).Buffer,s=new Array(160);function a(){this.init(),this._w=s,o.call(this,128,112)}r(a,i),a.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},a.prototype._hash=function(){var t=u.allocUnsafe(48);function e(e,n,r){t.writeInt32BE(e,r),t.writeInt32BE(n,r+4)}return e(this._ah,this._al,0),e(this._bh,this._bl,8),e(this._ch,this._cl,16),e(this._dh,this._dl,24),e(this._eh,this._el,32),e(this._fh,this._fl,40),t},t.exports=a},function(t,e,n){\"use strict\";n.r(e);var r={};n.r(r),n.d(r,\"UPDATE_CONFIGS\",(function(){return C})),n.d(r,\"TOGGLE_CONFIGS\",(function(){return E})),n.d(r,\"update\",(function(){return z})),n.d(r,\"toggle\",(function(){return k})),n.d(r,\"loaded\",(function(){return U}));var i={};n.r(i),n.d(i,\"downloadConfig\",(function(){return P})),n.d(i,\"getConfigByUrl\",(function(){return R}));var o={};n.r(o),n.d(o,\"get\",(function(){return B}));var u=n(98),s=n.n(u),a=n(99),c=n.n(a),f=n(100),l=n.n(f),p=n(101),h=n.n(p),d=n(2),y=n.n(d),v=(n(176),function(t){l()(n,t);var e=h()(n);function n(){return s()(this,n),e.apply(this,arguments)}return c()(n,[{key:\"render\",value:function(){var t=this.props.getComponent,e=t(\"Container\"),n=t(\"Row\"),r=t(\"Col\"),i=t(\"Topbar\",!0),o=t(\"BaseLayout\",!0),u=t(\"onlineValidatorBadge\",!0);return y.a.createElement(e,{className:\"swagger-ui\"},i?y.a.createElement(i,null):null,y.a.createElement(o,null),y.a.createElement(n,null,y.a.createElement(r,null,y.a.createElement(u,null))))}}]),n}(y.a.Component)),g=n(26),w=n.n(g),M=n(14),m=n.n(M),_=n(3),L=n.n(_),b=n(9),x=n.n(b),j=n(11),N=n.n(j),S=n(219),D=n.n(S),I=n(12),A=function(t){l()(n,t);var e=h()(n);function n(t,r){var i;return s()(this,n),i=e.call(this,t,r),m()(w()(i),\"onUrlChange\",(function(t){var e=t.target.value;i.setState({url:e})})),m()(w()(i),\"loadSpec\",(function(t){i.flushAuthData(),i.props.specActions.updateUrl(t),i.props.specActions.download(t)})),m()(w()(i),\"onUrlSelect\",(function(t){var e=t.target.value||t.target.href;i.loadSpec(e),i.setSelectedUrl(e),t.preventDefault()})),m()(w()(i),\"downloadUrl\",(function(t){i.loadSpec(i.state.url),t.preventDefault()})),m()(w()(i),\"setSearch\",(function(t){var e,n,r=Object(I.e)();r[\"urls.primaryName\"]=t.name;var i,o=L()(e=L()(n=\"\".concat(window.location.protocol,\"//\")).call(n,window.location.host)).call(e,window.location.pathname);window&&window.history&&window.history.pushState&&window.history.replaceState(null,\"\",L()(i=\"\".concat(o,\"?\")).call(i,Object(I.f)(r)))})),m()(w()(i),\"setSelectedUrl\",(function(t){var e=i.props.getConfigs().urls||[];e&&e.length&&t&&x()(e).call(e,(function(e,n){e.url===t&&(i.setState({selectedIndex:n}),i.setSearch(e))}))})),m()(w()(i),\"onFilterChange\",(function(t){var e=t.target.value;i.props.layoutActions.updateFilter(e)})),i.state={url:t.specSelectors.url(),selectedIndex:0},i}return c()(n,[{key:\"componentWillReceiveProps\",value:function(t){this.setState({url:t.specSelectors.url()})}},{key:\"flushAuthData\",value:function(){this.props.getConfigs().persistAuthorization||this.props.authActions.restoreAuthorization({authorized:{}})}},{key:\"componentDidMount\",value:function(){var t=this,e=this.props.getConfigs(),n=e.urls||[];if(n&&n.length){var r=this.state.selectedIndex,i=e[\"urls.primaryName\"];i&&x()(n).call(n,(function(e,n){e.name===i&&(t.setState({selectedIndex:n}),r=n)})),this.loadSpec(n[r].url)}}},{key:\"render\",value:function(){var t=this.props,e=t.getComponent,n=t.specSelectors,r=t.getConfigs,i=e(\"Button\"),o=e(\"Link\"),u=\"loading\"===n.loadingStatus(),s=[\"download-url-input\"];\"failed\"===n.loadingStatus()&&s.push(\"failed\"),u&&s.push(\"loading\");var a=r().urls,c=[],f=null;if(a){var l=[];x()(a).call(a,(function(t,e){l.push(y.a.createElement(\"option\",{key:e,value:t.url},t.name))})),c.push(y.a.createElement(\"label\",{className:\"select-label\",htmlFor:\"select\"},y.a.createElement(\"span\",null,\"Select a definition\"),y.a.createElement(\"select\",{id:\"select\",disabled:u,onChange:this.onUrlSelect,value:a[this.state.selectedIndex].url},l)))}else f=this.downloadUrl,c.push(y.a.createElement(\"input\",{className:s.join(\" \"),type:\"text\",onChange:this.onUrlChange,value:this.state.url,disabled:u})),c.push(y.a.createElement(i,{className:\"download-url-button\",onClick:this.downloadUrl},\"Explore\"));return y.a.createElement(\"div\",{className:\"topbar\"},y.a.createElement(\"div\",{className:\"wrapper\"},y.a.createElement(\"div\",{className:\"topbar-wrapper\"},y.a.createElement(o,null,y.a.createElement(\"img\",{height:\"40\",src:D.a,alt:\"Swagger UI\"})),y.a.createElement(\"form\",{className:\"download-url-wrapper\",onSubmit:f},N()(c).call(c,(function(t,e){return Object(d.cloneElement)(t,{key:e})}))))))}}]),n}(y.a.Component),O=n(71),T=function(t,e){try{return O.a.load(t)}catch(t){return e&&e.errActions.newThrownErr(new Error(t)),{}}},C=\"configs_update\",E=\"configs_toggle\";function z(t,e){return{type:C,payload:m()({},t,e)}}function k(t){return{type:E,payload:t}}var Y,U=function(){return function(t){var e=t.getConfigs,n=t.authActions;if(e().persistAuthorization){var r=localStorage.getItem(\"authorized\");r&&n.restoreAuthorization({authorized:JSON.parse(r)})}}},P=function(t){return function(e){return(0,e.fn.fetch)(t)}},R=function(t,e){return function(n){var r=n.specActions;if(t)return r.downloadConfig(t).then(i,i);function i(n){n instanceof Error||n.status>=400?(r.updateLoadingStatus(\"failedConfig\"),r.updateLoadingStatus(\"failedConfig\"),r.updateUrl(\"\"),console.error(n.statusText+\" \"+t.url),e(null)):e(T(n.text))}}},Q=n(5),F=n.n(Q),B=function(t,e){return t.getIn(F()(e)?e:[e])},G=n(0),W=(Y={},m()(Y,C,(function(t,e){return t.merge(Object(G.fromJS)(e.payload))})),m()(Y,E,(function(t,e){var n=e.payload,r=t.get(n);return t.set(n,!r)})),Y),q={getLocalConfig:function(){return T('---\\nurl: \"https://petstore.swagger.io/v2/swagger.json\"\\ndom_id: \"#swagger-ui\"\\nvalidatorUrl: \"https://validator.swagger.io/validator\"\\n')}};e.default=[function(){return{components:{Topbar:A}}},function(){return{statePlugins:{spec:{actions:i,selectors:q},configs:{reducers:W,actions:r,selectors:o}}}},function(){return{components:{StandaloneLayout:v}}}]}]).default}));\n//# sourceMappingURL=swagger-ui-standalone-preset.js.map"
  },
  {
    "path": "assembly/assembly-swagger-war/src/main/webapp/swagger-ui.css",
    "content": ".swagger-ui{color:#3b4151;\n  /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */font-family:sans-serif}.swagger-ui html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}.swagger-ui body{margin:0}.swagger-ui article,.swagger-ui aside,.swagger-ui footer,.swagger-ui header,.swagger-ui nav,.swagger-ui section{display:block}.swagger-ui h1{font-size:2em;margin:.67em 0}.swagger-ui figcaption,.swagger-ui figure,.swagger-ui main{display:block}.swagger-ui figure{margin:1em 40px}.swagger-ui hr{box-sizing:content-box;height:0;overflow:visible}.swagger-ui pre{font-family:monospace,monospace;font-size:1em}.swagger-ui a{-webkit-text-decoration-skip:objects;background-color:transparent}.swagger-ui abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.swagger-ui b,.swagger-ui strong{font-weight:inherit;font-weight:bolder}.swagger-ui code,.swagger-ui kbd,.swagger-ui samp{font-family:monospace,monospace;font-size:1em}.swagger-ui dfn{font-style:italic}.swagger-ui mark{background-color:#ff0;color:#000}.swagger-ui small{font-size:80%}.swagger-ui sub,.swagger-ui sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.swagger-ui sub{bottom:-.25em}.swagger-ui sup{top:-.5em}.swagger-ui audio,.swagger-ui video{display:inline-block}.swagger-ui audio:not([controls]){display:none;height:0}.swagger-ui img{border-style:none}.swagger-ui svg:not(:root){overflow:hidden}.swagger-ui button,.swagger-ui input,.swagger-ui optgroup,.swagger-ui select,.swagger-ui textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}.swagger-ui button,.swagger-ui input{overflow:visible}.swagger-ui button,.swagger-ui select{text-transform:none}.swagger-ui [type=reset],.swagger-ui [type=submit],.swagger-ui button,.swagger-ui html [type=button]{-webkit-appearance:button}.swagger-ui [type=button]::-moz-focus-inner,.swagger-ui [type=reset]::-moz-focus-inner,.swagger-ui [type=submit]::-moz-focus-inner,.swagger-ui button::-moz-focus-inner{border-style:none;padding:0}.swagger-ui [type=button]:-moz-focusring,.swagger-ui [type=reset]:-moz-focusring,.swagger-ui [type=submit]:-moz-focusring,.swagger-ui button:-moz-focusring{outline:1px dotted ButtonText}.swagger-ui fieldset{padding:.35em .75em .625em}.swagger-ui legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.swagger-ui progress{display:inline-block;vertical-align:baseline}.swagger-ui textarea{overflow:auto}.swagger-ui [type=checkbox],.swagger-ui [type=radio]{box-sizing:border-box;padding:0}.swagger-ui [type=number]::-webkit-inner-spin-button,.swagger-ui [type=number]::-webkit-outer-spin-button{height:auto}.swagger-ui [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.swagger-ui [type=search]::-webkit-search-cancel-button,.swagger-ui [type=search]::-webkit-search-decoration{-webkit-appearance:none}.swagger-ui ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.swagger-ui details,.swagger-ui menu{display:block}.swagger-ui summary{display:list-item}.swagger-ui canvas{display:inline-block}.swagger-ui [hidden],.swagger-ui template{display:none}.swagger-ui .debug *{outline:1px solid gold}.swagger-ui .debug-white *{outline:1px solid #fff}.swagger-ui .debug-black *{outline:1px solid #000}.swagger-ui .debug-grid{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat 0 0}.swagger-ui .debug-grid-16{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat 0 0}.swagger-ui .debug-grid-8-solid{background:#fff url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat 0 0}.swagger-ui .debug-grid-16-solid{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat 0 0}.swagger-ui .border-box,.swagger-ui a,.swagger-ui article,.swagger-ui body,.swagger-ui code,.swagger-ui dd,.swagger-ui div,.swagger-ui dl,.swagger-ui dt,.swagger-ui fieldset,.swagger-ui footer,.swagger-ui form,.swagger-ui h1,.swagger-ui h2,.swagger-ui h3,.swagger-ui h4,.swagger-ui h5,.swagger-ui h6,.swagger-ui header,.swagger-ui html,.swagger-ui input[type=email],.swagger-ui input[type=number],.swagger-ui input[type=password],.swagger-ui input[type=tel],.swagger-ui input[type=text],.swagger-ui input[type=url],.swagger-ui legend,.swagger-ui li,.swagger-ui main,.swagger-ui ol,.swagger-ui p,.swagger-ui pre,.swagger-ui section,.swagger-ui table,.swagger-ui td,.swagger-ui textarea,.swagger-ui th,.swagger-ui tr,.swagger-ui ul{box-sizing:border-box}.swagger-ui .aspect-ratio{height:0;position:relative}.swagger-ui .aspect-ratio--16x9{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1{padding-bottom:100%}.swagger-ui .aspect-ratio--object{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}@media screen and (min-width:30em){.swagger-ui .aspect-ratio-ns{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-ns{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-ns{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-ns{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-ns{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-ns{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-ns{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-ns{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-ns{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-ns{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-ns{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-ns{padding-bottom:100%}.swagger-ui .aspect-ratio--object-ns{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .aspect-ratio-m{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-m{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-m{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-m{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-m{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-m{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-m{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-m{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-m{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-m{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-m{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-m{padding-bottom:100%}.swagger-ui .aspect-ratio--object-m{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:60em){.swagger-ui .aspect-ratio-l{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-l{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-l{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-l{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-l{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-l{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-l{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-l{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-l{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-l{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-l{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-l{padding-bottom:100%}.swagger-ui .aspect-ratio--object-l{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}.swagger-ui img{max-width:100%}.swagger-ui .cover{background-size:cover!important}.swagger-ui .contain{background-size:contain!important}@media screen and (min-width:30em){.swagger-ui .cover-ns{background-size:cover!important}.swagger-ui .contain-ns{background-size:contain!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cover-m{background-size:cover!important}.swagger-ui .contain-m{background-size:contain!important}}@media screen and (min-width:60em){.swagger-ui .cover-l{background-size:cover!important}.swagger-ui .contain-l{background-size:contain!important}}.swagger-ui .bg-center{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left{background-position:0;background-repeat:no-repeat}@media screen and (min-width:30em){.swagger-ui .bg-center-ns{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-ns{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-ns{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-ns{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-ns{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bg-center-m{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-m{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-m{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-m{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-m{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:60em){.swagger-ui .bg-center-l{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-l{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-l{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-l{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-l{background-position:0;background-repeat:no-repeat}}.swagger-ui .outline{outline:1px solid}.swagger-ui .outline-transparent{outline:1px solid transparent}.swagger-ui .outline-0{outline:0}@media screen and (min-width:30em){.swagger-ui .outline-ns{outline:1px solid}.swagger-ui .outline-transparent-ns{outline:1px solid transparent}.swagger-ui .outline-0-ns{outline:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .outline-m{outline:1px solid}.swagger-ui .outline-transparent-m{outline:1px solid transparent}.swagger-ui .outline-0-m{outline:0}}@media screen and (min-width:60em){.swagger-ui .outline-l{outline:1px solid}.swagger-ui .outline-transparent-l{outline:1px solid transparent}.swagger-ui .outline-0-l{outline:0}}.swagger-ui .ba{border-style:solid;border-width:1px}.swagger-ui .bt{border-top-style:solid;border-top-width:1px}.swagger-ui .br{border-right-style:solid;border-right-width:1px}.swagger-ui .bb{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl{border-left-style:solid;border-left-width:1px}.swagger-ui .bn{border-style:none;border-width:0}@media screen and (min-width:30em){.swagger-ui .ba-ns{border-style:solid;border-width:1px}.swagger-ui .bt-ns{border-top-style:solid;border-top-width:1px}.swagger-ui .br-ns{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-ns{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-ns{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-ns{border-style:none;border-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ba-m{border-style:solid;border-width:1px}.swagger-ui .bt-m{border-top-style:solid;border-top-width:1px}.swagger-ui .br-m{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-m{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-m{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-m{border-style:none;border-width:0}}@media screen and (min-width:60em){.swagger-ui .ba-l{border-style:solid;border-width:1px}.swagger-ui .bt-l{border-top-style:solid;border-top-width:1px}.swagger-ui .br-l{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-l{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-l{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-l{border-style:none;border-width:0}}.swagger-ui .b--black{border-color:#000}.swagger-ui .b--near-black{border-color:#111}.swagger-ui .b--dark-gray{border-color:#333}.swagger-ui .b--mid-gray{border-color:#555}.swagger-ui .b--gray{border-color:#777}.swagger-ui .b--silver{border-color:#999}.swagger-ui .b--light-silver{border-color:#aaa}.swagger-ui .b--moon-gray{border-color:#ccc}.swagger-ui .b--light-gray{border-color:#eee}.swagger-ui .b--near-white{border-color:#f4f4f4}.swagger-ui .b--white{border-color:#fff}.swagger-ui .b--white-90{border-color:hsla(0,0%,100%,.9)}.swagger-ui .b--white-80{border-color:hsla(0,0%,100%,.8)}.swagger-ui .b--white-70{border-color:hsla(0,0%,100%,.7)}.swagger-ui .b--white-60{border-color:hsla(0,0%,100%,.6)}.swagger-ui .b--white-50{border-color:hsla(0,0%,100%,.5)}.swagger-ui .b--white-40{border-color:hsla(0,0%,100%,.4)}.swagger-ui .b--white-30{border-color:hsla(0,0%,100%,.3)}.swagger-ui .b--white-20{border-color:hsla(0,0%,100%,.2)}.swagger-ui .b--white-10{border-color:hsla(0,0%,100%,.1)}.swagger-ui .b--white-05{border-color:hsla(0,0%,100%,.05)}.swagger-ui .b--white-025{border-color:hsla(0,0%,100%,.03)}.swagger-ui .b--white-0125{border-color:hsla(0,0%,100%,.01)}.swagger-ui .b--black-90{border-color:rgba(0,0,0,.9)}.swagger-ui .b--black-80{border-color:rgba(0,0,0,.8)}.swagger-ui .b--black-70{border-color:rgba(0,0,0,.7)}.swagger-ui .b--black-60{border-color:rgba(0,0,0,.6)}.swagger-ui .b--black-50{border-color:rgba(0,0,0,.5)}.swagger-ui .b--black-40{border-color:rgba(0,0,0,.4)}.swagger-ui .b--black-30{border-color:rgba(0,0,0,.3)}.swagger-ui .b--black-20{border-color:rgba(0,0,0,.2)}.swagger-ui .b--black-10{border-color:rgba(0,0,0,.1)}.swagger-ui .b--black-05{border-color:rgba(0,0,0,.05)}.swagger-ui .b--black-025{border-color:rgba(0,0,0,.03)}.swagger-ui .b--black-0125{border-color:rgba(0,0,0,.01)}.swagger-ui .b--dark-red{border-color:#e7040f}.swagger-ui .b--red{border-color:#ff4136}.swagger-ui .b--light-red{border-color:#ff725c}.swagger-ui .b--orange{border-color:#ff6300}.swagger-ui .b--gold{border-color:#ffb700}.swagger-ui .b--yellow{border-color:gold}.swagger-ui .b--light-yellow{border-color:#fbf1a9}.swagger-ui .b--purple{border-color:#5e2ca5}.swagger-ui .b--light-purple{border-color:#a463f2}.swagger-ui .b--dark-pink{border-color:#d5008f}.swagger-ui .b--hot-pink{border-color:#ff41b4}.swagger-ui .b--pink{border-color:#ff80cc}.swagger-ui .b--light-pink{border-color:#ffa3d7}.swagger-ui .b--dark-green{border-color:#137752}.swagger-ui .b--green{border-color:#19a974}.swagger-ui .b--light-green{border-color:#9eebcf}.swagger-ui .b--navy{border-color:#001b44}.swagger-ui .b--dark-blue{border-color:#00449e}.swagger-ui .b--blue{border-color:#357edd}.swagger-ui .b--light-blue{border-color:#96ccff}.swagger-ui .b--lightest-blue{border-color:#cdecff}.swagger-ui .b--washed-blue{border-color:#f6fffe}.swagger-ui .b--washed-green{border-color:#e8fdf5}.swagger-ui .b--washed-yellow{border-color:#fffceb}.swagger-ui .b--washed-red{border-color:#ffdfdf}.swagger-ui .b--transparent{border-color:transparent}.swagger-ui .b--inherit{border-color:inherit}.swagger-ui .br0{border-radius:0}.swagger-ui .br1{border-radius:.125rem}.swagger-ui .br2{border-radius:.25rem}.swagger-ui .br3{border-radius:.5rem}.swagger-ui .br4{border-radius:1rem}.swagger-ui .br-100{border-radius:100%}.swagger-ui .br-pill{border-radius:9999px}.swagger-ui .br--bottom{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left{border-bottom-right-radius:0;border-top-right-radius:0}@media screen and (min-width:30em){.swagger-ui .br0-ns{border-radius:0}.swagger-ui .br1-ns{border-radius:.125rem}.swagger-ui .br2-ns{border-radius:.25rem}.swagger-ui .br3-ns{border-radius:.5rem}.swagger-ui .br4-ns{border-radius:1rem}.swagger-ui .br-100-ns{border-radius:100%}.swagger-ui .br-pill-ns{border-radius:9999px}.swagger-ui .br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-ns{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-ns{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-ns{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .br0-m{border-radius:0}.swagger-ui .br1-m{border-radius:.125rem}.swagger-ui .br2-m{border-radius:.25rem}.swagger-ui .br3-m{border-radius:.5rem}.swagger-ui .br4-m{border-radius:1rem}.swagger-ui .br-100-m{border-radius:100%}.swagger-ui .br-pill-m{border-radius:9999px}.swagger-ui .br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-m{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-m{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-m{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:60em){.swagger-ui .br0-l{border-radius:0}.swagger-ui .br1-l{border-radius:.125rem}.swagger-ui .br2-l{border-radius:.25rem}.swagger-ui .br3-l{border-radius:.5rem}.swagger-ui .br4-l{border-radius:1rem}.swagger-ui .br-100-l{border-radius:100%}.swagger-ui .br-pill-l{border-radius:9999px}.swagger-ui .br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-l{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-l{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-l{border-bottom-right-radius:0;border-top-right-radius:0}}.swagger-ui .b--dotted{border-style:dotted}.swagger-ui .b--dashed{border-style:dashed}.swagger-ui .b--solid{border-style:solid}.swagger-ui .b--none{border-style:none}@media screen and (min-width:30em){.swagger-ui .b--dotted-ns{border-style:dotted}.swagger-ui .b--dashed-ns{border-style:dashed}.swagger-ui .b--solid-ns{border-style:solid}.swagger-ui .b--none-ns{border-style:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .b--dotted-m{border-style:dotted}.swagger-ui .b--dashed-m{border-style:dashed}.swagger-ui .b--solid-m{border-style:solid}.swagger-ui .b--none-m{border-style:none}}@media screen and (min-width:60em){.swagger-ui .b--dotted-l{border-style:dotted}.swagger-ui .b--dashed-l{border-style:dashed}.swagger-ui .b--solid-l{border-style:solid}.swagger-ui .b--none-l{border-style:none}}.swagger-ui .bw0{border-width:0}.swagger-ui .bw1{border-width:.125rem}.swagger-ui .bw2{border-width:.25rem}.swagger-ui .bw3{border-width:.5rem}.swagger-ui .bw4{border-width:1rem}.swagger-ui .bw5{border-width:2rem}.swagger-ui .bt-0{border-top-width:0}.swagger-ui .br-0{border-right-width:0}.swagger-ui .bb-0{border-bottom-width:0}.swagger-ui .bl-0{border-left-width:0}@media screen and (min-width:30em){.swagger-ui .bw0-ns{border-width:0}.swagger-ui .bw1-ns{border-width:.125rem}.swagger-ui .bw2-ns{border-width:.25rem}.swagger-ui .bw3-ns{border-width:.5rem}.swagger-ui .bw4-ns{border-width:1rem}.swagger-ui .bw5-ns{border-width:2rem}.swagger-ui .bt-0-ns{border-top-width:0}.swagger-ui .br-0-ns{border-right-width:0}.swagger-ui .bb-0-ns{border-bottom-width:0}.swagger-ui .bl-0-ns{border-left-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bw0-m{border-width:0}.swagger-ui .bw1-m{border-width:.125rem}.swagger-ui .bw2-m{border-width:.25rem}.swagger-ui .bw3-m{border-width:.5rem}.swagger-ui .bw4-m{border-width:1rem}.swagger-ui .bw5-m{border-width:2rem}.swagger-ui .bt-0-m{border-top-width:0}.swagger-ui .br-0-m{border-right-width:0}.swagger-ui .bb-0-m{border-bottom-width:0}.swagger-ui .bl-0-m{border-left-width:0}}@media screen and (min-width:60em){.swagger-ui .bw0-l{border-width:0}.swagger-ui .bw1-l{border-width:.125rem}.swagger-ui .bw2-l{border-width:.25rem}.swagger-ui .bw3-l{border-width:.5rem}.swagger-ui .bw4-l{border-width:1rem}.swagger-ui .bw5-l{border-width:2rem}.swagger-ui .bt-0-l{border-top-width:0}.swagger-ui .br-0-l{border-right-width:0}.swagger-ui .bb-0-l{border-bottom-width:0}.swagger-ui .bl-0-l{border-left-width:0}}.swagger-ui .shadow-1{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}@media screen and (min-width:30em){.swagger-ui .shadow-1-ns{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-ns{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-ns{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-ns{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-ns{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .shadow-1-m{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-m{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-m{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-m{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-m{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:60em){.swagger-ui .shadow-1-l{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-l{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-l{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-l{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-l{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}.swagger-ui .pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.swagger-ui .top-0{top:0}.swagger-ui .right-0{right:0}.swagger-ui .bottom-0{bottom:0}.swagger-ui .left-0{left:0}.swagger-ui .top-1{top:1rem}.swagger-ui .right-1{right:1rem}.swagger-ui .bottom-1{bottom:1rem}.swagger-ui .left-1{left:1rem}.swagger-ui .top-2{top:2rem}.swagger-ui .right-2{right:2rem}.swagger-ui .bottom-2{bottom:2rem}.swagger-ui .left-2{left:2rem}.swagger-ui .top--1{top:-1rem}.swagger-ui .right--1{right:-1rem}.swagger-ui .bottom--1{bottom:-1rem}.swagger-ui .left--1{left:-1rem}.swagger-ui .top--2{top:-2rem}.swagger-ui .right--2{right:-2rem}.swagger-ui .bottom--2{bottom:-2rem}.swagger-ui .left--2{left:-2rem}.swagger-ui .absolute--fill{bottom:0;left:0;right:0;top:0}@media screen and (min-width:30em){.swagger-ui .top-0-ns{top:0}.swagger-ui .left-0-ns{left:0}.swagger-ui .right-0-ns{right:0}.swagger-ui .bottom-0-ns{bottom:0}.swagger-ui .top-1-ns{top:1rem}.swagger-ui .left-1-ns{left:1rem}.swagger-ui .right-1-ns{right:1rem}.swagger-ui .bottom-1-ns{bottom:1rem}.swagger-ui .top-2-ns{top:2rem}.swagger-ui .left-2-ns{left:2rem}.swagger-ui .right-2-ns{right:2rem}.swagger-ui .bottom-2-ns{bottom:2rem}.swagger-ui .top--1-ns{top:-1rem}.swagger-ui .right--1-ns{right:-1rem}.swagger-ui .bottom--1-ns{bottom:-1rem}.swagger-ui .left--1-ns{left:-1rem}.swagger-ui .top--2-ns{top:-2rem}.swagger-ui .right--2-ns{right:-2rem}.swagger-ui .bottom--2-ns{bottom:-2rem}.swagger-ui .left--2-ns{left:-2rem}.swagger-ui .absolute--fill-ns{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .top-0-m{top:0}.swagger-ui .left-0-m{left:0}.swagger-ui .right-0-m{right:0}.swagger-ui .bottom-0-m{bottom:0}.swagger-ui .top-1-m{top:1rem}.swagger-ui .left-1-m{left:1rem}.swagger-ui .right-1-m{right:1rem}.swagger-ui .bottom-1-m{bottom:1rem}.swagger-ui .top-2-m{top:2rem}.swagger-ui .left-2-m{left:2rem}.swagger-ui .right-2-m{right:2rem}.swagger-ui .bottom-2-m{bottom:2rem}.swagger-ui .top--1-m{top:-1rem}.swagger-ui .right--1-m{right:-1rem}.swagger-ui .bottom--1-m{bottom:-1rem}.swagger-ui .left--1-m{left:-1rem}.swagger-ui .top--2-m{top:-2rem}.swagger-ui .right--2-m{right:-2rem}.swagger-ui .bottom--2-m{bottom:-2rem}.swagger-ui .left--2-m{left:-2rem}.swagger-ui .absolute--fill-m{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:60em){.swagger-ui .top-0-l{top:0}.swagger-ui .left-0-l{left:0}.swagger-ui .right-0-l{right:0}.swagger-ui .bottom-0-l{bottom:0}.swagger-ui .top-1-l{top:1rem}.swagger-ui .left-1-l{left:1rem}.swagger-ui .right-1-l{right:1rem}.swagger-ui .bottom-1-l{bottom:1rem}.swagger-ui .top-2-l{top:2rem}.swagger-ui .left-2-l{left:2rem}.swagger-ui .right-2-l{right:2rem}.swagger-ui .bottom-2-l{bottom:2rem}.swagger-ui .top--1-l{top:-1rem}.swagger-ui .right--1-l{right:-1rem}.swagger-ui .bottom--1-l{bottom:-1rem}.swagger-ui .left--1-l{left:-1rem}.swagger-ui .top--2-l{top:-2rem}.swagger-ui .right--2-l{right:-2rem}.swagger-ui .bottom--2-l{bottom:-2rem}.swagger-ui .left--2-l{left:-2rem}.swagger-ui .absolute--fill-l{bottom:0;left:0;right:0;top:0}}.swagger-ui .cf:after,.swagger-ui .cf:before{content:\" \";display:table}.swagger-ui .cf:after{clear:both}.swagger-ui .cf{*zoom:1}.swagger-ui .cl{clear:left}.swagger-ui .cr{clear:right}.swagger-ui .cb{clear:both}.swagger-ui .cn{clear:none}@media screen and (min-width:30em){.swagger-ui .cl-ns{clear:left}.swagger-ui .cr-ns{clear:right}.swagger-ui .cb-ns{clear:both}.swagger-ui .cn-ns{clear:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cl-m{clear:left}.swagger-ui .cr-m{clear:right}.swagger-ui .cb-m{clear:both}.swagger-ui .cn-m{clear:none}}@media screen and (min-width:60em){.swagger-ui .cl-l{clear:left}.swagger-ui .cr-l{clear:right}.swagger-ui .cb-l{clear:both}.swagger-ui .cn-l{clear:none}}.swagger-ui .flex{display:flex}.swagger-ui .inline-flex{display:inline-flex}.swagger-ui .flex-auto{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none{flex:none}.swagger-ui .flex-column{flex-direction:column}.swagger-ui .flex-row{flex-direction:row}.swagger-ui .flex-wrap{flex-wrap:wrap}.swagger-ui .flex-nowrap{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse{flex-direction:column-reverse}.swagger-ui .flex-row-reverse{flex-direction:row-reverse}.swagger-ui .items-start{align-items:flex-start}.swagger-ui .items-end{align-items:flex-end}.swagger-ui .items-center{align-items:center}.swagger-ui .items-baseline{align-items:baseline}.swagger-ui .items-stretch{align-items:stretch}.swagger-ui .self-start{align-self:flex-start}.swagger-ui .self-end{align-self:flex-end}.swagger-ui .self-center{align-self:center}.swagger-ui .self-baseline{align-self:baseline}.swagger-ui .self-stretch{align-self:stretch}.swagger-ui .justify-start{justify-content:flex-start}.swagger-ui .justify-end{justify-content:flex-end}.swagger-ui .justify-center{justify-content:center}.swagger-ui .justify-between{justify-content:space-between}.swagger-ui .justify-around{justify-content:space-around}.swagger-ui .content-start{align-content:flex-start}.swagger-ui .content-end{align-content:flex-end}.swagger-ui .content-center{align-content:center}.swagger-ui .content-between{align-content:space-between}.swagger-ui .content-around{align-content:space-around}.swagger-ui .content-stretch{align-content:stretch}.swagger-ui .order-0{order:0}.swagger-ui .order-1{order:1}.swagger-ui .order-2{order:2}.swagger-ui .order-3{order:3}.swagger-ui .order-4{order:4}.swagger-ui .order-5{order:5}.swagger-ui .order-6{order:6}.swagger-ui .order-7{order:7}.swagger-ui .order-8{order:8}.swagger-ui .order-last{order:99999}.swagger-ui .flex-grow-0{flex-grow:0}.swagger-ui .flex-grow-1{flex-grow:1}.swagger-ui .flex-shrink-0{flex-shrink:0}.swagger-ui .flex-shrink-1{flex-shrink:1}@media screen and (min-width:30em){.swagger-ui .flex-ns{display:flex}.swagger-ui .inline-flex-ns{display:inline-flex}.swagger-ui .flex-auto-ns{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-ns{flex:none}.swagger-ui .flex-column-ns{flex-direction:column}.swagger-ui .flex-row-ns{flex-direction:row}.swagger-ui .flex-wrap-ns{flex-wrap:wrap}.swagger-ui .flex-nowrap-ns{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-ns{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-ns{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-ns{flex-direction:row-reverse}.swagger-ui .items-start-ns{align-items:flex-start}.swagger-ui .items-end-ns{align-items:flex-end}.swagger-ui .items-center-ns{align-items:center}.swagger-ui .items-baseline-ns{align-items:baseline}.swagger-ui .items-stretch-ns{align-items:stretch}.swagger-ui .self-start-ns{align-self:flex-start}.swagger-ui .self-end-ns{align-self:flex-end}.swagger-ui .self-center-ns{align-self:center}.swagger-ui .self-baseline-ns{align-self:baseline}.swagger-ui .self-stretch-ns{align-self:stretch}.swagger-ui .justify-start-ns{justify-content:flex-start}.swagger-ui .justify-end-ns{justify-content:flex-end}.swagger-ui .justify-center-ns{justify-content:center}.swagger-ui .justify-between-ns{justify-content:space-between}.swagger-ui .justify-around-ns{justify-content:space-around}.swagger-ui .content-start-ns{align-content:flex-start}.swagger-ui .content-end-ns{align-content:flex-end}.swagger-ui .content-center-ns{align-content:center}.swagger-ui .content-between-ns{align-content:space-between}.swagger-ui .content-around-ns{align-content:space-around}.swagger-ui .content-stretch-ns{align-content:stretch}.swagger-ui .order-0-ns{order:0}.swagger-ui .order-1-ns{order:1}.swagger-ui .order-2-ns{order:2}.swagger-ui .order-3-ns{order:3}.swagger-ui .order-4-ns{order:4}.swagger-ui .order-5-ns{order:5}.swagger-ui .order-6-ns{order:6}.swagger-ui .order-7-ns{order:7}.swagger-ui .order-8-ns{order:8}.swagger-ui .order-last-ns{order:99999}.swagger-ui .flex-grow-0-ns{flex-grow:0}.swagger-ui .flex-grow-1-ns{flex-grow:1}.swagger-ui .flex-shrink-0-ns{flex-shrink:0}.swagger-ui .flex-shrink-1-ns{flex-shrink:1}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .flex-m{display:flex}.swagger-ui .inline-flex-m{display:inline-flex}.swagger-ui .flex-auto-m{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-m{flex:none}.swagger-ui .flex-column-m{flex-direction:column}.swagger-ui .flex-row-m{flex-direction:row}.swagger-ui .flex-wrap-m{flex-wrap:wrap}.swagger-ui .flex-nowrap-m{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-m{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-m{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-m{flex-direction:row-reverse}.swagger-ui .items-start-m{align-items:flex-start}.swagger-ui .items-end-m{align-items:flex-end}.swagger-ui .items-center-m{align-items:center}.swagger-ui .items-baseline-m{align-items:baseline}.swagger-ui .items-stretch-m{align-items:stretch}.swagger-ui .self-start-m{align-self:flex-start}.swagger-ui .self-end-m{align-self:flex-end}.swagger-ui .self-center-m{align-self:center}.swagger-ui .self-baseline-m{align-self:baseline}.swagger-ui .self-stretch-m{align-self:stretch}.swagger-ui .justify-start-m{justify-content:flex-start}.swagger-ui .justify-end-m{justify-content:flex-end}.swagger-ui .justify-center-m{justify-content:center}.swagger-ui .justify-between-m{justify-content:space-between}.swagger-ui .justify-around-m{justify-content:space-around}.swagger-ui .content-start-m{align-content:flex-start}.swagger-ui .content-end-m{align-content:flex-end}.swagger-ui .content-center-m{align-content:center}.swagger-ui .content-between-m{align-content:space-between}.swagger-ui .content-around-m{align-content:space-around}.swagger-ui .content-stretch-m{align-content:stretch}.swagger-ui .order-0-m{order:0}.swagger-ui .order-1-m{order:1}.swagger-ui .order-2-m{order:2}.swagger-ui .order-3-m{order:3}.swagger-ui .order-4-m{order:4}.swagger-ui .order-5-m{order:5}.swagger-ui .order-6-m{order:6}.swagger-ui .order-7-m{order:7}.swagger-ui .order-8-m{order:8}.swagger-ui .order-last-m{order:99999}.swagger-ui .flex-grow-0-m{flex-grow:0}.swagger-ui .flex-grow-1-m{flex-grow:1}.swagger-ui .flex-shrink-0-m{flex-shrink:0}.swagger-ui .flex-shrink-1-m{flex-shrink:1}}@media screen and (min-width:60em){.swagger-ui .flex-l{display:flex}.swagger-ui .inline-flex-l{display:inline-flex}.swagger-ui .flex-auto-l{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-l{flex:none}.swagger-ui .flex-column-l{flex-direction:column}.swagger-ui .flex-row-l{flex-direction:row}.swagger-ui .flex-wrap-l{flex-wrap:wrap}.swagger-ui .flex-nowrap-l{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-l{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-l{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-l{flex-direction:row-reverse}.swagger-ui .items-start-l{align-items:flex-start}.swagger-ui .items-end-l{align-items:flex-end}.swagger-ui .items-center-l{align-items:center}.swagger-ui .items-baseline-l{align-items:baseline}.swagger-ui .items-stretch-l{align-items:stretch}.swagger-ui .self-start-l{align-self:flex-start}.swagger-ui .self-end-l{align-self:flex-end}.swagger-ui .self-center-l{align-self:center}.swagger-ui .self-baseline-l{align-self:baseline}.swagger-ui .self-stretch-l{align-self:stretch}.swagger-ui .justify-start-l{justify-content:flex-start}.swagger-ui .justify-end-l{justify-content:flex-end}.swagger-ui .justify-center-l{justify-content:center}.swagger-ui .justify-between-l{justify-content:space-between}.swagger-ui .justify-around-l{justify-content:space-around}.swagger-ui .content-start-l{align-content:flex-start}.swagger-ui .content-end-l{align-content:flex-end}.swagger-ui .content-center-l{align-content:center}.swagger-ui .content-between-l{align-content:space-between}.swagger-ui .content-around-l{align-content:space-around}.swagger-ui .content-stretch-l{align-content:stretch}.swagger-ui .order-0-l{order:0}.swagger-ui .order-1-l{order:1}.swagger-ui .order-2-l{order:2}.swagger-ui .order-3-l{order:3}.swagger-ui .order-4-l{order:4}.swagger-ui .order-5-l{order:5}.swagger-ui .order-6-l{order:6}.swagger-ui .order-7-l{order:7}.swagger-ui .order-8-l{order:8}.swagger-ui .order-last-l{order:99999}.swagger-ui .flex-grow-0-l{flex-grow:0}.swagger-ui .flex-grow-1-l{flex-grow:1}.swagger-ui .flex-shrink-0-l{flex-shrink:0}.swagger-ui .flex-shrink-1-l{flex-shrink:1}}.swagger-ui .dn{display:none}.swagger-ui .di{display:inline}.swagger-ui .db{display:block}.swagger-ui .dib{display:inline-block}.swagger-ui .dit{display:inline-table}.swagger-ui .dt{display:table}.swagger-ui .dtc{display:table-cell}.swagger-ui .dt-row{display:table-row}.swagger-ui .dt-row-group{display:table-row-group}.swagger-ui .dt-column{display:table-column}.swagger-ui .dt-column-group{display:table-column-group}.swagger-ui .dt--fixed{table-layout:fixed;width:100%}@media screen and (min-width:30em){.swagger-ui .dn-ns{display:none}.swagger-ui .di-ns{display:inline}.swagger-ui .db-ns{display:block}.swagger-ui .dib-ns{display:inline-block}.swagger-ui .dit-ns{display:inline-table}.swagger-ui .dt-ns{display:table}.swagger-ui .dtc-ns{display:table-cell}.swagger-ui .dt-row-ns{display:table-row}.swagger-ui .dt-row-group-ns{display:table-row-group}.swagger-ui .dt-column-ns{display:table-column}.swagger-ui .dt-column-group-ns{display:table-column-group}.swagger-ui .dt--fixed-ns{table-layout:fixed;width:100%}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .dn-m{display:none}.swagger-ui .di-m{display:inline}.swagger-ui .db-m{display:block}.swagger-ui .dib-m{display:inline-block}.swagger-ui .dit-m{display:inline-table}.swagger-ui .dt-m{display:table}.swagger-ui .dtc-m{display:table-cell}.swagger-ui .dt-row-m{display:table-row}.swagger-ui .dt-row-group-m{display:table-row-group}.swagger-ui .dt-column-m{display:table-column}.swagger-ui .dt-column-group-m{display:table-column-group}.swagger-ui .dt--fixed-m{table-layout:fixed;width:100%}}@media screen and (min-width:60em){.swagger-ui .dn-l{display:none}.swagger-ui .di-l{display:inline}.swagger-ui .db-l{display:block}.swagger-ui .dib-l{display:inline-block}.swagger-ui .dit-l{display:inline-table}.swagger-ui .dt-l{display:table}.swagger-ui .dtc-l{display:table-cell}.swagger-ui .dt-row-l{display:table-row}.swagger-ui .dt-row-group-l{display:table-row-group}.swagger-ui .dt-column-l{display:table-column}.swagger-ui .dt-column-group-l{display:table-column-group}.swagger-ui .dt--fixed-l{table-layout:fixed;width:100%}}.swagger-ui .fl{_display:inline;float:left}.swagger-ui .fr{_display:inline;float:right}.swagger-ui .fn{float:none}@media screen and (min-width:30em){.swagger-ui .fl-ns{_display:inline;float:left}.swagger-ui .fr-ns{_display:inline;float:right}.swagger-ui .fn-ns{float:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .fl-m{_display:inline;float:left}.swagger-ui .fr-m{_display:inline;float:right}.swagger-ui .fn-m{float:none}}@media screen and (min-width:60em){.swagger-ui .fl-l{_display:inline;float:left}.swagger-ui .fr-l{_display:inline;float:right}.swagger-ui .fn-l{float:none}}.swagger-ui .sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.swagger-ui .serif{font-family:georgia,serif}.swagger-ui .system-sans-serif{font-family:sans-serif}.swagger-ui .system-serif{font-family:serif}.swagger-ui .code,.swagger-ui code{font-family:Consolas,monaco,monospace}.swagger-ui .courier{font-family:Courier Next,courier,monospace}.swagger-ui .helvetica{font-family:helvetica neue,helvetica,sans-serif}.swagger-ui .avenir{font-family:avenir next,avenir,sans-serif}.swagger-ui .athelas{font-family:athelas,georgia,serif}.swagger-ui .georgia{font-family:georgia,serif}.swagger-ui .times{font-family:times,serif}.swagger-ui .bodoni{font-family:Bodoni MT,serif}.swagger-ui .calisto{font-family:Calisto MT,serif}.swagger-ui .garamond{font-family:garamond,serif}.swagger-ui .baskerville{font-family:baskerville,serif}.swagger-ui .i{font-style:italic}.swagger-ui .fs-normal{font-style:normal}@media screen and (min-width:30em){.swagger-ui .i-ns{font-style:italic}.swagger-ui .fs-normal-ns{font-style:normal}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .i-m{font-style:italic}.swagger-ui .fs-normal-m{font-style:normal}}@media screen and (min-width:60em){.swagger-ui .i-l{font-style:italic}.swagger-ui .fs-normal-l{font-style:normal}}.swagger-ui .normal{font-weight:400}.swagger-ui .b{font-weight:700}.swagger-ui .fw1{font-weight:100}.swagger-ui .fw2{font-weight:200}.swagger-ui .fw3{font-weight:300}.swagger-ui .fw4{font-weight:400}.swagger-ui .fw5{font-weight:500}.swagger-ui .fw6{font-weight:600}.swagger-ui .fw7{font-weight:700}.swagger-ui .fw8{font-weight:800}.swagger-ui .fw9{font-weight:900}@media screen and (min-width:30em){.swagger-ui .normal-ns{font-weight:400}.swagger-ui .b-ns{font-weight:700}.swagger-ui .fw1-ns{font-weight:100}.swagger-ui .fw2-ns{font-weight:200}.swagger-ui .fw3-ns{font-weight:300}.swagger-ui .fw4-ns{font-weight:400}.swagger-ui .fw5-ns{font-weight:500}.swagger-ui .fw6-ns{font-weight:600}.swagger-ui .fw7-ns{font-weight:700}.swagger-ui .fw8-ns{font-weight:800}.swagger-ui .fw9-ns{font-weight:900}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .normal-m{font-weight:400}.swagger-ui .b-m{font-weight:700}.swagger-ui .fw1-m{font-weight:100}.swagger-ui .fw2-m{font-weight:200}.swagger-ui .fw3-m{font-weight:300}.swagger-ui .fw4-m{font-weight:400}.swagger-ui .fw5-m{font-weight:500}.swagger-ui .fw6-m{font-weight:600}.swagger-ui .fw7-m{font-weight:700}.swagger-ui .fw8-m{font-weight:800}.swagger-ui .fw9-m{font-weight:900}}@media screen and (min-width:60em){.swagger-ui .normal-l{font-weight:400}.swagger-ui .b-l{font-weight:700}.swagger-ui .fw1-l{font-weight:100}.swagger-ui .fw2-l{font-weight:200}.swagger-ui .fw3-l{font-weight:300}.swagger-ui .fw4-l{font-weight:400}.swagger-ui .fw5-l{font-weight:500}.swagger-ui .fw6-l{font-weight:600}.swagger-ui .fw7-l{font-weight:700}.swagger-ui .fw8-l{font-weight:800}.swagger-ui .fw9-l{font-weight:900}}.swagger-ui .input-reset{-webkit-appearance:none;-moz-appearance:none}.swagger-ui .button-reset::-moz-focus-inner,.swagger-ui .input-reset::-moz-focus-inner{border:0;padding:0}.swagger-ui .h1{height:1rem}.swagger-ui .h2{height:2rem}.swagger-ui .h3{height:4rem}.swagger-ui .h4{height:8rem}.swagger-ui .h5{height:16rem}.swagger-ui .h-25{height:25%}.swagger-ui .h-50{height:50%}.swagger-ui .h-75{height:75%}.swagger-ui .h-100{height:100%}.swagger-ui .min-h-100{min-height:100%}.swagger-ui .vh-25{height:25vh}.swagger-ui .vh-50{height:50vh}.swagger-ui .vh-75{height:75vh}.swagger-ui .vh-100{height:100vh}.swagger-ui .min-vh-100{min-height:100vh}.swagger-ui .h-auto{height:auto}.swagger-ui .h-inherit{height:inherit}@media screen and (min-width:30em){.swagger-ui .h1-ns{height:1rem}.swagger-ui .h2-ns{height:2rem}.swagger-ui .h3-ns{height:4rem}.swagger-ui .h4-ns{height:8rem}.swagger-ui .h5-ns{height:16rem}.swagger-ui .h-25-ns{height:25%}.swagger-ui .h-50-ns{height:50%}.swagger-ui .h-75-ns{height:75%}.swagger-ui .h-100-ns{height:100%}.swagger-ui .min-h-100-ns{min-height:100%}.swagger-ui .vh-25-ns{height:25vh}.swagger-ui .vh-50-ns{height:50vh}.swagger-ui .vh-75-ns{height:75vh}.swagger-ui .vh-100-ns{height:100vh}.swagger-ui .min-vh-100-ns{min-height:100vh}.swagger-ui .h-auto-ns{height:auto}.swagger-ui .h-inherit-ns{height:inherit}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .h1-m{height:1rem}.swagger-ui .h2-m{height:2rem}.swagger-ui .h3-m{height:4rem}.swagger-ui .h4-m{height:8rem}.swagger-ui .h5-m{height:16rem}.swagger-ui .h-25-m{height:25%}.swagger-ui .h-50-m{height:50%}.swagger-ui .h-75-m{height:75%}.swagger-ui .h-100-m{height:100%}.swagger-ui .min-h-100-m{min-height:100%}.swagger-ui .vh-25-m{height:25vh}.swagger-ui .vh-50-m{height:50vh}.swagger-ui .vh-75-m{height:75vh}.swagger-ui .vh-100-m{height:100vh}.swagger-ui .min-vh-100-m{min-height:100vh}.swagger-ui .h-auto-m{height:auto}.swagger-ui .h-inherit-m{height:inherit}}@media screen and (min-width:60em){.swagger-ui .h1-l{height:1rem}.swagger-ui .h2-l{height:2rem}.swagger-ui .h3-l{height:4rem}.swagger-ui .h4-l{height:8rem}.swagger-ui .h5-l{height:16rem}.swagger-ui .h-25-l{height:25%}.swagger-ui .h-50-l{height:50%}.swagger-ui .h-75-l{height:75%}.swagger-ui .h-100-l{height:100%}.swagger-ui .min-h-100-l{min-height:100%}.swagger-ui .vh-25-l{height:25vh}.swagger-ui .vh-50-l{height:50vh}.swagger-ui .vh-75-l{height:75vh}.swagger-ui .vh-100-l{height:100vh}.swagger-ui .min-vh-100-l{min-height:100vh}.swagger-ui .h-auto-l{height:auto}.swagger-ui .h-inherit-l{height:inherit}}.swagger-ui .tracked{letter-spacing:.1em}.swagger-ui .tracked-tight{letter-spacing:-.05em}.swagger-ui .tracked-mega{letter-spacing:.25em}@media screen and (min-width:30em){.swagger-ui .tracked-ns{letter-spacing:.1em}.swagger-ui .tracked-tight-ns{letter-spacing:-.05em}.swagger-ui .tracked-mega-ns{letter-spacing:.25em}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tracked-m{letter-spacing:.1em}.swagger-ui .tracked-tight-m{letter-spacing:-.05em}.swagger-ui .tracked-mega-m{letter-spacing:.25em}}@media screen and (min-width:60em){.swagger-ui .tracked-l{letter-spacing:.1em}.swagger-ui .tracked-tight-l{letter-spacing:-.05em}.swagger-ui .tracked-mega-l{letter-spacing:.25em}}.swagger-ui .lh-solid{line-height:1}.swagger-ui .lh-title{line-height:1.25}.swagger-ui .lh-copy{line-height:1.5}@media screen and (min-width:30em){.swagger-ui .lh-solid-ns{line-height:1}.swagger-ui .lh-title-ns{line-height:1.25}.swagger-ui .lh-copy-ns{line-height:1.5}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .lh-solid-m{line-height:1}.swagger-ui .lh-title-m{line-height:1.25}.swagger-ui .lh-copy-m{line-height:1.5}}@media screen and (min-width:60em){.swagger-ui .lh-solid-l{line-height:1}.swagger-ui .lh-title-l{line-height:1.25}.swagger-ui .lh-copy-l{line-height:1.5}}.swagger-ui .link{text-decoration:none}.swagger-ui .link,.swagger-ui .link:active,.swagger-ui .link:focus,.swagger-ui .link:hover,.swagger-ui .link:link,.swagger-ui .link:visited{transition:color .15s ease-in}.swagger-ui .link:focus{outline:1px dotted currentColor}.swagger-ui .list{list-style-type:none}.swagger-ui .mw-100{max-width:100%}.swagger-ui .mw1{max-width:1rem}.swagger-ui .mw2{max-width:2rem}.swagger-ui .mw3{max-width:4rem}.swagger-ui .mw4{max-width:8rem}.swagger-ui .mw5{max-width:16rem}.swagger-ui .mw6{max-width:32rem}.swagger-ui .mw7{max-width:48rem}.swagger-ui .mw8{max-width:64rem}.swagger-ui .mw9{max-width:96rem}.swagger-ui .mw-none{max-width:none}@media screen and (min-width:30em){.swagger-ui .mw-100-ns{max-width:100%}.swagger-ui .mw1-ns{max-width:1rem}.swagger-ui .mw2-ns{max-width:2rem}.swagger-ui .mw3-ns{max-width:4rem}.swagger-ui .mw4-ns{max-width:8rem}.swagger-ui .mw5-ns{max-width:16rem}.swagger-ui .mw6-ns{max-width:32rem}.swagger-ui .mw7-ns{max-width:48rem}.swagger-ui .mw8-ns{max-width:64rem}.swagger-ui .mw9-ns{max-width:96rem}.swagger-ui .mw-none-ns{max-width:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .mw-100-m{max-width:100%}.swagger-ui .mw1-m{max-width:1rem}.swagger-ui .mw2-m{max-width:2rem}.swagger-ui .mw3-m{max-width:4rem}.swagger-ui .mw4-m{max-width:8rem}.swagger-ui .mw5-m{max-width:16rem}.swagger-ui .mw6-m{max-width:32rem}.swagger-ui .mw7-m{max-width:48rem}.swagger-ui .mw8-m{max-width:64rem}.swagger-ui .mw9-m{max-width:96rem}.swagger-ui .mw-none-m{max-width:none}}@media screen and (min-width:60em){.swagger-ui .mw-100-l{max-width:100%}.swagger-ui .mw1-l{max-width:1rem}.swagger-ui .mw2-l{max-width:2rem}.swagger-ui .mw3-l{max-width:4rem}.swagger-ui .mw4-l{max-width:8rem}.swagger-ui .mw5-l{max-width:16rem}.swagger-ui .mw6-l{max-width:32rem}.swagger-ui .mw7-l{max-width:48rem}.swagger-ui .mw8-l{max-width:64rem}.swagger-ui .mw9-l{max-width:96rem}.swagger-ui .mw-none-l{max-width:none}}.swagger-ui .w1{width:1rem}.swagger-ui .w2{width:2rem}.swagger-ui .w3{width:4rem}.swagger-ui .w4{width:8rem}.swagger-ui .w5{width:16rem}.swagger-ui .w-10{width:10%}.swagger-ui .w-20{width:20%}.swagger-ui .w-25{width:25%}.swagger-ui .w-30{width:30%}.swagger-ui .w-33{width:33%}.swagger-ui .w-34{width:34%}.swagger-ui .w-40{width:40%}.swagger-ui .w-50{width:50%}.swagger-ui .w-60{width:60%}.swagger-ui .w-70{width:70%}.swagger-ui .w-75{width:75%}.swagger-ui .w-80{width:80%}.swagger-ui .w-90{width:90%}.swagger-ui .w-100{width:100%}.swagger-ui .w-third{width:33.3333333333%}.swagger-ui .w-two-thirds{width:66.6666666667%}.swagger-ui .w-auto{width:auto}@media screen and (min-width:30em){.swagger-ui .w1-ns{width:1rem}.swagger-ui .w2-ns{width:2rem}.swagger-ui .w3-ns{width:4rem}.swagger-ui .w4-ns{width:8rem}.swagger-ui .w5-ns{width:16rem}.swagger-ui .w-10-ns{width:10%}.swagger-ui .w-20-ns{width:20%}.swagger-ui .w-25-ns{width:25%}.swagger-ui .w-30-ns{width:30%}.swagger-ui .w-33-ns{width:33%}.swagger-ui .w-34-ns{width:34%}.swagger-ui .w-40-ns{width:40%}.swagger-ui .w-50-ns{width:50%}.swagger-ui .w-60-ns{width:60%}.swagger-ui .w-70-ns{width:70%}.swagger-ui .w-75-ns{width:75%}.swagger-ui .w-80-ns{width:80%}.swagger-ui .w-90-ns{width:90%}.swagger-ui .w-100-ns{width:100%}.swagger-ui .w-third-ns{width:33.3333333333%}.swagger-ui .w-two-thirds-ns{width:66.6666666667%}.swagger-ui .w-auto-ns{width:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .w1-m{width:1rem}.swagger-ui .w2-m{width:2rem}.swagger-ui .w3-m{width:4rem}.swagger-ui .w4-m{width:8rem}.swagger-ui .w5-m{width:16rem}.swagger-ui .w-10-m{width:10%}.swagger-ui .w-20-m{width:20%}.swagger-ui .w-25-m{width:25%}.swagger-ui .w-30-m{width:30%}.swagger-ui .w-33-m{width:33%}.swagger-ui .w-34-m{width:34%}.swagger-ui .w-40-m{width:40%}.swagger-ui .w-50-m{width:50%}.swagger-ui .w-60-m{width:60%}.swagger-ui .w-70-m{width:70%}.swagger-ui .w-75-m{width:75%}.swagger-ui .w-80-m{width:80%}.swagger-ui .w-90-m{width:90%}.swagger-ui .w-100-m{width:100%}.swagger-ui .w-third-m{width:33.3333333333%}.swagger-ui .w-two-thirds-m{width:66.6666666667%}.swagger-ui .w-auto-m{width:auto}}@media screen and (min-width:60em){.swagger-ui .w1-l{width:1rem}.swagger-ui .w2-l{width:2rem}.swagger-ui .w3-l{width:4rem}.swagger-ui .w4-l{width:8rem}.swagger-ui .w5-l{width:16rem}.swagger-ui .w-10-l{width:10%}.swagger-ui .w-20-l{width:20%}.swagger-ui .w-25-l{width:25%}.swagger-ui .w-30-l{width:30%}.swagger-ui .w-33-l{width:33%}.swagger-ui .w-34-l{width:34%}.swagger-ui .w-40-l{width:40%}.swagger-ui .w-50-l{width:50%}.swagger-ui .w-60-l{width:60%}.swagger-ui .w-70-l{width:70%}.swagger-ui .w-75-l{width:75%}.swagger-ui .w-80-l{width:80%}.swagger-ui .w-90-l{width:90%}.swagger-ui .w-100-l{width:100%}.swagger-ui .w-third-l{width:33.3333333333%}.swagger-ui .w-two-thirds-l{width:66.6666666667%}.swagger-ui .w-auto-l{width:auto}}.swagger-ui .overflow-visible{overflow:visible}.swagger-ui .overflow-hidden{overflow:hidden}.swagger-ui .overflow-scroll{overflow:scroll}.swagger-ui .overflow-auto{overflow:auto}.swagger-ui .overflow-x-visible{overflow-x:visible}.swagger-ui .overflow-x-hidden{overflow-x:hidden}.swagger-ui .overflow-x-scroll{overflow-x:scroll}.swagger-ui .overflow-x-auto{overflow-x:auto}.swagger-ui .overflow-y-visible{overflow-y:visible}.swagger-ui .overflow-y-hidden{overflow-y:hidden}.swagger-ui .overflow-y-scroll{overflow-y:scroll}.swagger-ui .overflow-y-auto{overflow-y:auto}@media screen and (min-width:30em){.swagger-ui .overflow-visible-ns{overflow:visible}.swagger-ui .overflow-hidden-ns{overflow:hidden}.swagger-ui .overflow-scroll-ns{overflow:scroll}.swagger-ui .overflow-auto-ns{overflow:auto}.swagger-ui .overflow-x-visible-ns{overflow-x:visible}.swagger-ui .overflow-x-hidden-ns{overflow-x:hidden}.swagger-ui .overflow-x-scroll-ns{overflow-x:scroll}.swagger-ui .overflow-x-auto-ns{overflow-x:auto}.swagger-ui .overflow-y-visible-ns{overflow-y:visible}.swagger-ui .overflow-y-hidden-ns{overflow-y:hidden}.swagger-ui .overflow-y-scroll-ns{overflow-y:scroll}.swagger-ui .overflow-y-auto-ns{overflow-y:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .overflow-visible-m{overflow:visible}.swagger-ui .overflow-hidden-m{overflow:hidden}.swagger-ui .overflow-scroll-m{overflow:scroll}.swagger-ui .overflow-auto-m{overflow:auto}.swagger-ui .overflow-x-visible-m{overflow-x:visible}.swagger-ui .overflow-x-hidden-m{overflow-x:hidden}.swagger-ui .overflow-x-scroll-m{overflow-x:scroll}.swagger-ui .overflow-x-auto-m{overflow-x:auto}.swagger-ui .overflow-y-visible-m{overflow-y:visible}.swagger-ui .overflow-y-hidden-m{overflow-y:hidden}.swagger-ui .overflow-y-scroll-m{overflow-y:scroll}.swagger-ui .overflow-y-auto-m{overflow-y:auto}}@media screen and (min-width:60em){.swagger-ui .overflow-visible-l{overflow:visible}.swagger-ui .overflow-hidden-l{overflow:hidden}.swagger-ui .overflow-scroll-l{overflow:scroll}.swagger-ui .overflow-auto-l{overflow:auto}.swagger-ui .overflow-x-visible-l{overflow-x:visible}.swagger-ui .overflow-x-hidden-l{overflow-x:hidden}.swagger-ui .overflow-x-scroll-l{overflow-x:scroll}.swagger-ui .overflow-x-auto-l{overflow-x:auto}.swagger-ui .overflow-y-visible-l{overflow-y:visible}.swagger-ui .overflow-y-hidden-l{overflow-y:hidden}.swagger-ui .overflow-y-scroll-l{overflow-y:scroll}.swagger-ui .overflow-y-auto-l{overflow-y:auto}}.swagger-ui .static{position:static}.swagger-ui .relative{position:relative}.swagger-ui .absolute{position:absolute}.swagger-ui .fixed{position:fixed}@media screen and (min-width:30em){.swagger-ui .static-ns{position:static}.swagger-ui .relative-ns{position:relative}.swagger-ui .absolute-ns{position:absolute}.swagger-ui .fixed-ns{position:fixed}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .static-m{position:static}.swagger-ui .relative-m{position:relative}.swagger-ui .absolute-m{position:absolute}.swagger-ui .fixed-m{position:fixed}}@media screen and (min-width:60em){.swagger-ui .static-l{position:static}.swagger-ui .relative-l{position:relative}.swagger-ui .absolute-l{position:absolute}.swagger-ui .fixed-l{position:fixed}}.swagger-ui .o-100{opacity:1}.swagger-ui .o-90{opacity:.9}.swagger-ui .o-80{opacity:.8}.swagger-ui .o-70{opacity:.7}.swagger-ui .o-60{opacity:.6}.swagger-ui .o-50{opacity:.5}.swagger-ui .o-40{opacity:.4}.swagger-ui .o-30{opacity:.3}.swagger-ui .o-20{opacity:.2}.swagger-ui .o-10{opacity:.1}.swagger-ui .o-05{opacity:.05}.swagger-ui .o-025{opacity:.025}.swagger-ui .o-0{opacity:0}.swagger-ui .rotate-45{transform:rotate(45deg)}.swagger-ui .rotate-90{transform:rotate(90deg)}.swagger-ui .rotate-135{transform:rotate(135deg)}.swagger-ui .rotate-180{transform:rotate(180deg)}.swagger-ui .rotate-225{transform:rotate(225deg)}.swagger-ui .rotate-270{transform:rotate(270deg)}.swagger-ui .rotate-315{transform:rotate(315deg)}@media screen and (min-width:30em){.swagger-ui .rotate-45-ns{transform:rotate(45deg)}.swagger-ui .rotate-90-ns{transform:rotate(90deg)}.swagger-ui .rotate-135-ns{transform:rotate(135deg)}.swagger-ui .rotate-180-ns{transform:rotate(180deg)}.swagger-ui .rotate-225-ns{transform:rotate(225deg)}.swagger-ui .rotate-270-ns{transform:rotate(270deg)}.swagger-ui .rotate-315-ns{transform:rotate(315deg)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .rotate-45-m{transform:rotate(45deg)}.swagger-ui .rotate-90-m{transform:rotate(90deg)}.swagger-ui .rotate-135-m{transform:rotate(135deg)}.swagger-ui .rotate-180-m{transform:rotate(180deg)}.swagger-ui .rotate-225-m{transform:rotate(225deg)}.swagger-ui .rotate-270-m{transform:rotate(270deg)}.swagger-ui .rotate-315-m{transform:rotate(315deg)}}@media screen and (min-width:60em){.swagger-ui .rotate-45-l{transform:rotate(45deg)}.swagger-ui .rotate-90-l{transform:rotate(90deg)}.swagger-ui .rotate-135-l{transform:rotate(135deg)}.swagger-ui .rotate-180-l{transform:rotate(180deg)}.swagger-ui .rotate-225-l{transform:rotate(225deg)}.swagger-ui .rotate-270-l{transform:rotate(270deg)}.swagger-ui .rotate-315-l{transform:rotate(315deg)}}.swagger-ui .black-90{color:rgba(0,0,0,.9)}.swagger-ui .black-80{color:rgba(0,0,0,.8)}.swagger-ui .black-70{color:rgba(0,0,0,.7)}.swagger-ui .black-60{color:rgba(0,0,0,.6)}.swagger-ui .black-50{color:rgba(0,0,0,.5)}.swagger-ui .black-40{color:rgba(0,0,0,.4)}.swagger-ui .black-30{color:rgba(0,0,0,.3)}.swagger-ui .black-20{color:rgba(0,0,0,.2)}.swagger-ui .black-10{color:rgba(0,0,0,.1)}.swagger-ui .black-05{color:rgba(0,0,0,.05)}.swagger-ui .white-90{color:hsla(0,0%,100%,.9)}.swagger-ui .white-80{color:hsla(0,0%,100%,.8)}.swagger-ui .white-70{color:hsla(0,0%,100%,.7)}.swagger-ui .white-60{color:hsla(0,0%,100%,.6)}.swagger-ui .white-50{color:hsla(0,0%,100%,.5)}.swagger-ui .white-40{color:hsla(0,0%,100%,.4)}.swagger-ui .white-30{color:hsla(0,0%,100%,.3)}.swagger-ui .white-20{color:hsla(0,0%,100%,.2)}.swagger-ui .white-10{color:hsla(0,0%,100%,.1)}.swagger-ui .black{color:#000}.swagger-ui .near-black{color:#111}.swagger-ui .dark-gray{color:#333}.swagger-ui .mid-gray{color:#555}.swagger-ui .gray{color:#777}.swagger-ui .silver{color:#999}.swagger-ui .light-silver{color:#aaa}.swagger-ui .moon-gray{color:#ccc}.swagger-ui .light-gray{color:#eee}.swagger-ui .near-white{color:#f4f4f4}.swagger-ui .white{color:#fff}.swagger-ui .dark-red{color:#e7040f}.swagger-ui .red{color:#ff4136}.swagger-ui .light-red{color:#ff725c}.swagger-ui .orange{color:#ff6300}.swagger-ui .gold{color:#ffb700}.swagger-ui .yellow{color:gold}.swagger-ui .light-yellow{color:#fbf1a9}.swagger-ui .purple{color:#5e2ca5}.swagger-ui .light-purple{color:#a463f2}.swagger-ui .dark-pink{color:#d5008f}.swagger-ui .hot-pink{color:#ff41b4}.swagger-ui .pink{color:#ff80cc}.swagger-ui .light-pink{color:#ffa3d7}.swagger-ui .dark-green{color:#137752}.swagger-ui .green{color:#19a974}.swagger-ui .light-green{color:#9eebcf}.swagger-ui .navy{color:#001b44}.swagger-ui .dark-blue{color:#00449e}.swagger-ui .blue{color:#357edd}.swagger-ui .light-blue{color:#96ccff}.swagger-ui .lightest-blue{color:#cdecff}.swagger-ui .washed-blue{color:#f6fffe}.swagger-ui .washed-green{color:#e8fdf5}.swagger-ui .washed-yellow{color:#fffceb}.swagger-ui .washed-red{color:#ffdfdf}.swagger-ui .color-inherit{color:inherit}.swagger-ui .bg-black-90{background-color:rgba(0,0,0,.9)}.swagger-ui .bg-black-80{background-color:rgba(0,0,0,.8)}.swagger-ui .bg-black-70{background-color:rgba(0,0,0,.7)}.swagger-ui .bg-black-60{background-color:rgba(0,0,0,.6)}.swagger-ui .bg-black-50{background-color:rgba(0,0,0,.5)}.swagger-ui .bg-black-40{background-color:rgba(0,0,0,.4)}.swagger-ui .bg-black-30{background-color:rgba(0,0,0,.3)}.swagger-ui .bg-black-20{background-color:rgba(0,0,0,.2)}.swagger-ui .bg-black-10{background-color:rgba(0,0,0,.1)}.swagger-ui .bg-black-05{background-color:rgba(0,0,0,.05)}.swagger-ui .bg-white-90{background-color:hsla(0,0%,100%,.9)}.swagger-ui .bg-white-80{background-color:hsla(0,0%,100%,.8)}.swagger-ui .bg-white-70{background-color:hsla(0,0%,100%,.7)}.swagger-ui .bg-white-60{background-color:hsla(0,0%,100%,.6)}.swagger-ui .bg-white-50{background-color:hsla(0,0%,100%,.5)}.swagger-ui .bg-white-40{background-color:hsla(0,0%,100%,.4)}.swagger-ui .bg-white-30{background-color:hsla(0,0%,100%,.3)}.swagger-ui .bg-white-20{background-color:hsla(0,0%,100%,.2)}.swagger-ui .bg-white-10{background-color:hsla(0,0%,100%,.1)}.swagger-ui .bg-black{background-color:#000}.swagger-ui .bg-near-black{background-color:#111}.swagger-ui .bg-dark-gray{background-color:#333}.swagger-ui .bg-mid-gray{background-color:#555}.swagger-ui .bg-gray{background-color:#777}.swagger-ui .bg-silver{background-color:#999}.swagger-ui .bg-light-silver{background-color:#aaa}.swagger-ui .bg-moon-gray{background-color:#ccc}.swagger-ui .bg-light-gray{background-color:#eee}.swagger-ui .bg-near-white{background-color:#f4f4f4}.swagger-ui .bg-white{background-color:#fff}.swagger-ui .bg-transparent{background-color:transparent}.swagger-ui .bg-dark-red{background-color:#e7040f}.swagger-ui .bg-red{background-color:#ff4136}.swagger-ui .bg-light-red{background-color:#ff725c}.swagger-ui .bg-orange{background-color:#ff6300}.swagger-ui .bg-gold{background-color:#ffb700}.swagger-ui .bg-yellow{background-color:gold}.swagger-ui .bg-light-yellow{background-color:#fbf1a9}.swagger-ui .bg-purple{background-color:#5e2ca5}.swagger-ui .bg-light-purple{background-color:#a463f2}.swagger-ui .bg-dark-pink{background-color:#d5008f}.swagger-ui .bg-hot-pink{background-color:#ff41b4}.swagger-ui .bg-pink{background-color:#ff80cc}.swagger-ui .bg-light-pink{background-color:#ffa3d7}.swagger-ui .bg-dark-green{background-color:#137752}.swagger-ui .bg-green{background-color:#19a974}.swagger-ui .bg-light-green{background-color:#9eebcf}.swagger-ui .bg-navy{background-color:#001b44}.swagger-ui .bg-dark-blue{background-color:#00449e}.swagger-ui .bg-blue{background-color:#357edd}.swagger-ui .bg-light-blue{background-color:#96ccff}.swagger-ui .bg-lightest-blue{background-color:#cdecff}.swagger-ui .bg-washed-blue{background-color:#f6fffe}.swagger-ui .bg-washed-green{background-color:#e8fdf5}.swagger-ui .bg-washed-yellow{background-color:#fffceb}.swagger-ui .bg-washed-red{background-color:#ffdfdf}.swagger-ui .bg-inherit{background-color:inherit}.swagger-ui .hover-black:focus,.swagger-ui .hover-black:hover{color:#000}.swagger-ui .hover-near-black:focus,.swagger-ui .hover-near-black:hover{color:#111}.swagger-ui .hover-dark-gray:focus,.swagger-ui .hover-dark-gray:hover{color:#333}.swagger-ui .hover-mid-gray:focus,.swagger-ui .hover-mid-gray:hover{color:#555}.swagger-ui .hover-gray:focus,.swagger-ui .hover-gray:hover{color:#777}.swagger-ui .hover-silver:focus,.swagger-ui .hover-silver:hover{color:#999}.swagger-ui .hover-light-silver:focus,.swagger-ui .hover-light-silver:hover{color:#aaa}.swagger-ui .hover-moon-gray:focus,.swagger-ui .hover-moon-gray:hover{color:#ccc}.swagger-ui .hover-light-gray:focus,.swagger-ui .hover-light-gray:hover{color:#eee}.swagger-ui .hover-near-white:focus,.swagger-ui .hover-near-white:hover{color:#f4f4f4}.swagger-ui .hover-white:focus,.swagger-ui .hover-white:hover{color:#fff}.swagger-ui .hover-black-90:focus,.swagger-ui .hover-black-90:hover{color:rgba(0,0,0,.9)}.swagger-ui .hover-black-80:focus,.swagger-ui .hover-black-80:hover{color:rgba(0,0,0,.8)}.swagger-ui .hover-black-70:focus,.swagger-ui .hover-black-70:hover{color:rgba(0,0,0,.7)}.swagger-ui .hover-black-60:focus,.swagger-ui .hover-black-60:hover{color:rgba(0,0,0,.6)}.swagger-ui .hover-black-50:focus,.swagger-ui .hover-black-50:hover{color:rgba(0,0,0,.5)}.swagger-ui .hover-black-40:focus,.swagger-ui .hover-black-40:hover{color:rgba(0,0,0,.4)}.swagger-ui .hover-black-30:focus,.swagger-ui .hover-black-30:hover{color:rgba(0,0,0,.3)}.swagger-ui .hover-black-20:focus,.swagger-ui .hover-black-20:hover{color:rgba(0,0,0,.2)}.swagger-ui .hover-black-10:focus,.swagger-ui .hover-black-10:hover{color:rgba(0,0,0,.1)}.swagger-ui .hover-white-90:focus,.swagger-ui .hover-white-90:hover{color:hsla(0,0%,100%,.9)}.swagger-ui .hover-white-80:focus,.swagger-ui .hover-white-80:hover{color:hsla(0,0%,100%,.8)}.swagger-ui .hover-white-70:focus,.swagger-ui .hover-white-70:hover{color:hsla(0,0%,100%,.7)}.swagger-ui .hover-white-60:focus,.swagger-ui .hover-white-60:hover{color:hsla(0,0%,100%,.6)}.swagger-ui .hover-white-50:focus,.swagger-ui .hover-white-50:hover{color:hsla(0,0%,100%,.5)}.swagger-ui .hover-white-40:focus,.swagger-ui .hover-white-40:hover{color:hsla(0,0%,100%,.4)}.swagger-ui .hover-white-30:focus,.swagger-ui .hover-white-30:hover{color:hsla(0,0%,100%,.3)}.swagger-ui .hover-white-20:focus,.swagger-ui .hover-white-20:hover{color:hsla(0,0%,100%,.2)}.swagger-ui .hover-white-10:focus,.swagger-ui .hover-white-10:hover{color:hsla(0,0%,100%,.1)}.swagger-ui .hover-inherit:focus,.swagger-ui .hover-inherit:hover{color:inherit}.swagger-ui .hover-bg-black:focus,.swagger-ui .hover-bg-black:hover{background-color:#000}.swagger-ui .hover-bg-near-black:focus,.swagger-ui .hover-bg-near-black:hover{background-color:#111}.swagger-ui .hover-bg-dark-gray:focus,.swagger-ui .hover-bg-dark-gray:hover{background-color:#333}.swagger-ui .hover-bg-mid-gray:focus,.swagger-ui .hover-bg-mid-gray:hover{background-color:#555}.swagger-ui .hover-bg-gray:focus,.swagger-ui .hover-bg-gray:hover{background-color:#777}.swagger-ui .hover-bg-silver:focus,.swagger-ui .hover-bg-silver:hover{background-color:#999}.swagger-ui .hover-bg-light-silver:focus,.swagger-ui .hover-bg-light-silver:hover{background-color:#aaa}.swagger-ui .hover-bg-moon-gray:focus,.swagger-ui .hover-bg-moon-gray:hover{background-color:#ccc}.swagger-ui .hover-bg-light-gray:focus,.swagger-ui .hover-bg-light-gray:hover{background-color:#eee}.swagger-ui .hover-bg-near-white:focus,.swagger-ui .hover-bg-near-white:hover{background-color:#f4f4f4}.swagger-ui .hover-bg-white:focus,.swagger-ui .hover-bg-white:hover{background-color:#fff}.swagger-ui .hover-bg-transparent:focus,.swagger-ui .hover-bg-transparent:hover{background-color:transparent}.swagger-ui .hover-bg-black-90:focus,.swagger-ui .hover-bg-black-90:hover{background-color:rgba(0,0,0,.9)}.swagger-ui .hover-bg-black-80:focus,.swagger-ui .hover-bg-black-80:hover{background-color:rgba(0,0,0,.8)}.swagger-ui .hover-bg-black-70:focus,.swagger-ui .hover-bg-black-70:hover{background-color:rgba(0,0,0,.7)}.swagger-ui .hover-bg-black-60:focus,.swagger-ui .hover-bg-black-60:hover{background-color:rgba(0,0,0,.6)}.swagger-ui .hover-bg-black-50:focus,.swagger-ui .hover-bg-black-50:hover{background-color:rgba(0,0,0,.5)}.swagger-ui .hover-bg-black-40:focus,.swagger-ui .hover-bg-black-40:hover{background-color:rgba(0,0,0,.4)}.swagger-ui .hover-bg-black-30:focus,.swagger-ui .hover-bg-black-30:hover{background-color:rgba(0,0,0,.3)}.swagger-ui .hover-bg-black-20:focus,.swagger-ui .hover-bg-black-20:hover{background-color:rgba(0,0,0,.2)}.swagger-ui .hover-bg-black-10:focus,.swagger-ui .hover-bg-black-10:hover{background-color:rgba(0,0,0,.1)}.swagger-ui .hover-bg-white-90:focus,.swagger-ui .hover-bg-white-90:hover{background-color:hsla(0,0%,100%,.9)}.swagger-ui .hover-bg-white-80:focus,.swagger-ui .hover-bg-white-80:hover{background-color:hsla(0,0%,100%,.8)}.swagger-ui .hover-bg-white-70:focus,.swagger-ui .hover-bg-white-70:hover{background-color:hsla(0,0%,100%,.7)}.swagger-ui .hover-bg-white-60:focus,.swagger-ui .hover-bg-white-60:hover{background-color:hsla(0,0%,100%,.6)}.swagger-ui .hover-bg-white-50:focus,.swagger-ui .hover-bg-white-50:hover{background-color:hsla(0,0%,100%,.5)}.swagger-ui .hover-bg-white-40:focus,.swagger-ui .hover-bg-white-40:hover{background-color:hsla(0,0%,100%,.4)}.swagger-ui .hover-bg-white-30:focus,.swagger-ui .hover-bg-white-30:hover{background-color:hsla(0,0%,100%,.3)}.swagger-ui .hover-bg-white-20:focus,.swagger-ui .hover-bg-white-20:hover{background-color:hsla(0,0%,100%,.2)}.swagger-ui .hover-bg-white-10:focus,.swagger-ui .hover-bg-white-10:hover{background-color:hsla(0,0%,100%,.1)}.swagger-ui .hover-dark-red:focus,.swagger-ui .hover-dark-red:hover{color:#e7040f}.swagger-ui .hover-red:focus,.swagger-ui .hover-red:hover{color:#ff4136}.swagger-ui .hover-light-red:focus,.swagger-ui .hover-light-red:hover{color:#ff725c}.swagger-ui .hover-orange:focus,.swagger-ui .hover-orange:hover{color:#ff6300}.swagger-ui .hover-gold:focus,.swagger-ui .hover-gold:hover{color:#ffb700}.swagger-ui .hover-yellow:focus,.swagger-ui .hover-yellow:hover{color:gold}.swagger-ui .hover-light-yellow:focus,.swagger-ui .hover-light-yellow:hover{color:#fbf1a9}.swagger-ui .hover-purple:focus,.swagger-ui .hover-purple:hover{color:#5e2ca5}.swagger-ui .hover-light-purple:focus,.swagger-ui .hover-light-purple:hover{color:#a463f2}.swagger-ui .hover-dark-pink:focus,.swagger-ui .hover-dark-pink:hover{color:#d5008f}.swagger-ui .hover-hot-pink:focus,.swagger-ui .hover-hot-pink:hover{color:#ff41b4}.swagger-ui .hover-pink:focus,.swagger-ui .hover-pink:hover{color:#ff80cc}.swagger-ui .hover-light-pink:focus,.swagger-ui .hover-light-pink:hover{color:#ffa3d7}.swagger-ui .hover-dark-green:focus,.swagger-ui .hover-dark-green:hover{color:#137752}.swagger-ui .hover-green:focus,.swagger-ui .hover-green:hover{color:#19a974}.swagger-ui .hover-light-green:focus,.swagger-ui .hover-light-green:hover{color:#9eebcf}.swagger-ui .hover-navy:focus,.swagger-ui .hover-navy:hover{color:#001b44}.swagger-ui .hover-dark-blue:focus,.swagger-ui .hover-dark-blue:hover{color:#00449e}.swagger-ui .hover-blue:focus,.swagger-ui .hover-blue:hover{color:#357edd}.swagger-ui .hover-light-blue:focus,.swagger-ui .hover-light-blue:hover{color:#96ccff}.swagger-ui .hover-lightest-blue:focus,.swagger-ui .hover-lightest-blue:hover{color:#cdecff}.swagger-ui .hover-washed-blue:focus,.swagger-ui .hover-washed-blue:hover{color:#f6fffe}.swagger-ui .hover-washed-green:focus,.swagger-ui .hover-washed-green:hover{color:#e8fdf5}.swagger-ui .hover-washed-yellow:focus,.swagger-ui .hover-washed-yellow:hover{color:#fffceb}.swagger-ui .hover-washed-red:focus,.swagger-ui .hover-washed-red:hover{color:#ffdfdf}.swagger-ui .hover-bg-dark-red:focus,.swagger-ui .hover-bg-dark-red:hover{background-color:#e7040f}.swagger-ui .hover-bg-red:focus,.swagger-ui .hover-bg-red:hover{background-color:#ff4136}.swagger-ui .hover-bg-light-red:focus,.swagger-ui .hover-bg-light-red:hover{background-color:#ff725c}.swagger-ui .hover-bg-orange:focus,.swagger-ui .hover-bg-orange:hover{background-color:#ff6300}.swagger-ui .hover-bg-gold:focus,.swagger-ui .hover-bg-gold:hover{background-color:#ffb700}.swagger-ui .hover-bg-yellow:focus,.swagger-ui .hover-bg-yellow:hover{background-color:gold}.swagger-ui .hover-bg-light-yellow:focus,.swagger-ui .hover-bg-light-yellow:hover{background-color:#fbf1a9}.swagger-ui .hover-bg-purple:focus,.swagger-ui .hover-bg-purple:hover{background-color:#5e2ca5}.swagger-ui .hover-bg-light-purple:focus,.swagger-ui .hover-bg-light-purple:hover{background-color:#a463f2}.swagger-ui .hover-bg-dark-pink:focus,.swagger-ui .hover-bg-dark-pink:hover{background-color:#d5008f}.swagger-ui .hover-bg-hot-pink:focus,.swagger-ui .hover-bg-hot-pink:hover{background-color:#ff41b4}.swagger-ui .hover-bg-pink:focus,.swagger-ui .hover-bg-pink:hover{background-color:#ff80cc}.swagger-ui .hover-bg-light-pink:focus,.swagger-ui .hover-bg-light-pink:hover{background-color:#ffa3d7}.swagger-ui .hover-bg-dark-green:focus,.swagger-ui .hover-bg-dark-green:hover{background-color:#137752}.swagger-ui .hover-bg-green:focus,.swagger-ui .hover-bg-green:hover{background-color:#19a974}.swagger-ui .hover-bg-light-green:focus,.swagger-ui .hover-bg-light-green:hover{background-color:#9eebcf}.swagger-ui .hover-bg-navy:focus,.swagger-ui .hover-bg-navy:hover{background-color:#001b44}.swagger-ui .hover-bg-dark-blue:focus,.swagger-ui .hover-bg-dark-blue:hover{background-color:#00449e}.swagger-ui .hover-bg-blue:focus,.swagger-ui .hover-bg-blue:hover{background-color:#357edd}.swagger-ui .hover-bg-light-blue:focus,.swagger-ui .hover-bg-light-blue:hover{background-color:#96ccff}.swagger-ui .hover-bg-lightest-blue:focus,.swagger-ui .hover-bg-lightest-blue:hover{background-color:#cdecff}.swagger-ui .hover-bg-washed-blue:focus,.swagger-ui .hover-bg-washed-blue:hover{background-color:#f6fffe}.swagger-ui .hover-bg-washed-green:focus,.swagger-ui .hover-bg-washed-green:hover{background-color:#e8fdf5}.swagger-ui .hover-bg-washed-yellow:focus,.swagger-ui .hover-bg-washed-yellow:hover{background-color:#fffceb}.swagger-ui .hover-bg-washed-red:focus,.swagger-ui .hover-bg-washed-red:hover{background-color:#ffdfdf}.swagger-ui .hover-bg-inherit:focus,.swagger-ui .hover-bg-inherit:hover{background-color:inherit}.swagger-ui .pa0{padding:0}.swagger-ui .pa1{padding:.25rem}.swagger-ui .pa2{padding:.5rem}.swagger-ui .pa3{padding:1rem}.swagger-ui .pa4{padding:2rem}.swagger-ui .pa5{padding:4rem}.swagger-ui .pa6{padding:8rem}.swagger-ui .pa7{padding:16rem}.swagger-ui .pl0{padding-left:0}.swagger-ui .pl1{padding-left:.25rem}.swagger-ui .pl2{padding-left:.5rem}.swagger-ui .pl3{padding-left:1rem}.swagger-ui .pl4{padding-left:2rem}.swagger-ui .pl5{padding-left:4rem}.swagger-ui .pl6{padding-left:8rem}.swagger-ui .pl7{padding-left:16rem}.swagger-ui .pr0{padding-right:0}.swagger-ui .pr1{padding-right:.25rem}.swagger-ui .pr2{padding-right:.5rem}.swagger-ui .pr3{padding-right:1rem}.swagger-ui .pr4{padding-right:2rem}.swagger-ui .pr5{padding-right:4rem}.swagger-ui .pr6{padding-right:8rem}.swagger-ui .pr7{padding-right:16rem}.swagger-ui .pb0{padding-bottom:0}.swagger-ui .pb1{padding-bottom:.25rem}.swagger-ui .pb2{padding-bottom:.5rem}.swagger-ui .pb3{padding-bottom:1rem}.swagger-ui .pb4{padding-bottom:2rem}.swagger-ui .pb5{padding-bottom:4rem}.swagger-ui .pb6{padding-bottom:8rem}.swagger-ui .pb7{padding-bottom:16rem}.swagger-ui .pt0{padding-top:0}.swagger-ui .pt1{padding-top:.25rem}.swagger-ui .pt2{padding-top:.5rem}.swagger-ui .pt3{padding-top:1rem}.swagger-ui .pt4{padding-top:2rem}.swagger-ui .pt5{padding-top:4rem}.swagger-ui .pt6{padding-top:8rem}.swagger-ui .pt7{padding-top:16rem}.swagger-ui .pv0{padding-bottom:0;padding-top:0}.swagger-ui .pv1{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0{padding-left:0;padding-right:0}.swagger-ui .ph1{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0{margin:0}.swagger-ui .ma1{margin:.25rem}.swagger-ui .ma2{margin:.5rem}.swagger-ui .ma3{margin:1rem}.swagger-ui .ma4{margin:2rem}.swagger-ui .ma5{margin:4rem}.swagger-ui .ma6{margin:8rem}.swagger-ui .ma7{margin:16rem}.swagger-ui .ml0{margin-left:0}.swagger-ui .ml1{margin-left:.25rem}.swagger-ui .ml2{margin-left:.5rem}.swagger-ui .ml3{margin-left:1rem}.swagger-ui .ml4{margin-left:2rem}.swagger-ui .ml5{margin-left:4rem}.swagger-ui .ml6{margin-left:8rem}.swagger-ui .ml7{margin-left:16rem}.swagger-ui .mr0{margin-right:0}.swagger-ui .mr1{margin-right:.25rem}.swagger-ui .mr2{margin-right:.5rem}.swagger-ui .mr3{margin-right:1rem}.swagger-ui .mr4{margin-right:2rem}.swagger-ui .mr5{margin-right:4rem}.swagger-ui .mr6{margin-right:8rem}.swagger-ui .mr7{margin-right:16rem}.swagger-ui .mb0{margin-bottom:0}.swagger-ui .mb1{margin-bottom:.25rem}.swagger-ui .mb2{margin-bottom:.5rem}.swagger-ui .mb3{margin-bottom:1rem}.swagger-ui .mb4{margin-bottom:2rem}.swagger-ui .mb5{margin-bottom:4rem}.swagger-ui .mb6{margin-bottom:8rem}.swagger-ui .mb7{margin-bottom:16rem}.swagger-ui .mt0{margin-top:0}.swagger-ui .mt1{margin-top:.25rem}.swagger-ui .mt2{margin-top:.5rem}.swagger-ui .mt3{margin-top:1rem}.swagger-ui .mt4{margin-top:2rem}.swagger-ui .mt5{margin-top:4rem}.swagger-ui .mt6{margin-top:8rem}.swagger-ui .mt7{margin-top:16rem}.swagger-ui .mv0{margin-bottom:0;margin-top:0}.swagger-ui .mv1{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0{margin-left:0;margin-right:0}.swagger-ui .mh1{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7{margin-left:16rem;margin-right:16rem}@media screen and (min-width:30em){.swagger-ui .pa0-ns{padding:0}.swagger-ui .pa1-ns{padding:.25rem}.swagger-ui .pa2-ns{padding:.5rem}.swagger-ui .pa3-ns{padding:1rem}.swagger-ui .pa4-ns{padding:2rem}.swagger-ui .pa5-ns{padding:4rem}.swagger-ui .pa6-ns{padding:8rem}.swagger-ui .pa7-ns{padding:16rem}.swagger-ui .pl0-ns{padding-left:0}.swagger-ui .pl1-ns{padding-left:.25rem}.swagger-ui .pl2-ns{padding-left:.5rem}.swagger-ui .pl3-ns{padding-left:1rem}.swagger-ui .pl4-ns{padding-left:2rem}.swagger-ui .pl5-ns{padding-left:4rem}.swagger-ui .pl6-ns{padding-left:8rem}.swagger-ui .pl7-ns{padding-left:16rem}.swagger-ui .pr0-ns{padding-right:0}.swagger-ui .pr1-ns{padding-right:.25rem}.swagger-ui .pr2-ns{padding-right:.5rem}.swagger-ui .pr3-ns{padding-right:1rem}.swagger-ui .pr4-ns{padding-right:2rem}.swagger-ui .pr5-ns{padding-right:4rem}.swagger-ui .pr6-ns{padding-right:8rem}.swagger-ui .pr7-ns{padding-right:16rem}.swagger-ui .pb0-ns{padding-bottom:0}.swagger-ui .pb1-ns{padding-bottom:.25rem}.swagger-ui .pb2-ns{padding-bottom:.5rem}.swagger-ui .pb3-ns{padding-bottom:1rem}.swagger-ui .pb4-ns{padding-bottom:2rem}.swagger-ui .pb5-ns{padding-bottom:4rem}.swagger-ui .pb6-ns{padding-bottom:8rem}.swagger-ui .pb7-ns{padding-bottom:16rem}.swagger-ui .pt0-ns{padding-top:0}.swagger-ui .pt1-ns{padding-top:.25rem}.swagger-ui .pt2-ns{padding-top:.5rem}.swagger-ui .pt3-ns{padding-top:1rem}.swagger-ui .pt4-ns{padding-top:2rem}.swagger-ui .pt5-ns{padding-top:4rem}.swagger-ui .pt6-ns{padding-top:8rem}.swagger-ui .pt7-ns{padding-top:16rem}.swagger-ui .pv0-ns{padding-bottom:0;padding-top:0}.swagger-ui .pv1-ns{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-ns{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-ns{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-ns{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-ns{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-ns{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-ns{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-ns{padding-left:0;padding-right:0}.swagger-ui .ph1-ns{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-ns{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-ns{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-ns{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-ns{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-ns{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-ns{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-ns{margin:0}.swagger-ui .ma1-ns{margin:.25rem}.swagger-ui .ma2-ns{margin:.5rem}.swagger-ui .ma3-ns{margin:1rem}.swagger-ui .ma4-ns{margin:2rem}.swagger-ui .ma5-ns{margin:4rem}.swagger-ui .ma6-ns{margin:8rem}.swagger-ui .ma7-ns{margin:16rem}.swagger-ui .ml0-ns{margin-left:0}.swagger-ui .ml1-ns{margin-left:.25rem}.swagger-ui .ml2-ns{margin-left:.5rem}.swagger-ui .ml3-ns{margin-left:1rem}.swagger-ui .ml4-ns{margin-left:2rem}.swagger-ui .ml5-ns{margin-left:4rem}.swagger-ui .ml6-ns{margin-left:8rem}.swagger-ui .ml7-ns{margin-left:16rem}.swagger-ui .mr0-ns{margin-right:0}.swagger-ui .mr1-ns{margin-right:.25rem}.swagger-ui .mr2-ns{margin-right:.5rem}.swagger-ui .mr3-ns{margin-right:1rem}.swagger-ui .mr4-ns{margin-right:2rem}.swagger-ui .mr5-ns{margin-right:4rem}.swagger-ui .mr6-ns{margin-right:8rem}.swagger-ui .mr7-ns{margin-right:16rem}.swagger-ui .mb0-ns{margin-bottom:0}.swagger-ui .mb1-ns{margin-bottom:.25rem}.swagger-ui .mb2-ns{margin-bottom:.5rem}.swagger-ui .mb3-ns{margin-bottom:1rem}.swagger-ui .mb4-ns{margin-bottom:2rem}.swagger-ui .mb5-ns{margin-bottom:4rem}.swagger-ui .mb6-ns{margin-bottom:8rem}.swagger-ui .mb7-ns{margin-bottom:16rem}.swagger-ui .mt0-ns{margin-top:0}.swagger-ui .mt1-ns{margin-top:.25rem}.swagger-ui .mt2-ns{margin-top:.5rem}.swagger-ui .mt3-ns{margin-top:1rem}.swagger-ui .mt4-ns{margin-top:2rem}.swagger-ui .mt5-ns{margin-top:4rem}.swagger-ui .mt6-ns{margin-top:8rem}.swagger-ui .mt7-ns{margin-top:16rem}.swagger-ui .mv0-ns{margin-bottom:0;margin-top:0}.swagger-ui .mv1-ns{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-ns{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-ns{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-ns{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-ns{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-ns{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-ns{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-ns{margin-left:0;margin-right:0}.swagger-ui .mh1-ns{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-ns{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-ns{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-ns{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-ns{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-ns{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-ns{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .pa0-m{padding:0}.swagger-ui .pa1-m{padding:.25rem}.swagger-ui .pa2-m{padding:.5rem}.swagger-ui .pa3-m{padding:1rem}.swagger-ui .pa4-m{padding:2rem}.swagger-ui .pa5-m{padding:4rem}.swagger-ui .pa6-m{padding:8rem}.swagger-ui .pa7-m{padding:16rem}.swagger-ui .pl0-m{padding-left:0}.swagger-ui .pl1-m{padding-left:.25rem}.swagger-ui .pl2-m{padding-left:.5rem}.swagger-ui .pl3-m{padding-left:1rem}.swagger-ui .pl4-m{padding-left:2rem}.swagger-ui .pl5-m{padding-left:4rem}.swagger-ui .pl6-m{padding-left:8rem}.swagger-ui .pl7-m{padding-left:16rem}.swagger-ui .pr0-m{padding-right:0}.swagger-ui .pr1-m{padding-right:.25rem}.swagger-ui .pr2-m{padding-right:.5rem}.swagger-ui .pr3-m{padding-right:1rem}.swagger-ui .pr4-m{padding-right:2rem}.swagger-ui .pr5-m{padding-right:4rem}.swagger-ui .pr6-m{padding-right:8rem}.swagger-ui .pr7-m{padding-right:16rem}.swagger-ui .pb0-m{padding-bottom:0}.swagger-ui .pb1-m{padding-bottom:.25rem}.swagger-ui .pb2-m{padding-bottom:.5rem}.swagger-ui .pb3-m{padding-bottom:1rem}.swagger-ui .pb4-m{padding-bottom:2rem}.swagger-ui .pb5-m{padding-bottom:4rem}.swagger-ui .pb6-m{padding-bottom:8rem}.swagger-ui .pb7-m{padding-bottom:16rem}.swagger-ui .pt0-m{padding-top:0}.swagger-ui .pt1-m{padding-top:.25rem}.swagger-ui .pt2-m{padding-top:.5rem}.swagger-ui .pt3-m{padding-top:1rem}.swagger-ui .pt4-m{padding-top:2rem}.swagger-ui .pt5-m{padding-top:4rem}.swagger-ui .pt6-m{padding-top:8rem}.swagger-ui .pt7-m{padding-top:16rem}.swagger-ui .pv0-m{padding-bottom:0;padding-top:0}.swagger-ui .pv1-m{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-m{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-m{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-m{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-m{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-m{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-m{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-m{padding-left:0;padding-right:0}.swagger-ui .ph1-m{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-m{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-m{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-m{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-m{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-m{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-m{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-m{margin:0}.swagger-ui .ma1-m{margin:.25rem}.swagger-ui .ma2-m{margin:.5rem}.swagger-ui .ma3-m{margin:1rem}.swagger-ui .ma4-m{margin:2rem}.swagger-ui .ma5-m{margin:4rem}.swagger-ui .ma6-m{margin:8rem}.swagger-ui .ma7-m{margin:16rem}.swagger-ui .ml0-m{margin-left:0}.swagger-ui .ml1-m{margin-left:.25rem}.swagger-ui .ml2-m{margin-left:.5rem}.swagger-ui .ml3-m{margin-left:1rem}.swagger-ui .ml4-m{margin-left:2rem}.swagger-ui .ml5-m{margin-left:4rem}.swagger-ui .ml6-m{margin-left:8rem}.swagger-ui .ml7-m{margin-left:16rem}.swagger-ui .mr0-m{margin-right:0}.swagger-ui .mr1-m{margin-right:.25rem}.swagger-ui .mr2-m{margin-right:.5rem}.swagger-ui .mr3-m{margin-right:1rem}.swagger-ui .mr4-m{margin-right:2rem}.swagger-ui .mr5-m{margin-right:4rem}.swagger-ui .mr6-m{margin-right:8rem}.swagger-ui .mr7-m{margin-right:16rem}.swagger-ui .mb0-m{margin-bottom:0}.swagger-ui .mb1-m{margin-bottom:.25rem}.swagger-ui .mb2-m{margin-bottom:.5rem}.swagger-ui .mb3-m{margin-bottom:1rem}.swagger-ui .mb4-m{margin-bottom:2rem}.swagger-ui .mb5-m{margin-bottom:4rem}.swagger-ui .mb6-m{margin-bottom:8rem}.swagger-ui .mb7-m{margin-bottom:16rem}.swagger-ui .mt0-m{margin-top:0}.swagger-ui .mt1-m{margin-top:.25rem}.swagger-ui .mt2-m{margin-top:.5rem}.swagger-ui .mt3-m{margin-top:1rem}.swagger-ui .mt4-m{margin-top:2rem}.swagger-ui .mt5-m{margin-top:4rem}.swagger-ui .mt6-m{margin-top:8rem}.swagger-ui .mt7-m{margin-top:16rem}.swagger-ui .mv0-m{margin-bottom:0;margin-top:0}.swagger-ui .mv1-m{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-m{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-m{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-m{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-m{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-m{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-m{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-m{margin-left:0;margin-right:0}.swagger-ui .mh1-m{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-m{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-m{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-m{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-m{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-m{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-m{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:60em){.swagger-ui .pa0-l{padding:0}.swagger-ui .pa1-l{padding:.25rem}.swagger-ui .pa2-l{padding:.5rem}.swagger-ui .pa3-l{padding:1rem}.swagger-ui .pa4-l{padding:2rem}.swagger-ui .pa5-l{padding:4rem}.swagger-ui .pa6-l{padding:8rem}.swagger-ui .pa7-l{padding:16rem}.swagger-ui .pl0-l{padding-left:0}.swagger-ui .pl1-l{padding-left:.25rem}.swagger-ui .pl2-l{padding-left:.5rem}.swagger-ui .pl3-l{padding-left:1rem}.swagger-ui .pl4-l{padding-left:2rem}.swagger-ui .pl5-l{padding-left:4rem}.swagger-ui .pl6-l{padding-left:8rem}.swagger-ui .pl7-l{padding-left:16rem}.swagger-ui .pr0-l{padding-right:0}.swagger-ui .pr1-l{padding-right:.25rem}.swagger-ui .pr2-l{padding-right:.5rem}.swagger-ui .pr3-l{padding-right:1rem}.swagger-ui .pr4-l{padding-right:2rem}.swagger-ui .pr5-l{padding-right:4rem}.swagger-ui .pr6-l{padding-right:8rem}.swagger-ui .pr7-l{padding-right:16rem}.swagger-ui .pb0-l{padding-bottom:0}.swagger-ui .pb1-l{padding-bottom:.25rem}.swagger-ui .pb2-l{padding-bottom:.5rem}.swagger-ui .pb3-l{padding-bottom:1rem}.swagger-ui .pb4-l{padding-bottom:2rem}.swagger-ui .pb5-l{padding-bottom:4rem}.swagger-ui .pb6-l{padding-bottom:8rem}.swagger-ui .pb7-l{padding-bottom:16rem}.swagger-ui .pt0-l{padding-top:0}.swagger-ui .pt1-l{padding-top:.25rem}.swagger-ui .pt2-l{padding-top:.5rem}.swagger-ui .pt3-l{padding-top:1rem}.swagger-ui .pt4-l{padding-top:2rem}.swagger-ui .pt5-l{padding-top:4rem}.swagger-ui .pt6-l{padding-top:8rem}.swagger-ui .pt7-l{padding-top:16rem}.swagger-ui .pv0-l{padding-bottom:0;padding-top:0}.swagger-ui .pv1-l{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-l{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-l{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-l{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-l{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-l{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-l{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-l{padding-left:0;padding-right:0}.swagger-ui .ph1-l{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-l{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-l{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-l{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-l{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-l{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-l{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-l{margin:0}.swagger-ui .ma1-l{margin:.25rem}.swagger-ui .ma2-l{margin:.5rem}.swagger-ui .ma3-l{margin:1rem}.swagger-ui .ma4-l{margin:2rem}.swagger-ui .ma5-l{margin:4rem}.swagger-ui .ma6-l{margin:8rem}.swagger-ui .ma7-l{margin:16rem}.swagger-ui .ml0-l{margin-left:0}.swagger-ui .ml1-l{margin-left:.25rem}.swagger-ui .ml2-l{margin-left:.5rem}.swagger-ui .ml3-l{margin-left:1rem}.swagger-ui .ml4-l{margin-left:2rem}.swagger-ui .ml5-l{margin-left:4rem}.swagger-ui .ml6-l{margin-left:8rem}.swagger-ui .ml7-l{margin-left:16rem}.swagger-ui .mr0-l{margin-right:0}.swagger-ui .mr1-l{margin-right:.25rem}.swagger-ui .mr2-l{margin-right:.5rem}.swagger-ui .mr3-l{margin-right:1rem}.swagger-ui .mr4-l{margin-right:2rem}.swagger-ui .mr5-l{margin-right:4rem}.swagger-ui .mr6-l{margin-right:8rem}.swagger-ui .mr7-l{margin-right:16rem}.swagger-ui .mb0-l{margin-bottom:0}.swagger-ui .mb1-l{margin-bottom:.25rem}.swagger-ui .mb2-l{margin-bottom:.5rem}.swagger-ui .mb3-l{margin-bottom:1rem}.swagger-ui .mb4-l{margin-bottom:2rem}.swagger-ui .mb5-l{margin-bottom:4rem}.swagger-ui .mb6-l{margin-bottom:8rem}.swagger-ui .mb7-l{margin-bottom:16rem}.swagger-ui .mt0-l{margin-top:0}.swagger-ui .mt1-l{margin-top:.25rem}.swagger-ui .mt2-l{margin-top:.5rem}.swagger-ui .mt3-l{margin-top:1rem}.swagger-ui .mt4-l{margin-top:2rem}.swagger-ui .mt5-l{margin-top:4rem}.swagger-ui .mt6-l{margin-top:8rem}.swagger-ui .mt7-l{margin-top:16rem}.swagger-ui .mv0-l{margin-bottom:0;margin-top:0}.swagger-ui .mv1-l{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-l{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-l{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-l{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-l{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-l{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-l{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-l{margin-left:0;margin-right:0}.swagger-ui .mh1-l{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-l{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-l{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-l{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-l{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-l{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-l{margin-left:16rem;margin-right:16rem}}.swagger-ui .na1{margin:-.25rem}.swagger-ui .na2{margin:-.5rem}.swagger-ui .na3{margin:-1rem}.swagger-ui .na4{margin:-2rem}.swagger-ui .na5{margin:-4rem}.swagger-ui .na6{margin:-8rem}.swagger-ui .na7{margin:-16rem}.swagger-ui .nl1{margin-left:-.25rem}.swagger-ui .nl2{margin-left:-.5rem}.swagger-ui .nl3{margin-left:-1rem}.swagger-ui .nl4{margin-left:-2rem}.swagger-ui .nl5{margin-left:-4rem}.swagger-ui .nl6{margin-left:-8rem}.swagger-ui .nl7{margin-left:-16rem}.swagger-ui .nr1{margin-right:-.25rem}.swagger-ui .nr2{margin-right:-.5rem}.swagger-ui .nr3{margin-right:-1rem}.swagger-ui .nr4{margin-right:-2rem}.swagger-ui .nr5{margin-right:-4rem}.swagger-ui .nr6{margin-right:-8rem}.swagger-ui .nr7{margin-right:-16rem}.swagger-ui .nb1{margin-bottom:-.25rem}.swagger-ui .nb2{margin-bottom:-.5rem}.swagger-ui .nb3{margin-bottom:-1rem}.swagger-ui .nb4{margin-bottom:-2rem}.swagger-ui .nb5{margin-bottom:-4rem}.swagger-ui .nb6{margin-bottom:-8rem}.swagger-ui .nb7{margin-bottom:-16rem}.swagger-ui .nt1{margin-top:-.25rem}.swagger-ui .nt2{margin-top:-.5rem}.swagger-ui .nt3{margin-top:-1rem}.swagger-ui .nt4{margin-top:-2rem}.swagger-ui .nt5{margin-top:-4rem}.swagger-ui .nt6{margin-top:-8rem}.swagger-ui .nt7{margin-top:-16rem}@media screen and (min-width:30em){.swagger-ui .na1-ns{margin:-.25rem}.swagger-ui .na2-ns{margin:-.5rem}.swagger-ui .na3-ns{margin:-1rem}.swagger-ui .na4-ns{margin:-2rem}.swagger-ui .na5-ns{margin:-4rem}.swagger-ui .na6-ns{margin:-8rem}.swagger-ui .na7-ns{margin:-16rem}.swagger-ui .nl1-ns{margin-left:-.25rem}.swagger-ui .nl2-ns{margin-left:-.5rem}.swagger-ui .nl3-ns{margin-left:-1rem}.swagger-ui .nl4-ns{margin-left:-2rem}.swagger-ui .nl5-ns{margin-left:-4rem}.swagger-ui .nl6-ns{margin-left:-8rem}.swagger-ui .nl7-ns{margin-left:-16rem}.swagger-ui .nr1-ns{margin-right:-.25rem}.swagger-ui .nr2-ns{margin-right:-.5rem}.swagger-ui .nr3-ns{margin-right:-1rem}.swagger-ui .nr4-ns{margin-right:-2rem}.swagger-ui .nr5-ns{margin-right:-4rem}.swagger-ui .nr6-ns{margin-right:-8rem}.swagger-ui .nr7-ns{margin-right:-16rem}.swagger-ui .nb1-ns{margin-bottom:-.25rem}.swagger-ui .nb2-ns{margin-bottom:-.5rem}.swagger-ui .nb3-ns{margin-bottom:-1rem}.swagger-ui .nb4-ns{margin-bottom:-2rem}.swagger-ui .nb5-ns{margin-bottom:-4rem}.swagger-ui .nb6-ns{margin-bottom:-8rem}.swagger-ui .nb7-ns{margin-bottom:-16rem}.swagger-ui .nt1-ns{margin-top:-.25rem}.swagger-ui .nt2-ns{margin-top:-.5rem}.swagger-ui .nt3-ns{margin-top:-1rem}.swagger-ui .nt4-ns{margin-top:-2rem}.swagger-ui .nt5-ns{margin-top:-4rem}.swagger-ui .nt6-ns{margin-top:-8rem}.swagger-ui .nt7-ns{margin-top:-16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .na1-m{margin:-.25rem}.swagger-ui .na2-m{margin:-.5rem}.swagger-ui .na3-m{margin:-1rem}.swagger-ui .na4-m{margin:-2rem}.swagger-ui .na5-m{margin:-4rem}.swagger-ui .na6-m{margin:-8rem}.swagger-ui .na7-m{margin:-16rem}.swagger-ui .nl1-m{margin-left:-.25rem}.swagger-ui .nl2-m{margin-left:-.5rem}.swagger-ui .nl3-m{margin-left:-1rem}.swagger-ui .nl4-m{margin-left:-2rem}.swagger-ui .nl5-m{margin-left:-4rem}.swagger-ui .nl6-m{margin-left:-8rem}.swagger-ui .nl7-m{margin-left:-16rem}.swagger-ui .nr1-m{margin-right:-.25rem}.swagger-ui .nr2-m{margin-right:-.5rem}.swagger-ui .nr3-m{margin-right:-1rem}.swagger-ui .nr4-m{margin-right:-2rem}.swagger-ui .nr5-m{margin-right:-4rem}.swagger-ui .nr6-m{margin-right:-8rem}.swagger-ui .nr7-m{margin-right:-16rem}.swagger-ui .nb1-m{margin-bottom:-.25rem}.swagger-ui .nb2-m{margin-bottom:-.5rem}.swagger-ui .nb3-m{margin-bottom:-1rem}.swagger-ui .nb4-m{margin-bottom:-2rem}.swagger-ui .nb5-m{margin-bottom:-4rem}.swagger-ui .nb6-m{margin-bottom:-8rem}.swagger-ui .nb7-m{margin-bottom:-16rem}.swagger-ui .nt1-m{margin-top:-.25rem}.swagger-ui .nt2-m{margin-top:-.5rem}.swagger-ui .nt3-m{margin-top:-1rem}.swagger-ui .nt4-m{margin-top:-2rem}.swagger-ui .nt5-m{margin-top:-4rem}.swagger-ui .nt6-m{margin-top:-8rem}.swagger-ui .nt7-m{margin-top:-16rem}}@media screen and (min-width:60em){.swagger-ui .na1-l{margin:-.25rem}.swagger-ui .na2-l{margin:-.5rem}.swagger-ui .na3-l{margin:-1rem}.swagger-ui .na4-l{margin:-2rem}.swagger-ui .na5-l{margin:-4rem}.swagger-ui .na6-l{margin:-8rem}.swagger-ui .na7-l{margin:-16rem}.swagger-ui .nl1-l{margin-left:-.25rem}.swagger-ui .nl2-l{margin-left:-.5rem}.swagger-ui .nl3-l{margin-left:-1rem}.swagger-ui .nl4-l{margin-left:-2rem}.swagger-ui .nl5-l{margin-left:-4rem}.swagger-ui .nl6-l{margin-left:-8rem}.swagger-ui .nl7-l{margin-left:-16rem}.swagger-ui .nr1-l{margin-right:-.25rem}.swagger-ui .nr2-l{margin-right:-.5rem}.swagger-ui .nr3-l{margin-right:-1rem}.swagger-ui .nr4-l{margin-right:-2rem}.swagger-ui .nr5-l{margin-right:-4rem}.swagger-ui .nr6-l{margin-right:-8rem}.swagger-ui .nr7-l{margin-right:-16rem}.swagger-ui .nb1-l{margin-bottom:-.25rem}.swagger-ui .nb2-l{margin-bottom:-.5rem}.swagger-ui .nb3-l{margin-bottom:-1rem}.swagger-ui .nb4-l{margin-bottom:-2rem}.swagger-ui .nb5-l{margin-bottom:-4rem}.swagger-ui .nb6-l{margin-bottom:-8rem}.swagger-ui .nb7-l{margin-bottom:-16rem}.swagger-ui .nt1-l{margin-top:-.25rem}.swagger-ui .nt2-l{margin-top:-.5rem}.swagger-ui .nt3-l{margin-top:-1rem}.swagger-ui .nt4-l{margin-top:-2rem}.swagger-ui .nt5-l{margin-top:-4rem}.swagger-ui .nt6-l{margin-top:-8rem}.swagger-ui .nt7-l{margin-top:-16rem}}.swagger-ui .collapse{border-collapse:collapse;border-spacing:0}.swagger-ui .striped--light-silver:nth-child(odd){background-color:#aaa}.swagger-ui .striped--moon-gray:nth-child(odd){background-color:#ccc}.swagger-ui .striped--light-gray:nth-child(odd){background-color:#eee}.swagger-ui .striped--near-white:nth-child(odd){background-color:#f4f4f4}.swagger-ui .stripe-light:nth-child(odd){background-color:hsla(0,0%,100%,.1)}.swagger-ui .stripe-dark:nth-child(odd){background-color:rgba(0,0,0,.1)}.swagger-ui .strike{text-decoration:line-through}.swagger-ui .underline{text-decoration:underline}.swagger-ui .no-underline{text-decoration:none}@media screen and (min-width:30em){.swagger-ui .strike-ns{text-decoration:line-through}.swagger-ui .underline-ns{text-decoration:underline}.swagger-ui .no-underline-ns{text-decoration:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .strike-m{text-decoration:line-through}.swagger-ui .underline-m{text-decoration:underline}.swagger-ui .no-underline-m{text-decoration:none}}@media screen and (min-width:60em){.swagger-ui .strike-l{text-decoration:line-through}.swagger-ui .underline-l{text-decoration:underline}.swagger-ui .no-underline-l{text-decoration:none}}.swagger-ui .tl{text-align:left}.swagger-ui .tr{text-align:right}.swagger-ui .tc{text-align:center}.swagger-ui .tj{text-align:justify}@media screen and (min-width:30em){.swagger-ui .tl-ns{text-align:left}.swagger-ui .tr-ns{text-align:right}.swagger-ui .tc-ns{text-align:center}.swagger-ui .tj-ns{text-align:justify}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tl-m{text-align:left}.swagger-ui .tr-m{text-align:right}.swagger-ui .tc-m{text-align:center}.swagger-ui .tj-m{text-align:justify}}@media screen and (min-width:60em){.swagger-ui .tl-l{text-align:left}.swagger-ui .tr-l{text-align:right}.swagger-ui .tc-l{text-align:center}.swagger-ui .tj-l{text-align:justify}}.swagger-ui .ttc{text-transform:capitalize}.swagger-ui .ttl{text-transform:lowercase}.swagger-ui .ttu{text-transform:uppercase}.swagger-ui .ttn{text-transform:none}@media screen and (min-width:30em){.swagger-ui .ttc-ns{text-transform:capitalize}.swagger-ui .ttl-ns{text-transform:lowercase}.swagger-ui .ttu-ns{text-transform:uppercase}.swagger-ui .ttn-ns{text-transform:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ttc-m{text-transform:capitalize}.swagger-ui .ttl-m{text-transform:lowercase}.swagger-ui .ttu-m{text-transform:uppercase}.swagger-ui .ttn-m{text-transform:none}}@media screen and (min-width:60em){.swagger-ui .ttc-l{text-transform:capitalize}.swagger-ui .ttl-l{text-transform:lowercase}.swagger-ui .ttu-l{text-transform:uppercase}.swagger-ui .ttn-l{text-transform:none}}.swagger-ui .f-6,.swagger-ui .f-headline{font-size:6rem}.swagger-ui .f-5,.swagger-ui .f-subheadline{font-size:5rem}.swagger-ui .f1{font-size:3rem}.swagger-ui .f2{font-size:2.25rem}.swagger-ui .f3{font-size:1.5rem}.swagger-ui .f4{font-size:1.25rem}.swagger-ui .f5{font-size:1rem}.swagger-ui .f6{font-size:.875rem}.swagger-ui .f7{font-size:.75rem}@media screen and (min-width:30em){.swagger-ui .f-6-ns,.swagger-ui .f-headline-ns{font-size:6rem}.swagger-ui .f-5-ns,.swagger-ui .f-subheadline-ns{font-size:5rem}.swagger-ui .f1-ns{font-size:3rem}.swagger-ui .f2-ns{font-size:2.25rem}.swagger-ui .f3-ns{font-size:1.5rem}.swagger-ui .f4-ns{font-size:1.25rem}.swagger-ui .f5-ns{font-size:1rem}.swagger-ui .f6-ns{font-size:.875rem}.swagger-ui .f7-ns{font-size:.75rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .f-6-m,.swagger-ui .f-headline-m{font-size:6rem}.swagger-ui .f-5-m,.swagger-ui .f-subheadline-m{font-size:5rem}.swagger-ui .f1-m{font-size:3rem}.swagger-ui .f2-m{font-size:2.25rem}.swagger-ui .f3-m{font-size:1.5rem}.swagger-ui .f4-m{font-size:1.25rem}.swagger-ui .f5-m{font-size:1rem}.swagger-ui .f6-m{font-size:.875rem}.swagger-ui .f7-m{font-size:.75rem}}@media screen and (min-width:60em){.swagger-ui .f-6-l,.swagger-ui .f-headline-l{font-size:6rem}.swagger-ui .f-5-l,.swagger-ui .f-subheadline-l{font-size:5rem}.swagger-ui .f1-l{font-size:3rem}.swagger-ui .f2-l{font-size:2.25rem}.swagger-ui .f3-l{font-size:1.5rem}.swagger-ui .f4-l{font-size:1.25rem}.swagger-ui .f5-l{font-size:1rem}.swagger-ui .f6-l{font-size:.875rem}.swagger-ui .f7-l{font-size:.75rem}}.swagger-ui .measure{max-width:30em}.swagger-ui .measure-wide{max-width:34em}.swagger-ui .measure-narrow{max-width:20em}.swagger-ui .indent{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps{font-feature-settings:\"smcp\";font-variant:small-caps}.swagger-ui .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media screen and (min-width:30em){.swagger-ui .measure-ns{max-width:30em}.swagger-ui .measure-wide-ns{max-width:34em}.swagger-ui .measure-narrow-ns{max-width:20em}.swagger-ui .indent-ns{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-ns{font-feature-settings:\"smcp\";font-variant:small-caps}.swagger-ui .truncate-ns{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .measure-m{max-width:30em}.swagger-ui .measure-wide-m{max-width:34em}.swagger-ui .measure-narrow-m{max-width:20em}.swagger-ui .indent-m{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-m{font-feature-settings:\"smcp\";font-variant:small-caps}.swagger-ui .truncate-m{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:60em){.swagger-ui .measure-l{max-width:30em}.swagger-ui .measure-wide-l{max-width:34em}.swagger-ui .measure-narrow-l{max-width:20em}.swagger-ui .indent-l{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-l{font-feature-settings:\"smcp\";font-variant:small-caps}.swagger-ui .truncate-l{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.swagger-ui .overflow-container{overflow-y:scroll}.swagger-ui .center{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto{margin-right:auto}.swagger-ui .ml-auto{margin-left:auto}@media screen and (min-width:30em){.swagger-ui .center-ns{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-ns{margin-right:auto}.swagger-ui .ml-auto-ns{margin-left:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .center-m{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-m{margin-right:auto}.swagger-ui .ml-auto-m{margin-left:auto}}@media screen and (min-width:60em){.swagger-ui .center-l{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-l{margin-right:auto}.swagger-ui .ml-auto-l{margin-left:auto}}.swagger-ui .clip{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}@media screen and (min-width:30em){.swagger-ui .clip-ns{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .clip-m{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}@media screen and (min-width:60em){.swagger-ui .clip-l{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}.swagger-ui .ws-normal{white-space:normal}.swagger-ui .nowrap{white-space:nowrap}.swagger-ui .pre{white-space:pre}@media screen and (min-width:30em){.swagger-ui .ws-normal-ns{white-space:normal}.swagger-ui .nowrap-ns{white-space:nowrap}.swagger-ui .pre-ns{white-space:pre}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ws-normal-m{white-space:normal}.swagger-ui .nowrap-m{white-space:nowrap}.swagger-ui .pre-m{white-space:pre}}@media screen and (min-width:60em){.swagger-ui .ws-normal-l{white-space:normal}.swagger-ui .nowrap-l{white-space:nowrap}.swagger-ui .pre-l{white-space:pre}}.swagger-ui .v-base{vertical-align:baseline}.swagger-ui .v-mid{vertical-align:middle}.swagger-ui .v-top{vertical-align:top}.swagger-ui .v-btm{vertical-align:bottom}@media screen and (min-width:30em){.swagger-ui .v-base-ns{vertical-align:baseline}.swagger-ui .v-mid-ns{vertical-align:middle}.swagger-ui .v-top-ns{vertical-align:top}.swagger-ui .v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .v-base-m{vertical-align:baseline}.swagger-ui .v-mid-m{vertical-align:middle}.swagger-ui .v-top-m{vertical-align:top}.swagger-ui .v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.swagger-ui .v-base-l{vertical-align:baseline}.swagger-ui .v-mid-l{vertical-align:middle}.swagger-ui .v-top-l{vertical-align:top}.swagger-ui .v-btm-l{vertical-align:bottom}}.swagger-ui .dim{opacity:1;transition:opacity .15s ease-in}.swagger-ui .dim:focus,.swagger-ui .dim:hover{opacity:.5;transition:opacity .15s ease-in}.swagger-ui .dim:active{opacity:.8;transition:opacity .15s ease-out}.swagger-ui .glow{transition:opacity .15s ease-in}.swagger-ui .glow:focus,.swagger-ui .glow:hover{opacity:1;transition:opacity .15s ease-in}.swagger-ui .hide-child .child{opacity:0;transition:opacity .15s ease-in}.swagger-ui .hide-child:active .child,.swagger-ui .hide-child:focus .child,.swagger-ui .hide-child:hover .child{opacity:1;transition:opacity .15s ease-in}.swagger-ui .underline-hover:focus,.swagger-ui .underline-hover:hover{text-decoration:underline}.swagger-ui .grow{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-out}.swagger-ui .grow:focus,.swagger-ui .grow:hover{transform:scale(1.05)}.swagger-ui .grow:active{transform:scale(.9)}.swagger-ui .grow-large{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-in-out}.swagger-ui .grow-large:focus,.swagger-ui .grow-large:hover{transform:scale(1.2)}.swagger-ui .grow-large:active{transform:scale(.95)}.swagger-ui .pointer:hover{cursor:pointer}.swagger-ui .shadow-hover{cursor:pointer;position:relative;transition:all .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:after{border-radius:inherit;box-shadow:0 0 16px 2px rgba(0,0,0,.2);content:\"\";height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .5s cubic-bezier(.165,.84,.44,1);width:100%;z-index:-1}.swagger-ui .shadow-hover:focus:after,.swagger-ui .shadow-hover:hover:after{opacity:1}.swagger-ui .bg-animate,.swagger-ui .bg-animate:focus,.swagger-ui .bg-animate:hover{transition:background-color .15s ease-in-out}.swagger-ui .z-0{z-index:0}.swagger-ui .z-1{z-index:1}.swagger-ui .z-2{z-index:2}.swagger-ui .z-3{z-index:3}.swagger-ui .z-4{z-index:4}.swagger-ui .z-5{z-index:5}.swagger-ui .z-999{z-index:999}.swagger-ui .z-9999{z-index:9999}.swagger-ui .z-max{z-index:2147483647}.swagger-ui .z-inherit{z-index:inherit}.swagger-ui .z-initial{z-index:auto}.swagger-ui .z-unset{z-index:unset}.swagger-ui .nested-copy-line-height ol,.swagger-ui .nested-copy-line-height p,.swagger-ui .nested-copy-line-height ul{line-height:1.5}.swagger-ui .nested-headline-line-height h1,.swagger-ui .nested-headline-line-height h2,.swagger-ui .nested-headline-line-height h3,.swagger-ui .nested-headline-line-height h4,.swagger-ui .nested-headline-line-height h5,.swagger-ui .nested-headline-line-height h6{line-height:1.25}.swagger-ui .nested-list-reset ol,.swagger-ui .nested-list-reset ul{list-style-type:none;margin-left:0;padding-left:0}.swagger-ui .nested-copy-indent p+p{margin-bottom:0;margin-top:0;text-indent:.1em}.swagger-ui .nested-copy-seperator p+p{margin-top:1.5em}.swagger-ui .nested-img img{display:block;max-width:100%;width:100%}.swagger-ui .nested-links a{color:#357edd;transition:color .15s ease-in}.swagger-ui .nested-links a:focus,.swagger-ui .nested-links a:hover{color:#96ccff;transition:color .15s ease-in}.swagger-ui .wrapper{box-sizing:border-box;margin:0 auto;max-width:1460px;padding:0 20px;width:100%}.swagger-ui .opblock-tag-section{display:flex;flex-direction:column}.swagger-ui .try-out.btn-group{display:flex;flex:0.1 2 auto;padding:0}.swagger-ui .try-out__btn{margin-left:1.25rem}.swagger-ui .opblock-tag{align-items:center;border-bottom:1px solid rgba(59,65,81,.3);cursor:pointer;display:flex;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{color:#3b4151;font-family:sans-serif;font-size:24px;margin:0 0 5px}.swagger-ui .opblock-tag.no-desc span{flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{color:#3b4151;flex:1;font-family:sans-serif;font-size:14px;font-weight:400;padding:0 10px}.swagger-ui .parameter__type{color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;padding:5px 0}.swagger-ui .parameter-controls{margin-top:.75em}.swagger-ui .examples__title{display:block;font-size:1.1em;font-weight:700;margin-bottom:.75em}.swagger-ui .examples__section{margin-top:1.5em}.swagger-ui .examples__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .examples-select{display:inline-block;margin-bottom:.75em}.swagger-ui .examples-select .examples-select-element{width:100%}.swagger-ui .examples-select__section-label{font-size:.9rem;font-weight:700;margin-right:.5rem}.swagger-ui .example__section{margin-top:1.5em}.swagger-ui .example__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .view-line-link{cursor:pointer;margin:0 5px;position:relative;top:3px;transition:all .5s;width:20px}.swagger-ui .opblock{border:1px solid #000;border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.19);margin:0 0 15px}.swagger-ui .opblock .tab-header{display:flex;flex:1}.swagger-ui .opblock .tab-header .tab-item{cursor:pointer;padding:0 40px}.swagger-ui .opblock .tab-header .tab-item:first-of-type{padding:0 40px 0 0}.swagger-ui .opblock .tab-header .tab-item.active h4 span{position:relative}.swagger-ui .opblock .tab-header .tab-item.active h4 span:after{background:grey;bottom:-15px;content:\"\";height:4px;left:50%;position:absolute;transform:translateX(-50%);width:120%}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{align-items:center;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px rgba(0,0,0,.1);display:flex;min-height:50px;padding:8px 20px}.swagger-ui .opblock .opblock-section-header>label{align-items:center;color:#3b4151;display:flex;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 0 auto}.swagger-ui .opblock .opblock-section-header>label>span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock .opblock-summary-method{background:#000;border-radius:3px;color:#fff;font-family:sans-serif;font-size:14px;font-weight:700;min-width:80px;padding:6px 15px;text-align:center;text-shadow:0 1px 0 rgba(0,0,0,.1)}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{align-items:center;color:#3b4151;display:flex;font-family:monospace;font-size:16px;font-weight:600;padding:0 10px;word-break:break-word}@media (max-width:768px){.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:12px}}.swagger-ui .opblock .opblock-summary-path{flex-shrink:0;max-width:calc(100% - 110px - 15rem)}.swagger-ui .opblock .opblock-summary-path__deprecated{text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{color:#3b4151;flex:1 1 auto;font-family:sans-serif;font-size:13px;word-break:break-word}.swagger-ui .opblock .opblock-summary{align-items:center;cursor:pointer;display:flex;padding:5px}.swagger-ui .opblock .opblock-summary .view-line-link{cursor:pointer;margin:0;position:relative;top:2px;transition:all .5s;width:0}.swagger-ui .opblock .opblock-summary:hover .view-line-link{margin:0 5px;width:18px}.swagger-ui .opblock.opblock-post{background:rgba(73,204,144,.1);border-color:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after{background:#49cc90}.swagger-ui .opblock.opblock-put{background:rgba(252,161,48,.1);border-color:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after{background:#fca130}.swagger-ui .opblock.opblock-delete{background:rgba(249,62,62,.1);border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after{background:#f93e3e}.swagger-ui .opblock.opblock-get{background:rgba(97,175,254,.1);border-color:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after{background:#61affe}.swagger-ui .opblock.opblock-patch{background:rgba(80,227,194,.1);border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after{background:#50e3c2}.swagger-ui .opblock.opblock-head{background:rgba(144,18,254,.1);border-color:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after{background:#9012fe}.swagger-ui .opblock.opblock-options{background:rgba(13,90,167,.1);border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after{background:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{background:hsla(0,0%,92%,.1);border-color:#ebebeb;opacity:.6}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after{background:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .filter .operation-filter-input{border:2px solid #d8dde7;margin:20px 0;padding:10px;width:100%}.swagger-ui .download-url-wrapper .failed,.swagger-ui .filter .failed{color:red}.swagger-ui .download-url-wrapper .loading,.swagger-ui .filter .loading{color:#aaa}.swagger-ui .model-example{margin-top:1em}.swagger-ui .tab{display:flex;list-style:none;padding:0}.swagger-ui .tab li{color:#3b4151;cursor:pointer;font-family:sans-serif;font-size:12px;min-width:60px;padding:0}.swagger-ui .tab li:first-of-type{padding-left:0;padding-right:12px;position:relative}.swagger-ui .tab li:first-of-type:after{background:rgba(0,0,0,.2);content:\"\";height:100%;position:absolute;right:6px;top:0;width:1px}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px;padding:15px 20px}.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p{color:#3b4151;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock-external-docs-wrapper h4{padding-left:0}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{padding:8px 40px;width:100%}.swagger-ui .body-param-options{display:flex;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{color:#3b4151;font-family:sans-serif;font-size:12px;margin:10px 0 5px}.swagger-ui .responses-inner .curl{white-space:normal}.swagger-ui .response-col_status{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .response-col_status .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links{color:#3b4151;font-family:sans-serif;font-size:14px;max-width:40em;padding-left:2em}.swagger-ui .response-col_links .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links .operation-link{margin-bottom:1.5em}.swagger-ui .response-col_links .operation-link .description{margin-bottom:.5em}.swagger-ui .opblock-body .opblock-loading-animation{display:block;margin:3em auto}.swagger-ui .opblock-body pre.microlight{word-wrap:break-word;background:#333;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;margin:0;padding:10px;white-space:pre-wrap;word-break:break-all;word-break:break-word}.swagger-ui .opblock-body pre.microlight .headerline{display:block}.swagger-ui .highlight-code{position:relative}.swagger-ui .highlight-code>.microlight{max-height:400px;min-height:6em;overflow-y:auto}.swagger-ui .highlight-code>.microlight code{white-space:pre-wrap!important;word-break:break-all}.swagger-ui .curl-command{position:relative}.swagger-ui .download-contents{background:#7d8293;border-radius:4px;bottom:10px;color:#fff;cursor:pointer;font-family:sans-serif;font-size:14px;font-weight:600;height:30px;padding:5px;position:absolute;right:10px;text-align:center}.swagger-ui .scheme-container{background:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.15);margin:0 0 20px;padding:30px 0}.swagger-ui .scheme-container .schemes{align-items:flex-end;display:flex}.swagger-ui .scheme-container .schemes>label{color:#3b4151;display:flex;flex-direction:column;font-family:sans-serif;font-size:12px;font-weight:700;margin:-20px 15px 0 0}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .loading-container{align-items:center;display:flex;flex-direction:column;justify-content:center;margin-top:1em;min-height:1px;padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{color:#3b4151;content:\"loading\";font-family:sans-serif;font-size:10px;font-weight:700;left:50%;position:absolute;text-transform:uppercase;top:50%;transform:translate(-50%,-50%)}.swagger-ui .loading-container .loading:before{-webkit-animation:rotation 1s linear infinite,opacity .5s;animation:rotation 1s linear infinite,opacity .5s;-webkit-backface-visibility:hidden;backface-visibility:hidden;border:2px solid rgba(85,85,85,.1);border-radius:100%;border-top-color:rgba(0,0,0,.6);content:\"\";display:block;height:60px;left:50%;margin:-30px;opacity:1;position:absolute;top:50%;width:60px}@-webkit-keyframes rotation{to{transform:rotate(1turn)}}@keyframes rotation{to{transform:rotate(1turn)}}.swagger-ui .response-controls{display:flex;padding-top:1em}.swagger-ui .response-control-media-type{margin-right:1em}.swagger-ui .response-control-media-type--accept-controller select{border-color:green}.swagger-ui .response-control-media-type__accept-message{color:green;font-size:.7em}.swagger-ui .response-control-examples__title,.swagger-ui .response-control-media-type__title{display:block;font-size:.7em;margin-bottom:.2em}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}.swagger-ui .hidden{display:none}.swagger-ui .no-margin{border:none;height:auto;margin:0;padding:0}.swagger-ui .float-right{float:right}.swagger-ui img.full-width{width:100%}.swagger-ui .svg-assets{height:0;position:absolute;width:0}.swagger-ui section h3{color:#3b4151;font-family:sans-serif}.swagger-ui a.nostyle{display:inline}.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited{color:inherit;cursor:pointer;text-decoration:inherit}.swagger-ui .fallback{color:#aaa;padding:1em}.swagger-ui .version-pragma{height:100%;padding:5em 0}.swagger-ui .version-pragma__message{display:flex;font-size:1.2em;height:100%;justify-content:center;line-height:1.5em;padding:0 .6em;text-align:center}.swagger-ui .version-pragma__message>div{flex:1;max-width:55ch}.swagger-ui .version-pragma__message code{background-color:#dedede;padding:4px 4px 2px;white-space:pre}.swagger-ui .opblock-link{font-weight:400}.swagger-ui .opblock-link.shown{font-weight:700}.swagger-ui span.token-string{color:#555}.swagger-ui span.token-not-formatted{color:#555;font-weight:700}.swagger-ui .btn{background:transparent;border:2px solid grey;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.1);color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s}.swagger-ui .btn.btn-sm{font-size:12px;padding:4px 23px}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{background-color:transparent;border-color:#ff6060;color:#ff6060;font-family:sans-serif}.swagger-ui .btn.authorize{background-color:transparent;border-color:#49cc90;color:#49cc90;display:inline;line-height:1}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{background-color:#4990e2;border-color:#4990e2;color:#fff}.swagger-ui .btn-group{display:flex;padding:30px}.swagger-ui .btn-group .btn{flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{background:none;border:none;padding:0 10px}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .model-box-control,.swagger-ui .models-control,.swagger-ui .opblock-summary-control{all:inherit;border-bottom:0;cursor:pointer;flex:1;padding:0}.swagger-ui .model-box-control:focus,.swagger-ui .models-control:focus,.swagger-ui .opblock-summary-control:focus{outline:auto}.swagger-ui .expand-methods,.swagger-ui .expand-operation{background:none;border:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{height:20px;width:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#404040}.swagger-ui .expand-methods svg{fill:#707070;transition:all .3s}.swagger-ui button{cursor:pointer}.swagger-ui button.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .copy-to-clipboard{background:#7d8293;border:none;border-radius:4px;bottom:10px;height:30px;position:absolute;right:100px;width:30px}.swagger-ui .copy-to-clipboard button{background:url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill=\"%23fff\" fill-rule=\"evenodd\" d=\"M2 13h4v1H2v-1zm5-6H2v1h5V7zm2 3V8l-3 3 3 3v-2h5v-2H9zM4.5 9H2v1h2.5V9zM2 12h2.5v-1H2v1zm9 1h1v2c-.02.28-.11.52-.3.7-.19.18-.42.28-.7.3H1c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h3c0-1.11.89-2 2-2 1.11 0 2 .89 2 2h3c.55 0 1 .45 1 1v5h-1V6H1v9h10v-2zM2 5h8c0-.55-.45-1-1-1H8c-.55 0-1-.45-1-1s-.45-1-1-1-1 .45-1 1-.45 1-1 1H3c-.55 0-1 .45-1 1z\"/></svg>') 50% no-repeat;border:none;height:25px;padding-left:25px}.swagger-ui .curl-command .copy-to-clipboard{bottom:5px;height:20px;right:10px;width:20px}.swagger-ui .curl-command .copy-to-clipboard button{height:18px;padding-left:18px}.swagger-ui select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#f7f7f7 url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M13.418 7.859a.695.695 0 0 1 .978 0 .68.68 0 0 1 0 .969l-3.908 3.83a.697.697 0 0 1-.979 0l-3.908-3.83a.68.68 0 0 1 0-.969.695.695 0 0 1 .978 0L10 11l3.418-3.141z\"/></svg>') right 10px center no-repeat;background-size:20px;border:2px solid #41444e;border-radius:4px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 40px 5px 10px}.swagger-ui select[multiple]{background:#f7f7f7;margin:5px 0;padding:5px}.swagger-ui select.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .opblock-body select{min-width:230px}@media (max-width:768px){.swagger-ui .opblock-body select{min-width:180px}}.swagger-ui label{color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 5px}@media (max-width:768px){.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{max-width:175px}}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{background:#fff;border:1px solid #d9d9d9;border-radius:4px;margin:5px 0;min-width:100px;padding:8px 10px}.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid,.swagger-ui textarea.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui input[disabled],.swagger-ui select[disabled],.swagger-ui textarea[disabled]{background-color:#fafafa;color:#888;cursor:not-allowed}.swagger-ui select[disabled]{border-color:#888}.swagger-ui textarea[disabled]{background-color:#41444e;color:#fff}@-webkit-keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.swagger-ui textarea{background:hsla(0,0%,100%,.8);border:none;border-radius:4px;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;min-height:280px;outline:none;padding:10px;width:100%}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{background:#41444e;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;margin:0;min-height:100px;padding:10px;resize:none}.swagger-ui .checkbox{color:#303030;padding:5px 0 10px;transition:opacity .5s}.swagger-ui .checkbox label{display:flex}.swagger-ui .checkbox p{color:#3b4151;font-family:monospace;font-style:italic;font-weight:400!important;font-weight:600;margin:0!important}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{background:#e8e8e8;border-radius:1px;box-shadow:0 0 0 2px #e8e8e8;cursor:pointer;display:inline-block;flex:none;height:16px;margin:0 8px 0 0;padding:5px;position:relative;top:3px;width:16px}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url('data:image/svg+xml;charset=utf-8,<svg width=\"10\" height=\"8\" viewBox=\"3 7 10 8\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"%2341474E\" fill-rule=\"evenodd\" d=\"M6.333 15 3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z\"/></svg>') 50% no-repeat}.swagger-ui .dialog-ux{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999}.swagger-ui .dialog-ux .backdrop-ux{background:rgba(0,0,0,.8);bottom:0;left:0;position:fixed;right:0;top:0}.swagger-ui .dialog-ux .modal-ux{background:#fff;border:1px solid #ebebeb;border-radius:4px;box-shadow:0 10px 30px 0 rgba(0,0,0,.2);left:50%;max-width:650px;min-width:300px;position:absolute;top:50%;transform:translate(-50%,-50%);width:100%;z-index:9999}.swagger-ui .dialog-ux .modal-ux-content{max-height:540px;overflow-y:auto;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{color:#41444e;color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .dialog-ux .modal-ux-content h4{color:#3b4151;font-family:sans-serif;font-size:18px;font-weight:600;margin:15px 0 0}.swagger-ui .dialog-ux .modal-ux-header{align-items:center;border-bottom:1px solid #ebebeb;display:flex;padding:12px 0}.swagger-ui .dialog-ux .modal-ux-header .close-modal{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;padding:0 10px}.swagger-ui .dialog-ux .modal-ux-header h3{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;font-weight:600;margin:0;padding:0 20px}.swagger-ui .model{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600}.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td{color:#a0a0a0!important}.swagger-ui .model .deprecated>td:first-of-type{text-decoration:line-through}.swagger-ui .model-toggle{cursor:pointer;display:inline-block;font-size:10px;margin:auto .3em;position:relative;top:6px;transform:rotate(90deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .model-toggle.collapsed{transform:rotate(0deg)}.swagger-ui .model-toggle:after{background:url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"><path d=\"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/></svg>') 50% no-repeat;background-size:100%;content:\"\";display:block;height:20px;width:20px}.swagger-ui .model-jump-to-path{cursor:pointer;position:relative}.swagger-ui .model-jump-to-path .view-line-link{cursor:pointer;position:absolute;top:-.4em}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{background:rgba(0,0,0,.7);border-radius:4px;color:#ebebeb;padding:.1em .5em;position:absolute;top:-1.8em;visibility:hidden;white-space:nowrap}.swagger-ui .model p{margin:0 0 1em}.swagger-ui .model .property{color:#999;font-style:italic}.swagger-ui .model .property.primitive{color:#6b6b6b}.swagger-ui table.model tr.description{color:#666;font-weight:400}.swagger-ui table.model tr.description td:first-child,.swagger-ui table.model tr.property-row.required td:first-child{font-weight:700}.swagger-ui table.model tr.property-row td{vertical-align:top}.swagger-ui table.model tr.property-row td:first-child{padding-right:.2em}.swagger-ui table.model tr.property-row .star{color:red}.swagger-ui table.model tr.extension{color:#777}.swagger-ui table.model tr.extension td:last-child{vertical-align:top}.swagger-ui section.models{border:1px solid rgba(59,65,81,.3);border-radius:4px;margin:30px 0}.swagger-ui section.models .pointer{cursor:pointer}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{border-bottom:1px solid rgba(59,65,81,.3);margin:0 0 5px}.swagger-ui section.models h4{align-items:center;color:#606060;cursor:pointer;display:flex;font-family:sans-serif;font-size:16px;margin:0;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{color:#707070;font-family:sans-serif;font-size:16px;margin:0 0 10px}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{background:rgba(0,0,0,.05);border-radius:4px;margin:0 20px 15px;position:relative;transition:all .5s}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-container .models-jump-to-path{opacity:.65;position:absolute;right:5px;top:8px}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{background:rgba(0,0,0,.1);border-radius:4px;display:inline-block;padding:10px}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-box.deprecated{opacity:.5}.swagger-ui .model-title{color:#505050;font-family:sans-serif;font-size:16px}.swagger-ui .model-title img{bottom:0;margin-left:1em;position:relative}.swagger-ui .model-deprecated-warning{color:#f93e3e;font-family:sans-serif;font-size:16px;font-weight:600;margin-right:1em}.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-name{display:inline-block;margin-right:1em}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#606060}.swagger-ui .servers>label{color:#3b4151;font-family:sans-serif;font-size:12px;margin:-20px 15px 0 0}.swagger-ui .servers>label select{max-width:100%;min-width:130px}.swagger-ui .servers h4.message{padding-bottom:2em}.swagger-ui .servers table tr{width:30em}.swagger-ui .servers table td{display:inline-block;max-width:15em;padding-bottom:10px;padding-top:10px;vertical-align:middle}.swagger-ui .servers table td:first-of-type{padding-right:1em}.swagger-ui .servers table td input{height:100%;width:100%}.swagger-ui .servers .computed-url{margin:2em 0}.swagger-ui .servers .computed-url code{display:inline-block;font-size:16px;margin:0 1em;padding:4px}.swagger-ui .servers-title{font-size:12px;font-weight:700}.swagger-ui .operation-servers h4.message{margin-bottom:2em}.swagger-ui table{border-collapse:collapse;padding:0 10px;width:100%}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{padding:0 0 0 2em;width:174px}.swagger-ui table.headers td{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600;vertical-align:middle}.swagger-ui table.headers .header-example{color:#999;font-style:italic}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{min-width:6em;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{border-bottom:1px solid rgba(59,65,81,.2);color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;padding:12px 0;text-align:left}.swagger-ui .parameters-col_description{margin-bottom:2em;width:99%}.swagger-ui .parameters-col_description input[type=text]{max-width:340px;width:100%}.swagger-ui .parameters-col_description select{border-width:1px}.swagger-ui .parameter__name{color:#3b4151;font-family:sans-serif;font-size:16px;font-weight:400;margin-right:.75em}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required span{color:red}.swagger-ui .parameter__name.required:after{color:rgba(255,0,0,.6);content:\"required\";font-size:10px;padding:5px;position:relative;top:-6px}.swagger-ui .parameter__extension,.swagger-ui .parameter__in{color:grey;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__deprecated{color:red;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__empty_value_toggle{display:block;font-size:13px;padding-bottom:12px;padding-top:5px}.swagger-ui .parameter__empty_value_toggle input{margin-right:7px}.swagger-ui .parameter__empty_value_toggle.disabled{opacity:.7}.swagger-ui .table-container{padding:20px}.swagger-ui .response-col_description{width:99%}.swagger-ui .response-col_links{min-width:6em}.swagger-ui .response__extension{color:grey;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .topbar{background-color:#1b1b1b;padding:10px 0}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{align-items:center;display:flex}.swagger-ui .topbar a{color:#fff;flex:1;font-family:sans-serif;font-size:1.5em;font-weight:700;max-width:300px;text-decoration:none}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:flex;flex:3;justify-content:flex-end}.swagger-ui .topbar .download-url-wrapper input[type=text]{border:2px solid #62a03f;border-radius:4px 0 0 4px;margin:0;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label{align-items:center;color:#f0f0f0;display:flex;margin:0;max-width:600px;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label span{flex:1;font-size:16px;padding:0 10px 0 0;text-align:right}.swagger-ui .topbar .download-url-wrapper .select-label select{border:2px solid #62a03f;box-shadow:none;flex:2;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .download-url-button{background:#62a03f;border:none;border-radius:0 4px 4px 0;color:#fff;font-family:sans-serif;font-size:16px;font-weight:700;padding:4px 30px}.swagger-ui .info{margin:50px 0}.swagger-ui .info.failed-config{margin-left:auto;margin-right:auto;max-width:880px;text-align:center}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info pre{font-size:14px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5{color:#3b4151;font-family:sans-serif}.swagger-ui .info a{color:#4990e2;font-family:sans-serif;font-size:14px;transition:all .4s}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300!important;font-weight:600;margin:0}.swagger-ui .info .title{color:#3b4151;font-family:sans-serif;font-size:36px;margin:0}.swagger-ui .info .title small{background:#7d8492;border-radius:57px;display:inline-block;font-size:10px;margin:0 0 0 5px;padding:2px 4px;position:relative;top:-5px;vertical-align:super}.swagger-ui .info .title small.version-stamp{background-color:#89bf04}.swagger-ui .info .title small pre{color:#fff;font-family:sans-serif;margin:0;padding:0}.swagger-ui .auth-btn-wrapper{display:flex;justify-content:center;padding:10px 0}.swagger-ui .auth-btn-wrapper .btn-done{margin-right:1em}.swagger-ui .auth-wrapper{display:flex;flex:1;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{margin-right:10px;padding-right:20px}.swagger-ui .auth-container{border-bottom:1px solid #ebebeb;margin:0 0 10px;padding:10px 20px}.swagger-ui .auth-container:last-of-type{border:0;margin:0;padding:10px 20px}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{background-color:#fee;border-radius:4px;color:red;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;margin:1em;padding:10px}.swagger-ui .auth-container .errors b{margin-right:1em;text-transform:capitalize}.swagger-ui .scopes h2{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .scopes h2 a{color:#4990e2;cursor:pointer;font-size:12px;padding-left:10px;text-decoration:underline}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{-webkit-animation:scaleUp .5s;animation:scaleUp .5s;background:rgba(249,62,62,.1);border:2px solid #f93e3e;border-radius:4px;margin:20px;padding:10px 20px}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{color:#3b4151;font-family:monospace;font-size:14px;font-weight:600;margin:0}.swagger-ui .errors-wrapper .errors small{color:#606060}.swagger-ui .errors-wrapper .errors .message{white-space:pre-line}.swagger-ui .errors-wrapper .errors .message.thrown{max-width:100%}.swagger-ui .errors-wrapper .errors .error-line{cursor:pointer;text-decoration:underline}.swagger-ui .errors-wrapper hgroup{align-items:center;display:flex}.swagger-ui .errors-wrapper hgroup h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;margin:0}@-webkit-keyframes scaleUp{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes scaleUp{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}.swagger-ui .Resizer.vertical.disabled{display:none}.swagger-ui .markdown p,.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown p,.swagger-ui .renderedMarkdown pre{margin:1em auto;word-break:break-all;word-break:break-word}.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown pre{background:none;color:#000;font-weight:400;padding:0;white-space:pre-wrap}.swagger-ui .markdown code,.swagger-ui .renderedMarkdown code{background:rgba(0,0,0,.05);border-radius:4px;color:#9012fe;font-family:monospace;font-size:14px;font-weight:600;padding:5px 7px}.swagger-ui .markdown pre>code,.swagger-ui .renderedMarkdown pre>code{display:block}\n\n/*# sourceMappingURL=swagger-ui.css.map*/"
  },
  {
    "path": "assembly/assembly-swagger-war/src/main/webapp/swagger-ui.js",
    "content": "/*! For license information please see swagger-ui.js.LICENSE.txt */\n!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.SwaggerUICore=t():e.SwaggerUICore=t()}(this,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"/dist\",n(n.s=414)}([function(e,t){e.exports=require(\"react\")},function(e,t){e.exports=require(\"immutable\")},function(e,t,n){e.exports=n(448)},function(e,t,n){var r=n(198);e.exports=function(e,t,n){return t in e?r(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(477)},function(e,t,n){\"use strict\";(function(e){n.d(t,\"z\",(function(){return be})),n.d(t,\"i\",(function(){return Ee})),n.d(t,\"v\",(function(){return xe})),n.d(t,\"r\",(function(){return Se})),n.d(t,\"t\",(function(){return we})),n.d(t,\"s\",(function(){return je})),n.d(t,\"p\",(function(){return Oe})),n.d(t,\"u\",(function(){return Ce})),n.d(t,\"x\",(function(){return _e})),n.d(t,\"y\",(function(){return Ae})),n.d(t,\"J\",(function(){return ke})),n.d(t,\"f\",(function(){return Ie})),n.d(t,\"n\",(function(){return Pe})),n.d(t,\"h\",(function(){return Te})),n.d(t,\"D\",(function(){return Re})),n.d(t,\"K\",(function(){return Me})),n.d(t,\"o\",(function(){return Ve})),n.d(t,\"C\",(function(){return ze})),n.d(t,\"a\",(function(){return Fe})),n.d(t,\"H\",(function(){return Je})),n.d(t,\"b\",(function(){return We})),n.d(t,\"G\",(function(){return He})),n.d(t,\"F\",(function(){return $e})),n.d(t,\"E\",(function(){return Ye})),n.d(t,\"k\",(function(){return Ke})),n.d(t,\"d\",(function(){return Ge})),n.d(t,\"g\",(function(){return Ze})),n.d(t,\"m\",(function(){return Xe})),n.d(t,\"l\",(function(){return Qe})),n.d(t,\"e\",(function(){return et})),n.d(t,\"I\",(function(){return tt})),n.d(t,\"w\",(function(){return nt})),n.d(t,\"A\",(function(){return rt})),n.d(t,\"B\",(function(){return at})),n.d(t,\"j\",(function(){return ot})),n.d(t,\"c\",(function(){return it})),n.d(t,\"q\",(function(){return ct}));var r=n(14),a=n.n(r),o=(n(13),n(18)),i=n.n(o),s=n(44),c=n.n(s),u=n(22),l=n.n(u),p=n(4),f=n.n(p),d=n(69),h=n.n(d),m=n(2),v=n.n(m),g=n(23),y=n.n(g),b=n(12),E=n.n(b),x=n(15),S=n.n(x),w=(n(33),n(28)),j=n.n(w),O=n(20),C=n.n(O),_=n(164),A=n.n(_),k=n(19),I=n.n(k),P=n(64),T=n.n(P),R=(n(29),n(30)),N=n.n(R),M=n(17),q=n.n(M),D=n(55),B=n.n(D),L=n(136),U=n.n(L),V=n(84),z=n.n(V),F=n(1),J=n.n(F),W=n(383),H=n(384),$=n.n(H),Y=n(216),K=n.n(Y),G=n(217),Z=n.n(G),X=n(165),Q=n.n(X),ee=n(277),te=n.n(ee),ne=n(100),re=n.n(ne),ae=n(101),oe=n.n(ae),ie=n(115),se=n(25),ce=n(386),ue=n.n(ce),le=n(118),pe=n(387),fe=n.n(pe),de=n(388),he=n.n(de),me=n(63),ve=n.n(me),ge=\"default\",ye=function(e){return J.a.Iterable.isIterable(e)};function be(e){return we(e)?ye(e)?e.toJS():e:{}}function Ee(e){var t,n;if(ye(e))return e;if(e instanceof se.a.File)return e;if(!we(e))return e;if(l()(e))return f()(n=J.a.Seq(e)).call(n,Ee).toList();if(oe()(h()(e))){var r,a=function(e){if(!oe()(h()(e)))return e;var t,n={},r=\"_**[]\",a={},o=c()(h()(e).call(e));try{for(o.s();!(t=o.n()).done;){var i=t.value;if(n[i[0]]||a[i[0]]&&a[i[0]].containsMultiple){var s,u,l,p;if(!a[i[0]])a[i[0]]={containsMultiple:!0,length:1},n[v()(l=v()(p=\"\".concat(i[0])).call(p,r)).call(l,a[i[0]].length)]=n[i[0]],delete n[i[0]];a[i[0]].length+=1,n[v()(s=v()(u=\"\".concat(i[0])).call(u,r)).call(s,a[i[0]].length)]=i[1]}else n[i[0]]=i[1]}}catch(e){o.e(e)}finally{o.f()}return n}(e);return f()(r=J.a.OrderedMap(a)).call(r,Ee)}return f()(t=J.a.OrderedMap(e)).call(t,Ee)}function xe(e){return l()(e)?e:[e]}function Se(e){return\"function\"==typeof e}function we(e){return!!e&&\"object\"===i()(e)}function je(e){return\"function\"==typeof e}function Oe(e){return l()(e)}var Ce=Z.a;function _e(e,t){var n;return j()(n=S()(e)).call(n,(function(n,r){return n[r]=t(e[r],r),n}),{})}function Ae(e,t){var n;return j()(n=S()(e)).call(n,(function(n,r){var a=t(e[r],r);return a&&\"object\"===i()(a)&&C()(n,a),n}),{})}function ke(e){return function(t){t.dispatch,t.getState;return function(t){return function(n){return\"function\"==typeof n?n(e()):t(n)}}}}function Ie(e){var t,n=e.keySeq();return n.contains(ge)?ge:A()(t=E()(n).call(n,(function(e){return\"2\"===(e+\"\")[0]}))).call(t).first()}function Pe(e,t){if(!J.a.Iterable.isIterable(e))return J.a.List();var n=e.getIn(l()(t)?t:[t]);return J.a.List.isList(n)?n:J.a.List()}function Te(e){var t,n=[/filename\\*=[^']+'\\w*'\"([^\"]+)\";?/i,/filename\\*=[^']+'\\w*'([^;]+);?/i,/filename=\"([^;]*);?\"/i,/filename=([^;]*);?/i];if(T()(n).call(n,(function(n){return null!==(t=n.exec(e))})),null!==t&&t.length>1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function Re(e){return t=e.replace(/\\.[^./]*$/,\"\"),K()($()(t));var t}function Ne(e,t,n,r,o){if(!t)return[];var s=[],c=t.get(\"nullable\"),u=t.get(\"required\"),p=t.get(\"maximum\"),d=t.get(\"minimum\"),h=t.get(\"type\"),m=t.get(\"format\"),g=t.get(\"maxLength\"),b=t.get(\"minLength\"),x=t.get(\"uniqueItems\"),S=t.get(\"maxItems\"),w=t.get(\"minItems\"),j=t.get(\"pattern\"),O=n||!0===u,C=null!=e;if(c&&null===e||!h||!(O||C&&\"array\"===h||!(!O&&!C)))return[];var _=\"string\"===h&&e,A=\"array\"===h&&l()(e)&&e.length,k=\"array\"===h&&J.a.List.isList(e)&&e.count(),I=[_,A,k,\"array\"===h&&\"string\"==typeof e&&e,\"file\"===h&&e instanceof se.a.File,\"boolean\"===h&&(e||!1===e),\"number\"===h&&(e||0===e),\"integer\"===h&&(e||0===e),\"object\"===h&&\"object\"===i()(e)&&null!==e,\"object\"===h&&\"string\"==typeof e&&e],P=T()(I).call(I,(function(e){return!!e}));if(O&&!P&&!r)return s.push(\"Required field is not provided\"),s;if(\"object\"===h&&(null===o||\"application/json\"===o)){var R,N=e;if(\"string\"==typeof e)try{N=JSON.parse(e)}catch(e){return s.push(\"Parameter string value must be valid JSON\"),s}if(t&&t.has(\"required\")&&je(u.isList)&&u.isList()&&y()(u).call(u,(function(e){void 0===N[e]&&s.push({propKey:e,error:\"Required property not found\"})})),t&&t.has(\"properties\"))y()(R=t.get(\"properties\")).call(R,(function(e,t){var n=Ne(N[t],e,!1,r,o);s.push.apply(s,a()(f()(n).call(n,(function(e){return{propKey:t,error:e}}))))}))}if(j){var M=function(e,t){if(!new RegExp(t).test(e))return\"Value must follow pattern \"+t}(e,j);M&&s.push(M)}if(w&&\"array\"===h){var q=function(e,t){var n;if(!e&&t>=1||e&&e.length<t)return v()(n=\"Array must contain at least \".concat(t,\" item\")).call(n,1===t?\"\":\"s\")}(e,w);q&&s.push(q)}if(S&&\"array\"===h){var D=function(e,t){var n;if(e&&e.length>t)return v()(n=\"Array must not contain more then \".concat(t,\" item\")).call(n,1===t?\"\":\"s\")}(e,S);D&&s.push({needRemove:!0,error:D})}if(x&&\"array\"===h){var B=function(e,t){if(e&&(\"true\"===t||!0===t)){var n=Object(F.fromJS)(e),r=n.toSet();if(e.length>r.size){var a=Object(F.Set)();if(y()(n).call(n,(function(e,t){E()(n).call(n,(function(t){return je(t.equals)?t.equals(e):t===e})).size>1&&(a=a.add(t))})),0!==a.size)return f()(a).call(a,(function(e){return{index:e,error:\"No duplicates allowed.\"}})).toArray()}}}(e,x);B&&s.push.apply(s,a()(B))}if(g||0===g){var L=function(e,t){var n;if(e.length>t)return v()(n=\"Value must be no longer than \".concat(t,\" character\")).call(n,1!==t?\"s\":\"\")}(e,g);L&&s.push(L)}if(b){var U=function(e,t){var n;if(e.length<t)return v()(n=\"Value must be at least \".concat(t,\" character\")).call(n,1!==t?\"s\":\"\")}(e,b);U&&s.push(U)}if(p||0===p){var V=function(e,t){if(e>t)return\"Value must be less than \".concat(t)}(e,p);V&&s.push(V)}if(d||0===d){var z=function(e,t){if(e<t)return\"Value must be greater than \".concat(t)}(e,d);z&&s.push(z)}if(\"string\"===h){var W;if(!(W=\"date-time\"===m?function(e){if(isNaN(Date.parse(e)))return\"Value must be a DateTime\"}(e):\"uuid\"===m?function(e){if(e=e.toString().toLowerCase(),!/^[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[)}]?$/.test(e))return\"Value must be a Guid\"}(e):function(e){if(e&&\"string\"!=typeof e)return\"Value must be a string\"}(e)))return s;s.push(W)}else if(\"boolean\"===h){var H=function(e){if(\"true\"!==e&&\"false\"!==e&&!0!==e&&!1!==e)return\"Value must be a boolean\"}(e);if(!H)return s;s.push(H)}else if(\"number\"===h){var $=function(e){if(!/^-?\\d+(\\.?\\d+)?$/.test(e))return\"Value must be a number\"}(e);if(!$)return s;s.push($)}else if(\"integer\"===h){var Y=function(e){if(!/^-?\\d+$/.test(e))return\"Value must be an integer\"}(e);if(!Y)return s;s.push(Y)}else if(\"array\"===h){if(!A&&!k)return s;e&&y()(e).call(e,(function(e,n){var i=Ne(e,t.get(\"items\"),!1,r,o);s.push.apply(s,a()(f()(i).call(i,(function(e){return{index:n,error:e}}))))}))}else if(\"file\"===h){var K=function(e){if(e&&!(e instanceof se.a.File))return\"Value must be a file\"}(e);if(!K)return s;s.push(K)}return s}var Me=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,a=void 0!==r&&r,o=n.bypassRequiredCheck,i=void 0!==o&&o,s=e.get(\"required\"),c=Object(le.a)(e,{isOAS3:a}),u=c.schema,l=c.parameterContentMediaType;return Ne(t,u,s,i,l)},qe=function(e,t,n){if(e&&(!e.xml||!e.xml.name)){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n\\x3c!-- XML example cannot be generated; root element name is undefined --\\x3e':null;var r=e.$$ref.match(/\\S*\\/(\\S+)$/);e.xml.name=r[1]}return Object(ie.memoizedCreateXMLExample)(e,t,n)},De=[{when:/json/,shouldStringifyTypes:[\"string\"]}],Be=[\"object\"],Le=function(e,t,n,r){var o=Object(ie.memoizedSampleFromSchema)(e,t,r),s=i()(o),c=j()(De).call(De,(function(e,t){var r;return t.when.test(n)?v()(r=[]).call(r,a()(e),a()(t.shouldStringifyTypes)):e}),Be);return te()(c,(function(e){return e===s}))?N()(o,null,2):o},Ue=function(e,t,n,r){var a,o=Le(e,t,n,r);try{\"\\n\"===(a=ve.a.dump(ve.a.load(o),{lineWidth:-1}))[a.length-1]&&(a=I()(a).call(a,0,a.length-1))}catch(e){return console.error(e),\"error: could not generate yaml example\"}return a.replace(/\\t/g,\"  \")},Ve=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return e&&je(e.toJS)&&(e=e.toJS()),r&&je(r.toJS)&&(r=r.toJS()),/xml/.test(t)?qe(e,n,r):/(yaml|yml)/.test(t)?Ue(e,n,t,r):Le(e,n,t,r)},ze=function(){var e={},t=se.a.location.search;if(!t)return{};if(\"\"!=t){var n=t.substr(1).split(\"&\");for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(r=n[r].split(\"=\"),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||\"\")}return e},Fe=function(t){return(t instanceof e?t:e.from(t.toString(),\"utf-8\")).toString(\"base64\")},Je={operationsSorter:{alpha:function(e,t){return e.get(\"path\").localeCompare(t.get(\"path\"))},method:function(e,t){return e.get(\"method\").localeCompare(t.get(\"method\"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},We=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&\"\"!==r&&t.push([n,\"=\",encodeURIComponent(r).replace(/%20/g,\"+\")].join(\"\"))}return t.join(\"&\")},He=function(e,t,n){return!!Q()(n,(function(n){return re()(e[n],t[n])}))};function $e(e){return\"string\"!=typeof e||\"\"===e?\"\":Object(W.sanitizeUrl)(e)}function Ye(e){return!(!e||q()(e).call(e,\"localhost\")>=0||q()(e).call(e,\"127.0.0.1\")>=0||\"none\"===e)}function Ke(e){if(!J.a.OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=B()(e).call(e,(function(e,t){return U()(t).call(t,\"2\")&&S()(e.get(\"content\")||{}).length>0})),n=e.get(\"default\")||J.a.OrderedMap(),r=(n.get(\"content\")||J.a.OrderedMap()).keySeq().toJS().length?n:null;return t||r}var Ge=function(e){return\"string\"==typeof e||e instanceof String?z()(e).call(e).replace(/\\s/g,\"%20\"):\"\"},Ze=function(e){return ue()(Ge(e).replace(/%20/g,\"_\"))},Xe=function(e){return E()(e).call(e,(function(e,t){return/^x-/.test(t)}))},Qe=function(e){return E()(e).call(e,(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)}))};function et(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if(\"object\"!==i()(e)||l()(e)||null===e||!t)return e;var a=C()({},e);return y()(n=S()(a)).call(n,(function(e){e===t&&r(a[e],e)?delete a[e]:a[e]=et(a[e],t,r)})),a}function tt(e){if(\"string\"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),\"object\"===i()(e)&&null!==e)try{return N()(e,null,2)}catch(t){return String(e)}return null==e?\"\":e.toString()}function nt(e){return\"number\"==typeof e?e.toString():e}function rt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,a=t.allowHashes,o=void 0===a||a;if(!J.a.Map.isMap(e))throw new Error(\"paramToIdentifier: received a non-Im.Map parameter as input\");var i,s,c,u=e.get(\"name\"),l=e.get(\"in\"),p=[];e&&e.hashCode&&l&&u&&o&&p.push(v()(i=v()(s=\"\".concat(l,\".\")).call(s,u,\".hash-\")).call(i,e.hashCode()));l&&u&&p.push(v()(c=\"\".concat(l,\".\")).call(c,u));return p.push(u),r?p:p[0]||\"\"}function at(e,t){var n,r=rt(e,{returnAll:!0});return E()(n=f()(r).call(r,(function(e){return t[e]}))).call(n,(function(e){return void 0!==e}))[0]}function ot(){return st(fe()(32).toString(\"base64\"))}function it(e){return st(he()(\"sha256\").update(e).digest(\"base64\"))}function st(e){return e.replace(/\\+/g,\"-\").replace(/\\//g,\"_\").replace(/=/g,\"\")}var ct=function(e){return!e||!(!ye(e)||!e.isEmpty())}}).call(this,n(481).Buffer)},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(198);function a(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,\"value\"in a&&(a.writable=!0),r(e,a.key,a)}}e.exports=function(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(675),a=n(679);e.exports=function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=r(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&a(e,t)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(369),a=n(686),o=n(691),i=n(692);e.exports=function(e){var t=o();return function(){var n,o=a(e);if(t){var s=a(this).constructor;n=r(o,arguments,s)}else n=o.apply(this,arguments);return i(this,n)}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=require(\"prop-types\")},function(e,t,n){e.exports=n(451)},function(e,t,n){var r=n(320),a=n(494),o=n(150),i=n(321);e.exports=function(e,t){return r(e)||a(e,t)||o(e,t)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(485),a=n(313),o=n(150),i=n(493);e.exports=function(e){return r(e)||a(e)||o(e)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(454)},function(e,t){e.exports=require(\"reselect\")},function(e,t,n){e.exports=n(521)},function(e,t,n){var r=n(140),a=n(443);function o(t){return\"function\"==typeof r&&\"symbol\"==typeof a?(e.exports=o=function(e){return typeof e},e.exports.default=e.exports,e.exports.__esModule=!0):(e.exports=o=function(e){return e&&\"function\"==typeof r&&e.constructor===r&&e!==r.prototype?\"symbol\":typeof e},e.exports.default=e.exports,e.exports.__esModule=!0),o(t)}e.exports=o,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(467)},function(e,t,n){e.exports=n(465)},function(e,t,n){\"use strict\";var r=n(36),a=n(104).f,o=n(292),i=n(31),s=n(90),c=n(58),u=n(49),l=function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t};e.exports=function(e,t){var n,p,f,d,h,m,v,g,y=e.target,b=e.global,E=e.stat,x=e.proto,S=b?r:E?r[y]:(r[y]||{}).prototype,w=b?i:i[y]||(i[y]={}),j=w.prototype;for(f in t)n=!o(b?f:y+(E?\".\":\"#\")+f,e.forced)&&S&&u(S,f),h=w[f],n&&(m=e.noTargetGet?(g=a(S,f))&&g.value:S[f]),d=n&&m?m:t[f],n&&typeof h==typeof d||(v=e.bind&&n?s(d,r):e.wrap&&n?l(d):x&&\"function\"==typeof d?s(Function.call,d):d,(e.sham||d&&d.sham||h&&h.sham)&&c(v,\"sham\",!0),w[f]=v,x&&(u(i,p=y+\"Prototype\")||c(i,p,{}),i[p][f]=d,e.real&&j&&!j[f]&&c(j,f,d)))}},function(e,t,n){e.exports=n(470)},function(e,t,n){e.exports=n(322)},function(e,t,n){var r=n(351),a=n(352),o=n(632),i=n(634),s=n(638),c=n(640),u=n(645),l=n(198),p=n(3);function f(e,t){var n=r(e);if(a){var s=a(e);t&&(s=o(s).call(s,(function(t){return i(e,t).enumerable}))),n.push.apply(n,s)}return n}e.exports=function(e){for(var t=1;t<arguments.length;t++){var n,r=null!=arguments[t]?arguments[t]:{};if(t%2)s(n=f(Object(r),!0)).call(n,(function(t){p(e,t,r[t])}));else if(c)u(e,c(r));else{var a;s(a=f(Object(r))).call(a,(function(t){l(e,t,i(r,t))}))}}return e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";t.a=function(){var e={location:{},history:{},open:function(){},close:function(){},File:function(){}};if(\"undefined\"==typeof window)return e;try{e=window;for(var t=0,n=[\"File\",\"Blob\",\"FormData\"];t<n.length;t++){var r=n[t];r in window&&(e[r]=window[r])}}catch(e){console.error(e)}return e}()},function(e,t){e.exports=require(\"react-immutable-proptypes\")},function(e,t,n){var r=n(673);function a(){return e.exports=a=r||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},e.exports.default=e.exports,e.exports.__esModule=!0,a.apply(this,arguments)}e.exports=a,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(472)},function(e,t,n){e.exports=n(514)},function(e,t,n){e.exports=n(456)},function(e,t){e.exports={}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"isOAS3\",(function(){return u})),n.d(t,\"isSwagger2\",(function(){return l})),n.d(t,\"OAS3ComponentWrapFactory\",(function(){return p}));var r=n(27),a=n.n(r),o=n(136),i=n.n(o),s=n(0),c=n.n(s);function u(e){var t=e.get(\"openapi\");return\"string\"==typeof t&&(i()(t).call(t,\"3.0.\")&&t.length>4)}function l(e){var t=e.get(\"swagger\");return\"string\"==typeof t&&i()(t).call(t,\"2.0\")}function p(e){return function(t,n){return function(r){return n&&n.specSelectors&&n.specSelectors.specJson?u(n.specSelectors.specJson())?c.a.createElement(e,a()({},r,n,{Ori:t})):c.a.createElement(t,r):(console.warn(\"OAS3 wrapper: couldn't get spec\"),null)}}}},function(e,t,n){e.exports=n(461)},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){e.exports=n(663)},function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n(\"object\"==typeof globalThis&&globalThis)||n(\"object\"==typeof window&&window)||n(\"object\"==typeof self&&self)||n(\"object\"==typeof t&&t)||function(){return this}()||Function(\"return this\")()}).call(this,n(182))},function(e,t,n){var r=n(36),a=n(185),o=n(49),i=n(144),s=n(187),c=n(293),u=a(\"wks\"),l=r.Symbol,p=c?l:l&&l.withoutSetter||i;e.exports=function(e){return o(u,e)&&(s||\"string\"==typeof u[e])||(s&&o(l,e)?u[e]=l[e]:u[e]=p(\"Symbol.\"+e)),u[e]}},function(e,t,n){var r=n(31);e.exports=function(e){return r[e+\"Prototype\"]}},function(e,t,n){var r=n(160);e.exports=function(e,t,n){var a=null==e?void 0:r(e,t);return void 0===a?n:a}},function(e,t,n){var r=n(31),a=n(49),o=n(194),i=n(59).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});a(t,e)||i(t,e,{value:o.f(e)})}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_SPEC\",(function(){return te})),n.d(t,\"UPDATE_URL\",(function(){return ne})),n.d(t,\"UPDATE_JSON\",(function(){return re})),n.d(t,\"UPDATE_PARAM\",(function(){return ae})),n.d(t,\"UPDATE_EMPTY_PARAM_INCLUSION\",(function(){return oe})),n.d(t,\"VALIDATE_PARAMS\",(function(){return ie})),n.d(t,\"SET_RESPONSE\",(function(){return se})),n.d(t,\"SET_REQUEST\",(function(){return ce})),n.d(t,\"SET_MUTATED_REQUEST\",(function(){return ue})),n.d(t,\"LOG_REQUEST\",(function(){return le})),n.d(t,\"CLEAR_RESPONSE\",(function(){return pe})),n.d(t,\"CLEAR_REQUEST\",(function(){return fe})),n.d(t,\"CLEAR_VALIDATE_PARAMS\",(function(){return de})),n.d(t,\"UPDATE_OPERATION_META_VALUE\",(function(){return he})),n.d(t,\"UPDATE_RESOLVED\",(function(){return me})),n.d(t,\"UPDATE_RESOLVED_SUBTREE\",(function(){return ve})),n.d(t,\"SET_SCHEME\",(function(){return ge})),n.d(t,\"updateSpec\",(function(){return ye})),n.d(t,\"updateResolved\",(function(){return be})),n.d(t,\"updateUrl\",(function(){return Ee})),n.d(t,\"updateJsonSpec\",(function(){return xe})),n.d(t,\"parseToJson\",(function(){return Se})),n.d(t,\"resolveSpec\",(function(){return je})),n.d(t,\"requestResolvedSubtree\",(function(){return _e})),n.d(t,\"changeParam\",(function(){return Ae})),n.d(t,\"changeParamByIdentity\",(function(){return ke})),n.d(t,\"updateResolvedSubtree\",(function(){return Ie})),n.d(t,\"invalidateResolvedSubtreeCache\",(function(){return Pe})),n.d(t,\"validateParams\",(function(){return Te})),n.d(t,\"updateEmptyParamInclusion\",(function(){return Re})),n.d(t,\"clearValidateParams\",(function(){return Ne})),n.d(t,\"changeConsumesValue\",(function(){return Me})),n.d(t,\"changeProducesValue\",(function(){return qe})),n.d(t,\"setResponse\",(function(){return De})),n.d(t,\"setRequest\",(function(){return Be})),n.d(t,\"setMutatedRequest\",(function(){return Le})),n.d(t,\"logRequest\",(function(){return Ue})),n.d(t,\"executeRequest\",(function(){return Ve})),n.d(t,\"execute\",(function(){return ze})),n.d(t,\"clearResponse\",(function(){return Fe})),n.d(t,\"clearRequest\",(function(){return Je})),n.d(t,\"setScheme\",(function(){return We}));var r=n(24),a=n.n(r),o=n(47),i=n.n(o),s=n(65),c=n.n(s),u=n(18),l=n.n(u),p=n(35),f=n.n(p),d=n(22),h=n.n(d),m=n(4),v=n.n(m),g=n(279),y=n.n(g),b=n(28),E=n.n(b),x=n(166),S=n.n(x),w=n(56),j=n.n(w),O=n(12),C=n.n(O),_=n(167),A=n.n(_),k=n(17),I=n.n(k),P=n(23),T=n.n(P),R=n(2),N=n.n(R),M=n(15),q=n.n(M),D=n(20),B=n.n(D),L=n(280),U=n.n(L),V=n(63),z=n.n(V),F=n(1),J=n(78),W=n.n(J),H=n(114),$=n(168),Y=n.n($),K=n(390),G=n.n(K),Z=n(281),X=n.n(Z),Q=n(5),ee=[\"path\",\"method\"],te=\"spec_update_spec\",ne=\"spec_update_url\",re=\"spec_update_json\",ae=\"spec_update_param\",oe=\"spec_update_empty_param_inclusion\",ie=\"spec_validate_param\",se=\"spec_set_response\",ce=\"spec_set_request\",ue=\"spec_set_mutated_request\",le=\"spec_log_request\",pe=\"spec_clear_response\",fe=\"spec_clear_request\",de=\"spec_clear_validate_param\",he=\"spec_update_operation_meta_value\",me=\"spec_update_resolved\",ve=\"spec_update_resolved_subtree\",ge=\"set_scheme\";function ye(e){var t,n=(t=e,Y()(t)?t:\"\").replace(/\\t/g,\"  \");if(\"string\"==typeof e)return{type:te,payload:n}}function be(e){return{type:me,payload:e}}function Ee(e){return{type:ne,payload:e}}function xe(e){return{type:re,payload:e}}var Se=function(e){return function(t){var n=t.specActions,r=t.specSelectors,a=t.errActions,o=r.specStr,i=null;try{e=e||o(),a.clear({source:\"parser\"}),i=z.a.load(e)}catch(e){return console.error(e),a.newSpecErr({source:\"parser\",level:\"error\",message:e.reason,line:e.mark&&e.mark.line?e.mark.line+1:void 0})}return i&&\"object\"===l()(i)?n.updateJsonSpec(i):{}}},we=!1,je=function(e,t){return function(n){var r=n.specActions,a=n.specSelectors,o=n.errActions,i=n.fn,s=i.fetch,c=i.resolve,u=i.AST,l=void 0===u?{}:u,p=n.getConfigs;we||(console.warn(\"specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!\"),we=!0);var f=p(),d=f.modelPropertyMacro,m=f.parameterMacro,g=f.requestInterceptor,b=f.responseInterceptor;void 0===e&&(e=a.specJson()),void 0===t&&(t=a.url());var E=l.getLineNumberForPath?l.getLineNumberForPath:function(){},x=a.specStr();return c({fetch:s,spec:e,baseDoc:t,modelPropertyMacro:d,parameterMacro:m,requestInterceptor:g,responseInterceptor:b}).then((function(e){var t=e.spec,n=e.errors;if(o.clear({type:\"thrown\"}),h()(n)&&n.length>0){var a=v()(n).call(n,(function(e){return console.error(e),e.line=e.fullPath?E(x,e.fullPath):null,e.path=e.fullPath?e.fullPath.join(\".\"):null,e.level=\"error\",e.type=\"thrown\",e.source=\"resolver\",y()(e,\"message\",{enumerable:!0,value:e.message}),e}));o.newThrownErrBatch(a)}return r.updateResolved(t)}))}},Oe=[],Ce=G()(c()(f.a.mark((function e(){var t,n,r,a,o,i,s,u,l,p,d,m,g,b,x,w,O,_;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Oe.system){e.next=4;break}return console.error(\"debResolveSubtrees: don't have a system to operate on, aborting.\"),e.abrupt(\"return\");case 4:if(n=t.errActions,r=t.errSelectors,a=t.fn,o=a.resolveSubtree,i=a.fetch,s=a.AST,u=void 0===s?{}:s,l=t.specSelectors,p=t.specActions,o){e.next=8;break}return console.error(\"Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing.\"),e.abrupt(\"return\");case 8:return d=u.getLineNumberForPath?u.getLineNumberForPath:function(){},m=l.specStr(),g=t.getConfigs(),b=g.modelPropertyMacro,x=g.parameterMacro,w=g.requestInterceptor,O=g.responseInterceptor,e.prev=11,e.next=14,E()(Oe).call(Oe,function(){var e=c()(f.a.mark((function e(t,a){var s,u,p,g,E,_,k,I,P;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return s=e.sent,u=s.resultMap,p=s.specWithCurrentSubtrees,e.next=7,o(p,a,{baseDoc:l.url(),modelPropertyMacro:b,parameterMacro:x,requestInterceptor:w,responseInterceptor:O});case 7:if(g=e.sent,E=g.errors,_=g.spec,r.allErrors().size&&n.clearBy((function(e){var t;return\"thrown\"!==e.get(\"type\")||\"resolver\"!==e.get(\"source\")||!S()(t=e.get(\"fullPath\")).call(t,(function(e,t){return e===a[t]||void 0===a[t]}))})),h()(E)&&E.length>0&&(k=v()(E).call(E,(function(e){return e.line=e.fullPath?d(m,e.fullPath):null,e.path=e.fullPath?e.fullPath.join(\".\"):null,e.level=\"error\",e.type=\"thrown\",e.source=\"resolver\",y()(e,\"message\",{enumerable:!0,value:e.message}),e})),n.newThrownErrBatch(k)),!_||!l.isOAS3()||\"components\"!==a[0]||\"securitySchemes\"!==a[1]){e.next=15;break}return e.next=15,j.a.all(v()(I=C()(P=A()(_)).call(P,(function(e){return\"openIdConnect\"===e.type}))).call(I,function(){var e=c()(f.a.mark((function e(t){var n,r;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={url:t.openIdConnectUrl,requestInterceptor:w,responseInterceptor:O},e.prev=1,e.next=4,i(n);case 4:(r=e.sent)instanceof Error||r.status>=400?console.error(r.statusText+\" \"+n.url):t.openIdConnectData=JSON.parse(r.text),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(1),console.error(e.t0);case 11:case\"end\":return e.stop()}}),e,null,[[1,8]])})));return function(t){return e.apply(this,arguments)}}()));case 15:return X()(u,a,_),X()(p,a,_),e.abrupt(\"return\",{resultMap:u,specWithCurrentSubtrees:p});case 18:case\"end\":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),j.a.resolve({resultMap:(l.specResolvedSubtree([])||Object(F.Map)()).toJS(),specWithCurrentSubtrees:l.specJson().toJS()}));case 14:_=e.sent,delete Oe.system,Oe=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:p.updateResolvedSubtree([],_.resultMap);case 23:case\"end\":return e.stop()}}),e,null,[[11,19]])}))),35),_e=function(e){return function(t){var n;I()(n=v()(Oe).call(Oe,(function(e){return e.join(\"@@\")}))).call(n,e.join(\"@@\"))>-1||(Oe.push(e),Oe.system=t,Ce())}};function Ae(e,t,n,r,a){return{type:ae,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:a}}}function ke(e,t,n,r){return{type:ae,payload:{path:e,param:t,value:n,isXml:r}}}var Ie=function(e,t){return{type:ve,payload:{path:e,value:t}}},Pe=function(){return{type:ve,payload:{path:[],value:Object(F.Map)()}}},Te=function(e,t){return{type:ie,payload:{pathMethod:e,isOAS3:t}}},Re=function(e,t,n,r){return{type:oe,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};function Ne(e){return{type:de,payload:{pathMethod:e}}}function Me(e,t){return{type:he,payload:{path:e,value:t,key:\"consumes_value\"}}}function qe(e,t){return{type:he,payload:{path:e,value:t,key:\"produces_value\"}}}var De=function(e,t,n){return{payload:{path:e,method:t,res:n},type:se}},Be=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ce}},Le=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ue}},Ue=function(e){return{payload:e,type:le}},Ve=function(e){return function(t){var n,r,a=t.fn,o=t.specActions,i=t.specSelectors,s=t.getConfigs,u=t.oas3Selectors,l=e.pathName,p=e.method,d=e.operation,m=s(),g=m.requestInterceptor,y=m.responseInterceptor,b=d.toJS();d&&d.get(\"parameters\")&&T()(n=C()(r=d.get(\"parameters\")).call(r,(function(e){return e&&!0===e.get(\"allowEmptyValue\")}))).call(n,(function(t){if(i.parameterInclusionSettingFor([l,p],t.get(\"name\"),t.get(\"in\"))){e.parameters=e.parameters||{};var n=Object(Q.B)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get(\"name\")]=\"\")}}));if(e.contextUrl=W()(i.url()).toString(),b&&b.operationId?e.operationId=b.operationId:b&&l&&p&&(e.operationId=a.opId(b,l,p)),i.isOAS3()){var E,x=N()(E=\"\".concat(l,\":\")).call(E,p);e.server=u.selectedServer(x)||u.selectedServer();var S=u.serverVariables({server:e.server,namespace:x}).toJS(),w=u.serverVariables({server:e.server}).toJS();e.serverVariables=q()(S).length?S:w,e.requestContentType=u.requestContentType(l,p),e.responseContentType=u.responseContentType(l,p)||\"*/*\";var j,O=u.requestBodyValue(l,p),_=u.requestBodyInclusionSetting(l,p);if(O&&O.toJS)e.requestBody=C()(j=v()(O).call(O,(function(e){return F.Map.isMap(e)?e.get(\"value\"):e}))).call(j,(function(e,t){return(h()(e)?0!==e.length:!Object(Q.q)(e))||_.get(t)})).toJS();else e.requestBody=O}var A=B()({},e);A=a.buildRequest(A),o.setRequest(e.pathName,e.method,A);var k=function(){var t=c()(f.a.mark((function t(n){var r,a;return f.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,g.apply(undefined,[n]);case 2:return r=t.sent,a=B()({},r),o.setMutatedRequest(e.pathName,e.method,a),t.abrupt(\"return\",r);case 6:case\"end\":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();e.requestInterceptor=k,e.responseInterceptor=y;var I=U()();return a.execute(e).then((function(t){t.duration=U()()-I,o.setResponse(e.pathName,e.method,t)})).catch((function(t){\"Failed to fetch\"===t.message&&(t.name=\"\",t.message='**Failed to fetch.**  \\n**Possible Reasons:** \\n  - CORS \\n  - Network Failure \\n  - URL scheme must be \"http\" or \"https\" for CORS request.'),o.setResponse(e.pathName,e.method,{error:!0,err:Object(H.serializeError)(t)})}))}},ze=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=i()(e,ee);return function(e){var o=e.fn.fetch,i=e.specSelectors,s=e.specActions,c=i.specJsonWithResolvedSubtrees().toJS(),u=i.operationScheme(t,n),l=i.contentTypeValues([t,n]).toJS(),p=l.requestContentType,f=l.responseContentType,d=/xml/i.test(p),h=i.parameterValues([t,n],d).toJS();return s.executeRequest(a()(a()({},r),{},{fetch:o,spec:c,pathName:t,method:n,parameters:h,requestContentType:p,scheme:u,responseContentType:f}))}};function Fe(e,t){return{type:pe,payload:{path:e,method:t}}}function Je(e,t){return{type:fe,payload:{path:e,method:t}}}function We(e,t,n){return{type:ge,payload:{scheme:e,path:t,method:n}}}},function(e,t){e.exports=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e}},function(e,t,n){var r=n(34);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){var r=n(140),a=n(200),o=n(199),i=n(150);e.exports=function(e,t){var n=void 0!==r&&a(e)||e[\"@@iterator\"];if(!n){if(o(e)||(n=i(e))||t&&e&&\"number\"==typeof e.length){n&&(e=n);var s=0,c=function(){};return{s:c,n:function(){return s>=e.length?{done:!0}:{done:!1,value:e[s++]}},e:function(e){throw e},f:c}}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 u,l=!0,p=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return l=e.done,e},e:function(e){p=!0,u=e},f:function(){try{l||null==n.return||n.return()}finally{if(p)throw u}}}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){var r=n(42);e.exports=function(e){if(!r(e))throw TypeError(String(e)+\" is not an object\");return e}},function(e,t,n){var r=n(352),a=n(353),o=n(650);e.exports=function(e,t){if(null==e)return{};var n,i,s=o(e,t);if(r){var c=r(e);for(i=0;i<c.length;i++)n=c[i],a(t).call(t,n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_SELECTED_SERVER\",(function(){return r})),n.d(t,\"UPDATE_REQUEST_BODY_VALUE\",(function(){return a})),n.d(t,\"UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG\",(function(){return o})),n.d(t,\"UPDATE_REQUEST_BODY_INCLUSION\",(function(){return i})),n.d(t,\"UPDATE_ACTIVE_EXAMPLES_MEMBER\",(function(){return s})),n.d(t,\"UPDATE_REQUEST_CONTENT_TYPE\",(function(){return c})),n.d(t,\"UPDATE_RESPONSE_CONTENT_TYPE\",(function(){return u})),n.d(t,\"UPDATE_SERVER_VARIABLE_VALUE\",(function(){return l})),n.d(t,\"SET_REQUEST_BODY_VALIDATE_ERROR\",(function(){return p})),n.d(t,\"CLEAR_REQUEST_BODY_VALIDATE_ERROR\",(function(){return f})),n.d(t,\"CLEAR_REQUEST_BODY_VALUE\",(function(){return d})),n.d(t,\"setSelectedServer\",(function(){return h})),n.d(t,\"setRequestBodyValue\",(function(){return m})),n.d(t,\"setRetainRequestBodyValueFlag\",(function(){return v})),n.d(t,\"setRequestBodyInclusion\",(function(){return g})),n.d(t,\"setActiveExamplesMember\",(function(){return y})),n.d(t,\"setRequestContentType\",(function(){return b})),n.d(t,\"setResponseContentType\",(function(){return E})),n.d(t,\"setServerVariableValue\",(function(){return x})),n.d(t,\"setRequestBodyValidateError\",(function(){return S})),n.d(t,\"clearRequestBodyValidateError\",(function(){return w})),n.d(t,\"initRequestBodyValidateError\",(function(){return j})),n.d(t,\"clearRequestBodyValue\",(function(){return O}));var r=\"oas3_set_servers\",a=\"oas3_set_request_body_value\",o=\"oas3_set_request_body_retain_flag\",i=\"oas3_set_request_body_inclusion\",s=\"oas3_set_active_examples_member\",c=\"oas3_set_request_content_type\",u=\"oas3_set_response_content_type\",l=\"oas3_set_server_variable_value\",p=\"oas3_set_request_body_validate_error\",f=\"oas3_clear_request_body_validate_error\",d=\"oas3_clear_request_body_value\";function h(e,t){return{type:r,payload:{selectedServerUrl:e,namespace:t}}}function m(e){var t=e.value,n=e.pathMethod;return{type:a,payload:{value:t,pathMethod:n}}}var v=function(e){var t=e.value,n=e.pathMethod;return{type:o,payload:{value:t,pathMethod:n}}};function g(e){var t=e.value,n=e.pathMethod,r=e.name;return{type:i,payload:{value:t,pathMethod:n,name:r}}}function y(e){var t=e.name,n=e.pathMethod,r=e.contextType,a=e.contextName;return{type:s,payload:{name:t,pathMethod:n,contextType:r,contextName:a}}}function b(e){var t=e.value,n=e.pathMethod;return{type:c,payload:{value:t,pathMethod:n}}}function E(e){var t=e.value,n=e.path,r=e.method;return{type:u,payload:{value:t,path:n,method:r}}}function x(e){var t=e.server,n=e.namespace,r=e.key,a=e.val;return{type:l,payload:{server:t,namespace:n,key:r,val:a}}}var S=function(e){var t=e.path,n=e.method,r=e.validationErrors;return{type:p,payload:{path:t,method:n,validationErrors:r}}},w=function(e){var t=e.path,n=e.method;return{type:f,payload:{path:t,method:n}}},j=function(e){var t=e.pathMethod;return{type:f,payload:{path:t[0],method:t[1]}}},O=function(e){var t=e.pathMethod;return{type:d,payload:{pathMethod:t}}}},function(e,t,n){var r=n(53),a={}.hasOwnProperty;e.exports=Object.hasOwn||function(e,t){return a.call(r(e),t)}},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&(\"object\"==t||\"function\"==t)}},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return m})),n.d(t,\"e\",(function(){return v})),n.d(t,\"c\",(function(){return y})),n.d(t,\"a\",(function(){return b})),n.d(t,\"d\",(function(){return E}));var r=n(44),a=n.n(r),o=n(18),i=n.n(o),s=n(2),c=n.n(s),u=n(50),l=n.n(u),p=n(286),f=n.n(p),d=function(e){return String.prototype.toLowerCase.call(e)},h=function(e){return e.replace(/[^\\w]/gi,\"_\")};function m(e){var t=e.openapi;return!!t&&f()(t,\"3\")}function v(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=r.v2OperationIdCompatibilityMode;if(!e||\"object\"!==i()(e))return null;var o=(e.operationId||\"\").replace(/\\s/g,\"\");return o.length?h(e.operationId):g(t,n,{v2OperationIdCompatibilityMode:a})}function g(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=r.v2OperationIdCompatibilityMode;if(a){var o,i,s=c()(o=\"\".concat(t.toLowerCase(),\"_\")).call(o,e).replace(/[\\s!@#$%^&*()_+=[{\\]};:<>|./?,\\\\'\"\"-]/g,\"_\");return(s=s||c()(i=\"\".concat(e.substring(1),\"_\")).call(i,t)).replace(/((_){2,})/g,\"_\").replace(/^(_)*/g,\"\").replace(/([_])*$/g,\"\")}return c()(n=\"\".concat(d(t))).call(n,h(e))}function y(e,t){var n;return c()(n=\"\".concat(d(t),\"-\")).call(n,e)}function b(e,t){return e&&e.paths?function(e,t){return function(e,t,n){if(!e||\"object\"!==i()(e)||!e.paths||\"object\"!==i()(e.paths))return null;var r=e.paths;for(var a in r)for(var o in r[a])if(\"PARAMETERS\"!==o.toUpperCase()){var s=r[a][o];if(s&&\"object\"===i()(s)){var c={spec:e,pathName:a,method:o.toUpperCase(),operation:s},u=t(c);if(n&&u)return c}}return}(e,t,!0)||null}(e,(function(e){var n=e.pathName,r=e.method,a=e.operation;if(!a||\"object\"!==i()(a))return!1;var o=a.operationId;return[v(a,n,r),y(n,r),o].some((function(e){return e&&e===t}))})):null}function E(e){var t=e.spec,n=t.paths,r={};if(!n||t.$$normalized)return e;for(var o in n){var i=n[o];if(l()(i)){var s=i.parameters,u=function(e){var n=i[e];if(!l()(n))return\"continue\";var u=v(n,o,e);if(u){r[u]?r[u].push(n):r[u]=[n];var p=r[u];if(p.length>1)p.forEach((function(e,t){var n;e.__originalOperationId=e.__originalOperationId||e.operationId,e.operationId=c()(n=\"\".concat(u)).call(n,t+1)}));else if(void 0!==n.operationId){var f=p[0];f.__originalOperationId=f.__originalOperationId||n.operationId,f.operationId=u}}if(\"parameters\"!==e){var d=[],h={};for(var m in t)\"produces\"!==m&&\"consumes\"!==m&&\"security\"!==m||(h[m]=t[m],d.push(h));if(s&&(h.parameters=s,d.push(h)),d.length){var g,y=a()(d);try{for(y.s();!(g=y.n()).done;){var b=g.value;for(var E in b)if(n[E]){if(\"parameters\"===E){var x,S=a()(b[E]);try{var w=function(){var e=x.value;n[E].some((function(t){return t.name&&t.name===e.name||t.$ref&&t.$ref===e.$ref||t.$$ref&&t.$$ref===e.$$ref||t===e}))||n[E].push(e)};for(S.s();!(x=S.n()).done;)w()}catch(e){S.e(e)}finally{S.f()}}}else n[E]=b[E]}}catch(e){y.e(e)}finally{y.f()}}}};for(var p in i)u(p)}}return t.$$normalized=!0,e}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"NEW_THROWN_ERR\",(function(){return a})),n.d(t,\"NEW_THROWN_ERR_BATCH\",(function(){return o})),n.d(t,\"NEW_SPEC_ERR\",(function(){return i})),n.d(t,\"NEW_SPEC_ERR_BATCH\",(function(){return s})),n.d(t,\"NEW_AUTH_ERR\",(function(){return c})),n.d(t,\"CLEAR\",(function(){return u})),n.d(t,\"CLEAR_BY\",(function(){return l})),n.d(t,\"newThrownErr\",(function(){return p})),n.d(t,\"newThrownErrBatch\",(function(){return f})),n.d(t,\"newSpecErr\",(function(){return d})),n.d(t,\"newSpecErrBatch\",(function(){return h})),n.d(t,\"newAuthErr\",(function(){return m})),n.d(t,\"clear\",(function(){return v})),n.d(t,\"clearBy\",(function(){return g}));var r=n(114),a=\"err_new_thrown_err\",o=\"err_new_thrown_err_batch\",i=\"err_new_spec_err\",s=\"err_new_spec_err_batch\",c=\"err_new_auth_err\",u=\"err_clear\",l=\"err_clear_by\";function p(e){return{type:a,payload:Object(r.serializeError)(e)}}function f(e){return{type:o,payload:e}}function d(e){return{type:i,payload:e}}function h(e){return{type:s,payload:e}}function m(e){return{type:c,payload:e}}function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:u,payload:e}}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:l,payload:e}}},function(e,t,n){var r=n(89);e.exports=function(e){return Object(r(e))}},function(e,t){e.exports=require(\"classnames\")},function(e,t,n){e.exports=n(524)},function(e,t,n){e.exports=n(665)},function(e,t,n){var r=n(142),a=n(89);e.exports=function(e){return r(a(e))}},function(e,t,n){var r=n(43),a=n(59),o=n(88);e.exports=r?function(e,t,n){return a.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(43),a=n(291),o=n(46),i=n(143),s=Object.defineProperty;t.f=r?s:function(e,t,n){if(o(e),t=i(t,!0),o(n),a)try{return s(e,t,n)}catch(e){}if(\"get\"in n||\"set\"in n)throw TypeError(\"Accessors not supported\");return\"value\"in n&&(e[t]=n.value),e}},function(e,t,n){var r=n(105),a=Math.min;e.exports=function(e){return e>0?a(r(e),9007199254740991):0}},function(e,t,n){var r=n(31),a=n(36),o=function(e){return\"function\"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(a[e]):r[e]&&r[e][t]||a[e]&&a[e][t]}},function(e,t,n){var r=n(328),a=\"object\"==typeof self&&self&&self.Object===Object&&self,o=r||a||Function(\"return this\")();e.exports=o},function(e,t){e.exports=require(\"js-yaml\")},function(e,t,n){e.exports=n(510)},function(e,t,n){var r=n(651);function a(e,t,n,a,o,i,s){try{var c=e[i](s),u=c.value}catch(e){return void n(e)}c.done?t(u):r.resolve(u).then(a,o)}e.exports=function(e){return function(){var t=this,n=arguments;return new r((function(r,o){var i=e.apply(t,n);function s(e){a(i,r,o,s,c,\"next\",e)}function c(e){a(i,r,o,s,c,\"throw\",e)}s(void 0)}))}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e){if(\"function\"!=typeof e)throw TypeError(String(e)+\" is not a function\");return e}},function(e,t,n){var r,a,o,i=n(297),s=n(36),c=n(42),u=n(58),l=n(49),p=n(186),f=n(146),d=n(125),h=\"Object already initialized\",m=s.WeakMap;if(i||p.state){var v=p.state||(p.state=new m),g=v.get,y=v.has,b=v.set;r=function(e,t){if(y.call(v,e))throw new TypeError(h);return t.facade=e,b.call(v,e,t),t},a=function(e){return g.call(v,e)||{}},o=function(e){return y.call(v,e)}}else{var E=f(\"state\");d[E]=!0,r=function(e,t){if(l(e,E))throw new TypeError(h);return t.facade=e,u(e,E,t),t},a=function(e){return l(e,E)?e[E]:{}},o=function(e){return l(e,E)}}e.exports={set:r,get:a,has:o,enforce:function(e){return o(e)?a(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!c(t)||(n=a(t)).type!==e)throw TypeError(\"Incompatible receiver, \"+e+\" required\");return n}}}},function(e,t){e.exports=require(\"deep-extend\")},function(e,t,n){e.exports=n(495)},function(e,t){e.exports=require(\"url\")},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"SHOW_AUTH_POPUP\",(function(){return d})),n.d(t,\"AUTHORIZE\",(function(){return h})),n.d(t,\"LOGOUT\",(function(){return m})),n.d(t,\"PRE_AUTHORIZE_OAUTH2\",(function(){return v})),n.d(t,\"AUTHORIZE_OAUTH2\",(function(){return g})),n.d(t,\"VALIDATE\",(function(){return y})),n.d(t,\"CONFIGURE_AUTH\",(function(){return b})),n.d(t,\"RESTORE_AUTHORIZATION\",(function(){return E})),n.d(t,\"showDefinitions\",(function(){return x})),n.d(t,\"authorize\",(function(){return S})),n.d(t,\"authorizeWithPersistOption\",(function(){return w})),n.d(t,\"logout\",(function(){return j})),n.d(t,\"logoutWithPersistOption\",(function(){return O})),n.d(t,\"preAuthorizeImplicit\",(function(){return C})),n.d(t,\"authorizeOauth2\",(function(){return _})),n.d(t,\"authorizeOauth2WithPersistOption\",(function(){return A})),n.d(t,\"authorizePassword\",(function(){return k})),n.d(t,\"authorizeApplication\",(function(){return I})),n.d(t,\"authorizeAccessCodeWithFormParams\",(function(){return P})),n.d(t,\"authorizeAccessCodeWithBasicAuthentication\",(function(){return T})),n.d(t,\"authorizeRequest\",(function(){return R})),n.d(t,\"configureAuth\",(function(){return N})),n.d(t,\"restoreAuthorization\",(function(){return M})),n.d(t,\"persistAuthorizationIfNeeded\",(function(){return q}));var r=n(18),a=n.n(r),o=n(30),i=n.n(o),s=n(20),c=n.n(s),u=n(78),l=n.n(u),p=n(25),f=n(5),d=\"show_popup\",h=\"authorize\",m=\"logout\",v=\"pre_authorize_oauth2\",g=\"authorize_oauth2\",y=\"validate\",b=\"configure_auth\",E=\"restore_authorization\";function x(e){return{type:d,payload:e}}function S(e){return{type:h,payload:e}}var w=function(e){return function(t){var n=t.authActions;n.authorize(e),n.persistAuthorizationIfNeeded()}};function j(e){return{type:m,payload:e}}var O=function(e){return function(t){var n=t.authActions;n.logout(e),n.persistAuthorizationIfNeeded()}},C=function(e){return function(t){var n=t.authActions,r=t.errActions,a=e.auth,o=e.token,s=e.isValid,c=a.schema,u=a.name,l=c.get(\"flow\");delete p.a.swaggerUIRedirectOauth2,\"accessCode\"===l||s||r.newAuthErr({authId:u,source:\"auth\",level:\"warning\",message:\"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server\"}),o.error?r.newAuthErr({authId:u,source:\"auth\",level:\"error\",message:i()(o)}):n.authorizeOauth2WithPersistOption({auth:a,token:o})}};function _(e){return{type:g,payload:e}}var A=function(e){return function(t){var n=t.authActions;n.authorizeOauth2(e),n.persistAuthorizationIfNeeded()}},k=function(e){return function(t){var n=t.authActions,r=e.schema,a=e.name,o=e.username,i=e.password,s=e.passwordType,u=e.clientId,l=e.clientSecret,p={grant_type:\"password\",scope:e.scopes.join(\" \"),username:o,password:i},d={};switch(s){case\"request-body\":!function(e,t,n){t&&c()(e,{client_id:t});n&&c()(e,{client_secret:n})}(p,u,l);break;case\"basic\":d.Authorization=\"Basic \"+Object(f.a)(u+\":\"+l);break;default:console.warn(\"Warning: invalid passwordType \".concat(s,\" was passed, not including client id and secret\"))}return n.authorizeRequest({body:Object(f.b)(p),url:r.get(\"tokenUrl\"),name:a,headers:d,query:{},auth:e})}};var I=function(e){return function(t){var n=t.authActions,r=e.schema,a=e.scopes,o=e.name,i=e.clientId,s=e.clientSecret,c={Authorization:\"Basic \"+Object(f.a)(i+\":\"+s)},u={grant_type:\"client_credentials\",scope:a.join(\" \")};return n.authorizeRequest({body:Object(f.b)(u),name:o,url:r.get(\"tokenUrl\"),auth:e,headers:c})}},P=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,a=t.schema,o=t.name,i=t.clientId,s=t.clientSecret,c=t.codeVerifier,u={grant_type:\"authorization_code\",code:t.code,client_id:i,client_secret:s,redirect_uri:n,code_verifier:c};return r.authorizeRequest({body:Object(f.b)(u),name:o,url:a.get(\"tokenUrl\"),auth:t})}},T=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,a=t.schema,o=t.name,i=t.clientId,s=t.clientSecret,c=t.codeVerifier,u={Authorization:\"Basic \"+Object(f.a)(i+\":\"+s)},l={grant_type:\"authorization_code\",code:t.code,client_id:i,redirect_uri:n,code_verifier:c};return r.authorizeRequest({body:Object(f.b)(l),name:o,url:a.get(\"tokenUrl\"),auth:t,headers:u})}},R=function(e){return function(t){var n,r=t.fn,o=t.getConfigs,s=t.authActions,u=t.errActions,p=t.oas3Selectors,f=t.specSelectors,d=t.authSelectors,h=e.body,m=e.query,v=void 0===m?{}:m,g=e.headers,y=void 0===g?{}:g,b=e.name,E=e.url,x=e.auth,S=(d.getConfigs()||{}).additionalQueryStringParams;if(f.isOAS3()){var w=p.serverEffectiveValue(p.selectedServer());n=l()(E,w,!0)}else n=l()(E,f.url(),!0);\"object\"===a()(S)&&(n.query=c()({},n.query,S));var j=n.toString(),O=c()({Accept:\"application/json, text/plain, */*\",\"Content-Type\":\"application/x-www-form-urlencoded\",\"X-Requested-With\":\"XMLHttpRequest\"},y);r.fetch({url:j,method:\"post\",headers:O,query:v,body:h,requestInterceptor:o().requestInterceptor,responseInterceptor:o().responseInterceptor}).then((function(e){var t=JSON.parse(e.data),n=t&&(t.error||\"\"),r=t&&(t.parseError||\"\");e.ok?n||r?u.newAuthErr({authId:b,level:\"error\",source:\"auth\",message:i()(t)}):s.authorizeOauth2WithPersistOption({auth:x,token:t}):u.newAuthErr({authId:b,level:\"error\",source:\"auth\",message:e.statusText})})).catch((function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r=\"string\"==typeof n?JSON.parse(n):n;r.error&&(t+=\", error: \".concat(r.error)),r.error_description&&(t+=\", description: \".concat(r.error_description))}catch(e){}}u.newAuthErr({authId:b,level:\"error\",source:\"auth\",message:t})}))}};function N(e){return{type:b,payload:e}}function M(e){return{type:E,payload:e}}var q=function(){return function(e){var t=e.authSelectors;if((0,e.getConfigs)().persistAuthorization){var n=t.authorized();localStorage.setItem(\"authorized\",i()(n.toJS()))}}}},function(e,t){e.exports=require(\"react-syntax-highlighter\")},function(e,t,n){var r=n(90),a=n(142),o=n(53),i=n(60),s=n(184),c=[].push,u=function(e){var t=1==e,n=2==e,u=3==e,l=4==e,p=6==e,f=7==e,d=5==e||p;return function(h,m,v,g){for(var y,b,E=o(h),x=a(E),S=r(m,v,3),w=i(x.length),j=0,O=g||s,C=t?O(h,w):n||f?O(h,0):void 0;w>j;j++)if((d||j in x)&&(b=S(y=x[j],j,E),e))if(t)C[j]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return j;case 2:c.call(C,y)}else switch(e){case 4:return!1;case 7:c.call(C,y)}return p?-1:u||l?l:C}};e.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterOut:u(7)}},function(e,t,n){n(126);var r=n(447),a=n(36),o=n(83),i=n(58),s=n(108),c=n(37)(\"toStringTag\");for(var u in r){var l=a[u],p=l&&l.prototype;p&&o(p)!==c&&i(p,c,u),s[u]=s.Array}},function(e,t){e.exports=function(e){return null!=e&&\"object\"==typeof e}},function(e,t,n){var r=n(327);e.exports=function(e){return null==e?\"\":r(e)}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"lastError\",(function(){return N})),n.d(t,\"url\",(function(){return M})),n.d(t,\"specStr\",(function(){return q})),n.d(t,\"specSource\",(function(){return D})),n.d(t,\"specJson\",(function(){return B})),n.d(t,\"specResolved\",(function(){return L})),n.d(t,\"specResolvedSubtree\",(function(){return U})),n.d(t,\"specJsonWithResolvedSubtrees\",(function(){return z})),n.d(t,\"spec\",(function(){return F})),n.d(t,\"isOAS3\",(function(){return J})),n.d(t,\"info\",(function(){return W})),n.d(t,\"externalDocs\",(function(){return H})),n.d(t,\"version\",(function(){return $})),n.d(t,\"semver\",(function(){return Y})),n.d(t,\"paths\",(function(){return K})),n.d(t,\"operations\",(function(){return G})),n.d(t,\"consumes\",(function(){return Z})),n.d(t,\"produces\",(function(){return X})),n.d(t,\"security\",(function(){return Q})),n.d(t,\"securityDefinitions\",(function(){return ee})),n.d(t,\"findDefinition\",(function(){return te})),n.d(t,\"definitions\",(function(){return ne})),n.d(t,\"basePath\",(function(){return re})),n.d(t,\"host\",(function(){return ae})),n.d(t,\"schemes\",(function(){return oe})),n.d(t,\"operationsWithRootInherited\",(function(){return ie})),n.d(t,\"tags\",(function(){return se})),n.d(t,\"tagDetails\",(function(){return ce})),n.d(t,\"operationsWithTags\",(function(){return ue})),n.d(t,\"taggedOperations\",(function(){return le})),n.d(t,\"responses\",(function(){return pe})),n.d(t,\"requests\",(function(){return fe})),n.d(t,\"mutatedRequests\",(function(){return de})),n.d(t,\"responseFor\",(function(){return he})),n.d(t,\"requestFor\",(function(){return me})),n.d(t,\"mutatedRequestFor\",(function(){return ve})),n.d(t,\"allowTryItOutFor\",(function(){return ge})),n.d(t,\"parameterWithMetaByIdentity\",(function(){return ye})),n.d(t,\"parameterInclusionSettingFor\",(function(){return be})),n.d(t,\"parameterWithMeta\",(function(){return Ee})),n.d(t,\"operationWithMeta\",(function(){return xe})),n.d(t,\"getParameter\",(function(){return Se})),n.d(t,\"hasHost\",(function(){return we})),n.d(t,\"parameterValues\",(function(){return je})),n.d(t,\"parametersIncludeIn\",(function(){return Oe})),n.d(t,\"parametersIncludeType\",(function(){return Ce})),n.d(t,\"contentTypeValues\",(function(){return _e})),n.d(t,\"currentProducesFor\",(function(){return Ae})),n.d(t,\"producesOptionsFor\",(function(){return ke})),n.d(t,\"consumesOptionsFor\",(function(){return Ie})),n.d(t,\"operationScheme\",(function(){return Pe})),n.d(t,\"canExecuteScheme\",(function(){return Te})),n.d(t,\"validateBeforeExecute\",(function(){return Re})),n.d(t,\"getOAS3RequiredRequestBodyContentType\",(function(){return Ne})),n.d(t,\"isMediaTypeSchemaPropertiesEqual\",(function(){return Me}));var r=n(13),a=n.n(r),o=n(14),i=n.n(o),s=n(2),c=n.n(s),u=n(19),l=n.n(u),p=n(23),f=n.n(p),d=n(17),h=n.n(d),m=n(4),v=n.n(m),g=n(12),y=n.n(g),b=n(55),E=n.n(b),x=n(28),S=n.n(x),w=n(164),j=n.n(w),O=n(64),C=n.n(O),_=n(22),A=n.n(_),k=n(16),I=n(5),P=n(1),T=[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\",\"trace\"],R=function(e){return e||Object(P.Map)()},N=Object(k.createSelector)(R,(function(e){return e.get(\"lastError\")})),M=Object(k.createSelector)(R,(function(e){return e.get(\"url\")})),q=Object(k.createSelector)(R,(function(e){return e.get(\"spec\")||\"\"})),D=Object(k.createSelector)(R,(function(e){return e.get(\"specSource\")||\"not-editor\"})),B=Object(k.createSelector)(R,(function(e){return e.get(\"json\",Object(P.Map)())})),L=Object(k.createSelector)(R,(function(e){return e.get(\"resolved\",Object(P.Map)())})),U=function(e,t){var n;return e.getIn(c()(n=[\"resolvedSubtrees\"]).call(n,i()(t)),void 0)},V=function e(t,n){return P.Map.isMap(t)&&P.Map.isMap(n)?n.get(\"$$ref\")?n:Object(P.OrderedMap)().mergeWith(e,t,n):n},z=Object(k.createSelector)(R,(function(e){return Object(P.OrderedMap)().mergeWith(V,e.get(\"json\"),e.get(\"resolvedSubtrees\"))})),F=function(e){return B(e)},J=Object(k.createSelector)(F,(function(){return!1})),W=Object(k.createSelector)(F,(function(e){return qe(e&&e.get(\"info\"))})),H=Object(k.createSelector)(F,(function(e){return qe(e&&e.get(\"externalDocs\"))})),$=Object(k.createSelector)(W,(function(e){return e&&e.get(\"version\")})),Y=Object(k.createSelector)($,(function(e){var t;return l()(t=/v?([0-9]*)\\.([0-9]*)\\.([0-9]*)/i.exec(e)).call(t,1)})),K=Object(k.createSelector)(z,(function(e){return e.get(\"paths\")})),G=Object(k.createSelector)(K,(function(e){if(!e||e.size<1)return Object(P.List)();var t=Object(P.List)();return e&&f()(e)?(f()(e).call(e,(function(e,n){if(!e||!f()(e))return{};f()(e).call(e,(function(e,r){var a;h()(T).call(T,r)<0||(t=t.push(Object(P.fromJS)({path:n,method:r,operation:e,id:c()(a=\"\".concat(r,\"-\")).call(a,n)})))}))})),t):Object(P.List)()})),Z=Object(k.createSelector)(F,(function(e){return Object(P.Set)(e.get(\"consumes\"))})),X=Object(k.createSelector)(F,(function(e){return Object(P.Set)(e.get(\"produces\"))})),Q=Object(k.createSelector)(F,(function(e){return e.get(\"security\",Object(P.List)())})),ee=Object(k.createSelector)(F,(function(e){return e.get(\"securityDefinitions\")})),te=function(e,t){var n=e.getIn([\"resolvedSubtrees\",\"definitions\",t],null),r=e.getIn([\"json\",\"definitions\",t],null);return n||r||null},ne=Object(k.createSelector)(F,(function(e){var t=e.get(\"definitions\");return P.Map.isMap(t)?t:Object(P.Map)()})),re=Object(k.createSelector)(F,(function(e){return e.get(\"basePath\")})),ae=Object(k.createSelector)(F,(function(e){return e.get(\"host\")})),oe=Object(k.createSelector)(F,(function(e){return e.get(\"schemes\",Object(P.Map)())})),ie=Object(k.createSelector)(G,Z,X,(function(e,t,n){return v()(e).call(e,(function(e){return e.update(\"operation\",(function(e){if(e){if(!P.Map.isMap(e))return;return e.withMutations((function(e){return e.get(\"consumes\")||e.update(\"consumes\",(function(e){return Object(P.Set)(e).merge(t)})),e.get(\"produces\")||e.update(\"produces\",(function(e){return Object(P.Set)(e).merge(n)})),e}))}return Object(P.Map)()}))}))})),se=Object(k.createSelector)(F,(function(e){var t=e.get(\"tags\",Object(P.List)());return P.List.isList(t)?y()(t).call(t,(function(e){return P.Map.isMap(e)})):Object(P.List)()})),ce=function(e,t){var n,r=se(e)||Object(P.List)();return E()(n=y()(r).call(r,P.Map.isMap)).call(n,(function(e){return e.get(\"name\")===t}),Object(P.Map)())},ue=Object(k.createSelector)(ie,se,(function(e,t){return S()(e).call(e,(function(e,t){var n=Object(P.Set)(t.getIn([\"operation\",\"tags\"]));return n.count()<1?e.update(\"default\",Object(P.List)(),(function(e){return e.push(t)})):S()(n).call(n,(function(e,n){return e.update(n,Object(P.List)(),(function(e){return e.push(t)}))}),e)}),S()(t).call(t,(function(e,t){return e.set(t.get(\"name\"),Object(P.List)())}),Object(P.OrderedMap)()))})),le=function(e){return function(t){var n,r=(0,t.getConfigs)(),a=r.tagsSorter,o=r.operationsSorter;return v()(n=ue(e).sortBy((function(e,t){return t}),(function(e,t){var n=\"function\"==typeof a?a:I.H.tagsSorter[a];return n?n(e,t):null}))).call(n,(function(t,n){var r=\"function\"==typeof o?o:I.H.operationsSorter[o],a=r?j()(t).call(t,r):t;return Object(P.Map)({tagDetails:ce(e,n),operations:a})}))}},pe=Object(k.createSelector)(R,(function(e){return e.get(\"responses\",Object(P.Map)())})),fe=Object(k.createSelector)(R,(function(e){return e.get(\"requests\",Object(P.Map)())})),de=Object(k.createSelector)(R,(function(e){return e.get(\"mutatedRequests\",Object(P.Map)())})),he=function(e,t,n){return pe(e).getIn([t,n],null)},me=function(e,t,n){return fe(e).getIn([t,n],null)},ve=function(e,t,n){return de(e).getIn([t,n],null)},ge=function(){return!0},ye=function(e,t,n){var r,a,o=z(e).getIn(c()(r=[\"paths\"]).call(r,i()(t),[\"parameters\"]),Object(P.OrderedMap)()),s=e.getIn(c()(a=[\"meta\",\"paths\"]).call(a,i()(t),[\"parameters\"]),Object(P.OrderedMap)()),u=v()(o).call(o,(function(e){var t,r,a,o=s.get(c()(t=\"\".concat(n.get(\"in\"),\".\")).call(t,n.get(\"name\"))),i=s.get(c()(r=c()(a=\"\".concat(n.get(\"in\"),\".\")).call(a,n.get(\"name\"),\".hash-\")).call(r,n.hashCode()));return Object(P.OrderedMap)().merge(e,o,i)}));return E()(u).call(u,(function(e){return e.get(\"in\")===n.get(\"in\")&&e.get(\"name\")===n.get(\"name\")}),Object(P.OrderedMap)())},be=function(e,t,n,r){var a,o,s=c()(a=\"\".concat(r,\".\")).call(a,n);return e.getIn(c()(o=[\"meta\",\"paths\"]).call(o,i()(t),[\"parameter_inclusions\",s]),!1)},Ee=function(e,t,n,r){var a,o=z(e).getIn(c()(a=[\"paths\"]).call(a,i()(t),[\"parameters\"]),Object(P.OrderedMap)()),s=E()(o).call(o,(function(e){return e.get(\"in\")===r&&e.get(\"name\")===n}),Object(P.OrderedMap)());return ye(e,t,s)},xe=function(e,t,n){var r,a=z(e).getIn([\"paths\",t,n],Object(P.OrderedMap)()),o=e.getIn([\"meta\",\"paths\",t,n],Object(P.OrderedMap)()),i=v()(r=a.get(\"parameters\",Object(P.List)())).call(r,(function(r){return ye(e,[t,n],r)}));return Object(P.OrderedMap)().merge(a,o).set(\"parameters\",i)};function Se(e,t,n,r){var a;t=t||[];var o=e.getIn(c()(a=[\"meta\",\"paths\"]).call(a,i()(t),[\"parameters\"]),Object(P.fromJS)([]));return E()(o).call(o,(function(e){return P.Map.isMap(e)&&e.get(\"name\")===n&&e.get(\"in\")===r}))||Object(P.Map)()}var we=Object(k.createSelector)(F,(function(e){var t=e.get(\"host\");return\"string\"==typeof t&&t.length>0&&\"/\"!==t[0]}));function je(e,t,n){var r;t=t||[];var a=xe.apply(void 0,c()(r=[e]).call(r,i()(t))).get(\"parameters\",Object(P.List)());return S()(a).call(a,(function(e,t){var r=n&&\"body\"===t.get(\"in\")?t.get(\"value_xml\"):t.get(\"value\");return e.set(Object(I.A)(t,{allowHashes:!1}),r)}),Object(P.fromJS)({}))}function Oe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(P.List.isList(e))return C()(e).call(e,(function(e){return P.Map.isMap(e)&&e.get(\"in\")===t}))}function Ce(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(P.List.isList(e))return C()(e).call(e,(function(e){return P.Map.isMap(e)&&e.get(\"type\")===t}))}function _e(e,t){var n,r;t=t||[];var a=z(e).getIn(c()(n=[\"paths\"]).call(n,i()(t)),Object(P.fromJS)({})),o=e.getIn(c()(r=[\"meta\",\"paths\"]).call(r,i()(t)),Object(P.fromJS)({})),s=Ae(e,t),u=a.get(\"parameters\")||new P.List,l=o.get(\"consumes_value\")?o.get(\"consumes_value\"):Ce(u,\"file\")?\"multipart/form-data\":Ce(u,\"formData\")?\"application/x-www-form-urlencoded\":void 0;return Object(P.fromJS)({requestContentType:l,responseContentType:s})}function Ae(e,t){var n,r;t=t||[];var a=z(e).getIn(c()(n=[\"paths\"]).call(n,i()(t)),null);if(null!==a){var o=e.getIn(c()(r=[\"meta\",\"paths\"]).call(r,i()(t),[\"produces_value\"]),null),s=a.getIn([\"produces\",0],null);return o||s||\"application/json\"}}function ke(e,t){var n;t=t||[];var r=z(e),o=r.getIn(c()(n=[\"paths\"]).call(n,i()(t)),null);if(null!==o){var s=t,u=a()(s,1)[0],l=o.get(\"produces\",null),p=r.getIn([\"paths\",u,\"produces\"],null),f=r.getIn([\"produces\"],null);return l||p||f}}function Ie(e,t){var n;t=t||[];var r=z(e),o=r.getIn(c()(n=[\"paths\"]).call(n,i()(t)),null);if(null!==o){var s=t,u=a()(s,1)[0],l=o.get(\"consumes\",null),p=r.getIn([\"paths\",u,\"consumes\"],null),f=r.getIn([\"consumes\"],null);return l||p||f}}var Pe=function(e,t,n){var r=e.get(\"url\").match(/^([a-z][a-z0-9+\\-.]*):/),a=A()(r)?r[1]:null;return e.getIn([\"scheme\",t,n])||e.getIn([\"scheme\",\"_defaultScheme\"])||a||\"\"},Te=function(e,t,n){var r;return h()(r=[\"http\",\"https\"]).call(r,Pe(e,t,n))>-1},Re=function(e,t){var n;t=t||[];var r=e.getIn(c()(n=[\"meta\",\"paths\"]).call(n,i()(t),[\"parameters\"]),Object(P.fromJS)([])),a=!0;return f()(r).call(r,(function(e){var t=e.get(\"errors\");t&&t.count()&&(a=!1)})),a},Ne=function(e,t){var n,r,a={requestBody:!1,requestContentType:{}},o=e.getIn(c()(n=[\"resolvedSubtrees\",\"paths\"]).call(n,i()(t),[\"requestBody\"]),Object(P.fromJS)([]));return o.size<1||(o.getIn([\"required\"])&&(a.requestBody=o.getIn([\"required\"])),f()(r=o.getIn([\"content\"]).entrySeq()).call(r,(function(e){var t=e[0];if(e[1].getIn([\"schema\",\"required\"])){var n=e[1].getIn([\"schema\",\"required\"]).toJS();a.requestContentType[t]=n}}))),a},Me=function(e,t,n,r){var a;if((n||r)&&n===r)return!0;var o=e.getIn(c()(a=[\"resolvedSubtrees\",\"paths\"]).call(a,i()(t),[\"requestBody\",\"content\"]),Object(P.fromJS)([]));if(o.size<2||!n||!r)return!1;var s=o.getIn([n,\"schema\",\"properties\"],Object(P.fromJS)([])),u=o.getIn([r,\"schema\",\"properties\"],Object(P.fromJS)([]));return!!s.equals(u)};function qe(e){return P.Map.isMap(e)?e:new P.Map}},function(e,t){e.exports=require(\"url-parse\")},function(e,t,n){e.exports=n(748)},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return O})),n.d(t,\"a\",(function(){return s.Light}));var r=n(15),a=n.n(r),o=n(29),i=n.n(o),s=n(72),c=n(395),u=n.n(c).a,l=n(394),p=n.n(l).a,f=n(396),d=n.n(f).a,h=n(399),m=n.n(h).a,v=n(397),g=n.n(v).a,y=n(398),b=n.n(y).a,E=n(400),x=n.n(E).a,S={hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#333\",color:\"white\"},\"hljs-name\":{fontWeight:\"bold\"},\"hljs-strong\":{fontWeight:\"bold\"},\"hljs-code\":{fontStyle:\"italic\",color:\"#888\"},\"hljs-emphasis\":{fontStyle:\"italic\"},\"hljs-tag\":{color:\"#62c8f3\"},\"hljs-variable\":{color:\"#ade5fc\"},\"hljs-template-variable\":{color:\"#ade5fc\"},\"hljs-selector-id\":{color:\"#ade5fc\"},\"hljs-selector-class\":{color:\"#ade5fc\"},\"hljs-string\":{color:\"#a2fca2\"},\"hljs-bullet\":{color:\"#d36363\"},\"hljs-type\":{color:\"#ffa\"},\"hljs-title\":{color:\"#ffa\"},\"hljs-section\":{color:\"#ffa\"},\"hljs-attribute\":{color:\"#ffa\"},\"hljs-quote\":{color:\"#ffa\"},\"hljs-built_in\":{color:\"#ffa\"},\"hljs-builtin-name\":{color:\"#ffa\"},\"hljs-number\":{color:\"#d36363\"},\"hljs-symbol\":{color:\"#d36363\"},\"hljs-keyword\":{color:\"#fcc28c\"},\"hljs-selector-tag\":{color:\"#fcc28c\"},\"hljs-literal\":{color:\"#fcc28c\"},\"hljs-comment\":{color:\"#888\"},\"hljs-deletion\":{color:\"#333\",backgroundColor:\"#fc9b9b\"},\"hljs-regexp\":{color:\"#c6b4f0\"},\"hljs-link\":{color:\"#c6b4f0\"},\"hljs-meta\":{color:\"#fc9b9b\"},\"hljs-addition\":{backgroundColor:\"#a2fca2\",color:\"#333\"}};s.Light.registerLanguage(\"json\",p),s.Light.registerLanguage(\"js\",u),s.Light.registerLanguage(\"xml\",d),s.Light.registerLanguage(\"yaml\",g),s.Light.registerLanguage(\"http\",b),s.Light.registerLanguage(\"bash\",m),s.Light.registerLanguage(\"powershell\",x),s.Light.registerLanguage(\"javascript\",u);var w={agate:S,arta:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#222\",color:\"#aaa\"},\"hljs-subst\":{color:\"#aaa\"},\"hljs-section\":{color:\"#fff\",fontWeight:\"bold\"},\"hljs-comment\":{color:\"#444\"},\"hljs-quote\":{color:\"#444\"},\"hljs-meta\":{color:\"#444\"},\"hljs-string\":{color:\"#ffcc33\"},\"hljs-symbol\":{color:\"#ffcc33\"},\"hljs-bullet\":{color:\"#ffcc33\"},\"hljs-regexp\":{color:\"#ffcc33\"},\"hljs-number\":{color:\"#00cc66\"},\"hljs-addition\":{color:\"#00cc66\"},\"hljs-built_in\":{color:\"#32aaee\"},\"hljs-builtin-name\":{color:\"#32aaee\"},\"hljs-literal\":{color:\"#32aaee\"},\"hljs-type\":{color:\"#32aaee\"},\"hljs-template-variable\":{color:\"#32aaee\"},\"hljs-attribute\":{color:\"#32aaee\"},\"hljs-link\":{color:\"#32aaee\"},\"hljs-keyword\":{color:\"#6644aa\"},\"hljs-selector-tag\":{color:\"#6644aa\"},\"hljs-name\":{color:\"#6644aa\"},\"hljs-selector-id\":{color:\"#6644aa\"},\"hljs-selector-class\":{color:\"#6644aa\"},\"hljs-title\":{color:\"#bb1166\"},\"hljs-variable\":{color:\"#bb1166\"},\"hljs-deletion\":{color:\"#bb1166\"},\"hljs-template-tag\":{color:\"#bb1166\"},\"hljs-doctag\":{fontWeight:\"bold\"},\"hljs-strong\":{fontWeight:\"bold\"},\"hljs-emphasis\":{fontStyle:\"italic\"}},monokai:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#272822\",color:\"#ddd\"},\"hljs-tag\":{color:\"#f92672\"},\"hljs-keyword\":{color:\"#f92672\",fontWeight:\"bold\"},\"hljs-selector-tag\":{color:\"#f92672\",fontWeight:\"bold\"},\"hljs-literal\":{color:\"#f92672\",fontWeight:\"bold\"},\"hljs-strong\":{color:\"#f92672\"},\"hljs-name\":{color:\"#f92672\"},\"hljs-code\":{color:\"#66d9ef\"},\"hljs-class .hljs-title\":{color:\"white\"},\"hljs-attribute\":{color:\"#bf79db\"},\"hljs-symbol\":{color:\"#bf79db\"},\"hljs-regexp\":{color:\"#bf79db\"},\"hljs-link\":{color:\"#bf79db\"},\"hljs-string\":{color:\"#a6e22e\"},\"hljs-bullet\":{color:\"#a6e22e\"},\"hljs-subst\":{color:\"#a6e22e\"},\"hljs-title\":{color:\"#a6e22e\",fontWeight:\"bold\"},\"hljs-section\":{color:\"#a6e22e\",fontWeight:\"bold\"},\"hljs-emphasis\":{color:\"#a6e22e\"},\"hljs-type\":{color:\"#a6e22e\",fontWeight:\"bold\"},\"hljs-built_in\":{color:\"#a6e22e\"},\"hljs-builtin-name\":{color:\"#a6e22e\"},\"hljs-selector-attr\":{color:\"#a6e22e\"},\"hljs-selector-pseudo\":{color:\"#a6e22e\"},\"hljs-addition\":{color:\"#a6e22e\"},\"hljs-variable\":{color:\"#a6e22e\"},\"hljs-template-tag\":{color:\"#a6e22e\"},\"hljs-template-variable\":{color:\"#a6e22e\"},\"hljs-comment\":{color:\"#75715e\"},\"hljs-quote\":{color:\"#75715e\"},\"hljs-deletion\":{color:\"#75715e\"},\"hljs-meta\":{color:\"#75715e\"},\"hljs-doctag\":{fontWeight:\"bold\"},\"hljs-selector-id\":{fontWeight:\"bold\"}},nord:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#2E3440\",color:\"#D8DEE9\"},\"hljs-subst\":{color:\"#D8DEE9\"},\"hljs-selector-tag\":{color:\"#81A1C1\"},\"hljs-selector-id\":{color:\"#8FBCBB\",fontWeight:\"bold\"},\"hljs-selector-class\":{color:\"#8FBCBB\"},\"hljs-selector-attr\":{color:\"#8FBCBB\"},\"hljs-selector-pseudo\":{color:\"#88C0D0\"},\"hljs-addition\":{backgroundColor:\"rgba(163, 190, 140, 0.5)\"},\"hljs-deletion\":{backgroundColor:\"rgba(191, 97, 106, 0.5)\"},\"hljs-built_in\":{color:\"#8FBCBB\"},\"hljs-type\":{color:\"#8FBCBB\"},\"hljs-class\":{color:\"#8FBCBB\"},\"hljs-function\":{color:\"#88C0D0\"},\"hljs-function > .hljs-title\":{color:\"#88C0D0\"},\"hljs-keyword\":{color:\"#81A1C1\"},\"hljs-literal\":{color:\"#81A1C1\"},\"hljs-symbol\":{color:\"#81A1C1\"},\"hljs-number\":{color:\"#B48EAD\"},\"hljs-regexp\":{color:\"#EBCB8B\"},\"hljs-string\":{color:\"#A3BE8C\"},\"hljs-title\":{color:\"#8FBCBB\"},\"hljs-params\":{color:\"#D8DEE9\"},\"hljs-bullet\":{color:\"#81A1C1\"},\"hljs-code\":{color:\"#8FBCBB\"},\"hljs-emphasis\":{fontStyle:\"italic\"},\"hljs-formula\":{color:\"#8FBCBB\"},\"hljs-strong\":{fontWeight:\"bold\"},\"hljs-link:hover\":{textDecoration:\"underline\"},\"hljs-quote\":{color:\"#4C566A\"},\"hljs-comment\":{color:\"#4C566A\"},\"hljs-doctag\":{color:\"#8FBCBB\"},\"hljs-meta\":{color:\"#5E81AC\"},\"hljs-meta-keyword\":{color:\"#5E81AC\"},\"hljs-meta-string\":{color:\"#A3BE8C\"},\"hljs-attr\":{color:\"#8FBCBB\"},\"hljs-attribute\":{color:\"#D8DEE9\"},\"hljs-builtin-name\":{color:\"#81A1C1\"},\"hljs-name\":{color:\"#81A1C1\"},\"hljs-section\":{color:\"#88C0D0\"},\"hljs-tag\":{color:\"#81A1C1\"},\"hljs-variable\":{color:\"#D8DEE9\"},\"hljs-template-variable\":{color:\"#D8DEE9\"},\"hljs-template-tag\":{color:\"#5E81AC\"},\"abnf .hljs-attribute\":{color:\"#88C0D0\"},\"abnf .hljs-symbol\":{color:\"#EBCB8B\"},\"apache .hljs-attribute\":{color:\"#88C0D0\"},\"apache .hljs-section\":{color:\"#81A1C1\"},\"arduino .hljs-built_in\":{color:\"#88C0D0\"},\"aspectj .hljs-meta\":{color:\"#D08770\"},\"aspectj > .hljs-title\":{color:\"#88C0D0\"},\"bnf .hljs-attribute\":{color:\"#8FBCBB\"},\"clojure .hljs-name\":{color:\"#88C0D0\"},\"clojure .hljs-symbol\":{color:\"#EBCB8B\"},\"coq .hljs-built_in\":{color:\"#88C0D0\"},\"cpp .hljs-meta-string\":{color:\"#8FBCBB\"},\"css .hljs-built_in\":{color:\"#88C0D0\"},\"css .hljs-keyword\":{color:\"#D08770\"},\"diff .hljs-meta\":{color:\"#8FBCBB\"},\"ebnf .hljs-attribute\":{color:\"#8FBCBB\"},\"glsl .hljs-built_in\":{color:\"#88C0D0\"},\"groovy .hljs-meta:not(:first-child)\":{color:\"#D08770\"},\"haxe .hljs-meta\":{color:\"#D08770\"},\"java .hljs-meta\":{color:\"#D08770\"},\"ldif .hljs-attribute\":{color:\"#8FBCBB\"},\"lisp .hljs-name\":{color:\"#88C0D0\"},\"lua .hljs-built_in\":{color:\"#88C0D0\"},\"moonscript .hljs-built_in\":{color:\"#88C0D0\"},\"nginx .hljs-attribute\":{color:\"#88C0D0\"},\"nginx .hljs-section\":{color:\"#5E81AC\"},\"pf .hljs-built_in\":{color:\"#88C0D0\"},\"processing .hljs-built_in\":{color:\"#88C0D0\"},\"scss .hljs-keyword\":{color:\"#81A1C1\"},\"stylus .hljs-keyword\":{color:\"#81A1C1\"},\"swift .hljs-meta\":{color:\"#D08770\"},\"vim .hljs-built_in\":{color:\"#88C0D0\",fontStyle:\"italic\"},\"yaml .hljs-meta\":{color:\"#D08770\"}},obsidian:{hljs:{display:\"block\",overflowX:\"auto\",padding:\"0.5em\",background:\"#282b2e\",color:\"#e0e2e4\"},\"hljs-keyword\":{color:\"#93c763\",fontWeight:\"bold\"},\"hljs-selector-tag\":{color:\"#93c763\",fontWeight:\"bold\"},\"hljs-literal\":{color:\"#93c763\",fontWeight:\"bold\"},\"hljs-selector-id\":{color:\"#93c763\"},\"hljs-number\":{color:\"#ffcd22\"},\"hljs-attribute\":{color:\"#668bb0\"},\"hljs-code\":{color:\"white\"},\"hljs-class .hljs-title\":{color:\"white\"},\"hljs-section\":{color:\"white\",fontWeight:\"bold\"},\"hljs-regexp\":{color:\"#d39745\"},\"hljs-link\":{color:\"#d39745\"},\"hljs-meta\":{color:\"#557182\"},\"hljs-tag\":{color:\"#8cbbad\"},\"hljs-name\":{color:\"#8cbbad\",fontWeight:\"bold\"},\"hljs-bullet\":{color:\"#8cbbad\"},\"hljs-subst\":{color:\"#8cbbad\"},\"hljs-emphasis\":{color:\"#8cbbad\"},\"hljs-type\":{color:\"#8cbbad\",fontWeight:\"bold\"},\"hljs-built_in\":{color:\"#8cbbad\"},\"hljs-selector-attr\":{color:\"#8cbbad\"},\"hljs-selector-pseudo\":{color:\"#8cbbad\"},\"hljs-addition\":{color:\"#8cbbad\"},\"hljs-variable\":{color:\"#8cbbad\"},\"hljs-template-tag\":{color:\"#8cbbad\"},\"hljs-template-variable\":{color:\"#8cbbad\"},\"hljs-string\":{color:\"#ec7600\"},\"hljs-symbol\":{color:\"#ec7600\"},\"hljs-comment\":{color:\"#818e96\"},\"hljs-quote\":{color:\"#818e96\"},\"hljs-deletion\":{color:\"#818e96\"},\"hljs-selector-class\":{color:\"#A082BD\"},\"hljs-doctag\":{fontWeight:\"bold\"},\"hljs-title\":{fontWeight:\"bold\"},\"hljs-strong\":{fontWeight:\"bold\"}},\"tomorrow-night\":{\"hljs-comment\":{color:\"#969896\"},\"hljs-quote\":{color:\"#969896\"},\"hljs-variable\":{color:\"#cc6666\"},\"hljs-template-variable\":{color:\"#cc6666\"},\"hljs-tag\":{color:\"#cc6666\"},\"hljs-name\":{color:\"#cc6666\"},\"hljs-selector-id\":{color:\"#cc6666\"},\"hljs-selector-class\":{color:\"#cc6666\"},\"hljs-regexp\":{color:\"#cc6666\"},\"hljs-deletion\":{color:\"#cc6666\"},\"hljs-number\":{color:\"#de935f\"},\"hljs-built_in\":{color:\"#de935f\"},\"hljs-builtin-name\":{color:\"#de935f\"},\"hljs-literal\":{color:\"#de935f\"},\"hljs-type\":{color:\"#de935f\"},\"hljs-params\":{color:\"#de935f\"},\"hljs-meta\":{color:\"#de935f\"},\"hljs-link\":{color:\"#de935f\"},\"hljs-attribute\":{color:\"#f0c674\"},\"hljs-string\":{color:\"#b5bd68\"},\"hljs-symbol\":{color:\"#b5bd68\"},\"hljs-bullet\":{color:\"#b5bd68\"},\"hljs-addition\":{color:\"#b5bd68\"},\"hljs-title\":{color:\"#81a2be\"},\"hljs-section\":{color:\"#81a2be\"},\"hljs-keyword\":{color:\"#b294bb\"},\"hljs-selector-tag\":{color:\"#b294bb\"},hljs:{display:\"block\",overflowX:\"auto\",background:\"#1d1f21\",color:\"#c5c8c6\",padding:\"0.5em\"},\"hljs-emphasis\":{fontStyle:\"italic\"},\"hljs-strong\":{fontWeight:\"bold\"}}},j=a()(w),O=function(e){return i()(j).call(j,e)?w[e]:(console.warn(\"Request style '\".concat(e,\"' is not available, returning default instead\")),S)}},function(e,t){e.exports=!0},function(e,t,n){var r=n(195),a=n(59).f,o=n(58),i=n(49),s=n(419),c=n(37)(\"toStringTag\");e.exports=function(e,t,n,u){if(e){var l=n?e:e.prototype;i(l,c)||a(l,c,{configurable:!0,value:t}),u&&!r&&o(l,\"toString\",s)}}},function(e,t,n){var r=n(195),a=n(120),o=n(37)(\"toStringTag\"),i=\"Arguments\"==a(function(){return arguments}());e.exports=r?a:function(e){var t,n,r;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:i?a(t):\"Object\"==(r=a(t))&&\"function\"==typeof t.callee?\"Arguments\":r}},function(e,t,n){e.exports=n(532)},function(e,t,n){\"use strict\";function r(e){return function(e){try{return!!JSON.parse(e)}catch(e){return null}}(e)?\"json\":null}n.d(t,\"a\",(function(){return r}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_LAYOUT\",(function(){return a})),n.d(t,\"UPDATE_FILTER\",(function(){return o})),n.d(t,\"UPDATE_MODE\",(function(){return i})),n.d(t,\"SHOW\",(function(){return s})),n.d(t,\"updateLayout\",(function(){return c})),n.d(t,\"updateFilter\",(function(){return u})),n.d(t,\"show\",(function(){return l})),n.d(t,\"changeMode\",(function(){return p}));var r=n(5),a=\"layout_update_layout\",o=\"layout_update_filter\",i=\"layout_update_mode\",s=\"layout_show\";function c(e){return{type:a,payload:e}}function u(e){return{type:o,payload:e}}function l(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=Object(r.v)(e),{type:s,payload:{thing:e,shown:t}}}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";return e=Object(r.v)(e),{type:i,payload:{thing:e,mode:t}}}},function(e,t,n){var r=n(342),a=n(129),o=n(157),i=n(45),s=n(98),c=n(158),u=n(128),l=n(207),p=Object.prototype.hasOwnProperty;e.exports=function(e){if(null==e)return!0;if(s(e)&&(i(e)||\"string\"==typeof e||\"function\"==typeof e.splice||c(e)||l(e)||o(e)))return!e.length;var t=a(e);if(\"[object Map]\"==t||\"[object Set]\"==t)return!e.size;if(u(e))return!r(e).length;for(var n in e)if(p.call(e,n))return!1;return!0}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){e.exports=function(e){if(null==e)throw TypeError(\"Can't call method on \"+e);return e}},function(e,t,n){var r=n(66);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,a){return e.call(t,n,r,a)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){var r=n(61);e.exports=r(\"navigator\",\"userAgent\")||\"\"},function(e,t,n){var r,a=n(46),o=n(188),i=n(191),s=n(125),c=n(296),u=n(183),l=n(146),p=l(\"IE_PROTO\"),f=function(){},d=function(e){return\"<script>\"+e+\"</\"+\"script>\"},h=function(){try{r=document.domain&&new ActiveXObject(\"htmlfile\")}catch(e){}var e,t;h=r?function(e){e.write(d(\"\")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):((t=u(\"iframe\")).style.display=\"none\",c.appendChild(t),t.src=String(\"javascript:\"),(e=t.contentWindow.document).open(),e.write(d(\"document.F=Object\")),e.close(),e.F);for(var n=i.length;n--;)delete h.prototype[i[n]];return h()};s[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(f.prototype=a(e),n=new f,f.prototype=null,n[p]=e):n=h(),void 0===t?n:o(n,t)}},function(e,t,n){var r=n(58);e.exports=function(e,t,n,a){a&&a.enumerable?e[t]=n:r(e,t,n)}},function(e,t,n){\"use strict\";var r=n(34);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},function(e,t,n){var r=n(109),a=n(539),o=n(540),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?\"[object Undefined]\":\"[object Null]\":i&&i in Object(e)?a(e):o(e)}},function(e,t,n){var r=n(557),a=n(560);e.exports=function(e,t){var n=a(e,t);return r(n)?n:void 0}},function(e,t,n){var r=n(341),a=n(342),o=n(98);e.exports=function(e){return o(e)?r(e):a(e)}},function(e,t,n){var r=n(101),a=n(208);e.exports=function(e){return null!=e&&a(e.length)&&!r(e)}},function(e,t,n){var r=n(46),a=n(318),o=n(60),i=n(90),s=n(127),c=n(317),u=function(e,t){this.stopped=e,this.result=t};e.exports=function(e,t,n){var l,p,f,d,h,m,v,g=n&&n.that,y=!(!n||!n.AS_ENTRIES),b=!(!n||!n.IS_ITERATOR),E=!(!n||!n.INTERRUPTED),x=i(t,g,1+y+E),S=function(e){return l&&c(l),new u(!0,e)},w=function(e){return y?(r(e),E?x(e[0],e[1],S):x(e[0],e[1])):E?x(e,S):x(e)};if(b)l=e;else{if(\"function\"!=typeof(p=s(e)))throw TypeError(\"Target is not iterable\");if(a(p)){for(f=0,d=o(e.length);d>f;f++)if((h=w(e[f]))&&h instanceof u)return h;return new u(!1)}l=p.call(e)}for(m=l.next;!(v=m.call(l)).done;){try{h=w(v.value)}catch(e){throw c(l),e}if(\"object\"==typeof h&&h&&h instanceof u)return h}return new u(!1)}},function(e,t){e.exports=function(e,t){return e===t||e!=e&&t!=t}},function(e,t,n){var r=n(95),a=n(50);e.exports=function(e){if(!a(e))return!1;var t=r(e);return\"[object Function]\"==t||\"[object GeneratorFunction]\"==t||\"[object AsyncFunction]\"==t||\"[object Proxy]\"==t}},function(e,t,n){e.exports=n(760)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return l}));var r=n(12),a=n.n(r),o=n(4),i=n.n(o),s=n(389),c=n.n(s),u=[n(220),n(221)];function l(e){var t,n={jsSpec:{}},r=c()(u,(function(e,t){try{var r=t.transform(e,n);return a()(r).call(r,(function(e){return!!e}))}catch(t){return console.error(\"Transformer error:\",t),e}}),e);return i()(t=a()(r).call(r,(function(e){return!!e}))).call(t,(function(e){return!e.get(\"line\")&&e.get(\"path\"),e}))}},function(e,t,n){var r=n(43),a=n(141),o=n(88),i=n(57),s=n(143),c=n(49),u=n(291),l=Object.getOwnPropertyDescriptor;t.f=r?l:function(e,t){if(e=i(e),t=s(t,!0),u)try{return l(e,t)}catch(e){}if(c(e,t))return o(!a.f.call(e,t),e[t])}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r,a,o=n(36),i=n(91),s=o.process,c=s&&s.versions,u=c&&c.v8;u?a=(r=u.split(\".\"))[0]<4?1:r[0]+r[1]:i&&(!(r=i.match(/Edge\\/(\\d+)/))||r[1]>=74)&&(r=i.match(/Chrome\\/(\\d+)/))&&(a=r[1]),e.exports=a&&+a},function(e,t,n){\"use strict\";var r=n(300).charAt,a=n(67),o=n(196),i=\"String Iterator\",s=a.set,c=a.getterFor(i);o(String,\"String\",(function(e){s(this,{type:i,string:String(e),index:0})}),(function(){var e,t=c(this),n=t.string,a=t.index;return a>=n.length?{value:void 0,done:!0}:(e=r(n,a),t.index+=e.length,{value:e,done:!1})}))},function(e,t){e.exports={}},function(e,t,n){var r=n(62).Symbol;e.exports=r},function(e,t,n){var r=n(45),a=n(211),o=n(604),i=n(76);e.exports=function(e,t){return r(e)?e:a(e,t)?[e]:o(i(e))}},function(e,t,n){var r=n(151);e.exports=function(e){if(\"string\"==typeof e||r(e))return e;var t=e+\"\";return\"0\"==t&&1/e==-Infinity?\"-0\":t}},function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError(\"Incorrect \"+(n?n+\" \":\"\")+\"invocation\");return e}},function(e,t,n){var r=n(162),a=n(366);e.exports=function(e,t,n,o){var i=!n;n||(n={});for(var s=-1,c=t.length;++s<c;){var u=t[s],l=o?o(n[u],e[u],u,n,e):void 0;void 0===l&&(l=e[u]),i?a(n,u,l):r(n,u,l)}return n}},function(e,t){e.exports=require(\"serialize-error\")},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"sampleFromSchemaGeneric\",(function(){return B})),n.d(t,\"inferSchema\",(function(){return L})),n.d(t,\"createXMLExample\",(function(){return U})),n.d(t,\"sampleFromSchema\",(function(){return V})),n.d(t,\"memoizedCreateXMLExample\",(function(){return z})),n.d(t,\"memoizedSampleFromSchema\",(function(){return F}));var r=n(18),a=n.n(r),o=n(2),i=n.n(o),s=n(17),c=n.n(s),u=n(23),l=n.n(u),p=n(22),f=n.n(p),d=n(29),h=n.n(d),m=n(64),v=n.n(m),g=n(19),y=n.n(g),b=n(55),E=n.n(b),x=n(4),S=n.n(x),w=n(5),j=n(385),O=n.n(j),C=n(278),_=n.n(C),A=n(87),k=n.n(A),I={string:function(){return\"string\"},string_email:function(){return\"user@example.com\"},\"string_date-time\":function(){return(new Date).toISOString()},string_date:function(){return(new Date).toISOString().substring(0,10)},string_uuid:function(){return\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"},string_hostname:function(){return\"example.com\"},string_ipv4:function(){return\"198.51.100.42\"},string_ipv6:function(){return\"2001:0db8:5b96:0000:0000:426f:8e17:642a\"},number:function(){return 0},number_float:function(){return 0},integer:function(){return 0},boolean:function(e){return\"boolean\"!=typeof e.default||e.default}},P=function(e){var t,n=e=Object(w.z)(e),r=n.type,a=n.format,o=I[i()(t=\"\".concat(r,\"_\")).call(t,a)]||I[r];return Object(w.s)(o)?o(e):\"Unknown Type: \"+e.type},T=function(e){return Object(w.e)(e,\"$$ref\",(function(e){return\"string\"==typeof e&&c()(e).call(e,\"#\")>-1}))},R=[\"maxProperties\",\"minProperties\"],N=[\"minItems\",\"maxItems\"],M=[\"minimum\",\"maximum\",\"exclusiveMinimum\",\"exclusiveMaximum\"],q=[\"minLength\",\"maxLength\"],D=function e(t,n){var r,a,o,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},u=function(e){void 0===n[e]&&void 0!==t[e]&&(n[e]=t[e])};(l()(r=i()(a=[\"example\",\"default\",\"enum\",\"xml\",\"type\"]).call(a,R,N,M,q)).call(r,(function(e){return u(e)})),void 0!==t.required&&f()(t.required))&&(void 0!==n.required&&n.required.length||(n.required=[]),l()(o=t.required).call(o,(function(e){var t;h()(t=n.required).call(t,e)||n.required.push(e)})));if(t.properties){n.properties||(n.properties={});var p=Object(w.z)(t.properties);for(var d in p){var m;if(Object.prototype.hasOwnProperty.call(p,d))if(!p[d]||!p[d].deprecated)if(!p[d]||!p[d].readOnly||s.includeReadOnly)if(!p[d]||!p[d].writeOnly||s.includeWriteOnly)if(!n.properties[d])n.properties[d]=p[d],!t.required&&f()(t.required)&&-1!==c()(m=t.required).call(m,d)&&(n.required?n.required.push(d):n.required=[d])}}return t.items&&(n.items||(n.items={}),n.items=e(t.items,n.items,s)),n},B=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];t&&Object(w.s)(t.toJS)&&(t=t.toJS());var s=void 0!==r||t&&void 0!==t.example||t&&void 0!==t.default,u=!s&&t&&t.oneOf&&t.oneOf.length>0,p=!s&&t&&t.anyOf&&t.anyOf.length>0;if(!s&&(u||p)){var d=Object(w.z)(u?t.oneOf[0]:t.anyOf[0]);if(D(d,t,n),!t.xml&&d.xml&&(t.xml=d.xml),void 0!==t.example&&void 0!==d.example)s=!0;else if(d.properties){t.properties||(t.properties={});var m=Object(w.z)(d.properties);for(var g in m){var b;if(Object.prototype.hasOwnProperty.call(m,g))if(!m[g]||!m[g].deprecated)if(!m[g]||!m[g].readOnly||n.includeReadOnly)if(!m[g]||!m[g].writeOnly||n.includeWriteOnly)if(!t.properties[g])t.properties[g]=m[g],!d.required&&f()(d.required)&&-1!==c()(b=d.required).call(b,g)&&(t.required?t.required.push(g):t.required=[g])}}}var x,j={},O=t||{},C=O.xml,_=O.type,A=O.example,I=O.properties,q=O.additionalProperties,B=O.items,L=n.includeReadOnly,U=n.includeWriteOnly,V=C=C||{},z=V.name,F=V.prefix,J=V.namespace,W={};if(o&&(x=(F?F+\":\":\"\")+(z=z||\"notagname\"),J)){var H=F?\"xmlns:\"+F:\"xmlns\";j[H]=J}o&&(W[x]=[]);var $=function(e){return v()(e).call(e,(function(e){return Object.prototype.hasOwnProperty.call(t,e)}))};t&&!_&&(I||q||$(R)?_=\"object\":B||$(N)?_=\"array\":$(M)?(_=\"number\",t.type=\"number\"):s||t.enum||(_=\"string\",t.type=\"string\"));var Y,K,G=function(e){var n,r,a,o,i;null!==(null===(n=t)||void 0===n?void 0:n.maxItems)&&void 0!==(null===(r=t)||void 0===r?void 0:r.maxItems)&&(e=y()(e).call(e,0,null===(i=t)||void 0===i?void 0:i.maxItems));if(null!==(null===(a=t)||void 0===a?void 0:a.minItems)&&void 0!==(null===(o=t)||void 0===o?void 0:o.minItems))for(var s=0;e.length<(null===(c=t)||void 0===c?void 0:c.minItems);){var c;e.push(e[s++%e.length])}return e},Z=Object(w.z)(I),X=0,Q=function(){return t&&null!==t.maxProperties&&void 0!==t.maxProperties&&X>=t.maxProperties},ee=function(){if(!t||!t.required)return 0;var e,n,r=0;o?l()(e=t.required).call(e,(function(e){return r+=void 0===W[e]?0:1})):l()(n=t.required).call(n,(function(e){var t;return r+=void 0===(null===(t=W[x])||void 0===t?void 0:E()(t).call(t,(function(t){return void 0!==t[e]})))?0:1}));return t.required.length-r},te=function(e){var n;return!(t&&t.required&&t.required.length)||!h()(n=t.required).call(n,e)},ne=function(e){return!t||null===t.maxProperties||void 0===t.maxProperties||!Q()&&(!te(e)||t.maxProperties-X-ee()>0)};if(Y=o?function(r){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(t&&Z[r]){if(Z[r].xml=Z[r].xml||{},Z[r].xml.attribute){var s=f()(Z[r].enum)?Z[r].enum[0]:void 0,c=Z[r].example,u=Z[r].default;return void(j[Z[r].xml.name||r]=void 0!==c?c:void 0!==u?u:void 0!==s?s:P(Z[r]))}Z[r].xml.name=Z[r].xml.name||r}else Z[r]||!1===q||(Z[r]={xml:{name:r}});var l,p=e(t&&Z[r]||void 0,n,a,o);ne(r)&&(X++,f()(p)?W[x]=i()(l=W[x]).call(l,p):W[x].push(p))}:function(t,r){ne(t)&&(W[t]=e(Z[t],n,r,o),X++)},s){var re;if(re=T(void 0!==r?r:void 0!==A?A:t.default),!o){if(\"number\"==typeof re&&\"string\"===_)return\"\".concat(re);if(\"string\"!=typeof re||\"string\"===_)return re;try{return JSON.parse(re)}catch(e){return re}}if(t||(_=f()(re)?\"array\":a()(re)),\"array\"===_){if(!f()(re)){if(\"string\"==typeof re)return re;re=[re]}var ae=t?t.items:void 0;ae&&(ae.xml=ae.xml||C||{},ae.xml.name=ae.xml.name||C.name);var oe=S()(re).call(re,(function(t){return e(ae,n,t,o)}));return oe=G(oe),C.wrapped?(W[x]=oe,k()(j)||W[x].push({_attr:j})):W=oe,W}if(\"object\"===_){if(\"string\"==typeof re)return re;for(var ie in re)Object.prototype.hasOwnProperty.call(re,ie)&&(t&&Z[ie]&&Z[ie].readOnly&&!L||t&&Z[ie]&&Z[ie].writeOnly&&!U||(t&&Z[ie]&&Z[ie].xml&&Z[ie].xml.attribute?j[Z[ie].xml.name||ie]=re[ie]:Y(ie,re[ie])));return k()(j)||W[x].push({_attr:j}),W}return W[x]=k()(j)?re:[{_attr:j},re],W}if(\"object\"===_){for(var se in Z)Object.prototype.hasOwnProperty.call(Z,se)&&(Z[se]&&Z[se].deprecated||Z[se]&&Z[se].readOnly&&!L||Z[se]&&Z[se].writeOnly&&!U||Y(se));if(o&&j&&W[x].push({_attr:j}),Q())return W;if(!0===q)o?W[x].push({additionalProp:\"Anything can be here\"}):W.additionalProp1={},X++;else if(q){var ce=Object(w.z)(q),ue=e(ce,n,void 0,o);if(o&&ce.xml&&ce.xml.name&&\"notagname\"!==ce.xml.name)W[x].push(ue);else for(var le=null!==t.minProperties&&void 0!==t.minProperties&&X<t.minProperties?t.minProperties-X:4,pe=1;pe<le;pe++){if(Q())return W;if(o){var fe={};fe[\"additionalProp\"+pe]=ue.notagname,W[x].push(fe)}else W[\"additionalProp\"+pe]=ue;X++}}return W}if(\"array\"===_){if(!B)return;var de,he,me;if(o)B.xml=B.xml||(null===(he=t)||void 0===he?void 0:he.xml)||{},B.xml.name=B.xml.name||C.name;if(f()(B.anyOf))de=S()(me=B.anyOf).call(me,(function(t){return e(D(B,t,n),n,void 0,o)}));else if(f()(B.oneOf)){var ve;de=S()(ve=B.oneOf).call(ve,(function(t){return e(D(B,t,n),n,void 0,o)}))}else{if(!(!o||o&&C.wrapped))return e(B,n,void 0,o);de=[e(B,n,void 0,o)]}return de=G(de),o&&C.wrapped?(W[x]=de,k()(j)||W[x].push({_attr:j}),W):de}if(t&&f()(t.enum))K=Object(w.v)(t.enum)[0];else{if(!t)return;if(\"number\"==typeof(K=P(t))){var ge=t.minimum;null!=ge&&(t.exclusiveMinimum&&ge++,K=ge);var ye=t.maximum;null!=ye&&(t.exclusiveMaximum&&ye--,K=ye)}if(\"string\"==typeof K&&(null!==t.maxLength&&void 0!==t.maxLength&&(K=y()(K).call(K,0,t.maxLength)),null!==t.minLength&&void 0!==t.minLength))for(var be=0;K.length<t.minLength;)K+=K[be++%K.length]}if(\"file\"!==_)return o?(W[x]=k()(j)?K:[{_attr:j},K],W):K},L=function(e){return e.schema&&(e=e.schema),e.properties&&(e.type=\"object\"),e},U=function(e,t,n){var r=B(e,t,n,!0);if(r)return\"string\"==typeof r?r:O()(r,{declaration:!0,indent:\"\\t\"})},V=function(e,t,n){return B(e,t,n,!1)},z=_()(U),F=_()(V)},function(e,t){e.exports=require(\"react-copy-to-clipboard\")},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"UPDATE_CONFIGS\",(function(){return o})),n.d(t,\"TOGGLE_CONFIGS\",(function(){return i})),n.d(t,\"update\",(function(){return s})),n.d(t,\"toggle\",(function(){return c})),n.d(t,\"loaded\",(function(){return u}));var r=n(3),a=n.n(r),o=\"configs_update\",i=\"configs_toggle\";function s(e,t){return{type:o,payload:a()({},e,t)}}function c(e){return{type:i,payload:e}}var u=function(){return function(e){var t=e.getConfigs,n=e.authActions;if(t().persistAuthorization){var r=localStorage.getItem(\"authorized\");r&&n.restoreAuthorization({authorized:JSON.parse(r)})}}}},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return l}));var r=n(12),a=n.n(r),o=n(29),i=n.n(o),s=n(1),c=n.n(s),u=c.a.Set.of(\"type\",\"format\",\"items\",\"default\",\"maximum\",\"exclusiveMaximum\",\"minimum\",\"exclusiveMinimum\",\"maxLength\",\"minLength\",\"pattern\",\"maxItems\",\"minItems\",\"uniqueItems\",\"enum\",\"multipleOf\");function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isOAS3;if(!c.a.Map.isMap(e))return{schema:c.a.Map(),parameterContentMediaType:null};if(!n)return\"body\"===e.get(\"in\")?{schema:e.get(\"schema\",c.a.Map()),parameterContentMediaType:null}:{schema:a()(e).call(e,(function(e,t){return i()(u).call(u,t)})),parameterContentMediaType:null};if(e.get(\"content\")){var r=e.get(\"content\",c.a.Map({})).keySeq(),o=r.first();return{schema:e.getIn([\"content\",o,\"schema\"],c.a.Map()),parameterContentMediaType:o}}return{schema:e.get(\"schema\",c.a.Map()),parameterContentMediaType:null}}},function(e,t){e.exports=require(\"fast-json-patch\")},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r=n(120);e.exports=Array.isArray||function(e){return\"Array\"==r(e)}},function(e,t,n){\"use strict\";var r=n(143),a=n(59),o=n(88);e.exports=function(e,t,n){var i=r(t);i in e?a.f(e,i,o(0,n)):e[i]=n}},function(e,t,n){var r=n(34),a=n(37),o=n(106),i=a(\"species\");e.exports=function(e){return o>=51||!r((function(){var t=[];return(t.constructor={})[i]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},function(e,t,n){var r=n(295),a=n(191);e.exports=Object.keys||function(e){return r(e,a)}},function(e,t){e.exports={}},function(e,t,n){\"use strict\";var r=n(57),a=n(197),o=n(108),i=n(67),s=n(196),c=\"Array Iterator\",u=i.set,l=i.getterFor(c);e.exports=s(Array,\"Array\",(function(e,t){u(this,{type:c,target:r(e),index:0,kind:t})}),(function(){var e=l(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):\"keys\"==n?{value:r,done:!1}:\"values\"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),\"values\"),o.Arguments=o.Array,a(\"keys\"),a(\"values\"),a(\"entries\")},function(e,t,n){var r=n(83),a=n(108),o=n(37)(\"iterator\");e.exports=function(e){if(null!=e)return e[o]||e[\"@@iterator\"]||a[r(e)]}},function(e,t){var n=Object.prototype;e.exports=function(e){var t=e&&e.constructor;return e===(\"function\"==typeof t&&t.prototype||n)}},function(e,t,n){var r=n(598),a=n(202),o=n(599),i=n(600),s=n(601),c=n(95),u=n(333),l=\"[object Map]\",p=\"[object Promise]\",f=\"[object Set]\",d=\"[object WeakMap]\",h=\"[object DataView]\",m=u(r),v=u(a),g=u(o),y=u(i),b=u(s),E=c;(r&&E(new r(new ArrayBuffer(1)))!=h||a&&E(new a)!=l||o&&E(o.resolve())!=p||i&&E(new i)!=f||s&&E(new s)!=d)&&(E=function(e){var t=c(e),n=\"[object Object]\"==t?e.constructor:void 0,r=n?u(n):\"\";if(r)switch(r){case m:return h;case v:return l;case g:return p;case y:return f;case b:return d}return t}),e.exports=E},function(e,t,n){var r=n(93);e.exports=function(e,t,n){for(var a in t)n&&n.unsafe&&e[a]?e[a]=t[a]:r(e,a,t[a],n);return e}},function(e,t,n){\"use strict\";var r=n(66),a=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError(\"Bad Promise constructor\");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new a(e)}},function(e,t,n){var r=n(95),a=n(214),o=n(75),i=Function.prototype,s=Object.prototype,c=i.toString,u=s.hasOwnProperty,l=c.call(Object);e.exports=function(e){if(!o(e)||\"[object Object]\"!=r(e))return!1;var t=a(e);if(null===t)return!0;var n=u.call(t,\"constructor\")&&t.constructor;return\"function\"==typeof n&&n instanceof n&&c.call(n)==l}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"requestSnippetGenerator_curl_powershell\",(function(){return R})),n.d(t,\"requestSnippetGenerator_curl_bash\",(function(){return N})),n.d(t,\"requestSnippetGenerator_curl_cmd\",(function(){return M}));var r=n(14),a=n.n(r),o=n(13),i=n.n(o),s=n(44),c=n.n(s),u=n(17),l=n.n(u),p=n(84),f=n.n(p),d=n(2),h=n.n(d),m=n(30),v=n.n(m),g=n(4),y=n.n(g),b=n(393),E=n.n(b),x=n(69),S=n.n(x),w=n(29),j=n.n(w),O=n(25),C=n(1),_=function(e){var t,n=\"_**[]\";return l()(e).call(e,n)<0?e:f()(t=e.split(n)[0]).call(t)},A=function(e){return\"-d \"===e||/^[_\\/-]/g.test(e)?e:\"'\"+e.replace(/'/g,\"'\\\\''\")+\"'\"},k=function(e){return\"-d \"===(e=e.replace(/\\^/g,\"^^\").replace(/\\\\\"/g,'\\\\\\\\\"').replace(/\"/g,'\"\"').replace(/\\n/g,\"^\\n\"))?e.replace(/-d /g,\"-d ^\\n\"):/^[_\\/-]/g.test(e)?e:'\"'+e+'\"'},I=function(e){return\"-d \"===e?e:/\\n/.test(e)?'@\"\\n'+e.replace(/\"/g,'\\\\\"').replace(/`/g,\"``\").replace(/\\$/,\"`$\")+'\\n\"@':/^[_\\/-]/g.test(e)?e:\"'\"+e.replace(/\"/g,'\"\"').replace(/'/g,\"''\")+\"'\"};function P(e){var t,n=[],r=c()(e.get(\"body\").entrySeq());try{for(r.s();!(t=r.n()).done;){var a,o,s,u=i()(t.value,2),l=u[0],p=u[1],f=_(l);if(p instanceof O.a.File)n.push(h()(a=h()(o='  \"'.concat(f,'\": {\\n    \"name\": \"')).call(o,p.name,'\"')).call(a,p.type?',\\n    \"type\": \"'.concat(p.type,'\"'):\"\",\"\\n  }\"));else n.push(h()(s='  \"'.concat(f,'\": ')).call(s,v()(p,null,2).replace(/(\\r\\n|\\r|\\n)/g,\"\\n  \")))}}catch(e){r.e(e)}finally{r.f()}return\"{\\n\".concat(n.join(\",\\n\"),\"\\n}\")}var T=function(e,t,n){var r,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",s=!1,u=\"\",l=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return u+=\" \"+y()(n).call(n,t).join(\" \")},p=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return u+=y()(n).call(n,t).join(\" \")},f=function(){return u+=\" \".concat(n)},d=function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;return u+=E()(e=\"  \").call(e,t)},m=e.get(\"headers\");if(u+=\"curl\"+o,e.has(\"curlOptions\")&&l.apply(void 0,a()(e.get(\"curlOptions\"))),l(\"-X\",e.get(\"method\")),f(),d(),p(\"\".concat(e.get(\"url\"))),m&&m.size){var g,b,x=c()(S()(g=e.get(\"headers\")).call(g));try{for(x.s();!(b=x.n()).done;){var w,A=b.value;f(),d();var k=i()(A,2),I=k[0],T=k[1];p(\"-H\",h()(w=\"\".concat(I,\": \")).call(w,T)),s=s||/^content-type$/i.test(I)&&/^multipart\\/form-data$/i.test(T)}}catch(e){x.e(e)}finally{x.f()}}if(e.get(\"body\"))if(s&&j()(r=[\"POST\",\"PUT\",\"PATCH\"]).call(r,e.get(\"method\"))){var R,N=c()(e.get(\"body\").entrySeq());try{for(N.s();!(R=N.n()).done;){var M,q,D,B=i()(R.value,2),L=B[0],U=B[1],V=_(L);if(f(),d(),p(\"-F\"),U instanceof O.a.File)l(h()(M=h()(q=\"\".concat(V,\"=@\")).call(q,U.name)).call(M,U.type?\";type=\".concat(U.type):\"\"));else l(h()(D=\"\".concat(V,\"=\")).call(D,U))}}catch(e){N.e(e)}finally{N.f()}}else{f(),d(),p(\"-d \");var z=e.get(\"body\");C.Map.isMap(z)?p(P(e)):(\"string\"!=typeof z&&(z=v()(z)),p(z))}else e.get(\"body\")||\"POST\"!==e.get(\"method\")||(f(),d(),p(\"-d ''\"));return u},R=function(e){return T(e,I,\"`\\n\",\".exe\")},N=function(e){return T(e,A,\"\\\\\\n\")},M=function(e){return T(e,k,\"^\\n\")}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"parseYamlConfig\",(function(){return o}));var r=n(63),a=n.n(r),o=function(e,t){try{return a.a.load(e)}catch(e){return t&&t.errActions.newThrownErr(new Error(e)),{}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"getDefaultRequestBodyValue\",(function(){return E}));var r=n(13),a=n.n(r),o=n(4),i=n.n(o),s=n(17),c=n.n(s),u=n(29),l=n.n(u),p=n(2),f=n.n(p),d=n(22),h=n.n(d),m=n(0),v=n.n(m),g=(n(11),n(26),n(1)),y=n(5),b=n(85),E=function(e,t,n){var r=e.getIn([\"content\",t]),a=r.get(\"schema\").toJS(),o=void 0!==r.get(\"examples\"),i=r.get(\"example\"),s=o?r.getIn([\"examples\",n,\"value\"]):i,c=Object(y.o)(a,t,{includeWriteOnly:!0},s);return Object(y.I)(c)};t.default=function(e){var t=e.userHasEditedBody,n=e.requestBody,r=e.requestBodyValue,o=e.requestBodyInclusionSetting,s=e.requestBodyErrors,u=e.getComponent,p=e.getConfigs,d=e.specSelectors,m=e.fn,x=e.contentType,S=e.isExecute,w=e.specPath,j=e.onChange,O=e.onChangeIncludeEmpty,C=e.activeExamplesKey,_=e.updateActiveExamplesKey,A=e.setRetainRequestBodyValueFlag,k=function(e){var t={key:e,shouldDispatchInit:!1,defaultValue:!0};return\"no value\"===o.get(e,\"no value\")&&(t.shouldDispatchInit=!0),t},I=u(\"Markdown\",!0),P=u(\"modelExample\"),T=u(\"RequestBodyEditor\"),R=u(\"highlightCode\"),N=u(\"ExamplesSelectValueRetainer\"),M=u(\"Example\"),q=u(\"ParameterIncludeEmpty\"),D=p().showCommonExtensions,B=n&&n.get(\"description\")||null,L=n&&n.get(\"content\")||new g.OrderedMap;x=x||L.keySeq().first()||\"\";var U=L.get(x,Object(g.OrderedMap)()),V=U.get(\"schema\",Object(g.OrderedMap)()),z=U.get(\"examples\",null),F=null==z?void 0:i()(z).call(z,(function(e,t){var r,a=null===(r=e)||void 0===r?void 0:r.get(\"value\",null);return a&&(e=e.set(\"value\",E(n,x,t),a)),e}));if(s=g.List.isList(s)?s:Object(g.List)(),!U.size)return null;var J=\"object\"===U.getIn([\"schema\",\"type\"]),W=\"binary\"===U.getIn([\"schema\",\"format\"]),H=\"base64\"===U.getIn([\"schema\",\"format\"]);if(\"application/octet-stream\"===x||0===c()(x).call(x,\"image/\")||0===c()(x).call(x,\"audio/\")||0===c()(x).call(x,\"video/\")||W||H){var $=u(\"Input\");return S?v.a.createElement($,{type:\"file\",onChange:function(e){j(e.target.files[0])}}):v.a.createElement(\"i\",null,\"Example values are not available for \",v.a.createElement(\"code\",null,x),\" media types.\")}if(J&&(\"application/x-www-form-urlencoded\"===x||0===c()(x).call(x,\"multipart/\"))&&V.get(\"properties\",Object(g.OrderedMap)()).size>0){var Y,K=u(\"JsonSchemaForm\"),G=u(\"ParameterExt\"),Z=V.get(\"properties\",Object(g.OrderedMap)());return r=g.Map.isMap(r)?r:Object(g.OrderedMap)(),v.a.createElement(\"div\",{className:\"table-container\"},B&&v.a.createElement(I,{source:B}),v.a.createElement(\"table\",null,v.a.createElement(\"tbody\",null,g.Map.isMap(Z)&&i()(Y=Z.entrySeq()).call(Y,(function(e){var t,n,c=a()(e,2),p=c[0],d=c[1];if(!d.get(\"readOnly\")){var b=D?Object(y.l)(d):null,E=l()(t=V.get(\"required\",Object(g.List)())).call(t,p),x=d.get(\"type\"),w=d.get(\"format\"),C=d.get(\"description\"),_=r.getIn([p,\"value\"]),A=r.getIn([p,\"errors\"])||s,P=o.get(p)||!1,T=d.has(\"default\")||d.has(\"example\")||d.hasIn([\"items\",\"example\"])||d.hasIn([\"items\",\"default\"]),R=d.has(\"enum\")&&(1===d.get(\"enum\").size||E),N=T||R,M=\"\";\"array\"!==x||N||(M=[]),(\"object\"===x||N)&&(M=Object(y.o)(d,!1,{includeWriteOnly:!0})),\"string\"!=typeof M&&\"object\"===x&&(M=Object(y.I)(M)),\"string\"==typeof M&&\"array\"===x&&(M=JSON.parse(M));var B=\"string\"===x&&(\"binary\"===w||\"base64\"===w);return v.a.createElement(\"tr\",{key:p,className:\"parameters\",\"data-property-name\":p},v.a.createElement(\"td\",{className:\"parameters-col_name\"},v.a.createElement(\"div\",{className:E?\"parameter__name required\":\"parameter__name\"},p,E?v.a.createElement(\"span\",null,\" *\"):null),v.a.createElement(\"div\",{className:\"parameter__type\"},x,w&&v.a.createElement(\"span\",{className:\"prop-format\"},\"($\",w,\")\"),D&&b.size?i()(n=b.entrySeq()).call(n,(function(e){var t,n=a()(e,2),r=n[0],o=n[1];return v.a.createElement(G,{key:f()(t=\"\".concat(r,\"-\")).call(t,o),xKey:r,xVal:o})})):null),v.a.createElement(\"div\",{className:\"parameter__deprecated\"},d.get(\"deprecated\")?\"deprecated\":null)),v.a.createElement(\"td\",{className:\"parameters-col_description\"},v.a.createElement(I,{source:C}),S?v.a.createElement(\"div\",null,v.a.createElement(K,{fn:m,dispatchInitialValue:!B,schema:d,description:p,getComponent:u,value:void 0===_?M:_,required:E,errors:A,onChange:function(e){j(e,[p])}}),E?null:v.a.createElement(q,{onChange:function(e){return O(p,e)},isIncluded:P,isIncludedOptions:k(p),isDisabled:h()(_)?0!==_.length:!Object(y.q)(_)})):null))}})))))}var X=E(n,x,C),Q=null;return Object(b.a)(X)&&(Q=\"json\"),v.a.createElement(\"div\",null,B&&v.a.createElement(I,{source:B}),F?v.a.createElement(N,{userHasEditedBody:t,examples:F,currentKey:C,currentUserInputValue:r,onSelect:function(e){_(e)},updateValue:j,defaultToFirstExample:!0,getComponent:u,setRetainRequestBodyValueFlag:A}):null,S?v.a.createElement(\"div\",null,v.a.createElement(T,{value:r,errors:s,defaultValue:X,onChange:j,getComponent:u})):v.a.createElement(P,{getComponent:u,getConfigs:p,specSelectors:d,expandDepth:1,isExecute:S,schema:U.get(\"schema\"),specPath:w.push(\"content\",x),example:v.a.createElement(R,{className:\"body-param__example\",getConfigs:p,language:Q,value:Object(y.I)(r)||X}),includeWriteOnly:!0}),F?v.a.createElement(M,{example:F.get(C),getComponent:u,getConfigs:p}):null)}},function(e,t,n){e.exports=n(528)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"makeMappedContainer\",(function(){return A})),n.d(t,\"render\",(function(){return k})),n.d(t,\"getComponent\",(function(){return T}));var r=n(18),a=n.n(r),o=n(27),i=n.n(o),s=n(6),c=n.n(s),u=n(7),l=n.n(u),p=n(8),f=n.n(p),d=n(9),h=n.n(d),m=n(20),v=n.n(m),g=n(15),y=n.n(g),b=n(0),E=n.n(b),x=n(391),S=n.n(x),w=n(282),j=n(392),O=n.n(j),C=function(e,t,n){var r=function(e,t){return function(n){f()(a,n);var r=h()(a);function a(){return c()(this,a),r.apply(this,arguments)}return l()(a,[{key:\"render\",value:function(){return E.a.createElement(t,i()({},e(),this.props,this.context))}}]),a}(b.Component)}(e,t),a=Object(w.connect)((function(n,r){var a=v()({},r,e());return(t.prototype.mapStateToProps||function(e){return{state:e}})(n,a)}))(r);return n?function(e,t){return function(n){f()(a,n);var r=h()(a);function a(){return c()(this,a),r.apply(this,arguments)}return l()(a,[{key:\"render\",value:function(){return E.a.createElement(w.Provider,{store:e},E.a.createElement(t,i()({},this.props,this.context)))}}]),a}(b.Component)}(n,a):a},_=function(e,t,n,r){for(var a in t){var o=t[a];\"function\"==typeof o&&o(n[a],r[a],e())}},A=function(e,t,n,r,a,o){return function(t){f()(i,t);var r=h()(i);function i(t,n){var a;return c()(this,i),a=r.call(this,t,n),_(e,o,t,{}),a}return l()(i,[{key:\"componentWillReceiveProps\",value:function(t){_(e,o,t,this.props)}},{key:\"render\",value:function(){var e=O()(this.props,o?y()(o):[]),t=n(a,\"root\");return E.a.createElement(t,e)}}]),i}(b.Component)},k=function(e,t,n,r,a){var o=n(e,t,r,\"App\",\"root\");S.a.render(E.a.createElement(o,null),a)},I=function(e){var t=e.name;return E.a.createElement(\"div\",{className:\"fallback\"},\"😱 \",E.a.createElement(\"i\",null,\"Could not render \",\"t\"===t?\"this component\":t,\", see the console.\"))},P=function(e){var t=function(e){return!(e.prototype&&e.prototype.isReactComponent)}(e)?function(e){return function(t){f()(r,t);var n=h()(r);function r(){return c()(this,r),n.apply(this,arguments)}return l()(r,[{key:\"render\",value:function(){return e(this.props)}}]),r}(b.Component)}(e):e,n=t.prototype.render;return t.prototype.render=function(){try{for(var e=arguments.length,r=new Array(e),a=0;a<e;a++)r[a]=arguments[a];return n.apply(this,r)}catch(e){return console.error(e),E.a.createElement(I,{error:e,name:t.name})}},t},T=function(e,t,n,r,o){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};if(\"string\"!=typeof r)throw new TypeError(\"Need a string, to fetch a component. Was given a \"+a()(r));var s=n(r);return s?o?\"root\"===o?C(e,s,t()):C(e,P(s)):P(s):(i.failSilently||e().log.warn(\"Could not find component:\",r),null)}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"setHash\",(function(){return r}));var r=function(e){return e?history.pushState(null,null,\"#\".concat(e)):window.location.hash=\"\"}},function(e,t){e.exports=require(\"redux\")},function(e,t,n){e.exports=n(415)},function(e,t,n){\"use strict\";var r={}.propertyIsEnumerable,a=Object.getOwnPropertyDescriptor,o=a&&!r.call({1:2},1);t.f=o?function(e){var t=a(this,e);return!!t&&t.enumerable}:r},function(e,t,n){var r=n(34),a=n(120),o=\"\".split;e.exports=r((function(){return!Object(\"z\").propertyIsEnumerable(0)}))?function(e){return\"String\"==a(e)?o.call(e,\"\"):Object(e)}:Object},function(e,t,n){var r=n(42);e.exports=function(e,t){if(!r(e))return e;var n,a;if(t&&\"function\"==typeof(n=e.toString)&&!r(a=n.call(e)))return a;if(\"function\"==typeof(n=e.valueOf)&&!r(a=n.call(e)))return a;if(!t&&\"function\"==typeof(n=e.toString)&&!r(a=n.call(e)))return a;throw TypeError(\"Can't convert object to primitive value\")}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return\"Symbol(\"+String(void 0===e?\"\":e)+\")_\"+(++n+r).toString(36)}},function(e,t){},function(e,t,n){var r=n(185),a=n(144),o=r(\"keys\");e.exports=function(e){return o[e]||(o[e]=a(e))}},function(e,t,n){var r=n(49),a=n(53),o=n(146),i=n(303),s=o(\"IE_PROTO\"),c=Object.prototype;e.exports=i?Object.getPrototypeOf:function(e){return e=a(e),r(e,s)?e[s]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?c:null}},function(e,t,n){var r=n(46),a=n(446);e.exports=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),a(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},function(e,t,n){var r=n(120),a=n(36);e.exports=\"process\"==r(a.process)},function(e,t,n){var r=n(491),a=n(314),o=n(312);e.exports=function(e,t){var n;if(e){if(\"string\"==typeof e)return o(e,t);var i=r(n=Object.prototype.toString.call(e)).call(n,8,-1);return\"Object\"===i&&e.constructor&&(i=e.constructor.name),\"Map\"===i||\"Set\"===i?a(e):\"Arguments\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?o(e,t):void 0}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(95),a=n(75);e.exports=function(e){return\"symbol\"==typeof e||a(e)&&\"[object Symbol]\"==r(e)}},function(e,t,n){var r=n(96)(Object,\"create\");e.exports=r},function(e,t,n){var r=n(565),a=n(566),o=n(567),i=n(568),s=n(569);function c(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}c.prototype.clear=r,c.prototype.delete=a,c.prototype.get=o,c.prototype.has=i,c.prototype.set=s,e.exports=c},function(e,t,n){var r=n(100);e.exports=function(e,t){for(var n=e.length;n--;)if(r(e[n][0],t))return n;return-1}},function(e,t,n){var r=n(571);e.exports=function(e,t){var n=e.__data__;return r(t)?n[\"string\"==typeof t?\"string\":\"hash\"]:n.map}},function(e,t,n){var r=n(576),a=n(603),o=n(212),i=n(45),s=n(608);e.exports=function(e){return\"function\"==typeof e?e:null==e?o:\"object\"==typeof e?i(e)?a(e[0],e[1]):r(e):s(e)}},function(e,t,n){var r=n(594),a=n(75),o=Object.prototype,i=o.hasOwnProperty,s=o.propertyIsEnumerable,c=r(function(){return arguments}())?r:function(e){return a(e)&&i.call(e,\"callee\")&&!s.call(e,\"callee\")};e.exports=c},function(e,t,n){(function(e){var r=n(62),a=n(595),o=t&&!t.nodeType&&t,i=o&&\"object\"==typeof e&&e&&!e.nodeType&&e,s=i&&i.exports===o?r.Buffer:void 0,c=(s?s.isBuffer:void 0)||a;e.exports=c}).call(this,n(206)(e))},function(e,t){var n=/^(?:0|[1-9]\\d*)$/;e.exports=function(e,t){var r=typeof e;return!!(t=null==t?9007199254740991:t)&&(\"number\"==r||\"symbol\"!=r&&n.test(e))&&e>-1&&e%1==0&&e<t}},function(e,t,n){var r=n(110),a=n(111);e.exports=function(e,t){for(var n=0,o=(t=r(t,e)).length;null!=e&&n<o;)e=e[a(t[n++])];return n&&n==o?e:void 0}},function(e,t){e.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},function(e,t,n){var r=n(366),a=n(100),o=Object.prototype.hasOwnProperty;e.exports=function(e,t,n){var i=e[t];o.call(e,t)&&a(i,n)&&(void 0!==n||t in e)||r(e,t,n)}},function(e,t,n){var r=n(125),a=n(42),o=n(49),i=n(59).f,s=n(144),c=n(743),u=s(\"meta\"),l=0,p=Object.isExtensible||function(){return!0},f=function(e){i(e,u,{value:{objectID:\"O\"+ ++l,weakData:{}}})},d=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!a(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!o(e,u)){if(!p(e))return\"F\";if(!t)return\"E\";f(e)}return e[u].objectID},getWeakData:function(e,t){if(!o(e,u)){if(!p(e))return!0;if(!t)return!1;f(e)}return e[u].weakData},onFreeze:function(e){return c&&d.REQUIRED&&p(e)&&!o(e,u)&&f(e),e}};r[u]=!0},function(e,t,n){e.exports=n(502)},function(e,t,n){var r=n(575)(n(611));e.exports=r},function(e,t,n){e.exports=n(624)},function(e,t,n){e.exports=n(666)},function(e,t,n){var r=n(95),a=n(45),o=n(75);e.exports=function(e){return\"string\"==typeof e||!a(e)&&o(e)&&\"[object String]\"==r(e)}},function(e,t,n){e.exports=n(730)},function(e,t,n){e.exports=n(731)},function(e,t,n){var r=n(734),a=n(373)((function(e,t){return null==e?{}:r(e,t)}));e.exports=a},function(e,t){e.exports=require(\"buffer\")},function(e,t,n){var r=n(162),a=n(113),o=n(746),i=n(98),s=n(128),c=n(97),u=Object.prototype.hasOwnProperty,l=o((function(e,t){if(s(t)||i(t))a(t,c(t),e);else for(var n in t)u.call(t,n)&&r(e,n,t[n])}));e.exports=l},function(e,t){e.exports=require(\"btoa\")},function(e,t,n){e.exports=n(754)},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return _}));var r=n(18),a=n.n(r),o=n(6),i=n.n(o),s=n(7),c=n.n(s),u=n(10),l=n.n(u),p=n(8),f=n.n(p),d=n(9),h=n.n(d),m=n(3),v=n.n(m),g=n(15),y=n.n(g),b=n(2),E=n.n(b),x=n(0),S=n.n(x),w=n(78),j=n.n(w),O=(n(11),n(5)),C=n(25),_=function(e){f()(n,e);var t=h()(n);function n(e,r){var a;i()(this,n),a=t.call(this,e,r),v()(l()(a),\"getDefinitionUrl\",(function(){var e=a.props.specSelectors;return new j.a(e.url(),C.a.location).toString()}));var o=(0,e.getConfigs)().validatorUrl;return a.state={url:a.getDefinitionUrl(),validatorUrl:void 0===o?\"https://validator.swagger.io/validator\":o},a}return c()(n,[{key:\"componentWillReceiveProps\",value:function(e){var t=(0,e.getConfigs)().validatorUrl;this.setState({url:this.getDefinitionUrl(),validatorUrl:void 0===t?\"https://validator.swagger.io/validator\":t})}},{key:\"render\",value:function(){var e,t,n=(0,this.props.getConfigs)().spec,r=Object(O.F)(this.state.validatorUrl);return\"object\"===a()(n)&&y()(n).length?null:this.state.url&&Object(O.E)(this.state.validatorUrl)&&Object(O.E)(this.state.url)?S.a.createElement(\"span\",{className:\"float-right\"},S.a.createElement(\"a\",{target:\"_blank\",rel:\"noopener noreferrer\",href:E()(e=\"\".concat(r,\"/debug?url=\")).call(e,encodeURIComponent(this.state.url))},S.a.createElement(A,{src:E()(t=\"\".concat(r,\"?url=\")).call(t,encodeURIComponent(this.state.url)),alt:\"Online validator badge\"}))):null}}]),n}(S.a.Component),A=function(e){f()(n,e);var t=h()(n);function n(e){var r;return i()(this,n),(r=t.call(this,e)).state={loaded:!1,error:!1},r}return c()(n,[{key:\"componentDidMount\",value:function(){var e=this,t=new Image;t.onload=function(){e.setState({loaded:!0})},t.onerror=function(){e.setState({error:!0})},t.src=this.props.src}},{key:\"componentWillReceiveProps\",value:function(e){var t=this;if(e.src!==this.props.src){var n=new Image;n.onload=function(){t.setState({loaded:!0})},n.onerror=function(){t.setState({error:!0})},n.src=e.src}}},{key:\"render\",value:function(){return this.state.error?S.a.createElement(\"img\",{alt:\"Error\"}):this.state.loaded?S.a.createElement(\"img\",{src:this.props.src,alt:this.props.alt}):null}}]),n}(S.a.Component)},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return P}));var r=n(27),a=n.n(r),o=n(6),i=n.n(o),s=n(7),c=n.n(s),u=n(10),l=n.n(u),p=n(8),f=n.n(p),d=n(9),h=n.n(d),m=n(3),v=n.n(m),g=n(2),y=n.n(g),b=n(17),E=n.n(b),x=n(4),S=n.n(x),w=n(0),j=n.n(w),O=n(412),C=n.n(O),_=n(26),A=n.n(_),k=n(11),I=n.n(k),P=function(e){f()(r,e);var t=h()(r);function r(){var e,n;i()(this,r);for(var a=arguments.length,o=new Array(a),s=0;s<a;s++)o[s]=arguments[s];return n=t.call.apply(t,y()(e=[this]).call(e,o)),v()(l()(n),\"getModelName\",(function(e){return-1!==E()(e).call(e,\"#/definitions/\")?e.replace(/^.*#\\/definitions\\//,\"\"):-1!==E()(e).call(e,\"#/components/schemas/\")?e.replace(/^.*#\\/components\\/schemas\\//,\"\"):void 0})),v()(l()(n),\"getRefSchema\",(function(e){return n.props.specSelectors.findDefinition(e)})),n}return c()(r,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,r=e.getConfigs,o=e.specSelectors,i=e.schema,s=e.required,c=e.name,u=e.isRef,l=e.specPath,p=e.displayName,f=e.includeReadOnly,d=e.includeWriteOnly,h=t(\"ObjectModel\"),m=t(\"ArrayModel\"),v=t(\"PrimitiveModel\"),g=\"object\",y=i&&i.get(\"$$ref\");if(!c&&y&&(c=this.getModelName(y)),!i&&y&&(i=this.getRefSchema(c)),!i)return j.a.createElement(\"span\",{className:\"model model-title\"},j.a.createElement(\"span\",{className:\"model-title__text\"},p||c),j.a.createElement(\"img\",{src:n(380),height:\"20px\",width:\"20px\"}));var b=o.isOAS3()&&i.get(\"deprecated\");switch(u=void 0!==u?u:!!y,g=i&&i.get(\"type\")||g){case\"object\":return j.a.createElement(h,a()({className:\"object\"},this.props,{specPath:l,getConfigs:r,schema:i,name:c,deprecated:b,isRef:u,includeReadOnly:f,includeWriteOnly:d}));case\"array\":return j.a.createElement(m,a()({className:\"array\"},this.props,{getConfigs:r,schema:i,name:c,deprecated:b,required:s,includeReadOnly:f,includeWriteOnly:d}));case\"string\":case\"number\":case\"integer\":case\"boolean\":default:return j.a.createElement(v,a()({},this.props,{getComponent:t,getConfigs:r,schema:i,name:c,deprecated:b,required:s}))}}}]),r}(C.a);v()(P,\"propTypes\",{schema:S()(A.a).isRequired,getComponent:I.a.func.isRequired,getConfigs:I.a.func.isRequired,specSelectors:I.a.object.isRequired,name:I.a.string,displayName:I.a.string,isRef:I.a.bool,required:I.a.bool,expandDepth:I.a.number,depth:I.a.number,specPath:A.a.list.isRequired,includeReadOnly:I.a.bool,includeWriteOnly:I.a.bool})},function(e,t){e.exports=require(\"remarkable\")},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return y}));var r=n(0),a=n.n(r),o=(n(11),n(178)),i=n(413),s=n.n(i),c=/www|@|\\:\\/\\//;function u(e){return/^<\\/a\\s*>/i.test(e)}function l(){var e=[],t=new s.a({stripPrefix:!1,url:!0,email:!0,replaceFn:function(t){switch(t.getType()){case\"url\":e.push({text:t.matchedText,url:t.getUrl()});break;case\"email\":e.push({text:t.matchedText,url:\"mailto:\"+t.getEmail().replace(/^mailto:/i,\"\")})}return!1}});return{links:e,autolinker:t}}function p(e){var t,n,r,a,o,i,s,p,f,d,h,m,v,g,y=e.tokens,b=null;for(n=0,r=y.length;n<r;n++)if(\"inline\"===y[n].type)for(h=0,t=(a=y[n].children).length-1;t>=0;t--)if(\"link_close\"!==(o=a[t]).type){if(\"htmltag\"===o.type&&(g=o.content,/^<a[>\\s]/i.test(g)&&h>0&&h--,u(o.content)&&h++),!(h>0)&&\"text\"===o.type&&c.test(o.content)){if(b||(m=(b=l()).links,v=b.autolinker),i=o.content,m.length=0,v.link(i),!m.length)continue;for(s=[],d=o.level,p=0;p<m.length;p++)e.inline.validateLink(m[p].url)&&((f=i.indexOf(m[p].text))&&s.push({type:\"text\",content:i.slice(0,f),level:d}),s.push({type:\"link_open\",href:m[p].url,title:\"\",level:d++}),s.push({type:\"text\",content:m[p].text,level:d}),s.push({type:\"link_close\",level:--d}),i=i.slice(f+m[p].text.length));i.length&&s.push({type:\"text\",content:i,level:d}),y[n].children=a=[].concat(a.slice(0,t),s,a.slice(t+1))}}else for(t--;a[t].level!==o.level&&\"link_open\"!==a[t].type;)t--}function f(e){e.core.ruler.push(\"linkify\",p)}var d=n(181),h=n.n(d),m=n(54),v=n.n(m);function g(e){var t=e.source,n=e.className,r=void 0===n?\"\":n,i=e.getConfigs;if(\"string\"!=typeof t)return null;var s=new o.Remarkable({html:!0,typographer:!0,breaks:!0,linkTarget:\"_blank\"}).use(f);s.core.ruler.disable([\"replacements\",\"smartquotes\"]);var c=i().useUnsafeMarkdown,u=s.render(t),l=y(u,{useUnsafeMarkdown:c});return t&&u&&l?a.a.createElement(\"div\",{className:v()(r,\"markdown\"),dangerouslySetInnerHTML:{__html:l}}):null}h.a.addHook&&h.a.addHook(\"beforeSanitizeElements\",(function(e){return e.href&&e.setAttribute(\"rel\",\"noopener noreferrer\"),e})),g.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}};t.a=g;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.useUnsafeMarkdown,r=void 0!==n&&n,a=r,o=r?[]:[\"style\",\"class\"];return r&&!y.hasWarnedAboutDeprecation&&(console.warn(\"useUnsafeMarkdown display configuration parameter is deprecated since >3.26.0 and will be removed in v4.0.0.\"),y.hasWarnedAboutDeprecation=!0),h.a.sanitize(e,{ADD_ATTR:[\"target\"],FORBID_TAGS:[\"style\",\"form\"],ALLOW_DATA_ATTR:a,FORBID_ATTR:o})}y.hasWarnedAboutDeprecation=!1},function(e,t){e.exports=require(\"qs\")},function(e,t){e.exports=require(\"dompurify\")},function(e,t){var n;n=function(){return this}();try{n=n||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(n=window)}e.exports=n},function(e,t,n){var r=n(36),a=n(42),o=r.document,i=a(o)&&a(o.createElement);e.exports=function(e){return i?o.createElement(e):{}}},function(e,t,n){var r=n(42),a=n(121),o=n(37)(\"species\");e.exports=function(e,t){var n;return a(e)&&(\"function\"!=typeof(n=e.constructor)||n!==Array&&!a(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},function(e,t,n){var r=n(81),a=n(186);(e.exports=function(e,t){return a[e]||(a[e]=void 0!==t?t:{})})(\"versions\",[]).push({version:\"3.15.1\",mode:r?\"pure\":\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"})},function(e,t,n){var r=n(36),a=n(417),o=\"__core-js_shared__\",i=r[o]||a(o,{});e.exports=i},function(e,t,n){var r=n(106),a=n(34);e.exports=!!Object.getOwnPropertySymbols&&!a((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(e,t,n){var r=n(43),a=n(59),o=n(46),i=n(124);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=i(t),s=r.length,c=0;s>c;)a.f(e,n=r[c++],t[n]);return e}},function(e,t,n){var r=n(57),a=n(60),o=n(190),i=function(e){return function(t,n,i){var s,c=r(t),u=a(c.length),l=o(i,u);if(e&&n!=n){for(;u>l;)if((s=c[l++])!=s)return!0}else for(;u>l;l++)if((e||l in c)&&c[l]===n)return e||l||0;return!e&&-1}};e.exports={includes:i(!0),indexOf:i(!1)}},function(e,t,n){var r=n(105),a=Math.max,o=Math.min;e.exports=function(e,t){var n=r(e);return n<0?a(n+t,0):o(n,t)}},function(e,t){e.exports=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"]},function(e,t,n){var r=n(295),a=n(191).concat(\"length\",\"prototype\");t.f=Object.getOwnPropertyNames||function(e){return r(e,a)}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var r=n(37);t.f=r},function(e,t,n){var r={};r[n(37)(\"toStringTag\")]=\"z\",e.exports=\"[object z]\"===String(r)},function(e,t,n){\"use strict\";var r=n(21),a=n(301),o=n(147),i=n(148),s=n(82),c=n(58),u=n(93),l=n(37),p=n(81),f=n(108),d=n(302),h=d.IteratorPrototype,m=d.BUGGY_SAFARI_ITERATORS,v=l(\"iterator\"),g=\"keys\",y=\"values\",b=\"entries\",E=function(){return this};e.exports=function(e,t,n,l,d,x,S){a(n,t,l);var w,j,O,C=function(e){if(e===d&&P)return P;if(!m&&e in k)return k[e];switch(e){case g:case y:case b:return function(){return new n(this,e)}}return function(){return new n(this)}},_=t+\" Iterator\",A=!1,k=e.prototype,I=k[v]||k[\"@@iterator\"]||d&&k[d],P=!m&&I||C(d),T=\"Array\"==t&&k.entries||I;if(T&&(w=o(T.call(new e)),h!==Object.prototype&&w.next&&(p||o(w)===h||(i?i(w,h):\"function\"!=typeof w[v]&&c(w,v,E)),s(w,_,!0,!0),p&&(f[_]=E))),d==y&&I&&I.name!==y&&(A=!0,P=function(){return I.call(this)}),p&&!S||k[v]===P||c(k,v,P),f[t]=P,d)if(j={values:C(y),keys:x?P:C(g),entries:C(b)},S)for(O in j)(m||A||!(O in k))&&u(k,O,j[O]);else r({target:t,proto:!0,forced:m||A},j);return j}},function(e,t){e.exports=function(){}},function(e,t,n){e.exports=n(459)},function(e,t,n){e.exports=n(486)},function(e,t,n){e.exports=n(487)},function(e,t,n){var r=n(554),a=n(570),o=n(572),i=n(573),s=n(574);function c(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}c.prototype.clear=r,c.prototype.delete=a,c.prototype.get=o,c.prototype.has=i,c.prototype.set=s,e.exports=c},function(e,t,n){var r=n(96)(n(62),\"Map\");e.exports=r},function(e,t,n){var r=n(153),a=n(578),o=n(579),i=n(580),s=n(581),c=n(582);function u(e){var t=this.__data__=new r(e);this.size=t.size}u.prototype.clear=a,u.prototype.delete=o,u.prototype.get=i,u.prototype.has=s,u.prototype.set=c,e.exports=u},function(e,t){e.exports=function(e,t){for(var n=-1,r=t.length,a=e.length;++n<r;)e[a+n]=t[n];return e}},function(e,t,n){var r=n(592),a=n(340),o=Object.prototype.propertyIsEnumerable,i=Object.getOwnPropertySymbols,s=i?function(e){return null==e?[]:(e=Object(e),r(i(e),(function(t){return o.call(e,t)})))}:a;e.exports=s},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,\"loaded\",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,\"id\",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,n){var r=n(596),a=n(209),o=n(210),i=o&&o.isTypedArray,s=i?a(i):r;e.exports=s},function(e,t){e.exports=function(e){return\"number\"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,n){(function(e){var r=n(328),a=t&&!t.nodeType&&t,o=a&&\"object\"==typeof e&&e&&!e.nodeType&&e,i=o&&o.exports===a&&r.process,s=function(){try{var e=o&&o.require&&o.require(\"util\").types;return e||i&&i.binding&&i.binding(\"util\")}catch(e){}}();e.exports=s}).call(this,n(206)(e))},function(e,t,n){var r=n(45),a=n(151),o=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,i=/^\\w*$/;e.exports=function(e,t){if(r(e))return!1;var n=typeof e;return!(\"number\"!=n&&\"symbol\"!=n&&\"boolean\"!=n&&null!=e&&!a(e))||(i.test(e)||!o.test(e)||null!=t&&e in Object(t))}},function(e,t){e.exports=function(e){return e}},function(e,t,n){var r=n(341),a=n(696),o=n(98);e.exports=function(e){return o(e)?r(e,!0):a(e)}},function(e,t,n){var r=n(343)(Object.getPrototypeOf,Object);e.exports=r},function(e,t,n){var r=n(337);e.exports=function(e){var t=new e.constructor(e.byteLength);return new r(t).set(new r(e)),t}},function(e,t,n){var r=n(541)(\"toUpperCase\");e.exports=r},function(e,t,n){var r=n(201);function a(e,t){if(\"function\"!=typeof e||null!=t&&\"function\"!=typeof t)throw new TypeError(\"Expected a function\");var n=function(){var r=arguments,a=t?t.apply(this,r):r[0],o=n.cache;if(o.has(a))return o.get(a);var i=e.apply(this,r);return n.cache=o.set(a,i)||o,i};return n.cache=new(a.Cache||r),n}a.Cache=r,e.exports=a},function(e,t,n){\"use strict\";n.r(t);var r=n(219),a=n(52),o=n(222);t.default=function(e){return{statePlugins:{err:{reducers:Object(r.default)(e),actions:a,selectors:o}}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(3),a=n.n(r),o=n(20),i=n.n(o),s=n(4),c=n.n(s),u=n(2),l=n.n(u),p=n(12),f=n.n(p),d=n(166),h=n.n(d),m=n(52),v=n(1),g=n(103),y={line:0,level:\"error\",message:\"Unknown error\"};t.default=function(){var e;return e={},a()(e,m.NEW_THROWN_ERR,(function(e,t){var n=t.payload,r=i()(y,n,{type:\"thrown\"});return e.update(\"errors\",(function(e){return(e||Object(v.List)()).push(Object(v.fromJS)(r))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),a()(e,m.NEW_THROWN_ERR_BATCH,(function(e,t){var n=t.payload;return n=c()(n).call(n,(function(e){return Object(v.fromJS)(i()(y,e,{type:\"thrown\"}))})),e.update(\"errors\",(function(e){var t;return l()(t=e||Object(v.List)()).call(t,Object(v.fromJS)(n))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),a()(e,m.NEW_SPEC_ERR,(function(e,t){var n=t.payload,r=Object(v.fromJS)(n);return r=r.set(\"type\",\"spec\"),e.update(\"errors\",(function(e){return(e||Object(v.List)()).push(Object(v.fromJS)(r)).sortBy((function(e){return e.get(\"line\")}))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),a()(e,m.NEW_SPEC_ERR_BATCH,(function(e,t){var n=t.payload;return n=c()(n).call(n,(function(e){return Object(v.fromJS)(i()(y,e,{type:\"spec\"}))})),e.update(\"errors\",(function(e){var t;return l()(t=e||Object(v.List)()).call(t,Object(v.fromJS)(n))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),a()(e,m.NEW_AUTH_ERR,(function(e,t){var n=t.payload,r=Object(v.fromJS)(i()({},n));return r=r.set(\"type\",\"auth\"),e.update(\"errors\",(function(e){return(e||Object(v.List)()).push(Object(v.fromJS)(r))})).update(\"errors\",(function(e){return Object(g.default)(e)}))})),a()(e,m.CLEAR,(function(e,t){var n,r=t.payload;if(!r||!e.get(\"errors\"))return e;var a=f()(n=e.get(\"errors\")).call(n,(function(e){var t;return h()(t=e.keySeq()).call(t,(function(t){var n=e.get(t),a=r[t];return!a||n!==a}))}));return e.merge({errors:a})})),a()(e,m.CLEAR_BY,(function(e,t){var n,r=t.payload;if(!r||\"function\"!=typeof r)return e;var a=f()(n=e.get(\"errors\")).call(n,(function(e){return r(e)}));return e.merge({errors:a})})),e}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"transform\",(function(){return p}));var r=n(4),a=n.n(r),o=n(17),i=n.n(o),s=n(19),c=n.n(s),u=n(28),l=n.n(u);function p(e){return a()(e).call(e,(function(e){var t,n=\"is not of a type(s)\",r=i()(t=e.get(\"message\")).call(t,n);if(r>-1){var a,o,s=c()(a=e.get(\"message\")).call(a,r+n.length).split(\",\");return e.set(\"message\",c()(o=e.get(\"message\")).call(o,0,r)+function(e){return l()(e).call(e,(function(e,t,n,r){return n===r.length-1&&r.length>1?e+\"or \"+t:r[n+1]&&r.length>2?e+t+\", \":r[n+1]?e+t+\" \":e+t}),\"should be a\")}(s))}return e}))}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"transform\",(function(){return r}));n(4),n(17),n(39),n(1);function r(e,t){t.jsSpec;return e}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"allErrors\",(function(){return o})),n.d(t,\"lastError\",(function(){return i}));var r=n(1),a=n(16),o=Object(a.createSelector)((function(e){return e}),(function(e){return e.get(\"errors\",Object(r.List)())})),i=Object(a.createSelector)(o,(function(e){return e.last()}))},function(e,t,n){\"use strict\";n.r(t);var r=n(224),a=n(86),o=n(225),i=n(226);t.default=function(){return{statePlugins:{layout:{reducers:r.default,actions:a,selectors:o},spec:{wrapSelectors:i}}}}},function(e,t,n){\"use strict\";n.r(t);var r,a=n(3),o=n.n(a),i=n(2),s=n.n(i),c=n(1),u=n(86);t.default=(r={},o()(r,u.UPDATE_LAYOUT,(function(e,t){return e.set(\"layout\",t.payload)})),o()(r,u.UPDATE_FILTER,(function(e,t){return e.set(\"filter\",t.payload)})),o()(r,u.SHOW,(function(e,t){var n=t.payload.shown,r=Object(c.fromJS)(t.payload.thing);return e.update(\"shown\",Object(c.fromJS)({}),(function(e){return e.set(r,n)}))})),o()(r,u.UPDATE_MODE,(function(e,t){var n,r=t.payload.thing,a=t.payload.mode;return e.setIn(s()(n=[\"modes\"]).call(n,r),(a||\"\")+\"\")})),r)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"current\",(function(){return l})),n.d(t,\"currentFilter\",(function(){return p})),n.d(t,\"isShown\",(function(){return f})),n.d(t,\"whatMode\",(function(){return d})),n.d(t,\"showSummary\",(function(){return h}));var r=n(14),a=n.n(r),o=n(2),i=n.n(o),s=n(16),c=n(5),u=n(1),l=function(e){return e.get(\"layout\")},p=function(e){return e.get(\"filter\")},f=function(e,t,n){return t=Object(c.v)(t),e.get(\"shown\",Object(u.fromJS)({})).get(Object(u.fromJS)(t),n)},d=function(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\";return t=Object(c.v)(t),e.getIn(i()(n=[\"modes\"]).call(n,a()(t)),r)},h=Object(s.createSelector)((function(e){return e}),(function(e){return!f(e,\"editor\")}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"taggedOperations\",(function(){return s}));var r=n(2),a=n.n(r),o=n(19),i=n.n(o),s=function(e,t){return function(n){for(var r,o=arguments.length,s=new Array(o>1?o-1:0),c=1;c<o;c++)s[c-1]=arguments[c];var u=e.apply(void 0,a()(r=[n]).call(r,s)),l=t.getSystem(),p=l.fn,f=l.layoutSelectors,d=l.getConfigs,h=d(),m=h.maxDisplayedTags,v=f.currentFilter();return v&&!0!==v&&\"true\"!==v&&\"false\"!==v&&(u=p.opsFilter(u,v)),m&&!isNaN(m)&&m>=0&&(u=i()(u).call(u,0,m)),u}}},function(e,t,n){\"use strict\";n.r(t);var r=n(228),a=n(41),o=n(77),i=n(229);t.default=function(){return{statePlugins:{spec:{wrapActions:i,reducers:r.default,actions:a,selectors:o}}}}},function(e,t,n){\"use strict\";n.r(t);var r,a=n(3),o=n.n(a),i=n(14),s=n.n(i),c=n(2),u=n.n(c),l=n(28),p=n.n(l),f=n(4),d=n.n(f),h=n(20),m=n.n(h),v=n(1),g=n(5),y=n(25),b=n(77),E=n(41);t.default=(r={},o()(r,E.UPDATE_SPEC,(function(e,t){return\"string\"==typeof t.payload?e.set(\"spec\",t.payload):e})),o()(r,E.UPDATE_URL,(function(e,t){return e.set(\"url\",t.payload+\"\")})),o()(r,E.UPDATE_JSON,(function(e,t){return e.set(\"json\",Object(g.i)(t.payload))})),o()(r,E.UPDATE_RESOLVED,(function(e,t){return e.setIn([\"resolved\"],Object(g.i)(t.payload))})),o()(r,E.UPDATE_RESOLVED_SUBTREE,(function(e,t){var n,r=t.payload,a=r.value,o=r.path;return e.setIn(u()(n=[\"resolvedSubtrees\"]).call(n,s()(o)),Object(g.i)(a))})),o()(r,E.UPDATE_PARAM,(function(e,t){var n,r,a=t.payload,o=a.path,i=a.paramName,c=a.paramIn,l=a.param,p=a.value,f=a.isXml,d=l?Object(g.A)(l):u()(n=\"\".concat(c,\".\")).call(n,i),h=f?\"value_xml\":\"value\";return e.setIn(u()(r=[\"meta\",\"paths\"]).call(r,s()(o),[\"parameters\",d,h]),p)})),o()(r,E.UPDATE_EMPTY_PARAM_INCLUSION,(function(e,t){var n,r,a=t.payload,o=a.pathMethod,i=a.paramName,c=a.paramIn,l=a.includeEmptyValue;if(!i||!c)return console.warn(\"Warning: UPDATE_EMPTY_PARAM_INCLUSION could not generate a paramKey.\"),e;var p=u()(n=\"\".concat(c,\".\")).call(n,i);return e.setIn(u()(r=[\"meta\",\"paths\"]).call(r,s()(o),[\"parameter_inclusions\",p]),l)})),o()(r,E.VALIDATE_PARAMS,(function(e,t){var n,r,a=t.payload,o=a.pathMethod,i=a.isOAS3,c=Object(b.specJsonWithResolvedSubtrees)(e).getIn(u()(n=[\"paths\"]).call(n,s()(o))),l=Object(b.parameterValues)(e,o).toJS();return e.updateIn(u()(r=[\"meta\",\"paths\"]).call(r,s()(o),[\"parameters\"]),Object(v.fromJS)({}),(function(t){var n;return p()(n=c.get(\"parameters\",Object(v.List)())).call(n,(function(t,n){var r=Object(g.B)(n,l),a=Object(b.parameterInclusionSettingFor)(e,o,n.get(\"name\"),n.get(\"in\")),s=Object(g.K)(n,r,{bypassRequiredCheck:a,isOAS3:i});return t.setIn([Object(g.A)(n),\"errors\"],Object(v.fromJS)(s))}),t)}))})),o()(r,E.CLEAR_VALIDATE_PARAMS,(function(e,t){var n,r=t.payload.pathMethod;return e.updateIn(u()(n=[\"meta\",\"paths\"]).call(n,s()(r),[\"parameters\"]),Object(v.fromJS)([]),(function(e){return d()(e).call(e,(function(e){return e.set(\"errors\",Object(v.fromJS)([]))}))}))})),o()(r,E.SET_RESPONSE,(function(e,t){var n,r=t.payload,a=r.res,o=r.path,i=r.method;(n=a.error?m()({error:!0,name:a.err.name,message:a.err.message,statusCode:a.err.statusCode},a.err.response):a).headers=n.headers||{};var s=e.setIn([\"responses\",o,i],Object(g.i)(n));return y.a.Blob&&a.data instanceof y.a.Blob&&(s=s.setIn([\"responses\",o,i,\"text\"],a.data)),s})),o()(r,E.SET_REQUEST,(function(e,t){var n=t.payload,r=n.req,a=n.path,o=n.method;return e.setIn([\"requests\",a,o],Object(g.i)(r))})),o()(r,E.SET_MUTATED_REQUEST,(function(e,t){var n=t.payload,r=n.req,a=n.path,o=n.method;return e.setIn([\"mutatedRequests\",a,o],Object(g.i)(r))})),o()(r,E.UPDATE_OPERATION_META_VALUE,(function(e,t){var n,r,a,o,i,c,l=t.payload,p=l.path,f=l.value,d=l.key,h=u()(n=[\"paths\"]).call(n,s()(p)),m=u()(r=[\"meta\",\"paths\"]).call(r,s()(p));return e.getIn(u()(a=[\"json\"]).call(a,s()(h)))||e.getIn(u()(o=[\"resolved\"]).call(o,s()(h)))||e.getIn(u()(i=[\"resolvedSubtrees\"]).call(i,s()(h)))?e.setIn(u()(c=[]).call(c,s()(m),[d]),Object(v.fromJS)(f)):e})),o()(r,E.CLEAR_RESPONSE,(function(e,t){var n=t.payload,r=n.path,a=n.method;return e.deleteIn([\"responses\",r,a])})),o()(r,E.CLEAR_REQUEST,(function(e,t){var n=t.payload,r=n.path,a=n.method;return e.deleteIn([\"requests\",r,a])})),o()(r,E.SET_SCHEME,(function(e,t){var n=t.payload,r=n.scheme,a=n.path,o=n.method;return a&&o?e.setIn([\"scheme\",a,o],r):a||o?void 0:e.setIn([\"scheme\",\"_defaultScheme\"],r)})),r)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"updateSpec\",(function(){return u})),n.d(t,\"updateJsonSpec\",(function(){return l})),n.d(t,\"executeRequest\",(function(){return p})),n.d(t,\"validateParams\",(function(){return f}));var r=n(15),a=n.n(r),o=n(23),i=n.n(o),s=n(39),c=n.n(s),u=function(e,t){var n=t.specActions;return function(){e.apply(void 0,arguments),n.parseToJson.apply(n,arguments)}},l=function(e,t){var n=t.specActions;return function(){for(var t=arguments.length,r=new Array(t),o=0;o<t;o++)r[o]=arguments[o];e.apply(void 0,r),n.invalidateResolvedSubtreeCache();var s=r[0],u=c()(s,[\"paths\"])||{},l=a()(u);i()(l).call(l,(function(e){c()(u,[e]).$ref&&n.requestResolvedSubtree([\"paths\",e])})),n.requestResolvedSubtree([\"components\",\"securitySchemes\"])}},p=function(e,t){var n=t.specActions;return function(t){return n.logRequest(t),e(t)}},f=function(e,t){var n=t.specSelectors;return function(t){return e(t,n.isOAS3())}}},function(e,t,n){\"use strict\";n.r(t);var r=n(33),a=n.n(r),o=n(137),i=n(5);t.default=function(e){var t=e.getComponents,n=e.getStore,r=e.getSystem,s=o.getComponent,c=o.render,u=o.makeMappedContainer,l=Object(i.u)(a()(s).call(s,null,r,n,t));return{rootInjects:{getComponent:l,makeMappedContainer:Object(i.u)(a()(u).call(u,null,r,n,l,t)),render:a()(c).call(c,null,r,n,s,t)}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(115);t.default=function(){return{fn:r}}},function(e,t,n){\"use strict\";n.r(t);var r=n(133),a=n(233),o=n(234);t.default=function(){return{components:{RequestSnippets:o.RequestSnippets},fn:r,statePlugins:{requestSnippets:{selectors:a}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"getGenerators\",(function(){return f})),n.d(t,\"getSnippetGenerators\",(function(){return d})),n.d(t,\"getActiveLanguage\",(function(){return h})),n.d(t,\"getDefaultExpanded\",(function(){return m}));var r=n(12),a=n.n(r),o=n(29),i=n.n(o),s=n(4),c=n.n(s),u=n(16),l=n(1),p=function(e){return e||Object(l.Map)()},f=Object(u.createSelector)(p,(function(e){var t=e.get(\"languages\"),n=e.get(\"generators\",Object(l.Map)());return t?a()(n).call(n,(function(e,n){return i()(t).call(t,n)})):n})),d=function(e){return function(t){var n,r,o=t.fn;return a()(n=c()(r=f(e)).call(r,(function(e,t){var n=function(e){return o[\"requestSnippetGenerator_\".concat(e)]}(t);return\"function\"!=typeof n?null:e.set(\"fn\",n)}))).call(n,(function(e){return e}))}},h=Object(u.createSelector)(p,(function(e){return e.get(\"activeLanguage\")})),m=Object(u.createSelector)(p,(function(e){return e.get(\"defaultExpanded\")}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"RequestSnippets\",(function(){return x}));var r=n(13),a=n.n(r),o=n(6),i=n.n(o),s=n(7),c=n.n(s),u=n(8),l=n.n(u),p=n(9),f=n.n(p),d=n(4),h=n.n(d),m=n(0),v=n.n(m),g=n(116),y=(n(11),n(39)),b=n.n(y),E=n(80),x=function(e){l()(n,e);var t=f()(n);function n(){var e,r,a,o,s,c;return i()(this,n),(c=t.call(this)).state={activeLanguage:null===(e=c.props)||void 0===e||null===(r=e.requestSnippetsSelectors)||void 0===r||null===(a=r.getSnippetGenerators())||void 0===a?void 0:a.keySeq().first(),expanded:null===(o=c.props)||void 0===o||null===(s=o.requestSnippetsSelectors)||void 0===s?void 0:s.getDefaultExpanded()},c}return c()(n,[{key:\"render\",value:function(){var e,t,n,r,o=this,i=this.props,s=i.request,c=i.getConfigs,u=i.requestSnippetsSelectors.getSnippetGenerators(),l=this.state.activeLanguage||u.keySeq().first(),p=u.get(l),f=p.get(\"fn\")(s),d={cursor:\"pointer\",lineHeight:1,display:\"inline-flex\",backgroundColor:\"rgb(250, 250, 250)\",paddingBottom:\"0\",paddingTop:\"0\",border:\"1px solid rgb(51, 51, 51)\",borderRadius:\"4px 4px 0 0\",boxShadow:\"none\",borderBottom:\"none\"},m={cursor:\"pointer\",lineHeight:1,display:\"inline-flex\",backgroundColor:\"rgb(51, 51, 51)\",boxShadow:\"none\",border:\"1px solid rgb(51, 51, 51)\",paddingBottom:\"0\",paddingTop:\"0\",borderRadius:\"4px 4px 0 0\",marginTop:\"-5px\",marginRight:\"-5px\",marginLeft:\"-5px\",zIndex:\"9999\",borderBottom:\"none\"},y=function(e){return e===l?m:d},x=c(),S=null!=x&&null!==(e=x.syntaxHighlight)&&void 0!==e&&e.activated?v.a.createElement(E.a,{language:p.get(\"syntax\"),className:\"curl microlight\",onWheel:function(e){return this.preventYScrollingBeyondElement(e)},style:Object(E.b)(b()(x,\"syntaxHighlight.theme\"))},f):v.a.createElement(\"textarea\",{readOnly:!0,className:\"curl\",value:f}),w=void 0===this.state.expanded?null===(t=this.props)||void 0===t||null===(n=t.requestSnippetsSelectors)||void 0===n?void 0:n.getDefaultExpanded():this.state.expanded;return v.a.createElement(\"div\",null,v.a.createElement(\"div\",{style:{width:\"100%\",display:\"flex\",justifyContent:\"flex-start\",alignItems:\"center\",marginBottom:\"15px\"}},v.a.createElement(\"h4\",{style:{cursor:\"pointer\"},onClick:function(){return o.setState({expanded:!w})}},\"Snippets\"),v.a.createElement(\"button\",{onClick:function(){return o.setState({expanded:!w})},style:{border:\"none\",background:\"none\"},title:w?\"Collapse operation\":\"Expand operation\"},v.a.createElement(\"svg\",{className:\"arrow\",width:\"10\",height:\"10\"},v.a.createElement(\"use\",{href:w?\"#large-arrow-down\":\"#large-arrow\",xlinkHref:w?\"#large-arrow-down\":\"#large-arrow\"})))),w&&v.a.createElement(\"div\",{className:\"curl-command\"},v.a.createElement(\"div\",{style:{paddingLeft:\"15px\",paddingRight:\"10px\",width:\"100%\",display:\"flex\"}},h()(r=u.entrySeq()).call(r,(function(e){var t=a()(e,2),n=t[0],r=t[1];return v.a.createElement(\"div\",{style:y(n),className:\"btn\",key:n,onClick:function(){return function(e){l!==e&&o.setState({activeLanguage:e})}(n)}},v.a.createElement(\"h4\",{style:n===l?{color:\"white\"}:{}},r.get(\"title\")))}))),v.a.createElement(\"div\",{className:\"copy-to-clipboard\"},v.a.createElement(g.CopyToClipboard,{text:f},v.a.createElement(\"button\",null))),v.a.createElement(\"div\",null,S)))}}]),n}(v.a.Component)},function(e,t,n){\"use strict\";n.r(t);var r=n(33),a=n.n(r);t.default=function(e){var t=e.configs,n={debug:0,info:1,log:2,warn:3,error:4},r=function(e){return n[e]||-1},o=t.logLevel,i=r(o);function s(e){for(var t,n=arguments.length,a=new Array(n>1?n-1:0),o=1;o<n;o++)a[o-1]=arguments[o];r(e)>=i&&(t=console)[e].apply(t,a)}return s.warn=a()(s).call(s,null,\"warn\"),s.error=a()(s).call(s,null,\"error\"),s.info=a()(s).call(s,null,\"info\"),s.debug=a()(s).call(s,null,\"debug\"),{rootInjects:{log:s}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"loaded\",(function(){return r}));var r=function(e,t){return function(){e.apply(void 0,arguments);var n=t.getConfigs().withCredentials;void 0!==n&&(t.fn.fetch.withCredentials=\"string\"==typeof n?\"true\"===n:!!n)}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"preauthorizeBasic\",(function(){return d})),n.d(t,\"preauthorizeApiKey\",(function(){return h}));var r=n(3),a=n.n(r),o=n(33),i=n.n(o),s=n(2),c=n.n(s),u=n(238),l=n(71),p=n(239),f=n(240);function d(e,t,n,r){var o,i=e.authActions.authorize,s=e.specSelectors,u=s.specJson,l=(0,s.isOAS3)()?[\"components\",\"securitySchemes\"]:[\"securityDefinitions\"],p=u().getIn(c()(o=[]).call(o,l,[t]));return p?i(a()({},t,{value:{username:n,password:r},schema:p.toJS()})):null}function h(e,t,n){var r,o=e.authActions.authorize,i=e.specSelectors,s=i.specJson,u=(0,i.isOAS3)()?[\"components\",\"securitySchemes\"]:[\"securityDefinitions\"],l=s().getIn(c()(r=[]).call(r,u,[t]));return l?o(a()({},t,{value:n,schema:l.toJS()})):null}t.default=function(){return{afterLoad:function(e){this.rootInjects=this.rootInjects||{},this.rootInjects.initOAuth=e.authActions.configureAuth,this.rootInjects.preauthorizeApiKey=i()(h).call(h,null,e),this.rootInjects.preauthorizeBasic=i()(d).call(d,null,e)},statePlugins:{auth:{reducers:u.default,actions:l,selectors:p},spec:{wrapActions:f}}}}},function(e,t,n){\"use strict\";n.r(t);var r,a=n(3),o=n.n(a),i=n(13),s=n.n(i),c=n(23),u=n.n(c),l=n(20),p=n.n(l),f=n(1),d=n(5),h=n(71);t.default=(r={},o()(r,h.SHOW_AUTH_POPUP,(function(e,t){var n=t.payload;return e.set(\"showDefinitions\",n)})),o()(r,h.AUTHORIZE,(function(e,t){var n,r=t.payload,a=Object(f.fromJS)(r),o=e.get(\"authorized\")||Object(f.Map)();return u()(n=a.entrySeq()).call(n,(function(t){var n=s()(t,2),r=n[0],a=n[1];if(!Object(d.s)(a.getIn))return e.set(\"authorized\",o);var i=a.getIn([\"schema\",\"type\"]);if(\"apiKey\"===i||\"http\"===i)o=o.set(r,a);else if(\"basic\"===i){var c=a.getIn([\"value\",\"username\"]),u=a.getIn([\"value\",\"password\"]);o=(o=o.setIn([r,\"value\"],{username:c,header:\"Basic \"+Object(d.a)(c+\":\"+u)})).setIn([r,\"schema\"],a.get(\"schema\"))}})),e.set(\"authorized\",o)})),o()(r,h.AUTHORIZE_OAUTH2,(function(e,t){var n,r=t.payload,a=r.auth,o=r.token;a.token=p()({},o),n=Object(f.fromJS)(a);var i=e.get(\"authorized\")||Object(f.Map)();return i=i.set(n.get(\"name\"),n),e.set(\"authorized\",i)})),o()(r,h.LOGOUT,(function(e,t){var n=t.payload,r=e.get(\"authorized\").withMutations((function(e){u()(n).call(n,(function(t){e.delete(t)}))}));return e.set(\"authorized\",r)})),o()(r,h.CONFIGURE_AUTH,(function(e,t){var n=t.payload;return e.set(\"configs\",n)})),o()(r,h.RESTORE_AUTHORIZATION,(function(e,t){var n=t.payload;return e.set(\"authorized\",Object(f.fromJS)(n.authorized))})),r)},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"shownDefinitions\",(function(){return E})),n.d(t,\"definitionsToAuthorize\",(function(){return x})),n.d(t,\"getDefinitionsByNames\",(function(){return S})),n.d(t,\"definitionsForRequirements\",(function(){return w})),n.d(t,\"authorized\",(function(){return j})),n.d(t,\"isAuthorized\",(function(){return O})),n.d(t,\"getConfigs\",(function(){return C}));var r=n(13),a=n.n(r),o=n(23),i=n.n(o),s=n(12),c=n.n(s),u=n(64),l=n.n(u),p=n(17),f=n.n(p),d=n(4),h=n.n(d),m=n(15),v=n.n(m),g=n(16),y=n(1),b=function(e){return e},E=Object(g.createSelector)(b,(function(e){return e.get(\"showDefinitions\")})),x=Object(g.createSelector)(b,(function(){return function(e){var t,n=e.specSelectors.securityDefinitions()||Object(y.Map)({}),r=Object(y.List)();return i()(t=n.entrySeq()).call(t,(function(e){var t=a()(e,2),n=t[0],o=t[1],i=Object(y.Map)();i=i.set(n,o),r=r.push(i)})),r}})),S=function(e,t){return function(e){var n,r=e.specSelectors;console.warn(\"WARNING: getDefinitionsByNames is deprecated and will be removed in the next major version.\");var o=r.securityDefinitions(),s=Object(y.List)();return i()(n=t.valueSeq()).call(n,(function(e){var t,n=Object(y.Map)();i()(t=e.entrySeq()).call(t,(function(e){var t,r,s=a()(e,2),c=s[0],u=s[1],l=o.get(c);\"oauth2\"===l.get(\"type\")&&u.size&&(t=l.get(\"scopes\"),i()(r=t.keySeq()).call(r,(function(e){u.contains(e)||(t=t.delete(e))})),l=l.set(\"allowedScopes\",t));n=n.set(c,l)})),s=s.push(n)})),s}},w=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Object(y.List)();return function(e){var n=e.authSelectors.definitionsToAuthorize()||Object(y.List)();return c()(n).call(n,(function(e){return l()(t).call(t,(function(t){return t.get(e.keySeq().first())}))}))}},j=Object(g.createSelector)(b,(function(e){return e.get(\"authorized\")||Object(y.Map)()})),O=function(e,t){return function(e){var n,r=e.authSelectors.authorized();return y.List.isList(t)?!!c()(n=t.toJS()).call(n,(function(e){var t,n;return-1===f()(t=h()(n=v()(e)).call(n,(function(e){return!!r.get(e)}))).call(t,!1)})).length:null}},C=Object(g.createSelector)(b,(function(e){return e.get(\"configs\")}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"execute\",(function(){return o}));var r=n(24),a=n.n(r),o=function(e,t){var n=t.authSelectors,r=t.specSelectors;return function(t){var o=t.path,i=t.method,s=t.operation,c=t.extras,u={authorized:n.authorized()&&n.authorized().toJS(),definitions:r.securityDefinitions()&&r.securityDefinitions().toJS(),specSecurity:r.security()&&r.security().toJS()};return e(a()({path:o,method:i,operation:s,securities:u},c))}}},function(e,t,n){\"use strict\";n.r(t);var r=n(5);t.default=function(){return{fn:{shallowEqualKeys:r.G}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return v}));var r=n(20),a=n.n(r),o=n(79),i=n.n(o),s=n(2),c=n.n(s),u=n(17),l=n.n(u),p=n(30),f=n.n(p),d=n(16),h=n(1),m=n(25);function v(e){var t=e.fn;return{statePlugins:{spec:{actions:{download:function(e){return function(n){var r=n.errActions,o=n.specSelectors,s=n.specActions,u=n.getConfigs,l=t.fetch,p=u();function f(t){if(t instanceof Error||t.status>=400)return s.updateLoadingStatus(\"failed\"),r.newThrownErr(a()(new Error((t.message||t.statusText)+\" \"+e),{source:\"fetch\"})),void(!t.status&&t instanceof Error&&function(){try{var t;if(\"URL\"in m.a?t=new i.a(e):(t=document.createElement(\"a\")).href=e,\"https:\"!==t.protocol&&\"https:\"===m.a.location.protocol){var n=a()(new Error(\"Possible mixed-content issue? The page was loaded over https:// but a \".concat(t.protocol,\"// URL was specified. Check that you are not attempting to load mixed content.\")),{source:\"fetch\"});return void r.newThrownErr(n)}if(t.origin!==m.a.location.origin){var o,s=a()(new Error(c()(o=\"Possible cross-origin (CORS) issue? The URL origin (\".concat(t.origin,\") does not match the page (\")).call(o,m.a.location.origin,\"). Check the server returns the correct 'Access-Control-Allow-*' headers.\")),{source:\"fetch\"});r.newThrownErr(s)}}catch(e){return}}());s.updateLoadingStatus(\"success\"),s.updateSpec(t.text),o.url()!==e&&s.updateUrl(e)}e=e||o.url(),s.updateLoadingStatus(\"loading\"),r.clear({source:\"fetch\"}),l({url:e,loadSpec:!0,requestInterceptor:p.requestInterceptor||function(e){return e},responseInterceptor:p.responseInterceptor||function(e){return e},credentials:\"same-origin\",headers:{Accept:\"application/json,*/*\"}}).then(f,f)}},updateLoadingStatus:function(e){var t,n=[null,\"loading\",\"failed\",\"success\",\"failedConfig\"];-1===l()(n).call(n,e)&&console.error(c()(t=\"Error: \".concat(e,\" is not one of \")).call(t,f()(n)));return{type:\"spec_update_loading_status\",payload:e}}},reducers:{spec_update_loading_status:function(e,t){return\"string\"==typeof t.payload?e.set(\"loadingStatus\",t.payload):e}},selectors:{loadingStatus:Object(d.createSelector)((function(e){return e||Object(h.Map)()}),(function(e){return e.get(\"loadingStatus\")||null}))}}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"downloadConfig\",(function(){return a})),n.d(t,\"getConfigByUrl\",(function(){return o}));var r=n(134),a=function(e){return function(t){return(0,t.fn.fetch)(e)}},o=function(e,t){return function(n){var a=n.specActions;if(e)return a.downloadConfig(e).then(o,o);function o(n){n instanceof Error||n.status>=400?(a.updateLoadingStatus(\"failedConfig\"),a.updateLoadingStatus(\"failedConfig\"),a.updateUrl(\"\"),console.error(n.statusText+\" \"+e.url),t(null)):t(Object(r.parseYamlConfig)(n.text))}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"get\",(function(){return o}));var r=n(22),a=n.n(r),o=function(e,t){return e.getIn(a()(t)?t:[t])}},function(e,t,n){\"use strict\";n.r(t);var r,a=n(3),o=n.n(a),i=n(1),s=n(117);t.default=(r={},o()(r,s.UPDATE_CONFIGS,(function(e,t){return e.merge(Object(i.fromJS)(t.payload))})),o()(r,s.TOGGLE_CONFIGS,(function(e,t){var n=t.payload,r=e.get(n);return e.set(n,!r)})),r)},function(e,t,n){\"use strict\";n.r(t);var r=n(247),a=n(248),o=n(249);t.default=function(){return[r.default,{statePlugins:{configs:{wrapActions:{loaded:function(e,t){return function(){e.apply(void 0,arguments);var n=decodeURIComponent(window.location.hash);t.layoutActions.parseDeepLinkHash(n)}}}}},wrapComponents:{operation:a.default,OperationTag:o.default}}]}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"show\",(function(){return C})),n.d(t,\"scrollTo\",(function(){return _})),n.d(t,\"parseDeepLinkHash\",(function(){return A})),n.d(t,\"readyToScroll\",(function(){return k})),n.d(t,\"scrollToElement\",(function(){return I})),n.d(t,\"clearScrollTo\",(function(){return P}));var r,a=n(3),o=n.n(a),i=n(13),s=n.n(i),c=n(22),u=n.n(c),l=n(2),p=n.n(l),f=n(19),d=n.n(f),h=n(4),m=n.n(h),v=n(17),g=n.n(v),y=n(138),b=n(406),E=n.n(b),x=n(5),S=n(1),w=n.n(S),j=\"layout_scroll_to\",O=\"layout_clear_scroll\",C=function(e,t){var n=t.getConfigs,r=t.layoutSelectors;return function(){for(var t=arguments.length,a=new Array(t),o=0;o<t;o++)a[o]=arguments[o];if(e.apply(void 0,a),n().deepLinking)try{var i=a[0],c=a[1];i=u()(i)?i:[i];var l=r.urlHashArrayFromIsShownKey(i);if(!l.length)return;var f,d=s()(l,2),h=d[0],m=d[1];if(!c)return Object(y.setHash)(\"/\");if(2===l.length)Object(y.setHash)(Object(x.d)(p()(f=\"/\".concat(encodeURIComponent(h),\"/\")).call(f,encodeURIComponent(m))));else 1===l.length&&Object(y.setHash)(Object(x.d)(\"/\".concat(encodeURIComponent(h))))}catch(e){console.error(e)}}},_=function(e){return{type:j,payload:u()(e)?e:[e]}},A=function(e){return function(t){var n=t.layoutActions,r=t.layoutSelectors;if((0,t.getConfigs)().deepLinking&&e){var a,o=d()(e).call(e,1);\"!\"===o[0]&&(o=d()(o).call(o,1)),\"/\"===o[0]&&(o=d()(o).call(o,1));var i=m()(a=o.split(\"/\")).call(a,(function(e){return e||\"\"})),c=r.isShownKeyFromUrlHashArray(i),u=s()(c,3),l=u[0],p=u[1],f=void 0===p?\"\":p,h=u[2],v=void 0===h?\"\":h;if(\"operations\"===l){var y=r.isShownKeyFromUrlHashArray([f]);g()(f).call(f,\"_\")>-1&&(console.warn(\"Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead.\"),n.show(m()(y).call(y,(function(e){return e.replace(/_/g,\" \")})),!0)),n.show(y,!0)}(g()(f).call(f,\"_\")>-1||g()(v).call(v,\"_\")>-1)&&(console.warn(\"Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead.\"),n.show(m()(c).call(c,(function(e){return e.replace(/_/g,\" \")})),!0)),n.show(c,!0),n.scrollTo(c)}}},k=function(e,t){return function(n){var r=n.layoutSelectors.getScrollToKey();w.a.is(r,Object(S.fromJS)(e))&&(n.layoutActions.scrollToElement(t),n.layoutActions.clearScrollTo())}},I=function(e,t){return function(n){try{t=t||n.fn.getScrollParent(e),E.a.createScroller(t).to(e)}catch(e){console.error(e)}}},P=function(){return{type:O}};t.default={fn:{getScrollParent:function(e,t){var n=document.documentElement,r=getComputedStyle(e),a=\"absolute\"===r.position,o=t?/(auto|scroll|hidden)/:/(auto|scroll)/;if(\"fixed\"===r.position)return n;for(var i=e;i=i.parentElement;)if(r=getComputedStyle(i),(!a||\"static\"!==r.position)&&o.test(r.overflow+r.overflowY+r.overflowX))return i;return n}},statePlugins:{layout:{actions:{scrollToElement:I,scrollTo:_,clearScrollTo:P,readyToScroll:k,parseDeepLinkHash:A},selectors:{getScrollToKey:function(e){return e.get(\"scrollToKey\")},isShownKeyFromUrlHashArray:function(e,t){var n=s()(t,2),r=n[0],a=n[1];return a?[\"operations\",r,a]:r?[\"operations-tag\",r]:[]},urlHashArrayFromIsShownKey:function(e,t){var n=s()(t,3),r=n[0],a=n[1],o=n[2];return\"operations\"==r?[a,o]:\"operations-tag\"==r?[a]:[]}},reducers:(r={},o()(r,j,(function(e,t){return e.set(\"scrollToKey\",w.a.fromJS(t.payload))})),o()(r,O,(function(e){return e.delete(\"scrollToKey\")})),r),wrapActions:{show:C}}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(6),a=n.n(r),o=n(7),i=n.n(o),s=n(10),c=n.n(s),u=n(8),l=n.n(u),p=n(9),f=n.n(p),d=n(3),h=n.n(d),m=n(2),v=n.n(m),g=n(0),y=n.n(g);n(26);t.default=function(e,t){return function(n){l()(o,n);var r=f()(o);function o(){var e,n;a()(this,o);for(var i=arguments.length,s=new Array(i),u=0;u<i;u++)s[u]=arguments[u];return n=r.call.apply(r,v()(e=[this]).call(e,s)),h()(c()(n),\"onLoad\",(function(e){var r=n.props.operation,a=r.toObject(),o=a.tag,i=a.operationId,s=r.toObject().isShownKey;s=s||[\"operations\",o,i],t.layoutActions.readyToScroll(s,e)})),n}return i()(o,[{key:\"render\",value:function(){return y.a.createElement(\"span\",{ref:this.onLoad},y.a.createElement(e,this.props))}}]),o}(y.a.Component)}},function(e,t,n){\"use strict\";n.r(t);var r=n(6),a=n.n(r),o=n(7),i=n.n(o),s=n(10),c=n.n(s),u=n(8),l=n.n(u),p=n(9),f=n.n(p),d=n(3),h=n.n(d),m=n(2),v=n.n(m),g=n(0),y=n.n(g);n(11);t.default=function(e,t){return function(n){l()(o,n);var r=f()(o);function o(){var e,n;a()(this,o);for(var i=arguments.length,s=new Array(i),u=0;u<i;u++)s[u]=arguments[u];return n=r.call.apply(r,v()(e=[this]).call(e,s)),h()(c()(n),\"onLoad\",(function(e){var r=[\"operations-tag\",n.props.tag];t.layoutActions.readyToScroll(r,e)})),n}return i()(o,[{key:\"render\",value:function(){return y.a.createElement(\"span\",{ref:this.onLoad},y.a.createElement(e,this.props))}}]),o}(y.a.Component)}},function(e,t,n){\"use strict\";n.r(t);var r=n(251);t.default=function(){return{fn:{opsFilter:r.default}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(12),a=n.n(r),o=n(17),i=n.n(o);t.default=function(e,t){return a()(e).call(e,(function(e,n){return-1!==i()(n).call(n,t)}))}},function(e,t,n){\"use strict\";n.r(t);var r=n(175),a=n.n(r),o=!1;t.default=function(){return{statePlugins:{spec:{wrapActions:{updateSpec:function(e){return function(){return o=!0,e.apply(void 0,arguments)}},updateJsonSpec:function(e,t){return function(){var n=t.getConfigs().onComplete;return o&&\"function\"==typeof n&&(a()(n,0),o=!1),e.apply(void 0,arguments)}}}}}}}},function(e,t,n){\"use strict\";n.r(t);var r=n(254),a=n(255),o=n(256),i=n(257),s=n(265),c=n(48),u=n(272),l=n(273);t.default=function(){return{components:i.default,wrapComponents:s.default,statePlugins:{spec:{wrapSelectors:r,selectors:o},auth:{wrapSelectors:a},oas3:{actions:c,reducers:l.default,selectors:u}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"definitions\",(function(){return d})),n.d(t,\"hasHost\",(function(){return h})),n.d(t,\"securityDefinitions\",(function(){return m})),n.d(t,\"host\",(function(){return v})),n.d(t,\"basePath\",(function(){return g})),n.d(t,\"consumes\",(function(){return y})),n.d(t,\"produces\",(function(){return b})),n.d(t,\"schemes\",(function(){return E})),n.d(t,\"servers\",(function(){return x})),n.d(t,\"isOAS3\",(function(){return S})),n.d(t,\"isSwagger2\",(function(){return w}));var r=n(16),a=n(77),o=n(1),i=n(32);function s(e){return function(t,n){return function(){var r=n.getSystem().specSelectors.specJson();return Object(i.isOAS3)(r)?e.apply(void 0,arguments):t.apply(void 0,arguments)}}}var c=function(e){return e||Object(o.Map)()},u=s(Object(r.createSelector)((function(){return null}))),l=Object(r.createSelector)(c,(function(e){return e.get(\"json\",Object(o.Map)())})),p=Object(r.createSelector)(c,(function(e){return e.get(\"resolved\",Object(o.Map)())})),f=function(e){var t=p(e);return t.count()<1&&(t=l(e)),t},d=s(Object(r.createSelector)(f,(function(e){var t=e.getIn([\"components\",\"schemas\"]);return o.Map.isMap(t)?t:Object(o.Map)()}))),h=s((function(e){return f(e).hasIn([\"servers\",0])})),m=s(Object(r.createSelector)(a.specJsonWithResolvedSubtrees,(function(e){return e.getIn([\"components\",\"securitySchemes\"])||null}))),v=u,g=u,y=u,b=u,E=u,x=s(Object(r.createSelector)(f,(function(e){return e.getIn([\"servers\"])||Object(o.Map)()}))),S=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return Object(i.isOAS3)(o.Map.isMap(e)?e:Object(o.Map)())}},w=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return Object(i.isSwagger2)(o.Map.isMap(e)?e:Object(o.Map)())}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"definitionsToAuthorize\",(function(){return b}));var r=n(3),a=n.n(r),o=n(13),i=n.n(o),s=n(2),c=n.n(s),u=n(23),l=n.n(u),p=n(12),f=n.n(p),d=n(28),h=n.n(d),m=n(16),v=n(1),g=n(32);var y,b=(y=Object(m.createSelector)((function(e){return e}),(function(e){return e.specSelectors.securityDefinitions()}),(function(e,t){var n,r=Object(v.List)();return t?(l()(n=t.entrySeq()).call(n,(function(e){var t,n=i()(e,2),o=n[0],s=n[1],c=s.get(\"type\");if(\"oauth2\"===c&&l()(t=s.get(\"flows\").entrySeq()).call(t,(function(e){var t=i()(e,2),n=t[0],c=t[1],u=Object(v.fromJS)({flow:n,authorizationUrl:c.get(\"authorizationUrl\"),tokenUrl:c.get(\"tokenUrl\"),scopes:c.get(\"scopes\"),type:s.get(\"type\"),description:s.get(\"description\")});r=r.push(new v.Map(a()({},o,f()(u).call(u,(function(e){return void 0!==e})))))})),\"http\"!==c&&\"apiKey\"!==c||(r=r.push(new v.Map(a()({},o,s)))),\"openIdConnect\"===c&&s.get(\"openIdConnectData\")){var u=s.get(\"openIdConnectData\"),p=u.get(\"grant_types_supported\")||[\"authorization_code\",\"implicit\"];l()(p).call(p,(function(e){var t,n=u.get(\"scopes_supported\")&&h()(t=u.get(\"scopes_supported\")).call(t,(function(e,t){return e.set(t,\"\")}),new v.Map),i=Object(v.fromJS)({flow:e,authorizationUrl:u.get(\"authorization_endpoint\"),tokenUrl:u.get(\"token_endpoint\"),scopes:n,type:\"oauth2\",openIdConnectUrl:s.get(\"openIdConnectUrl\")});r=r.push(new v.Map(a()({},o,f()(i).call(i,(function(e){return void 0!==e})))))}))}})),r):r})),function(e,t){return function(){for(var n=t.getSystem().specSelectors.specJson(),r=arguments.length,a=new Array(r),o=0;o<r;o++)a[o]=arguments[o];if(Object(g.isOAS3)(n)){var i,s=t.getState().getIn([\"spec\",\"resolvedSubtrees\",\"components\",\"securitySchemes\"]);return y.apply(void 0,c()(i=[t,s]).call(i,a))}return e.apply(void 0,a)}})},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"servers\",(function(){return l})),n.d(t,\"isSwagger2\",(function(){return p}));var r=n(16),a=n(1),o=n(32);var i,s=function(e){return e||Object(a.Map)()},c=Object(r.createSelector)(s,(function(e){return e.get(\"json\",Object(a.Map)())})),u=Object(r.createSelector)(s,(function(e){return e.get(\"resolved\",Object(a.Map)())})),l=(i=Object(r.createSelector)((function(e){var t=u(e);return t.count()<1&&(t=c(e)),t}),(function(e){return e.getIn([\"servers\"])||Object(a.Map)()})),function(){return function(e){var t=e.getSystem().specSelectors.specJson();if(Object(o.isOAS3)(t)){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];return i.apply(void 0,r)}return null}}),p=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return Object(o.isSwagger2)(e)}}},function(e,t,n){\"use strict\";n.r(t);var r=n(258),a=n(135),o=n(259),i=n(260),s=n(261),c=n(262),u=n(263),l=n(264);t.default={Callbacks:r.default,HttpAuth:u.default,RequestBody:a.default,Servers:i.default,ServersContainer:s.default,RequestBodyEditor:c.default,OperationServers:l.default,operationLink:o.default}},function(e,t,n){\"use strict\";n.r(t);var r=n(27),a=n.n(r),o=n(13),i=n.n(o),s=n(4),c=n.n(s),u=n(0),l=n.n(u),p=(n(11),n(26),n(1));t.default=function(e){var t,n=e.callbacks,r=e.getComponent,o=e.specPath,s=r(\"OperationContainer\",!0);if(!n)return l.a.createElement(\"span\",null,\"No callbacks\");var u=c()(t=n.entrySeq()).call(t,(function(t){var n,r=i()(t,2),u=r[0],f=r[1];return l.a.createElement(\"div\",{key:u},l.a.createElement(\"h2\",null,u),c()(n=f.entrySeq()).call(n,(function(t){var n,r=i()(t,2),f=r[0],d=r[1];return\"$$ref\"===f?null:l.a.createElement(\"div\",{key:f},c()(n=d.entrySeq()).call(n,(function(t){var n=i()(t,2),r=n[0],c=n[1];if(\"$$ref\"===r)return null;var d=Object(p.fromJS)({operation:c});return l.a.createElement(s,a()({},e,{op:d,key:r,tag:\"\",method:r,path:f,specPath:o.push(u,f,r),allowTryItOut:!1}))})))})))}));return l.a.createElement(\"div\",null,u)}},function(e,t,n){\"use strict\";n.r(t);var r=n(6),a=n.n(r),o=n(7),i=n.n(o),s=n(8),c=n.n(s),u=n(9),l=n.n(u),p=n(30),f=n.n(p),d=n(4),h=n.n(d),m=n(0),v=n.n(m),g=(n(11),n(26),function(e){c()(n,e);var t=l()(n);function n(){return a()(this,n),t.apply(this,arguments)}return i()(n,[{key:\"render\",value:function(){var e=this.props,t=e.link,n=e.name,r=(0,e.getComponent)(\"Markdown\",!0),a=t.get(\"operationId\")||t.get(\"operationRef\"),o=t.get(\"parameters\")&&t.get(\"parameters\").toJS(),i=t.get(\"description\");return v.a.createElement(\"div\",{className:\"operation-link\"},v.a.createElement(\"div\",{className:\"description\"},v.a.createElement(\"b\",null,v.a.createElement(\"code\",null,n)),i?v.a.createElement(r,{source:i}):null),v.a.createElement(\"pre\",null,\"Operation `\",a,\"`\",v.a.createElement(\"br\",null),v.a.createElement(\"br\",null),\"Parameters \",function(e,t){var n;if(\"string\"!=typeof t)return\"\";return h()(n=t.split(\"\\n\")).call(n,(function(t,n){return n>0?Array(e+1).join(\" \")+t:t})).join(\"\\n\")}(0,f()(o,null,2))||\"{}\",v.a.createElement(\"br\",null)))}}]),n}(m.Component));t.default=g},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return C}));var r=n(13),a=n.n(r),o=n(6),i=n.n(o),s=n(7),c=n.n(s),u=n(10),l=n.n(u),p=n(8),f=n.n(p),d=n(9),h=n.n(d),m=n(3),v=n.n(m),g=n(2),y=n.n(g),b=n(55),E=n.n(b),x=n(4),S=n.n(x),w=n(0),j=n.n(w),O=n(1),C=(n(11),n(26),function(e){f()(n,e);var t=h()(n);function n(){var e,r;i()(this,n);for(var a=arguments.length,o=new Array(a),s=0;s<a;s++)o[s]=arguments[s];return r=t.call.apply(t,y()(e=[this]).call(e,o)),v()(l()(r),\"onServerChange\",(function(e){r.setServer(e.target.value)})),v()(l()(r),\"onServerVariableValueChange\",(function(e){var t=r.props,n=t.setServerVariableValue,a=t.currentServer,o=e.target.getAttribute(\"data-variable\"),i=e.target.value;\"function\"==typeof n&&n({server:a,key:o,val:i})})),v()(l()(r),\"setServer\",(function(e){(0,r.props.setSelectedServer)(e)})),r}return c()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.servers;e.currentServer||this.setServer(t.first().get(\"url\"))}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.servers,n=e.setServerVariableValue,r=e.getServerVariable;if(this.props.currentServer!==e.currentServer||this.props.servers!==e.servers){var a=E()(t).call(t,(function(t){return t.get(\"url\")===e.currentServer}));if(!a)return this.setServer(t.first().get(\"url\"));var o=a.get(\"variables\")||Object(O.OrderedMap)();S()(o).call(o,(function(t,a){r(e.currentServer,a)||n({server:e.currentServer,key:a,val:t.get(\"default\")||\"\"})}))}}},{key:\"render\",value:function(){var e,t,n=this,r=this.props,o=r.servers,i=r.currentServer,s=r.getServerVariable,c=r.getEffectiveServerValue,u=(E()(o).call(o,(function(e){return e.get(\"url\")===i}))||Object(O.OrderedMap)()).get(\"variables\")||Object(O.OrderedMap)(),l=0!==u.size;return j.a.createElement(\"div\",{className:\"servers\"},j.a.createElement(\"label\",{htmlFor:\"servers\"},j.a.createElement(\"select\",{onChange:this.onServerChange,value:i},S()(e=o.valueSeq()).call(e,(function(e){return j.a.createElement(\"option\",{value:e.get(\"url\"),key:e.get(\"url\")},e.get(\"url\"),e.get(\"description\")&&\" - \".concat(e.get(\"description\")))})).toArray())),l?j.a.createElement(\"div\",null,j.a.createElement(\"div\",{className:\"computed-url\"},\"Computed URL:\",j.a.createElement(\"code\",null,c(i))),j.a.createElement(\"h4\",null,\"Server variables\"),j.a.createElement(\"table\",null,j.a.createElement(\"tbody\",null,S()(t=u.entrySeq()).call(t,(function(e){var t,r=a()(e,2),o=r[0],c=r[1];return j.a.createElement(\"tr\",{key:o},j.a.createElement(\"td\",null,o),j.a.createElement(\"td\",null,c.get(\"enum\")?j.a.createElement(\"select\",{\"data-variable\":o,onChange:n.onServerVariableValueChange},S()(t=c.get(\"enum\")).call(t,(function(e){return j.a.createElement(\"option\",{selected:e===s(i,o),key:e,value:e},e)}))):j.a.createElement(\"input\",{type:\"text\",value:s(i,o)||\"\",onChange:n.onServerVariableValueChange,\"data-variable\":o})))}))))):null)}}]),n}(j.a.Component))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return d}));var r=n(6),a=n.n(r),o=n(7),i=n.n(o),s=n(8),c=n.n(s),u=n(9),l=n.n(u),p=n(0),f=n.n(p),d=(n(11),function(e){c()(n,e);var t=l()(n);function n(){return a()(this,n),t.apply(this,arguments)}return i()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.oas3Selectors,r=e.oas3Actions,a=e.getComponent,o=t.servers(),i=a(\"Servers\");return o&&o.size?f.a.createElement(\"div\",null,f.a.createElement(\"span\",{className:\"servers-title\"},\"Servers\"),f.a.createElement(i,{servers:o,currentServer:n.selectedServer(),setSelectedServer:r.setSelectedServer,setServerVariableValue:r.setServerVariableValue,getServerVariable:n.serverVariableValue,getEffectiveServerValue:n.serverEffectiveValue})):null}}]),n}(f.a.Component))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return x}));var r=n(6),a=n.n(r),o=n(7),i=n.n(o),s=n(10),c=n.n(s),u=n(8),l=n.n(u),p=n(9),f=n.n(p),d=n(3),h=n.n(d),m=n(0),v=n.n(m),g=(n(11),n(54)),y=n.n(g),b=n(5),E=Function.prototype,x=function(e){l()(n,e);var t=f()(n);function n(e,r){var o;return a()(this,n),o=t.call(this,e,r),h()(c()(o),\"applyDefaultValue\",(function(e){var t=e||o.props,n=t.onChange,r=t.defaultValue;return o.setState({value:r}),n(r)})),h()(c()(o),\"onChange\",(function(e){o.props.onChange(Object(b.I)(e))})),h()(c()(o),\"onDomChange\",(function(e){var t=e.target.value;o.setState({value:t},(function(){return o.onChange(t)}))})),o.state={value:Object(b.I)(e.value)||e.defaultValue},e.onChange(e.value),o}return i()(n,[{key:\"componentWillReceiveProps\",value:function(e){this.props.value!==e.value&&e.value!==this.state.value&&this.setState({value:Object(b.I)(e.value)}),!e.value&&e.defaultValue&&this.state.value&&this.applyDefaultValue(e)}},{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.errors,r=this.state.value,a=n.size>0,o=t(\"TextArea\");return v.a.createElement(\"div\",{className:\"body-param\"},v.a.createElement(o,{className:y()(\"body-param__text\",{invalid:a}),title:n.size?n.join(\", \"):\"\",value:r,onChange:this.onDomChange}))}}]),n}(m.PureComponent);h()(x,\"defaultProps\",{onChange:E,userHasEditedBody:!1})},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return w}));var r=n(6),a=n.n(r),o=n(7),i=n.n(o),s=n(10),c=n.n(s),u=n(8),l=n.n(u),p=n(9),f=n.n(p),d=n(3),h=n.n(d),m=n(20),v=n.n(m),g=n(12),y=n.n(g),b=n(4),E=n.n(b),x=n(0),S=n.n(x),w=(n(11),function(e){l()(n,e);var t=f()(n);function n(e,r){var o;a()(this,n),o=t.call(this,e,r),h()(c()(o),\"onChange\",(function(e){var t=o.props.onChange,n=e.target,r=n.value,a=n.name,i=v()({},o.state.value);a?i[a]=r:i=r,o.setState({value:i},(function(){return t(o.state)}))}));var i=o.props,s=i.name,u=i.schema,l=o.getValue();return o.state={name:s,schema:u,value:l},o}return i()(n,[{key:\"getValue\",value:function(){var e=this.props,t=e.name,n=e.authorized;return n&&n.getIn([t,\"value\"])}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.schema,a=n.getComponent,o=n.errSelectors,i=n.name,s=a(\"Input\"),c=a(\"Row\"),u=a(\"Col\"),l=a(\"authError\"),p=a(\"Markdown\",!0),f=a(\"JumpToPath\",!0),d=(r.get(\"scheme\")||\"\").toLowerCase(),h=this.getValue(),m=y()(e=o.allErrors()).call(e,(function(e){return e.get(\"authId\")===i}));if(\"basic\"===d){var v,g=h?h.get(\"username\"):null;return S.a.createElement(\"div\",null,S.a.createElement(\"h4\",null,S.a.createElement(\"code\",null,i||r.get(\"name\")),\"  (http, Basic)\",S.a.createElement(f,{path:[\"securityDefinitions\",i]})),g&&S.a.createElement(\"h6\",null,\"Authorized\"),S.a.createElement(c,null,S.a.createElement(p,{source:r.get(\"description\")})),S.a.createElement(c,null,S.a.createElement(\"label\",null,\"Username:\"),g?S.a.createElement(\"code\",null,\" \",g,\" \"):S.a.createElement(u,null,S.a.createElement(s,{type:\"text\",required:\"required\",name:\"username\",onChange:this.onChange,autoFocus:!0}))),S.a.createElement(c,null,S.a.createElement(\"label\",null,\"Password:\"),g?S.a.createElement(\"code\",null,\" ****** \"):S.a.createElement(u,null,S.a.createElement(s,{autoComplete:\"new-password\",name:\"password\",type:\"password\",onChange:this.onChange}))),E()(v=m.valueSeq()).call(v,(function(e,t){return S.a.createElement(l,{error:e,key:t})})))}return\"bearer\"===d?S.a.createElement(\"div\",null,S.a.createElement(\"h4\",null,S.a.createElement(\"code\",null,i||r.get(\"name\")),\"  (http, Bearer)\",S.a.createElement(f,{path:[\"securityDefinitions\",i]})),h&&S.a.createElement(\"h6\",null,\"Authorized\"),S.a.createElement(c,null,S.a.createElement(p,{source:r.get(\"description\")})),S.a.createElement(c,null,S.a.createElement(\"label\",null,\"Value:\"),h?S.a.createElement(\"code\",null,\" ****** \"):S.a.createElement(u,null,S.a.createElement(s,{type:\"text\",onChange:this.onChange,autoFocus:!0}))),E()(t=m.valueSeq()).call(t,(function(e,t){return S.a.createElement(l,{error:e,key:t})}))):S.a.createElement(\"div\",null,S.a.createElement(\"em\",null,S.a.createElement(\"b\",null,i),\" HTTP authentication: unsupported scheme \",\"'\".concat(d,\"'\")))}}]),n}(S.a.Component))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return x}));var r=n(24),a=n.n(r),o=n(6),i=n.n(o),s=n(7),c=n.n(s),u=n(10),l=n.n(u),p=n(8),f=n.n(p),d=n(9),h=n.n(d),m=n(3),v=n.n(m),g=n(2),y=n.n(g),b=n(0),E=n.n(b),x=(n(11),n(26),function(e){f()(n,e);var t=h()(n);function n(){var e,r;i()(this,n);for(var o=arguments.length,s=new Array(o),c=0;c<o;c++)s[c]=arguments[c];return r=t.call.apply(t,y()(e=[this]).call(e,s)),v()(l()(r),\"setSelectedServer\",(function(e){var t,n=r.props,a=n.path,o=n.method;return r.forceUpdate(),r.props.setSelectedServer(e,y()(t=\"\".concat(a,\":\")).call(t,o))})),v()(l()(r),\"setServerVariableValue\",(function(e){var t,n=r.props,o=n.path,i=n.method;return r.forceUpdate(),r.props.setServerVariableValue(a()(a()({},e),{},{namespace:y()(t=\"\".concat(o,\":\")).call(t,i)}))})),v()(l()(r),\"getSelectedServer\",(function(){var e,t=r.props,n=t.path,a=t.method;return r.props.getSelectedServer(y()(e=\"\".concat(n,\":\")).call(e,a))})),v()(l()(r),\"getServerVariable\",(function(e,t){var n,a=r.props,o=a.path,i=a.method;return r.props.getServerVariable({namespace:y()(n=\"\".concat(o,\":\")).call(n,i),server:e},t)})),v()(l()(r),\"getEffectiveServerValue\",(function(e){var t,n=r.props,a=n.path,o=n.method;return r.props.getEffectiveServerValue({server:e,namespace:y()(t=\"\".concat(a,\":\")).call(t,o)})})),r}return c()(n,[{key:\"render\",value:function(){var e=this.props,t=e.operationServers,n=e.pathServers,r=e.getComponent;if(!t&&!n)return null;var a=r(\"Servers\"),o=t||n,i=t?\"operation\":\"path\";return E.a.createElement(\"div\",{className:\"opblock-section operation-servers\"},E.a.createElement(\"div\",{className:\"opblock-section-header\"},E.a.createElement(\"div\",{className:\"tab-header\"},E.a.createElement(\"h4\",{className:\"opblock-title\"},\"Servers\"))),E.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},E.a.createElement(\"h4\",{className:\"message\"},\"These \",i,\"-level options override the global server options.\"),E.a.createElement(a,{servers:o,currentServer:this.getSelectedServer(),setSelectedServer:this.setSelectedServer,setServerVariableValue:this.setServerVariableValue,getServerVariable:this.getServerVariable,getEffectiveServerValue:this.getEffectiveServerValue})))}}]),n}(E.a.Component))},function(e,t,n){\"use strict\";n.r(t);var r=n(266),a=n(267),o=n(268),i=n(269),s=n(270),c=n(271);t.default={Markdown:r.default,AuthItem:a.default,JsonSchema_string:c.default,VersionStamp:o.default,model:s.default,onlineValidatorBadge:i.default}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"Markdown\",(function(){return d}));var r=n(84),a=n.n(r),o=n(0),i=n.n(o),s=(n(11),n(54)),c=n.n(s),u=n(178),l=n(32),p=n(179),f=new u.Remarkable(\"commonmark\");f.block.ruler.enable([\"table\"]),f.set({linkTarget:\"_blank\"});var d=function(e){var t=e.source,n=e.className,r=void 0===n?\"\":n,o=e.getConfigs;if(\"string\"!=typeof t)return null;if(t){var s,u=o().useUnsafeMarkdown,l=f.render(t),d=Object(p.b)(l,{useUnsafeMarkdown:u});return\"string\"==typeof d&&(s=a()(d).call(d)),i.a.createElement(\"div\",{dangerouslySetInnerHTML:{__html:s},className:c()(r,\"renderedMarkdown\")})}return null};d.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}},t.default=Object(l.OAS3ComponentWrapFactory)(d)},function(e,t,n){\"use strict\";n.r(t);var r=n(47),a=n.n(r),o=n(0),i=n.n(o),s=n(32),c=[\"Ori\"];t.default=Object(s.OAS3ComponentWrapFactory)((function(e){var t=e.Ori,n=a()(e,c),r=n.schema,o=n.getComponent,s=n.errSelectors,u=n.authorized,l=n.onAuthChange,p=n.name,f=o(\"HttpAuth\");return\"http\"===r.get(\"type\")?i.a.createElement(f,{key:p,schema:r,name:p,errSelectors:s,authorized:u,getComponent:o,onChange:l}):i.a.createElement(t,n)}))},function(e,t,n){\"use strict\";n.r(t);var r=n(0),a=n.n(r),o=n(32);t.default=Object(o.OAS3ComponentWrapFactory)((function(e){var t=e.Ori;return a.a.createElement(\"span\",null,a.a.createElement(t,e),a.a.createElement(\"small\",{className:\"version-stamp\"},a.a.createElement(\"pre\",{className:\"version\"},\"OAS3\")))}))},function(e,t,n){\"use strict\";n.r(t);var r=n(32),a=n(176);t.default=Object(r.OAS3ComponentWrapFactory)(a.a)},function(e,t,n){\"use strict\";n.r(t);var r=n(27),a=n.n(r),o=n(6),i=n.n(o),s=n(7),c=n.n(s),u=n(8),l=n.n(u),p=n(9),f=n.n(p),d=n(0),h=n.n(d),m=(n(11),n(32)),v=n(177),g=function(e){l()(n,e);var t=f()(n);function n(){return i()(this,n),t.apply(this,arguments)}return c()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getConfigs,n=[\"model-box\"],r=null;return!0===e.schema.get(\"deprecated\")&&(n.push(\"deprecated\"),r=h.a.createElement(\"span\",{className:\"model-deprecated-warning\"},\"Deprecated:\")),h.a.createElement(\"div\",{className:n.join(\" \")},r,h.a.createElement(v.a,a()({},this.props,{getConfigs:t,depth:1,expandDepth:this.props.expandDepth||0})))}}]),n}(d.Component);t.default=Object(m.OAS3ComponentWrapFactory)(g)},function(e,t,n){\"use strict\";n.r(t);var r=n(47),a=n.n(r),o=n(0),i=n.n(o),s=n(32),c=[\"Ori\"];t.default=Object(s.OAS3ComponentWrapFactory)((function(e){var t=e.Ori,n=a()(e,c),r=n.schema,o=n.getComponent,s=n.errors,u=n.onChange,l=r&&r.get?r.get(\"format\"):null,p=r&&r.get?r.get(\"type\"):null,f=o(\"Input\");return p&&\"string\"===p&&l&&(\"binary\"===l||\"base64\"===l)?i.a.createElement(f,{type:\"file\",className:s.length?\"invalid\":\"\",title:s.length?s:\"\",onChange:function(e){u(e.target.files[0])},disabled:t.isDisabled}):i.a.createElement(t,n)}))},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"selectedServer\",(function(){return x})),n.d(t,\"requestBodyValue\",(function(){return S})),n.d(t,\"shouldRetainRequestBodyValue\",(function(){return w})),n.d(t,\"hasUserEditedBody\",(function(){return j})),n.d(t,\"requestBodyInclusionSetting\",(function(){return O})),n.d(t,\"requestBodyErrors\",(function(){return C})),n.d(t,\"activeExamplesMember\",(function(){return _})),n.d(t,\"requestContentType\",(function(){return A})),n.d(t,\"responseContentType\",(function(){return k})),n.d(t,\"serverVariableValue\",(function(){return I})),n.d(t,\"serverVariables\",(function(){return P})),n.d(t,\"serverEffectiveValue\",(function(){return T})),n.d(t,\"validateBeforeExecute\",(function(){return R})),n.d(t,\"validateShallowRequired\",(function(){return N}));var r=n(14),a=n.n(r),o=n(2),i=n.n(o),s=n(4),c=n.n(s),u=n(23),l=n.n(u),p=n(15),f=n.n(p),d=n(17),h=n.n(d),m=n(1),v=n(32),g=n(135),y=n(5);function b(e){return function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return function(t){var r=t.getSystem().specSelectors.specJson();return Object(v.isOAS3)(r)?e.apply(void 0,n):null}}}var E,x=b((function(e,t){var n=t?[t,\"selectedServer\"]:[\"selectedServer\"];return e.getIn(n)||\"\"})),S=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"bodyValue\"])||null})),w=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"retainBodyValue\"])||!1})),j=function(e,t,n){return function(e){var r=e.getSystem(),a=r.oas3Selectors,o=r.specSelectors,i=o.specJson();if(Object(v.isOAS3)(i)){var s=!1,c=a.requestContentType(t,n),u=a.requestBodyValue(t,n);if(m.Map.isMap(u)&&(u=Object(y.I)(u.mapEntries((function(e){return m.Map.isMap(e[1])?[e[0],e[1].get(\"value\")]:e})).toJS())),m.List.isList(u)&&(u=Object(y.I)(u)),c){var l=Object(g.getDefaultRequestBodyValue)(o.specResolvedSubtree([\"paths\",t,n,\"requestBody\"]),c,a.activeExamplesMember(t,n,\"requestBody\",\"requestBody\"));s=!!u&&u!==l}return s}return null}},O=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"bodyInclusion\"])||Object(m.Map)()})),C=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"errors\"])||null})),_=b((function(e,t,n,r,a){return e.getIn([\"examples\",t,n,r,a,\"activeExample\"])||null})),A=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"requestContentType\"])||null})),k=b((function(e,t,n){return e.getIn([\"requestData\",t,n,\"responseContentType\"])||null})),I=b((function(e,t,n){var r;if(\"string\"!=typeof t){var a=t.server,o=t.namespace;r=o?[o,\"serverVariableValues\",a,n]:[\"serverVariableValues\",a,n]}else{r=[\"serverVariableValues\",t,n]}return e.getIn(r)||null})),P=b((function(e,t){var n;if(\"string\"!=typeof t){var r=t.server,a=t.namespace;n=a?[a,\"serverVariableValues\",r]:[\"serverVariableValues\",r]}else{n=[\"serverVariableValues\",t]}return e.getIn(n)||Object(m.OrderedMap)()})),T=b((function(e,t){var n,r;if(\"string\"!=typeof t){var a=t.server,o=t.namespace;r=a,n=o?e.getIn([o,\"serverVariableValues\",r]):e.getIn([\"serverVariableValues\",r])}else r=t,n=e.getIn([\"serverVariableValues\",r]);n=n||Object(m.OrderedMap)();var i=r;return c()(n).call(n,(function(e,t){i=i.replace(new RegExp(\"{\".concat(t,\"}\"),\"g\"),e)})),i})),R=(E=function(e,t){return function(e,t){var n;return t=t||[],!!e.getIn(i()(n=[\"requestData\"]).call(n,a()(t),[\"bodyValue\"]))}(e,t)},function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){var n,r,o=e.getSystem().specSelectors.specJson(),s=i()(n=[]).call(n,t)[1]||[];return!o.getIn(i()(r=[\"paths\"]).call(r,a()(s),[\"requestBody\",\"required\"]))||E.apply(void 0,t)}}),N=function(e,t){var n,r=t.oas3RequiredRequestBodyContentType,a=t.oas3RequestContentType,o=t.oas3RequestBodyValue,i=[];if(!m.Map.isMap(o))return i;var s=[];return l()(n=f()(r.requestContentType)).call(n,(function(e){if(e===a){var t=r.requestContentType[e];l()(t).call(t,(function(e){h()(s).call(s,e)<0&&s.push(e)}))}})),l()(s).call(s,(function(e){o.getIn([e,\"value\"])||i.push(e)})),i}},function(e,t,n){\"use strict\";n.r(t);var r,a=n(3),o=n.n(a),i=n(289),s=n.n(i),c=n(13),u=n.n(c),l=n(102),p=n.n(l),f=n(19),d=n.n(f),h=n(23),m=n.n(h),v=n(28),g=n.n(v),y=n(1),b=n(48);t.default=(r={},o()(r,b.UPDATE_SELECTED_SERVER,(function(e,t){var n=t.payload,r=n.selectedServerUrl,a=n.namespace,o=a?[a,\"selectedServer\"]:[\"selectedServer\"];return e.setIn(o,r)})),o()(r,b.UPDATE_REQUEST_BODY_VALUE,(function(e,t){var n=t.payload,r=n.value,a=n.pathMethod,o=u()(a,2),i=o[0],c=o[1];if(!y.Map.isMap(r))return e.setIn([\"requestData\",i,c,\"bodyValue\"],r);var l,f=e.getIn([\"requestData\",i,c,\"bodyValue\"])||Object(y.Map)();y.Map.isMap(f)||(f=Object(y.Map)());var h=p()(r).call(r),v=s()(h),g=d()(v).call(v,0);return m()(g).call(g,(function(e){var t=r.getIn([e]);f.has(e)&&y.Map.isMap(t)||(l=f.setIn([e,\"value\"],t))})),e.setIn([\"requestData\",i,c,\"bodyValue\"],l)})),o()(r,b.UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG,(function(e,t){var n=t.payload,r=n.value,a=n.pathMethod,o=u()(a,2),i=o[0],s=o[1];return e.setIn([\"requestData\",i,s,\"retainBodyValue\"],r)})),o()(r,b.UPDATE_REQUEST_BODY_INCLUSION,(function(e,t){var n=t.payload,r=n.value,a=n.pathMethod,o=n.name,i=u()(a,2),s=i[0],c=i[1];return e.setIn([\"requestData\",s,c,\"bodyInclusion\",o],r)})),o()(r,b.UPDATE_ACTIVE_EXAMPLES_MEMBER,(function(e,t){var n=t.payload,r=n.name,a=n.pathMethod,o=n.contextType,i=n.contextName,s=u()(a,2),c=s[0],l=s[1];return e.setIn([\"examples\",c,l,o,i,\"activeExample\"],r)})),o()(r,b.UPDATE_REQUEST_CONTENT_TYPE,(function(e,t){var n=t.payload,r=n.value,a=n.pathMethod,o=u()(a,2),i=o[0],s=o[1];return e.setIn([\"requestData\",i,s,\"requestContentType\"],r)})),o()(r,b.UPDATE_RESPONSE_CONTENT_TYPE,(function(e,t){var n=t.payload,r=n.value,a=n.path,o=n.method;return e.setIn([\"requestData\",a,o,\"responseContentType\"],r)})),o()(r,b.UPDATE_SERVER_VARIABLE_VALUE,(function(e,t){var n=t.payload,r=n.server,a=n.namespace,o=n.key,i=n.val,s=a?[a,\"serverVariableValues\",r,o]:[\"serverVariableValues\",r,o];return e.setIn(s,i)})),o()(r,b.SET_REQUEST_BODY_VALIDATE_ERROR,(function(e,t){var n=t.payload,r=n.path,a=n.method,o=n.validationErrors,i=[];if(i.push(\"Required field is not provided\"),o.missingBodyValue)return e.setIn([\"requestData\",r,a,\"errors\"],Object(y.fromJS)(i));if(o.missingRequiredKeys&&o.missingRequiredKeys.length>0){var s=o.missingRequiredKeys;return e.updateIn([\"requestData\",r,a,\"bodyValue\"],Object(y.fromJS)({}),(function(e){return g()(s).call(s,(function(e,t){return e.setIn([t,\"errors\"],Object(y.fromJS)(i))}),e)}))}return console.warn(\"unexpected result: SET_REQUEST_BODY_VALIDATE_ERROR\"),e})),o()(r,b.CLEAR_REQUEST_BODY_VALIDATE_ERROR,(function(e,t){var n=t.payload,r=n.path,a=n.method,o=e.getIn([\"requestData\",r,a,\"bodyValue\"]);if(!y.Map.isMap(o))return e.setIn([\"requestData\",r,a,\"errors\"],Object(y.fromJS)([]));var i=p()(o).call(o),c=s()(i),u=d()(c).call(c,0);return u?e.updateIn([\"requestData\",r,a,\"bodyValue\"],Object(y.fromJS)({}),(function(e){return g()(u).call(u,(function(e,t){return e.setIn([t,\"errors\"],Object(y.fromJS)([]))}),e)})):e})),o()(r,b.CLEAR_REQUEST_BODY_VALUE,(function(e,t){var n=t.payload.pathMethod,r=u()(n,2),a=r[0],o=r[1],i=e.getIn([\"requestData\",a,o,\"bodyValue\"]);return i?y.Map.isMap(i)?e.setIn([\"requestData\",a,o,\"bodyValue\"],Object(y.Map)()):e.setIn([\"requestData\",a,o,\"bodyValue\"],\"\"):e})),r)},function(e,t,n){\"use strict\";n.r(t);var r,a=n(23),o=n.n(a),i=n(102),s=n.n(i),c=n(5),u=n(771),l={};o()(r=s()(u).call(u)).call(r,(function(e){if(\"./index.js\"!==e){var t=u(e);l[Object(c.D)(e)]=t.default?t.default:t}})),t.default=l},function(e,t,n){\"use strict\";n.r(t);var r={};n.r(r),n.d(r,\"path\",(function(){return cn})),n.d(r,\"query\",(function(){return un})),n.d(r,\"header\",(function(){return pn})),n.d(r,\"cookie\",(function(){return fn}));var a=n(2),o=n.n(a),i=n(65),s=n.n(i),c=n(35),u=n.n(c),l=n(44),p=n.n(l),f=n(18),d=n.n(f),h=n(13),m=n.n(h),v=n(29),g=n.n(v),y=n(69),b=n.n(y),E=n(169),x=n.n(E),S=n(30),w=n.n(S),j=n(4),O=n.n(j),C=n(15),_=n.n(C),A=n(170),k=n.n(A),I=n(12),P=n.n(I),T=(n(376),n(180)),R=n.n(T),N=n(63),M=n.n(N),q=n(171),D=n.n(q),B=n(101),L=n.n(B),U=n(172),V=n(283),z=n(14),F=n.n(z),J=n(19),W=n.n(J),H=n(172).Buffer,$=function(e){return\":/?#[]@!$&'()*+,;=\".indexOf(e)>-1},Y=function(e){return/^[a-z0-9\\-._~]+$/i.test(e)};function K(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=n.escape,a=arguments.length>2?arguments[2]:void 0;return\"number\"==typeof e&&(e=e.toString()),\"string\"==typeof e&&e.length&&r?a?JSON.parse(e):O()(t=F()(e)).call(t,(function(e){var t,n;return Y(e)||$(e)&&\"unsafe\"===r?e:O()(t=O()(n=H.from(e).toJSON().data||[]).call(n,(function(e){var t;return W()(t=\"0\".concat(e.toString(16).toUpperCase())).call(t,-2)}))).call(t,(function(e){return\"%\".concat(e)})).join(\"\")})).join(\"\"):e}function G(e){var t=e.value;return Array.isArray(t)?function(e){var t=e.key,n=e.value,r=e.style,a=e.explode,i=e.escape,s=function(e){return K(e,{escape:i})};if(\"simple\"===r)return O()(n).call(n,(function(e){return s(e)})).join(\",\");if(\"label\"===r)return\".\".concat(O()(n).call(n,(function(e){return s(e)})).join(\".\"));if(\"matrix\"===r)return O()(n).call(n,(function(e){return s(e)})).reduce((function(e,n){var r,i,s;return!e||a?o()(i=o()(s=\"\".concat(e||\"\",\";\")).call(s,t,\"=\")).call(i,n):o()(r=\"\".concat(e,\",\")).call(r,n)}),\"\");if(\"form\"===r){var c=a?\"&\".concat(t,\"=\"):\",\";return O()(n).call(n,(function(e){return s(e)})).join(c)}if(\"spaceDelimited\"===r){var u=a?\"\".concat(t,\"=\"):\"\";return O()(n).call(n,(function(e){return s(e)})).join(\" \".concat(u))}if(\"pipeDelimited\"===r){var l=a?\"\".concat(t,\"=\"):\"\";return O()(n).call(n,(function(e){return s(e)})).join(\"|\".concat(l))}return}(e):\"object\"===d()(t)?function(e){var t=e.key,n=e.value,r=e.style,a=e.explode,i=e.escape,s=function(e){return K(e,{escape:i})},c=_()(n);if(\"simple\"===r)return c.reduce((function(e,t){var r,i,c,u=s(n[t]),l=a?\"=\":\",\",p=e?\"\".concat(e,\",\"):\"\";return o()(r=o()(i=o()(c=\"\".concat(p)).call(c,t)).call(i,l)).call(r,u)}),\"\");if(\"label\"===r)return c.reduce((function(e,t){var r,i,c,u=s(n[t]),l=a?\"=\":\".\",p=e?\"\".concat(e,\".\"):\".\";return o()(r=o()(i=o()(c=\"\".concat(p)).call(c,t)).call(i,l)).call(r,u)}),\"\");if(\"matrix\"===r&&a)return c.reduce((function(e,t){var r,a,i=s(n[t]),c=e?\"\".concat(e,\";\"):\";\";return o()(r=o()(a=\"\".concat(c)).call(a,t,\"=\")).call(r,i)}),\"\");if(\"matrix\"===r)return c.reduce((function(e,r){var a,i,c=s(n[r]),u=e?\"\".concat(e,\",\"):\";\".concat(t,\"=\");return o()(a=o()(i=\"\".concat(u)).call(i,r,\",\")).call(a,c)}),\"\");if(\"form\"===r)return c.reduce((function(e,t){var r,i,c,u,l=s(n[t]),p=e?o()(r=\"\".concat(e)).call(r,a?\"&\":\",\"):\"\",f=a?\"=\":\",\";return o()(i=o()(c=o()(u=\"\".concat(p)).call(u,t)).call(c,f)).call(i,l)}),\"\");return}(e):function(e){var t,n=e.key,r=e.value,a=e.style,i=e.escape,s=function(e){return K(e,{escape:i})};if(\"simple\"===a)return s(r);if(\"label\"===a)return\".\".concat(s(r));if(\"matrix\"===a)return o()(t=\";\".concat(n,\"=\")).call(t,s(r));if(\"form\"===a)return s(r);if(\"deepObject\"===a)return s(r,{},!0);return}(e)}var Z=function(e,t){t.body=e},X={serializeRes:re,mergeInQueryOrForm:he};function Q(e){return ee.apply(this,arguments)}function ee(){return(ee=s()(u.a.mark((function e(t){var n,r,a,o,i,s=arguments;return u.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=s.length>1&&void 0!==s[1]?s[1]:{},\"object\"===d()(t)&&(t=(n=t).url),n.headers=n.headers||{},X.mergeInQueryOrForm(n),n.headers&&_()(n.headers).forEach((function(e){var t=n.headers[e];\"string\"==typeof t&&(n.headers[e]=t.replace(/\\n+/g,\" \"))})),!n.requestInterceptor){e.next=12;break}return e.next=8,n.requestInterceptor(n);case 8:if(e.t0=e.sent,e.t0){e.next=11;break}e.t0=n;case 11:n=e.t0;case 12:return r=n.headers[\"content-type\"]||n.headers[\"Content-Type\"],/multipart\\/form-data/i.test(r)&&n.body instanceof V.FormData&&(delete n.headers[\"content-type\"],delete n.headers[\"Content-Type\"]),e.prev=14,e.next=17,(n.userFetch||fetch)(n.url,n);case 17:return a=e.sent,e.next=20,X.serializeRes(a,t,n);case 20:if(a=e.sent,!n.responseInterceptor){e.next=28;break}return e.next=24,n.responseInterceptor(a);case 24:if(e.t1=e.sent,e.t1){e.next=27;break}e.t1=a;case 27:a=e.t1;case 28:e.next=39;break;case 30:if(e.prev=30,e.t2=e.catch(14),a){e.next=34;break}throw e.t2;case 34:throw(o=new Error(a.statusText||\"response status is \".concat(a.status))).status=a.status,o.statusCode=a.status,o.responseError=e.t2,o;case 39:if(a.ok){e.next=45;break}throw(i=new Error(a.statusText||\"response status is \".concat(a.status))).status=a.status,i.statusCode=a.status,i.response=a,i;case 45:return e.abrupt(\"return\",a);case 46:case\"end\":return e.stop()}}),e,null,[[14,30]])})))).apply(this,arguments)}var te=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\";return/(json|xml|yaml|text)\\b/.test(e)};function ne(e,t){return t&&(0===t.indexOf(\"application/json\")||t.indexOf(\"+json\")>0)?JSON.parse(e):M.a.load(e)}function re(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.loadSpec,a=void 0!==r&&r,o={ok:e.ok,url:e.url||t,status:e.status,statusText:e.statusText,headers:oe(e.headers)},i=o.headers[\"content-type\"],s=a||te(i),c=s?e.text:e.blob||e.buffer;return c.call(e).then((function(e){if(o.text=e,o.data=e,s)try{var t=ne(e,i);o.body=t,o.obj=t}catch(e){o.parseError=e}return o}))}function ae(e){return g()(e).call(e,\", \")?e.split(\", \"):e}function oe(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return L()(b()(e))?x()(b()(e).call(e)).reduce((function(e,t){var n=m()(t,2),r=n[0],a=n[1];return e[r]=ae(a),e}),{}):{}}function ie(e,t){return t||\"undefined\"==typeof navigator||(t=navigator),t&&\"ReactNative\"===t.product?!(!e||\"object\"!==d()(e)||\"string\"!=typeof e.uri):\"undefined\"!=typeof File&&e instanceof File||(\"undefined\"!=typeof Blob&&e instanceof Blob||(void 0!==U.Buffer&&e instanceof U.Buffer||null!==e&&\"object\"===d()(e)&&\"function\"==typeof e.pipe))}function se(e,t){return Array.isArray(e)&&e.some((function(e){return ie(e,t)}))}var ce={form:\",\",spaceDelimited:\"%20\",pipeDelimited:\"|\"},ue={csv:\",\",ssv:\"%20\",tsv:\"%09\",pipes:\"|\"};function le(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=t.collectionFormat,a=t.allowEmptyValue,o=t.serializationOption,i=t.encoding,s=\"object\"!==d()(t)||Array.isArray(t)?t:t.value,c=n?function(e){return e.toString()}:function(e){return encodeURIComponent(e)},u=c(e);if(void 0===s&&a)return[[u,\"\"]];if(ie(s)||se(s))return[[u,s]];if(o)return pe(e,s,n,o);if(i){if([d()(i.style),d()(i.explode),d()(i.allowReserved)].some((function(e){return\"undefined\"!==e})))return pe(e,s,n,D()(i,[\"style\",\"explode\",\"allowReserved\"]));if(i.contentType){if(\"application/json\"===i.contentType){var l=\"string\"==typeof s?s:w()(s);return[[u,c(l)]]}return[[u,c(s.toString())]]}return\"object\"!==d()(s)?[[u,c(s)]]:Array.isArray(s)&&s.every((function(e){return\"object\"!==d()(e)}))?[[u,O()(s).call(s,c).join(\",\")]]:[[u,c(w()(s))]]}return\"object\"!==d()(s)?[[u,c(s)]]:Array.isArray(s)?\"multi\"===r?[[u,O()(s).call(s,c)]]:[[u,O()(s).call(s,c).join(ue[r||\"csv\"])]]:[[u,\"\"]]}function pe(e,t,n,r){var a,i,s,c=r.style||\"form\",u=void 0===r.explode?\"form\"===c:r.explode,l=!n&&(r&&r.allowReserved?\"unsafe\":\"reserved\"),p=function(e){return K(e,{escape:l})},f=n?function(e){return e}:function(e){return K(e,{escape:l})};return\"object\"!==d()(t)?[[f(e),p(t)]]:Array.isArray(t)?u?[[f(e),O()(t).call(t,p)]]:[[f(e),O()(t).call(t,p).join(ce[c])]]:\"deepObject\"===c?O()(i=_()(t)).call(i,(function(n){var r;return[f(o()(r=\"\".concat(e,\"[\")).call(r,n,\"]\")),p(t[n])]})):u?O()(s=_()(t)).call(s,(function(e){return[f(e),p(t[e])]})):[[f(e),O()(a=_()(t)).call(a,(function(e){var n;return[o()(n=\"\".concat(f(e),\",\")).call(n,p(t[e]))]})).join(\",\")]]}function fe(e){return k()(e).reduce((function(e,t){var n,r=m()(t,2),a=r[0],o=r[1],i=p()(le(a,o,!0));try{for(i.s();!(n=i.n()).done;){var s=m()(n.value,2),c=s[0],u=s[1];if(Array.isArray(u)){var l,f=p()(u);try{for(f.s();!(l=f.n()).done;){var d=l.value;e.append(c,d)}}catch(e){f.e(e)}finally{f.f()}}else e.append(c,u)}}catch(e){i.e(e)}finally{i.f()}return e}),new V.FormData)}function de(e){var t=_()(e).reduce((function(t,n){var r,a=p()(le(n,e[n]));try{for(a.s();!(r=a.n()).done;){var o=m()(r.value,2),i=o[0],s=o[1];t[i]=s}}catch(e){a.e(e)}finally{a.f()}return t}),{});return R.a.stringify(t,{encode:!1,indices:!1})||\"\"}function he(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,n=void 0===t?\"\":t,r=e.query,a=e.form,o=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=P()(t).call(t,(function(e){return e})).join(\"&\");return r?\"?\".concat(r):\"\"};if(a){var i=_()(a).some((function(e){var t=a[e].value;return ie(t)||se(t)})),s=e.headers[\"content-type\"]||e.headers[\"Content-Type\"];if(i||/multipart\\/form-data/i.test(s)){var c=fe(e.form);Z(c,e)}else e.body=de(a);delete e.form}if(r){var u=n.split(\"?\"),l=m()(u,2),p=l[0],f=l[1],d=\"\";if(f){var h=R.a.parse(f),v=_()(r);v.forEach((function(e){return delete h[e]})),d=R.a.stringify(h,{encode:!0})}var g=o(d,de(r));e.url=p+g,delete e.query}return e}var me=n(24),ve=n.n(me),ge=n(6),ye=n.n(ge),be=n(7),Ee=n.n(be),xe=n(20),Se=n.n(xe),we=n(56),je=n.n(we),Oe=n(401),Ce=n.n(Oe),_e=n(165),Ae=n.n(_e),ke=n(284),Ie=n.n(ke),Pe=n(3),Te=n.n(Pe),Re=n(119),Ne=n(68),Me=n.n(Ne),qe=n(402),De=n.n(qe),Be={add:function(e,t){return{op:\"add\",path:e,value:t}},replace:Ue,remove:function(e){return{op:\"remove\",path:e}},merge:function(e,t){return{type:\"mutation\",op:\"merge\",path:e,value:t}},mergeDeep:function(e,t){return{type:\"mutation\",op:\"mergeDeep\",path:e,value:t}},context:function(e,t){return{type:\"context\",path:e,value:t}},getIn:function(e,t){return t.reduce((function(e,t){return void 0!==t&&e?e[t]:e}),e)},applyPatch:function(e,t,n){if(n=n||{},\"merge\"===(t=ve()(ve()({},t),{},{path:t.path&&Le(t.path)})).op){var r=Qe(e,t.path);Se()(r,t.value),Re.applyPatch(e,[Ue(t.path,r)])}else if(\"mergeDeep\"===t.op){var a=Qe(e,t.path);for(var i in t.value){var s=t.value[i],c=Array.isArray(s);if(c){var u=a[i]||[];a[i]=o()(u).call(u,s)}else if($e(s)&&!c){var l=ve()({},a[i]);for(var p in s){if(Object.prototype.hasOwnProperty.call(l,p)){l=Me()(De()(l),s);break}Se()(l,Te()({},p,s[p]))}a[i]=l}else a[i]=s}}else if(\"add\"===t.op&&\"\"===t.path&&$e(t.value)){var f=_()(t.value).reduce((function(e,n){return e.push({op:\"add\",path:\"/\".concat(Le(n)),value:t.value[n]}),e}),[]);Re.applyPatch(e,f)}else if(\"replace\"===t.op&&\"\"===t.path){var d=t.value;n.allowMetaPatches&&t.meta&&Ze(t)&&(Array.isArray(t.value)||$e(t.value))&&(d=ve()(ve()({},d),t.meta)),e=d}else if(Re.applyPatch(e,[t]),n.allowMetaPatches&&t.meta&&Ze(t)&&(Array.isArray(t.value)||$e(t.value))){var h=Qe(e,t.path),m=ve()(ve()({},h),t.meta);Re.applyPatch(e,[Ue(t.path,m)])}return e},parentPathMatch:function(e,t){if(!Array.isArray(t))return!1;for(var n=0,r=t.length;n<r;n+=1)if(t[n]!==e[n])return!1;return!0},flatten:We,fullyNormalizeArray:function(e){return He(We(Je(e)))},normalizeArray:Je,isPromise:function(e){return $e(e)&&Ye(e.then)},forEachNew:function(e,t){try{return Ve(e,Fe,t)}catch(e){return e}},forEachNewPrimitive:function(e,t){try{return Ve(e,ze,t)}catch(e){return e}},isJsonPatch:Ke,isContextPatch:function(e){return Xe(e)&&\"context\"===e.type},isPatch:Xe,isMutation:Ge,isAdditiveMutation:Ze,isGenerator:function(e){return\"[object GeneratorFunction]\"===Object.prototype.toString.call(e)},isFunction:Ye,isObject:$e,isError:function(e){return e instanceof Error}};function Le(e){return Array.isArray(e)?e.length<1?\"\":\"/\".concat(O()(e).call(e,(function(e){return(e+\"\").replace(/~/g,\"~0\").replace(/\\//g,\"~1\")})).join(\"/\")):e}function Ue(e,t,n){return{op:\"replace\",path:e,value:t,meta:n}}function Ve(e,t,n){var r;return He(We(O()(r=P()(e).call(e,Ze)).call(r,(function(e){return t(e.value,n,e.path)}))||[]))}function ze(e,t,n){return n=n||[],Array.isArray(e)?O()(e).call(e,(function(e,r){return ze(e,t,o()(n).call(n,r))})):$e(e)?O()(r=_()(e)).call(r,(function(r){return ze(e[r],t,o()(n).call(n,r))})):t(e,n[n.length-1],n);var r}function Fe(e,t,n){var r=[];if((n=n||[]).length>0){var a=t(e,n[n.length-1],n);a&&(r=o()(r).call(r,a))}if(Array.isArray(e)){var i=O()(e).call(e,(function(e,r){return Fe(e,t,o()(n).call(n,r))}));i&&(r=o()(r).call(r,i))}else if($e(e)){var s,c=O()(s=_()(e)).call(s,(function(r){return Fe(e[r],t,o()(n).call(n,r))}));c&&(r=o()(r).call(r,c))}return r=We(r)}function Je(e){return Array.isArray(e)?e:[e]}function We(e){var t;return o()(t=[]).apply(t,F()(O()(e).call(e,(function(e){return Array.isArray(e)?We(e):e}))))}function He(e){return P()(e).call(e,(function(e){return void 0!==e}))}function $e(e){return e&&\"object\"===d()(e)}function Ye(e){return e&&\"function\"==typeof e}function Ke(e){if(Xe(e)){var t=e.op;return\"add\"===t||\"remove\"===t||\"replace\"===t}return!1}function Ge(e){return Ke(e)||Xe(e)&&\"mutation\"===e.type}function Ze(e){return Ge(e)&&(\"add\"===e.op||\"replace\"===e.op||\"merge\"===e.op||\"mergeDeep\"===e.op)}function Xe(e){return e&&\"object\"===d()(e)}function Qe(e,t){try{return Re.getValueByPointer(e,t)}catch(e){return console.error(e),{}}}var et=n(403),tt=n.n(et),nt=n(285),rt=n.n(nt),at=n(70),ot=n.n(at);function it(e,t){function n(){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack;for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];this.message=n[0],t&&t.apply(this,n)}return n.prototype=new Error,n.prototype.name=e,n.prototype.constructor=n,n}var st=n(404),ct=n.n(st),ut=n(168),lt=n.n(ut),pt=[\"properties\"],ft=[\"properties\"],dt=[\"definitions\",\"parameters\",\"responses\",\"securityDefinitions\",\"components/schemas\",\"components/responses\",\"components/parameters\",\"components/securitySchemes\"],ht=[\"schema/example\",\"items/example\"];function mt(e){var t=e[e.length-1],n=e[e.length-2],r=e.join(\"/\");return pt.indexOf(t)>-1&&-1===ft.indexOf(n)||dt.indexOf(r)>-1||ht.some((function(e){return r.indexOf(e)>-1}))}function vt(e,t){var n,r=e.split(\"#\"),a=m()(r,2),i=a[0],s=a[1],c=ot.a.resolve(i||\"\",t||\"\");return s?o()(n=\"\".concat(c,\"#\")).call(n,s):c}var gt=\"application/json, application/yaml\",yt=new RegExp(\"^([a-z]+://|//)\",\"i\"),bt=it(\"JSONRefError\",(function(e,t,n){this.originalError=n,Se()(this,t||{})})),Et={},xt=new tt.a,St=[function(e){return\"paths\"===e[0]&&\"responses\"===e[3]&&\"examples\"===e[5]},function(e){return\"paths\"===e[0]&&\"responses\"===e[3]&&\"content\"===e[5]&&\"example\"===e[7]},function(e){return\"paths\"===e[0]&&\"responses\"===e[3]&&\"content\"===e[5]&&\"examples\"===e[7]&&\"value\"===e[9]},function(e){return\"paths\"===e[0]&&\"requestBody\"===e[3]&&\"content\"===e[4]&&\"example\"===e[6]},function(e){return\"paths\"===e[0]&&\"requestBody\"===e[3]&&\"content\"===e[4]&&\"examples\"===e[6]&&\"value\"===e[8]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"example\"===e[4]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"example\"===e[5]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"examples\"===e[4]&&\"value\"===e[6]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"examples\"===e[5]&&\"value\"===e[7]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"content\"===e[4]&&\"example\"===e[6]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[2]&&\"content\"===e[4]&&\"examples\"===e[6]&&\"value\"===e[8]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"content\"===e[4]&&\"example\"===e[7]},function(e){return\"paths\"===e[0]&&\"parameters\"===e[3]&&\"content\"===e[5]&&\"examples\"===e[7]&&\"value\"===e[9]}],wt={key:\"$ref\",plugin:function(e,t,n,r){var a=r.getInstance(),i=W()(n).call(n,0,-1);if(!mt(i)&&(s=i,!St.some((function(e){return e(s)})))){var s,c=r.getContext(n).baseDoc;if(\"string\"!=typeof e)return new bt(\"$ref: must be a string (JSON-Ref)\",{$ref:e,baseDoc:c,fullPath:n});var u,l,p,f=At(e),d=f[0],h=f[1]||\"\";try{u=c||d?Ct(d,c):null}catch(t){return _t(t,{pointer:h,$ref:e,basePath:u,fullPath:n})}if(function(e,t,n,r){var a,i,s=xt.get(r);s||(s={},xt.set(r,s));var c=function(e){if(0===e.length)return\"\";return\"/\".concat(O()(e).call(e,Nt).join(\"/\"))}(n),u=o()(a=\"\".concat(t||\"<specmap-base>\",\"#\")).call(a,e),l=c.replace(/allOf\\/\\d+\\/?/g,\"\"),p=r.contextTree.get([]).baseDoc;if(t===p&&Mt(l,e))return!0;var f=\"\";if(n.some((function(e){var t;return f=o()(t=\"\".concat(f,\"/\")).call(t,Nt(e)),s[f]&&s[f].some((function(e){return Mt(e,u)||Mt(u,e)}))})))return!0;return void(s[l]=o()(i=s[l]||[]).call(i,u))}(h,u,i,r)&&!a.useCircularStructures){var m=vt(e,u);return e===m?null:Be.replace(n,m)}if(null==u?(p=Tt(h),void 0===(l=r.get(p))&&(l=new bt(\"Could not resolve reference: \".concat(e),{pointer:h,$ref:e,baseDoc:c,fullPath:n}))):l=null!=(l=kt(u,h)).__value?l.__value:l.catch((function(t){throw _t(t,{pointer:h,$ref:e,baseDoc:c,fullPath:n})})),l instanceof Error)return[Be.remove(n),l];var v=vt(e,u),g=Be.replace(i,l,{$$ref:v});if(u&&u!==c)return[g,Be.context(i,{baseDoc:u})];try{if(!function(e,t){var n=[e];return t.path.reduce((function(e,t){return n.push(e[t]),e[t]}),e),r(t.value);function r(e){return Be.isObject(e)&&(n.indexOf(e)>=0||_()(e).some((function(t){return r(e[t])})))}}(r.state,g)||a.useCircularStructures)return g}catch(e){return null}}}},jt=Se()(wt,{docCache:Et,absoluteify:Ct,clearCache:function(e){void 0!==e?delete Et[e]:_()(Et).forEach((function(e){delete Et[e]}))},JSONRefError:bt,wrapError:_t,getDoc:It,split:At,extractFromDoc:kt,fetchJSON:function(e){return fetch(e,{headers:{Accept:gt},loadSpec:!0}).then((function(e){return e.text()})).then((function(e){return M.a.load(e)}))},extract:Pt,jsonPointerToArray:Tt,unescapeJsonPointerToken:Rt}),Ot=jt;function Ct(e,t){if(!yt.test(e)){var n;if(!t)throw new bt(o()(n=\"Tried to resolve a relative URL, without having a basePath. path: '\".concat(e,\"' basePath: '\")).call(n,t,\"'\"));return ot.a.resolve(t,e)}return e}function _t(e,t){var n,r;e&&e.response&&e.response.body?n=o()(r=\"\".concat(e.response.body.code,\" \")).call(r,e.response.body.message):n=e.message;return new bt(\"Could not resolve reference: \".concat(n),t,e)}function At(e){return(e+\"\").split(\"#\")}function kt(e,t){var n=Et[e];if(n&&!Be.isPromise(n))try{var r=Pt(t,n);return Se()(je.a.resolve(r),{__value:r})}catch(e){return je.a.reject(e)}return It(e).then((function(e){return Pt(t,e)}))}function It(e){var t=Et[e];return t?Be.isPromise(t)?t:je.a.resolve(t):(Et[e]=jt.fetchJSON(e).then((function(t){return Et[e]=t,t})),Et[e])}function Pt(e,t){var n=Tt(e);if(n.length<1)return t;var r=Be.getIn(t,n);if(void 0===r)throw new bt(\"Could not resolve pointer: \".concat(e,\" does not exist in document\"),{pointer:e});return r}function Tt(e){var t;if(\"string\"!=typeof e)throw new TypeError(\"Expected a string, got a \".concat(d()(e)));return\"/\"===e[0]&&(e=e.substr(1)),\"\"===e?[]:O()(t=e.split(\"/\")).call(t,Rt)}function Rt(e){return\"string\"!=typeof e?e:rt.a.unescape(e.replace(/~1/g,\"/\").replace(/~0/g,\"~\"))}function Nt(e){return rt.a.escape(e.replace(/~/g,\"~0\").replace(/\\//g,\"~1\"))}function Mt(e,t){if(!(n=t)||\"/\"===n||\"#\"===n)return!0;var n,r=e.charAt(t.length),a=W()(t).call(t,-1);return 0===e.indexOf(t)&&(!r||\"/\"===r||\"#\"===r)&&\"#\"!==a}var qt=n(87),Dt=n.n(qt),Bt={key:\"allOf\",plugin:function(e,t,n,r,a){if(!a.meta||!a.meta.$$ref){var i=W()(n).call(n,0,-1);if(!mt(i)){if(!Array.isArray(e)){var s=new TypeError(\"allOf must be an array\");return s.fullPath=n,s}var c=!1,u=a.value;if(i.forEach((function(e){u&&(u=u[e])})),u=ve()({},u),!Dt()(u)){delete u.allOf;var l,p=[];if(p.push(r.replace(i,{})),e.forEach((function(e,t){if(!r.isObject(e)){if(c)return null;c=!0;var a=new TypeError(\"Elements in allOf must be objects\");return a.fullPath=n,p.push(a)}p.push(r.mergeDeep(i,e));var s=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.specmap,a=n.getBaseUrlForNodePath,i=void 0===a?function(e){var n;return r.getContext(o()(n=[]).call(n,F()(t),F()(e))).baseDoc}:a,s=n.targetKeys,c=void 0===s?[\"$ref\",\"$$ref\"]:s,u=[];return ct()(e).forEach((function(){if(g()(c).call(c,this.key)&&lt()(this.node)){var e=this.path,n=o()(t).call(t,this.path),a=vt(this.node,i(e));u.push(r.replace(n,a))}})),u}(e,W()(n).call(n,0,-1),{getBaseUrlForNodePath:function(e){var a;return r.getContext(o()(a=[]).call(a,F()(n),[t],F()(e))).baseDoc},specmap:r});p.push.apply(p,F()(s))})),p.push(r.mergeDeep(i,u)),!u.$$ref)p.push(r.remove(o()(l=[]).call(l,i,\"$$ref\")));return p}}}}},Lt={key:\"parameters\",plugin:function(e,t,n,r){if(Array.isArray(e)&&e.length){var a=Se()([],e),o=W()(n).call(n,0,-1),i=ve()({},Be.getIn(r.spec,o));return e.forEach((function(e,t){try{a[t].default=r.parameterMacro(i,e)}catch(e){var o=new Error(e);return o.fullPath=n,o}})),Be.replace(n,a)}return Be.replace(n,e)}},Ut={key:\"properties\",plugin:function(e,t,n,r){var a=ve()({},e);for(var o in e)try{a[o].default=r.modelPropertyMacro(a[o])}catch(e){var i=new Error(e);return i.fullPath=n,i}return Be.replace(n,a)}},Vt=function(){function e(t){ye()(this,e),this.root=zt(t||{})}return Ee()(e,[{key:\"set\",value:function(e,t){var n=this.getParent(e,!0);if(n){var r=e[e.length-1],a=n.children;a[r]?Ft(a[r],t,n):a[r]=zt(t,n)}else Ft(this.root,t,null)}},{key:\"get\",value:function(e){if((e=e||[]).length<1)return this.root.value;for(var t,n,r=this.root,a=0;a<e.length&&(n=e[a],(t=r.children)[n]);a+=1)r=t[n];return r&&r.protoValue}},{key:\"getParent\",value:function(e,t){return!e||e.length<1?null:e.length<2?this.root:W()(e).call(e,0,-1).reduce((function(e,n){if(!e)return e;var r=e.children;return!r[n]&&t&&(r[n]=zt(null,e)),r[n]}),this.root)}}]),e}();function zt(e,t){return Ft({children:{}},e,t)}function Ft(e,t,n){return e.value=t||{},e.protoValue=n?ve()(ve()({},n.protoValue),e.value):e.value,_()(e.children).forEach((function(t){var n=e.children[t];e.children[t]=Ft(n,n.value,e)})),e}var Jt=function(){function e(t){var n,r,a=this;ye()(this,e),Se()(this,{spec:\"\",debugLevel:\"info\",plugins:[],pluginHistory:{},errors:[],mutations:[],promisedPatches:[],state:{},patches:[],context:{},contextTree:new Vt,showDebug:!1,allPatches:[],pluginProp:\"specMap\",libMethods:Se()(Object.create(this),Be,{getInstance:function(){return a}}),allowMetaPatches:!1},t),this.get=this._get.bind(this),this.getContext=this._getContext.bind(this),this.hasRun=this._hasRun.bind(this),this.wrappedPlugins=P()(n=O()(r=this.plugins).call(r,this.wrapPlugin.bind(this))).call(n,Be.isFunction),this.patches.push(Be.add([],this.spec)),this.patches.push(Be.context([],this.context)),this.updatePatches(this.patches)}return Ee()(e,[{key:\"debug\",value:function(e){if(this.debugLevel===e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];(t=console).log.apply(t,r)}}},{key:\"verbose\",value:function(e){if(\"verbose\"===this.debugLevel){for(var t,n,r=arguments.length,a=new Array(r>1?r-1:0),i=1;i<r;i++)a[i-1]=arguments[i];(t=console).log.apply(t,o()(n=[\"[\".concat(e,\"]   \")]).call(n,a))}}},{key:\"wrapPlugin\",value:function(e,t){var n,r,a,i=this.pathDiscriminator,s=null;return e[this.pluginProp]?(s=e,n=e[this.pluginProp]):Be.isFunction(e)?n=e:Be.isObject(e)&&(r=e,a=function(e,t){return!Array.isArray(e)||e.every((function(e,n){return e===t[n]}))},n=u.a.mark((function e(t,n){var s,c,l,f,d,h;return u.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:h=function(e,t,l){var p,f,d,m,v,g,y,b,E,x,S,w,j;return u.a.wrap((function(s){for(;;)switch(s.prev=s.next){case 0:if(Be.isObject(e)){s.next=6;break}if(r.key!==t[t.length-1]){s.next=4;break}return s.next=4,r.plugin(e,r.key,t,n);case 4:s.next=30;break;case 6:p=t.length-1,f=t[p],d=t.indexOf(\"properties\"),m=\"properties\"===f&&p===d,v=n.allowMetaPatches&&c[e.$$ref],g=0,y=_()(e);case 12:if(!(g<y.length)){s.next=30;break}if(b=y[g],E=e[b],x=o()(t).call(t,b),S=Be.isObject(E),w=e.$$ref,v){s.next=22;break}if(!S){s.next=22;break}return n.allowMetaPatches&&w&&(c[w]=!0),s.delegateYield(h(E,x,l),\"t0\",22);case 22:if(m||b!==r.key){s.next=27;break}if(j=a(i,t),i&&!j){s.next=27;break}return s.next=27,r.plugin(E,b,x,n,l);case 27:g++,s.next=12;break;case 30:case\"end\":return s.stop()}}),s)},s=u.a.mark(h),c={},l=p()(P()(t).call(t,Be.isAdditiveMutation)),e.prev=4,l.s();case 6:if((f=l.n()).done){e.next=11;break}return d=f.value,e.delegateYield(h(d.value,d.path,d),\"t0\",9);case 9:e.next=6;break;case 11:e.next=16;break;case 13:e.prev=13,e.t1=e.catch(4),l.e(e.t1);case 16:return e.prev=16,l.f(),e.finish(16);case 19:case\"end\":return e.stop()}}),e,null,[[4,13,16,19]])}))),Se()(n.bind(s),{pluginName:e.name||t,isGenerator:Be.isGenerator(n)})}},{key:\"nextPlugin\",value:function(){var e=this;return Ae()(this.wrappedPlugins,(function(t){return e.getMutationsForPlugin(t).length>0}))}},{key:\"nextPromisedPatch\",value:function(){var e;if(this.promisedPatches.length>0)return je.a.race(O()(e=this.promisedPatches).call(e,(function(e){return e.value})))}},{key:\"getPluginHistory\",value:function(e){var t=this.constructor.getPluginName(e);return this.pluginHistory[t]||[]}},{key:\"getPluginRunCount\",value:function(e){return this.getPluginHistory(e).length}},{key:\"getPluginHistoryTip\",value:function(e){var t=this.getPluginHistory(e);return t&&t[t.length-1]||{}}},{key:\"getPluginMutationIndex\",value:function(e){var t=this.getPluginHistoryTip(e).mutationIndex;return\"number\"!=typeof t?-1:t}},{key:\"updatePluginHistory\",value:function(e,t){var n=this.constructor.getPluginName(e);this.pluginHistory[n]=this.pluginHistory[n]||[],this.pluginHistory[n].push(t)}},{key:\"updatePatches\",value:function(e){var t=this;Be.normalizeArray(e).forEach((function(e){if(e instanceof Error)t.errors.push(e);else try{if(!Be.isObject(e))return void t.debug(\"updatePatches\",\"Got a non-object patch\",e);if(t.showDebug&&t.allPatches.push(e),Be.isPromise(e.value))return t.promisedPatches.push(e),void t.promisedPatchThen(e);if(Be.isContextPatch(e))return void t.setContext(e.path,e.value);if(Be.isMutation(e))return void t.updateMutations(e)}catch(e){console.error(e),t.errors.push(e)}}))}},{key:\"updateMutations\",value:function(e){\"object\"===d()(e.value)&&!Array.isArray(e.value)&&this.allowMetaPatches&&(e.value=ve()({},e.value));var t=Be.applyPatch(this.state,e,{allowMetaPatches:this.allowMetaPatches});t&&(this.mutations.push(e),this.state=t)}},{key:\"removePromisedPatch\",value:function(e){var t,n=this.promisedPatches.indexOf(e);n<0?this.debug(\"Tried to remove a promisedPatch that isn't there!\"):Ce()(t=this.promisedPatches).call(t,n,1)}},{key:\"promisedPatchThen\",value:function(e){var t=this;return e.value=e.value.then((function(n){var r=ve()(ve()({},e),{},{value:n});t.removePromisedPatch(e),t.updatePatches(r)})).catch((function(n){t.removePromisedPatch(e),t.updatePatches(n)})),e.value}},{key:\"getMutations\",value:function(e,t){var n;return e=e||0,\"number\"!=typeof t&&(t=this.mutations.length),W()(n=this.mutations).call(n,e,t)}},{key:\"getCurrentMutations\",value:function(){return this.getMutationsForPlugin(this.getCurrentPlugin())}},{key:\"getMutationsForPlugin\",value:function(e){var t=this.getPluginMutationIndex(e);return this.getMutations(t+1)}},{key:\"getCurrentPlugin\",value:function(){return this.currentPlugin}},{key:\"getLib\",value:function(){return this.libMethods}},{key:\"_get\",value:function(e){return Be.getIn(this.state,e)}},{key:\"_getContext\",value:function(e){return this.contextTree.get(e)}},{key:\"setContext\",value:function(e,t){return this.contextTree.set(e,t)}},{key:\"_hasRun\",value:function(e){return this.getPluginRunCount(this.getCurrentPlugin())>(e||0)}},{key:\"dispatch\",value:function(){var e,t=this,n=this,r=this.nextPlugin();if(!r){var a=this.nextPromisedPatch();if(a)return a.then((function(){return t.dispatch()})).catch((function(){return t.dispatch()}));var i={spec:this.state,errors:this.errors};return this.showDebug&&(i.patches=this.allPatches),je.a.resolve(i)}if(n.pluginCount=n.pluginCount||{},n.pluginCount[r]=(n.pluginCount[r]||0)+1,n.pluginCount[r]>100)return je.a.resolve({spec:n.state,errors:o()(e=n.errors).call(e,new Error(\"We've reached a hard limit of \".concat(100,\" plugin runs\")))});if(r!==this.currentPlugin&&this.promisedPatches.length){var s,c=O()(s=this.promisedPatches).call(s,(function(e){return e.value}));return je.a.all(O()(c).call(c,(function(e){return e.then(Ie.a,Ie.a)}))).then((function(){return t.dispatch()}))}return function(){n.currentPlugin=r;var e=n.getCurrentMutations(),t=n.mutations.length-1;try{if(r.isGenerator){var a,o=p()(r(e,n.getLib()));try{for(o.s();!(a=o.n()).done;){u(a.value)}}catch(e){o.e(e)}finally{o.f()}}else{u(r(e,n.getLib()))}}catch(e){console.error(e),u([Se()(Object.create(e),{plugin:r})])}finally{n.updatePluginHistory(r,{mutationIndex:t})}return n.dispatch()}();function u(e){e&&(e=Be.fullyNormalizeArray(e),n.updatePatches(e,r))}}}],[{key:\"getPluginName\",value:function(e){return e.pluginName}},{key:\"getPatchesOfType\",value:function(e,t){return P()(e).call(e,t)}}]),e}();var Wt={refs:Ot,allOf:Bt,parameters:Lt,properties:Ut},Ht=n(51);function $t(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.requestInterceptor,r=t.responseInterceptor,a=e.withCredentials?\"include\":\"same-origin\";return function(t){return e({url:t,loadSpec:!0,requestInterceptor:n,responseInterceptor:r,headers:{Accept:gt},credentials:a}).then((function(e){return e.body}))}}function Yt(e){var t=e.fetch,n=e.spec,r=e.url,a=e.mode,o=e.allowMetaPatches,i=void 0===o||o,c=e.pathDiscriminator,l=e.modelPropertyMacro,p=e.parameterMacro,f=e.requestInterceptor,d=e.responseInterceptor,h=e.skipNormalization,m=e.useCircularStructures,v=e.http,g=e.baseDoc;return g=g||r,v=t||v||Q,n?y(n):$t(v,{requestInterceptor:f,responseInterceptor:d})(g).then(y);function y(e){g&&(Wt.refs.docCache[g]=e),Wt.refs.fetchJSON=$t(v,{requestInterceptor:f,responseInterceptor:d});var t,n=[Wt.refs];return\"function\"==typeof p&&n.push(Wt.parameters),\"function\"==typeof l&&n.push(Wt.properties),\"strict\"!==a&&n.push(Wt.allOf),(t={spec:e,context:{baseDoc:g},plugins:n,allowMetaPatches:i,pathDiscriminator:c,parameterMacro:p,modelPropertyMacro:l,useCircularStructures:m},new Jt(t).dispatch()).then(h?function(){var e=s()(u.a.mark((function e(t){return u.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt(\"return\",t);case 1:case\"end\":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}():Ht.d)}}var Kt=n(47),Gt=n.n(Kt),Zt=n(39),Xt=n.n(Zt),Qt=n(132),en=n.n(Qt),tn=n(45),nn=n.n(tn),rn=n(405),an=n.n(rn),on={body:function(e){var t=e.req,n=e.value;t.body=n},header:function(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{},void 0!==r&&(t.headers[n.name]=r)},query:function(e){var t=e.req,n=e.value,r=e.parameter;t.query=t.query||{},!1===n&&\"boolean\"===r.type&&(n=\"false\");0===n&&[\"number\",\"integer\"].indexOf(r.type)>-1&&(n=\"0\");if(n)t.query[r.name]={collectionFormat:r.collectionFormat,value:n};else if(r.allowEmptyValue&&void 0!==n){var a=r.name;t.query[a]=t.query[a]||{},t.query[a].allowEmptyValue=!0}},path:function(e){var t=e.req,n=e.value,r=e.parameter;t.url=t.url.split(\"{\".concat(r.name,\"}\")).join(encodeURIComponent(n))},formData:function(e){var t=e.req,n=e.value,r=e.parameter;(n||r.allowEmptyValue)&&(t.form=t.form||{},t.form[r.name]={value:n,allowEmptyValue:r.allowEmptyValue,collectionFormat:r.collectionFormat})}};function sn(e,t){return g()(t).call(t,\"application/json\")?\"string\"==typeof e?e:w()(e):e.toString()}function cn(e){var t=e.req,n=e.value,r=e.parameter,a=r.name,o=r.style,i=r.explode,s=r.content;if(s){var c=_()(s)[0];t.url=t.url.split(\"{\".concat(a,\"}\")).join(K(sn(n,c),{escape:!0}))}else{var u=G({key:r.name,value:n,style:o||\"simple\",explode:i||!1,escape:!0});t.url=t.url.split(\"{\".concat(a,\"}\")).join(u)}}function un(e){var t=e.req,n=e.value,r=e.parameter;if(t.query=t.query||{},r.content){var a=_()(r.content)[0];t.query[r.name]=sn(n,a)}else if(!1===n&&(n=\"false\"),0===n&&(n=\"0\"),n)t.query[r.name]={value:n,serializationOption:D()(r,[\"style\",\"explode\",\"allowReserved\"])};else if(r.allowEmptyValue&&void 0!==n){var o=r.name;t.query[o]=t.query[o]||{},t.query[o].allowEmptyValue=!0}}var ln=[\"accept\",\"authorization\",\"content-type\"];function pn(e){var t=e.req,n=e.parameter,r=e.value;if(t.headers=t.headers||{},!(ln.indexOf(n.name.toLowerCase())>-1))if(n.content){var a=_()(n.content)[0];t.headers[n.name]=sn(r,a)}else void 0!==r&&(t.headers[n.name]=G({key:n.name,value:r,style:n.style||\"simple\",explode:void 0!==n.explode&&n.explode,escape:!1}))}function fn(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{};var a=d()(r);if(n.content){var i,s=_()(n.content)[0];t.headers.Cookie=o()(i=\"\".concat(n.name,\"=\")).call(i,sn(r,s))}else if(\"undefined\"!==a){var c=\"object\"===a&&!Array.isArray(r)&&n.explode?\"\":\"\".concat(n.name,\"=\");t.headers.Cookie=c+G({key:n.name,value:r,escape:!1,style:n.style||\"form\",explode:void 0!==n.explode&&n.explode})}}var dn=n(173),hn=n.n(dn),mn=n(174),vn=n.n(mn);function gn(e,t){var n=e.operation,r=e.requestBody,a=e.securities,i=e.spec,s=e.attachContentTypeForEmptyPayload,c=e.requestContentType;t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,a=e.operation,i=void 0===a?{}:a,s=e.spec,c=hn()({},t),u=r.authorized,l=void 0===u?{}:u,p=i.security||s.security||[],f=l&&!!_()(l).length,d=Xt()(s,[\"components\",\"securitySchemes\"])||{};if(c.headers=c.headers||{},c.query=c.query||{},!_()(r).length||!f||!p||Array.isArray(i.security)&&!i.security.length)return t;return p.forEach((function(e){_()(e).forEach((function(e){var t=l[e],n=d[e];if(t){var r=t.value||t,a=n.type;if(t)if(\"apiKey\"===a)\"query\"===n.in&&(c.query[n.name]=r),\"header\"===n.in&&(c.headers[n.name]=r),\"cookie\"===n.in&&(c.cookies[n.name]=r);else if(\"http\"===a){if(/^basic$/i.test(n.scheme)){var i,s=r.username||\"\",u=r.password||\"\",p=vn()(o()(i=\"\".concat(s,\":\")).call(i,u));c.headers.Authorization=\"Basic \".concat(p)}/^bearer$/i.test(n.scheme)&&(c.headers.Authorization=\"Bearer \".concat(r))}else if(\"oauth2\"===a||\"openIdConnect\"===a){var f,h=t.token||{},m=h[n[\"x-tokenName\"]||\"access_token\"],v=h.token_type;v&&\"bearer\"!==v.toLowerCase()||(v=\"Bearer\"),c.headers.Authorization=o()(f=\"\".concat(v,\" \")).call(f,m)}}}))})),c}({request:t,securities:a,operation:n,spec:i});var u=n.requestBody||{},l=_()(u.content||{}),p=c&&l.indexOf(c)>-1;if(r||s){if(c&&p)t.headers[\"Content-Type\"]=c;else if(!c){var f=l[0];f&&(t.headers[\"Content-Type\"]=f,c=f)}}else c&&p&&(t.headers[\"Content-Type\"]=c);if(!e.responseContentType&&n.responses){var h,v=P()(h=k()(n.responses)).call(h,(function(e){var t=m()(e,2),n=t[0],r=t[1],a=parseInt(n,10);return a>=200&&a<300&&en()(r.content)})).reduce((function(e,t){var n=m()(t,2)[1];return o()(e).call(e,_()(n.content))}),[]);v.length>0&&(t.headers.accept=v.join(\", \"))}if(r)if(c){if(l.indexOf(c)>-1)if(\"application/x-www-form-urlencoded\"===c||\"multipart/form-data\"===c)if(\"object\"===d()(r)){var g=(u.content[c]||{}).encoding||{};t.form={},_()(r).forEach((function(e){t.form[e]={value:r[e],encoding:g[e]||{}}}))}else t.form=r;else t.body=r}else t.body=r;return t}function yn(e,t){var n,r,a=e.spec,i=e.operation,s=e.securities,c=e.requestContentType,u=e.responseContentType,l=e.attachContentTypeForEmptyPayload;if((t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,a=e.operation,i=void 0===a?{}:a,s=e.spec,c=hn()({},t),u=r.authorized,l=void 0===u?{}:u,p=r.specSecurity,f=void 0===p?[]:p,d=i.security||f,h=l&&!!_()(l).length,m=s.securityDefinitions;if(c.headers=c.headers||{},c.query=c.query||{},!_()(r).length||!h||!d||Array.isArray(i.security)&&!i.security.length)return t;return d.forEach((function(e){_()(e).forEach((function(e){var t=l[e];if(t){var n=t.token,r=t.value||t,a=m[e],i=a.type,s=a[\"x-tokenName\"]||\"access_token\",u=n&&n[s],p=n&&n.token_type;if(t)if(\"apiKey\"===i){var f=\"query\"===a.in?\"query\":\"headers\";c[f]=c[f]||{},c[f][a.name]=r}else if(\"basic\"===i)if(r.header)c.headers.authorization=r.header;else{var d,h=r.username||\"\",v=r.password||\"\";r.base64=vn()(o()(d=\"\".concat(h,\":\")).call(d,v)),c.headers.authorization=\"Basic \".concat(r.base64)}else if(\"oauth2\"===i&&u){var g;p=p&&\"bearer\"!==p.toLowerCase()?p:\"Bearer\",c.headers.authorization=o()(g=\"\".concat(p,\" \")).call(g,u)}}}))})),c}({request:t,securities:s,operation:i,spec:a})).body||t.form||l)if(c)t.headers[\"Content-Type\"]=c;else if(Array.isArray(i.consumes)){var p=m()(i.consumes,1);t.headers[\"Content-Type\"]=p[0]}else if(Array.isArray(a.consumes)){var f=m()(a.consumes,1);t.headers[\"Content-Type\"]=f[0]}else i.parameters&&P()(n=i.parameters).call(n,(function(e){return\"file\"===e.type})).length?t.headers[\"Content-Type\"]=\"multipart/form-data\":i.parameters&&P()(r=i.parameters).call(r,(function(e){return\"formData\"===e.in})).length&&(t.headers[\"Content-Type\"]=\"application/x-www-form-urlencoded\");else if(c){var d,h,v=i.parameters&&P()(d=i.parameters).call(d,(function(e){return\"body\"===e.in})).length>0,g=i.parameters&&P()(h=i.parameters).call(h,(function(e){return\"formData\"===e.in})).length>0;(v||g)&&(t.headers[\"Content-Type\"]=c)}return!u&&Array.isArray(i.produces)&&i.produces.length>0&&(t.headers.accept=i.produces.join(\", \")),t}var bn=[\"http\",\"fetch\",\"spec\",\"operationId\",\"pathName\",\"method\",\"parameters\",\"securities\"],En=function(e){return Array.isArray(e)?e:[]},xn=it(\"OperationNotFoundError\",(function(e,t,n){this.originalError=n,Se()(this,t||{})})),Sn={buildRequest:jn};function wn(e){var t=e.http,n=e.fetch,r=e.spec,a=e.operationId,o=e.pathName,i=e.method,s=e.parameters,c=e.securities,u=Gt()(e,bn),l=t||n||Q;o&&i&&!a&&(a=Object(Ht.c)(o,i));var p=Sn.buildRequest(ve()({spec:r,operationId:a,parameters:s,securities:c,http:l},u));return p.body&&(en()(p.body)||nn()(p.body))&&(p.body=w()(p.body)),l(p)}function jn(e){var t,n,a=e.spec,i=e.operationId,s=e.responseContentType,c=e.scheme,u=e.requestInterceptor,l=e.responseInterceptor,p=e.contextUrl,f=e.userFetch,d=e.server,h=e.serverVariables,v=e.http,g=e.parameters,y=e.parameterBuilders,b=Object(Ht.b)(a);y||(y=b?r:on);var E={url:\"\",credentials:v&&v.withCredentials?\"include\":\"same-origin\",headers:{},cookies:{}};u&&(E.requestInterceptor=u),l&&(E.responseInterceptor=l),f&&(E.userFetch=f);var x=Object(Ht.a)(a,i);if(!x)throw new xn(\"Operation \".concat(i,\" not found\"));var S,w=x.operation,j=void 0===w?{}:w,C=x.method,A=x.pathName;if(E.url+=(S={spec:a,scheme:c,contextUrl:p,server:d,serverVariables:h,pathName:A,method:C},Object(Ht.b)(S.spec)?function(e){var t=e.spec,n=e.pathName,r=e.method,a=e.server,i=e.contextUrl,s=e.serverVariables,c=void 0===s?{}:s,u=Xt()(t,[\"paths\",n,(r||\"\").toLowerCase(),\"servers\"])||Xt()(t,[\"paths\",n,\"servers\"])||Xt()(t,[\"servers\"]),l=\"\",p=null;if(a&&u&&u.length){var f=O()(u).call(u,(function(e){return e.url}));f.indexOf(a)>-1&&(l=a,p=u[f.indexOf(a)])}if(!l&&u&&u.length){l=u[0].url;var d=m()(u,1);p=d[0]}return l.indexOf(\"{\")>-1&&function(e){for(var t,n=[],r=/{([^}]+)}/g;t=r.exec(e);)n.push(t[1]);return n}(l).forEach((function(e){if(p.variables&&p.variables[e]){var t=p.variables[e],n=c[e]||t.default,r=new RegExp(\"{\".concat(e,\"}\"),\"g\");l=l.replace(r,n)}})),function(){var e,t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",a=n&&r?ot.a.parse(ot.a.resolve(r,n)):ot.a.parse(n),i=ot.a.parse(r),s=On(a.protocol)||On(i.protocol)||\"\",c=a.host||i.host,u=a.pathname||\"\";return\"/\"===(e=s&&c?o()(t=\"\".concat(s,\"://\")).call(t,c+u):u)[e.length-1]?W()(e).call(e,0,-1):e}(l,i)}(S):function(e){var t,n,r=e.spec,a=e.scheme,i=e.contextUrl,s=void 0===i?\"\":i,c=ot.a.parse(s),u=Array.isArray(r.schemes)?r.schemes[0]:null,l=a||u||On(c.protocol)||\"http\",p=r.host||c.host||\"\",f=r.basePath||\"\";return\"/\"===(t=l&&p?o()(n=\"\".concat(l,\"://\")).call(n,p+f):f)[t.length-1]?W()(t).call(t,0,-1):t}(S)),!i)return delete E.cookies,E;E.url+=A,E.method=\"\".concat(C).toUpperCase(),g=g||{};var k=a.paths[A]||{};s&&(E.headers.accept=s);var I=function(e){var t={};e.forEach((function(e){t[e.in]||(t[e.in]={}),t[e.in][e.name]=e}));var n=[];return _()(t).forEach((function(e){_()(t[e]).forEach((function(r){n.push(t[e][r])}))})),n}(o()(t=o()(n=[]).call(n,En(j.parameters))).call(t,En(k.parameters)));I.forEach((function(e){var t,n,r=y[e.in];if(\"body\"===e.in&&e.schema&&e.schema.properties&&(t=g),void 0===(t=e&&e.name&&g[e.name]))t=e&&e.name&&g[o()(n=\"\".concat(e.in,\".\")).call(n,e.name)];else if(function(e,t){return P()(t).call(t,(function(t){return t.name===e}))}(e.name,I).length>1){var i;console.warn(o()(i=\"Parameter '\".concat(e.name,\"' is ambiguous because the defined spec has more than one parameter with the name: '\")).call(i,e.name,\"' and the passed-in parameter values did not define an 'in' value.\"))}if(null!==t){if(void 0!==e.default&&void 0===t&&(t=e.default),void 0===t&&e.required&&!e.allowEmptyValue)throw new Error(\"Required parameter \".concat(e.name,\" is not provided\"));if(b&&e.schema&&\"object\"===e.schema.type&&\"string\"==typeof t)try{t=JSON.parse(t)}catch(e){throw new Error(\"Could not parse object parameter value string as JSON\")}r&&r({req:E,parameter:e,value:t,operation:j,spec:a})}}));var T=ve()(ve()({},e),{},{operation:j});if((E=b?gn(T,E):yn(T,E)).cookies&&_()(E.cookies).length){var R=_()(E.cookies).reduce((function(e,t){var n=E.cookies[t];return e+(e?\"&\":\"\")+an.a.serialize(t,n)}),\"\");E.headers.Cookie=R}return E.cookies&&delete E.cookies,he(E),E}var On=function(e){return e?e.replace(/\\W/g,\"\"):null};function Cn(e,t){return _n.apply(this,arguments)}function _n(){return(_n=s()(u.a.mark((function e(t,n){var r,a,o,i,s,c,l,p,f,d,h,m,v=arguments;return u.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=v.length>2&&void 0!==v[2]?v[2]:{},a=r.returnEntireTree,o=r.baseDoc,i=r.requestInterceptor,s=r.responseInterceptor,c=r.parameterMacro,l=r.modelPropertyMacro,p=r.useCircularStructures,f={pathDiscriminator:n,baseDoc:o,requestInterceptor:i,responseInterceptor:s,parameterMacro:c,modelPropertyMacro:l,useCircularStructures:p},d=Object(Ht.d)({spec:t}),h=d.spec,e.next=6,Yt(ve()(ve()({},f),{},{spec:h,allowMetaPatches:!0,skipNormalization:!0}));case 6:return m=e.sent,!a&&Array.isArray(n)&&n.length&&(m.spec=Xt()(m.spec,n)||null),e.abrupt(\"return\",m);case 9:case\"end\":return e.stop()}}),e)})))).apply(this,arguments)}var An=n(236);t.default=function(e){var t,n,r,a=e.configs,i=e.getConfigs;return{fn:{fetch:(t=Q,n=a.preFetch,r=a.postFetch,r=r||function(e){return e},n=n||function(e){return e},function(e){return\"string\"==typeof e&&(e={url:e}),X.mergeInQueryOrForm(e),e=n(e),r(t(e))}),buildRequest:jn,execute:wn,resolve:Yt,resolveSubtree:function(e,t,n){var r;if(void 0===n){var a=i();n={modelPropertyMacro:a.modelPropertyMacro,parameterMacro:a.parameterMacro,requestInterceptor:a.requestInterceptor,responseInterceptor:a.responseInterceptor}}for(var s=arguments.length,c=new Array(s>3?s-3:0),u=3;u<s;u++)c[u-3]=arguments[u];return Cn.apply(void 0,o()(r=[e,t,n]).call(r,c))},serializeRes:re,opId:Ht.e},statePlugins:{configs:{wrapActions:An}}}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return u}));var r=n(134),a=n(117),o=n(243),i=n(244),s=n(245),c={getLocalConfig:function(){return Object(r.parseYamlConfig)('---\\nurl: \"https://petstore.swagger.io/v2/swagger.json\"\\ndom_id: \"#swagger-ui\"\\nvalidatorUrl: \"https://validator.swagger.io/validator\"\\n')}};function u(){return{statePlugins:{spec:{actions:o,selectors:c},configs:{reducers:s.default,actions:a,selectors:i}}}}},function(e,t,n){var r=n(336),a=n(156),o=n(616),i=n(45),s=n(350);e.exports=function(e,t,n){var c=i(e)?r:o;return n&&s(e,t,n)&&(t=void 0),c(e,a(t,3))}},function(e,t){e.exports=require(\"memoizee\")},function(e,t,n){e.exports=n(664)},function(e,t,n){e.exports=n(669)},function(e,t,n){var r=n(365);e.exports=function(e,t,n){return null==e?e:r(e,t,n)}},function(e,t){e.exports=require(\"react-redux\")},function(e,t){e.exports=require(\"formdata-node\")},function(e,t){e.exports=function(){}},function(e,t){e.exports=require(\"querystring-browser\")},function(e,t,n){var r=n(745),a=n(327),o=n(347),i=n(76);e.exports=function(e,t,n){return e=i(e),n=null==n?0:r(o(n),0,e.length),t=a(t),e.slice(n,n+t.length)==t}},function(e,t,n){var r=n(76);e.exports=function(e){return r(e).toLowerCase()}},function(e,t){e.exports=require(\"react-debounce-input\")},function(e,t,n){var r=n(320),a=n(313),o=n(150),i=n(321);e.exports=function(e){return r(e)||a(e)||o(e)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){\"use strict\";var r=n(21),a=n(34),o=n(121),i=n(42),s=n(53),c=n(60),u=n(122),l=n(184),p=n(123),f=n(37),d=n(106),h=f(\"isConcatSpreadable\"),m=9007199254740991,v=\"Maximum allowed index exceeded\",g=d>=51||!a((function(){var e=[];return e[h]=!1,e.concat()[0]!==e})),y=p(\"concat\"),b=function(e){if(!i(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:\"Array\",proto:!0,forced:!g||!y},{concat:function(e){var t,n,r,a,o,i=s(this),p=l(i,0),f=0;for(t=-1,r=arguments.length;t<r;t++)if(b(o=-1===t?i:arguments[t])){if(f+(a=c(o.length))>m)throw TypeError(v);for(n=0;n<a;n++,f++)n in o&&u(p,f,o[n])}else{if(f>=m)throw TypeError(v);u(p,f++,o)}return p.length=f,p}})},function(e,t,n){var r=n(43),a=n(34),o=n(183);e.exports=!r&&!a((function(){return 7!=Object.defineProperty(o(\"div\"),\"a\",{get:function(){return 7}}).a}))},function(e,t,n){var r=n(34),a=/#|\\.prototype\\./,o=function(e,t){var n=s[i(e)];return n==u||n!=c&&(\"function\"==typeof t?r(t):!!t)},i=o.normalize=function(e){return String(e).replace(a,\".\").toLowerCase()},s=o.data={},c=o.NATIVE=\"N\",u=o.POLYFILL=\"P\";e.exports=o},function(e,t,n){var r=n(187);e.exports=r&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator},function(e,t,n){\"use strict\";var r=n(21),a=n(36),o=n(61),i=n(81),s=n(43),c=n(187),u=n(293),l=n(34),p=n(49),f=n(121),d=n(42),h=n(46),m=n(53),v=n(57),g=n(143),y=n(88),b=n(92),E=n(124),x=n(192),S=n(418),w=n(193),j=n(104),O=n(59),C=n(141),_=n(58),A=n(93),k=n(185),I=n(146),P=n(125),T=n(144),R=n(37),N=n(194),M=n(40),q=n(82),D=n(67),B=n(73).forEach,L=I(\"hidden\"),U=\"Symbol\",V=R(\"toPrimitive\"),z=D.set,F=D.getterFor(U),J=Object.prototype,W=a.Symbol,H=o(\"JSON\",\"stringify\"),$=j.f,Y=O.f,K=S.f,G=C.f,Z=k(\"symbols\"),X=k(\"op-symbols\"),Q=k(\"string-to-symbol-registry\"),ee=k(\"symbol-to-string-registry\"),te=k(\"wks\"),ne=a.QObject,re=!ne||!ne.prototype||!ne.prototype.findChild,ae=s&&l((function(){return 7!=b(Y({},\"a\",{get:function(){return Y(this,\"a\",{value:7}).a}})).a}))?function(e,t,n){var r=$(J,t);r&&delete J[t],Y(e,t,n),r&&e!==J&&Y(J,t,r)}:Y,oe=function(e,t){var n=Z[e]=b(W.prototype);return z(n,{type:U,tag:e,description:t}),s||(n.description=t),n},ie=u?function(e){return\"symbol\"==typeof e}:function(e){return Object(e)instanceof W},se=function(e,t,n){e===J&&se(X,t,n),h(e);var r=g(t,!0);return h(n),p(Z,r)?(n.enumerable?(p(e,L)&&e[L][r]&&(e[L][r]=!1),n=b(n,{enumerable:y(0,!1)})):(p(e,L)||Y(e,L,y(1,{})),e[L][r]=!0),ae(e,r,n)):Y(e,r,n)},ce=function(e,t){h(e);var n=v(t),r=E(n).concat(fe(n));return B(r,(function(t){s&&!ue.call(n,t)||se(e,t,n[t])})),e},ue=function(e){var t=g(e,!0),n=G.call(this,t);return!(this===J&&p(Z,t)&&!p(X,t))&&(!(n||!p(this,t)||!p(Z,t)||p(this,L)&&this[L][t])||n)},le=function(e,t){var n=v(e),r=g(t,!0);if(n!==J||!p(Z,r)||p(X,r)){var a=$(n,r);return!a||!p(Z,r)||p(n,L)&&n[L][r]||(a.enumerable=!0),a}},pe=function(e){var t=K(v(e)),n=[];return B(t,(function(e){p(Z,e)||p(P,e)||n.push(e)})),n},fe=function(e){var t=e===J,n=K(t?X:v(e)),r=[];return B(n,(function(e){!p(Z,e)||t&&!p(J,e)||r.push(Z[e])})),r};(c||(A((W=function(){if(this instanceof W)throw TypeError(\"Symbol is not a constructor\");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=T(e),n=function(e){this===J&&n.call(X,e),p(this,L)&&p(this[L],t)&&(this[L][t]=!1),ae(this,t,y(1,e))};return s&&re&&ae(J,t,{configurable:!0,set:n}),oe(t,e)}).prototype,\"toString\",(function(){return F(this).tag})),A(W,\"withoutSetter\",(function(e){return oe(T(e),e)})),C.f=ue,O.f=se,j.f=le,x.f=S.f=pe,w.f=fe,N.f=function(e){return oe(R(e),e)},s&&(Y(W.prototype,\"description\",{configurable:!0,get:function(){return F(this).description}}),i||A(J,\"propertyIsEnumerable\",ue,{unsafe:!0}))),r({global:!0,wrap:!0,forced:!c,sham:!c},{Symbol:W}),B(E(te),(function(e){M(e)})),r({target:U,stat:!0,forced:!c},{for:function(e){var t=String(e);if(p(Q,t))return Q[t];var n=W(t);return Q[t]=n,ee[n]=t,n},keyFor:function(e){if(!ie(e))throw TypeError(e+\" is not a symbol\");if(p(ee,e))return ee[e]},useSetter:function(){re=!0},useSimple:function(){re=!1}}),r({target:\"Object\",stat:!0,forced:!c,sham:!s},{create:function(e,t){return void 0===t?b(e):ce(b(e),t)},defineProperty:se,defineProperties:ce,getOwnPropertyDescriptor:le}),r({target:\"Object\",stat:!0,forced:!c},{getOwnPropertyNames:pe,getOwnPropertySymbols:fe}),r({target:\"Object\",stat:!0,forced:l((function(){w.f(1)}))},{getOwnPropertySymbols:function(e){return w.f(m(e))}}),H)&&r({target:\"JSON\",stat:!0,forced:!c||l((function(){var e=W();return\"[null]\"!=H([e])||\"{}\"!=H({a:e})||\"{}\"!=H(Object(e))}))},{stringify:function(e,t,n){for(var r,a=[e],o=1;arguments.length>o;)a.push(arguments[o++]);if(r=t,(d(t)||void 0!==e)&&!ie(e))return f(t)||(t=function(e,t){if(\"function\"==typeof r&&(t=r.call(this,e,t)),!ie(t))return t}),a[1]=t,H.apply(null,a)}});W.prototype[V]||_(W.prototype,V,W.prototype.valueOf),q(W,U),P[L]=!0},function(e,t,n){var r=n(49),a=n(57),o=n(189).indexOf,i=n(125);e.exports=function(e,t){var n,s=a(e),c=0,u=[];for(n in s)!r(i,n)&&r(s,n)&&u.push(n);for(;t.length>c;)r(s,n=t[c++])&&(~o(u,n)||u.push(n));return u}},function(e,t,n){var r=n(61);e.exports=r(\"document\",\"documentElement\")},function(e,t,n){var r=n(36),a=n(298),o=r.WeakMap;e.exports=\"function\"==typeof o&&/native code/.test(a(o))},function(e,t,n){var r=n(186),a=Function.toString;\"function\"!=typeof r.inspectSource&&(r.inspectSource=function(e){return a.call(e)}),e.exports=r.inspectSource},function(e,t,n){n(40)(\"iterator\")},function(e,t,n){var r=n(105),a=n(89),o=function(e){return function(t,n){var o,i,s=String(a(t)),c=r(n),u=s.length;return c<0||c>=u?e?\"\":void 0:(o=s.charCodeAt(c))<55296||o>56319||c+1===u||(i=s.charCodeAt(c+1))<56320||i>57343?e?s.charAt(c):o:e?s.slice(c,c+2):i-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},function(e,t,n){\"use strict\";var r=n(302).IteratorPrototype,a=n(92),o=n(88),i=n(82),s=n(108),c=function(){return this};e.exports=function(e,t,n){var u=t+\" Iterator\";return e.prototype=a(r,{next:o(1,n)}),i(e,u,!1,!0),s[u]=c,e}},function(e,t,n){\"use strict\";var r,a,o,i=n(34),s=n(147),c=n(58),u=n(49),l=n(37),p=n(81),f=l(\"iterator\"),d=!1;[].keys&&(\"next\"in(o=[].keys())?(a=s(s(o)))!==Object.prototype&&(r=a):d=!0);var h=null==r||i((function(){var e={};return r[f].call(e)!==e}));h&&(r={}),p&&!h||u(r,f)||c(r,f,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:d}},function(e,t,n){var r=n(34);e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},function(e,t,n){var r=n(452),a=Array.prototype;e.exports=function(e){var t=e.filter;return e===a||e instanceof Array&&t===a.filter?r:t}},function(e,t,n){n(455);var r=n(31);e.exports=r.Object.keys},function(e,t,n){n(460);var r=n(31).Object,a=e.exports=function(e,t,n){return r.defineProperty(e,t,n)};r.defineProperty.sham&&(a.sham=!0)},function(e,t,n){\"use strict\";var r=n(66),a=n(42),o=[].slice,i={},s=function(e,t,n){if(!(t in i)){for(var r=[],a=0;a<t;a++)r[a]=\"a[\"+a+\"]\";i[t]=Function(\"C,a\",\"return new C(\"+r.join(\",\")+\")\")}return i[t](e,n)};e.exports=Function.bind||function(e){var t=r(this),n=o.call(arguments,1),i=function(){var r=n.concat(o.call(arguments));return this instanceof i?s(t,r.length,r):t.apply(e,r)};return a(t.prototype)&&(i.prototype=t.prototype),i}},function(e,t,n){n(466);var r=n(31);e.exports=r.Object.assign},function(e,t,n){\"use strict\";var r=n(43),a=n(34),o=n(124),i=n(193),s=n(141),c=n(53),u=n(142),l=Object.assign,p=Object.defineProperty;e.exports=!l||a((function(){if(r&&1!==l({b:1},l(p({},\"a\",{enumerable:!0,get:function(){p(this,\"b\",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),a=\"abcdefghijklmnopqrst\";return e[n]=7,a.split(\"\").forEach((function(e){t[e]=e})),7!=l({},e)[n]||o(l({},t)).join(\"\")!=a}))?function(e,t){for(var n=c(e),a=arguments.length,l=1,p=i.f,f=s.f;a>l;)for(var d,h=u(arguments[l++]),m=p?o(h).concat(p(h)):o(h),v=m.length,g=0;v>g;)d=m[g++],r&&!f.call(h,d)||(n[d]=h[d]);return n}:l},function(e,t,n){var r=n(468),a=Array.prototype;e.exports=function(e){var t=e.slice;return e===a||e instanceof Array&&t===a.slice?r:t}},function(e,t,n){n(471);var r=n(31);e.exports=r.Array.isArray},function(e,t){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(140),a=n(200),o=n(314);e.exports=function(e){if(void 0!==r&&null!=a(e)||null!=e[\"@@iterator\"])return o(e)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(488)},function(e,t,n){n(107),n(489);var r=n(31);e.exports=r.Array.from},function(e,t,n){\"use strict\";var r=n(90),a=n(53),o=n(490),i=n(318),s=n(60),c=n(122),u=n(127);e.exports=function(e){var t,n,l,p,f,d,h=a(e),m=\"function\"==typeof this?this:Array,v=arguments.length,g=v>1?arguments[1]:void 0,y=void 0!==g,b=u(h),E=0;if(y&&(g=r(g,v>2?arguments[2]:void 0,2)),null==b||m==Array&&i(b))for(n=new m(t=s(h.length));t>E;E++)d=y?g(h[E],E):h[E],c(n,E,d);else for(f=(p=b.call(h)).next,n=new m;!(l=f.call(p)).done;E++)d=y?o(p,g,[l.value,E],!0):l.value,c(n,E,d);return n.length=E,n}},function(e,t,n){var r=n(46);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},function(e,t,n){var r=n(37),a=n(108),o=r(\"iterator\"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(a.Array===e||i[o]===e)}},function(e,t,n){var r=n(37)(\"iterator\"),a=!1;try{var o=0,i={next:function(){return{done:!!o++}},return:function(){a=!0}};i[r]=function(){return this},Array.from(i,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!a)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},function(e,t,n){var r=n(199);e.exports=function(e){if(r(e))return e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){n(74);var r=n(498),a=n(83),o=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.forEach;return e===o||e instanceof Array&&t===o.forEach||i.hasOwnProperty(a(e))?r:t}},function(e,t,n){var r=n(520);e.exports=function(e){if(r(e))throw TypeError(\"The method doesn't accept regular expressions\");return e}},function(e,t,n){var r=n(37)(\"match\");e.exports=function(e){var t=/./;try{\"/./\"[e](t)}catch(n){try{return t[r]=!1,\"/./\"[e](t)}catch(e){}}return!1}},function(e,t,n){var r=n(522),a=Array.prototype;e.exports=function(e){var t=e.indexOf;return e===a||e instanceof Array&&t===a.indexOf?r:t}},function(e,t){e.exports=\"\\t\\n\\v\\f\\r                　\\u2028\\u2029\\ufeff\"},function(e,t,n){var r=n(109),a=n(329),o=n(45),i=n(151),s=r?r.prototype:void 0,c=s?s.toString:void 0;e.exports=function e(t){if(\"string\"==typeof t)return t;if(o(t))return a(t,e)+\"\";if(i(t))return c?c.call(t):\"\";var n=t+\"\";return\"0\"==n&&1/t==-Infinity?\"-0\":n}},function(e,t,n){(function(t){var n=\"object\"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(this,n(182))},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,a=Array(r);++n<r;)a[n]=t(e[n],n,e);return a}},function(e,t){e.exports=function(e,t,n){var r=-1,a=e.length;t<0&&(t=-t>a?0:a+t),(n=n>a?a:n)<0&&(n+=a),a=t>n?0:n-t>>>0,t>>>=0;for(var o=Array(a);++r<a;)o[r]=e[r+t];return o}},function(e,t){var n=RegExp(\"[\\\\u200d\\\\ud800-\\\\udfff\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff\\\\ufe0e\\\\ufe0f]\");e.exports=function(e){return n.test(e)}},function(e,t){e.exports=function(e,t,n,r){var a=-1,o=null==e?0:e.length;for(r&&o&&(n=e[++a]);++a<o;)n=t(n,e[a],a,e);return n}},function(e,t){var n=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return n.call(e)}catch(e){}try{return e+\"\"}catch(e){}}return\"\"}},function(e,t,n){var r=n(583),a=n(75);e.exports=function e(t,n,o,i,s){return t===n||(null==t||null==n||!a(t)&&!a(n)?t!=t&&n!=n:r(t,n,o,i,e,s))}},function(e,t,n){var r=n(584),a=n(336),o=n(587);e.exports=function(e,t,n,i,s,c){var u=1&n,l=e.length,p=t.length;if(l!=p&&!(u&&p>l))return!1;var f=c.get(e),d=c.get(t);if(f&&d)return f==t&&d==e;var h=-1,m=!0,v=2&n?new r:void 0;for(c.set(e,t),c.set(t,e);++h<l;){var g=e[h],y=t[h];if(i)var b=u?i(y,g,h,t,e,c):i(g,y,h,e,t,c);if(void 0!==b){if(b)continue;m=!1;break}if(v){if(!a(t,(function(e,t){if(!o(v,t)&&(g===e||s(g,e,n,i,c)))return v.push(t)}))){m=!1;break}}else if(g!==y&&!s(g,y,n,i,c)){m=!1;break}}return c.delete(e),c.delete(t),m}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n<r;)if(t(e[n],n,e))return!0;return!1}},function(e,t,n){var r=n(62).Uint8Array;e.exports=r},function(e,t,n){var r=n(339),a=n(205),o=n(97);e.exports=function(e){return r(e,o,a)}},function(e,t,n){var r=n(204),a=n(45);e.exports=function(e,t,n){var o=t(e);return a(e)?o:r(o,n(e))}},function(e,t){e.exports=function(){return[]}},function(e,t,n){var r=n(593),a=n(157),o=n(45),i=n(158),s=n(159),c=n(207),u=Object.prototype.hasOwnProperty;e.exports=function(e,t){var n=o(e),l=!n&&a(e),p=!n&&!l&&i(e),f=!n&&!l&&!p&&c(e),d=n||l||p||f,h=d?r(e.length,String):[],m=h.length;for(var v in e)!t&&!u.call(e,v)||d&&(\"length\"==v||p&&(\"offset\"==v||\"parent\"==v)||f&&(\"buffer\"==v||\"byteLength\"==v||\"byteOffset\"==v)||s(v,m))||h.push(v);return h}},function(e,t,n){var r=n(128),a=n(597),o=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return a(e);var t=[];for(var n in Object(e))o.call(e,n)&&\"constructor\"!=n&&t.push(n);return t}},function(e,t){e.exports=function(e,t){return function(n){return e(t(n))}}},function(e,t,n){var r=n(50);e.exports=function(e){return e==e&&!r(e)}},function(e,t){e.exports=function(e,t){return function(n){return null!=n&&(n[e]===t&&(void 0!==t||e in Object(n)))}}},function(e,t,n){var r=n(606),a=n(607);e.exports=function(e,t){return null!=e&&a(e,t,r)}},function(e,t,n){var r=n(613);e.exports=function(e){var t=r(e),n=t%1;return t==t?n?t-n:t:0}},function(e,t,n){var r=n(614),a=n(50),o=n(151),i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,c=/^0o[0-7]+$/i,u=parseInt;e.exports=function(e){if(\"number\"==typeof e)return e;if(o(e))return NaN;if(a(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=a(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=r(e);var n=s.test(e);return n||c.test(e)?u(e.slice(2),n?2:8):i.test(e)?NaN:+e}},function(e,t,n){var r=n(617),a=n(620)(r);e.exports=a},function(e,t,n){var r=n(100),a=n(98),o=n(159),i=n(50);e.exports=function(e,t,n){if(!i(n))return!1;var s=typeof t;return!!(\"number\"==s?a(n)&&o(t,n.length):\"string\"==s&&t in n)&&r(n[t],e)}},function(e,t,n){e.exports=n(629)},function(e,t,n){e.exports=n(630)},function(e,t,n){e.exports=n(649)},function(e,t,n){n(355),n(145),n(653),n(362),n(363),n(658),n(107),n(74);var r=n(31);e.exports=r.Promise},function(e,t,n){\"use strict\";var r=n(21),a=n(147),o=n(148),i=n(92),s=n(58),c=n(88),u=n(99),l=function(e,t){var n=this;if(!(n instanceof l))return new l(e,t);o&&(n=o(new Error(void 0),a(n))),void 0!==t&&s(n,\"message\",String(t));var r=[];return u(e,r.push,{that:r}),s(n,\"errors\",r),n};l.prototype=i(Error.prototype,{constructor:c(5,l),message:c(5,\"\"),name:c(5,\"AggregateError\")}),r({global:!0},{AggregateError:l})},function(e,t,n){var r=n(36);e.exports=r.Promise},function(e,t,n){\"use strict\";var r=n(61),a=n(59),o=n(37),i=n(43),s=o(\"species\");e.exports=function(e){var t=r(e),n=a.f;i&&t&&!t[s]&&n(t,s,{configurable:!0,get:function(){return this}})}},function(e,t,n){var r=n(46),a=n(66),o=n(37)(\"species\");e.exports=function(e,t){var n,i=r(e).constructor;return void 0===i||null==(n=r(i)[o])?t:a(n)}},function(e,t,n){var r,a,o,i=n(36),s=n(34),c=n(90),u=n(296),l=n(183),p=n(360),f=n(149),d=i.location,h=i.setImmediate,m=i.clearImmediate,v=i.process,g=i.MessageChannel,y=i.Dispatch,b=0,E={},x=\"onreadystatechange\",S=function(e){if(E.hasOwnProperty(e)){var t=E[e];delete E[e],t()}},w=function(e){return function(){S(e)}},j=function(e){S(e.data)},O=function(e){i.postMessage(e+\"\",d.protocol+\"//\"+d.host)};h&&m||(h=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return E[++b]=function(){(\"function\"==typeof e?e:Function(e)).apply(void 0,t)},r(b),b},m=function(e){delete E[e]},f?r=function(e){v.nextTick(w(e))}:y&&y.now?r=function(e){y.now(w(e))}:g&&!p?(o=(a=new g).port2,a.port1.onmessage=j,r=c(o.postMessage,o,1)):i.addEventListener&&\"function\"==typeof postMessage&&!i.importScripts&&d&&\"file:\"!==d.protocol&&!s(O)?(r=O,i.addEventListener(\"message\",j,!1)):r=x in l(\"script\")?function(e){u.appendChild(l(\"script\")).onreadystatechange=function(){u.removeChild(this),S(e)}}:function(e){setTimeout(w(e),0)}),e.exports={set:h,clear:m}},function(e,t,n){var r=n(91);e.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(r)},function(e,t,n){var r=n(46),a=n(42),o=n(131);e.exports=function(e,t){if(r(e),a(t)&&t.constructor===e)return t;var n=o.f(e);return(0,n.resolve)(t),n.promise}},function(e,t,n){\"use strict\";var r=n(21),a=n(66),o=n(131),i=n(161),s=n(99);r({target:\"Promise\",stat:!0},{allSettled:function(e){var t=this,n=o.f(t),r=n.resolve,c=n.reject,u=i((function(){var n=a(t.resolve),o=[],i=0,c=1;s(e,(function(e){var a=i++,s=!1;o.push(void 0),c++,n.call(t,e).then((function(e){s||(s=!0,o[a]={status:\"fulfilled\",value:e},--c||r(o))}),(function(e){s||(s=!0,o[a]={status:\"rejected\",reason:e},--c||r(o))}))})),--c||r(o)}));return u.error&&c(u.value),n.promise}})},function(e,t,n){\"use strict\";var r=n(21),a=n(66),o=n(61),i=n(131),s=n(161),c=n(99),u=\"No one promise resolved\";r({target:\"Promise\",stat:!0},{any:function(e){var t=this,n=i.f(t),r=n.resolve,l=n.reject,p=s((function(){var n=a(t.resolve),i=[],s=0,p=1,f=!1;c(e,(function(e){var a=s++,c=!1;i.push(void 0),p++,n.call(t,e).then((function(e){c||f||(f=!0,r(e))}),(function(e){c||f||(c=!0,i[a]=e,--p||l(new(o(\"AggregateError\"))(i,u)))}))})),--p||l(new(o(\"AggregateError\"))(i,u))}));return p.error&&l(p.value),n.promise}})},function(e,t,n){var r=n(43),a=n(124),o=n(57),i=n(141).f,s=function(e){return function(t){for(var n,s=o(t),c=a(s),u=c.length,l=0,p=[];u>l;)n=c[l++],r&&!i.call(s,n)||p.push(e?[n,s[n]]:s[n]);return p}};e.exports={entries:s(!0),values:s(!1)}},function(e,t,n){var r=n(162),a=n(110),o=n(159),i=n(50),s=n(111);e.exports=function(e,t,n,c){if(!i(e))return e;for(var u=-1,l=(t=a(t,e)).length,p=l-1,f=e;null!=f&&++u<l;){var d=s(t[u]),h=n;if(\"__proto__\"===d||\"constructor\"===d||\"prototype\"===d)return e;if(u!=p){var m=f[d];void 0===(h=c?c(m,d,f):void 0)&&(h=i(m)?m:o(t[u+1])?[]:{})}r(f,d,h),f=f[d]}return e}},function(e,t,n){var r=n(367);e.exports=function(e,t,n){\"__proto__\"==t&&r?r(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}},function(e,t,n){var r=n(96),a=function(){try{var e=r(Object,\"defineProperty\");return e({},\"\",{}),e}catch(e){}}();e.exports=a},function(e,t,n){e.exports=n(680)},function(e,t,n){e.exports=n(683)},function(e,t,n){var r=n(203),a=n(693),o=n(162),i=n(694),s=n(695),c=n(698),u=n(699),l=n(700),p=n(701),f=n(338),d=n(372),h=n(129),m=n(702),v=n(703),g=n(708),y=n(45),b=n(158),E=n(710),x=n(50),S=n(712),w=n(97),j=n(213),O=\"[object Arguments]\",C=\"[object Function]\",_=\"[object Object]\",A={};A[O]=A[\"[object Array]\"]=A[\"[object ArrayBuffer]\"]=A[\"[object DataView]\"]=A[\"[object Boolean]\"]=A[\"[object Date]\"]=A[\"[object Float32Array]\"]=A[\"[object Float64Array]\"]=A[\"[object Int8Array]\"]=A[\"[object Int16Array]\"]=A[\"[object Int32Array]\"]=A[\"[object Map]\"]=A[\"[object Number]\"]=A[_]=A[\"[object RegExp]\"]=A[\"[object Set]\"]=A[\"[object String]\"]=A[\"[object Symbol]\"]=A[\"[object Uint8Array]\"]=A[\"[object Uint8ClampedArray]\"]=A[\"[object Uint16Array]\"]=A[\"[object Uint32Array]\"]=!0,A[\"[object Error]\"]=A[C]=A[\"[object WeakMap]\"]=!1,e.exports=function e(t,n,k,I,P,T){var R,N=1&n,M=2&n,q=4&n;if(k&&(R=P?k(t,I,P,T):k(t)),void 0!==R)return R;if(!x(t))return t;var D=y(t);if(D){if(R=m(t),!N)return u(t,R)}else{var B=h(t),L=B==C||\"[object GeneratorFunction]\"==B;if(b(t))return c(t,N);if(B==_||B==O||L&&!P){if(R=M||L?{}:g(t),!N)return M?p(t,s(R,t)):l(t,i(R,t))}else{if(!A[B])return P?t:{};R=v(t,B,N)}}T||(T=new r);var U=T.get(t);if(U)return U;T.set(t,R),S(t)?t.forEach((function(r){R.add(e(r,n,k,r,t,T))})):E(t)&&t.forEach((function(r,a){R.set(a,e(r,n,k,a,t,T))}));var V=D?void 0:(q?M?d:f:M?j:w)(t);return a(V||t,(function(r,a){V&&(r=t[a=r]),o(R,a,e(r,n,k,a,t,T))})),R}},function(e,t,n){var r=n(204),a=n(214),o=n(205),i=n(340),s=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)r(t,o(e)),e=a(e);return t}:i;e.exports=s},function(e,t,n){var r=n(339),a=n(371),o=n(213);e.exports=function(e){return r(e,o,a)}},function(e,t,n){var r=n(718),a=n(374),o=n(375);e.exports=function(e){return o(a(e,void 0,r),e+\"\")}},function(e,t,n){var r=n(721),a=Math.max;e.exports=function(e,t,n){return t=a(void 0===t?e.length-1:t,0),function(){for(var o=arguments,i=-1,s=a(o.length-t,0),c=Array(s);++i<s;)c[i]=o[t+i];i=-1;for(var u=Array(t+1);++i<t;)u[i]=o[i];return u[t]=n(c),r(e,this,u)}}},function(e,t,n){var r=n(722),a=n(724)(r);e.exports=a},function(e,t){!function(e){!function(t){var n=\"URLSearchParams\"in e,r=\"Symbol\"in e&&\"iterator\"in Symbol,a=\"FileReader\"in e&&\"Blob\"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),o=\"FormData\"in e,i=\"ArrayBuffer\"in e;if(i)var s=[\"[object Int8Array]\",\"[object Uint8Array]\",\"[object Uint8ClampedArray]\",\"[object Int16Array]\",\"[object Uint16Array]\",\"[object Int32Array]\",\"[object Uint32Array]\",\"[object Float32Array]\",\"[object Float64Array]\"],c=ArrayBuffer.isView||function(e){return e&&s.indexOf(Object.prototype.toString.call(e))>-1};function u(e){if(\"string\"!=typeof e&&(e=String(e)),/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(e))throw new TypeError(\"Invalid character in header field name\");return e.toLowerCase()}function l(e){return\"string\"!=typeof e&&(e=String(e)),e}function p(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return r&&(t[Symbol.iterator]=function(){return t}),t}function f(e){this.map={},e instanceof f?e.forEach((function(e,t){this.append(t,e)}),this):Array.isArray(e)?e.forEach((function(e){this.append(e[0],e[1])}),this):e&&Object.getOwnPropertyNames(e).forEach((function(t){this.append(t,e[t])}),this)}function d(e){if(e.bodyUsed)return Promise.reject(new TypeError(\"Already read\"));e.bodyUsed=!0}function h(e){return new Promise((function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}}))}function m(e){var t=new FileReader,n=h(t);return t.readAsArrayBuffer(e),n}function v(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function g(){return this.bodyUsed=!1,this._initBody=function(e){var t;this._bodyInit=e,e?\"string\"==typeof e?this._bodyText=e:a&&Blob.prototype.isPrototypeOf(e)?this._bodyBlob=e:o&&FormData.prototype.isPrototypeOf(e)?this._bodyFormData=e:n&&URLSearchParams.prototype.isPrototypeOf(e)?this._bodyText=e.toString():i&&a&&((t=e)&&DataView.prototype.isPrototypeOf(t))?(this._bodyArrayBuffer=v(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):i&&(ArrayBuffer.prototype.isPrototypeOf(e)||c(e))?this._bodyArrayBuffer=v(e):this._bodyText=e=Object.prototype.toString.call(e):this._bodyText=\"\",this.headers.get(\"content-type\")||(\"string\"==typeof e?this.headers.set(\"content-type\",\"text/plain;charset=UTF-8\"):this._bodyBlob&&this._bodyBlob.type?this.headers.set(\"content-type\",this._bodyBlob.type):n&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"))},a&&(this.blob=function(){var e=d(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error(\"could not read FormData body as blob\");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?d(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(m)}),this.text=function(){var e,t,n,r=d(this);if(r)return r;if(this._bodyBlob)return e=this._bodyBlob,t=new FileReader,n=h(t),t.readAsText(e),n;if(this._bodyArrayBuffer)return Promise.resolve(function(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join(\"\")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error(\"could not read FormData body as text\");return Promise.resolve(this._bodyText)},o&&(this.formData=function(){return this.text().then(E)}),this.json=function(){return this.text().then(JSON.parse)},this}f.prototype.append=function(e,t){e=u(e),t=l(t);var n=this.map[e];this.map[e]=n?n+\", \"+t:t},f.prototype.delete=function(e){delete this.map[u(e)]},f.prototype.get=function(e){return e=u(e),this.has(e)?this.map[e]:null},f.prototype.has=function(e){return this.map.hasOwnProperty(u(e))},f.prototype.set=function(e,t){this.map[u(e)]=l(t)},f.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},f.prototype.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),p(e)},f.prototype.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),p(e)},f.prototype.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),p(e)},r&&(f.prototype[Symbol.iterator]=f.prototype.entries);var y=[\"DELETE\",\"GET\",\"HEAD\",\"OPTIONS\",\"POST\",\"PUT\"];function b(e,t){var n,r,a=(t=t||{}).body;if(e instanceof b){if(e.bodyUsed)throw new TypeError(\"Already read\");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new f(e.headers)),this.method=e.method,this.mode=e.mode,this.signal=e.signal,a||null==e._bodyInit||(a=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||\"same-origin\",!t.headers&&this.headers||(this.headers=new f(t.headers)),this.method=(n=t.method||this.method||\"GET\",r=n.toUpperCase(),y.indexOf(r)>-1?r:n),this.mode=t.mode||this.mode||null,this.signal=t.signal||this.signal,this.referrer=null,(\"GET\"===this.method||\"HEAD\"===this.method)&&a)throw new TypeError(\"Body not allowed for GET or HEAD requests\");this._initBody(a)}function E(e){var t=new FormData;return e.trim().split(\"&\").forEach((function(e){if(e){var n=e.split(\"=\"),r=n.shift().replace(/\\+/g,\" \"),a=n.join(\"=\").replace(/\\+/g,\" \");t.append(decodeURIComponent(r),decodeURIComponent(a))}})),t}function x(e,t){t||(t={}),this.type=\"default\",this.status=void 0===t.status?200:t.status,this.ok=this.status>=200&&this.status<300,this.statusText=\"statusText\"in t?t.statusText:\"OK\",this.headers=new f(t.headers),this.url=t.url||\"\",this._initBody(e)}b.prototype.clone=function(){return new b(this,{body:this._bodyInit})},g.call(b.prototype),g.call(x.prototype),x.prototype.clone=function(){return new x(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new f(this.headers),url:this.url})},x.error=function(){var e=new x(null,{status:0,statusText:\"\"});return e.type=\"error\",e};var S=[301,302,303,307,308];x.redirect=function(e,t){if(-1===S.indexOf(t))throw new RangeError(\"Invalid status code\");return new x(null,{status:t,headers:{location:e}})},t.DOMException=e.DOMException;try{new t.DOMException}catch(e){t.DOMException=function(e,t){this.message=e,this.name=t;var n=Error(e);this.stack=n.stack},t.DOMException.prototype=Object.create(Error.prototype),t.DOMException.prototype.constructor=t.DOMException}function w(e,n){return new Promise((function(r,o){var i=new b(e,n);if(i.signal&&i.signal.aborted)return o(new t.DOMException(\"Aborted\",\"AbortError\"));var s=new XMLHttpRequest;function c(){s.abort()}s.onload=function(){var e,t,n={status:s.status,statusText:s.statusText,headers:(e=s.getAllResponseHeaders()||\"\",t=new f,e.replace(/\\r?\\n[\\t ]+/g,\" \").split(/\\r?\\n/).forEach((function(e){var n=e.split(\":\"),r=n.shift().trim();if(r){var a=n.join(\":\").trim();t.append(r,a)}})),t)};n.url=\"responseURL\"in s?s.responseURL:n.headers.get(\"X-Request-URL\");var a=\"response\"in s?s.response:s.responseText;r(new x(a,n))},s.onerror=function(){o(new TypeError(\"Network request failed\"))},s.ontimeout=function(){o(new TypeError(\"Network request failed\"))},s.onabort=function(){o(new t.DOMException(\"Aborted\",\"AbortError\"))},s.open(i.method,i.url,!0),\"include\"===i.credentials?s.withCredentials=!0:\"omit\"===i.credentials&&(s.withCredentials=!1),\"responseType\"in s&&a&&(s.responseType=\"blob\"),i.headers.forEach((function(e,t){s.setRequestHeader(t,e)})),i.signal&&(i.signal.addEventListener(\"abort\",c),s.onreadystatechange=function(){4===s.readyState&&i.signal.removeEventListener(\"abort\",c)}),s.send(void 0===i._bodyInit?null:i._bodyInit)}))}w.polyfill=!0,e.fetch||(e.fetch=w,e.Headers=f,e.Request=b,e.Response=x),t.Headers=f,t.Request=b,t.Response=x,t.fetch=w,Object.defineProperty(t,\"__esModule\",{value:!0})}({})}(\"undefined\"!=typeof self?self:this)},function(e,t,n){\"use strict\";var r=n(21),a=n(36),o=n(163),i=n(34),s=n(58),c=n(99),u=n(112),l=n(42),p=n(82),f=n(59).f,d=n(73).forEach,h=n(43),m=n(67),v=m.set,g=m.getterFor;e.exports=function(e,t,n){var m,y=-1!==e.indexOf(\"Map\"),b=-1!==e.indexOf(\"Weak\"),E=y?\"set\":\"add\",x=a[e],S=x&&x.prototype,w={};if(h&&\"function\"==typeof x&&(b||S.forEach&&!i((function(){(new x).entries().next()})))){m=t((function(t,n){v(u(t,m,e),{type:e,collection:new x}),null!=n&&c(n,t[E],{that:t,AS_ENTRIES:y})}));var j=g(e);d([\"add\",\"clear\",\"delete\",\"forEach\",\"get\",\"has\",\"set\",\"keys\",\"values\",\"entries\"],(function(e){var t=\"add\"==e||\"set\"==e;!(e in S)||b&&\"clear\"==e||s(m.prototype,e,(function(n,r){var a=j(this).collection;if(!t&&b&&!l(n))return\"get\"==e&&void 0;var o=a[e](0===n?0:n,r);return t?this:o}))})),b||f(m.prototype,\"size\",{configurable:!0,get:function(){return j(this).collection.size}})}else m=n.getConstructor(t,e,y,E),o.REQUIRED=!0;return p(m,e,!1,!0),w[e]=m,r({global:!0,forced:!0},w),b||n.setStrong(m,e,y),m}},function(e,t,n){var r=n(34),a=n(37),o=n(81),i=a(\"iterator\");e.exports=!r((function(){var e=new URL(\"b?a=1&b=2&c=3\",\"http://a\"),t=e.searchParams,n=\"\";return e.pathname=\"c%20d\",t.forEach((function(e,r){t.delete(\"b\"),n+=r+e})),o&&!e.toJSON||!t.sort||\"http://a/c%20d?a=1&c=3\"!==e.href||\"3\"!==t.get(\"c\")||\"a=1\"!==String(new URLSearchParams(\"?a=1\"))||!t[i]||\"a\"!==new URL(\"https://a@b\").username||\"b\"!==new URLSearchParams(new URLSearchParams(\"a=b\")).get(\"a\")||\"xn--e1aybc\"!==new URL(\"http://тест\").host||\"#%D0%B1\"!==new URL(\"http://a#б\").hash||\"a1c3\"!==n||\"x\"!==new URL(\"http://x\",void 0).host}))},function(e,t,n){\"use strict\";n(126);var r=n(21),a=n(61),o=n(378),i=n(93),s=n(130),c=n(82),u=n(301),l=n(67),p=n(112),f=n(49),d=n(90),h=n(83),m=n(46),v=n(42),g=n(92),y=n(88),b=n(752),E=n(127),x=n(37),S=a(\"fetch\"),w=a(\"Headers\"),j=x(\"iterator\"),O=\"URLSearchParams\",C=\"URLSearchParamsIterator\",_=l.set,A=l.getterFor(O),k=l.getterFor(C),I=/\\+/g,P=Array(4),T=function(e){return P[e-1]||(P[e-1]=RegExp(\"((?:%[\\\\da-f]{2}){\"+e+\"})\",\"gi\"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},N=function(e){var t=e.replace(I,\" \"),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(T(n--),R);return t}},M=/[!'()~]|%20/g,q={\"!\":\"%21\",\"'\":\"%27\",\"(\":\"%28\",\")\":\"%29\",\"~\":\"%7E\",\"%20\":\"+\"},D=function(e){return q[e]},B=function(e){return encodeURIComponent(e).replace(M,D)},L=function(e,t){if(t)for(var n,r,a=t.split(\"&\"),o=0;o<a.length;)(n=a[o++]).length&&(r=n.split(\"=\"),e.push({key:N(r.shift()),value:N(r.join(\"=\"))}))},U=function(e){this.entries.length=0,L(this.entries,e)},V=function(e,t){if(e<t)throw TypeError(\"Not enough arguments\")},z=u((function(e,t){_(this,{type:C,iterator:b(A(e).entries),kind:t})}),\"Iterator\",(function(){var e=k(this),t=e.kind,n=e.iterator.next(),r=n.value;return n.done||(n.value=\"keys\"===t?r.key:\"values\"===t?r.value:[r.key,r.value]),n})),F=function(){p(this,F,O);var e,t,n,r,a,o,i,s,c,u=arguments.length>0?arguments[0]:void 0,l=this,d=[];if(_(l,{type:O,entries:d,updateURL:function(){},updateSearchParams:U}),void 0!==u)if(v(u))if(\"function\"==typeof(e=E(u)))for(n=(t=e.call(u)).next;!(r=n.call(t)).done;){if((i=(o=(a=b(m(r.value))).next).call(a)).done||(s=o.call(a)).done||!o.call(a).done)throw TypeError(\"Expected sequence with length 2\");d.push({key:i.value+\"\",value:s.value+\"\"})}else for(c in u)f(u,c)&&d.push({key:c,value:u[c]+\"\"});else L(d,\"string\"==typeof u?\"?\"===u.charAt(0)?u.slice(1):u:u+\"\")},J=F.prototype;s(J,{append:function(e,t){V(arguments.length,2);var n=A(this);n.entries.push({key:e+\"\",value:t+\"\"}),n.updateURL()},delete:function(e){V(arguments.length,1);for(var t=A(this),n=t.entries,r=e+\"\",a=0;a<n.length;)n[a].key===r?n.splice(a,1):a++;t.updateURL()},get:function(e){V(arguments.length,1);for(var t=A(this).entries,n=e+\"\",r=0;r<t.length;r++)if(t[r].key===n)return t[r].value;return null},getAll:function(e){V(arguments.length,1);for(var t=A(this).entries,n=e+\"\",r=[],a=0;a<t.length;a++)t[a].key===n&&r.push(t[a].value);return r},has:function(e){V(arguments.length,1);for(var t=A(this).entries,n=e+\"\",r=0;r<t.length;)if(t[r++].key===n)return!0;return!1},set:function(e,t){V(arguments.length,1);for(var n,r=A(this),a=r.entries,o=!1,i=e+\"\",s=t+\"\",c=0;c<a.length;c++)(n=a[c]).key===i&&(o?a.splice(c--,1):(o=!0,n.value=s));o||a.push({key:i,value:s}),r.updateURL()},sort:function(){var e,t,n,r=A(this),a=r.entries,o=a.slice();for(a.length=0,n=0;n<o.length;n++){for(e=o[n],t=0;t<n;t++)if(a[t].key>e.key){a.splice(t,0,e);break}t===n&&a.push(e)}r.updateURL()},forEach:function(e){for(var t,n=A(this).entries,r=d(e,arguments.length>1?arguments[1]:void 0,3),a=0;a<n.length;)r((t=n[a++]).value,t.key,this)},keys:function(){return new z(this,\"keys\")},values:function(){return new z(this,\"values\")},entries:function(){return new z(this,\"entries\")}},{enumerable:!0}),i(J,j,J.entries),i(J,\"toString\",(function(){for(var e,t=A(this).entries,n=[],r=0;r<t.length;)e=t[r++],n.push(B(e.key)+\"=\"+B(e.value));return n.join(\"&\")}),{enumerable:!0}),c(F,O),r({global:!0,forced:!o},{URLSearchParams:F}),o||\"function\"!=typeof S||\"function\"!=typeof w||r({global:!0,enumerable:!0,forced:!0},{fetch:function(e){var t,n,r,a=[e];return arguments.length>1&&(v(t=arguments[1])&&(n=t.body,h(n)===O&&((r=t.headers?new w(t.headers):new w).has(\"content-type\")||r.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"),t=g(t,{body:y(0,String(n)),headers:y(0,r)}))),a.push(t)),S.apply(this,a)}}),e.exports={URLSearchParams:F,getState:A}},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwcHgiICBoZWlnaHQ9IjIwMHB4IiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGNsYXNzPSJsZHMtcm9sbGluZyIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IGJhY2tncm91bmQtcG9zaXRpb246IGluaXRpYWwgaW5pdGlhbDsgYmFja2dyb3VuZC1yZXBlYXQ6IGluaXRpYWwgaW5pdGlhbDsiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIGZpbGw9Im5vbmUiIG5nLWF0dHItc3Ryb2tlPSJ7e2NvbmZpZy5jb2xvcn19IiBuZy1hdHRyLXN0cm9rZS13aWR0aD0ie3tjb25maWcud2lkdGh9fSIgbmctYXR0ci1yPSJ7e2NvbmZpZy5yYWRpdXN9fSIgbmctYXR0ci1zdHJva2UtZGFzaGFycmF5PSJ7e2NvbmZpZy5kYXNoYXJyYXl9fSIgc3Ryb2tlPSIjNTU1NTU1IiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgY2FsY01vZGU9ImxpbmVhciIgdmFsdWVzPSIwIDUwIDUwOzM2MCA1MCA1MCIga2V5VGltZXM9IjA7MSIgZHVyPSIxcyIgYmVnaW49IjBzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvY2lyY2xlPjwvc3ZnPgo=\"},function(e,t){e.exports=require(\"redux-immutable\")},function(e,t,n){\"use strict\";var r=\"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};function a(e){return null===e?\"null\":void 0===e?\"undefined\":\"object\"===(void 0===e?\"undefined\":r(e))?Array.isArray(e)?\"array\":\"object\":void 0===e?\"undefined\":r(e)}function o(e){return\"object\"===a(e)?s(e):\"array\"===a(e)?i(e):e}function i(e){return e.map(o)}function s(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=o(e[n]));return t}function c(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={arrayBehaviour:n.arrayBehaviour||\"replace\"},o=t.map((function(e){return e||{}})),u=e||{},l=0;l<o.length;l++)for(var p=o[l],f=Object.keys(p),d=0;d<f.length;d++){var h=f[d],m=p[h],v=a(m),g=a(u[h]);if(\"object\"===v)if(\"undefined\"!==g){var y=\"object\"===g?u[h]:{};u[h]=c({},[y,s(m)],r)}else u[h]=s(m);else if(\"array\"===v)if(\"array\"===g){var b=i(m);u[h]=\"merge\"===r.arrayBehaviour?u[h].concat(b):b}else u[h]=i(m);else u[h]=m}return u}e.exports=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return c(e,n)},e.exports.noMutate=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return c({},t)},e.exports.withOptions=function(e,t,n){return c(e,t,n)}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.sanitizeUrl=void 0;var r=/^([^\\w]*)(javascript|data|vbscript)/im,a=/[\\u0000-\\u001F\\u007F-\\u009F\\u2000-\\u200D\\uFEFF]/gim,o=/^([^:]+):/gm,i=[\".\",\"/\"];t.sanitizeUrl=function(e){if(!e)return\"about:blank\";var t=e.replace(a,\"\").trim();if(function(e){return i.indexOf(e[0])>-1}(t))return t;var n=t.match(o);if(!n)return t;var s=n[0];return r.test(s)?\"about:blank\":t}},function(e,t,n){var r=n(538),a=n(546)((function(e,t,n){return t=t.toLowerCase(),e+(n?r(t):t)}));e.exports=a},function(e,t,n){(function(t){var r=n(622),a=n(623).Stream;function o(e,t,n){n=n||0;var a,i,s=(a=t,new Array(n||0).join(a||\"\")),c=e;if(\"object\"==typeof e&&((c=e[i=Object.keys(e)[0]])&&c._elem))return c._elem.name=i,c._elem.icount=n,c._elem.indent=t,c._elem.indents=s,c._elem.interrupt=c,c._elem;var u,l=[],p=[];function f(e){Object.keys(e).forEach((function(t){l.push(function(e,t){return e+'=\"'+r(t)+'\"'}(t,e[t]))}))}switch(typeof c){case\"object\":if(null===c)break;c._attr&&f(c._attr),c._cdata&&p.push((\"<![CDATA[\"+c._cdata).replace(/\\]\\]>/g,\"]]]]><![CDATA[>\")+\"]]>\"),c.forEach&&(u=!1,p.push(\"\"),c.forEach((function(e){\"object\"==typeof e?\"_attr\"==Object.keys(e)[0]?f(e._attr):p.push(o(e,t,n+1)):(p.pop(),u=!0,p.push(r(e)))})),u||p.push(\"\"));break;default:p.push(r(c))}return{name:i,interrupt:!1,attributes:l,content:p,icount:n,indents:s,indent:t}}function i(e,t,n){if(\"object\"!=typeof t)return e(!1,t);var r=t.interrupt?1:t.content.length;function a(){for(;t.content.length;){var a=t.content.shift();if(void 0!==a){if(o(a))return;i(e,a)}}e(!1,(r>1?t.indents:\"\")+(t.name?\"</\"+t.name+\">\":\"\")+(t.indent&&!n?\"\\n\":\"\")),n&&n()}function o(t){return!!t.interrupt&&(t.interrupt.append=e,t.interrupt.end=a,t.interrupt=!1,e(!0),!0)}if(e(!1,t.indents+(t.name?\"<\"+t.name:\"\")+(t.attributes.length?\" \"+t.attributes.join(\" \"):\"\")+(r?t.name?\">\":\"\":t.name?\"/>\":\"\")+(t.indent&&r>1?\"\\n\":\"\")),!r)return e(!1,t.indent?\"\\n\":\"\");o(t)||a()}e.exports=function(e,n){\"object\"!=typeof n&&(n={indent:n});var r,s,c=n.stream?new a:null,u=\"\",l=!1,p=n.indent?!0===n.indent?\"    \":n.indent:\"\",f=!0;function d(e){f?t.nextTick(e):e()}function h(e,t){if(void 0!==t&&(u+=t),e&&!l&&(c=c||new a,l=!0),e&&l){var n=u;d((function(){c.emit(\"data\",n)})),u=\"\"}}function m(e,t){i(h,o(e,p,p?1:0),t)}function v(){if(c){var e=u;d((function(){c.emit(\"data\",e),c.emit(\"end\"),c.readable=!1,c.emit(\"close\")}))}}return d((function(){f=!1})),n.declaration&&(r=n.declaration,s={version:\"1.0\",encoding:r.encoding||\"UTF-8\"},r.standalone&&(s.standalone=r.standalone),m({\"?xml\":{_attr:s}}),u=u.replace(\"/>\",\"?>\")),e&&e.forEach?e.forEach((function(t,n){var r;n+1===e.length&&(r=v),m(t,r)})):m(e,v),c?(c.readable=!0,c):u},e.exports.element=e.exports.Element=function(){var e=Array.prototype.slice.call(arguments),t={_elem:o(e),push:function(e){if(!this.append)throw new Error(\"not assigned to a parent!\");var t=this,n=this._elem.indent;i(this.append,o(e,n,this._elem.icount+(n?1:0)),(function(){t.append(!0)}))},close:function(e){void 0!==e&&this.push(e),this.end&&this.end()}};return t}}).call(this,n(621))},function(e,t){e.exports=require(\"css.escape\")},function(e,t){e.exports=require(\"randombytes\")},function(e,t){e.exports=require(\"sha.js\")},function(e,t,n){var r=n(332),a=n(349),o=n(156),i=n(628),s=n(45);e.exports=function(e,t,n){var c=s(e)?r:i,u=arguments.length<3;return c(e,o(t,4),n,u,a)}},function(e,t,n){var r=n(50),a=n(672),o=n(348),i=Math.max,s=Math.min;e.exports=function(e,t,n){var c,u,l,p,f,d,h=0,m=!1,v=!1,g=!0;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");function y(t){var n=c,r=u;return c=u=void 0,h=t,p=e.apply(r,n)}function b(e){return h=e,f=setTimeout(x,t),m?y(e):p}function E(e){var n=e-d;return void 0===d||n>=t||n<0||v&&e-h>=l}function x(){var e=a();if(E(e))return S(e);f=setTimeout(x,function(e){var n=t-(e-d);return v?s(n,l-(e-h)):n}(e))}function S(e){return f=void 0,g&&c?y(e):(c=u=void 0,p)}function w(){var e=a(),n=E(e);if(c=arguments,u=this,d=e,n){if(void 0===f)return b(d);if(v)return clearTimeout(f),f=setTimeout(x,t),y(d)}return void 0===f&&(f=setTimeout(x,t)),p}return t=o(t)||0,r(n)&&(m=!!n.leading,l=(v=\"maxWait\"in n)?i(o(n.maxWait)||0,t):l,g=\"trailing\"in n?!!n.trailing:g),w.cancel=function(){void 0!==f&&clearTimeout(f),h=0,c=d=u=f=void 0},w.flush=function(){return void 0===f?p:S(a())},w}},function(e,t){e.exports=require(\"react-dom\")},function(e,t,n){var r=n(329),a=n(370),o=n(714),i=n(110),s=n(113),c=n(717),u=n(373),l=n(372),p=u((function(e,t){var n={};if(null==e)return n;var u=!1;t=r(t,(function(t){return t=i(t,e),u||(u=t.length>1),t})),s(e,l(e),n),u&&(n=a(n,7,c));for(var p=t.length;p--;)o(n,t[p]);return n}));e.exports=p},function(e,t,n){e.exports=n(725)},function(e,t){e.exports=function(e){const t={literal:\"true false null\"},n=[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],r=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],a={end:\",\",endsWithParent:!0,excludeEnd:!0,contains:r,keywords:t},o={begin:/\\{/,end:/\\}/,contains:[{className:\"attr\",begin:/\"/,end:/\"/,contains:[e.BACKSLASH_ESCAPE],illegal:\"\\\\n\"},e.inherit(a,{begin:/:/})].concat(n),illegal:\"\\\\S\"},i={begin:\"\\\\[\",end:\"\\\\]\",contains:[e.inherit(a)],illegal:\"\\\\S\"};return r.push(o,i),n.forEach((function(e){r.push(e)})),{name:\"JSON\",contains:r,keywords:t,illegal:\"\\\\S\"}}},function(e,t){const n=\"[A-Za-z$_][0-9A-Za-z$_]*\",r=[\"as\",\"in\",\"of\",\"if\",\"for\",\"while\",\"finally\",\"var\",\"new\",\"function\",\"do\",\"return\",\"void\",\"else\",\"break\",\"catch\",\"instanceof\",\"with\",\"throw\",\"case\",\"default\",\"try\",\"switch\",\"continue\",\"typeof\",\"delete\",\"let\",\"yield\",\"const\",\"class\",\"debugger\",\"async\",\"await\",\"static\",\"import\",\"from\",\"export\",\"extends\"],a=[\"true\",\"false\",\"null\",\"undefined\",\"NaN\",\"Infinity\"],o=[].concat([\"setInterval\",\"setTimeout\",\"clearInterval\",\"clearTimeout\",\"require\",\"exports\",\"eval\",\"isFinite\",\"isNaN\",\"parseFloat\",\"parseInt\",\"decodeURI\",\"decodeURIComponent\",\"encodeURI\",\"encodeURIComponent\",\"escape\",\"unescape\"],[\"arguments\",\"this\",\"super\",\"console\",\"window\",\"document\",\"localStorage\",\"module\",\"global\"],[\"Intl\",\"DataView\",\"Number\",\"Math\",\"Date\",\"String\",\"RegExp\",\"Object\",\"Function\",\"Boolean\",\"Error\",\"Symbol\",\"Set\",\"Map\",\"WeakSet\",\"WeakMap\",\"Proxy\",\"Reflect\",\"JSON\",\"Promise\",\"Float64Array\",\"Int16Array\",\"Int32Array\",\"Int8Array\",\"Uint16Array\",\"Uint32Array\",\"Float32Array\",\"Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"ArrayBuffer\"],[\"EvalError\",\"InternalError\",\"RangeError\",\"ReferenceError\",\"SyntaxError\",\"TypeError\",\"URIError\"]);function i(e){return s(\"(?=\",e,\")\")}function s(...e){return e.map((e=>{return(t=e)?\"string\"==typeof t?t:t.source:null;var t})).join(\"\")}e.exports=function(e){const t=n,c=\"<>\",u=\"</>\",l={begin:/<[A-Za-z0-9\\\\._:-]+/,end:/\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,isTrulyOpeningTag:(e,t)=>{const n=e[0].length+e.index,r=e.input[n];\"<\"!==r?\">\"===r&&(((e,{after:t})=>{const n=\"</\"+e[0].slice(1);return-1!==e.input.indexOf(n,t)})(e,{after:n})||t.ignoreMatch()):t.ignoreMatch()}},p={$pattern:n,keyword:r.join(\" \"),literal:a.join(\" \"),built_in:o.join(\" \")},f=\"\\\\.([0-9](_?[0-9])*)\",d=\"0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*\",h={className:\"number\",variants:[{begin:`(\\\\b(${d})((${f})|\\\\.)?|(${f}))[eE][+-]?([0-9](_?[0-9])*)\\\\b`},{begin:`\\\\b(${d})\\\\b((${f})\\\\b|\\\\.)?|(${f})\\\\b`},{begin:\"\\\\b(0|[1-9](_?[0-9])*)n\\\\b\"},{begin:\"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\"},{begin:\"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\"},{begin:\"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\"},{begin:\"\\\\b0[0-7]+n?\\\\b\"}],relevance:0},m={className:\"subst\",begin:\"\\\\$\\\\{\",end:\"\\\\}\",keywords:p,contains:[]},v={begin:\"html`\",end:\"\",starts:{end:\"`\",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,m],subLanguage:\"xml\"}},g={begin:\"css`\",end:\"\",starts:{end:\"`\",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,m],subLanguage:\"css\"}},y={className:\"string\",begin:\"`\",end:\"`\",contains:[e.BACKSLASH_ESCAPE,m]},b={className:\"comment\",variants:[e.COMMENT(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,contains:[{className:\"doctag\",begin:\"@[A-Za-z]+\",contains:[{className:\"type\",begin:\"\\\\{\",end:\"\\\\}\",relevance:0},{className:\"variable\",begin:t+\"(?=\\\\s*(-)|$)\",endsParent:!0,relevance:0},{begin:/(?=[^\\n])\\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},E=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,v,g,y,h,e.REGEXP_MODE];m.contains=E.concat({begin:/\\{/,end:/\\}/,keywords:p,contains:[\"self\"].concat(E)});const x=[].concat(b,m.contains),S=x.concat([{begin:/\\(/,end:/\\)/,keywords:p,contains:[\"self\"].concat(x)}]),w={className:\"params\",begin:/\\(/,end:/\\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:S};return{name:\"Javascript\",aliases:[\"js\",\"jsx\",\"mjs\",\"cjs\"],keywords:p,exports:{PARAMS_CONTAINS:S},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:\"shebang\",binary:\"node\",relevance:5}),{label:\"use_strict\",className:\"meta\",relevance:10,begin:/^\\s*['\"]use (strict|asm)['\"]/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,v,g,y,b,h,{begin:s(/[{,\\n]\\s*/,i(s(/(((\\/\\/.*$)|(\\/\\*(\\*[^/]|[^*])*\\*\\/))\\s*)*/,t+\"\\\\s*:\"))),relevance:0,contains:[{className:\"attr\",begin:t+i(\"\\\\s*:\"),relevance:0}]},{begin:\"(\"+e.RE_STARTERS_RE+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",keywords:\"return throw case\",contains:[b,e.REGEXP_MODE,{className:\"function\",begin:\"(\\\\([^()]*(\\\\([^()]*(\\\\([^()]*\\\\)[^()]*)*\\\\)[^()]*)*\\\\)|\"+e.UNDERSCORE_IDENT_RE+\")\\\\s*=>\",returnBegin:!0,end:\"\\\\s*=>\",contains:[{className:\"params\",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\\(\\s*\\)/,skip:!0},{begin:/\\(/,end:/\\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:S}]}]},{begin:/,/,relevance:0},{className:\"\",begin:/\\s/,end:/\\s*/,skip:!0},{variants:[{begin:c,end:u},{begin:l.begin,\"on:begin\":l.isTrulyOpeningTag,end:l.end}],subLanguage:\"xml\",contains:[{begin:l.begin,end:l.end,skip:!0,contains:[\"self\"]}]}],relevance:0},{className:\"function\",beginKeywords:\"function\",end:/[{;]/,excludeEnd:!0,keywords:p,contains:[\"self\",e.inherit(e.TITLE_MODE,{begin:t}),w],illegal:/%/},{beginKeywords:\"while if switch catch for\"},{className:\"function\",begin:e.UNDERSCORE_IDENT_RE+\"\\\\([^()]*(\\\\([^()]*(\\\\([^()]*\\\\)[^()]*)*\\\\)[^()]*)*\\\\)\\\\s*\\\\{\",returnBegin:!0,contains:[w,e.inherit(e.TITLE_MODE,{begin:t})]},{variants:[{begin:\"\\\\.\"+t},{begin:\"\\\\$\"+t}],relevance:0},{className:\"class\",beginKeywords:\"class\",end:/[{;=]/,excludeEnd:!0,illegal:/[:\"[\\]]/,contains:[{beginKeywords:\"extends\"},e.UNDERSCORE_TITLE_MODE]},{begin:/\\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:t}),\"self\",w]},{begin:\"(get|set)\\\\s+(?=\"+t+\"\\\\()\",end:/\\{/,keywords:\"get set\",contains:[e.inherit(e.TITLE_MODE,{begin:t}),{begin:/\\(\\)/},w]},{begin:/\\$[(.]/}]}}},function(e,t){function n(e){return e?\"string\"==typeof e?e:e.source:null}function r(e){return a(\"(?=\",e,\")\")}function a(...e){return e.map((e=>n(e))).join(\"\")}function o(...e){return\"(\"+e.map((e=>n(e))).join(\"|\")+\")\"}e.exports=function(e){const t=a(/[A-Z_]/,a(\"(\",/[A-Z0-9_.-]+:/,\")?\"),/[A-Z0-9_.-]*/),n={className:\"symbol\",begin:\"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;\"},i={begin:\"\\\\s\",contains:[{className:\"meta-keyword\",begin:\"#?[a-z_][a-z1-9_-]+\",illegal:\"\\\\n\"}]},s=e.inherit(i,{begin:\"\\\\(\",end:\"\\\\)\"}),c=e.inherit(e.APOS_STRING_MODE,{className:\"meta-string\"}),u=e.inherit(e.QUOTE_STRING_MODE,{className:\"meta-string\"}),l={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:\"attr\",begin:\"[A-Za-z0-9\\\\._:-]+\",relevance:0},{begin:/=\\s*/,relevance:0,contains:[{className:\"string\",endsParent:!0,variants:[{begin:/\"/,end:/\"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\\s\"'=<>`]+/}]}]}]};return{name:\"HTML, XML\",aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\",\"wsf\",\"svg\"],case_insensitive:!0,contains:[{className:\"meta\",begin:\"<![a-z]\",end:\">\",relevance:10,contains:[i,u,c,s,{begin:\"\\\\[\",end:\"\\\\]\",contains:[{className:\"meta\",begin:\"<![a-z]\",end:\">\",contains:[i,s,u,c]}]}]},e.COMMENT(\"\\x3c!--\",\"--\\x3e\",{relevance:10}),{begin:\"<!\\\\[CDATA\\\\[\",end:\"\\\\]\\\\]>\",relevance:10},n,{className:\"meta\",begin:/<\\?xml/,end:/\\?>/,relevance:10},{className:\"tag\",begin:\"<style(?=\\\\s|>)\",end:\">\",keywords:{name:\"style\"},contains:[l],starts:{end:\"</style>\",returnEnd:!0,subLanguage:[\"css\",\"xml\"]}},{className:\"tag\",begin:\"<script(?=\\\\s|>)\",end:\">\",keywords:{name:\"script\"},contains:[l],starts:{end:/<\\/script>/,returnEnd:!0,subLanguage:[\"javascript\",\"handlebars\",\"xml\"]}},{className:\"tag\",begin:/<>|<\\/>/},{className:\"tag\",begin:a(/</,r(a(t,o(/\\/>/,/>/,/\\s/)))),end:/\\/?>/,contains:[{className:\"name\",begin:t,relevance:0,starts:l}]},{className:\"tag\",begin:a(/<\\//,r(a(t,/>/))),contains:[{className:\"name\",begin:t,relevance:0},{begin:/>/,relevance:0}]}]}}},function(e,t){e.exports=function(e){var t=\"true false yes no null\",n=\"[\\\\w#;/?:@&=+$,.~*'()[\\\\]]+\",r={className:\"string\",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/\"/,end:/\"/},{begin:/\\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:\"template-variable\",variants:[{begin:/\\{\\{/,end:/\\}\\}/},{begin:/%\\{/,end:/\\}/}]}]},a=e.inherit(r,{variants:[{begin:/'/,end:/'/},{begin:/\"/,end:/\"/},{begin:/[^\\s,{}[\\]]+/}]}),o={className:\"number\",begin:\"\\\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\\\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\\\.[0-9]*)?([ \\\\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\\\b\"},i={end:\",\",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:t,relevance:0},s={begin:/\\{/,end:/\\}/,contains:[i],illegal:\"\\\\n\",relevance:0},c={begin:\"\\\\[\",end:\"\\\\]\",contains:[i],illegal:\"\\\\n\",relevance:0},u=[{className:\"attr\",variants:[{begin:\"\\\\w[\\\\w :\\\\/.-]*:(?=[ \\t]|$)\"},{begin:'\"\\\\w[\\\\w :\\\\/.-]*\":(?=[ \\t]|$)'},{begin:\"'\\\\w[\\\\w :\\\\/.-]*':(?=[ \\t]|$)\"}]},{className:\"meta\",begin:\"^---\\\\s*$\",relevance:10},{className:\"string\",begin:\"[\\\\|>]([1-9]?[+-])?[ ]*\\\\n( +)[^ ][^\\\\n]*\\\\n(\\\\2[^\\\\n]+\\\\n?)*\"},{begin:\"<%[%=-]?\",end:\"[%-]?%>\",subLanguage:\"ruby\",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:\"type\",begin:\"!\\\\w+!\"+n},{className:\"type\",begin:\"!<\"+n+\">\"},{className:\"type\",begin:\"!\"+n},{className:\"type\",begin:\"!!\"+n},{className:\"meta\",begin:\"&\"+e.UNDERSCORE_IDENT_RE+\"$\"},{className:\"meta\",begin:\"\\\\*\"+e.UNDERSCORE_IDENT_RE+\"$\"},{className:\"bullet\",begin:\"-(?=[ ]|$)\",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},o,{className:\"number\",begin:e.C_NUMBER_RE+\"\\\\b\",relevance:0},s,c,r],l=[...u];return l.pop(),l.push(a),i.contains=l,{name:\"YAML\",case_insensitive:!0,aliases:[\"yml\",\"YAML\"],contains:u}}},function(e,t){e.exports=function(e){var t=\"HTTP/[0-9\\\\.]+\";return{name:\"HTTP\",aliases:[\"https\"],illegal:\"\\\\S\",contains:[{begin:\"^\"+t,end:\"$\",contains:[{className:\"number\",begin:\"\\\\b\\\\d{3}\\\\b\"}]},{begin:\"^[A-Z]+ (.*?) \"+t+\"$\",returnBegin:!0,end:\"$\",contains:[{className:\"string\",begin:\" \",end:\" \",excludeBegin:!0,excludeEnd:!0},{begin:t},{className:\"keyword\",begin:\"[A-Z]+\"}]},{className:\"attribute\",begin:\"^\\\\w\",end:\": \",excludeEnd:!0,illegal:\"\\\\n|\\\\s|=\",starts:{end:\"$\",relevance:0}},{begin:\"\\\\n\\\\n\",starts:{subLanguage:[],endsWithParent:!0}}]}}},function(e,t){function n(...e){return e.map((e=>{return(t=e)?\"string\"==typeof t?t:t.source:null;var t})).join(\"\")}e.exports=function(e){const t={},r={begin:/\\$\\{/,end:/\\}/,contains:[\"self\",{begin:/:-/,contains:[t]}]};Object.assign(t,{className:\"variable\",variants:[{begin:n(/\\$[\\w\\d#@][\\w\\d_]*/,\"(?![\\\\w\\\\d])(?![$])\")},r]});const a={className:\"subst\",begin:/\\$\\(/,end:/\\)/,contains:[e.BACKSLASH_ESCAPE]},o={begin:/<<-?\\s*(?=\\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\\w+)/,end:/(\\w+)/,className:\"string\"})]}},i={className:\"string\",begin:/\"/,end:/\"/,contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(i);const s={begin:/\\$\\(\\(/,end:/\\)\\)/,contains:[{begin:/\\d+#[0-9a-f]+/,className:\"number\"},e.NUMBER_MODE,t]},c=e.SHEBANG({binary:`(${[\"fish\",\"bash\",\"zsh\",\"sh\",\"csh\",\"ksh\",\"tcsh\",\"dash\",\"scsh\"].join(\"|\")})`,relevance:10}),u={className:\"function\",begin:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\\w[\\w\\d_]*/})],relevance:0};return{name:\"Bash\",aliases:[\"sh\",\"zsh\"],keywords:{$pattern:/\\b[a-z._-]+\\b/,keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\"},contains:[c,e.SHEBANG(),u,s,e.HASH_COMMENT_MODE,o,i,{className:\"\",begin:/\\\\\"/},{className:\"string\",begin:/'/,end:/'/},t]}}},function(e,t){e.exports=function(e){const t={$pattern:/-?[A-z\\.\\-]+\\b/,keyword:\"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter\",built_in:\"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write\"},n={begin:\"`[\\\\s\\\\S]\",relevance:0},r={className:\"variable\",variants:[{begin:/\\$\\B/},{className:\"keyword\",begin:/\\$this/},{begin:/\\$[\\w\\d][\\w\\d_:]*/}]},a={className:\"string\",variants:[{begin:/\"/,end:/\"/},{begin:/@\"/,end:/^\"@/}],contains:[n,r,{className:\"variable\",begin:/\\$[A-z]/,end:/[^A-z]/}]},o={className:\"string\",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},i=e.inherit(e.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,end:/#>/}],contains:[{className:\"doctag\",variants:[{begin:/\\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\\s+\\S+/}]}]}),s={className:\"built_in\",variants:[{begin:\"(\".concat(\"Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Complete|Confirm|Deny|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where\",\")+(-)[\\\\w\\\\d]+\")}]},c={className:\"class\",beginKeywords:\"class enum\",end:/\\s*[{]/,excludeEnd:!0,relevance:0,contains:[e.TITLE_MODE]},u={className:\"function\",begin:/function\\s+/,end:/\\s*\\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,contains:[{begin:\"function\",relevance:0,className:\"keyword\"},{className:\"title\",begin:/\\w[\\w\\d]*((-)[\\w\\d]+)*/,relevance:0},{begin:/\\(/,end:/\\)/,className:\"params\",relevance:0,contains:[r]}]},l={begin:/using\\s/,end:/$/,returnBegin:!0,contains:[a,o,{className:\"keyword\",begin:/(using|assembly|command|module|namespace|type)/}]},p={variants:[{className:\"operator\",begin:\"(\".concat(\"-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor\",\")\\\\b\")},{className:\"literal\",begin:/(-)[\\w\\d]+/,relevance:0}]},f={className:\"function\",begin:/\\[.*\\]\\s*[\\w]+[ ]??\\(/,end:/$/,returnBegin:!0,relevance:0,contains:[{className:\"keyword\",begin:\"(\".concat(t.keyword.toString().replace(/\\s/g,\"|\"),\")\\\\b\"),endsParent:!0,relevance:0},e.inherit(e.TITLE_MODE,{endsParent:!0})]},d=[f,i,n,e.NUMBER_MODE,a,o,s,r,{className:\"literal\",begin:/\\$(null|true|false)\\b/},{className:\"selector-tag\",begin:/@\\B/,relevance:0}],h={begin:/\\[/,end:/\\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat(\"self\",d,{begin:\"(\"+[\"string\",\"char\",\"byte\",\"int\",\"long\",\"bool\",\"decimal\",\"single\",\"double\",\"DateTime\",\"xml\",\"array\",\"hashtable\",\"void\"].join(\"|\")+\")\",className:\"built_in\",relevance:0},{className:\"type\",begin:/[\\.\\w\\d]+/,relevance:0})};return f.contains.unshift(h),{name:\"PowerShell\",aliases:[\"ps\",\"ps1\"],case_insensitive:!0,keywords:t,contains:d.concat(c,u,l,p,h)}}},function(e,t,n){e.exports=n(736)},function(e,t,n){var r=n(370);e.exports=function(e){return r(e,5)}},function(e,t,n){e.exports=n(740)},function(e,t){e.exports=require(\"traverse\")},function(e,t){e.exports=require(\"cookie\")},function(e,t){e.exports=require(\"zenscroll\")},function(e,t,n){e.exports=n(756)},function(e,t){e.exports=require(\"js-file-download\")},function(e,t,n){e.exports=n(763)},function(e,t,n){e.exports=n(766)},function(e,t){e.exports=require(\"xml-but-prettier\")},function(e,t){e.exports=require(\"react-immutable-pure-component\")},function(e,t){e.exports=require(\"autolinker\")},function(e,t,n){e.exports=n(772)},function(e,t,n){var r=n(416);n(436),n(437),n(438),n(439),n(440),n(441),n(442),e.exports=r},function(e,t,n){n(290),n(145),n(294),n(420),n(421),n(422),n(423),n(299),n(424),n(425),n(426),n(427),n(428),n(429),n(430),n(431),n(432),n(433),n(434),n(435);var r=n(31);e.exports=r.Symbol},function(e,t,n){var r=n(36),a=n(58);e.exports=function(e,t){try{a(r,e,t)}catch(n){r[e]=t}return t}},function(e,t,n){var r=n(57),a=n(192).f,o={}.toString,i=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return i&&\"[object Window]\"==o.call(e)?function(e){try{return a(e)}catch(e){return i.slice()}}(e):a(r(e))}},function(e,t,n){\"use strict\";var r=n(195),a=n(83);e.exports=r?{}.toString:function(){return\"[object \"+a(this)+\"]\"}},function(e,t,n){n(40)(\"asyncIterator\")},function(e,t){},function(e,t,n){n(40)(\"hasInstance\")},function(e,t,n){n(40)(\"isConcatSpreadable\")},function(e,t,n){n(40)(\"match\")},function(e,t,n){n(40)(\"matchAll\")},function(e,t,n){n(40)(\"replace\")},function(e,t,n){n(40)(\"search\")},function(e,t,n){n(40)(\"species\")},function(e,t,n){n(40)(\"split\")},function(e,t,n){n(40)(\"toPrimitive\")},function(e,t,n){n(40)(\"toStringTag\")},function(e,t,n){n(40)(\"unscopables\")},function(e,t,n){var r=n(36);n(82)(r.JSON,\"JSON\",!0)},function(e,t){},function(e,t){},function(e,t,n){n(40)(\"asyncDispose\")},function(e,t,n){n(40)(\"dispose\")},function(e,t,n){n(40)(\"matcher\")},function(e,t,n){n(40)(\"metadata\")},function(e,t,n){n(40)(\"observable\")},function(e,t,n){n(40)(\"patternMatch\")},function(e,t,n){n(40)(\"replaceAll\")},function(e,t,n){e.exports=n(444)},function(e,t,n){var r=n(445);e.exports=r},function(e,t,n){n(299),n(107),n(74);var r=n(194);e.exports=r.f(\"iterator\")},function(e,t,n){var r=n(42);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError(\"Can't set \"+String(e)+\" as a prototype\");return e}},function(e,t){e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(e,t,n){var r=n(449);e.exports=r},function(e,t,n){var r=n(450),a=Array.prototype;e.exports=function(e){var t=e.concat;return e===a||e instanceof Array&&t===a.concat?r:t}},function(e,t,n){n(290);var r=n(38);e.exports=r(\"Array\").concat},function(e,t,n){var r=n(304);e.exports=r},function(e,t,n){n(453);var r=n(38);e.exports=r(\"Array\").filter},function(e,t,n){\"use strict\";var r=n(21),a=n(73).filter;r({target:\"Array\",proto:!0,forced:!n(123)(\"filter\")},{filter:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(305);e.exports=r},function(e,t,n){var r=n(21),a=n(53),o=n(124);r({target:\"Object\",stat:!0,forced:n(34)((function(){o(1)}))},{keys:function(e){return o(a(e))}})},function(e,t,n){var r=n(457);e.exports=r},function(e,t,n){n(458);var r=n(31);r.JSON||(r.JSON={stringify:JSON.stringify}),e.exports=function(e,t,n){return r.JSON.stringify.apply(null,arguments)}},function(e,t,n){var r=n(21),a=n(61),o=n(34),i=a(\"JSON\",\"stringify\"),s=/[\\uD800-\\uDFFF]/g,c=/^[\\uD800-\\uDBFF]$/,u=/^[\\uDC00-\\uDFFF]$/,l=function(e,t,n){var r=n.charAt(t-1),a=n.charAt(t+1);return c.test(e)&&!u.test(a)||u.test(e)&&!c.test(r)?\"\\\\u\"+e.charCodeAt(0).toString(16):e},p=o((function(){return'\"\\\\udf06\\\\ud834\"'!==i(\"\\udf06\\ud834\")||'\"\\\\udead\"'!==i(\"\\udead\")}));i&&r({target:\"JSON\",stat:!0,forced:p},{stringify:function(e,t,n){var r=i.apply(null,arguments);return\"string\"==typeof r?r.replace(s,l):r}})},function(e,t,n){var r=n(306);e.exports=r},function(e,t,n){var r=n(21),a=n(43);r({target:\"Object\",stat:!0,forced:!a,sham:!a},{defineProperty:n(59).f})},function(e,t,n){var r=n(462);e.exports=r},function(e,t,n){var r=n(463),a=Function.prototype;e.exports=function(e){var t=e.bind;return e===a||e instanceof Function&&t===a.bind?r:t}},function(e,t,n){n(464);var r=n(38);e.exports=r(\"Function\").bind},function(e,t,n){n(21)({target:\"Function\",proto:!0},{bind:n(307)})},function(e,t,n){var r=n(308);e.exports=r},function(e,t,n){var r=n(21),a=n(309);r({target:\"Object\",stat:!0,forced:Object.assign!==a},{assign:a})},function(e,t,n){var r=n(310);e.exports=r},function(e,t,n){n(469);var r=n(38);e.exports=r(\"Array\").slice},function(e,t,n){\"use strict\";var r=n(21),a=n(42),o=n(121),i=n(190),s=n(60),c=n(57),u=n(122),l=n(37),p=n(123)(\"slice\"),f=l(\"species\"),d=[].slice,h=Math.max;r({target:\"Array\",proto:!0,forced:!p},{slice:function(e,t){var n,r,l,p=c(this),m=s(p.length),v=i(e,m),g=i(void 0===t?m:t,m);if(o(p)&&(\"function\"!=typeof(n=p.constructor)||n!==Array&&!o(n.prototype)?a(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return d.call(p,v,g);for(r=new(void 0===n?Array:n)(h(g-v,0)),l=0;v<g;v++,l++)v in p&&u(r,l,p[v]);return r.length=l,r}})},function(e,t,n){var r=n(311);e.exports=r},function(e,t,n){n(21)({target:\"Array\",stat:!0},{isArray:n(121)})},function(e,t,n){var r=n(473);e.exports=r},function(e,t,n){var r=n(474),a=Array.prototype;e.exports=function(e){var t=e.reduce;return e===a||e instanceof Array&&t===a.reduce?r:t}},function(e,t,n){n(475);var r=n(38);e.exports=r(\"Array\").reduce},function(e,t,n){\"use strict\";var r=n(21),a=n(476).left,o=n(94),i=n(106),s=n(149);r({target:\"Array\",proto:!0,forced:!o(\"reduce\")||!s&&i>79&&i<83},{reduce:function(e){return a(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(66),a=n(53),o=n(142),i=n(60),s=function(e){return function(t,n,s,c){r(n);var u=a(t),l=o(u),p=i(u.length),f=e?p-1:0,d=e?-1:1;if(s<2)for(;;){if(f in l){c=l[f],f+=d;break}if(f+=d,e?f<0:p<=f)throw TypeError(\"Reduce of empty array with no initial value\")}for(;e?f>=0:p>f;f+=d)f in l&&(c=n(c,l[f],f,u));return c}};e.exports={left:s(!1),right:s(!0)}},function(e,t,n){var r=n(478);e.exports=r},function(e,t,n){var r=n(479),a=Array.prototype;e.exports=function(e){var t=e.map;return e===a||e instanceof Array&&t===a.map?r:t}},function(e,t,n){n(480);var r=n(38);e.exports=r(\"Array\").map},function(e,t,n){\"use strict\";var r=n(21),a=n(73).map;r({target:\"Array\",proto:!0,forced:!n(123)(\"map\")},{map:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){\"use strict\";(function(e){var r=n(482),a=n(483),o=n(484);function i(){return c.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(i()<t)throw new RangeError(\"Invalid typed array length\");return c.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=c.prototype:(null===e&&(e=new c(t)),e.length=t),e}function c(e,t,n){if(!(c.TYPED_ARRAY_SUPPORT||this instanceof c))return new c(e,t,n);if(\"number\"==typeof e){if(\"string\"==typeof t)throw new Error(\"If encoding is specified then the first argument must be a string\");return p(this,e)}return u(this,e,t,n)}function u(e,t,n,r){if(\"number\"==typeof t)throw new TypeError('\"value\" argument must not be a number');return\"undefined\"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,n,r){if(t.byteLength,n<0||t.byteLength<n)throw new RangeError(\"'offset' is out of bounds\");if(t.byteLength<n+(r||0))throw new RangeError(\"'length' is out of bounds\");t=void 0===n&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,n):new Uint8Array(t,n,r);c.TYPED_ARRAY_SUPPORT?(e=t).__proto__=c.prototype:e=f(e,t);return e}(e,t,n,r):\"string\"==typeof t?function(e,t,n){\"string\"==typeof n&&\"\"!==n||(n=\"utf8\");if(!c.isEncoding(n))throw new TypeError('\"encoding\" must be a valid string encoding');var r=0|h(t,n),a=(e=s(e,r)).write(t,n);a!==r&&(e=e.slice(0,a));return e}(e,t,n):function(e,t){if(c.isBuffer(t)){var n=0|d(t.length);return 0===(e=s(e,n)).length||t.copy(e,0,0,n),e}if(t){if(\"undefined\"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||\"length\"in t)return\"number\"!=typeof t.length||(r=t.length)!=r?s(e,0):f(e,t);if(\"Buffer\"===t.type&&o(t.data))return f(e,t.data)}var r;throw new TypeError(\"First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.\")}(e,t)}function l(e){if(\"number\"!=typeof e)throw new TypeError('\"size\" argument must be a number');if(e<0)throw new RangeError('\"size\" argument must not be negative')}function p(e,t){if(l(t),e=s(e,t<0?0:0|d(t)),!c.TYPED_ARRAY_SUPPORT)for(var n=0;n<t;++n)e[n]=0;return e}function f(e,t){var n=t.length<0?0:0|d(t.length);e=s(e,n);for(var r=0;r<n;r+=1)e[r]=255&t[r];return e}function d(e){if(e>=i())throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+i().toString(16)+\" bytes\");return 0|e}function h(e,t){if(c.isBuffer(e))return e.length;if(\"undefined\"!=typeof ArrayBuffer&&\"function\"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;\"string\"!=typeof e&&(e=\"\"+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case\"ascii\":case\"latin1\":case\"binary\":return n;case\"utf8\":case\"utf-8\":case void 0:return V(e).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*n;case\"hex\":return n>>>1;case\"base64\":return z(e).length;default:if(r)return V(e).length;t=(\"\"+t).toLowerCase(),r=!0}}function m(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return\"\";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return\"\";if((n>>>=0)<=(t>>>=0))return\"\";for(e||(e=\"utf8\");;)switch(e){case\"hex\":return I(this,t,n);case\"utf8\":case\"utf-8\":return C(this,t,n);case\"ascii\":return A(this,t,n);case\"latin1\":case\"binary\":return k(this,t,n);case\"base64\":return O(this,t,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return P(this,t,n);default:if(r)throw new TypeError(\"Unknown encoding: \"+e);e=(e+\"\").toLowerCase(),r=!0}}function v(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function g(e,t,n,r,a){if(0===e.length)return-1;if(\"string\"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=a?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(a)return-1;n=e.length-1}else if(n<0){if(!a)return-1;n=0}if(\"string\"==typeof t&&(t=c.from(t,r)),c.isBuffer(t))return 0===t.length?-1:y(e,t,n,r,a);if(\"number\"==typeof t)return t&=255,c.TYPED_ARRAY_SUPPORT&&\"function\"==typeof Uint8Array.prototype.indexOf?a?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,r,a);throw new TypeError(\"val must be string, number or Buffer\")}function y(e,t,n,r,a){var o,i=1,s=e.length,c=t.length;if(void 0!==r&&(\"ucs2\"===(r=String(r).toLowerCase())||\"ucs-2\"===r||\"utf16le\"===r||\"utf-16le\"===r)){if(e.length<2||t.length<2)return-1;i=2,s/=2,c/=2,n/=2}function u(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(a){var l=-1;for(o=n;o<s;o++)if(u(e,o)===u(t,-1===l?0:o-l)){if(-1===l&&(l=o),o-l+1===c)return l*i}else-1!==l&&(o-=o-l),l=-1}else for(n+c>s&&(n=s-c),o=n;o>=0;o--){for(var p=!0,f=0;f<c;f++)if(u(e,o+f)!==u(t,f)){p=!1;break}if(p)return o}return-1}function b(e,t,n,r){n=Number(n)||0;var a=e.length-n;r?(r=Number(r))>a&&(r=a):r=a;var o=t.length;if(o%2!=0)throw new TypeError(\"Invalid hex string\");r>o/2&&(r=o/2);for(var i=0;i<r;++i){var s=parseInt(t.substr(2*i,2),16);if(isNaN(s))return i;e[n+i]=s}return i}function E(e,t,n,r){return F(V(t,e.length-n),e,n,r)}function x(e,t,n,r){return F(function(e){for(var t=[],n=0;n<e.length;++n)t.push(255&e.charCodeAt(n));return t}(t),e,n,r)}function S(e,t,n,r){return x(e,t,n,r)}function w(e,t,n,r){return F(z(t),e,n,r)}function j(e,t,n,r){return F(function(e,t){for(var n,r,a,o=[],i=0;i<e.length&&!((t-=2)<0);++i)r=(n=e.charCodeAt(i))>>8,a=n%256,o.push(a),o.push(r);return o}(t,e.length-n),e,n,r)}function O(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function C(e,t,n){n=Math.min(e.length,n);for(var r=[],a=t;a<n;){var o,i,s,c,u=e[a],l=null,p=u>239?4:u>223?3:u>191?2:1;if(a+p<=n)switch(p){case 1:u<128&&(l=u);break;case 2:128==(192&(o=e[a+1]))&&(c=(31&u)<<6|63&o)>127&&(l=c);break;case 3:o=e[a+1],i=e[a+2],128==(192&o)&&128==(192&i)&&(c=(15&u)<<12|(63&o)<<6|63&i)>2047&&(c<55296||c>57343)&&(l=c);break;case 4:o=e[a+1],i=e[a+2],s=e[a+3],128==(192&o)&&128==(192&i)&&128==(192&s)&&(c=(15&u)<<18|(63&o)<<12|(63&i)<<6|63&s)>65535&&c<1114112&&(l=c)}null===l?(l=65533,p=1):l>65535&&(l-=65536,r.push(l>>>10&1023|55296),l=56320|1023&l),r.push(l),a+=p}return function(e){var t=e.length;if(t<=_)return String.fromCharCode.apply(String,e);var n=\"\",r=0;for(;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=_));return n}(r)}t.Buffer=c,t.SlowBuffer=function(e){+e!=e&&(e=0);return c.alloc(+e)},t.INSPECT_MAX_BYTES=50,c.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&\"function\"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),t.kMaxLength=i(),c.poolSize=8192,c._augment=function(e){return e.__proto__=c.prototype,e},c.from=function(e,t,n){return u(null,e,t,n)},c.TYPED_ARRAY_SUPPORT&&(c.prototype.__proto__=Uint8Array.prototype,c.__proto__=Uint8Array,\"undefined\"!=typeof Symbol&&Symbol.species&&c[Symbol.species]===c&&Object.defineProperty(c,Symbol.species,{value:null,configurable:!0})),c.alloc=function(e,t,n){return function(e,t,n,r){return l(t),t<=0?s(e,t):void 0!==n?\"string\"==typeof r?s(e,t).fill(n,r):s(e,t).fill(n):s(e,t)}(null,e,t,n)},c.allocUnsafe=function(e){return p(null,e)},c.allocUnsafeSlow=function(e){return p(null,e)},c.isBuffer=function(e){return!(null==e||!e._isBuffer)},c.compare=function(e,t){if(!c.isBuffer(e)||!c.isBuffer(t))throw new TypeError(\"Arguments must be Buffers\");if(e===t)return 0;for(var n=e.length,r=t.length,a=0,o=Math.min(n,r);a<o;++a)if(e[a]!==t[a]){n=e[a],r=t[a];break}return n<r?-1:r<n?1:0},c.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"latin1\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},c.concat=function(e,t){if(!o(e))throw new TypeError('\"list\" argument must be an Array of Buffers');if(0===e.length)return c.alloc(0);var n;if(void 0===t)for(t=0,n=0;n<e.length;++n)t+=e[n].length;var r=c.allocUnsafe(t),a=0;for(n=0;n<e.length;++n){var i=e[n];if(!c.isBuffer(i))throw new TypeError('\"list\" argument must be an Array of Buffers');i.copy(r,a),a+=i.length}return r},c.byteLength=h,c.prototype._isBuffer=!0,c.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var t=0;t<e;t+=2)v(this,t,t+1);return this},c.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError(\"Buffer size must be a multiple of 32-bits\");for(var t=0;t<e;t+=4)v(this,t,t+3),v(this,t+1,t+2);return this},c.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError(\"Buffer size must be a multiple of 64-bits\");for(var t=0;t<e;t+=8)v(this,t,t+7),v(this,t+1,t+6),v(this,t+2,t+5),v(this,t+3,t+4);return this},c.prototype.toString=function(){var e=0|this.length;return 0===e?\"\":0===arguments.length?C(this,0,e):m.apply(this,arguments)},c.prototype.equals=function(e){if(!c.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");return this===e||0===c.compare(this,e)},c.prototype.inspect=function(){var e=\"\",n=t.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString(\"hex\",0,n).match(/.{2}/g).join(\" \"),this.length>n&&(e+=\" ... \")),\"<Buffer \"+e+\">\"},c.prototype.compare=function(e,t,n,r,a){if(!c.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===a&&(a=this.length),t<0||n>e.length||r<0||a>this.length)throw new RangeError(\"out of range index\");if(r>=a&&t>=n)return 0;if(r>=a)return-1;if(t>=n)return 1;if(this===e)return 0;for(var o=(a>>>=0)-(r>>>=0),i=(n>>>=0)-(t>>>=0),s=Math.min(o,i),u=this.slice(r,a),l=e.slice(t,n),p=0;p<s;++p)if(u[p]!==l[p]){o=u[p],i=l[p];break}return o<i?-1:i<o?1:0},c.prototype.includes=function(e,t,n){return-1!==this.indexOf(e,t,n)},c.prototype.indexOf=function(e,t,n){return g(this,e,t,n,!0)},c.prototype.lastIndexOf=function(e,t,n){return g(this,e,t,n,!1)},c.prototype.write=function(e,t,n,r){if(void 0===t)r=\"utf8\",n=this.length,t=0;else if(void 0===n&&\"string\"==typeof t)r=t,n=this.length,t=0;else{if(!isFinite(t))throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");t|=0,isFinite(n)?(n|=0,void 0===r&&(r=\"utf8\")):(r=n,n=void 0)}var a=this.length-t;if((void 0===n||n>a)&&(n=a),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");r||(r=\"utf8\");for(var o=!1;;)switch(r){case\"hex\":return b(this,e,t,n);case\"utf8\":case\"utf-8\":return E(this,e,t,n);case\"ascii\":return x(this,e,t,n);case\"latin1\":case\"binary\":return S(this,e,t,n);case\"base64\":return w(this,e,t,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return j(this,e,t,n);default:if(o)throw new TypeError(\"Unknown encoding: \"+r);r=(\"\"+r).toLowerCase(),o=!0}},c.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var _=4096;function A(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var a=t;a<n;++a)r+=String.fromCharCode(127&e[a]);return r}function k(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var a=t;a<n;++a)r+=String.fromCharCode(e[a]);return r}function I(e,t,n){var r=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>r)&&(n=r);for(var a=\"\",o=t;o<n;++o)a+=U(e[o]);return a}function P(e,t,n){for(var r=e.slice(t,n),a=\"\",o=0;o<r.length;o+=2)a+=String.fromCharCode(r[o]+256*r[o+1]);return a}function T(e,t,n){if(e%1!=0||e<0)throw new RangeError(\"offset is not uint\");if(e+t>n)throw new RangeError(\"Trying to access beyond buffer length\")}function R(e,t,n,r,a,o){if(!c.isBuffer(e))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(t>a||t<o)throw new RangeError('\"value\" argument is out of bounds');if(n+r>e.length)throw new RangeError(\"Index out of range\")}function N(e,t,n,r){t<0&&(t=65535+t+1);for(var a=0,o=Math.min(e.length-n,2);a<o;++a)e[n+a]=(t&255<<8*(r?a:1-a))>>>8*(r?a:1-a)}function M(e,t,n,r){t<0&&(t=4294967295+t+1);for(var a=0,o=Math.min(e.length-n,4);a<o;++a)e[n+a]=t>>>8*(r?a:3-a)&255}function q(e,t,n,r,a,o){if(n+r>e.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"Index out of range\")}function D(e,t,n,r,o){return o||q(e,0,n,4),a.write(e,t,n,r,23,4),n+4}function B(e,t,n,r,o){return o||q(e,0,n,8),a.write(e,t,n,r,52,8),n+8}c.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t<e&&(t=e),c.TYPED_ARRAY_SUPPORT)(n=this.subarray(e,t)).__proto__=c.prototype;else{var a=t-e;n=new c(a,void 0);for(var o=0;o<a;++o)n[o]=this[o+e]}return n},c.prototype.readUIntLE=function(e,t,n){e|=0,t|=0,n||T(e,t,this.length);for(var r=this[e],a=1,o=0;++o<t&&(a*=256);)r+=this[e+o]*a;return r},c.prototype.readUIntBE=function(e,t,n){e|=0,t|=0,n||T(e,t,this.length);for(var r=this[e+--t],a=1;t>0&&(a*=256);)r+=this[e+--t]*a;return r},c.prototype.readUInt8=function(e,t){return t||T(e,1,this.length),this[e]},c.prototype.readUInt16LE=function(e,t){return t||T(e,2,this.length),this[e]|this[e+1]<<8},c.prototype.readUInt16BE=function(e,t){return t||T(e,2,this.length),this[e]<<8|this[e+1]},c.prototype.readUInt32LE=function(e,t){return t||T(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},c.prototype.readUInt32BE=function(e,t){return t||T(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},c.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||T(e,t,this.length);for(var r=this[e],a=1,o=0;++o<t&&(a*=256);)r+=this[e+o]*a;return r>=(a*=128)&&(r-=Math.pow(2,8*t)),r},c.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||T(e,t,this.length);for(var r=t,a=1,o=this[e+--r];r>0&&(a*=256);)o+=this[e+--r]*a;return o>=(a*=128)&&(o-=Math.pow(2,8*t)),o},c.prototype.readInt8=function(e,t){return t||T(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},c.prototype.readInt16LE=function(e,t){t||T(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},c.prototype.readInt16BE=function(e,t){t||T(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},c.prototype.readInt32LE=function(e,t){return t||T(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},c.prototype.readInt32BE=function(e,t){return t||T(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},c.prototype.readFloatLE=function(e,t){return t||T(e,4,this.length),a.read(this,e,!0,23,4)},c.prototype.readFloatBE=function(e,t){return t||T(e,4,this.length),a.read(this,e,!1,23,4)},c.prototype.readDoubleLE=function(e,t){return t||T(e,8,this.length),a.read(this,e,!0,52,8)},c.prototype.readDoubleBE=function(e,t){return t||T(e,8,this.length),a.read(this,e,!1,52,8)},c.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||R(this,e,t,n,Math.pow(2,8*n)-1,0);var a=1,o=0;for(this[t]=255&e;++o<n&&(a*=256);)this[t+o]=e/a&255;return t+n},c.prototype.writeUIntBE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||R(this,e,t,n,Math.pow(2,8*n)-1,0);var a=n-1,o=1;for(this[t+a]=255&e;--a>=0&&(o*=256);)this[t+a]=e/o&255;return t+n},c.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,255,0),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},c.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},c.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},c.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):M(this,e,t,!0),t+4},c.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):M(this,e,t,!1),t+4},c.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var a=Math.pow(2,8*n-1);R(this,e,t,n,a-1,-a)}var o=0,i=1,s=0;for(this[t]=255&e;++o<n&&(i*=256);)e<0&&0===s&&0!==this[t+o-1]&&(s=1),this[t+o]=(e/i>>0)-s&255;return t+n},c.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var a=Math.pow(2,8*n-1);R(this,e,t,n,a-1,-a)}var o=n-1,i=1,s=0;for(this[t+o]=255&e;--o>=0&&(i*=256);)e<0&&0===s&&0!==this[t+o+1]&&(s=1),this[t+o]=(e/i>>0)-s&255;return t+n},c.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,127,-128),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},c.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},c.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},c.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):M(this,e,t,!0),t+4},c.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):M(this,e,t,!1),t+4},c.prototype.writeFloatLE=function(e,t,n){return D(this,e,t,!0,n)},c.prototype.writeFloatBE=function(e,t,n){return D(this,e,t,!1,n)},c.prototype.writeDoubleLE=function(e,t,n){return B(this,e,t,!0,n)},c.prototype.writeDoubleBE=function(e,t,n){return B(this,e,t,!1,n)},c.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError(\"targetStart out of bounds\");if(n<0||n>=this.length)throw new RangeError(\"sourceStart out of bounds\");if(r<0)throw new RangeError(\"sourceEnd out of bounds\");r>this.length&&(r=this.length),e.length-t<r-n&&(r=e.length-t+n);var a,o=r-n;if(this===e&&n<t&&t<r)for(a=o-1;a>=0;--a)e[a+t]=this[a+n];else if(o<1e3||!c.TYPED_ARRAY_SUPPORT)for(a=0;a<o;++a)e[a+t]=this[a+n];else Uint8Array.prototype.set.call(e,this.subarray(n,n+o),t);return o},c.prototype.fill=function(e,t,n,r){if(\"string\"==typeof e){if(\"string\"==typeof t?(r=t,t=0,n=this.length):\"string\"==typeof n&&(r=n,n=this.length),1===e.length){var a=e.charCodeAt(0);a<256&&(e=a)}if(void 0!==r&&\"string\"!=typeof r)throw new TypeError(\"encoding must be a string\");if(\"string\"==typeof r&&!c.isEncoding(r))throw new TypeError(\"Unknown encoding: \"+r)}else\"number\"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<n)throw new RangeError(\"Out of range index\");if(n<=t)return this;var o;if(t>>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),\"number\"==typeof e)for(o=t;o<n;++o)this[o]=e;else{var i=c.isBuffer(e)?e:V(new c(e,r).toString()),s=i.length;for(o=0;o<n-t;++o)this[o+t]=i[o%s]}return this};var L=/[^+\\/0-9A-Za-z-_]/g;function U(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function V(e,t){var n;t=t||1/0;for(var r=e.length,a=null,o=[],i=0;i<r;++i){if((n=e.charCodeAt(i))>55295&&n<57344){if(!a){if(n>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(i+1===r){(t-=3)>-1&&o.push(239,191,189);continue}a=n;continue}if(n<56320){(t-=3)>-1&&o.push(239,191,189),a=n;continue}n=65536+(a-55296<<10|n-56320)}else a&&(t-=3)>-1&&o.push(239,191,189);if(a=null,n<128){if((t-=1)<0)break;o.push(n)}else if(n<2048){if((t-=2)<0)break;o.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;o.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error(\"Invalid code point\");if((t-=4)<0)break;o.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return o}function z(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}(e).replace(L,\"\")).length<2)return\"\";for(;e.length%4!=0;)e+=\"=\";return e}(e))}function F(e,t,n,r){for(var a=0;a<r&&!(a+n>=t.length||a>=e.length);++a)t[a+n]=e[a];return a}}).call(this,n(182))},function(e,t){e.exports=require(\"base64-js\")},function(e,t){e.exports=require(\"ieee754\")},function(e,t){e.exports=require(\"isarray\")},function(e,t,n){var r=n(199),a=n(312);e.exports=function(e){if(r(e))return a(e)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(311);e.exports=r},function(e,t,n){n(74),n(107);var r=n(127);e.exports=r},function(e,t,n){var r=n(315);e.exports=r},function(e,t,n){var r=n(21),a=n(316);r({target:\"Array\",stat:!0,forced:!n(319)((function(e){Array.from(e)}))},{from:a})},function(e,t,n){var r=n(46),a=n(317);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw a(e),t}}},function(e,t,n){e.exports=n(492)},function(e,t,n){var r=n(310);e.exports=r},function(e,t){e.exports=function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(140),a=n(200);e.exports=function(e,t){var n=null==e?null:void 0!==r&&a(e)||e[\"@@iterator\"];if(null!=n){var o,i,s=[],c=!0,u=!1;try{for(n=n.call(e);!(c=(o=n.next()).done)&&(s.push(o.value),!t||s.length!==t);c=!0);}catch(e){u=!0,i=e}finally{try{c||null==n.return||n.return()}finally{if(u)throw i}}return s}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){n(74);var r=n(496),a=n(83),o=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.entries;return e===o||e instanceof Array&&t===o.entries||i.hasOwnProperty(a(e))?r:t}},function(e,t,n){var r=n(497);e.exports=r},function(e,t,n){n(126);var r=n(38);e.exports=r(\"Array\").entries},function(e,t,n){var r=n(499);e.exports=r},function(e,t,n){n(500);var r=n(38);e.exports=r(\"Array\").forEach},function(e,t,n){\"use strict\";var r=n(21),a=n(501);r({target:\"Array\",proto:!0,forced:[].forEach!=a},{forEach:a})},function(e,t,n){\"use strict\";var r=n(73).forEach,a=n(94)(\"forEach\");e.exports=a?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},function(e,t,n){var r=n(503);e.exports=r},function(e,t,n){var r=n(504),a=Array.prototype;e.exports=function(e){var t=e.sort;return e===a||e instanceof Array&&t===a.sort?r:t}},function(e,t,n){n(505);var r=n(38);e.exports=r(\"Array\").sort},function(e,t,n){\"use strict\";var r=n(21),a=n(66),o=n(53),i=n(60),s=n(34),c=n(506),u=n(94),l=n(507),p=n(508),f=n(106),d=n(509),h=[],m=h.sort,v=s((function(){h.sort(void 0)})),g=s((function(){h.sort(null)})),y=u(\"sort\"),b=!s((function(){if(f)return f<70;if(!(l&&l>3)){if(p)return!0;if(d)return d<603;var e,t,n,r,a=\"\";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)h.push({k:t+r,v:n})}for(h.sort((function(e,t){return t.v-e.v})),r=0;r<h.length;r++)t=h[r].k.charAt(0),a.charAt(a.length-1)!==t&&(a+=t);return\"DGBEFHACIJK\"!==a}}));r({target:\"Array\",proto:!0,forced:v||!g||!y||!b},{sort:function(e){void 0!==e&&a(e);var t=o(this);if(b)return void 0===e?m.call(t):m.call(t,e);var n,r,s=[],u=i(t.length);for(r=0;r<u;r++)r in t&&s.push(t[r]);for(n=(s=c(s,function(e){return function(t,n){return void 0===n?-1:void 0===t?1:void 0!==e?+e(t,n)||0:String(t)>String(n)?1:-1}}(e))).length,r=0;r<n;)t[r]=s[r++];for(;r<u;)delete t[r++];return t}})},function(e,t){var n=Math.floor,r=function(e,t){var i=e.length,s=n(i/2);return i<8?a(e,t):o(r(e.slice(0,s),t),r(e.slice(s),t),t)},a=function(e,t){for(var n,r,a=e.length,o=1;o<a;){for(r=o,n=e[o];r&&t(e[r-1],n)>0;)e[r]=e[--r];r!==o++&&(e[r]=n)}return e},o=function(e,t,n){for(var r=e.length,a=t.length,o=0,i=0,s=[];o<r||i<a;)o<r&&i<a?s.push(n(e[o],t[i])<=0?e[o++]:t[i++]):s.push(o<r?e[o++]:t[i++]);return s};e.exports=r},function(e,t,n){var r=n(91).match(/firefox\\/(\\d+)/i);e.exports=!!r&&+r[1]},function(e,t,n){var r=n(91);e.exports=/MSIE|Trident/.test(r)},function(e,t,n){var r=n(91).match(/AppleWebKit\\/(\\d+)\\./);e.exports=!!r&&+r[1]},function(e,t,n){var r=n(511);e.exports=r},function(e,t,n){var r=n(512),a=Array.prototype;e.exports=function(e){var t=e.some;return e===a||e instanceof Array&&t===a.some?r:t}},function(e,t,n){n(513);var r=n(38);e.exports=r(\"Array\").some},function(e,t,n){\"use strict\";var r=n(21),a=n(73).some;r({target:\"Array\",proto:!0,forced:!n(94)(\"some\")},{some:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(515);e.exports=r},function(e,t,n){var r=n(516),a=n(518),o=Array.prototype,i=String.prototype;e.exports=function(e){var t=e.includes;return e===o||e instanceof Array&&t===o.includes?r:\"string\"==typeof e||e===i||e instanceof String&&t===i.includes?a:t}},function(e,t,n){n(517);var r=n(38);e.exports=r(\"Array\").includes},function(e,t,n){\"use strict\";var r=n(21),a=n(189).includes,o=n(197);r({target:\"Array\",proto:!0},{includes:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}}),o(\"includes\")},function(e,t,n){n(519);var r=n(38);e.exports=r(\"String\").includes},function(e,t,n){\"use strict\";var r=n(21),a=n(323),o=n(89);r({target:\"String\",proto:!0,forced:!n(324)(\"includes\")},{includes:function(e){return!!~String(o(this)).indexOf(a(e),arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(42),a=n(120),o=n(37)(\"match\");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:\"RegExp\"==a(e))}},function(e,t,n){var r=n(325);e.exports=r},function(e,t,n){n(523);var r=n(38);e.exports=r(\"Array\").indexOf},function(e,t,n){\"use strict\";var r=n(21),a=n(189).indexOf,o=n(94),i=[].indexOf,s=!!i&&1/[1].indexOf(1,-0)<0,c=o(\"indexOf\");r({target:\"Array\",proto:!0,forced:s||!c},{indexOf:function(e){return s?i.apply(this,arguments)||0:a(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(525);e.exports=r},function(e,t,n){var r=n(526),a=Array.prototype;e.exports=function(e){var t=e.find;return e===a||e instanceof Array&&t===a.find?r:t}},function(e,t,n){n(527);var r=n(38);e.exports=r(\"Array\").find},function(e,t,n){\"use strict\";var r=n(21),a=n(73).find,o=n(197),i=\"find\",s=!0;i in[]&&Array(1).find((function(){s=!1})),r({target:\"Array\",proto:!0,forced:s},{find:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}}),o(i)},function(e,t,n){var r=n(529);e.exports=r},function(e,t,n){var r=n(530),a=String.prototype;e.exports=function(e){var t=e.startsWith;return\"string\"==typeof e||e===a||e instanceof String&&t===a.startsWith?r:t}},function(e,t,n){n(531);var r=n(38);e.exports=r(\"String\").startsWith},function(e,t,n){\"use strict\";var r,a=n(21),o=n(104).f,i=n(60),s=n(323),c=n(89),u=n(324),l=n(81),p=\"\".startsWith,f=Math.min,d=u(\"startsWith\");a({target:\"String\",proto:!0,forced:!!(l||d||(r=o(String.prototype,\"startsWith\"),!r||r.writable))&&!d},{startsWith:function(e){var t=String(c(this));s(e);var n=i(f(arguments.length>1?arguments[1]:void 0,t.length)),r=String(e);return p?p.call(t,r,n):t.slice(n,n+r.length)===r}})},function(e,t,n){var r=n(533);e.exports=r},function(e,t,n){var r=n(534),a=String.prototype;e.exports=function(e){var t=e.trim;return\"string\"==typeof e||e===a||e instanceof String&&t===a.trim?r:t}},function(e,t,n){n(535);var r=n(38);e.exports=r(\"String\").trim},function(e,t,n){\"use strict\";var r=n(21),a=n(536).trim;r({target:\"String\",proto:!0,forced:n(537)(\"trim\")},{trim:function(){return a(this)}})},function(e,t,n){var r=n(89),a=\"[\"+n(326)+\"]\",o=RegExp(\"^\"+a+a+\"*\"),i=RegExp(a+a+\"*$\"),s=function(e){return function(t){var n=String(r(t));return 1&e&&(n=n.replace(o,\"\")),2&e&&(n=n.replace(i,\"\")),n}};e.exports={start:s(1),end:s(2),trim:s(3)}},function(e,t,n){var r=n(34),a=n(326);e.exports=function(e){return r((function(){return!!a[e]()||\"​᠎\"!=\"​᠎\"[e]()||a[e].name!==e}))}},function(e,t,n){var r=n(76),a=n(216);e.exports=function(e){return a(r(e).toLowerCase())}},function(e,t,n){var r=n(109),a=Object.prototype,o=a.hasOwnProperty,i=a.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=o.call(e,s),n=e[s];try{e[s]=void 0;var r=!0}catch(e){}var a=i.call(e);return r&&(t?e[s]=n:delete e[s]),a}},function(e,t){var n=Object.prototype.toString;e.exports=function(e){return n.call(e)}},function(e,t,n){var r=n(542),a=n(331),o=n(543),i=n(76);e.exports=function(e){return function(t){t=i(t);var n=a(t)?o(t):void 0,s=n?n[0]:t.charAt(0),c=n?r(n,1).join(\"\"):t.slice(1);return s[e]()+c}}},function(e,t,n){var r=n(330);e.exports=function(e,t,n){var a=e.length;return n=void 0===n?a:n,!t&&n>=a?e:r(e,t,n)}},function(e,t,n){var r=n(544),a=n(331),o=n(545);e.exports=function(e){return a(e)?o(e):r(e)}},function(e,t){e.exports=function(e){return e.split(\"\")}},function(e,t){var n=\"[\\\\ud800-\\\\udfff]\",r=\"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\",a=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",o=\"[^\\\\ud800-\\\\udfff]\",i=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",s=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",c=\"(?:\"+r+\"|\"+a+\")\"+\"?\",u=\"[\\\\ufe0e\\\\ufe0f]?\",l=u+c+(\"(?:\\\\u200d(?:\"+[o,i,s].join(\"|\")+\")\"+u+c+\")*\"),p=\"(?:\"+[o+r+\"?\",r,i,s,n].join(\"|\")+\")\",f=RegExp(a+\"(?=\"+a+\")|\"+p+l,\"g\");e.exports=function(e){return e.match(f)||[]}},function(e,t,n){var r=n(332),a=n(547),o=n(550),i=RegExp(\"['’]\",\"g\");e.exports=function(e){return function(t){return r(o(a(t).replace(i,\"\")),e,\"\")}}},function(e,t,n){var r=n(548),a=n(76),o=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,i=RegExp(\"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\",\"g\");e.exports=function(e){return(e=a(e))&&e.replace(o,r).replace(i,\"\")}},function(e,t,n){var r=n(549)({\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ã\":\"A\",\"Ä\":\"A\",\"Å\":\"A\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ã\":\"a\",\"ä\":\"a\",\"å\":\"a\",\"Ç\":\"C\",\"ç\":\"c\",\"Ð\":\"D\",\"ð\":\"d\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ë\":\"E\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ë\":\"e\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ï\":\"I\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ï\":\"i\",\"Ñ\":\"N\",\"ñ\":\"n\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Õ\":\"O\",\"Ö\":\"O\",\"Ø\":\"O\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"õ\":\"o\",\"ö\":\"o\",\"ø\":\"o\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ü\":\"U\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ü\":\"u\",\"Ý\":\"Y\",\"ý\":\"y\",\"ÿ\":\"y\",\"Æ\":\"Ae\",\"æ\":\"ae\",\"Þ\":\"Th\",\"þ\":\"th\",\"ß\":\"ss\",\"Ā\":\"A\",\"Ă\":\"A\",\"Ą\":\"A\",\"ā\":\"a\",\"ă\":\"a\",\"ą\":\"a\",\"Ć\":\"C\",\"Ĉ\":\"C\",\"Ċ\":\"C\",\"Č\":\"C\",\"ć\":\"c\",\"ĉ\":\"c\",\"ċ\":\"c\",\"č\":\"c\",\"Ď\":\"D\",\"Đ\":\"D\",\"ď\":\"d\",\"đ\":\"d\",\"Ē\":\"E\",\"Ĕ\":\"E\",\"Ė\":\"E\",\"Ę\":\"E\",\"Ě\":\"E\",\"ē\":\"e\",\"ĕ\":\"e\",\"ė\":\"e\",\"ę\":\"e\",\"ě\":\"e\",\"Ĝ\":\"G\",\"Ğ\":\"G\",\"Ġ\":\"G\",\"Ģ\":\"G\",\"ĝ\":\"g\",\"ğ\":\"g\",\"ġ\":\"g\",\"ģ\":\"g\",\"Ĥ\":\"H\",\"Ħ\":\"H\",\"ĥ\":\"h\",\"ħ\":\"h\",\"Ĩ\":\"I\",\"Ī\":\"I\",\"Ĭ\":\"I\",\"Į\":\"I\",\"İ\":\"I\",\"ĩ\":\"i\",\"ī\":\"i\",\"ĭ\":\"i\",\"į\":\"i\",\"ı\":\"i\",\"Ĵ\":\"J\",\"ĵ\":\"j\",\"Ķ\":\"K\",\"ķ\":\"k\",\"ĸ\":\"k\",\"Ĺ\":\"L\",\"Ļ\":\"L\",\"Ľ\":\"L\",\"Ŀ\":\"L\",\"Ł\":\"L\",\"ĺ\":\"l\",\"ļ\":\"l\",\"ľ\":\"l\",\"ŀ\":\"l\",\"ł\":\"l\",\"Ń\":\"N\",\"Ņ\":\"N\",\"Ň\":\"N\",\"Ŋ\":\"N\",\"ń\":\"n\",\"ņ\":\"n\",\"ň\":\"n\",\"ŋ\":\"n\",\"Ō\":\"O\",\"Ŏ\":\"O\",\"Ő\":\"O\",\"ō\":\"o\",\"ŏ\":\"o\",\"ő\":\"o\",\"Ŕ\":\"R\",\"Ŗ\":\"R\",\"Ř\":\"R\",\"ŕ\":\"r\",\"ŗ\":\"r\",\"ř\":\"r\",\"Ś\":\"S\",\"Ŝ\":\"S\",\"Ş\":\"S\",\"Š\":\"S\",\"ś\":\"s\",\"ŝ\":\"s\",\"ş\":\"s\",\"š\":\"s\",\"Ţ\":\"T\",\"Ť\":\"T\",\"Ŧ\":\"T\",\"ţ\":\"t\",\"ť\":\"t\",\"ŧ\":\"t\",\"Ũ\":\"U\",\"Ū\":\"U\",\"Ŭ\":\"U\",\"Ů\":\"U\",\"Ű\":\"U\",\"Ų\":\"U\",\"ũ\":\"u\",\"ū\":\"u\",\"ŭ\":\"u\",\"ů\":\"u\",\"ű\":\"u\",\"ų\":\"u\",\"Ŵ\":\"W\",\"ŵ\":\"w\",\"Ŷ\":\"Y\",\"ŷ\":\"y\",\"Ÿ\":\"Y\",\"Ź\":\"Z\",\"Ż\":\"Z\",\"Ž\":\"Z\",\"ź\":\"z\",\"ż\":\"z\",\"ž\":\"z\",\"Ĳ\":\"IJ\",\"ĳ\":\"ij\",\"Œ\":\"Oe\",\"œ\":\"oe\",\"ŉ\":\"'n\",\"ſ\":\"s\"});e.exports=r},function(e,t){e.exports=function(e){return function(t){return null==e?void 0:e[t]}}},function(e,t,n){var r=n(551),a=n(552),o=n(76),i=n(553);e.exports=function(e,t,n){return e=o(e),void 0===(t=n?void 0:t)?a(e)?i(e):r(e):e.match(t)||[]}},function(e,t){var n=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;e.exports=function(e){return e.match(n)||[]}},function(e,t){var n=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;e.exports=function(e){return n.test(e)}},function(e,t){var n=\"\\\\u2700-\\\\u27bf\",r=\"a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\",a=\"A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\",o=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",i=\"[\"+o+\"]\",s=\"\\\\d+\",c=\"[\\\\u2700-\\\\u27bf]\",u=\"[\"+r+\"]\",l=\"[^\\\\ud800-\\\\udfff\"+o+s+n+r+a+\"]\",p=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",f=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",d=\"[\"+a+\"]\",h=\"(?:\"+u+\"|\"+l+\")\",m=\"(?:\"+d+\"|\"+l+\")\",v=\"(?:['’](?:d|ll|m|re|s|t|ve))?\",g=\"(?:['’](?:D|LL|M|RE|S|T|VE))?\",y=\"(?:[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]|\\\\ud83c[\\\\udffb-\\\\udfff])?\",b=\"[\\\\ufe0e\\\\ufe0f]?\",E=b+y+(\"(?:\\\\u200d(?:\"+[\"[^\\\\ud800-\\\\udfff]\",p,f].join(\"|\")+\")\"+b+y+\")*\"),x=\"(?:\"+[c,p,f].join(\"|\")+\")\"+E,S=RegExp([d+\"?\"+u+\"+\"+v+\"(?=\"+[i,d,\"$\"].join(\"|\")+\")\",m+\"+\"+g+\"(?=\"+[i,d+h,\"$\"].join(\"|\")+\")\",d+\"?\"+h+\"+\"+v,d+\"+\"+g,\"\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\",\"\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\",s,x].join(\"|\"),\"g\");e.exports=function(e){return e.match(S)||[]}},function(e,t,n){var r=n(555),a=n(153),o=n(202);e.exports=function(){this.size=0,this.__data__={hash:new r,map:new(o||a),string:new r}}},function(e,t,n){var r=n(556),a=n(561),o=n(562),i=n(563),s=n(564);function c(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}c.prototype.clear=r,c.prototype.delete=a,c.prototype.get=o,c.prototype.has=i,c.prototype.set=s,e.exports=c},function(e,t,n){var r=n(152);e.exports=function(){this.__data__=r?r(null):{},this.size=0}},function(e,t,n){var r=n(101),a=n(558),o=n(50),i=n(333),s=/^\\[object .+?Constructor\\]$/,c=Function.prototype,u=Object.prototype,l=c.toString,p=u.hasOwnProperty,f=RegExp(\"^\"+l.call(p).replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");e.exports=function(e){return!(!o(e)||a(e))&&(r(e)?f:s).test(i(e))}},function(e,t,n){var r,a=n(559),o=(r=/[^.]+$/.exec(a&&a.keys&&a.keys.IE_PROTO||\"\"))?\"Symbol(src)_1.\"+r:\"\";e.exports=function(e){return!!o&&o in e}},function(e,t,n){var r=n(62)[\"__core-js_shared__\"];e.exports=r},function(e,t){e.exports=function(e,t){return null==e?void 0:e[t]}},function(e,t){e.exports=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},function(e,t,n){var r=n(152),a=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;if(r){var n=t[e];return\"__lodash_hash_undefined__\"===n?void 0:n}return a.call(t,e)?t[e]:void 0}},function(e,t,n){var r=n(152),a=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;return r?void 0!==t[e]:a.call(t,e)}},function(e,t,n){var r=n(152);e.exports=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=r&&void 0===t?\"__lodash_hash_undefined__\":t,this}},function(e,t){e.exports=function(){this.__data__=[],this.size=0}},function(e,t,n){var r=n(154),a=Array.prototype.splice;e.exports=function(e){var t=this.__data__,n=r(t,e);return!(n<0)&&(n==t.length-1?t.pop():a.call(t,n,1),--this.size,!0)}},function(e,t,n){var r=n(154);e.exports=function(e){var t=this.__data__,n=r(t,e);return n<0?void 0:t[n][1]}},function(e,t,n){var r=n(154);e.exports=function(e){return r(this.__data__,e)>-1}},function(e,t,n){var r=n(154);e.exports=function(e,t){var n=this.__data__,a=r(n,e);return a<0?(++this.size,n.push([e,t])):n[a][1]=t,this}},function(e,t,n){var r=n(155);e.exports=function(e){var t=r(this,e).delete(e);return this.size-=t?1:0,t}},function(e,t){e.exports=function(e){var t=typeof e;return\"string\"==t||\"number\"==t||\"symbol\"==t||\"boolean\"==t?\"__proto__\"!==e:null===e}},function(e,t,n){var r=n(155);e.exports=function(e){return r(this,e).get(e)}},function(e,t,n){var r=n(155);e.exports=function(e){return r(this,e).has(e)}},function(e,t,n){var r=n(155);e.exports=function(e,t){var n=r(this,e),a=n.size;return n.set(e,t),this.size+=n.size==a?0:1,this}},function(e,t,n){var r=n(156),a=n(98),o=n(97);e.exports=function(e){return function(t,n,i){var s=Object(t);if(!a(t)){var c=r(n,3);t=o(t),n=function(e){return c(s[e],e,s)}}var u=e(t,n,i);return u>-1?s[c?t[u]:u]:void 0}}},function(e,t,n){var r=n(577),a=n(602),o=n(345);e.exports=function(e){var t=a(e);return 1==t.length&&t[0][2]?o(t[0][0],t[0][1]):function(n){return n===e||r(n,e,t)}}},function(e,t,n){var r=n(203),a=n(334);e.exports=function(e,t,n,o){var i=n.length,s=i,c=!o;if(null==e)return!s;for(e=Object(e);i--;){var u=n[i];if(c&&u[2]?u[1]!==e[u[0]]:!(u[0]in e))return!1}for(;++i<s;){var l=(u=n[i])[0],p=e[l],f=u[1];if(c&&u[2]){if(void 0===p&&!(l in e))return!1}else{var d=new r;if(o)var h=o(p,f,l,e,t,d);if(!(void 0===h?a(f,p,3,o,d):h))return!1}}return!0}},function(e,t,n){var r=n(153);e.exports=function(){this.__data__=new r,this.size=0}},function(e,t){e.exports=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}},function(e,t){e.exports=function(e){return this.__data__.get(e)}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t,n){var r=n(153),a=n(202),o=n(201);e.exports=function(e,t){var n=this.__data__;if(n instanceof r){var i=n.__data__;if(!a||i.length<199)return i.push([e,t]),this.size=++n.size,this;n=this.__data__=new o(i)}return n.set(e,t),this.size=n.size,this}},function(e,t,n){var r=n(203),a=n(335),o=n(588),i=n(591),s=n(129),c=n(45),u=n(158),l=n(207),p=\"[object Arguments]\",f=\"[object Array]\",d=\"[object Object]\",h=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,m,v,g){var y=c(e),b=c(t),E=y?f:s(e),x=b?f:s(t),S=(E=E==p?d:E)==d,w=(x=x==p?d:x)==d,j=E==x;if(j&&u(e)){if(!u(t))return!1;y=!0,S=!1}if(j&&!S)return g||(g=new r),y||l(e)?a(e,t,n,m,v,g):o(e,t,E,n,m,v,g);if(!(1&n)){var O=S&&h.call(e,\"__wrapped__\"),C=w&&h.call(t,\"__wrapped__\");if(O||C){var _=O?e.value():e,A=C?t.value():t;return g||(g=new r),v(_,A,n,m,g)}}return!!j&&(g||(g=new r),i(e,t,n,m,v,g))}},function(e,t,n){var r=n(201),a=n(585),o=n(586);function i(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new r;++t<n;)this.add(e[t])}i.prototype.add=i.prototype.push=a,i.prototype.has=o,e.exports=i},function(e,t){e.exports=function(e){return this.__data__.set(e,\"__lodash_hash_undefined__\"),this}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t){e.exports=function(e,t){return e.has(t)}},function(e,t,n){var r=n(109),a=n(337),o=n(100),i=n(335),s=n(589),c=n(590),u=r?r.prototype:void 0,l=u?u.valueOf:void 0;e.exports=function(e,t,n,r,u,p,f){switch(n){case\"[object DataView]\":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case\"[object ArrayBuffer]\":return!(e.byteLength!=t.byteLength||!p(new a(e),new a(t)));case\"[object Boolean]\":case\"[object Date]\":case\"[object Number]\":return o(+e,+t);case\"[object Error]\":return e.name==t.name&&e.message==t.message;case\"[object RegExp]\":case\"[object String]\":return e==t+\"\";case\"[object Map]\":var d=s;case\"[object Set]\":var h=1&r;if(d||(d=c),e.size!=t.size&&!h)return!1;var m=f.get(e);if(m)return m==t;r|=2,f.set(e,t);var v=i(d(e),d(t),r,u,p,f);return f.delete(e),v;case\"[object Symbol]\":if(l)return l.call(e)==l.call(t)}return!1}},function(e,t){e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e,r){n[++t]=[r,e]})),n}},function(e,t){e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e){n[++t]=e})),n}},function(e,t,n){var r=n(338),a=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,o,i,s){var c=1&n,u=r(e),l=u.length;if(l!=r(t).length&&!c)return!1;for(var p=l;p--;){var f=u[p];if(!(c?f in t:a.call(t,f)))return!1}var d=s.get(e),h=s.get(t);if(d&&h)return d==t&&h==e;var m=!0;s.set(e,t),s.set(t,e);for(var v=c;++p<l;){var g=e[f=u[p]],y=t[f];if(o)var b=c?o(y,g,f,t,e,s):o(g,y,f,e,t,s);if(!(void 0===b?g===y||i(g,y,n,o,s):b)){m=!1;break}v||(v=\"constructor\"==f)}if(m&&!v){var E=e.constructor,x=t.constructor;E==x||!(\"constructor\"in e)||!(\"constructor\"in t)||\"function\"==typeof E&&E instanceof E&&\"function\"==typeof x&&x instanceof x||(m=!1)}return s.delete(e),s.delete(t),m}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,a=0,o=[];++n<r;){var i=e[n];t(i,n,e)&&(o[a++]=i)}return o}},function(e,t){e.exports=function(e,t){for(var n=-1,r=Array(e);++n<e;)r[n]=t(n);return r}},function(e,t,n){var r=n(95),a=n(75);e.exports=function(e){return a(e)&&\"[object Arguments]\"==r(e)}},function(e,t){e.exports=function(){return!1}},function(e,t,n){var r=n(95),a=n(208),o=n(75),i={};i[\"[object Float32Array]\"]=i[\"[object Float64Array]\"]=i[\"[object Int8Array]\"]=i[\"[object Int16Array]\"]=i[\"[object Int32Array]\"]=i[\"[object Uint8Array]\"]=i[\"[object Uint8ClampedArray]\"]=i[\"[object Uint16Array]\"]=i[\"[object Uint32Array]\"]=!0,i[\"[object Arguments]\"]=i[\"[object Array]\"]=i[\"[object ArrayBuffer]\"]=i[\"[object Boolean]\"]=i[\"[object DataView]\"]=i[\"[object Date]\"]=i[\"[object Error]\"]=i[\"[object Function]\"]=i[\"[object Map]\"]=i[\"[object Number]\"]=i[\"[object Object]\"]=i[\"[object RegExp]\"]=i[\"[object Set]\"]=i[\"[object String]\"]=i[\"[object WeakMap]\"]=!1,e.exports=function(e){return o(e)&&a(e.length)&&!!i[r(e)]}},function(e,t,n){var r=n(343)(Object.keys,Object);e.exports=r},function(e,t,n){var r=n(96)(n(62),\"DataView\");e.exports=r},function(e,t,n){var r=n(96)(n(62),\"Promise\");e.exports=r},function(e,t,n){var r=n(96)(n(62),\"Set\");e.exports=r},function(e,t,n){var r=n(96)(n(62),\"WeakMap\");e.exports=r},function(e,t,n){var r=n(344),a=n(97);e.exports=function(e){for(var t=a(e),n=t.length;n--;){var o=t[n],i=e[o];t[n]=[o,i,r(i)]}return t}},function(e,t,n){var r=n(334),a=n(39),o=n(346),i=n(211),s=n(344),c=n(345),u=n(111);e.exports=function(e,t){return i(e)&&s(t)?c(u(e),t):function(n){var i=a(n,e);return void 0===i&&i===t?o(n,e):r(t,i,3)}}},function(e,t,n){var r=n(605),a=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,o=/\\\\(\\\\)?/g,i=r((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(\"\"),e.replace(a,(function(e,n,r,a){t.push(r?a.replace(o,\"$1\"):n||e)})),t}));e.exports=i},function(e,t,n){var r=n(217);e.exports=function(e){var t=r(e,(function(e){return 500===n.size&&n.clear(),e})),n=t.cache;return t}},function(e,t){e.exports=function(e,t){return null!=e&&t in Object(e)}},function(e,t,n){var r=n(110),a=n(157),o=n(45),i=n(159),s=n(208),c=n(111);e.exports=function(e,t,n){for(var u=-1,l=(t=r(t,e)).length,p=!1;++u<l;){var f=c(t[u]);if(!(p=null!=e&&n(e,f)))break;e=e[f]}return p||++u!=l?p:!!(l=null==e?0:e.length)&&s(l)&&i(f,l)&&(o(e)||a(e))}},function(e,t,n){var r=n(609),a=n(610),o=n(211),i=n(111);e.exports=function(e){return o(e)?r(i(e)):a(e)}},function(e,t){e.exports=function(e){return function(t){return null==t?void 0:t[e]}}},function(e,t,n){var r=n(160);e.exports=function(e){return function(t){return r(t,e)}}},function(e,t,n){var r=n(612),a=n(156),o=n(347),i=Math.max;e.exports=function(e,t,n){var s=null==e?0:e.length;if(!s)return-1;var c=null==n?0:o(n);return c<0&&(c=i(s+c,0)),r(e,a(t,3),c)}},function(e,t){e.exports=function(e,t,n,r){for(var a=e.length,o=n+(r?1:-1);r?o--:++o<a;)if(t(e[o],o,e))return o;return-1}},function(e,t,n){var r=n(348),a=1/0;e.exports=function(e){return e?(e=r(e))===a||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},function(e,t,n){var r=n(615),a=/^\\s+/;e.exports=function(e){return e?e.slice(0,r(e)+1).replace(a,\"\"):e}},function(e,t){var n=/\\s/;e.exports=function(e){for(var t=e.length;t--&&n.test(e.charAt(t)););return t}},function(e,t,n){var r=n(349);e.exports=function(e,t){var n;return r(e,(function(e,r,a){return!(n=t(e,r,a))})),!!n}},function(e,t,n){var r=n(618),a=n(97);e.exports=function(e,t){return e&&r(e,t,a)}},function(e,t,n){var r=n(619)();e.exports=r},function(e,t){e.exports=function(e){return function(t,n,r){for(var a=-1,o=Object(t),i=r(t),s=i.length;s--;){var c=i[e?s:++a];if(!1===n(o[c],c,o))break}return t}}},function(e,t,n){var r=n(98);e.exports=function(e,t){return function(n,a){if(null==n)return n;if(!r(n))return e(n,a);for(var o=n.length,i=t?o:-1,s=Object(n);(t?i--:++i<o)&&!1!==a(s[i],i,s););return n}}},function(e,t){var n,r,a=e.exports={};function o(){throw new Error(\"setTimeout has not been defined\")}function i(){throw new Error(\"clearTimeout has not been defined\")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===o||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n=\"function\"==typeof setTimeout?setTimeout:o}catch(e){n=o}try{r=\"function\"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var c,u=[],l=!1,p=-1;function f(){l&&c&&(l=!1,c.length?u=c.concat(u):p=-1,u.length&&d())}function d(){if(!l){var e=s(f);l=!0;for(var t=u.length;t;){for(c=u,u=[];++p<t;)c&&c[p].run();p=-1,t=u.length}c=null,l=!1,function(e){if(r===clearTimeout)return clearTimeout(e);if((r===i||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}(e)}}function h(e,t){this.fun=e,this.array=t}function m(){}a.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];u.push(new h(e,t)),1!==u.length||l||s(d)},h.prototype.run=function(){this.fun.apply(null,this.array)},a.title=\"browser\",a.browser=!0,a.env={},a.argv=[],a.version=\"\",a.versions={},a.on=m,a.addListener=m,a.once=m,a.off=m,a.removeListener=m,a.removeAllListeners=m,a.emit=m,a.prependListener=m,a.prependOnceListener=m,a.listeners=function(e){return[]},a.binding=function(e){throw new Error(\"process.binding is not supported\")},a.cwd=function(){return\"/\"},a.chdir=function(e){throw new Error(\"process.chdir is not supported\")},a.umask=function(){return 0}},function(e,t){var n={\"&\":\"&amp;\",'\"':\"&quot;\",\"'\":\"&apos;\",\"<\":\"&lt;\",\">\":\"&gt;\"};e.exports=function(e){return e&&e.replace?e.replace(/([&\"<>'])/g,(function(e,t){return n[t]})):e}},function(e,t){e.exports=require(\"stream\")},function(e,t,n){var r=n(625);e.exports=r},function(e,t,n){var r=n(626),a=Array.prototype;e.exports=function(e){var t=e.every;return e===a||e instanceof Array&&t===a.every?r:t}},function(e,t,n){n(627);var r=n(38);e.exports=r(\"Array\").every},function(e,t,n){\"use strict\";var r=n(21),a=n(73).every;r({target:\"Array\",proto:!0,forced:!n(94)(\"every\")},{every:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t){e.exports=function(e,t,n,r,a){return a(e,(function(e,a,o){n=r?(r=!1,e):t(n,e,a,o)})),n}},function(e,t,n){var r=n(305);e.exports=r},function(e,t,n){var r=n(631);e.exports=r},function(e,t,n){n(294);var r=n(31);e.exports=r.Object.getOwnPropertySymbols},function(e,t,n){e.exports=n(633)},function(e,t,n){var r=n(304);e.exports=r},function(e,t,n){e.exports=n(635)},function(e,t,n){var r=n(636);e.exports=r},function(e,t,n){n(637);var r=n(31).Object,a=e.exports=function(e,t){return r.getOwnPropertyDescriptor(e,t)};r.getOwnPropertyDescriptor.sham&&(a.sham=!0)},function(e,t,n){var r=n(21),a=n(34),o=n(57),i=n(104).f,s=n(43),c=a((function(){i(1)}));r({target:\"Object\",stat:!0,forced:!s||c,sham:!s},{getOwnPropertyDescriptor:function(e,t){return i(o(e),t)}})},function(e,t,n){e.exports=n(639)},function(e,t,n){var r=n(322);e.exports=r},function(e,t,n){e.exports=n(641)},function(e,t,n){var r=n(642);e.exports=r},function(e,t,n){n(643);var r=n(31);e.exports=r.Object.getOwnPropertyDescriptors},function(e,t,n){var r=n(21),a=n(43),o=n(644),i=n(57),s=n(104),c=n(122);r({target:\"Object\",stat:!0,sham:!a},{getOwnPropertyDescriptors:function(e){for(var t,n,r=i(e),a=s.f,u=o(r),l={},p=0;u.length>p;)void 0!==(n=a(r,t=u[p++]))&&c(l,t,n);return l}})},function(e,t,n){var r=n(61),a=n(192),o=n(193),i=n(46);e.exports=r(\"Reflect\",\"ownKeys\")||function(e){var t=a.f(i(e)),n=o.f;return n?t.concat(n(e)):t}},function(e,t,n){e.exports=n(646)},function(e,t,n){var r=n(647);e.exports=r},function(e,t,n){n(648);var r=n(31).Object,a=e.exports=function(e,t){return r.defineProperties(e,t)};r.defineProperties.sham&&(a.sham=!0)},function(e,t,n){var r=n(21),a=n(43);r({target:\"Object\",stat:!0,forced:!a,sham:!a},{defineProperties:n(188)})},function(e,t,n){var r=n(325);e.exports=r},function(e,t,n){var r=n(351),a=n(353);e.exports=function(e,t){if(null==e)return{};var n,o,i={},s=r(e);for(o=0;o<s.length;o++)n=s[o],a(t).call(t,n)>=0||(i[n]=e[n]);return i},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(652)},function(e,t,n){var r=n(354);n(659),n(660),n(661),n(662),e.exports=r},function(e,t,n){\"use strict\";var r,a,o,i,s=n(21),c=n(81),u=n(36),l=n(61),p=n(356),f=n(93),d=n(130),h=n(148),m=n(82),v=n(357),g=n(42),y=n(66),b=n(112),E=n(298),x=n(99),S=n(319),w=n(358),j=n(359).set,O=n(654),C=n(361),_=n(656),A=n(131),k=n(161),I=n(67),P=n(292),T=n(37),R=n(657),N=n(149),M=n(106),q=T(\"species\"),D=\"Promise\",B=I.get,L=I.set,U=I.getterFor(D),V=p&&p.prototype,z=p,F=V,J=u.TypeError,W=u.document,H=u.process,$=A.f,Y=$,K=!!(W&&W.createEvent&&u.dispatchEvent),G=\"function\"==typeof PromiseRejectionEvent,Z=\"unhandledrejection\",X=!1,Q=P(D,(function(){var e=E(z)!==String(z);if(!e&&66===M)return!0;if(c&&!F.finally)return!0;if(M>=51&&/native code/.test(z))return!1;var t=new z((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};return(t.constructor={})[q]=n,!(X=t.then((function(){}))instanceof n)||!e&&R&&!G})),ee=Q||!S((function(e){z.all(e).catch((function(){}))})),te=function(e){var t;return!(!g(e)||\"function\"!=typeof(t=e.then))&&t},ne=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;O((function(){for(var r=e.value,a=1==e.state,o=0;n.length>o;){var i,s,c,u=n[o++],l=a?u.ok:u.fail,p=u.resolve,f=u.reject,d=u.domain;try{l?(a||(2===e.rejection&&ie(e),e.rejection=1),!0===l?i=r:(d&&d.enter(),i=l(r),d&&(d.exit(),c=!0)),i===u.promise?f(J(\"Promise-chain cycle\")):(s=te(i))?s.call(i,p,f):p(i)):f(r)}catch(e){d&&!c&&d.exit(),f(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&ae(e)}))}},re=function(e,t,n){var r,a;K?((r=W.createEvent(\"Event\")).promise=t,r.reason=n,r.initEvent(e,!1,!0),u.dispatchEvent(r)):r={promise:t,reason:n},!G&&(a=u[\"on\"+e])?a(r):e===Z&&_(\"Unhandled promise rejection\",n)},ae=function(e){j.call(u,(function(){var t,n=e.facade,r=e.value;if(oe(e)&&(t=k((function(){N?H.emit(\"unhandledRejection\",r,n):re(Z,n,r)})),e.rejection=N||oe(e)?2:1,t.error))throw t.value}))},oe=function(e){return 1!==e.rejection&&!e.parent},ie=function(e){j.call(u,(function(){var t=e.facade;N?H.emit(\"rejectionHandled\",t):re(\"rejectionhandled\",t,e.value)}))},se=function(e,t,n){return function(r){e(t,r,n)}},ce=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,ne(e,!0))},ue=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw J(\"Promise can't be resolved itself\");var r=te(t);r?O((function(){var n={done:!1};try{r.call(t,se(ue,n,e),se(ce,n,e))}catch(t){ce(n,t,e)}})):(e.value=t,e.state=1,ne(e,!1))}catch(t){ce({done:!1},t,e)}}};if(Q&&(F=(z=function(e){b(this,z,D),y(e),r.call(this);var t=B(this);try{e(se(ue,t),se(ce,t))}catch(e){ce(t,e)}}).prototype,(r=function(e){L(this,{type:D,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=d(F,{then:function(e,t){var n=U(this),r=$(w(this,z));return r.ok=\"function\"!=typeof e||e,r.fail=\"function\"==typeof t&&t,r.domain=N?H.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&ne(n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),a=function(){var e=new r,t=B(e);this.promise=e,this.resolve=se(ue,t),this.reject=se(ce,t)},A.f=$=function(e){return e===z||e===o?new a(e):Y(e)},!c&&\"function\"==typeof p&&V!==Object.prototype)){i=V.then,X||(f(V,\"then\",(function(e,t){var n=this;return new z((function(e,t){i.call(n,e,t)})).then(e,t)}),{unsafe:!0}),f(V,\"catch\",F.catch,{unsafe:!0}));try{delete V.constructor}catch(e){}h&&h(V,F)}s({global:!0,wrap:!0,forced:Q},{Promise:z}),m(z,D,!1,!0),v(D),o=l(D),s({target:D,stat:!0,forced:Q},{reject:function(e){var t=$(this);return t.reject.call(void 0,e),t.promise}}),s({target:D,stat:!0,forced:c||Q},{resolve:function(e){return C(c&&this===o?z:this,e)}}),s({target:D,stat:!0,forced:ee},{all:function(e){var t=this,n=$(t),r=n.resolve,a=n.reject,o=k((function(){var n=y(t.resolve),o=[],i=0,s=1;x(e,(function(e){var c=i++,u=!1;o.push(void 0),s++,n.call(t,e).then((function(e){u||(u=!0,o[c]=e,--s||r(o))}),a)})),--s||r(o)}));return o.error&&a(o.value),n.promise},race:function(e){var t=this,n=$(t),r=n.reject,a=k((function(){var a=y(t.resolve);x(e,(function(e){a.call(t,e).then(n.resolve,r)}))}));return a.error&&r(a.value),n.promise}})},function(e,t,n){var r,a,o,i,s,c,u,l,p=n(36),f=n(104).f,d=n(359).set,h=n(360),m=n(655),v=n(149),g=p.MutationObserver||p.WebKitMutationObserver,y=p.document,b=p.process,E=p.Promise,x=f(p,\"queueMicrotask\"),S=x&&x.value;S||(r=function(){var e,t;for(v&&(e=b.domain)&&e.exit();a;){t=a.fn,a=a.next;try{t()}catch(e){throw a?i():o=void 0,e}}o=void 0,e&&e.enter()},h||v||m||!g||!y?E&&E.resolve?((u=E.resolve(void 0)).constructor=E,l=u.then,i=function(){l.call(u,r)}):i=v?function(){b.nextTick(r)}:function(){d.call(p,r)}:(s=!0,c=y.createTextNode(\"\"),new g(r).observe(c,{characterData:!0}),i=function(){c.data=s=!s})),e.exports=S||function(e){var t={fn:e,next:void 0};o&&(o.next=t),a||(a=t,i()),o=t}},function(e,t,n){var r=n(91);e.exports=/web0s(?!.*chrome)/i.test(r)},function(e,t,n){var r=n(36);e.exports=function(e,t){var n=r.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},function(e,t){e.exports=\"object\"==typeof window},function(e,t,n){\"use strict\";var r=n(21),a=n(81),o=n(356),i=n(34),s=n(61),c=n(358),u=n(361),l=n(93);if(r({target:\"Promise\",proto:!0,real:!0,forced:!!o&&i((function(){o.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=c(this,s(\"Promise\")),n=\"function\"==typeof e;return this.then(n?function(n){return u(t,e()).then((function(){return n}))}:e,n?function(n){return u(t,e()).then((function(){throw n}))}:e)}}),!a&&\"function\"==typeof o){var p=s(\"Promise\").prototype.finally;o.prototype.finally!==p&&l(o.prototype,\"finally\",p,{unsafe:!0})}},function(e,t,n){n(355)},function(e,t,n){n(362)},function(e,t,n){\"use strict\";var r=n(21),a=n(131),o=n(161);r({target:\"Promise\",stat:!0},{try:function(e){var t=a.f(this),n=o(e);return(n.error?t.reject:t.resolve)(n.value),t.promise}})},function(e,t,n){n(363)},function(e,t){e.exports=require(\"regenerator-runtime\")},function(e,t,n){var r=n(306);e.exports=r},function(e,t,n){var r=n(354);e.exports=r},function(e,t,n){var r=n(667);e.exports=r},function(e,t,n){n(668);var r=n(31);e.exports=r.Object.values},function(e,t,n){var r=n(21),a=n(364).values;r({target:\"Object\",stat:!0},{values:function(e){return a(e)}})},function(e,t,n){var r=n(670);e.exports=r},function(e,t,n){n(671);var r=n(31);e.exports=r.Date.now},function(e,t,n){n(21)({target:\"Date\",stat:!0},{now:function(){return(new Date).getTime()}})},function(e,t,n){var r=n(62);e.exports=function(){return r.Date.now()}},function(e,t,n){e.exports=n(674)},function(e,t,n){var r=n(308);e.exports=r},function(e,t,n){e.exports=n(676)},function(e,t,n){var r=n(677);e.exports=r},function(e,t,n){n(678);var r=n(31).Object;e.exports=function(e,t){return r.create(e,t)}},function(e,t,n){n(21)({target:\"Object\",stat:!0,sham:!n(43)},{create:n(92)})},function(e,t,n){var r=n(368);function a(t,n){return e.exports=a=r||function(e,t){return e.__proto__=t,e},e.exports.default=e.exports,e.exports.__esModule=!0,a(t,n)}e.exports=a,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(681);e.exports=r},function(e,t,n){n(682);var r=n(31);e.exports=r.Object.setPrototypeOf},function(e,t,n){n(21)({target:\"Object\",stat:!0},{setPrototypeOf:n(148)})},function(e,t,n){var r=n(684);e.exports=r},function(e,t,n){n(685);var r=n(31);e.exports=r.Reflect.construct},function(e,t,n){var r=n(21),a=n(61),o=n(66),i=n(46),s=n(42),c=n(92),u=n(307),l=n(34),p=a(\"Reflect\",\"construct\"),f=l((function(){function e(){}return!(p((function(){}),[],e)instanceof e)})),d=!l((function(){p((function(){}))})),h=f||d;r({target:\"Reflect\",stat:!0,forced:h,sham:h},{construct:function(e,t){o(e),i(t);var n=arguments.length<3?e:o(arguments[2]);if(d&&!f)return p(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var r=[null];return r.push.apply(r,t),new(u.apply(e,r))}var a=n.prototype,l=c(s(a)?a:Object.prototype),h=Function.apply.call(e,l,t);return s(h)?h:l}})},function(e,t,n){var r=n(368),a=n(687);function o(t){return e.exports=o=r?a:function(e){return e.__proto__||a(e)},e.exports.default=e.exports,e.exports.__esModule=!0,o(t)}e.exports=o,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(688)},function(e,t,n){var r=n(689);e.exports=r},function(e,t,n){n(690);var r=n(31);e.exports=r.Object.getPrototypeOf},function(e,t,n){var r=n(21),a=n(34),o=n(53),i=n(147),s=n(303);r({target:\"Object\",stat:!0,forced:a((function(){i(1)})),sham:!s},{getPrototypeOf:function(e){return i(o(e))}})},function(e,t,n){var r=n(369);e.exports=function(){if(\"undefined\"==typeof Reflect||!r)return!1;if(r.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(r(Boolean,[],(function(){}))),!0}catch(e){return!1}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(18).default,a=n(10);e.exports=function(e,t){return!t||\"object\"!==r(t)&&\"function\"!=typeof t?a(e):t},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n<r&&!1!==t(e[n],n,e););return e}},function(e,t,n){var r=n(113),a=n(97);e.exports=function(e,t){return e&&r(t,a(t),e)}},function(e,t,n){var r=n(113),a=n(213);e.exports=function(e,t){return e&&r(t,a(t),e)}},function(e,t,n){var r=n(50),a=n(128),o=n(697),i=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return o(e);var t=a(e),n=[];for(var s in e)(\"constructor\"!=s||!t&&i.call(e,s))&&n.push(s);return n}},function(e,t){e.exports=function(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);return t}},function(e,t,n){(function(e){var r=n(62),a=t&&!t.nodeType&&t,o=a&&\"object\"==typeof e&&e&&!e.nodeType&&e,i=o&&o.exports===a?r.Buffer:void 0,s=i?i.allocUnsafe:void 0;e.exports=function(e,t){if(t)return e.slice();var n=e.length,r=s?s(n):new e.constructor(n);return e.copy(r),r}}).call(this,n(206)(e))},function(e,t){e.exports=function(e,t){var n=-1,r=e.length;for(t||(t=Array(r));++n<r;)t[n]=e[n];return t}},function(e,t,n){var r=n(113),a=n(205);e.exports=function(e,t){return r(e,a(e),t)}},function(e,t,n){var r=n(113),a=n(371);e.exports=function(e,t){return r(e,a(e),t)}},function(e,t){var n=Object.prototype.hasOwnProperty;e.exports=function(e){var t=e.length,r=new e.constructor(t);return t&&\"string\"==typeof e[0]&&n.call(e,\"index\")&&(r.index=e.index,r.input=e.input),r}},function(e,t,n){var r=n(215),a=n(704),o=n(705),i=n(706),s=n(707);e.exports=function(e,t,n){var c=e.constructor;switch(t){case\"[object ArrayBuffer]\":return r(e);case\"[object Boolean]\":case\"[object Date]\":return new c(+e);case\"[object DataView]\":return a(e,n);case\"[object Float32Array]\":case\"[object Float64Array]\":case\"[object Int8Array]\":case\"[object Int16Array]\":case\"[object Int32Array]\":case\"[object Uint8Array]\":case\"[object Uint8ClampedArray]\":case\"[object Uint16Array]\":case\"[object Uint32Array]\":return s(e,n);case\"[object Map]\":return new c;case\"[object Number]\":case\"[object String]\":return new c(e);case\"[object RegExp]\":return o(e);case\"[object Set]\":return new c;case\"[object Symbol]\":return i(e)}}},function(e,t,n){var r=n(215);e.exports=function(e,t){var n=t?r(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}},function(e,t){var n=/\\w*$/;e.exports=function(e){var t=new e.constructor(e.source,n.exec(e));return t.lastIndex=e.lastIndex,t}},function(e,t,n){var r=n(109),a=r?r.prototype:void 0,o=a?a.valueOf:void 0;e.exports=function(e){return o?Object(o.call(e)):{}}},function(e,t,n){var r=n(215);e.exports=function(e,t){var n=t?r(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}},function(e,t,n){var r=n(709),a=n(214),o=n(128);e.exports=function(e){return\"function\"!=typeof e.constructor||o(e)?{}:r(a(e))}},function(e,t,n){var r=n(50),a=Object.create,o=function(){function e(){}return function(t){if(!r(t))return{};if(a)return a(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();e.exports=o},function(e,t,n){var r=n(711),a=n(209),o=n(210),i=o&&o.isMap,s=i?a(i):r;e.exports=s},function(e,t,n){var r=n(129),a=n(75);e.exports=function(e){return a(e)&&\"[object Map]\"==r(e)}},function(e,t,n){var r=n(713),a=n(209),o=n(210),i=o&&o.isSet,s=i?a(i):r;e.exports=s},function(e,t,n){var r=n(129),a=n(75);e.exports=function(e){return a(e)&&\"[object Set]\"==r(e)}},function(e,t,n){var r=n(110),a=n(715),o=n(716),i=n(111);e.exports=function(e,t){return t=r(t,e),null==(e=o(e,t))||delete e[i(a(t))]}},function(e,t){e.exports=function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}},function(e,t,n){var r=n(160),a=n(330);e.exports=function(e,t){return t.length<2?e:r(e,a(t,0,-1))}},function(e,t,n){var r=n(132);e.exports=function(e){return r(e)?void 0:e}},function(e,t,n){var r=n(719);e.exports=function(e){return(null==e?0:e.length)?r(e,1):[]}},function(e,t,n){var r=n(204),a=n(720);e.exports=function e(t,n,o,i,s){var c=-1,u=t.length;for(o||(o=a),s||(s=[]);++c<u;){var l=t[c];n>0&&o(l)?n>1?e(l,n-1,o,i,s):r(s,l):i||(s[s.length]=l)}return s}},function(e,t,n){var r=n(109),a=n(157),o=n(45),i=r?r.isConcatSpreadable:void 0;e.exports=function(e){return o(e)||a(e)||!!(i&&e&&e[i])}},function(e,t){e.exports=function(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}},function(e,t,n){var r=n(723),a=n(367),o=n(212),i=a?function(e,t){return a(e,\"toString\",{configurable:!0,enumerable:!1,value:r(t),writable:!0})}:o;e.exports=i},function(e,t){e.exports=function(e){return function(){return e}}},function(e,t){var n=Date.now;e.exports=function(e){var t=0,r=0;return function(){var a=n(),o=16-(a-r);if(r=a,o>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}},function(e,t,n){var r=n(726);e.exports=r},function(e,t,n){var r=n(727),a=String.prototype;e.exports=function(e){var t=e.repeat;return\"string\"==typeof e||e===a||e instanceof String&&t===a.repeat?r:t}},function(e,t,n){n(728);var r=n(38);e.exports=r(\"String\").repeat},function(e,t,n){n(21)({target:\"String\",proto:!0},{repeat:n(729)})},function(e,t,n){\"use strict\";var r=n(105),a=n(89);e.exports=function(e){var t=String(a(this)),n=\"\",o=r(e);if(o<0||o==1/0)throw RangeError(\"Wrong number of repetitions\");for(;o>0;(o>>>=1)&&(t+=t))1&o&&(n+=t);return n}},function(e,t,n){var r=n(315);e.exports=r},function(e,t,n){var r=n(732);e.exports=r},function(e,t,n){n(733);var r=n(31);e.exports=r.Object.entries},function(e,t,n){var r=n(21),a=n(364).entries;r({target:\"Object\",stat:!0},{entries:function(e){return a(e)}})},function(e,t,n){var r=n(735),a=n(346);e.exports=function(e,t){return r(e,t,(function(t,n){return a(e,n)}))}},function(e,t,n){var r=n(160),a=n(365),o=n(110);e.exports=function(e,t,n){for(var i=-1,s=t.length,c={};++i<s;){var u=t[i],l=r(e,u);n(l,u)&&a(c,o(u,e),l)}return c}},function(e,t,n){var r=n(737);e.exports=r},function(e,t,n){var r=n(738),a=Array.prototype;e.exports=function(e){var t=e.splice;return e===a||e instanceof Array&&t===a.splice?r:t}},function(e,t,n){n(739);var r=n(38);e.exports=r(\"Array\").splice},function(e,t,n){\"use strict\";var r=n(21),a=n(190),o=n(105),i=n(60),s=n(53),c=n(184),u=n(122),l=n(123)(\"splice\"),p=Math.max,f=Math.min,d=9007199254740991,h=\"Maximum allowed length exceeded\";r({target:\"Array\",proto:!0,forced:!l},{splice:function(e,t){var n,r,l,m,v,g,y=s(this),b=i(y.length),E=a(e,b),x=arguments.length;if(0===x?n=r=0:1===x?(n=0,r=b-E):(n=x-2,r=f(p(o(t),0),b-E)),b+n-r>d)throw TypeError(h);for(l=c(y,r),m=0;m<r;m++)(v=E+m)in y&&u(l,m,y[v]);if(l.length=r,n<r){for(m=E;m<b-r;m++)g=m+n,(v=m+r)in y?y[g]=y[v]:delete y[g];for(m=b;m>b-r+n;m--)delete y[m-1]}else if(n>r)for(m=b-r;m>E;m--)g=m+n-1,(v=m+r-1)in y?y[g]=y[v]:delete y[g];for(m=0;m<n;m++)y[m+E]=arguments[m+2];return y.length=b-r+n,l}})},function(e,t,n){var r=n(741);e.exports=r},function(e,t,n){n(145),n(742),n(74);var r=n(31);e.exports=r.WeakMap},function(e,t,n){\"use strict\";var r,a=n(36),o=n(130),i=n(163),s=n(377),c=n(744),u=n(42),l=n(67).enforce,p=n(297),f=!a.ActiveXObject&&\"ActiveXObject\"in a,d=Object.isExtensible,h=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},m=e.exports=s(\"WeakMap\",h,c);if(p&&f){r=c.getConstructor(h,\"WeakMap\",!0),i.REQUIRED=!0;var v=m.prototype,g=v.delete,y=v.has,b=v.get,E=v.set;o(v,{delete:function(e){if(u(e)&&!d(e)){var t=l(this);return t.frozen||(t.frozen=new r),g.call(this,e)||t.frozen.delete(e)}return g.call(this,e)},has:function(e){if(u(e)&&!d(e)){var t=l(this);return t.frozen||(t.frozen=new r),y.call(this,e)||t.frozen.has(e)}return y.call(this,e)},get:function(e){if(u(e)&&!d(e)){var t=l(this);return t.frozen||(t.frozen=new r),y.call(this,e)?b.call(this,e):t.frozen.get(e)}return b.call(this,e)},set:function(e,t){if(u(e)&&!d(e)){var n=l(this);n.frozen||(n.frozen=new r),y.call(this,e)?E.call(this,e,t):n.frozen.set(e,t)}else E.call(this,e,t);return this}})}},function(e,t,n){var r=n(34);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},function(e,t,n){\"use strict\";var r=n(130),a=n(163).getWeakData,o=n(46),i=n(42),s=n(112),c=n(99),u=n(73),l=n(49),p=n(67),f=p.set,d=p.getterFor,h=u.find,m=u.findIndex,v=0,g=function(e){return e.frozen||(e.frozen=new y)},y=function(){this.entries=[]},b=function(e,t){return h(e.entries,(function(e){return e[0]===t}))};y.prototype={get:function(e){var t=b(this,e);if(t)return t[1]},has:function(e){return!!b(this,e)},set:function(e,t){var n=b(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=m(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,u){var p=e((function(e,r){s(e,p,t),f(e,{type:t,id:v++,frozen:void 0}),null!=r&&c(r,e[u],{that:e,AS_ENTRIES:n})})),h=d(t),m=function(e,t,n){var r=h(e),i=a(o(t),!0);return!0===i?g(r).set(t,n):i[r.id]=n,e};return r(p.prototype,{delete:function(e){var t=h(this);if(!i(e))return!1;var n=a(e);return!0===n?g(t).delete(e):n&&l(n,t.id)&&delete n[t.id]},has:function(e){var t=h(this);if(!i(e))return!1;var n=a(e);return!0===n?g(t).has(e):n&&l(n,t.id)}}),r(p.prototype,n?{get:function(e){var t=h(this);if(i(e)){var n=a(e);return!0===n?g(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return m(this,e,t)}}:{add:function(e){return m(this,e,!0)}}),p}}},function(e,t){e.exports=function(e,t,n){return e==e&&(void 0!==n&&(e=e<=n?e:n),void 0!==t&&(e=e>=t?e:t)),e}},function(e,t,n){var r=n(747),a=n(350);e.exports=function(e){return r((function(t,n){var r=-1,o=n.length,i=o>1?n[o-1]:void 0,s=o>2?n[2]:void 0;for(i=e.length>3&&\"function\"==typeof i?(o--,i):void 0,s&&a(n[0],n[1],s)&&(i=o<3?void 0:i,o=1),t=Object(t);++r<o;){var c=n[r];c&&e(t,c,r,i)}return t}))}},function(e,t,n){var r=n(212),a=n(374),o=n(375);e.exports=function(e,t){return o(a(e,t,r),e+\"\")}},function(e,t,n){var r=n(749);e.exports=r},function(e,t,n){n(750),n(753),n(379);var r=n(31);e.exports=r.URL},function(e,t,n){\"use strict\";n(107);var r,a=n(21),o=n(43),i=n(378),s=n(36),c=n(188),u=n(93),l=n(112),p=n(49),f=n(309),d=n(316),h=n(300).codeAt,m=n(751),v=n(82),g=n(379),y=n(67),b=s.URL,E=g.URLSearchParams,x=g.getState,S=y.set,w=y.getterFor(\"URL\"),j=Math.floor,O=Math.pow,C=\"Invalid scheme\",_=\"Invalid host\",A=\"Invalid port\",k=/[A-Za-z]/,I=/[\\d+-.A-Za-z]/,P=/\\d/,T=/^0x/i,R=/^[0-7]+$/,N=/^\\d+$/,M=/^[\\dA-Fa-f]+$/,q=/[\\0\\t\\n\\r #%/:<>?@[\\\\\\]^|]/,D=/[\\0\\t\\n\\r #/:<>?@[\\\\\\]^|]/,B=/^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g,L=/[\\t\\n\\r]/g,U=function(e,t){var n,r,a;if(\"[\"==t.charAt(0)){if(\"]\"!=t.charAt(t.length-1))return _;if(!(n=z(t.slice(1,-1))))return _;e.host=n}else if(G(e)){if(t=m(t),q.test(t))return _;if(null===(n=V(t)))return _;e.host=n}else{if(D.test(t))return _;for(n=\"\",r=d(t),a=0;a<r.length;a++)n+=Y(r[a],J);e.host=n}},V=function(e){var t,n,r,a,o,i,s,c=e.split(\".\");if(c.length&&\"\"==c[c.length-1]&&c.pop(),(t=c.length)>4)return e;for(n=[],r=0;r<t;r++){if(\"\"==(a=c[r]))return e;if(o=10,a.length>1&&\"0\"==a.charAt(0)&&(o=T.test(a)?16:8,a=a.slice(8==o?1:2)),\"\"===a)i=0;else{if(!(10==o?N:8==o?R:M).test(a))return e;i=parseInt(a,o)}n.push(i)}for(r=0;r<t;r++)if(i=n[r],r==t-1){if(i>=O(256,5-t))return null}else if(i>255)return null;for(s=n.pop(),r=0;r<n.length;r++)s+=n[r]*O(256,3-r);return s},z=function(e){var t,n,r,a,o,i,s,c=[0,0,0,0,0,0,0,0],u=0,l=null,p=0,f=function(){return e.charAt(p)};if(\":\"==f()){if(\":\"!=e.charAt(1))return;p+=2,l=++u}for(;f();){if(8==u)return;if(\":\"!=f()){for(t=n=0;n<4&&M.test(f());)t=16*t+parseInt(f(),16),p++,n++;if(\".\"==f()){if(0==n)return;if(p-=n,u>6)return;for(r=0;f();){if(a=null,r>0){if(!(\".\"==f()&&r<4))return;p++}if(!P.test(f()))return;for(;P.test(f());){if(o=parseInt(f(),10),null===a)a=o;else{if(0==a)return;a=10*a+o}if(a>255)return;p++}c[u]=256*c[u]+a,2!=++r&&4!=r||u++}if(4!=r)return;break}if(\":\"==f()){if(p++,!f())return}else if(f())return;c[u++]=t}else{if(null!==l)return;p++,l=++u}}if(null!==l)for(i=u-l,u=7;0!=u&&i>0;)s=c[u],c[u--]=c[l+i-1],c[l+--i]=s;else if(8!=u)return;return c},F=function(e){var t,n,r,a;if(\"number\"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=j(e/256);return t.join(\".\")}if(\"object\"==typeof e){for(t=\"\",r=function(e){for(var t=null,n=1,r=null,a=0,o=0;o<8;o++)0!==e[o]?(a>n&&(t=r,n=a),r=null,a=0):(null===r&&(r=o),++a);return a>n&&(t=r,n=a),t}(e),n=0;n<8;n++)a&&0===e[n]||(a&&(a=!1),r===n?(t+=n?\":\":\"::\",a=!0):(t+=e[n].toString(16),n<7&&(t+=\":\")));return\"[\"+t+\"]\"}return e},J={},W=f({},J,{\" \":1,'\"':1,\"<\":1,\">\":1,\"`\":1}),H=f({},W,{\"#\":1,\"?\":1,\"{\":1,\"}\":1}),$=f({},H,{\"/\":1,\":\":1,\";\":1,\"=\":1,\"@\":1,\"[\":1,\"\\\\\":1,\"]\":1,\"^\":1,\"|\":1}),Y=function(e,t){var n=h(e,0);return n>32&&n<127&&!p(t,e)?e:encodeURIComponent(e)},K={ftp:21,file:null,http:80,https:443,ws:80,wss:443},G=function(e){return p(K,e.scheme)},Z=function(e){return\"\"!=e.username||\"\"!=e.password},X=function(e){return!e.host||e.cannotBeABaseURL||\"file\"==e.scheme},Q=function(e,t){var n;return 2==e.length&&k.test(e.charAt(0))&&(\":\"==(n=e.charAt(1))||!t&&\"|\"==n)},ee=function(e){var t;return e.length>1&&Q(e.slice(0,2))&&(2==e.length||\"/\"===(t=e.charAt(2))||\"\\\\\"===t||\"?\"===t||\"#\"===t)},te=function(e){var t=e.path,n=t.length;!n||\"file\"==e.scheme&&1==n&&Q(t[0],!0)||t.pop()},ne=function(e){return\".\"===e||\"%2e\"===e.toLowerCase()},re={},ae={},oe={},ie={},se={},ce={},ue={},le={},pe={},fe={},de={},he={},me={},ve={},ge={},ye={},be={},Ee={},xe={},Se={},we={},je=function(e,t,n,a){var o,i,s,c,u,l=n||re,f=0,h=\"\",m=!1,v=!1,g=!1;for(n||(e.scheme=\"\",e.username=\"\",e.password=\"\",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(B,\"\")),t=t.replace(L,\"\"),o=d(t);f<=o.length;){switch(i=o[f],l){case re:if(!i||!k.test(i)){if(n)return C;l=oe;continue}h+=i.toLowerCase(),l=ae;break;case ae:if(i&&(I.test(i)||\"+\"==i||\"-\"==i||\".\"==i))h+=i.toLowerCase();else{if(\":\"!=i){if(n)return C;h=\"\",l=oe,f=0;continue}if(n&&(G(e)!=p(K,h)||\"file\"==h&&(Z(e)||null!==e.port)||\"file\"==e.scheme&&!e.host))return;if(e.scheme=h,n)return void(G(e)&&K[e.scheme]==e.port&&(e.port=null));h=\"\",\"file\"==e.scheme?l=ve:G(e)&&a&&a.scheme==e.scheme?l=ie:G(e)?l=le:\"/\"==o[f+1]?(l=se,f++):(e.cannotBeABaseURL=!0,e.path.push(\"\"),l=xe)}break;case oe:if(!a||a.cannotBeABaseURL&&\"#\"!=i)return C;if(a.cannotBeABaseURL&&\"#\"==i){e.scheme=a.scheme,e.path=a.path.slice(),e.query=a.query,e.fragment=\"\",e.cannotBeABaseURL=!0,l=we;break}l=\"file\"==a.scheme?ve:ce;continue;case ie:if(\"/\"!=i||\"/\"!=o[f+1]){l=ce;continue}l=pe,f++;break;case se:if(\"/\"==i){l=fe;break}l=Ee;continue;case ce:if(e.scheme=a.scheme,i==r)e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,e.path=a.path.slice(),e.query=a.query;else if(\"/\"==i||\"\\\\\"==i&&G(e))l=ue;else if(\"?\"==i)e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,e.path=a.path.slice(),e.query=\"\",l=Se;else{if(\"#\"!=i){e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,e.path=a.path.slice(),e.path.pop(),l=Ee;continue}e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,e.path=a.path.slice(),e.query=a.query,e.fragment=\"\",l=we}break;case ue:if(!G(e)||\"/\"!=i&&\"\\\\\"!=i){if(\"/\"!=i){e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,l=Ee;continue}l=fe}else l=pe;break;case le:if(l=pe,\"/\"!=i||\"/\"!=h.charAt(f+1))continue;f++;break;case pe:if(\"/\"!=i&&\"\\\\\"!=i){l=fe;continue}break;case fe:if(\"@\"==i){m&&(h=\"%40\"+h),m=!0,s=d(h);for(var y=0;y<s.length;y++){var b=s[y];if(\":\"!=b||g){var E=Y(b,$);g?e.password+=E:e.username+=E}else g=!0}h=\"\"}else if(i==r||\"/\"==i||\"?\"==i||\"#\"==i||\"\\\\\"==i&&G(e)){if(m&&\"\"==h)return\"Invalid authority\";f-=d(h).length+1,h=\"\",l=de}else h+=i;break;case de:case he:if(n&&\"file\"==e.scheme){l=ye;continue}if(\":\"!=i||v){if(i==r||\"/\"==i||\"?\"==i||\"#\"==i||\"\\\\\"==i&&G(e)){if(G(e)&&\"\"==h)return _;if(n&&\"\"==h&&(Z(e)||null!==e.port))return;if(c=U(e,h))return c;if(h=\"\",l=be,n)return;continue}\"[\"==i?v=!0:\"]\"==i&&(v=!1),h+=i}else{if(\"\"==h)return _;if(c=U(e,h))return c;if(h=\"\",l=me,n==he)return}break;case me:if(!P.test(i)){if(i==r||\"/\"==i||\"?\"==i||\"#\"==i||\"\\\\\"==i&&G(e)||n){if(\"\"!=h){var x=parseInt(h,10);if(x>65535)return A;e.port=G(e)&&x===K[e.scheme]?null:x,h=\"\"}if(n)return;l=be;continue}return A}h+=i;break;case ve:if(e.scheme=\"file\",\"/\"==i||\"\\\\\"==i)l=ge;else{if(!a||\"file\"!=a.scheme){l=Ee;continue}if(i==r)e.host=a.host,e.path=a.path.slice(),e.query=a.query;else if(\"?\"==i)e.host=a.host,e.path=a.path.slice(),e.query=\"\",l=Se;else{if(\"#\"!=i){ee(o.slice(f).join(\"\"))||(e.host=a.host,e.path=a.path.slice(),te(e)),l=Ee;continue}e.host=a.host,e.path=a.path.slice(),e.query=a.query,e.fragment=\"\",l=we}}break;case ge:if(\"/\"==i||\"\\\\\"==i){l=ye;break}a&&\"file\"==a.scheme&&!ee(o.slice(f).join(\"\"))&&(Q(a.path[0],!0)?e.path.push(a.path[0]):e.host=a.host),l=Ee;continue;case ye:if(i==r||\"/\"==i||\"\\\\\"==i||\"?\"==i||\"#\"==i){if(!n&&Q(h))l=Ee;else if(\"\"==h){if(e.host=\"\",n)return;l=be}else{if(c=U(e,h))return c;if(\"localhost\"==e.host&&(e.host=\"\"),n)return;h=\"\",l=be}continue}h+=i;break;case be:if(G(e)){if(l=Ee,\"/\"!=i&&\"\\\\\"!=i)continue}else if(n||\"?\"!=i)if(n||\"#\"!=i){if(i!=r&&(l=Ee,\"/\"!=i))continue}else e.fragment=\"\",l=we;else e.query=\"\",l=Se;break;case Ee:if(i==r||\"/\"==i||\"\\\\\"==i&&G(e)||!n&&(\"?\"==i||\"#\"==i)){if(\"..\"===(u=(u=h).toLowerCase())||\"%2e.\"===u||\".%2e\"===u||\"%2e%2e\"===u?(te(e),\"/\"==i||\"\\\\\"==i&&G(e)||e.path.push(\"\")):ne(h)?\"/\"==i||\"\\\\\"==i&&G(e)||e.path.push(\"\"):(\"file\"==e.scheme&&!e.path.length&&Q(h)&&(e.host&&(e.host=\"\"),h=h.charAt(0)+\":\"),e.path.push(h)),h=\"\",\"file\"==e.scheme&&(i==r||\"?\"==i||\"#\"==i))for(;e.path.length>1&&\"\"===e.path[0];)e.path.shift();\"?\"==i?(e.query=\"\",l=Se):\"#\"==i&&(e.fragment=\"\",l=we)}else h+=Y(i,H);break;case xe:\"?\"==i?(e.query=\"\",l=Se):\"#\"==i?(e.fragment=\"\",l=we):i!=r&&(e.path[0]+=Y(i,J));break;case Se:n||\"#\"!=i?i!=r&&(\"'\"==i&&G(e)?e.query+=\"%27\":e.query+=\"#\"==i?\"%23\":Y(i,J)):(e.fragment=\"\",l=we);break;case we:i!=r&&(e.fragment+=Y(i,W))}f++}},Oe=function(e){var t,n,r=l(this,Oe,\"URL\"),a=arguments.length>1?arguments[1]:void 0,i=String(e),s=S(r,{type:\"URL\"});if(void 0!==a)if(a instanceof Oe)t=w(a);else if(n=je(t={},String(a)))throw TypeError(n);if(n=je(s,i,null,t))throw TypeError(n);var c=s.searchParams=new E,u=x(c);u.updateSearchParams(s.query),u.updateURL=function(){s.query=String(c)||null},o||(r.href=_e.call(r),r.origin=Ae.call(r),r.protocol=ke.call(r),r.username=Ie.call(r),r.password=Pe.call(r),r.host=Te.call(r),r.hostname=Re.call(r),r.port=Ne.call(r),r.pathname=Me.call(r),r.search=qe.call(r),r.searchParams=De.call(r),r.hash=Be.call(r))},Ce=Oe.prototype,_e=function(){var e=w(this),t=e.scheme,n=e.username,r=e.password,a=e.host,o=e.port,i=e.path,s=e.query,c=e.fragment,u=t+\":\";return null!==a?(u+=\"//\",Z(e)&&(u+=n+(r?\":\"+r:\"\")+\"@\"),u+=F(a),null!==o&&(u+=\":\"+o)):\"file\"==t&&(u+=\"//\"),u+=e.cannotBeABaseURL?i[0]:i.length?\"/\"+i.join(\"/\"):\"\",null!==s&&(u+=\"?\"+s),null!==c&&(u+=\"#\"+c),u},Ae=function(){var e=w(this),t=e.scheme,n=e.port;if(\"blob\"==t)try{return new Oe(t.path[0]).origin}catch(e){return\"null\"}return\"file\"!=t&&G(e)?t+\"://\"+F(e.host)+(null!==n?\":\"+n:\"\"):\"null\"},ke=function(){return w(this).scheme+\":\"},Ie=function(){return w(this).username},Pe=function(){return w(this).password},Te=function(){var e=w(this),t=e.host,n=e.port;return null===t?\"\":null===n?F(t):F(t)+\":\"+n},Re=function(){var e=w(this).host;return null===e?\"\":F(e)},Ne=function(){var e=w(this).port;return null===e?\"\":String(e)},Me=function(){var e=w(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?\"/\"+t.join(\"/\"):\"\"},qe=function(){var e=w(this).query;return e?\"?\"+e:\"\"},De=function(){return w(this).searchParams},Be=function(){var e=w(this).fragment;return e?\"#\"+e:\"\"},Le=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&c(Ce,{href:Le(_e,(function(e){var t=w(this),n=String(e),r=je(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)})),origin:Le(Ae),protocol:Le(ke,(function(e){var t=w(this);je(t,String(e)+\":\",re)})),username:Le(Ie,(function(e){var t=w(this),n=d(String(e));if(!X(t)){t.username=\"\";for(var r=0;r<n.length;r++)t.username+=Y(n[r],$)}})),password:Le(Pe,(function(e){var t=w(this),n=d(String(e));if(!X(t)){t.password=\"\";for(var r=0;r<n.length;r++)t.password+=Y(n[r],$)}})),host:Le(Te,(function(e){var t=w(this);t.cannotBeABaseURL||je(t,String(e),de)})),hostname:Le(Re,(function(e){var t=w(this);t.cannotBeABaseURL||je(t,String(e),he)})),port:Le(Ne,(function(e){var t=w(this);X(t)||(\"\"==(e=String(e))?t.port=null:je(t,e,me))})),pathname:Le(Me,(function(e){var t=w(this);t.cannotBeABaseURL||(t.path=[],je(t,e+\"\",be))})),search:Le(qe,(function(e){var t=w(this);\"\"==(e=String(e))?t.query=null:(\"?\"==e.charAt(0)&&(e=e.slice(1)),t.query=\"\",je(t,e,Se)),x(t.searchParams).updateSearchParams(t.query)})),searchParams:Le(De),hash:Le(Be,(function(e){var t=w(this);\"\"!=(e=String(e))?(\"#\"==e.charAt(0)&&(e=e.slice(1)),t.fragment=\"\",je(t,e,we)):t.fragment=null}))}),u(Ce,\"toJSON\",(function(){return _e.call(this)}),{enumerable:!0}),u(Ce,\"toString\",(function(){return _e.call(this)}),{enumerable:!0}),b){var Ue=b.createObjectURL,Ve=b.revokeObjectURL;Ue&&u(Oe,\"createObjectURL\",(function(e){return Ue.apply(b,arguments)})),Ve&&u(Oe,\"revokeObjectURL\",(function(e){return Ve.apply(b,arguments)}))}v(Oe,\"URL\"),a({global:!0,forced:!i,sham:!o},{URL:Oe})},function(e,t,n){\"use strict\";var r=2147483647,a=/[^\\0-\\u007E]/,o=/[.\\u3002\\uFF0E\\uFF61]/g,i=\"Overflow: input needs wider integers to process\",s=Math.floor,c=String.fromCharCode,u=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?s(e/700):e>>1,e+=s(e/t);e>455;r+=36)e=s(e/35);return s(r+36*e/(e+38))},p=function(e){var t,n,a=[],o=(e=function(e){for(var t=[],n=0,r=e.length;n<r;){var a=e.charCodeAt(n++);if(a>=55296&&a<=56319&&n<r){var o=e.charCodeAt(n++);56320==(64512&o)?t.push(((1023&a)<<10)+(1023&o)+65536):(t.push(a),n--)}else t.push(a)}return t}(e)).length,p=128,f=0,d=72;for(t=0;t<e.length;t++)(n=e[t])<128&&a.push(c(n));var h=a.length,m=h;for(h&&a.push(\"-\");m<o;){var v=r;for(t=0;t<e.length;t++)(n=e[t])>=p&&n<v&&(v=n);var g=m+1;if(v-p>s((r-f)/g))throw RangeError(i);for(f+=(v-p)*g,p=v,t=0;t<e.length;t++){if((n=e[t])<p&&++f>r)throw RangeError(i);if(n==p){for(var y=f,b=36;;b+=36){var E=b<=d?1:b>=d+26?26:b-d;if(y<E)break;var x=y-E,S=36-E;a.push(c(u(E+x%S))),y=s(x/S)}a.push(c(u(y))),d=l(f,g,m==h),f=0,++m}}++f,++p}return a.join(\"\")};e.exports=function(e){var t,n,r=[],i=e.toLowerCase().replace(o,\".\").split(\".\");for(t=0;t<i.length;t++)n=i[t],r.push(a.test(n)?\"xn--\"+p(n):n);return r.join(\".\")}},function(e,t,n){var r=n(46),a=n(127);e.exports=function(e){var t=a(e);if(\"function\"!=typeof t)throw TypeError(String(e)+\" is not iterable\");return r(t.call(e))}},function(e,t){},function(e,t,n){n(755);var r=n(31);e.exports=r.setTimeout},function(e,t,n){var r=n(21),a=n(36),o=n(91),i=[].slice,s=function(e){return function(t,n){var r=arguments.length>2,a=r?i.call(arguments,2):void 0;return e(r?function(){(\"function\"==typeof t?t:Function(t)).apply(this,a)}:t,n)}};r({global:!0,bind:!0,forced:/MSIE .\\./.test(o)},{setTimeout:s(a.setTimeout),setInterval:s(a.setInterval)})},function(e,t,n){var r=n(757);e.exports=r},function(e,t,n){n(758),n(145),n(107),n(74);var r=n(31);e.exports=r.Map},function(e,t,n){\"use strict\";var r=n(377),a=n(759);e.exports=r(\"Map\",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),a)},function(e,t,n){\"use strict\";var r=n(59).f,a=n(92),o=n(130),i=n(90),s=n(112),c=n(99),u=n(196),l=n(357),p=n(43),f=n(163).fastKey,d=n(67),h=d.set,m=d.getterFor;e.exports={getConstructor:function(e,t,n,u){var l=e((function(e,r){s(e,l,t),h(e,{type:t,index:a(null),first:void 0,last:void 0,size:0}),p||(e.size=0),null!=r&&c(r,e[u],{that:e,AS_ENTRIES:n})})),d=m(t),v=function(e,t,n){var r,a,o=d(e),i=g(e,t);return i?i.value=n:(o.last=i={index:a=f(t,!0),key:t,value:n,previous:r=o.last,next:void 0,removed:!1},o.first||(o.first=i),r&&(r.next=i),p?o.size++:e.size++,\"F\"!==a&&(o.index[a]=i)),e},g=function(e,t){var n,r=d(e),a=f(t);if(\"F\"!==a)return r.index[a];for(n=r.first;n;n=n.next)if(n.key==t)return n};return o(l.prototype,{clear:function(){for(var e=d(this),t=e.index,n=e.first;n;)n.removed=!0,n.previous&&(n.previous=n.previous.next=void 0),delete t[n.index],n=n.next;e.first=e.last=void 0,p?e.size=0:this.size=0},delete:function(e){var t=this,n=d(t),r=g(t,e);if(r){var a=r.next,o=r.previous;delete n.index[r.index],r.removed=!0,o&&(o.next=a),a&&(a.previous=o),n.first==r&&(n.first=a),n.last==r&&(n.last=o),p?n.size--:t.size--}return!!r},forEach:function(e){for(var t,n=d(this),r=i(e,arguments.length>1?arguments[1]:void 0,3);t=t?t.next:n.first;)for(r(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!g(this,e)}}),o(l.prototype,n?{get:function(e){var t=g(this,e);return t&&t.value},set:function(e,t){return v(this,0===e?0:e,t)}}:{add:function(e){return v(this,e=0===e?0:e,e)}}),p&&r(l.prototype,\"size\",{get:function(){return d(this).size}}),l},setStrong:function(e,t,n){var r=t+\" Iterator\",a=m(t),o=m(r);u(e,t,(function(e,t){h(this,{type:r,target:e,state:a(e),kind:t,last:void 0})}),(function(){for(var e=o(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?\"keys\"==t?{value:n.key,done:!1}:\"values\"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),n?\"entries\":\"values\",!n,!0),l(t)}}},function(e,t,n){n(74);var r=n(761),a=n(83),o=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.keys;return e===o||e instanceof Array&&t===o.keys||i.hasOwnProperty(a(e))?r:t}},function(e,t,n){var r=n(762);e.exports=r},function(e,t,n){n(126);var r=n(38);e.exports=r(\"Array\").keys},function(e,t,n){n(74);var r=n(764),a=n(83),o=Array.prototype,i={DOMTokenList:!0,NodeList:!0};e.exports=function(e){var t=e.values;return e===o||e instanceof Array&&t===o.values||i.hasOwnProperty(a(e))?r:t}},function(e,t,n){var r=n(765);e.exports=r},function(e,t,n){n(126);var r=n(38);e.exports=r(\"Array\").values},function(e,t,n){var r=n(767);e.exports=r},function(e,t,n){var r=n(768),a=Array.prototype;e.exports=function(e){var t=e.lastIndexOf;return e===a||e instanceof Array&&t===a.lastIndexOf?r:t}},function(e,t,n){n(769);var r=n(38);e.exports=r(\"Array\").lastIndexOf},function(e,t,n){var r=n(21),a=n(770);r({target:\"Array\",proto:!0,forced:a!==[].lastIndexOf},{lastIndexOf:a})},function(e,t,n){\"use strict\";var r=n(57),a=n(105),o=n(60),i=n(94),s=Math.min,c=[].lastIndexOf,u=!!c&&1/[1].lastIndexOf(1,-0)<0,l=i(\"lastIndexOf\"),p=u||!l;e.exports=p?function(e){if(u)return c.apply(this,arguments)||0;var t=r(this),n=o(t.length),i=n-1;for(arguments.length>1&&(i=s(i,a(arguments[1]))),i<0&&(i=n+i);i>=0;i--)if(i in t&&t[i]===e)return i||0;return-1}:c},function(e,t,n){var r={\"./all.js\":274,\"./auth/actions.js\":71,\"./auth/index.js\":237,\"./auth/reducers.js\":238,\"./auth/selectors.js\":239,\"./auth/spec-wrap-actions.js\":240,\"./configs/actions.js\":117,\"./configs/helpers.js\":134,\"./configs/index.js\":276,\"./configs/reducers.js\":245,\"./configs/selectors.js\":244,\"./configs/spec-actions.js\":243,\"./deep-linking/helpers.js\":138,\"./deep-linking/index.js\":246,\"./deep-linking/layout.js\":247,\"./deep-linking/operation-tag-wrapper.jsx\":249,\"./deep-linking/operation-wrapper.jsx\":248,\"./download-url.js\":242,\"./err/actions.js\":52,\"./err/error-transformers/hook.js\":103,\"./err/error-transformers/transformers/not-of-type.js\":220,\"./err/error-transformers/transformers/parameter-oneof.js\":221,\"./err/index.js\":218,\"./err/reducers.js\":219,\"./err/selectors.js\":222,\"./filter/index.js\":250,\"./filter/opsFilter.js\":251,\"./layout/actions.js\":86,\"./layout/index.js\":223,\"./layout/reducers.js\":224,\"./layout/selectors.js\":225,\"./layout/spec-extensions/wrap-selector.js\":226,\"./logs/index.js\":235,\"./oas3/actions.js\":48,\"./oas3/auth-extensions/wrap-selectors.js\":255,\"./oas3/components/callbacks.jsx\":258,\"./oas3/components/http-auth.jsx\":263,\"./oas3/components/index.js\":257,\"./oas3/components/operation-link.jsx\":259,\"./oas3/components/operation-servers.jsx\":264,\"./oas3/components/request-body-editor.jsx\":262,\"./oas3/components/request-body.jsx\":135,\"./oas3/components/servers-container.jsx\":261,\"./oas3/components/servers.jsx\":260,\"./oas3/helpers.jsx\":32,\"./oas3/index.js\":253,\"./oas3/reducers.js\":273,\"./oas3/selectors.js\":272,\"./oas3/spec-extensions/selectors.js\":256,\"./oas3/spec-extensions/wrap-selectors.js\":254,\"./oas3/wrap-components/auth-item.jsx\":267,\"./oas3/wrap-components/index.js\":265,\"./oas3/wrap-components/json-schema-string.jsx\":271,\"./oas3/wrap-components/markdown.jsx\":266,\"./oas3/wrap-components/model.jsx\":270,\"./oas3/wrap-components/online-validator-badge.js\":269,\"./oas3/wrap-components/version-stamp.jsx\":268,\"./on-complete/index.js\":252,\"./request-snippets/fn.js\":133,\"./request-snippets/index.js\":232,\"./request-snippets/request-snippets.jsx\":234,\"./request-snippets/selectors.js\":233,\"./samples/fn.js\":115,\"./samples/index.js\":231,\"./spec/actions.js\":41,\"./spec/index.js\":227,\"./spec/reducers.js\":228,\"./spec/selectors.js\":77,\"./spec/wrap-actions.js\":229,\"./swagger-js/configs-wrap-actions.js\":236,\"./swagger-js/index.js\":275,\"./util/index.js\":241,\"./view/index.js\":230,\"./view/root-injects.jsx\":137};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error(\"Cannot find module '\"+e+\"'\");throw t.code=\"MODULE_NOT_FOUND\",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=771},function(e,t,n){\"use strict\";n.r(t);var r={};n.r(r),n.d(r,\"Container\",(function(){return xn})),n.d(r,\"Col\",(function(){return wn})),n.d(r,\"Row\",(function(){return jn})),n.d(r,\"Button\",(function(){return On})),n.d(r,\"TextArea\",(function(){return Cn})),n.d(r,\"Input\",(function(){return _n})),n.d(r,\"Select\",(function(){return An})),n.d(r,\"Link\",(function(){return kn})),n.d(r,\"Collapse\",(function(){return Pn}));var a={};n.r(a),n.d(a,\"JsonSchemaForm\",(function(){return br})),n.d(a,\"JsonSchema_string\",(function(){return Er})),n.d(a,\"JsonSchema_array\",(function(){return xr})),n.d(a,\"JsonSchemaArrayItemText\",(function(){return Sr})),n.d(a,\"JsonSchemaArrayItemFile\",(function(){return wr})),n.d(a,\"JsonSchema_boolean\",(function(){return jr})),n.d(a,\"JsonSchema_object\",(function(){return Cr}));var o=n(18),i=n.n(o),s=n(2),c=n.n(s),u=n(12),l=n.n(u),p=n(15),f=n.n(p),d=n(30),h=n.n(d),m=n(68),v=n.n(m),g=n(3),y=n.n(g),b=n(6),E=n.n(b),x=n(7),S=n.n(x),w=n(33),j=n.n(w),O=n(20),C=n.n(O),_=n(19),A=n.n(_),k=n(22),I=n.n(k),P=n(28),T=n.n(P),R=n(4),N=n.n(R),M=n(0),q=n.n(M),D=n(139),B=n(1),L=n.n(B),U=n(381),V=n(114),z=n(382),F=n.n(z),J=n(52),W=n(25),H=n(5),$=function(e){return e};var Y=function(){function e(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};E()(this,e),v()(this,{state:{},plugins:[],pluginsOptions:{},system:{configs:{},fn:{},components:{},rootInjects:{},statePlugins:{}},boundSystem:{},toolbox:{}},n),this.getSystem=j()(t=this._getSystem).call(t,this),this.store=Q($,Object(B.fromJS)(this.state),this.getSystem),this.buildSystem(!1),this.register(this.plugins)}return S()(e,[{key:\"getStore\",value:function(){return this.store}},{key:\"register\",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=K(e,this.getSystem(),this.pluginsOptions);Z(this.system,n),t&&this.buildSystem();var r=G.call(this.system,e,this.getSystem());r&&this.buildSystem()}},{key:\"buildSystem\",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.getStore().dispatch,n=this.getStore().getState;this.boundSystem=C()({},this.getRootInjects(),this.getWrappedAndBoundActions(t),this.getWrappedAndBoundSelectors(n,this.getSystem),this.getStateThunks(n),this.getFn(),this.getConfigs()),e&&this.rebuildReducer()}},{key:\"_getSystem\",value:function(){return this.boundSystem}},{key:\"getRootInjects\",value:function(){var e,t,n;return C()({getSystem:this.getSystem,getStore:j()(e=this.getStore).call(e,this),getComponents:j()(t=this.getComponents).call(t,this),getState:this.getStore().getState,getConfigs:j()(n=this._getConfigs).call(n,this),Im:L.a,React:q.a},this.system.rootInjects||{})}},{key:\"_getConfigs\",value:function(){return this.system.configs}},{key:\"getConfigs\",value:function(){return{configs:this.system.configs}}},{key:\"setConfigs\",value:function(e){this.system.configs=e}},{key:\"rebuildReducer\",value:function(){var e,t,n,r;this.store.replaceReducer((r=this.system.statePlugins,e=Object(H.x)(r,(function(e){return e.reducers})),n=T()(t=f()(e)).call(t,(function(t,n){return t[n]=function(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new B.Map,n=arguments.length>1?arguments[1]:void 0;if(!e)return t;var r=e[n.type];if(r){var a=X(r)(t,n);return null===a?t:a}return t}}(e[n]),t}),{}),f()(n).length?Object(U.combineReducers)(n):$))}},{key:\"getType\",value:function(e){var t=e[0].toUpperCase()+A()(e).call(e,1);return Object(H.y)(this.system.statePlugins,(function(n,r){var a=n[e];if(a)return y()({},r+t,a)}))}},{key:\"getSelectors\",value:function(){return this.getType(\"selectors\")}},{key:\"getActions\",value:function(){var e=this.getType(\"actions\");return Object(H.x)(e,(function(e){return Object(H.y)(e,(function(e,t){if(Object(H.r)(e))return y()({},t,e)}))}))}},{key:\"getWrappedAndBoundActions\",value:function(e){var t=this,n=this.getBoundActions(e);return Object(H.x)(n,(function(e,n){var r=t.system.statePlugins[A()(n).call(n,0,-7)].wrapActions;return r?Object(H.x)(e,(function(e,n){var a=r[n];return a?(I()(a)||(a=[a]),T()(a).call(a,(function(e,n){var r=function(){return n(e,t.getSystem()).apply(void 0,arguments)};if(!Object(H.r)(r))throw new TypeError(\"wrapActions needs to return a function that returns a new function (ie the wrapped action)\");return X(r)}),e||Function.prototype)):e})):e}))}},{key:\"getWrappedAndBoundSelectors\",value:function(e,t){var n=this,r=this.getBoundSelectors(e,t);return Object(H.x)(r,(function(t,r){var a=[A()(r).call(r,0,-9)],o=n.system.statePlugins[a].wrapSelectors;return o?Object(H.x)(t,(function(t,r){var i=o[r];return i?(I()(i)||(i=[i]),T()(i).call(i,(function(t,r){var o=function(){for(var o,i=arguments.length,s=new Array(i),u=0;u<i;u++)s[u]=arguments[u];return r(t,n.getSystem()).apply(void 0,c()(o=[e().getIn(a)]).call(o,s))};if(!Object(H.r)(o))throw new TypeError(\"wrapSelector needs to return a function that returns a new function (ie the wrapped action)\");return o}),t||Function.prototype)):t})):t}))}},{key:\"getStates\",value:function(e){var t;return T()(t=f()(this.system.statePlugins)).call(t,(function(t,n){return t[n]=e.get(n),t}),{})}},{key:\"getStateThunks\",value:function(e){var t;return T()(t=f()(this.system.statePlugins)).call(t,(function(t,n){return t[n]=function(){return e().get(n)},t}),{})}},{key:\"getFn\",value:function(){return{fn:this.system.fn}}},{key:\"getComponents\",value:function(e){var t=this,n=this.system.components[e];return I()(n)?T()(n).call(n,(function(e,n){return n(e,t.getSystem())})):void 0!==e?this.system.components[e]:this.system.components}},{key:\"getBoundSelectors\",value:function(e,t){return Object(H.x)(this.getSelectors(),(function(n,r){var a=[A()(r).call(r,0,-9)],o=function(){return e().getIn(a)};return Object(H.x)(n,(function(e){return function(){for(var n,r=arguments.length,a=new Array(r),i=0;i<r;i++)a[i]=arguments[i];var s=X(e).apply(null,c()(n=[o()]).call(n,a));return\"function\"==typeof s&&(s=X(s)(t())),s}}))}))}},{key:\"getBoundActions\",value:function(e){e=e||this.getStore().dispatch;var t=this.getActions(),n=function e(t){return\"function\"!=typeof t?Object(H.x)(t,(function(t){return e(t)})):function(){var e=null;try{e=t.apply(void 0,arguments)}catch(t){e={type:J.NEW_THROWN_ERR,error:!0,payload:Object(V.serializeError)(t)}}finally{return e}}};return Object(H.x)(t,(function(t){return Object(D.bindActionCreators)(n(t),e)}))}},{key:\"getMapStateToProps\",value:function(){var e=this;return function(){return C()({},e.getSystem())}}},{key:\"getMapDispatchToProps\",value:function(e){var t=this;return function(n){return v()({},t.getWrappedAndBoundActions(n),t.getFn(),e)}}}]),e}();function K(e,t,n){if(Object(H.t)(e)&&!Object(H.p)(e))return F()({},e);if(Object(H.s)(e))return K(e(t),t,n);if(Object(H.p)(e)){var r,a=\"chain\"===n.pluginLoadType?t.getComponents():{};return T()(r=N()(e).call(e,(function(e){return K(e,t,n)}))).call(r,Z,a)}return{}}function G(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=r.hasLoaded,o=a;return Object(H.t)(e)&&!Object(H.p)(e)&&\"function\"==typeof e.afterLoad&&(o=!0,X(e.afterLoad).call(this,t)),Object(H.s)(e)?G.call(this,e(t),t,{hasLoaded:o}):Object(H.p)(e)?N()(e).call(e,(function(e){return G.call(n,e,t,{hasLoaded:o})})):o}function Z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!Object(H.t)(e))return{};if(!Object(H.t)(t))return e;t.wrapComponents&&(Object(H.x)(t.wrapComponents,(function(n,r){var a=e.components&&e.components[r];a&&I()(a)?(e.components[r]=c()(a).call(a,[n]),delete t.wrapComponents[r]):a&&(e.components[r]=[a,n],delete t.wrapComponents[r])})),f()(t.wrapComponents).length||delete t.wrapComponents);var n=e.statePlugins;if(Object(H.t)(n))for(var r in n){var a=n[r];if(Object(H.t)(a)){var o=a.wrapActions,i=a.wrapSelectors;if(Object(H.t)(o))for(var s in o){var u,l=o[s];if(I()(l)||(l=[l],o[s]=l),t&&t.statePlugins&&t.statePlugins[r]&&t.statePlugins[r].wrapActions&&t.statePlugins[r].wrapActions[s])t.statePlugins[r].wrapActions[s]=c()(u=o[s]).call(u,t.statePlugins[r].wrapActions[s])}if(Object(H.t)(i))for(var p in i){var d,h=i[p];if(I()(h)||(h=[h],i[p]=h),t&&t.statePlugins&&t.statePlugins[r]&&t.statePlugins[r].wrapSelectors&&t.statePlugins[r].wrapSelectors[p])t.statePlugins[r].wrapSelectors[p]=c()(d=i[p]).call(d,t.statePlugins[r].wrapSelectors[p])}}}return v()(e,t)}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.logErrors,r=void 0===n||n;return\"function\"!=typeof e?e:function(){try{for(var t,n=arguments.length,a=new Array(n),o=0;o<n;o++)a[o]=arguments[o];return e.call.apply(e,c()(t=[this]).call(t,a))}catch(e){return r&&console.error(e),null}}}function Q(e,t,n){return function(e,t,n){var r=[Object(H.J)(n)],a=W.a.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__||D.compose;return Object(D.createStore)(e,t,a(D.applyMiddleware.apply(void 0,r)))}(e,t,n)}var ee=n(218),te=n(223),ne=n(227),re=n(230),ae=n(231),oe=n(232),ie=n(235),se=n(275),ce=n(237),ue=n(241),le=n(242),pe=n(276),fe=n(246),de=n(250),he=n(252),me=n(10),ve=n.n(me),ge=n(8),ye=n.n(ge),be=n(9),Ee=n.n(be),xe=n(17),Se=n.n(xe),we=(n(11),n(26),n(51)),je=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"toggleShown\",(function(){var e=a.props,t=e.layoutActions,n=e.tag,r=e.operationId,o=e.isShown,i=a.getResolvedSubtree();o||void 0!==i||a.requestResolvedSubtree(),t.show([\"operations\",n,r],!o)})),y()(ve()(a),\"onCancelClick\",(function(){a.setState({tryItOutEnabled:!a.state.tryItOutEnabled})})),y()(ve()(a),\"onTryoutClick\",(function(){a.setState({tryItOutEnabled:!a.state.tryItOutEnabled})})),y()(ve()(a),\"onExecute\",(function(){a.setState({executeInProgress:!0})})),y()(ve()(a),\"getResolvedSubtree\",(function(){var e=a.props,t=e.specSelectors,n=e.path,r=e.method,o=e.specPath;return o?t.specResolvedSubtree(o.toJS()):t.specResolvedSubtree([\"paths\",n,r])})),y()(ve()(a),\"requestResolvedSubtree\",(function(){var e=a.props,t=e.specActions,n=e.path,r=e.method,o=e.specPath;return o?t.requestResolvedSubtree(o.toJS()):t.requestResolvedSubtree([\"paths\",n,r])}));var o=e.getConfigs().tryItOutEnabled;return a.state={tryItOutEnabled:!0===o||\"true\"===o,executeInProgress:!1},a}return S()(n,[{key:\"mapStateToProps\",value:function(e,t){var n,r=t.op,a=t.layoutSelectors,o=(0,t.getConfigs)(),i=o.docExpansion,s=o.deepLinking,u=o.displayOperationId,l=o.displayRequestDuration,p=o.supportedSubmitMethods,f=a.showSummary(),d=r.getIn([\"operation\",\"__originalOperationId\"])||r.getIn([\"operation\",\"operationId\"])||Object(we.e)(r.get(\"operation\"),t.path,t.method)||r.get(\"id\"),h=[\"operations\",t.tag,d],m=s&&\"false\"!==s,v=Se()(p).call(p,t.method)>=0&&(void 0===t.allowTryItOut?t.specSelectors.allowTryItOutFor(t.path,t.method):t.allowTryItOut),g=r.getIn([\"operation\",\"security\"])||t.specSelectors.security();return{operationId:d,isDeepLinkingEnabled:m,showSummary:f,displayOperationId:u,displayRequestDuration:l,allowTryItOut:v,security:g,isAuthorized:t.authSelectors.isAuthorized(g),isShown:a.isShown(h,\"full\"===i),jumpToKey:c()(n=\"paths.\".concat(t.path,\".\")).call(n,t.method),response:t.specSelectors.responseFor(t.path,t.method),request:t.specSelectors.requestFor(t.path,t.method)}}},{key:\"componentDidMount\",value:function(){var e=this.props.isShown,t=this.getResolvedSubtree();e&&void 0===t&&this.requestResolvedSubtree()}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.response,n=e.isShown,r=this.getResolvedSubtree();t!==this.props.response&&this.setState({executeInProgress:!1}),n&&void 0===r&&this.requestResolvedSubtree()}},{key:\"render\",value:function(){var e=this.props,t=e.op,n=e.tag,r=e.path,a=e.method,o=e.security,i=e.isAuthorized,s=e.operationId,c=e.showSummary,u=e.isShown,l=e.jumpToKey,p=e.allowTryItOut,f=e.response,d=e.request,h=e.displayOperationId,m=e.displayRequestDuration,v=e.isDeepLinkingEnabled,g=e.specPath,y=e.specSelectors,b=e.specActions,E=e.getComponent,x=e.getConfigs,S=e.layoutSelectors,w=e.layoutActions,j=e.authActions,O=e.authSelectors,C=e.oas3Actions,_=e.oas3Selectors,A=e.fn,k=E(\"operation\"),I=this.getResolvedSubtree()||Object(B.Map)(),P=Object(B.fromJS)({op:I,tag:n,path:r,summary:t.getIn([\"operation\",\"summary\"])||\"\",deprecated:I.get(\"deprecated\")||t.getIn([\"operation\",\"deprecated\"])||!1,method:a,security:o,isAuthorized:i,operationId:s,originalOperationId:I.getIn([\"operation\",\"__originalOperationId\"]),showSummary:c,isShown:u,jumpToKey:l,allowTryItOut:p,request:d,displayOperationId:h,displayRequestDuration:m,isDeepLinkingEnabled:v,executeInProgress:this.state.executeInProgress,tryItOutEnabled:this.state.tryItOutEnabled});return q.a.createElement(k,{operation:P,response:f,request:d,isShown:u,toggleShown:this.toggleShown,onTryoutClick:this.onTryoutClick,onCancelClick:this.onCancelClick,onExecute:this.onExecute,specPath:g,specActions:b,specSelectors:y,oas3Actions:C,oas3Selectors:_,layoutActions:w,layoutSelectors:S,authActions:j,authSelectors:O,getComponent:E,getConfigs:x,fn:A})}}]),n}(M.PureComponent);y()(je,\"defaultProps\",{showSummary:!0,response:null,allowTryItOut:!0,displayOperationId:!1,displayRequestDuration:!1});var Oe=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"getLayout\",value:function(){var e=this.props,t=e.getComponent,n=e.layoutSelectors.current(),r=t(n,!0);return r||function(){return q.a.createElement(\"h1\",null,' No layout defined for \"',n,'\" ')}}},{key:\"render\",value:function(){var e=this.getLayout();return q.a.createElement(e,null)}}]),n}(q.a.Component);Oe.defaultProps={};var Ce=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"close\",(function(){r.props.authActions.showDefinitions(!1)})),r}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.authSelectors,r=t.authActions,a=t.getComponent,o=t.errSelectors,i=t.specSelectors,s=t.fn.AST,c=void 0===s?{}:s,u=n.shownDefinitions(),l=a(\"auths\");return q.a.createElement(\"div\",{className:\"dialog-ux\"},q.a.createElement(\"div\",{className:\"backdrop-ux\"}),q.a.createElement(\"div\",{className:\"modal-ux\"},q.a.createElement(\"div\",{className:\"modal-dialog-ux\"},q.a.createElement(\"div\",{className:\"modal-ux-inner\"},q.a.createElement(\"div\",{className:\"modal-ux-header\"},q.a.createElement(\"h3\",null,\"Available authorizations\"),q.a.createElement(\"button\",{type:\"button\",className:\"close-modal\",onClick:this.close},q.a.createElement(\"svg\",{width:\"20\",height:\"20\"},q.a.createElement(\"use\",{href:\"#close\",xlinkHref:\"#close\"})))),q.a.createElement(\"div\",{className:\"modal-ux-content\"},N()(e=u.valueSeq()).call(e,(function(e,t){return q.a.createElement(l,{key:t,AST:c,definitions:e,getComponent:a,errSelectors:o,authSelectors:n,authActions:r,specSelectors:i})})))))))}}]),n}(q.a.Component),_e=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.isAuthorized,n=e.showPopup,r=e.onClick,a=(0,e.getComponent)(\"authorizationPopup\",!0);return q.a.createElement(\"div\",{className:\"auth-wrapper\"},q.a.createElement(\"button\",{className:t?\"btn authorize locked\":\"btn authorize unlocked\",onClick:r},q.a.createElement(\"span\",null,\"Authorize\"),q.a.createElement(\"svg\",{width:\"20\",height:\"20\"},q.a.createElement(\"use\",{href:t?\"#locked\":\"#unlocked\",xlinkHref:t?\"#locked\":\"#unlocked\"}))),n&&q.a.createElement(a,null))}}]),n}(q.a.Component),Ae=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.authActions,n=e.authSelectors,r=e.specSelectors,a=e.getComponent,o=r.securityDefinitions(),i=n.definitionsToAuthorize(),s=a(\"authorizeBtn\");return o?q.a.createElement(s,{onClick:function(){return t.showDefinitions(i)},isAuthorized:!!n.authorized().size,showPopup:!!n.shownDefinitions(),getComponent:a}):null}}]),n}(q.a.Component),ke=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onClick\",(function(e){e.stopPropagation();var t=r.props.onClick;t&&t()})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props.isAuthorized;return q.a.createElement(\"button\",{className:e?\"authorization__btn locked\":\"authorization__btn unlocked\",\"aria-label\":e?\"authorization button locked\":\"authorization button unlocked\",onClick:this.onClick},q.a.createElement(\"svg\",{width:\"20\",height:\"20\"},q.a.createElement(\"use\",{href:e?\"#locked\":\"#unlocked\",xlinkHref:e?\"#locked\":\"#unlocked\"})))}}]),n}(q.a.Component),Ie=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;return E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"onAuthChange\",(function(e){var t=e.name;a.setState(y()({},t,e))})),y()(ve()(a),\"submitAuth\",(function(e){e.preventDefault(),a.props.authActions.authorizeWithPersistOption(a.state)})),y()(ve()(a),\"logoutClick\",(function(e){e.preventDefault();var t=a.props,n=t.authActions,r=t.definitions,o=N()(r).call(r,(function(e,t){return t})).toArray();a.setState(T()(o).call(o,(function(e,t){return e[t]=\"\",e}),{})),n.logoutWithPersistOption(o)})),y()(ve()(a),\"close\",(function(e){e.preventDefault(),a.props.authActions.showDefinitions(!1)})),a.state={},a}return S()(n,[{key:\"render\",value:function(){var e,t=this,n=this.props,r=n.definitions,a=n.getComponent,o=n.authSelectors,i=n.errSelectors,s=a(\"AuthItem\"),c=a(\"oauth2\",!0),u=a(\"Button\"),p=o.authorized(),f=l()(r).call(r,(function(e,t){return!!p.get(t)})),d=l()(r).call(r,(function(e){return\"oauth2\"!==e.get(\"type\")})),h=l()(r).call(r,(function(e){return\"oauth2\"===e.get(\"type\")}));return q.a.createElement(\"div\",{className:\"auth-container\"},!!d.size&&q.a.createElement(\"form\",{onSubmit:this.submitAuth},N()(d).call(d,(function(e,n){return q.a.createElement(s,{key:n,schema:e,name:n,getComponent:a,onAuthChange:t.onAuthChange,authorized:p,errSelectors:i})})).toArray(),q.a.createElement(\"div\",{className:\"auth-btn-wrapper\"},d.size===f.size?q.a.createElement(u,{className:\"btn modal-btn auth\",onClick:this.logoutClick},\"Logout\"):q.a.createElement(u,{type:\"submit\",className:\"btn modal-btn auth authorize\"},\"Authorize\"),q.a.createElement(u,{className:\"btn modal-btn auth btn-done\",onClick:this.close},\"Close\"))),h&&h.size?q.a.createElement(\"div\",null,q.a.createElement(\"div\",{className:\"scope-def\"},q.a.createElement(\"p\",null,\"Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.\"),q.a.createElement(\"p\",null,\"API requires the following scopes. Select which ones you want to grant to Swagger UI.\")),N()(e=l()(r).call(r,(function(e){return\"oauth2\"===e.get(\"type\")}))).call(e,(function(e,t){return q.a.createElement(\"div\",{key:t},q.a.createElement(c,{authorized:p,schema:e,name:t}))})).toArray()):null)}}]),n}(q.a.Component),Pe=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.schema,r=t.name,a=t.getComponent,o=t.onAuthChange,i=t.authorized,s=t.errSelectors,c=a(\"apiKeyAuth\"),u=a(\"basicAuth\"),l=n.get(\"type\");switch(l){case\"apiKey\":e=q.a.createElement(c,{key:r,schema:n,name:r,errSelectors:s,authorized:i,getComponent:a,onChange:o});break;case\"basic\":e=q.a.createElement(u,{key:r,schema:n,name:r,errSelectors:s,authorized:i,getComponent:a,onChange:o});break;default:e=q.a.createElement(\"div\",{key:r},\"Unknown security definition type \",l)}return q.a.createElement(\"div\",{key:\"\".concat(r,\"-jump\")},e)}}]),n}(q.a.Component),Te=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props.error,t=e.get(\"level\"),n=e.get(\"message\"),r=e.get(\"source\");return q.a.createElement(\"div\",{className:\"errors\"},q.a.createElement(\"b\",null,r,\" \",t),q.a.createElement(\"span\",null,n))}}]),n}(q.a.Component),Re=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"onChange\",(function(e){var t=a.props.onChange,n=e.target.value,r=C()({},a.state,{value:n});a.setState(r),t(r)}));var o=a.props,i=o.name,s=o.schema,c=a.getValue();return a.state={name:i,schema:s,value:c},a}return S()(n,[{key:\"getValue\",value:function(){var e=this.props,t=e.name,n=e.authorized;return n&&n.getIn([t,\"value\"])}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.schema,a=n.getComponent,o=n.errSelectors,i=n.name,s=a(\"Input\"),c=a(\"Row\"),u=a(\"Col\"),p=a(\"authError\"),f=a(\"Markdown\",!0),d=a(\"JumpToPath\",!0),h=this.getValue(),m=l()(e=o.allErrors()).call(e,(function(e){return e.get(\"authId\")===i}));return q.a.createElement(\"div\",null,q.a.createElement(\"h4\",null,q.a.createElement(\"code\",null,i||r.get(\"name\")),\"  (apiKey)\",q.a.createElement(d,{path:[\"securityDefinitions\",i]})),h&&q.a.createElement(\"h6\",null,\"Authorized\"),q.a.createElement(c,null,q.a.createElement(f,{source:r.get(\"description\")})),q.a.createElement(c,null,q.a.createElement(\"p\",null,\"Name: \",q.a.createElement(\"code\",null,r.get(\"name\")))),q.a.createElement(c,null,q.a.createElement(\"p\",null,\"In: \",q.a.createElement(\"code\",null,r.get(\"in\")))),q.a.createElement(c,null,q.a.createElement(\"label\",null,\"Value:\"),h?q.a.createElement(\"code\",null,\" ****** \"):q.a.createElement(u,null,q.a.createElement(s,{type:\"text\",onChange:this.onChange,autoFocus:!0}))),N()(t=m.valueSeq()).call(t,(function(e,t){return q.a.createElement(p,{error:e,key:t})})))}}]),n}(q.a.Component),Ne=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"onChange\",(function(e){var t=a.props.onChange,n=e.target,r=n.value,o=n.name,i=a.state.value;i[o]=r,a.setState({value:i}),t(a.state)}));var o=a.props,i=o.schema,s=o.name,c=a.getValue().username;return a.state={name:s,schema:i,value:c?{username:c}:{}},a}return S()(n,[{key:\"getValue\",value:function(){var e=this.props,t=e.authorized,n=e.name;return t&&t.getIn([n,\"value\"])||{}}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.schema,a=n.getComponent,o=n.name,i=n.errSelectors,s=a(\"Input\"),c=a(\"Row\"),u=a(\"Col\"),p=a(\"authError\"),f=a(\"JumpToPath\",!0),d=a(\"Markdown\",!0),h=this.getValue().username,m=l()(e=i.allErrors()).call(e,(function(e){return e.get(\"authId\")===o}));return q.a.createElement(\"div\",null,q.a.createElement(\"h4\",null,\"Basic authorization\",q.a.createElement(f,{path:[\"securityDefinitions\",o]})),h&&q.a.createElement(\"h6\",null,\"Authorized\"),q.a.createElement(c,null,q.a.createElement(d,{source:r.get(\"description\")})),q.a.createElement(c,null,q.a.createElement(\"label\",null,\"Username:\"),h?q.a.createElement(\"code\",null,\" \",h,\" \"):q.a.createElement(u,null,q.a.createElement(s,{type:\"text\",required:\"required\",name:\"username\",onChange:this.onChange,autoFocus:!0}))),q.a.createElement(c,null,q.a.createElement(\"label\",null,\"Password:\"),h?q.a.createElement(\"code\",null,\" ****** \"):q.a.createElement(u,null,q.a.createElement(s,{autoComplete:\"new-password\",name:\"password\",type:\"password\",onChange:this.onChange}))),N()(t=m.valueSeq()).call(t,(function(e,t){return q.a.createElement(p,{error:e,key:t})})))}}]),n}(q.a.Component);function Me(e){var t=e.example,n=e.showValue,r=e.getComponent,a=e.getConfigs,o=r(\"Markdown\",!0),i=r(\"highlightCode\");return t?q.a.createElement(\"div\",{className:\"example\"},t.get(\"description\")?q.a.createElement(\"section\",{className:\"example__section\"},q.a.createElement(\"div\",{className:\"example__section-header\"},\"Example Description\"),q.a.createElement(\"p\",null,q.a.createElement(o,{source:t.get(\"description\")}))):null,n&&t.has(\"value\")?q.a.createElement(\"section\",{className:\"example__section\"},q.a.createElement(\"div\",{className:\"example__section-header\"},\"Example Value\"),q.a.createElement(i,{getConfigs:a,value:Object(H.I)(t.get(\"value\"))})):null):null}var qe=n(407),De=n.n(qe),Be=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"_onSelect\",(function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isSyntheticChange,a=void 0!==n&&n;\"function\"==typeof r.props.onSelect&&r.props.onSelect(e,{isSyntheticChange:a})})),y()(ve()(r),\"_onDomSelect\",(function(e){if(\"function\"==typeof r.props.onSelect){var t=e.target.selectedOptions[0].getAttribute(\"value\");r._onSelect(t,{isSyntheticChange:!1})}})),y()(ve()(r),\"getCurrentExample\",(function(){var e=r.props,t=e.examples,n=e.currentExampleKey,a=t.get(n),o=t.keySeq().first(),i=t.get(o);return a||i||De()({})})),r}return S()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.onSelect,n=e.examples;if(\"function\"==typeof t){var r=n.first(),a=n.keyOf(r);this._onSelect(a,{isSyntheticChange:!0})}}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.currentExampleKey,n=e.examples;if(n!==this.props.examples&&!n.has(t)){var r=n.first(),a=n.keyOf(r);this._onSelect(a,{isSyntheticChange:!0})}}},{key:\"render\",value:function(){var e=this.props,t=e.examples,n=e.currentExampleKey,r=e.isValueModified,a=e.isModifiedValueAvailable,o=e.showLabels;return q.a.createElement(\"div\",{className:\"examples-select\"},o?q.a.createElement(\"span\",{className:\"examples-select__section-label\"},\"Examples: \"):null,q.a.createElement(\"select\",{className:\"examples-select-element\",onChange:this._onDomSelect,value:a&&r?\"__MODIFIED__VALUE__\":n||\"\"},a?q.a.createElement(\"option\",{value:\"__MODIFIED__VALUE__\"},\"[Modified value]\"):null,N()(t).call(t,(function(e,t){return q.a.createElement(\"option\",{key:t,value:t},e.get(\"summary\")||t)})).valueSeq()))}}]),n}(q.a.PureComponent);y()(Be,\"defaultProps\",{examples:L.a.Map({}),onSelect:function(){for(var e,t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(e=console).log.apply(e,c()(t=[\"DEBUG: ExamplesSelect was not given an onSelect callback\"]).call(t,r))},currentExampleKey:null,showLabels:!0});var Le=function(e){return B.List.isList(e)?e:Object(H.I)(e)},Ue=function(e){ye()(n,e);var t=Ee()(n);function n(e){var r;E()(this,n),r=t.call(this,e),y()(ve()(r),\"_getStateForCurrentNamespace\",(function(){var e=r.props.currentNamespace;return(r.state[e]||Object(B.Map)()).toObject()})),y()(ve()(r),\"_setStateForCurrentNamespace\",(function(e){var t=r.props.currentNamespace;return r._setStateForNamespace(t,e)})),y()(ve()(r),\"_setStateForNamespace\",(function(e,t){var n=(r.state[e]||Object(B.Map)()).mergeDeep(t);return r.setState(y()({},e,n))})),y()(ve()(r),\"_isCurrentUserInputSameAsExampleValue\",(function(){var e=r.props.currentUserInputValue;return r._getCurrentExampleValue()===e})),y()(ve()(r),\"_getValueForExample\",(function(e,t){var n=(t||r.props).examples;return Le((n||Object(B.Map)({})).getIn([e,\"value\"]))})),y()(ve()(r),\"_getCurrentExampleValue\",(function(e){var t=(e||r.props).currentKey;return r._getValueForExample(t,e||r.props)})),y()(ve()(r),\"_onExamplesSelect\",(function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isSyntheticChange,a=r.props,o=a.onSelect,i=a.updateValue,s=a.currentUserInputValue,u=a.userHasEditedBody,l=r._getStateForCurrentNamespace(),p=l.lastUserEditedValue,f=r._getValueForExample(e);if(\"__MODIFIED__VALUE__\"===e)return i(Le(p)),r._setStateForCurrentNamespace({isModifiedValueSelected:!0});if(\"function\"==typeof o){for(var d,h=arguments.length,m=new Array(h>2?h-2:0),v=2;v<h;v++)m[v-2]=arguments[v];o.apply(void 0,c()(d=[e,{isSyntheticChange:n}]).call(d,m))}r._setStateForCurrentNamespace({lastDownstreamValue:f,isModifiedValueSelected:n&&u||!!s&&s!==f}),n||\"function\"==typeof i&&i(Le(f))}));var a=r._getCurrentExampleValue();return r.state=y()({},e.currentNamespace,Object(B.Map)({lastUserEditedValue:r.props.currentUserInputValue,lastDownstreamValue:a,isModifiedValueSelected:r.props.userHasEditedBody||r.props.currentUserInputValue!==a})),r}return S()(n,[{key:\"componentWillUnmount\",value:function(){this.props.setRetainRequestBodyValueFlag(!1)}},{key:\"componentWillReceiveProps\",value:function(e){var t=e.currentUserInputValue,n=e.examples,r=e.onSelect,a=e.userHasEditedBody,o=this._getStateForCurrentNamespace(),i=o.lastUserEditedValue,s=o.lastDownstreamValue,c=this._getValueForExample(e.currentKey,e),u=l()(n).call(n,(function(e){return e.get(\"value\")===t||Object(H.I)(e.get(\"value\"))===t}));u.size?r(u.has(e.currentKey)?e.currentKey:u.keySeq().first(),{isSyntheticChange:!0}):t!==this.props.currentUserInputValue&&t!==i&&t!==s&&(this.props.setRetainRequestBodyValueFlag(!0),this._setStateForNamespace(e.currentNamespace,{lastUserEditedValue:e.currentUserInputValue,isModifiedValueSelected:a||t!==c}))}},{key:\"render\",value:function(){var e=this.props,t=e.currentUserInputValue,n=e.examples,r=e.currentKey,a=e.getComponent,o=e.userHasEditedBody,i=this._getStateForCurrentNamespace(),s=i.lastDownstreamValue,c=i.lastUserEditedValue,u=i.isModifiedValueSelected,l=a(\"ExamplesSelect\");return q.a.createElement(l,{examples:n,currentExampleKey:r,onSelect:this._onExamplesSelect,isModifiedValueAvailable:!!c&&c!==s,isValueModified:void 0!==t&&u&&t!==this._getCurrentExampleValue()||o})}}]),n}(q.a.PureComponent);y()(Ue,\"defaultProps\",{userHasEditedBody:!1,examples:Object(B.Map)({}),currentNamespace:\"__DEFAULT__NAMESPACE__\",setRetainRequestBodyValueFlag:function(){},onSelect:function(){for(var e,t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(e=console).log.apply(e,c()(t=[\"ExamplesSelectValueRetainer: no `onSelect` function was provided\"]).call(t,r))},updateValue:function(){for(var e,t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(e=console).log.apply(e,c()(t=[\"ExamplesSelectValueRetainer: no `updateValue` function was provided\"]).call(t,r))}});var Ve=n(169),ze=n.n(Ve),Fe=n(102),Je=n.n(Fe),We=n(29),He=n.n(We),$e=n(78),Ye=n.n($e);var Ke=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"close\",(function(e){e.preventDefault(),a.props.authActions.showDefinitions(!1)})),y()(ve()(a),\"authorize\",(function(){var e=a.props,t=e.authActions,n=e.errActions,r=e.getConfigs,o=e.authSelectors,i=e.oas3Selectors,s=r(),c=o.getConfigs();n.clear({authId:name,type:\"auth\",source:\"auth\"}),function(e){var t=e.auth,n=e.authActions,r=e.errActions,a=e.configs,o=e.authConfigs,i=void 0===o?{}:o,s=e.currentServer,c=t.schema,u=t.scopes,l=t.name,p=t.clientId,f=c.get(\"flow\"),d=[];switch(f){case\"password\":return void n.authorizePassword(t);case\"application\":return void n.authorizeApplication(t);case\"accessCode\":d.push(\"response_type=code\");break;case\"implicit\":d.push(\"response_type=token\");break;case\"clientCredentials\":case\"client_credentials\":return void n.authorizeApplication(t);case\"authorizationCode\":case\"authorization_code\":d.push(\"response_type=code\")}\"string\"==typeof p&&d.push(\"client_id=\"+encodeURIComponent(p));var h=a.oauth2RedirectUrl;if(void 0!==h){d.push(\"redirect_uri=\"+encodeURIComponent(h));var m=[];if(I()(u)?m=u:L.a.List.isList(u)&&(m=u.toArray()),m.length>0){var v=i.scopeSeparator||\" \";d.push(\"scope=\"+encodeURIComponent(m.join(v)))}var g=Object(H.a)(new Date);if(d.push(\"state=\"+encodeURIComponent(g)),void 0!==i.realm&&d.push(\"realm=\"+encodeURIComponent(i.realm)),(\"authorizationCode\"===f||\"authorization_code\"===f||\"accessCode\"===f)&&i.usePkceWithAuthorizationCodeGrant){var y=Object(H.j)(),b=Object(H.c)(y);d.push(\"code_challenge=\"+b),d.push(\"code_challenge_method=S256\"),t.codeVerifier=y}var E=i.additionalQueryStringParams;for(var x in E){var S;void 0!==E[x]&&d.push(N()(S=[x,E[x]]).call(S,encodeURIComponent).join(\"=\"))}var w,j=c.get(\"authorizationUrl\"),O=[s?Ye()(Object(H.F)(j),s,!0).toString():Object(H.F)(j),d.join(\"&\")].join(-1===Se()(j).call(j,\"?\")?\"?\":\"&\");w=\"implicit\"===f?n.preAuthorizeImplicit:i.useBasicAuthenticationWithAccessCodeGrant?n.authorizeAccessCodeWithBasicAuthentication:n.authorizeAccessCodeWithFormParams,W.a.swaggerUIRedirectOauth2={auth:t,state:g,redirectUrl:h,callback:w,errCb:r.newAuthErr},W.a.open(O)}else r.newAuthErr({authId:l,source:\"validation\",level:\"error\",message:\"oauth2RedirectUrl configuration is not passed. Oauth2 authorization cannot be performed.\"})}({auth:a.state,currentServer:i.serverEffectiveValue(i.selectedServer()),authActions:t,errActions:n,configs:s,authConfigs:c})})),y()(ve()(a),\"onScopeChange\",(function(e){var t,n,r=e.target,o=r.checked,i=r.dataset.value;if(o&&-1===Se()(t=a.state.scopes).call(t,i)){var s,u=c()(s=a.state.scopes).call(s,[i]);a.setState({scopes:u})}else if(!o&&Se()(n=a.state.scopes).call(n,i)>-1){var p;a.setState({scopes:l()(p=a.state.scopes).call(p,(function(e){return e!==i}))})}})),y()(ve()(a),\"onInputChange\",(function(e){var t=e.target,n=t.dataset.name,r=t.value,o=y()({},n,r);a.setState(o)})),y()(ve()(a),\"selectScopes\",(function(e){var t;e.target.dataset.all?a.setState({scopes:ze()(Je()(t=a.props.schema.get(\"allowedScopes\")||a.props.schema.get(\"scopes\")).call(t))}):a.setState({scopes:[]})})),y()(ve()(a),\"logout\",(function(e){e.preventDefault();var t=a.props,n=t.authActions,r=t.errActions,o=t.name;r.clear({authId:o,type:\"auth\",source:\"auth\"}),n.logoutWithPersistOption([o])}));var o=a.props,i=o.name,s=o.schema,u=o.authorized,p=o.authSelectors,f=u&&u.get(i),d=p.getConfigs()||{},h=f&&f.get(\"username\")||\"\",m=f&&f.get(\"clientId\")||d.clientId||\"\",v=f&&f.get(\"clientSecret\")||d.clientSecret||\"\",g=f&&f.get(\"passwordType\")||\"basic\",b=f&&f.get(\"scopes\")||d.scopes||[];return\"string\"==typeof b&&(b=b.split(d.scopeSeparator||\" \")),a.state={appName:d.appName,name:i,schema:s,scopes:b,clientId:m,clientSecret:v,username:h,password:\"\",passwordType:g},a}return S()(n,[{key:\"render\",value:function(){var e,t,n=this,r=this.props,a=r.schema,o=r.getComponent,i=r.authSelectors,s=r.errSelectors,u=r.name,p=r.specSelectors,f=o(\"Input\"),d=o(\"Row\"),h=o(\"Col\"),m=o(\"Button\"),v=o(\"authError\"),g=o(\"JumpToPath\",!0),y=o(\"Markdown\",!0),b=o(\"InitializedInput\"),E=p.isOAS3,x=E()?a.get(\"openIdConnectUrl\"):null,S=\"implicit\",w=\"password\",j=E()?x?\"authorization_code\":\"authorizationCode\":\"accessCode\",O=E()?x?\"client_credentials\":\"clientCredentials\":\"application\",C=a.get(\"flow\"),_=a.get(\"allowedScopes\")||a.get(\"scopes\"),A=!!i.authorized().get(u),k=l()(e=s.allErrors()).call(e,(function(e){return e.get(\"authId\")===u})),I=!l()(k).call(k,(function(e){return\"validation\"===e.get(\"source\")})).size,P=a.get(\"description\");return q.a.createElement(\"div\",null,q.a.createElement(\"h4\",null,u,\" (OAuth2, \",a.get(\"flow\"),\") \",q.a.createElement(g,{path:[\"securityDefinitions\",u]})),this.state.appName?q.a.createElement(\"h5\",null,\"Application: \",this.state.appName,\" \"):null,P&&q.a.createElement(y,{source:a.get(\"description\")}),A&&q.a.createElement(\"h6\",null,\"Authorized\"),x&&q.a.createElement(\"p\",null,\"OpenID Connect URL: \",q.a.createElement(\"code\",null,x)),(C===S||C===j)&&q.a.createElement(\"p\",null,\"Authorization URL: \",q.a.createElement(\"code\",null,a.get(\"authorizationUrl\"))),(C===w||C===j||C===O)&&q.a.createElement(\"p\",null,\"Token URL:\",q.a.createElement(\"code\",null,\" \",a.get(\"tokenUrl\"))),q.a.createElement(\"p\",{className:\"flow\"},\"Flow: \",q.a.createElement(\"code\",null,a.get(\"flow\"))),C!==w?null:q.a.createElement(d,null,q.a.createElement(d,null,q.a.createElement(\"label\",{htmlFor:\"oauth_username\"},\"username:\"),A?q.a.createElement(\"code\",null,\" \",this.state.username,\" \"):q.a.createElement(h,{tablet:10,desktop:10},q.a.createElement(\"input\",{id:\"oauth_username\",type:\"text\",\"data-name\":\"username\",onChange:this.onInputChange,autoFocus:!0}))),q.a.createElement(d,null,q.a.createElement(\"label\",{htmlFor:\"oauth_password\"},\"password:\"),A?q.a.createElement(\"code\",null,\" ****** \"):q.a.createElement(h,{tablet:10,desktop:10},q.a.createElement(\"input\",{id:\"oauth_password\",type:\"password\",\"data-name\":\"password\",onChange:this.onInputChange}))),q.a.createElement(d,null,q.a.createElement(\"label\",{htmlFor:\"password_type\"},\"Client credentials location:\"),A?q.a.createElement(\"code\",null,\" \",this.state.passwordType,\" \"):q.a.createElement(h,{tablet:10,desktop:10},q.a.createElement(\"select\",{id:\"password_type\",\"data-name\":\"passwordType\",onChange:this.onInputChange},q.a.createElement(\"option\",{value:\"basic\"},\"Authorization header\"),q.a.createElement(\"option\",{value:\"request-body\"},\"Request body\"))))),(C===O||C===S||C===j||C===w)&&(!A||A&&this.state.clientId)&&q.a.createElement(d,null,q.a.createElement(\"label\",{htmlFor:\"client_id\"},\"client_id:\"),A?q.a.createElement(\"code\",null,\" ****** \"):q.a.createElement(h,{tablet:10,desktop:10},q.a.createElement(b,{id:\"client_id\",type:\"text\",required:C===w,initialValue:this.state.clientId,\"data-name\":\"clientId\",onChange:this.onInputChange}))),(C===O||C===j||C===w)&&q.a.createElement(d,null,q.a.createElement(\"label\",{htmlFor:\"client_secret\"},\"client_secret:\"),A?q.a.createElement(\"code\",null,\" ****** \"):q.a.createElement(h,{tablet:10,desktop:10},q.a.createElement(b,{id:\"client_secret\",initialValue:this.state.clientSecret,type:\"password\",\"data-name\":\"clientSecret\",onChange:this.onInputChange}))),!A&&_&&_.size?q.a.createElement(\"div\",{className:\"scopes\"},q.a.createElement(\"h2\",null,\"Scopes:\",q.a.createElement(\"a\",{onClick:this.selectScopes,\"data-all\":!0},\"select all\"),q.a.createElement(\"a\",{onClick:this.selectScopes},\"select none\")),N()(_).call(_,(function(e,t){var r,a,o,i,s;return q.a.createElement(d,{key:t},q.a.createElement(\"div\",{className:\"checkbox\"},q.a.createElement(f,{\"data-value\":t,id:c()(r=c()(a=\"\".concat(t,\"-\")).call(a,C,\"-checkbox-\")).call(r,n.state.name),disabled:A,checked:He()(o=n.state.scopes).call(o,t),type:\"checkbox\",onChange:n.onScopeChange}),q.a.createElement(\"label\",{htmlFor:c()(i=c()(s=\"\".concat(t,\"-\")).call(s,C,\"-checkbox-\")).call(i,n.state.name)},q.a.createElement(\"span\",{className:\"item\"}),q.a.createElement(\"div\",{className:\"text\"},q.a.createElement(\"p\",{className:\"name\"},t),q.a.createElement(\"p\",{className:\"description\"},e)))))})).toArray()):null,N()(t=k.valueSeq()).call(t,(function(e,t){return q.a.createElement(v,{error:e,key:t})})),q.a.createElement(\"div\",{className:\"auth-btn-wrapper\"},I&&(A?q.a.createElement(m,{className:\"btn modal-btn auth authorize\",onClick:this.logout},\"Logout\"):q.a.createElement(m,{className:\"btn modal-btn auth authorize\",onClick:this.authorize},\"Authorize\")),q.a.createElement(m,{className:\"btn modal-btn auth btn-done\",onClick:this.close},\"Close\")))}}]),n}(q.a.Component),Ge=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onClick\",(function(){var e=r.props,t=e.specActions,n=e.path,a=e.method;t.clearResponse(n,a),t.clearRequest(n,a)})),r}return S()(n,[{key:\"render\",value:function(){return q.a.createElement(\"button\",{className:\"btn btn-clear opblock-control__btn\",onClick:this.onClick},\"Clear\")}}]),n}(M.Component),Ze=function(e){var t=e.headers;return q.a.createElement(\"div\",null,q.a.createElement(\"h5\",null,\"Response headers\"),q.a.createElement(\"pre\",{className:\"microlight\"},t))},Xe=function(e){var t=e.duration;return q.a.createElement(\"div\",null,q.a.createElement(\"h5\",null,\"Request duration\"),q.a.createElement(\"pre\",{className:\"microlight\"},t,\" ms\"))},Qe=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"shouldComponentUpdate\",value:function(e){return this.props.response!==e.response||this.props.path!==e.path||this.props.method!==e.method||this.props.displayRequestDuration!==e.displayRequestDuration}},{key:\"render\",value:function(){var e,t=this.props,n=t.response,r=t.getComponent,a=t.getConfigs,o=t.displayRequestDuration,i=t.specSelectors,s=t.path,u=t.method,l=a(),p=l.showMutatedRequest,d=l.requestSnippetsEnabled,h=p?i.mutatedRequestFor(s,u):i.requestFor(s,u),m=n.get(\"status\"),v=h.get(\"url\"),g=n.get(\"headers\").toJS(),y=n.get(\"notDocumented\"),b=n.get(\"error\"),E=n.get(\"text\"),x=n.get(\"duration\"),S=f()(g),w=g[\"content-type\"]||g[\"Content-Type\"],j=r(\"responseBody\"),O=N()(S).call(S,(function(e){var t=I()(g[e])?g[e].join():g[e];return q.a.createElement(\"span\",{className:\"headerline\",key:e},\" \",e,\": \",t,\" \")})),C=0!==O.length,_=r(\"Markdown\",!0),A=r(\"RequestSnippets\",!0),k=r(\"curl\");return q.a.createElement(\"div\",null,h&&(!0===d||\"true\"===d?q.a.createElement(A,{request:h}):q.a.createElement(k,{request:h,getConfigs:a})),v&&q.a.createElement(\"div\",null,q.a.createElement(\"h4\",null,\"Request URL\"),q.a.createElement(\"div\",{className:\"request-url\"},q.a.createElement(\"pre\",{className:\"microlight\"},v))),q.a.createElement(\"h4\",null,\"Server response\"),q.a.createElement(\"table\",{className:\"responses-table live-responses-table\"},q.a.createElement(\"thead\",null,q.a.createElement(\"tr\",{className:\"responses-header\"},q.a.createElement(\"td\",{className:\"col_header response-col_status\"},\"Code\"),q.a.createElement(\"td\",{className:\"col_header response-col_description\"},\"Details\"))),q.a.createElement(\"tbody\",null,q.a.createElement(\"tr\",{className:\"response\"},q.a.createElement(\"td\",{className:\"response-col_status\"},m,y?q.a.createElement(\"div\",{className:\"response-undocumented\"},q.a.createElement(\"i\",null,\" Undocumented \")):null),q.a.createElement(\"td\",{className:\"response-col_description\"},b?q.a.createElement(_,{source:c()(e=\"\".concat(\"\"!==n.get(\"name\")?\"\".concat(n.get(\"name\"),\": \"):\"\")).call(e,n.get(\"message\"))}):null,E?q.a.createElement(j,{content:E,contentType:w,url:v,headers:g,getConfigs:a,getComponent:r}):null,C?q.a.createElement(Ze,{headers:O}):null,o&&x?q.a.createElement(Xe,{duration:x}):null)))))}}]),n}(q.a.Component),et=n(176),tt=[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\"],nt=c()(tt).call(tt,[\"trace\"]),rt=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"renderOperationTag\",(function(e,t){var n=r.props,a=n.specSelectors,o=n.getComponent,i=n.oas3Selectors,s=n.layoutSelectors,u=n.layoutActions,l=n.getConfigs,p=o(\"OperationContainer\",!0),f=o(\"OperationTag\"),d=e.get(\"operations\");return q.a.createElement(f,{key:\"operation-\"+t,tagObj:e,tag:t,oas3Selectors:i,layoutSelectors:s,layoutActions:u,getConfigs:l,getComponent:o,specUrl:a.url()},q.a.createElement(\"div\",{className:\"operation-tag-content\"},N()(d).call(d,(function(e){var n,r=e.get(\"path\"),o=e.get(\"method\"),i=L.a.List([\"paths\",r,o]),s=a.isOAS3()?nt:tt;return-1===Se()(s).call(s,o)?null:q.a.createElement(p,{key:c()(n=\"\".concat(r,\"-\")).call(n,o),specPath:i,op:e,path:r,method:o,tag:t})})).toArray()))})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props.specSelectors.taggedOperations();return 0===e.size?q.a.createElement(\"h3\",null,\" No operations defined in spec!\"):q.a.createElement(\"div\",null,N()(e).call(e,this.renderOperationTag).toArray(),e.size<1?q.a.createElement(\"h3\",null,\" No operations defined in spec! \"):null)}}]),n}(q.a.Component),at=n(79),ot=n.n(at);function it(e){return e.match(/^(?:[a-z]+:)?\\/\\//i)}function st(e,t){return e?it(e)?(n=e).match(/^\\/\\//i)?c()(r=\"\".concat(window.location.protocol)).call(r,n):n:new ot.a(e,t).href:t;var n,r}function ct(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.selectedServer,a=void 0===r?\"\":r;if(e){if(it(e))return e;var o=st(a,t);return it(o)?new ot.a(e,o).href:new ot.a(e,window.location.href).href}}var ut=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.tagObj,r=t.tag,a=t.children,o=t.oas3Selectors,i=t.layoutSelectors,s=t.layoutActions,c=t.getConfigs,u=t.getComponent,l=t.specUrl,p=c(),f=p.docExpansion,d=p.deepLinking,h=d&&\"false\"!==d,m=u(\"Collapse\"),v=u(\"Markdown\",!0),g=u(\"DeepLink\"),y=u(\"Link\"),b=n.getIn([\"tagDetails\",\"description\"],null),E=n.getIn([\"tagDetails\",\"externalDocs\",\"description\"]),x=n.getIn([\"tagDetails\",\"externalDocs\",\"url\"]);e=Object(H.s)(o)&&Object(H.s)(o.selectedServer)?ct(x,l,{selectedServer:o.selectedServer()}):x;var S=[\"operations-tag\",r],w=i.isShown(S,\"full\"===f||\"list\"===f);return q.a.createElement(\"div\",{className:w?\"opblock-tag-section is-open\":\"opblock-tag-section\"},q.a.createElement(\"h3\",{onClick:function(){return s.show(S,!w)},className:b?\"opblock-tag\":\"opblock-tag no-desc\",id:N()(S).call(S,(function(e){return Object(H.g)(e)})).join(\"-\"),\"data-tag\":r,\"data-is-open\":w},q.a.createElement(g,{enabled:h,isShown:w,path:Object(H.d)(r),text:r}),b?q.a.createElement(\"small\",null,q.a.createElement(v,{source:b})):q.a.createElement(\"small\",null),q.a.createElement(\"div\",null,E?q.a.createElement(\"small\",null,E,e?\": \":null,e?q.a.createElement(y,{href:Object(H.F)(e),onClick:function(e){return e.stopPropagation()},target:\"_blank\"},e):null):null),q.a.createElement(\"button\",{\"aria-expanded\":w,className:\"expand-operation\",title:w?\"Collapse operation\":\"Expand operation\",onClick:function(){return s.show(S,!w)}},q.a.createElement(\"svg\",{className:\"arrow\",width:\"20\",height:\"20\",\"aria-hidden\":\"true\",focusable:\"false\"},q.a.createElement(\"use\",{href:w?\"#large-arrow-up\":\"#large-arrow-down\",xlinkHref:w?\"#large-arrow-up\":\"#large-arrow-down\"})))),q.a.createElement(m,{isOpened:w},a))}}]),n}(q.a.Component);y()(ut,\"defaultProps\",{tagObj:L.a.fromJS({}),tag:\"\"});var lt=function(e){ye()(r,e);var t=Ee()(r);function r(){return E()(this,r),t.apply(this,arguments)}return S()(r,[{key:\"render\",value:function(){var e=this.props,t=e.specPath,r=e.response,a=e.request,o=e.toggleShown,i=e.onTryoutClick,s=e.onCancelClick,c=e.onExecute,u=e.fn,l=e.getComponent,p=e.getConfigs,f=e.specActions,d=e.specSelectors,h=e.authActions,m=e.authSelectors,v=e.oas3Actions,g=e.oas3Selectors,y=this.props.operation,b=y.toJS(),E=b.deprecated,x=b.isShown,S=b.path,w=b.method,j=b.op,O=b.tag,C=b.operationId,_=b.allowTryItOut,A=b.displayRequestDuration,k=b.tryItOutEnabled,I=b.executeInProgress,P=j.description,T=j.externalDocs,R=j.schemes,N=T?ct(T.url,d.url(),{selectedServer:g.selectedServer()}):\"\",M=y.getIn([\"op\"]),D=M.get(\"responses\"),B=Object(H.n)(M,[\"parameters\"]),L=d.operationScheme(S,w),U=[\"operations\",O,C],V=Object(H.m)(M),z=l(\"responses\"),F=l(\"parameters\"),J=l(\"execute\"),W=l(\"clear\"),$=l(\"Collapse\"),Y=l(\"Markdown\",!0),K=l(\"schemes\"),G=l(\"OperationServers\"),Z=l(\"OperationExt\"),X=l(\"OperationSummary\"),Q=l(\"Link\"),ee=p().showExtensions;if(D&&r&&r.size>0){var te=!D.get(String(r.get(\"status\")))&&!D.get(\"default\");r=r.set(\"notDocumented\",te)}var ne=[S,w];return q.a.createElement(\"div\",{className:E?\"opblock opblock-deprecated\":x?\"opblock opblock-\".concat(w,\" is-open\"):\"opblock opblock-\".concat(w),id:Object(H.g)(U.join(\"-\"))},q.a.createElement(X,{operationProps:y,isShown:x,toggleShown:o,getComponent:l,authActions:h,authSelectors:m,specPath:t}),q.a.createElement($,{isOpened:x},q.a.createElement(\"div\",{className:\"opblock-body\"},M&&M.size||null===M?null:q.a.createElement(\"img\",{height:\"32px\",width:\"32px\",src:n(380),className:\"opblock-loading-animation\"}),E&&q.a.createElement(\"h4\",{className:\"opblock-title_normal\"},\" Warning: Deprecated\"),P&&q.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},q.a.createElement(\"div\",{className:\"opblock-description\"},q.a.createElement(Y,{source:P}))),N?q.a.createElement(\"div\",{className:\"opblock-external-docs-wrapper\"},q.a.createElement(\"h4\",{className:\"opblock-title_normal\"},\"Find more details\"),q.a.createElement(\"div\",{className:\"opblock-external-docs\"},q.a.createElement(\"span\",{className:\"opblock-external-docs__description\"},q.a.createElement(Y,{source:T.description})),q.a.createElement(Q,{target:\"_blank\",className:\"opblock-external-docs__link\",href:Object(H.F)(N)},N))):null,M&&M.size?q.a.createElement(F,{parameters:B,specPath:t.push(\"parameters\"),operation:M,onChangeKey:ne,onTryoutClick:i,onCancelClick:s,tryItOutEnabled:k,allowTryItOut:_,fn:u,getComponent:l,specActions:f,specSelectors:d,pathMethod:[S,w],getConfigs:p,oas3Actions:v,oas3Selectors:g}):null,k?q.a.createElement(G,{getComponent:l,path:S,method:w,operationServers:M.get(\"servers\"),pathServers:d.paths().getIn([S,\"servers\"]),getSelectedServer:g.selectedServer,setSelectedServer:v.setSelectedServer,setServerVariableValue:v.setServerVariableValue,getServerVariable:g.serverVariableValue,getEffectiveServerValue:g.serverEffectiveValue}):null,k&&_&&R&&R.size?q.a.createElement(\"div\",{className:\"opblock-schemes\"},q.a.createElement(K,{schemes:R,path:S,method:w,specActions:f,currentScheme:L})):null,q.a.createElement(\"div\",{className:k&&r&&_?\"btn-group\":\"execute-wrapper\"},k&&_?q.a.createElement(J,{operation:M,specActions:f,specSelectors:d,oas3Selectors:g,oas3Actions:v,path:S,method:w,onExecute:c,disabled:I}):null,k&&r&&_?q.a.createElement(W,{specActions:f,path:S,method:w}):null),I?q.a.createElement(\"div\",{className:\"loading-container\"},q.a.createElement(\"div\",{className:\"loading\"})):null,D?q.a.createElement(z,{responses:D,request:a,tryItOutResponse:r,getComponent:l,getConfigs:p,specSelectors:d,oas3Actions:v,oas3Selectors:g,specActions:f,produces:d.producesOptionsFor([S,w]),producesValue:d.currentProducesFor([S,w]),specPath:t.push(\"responses\"),path:S,method:w,displayRequestDuration:A,fn:u}):null,ee&&V.size?q.a.createElement(Z,{extensions:V,getComponent:l}):null)))}}]),r}(M.PureComponent);y()(lt,\"defaultProps\",{operation:null,response:null,request:null,specPath:Object(B.List)(),summary:\"\"});var pt=n(76),ft=n.n(pt),dt=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.isShown,r=t.toggleShown,a=t.getComponent,o=t.authActions,i=t.authSelectors,s=t.operationProps,u=t.specPath,l=s.toJS(),p=l.summary,f=l.isAuthorized,d=l.method,h=l.op,m=l.showSummary,v=l.path,g=l.operationId,y=l.originalOperationId,b=l.displayOperationId,E=h.summary,x=s.get(\"security\"),S=a(\"authorizeOperationBtn\"),w=a(\"OperationSummaryMethod\"),j=a(\"OperationSummaryPath\"),O=a(\"JumpToPath\",!0),C=x&&!!x.count(),_=C&&1===x.size&&x.first().isEmpty(),A=!C||_;return q.a.createElement(\"div\",{className:\"opblock-summary opblock-summary-\".concat(d)},q.a.createElement(\"button\",{\"aria-label\":c()(e=\"\".concat(d,\" \")).call(e,v.replace(/\\//g,\"​/\")),\"aria-expanded\":n,className:\"opblock-summary-control\",onClick:r},q.a.createElement(w,{method:d}),q.a.createElement(j,{getComponent:a,operationProps:s,specPath:u}),m?q.a.createElement(\"div\",{className:\"opblock-summary-description\"},ft()(E||p)):null,b&&(y||g)?q.a.createElement(\"span\",{className:\"opblock-summary-operation-id\"},y||g):null,q.a.createElement(\"svg\",{className:\"arrow\",width:\"20\",height:\"20\",\"aria-hidden\":\"true\",focusable:\"false\"},q.a.createElement(\"use\",{href:n?\"#large-arrow-up\":\"#large-arrow-down\",xlinkHref:n?\"#large-arrow-up\":\"#large-arrow-down\"}))),A?null:q.a.createElement(S,{isAuthorized:f,onClick:function(){var e=i.definitionsForRequirements(x);o.showDefinitions(e)}}),q.a.createElement(O,{path:u}))}}]),n}(M.PureComponent);y()(dt,\"defaultProps\",{operationProps:null,specPath:Object(B.List)(),summary:\"\"});var ht=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props.method;return q.a.createElement(\"span\",{className:\"opblock-summary-method\"},e.toUpperCase())}}]),n}(M.PureComponent);y()(ht,\"defaultProps\",{operationProps:null});var mt=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onCopyCapture\",(function(e){e.clipboardData.setData(\"text/plain\",r.props.operationProps.get(\"path\")),e.preventDefault()})),r}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.getComponent,r=t.operationProps.toJS(),a=r.deprecated,o=r.isShown,i=r.path,s=r.tag,u=r.operationId,l=r.isDeepLinkingEnabled,p=n(\"DeepLink\");return q.a.createElement(\"span\",{className:a?\"opblock-summary-path__deprecated\":\"opblock-summary-path\",onCopyCapture:this.onCopyCapture,\"data-path\":i},q.a.createElement(p,{enabled:l,isShown:o,path:Object(H.d)(c()(e=\"\".concat(s,\"/\")).call(e,u)),text:i.replace(/\\//g,\"​/\")}))}}]),n}(M.PureComponent),vt=n(13),gt=n.n(vt),yt=function(e){var t,n=e.extensions,r=(0,e.getComponent)(\"OperationExtRow\");return q.a.createElement(\"div\",{className:\"opblock-section\"},q.a.createElement(\"div\",{className:\"opblock-section-header\"},q.a.createElement(\"h4\",null,\"Extensions\")),q.a.createElement(\"div\",{className:\"table-container\"},q.a.createElement(\"table\",null,q.a.createElement(\"thead\",null,q.a.createElement(\"tr\",null,q.a.createElement(\"td\",{className:\"col_header\"},\"Field\"),q.a.createElement(\"td\",{className:\"col_header\"},\"Value\"))),q.a.createElement(\"tbody\",null,N()(t=n.entrySeq()).call(t,(function(e){var t,n=gt()(e,2),a=n[0],o=n[1];return q.a.createElement(r,{key:c()(t=\"\".concat(a,\"-\")).call(t,o),xKey:a,xVal:o})}))))))},bt=function(e){var t=e.xKey,n=e.xVal,r=n?n.toJS?n.toJS():n:null;return q.a.createElement(\"tr\",null,q.a.createElement(\"td\",null,t),q.a.createElement(\"td\",null,h()(r)))},Et=n(80),xt=n(39),St=n.n(xt),wt=n(408),jt=n.n(wt),Ot=n(116),Ct=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"downloadText\",(function(){jt()(r.props.value,r.props.fileName||\"response.txt\")})),y()(ve()(r),\"preventYScrollingBeyondElement\",(function(e){var t=e.target,n=e.nativeEvent.deltaY,r=t.scrollHeight,a=t.offsetHeight,o=t.scrollTop;r>a&&(0===o&&n<0||a+o>=r&&n>0)&&e.preventDefault()})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.value,n=e.className,r=e.downloadable,a=e.getConfigs,o=e.canCopy,i=e.language,s=a?a():{syntaxHighlight:{activated:!0,theme:\"agate\"}};n=n||\"\";var c=St()(s,\"syntaxHighlight.activated\")?q.a.createElement(Et.a,{language:i,className:n+\" microlight\",onWheel:this.preventYScrollingBeyondElement,style:Object(Et.b)(St()(s,\"syntaxHighlight.theme\"))},t):q.a.createElement(\"pre\",{onWheel:this.preventYScrollingBeyondElement,className:n+\" microlight\"},t);return q.a.createElement(\"div\",{className:\"highlight-code\"},r?q.a.createElement(\"div\",{className:\"download-contents\",onClick:this.downloadText},\"Download\"):null,o?q.a.createElement(\"div\",{className:\"copy-to-clipboard\"},q.a.createElement(Ot.CopyToClipboard,{text:t},q.a.createElement(\"button\",null))):null,c)}}]),n}(M.Component);var _t=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onChangeProducesWrapper\",(function(e){return r.props.specActions.changeProducesValue([r.props.path,r.props.method],e)})),y()(ve()(r),\"onResponseContentTypeChange\",(function(e){var t=e.controlsAcceptHeader,n=e.value,a=r.props,o=a.oas3Actions,i=a.path,s=a.method;t&&o.setResponseContentType({value:n,path:i,method:s})})),r}return S()(n,[{key:\"render\",value:function(){var e,t,r=this,a=this.props,o=a.responses,i=a.tryItOutResponse,s=a.getComponent,u=a.getConfigs,l=a.specSelectors,p=a.fn,f=a.producesValue,d=a.displayRequestDuration,h=a.specPath,m=a.path,v=a.method,g=a.oas3Selectors,y=a.oas3Actions,b=Object(H.f)(o),E=s(\"contentType\"),x=s(\"liveResponse\"),S=s(\"response\"),w=this.props.produces&&this.props.produces.size?this.props.produces:n.defaultProps.produces,j=l.isOAS3()?Object(H.k)(o):null,O=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"_\";return e.replace(/[^\\w-]/g,t)}(c()(e=\"\".concat(v)).call(e,m,\"_responses\")),C=\"\".concat(O,\"_select\");return q.a.createElement(\"div\",{className:\"responses-wrapper\"},q.a.createElement(\"div\",{className:\"opblock-section-header\"},q.a.createElement(\"h4\",null,\"Responses\"),l.isOAS3()?null:q.a.createElement(\"label\",{htmlFor:C},q.a.createElement(\"span\",null,\"Response content type\"),q.a.createElement(E,{value:f,ariaControls:O,ariaLabel:\"Response content type\",className:\"execute-content-type\",contentTypes:w,controlId:C,onChange:this.onChangeProducesWrapper}))),q.a.createElement(\"div\",{className:\"responses-inner\"},i?q.a.createElement(\"div\",null,q.a.createElement(x,{response:i,getComponent:s,getConfigs:u,specSelectors:l,path:this.props.path,method:this.props.method,displayRequestDuration:d}),q.a.createElement(\"h4\",null,\"Responses\")):null,q.a.createElement(\"table\",{\"aria-live\":\"polite\",className:\"responses-table\",id:O,role:\"region\"},q.a.createElement(\"thead\",null,q.a.createElement(\"tr\",{className:\"responses-header\"},q.a.createElement(\"td\",{className:\"col_header response-col_status\"},\"Code\"),q.a.createElement(\"td\",{className:\"col_header response-col_description\"},\"Description\"),l.isOAS3()?q.a.createElement(\"td\",{className:\"col col_header response-col_links\"},\"Links\"):null)),q.a.createElement(\"tbody\",null,N()(t=o.entrySeq()).call(t,(function(e){var t=gt()(e,2),n=t[0],a=t[1],o=i&&i.get(\"status\")==n?\"response_current\":\"\";return q.a.createElement(S,{key:n,path:m,method:v,specPath:h.push(n),isDefault:b===n,fn:p,className:o,code:n,response:a,specSelectors:l,controlsAcceptHeader:a===j,onContentTypeChange:r.onResponseContentTypeChange,contentType:f,getConfigs:u,activeExamplesKey:g.activeExamplesMember(m,v,\"responses\",n),oas3Actions:y,getComponent:s})})).toArray()))))}}]),n}(q.a.Component);y()(_t,\"defaultProps\",{tryItOutResponse:null,produces:Object(B.fromJS)([\"application/json\"]),displayRequestDuration:!1});var At=n(24),kt=n.n(At),It=n(409),Pt=n.n(It),Tt=n(54),Rt=n.n(Tt),Nt=n(85),Mt=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;return E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"_onContentTypeChange\",(function(e){var t=a.props,n=t.onContentTypeChange,r=t.controlsAcceptHeader;a.setState({responseContentType:e}),n({value:e,controlsAcceptHeader:r})})),y()(ve()(a),\"getTargetExamplesKey\",(function(){var e=a.props,t=e.response,n=e.contentType,r=e.activeExamplesKey,o=a.state.responseContentType||n,i=t.getIn([\"content\",o],Object(B.Map)({})).get(\"examples\",null).keySeq().first();return r||i})),a.state={responseContentType:\"\"},a}return S()(n,[{key:\"render\",value:function(){var e,t,n,r,a,o=this.props,i=o.path,s=o.method,u=o.code,l=o.response,p=o.className,f=o.specPath,d=o.fn,h=o.getComponent,m=o.getConfigs,v=o.specSelectors,g=o.contentType,y=o.controlsAcceptHeader,b=o.oas3Actions,E=d.inferSchema,x=v.isOAS3(),S=m().showExtensions,w=S?Object(H.m)(l):null,j=l.get(\"headers\"),O=l.get(\"links\"),C=h(\"ResponseExtension\"),_=h(\"headers\"),A=h(\"highlightCode\"),k=h(\"modelExample\"),I=h(\"Markdown\",!0),P=h(\"operationLink\"),T=h(\"contentType\"),R=h(\"ExamplesSelect\"),M=h(\"Example\"),D=this.state.responseContentType||g,L=l.getIn([\"content\",D],Object(B.Map)({})),U=L.get(\"examples\",null);if(x){var V=L.get(\"schema\");n=V?E(V.toJS()):null,r=V?Object(B.List)([\"content\",this.state.responseContentType,\"schema\"]):f}else n=l.get(\"schema\"),r=l.has(\"schema\")?f.push(\"schema\"):f;var z,F=!1,J={includeReadOnly:!0};if(x){var W;if(z=null===(W=L.get(\"schema\"))||void 0===W?void 0:W.toJS(),U){var $=this.getTargetExamplesKey(),Y=function(e){return e.get(\"value\")};void 0===(a=Y(U.get($,Object(B.Map)({}))))&&(a=Y(Pt()(U).call(U).next().value)),F=!0}else void 0!==L.get(\"example\")&&(a=L.get(\"example\"),F=!0)}else{z=n,J=kt()(kt()({},J),{},{includeWriteOnly:!0});var K=l.getIn([\"examples\",D]);K&&(a=K,F=!0)}var G=function(e,t,n){if(null!=e){var r=null;return Object(Nt.a)(e)&&(r=\"json\"),q.a.createElement(\"div\",null,q.a.createElement(t,{className:\"example\",getConfigs:n,language:r,value:Object(H.I)(e)}))}return null}(Object(H.o)(z,D,J,F?a:void 0),A,m);return q.a.createElement(\"tr\",{className:\"response \"+(p||\"\"),\"data-code\":u},q.a.createElement(\"td\",{className:\"response-col_status\"},u),q.a.createElement(\"td\",{className:\"response-col_description\"},q.a.createElement(\"div\",{className:\"response-col_description__inner\"},q.a.createElement(I,{source:l.get(\"description\")})),S&&w.size?N()(e=w.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(C,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),xKey:r,xVal:a})})):null,x&&l.get(\"content\")?q.a.createElement(\"section\",{className:\"response-controls\"},q.a.createElement(\"div\",{className:Rt()(\"response-control-media-type\",{\"response-control-media-type--accept-controller\":y})},q.a.createElement(\"small\",{className:\"response-control-media-type__title\"},\"Media type\"),q.a.createElement(T,{value:this.state.responseContentType,contentTypes:l.get(\"content\")?l.get(\"content\").keySeq():Object(B.Seq)(),onChange:this._onContentTypeChange,ariaLabel:\"Media Type\"}),y?q.a.createElement(\"small\",{className:\"response-control-media-type__accept-message\"},\"Controls \",q.a.createElement(\"code\",null,\"Accept\"),\" header.\"):null),U?q.a.createElement(\"div\",{className:\"response-control-examples\"},q.a.createElement(\"small\",{className:\"response-control-examples__title\"},\"Examples\"),q.a.createElement(R,{examples:U,currentExampleKey:this.getTargetExamplesKey(),onSelect:function(e){return b.setActiveExamplesMember({name:e,pathMethod:[i,s],contextType:\"responses\",contextName:u})},showLabels:!1})):null):null,G||n?q.a.createElement(k,{specPath:r,getComponent:h,getConfigs:m,specSelectors:v,schema:Object(H.i)(n),example:G,includeReadOnly:!0}):null,x&&U?q.a.createElement(M,{example:U.get(this.getTargetExamplesKey(),Object(B.Map)({})),getComponent:h,getConfigs:m,omitValue:!0}):null,j?q.a.createElement(_,{headers:j,getComponent:h}):null),x?q.a.createElement(\"td\",{className:\"response-col_links\"},O?N()(t=O.toSeq().entrySeq()).call(t,(function(e){var t=gt()(e,2),n=t[0],r=t[1];return q.a.createElement(P,{key:n,name:n,link:r,getComponent:h})})):q.a.createElement(\"i\",null,\"No links\")):null)}}]),n}(q.a.Component);y()(Mt,\"defaultProps\",{response:Object(B.fromJS)({}),onContentTypeChange:function(){}});var qt=function(e){var t=e.xKey,n=e.xVal;return q.a.createElement(\"div\",{className:\"response__extension\"},t,\": \",String(n))},Dt=n(410),Bt=n.n(Dt),Lt=n(411),Ut=n.n(Lt),Vt=n(287),zt=n.n(Vt),Ft=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"state\",{parsedContent:null}),y()(ve()(r),\"updateParsedContent\",(function(e){var t=r.props.content;if(e!==t)if(t&&t instanceof Blob){var n=new FileReader;n.onload=function(){r.setState({parsedContent:n.result})},n.readAsText(t)}else r.setState({parsedContent:t.toString()})})),r}return S()(n,[{key:\"componentDidMount\",value:function(){this.updateParsedContent(null)}},{key:\"componentDidUpdate\",value:function(e){this.updateParsedContent(e.content)}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.content,a=n.contentType,o=n.url,i=n.headers,s=void 0===i?{}:i,c=n.getConfigs,u=n.getComponent,l=this.state.parsedContent,p=u(\"highlightCode\"),f=\"response_\"+(new Date).getTime();if(o=o||\"\",/^application\\/octet-stream/i.test(a)||s[\"Content-Disposition\"]&&/attachment/i.test(s[\"Content-Disposition\"])||s[\"content-disposition\"]&&/attachment/i.test(s[\"content-disposition\"])||s[\"Content-Description\"]&&/File Transfer/i.test(s[\"Content-Description\"])||s[\"content-description\"]&&/File Transfer/i.test(s[\"content-description\"]))if(\"Blob\"in window){var d=a||\"text/html\",m=r instanceof Blob?r:new Blob([r],{type:d}),v=ot.a.createObjectURL(m),g=[d,o.substr(Bt()(o).call(o,\"/\")+1),v].join(\":\"),y=s[\"content-disposition\"]||s[\"Content-Disposition\"];if(void 0!==y){var b=Object(H.h)(y);null!==b&&(g=b)}t=W.a.navigator&&W.a.navigator.msSaveOrOpenBlob?q.a.createElement(\"div\",null,q.a.createElement(\"a\",{href:v,onClick:function(){return W.a.navigator.msSaveOrOpenBlob(m,g)}},\"Download file\")):q.a.createElement(\"div\",null,q.a.createElement(\"a\",{href:v,download:g},\"Download file\"))}else t=q.a.createElement(\"pre\",{className:\"microlight\"},\"Download headers detected but your browser does not support downloading binary via XHR (Blob).\");else if(/json/i.test(a)){var E=null;Object(Nt.a)(r)&&(E=\"json\");try{e=h()(JSON.parse(r),null,\"  \")}catch(t){e=\"can't parse JSON.  Raw result:\\n\\n\"+r}t=q.a.createElement(p,{language:E,downloadable:!0,fileName:\"\".concat(f,\".json\"),value:e,getConfigs:c,canCopy:!0})}else/xml/i.test(a)?(e=Ut()(r,{textNodesOnSameLine:!0,indentor:\"  \"}),t=q.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".xml\"),value:e,getConfigs:c,canCopy:!0})):t=\"text/html\"===zt()(a)||/text\\/plain/.test(a)?q.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".html\"),value:r,getConfigs:c,canCopy:!0}):\"text/csv\"===zt()(a)||/text\\/csv/.test(a)?q.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".csv\"),value:r,getConfigs:c,canCopy:!0}):/^image\\//i.test(a)?He()(a).call(a,\"svg\")?q.a.createElement(\"div\",null,\" \",r,\" \"):q.a.createElement(\"img\",{className:\"full-width\",src:ot.a.createObjectURL(r)}):/^audio\\//i.test(a)?q.a.createElement(\"pre\",{className:\"microlight\"},q.a.createElement(\"audio\",{controls:!0},q.a.createElement(\"source\",{src:o,type:a}))):\"string\"==typeof r?q.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".txt\"),value:r,getConfigs:c,canCopy:!0}):r.size>0?l?q.a.createElement(\"div\",null,q.a.createElement(\"p\",{className:\"i\"},\"Unrecognized response type; displaying content as text.\"),q.a.createElement(p,{downloadable:!0,fileName:\"\".concat(f,\".txt\"),value:l,getConfigs:c,canCopy:!0})):q.a.createElement(\"p\",{className:\"i\"},\"Unrecognized response type; unable to display.\"):null;return t?q.a.createElement(\"div\",null,q.a.createElement(\"h5\",null,\"Response body\"),t):null}}]),n}(q.a.PureComponent),Jt=n(14),Wt=n.n(Jt),Ht=n(167),$t=n.n(Ht),Yt=function(e){ye()(n,e);var t=Ee()(n);function n(e){var r;return E()(this,n),r=t.call(this,e),y()(ve()(r),\"onChange\",(function(e,t,n){var a=r.props;(0,a.specActions.changeParamByIdentity)(a.onChangeKey,e,t,n)})),y()(ve()(r),\"onChangeConsumesWrapper\",(function(e){var t=r.props;(0,t.specActions.changeConsumesValue)(t.onChangeKey,e)})),y()(ve()(r),\"toggleTab\",(function(e){return\"parameters\"===e?r.setState({parametersVisible:!0,callbackVisible:!1}):\"callbacks\"===e?r.setState({callbackVisible:!0,parametersVisible:!1}):void 0})),y()(ve()(r),\"onChangeMediaType\",(function(e){var t=e.value,n=e.pathMethod,a=r.props,o=a.specActions,i=a.oas3Selectors,s=a.oas3Actions,c=i.hasUserEditedBody.apply(i,Wt()(n)),u=i.shouldRetainRequestBodyValue.apply(i,Wt()(n));s.setRequestContentType({value:t,pathMethod:n}),s.initRequestBodyValidateError({pathMethod:n}),c||(u||s.setRequestBodyValue({value:void 0,pathMethod:n}),o.clearResponse.apply(o,Wt()(n)),o.clearRequest.apply(o,Wt()(n)),o.clearValidateParams(n))})),r.state={callbackVisible:!1,parametersVisible:!0},r}return S()(n,[{key:\"render\",value:function(){var e,t,n=this,r=this.props,a=r.onTryoutClick,o=r.parameters,i=r.allowTryItOut,s=r.tryItOutEnabled,u=r.specPath,l=r.fn,p=r.getComponent,f=r.getConfigs,d=r.specSelectors,h=r.specActions,m=r.pathMethod,v=r.oas3Actions,g=r.oas3Selectors,y=r.operation,b=p(\"parameterRow\"),E=p(\"TryItOutButton\"),x=p(\"contentType\"),S=p(\"Callbacks\",!0),w=p(\"RequestBody\",!0),j=s&&i,O=d.isOAS3(),C=y.get(\"requestBody\"),_=T()(e=$t()(T()(o).call(o,(function(e,t){var n,r=t.get(\"in\");return null!==(n=e[r])&&void 0!==n||(e[r]=[]),e[r].push(t),e}),{}))).call(e,(function(e,t){return c()(e).call(e,t)}),[]);return q.a.createElement(\"div\",{className:\"opblock-section\"},q.a.createElement(\"div\",{className:\"opblock-section-header\"},O?q.a.createElement(\"div\",{className:\"tab-header\"},q.a.createElement(\"div\",{onClick:function(){return n.toggleTab(\"parameters\")},className:\"tab-item \".concat(this.state.parametersVisible&&\"active\")},q.a.createElement(\"h4\",{className:\"opblock-title\"},q.a.createElement(\"span\",null,\"Parameters\"))),y.get(\"callbacks\")?q.a.createElement(\"div\",{onClick:function(){return n.toggleTab(\"callbacks\")},className:\"tab-item \".concat(this.state.callbackVisible&&\"active\")},q.a.createElement(\"h4\",{className:\"opblock-title\"},q.a.createElement(\"span\",null,\"Callbacks\"))):null):q.a.createElement(\"div\",{className:\"tab-header\"},q.a.createElement(\"h4\",{className:\"opblock-title\"},\"Parameters\")),i?q.a.createElement(E,{isOAS3:d.isOAS3(),hasUserEditedBody:g.hasUserEditedBody.apply(g,Wt()(m)),enabled:s,onCancelClick:this.props.onCancelClick,onTryoutClick:a,onResetClick:function(){return v.setRequestBodyValue({value:void 0,pathMethod:m})}}):null),this.state.parametersVisible?q.a.createElement(\"div\",{className:\"parameters-container\"},_.length?q.a.createElement(\"div\",{className:\"table-container\"},q.a.createElement(\"table\",{className:\"parameters\"},q.a.createElement(\"thead\",null,q.a.createElement(\"tr\",null,q.a.createElement(\"th\",{className:\"col_header parameters-col_name\"},\"Name\"),q.a.createElement(\"th\",{className:\"col_header parameters-col_description\"},\"Description\"))),q.a.createElement(\"tbody\",null,N()(_).call(_,(function(e,t){var r;return q.a.createElement(b,{fn:l,specPath:u.push(t.toString()),getComponent:p,getConfigs:f,rawParam:e,param:d.parameterWithMetaByIdentity(m,e),key:c()(r=\"\".concat(e.get(\"in\"),\".\")).call(r,e.get(\"name\")),onChange:n.onChange,onChangeConsumes:n.onChangeConsumesWrapper,specSelectors:d,specActions:h,oas3Actions:v,oas3Selectors:g,pathMethod:m,isExecute:j})}))))):q.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},q.a.createElement(\"p\",null,\"No parameters\"))):null,this.state.callbackVisible?q.a.createElement(\"div\",{className:\"callbacks-container opblock-description-wrapper\"},q.a.createElement(S,{callbacks:Object(B.Map)(y.get(\"callbacks\")),specPath:A()(u).call(u,0,-1).push(\"callbacks\")})):null,O&&C&&this.state.parametersVisible&&q.a.createElement(\"div\",{className:\"opblock-section opblock-section-request-body\"},q.a.createElement(\"div\",{className:\"opblock-section-header\"},q.a.createElement(\"h4\",{className:\"opblock-title parameter__name \".concat(C.get(\"required\")&&\"required\")},\"Request body\"),q.a.createElement(\"label\",null,q.a.createElement(x,{value:g.requestContentType.apply(g,Wt()(m)),contentTypes:C.get(\"content\",Object(B.List)()).keySeq(),onChange:function(e){n.onChangeMediaType({value:e,pathMethod:m})},className:\"body-param-content-type\",ariaLabel:\"Request content type\"}))),q.a.createElement(\"div\",{className:\"opblock-description-wrapper\"},q.a.createElement(w,{setRetainRequestBodyValueFlag:function(e){return v.setRetainRequestBodyValueFlag({value:e,pathMethod:m})},userHasEditedBody:g.hasUserEditedBody.apply(g,Wt()(m)),specPath:A()(u).call(u,0,-1).push(\"requestBody\"),requestBody:C,requestBodyValue:g.requestBodyValue.apply(g,Wt()(m)),requestBodyInclusionSetting:g.requestBodyInclusionSetting.apply(g,Wt()(m)),requestBodyErrors:g.requestBodyErrors.apply(g,Wt()(m)),isExecute:j,getConfigs:f,activeExamplesKey:g.activeExamplesMember.apply(g,c()(t=Wt()(m)).call(t,[\"requestBody\",\"requestBody\"])),updateActiveExamplesKey:function(e){n.props.oas3Actions.setActiveExamplesMember({name:e,pathMethod:n.props.pathMethod,contextType:\"requestBody\",contextName:\"requestBody\"})},onChange:function(e,t){if(t){var n=g.requestBodyValue.apply(g,Wt()(m)),r=B.Map.isMap(n)?n:Object(B.Map)();return v.setRequestBodyValue({pathMethod:m,value:r.setIn(t,e)})}v.setRequestBodyValue({value:e,pathMethod:m})},onChangeIncludeEmpty:function(e,t){v.setRequestBodyInclusion({pathMethod:m,value:t,name:e})},contentType:g.requestContentType.apply(g,Wt()(m))}))))}}]),n}(M.Component);y()(Yt,\"defaultProps\",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,tryItOutEnabled:!1,allowTryItOut:!0,onChangeKey:[],specPath:[]});var Kt=function(e){var t=e.xKey,n=e.xVal;return q.a.createElement(\"div\",{className:\"parameter__extension\"},t,\": \",String(n))},Gt={onChange:function(){},isIncludedOptions:{}},Zt=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onCheckboxChange\",(function(e){(0,r.props.onChange)(e.target.checked)})),r}return S()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.isIncludedOptions,n=e.onChange,r=t.shouldDispatchInit,a=t.defaultValue;r&&n(a)}},{key:\"render\",value:function(){var e=this.props,t=e.isIncluded,n=e.isDisabled;return q.a.createElement(\"div\",null,q.a.createElement(\"label\",{className:Rt()(\"parameter__empty_value_toggle\",{disabled:n})},q.a.createElement(\"input\",{type:\"checkbox\",disabled:n,checked:!n&&t,onChange:this.onCheckboxChange}),\"Send empty value\"))}}]),n}(M.Component);y()(Zt,\"defaultProps\",Gt);var Xt=n(118),Qt=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;return E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"onChangeWrapper\",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=a.props,r=n.onChange,o=n.rawParam;return r(o,\"\"===e||e&&0===e.size?null:e,t)})),y()(ve()(a),\"_onExampleSelect\",(function(e){a.props.oas3Actions.setActiveExamplesMember({name:e,pathMethod:a.props.pathMethod,contextType:\"parameters\",contextName:a.getParamKey()})})),y()(ve()(a),\"onChangeIncludeEmpty\",(function(e){var t=a.props,n=t.specActions,r=t.param,o=t.pathMethod,i=r.get(\"name\"),s=r.get(\"in\");return n.updateEmptyParamInclusion(o,i,s,e)})),y()(ve()(a),\"setDefaultValue\",(function(){var e=a.props,t=e.specSelectors,n=e.pathMethod,r=e.rawParam,o=e.oas3Selectors,i=t.parameterWithMetaByIdentity(n,r)||Object(B.Map)(),s=Object(Xt.a)(i,{isOAS3:t.isOAS3()}).schema,u=i.get(\"content\",Object(B.Map)()).keySeq().first(),l=s?Object(H.o)(s.toJS(),u,{includeWriteOnly:!0}):null;if(i&&void 0===i.get(\"value\")&&\"body\"!==i.get(\"in\")){var p;if(t.isSwagger2())p=void 0!==i.get(\"x-example\")?i.get(\"x-example\"):void 0!==i.getIn([\"schema\",\"example\"])?i.getIn([\"schema\",\"example\"]):s&&s.getIn([\"default\"]);else if(t.isOAS3()){var f,d=o.activeExamplesMember.apply(o,c()(f=Wt()(n)).call(f,[\"parameters\",a.getParamKey()]));p=void 0!==i.getIn([\"examples\",d,\"value\"])?i.getIn([\"examples\",d,\"value\"]):void 0!==i.getIn([\"content\",u,\"example\"])?i.getIn([\"content\",u,\"example\"]):void 0!==i.get(\"example\")?i.get(\"example\"):void 0!==(s&&s.get(\"example\"))?s&&s.get(\"example\"):void 0!==(s&&s.get(\"default\"))?s&&s.get(\"default\"):i.get(\"default\")}void 0===p||B.List.isList(p)||(p=Object(H.I)(p)),void 0!==p?a.onChangeWrapper(p):s&&\"object\"===s.get(\"type\")&&l&&!i.get(\"examples\")&&a.onChangeWrapper(B.List.isList(l)?l:Object(H.I)(l))}})),a.setDefaultValue(),a}return S()(n,[{key:\"componentWillReceiveProps\",value:function(e){var t,n=e.specSelectors,r=e.pathMethod,a=e.rawParam,o=n.isOAS3(),i=n.parameterWithMetaByIdentity(r,a)||new B.Map;if(i=i.isEmpty()?a:i,o){var s=Object(Xt.a)(i,{isOAS3:o}).schema;t=s?s.get(\"enum\"):void 0}else t=i?i.get(\"enum\"):void 0;var c,u=i?i.get(\"value\"):void 0;void 0!==u?c=u:a.get(\"required\")&&t&&t.size&&(c=t.first()),void 0!==c&&c!==u&&this.onChangeWrapper(Object(H.w)(c)),this.setDefaultValue()}},{key:\"getParamKey\",value:function(){var e,t=this.props.param;return t?c()(e=\"\".concat(t.get(\"name\"),\"-\")).call(e,t.get(\"in\")):null}},{key:\"render\",value:function(){var e,t,n,r,a=this.props,o=a.param,i=a.rawParam,s=a.getComponent,u=a.getConfigs,l=a.isExecute,p=a.fn,f=a.onChangeConsumes,d=a.specSelectors,h=a.pathMethod,m=a.specPath,v=a.oas3Selectors,g=d.isOAS3(),y=u(),b=y.showExtensions,E=y.showCommonExtensions;if(o||(o=i),!i)return null;var x,S,w,j,O=s(\"JsonSchemaForm\"),C=s(\"ParamBody\"),_=o.get(\"in\"),A=\"body\"!==_?null:q.a.createElement(C,{getComponent:s,getConfigs:u,fn:p,param:o,consumes:d.consumesOptionsFor(h),consumesValue:d.contentTypeValues(h).get(\"requestContentType\"),onChange:this.onChangeWrapper,onChangeConsumes:f,isExecute:l,specSelectors:d,pathMethod:h}),k=s(\"modelExample\"),I=s(\"Markdown\",!0),P=s(\"ParameterExt\"),T=s(\"ParameterIncludeEmpty\"),R=s(\"ExamplesSelectValueRetainer\"),M=s(\"Example\"),D=Object(Xt.a)(o,{isOAS3:g}).schema,L=d.parameterWithMetaByIdentity(h,i)||Object(B.Map)(),U=D?D.get(\"format\"):null,V=D?D.get(\"type\"):null,z=D?D.getIn([\"items\",\"type\"]):null,F=\"formData\"===_,J=\"FormData\"in W.a,$=o.get(\"required\"),Y=L?L.get(\"value\"):\"\",K=E?Object(H.l)(D):null,G=b?Object(H.m)(o):null,Z=!1;return void 0!==o&&D&&(x=D.get(\"items\")),void 0!==x?(S=x.get(\"enum\"),w=x.get(\"default\")):D&&(S=D.get(\"enum\")),S&&S.size&&S.size>0&&(Z=!0),void 0!==o&&(D&&(w=D.get(\"default\")),void 0===w&&(w=o.get(\"default\")),void 0===(j=o.get(\"example\"))&&(j=o.get(\"x-example\"))),q.a.createElement(\"tr\",{\"data-param-name\":o.get(\"name\"),\"data-param-in\":o.get(\"in\")},q.a.createElement(\"td\",{className:\"parameters-col_name\"},q.a.createElement(\"div\",{className:$?\"parameter__name required\":\"parameter__name\"},o.get(\"name\"),$?q.a.createElement(\"span\",null,\" *\"):null),q.a.createElement(\"div\",{className:\"parameter__type\"},V,z&&\"[\".concat(z,\"]\"),U&&q.a.createElement(\"span\",{className:\"prop-format\"},\"($\",U,\")\")),q.a.createElement(\"div\",{className:\"parameter__deprecated\"},g&&o.get(\"deprecated\")?\"deprecated\":null),q.a.createElement(\"div\",{className:\"parameter__in\"},\"(\",o.get(\"in\"),\")\"),E&&K.size?N()(e=K.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(P,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),xKey:r,xVal:a})})):null,b&&G.size?N()(t=G.entrySeq()).call(t,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(P,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),xKey:r,xVal:a})})):null),q.a.createElement(\"td\",{className:\"parameters-col_description\"},o.get(\"description\")?q.a.createElement(I,{source:o.get(\"description\")}):null,!A&&l||!Z?null:q.a.createElement(I,{className:\"parameter__enum\",source:\"<i>Available values</i> : \"+N()(S).call(S,(function(e){return e})).toArray().join(\", \")}),!A&&l||void 0===w?null:q.a.createElement(I,{className:\"parameter__default\",source:\"<i>Default value</i> : \"+w}),!A&&l||void 0===j?null:q.a.createElement(I,{source:\"<i>Example</i> : \"+j}),F&&!J&&q.a.createElement(\"div\",null,\"Error: your browser does not support FormData\"),g&&o.get(\"examples\")?q.a.createElement(\"section\",{className:\"parameter-controls\"},q.a.createElement(R,{examples:o.get(\"examples\"),onSelect:this._onExampleSelect,updateValue:this.onChangeWrapper,getComponent:s,defaultToFirstExample:!0,currentKey:v.activeExamplesMember.apply(v,c()(n=Wt()(h)).call(n,[\"parameters\",this.getParamKey()])),currentUserInputValue:Y})):null,A?null:q.a.createElement(O,{fn:p,getComponent:s,value:Y,required:$,disabled:!l,description:o.get(\"name\"),onChange:this.onChangeWrapper,errors:L.get(\"errors\"),schema:D}),A&&D?q.a.createElement(k,{getComponent:s,specPath:m.push(\"schema\"),getConfigs:u,isExecute:l,specSelectors:d,schema:D,example:A,includeWriteOnly:!0}):null,!A&&l&&o.get(\"allowEmptyValue\")?q.a.createElement(T,{onChange:this.onChangeIncludeEmpty,isIncluded:d.parameterInclusionSettingFor(h,o.get(\"name\"),o.get(\"in\")),isDisabled:!Object(H.q)(Y)}):null,g&&o.get(\"examples\")?q.a.createElement(M,{example:o.getIn([\"examples\",v.activeExamplesMember.apply(v,c()(r=Wt()(h)).call(r,[\"parameters\",this.getParamKey()]))]),getComponent:s,getConfigs:u}):null))}}]),n}(M.Component),en=n(23),tn=n.n(en),nn=n(175),rn=n.n(nn),an=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"handleValidateParameters\",(function(){var e=r.props,t=e.specSelectors,n=e.specActions,a=e.path,o=e.method;return n.validateParams([a,o]),t.validateBeforeExecute([a,o])})),y()(ve()(r),\"handleValidateRequestBody\",(function(){var e=r.props,t=e.path,n=e.method,a=e.specSelectors,o=e.oas3Selectors,i=e.oas3Actions,s={missingBodyValue:!1,missingRequiredKeys:[]};i.clearRequestBodyValidateError({path:t,method:n});var c=a.getOAS3RequiredRequestBodyContentType([t,n]),u=o.requestBodyValue(t,n),l=o.validateBeforeExecute([t,n]),p=o.requestContentType(t,n);if(!l)return s.missingBodyValue=!0,i.setRequestBodyValidateError({path:t,method:n,validationErrors:s}),!1;if(!c)return!0;var f=o.validateShallowRequired({oas3RequiredRequestBodyContentType:c,oas3RequestContentType:p,oas3RequestBodyValue:u});return!f||f.length<1||(tn()(f).call(f,(function(e){s.missingRequiredKeys.push(e)})),i.setRequestBodyValidateError({path:t,method:n,validationErrors:s}),!1)})),y()(ve()(r),\"handleValidationResultPass\",(function(){var e=r.props,t=e.specActions,n=e.operation,a=e.path,o=e.method;r.props.onExecute&&r.props.onExecute(),t.execute({operation:n,path:a,method:o})})),y()(ve()(r),\"handleValidationResultFail\",(function(){var e=r.props,t=e.specActions,n=e.path,a=e.method;t.clearValidateParams([n,a]),rn()((function(){t.validateParams([n,a])}),40)})),y()(ve()(r),\"handleValidationResult\",(function(e){e?r.handleValidationResultPass():r.handleValidationResultFail()})),y()(ve()(r),\"onClick\",(function(){var e=r.handleValidateParameters(),t=r.handleValidateRequestBody(),n=e&&t;r.handleValidationResult(n)})),y()(ve()(r),\"onChangeProducesWrapper\",(function(e){return r.props.specActions.changeProducesValue([r.props.path,r.props.method],e)})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props.disabled;return q.a.createElement(\"button\",{className:\"btn execute opblock-control__btn\",onClick:this.onClick,disabled:e},\"Execute\")}}]),n}(M.Component),on=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.headers,r=t.getComponent,a=r(\"Property\"),o=r(\"Markdown\",!0);return n&&n.size?q.a.createElement(\"div\",{className:\"headers-wrapper\"},q.a.createElement(\"h4\",{className:\"headers__title\"},\"Headers:\"),q.a.createElement(\"table\",{className:\"headers\"},q.a.createElement(\"thead\",null,q.a.createElement(\"tr\",{className:\"header-row\"},q.a.createElement(\"th\",{className:\"header-col\"},\"Name\"),q.a.createElement(\"th\",{className:\"header-col\"},\"Description\"),q.a.createElement(\"th\",{className:\"header-col\"},\"Type\"))),q.a.createElement(\"tbody\",null,N()(e=n.entrySeq()).call(e,(function(e){var t=gt()(e,2),n=t[0],r=t[1];if(!L.a.Map.isMap(r))return null;var i=r.get(\"description\"),s=r.getIn([\"schema\"])?r.getIn([\"schema\",\"type\"]):r.getIn([\"type\"]),c=r.getIn([\"schema\",\"example\"]);return q.a.createElement(\"tr\",{key:n},q.a.createElement(\"td\",{className:\"header-col\"},n),q.a.createElement(\"td\",{className:\"header-col\"},i?q.a.createElement(o,{source:i}):null),q.a.createElement(\"td\",{className:\"header-col\"},s,\" \",c?q.a.createElement(a,{propKey:\"Example\",propVal:c,propClass:\"header-example\"}):null))})).toArray()))):null}}]),n}(q.a.Component),sn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.editorActions,n=e.errSelectors,r=e.layoutSelectors,a=e.layoutActions,o=(0,e.getComponent)(\"Collapse\");if(t&&t.jumpToLine)var i=t.jumpToLine;var s=n.allErrors(),c=l()(s).call(s,(function(e){return\"thrown\"===e.get(\"type\")||\"error\"===e.get(\"level\")}));if(!c||c.count()<1)return null;var u=r.isShown([\"errorPane\"],!0),p=c.sortBy((function(e){return e.get(\"line\")}));return q.a.createElement(\"pre\",{className:\"errors-wrapper\"},q.a.createElement(\"hgroup\",{className:\"error\"},q.a.createElement(\"h4\",{className:\"errors__title\"},\"Errors\"),q.a.createElement(\"button\",{className:\"btn errors__clear-btn\",onClick:function(){return a.show([\"errorPane\"],!u)}},u?\"Hide\":\"Show\")),q.a.createElement(o,{isOpened:u,animated:!0},q.a.createElement(\"div\",{className:\"errors\"},N()(p).call(p,(function(e,t){var n=e.get(\"type\");return\"thrown\"===n||\"auth\"===n?q.a.createElement(cn,{key:t,error:e.get(\"error\")||e,jumpToLine:i}):\"spec\"===n?q.a.createElement(un,{key:t,error:e,jumpToLine:i}):void 0})))))}}]),n}(q.a.Component),cn=function(e){var t=e.error,n=e.jumpToLine;if(!t)return null;var r=t.get(\"line\");return q.a.createElement(\"div\",{className:\"error-wrapper\"},t?q.a.createElement(\"div\",null,q.a.createElement(\"h4\",null,t.get(\"source\")&&t.get(\"level\")?ln(t.get(\"source\"))+\" \"+t.get(\"level\"):\"\",t.get(\"path\")?q.a.createElement(\"small\",null,\" at \",t.get(\"path\")):null),q.a.createElement(\"span\",{className:\"message thrown\"},t.get(\"message\")),q.a.createElement(\"div\",{className:\"error-line\"},r&&n?q.a.createElement(\"a\",{onClick:j()(n).call(n,null,r)},\"Jump to line \",r):null)):null)},un=function(e){var t=e.error,n=e.jumpToLine,r=null;return t.get(\"path\")?r=B.List.isList(t.get(\"path\"))?q.a.createElement(\"small\",null,\"at \",t.get(\"path\").join(\".\")):q.a.createElement(\"small\",null,\"at \",t.get(\"path\")):t.get(\"line\")&&!n&&(r=q.a.createElement(\"small\",null,\"on line \",t.get(\"line\"))),q.a.createElement(\"div\",{className:\"error-wrapper\"},t?q.a.createElement(\"div\",null,q.a.createElement(\"h4\",null,ln(t.get(\"source\"))+\" \"+t.get(\"level\"),\" \",r),q.a.createElement(\"span\",{className:\"message\"},t.get(\"message\")),q.a.createElement(\"div\",{className:\"error-line\"},n?q.a.createElement(\"a\",{onClick:j()(n).call(n,null,t.get(\"line\"))},\"Jump to line \",t.get(\"line\")):null)):null)};function ln(e){var t;return N()(t=(e||\"\").split(\" \")).call(t,(function(e){return e[0].toUpperCase()+A()(e).call(e,1)})).join(\" \")}cn.defaultProps={jumpToLine:null};var pn=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onChangeWrapper\",(function(e){return r.props.onChange(e.target.value)})),r}return S()(n,[{key:\"componentDidMount\",value:function(){this.props.contentTypes&&this.props.onChange(this.props.contentTypes.first())}},{key:\"componentWillReceiveProps\",value:function(e){var t;e.contentTypes&&e.contentTypes.size&&(He()(t=e.contentTypes).call(t,e.value)||e.onChange(e.contentTypes.first()))}},{key:\"render\",value:function(){var e=this.props,t=e.ariaControls,n=e.ariaLabel,r=e.className,a=e.contentTypes,o=e.controlId,i=e.value;return a&&a.size?q.a.createElement(\"div\",{className:\"content-type-wrapper \"+(r||\"\")},q.a.createElement(\"select\",{\"aria-controls\":t,\"aria-label\":n,className:\"content-type\",id:o,onChange:this.onChangeWrapper,value:i||\"\"},N()(a).call(a,(function(e){return q.a.createElement(\"option\",{key:e,value:e},e)})).toArray())):null}}]),n}(q.a.Component);y()(pn,\"defaultProps\",{onChange:function(){},value:null,contentTypes:Object(B.fromJS)([\"application/json\"])});var fn=n(27),dn=n.n(fn),hn=n(47),mn=n.n(hn),vn=n(84),gn=n.n(vn),yn=[\"fullscreen\",\"full\"],bn=[\"hide\",\"keepContents\",\"mobile\",\"tablet\",\"desktop\",\"large\"];function En(){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return gn()(e=l()(n).call(n,(function(e){return!!e})).join(\" \")).call(e)}var xn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.fullscreen,n=e.full,r=mn()(e,yn);if(t)return q.a.createElement(\"section\",r);var a=\"swagger-container\"+(n?\"-full\":\"\");return q.a.createElement(\"section\",dn()({},r,{className:En(r.className,a)}))}}]),n}(q.a.Component),Sn={mobile:\"\",tablet:\"-tablet\",desktop:\"-desktop\",large:\"-hd\"},wn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.hide,r=t.keepContents,a=(t.mobile,t.tablet,t.desktop,t.large,mn()(t,bn));if(n&&!r)return q.a.createElement(\"span\",null);var o=[];for(var i in Sn)if(Object.prototype.hasOwnProperty.call(Sn,i)){var s=Sn[i];if(i in this.props){var u=this.props[i];if(u<1){o.push(\"none\"+s);continue}o.push(\"block\"+s),o.push(\"col-\"+u+s)}}n&&o.push(\"hidden\");var l=En.apply(void 0,c()(e=[a.className]).call(e,o));return q.a.createElement(\"section\",dn()({},a,{className:l}))}}]),n}(q.a.Component),jn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){return q.a.createElement(\"div\",dn()({},this.props,{className:En(this.props.className,\"wrapper\")}))}}]),n}(q.a.Component),On=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){return q.a.createElement(\"button\",dn()({},this.props,{className:En(this.props.className,\"button\")}))}}]),n}(q.a.Component);y()(On,\"defaultProps\",{className:\"\"});var Cn=function(e){return q.a.createElement(\"textarea\",e)},_n=function(e){return q.a.createElement(\"input\",e)},An=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a,o;return E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"onChange\",(function(e){var t,n,r=a.props,o=r.onChange,i=r.multiple,s=A()([]).call(e.target.options);i?t=N()(n=l()(s).call(s,(function(e){return e.selected}))).call(n,(function(e){return e.value})):t=e.target.value;a.setState({value:t}),o&&o(t)})),o=e.value?e.value:e.multiple?[\"\"]:\"\",a.state={value:o},a}return S()(n,[{key:\"componentWillReceiveProps\",value:function(e){e.value!==this.props.value&&this.setState({value:e.value})}},{key:\"render\",value:function(){var e,t,n=this.props,r=n.allowedValues,a=n.multiple,o=n.allowEmptyValue,i=n.disabled,s=(null===(e=this.state.value)||void 0===e||null===(t=e.toJS)||void 0===t?void 0:t.call(e))||this.state.value;return q.a.createElement(\"select\",{className:this.props.className,multiple:a,value:s,onChange:this.onChange,disabled:i},o?q.a.createElement(\"option\",{value:\"\"},\"--\"):null,N()(r).call(r,(function(e,t){return q.a.createElement(\"option\",{key:t,value:String(e)},String(e))})))}}]),n}(q.a.Component);y()(An,\"defaultProps\",{multiple:!1,allowEmptyValue:!0});var kn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){return q.a.createElement(\"a\",dn()({},this.props,{rel:\"noopener noreferrer\",className:En(this.props.className,\"link\")}))}}]),n}(q.a.Component),In=function(e){var t=e.children;return q.a.createElement(\"div\",{className:\"no-margin\"},\" \",t,\" \")},Pn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"renderNotAnimated\",value:function(){return this.props.isOpened?q.a.createElement(In,null,this.props.children):q.a.createElement(\"noscript\",null)}},{key:\"render\",value:function(){var e=this.props,t=e.animated,n=e.isOpened,r=e.children;return t?(r=n?r:null,q.a.createElement(In,null,r)):this.renderNotAnimated()}}]),n}(q.a.Component);y()(Pn,\"defaultProps\",{isOpened:!1,animated:!1});var Tn=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r,a;E()(this,n);for(var o=arguments.length,i=new Array(o),s=0;s<o;s++)i[s]=arguments[s];return(a=t.call.apply(t,c()(e=[this]).call(e,i))).setTagShown=j()(r=a._setTagShown).call(r,ve()(a)),a}return S()(n,[{key:\"_setTagShown\",value:function(e,t){this.props.layoutActions.show(e,t)}},{key:\"showOp\",value:function(e,t){this.props.layoutActions.show(e,t)}},{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.layoutSelectors,r=e.layoutActions,a=e.getComponent,o=t.taggedOperations(),i=a(\"Collapse\");return q.a.createElement(\"div\",null,q.a.createElement(\"h4\",{className:\"overview-title\"},\"Overview\"),N()(o).call(o,(function(e,t){var a=e.get(\"operations\"),o=[\"overview-tags\",t],s=n.isShown(o,!0);return q.a.createElement(\"div\",{key:\"overview-\"+t},q.a.createElement(\"h4\",{onClick:function(){return r.show(o,!s)},className:\"link overview-tag\"},\" \",s?\"-\":\"+\",t),q.a.createElement(i,{isOpened:s,animated:!0},N()(a).call(a,(function(e){var t=e.toObject(),a=t.path,o=t.method,i=t.id,s=\"operations\",c=i,u=n.isShown([s,c]);return q.a.createElement(Rn,{key:i,path:a,method:o,id:a+\"-\"+o,shown:u,showOpId:c,showOpIdPrefix:s,href:\"#operation-\".concat(c),onClick:r.show})})).toArray()))})).toArray(),o.size<1&&q.a.createElement(\"h3\",null,\" No operations defined in spec! \"))}}]),n}(q.a.Component),Rn=function(e){ye()(n,e);var t=Ee()(n);function n(e){var r,a;return E()(this,n),(a=t.call(this,e)).onClick=j()(r=a._onClick).call(r,ve()(a)),a}return S()(n,[{key:\"_onClick\",value:function(){var e=this.props,t=e.showOpId,n=e.showOpIdPrefix;(0,e.onClick)([n,t],!e.shown)}},{key:\"render\",value:function(){var e=this.props,t=e.id,n=e.method,r=e.shown,a=e.href;return q.a.createElement(kn,{href:a,onClick:this.onClick,className:\"block opblock-link \".concat(r?\"shown\":\"\")},q.a.createElement(\"div\",null,q.a.createElement(\"small\",{className:\"bold-label-\".concat(n)},n.toUpperCase()),q.a.createElement(\"span\",{className:\"bold-label\"},t)))}}]),n}(q.a.Component),Nn=[\"value\",\"defaultValue\",\"initialValue\"],Mn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"componentDidMount\",value:function(){this.props.initialValue&&(this.inputRef.value=this.props.initialValue)}},{key:\"render\",value:function(){var e=this,t=this.props,n=(t.value,t.defaultValue,t.initialValue,mn()(t,Nn));return q.a.createElement(\"input\",dn()({},n,{ref:function(t){return e.inputRef=t}}))}}]),n}(q.a.Component),qn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.host,n=e.basePath;return q.a.createElement(\"pre\",{className:\"base-url\"},\"[ Base URL: \",t,n,\" ]\")}}]),n}(q.a.Component),Dn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.data,n=e.getComponent,r=e.selectedServer,a=e.url,o=t.get(\"name\")||\"the developer\",i=ct(t.get(\"url\"),a,{selectedServer:r}),s=t.get(\"email\"),c=n(\"Link\");return q.a.createElement(\"div\",{className:\"info__contact\"},i&&q.a.createElement(\"div\",null,q.a.createElement(c,{href:Object(H.F)(i),target:\"_blank\"},o,\" - Website\")),s&&q.a.createElement(c,{href:Object(H.F)(\"mailto:\".concat(s))},i?\"Send email to \".concat(o):\"Contact \".concat(o)))}}]),n}(q.a.Component),Bn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.license,n=e.getComponent,r=e.selectedServer,a=e.url,o=n(\"Link\"),i=t.get(\"name\")||\"License\",s=ct(t.get(\"url\"),a,{selectedServer:r});return q.a.createElement(\"div\",{className:\"info__license\"},s?q.a.createElement(o,{target:\"_blank\",href:Object(H.F)(s)},i):q.a.createElement(\"span\",null,i))}}]),n}(q.a.Component),Ln=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.url,n=(0,e.getComponent)(\"Link\");return q.a.createElement(n,{target:\"_blank\",href:Object(H.F)(t)},q.a.createElement(\"span\",{className:\"url\"},\" \",t))}}]),n}(q.a.PureComponent),Un=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.info,n=e.url,r=e.host,a=e.basePath,o=e.getComponent,i=e.externalDocs,s=e.selectedServer,c=e.url,u=t.get(\"version\"),l=t.get(\"description\"),p=t.get(\"title\"),f=ct(t.get(\"termsOfService\"),c,{selectedServer:s}),d=t.get(\"contact\"),h=t.get(\"license\"),m=ct(i&&i.get(\"url\"),c,{selectedServer:s}),v=i&&i.get(\"description\"),g=o(\"Markdown\",!0),y=o(\"Link\"),b=o(\"VersionStamp\"),E=o(\"InfoUrl\"),x=o(\"InfoBasePath\");return q.a.createElement(\"div\",{className:\"info\"},q.a.createElement(\"hgroup\",{className:\"main\"},q.a.createElement(\"h2\",{className:\"title\"},p,u&&q.a.createElement(b,{version:u})),r||a?q.a.createElement(x,{host:r,basePath:a}):null,n&&q.a.createElement(E,{getComponent:o,url:n})),q.a.createElement(\"div\",{className:\"description\"},q.a.createElement(g,{source:l})),f&&q.a.createElement(\"div\",{className:\"info__tos\"},q.a.createElement(y,{target:\"_blank\",href:Object(H.F)(f)},\"Terms of service\")),d&&d.size?q.a.createElement(Dn,{getComponent:o,data:d,selectedServer:s,url:n}):null,h&&h.size?q.a.createElement(Bn,{getComponent:o,license:h,selectedServer:s,url:n}):null,m?q.a.createElement(y,{className:\"info__extdocs\",target:\"_blank\",href:Object(H.F)(m)},v||m):null)}}]),n}(q.a.Component),Vn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.getComponent,r=e.oas3Selectors,a=t.info(),o=t.url(),i=t.basePath(),s=t.host(),c=t.externalDocs(),u=r.selectedServer(),l=n(\"info\");return q.a.createElement(\"div\",null,a&&a.count()?q.a.createElement(l,{info:a,url:o,host:s,basePath:i,externalDocs:c,getComponent:n,selectedServer:u}):null)}}]),n}(q.a.Component),zn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){return null}}]),n}(q.a.Component),Fn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){return q.a.createElement(\"div\",{className:\"footer\"})}}]),n}(q.a.Component),Jn=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onFilterChange\",(function(e){var t=e.target.value;r.props.layoutActions.updateFilter(t)})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.layoutSelectors,r=(0,e.getComponent)(\"Col\"),a=\"loading\"===t.loadingStatus(),o=\"failed\"===t.loadingStatus(),i=n.currentFilter(),s=[\"operation-filter-input\"];return o&&s.push(\"failed\"),a&&s.push(\"loading\"),q.a.createElement(\"div\",null,null===i||!1===i||\"false\"===i?null:q.a.createElement(\"div\",{className:\"filter-container\"},q.a.createElement(r,{className:\"filter wrapper\",mobile:12},q.a.createElement(\"input\",{className:s.join(\" \"),placeholder:\"Filter by tag\",type:\"text\",onChange:this.onFilterChange,value:!0===i||\"true\"===i?\"\":i,disabled:a}))))}}]),n}(q.a.Component),Wn=Function.prototype,Hn=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;return E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"updateValues\",(function(e){var t=e.param,n=e.isExecute,r=e.consumesValue,o=void 0===r?\"\":r,i=/xml/i.test(o),s=/json/i.test(o),c=i?t.get(\"value_xml\"):t.get(\"value\");if(void 0!==c){var u=!c&&s?\"{}\":c;a.setState({value:u}),a.onChange(u,{isXml:i,isEditBox:n})}else i?a.onChange(a.sample(\"xml\"),{isXml:i,isEditBox:n}):a.onChange(a.sample(),{isEditBox:n})})),y()(ve()(a),\"sample\",(function(e){var t=a.props,n=t.param,r=(0,t.fn.inferSchema)(n.toJS());return Object(H.o)(r,e,{includeWriteOnly:!0})})),y()(ve()(a),\"onChange\",(function(e,t){var n=t.isEditBox,r=t.isXml;a.setState({value:e,isEditBox:n}),a._onChange(e,r)})),y()(ve()(a),\"_onChange\",(function(e,t){(a.props.onChange||Wn)(e,t)})),y()(ve()(a),\"handleOnChange\",(function(e){var t=a.props.consumesValue,n=/xml/i.test(t),r=e.target.value;a.onChange(r,{isXml:n})})),y()(ve()(a),\"toggleIsEditBox\",(function(){return a.setState((function(e){return{isEditBox:!e.isEditBox}}))})),a.state={isEditBox:!1,value:\"\"},a}return S()(n,[{key:\"componentDidMount\",value:function(){this.updateValues.call(this,this.props)}},{key:\"componentWillReceiveProps\",value:function(e){this.updateValues.call(this,e)}},{key:\"render\",value:function(){var e=this.props,t=e.onChangeConsumes,r=e.param,a=e.isExecute,o=e.specSelectors,i=e.pathMethod,s=e.getConfigs,c=e.getComponent,u=c(\"Button\"),l=c(\"TextArea\"),p=c(\"highlightCode\"),f=c(\"contentType\"),d=(o?o.parameterWithMetaByIdentity(i,r):r).get(\"errors\",Object(B.List)()),h=o.contentTypeValues(i).get(\"requestContentType\"),m=this.props.consumes&&this.props.consumes.size?this.props.consumes:n.defaultProp.consumes,v=this.state,g=v.value,y=v.isEditBox,b=null;return Object(Nt.a)(g)&&(b=\"json\"),q.a.createElement(\"div\",{className:\"body-param\",\"data-param-name\":r.get(\"name\"),\"data-param-in\":r.get(\"in\")},y&&a?q.a.createElement(l,{className:\"body-param__text\"+(d.count()?\" invalid\":\"\"),value:g,onChange:this.handleOnChange}):g&&q.a.createElement(p,{className:\"body-param__example\",language:b,getConfigs:s,value:g}),q.a.createElement(\"div\",{className:\"body-param-options\"},a?q.a.createElement(\"div\",{className:\"body-param-edit\"},q.a.createElement(u,{className:y?\"btn cancel body-param__example-edit\":\"btn edit body-param__example-edit\",onClick:this.toggleIsEditBox},y?\"Cancel\":\"Edit\")):null,q.a.createElement(\"label\",{htmlFor:\"\"},q.a.createElement(\"span\",null,\"Parameter content type\"),q.a.createElement(f,{value:h,contentTypes:m,onChange:t,className:\"body-param-content-type\",ariaLabel:\"Parameter content type\"}))))}}]),n}(M.PureComponent);y()(Hn,\"defaultProp\",{consumes:Object(B.fromJS)([\"application/json\"]),param:Object(B.fromJS)({}),onChange:Wn,onChangeConsumes:Wn});var $n=n(133),Yn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.request,n=e.getConfigs,r=Object($n.requestSnippetGenerator_curl_bash)(t),a=n(),o=St()(a,\"syntaxHighlight.activated\")?q.a.createElement(Et.a,{language:\"bash\",className:\"curl microlight\",onWheel:this.preventYScrollingBeyondElement,style:Object(Et.b)(St()(a,\"syntaxHighlight.theme\"))},r):q.a.createElement(\"textarea\",{readOnly:!0,className:\"curl\",value:r});return q.a.createElement(\"div\",{className:\"curl-command\"},q.a.createElement(\"h4\",null,\"Curl\"),q.a.createElement(\"div\",{className:\"copy-to-clipboard\"},q.a.createElement(Ot.CopyToClipboard,{text:r},q.a.createElement(\"button\",null))),q.a.createElement(\"div\",null,o))}}]),n}(q.a.Component),Kn=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onChange\",(function(e){r.setScheme(e.target.value)})),y()(ve()(r),\"setScheme\",(function(e){var t=r.props,n=t.path,a=t.method;t.specActions.setScheme(e,n,a)})),r}return S()(n,[{key:\"componentWillMount\",value:function(){var e=this.props.schemes;this.setScheme(e.first())}},{key:\"componentWillReceiveProps\",value:function(e){var t;this.props.currentScheme&&He()(t=e.schemes).call(t,this.props.currentScheme)||this.setScheme(e.schemes.first())}},{key:\"render\",value:function(){var e,t=this.props,n=t.schemes,r=t.currentScheme;return q.a.createElement(\"label\",{htmlFor:\"schemes\"},q.a.createElement(\"span\",{className:\"schemes-title\"},\"Schemes\"),q.a.createElement(\"select\",{onChange:this.onChange,value:r},N()(e=n.valueSeq()).call(e,(function(e){return q.a.createElement(\"option\",{value:e,key:e},e)})).toArray()))}}]),n}(q.a.Component),Gn=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.specActions,n=e.specSelectors,r=e.getComponent,a=n.operationScheme(),o=n.schemes(),i=r(\"schemes\");return o&&o.size?q.a.createElement(i,{currentScheme:a,schemes:o,specActions:t}):null}}]),n}(q.a.Component),Zn=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"toggleCollapsed\",(function(){a.props.onToggle&&a.props.onToggle(a.props.modelName,!a.state.expanded),a.setState({expanded:!a.state.expanded})})),y()(ve()(a),\"onLoad\",(function(e){if(e&&a.props.layoutSelectors){var t=a.props.layoutSelectors.getScrollToKey();L.a.is(t,a.props.specPath)&&a.toggleCollapsed(),a.props.layoutActions.readyToScroll(a.props.specPath,e.parentElement)}}));var o=a.props,i=o.expanded,s=o.collapsedContent;return a.state={expanded:i,collapsedContent:s||n.defaultProps.collapsedContent},a}return S()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.hideSelfOnExpand,n=e.expanded,r=e.modelName;t&&n&&this.props.onToggle(r,n)}},{key:\"componentWillReceiveProps\",value:function(e){this.props.expanded!==e.expanded&&this.setState({expanded:e.expanded})}},{key:\"render\",value:function(){var e=this.props,t=e.title,n=e.classes;return this.state.expanded&&this.props.hideSelfOnExpand?q.a.createElement(\"span\",{className:n||\"\"},this.props.children):q.a.createElement(\"span\",{className:n||\"\",ref:this.onLoad},q.a.createElement(\"button\",{\"aria-expanded\":this.state.expanded,className:\"model-box-control\",onClick:this.toggleCollapsed},t&&q.a.createElement(\"span\",{className:\"pointer\"},t),q.a.createElement(\"span\",{className:\"model-toggle\"+(this.state.expanded?\"\":\" collapsed\")}),!this.state.expanded&&q.a.createElement(\"span\",null,this.state.collapsedContent)),this.state.expanded&&this.props.children)}}]),n}(M.Component);y()(Zn,\"defaultProps\",{collapsedContent:\"{...}\",expanded:!1,title:null,onToggle:function(){},hideSelfOnExpand:!1,specPath:L.a.List([])});var Xn=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"activeTab\",(function(e){var t=e.target.dataset.name;a.setState({activeTab:t})}));var o=a.props,i=o.getConfigs,s=o.isExecute,c=i().defaultModelRendering,u=c;return\"example\"!==c&&\"model\"!==c&&(u=\"example\"),s&&(u=\"example\"),a.state={activeTab:u},a}return S()(n,[{key:\"componentWillReceiveProps\",value:function(e){e.isExecute&&!this.props.isExecute&&this.props.example&&this.setState({activeTab:\"example\"})}},{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.specSelectors,r=e.schema,a=e.example,o=e.isExecute,i=e.getConfigs,s=e.specPath,c=e.includeReadOnly,u=e.includeWriteOnly,l=i().defaultModelExpandDepth,p=t(\"ModelWrapper\"),f=t(\"highlightCode\"),d=n.isOAS3();return q.a.createElement(\"div\",{className:\"model-example\"},q.a.createElement(\"ul\",{className:\"tab\"},q.a.createElement(\"li\",{className:\"tabitem\"+(\"example\"===this.state.activeTab?\" active\":\"\")},q.a.createElement(\"a\",{className:\"tablinks\",\"data-name\":\"example\",onClick:this.activeTab},o?\"Edit Value\":\"Example Value\")),r?q.a.createElement(\"li\",{className:\"tabitem\"+(\"model\"===this.state.activeTab?\" active\":\"\")},q.a.createElement(\"a\",{className:\"tablinks\"+(o?\" inactive\":\"\"),\"data-name\":\"model\",onClick:this.activeTab},d?\"Schema\":\"Model\")):null),q.a.createElement(\"div\",null,\"example\"===this.state.activeTab?a||q.a.createElement(f,{value:\"(no example available)\",getConfigs:i}):null,\"model\"===this.state.activeTab&&q.a.createElement(p,{schema:r,getComponent:t,getConfigs:i,specSelectors:n,expandDepth:l,specPath:s,includeReadOnly:c,includeWriteOnly:u})))}}]),n}(q.a.Component),Qn=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onToggle\",(function(e,t){r.props.layoutActions&&r.props.layoutActions.show(r.props.fullPath,t)})),r}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.getComponent,r=t.getConfigs,a=n(\"Model\");return this.props.layoutSelectors&&(e=this.props.layoutSelectors.isShown(this.props.fullPath)),q.a.createElement(\"div\",{className:\"model-box\"},q.a.createElement(a,dn()({},this.props,{getConfigs:r,expanded:e,depth:1,onToggle:this.onToggle,expandDepth:this.props.expandDepth||0})))}}]),n}(M.Component),er=n(177),tr=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"getSchemaBasePath\",(function(){return r.props.specSelectors.isOAS3()?[\"components\",\"schemas\"]:[\"definitions\"]})),y()(ve()(r),\"getCollapsedContent\",(function(){return\" \"})),y()(ve()(r),\"handleToggle\",(function(e,t){var n,a;(r.props.layoutActions.show(c()(n=[]).call(n,Wt()(r.getSchemaBasePath()),[e]),t),t)&&r.props.specActions.requestResolvedSubtree(c()(a=[]).call(a,Wt()(r.getSchemaBasePath()),[e]))})),y()(ve()(r),\"onLoadModels\",(function(e){e&&r.props.layoutActions.readyToScroll(r.getSchemaBasePath(),e)})),y()(ve()(r),\"onLoadModel\",(function(e){if(e){var t,n=e.getAttribute(\"data-name\");r.props.layoutActions.readyToScroll(c()(t=[]).call(t,Wt()(r.getSchemaBasePath()),[n]),e)}})),r}return S()(n,[{key:\"render\",value:function(){var e,t=this,n=this.props,r=n.specSelectors,a=n.getComponent,o=n.layoutSelectors,i=n.layoutActions,s=n.getConfigs,u=r.definitions(),l=s(),p=l.docExpansion,f=l.defaultModelsExpandDepth;if(!u.size||f<0)return null;var d=this.getSchemaBasePath(),h=o.isShown(d,f>0&&\"none\"!==p),m=r.isOAS3(),v=a(\"ModelWrapper\"),g=a(\"Collapse\"),y=a(\"ModelCollapse\"),b=a(\"JumpToPath\");return q.a.createElement(\"section\",{className:h?\"models is-open\":\"models\",ref:this.onLoadModels},q.a.createElement(\"h4\",null,q.a.createElement(\"button\",{\"aria-expanded\":h,className:\"models-control\",onClick:function(){return i.show(d,!h)}},q.a.createElement(\"span\",null,m?\"Schemas\":\"Models\"),q.a.createElement(\"svg\",{width:\"20\",height:\"20\",\"aria-hidden\":\"true\",focusable:\"false\"},q.a.createElement(\"use\",{xlinkHref:h?\"#large-arrow-up\":\"#large-arrow-down\"})))),q.a.createElement(g,{isOpened:h},N()(e=u.entrySeq()).call(e,(function(e){var n,u=gt()(e,1)[0],l=c()(n=[]).call(n,Wt()(d),[u]),p=L.a.List(l),h=r.specResolvedSubtree(l),m=r.specJson().getIn(l),g=B.Map.isMap(h)?h:L.a.Map(),E=B.Map.isMap(m)?m:L.a.Map(),x=g.get(\"title\")||E.get(\"title\")||u,S=o.isShown(l,!1);S&&0===g.size&&E.size>0&&t.props.specActions.requestResolvedSubtree(l);var w=q.a.createElement(v,{name:u,expandDepth:f,schema:g||L.a.Map(),displayName:x,fullPath:l,specPath:p,getComponent:a,specSelectors:r,getConfigs:s,layoutSelectors:o,layoutActions:i,includeReadOnly:!0,includeWriteOnly:!0}),j=q.a.createElement(\"span\",{className:\"model-box\"},q.a.createElement(\"span\",{className:\"model model-title\"},x));return q.a.createElement(\"div\",{id:\"model-\".concat(u),className:\"model-container\",key:\"models-section-\".concat(u),\"data-name\":u,ref:t.onLoadModel},q.a.createElement(\"span\",{className:\"models-jump-to-path\"},q.a.createElement(b,{specPath:p})),q.a.createElement(y,{classes:\"model-box\",collapsedContent:t.getCollapsedContent(u),onToggle:t.handleToggle,title:j,displayName:x,modelName:u,specPath:p,layoutSelectors:o,layoutActions:i,hideSelfOnExpand:!0,expanded:f>0&&S},w))})).toArray()))}}]),n}(M.Component),nr=function(e){var t=e.value,n=(0,e.getComponent)(\"ModelCollapse\"),r=q.a.createElement(\"span\",null,\"Array [ \",t.count(),\" ]\");return q.a.createElement(\"span\",{className:\"prop-enum\"},\"Enum:\",q.a.createElement(\"br\",null),q.a.createElement(n,{collapsedContent:r},\"[ \",t.join(\", \"),\" ]\"))},rr=[\"schema\",\"name\",\"displayName\",\"isRef\",\"getComponent\",\"getConfigs\",\"depth\",\"onToggle\",\"expanded\",\"specPath\"],ar=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t,n,r,a=this.props,o=a.schema,i=a.name,s=a.displayName,u=a.isRef,p=a.getComponent,f=a.getConfigs,d=a.depth,m=a.onToggle,v=a.expanded,g=a.specPath,y=mn()(a,rr),b=y.specSelectors,E=y.expandDepth,x=y.includeReadOnly,S=y.includeWriteOnly,w=b.isOAS3;if(!o)return null;var j=f().showExtensions,O=o.get(\"description\"),C=o.get(\"properties\"),_=o.get(\"additionalProperties\"),k=o.get(\"title\")||s||i,I=o.get(\"required\"),P=l()(o).call(o,(function(e,t){var n;return-1!==Se()(n=[\"maxProperties\",\"minProperties\",\"nullable\",\"example\"]).call(n,t)})),T=o.get(\"deprecated\"),R=p(\"JumpToPath\",!0),M=p(\"Markdown\",!0),D=p(\"Model\"),L=p(\"ModelCollapse\"),U=p(\"Property\"),V=function(){return q.a.createElement(\"span\",{className:\"model-jump-to-path\"},q.a.createElement(R,{specPath:g}))},z=q.a.createElement(\"span\",null,q.a.createElement(\"span\",null,\"{\"),\"...\",q.a.createElement(\"span\",null,\"}\"),u?q.a.createElement(V,null):\"\"),F=b.isOAS3()?o.get(\"anyOf\"):null,J=b.isOAS3()?o.get(\"oneOf\"):null,W=b.isOAS3()?o.get(\"not\"):null,H=k&&q.a.createElement(\"span\",{className:\"model-title\"},u&&o.get(\"$$ref\")&&q.a.createElement(\"span\",{className:\"model-hint\"},o.get(\"$$ref\")),q.a.createElement(\"span\",{className:\"model-title__text\"},k));return q.a.createElement(\"span\",{className:\"model\"},q.a.createElement(L,{modelName:i,title:H,onToggle:m,expanded:!!v||d<=E,collapsedContent:z},q.a.createElement(\"span\",{className:\"brace-open object\"},\"{\"),u?q.a.createElement(V,null):null,q.a.createElement(\"span\",{className:\"inner-object\"},q.a.createElement(\"table\",{className:\"model\"},q.a.createElement(\"tbody\",null,O?q.a.createElement(\"tr\",{className:\"description\"},q.a.createElement(\"td\",null,\"description:\"),q.a.createElement(\"td\",null,q.a.createElement(M,{source:O}))):null,T?q.a.createElement(\"tr\",{className:\"property\"},q.a.createElement(\"td\",null,\"deprecated:\"),q.a.createElement(\"td\",null,\"true\")):null,C&&C.size?N()(e=l()(t=C.entrySeq()).call(t,(function(e){var t=gt()(e,2)[1];return(!t.get(\"readOnly\")||x)&&(!t.get(\"writeOnly\")||S)}))).call(e,(function(e){var t,n,r=gt()(e,2),a=r[0],o=r[1],s=w()&&o.get(\"deprecated\"),u=B.List.isList(I)&&I.contains(a),l=[\"property-row\"];return s&&l.push(\"deprecated\"),u&&l.push(\"required\"),q.a.createElement(\"tr\",{key:a,className:l.join(\" \")},q.a.createElement(\"td\",null,a,u&&q.a.createElement(\"span\",{className:\"star\"},\"*\")),q.a.createElement(\"td\",null,q.a.createElement(D,dn()({key:c()(t=c()(n=\"object-\".concat(i,\"-\")).call(n,a,\"_\")).call(t,o)},y,{required:u,getComponent:p,specPath:g.push(\"properties\",a),getConfigs:f,schema:o,depth:d+1}))))})).toArray():null,j?q.a.createElement(\"tr\",null,q.a.createElement(\"td\",null,\" \")):null,j?N()(n=o.entrySeq()).call(n,(function(e){var t=gt()(e,2),n=t[0],r=t[1];if(\"x-\"===A()(n).call(n,0,2)){var a=r?r.toJS?r.toJS():r:null;return q.a.createElement(\"tr\",{key:n,className:\"extension\"},q.a.createElement(\"td\",null,n),q.a.createElement(\"td\",null,h()(a)))}})).toArray():null,_&&_.size?q.a.createElement(\"tr\",null,q.a.createElement(\"td\",null,\"< * >:\"),q.a.createElement(\"td\",null,q.a.createElement(D,dn()({},y,{required:!1,getComponent:p,specPath:g.push(\"additionalProperties\"),getConfigs:f,schema:_,depth:d+1})))):null,F?q.a.createElement(\"tr\",null,q.a.createElement(\"td\",null,\"anyOf ->\"),q.a.createElement(\"td\",null,N()(F).call(F,(function(e,t){return q.a.createElement(\"div\",{key:t},q.a.createElement(D,dn()({},y,{required:!1,getComponent:p,specPath:g.push(\"anyOf\",t),getConfigs:f,schema:e,depth:d+1})))})))):null,J?q.a.createElement(\"tr\",null,q.a.createElement(\"td\",null,\"oneOf ->\"),q.a.createElement(\"td\",null,N()(J).call(J,(function(e,t){return q.a.createElement(\"div\",{key:t},q.a.createElement(D,dn()({},y,{required:!1,getComponent:p,specPath:g.push(\"oneOf\",t),getConfigs:f,schema:e,depth:d+1})))})))):null,W?q.a.createElement(\"tr\",null,q.a.createElement(\"td\",null,\"not ->\"),q.a.createElement(\"td\",null,q.a.createElement(\"div\",null,q.a.createElement(D,dn()({},y,{required:!1,getComponent:p,specPath:g.push(\"not\"),getConfigs:f,schema:W,depth:d+1}))))):null))),q.a.createElement(\"span\",{className:\"brace-close\"},\"}\")),P.size?N()(r=P.entrySeq()).call(r,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(U,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),propKey:r,propVal:a,propClass:\"property\"})})):null)}}]),n}(M.Component),or=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t=this.props,n=t.getComponent,r=t.getConfigs,a=t.schema,o=t.depth,i=t.expandDepth,s=t.name,u=t.displayName,p=t.specPath,f=a.get(\"description\"),d=a.get(\"items\"),h=a.get(\"title\")||u||s,m=l()(a).call(a,(function(e,t){var n;return-1===Se()(n=[\"type\",\"items\",\"description\",\"$$ref\"]).call(n,t)})),v=n(\"Markdown\",!0),g=n(\"ModelCollapse\"),y=n(\"Model\"),b=n(\"Property\"),E=h&&q.a.createElement(\"span\",{className:\"model-title\"},q.a.createElement(\"span\",{className:\"model-title__text\"},h));return q.a.createElement(\"span\",{className:\"model\"},q.a.createElement(g,{title:E,expanded:o<=i,collapsedContent:\"[...]\"},\"[\",m.size?N()(e=m.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(b,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),propKey:r,propVal:a,propClass:\"property\"})})):null,f?q.a.createElement(v,{source:f}):m.size?q.a.createElement(\"div\",{className:\"markdown\"}):null,q.a.createElement(\"span\",null,q.a.createElement(y,dn()({},this.props,{getConfigs:r,specPath:p.push(\"items\"),name:null,schema:d,required:!1,depth:o+1}))),\"]\"))}}]),n}(M.Component),ir=\"property primitive\",sr=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e,t,n,r=this.props,a=r.schema,o=r.getComponent,i=r.getConfigs,s=r.name,u=r.displayName,p=r.depth,f=i().showExtensions;if(!a||!a.get)return q.a.createElement(\"div\",null);var d=a.get(\"type\"),h=a.get(\"format\"),m=a.get(\"xml\"),v=a.get(\"enum\"),g=a.get(\"title\")||u||s,y=a.get(\"description\"),b=Object(H.m)(a),E=l()(a).call(a,(function(e,t){var n;return-1===Se()(n=[\"enum\",\"type\",\"format\",\"description\",\"$$ref\"]).call(n,t)})).filterNot((function(e,t){return b.has(t)})),x=o(\"Markdown\",!0),S=o(\"EnumModel\"),w=o(\"Property\");return q.a.createElement(\"span\",{className:\"model\"},q.a.createElement(\"span\",{className:\"prop\"},s&&q.a.createElement(\"span\",{className:\"\".concat(1===p&&\"model-title\",\" prop-name\")},g),q.a.createElement(\"span\",{className:\"prop-type\"},d),h&&q.a.createElement(\"span\",{className:\"prop-format\"},\"($\",h,\")\"),E.size?N()(e=E.entrySeq()).call(e,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(w,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),propKey:r,propVal:a,propClass:ir})})):null,f&&b.size?N()(t=b.entrySeq()).call(t,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(w,{key:c()(t=\"\".concat(r,\"-\")).call(t,a),propKey:r,propVal:a,propClass:ir})})):null,y?q.a.createElement(x,{source:y}):null,m&&m.size?q.a.createElement(\"span\",null,q.a.createElement(\"br\",null),q.a.createElement(\"span\",{className:ir},\"xml:\"),N()(n=m.entrySeq()).call(n,(function(e){var t,n=gt()(e,2),r=n[0],a=n[1];return q.a.createElement(\"span\",{key:c()(t=\"\".concat(r,\"-\")).call(t,a),className:ir},q.a.createElement(\"br\",null),\"   \",r,\": \",String(a))})).toArray()):null,v&&q.a.createElement(S,{value:v,getComponent:o})))}}]),n}(M.Component),cr=function(e){var t=e.propKey,n=e.propVal,r=e.propClass;return q.a.createElement(\"span\",{className:r},q.a.createElement(\"br\",null),t,\": \",String(n))},ur=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.onTryoutClick,n=e.onCancelClick,r=e.onResetClick,a=e.enabled,o=e.hasUserEditedBody,i=e.isOAS3&&o;return q.a.createElement(\"div\",{className:i?\"try-out btn-group\":\"try-out\"},a?q.a.createElement(\"button\",{className:\"btn try-out__btn cancel\",onClick:n},\"Cancel\"):q.a.createElement(\"button\",{className:\"btn try-out__btn\",onClick:t},\"Try it out \"),i&&q.a.createElement(\"button\",{className:\"btn try-out__btn reset\",onClick:r},\"Reset\"))}}]),n}(q.a.Component);y()(ur,\"defaultProps\",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,onResetClick:Function.prototype,enabled:!1,hasUserEditedBody:!1,isOAS3:!1});var lr=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.bypass,n=e.isSwagger2,r=e.isOAS3,a=e.alsoShow;return t?q.a.createElement(\"div\",null,this.props.children):n&&r?q.a.createElement(\"div\",{className:\"version-pragma\"},a,q.a.createElement(\"div\",{className:\"version-pragma__message version-pragma__message--ambiguous\"},q.a.createElement(\"div\",null,q.a.createElement(\"h3\",null,\"Unable to render this definition\"),q.a.createElement(\"p\",null,q.a.createElement(\"code\",null,\"swagger\"),\" and \",q.a.createElement(\"code\",null,\"openapi\"),\" fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields.\"),q.a.createElement(\"p\",null,\"Supported version fields are \",q.a.createElement(\"code\",null,\"swagger: \",'\"2.0\"'),\" and those that match \",q.a.createElement(\"code\",null,\"openapi: 3.0.n\"),\" (for example, \",q.a.createElement(\"code\",null,\"openapi: 3.0.0\"),\").\")))):n||r?q.a.createElement(\"div\",null,this.props.children):q.a.createElement(\"div\",{className:\"version-pragma\"},a,q.a.createElement(\"div\",{className:\"version-pragma__message version-pragma__message--missing\"},q.a.createElement(\"div\",null,q.a.createElement(\"h3\",null,\"Unable to render this definition\"),q.a.createElement(\"p\",null,\"The provided definition does not specify a valid version field.\"),q.a.createElement(\"p\",null,\"Please indicate a valid Swagger or OpenAPI version field. Supported version fields are \",q.a.createElement(\"code\",null,\"swagger: \",'\"2.0\"'),\" and those that match \",q.a.createElement(\"code\",null,\"openapi: 3.0.n\"),\" (for example, \",q.a.createElement(\"code\",null,\"openapi: 3.0.0\"),\").\"))))}}]),n}(q.a.PureComponent);y()(lr,\"defaultProps\",{alsoShow:null,children:null,bypass:!1});var pr=function(e){var t=e.version;return q.a.createElement(\"small\",null,q.a.createElement(\"pre\",{className:\"version\"},\" \",t,\" \"))},fr=function(e){var t=e.enabled,n=e.path,r=e.text;return q.a.createElement(\"a\",{className:\"nostyle\",onClick:t?function(e){return e.preventDefault()}:null,href:t?\"#/\".concat(n):null},q.a.createElement(\"span\",null,r))},dr=function(){return q.a.createElement(\"div\",null,q.a.createElement(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",xmlnsXlink:\"http://www.w3.org/1999/xlink\",className:\"svg-assets\"},q.a.createElement(\"defs\",null,q.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"unlocked\"},q.a.createElement(\"path\",{d:\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"locked\"},q.a.createElement(\"path\",{d:\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"close\"},q.a.createElement(\"path\",{d:\"M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"large-arrow\"},q.a.createElement(\"path\",{d:\"M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"large-arrow-down\"},q.a.createElement(\"path\",{d:\"M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 20 20\",id:\"large-arrow-up\"},q.a.createElement(\"path\",{d:\"M 17.418 14.908 C 17.69 15.176 18.127 15.176 18.397 14.908 C 18.667 14.64 18.668 14.207 18.397 13.939 L 10.489 6.109 C 10.219 5.841 9.782 5.841 9.51 6.109 L 1.602 13.939 C 1.332 14.207 1.332 14.64 1.602 14.908 C 1.873 15.176 2.311 15.176 2.581 14.908 L 10 7.767 L 17.418 14.908 Z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 24 24\",id:\"jump-to\"},q.a.createElement(\"path\",{d:\"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z\"})),q.a.createElement(\"symbol\",{viewBox:\"0 0 24 24\",id:\"expand\"},q.a.createElement(\"path\",{d:\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"})))))},hr=n(179),mr=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.errSelectors,n=e.specSelectors,r=e.getComponent,a=r(\"SvgAssets\"),o=r(\"InfoContainer\",!0),i=r(\"VersionPragmaFilter\"),s=r(\"operations\",!0),c=r(\"Models\",!0),u=r(\"Row\"),l=r(\"Col\"),p=r(\"errors\",!0),f=r(\"ServersContainer\",!0),d=r(\"SchemesContainer\",!0),h=r(\"AuthorizeBtnContainer\",!0),m=r(\"FilterContainer\",!0),v=n.isSwagger2(),g=n.isOAS3(),y=!n.specStr(),b=n.loadingStatus(),E=null;if(\"loading\"===b&&(E=q.a.createElement(\"div\",{className:\"info\"},q.a.createElement(\"div\",{className:\"loading-container\"},q.a.createElement(\"div\",{className:\"loading\"})))),\"failed\"===b&&(E=q.a.createElement(\"div\",{className:\"info\"},q.a.createElement(\"div\",{className:\"loading-container\"},q.a.createElement(\"h4\",{className:\"title\"},\"Failed to load API definition.\"),q.a.createElement(p,null)))),\"failedConfig\"===b){var x=t.lastError(),S=x?x.get(\"message\"):\"\";E=q.a.createElement(\"div\",{className:\"info failed-config\"},q.a.createElement(\"div\",{className:\"loading-container\"},q.a.createElement(\"h4\",{className:\"title\"},\"Failed to load remote configuration.\"),q.a.createElement(\"p\",null,S)))}if(!E&&y&&(E=q.a.createElement(\"h4\",null,\"No API definition provided.\")),E)return q.a.createElement(\"div\",{className:\"swagger-ui\"},q.a.createElement(\"div\",{className:\"loading-container\"},E));var w=n.servers(),j=n.schemes(),O=w&&w.size,C=j&&j.size,_=!!n.securityDefinitions();return q.a.createElement(\"div\",{className:\"swagger-ui\"},q.a.createElement(a,null),q.a.createElement(i,{isSwagger2:v,isOAS3:g,alsoShow:q.a.createElement(p,null)},q.a.createElement(p,null),q.a.createElement(u,{className:\"information-container\"},q.a.createElement(l,{mobile:12},q.a.createElement(o,null))),O||C||_?q.a.createElement(\"div\",{className:\"scheme-container\"},q.a.createElement(l,{className:\"schemes wrapper\",mobile:12},O?q.a.createElement(f,null):null,C?q.a.createElement(d,null):null,_?q.a.createElement(h,null):null)):null,q.a.createElement(m,null),q.a.createElement(u,null,q.a.createElement(l,{mobile:12,desktop:12},q.a.createElement(s,null))),q.a.createElement(u,null,q.a.createElement(l,{mobile:12,desktop:12},q.a.createElement(c,null)))))}}]),n}(q.a.Component),vr=n(288),gr=n.n(vr),yr={value:\"\",onChange:function(){},schema:{},keyName:\"\",required:!1,errors:Object(B.List)()},br=function(e){ye()(n,e);var t=Ee()(n);function n(){return E()(this,n),t.apply(this,arguments)}return S()(n,[{key:\"componentDidMount\",value:function(){var e=this.props,t=e.dispatchInitialValue,n=e.value,r=e.onChange;t?r(n):!1===t&&r(\"\")}},{key:\"render\",value:function(){var e,t=this.props,n=t.schema,r=t.errors,a=t.value,o=t.onChange,i=t.getComponent,s=t.fn,u=t.disabled,l=n&&n.get?n.get(\"format\"):null,p=n&&n.get?n.get(\"type\"):null,f=function(e){return i(e,!1,{failSilently:!0})},d=p?f(l?c()(e=\"JsonSchema_\".concat(p,\"_\")).call(e,l):\"JsonSchema_\".concat(p)):i(\"JsonSchema_string\");return d||(d=i(\"JsonSchema_string\")),q.a.createElement(d,dn()({},this.props,{errors:r,fn:s,getComponent:i,value:a,onChange:o,schema:n,disabled:u}))}}]),n}(M.Component);y()(br,\"defaultProps\",yr);var Er=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onChange\",(function(e){var t=r.props.schema&&\"file\"===r.props.schema.get(\"type\")?e.target.files[0]:e.target.value;r.props.onChange(t,r.props.keyName)})),y()(ve()(r),\"onEnumChange\",(function(e){return r.props.onChange(e)})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.schema,a=e.errors,o=e.required,i=e.description,s=e.disabled,c=r&&r.get?r.get(\"enum\"):null,u=r&&r.get?r.get(\"format\"):null,l=r&&r.get?r.get(\"type\"):null,p=r&&r.get?r.get(\"in\"):null;if(n||(n=\"\"),a=a.toJS?a.toJS():[],c){var f=t(\"Select\");return q.a.createElement(f,{className:a.length?\"invalid\":\"\",title:a.length?a:\"\",allowedValues:c,value:n,allowEmptyValue:!o,disabled:s,onChange:this.onEnumChange})}var d=s||p&&\"formData\"===p&&!(\"FormData\"in window),h=t(\"Input\");return l&&\"file\"===l?q.a.createElement(h,{type:\"file\",className:a.length?\"invalid\":\"\",title:a.length?a:\"\",onChange:this.onChange,disabled:d}):q.a.createElement(gr.a,{type:u&&\"password\"===u?\"password\":\"text\",className:a.length?\"invalid\":\"\",title:a.length?a:\"\",value:n,minLength:0,debounceTimeout:350,placeholder:i,onChange:this.onChange,disabled:d})}}]),n}(M.Component);y()(Er,\"defaultProps\",yr);var xr=function(e){ye()(n,e);var t=Ee()(n);function n(e,r){var a;return E()(this,n),a=t.call(this,e,r),y()(ve()(a),\"onChange\",(function(){a.props.onChange(a.state.value)})),y()(ve()(a),\"onItemChange\",(function(e,t){a.setState((function(n){return{value:n.value.set(t,e)}}),a.onChange)})),y()(ve()(a),\"removeItem\",(function(e){a.setState((function(t){return{value:t.value.delete(e)}}),a.onChange)})),y()(ve()(a),\"addItem\",(function(){var e=_r(a.state.value);a.setState((function(){return{value:e.push(Object(H.o)(a.state.schema.get(\"items\"),!1,{includeWriteOnly:!0}))}}),a.onChange)})),y()(ve()(a),\"onEnumChange\",(function(e){a.setState((function(){return{value:e}}),a.onChange)})),a.state={value:_r(e.value),schema:e.schema},a}return S()(n,[{key:\"componentWillReceiveProps\",value:function(e){var t=_r(e.value);t!==this.state.value&&this.setState({value:t}),e.schema!==this.state.schema&&this.setState({schema:e.schema})}},{key:\"render\",value:function(){var e,t=this,n=this.props,r=n.getComponent,a=n.required,o=n.schema,i=n.errors,s=n.fn,u=n.disabled;i=i.toJS?i.toJS():I()(i)?i:[];var p,f,d=l()(i).call(i,(function(e){return\"string\"==typeof e})),h=N()(e=l()(i).call(i,(function(e){return void 0!==e.needRemove}))).call(e,(function(e){return e.error})),m=this.state.value,v=!!(m&&m.count&&m.count()>0),g=o.getIn([\"items\",\"enum\"]),y=o.getIn([\"items\",\"type\"]),b=o.getIn([\"items\",\"format\"]),E=o.get(\"items\"),x=!1,S=\"file\"===y||\"string\"===y&&\"binary\"===b;y&&b?p=r(c()(f=\"JsonSchema_\".concat(y,\"_\")).call(f,b)):\"boolean\"!==y&&\"array\"!==y&&\"object\"!==y||(p=r(\"JsonSchema_\".concat(y)));if(p||S||(x=!0),g){var w=r(\"Select\");return q.a.createElement(w,{className:i.length?\"invalid\":\"\",title:i.length?i:\"\",multiple:!0,value:m,disabled:u,allowedValues:g,allowEmptyValue:!a,onChange:this.onEnumChange})}var j=r(\"Button\");return q.a.createElement(\"div\",{className:\"json-schema-array\"},v?N()(m).call(m,(function(e,n){var a,o=Object(B.fromJS)(Wt()(N()(a=l()(i).call(i,(function(e){return e.index===n}))).call(a,(function(e){return e.error}))));return q.a.createElement(\"div\",{key:n,className:\"json-schema-form-item\"},S?q.a.createElement(wr,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:u,errors:o,getComponent:r}):x?q.a.createElement(Sr,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:u,errors:o}):q.a.createElement(p,dn()({},t.props,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:u,errors:o,schema:E,getComponent:r,fn:s})),u?null:q.a.createElement(j,{className:\"btn btn-sm json-schema-form-item-remove \".concat(h.length?\"invalid\":null),title:h.length?h:\"\",onClick:function(){return t.removeItem(n)}},\" - \"))})):null,u?null:q.a.createElement(j,{className:\"btn btn-sm json-schema-form-item-add \".concat(d.length?\"invalid\":null),title:d.length?d:\"\",onClick:this.addItem},\"Add \",y?\"\".concat(y,\" \"):\"\",\"item\"))}}]),n}(M.PureComponent);y()(xr,\"defaultProps\",yr);var Sr=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onChange\",(function(e){var t=e.target.value;r.props.onChange(t,r.props.keyName)})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.value,n=e.errors,r=e.description,a=e.disabled;return t||(t=\"\"),n=n.toJS?n.toJS():[],q.a.createElement(gr.a,{type:\"text\",className:n.length?\"invalid\":\"\",title:n.length?n:\"\",value:t,minLength:0,debounceTimeout:350,placeholder:r,onChange:this.onChange,disabled:a})}}]),n}(M.Component);y()(Sr,\"defaultProps\",yr);var wr=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onFileChange\",(function(e){var t=e.target.files[0];r.props.onChange(t,r.props.keyName)})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.errors,r=e.disabled,a=t(\"Input\"),o=r||!(\"FormData\"in window);return q.a.createElement(a,{type:\"file\",className:n.length?\"invalid\":\"\",title:n.length?n:\"\",onChange:this.onFileChange,disabled:o})}}]),n}(M.Component);y()(wr,\"defaultProps\",yr);var jr=function(e){ye()(n,e);var t=Ee()(n);function n(){var e,r;E()(this,n);for(var a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return r=t.call.apply(t,c()(e=[this]).call(e,o)),y()(ve()(r),\"onEnumChange\",(function(e){return r.props.onChange(e)})),r}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.errors,a=e.schema,o=e.required,i=e.disabled;r=r.toJS?r.toJS():[];var s=a&&a.get?a.get(\"enum\"):null,c=!s||!o,u=!s&&Object(B.fromJS)([\"true\",\"false\"]),l=t(\"Select\");return q.a.createElement(l,{className:r.length?\"invalid\":\"\",title:r.length?r:\"\",value:String(n),disabled:i,allowedValues:s||u,allowEmptyValue:c,onChange:this.onEnumChange})}}]),n}(M.Component);y()(jr,\"defaultProps\",yr);var Or=function(e){return N()(e).call(e,(function(e){var t,n=void 0!==e.propKey?e.propKey:e.index,r=\"string\"==typeof e?e:\"string\"==typeof e.error?e.error:null;if(!n&&r)return r;for(var a=e.error,o=\"/\".concat(e.propKey);\"object\"===i()(a);){var s=void 0!==a.propKey?a.propKey:a.index;if(void 0===s)break;if(o+=\"/\".concat(s),!a.error)break;a=a.error}return c()(t=\"\".concat(o,\": \")).call(t,a)}))},Cr=function(e){ye()(n,e);var t=Ee()(n);function n(){var e;return E()(this,n),e=t.call(this),y()(ve()(e),\"onChange\",(function(t){e.props.onChange(t)})),y()(ve()(e),\"handleOnChange\",(function(t){var n=t.target.value;e.onChange(n)})),e}return S()(n,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.errors,a=e.disabled,o=t(\"TextArea\");return r=r.toJS?r.toJS():I()(r)?r:[],q.a.createElement(\"div\",null,q.a.createElement(o,{className:Rt()({invalid:r.length}),title:r.length?Or(r).join(\", \"):\"\",value:Object(H.I)(n),disabled:a,onChange:this.handleOnChange}))}}]),n}(M.PureComponent);function _r(e){return B.List.isList(e)?e:I()(e)?Object(B.fromJS)(e):Object(B.List)()}y()(Cr,\"defaultProps\",yr);var Ar=function(){var e={components:{App:Oe,authorizationPopup:Ce,authorizeBtn:_e,AuthorizeBtnContainer:Ae,authorizeOperationBtn:ke,auths:Ie,AuthItem:Pe,authError:Te,oauth2:Ke,apiKeyAuth:Re,basicAuth:Ne,clear:Ge,liveResponse:Qe,InitializedInput:Mn,info:Un,InfoContainer:Vn,JumpToPath:zn,onlineValidatorBadge:et.a,operations:rt,operation:lt,OperationSummary:dt,OperationSummaryMethod:ht,OperationSummaryPath:mt,highlightCode:Ct,responses:_t,response:Mt,ResponseExtension:qt,responseBody:Ft,parameters:Yt,parameterRow:Qt,execute:an,headers:on,errors:sn,contentType:pn,overview:Tn,footer:Fn,FilterContainer:Jn,ParamBody:Hn,curl:Yn,schemes:Kn,SchemesContainer:Gn,modelExample:Xn,ModelWrapper:Qn,ModelCollapse:Zn,Model:er.a,Models:tr,EnumModel:nr,ObjectModel:ar,ArrayModel:or,PrimitiveModel:sr,Property:cr,TryItOutButton:ur,Markdown:hr.a,BaseLayout:mr,VersionPragmaFilter:lr,VersionStamp:pr,OperationExt:yt,OperationExtRow:bt,ParameterExt:Kt,ParameterIncludeEmpty:Zt,OperationTag:ut,OperationContainer:je,DeepLink:fr,InfoUrl:Ln,InfoBasePath:qn,SvgAssets:dr,Example:Me,ExamplesSelect:Be,ExamplesSelectValueRetainer:Ue}},t={components:r},n={components:a};return[pe.default,ue.default,ie.default,re.default,ne.default,ee.default,te.default,ae.default,e,t,se.default,n,ce.default,le.default,fe.default,de.default,he.default,oe.default]},kr=n(253);function Ir(){return[Ar,kr.default]}var Pr=n(274);var Tr=!0,Rr=\"gee40b00\",Nr=\"3.52.0\",Mr=\"ip-172-31-21-173\",qr=\"Mon, 09 Aug 2021 15:13:17 GMT\";function Dr(e){var t;W.a.versions=W.a.versions||{},W.a.versions.swaggerUi={version:Nr,gitRevision:Rr,gitDirty:Tr,buildTimestamp:qr,machine:Mr};var n={dom_id:null,domNode:null,spec:{},url:\"\",urls:null,layout:\"BaseLayout\",docExpansion:\"list\",maxDisplayedTags:null,filter:null,validatorUrl:\"https://validator.swagger.io/validator\",oauth2RedirectUrl:c()(t=\"\".concat(window.location.protocol,\"//\")).call(t,window.location.host,\"/oauth2-redirect.html\"),persistAuthorization:!1,configs:{},custom:{},displayOperationId:!1,displayRequestDuration:!1,deepLinking:!1,tryItOutEnabled:!1,requestInterceptor:function(e){return e},responseInterceptor:function(e){return e},showMutatedRequest:!0,defaultModelRendering:\"example\",defaultModelExpandDepth:1,defaultModelsExpandDepth:1,showExtensions:!1,showCommonExtensions:!1,withCredentials:void 0,requestSnippetsEnabled:!1,requestSnippets:{generators:{curl_bash:{title:\"cURL (bash)\",syntax:\"bash\"},curl_powershell:{title:\"cURL (PowerShell)\",syntax:\"powershell\"},curl_cmd:{title:\"cURL (CMD)\",syntax:\"bash\"}},defaultExpanded:!0,languagesMask:null},supportedSubmitMethods:[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\",\"trace\"],presets:[Ir],plugins:[],pluginsOptions:{pluginLoadType:\"legacy\"},initialState:{},fn:{},components:{},syntaxHighlight:{activated:!0,theme:\"agate\"}},r=Object(H.C)(),a=e.domNode;delete e.domNode;var o=v()({},n,e,r),s={system:{configs:o.configs},plugins:o.presets,pluginsOptions:o.pluginsOptions,state:v()({layout:{layout:o.layout,filter:l()(o)},spec:{spec:\"\",url:o.url},requestSnippets:o.requestSnippets},o.initialState)};if(o.initialState)for(var u in o.initialState)Object.prototype.hasOwnProperty.call(o.initialState,u)&&void 0===o.initialState[u]&&delete s.state[u];var p=new Y(s);p.register([o.plugins,function(){return{fn:o.fn,components:o.components,state:o.state}}]);var d=p.getSystem(),m=function(e){var t=d.specSelectors.getLocalConfig?d.specSelectors.getLocalConfig():{},n=v()({},t,o,e||{},r);if(a&&(n.domNode=a),p.setConfigs(n),d.configsActions.loaded(),null!==e&&(!r.url&&\"object\"===i()(n.spec)&&f()(n.spec).length?(d.specActions.updateUrl(\"\"),d.specActions.updateLoadingStatus(\"success\"),d.specActions.updateSpec(h()(n.spec))):d.specActions.download&&n.url&&!n.urls&&(d.specActions.updateUrl(n.url),d.specActions.download(n.url))),n.domNode)d.render(n.domNode,\"App\");else if(n.dom_id){var s=document.querySelector(n.dom_id);d.render(s,\"App\")}else null===n.dom_id||null===n.domNode||console.error(\"Skipped rendering: no `dom_id` or `domNode` was specified\");return d},g=r.config||o.configUrl;return g&&d.specActions&&d.specActions.getConfigByUrl?(d.specActions.getConfigByUrl({url:g,loadRemoteConfig:!0,requestInterceptor:o.requestInterceptor,responseInterceptor:o.responseInterceptor},m),d):m()}Dr.presets={apis:Ir},Dr.plugins=Pr.default;t.default=Dr}]).default}));\n//# sourceMappingURL=swagger-ui.js.map"
  },
  {
    "path": "assembly/assembly-wsmaster-war/.deps/EXCLUDED/dev.md",
    "content": "This file contains a manual contribution to .deps/dev.md and it's needed because eclipse/dash-licenses does not deal with work-with CQs (more see https://github.com/eclipse/dash-licenses/issues/13)\n\n| Packages | Resolved CQs |\n| --- | --- |\n| `org.antlr/ST4@4.0.7` | [CQ14504](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=14504) |\n| `org.eclipse.che.core/che-core-commons-test@7.40.0-SNAPSHOT` | - | eclipse |"
  },
  {
    "path": "assembly/assembly-wsmaster-war/.deps/EXCLUDED/prod.md",
    "content": "This file lists dependencies that do not need CQs or auto-detection does not work due to a bug in https://github.com/eclipse/dash-licenses\n\n| Packages | Resolved CQs |\n| --- | --- |\n| `org.everrest/everrest-core@1.15.0` | [CQ23669](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23669) |\n| `org.everrest/everrest-integration-guice@1.15.0` | [CQ23669](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23669) |\n| `com.ibm.icu/icu4j@68.1` |  [CQ23669](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23654) |\n| `org.jgroups.kubernetes/jgroups-kubernetes@1.0.13.Final` | [CQ20984](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=20984) |\n| `org.flywaydb/flyway-core@4.2.0` | [CQ14689](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=14689) |\n| `com.auth0/jwks-rsa@0.19.0` | [CQ23769](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23769) |\n| `io.swagger.core.v3/swagger-annotations-jakarta@2.1.11` | Apache-2.0 clearlydefined |\n| `io.swagger.core.v3/swagger-core-jakarta@2.1.11` | Apache-2.0 clearlydefined |\n| `io.swagger.core.v3/swagger-integration-jakarta@2.1.11` | Apache-2.0 clearlydefined |\n| `io.swagger.core.v3/swaqqgger-jaxrs2-jakarta@2.1.11` | Apache-2.0 clearlydefined |\n| `io.swagger.core.v3/swagger-models-jakarta@2.1.11` | Apache-2.0 clearlydefined |\n| `io.swagger.core.v3/swagger-jaxrs2-jakarta@2.1.11` | Apache-2.0 clearlydefined |\n\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/.deps/dev.md",
    "content": "# Development dependencies\n\n| Packages | License | Resolved CQs |\n| --- | --- | --- |\n| `com.beust/jcommander@1.78` | Apache-2.0 | [CQ22738](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=22738) |\n| `com.h2database/h2@1.4.196` | EPL-1.0 | [CQ11693](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=11693) |\n| `net.bytebuddy/byte-buddy-agent@1.11.3` | Apache-2.0 | clearlydefined |\n| `net.bytebuddy/byte-buddy@1.11.3` | Apache-2.0 | clearlydefined |\n| `org.antlr/ST4@4.3.1` | BSD-3-Clause | #1495 |\n| `org.antlr/antlr-runtime@3.5.2` | BSD-3-Clause | clearlydefined |\n| `org.eclipse.che.core/che-core-commons-test@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.mockito/mockito-core@3.11.2` | MIT | clearlydefined |\n| `org.objenesis/objenesis@3.2` | Apache-2.0 | clearlydefined |\n| `org.reflections/reflections@0.9.9` | MIT | [CQ10054](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=10054) |\n| `org.testng/testng@7.4.0` | Apache-2.0 | clearlydefined |\n| `org.webjars/jquery@3.5.1` | MIT | [CQ22218](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=22218) |\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/.deps/problems.md",
    "content": "# Dependency analysis\n\n## UNRESOLVED Production dependencies\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/.deps/prod.md",
    "content": "# Production dependencies\n\n| Packages | License | Resolved CQs |\n| --- | --- | --- |\n| `aopalliance/aopalliance@1.0` | LicenseRef-Public-Domain | [CQ2918](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=2918) |\n| `ch.qos.logback/logback-classic@1.2.9` | EPL-1.0 | [CQ13636](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=13636) |\n| `ch.qos.logback/logback-core@1.2.9` | EPL-1.0 | [CQ13635](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=13635) |\n| `com.auth0/jwks-rsa@0.19.0` | NOASSERTION | [CQ23769](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23769) |\n| `com.fasterxml.jackson.core/jackson-annotations@2.11.2` | Apache-2.0 | [CQ23491](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23491) |\n| `com.fasterxml.jackson.core/jackson-core@2.11.2` | Apache-2.0 | [CQ23092](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23092) |\n| `com.fasterxml.jackson.core/jackson-databind@2.11.2` | Apache-2.0 | [CQ23093](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23093) |\n| `com.fasterxml.jackson.dataformat/jackson-dataformat-yaml@2.11.2` | Apache-2.0 | [CQ23094](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23094) |\n| `com.fasterxml.jackson.datatype/jackson-datatype-jsr310@2.11.2` | Apache-2.0 | clearlydefined |\n| `com.github.mifmif/generex@1.0.2` | Apache-2.0 | clearlydefined |\n| `com.google.code.gson/gson@2.8.8` | Apache-2.0 | [CQ23496](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23496) |\n| `com.google.errorprone/error_prone_annotations@2.5.1` | Apache-2.0 | clearlydefined |\n| `com.google.guava/failureaccess@1.0.1` | Apache-2.0 | [CQ22654](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=22654) |\n| `com.google.guava/guava@30.1.1-jre` | Apache-2.0 AND CC0-1.0 AND LicenseRef-Public-Domain | [CQ23244](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23244) |\n| `com.google.guava/listenablefuture@9999.0-empty-to-avoid-conflict-with-guava` | NONE | #803 |\n| `com.google.http-client/google-http-client-jackson2@1.40.0` | Apache-2.0 | clearlydefined |\n| `com.google.http-client/google-http-client@1.40.0` | Apache-2.0 | clearlydefined |\n| `com.google.inject.extensions/guice-assistedinject@5.0.1` | Apache-2.0 | clearlydefined |\n| `com.google.inject.extensions/guice-persist@5.0.1` | Apache-2.0 | clearlydefined |\n| `com.google.inject/guice@5.0.1` | Apache-2.0 | clearlydefined |\n| `com.google.j2objc/j2objc-annotations@1.3` | Apache-2.0 | [CQ21195](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=21195) |\n| `com.google.oauth-client/google-oauth-client@1.34.1` | Apache-2.0 | clearlydefined |\n| `com.ibm.icu/icu4j@68.1` | NOASSERTION |  [CQ23669](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23654) |\n| `com.jcraft/jsch@0.1.55` | BSD-3-Clause | [CQ19435](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=19435) |\n| `com.squareup.okhttp3/logging-interceptor@3.12.12` | Apache-2.0 | clearlydefined |\n| `com.squareup.okhttp3/okhttp@3.12.12` | Apache-2.0 | [CQ19549](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=19549) |\n| `com.squareup.okio/okio@1.15.0` | Apache-2.0 | [CQ20187](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=20187) |\n| `com.sun.mail/jakarta.mail@2.0.1` | - | eclipse |\n| `dk.brics.automaton/automaton@1.11-8` | BSD-2-Clause | clearlydefined |\n| `io.fabric8/kubernetes-client@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-admissionregistration@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-apiextensions@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-apps@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-autoscaling@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-batch@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-certificates@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-common@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-coordination@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-core@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-discovery@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-events@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-extensions@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-flowcontrol@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-metrics@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-networking@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-node@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-policy@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-rbac@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-scheduling@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/kubernetes-model-storageclass@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-client@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-model-clusterautoscaling@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-model-console@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-model-machine@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-model-machineconfig@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-model-miscellaneous@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-model-monitoring@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-model-operator@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-model-operatorhub@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-model-storageversionmigrator@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-model-tuned@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-model-whereabouts@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/openshift-model@5.7.3` | Apache-2.0 | clearlydefined |\n| `io.fabric8/zjsonpatch@0.3.0` | Apache-2.0 | clearlydefined |\n| `io.github.classgraph/classgraph@4.8.95` | MIT | [CQ22530](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=22530) |\n| `io.github.mweirauch/micrometer-jvm-extras@0.2.2` | Apache-2.0 | clearlydefined |\n| `io.grpc/grpc-context@1.27.2` | Apache-2.0 | clearlydefined |\n| `io.jaegertracing/jaeger-client@1.0.0` | Apache-2.0 | clearlydefined |\n| `io.jaegertracing/jaeger-core@1.0.0` | Apache-2.0 | clearlydefined |\n| `io.jaegertracing/jaeger-micrometer@1.0.0` | Apache-2.0 | clearlydefined |\n| `io.jaegertracing/jaeger-thrift@1.0.0` | Apache-2.0 | [CQ20909](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=20909) |\n| `io.jaegertracing/jaeger-tracerresolver@1.0.0` | Apache-2.0 | clearlydefined |\n| `io.jsonwebtoken/jjwt-api@0.11.2` | Apache-2.0 | clearlydefined |\n| `io.jsonwebtoken/jjwt-impl@0.11.2` | Apache-2.0 | clearlydefined |\n| `io.jsonwebtoken/jjwt-jackson@0.11.2` | Apache-2.0 | clearlydefined |\n| `io.micrometer/micrometer-core@1.3.1` | Apache-2.0 | clearlydefined |\n| `io.micrometer/micrometer-registry-prometheus@1.3.1` | Apache-2.0 | clearlydefined |\n| `io.opencensus/opencensus-api@0.28.0` | Apache-2.0 | clearlydefined |\n| `io.opencensus/opencensus-contrib-http-util@0.28.0` | Apache-2.0 | clearlydefined |\n| `io.opentracing.contrib/common@0.1.4` | Apache-2.0 | clearlydefined |\n| `io.opentracing.contrib/opentracing-api-extensions-tracer@0.5.0` | Apache-2.0 | [CQ20946](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=20946) |\n| `io.opentracing.contrib/opentracing-api-extensions@0.5.0` | Apache-2.0 | [CQ20945](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=20945) |\n| `io.opentracing.contrib/opentracing-concurrent@0.4.0` | Apache-2.0 | [CQ20947](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=20947) |\n| `io.opentracing.contrib/opentracing-jdbc@0.2.15` | Apache-2.0 | clearlydefined |\n| `io.opentracing.contrib/opentracing-metrics-micrometer@0.3.0` | Apache-2.0 | [CQ19249](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=19249) |\n| `io.opentracing.contrib/opentracing-metrics@0.3.0` | Apache-2.0 | [CQ19248](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=19248) |\n| `io.opentracing.contrib/opentracing-tracerresolver@0.1.8` | Apache-2.0 | [CQ20950](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=20950) |\n| `io.opentracing/opentracing-api@0.33.0` | Apache-2.0 | [CQ20944](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=20944) |\n| `io.opentracing/opentracing-noop@0.33.0` | Apache-2.0 | [CQ20949](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=20949) |\n| `io.opentracing/opentracing-util@0.33.0` | Apache-2.0 | [CQ20951](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=20951) |\n| `io.prometheus/simpleclient@0.7.0` | Apache-2.0 | clearlydefined |\n| `io.prometheus/simpleclient_common@0.7.0` | Apache-2.0 | clearlydefined |\n| `io.prometheus/simpleclient_httpserver@0.7.0` | Apache-2.0 | clearlydefined |\n| `io.swagger.core.v3/swagger-annotations-jakarta@2.1.11` | - | Apache-2.0 clearlydefined |\n| `io.swagger.core.v3/swagger-core-jakarta@2.1.11` | - | Apache-2.0 clearlydefined |\n| `io.swagger.core.v3/swagger-integration-jakarta@2.1.11` | - | Apache-2.0 clearlydefined |\n| `io.swagger.core.v3/swagger-jaxrs2-jakarta@2.1.11` | - | Apache-2.0 clearlydefined |\n| `io.swagger.core.v3/swagger-models-jakarta@2.1.11` | - | Apache-2.0 clearlydefined |\n| `jakarta.activation/jakarta.activation-api@2.0.1` | EPL-2.0 OR BSD-3-Clause OR GPL-2.0-with-classpath-exception | ee4j.jaf |\n| `jakarta.annotation/jakarta.annotation-api@2.0.0` | EPL-2.0 OR GPL-2.0-with-classpath-exception | ee4j.ca |\n| `jakarta.inject/jakarta.inject-api@1.0.5` | - | eclipse |\n| `jakarta.servlet/jakarta.servlet-api@5.0.0` | EPL-2.0 OR GPL-2.0-with-classpath-exception | ee4j.servlet |\n| `jakarta.validation/jakarta.validation-api@3.0.0` | EPL-1.0 | modeling.emf.validation |\n| `jakarta.websocket/jakarta.websocket-api@2.0.0` | EPL-2.0 OR GPL-2.0-with-classpath-exception | ee4j.websocket |\n| `jakarta.ws.rs/jakarta.ws.rs-api@3.0.0` | EPL-2.0 OR GPL-2.0-with-classpath-exception | ee4j.jaxrs |\n| `jakarta.xml.bind/jakarta.xml.bind-api@3.0.0` | BSD-3-Clause | ee4j.jaxb |\n| `net.logstash.logback/logstash-logback-encoder@7.0.1` | Apache-2.0 | clearlydefined |\n| `org.apache.commons/commons-lang3@3.12.0` | Apache-2.0 | clearlydefined |\n| `org.apache.httpcomponents/httpcore@4.4.14` | Apache-2.0 | [CQ23528](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23528) |\n| `org.apache.thrift/libthrift@0.12.0` | Apache-2.0 | clearlydefined |\n| `org.apache.tomcat/tomcat-annotations-api@10.0.14` | Apache-2.0 | clearlydefined |\n| `org.apache.tomcat/tomcat-api@10.0.14` | Apache-2.0 | clearlydefined |\n| `org.apache.tomcat/tomcat-catalina@10.0.14` | Apache-2.0 | clearlydefined |\n| `org.apache.tomcat/tomcat-coyote@10.0.14` | Apache-2.0 | clearlydefined |\n| `org.apache.tomcat/tomcat-dbcp@10.0.14` | Apache-2.0 | clearlydefined |\n| `org.apache.tomcat/tomcat-el-api@10.0.14` | Apache-2.0 | clearlydefined |\n| `org.apache.tomcat/tomcat-jaspic-api@10.0.14` | Apache-2.0 | clearlydefined |\n| `org.apache.tomcat/tomcat-jni@10.0.14` | Apache-2.0 | clearlydefined |\n| `org.apache.tomcat/tomcat-jsp-api@10.0.14` | Apache-2.0 | clearlydefined |\n| `org.apache.tomcat/tomcat-juli@10.0.14` | Apache-2.0 | clearlydefined |\n| `org.apache.tomcat/tomcat-servlet-api@10.0.14` | Apache-2.0 AND (EPL-2.0 OR GPL-2.0-with-classpath-exception) | #921 |\n| `org.apache.tomcat/tomcat-util-scan@10.0.14` | Apache-2.0 | clearlydefined |\n| `org.apache.tomcat/tomcat-util@10.0.14` | Apache-2.0 | clearlydefined |\n| `org.checkerframework/checker-qual@3.8.0` | MIT | clearlydefined |\n| `org.eclipse.che.core/che-core-api-account@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-auth-bitbucket@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-auth-github@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-auth-openshift@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-auth-shared@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-auth@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-core@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-devfile-shared@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-devfile@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-dto@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-factory-bitbucket-server@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-factory-github@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-factory-gitlab@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-factory-shared@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-factory@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-infraproxy@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-logger-shared@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-logger@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-metrics@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-model@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-ssh-shared@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-ssh@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-system-shared@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-system@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-user-shared@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-user@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-workspace-activity@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-workspace-shared@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-api-workspace@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-commons-annotations@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-commons-inject@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-commons-json@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-commons-lang@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-commons-observability@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-commons-schedule@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-commons-tracing@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-db-vendor-postgresql@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-db@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-logback@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-metrics-core@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-sql-schema@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-tracing-core@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-tracing-metrics@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.core/che-core-tracing-web@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.infrastructure/infrastructure-distributed@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.infrastructure/infrastructure-factory@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.infrastructure/infrastructure-kubernetes@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.infrastructure/infrastructure-metrics@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.infrastructure/infrastructure-openshift@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.infrastructure/infrastructure-permission@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.multiuser/che-multiuser-api-authentication-commons@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.multiuser/che-multiuser-api-authorization-impl@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.multiuser/che-multiuser-api-authorization@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.multiuser/che-multiuser-api-permission-shared@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.multiuser/che-multiuser-api-permission@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.multiuser/che-multiuser-api-workspace-activity@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.multiuser/che-multiuser-machine-authentication-shared@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.multiuser/che-multiuser-machine-authentication@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.che.multiuser/che-multiuser-oidc@7.41.0-SNAPSHOT` | EPL-2.0 | ecd.che |\n| `org.eclipse.persistence/jakarta.persistence@2.2.3` | - | eclipse |\n| `org.eclipse.persistence/org.eclipse.persistence.antlr@2.7.9` | - | eclipse |\n| `org.eclipse.persistence/org.eclipse.persistence.asm@9.1.0` | - | eclipse |\n| `org.eclipse.persistence/org.eclipse.persistence.core@2.7.9` | - | eclipse |\n| `org.eclipse.persistence/org.eclipse.persistence.extension@2.7.9` | - | eclipse |\n| `org.eclipse.persistence/org.eclipse.persistence.jpa.jpql@2.7.9` | - | eclipse |\n| `org.eclipse.persistence/org.eclipse.persistence.jpa@2.7.9` | - | eclipse |\n| `org.everrest/everrest-commons-fileupload@1.15.0` | Apache-2.0 | clearlydefined |\n| `org.everrest/everrest-core@1.15.0` | NOASSERTION | [CQ23669](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23669) |\n| `org.everrest/everrest-guice-servlet@1.15.0` | Apache-2.0 | clearlydefined |\n| `org.everrest/everrest-integration-guice@1.15.0` | NOASSERTION | [CQ23669](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23669) |\n| `org.flywaydb/flyway-core@4.2.0` | NOASSERTION | [CQ14689](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=14689) |\n| `org.glassfish/jakarta.json@2.0.0` | EPL-2.0 OR GPL-2.0-with-classpath-exception | ee4j.jsonp |\n| `org.hdrhistogram/HdrHistogram@2.1.11` | - | [CQ13192](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=13192) |\n| `org.javassist/javassist@3.28.0-GA` | Apache-2.0 OR LGPL-2.1-or-later OR MPL-1.1 | #327 |\n| `org.jgroups.kubernetes/jgroups-kubernetes@1.0.13.Final` | NOASSERTION | [CQ20984](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=20984) |\n| `org.jgroups/jgroups@4.1.9.Final` | Apache-2.0 | clearlydefined |\n| `org.latencyutils/LatencyUtils@2.0.3` | BSD-2-Clause | [CQ17408](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=17408) |\n| `org.leadpony.justify/justify@3.1.0` | Apache-2.0 | [CQ23030](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=23030) |\n| `org.postgresql/postgresql@42.2.24` | BSD-2-Clause | clearlydefined |\n| `org.slf4j/jcl-over-slf4j@1.7.32` | Apache-2.0 | [CQ12843](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=12843) |\n| `org.slf4j/jul-to-slf4j@1.7.32` | MIT | [CQ12842](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=12842) |\n| `org.slf4j/log4j-over-slf4j@1.7.32` | Apache-2.0 | [CQ12841](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=12841) |\n| `org.slf4j/slf4j-api@1.7.32` | MIT | [CQ13368](https://dev.eclipse.org/ipzilla/show_bug.cgi?id=13368) |\n| `org.yaml/snakeyaml@1.26` | Apache-2.0 | clearlydefined |\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/gen-deps.sh",
    "content": "#!/bin/sh\n# Simple script that helps to build local version to test easily\nset -e\nset -u\ncd ../..\nmvn clean install\ncd  assembly/assembly-wsmaster-war\ndocker pull  quay.io/che-incubator/dash-licenses:next\ndocker run --rm -t \\\n       -v ~/.m2:/root/.m2 \\\n       -v ${PWD}/:/workspace/project  \\\n       quay.io/che-incubator/dash-licenses:next --generate\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-assembly-parent</artifactId>\n        <groupId>org.eclipse.che</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>assembly-wsmaster-war</artifactId>\n    <packaging>war</packaging>\n    <name>Che Assembly :: WS Master war</name>\n    <properties>\n        <generated.sources.directory>${project.build.directory}/generated-sources/gen</generated.sources.directory>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>aopalliance</groupId>\n            <artifactId>aopalliance</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.auth0</groupId>\n            <artifactId>jwks-rsa</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-assistedinject</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-persist</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.jaegertracing</groupId>\n            <artifactId>jaeger-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.jaegertracing</groupId>\n            <artifactId>jaeger-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.jaegertracing</groupId>\n            <artifactId>jaeger-tracerresolver</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.jsonwebtoken</groupId>\n            <artifactId>jjwt-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.jsonwebtoken</groupId>\n            <artifactId>jjwt-impl</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.jsonwebtoken</groupId>\n            <artifactId>jjwt-jackson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.swagger.core.v3</groupId>\n            <artifactId>swagger-jaxrs2-jakarta</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>net.logstash.logback</groupId>\n            <artifactId>logstash-logback-encoder</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-azure-devops</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-bitbucket</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-github</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-gitlab</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-openshift</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-devfile</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-azure-devops</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-bitbucket</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-bitbucket-server</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-git-ssh</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-github</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-gitlab</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-logger</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-ssh</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-ssh-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-system</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-user</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-inject</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-observability</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-schedule</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-logback</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-metrics-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-sql-schema</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-tracing-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-tracing-metrics</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-tracing-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.infrastructure</groupId>\n            <artifactId>infrastructure-distributed</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.infrastructure</groupId>\n            <artifactId>infrastructure-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.infrastructure</groupId>\n            <artifactId>infrastructure-kubernetes</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.infrastructure</groupId>\n            <artifactId>infrastructure-metrics</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.infrastructure</groupId>\n            <artifactId>infrastructure-openshift</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.infrastructure</groupId>\n            <artifactId>infrastructure-permission</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-authentication-commons</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-authorization</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-authorization-impl</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-machine-authentication</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-oidc</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.extension</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.jpa</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-guice-servlet</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-integration-guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.jgroups</groupId>\n            <artifactId>jgroups</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.jgroups.kubernetes</groupId>\n            <artifactId>jgroups-kubernetes</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.postgresql</groupId>\n            <artifactId>postgresql</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>jcl-over-slf4j</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>jul-to-slf4j</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>log4j-over-slf4j</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.websocket</groupId>\n            <artifactId>jakarta.websocket-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.tomcat</groupId>\n            <artifactId>tomcat-catalina</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.reflections</groupId>\n            <artifactId>reflections</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <resources>\n            <resource>\n                <directory>src/main/resources</directory>\n            </resource>\n        </resources>\n        <testResources>\n            <testResource>\n                <directory>src/main/webapp/WEB-INF/classes</directory>\n            </testResource>\n        </testResources>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <configuration>\n                    <excludes>\n                        <exclude>**/integration/*Test.java</exclude>\n                    </excludes>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-dependency-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>analyze</id>\n                        <configuration>\n                            <ignoredUnusedDeclaredDependencies>\n                                <!-- dependency is required for log aggregation -->\n                                <dep>org.slf4j:jcl-over-slf4j</dep>\n                                <dep>org.slf4j:jul-to-slf4j</dep>\n                                <dep>org.slf4j:log4j-over-slf4j</dep>\n                                <dep>ch.qos.logback:logback-classic</dep>\n                                <dep>net.logstash.logback:logstash-logback-encoder</dep>\n                                <dep>org.eclipse.che.core:che-core-sql-schema</dep>\n                                <dep>org.eclipse.che.core:che-core-api-ssh-shared</dep>\n                                <dep>org.eclipse.che.multiuser:che-multiuser-sql-schema</dep>\n                                <dep>org.jgroups:jgroups</dep>\n                                <dep>io.jaegertracing:jaeger-core</dep>\n                                <dep>io.jaegertracing:jaeger-client</dep>\n                                <dep>io.jaegertracing:jaeger-tracerresolver</dep>\n                                <dep>org.eclipse.che.multiuser:che-multiuser-personal-account</dep>\n                                <dep>org.eclipse.persistence:org.eclipse.persistence.extension</dep>\n                                <dep>org.eclipse.persistence:org.eclipse.persistence.jpa</dep>\n                                <dep>org.jgroups.kubernetes:jgroups-kubernetes</dep>\n                                <dep>org.postgresql:postgresql</dep>\n                                <dep>com.google.guava:guava</dep>\n                                <dep>org.everrest:everrest-core</dep>\n                                <dep>io.jsonwebtoken:jjwt-jackson</dep>\n                                <dep>io.jsonwebtoken:jjwt-impl</dep>\n                                <dep>org.eclipse.che.core:che-core-db-vendor-h2</dep>\n                            </ignoredUnusedDeclaredDependencies>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <!-- Source Generator invocation -->\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${generated.sources.directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <!-- adding \"build info\" for Che Server API -->\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-antrun-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>buildinfo</id>\n                        <phase>process-resources</phase>\n                        <goals>\n                            <goal>run</goal>\n                        </goals>\n                        <configuration>\n                            <target name=\"build_info\">\n                                <echo append=\"false\" file=\"${project.build.outputDirectory}/che/buildinfo.properties\">che.product.build_info = ${build.info}</echo>\n                            </target>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n    <profiles>\n        <profile>\n            <id>integration</id>\n            <activation>\n                <activeByDefault>false</activeByDefault>\n            </activation>\n            <build>\n                <plugins>\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-failsafe-plugin</artifactId>\n                        <executions>\n                            <execution>\n                                <goals>\n                                    <goal>integration-test</goal>\n                                    <goal>verify</goal>\n                                </goals>\n                            </execution>\n                        </executions>\n                        <configuration>\n                            <includes>\n                                <include>**/integration/*Test.java</include>\n                            </includes>\n                        </configuration>\n                    </plugin>\n                </plugins>\n            </build>\n        </profile>\n    </profiles>\n</project>\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/java/org/eclipse/che/api/deploy/ReplicationModule.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.deploy;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.name.Names;\nimport java.util.Map;\nimport org.eclipse.che.api.core.notification.RemoteSubscriptionStorage;\nimport org.eclipse.che.api.workspace.server.WorkspaceLockService;\nimport org.eclipse.che.api.workspace.server.WorkspaceStatusCache;\nimport org.eclipse.che.multiuser.api.distributed.WorkspaceStopPropagator;\nimport org.eclipse.che.multiuser.api.distributed.subscription.DistributedRemoteSubscriptionStorage;\nimport org.eclipse.persistence.config.CacheCoordinationProtocol;\nimport org.eclipse.persistence.config.PersistenceUnitProperties;\n\n/**\n * @author Max Shaposhnik (mshaposh@redhat.com)\n */\npublic class ReplicationModule extends AbstractModule {\n\n  private static final String JGROUPS_CONF_FILE = \"jgroups/che-tcp.xml\";\n\n  private Map<String, String> persistenceProperties;\n\n  public ReplicationModule(Map<String, String> persistenceProperties) {\n    this.persistenceProperties = persistenceProperties;\n  }\n\n  @Override\n  protected void configure() {\n    // Replication stuff\n    persistenceProperties.put(\n        PersistenceUnitProperties.COORDINATION_PROTOCOL, CacheCoordinationProtocol.JGROUPS);\n    persistenceProperties.put(\n        PersistenceUnitProperties.COORDINATION_JGROUPS_CONFIG, JGROUPS_CONF_FILE);\n    bindConstant().annotatedWith(Names.named(\"jgroups.config.file\")).to(JGROUPS_CONF_FILE);\n\n    bind(RemoteSubscriptionStorage.class).to(DistributedRemoteSubscriptionStorage.class);\n\n    bind(WorkspaceLockService.class)\n        .to(org.eclipse.che.multiuser.api.distributed.lock.JGroupsWorkspaceLockService.class);\n    bind(WorkspaceStatusCache.class)\n        .to(org.eclipse.che.multiuser.api.distributed.cache.JGroupsWorkspaceStatusCache.class);\n\n    bind(WorkspaceStopPropagator.class).asEagerSingleton();\n  }\n}\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/java/org/eclipse/che/api/deploy/WsMasterModule.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.deploy;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static com.google.inject.matcher.Matchers.subclassesOf;\nimport static org.eclipse.che.inject.Matchers.names;\n\nimport com.auth0.jwk.JwkProvider;\nimport com.google.inject.AbstractModule;\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.assistedinject.FactoryModuleBuilder;\nimport com.google.inject.multibindings.MapBinder;\nimport com.google.inject.multibindings.Multibinder;\nimport com.google.inject.name.Names;\nimport io.jsonwebtoken.JwtParser;\nimport io.jsonwebtoken.SigningKeyResolver;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.rest.CheJsonProvider;\nimport org.eclipse.che.api.core.rest.MessageBodyAdapter;\nimport org.eclipse.che.api.core.rest.MessageBodyAdapterInterceptor;\nimport org.eclipse.che.api.deploy.jsonrpc.CheJsonRpcWebSocketConfigurationModule;\nimport org.eclipse.che.api.factory.server.FactoryAcceptValidator;\nimport org.eclipse.che.api.factory.server.FactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.RawDevfileUrlFactoryParameterResolver;\nimport org.eclipse.che.api.factory.server.ScmFileResolver;\nimport org.eclipse.che.api.factory.server.ScmService;\nimport org.eclipse.che.api.factory.server.azure.devops.AzureDevOpsFactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.azure.devops.AzureDevOpsScmFileResolver;\nimport org.eclipse.che.api.factory.server.bitbucket.BitbucketFactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.bitbucket.BitbucketScmFileResolver;\nimport org.eclipse.che.api.factory.server.bitbucket.BitbucketServerAuthorizingFactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.bitbucket.BitbucketServerScmFileResolver;\nimport org.eclipse.che.api.factory.server.git.ssh.GitSshFactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.git.ssh.GitSshScmFileResolver;\nimport org.eclipse.che.api.factory.server.github.GithubFactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.github.GithubFactoryParametersResolverSecond;\nimport org.eclipse.che.api.factory.server.github.GithubScmFileResolver;\nimport org.eclipse.che.api.factory.server.github.GithubScmFileResolverSecond;\nimport org.eclipse.che.api.factory.server.gitlab.GitlabFactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.gitlab.GitlabFactoryParametersResolverSecond;\nimport org.eclipse.che.api.factory.server.gitlab.GitlabScmFileResolver;\nimport org.eclipse.che.api.factory.server.gitlab.GitlabScmFileResolverSecond;\nimport org.eclipse.che.api.system.server.ServiceTermination;\nimport org.eclipse.che.api.system.server.SystemModule;\nimport org.eclipse.che.api.user.server.NotImplementedTokenValidator;\nimport org.eclipse.che.api.user.server.TokenValidator;\nimport org.eclipse.che.api.user.server.jpa.JpaPreferenceDao;\nimport org.eclipse.che.api.user.server.jpa.JpaProfileDao;\nimport org.eclipse.che.api.user.server.jpa.JpaUserDao;\nimport org.eclipse.che.api.user.server.spi.PreferenceDao;\nimport org.eclipse.che.api.user.server.spi.ProfileDao;\nimport org.eclipse.che.api.user.server.spi.UserDao;\nimport org.eclipse.che.api.workspace.server.WorkspaceEntityProvider;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileModule;\nimport org.eclipse.che.api.workspace.server.hc.ServersCheckerFactory;\nimport org.eclipse.che.api.workspace.server.jpa.WorkspaceJpaModule;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.AgentAuthEnableEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.CheApiEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.CheApiExternalEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.CheApiInternalEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.EnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.JavaOptsEnvVariableProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.LegacyEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.MachineTokenEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.MavenOptsEnvVariableProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.WorkspaceIdEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.WorkspaceNameEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.WorkspaceNamespaceNameEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.wsplugins.ChePluginsApplier;\nimport org.eclipse.che.commons.observability.deploy.ExecutorWrapperModule;\nimport org.eclipse.che.core.tracing.metrics.TracingMetricsModule;\nimport org.eclipse.che.inject.DynaModule;\nimport org.eclipse.che.multiuser.api.authentication.commons.token.HeaderRequestTokenExtractor;\nimport org.eclipse.che.multiuser.api.authentication.commons.token.RequestTokenExtractor;\nimport org.eclipse.che.multiuser.api.permission.server.PermissionChecker;\nimport org.eclipse.che.multiuser.api.permission.server.PermissionCheckerImpl;\nimport org.eclipse.che.multiuser.machine.authentication.server.MachineAuthModule;\nimport org.eclipse.che.multiuser.oidc.OIDCInfo;\nimport org.eclipse.che.multiuser.oidc.OIDCInfoProvider;\nimport org.eclipse.che.multiuser.oidc.OIDCJwkProvider;\nimport org.eclipse.che.multiuser.oidc.OIDCJwtParserProvider;\nimport org.eclipse.che.multiuser.oidc.OIDCSigningKeyResolver;\nimport org.eclipse.che.security.PBKDF2PasswordEncryptor;\nimport org.eclipse.che.security.PasswordEncryptor;\nimport org.eclipse.che.security.oauth.EmbeddedOAuthAPI;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.eclipse.che.security.oauth.OpenShiftOAuthModule;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientConfigFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfraModule;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructure;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.AuthorizationChecker;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.KubernetesOIDCAuthorizationCheckerImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.multiuser.oauth.KubernetesOidcProviderConfigFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposerFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.PassThroughProxySecureServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory.JwtProxyConfigBuilderFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory.JwtProxyProvisionerFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory.JwtProxySecureServerExposerFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory.PassThroughProxyProvisionerFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory.PassThroughProxySecureServerExposerFactory;\nimport org.eclipse.che.workspace.infrastructure.metrics.InfrastructureMetricsModule;\nimport org.eclipse.che.workspace.infrastructure.openshift.OpenShiftInfraModule;\nimport org.eclipse.che.workspace.infrastructure.openshift.OpenShiftInfrastructure;\nimport org.eclipse.che.workspace.infrastructure.openshift.authorization.OpenShiftAuthorizationCheckerImpl;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.eclipse.persistence.config.PersistenceUnitProperties;\n\n/**\n * @author andrew00x\n */\n@DynaModule\npublic class WsMasterModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    // Workaround for https://github.com/fabric8io/kubernetes-client/issues/2212\n    // OkHttp wrongly detects JDK8u251 and higher as JDK9 which enables Http2 unsupported for JDK8.\n    // Can be removed after upgrade to Fabric8 4.10.2 or higher or to Java 11\n    if (System.getProperty(\"java.version\", \"\").startsWith(\"1.8\")) {\n      System.setProperty(\"http2.disable\", \"true\");\n    }\n\n    // db related components modules\n    install(new org.eclipse.che.api.ssh.server.jpa.SshJpaModule());\n    install(new org.eclipse.che.api.core.jsonrpc.impl.JsonRpcModule());\n    install(new org.eclipse.che.api.core.websocket.impl.WebSocketModule());\n\n    // factory\n    bind(FactoryAcceptValidator.class)\n        .to(org.eclipse.che.api.factory.server.impl.FactoryAcceptValidatorImpl.class);\n    bind(org.eclipse.che.api.factory.server.FactoryService.class);\n    bind(ScmService.class);\n    install(new org.eclipse.che.api.factory.server.jpa.FactoryJpaModule());\n\n    // Service-specific factory resolvers.\n    Multibinder<FactoryParametersResolver> factoryParametersResolverMultibinder =\n        Multibinder.newSetBinder(binder(), FactoryParametersResolver.class);\n    factoryParametersResolverMultibinder.addBinding().to(GithubFactoryParametersResolver.class);\n    factoryParametersResolverMultibinder\n        .addBinding()\n        .to(GithubFactoryParametersResolverSecond.class);\n    factoryParametersResolverMultibinder\n        .addBinding()\n        .to(BitbucketServerAuthorizingFactoryParametersResolver.class);\n    factoryParametersResolverMultibinder.addBinding().to(GitlabFactoryParametersResolver.class);\n    factoryParametersResolverMultibinder\n        .addBinding()\n        .to(GitlabFactoryParametersResolverSecond.class);\n    factoryParametersResolverMultibinder.addBinding().to(BitbucketFactoryParametersResolver.class);\n    factoryParametersResolverMultibinder\n        .addBinding()\n        .to(AzureDevOpsFactoryParametersResolver.class);\n    factoryParametersResolverMultibinder\n        .addBinding()\n        .to(RawDevfileUrlFactoryParameterResolver.class);\n    factoryParametersResolverMultibinder.addBinding().to(GitSshFactoryParametersResolver.class);\n\n    Multibinder<ScmFileResolver> scmFileResolverResolverMultibinder =\n        Multibinder.newSetBinder(binder(), ScmFileResolver.class);\n    scmFileResolverResolverMultibinder.addBinding().to(GithubScmFileResolver.class);\n    scmFileResolverResolverMultibinder.addBinding().to(GithubScmFileResolverSecond.class);\n    scmFileResolverResolverMultibinder.addBinding().to(BitbucketScmFileResolver.class);\n    scmFileResolverResolverMultibinder.addBinding().to(GitlabScmFileResolver.class);\n    scmFileResolverResolverMultibinder.addBinding().to(GitlabScmFileResolverSecond.class);\n    scmFileResolverResolverMultibinder.addBinding().to(BitbucketServerScmFileResolver.class);\n    scmFileResolverResolverMultibinder.addBinding().to(AzureDevOpsScmFileResolver.class);\n    scmFileResolverResolverMultibinder.addBinding().to(GitSshScmFileResolver.class);\n\n    install(new org.eclipse.che.api.factory.server.scm.KubernetesScmModule());\n    install(new org.eclipse.che.api.factory.server.bitbucket.BitbucketServerModule());\n    install(new org.eclipse.che.api.factory.server.gitlab.GitlabModule());\n    install(new org.eclipse.che.api.factory.server.github.GithubModule());\n    install(new org.eclipse.che.api.factory.server.bitbucket.BitbucketModule());\n    install(new org.eclipse.che.api.factory.server.azure.devops.AzureDevOpsModule());\n\n    bind(org.eclipse.che.api.core.rest.ApiInfoService.class);\n    bind(org.eclipse.che.api.user.server.UserService.class);\n    bind(org.eclipse.che.security.oauth.OAuthAuthenticationService.class);\n    bind(org.eclipse.che.security.oauth1.OAuthAuthenticationService.class);\n\n    install(new DevfileModule());\n\n    bind(WorkspaceEntityProvider.class);\n    bind(org.eclipse.che.api.devfile.server.UserDevfileEntityProvider.class);\n\n    install(new FactoryModuleBuilder().build(ServersCheckerFactory.class));\n\n    Multibinder<EnvVarProvider> envVarProviders =\n        Multibinder.newSetBinder(binder(), EnvVarProvider.class);\n    envVarProviders.addBinding().to(CheApiEnvVarProvider.class);\n    envVarProviders.addBinding().to(CheApiInternalEnvVarProvider.class);\n    envVarProviders.addBinding().to(CheApiExternalEnvVarProvider.class);\n    envVarProviders.addBinding().to(MachineTokenEnvVarProvider.class);\n    envVarProviders.addBinding().to(WorkspaceIdEnvVarProvider.class);\n    envVarProviders.addBinding().to(WorkspaceNamespaceNameEnvVarProvider.class);\n    envVarProviders.addBinding().to(WorkspaceNameEnvVarProvider.class);\n\n    Multibinder<LegacyEnvVarProvider> legacyEnvVarProviderMultibinders =\n        Multibinder.newSetBinder(binder(), LegacyEnvVarProvider.class);\n    legacyEnvVarProviderMultibinders.addBinding().to(JavaOptsEnvVariableProvider.class);\n    legacyEnvVarProviderMultibinders.addBinding().to(MavenOptsEnvVariableProvider.class);\n\n    legacyEnvVarProviderMultibinders.addBinding().to(AgentAuthEnableEnvVarProvider.class);\n    bind(org.eclipse.che.api.workspace.server.event.WorkspaceJsonRpcMessenger.class)\n        .asEagerSingleton();\n    bind(org.eclipse.che.everrest.EverrestDownloadFileResponseFilter.class);\n    bind(org.eclipse.che.everrest.ETagResponseFilter.class);\n\n    // temporary solution\n    bind(org.eclipse.che.api.workspace.server.event.RuntimeStatusJsonRpcMessenger.class)\n        .asEagerSingleton();\n    bind(org.eclipse.che.api.workspace.server.event.MachineStatusJsonRpcMessenger.class)\n        .asEagerSingleton();\n    bind(org.eclipse.che.api.workspace.server.event.ServerStatusJsonRpcMessenger.class)\n        .asEagerSingleton();\n    bind(org.eclipse.che.api.workspace.server.event.RuntimeLogJsonRpcMessenger.class)\n        .asEagerSingleton();\n\n    bind(org.eclipse.che.security.oauth.OAuthAuthenticatorProvider.class)\n        .to(org.eclipse.che.security.oauth.OAuthAuthenticatorProviderImpl.class);\n\n    install(new org.eclipse.che.api.core.rest.CoreRestModule());\n    install(new org.eclipse.che.api.core.util.FileCleaner.FileCleanerModule());\n    install(new org.eclipse.che.swagger.deploy.DocsModule());\n    install(new org.eclipse.che.commons.schedule.executor.ScheduleModule());\n    install(new org.eclipse.che.api.logger.deploy.LoggerModule());\n\n    final Multibinder<MessageBodyAdapter> adaptersMultibinder =\n        Multibinder.newSetBinder(binder(), MessageBodyAdapter.class);\n\n    final MessageBodyAdapterInterceptor interceptor = new MessageBodyAdapterInterceptor();\n    requestInjection(interceptor);\n    bindInterceptor(subclassesOf(CheJsonProvider.class), names(\"readFrom\"), interceptor);\n\n    // system components\n    install(new SystemModule());\n    Multibinder<ServiceTermination> terminationMultiBinder =\n        Multibinder.newSetBinder(binder(), ServiceTermination.class);\n    terminationMultiBinder\n        .addBinding()\n        .to(org.eclipse.che.api.system.server.CronThreadPullTermination.class);\n\n    final Map<String, String> persistenceProperties = new HashMap<>();\n    persistenceProperties.put(PersistenceUnitProperties.TARGET_SERVER, \"None\");\n    persistenceProperties.put(PersistenceUnitProperties.LOGGING_LOGGER, \"DefaultLogger\");\n    persistenceProperties.put(PersistenceUnitProperties.LOGGING_LEVEL, \"SEVERE\");\n    persistenceProperties.put(\n        PersistenceUnitProperties.NON_JTA_DATASOURCE, \"java:/comp/env/jdbc/che\");\n    bindConstant().annotatedWith(Names.named(\"jndi.datasource.name\")).to(\"java:/comp/env/jdbc/che\");\n\n    String infrastructure = System.getenv(\"CHE_INFRASTRUCTURE_ACTIVE\");\n\n    install(new FactoryModuleBuilder().build(JwtProxyConfigBuilderFactory.class));\n    install(new FactoryModuleBuilder().build(PassThroughProxyProvisionerFactory.class));\n    installDefaultSecureServerExposer(infrastructure);\n    install(new org.eclipse.che.security.BitbucketModule());\n    install(new org.eclipse.che.security.oauth.GitLabModule());\n    install(new org.eclipse.che.security.oauth.AzureDevOpsModule());\n    install(new org.eclipse.che.security.oauth.GithubModule());\n    install(new WorkspaceJpaModule());\n\n    configureMultiUserMode(persistenceProperties, infrastructure);\n\n    install(\n        new com.google.inject.persist.jpa.JpaPersistModule(\"main\")\n            .properties(persistenceProperties));\n\n    if (OpenShiftInfrastructure.NAME.equals(infrastructure)) {\n      install(new OpenShiftInfraModule());\n    } else if (KubernetesInfrastructure.NAME.equals(infrastructure)) {\n      install(new KubernetesInfraModule());\n    }\n    install(new CheJsonRpcWebSocketConfigurationModule());\n\n    bind(org.eclipse.che.api.user.server.AppStatesPreferenceCleaner.class);\n    MapBinder.newMapBinder(binder(), String.class, ChePluginsApplier.class);\n\n    if (Boolean.valueOf(System.getenv(\"CHE_TRACING_ENABLED\"))) {\n      install(new org.eclipse.che.core.tracing.TracingModule());\n    } else {\n      install(new org.eclipse.che.core.tracing.NopTracingModule());\n    }\n    if (Boolean.valueOf(System.getenv(\"CHE_METRICS_ENABLED\"))) {\n      install(new org.eclipse.che.core.metrics.MetricsModule());\n      install(new InfrastructureMetricsModule());\n    }\n    if (Boolean.valueOf(System.getenv(\"CHE_TRACING_ENABLED\"))\n        && Boolean.valueOf(System.getenv(\"CHE_METRICS_ENABLED\"))) {\n      install(new TracingMetricsModule());\n    }\n    install(new ExecutorWrapperModule());\n\n    install(new OpenShiftOAuthModule());\n  }\n\n  private void configureMultiUserMode(\n      Map<String, String> persistenceProperties, String infrastructure) {\n    install(new ReplicationModule(persistenceProperties));\n    bind(\n        org.eclipse.che.multiuser.permission.workspace.infra.kubernetes\n            .BrokerServicePermissionFilter.class);\n    configureJwtProxySecureProvisioner(infrastructure);\n\n    bind(KubernetesClientConfigFactory.class).to(KubernetesOidcProviderConfigFactory.class);\n\n    bind(RequestTokenExtractor.class).to(HeaderRequestTokenExtractor.class);\n    if (isOpenShiftOAuthEnabled()) {\n      bind(AuthorizationChecker.class).to(OpenShiftAuthorizationCheckerImpl.class);\n    } else {\n      bind(OIDCInfo.class).toProvider(OIDCInfoProvider.class).asEagerSingleton();\n      bind(SigningKeyResolver.class).to(OIDCSigningKeyResolver.class);\n      bind(JwtParser.class).toProvider(OIDCJwtParserProvider.class);\n      bind(JwkProvider.class).toProvider(OIDCJwkProvider.class);\n      bind(AuthorizationChecker.class).to(KubernetesOIDCAuthorizationCheckerImpl.class);\n    }\n    bind(TokenValidator.class).to(NotImplementedTokenValidator.class);\n    bind(ProfileDao.class).to(JpaProfileDao.class);\n    bind(OAuthAPI.class).to(EmbeddedOAuthAPI.class).asEagerSingleton();\n\n    install(new MachineAuthModule());\n\n    // User and profile - use profile from keycloak and other stuff is JPA\n    bind(PasswordEncryptor.class).to(PBKDF2PasswordEncryptor.class);\n    bind(UserDao.class).to(JpaUserDao.class);\n    bind(PreferenceDao.class).to(JpaPreferenceDao.class);\n    bind(PermissionChecker.class).to(PermissionCheckerImpl.class);\n\n    bindConstant().annotatedWith(Names.named(\"che.agents.auth_enabled\")).to(true);\n  }\n\n  private void configureJwtProxySecureProvisioner(String infrastructure) {\n    install(new FactoryModuleBuilder().build(JwtProxyProvisionerFactory.class));\n    if (KubernetesInfrastructure.NAME.equals(infrastructure)) {\n      install(\n          new FactoryModuleBuilder()\n              .build(\n                  new TypeLiteral<JwtProxySecureServerExposerFactory<KubernetesEnvironment>>() {}));\n      MapBinder.newMapBinder(\n              binder(),\n              new TypeLiteral<String>() {},\n              new TypeLiteral<SecureServerExposerFactory<KubernetesEnvironment>>() {})\n          .addBinding(\"jwtproxy\")\n          .to(new TypeLiteral<JwtProxySecureServerExposerFactory<KubernetesEnvironment>>() {});\n    } else {\n      install(\n          new FactoryModuleBuilder()\n              .build(\n                  new TypeLiteral<JwtProxySecureServerExposerFactory<OpenShiftEnvironment>>() {}));\n      MapBinder.newMapBinder(\n              binder(),\n              new TypeLiteral<String>() {},\n              new TypeLiteral<SecureServerExposerFactory<OpenShiftEnvironment>>() {})\n          .addBinding(\"jwtproxy\")\n          .to(new TypeLiteral<JwtProxySecureServerExposerFactory<OpenShiftEnvironment>>() {});\n    }\n  }\n\n  private void configureImpostorJwtProxySecureProvisioner(String infrastructure) {\n    if (KubernetesInfrastructure.NAME.equals(infrastructure)) {\n      MapBinder.newMapBinder(\n              binder(),\n              new TypeLiteral<String>() {},\n              new TypeLiteral<SecureServerExposerFactory<KubernetesEnvironment>>() {})\n          .addBinding(\"jwtproxy\")\n          .to(\n              new TypeLiteral<\n                  PassThroughProxySecureServerExposerFactory<KubernetesEnvironment>>() {});\n    } else {\n      MapBinder.newMapBinder(\n              binder(),\n              new TypeLiteral<String>() {},\n              new TypeLiteral<SecureServerExposerFactory<OpenShiftEnvironment>>() {})\n          .addBinding(\"jwtproxy\")\n          .to(\n              new TypeLiteral<\n                  PassThroughProxySecureServerExposerFactory<OpenShiftEnvironment>>() {});\n    }\n  }\n\n  private void installDefaultSecureServerExposer(String infrastructure) {\n    if (KubernetesInfrastructure.NAME.equals(infrastructure)) {\n      MapBinder<String, SecureServerExposerFactory<KubernetesEnvironment>>\n          secureServerExposerFactories =\n              MapBinder.newMapBinder(binder(), new TypeLiteral<>() {}, new TypeLiteral<>() {});\n\n      install(\n          new FactoryModuleBuilder()\n              .implement(\n                  new TypeLiteral<SecureServerExposer<KubernetesEnvironment>>() {},\n                  new TypeLiteral<PassThroughProxySecureServerExposer<KubernetesEnvironment>>() {})\n              .build(\n                  new TypeLiteral<\n                      PassThroughProxySecureServerExposerFactory<KubernetesEnvironment>>() {}));\n\n      secureServerExposerFactories\n          .addBinding(\"default\")\n          .to(\n              new TypeLiteral<\n                  PassThroughProxySecureServerExposerFactory<KubernetesEnvironment>>() {});\n    } else {\n      MapBinder<String, SecureServerExposerFactory<OpenShiftEnvironment>>\n          secureServerExposerFactories =\n              MapBinder.newMapBinder(binder(), new TypeLiteral<>() {}, new TypeLiteral<>() {});\n\n      install(\n          new FactoryModuleBuilder()\n              .implement(\n                  new TypeLiteral<SecureServerExposer<OpenShiftEnvironment>>() {},\n                  new TypeLiteral<PassThroughProxySecureServerExposer<OpenShiftEnvironment>>() {})\n              .build(\n                  new TypeLiteral<\n                      PassThroughProxySecureServerExposerFactory<OpenShiftEnvironment>>() {}));\n\n      secureServerExposerFactories\n          .addBinding(\"default\")\n          .to(\n              new TypeLiteral<\n                  PassThroughProxySecureServerExposerFactory<OpenShiftEnvironment>>() {});\n    }\n  }\n\n  private boolean isOpenShiftOAuthEnabled() {\n    String openShiftOAuthEnabled = System.getenv(\"CHE_INFRA_OPENSHIFT_OAUTH__ENABLED\");\n\n    if (!isNullOrEmpty(openShiftOAuthEnabled)) {\n      return Boolean.valueOf(openShiftOAuthEnabled);\n    }\n\n    String infrastructure = System.getenv(\"CHE_INFRASTRUCTURE_ACTIVE\");\n    return OpenShiftInfrastructure.NAME.equals(infrastructure);\n  }\n}\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/java/org/eclipse/che/api/deploy/WsMasterServletModule.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.deploy;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.collect.ImmutableMap;\nimport com.google.inject.servlet.ServletModule;\nimport org.eclipse.che.api.core.cors.CheCorsFilter;\nimport org.eclipse.che.commons.logback.filter.RequestIdLoggerFilter;\nimport org.eclipse.che.inject.DynaModule;\nimport org.eclipse.che.multiuser.oidc.filter.OidcTokenInitializationFilter;\nimport org.eclipse.che.workspace.infrastructure.openshift.OpenShiftInfrastructure;\nimport org.eclipse.che.workspace.infrastructure.openshift.multiuser.oauth.OpenshiftTokenInitializationFilter;\nimport org.everrest.guice.servlet.GuiceEverrestServlet;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * @author andrew00x\n */\n@DynaModule\npublic class WsMasterServletModule extends ServletModule {\n  private static final Logger LOG = LoggerFactory.getLogger(WsMasterServletModule.class);\n\n  @Override\n  protected void configureServlets() {\n\n    if (Boolean.valueOf(System.getenv(\"CHE_TRACING_ENABLED\"))) {\n      install(new org.eclipse.che.core.tracing.web.TracingWebModule());\n    }\n    if (isCheCorsEnabled()) {\n      filter(\"/*\").through(CheCorsFilter.class);\n    }\n\n    filter(\"/*\").through(RequestIdLoggerFilter.class);\n\n    // Matching group SHOULD contain forward slash.\n    serveRegex(\"^(?!/websocket.?)(.*)\")\n        .with(GuiceEverrestServlet.class, ImmutableMap.of(\"openapi.context.id\", \"org.eclipse.che\"));\n\n    LOG.info(\"Running in native-user mode ...\");\n    configureNativeUserMode();\n\n    if (Boolean.valueOf(System.getenv(\"CHE_METRICS_ENABLED\"))) {\n      install(new org.eclipse.che.core.metrics.MetricsServletModule());\n    }\n  }\n\n  private boolean isCheCorsEnabled() {\n    String cheCorsEnabledEnvVar = System.getenv(\"CHE_CORS_ENABLED\");\n    if (cheCorsEnabledEnvVar == null) {\n      // by default CORS should be disabled\n      return false;\n    } else {\n      return Boolean.valueOf(cheCorsEnabledEnvVar);\n    }\n  }\n\n  private void configureNativeUserMode() {\n    if (isOpenShiftOAuthEnabled()) {\n      filter(\"/*\").through(OpenshiftTokenInitializationFilter.class);\n    } else {\n      filter(\"/*\").through(OidcTokenInitializationFilter.class);\n    }\n  }\n\n  private boolean isOpenShiftOAuthEnabled() {\n    String openShiftOAuthEnabled = System.getenv(\"CHE_INFRA_OPENSHIFT_OAUTH__ENABLED\");\n\n    if (!isNullOrEmpty(openShiftOAuthEnabled)) {\n      return Boolean.valueOf(openShiftOAuthEnabled);\n    }\n\n    String infrastructure = System.getenv(\"CHE_INFRASTRUCTURE_ACTIVE\");\n    return OpenShiftInfrastructure.NAME.equals(infrastructure);\n  }\n}\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/java/org/eclipse/che/api/deploy/jsonrpc/CheJsonRpcWebSocketConfigurationModule.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.deploy.jsonrpc;\n\nimport com.google.inject.Binder;\nimport com.google.inject.Module;\nimport com.google.inject.multibindings.Multibinder;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestProcessorConfigurationProvider;\n\n/** Configures JSON RPC WebSocket Endpoints. */\npublic class CheJsonRpcWebSocketConfigurationModule implements Module {\n  @Override\n  public void configure(Binder binder) {\n\n    Multibinder<RequestProcessorConfigurationProvider.Configuration> configurationMultibinder =\n        Multibinder.newSetBinder(binder, RequestProcessorConfigurationProvider.Configuration.class);\n    configurationMultibinder.addBinding().to(CheMajorWebSocketEndpointConfiguration.class);\n  }\n}\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/java/org/eclipse/che/api/deploy/jsonrpc/CheMajorWebSocketEndpoint.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.deploy.jsonrpc;\n\nimport jakarta.websocket.server.ServerEndpoint;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageReceiver;\nimport org.eclipse.che.api.core.websocket.impl.BasicWebSocketEndpoint;\nimport org.eclipse.che.api.core.websocket.impl.GuiceInjectorEndpointConfigurator;\nimport org.eclipse.che.api.core.websocket.impl.MessagesReSender;\nimport org.eclipse.che.api.core.websocket.impl.WebSocketSessionRegistry;\nimport org.eclipse.che.api.core.websocket.impl.WebsocketIdService;\n\n/**\n * Implementation of {@link BasicWebSocketEndpoint} for Che packaging. Add only mapping\n * \"/websocket\".\n */\n@ServerEndpoint(value = \"/websocket\", configurator = GuiceInjectorEndpointConfigurator.class)\npublic class CheMajorWebSocketEndpoint extends BasicWebSocketEndpoint {\n\n  public static final String ENDPOINT_ID = \"master-websocket-major-endpoint\";\n\n  @Inject\n  public CheMajorWebSocketEndpoint(\n      WebSocketSessionRegistry registry,\n      MessagesReSender reSender,\n      WebSocketMessageReceiver receiver,\n      WebsocketIdService websocketIdService) {\n    super(registry, reSender, receiver, websocketIdService);\n  }\n\n  @Override\n  protected String getEndpointId() {\n    return ENDPOINT_ID;\n  }\n}\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/java/org/eclipse/che/api/deploy/jsonrpc/CheMajorWebSocketEndpointConfiguration.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.deploy.jsonrpc;\n\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport java.util.concurrent.ExecutorService;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestProcessorConfigurationProvider;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.eclipse.che.commons.lang.execution.ExecutorServiceBuilder;\nimport org.eclipse.che.commons.observability.ExecutorServiceWrapper;\nimport org.slf4j.Logger;\n\n/**\n * {@link RequestProcessorConfigurationProvider.Configuration} implementation used to configure\n * {@link CheMajorWebSocketEndpoint}\n */\npublic class CheMajorWebSocketEndpointConfiguration\n    implements RequestProcessorConfigurationProvider.Configuration {\n\n  private static final Logger LOG = getLogger(CheMajorWebSocketEndpointConfiguration.class);\n\n  private final ExecutorService executor;\n\n  public static final String JSON_RPC_MAJOR_CORE_POOL_SIZE_PARAMETER_NAME =\n      \"che.core.jsonrpc.processor_core_pool_size\";\n  public static final String JSON_RPC_MAJOR_MAX_POOL_SIZE_PARAMETER_NAME =\n      \"che.core.jsonrpc.processor_max_pool_size\";\n  public static final String JSON_RPC_MAJOR_QUEUE_CAPACITY_PARAMETER_NAME =\n      \"che.core.jsonrpc.processor_queue_capacity\";\n\n  @Inject\n  public CheMajorWebSocketEndpointConfiguration(\n      @Named(JSON_RPC_MAJOR_CORE_POOL_SIZE_PARAMETER_NAME) int corePoolSize,\n      @Named(JSON_RPC_MAJOR_MAX_POOL_SIZE_PARAMETER_NAME) int maxPoolSize,\n      @Named(JSON_RPC_MAJOR_QUEUE_CAPACITY_PARAMETER_NAME) int queueCapacity,\n      ExecutorServiceWrapper wrapper) {\n    this.executor =\n        wrapper.wrap(\n            new ExecutorServiceBuilder()\n                .corePoolSize(corePoolSize)\n                .maxPoolSize(maxPoolSize)\n                .queueCapacity(queueCapacity)\n                .threadFactory(\n                    new ThreadFactoryBuilder()\n                        .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n                        .setNameFormat(CheMajorWebSocketEndpoint.ENDPOINT_ID + \"-%d\")\n                        .setDaemon(true)\n                        .build())\n                .rejectedExecutionHandler(\n                    (r, executor) ->\n                        LOG.error(\n                            \"Executor on major websocket endpoint rejected to handle the payload {}. Some important messages may be lost. Consider increasing `{}`. Now it's configured to {}\",\n                            r,\n                            JSON_RPC_MAJOR_QUEUE_CAPACITY_PARAMETER_NAME,\n                            queueCapacity))\n                .build(),\n            CheMajorWebSocketEndpoint.ENDPOINT_ID);\n  }\n\n  @Override\n  public String getEndpointId() {\n    return CheMajorWebSocketEndpoint.ENDPOINT_ID;\n  }\n\n  @Override\n  public ExecutorService getExecutorService() {\n    return executor;\n  }\n}\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/java/org/eclipse/che/swagger/deploy/DocsModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.swagger.deploy;\n\nimport com.google.inject.AbstractModule;\nimport io.swagger.v3.jaxrs2.integration.resources.OpenApiResource;\n\n/**\n * @author Sergii Kabashniuk\n */\npublic class DocsModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    bind(OpenApiResource.class);\n  }\n}\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/resources/META-INF/persistence.xml",
    "content": "<!--\n\n    Copyright (c) 2012-2023 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<persistence xmlns=\"http://java.sun.com/xml/ns/persistence\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             xsi:schemaLocation=\"http://java.sun.com/xml/ns/persistence persistence_1_0.xsd\" version=\"1.0\">\n    <persistence-unit name=\"main\" transaction-type=\"RESOURCE_LOCAL\">\n        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>\n\n        <class>org.eclipse.che.account.spi.AccountImpl</class>\n        <class>org.eclipse.che.api.user.server.model.impl.UserImpl</class>\n        <class>org.eclipse.che.api.user.server.model.impl.ProfileImpl</class>\n        <class>org.eclipse.che.api.user.server.jpa.PreferenceEntity</class>\n\n        <class>org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.ProjectConfigImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.EnvironmentImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.EnvironmentRecipeImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.ProjectConfigImpl$Attribute</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.SourceStorageImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.VolumeImpl</class>\n\n        <class>org.eclipse.che.api.workspace.server.model.impl.CommandImpl</class>\n\n        <class>org.eclipse.che.api.factory.server.model.impl.FactoryImpl</class>\n        <class>org.eclipse.che.api.factory.server.model.impl.OnAppClosedImpl</class>\n        <class>org.eclipse.che.api.factory.server.model.impl.OnProjectsLoadedImpl</class>\n        <class>org.eclipse.che.api.factory.server.model.impl.OnAppLoadedImpl</class>\n        <class>org.eclipse.che.api.factory.server.model.impl.PoliciesImpl</class>\n        <class>org.eclipse.che.api.factory.server.model.impl.ActionImpl</class>\n        <class>org.eclipse.che.api.factory.server.model.impl.AuthorImpl</class>\n        <class>org.eclipse.che.api.factory.server.model.impl.IdeImpl</class>\n\n        <class>org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.devfile.ProjectImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.devfile.EntrypointImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.devfile.ActionImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.devfile.VolumeImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.devfile.SourceImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.devfile.EnvImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.devfile.CommandImpl</class>\n        <class>org.eclipse.che.api.workspace.server.model.impl.devfile.EndpointImpl</class>\n        <class>org.eclipse.che.api.workspace.server.devfile.SerializableConverter</class>\n        <class>org.eclipse.che.api.devfile.server.model.impl.UserDevfileImpl</class>\n\n        <class>org.eclipse.che.api.ssh.server.model.impl.SshPairImpl</class>\n        \n        <class>org.eclipse.che.multiuser.api.permission.server.model.impl.SystemPermissionsImpl</class>\n        <class>org.eclipse.che.multiuser.api.permission.server.model.impl.AbstractPermissions</class>\n        <class>org.eclipse.che.multiuser.permission.workspace.server.model.impl.WorkerImpl</class>\n        <class>org.eclipse.che.multiuser.permission.devfile.server.model.impl.UserDevfilePermissionImpl</class>\n\n        <class>org.eclipse.che.multiuser.resource.spi.impl.FreeResourcesLimitImpl</class>\n        <class>org.eclipse.che.multiuser.resource.spi.impl.ResourceImpl</class>\n\n        <class>org.eclipse.che.multiuser.organization.spi.impl.OrganizationImpl</class>\n        <class>org.eclipse.che.multiuser.organization.spi.impl.MemberImpl</class>\n        <class>org.eclipse.che.multiuser.organization.spi.impl.OrganizationDistributedResourcesImpl</class>\n\n        <class>org.eclipse.che.api.workspace.activity.WorkspaceActivity</class>\n        <class>org.eclipse.che.multiuser.machine.authentication.server.signature.model.impl.SignatureKeyImpl</class>\n        <class>org.eclipse.che.multiuser.machine.authentication.server.signature.model.impl.SignatureKeyPairImpl</class>\n\n        <class>org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesRuntimeState</class>\n        <class>org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesRuntimeCommandImpl</class>\n\n        <class>org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesMachineImpl</class>\n        <class>org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesMachineImpl.MachineId</class>\n\n        <class>org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesServerImpl</class>\n        <class>org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesServerImpl.ServerId</class>\n\n        <exclude-unlisted-classes>true</exclude-unlisted-classes>\n    </persistence-unit>\n</persistence>\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties",
    "content": "#\n# Copyright (c) 2012-2026 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# {orch-name}: Kubernetes or OpenShift\n# {prod-short}: Eclipse Che\n\n### {prod-short} server\n\n# API service. Browsers initiate REST communications to {prod-short} server with this URL.\nche.api=https://${CHE_HOST}/api\n\n# API service internal network URL. Back-end services should initiate REST communications to {prod-short} server with this URL.\nche.api.internal=NULL\n\n# {prod-short} WebSocket major endpoint. Provides basic communication endpoint\n# for major WebSocket interactions and messaging.\nche.websocket.endpoint=ws://${CHE_HOST}:${CHE_PORT}/api/websocket\n\n# {prod-short} WebSocket major internal endpoint. Provides basic communication endpoint\n# for major WebSocket interactions and messaging.\nche.websocket.internal.endpoint=NULL\n\n# HTTP proxy setting for workspace JVM.\nche.workspace.http_proxy_java_options=NULL\n\n# Java command line options added to JVMs running in workspaces.\nche.workspace.java_options=-XX:MaxRAM=150m -XX:MaxRAMFraction=2 -XX:+UseParallelGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xms20m -Djava.security.egd=file:/dev/./urandom\n\n# Maven command line options added to JVMs running agents in workspaces.\nche.workspace.maven_options=-XX:MaxRAM=150m -XX:MaxRAMFraction=2 -XX:+UseParallelGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xms20m -Djava.security.egd=file:/dev/./urandom\n\n# RAM limit default for each machine that has no RAM settings in its environment.\n# Value less than or equal to `0` is interpreted as disabling the limit.\nche.workspace.default_memory_limit_mb=1024\n\n# RAM request for each container that has no explicit RAM settings in its environment.\n# This amount is allocated when the workspace container is created.\n# This property may not be supported by all infrastructure implementations.\n# Currently it is supported by {orch-name}.\n# A memory request exceeding the memory limit is ignored, and only the limit size is used.\n# Value less than or equal to `0` is interpreted as disabling the limit.\nche.workspace.default_memory_request_mb=200\n\n# CPU limit for each container that has no CPU settings in its environment.\n# Specify it either in floating point cores or in integer millicores, for example: `0.125` or `125m`.\n# Value less than or equal to `0` is interpreted as disabling the limit.\nche.workspace.default_cpu_limit_cores=-1\n\n# CPU request for each container that has no CPU settings in its environment.\n# A CPU request exceeding the CPU limit is ignored and only the limit number is used.\n# Value less than or equal to `0` is interpreted as disabling the limit.\nche.workspace.default_cpu_request_cores=-1\n\n# RAM limit for each sidecar that has no RAM settings in the {prod-short} plug-in configuration.\n# Value less than or equal to `0` is interpreted as disabling the limit.\nche.workspace.sidecar.default_memory_limit_mb=128\n\n# RAM request for each sidecar that has no RAM settings in the {prod-short} plug-in configuration.\nche.workspace.sidecar.default_memory_request_mb=64\n\n# CPU limit default for each sidecar that has no CPU settings in the {prod-short} plug-in configuration.\n# Specify it either in floating point cores or in integer millicores, for example: `0.125` or `125m`.\n# Value less than or equal to `0` is interpreted as disabling the limit.\nche.workspace.sidecar.default_cpu_limit_cores=-1\n\n# CPU request default for each sidecar that has no CPU settings in the {prod-short} plug-in configuration.\n# Specify it either in floating point cores or in integer millicores, for example: `0.125` or `125m`.\nche.workspace.sidecar.default_cpu_request_cores=-1\n\n# Delay before the first execution of a temporary workspaces cleanup job.\nche.workspace.cleanup_temporary_initial_delay_min=5\n\n# Delay between the termination of one execution and the commencement\n# of the next execution of temporary workspaces cleanup job.\nche.workspace.cleanup_temporary_period_min=180\n\n# List of names of the servers that require liveness probes.\nche.workspace.server.liveness_probes=wsagent/http,exec-agent/http,terminal,theia,jupyter,dirigible,cloud-shell,intellij\n\n# Limits the size of logs collected from a single container that can be observed by {prod-short} server when\n# debugging workspace startup.\n# The default is: 10MB=10485760.\nche.workspace.startup_debug_log_limit_bytes=10485760\n\n# Specifies whether {prod-short} is deployed with DevWorkspaces enabled.\n# This property is set by the {prod-short} Operator if it also installed the support for DevWorkspaces.\n# This property is used to advertise this fact to the {prod-short} dashboard.\n# It doesn't make sense to change the value of this property manually.\nche.devworkspaces.enabled=true\n\n### Authentication parameters\n\n# {prod-short} has a single identity implementation, so this does not change the user experience.\n# If set to `true`, enables user creation at the API level.\nche.auth.user_self_creation=false\n\n# Authentication error page address.\nche.auth.access_denied_error_page=/error-oauth\n\n# Reserved user names.\nche.auth.reserved_user_names=\n\n# Configuration of the Azure DevOps Service OAuth2 client. Used to obtain personal access tokens.\n# Location of the file with Microsoft OIDC Directory (tenant) ID.\nche.oauth2.azure.devops.tenantid_filepath=NULL\n\n# Location of the file with Microsoft OIDC Application (client) ID.\nche.oauth2.azure.devops.clientid_filepath=NULL\n\n# Location of the file with Microsoft OIDC Application (client) secret.\nche.oauth2.azure.devops.clientsecret_filepath=NULL\n\n# Azure DevOps Service OAuth2 scopes.\n# Separate multiple values with comma, for example: scope,scope,scope\n# The full list of scopes: https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops#scopes\n# Entra ID v2.0 requires Azure DevOps App ID URI in the scope, which is 499b84ac-1321-427f-aa17-267ca6975798\n# see https://learn.microsoft.com/en-us/answers/questions/5807316/invalid-scope-error-on-oidc-token-request\nche.integration.azure.devops.application_scopes=499b84ac-1321-427f-aa17-267ca6975798/vso.code_write\n\n# Azure DevOps Service OAuth2 authorization URI template. Tenant-id must be injected.\nche.oauth.azure.devops.authuri.template=https://login.microsoftonline.com/%s/oauth2/v2.0/authorize\n\n# Azure DevOps OAuth Service token URI template. Tenant-id must be injected.\nche.oauth.azure.devops.tokenuri.template=https://login.microsoftonline.com/%s/oauth2/v2.0/token\n\n# Azure DevOps Service API server address.\nche.integration.azure.devops.api_endpoint=https://vssps.dev.azure.com\n\n# Azure DevOps SCM API server address.\nche.integration.azure.devops.scm.api_endpoint=https://dev.azure.com\n\n# Azure DevOps Service redirect URIs.\n# Separate multiple values with comma, for example: URI,URI,URI.\nche.oauth.azure.devops.redirecturis=https://${CHE_HOST}/api/oauth/callback\n\n# Configuration of the GitHub OAuth2 client. Used to obtain personal access tokens.\n# Location of the file with GitHub client id.\nche.oauth2.github.clientid_filepath=NULL\n\n# Configuration of the GitHub OAuth2 client. Used to obtain personal access tokens.\n# Location of the file with GitHub client id (The second GitHub instance).\nche.oauth2.github.clientid_filepath_2=NULL\n\n# Location of the file with GitHub client secret.\nche.oauth2.github.clientsecret_filepath=NULL\n\n# Location of the file with GitHub client secret (The second GitHub instance).\nche.oauth2.github.clientsecret_filepath_2=NULL\n\n# GitHub OAuth authorization URI.\nche.oauth.github.authuri= https://github.com/login/oauth/authorize\n\n# GitHub OAuth authorization URI (The second GitHub instance).\nche.oauth.github.authuri_2= https://github.com/login/oauth/authorize\n\n# GitHub OAuth token URI.\nche.oauth.github.tokenuri= https://github.com/login/oauth/access_token\n\n# GitHub OAuth token URI (The second GitHub instance).\nche.oauth.github.tokenuri_2= https://github.com/login/oauth/access_token\n\n# GitHub server address.\n# Prerequisite: OAuth 2 integration is configured on the GitHub server.\nche.integration.github.oauth_endpoint=NULL\n\n# GitHub server address.\n# Prerequisite: OAuth 2 integration is configured on the GitHub server (The second GitHub instance).\nche.integration.github.oauth_endpoint_2=NULL\n\n# GitHub server disable subdomain isolation flag.\nche.integration.github.disable_subdomain_isolation=false\n\n# GitHub server disable subdomain isolation flag (The second GitHub instance).\nche.integration.github.disable_subdomain_isolation_2=false\n\n# GitHub OAuth redirect URIs.\n# Separate multiple values with comma, for example: URI,URI,URI.\nche.oauth.github.redirecturis= http://localhost:${CHE_PORT}/api/oauth/callback\n\n# Configuration of OpenShift OAuth client. Used to obtain OpenShift OAuth token.\n# OpenShift OAuth client ID.\nche.oauth.openshift.clientid=NULL\n# OpenShift OAuth client secret.\nche.oauth.openshift.clientsecret=NULL\n# OpenShift OAuth endpoint.\nche.oauth.openshift.oauth_endpoint= NULL\n# OpenShift OAuth verification token URL.\nche.oauth.openshift.verify_token_url= NULL\n\n# Configuration of Bitbucket Server OAuth1 client. Used to obtain personal access tokens.\n# Location of the file with Bitbucket Server application consumer key (equivalent to a username).\nche.oauth1.bitbucket.consumerkeypath=NULL\n# Location of the file with Bitbucket Server application private key.\nche.oauth1.bitbucket.privatekeypath=NULL\n# Bitbucket Server URL. To work correctly with factories, the same URL\n# has to be part of `che.integration.bitbucket.server_endpoints` too.\nche.oauth.bitbucket.endpoint=https://bitbucket.org\n\n# Configuration of Bitbucket OAuth2 client. Used to obtain Personal access tokens.\n# Location of the file with Bitbucket client id.\nche.oauth2.bitbucket.clientid_filepath=NULL\n\n# Location of the file with Bitbucket client secret.\nche.oauth2.bitbucket.clientsecret_filepath=NULL\n\n# Bitbucket OAuth authorization URI.\nche.oauth.bitbucket.authuri= https://bitbucket.org/site/oauth2/authorize\n\n# Bitbucket OAuth token URI.\nche.oauth.bitbucket.tokenuri= https://bitbucket.org/site/oauth2/access_token\n\n# Bitbucket OAuth redirect URIs.\n# Separate multiple values with comma, for example: URI,URI,URI\nche.oauth.bitbucket.redirecturis= https://${CHE_HOST}/api/oauth/callback\n\n### Internal\n\n# {prod-short} extensions can be scheduled executions on a time basis.\n# This value configures the size of the thread pool allocated to extensions that are launched on\n# a recurring schedule.\nschedule.core_pool_size=10\n\n# Database initialization and migration configuration.\n# If set to `true`, the database initialization component on {prod-short} Server side ignores scripts up to the version configured by `baseline.version`.\ndb.schema.flyway.baseline.enabled=true\n\n# Scripts with a version up to the specified one are ignored.\n# Note that scripts with a version equal to the baseline version are also ignored.\ndb.schema.flyway.baseline.version=5.0.0.8.1\n\n# Prefix of migration scripts.\ndb.schema.flyway.scripts.prefix=\n\n# Suffix of migration scripts.\ndb.schema.flyway.scripts.suffix=.sql\n\n# Separator of `version` from the other parts of script name.\ndb.schema.flyway.scripts.version_separator=__\n\n# Locations where to search for migration scripts.\ndb.schema.flyway.scripts.locations=classpath:che-schema\n\n### Kubernetes infrastructure parameters\n\n# Configuration of Kubernetes Client master URL that the infrastructure uses.\nche.infra.kubernetes.master_url=\n\n# Boolean to configure Kubernetes Client to use trusted certificates.\nche.infra.kubernetes.trust_certs=true\n\n# Kubernetes cluster domain. If not set, svc names doesn't contain information about the cluster domain.\nche.infra.kubernetes.cluster_domain=NULL\n\n# Defines how servers are exposed to the world in Kubernetes infra.\n# Options include: `default-host`, `multi-host`, `single-host`.\nche.infra.kubernetes.server_strategy=single-host\n\n# Defines the way in which the workspace plug-ins and editors are exposed in the single-host mode.\n# Supported exposures:\n# `native`:: Exposes servers using Kubernetes Ingresses. Works only on Kubernetes.\n# `gateway`:: Exposes servers using reverse-proxy gateway.\nche.infra.kubernetes.singlehost.workspace.exposure=gateway\n\n# Defines the way to expose devfile endpoints as end-user's applications, in single-host server strategy.\n# They can either follow the single-host strategy and be exposed on subpaths, or they can be exposed on subdomains.\n# Supported exposures:\n# `multi-host`:: Exposes devfile endpoints on subdomains.\n# `single-host`:: Exposes devfile endpoints on subpaths.\nche.infra.kubernetes.singlehost.workspace.devfile_endpoint_exposure=multi-host\n\n# Defines labels which are set to ConfigMaps configuring single-host gateway.\nche.infra.kubernetes.singlehost.gateway.configmap_labels=app=che,component=che-gateway-config\n\n# Generates a domain for a server in a workspace in case the property `che.infra.kubernetes.server_strategy` is set to `multi-host`\nche.infra.kubernetes.ingress.domain=\n\n# Indicates whether {prod-short} server is allowed to create {orch-namespace} for user\n# workspaces, or they're intended to be created manually by cluster administrator.\n# This property is also used by OpenShift infrastructure.\nche.infra.kubernetes.namespace.creation_allowed=true\n\n# Defines Kubernetes default namespace in which user's workspaces are created\n# if user does not override it.\n# Use placeholder variables like `<username>` and `<userid>`. For example: `che-workspace-<username>`.\n# This ensures that a new namespace is created for each user, so that their workspaces do not collide with other users.\n# Used by OpenShift infrastructure to specify a Project.\n# The `<username>` or `<userid>` placeholder is mandatory.\nche.infra.kubernetes.namespace.default=<username>-che\n\n# Defines whether {prod-short} server should try to label the workspace namespaces.\n# NOTE: It's strongly recommended you keep the value of this property set to `true`. If set to `false`, the new workspace namespaces will not be labeled\n# automatically, and therefore not recognized by the {prod-operator-image-name} causing some features of DevWorkspaces to not work.\n# If set to `false`, an administrator is required to label the namespaces manually using the labels specified in `che.infra.kubernetes.namespace.labels`.\n# If you want to manage the namespaces yourself, make sure to follow this guide:\n# https://www.eclipse.org/che/docs/stable/administration-guide/provisioning-namespaces-in-advance/.\n# Any additional labels present on the namespace are kept in place and do not affect the functionality.\n# Also note that the the administrator is free to pre-create and label the namespaces manually even if this property is\n# `true`. No updates to the namespaces are done if they already conform to the labeling requirements.\nche.infra.kubernetes.namespace.label=true\n\n# Defines whether {prod-short} server should try to annotate the workspace namespaces.\nche.infra.kubernetes.namespace.annotate=true\n\n# List of labels to find {orch-namespace} that are used for {prod-short} Workspaces.\n# They are used to:\n#  - Find prepared {orch-namespace} for users in combination with `che.infra.kubernetes.namespace.annotations`.\n#  - Actively label {orch-namespace} with any workspace.\n# NOTE: It's strongly recommended not to change the value of this property because the {prod-operator-image-name} relies on these labels \n# and their precise values when reconciling DevWorkspaces. If this configuration is changed, the namespaces will not be automatically\n# recognized by the {prod-operator-image-name} as workspace namespaces unless manually labeled as such using the default labels and values.\n# Additional labels on the namespace do not affect the functionality.\nche.infra.kubernetes.namespace.labels=app.kubernetes.io/part-of=che.eclipse.org,app.kubernetes.io/component=workspaces-namespace\n\n# List of annotations to find {orch-namespace} prepared for {prod-short} user workspaces.\n# Only {orch-namespace} matching the `che.infra.kubernetes.namespace.labels` is matched against these annotations.\n# {orch-namespace} that matches both `che.infra.kubernetes.namespace.labels` and `che.infra.kubernetes.namespace.annotations`\n# is used preferentially for user workspaces.\n# It's possible to use `<username>` placeholder to specify the {orch-namespace} to concrete user.\n# They are used to:\n#  - Find prepared {orch-namespace} for users in combination with `che.infra.kubernetes.namespace.labels`.\n#  - Actively annotate {orch-namespace} with any workspace.\nche.infra.kubernetes.namespace.annotations=che.eclipse.org/username=<username>\n\n# Defines Kubernetes Service Account name which should be specified to be bound to all workspace pods.\n# The {prod-short} Operator that Kubernetes infrastructure will not create the service account and it should exist.\n# OpenShift infrastructure checks if project exists and `che.infra.openshift.project` isn't empty:\n#  - If not 'NULL', then service account must exist there.\n#  - If it's 'NULL' or an empty string, then infrastructure creates new OpenShift project per workspace\n#    and prepare workspace service account with needed roles there.\nche.infra.kubernetes.service_account_name=NULL\n\n# Specifies optional additional cluster roles to use with the workspace service account.\n# The {prod-short} Operator that the cluster role names must already exist and the {prod-short} service account needs to be able to create a Role Binding\n# to associate these cluster roles with the workspace service account. The names are comma separated.\n# This property deprecates `che.infra.kubernetes.cluster_role_name`.\nche.infra.kubernetes.workspace_sa_cluster_roles=NULL\n\n# Cluster roles to assign to user in their namespace.\nche.infra.kubernetes.user_cluster_roles=NULL\n\n# Defines the timeout (in minutes) that limits the period for which {orch-ingress} becomes ready.\nche.infra.kubernetes.ingress_start_timeout_min=5\n\n# If an unrecoverable event defined in the property occurs during workspace startup,\n# this parameter stops the workspace immediately rather than waiting until timeout.\n# Do not include a simple \"Failed\" string, as that might catch more events than than intended.\n# A failed container startup is handled explicitly by {prod-short} server.\nche.infra.kubernetes.workspace_unrecoverable_events=FailedMount,FailedScheduling,MountVolume.SetUp failed,Failed to pull image,FailedCreate,ReplicaSetCreateError\n\n# Defines annotations for ingresses which are used for servers exposing. Value depends on the kind of ingress\n# controller.\n# OpenShift infrastructure ignores this property because it uses Routes rather than Ingresses.\n# the {prod-short} Operator that for a single-host deployment strategy to work, a controller supporting URL rewriting has to be\n# used so that URLs can point to different servers while the servers do not need to support changing the app root.\n# The `che.infra.kubernetes.ingress.path.rewrite_transform` property defines how the path of the Ingress should be\n# transformed to support the URL rewriting. \n# This property defines the set of annotations on the Ingress itself\n# that instruct the chosen Ingress Controller to actually do the URL rewriting, potentially building on the path\n# transformation (if required by the chosen ingress controller).\n# For example, for Nginx Ingress Controller 0.22.0 and later, the following value is recommended:\n# `{\"ingress.kubernetes.io/rewrite-target\": \"/$1\",\"ingress.kubernetes.io/ssl-redirect\": \"false\",\\\n#     \"ingress.kubernetes.io/proxy-connect-timeout\": \"3600\",\"ingress.kubernetes.io/proxy-read-timeout\": \"3600\",\n#     \"nginx.org/websocket-services\": \"<service-name>\"}`\n# and the `che.infra.kubernetes.ingress.path.rewrite_transform` should be set to `\"%s(.*)\"`.\n# For Nginx Ingress Controller older than 0.22.0, the rewrite-target should be set to `/` and the path transformed\n# to `%s` (see the `che.infra.kubernetes.ingress.path.rewrite_transform` property).\n# See the Nginx Ingress Controller documentation for the explanation on how the Ingress Controller uses\n# the regular expression available in the Ingress path and how it achieves the rewriting of URL.\nche.infra.kubernetes.ingress.annotations_json=NULL\n\n# Defines a recipe on how to declare the path of the Ingress that should expose a server.\n# The `%s` represents the base public URL of the server and is guaranteed to end with a forward slash. This property\n# must be a valid input to the `String.format()` method and contain exactly one reference to `%s`.\n# See the description of the `che.infra.kubernetes.ingress.annotations_json` property to see how these two\n# properties interplay when specifying the Ingress annotations and path.\n# If not defined, this property defaults to `%s` (without the quotes) which means that the path is not transformed\n# for use with the Ingress Controller.\nche.infra.kubernetes.ingress.path_transform=NULL\n\n# Additional labels to add into every Ingress created by {prod-short} server\n# to allow clear identification.\nche.infra.kubernetes.ingress.labels=NULL\n\n# Defines security context for pods that is created by Kubernetes infrastructure.\n# This property is ignored by OpenShift infrastructure.\nche.infra.kubernetes.pod.security_context.run_as_user=NULL\n\n# Defines security context for pods that are created by Kubernetes infrastructure.\n# A special supplemental group that applies to all containers in a pod.\n# This property is ignored by OpenShift infrastructure.\nche.infra.kubernetes.pod.security_context.fs_group=NULL\n\n# Defines the grace termination period for pods that are created by {orch-name} infrastructures.\n# The default value is `0`. It allows to stop pods quickly and significantly decreases the time required for stopping a workspace.\n# In the case of the {prod-short} Operator, if `terminationGracePeriodSeconds` have been explicitly set in {orch-name} recipe, it isn't overridden.\nche.infra.kubernetes.pod.termination_grace_period_sec=0\n\n# Creates Ingresses with Transport Layer Security (TLS) enabled.\n# In OpenShift infrastructure, Routes are TLS-enabled.\nche.infra.kubernetes.tls_enabled=true\n\n# The name of a secret that should be used when creating workspace Ingresses with TLS.\n# This property is ignored by OpenShift infrastructure.\nche.infra.kubernetes.tls_secret=\n\n# Data for TLS Secret that should be used for workspace Ingresses.\n# The `cert` and `key` values should be encoded with Base64 algorithm.\n# These properties are ignored by OpenShift infrastructure.\nche.infra.kubernetes.tls_key=NULL\n\n# Certificate data for TLS secret that should be used for workspace Ingresses.\n# The certificate should be encoded with Base64 algorithm.\n# This property is ignored by OpenShift infrastructure.\nche.infra.kubernetes.tls_cert=NULL\n\n# Defines the period with which runtimes consistency checks are performed.\n# If the runtime has an inconsistent state, it's stopped automatically.\n# The value must be more than 0 or `-1`, where `-1` means that checks aren't performed at all.\n# It's disabled by default because there is a possible {prod-short} server configuration when {prod-short} server\n# doesn't have the ability to interact with Kubernetes API when operation is not invoked by the user.\n#\n# It works with the following configurations:\n# - Workspaces objects are created in the same namespace where {prod-short} server is located.\n# - The `cluster-admin` service account token is mounted to {prod-short} server pod.\n#\n# It doesn't work with the following configuration:\n# - {prod-short} server communicates with Kubernetes API using the token from OAuth provider.\nche.infra.kubernetes.runtimes_consistency_check_period_min=-1\n\n\n# Name of the ConfigMap in {prod-short} server namespace with additional CA TLS certificates to be propagated into all user workspaces.\n# If the property is set on OpenShift 4 infrastructure, and `che.infra.openshift.trusted_ca.dest_configmap_labels` includes the `config.openshift.io/inject-trusted-cabundle=true` label, then cluster CA bundle is propagated too.\nche.infra.kubernetes.trusted_ca.src_configmap=NULL\n\n# Name of the ConfigMap in a workspace namespace with additional CA TLS certificates.\n# Holds the copy of `che.infra.kubernetes.trusted_ca.src_configmap` but in a workspace namespace.\n# Content of this ConfigMap is mounted into all workspace containers including plug-in brokers.\n# Do not change the ConfigMap name unless it conflicts with an already existing ConfigMap.\n# The {prod-short} Operator that the resulting ConfigMap names can be adjusted eventually to make it unique in {orch-namespace}.\n# The original name is stored in `che.original_name` label.\nche.infra.kubernetes.trusted_ca.dest_configmap=ca-certs\n\n# Configures path on workspace containers where the CA bundle should be mounted.\n# Content of ConfigMap specified by `che.infra.kubernetes.trusted_ca.dest_configmap` is mounted.\nche.infra.kubernetes.trusted_ca.mount_path=/public-certs\n\n# Comma separated list of labels to add to the CA certificates ConfigMap in user workspace.\n# See the `che.infra.kubernetes.trusted_ca.dest_configmap` property.\nche.infra.kubernetes.trusted_ca.dest_configmap_labels=\n\n\n### OpenShift infrastructure parameters\n\n# Comma separated list of labels to add to the CA certificates ConfigMap in user workspace.\n# See `che.infra.kubernetes.trusted_ca.dest_configmap` property.\n# This default value is used for automatic cluster CA bundle injection in OpenShift 4.\nche.infra.openshift.trusted_ca.dest_configmap_labels=config.openshift.io/inject-trusted-cabundle=true\n\n# Additional labels to add into every Route created by {prod-short} server to allow clear identification.\nche.infra.openshift.route.labels=NULL\n\n# The hostname that should be used as a suffix for the workspace routes.\n# For example: Using `domain_suffix=__<{che-host}>__`, the route resembles: `routed3qrtk.__<{che-host}>__`.\n# It must be a valid DNS name.\nche.infra.openshift.route.host.domain_suffix=NULL\n\n# Initialize OpenShift project with {prod-short} server's service account\n# if OpenShift OAuth is enabled.\nche.infra.openshift.project.init_with_server_sa=true\n\n### Experimental properties\n\n# The following properties are subject to changes and removal, do not rely on them in a stable {prod-short} instance.\n\n# Docker image of {prod-short} plug-in broker app that resolves workspace tools configuration and copies plug-in dependencies to a workspace.\n# The {prod-short} Operator overrides these images by default. Changing the images here doesn't\n# have an effect if {prod-short} is installed using the Operator.\nche.workspace.plugin_broker.metadata.image=quay.io/eclipse/che-plugin-metadata-broker:v3.4.0\n\n# Docker image of Che plug-in artifacts broker.\n# This broker runs as an init container on the workspace pod. Its job is to take in a list of plug-in identifiers\n# (either references to a plug-in in the registry or a link to a plug-in `meta.yaml`) and ensure that the correct `.vsix`\n# and `.theia` extensions are downloaded into the `/plugins directory`, for each plug-in requested for the workspace.\nche.workspace.plugin_broker.artifacts.image=quay.io/eclipse/che-plugin-artifacts-broker:v3.4.0\n\n# Configures the default behavior of the plug-in brokers when provisioning plug-ins for a workspace.\n# If set to `true`, the plug-in brokers attempt to merge plug-ins when possible: they run in\n# the same sidecar image and do not have conflicting settings. This value is the default setting\n# used when the devfile doesn't specify the `mergePlugins` attribute.\nche.workspace.plugin_broker.default_merge_plugins=false\n\n# Docker image of {prod-short} plug-in broker app that resolves workspace tools configuration and copies\n# plug-in dependencies to a workspace.\nche.workspace.plugin_broker.pull_policy=Always\n\n# Defines the timeout in minutes that limits the max period of result waiting for plug-in broker.\nche.workspace.plugin_broker.wait_timeout_min=3\n\n# Workspace plug-in registry endpoint. Should be a valid HTTP URL.\n# Example: `++http://che-plugin-registry-eclipse-che.192.168.65.2.nip.io++`\n# In case the {prod-short} plug-in registry isn't needed, use the value 'NULL'.\nche.workspace.plugin_registry_url=NULL\n\n# Workspace plug-in registry internal endpoint. Should be a valid HTTP URL.\n# Example: `++http://devfile-registry.che.svc.cluster.local:8080++`\n# In case the {prod-short} plug-in registry isn't needed, use the value 'NULL'.\nche.workspace.plugin_registry_internal_url=NULL\n\n# Devfile registry endpoint. Should be a valid HTTP URL.\n# Example: `++http://che-devfile-registry-eclipse-che.192.168.65.2.nip.io++`\n# In case the {prod-short} plug-in registry isn't needed, use the value 'NULL'.\nche.workspace.devfile_registry_url=NULL\n\n# Devfile registry \"internal\" endpoint. Should be a valid HTTP URL.\n# Example: `++http://plugin-registry.che.svc.cluster.local:8080++`\n# In case the {prod-short} plug-in registry isn't needed, use the value 'NULL'.\nche.workspace.devfile_registry_internal_url=NULL\n\n# The configuration property that defines available values for storage types that clients such as the Dashboard should propose to users during workspace creation and update.\n# Following values are available:\n#   - `persistent`: Persistent Storage slow I/O but persistent.\n#   - `ephemeral`: Ephemeral Storage allows for faster I/O but may have limited storage\n#       and is not persistent.\n#   - `async`: Experimental feature: Asynchronous storage is a combination of Ephemeral\n#       and Persistent storage. Allows for faster I/O and keep your changes, backs up on stop\n#       and restores on start workspace.\n#       Works only with following values:\n#           - `che.infra.kubernetes.pvc.strategy='common'`\n#           - `che.limits.user.workspaces.run.count=1`\n#           - `che.infra.kubernetes.namespace.default` contains `<username>`,\n#      in other cases remove `async` from the list.\nche.workspace.storage.available_types=persistent,ephemeral,async\n\n# The configuration property that defines a default value for storage type that clients, such as the Dashboard, should propose to users during workspace creation and update.\n# The `async` value is an experimental feature not recommended as the default type.\nche.workspace.storage.preferred_type=persistent\n\n# Configures in which way secure servers are protected with authentication.\n# Suitable values:\n#   - `default`: `jwtproxy` is configured in a pass-through mode. Servers should authenticate requests themselves.\n#   - `jwtproxy`: `jwtproxy` authenticates requests. Servers only receive authenticated requests.\nche.server.secure_exposer=jwtproxy\n\n# `Jwtproxy` issuer string, token lifetime, and optional auth page path to route unsigned requests to.\nche.server.secure_exposer.jwtproxy.token.issuer=wsmaster\n\n# JWTProxy issuer token lifetime.\nche.server.secure_exposer.jwtproxy.token.ttl=8800h\n\n# Optional authentication page path to route unsigned requests to.\nche.server.secure_exposer.jwtproxy.auth.loader.path=/_app/loader.html\n\n# JWTProxy image.\nche.server.secure_exposer.jwtproxy.image=quay.io/eclipse/che-jwtproxy:0.10.0\n\n# JWTProxy memory request.\nche.server.secure_exposer.jwtproxy.memory_request=15mb\n\n# JWTProxy memory limit.\nche.server.secure_exposer.jwtproxy.memory_limit=128mb\n\n# JWTProxy CPU request.\nche.server.secure_exposer.jwtproxy.cpu_request=0.03\n\n# JWTProxy CPU limit.\nche.server.secure_exposer.jwtproxy.cpu_limit=0.5\n\n### Configuration of the major WebSocket endpoint\n\n# Maximum size of the JSON RPC processing pool.\n# If pool size is exceeded, the message execution is rejected.\nche.core.jsonrpc.processor_max_pool_size=50\n\n# Initial JSON processing pool. Minimum number of threads used to process major JSON RPC messages.\nche.core.jsonrpc.processor_core_pool_size=5\n\n# Configuration of the queue used to process JSON RPC messages.\nche.core.jsonrpc.processor_queue_capacity=100000\n\n\n# Port the HTTP server endpoint that would be exposed with Prometheus metrics.\nche.metrics.port=8087\n\n### CORS settings\n\n# Indicates which request origins are allowed.\n# CORS filter on WS Master is turned off by default.\n# Use the environment variable \"CHE_CORS_ENABLED=true\" to turn it on.\nche.cors.allowed_origins=*\n\n# Indicates if CORS allows processing of requests with credentials located in cookies, headers, and TLS client certificates.\nche.cors.allow_credentials=false\n\n### Factory defaults\n\n# Editor and plug-in used for factories that are created from a remote Git repository\n# which doesn't contain any {prod-short}-specific workspace descriptor.\n# Multiple plug-ins must be comma-separated, for example:\n# `pluginFooPublisher/pluginFooName/pluginFooVersion,pluginBarPublisher/pluginBarName/pluginBarVersion`\nche.factory.default_plugins=redhat/vscode-commons/latest\n\n# Devfile filenames to look on repository-based factories, for example GitHub.\n# Factory tries to locate those files in the order they're enumerated in the property.\nche.factory.default_devfile_filenames=devfile.yaml,.devfile.yaml\n\n### Devfile defaults\n# Editor used for factories that are created from a remote Git repository\n# which doesn't contain any {prod-short}-specific workspace descriptor.\nche.factory.default_editor=eclipse/che-theia/next\n\n# File size limit for the URL fetcher which fetches files from the SCM repository.\nche.factory.scm_file_fetcher_limit_bytes=102400\n\n# Additional files which may be present in the repository to complement devfile v2.\n# To retrieve them in a factory, they should be referenced as links to SCM resolver service.\nche.factory.devfile2_files_resolution_list=.che/che-editor.yaml,.che/che-theia-plugins.yaml,.vscode/extensions.json\n\n# Default editor that should be provisioned into Devfile if there is no specified editor.\n# The format is `editorPublisher/editorName/editorVersion` value.\n# A `NULL` or absence of value means that default editor should not be provisioned.\nche.workspace.devfile.default_editor=eclipse/che-theia/next\n\n# Default plug-ins which should be provisioned for the default editor.\n# All plug-ins from this list that aren't explicitly mentioned in the user-defined devfile\n# are provisioned but only when the default editor is used or if the user-defined editor is\n# the same as the default one (even if in different version).\n# The format is comma-separated `pluginPublisher/pluginName/pluginVersion` values, and URLs. \n# For example: `eclipse/che-theia-exec-plugin/0.0.1,eclipse/che-theia-terminal-plugin/0.0.1,https://cdn.pluginregistry.com/vi-mode/meta.yaml`\n# If the plug-in is a URL, the plug-in's `meta.yaml` is retrieved from that URL.\nche.workspace.devfile.default_editor.plugins=NULL\n\n# Defines comma-separated list of labels for selecting secrets from a user namespace\n# which are mounted into workspace containers as files or environment variables.\n# Only secrets that match ALL given labels are selected.\nche.workspace.provision.secret.labels=app.kubernetes.io/part-of=che.eclipse.org,app.kubernetes.io/component=workspace-secret\n\n# Plug-in is added in case the asynchronous storage feature is enabled in workspace configuration\n# and supported by the environment.\nche.workspace.devfile.async.storage.plugin=eclipse/che-async-pv-plugin/latest\n\n# Bitbucket endpoints used for factory integrations.\n# A comma separated list of Bitbucket server URLs or `NULL` if no integration is expected.\nche.integration.bitbucket.server_endpoints=NULL\n\n# GitLab endpoints used for factory integrations.\n\n# The address of the GitLab server with configured OAuth 2 integration.\nche.integration.gitlab.oauth_endpoint=NULL\n\n# The address of the GitLab server with configured OAuth 2 integration. (The second GitLab instance).\nche.integration.gitlab.oauth_endpoint_2=NULL\n\n# Configuration of GitLab OAuth2 client. Used to obtain personal access tokens.\n# Location of the file with GitLab client ID.\nche.oauth2.gitlab.clientid_filepath=NULL\n\n# Configuration of GitLab OAuth2 client. Used to obtain personal access tokens.\n# Location of the file with GitLab client ID. (The second GitLab instance).\nche.oauth2.gitlab.clientid_filepath_2=NULL\n\n# Location of the file with GitLab client secret.\nche.oauth2.gitlab.clientsecret_filepath=NULL\n\n# Location of the file with GitLab client secret. (The second GitLab instance).\nche.oauth2.gitlab.clientsecret_filepath_2=NULL\n\n### Advanced authorization\n# Separated list of users allowed to access Che. Delimiter is defined by the delimiter property.\nche.infra.kubernetes.advanced_authorization.allow_users=NULL\n\n# Separated list of groups of users allowed to access Che. Delimiter is defined by the delimiter property.\nche.infra.kubernetes.advanced_authorization.allow_groups=NULL\n\n# Separated list of users denied to access Che. Delimiter is defined by the delimiter property.\nche.infra.kubernetes.advanced_authorization.deny_users=NULL\n\n# Separated list of groups of users denied to access Che. Delimiter is defined by the delimiter property.\nche.infra.kubernetes.advanced_authorization.deny_groups=NULL\n\n# Delimiter used to split entries in advanced authorization lists (allow_users, allow_groups, deny_users, deny_groups).\nche.infra.kubernetes.advanced_authorization.delimiter=,\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/multiuser.properties",
    "content": "#\n# Copyright (c) 2012-2026 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n\n### Che system\n\n# System Super Privileged Mode.\n# Grants users with the `manageSystem` permission additional permissions for\n# `getByKey`, `getByNameSpace`, `stopWorkspaces`, and `getResourcesInformation`.\n# These are not given to admins by default. They allow\n# admins to gain visibility to any workspace along with naming themselves\n# with administrator privileges to those workspaces.\nche.system.super_privileged_mode=false\n\n# Grants system permission for `che.admin.name` user. If the user already exists, it will happen on\n# component startup. If not, it will happen during the first login when user is persisted in the database.\nche.system.admin_name=admin\n\n### Workspace limits\n\n# Workspaces are the fundamental runtime for users when doing development. You can set\n# parameters that limit how workspaces are created and the resources that are consumed.\n# Sets the maximum amount of RAM that a user can allocate to a workspace when they\n# create a new workspace. The RAM slider is adjusted to this maximum value.\nche.limits.workspace.env.ram=16gb\n\n# The length of time (in milliseconds) that a user is idle within their workspace, after which the system will\n# suspend the workspace, and then stop it. Idleness is the\n# length of time that the user has not interacted with the workspace, meaning that\n# one of the agents has not received interaction. Leaving a browser window open\n# counts toward idleness.\nche.limits.workspace.idle.timeout=1800000\n\n# The length of time (in milliseconds) that a workspace will run, regardless of activity, before\n# the system will suspend it. Set this property if you want to automatically stop\n# workspaces after a period of time. The default is `0`, meaning that there is no\n# run timeout.\nche.limits.workspace.run.timeout=0\n\n### Users workspace limits\n\n# The total amount of RAM that a single user is allowed to allocate to running\n# workspaces. A user can allocate this RAM to a single workspace or spread it\n# across multiple workspaces.\nche.limits.user.workspaces.ram=-1\n\n# The maximum number of workspaces that a user is allowed to create. The user will\n# be presented with an error message if they try to create additional workspaces.\n# This applies to the total number of both running and stopped workspaces.\nche.limits.user.workspaces.count=-1\n\n# The maximum number of running workspaces that a single user is allowed to have.\n# If the user has reached this threshold, and they try to start an additional\n# workspace, they will be presented with an error message. The user will need to\n# stop a running workspace to activate another.\nche.limits.user.workspaces.run.count=1\n\n### OIDC configuration\n\n# Url to OIDC identity provider server.\n# You can set it to `NULL` only if `che.oidc.oidcProvider` is used.\nche.oidc.auth_server_url=http://${CHE_HOST}:5050/auth\n\n# Internal network service URL to OIDC identity provider server.\nche.oidc.auth_internal_server_url=NULL\n\n# The number of seconds to tolerate for clock skew when verifying `exp` or `nbf` claims.\nche.oidc.allowed_clock_skew_sec=3\n\n# Username claim to be used as user display name when parsing JWT token.\n# If not defined, the fallback value is 'preferred_username' in Keycloak installations and\n# `name` in Dex installations.\nche.oidc.username_claim=NULL\n\n# Prefix to be prepended to username values extracted from the OIDC token.\n# If not defined, no prefix will be added.\nche.oidc.username_prefix=NULL\n\n# Claim to be used for extracting user group membership from the JWT token.\n# If not defined, group information will not be extracted from the token.\nche.oidc.groups_claim=NULL\n\n# Prefix to be prepended to group names extracted from the OIDC token.\n# If not defined, no prefix will be added.\nche.oidc.group_prefix=NULL\n\n# Email claim to be used when parsing JWT token.\n# If not defined, the fallback value is 'email'.\nche.oidc.email_claim=NULL\n\n# Base URL of an alternate OIDC provider that provides\n# a discovery endpoint as detailed in the following specification\n# link:https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig[Obtaining OpenID Provider Configuration Information].\n# If deprecated, use `che.oidc.auth_server_url` and `che.oidc.auth_internal_server_url` instead.\nche.oidc.oidc_provider=NULL\n\n### Keycloak configuration\n\n# Keycloak realm is used to authenticate users.\n# You can set it to `NULL` only if `che.keycloak.oidcProvider`\n# is used.\nche.keycloak.realm=che\n\n# Keycloak client identifier in `che.keycloak.realm` to authenticate users in the dashboard, the IDE, and the CLI.\nche.keycloak.client_id=che-public\n\n# URL to access OSO OAuth tokens.\nche.keycloak.oso.endpoint=NULL\n\n# URL to access Github OAuth tokens.\nche.keycloak.github.endpoint=NULL\n\n# Use the OIDC optional `nonce` feature to increase security.\nche.keycloak.use_nonce=true\n\n# URL to the Keycloak Javascript adapter to use.\n# If you set it to `NULL`, the default used value is\n# `${che.keycloak.auth_server_url}/js/keycloak.js`,\n# or `<che-server>/api/keycloak/OIDCKeycloak.js`\n# if an alternate `oidc_provider` is used.\nche.keycloak.js_adapter_url=NULL\n\n# Set it to `true` when using an alternate OIDC provider that\n# only supports fixed redirect URLs.\n# This property is ignored when `che.keycloak.oidc_provider` is set to`NULL`.\nche.keycloak.use_fixed_redirect_urls=false\n\n# Configuration of OAuth Authentication Service that can be used in `embedded` or `delegated` mode.\n# If you set it to `embedded`, the service works as a wrapper to Che's OAuthAuthenticator (as in Single User mode).\n# If you set it to `delegated`, the service will use Keycloak IdentityProvider mechanism.\n# Runtime Exception `wii` will be thrown, if this property isn't set properly.\nche.oauth.service_mode=delegated\n\n\n# User name adjustment configuration. Che needs to use the usernames as part of Kubernetes object names and labels.\n# Therefore there are stricter requirements on their format than the identity providers usually\n# allow (it needs them to be DNS-compliant). The adjustment is represented by comma-separated key-value pairs.\n# These are sequentially used as arguments to the `String.replaceAll` function on the original username.\n# The keys are regular expressions, values are replacement strings that replace the characters in the username\n# that match the regular expression. The modified username will only be stored in the Che database\n# and will not be advertised back to the identity provider.\n# It is recommended that you use DNS-compliant characters as replacement strings (values in the key-value pairs).\n# Example: `\\\\=-,@=-at-` changes `\\` to `-` and `@` to `-at-`\n# so the username `org\\user@com` becomes `org-user-at-com.`\nche.keycloak.username.replacement_patterns=NULL\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che_aliases.properties",
    "content": "#\n# Copyright (c) 2012-2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# File with a map new_property_name=old_property_name1,old_property_name2\n\nche.infra.kubernetes.master_url=che.infra.openshift.master_url\nche.infra.kubernetes.trust_certs=che.infra.openshift.trust_certs\nche.infra.kubernetes.bootstrapper.binary_url=che.infra.openshift.bootstrapper.binary_url\nche.infra.kubernetes.bootstrapper.installer_timeout_sec=che.infra.openshift.bootstrapper.installer_timeout_sec\nche.infra.kubernetes.bootstrapper.server_check_period_sec=che.infra.openshift.bootstrapper.server_check_period_sec\nche.infra.kubernetes.tls_enabled=che.infra.openshift.tls_enabled\nche.infra.kubernetes.workspace_sa_cluster_roles=che.infra.kubernetes.cluster_role_name\n\nche.infra.docker.daemon_url=docker.client.daemon_url\nche.infra.docker.certificates_folder=docker.client.certificates_folder\n\n# old name of property has been removed due to https://github.com/eclipse/che/issues/8951\nche.limits.workspace.idle.timeout=che.workspace.agent.dev.inactive_stop_timeout_ms\n\nche.workspace.default_memory_limit_mb=che.workspace.default_memory_mb\n\nche.infra.kubernetes.trusted_ca.src_configmap=che.trusted_ca_bundles_configmap\nche.infra.kubernetes.trusted_ca.dest_configmap=che.infra.openshift.trusted_ca_bundles_config_map\nche.infra.kubernetes.trusted_ca.mount_path=che.infra.openshift.trusted_ca_bundles_mount_path\nche.infra.openshift.trusted_ca.dest_configmap_labels=che.infra.openshift.trusted_ca_bundles_config_map_labels\nche.integration.bitbucket.server_endpoints=bitbucket.server.endpoints\n\nche.oidc.auth_server_url=che.keycloak.auth_server_url\nche.oidc.auth_internal_server_url=che.keycloak.auth_internal_server_url\nche.oidc.allowed_clock_skew_sec=che.keycloak.allowed_clock_skew_sec\nche.oidc.username_claim=che.keycloak.username_claim\nche.oidc.oidc_provider=che.keycloak.oidc_provider\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/jgroups/che-tcp.xml",
    "content": "<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<config xmlns=\"urn:org:jgroups\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"urn:org:jgroups http://www.jgroups.org/schema/JGroups-3.1.xsd\">\n  <TCP\n    bind_addr=\"match-interface:eth0\"\n    bind_port=\"${TCP_PORT:7800}\"\n    recv_buf_size=\"5M\"\n    send_buf_size=\"1M\"\n    max_bundle_size=\"64K\"\n    enable_diagnostics=\"true\"\n    log_discard_msgs=\"false\"\n    thread_naming_pattern=\"cl\"\n\n    thread_pool.min_threads=\"0\"\n    thread_pool.max_threads=\"500\"\n    thread_pool.keep_alive_time=\"30000\" />\n\n  <org.jgroups.protocols.kubernetes.KUBE_PING\n    port_range=\"3\"\n    namespace=\"${KUBERNETES_NAMESPACE:che}\"\n    labels=\"${KUBERNETES_LABELS:app=che,component=che}\"\n    useNotReadyAddresses=\"${KUBERNETES_USE_NOT_READY_ADDRESSES:false}\"\n  />\n\n  <MERGE3 min_interval=\"10000\"\n    max_interval=\"30000\"/>\n  <FD_SOCK/>\n  <FD timeout=\"3000\" max_tries=\"3\"/>\n  <VERIFY_SUSPECT timeout=\"1500\"/>\n  <BARRIER/>\n  <pbcast.NAKACK2 use_mcast_xmit=\"false\"\n    discard_delivered_msgs=\"true\"/>\n  <pbcast.STABLE stability_delay=\"1000\" desired_avg_gossip=\"50000\"\n    max_bytes=\"4M\"/>\n  <pbcast.GMS print_local_addr=\"true\" join_timeout=\"3000\" />\n  <MFC max_credits=\"2M\"\n    min_threshold=\"0.4\"/>\n  <FRAG2 frag_size=\"60K\"/>\n  <pbcast.STATE_TRANSFER/>\n  <CENTRAL_LOCK />\n</config>\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/keycloak/OIDCKeycloak.js",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\n/*\n * This is a modified version of the Keycloak Javascript Adapter whose \n * original sources can be found there: \n * https://github.com/keycloak/keycloak/blob/master/adapters/oidc/js/src/main/resources/keycloak.js\n * \n * Modifications allow using the Keycloak Javascript Adapter library with alternate OIDC-compliant providers,\n * provided that they produce access tokens as JWT tokens with `iat` and `exp` claims.\n */\n\n(function( window, undefined ) {\n\n    var Keycloak = function (config) {\n        if (!(this instanceof Keycloak)) {\n            return new Keycloak(config);\n        }\n\n        var kc = this;\n        var adapter;\n        var refreshQueue = [];\n        var callbackStorage;\n\n        var loginIframe = {\n            enable: true,\n            callbackList: [],\n            interval: 5\n        };\n\n        var scripts = document.getElementsByTagName('script');\n        for (var i = 0; i < scripts.length; i++) {\n            if ((scripts[i].src.indexOf('keycloak.js') !== -1 || scripts[i].src.indexOf('keycloak.min.js') !== -1) && scripts[i].src.indexOf('version=') !== -1) {\n                kc.iframeVersion = scripts[i].src.substring(scripts[i].src.indexOf('version=') + 8).split('&')[0];\n            }\n        }\n\n        var useNonce = true;\n        \n        kc.init = function (initOptions) {\n            kc.authenticated = false;\n\n            callbackStorage = createCallbackStorage();\n            var adapters = ['default', 'cordova', 'cordova-native'];\n\n            if (initOptions && adapters.indexOf(initOptions.adapter) > -1) {\n                adapter = loadAdapter(initOptions.adapter);\n            } else if (initOptions && typeof initOptions.adapter === \"object\") {\n                adapter = initOptions.adapter;\n            } else {\n                if (window.Cordova || window.cordova) {\n                    adapter = loadAdapter('cordova');\n                } else {\n                    adapter = loadAdapter();\n                }\n            }\n\n            if (initOptions) {\n                if (typeof initOptions.useNonce !== 'undefined') {\n                    useNonce = initOptions.useNonce;\n                }\n\n                if (typeof initOptions.checkLoginIframe !== 'undefined') {\n                    loginIframe.enable = initOptions.checkLoginIframe;\n                }\n\n                if (initOptions.checkLoginIframeInterval) {\n                    loginIframe.interval = initOptions.checkLoginIframeInterval;\n                }\n\n                if (initOptions.onLoad === 'login-required') {\n                    kc.loginRequired = true;\n                }\n\n                if (initOptions.responseMode) {\n                    if (initOptions.responseMode === 'query' || initOptions.responseMode === 'fragment') {\n                        kc.responseMode = initOptions.responseMode;\n                    } else {\n                        throw 'Invalid value for responseMode';\n                    }\n                }\n\n                if (initOptions.flow) {\n                    switch (initOptions.flow) {\n                        case 'standard':\n                            kc.responseType = 'code';\n                            break;\n                        case 'implicit':\n                            kc.responseType = 'id_token token';\n                            break;\n                        case 'hybrid':\n                            kc.responseType = 'code id_token token';\n                            break;\n                        default:\n                            throw 'Invalid value for flow';\n                    }\n                    kc.flow = initOptions.flow;\n                }\n\n                if (initOptions.timeSkew != null) {\n                    kc.timeSkew = initOptions.timeSkew;\n                }\n\n                if(initOptions.redirectUri) {\n                    kc.redirectUri = initOptions.redirectUri;\n                }\n                \n                if(initOptions.scope) {\n                    kc.scope = initOptions.scope;\n                }\n            }\n\n            if (!kc.responseMode) {\n                kc.responseMode = 'fragment';\n            }\n            if (!kc.responseType) {\n                kc.responseType = 'code';\n                kc.flow = 'standard';\n            }\n\n            var promise = createPromise();\n\n            var initPromise = createPromise();\n            initPromise.promise.success(function() {\n                kc.onReady && kc.onReady(kc.authenticated);\n                promise.setSuccess(kc.authenticated);\n            }).error(function(errorData) {\n                promise.setError(errorData);\n            });\n\n            var configPromise = loadConfig(config);\n\n            function onLoad() {\n                var doLogin = function(prompt) {\n                    if (!prompt) {\n                        options.prompt = 'none';\n                    }\n                    kc.login(options).success(function () {\n                        initPromise.setSuccess();\n                    }).error(function (errorData) {\n                        initPromise.setError(errorData);\n                    });\n                }\n\n                var options = {};\n                switch (initOptions.onLoad) {\n                    case 'check-sso':\n                        if (loginIframe.enable) {\n                            setupCheckLoginIframe().success(function() {\n                                checkLoginIframe().success(function () {\n                                    doLogin(false);\n                                }).error(function () {\n                                    initPromise.setSuccess();\n                                });\n                            });\n                        } else {\n                            doLogin(false);\n                        }\n                        break;\n                    case 'login-required':\n                        doLogin(true);\n                        break;\n                    default:\n                        throw 'Invalid value for onLoad';\n                }\n            }\n\n            function processInit() {\n                var callback = parseCallback(window.location.href);\n\n                if (callback) {\n                    window.history.replaceState({}, null, callback.newUrl);\n                }\n\n                if (callback && callback.valid) {\n                    return setupCheckLoginIframe().success(function() {\n                        processCallback(callback, initPromise);\n                    }).error(function (e) {\n                        initPromise.setError();\n                    });\n                } else if (initOptions) {\n                    if (initOptions.token && initOptions.refreshToken) {\n                        setToken(initOptions.token, initOptions.refreshToken, initOptions.idToken);\n\n                        if (loginIframe.enable) {\n                            setupCheckLoginIframe().success(function() {\n                                checkLoginIframe().success(function () {\n                                    kc.onAuthSuccess && kc.onAuthSuccess();\n                                    initPromise.setSuccess();\n                                }).error(function () {\n                                    setToken(null, null, null);\n                                    initPromise.setSuccess();\n                                });\n                            });\n                        } else {\n                            kc.updateToken(-1).success(function() {\n                                kc.onAuthSuccess && kc.onAuthSuccess();\n                                initPromise.setSuccess();\n                            }).error(function() {\n                                kc.onAuthError && kc.onAuthError();\n                                if (initOptions.onLoad) {\n                                    onLoad();\n                                } else {\n                                    initPromise.setError();\n                                }\n                            });\n                        }\n                    } else if (initOptions.onLoad) {\n                        onLoad();\n                    } else {\n                        initPromise.setSuccess();\n                    }\n                } else {\n                    initPromise.setSuccess();\n                }\n            }\n\n            configPromise.success(processInit);\n            configPromise.error(function() {\n                promise.setError();\n            });\n\n            return promise.promise;\n        }\n\n        kc.login = function (options) {\n            return adapter.login(options);\n        }\n\n        kc.createLoginUrl = function(options) {\n            var state = createUUID();\n            var nonce = createUUID();\n\n            var redirectUri = adapter.redirectUri(options);\n\n            var callbackState = {\n                state: state,\n                nonce: nonce,\n                redirectUri: encodeURIComponent(redirectUri)\n            }\n\n            if (options && options.prompt) {\n                callbackState.prompt = options.prompt;\n            }\n\n            callbackStorage.add(callbackState);\n\n            var baseUrl;\n            if (options && options.action == 'register') {\n                baseUrl = kc.endpoints.register();\n            } else {\n                baseUrl = kc.endpoints.authorize();\n            }\n\n            var providedScope;\n            if (options && options.scope) {\n                providedScope = options.scope;\n            } else if (kc.scope) {\n                providedScope = kc.scope;\n            }\n            var scope;\n            if (providedScope) {\n                if (providedScope.indexOf(\"openid\") != -1) {\n                    scope = providedScope;\n                } else {\n                    scope = \"openid \" + providedScope;\n                }\n            } else {\n                scope = \"openid\";\n            }\n\n            var url = baseUrl\n                + '?client_id=' + encodeURIComponent(kc.clientId)\n                + '&redirect_uri=' + encodeURIComponent(redirectUri)\n                + '&state=' + encodeURIComponent(state)\n                + '&response_mode=' + encodeURIComponent(kc.responseMode)\n                + '&response_type=' + encodeURIComponent(kc.responseType)\n                + '&scope=' + encodeURIComponent(scope);\n                if (useNonce) {\n                    url = url + '&nonce=' + encodeURIComponent(nonce);\n                }\n\n            if (options && options.prompt) {\n                url += '&prompt=' + encodeURIComponent(options.prompt);\n            }\n\n            if (options && options.maxAge) {\n                url += '&max_age=' + encodeURIComponent(options.maxAge);\n            }\n\n            if (options && options.loginHint) {\n                url += '&login_hint=' + encodeURIComponent(options.loginHint);\n            }\n\n            if (options && options.idpHint) {\n                url += '&kc_idp_hint=' + encodeURIComponent(options.idpHint);\n            }\n\n            if (options && options.locale) {\n                url += '&ui_locales=' + encodeURIComponent(options.locale);\n            }\n            \n            if (options && options.kcLocale) {\n                url += '&kc_locale=' + encodeURIComponent(options.kcLocale);\n            }\n\n            return url;\n        }\n\n        kc.logout = function(options) {\n            return adapter.logout(options);\n        }\n\n        kc.createLogoutUrl = function(options) {\n            var url = kc.endpoints.logout()\n                + '?redirect_uri=' + encodeURIComponent(adapter.redirectUri(options, false));\n\n            return url;\n        }\n\n        kc.register = function (options) {\n            return adapter.register(options);\n        }\n\n        kc.createRegisterUrl = function(options) {\n            if (!options) {\n                options = {};\n            }\n            options.action = 'register';\n            return kc.createLoginUrl(options);\n        }\n\n        kc.createAccountUrl = function(options) {\n            var realm = getRealmUrl();\n            var url = undefined;\n            if (typeof realm !== 'undefined') {\n                url = realm\n                + '/account'\n                + '?referrer=' + encodeURIComponent(kc.clientId)\n                + '&referrer_uri=' + encodeURIComponent(adapter.redirectUri(options));\n            }\n            return url;\n        }\n\n        kc.accountManagement = function() {\n            return adapter.accountManagement();\n        }\n\n        kc.hasRealmRole = function (role) {\n            var access = kc.realmAccess;\n            return !!access && access.roles.indexOf(role) >= 0;\n        }\n\n        kc.hasResourceRole = function(role, resource) {\n            if (!kc.resourceAccess) {\n                return false;\n            }\n\n            var access = kc.resourceAccess[resource || kc.clientId];\n            return !!access && access.roles.indexOf(role) >= 0;\n        }\n\n        kc.loadUserProfile = function() {\n            var url = getRealmUrl() + '/account';\n            var req = new XMLHttpRequest();\n            req.open('GET', url, true);\n            req.setRequestHeader('Accept', 'application/json');\n            req.setRequestHeader('Authorization', 'bearer ' + kc.token);\n\n            var promise = createPromise();\n\n            req.onreadystatechange = function () {\n                if (req.readyState == 4) {\n                    if (req.status == 200) {\n                        kc.profile = JSON.parse(req.responseText);\n                        promise.setSuccess(kc.profile);\n                    } else {\n                        promise.setError();\n                    }\n                }\n            }\n\n            req.send();\n\n            return promise.promise;\n        }\n\n        kc.loadUserInfo = function() {\n            var url = kc.endpoints.userinfo();\n            var req = new XMLHttpRequest();\n            req.open('GET', url, true);\n            req.setRequestHeader('Accept', 'application/json');\n            req.setRequestHeader('Authorization', 'bearer ' + kc.token);\n\n            var promise = createPromise();\n\n            req.onreadystatechange = function () {\n                if (req.readyState == 4) {\n                    if (req.status == 200) {\n                        kc.userInfo = JSON.parse(req.responseText);\n                        promise.setSuccess(kc.userInfo);\n                    } else {\n                        promise.setError();\n                    }\n                }\n            }\n\n            req.send();\n\n            return promise.promise;\n        }\n\n        kc.isTokenExpired = function(minValidity) {\n            if (!kc.tokenParsed || (!kc.refreshToken && kc.flow != 'implicit' )) {\n                throw 'Not authenticated';\n            }\n\n            if (kc.timeSkew == null) {\n                console.info('[KEYCLOAK] Unable to determine if token is expired as timeskew is not set');\n                return true;\n            }\n\n            var expiresIn = kc.tokenParsed['exp'] - Math.ceil(new Date().getTime() / 1000) + kc.timeSkew;\n            if (minValidity) {\n                expiresIn -= minValidity;\n            }\n            return expiresIn < 0;\n        }\n\n        kc.updateToken = function(minValidity) {\n            var promise = createPromise();\n\n            if (!kc.refreshToken) {\n                promise.setError();\n                return promise.promise;\n            }\n\n            minValidity = minValidity || 5;\n\n            var exec = function() {\n                var refreshToken = false;\n                if (minValidity == -1) {\n                    refreshToken = true;\n                    console.info('[KEYCLOAK] Refreshing token: forced refresh');\n                } else if (!kc.tokenParsed || kc.isTokenExpired(minValidity)) {\n                    refreshToken = true;\n                    console.info('[KEYCLOAK] Refreshing token: token expired');\n                }\n\n                if (!refreshToken) {\n                    promise.setSuccess(false);\n                } else {\n                    var params = 'grant_type=refresh_token&' + 'refresh_token=' + kc.refreshToken;\n                    var url = kc.endpoints.token();\n\n                    refreshQueue.push(promise);\n\n                    if (refreshQueue.length == 1) {\n                        var req = new XMLHttpRequest();\n                        req.open('POST', url, true);\n                        req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n                        req.withCredentials = true;\n\n                        if (kc.clientId && kc.clientSecret) {\n                            req.setRequestHeader('Authorization', 'Basic ' + btoa(kc.clientId + ':' + kc.clientSecret));\n                        } else {\n                            params += '&client_id=' + encodeURIComponent(kc.clientId);\n                        }\n\n                        var timeLocal = new Date().getTime();\n\n                        req.onreadystatechange = function () {\n                            if (req.readyState == 4) {\n                                if (req.status == 200) {\n                                    console.info('[KEYCLOAK] Token refreshed');\n\n                                    timeLocal = (timeLocal + new Date().getTime()) / 2;\n\n                                    var tokenResponse = JSON.parse(req.responseText);\n\n                                    setToken(tokenResponse['access_token'], tokenResponse['refresh_token'], tokenResponse['id_token'], timeLocal);\n\n                                    kc.onAuthRefreshSuccess && kc.onAuthRefreshSuccess();\n                                    for (var p = refreshQueue.pop(); p != null; p = refreshQueue.pop()) {\n                                        p.setSuccess(true);\n                                    }\n                                } else {\n                                    console.warn('[KEYCLOAK] Failed to refresh token');\n\n                                    if (req.status == 400) {\n                                        kc.clearToken();\n                                    }\n\n                                    kc.onAuthRefreshError && kc.onAuthRefreshError();\n                                    for (var p = refreshQueue.pop(); p != null; p = refreshQueue.pop()) {\n                                        p.setError(true);\n                                    }\n                                }\n                            }\n                        };\n\n                        req.send(params);\n                    }\n                }\n            }\n\n            if (loginIframe.enable) {\n                var iframePromise = checkLoginIframe();\n                iframePromise.success(function() {\n                    exec();\n                }).error(function() {\n                    promise.setError();\n                });\n            } else {\n                exec();\n            }\n\n            return promise.promise;\n        }\n\n        kc.clearToken = function() {\n            if (kc.token) {\n                setToken(null, null, null);\n                kc.onAuthLogout && kc.onAuthLogout();\n                if (kc.loginRequired) {\n                    kc.login();\n                }\n            }\n        }\n\n        function getRealmUrl() {\n            if (typeof kc.authServerUrl !== 'undefined') {\n                if (kc.authServerUrl.charAt(kc.authServerUrl.length - 1) == '/') {\n                    return kc.authServerUrl + 'realms/' + encodeURIComponent(kc.realm);\n                } else {\n                    return kc.authServerUrl + '/realms/' + encodeURIComponent(kc.realm);\n                }\n            } else {\n            \treturn undefined;\n            }\n        }\n\n        function getOrigin() {\n            if (!window.location.origin) {\n                return window.location.protocol + \"//\" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');\n            } else {\n                return window.location.origin;\n            }\n        }\n\n        function processCallback(oauth, promise) {\n            var code = oauth.code;\n            var error = oauth.error;\n            var prompt = oauth.prompt;\n\n            var timeLocal = new Date().getTime();\n\n            if (error) {\n                if (prompt != 'none') {\n                    var errorData = { error: error, error_description: oauth.error_description };\n                    kc.onAuthError && kc.onAuthError(errorData);\n                    promise && promise.setError(errorData);\n                } else {\n                    promise && promise.setSuccess();\n                }\n                return;\n            } else if ((kc.flow != 'standard') && (oauth.access_token || oauth.id_token)) {\n                authSuccess(oauth.access_token, null, oauth.id_token, true);\n            }\n\n            if ((kc.flow != 'implicit') && code) {\n                var params = 'code=' + code + '&grant_type=authorization_code';\n                var url = kc.endpoints.token();\n\n                var req = new XMLHttpRequest();\n                req.open('POST', url, true);\n                req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n\n                if (kc.clientId && kc.clientSecret) {\n                    req.setRequestHeader('Authorization', 'Basic ' + btoa(kc.clientId + ':' + kc.clientSecret));\n                } else {\n                    params += '&client_id=' + encodeURIComponent(kc.clientId);\n                }\n\n                params += '&redirect_uri=' + oauth.redirectUri;\n\n                req.withCredentials = true;\n\n                req.onreadystatechange = function() {\n                    if (req.readyState == 4) {\n                        if (req.status == 200) {\n\n                            var tokenResponse = JSON.parse(req.responseText);\n                            authSuccess(tokenResponse['access_token'], tokenResponse['refresh_token'], tokenResponse['id_token'], kc.flow === 'standard');\n                        } else {\n                            var errorData = {};\n                            var json;\n                            try {\n                                json = JSON.parse(req.response);\n                            } catch(err) {\n                            }\n                            \n                            if (json &&\n                                    json.error) {\n                                errorData['error'] = json.error;\n                                if (json.error_description) {\n                                    errorData['error_description'] = json.error_description;\n                                }\n                                if (json.error_uri) {\n                                    errorData['error_uri'] = json.error_uri;\n                                }\n                            } else {\n                                errorData['error'] = 'invalid_request';\n                                var description = {\n                                    status: req.status,\n                                    response: req.responseText,\n                                };\n                                try {\n                                    var authHeader = req.getResponseHeader('WWW-Authenticate');\n                                    if (authHeader) {\n                                    \tdescription['www_authenticate_header'] = authHeader;\n                                    }\n                                } catch(err) {}\n                                errorData['error_description'] = JSON.stringify(description);\n                            }\n                            kc.onAuthError && kc.onAuthError(errorData);\n                            promise && promise.setError(errorData);\n                        }\n                    }\n                };\n\n                req.send(params);\n            }\n\n            function authSuccess(accessToken, refreshToken, idToken, fulfillPromise) {\n                timeLocal = (timeLocal + new Date().getTime()) / 2;\n\n                setToken(accessToken, refreshToken, idToken, timeLocal);\n\n                if (useNonce && ((kc.tokenParsed && kc.tokenParsed.nonce != oauth.storedNonce) ||\n                    (kc.refreshTokenParsed && kc.refreshTokenParsed.nonce != oauth.storedNonce) ||\n                    (kc.idTokenParsed && kc.idTokenParsed.nonce != oauth.storedNonce))) {\n\n                    console.info('[KEYCLOAK] Invalid nonce, clearing token');\n                    kc.clearToken();\n                    promise && promise.setError();\n                } else {\n                    if (fulfillPromise) {\n                        kc.onAuthSuccess && kc.onAuthSuccess();\n                        promise && promise.setSuccess();\n                    }\n                }\n            }\n\n        }\n\n        function loadConfig(url) {\n            var promise = createPromise();\n            var configUrl;\n\n            if (!config) {\n                configUrl = 'keycloak.json';\n            } else if (typeof config === 'string') {\n                configUrl = config;\n            }\n\n            function setupOidcEndoints(oidcConfiguration) {\n                if (! oidcConfiguration) {\n                    kc.endpoints = {\n                        authorize: function() {\n                            return getRealmUrl() + '/protocol/openid-connect/auth';\n                        },\n                        token: function() {\n                            return getRealmUrl() + '/protocol/openid-connect/token';\n                        },\n                        logout: function() {\n                            return getRealmUrl() + '/protocol/openid-connect/logout';\n                        },\n                        checkSessionIframe: function() {\n                            var src = getRealmUrl() + '/protocol/openid-connect/login-status-iframe.html';\n                            if (kc.iframeVersion) {\n                              src = src + '?version=' + kc.iframeVersion;\n                            }\n                            return src;\n                        },\n                        register: function() {\n                            return getRealmUrl() + '/protocol/openid-connect/registrations';\n                        },\n                        userinfo: function() {\n                            return getRealmUrl() + '/protocol/openid-connect/userinfo';\n                        }\n                    };\n                } else {\n                    kc.endpoints = {\n                        authorize: function() {\n                            return oidcConfiguration.authorization_endpoint;\n                        },\n                        token: function() {\n                            return oidcConfiguration.token_endpoint;\n                        },\n                        logout: function() {\n                            if (!oidcConfiguration.end_session_endpoint) {\n                                throw \"Not supported by the OIDC server\";\n                            }\n                            return oidcConfiguration.end_session_endpoint;\n                        },\n                        checkSessionIframe: function() {\n                            if (!oidcConfiguration.check_session_iframe) {\n                                throw \"Not supported by the OIDC server\";\n                            }\n                            return oidcConfiguration.check_session_iframe;\n                        },\n                        register: function() {\n                            throw 'Redirection to \"Register user\" page not supported in standard OIDC mode';\n                        },\n                        userinfo: function() {\n                            if (!oidcConfiguration.userinfo_endpoint) {\n                                throw \"Not supported by the OIDC server\";\n                            }\n                            return oidcConfiguration.userinfo_endpoint;\n                        }\n                    }\n                }\n            }\n\n            if (configUrl) {\n                var req = new XMLHttpRequest();\n                req.open('GET', configUrl, true);\n                req.setRequestHeader('Accept', 'application/json');\n\n                req.onreadystatechange = function () {\n                    if (req.readyState == 4) {\n                        if (req.status == 200 || fileLoaded(req)) {\n                            var config = JSON.parse(req.responseText);\n\n                            kc.authServerUrl = config['auth-server-url'];\n                            kc.realm = config['realm'];\n                            kc.clientId = config['resource'];\n                            kc.clientSecret = (config['credentials'] || {})['secret'];\n                            setupOidcEndoints(null);\n                            promise.setSuccess();\n                        } else {\n                            promise.setError();\n                        }\n                    }\n                };\n\n                req.send();\n            } else {\n                if (!config.clientId) {\n                    throw 'clientId missing';\n                }\n\n                kc.clientId = config.clientId;\n                kc.clientSecret = (config.credentials || {}).secret;\n\n                var oidcProvider = config['oidcProvider'];\n                if (!oidcProvider) {\n                    if (!config['url']) {\n                        var scripts = document.getElementsByTagName('script');\n                        for (var i = 0; i < scripts.length; i++) {\n                            if (scripts[i].src.match(/.*keycloak\\.js/)) {\n                                config.url = scripts[i].src.substr(0, scripts[i].src.indexOf('/js/keycloak.js'));\n                                break;\n                            }\n                        }\n                    }\n                    if (!config.realm) {\n                        throw 'realm missing';\n                    }\n\n                    kc.authServerUrl = config.url;\n                    kc.realm = config.realm;\n                    setupOidcEndoints(null);\n                    promise.setSuccess();\n                } else {\n                    if (typeof oidcProvider === 'string') {\n                        var oidcProviderConfigUrl;\n                        if (oidcProvider.charAt(oidcProvider.length - 1) == '/') {\n                            oidcProviderConfigUrl = oidcProvider + '.well-known/openid-configuration';\n                        } else {\n                            oidcProviderConfigUrl = oidcProvider + '/.well-known/openid-configuration';\n                        }\n                        var req = new XMLHttpRequest();\n                        req.open('GET', oidcProviderConfigUrl, true);\n                        req.setRequestHeader('Accept', 'application/json');\n\n                        req.onreadystatechange = function () {\n                            if (req.readyState == 4) {\n                                if (req.status == 200 || fileLoaded(req)) {\n                                    var oidcProviderConfig = JSON.parse(req.responseText);\n                                    setupOidcEndoints(oidcProviderConfig);\n                                    promise.setSuccess();\n                                } else {\n                                    promise.setError();\n                                }\n                            }\n                        };\n\n                        req.send();\n                    } else {\n                        setupOidcEndoints(oidcProvider);\n                        promise.setSuccess();\n                    }\n                }\n            }\n\n            return promise.promise;\n        }\n\n        function fileLoaded(xhr) {\n            return xhr.status == 0 && xhr.responseText && xhr.responseURL.startsWith('file:');\n        }\n\n        function setToken(token, refreshToken, idToken, timeLocal) {\n            if (kc.tokenTimeoutHandle) {\n                clearTimeout(kc.tokenTimeoutHandle);\n                kc.tokenTimeoutHandle = null;\n            }\n\n            if (refreshToken) {\n                kc.refreshToken = refreshToken;\n                kc.refreshTokenParsed = decodeToken(refreshToken);\n            } else {\n                delete kc.refreshToken;\n                delete kc.refreshTokenParsed;\n            }\n\n            if (idToken) {\n                kc.idToken = idToken;\n                kc.idTokenParsed = decodeToken(idToken);\n            } else {\n                delete kc.idToken;\n                delete kc.idTokenParsed;\n            }\n\n            if (token) {\n                kc.token = token;\n                kc.tokenParsed = decodeToken(token);\n                kc.sessionId = kc.tokenParsed.session_state;\n                kc.authenticated = true;\n                kc.subject = kc.tokenParsed.sub;\n                kc.realmAccess = kc.tokenParsed.realm_access;\n                kc.resourceAccess = kc.tokenParsed.resource_access;\n\n                if (timeLocal) {\n                    kc.timeSkew = Math.floor(timeLocal / 1000) - kc.tokenParsed.iat;\n                }\n\n                if (kc.timeSkew != null) {\n                    console.info('[KEYCLOAK] Estimated time difference between browser and server is ' + kc.timeSkew + ' seconds');\n\n                    if (kc.onTokenExpired) {\n                        var expiresIn = (kc.tokenParsed['exp'] - (new Date().getTime() / 1000) + kc.timeSkew) * 1000;\n                        console.info('[KEYCLOAK] Token expires in ' + Math.round(expiresIn / 1000) + ' s');\n                        if (expiresIn <= 0) {\n                            kc.onTokenExpired();\n                        } else {\n                            kc.tokenTimeoutHandle = setTimeout(kc.onTokenExpired, expiresIn);\n                        }\n                    }\n                }\n            } else {\n                delete kc.token;\n                delete kc.tokenParsed;\n                delete kc.subject;\n                delete kc.realmAccess;\n                delete kc.resourceAccess;\n\n                kc.authenticated = false;\n            }\n        }\n\n        function decodeToken(str) {\n            str = str.split('.')[1];\n\n            str = str.replace('/-/g', '+');\n            str = str.replace('/_/g', '/');\n            switch (str.length % 4)\n            {\n                case 0:\n                    break;\n                case 2:\n                    str += '==';\n                    break;\n                case 3:\n                    str += '=';\n                    break;\n                default:\n                    throw 'Invalid token';\n            }\n\n            str = (str + '===').slice(0, str.length + (str.length % 4));\n            str = str.replace(/-/g, '+').replace(/_/g, '/');\n\n            str = decodeURIComponent(escape(atob(str)));\n\n            str = JSON.parse(str);\n            return str;\n        }\n\n        function createUUID() {\n            var s = [];\n            var hexDigits = '0123456789abcdef';\n            for (var i = 0; i < 36; i++) {\n                s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);\n            }\n            s[14] = '4';\n            s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);\n            s[8] = s[13] = s[18] = s[23] = '-';\n            var uuid = s.join('');\n            return uuid;\n        }\n\n        kc.callback_id = 0;\n\n        function createCallbackId() {\n            var id = '<id: ' + (kc.callback_id++) + (Math.random()) + '>';\n            return id;\n\n        }\n\n        function parseCallback(url) {\n            var oauth = parseCallbackUrl(url);\n            if (!oauth) {\n                return;\n            }\n\n            var oauthState = callbackStorage.get(oauth.state);\n\n            if (oauthState) {\n                oauth.valid = true;\n                oauth.redirectUri = oauthState.redirectUri;\n                oauth.storedNonce = oauthState.nonce;\n                oauth.prompt = oauthState.prompt;\n            }\n\n            return oauth;\n        }\n\n        function parseCallbackUrl(url) {\n            var supportedParams;\n            switch (kc.flow) {\n                case 'standard':\n                    supportedParams = ['code', 'state', 'session_state'];\n                    break;\n                case 'implicit':\n                    supportedParams = ['access_token', 'token_type', 'id_token', 'state', 'session_state', 'expires_in'];\n                    break;\n                case 'hybrid':\n                    supportedParams = ['access_token', 'id_token', 'code', 'state', 'session_state'];\n                    break;\n            }\n\n            supportedParams.push('error');\n            supportedParams.push('error_description');\n            supportedParams.push('error_uri');\n\n            var queryIndex = url.indexOf('?');\n            var fragmentIndex = url.indexOf('#');\n\n            var newUrl;\n            var parsed;\n\n            if (kc.responseMode === 'query' && queryIndex !== -1) {\n                newUrl = url.substring(0, queryIndex);\n                parsed = parseCallbackParams(url.substring(queryIndex + 1, fragmentIndex !== -1 ? fragmentIndex : url.length), supportedParams);\n                if (parsed.paramsString !== '') {\n                    newUrl += '?' + parsed.paramsString;\n                }\n                if (fragmentIndex !== -1) {\n                    newUrl += url.substring(fragmentIndex);\n                }\n            } else if (kc.responseMode === 'fragment' && fragmentIndex !== -1) {\n                newUrl = url.substring(0, fragmentIndex);\n                parsed = parseCallbackParams(url.substring(fragmentIndex + 1), supportedParams);\n                if (parsed.paramsString !== '') {\n                    newUrl += '#' + parsed.paramsString;\n                }\n            }\n\n            if (parsed && parsed.oauthParams) {\n                if (kc.flow === 'standard' || kc.flow === 'hybrid') {\n                    if ((parsed.oauthParams.code || parsed.oauthParams.error) && parsed.oauthParams.state) {\n                        parsed.oauthParams.newUrl = newUrl;\n                        return parsed.oauthParams;\n                    }\n                } else if (kc.flow === 'implicit') {\n                    if ((parsed.oauthParams.access_token || parsed.oauthParams.error) && parsed.oauthParams.state) {\n                        parsed.oauthParams.newUrl = newUrl;\n                        return parsed.oauthParams;\n                    }\n                }\n            }\n        }\n\n        function parseCallbackParams(paramsString, supportedParams) {\n            var p = paramsString.split('&');\n            var result = {\n                paramsString: '',\n                oauthParams: {}\n            }\n            for (var i = 0; i < p.length; i++) {\n                var t = p[i].split('=');\n                if (supportedParams.indexOf(t[0]) !== -1) {\n                    result.oauthParams[t[0]] = t[1];\n                } else {\n                    if (result.paramsString !== '') {\n                        result.paramsString += '&';\n                    }\n                    result.paramsString += p[i];\n                }\n            }\n            return result;\n        }\n\n        function createPromise() {\n            if (typeof Promise === \"function\") {\n                return createNativePromise();\n            } else {\n                return createLegacyPromise();\n            }\n        }\n\n        function createNativePromise() {\n            // Need to create a native Promise which also preserves the\n            // interface of the custom promise type previously used by the API\n            var p = {\n                setSuccess: function(result) {\n                    p.success = true;\n                    p.resolve(result);\n                },\n\n                setError: function(result) {\n                    p.success = false;\n                    p.reject(result);\n                }\n            };\n            p.promise = new Promise(function(resolve, reject) {\n                p.resolve = resolve;\n                p.reject = reject;\n            });\n            p.promise.success = function(callback) {\n                p.promise.then(callback);\n                return p.promise;\n            }\n            p.promise.error = function(callback) {\n                p.promise.catch(callback);\n                return p.promise;\n            }\n            return p;\n        }\n\n        function createLegacyPromise() {\n            var p = {\n                setSuccess: function(result) {\n                    p.success = true;\n                    p.result = result;\n                    if (p.successCallback) {\n                        p.successCallback(result);\n                    }\n                },\n\n                setError: function(result) {\n                    p.error = true;\n                    p.result = result;\n                    if (p.errorCallback) {\n                        p.errorCallback(result);\n                    }\n                },\n\n                promise: {\n                    success: function(callback) {\n                        if (p.success) {\n                            callback(p.result);\n                        } else if (!p.error) {\n                            p.successCallback = callback;\n                        }\n                        return p.promise;\n                    },\n                    error: function(callback) {\n                        if (p.error) {\n                            callback(p.result);\n                        } else if (!p.success) {\n                            p.errorCallback = callback;\n                        }\n                        return p.promise;\n                    }\n                }\n            }\n            return p;\n        }\n\n        function setupCheckLoginIframe() {\n            var promise = createPromise();\n\n            if (!loginIframe.enable) {\n                promise.setSuccess();\n                return promise.promise;\n            }\n\n            if (loginIframe.iframe) {\n                promise.setSuccess();\n                return promise.promise;\n            }\n\n            var iframe = document.createElement('iframe');\n            loginIframe.iframe = iframe;\n\n            iframe.onload = function() {\n                var authUrl = kc.endpoints.authorize();\n                if (authUrl.charAt(0) === '/') {\n                    loginIframe.iframeOrigin = getOrigin();\n                } else {\n                    loginIframe.iframeOrigin = authUrl.substring(0, authUrl.indexOf('/', 8));\n                }\n                promise.setSuccess();\n\n                setTimeout(check, loginIframe.interval * 1000);\n            }\n\n            var src = kc.endpoints.checkSessionIframe();\n            iframe.setAttribute('src', src );\n            iframe.setAttribute('title', 'keycloak-session-iframe' );\n            iframe.style.display = 'none';\n            document.body.appendChild(iframe);\n\n            var messageCallback = function(event) {\n                if ((event.origin !== loginIframe.iframeOrigin) || (loginIframe.iframe.contentWindow !== event.source)) {\n                    return;\n                }\n\n                if (!(event.data == 'unchanged' || event.data == 'changed' || event.data == 'error')) {\n                    return;\n                }\n\n\n                if (event.data != 'unchanged') {\n                    kc.clearToken();\n                }\n\n                var callbacks = loginIframe.callbackList.splice(0, loginIframe.callbackList.length);\n\n                for (var i = callbacks.length - 1; i >= 0; --i) {\n                    var promise = callbacks[i];\n                    if (event.data == 'unchanged') {\n                        promise.setSuccess();\n                    } else {\n                        promise.setError();\n                    }\n                }\n            };\n\n            window.addEventListener('message', messageCallback, false);\n\n            var check = function() {\n                checkLoginIframe();\n                if (kc.token) {\n                    setTimeout(check, loginIframe.interval * 1000);\n                }\n            };\n\n            return promise.promise;\n        }\n\n        function checkLoginIframe() {\n            var promise = createPromise();\n\n            if (loginIframe.iframe && loginIframe.iframeOrigin ) {\n                var msg = kc.clientId + ' ' + kc.sessionId;\n                loginIframe.callbackList.push(promise);\n                var origin = loginIframe.iframeOrigin;\n                if (loginIframe.callbackList.length == 1) {\n                    loginIframe.iframe.contentWindow.postMessage(msg, origin);\n                }\n            } else {\n                promise.setSuccess();\n            }\n\n            return promise.promise;\n        }\n\n        function loadAdapter(type) {\n            if (!type || type == 'default') {\n                return {\n                    login: function(options) {\n                        window.location.href = kc.createLoginUrl(options);\n                        return createPromise().promise;\n                    },\n\n                    logout: function(options) {\n                        window.location.href = kc.createLogoutUrl(options);\n                        return createPromise().promise;\n                    },\n\n                    register: function(options) {\n                        window.location.href = kc.createRegisterUrl(options);\n                        return createPromise().promise;\n                    },\n\n                    accountManagement : function() {\n                        var accountUrl = kc.createAccountUrl();\n                        if (typeof accountUrl !== 'undefined') {\n                            window.location.href = accountUrl;\n                        } else {\n                            throw \"Not supported by the OIDC server\";\n                        }\n                        return createPromise().promise;\n                    },\n\n                    redirectUri: function(options, encodeHash) {\n                        if (arguments.length == 1) {\n                            encodeHash = true;\n                        }\n\n                        if (options && options.redirectUri) {\n                            return options.redirectUri;\n                        } else if (kc.redirectUri) {\n                            return kc.redirectUri;\n                        } else {\n                            return location.href;\n                        }\n                    }\n                };\n            }\n\n            if (type == 'cordova') {\n                loginIframe.enable = false;\n                var cordovaOpenWindowWrapper = function(loginUrl, target, options) {\n                    if (window.cordova && window.cordova.InAppBrowser) {\n                        // Use inappbrowser for IOS and Android if available\n                        return window.cordova.InAppBrowser.open(loginUrl, target, options);\n                    } else {\n                        return window.open(loginUrl, target, options);\n                    }\n                };\n\n                var shallowCloneCordovaOptions = function (userOptions) {\n                    if (userOptions && userOptions.cordovaOptions) {\n                        return Object.keys(userOptions.cordovaOptions).reduce(function (options, optionName) {\n                            options[optionName] = userOptions.cordovaOptions[optionName];\n                            return options;\n                        }, {});\n                    } else {\n                        return {};\n                    }\n                };\n\n                var formatCordovaOptions = function (cordovaOptions) {\n                    return Object.keys(cordovaOptions).reduce(function (options, optionName) {\n                        options.push(optionName+\"=\"+cordovaOptions[optionName]);\n                        return options;\n                    }, []).join(\",\");\n                };\n\n                var createCordovaOptions = function (userOptions) {\n                    var cordovaOptions = shallowCloneCordovaOptions(userOptions);\n                    cordovaOptions.location = 'no';\n                    if (userOptions && userOptions.prompt == 'none') {\n                        cordovaOptions.hidden = 'yes';\n                    }                    \n                    return formatCordovaOptions(cordovaOptions);\n                };\n\n                return {\n                    login: function(options) {\n                        var promise = createPromise();\n\n                        var cordovaOptions = createCordovaOptions(options);\n                        var loginUrl = kc.createLoginUrl(options);\n                        var ref = cordovaOpenWindowWrapper(loginUrl, '_blank', cordovaOptions);\n                        var completed = false;\n                        \n                        var closed = false;\n                        var closeBrowser = function() {\n                            closed = true;\n                            ref.close();\n                        };\n\n                        ref.addEventListener('loadstart', function(event) {\n                            if (event.url.indexOf('http://localhost') == 0) {\n                                var callback = parseCallback(event.url);\n                                processCallback(callback, promise);\n                                closeBrowser();\n                                completed = true;\n                            }\n                        });\n\n                        ref.addEventListener('loaderror', function(event) {\n                            if (!completed) {\n                                if (event.url.indexOf('http://localhost') == 0) {\n                                    var callback = parseCallback(event.url);\n                                    processCallback(callback, promise);\n                                    closeBrowser();\n                                    completed = true;\n                                } else {\n                                    promise.setError();\n                                    closeBrowser();\n                                }\n                            }\n                        });\n\n                        ref.addEventListener('exit', function(event) {\n                            if (!closed) {\n                                promise.setError({\n                                    reason: \"closed_by_user\"\n                                });\n                            }\n                        });\n\n                        return promise.promise;\n                    },\n\n                    logout: function(options) {\n                        var promise = createPromise();\n                        \n                        var logoutUrl = kc.createLogoutUrl(options);\n                        var ref = cordovaOpenWindowWrapper(logoutUrl, '_blank', 'location=no,hidden=yes');\n\n                        var error;\n\n                        ref.addEventListener('loadstart', function(event) {\n                            if (event.url.indexOf('http://localhost') == 0) {\n                                ref.close();\n                            }\n                        });\n\n                        ref.addEventListener('loaderror', function(event) {\n                            if (event.url.indexOf('http://localhost') == 0) {\n                                ref.close();\n                            } else {\n                                error = true;\n                                ref.close();\n                            }\n                        });\n\n                        ref.addEventListener('exit', function(event) {\n                            if (error) {\n                                promise.setError();\n                            } else {\n                                kc.clearToken();\n                                promise.setSuccess();\n                            }\n                        });\n\n                        return promise.promise;\n                    },\n\n                    register : function() {\n                        var registerUrl = kc.createRegisterUrl();\n                        var cordovaOptions = createCordovaOptions(options);\n                        var ref = cordovaOpenWindowWrapper(registerUrl, '_blank', cordovaOptions);\n                        ref.addEventListener('loadstart', function(event) {\n                            if (event.url.indexOf('http://localhost') == 0) {\n                                ref.close();\n                            }\n                        });\n                    },\n\n                    accountManagement : function() {\n                        var accountUrl = kc.createAccountUrl();\n                        if (typeof accountUrl !== 'undefined') {\n                            var ref = cordovaOpenWindowWrapper(accountUrl, '_blank', 'location=no');\n                            ref.addEventListener('loadstart', function(event) {\n                                if (event.url.indexOf('http://localhost') == 0) {\n                                    ref.close();\n                                }\n                            });\n                        } else {\n                            throw \"Not supported by the OIDC server\";\n                        }\n                    },\n\n                    redirectUri: function(options) {\n                        return 'http://localhost';\n                    }\n                }\n            }\n\n            if (type == 'cordova-native') {\n                loginIframe.enable = false;\n\n                return {\n                    login: function(options) {\n                        var promise = createPromise();\n                        var loginUrl = kc.createLoginUrl(options);\n\n                        universalLinks.subscribe('keycloak', function(event) {\n                            universalLinks.unsubscribe('keycloak');\n                            window.cordova.plugins.browsertab.close();\n                            var oauth = parseCallback(event.url);\n                            processCallback(oauth, promise);\n                        });\n\n                        window.cordova.plugins.browsertab.openUrl(loginUrl);\n                        return promise.promise;\n                    },\n\n                    logout: function(options) {\n                        var promise = createPromise();\n                        var logoutUrl = kc.createLogoutUrl(options);\n\n                        universalLinks.subscribe('keycloak', function(event) {\n                            universalLinks.unsubscribe('keycloak');\n                            window.cordova.plugins.browsertab.close();\n                            kc.clearToken();\n                            promise.setSuccess();\n                        });\n\n                        window.cordova.plugins.browsertab.openUrl(logoutUrl);\n                        return promise.promise;\n                    },\n\n                    register : function(options) {\n                        var promise = createPromise();\n                        var registerUrl = kc.createRegisterUrl(options);\n                        universalLinks.subscribe('keycloak' , function(event) {\n                            universalLinks.unsubscribe('keycloak');\n                            window.cordova.plugins.browsertab.close();\n                            var oauth = parseCallback(event.url);\n                            processCallback(oauth, promise);\n                        });\n                        window.cordova.plugins.browsertab.openUrl(registerUrl);\n                        return promise.promise;\n\n                    },\n\n                    accountManagement : function() {\n                        var accountUrl = kc.createAccountUrl();\n                        if (typeof accountUrl !== 'undefined') {\n                            window.cordova.plugins.browsertab.openUrl(accountUrl);\n                        } else {\n                            throw \"Not supported by the OIDC server\";\n                        }\n                    },\n\n                    redirectUri: function(options) {\n                        if (options && options.redirectUri) {\n                            return options.redirectUri;\n                        } else if (kc.redirectUri) {\n                            return kc.redirectUri;\n                        } else {\n                            return \"http://localhost\";\n                        }\n                    }\n                }\n            }\n\n            throw 'invalid adapter type: ' + type;\n        }\n\n        var LocalStorage = function() {\n            if (!(this instanceof LocalStorage)) {\n                return new LocalStorage();\n            }\n\n            localStorage.setItem('kc-test', 'test');\n            localStorage.removeItem('kc-test');\n\n            var cs = this;\n\n            function clearExpired() {\n                var time = new Date().getTime();\n                for (var i = 0; i < localStorage.length; i++)  {\n                    var key = localStorage.key(i);\n                    if (key && key.indexOf('kc-callback-') == 0) {\n                        var value = localStorage.getItem(key);\n                        if (value) {\n                            try {\n                                var expires = JSON.parse(value).expires;\n                                if (!expires || expires < time) {\n                                    localStorage.removeItem(key);\n                                }\n                            } catch (err) {\n                                localStorage.removeItem(key);\n                            }\n                        }\n                    }\n                }\n            }\n\n            cs.get = function(state) {\n                if (!state) {\n                    return;\n                }\n\n                var key = 'kc-callback-' + state;\n                var value = localStorage.getItem(key);\n                if (value) {\n                    localStorage.removeItem(key);\n                    value = JSON.parse(value);\n                }\n\n                clearExpired();\n                return value;\n            };\n\n            cs.add = function(state) {\n                clearExpired();\n\n                var key = 'kc-callback-' + state.state;\n                state.expires = new Date().getTime() + (60 * 60 * 1000);\n                localStorage.setItem(key, JSON.stringify(state));\n            };\n        };\n\n        var CookieStorage = function() {\n            if (!(this instanceof CookieStorage)) {\n                return new CookieStorage();\n            }\n\n            var cs = this;\n\n            cs.get = function(state) {\n                if (!state) {\n                    return;\n                }\n\n                var value = getCookie('kc-callback-' + state);\n                setCookie('kc-callback-' + state, '', cookieExpiration(-100));\n                if (value) {\n                    return JSON.parse(value);\n                }\n            };\n\n            cs.add = function(state) {\n                setCookie('kc-callback-' + state.state, JSON.stringify(state), cookieExpiration(60));\n            };\n\n            cs.removeItem = function(key) {\n                setCookie(key, '', cookieExpiration(-100));\n            };\n\n            var cookieExpiration = function (minutes) {\n                var exp = new Date();\n                exp.setTime(exp.getTime() + (minutes*60*1000));\n                return exp;\n            };\n\n            var getCookie = function (key) {\n                var name = key + '=';\n                var ca = document.cookie.split(';');\n                for (var i = 0; i < ca.length; i++) {\n                    var c = ca[i];\n                    while (c.charAt(0) == ' ') {\n                        c = c.substring(1);\n                    }\n                    if (c.indexOf(name) == 0) {\n                        return c.substring(name.length, c.length);\n                    }\n                }\n                return '';\n            };\n\n            var setCookie = function (key, value, expirationDate) {\n                var cookie = key + '=' + value + '; '\n                    + 'expires=' + expirationDate.toUTCString() + '; ';\n                document.cookie = cookie;\n            }\n        };\n\n        function createCallbackStorage() {\n            try {\n                return new LocalStorage();\n            } catch (err) {\n            }\n\n            return new CookieStorage();\n        }\n    }\n\n    if ( typeof module === \"object\" && module && typeof module.exports === \"object\" ) {\n        module.exports = Keycloak;\n    } else {\n        window.Keycloak = Keycloak;\n\n        if ( typeof define === \"function\" && define.amd ) {\n            define( \"keycloak\", [], function () { return Keycloak; } );\n        }\n    }\n})( window );\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/keycloak/oidcCallback.js",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\n\nfunction redirectToInitialPage(ide) {\n  var redirectUri = window.sessionStorage.getItem('oidc' + (ide ? 'Ide' : 'Dashboard') + 'RedirectUrl');\n  var fragmentIndex = redirectUri.indexOf('#');\n  if (location.hash) {\n    var keycloakParameters;\n    if (fragmentIndex == -1) {\n      keycloakParameters = location.hash;\n    } else {\n      keycloakParameters = '&' + location.hash.substring(1);\n    }\n    redirectUri += keycloakParameters;\n  }\n  window.location = redirectUri;\n}\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/keycloak/oidcCallbackDashboard.html",
    "content": "<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<html>\n<head>\n  <title>oidcCallback</title>\n  <script type=\"text/javascript\" src=\"./oidcCallback.js\"></script>\n</head>\n<body onload=\"redirectToInitialPage(false)\"/>\n</html>\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/keycloak/oidcCallbackIde.html",
    "content": "<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<html>\n<head>\n  <title>oidcCallback</title>\n  <script type=\"text/javascript\" src=\"./oidcCallback.js\"></script>\n</head>\n<body onload=\"redirectToInitialPage(true)\"/>\n</html>\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/logging.properties",
    "content": "handlers = org.slf4j.bridge.SLF4JBridgeHandler\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/openapi-configuration.json",
    "content": "{\n  \"resourcePackages\": [\n    \"org.eclipse.che\"\n  ],\n  \"prettyPrint\" : true,\n  \"cacheTTL\": 0,\n  \"openAPI\": {\n    \"servers\": [\n      {\n        \"url\": \"/api\"\n      }\n    ],\n    \"info\": {\n      \"version\": \"7.X\",\n      \"title\": \"Che Server API\",\n      \"description\": \"Che Server API\",\n      \"license\": {\n        \"name\": \"Eclipse Public License - v 2.0\",\n        \"url\": \"https://www.eclipse.org/legal/epl-2.0\"\n      }\n    },\n    \"components\": {\n      \"securitySchemes\": {\n        \"bearerAuth\": {\n          \"type\": \"http\",\n          \"scheme\": \"bearer\",\n          \"bearerFormat\": \"JWT\"\n        }\n      }\n    },\n    \"security\": [\n      {\n        \"bearerAuth\": []\n      }\n    ]\n  }\n}"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/web.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2025 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<web-app xmlns=\"https://jakarta.ee/xml/ns/jakartaee\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"https://jakarta.ee/xml/ns/jakartaee\n                  https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd\"\n         version=\"5.0\">\n\n    <listener>\n        <listener-class>org.eclipse.che.inject.CheBootstrap</listener-class>\n    </listener>\n\n    <filter>\n        <filter-name>guiceFilter</filter-name>\n        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>\n    </filter>\n    <filter-mapping>\n        <filter-name>guiceFilter</filter-name>\n        <url-pattern>/*</url-pattern>\n    </filter-mapping>\n\n    <resource-env-ref>\n        <resource-env-ref-name>jdbc/che</resource-env-ref-name>\n        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>\n    </resource-env-ref>\n\n    <listener>\n        <listener-class>org.eclipse.che.multiuser.api.authentication.commons.DestroySessionListener</listener-class>\n    </listener>\n\n</web-app>\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/test/java/org/eclipse/che/integration/IntegrityConfigurationTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.integration;\n\nimport static java.lang.String.format;\n\nimport com.google.common.io.Files;\nimport com.google.common.io.Resources;\nimport com.google.inject.Inject;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.Reader;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Parameter;\nimport java.nio.charset.Charset;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Map;\nimport java.util.Properties;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\nimport javax.inject.Named;\nimport org.eclipse.che.commons.schedule.ScheduleDelay;\nimport org.reflections.Reflections;\nimport org.reflections.scanners.FieldAnnotationsScanner;\nimport org.reflections.scanners.MethodAnnotationsScanner;\nimport org.reflections.scanners.MethodParameterScanner;\nimport org.testng.Assert;\nimport org.testng.annotations.Ignore;\nimport org.testng.annotations.Test;\n\npublic class IntegrityConfigurationTest {\n  static final Set<String> KNOWN_UNDECLARED_PROPERTIES = new HashSet<>();\n\n  static {\n    // created during war build time in buildinfo.properties\n    KNOWN_UNDECLARED_PROPERTIES.add(\"che.product.build_info\");\n    // Defined in MachineAuthModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"che.auth.signature_key_size\");\n    // Defined in KubernetesInfraModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"kubernetesBasedEnvironments\");\n    // Defined in KubernetesInfraModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"infra.kubernetes.ingress.annotations\");\n    // Defined in DocsModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"che.json.ignored_classes\");\n    // Aliased to che.infra.kubernetes.trusted_ca.mount_path\n    KNOWN_UNDECLARED_PROPERTIES.add(\"che.infra.openshift.trusted_ca_bundles_mount_path\");\n    // Defined in OpenShiftInfraModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"multihost-exposer\");\n    // Defined in KubernetesInfraModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"allowedEnvironmentTypeUpgrades\");\n    // Defined in WsMasterModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"system.domain.actions\");\n    // Defined in ReplicationModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"jgroups.config.file\");\n    // Defined in UserDevfileApiPermissionsModule and WorkspaceApiPermissionsModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"system.super_privileged_domains\");\n    // Defined in KubernetesInfraModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"kubernetesBasedComponents\");\n    // Defined in WsMasterModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"che.agents.auth_enabled\");\n    // Defined in che server deployment.\n    KNOWN_UNDECLARED_PROPERTIES.add(\"che.host\");\n    // Defined in MachineAuthModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"che.auth.signature_key_algorithm\");\n    // Defined in che server deployment.\n    KNOWN_UNDECLARED_PROPERTIES.add(\"env.KUBERNETES_NAMESPACE\");\n    // Defined in che server deployment.\n    KNOWN_UNDECLARED_PROPERTIES.add(\"env.POD_NAMESPACE\");\n    // Defined in WsMasterModule\n    KNOWN_UNDECLARED_PROPERTIES.add(\"jndi.datasource.name\");\n  }\n\n  @Test\n  public void shouldHaveNamedDefaults() {\n    Reflections reflections =\n        new Reflections(\n            \"org.eclipse.che\", new MethodParameterScanner(), new FieldAnnotationsScanner());\n    Map<String, String> configuration =\n        getProperties(new File(Resources.getResource(\"che\").getPath()));\n    for (Constructor constructor : reflections.getConstructorsWithAnyParamAnnotated(Named.class)) {\n      for (Parameter p : constructor.getParameters()) {\n        if (p.isAnnotationPresent(Named.class)) {\n          String key = p.getAnnotation(Named.class).value();\n          Assert.assertTrue(\n              configuration.containsKey(key) || KNOWN_UNDECLARED_PROPERTIES.contains(key),\n              \"constructor `\"\n                  + constructor.getName()\n                  + \"` do not have default value `\"\n                  + key\n                  + \"` for the parameter `\"\n                  + p.getName()\n                  + \"` in configuration\");\n        }\n      }\n    }\n    for (Field field : reflections.getFieldsAnnotatedWith(Named.class)) {\n      if (field.isAnnotationPresent(Named.class)) {\n        if (field.isAnnotationPresent(Inject.class)\n            && field.getAnnotation(Inject.class).optional()) {\n          continue;\n        }\n        String key = field.getAnnotation(Named.class).value();\n        Assert.assertTrue(\n            configuration.containsKey(key) || KNOWN_UNDECLARED_PROPERTIES.contains(key),\n            \"Field `\"\n                + field.getName()\n                + \"` in class \"\n                + field.getDeclaringClass().getName()\n                + \" do not have default value `\"\n                + key\n                + \"` for the parameter ` in configuration\");\n      }\n    }\n  }\n\n  @Test\n  @Ignore\n  public void shouldNotDeclareUnused() {\n    Reflections reflections =\n        new Reflections(\n            \"org.eclipse.che\",\n            new MethodParameterScanner(),\n            new FieldAnnotationsScanner(),\n            new MethodAnnotationsScanner());\n    Set<String> parameters = new HashSet<>();\n    parameters.addAll(\n        reflections.getConstructorsWithAnyParamAnnotated(Named.class).stream()\n            .flatMap(c -> Stream.of(c.getParameters()))\n            .filter(p -> p.isAnnotationPresent(Named.class))\n            .map(p -> p.getAnnotation(Named.class).value())\n            .collect(Collectors.toSet()));\n\n    parameters.addAll(\n        reflections.getFieldsAnnotatedWith(Named.class).stream()\n            .filter(f -> f.isAnnotationPresent(Named.class))\n            .map(f -> f.getAnnotation(Named.class).value())\n            .collect(Collectors.toSet()));\n\n    parameters.addAll(\n        reflections.getMethodsAnnotatedWith(ScheduleDelay.class).stream()\n            .filter(m -> m.isAnnotationPresent(ScheduleDelay.class))\n            .map(m -> m.getAnnotation(ScheduleDelay.class).delayParameterName())\n            .collect(Collectors.toSet()));\n    parameters.addAll(\n        reflections.getMethodsAnnotatedWith(ScheduleDelay.class).stream()\n            .filter(m -> m.isAnnotationPresent(ScheduleDelay.class))\n            .map(m -> m.getAnnotation(ScheduleDelay.class).initialDelayParameterName())\n            .collect(Collectors.toSet()));\n\n    Set<String> unusedDeclaredConfigurationParameters =\n        getProperties(new File(Resources.getResource(\"che\").getPath())).keySet().stream()\n            .filter(k -> !parameters.contains(k))\n            .collect(Collectors.toSet());\n    Assert.assertTrue(\n        unusedDeclaredConfigurationParameters.isEmpty(),\n        \"Parameters declared but not used. \" + unusedDeclaredConfigurationParameters);\n  }\n\n  @Test\n  public void shouldNotHaveGuiceNamedDefaults() {\n    Reflections reflections = new Reflections(\"org.eclipse.che\", new MethodParameterScanner());\n    Set<Constructor> guiceNamedClasses =\n        reflections.getConstructorsWithAnyParamAnnotated(com.google.inject.name.Named.class);\n    Assert.assertTrue(\n        guiceNamedClasses.isEmpty(),\n        \"Found classes that uses com.google.inject.name.Named annotation instead of javax.inject.Named\");\n  }\n\n  protected Map<String, String> getProperties(File confDir) {\n    Map<String, String> values = new HashMap<>();\n    final File[] files = confDir.listFiles();\n    if (files != null) {\n      for (File file : files) {\n        if (!file.isDirectory()) {\n          if (\"properties\".equals(Files.getFileExtension(file.getName()))) {\n            Properties properties = new Properties();\n            try (Reader reader = Files.newReader(file, Charset.forName(\"UTF-8\"))) {\n              properties.load(reader);\n            } catch (IOException e) {\n              throw new IllegalStateException(\n                  format(\"Unable to read configuration file %s\", file), e);\n            }\n            for (final String name : properties.stringPropertyNames())\n              values.put(name, properties.getProperty(name));\n          }\n        }\n      }\n    }\n    return values;\n  }\n}\n"
  },
  {
    "path": "assembly/assembly-wsmaster-war/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "assembly/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-server</artifactId>\n        <groupId>org.eclipse.che</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n        <relativePath>../pom.xml</relativePath>\n    </parent>\n    <artifactId>che-assembly-parent</artifactId>\n    <packaging>pom</packaging>\n    <name>Che Assembly :: Parent</name>\n    <modules>\n        <module>assembly-swagger-war</module>\n        <module>assembly-wsmaster-war</module>\n        <module>assembly-root-war</module>\n        <module>assembly-che-tomcat</module>\n        <module>assembly-main</module>\n    </modules>\n</project>\n"
  },
  {
    "path": "build/README.md",
    "content": "# Eclipse Che - Dockerfiles\n\nThis `che-dockerfiles` repository is where all dockerfiles for Che Launcher, Che's CLI and Che's Stacks are hosted.  \n\n# Eclipse Che\n[![Join the chat at https://gitter.im/eclipse/che](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/eclipse/che?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n[![Eclipse License](http://img.shields.io/badge/license-Eclipse-brightgreen.svg)](https://github.com/codenvy/che/blob/master/LICENSE)\n[![Build Status](https://ci.codenvycorp.com/buildStatus/icon?job=che-ci-master)](https://ci.codenvycorp.com/job/che-ci-master)\n\nhttps://www.eclipse.org/che/. Next-generation Eclipse platform, developer workspace server and cloud IDE. Che defines workspaces that include their dependencies including embedded containerized runtimes, Web IDE, and project code. This makes workspaces distributed, collaborative, and portable to run anywhere on a desktop or a server ... [Read More](https://www.eclipse.org/che/features/)\n\n![Eclipse Che](https://www.eclipse.org/che/images/banner@2x.png \"Eclipse Che\")\n\n### Getting Started\nYou can run Che in the public cloud, a private cloud, or install it on any OS. Che has been tested on Ubuntu, Linux, MacOS and Windows. The [step by step guide](https://eclipse.org/che/getting-started/) will get you going.\n\nThe `che` repository is where we do development and there are many ways you can participate, for example:\n\n- [Submit bugs and feature requests](https://github.com/eclipse/che/issues) and help us verify them\n- Review [source code changes](https://github.com/eclipse/che/pulls)\n- [Improve docs](https://github.com/codenvy/che-docs)\n\n### Contributing\nIf you are interested in fixing issues and contributing directly to the code base, please see [How to Contribute](https://github.com/eclipse/che/wiki/How-To-Contribute). It covers:\n- [Submitting bugs](https://github.com/eclipse/che/wiki/Submitting-Bugs-and-Suggestions)\n- [Development workflow](https://github.com/eclipse/che/wiki/Development-Workflow)\n- [Coding guidelines](https://github.com/eclipse/che/wiki/Coding-Guidelines)\n- [Contributor license agreement](https://github.com/eclipse/che/wiki/Contributor-License-Agreement)\n\n### Feedback\n* **Support:** You can ask questions, report bugs, and request features using [GitHub issues](https://github.com/eclipse/che/issues).\n* **Roadmap:** We maintain [the roadmap](https://github.com/eclipse/che/wiki/Roadmap) on the wiki.\n* **Weekly Meetings:** Join us on [a hangout](https://github.com/eclipse/che/wiki/Weekly-Planning-Meetings).\n\n### License\nChe is open sourced under the Eclipse Public License 1.0.\n"
  },
  {
    "path": "build/build.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2017-2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n\nset -e\nset -u\n\nIMAGE_ALIASES=${IMAGE_ALIASES:-}\nERROR=${ERROR:-}\nDIR=${DIR:-}\nSHA_TAG=${SHA_TAG:-}\nBUILDER=${BUILDER:-}\n\nskip_tests() {\n  if [ $SKIP_TESTS = \"true\" ]; then\n    return 0\n  else\n    return 1\n  fi\n}\n\nprepare_build_args() {\n    IFS=',' read -r -a BUILD_ARGS_ARRAY <<< \"$@\"\n    for i in ${BUILD_ARGS_ARRAY[@]}; do\n    BUILD_ARGS+=\"--build-arg $i \"\n    done\n}\n\ninit() {\n  BLUE='\\033[1;34m'\n  GREEN='\\033[0;32m'\n  RED='\\033[0;31m'\n  BROWN='\\033[0;33m'\n  PURPLE='\\033[0;35m'\n  NC='\\033[0m'\n  BOLD='\\033[1m'\n  UNDERLINE='\\033[4m'\n\n  ORGANIZATION=\"quay.io/eclipse\"\n  PREFIX=\"che\"\n  TAG=\"next\"\n  LATEST_TAG=false\n  PUSH_IMAGE=false\n  SKIP_TESTS=false\n  NAME=\"che\"\n  ARGS=\"\"\n  OPTIONS=\"\"\n  DOCKERFILE=\"\"\n  BUILD_COMMAND=\"build\"\n  BUILD_ARGS=\"\"\n  BUILD_PLATFORMS=\"\"\n\n  while [ $# -gt 0 ]; do\n    case $1 in\n      --*)\n        OPTIONS=\"${OPTIONS} ${1}\"\n        ;;\n      *)\n        ARGS=\"${ARGS} ${1}\"\n        ;;\n    esac\n\n    case $1 in\n      --tag:*)\n        TAG=\"${1#*:}\"\n        shift ;;\n      --organization:*)\n        ORGANIZATION=\"${1#*:}\"\n        shift ;;\n      --prefix:*)\n        PREFIX=\"${1#*:}\"\n        shift ;;\n      --name:*)\n        NAME=\"${1#*:}\"\n        shift ;;\n      --skip-tests)\n        SKIP_TESTS=true\n        shift ;;\n      --push-image)\n        PUSH_IMAGE=true\n        shift ;;\n      --sha-tag)\n        SHA_TAG=$(git rev-parse --short HEAD)\n        shift ;;\n      --latest-tag)\n        LATEST_TAG=true\n        shift ;;\n      --dockerfile:*)\n        DOCKERFILE=\"${1#*:}\"\n        shift ;;\n      --build-arg*:*)\n        BUILD_ARGS_CSV=\"${1#*:}\"\n        prepare_build_args $BUILD_ARGS_CSV\n        shift ;;\n      --build-platforms:*)\n        BUILD_PLATFORMS=\"${1#*:}\"\n        shift ;;\n      --builder:*)\n        BUILDER=\"${1#*:}\"\n        shift ;;\n      --*)\n        printf \"${RED}Unknown parameter: $1${NC}\\n\"; exit 2 ;;\n      *)\n       shift;;\n    esac\n  done\n\n  IMAGE_NAME=\"$ORGANIZATION/$PREFIX-$NAME:$TAG\"\n  IMAGE_MANIFEST=\"$NAME-$TAG\"\n}\n\nbuild() {\n\n  # Compute directory\n  if [ -z $DIR ]; then\n      DIR=$(cd \"$(dirname \"$0\")\"; pwd)\n  fi\n\n  BUILD_COMAMAND=\"build\"\n  if [ -z $BUILDER ]; then\n      echo \"BUILDER is not specified, trying with podman\"\n      BUILDER=$(command -v podman || true)\n      if [[ ! -x $BUILDER ]]; then\n          echo \"[WARNING] podman is not installed, trying with buildah\"\n          BUILDER=$(command -v buildah || true)\n          if [[ ! -x $BUILDER ]]; then\n              echo \"[WARNING] buildah is not installed, trying with docker\"\n              BUILDER=$(command -v docker || true)\n              if [[ ! -x $BUILDER ]]; then\n                  echo \"[ERROR] This script requires podman, buildah or docker to be installed. Must abort!\"; exit 1\n              fi\n          else\n              BUILD_COMMAND=\"bud\"\n          fi\n      fi\n  else\n      if [[ ! -x $(command -v \"$BUILDER\" || true) ]]; then\n          echo \"Builder $BUILDER is missing. Aborting.\"; exit 1\n      fi\n      if [[ $BUILDER =~ \"docker\" || $BUILDER =~ \"podman\" ]]; then\n          if [[ ! $($BUILDER ps) ]]; then\n              echo \"Builder $BUILDER is not functioning. Aborting.\"; exit 1\n          fi\n      fi\n      if [[ $BUILDER =~ \"buildah\" ]]; then\n          BUILD_COMMAND=\"bud\"\n      fi\n  fi\n\n  # If Dockerfile is empty, build all Dockerfiles\n  if [ -z ${DOCKERFILE} ]; then\n    DOCKERFILES_TO_BUILD=\"$(ls ${DIR}/Dockerfile*)\"\n    ORIGINAL_TAG=${TAG}\n    # Build image for each Dockerfile\n    for dockerfile in ${DOCKERFILES_TO_BUILD}; do\n       dockerfile=$(basename $dockerfile)\n       # extract TAG from Dockerfile\n       if [ ${dockerfile} != \"Dockerfile\" ]; then\n         TAG=${ORIGINAL_TAG}-$(echo ${dockerfile} | sed -e \"s/^Dockerfile.//\")\n       fi\n       IMAGE_NAME=\"$ORGANIZATION/$PREFIX-$NAME:$TAG\"\n       DOCKERFILE=${dockerfile}\n       build_image\n    done\n\n    # restore variables\n    TAG=${ORIGINAL_TAG}\n    IMAGE_NAME=\"$ORGANIZATION/$PREFIX-$NAME:$TAG\"\n  else\n    # else if specified, build only the one specified\n    build_image\n  fi\n\n}\n\nbuild_image() {\n  printf \"${BOLD}Building Docker Image ${IMAGE_NAME} from $DIR directory with tag $TAG${NC}\\n\"\n  # Replace macros in Dockerfiles\n  cat ${DIR}/${DOCKERFILE} | sed \\\n    -e \"s;\\${BUILD_ORGANIZATION};${ORGANIZATION};\" \\\n    -e \"s;\\${BUILD_PREFIX};${PREFIX};\" \\\n    -e \"s;\\${BUILD_TAG};${TAG};\" \\\n    > ${DIR}/.Dockerfile\n  cd \"${DIR}\"\n\n  if [[ -n $BUILD_PLATFORMS ]]; then\n    if [[ $BUILDER == \"podman\" ]]; then\n      printf \"${BOLD}Creating manifest ${IMAGE_MANIFEST}${NC}\\n\"\n      \"${BUILDER}\" manifest create ${IMAGE_MANIFEST}\n      DOCKER_STATUS=$?\n      if [ ! $DOCKER_STATUS -eq 0 ]; then\n        printf \"${RED}Failure when creating manifest ${IMAGE_MANIFEST}${NC}\\n\"\n        exit 1\n      fi\n\n      printf \"${BOLD}Building image ${IMAGE_NAME}${NC}\\n\"\n      \"${BUILDER}\" build --platform ${BUILD_PLATFORMS} -t ${IMAGE_NAME} -f ${DIR}/.Dockerfile --manifest ${IMAGE_MANIFEST} .\n      DOCKER_STATUS=$?\n      if [ ! $DOCKER_STATUS -eq 0 ]; then\n        printf \"${RED}Failure when building docker image ${IMAGE_NAME}${NC}\\n\"\n        exit 1\n      fi\n    else\n      printf \"${RED}Multi-platform image building is only supported for podman builder${NC}\\n\"\n      exit 1\n    fi\n  else\n    \"${BUILDER}\" \"${BUILD_COMMAND}\" -f ${DIR}/.Dockerfile -t ${IMAGE_NAME} ${BUILD_ARGS} .\n    DOCKER_STATUS=$?\n    if [ ! $DOCKER_STATUS -eq 0 ]; then\n      printf \"${RED}Failure when building docker image ${IMAGE_NAME}${NC}\\n\"\n      exit 1\n    fi\n  fi\n\n  printf \"Build of ${BLUE}${IMAGE_NAME} ${GREEN}[OK]${NC}\\n\"\n\n  if [[ $PUSH_IMAGE == \"true\" ]]; then\n    push_image ${IMAGE_NAME} ${IMAGE_NAME}\n\n    if [ ! -z \"${SHA_TAG}\" ]; then\n      SHA_IMAGE_NAME=${ORGANIZATION}/${PREFIX}-${NAME}:${SHA_TAG}\n      printf \"Re-tagging with SHA based tag ${BLUE}${SHA_IMAGE_NAME} ${GREEN}[OK]${NC}\\n\"\n      push_image ${IMAGE_NAME} ${SHA_IMAGE_NAME}\n    fi\n\n    if [[ ${LATEST_TAG} == \"true\" ]]; then\n      LATEST_IMAGE_NAME=${ORGANIZATION}/${PREFIX}-${NAME}:latest\n      printf \"Re-tagging with latest tag ${BLUE}${LATEST_IMAGE_NAME} ${GREEN}[OK]${NC}\\n\"\n      push_image ${IMAGE_NAME} ${LATEST_IMAGE_NAME}\n    fi\n  fi\n\n  if [ ! -z \"${IMAGE_ALIASES}\" ]; then\n    for TMP_IMAGE_NAME in ${IMAGE_ALIASES}\n    do\n      \"${BUILDER}\" tag ${IMAGE_NAME} ${TMP_IMAGE_NAME}:${TAG}\n      DOCKER_TAG_STATUS=$?\n      if [ $DOCKER_TAG_STATUS -eq 0 ]; then\n        printf \"  /alias ${BLUE}${TMP_IMAGE_NAME}:${TAG}${NC} ${GREEN}[OK]${NC}\\n\"\n      else\n        printf \"${RED}Failure when building docker image ${IMAGE_NAME}${NC}\\n\"\n        exit 1\n      fi\n\n    done\n  fi\n\n  if [[ -n $BUILD_PLATFORMS ]] && [[ $BUILDER == \"podman\" ]]; then\n    # Remove manifest list from local storage\n    ${BUILDER} manifest rm ${IMAGE_MANIFEST}\n  fi\n\n  printf \"${GREEN}Script run successfully: ${BLUE}${IMAGE_NAME}${NC}\\n\"\n}\n\npush_image() {\n  local image=$1\n  local tagged_image=$2\n\n  printf \"Pushing manifest ${BLUE}${image} ${NC}\\n\"\n  if [[ -n $BUILD_PLATFORMS ]] && [[ $BUILDER == \"podman\" ]]; then\n    ${BUILDER} manifest push ${IMAGE_MANIFEST} docker://${tagged_image}\n    DOCKER_STATUS=$?\n    if [ ! $DOCKER_STATUS -eq 0 ]; then\n      printf \"${RED}Failure when pushing image ${image}${NC}\\n\"\n      exit 1\n    fi\n  else\n    ${BUILDER} tag ${image} ${tagged_image}\n    DOCKER_STATUS=$?\n    if [ ! $DOCKER_STATUS -eq 0 ]; then\n      printf \"${RED}Failure when tagging image ${tagged_image}${NC}\\n\"\n      exit 1\n    fi\n\n    ${BUILDER} push ${image}\n    DOCKER_STATUS=$?\n    if [ ! $DOCKER_STATUS -eq 0 ]; then\n      printf \"${RED}Failure when pushing image ${image}${NC}\\n\"\n      exit 1\n    fi\n  fi\n  printf \"Push of ${BLUE}${tagged_image} ${GREEN}[OK]${NC}\\n\"\n}\n\nget_full_path() {\n  echo \"$(cd \"$(dirname \"${1}\")\"; pwd)/$(basename \"$1\")\"\n}\n\nconvert_windows_to_posix() {\n  echo \"/\"$(echo \"$1\" | sed 's/\\\\/\\//g' | sed 's/://')\n}\n\nget_clean_path() {\n  INPUT_PATH=$1\n  # \\some\\path => /some/path\n  OUTPUT_PATH=$(echo ${INPUT_PATH} | tr '\\\\' '/')\n  # /somepath/ => /somepath\n  OUTPUT_PATH=${OUTPUT_PATH%/}\n  # /some//path => /some/path\n  OUTPUT_PATH=$(echo ${OUTPUT_PATH} | tr -s '/')\n  # \"/some/path\" => /some/path\n  OUTPUT_PATH=${OUTPUT_PATH//\\\"}\n  echo ${OUTPUT_PATH}\n}\n\nget_mount_path() {\n  FULL_PATH=$(get_full_path \"${1}\")\n  POSIX_PATH=$(convert_windows_to_posix \"${FULL_PATH}\")\n  CLEAN_PATH=$(get_clean_path \"${POSIX_PATH}\")\n  echo $CLEAN_PATH\n}\n\n# grab assembly\nDIR=\"$(cd \"$(dirname \"$0\")\"; pwd)/dockerfiles\"\nif [ ! -d \"${DIR}/../../assembly/assembly-main/target\" ]; then\n  echo \"${ERROR}Have you built assembly/assemby-main in ${DIR}/../assembly/assembly-main 'mvn clean install'?\"\n  exit 2\nfi\n\n# Use of folder\nBUILD_ASSEMBLY_DIR=$(echo \"${DIR}\"/../../assembly/assembly-main/target/eclipse-che-*/eclipse-che-*/)\nLOCAL_ASSEMBLY_DIR=\"${DIR}\"/eclipse-che\n\nif [ -d \"${LOCAL_ASSEMBLY_DIR}\" ]; then\n  rm -r \"${LOCAL_ASSEMBLY_DIR}\"\nfi\n\necho \"Copying assembly ${BUILD_ASSEMBLY_DIR} --> ${LOCAL_ASSEMBLY_DIR}\"\ncp -r \"${BUILD_ASSEMBLY_DIR}\" \"${LOCAL_ASSEMBLY_DIR}\"\n\ninit --name:server \"$@\"\nbuild\n\n#cleanUp\nrm -rf ${DIR}/eclipse-che\n"
  },
  {
    "path": "build/dockerfiles/Dockerfile",
    "content": "# Copyright (c) 2018-2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# https://access.redhat.com/containers/?tab=tags#/registry.access.redhat.com/ubi8-minimal\nFROM registry.access.redhat.com/ubi8-minimal:8.10-1179\nUSER root\nENV CHE_HOME=/home/user/eclipse-che\nENV JAVA_HOME=/usr/lib/jvm/jre\nRUN microdnf install java-17-openjdk-headless tar gzip shadow-utils findutils && \\\n    microdnf update -y && \\\n    microdnf -y clean all && rm -rf /var/cache/yum && echo \"Installed Packages\" && rpm -qa | sort -V && echo \"End Of Installed Packages\" && \\\n    adduser -G root user && mkdir -p /home/user/eclipse-che\nCOPY entrypoint.sh /entrypoint.sh\nENTRYPOINT [\"/entrypoint.sh\"]\n\nADD eclipse-che /home/user/eclipse-che\n# this should fail if the startup script is not found in correct path /home/user/eclipse-che/tomcat/bin/catalina.sh\nRUN mkdir /logs /data && \\\n    chmod 0777 /logs /data && \\\n    chgrp -R 0 /home/user /logs /data && \\\n    chown -R user /home/user && \\\n    chmod -R g+rwX /home/user && \\\n    find /home/user -type d -exec chmod 777 {} \\; && \\\n    java -version && echo -n \"Server startup script in: \" && \\\n    find /home/user/eclipse-che -name catalina.sh | grep -z /home/user/eclipse-che/tomcat/bin/catalina.sh\n\nUSER user\n\n# append Brew metadata here\n"
  },
  {
    "path": "build/dockerfiles/brew.Dockerfile",
    "content": "# Copyright (c) 2018-2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n# https://access.redhat.com/containers/?tab=tags#/registry.access.redhat.com/ubi8-minimal\nFROM ubi8-minimal:8.10-1179\nUSER root\nENV CHE_HOME=/home/user/devspaces\nENV JAVA_HOME=/usr/lib/jvm/jre\nRUN microdnf install java-11-openjdk-headless tar gzip shadow-utils findutils && \\\n    microdnf update -y && \\\n    microdnf -y clean all && rm -rf /var/cache/yum && echo \"Installed Packages\" && rpm -qa | sort -V && echo \"End Of Installed Packages\" && \\\n    adduser -G root user && mkdir -p /home/user/devspaces\nCOPY entrypoint.sh /entrypoint.sh\nENTRYPOINT [\"/entrypoint.sh\"]\n\n# see fetch-artifacts-pnc.yaml\nCOPY artifacts/assembly-main.tar.gz /tmp/assembly-main.tar.gz\nRUN tar xzf /tmp/assembly-main.tar.gz --strip-components=1 -C /home/user/devspaces; rm -f /tmp/assembly-main.tar.gz\n\n# this should fail if the startup script is not found in correct path /home/user/devspaces/tomcat/bin/catalina.sh\nRUN mkdir /logs /data && \\\n    chmod 0777 /logs /data && \\\n    chgrp -R 0 /home/user /logs /data && \\\n    chown -R user /home/user && \\\n    chmod -R g+rwX /home/user && \\\n    find /home/user -type d -exec chmod 777 {} \\; && \\\n    java -version && echo -n \"Server startup script in: \" && \\\n    find /home/user/devspaces -name catalina.sh | grep -z /home/user/devspaces/tomcat/bin/catalina.sh\n\nUSER user\n\n# append Brew metadata here\n"
  },
  {
    "path": "build/dockerfiles/entrypoint.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2012-2020 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\ninit_global_variables () {\n  # For coloring console output\n  BLUE='\\033[1;34m'\n  GREEN='\\033[0;32m'\n  NC='\\033[0m'\n\n  USAGE=\"\nUsage:\n  che [COMMAND]\n     start                              Starts server with output in the background\n     stop                               Stops ${CHE_MINI_PRODUCT_NAME} server\n     run                                Starts server with output in the foreground\n\nVariables:\n    CHE_SERVER_ACTION                   Another way to set the [COMMAND] to [run | start | stop]\n    CHE_PORT                            The port the Che server will listen on\n    CHE_IP                              The IP address of the host - must be set if remote clients connecting\n    CHE_BLOCKING_ENTROPY                Starts Tomcat with blocking entropy: -Djava.security.egd=file:/dev/./urandom\n    CHE_LAUNCH_DOCKER_REGISTRY          If true, uses Docker registry to save ws snapshots instead of disk\n    CHE_REGISTRY_HOST                   Hostname of Docker registry to launch, otherwise 'localhost'\n    CHE_LOG_LEVEL                       [INFO | DEBUG] Sets the output level of Tomcat messages\n    CHE_DEBUG_SERVER                    If true, activates Tomcat's JPDA debugging mode\n    CHE_DEBUG_SUSPEND                   If true, Tomcat will start suspended waiting for debugger\n    CHE_HOME                            Where the Che assembly resides - self-determining if not set\n\"\n\n  # Use blocking entropy -- needed for some servers\n  DEFAULT_CHE_BLOCKING_ENTROPY=false\n  CHE_BLOCKING_ENTROPY=${CHE_BLOCKING_ENTROPY:-${DEFAULT_CHE_BLOCKING_ENTROPY}}\n\n  DEFAULT_CHE_SERVER_ACTION=run\n  CHE_SERVER_ACTION=${CHE_SERVER_ACTION:-${DEFAULT_CHE_SERVER_ACTION}}\n\n  DEFAULT_CHE_LAUNCH_DOCKER_REGISTRY=false\n  CHE_LAUNCH_DOCKER_REGISTRY=${CHE_LAUNCH_DOCKER_REGISTRY:-${DEFAULT_CHE_LAUNCH_DOCKER_REGISTRY}}\n\n  # Must be exported as this will be needed by Tomcat's JVM\n  DEFAULT_CHE_REGISTRY_HOST=localhost\n  export CHE_REGISTRY_HOST=${CHE_REGISTRY_HOST:-${DEFAULT_CHE_REGISTRY_HOST}}\n\n  DEFAULT_CHE_PORT=8080\n  export CHE_PORT=${CHE_PORT:-${DEFAULT_CHE_PORT}}\n\n  DEFAULT_CHE_IP=\n  CHE_IP=${CHE_IP:-${DEFAULT_CHE_IP}}\n\n  DEFAULT_CHE_LOG_LEVEL=INFO\n  CHE_LOG_LEVEL=${CHE_LOG_LEVEL:-${DEFAULT_CHE_LOG_LEVEL}}\n\n  DEFAULT_CHE_LOGS_DIR=\"${CATALINA_HOME}/logs/\"\n  export CHE_LOGS_DIR=${CHE_LOGS_DIR:-${DEFAULT_CHE_LOGS_DIR}}\n\n  DEFAULT_CHE_DEBUG_SERVER=false\n  CHE_DEBUG_SERVER=${CHE_DEBUG_SERVER:-${DEFAULT_CHE_DEBUG_SERVER}}\n\n  DEFAULT_CHE_DEBUG_SUSPEND=\"false\"\n  CHE_DEBUG_SUSPEND=${CHE_DEBUG_SUSPEND:-${DEFAULT_CHE_DEBUG_SUSPEND}}\n}\n\nerror () {\n  echo\n  echo \"!!!\"\n  echo -e \"!!! ${1}\"\n  echo \"!!!\"\n  return 0\n}\n\nusage () {\n  echo \"${USAGE}\"\n}\n\nset_environment_variables () {\n  ### Set value of derived environment variables.\n\n  # CHE_DOCKER_IP is used internally by Che to set its IP address\n  if [[ -z \"${CHE_DOCKER_IP}\" ]]; then\n    if [[ -n \"${CHE_IP}\" ]]; then\n        export CHE_DOCKER_IP=\"${CHE_IP}\"\n    fi\n  fi\n\n  # Convert Tomcat environment variables to POSIX format.\n  if [[ \"${JAVA_HOME}\" == *\":\"* ]]; then\n    JAVA_HOME=$(echo /\"${JAVA_HOME}\" | sed  's|\\\\|/|g' | sed 's|:||g')\n  fi\n\n  # Convert Che environment variables to POSIX format.\n  if [[ \"${CHE_HOME}\" == *\":\"* ]]; then\n    CHE_HOME=$(echo /\"${CHE_HOME}\" | sed  's|\\\\|/|g' | sed 's|:||g')\n  fi\n\n  # Sets the location of the application server and its executables\n  # Internal property - should generally not be overridden\n  export CATALINA_HOME=\"${CHE_HOME}/tomcat\"\n\n  # Convert windows path name to POSIX\n  if [[ \"${CATALINA_HOME}\" == *\":\"* ]]; then\n    CATALINA_HOME=$(echo /\"${CATALINA_HOME}\" | sed  's|\\\\|/|g' | sed 's|:||g')\n  fi\n\n  if [[ \"${CHE_DEBUG_SUSPEND}\" == \"true\" ]]; then\n    export JPDA_SUSPEND=\"y\"\n  else\n    export JPDA_SUSPEND=\"n\"\n  fi\n\n  # Internal properties - should generally not be overridden\n  export CATALINA_BASE=\"${CHE_HOME}/tomcat\"\n  export ASSEMBLY_BIN_DIR=\"${CATALINA_HOME}/bin\"\n  export CHE_LOGS_LEVEL=\"${CHE_LOG_LEVEL}\"\n}\n\ndocker_exec() {\n  \"$(which docker)\" \"$@\"\n}\n\nstart_che_server () {\n if ${CHE_LAUNCH_DOCKER_REGISTRY} ; then\n    # Export the value of host here\n    launch_docker_registry\n  fi\n\n  #########################################\n  # Launch Che natively as a tomcat server\n  call_catalina\n}\n\nstop_che_server () {\n  CHE_SERVER_ACTION=\"stop\"\n  echo -e \"Stopping Che server running on localhost:${CHE_PORT}\"\n  call_catalina >/dev/null 2>&1\n}\n\ncall_catalina () {\n  # Test to see that Che application server is where we expect it to be\n  if [ ! -d \"${ASSEMBLY_BIN_DIR}\" ]; then\n    error \"Could not find Che's application server.\"\n    return 1;\n  fi\n\n  ### Initialize default JVM arguments to run che\n  if [[ \"${CHE_BLOCKING_ENTROPY}\" == true ]]; then\n    [ -z \"${JAVA_OPTS}\" ] && JAVA_OPTS=\"-Xms256m -Xmx1024m\"\n  else\n    [ -z \"${JAVA_OPTS}\" ] && JAVA_OPTS=\"-Xms256m -Xmx1024m -Djava.security.egd=file:/dev/./urandom\"\n  fi\n\n  ### Cannot add this in setenv.sh.\n  ### We do the port mapping here, and this gets inserted into server.xml when tomcat boots\n  export JAVA_OPTS=\"${JAVA_OPTS} -Dport.http=${CHE_PORT} -Dche.home=${CHE_HOME}\"\n  export SERVER_PORT=${CHE_PORT}\n\n  # Launch the Che application server, passing in command line parameters\n  if [[ \"${CHE_DEBUG_SERVER}\" == true ]]; then\n    \"${ASSEMBLY_BIN_DIR}\"/catalina.sh jpda ${CHE_SERVER_ACTION}\n  else\n    \"${ASSEMBLY_BIN_DIR}\"/catalina.sh ${CHE_SERVER_ACTION}\n  fi\n}\n\nkill_and_launch_docker_registry () {\n  echo -e \"Launching Docker container named ${GREEN}registry${NC} from image ${GREEN}registry:2${NC}.\"\n  docker_exec rm -f registry &> /dev/null || true\n  docker_exec run -d -p 5000:5000 --restart=always --name registry registry:2\n}\n\nlaunch_docker_registry () {\n    echo \"Launching a Docker registry for workspace snapshots.\"\n    CREATE_NEW_CONTAINER=false\n\n    # Check to see if the registry docker was not properly shut down\n    docker_exec inspect registry &> /dev/null || DOCKER_INSPECT_EXIT=$? || true\n    if [ \"${DOCKER_INSPECT_EXIT}\" != \"1\" ]; then\n\n      # Existing container running registry is found.  Let's start it.\n      echo -e \"Found a registry container named ${GREEN}registry${NC}. Attempting restart.\"\n      docker_exec start registry &>/dev/null || DOCKER_EXIT=$? || true\n\n      # Existing container found, but could not start it properly.\n      if [ \"${DOCKER_EXIT}\" == \"1\" ]; then\n        echo \"Initial start of registry docker container failed... Attempting docker restart and exec.\"\n        CREATE_NEW_CONTAINER=true\n      fi\n\n    echo \"Successful restart of registry container.\"\n    echo\n\n    # No existing Che container found, we need to create a new one.\n    else\n      CREATE_NEW_CONTAINER=true\n    fi\n\n    if ${CREATE_NEW_CONTAINER} ; then\n      # Container in bad state or not found, kill and launch new container.\n      kill_and_launch_docker_registry\n    fi\n}\n\nperform_database_migration() {\n  CHE_DATA=/data\n  if [ -f ${CHE_DATA}/db/che.mv.db ]; then\n    echo \"!!! Detected Che database, that is stored by an old path: ${CHE_DATA}/db/che.mv.db\"\n    echo \"!!! In case if you want to use it, move it manually to the new path ${CHE_DATA}/storage/db/che.mv.db\"\n    echo \"!!! It will be moved there automatically, if no database is present by the new path\"\n    if [ ! -f ${CHE_DATA}/storage/db/che.mv.db ]; then\n      mkdir -p ${CHE_DATA}/storage/db\n      mv ${CHE_DATA}/db/che.mv.db ${CHE_DATA}/storage/db/che.mv.db\n      echo \"Database has been successfully moved to the new path\"\n    fi\n  fi\n}\n\ninit() {\n  ### Any variables with export is a value that native Tomcat che.sh startup script requires\n  export CHE_IP=${CHE_IP}\n\n  if [ -z \"$CHE_HOME\" ]; then\n    if [ -f \"/assembly/tomcat/bin/catalina.sh\" ]; then\n      export CHE_HOME=\"/assembly\"\n      echo \"Found custom assembly in ${CHE_HOME}\"\n    else\n      export CHE_HOME=$(echo /home/user/eclipse-che)\n      echo \"Using embedded assembly in ${CHE_HOME}.\"\n    fi\n  else\n    export CHE_HOME=$(echo ${CHE_HOME})\n    echo \"Using custom assembly from $CHE_HOME\"\n  fi\n\n  ### We need to discover the host mount provided by the user for `/data`\n  export CHE_DATA=\"/data\"\n  CHE_DATA_HOST=$(get_che_data_from_host)\n\n  CHE_USER=${CHE_USER:-root}\n  export CHE_USER=$CHE_USER\n  if [ \"$CHE_USER\" != \"root\" ]; then\n    if [ ! $(getent group docker) ]; then\n      echo \"!!!\"\n      echo \"!!! Error: The docker group doesn't exist.\"\n      echo \"!!!\"\n      exit 1\n    fi\n    export CHE_USER_ID=${CHE_USER}\n    sudo chown -R ${CHE_USER} ${CHE_DATA}\n    sudo chown -R ${CHE_USER} ${CHE_HOME}\n    sudo chown -R ${CHE_USER} ${CHE_LOGS_DIR}\n  fi\n\n  [ -z \"$CHE_DATABASE\" ] && export CHE_DATABASE=${CHE_DATA}/storage\n\n  perform_database_migration\n\n  # CHE_DOCKER_IP_EXTERNAL must be set if you are in a VM.\n  HOSTNAME=${CHE_DOCKER_IP_EXTERNAL:-$(get_docker_external_hostname)}\n  if has_external_hostname; then\n    # Internal property used by Che to set hostname.\n    export CHE_DOCKER_IP_EXTERNAL=${HOSTNAME}\n  fi\n  ### Necessary to allow the container to write projects to the folder\n  [ -z \"$CHE_WORKSPACE_STORAGE__MASTER__PATH\" ] && export CHE_WORKSPACE_STORAGE__MASTER__PATH=${CHE_DATA}/workspaces\n  [ -z \"$CHE_WORKSPACE_STORAGE\" ] && export CHE_WORKSPACE_STORAGE=\"${CHE_DATA_HOST}/workspaces\"\n  [ -z \"$CHE_WORKSPACE_STORAGE_CREATE_FOLDERS\" ] && export CHE_WORKSPACE_STORAGE_CREATE_FOLDERS=false\n\n  # Cleanup no longer in use stacks folder, accordance to a new loading policy.\n  if [[ -d \"${CHE_DATA}\"/stacks ]];then\n    rm -rf \"${CHE_DATA}\"/stacks\n  fi\n\n  # A che property, which names the Docker network used for che + ws to communicate\n  if [ -z \"$CHE_DOCKER_NETWORK\" ]; then\n    NETWORK_NAME=\"bridge\"\n  else\n    NETWORK_NAME=$CHE_DOCKER_NETWORK\n  fi\n  export JAVA_OPTS=\"${JAVA_OPTS} -Dche.docker.network=$NETWORK_NAME\"\n}\n\nadd_cert_to_truststore() {\n  DEFAULT_JAVA_TRUST_STORE=${JAVA_HOME}/lib/security/cacerts\n  DEFAULT_JAVA_TRUST_STOREPASS=\"changeit\"\n\n  JAVA_TRUST_STORE=/home/user/cacerts\n  SELF_SIGNED_CERT=/home/user/self-signed.crt\n\n  MESSAGE=\"Found a custom cert. Adding it to java trust store $JAVA_TRUST_STORE\"\n  if [ ! -f \"$JAVA_TRUST_STORE\" ]; then\n    echo \"$MESSAGE based on $DEFAULT_JAVA_TRUST_STORE\"\n    cp $DEFAULT_JAVA_TRUST_STORE $JAVA_TRUST_STORE\n  else\n    echo \"$MESSAGE\"\n  fi\n\n  echo \"$1\" > $SELF_SIGNED_CERT\n\n  # make sure that owner has permissions to write and other groups have permissions to read\n  chmod 644 \"$JAVA_TRUST_STORE\"\n\n  echo yes | keytool -keystore $JAVA_TRUST_STORE -importcert -alias \"$2\" -file $SELF_SIGNED_CERT -storepass $DEFAULT_JAVA_TRUST_STOREPASS > /dev/null\n  # set read-only permissions on keystore file\n  chmod 444 \"$JAVA_TRUST_STORE\"\n  set_truststore_system_variables \"$JAVA_TRUST_STORE\" \"$DEFAULT_JAVA_TRUST_STOREPASS\"\n}\n\nset_truststore_system_variables() {\n  KEYSTORE_PATH=$1\n  KEYSTORE_PASSWORD=$2\n   if [[ \"$JAVA_OPTS\" != *\"-Djavax.net.ssl.trustStore\"* && \"$JAVA_OPTS\" != *\"-Djavax.net.ssl.trustStorePassword\"* ]]; then\n    export JAVA_OPTS=\"${JAVA_OPTS} -Djavax.net.ssl.trustStore=$KEYSTORE_PATH -Djavax.net.ssl.trustStorePassword=$KEYSTORE_PASSWORD\"\n  fi\n}\n\nadd_che_cert_to_truststore() {\n  # Deprecated, CHE_SELF__SIGNED__CERT environment variable is not used after 7.105.0\n  if [ \"${CHE_SELF__SIGNED__CERT}\" != \"\" ]; then\n    add_cert_to_truststore \"${CHE_SELF__SIGNED__CERT}\" \"HOSTDOMAIN\"\n  fi\n  CERT_PATH=\"/self-signed-cert/ca.crt\"\n  if [ -e $CERT_PATH ]; then\n    add_cert_to_truststore \"$(cat $CERT_PATH)\" \"HOSTDOMAIN\"\n  fi\n}\n\nadd_public_certs_to_truststore() {\n  JAVA_TRUST_STORE=/home/user/cacerts\n  DEFAULT_JAVA_TRUST_STORE=${JAVA_HOME}/lib/security/cacerts\n  DEFAULT_JAVA_TRUST_STOREPASS=\"changeit\"\n\n  if [ ! -f \"$JAVA_TRUST_STORE\" ]; then\n    cp \"$DEFAULT_JAVA_TRUST_STORE\" \"$JAVA_TRUST_STORE\"\n  fi\n\n  chmod 644 \"$JAVA_TRUST_STORE\"\n\n  CUSTOM_PUBLIC_CERTIFICATES=\"/public-certs\"\n  if [[ -d \"$CUSTOM_PUBLIC_CERTIFICATES\" && -n \"$(find $CUSTOM_PUBLIC_CERTIFICATES -type f)\" ]]; then\n    FILES=\"$CUSTOM_PUBLIC_CERTIFICATES/*\"\n    for cert in $FILES\n    do\n      jks_import_ca_bundle \"$cert\" \"$JAVA_TRUST_STORE\" \"$DEFAULT_JAVA_TRUST_STOREPASS\"\n    done\n  fi\n\n  chmod 444 \"$JAVA_TRUST_STORE\"\n  set_truststore_system_variables \"$JAVA_TRUST_STORE\" \"$DEFAULT_JAVA_TRUST_STOREPASS\"\n}\n\nfunction jks_import_ca_bundle {\n  CA_FILE=$1\n  KEYSTORE_PATH=$2\n  KEYSTORE_PASSWORD=$3\n\n  if [ ! -f \"$CA_FILE\" ]; then\n    # CA bundle file doesn't exist, skip it\n    echo \"Failed to import CA certificates from ${CA_FILE}. File doesn't exist\"\n    return\n  fi\n\n  bundle_name=$(basename \"$CA_FILE\")\n  certs_imported=0\n  cert_index=0\n  tmp_file=/tmp/cert.pem\n  is_cert=false\n  while IFS= read -r line; do\n    if [ \"$line\" == \"-----BEGIN CERTIFICATE-----\" ]; then\n      # Start copying a new certificate\n      is_cert=true\n      cert_index=$((cert_index+1))\n      # Reset destination file and add header line\n      echo \"$line\" > ${tmp_file}\n    elif [ \"$line\" == \"-----END CERTIFICATE-----\" ]; then\n      # End of the certificate is reached, add it to trust store\n      is_cert=false\n      echo \"$line\" >> ${tmp_file}\n      keytool -importcert -alias \"${bundle_name}_${cert_index}\" -keystore \"$KEYSTORE_PATH\" -file $tmp_file -storepass \"$KEYSTORE_PASSWORD\" -noprompt && \\\n      certs_imported=$((certs_imported+1))\n    elif [ \"$is_cert\" == true ]; then\n      # In the middle of a certificate, copy line to target file\n      echo \"$line\" >> ${tmp_file}\n    fi\n  done < \"$CA_FILE\"\n  echo \"Imported ${certs_imported} certificates from ${CA_FILE}\"\n  # Clean up\n  rm -f $tmp_file\n}\n\nget_che_data_from_host() {\n  DEFAULT_DATA_HOST_PATH=/data\n  CHE_SERVER_CONTAINER_ID=$(get_che_server_container_id)\n  # If `docker inspect` fails $DEFAULT_DATA_HOST_PATH is returned\n  echo $(docker inspect --format='{{(index .Volumes \"/data\")}}' $CHE_SERVER_CONTAINER_ID 2>/dev/null || echo $DEFAULT_DATA_HOST_PATH)\n}\n\nget_che_server_container_id() {\n  # Returning `hostname` doesn't work when running Che on OpenShift/Kubernetes/Docker Cloud.\n  # In these cases `hostname` correspond to the pod ID that is different from\n  # the container ID\n  echo $(basename \"$(head /proc/1/cgroup || hostname)\");\n}\n\nis_docker_for_mac_or_windows() {\n  if uname -r | grep -q 'linuxkit'; then\n    return 0\n  elif uname -r | grep -q 'moby'; then\n    return 0\n  else\n    return 1\n  fi\n}\n\nget_docker_external_hostname() {\n  if is_docker_for_mac_or_windows; then\n    echo \"localhost\"\n  else\n    echo \"\"\n  fi\n}\n\nhas_external_hostname() {\n  if [ \"${HOSTNAME}\" = \"\" ]; then\n    return 1\n  else\n    return 0\n  fi\n}\n\n# SITTERM / SIGINT\nresponsible_shutdown() {\n  echo \"\"\n  echo \"Received SIGTERM\"\n  stop_che_server &\n  wait ${PID}\n  exit;\n}\n\nset -e\nset +o posix\n\n# setup handlers\n# on callback, kill the last background process, which is `tail -f /dev/null` and execute the specified handler\ntrap 'responsible_shutdown' SIGHUP SIGTERM SIGINT\n\ninit\ninit_global_variables\nset_environment_variables\nadd_che_cert_to_truststore\nadd_public_certs_to_truststore\n\n# run che\nstart_che_server &\n\nPID=$!\n\n# See: http://veithen.github.io/2014/11/16/sigterm-propagation.html\nwait ${PID}\nwait ${PID}\nEXIT_STATUS=$?\n\n# wait forever\nwhile true\ndo\n  tail -f /dev/null & wait ${!}\ndone\n"
  },
  {
    "path": "check_properties_description.sh",
    "content": "#!/bin/bash\n\nCHE_PROPERTIES_PATH=\"assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties\"\nMULTIUSER_PROPERTIES_PATH=\"assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/multiuser.properties\"\n\nHAS_DESCRIPTION=false\ncat $CHE_PROPERTIES_PATH $MULTIUSER_PROPERTIES_PATH |\nwhile read -r LINE\ndo\n  if [[ $LINE == '#'* ]]; then\n    HAS_DESCRIPTION=true\n  elif [[ -z $LINE ]]; then\n    HAS_DESCRIPTION=false\n  else\n    if [[ $HAS_DESCRIPTION == false ]]; then\n      echo \"Property $LINE seems to be missing a description!\"\n      exit 1\n    fi\n    HAS_DESCRIPTION=false\n  fi\ndone\n\n"
  },
  {
    "path": "core/che-core-api-core/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-core</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: Commons :: API :: Core</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>aopalliance</groupId>\n            <artifactId>aopalliance</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-assistedinject</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.annotation</groupId>\n            <artifactId>jakarta.annotation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.validation</groupId>\n            <artifactId>jakarta.validation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-schedule</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.websocket</groupId>\n            <artifactId>jakarta.websocket-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.tomcat</groupId>\n            <artifactId>tomcat-catalina</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.tomcat</groupId>\n            <artifactId>tomcat-coyote</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-core</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n                <configuration>\n                    <dtoPackages>\n                        <package>org.eclipse.che.api.core.rest.shared.dto</package>\n                    </dtoPackages>\n                    <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                    <genClassName>org.eclipse.che.api.core.server.dto.DtoServerImpls</genClassName>\n                    <impl>server</impl>\n                </configuration>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-resource</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n    <profiles>\n        <profile>\n            <id>nonLinux</id>\n            <activation>\n                <os>\n                    <family>!unix</family>\n                </os>\n            </activation>\n            <build>\n                <plugins>\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-surefire-plugin</artifactId>\n                        <configuration>\n                            <includes>\n                                <include>**/*Test.java</include>\n                            </includes>\n                            <excludes>\n                                <exclude>org/eclipse/che/api/core/util/ProcessUtilTest.java</exclude>\n                                <exclude>org/eclipse/che/api/core/util/StandardLinuxShellTest.java</exclude>\n                                <exclude>**/it/*Test.java</exclude>\n                            </excludes>\n                        </configuration>\n                    </plugin>\n                </plugins>\n            </build>\n        </profile>\n        <profile>\n            <id>unix</id>\n            <activation>\n                <os>\n                    <family>unix</family>\n                </os>\n            </activation>\n            <build>\n                <plugins>\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-surefire-plugin</artifactId>\n                        <configuration>\n                            <excludes>\n                                <exclude>**/it/*Test.java</exclude>\n                            </excludes>\n                            <includes>\n                                <include>org/eclipse/che/api/core/util/ProcessUtilTest.java</include>\n                                <include>org/eclipse/che/api/core/util/StandardLinuxShellTest.java</include>\n                                <include>**/*Test.java</include>\n                            </includes>\n                        </configuration>\n                    </plugin>\n                </plugins>\n            </build>\n        </profile>\n        <profile>\n            <id>integration</id>\n            <activation>\n                <activeByDefault>false</activeByDefault>\n            </activation>\n            <build>\n                <plugins>\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-failsafe-plugin</artifactId>\n                        <executions>\n                            <execution>\n                                <goals>\n                                    <goal>integration-test</goal>\n                                    <goal>verify</goal>\n                                </goals>\n                            </execution>\n                        </executions>\n                        <configuration>\n                            <includes>\n                                <include>**/it/*Test.java</include>\n                            </includes>\n                        </configuration>\n                    </plugin>\n                </plugins>\n            </build>\n        </profile>\n    </profiles>\n</project>\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/ApiException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * Base class for all API errors.\n *\n * @author andrew00x\n */\n@SuppressWarnings(\"serial\")\npublic class ApiException extends Exception {\n  private final ServiceError serviceError;\n\n  public ApiException(ServiceError serviceError) {\n    super(serviceError.getMessage());\n    this.serviceError = serviceError;\n  }\n\n  public ApiException(String message) {\n    super(message);\n\n    this.serviceError = createError(message);\n  }\n\n  public ApiException(String message, Throwable cause) {\n    super(message, cause);\n    this.serviceError = createError(message);\n  }\n\n  public ApiException(Throwable cause) {\n    super(cause);\n    this.serviceError = createError(cause.getMessage());\n  }\n\n  public ServiceError getServiceError() {\n    return serviceError;\n  }\n\n  private ServiceError createError(String message) {\n    return DtoFactory.getInstance().createDto(ServiceError.class).withMessage(message);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/AuthenticationException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\n@SuppressWarnings(\"serial\")\npublic class AuthenticationException extends ApiException {\n  /**\n   * Response status if any exception occurs, <br>\n   * Default value: 400\n   */\n  int responseStatus;\n\n  public AuthenticationException() {\n    this(400);\n  }\n\n  public AuthenticationException(String message, Throwable cause) {\n    this(400, message, cause);\n  }\n\n  public AuthenticationException(String message) {\n    this(400, message);\n  }\n\n  public AuthenticationException(Throwable cause) {\n    this(400, cause);\n  }\n\n  public AuthenticationException(int responseStatus) {\n    super(\"Authentication failed.\");\n    this.responseStatus = responseStatus;\n  }\n\n  public AuthenticationException(int responseStatus, String message, Throwable cause) {\n    super(message, cause);\n    this.responseStatus = responseStatus;\n  }\n\n  public AuthenticationException(int responseStatus, String message) {\n    super(message);\n    this.responseStatus = responseStatus;\n  }\n\n  public AuthenticationException(int responseStatus, Throwable cause) {\n    super(cause);\n    this.responseStatus = responseStatus;\n  }\n\n  public int getResponseStatus() {\n    return responseStatus;\n  }\n\n  public void setResponseStatus(int responseStatus) {\n    this.responseStatus = responseStatus;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/BadRequestException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\n\n/**\n * A {@code BadRequestException} should be thrown when server receives invalid input parameter or\n * missed it.\n *\n * <p>Typically in REST API such errors are converted in HTTP response with status 400.\n *\n * @author Sergii Leschenko\n */\npublic class BadRequestException extends ApiException {\n  public BadRequestException(String message) {\n    super(message);\n  }\n\n  public BadRequestException(String message, Throwable cause) {\n    super(message, cause);\n  }\n\n  public BadRequestException(ServiceError serviceError) {\n    super(serviceError);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/ConflictException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\n\n/**\n * A {@code ConflictException} is throws when operation could not be performed because of conflict\n * with prior state. For example, there is an existing resource prevents creation of a new one.\n *\n * <p>Typically in REST API such errors are converted in HTTP response with status 409.\n *\n * @author andrew00x\n */\n@SuppressWarnings(\"serial\")\npublic class ConflictException extends ApiException {\n\n  public ConflictException(String message) {\n    super(message);\n  }\n\n  public ConflictException(ServiceError serviceError) {\n    super(serviceError);\n  }\n\n  public ConflictException(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/ErrorCodes.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\n/**\n * Defines error codes that are used in exceptions, defined codes MUST NOT conflict, error codes\n * must be in range <b>10000-14999</b> inclusive.\n *\n * @author Igor Vinokur\n * @author Yevhenii Voevodin\n */\npublic final class ErrorCodes {\n\n  public static final int LIMIT_EXCEEDED = 10000;\n\n  private ErrorCodes() {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/ForbiddenException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\n\n/**\n * A {@code ForbiddenException} is thrown when required operation is forbidden. For example, if\n * caller doesn't have rights or required operation is not allowed for some resource.\n *\n * <p>Typically in REST API such errors are converted in HTTP response with status 403.\n *\n * @author andrew00x\n */\n@SuppressWarnings(\"serial\")\npublic class ForbiddenException extends ApiException {\n  public ForbiddenException(String message) {\n    super(message);\n  }\n\n  public ForbiddenException(ServiceError serviceError) {\n    super(serviceError);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/NotFoundException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\n\n/**\n * A {@code NotFoundException} is thrown if requested resource was not found.\n *\n * <p>Typically in REST API such errors are converted in HTTP response with status 404.\n *\n * @author andrew00x\n */\n@SuppressWarnings(\"serial\")\npublic class NotFoundException extends ApiException {\n  public NotFoundException(String message) {\n    super(message);\n  }\n\n  public NotFoundException(ServiceError serviceError) {\n    super(serviceError);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/Page.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static java.util.Objects.requireNonNull;\nimport static java.util.stream.Collectors.toList;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.function.Function;\n\n/**\n * Defines paged result of data selection, it is rather dynamic data window than regular page, as it\n * refers to the specified selection region based on the items before and the page size, but not on\n * the page number and page size.\n *\n * <p>Examples:\n *\n * <p>Regular page.<br>\n * For page input arguments {@code skipItems = 3}, {@code pageSize = 3} and {@code totalCount = 10}\n * the page is normalized and will refer to the second page which is(item4, item5, item6):\n *\n * <pre>\n *     item1.                      <- previous page start      <- first page start\n *     item2.\n *     item3.                      <- previous page end        <- first page end\n *     item4. <- page start\n *     item5.\n *     item6. <- page end\n *     item7.                      <- next page start\n *     item8.\n *     item9.                      <- next page end\n *     item.10                                                  <- last page start/end\n * </pre>\n *\n * <ul>\n *   Result page:\n *   <li>Non-empty\n *   <li>Contains 3 items(item4, item5, item6)\n *   <li>Has the previous page(item1, item2, item3)\n *   <li>Has the next page(item7, item8, item9)\n * </ul>\n *\n * <p>Data window.<br>\n * For page input arguments {@code skipItems = 2}, {@code pageSize = 3} and {@code totalCount = 7}\n * the page will refer to the following data window:\n *\n * <pre>\n *     item1.                   <- first page start\n *     item2.\n *     item3. <- page start     <- first page end\n *     item4.\n *     item5. <- page end\n *     item6.\n *     item7.                    <- last page start/end\n * </pre>\n *\n * <ul>\n *   Result page:\n *   <li>Non-empty\n *   <li>Contains 3 items(item3, item4, item5)\n *   <li>Doesn't have the previous page(because page refers to the elements which are partially\n *       present in the first page(item3) and the second page(item4, item5)\n *   <li>Doesn't have the next page(the reason is the same to previous statement)\n * </ul>\n *\n * <p>Note that all {@code Page} instances perform reference calculations based on the given {@code\n * itemsBefore} and {@code pageSize} values which means that implementor is responsible for\n * providing correct bounds and data management.\n *\n * <p>The instances of this class are <b>NOT thread safe</b>.\n *\n * @param <ITEM_T> the type of the page items\n * @author Yevhenii Voevodin\n */\npublic class Page<ITEM_T> {\n\n  private final int pageSize;\n  private final long itemsBefore;\n  private final long totalCount;\n  private final List<ITEM_T> items;\n\n  /**\n   * Creates a new page.\n   *\n   * @param items page items\n   * @param itemsBefore items count before this page\n   * @param pageSize page size\n   * @param totalCount count of all the items\n   * @throws NullPointerException when {@code items} collection is null\n   * @throws IllegalArgumentException when {@code itemsBefore} is negative\n   * @throws IllegalArgumentException when {@code pageSize} is non-positive\n   * @throws IllegalArgumentException when {@code totalCount} is negative\n   */\n  public Page(Collection<? extends ITEM_T> items, long itemsBefore, int pageSize, long totalCount) {\n    requireNonNull(items, \"Required non-null items\");\n    this.items = new ArrayList<>(items);\n    checkArgument(itemsBefore >= 0, \"Required non-negative value of items before\");\n    this.itemsBefore = itemsBefore;\n    checkArgument(pageSize > 0, \"Required positive value of page size\");\n    this.pageSize = pageSize;\n    checkArgument(totalCount >= 0, \"Required non-negative value of total items\");\n    this.totalCount = totalCount;\n  }\n\n  /** Returns true whether this page doesn't contain items, returns false if it does. */\n  public boolean isEmpty() {\n    return items.isEmpty();\n  }\n\n  /**\n   * Returns true when the current page has the next page, otherwise when the page is the last page\n   * false will be returned.\n   */\n  public boolean hasNextPage() {\n    return getNumber() != -1 && itemsBefore + pageSize < totalCount;\n  }\n\n  /**\n   * Returns true when this page has the previous page, otherwise when the page is the first page\n   * false will be returned.\n   */\n  public boolean hasPreviousPage() {\n    return getNumber() != -1 && itemsBefore != 0;\n  }\n\n  /**\n   * Returns a reference to the next page.\n   *\n   * <p>Note: This method was designed to be used in couple with {@link #hasNextPage()}. Returns\n   * reference to the next page even when {@link #hasNextPage()} returns false.\n   */\n  public PageRef getNextPageRef() {\n    return new PageRef(itemsBefore + pageSize, pageSize);\n  }\n\n  /**\n   * Returns a reference to the previous page.\n   *\n   * <p>Note: This method was designed to be used in couple with {@link #hasPreviousPage()}. Returns\n   * reference to the first page when {@link #hasPreviousPage()} returns false.\n   */\n  public PageRef getPreviousPageRef() {\n    final long skipItems = itemsBefore <= pageSize ? 0 : itemsBefore - pageSize;\n    return new PageRef(skipItems, pageSize);\n  }\n\n  /** Returns the reference to the last page. */\n  public PageRef getLastPageRef() {\n    final long lastPageItems = totalCount % pageSize;\n    if (lastPageItems == 0) {\n      return new PageRef(totalCount <= pageSize ? 0 : totalCount - pageSize, pageSize);\n    }\n    return new PageRef(totalCount - lastPageItems, pageSize);\n  }\n\n  /** Returns the reference to the first page. */\n  public PageRef getFirstPageRef() {\n    return new PageRef(0, pageSize);\n  }\n\n  /**\n   * Returns the size of the current page.\n   *\n   * <p>Returned value is always positive and greater or equal to the value returned by the {@link\n   * #getItemsCount()} method.\n   */\n  public int getSize() {\n    return pageSize;\n  }\n\n  /**\n   * Returns page number starting from 1.\n   *\n   * <p>If the page is not regular page(it refers rather to the data window than to the certain\n   * page(e.g. skip=2, pageSize=4)) then this method returns -1.\n   */\n  public long getNumber() {\n    if (itemsBefore % pageSize != 0) {\n      return -1;\n    }\n    return itemsBefore / pageSize + 1;\n  }\n\n  /**\n   * Returns the size of the page items, returned value may be equal to 0 when the page {@link\n   * #isEmpty() is empty}, the values is the same to {@code page.getItems().size()}.\n   */\n  public int getItemsCount() {\n    return items.size();\n  }\n\n  /** Returns the count of all the items. */\n  public long getTotalItemsCount() {\n    return totalCount;\n  }\n\n  /**\n   * Returns page items or an empty list when page doesn't contain items.\n   *\n   * <p>Note that returned instance is modifiable list and modification applied on that list will\n   * affect the origin page result items, which allows components to modify items before propagating\n   * page.\n   */\n  public List<ITEM_T> getItems() {\n    return items;\n  }\n\n  /**\n   * Gets the page items and maps them with given {@code mapper}.\n   *\n   * @param mapper items mapper\n   * @param <R> the type of the result items\n   * @return the list of mapped items\n   */\n  public <R> List<R> getItems(Function<? super ITEM_T, ? extends R> mapper) {\n    requireNonNull(mapper, \"Required non-null mapper for page items\");\n    return items.stream().map(mapper::apply).collect(toList());\n  }\n\n  /**\n   * Fills the given collection with page items. This method may be convenient when needed\n   * collection different from the {@link List}.\n   *\n   * <p>The common example:\n   *\n   * <pre>{@code\n   * Set<User> user = page.fill(new TreeSet<>(comparator));\n   * }</pre>\n   *\n   * <p>Note that this method uses {@code container.addAll(items)} so be aware of putting modifiable\n   * collection.\n   *\n   * @param container collection which is used to fill result into\n   * @param <COL_T> collection type\n   * @return given collection instance {@code container} with items filled\n   * @throws NullPointerException when {@code container} is null\n   */\n  public <COL_T extends Collection<? super ITEM_T>> COL_T fill(COL_T container) {\n    requireNonNull(container, \"Required non-null items container\");\n    container.addAll(items);\n    return container;\n  }\n\n  /** Represents page reference as a combination of {@code skipItems & pageSize}. */\n  public static class PageRef {\n    private final long skipItems;\n    private final int pageSize;\n\n    private PageRef(long skipItems, int pageSize) {\n      this.skipItems = skipItems;\n      this.pageSize = pageSize;\n    }\n\n    public long getItemsBefore() {\n      return skipItems;\n    }\n\n    public int getPageSize() {\n      return pageSize;\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) {\n        return true;\n      }\n      if (!(obj instanceof PageRef)) {\n        return false;\n      }\n      final PageRef that = (PageRef) obj;\n      return skipItems == that.skipItems && pageSize == that.pageSize;\n    }\n\n    @Override\n    public int hashCode() {\n      int hash = 7;\n      hash = 31 * hash + Long.hashCode(skipItems);\n      hash = 31 * hash + pageSize;\n      return hash;\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/Pages.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\nimport java.util.ArrayList;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.NoSuchElementException;\nimport java.util.stream.Stream;\nimport java.util.stream.StreamSupport;\nimport org.eclipse.che.api.core.Page.PageRef;\n\n/**\n * Static utility methods to interact with page suppliers.\n *\n * @author Yevhenii Voevodin\n */\npublic final class Pages {\n\n  /** An experimental value used as default page size where necessary. */\n  public static final int DEFAULT_PAGE_SIZE = 50;\n\n  /**\n   * Defines an interface for page supplier.\n   *\n   * @param <E> the type of the element held by page\n   * @param <X> the type of exception thrown by page supplier\n   */\n  @FunctionalInterface\n  public interface PageSupplier<E, X extends Exception> {\n\n    /**\n     * Gets a single page.\n     *\n     * @param maxItems max items to retrieve\n     * @param skipCount how many elements to skip\n     * @return page\n     * @throws X exception thrown by supplier\n     */\n    Page<? extends E> getPage(int maxItems, long skipCount) throws X;\n  }\n\n  /**\n   * Eagerly fetches all the elements page by page and returns a stream of them.\n   *\n   * @param supplier page supplier\n   * @param size how many items to retrieve per page\n   * @param <E> the type of the element held by page\n   * @param <X> the type of exception thrown by page supplier\n   * @return stream of fetched elements\n   * @throws X when supplier throws exception\n   */\n  public static <E, X extends Exception> Stream<E> stream(PageSupplier<E, X> supplier, int size)\n      throws X {\n    return eagerFetch(supplier, size).stream();\n  }\n\n  /**\n   * Fetches elements like {@link #stream(PageSupplier, int)} method does using default page size\n   * which is equal to {@value #DEFAULT_PAGE_SIZE}.\n   */\n  public static <E, X extends Exception> Stream<E> stream(PageSupplier<E, X> supplier) throws X {\n    return stream(supplier, DEFAULT_PAGE_SIZE);\n  }\n\n  /**\n   * Eagerly fetches all the elements page by page and returns an iterable of them.\n   *\n   * @param supplier pages supplier\n   * @param size how many items to retrieve per page\n   * @param <E> the type of the element held by page\n   * @param <X> the type of exception thrown by page supplier\n   * @return iterable of fetched elements\n   * @throws X when supplier throws exception\n   */\n  public static <E, X extends Exception> Iterable<E> iterate(PageSupplier<E, X> supplier, int size)\n      throws X {\n    return eagerFetch(supplier, size);\n  }\n\n  /**\n   * Fetches elements like {@link #iterate(PageSupplier, int)} method does using default page size\n   * which is equal to {@value #DEFAULT_PAGE_SIZE}.\n   */\n  public static <E, X extends Exception> Iterable<E> iterate(PageSupplier<E, X> supplier) throws X {\n    return iterate(supplier, DEFAULT_PAGE_SIZE);\n  }\n\n  /**\n   * Returns a stream which is based on lazy fetching paged iterator.\n   *\n   * @param supplier pages supplier\n   * @param size how many items to retrieve per page\n   * @param <E> the type of the element held by page\n   * @param <X> exception thrown by supplier\n   * @return stream of elements\n   * @throws RuntimeException wraps any exception occurred during pages fetch\n   */\n  public static <E, X extends Exception> Stream<E> streamLazily(\n      PageSupplier<E, X> supplier, int size) {\n    return StreamSupport.stream(new PagedIterable<>(supplier, size).spliterator(), false);\n  }\n\n  /**\n   * Fetches elements like {@link #streamLazily(PageSupplier, int)} method does using default page\n   * size which is equal to {@value #DEFAULT_PAGE_SIZE}.\n   */\n  public static <E, X extends Exception> Stream<E> streamLazily(PageSupplier<E, X> supplier) {\n    return streamLazily(supplier, DEFAULT_PAGE_SIZE);\n  }\n\n  /**\n   * Returns an iterable which iterator lazily fetches page by page, doesn't poll the next page\n   * until the last item from previous page is not processed. The first page is polled while\n   * iterable is created.\n   *\n   * @param supplier pages supplier\n   * @param size how many items to retrieve per page\n   * @param <E> the type of the element held by page\n   * @param <X> the type of exception thrown by page supplier\n   * @return stream of elements\n   * @throws RuntimeException wraps any exception occurred during pages fetch\n   */\n  public static <E, X extends Exception> Iterable<E> iterateLazily(\n      PageSupplier<E, X> supplier, int size) {\n    return new PagedIterable<>(supplier, size);\n  }\n\n  /**\n   * Returns an iterable like {@link #streamLazily(PageSupplier, int)} method does using default\n   * page size which is equal to {@value #DEFAULT_PAGE_SIZE}.\n   */\n  public static <E, X extends Exception> Iterable<E> iterateLazily(PageSupplier<E, X> supplier) {\n    return iterateLazily(supplier, DEFAULT_PAGE_SIZE);\n  }\n\n  private static <E, X extends Exception> List<E> eagerFetch(PageSupplier<E, X> supplier, int size)\n      throws X {\n    Page<? extends E> page = supplier.getPage(size, 0);\n    ArrayList<E> container =\n        new ArrayList<>(page.hasNextPage() ? page.getItemsCount() * 2 : page.getItemsCount());\n    while (page.hasNextPage()) {\n      container.addAll(page.getItems());\n      PageRef next = page.getNextPageRef();\n      page = supplier.getPage(next.getPageSize(), next.getItemsBefore());\n    }\n    container.addAll(page.getItems());\n    return container;\n  }\n\n  private static class PagedIterable<E> implements Iterable<E> {\n\n    private final PageSupplier<E, ?> supplier;\n    private final int size;\n\n    private PagedIterable(PageSupplier<E, ?> supplier, int size) {\n      this.supplier = supplier;\n      this.size = size;\n    }\n\n    @Override\n    public Iterator<E> iterator() {\n      return new PagedIterator<>(supplier, size);\n    }\n  }\n\n  private static class PagedIterator<E> implements Iterator<E> {\n\n    private final PageSupplier<E, ?> supplier;\n    private final int size;\n\n    private Page<? extends E> page;\n    private Iterator<? extends E> delegate;\n\n    private PagedIterator(PageSupplier<E, ?> supplier, int size) {\n      this.supplier = supplier;\n      this.size = size;\n      fetchPage(0);\n    }\n\n    @Override\n    public boolean hasNext() {\n      if (delegate.hasNext()) {\n        return true;\n      }\n      if (!page.hasNextPage()) {\n        return false;\n      }\n      fetchPage(page.getNextPageRef().getItemsBefore());\n      return delegate.hasNext();\n    }\n\n    @Override\n    public E next() {\n      if (!hasNext()) {\n        throw new NoSuchElementException();\n      }\n      return delegate.next();\n    }\n\n    private void fetchPage(long skip) {\n      try {\n        page = supplier.getPage(size, skip);\n        delegate = page.getItems().iterator();\n      } catch (Exception x) {\n        throw new RuntimeException(x.getMessage(), x);\n      }\n    }\n  }\n\n  private Pages() {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/ServerException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\n\n/**\n * A {@code ServerException} is thrown as a result of an error that internal server error.\n *\n * <p>Typically in REST API such errors are converted in HTTP response with status 500.\n *\n * @author andrew00x\n */\n@SuppressWarnings(\"serial\")\npublic class ServerException extends ApiException {\n\n  public ServerException(String message) {\n    super(message);\n  }\n\n  public ServerException(ServiceError serviceError) {\n    super(serviceError);\n  }\n\n  public ServerException(Throwable cause) {\n    super(cause);\n  }\n\n  public ServerException(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/UnauthorizedException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport java.util.Collections;\nimport java.util.Map;\nimport org.eclipse.che.api.core.rest.shared.dto.ExtendedError;\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\n\n/**\n * A {@code UnauthorizedException} is thrown when caller isn't authorized to access some resource.\n *\n * <p>Typically in REST API such errors are converted in HTTP response with status 401.\n *\n * @author andrew00x\n */\n@SuppressWarnings(\"serial\")\npublic class UnauthorizedException extends ApiException {\n\n  public UnauthorizedException(String message) {\n    super(message);\n  }\n\n  public UnauthorizedException(ServiceError serviceError) {\n    super(serviceError);\n  }\n\n  public UnauthorizedException(String message, int errorCode, Map<String, String> attributes) {\n    super(\n        newDto(ExtendedError.class)\n            .withMessage(message)\n            .withErrorCode(errorCode)\n            .withAttributes(attributes));\n  }\n\n  public UnauthorizedException(String message, int errorCode) {\n    this(message, errorCode, Collections.emptyMap());\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/ValidationException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\n/**\n * Might be thrown by those system components that validate objects state before performing\n * operations with them so all conditions are met and the system is in consistent state.\n *\n * @author Yevhenii Voevodin\n */\npublic class ValidationException extends Exception {\n\n  public ValidationException(String message) {\n    super(message);\n  }\n\n  public ValidationException(String message, Throwable cause) {\n    super(message, cause);\n  }\n\n  /**\n   * Creates an exception with a formatted message. Please follow {@link String#format(String,\n   * Object...)} formatting patterns.\n   */\n  public ValidationException(String fmt, Object... args) {\n    this(String.format(fmt, args));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/cors/CheCorsFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.cors;\n\nimport com.google.inject.Singleton;\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport java.io.IOException;\nimport javax.inject.Inject;\nimport org.apache.catalina.filters.CorsFilter;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * The special filter which provides filtering requests in according to settings which are set to\n * {@link CorsFilter}. Uses {@link CheCorsFilterConfig} for providing configuration.\n *\n * @author Dmitry Shnurenko\n * @author Mykhailo Kuznietsov\n */\n@Singleton\npublic class CheCorsFilter implements Filter {\n\n  private static final Logger LOG = LoggerFactory.getLogger(CheCorsFilter.class);\n\n  private CorsFilter corsFilter;\n\n  @Inject private CheCorsFilterConfig cheCorsFilterConfig;\n\n  @Override\n  public void init(FilterConfig filterConfig) throws ServletException {\n    corsFilter = new CorsFilter();\n\n    corsFilter.init(cheCorsFilterConfig);\n    LOG.debug(\n        \"CORS initialized with parameters: 'cors.support.credentials': '{}', 'cors.allowed.origins': '{}'\",\n        cheCorsFilterConfig.getInitParameter(\"cors.support.credentials\"),\n        cheCorsFilterConfig.getInitParameter(\"cors.allowed.origins\"));\n  }\n\n  @Override\n  public void doFilter(\n      ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)\n      throws IOException, ServletException {\n    corsFilter.doFilter(servletRequest, servletResponse, filterChain);\n  }\n\n  @Override\n  public void destroy() {\n    corsFilter.destroy();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/cors/CheCorsFilterConfig.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.cors;\n\nimport static org.apache.catalina.filters.CorsFilter.PARAM_CORS_ALLOWED_HEADERS;\nimport static org.apache.catalina.filters.CorsFilter.PARAM_CORS_ALLOWED_METHODS;\nimport static org.apache.catalina.filters.CorsFilter.PARAM_CORS_ALLOWED_ORIGINS;\nimport static org.apache.catalina.filters.CorsFilter.PARAM_CORS_EXPOSED_HEADERS;\nimport static org.apache.catalina.filters.CorsFilter.PARAM_CORS_PREFLIGHT_MAXAGE;\nimport static org.apache.catalina.filters.CorsFilter.PARAM_CORS_SUPPORT_CREDENTIALS;\n\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletContext;\nimport java.util.Enumeration;\nimport java.util.HashMap;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\n\n/**\n * Basic configuration for {@link CheCorsFilter}. Allowed origings and credentials support are\n * configurable through properties.\n *\n * @author Mykhailo Kuznietsov\n */\npublic class CheCorsFilterConfig implements FilterConfig {\n\n  private final Map<String, String> filterParams;\n\n  @Inject\n  public CheCorsFilterConfig(\n      @Named(\"che.cors.allow_credentials\") Boolean allowCredentials,\n      @Named(\"che.cors.allowed_origins\") String allowedOrigins) {\n    filterParams = new HashMap<>();\n    filterParams.put(PARAM_CORS_ALLOWED_ORIGINS, allowedOrigins);\n    filterParams.put(\n        PARAM_CORS_ALLOWED_METHODS, \"GET,\" + \"POST,\" + \"HEAD,\" + \"OPTIONS,\" + \"PUT,\" + \"DELETE\");\n    filterParams.put(\n        PARAM_CORS_ALLOWED_HEADERS,\n        \"Content-Type,\"\n            + \"X-Requested-With,\"\n            + \"X-Oauth-Token,\"\n            + \"accept,\"\n            + \"Origin,\"\n            + \"Authorization,\"\n            + \"Access-Control-Request-Method,\"\n            + \"Access-Control-Request-Headers\");\n    filterParams.put(PARAM_CORS_EXPOSED_HEADERS, \"JAXRS-Body-Provided\");\n    filterParams.put(PARAM_CORS_SUPPORT_CREDENTIALS, String.valueOf(allowCredentials));\n    // preflight cache is available for 10 minutes\n    filterParams.put(PARAM_CORS_PREFLIGHT_MAXAGE, \"10\");\n  }\n\n  @Override\n  public String getFilterName() {\n    return CheCorsFilter.class.getName();\n  }\n\n  @Override\n  public ServletContext getServletContext() {\n    throw new UnsupportedOperationException(\n        \"The method is not supported in \" + CheCorsFilter.class);\n  }\n\n  @Override\n  public String getInitParameter(String key) {\n    return filterParams.get(key);\n  }\n\n  @Override\n  public Enumeration<String> getInitParameterNames() {\n    throw new UnsupportedOperationException(\n        \"The method is not supported in \" + CheCorsFilter.class);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/factory/FactoryParameter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.factory;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Provide factory parameter compatibility options.\n *\n * @author Alexander Garagatyi\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface FactoryParameter {\n  enum Obligation {\n    MANDATORY,\n    OPTIONAL\n  }\n\n  enum Version {\n    // NEVER must be the last defined constant\n    V4_0,\n    NEVER;\n\n    public static Version fromString(String v) {\n      if (null != v) {\n        switch (v) {\n          case \"4.0\":\n            return V4_0;\n        }\n      }\n\n      throw new IllegalArgumentException(\"Unknown version \" + v + \".\");\n    }\n\n    @Override\n    public String toString() {\n      return super.name().substring(1).replace('_', '.');\n    }\n  }\n\n  Obligation obligation();\n\n  boolean setByServer() default false;\n\n  boolean trackedOnly() default false;\n\n  Version deprecatedSince() default Version.NEVER;\n\n  Version ignoredSince() default Version.NEVER;\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/ClientSubscriptionHandler.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport static com.google.common.collect.Sets.newConcurrentHashSet;\n\nimport com.google.inject.Singleton;\nimport java.util.Set;\nimport javax.inject.Inject;\n\n/** A mechanism for handling subscription from the client and registered its endpointId. */\n@Singleton\npublic class ClientSubscriptionHandler {\n  public static final String CLIENT_SUBSCRIBE_METHOD_NAME = \"client/subscribe\";\n  public static final String CLIENT_UNSUBSCRIBE_METHOD_NAME = \"client/unsubscribe\";\n\n  private final Set<String> endpointIds = newConcurrentHashSet();\n\n  @Inject\n  private void configureHandlers(RequestHandlerConfigurator configurator) {\n    configurator\n        .newConfiguration()\n        .methodName(CLIENT_SUBSCRIBE_METHOD_NAME)\n        .noParams()\n        .noResult()\n        .withConsumer(endpointIds::add);\n\n    configurator\n        .newConfiguration()\n        .methodName(CLIENT_UNSUBSCRIBE_METHOD_NAME)\n        .noParams()\n        .noResult()\n        .withConsumer(endpointIds::remove);\n  }\n\n  /** returns set of endpoint ids of all registered clients. */\n  public Set<String> getEndpointIds() {\n    return endpointIds;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcComposer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport java.util.List;\n\n/**\n * Composes objects or list of objects out of JSON RPC entities (like params or results). The\n * resulting objects can be of the following types: {@link String}, {@link Boolean}, {@link Double}\n * or DTO.\n */\npublic interface JsonRpcComposer {\n  /**\n   * Composes an object out of JSON RPC params entity. The resulting object can be of the following\n   * types: {@link String}, {@link Boolean}, {@link Double} or DTO.\n   *\n   * @param params JSON RPC params\n   * @param type type of resulting object\n   * @param <T> generic type of resulting object\n   * @return object of class T\n   */\n  <T> T composeOne(JsonRpcParams params, Class<T> type);\n\n  /**\n   * Composes a list of objects out of JSON RPC params entity. The resulting objects can be of the\n   * following types: {@link String}, {@link Boolean}, {@link Double} or DTO.\n   *\n   * @param params JSON RPC params\n   * @param type type of resulting objects\n   * @param <T> generic type of resulting objects\n   * @return list of objects of class T\n   */\n  <T> List<T> composeMany(JsonRpcParams params, Class<T> type);\n\n  /**\n   * Composes an object out of JSON RPC result entity. The resulting object can be of the following\n   * types: {@link String}, {@link Boolean}, {@link Double} or DTO.\n   *\n   * @param result JSON RPC result\n   * @param type type of resulting object\n   * @param <T> generic type of resulting object\n   * @return object of class T\n   */\n  <T> T composeOne(JsonRpcResult result, Class<T> type);\n\n  /**\n   * Composes a list of objects out of JSON RPC result entity. The resulting objects can be of the\n   * following types: {@link String}, {@link Boolean}, {@link Double} or DTO.\n   *\n   * @param result JSON RPC params\n   * @param type type of resulting objects\n   * @param <T> generic type of resulting objects\n   * @return list of objects of class T\n   */\n  <T> List<T> composeMany(JsonRpcResult result, Class<T> type);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcError.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport jakarta.validation.constraints.NotNull;\n\n/** Represents JSON RPC error object */\npublic class JsonRpcError {\n  private final int code;\n  private final String message;\n\n  public JsonRpcError(int code, @NotNull String message) {\n    this.code = code;\n    this.message = message;\n  }\n\n  public String getMessage() {\n    return message;\n  }\n\n  public int getCode() {\n    return code;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcErrorTransmitter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageTransmitter;\nimport org.slf4j.Logger;\n\n/** Transmits an instance of {@link JsonRpcException} to an endpoint */\n@Singleton\npublic class JsonRpcErrorTransmitter {\n  private static final Logger LOGGER = getLogger(JsonRpcErrorTransmitter.class);\n\n  private final WebSocketMessageTransmitter transmitter;\n  private final JsonRpcMarshaller marshaller;\n\n  @Inject\n  public JsonRpcErrorTransmitter(\n      WebSocketMessageTransmitter transmitter, JsonRpcMarshaller marshaller) {\n    this.transmitter = transmitter;\n    this.marshaller = marshaller;\n  }\n\n  public void transmit(String endpointId, JsonRpcException e) {\n    checkNotNull(endpointId, \"Endpoint ID must not be null\");\n    checkArgument(!endpointId.isEmpty(), \"Endpoint ID must not be empty\");\n\n    LOGGER.debug(\"Transmitting a JSON RPC error: \" + e.getMessage());\n\n    JsonRpcError error =\n        new JsonRpcError(e.getCode(), e.getMessage() == null ? \"Unexpected error\" : e.getMessage());\n    JsonRpcResponse response = new JsonRpcResponse(e.getId(), null, error);\n    String message = marshaller.marshall(response);\n    transmitter.transmit(endpointId, message);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\n/**\n * Specific to JSON RPC exception that is to be raised when any JSON RPC related error is met.\n * According to the spec there should be an error code and an error message.\n */\npublic class JsonRpcException extends RuntimeException {\n  private final int code;\n  private final String id;\n\n  public JsonRpcException(int code, String message) {\n    this(code, message, null);\n  }\n\n  JsonRpcException(int code, String message, String id) {\n    super(message);\n    this.code = code;\n    this.id = id;\n  }\n\n  public int getCode() {\n    return code;\n  }\n\n  public String getId() {\n    return id;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcMarshaller.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\n/**\n * Marshals outgoing JSON RPC requests and responses to a string representation, used to separate\n * the business logic and the platform/parser specific logic that is responsible for\n * parsing/composing json rpc entities.\n */\npublic interface JsonRpcMarshaller {\n  /**\n   * Serializes JSON RPC response object into a string\n   *\n   * @param response response\n   * @return string representation\n   */\n  String marshall(JsonRpcResponse response);\n\n  /**\n   * Serializes JSON RPC request object into a string\n   *\n   * @param request request\n   * @return string representation\n   */\n  String marshall(JsonRpcRequest request);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcMessageReceiver.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.eclipse.che.api.core.websocket.impl.WebsocketIdService.SEPARATOR;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.List;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageReceiver;\nimport org.slf4j.Logger;\n\n/**\n * Receives and process messages coming from web socket service. Basically it validates, qualifies\n * and transforms a raw web socket message to a JSON RPC known structure and pass it further to\n * appropriate dispatchers. In case of any {@link JsonRpcException} happens during request/response\n * processing this class is also responsible for an error transmission.\n */\n@Singleton\npublic class JsonRpcMessageReceiver implements WebSocketMessageReceiver {\n  private static final Logger LOGGER = getLogger(JsonRpcMessageReceiver.class);\n\n  private final RequestDispatcher requestDispatcher;\n  private final ResponseDispatcher responseDispatcher;\n  private final JsonRpcErrorTransmitter errorTransmitter;\n  private final JsonRpcQualifier jsonRpcQualifier;\n  private final JsonRpcUnmarshaller jsonRpcUnmarshaller;\n  private final RequestProcessor requestProcessor;\n\n  @Inject\n  public JsonRpcMessageReceiver(\n      RequestDispatcher requestDispatcher,\n      ResponseDispatcher responseDispatcher,\n      JsonRpcErrorTransmitter errorTransmitter,\n      JsonRpcQualifier jsonRpcQualifier,\n      JsonRpcUnmarshaller jsonRpcUnmarshaller,\n      RequestProcessor requestProcessor) {\n    this.requestDispatcher = requestDispatcher;\n    this.responseDispatcher = responseDispatcher;\n    this.errorTransmitter = errorTransmitter;\n    this.jsonRpcQualifier = jsonRpcQualifier;\n    this.jsonRpcUnmarshaller = jsonRpcUnmarshaller;\n    this.requestProcessor = requestProcessor;\n  }\n\n  @Override\n  public void receive(String combinedEndpointId, String message) {\n    checkNotNull(combinedEndpointId, \"Endpoint ID must not be null\");\n    checkArgument(!combinedEndpointId.isEmpty(), \"Endpoint ID name must not be empty\");\n    checkNotNull(message, \"Message must not be null\");\n    checkArgument(!message.isEmpty(), \"Message must not be empty\");\n\n    LOGGER.trace(\"Receiving message: {}, from endpoint: {}\", message, combinedEndpointId);\n    if (!jsonRpcQualifier.isValidJson(message)) {\n      String error = \"An error occurred on the server while parsing the JSON text\";\n      errorTransmitter.transmit(combinedEndpointId, new JsonRpcException(-32700, error));\n    }\n\n    List<String> messages = jsonRpcUnmarshaller.unmarshalArray(message);\n    for (String innerMessage : messages) {\n      if (jsonRpcQualifier.isJsonRpcRequest(innerMessage)) {\n        String endpointId = combinedEndpointId.split(SEPARATOR)[1];\n        ProcessRequestTask task = new ProcessRequestTask(combinedEndpointId, innerMessage);\n        requestProcessor.process(endpointId, task);\n      } else if (jsonRpcQualifier.isJsonRpcResponse(innerMessage)) {\n        processResponse(combinedEndpointId, innerMessage);\n      } else {\n        processError();\n      }\n    }\n  }\n\n  private void processError() {\n    String error = \"Something wen't wrong during incoming websocket message parsing\";\n    IllegalStateException exception = new IllegalStateException(error);\n    LOGGER.error(error, exception);\n    throw exception;\n  }\n\n  private void processResponse(String endpointId, String innerMessage) {\n    JsonRpcResponse response = jsonRpcUnmarshaller.unmarshalResponse(innerMessage);\n    responseDispatcher.dispatch(endpointId, response);\n  }\n\n  private class ProcessRequestTask implements Runnable {\n\n    private final String endpointId;\n    private final String innerMessage;\n\n    public ProcessRequestTask(String endpointId, String innerMessage) {\n      this.endpointId = endpointId;\n      this.innerMessage = innerMessage;\n    }\n\n    @Override\n    public void run() {\n      JsonRpcRequest request = null;\n      try {\n        request = jsonRpcUnmarshaller.unmarshalRequest(innerMessage);\n        requestDispatcher.dispatch(endpointId, request);\n      } catch (JsonRpcException e) {\n        if (request == null || request.getId() == null) {\n          errorTransmitter.transmit(endpointId, e);\n        } else {\n          errorTransmitter.transmit(\n              endpointId, new JsonRpcException(e.getCode(), e.getMessage(), request.getId()));\n        }\n      }\n    }\n\n    @Override\n    public String toString() {\n      return \"JsonRPC request `\" + innerMessage + \"` for \" + endpointId;\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcMethodInvokerFilter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\n/**\n * Is used to check whether Json Rpc method can be invoked. For example, can be used to check\n * permission before method invocation.\n *\n * @author Sergii Leshchenko\n */\npublic interface JsonRpcMethodInvokerFilter {\n\n  /**\n   * Check whether supplied method can be invoked.\n   *\n   * @param method method name that is going to be invoked\n   * @param params actual method parameters\n   * @throws JsonRpcException if method can not be invoked cause current environment context, e.g.\n   *     for current user, with current request attributes, etc. JsonRpcException should contain the\n   *     corresponding message and code.\n   */\n  void accept(String method, Object... params) throws JsonRpcException;\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcParams.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport static java.util.Collections.singletonList;\n\nimport java.util.List;\n\n/** Represents JSON RPC params object */\npublic class JsonRpcParams {\n  private List<?> params;\n  private boolean single;\n\n  public JsonRpcParams(Object params) {\n    this.params = singletonList(params);\n    this.single = true;\n  }\n\n  public JsonRpcParams(List<?> params) {\n    this.params = params;\n    this.single = false;\n  }\n\n  public boolean isSingle() {\n    return single;\n  }\n\n  public List<?> getMany() {\n    return params;\n  }\n\n  public Object getOne() {\n    return params.get(0);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcPromise.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static com.google.common.base.Preconditions.checkState;\n\nimport java.util.Optional;\nimport java.util.function.BiConsumer;\nimport java.util.function.Consumer;\n\n/**\n * Simple promise like binary consumer holder. First consumer's argument always represents endpoint\n * identifier, while the second can be of arbitrary type and depends on business logic.\n *\n * @param <R> type of second argument of binary consumer\n */\npublic class JsonRpcPromise<R> {\n  private BiConsumer<String, R> successConsumer;\n  private BiConsumer<String, JsonRpcError> failureConsumer;\n  private Runnable timeoutRunnable;\n\n  public Optional<BiConsumer<String, R>> getSuccessConsumer() {\n    return Optional.ofNullable(successConsumer);\n  }\n\n  public Optional<BiConsumer<String, JsonRpcError>> getFailureConsumer() {\n    return Optional.ofNullable(failureConsumer);\n  }\n\n  Optional<Runnable> getTimeoutRunnable() {\n    return Optional.ofNullable(timeoutRunnable);\n  }\n\n  /**\n   * Set timeout runnable to be called on this promise timeout.\n   *\n   * @param runnable timeout runnable\n   * @return the instance of this very promise\n   */\n  public JsonRpcPromise<R> onTimeout(Runnable runnable) {\n    checkNotNull(runnable, \"JSON RPC timeout runnable argument must not be null\");\n    checkState(this.timeoutRunnable == null, \"JSON RPC timeout runnable field must not be set\");\n    this.timeoutRunnable = runnable;\n    return this;\n  }\n\n  /**\n   * Set binary consumer to be called on this promise resolution. The first consumer argument is an\n   * endpoint that the responses comes from while the second consumer argument is actually the value\n   * of response result.\n   *\n   * @param biConsumer binary consumer\n   * @return the instance of this very promise\n   */\n  public JsonRpcPromise<R> onSuccess(BiConsumer<String, R> biConsumer) {\n    checkNotNull(biConsumer, \"JSON RPC success consumer argument must not be null\");\n    checkState(this.successConsumer == null, \"JSON RPC success field must not be set\");\n    this.successConsumer = biConsumer;\n    return this;\n  }\n\n  /**\n   * Set consumer to be called on this promise resolution. Ths variant of promise configuration must\n   * be used only when you need not the value of endpoint ID. The only consumer argument is the\n   * value of response result.\n   *\n   * @param consumer consumer\n   * @return the instance of this very promise\n   */\n  public JsonRpcPromise<R> onSuccess(Consumer<R> consumer) {\n    checkNotNull(consumer, \"JSON RPC success consumer argument must not be null\");\n    checkState(this.successConsumer == null, \"JSON RPC success consumer field must not be set\");\n    this.successConsumer = (s, r) -> consumer.accept(r);\n    return this;\n  }\n\n  /**\n   * Set runnable to be called on this promise resolution. Ths variant of promise configuration must\n   * be used only when you need not both the value of endpoint ID and the value of response result.\n   *\n   * @param runnable runnable\n   * @return the instance of this very promise\n   */\n  public JsonRpcPromise<R> onSuccess(Runnable runnable) {\n    checkNotNull(runnable, \"JSON RPC success runnable argument must not be null\");\n    checkState(this.successConsumer == null, \"JSON RPC success field must not be set\");\n    this.successConsumer = (s, r) -> runnable.run();\n    return this;\n  }\n\n  /**\n   * Set binary consumer to be called on promise rejection. The first consumer argument is an\n   * endpoint that the responses comes from while the second consumer argument is actually the value\n   * of response error.\n   *\n   * @param biConsumer binary consumer\n   * @return the instance of this very promise\n   */\n  public JsonRpcPromise<R> onFailure(BiConsumer<String, JsonRpcError> biConsumer) {\n    checkNotNull(biConsumer, \"JSON RPC failure consumer argument must not be null\");\n    checkState(this.failureConsumer == null, \"JSON RPC failure consumer field must not be set\");\n    this.failureConsumer = biConsumer;\n    return this;\n  }\n\n  /**\n   * Set consumer to be called on this promise rejection. Ths variant of promise configuration must\n   * be used only when you need not the value of endpoint ID. The only consumer argument is the\n   * value of response result.\n   *\n   * @param consumer consumer\n   * @return the instance of this very promise\n   */\n  public JsonRpcPromise<R> onFailure(Consumer<JsonRpcError> consumer) {\n    checkNotNull(consumer, \"JSON RPC failure consumer argument must not be null\");\n    checkState(this.failureConsumer == null, \"JSON RPC failure consumer field must not be set\");\n    this.failureConsumer = (s, e) -> consumer.accept(e);\n    return this;\n  }\n\n  /**\n   * Set runnable to be called on this promise rejection. Ths variant of promise configuration must\n   * be used only when you need not both the value of endpoint ID and the value of response error.\n   *\n   * @param runnable runnable\n   * @return the instance of this very promise\n   */\n  public JsonRpcPromise<R> onFailure(Runnable runnable) {\n    checkNotNull(runnable, \"JSON RPC success runnable argument must not be null\");\n    checkState(this.successConsumer == null, \"JSON RPC success field must not be set\");\n    this.successConsumer = (s, e) -> runnable.run();\n    return this;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcQualifier.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\npublic interface JsonRpcQualifier {\n  boolean isValidJson(String message);\n\n  boolean isJsonRpcRequest(String message);\n\n  boolean isJsonRpcResponse(String message);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcRequest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\n/** Represents JSON RPC request object */\npublic class JsonRpcRequest {\n  private final String id;\n  private final String method;\n  private final JsonRpcParams params;\n\n  public JsonRpcRequest(String id, String method, JsonRpcParams params) {\n    this.id = id;\n    this.method = method;\n    this.params = params;\n  }\n\n  public boolean hasParams() {\n    return params != null;\n  }\n\n  public boolean hasId() {\n    return id != null;\n  }\n\n  public String getMethod() {\n    return method;\n  }\n\n  public String getId() {\n    return id;\n  }\n\n  public JsonRpcParams getParams() {\n    return params;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcResponse.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\n/**\n * Represents JSON RPC response object. Can be constructed out of stringified json object or by\n * passing specific parameters.\n */\npublic class JsonRpcResponse {\n  private final String id;\n  private final JsonRpcResult result;\n  private final JsonRpcError error;\n\n  public JsonRpcResponse(String id, JsonRpcResult result, JsonRpcError error) {\n    this.id = id;\n    this.result = result;\n    this.error = error;\n  }\n\n  public boolean hasId() {\n    return id != null;\n  }\n\n  public boolean hasError() {\n    return error != null;\n  }\n\n  public boolean hasResult() {\n    return result != null;\n  }\n\n  public JsonRpcError getError() {\n    return error;\n  }\n\n  public String getId() {\n    return id;\n  }\n\n  public JsonRpcResult getResult() {\n    return result;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcResult.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport static java.util.Collections.singletonList;\n\nimport java.util.List;\n\n/** Represents JSON RPC result object */\npublic class JsonRpcResult {\n  private List<?> result;\n  private boolean single;\n\n  public JsonRpcResult(Object result) {\n    this.result = singletonList(result);\n    this.single = true;\n  }\n\n  public JsonRpcResult(List<?> result) {\n    this.result = result;\n    this.single = false;\n  }\n\n  public boolean isSingle() {\n    return single;\n  }\n\n  public List<?> getMany() {\n    return result;\n  }\n\n  public Object getOne() {\n    return result.get(0);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcUnmarshaller.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport java.util.List;\n\n/** Transforms plain text messages into JSON RPC structures. */\npublic interface JsonRpcUnmarshaller {\n  /**\n   * Creates an array of stringified JSON RPC structures, which can further be unmarshalled\n   * separately.\n   *\n   * @param message incoming message\n   * @return array of serialized JSON RPC\n   */\n  List<String> unmarshalArray(String message);\n\n  /**\n   * Creates a request out of a plain text message\n   *\n   * @param message plain text message\n   * @return JSON RPC request entity\n   */\n  JsonRpcRequest unmarshalRequest(String message);\n\n  /**\n   * Creates a response out of a plain text message\n   *\n   * @param message plain text message\n   * @return JSON RPC response entity\n   */\n  JsonRpcResponse unmarshalResponse(String message);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcUtils.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\n/** Simple utility class */\npublic class JsonRpcUtils {\n  @SuppressWarnings(\"unchecked\")\n  public static <T> T cast(Object object) {\n    return (T) object;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/NotificationHandler.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\n/**\n * Handler corresponding to processing JSON RPC requests that have no ID specified (notifications).\n */\npublic interface NotificationHandler {\n  void handle(String endpointId, JsonRpcParams params) throws JsonRpcException;\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/RequestDispatcher.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.slf4j.Logger;\n\n/**\n * Dispatches incoming JSON RPC requests and notifications. If during dispatching happens any kind\n * of error related to JSON RPC it throws appropriate exception {@link JsonRpcException}.\n */\n@Singleton\npublic class RequestDispatcher {\n  private static final Logger LOGGER = getLogger(RequestDispatcher.class);\n\n  private final RequestHandlerManager requestHandlerManager;\n\n  @Inject\n  public RequestDispatcher(RequestHandlerManager requestHandlerManager) {\n    this.requestHandlerManager = requestHandlerManager;\n  }\n\n  public void dispatch(String endpointId, JsonRpcRequest request) throws JsonRpcException {\n    checkNotNull(endpointId, \"Endpoint ID must not be null\");\n    checkArgument(!endpointId.isEmpty(), \"Endpoint ID must not be empty\");\n    checkNotNull(request, \"Request must not be null\");\n\n    LOGGER.trace(\"Dispatching request: \" + request + \", endpoint: \" + endpointId);\n\n    String method = request.getMethod();\n\n    JsonRpcParams params = request.getParams();\n\n    if (request.hasId()) {\n      LOGGER.trace(\"Request has ID\");\n      String requestId = request.getId();\n      checkRequestHandlerRegistration(method, requestId);\n      requestHandlerManager.handle(endpointId, requestId, method, params);\n    } else {\n      LOGGER.trace(\"Request has no ID -> it is a notification\");\n      checkNotificationHandlerRegistration(method);\n      requestHandlerManager.handle(endpointId, method, params);\n    }\n  }\n\n  private void checkNotificationHandlerRegistration(String method) throws JsonRpcException {\n    if (!requestHandlerManager.isRegistered(method)) {\n      LOGGER.error(\"No corresponding to method '\" + method + \"' handler is registered\");\n      throw new JsonRpcException(-32601, \"Method '\" + method + \"' not registered\");\n    }\n  }\n\n  private void checkRequestHandlerRegistration(String method, String requestId)\n      throws JsonRpcException {\n    if (!requestHandlerManager.isRegistered(method)) {\n      LOGGER.error(\"No corresponding to method '\" + method + \"' handler is registered\");\n      throw new JsonRpcException(-32601, \"Method '\" + method + \"' not registered\", requestId);\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/RequestHandler.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\n/** Handler corresponding to processing JSON RPC requests. */\npublic interface RequestHandler {\n  JsonRpcResult handle(String endpointId, JsonRpcParams params) throws JsonRpcException;\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/RequestHandlerConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport org.eclipse.che.api.core.jsonrpc.commons.reception.MethodNameConfigurator;\n\n/** Factory to provide facilities for dynamic configuring request handlers. */\npublic interface RequestHandlerConfigurator {\n  MethodNameConfigurator newConfiguration();\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/RequestHandlerManager.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport com.google.common.collect.ArrayListMultimap;\nimport com.google.common.collect.Multimap;\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.function.BiConsumer;\nimport java.util.function.BiFunction;\nimport java.util.function.Consumer;\nimport java.util.function.Function;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageTransmitter;\nimport org.slf4j.Logger;\n\n/**\n * Manages request handlers. There are nine types of such handlers that differs by the type and\n * number of incoming parameters and outgoing results:\n *\n * <ul>\n *   <li>{@link NoneToNoneHandler} - to receive a notification w/o parameters\n *   <li>{@link NoneToOneHandler} - to receive a request w/o parameters and a single result\n *   <li>{@link NoneToManyHandler} - to receive a request w/o parameters and multiple results\n *   <li>{@link OneToNoneHandler} - to receive a notification with a single parameter\n *   <li>{@link OneToOneHandler} - to receive a request with a single parameter and a single result\n *   <li>{@link OneToManyHandler}- to receive a request with a single parameter and multiple results\n *   <li>{@link ManyToNoneHandler} - to receive a notification with multiple parameters\n *   <li>{@link ManyToOneHandler} - to receive request with multiple parameters and a single result\n *   <li>{@link ManyToManyHandler} - to receive request with multiple parameters and multiple\n *       results\n * </ul>\n */\n@Singleton\npublic class RequestHandlerManager {\n  private static final Logger LOGGER = getLogger(RequestHandlerManager.class);\n\n  private final Multimap<String, JsonRpcMethodInvokerFilter> filters = ArrayListMultimap.create();\n\n  private final Map<String, Category> methodToCategory = new ConcurrentHashMap<>();\n  private final Map<String, OneToOneHandler> oneToOneHandlers = new ConcurrentHashMap<>();\n  private final Map<String, OneToPromiseOneHandler> oneToPromiseOneHandlers =\n      new ConcurrentHashMap<>();\n  private final Map<String, OneToManyHandler> oneToManyHandlers = new ConcurrentHashMap<>();\n  private final Map<String, OneToNoneHandler> oneToNoneHandlers = new ConcurrentHashMap<>();\n  private final Map<String, ManyToOneHandler> manyToOneHandlers = new ConcurrentHashMap<>();\n  private final Map<String, ManyToManyHandler> manyToManyHandlers = new ConcurrentHashMap<>();\n  private final Map<String, ManyToNoneHandler> manyToNoneHandlers = new ConcurrentHashMap<>();\n  private final Map<String, NoneToOneHandler> noneToOneHandlers = new ConcurrentHashMap<>();\n  private final Map<String, NoneToManyHandler> noneToManyHandlers = new ConcurrentHashMap<>();\n  private final Map<String, NoneToNoneHandler> noneToNoneHandlers = new ConcurrentHashMap<>();\n\n  private final WebSocketMessageTransmitter transmitter;\n  private final JsonRpcComposer dtoComposer;\n  private final JsonRpcMarshaller marshaller;\n\n  @Inject\n  public RequestHandlerManager(\n      WebSocketMessageTransmitter transmitter,\n      JsonRpcComposer dtoComposer,\n      JsonRpcMarshaller marshaller) {\n    this.transmitter = transmitter;\n    this.dtoComposer = dtoComposer;\n    this.marshaller = marshaller;\n  }\n\n  public synchronized <P, R> void registerOneToOne(\n      String method, Class<P> pClass, Class<R> rClass, BiFunction<String, P, R> biFunction) {\n    mustNotBeRegistered(method);\n\n    methodToCategory.put(method, Category.ONE_TO_ONE);\n    oneToOneHandlers.put(method, new OneToOneHandler<>(pClass, rClass, biFunction));\n  }\n\n  public synchronized void registerMethodInvokerFilter(\n      JsonRpcMethodInvokerFilter filter, String... methods) {\n    for (String method : methods) {\n      filters.put(method, filter);\n    }\n  }\n\n  public synchronized <P, R> void registerOneToPromiseOne(\n      String method,\n      Class<P> pClass,\n      Class<R> rClass,\n      BiFunction<String, P, JsonRpcPromise<R>> function) {\n    mustNotBeRegistered(method);\n    methodToCategory.put(method, Category.ONE_TO_PROMISE_ONE);\n    oneToPromiseOneHandlers.put(method, new OneToPromiseOneHandler<>(pClass, rClass, function));\n  }\n\n  public synchronized <P, R> void registerOneToMany(\n      String method, Class<P> pClass, Class<R> rClass, BiFunction<String, P, List<R>> biFunction) {\n    mustNotBeRegistered(method);\n\n    methodToCategory.put(method, Category.ONE_TO_MANY);\n    oneToManyHandlers.put(method, new OneToManyHandler<>(pClass, rClass, biFunction));\n  }\n\n  public synchronized <P> void registerOneToNone(\n      String method, Class<P> pClass, BiConsumer<String, P> biConsumer) {\n    mustNotBeRegistered(method);\n\n    methodToCategory.put(method, Category.ONE_TO_NONE);\n    oneToNoneHandlers.put(method, new OneToNoneHandler<>(pClass, biConsumer));\n  }\n\n  public synchronized <P, R> void registerManyToOne(\n      String method, Class<P> pClass, Class<R> rClass, BiFunction<String, List<P>, R> biFunction) {\n    mustNotBeRegistered(method);\n\n    methodToCategory.put(method, Category.MANY_TO_ONE);\n    manyToOneHandlers.put(method, new ManyToOneHandler<>(pClass, rClass, biFunction));\n  }\n\n  public synchronized <P, R> void registerManyToMany(\n      String method,\n      Class<P> pClass,\n      Class<R> rClass,\n      BiFunction<String, List<P>, List<R>> function) {\n    mustNotBeRegistered(method);\n\n    methodToCategory.put(method, Category.MANY_TO_MANY);\n    manyToManyHandlers.put(method, new ManyToManyHandler<>(pClass, rClass, function));\n  }\n\n  public synchronized <P> void registerManyToNone(\n      String method, Class<P> pClass, BiConsumer<String, List<P>> biConsumer) {\n    mustNotBeRegistered(method);\n\n    methodToCategory.put(method, Category.MANY_TO_NONE);\n    manyToNoneHandlers.put(method, new ManyToNoneHandler<>(pClass, biConsumer));\n  }\n\n  public synchronized <R> void registerNoneToOne(\n      String method, Class<R> rClass, Function<String, R> function) {\n    mustNotBeRegistered(method);\n\n    methodToCategory.put(method, Category.NONE_TO_ONE);\n    noneToOneHandlers.put(method, new NoneToOneHandler<>(rClass, function));\n  }\n\n  public synchronized <R> void registerNoneToMany(\n      String method, Class<R> rClass, Function<String, List<R>> function) {\n    mustNotBeRegistered(method);\n\n    methodToCategory.put(method, Category.NONE_TO_MANY);\n    noneToManyHandlers.put(method, new NoneToManyHandler<>(rClass, function));\n  }\n\n  public synchronized void registerNoneToNone(String method, Consumer<String> consumer) {\n    mustNotBeRegistered(method);\n\n    methodToCategory.put(method, Category.NONE_TO_NONE);\n    noneToNoneHandlers.put(method, new NoneToNoneHandler(consumer));\n  }\n\n  public boolean isRegistered(String method) {\n    return methodToCategory.containsKey(method);\n  }\n\n  public synchronized boolean deregister(String method) {\n    Category category = methodToCategory.remove(method);\n\n    if (category == null) {\n      return false;\n    }\n\n    switch (category) {\n      case ONE_TO_ONE:\n        oneToOneHandlers.remove(method);\n        break;\n      case ONE_TO_MANY:\n        oneToManyHandlers.remove(method);\n        break;\n      case ONE_TO_NONE:\n        oneToNoneHandlers.remove(method);\n        break;\n      case MANY_TO_ONE:\n        manyToOneHandlers.remove(method);\n        break;\n      case MANY_TO_MANY:\n        manyToManyHandlers.remove(method);\n        break;\n      case MANY_TO_NONE:\n        manyToNoneHandlers.remove(method);\n        break;\n      case NONE_TO_ONE:\n        noneToOneHandlers.remove(method);\n        break;\n      case NONE_TO_MANY:\n        noneToManyHandlers.remove(method);\n        break;\n      case NONE_TO_NONE:\n        noneToNoneHandlers.remove(method);\n        break;\n      case ONE_TO_PROMISE_ONE:\n        oneToPromiseOneHandlers.remove(method);\n        break;\n    }\n\n    return true;\n  }\n\n  public <P, R> void handle(\n      String endpointId, String requestId, String method, JsonRpcParams params) {\n    mustBeRegistered(method);\n\n    switch (methodToCategory.get(method)) {\n      case ONE_TO_ONE:\n        oneToOneHandlers.get(method).handle(endpointId, requestId, method, params);\n        break;\n      case ONE_TO_MANY:\n        oneToManyHandlers.get(method).handle(endpointId, requestId, method, params);\n        break;\n      case MANY_TO_ONE:\n        manyToOneHandlers.get(method).handle(endpointId, requestId, method, params);\n        break;\n      case MANY_TO_MANY:\n        manyToManyHandlers.get(method).handle(endpointId, requestId, method, params);\n        break;\n      case NONE_TO_ONE:\n        noneToOneHandlers.get(method).handle(endpointId, requestId, method, params);\n        break;\n      case NONE_TO_MANY:\n        noneToManyHandlers.get(method).handle(endpointId, requestId, method, params);\n        break;\n      case ONE_TO_PROMISE_ONE:\n        oneToPromiseOneHandlers.get(method).handle(endpointId, requestId, method, params);\n        break;\n      default:\n        LOGGER.error(\"Something went wrong trying to find out handler category\");\n    }\n  }\n\n  public void handle(String endpointId, String method, JsonRpcParams params) {\n    mustBeRegistered(method);\n\n    switch (methodToCategory.get(method)) {\n      case ONE_TO_NONE:\n        oneToNoneHandlers.get(method).handle(endpointId, method, params);\n        break;\n      case MANY_TO_NONE:\n        manyToNoneHandlers.get(method).handle(endpointId, method, params);\n        break;\n      case NONE_TO_NONE:\n        noneToNoneHandlers.get(method).handle(method, endpointId);\n        break;\n      default:\n        LOGGER.error(\"Something went wrong trying to find out handler category\");\n    }\n  }\n\n  private void mustBeRegistered(String method) {\n    if (!isRegistered(method)) {\n      String message = \"Method '\" + method + \"' is not registered\";\n      LOGGER.error(message);\n      throw new IllegalStateException(message);\n    }\n  }\n\n  private void mustNotBeRegistered(String method) {\n    if (isRegistered(method)) {\n      String message = \"Method '\" + method + \"' is already registered\";\n      LOGGER.error(message);\n      throw new IllegalStateException(message);\n    }\n  }\n\n  private <P> List<P> composeMany(JsonRpcParams params, Class<P> pClass) {\n    return dtoComposer.composeMany(params, pClass);\n  }\n\n  private <P> P composeOne(JsonRpcParams params, Class<P> pClass) {\n    return dtoComposer.composeOne(params, pClass);\n  }\n\n  private void filter(String method, Object... param) {\n    for (JsonRpcMethodInvokerFilter filter : filters.get(method)) {\n      filter.accept(method, param);\n    }\n  }\n\n  private <R> void transmitOne(String endpointId, String id, R result) {\n    JsonRpcResult jsonRpcResult = new JsonRpcResult(result);\n    JsonRpcResponse jsonRpcResponse = new JsonRpcResponse(id, jsonRpcResult, null);\n    String message = marshaller.marshall(jsonRpcResponse);\n    transmitter.transmit(endpointId, message);\n  }\n\n  private void transmitMany(String endpointId, String id, List<?> result) {\n    JsonRpcResult jsonRpcResult = new JsonRpcResult(result);\n    JsonRpcResponse jsonRpcResponse = new JsonRpcResponse(id, jsonRpcResult, null);\n    String message = marshaller.marshall(jsonRpcResponse);\n    transmitter.transmit(endpointId, message);\n  }\n\n  private <R> void transmitPromiseOne(\n      String endpointId, String requestId, JsonRpcPromise<R> promise) {\n    promise.onSuccess(result -> transmitOne(endpointId, requestId, result));\n    promise.onFailure(\n        jsonRpcError -> {\n          JsonRpcResponse jsonRpcResponse = new JsonRpcResponse(requestId, null, jsonRpcError);\n          String message = marshaller.marshall(jsonRpcResponse);\n          transmitter.transmit(endpointId, message);\n        });\n  }\n\n  public enum Category {\n    ONE_TO_ONE,\n    ONE_TO_MANY,\n    ONE_TO_NONE,\n    MANY_TO_ONE,\n    MANY_TO_MANY,\n    MANY_TO_NONE,\n    NONE_TO_ONE,\n    NONE_TO_MANY,\n    NONE_TO_NONE,\n    ONE_TO_PROMISE_ONE\n  }\n\n  private class OneToOneHandler<P, R> {\n    private final Class<P> pClass;\n    private final Class<R> rClass;\n    private final BiFunction<String, P, R> biFunction;\n\n    private OneToOneHandler(Class<P> pClass, Class<R> rClass, BiFunction<String, P, R> biFunction) {\n      this.pClass = pClass;\n      this.rClass = rClass;\n      this.biFunction = biFunction;\n    }\n\n    private void handle(String endpointId, String requestId, String method, JsonRpcParams params) {\n      P param = composeOne(params, pClass);\n      for (JsonRpcMethodInvokerFilter filter : filters.get(method)) {\n        filter.accept(method, param);\n      }\n      transmitOne(endpointId, requestId, biFunction.apply(endpointId, param));\n    }\n  }\n\n  private class OneToPromiseOneHandler<P, R> {\n    private final Class<P> pClass;\n    private final Class<R> rClass;\n    private BiFunction<String, P, JsonRpcPromise<R>> function;\n\n    private OneToPromiseOneHandler(\n        Class<P> pClass, Class<R> rClass, BiFunction<String, P, JsonRpcPromise<R>> function) {\n      this.pClass = pClass;\n      this.rClass = rClass;\n      this.function = function;\n    }\n\n    private void handle(String endpointId, String requestId, String method, JsonRpcParams params) {\n      P param = dtoComposer.composeOne(params, pClass);\n      filter(method, param);\n      transmitPromiseOne(endpointId, requestId, function.apply(endpointId, param));\n    }\n  }\n\n  private class OneToManyHandler<P, R> {\n    private final Class<P> pClass;\n    private final Class<R> rClass;\n    private final BiFunction<String, P, List<R>> biFunction;\n\n    private OneToManyHandler(\n        Class<P> pClass, Class<R> rClass, BiFunction<String, P, List<R>> biFunction) {\n      this.pClass = pClass;\n      this.rClass = rClass;\n      this.biFunction = biFunction;\n    }\n\n    private void handle(String endpointId, String requestId, String method, JsonRpcParams params) {\n      P param = dtoComposer.composeOne(params, pClass);\n      filter(method, param);\n      transmitMany(endpointId, requestId, biFunction.apply(endpointId, param));\n    }\n  }\n\n  private class OneToNoneHandler<P> {\n    private final Class<P> pClass;\n    private final BiConsumer<String, P> biConsumer;\n\n    private OneToNoneHandler(Class<P> pClass, BiConsumer<String, P> biConsumer) {\n      this.pClass = pClass;\n      this.biConsumer = biConsumer;\n    }\n\n    private void handle(String endpointId, String method, JsonRpcParams params) {\n      P param = composeOne(params, pClass);\n      filter(method, param);\n      biConsumer.accept(endpointId, param);\n    }\n  }\n\n  private class ManyToOneHandler<P, R> {\n    private final Class<P> pClass;\n    private final Class<R> rClass;\n    private final BiFunction<String, List<P>, R> biFunction;\n\n    private ManyToOneHandler(\n        Class<P> pClass, Class<R> rClass, BiFunction<String, List<P>, R> biFunction) {\n      this.pClass = pClass;\n      this.rClass = rClass;\n      this.biFunction = biFunction;\n    }\n\n    private void handle(\n        String endpointId, String requestId, String method, JsonRpcParams jsonParam) {\n      List<P> param = dtoComposer.composeMany(jsonParam, pClass);\n      filter(method, param);\n      transmitOne(endpointId, requestId, biFunction.apply(endpointId, param));\n    }\n  }\n\n  private class ManyToManyHandler<P, R> {\n    private final Class<P> pClass;\n    private final Class<R> rClass;\n    private final BiFunction<String, List<P>, List<R>> biFunction;\n\n    private ManyToManyHandler(\n        Class<P> pClass, Class<R> rClass, BiFunction<String, List<P>, List<R>> biFunction) {\n      this.pClass = pClass;\n      this.rClass = rClass;\n      this.biFunction = biFunction;\n    }\n\n    private void handle(\n        String endpointId, String requestId, String method, JsonRpcParams jsonParams) {\n      List<P> params = dtoComposer.composeMany(jsonParams, pClass);\n      filter(method, params);\n      transmitMany(endpointId, requestId, biFunction.apply(endpointId, params));\n    }\n  }\n\n  private class ManyToNoneHandler<P> {\n    private final Class<P> pClass;\n    private final BiConsumer<String, List<P>> biConsumer;\n\n    private ManyToNoneHandler(Class<P> pClass, BiConsumer<String, List<P>> biConsumer) {\n      this.pClass = pClass;\n      this.biConsumer = biConsumer;\n    }\n\n    private void handle(String endpointId, String method, JsonRpcParams params) {\n      List<P> listDto = composeMany(params, pClass);\n      filter(method, listDto);\n      biConsumer.accept(endpointId, listDto);\n    }\n\n    public List<P> compose(JsonRpcParams params) {\n      return dtoComposer.composeMany(params, pClass);\n    }\n  }\n\n  private class NoneToOneHandler<R> {\n    private final Class<R> rClass;\n    private final Function<String, R> function;\n\n    private NoneToOneHandler(Class<R> rClass, Function<String, R> function) {\n      this.rClass = rClass;\n      this.function = function;\n    }\n\n    private void handle(String endpointId, String requestId, String method, JsonRpcParams params) {\n      filter(method);\n      transmitOne(endpointId, requestId, function.apply(endpointId));\n    }\n  }\n\n  private class NoneToManyHandler<R> {\n    private final Class<R> rClass;\n    private final Function<String, List<R>> function;\n\n    private NoneToManyHandler(Class<R> rClass, Function<String, List<R>> function) {\n      this.rClass = rClass;\n      this.function = function;\n    }\n\n    private void handle(String endpointId, String requestId, String method, JsonRpcParams params) {\n      filter(method);\n      transmitMany(endpointId, requestId, function.apply(endpointId));\n    }\n  }\n\n  private class NoneToNoneHandler {\n    private final Consumer<String> consumer;\n\n    private NoneToNoneHandler(Consumer<String> consumer) {\n      this.consumer = consumer;\n    }\n\n    private void handle(String method, String endpointId) {\n      filter(method);\n      consumer.accept(endpointId);\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/RequestProcessor.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\n/** Platfrom dependent implementation of of request handler processing algorithm. */\npublic interface RequestProcessor {\n  /**\n   * Process a runnable interface\n   *\n   * @param endpointId an endpoint that requested the processing\n   * @param runnable runnable to be called for processing of a request\n   */\n  void process(String endpointId, Runnable runnable);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/RequestProcessorConfigurationProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport java.util.concurrent.ExecutorService;\n\n/** Request processor configurator */\npublic interface RequestProcessorConfigurationProvider {\n\n  /**\n   * Get request processor configuration for specified endpoint.\n   *\n   * @param endpointId endpoint id\n   */\n  Configuration get(String endpointId);\n\n  /** Request processor configuration */\n  interface Configuration {\n\n    String getEndpointId();\n\n    ExecutorService getExecutorService();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/RequestTransmitter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport org.eclipse.che.api.core.jsonrpc.commons.transmission.EndpointIdConfigurator;\n\n/** Simple factory that provides facilities to manually build JSON RPC requests */\npublic interface RequestTransmitter {\n  EndpointIdConfigurator newRequest();\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/ResponseDispatcher.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.concurrent.ConcurrentHashMap;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.slf4j.Logger;\n\n/** Dispatches JSON RPC responses */\n@Singleton\npublic class ResponseDispatcher {\n  private static final Logger LOGGER = getLogger(ResponseDispatcher.class);\n\n  private final JsonRpcComposer composer;\n  private final TimeoutActionRunner timeoutActionRunner;\n\n  private final Map<String, SingleTypedPromise<?>> singleTypedPromises = new ConcurrentHashMap<>();\n  private final Map<String, ListTypedPromise<?>> listTypedPromises = new ConcurrentHashMap<>();\n\n  @Inject\n  public ResponseDispatcher(JsonRpcComposer composer, TimeoutActionRunner timeoutActionRunner) {\n    this.composer = composer;\n    this.timeoutActionRunner = timeoutActionRunner;\n  }\n\n  private static void checkArguments(String endpointId, String requestId, Class<?> rClass) {\n    checkNotNull(endpointId, \"Endpoint ID must not be null\");\n    checkArgument(!endpointId.isEmpty(), \"Endpoint ID must not be empty\");\n\n    checkNotNull(requestId, \"Request ID must not be null\");\n    checkArgument(!requestId.isEmpty(), \"Request ID must not be empty\");\n\n    checkNotNull(rClass, \"Result class must not be null\");\n  }\n\n  private static String generateKey(String endpointId, String requestId) {\n    return endpointId + '@' + requestId;\n  }\n\n  public void dispatch(String endpointId, JsonRpcResponse response) {\n    checkNotNull(endpointId, \"Endpoint ID name must not be null\");\n    checkArgument(!endpointId.isEmpty(), \"Endpoint ID name must not be empty\");\n    checkNotNull(response, \"Response name must not be null\");\n\n    String responseId = response.getId();\n    if (responseId == null) {\n      return;\n    }\n\n    String key = generateKey(endpointId, responseId);\n\n    if (response.hasResult()) {\n      dispatchResult(endpointId, response, key);\n    } else if (response.hasError()) {\n      dispatchError(endpointId, response, key);\n    } else {\n      LOGGER.error(\"Received incorrect response: no error, no result\");\n    }\n  }\n\n  public synchronized <R> JsonRpcPromise<R> registerPromiseForSingleObject(\n      String endpointId, String requestId, Class<R> rClass, int timeoutInMillis) {\n    checkArguments(endpointId, requestId, rClass);\n\n    SingleTypedPromise<R> promise = new SingleTypedPromise<>(rClass);\n    String key = generateKey(endpointId, requestId);\n    singleTypedPromises.put(key, promise);\n    if (timeoutInMillis > 0) {\n      timeoutActionRunner.schedule(\n          timeoutInMillis, () -> runTimeoutConsumer(singleTypedPromises.remove(key)));\n    }\n    return promise;\n  }\n\n  public synchronized <R> JsonRpcPromise<List<R>> registerPromiseForListOfObjects(\n      String endpointId, String requestId, Class<R> rClass, int timeoutInMillis) {\n    checkArguments(endpointId, requestId, rClass);\n\n    ListTypedPromise<R> promise = new ListTypedPromise<>(rClass);\n    String key = generateKey(endpointId, requestId);\n    listTypedPromises.put(key, promise);\n    if (timeoutInMillis > 0) {\n      timeoutActionRunner.schedule(\n          timeoutInMillis, () -> runTimeoutConsumer(listTypedPromises.remove(key)));\n    }\n    return promise;\n  }\n\n  private void runTimeoutConsumer(JsonRpcPromise<?> promise) {\n    Optional.ofNullable(promise)\n        .flatMap(JsonRpcPromise::getTimeoutRunnable)\n        .ifPresent(Runnable::run);\n  }\n\n  private void dispatchResult(String endpointId, JsonRpcResponse response, String key) {\n    Optional.ofNullable(listTypedPromises.remove(key))\n        .ifPresent(\n            promise ->\n                promise\n                    .getSuccessConsumer()\n                    .ifPresent(\n                        consumer ->\n                            promise\n                                .getType()\n                                .ifPresent(\n                                    type ->\n                                        consumer.accept(\n                                            endpointId,\n                                            composer.composeMany(response.getResult(), type)))));\n\n    Optional.ofNullable(singleTypedPromises.remove(key))\n        .ifPresent(\n            promise ->\n                promise\n                    .getSuccessConsumer()\n                    .ifPresent(\n                        consumer ->\n                            promise\n                                .getType()\n                                .ifPresent(\n                                    type ->\n                                        consumer.accept(\n                                            endpointId,\n                                            composer.composeOne(response.getResult(), type)))));\n  }\n\n  private void dispatchError(String endpointId, JsonRpcResponse response, String key) {\n    SingleTypedPromise<?> singlePromise = singleTypedPromises.remove(key);\n    ListTypedPromise<?> listPromise = listTypedPromises.remove(key);\n    JsonRpcPromise<?> promise = singlePromise != null ? singlePromise : listPromise;\n    promise.getFailureConsumer().ifPresent(it -> it.accept(endpointId, response.getError()));\n  }\n\n  private class ListTypedPromise<R> extends JsonRpcPromise<List<R>> {\n    private final Class<R> type;\n\n    private ListTypedPromise(Class<R> type) {\n      this.type = type;\n    }\n\n    private Optional<Class<R>> getType() {\n      return Optional.ofNullable(type);\n    }\n  }\n\n  private class SingleTypedPromise<R> extends JsonRpcPromise<R> {\n    private final Class<R> type;\n\n    private SingleTypedPromise(Class<R> type) {\n      this.type = type;\n    }\n\n    public Optional<Class<R>> getType() {\n      return Optional.ofNullable(type);\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/TimeoutActionRunner.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\n/** Executes operation on timeout */\npublic interface TimeoutActionRunner {\n  void schedule(int timeoutInMillis, Runnable runnable);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/ConsumerConfiguratorManyToNone.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.List;\nimport java.util.function.BiConsumer;\nimport java.util.function.Consumer;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Operation configurator to define an operation to be applied when we handle incoming JSON RPC\n * notification with params object that is represented by a list. As it is an operation there is no\n * result.\n *\n * @param <P> type of params list items\n */\npublic class ConsumerConfiguratorManyToNone<P> {\n  private static final Logger LOGGER = getLogger(ConsumerConfiguratorManyToNone.class);\n\n  private final RequestHandlerManager handlerManager;\n\n  private final String method;\n  private final Class<P> pClass;\n\n  ConsumerConfiguratorManyToNone(\n      RequestHandlerManager handlerManager, String method, Class<P> pClass) {\n    this.handlerManager = handlerManager;\n\n    this.method = method;\n    this.pClass = pClass;\n  }\n\n  public void withBiConsumer(BiConsumer<String, List<P>> biConsumer) {\n    checkNotNull(biConsumer, \"Notification consumer must not be null\");\n    LOGGER.debug(\n        \"Configuring incoming request: \"\n            + \"binary consumer for method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pClass);\n\n    handlerManager.registerManyToNone(method, pClass, biConsumer);\n  }\n\n  public void withConsumer(Consumer<List<P>> consumer) {\n    withBiConsumer((endpointId, pValue) -> consumer.accept(pValue));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/ConsumerConfiguratorNoneToNone.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.function.Consumer;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Operation configurator to define an operation to be applied when we handle incoming JSON RPC\n * notification with not params and no result value.\n */\npublic class ConsumerConfiguratorNoneToNone {\n  private static final Logger LOGGER = getLogger(ConsumerConfiguratorNoneToNone.class);\n\n  private final RequestHandlerManager handlerManager;\n\n  private final String method;\n\n  ConsumerConfiguratorNoneToNone(RequestHandlerManager handlerManager, String method) {\n    this.handlerManager = handlerManager;\n\n    this.method = method;\n  }\n\n  public void withConsumer(Consumer<String> consumer) {\n    checkNotNull(consumer, \"Notification consumer must not be null\");\n    LOGGER.debug(\"Configuring incoming request binary: consumer for method: \" + method);\n    handlerManager.registerNoneToNone(method, consumer);\n  }\n\n  public void withRunnable(Runnable runnable) {\n    withConsumer(s -> runnable.run());\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/ConsumerConfiguratorOneToNone.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.function.BiConsumer;\nimport java.util.function.Consumer;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Operation configurator to define an operation to be applied when we handle incoming JSON RPC\n * notification with params object that is represented by a single object. As it is an operation\n * there is no result.\n *\n * @param <P> type of params object\n */\npublic class ConsumerConfiguratorOneToNone<P> {\n  private static final Logger LOGGER = getLogger(ConsumerConfiguratorOneToNone.class);\n\n  private final RequestHandlerManager handlerManager;\n\n  private final String method;\n  private final Class<P> pClass;\n\n  ConsumerConfiguratorOneToNone(\n      RequestHandlerManager handlerManager, String method, Class<P> pClass) {\n    this.handlerManager = handlerManager;\n\n    this.method = method;\n    this.pClass = pClass;\n  }\n\n  public void withBiConsumer(BiConsumer<String, P> biConsumer) {\n    checkNotNull(biConsumer, \"Notification consumer must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request binary: \"\n            + \"consumer for method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + pClass);\n\n    handlerManager.registerOneToNone(method, pClass, biConsumer);\n  }\n\n  public void withConsumer(Consumer<P> consumer) {\n    withBiConsumer((endpointId, pValue) -> consumer.accept(pValue));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/FunctionConfiguratorManyToMany.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.List;\nimport java.util.function.BiFunction;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Function configurator to define a function to be applied when we handle incoming JSON RPC request\n * with params object that is represented by a list. The result of a function is also a list.\n *\n * @param <P> type of params list items\n * @param <R> type of resulting list items\n */\npublic class FunctionConfiguratorManyToMany<P, R> {\n  private static final Logger LOGGER = getLogger(FunctionConfiguratorManyToMany.class);\n\n  private final RequestHandlerManager handlerManager;\n\n  private final String method;\n  private final Class<P> pClass;\n  private final Class<R> rClass;\n\n  FunctionConfiguratorManyToMany(\n      RequestHandlerManager handlerManager, String method, Class<P> pClass, Class<R> rClass) {\n    this.handlerManager = handlerManager;\n\n    this.method = method;\n    this.pClass = pClass;\n    this.rClass = rClass;\n  }\n\n  /**\n   * Define a function to be applied\n   *\n   * @param function function\n   */\n  public void withFunction(BiFunction<String, List<P>, List<R>> function) {\n    checkNotNull(function, \"Request function must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request: \"\n            + \"binary function for method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pClass\n            + \", \"\n            + \"result list items class: \"\n            + rClass);\n\n    handlerManager.registerManyToMany(method, pClass, rClass, function);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/FunctionConfiguratorManyToOne.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.List;\nimport java.util.function.BiFunction;\nimport java.util.function.Function;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Function configurator to define a function to be applied when we handle incoming JSON RPC request\n * with params object that is represented by a list. The result of a function is a single object.\n *\n * @param <P> type of params list items\n * @param <R> type of result object\n */\npublic class FunctionConfiguratorManyToOne<P, R> {\n  private static final Logger LOGGER = getLogger(FunctionConfiguratorManyToOne.class);\n\n  private final RequestHandlerManager handlerManager;\n\n  private final String method;\n  private final Class<P> pClass;\n  private final Class<R> rClass;\n\n  FunctionConfiguratorManyToOne(\n      RequestHandlerManager handlerManager, String method, Class<P> pClass, Class<R> rClass) {\n    this.handlerManager = handlerManager;\n\n    this.method = method;\n    this.pClass = pClass;\n    this.rClass = rClass;\n  }\n\n  /**\n   * Define a function to be applied\n   *\n   * @param function function\n   */\n  public void withFunction(BiFunction<String, List<P>, R> function) {\n    checkNotNull(function, \"Request function must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request: \"\n            + \"binary function for method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pClass\n            + \", \"\n            + \"result object class: \"\n            + rClass);\n\n    handlerManager.registerManyToOne(method, pClass, rClass, function);\n  }\n\n  /**\n   * Define a function to be applied\n   *\n   * @param function function\n   */\n  public void withFunction(Function<List<P>, R> function) {\n    withFunction((str, ps) -> function.apply(ps));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/FunctionConfiguratorNoneToMany.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.List;\nimport java.util.function.Function;\nimport java.util.function.Supplier;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Function configurator to define a function to be applied when we handle incoming JSON RPC request\n * with no params object while the result of a function is a list of objects.\n *\n * @param <R> type of result object\n */\npublic class FunctionConfiguratorNoneToMany<R> {\n  private static final Logger LOGGER = getLogger(FunctionConfiguratorNoneToMany.class);\n\n  private final RequestHandlerManager handlerManager;\n\n  private final String method;\n  private final Class<R> rClass;\n\n  FunctionConfiguratorNoneToMany(\n      RequestHandlerManager handlerManager, String method, Class<R> rClass) {\n    this.handlerManager = handlerManager;\n\n    this.method = method;\n    this.rClass = rClass;\n  }\n\n  /**\n   * Define a function to be applied\n   *\n   * @param function function\n   */\n  public void withFunction(Function<String, List<R>> function) {\n    checkNotNull(function, \"Request function must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request binary: \"\n            + \"function for method: \"\n            + method\n            + \", \"\n            + \"result object class: \"\n            + rClass);\n\n    handlerManager.registerNoneToMany(method, rClass, function);\n  }\n\n  /**\n   * Define a supplier to be applied\n   *\n   * @param supplier supplier\n   */\n  public void withSupplier(Supplier<List<R>> supplier) {\n    withFunction(s -> supplier.get());\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/FunctionConfiguratorNoneToOne.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.function.Function;\nimport java.util.function.Supplier;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Function configurator to define a function to be applied when we handle incoming JSON RPC request\n * with no params object while the result of a function is a single object.\n *\n * @param <R> type of result object\n */\npublic class FunctionConfiguratorNoneToOne<R> {\n  private static final Logger LOGGER = getLogger(FunctionConfiguratorNoneToOne.class);\n  private final RequestHandlerManager handlerManager;\n\n  private final String method;\n  private final Class<R> rClass;\n\n  FunctionConfiguratorNoneToOne(\n      RequestHandlerManager handlerManager, String method, Class<R> rClass) {\n    this.handlerManager = handlerManager;\n\n    this.method = method;\n    this.rClass = rClass;\n  }\n\n  /**\n   * Define a function to be applied\n   *\n   * @param function function\n   */\n  public void withFunction(Function<String, R> function) {\n    checkNotNull(function, \"Request function must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request binary: \"\n            + \"function for method: \"\n            + method\n            + \", \"\n            + \"result object class: \"\n            + rClass);\n\n    handlerManager.registerNoneToOne(method, rClass, function);\n  }\n\n  /**\n   * Define a supplier to be applied\n   *\n   * @param supplier supplier\n   */\n  public void withSupplier(Supplier<R> supplier) {\n    withFunction(s -> supplier.get());\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/FunctionConfiguratorOneToMany.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.List;\nimport java.util.function.BiFunction;\nimport java.util.function.Function;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Function configurator to define a function to be applied when we handle incoming JSON RPC request\n * with params object that is represented by a single object while the result of a function is a\n * list of objects.\n *\n * @param <P> type of params object\n * @param <R> type of result list items\n */\npublic class FunctionConfiguratorOneToMany<P, R> {\n  private static final Logger LOGGER = getLogger(FunctionConfiguratorOneToMany.class);\n\n  private final RequestHandlerManager handlerManager;\n\n  private final String method;\n  private final Class<P> pClass;\n  private final Class<R> rClass;\n\n  FunctionConfiguratorOneToMany(\n      RequestHandlerManager handlerManager, String method, Class<P> pClass, Class<R> rClass) {\n    this.handlerManager = handlerManager;\n\n    this.method = method;\n    this.pClass = pClass;\n    this.rClass = rClass;\n  }\n\n  /**\n   * Define a binary function to be applied\n   *\n   * @param biFunction function\n   */\n  public void withBiFunction(BiFunction<String, P, List<R>> biFunction) {\n    checkNotNull(biFunction, \"Request function must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request binary: \"\n            + \"function for method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + pClass\n            + \", \"\n            + \"result list items class: \"\n            + rClass);\n\n    handlerManager.registerOneToMany(method, pClass, rClass, biFunction);\n  }\n\n  /**\n   * Define a function to be applied\n   *\n   * @param biFunction function\n   */\n  public void withFunction(Function<P, List<R>> biFunction) {\n    withBiFunction((s, p) -> biFunction.apply(p));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/FunctionConfiguratorOneToOne.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.function.BiFunction;\nimport java.util.function.Function;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Function configurator to define a function to be applied when we handle incoming JSON RPC request\n * with params object that is represented by a single object while the result of a function is also\n * a single object.\n *\n * @param <P> type of params object\n * @param <R> type of result object\n */\npublic class FunctionConfiguratorOneToOne<P, R> {\n  private static final Logger LOGGER = getLogger(FunctionConfiguratorOneToOne.class);\n\n  private final RequestHandlerManager handlerManager;\n\n  private final String method;\n  private final Class<P> pClass;\n  private final Class<R> rClass;\n\n  FunctionConfiguratorOneToOne(\n      RequestHandlerManager handlerManager, String method, Class<P> pClass, Class<R> rClass) {\n    this.handlerManager = handlerManager;\n\n    this.method = method;\n    this.pClass = pClass;\n    this.rClass = rClass;\n  }\n\n  /**\n   * Define a binary function to be applied\n   *\n   * @param biFunction function\n   */\n  public void withBiFunction(BiFunction<String, P, R> biFunction) {\n    checkNotNull(biFunction, \"Request function must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request binary: \"\n            + \"function for method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + pClass\n            + \", \"\n            + \"result object class: \"\n            + rClass);\n\n    handlerManager.registerOneToOne(method, pClass, rClass, biFunction);\n  }\n\n  /**\n   * Define a function to be applied\n   *\n   * @param function function\n   */\n  public void withFunction(Function<P, R> function) {\n    withBiFunction((s, p) -> function.apply(p));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/MethodNameConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Method configurator is used to define method name that the request handler will be associated\n * with.\n */\npublic class MethodNameConfigurator {\n  private static final Logger LOGGER = getLogger(MethodNameConfigurator.class);\n\n  private final RequestHandlerManager requestHandlerManager;\n\n  @Inject\n  MethodNameConfigurator(RequestHandlerManager requestHandlerManager) {\n    this.requestHandlerManager = requestHandlerManager;\n  }\n\n  public ParamsConfigurator methodName(String name) {\n    checkNotNull(name, \"Method name must not be null\");\n    checkArgument(!name.isEmpty(), \"Method name must not be empty\");\n\n    LOGGER.debug(\"Configuring incoming request method name name: \" + name);\n\n    return new ParamsConfigurator(requestHandlerManager, name);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/ParamsConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Params configurator provide means to configure params type in a request that is to be handled.\n * Params types that are supported: {@link String}, {@link Boolean}, {@link Double}, {@link Void}\n * and DTO.\n */\npublic class ParamsConfigurator {\n  private static final Logger LOGGER = getLogger(ParamsConfigurator.class);\n\n  private final RequestHandlerManager requestHandlerManager;\n\n  private final String method;\n\n  ParamsConfigurator(RequestHandlerManager requestHandlerManager, String method) {\n    this.requestHandlerManager = requestHandlerManager;\n\n    this.method = method;\n  }\n\n  public <P> ResultConfiguratorFromMany<P> paramsAsListOfDto(Class<P> pClass) {\n    checkNotNull(pClass, \"Params class must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request params: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pClass);\n\n    return new ResultConfiguratorFromMany<>(requestHandlerManager, method, pClass);\n  }\n\n  public ResultConfiguratorFromMany<Double> paramsAsListOfDouble() {\n    LOGGER.debug(\n        \"Configuring incoming request params: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + Double.class);\n\n    return new ResultConfiguratorFromMany<>(requestHandlerManager, method, Double.class);\n  }\n\n  public ResultConfiguratorFromMany<String> paramsAsListOfString() {\n    LOGGER.debug(\n        \"Configuring incoming request params: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + String.class);\n\n    return new ResultConfiguratorFromMany<>(requestHandlerManager, method, String.class);\n  }\n\n  public ResultConfiguratorFromMany<Boolean> paramsAsListOfBoolean() {\n    LOGGER.debug(\n        \"Configuring incoming request params: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + Boolean.class);\n\n    return new ResultConfiguratorFromMany<>(requestHandlerManager, method, Boolean.class);\n  }\n\n  public <P> ResultConfiguratorFromOne<P> paramsAsDto(Class<P> pClass) {\n    checkNotNull(pClass, \"Params class must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request params: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + pClass);\n\n    return new ResultConfiguratorFromOne<>(requestHandlerManager, method, pClass);\n  }\n\n  public ResultConfiguratorFromNone noParams() {\n    LOGGER.debug(\n        \"Configuring incoming request params: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + Void.class);\n\n    return new ResultConfiguratorFromNone(requestHandlerManager, method);\n  }\n\n  public ResultConfiguratorFromOne<String> paramsAsString() {\n    LOGGER.debug(\n        \"Configuring incoming request params: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + String.class);\n\n    return new ResultConfiguratorFromOne<>(requestHandlerManager, method, String.class);\n  }\n\n  public ResultConfiguratorFromOne<Double> paramsAsDouble() {\n    LOGGER.debug(\n        \"Configuring incoming request params: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + Double.class);\n\n    return new ResultConfiguratorFromOne<>(requestHandlerManager, method, Double.class);\n  }\n\n  public ResultConfiguratorFromOne<Boolean> paramsAsBoolean() {\n    LOGGER.debug(\n        \"Configuring incoming request params: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + Boolean.class);\n\n    return new ResultConfiguratorFromOne<>(requestHandlerManager, method, Boolean.class);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/PromiseConfigurationOneToOne.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.function.BiFunction;\nimport java.util.function.Function;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcPromise;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Function configurator to define a function to be applied when we handle incoming JSON RPC request\n * with params object that is represented by a single object while the result of a function is also\n * a single object.\n *\n * @param <P> type of params object\n * @param <R> type of result object\n */\npublic class PromiseConfigurationOneToOne<P, R> {\n  private static final Logger LOGGER = getLogger(PromiseConfigurationOneToOne.class);\n\n  private final RequestHandlerManager handlerManager;\n\n  private final String method;\n  private final Class<P> pClass;\n  private final Class<R> rClass;\n\n  PromiseConfigurationOneToOne(\n      RequestHandlerManager handlerManager, String method, Class<P> pClass, Class<R> rClass) {\n    this.handlerManager = handlerManager;\n\n    this.method = method;\n    this.pClass = pClass;\n    this.rClass = rClass;\n  }\n\n  /**\n   * Define a binary function to be applied\n   *\n   * @param function function\n   */\n  public void withPromiseBiFunction(BiFunction<String, P, JsonRpcPromise<R>> function) {\n    checkNotNull(function, \"Request promise must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request binary: \"\n            + \"function for method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + pClass\n            + \", \"\n            + \"result object class: \"\n            + rClass);\n\n    handlerManager.registerOneToPromiseOne(method, pClass, rClass, function);\n  }\n\n  /**\n   * Define a function to be applied\n   *\n   * @param function function\n   */\n  public void withPromise(Function<P, JsonRpcPromise<R>> function) {\n    withPromiseBiFunction((s, p) -> function.apply(p));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/ResultConfiguratorFromMany.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Result configurator provide means to configure result type in a response that is to be received.\n * Result types that are supported: {@link String}, {@link Boolean}, {@link Double}, {@link Void}\n * and DTO. This configurator is used when we have defined request params as a list.\n */\npublic class ResultConfiguratorFromMany<P> {\n  private static final Logger LOGGER = getLogger(ResultConfiguratorFromMany.class);\n\n  private final RequestHandlerManager requestHandlerManager;\n\n  private final String method;\n  private final Class<P> pClass;\n\n  ResultConfiguratorFromMany(\n      RequestHandlerManager requestHandlerManager, String method, Class<P> pClass) {\n    this.requestHandlerManager = requestHandlerManager;\n\n    this.method = method;\n    this.pClass = pClass;\n  }\n\n  public <R> FunctionConfiguratorManyToMany<P, R> resultAsListOfDto(Class<R> rClass) {\n    checkNotNull(rClass, \"Result class must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result list items class: \"\n            + rClass);\n\n    return new FunctionConfiguratorManyToMany<>(requestHandlerManager, method, pClass, rClass);\n  }\n\n  public FunctionConfiguratorManyToMany<P, String> resultAsListOfString() {\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result list items class: \"\n            + String.class);\n\n    return new FunctionConfiguratorManyToMany<>(\n        requestHandlerManager, method, pClass, String.class);\n  }\n\n  public FunctionConfiguratorManyToMany<P, Double> resultAsListOfDouble() {\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result list items class: \"\n            + Double.class);\n\n    return new FunctionConfiguratorManyToMany<>(\n        requestHandlerManager, method, pClass, Double.class);\n  }\n\n  public FunctionConfiguratorManyToMany<P, Boolean> resultAsListOfBoolean() {\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result list items class: \"\n            + Boolean.class);\n\n    return new FunctionConfiguratorManyToMany<>(\n        requestHandlerManager, method, pClass, Boolean.class);\n  }\n\n  public <R> FunctionConfiguratorManyToOne<P, R> resultAsDto(Class<R> rClass) {\n    checkNotNull(rClass, \"Result class must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result object class: \"\n            + rClass);\n\n    return new FunctionConfiguratorManyToOne<>(requestHandlerManager, method, pClass, rClass);\n  }\n\n  public FunctionConfiguratorManyToOne<P, String> resultAsString() {\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result object class: \"\n            + String.class);\n\n    return new FunctionConfiguratorManyToOne<>(requestHandlerManager, method, pClass, String.class);\n  }\n\n  public FunctionConfiguratorManyToOne<P, Double> resultAsDouble() {\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result object class: \"\n            + Double.class);\n\n    return new FunctionConfiguratorManyToOne<>(requestHandlerManager, method, pClass, Double.class);\n  }\n\n  public FunctionConfiguratorManyToOne<P, Boolean> resultAsBoolean() {\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result object class: \"\n            + Double.class);\n\n    return new FunctionConfiguratorManyToOne<>(\n        requestHandlerManager, method, pClass, Boolean.class);\n  }\n\n  public ConsumerConfiguratorManyToNone<P> noResult() {\n    LOGGER.debug(\"Configuring incoming request having no result\");\n\n    return new ConsumerConfiguratorManyToNone<>(requestHandlerManager, method, pClass);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/ResultConfiguratorFromNone.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Result configurator provide means to configure result type in a response that is to be received.\n * Result types that are supported: {@link String}, {@link Boolean}, {@link Double}, {@link Void}\n * and DTO. This configurator is used when we have no defined request params.\n */\npublic class ResultConfiguratorFromNone {\n  private static final Logger LOGGER = getLogger(ResultConfiguratorFromNone.class);\n\n  private final RequestHandlerManager requestHandlerManager;\n\n  private final String method;\n\n  ResultConfiguratorFromNone(RequestHandlerManager requestHandlerManager, String method) {\n    this.requestHandlerManager = requestHandlerManager;\n\n    this.method = method;\n  }\n\n  public <R> FunctionConfiguratorNoneToMany<R> resultAsListOfDto(Class<R> rClass) {\n    checkNotNull(rClass, \"Result class must not be null\");\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result list items class: \"\n            + rClass);\n\n    return new FunctionConfiguratorNoneToMany<>(requestHandlerManager, method, rClass);\n  }\n\n  public FunctionConfiguratorNoneToMany<String> resultAsListOfString() {\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result list items class: \"\n            + String.class);\n\n    return new FunctionConfiguratorNoneToMany<>(requestHandlerManager, method, String.class);\n  }\n\n  public FunctionConfiguratorNoneToMany<Double> resultAsListOfDouble() {\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result list items class: \"\n            + Double.class);\n\n    return new FunctionConfiguratorNoneToMany<>(requestHandlerManager, method, Double.class);\n  }\n\n  public FunctionConfiguratorNoneToMany<Boolean> resultAsListOfBoolean() {\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result list items class: \"\n            + Boolean.class);\n\n    return new FunctionConfiguratorNoneToMany<>(requestHandlerManager, method, Boolean.class);\n  }\n\n  public <R> FunctionConfiguratorNoneToOne<R> resultAsDto(Class<R> rClass) {\n    checkNotNull(rClass, \"Result class must not be null\");\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result object class: \"\n            + rClass);\n\n    return new FunctionConfiguratorNoneToOne<>(requestHandlerManager, method, rClass);\n  }\n\n  public FunctionConfiguratorNoneToOne<String> resultAsString() {\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result object class: \"\n            + String.class);\n\n    return new FunctionConfiguratorNoneToOne<>(requestHandlerManager, method, String.class);\n  }\n\n  public FunctionConfiguratorNoneToOne<Double> resultAsDouble() {\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result object class: \"\n            + Double.class);\n\n    return new FunctionConfiguratorNoneToOne<>(requestHandlerManager, method, Double.class);\n  }\n\n  public FunctionConfiguratorNoneToOne<Boolean> resultAsBoolean() {\n    LOGGER.debug(\n        \"Configuring incoming request result: method: \"\n            + method\n            + \", result object class: \"\n            + Boolean.class);\n\n    return new FunctionConfiguratorNoneToOne<>(requestHandlerManager, method, Boolean.class);\n  }\n\n  public ConsumerConfiguratorNoneToNone noResult() {\n    LOGGER.debug(\n        \"Configuring incoming request result: \" + \"method: \" + method + \", no result is expected.\");\n\n    return new ConsumerConfiguratorNoneToNone(requestHandlerManager, method);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/reception/ResultConfiguratorFromOne.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.reception;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.slf4j.Logger;\n\n/**\n * Result configurator provide means to configure result type in a response that is to be received.\n * Result types that are supported: {@link String}, {@link Boolean}, {@link Double}, {@link Void}\n * and DTO. This configurator is used when we have defined request params as a single object.\n */\npublic class ResultConfiguratorFromOne<P> {\n  private static final Logger LOGGER = getLogger(ResultConfiguratorFromOne.class);\n\n  private final RequestHandlerManager requestHandlerManager;\n\n  private final String method;\n  private final Class<P> pClass;\n\n  ResultConfiguratorFromOne(\n      RequestHandlerManager requestHandlerManager, String method, Class<P> pClass) {\n    this.requestHandlerManager = requestHandlerManager;\n\n    this.method = method;\n    this.pClass = pClass;\n  }\n\n  public <R> FunctionConfiguratorOneToMany<P, R> resultAsListOfDto(Class<R> rClass) {\n    checkNotNull(rClass, \"Result class must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request result: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result list items class: \"\n            + rClass);\n\n    return new FunctionConfiguratorOneToMany<>(requestHandlerManager, method, pClass, rClass);\n  }\n\n  public FunctionConfiguratorOneToMany<P, String> resultAsListOfString() {\n    LOGGER.debug(\n        \"Configuring incoming request result: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result list items class: \"\n            + String.class);\n\n    return new FunctionConfiguratorOneToMany<>(requestHandlerManager, method, pClass, String.class);\n  }\n\n  public FunctionConfiguratorOneToMany<P, Double> resultAsListOfDouble() {\n    LOGGER.debug(\n        \"Configuring incoming request result: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result list items class: \"\n            + Double.class);\n\n    return new FunctionConfiguratorOneToMany<>(requestHandlerManager, method, pClass, Double.class);\n  }\n\n  public FunctionConfiguratorOneToMany<P, Boolean> resultAsListOfBoolean() {\n    LOGGER.debug(\n        \"Configuring incoming request result: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result list items class: \"\n            + Boolean.class);\n\n    return new FunctionConfiguratorOneToMany<>(\n        requestHandlerManager, method, pClass, Boolean.class);\n  }\n\n  public <R> FunctionConfiguratorOneToOne<P, R> resultAsDto(Class<R> rClass) {\n    checkNotNull(rClass, \"Result class must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request result: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result object class: \"\n            + rClass);\n\n    return new FunctionConfiguratorOneToOne<>(requestHandlerManager, method, pClass, rClass);\n  }\n\n  public <R> PromiseConfigurationOneToOne<P, R> resultAsPromiseDto(Class<R> rClass) {\n    checkNotNull(rClass, \"Result class must not be null\");\n\n    LOGGER.debug(\n        \"Configuring incoming request result: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result object class: \"\n            + rClass);\n\n    return new PromiseConfigurationOneToOne<>(requestHandlerManager, method, pClass, rClass);\n  }\n\n  public FunctionConfiguratorOneToOne<P, String> resultAsString() {\n    LOGGER.debug(\n        \"Configuring incoming request result: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result object class: \"\n            + String.class);\n\n    return new FunctionConfiguratorOneToOne<>(requestHandlerManager, method, pClass, String.class);\n  }\n\n  public FunctionConfiguratorOneToOne<P, Double> resultAsDouble() {\n    LOGGER.debug(\n        \"Configuring incoming request result: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result object class: \"\n            + Double.class);\n\n    return new FunctionConfiguratorOneToOne<>(requestHandlerManager, method, pClass, Double.class);\n  }\n\n  public FunctionConfiguratorOneToOne<P, Boolean> resultAsBoolean() {\n    LOGGER.debug(\n        \"Configuring incoming request result: \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result object class: \"\n            + Boolean.class);\n\n    return new FunctionConfiguratorOneToOne<>(requestHandlerManager, method, pClass, Boolean.class);\n  }\n\n  public ConsumerConfiguratorOneToNone<P> noResult() {\n    LOGGER.debug(\"Configuring incoming request having no result\");\n\n    return new ConsumerConfiguratorOneToNone<>(requestHandlerManager, method, pClass);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/transmission/EndpointIdConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.transmission;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcMarshaller;\nimport org.eclipse.che.api.core.jsonrpc.commons.ResponseDispatcher;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageTransmitter;\nimport org.slf4j.Logger;\n\n/** Endpoint ID configurator to defined endpoint id that the request should be addressed to. */\npublic class EndpointIdConfigurator {\n  private static final Logger LOGGER = getLogger(EndpointIdConfigurator.class);\n\n  private final JsonRpcMarshaller marshaller;\n  private final ResponseDispatcher dispatcher;\n  private final WebSocketMessageTransmitter transmitter;\n\n  @Inject\n  EndpointIdConfigurator(\n      JsonRpcMarshaller marshaller,\n      ResponseDispatcher dispatcher,\n      WebSocketMessageTransmitter transmitter) {\n    this.marshaller = marshaller;\n    this.dispatcher = dispatcher;\n    this.transmitter = transmitter;\n  }\n\n  public MethodNameConfigurator endpointId(String id) {\n    checkNotNull(id, \"Endpoint ID must not be null\");\n    checkArgument(!id.isEmpty(), \"Endpoint ID must not be empty\");\n\n    LOGGER.debug(\"Configuring outgoing request endpoint ID: \" + id);\n\n    return new MethodNameConfigurator(marshaller, dispatcher, transmitter, id);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/transmission/MethodNameConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.transmission;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.concurrent.atomic.AtomicInteger;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcMarshaller;\nimport org.eclipse.che.api.core.jsonrpc.commons.ResponseDispatcher;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageTransmitter;\nimport org.slf4j.Logger;\n\n/** Method name configurator to defined method name that the request will have. */\npublic class MethodNameConfigurator {\n  private static final Logger LOGGER = getLogger(MethodNameConfigurator.class);\n\n  public static AtomicInteger id = new AtomicInteger(0);\n\n  private final JsonRpcMarshaller marshaller;\n  private final ResponseDispatcher dispatcher;\n  private final WebSocketMessageTransmitter transmitter;\n\n  private final String endpointId;\n\n  @Inject\n  MethodNameConfigurator(\n      JsonRpcMarshaller marshaller,\n      ResponseDispatcher dispatcher,\n      WebSocketMessageTransmitter transmitter,\n      String endpointId) {\n    this.marshaller = marshaller;\n    this.dispatcher = dispatcher;\n    this.transmitter = transmitter;\n\n    this.endpointId = endpointId;\n  }\n\n  public ParamsConfigurator methodName(String name) {\n    checkNotNull(name, \"Method name must not be null\");\n    checkArgument(!name.isEmpty(), \"Method name must not be empty\");\n\n    LOGGER.debug(\"Configuring outgoing request method name name: \" + name);\n\n    return new ParamsConfigurator(marshaller, dispatcher, transmitter, name, endpointId);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/transmission/ParamsConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.transmission;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcMarshaller;\nimport org.eclipse.che.api.core.jsonrpc.commons.ResponseDispatcher;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageTransmitter;\nimport org.slf4j.Logger;\n\n/**\n * Params configurator provide means to configure params type in a request that is to be sent.\n * Params types that are supported: {@link String}, {@link Boolean}, {@link Double}, {@link Void}\n * and DTO.\n */\npublic class ParamsConfigurator {\n  private static final Logger LOGGER = getLogger(ParamsConfigurator.class);\n\n  private final JsonRpcMarshaller marshaller;\n  private final ResponseDispatcher dispatcher;\n  private final WebSocketMessageTransmitter transmitter;\n\n  private final String method;\n  private final String endpointId;\n\n  ParamsConfigurator(\n      JsonRpcMarshaller marshaller,\n      ResponseDispatcher dispatcher,\n      WebSocketMessageTransmitter transmitter,\n      String method,\n      String endpointId) {\n    this.marshaller = marshaller;\n    this.dispatcher = dispatcher;\n    this.transmitter = transmitter;\n\n    this.method = method;\n    this.endpointId = endpointId;\n  }\n\n  public <P> SendConfiguratorFromOne<P> paramsAsDto(P pValue) {\n    checkNotNull(pValue, \"Params value must not be null\");\n\n    LOGGER.debug(\n        \"Configuring outgoing request params: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + pValue.getClass()\n            + \", \"\n            + \"params object value: \"\n            + pValue);\n\n    return new SendConfiguratorFromOne<>(\n        marshaller, dispatcher, transmitter, method, pValue, endpointId);\n  }\n\n  public SendConfiguratorFromOne<Double> paramsAsDouble(Double pValue) {\n    checkNotNull(pValue, \"Params value must not be null\");\n\n    LOGGER.debug(\n        \"Configuring outgoing request params: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + Double.class\n            + \", \"\n            + \"params object value: \"\n            + pValue);\n\n    return new SendConfiguratorFromOne<>(\n        marshaller, dispatcher, transmitter, method, pValue, endpointId);\n  }\n\n  public SendConfiguratorFromOne<String> paramsAsString(String pValue) {\n    checkNotNull(pValue, \"Params value must not be null\");\n\n    LOGGER.debug(\n        \"Configuring outgoing request params: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + String.class\n            + \", \"\n            + \"params object value: \"\n            + pValue);\n\n    return new SendConfiguratorFromOne<>(\n        marshaller, dispatcher, transmitter, method, pValue, endpointId);\n  }\n\n  public SendConfiguratorFromOne<Boolean> paramsAsBoolean(Boolean pValue) {\n    checkNotNull(pValue, \"Params value must not be null\");\n\n    LOGGER.debug(\n        \"Configuring outgoing request params: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + Boolean.class\n            + \", \"\n            + \"params object value: \"\n            + pValue);\n\n    return new SendConfiguratorFromOne<>(\n        marshaller, dispatcher, transmitter, method, pValue, endpointId);\n  }\n\n  public SendConfiguratorFromNone noParams() {\n    LOGGER.debug(\n        \"Configuring outgoing request params: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params object class: \"\n            + Void.class\n            + \", \"\n            + \"params object value: void\");\n\n    return new SendConfiguratorFromNone(marshaller, dispatcher, transmitter, method, endpointId);\n  }\n\n  public <P> SendConfiguratorFromMany<P> paramsAsListOfDto(List<P> pListValue) {\n    checkNotNull(pListValue, \"Params list value must not be null\");\n    checkArgument(!pListValue.isEmpty(), \"Params list value must not be empty\");\n\n    LOGGER.debug(\n        \"Configuring outgoing request params: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pListValue.iterator().next().getClass()\n            + \", \"\n            + \"params list value: \"\n            + pListValue);\n\n    return new SendConfiguratorFromMany<>(\n        marshaller, dispatcher, transmitter, method, pListValue, endpointId);\n  }\n\n  public SendConfiguratorFromMany<String> paramsAsListOfString(List<String> pListValue) {\n    checkNotNull(pListValue, \"Params list value must not be null\");\n    checkArgument(!pListValue.isEmpty(), \"Params list value must not be empty\");\n\n    LOGGER.debug(\n        \"Configuring outgoing request params: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + String.class\n            + \", \"\n            + \"params list value: \"\n            + pListValue);\n    return new SendConfiguratorFromMany<>(\n        marshaller, dispatcher, transmitter, method, pListValue, endpointId);\n  }\n\n  public SendConfiguratorFromMany<Double> paramsAsListOfDouble(List<Double> pListValue) {\n    checkNotNull(pListValue, \"Params list value must not be null\");\n    checkArgument(!pListValue.isEmpty(), \"Params list value must not be empty\");\n\n    LOGGER.debug(\n        \"Configuring outgoing request params: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + Double.class\n            + \", \"\n            + \"params list value: \"\n            + pListValue);\n\n    return new SendConfiguratorFromMany<>(\n        marshaller, dispatcher, transmitter, method, pListValue, endpointId);\n  }\n\n  public SendConfiguratorFromMany<Boolean> paramsAsListOfBoolean(List<Boolean> pListValue) {\n    checkNotNull(pListValue, \"Params list value must not be null\");\n    checkArgument(!pListValue.isEmpty(), \"Params list value must not be empty\");\n\n    LOGGER.debug(\n        \"Configuring outgoing request params: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + Boolean.class\n            + \", \"\n            + \"params list value: \"\n            + pListValue);\n\n    return new SendConfiguratorFromMany<>(\n        marshaller, dispatcher, transmitter, method, pListValue, endpointId);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/transmission/SendConfiguratorFromMany.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.transmission;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcMarshaller;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcParams;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcPromise;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcRequest;\nimport org.eclipse.che.api.core.jsonrpc.commons.ResponseDispatcher;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageTransmitter;\nimport org.slf4j.Logger;\n\n/**\n * Configurator defines the type of a result (if present) and send a request. Result types that are\n * supported: {@link String}, {@link Boolean}, {@link Double}, {@link Void} and DTO. This\n * configurator is used when we have defined request params as a list.\n *\n * @param <P> type of params list items\n */\npublic class SendConfiguratorFromMany<P> {\n  private static final Logger LOGGER = getLogger(SendConfiguratorFromMany.class);\n\n  private final ResponseDispatcher dispatcher;\n  private final WebSocketMessageTransmitter transmitter;\n  private final JsonRpcMarshaller marshaller;\n\n  private final String method;\n  private final List<P> pListValue;\n  private final String endpointId;\n\n  SendConfiguratorFromMany(\n      JsonRpcMarshaller marshaller,\n      ResponseDispatcher dispatcher,\n      WebSocketMessageTransmitter transmitter,\n      String method,\n      List<P> pListValue,\n      String endpointId) {\n    this.dispatcher = dispatcher;\n    this.transmitter = transmitter;\n    this.marshaller = marshaller;\n\n    this.method = method;\n    this.pListValue = pListValue;\n    this.endpointId = endpointId;\n  }\n\n  public void sendAndSkipResult() {\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pListValue.iterator().next().getClass()\n            + \", \"\n            + \"params list value\"\n            + pListValue);\n\n    transmitNotification();\n  }\n\n  public <R> JsonRpcPromise<R> sendAndReceiveResultAsDto(Class<R> rClass) {\n    return sendAndReceiveResultAsDto(rClass, 0);\n  }\n\n  public <R> JsonRpcPromise<R> sendAndReceiveResultAsDto(Class<R> rClass, int timeoutInMillis) {\n    checkNotNull(rClass, \"Result class value must not be null\");\n\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pListValue.iterator().next().getClass()\n            + \", \"\n            + \"params list value\"\n            + pListValue\n            + \", \"\n            + \"result object class: \"\n            + rClass);\n\n    return dispatcher.registerPromiseForSingleObject(\n        endpointId, requestId, rClass, timeoutInMillis);\n  }\n\n  public JsonRpcPromise<String> sendAndReceiveResultAsString() {\n    return sendAndReceiveResultAsString(0);\n  }\n\n  public JsonRpcPromise<String> sendAndReceiveResultAsString(int timeoutInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pListValue.iterator().next().getClass()\n            + \", \"\n            + \"params list value\"\n            + pListValue\n            + \", \"\n            + \"result object class: \"\n            + String.class);\n\n    return dispatcher.registerPromiseForSingleObject(\n        endpointId, requestId, String.class, timeoutInMillis);\n  }\n\n  public JsonRpcPromise<Boolean> sendAndReceiveResultAsBoolean() {\n    return sendAndReceiveResultAsBoolean(0);\n  }\n\n  public JsonRpcPromise<Boolean> sendAndReceiveResultAsBoolean(int timeoutInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pListValue.iterator().next().getClass()\n            + \", \"\n            + \"params list value\"\n            + pListValue\n            + \", \"\n            + \"result object class: \"\n            + Boolean.class);\n\n    return dispatcher.registerPromiseForSingleObject(\n        endpointId, requestId, Boolean.class, timeoutInMillis);\n  }\n\n  public JsonRpcPromise<Double> sendAndReceiveResultAsDouble() {\n    return sendAndReceiveResultAsDouble(0);\n  }\n\n  public JsonRpcPromise<Double> sendAndReceiveResultAsDouble(int timeoutInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pListValue.iterator().next().getClass()\n            + \", \"\n            + \"params list value\"\n            + pListValue\n            + \", \"\n            + \"result object class: \"\n            + Double.class);\n\n    return dispatcher.registerPromiseForSingleObject(\n        endpointId, requestId, Double.class, timeoutInMillis);\n  }\n\n  public <R> JsonRpcPromise<List<R>> sendAndReceiveResultAsListOfDto(Class<R> rClass) {\n    return sendAndReceiveResultAsListOfDto(rClass, 0);\n  }\n\n  public <R> JsonRpcPromise<List<R>> sendAndReceiveResultAsListOfDto(\n      Class<R> rClass, int timeoutInMillis) {\n    checkNotNull(rClass, \"Result class value must not be null\");\n\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pListValue.iterator().next().getClass()\n            + \", \"\n            + \"params list value\"\n            + pListValue\n            + \", \"\n            + \"result list items class: \"\n            + rClass);\n\n    return dispatcher.registerPromiseForListOfObjects(\n        endpointId, requestId, rClass, timeoutInMillis);\n  }\n\n  public JsonRpcPromise<List<String>> sendAndReceiveResultAsListOfString() {\n    return sendAndReceiveResultAsListOfString(0);\n  }\n\n  public JsonRpcPromise<List<String>> sendAndReceiveResultAsListOfString(int timeoutInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pListValue.iterator().next().getClass()\n            + \", \"\n            + \"params list value\"\n            + pListValue\n            + \", \"\n            + \"result list items class: \"\n            + String.class);\n\n    return dispatcher.registerPromiseForListOfObjects(\n        endpointId, requestId, String.class, timeoutInMillis);\n  }\n\n  public JsonRpcPromise<List<Boolean>> sendAndReceiveResultAsListOfBoolean() {\n    return sendAndReceiveResultAsListOfBoolean(0);\n  }\n\n  public JsonRpcPromise<List<Boolean>> sendAndReceiveResultAsListOfBoolean(int timeoutInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pListValue.iterator().next().getClass()\n            + \", \"\n            + \"params list value\"\n            + pListValue\n            + \", \"\n            + \"result list items class: \"\n            + Boolean.class);\n\n    return dispatcher.registerPromiseForListOfObjects(\n        endpointId, requestId, Boolean.class, timeoutInMillis);\n  }\n\n  public JsonRpcPromise<List<Double>> sendAndReceiveResultAsListOfDouble() {\n    return sendAndReceiveResultAsListOfDouble(0);\n  }\n\n  public JsonRpcPromise<List<Double>> sendAndReceiveResultAsListOfDouble(int timeoutInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"params list items class: \"\n            + pListValue.iterator().next().getClass()\n            + \", \"\n            + \"params list value\"\n            + pListValue\n            + \", \"\n            + \"result list items class: \"\n            + Double.class);\n\n    return dispatcher.registerPromiseForListOfObjects(\n        endpointId, requestId, Double.class, timeoutInMillis);\n  }\n\n  private void transmitNotification() {\n    JsonRpcParams params = new JsonRpcParams(pListValue);\n    JsonRpcRequest request = new JsonRpcRequest(null, method, params);\n    String message = marshaller.marshall(request);\n    transmitter.transmit(endpointId, message);\n  }\n\n  private String transmitRequest() {\n    Integer id = MethodNameConfigurator.id.incrementAndGet();\n    String requestId = id.toString();\n\n    JsonRpcParams params = new JsonRpcParams(pListValue);\n    JsonRpcRequest request = new JsonRpcRequest(requestId, method, params);\n    String message = marshaller.marshall(request);\n    transmitter.transmit(endpointId, message);\n    return requestId;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/transmission/SendConfiguratorFromNone.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.transmission;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcMarshaller;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcPromise;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcRequest;\nimport org.eclipse.che.api.core.jsonrpc.commons.ResponseDispatcher;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageTransmitter;\nimport org.slf4j.Logger;\n\n/**\n * Configurator defines the type of a result (if present) and send a request. Result types that are\n * supported: {@link String}, {@link Boolean}, {@link Double}, {@link Void} and DTO. This\n * configurator is used when we have not set request params.\n */\npublic class SendConfiguratorFromNone {\n  private static final Logger LOGGER = getLogger(SendConfiguratorFromNone.class);\n\n  private final ResponseDispatcher dispatcher;\n  private final WebSocketMessageTransmitter transmitter;\n  private final JsonRpcMarshaller marshaller;\n\n  private final String method;\n  private final String endpointId;\n\n  SendConfiguratorFromNone(\n      JsonRpcMarshaller marshaller,\n      ResponseDispatcher dispatcher,\n      WebSocketMessageTransmitter transmitter,\n      String method,\n      String endpointId) {\n    this.marshaller = marshaller;\n    this.dispatcher = dispatcher;\n    this.transmitter = transmitter;\n\n    this.method = method;\n    this.endpointId = endpointId;\n  }\n\n  public void sendAndSkipResult() {\n    LOGGER.debug(\n        \"Transmitting request: \" + \"endpoint ID: \" + endpointId + \", \" + \"method: \" + method);\n\n    transmitNotification();\n  }\n\n  public <R> JsonRpcPromise<R> sendAndReceiveResultAsDto(final Class<R> rClass) {\n    return sendAndReceiveResultAsDto(rClass, 0);\n  }\n\n  public <R> JsonRpcPromise<R> sendAndReceiveResultAsDto(final Class<R> rClass, int timeInMillis) {\n    checkNotNull(rClass, \"Result class value must not be null\");\n\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result object class: \"\n            + rClass);\n\n    return dispatcher.registerPromiseForSingleObject(endpointId, requestId, rClass, timeInMillis);\n  }\n\n  public JsonRpcPromise<String> sendAndReceiveResultAsString() {\n    return sendAndReceiveResultAsString(0);\n  }\n\n  public JsonRpcPromise<String> sendAndReceiveResultAsString(int timeInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result object class: \"\n            + String.class);\n\n    return dispatcher.registerPromiseForSingleObject(\n        endpointId, requestId, String.class, timeInMillis);\n  }\n\n  public JsonRpcPromise<Double> sendAndReceiveResultAsDouble() {\n    return sendAndReceiveResultAsDouble(0);\n  }\n\n  public JsonRpcPromise<Double> sendAndReceiveResultAsDouble(int timeInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result object class: \"\n            + Double.class);\n\n    return dispatcher.registerPromiseForSingleObject(\n        endpointId, requestId, Double.class, timeInMillis);\n  }\n\n  public JsonRpcPromise<Boolean> sendAndReceiveResultAsBoolean() {\n    return sendAndReceiveResultAsBoolean(0);\n  }\n\n  public JsonRpcPromise<Boolean> sendAndReceiveResultAsBoolean(int timeInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result object class: \"\n            + Boolean.class);\n\n    return dispatcher.registerPromiseForSingleObject(\n        endpointId, requestId, Boolean.class, timeInMillis);\n  }\n\n  public <R> JsonRpcPromise<List<R>> sendAndReceiveResultAsListOfDto(final Class<R> rClass) {\n    return sendAndReceiveResultAsListOfDto(rClass, 0);\n  }\n\n  public <R> JsonRpcPromise<List<R>> sendAndReceiveResultAsListOfDto(\n      final Class<R> rClass, int timeInMillis) {\n    checkNotNull(rClass, \"Result class value must not be null\");\n\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result list items class: \"\n            + rClass);\n\n    return dispatcher.registerPromiseForListOfObjects(endpointId, requestId, rClass, timeInMillis);\n  }\n\n  public JsonRpcPromise<List<String>> sendAndReceiveResultAsListOfString() {\n    return sendAndReceiveResultAsListOfString(0);\n  }\n\n  public JsonRpcPromise<List<String>> sendAndReceiveResultAsListOfString(int timeInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result list items class: \"\n            + String.class);\n\n    return dispatcher.registerPromiseForListOfObjects(\n        endpointId, requestId, String.class, timeInMillis);\n  }\n\n  public JsonRpcPromise<List<Boolean>> sendAndReceiveResultAsListOfBoolean() {\n    return sendAndReceiveResultAsListOfBoolean(0);\n  }\n\n  public JsonRpcPromise<List<Boolean>> sendAndReceiveResultAsListOfBoolean(int timeInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result list items class: \"\n            + Boolean.class);\n\n    return dispatcher.registerPromiseForListOfObjects(\n        endpointId, requestId, Boolean.class, timeInMillis);\n  }\n\n  public JsonRpcPromise<List<Double>> sendAndReceiveResultAsListOfDouble() {\n    return sendAndReceiveResultAsListOfDouble(0);\n  }\n\n  public JsonRpcPromise<List<Double>> sendAndReceiveResultAsListOfDouble(int timeInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + \"result list items class: \"\n            + Double.class);\n\n    return dispatcher.registerPromiseForListOfObjects(\n        endpointId, requestId, Double.class, timeInMillis);\n  }\n\n  private void transmitNotification() {\n    JsonRpcRequest request = new JsonRpcRequest(null, method, null);\n    String message = marshaller.marshall(request);\n    transmitter.transmit(endpointId, message);\n  }\n\n  private String transmitRequest() {\n    Integer id = MethodNameConfigurator.id.incrementAndGet();\n    String requestId = id.toString();\n\n    JsonRpcRequest request = new JsonRpcRequest(requestId, method, null);\n    String message = marshaller.marshall(request);\n    transmitter.transmit(endpointId, message);\n    return requestId;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/commons/transmission/SendConfiguratorFromOne.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons.transmission;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcMarshaller;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcParams;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcPromise;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcRequest;\nimport org.eclipse.che.api.core.jsonrpc.commons.ResponseDispatcher;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageTransmitter;\nimport org.slf4j.Logger;\n\n/**\n * Configurator defines the type of a result (if present) and send a request. Result types that are\n * supported: {@link String}, {@link Boolean}, {@link Double}, {@link Void} and DTO. This\n * configurator is used when we have defined request params as a single object.\n *\n * @param <P> type of params objects\n */\npublic class SendConfiguratorFromOne<P> {\n  private static final Logger LOGGER = getLogger(SendConfiguratorFromOne.class);\n\n  private final ResponseDispatcher dispatcher;\n  private final WebSocketMessageTransmitter transmitter;\n  private final JsonRpcMarshaller marshaller;\n\n  private final String method;\n  private final P pValue;\n  private final String endpointId;\n\n  SendConfiguratorFromOne(\n      JsonRpcMarshaller marshaller,\n      ResponseDispatcher dispatcher,\n      WebSocketMessageTransmitter transmitter,\n      String method,\n      P pValue,\n      String endpointId) {\n    this.marshaller = marshaller;\n    this.dispatcher = dispatcher;\n    this.transmitter = transmitter;\n\n    this.method = method;\n    this.pValue = pValue;\n    this.endpointId = endpointId;\n  }\n\n  public void sendAndSkipResult() {\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + (pValue != null ? \"params object class: \" + pValue.getClass() + \", \" : \"\")\n            + \"params list value\"\n            + pValue);\n\n    transmitNotification();\n  }\n\n  public <R> JsonRpcPromise<R> sendAndReceiveResultAsDto(final Class<R> rClass) {\n    return sendAndReceiveResultAsDto(rClass, 0);\n  }\n\n  public <R> JsonRpcPromise<R> sendAndReceiveResultAsDto(\n      final Class<R> rClass, int timeoutInMillis) {\n    checkNotNull(rClass, \"Result class value must not be null\");\n\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + (pValue != null ? \"params object class: \" + pValue.getClass() + \", \" : \"\")\n            + \"params list value\"\n            + pValue\n            + \", \"\n            + \"result object class: \"\n            + rClass);\n\n    return dispatcher.registerPromiseForSingleObject(\n        endpointId, requestId, rClass, timeoutInMillis);\n  }\n\n  public JsonRpcPromise<String> sendAndReceiveResultAsString() {\n    return sendAndReceiveResultAsString(0);\n  }\n\n  public JsonRpcPromise<String> sendAndReceiveResultAsString(int timeoutInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + (pValue != null ? \"params object class: \" + pValue.getClass() + \", \" : \"\")\n            + \"params list value\"\n            + pValue\n            + \", \"\n            + \"result object class: \"\n            + String.class);\n\n    return dispatcher.registerPromiseForSingleObject(\n        endpointId, requestId, String.class, timeoutInMillis);\n  }\n\n  public JsonRpcPromise<Double> sendAndReceiveResultAsDouble() {\n    return sendAndReceiveResultAsDouble(0);\n  }\n\n  public JsonRpcPromise<Double> sendAndReceiveResultAsDouble(int timeoutInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + (pValue != null ? \"params object class: \" + pValue.getClass() + \", \" : \"\")\n            + \"params list value\"\n            + pValue\n            + \", \"\n            + \"result object class: \"\n            + Double.class);\n\n    return dispatcher.registerPromiseForSingleObject(\n        endpointId, requestId, Double.class, timeoutInMillis);\n  }\n\n  public JsonRpcPromise<Boolean> sendAndReceiveResultAsBoolean() {\n    return sendAndReceiveResultAsBoolean(0);\n  }\n\n  public JsonRpcPromise<Boolean> sendAndReceiveResultAsBoolean(int timeoutInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + (pValue != null ? \"params object class: \" + pValue.getClass() + \", \" : \"\")\n            + \"params list value\"\n            + pValue\n            + \", \"\n            + \"result object class: \"\n            + Boolean.class);\n\n    return dispatcher.registerPromiseForSingleObject(\n        endpointId, requestId, Boolean.class, timeoutInMillis);\n  }\n\n  public <R> JsonRpcPromise<List<R>> sendAndReceiveResultAsListOfDto(Class<R> rClass) {\n    return sendAndReceiveResultAsListOfDto(rClass, 0);\n  }\n\n  public <R> JsonRpcPromise<List<R>> sendAndReceiveResultAsListOfDto(\n      Class<R> rClass, int timeoutInMillis) {\n    checkNotNull(rClass, \"Result class value must not be null\");\n\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + (pValue != null ? \"params object class: \" + pValue.getClass() + \", \" : \"\")\n            + \"params list value\"\n            + pValue\n            + \", \"\n            + \"result list items class: \"\n            + rClass);\n\n    return dispatcher.registerPromiseForListOfObjects(\n        endpointId, requestId, rClass, timeoutInMillis);\n  }\n\n  public JsonRpcPromise<List<String>> sendAndReceiveResultAsListOfString() {\n    return sendAndReceiveResultAsListOfString(0);\n  }\n\n  public JsonRpcPromise<List<String>> sendAndReceiveResultAsListOfString(int timeoutInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + (pValue != null ? \"params object class: \" + pValue.getClass() + \", \" : \"\")\n            + \"params list value\"\n            + pValue\n            + \", \"\n            + \"result list items class: \"\n            + String.class);\n\n    return dispatcher.registerPromiseForListOfObjects(\n        endpointId, requestId, String.class, timeoutInMillis);\n  }\n\n  public JsonRpcPromise<List<Boolean>> sendAndReceiveResultAsListOfBoolean() {\n    return sendAndReceiveResultAsListOfBoolean(0);\n  }\n\n  public JsonRpcPromise<List<Boolean>> sendAndReceiveResultAsListOfBoolean(int timeoutInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + (pValue != null ? \"params object class: \" + pValue.getClass() + \", \" : \"\")\n            + \"params list value\"\n            + pValue\n            + \", \"\n            + \"result list items class: \"\n            + Boolean.class);\n\n    return dispatcher.registerPromiseForListOfObjects(\n        endpointId, requestId, Boolean.class, timeoutInMillis);\n  }\n\n  public JsonRpcPromise<List<Double>> sendAndReceiveResultAsListOfDouble() {\n    return sendAndReceiveResultAsListOfDouble(0);\n  }\n\n  public JsonRpcPromise<List<Double>> sendAndReceiveResultAsListOfDouble(int timeoutInMillis) {\n    final String requestId = transmitRequest();\n\n    LOGGER.debug(\n        \"Transmitting request: \"\n            + \"endpoint ID: \"\n            + endpointId\n            + \", \"\n            + \"request ID: \"\n            + requestId\n            + \", \"\n            + \"method: \"\n            + method\n            + \", \"\n            + (pValue != null ? \"params object class: \" + pValue.getClass() + \", \" : \"\")\n            + \"params list value\"\n            + pValue\n            + \", \"\n            + \"result list items class: \"\n            + Double.class);\n\n    return dispatcher.registerPromiseForListOfObjects(\n        endpointId, requestId, Double.class, timeoutInMillis);\n  }\n\n  private void transmitNotification() {\n    JsonRpcParams params = new JsonRpcParams(pValue);\n    JsonRpcRequest request = new JsonRpcRequest(null, method, params);\n    String message = marshaller.marshall(request);\n    transmitter.transmit(endpointId, message);\n  }\n\n  private String transmitRequest() {\n    Integer id = MethodNameConfigurator.id.incrementAndGet();\n    String requestId = id.toString();\n\n    JsonRpcParams params = new JsonRpcParams(pValue);\n    JsonRpcRequest request = new JsonRpcRequest(requestId, method, params);\n    String message = marshaller.marshall(request);\n    transmitter.transmit(endpointId, message);\n\n    return requestId;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/impl/GsonJsonRpcComposer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.impl;\n\nimport static java.util.Collections.emptyList;\nimport static org.eclipse.che.api.core.jsonrpc.commons.JsonRpcUtils.cast;\n\nimport com.google.gson.JsonArray;\nimport com.google.gson.JsonElement;\nimport com.google.inject.Singleton;\nimport java.util.List;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcComposer;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcParams;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcResult;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n@Singleton\npublic class GsonJsonRpcComposer implements JsonRpcComposer {\n  @Override\n  public <T> T composeOne(JsonRpcParams params, Class<T> type) {\n    return composeOne(type, params.getOne());\n  }\n\n  @Override\n  public <T> List<T> composeMany(JsonRpcParams params, Class<T> type) {\n    return composeMany(type, params.getMany());\n  }\n\n  @Override\n  public <T> T composeOne(JsonRpcResult result, Class<T> type) {\n    return composeOne(type, result.getOne());\n  }\n\n  @Override\n  public <T> List<T> composeMany(JsonRpcResult result, Class<T> type) {\n    return composeMany(type, result.getMany());\n  }\n\n  private <T> T composeOne(Class<T> type, Object paramObject) {\n    if (paramObject instanceof JsonElement) {\n      JsonElement jsonElement = (JsonElement) paramObject;\n      return DtoFactory.getInstance().createDtoFromJson(jsonElement.toString(), type);\n    }\n\n    return cast(paramObject);\n  }\n\n  private <T> List<T> composeMany(Class<T> type, List<?> paramsList) {\n    if (paramsList.isEmpty()) {\n      return emptyList();\n    }\n\n    if (paramsList.get(0) instanceof JsonElement) {\n      JsonArray jsonArray = new JsonArray();\n      for (int i = 0; i < paramsList.size(); i++) {\n        JsonElement jsonElement = (JsonElement) paramsList.get(i);\n        jsonArray.set(i, jsonElement);\n      }\n      return DtoFactory.getInstance().createListDtoFromJson(jsonArray.toString(), type);\n    }\n\n    return cast(paramsList);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/impl/GsonJsonRpcMarshaller.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.impl;\n\nimport static org.eclipse.che.api.core.jsonrpc.commons.JsonRpcUtils.cast;\n\nimport com.google.gson.Gson;\nimport com.google.gson.JsonArray;\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonNull;\nimport com.google.gson.JsonObject;\nimport com.google.gson.JsonParser;\nimport com.google.gson.JsonPrimitive;\nimport com.google.inject.Inject;\nimport java.util.List;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcError;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcMarshaller;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcParams;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcRequest;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcResponse;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcResult;\nimport org.eclipse.che.dto.server.DtoFactory;\n\npublic class GsonJsonRpcMarshaller implements JsonRpcMarshaller {\n  private final JsonParser jsonParser;\n  private final Gson gson;\n\n  @Inject\n  public GsonJsonRpcMarshaller(JsonParser jsonParser, Gson gson) {\n    this.jsonParser = jsonParser;\n    this.gson = gson;\n  }\n\n  @Override\n  public String marshall(JsonRpcResponse response) {\n    JsonElement jsonId = getId(response);\n    JsonElement jsonResult = getResult(response);\n    JsonElement jsonError = getError(response);\n\n    return getResponse(jsonId, jsonResult, jsonError).toString();\n  }\n\n  @Override\n  public String marshall(JsonRpcRequest request) {\n    JsonElement method = getMethod(request);\n    JsonElement id = getId(request);\n    JsonElement params = getParams(request);\n\n    return getRequest(method, id, params).toString();\n  }\n\n  private JsonObject getRequest(\n      JsonElement jsonMethod, JsonElement jsonId, JsonElement jsonParams) {\n    JsonObject jsonRequest = new JsonObject();\n    jsonRequest.addProperty(\"jsonrpc\", \"2.0\");\n    jsonRequest.add(\"method\", jsonMethod);\n\n    if (jsonId != null) {\n      jsonRequest.add(\"id\", jsonId);\n    }\n\n    if (jsonParams != null) {\n      jsonRequest.add(\"params\", jsonParams);\n    }\n    return jsonRequest;\n  }\n\n  private JsonElement getParams(JsonRpcRequest request) {\n    if (!request.hasParams()) {\n      return null;\n    }\n\n    JsonRpcParams params = request.getParams();\n    return params.isSingle() ? getElement(params.getOne()) : getElements(params.getMany());\n  }\n\n  private JsonElement getId(JsonRpcRequest request) {\n    return request.hasId() ? new JsonPrimitive(request.getId()) : null;\n  }\n\n  private JsonPrimitive getMethod(JsonRpcRequest request) {\n    return new JsonPrimitive(request.getMethod());\n  }\n\n  private JsonObject getResponse(\n      JsonElement jsonId, JsonElement jsonResult, JsonElement jsonError) {\n    JsonObject jsonResponse = new JsonObject();\n    jsonResponse.addProperty(\"jsonrpc\", \"2.0\");\n    if (jsonId != null) {\n      jsonResponse.add(\"id\", jsonId);\n    }\n\n    if (jsonResult != null) {\n      jsonResponse.add(\"result\", jsonResult);\n    } else {\n      jsonResponse.add(\"error\", jsonError);\n    }\n    return jsonResponse;\n  }\n\n  private JsonObject getError(JsonRpcResponse response) {\n    if (!response.hasError()) {\n      return null;\n    }\n\n    JsonObject jsonError = new JsonObject();\n    JsonRpcError error = response.getError();\n    jsonError.add(\"code\", new JsonPrimitive(error.getCode()));\n    jsonError.add(\"message\", new JsonPrimitive(error.getMessage()));\n    return jsonError;\n  }\n\n  private JsonElement getResult(JsonRpcResponse response) {\n    if (!response.hasResult()) {\n      return null;\n    }\n\n    JsonRpcResult result = response.getResult();\n    return result.isSingle() ? getElement(result.getOne()) : getElements(result.getMany());\n  }\n\n  private JsonElement getId(JsonRpcResponse response) {\n    return response.hasId() ? new JsonPrimitive(response.getId()) : null;\n  }\n\n  private JsonElement getElements(List<?> params) {\n    JsonArray elements = new JsonArray();\n    params.forEach(param -> elements.add(getJsonElement(param)));\n    return elements;\n  }\n\n  private JsonElement getElement(Object param) {\n    JsonElement jsonElement = getJsonElement(param);\n    if (jsonElement.isJsonObject()) {\n      return jsonElement;\n    }\n\n    JsonArray array = new JsonArray();\n    array.add(jsonElement);\n    return array;\n  }\n\n  private JsonElement getJsonElement(Object param) {\n    if (param == null) {\n      return JsonNull.INSTANCE;\n    }\n    if (param instanceof JsonElement) {\n      return cast(param);\n    }\n    if (param instanceof String) {\n      return new JsonPrimitive((String) param);\n    }\n    if (param instanceof Boolean) {\n      return new JsonPrimitive((Boolean) param);\n    }\n    if (param instanceof Double) {\n      return new JsonPrimitive((Double) param);\n    }\n    try {\n      return jsonParser.parse(DtoFactory.getInstance().toJson(param));\n    } catch (IllegalArgumentException e) {\n      return gson.toJsonTree(param);\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/impl/GsonJsonRpcQualifier.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.impl;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonObject;\nimport com.google.gson.JsonParseException;\nimport com.google.gson.JsonParser;\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcQualifier;\nimport org.slf4j.Logger;\n\n@Singleton\npublic class GsonJsonRpcQualifier implements JsonRpcQualifier {\n  private static final Logger LOGGER = getLogger(GsonJsonRpcQualifier.class);\n\n  private final JsonParser jsonParser;\n\n  @Inject\n  public GsonJsonRpcQualifier(JsonParser jsonParser) {\n    this.jsonParser = jsonParser;\n  }\n\n  @Override\n  public boolean isValidJson(String message) {\n    checkNotNull(message, \"Message must not be null\");\n    checkArgument(!message.isEmpty(), \"Message must not be empty\");\n\n    LOGGER.trace(\"Validating message: {}\", message);\n\n    try {\n      JsonElement unused = jsonParser.parse(message);\n\n      LOGGER.trace(\"Validation successful\");\n      return true;\n    } catch (JsonParseException e) {\n      LOGGER.warn(\"Validation failed: {}\", e.getMessage(), e);\n      return false;\n    }\n  }\n\n  @Override\n  public boolean isJsonRpcRequest(String message) {\n    checkNotNull(message, \"Message must not be null\");\n    checkArgument(!message.isEmpty(), \"Message must not be empty\");\n    LOGGER.trace(\"Qualifying message: \" + message);\n\n    JsonObject jsonObject = jsonParser.parse(message).getAsJsonObject();\n    LOGGER.trace(\n        \"Json keys: \"\n            + jsonObject.entrySet().stream().map(Map.Entry::getKey).collect(Collectors.toSet()));\n\n    if (jsonObject.has(\"method\")) {\n      LOGGER.trace(\"Qualified to request\");\n      return true;\n    } else {\n      LOGGER.trace(\"Qualified to response\");\n      return false;\n    }\n  }\n\n  @Override\n  public boolean isJsonRpcResponse(String message) {\n    checkNotNull(message, \"Message must not be null\");\n    checkArgument(!message.isEmpty(), \"Message must not be empty\");\n    LOGGER.trace(\"Qualifying message: \" + message);\n\n    JsonObject jsonObject = jsonParser.parse(message).getAsJsonObject();\n    LOGGER.trace(\n        \"Json keys: \"\n            + jsonObject.entrySet().stream().map(Map.Entry::getKey).collect(Collectors.toSet()));\n\n    if (jsonObject.has(\"error\") != jsonObject.has(\"result\")) {\n      LOGGER.trace(\"Qualified to response\");\n      return true;\n    }\n    return false;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/impl/GsonJsonRpcUnmarshaller.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.impl;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static java.util.Collections.singletonList;\n\nimport com.google.gson.JsonArray;\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonObject;\nimport com.google.gson.JsonParser;\nimport com.google.gson.JsonPrimitive;\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcError;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcParams;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcRequest;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcResponse;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcResult;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcUnmarshaller;\n\n@Singleton\npublic class GsonJsonRpcUnmarshaller implements JsonRpcUnmarshaller {\n  private final JsonParser jsonParser;\n\n  @Inject\n  public GsonJsonRpcUnmarshaller(JsonParser jsonParser) {\n    this.jsonParser = jsonParser;\n  }\n\n  @Override\n  public List<String> unmarshalArray(String message) {\n    return getArray(message, jsonParser.parse(message).isJsonArray());\n  }\n\n  @Override\n  public JsonRpcRequest unmarshalRequest(String message) {\n    checkNotNull(message, \"Message must not be null\");\n    checkArgument(!message.isEmpty(), \"Message must not be empty\");\n\n    JsonObject request = jsonParser.parse(message).getAsJsonObject();\n\n    String method = getMethod(request);\n    String id = getId(request);\n    JsonRpcParams params = getParams(request);\n\n    return new JsonRpcRequest(id, method, params);\n  }\n\n  @Override\n  public JsonRpcResponse unmarshalResponse(String message) {\n    checkNotNull(message, \"Message must not be null\");\n    checkArgument(!message.isEmpty(), \"Message must not be empty\");\n\n    JsonObject response = jsonParser.parse(message).getAsJsonObject();\n\n    String id = getId(response);\n    JsonRpcResult result = getResult(response);\n    JsonRpcError error = getError(response);\n\n    return new JsonRpcResponse(id, result, error);\n  }\n\n  private JsonRpcError getError(JsonObject response) {\n    if (!response.has(\"error\")) {\n      return null;\n    }\n\n    int code = response.get(\"error\").getAsJsonObject().get(\"code\").getAsInt();\n    String errorMessage = response.get(\"error\").getAsJsonObject().get(\"message\").getAsString();\n    return new JsonRpcError(code, errorMessage);\n  }\n\n  private JsonRpcResult getResult(JsonObject response) {\n    if (!response.has(\"result\")) {\n      return null;\n    }\n\n    JsonElement jsonElement = response.get(\"result\");\n    if (!jsonElement.isJsonArray()) {\n      return new JsonRpcResult(getInnerItem(jsonElement));\n    }\n\n    JsonArray jsonArray = jsonElement.getAsJsonArray();\n    int size = jsonArray.size();\n    List<Object> innerResults = new ArrayList<>(size);\n    for (int i = 0; i < size; i++) {\n      JsonElement innerJsonElement = jsonArray.get(i);\n      innerResults.add(getInnerItem(innerJsonElement));\n    }\n\n    return new JsonRpcResult(innerResults);\n  }\n\n  private JsonRpcParams getParams(JsonObject jsonObject) {\n    if (!jsonObject.has(\"params\")) {\n      return null;\n    }\n\n    JsonElement jsonElement = jsonObject.get(\"params\");\n    if (!jsonElement.isJsonArray()) {\n      return new JsonRpcParams(getInnerItem(jsonElement));\n    }\n\n    JsonArray jsonArray = jsonElement.getAsJsonArray();\n    int size = jsonArray.size();\n    List<Object> innerParameters = new ArrayList<>(size);\n    for (int i = 0; i < size; i++) {\n      JsonElement innerJsonElement = jsonArray.get(i);\n      innerParameters.add(getInnerItem(innerJsonElement));\n    }\n\n    return new JsonRpcParams(innerParameters);\n  }\n\n  private String getId(JsonObject jsonObject) {\n    return jsonObject.has(\"id\") ? jsonObject.get(\"id\").getAsString() : null;\n  }\n\n  private String getMethod(JsonObject jsonObject) {\n    return jsonObject.get(\"method\").getAsString();\n  }\n\n  private List<String> getArray(String message, boolean isArray) {\n    if (!isArray) {\n      return singletonList(message);\n    }\n\n    JsonArray jsonArray = jsonParser.parse(message).getAsJsonArray();\n    int size = jsonArray.size();\n    List<String> result = new ArrayList<>(size);\n    for (int i = 0; i < size; i++) {\n      JsonElement jsonElement = jsonArray.get(i);\n      result.add(jsonElement.toString());\n    }\n    return result;\n  }\n\n  private Object getInnerItem(JsonElement jsonElement) {\n    if (jsonElement.isJsonNull()) {\n      return null;\n    }\n\n    if (jsonElement.isJsonObject()) {\n      return jsonElement.getAsJsonObject();\n    }\n\n    if (jsonElement.isJsonPrimitive()) {\n      JsonPrimitive jsonPrimitive = jsonElement.getAsJsonPrimitive();\n      if (jsonPrimitive.isNumber()) {\n        return jsonPrimitive.getAsDouble();\n      } else if (jsonPrimitive.isString()) {\n        return jsonPrimitive.getAsString();\n      } else {\n        return jsonPrimitive.getAsBoolean();\n      }\n    }\n\n    throw new IllegalStateException(\"Unexpected json element type\");\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/impl/JsonRpcModule.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.impl;\n\nimport com.google.gson.Gson;\nimport com.google.gson.JsonParser;\nimport com.google.inject.AbstractModule;\nimport com.google.inject.Provides;\nimport com.google.inject.assistedinject.FactoryModuleBuilder;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcComposer;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcMarshaller;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcQualifier;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcUnmarshaller;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerConfigurator;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestProcessor;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestProcessorConfigurationProvider;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter;\nimport org.eclipse.che.api.core.jsonrpc.commons.TimeoutActionRunner;\nimport org.eclipse.che.dto.server.DtoFactory;\n\npublic class JsonRpcModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    install(new FactoryModuleBuilder().build(RequestHandlerConfigurator.class));\n    install(new FactoryModuleBuilder().build(RequestTransmitter.class));\n\n    bind(JsonRpcMarshaller.class).to(GsonJsonRpcMarshaller.class);\n    bind(JsonRpcUnmarshaller.class).to(GsonJsonRpcUnmarshaller.class);\n    bind(JsonRpcQualifier.class).to(GsonJsonRpcQualifier.class);\n    bind(JsonRpcComposer.class).to(GsonJsonRpcComposer.class);\n\n    bind(RequestProcessor.class).to(ServerSideRequestProcessor.class);\n    bind(RequestProcessorConfigurationProvider.class)\n        .to(ServerSideRequestProcessorConfigurator.class);\n    bind(TimeoutActionRunner.class).to(ServerSideTimeoutActionRunner.class);\n  }\n\n  @Provides\n  @Singleton\n  public JsonParser jsonParser() {\n    return new JsonParser();\n  }\n\n  @Provides\n  @Singleton\n  protected Gson gson() {\n    return DtoFactory.getInstance().getGson();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/impl/ServerSideRequestProcessor.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.impl;\n\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport java.util.concurrent.ExecutorService;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestProcessor;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestProcessorConfigurationProvider;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestProcessorConfigurationProvider.Configuration;\nimport org.eclipse.che.commons.lang.concurrent.ThreadLocalPropagateContext;\n\n@Singleton\npublic class ServerSideRequestProcessor implements RequestProcessor {\n  private final RequestProcessorConfigurationProvider requestProcessorConfigurator;\n\n  @Inject\n  public ServerSideRequestProcessor(\n      RequestProcessorConfigurationProvider requestProcessorConfigurator) {\n    this.requestProcessorConfigurator = requestProcessorConfigurator;\n  }\n\n  @Override\n  public void process(String endpointId, Runnable runnable) {\n    Configuration configuration = requestProcessorConfigurator.get(endpointId);\n    ExecutorService executionService = configuration.getExecutorService();\n    executionService.execute(ThreadLocalPropagateContext.wrap(runnable));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/impl/ServerSideRequestProcessorConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.impl;\n\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestProcessorConfigurationProvider;\n\n@Singleton\npublic class ServerSideRequestProcessorConfigurator\n    implements RequestProcessorConfigurationProvider {\n\n  private final Map<String, Configuration> configurations;\n\n  @Inject\n  public ServerSideRequestProcessorConfigurator(\n      Set<RequestProcessorConfigurationProvider.Configuration> configurations) {\n    this.configurations =\n        configurations.stream()\n            .collect(Collectors.toMap(Configuration::getEndpointId, Function.identity()));\n  }\n\n  @Override\n  public Configuration get(String endpointId) {\n    return configurations.get(endpointId);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/jsonrpc/impl/ServerSideTimeoutActionRunner.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.impl;\n\nimport com.google.inject.Singleton;\nimport java.util.Timer;\nimport java.util.TimerTask;\nimport org.eclipse.che.api.core.jsonrpc.commons.TimeoutActionRunner;\n\n@Singleton\npublic class ServerSideTimeoutActionRunner implements TimeoutActionRunner {\n\n  @Override\n  public void schedule(int timeoutInMillis, Runnable runnable) {\n    new Timer()\n        .schedule(\n            new TimerTask() {\n              @Override\n              public void run() {\n                runnable.run();\n              }\n            },\n            timeoutInMillis);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/notification/EventOrigin.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.notification;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * @author andrew00x\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface EventOrigin {\n  String value();\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/notification/EventService.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.notification;\n\nimport com.google.common.cache.CacheBuilder;\nimport com.google.common.cache.CacheLoader;\nimport com.google.common.cache.LoadingCache;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.LinkedList;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\nimport java.util.concurrent.CopyOnWriteArraySet;\nimport javax.inject.Singleton;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Dispatchers events to listeners. Usage example:\n *\n * <pre>\n *     EventService bus = new EventService();\n *     bus.subscribe(new EventSubscriber&lt;MyEvent&gt;() {\n *         &#64;Override\n *         public void onEvent(MyEvent event) {\n *             // do something with event\n *         }\n *     });\n *     bus.publish(new MyEvent());\n * </pre>\n *\n * @author andrew00x\n */\n@Singleton\npublic class EventService {\n  private static final Logger LOG = LoggerFactory.getLogger(EventService.class);\n\n  private static final int CACHE_NUM = 1 << 2;\n  private static final int CACHE_MASK = CACHE_NUM - 1;\n  private static final int SEG_SIZE = 32;\n\n  private final LoadingCache<Class<?>, Set<Class<?>>>[] typeCache;\n  private final ConcurrentMap<Class<?>, Set<EventSubscriber>> subscribersByEventType;\n\n  @SuppressWarnings(\"unchecked\")\n  public EventService() {\n    subscribersByEventType = new ConcurrentHashMap<>();\n    typeCache = new LoadingCache[CACHE_NUM];\n    for (int i = 0; i < CACHE_NUM; i++) {\n      typeCache[i] =\n          CacheBuilder.newBuilder()\n              .concurrencyLevel(SEG_SIZE)\n              .build(\n                  new CacheLoader<Class<?>, Set<Class<?>>>() {\n                    @Override\n                    public Set<Class<?>> load(Class<?> eventClass) {\n                      LinkedList<Class<?>> parents = new LinkedList<>();\n                      Set<Class<?>> classes = new HashSet<>();\n                      parents.add(eventClass);\n                      while (!parents.isEmpty()) {\n                        Class<?> clazz = parents.pop();\n                        classes.add(clazz);\n                        Class<?> parent = clazz.getSuperclass();\n                        if (parent != null) {\n                          parents.add(parent);\n                        }\n                        Class<?>[] interfaces = clazz.getInterfaces();\n                        if (interfaces.length > 0) {\n                          Collections.addAll(parents, interfaces);\n                        }\n                      }\n                      return classes;\n                    }\n                  });\n    }\n  }\n\n  /**\n   * Publish event {@code event}.\n   *\n   * @param event event\n   * @return published event\n   */\n  @SuppressWarnings(\"unchecked\")\n  public <T> T publish(T event) {\n    if (event == null) {\n      throw new IllegalArgumentException(\"Null event.\");\n    }\n    final Class<?> eventClass = event.getClass();\n    for (Class<?> clazz : typeCache[eventClass.hashCode() & CACHE_MASK].getUnchecked(eventClass)) {\n      final Set<EventSubscriber> eventSubscribers = subscribersByEventType.get(clazz);\n      if (eventSubscribers != null && !eventSubscribers.isEmpty()) {\n        for (EventSubscriber eventSubscriber : eventSubscribers) {\n          try {\n            LOG.debug(\"Publish event {} for {}\", event, eventSubscriber);\n            eventSubscriber.onEvent(event);\n          } catch (RuntimeException e) {\n            LOG.error(e.getMessage(), e);\n          }\n        }\n      }\n    }\n    return event;\n  }\n\n  /**\n   * Subscribe event listener. The event to subscribe to is inferred by checking the generic type\n   * arguments of the given subscriber.\n   *\n   * @param subscriber event subscriber\n   */\n  public void subscribe(EventSubscriber<?> subscriber) {\n    final Class<?> eventType = getEventType(subscriber);\n    doSubscribe(subscriber, eventType);\n  }\n\n  /**\n   * Subscribe to an event. The given subscriber will be called whenever an instance of the\n   * specified event is published.\n   *\n   * @param subscriber The subscriber to call when an event is published.\n   * @param eventType The event to subscribe to.\n   */\n  public <T> void subscribe(EventSubscriber<? extends T> subscriber, Class<T> eventType) {\n    doSubscribe(subscriber, eventType);\n  }\n\n  private void doSubscribe(EventSubscriber<?> subscriber, Class<?> eventType) {\n    Set<EventSubscriber> entries = subscribersByEventType.get(eventType);\n    if (entries == null) {\n      Set<EventSubscriber> newEntries = new CopyOnWriteArraySet<>();\n      entries = subscribersByEventType.putIfAbsent(eventType, newEntries);\n      if (entries == null) {\n        entries = newEntries;\n      }\n    }\n    entries.add(subscriber);\n  }\n\n  /**\n   * Unsubscribe event listener.\n   *\n   * @param subscriber event subscriber\n   */\n  public void unsubscribe(EventSubscriber<?> subscriber) {\n    final Class<?> eventType = getEventType(subscriber);\n    doUnsubscribe(subscriber, eventType);\n  }\n\n  public <T> void unsubscribe(EventSubscriber<T> subscriber, Class<T> eventType) {\n    doUnsubscribe(subscriber, eventType);\n  }\n\n  private void doUnsubscribe(EventSubscriber<?> subscriber, Class<?> eventType) {\n    final Set<EventSubscriber> entries = subscribersByEventType.get(eventType);\n    if (entries != null && !entries.isEmpty()) {\n      boolean changed = entries.remove(subscriber);\n      if (changed) {\n        if (entries.isEmpty()) {\n          subscribersByEventType.remove(eventType);\n        }\n      }\n    }\n  }\n\n  private Class<?> getEventType(EventSubscriber<?> subscriber) {\n    Class<?> eventType = null;\n    Class<?> clazz = subscriber.getClass();\n    while (clazz != null && eventType == null) {\n      for (Type type : clazz.getGenericInterfaces()) {\n        if (type instanceof ParameterizedType) {\n          final ParameterizedType parameterizedType = (ParameterizedType) type;\n          final Type rawType = parameterizedType.getRawType();\n          if (EventSubscriber.class == rawType) {\n            final Type[] typeArguments = parameterizedType.getActualTypeArguments();\n            if (typeArguments.length == 1) {\n              if (typeArguments[0] instanceof Class) {\n                eventType = (Class) typeArguments[0];\n              }\n            }\n          }\n        }\n      }\n      clazz = clazz.getSuperclass();\n    }\n    if (eventType == null) {\n      throw new IllegalArgumentException(\n          String.format(\"Unable determine type of events processed by %s\", subscriber));\n    }\n    return eventType;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/notification/EventSubscriber.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.notification;\n\n/**\n * Receives notification events from EventService.\n *\n * @author andrew00x\n * @see EventService\n */\npublic interface EventSubscriber<T> {\n  /**\n   * Receives notification that an event has been published to the EventService. If the method\n   * throws an unchecked exception it is ignored.\n   */\n  void onEvent(T event);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/notification/InmemoryRemoteSubscriptionStorage.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.notification;\n\nimport java.util.Collections;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentHashMap;\nimport javax.inject.Singleton;\n\n/**\n * Imnemory implementation of {@link RemoteSubscriptionStorage}\n *\n * @author Max Shaposhnik (mshaposh@redhat.com)\n */\n@Singleton\npublic class InmemoryRemoteSubscriptionStorage implements RemoteSubscriptionStorage {\n\n  private final Map<String, Set<RemoteSubscriptionContext>> subscriptions =\n      new ConcurrentHashMap<>();\n\n  @Override\n  public Set<RemoteSubscriptionContext> getByMethod(String method) {\n    return subscriptions.getOrDefault(method, Collections.emptySet());\n  }\n\n  @Override\n  public void addSubscription(String method, RemoteSubscriptionContext remoteSubscriptionContext) {\n    subscriptions\n        .computeIfAbsent(method, k -> ConcurrentHashMap.newKeySet(1))\n        .add(remoteSubscriptionContext);\n  }\n\n  @Override\n  public void removeSubscription(String method, String endpointId) {\n    subscriptions\n        .getOrDefault(method, Collections.emptySet())\n        .removeIf(\n            remoteSubscriptionContext ->\n                Objects.equals(remoteSubscriptionContext.getEndpointId(), endpointId));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/notification/RemoteSubscriptionContext.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.notification;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * Describes single event subscription with limiting scope.\n *\n * @author Max Shaposhnik (mshaposh@redhat.com)\n */\npublic class RemoteSubscriptionContext implements Serializable {\n\n  private final String endpointId;\n  private final Map<String, String> scope;\n\n  RemoteSubscriptionContext(String endpointId, Map<String, String> scope) {\n    this.endpointId = endpointId;\n    this.scope = scope;\n  }\n\n  public String getEndpointId() {\n    return endpointId;\n  }\n\n  public Map<String, String> getScope() {\n    return scope;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/notification/RemoteSubscriptionManager.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.notification;\n\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport java.util.Map;\nimport java.util.function.BiPredicate;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerConfigurator;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter;\nimport org.eclipse.che.api.core.notification.dto.EventSubscription;\n\n@Singleton\npublic class RemoteSubscriptionManager {\n\n  public static final String SUBSCRIBE_JSON_RPC_METHOD = \"subscribe\";\n  public static final String UNSUBSCRIBE_JSON_RPC_METHOD = \"unSubscribe\";\n\n  private final EventService eventService;\n  private final RequestTransmitter requestTransmitter;\n  private final RemoteSubscriptionStorage remoteSubscriptionStorage;\n\n  @Inject\n  public RemoteSubscriptionManager(\n      EventService eventService,\n      RequestTransmitter requestTransmitter,\n      RemoteSubscriptionStorage remoteSubscriptionStorage) {\n    this.eventService = eventService;\n    this.requestTransmitter = requestTransmitter;\n    this.remoteSubscriptionStorage = remoteSubscriptionStorage;\n  }\n\n  @Inject\n  private void configureSubscription(RequestHandlerConfigurator requestHandlerConfigurator) {\n    requestHandlerConfigurator\n        .newConfiguration()\n        .methodName(SUBSCRIBE_JSON_RPC_METHOD)\n        .paramsAsDto(EventSubscription.class)\n        .noResult()\n        .withBiConsumer(this::consumeSubscriptionRequest);\n\n    requestHandlerConfigurator\n        .newConfiguration()\n        .methodName(UNSUBSCRIBE_JSON_RPC_METHOD)\n        .paramsAsDto(EventSubscription.class)\n        .noResult()\n        .withBiConsumer(this::consumeUnSubscriptionRequest);\n  }\n\n  public <T> void register(\n      String method, Class<T> eventType, BiPredicate<T, Map<String, String>> biPredicate) {\n    eventService.subscribe(\n        event ->\n            remoteSubscriptionStorage.getByMethod(method).stream()\n                .filter(context -> biPredicate.test(event, context.getScope()))\n                .forEach(context -> transmit(context.getEndpointId(), method, event)),\n        eventType);\n  }\n\n  private void consumeSubscriptionRequest(String endpointId, EventSubscription eventSubscription) {\n    remoteSubscriptionStorage.addSubscription(\n        eventSubscription.getMethod(),\n        new RemoteSubscriptionContext(endpointId, eventSubscription.getScope()));\n  }\n\n  private void consumeUnSubscriptionRequest(\n      String endpointId, EventSubscription eventSubscription) {\n    remoteSubscriptionStorage.removeSubscription(eventSubscription.getMethod(), endpointId);\n  }\n\n  private <T> void transmit(String endpointId, String method, T event) {\n    requestTransmitter\n        .newRequest()\n        .endpointId(endpointId)\n        .methodName(method)\n        .paramsAsDto(event)\n        .sendAndSkipResult();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/notification/RemoteSubscriptionStorage.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.notification;\n\nimport java.util.Set;\n\n/**\n * Method - based storage of event subscriptions.\n *\n * @author Max Shaposhnik (mshaposh@redhat.com)\n */\npublic interface RemoteSubscriptionStorage {\n\n  /**\n   * Returns all active subscriptions for the given method. It is recommended for implementations to\n   * return copy of the stored set, so this method should not be used for modifying operations.\n   *\n   * @param method Method name\n   * @return active subscriptions to this method\n   */\n  Set<RemoteSubscriptionContext> getByMethod(String method);\n\n  /**\n   * Adds new subscription to the given method subscriptions list\n   *\n   * @param method Method name\n   * @param remoteSubscriptionContext new subscription\n   */\n  void addSubscription(String method, RemoteSubscriptionContext remoteSubscriptionContext);\n\n  /**\n   * Removes particular subscription from the given method subscriptions list\n   *\n   * @param method Method name\n   * @param endpointId id of endpoint to remove\n   */\n  void removeSubscription(String method, String endpointId);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/notification/dto/EventSubscription.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.notification.dto;\n\nimport java.util.Map;\nimport org.eclipse.che.dto.shared.DTO;\n\n@DTO\npublic interface EventSubscription {\n  String getMethod();\n\n  EventSubscription withMethod(String method);\n\n  Map<String, String> getScope();\n\n  EventSubscription withScope(Map<String, String> scope);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/ApiExceptionMapper.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.ext.ExceptionMapper;\nimport jakarta.ws.rs.ext.Provider;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * @author andrew00x\n * @author gazarenkov\n */\n@Provider\n@Singleton\npublic class ApiExceptionMapper implements ExceptionMapper<ApiException> {\n  @Override\n  public Response toResponse(ApiException exception) {\n\n    if (exception instanceof ForbiddenException)\n      return Response.status(Response.Status.FORBIDDEN)\n          .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    else if (exception instanceof NotFoundException)\n      return Response.status(Response.Status.NOT_FOUND)\n          .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    else if (exception instanceof UnauthorizedException)\n      return Response.status(Response.Status.UNAUTHORIZED)\n          .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    else if (exception instanceof BadRequestException)\n      return Response.status(Response.Status.BAD_REQUEST)\n          .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    else if (exception instanceof ConflictException)\n      return Response.status(Response.Status.CONFLICT)\n          .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    else if (exception instanceof ServerException)\n      return Response.serverError()\n          .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    else\n      return Response.serverError()\n          .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/ApiInfoProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport java.io.InputStream;\nimport java.net.URL;\nimport java.util.jar.Attributes;\nimport java.util.jar.Manifest;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.rest.shared.dto.ApiInfo;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Provides api info by reading it from war manifest.\n *\n * @author Max Shaposhnyk\n */\n@Singleton\npublic class ApiInfoProvider implements Provider<ApiInfo> {\n\n  private static final Logger LOG = LoggerFactory.getLogger(ApiInfoProvider.class);\n\n  private ApiInfo apiInfo;\n\n  @Inject\n  public ApiInfoProvider(@Named(\"che.product.build_info\") String buildInfo) {\n    this.apiInfo = readApiInfo(buildInfo);\n  }\n\n  @Override\n  public ApiInfo get() {\n    return apiInfo;\n  }\n\n  private ApiInfo readApiInfo(String buildInfo) {\n    try {\n      // calculate path to MANIFEST.MF in the jar with ApiInfo.class\n      Class clazz = ApiInfo.class;\n      String classPath = clazz.getResource(clazz.getSimpleName() + \".class\").toString();\n\n      String manifestPath =\n          classPath.substring(0, classPath.lastIndexOf(\"!\") + 1) + \"/META-INF/MANIFEST.MF\";\n\n      try (InputStream manifestInputStream = new URL(manifestPath).openStream()) {\n\n        final Manifest manifest = new Manifest(manifestInputStream);\n        final Attributes mainAttributes = manifest.getMainAttributes();\n        final DtoFactory dtoFactory = DtoFactory.getInstance();\n        return dtoFactory\n            .createDto(ApiInfo.class)\n            .withSpecificationVendor(mainAttributes.getValue(\"Specification-Vendor\"))\n            .withImplementationVendor(mainAttributes.getValue(\"Implementation-Vendor\"))\n            .withSpecificationTitle(\"Che REST API\")\n            .withSpecificationVersion(mainAttributes.getValue(\"Specification-Version\"))\n            .withImplementationVersion(mainAttributes.getValue(\"Implementation-Version\"))\n            .withScmRevision(mainAttributes.getValue(\"SCM-Revision\"))\n            .withBuildInfo(buildInfo);\n      }\n\n    } catch (Exception e) {\n      LOG.error(\"Unable to read API information. Error: \" + e.getMessage(), e);\n      throw new RuntimeException(\"Unable to read API information\", e);\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/ApiInfoService.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static java.util.stream.Collectors.toList;\n\nimport jakarta.servlet.ServletContext;\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.core.Context;\nimport jakarta.ws.rs.core.MediaType;\nimport java.util.function.Function;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.rest.annotations.OPTIONS;\nimport org.eclipse.che.api.core.rest.shared.dto.ApiInfo;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.everrest.core.ObjectFactory;\nimport org.everrest.core.ResourceBinder;\nimport org.everrest.core.resource.ResourceDescriptor;\nimport org.everrest.services.RestServicesList.RootResource;\nimport org.everrest.services.RestServicesList.RootResourcesList;\n\n/**\n * @author andrew00x\n */\n@Path(\"/\")\npublic class ApiInfoService {\n\n  @Inject private ApiInfo apiInfo;\n\n  @OPTIONS\n  public ApiInfo info() {\n    return apiInfo;\n  }\n\n  @GET\n  @Produces({MediaType.APPLICATION_JSON})\n  public RootResourcesList listJSON(@Context ServletContext context) {\n    ResourceBinder binder = (ResourceBinder) context.getAttribute(ResourceBinder.class.getName());\n    return new RootResourcesList(\n        binder.getResources().stream()\n            .map(\n                new Function<ObjectFactory<ResourceDescriptor>, RootResource>() {\n                  @Nullable\n                  @Override\n                  public RootResource apply(ObjectFactory<ResourceDescriptor> input) {\n                    ResourceDescriptor descriptor = input.getObjectModel();\n                    return new RootResource(\n                        descriptor.getObjectClass().getName(), //\n                        descriptor.getPathValue().getPath(), //\n                        descriptor.getUriPattern().getRegex());\n                  }\n                })\n            .collect(toList()));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/AuthenticationExceptionMapper.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.ext.ExceptionMapper;\nimport jakarta.ws.rs.ext.Provider;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.AuthenticationException;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * jakarta.ws.rs.ext.ExceptionMapper for AuthenticationException\n *\n * @author Alexander Garagatyi\n */\n@Provider\n@Singleton\npublic class AuthenticationExceptionMapper implements ExceptionMapper<AuthenticationException> {\n  private static final Logger LOG = LoggerFactory.getLogger(AuthenticationExceptionMapper.class);\n\n  @Override\n  public Response toResponse(AuthenticationException exception) {\n    LOG.debug(exception.getLocalizedMessage());\n\n    int responseStatus = exception.getResponseStatus();\n    String message = exception.getMessage();\n    if (message != null) {\n      return Response.status(responseStatus)\n          .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    }\n    return Response.status(responseStatus).build();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/CheJsonProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport com.google.gson.reflect.TypeToken;\nimport jakarta.ws.rs.Consumes;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.WebApplicationException;\nimport jakarta.ws.rs.core.HttpHeaders;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.MultivaluedMap;\nimport jakarta.ws.rs.ext.MessageBodyReader;\nimport jakarta.ws.rs.ext.MessageBodyWriter;\nimport jakarta.ws.rs.ext.Provider;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.io.OutputStreamWriter;\nimport java.io.Writer;\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.nio.charset.StandardCharsets;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.eclipse.che.dto.server.JsonSerializable;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.everrest.core.impl.provider.JsonEntityProvider;\n\n/**\n * Implementation of {@link MessageBodyReader} and {@link MessageBodyWriter} needed for binding JSON\n * content to and from Java Objects.\n *\n * @author andrew00x\n * @see DTO\n * @see DtoFactory\n */\n@Singleton\n@Provider\n@Produces({MediaType.APPLICATION_JSON})\n@Consumes({MediaType.APPLICATION_JSON})\npublic class CheJsonProvider<T> implements MessageBodyReader<T>, MessageBodyWriter<T> {\n  private Set<Class> ignoredClasses;\n  private final JsonEntityProvider delegate = new JsonEntityProvider<>();\n  private final Type listOfJsonSerializableType =\n      new TypeToken<List<JsonSerializable>>() {}.getType();\n\n  @Inject\n  public CheJsonProvider(@Nullable @Named(\"che.json.ignored_classes\") Set<Class> ignoredClasses) {\n    this.ignoredClasses =\n        ignoredClasses == null ? new LinkedHashSet<Class>() : new LinkedHashSet<>(ignoredClasses);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  @Override\n  public boolean isWriteable(\n      Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {\n    return !ignoredClasses.contains(type)\n        && (type.isAnnotationPresent(DTO.class)\n            || delegate.isWriteable(type, genericType, annotations, mediaType));\n  }\n\n  @Override\n  public long getSize(\n      T t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {\n    return -1;\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  @Override\n  public void writeTo(\n      T t,\n      Class<?> type,\n      Type genericType,\n      Annotation[] annotations,\n      MediaType mediaType,\n      MultivaluedMap<String, Object> httpHeaders,\n      OutputStream entityStream)\n      throws IOException, WebApplicationException {\n    // Add Cache-Control before start write body.\n    httpHeaders.putSingle(HttpHeaders.CACHE_CONTROL, \"public, no-cache, no-store, no-transform\");\n    if (t instanceof JsonSerializable) {\n      try (Writer w = new OutputStreamWriter(entityStream, StandardCharsets.UTF_8)) {\n        ((JsonSerializable) t).toJson(w);\n      }\n    } else if (isDtoList(type, genericType, t)) {\n      try (Writer w = new OutputStreamWriter(entityStream, StandardCharsets.UTF_8)) {\n        DtoFactory.getInstance().getGson().toJson(t, listOfJsonSerializableType, w);\n      }\n    } else {\n      delegate.writeTo(t, type, genericType, annotations, mediaType, httpHeaders, entityStream);\n    }\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  @Override\n  public boolean isReadable(\n      Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {\n    return !ignoredClasses.contains(type)\n        && (type.isAnnotationPresent(DTO.class)\n            || delegate.isReadable(type, genericType, annotations, mediaType));\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  @Override\n  public T readFrom(\n      Class<T> type,\n      Type genericType,\n      Annotation[] annotations,\n      MediaType mediaType,\n      MultivaluedMap<String, String> httpHeaders,\n      InputStream entityStream)\n      throws IOException, WebApplicationException {\n    if (type.isAnnotationPresent(DTO.class)) {\n      return DtoFactory.getInstance().createDtoFromJson(entityStream, type);\n    } else if (isDtoList(type, genericType, null)) {\n      ParameterizedType parameterizedType = (ParameterizedType) genericType;\n      Type elementType = parameterizedType.getActualTypeArguments()[0];\n      return (T) DtoFactory.getInstance().createListDtoFromJson(entityStream, (Class) elementType);\n    }\n    return (T)\n        delegate.readFrom(type, genericType, annotations, mediaType, httpHeaders, entityStream);\n  }\n\n  /**\n   * Get Set of classes that we never try to serialize or deserialize. Returned Set is mutable and\n   * new classes may be added in ignored Set.\n   */\n  public Set<Class> getIgnoredClasses() {\n    return ignoredClasses;\n  }\n\n  /** Checks if provided object is a list of DTO or serializable objects. */\n  private static <T> boolean isDtoList(Class<?> type, Type genericType, T t) {\n    if (!List.class.isAssignableFrom(type)) {\n      return false;\n    }\n    if (genericType instanceof ParameterizedType) {\n      ParameterizedType parameterizedType = (ParameterizedType) genericType;\n      Type elementType = parameterizedType.getActualTypeArguments()[0];\n      return elementType instanceof Class && ((Class) elementType).isAnnotationPresent(DTO.class);\n    } else if (t instanceof List && type.equals(genericType)) {\n      List list = (List) t;\n      return !list.isEmpty() && list.iterator().next() instanceof JsonSerializable;\n    }\n    return false;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/Constants.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\n/**\n * @author andrew00x\n */\npublic final class Constants {\n  public static final String API_VERSION = \"1.0\";\n\n  private Constants() {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/CoreRestModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\nimport com.google.inject.name.Names;\nimport org.eclipse.che.api.core.rest.shared.dto.ApiInfo;\nimport org.eclipse.che.api.core.util.ApiInfoLogInformer;\n\n/**\n * @author andrew00x\n */\npublic class CoreRestModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    bind(CheJsonProvider.class);\n    bind(ApiExceptionMapper.class);\n    bind(RuntimeExceptionMapper.class);\n    bind(ApiInfo.class).toProvider(ApiInfoProvider.class);\n    bind(ApiInfoLogInformer.class).asEagerSingleton();\n    Multibinder.newSetBinder(binder(), Class.class, Names.named(\"che.json.ignored_classes\"));\n    bind(WebApplicationExceptionMapper.class);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/DefaultHttpJsonRequest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.util.Objects.requireNonNull;\n\nimport com.google.common.io.CharStreams;\nimport jakarta.validation.constraints.NotNull;\nimport jakarta.ws.rs.HttpMethod;\nimport jakarta.ws.rs.core.HttpHeaders;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.OutputStream;\nimport java.io.Reader;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.eclipse.che.dto.server.JsonArrayImpl;\nimport org.eclipse.che.dto.server.JsonSerializable;\nimport org.eclipse.che.dto.server.JsonStringMapImpl;\n\n/**\n * Simple implementation of {@link HttpJsonRequest} based on {@link HttpURLConnection}.\n *\n * <p>The implementation is not thread-safe, instance of this class must be created each time when\n * it's needed.\n *\n * <p>The instance of this request is reusable, which means that it is possible to call {@link\n * #request()} method more than one time per instance\n *\n * @author Yevhenii Voevodin\n * @see DefaultHttpJsonRequestFactory\n */\npublic class DefaultHttpJsonRequest implements HttpJsonRequest {\n\n  private static final int DEFAULT_QUERY_PARAMS_LIST_SIZE = 5;\n  private static final Object[] EMPTY_ARRAY = new Object[0];\n\n  private final String url;\n\n  private int timeout;\n  private String method;\n  private Object body;\n  private List<Pair<String, ?>> queryParams;\n  private List<Pair<String, String>> headers;\n  private String authorizationHeaderValue;\n\n  protected DefaultHttpJsonRequest(String url, String method) {\n    this.url = requireNonNull(url, \"Required non-null url\");\n    this.method = method;\n  }\n\n  protected DefaultHttpJsonRequest(String url) {\n    this(url, HttpMethod.GET);\n  }\n\n  protected DefaultHttpJsonRequest(Link link) {\n    this(requireNonNull(link, \"Required non-null link\").getHref(), link.getMethod());\n  }\n\n  @Override\n  public HttpJsonRequest setMethod(@NotNull String method) {\n    this.method = requireNonNull(method, \"Required non-null http method\");\n    return this;\n  }\n\n  @Override\n  public HttpJsonRequest setBody(@NotNull Object body) {\n    this.body = requireNonNull(body, \"Required non-null body\");\n    return this;\n  }\n\n  @Override\n  public HttpJsonRequest setBody(@NotNull Map<String, String> map) {\n    this.body = new JsonStringMapImpl<>(requireNonNull(map, \"Required non-null body\"));\n    return this;\n  }\n\n  @Override\n  public HttpJsonRequest setBody(@NotNull List<?> list) {\n    this.body = new JsonArrayImpl<>(requireNonNull(list, \"Required non-null body\"));\n    return this;\n  }\n\n  @Override\n  public HttpJsonRequest addQueryParam(@NotNull String name, @NotNull Object value) {\n    requireNonNull(name, \"Required non-null query parameter name\");\n    requireNonNull(value, \"Required non-null query parameter value\");\n    if (queryParams == null) {\n      queryParams = new ArrayList<>(DEFAULT_QUERY_PARAMS_LIST_SIZE);\n    }\n    queryParams.add(Pair.of(name, value));\n    return this;\n  }\n\n  public HttpJsonRequest addHeader(@NotNull String name, @NotNull String value) {\n    requireNonNull(name, \"Required non-null header name\");\n    requireNonNull(value, \"Required non-null header value\");\n    if (headers == null) {\n      headers = new ArrayList<>();\n    }\n    headers.add(Pair.of(name, value));\n    return this;\n  }\n\n  @Override\n  public HttpJsonRequest setAuthorizationHeader(@NotNull String value) {\n    requireNonNull(value, \"Required non-null header value\");\n    authorizationHeaderValue = value;\n    return this;\n  }\n\n  @Override\n  public HttpJsonRequest setTimeout(int timeout) {\n    this.timeout = timeout;\n    return this;\n  }\n\n  @Override\n  public String getUrl() {\n    final UriBuilder ub = UriBuilder.fromUri(url);\n    if (queryParams != null) {\n      for (Pair<String, ?> parameter : queryParams) {\n        ub.queryParam(parameter.first, parameter.second);\n      }\n    }\n    return ub.build().toString();\n  }\n\n  @Override\n  public HttpJsonResponse request()\n      throws IOException,\n          ServerException,\n          UnauthorizedException,\n          ForbiddenException,\n          NotFoundException,\n          ConflictException,\n          BadRequestException {\n    if (method == null) {\n      throw new IllegalStateException(\"Could not perform request, request method was not set.\");\n    }\n    return doRequest(timeout, url, method, body, queryParams, authorizationHeaderValue, headers);\n  }\n\n  /**\n   * Makes this request using {@link HttpURLConnection}.\n   *\n   * <p>Uses {@link HttpHeaders#AUTHORIZATION} header with value from {@link EnvironmentContext}.\n   * <br>\n   * uses {@link HttpHeaders#ACCEPT} header with \"application/json\" value. <br>\n   * Encodes query parameters in \"UTF-8\".\n   *\n   * @param timeout request timeout, used only if it is greater than 0\n   * @param url request url\n   * @param method request method\n   * @param body request body, must be instance of {@link JsonSerializable}\n   * @param parameters query parameters, may be null\n   * @param authorizationHeaderValue value of authorization header, may be null\n   * @return response to this request\n   * @throws IOException when connection content type is not \"application/json\"\n   * @throws ServerException when response code is 500 or it is different from 400, 401, 403, 404,\n   *     409\n   * @throws ForbiddenException when response code is 403\n   * @throws NotFoundException when response code is 404\n   * @throws UnauthorizedException when response code is 401\n   * @throws ConflictException when response code is 409\n   * @throws BadRequestException when response code is 400\n   */\n  protected DefaultHttpJsonResponse doRequest(\n      int timeout,\n      String url,\n      String method,\n      Object body,\n      List<Pair<String, ?>> parameters,\n      String authorizationHeaderValue,\n      List<Pair<String, String>> headers)\n      throws IOException,\n          ServerException,\n          ForbiddenException,\n          NotFoundException,\n          UnauthorizedException,\n          ConflictException,\n          BadRequestException {\n    final String authToken = EnvironmentContext.getCurrent().getSubject().getToken();\n    final boolean hasQueryParams = parameters != null && !parameters.isEmpty();\n    if (hasQueryParams || authToken != null) {\n      final UriBuilder ub = UriBuilder.fromUri(url);\n      // remove sensitive information from url.\n      ub.replaceQueryParam(\"token\", EMPTY_ARRAY);\n\n      if (hasQueryParams) {\n        for (Pair<String, ?> parameter : parameters) {\n          ub.queryParam(parameter.first, parameter.second);\n        }\n      }\n      url = ub.build().toString();\n    }\n    final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();\n    conn.setConnectTimeout(timeout > 0 ? timeout : 60000);\n    conn.setReadTimeout(timeout > 0 ? timeout : 60000);\n\n    final boolean hasHeaders = headers != null && !headers.isEmpty();\n\n    if (hasHeaders) {\n      for (Pair<String, String> header : headers) {\n        conn.setRequestProperty(header.first, header.second);\n      }\n    }\n\n    try {\n      conn.setRequestMethod(method);\n      // drop a hint for server side that we want to receive application/json\n      conn.addRequestProperty(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);\n      if (!isNullOrEmpty(authorizationHeaderValue)) {\n        conn.setRequestProperty(HttpHeaders.AUTHORIZATION, authorizationHeaderValue);\n      } else if (authToken != null) {\n        conn.setRequestProperty(HttpHeaders.AUTHORIZATION, authToken);\n      }\n      if (body != null) {\n        conn.addRequestProperty(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);\n        conn.setDoOutput(true);\n\n        if (HttpMethod.DELETE.equals(method)) { // to avoid jdk bug described here\n          // http://bugs.java.com/view_bug.do?bug_id=7157360\n          conn.setRequestMethod(HttpMethod.POST);\n          conn.setRequestProperty(\"X-HTTP-Method-Override\", HttpMethod.DELETE);\n        }\n\n        try (OutputStream output = conn.getOutputStream()) {\n          output.write(DtoFactory.getInstance().toJson(body).getBytes());\n        }\n      }\n      final int responseCode = conn.getResponseCode();\n      if ((responseCode / 100) != 2) {\n        InputStream in = conn.getErrorStream();\n        if (in == null) {\n          in = conn.getInputStream();\n        }\n        final String str;\n        try (Reader reader = new InputStreamReader(in)) {\n          str = CharStreams.toString(reader);\n        }\n        final String contentType = conn.getContentType();\n        if (contentType != null\n            && (contentType.startsWith(MediaType.APPLICATION_JSON)\n                || contentType.startsWith(\"application/vnd.api+json\"))) {\n          final ServiceError serviceError =\n              DtoFactory.getInstance().createDtoFromJson(str, ServiceError.class);\n          if (serviceError.getMessage() != null) {\n            if (responseCode == Response.Status.FORBIDDEN.getStatusCode()) {\n              throw new ForbiddenException(serviceError);\n            } else if (responseCode == Response.Status.NOT_FOUND.getStatusCode()) {\n              throw new NotFoundException(serviceError);\n            } else if (responseCode == Response.Status.UNAUTHORIZED.getStatusCode()) {\n              throw new UnauthorizedException(serviceError);\n            } else if (responseCode == Response.Status.CONFLICT.getStatusCode()) {\n              throw new ConflictException(serviceError);\n            } else if (responseCode == Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()) {\n              throw new ServerException(serviceError);\n            } else if (responseCode == Response.Status.BAD_REQUEST.getStatusCode()) {\n              throw new BadRequestException(serviceError);\n            }\n            throw new ServerException(serviceError);\n          }\n        }\n        // Can't parse content as json or content has format other we expect for error.\n        throw new IOException(\n            String.format(\n                \"Failed access: %s, method: %s, response code: %d, message: %s\",\n                UriBuilder.fromUri(url).replaceQuery(\"token\").build(), method, responseCode, str));\n      }\n      final String contentType = conn.getContentType();\n      if (responseCode != HttpURLConnection.HTTP_NO_CONTENT\n          && contentType != null\n          && !(contentType.startsWith(MediaType.APPLICATION_JSON)\n              || contentType.startsWith(\"application/vnd.api+json\"))) {\n        throw new IOException(conn.getResponseMessage());\n      }\n\n      try (Reader reader = new InputStreamReader(conn.getInputStream())) {\n        return new DefaultHttpJsonResponse(\n            CharStreams.toString(reader), responseCode, conn.getHeaderFields());\n      }\n    } finally {\n      conn.disconnect();\n    }\n  }\n\n  @Override\n  public String toString() {\n    return \"DefaultHttpJsonRequest{\"\n        + \"url='\"\n        + url\n        + '\\''\n        + \", timeout=\"\n        + timeout\n        + \", method='\"\n        + method\n        + '\\''\n        + \", body=\"\n        + body\n        + \", queryParams=\"\n        + queryParams\n        + '}';\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/DefaultHttpJsonRequestFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport jakarta.validation.constraints.NotNull;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\n\n/**\n * Creates {@link DefaultHttpJsonRequest} instances.\n *\n * @author Yevhenii Voevodin\n */\n@Singleton\npublic class DefaultHttpJsonRequestFactory implements HttpJsonRequestFactory {\n\n  @Override\n  public HttpJsonRequest fromUrl(@NotNull String url) {\n    return new DefaultHttpJsonRequest(url);\n  }\n\n  @Override\n  public HttpJsonRequest fromLink(@NotNull Link link) {\n    return new DefaultHttpJsonRequest(link);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/DefaultHttpJsonResponse.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static java.util.Collections.unmodifiableList;\nimport static java.util.Collections.unmodifiableMap;\nimport static java.util.Objects.requireNonNull;\n\nimport com.google.gson.reflect.TypeToken;\nimport java.io.IOException;\nimport java.lang.reflect.Type;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.commons.json.JsonHelper;\nimport org.eclipse.che.commons.json.JsonParseException;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * Default implementation of {@link HttpJsonResponse}.\n *\n * @author Yevhenii Voevodin\n */\npublic class DefaultHttpJsonResponse implements HttpJsonResponse {\n\n  private static final Type STRING_MAP_TYPE = new TypeToken<Map<String, String>>() {}.getType();\n\n  private final String responseBody;\n  private final int responseCode;\n  private final Map<String, List<String>> headers;\n\n  protected DefaultHttpJsonResponse(String response, int responseCode) {\n    this.responseBody = response;\n    this.responseCode = responseCode;\n    this.headers = Collections.emptyMap();\n  }\n\n  protected DefaultHttpJsonResponse(\n      String response, int responseCode, Map<String, List<String>> headers) {\n    this.responseBody = response;\n    this.responseCode = responseCode;\n    this.headers =\n        unmodifiableMap(\n            headers.entrySet().stream()\n                .collect(Collectors.toMap(Map.Entry::getKey, e -> unmodifiableList(e.getValue()))));\n  }\n\n  @Override\n  public String asString() {\n    return responseBody;\n  }\n\n  @Override\n  public <T> T asDto(Class<T> dtoInterface) {\n    requireNonNull(dtoInterface, \"Required non-null dto interface\");\n    return DtoFactory.getInstance().createDtoFromJson(responseBody, dtoInterface);\n  }\n\n  @Override\n  public <T> List<T> asList(Class<T> dtoInterface) {\n    requireNonNull(dtoInterface, \"Required non-null dto interface\");\n    return DtoFactory.getInstance().createListDtoFromJson(responseBody, dtoInterface);\n  }\n\n  @Override\n  @SuppressWarnings(\"unchecked\")\n  public Map<String, String> asProperties() throws IOException {\n    return as(Map.class, STRING_MAP_TYPE);\n  }\n\n  @Override\n  public <T> T as(Class<T> clazz, Type genericType) throws IOException {\n    requireNonNull(clazz, \"Required non-null class\");\n    try {\n      return JsonHelper.fromJson(responseBody, clazz, genericType);\n    } catch (JsonParseException jsonEx) {\n      throw new IOException(jsonEx.getLocalizedMessage(), jsonEx);\n    }\n  }\n\n  @Override\n  public Map<String, List<String>> getHeaders() {\n    return headers;\n  }\n\n  @Override\n  public int getResponseCode() {\n    return responseCode;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/DownloadFileResponseFilter.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static org.eclipse.che.api.core.rest.DownloadFileResponseFilter.EntityType.JSON_SERIALIZABLE;\nimport static org.eclipse.che.api.core.rest.DownloadFileResponseFilter.EntityType.STRING;\nimport static org.eclipse.che.api.core.rest.DownloadFileResponseFilter.EntityType.UNKNOWN;\n\nimport jakarta.ws.rs.HttpMethod;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.MultivaluedMap;\nimport jakarta.ws.rs.core.Request;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.core.UriInfo;\nimport java.util.List;\nimport org.eclipse.che.dto.server.JsonSerializable;\n\n/**\n * Abstract Filter used to provide the json result as a file download operation. It is applying on\n * GET method and JSON content type only.\n *\n * @author Florent Benoit\n */\npublic abstract class DownloadFileResponseFilter {\n\n  /** Entity type that we will be able to handle. */\n  public enum EntityType {\n    JSON_SERIALIZABLE,\n    STRING,\n    UNKNOWN\n  }\n\n  /**\n   * Query parameter used to ask to specify headers that will propose JSON object to be downloaded.\n   */\n  public static final String QUERY_DOWNLOAD_PARAMETER = \"downloadAsFile\";\n\n  /**\n   * Check if we need to apply a filter\n   *\n   * @param request\n   * @return\n   */\n  protected String getFileName(\n      Request request, MediaType mediaType, UriInfo uriInfo, int responseStatus) {\n\n    // manage only GET requests\n    if (!HttpMethod.GET.equals(request.getMethod())) {\n      return null;\n    }\n\n    // manage only OK code\n    if (Response.Status.OK.getStatusCode() != responseStatus) {\n      return null;\n    }\n\n    // Only handle JSON content\n    if (!MediaType.APPLICATION_JSON_TYPE.equals(mediaType)) {\n      return null;\n    }\n\n    // check if parameter filename is given\n    MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters();\n    return queryParameters.getFirst(QUERY_DOWNLOAD_PARAMETER);\n  }\n\n  /**\n   * Check if entity is compliant with our filter\n   *\n   * @param entity the entity embedded in response.\n   * @return true if it's a type that we can handle\n   */\n  protected boolean hasCompliantEntity(Object entity) {\n    // no entity, skip\n    if (entity == null) {\n      return false;\n    }\n\n    // Check entity type\n    if (entity instanceof List) {\n      List<?> entities = (List) entity;\n      for (Object simpleEntity : entities) {\n        if (getElementType(simpleEntity) == UNKNOWN) {\n          return false;\n        }\n      }\n    } else if (getElementType(entity) == UNKNOWN) {\n      // unknown entity type, will not configure it as a download\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Helper method for getting the type of the JSON entity\n   *\n   * @param entity the entity object\n   * @return the type of the element\n   */\n  protected EntityType getElementType(Object entity) {\n    if (JsonSerializable.class.isAssignableFrom(entity.getClass())) {\n      return JSON_SERIALIZABLE;\n    }\n\n    if (String.class.isAssignableFrom(entity.getClass())) {\n      return STRING;\n    }\n\n    return UNKNOWN;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/HttpJsonRequest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport com.google.common.annotations.Beta;\nimport jakarta.validation.constraints.NotNull;\nimport jakarta.ws.rs.HttpMethod;\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.dto.server.JsonSerializable;\n\n/**\n * Defines simple set of methods for requesting json objects.\n *\n * <p>Unlike {@link HttpRequestHelper} - provides <i>builder-like</i> style for building requests\n * and getting responses.\n *\n * <p>Simple use-cases:\n *\n * <pre>{@code\n *  // starting new workspace\n *  requestFactory.fromUri(apiEndpoint + \"/workspace/\" + id + \"/runtime\")\n *                .setMethod(\"POST\")\n *                .addQueryParam(\"envName\", envName)\n *                .addQueryParam(\"accountId\", accountId)\n *                .request();\n *\n *  // getting user preferences\n *  Map<String, String> prefs = requestFactory.fromUri(apiEndpoint + \"/profile/prefs\")\n *                                            .setMethod(\"GET\")\n *                                            .request()\n *                                            .asProperties();\n *\n * // getting workspace\n * UsersWorkspaceDto workspace = requestFactory.fromLink(getWorkspaceLink)\n *                                             .request()\n *                                             .asDto(UsersWorkspaceDto.class);\n * }</pre>\n *\n * <p>Do not use this class for requesting content different from \"application/json\".\n *\n * @author Yevhenii Voevodin\n * @see HttpJsonRequestFactory\n */\n@Beta\npublic interface HttpJsonRequest {\n\n  /**\n   * Sets http method to use in this request(e.g. {@link jakarta.ws.rs.HttpMethod#GET GET}).\n   *\n   * @param method http method\n   * @return this request instance\n   * @throws NullPointerException when {@code method} is null\n   */\n  HttpJsonRequest setMethod(@NotNull String method);\n\n  /**\n   * Sets request body.\n   *\n   * @param body should be instance of {@link JsonSerializable}\n   * @return this request instance\n   * @throws NullPointerException when {@code body} is null\n   */\n  HttpJsonRequest setBody(@NotNull Object body);\n\n  /**\n   * Sets given string map as request body.\n   *\n   * @param map request body\n   * @return this request instance\n   * @throws NullPointerException when {@code body} is null\n   */\n  HttpJsonRequest setBody(@NotNull Map<String, String> map);\n\n  /**\n   * Sets given list as request body.\n   *\n   * <p>List should contain only {@link JsonSerializable} elements\n   *\n   * @param list list of {@link JsonSerializable}\n   * @return this request instance\n   * @throws NullPointerException when {@code body} is null\n   */\n  HttpJsonRequest setBody(@NotNull List<?> list);\n\n  /**\n   * Adds query parameter to the request.\n   *\n   * @param name query parameter name\n   * @param value query parameter value\n   * @return this request instance\n   * @throws NullPointerException when either name or value is null\n   */\n  HttpJsonRequest addQueryParam(@NotNull String name, @NotNull Object value);\n\n  /**\n   * Adds header to the request.\n   *\n   * @param name header name\n   * @param value header value\n   * @return this request instance\n   * @throws NullPointerException when either header name or value is null\n   */\n  HttpJsonRequest addHeader(@NotNull String name, @NotNull String value);\n\n  /**\n   * Adds authorization header to the request.\n   *\n   * @param value authorization header value\n   * @return this request instance\n   * @throws NullPointerException when value is null\n   */\n  HttpJsonRequest setAuthorizationHeader(@NotNull String value);\n\n  /**\n   * Sets request timeout in milliseconds.\n   *\n   * @param timeoutMs request timeout in milliseconds\n   * @return this request instance\n   */\n  HttpJsonRequest setTimeout(int timeoutMs);\n\n  /** Returns HTTP URL built from source URL and query parameters added to this request. */\n  String getUrl();\n\n  /**\n   * Makes http request with content type \"application/json\" and authorization headers based on\n   * current {@link EnvironmentContext#getCurrent() context}.\n   *\n   * @return {@link HttpJsonResponse} instance which represents response of this request\n   * @throws IOException when server response content type is different from \"application/json\"(Not\n   *     acceptable)\n   * @throws IOException when any io error occurs\n   * @throws ServerException when response code is 500 or it is different from 400, 401, 403, 404,\n   *     409\n   * @throws ForbiddenException when response code is 403\n   * @throws NotFoundException when response code is 404\n   * @throws UnauthorizedException when response code is 401\n   * @throws ConflictException when response code is 409\n   * @throws BadRequestException when response code is 400\n   */\n  HttpJsonResponse request()\n      throws IOException,\n          ServerException,\n          UnauthorizedException,\n          ForbiddenException,\n          NotFoundException,\n          ConflictException,\n          BadRequestException;\n\n  /**\n   * Uses {@link HttpMethod#GET} as a request method.\n   *\n   * @return this request instance\n   */\n  default HttpJsonRequest useGetMethod() {\n    return setMethod(HttpMethod.GET);\n  }\n\n  /**\n   * Uses {@link HttpMethod#OPTIONS} as a request method.\n   *\n   * @return this request instance\n   */\n  default HttpJsonRequest useOptionsMethod() {\n    return setMethod(HttpMethod.OPTIONS);\n  }\n\n  /**\n   * Uses {@link HttpMethod#POST} as a request method.\n   *\n   * @return this request instance\n   */\n  default HttpJsonRequest usePostMethod() {\n    return setMethod(HttpMethod.POST);\n  }\n\n  /**\n   * Uses {@link HttpMethod#DELETE} as a request method.\n   *\n   * @return this request instance\n   */\n  default HttpJsonRequest useDeleteMethod() {\n    return setMethod(HttpMethod.DELETE);\n  }\n\n  /**\n   * Uses {@link HttpMethod#PUT} as a request method.\n   *\n   * @return this request instance\n   */\n  default HttpJsonRequest usePutMethod() {\n    return setMethod(HttpMethod.PUT);\n  }\n\n  /**\n   * Adds set of query parameters to this request.\n   *\n   * @param params query parameters map\n   * @return this request instance\n   */\n  default HttpJsonRequest addQueryParams(@NotNull Map<String, ?> params) {\n    Objects.requireNonNull(params, \"Non-null query parameters required\");\n    params.forEach(this::addQueryParam);\n    return this;\n  }\n\n  /**\n   * Adds set of headers to this request.\n   *\n   * @param headers map with headers\n   * @return this request instance\n   */\n  default HttpJsonRequest addHeaders(@NotNull Map<String, String> headers) {\n    Objects.requireNonNull(headers, \"Required non-null headers\");\n    headers.forEach(this::addHeader);\n    return this;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/HttpJsonRequestFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport com.google.common.annotations.Beta;\nimport com.google.inject.ImplementedBy;\nimport jakarta.validation.constraints.NotNull;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\n\n/**\n * Factory for {@link HttpJsonRequest} instances.\n *\n * @author Yevhenii Voevodin\n */\n@Beta\n@ImplementedBy(DefaultHttpJsonRequestFactory.class)\npublic interface HttpJsonRequestFactory {\n\n  /**\n   * Creates {@link HttpJsonRequest} based on {@code url}.\n   *\n   * @param url request url\n   * @return new instance of {@link HttpJsonRequest}\n   * @throws NullPointerException when url is null\n   */\n  HttpJsonRequest fromUrl(@NotNull String url);\n\n  /**\n   * Crates {@link HttpJsonRequest} based on {@code link}.\n   *\n   * @param link request link\n   * @return new instance of {@link HttpJsonRequest}\n   * @throws NullPointerException when link is null\n   */\n  HttpJsonRequest fromLink(@NotNull Link link);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/HttpJsonResponse.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport com.google.common.annotations.Beta;\nimport jakarta.validation.constraints.NotNull;\nimport java.io.IOException;\nimport java.lang.reflect.Type;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Defines response of {@link HttpJsonRequest}.\n *\n * @author Yevhenii Voevodin\n */\n@Beta\npublic interface HttpJsonResponse {\n\n  /** Returns a response code. */\n  int getResponseCode();\n\n  /**\n   * Returns {@link HttpJsonRequest} response body as a string, if response doesn't contain body -\n   * empty line will be returned.\n   *\n   * <p>Example:\n   *\n   * <pre>{@code\n   * String recipeContent = requestFactory.fromLink(getRecipeContentLink).requestString();\n   * }</pre>\n   */\n  String asString();\n\n  /**\n   * Returns response body as instance of {@link DTO} object.\n   *\n   * <p>Example:\n   *\n   * <pre>{@code\n   * UserDto user = requestFactory.fromUri(apiEndpoint + \"/user\")\n   *                              .useGetMethod()\n   *                              .request()\n   *                              .asDto(UserDto.class);\n   * }</pre>\n   *\n   * @param dtoInterface dto interface class\n   * @return response as a dto instance\n   */\n  <T> T asDto(@NotNull Class<T> dtoInterface);\n\n  /**\n   * Returns result as a list of {@link DTO} objects.\n   *\n   * <p>Example:\n   *\n   * <pre>{@code\n   * List<UsersWorkspaceDto> workspaces = requestFactory.fromUri(apiEndpoint + \"/workspace/config\")\n   *                                                    .useGetMethod()\n   *                                                    .request()\n   *                                                    .asList(UsersWorkspaceDto.class);\n   * }</pre>\n   *\n   * @param dtoInterface dto interface class\n   * @return response as list of dto instances\n   */\n  <T> List<T> asList(@NotNull Class<T> dtoInterface);\n\n  /**\n   * Returns response body as a string map.\n   *\n   * <p>Example:\n   *\n   * <pre>{@code\n   * Map<String, String> prefs = requestFactory.fromUri(apiEndpoint + \"/profile/prefs\")\n   *                                           .useGetRequest()\n   *                                           .addQueryParam(\"filter\", \".*che.*\")\n   *                                           .request()\n   *                                           .asProperties();\n   * }</pre>\n   *\n   * @return response as a {@code Map<String, String>}\n   * @throws IOException when response body is not valid json\n   */\n  Map<String, String> asProperties() throws IOException;\n\n  /**\n   * Returns response as a given type.\n   *\n   * <p>Example:\n   *\n   * <pre>{@code\n   * Set<UsersWorkspaceDto> workspaces = requestFactory.fromUri(apiEndpoint + \"/workspace/config\")\n   *                                                   .useGetMethod()\n   *                                                   .request()\n   *                                                   .as(Set.class, new TypeToken<Set<UsersWorkspace>>() {}.getType());\n   * }</pre>\n   *\n   * @param <T> raw type of the response\n   * @param clazz response class\n   * @param genericType generic type of the response, if needed\n   * @return response parsed to the given type\n   * @throws IOException when response body is not valid json\n   */\n  <T> T as(@NotNull Class<T> clazz, @Nullable Type genericType) throws IOException;\n\n  /**\n   * Returns an unmodifiable Map of the header fields. The Map keys are Strings that represent the\n   * response-header field names. Each Map value is an unmodifiable List of Strings that represents\n   * the corresponding field values.\n   */\n  Map<String, List<String>> getHeaders();\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/HttpOutputMessage.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\n/**\n * HTTP output message.\n *\n * @author andrew00x\n */\npublic interface HttpOutputMessage extends OutputProvider {\n  /** Set HTTP status. */\n  void setStatus(int status);\n\n  /**\n   * Shortcut to set content-type header. The same may be none with method {@link\n   * #setHttpHeader(String, String)}.\n   */\n  void setContentType(String contentType);\n\n  /**\n   * Add HTTP header.\n   *\n   * @param name name of header\n   * @param value value of header\n   */\n  void addHttpHeader(String name, String value);\n\n  /**\n   * Set HTTP header. If the header had already been set, the new value overwrites the previous one.\n   *\n   * @param name name of header\n   * @param value value of header\n   */\n  void setHttpHeader(String name, String value);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/HttpRequestHelper.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport com.google.common.io.CharStreams;\nimport jakarta.ws.rs.HttpMethod;\nimport jakarta.ws.rs.core.HttpHeaders;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.OutputStream;\nimport java.io.Reader;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * Provides helper method to send HTTP requests.\n *\n * @author andrew00x\n */\npublic class HttpRequestHelper {\n\n  private HttpRequestHelper() {}\n\n  public static HttpJsonRequest createJsonRequest(String url) {\n    return new DefaultHttpJsonRequest(url);\n  }\n\n  public static String requestString(\n      String url, String method, Object body, Pair<String, ?>... parameters)\n      throws IOException,\n          ServerException,\n          ForbiddenException,\n          NotFoundException,\n          UnauthorizedException,\n          ConflictException {\n    return requestString(-1, url, method, body, parameters);\n  }\n\n  public static String requestString(\n      int timeout, String url, String method, Object body, Pair<String, ?>... parameters)\n      throws IOException,\n          ServerException,\n          ForbiddenException,\n          NotFoundException,\n          UnauthorizedException,\n          ConflictException {\n    final String authToken = EnvironmentContext.getCurrent().getSubject().getToken();\n    if ((parameters != null && parameters.length > 0) || authToken != null) {\n      final UriBuilder ub = UriBuilder.fromUri(url);\n      // remove sensitive information from url.\n      ub.replaceQueryParam(\"token\", null);\n\n      if (parameters != null && parameters.length > 0) {\n        for (Pair<String, ?> parameter : parameters) {\n          ub.queryParam(parameter.first, parameter.second);\n        }\n      }\n      url = ub.build().toString();\n    }\n    final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();\n    conn.setConnectTimeout(timeout > 0 ? timeout : 60000);\n    conn.setReadTimeout(timeout > 0 ? timeout : 60000);\n    try {\n      conn.setRequestMethod(method);\n      // drop a hint for server side that we want to receive application/json\n      //            conn.addRequestProperty(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);\n      if (authToken != null) {\n        conn.setRequestProperty(HttpHeaders.AUTHORIZATION, authToken);\n      }\n      if (body != null) {\n        //                conn.addRequestProperty(HttpHeaders.CONTENT_TYPE,\n        // MediaType.APPLICATION_JSON);\n        conn.setDoOutput(true);\n\n        if (HttpMethod.DELETE.equals(method)) { // to avoid jdk bug described here\n          // http://bugs.java.com/view_bug.do?bug_id=7157360\n          conn.setRequestMethod(HttpMethod.POST);\n          conn.setRequestProperty(\"X-HTTP-Method-Override\", HttpMethod.DELETE);\n        }\n\n        try (OutputStream output = conn.getOutputStream()) {\n          output.write(DtoFactory.getInstance().toJson(body).getBytes());\n        }\n      }\n\n      final int responseCode = conn.getResponseCode();\n      if ((responseCode / 100) != 2) {\n        InputStream in = conn.getErrorStream();\n        if (in == null) {\n          in = conn.getInputStream();\n        }\n        final String str;\n        try (Reader reader = new InputStreamReader(in)) {\n          str = CharStreams.toString(reader);\n        }\n        final String contentType = conn.getContentType();\n        if (contentType != null && contentType.startsWith(MediaType.APPLICATION_JSON)) {\n          final ServiceError serviceError =\n              DtoFactory.getInstance().createDtoFromJson(str, ServiceError.class);\n          if (serviceError.getMessage() != null) {\n            if (responseCode == Response.Status.FORBIDDEN.getStatusCode()) {\n              throw new ForbiddenException(serviceError);\n            } else if (responseCode == Response.Status.NOT_FOUND.getStatusCode()) {\n              throw new NotFoundException(serviceError);\n            } else if (responseCode == Response.Status.UNAUTHORIZED.getStatusCode()) {\n              throw new UnauthorizedException(serviceError);\n            } else if (responseCode == Response.Status.CONFLICT.getStatusCode()) {\n              throw new ConflictException(serviceError);\n            } else if (responseCode == Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()) {\n              throw new ServerException(serviceError);\n            }\n            throw new ServerException(serviceError);\n          }\n        }\n        // Can't parse content as json or content has format other we expect for error.\n        throw new IOException(\n            String.format(\n                \"Failed access: %s, method: %s, response code: %d, message: %s\",\n                UriBuilder.fromUri(url).replaceQuery(\"token\").build(), method, responseCode, str));\n      }\n\n      //            final String contentType = conn.getContentType();\n\n      //            if (!(contentType == null ||\n      // contentType.startsWith(MediaType.APPLICATION_JSON))) {\n      //                throw new IOException(conn.getResponseMessage());\n      //            }\n\n      try (Reader reader = new InputStreamReader(conn.getInputStream())) {\n        return CharStreams.toString(reader);\n      }\n    } finally {\n      conn.disconnect();\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/HttpServletProxyResponse.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport jakarta.servlet.http.HttpServletResponse;\nimport jakarta.ws.rs.core.HttpHeaders;\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.Writer;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * @author andrew00x\n */\npublic final class HttpServletProxyResponse implements HttpOutputMessage {\n  private final HttpServletResponse httpServletResponse;\n\n  private String contentType;\n  private Map<Pattern, List<Pair<String, String>>> rewriteMap;\n\n  public HttpServletProxyResponse(HttpServletResponse httpServletResponse) {\n    this.httpServletResponse = httpServletResponse;\n  }\n\n  public HttpServletProxyResponse(\n      HttpServletResponse httpServletResponse,\n      Map<Pattern, List<Pair<String, String>>> rewriteMap) {\n    this.httpServletResponse = httpServletResponse;\n    this.rewriteMap = rewriteMap;\n  }\n\n  @Override\n  public void setStatus(int status) {\n    httpServletResponse.setStatus(status);\n  }\n\n  @Override\n  public void setContentType(String contentType) {\n    setHttpHeader(HttpHeaders.CONTENT_TYPE, contentType);\n  }\n\n  @Override\n  public void addHttpHeader(String name, String value) {\n    if (\"content-type\".equals(name.toLowerCase())) {\n      contentType = value;\n    }\n    httpServletResponse.addHeader(name, value);\n  }\n\n  @Override\n  public void setHttpHeader(String name, String value) {\n    if (\"content-type\".equals(name.toLowerCase())) {\n      contentType = value;\n    }\n    httpServletResponse.setHeader(name, value);\n  }\n\n  @Override\n  public OutputStream getOutputStream() throws IOException {\n    if (contentType != null && rewriteMap != null) {\n      for (Map.Entry<Pattern, List<Pair<String, String>>> rewriteMapEntry : rewriteMap.entrySet()) {\n        Matcher matcher = rewriteMapEntry.getKey().matcher(contentType);\n        if (matcher.matches()) {\n          return new RewriteOutputStream(httpServletResponse, rewriteMapEntry.getValue());\n        }\n      }\n    }\n    return httpServletResponse.getOutputStream();\n  }\n\n  public void setRewriteMap(Map<Pattern, List<Pair<String, String>>> rewriteMap) {\n    this.rewriteMap = rewriteMap;\n  }\n\n  private class RewriteOutputStream extends OutputStream {\n\n    final HttpServletResponse httpServletResponse;\n    final List<Pair<String, String>> rewriteRules;\n    ByteArrayOutputStream cache;\n    Writer writer;\n\n    RewriteOutputStream(\n        HttpServletResponse httpServletResponse, List<Pair<String, String>> rewriteRules) {\n      this.httpServletResponse = httpServletResponse;\n      this.rewriteRules = rewriteRules;\n    }\n\n    @Override\n    public void write(int b) throws IOException {\n      if (cache == null) {\n        cache = new ByteArrayOutputStream();\n      }\n      cache.write(b);\n      if (b == '\\n' || b == '\\r') {\n        final String translatedLine = translateLine();\n        getWriter().write(translatedLine);\n        cache.reset();\n      }\n    }\n\n    String translateLine() {\n      String translatedLine = cache.toString();\n      for (Pair<String, String> rewriteRule : rewriteRules) {\n        translatedLine = translatedLine.replaceAll(rewriteRule.first, rewriteRule.second);\n      }\n      return translatedLine;\n    }\n\n    Writer getWriter() throws IOException {\n      if (writer == null) {\n        writer = httpServletResponse.getWriter();\n      }\n      return writer;\n    }\n\n    @Override\n    public void flush() throws IOException {\n      if (cache != null) {\n        final String translatedLine = translateLine();\n        final Writer myWriter = getWriter();\n        myWriter.write(translatedLine);\n        writer.flush();\n        cache.reset();\n      } else if (writer != null) {\n        writer.flush();\n      }\n    }\n\n    @Override\n    public void close() throws IOException {\n      // Define variable which is unused in the case of correctly closed resources\n      // BTW it may be simplified with JDK9 see\n      // https://blogs.oracle.com/darcy/entry/concise_twr_jdk9\n      try (@SuppressWarnings(\"unused\")\n          Writer writer = this.writer) {\n        flush();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/JAXRSDownloadFileResponseFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static jakarta.ws.rs.core.HttpHeaders.CONTENT_DISPOSITION;\n\nimport jakarta.ws.rs.container.ContainerRequestContext;\nimport jakarta.ws.rs.container.ContainerResponseContext;\nimport jakarta.ws.rs.container.ContainerResponseFilter;\nimport jakarta.ws.rs.core.Request;\nimport java.io.IOException;\n\n/**\n * JAX-RS implementation of download filter.\n *\n * @author Florent Benoit\n */\npublic class JAXRSDownloadFileResponseFilter extends DownloadFileResponseFilter\n    implements ContainerResponseFilter {\n\n  /**\n   * JAX-RS Filter method called after a response has been provided for a request\n   *\n   * <p>Filters in the filter chain are ordered according to their {@code\n   * jakarta.annotation.Priority} class-level annotation value.\n   *\n   * @param requestContext request context.\n   * @param responseContext response context.\n   * @throws IOException if an I/O exception occurs.\n   */\n  @Override\n  public void filter(\n      ContainerRequestContext requestContext, ContainerResponseContext responseContext)\n      throws IOException {\n\n    // Apply header if all if correct\n    Request request = requestContext.getRequest();\n    String filename =\n        getFileName(\n            request,\n            responseContext.getMediaType(),\n            requestContext.getUriInfo(),\n            responseContext.getStatus());\n    if (filename != null) {\n      if (hasCompliantEntity(responseContext.getEntity())) {\n        responseContext\n            .getHeaders()\n            .putSingle(CONTENT_DISPOSITION, \"attachment; filename=\" + filename);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/LivenessProbeService.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.core.Response;\nimport javax.inject.Singleton;\n\n/**\n * Endpoint for the liveness checks.\n *\n * @author Max Shaposhnik (mshaposh@redhat.com)\n */\n@Singleton\n@Path(\"/liveness\")\npublic class LivenessProbeService {\n  @GET\n  public Response checkAlive() {\n    return Response.ok().build();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/MessageBodyAdapter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport com.google.common.annotations.Beta;\nimport jakarta.ws.rs.WebApplicationException;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.Set;\n\n/**\n * Adapts an entity stream in an implementation specific way.\n *\n * <p>To bind custom adapter:\n *\n * <pre>\n *  Multibinder<MessageBodyAdapter> adaptersBinder = Multibinder.newSetBinder(binder(), MessageBodyAdapter.class);\n *  adaptersBinder.addBinding().to(CustomMessageBodyAdapter.class);\n * </pre>\n *\n * @author Yevhenii Voevodin\n */\n@Beta\npublic interface MessageBodyAdapter {\n\n  /** Returns classes for which adaption will be triggered. */\n  Set<Class<?>> getTriggers();\n\n  /**\n   * Adapts entity stream to a new one, if necessary.\n   *\n   * @param entityStream an entity stream\n   * @return a new stream with an adapted data or the same {@code entityStream} if there is nothing\n   *     to adapt\n   */\n  InputStream adapt(InputStream entityStream) throws WebApplicationException, IOException;\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/MessageBodyAdapterInterceptor.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport com.google.common.annotations.Beta;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.MultivaluedMap;\nimport jakarta.ws.rs.ext.MessageBodyReader;\nimport java.io.InputStream;\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Type;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport org.aopalliance.intercept.MethodInterceptor;\nimport org.aopalliance.intercept.MethodInvocation;\n\n/**\n * This interceptor must be bound for the method {@link MessageBodyReader#readFrom(Class, Type,\n * Annotation[], MediaType, MultivaluedMap, InputStream)}\n *\n * @author Yevhenii Voevodin\n */\n@Beta\npublic class MessageBodyAdapterInterceptor implements MethodInterceptor {\n\n  private final Map<Class<?>, MessageBodyAdapter> adapters = new HashMap<>();\n\n  @Inject\n  public void init(Set<MessageBodyAdapter> adapters) {\n    for (MessageBodyAdapter adapter : adapters) {\n      for (Class<?> trigger : adapter.getTriggers()) {\n        this.adapters.put(trigger, adapter);\n      }\n    }\n  }\n\n  @Override\n  public Object invoke(MethodInvocation invocation) throws Throwable {\n    final Object[] args = invocation.getArguments();\n    final MessageBodyAdapter adapter = adapters.get((Class<?>) args[0]);\n    if (adapter != null) {\n      args[args.length - 1] = adapter.adapt((InputStream) args[args.length - 1]);\n    }\n    return invocation.proceed();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/OutputProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\n\n/**\n * Factory for writable output.\n *\n * @author andrew00x\n */\npublic interface OutputProvider {\n  /**\n   * Get writable output.\n   *\n   * @return writable output\n   * @throws IOException if an i/o error occurs\n   */\n  OutputStream getOutputStream() throws IOException;\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/RemoteServiceDescriptor.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport java.io.IOException;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceDescriptor;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Provides basic functionality to access remote {@link Service Service}. Basically provides next\n * information about {@code Service}:\n *\n * <ul>\n *   <li>URL of {@code Service}\n *   <li>Version of API\n *   <li>Optional description of {@code Service}\n *   <li>Set of {@link org.eclipse.che.api.core.rest.shared.dto.Link Link} to access {@code Service}\n *       functionality\n * </ul>\n *\n * @author andrew00x\n * @see Service\n * @see #getLinks()\n */\npublic class RemoteServiceDescriptor {\n  private static final Logger LOG = LoggerFactory.getLogger(RemoteServiceDescriptor.class);\n\n  protected final String baseUrl;\n  private final HttpJsonRequestFactory requestFactory;\n\n  // will be initialized when it is needed\n  private volatile ServiceDescriptor serviceDescriptor;\n\n  /**\n   * Creates new descriptor of remote RESTful service.\n   *\n   * @throws java.lang.IllegalArgumentException if URL is invalid\n   */\n  public RemoteServiceDescriptor(String baseUrl, HttpJsonRequestFactory requestFactory)\n      throws IllegalArgumentException {\n    this.baseUrl = baseUrl;\n    this.requestFactory = requestFactory;\n    try {\n      final URL baseUrlURL = new URL(baseUrl);\n      final String protocol = baseUrlURL.getProtocol();\n      if (!(protocol.equals(\"http\") || protocol.equals(\"https\"))) {\n        throw new IllegalArgumentException(String.format(\"Invalid URL: %s\", baseUrl));\n      }\n    } catch (MalformedURLException e) {\n      throw new IllegalArgumentException(String.format(\"Invalid URL: %s\", baseUrl));\n    }\n  }\n\n  public String getBaseUrl() {\n    return baseUrl;\n  }\n\n  /**\n   * @see ServiceDescriptor#getLinks()\n   */\n  public List<Link> getLinks() throws ServerException, IOException {\n    final List<Link> links = getServiceDescriptor().getLinks();\n    // always copy list and links itself!\n    final List<Link> copy = new ArrayList<>(links.size());\n    for (Link link : links) {\n      copy.add(DtoFactory.getInstance().clone(link));\n    }\n    return copy;\n  }\n\n  public Link getLink(String rel) throws ServerException, IOException {\n    final Link link = getServiceDescriptor().getLink(rel);\n    return link == null ? null : DtoFactory.getInstance().clone(link);\n  }\n\n  public ServiceDescriptor getServiceDescriptor() throws IOException, ServerException {\n    if (serviceDescriptor == null) {\n      synchronized (this) {\n        if (serviceDescriptor == null) {\n          try {\n            serviceDescriptor =\n                requestFactory\n                    .fromUrl(baseUrl)\n                    .useOptionsMethod()\n                    .request()\n                    .as(getServiceDescriptorClass(), null);\n          } catch (NotFoundException\n              | ConflictException\n              | UnauthorizedException\n              | BadRequestException\n              | ForbiddenException e) {\n            throw new ServerException(e.getServiceError());\n          }\n        }\n      }\n    }\n    return serviceDescriptor;\n  }\n\n  protected Class<? extends ServiceDescriptor> getServiceDescriptorClass() {\n    return ServiceDescriptor.class;\n  }\n\n  /** Checks service availability. */\n  public boolean isAvailable() {\n    LOG.debug(\"Testing availability {}\", baseUrl);\n    try {\n      return (requestFactory\n              .fromUrl(baseUrl)\n              .useOptionsMethod()\n              .request()\n              .as(getServiceDescriptorClass(), null)\n          != null);\n    } catch (Exception e) {\n      LOG.warn(e.getLocalizedMessage());\n      return false;\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/RuntimeExceptionMapper.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.Arrays.stream;\nimport static java.util.stream.Collectors.toList;\n\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.ext.ExceptionMapper;\nimport jakarta.ws.rs.ext.Provider;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.TimeZone;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Exception mapper that provide error message with error time.\n *\n * @author Roman Nikitenko\n * @author Sergii Kabashniuk\n */\n@Provider\n@Singleton\npublic class RuntimeExceptionMapper implements ExceptionMapper<RuntimeException> {\n  private static final Logger LOG = LoggerFactory.getLogger(RuntimeExceptionMapper.class);\n\n  @Override\n  public Response toResponse(RuntimeException exception) {\n    final SimpleDateFormat dateFormat = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n    dateFormat.setTimeZone(TimeZone.getTimeZone(\"UTC\"));\n    final String utcTime = dateFormat.format(new Date());\n    String message = exception.getMessage();\n    final String errorMessage =\n        isNullOrEmpty(message)\n            ? format(\"Internal Server Error occurred, error time: %s\", utcTime)\n            : message;\n\n    LOG.error(errorMessage, exception);\n\n    List<String> trace =\n        stream(exception.getStackTrace()).map(StackTraceElement::toString).collect(toList());\n    ServiceError serviceError =\n        DtoFactory.newDto(ServiceError.class).withMessage(errorMessage).withTrace(trace);\n    return Response.serverError()\n        .entity(DtoFactory.getInstance().toJson(serviceError))\n        .type(MediaType.APPLICATION_JSON)\n        .build();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/Service.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyMap;\n\nimport com.google.common.collect.ListMultimap;\nimport jakarta.ws.rs.Consumes;\nimport jakarta.ws.rs.CookieParam;\nimport jakarta.ws.rs.DefaultValue;\nimport jakarta.ws.rs.FormParam;\nimport jakarta.ws.rs.HeaderParam;\nimport jakarta.ws.rs.HttpMethod;\nimport jakarta.ws.rs.MatrixParam;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.PathParam;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.QueryParam;\nimport jakarta.ws.rs.core.Context;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.UriBuilder;\nimport jakarta.ws.rs.core.UriInfo;\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Method;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.SortedSet;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.rest.annotations.Description;\nimport org.eclipse.che.api.core.rest.annotations.GenerateLink;\nimport org.eclipse.che.api.core.rest.annotations.OPTIONS;\nimport org.eclipse.che.api.core.rest.annotations.Required;\nimport org.eclipse.che.api.core.rest.annotations.Valid;\nimport org.eclipse.che.api.core.rest.shared.ParameterType;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.core.rest.shared.dto.LinkParameter;\nimport org.eclipse.che.api.core.rest.shared.dto.RequestBodyDescriptor;\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceDescriptor;\nimport org.eclipse.che.api.core.util.PagingUtil;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * Base class for all API services.\n *\n * @author andrew00x\n */\npublic abstract class Service {\n  @Context protected UriInfo uriInfo;\n\n  @OPTIONS\n  @Produces(MediaType.APPLICATION_JSON)\n  public ServiceDescriptor getServiceDescriptor() {\n    return generateServiceDescriptor(uriInfo, getClass());\n  }\n\n  public ServiceContext getServiceContext() {\n    return new ServiceContextImpl(uriInfo.getBaseUriBuilder(), getClass());\n  }\n\n  protected ServiceDescriptor createServiceDescriptor() {\n    return DtoFactory.getInstance().createDto(ServiceDescriptor.class);\n  }\n\n  /**\n   * Generates link header value based on given {@code page} and uri returned by {@code\n   * uriInfo.getRequestUri()}.\n   *\n   * @param page page to create link header\n   * @return link header value\n   */\n  protected String createLinkHeader(Page<?> page) {\n    return PagingUtil.createLinkHeader(page, uriInfo.getRequestUri());\n  }\n\n  /**\n   * Creates uri from the given parameters and delegates execution to the {@link\n   * PagingUtil#createLinkHeader(Page, URI)} method.\n   *\n   * @param page page to create link header\n   * @param method rest service method name like {@link UriBuilder#path(Class, String) path}\n   *     argument\n   * @param queryParams query parameters map, if multiple query params needed then {@link\n   *     #createLinkHeader(Page, String, ListMultimap, Object...)} method should be used instead\n   * @param pathParams path param values like {f@link UriBuilder#build(Object...)} method arguments\n   */\n  protected String createLinkHeader(\n      Page<?> page, String method, Map<String, Object> queryParams, Object... pathParams) {\n    final UriBuilder ub = getServiceContext().getServiceUriBuilder().path(getClass(), method);\n    for (Map.Entry<String, Object> queryParam : queryParams.entrySet()) {\n      ub.queryParam(queryParam.getKey(), queryParam.getValue());\n    }\n    return PagingUtil.createLinkHeader(page, ub.build(pathParams));\n  }\n\n  /**\n   * This method is the same to the {@link #createLinkHeader(Page, String, Map, Object...)} except\n   * of receiving query parameters.\n   */\n  protected String createLinkHeader(Page<?> page, String method, Object... pathParams) {\n    return createLinkHeader(page, method, emptyMap(), pathParams);\n  }\n\n  /**\n   * This method is the same to {@link #createLinkHeader(Page, String, Map, Object...)} except of\n   * receiving multivalued query parameters.\n   */\n  protected String createLinkHeader(\n      Page<?> page, String method, ListMultimap<String, Object> queryParams, Object... pathParams) {\n    final UriBuilder ub = getServiceContext().getServiceUriBuilder().path(getClass(), method);\n    for (Map.Entry<String, Object> queryParam : queryParams.entries()) {\n      ub.queryParam(queryParam.getKey(), queryParam.getValue());\n    }\n    return PagingUtil.createLinkHeader(page, ub.build(pathParams));\n  }\n\n  private static final Set<String> JAX_RS_ANNOTATIONS;\n\n  static {\n    List<String> tmp = new ArrayList<>(8);\n    tmp.add(CookieParam.class.getName());\n    tmp.add(Context.class.getName());\n    tmp.add(HeaderParam.class.getName());\n    tmp.add(MatrixParam.class.getName());\n    tmp.add(PathParam.class.getName());\n    tmp.add(QueryParam.class.getName());\n    tmp.add(FormParam.class.getName());\n    tmp.add(\"org.everrest.core.Property\");\n    JAX_RS_ANNOTATIONS = new HashSet<>(tmp);\n  }\n\n  private ServiceDescriptor generateServiceDescriptor(\n      UriInfo uriInfo, Class<? extends Service> service) {\n    final List<Link> links = new ArrayList<>();\n    for (Method method : service.getMethods()) {\n      final GenerateLink generateLink = method.getAnnotation(GenerateLink.class);\n      if (generateLink != null) {\n        try {\n          links.add(generateLinkForMethod(uriInfo, generateLink.rel(), method));\n        } catch (RuntimeException ignored) {\n        }\n      }\n    }\n    final Description description = service.getAnnotation(Description.class);\n    final ServiceDescriptor dto =\n        createServiceDescriptor()\n            .withHref(uriInfo.getRequestUriBuilder().replaceQuery(null).build().toString())\n            .withLinks(links)\n            .withVersion(Constants.API_VERSION);\n    if (description != null) {\n      dto.setDescription(description.value());\n    }\n    return dto;\n  }\n\n  private Link generateLinkForMethod(\n      UriInfo uriInfo, String linkRel, Method method, Object... pathParameters) {\n    String httpMethod = null;\n    final HttpMethod httpMethodAnnotation = getMetaAnnotation(method, HttpMethod.class);\n    if (httpMethodAnnotation != null) {\n      httpMethod = httpMethodAnnotation.value();\n    }\n    if (httpMethod == null) {\n      throw new IllegalArgumentException(\n          format(\n              \"Method '%s' has not any HTTP method annotation and may not be used to produce link.\",\n              method.getName()));\n    }\n\n    final Consumes consumes = getAnnotation(method, Consumes.class);\n    final Produces produces = getAnnotation(method, Produces.class);\n\n    final UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();\n    final LinkedList<String> matchedURIs = new LinkedList<>(uriInfo.getMatchedURIs());\n    // Get path to the root resource.\n    if (uriInfo.getMatchedResources().size() < matchedURIs.size()) {\n      matchedURIs.remove();\n    }\n\n    while (!matchedURIs.isEmpty()) {\n      baseUriBuilder.path(matchedURIs.pollLast());\n    }\n\n    final Path path = method.getAnnotation(Path.class);\n    if (path != null) {\n      baseUriBuilder.path(path.value());\n    }\n\n    final Link link =\n        DtoFactory.getInstance()\n            .createDto(Link.class)\n            .withRel(linkRel)\n            .withHref(baseUriBuilder.build(pathParameters).toString())\n            .withMethod(httpMethod);\n    if (consumes != null) {\n      link.setConsumes(consumes.value()[0]);\n    }\n    if (produces != null) {\n      link.setProduces(produces.value()[0]);\n    }\n\n    Class<?>[] parameterClasses = method.getParameterTypes();\n    if (parameterClasses.length > 0) {\n      Annotation[][] annotations = method.getParameterAnnotations();\n      for (int i = 0; i < parameterClasses.length; i++) {\n        if (annotations[i].length > 0) {\n          boolean isBodyParameter = false;\n          QueryParam queryParam = null;\n          Description description = null;\n          Required required = null;\n          Valid valid = null;\n          DefaultValue defaultValue = null;\n          for (int j = 0; j < annotations[i].length; j++) {\n            Annotation annotation = annotations[i][j];\n            isBodyParameter |= !JAX_RS_ANNOTATIONS.contains(annotation.annotationType().getName());\n            Class<?> annotationType = annotation.annotationType();\n            if (annotationType == QueryParam.class) {\n              queryParam = (QueryParam) annotation;\n            } else if (annotationType == Description.class) {\n              description = (Description) annotation;\n            } else if (annotationType == Required.class) {\n              required = (Required) annotation;\n            } else if (annotationType == Valid.class) {\n              valid = (Valid) annotation;\n            } else if (annotationType == DefaultValue.class) {\n              defaultValue = (DefaultValue) annotation;\n            }\n          }\n          if (queryParam != null) {\n            LinkParameter parameter =\n                DtoFactory.getInstance()\n                    .createDto(LinkParameter.class)\n                    .withName(queryParam.value())\n                    .withRequired(required != null)\n                    .withType(getParameterType(parameterClasses[i]));\n            if (defaultValue != null) {\n              parameter.setDefaultValue(defaultValue.value());\n            }\n            if (description != null) {\n              parameter.setDescription(description.value());\n            }\n            if (valid != null) {\n              parameter.setValid(Arrays.asList(valid.value()));\n            }\n            link.getParameters().add(parameter);\n          } else if (isBodyParameter) {\n            if (description != null) {\n              link.setRequestBody(\n                  DtoFactory.getInstance()\n                      .createDto(RequestBodyDescriptor.class)\n                      .withDescription(description.value()));\n            }\n          }\n        }\n      }\n    }\n    return link;\n  }\n\n  private <T extends Annotation> T getAnnotation(Method method, Class<T> annotationClass) {\n    T annotation = method.getAnnotation(annotationClass);\n    if (annotation == null) {\n      for (Class<?> c = method.getDeclaringClass().getSuperclass();\n          annotation == null && c != null && c != Object.class;\n          c = c.getSuperclass()) {\n        Method inherited = null;\n        try {\n          inherited = c.getMethod(method.getName(), method.getParameterTypes());\n        } catch (NoSuchMethodException ignored) {\n        }\n        if (inherited != null) {\n          annotation = inherited.getAnnotation(annotationClass);\n        }\n      }\n    }\n    return annotation;\n  }\n\n  private <T extends Annotation> T getMetaAnnotation(Method method, Class<T> metaAnnotationClass) {\n    T annotation = null;\n    for (Annotation a : method.getAnnotations()) {\n      annotation = a.annotationType().getAnnotation(metaAnnotationClass);\n      if (annotation != null) {\n        break;\n      }\n    }\n    if (annotation == null) {\n      for (Class<?> c = method.getDeclaringClass().getSuperclass();\n          annotation == null && c != null && c != Object.class;\n          c = c.getSuperclass()) {\n        Method inherited = null;\n        try {\n          inherited = c.getMethod(method.getName(), method.getParameterTypes());\n        } catch (NoSuchMethodException ignored) {\n        }\n        if (inherited != null) {\n          for (Annotation a : inherited.getAnnotations()) {\n            annotation = a.annotationType().getAnnotation(metaAnnotationClass);\n            if (annotation != null) {\n              break;\n            }\n          }\n        }\n      }\n    }\n    return annotation;\n  }\n\n  private ParameterType getParameterType(Class<?> clazz) {\n    if (clazz == String.class) {\n      return ParameterType.String;\n    }\n    // restriction for collections which allowed for QueryParam annotation\n    if (clazz == List.class || clazz == Set.class || clazz == SortedSet.class) {\n      return ParameterType.Array;\n    }\n    if (clazz == Boolean.class || clazz == boolean.class) {\n      return ParameterType.Boolean;\n    }\n    if (clazz == short.class\n        || clazz == int.class\n        || clazz == long.class\n        || clazz == float.class\n        || clazz == double.class\n        || clazz == Short.class\n        || clazz == Integer.class\n        || clazz == Long.class\n        || clazz == Float.class\n        || clazz == Double.class) {\n      return ParameterType.Number;\n    }\n    return ParameterType.Object;\n  }\n\n  private static class ServiceContextImpl implements ServiceContext {\n    final UriBuilder uriBuilder;\n    final Class serviceClass;\n\n    ServiceContextImpl(UriBuilder uriBuilder, Class serviceClass) {\n      this.uriBuilder = uriBuilder;\n      this.serviceClass = serviceClass;\n    }\n\n    @Override\n    public UriBuilder getServiceUriBuilder() {\n      return uriBuilder.clone().path(serviceClass);\n    }\n\n    @Override\n    public UriBuilder getBaseUriBuilder() {\n      return uriBuilder.clone();\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/ServiceContext.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport jakarta.ws.rs.core.UriBuilder;\n\n/**\n * Helps to deliver context of RESTful request to components.\n *\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n */\npublic interface ServiceContext {\n  /**\n   * Get UriBuilder which already contains base URI of RESTful application and URL pattern of\n   * RESTful service that produces this instance.\n   */\n  UriBuilder getServiceUriBuilder();\n\n  /** Get UriBuilder which already contains base URI of RESTful application. */\n  UriBuilder getBaseUriBuilder();\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/WebApplicationExceptionMapper.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport jakarta.ws.rs.BadRequestException;\nimport jakarta.ws.rs.ForbiddenException;\nimport jakarta.ws.rs.NotAcceptableException;\nimport jakarta.ws.rs.NotAllowedException;\nimport jakarta.ws.rs.NotAuthorizedException;\nimport jakarta.ws.rs.NotFoundException;\nimport jakarta.ws.rs.NotSupportedException;\nimport jakarta.ws.rs.WebApplicationException;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.core.Response.Status;\nimport jakarta.ws.rs.ext.ExceptionMapper;\nimport jakarta.ws.rs.ext.Provider;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * Mapper for the {@link WebApplicationException} exceptions.\n *\n * @author Max Shaposhnyk\n */\n@Provider\n@Singleton\npublic class WebApplicationExceptionMapper implements ExceptionMapper<WebApplicationException> {\n\n  @Override\n  public Response toResponse(WebApplicationException exception) {\n\n    ServiceError error = newDto(ServiceError.class).withMessage(exception.getMessage());\n\n    if (exception instanceof BadRequestException) {\n      return Response.status(Response.Status.BAD_REQUEST)\n          .entity(DtoFactory.getInstance().toJson(error))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    } else if (exception instanceof ForbiddenException) {\n      return Response.status(Response.Status.FORBIDDEN)\n          .entity(DtoFactory.getInstance().toJson(error))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    } else if (exception instanceof NotFoundException) {\n      return Response.status(Response.Status.NOT_FOUND)\n          .entity(DtoFactory.getInstance().toJson(error))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    } else if (exception instanceof NotAuthorizedException) {\n      return Response.status(Response.Status.UNAUTHORIZED)\n          .entity(DtoFactory.getInstance().toJson(error))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    } else if (exception instanceof NotAcceptableException) {\n      return Response.status(Status.NOT_ACCEPTABLE)\n          .entity(DtoFactory.getInstance().toJson(error))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    } else if (exception instanceof NotAllowedException) {\n      return Response.status(Status.METHOD_NOT_ALLOWED)\n          .entity(DtoFactory.getInstance().toJson(error))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    } else if (exception instanceof NotSupportedException) {\n      return Response.status(Status.UNSUPPORTED_MEDIA_TYPE)\n          .entity(DtoFactory.getInstance().toJson(error))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    } else {\n      return Response.serverError()\n          .entity(DtoFactory.getInstance().toJson(error))\n          .type(MediaType.APPLICATION_JSON)\n          .build();\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/annotations/Description.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Description of service or its parameters.\n *\n * <p>It may be applied to:\n *\n * <ul>\n *   <li>sub-classes of {@link org.eclipse.che.api.core.rest.Service Service}. In this case value of\n *       this annotation is copied to the field {@link\n *       org.eclipse.che.api.core.rest.shared.dto.ServiceDescriptor#getDescription()}\n *   <li>parameter of RESTful method annotated with {@link jakarta.ws.rs.QueryParam\n *       &#64;QueryParam}. In this case value of this annotation is copied to the field {@link\n *       org.eclipse.che.api.core.rest.shared.dto.LinkParameter#getDescription()}\n *   <li>entity parameter (not annotated with JAX-RS annotations) of RESTful method. Entity\n *       parameters are described in section 3.3.2.1 of JAX-RS specification 1.0. In this case value\n *       of this annotation is copied to the filed of {@link\n *       org.eclipse.che.api.core.rest.shared.dto.RequestBodyDescriptor#getDescription()}\n * </ul>\n *\n * <p>For example: There is EchoService. Let's see on the values of Description annotations. Here we\n * have two: at class and at method's parameter.\n *\n * <pre>\n * &#064Path(\"echo\")\n * &#064Description(\"echo service\")\n * public class EchoService extends Service {\n *\n *     &#064GenerateLink(rel = \"message\")\n *     &#064GET\n *     &#064Path(\"say\")\n *     &#064Produces(\"plain/text\")\n *     public String echo1(&#064Required &#064Description(\"echo message\") &#064QueryParam(\"message\") String message) {\n *         return message;\n *     }\n * }\n * </pre>\n *\n * <p>Request to URL '${base_uri}/echo' gets next output:\n *\n * <p>\n *\n * <pre>\n * {\n *   \"description\":\"echo service\",\n *   \"version\":\"1.0\",\n *   \"href\":\"${base_uri}/echo\",\n *   \"links\":[\n *     {\n *       \"href\":\"${base_uri}/echo/say\",\n *       \"produces\":\"plain/text\",\n *       \"rel\":\"message\",\n *       \"method\":\"GET\",\n *       \"parameters\":[\n *         {\n *           \"name\":\"message\",\n *           \"type\":\"String\",\n *           \"required\":true,\n *           \"description\":\"echo message\"\n *         }\n *       ]\n *     }\n *   ]\n * }\n * </pre>\n *\n * See two descriptions in JSON output.\n *\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n * @see org.eclipse.che.api.core.rest.shared.dto.ServiceDescriptor\n * @see org.eclipse.che.api.core.rest.shared.dto.LinkParameter\n * @see org.eclipse.che.api.core.rest.shared.dto.RequestBodyDescriptor\n */\n@Target({ElementType.TYPE, ElementType.PARAMETER})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface Description {\n  /**\n   * @return the description\n   */\n  String value();\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/annotations/GenerateLink.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * This annotation may be applied to methods of sub-class of {@link\n * org.eclipse.che.api.core.rest.Service}. When client accesses method {@link\n * org.eclipse.che.api.core.rest.Service#getServiceDescriptor()} all methods with this annotation\n * are analyzed to provide descriptor of particular service. In instance of {@link\n * org.eclipse.che.api.core.rest.shared.dto.ServiceDescriptor ServiceDescriptor} methods with this\n * annotation are represented as set of links. It should help client to understand capabilities of\n * particular RESTful service.\n *\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n * @see org.eclipse.che.api.core.rest.Service\n * @see org.eclipse.che.api.core.rest.shared.dto.ServiceDescriptor\n */\n@Target({ElementType.METHOD})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface GenerateLink {\n  String rel();\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/annotations/OPTIONS.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.annotations;\n\nimport jakarta.ws.rs.HttpMethod;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * @author andrew00x\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\n@HttpMethod(HttpMethod.OPTIONS)\npublic @interface OPTIONS {}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/annotations/Required.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Helps to inform client about mandatory parameters of request.\n *\n * <p>This annotation may be applied to parameter of RESTful method annotated with {@link\n * jakarta.ws.rs.QueryParam &#64;QueryParam}. In this case field of {@link\n * org.eclipse.che.api.core.rest.shared.dto.LinkParameter#isRequired()} is set to {@code true}.\n *\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n * @see org.eclipse.che.api.core.rest.shared.dto.LinkParameter\n * @see org.eclipse.che.api.core.rest.shared.dto.RequestBodyDescriptor\n */\n@Target({ElementType.PARAMETER})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface Required {}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/annotations/Valid.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Helps to inform client about valid values of request parameters.\n *\n * <p>This annotation may be applied to parameter of RESTful method annotated with {@link\n * jakarta.ws.rs.QueryParam &#64;QueryParam}. In this case value of this annotation is copied to\n * field {@link org.eclipse.che.api.core.rest.shared.dto.LinkParameter#getValid()}\n *\n * <p>For example: There is EchoService. Let's see on the value of Valid annotation, it is {\"hello\",\n * \"goodbye\"}.\n *\n * <pre>\n * &#064Path(\"echo\")\n * &#064Description(\"echo service\")\n * public class EchoService extends Service {\n *\n *     &#064GenerateLink(rel = \"message\")\n *     &#064GET\n *     &#064Path(\"say\")\n *     &#064Produces(\"plain/text\")\n *     public String echo1(&#064Required &#064Valid({\"hello\", \"goodbye\"}) &#064QueryParam(\"message\") String message) {\n *         return message;\n *     }\n * }\n * </pre>\n *\n * <p>Request to URL '${base_uri}/echo' gets next output:\n *\n * <p>\n *\n * <pre>\n * {\n *   \"description\":\"echo service\",\n *   \"version\":\"1.0\",\n *   \"href\":\"${base_uri}/echo\",\n *   \"links\":[\n *     {\n *       \"href\":\"${base_uri}/echo/say\",\n *       \"produces\":\"plain/text\",\n *       \"rel\":\"message\",\n *       \"method\":HttpMethod.GET,\n *       \"parameters\":[\n *         {\n *           \"name\":\"message\",\n *           \"type\":\"String\",\n *           \"required\":true,\n *           \"valid\":[\n *             \"hello\",\n *             \"goodbye\"\n *           ]\n *         }\n *       ]\n *     }\n *   ]\n * }\n * </pre>\n *\n * There are two \"valid\" values for parameter \"message\": [\"hello\", \"goodbye\"] in JSON output.\n *\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n * @see org.eclipse.che.api.core.rest.shared.dto.LinkParameter\n * @see org.eclipse.che.api.core.rest.shared.dto.RequestBodyDescriptor\n */\n@Target({ElementType.FIELD, ElementType.PARAMETER})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface Valid {\n  String[] value();\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/shared/Links.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.shared;\n\nimport java.util.LinkedList;\nimport java.util.List;\nimport org.eclipse.che.api.core.rest.shared.dto.Hyperlinks;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\n\n/**\n * Helper class for working with links.\n *\n * @author andrew00x\n */\npublic class Links {\n  /**\n   * Find first link in the specified list by its relation.\n   *\n   * @param rel link's relation\n   * @param links list of links\n   * @return found link or {@code null}\n   */\n  public static Link getLink(String rel, List<Link> links) {\n    for (Link link : links) {\n      if (rel.equals(link.getRel())) {\n        return link;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Find all links in the specified list by its relation.\n   *\n   * @param rel link's relation\n   * @param links list of links\n   * @return found link or {@code null}\n   */\n  public static List<Link> getLinks(String rel, List<Link> links) {\n    final List<Link> result = new LinkedList<>();\n    for (Link link : links) {\n      if (rel.equals(link.getRel())) {\n        result.add(link);\n      }\n    }\n    return result;\n  }\n\n  public static Link getLink(Hyperlinks links, String rel) {\n    return getLink(rel, links.getLinks());\n  }\n\n  public static List<Link> getLinks(Hyperlinks links, String rel) {\n    return getLinks(rel, links.getLinks());\n  }\n\n  private Links() {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/shared/ParameterType.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.shared;\n\n/**\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n */\npublic enum ParameterType {\n  String,\n  Number,\n  Boolean,\n  Array,\n  Object\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/shared/dto/ApiInfo.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.shared.dto;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author andrew00x\n */\n@DTO\npublic interface ApiInfo {\n  String getSpecificationVendor();\n\n  ApiInfo withSpecificationVendor(String specificationVendor);\n\n  void setSpecificationVendor(String specificationVendor);\n\n  String getImplementationVendor();\n\n  ApiInfo withImplementationVendor(String implementationVendor);\n\n  void setImplementationVendor(String implementationVendor);\n\n  String getSpecificationTitle();\n\n  ApiInfo withSpecificationTitle(String specificationTitle);\n\n  void setSpecificationTitle(String specificationTitle);\n\n  String getSpecificationVersion();\n\n  ApiInfo withSpecificationVersion(String specificationVersion);\n\n  void setSpecificationVersion(String specificationVersion);\n\n  String getImplementationVersion();\n\n  ApiInfo withImplementationVersion(String implementationVersion);\n\n  void setImplementationVersion(String implementationVersion);\n\n  String getScmRevision();\n\n  ApiInfo withScmRevision(String scmRevision);\n\n  void setScmRevision(String scmRevision);\n\n  String getIdeVersion();\n\n  ApiInfo withIdeVersion(String ideVersion);\n\n  void setIdeVersion(String ideVersion);\n\n  String getBuildInfo();\n\n  ApiInfo withBuildInfo(String buildInfo);\n\n  void setBuildInfo(String buildInfo);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/shared/dto/ExtendedError.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.shared.dto;\n\nimport java.util.Map;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Extended error which contains error code and optional attributes.\n *\n * @author Max Shaposhnik (mshaposhnik@codenvy.com)\n */\n@DTO\npublic interface ExtendedError extends ServiceError {\n\n  /**\n   * Get error code.\n   *\n   * @return error code\n   */\n  int getErrorCode();\n\n  /**\n   * Set error code.\n   *\n   * @param errorCode error code\n   */\n  void setErrorCode(int errorCode);\n\n  ExtendedError withErrorCode(int errorCode);\n\n  /**\n   * Get error attributes.\n   *\n   * @return attributes of the error if any\n   */\n  Map<String, String> getAttributes();\n\n  /**\n   * Set error attributes.\n   *\n   * @param attributes error attributes\n   */\n  void setAttributes(Map<String, String> attributes);\n\n  ExtendedError withAttributes(Map<String, String> attributes);\n\n  @Override\n  ExtendedError withMessage(String message);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/shared/dto/Hyperlinks.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.shared.dto;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.rest.shared.Links;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.dto.shared.DelegateRule;\nimport org.eclipse.che.dto.shared.DelegateTo;\n\n/**\n * @author andrew00x\n */\n@DTO\npublic interface Hyperlinks {\n  List<Link> getLinks();\n\n  Hyperlinks withLinks(List<Link> links);\n\n  void setLinks(List<Link> links);\n\n  @DelegateTo(\n      client = @DelegateRule(type = Links.class, method = \"getLinks\"),\n      server = @DelegateRule(type = Links.class, method = \"getLinks\"))\n  List<Link> getLinks(String rel);\n\n  @DelegateTo(\n      client = @DelegateRule(type = Links.class, method = \"getLink\"),\n      server = @DelegateRule(type = Links.class, method = \"getLink\"))\n  Link getLink(String rel);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/shared/dto/Link.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.shared.dto;\n\nimport java.util.List;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.dto.shared.DelegateRule;\nimport org.eclipse.che.dto.shared.DelegateTo;\n\n/**\n * Describes resource.\n *\n * @author andrew00x\n */\n@DTO\npublic interface Link {\n  /**\n   * Get URL of resource link.\n   *\n   * @return URL of resource link.\n   */\n  String getHref();\n\n  Link withHref(String href);\n\n  /**\n   * Set URL of resource link.\n   *\n   * @param href URL of resource link.\n   */\n  void setHref(String href);\n\n  /**\n   * Get short description of resource link.\n   *\n   * @return short description of resource link\n   */\n  String getRel();\n\n  Link withRel(String rel);\n\n  /**\n   * Set short description of resource link.\n   *\n   * @param rel short description of resource link\n   */\n  void setRel(String rel);\n\n  /**\n   * Get HTTP method to use with resource.\n   *\n   * @return HTTP method to use with resource\n   */\n  String getMethod();\n\n  Link withMethod(String method);\n\n  /**\n   * Set HTTP method to use with resource.\n   *\n   * @param method HTTP method to use with resource\n   */\n  void setMethod(String method);\n\n  /**\n   * Get media type produced by resource.\n   *\n   * @return media type produced by resource\n   */\n  String getProduces();\n\n  Link withProduces(String produces);\n\n  /**\n   * Set media type produced by resource.\n   *\n   * @param produces media type produced by resource\n   */\n  void setProduces(String produces);\n\n  /**\n   * Get media type consumed by resource.\n   *\n   * @return media type consumed by resource\n   */\n  String getConsumes();\n\n  Link withConsumes(String consumes);\n\n  /**\n   * Set media type consumed by resource.\n   *\n   * @param consumes media type consumed by resource\n   */\n  void setConsumes(String consumes);\n\n  /**\n   * Get description of the query parameters (if any) of request.\n   *\n   * @return description of the query parameters (if any) of request\n   */\n  List<LinkParameter> getParameters();\n\n  @DelegateTo(\n      client = @DelegateRule(type = LinkParameterResolver.class, method = \"getParameter\"),\n      server = @DelegateRule(type = LinkParameterResolver.class, method = \"getParameter\"))\n  LinkParameter getParameter(String parameterName);\n\n  Link withParameters(List<LinkParameter> parameters);\n\n  /**\n   * Set description of the query parameters (if any) of request.\n   *\n   * @param parameters description of the query parameters (if any) of request\n   */\n  void setParameters(List<LinkParameter> parameters);\n\n  /**\n   * Get request body description.\n   *\n   * @return request body description\n   */\n  RequestBodyDescriptor getRequestBody();\n\n  Link withRequestBody(RequestBodyDescriptor requestBody);\n\n  /**\n   * Set request body description.\n   *\n   * @param requestBody request body description\n   */\n  void setRequestBody(RequestBodyDescriptor requestBody);\n\n  class LinkParameterResolver {\n    public static LinkParameter getParameter(Link link, String parameterName) {\n      for (LinkParameter linkParameter : link.getParameters()) {\n        if (linkParameter.getName().equals(parameterName)) {\n          return linkParameter;\n        }\n      }\n      return null;\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/shared/dto/LinkParameter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.shared.dto;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.rest.shared.ParameterType;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describes one query parameter of the request.\n *\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n * @see org.eclipse.che.api.core.rest.annotations.Description\n * @see org.eclipse.che.api.core.rest.annotations.Required\n * @see org.eclipse.che.api.core.rest.annotations.Valid\n */\n@DTO\npublic interface LinkParameter {\n  /**\n   * Get name of parameter.\n   *\n   * @return name of parameter\n   */\n  String getName();\n\n  LinkParameter withName(String name);\n\n  /**\n   * Set name of parameter.\n   *\n   * @param name name of parameter\n   */\n  void setName(String name);\n\n  /**\n   * Get defaultValue of parameter.\n   *\n   * @return defaultValue of parameter\n   */\n  String getDefaultValue();\n\n  LinkParameter withDefaultValue(String defaultValue);\n\n  /**\n   * Set defaultValue of parameter.\n   *\n   * @param defaultValue defaultValue of parameter\n   */\n  void setDefaultValue(String defaultValue);\n\n  /**\n   * Get optional description of parameter.\n   *\n   * @return optional description of parameter\n   * @see org.eclipse.che.api.core.rest.annotations.Description\n   */\n  String getDescription();\n\n  LinkParameter withDescription(String description);\n\n  /**\n   * Set optional description of parameter.\n   *\n   * @param description optional description of parameter\n   * @see org.eclipse.che.api.core.rest.annotations.Description\n   */\n  void setDescription(String description);\n\n  /**\n   * Get type of parameter.\n   *\n   * @return type of parameter\n   * @see org.eclipse.che.api.core.rest.shared.ParameterType\n   */\n  ParameterType getType();\n\n  LinkParameter withType(ParameterType type);\n\n  /**\n   * Set type of parameter.\n   *\n   * @param type type of parameter\n   * @see ParameterType\n   */\n  void setType(ParameterType type);\n\n  /**\n   * Reports whether the parameter is mandatory.\n   *\n   * @return {@code true} if parameter is required and {@code false} otherwise\n   * @see org.eclipse.che.api.core.rest.annotations.Required\n   */\n  boolean isRequired();\n\n  LinkParameter withRequired(boolean required);\n\n  /**\n   * @param required {@code true} if parameter is required and {@code false} otherwise\n   * @see org.eclipse.che.api.core.rest.annotations.Required\n   */\n  void setRequired(boolean required);\n\n  /**\n   * Get optional list of constraint strings.\n   *\n   * @return optional list of constraint strings\n   * @see org.eclipse.che.api.core.rest.annotations.Valid\n   */\n  List<String> getValid();\n\n  LinkParameter withValid(List<String> valid);\n\n  /**\n   * Set optional list of constraint strings.\n   *\n   * @param valid optional list of constraint strings\n   * @see org.eclipse.che.api.core.rest.annotations.Valid\n   */\n  void setValid(List<String> valid);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/shared/dto/RequestBodyDescriptor.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.shared.dto;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describes body of the request.\n *\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n */\n@DTO\npublic interface RequestBodyDescriptor {\n  /**\n   * Get optional description of request body.\n   *\n   * @return optional description of request body\n   */\n  String getDescription();\n\n  RequestBodyDescriptor withDescription(String description);\n\n  /**\n   * Set optional description of request body.\n   *\n   * @param description optional description of request body\n   */\n  void setDescription(String description);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/shared/dto/ServiceDescriptor.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.shared.dto;\n\nimport java.util.List;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describes capabilities of the Service.\n *\n * @author andrew00x\n * @see org.eclipse.che.api.core.rest.Service\n */\n@DTO\npublic interface ServiceDescriptor extends Hyperlinks {\n\n  /**\n   * Get location to get this service descriptor in JSON format.\n   *\n   * @return location to get this service descriptor in JSON format\n   */\n  String getHref();\n\n  ServiceDescriptor withHref(String href);\n\n  /**\n   * Set location to get this service descriptor in JSON format.\n   *\n   * @param href location to get this service descriptor in JSON format\n   */\n  void setHref(String href);\n\n  /**\n   * Get description of the Service.\n   *\n   * @return description of the Service\n   */\n  String getDescription();\n\n  ServiceDescriptor withDescription(String description);\n\n  /**\n   * Set description of the Service.\n   *\n   * @param description description of the Service\n   */\n  void setDescription(String description);\n\n  /**\n   * Get API version.\n   *\n   * @return API version\n   */\n  String getVersion();\n\n  ServiceDescriptor withVersion(String version);\n\n  /**\n   * Get API version.\n   *\n   * @param version API version\n   */\n  void setVersion(String version);\n\n  ServiceDescriptor withLinks(List<Link> links);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/rest/shared/dto/ServiceError.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.shared.dto;\n\nimport java.util.List;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describes error which may be serialized to JSON format with {@link\n * org.eclipse.che.api.core.rest.ApiExceptionMapper}\n *\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n * @see org.eclipse.che.api.core.ApiException\n * @see org.eclipse.che.api.core.rest.ApiExceptionMapper\n */\n@DTO\npublic interface ServiceError {\n  /**\n   * Get error message.\n   *\n   * @return error message\n   */\n  String getMessage();\n\n  List<String> getTrace();\n\n  ServiceError withMessage(String message);\n\n  ServiceError withTrace(List<String> trace);\n\n  /**\n   * Set error message.\n   *\n   * @param message error message\n   */\n  void setMessage(String message);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/AbstractLineConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.io.IOException;\n\n/**\n * No-op implementation of {@link LineConsumer}\n *\n * @author Alexander Garagatyi\n */\npublic abstract class AbstractLineConsumer implements LineConsumer {\n  @Override\n  public void writeLine(String line) throws IOException {}\n\n  @Override\n  public void close() throws IOException {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/AbstractMessageConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.io.IOException;\n\n/**\n * No-op implementation of {@link MessageConsumer}\n *\n * @author Alexander Garagatyi\n */\npublic class AbstractMessageConsumer<T> implements MessageConsumer<T> {\n  @Override\n  public void consume(T message) throws IOException {}\n\n  @Override\n  public void close() throws IOException {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/ApiInfoLogInformer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport jakarta.annotation.PostConstruct;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.rest.shared.dto.ApiInfo;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Prints information about Eclipse Che Core implementation, such as: version, scm revision, build\n * info.\n */\npublic class ApiInfoLogInformer {\n  private static final Logger LOG = LoggerFactory.getLogger(ApiInfoLogInformer.class);\n\n  private final ApiInfo apiInfo;\n\n  @Inject\n  public ApiInfoLogInformer(ApiInfo apiInfo) {\n    this.apiInfo = apiInfo;\n  }\n\n  @PostConstruct\n  public void printApiInfoOnStart() {\n    LOG.info(\n        \"Eclipse Che Api Core: Build info '{}' scmRevision '{}' implementationVersion '{}'\",\n        apiInfo.getBuildInfo(),\n        apiInfo.getScmRevision(),\n        apiInfo.getImplementationVersion());\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/Cancellable.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\n/**\n * Implementation of this interface may be used with {@link Watchdog} to make possible terminate\n * task by timeout.\n *\n * @author andrew00x\n */\npublic interface Cancellable {\n  interface Callback {\n    /**\n     * Notified when Cancellable cancelled.\n     *\n     * @param cancellable Cancellable\n     */\n    void cancelled(Cancellable cancellable);\n  }\n\n  /**\n   * Attempts to cancel execution of this {@code Cancellable}.\n   *\n   * @throws Exception if cancellation is failed\n   */\n  void cancel() throws Exception;\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/CommandLine.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Container for system command arguments.\n *\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n */\npublic class CommandLine {\n  private final List<String> line;\n\n  public CommandLine(CommandLine other) {\n    line = new ArrayList<>(other.line);\n  }\n\n  public CommandLine(String... args) {\n    line = new ArrayList<>();\n    if (args != null && args.length > 0) {\n      Collections.addAll(line, args);\n    }\n  }\n\n  public CommandLine() {\n    line = new ArrayList<>();\n  }\n\n  /**\n   * Adds list of arguments in command line.\n   *\n   * @param args arguments\n   * @return this {@code CommandLine}\n   */\n  public CommandLine add(String... args) {\n    if (args != null && args.length > 0) {\n      Collections.addAll(line, args);\n    }\n    return this;\n  }\n\n  /**\n   * Adds list of arguments in command line.\n   *\n   * @param args arguments\n   * @return this {@code CommandLine}\n   */\n  public CommandLine add(List<String> args) {\n    if (args != null && !args.isEmpty()) {\n      line.addAll(args);\n    }\n    return this;\n  }\n\n  /**\n   * Adds set of options in command line.\n   *\n   * @param options options\n   * @return this {@code CommandLine}\n   * @see #addPair(String, String)\n   */\n  public CommandLine add(Map<String, String> options) {\n    if (options != null && !options.isEmpty()) {\n      for (Map.Entry<String, String> entry : options.entrySet()) {\n        addPair(entry.getKey(), entry.getValue());\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Adds option in command line. If {@code value != null} then adds {@code name=value} in command\n   * line. If {@code value} is {@code null} adds only {@code name} in command line.\n   *\n   * @param name option's name\n   * @param value option's value\n   * @return this {@code CommandLine}\n   */\n  public CommandLine addPair(String name, String value) {\n    if (name != null) {\n      if (value != null) {\n        line.add(name + '=' + value);\n      } else {\n        line.add(name);\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Removes all command line arguments.\n   *\n   * @return this {@code CommandLine}\n   */\n  public CommandLine clear() {\n    line.clear();\n    return this;\n  }\n\n  public String[] asArray() {\n    return line.toArray(new String[line.size()]);\n  }\n\n  /** Create shell command. */\n  public String[] toShellCommand() {\n    return ShellFactory.getShell().createShellCommand(this);\n  }\n\n  @Override\n  public String toString() {\n    final String[] str = asArray();\n    final StringBuilder sb = new StringBuilder();\n    for (String s : str) {\n      if (sb.length() > 1) {\n        sb.append(' ');\n      }\n      sb.append(s);\n    }\n    return sb.toString();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/CompositeLineConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.io.IOException;\nimport java.nio.channels.ClosedByInterruptException;\nimport java.util.List;\nimport java.util.concurrent.CopyOnWriteArrayList;\nimport org.eclipse.che.api.core.util.lineconsumer.ConsumerAlreadyClosedException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * This line consumer consists of several consumers and copies each consumed line into all\n * subconsumers. Is used when lines should be written into two or more consumers. <br>\n * This class is not thread safe. Also see multithreaded implementation {@link\n * org.eclipse.che.api.core.util.lineconsumer.ConcurrentCompositeLineConsumer}\n *\n * @author andrew00x\n * @author Mykola Morhun\n */\npublic class CompositeLineConsumer implements LineConsumer {\n  private static final Logger LOG = LoggerFactory.getLogger(CompositeLineConsumer.class);\n\n  private final List<LineConsumer> lineConsumers;\n  private boolean isOpen;\n\n  public CompositeLineConsumer(LineConsumer... lineConsumers) {\n    this.lineConsumers = new CopyOnWriteArrayList<>(lineConsumers);\n    this.isOpen = true;\n  }\n\n  /** Closes all unclosed subconsumers. */\n  @Override\n  public void close() {\n    if (isOpen) {\n      isOpen = false;\n      for (LineConsumer lineConsumer : lineConsumers) {\n        try {\n          lineConsumer.close();\n        } catch (IOException e) {\n          LOG.error(\n              String.format(\"An error occurred while closing the line consumer %s\", lineConsumer),\n              e);\n        }\n      }\n    }\n  }\n\n  /**\n   * Writes given line to each subconsumer. Do nothing if this consumer is closed or all\n   * subconsumers are closed.\n   *\n   * @param line line to write\n   */\n  @Override\n  public void writeLine(String line) {\n    if (isOpen) {\n      for (LineConsumer lineConsumer : lineConsumers) {\n        try {\n          lineConsumer.writeLine(line);\n        } catch (ClosedByInterruptException interrupted) {\n          Thread.currentThread().interrupt();\n          isOpen = false;\n          return;\n        } catch (ConsumerAlreadyClosedException e) {\n          lineConsumers.remove(\n              lineConsumer); // consumer is already closed, so we cannot write into it any more\n          if (lineConsumers.size() == 0) { // if all consumers are closed then we can close this one\n            isOpen = false;\n          }\n        } catch (IOException e) {\n          LOG.error(\n              String.format(\n                  \"An error occurred while writing line to the line consumer %s\", lineConsumer),\n              e);\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/ContentTypeGuesser.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport jakarta.ws.rs.core.MediaType;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URL;\nimport java.util.Properties;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Helps getting content type of file.\n *\n * @author andrew00x\n */\npublic class ContentTypeGuesser {\n  private static final Logger LOG = LoggerFactory.getLogger(ContentTypeGuesser.class);\n\n  private static String defaultContentType = MediaType.APPLICATION_OCTET_STREAM;\n\n  public static synchronized void setDefaultContentType(String myDefaultContentType) {\n    defaultContentType = myDefaultContentType;\n  }\n\n  public static synchronized String getDefaultContentType() {\n    return defaultContentType;\n  }\n\n  private static Properties properties = new Properties();\n\n  static {\n    final String filePath = System.getProperty(\"org.eclipse.che.content-types\");\n    URL resource = null;\n    if (filePath != null) {\n      resource = Thread.currentThread().getContextClassLoader().getResource(filePath);\n    }\n    if (resource == null) {\n      resource =\n          Thread.currentThread().getContextClassLoader().getResource(\"content-types.properties\");\n    }\n    if (resource != null) {\n      try (InputStream stream = resource.openStream()) {\n        properties.load(stream);\n        LOG.info(\"Successfully loaded content types from {}\", resource);\n      } catch (IOException e) {\n        LOG.error(e.getMessage(), e);\n      }\n    }\n  }\n\n  public static String guessContentType(java.io.File file) {\n    String contentType = null;\n    final String name = file.getName();\n    final int dot = name.lastIndexOf('.');\n    if (dot > 0) {\n      final String ext = name.substring(dot + 1);\n      if (!ext.isEmpty()) {\n        // by file extensions\n        contentType = properties.getProperty(ext);\n      }\n    }\n    if (contentType == null) {\n      // by full file name.\n      contentType = properties.getProperty(name);\n    }\n    /* Commented due to on Amazon infra with power instances. JVM crashes with multi-thread access (no problem with single thread).\n\n    *** glibc detected *** /usr/local/jdk/bin/java: double free or corruption (out): 0x00007f22f0007820 ***\n    ======= Backtrace: =========\n    /lib64/libc.so.6[0x3da68760e6]\n    /lib64/libc.so.6[0x3da6878c13]\n    /lib64/libglib-2.0.so.0(g_array_free+0x7a)[0x3da7c13dda]\n    /lib64/libgio-2.0.so.0[0x3da9c352f4]\n    /lib64/libgobject-2.0.so.0(g_object_unref+0x15f)[0x3da8c0dacf]\n    /usr/local/jdk1.7.0_17/jre/lib/amd64/libnio.so(Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGio+0xa2)[0x7f24aa7c7232]\n    [0x7f24d3186db1]\n\n    if (contentType == null) {\n        try {\n            // if content type is null use JDK.\n            contentType = java.nio.file.Files.probeContentType(file.toPath());\n        } catch (IOException e) {\n            LOG.warn(e.getMessage(), e);\n        }\n    }*/\n    return contentType == null ? getDefaultContentType() : contentType;\n  }\n\n  public static String guessContentType(String name) {\n    String contentType = null;\n    final int dot = name.lastIndexOf('.');\n    if (dot > 0) {\n      final String ext = name.substring(dot + 1);\n      if (!ext.isEmpty()) {\n        // by file extensions\n        contentType = properties.getProperty(ext);\n      }\n    }\n    if (contentType == null) {\n      // by full file name.\n      contentType = properties.getProperty(name);\n    }\n    return contentType == null ? getDefaultContentType() : contentType;\n  }\n\n  private ContentTypeGuesser() {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/DownloadPlugin.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.io.IOException;\n\n/**\n * Downloads remote file.\n *\n * @author andrew00x\n */\npublic interface DownloadPlugin {\n\n  interface Callback {\n    /**\n     * Notified when file downloaded.\n     *\n     * @param downloaded downloaded file\n     */\n    void done(java.io.File downloaded);\n\n    /**\n     * Notified when error occurs.\n     *\n     * @param e error\n     */\n    void error(IOException e);\n  }\n\n  /**\n   * Download file from specified location to local directory {@code downloadTo}.\n   *\n   * @param downloadUrl download URL\n   * @param downloadTo local directory for download\n   * @param callback notified when download is done or an error occurs\n   */\n  void download(String downloadUrl, java.io.File downloadTo, Callback callback);\n\n  /**\n   * Download file from specified location to local directory {@code downloadTo} and save it in file\n   * {@code fileName}.\n   *\n   * @param downloadUrl download URL\n   * @param downloadTo local directory for download\n   * @param fileName name of local file to save download result\n   * @param replaceExisting replace existed file with the same name\n   * @throws IOException if i/o error occurs when try download file or save it on local filesystem\n   */\n  void download(\n      String downloadUrl, java.io.File downloadTo, String fileName, boolean replaceExisting)\n      throws IOException;\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/ErrorFilteredConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport static org.eclipse.che.api.core.util.ErrorFilteredConsumer.ErrorIndicator.DEFAULT_ERROR_INDICATOR;\n\nimport java.io.IOException;\n\n/**\n * Consumes all output and redirect to another consumer only those lines which contain errors.\n *\n * @author Anatolii Bazko\n */\npublic class ErrorFilteredConsumer implements LineConsumer {\n\n  private final ErrorIndicator errorIndicator;\n  private final LineConsumer lineConsumer;\n\n  public ErrorFilteredConsumer(ErrorIndicator errorIndicator, LineConsumer lineConsumer) {\n    this.errorIndicator = errorIndicator;\n    this.lineConsumer = lineConsumer;\n  }\n\n  public ErrorFilteredConsumer(LineConsumer lineConsumer) {\n    this(DEFAULT_ERROR_INDICATOR, lineConsumer);\n  }\n\n  @Override\n  public void writeLine(String line) throws IOException {\n    if (errorIndicator.isError(line)) {\n      lineConsumer.writeLine(line);\n    }\n  }\n\n  @Override\n  public void close() throws IOException {\n    lineConsumer.close();\n  }\n\n  /** Indicates if line contains a error message. */\n  @FunctionalInterface\n  public interface ErrorIndicator {\n    boolean isError(String line);\n\n    ErrorIndicator DEFAULT_ERROR_INDICATOR = line -> line.startsWith(\"[STDERR]\");\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/FileCleaner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport com.google.inject.AbstractModule;\nimport jakarta.annotation.PreDestroy;\nimport java.io.File;\nimport java.util.HashSet;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentLinkedQueue;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.commons.lang.IoUtil;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Delete files and directories added with method {@link @addFile}. In environments with multiple\n * class loaders, {@code FileCleaner} should be stopped if it isn't needed. In Codenvy environment\n * {@code FileCleaner} is stopped automatically by {@link FileCleanerModule} otherwise need call\n * method {@link #stop()} manually.\n *\n * @author andrew00x\n */\npublic class FileCleaner {\n  private static final Logger LOG = LoggerFactory.getLogger(FileCleaner.class);\n\n  /** Number of attempts to delete file or directory before start write log error messages. */\n  static int logAfterAttempts = 10;\n\n  private static ScheduledExecutorService exec =\n      Executors.newSingleThreadScheduledExecutor(\n          new ThreadFactoryBuilder()\n              .setNameFormat(\"FileCleaner\")\n              .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n              .setDaemon(true)\n              .build());\n\n  static {\n    exec.scheduleAtFixedRate(\n        new Runnable() {\n          @Override\n          public void run() {\n            clean();\n          }\n        },\n        30,\n        30,\n        TimeUnit.SECONDS);\n  }\n\n  private static ConcurrentLinkedQueue<Pair<File, Integer>> files = new ConcurrentLinkedQueue<>();\n\n  /** Registers new file or directory in FileCleaner. */\n  public static void addFile(File file) {\n    files.offer(Pair.of(file, 0));\n  }\n\n  /** Stops FileCleaner. */\n  public static void stop() {\n    exec.shutdownNow();\n    try {\n      exec.awaitTermination(3, TimeUnit.SECONDS);\n    } catch (InterruptedException ignored) {\n    }\n    clean();\n    files.clear();\n    LOG.info(\"File cleaner is stopped\");\n  }\n\n  private static void clean() {\n    Pair<File, Integer> pair;\n    final Set<Pair<File, Integer>> failToDelete = new HashSet<>();\n    while ((pair = files.poll()) != null) {\n      final File file = pair.first;\n      int deleteAttempts = pair.second;\n      if (file.exists()) {\n        if (!IoUtil.deleteRecursive(file)) {\n          failToDelete.add(Pair.of(file, ++deleteAttempts));\n          if (deleteAttempts > logAfterAttempts) {\n            LOG.error(\"Unable to delete file '{}' after {} tries\", file, deleteAttempts);\n          }\n        } else if (LOG.isDebugEnabled()) {\n          LOG.debug(\"Deleted file '{}'\", file);\n        }\n      }\n    }\n    if (!failToDelete.isEmpty()) {\n      files.addAll(failToDelete);\n    }\n  }\n\n  /** Guice module that stops FileCleaner when Guice container destroyed. */\n  public static class FileCleanerModule extends AbstractModule {\n    @Override\n    protected void configure() {\n      bind(Finalizer.class).asEagerSingleton();\n    }\n  }\n\n  /** Helper component that stops FileCleaner. */\n  static class Finalizer {\n    @PreDestroy\n    void stop() {\n      FileCleaner.stop();\n    }\n  }\n\n  private FileCleaner() {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/FileLineConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.nio.charset.Charset;\nimport java.nio.file.Files;\nimport org.eclipse.che.api.core.util.lineconsumer.ConsumerAlreadyClosedException;\n\n/**\n * Consumes logs and writes them into file. <br>\n * This class is not thread safe. Also see multithreaded implementation {@link\n * org.eclipse.che.api.core.util.lineconsumer.ConcurrentFileLineConsumer}\n *\n * @author andrew00x\n * @author Mykola Morhun\n */\npublic class FileLineConsumer implements LineConsumer {\n  private final File file;\n  private final Writer writer;\n\n  private boolean isOpen;\n\n  public FileLineConsumer(File file) throws IOException {\n    this.file = file;\n    writer = Files.newBufferedWriter(file.toPath(), Charset.defaultCharset());\n    isOpen = true;\n  }\n\n  public File getFile() {\n    return file;\n  }\n\n  @Override\n  public void writeLine(String line) throws IOException {\n    if (isOpen) {\n      try {\n        if (line != null) {\n          writer.write(line);\n        }\n        writer.write('\\n');\n        writer.flush();\n      } catch (IOException e) {\n        if (\"Stream closed\".equals(e.getMessage())) {\n          throw new ConsumerAlreadyClosedException(e.getMessage());\n        }\n        throw e;\n      }\n    }\n  }\n\n  @Override\n  public void close() throws IOException {\n    if (isOpen) {\n      isOpen = false;\n      writer.close();\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/HttpDownloadPlugin.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport jakarta.ws.rs.core.HttpHeaders;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.nio.file.Files;\nimport java.nio.file.StandardCopyOption;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * DownloadPlugin that downloads single file.\n *\n * @author andrew00x\n */\npublic final class HttpDownloadPlugin implements DownloadPlugin {\n  private static final Logger LOG = LoggerFactory.getLogger(HttpDownloadPlugin.class);\n\n  private static final int CONNECT_TIMEOUT = (int) TimeUnit.MINUTES.toMillis(3);\n  private static final int READ_TIMEOUT = (int) TimeUnit.MINUTES.toMillis(3);\n\n  @Override\n  public void download(String downloadUrl, java.io.File downloadTo, Callback callback) {\n    HttpURLConnection conn = null;\n    try {\n      conn = (HttpURLConnection) new URL(downloadUrl).openConnection();\n      conn.setConnectTimeout(CONNECT_TIMEOUT);\n      conn.setReadTimeout(READ_TIMEOUT);\n      final int responseCode = conn.getResponseCode();\n      if (responseCode != 200) {\n        throw new IOException(\n            String.format(\"Invalid response status %d from remote server. \", responseCode));\n      }\n      final String contentDisposition = conn.getHeaderField(HttpHeaders.CONTENT_DISPOSITION);\n      String fileName = null;\n      if (contentDisposition != null) {\n        int fNameStart = contentDisposition.indexOf(\"filename=\");\n        if (fNameStart > 0) {\n          int fNameEnd = contentDisposition.indexOf(';', fNameStart + 1);\n          if (fNameEnd < 0) {\n            fNameEnd = contentDisposition.length();\n          }\n          fileName = contentDisposition.substring(fNameStart, fNameEnd).split(\"=\")[1];\n          if (fileName.charAt(0) == '\"' && fileName.charAt(fileName.length() - 1) == '\"') {\n            fileName = fileName.substring(1, fileName.length() - 1);\n          }\n        }\n      }\n      final java.io.File downloadFile =\n          new java.io.File(\n              downloadTo,\n              fileName == null ? NameGenerator.generate(\"downloaded.file\", 4) : fileName);\n      try (InputStream in = conn.getInputStream()) {\n        Files.copy(in, downloadFile.toPath());\n      }\n      callback.done(downloadFile);\n    } catch (IOException e) {\n      LOG.debug(String.format(\"Failed access: %s, error: %s\", downloadUrl, e.getMessage()), e);\n      callback.error(e);\n    } finally {\n      if (conn != null) {\n        conn.disconnect();\n      }\n    }\n  }\n\n  @Override\n  public void download(\n      String downloadUrl, java.io.File downloadTo, String fileName, boolean replaceExisting)\n      throws IOException {\n    HttpURLConnection conn = null;\n    try {\n      conn = (HttpURLConnection) new URL(downloadUrl).openConnection();\n      conn.setConnectTimeout(CONNECT_TIMEOUT);\n      conn.setReadTimeout(READ_TIMEOUT);\n      final int responseCode = conn.getResponseCode();\n      if (responseCode != 200) {\n        throw new IOException(\n            String.format(\"Invalid response status %d from remote server. \", responseCode));\n      }\n      final java.io.File downloadFile = new java.io.File(downloadTo, fileName);\n      try (InputStream in = conn.getInputStream()) {\n        if (replaceExisting) {\n          Files.copy(in, downloadFile.toPath(), StandardCopyOption.REPLACE_EXISTING);\n        } else {\n          Files.copy(in, downloadFile.toPath());\n        }\n      }\n    } finally {\n      if (conn != null) {\n        conn.disconnect();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/IndentWrapperLineConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.io.IOException;\n\n/**\n * Line consumer for adding system indent in the end of the line\n *\n * @author Andrienko Alexander\n */\npublic class IndentWrapperLineConsumer implements LineConsumer {\n\n  private final LineConsumer lineConsumer;\n\n  public IndentWrapperLineConsumer(LineConsumer lineConsumer) {\n    this.lineConsumer = lineConsumer;\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public void writeLine(String line) throws IOException {\n    lineConsumer.writeLine(line + System.lineSeparator());\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public void close() throws IOException {\n    lineConsumer.close();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/JsonRpcEndpointIdProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.util.Set;\n\npublic interface JsonRpcEndpointIdProvider {\n  Set<String> get();\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/JsonRpcEndpointIdsHolder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport static com.google.common.collect.Sets.newConcurrentHashSet;\nimport static java.util.Collections.emptySet;\nimport static java.util.stream.Collectors.toSet;\n\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentHashMap;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerConfigurator;\n\n@Singleton\npublic class JsonRpcEndpointIdsHolder {\n  private final Map<String, Set<String>> endpointIds = new ConcurrentHashMap<>();\n\n  @Inject\n  private void configureSubscribeHandler(RequestHandlerConfigurator configurator) {\n    configurator\n        .newConfiguration()\n        .methodName(\"event:ws-agent-output:subscribe\")\n        .paramsAsString()\n        .noResult()\n        .withBiConsumer(\n            (endpointId, workspaceId) -> {\n              endpointIds.putIfAbsent(endpointId, newConcurrentHashSet());\n              endpointIds.get(endpointId).add(workspaceId);\n            });\n  }\n\n  @Inject\n  private void configureUnSubscribeHandler(RequestHandlerConfigurator configurator) {\n    configurator\n        .newConfiguration()\n        .methodName(\"event:ws-agent-output:un-subscribe\")\n        .paramsAsString()\n        .noResult()\n        .withBiConsumer(\n            (endpointId, workspaceId) -> {\n              endpointIds.getOrDefault(endpointId, emptySet()).remove(workspaceId);\n              endpointIds.entrySet().removeIf(entry -> entry.getValue().isEmpty());\n            });\n  }\n\n  public Set<String> getEndpointIdsByWorkspaceId(String workspaceId) {\n    return endpointIds.entrySet().stream()\n        .filter(it -> it.getValue().contains(workspaceId))\n        .map(Map.Entry::getKey)\n        .collect(toSet());\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/JsonRpcEndpointToMachineNameHolder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport static com.google.common.collect.Sets.newConcurrentHashSet;\nimport static java.util.Collections.emptySet;\nimport static java.util.stream.Collectors.toSet;\n\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentHashMap;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerConfigurator;\n\n@Singleton\npublic class JsonRpcEndpointToMachineNameHolder {\n  private final Map<String, Set<String>> endpointIds = new ConcurrentHashMap<>();\n\n  @Inject\n  private void configureSubscribeHandler(RequestHandlerConfigurator configurator) {\n    configurator\n        .newConfiguration()\n        .methodName(\"event:environment-output:subscribe-by-machine-name\")\n        .paramsAsString()\n        .noResult()\n        .withBiConsumer(\n            (endpointId, workspaceIdPlusMachineName) -> {\n              endpointIds.putIfAbsent(endpointId, newConcurrentHashSet());\n              endpointIds.get(endpointId).add(workspaceIdPlusMachineName);\n            });\n  }\n\n  @Inject\n  private void configureUnSubscribeHandler(RequestHandlerConfigurator configurator) {\n    configurator\n        .newConfiguration()\n        .methodName(\"event:environment-output:un-subscribe-by-machine-name\")\n        .paramsAsString()\n        .noResult()\n        .withBiConsumer(\n            (endpointId, workspaceIdPlusMachineName) -> {\n              endpointIds.getOrDefault(endpointId, emptySet()).remove(workspaceIdPlusMachineName);\n              endpointIds.entrySet().removeIf(entry -> entry.getValue().isEmpty());\n            });\n  }\n\n  public Set<String> getEndpointIdsByWorkspaceIdPlusMachineName(String workspaceIdPlusMachineName) {\n    return endpointIds.entrySet().stream()\n        .filter(it -> it.getValue().contains(workspaceIdPlusMachineName))\n        .map(Map.Entry::getKey)\n        .collect(toSet());\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/JsonRpcLineConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.io.IOException;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter;\nimport org.slf4j.Logger;\n\npublic class JsonRpcLineConsumer implements LineConsumer {\n  private static final Logger LOG = getLogger(JsonRpcLineConsumer.class);\n\n  private final String method;\n  private final RequestTransmitter transmitter;\n  private final JsonRpcEndpointIdProvider jsonRpcEndpointIdProvider;\n\n  public JsonRpcLineConsumer(\n      RequestTransmitter transmitter,\n      String method,\n      JsonRpcEndpointIdProvider jsonRpcEndpointIdProvider) {\n    this.method = method;\n    this.transmitter = transmitter;\n    this.jsonRpcEndpointIdProvider = jsonRpcEndpointIdProvider;\n  }\n\n  @Override\n  public void writeLine(String line) throws IOException {\n    try {\n      jsonRpcEndpointIdProvider\n          .get()\n          .forEach(\n              it ->\n                  transmitter\n                      .newRequest()\n                      .endpointId(it)\n                      .methodName(method)\n                      .paramsAsString(line)\n                      .sendAndSkipResult());\n    } catch (IllegalStateException e) {\n      LOG.error(\"Error trying to send a line: {}\", line);\n    }\n  }\n\n  @Override\n  public void close() throws IOException {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/JsonRpcMessageConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.io.IOException;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter;\nimport org.slf4j.Logger;\n\npublic class JsonRpcMessageConsumer<T> implements MessageConsumer<T> {\n  private static final Logger LOG = getLogger(JsonRpcMessageConsumer.class);\n\n  private final String method;\n  private final RequestTransmitter transmitter;\n  private final JsonRpcEndpointIdProvider jsonRpcEndpointIdProvider;\n\n  public JsonRpcMessageConsumer(\n      String method,\n      RequestTransmitter transmitter,\n      JsonRpcEndpointIdProvider jsonRpcEndpointIdProvider) {\n    this.method = method;\n    this.transmitter = transmitter;\n    this.jsonRpcEndpointIdProvider = jsonRpcEndpointIdProvider;\n  }\n\n  @Override\n  public void consume(T message) throws IOException {\n    try {\n      jsonRpcEndpointIdProvider\n          .get()\n          .forEach(\n              it ->\n                  transmitter\n                      .newRequest()\n                      .endpointId(it)\n                      .methodName(method)\n                      .paramsAsDto(message)\n                      .sendAndSkipResult());\n    } catch (IllegalStateException e) {\n      LOG.error(\"Error trying send line {}\", message);\n    }\n  }\n\n  @Override\n  public void close() throws IOException {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/LineConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.io.Closeable;\nimport java.io.IOException;\n\n/**\n * Consumes text line by line for analysing, writing, storing, etc.\n *\n * @author andrew00x\n * @see AbstractLineConsumer\n */\npublic interface LineConsumer extends Closeable {\n  /** Consumes single line. */\n  void writeLine(String line) throws IOException;\n\n  LineConsumer DEV_NULL = new AbstractLineConsumer() {};\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/LineConsumerFactory.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\n/** A factory for {@link LineConsumer} */\n@FunctionalInterface\npublic interface LineConsumerFactory {\n\n  LineConsumer newLineConsumer();\n\n  LineConsumerFactory NULL = () -> LineConsumer.DEV_NULL;\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/LinksHelper.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.util.LinkedList;\nimport java.util.List;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.core.rest.shared.dto.LinkParameter;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * @author andrew00x\n */\npublic class LinksHelper {\n\n  public static Link createLink(\n      String method,\n      String href,\n      String consumes,\n      String produces,\n      String rel,\n      LinkParameter... params) {\n    List<LinkParameter> l = null;\n    if (params != null && params.length > 0) {\n      l = new LinkedList<>();\n      java.util.Collections.addAll(l, params);\n    }\n    return createLink(method, href, consumes, produces, rel, l);\n  }\n\n  public static Link createLink(\n      String method,\n      String href,\n      String consumes,\n      String produces,\n      String rel,\n      List<LinkParameter> params) {\n    return DtoFactory.getInstance()\n        .createDto(Link.class)\n        .withMethod(method)\n        .withHref(href)\n        .withConsumes(consumes)\n        .withProduces(produces)\n        .withRel(rel)\n        .withParameters(params);\n  }\n\n  public static Link createLink(\n      String method, String href, String consumes, String produces, String rel) {\n    return DtoFactory.getInstance()\n        .createDto(Link.class)\n        .withMethod(method)\n        .withHref(href)\n        .withConsumes(consumes)\n        .withProduces(produces)\n        .withRel(rel);\n  }\n\n  public static Link createLink(String method, String href, String produces, String rel) {\n    return DtoFactory.getInstance()\n        .createDto(Link.class)\n        .withMethod(method)\n        .withHref(href)\n        .withProduces(produces)\n        .withRel(rel);\n  }\n\n  public static Link createLink(String method, String href, String rel) {\n    return DtoFactory.getInstance()\n        .createDto(Link.class)\n        .withMethod(method)\n        .withHref(href)\n        .withRel(rel);\n  }\n\n  public static Link createLink(\n      String method, String href, String rel, List<LinkParameter> params) {\n    return DtoFactory.getInstance()\n        .createDto(Link.class)\n        .withMethod(method)\n        .withHref(href)\n        .withRel(rel)\n        .withParameters(params);\n  }\n\n  private LinksHelper() {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/ListLineConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.util.LinkedList;\nimport java.util.List;\n\n/**\n * Implementation of line consumer that stores in the list strings that are passed with method\n * {@link #writeLine}.\n *\n * <p>Implementation is not threadsafe and requires external synchronization if is used in\n * multi-thread environment.\n *\n * @author andrew00x\n */\npublic class ListLineConsumer implements LineConsumer {\n  protected final LinkedList<String> lines;\n\n  public ListLineConsumer() {\n    lines = new LinkedList<>();\n  }\n\n  @Override\n  public void writeLine(String line) {\n    lines.add(line);\n  }\n\n  @Override\n  public void close() {}\n\n  public void clear() {\n    lines.clear();\n  }\n\n  public List<String> getLines() {\n    return new LinkedList<>(lines);\n  }\n\n  public String getText() {\n    if (lines.isEmpty()) {\n      return \"\";\n    }\n    final StringBuilder output = new StringBuilder();\n    int n = 0;\n    for (String line : lines) {\n      if (n > 0) {\n        output.append('\\n');\n      }\n      output.append(line);\n      n++;\n    }\n    return output.toString();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/MessageConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.io.Closeable;\nimport java.io.IOException;\n\n/**\n * Consumes messages one by one for analysing, writing, storing, etc.\n *\n * @author Alexander Garagatyi\n */\npublic interface MessageConsumer<T> extends Closeable {\n  void consume(T message) throws IOException;\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/PagingUtil.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyMap;\nimport static java.util.Objects.requireNonNull;\nimport static java.util.stream.Collectors.joining;\n\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * Provides useful methods for working with {@link Page} instances and pageable uris management.\n *\n * @author Yevhenii Voevodin\n */\npublic final class PagingUtil {\n\n  private static final String LINK_HEADER_SEPARATOR = \", \";\n\n  /**\n   * Helps to retrieve href along with rel from link header value part. Value format is {@literal\n   * <http://host:port/path?query=value>; rel=\"next\"}, so the first group is href while the second\n   * group is rel.\n   */\n  private static final Pattern LINK_HEADER_REGEX =\n      Pattern.compile(\"<(?<href>.+)>;.*rel=\\\"(?<rel>.+)\\\".*\");\n\n  /**\n   * Generates link header value from the page object and base uri. <a\n   * href=\"https://tools.ietf.org/html/rfc5988\">The Link header spec</a>\n   *\n   * @param page the page used to generate link\n   * @param uri the uri which is used for adding {@code skipCount} & {@code maxItems} query\n   *     parameters\n   * @return 'Link' header value\n   * @throws NullPointerException when either {@code page} or {@code uri} is null\n   */\n  public static String createLinkHeader(Page<?> page, URI uri) {\n    requireNonNull(page, \"Required non-null page\");\n    requireNonNull(uri, \"Required non-null uri\");\n    final ArrayList<Pair<String, Page.PageRef>> pageRefs = new ArrayList<>(4);\n    pageRefs.add(Pair.of(\"first\", page.getFirstPageRef()));\n    pageRefs.add(Pair.of(\"last\", page.getLastPageRef()));\n    if (page.hasPreviousPage()) {\n      pageRefs.add(Pair.of(\"prev\", page.getPreviousPageRef()));\n    }\n    if (page.hasNextPage()) {\n      pageRefs.add(Pair.of(\"next\", page.getNextPageRef()));\n    }\n    final UriBuilder ub = UriBuilder.fromUri(uri);\n    return pageRefs.stream()\n        .map(\n            refPair ->\n                format(\n                    \"<%s>; rel=\\\"%s\\\"\",\n                    ub.clone()\n                        .replaceQueryParam(\"skipCount\", refPair.second.getItemsBefore())\n                        .replaceQueryParam(\"maxItems\", refPair.second.getPageSize())\n                        .build()\n                        .toString(),\n                    refPair.first))\n        .collect(joining(LINK_HEADER_SEPARATOR));\n  }\n\n  /**\n   * Returns REL to URI map based on the given {@code linkHeader} value. If the {@code linkHeader}\n   * is null or empty then an empty map will be returned.\n   *\n   * <p>Note that link header is parsed due to the {@link #createLinkHeader(Page, URI)} method\n   * strategy.\n   *\n   * @param linkHeader link header value\n   */\n  public static Map<String, String> parseLinkHeader(String linkHeader) {\n    if (isNullOrEmpty(linkHeader)) {\n      return emptyMap();\n    }\n    final Map<String, String> res = new HashMap<>();\n    for (String part : linkHeader.split(LINK_HEADER_SEPARATOR)) {\n      final Matcher matcher = LINK_HEADER_REGEX.matcher(part);\n      if (matcher.matches()) {\n        res.put(matcher.group(\"rel\"), matcher.group(\"href\"));\n      }\n    }\n    return res;\n  }\n\n  private PagingUtil() {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/RateExceedDetector.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Rate exceed detector. It used to detect exceeding of rate of some operation. If rate is exceeded\n * then method {@link #updateAndCheckRate()} returns {@code true}. A {@code RateExceedDetector} gets\n * max allowed permits per seconds in constructor, then it checks that required time have elapsed\n * between two calls of method {@link #updateAndCheckRate()}.\n *\n * <p>Implementation is not threadsafe and required external synchronization if it's used in\n * multi-thread environment. An example that prints on stdout if rate exceed 5 per seconds limit:\n *\n * <pre>{@code\n * final RateExceedDetector r = new RateExceedDetector(5);\n *\n * void doSomething() {\n *     if (r.updateAndCheckRate()) {\n *         // do something useful\n *     } else {\n *         System.out.printf(\"Max rate exceeded, rate: %f 1/s%n\", r.getRate());\n *     }\n * }\n *\n * }</pre>\n */\npublic class RateExceedDetector {\n  private final long intervalMicros;\n  private final long reportTimeMicros;\n  private final long rateTime;\n\n  private long count;\n  private long lastMicros;\n  private double rate;\n\n  private long threshold;\n\n  public RateExceedDetector(double permits) {\n    intervalMicros = (long) (TimeUnit.SECONDS.toMicros(1L) / permits);\n    reportTimeMicros = TimeUnit.SECONDS.toMicros(1);\n    lastMicros = TimeUnit.NANOSECONDS.toMicros(System.nanoTime());\n    rateTime = 1L;\n  }\n\n  /**\n   * Update rate and check is max allowed rate exceeded.\n   *\n   * @return {@code true} if max allowed rate is exceeded and {@code false} otherwise. If this\n   *     method return {@code true} typically need check average rate with method {@link\n   *     #getRate()}. In some cases it is possible to have smaller then expected interval between\n   *     two calls of this method but average rate may be under allowed limit.\n   */\n  public boolean updateAndCheckRate() {\n    final long nowTimeMicros = TimeUnit.NANOSECONDS.toMicros(System.nanoTime());\n    final boolean exceed = (nowTimeMicros - threshold) < 0;\n    threshold = nowTimeMicros + intervalMicros;\n    countRate(nowTimeMicros);\n    return exceed;\n  }\n\n  private void countRate(long nowTimeMicros) {\n    if (lastMicros + reportTimeMicros < nowTimeMicros) {\n      rate = count / rateTime;\n      lastMicros = nowTimeMicros;\n      count = 0;\n    }\n    count++;\n  }\n\n  /** Get average rate of calls method {@link #updateAndCheckRate()}. */\n  public double getRate() {\n    return rate;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/ShellFactory.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\n/**\n * @author andrew00x\n */\npublic class ShellFactory {\n\n  public static Shell getShell() {\n    if (SystemInfo.isUnix()) {\n      return new StandardLinuxShell();\n    }\n    if (SystemInfo.isWindows()) {\n      return new StandardWindowsShell();\n    }\n    throw new IllegalStateException(\"Unsupported OS\");\n  }\n\n  /** Creates command line to run system command from set of arguments. */\n  public static interface Shell {\n    String[] createShellCommand(CommandLine args);\n  }\n\n  /** Creates command line for standard command language interpreter. */\n  public static class StandardLinuxShell implements Shell {\n\n    @Override\n    public String[] createShellCommand(CommandLine args) {\n      final String[] array = args.asArray();\n      if (array.length == 0) {\n        throw new IllegalArgumentException(\"Command line is empty\");\n      }\n      StringBuilder buff = new StringBuilder();\n      for (String str : array) {\n        if (!str.isEmpty()) {\n          if (buff.length() > 0) {\n            buff.append(' ');\n          }\n          for (int i = 0, len = str.length(); i < len; i++) {\n            char c = str.charAt(i);\n            switch (c) {\n              case ' ':\n              case '|':\n              case '>':\n              case '$':\n              case '\"':\n              case '\\'':\n              case '&':\n              case '(':\n              case ')':\n              case '~':\n              case '@':\n              case '#':\n              case '%':\n              case '!':\n              case '^':\n              case '*':\n                buff.append('\\\\');\n                buff.append(c);\n                break;\n              case '\\n':\n                buff.append('\\\\');\n                buff.append('n');\n                break;\n              case '\\r':\n                buff.append('\\\\');\n                buff.append('r');\n                break;\n              case '\\t':\n                buff.append('\\\\');\n                buff.append('t');\n                break;\n              case '\\b':\n                buff.append('\\\\');\n                buff.append('b');\n                break;\n              case '\\f':\n                buff.append('\\\\');\n                buff.append('f');\n                break;\n              default:\n                buff.append(c);\n                break;\n            }\n          }\n        }\n      }\n\n      final String[] line = new String[3];\n      line[0] = \"/bin/bash\";\n      line[1] = \"-cl\";\n      line[2] = buff.toString();\n      return line;\n    }\n  }\n\n  public static class StandardWindowsShell implements Shell {\n\n    @Override\n    public String[] createShellCommand(CommandLine args) {\n      final String[] array = args.asArray();\n      if (array.length == 0) {\n        throw new IllegalArgumentException(\"Command line is empty\");\n      }\n      StringBuilder buff = new StringBuilder();\n      for (String str : array) {\n        if (!str.isEmpty()) {\n          if (buff.length() > 0) {\n            buff.append(' ');\n          }\n          for (int i = 0, len = str.length(); i < len; i++) {\n            char c = str.charAt(i);\n            switch (c) {\n              case '|':\n              case '\\'':\n              case '`':\n              case '&':\n              case ',':\n              case ';':\n              case '(':\n              case ')':\n              case '^':\n              case '*':\n                buff.append('^');\n                buff.append(c);\n                break;\n              default:\n                buff.append(c);\n                break;\n            }\n          }\n        }\n      }\n\n      final String[] line = new String[3];\n      line[0] = \"cmd.exe\";\n      line[1] = \"/c\";\n      line[2] = buff.toString();\n      return line;\n    }\n  }\n\n  private ShellFactory() {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/StreamPump.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\n\n/**\n * @author andrew00x\n */\npublic final class StreamPump implements Runnable {\n\n  private BufferedReader bufferedReader;\n  private LineConsumer lineConsumer;\n\n  private Exception exception;\n  private boolean done;\n\n  public synchronized void start(Process process, LineConsumer lineConsumer) {\n    this.lineConsumer = lineConsumer;\n    bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));\n    final Thread t = new Thread(this, \"StreamPump\");\n    t.setDaemon(true);\n    t.start();\n  }\n\n  public synchronized void stop() {\n    // Not clear do we need close original stream, but since it was wrapped by BufferedReader close\n    // it anyway.\n    try {\n      bufferedReader.close();\n    } catch (IOException ignored) {\n    }\n  }\n\n  public synchronized void await() throws InterruptedException {\n    while (!done) {\n      wait();\n    }\n  }\n\n  public synchronized boolean isDone() {\n    return done;\n  }\n\n  public boolean hasError() {\n    return null != exception;\n  }\n\n  public Exception getException() {\n    return exception;\n  }\n\n  @Override\n  public void run() {\n    String line;\n    try {\n      while ((line = bufferedReader.readLine()) != null) {\n        lineConsumer.writeLine(line);\n      }\n    } catch (IOException e) {\n      exception = e;\n    } finally {\n      synchronized (this) {\n        done = true;\n        notifyAll();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/SystemInfo.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Provides information about operating system.\n *\n * @author <a href=\"mailto:aparfonov@codenvy.com\">Andrey Parfonov</a>\n */\npublic class SystemInfo {\n  private static final Logger LOG = LoggerFactory.getLogger(SystemInfo.class);\n\n  public static final String OS = System.getProperty(\"os.name\").toLowerCase();\n  private static final boolean linux = OS.startsWith(\"linux\");\n  private static final boolean mac = OS.startsWith(\"mac\");\n  private static final boolean windows = OS.startsWith(\"windows\");\n  private static final boolean unix = !windows;\n\n  public static boolean isLinux() {\n    return linux;\n  }\n\n  public static boolean isWindows() {\n    return windows;\n  }\n\n  public static boolean isMacOS() {\n    return mac;\n  }\n\n  public static boolean isUnix() {\n    return unix;\n  }\n\n  private SystemInfo() {}\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/ValueHolder.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\n/**\n * Holder for a value of type <code>T</code>.\n *\n * @author andrew00x\n */\npublic final class ValueHolder<T> {\n  private T value;\n\n  public ValueHolder(T value) {\n    this.value = value;\n  }\n\n  public ValueHolder() {}\n\n  public synchronized T get() {\n    return value;\n  }\n\n  public synchronized void set(T value) {\n    this.value = value;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/Watchdog.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.util.concurrent.TimeUnit;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * It controls the time of {@code Cancellable} invocation and if time if greater than timeout it\n * terminates such {@code Cancellable}.\n *\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n */\npublic final class Watchdog implements Runnable {\n  private static final Logger LOG = LoggerFactory.getLogger(Watchdog.class);\n\n  private final String name;\n  private final long timeout;\n\n  private boolean watch;\n  private Cancellable cancellable;\n\n  /**\n   * Create new {@code Watchdog}.\n   *\n   * @param name name for background {@code Thread}. It helps to identify out threads. This\n   *     parameter is optional and may be {@code null}.\n   * @param timeout timeout\n   * @param unit timeout unit\n   */\n  public Watchdog(String name, long timeout, TimeUnit unit) {\n    this.name = name;\n    if (timeout < 1) {\n      throw new IllegalArgumentException(String.format(\"Invalid timeout: %d\", timeout));\n    }\n    this.timeout = unit.toMillis(timeout);\n  }\n\n  public Watchdog(long timeout, TimeUnit unit) {\n    this(null, timeout, unit);\n  }\n\n  /**\n   * Start watching {@code Cancellable}.\n   *\n   * @param cancellable Cancellable\n   */\n  public synchronized void start(Cancellable cancellable) {\n    this.cancellable = cancellable;\n    this.watch = true;\n    final Thread t = name == null ? new Thread(this) : new Thread(this, name);\n    t.setDaemon(true);\n    t.start();\n  }\n\n  /** Stop watching. */\n  public synchronized void stop() {\n    watch = false;\n    notify();\n  }\n\n  /** NOTE: Not expected to call directly by regular users of this class. */\n  public synchronized void run() {\n    final long end = System.currentTimeMillis() + timeout;\n    long now;\n    while (watch && (end > (now = System.currentTimeMillis()))) {\n      try {\n        wait(end - now);\n      } catch (InterruptedException ignored) {\n        // Not expected to be thrown\n      }\n    }\n    if (watch) {\n      try {\n        cancellable.cancel();\n      } catch (Exception e) {\n        LOG.error(e.getMessage(), e);\n      }\n      watch = false;\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/WritableLineConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.io.IOException;\nimport java.io.Writer;\n\n/**\n * Line consumer that consume lines to provided Writer.\n *\n * @author Sergii Kabashniuk\n */\npublic class WritableLineConsumer implements LineConsumer {\n\n  private final Writer writer;\n\n  public WritableLineConsumer(Writer writer) {\n    this.writer = writer;\n  }\n\n  @Override\n  public void writeLine(String line) throws IOException {\n    writer.write(line);\n  }\n\n  @Override\n  public void close() throws IOException {\n    writer.close();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/lineconsumer/ConcurrentCompositeLineConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util.lineconsumer;\n\nimport java.io.IOException;\nimport java.nio.channels.ClosedByInterruptException;\nimport java.util.List;\nimport java.util.concurrent.CopyOnWriteArrayList;\nimport java.util.concurrent.locks.ReentrantReadWriteLock;\nimport org.eclipse.che.api.core.util.LineConsumer;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * This line consumer consists of several consumers and copies each consumed line into all\n * subconsumers. Is used when lines should be written into two or more consumers. This\n * implementation is thread safe.\n *\n * @author andrew00x\n * @author Mykola Morhun\n */\npublic class ConcurrentCompositeLineConsumer implements LineConsumer {\n  private static final Logger LOG = LoggerFactory.getLogger(ConcurrentCompositeLineConsumer.class);\n\n  private final List<LineConsumer> lineConsumers;\n  private final ReentrantReadWriteLock lock;\n\n  private volatile boolean isOpen;\n\n  public ConcurrentCompositeLineConsumer(LineConsumer... lineConsumers) {\n    this.lineConsumers = new CopyOnWriteArrayList<>(lineConsumers);\n    this.lock = new ReentrantReadWriteLock();\n    this.isOpen = true;\n  }\n\n  public boolean isOpen() {\n    return isOpen;\n  }\n\n  /** Closes all unclosed subconsumers. */\n  @Override\n  public void close() {\n    if (isOpen) {\n      lock.writeLock().lock();\n      try {\n        isOpen = false;\n        for (LineConsumer lineConsumer : lineConsumers) {\n          try {\n            lineConsumer.close();\n          } catch (IOException e) {\n            LOG.error(\n                String.format(\"An error occurred while closing the line consumer %s\", lineConsumer),\n                e);\n          }\n        }\n      } finally {\n        lock.writeLock().unlock();\n      }\n    }\n  }\n\n  /**\n   * Writes given line to each subconsumer. Do nothing if this consumer is closed or all\n   * subconsumers are closed.\n   *\n   * @param line line to write\n   */\n  @Override\n  public void writeLine(String line) {\n    if (isOpen && lock.readLock().tryLock()) {\n      try {\n        for (LineConsumer lineConsumer : lineConsumers) {\n          try {\n            lineConsumer.writeLine(line);\n          } catch (ConsumerAlreadyClosedException | ClosedByInterruptException e) {\n            lineConsumers.remove(\n                lineConsumer); // consumer is already closed, so we cannot write into it any more\n            if (lineConsumers.size()\n                == 0) { // if all consumers are closed then we can close this one\n              isOpen = false;\n            }\n          } catch (IOException e) {\n            LOG.error(\n                String.format(\n                    \"An error occurred while writing line to the line consumer %s\", lineConsumer),\n                e);\n          }\n        }\n      } finally {\n        lock.readLock().unlock();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/lineconsumer/ConcurrentFileLineConsumer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util.lineconsumer;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.nio.charset.Charset;\nimport java.nio.file.Files;\nimport java.util.concurrent.locks.ReentrantReadWriteLock;\nimport org.eclipse.che.api.core.util.LineConsumer;\n\n/**\n * Consumes logs and writes them into file. This implementation is thread safe.\n *\n * @author andrew00x\n * @author Mykola Morhun\n */\npublic class ConcurrentFileLineConsumer implements LineConsumer {\n  private final File file;\n  private final Writer writer;\n  private final ReentrantReadWriteLock lock;\n\n  private volatile boolean isOpen;\n\n  public ConcurrentFileLineConsumer(File file) throws IOException {\n    this.file = file;\n    writer = Files.newBufferedWriter(file.toPath(), Charset.defaultCharset());\n    isOpen = true;\n    lock = new ReentrantReadWriteLock();\n  }\n\n  public File getFile() {\n    return file;\n  }\n\n  public boolean isOpen() {\n    return isOpen;\n  }\n\n  @Override\n  public void writeLine(String line) throws IOException {\n    if (isOpen && lock.readLock().tryLock()) {\n      try {\n        if (line != null) {\n          writer.write(line);\n        }\n        writer.write('\\n');\n        writer.flush();\n      } catch (IOException e) {\n        if (\"Stream closed\".equals(e.getMessage())) {\n          throw new ConsumerAlreadyClosedException(e.getMessage());\n        }\n        throw e;\n      } finally {\n        lock.readLock().unlock();\n      }\n    }\n  }\n\n  @Override\n  public void close() throws IOException {\n    if (isOpen) {\n      lock.writeLock().lock();\n      try {\n        isOpen = false;\n        writer.close();\n      } finally {\n        lock.writeLock().unlock();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/lineconsumer/ConsumerAlreadyClosedException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util.lineconsumer;\n\nimport java.io.IOException;\n\n/**\n * Is thrown as result of attempt to write a line into closed line consumer.\n *\n * @author Mykola Morhun\n */\npublic class ConsumerAlreadyClosedException extends IOException {\n  public ConsumerAlreadyClosedException(String message) {\n    super(message);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/websocket/commons/WebSocketMessageReceiver.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.websocket.commons;\n\n/**\n * Used as entry point for a web socket protocol message consumers.\n *\n * @author Dmitry Kuleshov\n */\npublic interface WebSocketMessageReceiver {\n  /**\n   * Receives a message by a a web socket protocol.\n   *\n   * @param endpointId identifier of an endpoint known to an transmitter implementation\n   * @param message plain text message\n   */\n  void receive(String endpointId, String message);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/websocket/commons/WebSocketMessageTransmitter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.websocket.commons;\n\n/**\n * Plain text transmitter over a web socket protocol. In current specification it is not required\n * from and the implementor to fulfill strict ordering of sequential transmissions along with\n * message delivery notification. The only guarantee that is required is to send a text message to\n * predefined endpoint.\n *\n * @author Dmitry Kuleshov\n */\npublic interface WebSocketMessageTransmitter {\n  /**\n   * Transmit a string message to an endpoint over wer socket protocol. The connection should be\n   * considered to be opened at the moment of calling, however the some of implementation may\n   * provide ability to cache messages until the connection is opened.\n   *\n   * @param endpointId identifier of an endpoint known to an transmitter implementation\n   * @param message plain text message\n   */\n  void transmit(String endpointId, String message);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/websocket/impl/BasicWebSocketEndpoint.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.websocket.impl;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.unmodifiableMap;\nimport static org.eclipse.che.api.core.websocket.impl.WebsocketIdService.randomClientId;\n\nimport jakarta.websocket.CloseReason;\nimport jakarta.websocket.OnClose;\nimport jakarta.websocket.OnError;\nimport jakarta.websocket.OnMessage;\nimport jakarta.websocket.OnOpen;\nimport jakarta.websocket.Session;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.concurrent.ConcurrentHashMap;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageReceiver;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Duplex WEB SOCKET endpoint, handles messages, errors, session open/close events.\n *\n * @author Dmitry Kuleshov\n */\npublic abstract class BasicWebSocketEndpoint {\n\n  private static final Logger LOG = LoggerFactory.getLogger(BasicWebSocketEndpoint.class);\n\n  private final WebSocketSessionRegistry registry;\n  private final MessagesReSender reSender;\n  private final WebSocketMessageReceiver receiver;\n  private final WebsocketIdService identificationService;\n  private final Map<Session, StringBuffer> sessionMessagesBuffer = new ConcurrentHashMap<>();\n\n  public BasicWebSocketEndpoint(\n      WebSocketSessionRegistry registry,\n      MessagesReSender reSender,\n      WebSocketMessageReceiver receiver,\n      WebsocketIdService identificationService) {\n\n    this.registry = registry;\n    this.reSender = reSender;\n    this.receiver = receiver;\n    this.identificationService = identificationService;\n  }\n\n  @OnOpen\n  public void onOpen(Session session) {\n    String combinedEndpointId = getOrGenerateCombinedEndpointId(session);\n\n    LOG.debug(\"Web socket session opened\");\n    LOG.debug(\"Endpoint: {}\", combinedEndpointId);\n\n    session.setMaxIdleTimeout(0);\n\n    registry.add(combinedEndpointId, session);\n    reSender.resend(combinedEndpointId);\n    sessionMessagesBuffer.put(session, new StringBuffer());\n  }\n\n  @OnMessage\n  public void onMessage(String messagePart, boolean last, Session session) {\n    try {\n      EnvironmentContext.getCurrent()\n          .setSubject((Subject) session.getUserProperties().get(\"che_subject\"));\n\n      StringBuffer buffer = sessionMessagesBuffer.get(session);\n      buffer.append(messagePart);\n      if (last) {\n        try {\n          onMessage(buffer.toString(), session);\n        } finally {\n          buffer.setLength(0);\n        }\n      }\n    } finally {\n      EnvironmentContext.reset();\n    }\n  }\n\n  public void onMessage(String message, Session session) {\n    Optional<String> endpointIdOptional = registry.get(session);\n\n    String combinedEndpointId;\n    if (endpointIdOptional.isPresent()) {\n      combinedEndpointId = endpointIdOptional.get();\n\n      LOG.trace(\"Receiving a web socket message.\");\n      LOG.trace(\"Endpoint: {}\", combinedEndpointId);\n      LOG.trace(\"Message: {}\", message);\n\n    } else {\n      combinedEndpointId = getOrGenerateCombinedEndpointId(session);\n\n      LOG.warn(\"Process interferes with an unidentified session\");\n    }\n    receiver.receive(combinedEndpointId, message);\n  }\n\n  @OnClose\n  public void onClose(CloseReason closeReason, Session session) {\n    Optional<String> endpointIdOptional = registry.get(session);\n\n    String combinedEndpointId;\n    if (endpointIdOptional.isPresent()) {\n      combinedEndpointId = endpointIdOptional.get();\n\n      LOG.debug(\"Web socket session closed\");\n      LOG.debug(\"Endpoint: {}\", combinedEndpointId);\n      LOG.debug(\"Close reason: {}:{}\", closeReason.getReasonPhrase(), closeReason.getCloseCode());\n\n      registry.remove(combinedEndpointId);\n      sessionMessagesBuffer.remove(session);\n    } else {\n      LOG.warn(\"Closing unidentified session\");\n    }\n  }\n\n  @OnError\n  public void onError(Throwable t, Session session) {\n    Optional<String> endpointIdOptional = registry.get(session);\n\n    if (endpointIdOptional.isPresent()) {\n      LOG.debug(\"Web socket session error\");\n      LOG.debug(\"Endpoint: {}\", endpointIdOptional.get());\n    } else {\n      LOG.warn(\"Web socket session error\");\n      LOG.debug(\"Unidentified session\");\n    }\n    LOG.debug(\"Error: \", t);\n  }\n\n  protected abstract String getEndpointId();\n\n  private String getOrGenerateCombinedEndpointId(Session session) {\n    Map<String, String> queryParamsMap = getQueryParamsMap(session.getQueryString());\n    String clientId = queryParamsMap.getOrDefault(\"clientId\", randomClientId());\n    return registry\n        .get(session)\n        .orElse(identificationService.getCombinedId(getEndpointId(), clientId));\n  }\n\n  private Map<String, String> getQueryParamsMap(String queryParamsString) {\n    Map<String, String> queryParamsMap = new HashMap<>();\n\n    for (String queryParamsPair : Optional.ofNullable(queryParamsString).orElse(\"\").split(\"&\")) {\n      String[] pair = queryParamsPair.split(\"=\");\n      if (pair.length == 2) {\n        queryParamsMap.put(pair[0], pair[1]);\n      }\n    }\n\n    return queryParamsMap.isEmpty() ? emptyMap() : unmodifiableMap(queryParamsMap);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/websocket/impl/BasicWebSocketMessageTransmitter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.websocket.impl;\n\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport jakarta.websocket.Session;\nimport java.io.IOException;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageTransmitter;\nimport org.slf4j.Logger;\n\n/**\n * Transmits messages over WEB SOCKET to a specific endpoint or broadcasts them. If WEB SOCKET\n * session is not opened adds messages to re-sender to try to send them when session will be opened\n * again.\n *\n * @author Dmitry Kuleshov\n */\n@Singleton\npublic class BasicWebSocketMessageTransmitter implements WebSocketMessageTransmitter {\n  private static final Logger LOG = getLogger(BasicWebSocketMessageTransmitter.class);\n\n  private final WebSocketSessionRegistry registry;\n  private final MessagesReSender reSender;\n\n  @Inject\n  public BasicWebSocketMessageTransmitter(\n      WebSocketSessionRegistry registry, MessagesReSender reSender) {\n    this.registry = registry;\n    this.reSender = reSender;\n  }\n\n  @Override\n  public synchronized void transmit(String endpointId, String message) {\n    Optional<Session> sessionOptional = registry.get(endpointId);\n\n    if (!sessionOptional.isPresent()) {\n      sessionOptional = registry.getByPartialMatch(endpointId).stream().findFirst();\n    }\n\n    if (!sessionOptional.isPresent() || !sessionOptional.get().isOpen()) {\n      LOG.trace(\"Session is not registered or closed, adding message to pending\");\n\n      reSender.add(endpointId, message);\n    } else {\n      LOG.trace(\"Session registered and open, sending message\");\n\n      try {\n        sessionOptional.get().getBasicRemote().sendText(message);\n      } catch (IOException e) {\n        LOG.error(\"Error while trying to send a message to a basic websocket remote endpoint\", e);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/websocket/impl/GuiceInjectorEndpointConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.websocket.impl;\n\nimport com.google.inject.Injector;\nimport jakarta.servlet.http.HttpSession;\nimport jakarta.websocket.HandshakeResponse;\nimport jakarta.websocket.server.HandshakeRequest;\nimport jakarta.websocket.server.ServerEndpointConfig;\nimport javax.inject.Inject;\n\n/**\n * Allows inject Guice instances on WEB SOCKET endpoint creation.\n *\n * @author Dmitry Kuleshov\n */\npublic class GuiceInjectorEndpointConfigurator extends ServerEndpointConfig.Configurator {\n  @Inject private static Injector injector;\n\n  public <T> T getEndpointInstance(Class<T> endpointClass) {\n    return injector.getInstance(endpointClass);\n  }\n\n  @Override\n  public void modifyHandshake(\n      ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {\n    HttpSession httpSession = (HttpSession) request.getHttpSession();\n    if (httpSession != null) {\n      Object sessionSubject = httpSession.getAttribute(\"che_subject\");\n      if (sessionSubject != null) {\n        sec.getUserProperties().put(\"che_subject\", sessionSubject);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/websocket/impl/MessagesReSender.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.websocket.impl;\n\nimport com.google.common.collect.EvictingQueue;\nimport jakarta.websocket.Session;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Queue;\nimport java.util.concurrent.ConcurrentHashMap;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.schedule.ScheduleDelay;\n\n/**\n * Instance is responsible for re-sending messages that were not sent during the period when WEB\n * SOCKET session was closed. If session is closed during re-send process it stops and left messages\n * will be re-sent as WEB SOCKET session becomes open again.\n *\n * @author Dmitry Kuleshov\n */\n@Singleton\npublic class MessagesReSender {\n\n  private static final int MAX_MESSAGES = 100;\n\n  private final WebSocketSessionRegistry registry;\n\n  private final Map<String, Queue<DelayedMessage>> delayedMessageRegistry =\n      new ConcurrentHashMap<>();\n\n  @Inject\n  public MessagesReSender(WebSocketSessionRegistry registry) {\n    this.registry = registry;\n  }\n\n  @ScheduleDelay(initialDelay = 60, delay = 60)\n  void cleanStaleMessages() {\n    long currentTimeMillis = System.currentTimeMillis();\n\n    delayedMessageRegistry\n        .values()\n        .forEach(it -> it.removeIf(m -> currentTimeMillis - m.timeMillis > 60_000));\n\n    delayedMessageRegistry.values().removeIf(Queue::isEmpty);\n  }\n\n  public void add(String endpointId, String message) {\n\n    delayedMessageRegistry\n        .computeIfAbsent(endpointId, k -> EvictingQueue.create(MAX_MESSAGES))\n        .offer(new DelayedMessage(message));\n  }\n\n  public void resend(String endpointId) {\n    Queue<DelayedMessage> delayedMessages = delayedMessageRegistry.remove(endpointId);\n\n    if (delayedMessages == null || delayedMessages.isEmpty()) {\n      return;\n    }\n\n    Optional<Session> sessionOptional = registry.get(endpointId);\n\n    if (!sessionOptional.isPresent()) {\n      return;\n    }\n\n    Queue<DelayedMessage> backingQueue = EvictingQueue.create(delayedMessages.size());\n    while (!delayedMessages.isEmpty()) {\n      backingQueue.offer(delayedMessages.poll());\n    }\n\n    Session session = sessionOptional.get();\n    for (DelayedMessage delayedMessage : backingQueue) {\n      if (session.isOpen()) {\n        session.getAsyncRemote().sendText(delayedMessage.message);\n      } else {\n        delayedMessages.add(delayedMessage);\n      }\n    }\n\n    if (!delayedMessages.isEmpty()) {\n      delayedMessageRegistry.put(endpointId, delayedMessages);\n    }\n  }\n\n  private static class DelayedMessage {\n\n    private final long timeMillis;\n    private final String message;\n\n    private DelayedMessage(String message) {\n      this.message = message;\n      this.timeMillis = System.currentTimeMillis();\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/websocket/impl/WebSocketModule.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.websocket.impl;\n\nimport com.google.inject.AbstractModule;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcMessageReceiver;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageReceiver;\nimport org.eclipse.che.api.core.websocket.commons.WebSocketMessageTransmitter;\n\npublic class WebSocketModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    requestStaticInjection(GuiceInjectorEndpointConfigurator.class);\n\n    bind(WebSocketMessageReceiver.class).to(JsonRpcMessageReceiver.class);\n    bind(WebSocketMessageTransmitter.class).to(BasicWebSocketMessageTransmitter.class);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/websocket/impl/WebSocketSessionRegistry.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.websocket.impl;\n\nimport static java.util.stream.Collectors.toSet;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport jakarta.websocket.Session;\nimport java.util.HashSet;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentHashMap;\nimport javax.inject.Singleton;\nimport org.slf4j.Logger;\n\n/**\n * Binds WEB SOCKET session to a specific endpoint form which it was opened.\n *\n * @author Dmitry Kuleshov\n */\n@Singleton\npublic class WebSocketSessionRegistry {\n  private static final Logger LOG = getLogger(WebSocketSessionRegistry.class);\n\n  private final Map<String, Session> sessionsMap = new ConcurrentHashMap<>();\n\n  public void add(String endpointId, Session session) {\n    LOG.debug(\"Registering session with endpoint {}\", session.getId(), endpointId);\n\n    sessionsMap.put(endpointId, session);\n  }\n\n  public Optional<Session> remove(String endpointId) {\n    LOG.debug(\"Cancelling registration for session with endpoint {}\", endpointId);\n\n    return Optional.ofNullable(sessionsMap.remove(endpointId));\n  }\n\n  public Optional<Session> remove(Session session) {\n    return get(session).flatMap(id -> Optional.ofNullable(sessionsMap.remove(id)));\n  }\n\n  public Optional<Session> get(String endpointId) {\n    return Optional.ofNullable(sessionsMap.get(endpointId));\n  }\n\n  public Set<Session> getByPartialMatch(String partialEndpointId) {\n    return sessionsMap.entrySet().stream()\n        .filter(it -> it.getKey().contains(partialEndpointId))\n        .map(Map.Entry::getValue)\n        .collect(toSet());\n  }\n\n  public Optional<String> get(Session session) {\n    return sessionsMap.entrySet().stream()\n        .filter(entry -> entry.getValue().equals(session))\n        .map(Map.Entry::getKey)\n        .findAny();\n  }\n\n  public Set<Session> getSessions() {\n    return new HashSet<>(sessionsMap.values());\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/api/core/websocket/impl/WebsocketIdService.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.websocket.impl;\n\nimport java.util.Random;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerConfigurator;\n\n/**\n * Identification service provide means to set and get unique identifiers for websocket clients.\n * There are several identifier elements to distinguish: clientId, endpointId, combinedId. Client id\n * is the identifier of a client that is passed over websocket to the client and back. EndpointId is\n * called to identify a websocket endpoint client connects through. CombinedId is a combination of\n * client and endpoint identifiers separated by a sequence of special charaters, it is used\n * internally.\n */\n@Singleton\npublic class WebsocketIdService {\n  public static final String SEPARATOR = \"<-:->\";\n  private static final Random GENERATOR = new Random();\n\n  public static String randomClientId() {\n    return String.valueOf(GENERATOR.nextInt(Integer.MAX_VALUE));\n  }\n\n  @Inject\n  private void configureHandler(RequestHandlerConfigurator requestHandlerConfigurator) {\n    requestHandlerConfigurator\n        .newConfiguration()\n        .methodName(\"websocketIdService/getId\")\n        .noParams()\n        .resultAsString()\n        .withFunction(this::extractClientId);\n  }\n\n  public String getCombinedId(String endpointId, String clientId) {\n    return clientId + SEPARATOR + endpointId;\n  }\n\n  public String extractClientId(String combinedId) {\n    return combinedId.split(SEPARATOR)[0];\n  }\n\n  public String extractEndpointId(String combinedId) {\n    return combinedId.split(SEPARATOR)[1];\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/commons/env/EnvironmentContext.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.env;\n\nimport org.eclipse.che.commons.lang.concurrent.ThreadLocalPropagateContext;\nimport org.eclipse.che.commons.subject.Subject;\n\n/**\n * Defines a component that holds variables of type {@link ThreadLocal} whose value is required by\n * the component to work normally and cannot be recovered. This component is mainly used when we\n * want to do a task asynchronously, in that case to ensure that the task will be executed in the\n * same conditions as if it would be executed synchronously we need to transfer the thread context\n * from the original thread to the executor thread.\n */\npublic class EnvironmentContext {\n\n  /** ThreadLocal keeper for EnvironmentContext. */\n  private static ThreadLocal<EnvironmentContext> current =\n      ThreadLocal.withInitial(EnvironmentContext::new);\n\n  static {\n    ThreadLocalPropagateContext.addThreadLocal(current);\n  }\n\n  public static EnvironmentContext getCurrent() {\n    return current.get();\n  }\n\n  public static void setCurrent(EnvironmentContext environment) {\n    current.set(environment);\n  }\n\n  public static void reset() {\n    current.remove();\n  }\n\n  private Subject subject;\n\n  public EnvironmentContext() {}\n\n  public EnvironmentContext(EnvironmentContext other) {\n    setSubject(other.getSubject());\n  }\n\n  /** Returns subject or {@link Subject#ANONYMOUS} in case when subject is null. */\n  public Subject getSubject() {\n    return subject == null ? Subject.ANONYMOUS : subject;\n  }\n\n  /** Sets subject. */\n  public void setSubject(Subject subject) {\n    this.subject = subject;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/commons/proxy/ProxyAuthenticator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.proxy;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\n\nimport java.net.Authenticator;\nimport java.net.PasswordAuthentication;\n\n/**\n * Set default java.net.Authenticator for requesting through the http(s) proxy. Proxy credentials\n * are read from the system properties: http.proxyUser http.proxyPassword https.proxyUser\n * https.proxyPassword\n *\n * <p>Usage: ProxyAuthenticator.initAuthenticator(url) ... making http(s) request by url ...\n * ProxyAuthenticator.resetAuthenticator()\n *\n * @author Dmytro Nochevnov\n */\npublic class ProxyAuthenticator extends Authenticator {\n  private static ThreadLocal<Protocol> currentProtocolHolder = new ThreadLocal<>();\n\n  static {\n    Authenticator.setDefault(new ProxyAuthenticator());\n  }\n\n  public static void initAuthenticator(String remoteUrl) {\n    if (remoteUrl != null && remoteUrl.toUpperCase().startsWith(Protocol.HTTPS.toString())) {\n      currentProtocolHolder.set(Protocol.HTTPS);\n    } else {\n      currentProtocolHolder.set(Protocol.HTTP);\n    }\n  }\n\n  public static void resetAuthenticator() {\n    currentProtocolHolder.remove();\n  }\n\n  private enum Protocol {\n    HTTP,\n    HTTPS;\n\n    private PasswordAuthentication passwordAuthentication = createPasswordAuthentication();\n\n    private PasswordAuthentication createPasswordAuthentication() {\n      if (!(isNullOrEmpty(getProxyUserSystemProperty())\n          || isNullOrEmpty(getProxyPasswordSystemProperty()))) {\n        return new PasswordAuthentication(\n            getProxyUserSystemProperty(), getProxyPasswordSystemProperty().toCharArray());\n      } else {\n        return null;\n      }\n    }\n\n    private String getProxyUserSystemProperty() {\n      String propertyName = format(\"%s.proxyUser\", this.toString().toLowerCase());\n      return System.getProperty(propertyName);\n    }\n\n    private String getProxyPasswordSystemProperty() {\n      String propertyName = format(\"%s.proxyPassword\", this.toString().toLowerCase());\n      return System.getProperty(propertyName);\n    }\n\n    private PasswordAuthentication getPasswordAuthentication() {\n      return passwordAuthentication;\n    }\n  }\n\n  protected PasswordAuthentication getPasswordAuthentication() {\n    Protocol protocol = currentProtocolHolder.get();\n    if (protocol != null) {\n      return protocol.getPasswordAuthentication();\n    } else {\n      return null;\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/commons/subject/Subject.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.subject;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.ForbiddenException;\n\n/**\n * Subject represents authenticated user\n *\n * @author andrew00x\n * @author Sergii Leschenko\n */\npublic interface Subject {\n  /** Unidentified subject */\n  Subject ANONYMOUS =\n      new Subject() {\n        @Override\n        public String getUserId() {\n          return \"0000-00-0000\";\n        }\n\n        @Override\n        public String getUserName() {\n          return \"Anonymous\";\n        }\n\n        @Override\n        public List<String> getGroups() {\n          return java.util.Collections.emptyList();\n        }\n\n        @Override\n        public boolean hasPermission(String domain, String instance, String action) {\n          return false;\n        }\n\n        @Override\n        public void checkPermission(String domain, String instance, String action)\n            throws ForbiddenException {\n          throw new ForbiddenException(\n              \"User is not authorized to perform \"\n                  + action\n                  + \" of \"\n                  + domain\n                  + \" with id '\"\n                  + instance\n                  + \"'\");\n        }\n\n        @Override\n        public String getToken() {\n          return null;\n        }\n\n        @Override\n        public boolean isAnonymous() {\n          return true;\n        }\n\n        @Override\n        public boolean isTemporary() {\n          return false;\n        }\n      };\n\n  /**\n   * Get user unique identifier.\n   *\n   * <p>Note: In comparison with name id never changes for the given user.\n   *\n   * @return unique identifier of user.\n   */\n  String getUserId();\n\n  /**\n   * @return name of user\n   */\n  String getUserName();\n\n  /**\n   * @return list of groups the user belongs to\n   */\n  List<String> getGroups();\n\n  /**\n   * Checks does subject have specified permission.\n   *\n   * @return {@code true} if subject has permission to perform given action and {@code false}\n   *     otherwise\n   */\n  boolean hasPermission(String domain, String instance, String action);\n\n  /**\n   * Ensures this Subject has specified permission.\n   *\n   * @throws ForbiddenException if subject doesn't have specified permission\n   */\n  void checkPermission(String domain, String instance, String action) throws ForbiddenException;\n\n  /**\n   * @return subject auth token to be able to execute request as subject\n   */\n  String getToken();\n\n  /**\n   * Return {@code true} if subject is anonymous, {@code false} if this is a real authenticated\n   * subject.\n   */\n  default boolean isAnonymous() {\n    return false;\n  }\n\n  /**\n   * @return - true if subject is temporary, false if this is a real persistent subject.\n   */\n  boolean isTemporary();\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/commons/subject/SubjectImpl.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.subject;\n\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Objects;\nimport org.eclipse.che.api.core.ForbiddenException;\n\n/**\n * Base implementation of {@link Subject}.\n *\n * @author andrew00x\n */\npublic class SubjectImpl implements Subject {\n  private final String id;\n  private final String name;\n  private final List<String> groups;\n  private final String token;\n  private final boolean isTemporary;\n\n  public SubjectImpl(\n      String name, List<String> groups, String id, String token, boolean isTemporary) {\n    this.name = name;\n    this.groups = Collections.unmodifiableList(groups);\n    this.id = id;\n    this.token = token;\n    this.isTemporary = isTemporary;\n  }\n\n  @Override\n  public String getUserName() {\n    return name;\n  }\n\n  @Override\n  public List<String> getGroups() {\n    return groups;\n  }\n\n  @Override\n  public boolean hasPermission(String domain, String instance, String action) {\n    return false;\n  }\n\n  @Override\n  public void checkPermission(String domain, String instance, String action)\n      throws ForbiddenException {\n    throw new ForbiddenException(\"User is not authorized to perform operation\");\n  }\n\n  @Override\n  public String getToken() {\n    return token;\n  }\n\n  @Override\n  public String getUserId() {\n    return id;\n  }\n\n  @Override\n  public boolean isTemporary() {\n    return isTemporary;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof SubjectImpl)) return false;\n\n    SubjectImpl other = (SubjectImpl) obj;\n\n    return Objects.equals(id, other.id)\n        && Objects.equals(name, other.name)\n        && Objects.equals(token, other.token)\n        && Objects.equals(groups, other.groups)\n        && isTemporary == other.isTemporary;\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + Objects.hashCode(name);\n    hash = 31 * hash + Objects.hashCode(token);\n    hash = 31 * hash + Boolean.hashCode(isTemporary);\n    hash = 31 * hash + Objects.hashCode(groups);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"SubjectImpl{\"\n        + \"id='\"\n        + id\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", groups=\"\n        + groups\n        + \", token='\"\n        + token\n        + '\\''\n        + \", isTemporary=\"\n        + isTemporary\n        + '}';\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/everrest/CheMethodInvokerFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.everrest;\n\nimport jakarta.ws.rs.WebApplicationException;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.Response;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.everrest.core.method.MethodInvokerFilter;\nimport org.everrest.core.resource.GenericResourceMethod;\n\n/**\n * Abstract implementation of {@link MethodInvokerFilter} which allow to throw instances of {@link\n * ApiException} which will be mapped to corresponded response\n *\n * @author Sergii Leschenko\n */\npublic abstract class CheMethodInvokerFilter implements MethodInvokerFilter {\n  @Override\n  public void accept(GenericResourceMethod genericMethodResource, Object[] arguments)\n      throws WebApplicationException {\n    try {\n\n      filter(genericMethodResource, arguments);\n    } catch (ApiException exception) {\n      Response response;\n      if (exception instanceof ForbiddenException) {\n        response =\n            Response.status(Response.Status.FORBIDDEN)\n                .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n                .type(MediaType.APPLICATION_JSON)\n                .build();\n      } else if (exception instanceof NotFoundException) {\n        response =\n            Response.status(Response.Status.NOT_FOUND)\n                .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n                .type(MediaType.APPLICATION_JSON)\n                .build();\n      } else if (exception instanceof UnauthorizedException)\n        response =\n            Response.status(Response.Status.UNAUTHORIZED)\n                .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n                .type(MediaType.APPLICATION_JSON)\n                .build();\n      else if (exception instanceof BadRequestException) {\n        response =\n            Response.status(Response.Status.BAD_REQUEST)\n                .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n                .type(MediaType.APPLICATION_JSON)\n                .build();\n      } else if (exception instanceof ConflictException) {\n        response =\n            Response.status(Response.Status.CONFLICT)\n                .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n                .type(MediaType.APPLICATION_JSON)\n                .build();\n      } else if (exception instanceof ServerException) {\n        response =\n            Response.serverError()\n                .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n                .type(MediaType.APPLICATION_JSON)\n                .build();\n      } else {\n        response =\n            Response.serverError()\n                .entity(DtoFactory.getInstance().toJson(exception.getServiceError()))\n                .type(MediaType.APPLICATION_JSON)\n                .build();\n      }\n\n      throw new WebApplicationException(response);\n    }\n  }\n\n  /**\n   * Check does supplied method can be invoked.\n   *\n   * @param genericMethodResource See {@link GenericResourceMethod}\n   * @param arguments actual method arguments that were created from request\n   * @throws ApiException if method can not be invoked cause current environment context, e.g. for\n   *     current user, with current request attributes, etc.\n   */\n  protected abstract void filter(GenericResourceMethod genericMethodResource, Object[] arguments)\n      throws ApiException;\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/everrest/ETagResponseFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.everrest;\n\nimport static org.eclipse.che.everrest.ETagResponseFilter.EntityType.JSON_SERIALIZABLE;\nimport static org.eclipse.che.everrest.ETagResponseFilter.EntityType.STRING;\nimport static org.eclipse.che.everrest.ETagResponseFilter.EntityType.UNKNOWN;\n\nimport com.google.common.hash.HashCode;\nimport com.google.common.hash.HashFunction;\nimport com.google.common.hash.Hasher;\nimport com.google.common.hash.Hashing;\nimport jakarta.ws.rs.HttpMethod;\nimport jakarta.ws.rs.core.EntityTag;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.Request;\nimport jakarta.ws.rs.core.Response;\nimport java.nio.charset.Charset;\nimport java.util.List;\nimport org.eclipse.che.dto.server.JsonSerializable;\nimport org.everrest.core.ApplicationContext;\nimport org.everrest.core.Filter;\nimport org.everrest.core.GenericContainerResponse;\nimport org.everrest.core.ResponseFilter;\n\n/**\n * Filter implementing {@link org.everrest.core.ResponseFilter} in order to generate ETag for\n * clients that want to use conditional requests. It is applying on GET method and JSON content type\n * only.\n *\n * @author Florent Benoit\n */\n@Filter\npublic class ETagResponseFilter implements ResponseFilter {\n\n  public enum EntityType {\n    JSON_SERIALIZABLE,\n    STRING,\n    UNKNOWN\n  }\n\n  /**\n   * Filter the given container response\n   *\n   * @param containerResponse the response to use\n   */\n  public void doFilter(GenericContainerResponse containerResponse) {\n\n    // get entity of the response\n    Object entity = containerResponse.getEntity();\n\n    // no entity, skip\n    if (entity == null) {\n      return;\n    }\n\n    // Only handle JSON content\n    if (!MediaType.APPLICATION_JSON_TYPE.equals(containerResponse.getContentType())) {\n      return;\n    }\n\n    // Get the request\n    ApplicationContext applicationContext = ApplicationContext.getCurrent();\n    Request request = applicationContext.getRequest();\n\n    // manage only GET requests\n    if (!HttpMethod.GET.equals(request.getMethod())) {\n      return;\n    }\n\n    // calculate hash with MD5\n    HashFunction hashFunction = Hashing.md5();\n    Hasher hasher = hashFunction.newHasher();\n    boolean hashingSuccess = true;\n\n    // Manage a list\n    if (entity instanceof List) {\n      List<?> entities = (List) entity;\n      for (Object simpleEntity : entities) {\n        hashingSuccess = addHash(simpleEntity, hasher);\n        if (!hashingSuccess) {\n          break;\n        }\n      }\n    } else {\n      hashingSuccess = addHash(entity, hasher);\n    }\n\n    // if we're able to handle the hash\n    if (hashingSuccess) {\n\n      // get result of the hash\n      HashCode hashCode = hasher.hash();\n\n      // Create the entity tag\n      EntityTag entityTag = new EntityTag(hashCode.toString());\n\n      // Check the etag\n      Response.ResponseBuilder builder = request.evaluatePreconditions(entityTag);\n\n      // not modified ?\n      if (builder != null) {\n        containerResponse.setResponse(builder.tag(entityTag).build());\n      } else {\n        // it has been changed, so send response with new ETag and entity\n        Response.ResponseBuilder responseBuilder =\n            Response.fromResponse(containerResponse.getResponse()).tag(entityTag);\n        containerResponse.setResponse(responseBuilder.build());\n      }\n    }\n  }\n\n  /**\n   * Helper method to add entity to hash. If there is an invalid entity type it will return false\n   *\n   * @param entity the entity object to analyze and extract JSON for hashing it\n   * @param hasher the hasher used to add the hashes\n   */\n  protected boolean addHash(Object entity, Hasher hasher) {\n    // get entity type\n    EntityType entityType = getElementType(entity);\n\n    // check\n    if (entityType == UNKNOWN) {\n      // unknown entity type, cannot perform hash\n      return false;\n    }\n    // add hash if all is OK\n    try {\n      hasher.putString(getJson(entity, entityType), Charset.defaultCharset());\n    } catch (RuntimeException e) {\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Helper method to retrieving the JSON content based on the entity type\n   *\n   * @param entity the object to analyze\n   * @return the JSON string or null if it's an unknown type\n   */\n  protected String getJson(Object entity, EntityType entityType) {\n    switch (entityType) {\n      case JSON_SERIALIZABLE:\n        return ((JsonSerializable) entity).toJson();\n      case STRING:\n        return (String) entity;\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * Helper method for getting the type of the JSON entity\n   *\n   * @param entity the entity object\n   * @return the type of the element\n   */\n  protected EntityType getElementType(Object entity) {\n    if (JsonSerializable.class.isAssignableFrom(entity.getClass())) {\n      return JSON_SERIALIZABLE;\n    }\n\n    if (String.class.isAssignableFrom(entity.getClass())) {\n      return STRING;\n    }\n\n    return UNKNOWN;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/everrest/EverrestDownloadFileResponseFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.everrest;\n\nimport static jakarta.ws.rs.core.HttpHeaders.CONTENT_DISPOSITION;\n\nimport jakarta.ws.rs.core.Request;\nimport jakarta.ws.rs.core.Response;\nimport org.eclipse.che.api.core.rest.DownloadFileResponseFilter;\nimport org.everrest.core.ApplicationContext;\nimport org.everrest.core.Filter;\nimport org.everrest.core.GenericContainerResponse;\nimport org.everrest.core.ResponseFilter;\n\n/**\n * JAX-RS implementation of download filter.\n *\n * @author Florent Benoit\n */\n@Filter\npublic class EverrestDownloadFileResponseFilter extends DownloadFileResponseFilter\n    implements ResponseFilter {\n\n  /**\n   * Filter the given container response.\n   *\n   * @param containerResponse the response to use\n   */\n  public void doFilter(GenericContainerResponse containerResponse) {\n    containerResponse.getResponse();\n\n    // Get the request\n    ApplicationContext applicationContext = ApplicationContext.getCurrent();\n    Request request = applicationContext.getRequest();\n\n    // Apply header if all if correct\n    String filename =\n        getFileName(\n            request,\n            containerResponse.getContentType(),\n            applicationContext,\n            containerResponse.getStatus());\n    if (filename != null) {\n      if (hasCompliantEntity(containerResponse.getEntity())) {\n        // it has been changed, so send response with updated header\n        Response.ResponseBuilder responseBuilder =\n            Response.fromResponse(containerResponse.getResponse())\n                .header(CONTENT_DISPOSITION, \"attachment; filename=\" + filename);\n        containerResponse.setResponse(responseBuilder.build());\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/security/PBKDF2PasswordEncryptor.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security;\n\nimport static com.google.common.primitives.Ints.tryParse;\nimport static java.lang.String.format;\nimport static java.util.Objects.requireNonNull;\n\nimport com.google.common.hash.HashCode;\nimport java.security.NoSuchAlgorithmException;\nimport java.security.SecureRandom;\nimport java.security.spec.InvalidKeySpecException;\nimport java.security.spec.KeySpec;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport javax.crypto.SecretKeyFactory;\nimport javax.crypto.spec.PBEKeySpec;\n\n/**\n * Encrypts password using <a\n * href=\"https://en.wikipedia.org/wiki/PBKDF2\">Password-based-Key-Derivative-Function</a> with\n * <b>SHA512</b> as pseudorandom function. See <a\n * href=\"https://www.ietf.org/rfc/rfc2898.txt\">rfc2898</a>.\n *\n * @author Yevhenii Voevodin\n */\npublic class PBKDF2PasswordEncryptor implements PasswordEncryptor {\n\n  private static final String PWD_FMT = \"%s:%s:%d\";\n  private static final Pattern PWD_REGEX =\n      Pattern.compile(\"(?<pwdHash>\\\\w+):(?<saltHash>\\\\w+):(?<iterations>[0-9]+)\");\n\n  private static final String SECRET_KEY_FACTORY_NAME = \"PBKDF2WithHmacSHA512\";\n  private static final SecureRandom SECURE_RANDOM = new SecureRandom();\n\n  /**\n   * Minimum number of iterations required is 1_000(rfc2898), pick greater as potentially safer in\n   * the case of brute-force attacks .\n   */\n  private static final int ITERATIONS_COUNT = 10_000;\n\n  /** 64bit salt length based on the rfc2898 spec . */\n  private static final int SALT_LENGTH = 64 / 8;\n\n  @Override\n  public String encrypt(String password) {\n    requireNonNull(password, \"Required non-null password\");\n    final byte[] salt = new byte[SALT_LENGTH];\n    SECURE_RANDOM.nextBytes(salt);\n    final HashCode hash = computeHash(password.toCharArray(), salt, ITERATIONS_COUNT);\n    final HashCode saltHash = HashCode.fromBytes(salt);\n    return format(PWD_FMT, hash, saltHash, ITERATIONS_COUNT);\n  }\n\n  @Override\n  public boolean test(String password, String encryptedPassword) {\n    requireNonNull(password, \"Required non-null password\");\n    requireNonNull(password, \"Required non-null encrypted password\");\n    final Matcher matcher = PWD_REGEX.matcher(encryptedPassword);\n    if (!matcher.matches()) {\n      return false;\n    }\n    // retrieve salt, password hash and iterations count from hash\n    final Integer iterations = tryParse(matcher.group(\"iterations\"));\n    final String salt = matcher.group(\"saltHash\");\n    final String pwdHash = matcher.group(\"pwdHash\");\n    // compute password's hash and test whether it matches to given hash\n    final HashCode hash =\n        computeHash(password.toCharArray(), HashCode.fromString(salt).asBytes(), iterations);\n    return hash.toString().equals(pwdHash);\n  }\n\n  private HashCode computeHash(char[] password, byte[] salt, int iterations) {\n    try {\n      final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(SECRET_KEY_FACTORY_NAME);\n      final KeySpec keySpec = new PBEKeySpec(password, salt, iterations, 512);\n      return HashCode.fromBytes(keyFactory.generateSecret(keySpec).getEncoded());\n    } catch (NoSuchAlgorithmException | InvalidKeySpecException x) {\n      throw new RuntimeException(x.getMessage(), x);\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/security/PasswordEncryptor.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security;\n\n/**\n * Encrypts password in implementation specific way.\n *\n * @author Yevhenii Voevodin\n */\npublic interface PasswordEncryptor {\n\n  /**\n   * Encrypts the given {@code password}.\n   *\n   * @param password the plain password to be encrypted\n   * @return the encrypted password\n   * @throws NullPointerException when the password is null\n   * @throws RuntimeException when any error occurs during password encryption\n   */\n  String encrypt(String password);\n\n  /**\n   * Tests whether given {@code password} is {@code encryptedPassword}.\n   *\n   * @param encryptedPassword encrypted password\n   * @param password the password to check\n   * @return true if given {@code password} is {@code encryptedPassword}\n   * @throws NullPointerException when either of arguments is null\n   * @throws RuntimeException when any error occurs during test\n   */\n  boolean test(String password, String encryptedPassword);\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/java/org/eclipse/che/security/SHA512PasswordEncryptor.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security;\n\nimport static java.util.Objects.requireNonNull;\n\nimport com.google.common.hash.HashCode;\nimport com.google.common.hash.Hashing;\nimport com.google.common.primitives.Bytes;\nimport java.nio.charset.Charset;\nimport java.security.SecureRandom;\n\n/**\n * SHA-512 based encryptor {@code hash = sha512(password + salt) + salt}.\n *\n * @author Yevhenii Voevodin\n */\npublic class SHA512PasswordEncryptor implements PasswordEncryptor {\n\n  /**\n   * 64 bit salt length is based on the <a href=\"https://www.ietf.org/rfc/rfc2898.txt\">source</a>.\n   */\n  private static final int SALT_BYTES_LENGTH = 64 / 8;\n\n  /** SHA-512 produces 512 bits. */\n  private static final int ENCRYPTED_PASSWORD_BYTES_LENGTH = 512 / 8;\n\n  private static final SecureRandom SECURE_RANDOM = new SecureRandom();\n  private static final Charset PWD_CHARSET = Charset.forName(\"UTF-8\");\n\n  @Override\n  public String encrypt(String password) {\n    requireNonNull(password, \"Required non-null password\");\n    // generate salt\n    final byte[] salt = new byte[SALT_BYTES_LENGTH];\n    SECURE_RANDOM.nextBytes(salt);\n    // sha512(password + salt)\n    final HashCode hash =\n        Hashing.sha512().hashBytes(Bytes.concat(password.getBytes(PWD_CHARSET), salt));\n    final HashCode saltHash = HashCode.fromBytes(salt);\n    // add salt to the hash, result length (512 / 8) * 2 + (64 / 8) * 2 = 144\n    return hash.toString() + saltHash.toString();\n  }\n\n  @Override\n  public boolean test(String password, String passwordHash) {\n    requireNonNull(password, \"Required non-null password\");\n    requireNonNull(passwordHash, \"Required non-null password's hash\");\n    // retrieve salt from the hash\n    final int passwordHashLength = ENCRYPTED_PASSWORD_BYTES_LENGTH * 2;\n    if (passwordHash.length() < passwordHashLength + SALT_BYTES_LENGTH * 2) {\n      return false;\n    }\n    final HashCode saltHash = HashCode.fromString(passwordHash.substring(passwordHashLength));\n    // sha1(password + salt)\n    final HashCode hash =\n        Hashing.sha512()\n            .hashBytes(Bytes.concat(password.getBytes(PWD_CHARSET), saltHash.asBytes()));\n    // test sha1(password + salt) + salt == passwordHash\n    return (hash.toString() + saltHash.toString()).equals(passwordHash);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/main/resources/content-types.properties",
    "content": "#\n# Copyright (c) 2012-2018 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nai=application/postscript\naif=audio/x-aiff\naifc=audio/x-aiff\naiff=audio/x-aiff\nany=text/any\nasc=text/plain\nau=audio/basic\navi=video/x-msvideo\nbcpio=application/x-bcpio\nbin=application/octet-stream\nbmp=image/bmp\nbz2=application/x-bzip2\ncdf=application/x-netcdf\nclass=application/octet-stream\ncpio=application/x-cpio\nC=text/x-c++src\nc=text/x-c\ncc=text/x-c++src\ncpp=text/x-c++src\ncxx=text/x-c++src\nc++=text/x-c++src\ncpt=application/mac-compactpro\ncq=application/cq-durboser\ncmtc=application/x-chromattic+groovy\ncsh=application/x-csh\ncss=text/css\nDockerfile=text/x-docker\ndcr=application/x-director\ndir=application/x-director\ndms=application/octet-stream\ndoc=application/msword\ndvi=application/x-dvi\ndxr=application/x-director\near=application/java-archive\necma=text/qhtml\nerb=application/x-ruby+html\neps=application/postscript\nesp=text/qhtml\netx=text/x-setext\nexe=application/octet-stream\nez=application/andrew-inset\ngadget=application/x-google-gadget\ngif=image/gif\ngroovy=application/x-groovy\ngrs=application/x-jaxrs+groovy\ngtar=application/x-gtar\ngtmpl=application/x-groovy+html\ngz=application/x-gzip\nh=text/x-chdr\nhdf=application/x-hdf\nhh=text/x-c++hdr\nhqx=application/mac-binhex40\nhtm=text/html\nhtml=text/html\nice=x-conference/x-cooltalk\nief=image/ief\niges=model/iges\nigs=model/iges\njar=application/java-archive\njava=text/x-java\njpeg=image/jpeg\njpe=image/jpeg\njpg=image/jpeg\njsp=application/jsp\njs=application/x-javascript\njson=application/json\nkar=audio/midi\nlatex=application/x-latex\nless=text/css\nlha=application/octet-stream\nlzh=application/octet-stream\nman=application/x-troff-man\nmanifest=text/plain\nme=application/x-troff-me\nmesh=model/mesh\nmd=text/markdown\nmid=audio/midi\nmidi=audio/midi\nmif=application/vnd=mif\nmov=video/quicktime\nm4v=video/x-m4v\nm4a=audio/x-m4a\nmovie=video/x-sgi-movie\nmp2=audio/mp2\nmp3=audio/mp3\nmpe=video/mpe\nmpeg=video/mpeg\nmpg=video/mpg\nmpga=audio/mpga\nms=application/x-troff-ms\nmsg=application/vnd.ms-outlook\nmsh=model/mesh\nnc=application/x-netcdf\noda=application/oda\npbm=image/x-portable-bitmap\npdb=chemical/x-pdb\npdf=application/pdf\npgm=image/x-portable-graymap\npgn=application/x-chess-pgn\nphp=application/x-php\npng=image/png\npnm=image/x-portable-anymap\nppm=image/x-portable-pixmap\nppt=application/ppt\npptx=application/vnd.openxmlformats-officedocument.presentationml.presentation\nproperties=text/plain\nps=application/postscript\npy=text/x-python\nqhtml=text/qhtml\nqt=video/quicktime\nra=audio/x-realaudio\nrar=application/rar\nram=audio/x-pn-realaudio\nrm=audio/x-pn-realaudio\nras=image/x-cmu-raster\nrb=application/x-ruby\nrgb=image/x-rgb\nroff=application/x-troff\nrpm=application/x-rpm\nrtf=text/rtf\nrtx=text/richtext\nru=application/x-ruby\nsgm=text/sgml\nsgml=text/sgml\nsh=application/x-sh\nshar=application/x-shar\nsilo=model/mesh\nsit=application/x-stuffit\nskd=application/x-koan\nskm=application/x-koan\nskp=application/x-koan\nskt=application/x-koan\nsmi=application/smil\nsmil=application/smil\nsnd=audio/basic\nspl=application/x-futuresplash\nsrc=application/x-wais-source\nsv4cpio=application/x-sv4cpio\nsv4crc=application/x-sv4crc\nsvg=image/svg+xml\nswf=application/x-shockwave-flash\nt=application/x-troff\ntar=application/x-tar\ntcl=application/x-tcl\ntex=application/x-tex\ntexi=application/x-texinfo\ntexinfo=application/x-texinfo\ntgz=application/x-gzip\ntif=image/tiff\ntiff=image/tiff\ntr=application/x-troff\ntsv=text/tab-separated-values\ntxt=text/plain\nodt=application/vnd.oasis.opendocument.text\nods=application/vnd.oasis.opendocument.spreadsheet\nodp=application/vnd.oasis.opendocument.presentation\nodb=application/vnd.oasis.opendocument.database\nustar=application/x-ustar\nvcd=application/x-cdlink\nvm=text/plain\nvrml=model/vrml\nwar=application/java-archive\nwav=audio/x-wav\nwrl=model/vrml\nxbm=image/x-xbitmap\nxls=application/xls\nxlsx=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\nxml=text/xml\nxpdl=text/xml\nxpm=image/x-xpixmap\nxwd=image/x-xwindowdump\nxyz=chemical/x-pdb\nyaml=text/yaml\nyml=text/yaml\nzip=application/zip\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/PageTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.reverseOrder;\nimport static java.util.Collections.singleton;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport java.util.ArrayList;\nimport java.util.TreeSet;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@link Page}.\n *\n * @author Yevhenii Voevodin\n */\npublic class PageTest {\n\n  @Test(\n      expectedExceptions = IllegalArgumentException.class,\n      expectedExceptionsMessageRegExp = \"Required non-negative value of items before\")\n  public void shouldThrowIllegalArgumentWhenItemsBeforeIsNegative() throws Exception {\n    new Page<>(emptyList(), -1, 1, 10);\n  }\n\n  @Test(\n      expectedExceptions = IllegalArgumentException.class,\n      expectedExceptionsMessageRegExp = \"Required positive value of page size\")\n  public void shouldThrowIllegalArgumentWhenPageSizeIsNotPositive() throws Exception {\n    new Page<>(emptyList(), 1, 0, 10);\n  }\n\n  @Test(\n      expectedExceptions = IllegalArgumentException.class,\n      expectedExceptionsMessageRegExp = \"Required non-negative value of total items\")\n  public void shouldThrowIllegalArgumentWhenTotalCountIsNegative() throws Exception {\n    new Page<>(emptyList(), 1, 1, -1);\n  }\n\n  @Test(\n      expectedExceptions = NullPointerException.class,\n      expectedExceptionsMessageRegExp = \"Required non-null items\")\n  public void shouldThrownNPEWhenItemsListIsNull() throws Exception {\n    new Page<>(null, 1, 1, 1);\n  }\n\n  @Test\n  public void pageShouldBeEmptyWhenItIsCreatedWithAneEmptyItemsCollection() throws Exception {\n    assertTrue(new Page<>(emptyList(), 1, 1, 1).isEmpty());\n  }\n\n  @Test\n  public void testMiddleDataWindowPage() throws Exception {\n    // item1. <= skipped                <- first page start\n    // item2. <= skipped\n    // item3. <- page start             <- first page end\n    // item4.\n    // item5. <- page end               <- last page start\n    // item6.\n    // item7.                           <- last page end\n    final Page<String> page = new Page<>(asList(\"item3\", \"item4\", \"item5\"), 2, 3, 7);\n\n    assertFalse(page.isEmpty(), \"non-empty page\");\n    assertEquals(page.getItemsCount(), 3, \"items size \");\n    assertEquals(page.getSize(), 3, \"page size\");\n    assertEquals(page.getTotalItemsCount(), 7, \"total elements count\");\n\n    final Page.PageRef firstRef = page.getFirstPageRef();\n    assertEquals(firstRef.getPageSize(), 3, \"first page size\");\n    assertEquals(firstRef.getItemsBefore(), 0, \"first page skip items\");\n\n    final Page.PageRef lastRef = page.getLastPageRef();\n    assertEquals(lastRef.getPageSize(), 3, \"last page size\");\n    assertEquals(lastRef.getItemsBefore(), 6, \"last page skip items\");\n\n    assertEquals(page.getNumber(), -1, \"page number\");\n\n    assertFalse(page.hasPreviousPage(), \"has previous page\");\n\n    assertFalse(page.hasNextPage(), \"page has next page\");\n\n    assertEquals(page.getItems(), asList(\"item3\", \"item4\", \"item5\"));\n    assertEquals(page.getItems(i -> i.substring(4)), asList(\"3\", \"4\", \"5\"));\n    assertEquals(\n        new ArrayList<>(page.fill(new TreeSet<>(reverseOrder()))),\n        asList(\"item5\", \"item4\", \"item3\"));\n  }\n\n  @Test\n  public void testMiddlePage() throws Exception {\n    //        item1.                      <- previous page start      <- first page start\n    //        item2.\n    //        item3.                      <- previous page end        <- first page end\n    //        item4. <- page start\n    //        item5.\n    //        item6. <- page end\n    //        item7.                      <- next page start\n    //        item8.\n    //        item9.                      <- next page end\n    //        item.10                                                 <- last page start/end\n    final Page<String> page = new Page<>(asList(\"item4\", \"item5\", \"item6\"), 3, 3, 10);\n\n    assertFalse(page.isEmpty(), \"non-empty page\");\n    assertEquals(page.getItemsCount(), 3, \"items size\");\n    assertEquals(page.getSize(), 3, \"page size\");\n    assertEquals(page.getTotalItemsCount(), 10, \"total elements count\");\n\n    final Page.PageRef firstRef = page.getFirstPageRef();\n    assertEquals(firstRef.getPageSize(), 3, \"first page size\");\n    assertEquals(firstRef.getItemsBefore(), 0, \"first page skip items\");\n\n    final Page.PageRef lastRef = page.getLastPageRef();\n    assertEquals(lastRef.getPageSize(), 3, \"last page size\");\n    assertEquals(lastRef.getItemsBefore(), 9, \"last page skip items\");\n\n    assertEquals(page.getNumber(), 2, \"page number\");\n\n    assertTrue(page.hasPreviousPage(), \"has previous page\");\n    final Page.PageRef prevRef = page.getPreviousPageRef();\n    assertEquals(prevRef.getItemsBefore(), 0, \"items before prev page\");\n    assertEquals(prevRef.getPageSize(), 3, \"prev page size\");\n\n    assertTrue(page.hasNextPage(), \"page has next page\");\n    final Page.PageRef nextRef = page.getNextPageRef();\n    assertEquals(nextRef.getItemsBefore(), 6, \"items before next page\");\n    assertEquals(nextRef.getPageSize(), 3, \"next page size\");\n\n    assertEquals(page.getItems(), asList(\"item4\", \"item5\", \"item6\"));\n    assertEquals(page.getItems(i -> i.substring(4)), asList(\"4\", \"5\", \"6\"));\n    assertEquals(\n        new ArrayList<>(page.fill(new TreeSet<>(reverseOrder()))),\n        asList(\"item6\", \"item5\", \"item4\"));\n  }\n\n  @Test\n  public void testFirstPage() throws Exception {\n    // item1. <- page start\n    // item2.\n    // item3.\n    // item4.\n    // item5. <- page end\n    // item6.                           <- last page start\n    // item7.                           <- last page end\n    final Page<String> page =\n        new Page<>(asList(\"item1\", \"item2\", \"item3\", \"item4\", \"item5\"), 0, 5, 7);\n\n    assertFalse(page.isEmpty(), \"page is empty\");\n    assertEquals(page.getItemsCount(), 5, \"items items count\");\n    assertEquals(page.getSize(), 5, \"page size\");\n    assertEquals(page.getTotalItemsCount(), 7, \"total items\");\n\n    final Page.PageRef firstRef = page.getFirstPageRef();\n    assertEquals(firstRef.getPageSize(), 5, \"first page size\");\n    assertEquals(firstRef.getItemsBefore(), 0, \"first page skip items\");\n\n    final Page.PageRef lastRef = page.getLastPageRef();\n    assertEquals(lastRef.getPageSize(), 5, \"last page size\");\n    assertEquals(lastRef.getItemsBefore(), 5, \"last page skip items\");\n\n    assertEquals(page.getNumber(), 1, \"page number\");\n\n    assertFalse(page.hasPreviousPage(), \"has previous page\");\n\n    assertTrue(page.hasNextPage(), \"page has next page\");\n    final Page.PageRef nextRef = page.getNextPageRef();\n    assertEquals(nextRef.getPageSize(), 5, \"next page size\");\n    assertEquals(nextRef.getItemsBefore(), 5, \"next page skip items\");\n\n    assertEquals(page.getItems(), asList(\"item1\", \"item2\", \"item3\", \"item4\", \"item5\"));\n  }\n\n  @Test\n  public void testLastPage() throws Exception {\n    // item1.                   <- first page start\n    // item2.\n    // item3.                   <- first page end\n    // item4.                   <- prev page start\n    // item5.\n    // item6.                   <- prev page end\n    // item7. <- page start\n    // item8. <- page end\n    final Page<String> page = new Page<>(asList(\"item7\", \"item8\"), 6, 3, 8);\n\n    assertFalse(page.isEmpty(), \"page is empty\");\n    assertEquals(page.getItemsCount(), 2, \"items count\");\n    assertEquals(page.getSize(), 3, \"page size\");\n    assertEquals(page.getTotalItemsCount(), 8, \"total items\");\n\n    final Page.PageRef firstRef = page.getFirstPageRef();\n    assertEquals(firstRef.getPageSize(), 3, \"first page size\");\n    assertEquals(firstRef.getItemsBefore(), 0, \"first page skip items\");\n\n    final Page.PageRef lastRef = page.getLastPageRef();\n    assertEquals(lastRef.getPageSize(), 3, \"last page size\");\n    assertEquals(lastRef.getItemsBefore(), 6, \"last page skip items\");\n\n    assertEquals(page.getNumber(), 3, \"page number\");\n\n    assertTrue(page.hasPreviousPage(), \"has previous page\");\n    final Page.PageRef prevRef = page.getPreviousPageRef();\n    assertEquals(prevRef.getPageSize(), 3, \"prev page size\");\n    assertEquals(prevRef.getItemsBefore(), 3, \"prev page skip items\");\n\n    assertFalse(page.hasNextPage(), \"has next page\");\n\n    assertEquals(page.getItems(), asList(\"item7\", \"item8\"));\n  }\n\n  @Test\n  public void testSmallPage() throws Exception {\n    final Page<String> page = new Page<>(singleton(\"item1\"), 0, 1, 1);\n\n    assertFalse(page.isEmpty(), \"page is empty\");\n    assertEquals(page.getItemsCount(), 1, \"items count\");\n    assertEquals(page.getSize(), 1, \"page size\");\n    assertEquals(page.getTotalItemsCount(), 1, \"total items\");\n\n    final Page.PageRef firstRef = page.getFirstPageRef();\n    assertEquals(firstRef.getPageSize(), 1, \"first page size\");\n    assertEquals(firstRef.getItemsBefore(), 0, \"first page skip items\");\n\n    final Page.PageRef lastRef = page.getLastPageRef();\n    assertEquals(lastRef.getPageSize(), 1, \"last page size\");\n    assertEquals(lastRef.getItemsBefore(), 0, \"last page skip items\");\n\n    assertEquals(page.getNumber(), 1, \"page number\");\n\n    assertFalse(page.hasPreviousPage(), \"has previous page\");\n\n    assertFalse(page.hasNextPage(), \"page has next page\");\n\n    assertEquals(page.getItems(), singleton(\"item1\"));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/PagesTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core;\n\nimport static org.mockito.ArgumentMatchers.anyInt;\nimport static org.mockito.ArgumentMatchers.anyLong;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.Lists;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\nimport org.testng.annotations.BeforeSuite;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link Pages}.\n *\n * @author Yevhenii Voevodin\n */\npublic class PagesTest {\n\n  private TestPagesSupplier testSource;\n\n  @BeforeSuite\n  private void setUp() {\n    String[] strings = new String[10];\n    for (int i = 0; i < strings.length; i++) {\n      strings[i] = \"test-string-\" + i;\n    }\n    testSource = new TestPagesSupplier(strings);\n  }\n\n  @Test\n  public void eagerlyStreamsAllElements() {\n    List<String> result = Pages.stream(testSource::getStrings, 2).collect(Collectors.toList());\n\n    assertEquals(result, testSource.strings);\n  }\n\n  @Test\n  public void eagerlyIteratesAllElements() throws Exception {\n    ArrayList<String> result = Lists.newArrayList(Pages.iterate(testSource::getStrings, 2));\n\n    assertEquals(result, testSource.strings);\n  }\n\n  @Test\n  public void lazyStreamsAllElements() {\n    List<String> result =\n        Pages.streamLazily(testSource::getStrings, 2).collect(Collectors.toList());\n\n    assertEquals(result, testSource.strings);\n  }\n\n  @Test\n  public void lazyIteratesAllElements() {\n    ArrayList<String> result = Lists.newArrayList(Pages.iterateLazily(testSource::getStrings, 2));\n\n    assertEquals(result, testSource.strings);\n  }\n\n  @Test\n  public void lazyStreamingDoesNotPollNextPageUntilNeeded() {\n    TestPagesSupplier src = spy(new TestPagesSupplier(\"string1\", \"string2\", \"string3\"));\n\n    assertTrue(Pages.streamLazily(src::getStrings, 1).anyMatch(s -> s.equals(\"string2\")));\n\n    verify(src, times(2)).getStrings(anyInt(), anyLong());\n    verify(src).getStrings(1, 0);\n    verify(src).getStrings(1, 1);\n  }\n\n  @Test\n  public void lazyIteratingDoesNotPollNextPageUntilNeeded() {\n    TestPagesSupplier src = spy(new TestPagesSupplier(\"string1\", \"string2\", \"string3\"));\n\n    Iterator<String> it = Pages.iterateLazily(src::getStrings, 1).iterator();\n    it.next();\n    it.next();\n\n    verify(src, times(2)).getStrings(anyInt(), anyLong());\n    verify(src).getStrings(1, 0);\n    verify(src).getStrings(1, 1);\n  }\n\n  @Test\n  public void returnsEmptyStreamWhenFetchingEagerly() {\n    Stream<String> stream = Pages.stream(new TestPagesSupplier()::getStrings);\n\n    assertFalse(stream.findAny().isPresent());\n  }\n\n  @Test\n  public void returnsIterableWithNoElementsWhileFetchingEagerly() {\n    Iterator<String> it = Pages.iterate(new TestPagesSupplier()::getStrings).iterator();\n\n    assertFalse(it.hasNext());\n  }\n\n  @Test\n  public void returnsEmptyStreamWhenFetchingLazily() {\n    Stream<String> stream = Pages.streamLazily(new TestPagesSupplier()::getStrings);\n\n    assertFalse(stream.findAny().isPresent());\n  }\n\n  @Test\n  public void returnsIterableWithNoeElementsWhileFetchingLazily() {\n    Iterator<String> it = Pages.iterateLazily(new TestPagesSupplier()::getStrings).iterator();\n\n    assertFalse(it.hasNext());\n  }\n\n  private static class TestPagesSupplier {\n\n    private final List<String> strings;\n\n    private TestPagesSupplier(String... strings) {\n      this.strings = Arrays.asList(strings);\n    }\n\n    public Page<String> getStrings(int max, long skip) {\n      List<String> items = strings.stream().skip(skip).limit(max).collect(Collectors.toList());\n      return new Page<>(items, skip, max, strings.size());\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/jsonrpc/commons/JsonRpcMessageReceiverTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport static java.util.Collections.singletonList;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport org.eclipse.che.api.core.websocket.impl.WebsocketIdService;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/** Tests for {@link JsonRpcMessageReceiver} */\n@Listeners(MockitoTestNGListener.class)\npublic class JsonRpcMessageReceiverTest {\n\n  static final String MESSAGE = \"message\";\n  static final String ENDPOINT_ID = \"client-id\" + WebsocketIdService.SEPARATOR + \"endpoint-id\";\n\n  @Mock RequestDispatcher requestDispatcher;\n  @Mock ResponseDispatcher responseDispatcher;\n  @Mock JsonRpcErrorTransmitter errorTransmitter;\n  @Mock JsonRpcQualifier jsonRpcQualifier;\n  @Mock JsonRpcUnmarshaller jsonRpcUnmarshaller;\n  @Mock RequestProcessor requestProcessor;\n  @InjectMocks JsonRpcMessageReceiver jsonRpcMessageReceiver;\n\n  @Test\n  public void shouldValidateMessage() throws Exception {\n    jsonRpcMessageReceiver.receive(ENDPOINT_ID, MESSAGE);\n\n    verify(jsonRpcQualifier).isValidJson(MESSAGE);\n  }\n\n  @Test\n  public void shouldTransmitErrorWhenValidationFailed() throws Exception {\n    when(jsonRpcQualifier.isValidJson(MESSAGE)).thenReturn(false);\n\n    jsonRpcMessageReceiver.receive(ENDPOINT_ID, MESSAGE);\n\n    verify(errorTransmitter).transmit(eq(ENDPOINT_ID), any(JsonRpcException.class));\n  }\n\n  @Test\n  public void shouldNotTransmitErrorWhenValidationSucceeded() throws Exception {\n    when(jsonRpcQualifier.isValidJson(MESSAGE)).thenReturn(true);\n\n    jsonRpcMessageReceiver.receive(ENDPOINT_ID, MESSAGE);\n\n    verify(errorTransmitter, never()).transmit(eq(ENDPOINT_ID), any(JsonRpcException.class));\n  }\n\n  @Test\n  public void shouldUnmarshalArray() throws Exception {\n    jsonRpcMessageReceiver.receive(ENDPOINT_ID, MESSAGE);\n\n    verify(jsonRpcUnmarshaller).unmarshalArray(MESSAGE);\n  }\n\n  @Test\n  public void shouldDispatchResponseIfResponseReceived() throws Exception {\n    when(jsonRpcQualifier.isJsonRpcResponse(MESSAGE)).thenReturn(true);\n    when(jsonRpcQualifier.isJsonRpcRequest(MESSAGE)).thenReturn(false);\n    when(jsonRpcUnmarshaller.unmarshalArray(any())).thenReturn(singletonList(MESSAGE));\n    JsonRpcResponse jsonRpcResponse = Mockito.mock(JsonRpcResponse.class);\n    when(jsonRpcUnmarshaller.unmarshalResponse(any())).thenReturn(jsonRpcResponse);\n\n    jsonRpcMessageReceiver.receive(ENDPOINT_ID, MESSAGE);\n\n    verify(responseDispatcher).dispatch(eq(ENDPOINT_ID), any(JsonRpcResponse.class));\n  }\n\n  @Test\n  public void shouldDispatchRequestIfRequestReceived() throws Exception {\n    when(jsonRpcQualifier.isJsonRpcRequest(MESSAGE)).thenReturn(true);\n    when(jsonRpcUnmarshaller.unmarshalArray(any())).thenReturn(singletonList(MESSAGE));\n\n    jsonRpcMessageReceiver.receive(ENDPOINT_ID, MESSAGE);\n\n    verify(requestProcessor).process(any(), any());\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/jsonrpc/commons/RequestDispatcherTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.jsonrpc.commons;\n\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/** Tests for {@link RequestDispatcher} */\n@Listeners(MockitoTestNGListener.class)\npublic class RequestDispatcherTest {\n  static final String ENDPOINT_ID = \"endpoint-id\";\n  static final String REQUEST_ID = \"request-id\";\n  static final String REQUEST_METHOD = \"request-method\";\n\n  @Mock RequestHandlerManager requestHandlerManager;\n  @InjectMocks RequestDispatcher requestDispatcher;\n\n  @Mock JsonRpcRequest request;\n  @Mock JsonRpcParams params;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    lenient().when(request.getId()).thenReturn(REQUEST_ID);\n    when(request.getMethod()).thenReturn(REQUEST_METHOD);\n    when(request.getParams()).thenReturn(params);\n    when(requestHandlerManager.isRegistered(REQUEST_METHOD)).thenReturn(true);\n  }\n\n  @Test\n  public void shouldHandleRequest() throws Exception {\n    when(request.hasId()).thenReturn(true);\n\n    requestDispatcher.dispatch(ENDPOINT_ID, request);\n\n    verify(requestHandlerManager).handle(ENDPOINT_ID, REQUEST_ID, REQUEST_METHOD, params);\n  }\n\n  @Test\n  public void shouldHandleNotification() throws Exception {\n    when(request.hasId()).thenReturn(false);\n\n    requestDispatcher.dispatch(ENDPOINT_ID, request);\n\n    verify(requestHandlerManager).handle(ENDPOINT_ID, REQUEST_METHOD, params);\n  }\n\n  @Test(expectedExceptions = JsonRpcException.class)\n  public void shouldThrowExceptionOnNotRegisteredRequestHandler() throws Exception {\n    when(requestHandlerManager.isRegistered(REQUEST_METHOD)).thenReturn(false);\n\n    requestDispatcher.dispatch(ENDPOINT_ID, request);\n  }\n\n  @Test(expectedExceptions = JsonRpcException.class)\n  public void shouldThrowExceptionOnNotRegisteredNotificationHandler() throws Exception {\n    when(requestHandlerManager.isRegistered(REQUEST_METHOD)).thenReturn(false);\n\n    requestDispatcher.dispatch(ENDPOINT_ID, request);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/notification/EventServiceTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.notification;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\n/**\n * @author andrew00x\n */\npublic class EventServiceTest {\n  private EventService bus;\n\n  @BeforeMethod\n  public void setUp() {\n    bus = new EventService();\n  }\n\n  @Test\n  public void testSimpleEvent() {\n    final List<Object> events = new ArrayList<>();\n    bus.subscribe(\n        new EventSubscriber<Date>() {\n          @Override\n          public void onEvent(Date event) {\n            events.add(event);\n          }\n        });\n    bus.subscribe(\n        new EventSubscriber<String>() {\n          @Override\n          public void onEvent(String event) {\n            events.add(event);\n          }\n        });\n    bus.subscribe(\n        new EventSubscriber<Long>() {\n          @Override\n          public void onEvent(Long event) {\n            events.add(event);\n          }\n        });\n    Date date = new Date();\n    bus.publish(date);\n    bus.publish(\"hello\");\n    bus.publish(123L);\n    Assert.assertEquals(events.size(), 3);\n    Assert.assertTrue(events.contains(date));\n    Assert.assertTrue(events.contains(\"hello\"));\n    Assert.assertTrue(events.contains(123L));\n    // ignored\n    bus.publish(new Object());\n    Assert.assertEquals(events.size(), 3);\n  }\n\n  static interface I {}\n\n  static class Listener implements I, EventSubscriber<String> {\n    final List<String> events = new ArrayList<>();\n\n    @Override\n    public void onEvent(String event) {\n      events.add(event);\n    }\n  }\n\n  static class ExtListener extends Listener {}\n\n  @Test\n  public void testRegisterHierarchicalListener() {\n    ExtListener listener = new ExtListener();\n    bus.subscribe(listener);\n    bus.publish(\"hello\");\n    Assert.assertEquals(listener.events.size(), 1);\n    Assert.assertEquals(listener.events.get(0), \"hello\");\n  }\n\n  static class Event {\n    String data;\n\n    Event() {\n      this(\"event\");\n    }\n\n    Event(String data) {\n      this.data = data;\n    }\n\n    @Override\n    public String toString() {\n      return data;\n    }\n  }\n\n  static class ExtEvent extends Event {\n    ExtEvent() {\n      super(\"ext_event\");\n    }\n  }\n\n  @Test\n  public void testHierarchicalEvent() {\n    final List<String> events = new ArrayList<>();\n    // register two listeners.\n    // 1. Accept only Event type.\n    bus.subscribe(\n        new EventSubscriber<Event>() {\n          @Override\n          public void onEvent(Event event) {\n            events.add(String.format(\"1:%s\", event));\n          }\n        });\n\n    // 2. Accept Event and ExtEvent types.\n    bus.subscribe(\n        new EventSubscriber<ExtEvent>() {\n          @Override\n          public void onEvent(ExtEvent event) {\n            events.add(String.format(\"2:%s\", event));\n          }\n        });\n\n    bus.publish(new Event());\n    Assert.assertEquals(events.size(), 1);\n    Assert.assertEquals(events.get(0), \"1:event\");\n    events.clear();\n    bus.publish(new ExtEvent());\n    Assert.assertEquals(events.size(), 2);\n    Assert.assertTrue(events.contains(\"1:ext_event\"));\n    Assert.assertTrue(events.contains(\"2:ext_event\"));\n  }\n\n  @Test\n  public void testUnsubscribe() {\n    final List<String> events = new ArrayList<>();\n    EventSubscriber<Event> l =\n        new EventSubscriber<Event>() {\n          @Override\n          public void onEvent(Event event) {\n            events.add(event.data);\n          }\n        };\n    bus.subscribe(l);\n    bus.publish(new Event());\n    Assert.assertEquals(events.size(), 1);\n    bus.unsubscribe(l);\n    events.clear();\n    bus.publish(new Event());\n    Assert.assertEquals(events.size(), 0);\n  }\n\n  @Test(expectedExceptions = IllegalArgumentException.class)\n  public void shouldNotDetermineTheTypeOfEventOnSubscribe() {\n    bus.subscribe(new CustomEventSubscriber<>());\n  }\n\n  @Test(expectedExceptions = IllegalArgumentException.class)\n  public void shouldNotDetermineTheTypeOfEventOnUnsubscribe() {\n    final CustomEventSubscriber<CustomEventImpl> sb = new CustomEventSubscriber<>();\n    bus.subscribe(sb, CustomEventImpl.class);\n    bus.unsubscribe(sb);\n  }\n\n  @Test\n  public void shouldSubscribeOnCustomEventSubscriber() {\n    bus.subscribe(new CustomEventSubscriber<>(), CustomEventImpl.class);\n  }\n\n  @Test\n  public void shouldUnsubscribeOnCustomEventSubscriber() {\n    final CustomEventSubscriber<CustomEventImpl> sb = new CustomEventSubscriber<>();\n    bus.subscribe(sb, CustomEventImpl.class);\n    bus.unsubscribe(sb, CustomEventImpl.class);\n  }\n\n  @Test\n  public void shouldSendEventsThroughCustomEventSubscriber() {\n    final CustomEventSubscriber<CustomEventImpl> sb = new CustomEventSubscriber<>();\n    bus.subscribe(sb, CustomEventImpl.class);\n    bus.publish(new CustomEventImpl());\n    Assert.assertEquals(sb.events.size(), 1);\n    bus.unsubscribe(sb, CustomEventImpl.class);\n  }\n\n  static class CustomEventSubscriber<T extends CustomEvent> implements EventSubscriber<T> {\n    final List<String> events = new ArrayList<>();\n\n    @Override\n    public void onEvent(T event) {\n      events.add(event.getMessage());\n    }\n  }\n\n  abstract static class CustomEvent {\n    private final String message;\n\n    public CustomEvent(String message) {\n      this.message = message;\n    }\n\n    public String getMessage() {\n      return message;\n    }\n  }\n\n  static class CustomEventImpl extends CustomEvent {\n\n    public CustomEventImpl() {\n      super(\"message\");\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/rest/DefaultHttpJsonRequestTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.api.core.util.LinksHelper.createLink;\nimport static org.mockito.ArgumentMatchers.anyInt;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.ArgumentMatchers.nullable;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport com.google.common.reflect.TypeToken;\nimport jakarta.ws.rs.HttpMethod;\nimport java.io.IOException;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.core.util.LinksHelper;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.dto.server.JsonArrayImpl;\nimport org.eclipse.che.dto.shared.JsonArray;\nimport org.eclipse.che.dto.shared.JsonStringMap;\nimport org.everrest.assured.EverrestJetty;\nimport org.everrest.core.Filter;\nimport org.everrest.core.GenericContainerRequest;\nimport org.everrest.core.RequestFilter;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.ITestContext;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests of {@link DefaultHttpJsonRequest}.\n *\n * @author Yevhenii Voevodin\n */\n@Listeners({MockitoTestNGListener.class, EverrestJetty.class})\npublic class DefaultHttpJsonRequestTest {\n\n  @SuppressWarnings(\"unused\") // used by EverrestJetty\n  private static final EnvironmentFilter FILTER = new EnvironmentFilter();\n\n  @SuppressWarnings(\"unused\") // used by EverrestJetty\n  private static final ApiExceptionMapper EXCEPTION_MAPPER = new ApiExceptionMapper();\n\n  @SuppressWarnings(\"unused\") // used by EverrestJetty\n  private static final TestService TEST_SERVICE = new TestService();\n\n  private static final Subject TEST_SUBJECT =\n      new SubjectImpl(\"name\", Collections.emptyList(), \"id\", \"token\", false);\n  private static final String DEFAULT_URL = \"http://localhost:8080\";\n\n  @Captor private ArgumentCaptor<Map<String, String>> mapCaptor;\n\n  @Captor private ArgumentCaptor<List<Link>> listCaptor;\n\n  private DefaultHttpJsonRequest request;\n\n  @BeforeMethod\n  private void prepareDefaultResponse() throws Exception {\n    request = spy(new DefaultHttpJsonRequest(DEFAULT_URL));\n    request.setMethod(\"GET\");\n    prepareResponse(\"\");\n  }\n\n  @Test\n  public void shouldUseUrlAndMethodFromTheLinks() throws Exception {\n    final Link link = createLink(\"POST\", DEFAULT_URL, \"rel\");\n    final DefaultHttpJsonRequest request = spy(new DefaultHttpJsonRequest(link));\n    doReturn(new DefaultHttpJsonResponse(\"\", 200))\n        .when(request)\n        .doRequest(\n            anyInt(),\n            anyString(),\n            anyString(),\n            nullable(Object.class),\n            nullable(List.class),\n            nullable(String.class),\n            nullable(List.class));\n    request.request();\n\n    verify(request).doRequest(0, DEFAULT_URL, \"POST\", null, null, null, null);\n  }\n\n  @Test\n  public void shouldBeAbleToMakeRequest() throws Exception {\n    final Object body = new JsonArrayImpl<>(singletonList(\"element\"));\n\n    request\n        .setMethod(\"PUT\")\n        .setBody(body)\n        .setTimeout(10_000_000)\n        .addQueryParam(\"name\", \"value\")\n        .addQueryParam(\"name2\", \"value2\")\n        .addHeader(\"Connection\", \"close\")\n        .request();\n\n    verify(request)\n        .doRequest(\n            10_000_000,\n            \"http://localhost:8080\",\n            \"PUT\",\n            body,\n            asList(Pair.of(\"name\", \"value\"), Pair.of(\"name2\", \"value2\")),\n            null,\n            asList(Pair.of(\"Connection\", \"close\")));\n  }\n\n  @Test\n  public void shouldBeAbleToUseStringMapAsRequestBody() throws Exception {\n    final Map<String, String> body = new HashMap<>();\n    body.put(\"name\", \"value\");\n    body.put(\"name2\", \"value2\");\n\n    request.setMethod(\"POST\").setBody(body).request();\n\n    verify(request)\n        .doRequest(\n            eq(0),\n            eq(\"http://localhost:8080\"),\n            eq(\"POST\"),\n            mapCaptor.capture(),\n            eq(null),\n            eq(null),\n            eq(null));\n    assertTrue(mapCaptor.getValue() instanceof JsonStringMap);\n    assertEquals(mapCaptor.getValue(), body);\n  }\n\n  @Test\n  public void shouldBeAbleToUseListOfJsonSerializableElementsAsRequestBody() throws Exception {\n    final List<Link> body = singletonList(createLink(\"POST\", \"http://localhost:8080\", \"rel\"));\n\n    request.setMethod(\"POST\").setBody(body).request();\n\n    verify(request)\n        .doRequest(\n            eq(0),\n            eq(\"http://localhost:8080\"),\n            eq(\"POST\"),\n            listCaptor.capture(),\n            eq(null),\n            eq(null),\n            eq(null));\n    assertTrue(listCaptor.getValue() instanceof JsonArray);\n    assertEquals(listCaptor.getValue(), body);\n  }\n\n  @Test\n  public void defaultMethodIsGet() throws Exception {\n    request.request();\n    verify(request).doRequest(0, DEFAULT_URL, HttpMethod.GET, null, null, null, null);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionIfSetMethodArgumentIsNull() throws Exception {\n    new DefaultHttpJsonRequest(\"http://localhost:8080\").setMethod(null);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionWhenObjectBodyIsNull() throws Exception {\n    final Object obj = null;\n\n    new DefaultHttpJsonRequest(\"http://localhost:8080\").setBody(obj);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionWhenListBodyIsNull() throws Exception {\n    final List<String> list = null;\n\n    new DefaultHttpJsonRequest(\"http://localhost:8080\").setBody(list);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionWhenMapBodyIsNull() throws Exception {\n    final Map<String, String> map = null;\n\n    new DefaultHttpJsonRequest(\"http://localhost:8080\").setBody(map);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionWhenQueryParamNameIsNull() throws Exception {\n    new DefaultHttpJsonRequest(\"http://localhost:8080\").addQueryParam(null, \"value\");\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionWhenQueryParamValueIsNull() throws Exception {\n    new DefaultHttpJsonRequest(\"http://localhost:8080\").addQueryParam(\"name\", null);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionWhenQueryParamsAreNull() throws Exception {\n    new DefaultHttpJsonRequest(\"http://localhost:8080\").addQueryParams(null);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionWhenHeaderNameIsNull() throws Exception {\n    new DefaultHttpJsonRequest(\"http://localhost:8080\").addHeader(null, \"close\");\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionWhenHeaderValueIsNull() throws Exception {\n    new DefaultHttpJsonRequest(\"http://localhost:8080\").addHeader(\"Connection\", null);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionWhenHeadersAreNull() throws Exception {\n    new DefaultHttpJsonRequest(\"http://localhost:8080\").addHeaders(null);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionWhenLinkHrefIsNull() throws Exception {\n    new DefaultHttpJsonRequest(createLink(\"GET\", null, null));\n  }\n\n  @Test(expectedExceptions = BadRequestException.class)\n  public void shouldThrowBadRequestExceptionWhenResponseCodeIs400(ITestContext ctx)\n      throws Exception {\n    new DefaultHttpJsonRequest(getUrl(ctx) + \"/400/response-code-test\").useGetMethod().request();\n  }\n\n  @Test(expectedExceptions = UnauthorizedException.class)\n  public void shouldThrowUnauthorizedExceptionWhenResponseCodeIs401(ITestContext ctx)\n      throws Exception {\n    new DefaultHttpJsonRequest(getUrl(ctx) + \"/401/response-code-test\").useGetMethod().request();\n  }\n\n  @Test(expectedExceptions = ForbiddenException.class)\n  public void shouldThrowForbiddenExceptionWhenResponseCodeIs403(ITestContext ctx)\n      throws Exception {\n    new DefaultHttpJsonRequest(getUrl(ctx) + \"/403/response-code-test\").useGetMethod().request();\n  }\n\n  @Test(expectedExceptions = NotFoundException.class)\n  public void shouldThrowNotFoundExceptionWhenResponseCodeIs404(ITestContext ctx) throws Exception {\n    new DefaultHttpJsonRequest(getUrl(ctx) + \"/404/response-code-test\").useGetMethod().request();\n  }\n\n  @Test(expectedExceptions = ConflictException.class)\n  public void shouldThrowConflictExceptionWhenResponseCodeIs409(ITestContext ctx) throws Exception {\n    new DefaultHttpJsonRequest(getUrl(ctx) + \"/409/response-code-test\").useGetMethod().request();\n  }\n\n  @Test(expectedExceptions = ServerException.class)\n  public void shouldThrowServerExceptionWhenResponseCodeIs500(ITestContext ctx) throws Exception {\n    new DefaultHttpJsonRequest(getUrl(ctx) + \"/500/response-code-test\").useGetMethod().request();\n  }\n\n  @Test(expectedExceptions = ServerException.class)\n  public void shouldThrowServerExceptionWhenResponseWithAnyOtherResponseCode(ITestContext ctx)\n      throws Exception {\n    new DefaultHttpJsonRequest(getUrl(ctx) + \"/501/response-code-test\").useGetMethod().request();\n  }\n\n  @Test(expectedExceptions = IOException.class)\n  public void shouldThrowIOExceptionIfServerReturnsTypeDifferentFromApplicationJson(\n      ITestContext ctx) throws Exception {\n    new DefaultHttpJsonRequest(getUrl(ctx) + \"/text-plain\").useGetMethod().request();\n  }\n\n  @Test\n  public void shouldThrowIOExceptionIfServerDoesNotReturnContentTypeOnNoContentResponse(\n      ITestContext ctx) throws Exception {\n    new DefaultHttpJsonRequest(getUrl(ctx) + \"/no-content\").useDeleteMethod().request();\n  }\n\n  @Test\n  public void shouldReadJsonObjectBodyAsString(ITestContext ctx) throws Exception {\n    final DefaultHttpJsonRequest request =\n        new DefaultHttpJsonRequest(getUrl(ctx) + \"/application-json\");\n    request.useGetMethod();\n\n    assertEquals(request.request().asString(), TestService.JSON_OBJECT);\n  }\n\n  @Test\n  public void shouldEncodeRequestUrlInDefaultHttpJsonRequestAndDecodeInService(ITestContext ctx)\n      throws Exception {\n    final String base = getUrl(ctx) + \"/decode\";\n    final HttpJsonResponse response =\n        new DefaultHttpJsonRequest(base)\n            .addQueryParam(\"query\", \"some white spaces !!\")\n            .useGetMethod()\n            .request();\n\n    final String url = base + \"?query=some white spaces !!\";\n\n    assertEquals(url, response.asString());\n  }\n\n  @Test\n  public void shouldSendJsonObjectBody(ITestContext ctx) throws Exception {\n    final DefaultHttpJsonRequest request =\n        new DefaultHttpJsonRequest(getUrl(ctx) + \"/application-json\");\n\n    final Link link = LinksHelper.createLink(\"GET\", \"localhost:8080/application-json\", \"rel\");\n    final List<Link> links =\n        request\n            .usePostMethod()\n            .setBody(Collections.singletonList(link))\n            .request()\n            .asList(Link.class);\n\n    assertEquals(links, Collections.singletonList(link));\n  }\n\n  @Test\n  public void shouldSendQueryParameters(ITestContext ctx) throws Exception {\n    final DefaultHttpJsonRequest request =\n        new DefaultHttpJsonRequest(getUrl(ctx) + \"/query-parameters\");\n\n    final Map<String, String> map =\n        request\n            .usePutMethod()\n            .addQueryParam(\"param1\", \"value1\")\n            .addQueryParam(\"param2\", \"value2\")\n            .request()\n            .asProperties();\n\n    assertEquals(map, ImmutableMap.of(\"param1\", \"value1\", \"param2\", \"value2\"));\n  }\n\n  @Test\n  public void shouldSendMultipleQueryParameters(ITestContext ctx) throws Exception {\n    final DefaultHttpJsonRequest request =\n        new DefaultHttpJsonRequest(getUrl(ctx) + \"/multi-query-parameters\");\n\n    @SuppressWarnings(\"unchecked\")\n    final Map<String, List<String>> map =\n        request\n            .usePutMethod()\n            .addQueryParam(\"param1\", \"value1\")\n            .addQueryParam(\"param1\", \"value2\")\n            .request()\n            .as(Map.class, new TypeToken<Map<String, List<String>>>() {}.getType());\n\n    assertEquals(map.get(\"param1\"), asList(\"value1\", \"value2\"));\n  }\n\n  @Test\n  public void shouldUseTokenFromCurrentContextForAuthorization(ITestContext ctx) throws Exception {\n    final EnvironmentContext context = new EnvironmentContext();\n    context.setSubject(TEST_SUBJECT);\n    EnvironmentContext.setCurrent(context);\n\n    new DefaultHttpJsonRequest(getUrl(ctx) + \"/token\").usePostMethod().request();\n  }\n\n  @Filter\n  public static class EnvironmentFilter implements RequestFilter {\n\n    public void doFilter(GenericContainerRequest request) {\n      EnvironmentContext.getCurrent().setSubject(TEST_SUBJECT);\n    }\n  }\n\n  private String getUrl(ITestContext ctx) {\n    return \"http://localhost:\" + ctx.getAttribute(EverrestJetty.JETTY_PORT) + \"/rest/test\";\n  }\n\n  private void prepareResponse(String response) throws Exception {\n    lenient()\n        .doReturn(new DefaultHttpJsonResponse(response, 200))\n        .when(request)\n        .doRequest(\n            anyInt(),\n            anyString(),\n            anyString(),\n            nullable(Object.class),\n            nullable(List.class),\n            nullable(String.class),\n            nullable(List.class));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/rest/DefaultHttpJsonResponseTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static java.util.Collections.singleton;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.core.util.LinksHelper.createLink;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.reflect.TypeToken;\nimport java.io.IOException;\nimport java.util.Set;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.eclipse.che.dto.server.JsonArrayImpl;\nimport org.eclipse.che.dto.server.JsonStringMapImpl;\nimport org.testng.annotations.Test;\n\n/**\n * Tests of {@link DefaultHttpJsonResponse}.\n *\n * @author Yevhenii Voevodin\n */\npublic class DefaultHttpJsonResponseTest {\n\n  @Test\n  public void shouldReturnStringAsItIsIfStringIsRequested() throws Exception {\n    final DefaultHttpJsonResponse response = new DefaultHttpJsonResponse(\"string response\", 200);\n\n    assertEquals(response.asString(), \"string response\");\n  }\n\n  @Test\n  public void shouldReturnJsonSerializableInstanceIfItWasRequested() throws Exception {\n    final Link testLink = createLink(\"POST\", \"http://localhost:8080\", \"rel\");\n    final DefaultHttpJsonResponse response =\n        new DefaultHttpJsonResponse(DtoFactory.getInstance().toJson(testLink), 200);\n\n    assertEquals(response.asDto(Link.class), testLink);\n  }\n\n  @Test\n  public void shouldDeserializeResponseToGivenType() throws Exception {\n    final String responseBody =\n        DtoFactory.getInstance().toJson(new JsonArrayImpl<>(singletonList(\"element\")));\n    final DefaultHttpJsonResponse response = new DefaultHttpJsonResponse(responseBody, 200);\n\n    assertEquals(\n        response.as(Set.class, new TypeToken<Set<String>>() {}.getType()), singleton(\"element\"));\n  }\n\n  @Test\n  public void shouldBeAbleToRequestProperties() throws Exception {\n    final String responseBody =\n        DtoFactory.getInstance().toJson(new JsonStringMapImpl<>(singletonMap(\"key\", \"value\")));\n    final DefaultHttpJsonResponse response = new DefaultHttpJsonResponse(responseBody, 200);\n\n    assertEquals(response.asProperties(), singletonMap(\"key\", \"value\"));\n  }\n\n  @Test\n  public void shouldBeAbleToRequestListOfJsonSerializableElements() throws Exception {\n    final Link testLink = createLink(\"POST\", \"http://localhost:8080\", \"rel\");\n    final String responseBody =\n        DtoFactory.getInstance().toJson(new JsonArrayImpl<>(singletonList(testLink)));\n    final DefaultHttpJsonResponse response = new DefaultHttpJsonResponse(responseBody, 200);\n\n    assertEquals(response.asList(Link.class), singletonList(testLink));\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionWhenClazzIsNull() throws Exception {\n    new DefaultHttpJsonResponse(\"{}\", 200).as(null, null);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNullPointerExceptionWhenDtoInterfaceIsNull() throws Exception {\n    new DefaultHttpJsonResponse(\"{}\", 200).asDto(null);\n  }\n\n  @Test(expectedExceptions = IOException.class)\n  public void shouldThrowServerExceptionWhenParsingNotValidJsonContent() throws Exception {\n    new DefaultHttpJsonResponse(\"not valid json\", 200).as(Set.class, null);\n  }\n\n  @Test\n  public void shouldReturnCorrectResponseCode() {\n    final DefaultHttpJsonResponse response = new DefaultHttpJsonResponse(\"not valid json\", 201);\n\n    assertEquals(response.getResponseCode(), 201);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/rest/LinkHeaderGenerationTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static com.google.common.collect.Sets.symmetricDifference;\nimport static io.restassured.RestAssured.given;\nimport static java.util.Arrays.asList;\nimport static org.eclipse.che.commons.lang.UrlUtils.getQueryParameters;\nimport static org.everrest.assured.JettyHttpServer.ADMIN_USER_NAME;\nimport static org.everrest.assured.JettyHttpServer.ADMIN_USER_PASSWORD;\nimport static org.everrest.assured.JettyHttpServer.SECURE_PATH;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\n\nimport io.restassured.response.Response;\nimport java.net.URI;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.api.core.util.PagingUtil;\nimport org.everrest.assured.EverrestJetty;\nimport org.testng.ITestContext;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests of {@link Service#createLinkHeader} methods.\n *\n * @author Yevhenii Voevodin\n */\n@Listeners(EverrestJetty.class)\npublic class LinkHeaderGenerationTest {\n\n  @SuppressWarnings(\"unused\") // used by EverrestJetty\n  private static final TestService TEST_SERVICE = new TestService();\n\n  @Test\n  public void linksHeaderShouldBeCorrectlyGenerated(ITestContext ctx) throws Exception {\n    final Response response =\n        given()\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .contentType(\"application/json\")\n            .when()\n            .get(SECURE_PATH + \"/test/paging/test-path-param?query-param=test-query-param\");\n\n    assertEquals(response.getStatusCode(), 200);\n\n    final String headerValue = response.getHeader(\"Link\");\n    assertNotNull(headerValue, \"Link header is missing in the response\");\n\n    final Map<String, String> relToLinkMap = PagingUtil.parseLinkHeader(headerValue);\n    final Set<String> expectedRels = new HashSet<>(asList(\"first\", \"last\", \"prev\", \"next\"));\n    assertEquals(\n        relToLinkMap.keySet(),\n        expectedRels,\n        \"Rels are different \" + symmetricDifference(expectedRels, relToLinkMap.keySet()));\n\n    final String expectedUri =\n        \"http://localhost:\"\n            + ctx.getAttribute(EverrestJetty.JETTY_PORT)\n            + \"/rest/private/test/paging/test-path-param\";\n    for (String link : relToLinkMap.values()) {\n      final URI uri = URI.create(link);\n      final Map<String, List<String>> params = getQueryParameters(uri.toURL());\n      assertEquals(params.size(), 3);\n      assertNotNull(params.get(\"skipCount\"));\n      assertNotNull(params.get(\"maxItems\"));\n      assertEquals(params.get(\"query-param\").get(0), \"test-query-param\");\n      assertEquals(link, expectedUri + '?' + uri.getQuery());\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/rest/RemoteServiceDescriptorTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertNull;\nimport static org.testng.Assert.assertTrue;\n\nimport jakarta.ws.rs.DefaultValue;\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.HttpMethod;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.QueryParam;\nimport jakarta.ws.rs.core.MediaType;\nimport java.util.List;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.rest.annotations.Description;\nimport org.eclipse.che.api.core.rest.annotations.GenerateLink;\nimport org.eclipse.che.api.core.rest.annotations.Required;\nimport org.eclipse.che.api.core.rest.annotations.Valid;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceDescriptor;\nimport org.eclipse.che.commons.test.mockito.answer.SelfReturningAnswer;\nimport org.everrest.assured.EverrestJetty;\nimport org.mockito.Mock;\nimport org.mockito.Spy;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.ITestContext;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\n@Listeners({MockitoTestNGListener.class, EverrestJetty.class})\npublic class RemoteServiceDescriptorTest {\n  @SuppressWarnings(\"unused\") // used by EverrestJetty\n  private static final EchoService service = new EchoService();\n\n  private static final String SERVICE_PATH = \"/test\";\n  private static final String SERVICE_DESCRIPTION = \"test service\";\n\n  @Spy private DefaultHttpJsonRequestFactory requestFactory;\n  private HttpJsonRequest request;\n  @Mock private HttpJsonResponse response;\n\n  private String serverUrl;\n  private RemoteServiceDescriptor remoteServiceDescriptor;\n\n  @BeforeClass\n  public void setUp(ITestContext ctx) throws Exception {\n    serverUrl = getServerUrl(ctx);\n    request = mock(HttpJsonRequest.class, new SelfReturningAnswer());\n    lenient().when(request.request()).thenReturn(response);\n  }\n\n  @Test\n  public void shouldBeAbleToReturnServiceDescriptors() throws Exception {\n    remoteServiceDescriptor = new RemoteServiceDescriptor(serverUrl + SERVICE_PATH, requestFactory);\n\n    final ServiceDescriptor serviceDescriptor = remoteServiceDescriptor.getServiceDescriptor();\n\n    assertNotNull(serviceDescriptor);\n    assertEquals(serviceDescriptor.getHref(), serverUrl + SERVICE_PATH);\n    assertEquals(serviceDescriptor.getDescription(), SERVICE_DESCRIPTION);\n    assertEquals(serviceDescriptor.getLinks().size(), 1);\n  }\n\n  @Test(expectedExceptions = ServerException.class, expectedExceptionsMessageRegExp = \"test error\")\n  public void shouldThrowServerExceptionIfServiceNotFound() throws Exception {\n    doReturn(request).when(requestFactory).fromUrl(anyString());\n    when(request.request()).thenThrow(new NotFoundException(\"test error\"));\n\n    remoteServiceDescriptor =\n        new RemoteServiceDescriptor(serverUrl + \"/non/existing/path\", requestFactory);\n\n    remoteServiceDescriptor.getServiceDescriptor();\n  }\n\n  @Test\n  public void shouldBeAbleToConfirmAvailability() throws Exception {\n    remoteServiceDescriptor = new RemoteServiceDescriptor(serverUrl + SERVICE_PATH, requestFactory);\n\n    assertTrue(remoteServiceDescriptor.isAvailable());\n  }\n\n  @Test\n  public void shouldReturnFalseOnNonAvailableServiceAvailabilityCheck() {\n    remoteServiceDescriptor =\n        new RemoteServiceDescriptor(serverUrl + \"/non/existing/path\", requestFactory);\n\n    assertFalse(remoteServiceDescriptor.isAvailable());\n  }\n\n  @Test\n  public void shouldReturnNullIfLinkWithRequiredRelDoesNotExist() throws Exception {\n    remoteServiceDescriptor = new RemoteServiceDescriptor(serverUrl + SERVICE_PATH, requestFactory);\n\n    assertNull(remoteServiceDescriptor.getLink(\"echo2\"));\n  }\n\n  @Test\n  public void shouldBeAbleToReturnLinks() throws Exception {\n    remoteServiceDescriptor = new RemoteServiceDescriptor(serverUrl + SERVICE_PATH, requestFactory);\n\n    final List<Link> links = remoteServiceDescriptor.getLinks();\n\n    assertEquals(links.size(), 1);\n    assertEquals(links.get(0).getMethod(), HttpMethod.GET);\n    assertEquals(links.get(0).getHref(), serverUrl + SERVICE_PATH + \"/my_method\");\n    assertEquals(links.get(0).getProduces(), MediaType.TEXT_PLAIN);\n  }\n\n  @Description(SERVICE_DESCRIPTION)\n  @Path(SERVICE_PATH)\n  public static class EchoService extends Service {\n    @GET\n    @Path(\"my_method\")\n    @GenerateLink(rel = \"echo\")\n    @Produces(MediaType.TEXT_PLAIN)\n    public String echo(\n        @Description(\"some text\")\n            @Required\n            @Valid({\"a\", \"b\"})\n            @DefaultValue(\"a\")\n            @QueryParam(\"text\")\n            String test) {\n      return test;\n    }\n  }\n\n  private String getServerUrl(ITestContext ctx) {\n    return \"http://localhost:\" + ctx.getAttribute(EverrestJetty.JETTY_PORT) + \"/rest\";\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/rest/RuntimeExceptionMapperTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static io.restassured.RestAssured.expect;\n\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.core.Response;\nimport org.everrest.assured.EverrestJetty;\nimport org.hamcrest.Matchers;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(value = {EverrestJetty.class})\npublic class RuntimeExceptionMapperTest {\n  @Path(\"/runtime-exception\")\n  public static class RuntimeExceptionService {\n    @GET\n    @Path(\"/re-empty-msg\")\n    public String reWithEmptyMessage() {\n      throw new NullPointerException();\n    }\n  }\n\n  RuntimeExceptionService service;\n\n  RuntimeExceptionMapper mapper;\n\n  @Test\n  public void shouldHandleRuntimeException() {\n    final String expectedErrorMessage =\n        \"{\\\"message\\\":\\\"Internal Server Error occurred, error time:\";\n\n    expect()\n        .statusCode(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode())\n        .body(Matchers.startsWith(expectedErrorMessage))\n        .when()\n        .get(\"/runtime-exception/re-empty-msg\");\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/rest/ServiceDescriptorTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static org.everrest.core.ApplicationContext.anApplicationContext;\n\nimport jakarta.ws.rs.DefaultValue;\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.HttpMethod;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.QueryParam;\nimport jakarta.ws.rs.core.Application;\nimport jakarta.ws.rs.core.MediaType;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport org.eclipse.che.api.core.rest.annotations.Description;\nimport org.eclipse.che.api.core.rest.annotations.GenerateLink;\nimport org.eclipse.che.api.core.rest.annotations.Required;\nimport org.eclipse.che.api.core.rest.annotations.Valid;\nimport org.eclipse.che.api.core.rest.shared.ParameterType;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.core.rest.shared.dto.LinkParameter;\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceDescriptor;\nimport org.everrest.core.ApplicationContext;\nimport org.everrest.core.ResourceBinder;\nimport org.everrest.core.impl.ApplicationProviderBinder;\nimport org.everrest.core.impl.ContainerResponse;\nimport org.everrest.core.impl.EverrestConfiguration;\nimport org.everrest.core.impl.EverrestProcessor;\nimport org.everrest.core.impl.ProviderBinder;\nimport org.everrest.core.impl.RequestDispatcher;\nimport org.everrest.core.impl.RequestHandlerImpl;\nimport org.everrest.core.impl.ResourceBinderImpl;\nimport org.everrest.core.tools.DependencySupplierImpl;\nimport org.everrest.core.tools.ResourceLauncher;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeTest;\nimport org.testng.annotations.Test;\n\n/**\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n */\npublic class ServiceDescriptorTest {\n  final String BASE_URI = \"http://localhost/service\";\n  final String SERVICE_URI = BASE_URI + \"/test\";\n\n  @Description(\"test service\")\n  @Path(\"test\")\n  public static class EchoService extends Service {\n    @GET\n    @Path(\"my_method\")\n    @GenerateLink(rel = \"echo\")\n    @Produces(MediaType.TEXT_PLAIN)\n    public String echo(\n        @Description(\"some text\")\n            @Required\n            @Valid({\"a\", \"b\"})\n            @DefaultValue(\"a\")\n            @QueryParam(\"text\")\n            String test) {\n      return test;\n    }\n  }\n\n  public static class Deployer extends Application {\n    private final Set<Object> singletons;\n    private final Set<Class<?>> classes;\n\n    public Deployer() {\n      classes = new HashSet<>(1);\n      classes.add(EchoService.class);\n      singletons = Collections.emptySet();\n    }\n\n    @Override\n    public Set<Class<?>> getClasses() {\n      return classes;\n    }\n\n    @Override\n    public Set<Object> getSingletons() {\n      return singletons;\n    }\n  }\n\n  ResourceLauncher launcher;\n\n  @BeforeTest\n  public void setUp() throws Exception {\n    DependencySupplierImpl dependencies = new DependencySupplierImpl();\n    ResourceBinder resources = new ResourceBinderImpl();\n    ProviderBinder providers = new ApplicationProviderBinder();\n    EverrestProcessor processor =\n        new EverrestProcessor(\n            new EverrestConfiguration(),\n            dependencies,\n            new RequestHandlerImpl(new RequestDispatcher(resources), providers),\n            null);\n    launcher = new ResourceLauncher(processor);\n    processor.addApplication(new Deployer());\n    ApplicationContext.setCurrent(anApplicationContext().withProviders(providers).build());\n    System.out.println(\"initialized\");\n  }\n\n  @Test\n  public void testDescription() throws Exception {\n    Assert.assertEquals(getDescriptor().getDescription(), \"test service\");\n  }\n\n  @Test\n  public void testServiceLocation() throws Exception {\n    Assert.assertEquals(getDescriptor().getHref(), SERVICE_URI);\n  }\n\n  @Test\n  public void testLinkAvailable() throws Exception {\n    Assert.assertEquals(getDescriptor().getLinks().size(), 1);\n  }\n\n  @Test\n  public void testLinkInfo() throws Exception {\n    Link link = getLink(\"echo\");\n    Assert.assertEquals(link.getMethod(), HttpMethod.GET);\n    Assert.assertEquals(link.getHref(), SERVICE_URI + \"/my_method\");\n    Assert.assertEquals(link.getProduces(), MediaType.TEXT_PLAIN);\n  }\n\n  @Test\n  public void testLinkParameters() throws Exception {\n    Link link = getLink(\"echo\");\n    List<LinkParameter> parameters = link.getParameters();\n    Assert.assertEquals(parameters.size(), 1);\n    LinkParameter linkParameter = parameters.get(0);\n    Assert.assertEquals(linkParameter.getDefaultValue(), \"a\");\n    Assert.assertEquals(linkParameter.getDescription(), \"some text\");\n    Assert.assertEquals(linkParameter.getName(), \"text\");\n    Assert.assertEquals(linkParameter.getType(), ParameterType.String);\n    Assert.assertTrue(linkParameter.isRequired());\n    List<String> valid = linkParameter.getValid();\n    Assert.assertEquals(valid.size(), 2);\n    Assert.assertTrue(valid.contains(\"a\"));\n    Assert.assertTrue(valid.contains(\"b\"));\n  }\n\n  private Link getLink(String rel) throws Exception {\n    List<Link> links = getDescriptor().getLinks();\n    for (Link link : links) {\n      if (link.getRel().equals(rel)) {\n        return link;\n      }\n    }\n    return null;\n  }\n\n  private ServiceDescriptor getDescriptor() throws Exception {\n    String path = SERVICE_URI;\n    ContainerResponse response =\n        launcher.service(HttpMethod.OPTIONS, path, BASE_URI, null, null, null, null);\n    Assert.assertEquals(response.getStatus(), 200);\n    return (ServiceDescriptor) response.getEntity();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/rest/TestService.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest;\n\nimport static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;\nimport static jakarta.ws.rs.core.MediaType.TEXT_PLAIN;\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\n\nimport jakarta.ws.rs.DELETE;\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.HeaderParam;\nimport jakarta.ws.rs.POST;\nimport jakarta.ws.rs.PUT;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.PathParam;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.QueryParam;\nimport jakarta.ws.rs.core.Context;\nimport jakarta.ws.rs.core.HttpHeaders;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.core.UriInfo;\nimport java.net.URLDecoder;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.eclipse.che.dto.server.JsonArrayImpl;\n\n/**\n * Test service class, used in {@link DefaultHttpJsonRequestTest}.\n *\n * @author Yevhenii Voevodin\n */\n@Path(\"/test\")\npublic class TestService extends Service {\n\n  public static final String JSON_OBJECT = new JsonArrayImpl<>(singletonList(\"element\")).toJson();\n\n  @GET\n  @Path(\"/{response-code}/response-code-test\")\n  public Response getRequestedResponseCode(@PathParam(\"response-code\") int responseCode) {\n    return Response.status(responseCode)\n        .entity(DtoFactory.newDto(ServiceError.class).withMessage(\"response code test method\"))\n        .build();\n  }\n\n  @GET\n  @Path(\"/text-plain\")\n  @Produces(TEXT_PLAIN)\n  public String getTextPlain() {\n    return \"this is text/plain message\";\n  }\n\n  @GET\n  @Path(\"/application-json\")\n  @Produces(APPLICATION_JSON)\n  public String getJsonObject() {\n    return JSON_OBJECT;\n  }\n\n  @POST\n  @Path(\"/application-json\")\n  @Produces(APPLICATION_JSON)\n  public List<Link> receiveJsonObject(List<Link> elements) {\n    return elements;\n  }\n\n  @PUT\n  @Path(\"/query-parameters\")\n  @Produces(APPLICATION_JSON)\n  public Map<String, String> queryParamsTest(\n      @QueryParam(\"param1\") String qp1, @QueryParam(\"param2\") String qp2) {\n    final Map<String, String> map = new HashMap<>();\n    map.put(\"param1\", qp1);\n    map.put(\"param2\", qp2);\n    return map;\n  }\n\n  @PUT\n  @Path(\"/multi-query-parameters\")\n  @Produces(APPLICATION_JSON)\n  public Map<String, List<String>> queryParamsTest(@QueryParam(\"param1\") List<String> values) {\n    final Map<String, List<String>> map = new HashMap<>();\n    map.put(\"param1\", values);\n    return map;\n  }\n\n  @POST\n  @Path(\"/token\")\n  public void checkAuthorization(@HeaderParam(HttpHeaders.AUTHORIZATION) String token)\n      throws UnauthorizedException {\n    if (!EnvironmentContext.getCurrent().getSubject().getToken().equals(token)) {\n      throw new UnauthorizedException(\n          \"Token '\" + token + \"' it is different from token in EnvironmentContext\");\n    }\n  }\n\n  @GET\n  @Path(\"/decode\")\n  @Produces(APPLICATION_JSON)\n  public String getUriInfo(@QueryParam(\"query\") String query, @Context UriInfo uriInfo) {\n    return URLDecoder.decode(uriInfo.getRequestUri().toString());\n  }\n\n  @GET\n  @Path(\"/paging/{value}\")\n  @Produces(APPLICATION_JSON)\n  public Response getStringList(\n      @PathParam(\"value\") String value, @QueryParam(\"query-param\") String param) {\n    final Page<String> page = new Page<>(asList(\"item3\", \"item4\", \"item5\"), 3, 3, 7);\n\n    return Response.ok()\n        .entity(page.getItems())\n        .header(\n            \"Link\",\n            createLinkHeader(page, \"getStringList\", singletonMap(\"query-param\", param), value))\n        .build();\n  }\n\n  @DELETE\n  @Path(\"no-content\")\n  public Response noContent() {\n    return Response.noContent().build();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/rest/it/ApiInfoProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.rest.it;\n\nimport static org.testng.Assert.*;\n\nimport org.eclipse.che.api.core.rest.ApiInfoProvider;\nimport org.eclipse.che.api.core.rest.shared.dto.ApiInfo;\nimport org.testng.annotations.Test;\n\npublic class ApiInfoProviderTest {\n\n  @Test\n  public void testGet() {\n    // given\n    ApiInfoProvider provider = new ApiInfoProvider(\"my custom build\");\n    // when\n    ApiInfo apiInfo = provider.get();\n    // then\n    assertEquals(apiInfo.getBuildInfo(), \"my custom build\");\n    assertNotNull(apiInfo.getScmRevision());\n    assertNotNull(apiInfo.getSpecificationTitle());\n    assertNotNull(apiInfo.getSpecificationVersion());\n    assertNotNull(apiInfo.getImplementationVendor());\n    assertNotNull(apiInfo.getImplementationVersion());\n    assertEquals(apiInfo.getScmRevision().length(), 40);\n    assertEquals(apiInfo.getSpecificationTitle(), \"Che REST API\");\n    assertEquals(apiInfo.getSpecificationVersion(), \"1.0-beta2\");\n    assertEquals(apiInfo.getImplementationVendor(), \"Red Hat, Inc.\");\n    assertTrue(apiInfo.getImplementationVersion().length() > 4);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/util/CompositeLineConsumerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.assertTrue;\n\nimport java.nio.channels.ClosedByInterruptException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport org.eclipse.che.api.core.util.lineconsumer.ConsumerAlreadyClosedException;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Mykola Morhun\n */\n@Listeners(value = {MockitoTestNGListener.class})\npublic class CompositeLineConsumerTest {\n\n  @Mock private LineConsumer lineConsumer1;\n  @Mock private LineConsumer lineConsumer2;\n  @Mock private LineConsumer lineConsumer3;\n\n  private CompositeLineConsumer compositeLineConsumer;\n\n  private LineConsumer subConsumers[];\n\n  @BeforeMethod\n  public void beforeMethod() throws Exception {\n    subConsumers = new LineConsumer[] {lineConsumer1, lineConsumer2, lineConsumer3};\n    compositeLineConsumer = new CompositeLineConsumer(subConsumers);\n  }\n\n  @Test\n  public void shouldWriteMessageIntoEachConsumer() throws Exception {\n    // given\n    final String message = \"Test line\";\n\n    // when\n    compositeLineConsumer.writeLine(message);\n\n    // then\n    for (LineConsumer subConsumer : subConsumers) {\n      verify(subConsumer).writeLine(eq(message));\n    }\n  }\n\n  @Test\n  public void shouldNotWriteIntoSubConsumersAfterClosingCompositeConsumer() throws Exception {\n    // given\n    final String message = \"Test line\";\n\n    // when\n    compositeLineConsumer.close();\n    compositeLineConsumer.writeLine(message);\n\n    // then\n    for (LineConsumer subConsumer : subConsumers) {\n      verify(subConsumer, never()).writeLine(anyString());\n    }\n  }\n\n  @DataProvider(name = \"subConsumersExceptions\")\n  public Object[][] subConsumersExceptions() {\n    return new Throwable[][] {\n      {new ConsumerAlreadyClosedException(\"Error\")},\n    };\n  }\n\n  @Test(dataProvider = \"subConsumersExceptions\")\n  public void shouldCloseSubConsumerOnException(Throwable exception) throws Exception {\n    // given\n    final String message = \"Test line\";\n    final String message2 = \"Test line2\";\n\n    LineConsumer closedConsumer = mock(LineConsumer.class);\n    doThrow(exception).when(closedConsumer).writeLine(anyString());\n\n    compositeLineConsumer = new CompositeLineConsumer(appendTo(subConsumers, closedConsumer));\n\n    // when\n    compositeLineConsumer.writeLine(message);\n    compositeLineConsumer.writeLine(message2);\n\n    // then\n    verify(closedConsumer, never()).writeLine(eq(message2));\n    for (LineConsumer consumer : subConsumers) {\n      verify(consumer).writeLine(eq(message2));\n    }\n  }\n\n  @Test\n  public void shouldDoNothingOnWriteLineIfAllSubConsumersAreClosed() throws Exception {\n    // given\n    final String message = \"Test line\";\n    LineConsumer[] closedConsumers = subConsumers;\n    for (LineConsumer consumer : closedConsumers) {\n      doThrow(ConsumerAlreadyClosedException.class).when(consumer).writeLine(anyString());\n    }\n    compositeLineConsumer = new CompositeLineConsumer(closedConsumers);\n\n    // when\n    compositeLineConsumer.writeLine(\"Error\");\n    compositeLineConsumer.writeLine(message);\n\n    // then\n    for (LineConsumer subConsumer : closedConsumers) {\n      verify(subConsumer, never()).writeLine(eq(message));\n    }\n  }\n\n  @Test\n  public void stopsWritingOnceInterrupted() throws Exception {\n    doThrow(new ClosedByInterruptException()).when(lineConsumer2).writeLine(\"test\");\n\n    compositeLineConsumer.writeLine(\"test\");\n\n    assertTrue(Thread.interrupted());\n    verify(lineConsumer1).writeLine(\"test\");\n    verify(lineConsumer2).writeLine(\"test\");\n    verify(lineConsumer3, never()).writeLine(\"test\");\n  }\n\n  private LineConsumer[] appendTo(LineConsumer[] base, LineConsumer... toAppend) {\n    List<LineConsumer> allElements = new ArrayList<>();\n    allElements.addAll(Arrays.asList(base));\n    allElements.addAll(Arrays.asList(toAppend));\n    return allElements.toArray(new LineConsumer[allElements.size()]);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/util/ErrorFilteredConsumerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\n\nimport org.testng.annotations.Test;\n\n/**\n * @author Anatolii Bazko\n */\npublic class ErrorFilteredConsumerTest {\n\n  @Test\n  public void testRedirect() throws Exception {\n    LineConsumer lineConsumer = mock(LineConsumer.class);\n\n    ErrorFilteredConsumer errorFilteredConsumer = new ErrorFilteredConsumer(lineConsumer);\n\n    errorFilteredConsumer.writeLine(\"Line 1\");\n    errorFilteredConsumer.writeLine(\"Line 2\");\n    errorFilteredConsumer.writeLine(\"[STDERR] Line 3\");\n    errorFilteredConsumer.writeLine(\"[STDERR] Line 4\");\n    errorFilteredConsumer.writeLine(\"Line 5\");\n\n    verify(lineConsumer).writeLine(\"[STDERR] Line 3\");\n    verify(lineConsumer).writeLine(\"[STDERR] Line 4\");\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/util/FileLineConsumerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.io.File;\nimport java.io.Writer;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Modifier;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.slf4j.Logger;\nimport org.testng.annotations.*;\n\n/**\n * @author Mykola Morhun\n */\n@Ignore\n@Listeners(value = {MockitoTestNGListener.class})\npublic class FileLineConsumerTest {\n  private static final Logger LOG = getLogger(FileLineConsumerTest.class);\n\n  @Mock private Writer writer;\n\n  private FileLineConsumer fileLineConsumer;\n\n  private File file;\n\n  @BeforeMethod\n  public void beforeMethod() throws Exception {\n    file = File.createTempFile(\"file\", \".tmp\");\n    fileLineConsumer = new FileLineConsumer(file);\n    injectWriterMock(fileLineConsumer, writer);\n  }\n\n  @AfterClass\n  public void afterClass() {\n    if (!file.delete()) {\n      LOG.warn(\"Failed to remove temporary file: '{}'.\", file);\n    }\n  }\n\n  @Test\n  public void shouldBeAbleToWriteIntoFile() throws Exception {\n    // given\n    final String message = \"Test line\";\n\n    // when\n    fileLineConsumer.writeLine(message);\n\n    // then\n    verify(writer).write(eq(message));\n  }\n\n  @Test\n  public void shouldNotWriteIntoFileAfterConsumerClosing() throws Exception {\n    // given\n    final String message = \"Test line\";\n\n    // when\n    fileLineConsumer.close();\n    fileLineConsumer.writeLine(message);\n\n    // then\n    verify(writer, never()).write(anyString());\n  }\n\n  /**\n   * Inject Writer mock into FileLineConsumer class. This allow to test the FileLineConsumer\n   * operations.\n   *\n   * @param fileLineConsumer instance in which mock will be injected\n   * @param writerMock mock to inject\n   * @throws Exception\n   */\n  private void injectWriterMock(FileLineConsumer fileLineConsumer, Writer writerMock)\n      throws Exception {\n    Field writerField = fileLineConsumer.getClass().getDeclaredField(\"writer\");\n    writerField.setAccessible(true);\n\n    Field modifiersField = Field.class.getDeclaredField(\"modifiers\");\n    modifiersField.setAccessible(true);\n    modifiersField.setInt(writerField, writerField.getModifiers() & ~Modifier.FINAL);\n\n    writerField.set(fileLineConsumer, writerMock);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/util/PagingUtilTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport static java.util.Arrays.asList;\nimport static org.eclipse.che.api.core.util.PagingUtil.createLinkHeader;\nimport static org.eclipse.che.api.core.util.PagingUtil.parseLinkHeader;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertEqualsNoOrder;\n\nimport java.net.URI;\nimport java.util.Map;\nimport org.eclipse.che.api.core.Page;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@link PagingUtil}.\n *\n * @author Yevhenii Voevodin\n */\npublic class PagingUtilTest {\n\n  @Test\n  public void testCreatingLinksHeader() throws Exception {\n    final Page<String> page = new Page<>(asList(\"item3\", \"item4\", \"item5\"), 3, 3, 7);\n    final URI srcUri = URI.create(\"http://localhost:8080/path?qp=test\");\n\n    final String linkHeader = createLinkHeader(page, srcUri);\n\n    final String[] expLinks =\n        (\"<http://localhost:8080/path?qp=test&skipCount=0&maxItems=3>; rel=\\\"first\\\", \"\n                + \"<http://localhost:8080/path?qp=test&skipCount=6&maxItems=3>; rel=\\\"last\\\", \"\n                + \"<http://localhost:8080/path?qp=test&skipCount=0&maxItems=3>; rel=\\\"prev\\\", \"\n                + \"<http://localhost:8080/path?qp=test&skipCount=6&maxItems=3>; rel=\\\"next\\\"\")\n            .split(\", \");\n    assertEqualsNoOrder(linkHeader.split(\", \"), expLinks);\n  }\n\n  @Test\n  public void testParsingLinksHeader() throws Exception {\n    final Map<String, String> relToLinks =\n        parseLinkHeader(\n            \"<http://localhost:8080/path?qp=test&skipCount=0&maxItems=3>; rel=\\\"first\\\", \"\n                + \"<http://localhost:8080/path?qp=test&skipCount=4&maxItems=3>; rel=\\\"last\\\", \"\n                + \"<http://localhost:8080/path?qp=test&skipCount=0&maxItems=3>; rel=\\\"prev\\\", \"\n                + \"<http://localhost:8080/path?qp=test&skipCount=5&maxItems=3>; rel=\\\"next\\\"\");\n\n    assertEquals(relToLinks.size(), 4);\n    assertEquals(\n        relToLinks.get(\"first\"), \"http://localhost:8080/path?qp=test&skipCount=0&maxItems=3\");\n    assertEquals(\n        relToLinks.get(\"last\"), \"http://localhost:8080/path?qp=test&skipCount=4&maxItems=3\");\n    assertEquals(\n        relToLinks.get(\"next\"), \"http://localhost:8080/path?qp=test&skipCount=5&maxItems=3\");\n    assertEquals(\n        relToLinks.get(\"prev\"), \"http://localhost:8080/path?qp=test&skipCount=0&maxItems=3\");\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/util/RateExceedDetectorTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport org.testng.Assert;\nimport org.testng.annotations.Test;\n\n/**\n * @author andrew00x\n */\npublic class RateExceedDetectorTest {\n  @Test\n  public void testExceedRate() throws Exception {\n    RateExceedDetector rd = new RateExceedDetector(1); // 1 per second\n    Assert.assertFalse(rd.updateAndCheckRate());\n    Thread.sleep(500);\n    Assert.assertTrue(rd.updateAndCheckRate());\n  }\n\n  @Test\n  public void testStayUnderLimit() throws Exception {\n    RateExceedDetector rd = new RateExceedDetector(3); // 3 per second\n    Assert.assertFalse(rd.updateAndCheckRate());\n    Thread.sleep(400);\n    Assert.assertFalse(rd.updateAndCheckRate());\n  }\n\n  @Test\n  public void testComplex() throws Exception {\n    RateExceedDetector rd = new RateExceedDetector(3); // 3 per second\n    Assert.assertFalse(rd.updateAndCheckRate());\n    Thread.sleep(200);\n    Assert.assertTrue(rd.updateAndCheckRate());\n    Thread.sleep(500);\n    Assert.assertFalse(rd.updateAndCheckRate());\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/util/StandardLinuxShellTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport org.testng.Assert;\nimport org.testng.annotations.Test;\n\n/**\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n */\npublic class StandardLinuxShellTest {\n\n  @Test\n  public void testEscapeSpaces() throws Exception {\n    CommandLine cmd = new CommandLine().add(\"ls\", \"-l\", \"/home/andrew/some dir\");\n    final String[] line = new ShellFactory.StandardLinuxShell().createShellCommand(cmd);\n    final String[] expected = {\"/bin/bash\", \"-cl\", \"ls -l /home/andrew/some\\\\ dir\"};\n    Assert.assertEquals(line, expected);\n  }\n\n  @Test\n  public void testEscapeControls() {\n    CommandLine cmd = new CommandLine().add(\"ls\", \"-l\", \"/home/andrew/c|r>a$z\\\"y'dir&\");\n    final String[] line = new ShellFactory.StandardLinuxShell().createShellCommand(cmd);\n    final String[] expected = {\n      \"/bin/bash\", \"-cl\", \"ls -l /home/andrew/c\\\\|r\\\\>a\\\\$z\\\\\\\"y\\\\'dir\\\\&\"\n    };\n    Assert.assertEquals(line, expected);\n  }\n\n  @Test\n  public void testEscapeSpecCharacters() {\n    CommandLine cmd = new CommandLine().add(\"ls\", \"-l\", \"/home/andrew/some\\n\\r\\t\\b\\fdir\");\n    final String[] line = new ShellFactory.StandardLinuxShell().createShellCommand(cmd);\n    final String[] expected = {\"/bin/bash\", \"-cl\", \"ls -l /home/andrew/some\\\\n\\\\r\\\\t\\\\b\\\\fdir\"};\n    Assert.assertEquals(line, expected);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/util/WatchdogTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util;\n\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.TimeUnit;\nimport org.testng.Assert;\nimport org.testng.annotations.Test;\n\n/**\n * @author <a href=\"mailto:andrew00x@gmail.com\">Andrey Parfonov</a>\n */\npublic class WatchdogTest {\n  @Test\n  public void testWatchDog() throws Exception {\n    final CountDownLatch latch = new CountDownLatch(1);\n    final boolean[] cancel = new boolean[] {false};\n    final Cancellable myCancellable =\n        new Cancellable() {\n          @Override\n          public void cancel() throws Exception {\n            cancel[0] = true;\n            latch.countDown();\n          }\n        };\n\n    final Watchdog watchdog =\n        new Watchdog(1, TimeUnit.SECONDS); // wait 1 sec then cancel myCancellable\n    watchdog.start(myCancellable);\n    latch.await(2, TimeUnit.SECONDS); // wait 2 sec\n    Assert.assertTrue(cancel[0], \"cancellation failed\"); // should be cancelled\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/util/lineconsumer/ConcurrentCompositeLineConsumerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util.lineconsumer;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doAnswer;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.fail;\n\nimport java.nio.channels.ClosedByInterruptException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.api.core.util.LineConsumer;\nimport org.eclipse.che.commons.test.mockito.answer.WaitingAnswer;\nimport org.mockito.Mock;\nimport org.mockito.exceptions.base.MockitoException;\nimport org.mockito.internal.invocation.InvocationMatcher;\nimport org.mockito.internal.verification.VerificationModeFactory;\nimport org.mockito.internal.verification.api.VerificationData;\nimport org.mockito.invocation.Invocation;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.mockito.verification.VerificationMode;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Mykola Morhun\n */\n@Listeners(value = {MockitoTestNGListener.class})\npublic class ConcurrentCompositeLineConsumerTest {\n\n  @Mock private LineConsumer lineConsumer1;\n  @Mock private LineConsumer lineConsumer2;\n  @Mock private LineConsumer lineConsumer3;\n\n  private ConcurrentCompositeLineConsumer concurrentCompositeLineConsumer;\n\n  private LineConsumer subConsumers[];\n  private ExecutorService executor;\n\n  @BeforeMethod\n  public void beforeMethod() throws Exception {\n    subConsumers = new LineConsumer[] {lineConsumer1, lineConsumer2, lineConsumer3};\n    concurrentCompositeLineConsumer = new ConcurrentCompositeLineConsumer(subConsumers);\n\n    executor = Executors.newFixedThreadPool(3);\n  }\n\n  @AfterMethod\n  public void afterMethod() {\n    executor.shutdownNow();\n  }\n\n  @Test\n  public void shouldWriteMessageIntoEachConsumer() throws Exception {\n    // given\n    final String message = \"Test line\";\n\n    // when\n    concurrentCompositeLineConsumer.writeLine(message);\n\n    // then\n    for (LineConsumer subConsumer : subConsumers) {\n      verify(subConsumer).writeLine(eq(message));\n    }\n  }\n\n  @Test\n  public void shouldNotWriteIntoSubConsumersAfterClosingCompositeConsumer() throws Exception {\n    // given\n    final String message = \"Test line\";\n\n    // when\n    concurrentCompositeLineConsumer.close();\n    concurrentCompositeLineConsumer.writeLine(message);\n\n    // then\n    for (LineConsumer subConsumer : subConsumers) {\n      verify(subConsumer, never()).writeLine(anyString());\n    }\n  }\n\n  @DataProvider(name = \"subConsumersExceptions\")\n  public Object[][] subConsumersExceptions() {\n    return new Throwable[][] {\n      {new ConsumerAlreadyClosedException(\"Error\")}, {new ClosedByInterruptException()}\n    };\n  }\n\n  @Test(dataProvider = \"subConsumersExceptions\")\n  public void shouldCloseSubConsumerOnException(Throwable exception) throws Exception {\n    // given\n    final String message = \"Test line\";\n    final String message2 = \"Test line2\";\n\n    LineConsumer closedConsumer = mock(LineConsumer.class);\n    doThrow(exception).when(closedConsumer).writeLine(anyString());\n\n    concurrentCompositeLineConsumer =\n        new ConcurrentCompositeLineConsumer(appendTo(subConsumers, closedConsumer));\n\n    // when\n    concurrentCompositeLineConsumer.writeLine(message);\n    concurrentCompositeLineConsumer.writeLine(message2);\n\n    // then\n    verify(closedConsumer, never()).writeLine(eq(message2));\n    for (LineConsumer consumer : subConsumers) {\n      verify(consumer).writeLine(eq(message2));\n    }\n  }\n\n  @Test\n  public void shouldDoNothingOnWriteLineIfAllSubConsumersAreClosed() throws Exception {\n    // given\n    final String message = \"Test line\";\n    LineConsumer[] closedConsumers = subConsumers;\n    for (LineConsumer consumer : closedConsumers) {\n      doThrow(ConsumerAlreadyClosedException.class).when(consumer).writeLine(anyString());\n    }\n    concurrentCompositeLineConsumer = new ConcurrentCompositeLineConsumer(closedConsumers);\n\n    // when\n    concurrentCompositeLineConsumer.writeLine(\"Error\");\n    concurrentCompositeLineConsumer.writeLine(message);\n\n    // then\n    for (LineConsumer subConsumer : closedConsumers) {\n      verify(subConsumer, never()).writeLine(eq(message));\n    }\n  }\n\n  @Test\n  public void shouldBeAbleToWriteIntoSubConsumersSimultaneously() throws Exception {\n    // given\n    final String message1 = \"Message 1\";\n    final String message2 = \"Message 2\";\n\n    WaitingAnswer<Void> waitingAnswer = new WaitingAnswer<>();\n    doAnswer(waitingAnswer).when(lineConsumer2).writeLine(eq(message1));\n\n    executor.execute(() -> concurrentCompositeLineConsumer.writeLine(message1));\n    waitingAnswer.waitAnswerCall(1, TimeUnit.SECONDS);\n\n    // when\n    concurrentCompositeLineConsumer.writeLine(message2);\n    waitingAnswer.completeAnswer();\n\n    // then\n    awaitFinalization();\n\n    for (LineConsumer consumer : subConsumers) {\n      verify(consumer).writeLine(eq(message1));\n      verify(consumer).writeLine(eq(message2));\n    }\n  }\n\n  @Test\n  public void closeOperationShouldWaitUntilAllCurrentOperationsWillBeFinished() throws Exception {\n    // given\n    final String message1 = \"Message 1\";\n    final String message2 = \"Message 2\";\n\n    WaitingAnswer<Void> waitingAnswer1 = waitOnWrite(lineConsumer2, message1);\n    WaitingAnswer<Void> waitingAnswer2 = waitOnWrite(lineConsumer2, message2);\n\n    // when\n    executor.execute(concurrentCompositeLineConsumer::close);\n\n    waitingAnswer1.completeAnswer();\n    waitingAnswer2.completeAnswer();\n\n    // then\n    awaitFinalization();\n\n    assertFalse(concurrentCompositeLineConsumer.isOpen());\n\n    for (LineConsumer consumer : subConsumers) {\n      verify(consumer).writeLine(eq(message1));\n      verify(consumer).writeLine(eq(message2));\n      verify(consumer, last()).close();\n    }\n  }\n\n  @Test\n  public void shouldIgnoreWriteToSubConsumersAfterCloseWasCalled() throws Exception {\n    // given\n    WaitingAnswer<Void> waitingAnswer = new WaitingAnswer<>();\n    doAnswer(waitingAnswer).when(lineConsumer2).close();\n\n    executor.execute(() -> concurrentCompositeLineConsumer.close());\n    waitingAnswer.waitAnswerCall(1, TimeUnit.SECONDS);\n\n    // when\n    concurrentCompositeLineConsumer.writeLine(\"Test line\");\n    waitingAnswer.completeAnswer();\n\n    // then\n    awaitFinalization();\n\n    for (LineConsumer consumer : subConsumers) {\n      verify(consumer, never()).writeLine(anyString());\n    }\n  }\n\n  /**\n   * Executes write line into file in separate thread and waits on writing to file operation until\n   * this thread released.\n   *\n   * @param consumer subconsumer on which thread should be freezed\n   * @param message message to write\n   * @return waiting answer to release this thread later using {@link\n   *     WaitingAnswer#completeAnswer()}\n   * @throws Exception\n   */\n  private WaitingAnswer<Void> waitOnWrite(LineConsumer consumer, String message) throws Exception {\n    WaitingAnswer<Void> waitingAnswer = new WaitingAnswer<>();\n    doAnswer(waitingAnswer).when(consumer).writeLine(eq(message));\n\n    executor.execute(() -> concurrentCompositeLineConsumer.writeLine(message));\n    waitingAnswer.waitAnswerCall(1, TimeUnit.SECONDS);\n\n    return waitingAnswer;\n  }\n\n  private void awaitFinalization() throws Exception {\n    executor.shutdown();\n    if (!executor.awaitTermination(1_000, TimeUnit.MILLISECONDS)) {\n      fail(\"Operation is hanged up. Terminated.\");\n    }\n  }\n\n  private LineConsumer[] appendTo(LineConsumer[] base, LineConsumer... toAppend) {\n    List<LineConsumer> allElements = new ArrayList<>();\n    allElements.addAll(Arrays.asList(base));\n    allElements.addAll(Arrays.asList(toAppend));\n    return allElements.toArray(new LineConsumer[allElements.size()]);\n  }\n\n  /**\n   * Checks whether interaction with given mock is <i>the last one so far</i>. Typical using:\n   *\n   * <pre class=\"code\"><code class=\"java\">\n   * verify(someMock, last()).someMethod();\n   * </code></pre>\n   */\n  public static class Last implements VerificationMode {\n    public Last() {}\n\n    public void verify(VerificationData verificationData) {\n      List<Invocation> invocations = verificationData.getAllInvocations();\n      InvocationMatcher invocationMatcher = verificationData.getWanted();\n\n      if (invocations == null || invocations.isEmpty()) {\n        throw new MockitoException(\n            \"\\nNo interactions with \"\n                + invocationMatcher.getInvocation().getMock()\n                + \" mock so far\");\n      }\n      Invocation invocation = invocations.get(invocations.size() - 1);\n\n      if (!invocationMatcher.matches(invocation)) {\n        throw new MockitoException(\"\\nWanted but not invoked:\\n\" + invocationMatcher);\n      }\n    }\n\n    public VerificationMode description(String description) {\n      return VerificationModeFactory.description(this, description);\n    }\n  }\n\n  public static VerificationMode last() {\n    return new Last();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/util/lineconsumer/ConcurrentFileLineConsumerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.util.lineconsumer;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doAnswer;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.slf4j.LoggerFactory.getLogger;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.fail;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Modifier;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.commons.test.mockito.answer.WaitingAnswer;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.slf4j.Logger;\nimport org.testng.annotations.*;\n\n/**\n * @author Mykola Morhun\n */\n@Ignore\n@Listeners(value = {MockitoTestNGListener.class})\npublic class ConcurrentFileLineConsumerTest {\n  private static final Logger LOG = getLogger(ConcurrentFileLineConsumer.class);\n\n  @Mock private Writer writer;\n\n  private ConcurrentFileLineConsumer concurrentFileLineConsumer;\n\n  private ExecutorService executor;\n  private File file;\n\n  @BeforeMethod\n  public void beforeMethod() throws Exception {\n    file = File.createTempFile(\"file\", \".tmp\");\n    concurrentFileLineConsumer = new ConcurrentFileLineConsumer(file);\n    injectWriterMock(concurrentFileLineConsumer, writer);\n\n    executor = Executors.newFixedThreadPool(3);\n  }\n\n  @AfterMethod\n  public void afterMethod() {\n    executor.shutdownNow();\n  }\n\n  @AfterClass\n  public void afterClass() {\n    if (!file.delete()) {\n      LOG.warn(\"Failed to remove temporary file: '{}'.\", file);\n    }\n  }\n\n  @Test\n  public void shouldBeAbleToWriteIntoFile() throws Exception {\n    // given\n    final String message = \"Test line\";\n\n    // when\n    concurrentFileLineConsumer.writeLine(message);\n\n    // then\n    verify(writer).write(eq(message));\n  }\n\n  @Test\n  public void shouldNotWriteIntoFileAfterConsumerClosing() throws Exception {\n    // given\n    final String message = \"Test line\";\n\n    // when\n    concurrentFileLineConsumer.close();\n    concurrentFileLineConsumer.writeLine(message);\n\n    // then\n    verify(writer, never()).write(anyString());\n  }\n\n  @Test\n  public void shouldBeAbleToWriteIntoFileSimultaneously() throws Exception {\n    // given\n    final String message1 = \"Message 1\";\n    final String message2 = \"Message 2\";\n\n    WaitingAnswer<Void> waitingAnswer = new WaitingAnswer<>();\n    doAnswer(waitingAnswer).when(writer).write(eq(message1));\n\n    executor.execute(() -> writeIntoConsumer(message1));\n    waitingAnswer.waitAnswerCall(1, TimeUnit.SECONDS);\n\n    // when\n    writeIntoConsumer(message2);\n    waitingAnswer.completeAnswer();\n\n    // then\n    awaitFinalization();\n\n    verify(writer).write(eq(message1));\n    verify(writer).write(eq(message2));\n  }\n\n  @Test\n  public void closeOperationShouldWaitUntilAllCurrentWriteOperationsWillBeFinished()\n      throws Exception {\n    // given\n    final String message1 = \"Message 1\";\n    final String message2 = \"Message 2\";\n\n    WaitingAnswer<Void> waitingAnswer1 = waitOnWrite(message1);\n    WaitingAnswer<Void> waitingAnswer2 = waitOnWrite(message2);\n\n    // when\n    executor.execute(this::closeConsumer);\n\n    waitingAnswer1.completeAnswer();\n    waitingAnswer2.completeAnswer();\n\n    // then\n    awaitFinalization();\n\n    assertFalse(concurrentFileLineConsumer.isOpen());\n\n    verify(writer).write(eq(message1));\n    verify(writer).write(eq(message2));\n  }\n\n  @Test\n  public void shouldNotWriteIntoSubConsumersWhenLockForCloseIsLocked() throws Exception {\n    // given\n    WaitingAnswer<Void> waitingAnswer = new WaitingAnswer<>();\n    doAnswer(waitingAnswer).when(writer).close();\n\n    executor.execute(this::closeConsumer);\n    waitingAnswer.waitAnswerCall(1, TimeUnit.SECONDS);\n\n    // when\n    writeIntoConsumer(\"Test line\");\n    waitingAnswer.completeAnswer();\n\n    // then\n    awaitFinalization();\n\n    verify(writer, never()).write(anyString());\n  }\n\n  /**\n   * Inject Writer mock into FileLineConsumer class. This allow to test the FileLineConsumer\n   * operations.\n   *\n   * @param concurrentFileLineConsumer instance in which mock will be injected\n   * @param writerMock mock to inject\n   * @throws Exception\n   */\n  private void injectWriterMock(\n      ConcurrentFileLineConsumer concurrentFileLineConsumer, Writer writerMock) throws Exception {\n    Field writerField = concurrentFileLineConsumer.getClass().getDeclaredField(\"writer\");\n    writerField.setAccessible(true);\n\n    Field modifiersField = Field.class.getDeclaredField(\"modifiers\");\n    modifiersField.setAccessible(true);\n    modifiersField.setInt(writerField, writerField.getModifiers() & ~Modifier.FINAL);\n\n    writerField.set(concurrentFileLineConsumer, writerMock);\n  }\n\n  private void writeIntoConsumer(String message) {\n    try {\n      concurrentFileLineConsumer.writeLine(message);\n    } catch (IOException ignore) {\n    }\n  }\n\n  private void closeConsumer() {\n    try {\n      concurrentFileLineConsumer.close();\n    } catch (IOException ignore) {\n    }\n  }\n\n  /**\n   * Executes write line into file in separate thread and waits on writing to file operation until\n   * this thread released.\n   *\n   * @param message message to write\n   * @return waiting answer to release this thread later using {@link\n   *     WaitingAnswer#completeAnswer()}\n   * @throws Exception\n   */\n  private WaitingAnswer<Void> waitOnWrite(String message) throws Exception {\n    WaitingAnswer<Void> waitingAnswer = new WaitingAnswer<>();\n    doAnswer(waitingAnswer).when(writer).write(eq(message));\n\n    executor.execute(() -> writeIntoConsumer(message));\n    waitingAnswer.waitAnswerCall(1, TimeUnit.SECONDS);\n\n    return waitingAnswer;\n  }\n\n  private void awaitFinalization() throws Exception {\n    executor.shutdown();\n    if (!executor.awaitTermination(1_000, TimeUnit.MILLISECONDS)) {\n      fail(\"Operation is hanged up. Terminated.\");\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/websocket/impl/BasicWebSocketMessageTransmitterTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.websocket.impl;\n\nimport static java.util.Collections.emptySet;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport jakarta.websocket.RemoteEndpoint;\nimport jakarta.websocket.Session;\nimport java.io.IOException;\nimport java.util.Optional;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Test for {@link BasicWebSocketMessageTransmitter}\n *\n * @author Dmitry Kuleshov\n */\n@Listeners(MockitoTestNGListener.class)\npublic class BasicWebSocketMessageTransmitterTest {\n  private static final String MESSAGE = \"message\";\n  private static final String ENDPOINT_ID = \"id\";\n\n  @Mock private WebSocketSessionRegistry registry;\n  @Mock private MessagesReSender reSender;\n  @InjectMocks private BasicWebSocketMessageTransmitter transmitter;\n\n  @Mock private Session session;\n  @Mock private RemoteEndpoint.Basic remote;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    lenient().when(session.getBasicRemote()).thenReturn(remote);\n    when(session.isOpen()).thenReturn(true);\n\n    when(registry.get(ENDPOINT_ID)).thenReturn(Optional.of(session));\n    lenient().when(registry.getSessions()).thenReturn(emptySet());\n  }\n\n  @Test\n  public void shouldSendDirectMessageIfSessionIsOpenAndEndpointIsSet() throws IOException {\n    transmitter.transmit(ENDPOINT_ID, MESSAGE);\n\n    verify(session).getBasicRemote();\n    verify(remote).sendText(MESSAGE);\n    verify(reSender, never()).add(eq(ENDPOINT_ID), anyString());\n  }\n\n  @Test\n  public void shouldAddMessageToPendingIfSessionIsNotOpenedAndEndpointIsSet() throws IOException {\n    when(session.isOpen()).thenReturn(false);\n\n    transmitter.transmit(ENDPOINT_ID, MESSAGE);\n\n    verify(session, never()).getBasicRemote();\n    verify(remote, never()).sendText(MESSAGE);\n    verify(reSender).add(ENDPOINT_ID, MESSAGE);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/websocket/impl/MessagesReSenderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.websocket.impl;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport jakarta.websocket.RemoteEndpoint;\nimport jakarta.websocket.Session;\nimport java.util.Optional;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@link MessagesReSender}\n *\n * @author Dmitry Kuleshov\n */\n@Listeners(MockitoTestNGListener.class)\npublic class MessagesReSenderTest {\n  private static final String MESSAGE = \"message\";\n  private static final String ENDPOINT_ID = \"id\";\n\n  @Mock private WebSocketSessionRegistry sessionRegistry;\n  @InjectMocks private MessagesReSender reSender;\n\n  @Mock private Session session;\n  @Mock private RemoteEndpoint.Async endpoint;\n\n  @BeforeMethod\n  public void beforeMethod() {\n    when(sessionRegistry.get(anyString())).thenReturn(Optional.of(session));\n    lenient().when(session.getAsyncRemote()).thenReturn(endpoint);\n    lenient().when(session.isOpen()).thenReturn(true);\n  }\n\n  @BeforeMethod\n  public void before() {\n    reSender = new MessagesReSender(sessionRegistry);\n  }\n\n  @Test\n  public void shouldStopIfSessionIsNotRegistered() {\n    when(sessionRegistry.get(anyString())).thenReturn(Optional.empty());\n\n    reSender.add(ENDPOINT_ID, MESSAGE);\n\n    reSender.resend(ENDPOINT_ID);\n\n    verify(sessionRegistry).get(ENDPOINT_ID);\n    verify(session, never()).getAsyncRemote();\n    verify(endpoint, never()).sendText(MESSAGE);\n  }\n\n  @Test\n  public void shouldKeepMessagesIfSessionIsClosed() {\n    reSender.add(ENDPOINT_ID, MESSAGE);\n\n    when(session.isOpen()).thenReturn(false);\n    reSender.resend(ENDPOINT_ID);\n\n    verify(session, never()).getAsyncRemote();\n    verify(endpoint, never()).sendText(MESSAGE);\n\n    when(session.isOpen()).thenReturn(true);\n    reSender.resend(ENDPOINT_ID);\n\n    verify(session).getAsyncRemote();\n    verify(endpoint).sendText(MESSAGE);\n  }\n\n  @Test\n  public void shouldProperlyAddForSingleEndpoint() {\n    reSender.add(ENDPOINT_ID, MESSAGE);\n\n    reSender.resend(ENDPOINT_ID);\n\n    verify(sessionRegistry).get(ENDPOINT_ID);\n    verify(session).getAsyncRemote();\n    verify(endpoint).sendText(MESSAGE);\n  }\n\n  @Test\n  public void shouldProperlyAddForSeveralEndpoints() {\n    reSender.add(ENDPOINT_ID, MESSAGE);\n    reSender.add(\"1\", MESSAGE);\n\n    reSender.resend(ENDPOINT_ID);\n    reSender.resend(\"1\");\n\n    verify(sessionRegistry).get(ENDPOINT_ID);\n    verify(sessionRegistry).get(\"1\");\n    verify(session, times(2)).getAsyncRemote();\n    verify(endpoint, times(2)).sendText(MESSAGE);\n  }\n\n  @Test\n  public void shouldClearOnExtractionForSingleEndpoint() {\n    reSender.add(ENDPOINT_ID, MESSAGE);\n\n    reSender.resend(ENDPOINT_ID);\n    verify(sessionRegistry).get(ENDPOINT_ID);\n    verify(session).getAsyncRemote();\n    verify(endpoint).sendText(MESSAGE);\n\n    reSender.resend(ENDPOINT_ID);\n    verify(sessionRegistry).get(ENDPOINT_ID);\n    verify(session).getAsyncRemote();\n    verify(endpoint).sendText(MESSAGE);\n  }\n\n  @Test\n  public void shouldClearOnExtractionForSeveralEndpoint() {\n    reSender.add(ENDPOINT_ID, MESSAGE);\n    reSender.add(\"1\", MESSAGE);\n\n    reSender.resend(ENDPOINT_ID);\n    reSender.resend(\"1\");\n\n    verify(sessionRegistry).get(ENDPOINT_ID);\n    verify(sessionRegistry).get(\"1\");\n    verify(session, times(2)).getAsyncRemote();\n    verify(endpoint, times(2)).sendText(MESSAGE);\n\n    reSender.resend(ENDPOINT_ID);\n    reSender.resend(\"1\");\n\n    verify(sessionRegistry).get(ENDPOINT_ID);\n    verify(sessionRegistry).get(\"1\");\n    verify(session, times(2)).getAsyncRemote();\n    verify(endpoint, times(2)).sendText(MESSAGE);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/api/core/websocket/impl/WebSocketSessionRegistryTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.websocket.impl;\n\nimport static org.mockito.Mockito.mock;\nimport static org.testng.Assert.*;\n\nimport jakarta.websocket.Session;\nimport java.util.Optional;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@link WebSocketSessionRegistry}\n *\n * @author Dmitry Kuleshov\n */\n@Listeners(MockitoTestNGListener.class)\npublic class WebSocketSessionRegistryTest {\n\n  private WebSocketSessionRegistry registry;\n\n  @Mock private Session session;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    registry = new WebSocketSessionRegistry();\n  }\n\n  @Test\n  public void shouldAddSession() {\n    assertTrue(registry.getSessions().isEmpty());\n\n    registry.add(\"0\", session);\n\n    assertFalse(registry.getSessions().isEmpty());\n  }\n\n  @Test\n  public void shouldAddCorrectSession() {\n    registry.add(\"0\", this.session);\n\n    final Optional<Session> sessionOptional = registry.get(\"0\");\n    assertTrue(sessionOptional.isPresent());\n\n    final Session session = sessionOptional.get();\n    assertEquals(this.session, session);\n  }\n\n  @Test\n  public void shouldRemoveSession() {\n    registry.add(\"0\", session);\n\n    assertFalse(registry.getSessions().isEmpty());\n    assertEquals(1, registry.getSessions().size());\n\n    registry.remove(\"0\");\n\n    assertTrue(registry.getSessions().isEmpty());\n  }\n\n  @Test\n  public void shouldGetAllSessions() {\n    registry.add(\"0\", session);\n\n    assertFalse(registry.getSessions().isEmpty());\n    assertEquals(1, registry.getSessions().size());\n\n    registry.add(\"1\", mock(Session.class));\n\n    assertFalse(registry.getSessions().isEmpty());\n    assertEquals(2, registry.getSessions().size());\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/commons/env/EnvironmentContextTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.env;\n\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\n\nimport java.util.Collections;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.testng.annotations.Test;\n\npublic class EnvironmentContextTest {\n\n  @Test\n  public void shouldBeAbleToSetEnvContextInSameThread() {\n    // given\n    EnvironmentContext expected = EnvironmentContext.getCurrent();\n    expected.setSubject(new SubjectImpl(\"user\", Collections.emptyList(), \"id\", \"token\", false));\n\n    EnvironmentContext actual = EnvironmentContext.getCurrent();\n    Subject actualSubject = actual.getSubject();\n    assertEquals(actualSubject.getUserName(), \"user\");\n    assertEquals(actualSubject.getUserId(), \"id\");\n    assertEquals(actualSubject.getToken(), \"token\");\n    assertFalse(actualSubject.isTemporary());\n  }\n\n  @Test\n  public void shouldReturnAnonymousSubjectWhenThereIsNoSubject() {\n    // given\n    EnvironmentContext expected = EnvironmentContext.getCurrent();\n    expected.setSubject(null);\n\n    // when\n    Subject actualSubject = EnvironmentContext.getCurrent().getSubject();\n\n    // then\n    assertEquals(actualSubject.getUserName(), Subject.ANONYMOUS.getUserName());\n    assertEquals(actualSubject.getUserId(), Subject.ANONYMOUS.getUserId());\n    assertEquals(actualSubject.getToken(), Subject.ANONYMOUS.getToken());\n    assertEquals(actualSubject.isTemporary(), Subject.ANONYMOUS.isTemporary());\n    assertEquals(actualSubject.isAnonymous(), Subject.ANONYMOUS.isAnonymous());\n  }\n\n  @Test(enabled = false)\n  public void shouldNotBeAbleToSeeContextInOtherThread() {\n    // given\n    final EnvironmentContext expected = EnvironmentContext.getCurrent();\n    expected.setSubject(new SubjectImpl(\"user\", Collections.emptyList(), \"id\", \"token\", false));\n\n    Thread otherThread =\n        new Thread() {\n          @Override\n          public void run() {\n            EnvironmentContext.getCurrent();\n          }\n        };\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/commons/proxy/ProxyAuthenticatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.proxy;\n\nimport static org.testng.Assert.assertEquals;\n\nimport java.net.Authenticator;\nimport java.net.PasswordAuthentication;\nimport org.testng.annotations.AfterClass;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.Test;\n\n/**\n * @author Dmytro Nochevnov\n */\npublic class ProxyAuthenticatorTest {\n\n  public static final String HTTP_URL = \"http://some.address\";\n  public static final String HTTPS_URL = \"https://some.address\";\n\n  @BeforeClass\n  public void setup() {\n    System.setProperty(\"http.proxyUser\", \"user1\");\n    System.setProperty(\"http.proxyPassword\", \"paswd1\");\n    System.setProperty(\"https.proxyUser\", \"user2\");\n    System.setProperty(\"https.proxyPassword\", \"paswd2\");\n  }\n\n  @Test\n  public void shouldInitHttpsProxyAuthenticator() throws Exception {\n    // when\n    ProxyAuthenticator.initAuthenticator(HTTPS_URL);\n    PasswordAuthentication testAuthentication =\n        Authenticator.requestPasswordAuthentication(null, 0, null, null, null);\n\n    // then\n    assertEquals(testAuthentication.getUserName(), \"user2\");\n    assertEquals(String.valueOf(testAuthentication.getPassword()), \"paswd2\");\n\n    // when\n    ProxyAuthenticator.resetAuthenticator();\n\n    // then\n    testAuthentication = Authenticator.requestPasswordAuthentication(null, 0, null, null, null);\n    assertEquals(testAuthentication, null);\n  }\n\n  @Test\n  public void shouldInitHttpProxyAuthenticator() throws Exception {\n    // when\n    ProxyAuthenticator.initAuthenticator(HTTP_URL);\n\n    // then\n    PasswordAuthentication testAuthentication =\n        Authenticator.requestPasswordAuthentication(null, 0, null, null, null);\n    assertEquals(testAuthentication.getUserName(), \"user1\");\n    assertEquals(String.valueOf(testAuthentication.getPassword()), \"paswd1\");\n\n    // when\n    ProxyAuthenticator.resetAuthenticator();\n\n    // then\n    testAuthentication = Authenticator.requestPasswordAuthentication(null, 0, null, null, null);\n    assertEquals(testAuthentication, null);\n  }\n\n  @AfterClass\n  public void tearDown() {\n    System.clearProperty(\"http.proxyUser\");\n    System.clearProperty(\"http.proxyPassword\");\n    System.clearProperty(\"https.proxyUser\");\n    System.clearProperty(\"https.proxyPassword\");\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/everrest/DownloadFileResponseFilterTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.everrest;\n\nimport static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;\nimport static jakarta.ws.rs.core.Response.Status.OK;\nimport static org.everrest.core.ApplicationContext.anApplicationContext;\nimport static org.testng.Assert.assertEquals;\n\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.HttpMethod;\nimport jakarta.ws.rs.POST;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.core.HttpHeaders;\nimport jakarta.ws.rs.core.MultivaluedMap;\nimport jakarta.ws.rs.core.Response;\nimport java.net.URI;\nimport java.util.Arrays;\nimport java.util.List;\nimport org.eclipse.che.api.core.rest.ApiExceptionMapper;\nimport org.eclipse.che.api.core.rest.DownloadFileResponseFilter;\nimport org.everrest.core.ApplicationContext;\nimport org.everrest.core.impl.ApplicationProviderBinder;\nimport org.everrest.core.impl.ContainerRequest;\nimport org.everrest.core.impl.ContainerResponse;\nimport org.everrest.core.impl.EverrestConfiguration;\nimport org.everrest.core.impl.EverrestProcessor;\nimport org.everrest.core.impl.RequestDispatcher;\nimport org.everrest.core.impl.RequestHandlerImpl;\nimport org.everrest.core.impl.ResourceBinderImpl;\nimport org.everrest.core.tools.DependencySupplierImpl;\nimport org.everrest.core.tools.ResourceLauncher;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\n/**\n * Test the DownloadFileResponseFilter filter\n *\n * @author Florent Benoit\n */\npublic class DownloadFileResponseFilterTest {\n\n  /** Base URI */\n  private static final String BASE_URI = \"http://localhost/service\";\n\n  /** Base Service */\n  private static final String SERVICE_PATH = BASE_URI + \"/myservice\";\n\n  /** Dummy JAX-RS POJO */\n  @Path(\"/myservice\")\n  public static class MyJaxRSService {\n\n    @GET\n    @Path(\"/list\")\n    @Produces(APPLICATION_JSON)\n    public List<String> getMembers() {\n      return Arrays.asList(\"a\", \"b\", \"c\");\n    }\n\n    @GET\n    @Path(\"/single\")\n    @Produces(APPLICATION_JSON)\n    public String getMember() {\n      return \"hello\";\n    }\n\n    @POST\n    @Path(\"/modify\")\n    @Produces(APPLICATION_JSON)\n    public Response myPostMethod() {\n      return Response.ok(\"helloContent\").build();\n    }\n  }\n\n  /** Resource Launcher */\n  private ResourceLauncher resourceLauncher;\n\n  /**\n   * Setup env for launching requests\n   *\n   * @throws Exception\n   */\n  @BeforeMethod\n  public void before() throws Exception {\n    // set up launcher\n    final ResourceBinderImpl resources = new ResourceBinderImpl();\n    resources.addResource(MyJaxRSService.class, null);\n    final DependencySupplierImpl dependencies = new DependencySupplierImpl();\n    final ApplicationProviderBinder providers = new ApplicationProviderBinder();\n    providers.addExceptionMapper(ApiExceptionMapper.class);\n    providers.addResponseFilter(EverrestDownloadFileResponseFilter.class);\n    final URI uri = new URI(BASE_URI);\n    final ContainerRequest req = new ContainerRequest(null, uri, uri, null, null, null);\n    final ApplicationContext context =\n        anApplicationContext()\n            .withRequest(req)\n            .withProviders(providers)\n            .withDependencySupplier(dependencies)\n            .build();\n    ApplicationContext.setCurrent(context);\n    final EverrestProcessor processor =\n        new EverrestProcessor(\n            new EverrestConfiguration(),\n            dependencies,\n            new RequestHandlerImpl(new RequestDispatcher(resources), providers),\n            null);\n    resourceLauncher = new ResourceLauncher(processor);\n  }\n\n  /** Check if header is absent when parameter is empty */\n  @Test\n  public void checkNoParameterTest() throws Exception {\n\n    final ContainerResponse response =\n        resourceLauncher.service(\n            HttpMethod.GET, SERVICE_PATH + \"/list\", BASE_URI, null, null, null);\n    assertEquals(response.getStatus(), OK.getStatusCode());\n    // check entity\n    Assert.assertEquals(response.getEntity(), Arrays.asList(\"a\", \"b\", \"c\"));\n    // Check headers\n    MultivaluedMap<String, Object> headerTags = response.getHttpHeaders();\n    Assert.assertNotNull(headerTags);\n    Assert.assertEquals(headerTags.size(), 1);\n  }\n\n  /** Check if header for downloading is added in response if we're also using a custom header */\n  @Test\n  public void checkDownloadFileWithParameter() throws Exception {\n\n    final ContainerResponse response =\n        resourceLauncher.service(\n            HttpMethod.GET,\n            SERVICE_PATH\n                + \"/list?\"\n                + DownloadFileResponseFilter.QUERY_DOWNLOAD_PARAMETER\n                + \"=hello.json\",\n            BASE_URI,\n            null,\n            null,\n            null);\n    assertEquals(response.getStatus(), OK.getStatusCode());\n    // check entity\n    Assert.assertEquals(response.getEntity(), Arrays.asList(\"a\", \"b\", \"c\"));\n\n    // headers = 2\n    Assert.assertEquals(response.getHttpHeaders().size(), 2);\n\n    // Check custom header\n    List<Object> headers = response.getHttpHeaders().get(HttpHeaders.CONTENT_DISPOSITION);\n    Assert.assertNotNull(headers);\n    Assert.assertEquals(headers.size(), 1);\n    Assert.assertEquals(headers.get(0), \"attachment; filename=hello.json\");\n  }\n\n  /** Check that parameter is only handled if there is a GET method, not POST */\n  @Test\n  public void checkOnlyOnGetMethodTest() throws Exception {\n    final ContainerResponse response =\n        resourceLauncher.service(\n            HttpMethod.POST,\n            SERVICE_PATH\n                + \"/modify?\"\n                + DownloadFileResponseFilter.QUERY_DOWNLOAD_PARAMETER\n                + \"=hello.json\",\n            BASE_URI,\n            null,\n            null,\n            null);\n    assertEquals(response.getStatus(), OK.getStatusCode());\n    // check entity\n    Assert.assertEquals(response.getEntity(), \"helloContent\");\n\n    // headers = 2\n    Assert.assertEquals(response.getHttpHeaders().size(), 1);\n\n    // Check custom header\n    List<Object> headers = response.getHttpHeaders().get(HttpHeaders.CONTENT_DISPOSITION);\n    Assert.assertNull(headers);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/everrest/ETagResponseFilterTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.everrest;\n\nimport static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;\nimport static jakarta.ws.rs.core.Response.Status.NOT_MODIFIED;\nimport static jakarta.ws.rs.core.Response.Status.OK;\nimport static org.everrest.core.ApplicationContext.anApplicationContext;\nimport static org.testng.Assert.assertEquals;\n\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.HttpMethod;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.core.EntityTag;\nimport jakarta.ws.rs.core.HttpHeaders;\nimport jakarta.ws.rs.core.Response;\nimport java.net.URI;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.rest.ApiExceptionMapper;\nimport org.everrest.core.ApplicationContext;\nimport org.everrest.core.impl.ApplicationProviderBinder;\nimport org.everrest.core.impl.ContainerRequest;\nimport org.everrest.core.impl.ContainerResponse;\nimport org.everrest.core.impl.EverrestConfiguration;\nimport org.everrest.core.impl.EverrestProcessor;\nimport org.everrest.core.impl.RequestDispatcher;\nimport org.everrest.core.impl.RequestHandlerImpl;\nimport org.everrest.core.impl.ResourceBinderImpl;\nimport org.everrest.core.tools.DependencySupplierImpl;\nimport org.everrest.core.tools.ResourceLauncher;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\n/**\n * Test the ETag filter\n *\n * @author Florent Benoit\n */\npublic class ETagResponseFilterTest {\n\n  /** Base URI */\n  private static final String BASE_URI = \"http://localhost/service\";\n\n  /** Base Service */\n  private static final String SERVICE_PATH = BASE_URI + \"/myservice\";\n\n  /** Dummy JAX-RS POJO */\n  @Path(\"/myservice\")\n  public static class MyJaxRSService {\n\n    @GET\n    @Path(\"/list\")\n    @Produces(APPLICATION_JSON)\n    public List<String> getMembers() {\n      return Arrays.asList(\"a\", \"b\", \"c\");\n    }\n\n    @GET\n    @Path(\"/single\")\n    @Produces(APPLICATION_JSON)\n    public String getMember() {\n      return \"hello\";\n    }\n\n    @GET\n    @Path(\"/modify\")\n    @Produces(APPLICATION_JSON)\n    public Response modifyHeader() {\n      return Response.ok(\"helloContent\")\n          .header(HttpHeaders.CONTENT_DISPOSITION, \"attachment; filename=my.json\")\n          .build();\n    }\n  }\n\n  /** Resource Launcher */\n  private ResourceLauncher resourceLauncher;\n\n  /**\n   * Setup env for launching requests\n   *\n   * @throws Exception\n   */\n  @BeforeMethod\n  public void before() throws Exception {\n    // set up launcher\n    final ResourceBinderImpl resources = new ResourceBinderImpl();\n    resources.addResource(MyJaxRSService.class, null);\n    final DependencySupplierImpl dependencies = new DependencySupplierImpl();\n    final ApplicationProviderBinder providers = new ApplicationProviderBinder();\n    providers.addExceptionMapper(ApiExceptionMapper.class);\n    providers.addResponseFilter(ETagResponseFilter.class);\n    final URI uri = new URI(BASE_URI);\n    final ContainerRequest req = new ContainerRequest(null, uri, uri, null, null, null);\n    final ApplicationContext contextImpl =\n        anApplicationContext().withRequest(req).withProviders(providers).build();\n    contextImpl.setDependencySupplier(dependencies);\n    ApplicationContext.setCurrent(contextImpl);\n    final EverrestProcessor processor =\n        new EverrestProcessor(\n            new EverrestConfiguration(),\n            dependencies,\n            new RequestHandlerImpl(new RequestDispatcher(resources), providers),\n            null);\n    resourceLauncher = new ResourceLauncher(processor);\n  }\n\n  /** Check if ETag is generated for a list of JSON */\n  @Test\n  public void filterListEntityTest() throws Exception {\n\n    final ContainerResponse response =\n        resourceLauncher.service(\n            HttpMethod.GET, SERVICE_PATH + \"/list\", BASE_URI, null, null, null);\n    assertEquals(response.getStatus(), OK.getStatusCode());\n    // check entity\n    Assert.assertEquals(response.getEntity(), Arrays.asList(\"a\", \"b\", \"c\"));\n    // Check etag\n    List<Object> headerTags = response.getHttpHeaders().get(\"ETag\");\n    Assert.assertNotNull(headerTags);\n    Assert.assertEquals(headerTags.size(), 1);\n    Assert.assertEquals(headerTags.get(0), new EntityTag(\"900150983cd24fb0d6963f7d28e17f72\"));\n  }\n\n  /** Check if ETag is added in response if we're also using a custom header */\n  @Test\n  public void useExistingHeaders() throws Exception {\n\n    final ContainerResponse response =\n        resourceLauncher.service(\n            HttpMethod.GET, SERVICE_PATH + \"/modify\", BASE_URI, null, null, null);\n    assertEquals(response.getStatus(), OK.getStatusCode());\n    // check entity\n    Assert.assertEquals(response.getEntity(), \"helloContent\");\n\n    // headers = 2\n    Assert.assertEquals(response.getHttpHeaders().keySet().size(), 3);\n\n    // Check custom header\n    List<Object> customTags = response.getHttpHeaders().get(HttpHeaders.CONTENT_DISPOSITION);\n    Assert.assertNotNull(customTags);\n    Assert.assertEquals(customTags.size(), 1);\n    Assert.assertEquals(customTags.get(0), \"attachment; filename=my.json\");\n\n    // Check etag\n    List<Object> headerTags = response.getHttpHeaders().get(\"ETag\");\n    Assert.assertNotNull(headerTags);\n    Assert.assertEquals(headerTags.get(0), new EntityTag(\"77e671575d94cfd400ed26c5ef08e0fd\"));\n  }\n\n  /** Check if ETag is generated for a simple entity of JSON */\n  @Test\n  public void filterSingleEntityTest() throws Exception {\n\n    final ContainerResponse response =\n        resourceLauncher.service(\n            HttpMethod.GET, SERVICE_PATH + \"/single\", BASE_URI, null, null, null);\n    assertEquals(response.getStatus(), OK.getStatusCode());\n    // check entity\n    Assert.assertEquals(response.getEntity(), \"hello\");\n    // Check etag\n    List<Object> headerTags = response.getHttpHeaders().get(\"ETag\");\n    Assert.assertNotNull(headerTags);\n    Assert.assertEquals(headerTags.size(), 1);\n    Assert.assertEquals(headerTags.get(0), new EntityTag(\"5d41402abc4b2a76b9719d911017c592\"));\n  }\n\n  /** Check if ETag sent with header is redirecting to NOT_MODIFIED */\n  @Test\n  public void filterListEntityTestWithEtag() throws Exception {\n\n    Map<String, List<String>> headers = new HashMap<>();\n    headers.put(\n        \"If-None-Match\",\n        Collections.singletonList(new EntityTag(\"900150983cd24fb0d6963f7d28e17f72\").toString()));\n\n    final ContainerResponse response =\n        resourceLauncher.service(\n            HttpMethod.GET, SERVICE_PATH + \"/list\", BASE_URI, headers, null, null);\n    assertEquals(response.getStatus(), NOT_MODIFIED.getStatusCode());\n    // check null body\n    Assert.assertNull(response.getEntity());\n  }\n\n  /** Check if ETag sent with header is redirecting to NOT_MODIFIED */\n  @Test\n  public void filterSingleEntityTestWithEtag() throws Exception {\n\n    Map<String, List<String>> headers = new HashMap<>();\n    headers.put(\n        \"If-None-Match\",\n        Collections.singletonList(new EntityTag(\"5d41402abc4b2a76b9719d911017c592\").toString()));\n\n    final ContainerResponse response =\n        resourceLauncher.service(\n            HttpMethod.GET, SERVICE_PATH + \"/single\", BASE_URI, headers, null, null);\n    assertEquals(response.getStatus(), NOT_MODIFIED.getStatusCode());\n    // check null body\n    Assert.assertNull(response.getEntity());\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/java/org/eclipse/che/security/PasswordEncryptorsTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security;\n\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\n/**\n * @author Yevhenii Voevodin\n */\npublic class PasswordEncryptorsTest {\n\n  @Test(dataProvider = \"encryptorsProvider\")\n  public void testEncryption(PasswordEncryptor encryptor) throws Exception {\n    final String password = \"password\";\n\n    final String hash = encryptor.encrypt(password);\n    assertNotNull(hash, \"encrypted password's hash\");\n\n    assertTrue(encryptor.test(password, hash), \"password test\");\n  }\n\n  @DataProvider(name = \"encryptorsProvider\")\n  public Object[][] encryptorsProvider() {\n    return new Object[][] {{new SHA512PasswordEncryptor()}, {new PBKDF2PasswordEncryptor()}};\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-core/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.25thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n%nopex</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "core/che-core-api-dto/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-dto</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: Commons :: API :: DTO</name>\n    <properties>\n        <findbugs.failonerror>false</findbugs.failonerror>\n        <generated.test.sources.directory>${project.build.directory}/generated-test-sources/gen</generated.test.sources.directory>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.validation</groupId>\n            <artifactId>jakarta.validation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.reflections</groupId>\n            <artifactId>reflections</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.javassist</groupId>\n            <artifactId>javassist</artifactId>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile-test-sources</id>\n                        <phase>generate-test-sources</phase>\n                        <goals>\n                            <goal>testCompile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-test-resources</id>\n                        <phase>process-test-sources</phase>\n                        <goals>\n                            <goal>add-test-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${generated.test.sources.directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-test-sources</id>\n                        <phase>process-test-sources</phase>\n                        <goals>\n                            <goal>add-test-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${generated.test.sources.directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>generate-test-dto</id>\n                        <phase>process-test-sources</phase>\n                        <goals>\n                            <goal>java</goal>\n                        </goals>\n                        <configuration>\n                            <mainClass>org.eclipse.che.dto.generator.DtoGenerator</mainClass>\n                            <arguments>\n                                <argument>--dto_packages=org.eclipse.che.dto</argument>\n                                <argument>--gen_file_name=${generated.test.sources.directory}/org/eclipse/che/dto/DtoServerImpls.java</argument>\n                                <argument>--impl=server</argument>\n                                <argument>--package_base=${generated.test.sources.directory}/</argument>\n                            </arguments>\n                            <classpathScope>test</classpathScope>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>com.mycila</groupId>\n                <artifactId>license-maven-plugin</artifactId>\n                <configuration>\n                    <excludes>\n                        <exclude>**/generator/DtoGenerator.java</exclude>\n                        <exclude>**/generator/DtoImplClientTemplate.java</exclude>\n                        <exclude>**/generator/DtoImplServerTemplate.java</exclude>\n                        <exclude>**/generator/DtoTemplate.java</exclude>\n                        <exclude>**/generator/DtoImpl.java</exclude>\n                        <exclude>**/server/JsonSerializable.java</exclude>\n                        <exclude>**/shared/CompactJsonDto.java</exclude>\n                        <exclude>**/shared/SerializationIndex.java</exclude>\n                    </excludes>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/generator/DtoGenerator.java",
    "content": "// Copyright 2012 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\npackage org.eclipse.che.dto.generator;\n\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.net.URL;\nimport java.nio.file.Files;\nimport java.util.ArrayList;\nimport java.util.Comparator;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport org.eclipse.che.dto.server.DtoFactoryVisitor;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.dto.shared.DTOImpl;\nimport org.reflections.Reflections;\nimport org.reflections.scanners.SubTypesScanner;\nimport org.reflections.scanners.TypeAnnotationsScanner;\nimport org.reflections.util.ClasspathHelper;\nimport org.reflections.util.ConfigurationBuilder;\n\n/**\n * Simple source generator that takes in the packages list with interface definitions and generates\n * client and server DTO impls.\n */\npublic class DtoGenerator {\n  /** Flag: location of the packages that contains dto interfaces. */\n  private String[] dtoPackages = null;\n\n  /** Flag: Name of the generated java class file that contains the DTOs. */\n  private String genFileName = \"DataObjects.java\";\n\n  /** Flag: The type of impls to be generated, either client or server. */\n  private String impl = \"client\";\n\n  /**\n   * Flag: A pattern we can use to search an absolute path and find the start of the package\n   * definition.\")\n   */\n  private String packageBase = \"java.\";\n\n  public static void main(String[] args) {\n    DtoGenerator generator = new DtoGenerator();\n    for (String arg : args) {\n      if (arg.startsWith(\"--dto_packages=\")) {\n        generator.setDtoPackages(arg.substring(\"--dto_packages=\".length()));\n      } else if (arg.startsWith(\"--gen_file_name=\")) {\n        generator.setGenFileName(arg.substring(\"--gen_file_name=\".length()));\n      } else if (arg.startsWith(\"--impl=\")) {\n        generator.setImpl(arg.substring(\"--impl=\".length()));\n      } else if (arg.startsWith(\"--package_base=\")) {\n        generator.setPackageBase(arg.substring(\"--package_base=\".length()));\n      } else {\n        throw new RuntimeException(\"Unknown flag: \" + arg);\n        // System.exit(1);\n      }\n    }\n    generator.generate();\n  }\n\n  private static Set<URL> getClasspathForPackages(String[] packages) {\n    Set<URL> urls = new HashSet<>();\n    for (String pack : packages) {\n      urls.addAll(ClasspathHelper.forPackage(pack));\n    }\n    return urls;\n  }\n\n  public String[] getDtoPackages() {\n    return dtoPackages;\n  }\n\n  private void setDtoPackages(String packagesParam) {\n    setDtoPackages(packagesParam.split(\",\"));\n  }\n\n  public void setDtoPackages(String[] dtoPackages) {\n    this.dtoPackages = new String[dtoPackages.length];\n    System.arraycopy(dtoPackages, 0, this.dtoPackages, 0, this.dtoPackages.length);\n  }\n\n  public String getGenFileName() {\n    return genFileName;\n  }\n\n  public void setGenFileName(String genFileName) {\n    this.genFileName = genFileName;\n  }\n\n  public String getImpl() {\n    return impl;\n  }\n\n  public void setImpl(String impl) {\n    this.impl = impl;\n  }\n\n  public String getPackageBase() {\n    return packageBase;\n  }\n\n  public void setPackageBase(String packageBase) {\n    this.packageBase = packageBase;\n  }\n\n  public void generate() {\n\n    Set<URL> urls = getClasspathForPackages(dtoPackages);\n    genFileName = genFileName.replace('/', File.separatorChar);\n    String outputFilePath = genFileName;\n\n    // Extract the name of the output file that will contain all the DTOs and its package.\n    String myPackageBase = packageBase;\n    if (!myPackageBase.endsWith(\"/\")) {\n      myPackageBase += \"/\";\n    }\n    myPackageBase = myPackageBase.replace('/', File.separatorChar);\n\n    int packageStart = outputFilePath.lastIndexOf(myPackageBase) + myPackageBase.length();\n    int packageEnd = outputFilePath.lastIndexOf(File.separatorChar);\n    String fileName = outputFilePath.substring(packageEnd + 1);\n    String className = fileName.substring(0, fileName.indexOf(\".java\"));\n    String packageName =\n        outputFilePath.substring(packageStart, packageEnd).replace(File.separatorChar, '.');\n\n    File outFile = new File(outputFilePath);\n\n    try {\n      DtoTemplate dtoTemplate = new DtoTemplate(packageName, className, impl);\n      Reflections reflection =\n          new Reflections(\n              new ConfigurationBuilder()\n                  .setUrls(urls)\n                  .setScanners(new SubTypesScanner(), new TypeAnnotationsScanner()));\n\n      List<Class<?>> dtos = new ArrayList<>(reflection.getTypesAnnotatedWith(DTO.class));\n\n      // We sort alphabetically to ensure deterministic order of routing types.\n      dtos.sort(new ClassesComparator());\n\n      for (Class<?> clazz : dtos) {\n\n        // DTO are interface\n        if (clazz.isInterface()) {\n          dtoTemplate.addInterface(clazz);\n        }\n      }\n\n      reflection =\n          new Reflections(\n              new ConfigurationBuilder()\n                  .setUrls(ClasspathHelper.forClassLoader())\n                  .setScanners(new SubTypesScanner(), new TypeAnnotationsScanner()));\n      List<Class<?>> dtosDependencies =\n          new ArrayList<>(reflection.getTypesAnnotatedWith(DTO.class));\n      dtosDependencies.removeAll(dtos);\n\n      // We sort alphabetically to ensure deterministic order.\n      dtosDependencies.sort(new ClassesComparator());\n\n      reflection =\n          new Reflections(\n              new ConfigurationBuilder()\n                  .setUrls(ClasspathHelper.forClassLoader())\n                  .setScanners(new SubTypesScanner()));\n\n      for (Class<?> clazz : dtosDependencies) {\n        List<Class<?>> impls = new ArrayList<>(reflection.getSubTypesOf(clazz));\n        // We sort alphabetically to ensure deterministic order.\n        impls.sort(new ClassesComparator());\n        for (Class impl : impls) {\n          if (!(impl.isInterface()\n              || urls.contains(impl.getProtectionDomain().getCodeSource().getLocation()))) {\n            if (\"client\".equals(dtoTemplate.getImplType())) {\n              if (isClientImpl(impl)) {\n                dtoTemplate.addImplementation(clazz, impl);\n              }\n            } else if (\"server\".equals(dtoTemplate.getImplType())) {\n              if (isServerImpl(impl)) {\n                dtoTemplate.addImplementation(clazz, impl);\n              }\n            }\n          }\n        }\n      }\n\n      // Emit the generated file.\n      Files.createDirectories(outFile.toPath().getParent());\n      try (BufferedWriter writer = new BufferedWriter(new FileWriter(outFile))) {\n        writer.write(dtoTemplate.toString());\n      }\n\n      if (\"server\".equals(impl)) {\n        // Create file in META-INF/services/\n        File outServiceFile =\n            new File(\n                myPackageBase + \"META-INF/services/\" + DtoFactoryVisitor.class.getCanonicalName());\n        Files.createDirectories(outServiceFile.toPath().getParent());\n        try (BufferedWriter serviceFileWriter =\n            new BufferedWriter(new FileWriter(outServiceFile))) {\n          serviceFileWriter.write(packageName + \".\" + className);\n        }\n      }\n    } catch (IOException e) {\n      e.printStackTrace();\n    }\n  }\n\n  private boolean isClientImpl(Class<?> impl) {\n    DTOImpl a = impl.getAnnotation(DTOImpl.class);\n    return a != null && \"client\".equals(a.value());\n  }\n\n  private boolean isServerImpl(Class<?> impl) {\n    DTOImpl a = impl.getAnnotation(DTOImpl.class);\n    return a != null && \"server\".equals(a.value());\n  }\n\n  private static class ClassesComparator implements Comparator<Class> {\n    @Override\n    public int compare(Class o1, Class o2) {\n      return o1.getName().compareTo(o2.getName());\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/generator/DtoImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.generator;\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.ImmutableList;\nimport com.google.gson.stream.JsonWriter;\nimport java.io.IOException;\nimport java.io.StringWriter;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Comparator;\nimport java.util.HashMap;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.dto.shared.CompactJsonDto;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.dto.shared.DelegateTo;\nimport org.eclipse.che.dto.shared.JsonFieldName;\nimport org.eclipse.che.dto.shared.SerializationIndex;\n\n/** Abstract base class for the source generating template for a single DTO. */\nabstract class DtoImpl {\n  protected static final String COPY_JSONS_PARAM = \"copyJsons\";\n\n  private final Class<?> dtoInterface;\n  private final DtoTemplate enclosingTemplate;\n  private final boolean compactJson;\n  private final String implClassName;\n  private final List<Method> dtoMethods;\n\n  DtoImpl(DtoTemplate enclosingTemplate, Class<?> dtoInterface) {\n    this.enclosingTemplate = enclosingTemplate;\n    this.dtoInterface = dtoInterface;\n    this.implClassName = dtoInterface.getSimpleName() + \"Impl\";\n    this.compactJson = DtoTemplate.implementsInterface(dtoInterface, CompactJsonDto.class);\n    this.dtoMethods = ImmutableList.copyOf(calcDtoMethods());\n  }\n\n  protected boolean isCompactJson() {\n    return compactJson;\n  }\n\n  public Class<?> getDtoInterface() {\n    return dtoInterface;\n  }\n\n  public DtoTemplate getEnclosingTemplate() {\n    return enclosingTemplate;\n  }\n\n  protected String getJavaFieldName(String getterName) {\n    String fieldName;\n    if (getterName.startsWith(\"get\")) {\n      fieldName = getterName.substring(3);\n    } else {\n      // starts with \"is\", see method '#ignoreMethod(Method)'\n      fieldName = getterName.substring(2);\n    }\n    return normalizeIdentifier(Character.toLowerCase(fieldName.charAt(0)) + fieldName.substring(1));\n  }\n\n  private String normalizeIdentifier(String fieldName) {\n    // use $ prefix according to http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.8\n    switch (fieldName) {\n      case \"default\":\n        fieldName = \"$\" + fieldName;\n        break;\n        // add other keywords here\n    }\n    return fieldName;\n  }\n\n  private String getCamelCaseName(String fieldName) {\n    // see normalizeIdentifier method\n    if (fieldName.charAt(0) == '$') {\n      fieldName = fieldName.substring(1);\n    }\n    return Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);\n  }\n\n  protected String getImplClassName() {\n    return implClassName;\n  }\n\n  protected String getSetterName(String fieldName) {\n    return \"set\" + getCamelCaseName(fieldName);\n  }\n\n  protected String getWithName(String fieldName) {\n    return \"with\" + getCamelCaseName(fieldName);\n  }\n\n  protected String getListAdderName(String fieldName) {\n    return \"add\" + getCamelCaseName(fieldName);\n  }\n\n  protected String getMapPutterName(String fieldName) {\n    return \"put\" + getCamelCaseName(fieldName);\n  }\n\n  protected String getClearName(String fieldName) {\n    return \"clear\" + getCamelCaseName(fieldName);\n  }\n\n  protected String getEnsureName(String fieldName) {\n    return \"ensure\" + getCamelCaseName(fieldName);\n  }\n\n  /** Get the canonical name of the field by deriving it from a getter method's name. */\n  protected String getFieldNameFromGetterName(String getterName) {\n    String fieldName;\n    if (getterName.startsWith(\"get\")) {\n      fieldName = getterName.substring(3);\n    } else {\n      // starts with \"is\", see method '#ignoreMethod(Method)'\n      fieldName = getterName.substring(2);\n    }\n    return Character.toLowerCase(fieldName.charAt(0)) + fieldName.substring(1);\n  }\n\n  /**\n   * Get the name of the JSON field that corresponds to the given getter method in a DTO-annotated\n   * type.\n   */\n  protected String getJsonFieldName(Method getterMethod) {\n    // First, check if a custom field name is defined for the getter\n    JsonFieldName fieldNameAnn = getterMethod.getAnnotation(JsonFieldName.class);\n    if (fieldNameAnn != null) {\n      String customFieldName = fieldNameAnn.value();\n      if (customFieldName != null && !customFieldName.isEmpty()) {\n        return customFieldName;\n      }\n    }\n    // If no custom name is given for the field, deduce it from the camel notation\n    return getFieldNameFromGetterName(getterMethod.getName());\n  }\n\n  /**\n   * Our super interface may implement some other interface (or not). We need to know because if it\n   * does then we need to directly extend said super interfaces impl class.\n   */\n  protected Class<?> getSuperDtoInterface(Class<?> dto) {\n    Class<?>[] superInterfaces = dto.getInterfaces();\n    if (superInterfaces.length > 0) {\n      for (Class<?> superInterface : superInterfaces) {\n        if (superInterface.isAnnotationPresent(DTO.class)) {\n          return superInterface;\n        }\n      }\n    }\n    return null;\n  }\n\n  protected List<Method> getDtoGetters(Class<?> dto) {\n    final Map<String, Method> getters = new HashMap<>();\n    if (enclosingTemplate.isDtoInterface(dto)) {\n      addDtoGetters(dto, getters);\n      addSuperGetters(dto, getters);\n    }\n    List<Method> dtoGetters = new ArrayList<>(getters.values());\n    dtoGetters.sort(new MethodComparator());\n    return dtoGetters;\n  }\n\n  /** Get the names of all the getters in the super DTO interface and upper ancestors. */\n  protected Set<String> getSuperGetterNames(Class<?> dto) {\n    final Map<String, Method> getters = new HashMap<>();\n    Class<?> superDto = getSuperDtoInterface(dto);\n    if (superDto != null) {\n      addDtoGetters(superDto, getters);\n      addSuperGetters(superDto, getters);\n    }\n    return getters.keySet();\n  }\n\n  /**\n   * Adds all getters from parent <b>NOT DTO</b> interfaces for given {@code dto} interface. Does\n   * not add method when it is already present in getters map.\n   */\n  private void addSuperGetters(Class<?> dto, Map<String, Method> getters) {\n    for (Class<?> superInterface : dto.getInterfaces()) {\n      if (!superInterface.isAnnotationPresent(DTO.class)) {\n        for (Method method : superInterface.getDeclaredMethods()) {\n          // when method is already present in map then child interface\n          // overrides it, which means that it should not be put into getters\n          if (isDtoGetter(method) && !getters.containsKey(method.getName())) {\n            getters.put(method.getName(), method);\n          }\n        }\n        addSuperGetters(superInterface, getters);\n      }\n    }\n  }\n\n  protected List<Method> getInheritedDtoGetters(Class<?> dto) {\n    List<Method> getters = new ArrayList<>();\n    if (enclosingTemplate.isDtoInterface(dto)) {\n      Class<?> superInterface = getSuperDtoInterface(dto);\n      while (superInterface != null) {\n        addDtoGetters(superInterface, getters);\n        superInterface = getSuperDtoInterface(superInterface);\n      }\n\n      addDtoGetters(dto, getters);\n    }\n    return getters;\n  }\n\n  private void addDtoGetters(Class<?> dto, Map<String, Method> getters) {\n    for (Method method : dto.getDeclaredMethods()) {\n      if (!method.isDefault() && isDtoGetter(method)) {\n        getters.put(method.getName(), method);\n      }\n    }\n  }\n\n  private void addDtoGetters(Class<?> dto, List<Method> getters) {\n    for (Method method : dto.getDeclaredMethods()) {\n      if (!method.isDefault() && isDtoGetter(method)) {\n        getters.add(method);\n      }\n    }\n  }\n\n  /** Check is specified method is DTO getter. */\n  protected boolean isDtoGetter(Method method) {\n    if (method.isAnnotationPresent(DelegateTo.class)) {\n      return false;\n    }\n    String methodName = method.getName();\n    if ((methodName.startsWith(\"get\") || methodName.startsWith(\"is\"))\n        && method.getParameterTypes().length == 0) {\n      if (methodName.length() > 2 && methodName.startsWith(\"is\")) {\n        return method.getReturnType() == Boolean.class || method.getReturnType() == boolean.class;\n      }\n      return methodName.length() > 3;\n    }\n    return false;\n  }\n\n  /** Tests whether or not a given generic type is allowed to be used as a generic. */\n  protected static boolean isWhitelisted(Class<?> genericType) {\n    return DtoTemplate.jreWhitelist.contains(genericType);\n  }\n\n  /** Tests whether or not a given return type is a number primitive or its wrapper type. */\n  protected static boolean isNumber(Class<?> returnType) {\n    if (null != returnType\n        && (Number.class.isAssignableFrom(returnType)\n            || int.class.equals(returnType)\n            || long.class.equals(returnType)\n            || short.class.equals(returnType)\n            || float.class.equals(returnType)\n            || double.class.equals(returnType)\n            || byte.class.equals(returnType))) {\n      return true;\n    }\n    return false;\n  }\n\n  /** Tests whether or not a given return type is a boolean primitive or its wrapper type. */\n  protected static boolean isBoolean(Class<?> returnType) {\n    return returnType.equals(Boolean.class) || returnType.equals(boolean.class);\n  }\n\n  protected static String getPrimitiveName(Class<?> returnType) {\n    if (returnType.equals(Integer.class) || returnType.equals(int.class)) {\n      return \"int\";\n    } else if (returnType.equals(Long.class) || returnType.equals(long.class)) {\n      return \"long\";\n    } else if (returnType.equals(Short.class) || returnType.equals(short.class)) {\n      return \"short\";\n    } else if (returnType.equals(Float.class) || returnType.equals(float.class)) {\n      return \"float\";\n    } else if (returnType.equals(Double.class) || returnType.equals(double.class)) {\n      return \"double\";\n    } else if (returnType.equals(Byte.class) || returnType.equals(byte.class)) {\n      return \"byte\";\n    } else if (returnType.equals(Boolean.class) || returnType.equals(boolean.class)) {\n      return \"boolean\";\n    } else if (returnType.equals(Character.class) || returnType.equals(char.class)) {\n      return \"char\";\n    }\n    throw new IllegalArgumentException(\"Unknown wrapper class type.\");\n  }\n\n  /** Tests whether or not a given return type is a java.util.List. */\n  public static boolean isList(Class<?> returnType) {\n    return returnType.equals(List.class);\n  }\n\n  /** Tests whether or not a given return type is a java.util.Map. */\n  public static boolean isMap(Class<?> returnType) {\n    return returnType.equals(Map.class);\n  }\n\n  public static boolean isAny(Class<?> returnType) {\n    return returnType.equals(Object.class);\n  }\n\n  /**\n   * Expands the type and its first generic parameter (which can also have a first generic parameter\n   * (...)).\n   *\n   * <p>For example, JsonArray&lt;JsonStringMap&lt;JsonArray&lt;SomeDto&gt;&gt;&gt; would produce\n   * [JsonArray, JsonStringMap, JsonArray, SomeDto].\n   */\n  public static List<Type> expandType(Type curType) {\n    List<Type> types = new LinkedList<>();\n    do {\n      types.add(curType);\n\n      if (curType instanceof ParameterizedType) {\n        Type[] genericParamTypes = ((ParameterizedType) curType).getActualTypeArguments();\n        Type rawType = ((ParameterizedType) curType).getRawType();\n        boolean map = rawType instanceof Class<?> && rawType == Map.class;\n        if (!map && genericParamTypes.length != 1) {\n          throw new IllegalStateException(\n              \"Multiple type parameters are not supported (neither are zero type parameters)\");\n        }\n        Type genericParamType = map ? genericParamTypes[1] : genericParamTypes[0];\n        if (genericParamType instanceof Class<?>) {\n          Class<?> genericParamTypeClass = (Class<?>) genericParamType;\n          if (isWhitelisted(genericParamTypeClass)) {\n            assert genericParamTypeClass.equals(String.class)\n                : \"For JSON serialization there can be only strings or DTO types. \";\n          }\n        }\n        curType = genericParamType;\n      } else {\n        if (curType instanceof Class) {\n          Class<?> clazz = (Class<?>) curType;\n          if (isList(clazz) || isMap(clazz)) {\n            throw new DtoTemplate.MalformedDtoInterfaceException(\n                \"JsonArray and JsonStringMap must have a generic type specified.\");\n          }\n        }\n        curType = null;\n      }\n    } while (curType != null);\n    return types;\n  }\n\n  public static Class<?> getRawClass(Type type) {\n    return (Class<?>)\n        ((type instanceof ParameterizedType) ? ((ParameterizedType) type).getRawType() : type);\n  }\n\n  /**\n   * Returns public methods specified in DTO interface.\n   *\n   * <p>\n   *\n   * <p>For compact DTO (see {@link org.eclipse.che.dto.shared.CompactJsonDto}) methods are ordered\n   * corresponding to {@link org.eclipse.che.dto.shared.SerializationIndex} annotation.\n   *\n   * <p>\n   *\n   * <p>Gaps in index sequence are filled with {@code null}s.\n   */\n  protected List<Method> getDtoMethods() {\n    return dtoMethods;\n  }\n\n  private List<Method> calcDtoMethods() {\n    if (!compactJson) {\n      List<Method> result = new ArrayList<>(Arrays.asList(dtoInterface.getMethods()));\n      result.sort(new MethodComparator());\n      return result;\n    }\n\n    Map<Integer, Method> methodsMap = new HashMap<>();\n    int maxIndex = 0;\n    for (Method method : dtoInterface.getMethods()) {\n      SerializationIndex serializationIndex = method.getAnnotation(SerializationIndex.class);\n      Preconditions.checkNotNull(\n          serializationIndex,\n          \"Serialization index is not specified for %s in %s\",\n          method.getName(),\n          dtoInterface.getSimpleName());\n\n      // \"53\" is the number of bits in JS integer.\n      // This restriction will allow to add simple bit-field\n      // \"serialization-skipping-list\" in the future.\n      int index = serializationIndex.value();\n      Preconditions.checkState(\n          index > 0 && index <= 53,\n          \"Serialization index out of range [1..53] for %s in %s\",\n          method.getName(),\n          dtoInterface.getSimpleName());\n\n      Preconditions.checkState(\n          !methodsMap.containsKey(index),\n          \"Duplicate serialization index for %s in %s\",\n          method.getName(),\n          dtoInterface.getSimpleName());\n\n      maxIndex = Math.max(index, maxIndex);\n      methodsMap.put(index, method);\n    }\n\n    Method[] methods = new Method[maxIndex];\n    for (int index = 0; index < maxIndex; index++) {\n      methods[index] = methodsMap.get(index + 1);\n    }\n\n    List<Method> result = new ArrayList<>(Arrays.asList(methods));\n    result.sort(new MethodComparator());\n\n    return result;\n  }\n\n  protected boolean isLastMethod(Method method) {\n    Preconditions.checkNotNull(method);\n    return method == dtoMethods.get(dtoMethods.size() - 1);\n  }\n\n  /** Create a textual representation of a string literal that evaluates to the given value. */\n  protected String quoteStringLiteral(String value) {\n    StringWriter sw = new StringWriter();\n    try (JsonWriter writer = new JsonWriter(sw)) {\n      writer.setLenient(true);\n      writer.value(value);\n      writer.flush();\n    } catch (IOException ex) {\n      throw new RuntimeException(\"Unexpected I/O failure: \" + ex.getLocalizedMessage(), ex);\n    }\n    return sw.toString();\n  }\n\n  /**\n   * @return String representing the source definition for the DTO impl as an inner class.\n   */\n  abstract String serialize();\n\n  private static class MethodComparator implements Comparator<Method> {\n    @Override\n    public int compare(Method o1, Method o2) {\n      return getMethodSignature(o1).compareTo(getMethodSignature(o2));\n    }\n\n    private String getMethodSignature(Method method) {\n      return method.getReturnType().getName()\n          + \" \"\n          + method.getName()\n          + \"(\"\n          + Arrays.stream(method.getParameterTypes())\n              .map(Class::getName)\n              .collect(Collectors.joining(\", \"))\n          + \")\";\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/generator/DtoImplClientTemplate.java",
    "content": "/*\n * Copyright (c) 2012-2016 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.generator;\n\nimport com.google.common.base.Preconditions;\nimport com.google.common.primitives.Primitives;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.dto.server.JsonSerializable;\nimport org.eclipse.che.dto.shared.DTOImpl;\nimport org.eclipse.che.dto.shared.DelegateRule;\nimport org.eclipse.che.dto.shared.DelegateTo;\nimport org.eclipse.che.dto.shared.JsonArray;\nimport org.eclipse.che.dto.shared.JsonStringMap;\nimport org.eclipse.che.dto.shared.SerializationIndex;\n\n/** Generates the source code for a generated Client DTO impl. */\npublic class DtoImplClientTemplate extends DtoImpl {\n  private static final String CLIENT_DTO_MARKER =\n      \"  @\" + DTOImpl.class.getCanonicalName() + \"(\\\"client\\\")\\n\";\n\n  DtoImplClientTemplate(DtoTemplate template, Class<?> superInterface) {\n    super(template, superInterface);\n  }\n\n  @Override\n  String serialize() {\n    StringBuilder builder = new StringBuilder();\n    final Class<?> dtoInterface = getDtoInterface();\n    final String dtoInterfaceName = dtoInterface.getCanonicalName();\n    emitPreamble(dtoInterface, builder);\n    List<Method> getters = getDtoGetters(dtoInterface);\n    // Enumerate the getters and emit field names and getters + setters.\n    emitFields(getters, builder);\n    emitGettersAndSetters(getters, builder);\n    List<Method> inheritedGetters = getInheritedDtoGetters(dtoInterface);\n    List<Method> methods = new ArrayList<>();\n    methods.addAll(getters);\n    Set<String> getterNames = new HashSet<>();\n    for (Method getter : getters) {\n      getterNames.add(getter.getName());\n    }\n    for (Method getter : inheritedGetters) {\n      if (getterNames.add(getter.getName())) {\n        methods.add(getter);\n      }\n    }\n    // equals, hashCode, serialization and copy constructor\n    emitEqualsAndHashCode(methods, builder);\n    emitSerializer(methods, builder);\n    emitDeserializer(methods, builder);\n    emitDeserializerShortcut(builder);\n    emitCopyConstructor(methods, builder);\n    // Delegation DTO methods.\n    emitDelegateMethods(builder);\n    // \"builder\" method, it is method that set field and return \"this\" instance\n    emitWithMethods(getters, dtoInterfaceName, builder);\n    // Implement withXXX methods that are declared directly in this DTO even if there are no any\n    // getter for the fields.\n    // Need that to override methods from super DTO and return correct type for with method.\n    // @DTO\n    // public interface A {\n    //     String getProperty();\n    //     void setProperty(String property);\n    //     A withProperty();\n    // }\n    //\n    // @DTO\n    // public interface B extends A {\n    //     // New methods\n    //     ...\n    //     // Override method to return type B instead of A.\n    //     B withProperty();\n    // }\n    getterNames.clear();\n    for (Method getter : getters) {\n      getterNames.add(getter.getName());\n    }\n    for (Method method : dtoInterface.getDeclaredMethods()) {\n      if (!method.isDefault() && method.getName().startsWith(\"with\")) {\n        String noPrefixName = method.getName().substring(4);\n        // Check do we already generate withXXX method or not.\n        // If there is getter in DTO interface we already have withXXX method\n        if (!getterNames.contains(\"get\" + noPrefixName)\n            && !getterNames.contains(\"is\" + noPrefixName)) {\n          String fieldName =\n              Character.toLowerCase(noPrefixName.charAt(0)) + noPrefixName.substring(1);\n          String parameterFqn = getFqParameterizedName(method.getGenericParameterTypes()[0]);\n          emitWithMethod(method.getName(), fieldName, parameterFqn, dtoInterfaceName, builder);\n        }\n      }\n    }\n    emitPostamble(builder);\n    return builder.toString();\n  }\n\n  private void emitEqualsAndHashCode(List<Method> getters, StringBuilder builder) {\n    builder.append(\"    @Override\\n\");\n    builder.append(\"    public boolean equals(Object o) {\\n\");\n    builder.append(\"      if (!(o instanceof \").append(getImplClassName()).append(\")) {\\n\");\n    builder.append(\"        return false;\\n\");\n    builder.append(\"      }\\n\");\n    builder\n        .append(\"      \")\n        .append(getImplClassName())\n        .append(\" other = (\")\n        .append(getImplClassName())\n        .append(\") o;\\n\");\n    for (Method getter : getters) {\n      String fieldName = getJavaFieldName(getter.getName());\n      Class<?> returnType = getter.getReturnType();\n      if (returnType.isPrimitive()) {\n        builder\n            .append(\"      if (this.\")\n            .append(fieldName)\n            .append(\" != other.\")\n            .append(fieldName)\n            .append(\") {\\n\");\n        builder.append(\"        return false;\\n\");\n        builder.append(\"      }\\n\");\n      } else {\n        builder.append(\"      if (this.\").append(fieldName).append(\" != null) {\\n\");\n        builder\n            .append(\"        if (!this.\")\n            .append(fieldName)\n            .append(\".equals(other.\")\n            .append(fieldName)\n            .append(\")) {\\n\");\n        builder.append(\"          return false;\\n\");\n        builder.append(\"        }\\n\");\n        builder.append(\"      } else {\\n\");\n        builder.append(\"        if (other.\").append(fieldName).append(\" != null) {\\n\");\n        builder.append(\"          return false;\\n\");\n        builder.append(\"        }\\n\");\n        builder.append(\"      }\\n\");\n      }\n    }\n    builder.append(\"      return true;\\n\");\n    builder.append(\"    }\\n\\n\");\n    // this isn't the greatest hash function in the world, but it meets the requirement that for any\n    // two objects A and B, A.equals(B) only if A.hashCode() == B.hashCode()\n    builder.append(\"    @Override\\n\");\n    builder.append(\"    public int hashCode() {\\n\");\n    builder.append(\"      int hash = 7;\\n\");\n    for (Method method : getters) {\n      Class<?> type = method.getReturnType();\n\n      String fieldName = getJavaFieldName(method.getName());\n      if (type.isPrimitive()) {\n        Class<?> wrappedType = Primitives.wrap(type);\n        builder\n            .append(\"      hash = hash * 31 + \")\n            .append(wrappedType.getName())\n            .append(\".valueOf(\")\n            .append(fieldName)\n            .append(\").hashCode();\\n\");\n      } else {\n        builder\n            .append(\"      hash = hash * 31 + (\")\n            .append(fieldName)\n            .append(\" != null ? \")\n            .append(fieldName)\n            .append(\".hashCode() : 0);\\n\");\n      }\n    }\n    builder.append(\"      return hash;\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitFactoryMethod(StringBuilder builder) {\n    builder.append(\"    public static \");\n    builder.append(getImplClassName());\n    builder.append(\" make() {\");\n    builder.append(\"\\n        return new \");\n    builder.append(getImplClassName());\n    builder.append(\"();\\n    }\\n\\n\");\n  }\n\n  private void emitFields(List<Method> getters, StringBuilder builder) {\n    for (Method getter : getters) {\n      String fieldName = getJavaFieldName(getter.getName());\n      builder.append(\"    \");\n      builder.append(getFieldTypeAndAssignment(getter, fieldName));\n    }\n    builder.append(\"\\n\");\n  }\n\n  /** Emits a method to get a field. Getting a collection ensures that the collection is created. */\n  private void emitGetter(\n      Method method,\n      String methodName,\n      String fieldName,\n      String returnType,\n      StringBuilder builder) {\n    builder.append(\"    @Override\\n    public \");\n    builder.append(returnType);\n    builder.append(\" \");\n    builder.append(methodName);\n    builder.append(\"() {\\n\");\n    // Initialize the collection.\n    Class<?> returnTypeClass = method.getReturnType();\n    if (isList(returnTypeClass) || isMap(returnTypeClass)) {\n      builder.append(\"      \");\n      builder.append(getEnsureName(fieldName));\n      builder.append(\"();\\n\");\n    }\n    builder.append(\"      return \");\n    builder.append(fieldName);\n    builder.append(\";\\n    }\\n\\n\");\n  }\n\n  private void emitGettersAndSetters(List<Method> getters, StringBuilder builder) {\n    for (Method getter : getters) {\n      String fieldName = getJavaFieldName(getter.getName());\n      if (fieldName == null) {\n        continue;\n      }\n      Class<?> returnTypeClass = getter.getReturnType();\n      String returnType = getFqParameterizedName(getter.getGenericReturnType());\n      // Getter.\n      emitGetter(getter, getter.getName(), fieldName, returnType, builder);\n      // Setter.\n      emitSetter(fieldName, returnType, builder);\n      // List/Map-specific methods.\n      if (isList(returnTypeClass)) {\n        emitListAdd(getter, fieldName, builder);\n        emitClear(fieldName, builder);\n        emitEnsureCollection(getter, fieldName, builder);\n      } else if (isMap(returnTypeClass)) {\n        emitMapPut(getter, fieldName, builder);\n        emitClear(fieldName, builder);\n        emitEnsureCollection(getter, fieldName, builder);\n      }\n    }\n  }\n\n  private void emitDelegateMethod(\n      String returnType,\n      Method method,\n      Class<?> delegateToType,\n      String delegateToMethod,\n      StringBuilder builder) {\n    builder\n        .append(\"    public \")\n        .append(returnType)\n        .append(\" \")\n        .append(method.getName())\n        .append(\"(\");\n    Type[] parameterTypes = method.getGenericParameterTypes();\n    String[] parameters = new String[parameterTypes.length];\n    for (int i = 0; i < parameterTypes.length; i++) {\n      if (i > 0) {\n        builder.append(\", \");\n      }\n      builder.append(getFqParameterizedName(parameterTypes[i]));\n      String parameter = \"$p\" + i;\n      builder.append(\" \").append(parameter);\n      parameters[i] = parameter;\n    }\n    builder.append(\") {\\n\");\n    builder.append(\"      \");\n    if (!\"void\".equals(returnType)) {\n      builder.append(\"return \");\n    }\n    builder\n        .append(delegateToType.getCanonicalName())\n        .append(\".\")\n        .append(delegateToMethod)\n        .append(\"(\");\n    builder.append(\"this\");\n    for (String parameter : parameters) {\n      builder.append(\", \");\n      builder.append(parameter);\n    }\n    builder.append(\");\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitDelegateMethods(StringBuilder builder) {\n    for (Method method : getDtoMethods()) {\n      DelegateTo delegateTo = method.getAnnotation(DelegateTo.class);\n      if (delegateTo != null) {\n        DelegateRule serverRule = delegateTo.server();\n        String returnType = getFqParameterizedName(method.getGenericReturnType());\n        emitDelegateMethod(returnType, method, serverRule.type(), serverRule.method(), builder);\n      }\n    }\n  }\n\n  private void emitSerializer(List<Method> getters, StringBuilder builder) {\n    builder.append(\"    public JSONObject toJsonObject() {\\n\");\n    // The default toJsonElement() returns JSONs for unsafe use thus 'any' properties should be\n    // copied\n    builder.append(\"      return toJsonObjectInt(true);\\n\");\n    builder.append(\"    }\\n\");\n    builder\n        .append(\"    public JSONObject toJsonObjectInt(boolean \")\n        .append(COPY_JSONS_PARAM)\n        .append(\") {\\n\");\n    if (isCompactJson()) {\n      builder.append(\"      JSONArray result = new JSONArray();\\n\");\n      for (Method method : getters) {\n        emitSerializeFieldForMethodCompact(method, builder);\n      }\n    } else {\n      builder.append(\"      JSONObject result = new JSONObject();\\n\");\n      for (Method getter : getters) {\n        emitSerializeFieldForMethod(getter, builder);\n      }\n    }\n    builder.append(\"      return result;\\n\");\n    builder.append(\"    }\\n\");\n    builder.append(\"\\n\");\n    builder.append(\"    @Override\\n\");\n    builder.append(\"    public String toJson() {\\n\");\n    builder.append(\"      return toJsonObjectInt(false).toString();\\n\");\n    builder.append(\"    }\\n\");\n    builder.append(\"\\n\");\n    builder.append(\"    @Override\\n\");\n    builder.append(\"    public String toString() {\\n\");\n    builder.append(\"      return toJson();\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitSerializeFieldForMethod(Method getter, final StringBuilder builder) {\n    final String fieldName = getFieldNameFromGetterName(getter.getName());\n    final String fieldNameOut = fieldName + \"Out\";\n    final String baseIndentation = \"      \";\n    final String jsonFieldName = getJsonFieldName(getter);\n    final String jsonFieldNameLiteral = quoteStringLiteral(jsonFieldName);\n    builder.append(\"\\n\");\n    List<Type> expandedTypes = expandType(getter.getGenericReturnType());\n    emitSerializerImpl(\n        expandedTypes,\n        0,\n        builder,\n        getJavaFieldName(getter.getName()),\n        fieldNameOut,\n        baseIndentation);\n    builder.append(\"      result.put(\");\n    builder.append(jsonFieldNameLiteral);\n    builder.append(\", \");\n    builder.append(fieldNameOut);\n    builder.append(\");\\n\");\n  }\n\n  private void emitSerializeFieldForMethodCompact(Method getter, StringBuilder builder) {\n    if (getter == null) {\n      builder.append(\"      result.set(0, JSONNull.getInstance());\\n\");\n      return;\n    }\n    final String jsonFieldName = getFieldNameFromGetterName(getter.getName());\n    final String fieldNameOut = jsonFieldName + \"Out\";\n    final String baseIndentation = \"      \";\n    builder.append(\"\\n\");\n    List<Type> expandedTypes = expandType(getter.getGenericReturnType());\n    emitSerializerImpl(\n        expandedTypes,\n        0,\n        builder,\n        getJavaFieldName(getter.getName()),\n        fieldNameOut,\n        baseIndentation);\n    if (isLastMethod(getter)) {\n      if (isList(getRawClass(expandedTypes.get(0)))) {\n        builder.append(\"      if (\").append(fieldNameOut).append(\".size() != 0) {\\n\");\n        builder.append(\"        result.set(result.size(), \").append(fieldNameOut).append(\");\\n\");\n        builder.append(\"      }\\n\");\n        return;\n      }\n    }\n    builder.append(\"      result.add(\").append(fieldNameOut).append(\");\\n\");\n  }\n\n  /**\n   * Produces code to serialize the type with the given variable names.\n   *\n   * @param expandedTypes the type and its generic (and its generic (..)) expanded into a list, @see\n   *     {@link #expandType(java.lang.reflect.Type)}\n   * @param depth the depth (in the generics) for this recursive call. This can be used to index\n   *     into {@code expandedTypes}\n   * @param builder StringBuilder to add generated code for serialization\n   * @param inVar the java type that will be the input for serialization\n   * @param outVar the JsonElement subtype that will be the output for serialization\n   * @param i indentation string\n   */\n  private void emitSerializerImpl(\n      List<Type> expandedTypes,\n      int depth,\n      StringBuilder builder,\n      String inVar,\n      String outVar,\n      String i) {\n    Type type = expandedTypes.get(depth);\n    String childInVar = inVar + \"_\";\n    String childOutVar = outVar + \"_\";\n    String entryVar = \"entry\" + depth;\n    Class<?> rawClass = getRawClass(type);\n    if (isList(rawClass)) {\n      String childInTypeName = getImplName(expandedTypes.get(depth + 1), false);\n      builder.append(i).append(\"JSONArray \").append(outVar).append(\" = new JSONArray();\\n\");\n      if (depth == 0) {\n        builder.append(i).append(\"this.\").append(getEnsureName(inVar)).append(\"();\\n\");\n      }\n      builder\n          .append(i)\n          .append(\"for (\")\n          .append(childInTypeName)\n          .append(\" \")\n          .append(childInVar)\n          .append(\" : \")\n          .append(depth == 0 ? \"this.\" + inVar : inVar)\n          .append(\") {\\n\");\n    } else if (isMap(rawClass)) {\n      String childInTypeName = getImplName(expandedTypes.get(depth + 1), false);\n      builder.append(i).append(\"JSONObject \").append(outVar).append(\" = new JSONObject();\\n\");\n      if (depth == 0) {\n        builder.append(i).append(\"this.\").append(getEnsureName(inVar)).append(\"();\\n\");\n      }\n      builder\n          .append(i)\n          .append(\"for (java.util.Map.Entry<String, \")\n          .append(childInTypeName)\n          .append(\"> \")\n          .append(entryVar)\n          .append(\" : \")\n          .append(depth == 0 ? \"this.\" + inVar : inVar)\n          .append(\".entrySet()) {\\n\");\n      builder\n          .append(i)\n          .append(\"  \")\n          .append(childInTypeName)\n          .append(\" \")\n          .append(childInVar)\n          .append(\" = \")\n          .append(entryVar)\n          .append(\".getValue();\\n\");\n    } else if (rawClass.isEnum()) {\n      builder\n          .append(i)\n          .append(\"JSONValue \")\n          .append(outVar)\n          .append(\" = (\")\n          .append(depth == 0 ? \"this.\" + inVar : inVar)\n          .append(\" == null) ? JSONNull.getInstance() : new JSONString(\")\n          .append(depth == 0 ? \"this.\" + inVar : inVar)\n          .append(\".name());\\n\");\n    } else if (getEnclosingTemplate().isDtoInterface(rawClass)) {\n      builder\n          .append(i)\n          .append(\"JSONValue \")\n          .append(outVar)\n          .append(\" = \")\n          .append(depth == 0 ? \"this.\" + inVar : inVar)\n          .append(\" == null ? JSONNull.getInstance() : ((\")\n          .append(getImplNameForDto((Class<?>) expandedTypes.get(depth)))\n          .append(\")\")\n          .append(inVar)\n          .append(\").toJsonObject();\\n\");\n    } else if (rawClass.equals(String.class)) {\n      builder\n          .append(i)\n          .append(\"JSONValue \")\n          .append(outVar)\n          .append(\" = (\")\n          .append(depth == 0 ? \"this.\" + inVar : inVar)\n          .append(\" == null) ? JSONNull.getInstance() : new JSONString(\")\n          .append(depth == 0 ? \"this.\" + inVar : inVar)\n          .append(\");\\n\");\n    } else if (isNumber(rawClass)) {\n      if (rawClass.isPrimitive()) {\n        builder\n            .append(i)\n            .append(\"JSONValue \")\n            .append(outVar)\n            .append(\" = new JSONNumber(\")\n            .append(depth == 0 ? \"this.\" + inVar : inVar)\n            .append(\");\\n\");\n      } else {\n        builder\n            .append(i)\n            .append(\"JSONValue \")\n            .append(outVar)\n            .append(\" = \")\n            .append(depth == 0 ? \" this.\" + inVar : inVar)\n            .append(\" == null ? JSONNull.getInstance() : new JSONNumber(\")\n            .append(depth == 0 ? \"this.\" + inVar : inVar)\n            .append(\");\\n\");\n      }\n    } else if (isBoolean(rawClass)) {\n      if (rawClass.isPrimitive()) {\n        builder\n            .append(i)\n            .append(\"JSONValue \")\n            .append(outVar)\n            .append(\" = JSONBoolean.getInstance(\")\n            .append(depth == 0 ? \"this.\" + inVar : inVar)\n            .append(\");\\n\");\n      } else {\n        builder\n            .append(i)\n            .append(\"JSONValue \")\n            .append(outVar)\n            .append(\" = \")\n            .append(depth == 0 ? \" this.\" + inVar : inVar)\n            .append(\" == null ? JSONNull.getInstance() : JSONBoolean.getInstance(\")\n            .append(depth == 0 ? \"this.\" + inVar : inVar)\n            .append(\");\\n\");\n      }\n    } else if (isAny(rawClass)) {\n      // TODO a better method to clone instances of\n      // outVar = inVar == null ? JsonNull.INSTNACE : (copyJsons ? new JsonParser().parse(inVar) :\n      // inVar);\n      builder\n          .append(i)\n          .append(\"JSONValue \")\n          .append(outVar)\n          .append(\" = \")\n          .append(depth == 0 ? \" this.\" + inVar : inVar)\n          .append(\" == null ? JSONNull.getInstance() : (\");\n      appendCopyJsonExpression(inVar, builder).append(\");\\n\");\n    } else {\n      final Class<?> dtoImplementation = getEnclosingTemplate().getDtoImplementation(rawClass);\n      if (dtoImplementation != null) {\n        builder\n            .append(i)\n            .append(\"JSONValue \")\n            .append(outVar)\n            .append(\" = \")\n            .append(depth == 0 ? \"this.\" + inVar : inVar)\n            .append(\" == null ? JSONNull.getInstance() : ((\")\n            .append(dtoImplementation.getCanonicalName())\n            .append(\")\")\n            .append(depth == 0 ? \"this.\" + inVar : inVar)\n            .append(\").toJsonObject();\\n\");\n      } else {\n        throw new IllegalArgumentException(\n            \"Unable to generate client implementation for DTO interface \"\n                + getDtoInterface().getCanonicalName()\n                + \". Type \"\n                + rawClass\n                + \" is not allowed to use in DTO interface.\");\n      }\n    }\n    if (depth + 1 < expandedTypes.size()) {\n      emitSerializerImpl(expandedTypes, depth + 1, builder, childInVar, childOutVar, i + \"  \");\n    }\n    if (isList(rawClass)) {\n      builder\n          .append(i)\n          .append(\"  \")\n          .append(outVar)\n          .append(\".set(\")\n          .append(outVar)\n          .append(\".size(), \")\n          .append(childOutVar)\n          .append(\");\\n\");\n      builder.append(i).append(\"}\\n\");\n    } else if (isMap(rawClass)) {\n      builder\n          .append(i)\n          .append(\"  \")\n          .append(outVar)\n          .append(\".put(\")\n          .append(entryVar)\n          .append(\".getKey(), \")\n          .append(childOutVar)\n          .append(\");\\n\");\n      builder.append(i).append(\"}\\n\");\n    }\n  }\n\n  /**\n   * Append the expression that clones the given JsonElement variable into a new value. If the\n   * copyJons run-time parameter is set to false, then the expression won't perform a clone but\n   * instead will reuse the variable by reference.\n   */\n  private static StringBuilder appendCopyJsonExpression(String inVar, StringBuilder builder) {\n    builder.append(COPY_JSONS_PARAM).append(\" ? \");\n    appendNaiveCopyJsonExpression(inVar, builder)\n        .append(\" : (JSONValue)(\")\n        .append(inVar)\n        .append(\")\");\n    return builder;\n  }\n\n  private static StringBuilder appendNaiveCopyJsonExpression(\n      String inValue, StringBuilder builder) {\n    return builder.append(\"JSONParser.parseStrict((\").append(inValue).append(\").toString())\");\n  }\n\n  /** Generates a static factory method that creates a new instance based on a JsonElement. */\n  private void emitDeserializer(List<Method> getters, StringBuilder builder) {\n    // The default fromJsonObject(json) works in unsafe mode and clones the JSON's for 'any'\n    // properties\n    builder\n        .append(\"    public static \")\n        .append(getImplClassName())\n        .append(\" fromJsonObject(JSONValue jsonValue) {\\n\");\n    builder.append(\"      return fromJsonObjectInt(jsonValue, true);\\n\");\n    builder.append(\"    }\\n\");\n    builder\n        .append(\"    public static \")\n        .append(getImplClassName())\n        .append(\" fromJsonObjectInt(JSONValue jsonValue, boolean \")\n        .append(COPY_JSONS_PARAM)\n        .append(\") {\\n\");\n    builder.append(\"      if (jsonValue == null || jsonValue.isNull() != null) {\\n\");\n    builder.append(\"        return null;\\n\");\n    builder.append(\"      }\\n\\n\");\n    builder\n        .append(\"      \")\n        .append(getImplClassName())\n        .append(\" dto = new \")\n        .append(getImplClassName())\n        .append(\"();\\n\");\n    if (isCompactJson()) {\n      for (Method method : getters) {\n        emitDeserializeFieldForMethodCompact(method, builder);\n      }\n    } else {\n      builder.append(\"      JSONObject json = jsonValue.isObject();\\n\");\n      for (Method getter : getters) {\n        emitDeserializeFieldForMethod(getter, builder);\n      }\n    }\n    builder.append(\"\\n      return dto;\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitDeserializerShortcut(StringBuilder builder) {\n    builder.append(\"    public static \");\n    builder.append(getImplClassName());\n    builder.append(\" fromJsonString(String jsonString) {\\n\");\n    builder.append(\"      if (jsonString == null) {\\n\");\n    builder.append(\"        return null;\\n\");\n    builder.append(\"      }\\n\\n\");\n    builder.append(\"      return fromJsonObjectInt(JSONParser.parseStrict(jsonString), false);\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitDeserializeFieldForMethod(Method getter, StringBuilder builder) {\n    final String fieldName = getFieldNameFromGetterName(getter.getName());\n    final String fieldNameIn = fieldName + \"In\";\n    final String fieldNameOut = fieldName + \"Out\";\n    final String baseIndentation = \"        \";\n    final String jsonFieldName = getJsonFieldName(getter);\n    final String jsonFieldNameLiteral = quoteStringLiteral(jsonFieldName);\n    builder.append(\"\\n\");\n    builder.append(\"      if (json.containsKey(\").append(jsonFieldNameLiteral).append(\")) {\\n\");\n    List<Type> expandedTypes = expandType(getter.getGenericReturnType());\n    builder\n        .append(\"        JSONValue \")\n        .append(fieldNameIn)\n        .append(\" = json.get(\")\n        .append(jsonFieldNameLiteral)\n        .append(\");\\n\");\n    emitDeserializerImpl(expandedTypes, 0, builder, fieldNameIn, fieldNameOut, baseIndentation);\n    builder\n        .append(\"        dto.\")\n        .append(getSetterName(fieldName))\n        .append(\"(\")\n        .append(fieldNameOut)\n        .append(\");\\n\");\n    builder.append(\"      }\\n\");\n    Type type = expandedTypes.get(0);\n\n    Class<?> aClass = getRawClass(type);\n    if (Boolean.class.equals(aClass)) {\n      builder.append(\"     else {\\n\");\n      builder\n          .append(\"        dto.\")\n          .append(getSetterName(fieldName))\n          .append(\"(\")\n          .append(\"false\")\n          .append(\");\\n\");\n      builder.append(\"     }\\n\");\n    }\n  }\n\n  private void emitDeserializeFieldForMethodCompact(Method method, final StringBuilder builder) {\n    final String fieldName = getFieldNameFromGetterName(method.getName());\n    final String fieldNameIn = fieldName + \"In\";\n    final String fieldNameOut = fieldName + \"Out\";\n    final String baseIndentation = \"        \";\n    SerializationIndex serializationIndex =\n        Preconditions.checkNotNull(method.getAnnotation(SerializationIndex.class));\n    int index = serializationIndex.value() - 1;\n    builder.append(\"\\n\");\n    builder.append(\"      if (\").append(index).append(\" < json.size()) {\\n\");\n    List<Type> expandedTypes = expandType(method.getGenericReturnType());\n    builder\n        .append(\"        JSONValue \")\n        .append(fieldNameIn)\n        .append(\" = json.get(\")\n        .append(index)\n        .append(\");\\n\");\n    emitDeserializerImpl(expandedTypes, 0, builder, fieldNameIn, fieldNameOut, baseIndentation);\n    builder\n        .append(\"        dto.\")\n        .append(getSetterName(fieldName))\n        .append(\"(\")\n        .append(fieldNameOut)\n        .append(\");\\n\");\n    builder.append(\"      }\\n\");\n  }\n\n  /**\n   * Produces code to deserialize the type with the given variable names.\n   *\n   * @param expandedTypes the type and its generic (and its generic (..)) expanded into a list, @see\n   *     {@link #expandType(java.lang.reflect.Type)}\n   * @param depth the depth (in the generics) for this recursive call. This can be used to index\n   *     into {@code expandedTypes}\n   * @param builder StringBuilder to add generated code for deserialization\n   * @param inVar the java type that will be the input for deserialization\n   * @param outVar the JsonElement subtype that will be the output for serialization\n   * @param i indentation string\n   */\n  private void emitDeserializerImpl(\n      List<Type> expandedTypes,\n      int depth,\n      StringBuilder builder,\n      String inVar,\n      String outVar,\n      String i) {\n    Type type = expandedTypes.get(depth);\n    String childInVar = inVar + \"_\";\n    String childInVarIterator = childInVar + \"_iterator\";\n    String childOutVar = outVar + \"_\";\n    Class<?> rawClass = getRawClass(type);\n    if (isList(rawClass)) {\n      builder\n          .append(i)\n          .append(getImplName(type, false))\n          .append(\" \")\n          .append(outVar)\n          .append(\" = null;\\n\");\n      builder\n          .append(i)\n          .append(\"if (\")\n          .append(inVar)\n          .append(\" != null && \")\n          .append(inVar)\n          .append(\".isNull() == null) {\\n\");\n      builder\n          .append(i)\n          .append(\"  \")\n          .append(outVar)\n          .append(\" = new \")\n          .append(getImplName(type, true))\n          .append(\"();\\n\");\n      builder\n          .append(i)\n          .append(\"  for (int \")\n          .append(childInVarIterator)\n          .append(\" = 0; \")\n          .append(childInVarIterator)\n          .append(\" < \")\n          .append(inVar)\n          .append(\".isArray().size(); \")\n          .append(childInVarIterator)\n          .append(\"++) {\\n\");\n      builder\n          .append(i)\n          .append(\"    JSONValue \")\n          .append(childInVar)\n          .append(\" = \")\n          .append(inVar)\n          .append(\".isArray().get(\")\n          .append(childInVarIterator)\n          .append(\");\\n\");\n      emitDeserializerImpl(expandedTypes, depth + 1, builder, childInVar, childOutVar, i + \"    \");\n      builder\n          .append(i)\n          .append(\"    \")\n          .append(outVar)\n          .append(\".add(\")\n          .append(childOutVar)\n          .append(\");\\n\");\n      builder.append(i).append(\"  }\\n\");\n      builder.append(i).append(\"}\\n\");\n    } else if (isMap(rawClass)) {\n      // TODO: Handle type\n      String entryVar = \"key\" + depth;\n      String entriesVar = \"keySet\" + depth;\n      builder\n          .append(i)\n          .append(getImplName(type, false))\n          .append(\" \")\n          .append(outVar)\n          .append(\" = null;\\n\");\n      builder\n          .append(i)\n          .append(\"if (\")\n          .append(inVar)\n          .append(\" != null && \")\n          .append(inVar)\n          .append(\".isNull() == null) {\\n\");\n      builder\n          .append(i)\n          .append(\"  \")\n          .append(outVar)\n          .append(\" = new \")\n          .append(getImplName(type, true))\n          .append(\"();\\n\");\n      builder\n          .append(i)\n          .append(\"  java.util.Set<String> \")\n          .append(entriesVar)\n          .append(\" = \")\n          .append(inVar)\n          .append(\".isObject().keySet();\\n\");\n      builder\n          .append(i)\n          .append(\"  for (String \")\n          .append(entryVar)\n          .append(\" : \")\n          .append(entriesVar)\n          .append(\") {\\n\");\n      builder\n          .append(i)\n          .append(\"    JSONValue \")\n          .append(childInVar)\n          .append(\" = \")\n          .append(inVar)\n          .append(\".isObject().get(\")\n          .append(entryVar)\n          .append(\");\\n\");\n      emitDeserializerImpl(expandedTypes, depth + 1, builder, childInVar, childOutVar, i + \"    \");\n      builder\n          .append(i)\n          .append(\"    \")\n          .append(outVar)\n          .append(\".put(\")\n          .append(entryVar)\n          .append(\", \")\n          .append(childOutVar)\n          .append(\");\\n\");\n      builder.append(i).append(\"  }\\n\");\n      builder.append(i).append(\"}\\n\");\n    } else if (rawClass.isEnum()) {\n      String primitiveName = rawClass.getCanonicalName();\n      builder\n          .append(i)\n          .append(primitiveName)\n          .append(\" \")\n          .append(outVar)\n          .append(\" = \")\n          .append(primitiveName)\n          .append(\".valueOf(\")\n          .append(inVar)\n          .append(\".isString().stringValue());\\n\");\n    } else if (getEnclosingTemplate().isDtoInterface(rawClass)) {\n      String className = getImplName(rawClass, false);\n      builder\n          .append(i)\n          .append(className)\n          .append(\" \")\n          .append(outVar)\n          .append(\" = \")\n          .append(getImplNameForDto(rawClass))\n          .append(\".fromJsonObject(\")\n          .append(inVar)\n          .append(\");\\n\");\n    } else if (rawClass.equals(String.class)) {\n      String primitiveName = rawClass.getSimpleName();\n      builder\n          .append(i)\n          .append(primitiveName)\n          .append(\" \")\n          .append(outVar)\n          .append(\" = \")\n          .append(inVar)\n          .append(\".isString() != null ? \")\n          .append(inVar)\n          .append(\".isString().stringValue() : null;\\n\");\n    } else if (isNumber(rawClass)) {\n      String primitiveName = rawClass.getSimpleName();\n      String typeCast =\n          rawClass.equals(double.class) || rawClass.equals(Double.class)\n              ? \"\"\n              : \"(\" + getPrimitiveName(rawClass) + \")\";\n      if (rawClass.isPrimitive()) {\n        builder\n            .append(i)\n            .append(primitiveName)\n            .append(\" \")\n            .append(outVar)\n            .append(\" = \")\n            .append(typeCast)\n            .append(inVar)\n            .append(\".isNumber().doubleValue();\\n\");\n      } else {\n        if (isInteger(rawClass)) {\n          builder\n              .append(i)\n              .append(primitiveName)\n              .append(\" \")\n              .append(outVar)\n              .append(\" = \")\n              .append(inVar)\n              .append(\".isNumber() != null ? ((Double)\")\n              .append(inVar)\n              .append(\".isNumber().doubleValue()).intValue() : null;\\n\");\n        } else if (isFloat(rawClass)) {\n          builder\n              .append(i)\n              .append(primitiveName)\n              .append(\" \")\n              .append(outVar)\n              .append(\" = \")\n              .append(inVar)\n              .append(\".isNumber() != null ? ((Double)\")\n              .append(inVar)\n              .append(\".isNumber().doubleValue()).floatValue() : null;\\n\");\n        } else if (isLong(rawClass)) {\n          builder\n              .append(i)\n              .append(primitiveName)\n              .append(\" \")\n              .append(outVar)\n              .append(\" = \")\n              .append(inVar)\n              .append(\".isNumber() != null ? ((Double)\")\n              .append(inVar)\n              .append(\".isNumber().doubleValue()).longValue() : null;\\n\");\n        } else if (isDouble(rawClass)) {\n          builder\n              .append(i)\n              .append(primitiveName)\n              .append(\" \")\n              .append(outVar)\n              .append(\" = \")\n              .append(inVar)\n              .append(\".isNumber() != null ? ((Double)\")\n              .append(inVar)\n              .append(\".isNumber().doubleValue()).doubleValue() : null;\\n\");\n        }\n      }\n    } else if (isBoolean(rawClass)) {\n      String primitiveName = rawClass.getSimpleName();\n      if (rawClass.isPrimitive()) {\n        builder\n            .append(i)\n            .append(primitiveName)\n            .append(\" \")\n            .append(outVar)\n            .append(\" = \")\n            .append(inVar)\n            .append(\".isBoolean().booleanValue();\\n\");\n      } else {\n        builder\n            .append(i)\n            .append(primitiveName)\n            .append(\" \")\n            .append(outVar)\n            .append(\" = \")\n            .append(inVar)\n            .append(\".isBoolean() != null ? \")\n            .append(inVar)\n            .append(\".isBoolean().booleanValue() : null;\\n\");\n      }\n    } else if (isAny(rawClass)) {\n      // TODO JsonElement.deepCopy() is package-protected, JSONs are serialized to strings then\n      // parsed for copying them\n      // outVar = copyJsons ? new JsonParser().parse(inVar) : inVar;\n      builder.append(i).append(\"JSONValue \").append(outVar).append(\" = \");\n      appendCopyJsonExpression(inVar, builder).append(\";\\n\");\n    } else {\n      final Class<?> dtoImplementation = getEnclosingTemplate().getDtoImplementation(rawClass);\n      if (dtoImplementation != null) {\n        String className = getImplName(rawClass, false);\n        builder\n            .append(i)\n            .append(className)\n            .append(\" \")\n            .append(outVar)\n            .append(\" = \")\n            .append(dtoImplementation.getCanonicalName())\n            .append(\".fromJsonObject(\")\n            .append(inVar)\n            .append(\");\\n\");\n      } else {\n        throw new IllegalArgumentException(\n            \"Unable to generate client implementation for DTO interface \"\n                + getDtoInterface().getCanonicalName()\n                + \". Type \"\n                + rawClass\n                + \" is not allowed to use in DTO interface.\");\n      }\n    }\n  }\n\n  private boolean isDouble(Class<?> returnType) {\n    return returnType.equals(Double.class);\n  }\n\n  private boolean isLong(Class<?> returnType) {\n    return returnType.equals(Long.class);\n  }\n\n  private boolean isFloat(Class<?> returnType) {\n    return returnType.equals(Float.class);\n  }\n\n  private boolean isInteger(Class<?> returnType) {\n    return returnType.equals(Integer.class);\n  }\n\n  private void emitPreamble(Class<?> dtoInterface, StringBuilder builder) {\n    builder.append(CLIENT_DTO_MARKER);\n    builder.append(\"  public static class \");\n    builder.append(getImplClassName());\n\n    Class<?> superType = getSuperDtoInterface(getDtoInterface());\n    if (superType != null && superType != JsonSerializable.class) {\n      // We need to extend something.\n      builder.append(\" extends \");\n      final Class<?> superTypeImpl = getEnclosingTemplate().getDtoImplementation(superType);\n      if (superTypeImpl == null) {\n        builder.append(superType.getSimpleName()).append(\"Impl\");\n      } else {\n        builder.append(superTypeImpl.getCanonicalName());\n      }\n    }\n    builder.append(\" implements \");\n    builder.append(dtoInterface.getCanonicalName());\n    builder.append(\", JsonSerializable \");\n    builder.append(\" {\\n\\n\");\n    emitFactoryMethod(builder);\n    emitDefaultConstructor(builder);\n  }\n\n  private void emitPostamble(StringBuilder builder) {\n    builder.append(\"  }\\n\\n\");\n  }\n\n  private void emitDefaultConstructor(StringBuilder builder) {\n    builder.append(\"    protected \");\n    builder.append(getImplClassName());\n    builder.append(\"() {\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitSetter(String fieldName, String returnType, StringBuilder builder) {\n    builder.append(\"    public \");\n    builder.append(\"void\");\n    builder.append(\" \");\n    builder.append(getSetterName(fieldName));\n    builder.append(\"(\");\n    builder.append(returnType);\n    builder.append(\" v) {\\n\");\n    builder.append(\"      this.\");\n    builder.append(fieldName);\n    builder.append(\" = \");\n    builder.append(\"v;\\n    }\\n\\n\");\n  }\n\n  private void emitWithMethods(\n      List<Method> getters, String dtoInterfaceName, StringBuilder builder) {\n    for (Method getter : getters) {\n      String fieldName = getJavaFieldName(getter.getName());\n      emitWithMethod(\n          getWithName(fieldName),\n          fieldName,\n          getFqParameterizedName(getter.getGenericReturnType()),\n          dtoInterfaceName,\n          builder);\n    }\n  }\n\n  private void emitWithMethod(\n      String methodName,\n      String fieldName,\n      String paramType,\n      String dtoInterfaceName,\n      StringBuilder builder) {\n    builder.append(\"    public \");\n    builder.append(dtoInterfaceName);\n    builder.append(\" \");\n    builder.append(methodName);\n    builder.append(\"(\");\n    builder.append(paramType);\n    builder.append(\" v) {\\n\");\n    builder.append(\"      this.\");\n    builder.append(fieldName);\n    builder.append(\" = \");\n    builder.append(\"v;\\n      return this;\\n    }\\n\\n\");\n  }\n\n  /**\n   * Emits an add method to add to a list. If the list is null, it is created.\n   *\n   * @param method a method with a list return type\n   */\n  private void emitListAdd(Method method, String fieldName, StringBuilder builder) {\n    builder.append(\"    public void \");\n    builder.append(getListAdderName(fieldName));\n    builder.append(\"(\");\n    builder.append(getTypeArgumentImplName((ParameterizedType) method.getGenericReturnType(), 0));\n    builder.append(\" v) {\\n      \");\n    builder.append(getEnsureName(fieldName));\n    builder.append(\"();\\n      \");\n    builder.append(fieldName);\n    builder.append(\".add(v);\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  /**\n   * Emits a put method to put a value into a map. If the map is null, it is created.\n   *\n   * @param method a method with a map return value\n   */\n  private void emitMapPut(Method method, String fieldName, StringBuilder builder) {\n    builder.append(\"    public void \");\n    builder.append(getMapPutterName(fieldName));\n    builder.append(\"(String k, \");\n    builder.append(getTypeArgumentImplName((ParameterizedType) method.getGenericReturnType(), 1));\n    builder.append(\" v) {\\n      \");\n    builder.append(getEnsureName(fieldName));\n    builder.append(\"();\\n      \");\n    builder.append(fieldName);\n    builder.append(\".put(k, v);\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  /**\n   * Emits a method to clear a list or map. Clearing the collections ensures that the collection is\n   * created.\n   */\n  private void emitClear(String fieldName, StringBuilder builder) {\n    builder.append(\"    public void \");\n    builder.append(getClearName(fieldName));\n    builder.append(\"() {\\n      \");\n    builder.append(getEnsureName(fieldName));\n    builder.append(\"();\\n      \");\n    builder.append(fieldName);\n    builder.append(\".clear();\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitCopyConstructor(List<Method> getters, StringBuilder builder) {\n    String dtoInterface = getDtoInterface().getCanonicalName();\n    String implClassName = getImplClassName();\n    builder\n        .append(\"    public \")\n        .append(implClassName)\n        .append(\"(\")\n        .append(dtoInterface)\n        .append(\" origin) {\\n\");\n    for (Method method : getters) {\n      emitDeepCopyForGetters(\n          expandType(method.getGenericReturnType()), 0, builder, \"origin\", method, \"      \");\n    }\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitDeepCopyForGetters(\n      List<Type> expandedTypes,\n      int depth,\n      StringBuilder builder,\n      String origin,\n      Method getter,\n      String i) {\n    String getterName = getter.getName();\n    String fieldName = getJavaFieldName(getterName);\n    String fieldNameIn = fieldName + \"In\";\n    String fieldNameOut = fieldName + \"Out\";\n    Type type = expandedTypes.get(depth);\n    Class<?> rawClass = getRawClass(type);\n    String rawTypeName = getImplName(type, false);\n    if (isList(rawClass) || isMap(rawClass)) {\n      builder\n          .append(i)\n          .append(rawTypeName)\n          .append(\" \")\n          .append(fieldNameIn)\n          .append(\" = \")\n          .append(origin)\n          .append(\".\")\n          .append(getterName)\n          .append(\"();\\n\");\n      builder.append(i).append(\"if (\").append(fieldNameIn).append(\" != null) {\\n\");\n      builder\n          .append(i)\n          .append(\"  \")\n          .append(rawTypeName)\n          .append(\" \")\n          .append(fieldNameOut)\n          .append(\" = new \")\n          .append(getImplName(type, true))\n          .append(\"();\\n\");\n      emitDeepCopyCollections(expandedTypes, depth, builder, fieldNameIn, fieldNameOut, i);\n      builder\n          .append(i)\n          .append(\"  \")\n          .append(\"this.\")\n          .append(fieldName)\n          .append(\" = \")\n          .append(fieldNameOut)\n          .append(\";\\n\");\n      builder.append(i).append(\"}\\n\");\n    } else if (getEnclosingTemplate().isDtoInterface(rawClass)) {\n      builder\n          .append(i)\n          .append(rawTypeName)\n          .append(\" \")\n          .append(fieldNameIn)\n          .append(\" = \")\n          .append(origin)\n          .append(\".\")\n          .append(getterName)\n          .append(\"();\\n\");\n      builder.append(i).append(\"this.\").append(fieldName).append(\" = \");\n      emitCheckNullAndCopyDto(rawClass, fieldNameIn, builder);\n      builder.append(\";\\n\");\n    } else if (isAny(rawClass)) {\n      builder.append(i).append(\"this.\").append(fieldName).append(\" = \");\n      appendNaiveCopyJsonExpression(origin + \".\" + getterName + \"()\", builder).append(\";\\n\");\n    } else {\n      builder\n          .append(i)\n          .append(\"this.\")\n          .append(fieldName)\n          .append(\" = \")\n          .append(origin)\n          .append(\".\")\n          .append(getterName)\n          .append(\"();\\n\");\n    }\n  }\n\n  private void emitDeepCopyCollections(\n      List<Type> expandedTypes,\n      int depth,\n      StringBuilder builder,\n      String varIn,\n      String varOut,\n      String i) {\n    Type type = expandedTypes.get(depth);\n    String childVarIn = varIn + \"_\";\n    String childVarOut = varOut + \"_\";\n    String entryVar = \"entry\" + depth;\n    Class<?> rawClass = getRawClass(type);\n    Class<?> childRawType = getRawClass(expandedTypes.get(depth + 1));\n    final String childTypeName = getImplName(expandedTypes.get(depth + 1), false);\n    if (isList(rawClass)) {\n      builder\n          .append(i)\n          .append(\"  for (\")\n          .append(childTypeName)\n          .append(\" \")\n          .append(childVarIn)\n          .append(\" : \")\n          .append(varIn)\n          .append(\") {\\n\");\n    } else if (isMap(rawClass)) {\n      builder\n          .append(i)\n          .append(\"  for (java.util.Map.Entry<String, \")\n          .append(childTypeName)\n          .append(\"> \")\n          .append(entryVar)\n          .append(\" : \")\n          .append(varIn)\n          .append(\".entrySet()) {\\n\");\n      builder\n          .append(i)\n          .append(\"    \")\n          .append(childTypeName)\n          .append(\" \")\n          .append(childVarIn)\n          .append(\" = \")\n          .append(entryVar)\n          .append(\".getValue();\\n\");\n    }\n    if (isList(childRawType) || isMap(childRawType)) {\n      builder.append(i).append(\"    if (\").append(childVarIn).append(\" != null) {\\n\");\n      builder\n          .append(i)\n          .append(\"      \")\n          .append(childTypeName)\n          .append(\" \")\n          .append(childVarOut)\n          .append(\" = new \")\n          .append(getImplName(expandedTypes.get(depth + 1), true))\n          .append(\"();\\n\");\n      emitDeepCopyCollections(\n          expandedTypes, depth + 1, builder, childVarIn, childVarOut, i + \"    \");\n      builder.append(i).append(\"      \").append(varOut);\n      if (isList(rawClass)) {\n        builder.append(\".add(\");\n      } else {\n        builder.append(\".put(\").append(entryVar).append(\".getKey(), \");\n      }\n      builder.append(childVarOut);\n      builder.append(\");\\n\");\n      builder.append(i).append(\"    \").append(\"}\\n\");\n    } else {\n      builder.append(i).append(\"      \").append(varOut);\n      if (isList(rawClass)) {\n        builder.append(\".add(\");\n      } else {\n        builder.append(\".put(\").append(entryVar).append(\".getKey(), \");\n      }\n      if (getEnclosingTemplate().isDtoInterface(childRawType)) {\n        emitCheckNullAndCopyDto(childRawType, childVarIn, builder);\n      } else {\n        builder.append(childVarIn);\n      }\n      builder.append(\");\\n\");\n    }\n    builder.append(i).append(\"  }\\n\");\n  }\n\n  private void emitCheckNullAndCopyDto(Class<?> dto, String fieldName, StringBuilder builder) {\n    String implName = dto.getSimpleName() + \"Impl\";\n    builder\n        .append(fieldName)\n        .append(\" == null ? null : \")\n        .append(\"new \")\n        .append(implName)\n        .append(\"(\")\n        .append(fieldName)\n        .append(\")\");\n  }\n\n  /** Emit a method that ensures a collection is initialized. */\n  private void emitEnsureCollection(Method method, String fieldName, StringBuilder builder) {\n    builder.append(\"    protected void \");\n    builder.append(getEnsureName(fieldName));\n    builder.append(\"() {\\n\");\n    builder.append(\"      if (\");\n    builder.append(fieldName);\n    builder.append(\" == null) {\\n        \");\n    builder.append(fieldName);\n    builder.append(\" = new \");\n    builder.append(getImplName(method.getGenericReturnType(), true));\n    builder.append(\"();\\n\");\n    builder.append(\"      }\\n\");\n    builder.append(\"    }\\n\");\n  }\n\n  /**\n   * Appends a suitable type for the given type. For example, at minimum, this will replace DTO\n   * interfaces with their implementation classes and JSON collections with corresponding Java\n   * types. If a suitable type cannot be determined, this will throw an exception.\n   *\n   * @param genericType the type as returned by e.g. method.getGenericReturnType()\n   */\n  private void appendType(Type genericType, final StringBuilder builder) {\n    builder.append(getImplName(genericType, false));\n  }\n\n  /**\n   * In most cases we simply echo the return type and field name, except for JsonArray<T>, which is\n   * special in the server impl case, since it must be represented by a List<T> for Gson to\n   * correctly serialize/deserialize it.\n   *\n   * @param method The getter method.\n   * @return String representation of what the field type should be, as well as the assignment\n   *     (initial value) to said field type, if any.\n   */\n  private String getFieldTypeAndAssignment(Method method, String fieldName) {\n    StringBuilder builder = new StringBuilder();\n    builder.append(\"protected \");\n    appendType(method.getGenericReturnType(), builder);\n    builder.append(\" \");\n    builder.append(fieldName);\n    builder.append(\";\\n\");\n    return builder.toString();\n  }\n\n  /**\n   * Returns the fully-qualified type name using Java concrete implementation classes.\n   *\n   * <p>For example, for JsonArray&lt;JsonStringMap&lt;Dto&gt;&gt;, this would return\n   * \"ArrayList&lt;Map&lt;String, DtoImpl&gt;&gt;\".\n   */\n  private String getImplName(Type type, boolean allowJreCollectionInterface) {\n    Class<?> rawClass = getRawClass(type);\n    String fqName = getFqParameterizedName(type);\n    fqName =\n        fqName.replaceAll(JsonArray.class.getCanonicalName(), ArrayList.class.getCanonicalName());\n    fqName =\n        fqName.replaceAll(\n            JsonStringMap.class.getCanonicalName() + \"<\",\n            HashMap.class.getCanonicalName() + \"<String, \");\n    if (allowJreCollectionInterface) {\n      if (isList(rawClass)) {\n        fqName =\n            fqName.replaceFirst(List.class.getCanonicalName(), ArrayList.class.getCanonicalName());\n      } else if (isMap(rawClass)) {\n        fqName =\n            fqName.replaceFirst(Map.class.getCanonicalName(), HashMap.class.getCanonicalName());\n      }\n    }\n    return fqName;\n  }\n\n  /** Returns the fully-qualified type name including parameters. */\n  private String getFqParameterizedName(Type type) {\n    if (type instanceof Class<?>) {\n      return ((Class<?>) type).getCanonicalName();\n    } else if (type instanceof ParameterizedType) {\n      ParameterizedType pType = (ParameterizedType) type;\n      StringBuilder sb = new StringBuilder(getRawClass(pType).getCanonicalName());\n      sb.append('<');\n      final Type[] actualTypeArguments = pType.getActualTypeArguments();\n      for (int i = 0; i < actualTypeArguments.length; i++) {\n        if (i > 0) {\n          sb.append(\", \");\n        }\n        sb.append(getFqParameterizedName(actualTypeArguments[i]));\n      }\n      sb.append('>');\n      return sb.toString();\n    } else {\n      throw new IllegalArgumentException(\n          \"Cannot handle type '\" + type == null ? null : type.getTypeName() + \"'.\");\n    }\n  }\n\n  /**\n   * Returns the fully-qualified type name using Java concrete implementation classes of the first\n   * type argument for a parameterized type. If one is not specified, returns \"Object\".\n   *\n   * @param type the parameterized type\n   * @return the first type argument\n   */\n  private String getTypeArgumentImplName(ParameterizedType type, int index) {\n    Type[] typeArgs = type.getActualTypeArguments();\n    if (typeArgs.length == 0) {\n      return \"Object\";\n    }\n    return getImplName(typeArgs[index], false);\n  }\n\n  private String getImplNameForDto(Class<?> dtoInterface) {\n    if (getEnclosingTemplate().isDtoInterface(dtoInterface)) {\n      // This will eventually get a generated impl type.\n      return dtoInterface.getSimpleName() + \"Impl\";\n    }\n    return dtoInterface.getCanonicalName();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/generator/DtoImplServerTemplate.java",
    "content": "/*\n * Copyright (c) 2012-2016 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.generator;\n\nimport com.google.common.primitives.Primitives;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.dto.server.JsonArrayImpl;\nimport org.eclipse.che.dto.server.JsonSerializable;\nimport org.eclipse.che.dto.server.JsonStringMapImpl;\nimport org.eclipse.che.dto.shared.DTOImpl;\nimport org.eclipse.che.dto.shared.DelegateRule;\nimport org.eclipse.che.dto.shared.DelegateTo;\nimport org.eclipse.che.dto.shared.JsonArray;\nimport org.eclipse.che.dto.shared.JsonStringMap;\n\n/** Generates the source code for a generated Server DTO impl. */\npublic class DtoImplServerTemplate extends DtoImpl {\n  private static final String JSON_ARRAY_IMPL = JsonArrayImpl.class.getCanonicalName();\n  private static final String JSON_MAP_IMPL = JsonStringMapImpl.class.getCanonicalName();\n  private static final String SERVER_DTO_MARKER =\n      \"  @\" + DTOImpl.class.getCanonicalName() + \"(\\\"server\\\")\\n\";\n\n  DtoImplServerTemplate(DtoTemplate template, Class<?> superInterface) {\n    super(template, superInterface);\n  }\n\n  @Override\n  String serialize() {\n    StringBuilder builder = new StringBuilder();\n    final Class<?> dtoInterface = getDtoInterface();\n    final String dtoInterfaceName = dtoInterface.getCanonicalName();\n    emitPreamble(dtoInterface, builder);\n    List<Method> getters = getDtoGetters(dtoInterface);\n    // A set of the super getters\n    Set<String> superGetterNames = getSuperGetterNames(dtoInterface);\n    // Enumerate the getters and emit field names and getters + setters.\n    emitFields(getters, builder, superGetterNames);\n    emitGettersAndSetters(getters, builder);\n    List<Method> inheritedGetters = getInheritedDtoGetters(dtoInterface);\n    List<Method> methods = new ArrayList<>();\n    methods.addAll(getters);\n    Set<String> getterNames = new HashSet<>();\n    for (Method getter : getters) {\n      getterNames.add(getter.getName());\n    }\n    for (Method getter : inheritedGetters) {\n      if (getterNames.add(getter.getName())) {\n        methods.add(getter);\n      }\n    }\n    // equals, hashCode, serialization and copy constructor\n    emitEqualsAndHashCode(methods, builder);\n    emitSerializer(methods, builder);\n    emitDeserializer(methods, builder);\n    emitDeserializerShortcut(builder);\n    emitCopyConstructor(methods, builder);\n    // Delegation DTO methods.\n    emitDelegateMethods(builder);\n    // \"builder\" method, it is method that set field and return \"this\" instance\n    emitWithMethods(getters, dtoInterfaceName, builder);\n    // Implement withXXX methods that are declared directly in this DTO even if there are no any\n    // getter for the fields.\n    // Need that to override methods from super DTO and return correct type for with method.\n    // @DTO\n    // public interface A {\n    //     String getProperty();\n    //     void setProperty(String property);\n    //     A withProperty();\n    // }\n    //\n    // @DTO\n    // public interface B extends A {\n    //     // New methods\n    //     ...\n    //     // Override method to return type B instead of A.\n    //     B withProperty();\n    // }\n    getterNames.clear();\n    for (Method getter : getters) {\n      getterNames.add(getter.getName());\n    }\n    for (Method method : dtoInterface.getDeclaredMethods()) {\n      if (!method.isDefault() && method.getName().startsWith(\"with\")) {\n        String noPrefixName = method.getName().substring(4);\n        // Check do we already generate withXXX method or not.\n        // If there is getter in DTO interface we already have withXXX method\n        if (!getterNames.contains(\"get\" + noPrefixName)\n            && !getterNames.contains(\"is\" + noPrefixName)) {\n          String fieldName =\n              Character.toLowerCase(noPrefixName.charAt(0)) + noPrefixName.substring(1);\n          String parameterFqn = getFqParameterizedName(method.getGenericParameterTypes()[0]);\n          emitWithMethod(method.getName(), fieldName, parameterFqn, dtoInterfaceName, builder);\n        }\n      }\n    }\n    emitPostamble(builder);\n    return builder.toString();\n  }\n\n  private void emitEqualsAndHashCode(List<Method> getters, StringBuilder builder) {\n    builder.append(\"    @Override\\n\");\n    builder.append(\"    public boolean equals(Object o) {\\n\");\n    builder.append(\"      if (!(o instanceof \").append(getImplClassName()).append(\")) {\\n\");\n    builder.append(\"        return false;\\n\");\n    builder.append(\"      }\\n\");\n    builder\n        .append(\"      \")\n        .append(getImplClassName())\n        .append(\" other = (\")\n        .append(getImplClassName())\n        .append(\") o;\\n\");\n    for (Method getter : getters) {\n      String fieldName = getJavaFieldName(getter.getName());\n      Class<?> returnType = getter.getReturnType();\n      if (returnType.isPrimitive()) {\n        builder\n            .append(\"      if (this.\")\n            .append(fieldName)\n            .append(\" != other.\")\n            .append(fieldName)\n            .append(\") {\\n\");\n        builder.append(\"        return false;\\n\");\n        builder.append(\"      }\\n\");\n      } else {\n        if (isList(returnType) || isMap(returnType)) {\n          builder.append(\"      \").append(\"this.\").append(getEnsureName(fieldName)).append(\"();\\n\");\n          builder\n              .append(\"      \")\n              .append(\"other.\")\n              .append(getEnsureName(fieldName))\n              .append(\"();\\n\");\n          builder.append(\"      \\n\");\n        }\n        builder.append(\"      if (this.\").append(fieldName).append(\" != null) {\\n\");\n        builder\n            .append(\"        if (!this.\")\n            .append(fieldName)\n            .append(\".equals(other.\")\n            .append(fieldName)\n            .append(\")) {\\n\");\n        builder.append(\"          return false;\\n\");\n        builder.append(\"        }\\n\");\n        builder.append(\"      } else {\\n\");\n        builder.append(\"        if (other.\").append(fieldName).append(\" != null) {\\n\");\n        builder.append(\"          return false;\\n\");\n        builder.append(\"        }\\n\");\n        builder.append(\"      }\\n\");\n      }\n    }\n    builder.append(\"      return true;\\n\");\n    builder.append(\"    }\\n\\n\");\n\n    // this isn't the greatest hash function in the world, but it meets the requirement that for any\n    // two objects A and B, A.equals(B) only if A.hashCode() == B.hashCode()\n    builder.append(\"    @Override\\n\");\n    builder.append(\"    public int hashCode() {\\n\");\n    builder.append(\"      int hash = 7;\\n\");\n    for (Method method : getters) {\n      Class<?> type = method.getReturnType();\n      String fieldName = getJavaFieldName(method.getName());\n      if (type.isPrimitive()) {\n        Class<?> wrappedType = Primitives.wrap(type);\n        builder\n            .append(\"      hash = hash * 31 + \")\n            .append(wrappedType.getName())\n            .append(\".valueOf(\")\n            .append(fieldName)\n            .append(\").hashCode();\\n\");\n      } else {\n        if (isList(type) || isMap(type)) {\n          builder.append(\"      \").append(getEnsureName(fieldName)).append(\"();\\n\");\n        }\n        builder\n            .append(\"      hash = hash * 31 + (\")\n            .append(fieldName)\n            .append(\" != null ? \")\n            .append(fieldName)\n            .append(\".hashCode() : 0);\\n\");\n      }\n    }\n    builder.append(\"      return hash;\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitFactoryMethod(StringBuilder builder) {\n    builder.append(\"    public static \");\n    builder.append(getImplClassName());\n    builder.append(\" make() {\");\n    builder.append(\"\\n        return new \");\n    builder.append(getImplClassName());\n    builder.append(\"();\\n    }\\n\\n\");\n  }\n\n  private void emitFields(\n      List<Method> getters, StringBuilder builder, Set<String> superGetterNames) {\n    for (Method getter : getters) {\n      if (superGetterNames.contains(getter.getName())) {\n        continue;\n      }\n      String fieldName = getJavaFieldName(getter.getName());\n      String jsonFieldName = getJsonFieldName(getter);\n      if (!fieldName.equals(jsonFieldName)) {\n        builder\n            .append(\"    @com.google.gson.annotations.SerializedName(\\\"\")\n            .append(jsonFieldName)\n            .append(\"\\\")\\n\");\n      }\n      builder.append(\"    \");\n      builder.append(getFieldTypeAndAssignment(getter, fieldName));\n    }\n    builder.append(\"\\n\");\n  }\n\n  /** Emits a method to get a field. Getting a collection ensures that the collection is created. */\n  private void emitGetter(\n      Method getter, String fieldName, String returnType, StringBuilder builder) {\n    if (getter.isAnnotationPresent(jakarta.validation.constraints.NotNull.class)) {\n      builder.append(\"    @jakarta.validation.constraints.NotNull\\n\");\n    } else if (getter.isAnnotationPresent(org.eclipse.che.commons.annotation.Nullable.class)) {\n      builder.append(\"    @org.eclipse.che.commons.annotation.Nullable\\n\");\n    }\n    builder.append(\"    @Override\\n    public \");\n    builder.append(returnType);\n    builder.append(\" \");\n    builder.append(getter.getName());\n    builder.append(\"() {\\n\");\n    // Initialize the collection.\n    Class<?> returnTypeClass = getter.getReturnType();\n    if (isList(returnTypeClass) || isMap(returnTypeClass)) {\n      builder.append(\"      \");\n      builder.append(getEnsureName(fieldName));\n      builder.append(\"();\\n\");\n    }\n    builder.append(\"      return (\").append(returnType).append(\")(\");\n    emitReturn(getter, fieldName, builder);\n    builder.append(\");\\n    }\\n\\n\");\n  }\n\n  private void emitGettersAndSetters(List<Method> getters, StringBuilder builder) {\n    for (Method getter : getters) {\n      String fieldName = getJavaFieldName(getter.getName());\n      if (fieldName == null) {\n        continue;\n      }\n      Class<?> returnTypeClass = getter.getReturnType();\n      String returnType = getFqParameterizedName(getter.getGenericReturnType());\n      // Getter.\n      emitGetter(getter, fieldName, returnType, builder);\n      // Setter.\n      emitSetter(fieldName, returnType, builder);\n      // List/Map-specific methods.\n      if (isList(returnTypeClass)) {\n        emitListAdd(getter, fieldName, builder);\n        emitClear(fieldName, builder);\n        emitEnsureCollection(getter, fieldName, builder);\n      } else if (isMap(returnTypeClass)) {\n        emitMapPut(getter, fieldName, builder);\n        emitClear(fieldName, builder);\n        emitEnsureCollection(getter, fieldName, builder);\n      }\n    }\n  }\n\n  private void emitDelegateMethod(\n      String returnType,\n      Method method,\n      Class<?> delegateToType,\n      String delegateToMethod,\n      StringBuilder builder) {\n    builder\n        .append(\"    public \")\n        .append(returnType)\n        .append(\" \")\n        .append(method.getName())\n        .append(\"(\");\n    Type[] parameterTypes = method.getGenericParameterTypes();\n    String[] parameters = new String[parameterTypes.length];\n    for (int i = 0; i < parameterTypes.length; i++) {\n      if (i > 0) {\n        builder.append(\", \");\n      }\n      builder.append(getFqParameterizedName(parameterTypes[i]));\n      String parameter = \"$p\" + i;\n      builder.append(\" \").append(parameter);\n      parameters[i] = parameter;\n    }\n    builder.append(\") {\\n\");\n    builder.append(\"      \");\n    if (!\"void\".equals(returnType)) {\n      builder.append(\"return \");\n    }\n    builder\n        .append(delegateToType.getCanonicalName())\n        .append(\".\")\n        .append(delegateToMethod)\n        .append(\"(\");\n    builder.append(\"this\");\n    for (String parameter : parameters) {\n      builder.append(\", \");\n      builder.append(parameter);\n    }\n    builder.append(\");\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitDelegateMethods(StringBuilder builder) {\n    for (Method method : getDtoInterface().getDeclaredMethods()) {\n      DelegateTo delegateTo = method.getAnnotation(DelegateTo.class);\n      if (delegateTo != null) {\n        DelegateRule serverRule = delegateTo.server();\n        String returnType = getFqParameterizedName(method.getGenericReturnType());\n        emitDelegateMethod(returnType, method, serverRule.type(), serverRule.method(), builder);\n      }\n    }\n  }\n\n  private void emitSerializer(List<Method> getters, StringBuilder builder) {\n    builder.append(\"    @Override\\n\");\n    builder.append(\"    public JsonElement toJsonElement() {\\n\");\n    builder.append(\"        return gson.toJsonTree(this);\\n\");\n    builder.append(\"    }\\n\");\n    builder.append(\"    @Override\\n\");\n    builder.append(\"    public void toJson(java.io.Writer w) {\\n\");\n    builder.append(\"        gson.toJson(this, w);\\n\");\n    builder.append(\"    }\\n\");\n    builder.append(\"    @Override\\n\");\n    builder.append(\"    public String toJson() {\\n\");\n    builder.append(\"      return gson.toJson(this);\\n\");\n    builder.append(\"    }\\n\");\n    builder.append(\"\\n\");\n    builder.append(\"    @Override\\n\");\n    builder.append(\"    public String toString() {\\n\");\n    builder.append(\"      return toJson();\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  /** Generates a static factory method that creates a new instance based on a JsonElement. */\n  private void emitDeserializer(List<Method> getters, StringBuilder builder) {\n    // The default fromJsonElement(json) works in unsafe mode and clones the JSON's for 'any'\n    // properties\n    builder\n        .append(\"    public static \")\n        .append(getImplClassName())\n        .append(\" fromJsonElement(JsonElement jsonElem) {\\n\");\n    builder\n        .append(\"      return gson.fromJson(jsonElem, \")\n        .append(getImplClassName())\n        .append(\".class);\\n\");\n    builder.append(\"    }\\n\");\n  }\n\n  private void emitDeserializerShortcut(StringBuilder builder) {\n    builder.append(\"    public static \");\n    builder.append(getImplClassName());\n    builder.append(\" fromJsonString(String jsonString) {\\n\");\n    builder\n        .append(\"      return gson.fromJson(jsonString, \")\n        .append(getImplClassName())\n        .append(\".class);\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private static StringBuilder appendNaiveCopyJsonExpression(\n      String inValue, StringBuilder builder) {\n    builder.append(\"((\");\n    builder.append(inValue);\n    builder.append(\") != null ? new JsonParser().parse((\");\n    builder.append(inValue);\n    builder.append(\").toString()) : null)\");\n    return builder;\n  }\n\n  private void emitPreamble(Class<?> dtoInterface, StringBuilder builder) {\n    builder.append(SERVER_DTO_MARKER);\n    builder.append(\"  public static class \");\n    builder.append(getImplClassName());\n\n    Class<?> superType = getSuperDtoInterface(getDtoInterface());\n    if (superType != null && superType != JsonSerializable.class) {\n      // We need to extend something.\n      builder.append(\" extends \");\n\n      final Class<?> superTypeImpl = getEnclosingTemplate().getDtoImplementation(superType);\n      if (superTypeImpl == null) {\n        builder.append(superType.getSimpleName()).append(\"Impl\");\n      } else {\n        builder.append(superTypeImpl.getCanonicalName());\n      }\n    }\n    builder.append(\" implements \");\n    builder.append(dtoInterface.getCanonicalName());\n    builder.append(\", JsonSerializable \");\n    builder.append(\" {\\n\\n\");\n    emitFactoryMethod(builder);\n    emitDefaultConstructor(builder);\n  }\n\n  private void emitPostamble(StringBuilder builder) {\n    builder.append(\"  }\\n\\n\");\n  }\n\n  private void emitDefaultConstructor(StringBuilder builder) {\n    builder.append(\"    public \");\n    builder.append(getImplClassName());\n    builder.append(\"() {\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitReturn(Method method, String fieldName, StringBuilder builder) {\n    if (isList(method.getReturnType())) {\n      // Wrap the returned List in the server adapter.\n      builder.append(\"new \");\n      builder.append(JSON_ARRAY_IMPL);\n      builder.append(\"(\");\n      builder.append(fieldName);\n      builder.append(\")\");\n    } else if (isMap(method.getReturnType())) {\n      // Wrap the Map.\n      builder.append(\"new \");\n      builder.append(JSON_MAP_IMPL);\n      builder.append(\"(\");\n      builder.append(fieldName);\n      builder.append(\")\");\n    } else {\n      builder.append(fieldName);\n    }\n  }\n\n  private void emitSetter(String fieldName, String paramType, StringBuilder builder) {\n    builder.append(\"    public \");\n    builder.append(\"void\");\n    builder.append(\" \");\n    builder.append(getSetterName(fieldName));\n    builder.append(\"(\");\n    builder.append(paramType);\n    builder.append(\" v) {\\n\");\n    builder.append(\"      this.\");\n    builder.append(fieldName);\n    builder.append(\" = \");\n    builder.append(\"v;\\n    }\\n\\n\");\n  }\n\n  private void emitWithMethods(\n      List<Method> getters, String dtoInterfaceName, StringBuilder builder) {\n    for (Method getter : getters) {\n      String fieldName = getJavaFieldName(getter.getName());\n      emitWithMethod(\n          getWithName(fieldName),\n          fieldName,\n          getFqParameterizedName(getter.getGenericReturnType()),\n          dtoInterfaceName,\n          builder);\n    }\n  }\n\n  private void emitWithMethod(\n      String methodName,\n      String fieldName,\n      String paramType,\n      String dtoInterfaceName,\n      StringBuilder builder) {\n    builder.append(\"    public \");\n    builder.append(dtoInterfaceName);\n    builder.append(\" \");\n    builder.append(methodName);\n    builder.append(\"(\");\n    builder.append(paramType);\n    builder.append(\" v) {\\n\");\n    builder.append(\"      this.\");\n    builder.append(fieldName);\n    builder.append(\" = \");\n    builder.append(\"v;\\n      return this;\\n    }\\n\\n\");\n  }\n\n  /**\n   * Emits an add method to add to a list. If the list is null, it is created.\n   *\n   * @param method a method with a list return type\n   */\n  private void emitListAdd(Method method, String fieldName, StringBuilder builder) {\n    builder.append(\"    public void \");\n    builder.append(getListAdderName(fieldName));\n    builder.append(\"(\");\n    builder.append(getTypeArgumentImplName((ParameterizedType) method.getGenericReturnType(), 0));\n    builder.append(\" v) {\\n      \");\n    builder.append(getEnsureName(fieldName));\n    builder.append(\"();\\n      \");\n    builder.append(fieldName);\n    builder.append(\".add(v);\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  /**\n   * Emits a put method to put a value into a map. If the map is null, it is created.\n   *\n   * @param method a method with a map return value\n   */\n  private void emitMapPut(Method method, String fieldName, StringBuilder builder) {\n    builder.append(\"    public void \");\n    builder.append(getMapPutterName(fieldName));\n    builder.append(\"(String k, \");\n    builder.append(getTypeArgumentImplName((ParameterizedType) method.getGenericReturnType(), 1));\n    builder.append(\" v) {\\n      \");\n    builder.append(getEnsureName(fieldName));\n    builder.append(\"();\\n      \");\n    builder.append(fieldName);\n    builder.append(\".put(k, v);\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  /**\n   * Emits a method to clear a list or map. Clearing the collections ensures that the collection is\n   * created.\n   */\n  private void emitClear(String fieldName, StringBuilder builder) {\n    builder.append(\"    public void \");\n    builder.append(getClearName(fieldName));\n    builder.append(\"() {\\n      \");\n    builder.append(getEnsureName(fieldName));\n    builder.append(\"();\\n      \");\n    builder.append(fieldName);\n    builder.append(\".clear();\\n\");\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitCopyConstructor(List<Method> getters, StringBuilder builder) {\n    String dtoInterface = getDtoInterface().getCanonicalName();\n    String implClassName = getImplClassName();\n    builder\n        .append(\"    public \")\n        .append(implClassName)\n        .append(\"(\")\n        .append(dtoInterface)\n        .append(\" origin) {\\n\");\n    for (Method method : getters) {\n      emitDeepCopyForGetters(\n          expandType(method.getGenericReturnType()), 0, builder, \"origin\", method, \"      \");\n    }\n    builder.append(\"    }\\n\\n\");\n  }\n\n  private void emitDeepCopyForGetters(\n      List<Type> expandedTypes,\n      int depth,\n      StringBuilder builder,\n      String origin,\n      Method getter,\n      String i) {\n    String getterName = getter.getName();\n    String fieldName = getJavaFieldName(getterName);\n    String fieldNameIn = fieldName + \"In\";\n    String fieldNameOut = fieldName + \"Out\";\n    Type type = expandedTypes.get(depth);\n    Class<?> rawClass = getRawClass(type);\n    String rawTypeName = getImplName(type, false);\n\n    if (isList(rawClass) || isMap(rawClass)) {\n      builder\n          .append(i)\n          .append(rawTypeName)\n          .append(\" \")\n          .append(fieldNameIn)\n          .append(\" = \")\n          .append(origin)\n          .append(\".\")\n          .append(getterName)\n          .append(\"();\\n\");\n      builder.append(i).append(\"if (\").append(fieldNameIn).append(\" != null) {\\n\");\n      builder\n          .append(i)\n          .append(\"  \")\n          .append(rawTypeName)\n          .append(\" \")\n          .append(fieldNameOut)\n          .append(\" = new \")\n          .append(getImplName(type, true))\n          .append(\"();\\n\");\n      emitDeepCopyCollections(expandedTypes, depth, builder, fieldNameIn, fieldNameOut, i);\n      builder\n          .append(i)\n          .append(\"  \")\n          .append(\"this.\")\n          .append(fieldName)\n          .append(\" = \")\n          .append(fieldNameOut)\n          .append(\";\\n\");\n      builder.append(i).append(\"}\\n\");\n    } else if (isAny(rawClass)) {\n      builder.append(i).append(\"this.\").append(fieldName).append(\" = \");\n      appendNaiveCopyJsonExpression(origin + \".\" + getterName + \"()\", builder).append(\";\\n\");\n    } else if (getEnclosingTemplate().isDtoInterface(rawClass)) {\n      builder\n          .append(i)\n          .append(rawTypeName)\n          .append(\" \")\n          .append(fieldNameIn)\n          .append(\" = \")\n          .append(origin)\n          .append(\".\")\n          .append(getterName)\n          .append(\"();\\n\");\n      builder.append(i).append(\"this.\").append(fieldName).append(\" = \");\n      emitCheckNullAndCopyDto(rawClass, fieldNameIn, builder);\n      builder.append(\";\\n\");\n    } else {\n      builder\n          .append(i)\n          .append(\"this.\")\n          .append(fieldName)\n          .append(\" = \")\n          .append(origin)\n          .append(\".\")\n          .append(getterName)\n          .append(\"();\\n\");\n    }\n  }\n\n  private void emitDeepCopyCollections(\n      List<Type> expandedTypes,\n      int depth,\n      StringBuilder builder,\n      String varIn,\n      String varOut,\n      String i) {\n    Type type = expandedTypes.get(depth);\n    String childVarIn = varIn + \"_\";\n    String childVarOut = varOut + \"_\";\n    String entryVar = \"entry\" + depth;\n    Class<?> rawClass = getRawClass(type);\n    Class<?> childRawType = getRawClass(expandedTypes.get(depth + 1));\n    final String childTypeName = getImplName(expandedTypes.get(depth + 1), false);\n    if (isList(rawClass)) {\n      builder\n          .append(i)\n          .append(\"  for (\")\n          .append(childTypeName)\n          .append(\" \")\n          .append(childVarIn)\n          .append(\" : \")\n          .append(varIn)\n          .append(\") {\\n\");\n    } else if (isMap(rawClass)) {\n      builder\n          .append(i)\n          .append(\"  for (java.util.Map.Entry<String, \")\n          .append(childTypeName)\n          .append(\"> \")\n          .append(entryVar)\n          .append(\" : \")\n          .append(varIn)\n          .append(\".entrySet()) {\\n\");\n      builder\n          .append(i)\n          .append(\"    \")\n          .append(childTypeName)\n          .append(\" \")\n          .append(childVarIn)\n          .append(\" = \")\n          .append(entryVar)\n          .append(\".getValue();\\n\");\n    }\n    if (isList(childRawType) || isMap(childRawType)) {\n      builder.append(i).append(\"    if (\").append(childVarIn).append(\" != null) {\\n\");\n      builder\n          .append(i)\n          .append(\"      \")\n          .append(childTypeName)\n          .append(\" \")\n          .append(childVarOut)\n          .append(\" = new \")\n          .append(getImplName(expandedTypes.get(depth + 1), true))\n          .append(\"();\\n\");\n      emitDeepCopyCollections(\n          expandedTypes, depth + 1, builder, childVarIn, childVarOut, i + \"    \");\n      builder.append(i).append(\"      \").append(varOut);\n      if (isList(rawClass)) {\n        builder.append(\".add(\");\n      } else {\n        builder.append(\".put(\").append(entryVar).append(\".getKey(), \");\n      }\n      builder.append(childVarOut);\n      builder.append(\");\\n\");\n      builder.append(i).append(\"    \").append(\"}\\n\");\n    } else {\n      builder.append(i).append(\"      \").append(varOut);\n      if (isList(rawClass)) {\n        builder.append(\".add(\");\n      } else {\n        builder.append(\".put(\").append(entryVar).append(\".getKey(), \");\n      }\n      if (getEnclosingTemplate().isDtoInterface(childRawType)) {\n        emitCheckNullAndCopyDto(childRawType, childVarIn, builder);\n      } else {\n        builder.append(childVarIn);\n      }\n      builder.append(\");\\n\");\n    }\n    builder.append(i).append(\"  }\\n\");\n  }\n\n  private void emitCheckNullAndCopyDto(Class<?> dto, String fieldName, StringBuilder builder) {\n    String implName = dto.getSimpleName() + \"Impl\";\n    builder\n        .append(fieldName)\n        .append(\" == null ? null : \")\n        .append(\"new \")\n        .append(implName)\n        .append(\"(\")\n        .append(fieldName)\n        .append(\")\");\n  }\n\n  /** Emit a method that ensures a collection is initialized. */\n  private void emitEnsureCollection(Method method, String fieldName, StringBuilder builder) {\n    builder.append(\"    protected void \");\n    builder.append(getEnsureName(fieldName));\n    builder.append(\"() {\\n\");\n    builder.append(\"      if (\");\n    builder.append(fieldName);\n    builder.append(\" == null) {\\n        \");\n    builder.append(fieldName);\n    builder.append(\" = new \");\n    builder.append(getImplName(method.getGenericReturnType(), true));\n    builder.append(\"();\\n\");\n    builder.append(\"      }\\n\");\n    builder.append(\"    }\\n\");\n  }\n\n  /**\n   * Appends a suitable type for the given type. For example, at minimum, this will replace DTO\n   * interfaces with their implementation classes and JSON collections with corresponding Java\n   * types. If a suitable type cannot be determined, this will throw an exception.\n   *\n   * @param genericType the type as returned by e.g. method.getGenericReturnType()\n   */\n  private void appendType(Type genericType, final StringBuilder builder) {\n    builder.append(getImplName(genericType, false));\n  }\n\n  /**\n   * In most cases we simply echo the return type and field name, except for JsonArray<T>, which is\n   * special in the server impl case, since it must be represented by a List<T> for Gson to\n   * correctly serialize/deserialize it.\n   *\n   * @param method The getter method.\n   * @return String representation of what the field type should be, as well as the assignment\n   *     (initial value) to said field type, if any.\n   */\n  private String getFieldTypeAndAssignment(Method method, String fieldName) {\n    StringBuilder builder = new StringBuilder();\n    builder.append(\"protected \");\n    appendType(method.getGenericReturnType(), builder);\n    builder.append(\" \");\n    builder.append(fieldName);\n    builder.append(\";\\n\");\n    return builder.toString();\n  }\n\n  /**\n   * Returns the fully-qualified type name using Java concrete implementation classes.\n   *\n   * <p>For example, for JsonArray&lt;JsonStringMap&lt;Dto&gt;&gt;, this would return\n   * \"ArrayList&lt;Map&lt;String, DtoImpl&gt;&gt;\".\n   */\n  private String getImplName(Type type, boolean allowJreCollectionInterface) {\n    Class<?> rawClass = getRawClass(type);\n    String fqName = getFqParameterizedName(type);\n    fqName =\n        fqName.replaceAll(JsonArray.class.getCanonicalName(), ArrayList.class.getCanonicalName());\n    fqName =\n        fqName.replaceAll(\n            JsonStringMap.class.getCanonicalName() + \"<\",\n            HashMap.class.getCanonicalName() + \"<String, \");\n\n    if (allowJreCollectionInterface) {\n      if (isList(rawClass)) {\n        fqName =\n            fqName.replaceFirst(List.class.getCanonicalName(), ArrayList.class.getCanonicalName());\n      } else if (isMap(rawClass)) {\n        fqName =\n            fqName.replaceFirst(Map.class.getCanonicalName(), HashMap.class.getCanonicalName());\n      }\n    }\n\n    return fqName;\n  }\n\n  /** Returns the fully-qualified type name including parameters. */\n  private String getFqParameterizedName(Type type) {\n    if (type instanceof Class<?>) {\n      return ((Class<?>) type).getCanonicalName();\n      // return getImplNameForDto((Class<?>)type);\n\n    } else if (type instanceof ParameterizedType) {\n      ParameterizedType pType = (ParameterizedType) type;\n\n      StringBuilder sb = new StringBuilder(getRawClass(pType).getCanonicalName());\n      sb.append('<');\n      for (int i = 0; i < pType.getActualTypeArguments().length; i++) {\n        if (i > 0) {\n          sb.append(\", \");\n        }\n        sb.append(getFqParameterizedName(pType.getActualTypeArguments()[i]));\n      }\n      sb.append('>');\n\n      return sb.toString();\n\n    } else {\n      throw new IllegalArgumentException(\n          \"Can't build implementation of \"\n              + getDtoInterface().getSimpleName()\n              + \". DtoGenerator does not handle this type \"\n              + type.toString());\n    }\n  }\n\n  /**\n   * Returns the fully-qualified type name using Java concrete implementation classes of the first\n   * type argument for a parameterized type. If one is not specified, returns \"Object\".\n   *\n   * @param type the parameterized type\n   * @return the first type argument\n   */\n  private String getTypeArgumentImplName(ParameterizedType type, int index) {\n    Type[] typeArgs = type.getActualTypeArguments();\n    if (typeArgs.length == 0) {\n      return \"Object\";\n    }\n    return getImplName(typeArgs[index], false);\n  }\n\n  private String getImplNameForDto(Class<?> dtoInterface) {\n    if (getEnclosingTemplate().isDtoInterface(dtoInterface)) {\n      // This will eventually get a generated impl type.\n      return dtoInterface.getSimpleName() + \"Impl\";\n    }\n    return dtoInterface.getCanonicalName();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/generator/DtoTemplate.java",
    "content": "// Copyright 2012 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage org.eclipse.che.dto.generator;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Comparator;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.dto.server.DtoFactoryVisitor;\n\n/**\n * Base template for the generated output file that contains all the DTOs.\n *\n * <p>Note that we generate client and server DTOs in separate runs of the generator.\n *\n * <p>The directionality of the DTOs only affects whether or not we expose methods to construct an\n * instance of the DTO. We need both client and server versions of all DTOs (irrespective of\n * direction).\n */\npublic class DtoTemplate {\n  public static class MalformedDtoInterfaceException extends RuntimeException {\n    public MalformedDtoInterfaceException(String msg) {\n      super(msg);\n    }\n  }\n\n  // We keep a whitelist of allowed non-DTO generic types.\n  static final Set<Class<?>> jreWhitelist =\n      new HashSet<>(\n          Arrays.asList(\n              new Class<?>[] {\n                String.class, Integer.class, Double.class, Float.class, Boolean.class\n              }));\n\n  private final List<DtoImpl> dtoInterfaces = new ArrayList<>();\n\n  // contains mapping for already implemented DTO interfaces\n  private final Map<Class<?>, Set<Class<?>>> implementedDtoInterfaces = new HashMap<>();\n\n  private final String packageName;\n\n  private final String className;\n\n  private final String implType;\n\n  /**\n   * Walks the super interface hierarchy to determine if a Class implements some target interface\n   * transitively.\n   */\n  static boolean implementsInterface(Class<?> i, Class<?> target) {\n    if (i.equals(target)) {\n      return true;\n    }\n\n    boolean rtn = false;\n    Class<?>[] superInterfaces = i.getInterfaces();\n    for (Class<?> superInterface : superInterfaces) {\n      rtn = rtn || implementsInterface(superInterface, target);\n    }\n    return rtn;\n  }\n\n  /**\n   * Constructor.\n   *\n   * @param packageName The name of the package for the outer DTO class.\n   * @param className The name of the outer DTO class.\n   * @param implType DTO impls type, \"client\" or \"server\".\n   */\n  DtoTemplate(String packageName, String className, String implType) {\n    this.packageName = packageName;\n    this.className = className;\n    this.implType = implType;\n  }\n\n  public String getImplType() {\n    return implType;\n  }\n\n  public void addImplementation(Class<?> dtoInterface, Class<?> impl) {\n    Set<Class<?>> classes = implementedDtoInterfaces.get(dtoInterface);\n    if (classes == null) {\n      implementedDtoInterfaces.put(dtoInterface, classes = new LinkedHashSet<>());\n    }\n    classes.add(impl);\n  }\n\n  /**\n   * Some DTO interfaces may be already implemented in dependencies of current project. Try to reuse\n   * them. If this method returns <code>null</code> it means interface is not implemented yet.\n   */\n  public Class<?> getDtoImplementation(Class<?> dtoInterface) {\n    Set<Class<?>> classes = implementedDtoInterfaces.get(dtoInterface);\n    if (classes == null || classes.isEmpty()) {\n      return null;\n    }\n    for (Class<?> impl : classes) {\n      if (impl.getSimpleName().equals(dtoInterface.getSimpleName() + \"Impl\")) {\n        return impl;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Adds an interface to the DtoTemplate for code generation.\n   *\n   * @param i interface to add\n   */\n  public void addInterface(Class<?> i) {\n    getDtoInterfaces().add(createDtoImplTemplate(i));\n  }\n\n  /**\n   * @return the dtoInterfaces\n   */\n  public List<DtoImpl> getDtoInterfaces() {\n    return dtoInterfaces;\n  }\n\n  /**\n   * Returns the source code for a class that contains all the DTO impls for any interfaces that\n   * were added via the {@link #addInterface(Class)} method.\n   */\n  @Override\n  public String toString() {\n    dtoInterfaces.sort(new DtoImplsComparator());\n    StringBuilder builder = new StringBuilder();\n    emitPreamble(builder);\n    emitDtos(builder);\n    emitPostamble(builder);\n    return builder.toString();\n  }\n\n  /**\n   * Tests whether or not a given class is a part of our dto jar, and thus will eventually have a\n   * generated Impl that is serializable (thus allowing it to be a generic type).\n   */\n  boolean isDtoInterface(Class<?> potentialDto) {\n    for (DtoImpl dto : getDtoInterfaces()) {\n      if (dto.getDtoInterface().equals(potentialDto)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private DtoImpl createDtoImplTemplate(Class<?> i) {\n    if (\"server\".equals(implType)) {\n      return new DtoImplServerTemplate(this, i);\n    } else if (\"client\".equals(implType)) {\n      return new DtoImplClientTemplate(this, i);\n    }\n    throw new IllegalStateException(\n        \"Unsupported DTO implementation type, must be 'client' or 'server'\");\n  }\n\n  private void emitDtos(StringBuilder builder) {\n    for (DtoImpl dto : getDtoInterfaces()) {\n      builder.append(dto.serialize());\n    }\n  }\n\n  private void emitPostamble(StringBuilder builder) {\n    builder.append(\"\\n}\");\n  }\n\n  private void emitPreamble(StringBuilder builder) {\n    builder.append(\n        \"/*******************************************************************************\\n\");\n    builder.append(\" * Copyright (c) 2012-2016 Red Hat, Inc.\\n\");\n    builder.append(\" * All rights reserved. This program and the accompanying materials\\n\");\n    builder.append(\" * are made available under the terms of the Eclipse Public License v1.0\\n\");\n    builder.append(\" * which accompanies this distribution, and is available at\\n\");\n    builder.append(\" * http://www.eclipse.org/legal/epl-v10.html\\n\");\n    builder.append(\" *\\n\");\n    builder.append(\" * Contributors:\\n\");\n    builder.append(\" * Red Hat, Inc. - initial API and implementation\\n\");\n    builder.append(\n        \" *******************************************************************************/\\n\\n\\n\");\n    builder.append(\"// GENERATED SOURCE. DO NOT EDIT.\\npackage \");\n    builder.append(packageName);\n    builder.append(\";\\n\\n\");\n    if (\"server\".equals(implType)) {\n      builder.append(\"import org.eclipse.che.dto.server.JsonSerializable;\\n\");\n      builder.append(\"\\n\");\n      builder.append(\"import com.google.gson.Gson;\\n\");\n      builder.append(\"import com.google.gson.GsonBuilder;\\n\");\n      builder.append(\"import com.google.gson.JsonArray;\\n\");\n      builder.append(\"import com.google.gson.JsonElement;\\n\");\n      builder.append(\"import com.google.gson.JsonNull;\\n\");\n      builder.append(\"import com.google.gson.JsonObject;\\n\");\n      builder.append(\"import com.google.gson.JsonParser;\\n\");\n      builder.append(\"import com.google.gson.JsonPrimitive;\\n\");\n      builder.append(\"\\n\");\n      builder.append(\"import java.util.List;\\n\");\n      builder.append(\"import java.util.Map;\\n\");\n    }\n    if (\"client\".equals(implType)) {\n      builder.append(\"import org.eclipse.che.ide.dto.ClientDtoFactoryVisitor;\\n\");\n      builder.append(\"import org.eclipse.che.ide.dto.DtoFactoryVisitor;\\n\");\n      builder.append(\"import org.eclipse.che.ide.dto.JsonSerializable;\\n\");\n      builder.append(\"import com.google.gwt.json.client.*;\\n\");\n      builder.append(\"import com.google.inject.Singleton;\\n\");\n    }\n    builder.append(\"\\n\\n@SuppressWarnings({\\\"unchecked\\\", \\\"cast\\\", \\\"MissingOverride\\\"})\\n\");\n    if (\"client\".equals(implType)) {\n      builder.append(\"@Singleton\\n\");\n      builder.append(\"@ClientDtoFactoryVisitor\\n\");\n    }\n    // Note that we always use fully qualified path names when referencing Types\n    // so we need not add any import statements for anything.\n    builder.append(\"public class \");\n    builder.append(className);\n    if (\"server\".equals(implType)) {\n      builder.append(\" implements \").append(DtoFactoryVisitor.class.getCanonicalName());\n    }\n    if (\"client\".equals(implType)) {\n      builder.append(\" implements \").append(\"DtoFactoryVisitor\");\n    }\n    builder.append(\" {\\n\\n\");\n    if (\"server\".equals(implType)) {\n      builder.append(\n          \"  private static final Gson gson = org.eclipse.che.dto.server.DtoFactory.getInstance().getGson();\\n\\n\");\n      builder.append(\n          \"  @Override\\n\"\n              + \"  public void accept(org.eclipse.che.dto.server.DtoFactory dtoFactory) {\\n\");\n      for (DtoImpl dto : getDtoInterfaces()) {\n        String dtoInterface = dto.getDtoInterface().getCanonicalName();\n        builder\n            .append(\"    dtoFactory.registerProvider(\")\n            .append(dtoInterface)\n            .append(\".class\")\n            .append(\", \")\n            .append(\"new org.eclipse.che.dto.server.DtoProvider<\")\n            .append(dtoInterface)\n            .append(\">() {\\n\");\n        builder\n            .append(\"        public Class<? extends \")\n            .append(dtoInterface)\n            .append(\"> getImplClass() {\\n\")\n            .append(\"            return \")\n            .append(dto.getImplClassName())\n            .append(\".class;\\n\");\n        builder.append(\"        }\\n\\n\");\n        builder\n            .append(\"        public \")\n            .append(dtoInterface)\n            .append(\" newInstance() {\\n\")\n            .append(\"            return \")\n            .append(dto.getImplClassName())\n            .append(\".make();\\n\");\n        builder.append(\"        }\\n\\n\");\n        builder\n            .append(\"        public \")\n            .append(dtoInterface)\n            .append(\" fromJson(String json) {\\n\")\n            .append(\"            return \")\n            .append(dto.getImplClassName())\n            .append(\".fromJsonString(json);\\n\");\n        builder.append(\"        }\\n\\n\");\n        builder\n            .append(\"        public \")\n            .append(dtoInterface)\n            .append(\" fromJson(com.google.gson.JsonElement json) {\\n\")\n            .append(\"            return \")\n            .append(dto.getImplClassName())\n            .append(\".fromJsonElement(json);\\n\");\n        builder.append(\"        }\\n\\n\");\n        builder\n            .append(\"        public \")\n            .append(dtoInterface)\n            .append(\" clone(\")\n            .append(dtoInterface)\n            .append(\" origin) {\\n\")\n            .append(\"            return new \")\n            .append(dto.getImplClassName())\n            .append(\"(origin);\\n\");\n        builder.append(\"        }\\n\");\n        builder.append(\"    });\\n\");\n      }\n      builder.append(\"  }\\n\\n\");\n    }\n    if (\"client\".equals(implType)) {\n      builder\n          .append(\"  @Override\\n\")\n          .append(\"  public void accept(org.eclipse.che.ide.dto.DtoFactory dtoFactory) {\\n\");\n      for (DtoImpl dto : getDtoInterfaces()) {\n        String dtoInterface = dto.getDtoInterface().getCanonicalName();\n        builder\n            .append(\"    dtoFactory.registerProvider(\")\n            .append(dtoInterface)\n            .append(\".class\")\n            .append(\", \")\n            .append(\"new org.eclipse.che.ide.dto.DtoProvider<\")\n            .append(dtoInterface)\n            .append(\">() {\\n\");\n        builder\n            .append(\"        public Class<? extends \")\n            .append(dtoInterface)\n            .append(\"> getImplClass() {\\n\")\n            .append(\"            return \")\n            .append(dto.getImplClassName())\n            .append(\".class;\\n\");\n        builder.append(\"        }\\n\\n\");\n        builder\n            .append(\"        public \")\n            .append(dtoInterface)\n            .append(\" newInstance() {\\n\")\n            .append(\"            return \")\n            .append(dto.getImplClassName())\n            .append(\".make();\\n\");\n        builder.append(\"        }\\n\\n\");\n        builder\n            .append(\"        public \")\n            .append(dtoInterface)\n            .append(\" fromJson(String json) {\\n\")\n            .append(\"            return \")\n            .append(dto.getImplClassName())\n            .append(\".fromJsonString(json);\\n\");\n        builder.append(\"        }\\n\");\n        builder.append(\"    });\\n\");\n      }\n      builder.append(\"  }\\n\\n\");\n    }\n  }\n\n  private static class DtoImplsComparator implements Comparator<DtoImpl> {\n    @Override\n    public int compare(DtoImpl o1, DtoImpl o2) {\n      return o1.getImplClassName().compareTo(o2.getImplClassName());\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/server/DtoFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.server;\n\nimport static java.lang.String.format;\n\nimport com.google.common.cache.CacheBuilder;\nimport com.google.common.cache.CacheLoader;\nimport com.google.common.cache.LoadingCache;\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonSyntaxException;\nimport com.google.gson.TypeAdapter;\nimport com.google.gson.TypeAdapterFactory;\nimport com.google.gson.internal.bind.ReflectiveTypeAdapterFactory;\nimport com.google.gson.reflect.TypeToken;\nimport com.google.gson.stream.JsonReader;\nimport com.google.gson.stream.JsonWriter;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.Reader;\nimport java.io.StringReader;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.ServiceLoader;\nimport java.util.concurrent.ConcurrentHashMap;\nimport org.eclipse.che.commons.lang.reflect.ParameterizedTypeImpl;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.dto.shared.JsonArray;\nimport org.eclipse.che.dto.shared.JsonStringMap;\n\n/**\n * Provides implementations of DTO interfaces.\n *\n * @author andrew00x\n */\npublic final class DtoFactory {\n\n  private static final LoadingCache<Type, ParameterizedType> listTypeCache =\n      CacheBuilder.newBuilder()\n          .concurrencyLevel(16)\n          .build(\n              new CacheLoader<Type, ParameterizedType>() {\n                @Override\n                public ParameterizedType load(Type type) {\n                  return new ParameterizedTypeImpl(List.class, type);\n                }\n              });\n\n  private static final LoadingCache<Type, ParameterizedType> mapTypeCache =\n      CacheBuilder.newBuilder()\n          .concurrencyLevel(16)\n          .build(\n              new CacheLoader<Type, ParameterizedType>() {\n                @Override\n                public ParameterizedType load(Type type) {\n                  return new ParameterizedTypeImpl(Map.class, String.class, type);\n                }\n              });\n\n  private static final DtoFactory INSTANCE = new DtoFactory();\n\n  public static DtoFactory getInstance() {\n    return INSTANCE;\n  }\n\n  /**\n   * Ge a {@link Gson} serializer that is configured to serializes/deserializes DTOs correctly.\n   *\n   * @return A Gson.\n   */\n  public Gson getGson() {\n    return dtoGson;\n  }\n\n  /**\n   * Creates new instance of class which implements specified DTO interface.\n   *\n   * @param dtoInterface DTO interface\n   * @throws IllegalArgumentException if can't provide any implementation for specified interface\n   */\n  public static <T> T newDto(Class<T> dtoInterface) {\n    return getInstance().createDto(dtoInterface);\n  }\n\n  private final Map<Class<?>, DtoProvider<?>> dtoInterface2Providers = new ConcurrentHashMap<>();\n  // Additional mapping for implementation of DTO interfaces.\n  // It helps avoid reflection when need create copy of exited DTO instance.\n  private final Map<Class<?>, DtoProvider<?>> dtoImpl2Providers = new ConcurrentHashMap<>();\n  private final Gson dtoGson =\n      buildDtoParser(\n          ServiceLoader.load(TypeAdapterFactory.class).iterator(), new DtoInterfaceTAF());\n\n  /**\n   * Created deep copy of DTO object.\n   *\n   * @param origin origin DTO object\n   * @return copy\n   * @throws IllegalArgumentException if specified object doesn't implement DTO interface annotated\n   *     with {@link org.eclipse.che.dto.shared.DTO &#064DTO} or if specified instance implements\n   *     more than one interface annotated with {@link org.eclipse.che.dto.shared.DTO &#064DTO}\n   */\n  @SuppressWarnings(\"unchecked\")\n  public <T> T clone(T origin) {\n    final Class<?> implClass = origin.getClass();\n    DtoProvider provider = dtoImpl2Providers.get(implClass);\n    if (provider == null) {\n      Class<?> dtoInterface = null;\n      Class<?>[] interfaces = implClass.getInterfaces();\n      if (interfaces.length == 0) {\n        return null;\n      }\n\n      for (Class<?> i : interfaces) {\n        if (i.isAnnotationPresent(DTO.class)) {\n          if (dtoInterface != null) {\n            throw new IllegalArgumentException(\n                \"Unable determine DTO interface. Type \"\n                    + implClass.getName()\n                    + \" implements or extends more than one interface annotated with @DTO annotation.\");\n          }\n          dtoInterface = i;\n        }\n      }\n\n      if (dtoInterface != null) {\n        provider = getDtoProvider(dtoInterface);\n      }\n    }\n\n    if (provider == null) {\n      throw new IllegalArgumentException(\"Unknown DTO type \" + implClass);\n    }\n\n    return (T) provider.clone(origin);\n  }\n\n  /**\n   * Shortcut for {@code DtoFactory.getInstance().clone(T dtoObject)}\n   *\n   * @see #clone(Object)\n   */\n  public static <T> T cloneDto(T origin) {\n    return getInstance().clone(origin);\n  }\n\n  public <T> String toJson(T dto) {\n    if (dto instanceof JsonSerializable) {\n      return ((JsonSerializable) dto).toJson();\n    }\n    throw new IllegalArgumentException(\"JsonSerializable instance required. \");\n  }\n\n  public <T> JsonElement toJsonElement(T dto) {\n    if (dto instanceof JsonSerializable) {\n      return ((JsonSerializable) dto).toJsonElement();\n    }\n    throw new IllegalArgumentException(\"JsonSerializable instance required. \");\n  }\n\n  /**\n   * Creates new instance of class which implements specified DTO interface.\n   *\n   * @param dtoInterface DTO interface\n   * @throws IllegalArgumentException if can't provide any implementation for specified interface\n   */\n  public <T> T createDto(Class<T> dtoInterface) {\n    return getDtoProvider(dtoInterface).newInstance();\n  }\n\n  //\n\n  /**\n   * Creates new instance of class which implements specified DTO interface, parses specified JSON\n   * string and uses parsed data for initializing fields of DTO object.\n   *\n   * @param json JSON data\n   * @param dtoInterface DTO interface\n   * @throws IllegalArgumentException if can't provide any implementation for specified interface\n   */\n  public <T> T createDtoFromJson(String json, Class<T> dtoInterface) {\n    try {\n      return createDtoFromJson(new StringReader(json), dtoInterface);\n    } catch (IOException e) {\n      throw new RuntimeException(e); // won't happen\n    }\n  }\n\n  /**\n   * Creates new instance of class which implements specified DTO interface, uses the specific JSON\n   * data for initializing fields of DTO object.\n   *\n   * @param json JSON data\n   * @param dtoInterface DTO interface\n   * @throws IllegalArgumentException if can't provide any implementation for specified interface\n   */\n  public <T> T createDtoFromJson(JsonElement json, Class<T> dtoInterface) {\n    return getDtoProvider(dtoInterface).fromJson(json);\n  }\n\n  /**\n   * Creates new instance of class which implements specified DTO interface, parses specified JSON\n   * data and uses parsed data for initializing fields of DTO object.\n   *\n   * @param json JSON data\n   * @param dtoInterface DTO interface\n   * @throws IllegalArgumentException if can't provide any implementation for specified interface\n   * @throws IOException if an i/o error occurs\n   */\n  public <T> T createDtoFromJson(Reader json, Class<T> dtoInterface) throws IOException {\n    getDtoProvider(dtoInterface);\n    return dtoGson.fromJson(json, dtoInterface);\n  }\n\n  /**\n   * Creates new instance of class which implements specified DTO interface, parses specified JSON\n   * data and uses parsed data for initializing fields of DTO object.\n   *\n   * @param json JSON data\n   * @param dtoInterface DTO interface\n   * @throws IllegalArgumentException if can't provide any implementation for specified interface\n   * @throws IOException if an i/o error occurs\n   */\n  public <T> T createDtoFromJson(InputStream json, Class<T> dtoInterface) throws IOException {\n    return createDtoFromJson(new InputStreamReader(json), dtoInterface);\n  }\n\n  //\n\n  /**\n   * Parses the JSON data from the specified sting into list of objects of the specified type.\n   *\n   * @param json JSON data\n   * @param dtoInterface DTO interface\n   * @return list of DTO\n   * @throws IllegalArgumentException if can't provide any implementation for specified interface\n   */\n  public <T> JsonArray<T> createListDtoFromJson(String json, Class<T> dtoInterface) {\n    try {\n      return createListDtoFromJson(new StringReader(json), dtoInterface);\n    } catch (IOException e) {\n      throw new RuntimeException(e); // won't happen\n    }\n  }\n\n  /**\n   * Parses the JSON data from the specified reader into list of objects of the specified type.\n   *\n   * @param json JSON data\n   * @param dtoInterface DTO interface\n   * @return list of DTO\n   * @throws IllegalArgumentException if can't provide any implementation for specified interface\n   */\n  public <T> JsonArray<T> createListDtoFromJson(Reader json, Class<T> dtoInterface)\n      throws IOException {\n    getDtoProvider(dtoInterface);\n    final List<T> list = parseDto(json, listTypeCache.getUnchecked(dtoInterface));\n    return new JsonArrayImpl<>(list);\n  }\n\n  /**\n   * Parses the JSON data from the specified stream into list of objects of the specified type.\n   *\n   * @param json JSON data\n   * @param dtoInterface DTO interface\n   * @return list of DTO\n   * @throws IllegalArgumentException if can't provide any implementation for specified interface\n   * @throws IOException if an i/o error occurs\n   */\n  public <T> JsonArray<T> createListDtoFromJson(InputStream json, Class<T> dtoInterface)\n      throws IOException {\n    return createListDtoFromJson(new InputStreamReader(json), dtoInterface);\n  }\n\n  //\n\n  /**\n   * Parses the JSON data from the specified sting into map of objects of the specified type.\n   *\n   * @param json JSON data\n   * @param dtoInterface DTO interface\n   * @return map of DTO\n   * @throws IllegalArgumentException if can't provide any implementation for specified interface\n   */\n  public <T> JsonStringMap<T> createMapDtoFromJson(String json, Class<T> dtoInterface) {\n    try {\n      return createMapDtoFromJson(new StringReader(json), dtoInterface);\n    } catch (IOException e) {\n      throw new RuntimeException(e); // won't happen\n    }\n  }\n\n  /**\n   * Parses the JSON data from the specified reader into map of objects of the specified type.\n   *\n   * @param json JSON data\n   * @param dtoInterface DTO interface\n   * @return map of DTO\n   * @throws IllegalArgumentException if can't provide any implementation for specified interface\n   * @throws IOException if an i/o error occurs\n   */\n  public <T> JsonStringMap<T> createMapDtoFromJson(Reader json, Class<T> dtoInterface)\n      throws IOException {\n    getDtoProvider(dtoInterface);\n    final Map<String, T> map = parseDto(json, mapTypeCache.getUnchecked(dtoInterface));\n    return new JsonStringMapImpl<>(map);\n  }\n\n  /**\n   * Parse a JSON string that contains DTOs, propagating JSON exceptions correctly if they are\n   * caused by failures in the given Reader. Real JSON syntax exceptions are propagated as-is.\n   */\n  private <T> T parseDto(Reader json, Type type) throws IOException {\n    try {\n      return dtoGson.fromJson(json, type);\n    } catch (JsonSyntaxException e) {\n      final Throwable cause = e.getCause();\n      if (cause instanceof IOException) {\n        throw (IOException) cause;\n      }\n      throw e;\n    }\n  }\n\n  /**\n   * Parses the JSON data from the specified stream into map of objects of the specified type.\n   *\n   * @param json JSON data\n   * @param dtoInterface DTO interface\n   * @return map of DTO\n   * @throws IllegalArgumentException if can't provide any implementation for specified interface\n   * @throws IOException if an i/o error occurs\n   */\n  public <T> JsonStringMap<T> createMapDtoFromJson(InputStream json, Class<T> dtoInterface)\n      throws IOException {\n    return createMapDtoFromJson(new InputStreamReader(json), dtoInterface);\n  }\n\n  //\n\n  @SuppressWarnings(\"unchecked\")\n  private <T> DtoProvider<T> getDtoProvider(Class<T> dtoInterface) {\n    DtoProvider<?> dtoProvider = dtoInterface2Providers.get(dtoInterface);\n    if (dtoProvider == null) {\n      if (!dtoInterface.isInterface()) {\n        throw new IllegalArgumentException(\n            format(\"Only interfaces can be DTO, but %s is not an interface.\", dtoInterface));\n      }\n\n      if (hasDtoAnnotation(dtoInterface)) {\n        throw new IllegalArgumentException(\n            format(\"Provider of implementation for DTO type %s is not found\", dtoInterface));\n      } else {\n        throw new IllegalArgumentException(dtoInterface + \" is not a DTO type\");\n      }\n    }\n\n    return (DtoProvider<T>) dtoProvider;\n  }\n\n  /**\n   * Checks if dtoInterface or its parent have DTO annotation.\n   *\n   * @param dtoInterface DTO interface\n   * @return true if only dtoInterface or one of its parent have DTO annotation.\n   */\n  private boolean hasDtoAnnotation(Class dtoInterface) {\n    if (dtoInterface.isAnnotationPresent(DTO.class)) {\n      return true;\n    }\n\n    for (Class parent : dtoInterface.getInterfaces()) {\n      if (hasDtoAnnotation(parent)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Registers DtoProvider for DTO interface.\n   *\n   * @param dtoInterface DTO interface\n   * @param provider provider for DTO interface\n   * @see DtoProvider\n   */\n  public void registerProvider(Class<?> dtoInterface, DtoProvider<?> provider) {\n    dtoInterface2Providers.put(dtoInterface, provider);\n    dtoImpl2Providers.put(provider.getImplClass(), provider);\n  }\n\n  /**\n   * Unregisters DtoProvider.\n   *\n   * @see #registerProvider(Class, DtoProvider)\n   */\n  public DtoProvider<?> unregisterProvider(Class<?> dtoInterface) {\n    final DtoProvider<?> dtoProvider = dtoInterface2Providers.remove(dtoInterface);\n    if (dtoProvider != null) {\n      dtoImpl2Providers.remove(dtoProvider.getImplClass());\n    }\n    return dtoProvider;\n  }\n\n  /**\n   * Test weather or not this DtoFactory has any DtoProvider which can provide implementation of DTO\n   * interface.\n   */\n  public boolean hasProvider(Class<?> dtoInterface) {\n    return dtoInterface2Providers.get(dtoInterface) != null;\n  }\n\n  /**\n   * A specialization of Gson's {@link ReflectiveTypeAdapterFactory} delegates operation on DTO\n   * interfaces to the corresponding implementation classes. The implementation classes generated\n   * correctly by the DTO Gson.\n   *\n   * @author tareq.sha@gmail.com\n   */\n  private class DtoInterfaceTAF implements TypeAdapterFactory {\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {\n      DtoProvider<?> prov = dtoInterface2Providers.get(type.getRawType());\n      if (prov != null) {\n        return (TypeAdapter<T>) gson.getAdapter(prov.getImplClass());\n      }\n      return null;\n    }\n  }\n\n  /**\n   * Wraps Gson's default List/Map adapter factories serialize null List/Map fields as empty\n   * instead.\n   *\n   * @author tareq.sha@gmail.com\n   */\n  private static class NullAsEmptyTAF<U> implements TypeAdapterFactory {\n    final Class<?> matchedClass;\n    final U defaultValue;\n\n    NullAsEmptyTAF(Class<U> matchedClass, U defaultValue) {\n      this.matchedClass = matchedClass;\n      this.defaultValue = defaultValue;\n    }\n\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {\n      if (!matchedClass.isAssignableFrom(type.getRawType())) {\n        return null;\n      }\n      TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);\n      return new TypeAdapter<T>() {\n        @Override\n        public void write(JsonWriter out, T value) throws IOException {\n          delegate.write(out, value != null ? value : (T) defaultValue);\n        }\n\n        @Override\n        public T read(JsonReader in) throws IOException {\n          return delegate.read(in);\n        }\n      };\n    }\n  }\n\n  static {\n    for (DtoFactoryVisitor visitor : ServiceLoader.load(DtoFactoryVisitor.class)) {\n      visitor.accept(INSTANCE);\n    }\n  }\n\n  private DtoFactory() {}\n\n  private static Gson buildDtoParser(\n      Iterator<TypeAdapterFactory> factoryIterator, TypeAdapterFactory... factories) {\n    GsonBuilder builder = new GsonBuilder();\n\n    for (Iterator<TypeAdapterFactory> it = factoryIterator; it.hasNext(); ) {\n      TypeAdapterFactory factory = it.next();\n      builder.registerTypeAdapterFactory(factory);\n    }\n\n    for (TypeAdapterFactory factory : factories) {\n      builder.registerTypeAdapterFactory(factory);\n    }\n\n    if (Boolean.valueOf(System.getenv(\"CHE_LEGACY__DTO__JSON__SERIALIZATION\"))) {\n      builder.registerTypeAdapterFactory(\n          new NullAsEmptyTAF<>(Collection.class, Collections.emptyList()));\n      builder.registerTypeAdapterFactory(new NullAsEmptyTAF<>(Map.class, Collections.emptyMap()));\n    } else {\n      builder.registerTypeHierarchyAdapter(Collection.class, new NullOrEmptyCollectionAdapter());\n      builder.registerTypeHierarchyAdapter(Map.class, new NullOrEmptyMapAdapter());\n    }\n\n    builder.registerTypeAdapterFactory(new SerializableInterfaceAdapterFactory());\n\n    return builder.create();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/server/DtoFactoryVisitor.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.server;\n\n/**\n * Visitor pattern. Generally needed to register DtoProviders by generated code in DtoFactory. Class\n * which contains generated code for server side implements this interface. When DtoFactory class is\n * loaded it looks up for all implementation of this interface and calls method {@link\n * #accept(DtoFactory)}.\n *\n * @author andrew00x\n */\npublic interface DtoFactoryVisitor {\n  void accept(DtoFactory dtoFactory);\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/server/DtoProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.server;\n\nimport com.google.gson.JsonElement;\n\n/**\n * Provides implementation of DTO interface.\n *\n * @author andrew00x\n */\npublic interface DtoProvider<DTO> {\n  Class<? extends DTO> getImplClass();\n\n  DTO fromJson(String json);\n\n  DTO fromJson(JsonElement json);\n\n  DTO newInstance();\n\n  DTO clone(DTO origin);\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/server/JsonArrayImpl.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.server;\n\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\nimport com.google.gson.JsonElement;\nimport java.io.Writer;\nimport java.util.Collection;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.ListIterator;\nimport org.eclipse.che.dto.shared.JsonArray;\n\npublic class JsonArrayImpl<T> implements JsonArray<T> {\n  private static final Gson gson =\n      new GsonBuilder().disableHtmlEscaping().serializeNulls().create();\n\n  private final List<T> delegate;\n\n  public JsonArrayImpl(List<T> delegate) {\n    this.delegate = delegate;\n  }\n\n  @Override\n  public int size() {\n    return delegate.size();\n  }\n\n  @Override\n  public boolean isEmpty() {\n    return delegate.isEmpty();\n  }\n\n  @Override\n  public boolean contains(Object o) {\n    return delegate.contains(o);\n  }\n\n  @Override\n  public Iterator<T> iterator() {\n    return delegate.iterator();\n  }\n\n  @Override\n  public Object[] toArray() {\n    return delegate.toArray();\n  }\n\n  @Override\n  public <T> T[] toArray(T[] a) {\n    return delegate.toArray(a);\n  }\n\n  public boolean add(T t) {\n    return delegate.add(t);\n  }\n\n  @Override\n  public boolean remove(Object o) {\n    return delegate.remove(o);\n  }\n\n  @Override\n  public boolean containsAll(Collection<?> c) {\n    return delegate.containsAll(c);\n  }\n\n  public boolean addAll(Collection<? extends T> c) {\n    return delegate.addAll(c);\n  }\n\n  public boolean addAll(int index, Collection<? extends T> c) {\n    return delegate.addAll(index, c);\n  }\n\n  @Override\n  public boolean removeAll(Collection<?> c) {\n    return delegate.removeAll(c);\n  }\n\n  @Override\n  public boolean retainAll(Collection<?> c) {\n    return delegate.retainAll(c);\n  }\n\n  @Override\n  public void clear() {\n    delegate.clear();\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    return delegate.equals(o);\n  }\n\n  @Override\n  public int hashCode() {\n    return delegate.hashCode();\n  }\n\n  @Override\n  public T get(int index) {\n    return delegate.get(index);\n  }\n\n  public T set(int index, T element) {\n    return delegate.set(index, element);\n  }\n\n  public void add(int index, T element) {\n    delegate.add(index, element);\n  }\n\n  @Override\n  public T remove(int index) {\n    return delegate.remove(index);\n  }\n\n  @Override\n  public int indexOf(Object o) {\n    return delegate.indexOf(o);\n  }\n\n  @Override\n  public int lastIndexOf(Object o) {\n    return delegate.lastIndexOf(o);\n  }\n\n  @Override\n  public ListIterator<T> listIterator() {\n    return delegate.listIterator();\n  }\n\n  @Override\n  public ListIterator<T> listIterator(int index) {\n    return delegate.listIterator(index);\n  }\n\n  @Override\n  public List<T> subList(int fromIndex, int toIndex) {\n    return delegate.subList(fromIndex, toIndex);\n  }\n\n  @Override\n  public String toJson() {\n    return gson.toJson(this);\n  }\n\n  @Override\n  public void toJson(Writer w) {\n    gson.toJson(this, w);\n  }\n\n  @Override\n  public JsonElement toJsonElement() {\n    return gson.toJsonTree(this);\n  }\n\n  @Override\n  public String toString() {\n    return delegate.toString();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/server/JsonSerializable.java",
    "content": "// Copyright 2012 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\npackage org.eclipse.che.dto.server;\n\nimport com.google.gson.JsonElement;\nimport java.io.Serializable;\nimport java.io.Writer;\n\n/** An entity that may serialize itself to JSON. */\npublic interface JsonSerializable extends Serializable {\n\n  /** Serializes DTO to JSON format. */\n  String toJson();\n\n  /** Serialize the DTO to JSON text through the given Writer. */\n  void toJson(Writer w);\n\n  /** Serializes DTO to JSON object. */\n  JsonElement toJsonElement();\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/server/JsonStringMapImpl.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.server;\n\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\nimport com.google.gson.JsonElement;\nimport java.io.Writer;\nimport java.util.Collection;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.dto.shared.JsonStringMap;\n\npublic class JsonStringMapImpl<T> implements JsonStringMap<T> {\n  private static final Gson gson =\n      new GsonBuilder().disableHtmlEscaping().serializeNulls().create();\n\n  private final Map<String, T> delegate;\n\n  public JsonStringMapImpl(Map<String, T> delegate) {\n    this.delegate = delegate;\n  }\n\n  @Override\n  public int size() {\n    return delegate.size();\n  }\n\n  @Override\n  public boolean isEmpty() {\n    return delegate.isEmpty();\n  }\n\n  @Override\n  public boolean containsKey(Object key) {\n    return delegate.containsKey(key);\n  }\n\n  @Override\n  public boolean containsValue(Object value) {\n    return delegate.containsValue(value);\n  }\n\n  @Override\n  public T get(Object key) {\n    return delegate.get(key);\n  }\n\n  public T put(String key, T value) {\n    return delegate.put(key, value);\n  }\n\n  @Override\n  public T remove(Object key) {\n    return delegate.remove(key);\n  }\n\n  public void putAll(Map<? extends String, ? extends T> m) {\n    delegate.putAll(m);\n  }\n\n  @Override\n  public void clear() {\n    delegate.clear();\n  }\n\n  @Override\n  public Set<String> keySet() {\n    return delegate.keySet();\n  }\n\n  @Override\n  public Collection<T> values() {\n    return delegate.values();\n  }\n\n  @Override\n  public Set<Entry<String, T>> entrySet() {\n    return delegate.entrySet();\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    return delegate.equals(o);\n  }\n\n  @Override\n  public int hashCode() {\n    return delegate.hashCode();\n  }\n\n  @Override\n  public String toJson() {\n    return gson.toJson(this);\n  }\n\n  @Override\n  public void toJson(Writer w) {\n    gson.toJson(this, w);\n  }\n\n  @Override\n  public JsonElement toJsonElement() {\n    return gson.toJsonTree(this);\n  }\n\n  @Override\n  public String toString() {\n    return delegate.toString();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/server/NullOrEmptyCollectionAdapter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.server;\n\nimport com.google.gson.JsonArray;\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonSerializationContext;\nimport com.google.gson.JsonSerializer;\nimport java.lang.reflect.Type;\nimport java.util.List;\n\n/**\n * This class will prevent serialization of null or empty fields of DTOs with Collection types\n *\n * @author Mykhailo Kuznietsov\n */\npublic class NullOrEmptyCollectionAdapter implements JsonSerializer<List<?>> {\n  @Override\n  public JsonElement serialize(List<?> src, Type typeOfSrc, JsonSerializationContext context) {\n    if (src == null || src.isEmpty()) {\n      return null;\n    }\n\n    JsonArray array = new JsonArray();\n\n    for (Object child : src) {\n      JsonElement element = context.serialize(child);\n      array.add(element);\n    }\n\n    return array;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/server/NullOrEmptyMapAdapter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.server;\n\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonObject;\nimport com.google.gson.JsonSerializationContext;\nimport com.google.gson.JsonSerializer;\nimport java.lang.reflect.Type;\nimport java.util.Map;\n\n/**\n * This class will prevent serialization of null or empty fields of DTOs with Map types\n *\n * @author Mykhailo Kuznietsov\n */\npublic class NullOrEmptyMapAdapter implements JsonSerializer<Map<?, ?>> {\n  @Override\n  public JsonElement serialize(Map<?, ?> src, Type typeOfSrc, JsonSerializationContext context) {\n    if (src == null || src.isEmpty()) {\n      return null;\n    }\n\n    JsonObject object = new JsonObject();\n    for (Map.Entry<?, ?> entry : src.entrySet()) {\n      object.add(entry.getKey().toString(), context.serialize(entry.getValue()));\n    }\n    return object;\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/server/SerializableInterfaceAdapterFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.server;\n\nimport com.google.gson.Gson;\nimport com.google.gson.TypeAdapter;\nimport com.google.gson.TypeAdapterFactory;\nimport com.google.gson.reflect.TypeToken;\nimport com.google.gson.stream.JsonReader;\nimport com.google.gson.stream.JsonToken;\nimport com.google.gson.stream.JsonWriter;\nimport java.io.IOException;\nimport java.io.Serializable;\n\n/**\n * This adapter is required for fields of {@link java.io.Serializable} type to be treated as {@link\n * Object}\n */\npublic class SerializableInterfaceAdapterFactory implements TypeAdapterFactory {\n\n  @Override\n  public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {\n    if (Serializable.class.equals(type.getRawType())) {\n      return (TypeAdapter<T>) new SerializableAdapter(gson.getAdapter(Object.class));\n    }\n    return null;\n  }\n\n  private static class SerializableAdapter extends TypeAdapter<Object> {\n\n    TypeAdapter objectAdapter;\n\n    public SerializableAdapter(TypeAdapter objectAdapter) {\n      this.objectAdapter = objectAdapter;\n    }\n\n    @Override\n    public void write(JsonWriter out, Object value) throws IOException {\n      objectAdapter.write(out, value);\n    }\n\n    @Override\n    public Object read(JsonReader in) throws IOException {\n      JsonToken token = in.peek();\n      if (token.equals(JsonToken.NUMBER)) {\n        try {\n          return in.nextLong();\n        } catch (NumberFormatException e) {\n          return in.nextDouble();\n        }\n      }\n      return objectAdapter.read(in);\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/shared/CompactJsonDto.java",
    "content": "// Copyright 2012 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\npackage org.eclipse.che.dto.shared;\n\n/**\n * Tag interface for DTOs that are serialized to compact (non human readable) JSON.\n *\n * <p>\n *\n * <p>Compact JSON has array as a root element. As a consequence GSON library throws an exception\n * when you try do deserialize JSON containing compact object as a root. Deserialize using {@link\n * com.google.gson.JsonElement} in such cases.\n *\n * <p>\n *\n * <p>Note: try to eliminate enums and boolean fields in DTO to get better serialized form density.\n */\npublic interface CompactJsonDto {}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/shared/DTO.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.shared;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * DTO interface definition annotation. Used to mark interface for generating DTO.\n *\n * @author Artem Zatsarynnyi\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface DTO {}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/shared/DTOImpl.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.shared;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Internal annotation for marking generated implementations for DTO interfaces.\n *\n * <p>Not expected to be used in any by developers directly.\n *\n * @author andrew00x\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface DTOImpl {\n  /** Type of DTO implementation,expected values are \"client\" or \"server\". */\n  String value();\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/shared/DelegateRule.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.shared;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Single DTO method delegate rule.\n *\n * @author andrew00x\n * @see DelegateTo\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface DelegateRule {\n  Class<?> type();\n\n  String method();\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/shared/DelegateTo.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.shared;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Annotation that contains \"rules\" for delegation invocation of DTO method to some third party\n * classes. In some case we may need more then just getters and setters in DTO, but there is no\n * common mechanism to generate such implementation for DTO interface. In this case this annotation\n * may help. Here is example of usage:\n *\n * <p>\n *\n * <ol>\n *   <li>DTO interface. It contains getters, setters and with methods and we do nothing special for\n *       them. Implementation generated automatically as well for client and server side. But if we\n *       want to have more complex method generator doesn't help, for example add some method for\n *       getting full name of user.\n *       <pre>\n * &#064DTO\n * public interface User {\n *     String getFirstName();\n *\n *     void setFirstName(String firstName);\n *\n *     User withFirstName(String firstName);\n *\n *     String getLastName();\n *\n *     void setLastName(String lastName);\n *\n *     User withLastName(String lastName);\n *\n *     &#064DelegateTo(client = &#064DelegateRule(type = Util.class, method = \"fullName\"),\n *                 server = &#064DelegateRule(type = Util.class, method = \"fullName\"))\n *     String getFullName();\n * }\n * </pre>\n *       For method {@code getFullName} add annotation {@code &#064DelegateTo}. Annotations may\n *       contains different delegate rules for client and server side.\n *       <p><div>DelegateTo</div>\n *       <table border=\"0\" cellpadding=\"1\" cellspacing=\"0\">\n * <tr align=\"left\">\n * <th align=\"left\">Parameter</th>\n * <th align=\"left\">Description</th>\n * </tr>\n * <tr><td>client</td><td>Rules for client</td></tr>\n * <tr><td>server</td><td>Rules for server</td></tr>\n * </table>\n *       <div>DelegateRule</div>\n *       <table border=\"0\" cellpadding=\"1\" cellspacing=\"0\">\n * <tr align=\"left\">\n * <th align=\"left\">Parameter</th>\n * <th align=\"left\">Description</th>\n * </tr>\n * <tr><td>type</td><td>Class that contains method to delegate method call</td></tr>\n * <tr><td>method</td><td>Name of method</td></tr>\n * </table>\n *   <li>Util class\n *       <pre>\n * public class Util {\n *     public static String fullName(User user) {\n *         return user.getFirstName() + \" \" + user.getLastName();\n *     }\n * }\n * </pre>\n *   <li>Requirements for methods to delegate DTO methods calls: Method must be public and static.\n *       Method must accept DTO interface as first parameter, if DTO method contains other\n *       parameters then the delegate method must accept the whole set of DTO method parameters\n *       starting from the second position. For example:\n *       <p>DTO method:\n *       <pre>\n * &#064DelegateTo(client = &#064DelegateRule(type = Util.class, method = \"fullName\"),\n *             server = &#064DelegateRule(type = Util.class, method = \"fullName\"))\n * String getFullNameWithPrefix(String prefix);\n * </pre>\n *       <p>Delegate method:\n *       <pre>\n * public static String fullName(User user, String prefix) {\n *         return prefix + \" \" + user.getFirstName() + \" \" + user.getLastName();\n * }\n * </pre>\n * </ul>\n *\n * </ol>\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface DelegateTo {\n  DelegateRule client();\n\n  DelegateRule server();\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/shared/JsonArray.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.shared;\n\nimport java.util.List;\nimport org.eclipse.che.dto.server.JsonSerializable;\n\n/** Abstraction for list of JSON values. */\npublic interface JsonArray<T> extends List<T>, JsonSerializable {}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/shared/JsonFieldName.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.shared;\n\nimport com.google.common.annotations.Beta;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Use a custom name for the JSON element that corresponds to a class field\n *\n * @author Tareq Sharafy (tareq.sharafy@sap.com)\n */\n@Beta\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface JsonFieldName {\n  String value();\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/shared/JsonStringMap.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.shared;\n\nimport java.util.Map;\nimport org.eclipse.che.dto.server.JsonSerializable;\n\n/** Abstraction for map of JSON values. */\npublic interface JsonStringMap<T> extends Map<String, T>, JsonSerializable {}\n"
  },
  {
    "path": "core/che-core-api-dto/src/main/java/org/eclipse/che/dto/shared/SerializationIndex.java",
    "content": "// Copyright 2012 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\npackage org.eclipse.che.dto.shared;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Annotation for specifying the index of field in serialized form.\n *\n * <p>\n *\n * <p>Index must be a positive integer.\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface SerializationIndex {\n  int value();\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/ServerDtoTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto;\n\nimport static java.util.Arrays.asList;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.gson.Gson;\nimport com.google.gson.JsonArray;\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonObject;\nimport com.google.gson.JsonParser;\nimport com.google.gson.JsonPrimitive;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.dto.definitions.ComplicatedDto;\nimport org.eclipse.che.dto.definitions.DTOHierarchy;\nimport org.eclipse.che.dto.definitions.DTOHierarchy.GrandchildDto;\nimport org.eclipse.che.dto.definitions.DtoWithAny;\nimport org.eclipse.che.dto.definitions.DtoWithDelegate;\nimport org.eclipse.che.dto.definitions.DtoWithFieldNames;\nimport org.eclipse.che.dto.definitions.DtoWithSerializable;\nimport org.eclipse.che.dto.definitions.SimpleDto;\nimport org.eclipse.che.dto.definitions.model.Model;\nimport org.eclipse.che.dto.definitions.model.ModelComponentDto;\nimport org.eclipse.che.dto.definitions.model.ModelDto;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.testng.Assert;\nimport org.testng.annotations.Test;\n\n/**\n * Tests that the interfaces specified in org.eclipse.che.dto.definitions have corresponding\n * generated server implementations.\n *\n * @author Artem Zatsarynnyi\n */\npublic class ServerDtoTest {\n\n  protected static final DtoFactory dtoFactory = DtoFactory.getInstance();\n\n  @Test\n  public void testCreateSimpleDto() throws Exception {\n    final String fooString = \"Something\";\n    final int fooId = 1;\n    final String _default = \"test_default_keyword\";\n\n    SimpleDto dto =\n        dtoFactory\n            .createDto(SimpleDto.class)\n            .withName(fooString)\n            .withId(fooId)\n            .withDefault(_default);\n\n    // Check to make sure things are in a sane state.\n    checkSimpleDto(dto, fooString, fooId, _default);\n  }\n\n  @Test\n  public void testSimpleDtoSerializer() throws Exception {\n    final String fooString = \"Something\";\n    final int fooId = 1;\n    final String _default = \"test_default_keyword\";\n\n    SimpleDto dto =\n        dtoFactory\n            .createDto(SimpleDto.class)\n            .withName(fooString)\n            .withId(fooId)\n            .withDefault(_default);\n    final String json = dtoFactory.toJson(dto);\n\n    JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();\n    assertEquals(jsonObject.get(\"name\").getAsString(), fooString);\n    assertEquals(jsonObject.get(\"id\").getAsInt(), fooId);\n    assertEquals(jsonObject.get(\"default\").getAsString(), _default);\n  }\n\n  @Test\n  public void testSimpleDtoDeserializer() throws Exception {\n    final String fooString = \"Something\";\n    final int fooId = 1;\n    final String _default = \"test_default_keyword\";\n\n    JsonObject json = new JsonObject();\n    json.add(\"name\", new JsonPrimitive(fooString));\n    json.add(\"id\", new JsonPrimitive(fooId));\n    json.add(\"default\", new JsonPrimitive(_default));\n\n    SimpleDto dto = dtoFactory.createDtoFromJson(json.toString(), SimpleDto.class);\n\n    // Check to make sure things are in a sane state.\n    checkSimpleDto(dto, fooString, fooId, _default);\n  }\n\n  @Test\n  public void testSerializerWithFieldNames() throws Exception {\n    final String fooString = \"Something\";\n    final String _default = \"test_default_keyword\";\n\n    DtoWithFieldNames dto =\n        dtoFactory\n            .createDto(DtoWithFieldNames.class)\n            .withTheName(fooString)\n            .withTheDefault(_default);\n    final String json = dtoFactory.toJson(dto);\n\n    JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();\n    assertEquals(jsonObject.get(DtoWithFieldNames.THENAME_FIELD).getAsString(), fooString);\n    assertEquals(jsonObject.get(DtoWithFieldNames.THEDEFAULT_FIELD).getAsString(), _default);\n  }\n\n  @Test\n  public void testDeserializerWithFieldNames() throws Exception {\n    final String fooString = \"Something\";\n    final String _default = \"test_default_keyword\";\n\n    JsonObject json = new JsonObject();\n    json.add(DtoWithFieldNames.THENAME_FIELD, new JsonPrimitive(fooString));\n    json.add(DtoWithFieldNames.THEDEFAULT_FIELD, new JsonPrimitive(_default));\n\n    DtoWithFieldNames dto = dtoFactory.createDtoFromJson(json.toString(), DtoWithFieldNames.class);\n\n    assertEquals(dto.getTheName(), fooString);\n    assertEquals(dto.getTheDefault(), _default);\n  }\n\n  @Test\n  public void testSerializerWithAny() throws Exception {\n    final List<Object> objects = createListTestValueForAny();\n    DtoWithAny dto =\n        dtoFactory\n            .createDto(DtoWithAny.class)\n            .withStuff(createTestValueForAny())\n            .withObjects(objects);\n    final String json = dtoFactory.toJson(dto);\n\n    JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();\n    Assert.assertEquals(jsonObject.get(\"stuff\"), createTestValueForAny());\n\n    Assert.assertTrue(jsonObject.has(\"objects\"));\n    JsonArray jsonArray = jsonObject.get(\"objects\").getAsJsonArray();\n    assertEquals(jsonArray.size(), objects.size());\n    for (int i = 0; i < jsonArray.size(); i++) {\n      assertEquals(jsonArray.get(i), objects.get(i));\n    }\n  }\n\n  @Test\n  public void testDeserializerWithAny() throws Exception {\n    JsonObject json = new JsonObject();\n    json.add(\"stuff\", createTestValueForAny());\n    JsonArray jsonArray = createElementListTestValueForAny();\n    json.add(\"objects\", jsonArray);\n\n    DtoWithAny dto = dtoFactory.createDtoFromJson(json.toString(), DtoWithAny.class);\n\n    Gson gson = new Gson();\n    Object stuffValue = gson.fromJson(createTestValueForAny(), Object.class);\n    Assert.assertEquals(dto.getStuff(), stuffValue);\n    Object objectsValue = gson.fromJson(createElementListTestValueForAny(), Object.class);\n    Assert.assertEquals(dto.getObjects(), objectsValue);\n  }\n\n  @Test\n  public void testShadowedFields() throws Exception {\n    GrandchildDto dto1 = dtoFactory.createDto(GrandchildDto.class);\n    dtoFactory.toJson(dto1);\n  }\n\n  /** Intentionally call several times to ensure non-reference equality */\n  private static JsonElement createTestValueForAny() {\n    return new JsonParser().parse(\"{a:100,b:{c:'blah'}}\");\n  }\n\n  /** Intentionally call several times to ensure non-reference equality */\n  private static List<Object> createListTestValueForAny() {\n    final ArrayList<Object> objects = new ArrayList<>();\n    objects.add(new JsonParser().parse(\"{x:1}\"));\n    objects.add(new JsonParser().parse(\"{b:120}\"));\n    return objects;\n  }\n\n  private JsonArray createElementListTestValueForAny() {\n    JsonArray jsonArray = new JsonArray();\n    for (Object object : createListTestValueForAny()) {\n      jsonArray.add((JsonElement) object);\n    }\n    return jsonArray;\n  }\n\n  @Test\n  public void testListSimpleDtoDeserializer() throws Exception {\n    final String fooString_1 = \"Something 1\";\n    final int fooId_1 = 1;\n    final String _default_1 = \"test_default_keyword_1\";\n    final String fooString_2 = \"Something 2\";\n    final int fooId_2 = 2;\n    final String _default_2 = \"test_default_keyword_2\";\n\n    JsonObject json1 = new JsonObject();\n    json1.add(\"name\", new JsonPrimitive(fooString_1));\n    json1.add(\"id\", new JsonPrimitive(fooId_1));\n    json1.add(\"default\", new JsonPrimitive(_default_1));\n\n    JsonObject json2 = new JsonObject();\n    json2.add(\"name\", new JsonPrimitive(fooString_2));\n    json2.add(\"id\", new JsonPrimitive(fooId_2));\n    json2.add(\"default\", new JsonPrimitive(_default_2));\n\n    JsonArray jsonArray = new JsonArray();\n    jsonArray.add(json1);\n    jsonArray.add(json2);\n\n    org.eclipse.che.dto.shared.JsonArray<SimpleDto> listDtoFromJson =\n        dtoFactory.createListDtoFromJson(jsonArray.toString(), SimpleDto.class);\n\n    assertEquals(listDtoFromJson.get(0).getName(), fooString_1);\n    assertEquals(listDtoFromJson.get(0).getId(), fooId_1);\n    assertEquals(listDtoFromJson.get(0).getDefault(), _default_1);\n\n    assertEquals(listDtoFromJson.get(1).getName(), fooString_2);\n    assertEquals(listDtoFromJson.get(1).getId(), fooId_2);\n    assertEquals(listDtoFromJson.get(1).getDefault(), _default_2);\n  }\n\n  @Test\n  public void testComplicatedDtoSerializer() throws Exception {\n    final String fooString = \"Something\";\n    final int fooId = 1;\n    final String _default = \"test_default_keyword\";\n\n    List<String> listStrings = new ArrayList<>(2);\n    listStrings.add(\"Something 1\");\n    listStrings.add(\"Something 2\");\n\n    ComplicatedDto.SimpleEnum simpleEnum = ComplicatedDto.SimpleEnum.ONE;\n\n    // Assume that SimpleDto works. Use it to test nested objects\n    SimpleDto simpleDto =\n        dtoFactory\n            .createDto(SimpleDto.class)\n            .withName(fooString)\n            .withId(fooId)\n            .withDefault(_default);\n\n    Map<String, SimpleDto> mapDtos = new HashMap<>(1);\n    mapDtos.put(fooString, simpleDto);\n\n    List<SimpleDto> listDtos = new ArrayList<>(1);\n    listDtos.add(simpleDto);\n\n    List<List<ComplicatedDto.SimpleEnum>> listOfListOfEnum = new ArrayList<>(1);\n    List<ComplicatedDto.SimpleEnum> listOfEnum = new ArrayList<>(3);\n    listOfEnum.add(ComplicatedDto.SimpleEnum.ONE);\n    listOfEnum.add(ComplicatedDto.SimpleEnum.TWO);\n    listOfEnum.add(ComplicatedDto.SimpleEnum.THREE);\n    listOfListOfEnum.add(listOfEnum);\n\n    ComplicatedDto dto =\n        dtoFactory\n            .createDto(ComplicatedDto.class)\n            .withStrings(listStrings)\n            .withSimpleEnum(simpleEnum)\n            .withMap(mapDtos)\n            .withSimpleDtos(listDtos)\n            .withArrayOfArrayOfEnum(listOfListOfEnum);\n\n    final String json = dtoFactory.toJson(dto);\n    JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();\n\n    Assert.assertTrue(jsonObject.has(\"strings\"));\n    JsonArray jsonArray = jsonObject.get(\"strings\").getAsJsonArray();\n    assertEquals(jsonArray.get(0).getAsString(), listStrings.get(0));\n    assertEquals(jsonArray.get(1).getAsString(), listStrings.get(1));\n\n    Assert.assertTrue(jsonObject.has(\"simpleEnum\"));\n    assertEquals(jsonObject.get(\"simpleEnum\").getAsString(), simpleEnum.name());\n\n    Assert.assertTrue(jsonObject.has(\"map\"));\n    JsonObject jsonMap = jsonObject.get(\"map\").getAsJsonObject();\n    JsonObject value = jsonMap.get(fooString).getAsJsonObject();\n    assertEquals(value.get(\"name\").getAsString(), fooString);\n    assertEquals(value.get(\"id\").getAsInt(), fooId);\n    assertEquals(value.get(\"default\").getAsString(), _default);\n\n    Assert.assertTrue(jsonObject.has(\"simpleDtos\"));\n    JsonArray simpleDtos = jsonObject.get(\"simpleDtos\").getAsJsonArray();\n    JsonObject simpleDtoJsonObject = simpleDtos.get(0).getAsJsonObject();\n    assertEquals(simpleDtoJsonObject.get(\"name\").getAsString(), fooString);\n    assertEquals(simpleDtoJsonObject.get(\"id\").getAsInt(), fooId);\n    assertEquals(simpleDtoJsonObject.get(\"default\").getAsString(), _default);\n\n    Assert.assertTrue(jsonObject.has(\"arrayOfArrayOfEnum\"));\n    JsonArray arrayOfArrayOfEnum =\n        jsonObject.get(\"arrayOfArrayOfEnum\").getAsJsonArray().get(0).getAsJsonArray();\n    assertEquals(arrayOfArrayOfEnum.get(0).getAsString(), ComplicatedDto.SimpleEnum.ONE.name());\n    assertEquals(arrayOfArrayOfEnum.get(1).getAsString(), ComplicatedDto.SimpleEnum.TWO.name());\n    assertEquals(arrayOfArrayOfEnum.get(2).getAsString(), ComplicatedDto.SimpleEnum.THREE.name());\n  }\n\n  @Test\n  public void testComplicatedDtoDeserializer() throws Exception {\n    final String fooString = \"Something\";\n    final int fooId = 1;\n    final String _default = \"test_default_keyword\";\n\n    JsonArray jsonArray = new JsonArray();\n    jsonArray.add(new JsonPrimitive(fooString));\n\n    JsonObject simpleDtoJsonObject = new JsonObject();\n    simpleDtoJsonObject.add(\"name\", new JsonPrimitive(fooString));\n    simpleDtoJsonObject.add(\"id\", new JsonPrimitive(fooId));\n    simpleDtoJsonObject.add(\"default\", new JsonPrimitive(_default));\n\n    JsonObject jsonMap = new JsonObject();\n    jsonMap.add(fooString, simpleDtoJsonObject);\n\n    JsonArray simpleDtosArray = new JsonArray();\n    simpleDtosArray.add(simpleDtoJsonObject);\n\n    JsonArray arrayOfEnum = new JsonArray();\n    arrayOfEnum.add(new JsonPrimitive(ComplicatedDto.SimpleEnum.ONE.name()));\n    arrayOfEnum.add(new JsonPrimitive(ComplicatedDto.SimpleEnum.TWO.name()));\n    arrayOfEnum.add(new JsonPrimitive(ComplicatedDto.SimpleEnum.THREE.name()));\n    JsonArray arrayOfArrayEnum = new JsonArray();\n    arrayOfArrayEnum.add(arrayOfEnum);\n\n    JsonObject complicatedDtoJsonObject = new JsonObject();\n    complicatedDtoJsonObject.add(\"strings\", jsonArray);\n    complicatedDtoJsonObject.add(\n        \"simpleEnum\", new JsonPrimitive(ComplicatedDto.SimpleEnum.ONE.name()));\n    complicatedDtoJsonObject.add(\"map\", jsonMap);\n    complicatedDtoJsonObject.add(\"simpleDtos\", simpleDtosArray);\n    complicatedDtoJsonObject.add(\"arrayOfArrayOfEnum\", arrayOfArrayEnum);\n\n    ComplicatedDto complicatedDto =\n        dtoFactory.createDtoFromJson(complicatedDtoJsonObject.toString(), ComplicatedDto.class);\n\n    assertEquals(complicatedDto.getStrings().get(0), fooString);\n    assertEquals(complicatedDto.getSimpleEnum(), ComplicatedDto.SimpleEnum.ONE);\n    checkSimpleDto(complicatedDto.getMap().get(fooString), fooString, fooId, _default);\n    checkSimpleDto(complicatedDto.getSimpleDtos().get(0), fooString, fooId, _default);\n    assertEquals(\n        complicatedDto.getArrayOfArrayOfEnum().get(0).get(0), ComplicatedDto.SimpleEnum.ONE);\n    assertEquals(\n        complicatedDto.getArrayOfArrayOfEnum().get(0).get(1), ComplicatedDto.SimpleEnum.TWO);\n    assertEquals(\n        complicatedDto.getArrayOfArrayOfEnum().get(0).get(2), ComplicatedDto.SimpleEnum.THREE);\n  }\n\n  private void checkSimpleDto(\n      SimpleDto dto, String expectedName, int expectedId, String expectedDefault) {\n    assertEquals(dto.getName(), expectedName);\n    assertEquals(dto.getId(), expectedId);\n    assertEquals(dto.getDefault(), expectedDefault);\n  }\n\n  @Test\n  public void testDelegate() {\n    assertEquals(\n        DtoFactory.getInstance()\n            .createDto(DtoWithDelegate.class)\n            .withFirstName(\"TEST\")\n            .nameWithPrefix(\"### \"),\n        \"### TEST\");\n  }\n\n  @Test\n  public void shouldBeAbleToExtendModelSkeletonWithDTOs() {\n    final DtoFactory factory = DtoFactory.getInstance();\n    final Model model =\n        factory\n            .createDto(ModelDto.class)\n            .withPrimary(factory.createDto(ModelComponentDto.class).withName(\"primary name\"))\n            .withComponents(\n                asList(\n                    factory.createDto(ModelComponentDto.class).withName(\"name\"),\n                    factory.createDto(ModelComponentDto.class).withName(\"name2\"),\n                    factory.createDto(ModelComponentDto.class).withName(\"name3\")));\n\n    assertEquals(\n        model.getPrimary(), factory.createDto(ModelComponentDto.class).withName(\"primary name\"));\n    assertEquals(model.getComponents().size(), 3);\n    assertTrue(\n        model\n            .getComponents()\n            .contains(factory.createDto(ModelComponentDto.class).withName(\"name\")));\n    assertTrue(\n        model\n            .getComponents()\n            .contains(factory.createDto(ModelComponentDto.class).withName(\"name2\")));\n    assertTrue(\n        model\n            .getComponents()\n            .contains(factory.createDto(ModelComponentDto.class).withName(\"name3\")));\n  }\n\n  @Test\n  public void shouldBeAbleToExtendsNotDTOInterfacesHierarchyWithDTOInterface() {\n    final DTOHierarchy.ChildDto childDto =\n        DtoFactory.getInstance()\n            .createDto(DTOHierarchy.ChildDto.class)\n            .withDtoField(\"dto-field\")\n            .withChildField(\"child-field\")\n            .withParentField(\"parent-field\");\n\n    assertEquals(childDto.getDtoField(), \"dto-field\");\n    assertEquals(childDto.getChildField(), \"child-field\");\n    assertEquals(childDto.getParentField(), \"parent-field\");\n  }\n\n  @Test(\n      expectedExceptions = IllegalArgumentException.class,\n      expectedExceptionsMessageRegExp =\n          \"Only interfaces can be DTO, but class java.lang.String is not an interface.\")\n  public void shouldThrowExceptionWhenThereIsClassType() {\n    DtoFactory.newDto(String.class);\n  }\n\n  @Test(\n      expectedExceptions = IllegalArgumentException.class,\n      expectedExceptionsMessageRegExp =\n          \"interface org.eclipse.che.dto.definitions.DTOHierarchy\\\\$GrandchildWithoutDto is not a DTO type\")\n  public void shouldThrowExceptionWhenInterfaceIsNotAnnotatedAsDto() {\n    DtoFactory.newDto(DTOHierarchy.GrandchildWithoutDto.class);\n  }\n\n  @Test\n  public void checkDtoDeserializationWithSerializableFields() {\n    final int fooId = 1;\n    final String fooString = \"some string\";\n    final long fooLong = 1234514362645634611L;\n    final double fooDouble = 1.2345;\n    final double fooRoundingDouble = 6.00;\n\n    JsonObject jsonMap = new JsonObject();\n    jsonMap.add(\"fooLong\", new JsonPrimitive(fooLong));\n    jsonMap.add(\"fooBoolean\", new JsonPrimitive(true));\n    jsonMap.add(\"fooDouble\", new JsonPrimitive(fooDouble));\n    jsonMap.add(\"fooRoundingDouble\", new JsonPrimitive(fooRoundingDouble));\n    jsonMap.add(\"fooString\", new JsonPrimitive(fooString));\n\n    JsonObject json = new JsonObject();\n    json.add(\"id\", new JsonPrimitive(fooId));\n    json.add(\"object\", new JsonPrimitive(fooString));\n    json.add(\"objectMap\", jsonMap);\n\n    DtoWithSerializable dto =\n        dtoFactory.createDtoFromJson(json.toString(), DtoWithSerializable.class);\n\n    assertEquals(dto.getId(), fooId);\n    assertEquals(dto.getObject(), fooString);\n    assertEquals(dto.getObjectMap().get(\"fooLong\"), fooLong);\n    assertEquals(dto.getObjectMap().get(\"fooBoolean\"), true);\n    assertEquals(dto.getObjectMap().get(\"fooDouble\"), fooDouble);\n    assertEquals(dto.getObjectMap().get(\"fooString\"), fooString);\n    assertEquals(dto.getObjectMap().get(\"fooRoundingDouble\"), Math.round(fooRoundingDouble));\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/ComplicatedDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * DTO for testing that the {@link org.eclipse.che.dto.generator.DtoGenerator} correctly generates\n * server implementations for object graphs (nested lists, and maps).\n *\n * @author Artem Zatsarynnyi\n */\n@DTO\npublic interface ComplicatedDto {\n\n  public enum SimpleEnum {\n    ONE,\n    TWO,\n    THREE\n  }\n\n  List<String> getStrings();\n\n  ComplicatedDto withStrings(List<String> strings);\n\n  SimpleEnum getSimpleEnum();\n\n  ComplicatedDto withSimpleEnum(SimpleEnum simpleEnum);\n\n  Map<String, SimpleDto> getMap();\n\n  ComplicatedDto withMap(Map<String, SimpleDto> map);\n\n  List<SimpleDto> getSimpleDtos();\n\n  ComplicatedDto withSimpleDtos(List<SimpleDto> listDtos);\n\n  List<List<SimpleEnum>> getArrayOfArrayOfEnum();\n\n  ComplicatedDto withArrayOfArrayOfEnum(List<List<SimpleEnum>> arrayOfArrayOfEnum);\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/DTOHierarchy.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Keeps DTO interfaces for hierarchy test\n *\n * @author Eugene Voevodin\n */\npublic final class DTOHierarchy {\n\n  public interface Parent {\n\n    String getParentField();\n  }\n\n  public interface Child extends Parent {\n\n    String getChildField();\n  }\n\n  @DTO\n  public interface ChildDto extends Child {\n\n    String getDtoField();\n\n    void setDtoField(String dtoField);\n\n    ChildDto withDtoField(String dtoField);\n\n    void setChildField(String childField);\n\n    ChildDto withChildField(String childField);\n\n    void setParentField(String parentField);\n\n    ChildDto withParentField(String parentField);\n\n    ChildDto getShadowedField();\n\n    void setShadowedField(ChildDto v);\n  }\n\n  @DTO\n  public interface GrandchildDto extends ChildDto {\n\n    GrandchildDto getShadowedField();\n\n    void setShadowedField(GrandchildDto v);\n  }\n\n  public interface Child2 extends Parent {\n    String getChild2Field();\n  }\n\n  public interface GrandchildWithoutDto extends Child, Child2 {}\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/DtoWithAny.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions;\n\nimport java.util.List;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Makes use of the 'any' (JsonElement) property type feature.\n *\n * @author Tareq Sharafy (tareq.sharafy@sap.com)\n */\n@DTO\npublic interface DtoWithAny {\n  int getId();\n\n  Object getStuff();\n\n  void setStuff(Object stuff);\n\n  DtoWithAny withStuff(Object stuff);\n\n  List<Object> getObjects();\n\n  void setObjects(List<Object> objects);\n\n  DtoWithAny withObjects(List<Object> objects);\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/DtoWithDelegate.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions;\n\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.dto.shared.DelegateRule;\nimport org.eclipse.che.dto.shared.DelegateTo;\n\n/**\n * @author andrew00x\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface DtoWithDelegate extends TestInterface {\n  String getFirstName();\n\n  void setFirstName(String firstName);\n\n  DtoWithDelegate withFirstName(String firstName);\n\n  String getLastName();\n\n  void setLastName(String lastName);\n\n  DtoWithDelegate withLastName(String lastName);\n\n  @DelegateTo(\n      client = @DelegateRule(type = Util.class, method = \"addPrefix\"),\n      server = @DelegateRule(type = Util.class, method = \"addPrefix\"))\n  String nameWithPrefix(String prefix);\n\n  //    @Override\n  //    @DelegateTo(client = @DelegateRule(type = Util.class, method = \"getFullName\"),\n  //                server = @DelegateRule(type = Util.class, method = \"getFullName\"))\n  //    String getFullName();\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/DtoWithFieldNames.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions;\n\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.dto.shared.JsonFieldName;\n\n/**\n * Makes use of the JsonFieldName annotation\n *\n * @author Tareq Sharafy (tareq.sharafy@sap.com)\n */\n@DTO\npublic interface DtoWithFieldNames {\n\n  public String THENAME_FIELD = \"the name\";\n  public String THEDEFAULT_FIELD = \"default\";\n\n  @JsonFieldName(THENAME_FIELD)\n  String getTheName();\n\n  void setTheName(String v);\n\n  DtoWithFieldNames withTheName(String v);\n\n  @JsonFieldName(THEDEFAULT_FIELD)\n  String getTheDefault();\n\n  void setTheDefault(String v);\n\n  DtoWithFieldNames withTheDefault(String v);\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/DtoWithSerializable.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions;\n\nimport java.io.Serializable;\nimport java.util.Map;\nimport org.eclipse.che.dto.shared.DTO;\n\n/** DTO for testing serialization of fields with {@link java.io.Serializable} type */\n@DTO\npublic interface DtoWithSerializable {\n  int getId();\n\n  DtoWithSerializable withId(int id);\n\n  Serializable getObject();\n\n  void setObject(Serializable object);\n\n  DtoWithSerializable withObject(Serializable object);\n\n  Map<String, Serializable> getObjectMap();\n\n  void setObjectMap(Map<String, Serializable> map);\n\n  DtoWithSerializable withObjectMap(Map<String, Serializable> map);\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/SimpleDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * DTO for testing that the {@link org.eclipse.che.dto.generator.DtoGenerator} correctly generates\n * server implementations for simple DTO interface.\n *\n * @author Artem Zatsarynnyi\n */\n@DTO\npublic interface SimpleDto {\n  int getId();\n\n  SimpleDto withId(int id);\n\n  String getName();\n\n  SimpleDto withName(String name);\n\n  String getDefault();\n\n  void setDefault(String s);\n\n  SimpleDto withDefault(String s);\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/TestInterface.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions;\n\n/**\n * @author Alexander Garagatyi\n */\npublic interface TestInterface {\n  String getFullName();\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/Util.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions;\n\n/**\n * @author andrew00x\n * @author Alexander Garagatyi\n */\npublic class Util {\n  public static String addPrefix(DtoWithDelegate dto, String prefix) {\n    return prefix + dto.getFirstName();\n  }\n\n  public static String getFullName(DtoWithDelegate dto) {\n    return dto.getFirstName() + dto.getLastName();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/model/Model.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions.model;\n\nimport java.util.List;\n\n/**\n * Test interface serves as base model, should be extended with dto interface\n *\n * @author Eugene Voevodin\n */\npublic interface Model {\n\n  List<? extends ModelComponent> getComponents();\n\n  ModelComponent getPrimary();\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/model/ModelComponent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions.model;\n\n/**\n * Test interface, serves as part of model {@link Model}, should be extended with dto interface\n *\n * @author Eugene Voevodin\n */\npublic interface ModelComponent {\n\n  String getName();\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/model/ModelComponentDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions.model;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Test dto extension for model component {@link ModelComponent}\n *\n * @author Eugene Voevodin\n */\n@DTO\npublic interface ModelComponentDto extends ModelComponent {\n\n  void setName(String name);\n\n  ModelComponentDto withName(String name);\n}\n"
  },
  {
    "path": "core/che-core-api-dto/src/test/java/org/eclipse/che/dto/definitions/model/ModelDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.definitions.model;\n\nimport java.util.List;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Test DTO extension for {@link Model}\n *\n * @author Eugene Voevodin\n */\n@DTO\npublic interface ModelDto extends Model {\n\n  @Override\n  List<ModelComponentDto> getComponents();\n\n  void setComponents(List<ModelComponentDto> components);\n\n  ModelDto withComponents(List<ModelComponentDto> components);\n\n  @Override\n  ModelComponentDto getPrimary();\n\n  void setPrimary(ModelComponentDto primary);\n\n  ModelDto withPrimary(ModelComponentDto primary);\n}\n"
  },
  {
    "path": "core/che-core-api-dto-maven-plugin/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-dto-maven-plugin</artifactId>\n    <packaging>maven-plugin</packaging>\n    <name>Che Core :: Commons :: API :: DTO Maven Plugin</name>\n    <properties>\n        <enforcer.skip>true</enforcer.skip>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n            <version>${project.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven</groupId>\n            <artifactId>maven-plugin-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven.plugin-tools</groupId>\n            <artifactId>maven-plugin-annotations</artifactId>\n            <scope>provided</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-plugin-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>mojo-descriptor</id>\n                        <goals>\n                            <goal>descriptor</goal>\n                        </goals>\n                    </execution>\n                    <execution>\n                        <id>help-goal</id>\n                        <goals>\n                            <goal>helpmojo</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <configuration>\n                    <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "core/che-core-api-dto-maven-plugin/src/main/java/org/eclipse/che/dto/generator/maven/plugin/DtoGeneratorMojo.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.dto.generator.maven.plugin;\n\nimport java.io.File;\nimport org.apache.maven.plugin.AbstractMojo;\nimport org.apache.maven.plugin.MojoExecutionException;\nimport org.apache.maven.plugins.annotations.Mojo;\nimport org.apache.maven.plugins.annotations.Parameter;\nimport org.apache.maven.plugins.annotations.ResolutionScope;\nimport org.eclipse.che.dto.generator.DtoGenerator;\n\n/** Mojo to run {@link org.eclipse.che.dto.generator.DtoGenerator}. */\n@Mojo(name = \"generate\", requiresDependencyResolution = ResolutionScope.COMPILE)\npublic class DtoGeneratorMojo extends AbstractMojo {\n  @Parameter(property = \"outputDir\", required = true)\n  private String outputDirectory;\n\n  @Parameter(property = \"dtoPackages\", required = true)\n  private String[] dtoPackages;\n\n  @Parameter(property = \"genClassName\", required = true)\n  private String genClassName;\n\n  @Parameter(property = \"impl\", required = true)\n  private String impl;\n\n  /** A flag to disable generation of the DTOs. */\n  @Parameter(property = \"che.dto.skip\", defaultValue = \"false\")\n  private boolean skip;\n\n  @Override\n  public void execute() throws MojoExecutionException {\n    if (skip) {\n      getLog().info(\"Skipping the execution\");\n      return;\n    }\n\n    DtoGenerator dtoGenerator = new DtoGenerator();\n    dtoGenerator.setPackageBase(outputDirectory);\n    String genFileName = genClassName.replace('.', File.separatorChar) + \".java\";\n    dtoGenerator.setGenFileName(\n        outputDirectory.endsWith(\"/\")\n            ? (outputDirectory + genFileName)\n            : (outputDirectory + File.separatorChar + genFileName));\n    dtoGenerator.setImpl(impl);\n    dtoGenerator.setDtoPackages(dtoPackages);\n    dtoGenerator.generate();\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-model/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-model</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: Commons :: API :: Model</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/factory/Action.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.factory;\n\nimport java.util.Map;\n\n/**\n * Defines the contract for the factory action instance.\n *\n * @author Anton Korneta\n */\npublic interface Action {\n\n  /** Returns the IDE specific identifier of action e.g. ('openFile', 'editFile') */\n  String getId();\n\n  /** Returns properties of this action instance */\n  Map<String, String> getProperties();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/factory/Author.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.factory;\n\n/**\n * Defines the contract for the factory creator instance.\n *\n * @author Anton Korneta\n */\npublic interface Author {\n\n  /** Identifier of the user who created factory, it is mandatory */\n  String getUserId();\n\n  /** Creation time of factory, set by the server (in milliseconds, from Unix epoch, no timezone) */\n  Long getCreated();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/factory/Factory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.factory;\n\nimport org.eclipse.che.api.core.model.workspace.WorkspaceConfig;\n\n/**\n * Defines the contract for the factory instance.\n *\n * @author Anton Korneta\n */\npublic interface Factory {\n\n  /** Returns the identifier of this factory instance, it is mandatory and unique. */\n  String getId();\n\n  /** Returns the version of this factory instance, it is mandatory. */\n  String getV();\n\n  /** Returns a name of this factory instance, the name is unique for creator. */\n  String getName();\n\n  /** Returns creator of this factory instance. */\n  Author getCreator();\n\n  /** Returns a workspace configuration of this factory instance. */\n  WorkspaceConfig getWorkspace();\n\n  /** Returns restrictions of this factory instance. */\n  Policies getPolicies();\n\n  /** Returns IDE for this factory instance. */\n  Ide getIde();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/factory/Ide.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.factory;\n\n/**\n * Defines the contract for the factory IDE instance.\n *\n * @author Anton Korneta\n */\npublic interface Ide {\n\n  /** Returns configuration of IDE on application loaded event */\n  OnAppLoaded getOnAppLoaded();\n\n  /** Returns configuration of IDE on application closed event */\n  OnAppClosed getOnAppClosed();\n\n  /** Returns configuration of IDE on projects loaded event */\n  OnProjectsLoaded getOnProjectsLoaded();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/factory/OnAppClosed.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.factory;\n\nimport java.util.List;\n\n/**\n * Defines IDE look and feel on application closed event.\n *\n * @author Anton Korneta\n */\npublic interface OnAppClosed {\n\n  /** Returns actions for current event. */\n  List<? extends Action> getActions();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/factory/OnAppLoaded.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.factory;\n\nimport java.util.List;\n\n/**\n * Defines IDE look and feel on application loaded event.\n *\n * @author Anton Korneta\n */\npublic interface OnAppLoaded {\n\n  /** Returns actions for current event. */\n  List<? extends Action> getActions();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/factory/OnProjectsLoaded.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.factory;\n\nimport java.util.List;\n\n/**\n * Defines IDE look and feel on project opened event.\n *\n * @author Anton Korneta\n */\npublic interface OnProjectsLoaded {\n\n  /** Returns actions for current event. */\n  List<? extends Action> getActions();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/factory/Policies.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.factory;\n\n/**\n * Defines the contract for the factory restrictions.\n *\n * @author Anton Korneta\n */\npublic interface Policies {\n\n  /** Restrict access if referer header doesn't match this field */\n  String getReferer();\n\n  /** Restrict access for factories used earlier then author supposes */\n  Long getSince();\n\n  /** Restrict access for factories used later then author supposes */\n  Long getUntil();\n\n  /** Workspace creation strategy */\n  String getCreate();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/factory/ScmInfo.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.factory;\n\n/** Defines the contract for the SCM information. */\npublic interface ScmInfo {\n  String getScmProviderName();\n\n  String getRepositoryUrl();\n\n  String getBranch();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/project/ProjectProblem.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.project;\n\n/**\n * @author Vitalii Parfonov\n */\npublic interface ProjectProblem {\n\n  int getCode();\n\n  String getMessage();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/project/type/Attribute.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.project.type;\n\n/**\n * Model interface for Project type's attribute\n *\n * @author gazarenkov\n */\npublic interface Attribute {\n\n  /**\n   * @return attribute unique Id\n   */\n  String getId();\n\n  /**\n   * @return attribute name\n   */\n  String getName();\n\n  /**\n   * @return project type this attribute belongs to\n   */\n  String getProjectType();\n\n  /**\n   * @return value for this attribute\n   */\n  Value getValue();\n\n  /**\n   * @return some test description of this attribute\n   */\n  String getDescription();\n\n  /**\n   * @return true if the attribute is mandatory\n   */\n  boolean isRequired();\n\n  /*\n   * @return true if attribute value can be changed\n   */\n  boolean isVariable();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/project/type/ProjectType.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.project.type;\n\nimport java.util.List;\n\n/**\n * Model interface for Project Type\n *\n * @author gazarenkov\n */\npublic interface ProjectType {\n\n  /**\n   * @return unique ID\n   */\n  String getId();\n\n  /**\n   * @return project type display name\n   */\n  String getDisplayName();\n\n  /**\n   * @return true if this project type can be mixed in\n   */\n  boolean isMixable();\n\n  /**\n   * @return true if this project type can be used as primary\n   */\n  boolean isPrimaryable();\n\n  /**\n   * @return true if this project type explicitly stored as is in the project description otherwise\n   *     it is considered as \"runtime\" and can be calculated runtime using defined mandatory\n   *     attributes thanks to Value Provider mechanism\n   */\n  boolean isPersisted();\n\n  /**\n   * @return attributes\n   */\n  List<? extends Attribute> getAttributes();\n\n  /**\n   * @return parent project type IDs\n   */\n  List<String> getParents();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/project/type/Value.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.project.type;\n\nimport java.util.List;\n\n/**\n * Attribute value\n *\n * @author gazarenkov\n */\npublic interface Value {\n\n  /**\n   * @return value as String. If attribute has multiple values it returns first one.\n   */\n  String getString();\n\n  /**\n   * @return value as list of strings\n   */\n  List<String> getList();\n\n  /**\n   * @return whether the value is not initialized\n   */\n  boolean isEmpty();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/user/Profile.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.user;\n\nimport java.util.Map;\n\n/**\n * Defines the user's profile model.\n *\n * <p>User's profile describes an additional user information such as his job title or company name\n * which is not related to application business logic. If it is necessary to manage business logic\n * related attributes then user's preferences should be used instead.\n *\n * @author Yevhenii Voevodin\n * @see User\n */\npublic interface Profile {\n\n  /** Returns the identifier of the user {@link User#getId()} whom this profile belongs to. */\n  String getUserId();\n\n  /** Returns the user profile attributes (e.g. job title). */\n  Map<String, String> getAttributes();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/user/User.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.user;\n\nimport java.util.List;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Defines the user model.\n *\n * @author Yevhenii Voevodin\n */\npublic interface User {\n\n  /**\n   * Returns the identifier of the user (e.g. \"user0x124567890\"). The identifier value is unique and\n   * mandatory.\n   */\n  String getId();\n\n  /**\n   * Returns the user's email (e.g. user@codenvy.com). The email is unique, mandatory and updatable.\n   */\n  String getEmail();\n\n  /** Returns the user's name (e.g. name_example). The name is unique, mandatory and updatable. */\n  String getName();\n\n  /**\n   * Returns the list of the user's aliases, the aliases are the values which identify user in the\n   * system with third party ids (e.g. if user is registered within google oauth the aliases list\n   * may contain 'google:user_identifier' alias).\n   *\n   * <p>Note that user's {@link #getEmail() email} and {@link #getName() name} are not a part of the\n   * result, and returned list never contains those values. Also note that returned aliases are\n   * unique, so there are no two users who have the alias in common.\n   */\n  List<String> getAliases();\n\n  /**\n   * Returns the user's password. The returned value may be the password placeholder such as 'none'\n   * or even null, depends on the context.\n   */\n  @Nullable\n  String getPassword();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/Runtime.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.runtime.Machine;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Defines a contract for workspace runtime.\n *\n * <p>Workspace has runtime when workspace is <b>running</b> (its {@link Workspace#getStatus()\n * status} is one of the {@link WorkspaceStatus#STARTING}, {@link WorkspaceStatus#RUNNING}, {@link\n * WorkspaceStatus#STOPPING}).\n *\n * <p>Workspace runtime defines workspace attributes which exist only when workspace is running. All\n * those attributes are strongly related to the runtime environment. Workspace runtime always exists\n * in couple with {@link Workspace} instance.\n *\n * @author Yevhenii Voevodin\n */\npublic interface Runtime {\n\n  /**\n   * Returns an active environment name. The environment with such name must exist in {@link\n   * WorkspaceConfig#getEnvironments()}.\n   */\n  @Nullable\n  String getActiveEnv();\n\n  /**\n   * Returns all the machines which statuses are either {MachineStatus#RUNNING running} or\n   * {MachineStatus#DESTROYING}.\n   *\n   * <p>Returned list always contains dev-machine.\n   */\n  Map<String, ? extends Machine> getMachines();\n\n  String getOwner();\n\n  /**\n   * Returns the list of the warnings indicating that the runtime violates some non-critical\n   * constraints or default configuration values are used to boot it.\n   */\n  List<? extends Warning> getWarnings();\n\n  /**\n   * Returns commands which are related to runtime, when runtime doesn't contain commands returns\n   * empty list. It is optional, workspace may contain 0 or N commands.\n   */\n  List<? extends Command> getCommands();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/Warning.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace;\n\n/**\n * Describes a warning, a pair of a message and a code which may indicate some context specific\n * non-critical violation.\n *\n * @author Yevhenii Voevodin\n */\npublic interface Warning {\n\n  /** Returns the code of the warning. */\n  int getCode();\n\n  /** Returns the message explaining the warning. */\n  String getMessage();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/Workspace.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace;\n\nimport com.google.common.annotations.Beta;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.devfile.Devfile;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Defines a contract for workspace instance.\n *\n * <p>Workspace instance defines all the attributes related to the certain workspace plus\n * configuration used to create instance plus its runtime.\n *\n * @author Yevhenii Voevodin\n */\npublic interface Workspace {\n\n  /** Returns the identifier of this workspace instance. It is mandatory and unique. */\n  String getId();\n\n  /**\n   * Returns the namespace of the current workspace instance. Workspace name is unique for\n   * workspaces in the same namespace.\n   */\n  String getNamespace();\n\n  /**\n   * Returns the status of the current workspace instance.\n   *\n   * <p>All the workspaces which are stopped have runtime are considered {@link\n   * WorkspaceStatus#STOPPED}.\n   */\n  WorkspaceStatus getStatus();\n\n  /**\n   * Returns workspace instance attributes (e.g. last modification date). Workspace attributes must\n   * not contain null keys or values.\n   */\n  Map<String, String> getAttributes();\n\n  /**\n   * Returns true if this workspace is temporary, and false otherwise. Temporary workspace exists\n   * only in runtime so {@link #getRuntime()} will never return null for temporary workspace as well\n   * as {@link #getStatus()} will never return {@link WorkspaceStatus#STOPPED}.\n   */\n  boolean isTemporary();\n\n  /**\n   * Returns a configuration of this workspace instance. The only one format (workspace config or\n   * devfile) may be used for workspace at the same time.\n   */\n  @Nullable\n  WorkspaceConfig getConfig();\n\n  /**\n   * Returns a configuration of this workspace instance in Devfile format. The only one format\n   * (workspace config or devfile) may be used for workspace at the same time.\n   */\n  @Beta\n  @Nullable\n  Devfile getDevfile();\n\n  /**\n   * Returns the runtime of this workspace instance. If status of this workspace instance is either\n   * {@link WorkspaceStatus#RUNNING} or {@link WorkspaceStatus#STARTING}, or {@link\n   * WorkspaceStatus#STOPPING} then returned value is not null, otherwise it is.\n   */\n  @Nullable\n  Runtime getRuntime();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/WorkspaceConfig.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.config.Environment;\nimport org.eclipse.che.api.core.model.workspace.config.ProjectConfig;\nimport org.eclipse.che.api.core.model.workspace.devfile.Devfile;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Defines workspace configuration.\n *\n * @author gazarenkov\n * @author Yevhenii Voevodin\n */\npublic interface WorkspaceConfig {\n\n  /** Returns the name of the current workspace instance. Workspace name is unique per namespace. */\n  String getName();\n\n  /** Returns description of workspace. */\n  @Nullable\n  String getDescription();\n\n  /**\n   * Returns default environment name. It is mandatory, implementation should guarantee that\n   * environment with returned name exists for current workspace config.\n   */\n  @Nullable\n  String getDefaultEnv();\n\n  /**\n   * Returns commands which are related to workspace, when workspace doesn't contain commands\n   * returns empty list. It is optional, workspace may contain 0 or N commands.\n   */\n  List<? extends Command> getCommands();\n\n  /**\n   * Returns project configurations which are related to workspace, when workspace doesn't contain\n   * projects returns empty list. It is optional, workspace may contain 0 or N project\n   * configurations.\n   */\n  List<? extends ProjectConfig> getProjects();\n\n  /**\n   * Returns mapping of environment names to environment configurations. Workspace must contain at\n   * least 1 default environment and may contain N environments.\n   */\n  Map<String, ? extends Environment> getEnvironments();\n\n  /**\n   * Returns workspace config attributes. Workspace config attributes must not contain null keys or\n   * values.\n   */\n  Map<String, String> getAttributes();\n\n  /** Returns devfile that was to generating workspace config, null otherwise. */\n  Devfile getDevfile();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/WorkspaceStatus.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace;\n\n/**\n * Defines the contract between workspace and its active environment.\n *\n * <p>Workspace is rather part of the {@link Workspace} than {@link Runtime} or {@link\n * WorkspaceConfig}, as it shows the state of <b>certain</b> user's workspace and exists\n * <b>earlier</b> than runtime workspace instance e.g. UsersWorkspace may be considered as\n * 'STARTING' before it becomes runtime('RUNNING').\n *\n * @author Alexander Garagatyi\n * @author Yevhenii Voevodin\n */\npublic enum WorkspaceStatus {\n\n  /**\n   * Workspace considered as starting if and only if its active environment is booting.\n   *\n   * <p>Workspace becomes starting only if it was {@link #STOPPED}. The status map:\n   *\n   * <pre>\n   *  STOPPED -> <b>STARTING</b> -> RUNNING  (normal behaviour)\n   *  STOPPED -> <b>STARTING</b> -> STOPPED  (failed to start)\n   *  STOPPED -> <b>STARTING</b> -> STOPPING (explicitly stopped)\n   * </pre>\n   */\n  STARTING,\n\n  /**\n   * Workspace considered as running if and only if its environment is running.\n   *\n   * <p>Workspace becomes running after it was {@link #STARTING}. The status map:\n   *\n   * <pre>\n   *  STARTING -> <b>RUNNING</b> -> STOPPING (normal behaviour)\n   *  STARTING -> <b>RUNNING</b> -> STOPPED (environment start was interrupted)\n   * </pre>\n   */\n  RUNNING,\n\n  /**\n   * Workspace considered as stopping if and only if its active environment is shutting down.\n   *\n   * <p>Workspace is in stopping status only if it was in {@link #RUNNING} or {@link #STARTING}\n   * status before. The status map:\n   *\n   * <pre>\n   *  RUNNING  -> <b>STOPPING</b> -> STOPPED (normal behaviour)/(error while stopping)\n   *  STARTING -> <b>STOPPING</b> -> STOPPED (stopped while starting)\n   * </pre>\n   */\n  STOPPING,\n\n  /**\n   * Workspace considered as stopped when:\n   *\n   * <ul>\n   *   <li>Environment was successfully stopped\n   *   <li>Error occurred while environment was stopping\n   *   <li>Dev-machine failed to start\n   *   <li>Running environment machine was stopped by internal problem(e.g. OOM of a machine)\n   *   <li>Workspace hasn't been started yet(e.g stopped is the status of the user's workspace\n   *       instance without its runtime)\n   * </ul>\n   *\n   * <p>The status map:\n   *\n   * <pre>\n   *  STOPPING -> <b>STOPPED</b> (normal behaviour)/(error while stopping)\n   *  STARTING -> <b>STOPPED</b> (failed to start)\n   *  RUNNING  -> <b>STOPPED</b> (environment machine was interrupted)\n   * </pre>\n   */\n  STOPPED\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/Command.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.config;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.devfile.PreviewUrl;\n\n/**\n * Command that can be used to create {@link Process} in a machine\n *\n * @author Eugene Voevodin\n * @author gazarenkov\n */\npublic interface Command {\n\n  /**\n   * {@link Command} attribute which indicates the working directory where the given command must be\n   * run\n   */\n  String WORKING_DIRECTORY_ATTRIBUTE = \"workingDir\";\n\n  /**\n   * {@link Command} attribute which indicates in which machine command must be run. It is optional,\n   * IDE should asks user to choose machine if null.\n   */\n  String MACHINE_NAME_ATTRIBUTE = \"machineName\";\n\n  /**\n   * Optional {@link Command} attribute to store full url of the view of the command. This url\n   * should be opened on command run.\n   */\n  String PREVIEW_URL_ATTRIBUTE = \"previewUrl\";\n\n  /**\n   * {@link Command} attribute which indicates in which plugin command must be run. If specified\n   * plugin has multiple containers then first containers should be used. Attribute value has the\n   * following format: `{PLUGIN_PUBLISHER}/{PLUGIN_NAME}/{PLUGIN_VERSION}`. For example:\n   * eclipse/sample-plugin/0.0.1\n   */\n  String PLUGIN_ATTRIBUTE = \"plugin\";\n\n  /**\n   * An attribute of the command to store the original path to the file that contains the editor\n   * specific configuration.\n   */\n  String COMMAND_ACTION_REFERENCE_ATTRIBUTE = \"actionReference\";\n\n  /** The contents of editor-specific content. */\n  String COMMAND_ACTION_REFERENCE_CONTENT_ATTRIBUTE = \"actionReferenceContent\";\n\n  /**\n   * Returns command name (i.e. 'start tomcat') The name should be unique per user in one workspace,\n   * which means that user may create only one command with the same name in the same workspace\n   */\n  String getName();\n\n  /**\n   * Returns command line (i.e. 'mvn clean install') which is going to be executed\n   *\n   * <p>Serves as a base for {@link Process} creation.\n   */\n  String getCommandLine();\n\n  /** Returns command type (i.e. 'maven') */\n  String getType();\n\n  /**\n   * @return preview url of the command or null if no preview url specified\n   */\n  PreviewUrl getPreviewUrl();\n\n  /**\n   * Returns attributes related to this command.\n   *\n   * @return command attributes\n   */\n  Map<String, String> getAttributes();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/Environment.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.config;\n\nimport java.util.Map;\n\n/**\n * Defines environment for machines network.\n *\n * @author gazarenkov\n * @author Alexander Garagatyi\n */\npublic interface Environment {\n  /**\n   * Returns the recipe (the main script) to define this environment (compose, kubernetes pod). Type\n   * of this recipe defines engine for composing machines network runtime.\n   */\n  Recipe getRecipe();\n\n  /** Returns mapping of machine name to additional configuration of machine. */\n  Map<String, ? extends MachineConfig> getMachines();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/MachineConfig.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.config;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\n\n/**\n * Machine configuration\n *\n * @author Alexander Garagatyi\n */\npublic interface MachineConfig {\n\n  /**\n   * Name of the attribute from {@link #getAttributes()} which if present defines memory limit of\n   * the machine in bytes. If memory limit is set in environment specific recipe this attribute used\n   * in {@code MachineConfig} should override value from recipe.\n   */\n  String MEMORY_LIMIT_ATTRIBUTE = \"memoryLimitBytes\";\n\n  /**\n   * Name of the attribute from {@link #getAttributes()} which if present defines requested memory\n   * allocation of the machine in bytes. If memory request is set in environment specific recipe\n   * this attribute used in {@code MachineConfig} should override value from recipe. If both request\n   * and limit are defined, and memory request is greater than the memory limit, this value is\n   * ignored and only limit is used\n   */\n  String MEMORY_REQUEST_ATTRIBUTE = \"memoryRequestBytes\";\n\n  /**\n   * Name of the attribute from {@link #getAttributes()} which if present defines CPU limit of the\n   * machine in cores.\n   */\n  String CPU_LIMIT_ATTRIBUTE = \"cpuLimitCores\";\n\n  /**\n   * Name of the attribute from {@link #getAttributes()} which if present defines requested CPU\n   * allocation of the machine in cores.\n   */\n  String CPU_REQUEST_ATTRIBUTE = \"cpuRequestCores\";\n\n  /**\n   * Name of the attribute from {@link #getAttributes()} which, if present, defines the entrypoint\n   * command to be executed in the machine/container.\n   *\n   * <p>The format is a YAML list of strings, e.g. {@code ['/bin/sh', '-c']}\n   */\n  String CONTAINER_COMMAND_ATTRIBUTE = \"containerCommand\";\n\n  /**\n   * Name of the attribute from {@link #getAttributes()} which, if present, defines the command line\n   * arguments of the entrypoint command specified using the {@link #CONTAINER_COMMAND_ATTRIBUTE}.\n   *\n   * <p>If {@link #CONTAINER_COMMAND_ATTRIBUTE} is not present, the default command defined in the\n   * image is used and the arguments are provided to it.\n   *\n   * <p>The format is a YAML list of strings, e.g. {@code ['-f', '--yes']}\n   */\n  String CONTAINER_ARGS_ATTRIBUTE = \"containerArgs\";\n\n  /**\n   * Name of the attribute from {@link #getAttributes()} which, if present, defines the alias of the\n   * {@link Component} of the devfile which was a source of the given machine.\n   */\n  String DEVFILE_COMPONENT_ALIAS_ATTRIBUTE = \"component\";\n\n  /** Returns mapping of references to configurations of servers deployed into machine. */\n  Map<String, ? extends ServerConfig> getServers();\n\n  /** Returns environment variables of machine. */\n  Map<String, String> getEnv();\n\n  /** Returns attributes of machine. */\n  Map<String, String> getAttributes();\n\n  /** Returns volumes of machine */\n  Map<String, ? extends Volume> getVolumes();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/ProjectConfig.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.config;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.project.ProjectProblem;\n\n/**\n * @author gazarenkov\n * @author Dmitry Shnurenko\n */\npublic interface ProjectConfig {\n  String getName();\n\n  String getPath();\n\n  String getDescription();\n\n  String getType();\n\n  List<String> getMixins();\n\n  Map<String, List<String>> getAttributes();\n\n  SourceStorage getSource();\n\n  List<? extends ProjectProblem> getProblems();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/Recipe.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.config;\n\n/**\n * Describes recipe of workspace environment.\n *\n * @author Alexander Garagatyi\n */\npublic interface Recipe {\n  /** Type of the environment. */\n  String getType();\n\n  /** Content type of the environment recipe, e.g. application/x-yaml. */\n  String getContentType();\n\n  /** Content of an environment recipe. Content and location fields are mutually exclusive. */\n  String getContent();\n\n  /** Location of an environment recipe. Content and location fields are mutually exclusive. */\n  String getLocation();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/ServerConfig.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.config;\n\nimport static java.lang.String.join;\nimport static java.util.Collections.emptyList;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.devfile.Endpoint;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Configuration of server that can be started inside of machine.\n *\n * @author Alexander Garagatyi\n */\npublic interface ServerConfig {\n\n  /**\n   * {@link ServerConfig} and {@link Server} attribute name which can identify server as internal or\n   * external. Attribute value {@code true} makes a server internal, any other value or lack of the\n   * attribute makes the server external.\n   */\n  String INTERNAL_SERVER_ATTRIBUTE = \"internal\";\n\n  /**\n   * {@link ServerConfig} and {@link Server} attribute name which can identify server as secure or\n   * non-secure. Requests to secure servers will be authenticated and must contain machine token.\n   * Attribute value {@code true} makes a server secure, any other value or lack of the attribute\n   * makes the server non-secure.\n   */\n  String SECURE_SERVER_ATTRIBUTE = \"secure\";\n\n  /**\n   * {@link ServerConfig} and {@link Server} attribute name which can contain an comma-separated\n   * list of URI-s which are considered as non-secure on the given server and can be accessible with\n   * unauthenticated requests.\n   */\n  String UNSECURED_PATHS_ATTRIBUTE = \"unsecuredPaths\";\n\n  /**\n   * {@link ServerConfig} and {@link Server} attribute name which indicates whether authentication\n   * with cookies is allowed or not. Attribute value {@code true} cookies authentication enabled,\n   * any other value or lack of the attribute denies to use cookies authentication.\n   */\n  String SECURE_SERVER_COOKIES_AUTH_ENABLED_ATTRIBUTE = \"cookiesAuthEnabled\";\n\n  /**\n   * {@link ServerConfig} and {@link Server} attribute name which sets the server as unique, meaning\n   * that, if exposed, it has its own endpoint even if it shares the same port with other servers.\n   */\n  String UNIQUE_SERVER_ATTRIBUTE = \"unique\";\n\n  /**\n   * {@link ServerConfig} and {@link Server} attribute name which can identify endpoint as\n   * discoverable(i.e. it is accessible by its name from workspace's containers). Attribute value\n   * {@code true} makes a endpoint discoverable, any other value or lack of the attribute makes the\n   * server non-discoverable.\n   */\n  String DISCOVERABLE_SERVER_ATTRIBUTE = \"discoverable\";\n\n  /**\n   * This attribute is used to remember {@link Endpoint#getName()} inside {@link ServerConfig} for\n   * internal use.\n   */\n  String SERVER_NAME_ATTRIBUTE = \"serverName\";\n\n  /**\n   * This attribute is used to remember name of the service for single-host gateway configuration.\n   * It's used internally only, so the attribute is removed from {@link ServerConfig}'s attributes\n   * before going outside.\n   */\n  String SERVICE_NAME_ATTRIBUTE = \"serviceName\";\n\n  /**\n   * This attribute is used to remember port of the service for single-host gateway configuration.\n   * It's used internally only, so the attribute is removed from {@link ServerConfig}'s attributes\n   * before going outside.\n   */\n  String SERVICE_PORT_ATTRIBUTE = \"servicePort\";\n\n  /**\n   * This attributes is marking that server should be exposed on subdomain if we're on single-host.\n   * It has no effect on other server exposure strategies.\n   */\n  String REQUIRE_SUBDOMAIN = \"requireSubdomain\";\n\n  /** Attribute that specifies the base location of the JWT authenticating callback. */\n  String ENDPOINT_ORIGIN = \"endpointOrigin\";\n\n  /**\n   * Port used by server.\n   *\n   * <p>It may contain protocol(tcp or udp) after '/' symbol. If protocol is missing tcp will be\n   * used by default. Example:\n   *\n   * <ul>\n   *   <li>8080/tcp\n   *   <li>8080/udp\n   *   <li>8080\n   * </ul>\n   */\n  String getPort();\n\n  /**\n   * Protocol for configuring preview url of this server.\n   *\n   * <p>Example:\n   *\n   * <ul>\n   *   <li>http\n   *   <li>https\n   *   <li>tcp\n   *   <li>udp\n   *   <li>ws\n   *   <li>wss\n   * </ul>\n   */\n  String getProtocol();\n\n  /** Path used by server. */\n  @Nullable\n  String getPath();\n\n  /** Attributes of the server */\n  Map<String, String> getAttributes();\n\n  /**\n   * Determines whether the attributes configure the server to be internal.\n   *\n   * @param attributes the attributes with additional server configuration\n   * @see #INTERNAL_SERVER_ATTRIBUTE\n   */\n  static boolean isInternal(Map<String, String> attributes) {\n    return AttributesEvaluator.booleanAttr(attributes, INTERNAL_SERVER_ATTRIBUTE, false);\n  }\n\n  /**\n   * Sets the \"internal\" flag in the provided attributes to the provided value.\n   *\n   * @param attributes the attributes with the additional server configuration\n   */\n  static void setInternal(Map<String, String> attributes, boolean value) {\n    attributes.put(INTERNAL_SERVER_ATTRIBUTE, Boolean.toString(value));\n  }\n\n  /**\n   * Determines whether the attributes configure the server to be secure.\n   *\n   * @param attributes the attributes with additional server configuration\n   * @see #SECURE_SERVER_ATTRIBUTE\n   */\n  static boolean isSecure(Map<String, String> attributes) {\n    return AttributesEvaluator.booleanAttr(attributes, SECURE_SERVER_ATTRIBUTE, false);\n  }\n\n  /**\n   * Sets the \"secure\" flag in the provided attributes to the provided value.\n   *\n   * @param attributes the attributes with the additional server configuration\n   */\n  static void setSecure(Map<String, String> attributes, boolean value) {\n    attributes.put(SECURE_SERVER_ATTRIBUTE, Boolean.toString(value));\n  }\n\n  /**\n   * Determines whether the attributes configure the server to be unique.\n   *\n   * @param attributes the attributes with additional server configuration\n   * @see #UNIQUE_SERVER_ATTRIBUTE\n   */\n  static boolean isUnique(Map<String, String> attributes) {\n    return AttributesEvaluator.booleanAttr(attributes, UNIQUE_SERVER_ATTRIBUTE, false);\n  }\n\n  /**\n   * Sets the \"unique\" flag in the provided attributes to the provided value.\n   *\n   * @param attributes the attributes with the additional server configuration\n   */\n  static void setUnique(Map<String, String> attributes, boolean value) {\n    attributes.put(UNIQUE_SERVER_ATTRIBUTE, Boolean.toString(value));\n  }\n\n  /**\n   * Determines whether the attributes configure the server to be discoverable.\n   *\n   * @param attributes the attributes with additional server configuration\n   * @see #DISCOVERABLE_SERVER_ATTRIBUTE\n   */\n  static boolean isDiscoverable(Map<String, String> attributes) {\n    return AttributesEvaluator.booleanAttr(attributes, DISCOVERABLE_SERVER_ATTRIBUTE, false);\n  }\n\n  /**\n   * Determines whether the attributes configure the server to be authenticated using JWT cookies. A\n   * null value means that the attributes don't require any particular authentication.\n   *\n   * @param attributes the attributes with additional server configuration\n   * @see #SECURE_SERVER_COOKIES_AUTH_ENABLED_ATTRIBUTE\n   */\n  static @Nullable Boolean isCookiesAuthEnabled(Map<String, String> attributes) {\n    String val = attributes.get(SECURE_SERVER_COOKIES_AUTH_ENABLED_ATTRIBUTE);\n    return val == null ? null : Boolean.parseBoolean(val);\n  }\n\n  /**\n   * Sets the \"cookiesAuthEnabled\" flag in the provided attributes to the provided value. A null\n   * value means that the attributes don't require any particular authentication.\n   *\n   * @param attributes the attributes with the additional server configuration\n   */\n  static void setCookiesAuthEnabled(Map<String, String> attributes, @Nullable Boolean value) {\n    if (value == null) {\n      attributes.remove(SECURE_SERVER_COOKIES_AUTH_ENABLED_ATTRIBUTE);\n    } else {\n      attributes.put(SECURE_SERVER_COOKIES_AUTH_ENABLED_ATTRIBUTE, Boolean.toString(value));\n    }\n  }\n\n  /**\n   * This is checking if the attributes configure the server to be exposed on a subdomain if we're\n   * on single-host. It has no effect on other server exposure strategies.\n   */\n  static boolean isRequireSubdomain(Map<String, String> attributes) {\n    return AttributesEvaluator.booleanAttr(attributes, REQUIRE_SUBDOMAIN, false);\n  }\n\n  /**\n   * Modify the attributes to configure the server to be exposed on a subdomain if we're on\n   * single-host. It has no effect on other server exposure strategies.\n   */\n  static void setRequireSubdomain(Map<String, String> attributes, boolean value) {\n    if (value) {\n      attributes.put(REQUIRE_SUBDOMAIN, Boolean.TRUE.toString());\n    } else {\n      attributes.remove(REQUIRE_SUBDOMAIN);\n    }\n  }\n\n  /**\n   * Returns the base location of the JWT authenticating callback.\n   *\n   * @param attributes the server attributes\n   */\n  static @Nullable String getEndpointOrigin(Map<String, String> attributes) {\n    return attributes.get(ENDPOINT_ORIGIN);\n  }\n\n  /**\n   * Sets the base location of the JWT authenticating callback.\n   *\n   * @param attributes the server attributes\n   * @param value the auth origin or null if none should be used\n   */\n  static void setEndpointOrigin(Map<String, String> attributes, @Nullable String value) {\n    if (value == null) {\n      attributes.remove(ENDPOINT_ORIGIN);\n    } else {\n      attributes.putIfAbsent(ENDPOINT_ORIGIN, value);\n    }\n  }\n\n  /**\n   * Finds the unsecured paths configuration in the provided attributes.s\n   *\n   * @param attributes the attributes with additional server configuration\n   * @see #UNSECURED_PATHS_ATTRIBUTE\n   */\n  static List<String> getUnsecuredPaths(Map<String, String> attributes) {\n    if (attributes == null) {\n      return emptyList();\n    }\n\n    String paths = attributes.get(UNSECURED_PATHS_ATTRIBUTE);\n    if (paths == null) {\n      return emptyList();\n    }\n\n    return Arrays.asList(paths.split(\"\\\\s*,\\\\s*\"));\n  }\n\n  static void setUnsecuredPaths(Map<String, String> attributes, List<String> value) {\n    attributes.put(UNSECURED_PATHS_ATTRIBUTE, join(\",\", value));\n  }\n\n  /**\n   * @see #isInternal(Map)\n   */\n  default boolean isInternal() {\n    return isInternal(getAttributes());\n  }\n\n  /**\n   * @see #isSecure(Map)\n   */\n  default boolean isSecure() {\n    return isSecure(getAttributes());\n  }\n\n  /**\n   * @see #isUnique(Map)\n   */\n  default boolean isUnique() {\n    return isUnique(getAttributes());\n  }\n\n  /**\n   * @see #isCookiesAuthEnabled(Map)\n   */\n  default @Nullable Boolean isCookiesAuthEnabled() {\n    return isCookiesAuthEnabled(getAttributes());\n  }\n\n  /**\n   * @see #getUnsecuredPaths(Map)\n   */\n  default List<String> getUnsecuredPaths() {\n    return getUnsecuredPaths(getAttributes());\n  }\n\n  /**\n   * @see #isDiscoverable(Map)\n   */\n  default boolean isDiscoverable() {\n    return isDiscoverable(getAttributes());\n  }\n\n  /**\n   * @see #isRequireSubdomain(Map)\n   */\n  default boolean isRequireSubdomain() {\n    return isRequireSubdomain(getAttributes());\n  }\n\n  /**\n   * @see #getEndpointOrigin(Map)\n   */\n  default String getEndpointOrigin() {\n    return getEndpointOrigin(getAttributes());\n  }\n}\n\n// helper class for the default methods in the above interface\nclass AttributesEvaluator {\n  static boolean booleanAttr(Map<String, String> attrs, String name, boolean defaultValue) {\n    if (attrs == null) {\n      return defaultValue;\n    }\n\n    String attr = attrs.get(name);\n    if (attr == null) {\n      return defaultValue;\n    }\n\n    return Boolean.parseBoolean(attr);\n  }\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/SourceStorage.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.config;\n\nimport java.util.Map;\n\n/**\n * @author gazarenkov\n */\npublic interface SourceStorage {\n\n  /**\n   * The key with this name in the parameters designates the branch that should be initially checked\n   * out from the source location.\n   */\n  String BRANCH_PARAMETER_NAME = \"branch\";\n\n  /**\n   * The key with this name in the parameters designates the tag that the initially checked out\n   * branch should be reset to.\n   */\n  String TAG_PARAMETER_NAME = \"tag\";\n\n  /**\n   * The key with this name in the parameters designates the commit id that the initially checked\n   * out branch should be reset to.\n   */\n  String COMMIT_ID_PARAMETER_NAME = \"commitId\";\n\n  /**\n   * The key with this name in the parameters designates the revision (of any kind) that the\n   * initially checked out branch should be reset to.\n   */\n  String START_POINT_PARAMETER_NAME = \"startPoint\";\n\n  /**\n   * The key with this name in the parameters designates the directory that should be used for\n   * sparse checkout, i.e. the only directory of repository which should be created by git.\n   */\n  String SPARSE_CHECKOUT_DIR_PARAMETER_NAME = \"sparseCheckoutDir\";\n\n  String getType();\n\n  String getLocation();\n\n  Map<String, String> getParameters();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/Volume.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.config;\n\n/**\n * Machine volume configuration.\n *\n * @author Alexander Garagatyi\n */\npublic interface Volume {\n\n  /** Mount path of the volume in the machine */\n  String getPath();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/Action.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\npublic interface Action {\n  /** Returns action type. Is is mandatory. */\n  String getType();\n\n  /** Returns component to which given action relates. */\n  String getComponent();\n\n  /** Returns the actual action command-line string. */\n  String getCommand();\n\n  /** Returns the working directory where the command should be executed. It is optional. */\n  String getWorkdir();\n\n  /** Returns the name of the referenced IDE-specific configuration file. */\n  String getReference();\n\n  /** Returns the content of the referenced IDE-specific configuration file. */\n  String getReferenceContent();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/Command.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\nimport java.util.List;\nimport java.util.Map;\n\npublic interface Command {\n  /** Returns the name of the command. It is mandatory and unique per commands set. */\n  String getName();\n\n  /** Returns preview url of the command. Optional parameter, can be null if not specified. */\n  PreviewUrl getPreviewUrl();\n\n  /**\n   * Returns the command actions. Now the only one command must be specified in list but there are\n   * plans to implement supporting multiple actions commands. It is mandatory.\n   */\n  List<? extends Action> getActions();\n\n  /**\n   * Returns the command attributes. Empty map is returned when command does not have attributes. It\n   * is optional.\n   */\n  Map<String, String> getAttributes();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/Component.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Map;\n\npublic interface Component {\n\n  /** Returns the alias of the component. Is optional and must be unique per components set. */\n  String getAlias();\n\n  /**\n   * Returns type of the component, e.g. whether it is an plugin or editor or other type. It is\n   * mandatory.\n   */\n  String getType();\n\n  /** Returns the plugin/editor FQN. Is mandatory only for cheEditor/chePlugin components types. */\n  String getId();\n\n  /**\n   * Returns the preferences of the plugin. Example value of preference: {@code java.home:\n   * /home/user/jdk11}\n   */\n  Map<String, Serializable> getPreferences();\n\n  /**\n   * For 'kubernetes' and 'openshift' components types, returns absolute or devfile-relative\n   * location of Kubernetes list yaml file.\n   *\n   * <p>For 'cheEditor' and 'chePlugin' components types, returns absolute location of plugin\n   * descriptor (typically, named meta.yaml). For those types this field is optional.\n   */\n  String getReference();\n\n  /**\n   * Returns address of custom plugin registry. It is optional and applicable only for 'cheEditor'\n   * and 'chePlugin' components types.\n   */\n  String getRegistryUrl();\n\n  /**\n   * Returns inlined content of a file specified in field 'reference'. It is optional and applicable\n   * only for 'kubernetes' and 'openshift' components types.\n   */\n  String getReferenceContent();\n\n  /**\n   * Returns selector that should be used for picking up objects from specified content, if all\n   * objects should be picked up then empty map is returned. It is optional and applicable only for\n   * 'kubernetes' and 'openshift' components types.\n   */\n  Map<String, String> getSelector();\n\n  /**\n   * Returns entrypoints that should be overridden for specified objects. If components does not\n   * have overridden entrypoints then empty map is returned. It is optional and applicable only for\n   * 'kubernetes' and 'openshift' components types.\n   */\n  List<? extends Entrypoint> getEntrypoints();\n\n  /**\n   * Returns the docker image that should be used for component. It is mandatory and applicable only\n   * for 'dockerimage' component type.\n   */\n  String getImage();\n\n  /**\n   * Returns memory limit for the component.\n   *\n   * <p>You can express memory as a plain integer or as a fixed-point integer using one of these\n   * suffixes: E, P, T, G, M, K. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi,\n   * Ki\n   */\n  String getMemoryLimit();\n\n  /**\n   * Returns memory request for the component.\n   *\n   * <p>You can express memory as a plain integer or as a fixed-point integer using one of these\n   * suffixes: E, P, T, G, M, K. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi,\n   * Ki\n   */\n  String getMemoryRequest();\n\n  /**\n   * Returns CPU limit for the component.\n   *\n   * <p>You can express CPU request as a floating-point cores or as a fixed-point integer millicores\n   * using 'm' suffix. Examples: 1.5, 1500m.\n   */\n  String getCpuLimit();\n\n  /**\n   * Returns CPU request for the component.\n   *\n   * <p>You can express CPU request as a floating-point cores or as a fixed-point integer millicores\n   * using 'm' suffix. Examples: 1.5, 1500m.\n   */\n  String getCpuRequest();\n\n  /**\n   * Returns true if projects sources should be mount to the component or false otherwise. It is\n   * optional and applicable only for 'dockerimage' component type. `CHE_PROJECTS_ROOT` environment\n   * variable should contains a path where projects sources are mount.\n   */\n  Boolean getMountSources();\n\n  /**\n   * Returns the command to run in the dockerimage component instead of the default one provided in\n   * the image. It is optional, if missing then empty list is returned and command which is defined\n   * in the image will be used. Applicable only for 'dockerimage' component type.\n   */\n  List<String> getCommand();\n\n  /**\n   * Returns the arguments to supply to the command running the dockerimage component. The arguments\n   * are supplied either to the default command provided in the image or to the overridden command.\n   * It is optional, if missing then empty list is returned and args which are defined in the image\n   * will be used. Applicable only for 'dockerimage' component type.\n   */\n  List<String> getArgs();\n\n  /**\n   * Returns volumes which should be mount to component. It is optional and applicable only for\n   * 'dockerimage' component type.\n   */\n  List<? extends Volume> getVolumes();\n\n  /**\n   * Returns the environment variables list that should be set to docker container. It is optional\n   * and applicable only for 'dockerimage' component type.\n   */\n  List<? extends Env> getEnv();\n\n  /**\n   * Returns endpoints configuration. It is optional and applicable only for 'dockerimage' component\n   * type.\n   */\n  List<? extends Endpoint> getEndpoints();\n\n  /** Indicates whether namespace secrets should be mount into containers of this component. */\n  Boolean getAutomountWorkspaceSecrets();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/Devfile.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\nimport java.util.List;\nimport java.util.Map;\n\n/** Defines Devfile. */\npublic interface Devfile {\n\n  /** Returns the name of the devfile. Shortcut for {@code getMetadata().getName()}. */\n  default String getName() {\n    return getMetadata() == null ? null : getMetadata().getName();\n  }\n\n  /** Returns Devfile API Version. It is required. */\n  String getApiVersion();\n\n  /**\n   * Returns projects configurations which are related to the devfile, when devfile doesn't contain\n   * projects returns empty list. It is optional, devfile may contain 0 or N project configurations.\n   */\n  List<? extends Project> getProjects();\n\n  /**\n   * Returns components configurations which are related to the devfile, when devfile doesn't\n   * contain components returns empty list. It is optional, devfile may contain 0 or N components.\n   */\n  List<? extends Component> getComponents();\n\n  /**\n   * Returns commands which are related to the devfile, when devfile doesn't contain commands\n   * returns empty list. It is optional, devfile may contain 0 or N commands.\n   */\n  List<? extends Command> getCommands();\n\n  /** Returns devfile attributes. Devfile attributes must not contain null keys or values. */\n  Map<String, String> getAttributes();\n\n  /** Returns the metadata of the devfile. */\n  Metadata getMetadata();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/Endpoint.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\nimport java.util.Map;\n\npublic interface Endpoint {\n\n  /** Returns the endpoint name. It is mandatory and unique per endpoints set. */\n  String getName();\n\n  /** Returns the container port that should be used for endpoint. It is mandatory. */\n  Integer getPort();\n\n  /**\n   * Returns endpoints attributes. Emtpy map is returned is endpoint does not have attributes. It is\n   * optional.\n   */\n  Map<String, String> getAttributes();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/Entrypoint.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\nimport java.util.List;\nimport java.util.Map;\n\npublic interface Entrypoint {\n  /**\n   * Returns the name of the container to apply the entrypoint to. If not specified, the entrypoint\n   * is modified on all matching containers.\n   */\n  String getContainerName();\n\n  /**\n   * Returns the name of the top level object in the referenced object list in which to search for\n   * containers. If not specified, the objects to search through can have any name.\n   */\n  String getParentName();\n\n  /**\n   * Returns the selector for matching top level objects. If not specified, the objects to search\n   * through can have any labels.\n   */\n  Map<String, String> getParentSelector();\n\n  /**\n   * The command to run in the component instead of the default one provided in the image of the\n   * container. Defaults to to empty list, meaning use whatever is defined in the image.\n   */\n  List<String> getCommand();\n\n  /**\n   * The arguments to supply to the command running the component. The arguments are supplied either\n   * to the default command provided in the image of the container or to the overridden command.\n   * Defaults to empty list, meaning use whatever is defined in the image.\n   */\n  List<String> getArgs();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/Env.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\npublic interface Env {\n  /** Returns the environment variable name. It is mandatory. */\n  String getName();\n\n  /** Returns the environment variable value. It is mandatory. */\n  String getValue();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/Metadata.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\n/** Defines the metadata of a devfile. */\npublic interface Metadata {\n\n  /**\n   * @return the name of the devfile\n   */\n  String getName();\n\n  /** 'generateName' is used as a base string for generated name, when 'name' is not defined. */\n  String getGenerateName();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/PreviewUrl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\n/**\n * Preview url is optional parameter of {@link Command}. It is used to construct proper\n * service+ingress/route and to compose valid path to the application. Typical use-case for\n * applications that doesn't have UI on root path. Preview url also partially replaces endpoint,\n * that is not needed to expose the application.\n */\npublic interface PreviewUrl {\n\n  /**\n   * {@code port} specifies where application, that is executed by command, listens. It is used to\n   * create service+ingress/route pair to make application accessible.\n   *\n   * @return applications's listen port\n   */\n  int getPort();\n\n  /**\n   * Specifies path and/or query parameters that should be opened after command execution.\n   *\n   * @return path and/or query params to open or {@code null} when not defined\n   */\n  String getPath();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/Project.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\npublic interface Project {\n  /** Returns projects name. It is mandatory and unique per projects set. */\n  String getName();\n\n  /** Returns source where project should be cloned from. It is mandatory. */\n  Source getSource();\n\n  /**\n   * Returns the path relative to the root of the projects to which this project should be cloned\n   * into. This is a unix-style relative path (i.e. uses forward slashes). The path is invalid if it\n   * is absolute or tries to escape the project root through the usage of '..'. If not specified,\n   * defaults to the project name.\n   */\n  String getClonePath();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/Source.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\npublic interface Source {\n  /** Returns type of source. It is mandatory. */\n  String getType();\n\n  /** Returns project's source location address. It is mandatory. */\n  String getLocation();\n\n  /**\n   * The name of the of the branch to check out after obtaining the source from the location. The\n   * branch has to already exist in the source otherwise the default branch is used. In case of git,\n   * this is also the name of the remote branch to push to.\n   */\n  String getBranch();\n\n  /** The tag or commit id to reset the checked out branch to. */\n  String getStartPoint();\n\n  /**\n   * The name of the tag to reset the checked out branch to. Note that this is equivalent to\n   * 'startPoint' and provided for convenience.\n   */\n  String getTag();\n\n  /**\n   * The id of the commit to reset the checked out branch to. Note that this is equivalent to\n   * 'startPoint' and provided for convenience.\n   */\n  String getCommitId();\n\n  /**\n   * The directory which is kept by sparse checkout. If this parameter is not null then the only\n   * given directory will be present after clone.\n   */\n  String getSparseCheckoutDir();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/UserDevfile.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\n/** Devfile that is persisted in permanent storage. */\npublic interface UserDevfile {\n  /** Returns the identifier of this persisted devfile instance. It is mandatory and unique. */\n  String getId();\n\n  /** Returns the name of devfile. It is mandatory. */\n  String getName();\n\n  /**\n   * Returns the namespace also known as the account name. This name can be the name of the\n   * organization or the name of the user to which this devfile belong to. Namespace and name\n   * uniquely identify devfile.\n   */\n  String getNamespace();\n\n  /** Returns description of devfile */\n  String getDescription();\n\n  /** Returns devfile content */\n  Devfile getDevfile();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/devfile/Volume.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.devfile;\n\npublic interface Volume {\n  /**\n   * Returns the volume name. If several components mount the same volume then they will reuse the\n   * volume and will be able to access to the same files. It is mandatory.\n   */\n  String getName();\n\n  /** Returns the path where volume should be mount to container. It is mandatory. */\n  String getContainerPath();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/runtime/BootstrapperStatus.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.runtime;\n\n/**\n * Describes possible bootstrapper statuses.\n *\n * @author Max Shaposhnik (mshaposh@redhat.com)\n */\npublic enum BootstrapperStatus {\n\n  /** Bootstrapping is in progress. */\n  STARTING,\n\n  /** Bootstrapping done, everything is started ok. */\n  DONE,\n\n  /** Bootstrapping failed (when any installer fails or any error occurs). */\n  FAILED\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/runtime/Machine.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.runtime;\n\nimport java.util.Map;\n\n/**\n * Runtime information about machine.\n *\n * @author Alexander Garagatyi\n */\npublic interface Machine {\n\n  /** Returns machine specific attributes. */\n  Map<String, String> getAttributes();\n\n  /**\n   * Returns mapping of exposed ports to {@link Server}.\n   *\n   * <p>Key is a symbolic server name <br>\n   * Example:\n   *\n   * <pre>\n   * {\n   *     server1 : {\n   *         \"url\" : \"http://server-with-machines.com:8080\"\n   *     }\n   * }\n   * </pre>\n   */\n  Map<String, ? extends Server> getServers();\n\n  MachineStatus getStatus();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/runtime/MachineStatus.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.runtime;\n\n/**\n * Status of Machine\n *\n * @author gazarenkov\n */\npublic enum MachineStatus {\n\n  /** Machine is starting */\n  STARTING,\n  /** Machine is up and running */\n  RUNNING,\n\n  /** Machine is not running */\n  STOPPED,\n\n  /** Machine failed */\n  FAILED\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/runtime/RuntimeIdentity.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.runtime;\n\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Holds meta information about where workspace is run, and to whom it belongs to (workspace and\n * user info).\n *\n * @author gazarenkov\n */\npublic interface RuntimeIdentity {\n\n  /** The id of workspace to which the runtime belongs to. Must not be null. */\n  String getWorkspaceId();\n\n  /**\n   * The workspace environment name that was used to start runtime. May be null if workspace does\n   * not contain stored environment configuration (it may be generated on fly).\n   */\n  @Nullable\n  String getEnvName();\n\n  /** The id of user who initialized workspace start. Must not be null. */\n  String getOwnerId();\n\n  /** Returns infrastructure namespace where runtime is run. Must not be null. */\n  String getInfrastructureNamespace();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/runtime/Server.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.runtime;\n\nimport java.util.Map;\n\n/**\n * Server Runtime exposed by URL\n *\n * @author gazarenkov\n */\npublic interface Server {\n\n  /**\n   * @return URL exposing the server\n   */\n  String getUrl();\n\n  /**\n   * @return the status\n   */\n  ServerStatus getStatus();\n\n  /**\n   * Returns attributes of the server with some metadata. You can use static methods on {@link\n   * org.eclipse.che.api.core.model.workspace.config.ServerConfig} to evaluate attributes in this\n   * map easily.\n   */\n  Map<String, String> getAttributes();\n}\n"
  },
  {
    "path": "core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/runtime/ServerStatus.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.core.model.workspace.runtime;\n\n/**\n * Status of Server\n *\n * @author gazarenkov\n */\npublic enum ServerStatus {\n  /** Server is up and running */\n  RUNNING,\n\n  /** Server is not sunning */\n  STOPPED,\n\n  /** unknown */\n  UNKNOWN\n}\n"
  },
  {
    "path": "core/che-core-logback/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-logback</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: Commons :: Logback</name>\n    <dependencies>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "core/che-core-logback/src/main/java/org/eclipse/che/commons/logback/EnvironmentVariablesLogLevelPropagator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.logback;\n\nimport ch.qos.logback.classic.Level;\nimport ch.qos.logback.classic.Logger;\nimport ch.qos.logback.classic.LoggerContext;\nimport ch.qos.logback.classic.spi.LoggerContextListener;\nimport ch.qos.logback.core.spi.ContextAwareBase;\nimport ch.qos.logback.core.spi.LifeCycle;\nimport java.util.Arrays;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Class searches environment variable CHE_LOGGER_CONFIG Value of this variable is expected in such\n * format:\n *\n * <p>CHE_LOGGER_CONFIG=logger1_name=logger1_level,logger2_name=logger2_level\n *\n * <p>In case if some logger name or logger level are omitted this pair will be silently ignored.\n */\npublic class EnvironmentVariablesLogLevelPropagator extends ContextAwareBase\n    implements LoggerContextListener, LifeCycle {\n  private static final org.slf4j.Logger LOG =\n      LoggerFactory.getLogger(EnvironmentVariablesLogLevelPropagator.class);\n\n  private boolean isStarted;\n\n  @Override\n  public void start() {\n    String config = System.getenv(\"CHE_LOGGER_CONFIG\");\n    if (config != null && !config.isEmpty()) {\n      Arrays.stream(config.split(\",\")).map(String::trim).forEach(this::setLoggerLevel);\n      LOG.info(\"The following Che Logger Config is applied: {}\", config);\n    }\n    isStarted = true;\n  }\n\n  private void setLoggerLevel(String loggerConfig) {\n    String[] parts = loggerConfig.split(\"=\", 2);\n\n    if (parts.length < 2) {\n      return;\n    }\n    String loggerName = parts[0];\n    String levelStr = parts[1];\n\n    if (levelStr.isEmpty() || loggerName.isEmpty()) {\n      return;\n    }\n\n    loggerName = loggerName.trim();\n    levelStr = levelStr.trim();\n\n    LoggerContext lc = (LoggerContext) context;\n\n    Logger logger = lc.getLogger(loggerName);\n    if (\"null\".equalsIgnoreCase(levelStr)) {\n      logger.setLevel(null);\n    } else {\n      Level level = Level.toLevel(levelStr, null);\n      if (level != null) {\n        logger.setLevel(level);\n      }\n    }\n  }\n\n  @Override\n  public void stop() {\n    isStarted = false;\n  }\n\n  @Override\n  public boolean isStarted() {\n    return isStarted;\n  }\n\n  @Override\n  public boolean isResetResistant() {\n    return false;\n  }\n\n  @Override\n  public void onStart(LoggerContext context) {}\n\n  @Override\n  public void onReset(LoggerContext context) {}\n\n  @Override\n  public void onStop(LoggerContext context) {}\n\n  @Override\n  public void onLevelChange(Logger logger, Level level) {}\n}\n"
  },
  {
    "path": "core/che-core-logback/src/main/java/org/eclipse/che/commons/logback/filter/IdentityIdLoggerFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.logback.filter;\n\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport java.io.IOException;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.slf4j.MDC;\n\n/**\n * A servlet filter that retrieves the identity_id from the servlet context and put it in the MDC\n * context. Logback can be configured to display this value in each log message when available. MDC\n * property name is `identity_id`.\n */\n@Singleton\npublic class IdentityIdLoggerFilter implements Filter {\n\n  private static final String IDENTITY_ID_MDC_KEY = \"identity_id\";\n\n  @Override\n  public void init(FilterConfig filterConfig) throws ServletException {}\n\n  @Override\n  public final void doFilter(\n      ServletRequest request, ServletResponse response, FilterChain filterChain)\n      throws IOException, ServletException {\n    Subject subject = EnvironmentContext.getCurrent().getSubject();\n    if (subject != null && subject.getUserId() != null) {\n      MDC.put(IDENTITY_ID_MDC_KEY, subject.getUserId());\n    }\n\n    try {\n      filterChain.doFilter(request, response);\n    } finally {\n      MDC.remove(IDENTITY_ID_MDC_KEY);\n    }\n  }\n\n  @Override\n  public void destroy() {}\n}\n"
  },
  {
    "path": "core/che-core-logback/src/main/java/org/eclipse/che/commons/logback/filter/RequestIdLoggerFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.logback.filter;\n\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.io.IOException;\nimport javax.inject.Singleton;\nimport org.slf4j.MDC;\n\n/**\n * A servlet filter that retrieves the X-Request-Id header from the http request and put it in the\n * MDC context. Logback can be configured to display this value in each log message when available.\n * MDC property name is `req_id`.\n */\n@Singleton\npublic class RequestIdLoggerFilter implements Filter {\n\n  private static final String REQUEST_ID_HEADER = \"X-Request-Id\";\n  private static final String REQUEST_ID_MDC_KEY = \"req_id\";\n\n  @Override\n  public void init(FilterConfig filterConfig) throws ServletException {}\n\n  @Override\n  public final void doFilter(\n      ServletRequest request, ServletResponse response, FilterChain filterChain)\n      throws IOException, ServletException {\n    final HttpServletRequest httpRequest = (HttpServletRequest) request;\n    String requestId = httpRequest.getHeader(REQUEST_ID_HEADER);\n    if (requestId != null) {\n      MDC.put(REQUEST_ID_MDC_KEY, requestId);\n    }\n\n    try {\n      filterChain.doFilter(request, response);\n    } finally {\n      MDC.remove(REQUEST_ID_MDC_KEY);\n    }\n  }\n\n  @Override\n  public void destroy() {}\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-metrics-core</artifactId>\n    <name>Che Core :: Commons :: Metrics :: Core</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.github.mweirauch</groupId>\n            <artifactId>micrometer-jvm-extras</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.micrometer</groupId>\n            <artifactId>micrometer-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.micrometer</groupId>\n            <artifactId>micrometer-registry-prometheus</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.prometheus</groupId>\n            <artifactId>simpleclient</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.prometheus</groupId>\n            <artifactId>simpleclient_httpserver</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.annotation</groupId>\n            <artifactId>jakarta.annotation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-guice-servlet</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.tomcat</groupId>\n            <artifactId>tomcat-catalina</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-dependency-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>analyze</id>\n                        <configuration>\n                            <ignoredUsedUndeclaredDependencies>\n                                <ignoredUsedUndeclaredDependency>org.apache.tomcat:tomcat-annotations-api</ignoredUsedUndeclaredDependency>\n                            </ignoredUsedUndeclaredDependencies>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "core/che-core-metrics-core/src/main/java/org/eclipse/che/core/metrics/ApiResponseCounter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.metrics;\n\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport javax.inject.Singleton;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Metric binding for Che API responses, that are grouped by http status codes.\n *\n * @author Mykhailo Kuznietsov\n */\n@Singleton\npublic class ApiResponseCounter implements MeterBinder {\n  private static final Logger LOG = LoggerFactory.getLogger(ApiResponseCounter.class);\n\n  // package private access for visibility in tests\n  Counter informationalResponseCounter;\n  Counter successResponseCounter;\n  Counter redirectResponseCounter;\n  Counter clientErrorResponseCounter;\n  Counter serverErrorResponseCounter;\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n    informationalResponseCounter =\n        Counter.builder(\"che.server.api.response\")\n            .description(\"Che Server Tomcat informational responses (1xx responses)\")\n            .tag(\"code\", \"1xx\")\n            .tag(\"area\", \"http\")\n            .register(registry);\n    successResponseCounter =\n        Counter.builder(\"che.server.api.response\")\n            .description(\"Che Server Tomcat success responses (2xx responses)\")\n            .tag(\"code\", \"2xx\")\n            .tag(\"area\", \"http\")\n            .register(registry);\n    redirectResponseCounter =\n        Counter.builder(\"che.server.api.response\")\n            .description(\"Che Server Tomcat redirect responses (3xx responses)\")\n            .tag(\"code\", \"3xx\")\n            .tag(\"area\", \"http\")\n            .register(registry);\n    clientErrorResponseCounter =\n        Counter.builder(\"che.server.api.response\")\n            .description(\"Che Server Tomcat client errors (4xx responses)\")\n            .tag(\"code\", \"4xx\")\n            .tag(\"area\", \"http\")\n            .register(registry);\n    serverErrorResponseCounter =\n        Counter.builder(\"che.server.api.response\")\n            .description(\"Che Server Tomcat server errors (5xx responses)\")\n            .tag(\"code\", \"5xx\")\n            .tag(\"area\", \"http\")\n            .register(registry);\n  }\n\n  public void handleStatus(int status) {\n    status = status / 100;\n    switch (status) {\n      case 1:\n        informationalResponseCounter.increment();\n        break;\n      case 2:\n        successResponseCounter.increment();\n        break;\n      case 3:\n        redirectResponseCounter.increment();\n        break;\n      case 4:\n        clientErrorResponseCounter.increment();\n        break;\n      case 5:\n        serverErrorResponseCounter.increment();\n        break;\n      default:\n        // should not happen\n        LOG.warn(\"Unhandled HTTP status \", status);\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/src/main/java/org/eclipse/che/core/metrics/ApiResponseMetricFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.metrics;\n\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\n\n/**\n * Filter for tracking all HTTP requests through {@link ApiResponseCounter}\n *\n * @author Mykhailo Kuznietsov\n */\n@Singleton\npublic class ApiResponseMetricFilter implements Filter {\n\n  private ApiResponseCounter apiResponseCounter;\n\n  @Inject\n  public void setApiResponseCounter(ApiResponseCounter counter) {\n    this.apiResponseCounter = counter;\n  }\n\n  @Override\n  public void init(FilterConfig filterConfig) throws ServletException {}\n\n  @Override\n  public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)\n      throws IOException, ServletException {\n    filterChain.doFilter(request, response);\n    if (response instanceof HttpServletResponse) {\n      apiResponseCounter.handleStatus(((HttpServletResponse) response).getStatus());\n    }\n  }\n\n  @Override\n  public void destroy() {}\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/src/main/java/org/eclipse/che/core/metrics/FileStoresMeterBinder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.metrics;\n\nimport io.micrometer.core.instrument.Gauge;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Tag;\nimport io.micrometer.core.instrument.Tags;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport java.io.IOException;\nimport java.nio.file.FileStore;\nimport java.nio.file.FileSystems;\nimport java.util.function.ToDoubleFunction;\nimport javax.inject.Singleton;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Bind disk usage metrics for for every {@link java.nio.file.FileStore}. */\n@Singleton\npublic class FileStoresMeterBinder implements MeterBinder {\n\n  private static final Logger LOG = LoggerFactory.getLogger(FileStoresMeterBinder.class);\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n    for (FileStore fileStore : FileSystems.getDefault().getFileStores()) {\n      LOG.debug(\n          \"Add gauge metric for {}, isReadOnly {}, type {}\",\n          fileStore.name(),\n          fileStore.isReadOnly(),\n          fileStore.type());\n      Iterable<Tag> tagsWithPath = Tags.concat(Tags.empty(), \"path\", fileStore.toString());\n\n      Gauge.builder(\"disk.free\", fileStore, exceptionToNonWrapper(FileStore::getUnallocatedSpace))\n          .tags(tagsWithPath)\n          .description(\"Unallocated space for file storage\")\n          .baseUnit(\"bytes\")\n          .strongReference(true)\n          .register(registry);\n      Gauge.builder(\"disk.total\", fileStore, exceptionToNonWrapper(FileStore::getTotalSpace))\n          .tags(tagsWithPath)\n          .description(\"Total space for file storage\")\n          .baseUnit(\"bytes\")\n          .strongReference(true)\n          .register(registry);\n      Gauge.builder(\"disk.usable\", fileStore, exceptionToNonWrapper(FileStore::getUsableSpace))\n          .tags(tagsWithPath)\n          .description(\"Usable space for file storage\")\n          .baseUnit(\"bytes\")\n          .strongReference(true)\n          .register(registry);\n    }\n  }\n\n  static <T> ToDoubleFunction<T> exceptionToNonWrapper(\n      ThrowingToDoubleFunction<T> throwingConsumer) {\n\n    return i -> {\n      try {\n        return throwingConsumer.applyAsDouble(i);\n      } catch (Exception ex) {\n        return Double.NaN;\n      }\n    };\n  }\n\n  @FunctionalInterface\n  interface ThrowingToDoubleFunction<T> {\n    double applyAsDouble(T t) throws IOException;\n  }\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/src/main/java/org/eclipse/che/core/metrics/MetricsBinder.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.metrics;\n\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport io.micrometer.prometheus.PrometheusMeterRegistry;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\n\n/**\n * Takes all {@link io.micrometer.core.instrument.binder.MeterBinder} from guice container, binded\n * with {@link com.google.inject.multibindings.Multibinder}, and bind them to {@link\n * io.micrometer.prometheus.PrometheusMeterRegistry} on PostConstruct.\n */\n@Singleton\npublic class MetricsBinder {\n\n  @Inject\n  public void bindToRegistry(\n      PrometheusMeterRegistry meterRegistry, Set<MeterBinder> meterBinderList) {\n    meterBinderList.forEach(e -> e.bindTo(meterRegistry));\n  }\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/src/main/java/org/eclipse/che/core/metrics/MetricsModule.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.metrics;\n\nimport com.google.common.annotations.Beta;\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\nimport io.github.mweirauch.micrometer.jvm.extras.ProcessMemoryMetrics;\nimport io.github.mweirauch.micrometer.jvm.extras.ProcessThreadMetrics;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics;\nimport io.micrometer.core.instrument.binder.jvm.JvmGcMetrics;\nimport io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;\nimport io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;\nimport io.micrometer.core.instrument.binder.logging.LogbackMetrics;\nimport io.micrometer.core.instrument.binder.system.FileDescriptorMetrics;\nimport io.micrometer.core.instrument.binder.system.ProcessorMetrics;\nimport io.micrometer.core.instrument.binder.system.UptimeMetrics;\nimport io.micrometer.prometheus.PrometheusMeterRegistry;\nimport io.prometheus.client.CollectorRegistry;\n\n@Beta\npublic class MetricsModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    bind(MetricsServer.class).asEagerSingleton();\n    bind(MetricsBinder.class).asEagerSingleton();\n    bind(CollectorRegistry.class).toInstance(CollectorRegistry.defaultRegistry);\n    bind(PrometheusMeterRegistry.class)\n        .toProvider(PrometheusMeterRegistryProvider.class)\n        .asEagerSingleton();\n    bind(MeterRegistry.class).to(PrometheusMeterRegistry.class);\n\n    Multibinder<MeterBinder> meterMultibinder =\n        Multibinder.newSetBinder(binder(), MeterBinder.class);\n    meterMultibinder.addBinding().to(ClassLoaderMetrics.class);\n    meterMultibinder.addBinding().to(JvmMemoryMetrics.class);\n    meterMultibinder.addBinding().to(JvmGcMetrics.class);\n    meterMultibinder.addBinding().to(JvmThreadMetrics.class);\n    meterMultibinder.addBinding().to(LogbackMetrics.class);\n    meterMultibinder.addBinding().to(FileDescriptorMetrics.class);\n    meterMultibinder.addBinding().to(ProcessorMetrics.class);\n    meterMultibinder.addBinding().to(UptimeMetrics.class);\n    meterMultibinder.addBinding().to(FileStoresMeterBinder.class);\n    meterMultibinder.addBinding().to(ApiResponseCounter.class);\n    meterMultibinder.addBinding().to(ProcessMemoryMetrics.class);\n    meterMultibinder.addBinding().to(ProcessThreadMetrics.class);\n  }\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/src/main/java/org/eclipse/che/core/metrics/MetricsServer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.metrics;\n\nimport io.prometheus.client.CollectorRegistry;\nimport io.prometheus.client.exporter.HTTPServer;\nimport jakarta.annotation.PostConstruct;\nimport jakarta.annotation.PreDestroy;\nimport java.io.IOException;\nimport java.net.InetSocketAddress;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Bind on 8087 port http endpoint with prometheus metrics. */\n@Singleton\npublic class MetricsServer {\n\n  private static final Logger LOG = LoggerFactory.getLogger(MetricsServer.class);\n\n  private HTTPServer server;\n  private final CollectorRegistry collectorRegistry;\n  private final Integer metricsPort;\n\n  @Inject\n  public MetricsServer(\n      CollectorRegistry collectorRegistry, @Named(\"che.metrics.port\") Integer metricsPort) {\n    this.collectorRegistry = collectorRegistry;\n    this.metricsPort = metricsPort;\n  }\n\n  @PostConstruct\n  public void startServer() throws IOException {\n    this.server = new HTTPServer(new InetSocketAddress(metricsPort), collectorRegistry, true);\n    LOG.info(\"Metrics server started at port {} successfully \", metricsPort);\n  }\n\n  @PreDestroy\n  public void stopServer() {\n    if (server != null) {\n      server.stop();\n      LOG.info(\"Metrics server suspended at port {} successfully \", metricsPort);\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/src/main/java/org/eclipse/che/core/metrics/MetricsServletModule.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.metrics;\n\nimport com.google.inject.multibindings.Multibinder;\nimport com.google.inject.servlet.ServletModule;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport jakarta.servlet.ServletContext;\nimport java.lang.reflect.Field;\nimport org.apache.catalina.Manager;\nimport org.apache.catalina.core.ApplicationContext;\nimport org.apache.catalina.core.ApplicationContextFacade;\nimport org.apache.catalina.core.StandardContext;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * ServletModule is made to bind {@link org.eclipse.che.core.metrics.TomcatMetricsProvider} in guice\n * container.\n */\npublic class MetricsServletModule extends ServletModule {\n  private static final Logger LOG = LoggerFactory.getLogger(TomcatMetricsProvider.class);\n\n  @Override\n  protected void configureServlets() {\n    Multibinder<MeterBinder> meterMultibinder =\n        Multibinder.newSetBinder(binder(), MeterBinder.class);\n    meterMultibinder.addBinding().toProvider(TomcatMetricsProvider.class);\n\n    bind(Manager.class).toInstance(getManager(getServletContext()));\n    filter(\"/*\").through(ApiResponseMetricFilter.class);\n  }\n\n  private Manager getManager(ServletContext servletContext) {\n\n    try {\n\n      ApplicationContextFacade acf = (ApplicationContextFacade) servletContext;\n      Field applicationContextFacadeField =\n          ApplicationContextFacade.class.getDeclaredField(\"context\");\n      applicationContextFacadeField.setAccessible(true);\n      ApplicationContext appContext = (ApplicationContext) applicationContextFacadeField.get(acf);\n\n      Field applicationContextField = ApplicationContext.class.getDeclaredField(\"context\");\n      applicationContextField.setAccessible(true);\n      StandardContext stdContext = (StandardContext) applicationContextField.get(appContext);\n      return stdContext.getManager();\n\n    } catch (Exception e) {\n      // maybe not in Tomcat?\n      LOG.error(\"Unable to get Catalina Manager. Cause: {}\", e.getMessage(), e);\n      throw new RuntimeException(e.getMessage(), e);\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/src/main/java/org/eclipse/che/core/metrics/PrometheusMeterRegistryProvider.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.metrics;\n\nimport io.micrometer.core.instrument.Clock;\nimport io.micrometer.core.instrument.Metrics;\nimport io.micrometer.prometheus.PrometheusConfig;\nimport io.micrometer.prometheus.PrometheusMeterRegistry;\nimport io.prometheus.client.CollectorRegistry;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\n\n/**\n * {@link javax.inject.Provider} of {@link io.micrometer.prometheus.PrometheusMeterRegistry}\n * instances. Used constructor with PrometheusConfig#DEFAULT and Clock.SYSTEM parameters.\n */\n@Singleton\npublic class PrometheusMeterRegistryProvider implements Provider<PrometheusMeterRegistry> {\n  private final PrometheusMeterRegistry prometheusMeterRegistry;\n\n  @Inject\n  public PrometheusMeterRegistryProvider(CollectorRegistry registry) {\n    prometheusMeterRegistry =\n        new PrometheusMeterRegistry(PrometheusConfig.DEFAULT, registry, Clock.SYSTEM);\n    Metrics.addRegistry(prometheusMeterRegistry);\n  }\n\n  @Override\n  public PrometheusMeterRegistry get() {\n    return prometheusMeterRegistry;\n  }\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/src/main/java/org/eclipse/che/core/metrics/TomcatMetricsProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.metrics;\n\nimport io.micrometer.core.instrument.Tags;\nimport io.micrometer.core.instrument.binder.tomcat.TomcatMetrics;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport org.apache.catalina.Manager;\n\n/**\n * {@link javax.inject.Provider} of {@link\n * io.micrometer.core.instrument.binder.tomcat.TomcatMetrics} instance. Used constructor with empty\n * {@link io.micrometer.core.instrument.Tags}\n */\n@Singleton\npublic class TomcatMetricsProvider implements Provider<TomcatMetrics> {\n\n  private final Manager manager;\n\n  @Inject\n  public TomcatMetricsProvider(Manager manager) {\n    this.manager = manager;\n  }\n\n  @Override\n  public TomcatMetrics get() {\n    return new TomcatMetrics(manager, Tags.empty());\n  }\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/src/test/java/org/eclipse/che/core/metrics/ApiResponseCounterTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.metrics;\n\nimport static org.testng.Assert.assertEquals;\n\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\n/**\n * Test for {@link ApiResponseCounter} functionality\n *\n * @author Mykhailo Kuznietsov\n */\npublic class ApiResponseCounterTest {\n  private ApiResponseCounter apiResponseCounter;\n  private MeterRegistry registry;\n\n  @BeforeMethod\n  public void setup() {\n    registry = new SimpleMeterRegistry();\n\n    apiResponseCounter = new ApiResponseCounter();\n    apiResponseCounter.bindTo(registry);\n  }\n\n  @Test(dataProvider = \"information\")\n  public void shouldCount1xxResponses(int status) {\n    apiResponseCounter.handleStatus(status);\n\n    assertEquals(apiResponseCounter.informationalResponseCounter.count(), 1.0);\n    assertEquals(apiResponseCounter.successResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.redirectResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.clientErrorResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.serverErrorResponseCounter.count(), 0.0);\n  }\n\n  @Test(dataProvider = \"success\")\n  public void shouldCount2xxResponses(int status) {\n    apiResponseCounter.handleStatus(status);\n\n    assertEquals(apiResponseCounter.informationalResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.successResponseCounter.count(), 1.0);\n    assertEquals(apiResponseCounter.redirectResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.clientErrorResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.serverErrorResponseCounter.count(), 0.0);\n  }\n\n  @Test(dataProvider = \"redirect\")\n  public void shouldCount3xxResponses(int status) {\n    apiResponseCounter.handleStatus(status);\n\n    assertEquals(apiResponseCounter.informationalResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.successResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.redirectResponseCounter.count(), 1.0);\n    assertEquals(apiResponseCounter.clientErrorResponseCounter.count(), .0);\n    assertEquals(apiResponseCounter.serverErrorResponseCounter.count(), 0.0);\n  }\n\n  @Test(dataProvider = \"clientError\")\n  public void shouldCount4xxResponses(int status) {\n    apiResponseCounter.handleStatus(status);\n\n    assertEquals(apiResponseCounter.informationalResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.successResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.redirectResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.clientErrorResponseCounter.count(), 1.0);\n    assertEquals(apiResponseCounter.serverErrorResponseCounter.count(), 0.0);\n  }\n\n  @Test(dataProvider = \"serverError\")\n  public void shouldCount5xxResponses(int status) {\n    apiResponseCounter.handleStatus(status);\n\n    assertEquals(apiResponseCounter.informationalResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.successResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.redirectResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.clientErrorResponseCounter.count(), 0.0);\n    assertEquals(apiResponseCounter.serverErrorResponseCounter.count(), 1.0);\n  }\n\n  @DataProvider(name = \"information\")\n  public Object[][] information() {\n    return new Object[][] {{100}, {101}};\n  }\n\n  @DataProvider(name = \"success\")\n  public Object[][] success() {\n    return new Object[][] {{200}, {201}, {202}, {203}, {204}};\n  }\n\n  @DataProvider(name = \"redirect\")\n  public Object[][] redirect() {\n    return new Object[][] {{300}, {301}, {302}, {303}, {304}};\n  }\n\n  @DataProvider(name = \"clientError\")\n  public Object[][] clientError() {\n    return new Object[][] {{400}, {401}, {402}, {403}, {404}, {405}};\n  }\n\n  @DataProvider(name = \"serverError\")\n  public Object[][] serverError() {\n    return new Object[][] {{500}, {501}, {502}, {503}, {504}};\n  }\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/src/test/java/org/eclipse/che/core/metrics/ApiResponseMetricFilterTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.metrics;\n\nimport static io.restassured.RestAssured.given;\nimport static org.everrest.assured.JettyHttpServer.ADMIN_USER_NAME;\nimport static org.everrest.assured.JettyHttpServer.ADMIN_USER_PASSWORD;\nimport static org.everrest.assured.JettyHttpServer.SECURE_PATH;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\n\nimport org.everrest.assured.EverrestJetty;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Test for {@link ApiResponseMetricFilter} functionality\n *\n * @author Mykhailo Kuznietsov\n */\n@Listeners({\n  MockitoTestNGListener.class,\n  EverrestJetty.class,\n})\npublic class ApiResponseMetricFilterTest {\n\n  @Mock private ApiResponseCounter apiResponseCounter;\n\n  private ApiResponseMetricFilter filter;\n\n  @BeforeMethod\n  public void setUp() {\n    filter = new ApiResponseMetricFilter();\n    filter.setApiResponseCounter(apiResponseCounter);\n  }\n\n  @Test\n  public void shouldHandleStatusOnHttpRequest() {\n    // requesting a non existing resource, so 404 is expected\n    int status = 404;\n\n    given()\n        .auth()\n        .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n        .when()\n        .get(SECURE_PATH + \"/service\")\n        .then()\n        .statusCode(status);\n\n    verify(apiResponseCounter).handleStatus(eq(status));\n  }\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/src/test/java/org/eclipse/che/core/metrics/FileStoresMeterTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.metrics;\n\nimport static org.testng.Assert.*;\n\nimport io.micrometer.core.instrument.Gauge;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport java.util.Collection;\nimport org.testng.annotations.Test;\n\npublic class FileStoresMeterTest {\n\n  @Test\n  public void shouldBindFileStores() {\n    MeterRegistry registry = new SimpleMeterRegistry();\n\n    new FileStoresMeterBinder().bindTo(registry);\n    Collection<Gauge> df = registry.get(\"disk.free\").gauges();\n\n    assertNotNull(df);\n    assertTrue(df.size() > 0);\n    assertEquals(df.size(), registry.get(\"disk.total\").gauges().size());\n    assertEquals(df.size(), registry.get(\"disk.usable\").gauges().size());\n  }\n}\n"
  },
  {
    "path": "core/che-core-metrics-core/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "core/che-core-tracing-core/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-tracing-core</artifactId>\n    <name>Che Core :: Commons :: Tracing :: Core</name>\n    <dependencies>\n        <dependency>\n            <groupId>aopalliance</groupId>\n            <artifactId>aopalliance</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.opentracing</groupId>\n            <artifactId>opentracing-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.opentracing</groupId>\n            <artifactId>opentracing-noop</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.opentracing</groupId>\n            <artifactId>opentracing-util</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.opentracing.contrib</groupId>\n            <artifactId>opentracing-tracerresolver</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "core/che-core-tracing-core/src/main/java/org/eclipse/che/core/tracing/NopTracingModule.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.tracing;\n\nimport com.google.inject.AbstractModule;\nimport io.opentracing.Tracer;\nimport io.opentracing.noop.NoopTracerFactory;\n\n/** Guice module that is used if tracing is not enabled. */\npublic class NopTracingModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    bind(Tracer.class).toProvider(new TracerProvider(NoopTracerFactory.create()));\n  }\n}\n"
  },
  {
    "path": "core/che-core-tracing-core/src/main/java/org/eclipse/che/core/tracing/TracerProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.tracing;\n\nimport com.google.common.annotations.Beta;\nimport io.opentracing.Tracer;\nimport io.opentracing.contrib.tracerresolver.TracerResolver;\nimport io.opentracing.util.GlobalTracer;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Guice @{@link javax.inject.Provider} of @{@link io.opentracing.Tracer} objects. Register Tracer\n * in @{@link io.opentracing.util.GlobalTracer} for future use by classes that has no access to\n * container like datasources, etc.\n */\n@Beta\n@Singleton\npublic class TracerProvider implements Provider<Tracer> {\n  private static final Logger LOG = LoggerFactory.getLogger(TracerProvider.class);\n  private final Tracer tracer;\n\n  public TracerProvider() {\n    this(TracerResolver.resolveTracer());\n  }\n\n  public TracerProvider(Tracer tracer) {\n    this.tracer = tracer;\n    GlobalTracer.registerIfAbsent(tracer);\n  }\n\n  @Override\n  public Tracer get() {\n    LOG.debug(\"{} tracer is used \", tracer);\n    return tracer;\n  }\n}\n"
  },
  {
    "path": "core/che-core-tracing-core/src/main/java/org/eclipse/che/core/tracing/TracingInterceptor.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.tracing;\n\nimport com.google.common.annotations.Beta;\nimport com.google.inject.Inject;\nimport io.opentracing.Scope;\nimport io.opentracing.Span;\nimport io.opentracing.Tracer;\nimport io.opentracing.tag.Tags;\nimport java.lang.reflect.Method;\nimport java.util.Map;\nimport java.util.WeakHashMap;\nimport java.util.function.Supplier;\nimport org.aopalliance.intercept.MethodInterceptor;\nimport org.aopalliance.intercept.MethodInvocation;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * A Guice interceptor that interprets the {@link Traced @Traced} annotations on methods and creates\n * tracing spans for the annotated method calls. It also captures the {@link Traced.Tags} and adds\n * them to the created spans.\n */\n@Beta\npublic class TracingInterceptor implements MethodInterceptor {\n\n  private static final Logger LOG = LoggerFactory.getLogger(TracingInterceptor.class);\n\n  private Tracer tracer;\n  private WeakHashMap<Class<?>, WeakHashMap<Method, String>> spanNames = new WeakHashMap<>();\n\n  @Inject\n  public void init(Tracer tracer) {\n    this.tracer = tracer;\n  }\n\n  @Override\n  public Object invoke(MethodInvocation invocation) throws Throwable {\n    String spanName = getSpanName(invocation);\n\n    Span span =\n        tracer\n            .buildSpan(spanName)\n            .asChildOf(tracer.activeSpan())\n            .withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER)\n            .start();\n    try (Scope scope = tracer.scopeManager().activate(span)) {\n      Traced.TagsStack.push();\n\n      return invocation.proceed();\n    } catch (Exception e) {\n      LOG.error(e.getMessage(), e);\n      span.log(e.getMessage());\n      throw e;\n    } finally {\n      for (Map.Entry<String, Supplier<?>> e : Traced.TagsStack.pop().entrySet()) {\n        Object val;\n        try {\n          val = e.getValue().get();\n        } catch (Exception ex) {\n          if (LOG.isDebugEnabled()) {\n            LOG.debug(\n                \"Could not get the value for a tag called {} when tracing {}.\",\n                e.getKey(),\n                spanName,\n                ex);\n          }\n          continue;\n        }\n\n        if (val instanceof String) {\n          span.setTag(e.getKey(), (String) val);\n        } else if (val instanceof Boolean) {\n          span.setTag(e.getKey(), (Boolean) val);\n        } else if (val instanceof Number) {\n          span.setTag(e.getKey(), (Number) val);\n        }\n      }\n      span.finish();\n    }\n  }\n\n  private String getSpanName(MethodInvocation invocation) {\n    Class<?> objectType = invocation.getThis().getClass();\n    Method method = invocation.getMethod();\n\n    // we assume that there won't be more than 4 traced methods on a type. If there are, we're\n    // adding a little bit of runtime overhead of enlarging the hashmap's capacity, but in the usual\n    // case we're saving 12 entries in the map (16 is the default capacity).\n    String ret = spanNames.computeIfAbsent(objectType, __ -> new WeakHashMap<>(4)).get(method);\n\n    if (ret != null) {\n      return ret;\n    }\n\n    Traced annotation = method.getAnnotation(Traced.class);\n\n    if (annotation == null) {\n      throw new IllegalStateException(\n          \"Misconfigured Guice interception. Tracing interceptor called on method \"\n              + method\n              + \" that is not annotated with @Traced.\");\n    }\n\n    String name = annotation.name();\n\n    if (name.isEmpty()) {\n      name = cleanName(objectType) + \"#\" + method.getName();\n    }\n\n    spanNames.get(objectType).put(method, name);\n\n    return name;\n  }\n\n  private static String cleanName(Class<?> type) {\n    String simpleName = type.getSimpleName();\n\n    // if there is '$$' in the class name, it is most probably a marker of a Guice or Hibernate\n    // generated class... Let's just not pollute the name with generated subclass name garbage\n    int doubleDollarIdx = simpleName.indexOf(\"$$\");\n    if (doubleDollarIdx > 0) {\n      simpleName = simpleName.substring(0, doubleDollarIdx);\n    }\n\n    return simpleName;\n  }\n}\n"
  },
  {
    "path": "core/che-core-tracing-core/src/main/java/org/eclipse/che/core/tracing/TracingModule.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.tracing;\n\nimport com.google.common.annotations.Beta;\nimport com.google.inject.AbstractModule;\nimport com.google.inject.matcher.Matchers;\nimport io.opentracing.Tracer;\nimport org.eclipse.che.commons.annotation.Traced;\n\n@Beta\npublic class TracingModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    bind(Tracer.class).toProvider(TracerProvider.class);\n    TracingInterceptor traceInterceptor = new TracingInterceptor();\n    requestInjection(traceInterceptor);\n    bindInterceptor(Matchers.any(), Matchers.annotatedWith(Traced.class), traceInterceptor);\n  }\n}\n"
  },
  {
    "path": "core/che-core-tracing-metrics/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-tracing-metrics</artifactId>\n    <name>Che Core :: Commons :: Tracing :: Metrics</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.jaegertracing</groupId>\n            <artifactId>jaeger-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.jaegertracing</groupId>\n            <artifactId>jaeger-micrometer</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.opentracing</groupId>\n            <artifactId>opentracing-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.opentracing.contrib</groupId>\n            <artifactId>opentracing-metrics</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.opentracing.contrib</groupId>\n            <artifactId>opentracing-metrics-micrometer</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-tracing-core</artifactId>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "core/che-core-tracing-metrics/src/main/java/org/eclipse/che/core/tracing/metrics/MeteredTracerProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.tracing.metrics;\n\nimport io.jaegertracing.Configuration;\nimport io.jaegertracing.micrometer.MicrometerMetricsFactory;\nimport io.opentracing.Tracer;\nimport io.opentracing.contrib.metrics.Metrics;\nimport io.opentracing.contrib.metrics.MetricsReporter;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport org.eclipse.che.core.tracing.TracerProvider;\n\n/**\n * Provider of {@link Tracer}, that is integrated with metrics.\n *\n * <p>Tracer instance is created with custom metrics factory, so it would expose internal metrics to\n * prometheus server\n *\n * <p>Tracer is also wrapped in custom metrics reporter, which would report data about traced spans\n * and expose them as prometheus metrics\n */\n@Singleton\npublic class MeteredTracerProvider implements Provider<TracerProvider> {\n  private TracerProvider tracerProvider;\n\n  @Inject\n  public MeteredTracerProvider(Set<MetricsReporter> metricsReporter) {\n    MicrometerMetricsFactory internalMetricsFactory = new MicrometerMetricsFactory();\n    Configuration configuration = Configuration.fromEnv();\n    Tracer tracer =\n        configuration.getTracerBuilder().withMetricsFactory(internalMetricsFactory).build();\n\n    this.tracerProvider = new TracerProvider(Metrics.decorate(tracer, metricsReporter));\n  }\n\n  @Override\n  public TracerProvider get() {\n    return tracerProvider;\n  }\n}\n"
  },
  {
    "path": "core/che-core-tracing-metrics/src/main/java/org/eclipse/che/core/tracing/metrics/MicrometerMetricsReporterProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.tracing.metrics;\n\nimport io.opentracing.contrib.metrics.micrometer.MicrometerMetricsReporter;\nimport io.opentracing.tag.Tags;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\n\n/**\n * Provider of {@link MicrometerMetricsReporter}, which is responsible for reporting metrics of\n * traced spans to prometheus server. Here is also specified configuration as for metrics name and\n * tags.\n *\n * <p>This reporter is configured to report all spans with \"span.kind\" server, as well as provide\n * additional label \"http.status_code\", if such tag is available in the span.\n *\n * <p>When defining tags , if \"Default value\" will be null, then the spans which don't have such\n * tag, then will not be reported.\n *\n * <p>Visit https://github.com/opentracing-contrib/java-metrics to find out about how to configure\n * reporter.\n */\n@Singleton\npublic class MicrometerMetricsReporterProvider implements Provider<MicrometerMetricsReporter> {\n\n  private static final String TRACING_METRIC_NAME = \"che_server_api_tracing_span\";\n\n  private final MicrometerMetricsReporter micrometerMetricsReporter;\n\n  public MicrometerMetricsReporterProvider() {\n    micrometerMetricsReporter =\n        MicrometerMetricsReporter.newMetricsReporter()\n            .withName(TRACING_METRIC_NAME)\n            .withTagLabel(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER)\n            .withTagLabel(Tags.HTTP_STATUS.getKey(), \"undefined\")\n            .build();\n  }\n\n  @Override\n  public MicrometerMetricsReporter get() {\n    return micrometerMetricsReporter;\n  }\n}\n"
  },
  {
    "path": "core/che-core-tracing-metrics/src/main/java/org/eclipse/che/core/tracing/metrics/TracingMetricsModule.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.tracing.metrics;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\nimport io.opentracing.contrib.metrics.MetricsReporter;\nimport org.eclipse.che.core.tracing.TracerProvider;\n\npublic class TracingMetricsModule extends AbstractModule {\n  @Override\n  protected void configure() {\n\n    bind(TracerProvider.class).toProvider(MeteredTracerProvider.class);\n\n    Multibinder<MetricsReporter> metricsReporterBinder =\n        Multibinder.newSetBinder(binder(), MetricsReporter.class);\n    metricsReporterBinder.addBinding().toProvider(MicrometerMetricsReporterProvider.class);\n  }\n}\n"
  },
  {
    "path": "core/che-core-tracing-web/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-tracing-web</artifactId>\n    <name>Che Core :: Commons :: Tracing :: Web</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.opentracing</groupId>\n            <artifactId>opentracing-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.opentracing</groupId>\n            <artifactId>opentracing-util</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-guice-servlet</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>com.mycila</groupId>\n                <artifactId>license-maven-plugin</artifactId>\n                <configuration>\n                    <excludes>\n                        <exclude>**/opentracing/**</exclude>\n                    </excludes>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "core/che-core-tracing-web/src/main/java/io/opentracing/contrib/web/servlet/filter/HttpServletRequestExtractAdapter.java",
    "content": "/*\n * Copyright 2016-2018 The OpenTracing Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under the License\n * is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n * or implied. See the License for the specific language governing permissions and limitations under\n * the License.\n */\npackage io.opentracing.contrib.web.servlet.filter;\n\nimport io.opentracing.propagation.TextMap;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.AbstractMap;\nimport java.util.ArrayList;\nimport java.util.Enumeration;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * Tracer extract adapter for {@link HttpServletRequest}.\n *\n * @author Pavol Loffay\n */\npublic class HttpServletRequestExtractAdapter implements TextMap {\n\n  private Map<String, List<String>> headers;\n\n  public HttpServletRequestExtractAdapter(HttpServletRequest httpServletRequest) {\n    headers = servletHeadersToMultiMap(httpServletRequest);\n  }\n\n  @Override\n  public Iterator<Map.Entry<String, String>> iterator() {\n    return new MultivaluedMapFlatIterator<>(headers.entrySet());\n  }\n\n  @Override\n  public void put(String key, String value) {\n    throw new UnsupportedOperationException(\"This class should be used only with Tracer.inject()!\");\n  }\n\n  protected Map<String, List<String>> servletHeadersToMultiMap(\n      HttpServletRequest httpServletRequest) {\n    Map<String, List<String>> headersResult = new HashMap<>();\n\n    Enumeration<String> headerNamesIt = httpServletRequest.getHeaderNames();\n    while (headerNamesIt.hasMoreElements()) {\n      String headerName = headerNamesIt.nextElement();\n\n      Enumeration<String> valuesIt = httpServletRequest.getHeaders(headerName);\n      List<String> valuesList = new ArrayList<>(1);\n      while (valuesIt.hasMoreElements()) {\n        valuesList.add(valuesIt.nextElement());\n      }\n\n      headersResult.put(headerName, valuesList);\n    }\n\n    return headersResult;\n  }\n\n  public static final class MultivaluedMapFlatIterator<K, V> implements Iterator<Map.Entry<K, V>> {\n\n    private final Iterator<Map.Entry<K, List<V>>> mapIterator;\n    private Map.Entry<K, List<V>> mapEntry;\n    private Iterator<V> listIterator;\n\n    public MultivaluedMapFlatIterator(Set<Map.Entry<K, List<V>>> multiValuesEntrySet) {\n      this.mapIterator = multiValuesEntrySet.iterator();\n    }\n\n    @Override\n    public boolean hasNext() {\n      if (listIterator != null && listIterator.hasNext()) {\n        return true;\n      }\n\n      return mapIterator.hasNext();\n    }\n\n    @Override\n    public Map.Entry<K, V> next() {\n      if (mapEntry == null || (!listIterator.hasNext() && mapIterator.hasNext())) {\n        mapEntry = mapIterator.next();\n        listIterator = mapEntry.getValue().iterator();\n      }\n\n      if (listIterator.hasNext()) {\n        return new AbstractMap.SimpleImmutableEntry<>(mapEntry.getKey(), listIterator.next());\n      } else {\n        return new AbstractMap.SimpleImmutableEntry<>(mapEntry.getKey(), null);\n      }\n    }\n\n    @Override\n    public void remove() {\n      throw new UnsupportedOperationException();\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-tracing-web/src/main/java/io/opentracing/contrib/web/servlet/filter/ServletFilterSpanDecorator.java",
    "content": "/*\n * Copyright 2016-2018 The OpenTracing Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under the License\n * is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n * or implied. See the License for the specific language governing permissions and limitations under\n * the License.\n */\npackage io.opentracing.contrib.web.servlet.filter;\n\nimport io.opentracing.Span;\nimport io.opentracing.tag.Tags;\nimport jakarta.servlet.AsyncEvent;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.PrintWriter;\nimport java.io.StringWriter;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * SpanDecorator to decorate span at different stages in filter processing (before\n * filterChain.doFilter(), after and if exception is thrown).\n *\n * @author Pavol Loffay\n */\npublic interface ServletFilterSpanDecorator {\n\n  /**\n   * Decorate span before {@link jakarta.servlet.Filter#doFilter(ServletRequest, ServletResponse,\n   * FilterChain)} is called. This is called right after span in created. Span is already present in\n   * request attributes with name {@link TracingFilter#SERVER_SPAN_CONTEXT}.\n   *\n   * @param httpServletRequest request\n   * @param span span to decorate\n   */\n  void onRequest(HttpServletRequest httpServletRequest, Span span);\n\n  /**\n   * Decorate span after {@link jakarta.servlet.Filter#doFilter(ServletRequest, ServletResponse,\n   * FilterChain)}. When it is an async request this will be called in {@link\n   * jakarta.servlet.AsyncListener#onComplete(AsyncEvent)}.\n   *\n   * @param httpServletRequest request\n   * @param httpServletResponse response\n   * @param span span to decorate\n   */\n  void onResponse(\n      HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Span span);\n\n  /**\n   * Decorate span when an exception is thrown during processing in {@link\n   * jakarta.servlet.Filter#doFilter(ServletRequest, ServletResponse, FilterChain)}. This is also\n   * called in {@link jakarta.servlet.AsyncListener#onError(AsyncEvent)}.\n   *\n   * @param httpServletRequest request\n   * @param exception exception\n   * @param span span to decorate\n   */\n  void onError(\n      HttpServletRequest httpServletRequest,\n      HttpServletResponse httpServletResponse,\n      Throwable exception,\n      Span span);\n\n  /**\n   * Decorate span on asynchronous request timeout. It is called in {@link\n   * jakarta.servlet.AsyncListener#onTimeout(AsyncEvent)}.\n   *\n   * @param httpServletRequest request\n   * @param httpServletResponse response\n   * @param timeout timeout\n   * @param span span to decorate\n   */\n  void onTimeout(\n      HttpServletRequest httpServletRequest,\n      HttpServletResponse httpServletResponse,\n      long timeout,\n      Span span);\n\n  /**\n   * Adds standard tags to span. {@link Tags#HTTP_URL}, {@link Tags#HTTP_STATUS}, {@link\n   * Tags#HTTP_METHOD} and {@link Tags#COMPONENT}. If an exception during {@link\n   * jakarta.servlet.Filter#doFilter(ServletRequest, ServletResponse, FilterChain)} is thrown tag\n   * {@link Tags#ERROR} is added and {@link Tags#HTTP_STATUS} not because at this point it is not\n   * known.\n   */\n  ServletFilterSpanDecorator STANDARD_TAGS =\n      new ServletFilterSpanDecorator() {\n        @Override\n        public void onRequest(HttpServletRequest httpServletRequest, Span span) {\n          Tags.COMPONENT.set(span, \"java-web-servlet\");\n\n          Tags.HTTP_METHOD.set(span, httpServletRequest.getMethod());\n          // without query params\n          Tags.HTTP_URL.set(span, httpServletRequest.getRequestURL().toString());\n        }\n\n        @Override\n        public void onResponse(\n            HttpServletRequest httpServletRequest,\n            HttpServletResponse httpServletResponse,\n            Span span) {\n          Tags.HTTP_STATUS.set(span, httpServletResponse.getStatus());\n        }\n\n        @Override\n        public void onError(\n            HttpServletRequest httpServletRequest,\n            HttpServletResponse httpServletResponse,\n            Throwable exception,\n            Span span) {\n          Tags.ERROR.set(span, Boolean.TRUE);\n          span.log(logsForException(exception));\n\n          if (httpServletResponse.getStatus() == HttpServletResponse.SC_OK) {\n            // exception is thrown in filter chain, but status code is incorrect\n            Tags.HTTP_STATUS.set(span, 500);\n          }\n        }\n\n        @Override\n        public void onTimeout(\n            HttpServletRequest httpServletRequest,\n            HttpServletResponse httpServletResponse,\n            long timeout,\n            Span span) {\n          Map<String, Object> timeoutLogs = new HashMap<>(2);\n          timeoutLogs.put(\"event\", \"timeout\");\n          timeoutLogs.put(\"timeout\", timeout);\n          span.log(timeoutLogs);\n        }\n\n        private Map<String, String> logsForException(Throwable throwable) {\n          Map<String, String> errorLog = new HashMap<>(3);\n          errorLog.put(\"event\", Tags.ERROR.getKey());\n\n          String message =\n              throwable.getCause() != null\n                  ? throwable.getCause().getMessage()\n                  : throwable.getMessage();\n          if (message != null) {\n            errorLog.put(\"message\", message);\n          }\n          StringWriter sw = new StringWriter();\n          throwable.printStackTrace(new PrintWriter(sw));\n          errorLog.put(\"stack\", sw.toString());\n\n          return errorLog;\n        }\n      };\n}\n"
  },
  {
    "path": "core/che-core-tracing-web/src/main/java/io/opentracing/contrib/web/servlet/filter/TracingFilter.java",
    "content": "/*\n * Copyright 2016-2018 The OpenTracing Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under the License\n * is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n * or implied. See the License for the specific language governing permissions and limitations under\n * the License.\n */\npackage io.opentracing.contrib.web.servlet.filter;\n\nimport io.opentracing.Scope;\nimport io.opentracing.Span;\nimport io.opentracing.SpanContext;\nimport io.opentracing.Tracer;\nimport io.opentracing.propagation.Format;\nimport io.opentracing.tag.Tags;\nimport io.opentracing.util.GlobalTracer;\nimport jakarta.servlet.AsyncEvent;\nimport jakarta.servlet.AsyncListener;\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletContext;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.logging.Logger;\nimport java.util.regex.Pattern;\n\n/**\n * Tracing servlet filter.\n *\n * <p>Filter can be programmatically added to {@link ServletContext} or initialized via web.xml.\n *\n * <p>Following code examples show possible initialization:\n *\n * <pre>{@code\n * TracingFilter filter = new TracingFilter(tracer);\n *  servletContext.addFilter(\"tracingFilter\", filter);\n * }</pre>\n *\n * Or include filter in web.xml and:\n *\n * <pre>{@code\n * GlobalTracer.register(tracer);\n * servletContext.setAttribute({@link TracingFilter#SPAN_DECORATORS}, listOfDecorators); // optional, if no present ServletFilterSpanDecorator.STANDARD_TAGS is applied\n * }</pre>\n *\n * Current server span context is accessible via {@link HttpServletRequest#getAttribute(String)}\n * with name {@link TracingFilter#SERVER_SPAN_CONTEXT}.\n *\n * @author Pavol Loffay\n */\npublic class TracingFilter implements Filter {\n  private static final Logger log = Logger.getLogger(TracingFilter.class.getName());\n\n  /** Use as a key of {@link ServletContext#setAttribute(String, Object)} to set span decorators */\n  public static final String SPAN_DECORATORS = TracingFilter.class.getName() + \".spanDecorators\";\n\n  /** Use as a key of {@link ServletContext#setAttribute(String, Object)} to skip pattern */\n  public static final String SKIP_PATTERN = TracingFilter.class.getName() + \".skipPattern\";\n\n  /**\n   * Used as a key of {@link HttpServletRequest#setAttribute(String, Object)} to inject server span\n   * context\n   */\n  public static final String SERVER_SPAN_CONTEXT =\n      TracingFilter.class.getName() + \".activeSpanContext\";\n\n  private FilterConfig filterConfig;\n\n  protected Tracer tracer;\n  private List<ServletFilterSpanDecorator> spanDecorators;\n  private Pattern skipPattern;\n\n  /** Tracer instance has to be registered with {@link GlobalTracer#register(Tracer)}. */\n  public TracingFilter() {\n    this(GlobalTracer.get());\n  }\n\n  /**\n   * @param tracer\n   */\n  public TracingFilter(Tracer tracer) {\n    this(tracer, Collections.singletonList(ServletFilterSpanDecorator.STANDARD_TAGS), null);\n  }\n\n  /**\n   * @param tracer tracer\n   * @param spanDecorators decorators\n   * @param skipPattern null or pattern to exclude certain paths from tracing e.g. \"/health\"\n   */\n  public TracingFilter(\n      Tracer tracer, List<ServletFilterSpanDecorator> spanDecorators, Pattern skipPattern) {\n    this.tracer = tracer;\n    this.spanDecorators = new ArrayList<>(spanDecorators);\n    this.spanDecorators.removeAll(Collections.singleton(null));\n    this.skipPattern = skipPattern;\n  }\n\n  @Override\n  public void init(FilterConfig filterConfig) throws ServletException {\n    this.filterConfig = filterConfig;\n    ServletContext servletContext = filterConfig.getServletContext();\n\n    // Check whether the servlet context provides a tracer\n    Object tracerObj = servletContext.getAttribute(Tracer.class.getName());\n    if (tracerObj instanceof Tracer) {\n      tracer = (Tracer) tracerObj;\n    } else {\n      // Add current tracer to servlet context, so available to webapp\n      servletContext.setAttribute(Tracer.class.getName(), tracer);\n    }\n\n    // use decorators from context attributes\n    Object contextAttribute = servletContext.getAttribute(SPAN_DECORATORS);\n    if (contextAttribute instanceof Collection) {\n      List<ServletFilterSpanDecorator> decorators = new ArrayList<>();\n      for (Object decorator : (Collection) contextAttribute) {\n        if (decorator instanceof ServletFilterSpanDecorator) {\n          decorators.add((ServletFilterSpanDecorator) decorator);\n        } else {\n          log.severe(decorator + \" is not an instance of \" + ServletFilterSpanDecorator.class);\n        }\n      }\n      this.spanDecorators = decorators.size() > 0 ? decorators : this.spanDecorators;\n    }\n\n    contextAttribute = servletContext.getAttribute(SKIP_PATTERN);\n    if (contextAttribute instanceof Pattern) {\n      skipPattern = (Pattern) contextAttribute;\n    }\n  }\n\n  @Override\n  public void doFilter(\n      ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)\n      throws IOException, ServletException {\n\n    HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;\n    HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;\n\n    if (!isTraced(httpRequest, httpResponse)) {\n      chain.doFilter(httpRequest, httpResponse);\n      return;\n    }\n\n    /** If request is traced then do not start new span. */\n    if (servletRequest.getAttribute(SERVER_SPAN_CONTEXT) != null) {\n      chain.doFilter(servletRequest, servletResponse);\n    } else {\n      SpanContext extractedContext =\n          tracer.extract(\n              Format.Builtin.HTTP_HEADERS, new HttpServletRequestExtractAdapter(httpRequest));\n\n      final Span span =\n          tracer\n              .buildSpan(httpRequest.getMethod())\n              .asChildOf(extractedContext)\n              .withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER)\n              .start();\n\n      httpRequest.setAttribute(SERVER_SPAN_CONTEXT, span.context());\n\n      for (ServletFilterSpanDecorator spanDecorator : spanDecorators) {\n        spanDecorator.onRequest(httpRequest, span);\n      }\n\n      try (Scope scope = tracer.activateSpan(span)) {\n        chain.doFilter(servletRequest, servletResponse);\n        if (!httpRequest.isAsyncStarted()) {\n          for (ServletFilterSpanDecorator spanDecorator : spanDecorators) {\n            spanDecorator.onResponse(httpRequest, httpResponse, span);\n          }\n        }\n        // catch all exceptions (e.g. RuntimeException, ServletException...)\n      } catch (Throwable ex) {\n        for (ServletFilterSpanDecorator spanDecorator : spanDecorators) {\n          spanDecorator.onError(httpRequest, httpResponse, ex, span);\n        }\n        throw ex;\n      } finally {\n        if (httpRequest.isAsyncStarted()) {\n          // what if async is already finished? This would not be called\n          httpRequest\n              .getAsyncContext()\n              .addListener(\n                  new AsyncListener() {\n                    @Override\n                    public void onComplete(AsyncEvent event) throws IOException {\n                      HttpServletRequest httpRequest =\n                          (HttpServletRequest) event.getSuppliedRequest();\n                      HttpServletResponse httpResponse =\n                          (HttpServletResponse) event.getSuppliedResponse();\n                      for (ServletFilterSpanDecorator spanDecorator : spanDecorators) {\n                        spanDecorator.onResponse(httpRequest, httpResponse, span);\n                      }\n                      span.finish();\n                    }\n\n                    @Override\n                    public void onTimeout(AsyncEvent event) throws IOException {\n                      HttpServletRequest httpRequest =\n                          (HttpServletRequest) event.getSuppliedRequest();\n                      HttpServletResponse httpResponse =\n                          (HttpServletResponse) event.getSuppliedResponse();\n                      for (ServletFilterSpanDecorator spanDecorator : spanDecorators) {\n                        spanDecorator.onTimeout(\n                            httpRequest, httpResponse, event.getAsyncContext().getTimeout(), span);\n                      }\n                    }\n\n                    @Override\n                    public void onError(AsyncEvent event) throws IOException {\n                      HttpServletRequest httpRequest =\n                          (HttpServletRequest) event.getSuppliedRequest();\n                      HttpServletResponse httpResponse =\n                          (HttpServletResponse) event.getSuppliedResponse();\n                      for (ServletFilterSpanDecorator spanDecorator : spanDecorators) {\n                        spanDecorator.onError(\n                            httpRequest, httpResponse, event.getThrowable(), span);\n                      }\n                    }\n\n                    @Override\n                    public void onStartAsync(AsyncEvent event) throws IOException {}\n                  });\n        } else {\n          // If not async, then need to explicitly finish the span associated with the scope.\n          // This is necessary, as we don't know whether this request is being handled\n          // asynchronously until after the scope has already been started.\n          span.finish();\n        }\n      }\n    }\n  }\n\n  @Override\n  public void destroy() {\n    this.filterConfig = null;\n  }\n\n  /**\n   * It checks whether a request should be traced or not.\n   *\n   * @param httpServletRequest request\n   * @param httpServletResponse response\n   * @return whether request should be traced or not\n   */\n  protected boolean isTraced(\n      HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {\n    // skip URLs matching skip pattern\n    // e.g. pattern is defined as '/health|/status' then URL 'http://localhost:5000/context/health'\n    // won't be traced\n    if (skipPattern != null) {\n      int contextLength =\n          httpServletRequest.getContextPath() == null\n              ? 0\n              : httpServletRequest.getContextPath().length();\n      String url = httpServletRequest.getRequestURI().substring(contextLength);\n      return !skipPattern.matcher(url).matches();\n    }\n\n    return true;\n  }\n\n  /**\n   * Get context of server span.\n   *\n   * @param servletRequest request\n   * @return server span context\n   */\n  public static SpanContext serverSpanContext(ServletRequest servletRequest) {\n    return (SpanContext) servletRequest.getAttribute(SERVER_SPAN_CONTEXT);\n  }\n}\n"
  },
  {
    "path": "core/che-core-tracing-web/src/main/java/io/opentracing/contrib/web/servlet/filter/decorator/ServletFilterHeaderSpanDecorator.java",
    "content": "package io.opentracing.contrib.web.servlet.filter.decorator;\n\nimport io.opentracing.Span;\nimport io.opentracing.contrib.web.servlet.filter.ServletFilterSpanDecorator;\nimport io.opentracing.tag.StringTag;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * ServletFilterHeaderSpanDecorator will decorate the span based on incoming HTTP headers. Incoming\n * are compared to the list of {@link #allowedHeaders}, if the header is part of the provided list,\n * they will be added as {@link StringTag}. The tag format will be a concatenation of {@link\n * #prefix} and {@link HeaderEntry#tag}\n */\npublic class ServletFilterHeaderSpanDecorator implements ServletFilterSpanDecorator {\n\n  private final String prefix;\n  private final List<HeaderEntry> allowedHeaders;\n\n  /**\n   * Constructor of ServletFilterHeaderSpanDecorator with a default prefix of \"http.header.\"\n   *\n   * @param allowedHeaders list of {@link HeaderEntry} to extract from the incoming request\n   */\n  public ServletFilterHeaderSpanDecorator(List<HeaderEntry> allowedHeaders) {\n    this(allowedHeaders, \"http.header.\");\n  }\n\n  /**\n   * Constructor of ServletFilterHeaderSpanDecorator\n   *\n   * @param allowedHeaders list of {@link HeaderEntry} to extract from the incoming request\n   * @param prefix the prefix to prepend on each @{@link StringTag}. Can be null is not prefix is\n   *     desired\n   */\n  public ServletFilterHeaderSpanDecorator(List<HeaderEntry> allowedHeaders, String prefix) {\n    this.allowedHeaders = new ArrayList<>(allowedHeaders);\n    this.prefix = (prefix != null && !prefix.isEmpty()) ? prefix : null;\n  }\n\n  @Override\n  public void onRequest(HttpServletRequest httpServletRequest, Span span) {\n    for (HeaderEntry headerEntry : allowedHeaders) {\n      String headerValue = httpServletRequest.getHeader(headerEntry.getHeader());\n      if (headerValue != null && !headerValue.isEmpty()) {\n        buildTag(headerEntry.getTag()).set(span, headerValue);\n      }\n    }\n  }\n\n  @Override\n  public void onResponse(\n      HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Span span) {}\n\n  @Override\n  public void onError(\n      HttpServletRequest httpServletRequest,\n      HttpServletResponse httpServletResponse,\n      Throwable exception,\n      Span span) {}\n\n  @Override\n  public void onTimeout(\n      HttpServletRequest httpServletRequest,\n      HttpServletResponse httpServletResponse,\n      long timeout,\n      Span span) {}\n\n  private StringTag buildTag(String tag) {\n    if (prefix == null) {\n      return new StringTag(tag);\n    }\n    return new StringTag(prefix + tag);\n  }\n\n  public String getPrefix() {\n    return this.prefix;\n  }\n\n  public List<HeaderEntry> getAllowedHeaders() {\n    return this.allowedHeaders;\n  }\n\n  /**\n   * HeaderEntry is used to configure {@link ServletFilterHeaderSpanDecorator} {@link #header} is\n   * used to check if the header exists using {@link HttpServletRequest#getHeader(String)} {@link\n   * #tag} will be used as a {@link StringTag} if {@link #header} is found on the incoming request\n   */\n  public static class HeaderEntry {\n    private final String header;\n    private final String tag;\n\n    /**\n     * @param header Header on the {@link HttpServletRequest}\n     * @param tag Tag to be used if {@link #header} is found\n     */\n    public HeaderEntry(String header, String tag) {\n      this.header = header;\n      this.tag = tag;\n    }\n\n    public String getHeader() {\n      return this.header;\n    }\n\n    public String getTag() {\n      return this.tag;\n    }\n  }\n}\n"
  },
  {
    "path": "core/che-core-tracing-web/src/main/java/org/eclipse/che/core/tracing/web/TracingFilterProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.tracing.web;\n\nimport com.google.common.annotations.Beta;\nimport io.opentracing.Tracer;\nimport io.opentracing.contrib.web.servlet.filter.TracingFilter;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\n\n/**\n * Guice @{@link javax.inject.Provider} of @{@link\n * io.opentracing.contrib.web.servlet.filter.TracingFilter} objects\n */\n@Beta\n@Singleton\npublic class TracingFilterProvider implements Provider<TracingFilter> {\n\n  private final TracingFilter filter;\n\n  @Inject\n  public TracingFilterProvider(Tracer tracer) {\n    filter = new TracingFilter(tracer);\n  }\n\n  @Override\n  public TracingFilter get() {\n    return filter;\n  }\n}\n"
  },
  {
    "path": "core/che-core-tracing-web/src/main/java/org/eclipse/che/core/tracing/web/TracingWebModule.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.core.tracing.web;\n\nimport com.google.common.annotations.Beta;\nimport com.google.inject.servlet.ServletModule;\nimport io.opentracing.contrib.web.servlet.filter.TracingFilter;\nimport javax.inject.Singleton;\n\n@Beta\npublic class TracingWebModule extends ServletModule {\n  @Override\n  protected void configureServlets() {\n    // tracing\n    bind(TracingFilter.class).toProvider(TracingFilterProvider.class).in(Singleton.class);\n    filter(\"/*\").through(TracingFilter.class);\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-typescript-dto-maven-plugin</artifactId>\n    <packaging>maven-plugin</packaging>\n    <name>Che Core :: Commons :: API :: TypeScript DTO maven plugin</name>\n    <properties>\n        <enforcer.skip>true</enforcer.skip>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.antlr</groupId>\n            <artifactId>ST4</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven</groupId>\n            <artifactId>maven-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.reflections</groupId>\n            <artifactId>reflections</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven</groupId>\n            <artifactId>maven-artifact</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven</groupId>\n            <artifactId>maven-model</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven</groupId>\n            <artifactId>maven-plugin-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven.plugin-tools</groupId>\n            <artifactId>maven-plugin-annotations</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.sisu</groupId>\n            <artifactId>org.eclipse.sisu.plexus</artifactId>\n            <scope>provided</scope>\n            <exclusions>\n                <exclusion>\n                    <artifactId>jsr250-api</artifactId>\n                    <groupId>javax.annotation</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>org.javassist</groupId>\n            <artifactId>javassist</artifactId>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven</groupId>\n            <artifactId>maven-compat</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.maven.plugin-testing</groupId>\n            <artifactId>maven-plugin-testing-harness</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.codehaus.plexus</groupId>\n            <artifactId>plexus-utils</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.codehaus.plexus</groupId>\n            <artifactId>plexus-xml</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-it-test-source</id>\n                        <phase>process-resources</phase>\n                        <goals>\n                            <goal>add-test-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>src/it/java</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-it-test-resources</id>\n                        <phase>process-resources</phase>\n                        <goals>\n                            <goal>add-test-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>src/it/resources</directory>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <configuration>\n                    <excludes>\n                        <exclude>**/*ITest.java</exclude>\n                    </excludes>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-plugin-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>mojo-descriptor</id>\n                        <goals>\n                            <goal>descriptor</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <configuration>\n                    <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n    <profiles>\n        <profile>\n            <id>integration-tests</id>\n            <activation>\n                <property>\n                    <name>!skipIntegrationTests</name>\n                </property>\n            </activation>\n            <build>\n                <plugins>\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-surefire-plugin</artifactId>\n                        <executions>\n                            <execution>\n                                <id>integration-test</id>\n                                <phase>integration-test</phase>\n                                <goals>\n                                    <goal>test</goal>\n                                </goals>\n                                <configuration>\n                                    <forkCount>0</forkCount>\n                                    <systemPropertyVariables>\n                                        <buildDirectory>${project.build.directory}</buildDirectory>\n                                    </systemPropertyVariables>\n                                    <excludes>\n                                        <exclude>none</exclude>\n                                    </excludes>\n                                    <includes>\n                                        <include>**/*ITest.java</include>\n                                    </includes>\n                                </configuration>\n                            </execution>\n                        </executions>\n                        <configuration>\n                            <excludes>\n                                <exclude>**/*ITest.java</exclude>\n                            </excludes>\n                        </configuration>\n                    </plugin>\n                </plugins>\n            </build>\n            <dependencies>\n                <!-- Dependencies used only by the integration tests -->\n            </dependencies>\n        </profile>\n    </profiles>\n</project>\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/it/java/org/eclipse/che/plugin/typescript/dto/TypeScriptDTOGeneratorMojoTST.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.api.core.util.SystemInfo;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.Test;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.net.URISyntaxException;\nimport java.nio.file.Path;\nimport java.nio.file.StandardCopyOption;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.stream.Stream;\n\nimport static java.util.stream.Collectors.toList;\n\n/**\n * Integration test of TypeScriptDTOGeneratorMojo\n * It uses docker to launch TypeScript compiler and then launch JavaScript tests to ensure generator has worked correctly\n * @author Florent Benoit\n */\npublic class TypeScriptDTOGeneratorMojoTST {\n\n    /**\n     * Logger.\n     */\n    private static final Logger LOG = LoggerFactory.getLogger(TypeScriptDTOGeneratorMojoTST.class);\n\n    /**\n     * DTO Generated file\n     */\n    private static final String GENERATED_DTO_NAME = \"my-typescript-test-module.ts\";\n\n    private static final String GENERATED_DTO_DTS_NAME = \"my-typescript-test-module.d.ts\";\n\n    /**\n     * DTO new name\n     */\n    private static final String DTO_FILENAME = \"dto.ts\";\n\n    private static final String DTO_DTS_FILENAME = \"dtoD.d.ts\";\n\n    /**\n     * DTO test name\n     */\n    private static final String DTO_SPEC_FILENAME = \"dto.spec.ts\";\n\n    /**\n     * Target folder of maven.\n     */\n    private Path buildDirectory;\n\n    /**\n     * Path to the package.json file used to setup typescript compiler\n     */\n    private Path dtoSpecJsonPath;\n\n    /**\n     * Path to the package.json file used to setup typescript compiler\n     */\n    private Path packageJsonPath;\n\n    /**\n     * Root directory for our tests\n     */\n    private Path rootPath;\n\n    /**\n     * Linux uid.\n     */\n    private String linuxUID;\n\n    /**\n     * Linux gid.\n     */\n    private String linuxGID;\n\n    /**\n     * Init folders\n     */\n    @BeforeClass\n    public void init() throws URISyntaxException, IOException, InterruptedException {\n        // setup packages\n        this.packageJsonPath = new File(TypeScriptDTOGeneratorMojoTST.class.getClassLoader().getResource(\"package.json\").toURI()).toPath();\n\n        this.rootPath = this.packageJsonPath.getParent();\n\n        // target folder\n        String buildDirectoryProperty = System.getProperty(\"buildDirectory\");\n        if (buildDirectoryProperty != null) {\n            buildDirectory = new File(buildDirectoryProperty).toPath();\n        } else {\n            buildDirectory = packageJsonPath.getParent().getParent();\n        }\n\n        LOG.info(\"Using building directory {0}\", buildDirectory);\n    }\n\n    /**\n     * Generates a docker exec command used to launch node commands. Uses podman if present on the\n     * system.\n     *\n     * @return list of command parameters\n     */\n    protected List<String> getDockerExec() throws IOException, InterruptedException {\n        // setup command line\n        List<String> command = new ArrayList<>();\n        if (hasPodman()) {\n            command.add(\"podman\");\n        } else {\n            command.add(\"docker\");\n        }\n        command.add(\"run\");\n        command.add(\"--rm\");\n        command.add(\"-v\");\n        command.add(rootPath.toString() + \":/usr/src/app\");\n        command.add(\"-w\");\n        command.add(\"/usr/src/app\");\n        command.add(\"node:6\");\n        command.add(\"/bin/sh\");\n        command.add(\"-c\");\n\n        return command;\n    }\n\n    /**\n     * Get UID of current user (used on Linux)\n     */\n    protected String getUid() throws IOException, InterruptedException {\n        if (this.linuxUID == null) {\n            // grab user id\n            ProcessBuilder uidProcessBuilder = new ProcessBuilder(\"id\", \"-u\");\n            Process processId = uidProcessBuilder.start();\n            int resultId = processId.waitFor();\n            String uid = \"\";\n            try (BufferedReader outReader = new BufferedReader(new InputStreamReader(processId.getInputStream()))) {\n                uid = String.join(System.lineSeparator(), outReader.lines().collect(toList()));\n            } catch (Exception error) {\n                throw new IllegalStateException(\"Unable to get uid\" + uid);\n            }\n\n            if (resultId != 0) {\n                throw new IllegalStateException(\"Unable to get uid\" + uid);\n            }\n\n            try {\n                Integer.valueOf(uid);\n            } catch (NumberFormatException e) {\n                throw new IllegalStateException(\"The uid is not a number\" + uid);\n            }\n            this.linuxUID = uid;\n        }\n\n        return this.linuxUID;\n    }\n\n    /**\n     * Get GID of current user (used on Linux)\n     */\n    protected String getGid() throws IOException, InterruptedException {\n        if (this.linuxGID == null) {\n\n            ProcessBuilder gidProcessBuilder = new ProcessBuilder(\"id\", \"-g\");\n            Process processGid = gidProcessBuilder.start();\n            int resultGid = processGid.waitFor();\n            String gid = \"\";\n            try (BufferedReader outReader = new BufferedReader(new InputStreamReader(processGid.getInputStream()))) {\n                gid = String.join(System.lineSeparator(), outReader.lines().collect(toList()));\n            } catch (Exception error) {\n                throw new IllegalStateException(\"Unable to get gid\" + gid);\n            }\n\n            if (resultGid != 0) {\n                throw new IllegalStateException(\"Unable to get gid\" + gid);\n            }\n\n            try {\n                Integer.valueOf(gid);\n            } catch (NumberFormatException e) {\n                throw new IllegalStateException(\"The uid is not a number\" + gid);\n            }\n\n            this.linuxGID = gid;\n        }\n\n        return this.linuxGID;\n    }\n\n    /**\n     * Setup typescript compiler by downloading the dependencies\n     * @throws IOException if unable to start process\n     * @throws InterruptedException if unable to wait the end of the process\n     */\n    @Test(groups = {\"tools\"})\n    protected void installTypeScriptCompiler() throws IOException, InterruptedException {\n\n        // setup command line\n        List<String> command = getDockerExec();\n\n        // avoid root permissions in generated files\n        if (SystemInfo.isLinux()) {\n            command.add(wrapLinuxCommand(\"npm install\"));\n        } else {\n            command.add(\"npm install\");\n        }\n\n        // setup typescript compiler\n        ProcessBuilder processBuilder = new ProcessBuilder().command(command).directory(rootPath.toFile()).redirectErrorStream(true).inheritIO();\n        Process process = processBuilder.start();\n\n        LOG.info(\"Installing TypeScript compiler in {0}\", rootPath);\n        int resultProcess = process.waitFor();\n\n        if (resultProcess != 0) {\n            throw new IllegalStateException(\"Install of TypeScript has failed\");\n        }\n        LOG.info(\"TypeScript compiler installed.\");\n\n    }\n\n\n    /**\n     * Wrap the given command into a command with chown. Also add group/user that match host environment if not exists\n     * @param command the command to wrap\n     * @return an updated command with chown applied on it\n     */\n    protected String wrapLinuxCommand(String command) throws IOException, InterruptedException {\n        if (hasPodman()) {\n            LOG.debug(\"using podman, don't need to wrap anything\");\n            return command;\n        }\n        String setGroup =\n            \"export GROUP_NAME=`(getent group \" + getGid() + \" || (groupadd -g \" + getGid()\n                + \" user && echo user:x:\" + getGid() + \")) | cut -d: -f1`\";\n        String setUser =\n            \"export USER_NAME=`(getent passwd \" + getUid() + \" || (useradd -u \" + getUid()\n                + \" -g ${GROUP_NAME} user && echo user:x:\" + getGid() + \")) | cut -d: -f1`\";\n        String chownCommand = \"chown --silent -R ${USER_NAME}.${GROUP_NAME} /usr/src/app || true\";\n        return setGroup + \" && \" + setUser + \" && \" + chownCommand + \" && \" + command + \" && \"\n            + chownCommand;\n    }\n\n\n    /**\n     * Starts tests by compiling first generated DTO from maven plugin\n     * @throws IOException if unable to start process\n     * @throws InterruptedException if unable to wait the end of the process\n     */\n    @Test(dependsOnGroups = \"tools\")\n    public void compileDTOAndLaunchTests() throws IOException, InterruptedException {\n\n        // search DTO\n        Path p = this.buildDirectory;\n        final int maxDepth = 10;\n        Stream<Path> matches = java.nio.file.Files.find( p, maxDepth, (path, basicFileAttributes) -> path.getFileName().toString().equals(GENERATED_DTO_NAME));\n\n        // take first\n        Optional<Path> optionalPath = matches.findFirst();\n        if (!optionalPath.isPresent()) {\n            throw new IllegalStateException(\"Unable to find generated DTO file named '\" + GENERATED_DTO_NAME + \"'. Check it has been generated first\");\n        }\n\n        Path generatedDtoPath = optionalPath.get();\n\n        //copy it in test resources folder where package.json is\n        java.nio.file.Files.copy(generatedDtoPath, this.rootPath.resolve(DTO_FILENAME), StandardCopyOption.REPLACE_EXISTING);\n\n        matches = java.nio.file.Files.find( p, maxDepth, (path, basicFileAttributes) -> path.getFileName().toString().equals(GENERATED_DTO_DTS_NAME));\n\n        // take first\n        optionalPath = matches.findFirst();\n        if (!optionalPath.isPresent()) {\n            throw new IllegalStateException(\"Unable to find generated DTO file named '\" + GENERATED_DTO_DTS_NAME + \"'. Check it has been generated first\");\n        }\n\n        generatedDtoPath = optionalPath.get();\n\n        //copy it in test resources folder where package.json is\n        java.nio.file.Files.copy(generatedDtoPath, this.rootPath.resolve(DTO_DTS_FILENAME), StandardCopyOption.REPLACE_EXISTING);\n\n        // setup command line\n        List<String> command = getDockerExec();\n\n        // avoid root permissions in generated files\n        if (SystemInfo.isLinux()) {\n            command.add(wrapLinuxCommand(\"npm test\"));\n        } else {\n            command.add(\"npm test\");\n        }\n        // setup typescript compiler\n        ProcessBuilder processBuilder = new ProcessBuilder().command(command).directory(rootPath.toFile()).redirectErrorStream(true).inheritIO();\n        Process process = processBuilder.start();\n\n        LOG.info(\"Starting TypeScript tests...\");\n        int resultProcess = process.waitFor();\n\n        if (resultProcess != 0) {\n            throw new IllegalStateException(\"DTO has failed to compile\");\n        }\n        LOG.info(\"TypeScript tests OK\");\n\n    }\n\n    private boolean hasPodman() throws InterruptedException, IOException {\n        if (SystemInfo.isLinux()) {\n            ProcessBuilder podmanProcessBuilder = new ProcessBuilder(\"which\", \"podman\");\n            Process podmanProcess = podmanProcessBuilder.start();\n            if (podmanProcess.waitFor(1, TimeUnit.SECONDS)) {\n                return podmanProcess.exitValue() == 0;\n            } else {\n                return false;\n            }\n        } else {\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/it/resources/dto.spec.ts",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\nimport {org} from './dto';\n\nimport {che} from './dtoD'\n\nlet expect = require('chai').expect;\n\nclass DTOBuilder {\n\n    static MY_CUSTOM_NAME : string = \"myCustomName\";\n    static MY_CUSTOM_STATUS : string  = \"myCustomStatus\";\n    static MY_CUSTOM_MAP_ENTRY_NAME : string = \"myEntry\";\n\n    static MY_OTHER_NAME : string = \"myOtherName\";\n\n    static MY_SIMPLE_ID : number = 2503;\n    static MY_SIMPLE_BOOLEAN : boolean = true;\n    static MY_SIMPLE_DOUBLE : number = 19.79;\n    static MY_SIMPLE_FLOAT : number = 3.14;\n\n\n    static buildSimpleDto() : org.eclipse.che.plugin.typescript.dto.MySimpleDTO {\n        let mySimpleDTO : org.eclipse.che.plugin.typescript.dto.MySimpleDTO = new org.eclipse.che.plugin.typescript.dto.MySimpleDTOImpl();\n        mySimpleDTO.withId(DTOBuilder.MY_SIMPLE_ID).withBoolean(DTOBuilder.MY_SIMPLE_BOOLEAN).withDouble(DTOBuilder.MY_SIMPLE_DOUBLE).withFloat(DTOBuilder.MY_SIMPLE_FLOAT);\n        return mySimpleDTO;\n    }\n\n    static buildCustomDto() : org.eclipse.che.plugin.typescript.dto.MyCustomDTO {\n        let myCustomDTO : org.eclipse.che.plugin.typescript.dto.MyCustomDTO = new org.eclipse.che.plugin.typescript.dto.MyCustomDTOImpl();\n        myCustomDTO.withName(DTOBuilder.MY_CUSTOM_NAME).withStatus(DTOBuilder.MY_CUSTOM_STATUS).withConfig(DTOBuilder.buildConfigDTO());\n        myCustomDTO.getCustomMap().set(DTOBuilder.MY_CUSTOM_MAP_ENTRY_NAME, DTOBuilder.buildConfigDTO());\n        return myCustomDTO;\n    }\n\n    static buildConfigDTO() : org.eclipse.che.plugin.typescript.dto.MyOtherDTO {\n        let configDTO : org.eclipse.che.plugin.typescript.dto.MyOtherDTO = new org.eclipse.che.plugin.typescript.dto.MyOtherDTOImpl();\n        configDTO.withName(DTOBuilder.MY_OTHER_NAME);\n        return configDTO;\n    }\n\n}\n\ndescribe(\"DTO serialization tests\", () => {\n\n\n    it(\"check simple DTO implementation\", () => {\n\n        let myCustomDTO : org.eclipse.che.plugin.typescript.dto.MySimpleDTO = DTOBuilder.buildSimpleDto();\n        expect(myCustomDTO.getId()).to.eql(DTOBuilder.MY_SIMPLE_ID);\n        expect(myCustomDTO.getBoolean()).to.eql(DTOBuilder.MY_SIMPLE_BOOLEAN);\n        expect(myCustomDTO.getDouble()).to.eql(DTOBuilder.MY_SIMPLE_DOUBLE);\n        expect(myCustomDTO.getFloat()).to.eql(DTOBuilder.MY_SIMPLE_FLOAT);\n\n    });\n\n\n    it(\"check build DTO implementation\", () => {\n\n        let myCustomDTO : org.eclipse.che.plugin.typescript.dto.MyCustomDTO = DTOBuilder.buildCustomDto();\n        expect(myCustomDTO.getName()).to.eql(DTOBuilder.MY_CUSTOM_NAME);\n        expect(myCustomDTO.getStatus()).to.eql(DTOBuilder.MY_CUSTOM_STATUS);\n        expect(myCustomDTO.getConfig()).to.exist;\n        expect(myCustomDTO.getConfig().getName()).to.eql(DTOBuilder.MY_OTHER_NAME);\n        expect(myCustomDTO.getCustomMap().get(DTOBuilder.MY_CUSTOM_MAP_ENTRY_NAME)).to.exist;\n        expect(myCustomDTO.getCustomMap().get(DTOBuilder.MY_CUSTOM_MAP_ENTRY_NAME).getName()).to.eql(DTOBuilder.MY_OTHER_NAME);\n\n    });\n\n\n    it(\"check build DTO implementation\", () => {\n\n        let myCustomDTO : org.eclipse.che.plugin.typescript.dto.MyCustomDTO = DTOBuilder.buildCustomDto();\n        expect(myCustomDTO.getName()).to.eql(DTOBuilder.MY_CUSTOM_NAME);\n        expect(myCustomDTO.getStatus()).to.eql(DTOBuilder.MY_CUSTOM_STATUS);\n        expect(myCustomDTO.getConfig()).to.exist;\n        expect(myCustomDTO.getConfig().getName()).to.eql(DTOBuilder.MY_OTHER_NAME);\n        expect(myCustomDTO.getCustomMap().get(DTOBuilder.MY_CUSTOM_MAP_ENTRY_NAME)).to.exist;\n        expect(myCustomDTO.getCustomMap().get(DTOBuilder.MY_CUSTOM_MAP_ENTRY_NAME).getName()).to.eql(DTOBuilder.MY_OTHER_NAME);\n\n    });\n\n\n    it(\"check build DTO implementation from source\", () => {\n        let myCustomDTO : org.eclipse.che.plugin.typescript.dto.MyCustomDTO = DTOBuilder.buildCustomDto();\n\n        // build it from generated output\n        let myCustomDTOFromSource : org.eclipse.che.plugin.typescript.dto.MyCustomDTO = new org.eclipse.che.plugin.typescript.dto.MyCustomDTOImpl(myCustomDTO.toJson());\n\n        expect(myCustomDTO.getName()).to.eql(myCustomDTOFromSource.getName());\n        expect(myCustomDTOFromSource.getConfig()).to.exist;\n        expect(myCustomDTO.getConfig().getName()).to.eql(myCustomDTOFromSource.getConfig().getName());\n        expect(myCustomDTOFromSource.getCustomMap().get(DTOBuilder.MY_CUSTOM_MAP_ENTRY_NAME)).to.exist;\n        expect(myCustomDTO.getCustomMap().get(DTOBuilder.MY_CUSTOM_MAP_ENTRY_NAME).getName()).to.eql(myCustomDTOFromSource.getCustomMap().get(DTOBuilder.MY_CUSTOM_MAP_ENTRY_NAME).getName());\n\n        expect(myCustomDTO.toJson()).to.eql(myCustomDTOFromSource.toJson());\n    });\n\n    it(\"check d.ts types\", () => {\n        const customDto: che.plugin.typescript.MyCustom = {\n            internal: {\n                internalValue: \"foo\"\n            },\n            status: \"SHUTDOWN\",\n            customMap: {\"bar\": { name: \"foo\"}},\n            arguments: [{}, {},]\n        };\n\n\n        expect(customDto.internal).to.eql({ internalValue: \"foo\" } as che.plugin.typescript.internal.Internal);\n        expect(customDto.customMap).to.have.property(\"bar\");\n        expect(customDto.customMap[\"bar\"].name).to.eql(\"foo\");\n    });\n\n    it(\"check Serializable type\", () => {\n        const customDto: che.plugin.typescript.MyDtoWithSerializable = {\n\n        };\n    });\n\n});\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/it/resources/package.json",
    "content": "{\n  \"name\": \"che-typescript-maven-generator-integration-test\",\n  \"version\": \"1.0.0\",\n  \"description\": \"TypeScript integration test\",\n  \"author\": \"Florent Benoit\",\n  \"license\": \"EPL-1.0\",\n  \"scripts\": {\n    \"pretest\": \"./node_modules/.bin/tsc --target ES6 --outDir lib --module commonjs *.ts\",\n    \"test\": \"./node_modules/.bin/mocha lib/*.spec.js\"\n  },\n  \"devDependencies\": {\n    \"chai\": \"3.5.0\",\n    \"mocha\": \"3.0.2\",\n    \"typescript\": \"2.0.3\"\n  },\n  \"dependencies\": {\n    \"@types/mocha\": \"2.2.32\",\n    \"@types/node\": \"6.0.41\"\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/main/java/org/eclipse/che/plugin/typescript/dto/DTOHelper.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\nimport java.io.Serializable;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.dto.shared.DelegateTo;\n\n/**\n * Helper class\n *\n * @author Florent Benoit\n */\npublic class DTOHelper {\n\n  /** Utility class. */\n  private DTOHelper() {}\n\n  /** Check is specified method is DTO getter. */\n  public static boolean isDtoGetter(Method method) {\n    if (method.isAnnotationPresent(DelegateTo.class)) {\n      return false;\n    }\n\n    if (method.getParameterTypes().length > 0) {\n      return false;\n    }\n\n    String methodName = method.getName();\n\n    return methodName.startsWith(\"get\")\n        || (methodName.startsWith(\"is\")\n            && ((method.getReturnType() == Boolean.class\n                || method.getReturnType() == boolean.class)));\n  }\n\n  /** Check is specified method is DTO setter. */\n  public static boolean isDtoSetter(Method method) {\n    if (method.isAnnotationPresent(DelegateTo.class)) {\n      return false;\n    }\n    String methodName = method.getName();\n    return methodName.startsWith(\"set\") && method.getParameterTypes().length == 1;\n  }\n\n  /** Check is specified method is DTO with. */\n  public static boolean isDtoWith(Method method) {\n    if (method.isAnnotationPresent(DelegateTo.class)) {\n      return false;\n    }\n    String methodName = method.getName();\n    return methodName.startsWith(\"with\") && method.getParameterTypes().length == 1;\n  }\n\n  /** Compute field name from the stringified string type */\n  public static String getFieldName(String type) {\n    char[] c = type.toCharArray();\n    c[0] = Character.toLowerCase(c[0]);\n\n    return new String(c);\n  }\n\n  /** Compute argument name from the stringified string type */\n  public static String getArgumentName(String type) {\n\n    String val = getFieldName(type);\n\n    // replace reserved keyword\n    if (\"arguments\".equals(val)) {\n      val = \"argumentsObj\";\n    }\n    return val;\n  }\n\n  /** Extract field name from the getter method */\n  public static Pair<String, String> getGetterFieldName(Method method) {\n    String methodName = method.getName();\n    if (methodName.startsWith(\"get\")) {\n      String name = methodName.substring(3);\n      return Pair.of(getFieldName(name), getArgumentName(name));\n    } else if (methodName.startsWith(\"is\")) {\n      String name = methodName.substring(2);\n      return Pair.of(getFieldName(name), getArgumentName(name));\n    }\n    throw new IllegalArgumentException(\"Invalid getter method\" + method.getName());\n  }\n\n  /** Extract field name from the setter method */\n  public static Pair<String, String> getSetterFieldName(Method method) {\n    String methodName = method.getName();\n    if (methodName.startsWith(\"set\")) {\n      String name = methodName.substring(3);\n      return Pair.of(getFieldName(name), getArgumentName(name));\n    }\n    throw new IllegalArgumentException(\"Invalid setter method\" + method.getName());\n  }\n\n  /** Extract field name and argument name from the with method */\n  public static Pair<String, String> getWithFieldName(Method method) {\n    String methodName = method.getName();\n    if (methodName.startsWith(\"with\")) {\n      String name = methodName.substring(4);\n      return Pair.of(getFieldName(name), getArgumentName(name));\n    }\n    throw new IllegalArgumentException(\"Invalid with method\" + method.getName());\n  }\n\n  /** Convert Java type to TypeScript type */\n  public static String convertType(Type type) {\n    if (type instanceof ParameterizedType) {\n      ParameterizedType parameterizedType = (ParameterizedType) type;\n      Type rawType = parameterizedType.getRawType();\n      return convertParametrizedType(type, parameterizedType, rawType);\n    } else if (String.class.equals(type) || (type instanceof Class && ((Class) type).isEnum())) {\n      // Maybe find a better enum type for typescript\n      return \"string\";\n    } else if (Integer.class.equals(type)\n        || Integer.TYPE.equals(type)\n        || Long.class.equals(type)\n        || Long.TYPE.equals(type)\n        || Double.class.equals(type)\n        || Double.TYPE.equals(type)\n        || Float.TYPE.equals(type)) {\n      return \"number\";\n    } else if (Boolean.class.equals(type) || Boolean.TYPE.equals(type)) {\n      return \"boolean\";\n    } else if (Serializable.class.equals(type)) {\n      return \"string | number | boolean\";\n    }\n\n    return type.getTypeName();\n  }\n\n  /** Handle convert of a parametrized Java type to TypeScript type */\n  public static String convertParametrizedType(\n      Type type, ParameterizedType parameterizedType, Type rawType) {\n\n    if (List.class.equals(rawType)) {\n      return \"Array<\" + convertType(parameterizedType.getActualTypeArguments()[0]) + \">\";\n    } else if (Map.class.equals(rawType)) {\n      return \"Map<\"\n          + convertType(parameterizedType.getActualTypeArguments()[0])\n          + \",\"\n          + convertType(parameterizedType.getActualTypeArguments()[1])\n          + \">\";\n    } else {\n      throw new IllegalArgumentException(\"Invalid type\" + type);\n    }\n  }\n\n  /**\n   * Same as {@link #convertParametrizedType(Type, ParameterizedType, Type)} but use [] instead if\n   * 'Array[' for arrays\n   */\n  public static String convertParametrizedTypeDTS(\n      Type type, ParameterizedType parameterizedType, Type rawType, Type containerType) {\n\n    if (List.class.equals(rawType)) {\n      return convertTypeForDTS(containerType, parameterizedType.getActualTypeArguments()[0]) + \"[]\";\n    } else if (Map.class.equals(rawType)) {\n      return \"Map<\"\n          + convertTypeForDTS(containerType, parameterizedType.getActualTypeArguments()[0])\n          + \",\"\n          + convertTypeForDTS(containerType, parameterizedType.getActualTypeArguments()[1])\n          + \">\";\n    } else {\n      throw new IllegalArgumentException(\"Invalid type\" + type);\n    }\n  }\n\n  /**\n   * Convert Java type to TypeScript type for .d.ts Same as {@link #convertType(Type)} but in\n   * addition check if dto and its container dto in same package than skip adding namespace\n   */\n  public static String convertTypeForDTS(Type containerType, Type type) {\n    if (type instanceof ParameterizedType) {\n      ParameterizedType parameterizedType = (ParameterizedType) type;\n      Type rawType = parameterizedType.getRawType();\n      return convertParametrizedTypeDTS(type, parameterizedType, rawType, containerType);\n    } else if (String.class.equals(type)) {\n      // Maybe find a better enum type for typescript\n      return \"string\";\n\n    } else if ((type instanceof Class && ((Class) type).isEnum())) {\n\n      Object[] constants = ((Class) type).getEnumConstants();\n      return Arrays.stream(constants)\n          .map(o -> \"\\'\" + o.toString() + \"\\'\")\n          .collect(Collectors.joining(\" | \"));\n    } else if (Integer.class.equals(type)\n        || Integer.TYPE.equals(type)\n        || Long.class.equals(type)\n        || Long.TYPE.equals(type)\n        || Double.class.equals(type)\n        || Double.TYPE.equals(type)\n        || Float.TYPE.equals(type)) {\n      return \"number\";\n    } else if (Boolean.class.equals(type) || Boolean.TYPE.equals(type)) {\n      return \"boolean\";\n    } else if (Serializable.class.equals(type)) {\n      return \"string | number | boolean\";\n    }\n\n    String declarationPackage = convertToDTSPackageName((Class) containerType);\n    String typePackage = convertToDTSPackageName((Class) type);\n    if (declarationPackage.equals(typePackage)) {\n      return convertToDTSName((Class) type);\n    }\n\n    return typePackage + \".\" + convertToDTSName((Class) type);\n  }\n\n  /** Remove 'Dto' suffix from class name */\n  public static String convertToDTSName(Class type) {\n    String name = type.getSimpleName();\n    if (name.toLowerCase().endsWith(\"dto\")) {\n      name = name.substring(0, name.length() - 3);\n    }\n\n    return name;\n  }\n\n  /**\n   * Convert Java package to TypeScript namespace. This method deletes \"org.eclipse.\", \".api\",\n   * \".dto\", \".shared\" segments from dto package name\n   *\n   * @param dto\n   * @return the TS namespace name\n   */\n  public static String convertToDTSPackageName(Class dto) {\n    return removeSubStrings(dto.getPackage().getName(), \"org.eclipse.\", \".api\", \".dto\", \".shared\");\n  }\n\n  /** Remove all substrings from original string */\n  private static String removeSubStrings(String str, String... subStrings) {\n    StringBuilder builder = new StringBuilder(str);\n    for (String subString : subStrings) {\n      int index = builder.indexOf(subString);\n      if (index != -1) {\n        builder.delete(index, index + subString.length());\n      }\n    }\n\n    return builder.toString();\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/main/java/org/eclipse/che/plugin/typescript/dto/TypeScriptDTOGeneratorMojo.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.Files;\nimport org.apache.maven.plugin.AbstractMojo;\nimport org.apache.maven.plugin.MojoExecutionException;\nimport org.apache.maven.plugins.annotations.Component;\nimport org.apache.maven.plugins.annotations.LifecyclePhase;\nimport org.apache.maven.plugins.annotations.Mojo;\nimport org.apache.maven.plugins.annotations.Parameter;\nimport org.apache.maven.plugins.annotations.ResolutionScope;\nimport org.apache.maven.project.MavenProject;\nimport org.apache.maven.project.MavenProjectHelper;\n\n/**\n * Mojo for generating TypeScript DTO interface + implementation for handling JSON data.\n *\n * @author Florent Benoit\n */\n@Mojo(\n    name = \"build\",\n    defaultPhase = LifecyclePhase.PACKAGE,\n    requiresProject = true,\n    requiresDependencyCollection = ResolutionScope.RUNTIME)\npublic class TypeScriptDTOGeneratorMojo extends AbstractMojo {\n\n  /** Project providing artifact id, version and dependencies. */\n  @Parameter(defaultValue = \"${project}\", readonly = true)\n  private MavenProject project;\n\n  /** build directory used to write the intermediate bom file. */\n  @Parameter(defaultValue = \"${project.build.directory}\")\n  private File targetDirectory;\n\n  /** should build new '.d.ts' DTO on old 'ts' DTO interfaces */\n  @Parameter(defaultValue = \"false\", property = \"dts\")\n  private boolean dts;\n\n  @Component private MavenProjectHelper projectHelper;\n\n  /** Path to the generated typescript file */\n  private File typescriptFile;\n\n  /** Use of classpath instead of classloader */\n  private boolean useClassPath;\n\n  @Override\n  public void execute() throws MojoExecutionException {\n    if (dts) {\n      getLog().info(\"Generating TypeScript DTO d.ts\");\n      generateDTs();\n    } else {\n      getLog().info(\"Generating TypeScript DTO\");\n      generateTs();\n    }\n  }\n\n  private void generateDTs() throws MojoExecutionException {\n    TypeScriptDtoDTSGenerator typeScriptDtoGenerator = new TypeScriptDtoDTSGenerator();\n\n    typeScriptDtoGenerator.setUseClassPath(useClassPath);\n\n    // define output path for the file to write with typescript definition\n    String output = typeScriptDtoGenerator.execute();\n\n    this.typescriptFile = new File(targetDirectory, project.getArtifactId() + \".d.ts\");\n    File parentDir = this.typescriptFile.getParentFile();\n    if (!parentDir.exists() && !parentDir.mkdirs()) {\n      throw new MojoExecutionException(\n          \"Unable to create a directory for writing DTO typescript file '\" + parentDir + \"'.\");\n    }\n\n    try (Writer fileWriter =\n        Files.newBufferedWriter(this.typescriptFile.toPath(), StandardCharsets.UTF_8)) {\n      fileWriter.write(output);\n    } catch (IOException e) {\n      throw new MojoExecutionException(\"Cannot write DTO typescript file\");\n    }\n\n    // attach this typescript file as maven artifact\n    projectHelper.attachArtifact(project, \"ts\", typescriptFile);\n  }\n\n  private void generateTs() throws MojoExecutionException {\n    TypeScriptDtoGenerator typeScriptDtoGenerator = new TypeScriptDtoGenerator();\n\n    typeScriptDtoGenerator.setUseClassPath(useClassPath);\n\n    // define output path for the file to write with typescript definition\n    String output = typeScriptDtoGenerator.execute();\n\n    this.typescriptFile = new File(targetDirectory, project.getArtifactId() + \".ts\");\n    File parentDir = this.typescriptFile.getParentFile();\n    if (!parentDir.exists() && !parentDir.mkdirs()) {\n      throw new MojoExecutionException(\n          \"Unable to create a directory for writing DTO typescript file '\" + parentDir + \"'.\");\n    }\n\n    try (Writer fileWriter =\n        Files.newBufferedWriter(this.typescriptFile.toPath(), StandardCharsets.UTF_8)) {\n      fileWriter.write(output);\n    } catch (IOException e) {\n      throw new MojoExecutionException(\"Cannot write DTO typescript file\");\n    }\n\n    // attach this typescript file as maven artifact\n    projectHelper.attachArtifact(project, \"ts\", typescriptFile);\n  }\n\n  /**\n   * Gets the TypeScript generated file\n   *\n   * @return the generated file TypeScript link\n   */\n  public File getTypescriptFile() {\n    return typescriptFile;\n  }\n\n  /**\n   * Allow to configure generator to use classpath instead of classloader\n   *\n   * @param useClassPath true if want to use classpath loading\n   */\n  public void setUseClassPath(boolean useClassPath) {\n    this.useClassPath = useClassPath;\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/main/java/org/eclipse/che/plugin/typescript/dto/TypeScriptDtoDTSGenerator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\nimport static java.nio.charset.StandardCharsets.UTF_8;\n\nimport com.google.common.io.Resources;\nimport java.io.IOException;\nimport java.net.URL;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.plugin.typescript.dto.model.DtoModel;\nimport org.eclipse.che.plugin.typescript.dto.model.DtoNamespace;\nimport org.stringtemplate.v4.ST;\n\n/** Write all DTOs found in classpath into a specific '.d.ts' file */\npublic class TypeScriptDtoDTSGenerator extends TypeScriptDtoGenerator {\n\n  /** Name of the template */\n  public static final String TEMPLATE_NAME =\n      \"/\"\n          .concat(TypeScriptDtoDTSGenerator.class.getPackage().getName().replace(\".\", \"/\"))\n          .concat(\"/typescript.d.ts.template\");\n\n  /** String template instance used */\n  private ST st;\n\n  private Map<String, DtoNamespace> dtoNamespaces = new HashMap<>();\n\n  public static void main(String[] args) {\n    TypeScriptDtoGenerator.main(args);\n  }\n\n  @Override\n  protected void analyze(Class<?> dto) {\n    // for each dto class, store some data about it\n    DtoModel model = new DtoModel(dto);\n    String namespace = model.getDTSPackageName();\n    if (!dtoNamespaces.containsKey(namespace)) {\n      dtoNamespaces.put(namespace, new DtoNamespace(namespace));\n    }\n\n    dtoNamespaces.get(namespace).addModel(model);\n  }\n\n  @Override\n  public String execute() {\n    init();\n    ST template = getTemplate();\n    template.add(\"dtoNamespaces\", this.dtoNamespaces.values());\n    String output = template.render();\n    return output;\n  }\n\n  /**\n   * Get the template for typescript\n   *\n   * @return the String Template\n   */\n  protected ST getTemplate() {\n    if (st == null) {\n      URL url = Resources.getResource(TypeScriptDtoGenerator.class, TEMPLATE_NAME);\n      try {\n        st = new ST(Resources.toString(url, UTF_8));\n      } catch (IOException e) {\n        throw new IllegalArgumentException(\"Unable to read template\", e);\n      }\n    }\n    return st;\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/main/java/org/eclipse/che/plugin/typescript/dto/TypeScriptDtoGenerator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static org.reflections.util.ClasspathHelper.forClassLoader;\nimport static org.reflections.util.ClasspathHelper.forJavaClassPath;\n\nimport com.google.common.io.Resources;\nimport java.io.IOException;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.plugin.typescript.dto.model.DtoModel;\nimport org.reflections.Reflections;\nimport org.reflections.scanners.SubTypesScanner;\nimport org.reflections.scanners.TypeAnnotationsScanner;\nimport org.reflections.util.ConfigurationBuilder;\nimport org.stringtemplate.v4.ST;\n\n/**\n * Write all DTOs found in classpath into a specific file. It will contains both DTO interface and\n * DTO implementation. It will generate TypeScript code\n *\n * @author Florent Benoit\n */\npublic class TypeScriptDtoGenerator {\n\n  /** Name of the template */\n  public static final String TEMPLATE_NAME =\n      \"/\"\n          .concat(TypeScriptDtoGenerator.class.getPackage().getName().replace(\".\", \"/\"))\n          .concat(\"/typescript.template\");\n\n  /** String template instance used */\n  private ST st;\n\n  /** Model of DTOs that will be provided to the String Template */\n  private List<DtoModel> dtoModels;\n\n  /** Use of classpath */\n  private boolean useClassPath;\n\n  /** Setup a new generator */\n  public TypeScriptDtoGenerator() {\n    this.dtoModels = new ArrayList<>();\n  }\n\n  public static void main(String[] args) {\n    new TypeScriptDtoGenerator().execute();\n  }\n\n  /**\n   * Init stuff is responsible to grab all DTOs found in classpath (classloader) and setup model for\n   * String Template\n   */\n  protected void init() {\n\n    ConfigurationBuilder configurationBuilder =\n        new ConfigurationBuilder().setScanners(new SubTypesScanner(), new TypeAnnotationsScanner());\n    if (useClassPath) {\n      configurationBuilder.setUrls(forJavaClassPath());\n    } else {\n      configurationBuilder.setUrls(forClassLoader());\n    }\n\n    // keep only DTO interfaces\n    Reflections reflections = new Reflections(configurationBuilder);\n    List<Class<?>> annotatedWithDtos =\n        new ArrayList<>(reflections.getTypesAnnotatedWith(DTO.class));\n    List<Class<?>> interfacesDtos =\n        annotatedWithDtos.stream()\n            .filter(clazz -> clazz.isInterface())\n            .collect(Collectors.toList());\n    interfacesDtos.stream().forEach(this::analyze);\n  }\n\n  /**\n   * Analyze a DTO interface by registering the associate model.\n   *\n   * @param dto the DTO to analyze\n   */\n  protected void analyze(Class<?> dto) {\n    // for each dto class, store some data about it\n    this.dtoModels.add(new DtoModel(dto));\n  }\n\n  /** Execute this generator. */\n  public String execute() {\n    init();\n    ST template = getTemplate();\n    template.add(\"dtos\", this.dtoModels);\n    String output = template.render();\n    return output;\n  }\n\n  /**\n   * Get the template for typescript\n   *\n   * @return the String Template\n   */\n  protected ST getTemplate() {\n    if (st == null) {\n      URL url = Resources.getResource(TypeScriptDtoGenerator.class, TEMPLATE_NAME);\n      try {\n        st = new ST(Resources.toString(url, UTF_8));\n      } catch (IOException e) {\n        throw new IllegalArgumentException(\"Unable to read template\", e);\n      }\n    }\n    return st;\n  }\n\n  public void setUseClassPath(boolean useClassPath) {\n    this.useClassPath = useClassPath;\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/main/java/org/eclipse/che/plugin/typescript/dto/model/DtoModel.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto.model;\n\nimport static org.eclipse.che.plugin.typescript.dto.DTOHelper.*;\n\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Type;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * * Model of the DTO It includes attributes/fields and methods.\n *\n * @author Florent Benoit\n */\npublic class DtoModel {\n\n  /** DTO instance (interface). */\n  private Class dto;\n\n  /** Model of methods for this interface. */\n  private List<MethodModel> methods;\n\n  /** Map of all attributes found when scanning methods */\n  private Map<String, Type> fieldAttributes = new HashMap<>();\n\n  /** Model for the attributes of this interface (for generating implementation) */\n  private List<FieldAttributeModel> fieldAttributeModels;\n\n  private String interfaces;\n\n  private boolean extendsDto;\n\n  /**\n   * Build a new model for the given DTO class by scanning it.\n   *\n   * @param dto the interface with {@link org.eclipse.che.dto.shared.DTO} annotation\n   */\n  public DtoModel(Class dto) {\n    this.dto = dto;\n    this.methods = new ArrayList<>();\n    this.fieldAttributeModels = new ArrayList<>();\n    analyze();\n  }\n\n  /** Scan all getter/setter/with methods that are not inherited */\n  protected void analyze() {\n    Arrays.asList(this.dto.getMethods()).stream()\n        .filter(\n            method ->\n                !method.isBridge()\n                    && (isDtoGetter(method) || isDtoSetter(method) || isDtoWith(method)))\n        .forEach(\n            method -> {\n              MethodModel methodModel = new MethodModel(method);\n\n              // check method with same name already exist\n              if (!methods.contains(methodModel)) {\n                methods.add(methodModel);\n                if (isDtoGetter(method)) {\n                  analyzeDtoGetterMethod(method, methodModel);\n                } else if (isDtoSetter(method)) {\n                  analyzeDtoSetterMethod(method, methodModel);\n                } else if (isDtoWith(method)) {\n                  analyzeDtoWithMethod(method, methodModel);\n                }\n              }\n            });\n\n    // now convert map into list\n    fieldAttributes.entrySet().stream()\n        .forEach(\n            field ->\n                fieldAttributeModels.add(\n                    new FieldAttributeModel(field.getKey(), field.getValue(), dto)));\n\n    String interfaces =\n        Arrays.stream(this.dto.getInterfaces())\n            .filter(i -> i.getAnnotation(DTO.class) != null)\n            .map(i -> convertTypeForDTS(this.dto, i))\n            .collect(Collectors.joining(\", \"));\n    if (!interfaces.isEmpty()) {\n      this.interfaces = interfaces;\n      this.extendsDto = true;\n    }\n  }\n\n  /**\n   * Populate model from given reflect getter method\n   *\n   * @param method the method to analyze\n   * @param methodModel the model to update\n   */\n  protected void analyzeDtoGetterMethod(Method method, MethodModel methodModel) {\n    methodModel.setGetter(true);\n    Type fieldType = method.getGenericReturnType();\n    Pair<String, String> names = getGetterFieldName(method);\n    fieldAttributes.put(names.first, fieldType);\n    methodModel.setFieldName(names.first);\n    methodModel.setArgumentName(names.second);\n    methodModel.setFieldType(convertType(fieldType));\n  }\n\n  /**\n   * Populate model from given reflect setter method\n   *\n   * @param method the method to analyze\n   * @param methodModel the model to update\n   */\n  protected void analyzeDtoSetterMethod(Method method, MethodModel methodModel) {\n    methodModel.setSetter(true);\n    // add the parameter\n    Type fieldType = method.getGenericParameterTypes()[0];\n    Pair<String, String> names = getSetterFieldName(method);\n    fieldAttributes.put(names.first, fieldType);\n    methodModel.setFieldName(names.first);\n    methodModel.setArgumentName(names.second);\n    methodModel.setFieldType(convertType(fieldType));\n  }\n\n  /**\n   * Populate model from given reflect with method\n   *\n   * @param method the method to analyze\n   * @param methodModel the model to update\n   */\n  protected void analyzeDtoWithMethod(Method method, MethodModel methodModel) {\n    methodModel.setWith(true);\n    // add the parameter\n    Type fieldType = method.getGenericParameterTypes()[0];\n    Pair<String, String> names = getWithFieldName(method);\n    fieldAttributes.put(names.first, fieldType);\n    methodModel.setFieldName(names.first);\n    methodModel.setArgumentName(names.second);\n    methodModel.setFieldType(convertType(fieldType));\n  }\n\n  /**\n   * @return model of attributes\n   */\n  public List<FieldAttributeModel> getFieldAttributeModels() {\n    return fieldAttributeModels;\n  }\n\n  /**\n   * Gets the package name of this interface\n   *\n   * @return the package name of this interface\n   */\n  public String getPackageName() {\n    return this.dto.getPackage().getName();\n  }\n\n  /**\n   * Gets the package name of this interface, without 'dto', 'shared', 'api' sections and\n   * 'org.eclipse.' prefix\n   *\n   * @return the package name of this interface\n   */\n  public String getDTSPackageName() {\n    return convertToDTSPackageName(this.dto);\n  }\n\n  /**\n   * Gets the short (simple) name of the interface. Like HelloWorld if FQN class is\n   * foo.bar.HelloWorld\n   *\n   * @return the name of the interface\n   */\n  public String getSimpleName() {\n    return this.dto.getSimpleName();\n  }\n\n  /**\n   * Gets the FQN of this interface like foo.bar.HelloWorld\n   *\n   * @return the FQN name of this DTO interface\n   */\n  public String getName() {\n    return this.dto.getName();\n  }\n\n  /**\n   * Provides the model for every methods of the DTO that are getter/setter/with methods\n   *\n   * @return the list\n   */\n  public List<MethodModel> getMethods() {\n    return this.methods;\n  }\n\n  /**\n   * Gets the FQN of this interface like foo.bar.HelloWorld, but without 'Dto' suffix\n   *\n   * @return the name of the interface\n   */\n  public String getDtsName() {\n    return convertToDTSName(this.dto);\n  }\n\n  public String getInterfaces() {\n    return interfaces;\n  }\n\n  public boolean isExtendsDto() {\n    return extendsDto;\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/main/java/org/eclipse/che/plugin/typescript/dto/model/DtoNamespace.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto.model;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/** Class for storing all Dto TS namespace interfaces */\npublic class DtoNamespace {\n\n  private final String namespace;\n  private List<DtoModel> childs = new ArrayList<>();\n\n  public DtoNamespace(String namespace) {\n    this.namespace = namespace;\n  }\n\n  /**\n   * @return the namespace name\n   */\n  public String getNamespace() {\n    return namespace;\n  }\n\n  /**\n   * @return all interfaces that placed in this namespace\n   */\n  public List<DtoModel> getDtoInterfaces() {\n    return childs;\n  }\n\n  /**\n   * Add Dto in this namespace\n   *\n   * @param model the dto\n   */\n  public void addModel(DtoModel model) {\n    childs.add(model);\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/main/java/org/eclipse/che/plugin/typescript/dto/model/FieldAttributeModel.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto.model;\n\nimport static org.eclipse.che.plugin.typescript.dto.DTOHelper.convertType;\nimport static org.eclipse.che.plugin.typescript.dto.DTOHelper.convertTypeForDTS;\n\nimport com.google.gson.internal.Primitives;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * A field model will used for providing class generation of a DTO\n *\n * @author Florent Benoit\n */\npublic class FieldAttributeModel {\n\n  /** Typescript value of the type of the field */\n  private final String typeName;\n\n  /** For Map, List object, need to initialize field first. Like new Field<>() */\n  private boolean needInitialize;\n\n  /** Name of the field */\n  private String fieldName;\n\n  /** Java Type of the object (used internally) */\n  private Type type;\n\n  /** This field type is a List of objects ? */\n  private boolean isList;\n\n  /** This field type is a simple primitive */\n  private boolean isPrimitive;\n\n  /** This field type is a map */\n  private boolean isMap;\n\n  /** This list type is in fact a list of DTOs */\n  private boolean isListOfDto;\n\n  /** This map type is a map of DTOs */\n  private boolean isMapOfDto;\n\n  /**\n   * The type is a DTO or a list of DTO and then this value is the name of the DTO implementation\n   */\n  private String dtoImpl;\n\n  /** type is a DTO object. */\n  private boolean isDto;\n\n  /** type is a Enum object. */\n  private boolean isEnum;\n\n  /** Map key type */\n  private String mapKeyType;\n\n  /** Map value type */\n  private String mapValueType;\n\n  /** Dto type for d.ts */\n  private String dtsType;\n\n  /** Dto class where this field declared */\n  private Class declarationClass;\n\n  /**\n   * Build a new field model based on the name and Java type\n   *\n   * @param fieldName the name of the field\n   * @param type the Java raw type that will allow further analyzes\n   * @param declarationClass\n   */\n  public FieldAttributeModel(String fieldName, Type type, Class declarationClass) {\n    this.fieldName = fieldName;\n    this.type = type;\n    this.typeName = convertType(type);\n    this.dtsType = convertTypeForDTS(declarationClass, type);\n    this.declarationClass = declarationClass;\n\n    if (typeName.startsWith(\"Array<\") || typeName.startsWith(\"Map<\")) {\n      this.needInitialize = true;\n    }\n\n    if (this.type instanceof ParameterizedType) {\n      ParameterizedType parameterizedType = (ParameterizedType) this.type;\n      Type rawType = parameterizedType.getRawType();\n      analyzeParametrizedType(parameterizedType, rawType);\n    } else if (Primitives.isPrimitive(this.type)\n        || Primitives.isWrapperType(this.type)\n        || String.class.equals(this.type)) {\n      this.isPrimitive = true;\n    } else if (this.type instanceof Class && ((Class) this.type).isAnnotationPresent(DTO.class)) {\n      this.isDto = true;\n      dtoImpl = this.type.getTypeName() + \"Impl\";\n    } else if (this.type instanceof Class && ((Class) this.type).isEnum()) {\n      this.isEnum = true;\n    }\n  }\n\n  /**\n   * Analyze a complex parametrized type attribute (which can be a list or map for example)\n   *\n   * @param parameterizedType\n   * @param rawType\n   */\n  protected void analyzeParametrizedType(ParameterizedType parameterizedType, Type rawType) {\n    if (List.class.equals(rawType)) {\n      this.isList = true;\n      if (parameterizedType.getActualTypeArguments()[0] instanceof Class\n          && ((Class) parameterizedType.getActualTypeArguments()[0])\n              .isAnnotationPresent(DTO.class)) {\n        isListOfDto = true;\n        dtoImpl = convertType(parameterizedType.getActualTypeArguments()[0]) + \"Impl\";\n      }\n    } else if (Map.class.equals(rawType)) {\n      isMap = true;\n      mapKeyType =\n          convertTypeForDTS(declarationClass, parameterizedType.getActualTypeArguments()[0]);\n      if (parameterizedType.getActualTypeArguments()[1] instanceof Class\n          && ((Class) parameterizedType.getActualTypeArguments()[1])\n              .isAnnotationPresent(DTO.class)) {\n\n        isMapOfDto = true;\n        dtoImpl = convertType(parameterizedType.getActualTypeArguments()[1]) + \"Impl\";\n      }\n\n      mapValueType =\n          convertTypeForDTS(declarationClass, parameterizedType.getActualTypeArguments()[1]);\n    }\n  }\n\n  public String getTypeName() {\n    return typeName;\n  }\n\n  public String getFieldName() {\n    return fieldName;\n  }\n\n  public Type getType() {\n    return type;\n  }\n\n  public boolean isList() {\n    return isList;\n  }\n\n  public boolean isPrimitive() {\n    return isPrimitive;\n  }\n\n  public boolean isMap() {\n    return isMap;\n  }\n\n  public boolean isListOfDto() {\n    return isListOfDto;\n  }\n\n  public boolean isMapOfDto() {\n    return isMapOfDto;\n  }\n\n  public String getDtoImpl() {\n    return dtoImpl;\n  }\n\n  public boolean isDto() {\n    return isDto;\n  }\n\n  public boolean isNeedInitialize() {\n    return needInitialize;\n  }\n\n  public boolean isEnum() {\n    return isEnum;\n  }\n\n  public String getName() {\n    return this.fieldName;\n  }\n\n  public String getSimpleType() {\n    return this.typeName;\n  }\n\n  public String getMapKeyType() {\n    return mapKeyType;\n  }\n\n  public String getMapValueType() {\n    return mapValueType;\n  }\n\n  public String getDtsType() {\n    return dtsType;\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/main/java/org/eclipse/che/plugin/typescript/dto/model/MethodModel.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto.model;\n\nimport static java.util.Objects.hash;\nimport static org.eclipse.che.plugin.typescript.dto.DTOHelper.convertType;\n\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.stream.IntStream;\n\n/**\n * Defines the model of the method\n *\n * @author Florent Benoit\n */\npublic class MethodModel {\n\n  /** Reflect object used internally. */\n  private Method method;\n\n  /** Typescript return value of the method */\n  private String returnType;\n\n  /** List of parameters for this method */\n  private List<ParameterMethodModel> parameters;\n\n  /** This method is a DTO getter method */\n  private boolean isGetter;\n\n  /** This method is a DTO setter method */\n  private boolean isSetter;\n\n  /** This method is a DTO with method */\n  private boolean isWith;\n\n  /**\n   * Name of the field associated to this method (field to return for a getter, field to store for\n   * setter/with)\n   */\n  private String fieldName;\n\n  /** Type of the field associated to this method. */\n  private String fieldType;\n\n  /** Name of setter or with* method argument */\n  private String argumentName;\n\n  /**\n   * Build a new model around the DTO method.\n   *\n   * @param method\n   */\n  public MethodModel(Method method) {\n    this.method = method;\n    this.parameters = new ArrayList<>();\n    analyze();\n  }\n\n  /** Loop on all parameters and initialize return value as well */\n  protected void analyze() {\n    IntStream.range(0, method.getGenericParameterTypes().length)\n        .forEach(\n            i ->\n                parameters.add(\n                    new ParameterMethodModel(\n                        \"arg\" + i, convertType(method.getGenericParameterTypes()[i]))));\n\n    // add return type\n    this.returnType = convertType(method.getGenericReturnType());\n  }\n\n  public boolean isGetter() {\n    return isGetter;\n  }\n\n  public void setGetter(boolean getter) {\n    isGetter = getter;\n  }\n\n  public boolean isSetter() {\n    return isSetter;\n  }\n\n  public void setSetter(boolean setter) {\n    isSetter = setter;\n  }\n\n  public boolean isWith() {\n    return isWith;\n  }\n\n  public void setWith(boolean with) {\n    isWith = with;\n  }\n\n  public String getName() {\n    return this.method.getName();\n  }\n\n  public List<ParameterMethodModel> getParameters() {\n    return this.parameters;\n  }\n\n  public String getReturnType() {\n    return this.returnType;\n  }\n\n  public void setFieldName(String fieldName) {\n    this.fieldName = fieldName;\n  }\n\n  public String getFieldName() {\n    return fieldName;\n  }\n\n  public void setFieldType(String fieldType) {\n    this.fieldType = fieldType;\n  }\n\n  public String getFieldType() {\n    return fieldType;\n  }\n\n  public int hashCode() {\n    return hash(this.parameters.toString(), this.returnType);\n  }\n\n  public boolean equals(Object other) {\n    if (other == null) {\n      return false;\n    }\n    if (!(other instanceof MethodModel)) {\n      return false;\n    }\n    MethodModel methodModelOther = (MethodModel) other;\n    return this.getName().equals(methodModelOther.getName())\n        && this.returnType.equals(methodModelOther.returnType)\n        && Arrays.equals(this.parameters.toArray(), methodModelOther.parameters.toArray());\n  }\n\n  public String getArgumentName() {\n    return argumentName;\n  }\n\n  public void setArgumentName(String argumentName) {\n    this.argumentName = argumentName;\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/main/java/org/eclipse/che/plugin/typescript/dto/model/ParameterMethodModel.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto.model;\n\nimport static java.util.Objects.hash;\n\n/**\n * Defines the model link to parameter of a method\n *\n * @author Florent Benoit\n */\npublic class ParameterMethodModel {\n\n  /** Name of the parameter. */\n  private String parameterName;\n\n  /** Type of the parameter. (Type is in TypeScript format) */\n  private String parameterType;\n\n  /**\n   * Create a new instance of parameter model with specified name and type\n   *\n   * @param parameterName the name of the parameter like foo\n   * @param parameterType the type of the parameter (like foo.bar.MyDTO or primitive value like\n   *     string)\n   */\n  public ParameterMethodModel(String parameterName, String parameterType) {\n    this.parameterName = parameterName;\n    this.parameterType = parameterType;\n  }\n\n  /**\n   * Getter for the name\n   *\n   * @return the name of the parameter\n   */\n  public String getName() {\n    return this.parameterName;\n  }\n\n  /**\n   * Getter for the type\n   *\n   * @return the type of the parameter\n   */\n  public String getType() {\n    return this.parameterType;\n  }\n\n  public int hashCode() {\n    return hash(this.parameterName, this.parameterType);\n  }\n\n  public boolean equals(Object other) {\n    if (other == null) {\n      return false;\n    }\n    if (!(other instanceof ParameterMethodModel)) {\n      return false;\n    }\n    ParameterMethodModel parameterMethodModelOther = (ParameterMethodModel) other;\n    return this.parameterName.equals(parameterMethodModelOther.parameterName)\n        && this.parameterType.equals(((ParameterMethodModel) other).parameterType);\n  }\n\n  public String toString() {\n    return \"ParameterMethodModel[\" + this.parameterName + \"/\" + this.parameterType + \"]\";\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/main/resources/org/eclipse/che/plugin/typescript/dto/typescript.d.ts.template",
    "content": "// File has been generated automatically by Eclipse Che TypeScript DTO generator\n\n<dtoNamespaces: { namespaces |\n\n<! Write TypeScript DTO interface first !>\n\n<! BEGIN declare dto module !>\nexport namespace <namespaces.namespace> {\n\n  <! BEGIN declare interfaces !>\n<namespaces.dtoInterfaces: { dto |\n  // <dto.name>\n  export interface <dto.dtsName> <if(dto.extendsDto)>extends <dto.interfaces><endif> {\n     <! BEGIN declare fields !>\n  <dto.fieldAttributeModels:{ field |\n  <field.name>?: <if(field.map)> { [key: <field.mapKeyType>]: <field.mapValueType>; \\}<else><field.dtsType><endif>;\n}>  \\} <! END declare interface !>\n\n}>\\} <! END declare dto module !>\n}>\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/main/resources/org/eclipse/che/plugin/typescript/dto/typescript.template",
    "content": "// File has been generated automatically by Eclipse Che TypeScript DTO generator\n\n<dtos: { dto |\n\n<! Write TypeScript DTO interface first !>\n\n<! BEGIN declare dto module !>\nexport module <dto.packageName> {\n\n  <! BEGIN declare interface !>\n  export interface <dto.simpleName> {\n  <dto.methods : {method |\n    <method.name>(<method.parameters :{parameter | <if(!first(parameter))>,<endif><parameter.name>}>): <method.returnType>;\n  }>\n  toJson() : any;\n  \\} <! END declare interface !>\n\\} <! END declare dto module !>\n\n\n<! Now write TypeScript DTO implementation with suffix Impl !>\n<! BEGIN declare dto module !>\nexport module <dto.packageName> {\n\n  <! BEGIN declare class !>\n  export class <dto.simpleName>Impl implements <dto.name> {\n\n    <! BEGIN declare fields !>\n    <dto.fieldAttributeModels:{ field |\n    <field.name> : <field.simpleType>;\n    }>\n    <! add custom field for storing the JSON object !>\n    __jsonObject : any;\n\n    <! BEGIN constructor !>\n    constructor(__jsonObject?: any) {\n      this.__jsonObject = __jsonObject;\n      <dto.fieldAttributeModels:{ field |\n      <if(field.needInitialize)>\n      this.<field.name> = new <field.simpleType>();\n      <endif>\n      if (__jsonObject) {\n        if (__jsonObject.<field.name>) {\n          <! handle list object !>\n          <if(field.list)>\n            __jsonObject.<field.name>.forEach((item) => {\n            <if(field.listOfDto)>\n            this.<field.name>.push(new <field.dtoImpl>(item));\n            <else>\n            this.<field.name>.push(item);\n            <endif>\n            \\});\n          <endif>\n          <! handle map object !>\n          <if(field.map)>\n          let tmp : Array\\<any> = Object.keys(__jsonObject.<field.name>);\n          tmp.forEach((key) => {\n            <if(field.mapOfDto)>\n            this.<field.name>.set(key, new <field.dtoImpl>(__jsonObject.<field.name>[key]));\n            <else>\n            this.<field.name>.set(key, __jsonObject.<field.name>[key]);\n            <endif>\n           \\});\n          <endif>\n          <if(field.primitive)>\n          this.<field.name> = __jsonObject.<field.name>;\n          <endif>\n          <if(field.enum)>\n          this.<field.name> = __jsonObject.<field.name>;\n          <endif>\n          <if(field.dto)>\n          this.<field.name> = new <field.dtoImpl>(__jsonObject.<field.name>);\n          <endif>\n        \\}\n      \\}\n      }>\n    \\} <! END constructor !>\n\n    <! BEGIN write methods !>\n    <dto.methods : {method |\n    <! Generate Getter code !>\n    <if(method.getter)>\n    <method.name>() : <method.returnType> {\n      return this.<method.fieldName>;\n    \\}\n    <endif>\n    <! Generate setter code !>\n    <if(method.setter)>\n    <method.name>(<method.argumentName> : <method.fieldType>) : void {\n      this.<method.fieldName> = <method.argumentName>;\n    \\}\n    <endif>\n    <! Generate with code !>\n    <if(method.with)>\n    <method.name>(<method.argumentName> : <method.fieldType>) : <method.returnType> {\n      this.<method.fieldName> = <method.argumentName>;\n      return this;\n    \\}\n    <endif>\n  }> <! END write methods !>\n      <! Write the toJson() method !>\n      toJson() : any {\n        let json : any = {\\};\n\n            <dto.fieldAttributeModels:{ field |\n            if (this.<field.name>) {\n              <! handle list object !>\n              <if(field.list)>\n                let listArray = [];\n                this.<field.name>.forEach((item) => {\n                <if(field.listOfDto)>\n                listArray.push((item as <field.dtoImpl>).toJson());\n                <else>\n                listArray.push(item);\n                <endif>\n                json.<field.name> = listArray;\n                \\});\n              <endif>\n              <! handle map object !>\n              <if(field.map)>\n              let tmpMap : any = {\\};\n              for (const [key, value] of this.<field.name>.entries()) {\n                <if(field.mapOfDto)>\n                tmpMap[key] = (value as <field.dtoImpl>).toJson();\n                <else>\n                tmpMap[key] = value;\n                <endif>\n               \\}\n              json.<field.name> = tmpMap;\n              <endif>\n              <if(field.primitive)>\n              json.<field.name> = this.<field.name>;\n              <endif>\n              <if(field.enum)>\n              json.<field.name> = this.<field.name>;\n              <endif>\n              <if(field.dto)>\n              json.<field.name> = (this.<field.name> as <field.dtoImpl>).toJson();\n              <endif>\n            \\}\n            }>\n        return json;\n      \\}\n  \\} <! END declare class !>\n\\} <! END declare dto module !>\n\n}>\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/test/java/org/eclipse/che/plugin/typescript/dto/MyCustomDTO.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.plugin.typescript.dto.internal.InternalDto;\n\n/**\n * @author Florent Benoit\n */\n@DTO\npublic interface MyCustomDTO {\n\n  String getName();\n\n  void setName(String name);\n\n  MyCustomDTO withName(String name);\n\n  MyOtherDTO getConfig();\n\n  MyCustomDTO withConfig(MyOtherDTO otherDTO);\n\n  void setConfig(MyOtherDTO otherDTO);\n\n  void setStatus(Status status);\n\n  MyCustomDTO withStatus(Status status);\n\n  Status getStatus();\n\n  Map<String, MyOtherDTO> getCustomMap();\n\n  void setCustomMap(Map<String, MyOtherDTO> map);\n\n  MyCustomDTO withCustomMap(Map<String, MyOtherDTO> map);\n\n  // arguments is a reserved keyword for TypeScript\n  List<MyOtherDTO> getArguments();\n\n  void setArguments(List<MyOtherDTO> arguments);\n\n  MyCustomDTO withArguments(List<MyOtherDTO> arguments);\n\n  InternalDto getInternal();\n\n  void setInternal(InternalDto internal);\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/test/java/org/eclipse/che/plugin/typescript/dto/MyDtoWithSerializableDTO.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\nimport java.io.Serializable;\nimport java.util.Map;\nimport org.eclipse.che.dto.shared.DTO;\n\n@DTO\npublic interface MyDtoWithSerializableDTO {\n  Map<String, Serializable> getPreferences();\n\n  void setPreferences(Map<String, Serializable> preferences);\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/test/java/org/eclipse/che/plugin/typescript/dto/MyOtherDTO.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Florent Benoit\n */\n@DTO\npublic interface MyOtherDTO extends MySuperClassDTO, MySuperSuperClass {\n\n  void setName(String name);\n\n  MyOtherDTO withName(String name);\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/test/java/org/eclipse/che/plugin/typescript/dto/MySimpleDTO.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Florent Benoit\n */\n@DTO\npublic interface MySimpleDTO {\n\n  int getId();\n\n  MySimpleDTO withId(int id);\n\n  boolean getBoolean();\n\n  MySimpleDTO withBoolean(boolean bool);\n\n  double getDouble();\n\n  MySimpleDTO withDouble(double d);\n\n  float getFloat();\n\n  MySimpleDTO withFloat(float f);\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/test/java/org/eclipse/che/plugin/typescript/dto/MySuperClassDTO.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Florent Benoit\n */\n@DTO\npublic interface MySuperClassDTO extends MySuperSuperClass {\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getName();\n\n  void setName(String name);\n\n  MySuperClassDTO withName(String name);\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/test/java/org/eclipse/che/plugin/typescript/dto/MySuperSuperClass.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\n/**\n * @author Florent Benoit\n */\npublic interface MySuperSuperClass {\n\n  String getName();\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/test/java/org/eclipse/che/plugin/typescript/dto/Status.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\n/**\n * @author Florent Benoit\n */\npublic enum Status {\n  SHUTDOWN,\n\n  ALIVE\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/test/java/org/eclipse/che/plugin/typescript/dto/TypeScriptDTOGeneratorMojoTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto;\n\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertTrue;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.nio.file.Files;\nimport org.apache.maven.plugin.testing.MojoRule;\nimport org.apache.maven.plugin.testing.resources.TestResources;\nimport org.junit.Assert;\nimport org.junit.Rule;\nimport org.junit.Test;\n\n/**\n * @author Florent Benoit\n */\npublic class TypeScriptDTOGeneratorMojoTest {\n\n  /** Rule to manage the mojo (inject, get variables from mojo) */\n  @Rule public MojoRule rule = new MojoRule();\n\n  /** Resources of each test mapped on the name of the method */\n  @Rule public TestResources resources = new TestResources();\n\n  /**\n   * Helper method used to inject data in mojo\n   *\n   * @param mojo the mojo\n   * @param baseDir root dir on which we extract files\n   * @throws IllegalAccessException if unable to set variables\n   */\n  protected void configure(TypeScriptDTOGeneratorMojo mojo, File baseDir) throws Exception {\n    this.rule.setVariableValueToObject(mojo, \"targetDirectory\", this.resources.getBasedir(\"\"));\n    this.rule.setVariableValueToObject(mojo, \"useClassPath\", true);\n  }\n\n  /**\n   * Check that the TypeScript definition is generated and that WorkspaceDTO is generated\n   * (dependency is part of the test)\n   */\n  @Test\n  public void testCheckTypeScriptGenerated() throws Exception {\n\n    File projectCopy = this.resources.getBasedir(\"project\");\n    File pom = new File(projectCopy, \"pom.xml\");\n    assertNotNull(pom);\n    assertTrue(pom.exists());\n\n    TypeScriptDTOGeneratorMojo mojo =\n        (TypeScriptDTOGeneratorMojo) this.rule.lookupMojo(\"build\", pom);\n    configure(mojo, projectCopy);\n    mojo.execute();\n\n    File typeScriptFile = mojo.getTypescriptFile();\n    // Check file has been generated\n    Assert.assertTrue(typeScriptFile.exists());\n\n    // Now check there is \"org.eclipse.che.plugin.typescript.dto.MyCustomDTO\" inside\n    boolean foundMyCustomDTO = false;\n    try (BufferedReader reader = Files.newBufferedReader(typeScriptFile.toPath(), UTF_8)) {\n      String line = reader.readLine();\n      while (line != null && !foundMyCustomDTO) {\n        if (line.contains(\"MyCustomDTO\")) {\n          foundMyCustomDTO = true;\n        }\n        line = reader.readLine();\n      }\n    }\n\n    Assert.assertTrue(\n        \"The MyCustomDTO has not been generated in the typescript definition file.\",\n        foundMyCustomDTO);\n  }\n\n  @Test\n  public void checkDTSFileCreated() throws Exception {\n    File projectCopy = this.resources.getBasedir(\"project-d-ts\");\n    File pom = new File(projectCopy, \"pom.xml\");\n    assertNotNull(pom);\n    assertTrue(pom.exists());\n\n    TypeScriptDTOGeneratorMojo mojo =\n        (TypeScriptDTOGeneratorMojo) this.rule.lookupMojo(\"build\", pom);\n    configure(mojo, projectCopy);\n    mojo.execute();\n\n    File typeScriptFile = mojo.getTypescriptFile();\n    Assert.assertNotNull(typeScriptFile);\n\n    // Check file has been generated\n    Assert.assertTrue(typeScriptFile.exists());\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/test/java/org/eclipse/che/plugin/typescript/dto/internal/InternalDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto.internal;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n@DTO\npublic interface InternalDto {\n  String getInternalValue();\n\n  void setInternalValue(String value);\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/test/java/org/eclipse/che/plugin/typescript/dto/stub/TypeScriptDTOGeneratorMojoProjectStub.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.plugin.typescript.dto.stub;\n\nimport static org.mockito.Mockito.when;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.apache.maven.artifact.Artifact;\nimport org.apache.maven.artifact.versioning.VersionRange;\nimport org.apache.maven.model.Build;\nimport org.apache.maven.model.Model;\nimport org.apache.maven.model.io.xpp3.MavenXpp3Reader;\nimport org.apache.maven.plugin.testing.stubs.MavenProjectStub;\nimport org.codehaus.plexus.util.ReaderFactory;\nimport org.mockito.Mockito;\n\n/**\n * @author Florent Benoit\n */\npublic class TypeScriptDTOGeneratorMojoProjectStub extends MavenProjectStub {\n\n  /** {@inheritDoc} */\n  @Override\n  public File getBasedir() {\n    return new File(super.getBasedir() + \"/src/test/projects/project\");\n  }\n\n  /** Default constructor */\n  public TypeScriptDTOGeneratorMojoProjectStub() {\n    MavenXpp3Reader pomReader = new MavenXpp3Reader();\n    Model model;\n    try {\n      model = pomReader.read(ReaderFactory.newXmlReader(new File(getBasedir(), \"pom.xml\")));\n      setModel(model);\n    } catch (Exception e) {\n      throw new RuntimeException(e);\n    }\n\n    setGroupId(model.getGroupId());\n    setArtifactId(model.getArtifactId());\n    setVersion(model.getVersion());\n    setName(model.getName());\n    setUrl(model.getUrl());\n    setPackaging(model.getPackaging());\n\n    Build build = new Build();\n    build.setFinalName(model.getArtifactId());\n    build.setDirectory(getBasedir() + \"/target\");\n    build.setSourceDirectory(getBasedir() + \"/src/main/java\");\n    build.setOutputDirectory(getBasedir() + \"/target/classes\");\n    build.setTestSourceDirectory(getBasedir() + \"/src/test/java\");\n    build.setTestOutputDirectory(getBasedir() + \"/target/test-classes\");\n    setBuild(build);\n\n    List compileSourceRoots = new ArrayList();\n    compileSourceRoots.add(getBasedir() + \"/src/main/java\");\n    setCompileSourceRoots(compileSourceRoots);\n\n    List testCompileSourceRoots = new ArrayList();\n    testCompileSourceRoots.add(getBasedir() + \"/src/test/java\");\n    setTestCompileSourceRoots(testCompileSourceRoots);\n  }\n\n  /** Use of mockito artifact */\n  @Override\n  public Artifact getArtifact() {\n    Artifact artifact = Mockito.mock(Artifact.class);\n    when(artifact.getArtifactId()).thenReturn(getModel().getArtifactId());\n    when(artifact.getGroupId()).thenReturn(getModel().getGroupId());\n    when(artifact.getVersion()).thenReturn(getModel().getVersion());\n    when(artifact.getVersionRange())\n        .thenReturn(VersionRange.createFromVersion(getModel().getVersion()));\n    return artifact;\n  }\n}\n"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/test/projects/project/pom.xml",
    "content": "<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>org.eclipse.che.test</groupId>\n    <artifactId>my-typescript-test-module</artifactId>\n    <version>1.0-SNAPSHOT</version>\n    <packaging>pom</packaging>\n    <name>Test of Eclipse Che TypeScript plugin</name>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-typescript-dto-maven-plugin</artifactId>\n                <configuration>\n                    <project implementation=\"org.eclipse.che.plugin.typescript.dto.stub.TypeScriptDTOGeneratorMojoProjectStub\"/>\n                </configuration>\n                <extensions>true</extensions>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "core/che-core-typescript-dto-maven-plugin/src/test/projects/project-d-ts/pom.xml",
    "content": "<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>org.eclipse.che.test</groupId>\n    <artifactId>my-typescript-test-module</artifactId>\n    <version>1.0-SNAPSHOT</version>\n    <packaging>pom</packaging>\n    <name>Test of Eclipse Che TypeScript plugin</name>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-typescript-dto-maven-plugin</artifactId>\n                <configuration>\n                    <dts>true</dts>\n                    <project implementation=\"org.eclipse.che.plugin.typescript.dto.stub.TypeScriptDTOGeneratorMojoProjectStub\"/>\n                </configuration>\n                <extensions>true</extensions>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "core/commons/che-core-commons-annotations/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-commons-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-commons-annotations</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: Commons :: Annotations</name>\n\n    <dependencies>\n        <dependency>\n            <!-- for the @Beta annotation -->\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n            <scope>provided</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "core/commons/che-core-commons-annotations/src/main/java/org/eclipse/che/commons/annotation/Nullable.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.annotation;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\n/**\n * @author Mihail Kuznyetsov\n */\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface Nullable {}\n"
  },
  {
    "path": "core/commons/che-core-commons-annotations/src/main/java/org/eclipse/che/commons/annotation/Traced.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.annotation;\n\nimport com.google.common.annotations.Beta;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\nimport java.util.ArrayDeque;\nimport java.util.Collections;\nimport java.util.Deque;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.function.Supplier;\n\n/**\n * Annotates a method as traced.\n *\n * <p>If the method is declared in a Guice-managed class and the Guice environment is equipped with\n * an interceptor for handling this annotation (which should be the case at least in the workspace\n * server), each call of such method will create a new span declared as a child of some current\n * span, if any, with the provided name (or the default name).\n *\n * <p>The method can declare additional tags in its body that will be applied to the span, see\n * {@link Tags}.\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\n@Beta\npublic @interface Traced {\n\n  /**\n   * The name of the span generated for the method. Defaults to the \"classSimpleName#methodName\".\n   */\n  String name() default \"\";\n\n  /**\n   * Use this class to statically set the tags on the span generated for a {@code @Traced} method.\n   * Note that the tags are applied <b>after</b> the method is invoked no matter where in the method\n   * they are set.\n   */\n  final class Tags {\n\n    /** Adds a new tag. If the tag already exists, it is NOT updated. */\n    public static void addString(String tagName, Supplier<String> valueSupplier) {\n      internalAdd(tagName, valueSupplier);\n    }\n\n    /** Adds a new tag. If the tag already exists, it is NOT updated. */\n    public static void addBoolean(String tagName, Supplier<Boolean> valueSupplier) {\n      internalAdd(tagName, valueSupplier);\n    }\n\n    /** Adds a new tag. If the tag already exists, it is NOT updated. */\n    public static void addInteger(String tagName, Supplier<Integer> valueSupplier) {\n      internalAdd(tagName, valueSupplier);\n    }\n\n    private static void internalAdd(String tagName, Supplier<?> value) {\n      Map<String, Supplier<?>> tags = TagsStack.TAGS.get().peek();\n      if (tags != null) {\n        tags.putIfAbsent(tagName, value);\n      }\n    }\n  }\n\n  /**\n   * This class is not meant for use in methods annotated with {@code @Traced}, rather it is used by\n   * the interceptor wrapping those methods setting up tags storage for each {@code @Traced} method.\n   *\n   * <p>This class supports {@link Tags} so that it can be correctly and easily used from the\n   * annotated methods.\n   */\n  final class TagsStack {\n\n    private static final ThreadLocal<Deque<Map<String, Supplier<?>>>> TAGS =\n        ThreadLocal.withInitial(ArrayDeque::new);\n\n    private TagsStack() {\n      throw new AssertionError(\"I shall not be instantiated.\");\n    }\n\n    public static Map<String, Supplier<?>> pop() {\n      Deque<Map<String, Supplier<?>>> tagsStack = TAGS.get();\n      if (tagsStack.isEmpty()) {\n        return Collections.emptyMap();\n      }\n\n      Map<String, Supplier<?>> tags = tagsStack.pop();\n\n      return Collections.unmodifiableMap(tags);\n    }\n\n    public static void push() {\n      // we're assuming max 4 tags per span is gonna be the usual case. Saving 12 entries per method\n      // invocation will make a GC difference. If there are more than 4 tags, we're adding runtime\n      // overhead of enlarging the hash map but that's not gonna be a usual occurrence (currently,\n      // we have at most 3 tags on a span).\n      TAGS.get().push(new HashMap<>(4));\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-commons-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-commons-inject</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: Commons :: Dependency Injecting</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.annotation</groupId>\n            <artifactId>jakarta.annotation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-guice-servlet</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-integration-guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <configuration>\n                    <environmentVariables>\n                        <CHE_LOCAL_CONF_DIR>${project.build.directory}/conf</CHE_LOCAL_CONF_DIR>\n                        <CHE_SOME_OTHER_NAME>che_underscore_environment_variable_value</CHE_SOME_OTHER_NAME>\n                        <CHE_SOME_OTHER_NAME__WITH__UNDERSCORES>che_underscore_environment_variable_value_with_underscores_in_name</CHE_SOME_OTHER_NAME__WITH__UNDERSCORES>\n                    </environmentVariables>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/CheBootstrap.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport static java.lang.String.format;\nimport static java.util.stream.Collectors.toList;\nimport static java.util.stream.Collectors.toSet;\nimport static org.eclipse.che.inject.lifecycle.DestroyErrorHandler.LOG_HANDLER;\n\nimport com.google.common.base.Splitter;\nimport com.google.common.io.Files;\nimport com.google.inject.AbstractModule;\nimport com.google.inject.Injector;\nimport com.google.inject.Module;\nimport com.google.inject.name.Names;\nimport com.google.inject.servlet.ServletModule;\nimport com.google.inject.util.Modules;\nimport com.google.inject.util.Providers;\nimport jakarta.annotation.PostConstruct;\nimport jakarta.annotation.PreDestroy;\nimport jakarta.servlet.ServletContext;\nimport jakarta.servlet.ServletContextEvent;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.Reader;\nimport java.net.URL;\nimport java.nio.charset.Charset;\nimport java.util.AbstractMap.SimpleEntry;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Properties;\nimport java.util.Set;\nimport java.util.function.Function;\nimport java.util.function.Predicate;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.eclipse.che.inject.lifecycle.DestroyModule;\nimport org.eclipse.che.inject.lifecycle.Destroyer;\nimport org.eclipse.che.inject.lifecycle.InitModule;\nimport org.everrest.guice.servlet.EverrestGuiceContextListener;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * CheBootstrap is entry point of Che application implemented as ServletContextListener.\n *\n * <ul>\n *   <li>Initializes Guice Injector\n *   <li>Automatically binds all the subclasses of com.google.inject.Module annotated with\n *       &#064DynaModule\n *   <li>Loads configuration from .properties and .xml files located in <i>/WEB-INF/classes/che</i>\n *       directory\n *   <li>Overrides it with external configuration located in directory pointed by\n *       <i>CHE_LOCAL_CONF_DIR</i> env variable (if any)\n *   <li>Binds all environment variables (visible as prefixed with \"env.\") and system properties\n *       (visible as prefixed with \"sys.\")\n *   <li>Thanks to Everrest integration injects all the properly annotated (see Everrest docs) REST\n *       Resources. Providers and ExceptionMappers and inject necessary dependencies\n * </ul>\n *\n * <p>Configuration properties are bound as a {@code &#064Named}. For example: Following entry in\n * the .property file: {@code myProp=value} may be injected into constructor (other options are\n * valid too of course) as following:\n *\n * <pre>\n * &#064Inject\n * public MyClass(&#064Named(\"myProp\") String my) {\n * }\n * </pre>\n *\n * <p>It's possible to use system properties or environment variables in .properties files.\n *\n * <pre>\n * my_app.input_dir=${root_data}/input/\n * my_app.output_dir=${root_data}/output/\n * </pre>\n *\n * NOTE: System property always takes preference on environment variable with the same name.\n *\n * <p>\n *\n * <table>\n * <tr><th>Value</th><th>System property</th><th>Environment variable</th><th>Result</th></tr>\n * <tr><td>${root_data}/input/</td><td>/home/andrew/temp</td><td>&nbsp;</td><td>/home/andrew/temp/input/</td></tr>\n * <tr><td>${root_data}/input/</td><td>&nbsp;</td><td>/usr/local</td><td>/usr/local/input/</td></tr>\n * <tr><td>${root_data}/input/</td><td>/home/andrew/temp</td><td>/usr/local</td><td>/home/andrew/temp/input/</td></tr>\n * <tr><td>${root_data}/input/</td><td>&nbsp;</td><td>&nbsp;</td><td>${root_data}/input/</td></tr>\n * </table>\n *\n * During code evolution might be the case when someone will want to rename some property. This\n * brings a couple of problems like support of old property name in external plugins and support old\n * configuration values in code with the new property name. To cover these cases there is a file\n * che_aliases.properties that contains old names of all existed properties. It has such format\n * current_name =old_name, very_old_name. In this case will be such binding.\n *\n * <p>Always current_name = current_value if old_name property exist it will be binded to old_value\n * and current_name = old_value and very_old_name = old_value if very_old_name property exist it\n * will be binded to very_old_value, and current_name = very_old_value and old_name = very_old_value\n *\n * <p>NOTE: it's prohibited to use a different name for same property on the same level. From the\n * example above - you can use environment property CHE_CURRENT_NAME and CHE_OLD_NAME. But you can\n * use it on a different level, for instance, environment property and system property.\n *\n * @author gazarenkov\n * @author andrew00x\n * @author Florent Benoit\n * @author Sergii Kabashniuk\n */\npublic class CheBootstrap extends EverrestGuiceContextListener {\n  private static final Logger LOG = LoggerFactory.getLogger(CheBootstrap.class);\n\n  /** Environment variable that is used to override some Che settings properties. */\n  public static final String CHE_LOCAL_CONF_DIR = \"CHE_LOCAL_CONF_DIR\";\n\n  public static final String PROPERTIES_ALIASES_CONFIG_FILE = \"che_aliases.properties\";\n\n  /** Path to the internal folder that is expected in WEB-INF/classes */\n  private static final String WEB_INF_RESOURCES = \"che\";\n\n  /** Backward compliant path to the internal folder that is expected in WEB-INF/classes */\n  private static final String COMPLIANT_WEB_INF_RESOURCES = \"codenvy\";\n\n  private static final String NULL = \"NULL\";\n\n  private final List<Module> modules = new ArrayList<>();\n\n  static {\n    Thread.setDefaultUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance());\n  }\n\n  @Override\n  public void contextDestroyed(ServletContextEvent sce) {\n    final ServletContext ctx = sce.getServletContext();\n    final Injector injector = getInjector(ctx);\n    if (injector != null) {\n      injector.getInstance(Destroyer.class).destroy();\n    }\n    super.contextDestroyed(sce);\n  }\n\n  @Override\n  protected List<Module> getModules() {\n    // based on logic that getServletModule() is called BEFORE getModules() in the\n    // EverrestGuiceContextListener\n    modules.add(new InitModule(PostConstruct.class));\n    modules.add(new DestroyModule(PreDestroy.class, LOG_HANDLER));\n    modules.add(new URIConverter());\n    modules.add(new URLConverter());\n    modules.add(new FileConverter());\n    modules.add(new PathConverter());\n    modules.add(new StringArrayConverter());\n    modules.add(new PairConverter());\n    modules.add(new PairArrayConverter());\n    modules.addAll(ModuleScanner.findModules());\n    Map<String, Set<String>> aliases = readConfigurationAliases();\n    Module firstConfigurationPermutation =\n        Modules.override(new WebInfConfiguration(aliases)).with(new ExtConfiguration(aliases));\n    Module secondConfigurationPermutation =\n        Modules.override(firstConfigurationPermutation)\n            .with(new CheSystemPropertiesConfigurationModule(aliases));\n    Module lastConfigurationPermutation =\n        Modules.override(secondConfigurationPermutation)\n            .with(new CheEnvironmentVariablesConfigurationModule(aliases));\n    modules.add(lastConfigurationPermutation);\n    return modules;\n  }\n\n  private Map<String, Set<String>> readConfigurationAliases() {\n    URL aliasesResource = getClass().getClassLoader().getResource(PROPERTIES_ALIASES_CONFIG_FILE);\n    Map<String, Set<String>> aliases = new HashMap<>();\n    if (aliasesResource != null) {\n      Properties properties = new Properties();\n      File aliasesFile = new File(aliasesResource.getFile());\n      try (Reader reader = Files.newReader(aliasesFile, Charset.forName(\"UTF-8\"))) {\n        properties.load(reader);\n      } catch (IOException e) {\n        throw new IllegalStateException(\n            format(\"Unable to read configuration aliases from file %s\", aliasesFile), e);\n      }\n      for (Map.Entry<Object, Object> entry : properties.entrySet()) {\n        String value = (String) entry.getValue();\n        aliases.put(\n            (String) entry.getKey(),\n            Splitter.on(',').splitToList(value).stream().map(String::trim).collect(toSet()));\n      }\n    }\n    return aliases;\n  }\n\n  /**\n   * see http://google-guice.googlecode.com/git/javadoc/com/google/inject/servlet/ServletModule.html\n   */\n  @Override\n  protected ServletModule getServletModule() {\n    // Servlets and other web components may be configured with custom Modules.\n    return null;\n  }\n\n  /** ConfigurationModule binding configuration located in <i>/WEB-INF/classes/che</i> directory */\n  static class WebInfConfiguration extends AbstractConfigurationModule {\n    WebInfConfiguration(Map<String, Set<String>> aliases) {\n      super(aliases);\n    }\n\n    protected void configure() {\n      URL compliantWebInfConf =\n          getClass().getClassLoader().getResource(COMPLIANT_WEB_INF_RESOURCES);\n      if (compliantWebInfConf != null) {\n        bindConf(new File(compliantWebInfConf.getFile()));\n      }\n      URL webInfConf = getClass().getClassLoader().getResource(WEB_INF_RESOURCES);\n      if (webInfConf != null) {\n        bindConf(new File(webInfConf.getFile()));\n      }\n    }\n  }\n\n  /**\n   * ConfigurationModule binding environment variables, system properties and configuration in\n   * directory pointed by <i>CHE_LOCAL_CONF_DIR</i> Env variable.\n   */\n  static class ExtConfiguration extends AbstractConfigurationModule {\n    ExtConfiguration(Map<String, Set<String>> aliases) {\n      super(aliases);\n    }\n\n    @Override\n    protected void configure() {\n      bindProperties(\"env.\", System.getenv());\n      bindProperties(\"sys.\", System.getProperties());\n      String extConfig = System.getenv(CHE_LOCAL_CONF_DIR);\n      if (extConfig != null) {\n        bindConf(new File(extConfig));\n      }\n    }\n  }\n\n  static class CheSystemPropertiesConfigurationModule extends AbstractConfigurationModule {\n    CheSystemPropertiesConfigurationModule(Map<String, Set<String>> aliases) {\n      super(aliases);\n    }\n\n    @Override\n    protected void configure() {\n      Iterable<Map.Entry<Object, Object>> cheProperties =\n          System.getProperties().entrySet().stream()\n              .filter(new PropertyNamePrefixPredicate<>(\"che.\", \"codenvy.\"))\n              .collect(toList());\n      bindProperties(null, cheProperties);\n    }\n  }\n\n  static class CheEnvironmentVariablesConfigurationModule extends AbstractConfigurationModule {\n    CheEnvironmentVariablesConfigurationModule(Map<String, Set<String>> aliases) {\n      super(aliases);\n    }\n\n    @Override\n    protected void configure() {\n      Iterable<Map.Entry<String, String>> cheProperties =\n          System.getenv().entrySet().stream()\n              .filter(new PropertyNamePrefixPredicate<>(\"CHE_\", \"CODENVY_\"))\n              .map(new EnvironmentVariableToSystemPropertyFormatNameConverter())\n              .collect(toList());\n      bindProperties(null, cheProperties);\n    }\n  }\n\n  static class PropertyNamePrefixPredicate<K, V> implements Predicate<Map.Entry<K, V>> {\n    final String[] prefixes;\n\n    PropertyNamePrefixPredicate(String... prefix) {\n      this.prefixes = prefix;\n    }\n\n    @Override\n    public boolean test(Map.Entry<K, V> entry) {\n      for (String prefix : prefixes) {\n        if (((String) entry.getKey()).startsWith(prefix)) {\n          return true;\n        }\n      }\n      return false;\n    }\n  }\n\n  static class PropertyNamePrefixRemover<K, V>\n      implements Function<Map.Entry<K, V>, Map.Entry<String, V>> {\n    final int prefixLength;\n\n    PropertyNamePrefixRemover(int prefixLength) {\n      this.prefixLength = prefixLength;\n    }\n\n    @Override\n    public Map.Entry<String, V> apply(Map.Entry<K, V> entry) {\n      return new SimpleEntry<>(((String) entry.getKey()).substring(prefixLength), entry.getValue());\n    }\n  }\n\n  static class EnvironmentVariableToSystemPropertyFormatNameConverter\n      implements Function<Map.Entry<String, String>, Map.Entry<String, String>> {\n    @Override\n    public Map.Entry<String, String> apply(Map.Entry<String, String> entry) {\n      String name = entry.getKey();\n      name = name.toLowerCase();\n      // replace single underscore with dot and double underscores with single underscore\n      // at first replace double underscores with equal sign which is forbidden in env variable name\n      // then replace single underscores\n      // then recover underscore from equal sign\n      name = name.replace(\"__\", \"=\");\n      name = name.replace('_', '.');\n      name = name.replace(\"=\", \"_\");\n      return new SimpleEntry<>(name, entry.getValue());\n    }\n  }\n\n  private static final Pattern PROPERTIES_PLACE_HOLDER_PATTERN =\n      Pattern.compile(\"\\\\$\\\\{[^\\\\}^\\\\$\\\\{]+\\\\}\");\n\n  abstract static class AbstractConfigurationModule extends AbstractModule {\n    final Map<String, Set<String>> bindMap;\n\n    AbstractConfigurationModule(Map<String, Set<String>> aliases) {\n      this.bindMap = new HashMap<>(aliases);\n      for (Entry<String, Set<String>> entry : aliases.entrySet()) {\n        for (String alias : entry.getValue()) {\n          Set<String> newAliases = new HashSet<>(entry.getValue());\n          newAliases.remove(alias);\n          newAliases.add(entry.getKey());\n          bindMap.put(alias, newAliases);\n        }\n      }\n    }\n\n    protected void bindConf(File confDir) {\n      final File[] files = confDir.listFiles();\n      if (files != null) {\n        for (File file : files) {\n          if (!file.isDirectory()) {\n            if (\"properties\".equals(Files.getFileExtension(file.getName()))) {\n              Properties properties = new Properties();\n              try (Reader reader = Files.newReader(file, Charset.forName(\"UTF-8\"))) {\n                properties.load(reader);\n              } catch (IOException e) {\n                throw new IllegalStateException(\n                    format(\"Unable to read configuration file %s\", file), e);\n              }\n              bindProperties(properties);\n            }\n          }\n        }\n      }\n    }\n\n    protected void bindProperties(Properties properties) {\n      bindProperties(null, properties.entrySet());\n    }\n\n    protected void bindProperties(String prefix, Properties properties) {\n      bindProperties(prefix, properties.entrySet());\n    }\n\n    protected void bindProperties(String prefix, Map<String, String> properties) {\n      bindProperties(prefix, properties.entrySet(), true);\n    }\n\n    protected <K, V> void bindProperties(String prefix, Iterable<Map.Entry<K, V>> properties) {\n      bindProperties(prefix, properties, false);\n    }\n\n    protected <K, V> void bindProperties(\n        String prefix, Iterable<Map.Entry<K, V>> properties, boolean skipUnresolved) {\n      StringBuilder buf = null;\n      for (Map.Entry<K, V> e : properties) {\n        String name = (String) e.getKey();\n        String value = (String) e.getValue();\n        if (NULL.equals(value)) {\n          bindProperty(prefix, name, null);\n        } else {\n          final Matcher matcher = PROPERTIES_PLACE_HOLDER_PATTERN.matcher(value);\n          if (matcher.find()) {\n            int start = 0;\n            if (buf == null) {\n              buf = new StringBuilder();\n            } else {\n              buf.setLength(0);\n            }\n            do {\n              buf.append(value.substring(start, matcher.start()));\n              final String placeholder = value.substring(matcher.start(), matcher.end());\n              final String placeholderName = removePlaceholderFormatting(placeholder);\n              String resolvedPlaceholder = resolvePlaceholder(placeholderName);\n              if (resolvedPlaceholder != null) {\n                buf.append(resolvedPlaceholder);\n              } else if (skipUnresolved) {\n                buf.append(placeholder);\n                LOG.warn(\n                    \"Placeholder {} cannot be resolved neither from environment variable nor from system property, \"\n                        + \"leaving as is.\",\n                    placeholderName);\n              } else {\n                throw new ConfigurationException(\n                    format(\n                        \"%s is not a system property or environment variable.\", placeholderName));\n              }\n\n              start = matcher.end();\n            } while (matcher.find());\n            buf.append(value.substring(start));\n            value = buf.toString();\n          }\n          bindProperty(prefix, name, value);\n        }\n      }\n    }\n\n    private void bindProperty(String prefix, String name, String value) {\n      String key = prefix == null ? name : (prefix + name);\n      Set<String> aliasesForName = bindMap.get(name);\n      if (value == null) {\n        LOG.debug(\"Binding `{}` to `null`\", key);\n        bind(String.class).annotatedWith(Names.named(key)).toProvider(Providers.<String>of(null));\n        if (aliasesForName != null) {\n          for (String alias : aliasesForName) {\n            String bindKey = prefix == null ? alias : prefix + alias;\n            LOG.debug(\"Binding `{}` to `null`\", bindKey);\n            bind(String.class)\n                .annotatedWith(Names.named(bindKey))\n                .toProvider(Providers.<String>of(null));\n          }\n        }\n      } else {\n        LOG.debug(\"Binding `{}` to `{}`\", key, value);\n        bindConstant().annotatedWith(Names.named(key)).to(value);\n        if (aliasesForName != null) {\n          for (String alias : aliasesForName) {\n            String bindKey = prefix == null ? alias : prefix + alias;\n            LOG.debug(\"Binding `{}` to `{}`\", bindKey, value);\n            bindConstant().annotatedWith(Names.named(bindKey)).to(value);\n          }\n        }\n      }\n    }\n\n    private String removePlaceholderFormatting(String placeholder) {\n      return placeholder.substring(2, placeholder.length() - 1);\n    }\n\n    private String resolvePlaceholder(String placeholderName) {\n      String resolved = System.getProperty(placeholderName);\n      if (resolved == null) {\n        resolved = System.getenv(placeholderName);\n      }\n      LOG.debug(\"Resolving `{}` to `{}`\", placeholderName, resolved);\n      return resolved;\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/ConfigurationException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\n/**\n * Exception happen during guice configuration phase.\n *\n * @author Sergii Kabashniuk\n */\npublic class ConfigurationException extends RuntimeException {\n  public ConfigurationException(String message) {\n    super(message);\n  }\n\n  public ConfigurationException(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/ConfigurationProperties.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport com.google.inject.Binding;\nimport com.google.inject.Injector;\nimport com.google.inject.Key;\nimport java.lang.annotation.Annotation;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.regex.Pattern;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\n\n/**\n * Helper for getting set of configuration properties by name's pattern.\n *\n * <pre>{@code\n * public class Service {\n *     private Map<String, String> configuration;\n *     &#0064;Inject\n *     Service(ConfigurationProperties configurationProperties) {\n *         configuration = configurationProperties.getProperties(\"test.*\");\n *     }\n *     ...\n * }\n * }</pre>\n *\n * @author andrew00x\n */\n@Singleton\npublic class ConfigurationProperties {\n  private final Provider<Injector> injectorProvider;\n\n  @Inject\n  ConfigurationProperties(Provider<Injector> injectorProvider) {\n    this.injectorProvider = injectorProvider;\n  }\n\n  public Map<String, String> getProperties(String namePattern) {\n    final Pattern pattern = Pattern.compile(namePattern);\n    final Map<String, String> result = new HashMap<>();\n    for (Map.Entry<Key<?>, Binding<?>> keyBindingEntry :\n        injectorProvider.get().getAllBindings().entrySet()) {\n      final Key<?> key = keyBindingEntry.getKey();\n      final Annotation annotation = key.getAnnotation();\n      if (annotation instanceof com.google.inject.name.Named\n          && key.getTypeLiteral().getRawType() == String.class) {\n        final String name = ((com.google.inject.name.Named) annotation).value();\n        if (name != null && pattern.matcher(name).matches()) {\n          final String value = (String) keyBindingEntry.getValue().getProvider().get();\n          result.put(name, value);\n        }\n      }\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/DynaModule.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\n/**\n * Marker annotation for dynamically created modules.\n *\n * <p>{@link CheBootstrap} automatically finds and loads Guice modules (subclasses of {@link\n * com.google.inject.Module}) annotated with &#064DynaModule.\n *\n * @author gazarenkov\n */\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface DynaModule {}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/FileConverter.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.matcher.Matchers;\nimport com.google.inject.spi.TypeConverter;\nimport java.io.File;\n\n/**\n * @author andrew00x\n */\npublic class FileConverter extends AbstractModule implements TypeConverter {\n  @Override\n  public Object convert(String value, TypeLiteral<?> toType) {\n    return new File(value);\n  }\n\n  @Override\n  protected void configure() {\n    convertToTypes(Matchers.only(TypeLiteral.get(File.class)), this);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/Matchers.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport static java.util.Objects.requireNonNull;\n\nimport com.google.inject.matcher.AbstractMatcher;\nimport com.google.inject.matcher.Matcher;\nimport java.lang.reflect.Method;\nimport org.aopalliance.intercept.MethodInterceptor;\n\n/**\n * Matcher implementations. Supports matching methods. It can be used for binding of {@link\n * MethodInterceptor}.\n *\n * <p>Example of usage: <code>\n *  bindInterceptor(com.google.inject.matcher.Matchers.subclassesOf(SomeClass.class), Matcher.names(\"getInstance\"), new MethodInterceptor() {...});}\n * </code>\n *\n * @author Sergii Leschenko\n */\npublic class Matchers {\n  private Matchers() {}\n\n  /** Returns a matcher which matches methods with matching name. */\n  public static Matcher<Method> names(String methodName) {\n    return new Names(methodName);\n  }\n\n  private static class Names extends AbstractMatcher<Method> {\n    private String methodName;\n\n    private Names(String methodName) {\n      requireNonNull(methodName, \"methodName\");\n      this.methodName = methodName;\n    }\n\n    @Override\n    public boolean matches(Method m) {\n      return m.getName().equals(methodName);\n    }\n\n    @Override\n    public boolean equals(Object other) {\n      return other == this\n          || other instanceof Names && ((Names) other).methodName.equals(methodName);\n    }\n\n    @Override\n    public int hashCode() {\n      return 37 * methodName.hashCode();\n    }\n\n    @Override\n    public String toString() {\n      return \"names(\" + methodName + \")\";\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/ModuleFinder.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport com.google.inject.Module;\nimport java.util.List;\n\n/**\n * Interface used for ServiceLoader mechanism. Implementations will have to implement this interface\n * to provide list of modules at runtime\n *\n * @author Florent Benoit\n */\npublic interface ModuleFinder {\n\n  /**\n   * Provides the list of additional modules\n   *\n   * @return the list of modules to add.\n   */\n  List<Module> getModules();\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/ModuleScanner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.inject.Module;\nimport jakarta.servlet.ServletContainerInitializer;\nimport jakarta.servlet.ServletContext;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.annotation.HandlesTypes;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.ServiceLoader;\nimport java.util.Set;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Utility for finding Guice modules annotated with &#064DynaModule. */\n@HandlesTypes({DynaModule.class})\npublic class ModuleScanner implements ServletContainerInitializer {\n  private static final Logger LOG = LoggerFactory.getLogger(ModuleScanner.class);\n\n  @VisibleForTesting static final List<Module> modules = new ArrayList<>();\n\n  public static List<Module> findModules() {\n    // also search if classes are provided through service loader mechanism\n    // It's useful when the scanning is disabled or ServletContainerInitializer is disabled.\n    // onStartup may not be called at all so it's another way of plugging modules.\n    ServiceLoader<ModuleFinder> moduleFinderServiceLoader = ServiceLoader.load(ModuleFinder.class);\n    moduleFinderServiceLoader.forEach(moduleFinder -> modules.addAll(moduleFinder.getModules()));\n    return new ArrayList<>(modules);\n  }\n\n  @Override\n  public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {\n    if (c != null) {\n      for (Class<?> clazz : c) {\n        if (Module.class.isAssignableFrom(clazz)) {\n          try {\n            modules.add((Module) clazz.newInstance());\n          } catch (Exception e) {\n            LOG.error(\"Problem with instantiating Module {} : {}\", clazz, e.getMessage());\n          }\n        } else {\n          LOG.warn(\n              \"Ignored non {} class annotated with {}\",\n              Module.class.getName(),\n              DynaModule.class.getName());\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/PairArrayConverter.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport com.google.common.base.Splitter;\nimport com.google.common.collect.Iterables;\nimport com.google.inject.AbstractModule;\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.matcher.Matchers;\nimport com.google.inject.spi.TypeConverter;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * @author andrew00x\n */\npublic class PairArrayConverter extends AbstractModule implements TypeConverter {\n  @Override\n  public Object convert(String value, TypeLiteral<?> toType) {\n    final String[] pairs = Iterables.toArray(Splitter.on(\",\").split(value), String.class);\n    @SuppressWarnings(\"unchecked\")\n    final Pair<String, String>[] result = new Pair[pairs.length];\n    for (int i = 0; i < pairs.length; i++) {\n      result[i] = PairConverter.fromString(pairs[i]);\n    }\n    return result;\n  }\n\n  @Override\n  protected void configure() {\n    convertToTypes(Matchers.only(new StringPairTypeLiteral()), this);\n  }\n\n  private static class StringPairTypeLiteral extends TypeLiteral<Pair<String, String>[]> {}\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/PairConverter.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.matcher.Matchers;\nimport com.google.inject.spi.TypeConverter;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * @author andrew00x\n */\npublic class PairConverter extends AbstractModule implements TypeConverter {\n  @Override\n  public Object convert(String value, TypeLiteral<?> toType) {\n    return fromString(value);\n  }\n\n  static Pair<String, String> fromString(String value) {\n    final int p = value.indexOf('=');\n    if (p < 0) {\n      return Pair.of(value, null);\n    }\n    final int length = value.length();\n    if (p == length) {\n      return Pair.of(value.substring(0, p), \"\");\n    }\n    return Pair.of(value.substring(0, p), value.substring(p + 1, length));\n  }\n\n  @Override\n  protected void configure() {\n    convertToTypes(Matchers.only(new StringPairTypeLiteral()), this);\n  }\n\n  private static class StringPairTypeLiteral extends TypeLiteral<Pair<String, String>> {}\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/PathConverter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.Binder;\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.matcher.Matchers;\nimport com.google.inject.spi.TypeConverter;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\n\n/**\n * Converts {@link Binder#bindConstant() constant bindings} to {@link java.nio.Path} values.\n *\n * @author Tareq Sharafy\n */\npublic class PathConverter extends AbstractModule implements TypeConverter {\n\n  @Override\n  public Object convert(String value, TypeLiteral<?> toType) {\n    return Paths.get(value);\n  }\n\n  @Override\n  protected void configure() {\n    convertToTypes(Matchers.only(TypeLiteral.get(Path.class)), this);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/StringArrayConverter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport com.google.common.base.Splitter;\nimport com.google.common.collect.Iterables;\nimport com.google.inject.AbstractModule;\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.matcher.Matchers;\nimport com.google.inject.spi.TypeConverter;\nimport java.util.regex.Pattern;\n\n/**\n * Converts injected string value to an array of strings if such an array is requested by injection.\n *\n * <p>Entries of the array should be separated by a comma sign. Spaces around entries are trimmed.\n * Supports injection from property files, environment variables and Java system properties.\n *\n * @author andrew00x\n */\npublic class StringArrayConverter extends AbstractModule implements TypeConverter {\n  private static final Pattern PATTERN = Pattern.compile(\" *, *\");\n\n  @Override\n  public Object convert(String value, TypeLiteral<?> toType) {\n    return Iterables.toArray(Splitter.on(PATTERN).split(value), String.class);\n  }\n\n  @Override\n  protected void configure() {\n    convertToTypes(Matchers.only(TypeLiteral.get(String[].class)), this);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/URIConverter.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.ProvisionException;\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.matcher.Matchers;\nimport com.google.inject.spi.TypeConverter;\nimport java.net.URI;\nimport java.net.URISyntaxException;\n\n/**\n * @author andrew00x\n */\npublic class URIConverter extends AbstractModule implements TypeConverter {\n  @Override\n  public Object convert(String value, TypeLiteral<?> toType) {\n    try {\n      return new URI(value);\n    } catch (URISyntaxException e) {\n      throw new ProvisionException(String.format(\"Invalid URI '%s'\", value), e);\n    }\n  }\n\n  @Override\n  protected void configure() {\n    convertToTypes(Matchers.only(TypeLiteral.get(URI.class)), this);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/URLConverter.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.ProvisionException;\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.matcher.Matchers;\nimport com.google.inject.spi.TypeConverter;\nimport java.net.MalformedURLException;\nimport java.net.URL;\n\n/**\n * @author andrew00x\n */\npublic class URLConverter extends AbstractModule implements TypeConverter {\n  @Override\n  public Object convert(String value, TypeLiteral<?> toType) {\n    try {\n      return new URL(value);\n    } catch (MalformedURLException e) {\n      throw new ProvisionException(String.format(\"Invalid URL '%s'\", value), e);\n    }\n  }\n\n  @Override\n  protected void configure() {\n    convertToTypes(Matchers.only(TypeLiteral.get(URL.class)), this);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/lifecycle/DestroyErrorHandler.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject.lifecycle;\n\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport java.lang.reflect.Method;\n\n/**\n * Helps to be more flexible when need handle errors of invocation destroy-methods.\n *\n * @author andrew00x\n */\npublic interface DestroyErrorHandler {\n  void onError(Object instance, Method method, Throwable error);\n\n  /** Implementation of DestroyErrorHandler that log errors. */\n  DestroyErrorHandler LOG_HANDLER =\n      (instance, method, error) -> getLogger(instance.getClass()).error(error.getMessage(), error);\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/lifecycle/DestroyModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject.lifecycle;\n\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.matcher.Matchers;\nimport com.google.inject.spi.InjectionListener;\nimport com.google.inject.spi.TypeEncounter;\nimport com.google.inject.spi.TypeListener;\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Method;\n\n/**\n * @author andrew00x\n */\npublic final class DestroyModule extends LifecycleModule {\n  private final Class<? extends Annotation> annotationType;\n  private final DestroyErrorHandler errorHandler;\n\n  public DestroyModule(\n      Class<? extends Annotation> annotationType, DestroyErrorHandler errorHandler) {\n    this.annotationType = annotationType;\n    this.errorHandler = errorHandler;\n  }\n\n  @Override\n  protected void configure() {\n    final Destroyer destroyer = new Destroyer(errorHandler);\n    bind(Destroyer.class).toInstance(destroyer);\n    bindListener(\n        Matchers.any(),\n        new TypeListener() {\n          @Override\n          public <T> void hear(TypeLiteral<T> type, TypeEncounter<T> encounter) {\n            encounter.register(\n                new InjectionListener<T>() {\n                  @Override\n                  public void afterInjection(T injectee) {\n                    final Method[] methods = get(injectee.getClass(), annotationType);\n                    if (methods.length > 0) {\n                      // copy array when pass it outside\n                      final Method[] copy = new Method[methods.length];\n                      System.arraycopy(methods, 0, copy, 0, methods.length);\n                      destroyer.add(injectee, copy);\n                    }\n                  }\n                });\n          }\n        });\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/lifecycle/Destroyer.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject.lifecycle;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.Map;\nimport java.util.WeakHashMap;\n\n/**\n * @author andrew00x\n */\npublic final class Destroyer {\n  // Don't prevent instance from being discarded by the garbage collector.\n  private final WeakHashMap<Object, Method[]> map;\n  private final DestroyErrorHandler errorHandler;\n\n  public Destroyer(DestroyErrorHandler errorHandler) {\n    this.errorHandler = errorHandler;\n    map = new WeakHashMap<>();\n  }\n\n  public void add(Object instance, Method[] m) {\n    synchronized (map) {\n      map.put(instance, m);\n    }\n  }\n\n  public void destroy() {\n    synchronized (map) {\n      for (Map.Entry<Object, Method[]> entry : map.entrySet()) {\n        final Object instance = entry.getKey();\n        final Method[] methods = entry.getValue();\n        for (Method method : methods) {\n          try {\n            method.invoke(instance);\n          } catch (IllegalArgumentException e) {\n            // method MUST NOT have any parameters\n            errorHandler.onError(instance, method, e);\n          } catch (IllegalAccessException e) {\n            errorHandler.onError(instance, method, e);\n          } catch (InvocationTargetException e) {\n            errorHandler.onError(instance, method, e.getTargetException());\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/lifecycle/InitModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject.lifecycle;\n\nimport com.google.inject.ProvisionException;\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.matcher.Matchers;\nimport com.google.inject.spi.InjectionListener;\nimport com.google.inject.spi.TypeEncounter;\nimport com.google.inject.spi.TypeListener;\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\n\n/**\n * @author andrew00x\n */\npublic final class InitModule extends LifecycleModule {\n  private final Class<? extends Annotation> annotationType;\n\n  public InitModule(Class<? extends Annotation> annotationType) {\n    this.annotationType = annotationType;\n  }\n\n  @Override\n  protected void configure() {\n    bindListener(\n        Matchers.any(),\n        new TypeListener() {\n          @Override\n          public <T> void hear(TypeLiteral<T> type, TypeEncounter<T> encounter) {\n            encounter.register(\n                new InjectionListener<T>() {\n                  @Override\n                  public void afterInjection(T injectee) {\n                    final Method[] methods = get(injectee.getClass(), annotationType);\n                    if (methods.length > 0) {\n                      for (Method method : methods) {\n                        try {\n                          method.invoke(injectee);\n                        } catch (IllegalArgumentException e) {\n                          // method MUST NOT have any parameters\n                          throw new ProvisionException(e.getMessage(), e);\n                        } catch (IllegalAccessException e) {\n                          throw new ProvisionException(\n                              String.format(\"Failed access to %s on %s\", method, injectee), e);\n                        } catch (InvocationTargetException e) {\n                          final Throwable cause = e.getTargetException();\n                          throw new ProvisionException(\n                              String.format(\n                                  \"Invocation error of method %s on %s\", method, injectee),\n                              cause);\n                        }\n                      }\n                    }\n                  }\n                });\n          }\n        });\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/java/org/eclipse/che/inject/lifecycle/LifecycleModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject.lifecycle;\n\nimport com.google.common.cache.CacheBuilder;\nimport com.google.common.cache.CacheLoader;\nimport com.google.common.cache.LoadingCache;\nimport com.google.inject.AbstractModule;\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @author andrew00x\n */\nabstract class LifecycleModule extends AbstractModule {\n  private static class Key {\n    final Class<?> type;\n    final Class<? extends Annotation> annotationType;\n    final int hashCode;\n\n    static Key of(Class<?> type, Class<? extends Annotation> annotationType) {\n      return new Key(type, annotationType);\n    }\n\n    @Override\n    public boolean equals(Object o) {\n      if (this == o) {\n        return true;\n      }\n      if (!(o instanceof Key)) {\n        return false;\n      }\n      Key key = (Key) o;\n      return annotationType.equals(key.annotationType) && type.equals(key.type);\n    }\n\n    @Override\n    public int hashCode() {\n      return hashCode;\n    }\n\n    private Key(Class<?> type, Class<? extends Annotation> annotationType) {\n      this.type = type;\n      this.annotationType = annotationType;\n      int hash = annotationType.hashCode();\n      hash = 31 * hash + type.hashCode();\n      this.hashCode = hash;\n    }\n  }\n\n  private final LoadingCache<Key, Method[]> cache;\n\n  @SuppressWarnings(\"unchecked\")\n  LifecycleModule() {\n    cache =\n        CacheBuilder.newBuilder()\n            .maximumSize(1_000)\n            .expireAfterWrite(1, TimeUnit.HOURS)\n            .build(\n                new CacheLoader<Key, Method[]>() {\n                  @Override\n                  public Method[] load(Key key) throws Exception {\n                    return doGet(key.type, key.annotationType);\n                  }\n                });\n  }\n\n  Method[] get(Class<?> type, Class<? extends Annotation> annotationType) {\n    final Key key = Key.of(type, annotationType);\n    try {\n      return cache.get(key);\n    } catch (ExecutionException e) {\n      // should never happen\n      throw new RuntimeException(e.getLocalizedMessage(), e);\n    }\n  }\n\n  private Method[] doGet(Class<?> type, Class<? extends Annotation> annotationType) {\n    final List<Method> allMethods = getAllMethods(type);\n    final LinkedList<Method> methods = new LinkedList<>();\n    final Set<String> methodNames = new HashSet<>();\n    for (Method method : allMethods) {\n      if (method.isAnnotationPresent(annotationType)\n          && method.getParameterTypes().length == 0\n          && method.getReturnType() == void.class\n          && methodNames.add(method.getName())) {\n        method.setAccessible(true);\n        methods.addFirst(method);\n      }\n    }\n    return methods.toArray(new Method[methods.size()]);\n  }\n\n  private List<Method> getAllMethods(Class<?> c) {\n    final List<Method> list = new ArrayList<>();\n    while (c != null && c != Object.class) {\n      Collections.addAll(list, c.getDeclaredMethods());\n      c = c.getSuperclass();\n    }\n    return list;\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer",
    "content": "org.eclipse.che.inject.ModuleScanner"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/test/java/org/eclipse/che/inject/CheBootstrapTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport static java.io.File.pathSeparator;\nimport static java.util.Collections.emptyEnumeration;\nimport static org.eclipse.che.commons.test.SystemPropertiesHelper.overrideSystemProperties;\nimport static org.eclipse.che.inject.CheBootstrap.CHE_LOCAL_CONF_DIR;\nimport static org.eclipse.che.inject.CheBootstrap.PROPERTIES_ALIASES_CONFIG_FILE;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.atLeastOnce;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.io.Files;\nimport com.google.inject.Inject;\nimport com.google.inject.Injector;\nimport jakarta.servlet.ServletContext;\nimport jakarta.servlet.ServletContextEvent;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.net.URI;\nimport java.net.URL;\nimport java.nio.charset.Charset;\nimport java.util.Map;\nimport java.util.Properties;\nimport javax.inject.Named;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.lang.IoUtil;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.test.SystemPropertiesHelper;\nimport org.mockito.ArgumentCaptor;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class CheBootstrapTest {\n  private CheBootstrap cheBootstrap;\n  private ServletContext servletContext;\n  private File che;\n  private File userCongDir;\n  private SystemPropertiesHelper systemPropertiesHelper;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    systemPropertiesHelper = overrideSystemProperties();\n    cheBootstrap = new CheBootstrap();\n    servletContext = mock(ServletContext.class);\n\n    URL classesDirUrl = Thread.currentThread().getContextClassLoader().getResource(\".\");\n    File classesDir = new File(classesDirUrl.toURI());\n    che = new File(classesDir, \"che\");\n    che.mkdir();\n    userCongDir = new File(System.getenv(CHE_LOCAL_CONF_DIR));\n    userCongDir.mkdirs();\n\n    mockServletContext();\n  }\n\n  @AfterMethod\n  public void tearDown() throws Exception {\n    try {\n      cheBootstrap.contextDestroyed(new ServletContextEvent(servletContext));\n    } catch (Throwable ignored) {\n    }\n    systemPropertiesHelper.restoreFromBackup();\n    IoUtil.deleteRecursive(che);\n    IoUtil.deleteRecursive(userCongDir);\n    File aliases = new File(che.getParent(), PROPERTIES_ALIASES_CONFIG_FILE);\n    if (aliases.exists()) {\n      aliases.delete();\n    }\n    ModuleScanner.modules.clear();\n  }\n\n  private Properties createTestProperties() {\n    final Properties properties = new Properties();\n    properties.put(\"test_int\", \"123\");\n    properties.put(\"test_bool\", \"true\");\n    properties.put(\"test_uri\", \"file:/a/b/c\");\n    properties.put(\"test_url\", \"http://localhost\");\n    properties.put(\"test_file\", \"/a/b/c\");\n    properties.put(\"test_strings\", \"a, b, c\");\n    properties.put(\"test_pair_of_strings\", \"a=b\");\n    properties.put(\"test_pair_of_strings2\", \"a\");\n    properties.put(\"test_pair_of_strings3\", \"a=\");\n    properties.put(\"test_pair_array\", \"a=b,c=d\");\n    properties.put(\"some.dir.in_tmp_dir\", \"${java.io.tmpdir}/some_dir\");\n    properties.put(\"suffixed.PATH\", \"${PATH}\" + pathSeparator + \"some_path\");\n    properties.put(\"nullable\", \"NULL\");\n    return properties;\n  }\n\n  @Test\n  public void readsConfigurationPropertiesFromCheDirectory() throws Exception {\n    writePropertiesFile(che, \"che.properties\", createTestProperties());\n\n    ModuleScanner.modules.add(binder -> binder.bind(TestChePropertiesComponent.class));\n\n    cheBootstrap.contextInitialized(new ServletContextEvent(servletContext));\n\n    Injector injector = retrieveComponentFromServletContext(Injector.class);\n\n    TestChePropertiesComponent testComponent =\n        injector.getInstance(TestChePropertiesComponent.class);\n    assertEquals(testComponent.parameter_pair, Pair.of(\"a\", \"b\"));\n    assertEquals(testComponent.parameter_pair2, Pair.of(\"a\", (String) null));\n    assertEquals(testComponent.parameter_pair3, Pair.of(\"a\", \"\"));\n    assertEquals(\n        testComponent.parameter_pair_array, new Pair[] {Pair.of(\"a\", \"b\"), Pair.of(\"c\", \"d\")});\n    assertEquals(testComponent.nullable, null);\n    assertEquals(testComponent.parameter_uri, new URI(\"file:/a/b/c\"));\n    assertEquals(testComponent.parameter_url, new URL(\"http://localhost\"));\n    assertEquals(testComponent.parameter_file, new File(\"/a/b/c\"));\n    assertEquals(testComponent.parameter_strings, new String[] {\"a\", \"b\", \"c\"});\n    assertEquals(testComponent.parameter_int, 123);\n    assertEquals(testComponent.parameter_long, 123);\n    assertEquals(testComponent.parameter_bool, true);\n    assertEquals(\n        testComponent.someDir, new File(System.getProperty(\"java.io.tmpdir\"), \"/some_dir\"));\n    assertEquals(testComponent.suffixedPath, System.getenv(\"PATH\") + pathSeparator + \"some_path\");\n  }\n\n  @Test\n  public void readsConfigurationPropertiesFromSystemProperties() throws Exception {\n    setSystemProperties(createTestProperties());\n\n    ModuleScanner.modules.add(binder -> binder.bind(TestSystemPropertiesComponent.class));\n\n    cheBootstrap.contextInitialized(new ServletContextEvent(servletContext));\n\n    Injector injector = retrieveComponentFromServletContext(Injector.class);\n\n    TestSystemPropertiesComponent testComponent =\n        injector.getInstance(TestSystemPropertiesComponent.class);\n    assertEquals(testComponent.parameter_pair, Pair.of(\"a\", \"b\"));\n    assertEquals(testComponent.parameter_pair2, Pair.of(\"a\", (String) null));\n    assertEquals(testComponent.parameter_pair3, Pair.of(\"a\", \"\"));\n    assertEquals(\n        testComponent.parameter_pair_array, new Pair[] {Pair.of(\"a\", \"b\"), Pair.of(\"c\", \"d\")});\n    assertEquals(testComponent.nullable, null);\n    assertEquals(testComponent.parameter_uri, new URI(\"file:/a/b/c\"));\n    assertEquals(testComponent.parameter_url, new URL(\"http://localhost\"));\n    assertEquals(testComponent.parameter_file, new File(\"/a/b/c\"));\n    assertEquals(testComponent.parameter_strings, new String[] {\"a\", \"b\", \"c\"});\n    assertEquals(testComponent.parameter_int, 123);\n    assertEquals(testComponent.parameter_long, 123);\n    assertEquals(testComponent.parameter_bool, true);\n    assertEquals(\n        testComponent.someDir, new File(System.getProperty(\"java.io.tmpdir\"), \"/some_dir\"));\n    assertEquals(testComponent.suffixedPath, System.getenv(\"PATH\") + pathSeparator + \"some_path\");\n  }\n\n  @Test\n  public void readsConfigurationPropertiesFromEnvProperties() throws Exception {\n    ModuleScanner.modules.add(binder -> binder.bind(TestEnvPropertiesComponent.class));\n\n    cheBootstrap.contextInitialized(new ServletContextEvent(servletContext));\n\n    Injector injector = retrieveComponentFromServletContext(Injector.class);\n\n    TestEnvPropertiesComponent testComponent =\n        injector.getInstance(TestEnvPropertiesComponent.class);\n    assertEquals(testComponent.string, System.getenv(\"PATH\"));\n  }\n\n  @Test\n  public void propertiesFromUserSpecifiedLocationOverrideCheProperties() throws Exception {\n    systemPropertiesHelper.property(CHE_LOCAL_CONF_DIR, userCongDir.getAbsolutePath());\n\n    Properties cheProperties = new Properties();\n    cheProperties.put(\"che.some.name\", \"che_value\");\n    writePropertiesFile(che, \"che.properties\", cheProperties);\n\n    Properties userProperties = new Properties();\n    userProperties.put(\"che.some.name\", \"user_value\");\n    writePropertiesFile(userCongDir, \"user.properties\", userProperties);\n\n    ModuleScanner.modules.add(binder -> binder.bind(TestConfOverrideComponent.class));\n\n    cheBootstrap.contextInitialized(new ServletContextEvent(servletContext));\n\n    Injector injector = retrieveComponentFromServletContext(Injector.class);\n\n    TestConfOverrideComponent testComponent = injector.getInstance(TestConfOverrideComponent.class);\n    assertEquals(testComponent.string, \"user_value\");\n  }\n\n  @Test\n  public void system_properties_prefixed_with_che_dot_override_user_specified_and_che_properties()\n      throws Exception {\n    Properties cheProperties = new Properties();\n    cheProperties.put(\"che.some.name\", \"che_value\");\n    cheProperties.put(\"che.some.other.name\", \"NULL\");\n    writePropertiesFile(che, \"che.properties\", cheProperties);\n\n    Properties userProperties = new Properties();\n    userProperties.put(\"che.some.name\", \"user_value\");\n    writePropertiesFile(userCongDir, \"user.properties\", userProperties);\n\n    systemPropertiesHelper.property(\"che.some.name\", \"che_dot_system_property_value\");\n\n    ModuleScanner.modules.add(binder -> binder.bind(TestConfOverrideComponent.class));\n\n    cheBootstrap.contextInitialized(new ServletContextEvent(servletContext));\n\n    Injector injector = retrieveComponentFromServletContext(Injector.class);\n\n    TestConfOverrideComponent testComponent = injector.getInstance(TestConfOverrideComponent.class);\n    assertEquals(testComponent.string, \"che_dot_system_property_value\");\n  }\n\n  @Test\n  public void\n      environment_variables_prefixed_with_che_underscore_override_che_dot_prefixed_system_and_user_specified_and_che_properties()\n          throws Exception {\n    Properties cheProperties = new Properties();\n    cheProperties.put(\"che.some.other.name\", \"che_value\");\n    cheProperties.put(\"che.some.name\", \"NULL\");\n    writePropertiesFile(che, \"che.properties\", cheProperties);\n\n    Properties userProperties = new Properties();\n    userProperties.put(\"che.some.other.name\", \"user_value\");\n    writePropertiesFile(userCongDir, \"user.properties\", userProperties);\n\n    systemPropertiesHelper.property(\"che.some.other.name\", \"che_dot_system_property_value\");\n\n    ModuleScanner.modules.add(binder -> binder.bind(TestConfOverrideComponent.class));\n\n    cheBootstrap.contextInitialized(new ServletContextEvent(servletContext));\n\n    Injector injector = retrieveComponentFromServletContext(Injector.class);\n\n    TestConfOverrideComponent testComponent = injector.getInstance(TestConfOverrideComponent.class);\n    assertEquals(testComponent.otherString, System.getenv(\"CHE_SOME_OTHER_NAME\"));\n  }\n\n  @Test\n  public void\n      environment_variables_prefixed_with_che_underscore_convert_double_underscores_into_one_underscore_in_variable_name()\n          throws Exception {\n    Properties cheProperties = new Properties();\n    cheProperties.put(\"che.some.other.name_with_underscores\", \"che_value\");\n    cheProperties.put(\"che.some.name\", \"NULL\");\n    writePropertiesFile(che, \"che.properties\", cheProperties);\n\n    Properties userProperties = new Properties();\n    userProperties.put(\"che.some.other.name_with_underscores\", \"user_value\");\n    writePropertiesFile(userCongDir, \"user.properties\", userProperties);\n\n    systemPropertiesHelper.property(\n        \"che.some.other.name_with_underscores\", \"che_dot_system_property_value\");\n\n    ModuleScanner.modules.add(\n        binder -> binder.bind(TestConfOverrideWithUnderscoresComponent.class));\n\n    cheBootstrap.contextInitialized(new ServletContextEvent(servletContext));\n\n    Injector injector = retrieveComponentFromServletContext(Injector.class);\n\n    TestConfOverrideWithUnderscoresComponent testComponent =\n        injector.getInstance(TestConfOverrideWithUnderscoresComponent.class);\n    assertEquals(\n        testComponent.otherString, System.getenv(\"CHE_SOME_OTHER_NAME__WITH__UNDERSCORES\"));\n  }\n\n  @Test\n  public void processesPropertyAliases() throws Exception {\n    Properties cheProperties = new Properties();\n    cheProperties.put(\"very.new.some.name\", \"some_value\");\n    writePropertiesFile(che, \"che.properties\", cheProperties);\n\n    Properties aliases = new Properties();\n    aliases.put(\"very.new.some.name\", \"new.some.name, che.some.name\");\n    writePropertiesFile(che.getParentFile(), PROPERTIES_ALIASES_CONFIG_FILE, aliases);\n\n    ModuleScanner.modules.add(binder -> binder.bind(TestConfAliasComponent.class));\n\n    cheBootstrap.contextInitialized(new ServletContextEvent(servletContext));\n\n    Injector injector = retrieveComponentFromServletContext(Injector.class);\n\n    TestConfAliasComponent testComponent = injector.getInstance(TestConfAliasComponent.class);\n    assertEquals(testComponent.string, \"some_value\");\n    assertEquals(testComponent.otherString, \"some_value\");\n    assertEquals(testComponent.otherOtherString, \"some_value\");\n  }\n\n  @Test\n  public void processesOld2NewPropertyAliases() throws Exception {\n    Properties cheProperties = new Properties();\n    cheProperties.put(\"che.some.name\", \"some_value\");\n    writePropertiesFile(che, \"che.properties\", cheProperties);\n\n    Properties aliases = new Properties();\n    aliases.put(\"very.new.some.name\", \"new.some.name, che.some.name\");\n    writePropertiesFile(che.getParentFile(), PROPERTIES_ALIASES_CONFIG_FILE, aliases);\n\n    ModuleScanner.modules.add(binder -> binder.bind(TestConfAliasComponent.class));\n\n    cheBootstrap.contextInitialized(new ServletContextEvent(servletContext));\n\n    Injector injector = retrieveComponentFromServletContext(Injector.class);\n\n    TestConfAliasComponent testComponent = injector.getInstance(TestConfAliasComponent.class);\n    assertEquals(testComponent.string, \"some_value\");\n    assertEquals(testComponent.otherString, \"some_value\");\n    assertEquals(testComponent.otherOtherString, \"some_value\");\n  }\n\n  static class TestChePropertiesComponent {\n    @Named(\"test_int\")\n    @Inject\n    int parameter_int;\n\n    @Named(\"test_int\")\n    @Inject\n    int parameter_long;\n\n    @Named(\"test_bool\")\n    @Inject\n    boolean parameter_bool;\n\n    @Named(\"test_uri\")\n    @Inject\n    URI parameter_uri;\n\n    @Named(\"test_url\")\n    @Inject\n    URL parameter_url;\n\n    @Named(\"test_file\")\n    @Inject\n    File parameter_file;\n\n    @Named(\"test_strings\")\n    @Inject\n    String[] parameter_strings;\n\n    @Named(\"test_pair_of_strings\")\n    @Inject\n    Pair<String, String> parameter_pair;\n\n    @Named(\"test_pair_of_strings2\")\n    @Inject\n    Pair<String, String> parameter_pair2;\n\n    @Named(\"test_pair_of_strings3\")\n    @Inject\n    Pair<String, String> parameter_pair3;\n\n    @Named(\"test_pair_array\")\n    @Inject\n    Pair<String, String>[] parameter_pair_array;\n\n    @Named(\"some.dir.in_tmp_dir\")\n    @Inject\n    File someDir;\n\n    @Named(\"suffixed.PATH\")\n    @Inject\n    String suffixedPath;\n\n    @Named(\"nullable\")\n    @Inject\n    @Nullable\n    String nullable;\n  }\n\n  static class TestSystemPropertiesComponent {\n    @Named(\"sys.test_int\")\n    @Inject\n    int parameter_int;\n\n    @Named(\"sys.test_int\")\n    @Inject\n    int parameter_long;\n\n    @Named(\"sys.test_bool\")\n    @Inject\n    boolean parameter_bool;\n\n    @Named(\"sys.test_uri\")\n    @Inject\n    URI parameter_uri;\n\n    @Named(\"sys.test_url\")\n    @Inject\n    URL parameter_url;\n\n    @Named(\"sys.test_file\")\n    @Inject\n    File parameter_file;\n\n    @Named(\"sys.test_strings\")\n    @Inject\n    String[] parameter_strings;\n\n    @Named(\"sys.test_pair_of_strings\")\n    @Inject\n    Pair<String, String> parameter_pair;\n\n    @Named(\"sys.test_pair_of_strings2\")\n    @Inject\n    Pair<String, String> parameter_pair2;\n\n    @Named(\"sys.test_pair_of_strings3\")\n    @Inject\n    Pair<String, String> parameter_pair3;\n\n    @Named(\"sys.test_pair_array\")\n    @Inject\n    Pair<String, String>[] parameter_pair_array;\n\n    @Named(\"sys.some.dir.in_tmp_dir\")\n    @Inject\n    File someDir;\n\n    @Named(\"sys.suffixed.PATH\")\n    @Inject\n    String suffixedPath;\n\n    @Named(\"sys.nullable\")\n    @Inject\n    @Nullable\n    String nullable;\n  }\n\n  static class TestEnvPropertiesComponent {\n    @Named(\"env.PATH\")\n    @Inject\n    String string;\n  }\n\n  static class TestConfOverrideComponent {\n    @Named(\"che.some.name\")\n    @Inject\n    @Nullable\n    String string;\n\n    @Named(\"che.some.other.name\")\n    @Inject\n    @Nullable\n    String otherString;\n  }\n\n  static class TestConfOverrideWithUnderscoresComponent {\n    @Named(\"che.some.name\")\n    @Inject\n    @Nullable\n    String string;\n\n    @Named(\"che.some.other.name_with_underscores\")\n    @Inject\n    @Nullable\n    String otherString;\n  }\n\n  static class TestConfAliasComponent {\n    @Named(\"che.some.name\")\n    @Inject\n    String string;\n\n    @Named(\"new.some.name\")\n    @Inject\n    String otherString;\n\n    @Named(\"very.new.some.name\")\n    @Inject\n    String otherOtherString;\n  }\n\n  private void writePropertiesFile(File parent, String name, Properties properties)\n      throws IOException {\n    File propertiesFile = new File(parent, name);\n    try (Writer writer = Files.newWriter(propertiesFile, Charset.forName(\"UTF-8\"))) {\n      properties.store(writer, null);\n    }\n  }\n\n  private void setSystemProperties(Properties properties) throws IOException {\n    for (Map.Entry<Object, Object> entry : properties.entrySet()) {\n      systemPropertiesHelper.property((String) entry.getKey(), (String) entry.getValue());\n    }\n  }\n\n  private void mockServletContext() {\n    servletContext = mock(ServletContext.class);\n    when(servletContext.getInitParameterNames()).thenReturn(emptyEnumeration());\n    when(servletContext.getAttribute(Injector.class.getName()))\n        .thenAnswer(invocation -> retrieveComponentFromServletContext(Injector.class));\n  }\n\n  private <T> T retrieveComponentFromServletContext(Class<T> componentType) {\n    ArgumentCaptor<T> argumentCaptor = ArgumentCaptor.forClass(componentType);\n    verify(servletContext, atLeastOnce())\n        .setAttribute(eq(componentType.getName()), argumentCaptor.capture());\n    return argumentCaptor.getValue();\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/test/java/org/eclipse/che/inject/LifecycleTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport static org.eclipse.che.inject.lifecycle.DestroyErrorHandler.LOG_HANDLER;\n\nimport com.google.inject.Binder;\nimport com.google.inject.Guice;\nimport com.google.inject.Injector;\nimport com.google.inject.Module;\nimport jakarta.annotation.PostConstruct;\nimport jakarta.annotation.PreDestroy;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.inject.lifecycle.DestroyModule;\nimport org.eclipse.che.inject.lifecycle.Destroyer;\nimport org.eclipse.che.inject.lifecycle.InitModule;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeTest;\nimport org.testng.annotations.Test;\n\n/**\n * @author andrew00x\n */\npublic class LifecycleTest {\n  Injector injector;\n\n  @BeforeTest\n  public void init() {\n    injector =\n        Guice.createInjector(\n            new InitModule(PostConstruct.class),\n            new DestroyModule(PreDestroy.class, LOG_HANDLER),\n            new MyModule());\n  }\n\n  @Test\n  public void testInit() {\n    TestComponent component = injector.getInstance(TestComponent.class);\n    Assert.assertEquals(component.init, 1, \"'init' method must be called just once\");\n  }\n\n  @Test\n  public void testDestroy() {\n    TestComponent component = injector.getInstance(TestComponent.class);\n    injector.getInstance(Destroyer.class).destroy();\n    Assert.assertEquals(component.destroy, 1, \"'destroy' method must be called just once\");\n  }\n\n  public static class MyModule implements Module {\n    @Override\n    public void configure(Binder binder) {\n      binder.bind(TestComponent.class);\n    }\n  }\n\n  public abstract static class SuperClass {\n    int init;\n    int destroy;\n\n    @PostConstruct\n    public void init() {\n      init++;\n    }\n\n    @PreDestroy\n    public void destroy() {\n      destroy++;\n    }\n  }\n\n  @Singleton\n  public static class TestComponent extends SuperClass {\n    @Inject\n    public TestComponent() {}\n\n    @PostConstruct\n    @Override\n    public void init() {\n      super.init();\n    }\n\n    @PreDestroy\n    @Override\n    public void destroy() {\n      super.destroy();\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/test/java/org/eclipse/che/inject/MultiBindingTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport com.google.inject.Binder;\nimport com.google.inject.Guice;\nimport com.google.inject.Injector;\nimport com.google.inject.Module;\nimport com.google.inject.multibindings.Multibinder;\nimport java.util.HashSet;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeTest;\nimport org.testng.annotations.Test;\n\n/**\n * @author andrew00x\n */\npublic class MultiBindingTest {\n  Injector injector;\n\n  @BeforeTest\n  public void init() {\n    injector =\n        Guice.createInjector(\n            new MyModule(), new ServiceModule1(), new ServiceModule2(), new ServiceModule3());\n  }\n\n  @Test\n  public void testMultiInject() {\n    TestComponent instance = injector.getInstance(TestComponent.class);\n    Set<Service> services = instance.services;\n    Set<String> names = new HashSet<>(services.size());\n    for (Service service : services) {\n      names.add(service.toString());\n    }\n    Assert.assertEquals(names.size(), 3);\n    Assert.assertTrue(names.contains(\"Service1\"));\n    Assert.assertTrue(names.contains(\"Service2\"));\n    Assert.assertTrue(names.contains(\"Service3\"));\n  }\n\n  public static class MyModule implements Module {\n    @Override\n    public void configure(Binder binder) {\n      binder.bind(TestComponent.class);\n    }\n  }\n\n  public static class ServiceModule1 implements Module {\n    @Override\n    public void configure(Binder binder) {\n      Multibinder<Service> multiBinder = Multibinder.newSetBinder(binder, Service.class);\n      multiBinder.addBinding().to(Service1.class);\n    }\n  }\n\n  public static class ServiceModule2 implements Module {\n    @Override\n    public void configure(Binder binder) {\n      Multibinder<Service> multiBinder = Multibinder.newSetBinder(binder, Service.class);\n      multiBinder.addBinding().to(Service2.class);\n    }\n  }\n\n  public static class ServiceModule3 implements Module {\n    @Override\n    public void configure(Binder binder) {\n      Multibinder<Service> multiBinder = Multibinder.newSetBinder(binder, Service.class);\n      multiBinder.addBinding().to(Service3.class);\n    }\n  }\n\n  @Singleton\n  public static class TestComponent {\n    private final Set<Service> services;\n\n    @Inject\n    public TestComponent(Set<Service> services) {\n      this.services = services;\n    }\n  }\n\n  public interface Service {}\n\n  @Singleton\n  public static class Service1 implements Service {\n    @Override\n    public String toString() {\n      return \"Service1\";\n    }\n  }\n\n  @Singleton\n  public static class Service2 implements Service {\n    @Override\n    public String toString() {\n      return \"Service2\";\n    }\n  }\n\n  @Singleton\n  public static class Service3 implements Service {\n    @Override\n    public String toString() {\n      return \"Service3\";\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/test/java/org/eclipse/che/inject/PathConverterTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject;\n\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.inject.Binder;\nimport com.google.inject.Guice;\nimport com.google.inject.Injector;\nimport com.google.inject.Key;\nimport com.google.inject.Module;\nimport com.google.inject.name.Names;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport org.testng.annotations.Test;\n\n/**\n * @author Tareq Sharafy\n */\npublic class PathConverterTest {\n\n  @Test\n  public void testConvertPaths() {\n    Injector injector =\n        Guice.createInjector(\n            new PathConverter(),\n            new Module() {\n              @Override\n              public void configure(Binder binder) {\n                binder.bindConstant().annotatedWith(Names.named(\"abc\")).to(\"aa/bb\");\n              }\n            });\n    Path path = injector.getInstance(Key.get(Path.class, Names.named(\"abc\")));\n    assertEquals(Paths.get(\"aa/bb\"), path);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-inject/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"DEBUG\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "core/commons/che-core-commons-j2ee/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-commons-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-commons-j2ee</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: Commons :: Commons J2ee</name>\n    <dependencies>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.tomcat</groupId>\n            <artifactId>tomcat-catalina</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>com.mycila</groupId>\n                <artifactId>license-maven-plugin</artifactId>\n                <configuration>\n                    <excludes>\n                        <!-- Apache License -->\n                        <exclude>**/xemantic/**/*.java</exclude>\n                    </excludes>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "core/commons/che-core-commons-j2ee/src/main/java/com/xemantic/tadedon/servlet/CacheDisablingFilter.java",
    "content": "/*\n * Copyright 2010 Xemantic\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.xemantic.tadedon.servlet;\n\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.Date;\n\n/**\n * Servlet applying \"never cache\" HTTP headers.\n *\n * <p>See:\n *\n * <ul>\n *   <li><a href=\"http://code.google.com/p/doctype/wiki/ArticleHttpCaching\">ArticleHttpCaching</a>\n *   <li><a\n *       href=\"http://seewah.blogspot.com/2009/02/gwt-tips-2-nocachejs-getting-cached-in.html\">GWT\n *       Tips 2 - nocache.js getting cached in browser</a>\n * </ul>\n *\n * <p>Created on Aug 6, 2010\n *\n * @author hshsce\n */\npublic class CacheDisablingFilter extends SimpleFilter {\n\n  private static final long ONE_DAY_IN_MILISECONDS = (1000L * 60L * 60L * 24L);\n\n  /** {@inheritDoc} */\n  @Override\n  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n      throws IOException, ServletException {\n    if (response instanceof HttpServletResponse) {\n      HttpServletResponse httpResponse = (HttpServletResponse) response;\n      Date now = new Date();\n      httpResponse.setDateHeader(\"Date\", now.getTime());\n      httpResponse.setDateHeader(\"Expires\", now.getTime() + ONE_DAY_IN_MILISECONDS);\n      httpResponse.setHeader(\"Pragma\", \"no-cache\");\n      httpResponse.setHeader(\"Cache-control\", \"no-cache, no-store, must-revalidate\");\n    }\n    chain.doFilter(request, response);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-j2ee/src/main/java/com/xemantic/tadedon/servlet/CacheForcingFilter.java",
    "content": "/*\n * Copyright 2010 Xemantic\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.xemantic.tadedon.servlet;\n\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.Date;\n\n/**\n * Servlet applying \"cache forever\" HTTP headers.\n *\n * <p>See: <a href=\"http://code.google.com/p/doctype/wiki/ArticleHttpCaching\">ArticleHttpCaching</a>\n *\n * <p>Created on Aug 6, 2010\n *\n * @author hshsce\n */\npublic class CacheForcingFilter extends SimpleFilter {\n\n  private static final long ONE_MONTH_IN_SECONDS = 60L * 60L * 24L * 30L;\n\n  private static final long ONE_MONTH_IN_MILISECONDS = 1000L * ONE_MONTH_IN_SECONDS;\n\n  /** {@inheritDoc} */\n  @Override\n  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n      throws IOException, ServletException {\n    if (response instanceof HttpServletResponse) {\n      HttpServletResponse httpResponse = (HttpServletResponse) response;\n      Date now = new Date();\n      httpResponse.setDateHeader(\"Date\", now.getTime());\n      httpResponse.setDateHeader(\"Expires\", now.getTime() + ONE_MONTH_IN_MILISECONDS);\n      httpResponse.setHeader(\"Pragma\", \"no-cache\");\n      httpResponse.setHeader(\"Cache-control\", \"public, max-age=\" + ONE_MONTH_IN_SECONDS);\n    }\n    chain.doFilter(request, response);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-j2ee/src/main/java/com/xemantic/tadedon/servlet/SimpleFilter.java",
    "content": "/*\n * Copyright 2010 Xemantic\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.xemantic.tadedon.servlet;\n\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletException;\n\n/**\n * Servlet {@link Filter} which does not require initialization and clean up.\n *\n * <p>Created on Aug 6, 2010\n *\n * @author hshsce\n */\npublic abstract class SimpleFilter implements Filter {\n\n  /** {@inheritDoc} */\n  @Override\n  public void init(FilterConfig filterConfig) throws ServletException {\n    /* nothing to do */\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public void destroy() {\n    /* nothing to do */\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-j2ee/src/main/java/org/eclipse/che/filter/CheCacheDisablingFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.filter;\n\nimport com.xemantic.tadedon.servlet.CacheDisablingFilter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.io.IOException;\nimport java.util.Enumeration;\nimport java.util.HashSet;\nimport java.util.Set;\nimport java.util.regex.Pattern;\n\n/**\n * Disabling caching for the given URL resource patterns.\n *\n * @author Max Shaposhnik (mshaposhnik@codenvy.com)\n */\npublic class CheCacheDisablingFilter extends CacheDisablingFilter {\n\n  private Set<Pattern> actionPatterns = new HashSet<>();\n\n  @Override\n  public void init(FilterConfig filterConfig) {\n    Enumeration<String> names = filterConfig.getInitParameterNames();\n    while (names.hasMoreElements()) {\n      String name = names.nextElement();\n      if (name.startsWith(\"pattern\")) {\n        actionPatterns.add(Pattern.compile(filterConfig.getInitParameter(name)));\n      }\n    }\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n      throws IOException, ServletException {\n    for (Pattern pattern : actionPatterns) {\n      if (pattern.matcher(((HttpServletRequest) request).getRequestURI()).matches()) {\n        super.doFilter(request, response, chain);\n        return;\n      }\n    }\n    chain.doFilter(request, response);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-j2ee/src/main/java/org/eclipse/che/filter/CheCacheForcingFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.filter;\n\nimport com.xemantic.tadedon.servlet.CacheForcingFilter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.io.IOException;\nimport java.util.Enumeration;\nimport java.util.HashSet;\nimport java.util.Set;\nimport java.util.regex.Pattern;\n\n/**\n * Forcing caching for the given URL resource patterns.\n *\n * @author Max Shaposhnik\n */\npublic class CheCacheForcingFilter extends CacheForcingFilter {\n\n  private Set<Pattern> actionPatterns = new HashSet<>();\n\n  @Override\n  public void init(FilterConfig filterConfig) {\n    Enumeration<String> names = filterConfig.getInitParameterNames();\n    while (names.hasMoreElements()) {\n      String name = names.nextElement();\n      if (name.startsWith(\"pattern\")) {\n        actionPatterns.add(Pattern.compile(filterConfig.getInitParameter(name)));\n      }\n    }\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n      throws IOException, ServletException {\n    for (Pattern pattern : actionPatterns) {\n      if (pattern.matcher(((HttpServletRequest) request).getRequestURI()).matches()) {\n        super.doFilter(request, response, chain);\n        return;\n      }\n    }\n    chain.doFilter(request, response);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-j2ee/src/test/java/org/eclipse/che/filter/CheCacheDisablingFilterTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.filter;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyLong;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletContext;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.util.Collections;\nimport java.util.Enumeration;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Max Shaposhnik (mshaposhnik@codenvy.com)\n */\n@Listeners(value = {MockitoTestNGListener.class})\npublic class CheCacheDisablingFilterTest {\n\n  @Mock private FilterChain chain;\n\n  @Mock private HttpServletRequest request;\n\n  @Mock private HttpServletResponse response;\n\n  @InjectMocks private CheCacheDisablingFilter filter;\n\n  @BeforeMethod\n  public void init() throws Exception {\n    filter.init(new MockFilterConfig());\n  }\n\n  @Test(dataProvider = \"nonCachedPathProvider\")\n  public void shouldSetDisablingCacheHeaders(String uri) throws Exception {\n    when(request.getRequestURI()).thenReturn(uri);\n\n    // when\n    filter.doFilter(request, response, chain);\n\n    verify(response).setDateHeader(eq(\"Date\"), anyLong());\n    verify(response).setDateHeader(eq(\"Expires\"), anyLong());\n    verify(response).setHeader(eq(\"Cache-control\"), eq(\"no-cache, no-store, must-revalidate\"));\n    verify(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class));\n  }\n\n  @Test(dataProvider = \"cachedPathProvider\")\n  public void shouldBypassDisablingCacheHeaders(String uri) throws Exception {\n    when(request.getRequestURI()).thenReturn(uri);\n\n    // when\n    filter.doFilter(request, response, chain);\n\n    verify(response, never()).setHeader(eq(\"Cache-control\"), anyString());\n    verify(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class));\n  }\n\n  @DataProvider(name = \"nonCachedPathProvider\")\n  public Object[][] nonCachedPathProvider() {\n    return new Object[][] {\n      {\"/_app/browserNotSupported.js\"},\n      {\"/_app/_app.nocache.js\"},\n      {\"/other/_app/something.js\"},\n      {\"/other/something.nocache.js\"}\n    };\n  }\n\n  @DataProvider(name = \"cachedPathProvider\")\n  public Object[][] cachedPathProvider() {\n    return new Object[][] {\n      {\"/other/.something.js\"}, {\"/app/something.js\"}, {\"/something/something\"}\n    };\n  }\n\n  private class MockFilterConfig implements FilterConfig {\n    private final Map<String, String> filterParams = new HashMap<>();\n\n    MockFilterConfig() {\n      this.filterParams.put(\"pattern1\", \"^.*\\\\.nocache\\\\..*$\");\n      this.filterParams.put(\"pattern2\", \"^.*/_app/.*$\");\n    }\n\n    @Override\n    public String getFilterName() {\n      return this.getClass().getName();\n    }\n\n    @Override\n    public ServletContext getServletContext() {\n      throw new UnsupportedOperationException(\n          \"The method does not supported in \" + this.getClass());\n    }\n\n    @Override\n    public String getInitParameter(String key) {\n      return this.filterParams.get(key);\n    }\n\n    @Override\n    public Enumeration<String> getInitParameterNames() {\n      return Collections.enumeration(filterParams.keySet());\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-j2ee/src/test/java/org/eclipse/che/filter/CheCacheForcingFilterTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.filter;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyLong;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.ArgumentMatchers.matches;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletContext;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.util.Collections;\nimport java.util.Enumeration;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Max Shaposhnik (mshaposhnik@codenvy.com) on 1/17/17.\n */\n@Listeners(value = {MockitoTestNGListener.class})\npublic class CheCacheForcingFilterTest {\n\n  @Mock private FilterChain chain;\n\n  @Mock private HttpServletRequest request;\n\n  @Mock private HttpServletResponse response;\n\n  @InjectMocks private CheCacheForcingFilter filter;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    filter.init(new MockFilterConfig());\n  }\n\n  @Test(dataProvider = \"cachedPathProvider\")\n  public void shouldSetForceCacheHeaders(String uri) throws Exception {\n    when(request.getRequestURI()).thenReturn(uri);\n\n    // when\n    filter.doFilter(request, response, chain);\n\n    verify(response).setDateHeader(eq(\"Date\"), anyLong());\n    verify(response).setDateHeader(eq(\"Expires\"), anyLong());\n    verify(response).setHeader(eq(\"Cache-control\"), matches(\"public, max-age=[0-9]+\"));\n    verify(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class));\n  }\n\n  @Test(dataProvider = \"nonCachedPathProvider\")\n  public void shouldBypassForceCacheHeaders(String uri) throws Exception {\n    when(request.getRequestURI()).thenReturn(uri);\n\n    // when\n    filter.doFilter(request, response, chain);\n\n    verify(response, never()).setHeader(eq(\"Cache-control\"), anyString());\n    verify(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class));\n  }\n\n  @DataProvider(name = \"cachedPathProvider\")\n  public Object[][] cachedPathProvider() {\n    return new Object[][] {\n      {\"/_app/browserNotSupported.js\"},\n      {\"/_app/_app.cache.js\"},\n      {\"/other/_app/cache.js\"},\n      {\"/other/something.cache.js\"}\n    };\n  }\n\n  @DataProvider(name = \"nonCachedPathProvider\")\n  public Object[][] nonCachedPathProvider() {\n    return new Object[][] {\n      {\"/other/.something.js\"}, {\"/app/something.js\"}, {\"/something/something\"}\n    };\n  }\n\n  private class MockFilterConfig implements FilterConfig {\n    private final Map<String, String> filterParams = new HashMap<>();\n\n    MockFilterConfig() {\n      this.filterParams.put(\"pattern1\", \"^.*\\\\.cache\\\\..*$\");\n      this.filterParams.put(\"pattern2\", \"^.*/_app/.*$\");\n    }\n\n    @Override\n    public String getFilterName() {\n      return this.getClass().getName();\n    }\n\n    @Override\n    public ServletContext getServletContext() {\n      throw new UnsupportedOperationException(\n          \"The method does not supported in \" + this.getClass());\n    }\n\n    @Override\n    public String getInitParameter(String key) {\n      return this.filterParams.get(key);\n    }\n\n    @Override\n    public Enumeration<String> getInitParameterNames() {\n      return Collections.enumeration(filterParams.keySet());\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-json/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-commons-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-commons-json</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: Commons :: Json helpers</name>\n    <dependencies>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "core/commons/che-core-commons-json/src/main/java/org/eclipse/che/commons/json/JsonHelper.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.json;\n\nimport java.io.*;\nimport java.lang.reflect.Type;\nimport java.nio.charset.Charset;\nimport java.util.Collection;\nimport java.util.Map;\nimport org.everrest.core.impl.provider.json.*;\n\n/** Tool to serialize/deserialize Java objects to/from JSON representation. */\npublic class JsonHelper {\n  @SuppressWarnings(\"unchecked\")\n  public static <O> String toJson(O instance) {\n    return toJson(instance, JsonNameConventions.DEFAULT);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public static <O> String toJson(O instance, JsonNameConvention nameConvention) {\n    try {\n      JsonValue json;\n      if (instance.getClass().isArray()) {\n        json = JsonGenerator.createJsonArray(instance);\n      } else if (instance instanceof Collection) {\n        json = JsonGenerator.createJsonArray((Collection<?>) instance);\n      } else if (instance instanceof Map) {\n        json = JsonGenerator.createJsonObjectFromMap((Map<String, ?>) instance);\n      } else {\n        json = JsonGenerator.createJsonObject(instance);\n      }\n\n      Writer w = new StringWriter();\n      json.writeTo(new NameConventionJsonWriter(w, nameConvention));\n      return w.toString();\n    } catch (JsonException jsone) {\n      // Must not happen since serialize well known object.\n      throw new RuntimeException(jsone.getMessage(), jsone);\n    }\n  }\n\n  public static <O> O fromJson(String json, Class<O> klass, Type type) throws JsonParseException {\n    return fromJson(parseJson(json), klass, type);\n  }\n\n  public static <O> O fromJson(\n      String json, Class<O> klass, Type type, JsonNameConvention nameConvention)\n      throws JsonParseException {\n    return fromJson(parseJson(json, nameConvention), klass, type);\n  }\n\n  public static <O> O fromJson(InputStream json, Class<O> klass, Type type)\n      throws JsonParseException {\n    return fromJson(parseJson(json), klass, type);\n  }\n\n  public static <O> O fromJson(\n      InputStream json, Class<O> klass, Type type, JsonNameConvention nameConvention)\n      throws JsonParseException {\n    return fromJson(parseJson(json, nameConvention), klass, type);\n  }\n\n  public static <O> O fromJson(Reader json, Class<O> klass, Type type) throws JsonParseException {\n    return fromJson(parseJson(json), klass, type);\n  }\n\n  public static <O> O fromJson(\n      Reader json, Class<O> klass, Type type, JsonNameConvention nameConvention)\n      throws JsonParseException {\n    return fromJson(parseJson(json, nameConvention), klass, type);\n  }\n\n  public static <O> O fromJson(JsonValue jsonValue, Class<O> klass, Type type)\n      throws JsonParseException {\n    try {\n      O instance;\n      if (klass.isArray()) {\n        instance = (O) ObjectBuilder.createArray(klass, jsonValue);\n      } else if (Collection.class.isAssignableFrom(klass)) {\n        Class k = klass;\n        instance = (O) ObjectBuilder.createCollection(k, type, jsonValue);\n      } else if (Map.class.isAssignableFrom(klass)) {\n        Class k = klass;\n        instance = (O) ObjectBuilder.createObject(k, type, jsonValue);\n      } else {\n        instance = ObjectBuilder.createObject(klass, jsonValue);\n      }\n      return instance;\n    } catch (JsonException jsone) {\n      throw new JsonParseException(jsone.getMessage(), jsone);\n    }\n  }\n\n  public static JsonValue parseJson(String json) throws JsonParseException {\n    return parseJson(new StringReader(json));\n  }\n\n  public static JsonValue parseJson(String json, JsonNameConvention nameConvention)\n      throws JsonParseException {\n    return parseJson(new StringReader(json), nameConvention);\n  }\n\n  public static JsonValue parseJson(InputStream json) throws JsonParseException {\n    return parseJson(new InputStreamReader(json, Charset.forName(\"UTF-8\")));\n  }\n\n  public static JsonValue parseJson(InputStream json, JsonNameConvention nameConvention)\n      throws JsonParseException {\n    return parseJson(new InputStreamReader(json, Charset.forName(\"UTF-8\")), nameConvention);\n  }\n\n  public static JsonValue parseJson(Reader json) throws JsonParseException {\n    return parseJson(json, JsonNameConventions.DEFAULT);\n  }\n\n  public static JsonValue parseJson(Reader json, JsonNameConvention nameConvention)\n      throws JsonParseException {\n    try {\n      JsonParser parser = new NameConventionJsonParser(nameConvention);\n      parser.parse(json);\n      return parser.getJsonObject();\n    } catch (JsonException jsone) {\n      throw new JsonParseException(jsone.getMessage(), jsone);\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-json/src/main/java/org/eclipse/che/commons/json/JsonNameConvention.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.json;\n\n/**\n * Abstraction to provide name transformation between JSON and Java names. It helps correct\n * translate JSON names to correct name of Java fields or methods, e.g translate Java camel-case\n * name to lowercase JSON names with '-' or '_' separator. Pass implementation of this interface to\n * methods of {@link JsonHelper} to get required behaviour whe serialize or deserialize objects\n * to|from JSON.\n *\n * @see JsonNameConventions\n * @see NameConventionJsonParser\n * @see NameConventionJsonWriter\n */\npublic interface JsonNameConvention {\n  /**\n   * Translate Java field name to JSON name, e.g. 'userName' -> 'user_name'\n   *\n   * @param javaName Java field name\n   * @return JSON name\n   */\n  String toJsonName(String javaName);\n\n  /**\n   * Translate JSON name to Java field name, e.g. 'user_name' -> 'userName'\n   *\n   * @param jsonName JSON name\n   * @return Java field name\n   */\n  String toJavaName(String jsonName);\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-json/src/main/java/org/eclipse/che/commons/json/JsonNameConventions.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.json;\n\n/** Prepared name conversion conventions for Java &lt;-&gt; JSON transformation. */\npublic enum JsonNameConventions implements JsonNameConvention {\n  /**\n   * Default implementation of JsonNameConvention. It does not convert name.\n   *\n   * <p>How to serialize with JsonHelper:\n   *\n   * <pre>\n   *    Foo foo = new Foo();\n   *    foo.setFooBar(\"foo\");\n   *    System.out.println(JsonHelper.toJson(foo, JsonNameConventions.DEFAULT));\n   * </pre>\n   *\n   * Code above prints:\n   *\n   * <pre>\n   *    {\"fooBar\":\"foo\"}\n   * </pre>\n   *\n   * <p>How to deserialize with JsonHelper:\n   *\n   * <pre>\n   *    class Foo {\n   *       private String fooBar;\n   *\n   *       public String getFooBar() {\n   *          return fooBar;\n   *       }\n   *\n   *       public void setFooBar(String fooBar) {\n   *          this.fooBar = fooBar;\n   *       }\n   *    }\n   *\n   *    ...\n   *\n   *    String json = \"{\\\"fooBar\\\":\\\"foo\\\"}\";\n   *    Foo foo = fromJson(json, Foo.class, null, JsonNameConventions.DEFAULT);\n   *    System.out.println(foo.getFooBar());\n   * </pre>\n   *\n   * Code above prints:\n   *\n   * <pre>\n   *    foo\n   * </pre>\n   */\n  DEFAULT() {\n    @Override\n    public String toJsonName(String javaName) {\n      return javaName;\n    }\n\n    @Override\n    public String toJavaName(String jsonName) {\n      return jsonName;\n    }\n  },\n\n  /**\n   * Implementation of JsonNameConvention converts Java camel-case names to lower-case names with\n   * underscore as separator, e.g 'userName' -> 'user_name'.\n   *\n   * <p>How to serialize with JsonHelper:\n   *\n   * <pre>\n   *    Foo foo = new Foo();\n   *    foo.setFooBar(\"foo\");\n   *    System.out.println(JsonHelper.toJson(foo, JsonNameConventions.CAMEL_UNDERSCORE));\n   * </pre>\n   *\n   * Code above prints:\n   *\n   * <pre>\n   *    {\"foo_bar\":\"foo\"}\n   * </pre>\n   *\n   * <p>How to deserialize with JsonHelper:\n   *\n   * <pre>\n   *    class Foo {\n   *       private String fooBar;\n   *\n   *       public String getFooBar() {\n   *          return fooBar;\n   *       }\n   *\n   *       public void setFooBar(String fooBar) {\n   *          this.fooBar = fooBar;\n   *       }\n   *    }\n   *\n   *    ...\n   *\n   *    String json = \"{\\\"foo_bar\\\":\\\"foo\\\"}\";\n   *    Foo foo = fromJson(json, Foo.class, null, JsonNameConventions.CAMEL_UNDERSCORE);\n   *    System.out.println(foo.getFooBar());\n   * </pre>\n   *\n   * Code above prints:\n   *\n   * <pre>\n   *    foo\n   * </pre>\n   */\n  CAMEL_UNDERSCORE() {\n    @Override\n    public String toJsonName(String javaName) {\n      return camelToUnderscored(javaName);\n    }\n\n    @Override\n    public String toJavaName(String jsonName) {\n      return separateWithToCamel(jsonName, '_');\n    }\n  },\n\n  /**\n   * Implementation of JsonNameConvention converts Java camel-case names to lower-case names with\n   * dash as separator, e.g 'userName' -> 'user_name'.\n   *\n   * <p>How to serialize with JsonHelper:\n   *\n   * <pre>\n   *    Foo foo = new Foo();\n   *    foo.setFooBar(\"foo\");\n   *    System.out.println(JsonHelper.toJson(foo, JsonNameConventions.CAMEL_DASHES));\n   * </pre>\n   *\n   * Code above prints:\n   *\n   * <pre>\n   *    {\"foo-bar\":\"foo\"}\n   * </pre>\n   *\n   * <p>How to deserialize with JsonHelper:\n   *\n   * <pre>\n   *    class Foo {\n   *       private String fooBar;\n   *\n   *       public String getFooBar() {\n   *          return fooBar;\n   *       }\n   *\n   *       public void setFooBar(String fooBar) {\n   *          this.fooBar = fooBar;\n   *       }\n   *    }\n   *\n   *    ...\n   *\n   *    String json = \"{\\\"foo-bar\\\":\\\"foo\\\"}\";\n   *    Foo foo = fromJson(json, Foo.class, null, JsonNameConventions.CAMEL_DASHES);\n   *    System.out.println(foo.getFooBar());\n   * </pre>\n   *\n   * Code above prints:\n   *\n   * <pre>\n   *    foo\n   * </pre>\n   */\n  CAMEL_DASH() {\n    @Override\n    public String toJsonName(String javaName) {\n      return camelToDashed(javaName);\n    }\n\n    @Override\n    public String toJavaName(String jsonName) {\n      return separateWithToCamel(jsonName, '-');\n    }\n  };\n\n  private static String camelToUnderscored(String src) {\n    return camelToSeparateWith(src, '_');\n  }\n\n  private static String camelToDashed(String src) {\n    return camelToSeparateWith(src, '-');\n  }\n\n  private static String camelToSeparateWith(String src, char separator) {\n    final StringBuilder sb = new StringBuilder();\n    final char[] chars = src.toCharArray();\n    for (char character : chars) {\n      if (Character.isUpperCase(character)) {\n        if (sb.length() > 0) {\n          sb.append(separator);\n        }\n        sb.append(Character.toLowerCase(character));\n      } else {\n        sb.append(character);\n      }\n    }\n    return sb.toString();\n  }\n\n  private static String separateWithToCamel(String src, char separator) {\n    StringBuilder sb = new StringBuilder();\n    final char[] chars = src.toCharArray();\n    for (int i = 0, length = chars.length; i < length; i++) {\n      if (chars[i] == separator) {\n        if (i == 0 || i == (length - 1)) {\n          // add as is first or last character\n          sb.append(chars[i]);\n        } else {\n          sb.append(Character.toUpperCase(chars[++i]));\n        }\n      } else {\n        sb.append(chars[i]);\n      }\n    }\n    return sb.toString();\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-json/src/main/java/org/eclipse/che/commons/json/JsonParseException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.json;\n\n@SuppressWarnings(\"serial\")\npublic class JsonParseException extends Exception {\n  public JsonParseException(String message, Throwable cause) {\n    super(message, cause);\n  }\n\n  public JsonParseException(String message) {\n    super(message);\n  }\n\n  public JsonParseException(Throwable cause) {\n    super(cause);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-json/src/main/java/org/eclipse/che/commons/json/NameConventionJsonParser.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.json;\n\nimport org.everrest.core.impl.provider.json.JsonHandler;\nimport org.everrest.core.impl.provider.json.JsonParser;\n\n/**\n * JSON parser that support transformation of names in JSON document.\n *\n * @see JsonNameConvention\n * @see JsonNameConventions\n */\npublic class NameConventionJsonParser extends JsonParser {\n  public NameConventionJsonParser(JsonNameConvention nameConvention) {\n    super(new NameConventionJsonHandler(nameConvention));\n  }\n\n  private static class NameConventionJsonHandler extends JsonHandler {\n    private final JsonNameConvention nameConvention;\n\n    private NameConventionJsonHandler(JsonNameConvention nameConvention) {\n      this.nameConvention = nameConvention;\n    }\n\n    @Override\n    public void key(String key) {\n      super.key(nameConvention.toJavaName(key));\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-json/src/main/java/org/eclipse/che/commons/json/NameConventionJsonWriter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.json;\n\nimport java.io.Writer;\nimport org.everrest.core.impl.provider.json.JsonException;\nimport org.everrest.core.impl.provider.json.JsonWriter;\n\npublic class NameConventionJsonWriter extends JsonWriter {\n  private final JsonNameConvention nameConvention;\n\n  public NameConventionJsonWriter(Writer writer, JsonNameConvention nameConvention) {\n    super(writer);\n    this.nameConvention = nameConvention;\n  }\n\n  @Override\n  public void writeKey(String key) throws JsonException {\n    super.writeKey(nameConvention.toJsonName(key));\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-json/src/test/java/org/eclipse/che/commons/json/JsonTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.json;\n\nimport static org.testng.Assert.assertEquals;\n\nimport org.testng.annotations.Test;\n\npublic class JsonTest {\n  public static class Foo {\n    private String fooBar;\n\n    public String getFooBar() {\n      return fooBar;\n    }\n\n    public void setFooBar(String fooBar) {\n      this.fooBar = fooBar;\n    }\n  }\n\n  @Test\n  public void testSerializeDefault() throws Exception {\n    String expectedJson = \"{\\\"fooBar\\\":\\\"test\\\"}\";\n    Foo foo = new Foo();\n    foo.setFooBar(\"test\");\n    assertEquals(expectedJson, JsonHelper.toJson(foo));\n  }\n\n  @Test\n  public void testSerializeUnderscore() throws Exception {\n    String expectedJson = \"{\\\"foo_bar\\\":\\\"test\\\"}\";\n    Foo foo = new Foo();\n    foo.setFooBar(\"test\");\n    assertEquals(expectedJson, JsonHelper.toJson(foo, JsonNameConventions.CAMEL_UNDERSCORE));\n  }\n\n  @Test\n  public void testSerializeDash() throws Exception {\n    String expectedJson = \"{\\\"foo-bar\\\":\\\"test\\\"}\";\n    Foo foo = new Foo();\n    foo.setFooBar(\"test\");\n    assertEquals(expectedJson, JsonHelper.toJson(foo, JsonNameConventions.CAMEL_DASH));\n  }\n\n  @Test\n  public void testDeserializeDefault() throws Exception {\n    String json = \"{\\\"fooBar\\\":\\\"test\\\"}\";\n    Foo foo = JsonHelper.fromJson(json, Foo.class, null);\n    assertEquals(\"test\", foo.getFooBar());\n  }\n\n  @Test\n  public void testDeserializeUnderscore() throws Exception {\n    String json = \"{\\\"foo_bar\\\":\\\"test\\\"}\";\n    Foo foo = JsonHelper.fromJson(json, Foo.class, null, JsonNameConventions.CAMEL_UNDERSCORE);\n    assertEquals(\"test\", foo.getFooBar());\n  }\n\n  @Test\n  public void testDeserializeDash() throws Exception {\n    String json = \"{\\\"foo-bar\\\":\\\"test\\\"}\";\n    Foo foo = JsonHelper.fromJson(json, Foo.class, null, JsonNameConventions.CAMEL_DASH);\n    assertEquals(\"test\", foo.getFooBar());\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-commons-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-commons-lang</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: Commons :: Java API extension classes</name>\n    <properties>\n        <findbugs.excludeFilterFile>${project.build.testSourceDirectory}/../resources/findbugs-exclude.xml</findbugs.excludeFilterFile>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <testResources>\n            <testResource>\n                <directory>src/test/resources</directory>\n            </testResource>\n        </testResources>\n        <plugins>\n            <plugin>\n                <groupId>com.mycila</groupId>\n                <artifactId>license-maven-plugin</artifactId>\n                <configuration>\n                    <excludes>\n                        <exclude>**/org/eclipse/che/commons/lang/FlushingStreamWriter.java</exclude>\n                    </excludes>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/Deserializer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport java.util.Map;\n\n/** A deserializer that resolve system properties to allow runtime configuration. */\npublic class Deserializer {\n  /**\n   * Resolve the variables of type ${my.var} for the current context from the system properties\n   *\n   * @param input the input value\n   * @return the resolve value\n   */\n  public static String resolveVariables(String input) {\n    return resolveVariables(input, null, true);\n  }\n\n  /**\n   * Resolve the variables of type ${my.var} for the current context which is composed only of the\n   * given settings\n   *\n   * @param input the input value\n   * @param props a set of parameters to add for the variable resolution\n   * @return the resolve value\n   */\n  public static String resolveVariables(String input, Map<String, String> props) {\n    return resolveVariables(input, props, true);\n  }\n\n  /**\n   * Resolve the variables of type ${my.var} for the current context which is composed of the system\n   * properties and the given settings\n   *\n   * @param input the input value\n   * @param props a set of parameters to add for the variable resolution\n   * @return the resolve value\n   */\n  public static String resolveVariables(\n      String input, Map<String, String> props, boolean includeSysProps) {\n    final int NORMAL = 0;\n    final int SEEN_DOLLAR = 1;\n    final int IN_BRACKET = 2;\n    if (input == null) {\n      return input;\n    }\n    if (!includeSysProps && (props == null || props.size() == 0)) {\n      return input;\n    }\n    char[] chars = input.toCharArray();\n    StringBuffer buffer = new StringBuffer();\n    boolean properties = false;\n    int state = NORMAL;\n    int start = 0;\n    for (int i = 0; i < chars.length; ++i) {\n      char c = chars[i];\n      if (c == '$' && state != IN_BRACKET) {\n        state = SEEN_DOLLAR;\n      } else if (c == '{' && state == SEEN_DOLLAR) {\n        buffer.append(input.substring(start, i - 1));\n        state = IN_BRACKET;\n        start = i - 1;\n      } else if (state == SEEN_DOLLAR) {\n        state = NORMAL;\n      } else if (c == '}' && state == IN_BRACKET) {\n        if (start + 2 == i) {\n          buffer.append(\"${}\");\n        } else {\n          String value = null;\n          String key = input.substring(start + 2, i);\n\n          if (props != null) {\n            // Some parameters have been given thus we need to check\n            // inside first\n            String sValue = props.get(key);\n            value = sValue == null || sValue.length() == 0 ? null : sValue;\n          }\n          if (value == null && includeSysProps) {\n            // try to get it from the system properties\n            value = System.getProperty(key);\n          }\n\n          if (value != null) {\n            properties = true;\n            buffer.append(value);\n          }\n        }\n        start = i + 1;\n        state = NORMAL;\n      }\n    }\n    if (properties == false) {\n      return input;\n    }\n    if (start != chars.length) {\n      buffer.append(input.substring(start, chars.length));\n    }\n    return buffer.toString();\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/FlushingStreamWriter.java",
    "content": "/*\n * Copyright 2003-2007 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.eclipse.che.commons.lang;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.OutputStreamWriter;\n\n/**\n * Stream writer which flushes after each write operation.\n *\n * @author Guillaume Laforge\n */\npublic class FlushingStreamWriter extends OutputStreamWriter {\n\n  public FlushingStreamWriter(OutputStream out) {\n    super(out);\n  }\n\n  public void write(char[] cbuf, int off, int len) throws IOException {\n    super.write(cbuf, off, len);\n    flush();\n  }\n\n  public void write(int c) throws IOException {\n    super.write(c);\n    flush();\n  }\n\n  public void write(String str, int off, int len) throws IOException {\n    super.write(str, off, len);\n    flush();\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/IoUtil.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport static java.nio.file.FileVisitResult.CONTINUE;\nimport static java.nio.file.FileVisitResult.TERMINATE;\n\nimport jakarta.ws.rs.HttpMethod;\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.FileOutputStream;\nimport java.io.FilenameFilter;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.HttpURLConnection;\nimport java.net.URI;\nimport java.net.URL;\nimport java.net.URLConnection;\nimport java.nio.channels.FileChannel;\nimport java.nio.file.FileSystem;\nimport java.nio.file.FileSystemAlreadyExistsException;\nimport java.nio.file.FileSystems;\nimport java.nio.file.FileVisitOption;\nimport java.nio.file.FileVisitResult;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.PathMatcher;\nimport java.nio.file.Paths;\nimport java.nio.file.ProviderNotFoundException;\nimport java.nio.file.SimpleFileVisitor;\nimport java.nio.file.attribute.BasicFileAttributes;\nimport java.security.DigestInputStream;\nimport java.security.MessageDigest;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.EnumSet;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.function.Consumer;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class IoUtil {\n\n  private static final Logger LOG = LoggerFactory.getLogger(IoUtil.class);\n\n  private IoUtil() {}\n\n  /** Represents filter what select any file */\n  public static final FilenameFilter ANY_FILTER =\n      new FilenameFilter() {\n        @Override\n        public boolean accept(File dir, String name) {\n          return true;\n        }\n      };\n\n  /** Represent filter, that excludes .git entries. */\n  public static final FilenameFilter GIT_FILTER =\n      new FilenameFilter() {\n        @Override\n        public boolean accept(File dir, String name) {\n          return !(\".git\".equals(name));\n        }\n      };\n\n  /**\n   * Reads bytes from input stream and builds a string from them.\n   *\n   * @param inputStream source stream\n   * @return string\n   * @throws java.io.IOException if any i/o error occur\n   */\n  public static String readStream(InputStream inputStream) throws IOException {\n    if (inputStream == null) {\n      return null;\n    }\n    ByteArrayOutputStream bout = new ByteArrayOutputStream();\n    byte[] buf = new byte[8192];\n    int r;\n    while ((r = inputStream.read(buf)) != -1) {\n      bout.write(buf, 0, r);\n    }\n    return bout.toString(\"UTF-8\");\n  }\n\n  /**\n   * Reads bytes from input stream and builds a string from them. InputStream closed after\n   * consumption.\n   *\n   * @param inputStream source stream\n   * @return string\n   * @throws java.io.IOException if any i/o error occur\n   */\n  public static String readAndCloseQuietly(InputStream inputStream) throws IOException {\n    try {\n      return readStream(inputStream);\n    } catch (IOException e) {\n      LOG.error(e.getLocalizedMessage(), e);\n      throw e;\n    } finally {\n      if (inputStream != null) {\n        try {\n          inputStream.close();\n        } catch (IOException e) {\n          LOG.error(e.getLocalizedMessage(), e);\n        }\n      }\n    }\n  }\n\n  /**\n   * Looking for resource by given path. If no file exist by this path, method will try to find it\n   * in context.\n   *\n   * @param resource - path to resource\n   * @return - InputStream of resource\n   * @throws IOException when resource is not a file or resource not found\n   */\n  public static InputStream getResource(String resource) throws IOException {\n    File resourceFile = new File(resource);\n    if (resourceFile.exists() && !resourceFile.isFile()) {\n      throw new IOException(String.format(\"%s is not a file. \", resourceFile.getAbsolutePath()));\n    }\n    InputStream is =\n        resourceFile.exists()\n            ? new FileInputStream(resourceFile)\n            : Thread.currentThread().getContextClassLoader().getResourceAsStream(resource);\n    if (is == null) {\n      throw new FileNotFoundException(String.format(\"Resource %s is not found\", resource));\n    }\n    return is;\n  }\n\n  /**\n   * Lists all children resources.\n   *\n   * @param parent the root path represented in {@link URI} format\n   * @param consumer consumer for children resources\n   * @throws java.io.IOException if any i/o error occur\n   * @throws ProviderNotFoundException if a provider supporting the URI scheme is not installed\n   */\n  public static void listResources(URI parent, Consumer<Path> consumer) throws IOException {\n    FileSystem fileSystem = null;\n    try {\n      if (!\"file\".equals(parent.getScheme())) {\n        try {\n          fileSystem = FileSystems.newFileSystem(parent, Collections.emptyMap());\n        } catch (FileSystemAlreadyExistsException ignore) {\n        }\n      }\n\n      Path root = Paths.get(parent);\n      Files.list(root).forEach(consumer);\n    } finally {\n      // close FS only if only it has been initialized here\n      if (fileSystem != null) {\n        fileSystem.close();\n      }\n    }\n  }\n\n  /** Remove directory and all its sub-resources with specified path */\n  public static boolean removeDirectory(String pathToDir) {\n    return deleteRecursive(new File(pathToDir));\n  }\n\n  /**\n   * Remove specified file or directory.\n   *\n   * @param fileOrDirectory the file or directory to cancel\n   * @return <code>true</code> if specified File was deleted and <code>false</code> otherwise\n   */\n  public static boolean deleteRecursive(File fileOrDirectory) {\n    if (fileOrDirectory.isDirectory()) {\n      File[] list = fileOrDirectory.listFiles();\n      if (list == null) {\n        return false;\n      }\n      for (File f : list) {\n        if (!deleteRecursive(f)) {\n          return false;\n        }\n      }\n    }\n    if (!fileOrDirectory.delete()) {\n      if (fileOrDirectory.exists()) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Remove specified file or directory.\n   *\n   * @param fileOrDirectory the file or directory to cancel\n   * @param followLinks are symbolic links followed or not?\n   * @return <code>true</code> if specified File was deleted and <code>false</code> otherwise\n   */\n  public static boolean deleteRecursive(File fileOrDirectory, boolean followLinks) {\n    if (fileOrDirectory.isDirectory()) {\n      // If fileOrDirectory represents a symbolic link to a folder,\n      // do not read a target folder content. Just remove this symbolic link.\n      if (!followLinks && java.nio.file.Files.isSymbolicLink(fileOrDirectory.toPath())) {\n        return !fileOrDirectory.exists() || fileOrDirectory.delete();\n      }\n      File[] list = fileOrDirectory.listFiles();\n      if (list == null) {\n        return false;\n      }\n      for (File f : list) {\n        if (!deleteRecursive(f, followLinks)) {\n          return false;\n        }\n      }\n    }\n    if (!fileOrDirectory.delete()) {\n      if (fileOrDirectory.exists()) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Download file.\n   *\n   * @param parent parent directory, may be <code>null</code> then use 'java.io.tmpdir'\n   * @param prefix prefix of temporary file name, may not be <code>null</code> and must be at least\n   *     three characters long\n   * @param suffix suffix of temporary file name, may be <code>null</code>\n   * @param url URL for download\n   * @return downloaded file\n   * @throws java.io.IOException if any i/o error occurs\n   */\n  public static File downloadFile(File parent, String prefix, String suffix, URL url)\n      throws IOException {\n    File file = File.createTempFile(prefix, suffix, parent);\n    URLConnection conn = null;\n    final String protocol = url.getProtocol().toLowerCase(Locale.ENGLISH);\n    try {\n      conn = url.openConnection();\n      if (\"http\".equals(protocol) || \"https\".equals(protocol)) {\n        HttpURLConnection http = (HttpURLConnection) conn;\n        http.setInstanceFollowRedirects(false);\n        http.setRequestMethod(HttpMethod.GET);\n      }\n      try (InputStream input = conn.getInputStream();\n          FileOutputStream fOutput = new FileOutputStream(file)) {\n        byte[] b = new byte[8192];\n        int r;\n        while ((r = input.read(b)) != -1) {\n          fOutput.write(b, 0, r);\n        }\n      }\n    } finally {\n      if (conn != null && (\"http\".equals(protocol) || \"https\".equals(protocol))) {\n        ((HttpURLConnection) conn).disconnect();\n      }\n    }\n    return file;\n  }\n\n  /**\n   * Download file with redirection if got status 301, 302, 303. Will useful in case redirection\n   * http -> https\n   *\n   * @param parent parent directory, may be <code>null</code> then use 'java.io.tmpdir'\n   * @param prefix prefix of temporary file name, may not be <code>null</code> and must be at least\n   *     three characters long\n   * @param suffix suffix of temporary file name, may be <code>null</code>\n   * @param url URL for download\n   * @return downloaded file\n   * @throws java.io.IOException if any i/o error occurs\n   */\n  public static File downloadFileWithRedirect(File parent, String prefix, String suffix, URL url)\n      throws IOException {\n    File file = File.createTempFile(prefix, suffix, parent);\n    URLConnection conn = null;\n    final String protocol = url.getProtocol().toLowerCase(Locale.ENGLISH);\n    try {\n      conn = url.openConnection();\n      boolean redirect = false;\n      if (\"http\".equals(protocol) || \"https\".equals(protocol)) {\n        HttpURLConnection http = (HttpURLConnection) conn;\n        http.setRequestMethod(HttpMethod.GET);\n        int status = http.getResponseCode();\n        if (status == HttpURLConnection.HTTP_MOVED_TEMP\n            || status == HttpURLConnection.HTTP_MOVED_PERM\n            || status == HttpURLConnection.HTTP_SEE_OTHER) {\n          redirect = true;\n        }\n        if (redirect) {\n          String newUrl = conn.getHeaderField(\"Location\");\n          // open the new connection again\n          http.disconnect();\n          conn = new URL(newUrl).openConnection();\n          http = (HttpURLConnection) conn;\n          http.setRequestMethod(HttpMethod.GET);\n        }\n      }\n      try (InputStream input = conn.getInputStream();\n          FileOutputStream fOutput = new FileOutputStream(file)) {\n        byte[] b = new byte[8192];\n        int r;\n        while ((r = input.read(b)) != -1) {\n          fOutput.write(b, 0, r);\n        }\n      }\n    } finally {\n      if (conn != null && (\"http\".equals(protocol) || \"https\".equals(protocol))) {\n        ((HttpURLConnection) conn).disconnect();\n      }\n    }\n    return file;\n  }\n\n  /**\n   * Copy file or directory to the specified destination. Existed files in destination directory\n   * will be overwritten.\n   *\n   * @param source copy source\n   * @param target copy destination\n   * @param filter copy filter\n   * @throws java.io.IOException if any i/o error occurs\n   */\n  public static void copy(File source, File target, FilenameFilter filter) throws IOException {\n    copy(source, target, filter, false, true);\n  }\n\n  /**\n   * Copy file or directory to the specified destination. Existed files in destination directory\n   * will be overwritten.\n   *\n   * <p>This method use java.nio for coping files.\n   *\n   * @param source copy source\n   * @param target copy destination\n   * @param filter copy filter\n   * @throws java.io.IOException if any i/o error occurs\n   */\n  public static void nioCopy(File source, File target, FilenameFilter filter) throws IOException {\n    copy(source, target, filter, true, true);\n  }\n\n  /**\n   * Copy file or directory to the specified destination.\n   *\n   * @param source copy source\n   * @param target copy destination\n   * @param filter copy filter\n   * @param replaceIfExists if <code>true</code> existed files in destination directory will be\n   *     overwritten\n   * @throws java.io.IOException if any i/o error occurs\n   */\n  public static void copy(File source, File target, FilenameFilter filter, boolean replaceIfExists)\n      throws IOException {\n    copy(source, target, filter, false, replaceIfExists);\n  }\n\n  /**\n   * Copy file or directory to the specified destination.\n   *\n   * <p>This method use java.nio for coping files.\n   *\n   * @param source copy source\n   * @param target copy destination\n   * @param filter copy filter\n   * @param replaceIfExists if <code>true</code> existed files in destination directory will be\n   *     overwritten\n   * @throws java.io.IOException if any i/o error occurs\n   */\n  public static void nioCopy(\n      File source, File target, FilenameFilter filter, boolean replaceIfExists) throws IOException {\n    copy(source, target, filter, true, replaceIfExists);\n  }\n\n  private static void copy(\n      File source, File target, FilenameFilter filter, boolean nio, boolean replaceIfExists)\n      throws IOException {\n    if (source.isDirectory()) {\n      if (!(target.exists() || target.mkdirs())) {\n        throw new IOException(\n            String.format(\"Unable create directory '%s'. \", target.getAbsolutePath()));\n      }\n      if (filter == null) {\n        filter = ANY_FILTER;\n      }\n      String sourceRoot = source.getAbsolutePath();\n      LinkedList<File> q = new LinkedList<>();\n      q.add(source);\n      while (!q.isEmpty()) {\n        File current = q.pop();\n        File[] list = current.listFiles();\n        if (list != null) {\n          for (File f : list) {\n            if (!filter.accept(current, f.getName())) {\n              continue;\n            }\n            File newFile = new File(target, f.getAbsolutePath().substring(sourceRoot.length() + 1));\n            if (f.isDirectory()) {\n              if (!(newFile.exists() || newFile.mkdirs())) {\n                throw new IOException(\n                    String.format(\"Unable create directory '%s'. \", newFile.getAbsolutePath()));\n              }\n              if (!f.equals(target)) {\n                q.push(f);\n              }\n            } else {\n              if (nio) {\n                nioCopyFile(f, newFile, replaceIfExists);\n              } else {\n                copyFile(f, newFile, replaceIfExists);\n              }\n            }\n          }\n        }\n      }\n    } else {\n      File parent = target.getParentFile();\n      if (!(parent.exists() || parent.mkdirs())) {\n        throw new IOException(\n            String.format(\"Unable create directory '%s'. \", parent.getAbsolutePath()));\n      }\n      if (nio) {\n        nioCopyFile(source, target, replaceIfExists);\n      } else {\n        copyFile(source, target, replaceIfExists);\n      }\n    }\n  }\n\n  private static void copyFile(File source, File target, boolean replaceIfExists)\n      throws IOException {\n    if (!target.createNewFile()) {\n      if (target.exists() && !replaceIfExists) {\n        throw new IOException(\n            String.format(\"File '%s' already exists. \", target.getAbsolutePath()));\n      }\n    }\n\n    byte[] b = new byte[8192];\n    try (FileInputStream in = new FileInputStream(source);\n        FileOutputStream out = new FileOutputStream(target)) {\n      int r;\n      while ((r = in.read(b)) != -1) {\n        out.write(b, 0, r);\n      }\n    }\n  }\n\n  private static void nioCopyFile(File source, File target, boolean replaceIfExists)\n      throws IOException {\n    if (!target.createNewFile()) // atomic\n    {\n      if (target.exists() && !replaceIfExists) {\n        throw new IOException(\n            String.format(\"File '%s' already exists. \", target.getAbsolutePath()));\n      }\n    }\n\n    try (FileInputStream sourceStream = new FileInputStream(source);\n        FileOutputStream targetStream = new FileOutputStream(target);\n        FileChannel sourceChannel = sourceStream.getChannel();\n        FileChannel targetChannel = targetStream.getChannel()) {\n\n      final long size = sourceChannel.size();\n      long transferred = 0L;\n      while (transferred < size) {\n        transferred += targetChannel.transferFrom(sourceChannel, transferred, (size - transferred));\n      }\n    }\n  }\n\n  public static List<File> list(File dir, FilenameFilter filter) {\n    if (!dir.isDirectory()) {\n      throw new IllegalArgumentException(\"Not a directory. \");\n    }\n    if (filter == null) {\n      filter = ANY_FILTER;\n    }\n    List<File> files = new ArrayList<>();\n    LinkedList<File> q = new LinkedList<>();\n    q.add(dir);\n    while (!q.isEmpty()) {\n      File current = q.pop();\n      File[] list = current.listFiles();\n      if (list != null) {\n        for (File f : list) {\n          if (!filter.accept(current, f.getName())) {\n            continue;\n          }\n          if (f.isDirectory()) {\n            q.push(f);\n          } else {\n            files.add(f);\n          }\n        }\n      }\n    }\n    return files;\n  }\n\n  public static String countFileHash(File file, MessageDigest digest) throws IOException {\n    byte[] b = new byte[8192];\n    try (DigestInputStream dis = new DigestInputStream(new FileInputStream(file), digest)) {\n      while (dis.read(b) != -1)\n        ;\n      return toHex(digest.digest());\n    }\n  }\n\n  private static final char[] HEX = \"0123456789abcdef\".toCharArray();\n\n  public static String toHex(byte[] hash) {\n    StringBuilder b = new StringBuilder();\n    for (int i = 0; i < hash.length; i++) {\n      b.append(HEX[(hash[i] >> 4) & 0x0f]);\n      b.append(HEX[hash[i] & 0x0f]);\n    }\n    return b.toString();\n  }\n\n  /**\n   * Detects and returns {@code Path} to file by name pattern.\n   *\n   * @param pattern file name pattern\n   * @param folder path to folder that contains project sources\n   * @return pom.xml path\n   * @throws java.io.IOException if an I/O error is thrown while finding pom.xml\n   * @throws IllegalArgumentException if pom.xml not found\n   */\n  public static File findFile(String pattern, File folder) throws IOException {\n    Finder finder = new Finder(pattern);\n    Files.walkFileTree(\n        folder.toPath(), EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, finder);\n    if (finder.getFirstMatchedFile() == null) {\n      throw new IllegalArgumentException(\"File not found.\");\n    }\n    return finder.getFirstMatchedFile().toFile();\n  }\n\n  /** A {@code FileVisitor} that finds first file that match the specified pattern. */\n  private static class Finder extends SimpleFileVisitor<Path> {\n    private final PathMatcher matcher;\n    private Path firstMatchedFile;\n\n    Finder(String pattern) {\n      matcher = FileSystems.getDefault().getPathMatcher(\"glob:\" + pattern);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\n      Path fileName = file.getFileName();\n      if (fileName != null && matcher.matches(fileName)) {\n        firstMatchedFile = file;\n        return TERMINATE;\n      }\n      return CONTINUE;\n    }\n\n    /** Returns the first matched {@link java.nio.file.Path}. */\n    Path getFirstMatchedFile() {\n      return firstMatchedFile;\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/NameGenerator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport java.security.SecureRandom;\nimport java.util.Random;\n\npublic class NameGenerator {\n\n  private static final Random RANDOM = new SecureRandom();\n\n  private static final char[] CHARS = new char[36];\n\n  static {\n    int i = 0;\n    // [0..9]\n    for (int c = 48; c <= 57; c++) {\n      CHARS[i++] = (char) c;\n    }\n    // [a-z]\n    for (int c = 97; c <= 122; c++) {\n      CHARS[i++] = (char) c;\n    }\n  }\n\n  public static String generate(String prefix, int length) {\n    return generate(prefix, null, length);\n  }\n\n  public static String generate(String prefix, String suffix, int length) {\n    int bufLength = length;\n    if (prefix != null) {\n      bufLength += prefix.length();\n    }\n    if (suffix != null) {\n      bufLength += suffix.length();\n    }\n    final StringBuilder buf = new StringBuilder(bufLength);\n    if (prefix != null && !prefix.isEmpty()) {\n      buf.append(prefix);\n    }\n    for (int i = 0; i < length; i++) {\n      buf.append(CHARS[RANDOM.nextInt(CHARS.length)]);\n    }\n    if (suffix != null && !suffix.isEmpty()) {\n      buf.append(suffix);\n    }\n    return buf.toString();\n  }\n\n  private NameGenerator() {}\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/Pair.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\n/**\n * @author andrew00x\n */\npublic final class Pair<A, B> {\n\n  public static <K, V> Pair<K, V> of(K k, V v) {\n    return new Pair<>(k, v);\n  }\n\n  public final A first;\n  public final B second;\n\n  private final int hashCode;\n\n  public Pair(A first, B second) {\n    this.first = first;\n    this.second = second;\n    int hashCode = 7;\n    hashCode = hashCode * 31 + (first == null ? 0 : first.hashCode());\n    hashCode = hashCode * 31 + (second == null ? 0 : second.hashCode());\n    this.hashCode = hashCode;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof Pair<?, ?>)) {\n      return false;\n    }\n    final Pair other = (Pair) o;\n    return (first == null ? other.first == null : first.equals(other.first))\n        && (second == null ? other.second == null : second.equals(other.second));\n  }\n\n  @Override\n  public int hashCode() {\n    return hashCode;\n  }\n\n  @Override\n  public String toString() {\n    return \"{first=\" + first + \", second=\" + second + '}';\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/PathUtil.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.function.Supplier;\n\n/** Set of util methods for path strings. */\npublic class PathUtil {\n\n  /**\n   * Converts path to canonical form via traversing '..' and eliminating '.' and removing duplicate\n   * separators. <b>Note:</b> This method works for Unix paths only.\n   */\n  public static String toCanonicalPath(String path, boolean removeLastSlash) {\n    if (path == null || path.isEmpty()) {\n      return path;\n    }\n    if (path.charAt(0) == '.') {\n      if (path.length() == 1) {\n        return \"\";\n      }\n\n      char c = path.charAt(1);\n      if (c == '/') {\n        path = path.substring(2);\n      }\n    }\n\n    int index = -1;\n    do {\n      index = path.indexOf('/', index + 1);\n      char next = index == path.length() - 1 ? 0 : path.charAt(index + 1);\n      if (next == '.' || next == '/') {\n        break;\n      }\n\n    } while (index != -1);\n\n    if (index == -1) {\n      if (removeLastSlash) {\n        int start = processRoot(path, NullWriter.INSTANCE);\n        int slashIndex = path.lastIndexOf('/');\n        return slashIndex != -1 && slashIndex > start ? StringUtils.trimEnd(path, '/') : path;\n      }\n      return path;\n    }\n    String finalPath = path;\n    Supplier<String> canonicalPath =\n        () -> {\n          try {\n            return new File(finalPath).getCanonicalPath();\n          } catch (IOException ignore) {\n            return toCanonicalPath(finalPath, removeLastSlash);\n          }\n        };\n\n    StringBuilder result = new StringBuilder(path.length());\n    int start = processRoot(path, result);\n    int dots = 0;\n    boolean separator = true;\n\n    for (int i = start; i < path.length(); ++i) {\n      char c = path.charAt(i);\n      if (c == '/') {\n        if (!separator) {\n          if (!processDots(result, dots, start)) {\n            return canonicalPath.get();\n          }\n          dots = 0;\n        }\n        separator = true;\n      } else if (c == '.') {\n        if (separator || dots > 0) {\n          ++dots;\n        } else {\n          result.append('.');\n        }\n        separator = false;\n      } else {\n        if (dots > 0) {\n          StringUtils.repeatSymbol(result, '.', dots);\n          dots = 0;\n        }\n        result.append(c);\n        separator = false;\n      }\n    }\n\n    if (dots > 0) {\n      if (!processDots(result, dots, start)) {\n        return canonicalPath.get();\n      }\n    }\n\n    int lastChar = result.length() - 1;\n    if (removeLastSlash && lastChar >= 0 && result.charAt(lastChar) == '/' && lastChar > start) {\n      result.deleteCharAt(lastChar);\n    }\n    return result.toString();\n  }\n\n  private static boolean processDots(StringBuilder result, int dots, int start) {\n    if (dots == 2) {\n      int pos = -1;\n      if (!StringUtils.endWith(result, \"/../\") && !StringUtils.equals(result, \"../\")) {\n        pos = StringUtils.lastIndexOf(result, '/', start, result.length() - 1);\n        if (pos >= 0) {\n          ++pos;\n        } else if (start > 0) {\n          pos = start;\n        } else if (result.length() > 0) {\n          pos = 0;\n        }\n      }\n      if (pos >= 0) {\n        result.delete(pos, result.length());\n      } else {\n        result.append(\"../\");\n      }\n    } else if (dots != 1) {\n      StringUtils.repeatSymbol(result, '.', dots);\n      result.append('/');\n    }\n    return true;\n  }\n\n  private static int processRoot(String path, Appendable appendable) {\n    try {\n      if (!path.isEmpty() && path.charAt(0) == '/') {\n        appendable.append('/');\n        return 1;\n      }\n      if (path.length() > 2 && path.charAt(1) == ':' && path.charAt(2) == '/') {\n        appendable.append(path, 0, 3);\n        return 3;\n      }\n    } catch (IOException e) {\n      throw new RuntimeException(e);\n    }\n    return 0;\n  }\n\n  private static final class NullWriter implements Appendable {\n\n    public static final NullWriter INSTANCE = new NullWriter();\n\n    @Override\n    public Appendable append(CharSequence csq) throws IOException {\n      return this;\n    }\n\n    @Override\n    public Appendable append(CharSequence csq, int start, int end) throws IOException {\n      return this;\n    }\n\n    @Override\n    public Appendable append(char c) throws IOException {\n      return this;\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/Size.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport java.util.Locale;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * Helper for converting memory size to human readable representation and back, e.g 12K, 12kB, 1M,\n * etc.\n *\n * @author andrew00x\n */\npublic class Size {\n\n  /**\n   * Convert memory to human readable representation, e.g. 1 kB\n   *\n   * @param sizeInBytes size in bytes\n   * @return memory in human readable format\n   * @throws java.lang.IllegalArgumentException if {@code sizeInBytes} is negative\n   */\n  public static String toHumanSize(long sizeInBytes) {\n    if (sizeInBytes < 0) {\n      throw new IllegalArgumentException(String.format(\"Negative size: %d\", sizeInBytes));\n    }\n    if (sizeInBytes < K) {\n      return String.format(\"%d B\", sizeInBytes);\n    }\n    float size = 0.0f;\n    String suffix = \"PB\";\n    for (int i = 0, l = SIZE_UNITS.length; i < l; i++) {\n      Pair<Long, String> sizeUnit = SIZE_UNITS[i];\n      if (sizeInBytes >= sizeUnit.first) {\n        size = (float) sizeInBytes / sizeUnit.first;\n        suffix = sizeUnit.second;\n        break;\n      }\n    }\n    return String.format((size % 1.0f == 0) ? \"%.0f %s\" : \"%.1f %s\", size, suffix);\n  }\n\n  /**\n   * Parse human readable size string to long size in bytes.\n   *\n   * @param humanSize human readable size string\n   * @return long size in bytes\n   * @throws IllegalArgumentException if {@code humanSize} has incorrect format\n   */\n  public static long parseSize(String humanSize) {\n    return parseAndConvertToBytes(humanSize);\n  }\n\n  /**\n   * Parse human readable size string to long size in megabytes.\n   *\n   * @param humanSize human readable size string\n   * @return long size in megabytes\n   * @throws IllegalArgumentException if {@code humanSize} has incorrect format\n   */\n  public static long parseSizeToMegabytes(String humanSize) {\n    return parseAndConvertToBytes(humanSize) / M;\n  }\n\n  private static final long K = 1024;\n  private static final long M = K * K;\n  private static final long G = M * K;\n  private static final long T = G * K;\n  private static final long P = T * K;\n\n  @SuppressWarnings(\"unchecked\")\n  private static Pair<Long, String>[] SIZE_UNITS =\n      new Pair[] {\n        Pair.of(P, \"PB\"), Pair.of(T, \"TB\"), Pair.of(G, \"GB\"), Pair.of(M, \"MB\"), Pair.of(K, \"kB\")\n      };\n\n  private static final Pattern HUMAN_SIZE_PATTERN =\n      Pattern.compile(\"^([0-9]*(\\\\.[0-9]+)?)\\\\s*(\\\\S+)?$\");\n\n  private static long parseAndConvertToBytes(String sizeString) {\n    final Matcher matcher;\n    if ((matcher = HUMAN_SIZE_PATTERN.matcher(sizeString)).matches()) {\n      final float size = Float.parseFloat(matcher.group(1));\n      final String suffix = matcher.group(3);\n      if (suffix == null) {\n        return (long) size;\n      }\n      final String suffixL = suffix.toLowerCase(Locale.ENGLISH);\n      switch (suffixL) {\n        case \"b\":\n          return (long) (size);\n        case \"k\":\n        case \"kb\":\n        case \"kib\":\n          return (long) (size * K);\n        case \"m\":\n        case \"mb\":\n        case \"mib\":\n          return (long) (size * M);\n        case \"g\":\n        case \"gb\":\n        case \"gib\":\n          return (long) (size * G);\n        case \"t\":\n        case \"tb\":\n        case \"tib\":\n          return (long) (size * T);\n        case \"p\":\n        case \"pb\":\n        case \"pib\":\n          return (long) (size * P);\n      }\n    }\n    throw new IllegalArgumentException(\"Invalid size: \" + sizeString);\n  }\n\n  private Size() {}\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/StringUtils.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.base.Splitter;\nimport com.google.common.collect.Sets;\nimport java.util.Collections;\nimport java.util.Set;\n\n/** Set of useful String methods */\npublic class StringUtils {\n\n  /**\n   * Trim last char of the string if string ends with that char.\n   *\n   * @param s the string to trim\n   * @param suffix the suffix\n   * @return trimmed string\n   */\n  public static String trimEnd(String s, char suffix) {\n    if (endWithChar(s, suffix)) {\n      return s.substring(0, s.length() - 1);\n    }\n    return s;\n  }\n\n  /** Check if string ends with char. */\n  public static boolean endWithChar(String s, char suffix) {\n    return s != null && !s.isEmpty() && s.charAt(s.length() - 1) == suffix;\n  }\n\n  /** Add to builder 'times' symbol 'symbol' */\n  public static void repeatSymbol(StringBuilder builder, char symbol, int times) {\n    for (int i = 0; i < times; i++) {\n      builder.append(symbol);\n    }\n  }\n\n  /** Check if CharSequence end with suffix */\n  public static boolean endWith(CharSequence builder, CharSequence suffix) {\n    int bl = builder.length();\n    int sl = suffix.length();\n    if (bl < sl) {\n      return false;\n    }\n\n    for (int i = bl - 1; i >= bl - sl; i--) {\n      if (builder.charAt(i) != suffix.charAt(i + sl - bl)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /** Check that char sequences are equal */\n  public static boolean equals(CharSequence c1, CharSequence c2) {\n    if (c1 == null ^ c2 == null) {\n      return false;\n    }\n\n    if (c1 == null) {\n      return true;\n    }\n    if (c1.length() != c2.length()) {\n      return false;\n    }\n\n    for (int i = 0; i < c1.length(); i++) {\n      if (c1.charAt(i) != c2.charAt(i)) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * Returns the index within this string of the last occurrence of the specified char, searching in\n   * specified range\n   */\n  public static int lastIndexOf(CharSequence s, char c, int start, int end) {\n    start = Math.max(start, 0);\n    for (int i = Math.min(end, s.length()) - 1; i >= start; i--) {\n      if (s.charAt(i) == c) {\n        return i;\n      }\n    }\n    return -1;\n  }\n\n  /** Parse string to set of strings. String should be comma separated. Whitespaces are trimmed. */\n  public static Set<String> strToSet(String str) {\n    return strToSet(str, \",\");\n  }\n\n  /**\n   * Parse string to set of strings using the specified separator. Whitespaces are trimmed.\n   *\n   * @param str the string to parse\n   * @param delimiter the delimiter to split on\n   * @return set of strings\n   */\n  public static Set<String> strToSet(String str, String delimiter) {\n    if (!isNullOrEmpty(str)) {\n      return Sets.newHashSet(Splitter.on(delimiter).trimResults().omitEmptyStrings().split(str));\n    } else {\n      return Collections.emptySet();\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/TopologicalSort.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport static com.google.common.collect.Maps.newLinkedHashMapWithExpectedSize;\nimport static java.util.Collections.emptyList;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Comparator;\nimport java.util.HashSet;\nimport java.util.Iterator;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Set;\nimport java.util.TreeSet;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\n\n/**\n * This is an implementation of a stable topological sort on a directed graph.\n *\n * <p>The sorting does not pose any requirements on the types being sorted. Instead, the\n * implementation merely requires a function to provide it with a set of predecessors of a certain\n * \"node\". The implementation of the function is completely in the hands of the caller.\n *\n * <p>Additionally, a function to extract an \"ID\" from a node is required. The reasoning behind this\n * is that it usually is easier to work with identifiers when establishing the predecessors than\n * with the full node instances. That said, nothing prevents the caller from using the actual node\n * instance as its ID if the caller so wishes. The consequence of this is that, as a side-effect of\n * the sorting, the duplicates, as determined by the equality of {@code ID} instances, are removed\n * from the resulting sorted list.\n *\n * @param <N> the type of nodes\n * @param <ID> the type of a node ID\n */\npublic final class TopologicalSort<N, ID> {\n\n  private final Function<N, ID> identityExtractor;\n  private final Function<N, Set<ID>> directPredecessorsExtractor;\n\n  /**\n   * @param identityExtractor a function to extract some kind of value uniquely identifying a node\n   *     amongst the others.\n   * @param directPredecessorsExtractor a function returning a list of ids of direct predecessors of\n   *     a node\n   */\n  public TopologicalSort(\n      Function<N, ID> identityExtractor, Function<N, Set<ID>> directPredecessorsExtractor) {\n    this.identityExtractor = identityExtractor;\n    this.directPredecessorsExtractor = directPredecessorsExtractor;\n  }\n\n  /**\n   * Given the function for determining the predecessors of the nodes, return the list of the nodes\n   * in topological order. I.e. all predecessors will be placed sooner in the list than their\n   * successors. Note that the input collection is assumed to contain no duplicate entries as\n   * determined by the equality of the {@code ID} type. If such duplicates are present in the input\n   * collection, the output list will only contain the first instance of the duplicates from the\n   * input collection.\n   *\n   * <p>The implemented sort algorithm is stable. If there is no relationship between 2 nodes, they\n   * retain the relative position to each other as they had in the provided collection (e.g. if \"a\"\n   * preceded \"b\" in the original collection and there is no relationship between them (as\n   * determined by the predecessor function), the \"a\" will still precede \"b\" in the resulting list.\n   * Other nodes may be inserted in between them though in the result).\n   *\n   * <p>The cycles in the graph determined by the predecessor function are ignored and nodes in the\n   * cycle are placed into the output list in the source order.\n   *\n   * @param nodes the collection of nodes\n   * @return the list of nodes sorted in topological order\n   */\n  public List<N> sort(Collection<N> nodes) {\n    // the linked hashmap is important to retain the original order of elements unless required\n    // by the dependencies between nodes\n    LinkedHashMap<ID, NodeInfo<ID, N>> nodeInfos = newLinkedHashMapWithExpectedSize(nodes.size());\n    List<NodeInfo<ID, N>> results = new ArrayList<>(nodes.size());\n\n    int pos = 0;\n    boolean needsSorting = false;\n    for (N node : nodes) {\n      ID nodeID = identityExtractor.apply(node);\n      // we need the set to be modifiable, so let's make our own\n      Set<ID> preds = new HashSet<>(directPredecessorsExtractor.apply(node));\n      needsSorting = needsSorting || !preds.isEmpty();\n\n      NodeInfo<ID, N> nodeInfo = nodeInfos.computeIfAbsent(nodeID, __ -> new NodeInfo<>());\n      nodeInfo.id = nodeID;\n      nodeInfo.predecessors = preds;\n      nodeInfo.sourcePosition = pos++;\n      nodeInfo.node = node;\n\n      for (ID pred : preds) {\n        // note that this means that we're inserting the nodeinfos into the map in an incorrect\n        // order and will have to sort them in the source order before we do the actual topo sort.\n        // We take that cost because we gamble on there being no dependencies in the nodes as a\n        // common case.\n        NodeInfo<ID, N> predNode = nodeInfos.computeIfAbsent(pred, __ -> new NodeInfo<>());\n        if (predNode.successors == null) {\n          predNode.successors = new HashSet<>();\n        }\n        predNode.successors.add(nodeID);\n      }\n    }\n\n    if (needsSorting) {\n      // because of the predecessors, we have put the nodeinfos in the map in an incorrect order.\n      // we need to correct that before we try to sort...\n      TreeSet<NodeInfo<ID, N>> tmp = new TreeSet<>(Comparator.comparingInt(a -> a.sourcePosition));\n      tmp.addAll(nodeInfos.values());\n      nodeInfos.clear();\n      tmp.forEach(ni -> nodeInfos.put(ni.id, ni));\n\n      // now we're ready to produce the results\n      sort(nodeInfos, results);\n    } else {\n      // we don't need to sort, but we need to keep the expected behavior of removing the duplicates\n      results = new ArrayList<>(nodeInfos.values());\n    }\n\n    return results.stream().map(ni -> ni.node).collect(Collectors.toList());\n  }\n\n  private void sort(LinkedHashMap<ID, NodeInfo<ID, N>> nodes, List<NodeInfo<ID, N>> results) {\n\n    while (!nodes.isEmpty()) {\n      NodeInfo<ID, N> curr = removeFirstIndependent(nodes);\n      if (curr != null) {\n        // yay, simple. Just add the found independent node to the results.\n        results.add(curr);\n      } else {\n        // ok, there is a cycle in the graph. Let's remove all the nodes in the first cycle we find\n        // from our predecessors map, add them to the result in their original order and try to\n        // continue normally\n\n        // find the first cycle in the predecessors (in the original list order)\n        Iterator<NodeInfo<ID, N>> nexts = nodes.values().iterator();\n        List<NodeInfo<ID, N>> cycle;\n        do {\n          curr = nexts.next();\n          cycle = findCycle(curr, nodes);\n        } while (cycle.isEmpty() && nexts.hasNext());\n\n        // If we ever find a graph that doesn't have any independent node, yet we fail to find a\n        // cycle in it, the universe must be broken.\n        if (cycle.isEmpty()) {\n          throw new IllegalStateException(\n              String.format(\n                  \"Failed to find a cycle in a graph that doesn't seem to  have any independent\"\n                      + \" node. This should never happen. Please file a bug. Current state of the\"\n                      + \" sorting is: nodes=%s, results=%s\",\n                  nodes.toString(), results.toString()));\n        }\n\n        cycle.sort(Comparator.comparingInt(a -> a.sourcePosition));\n\n        for (NodeInfo<ID, N> n : cycle) {\n          removePredecessorMapping(nodes, n);\n          results.add(n);\n        }\n      }\n    }\n  }\n\n  private void removePredecessorMapping(Map<ID, NodeInfo<ID, N>> nodes, NodeInfo<ID, N> node) {\n    forgetNodeInSuccessors(node, nodes);\n    nodes.remove(node.id);\n  }\n\n  private void forgetNodeInSuccessors(NodeInfo<ID, N> node, Map<ID, NodeInfo<ID, N>> nodes) {\n    if (node.successors != null) {\n      for (ID succ : node.successors) {\n        NodeInfo<ID, N> succNode = nodes.get(succ);\n        if (succNode != null) {\n          succNode.predecessors.remove(node.id);\n        }\n      }\n    }\n  }\n\n  private List<NodeInfo<ID, N>> findCycle(NodeInfo<ID, N> node, Map<ID, NodeInfo<ID, N>> nodes) {\n    // bail out quickly if there are no preds - should be fairly common occurrence hopefully\n    Set<ID> preds = node.predecessors;\n    if (preds == null || preds.isEmpty()) {\n      return emptyList();\n    }\n\n    List<NodeInfo<ID, N>> ret = new ArrayList<>();\n    List<ID> todo = new ArrayList<>(preds);\n\n    Set<ID> visited = new HashSet<>();\n\n    while (!todo.isEmpty()) {\n      ID n = todo.remove(0);\n\n      if (visited.contains(n)) {\n        continue;\n      }\n\n      visited.add(n);\n\n      NodeInfo<ID, N> predNode = nodes.get(n);\n      if (predNode != null) {\n        todo.addAll(predNode.predecessors);\n        ret.add(predNode);\n\n        if (predNode.equals(node)) {\n          // we found the cycle to our original node\n          return ret;\n        }\n      }\n    }\n\n    return emptyList();\n  }\n\n  private NodeInfo<ID, N> removeFirstIndependent(Map<ID, NodeInfo<ID, N>> nodes) {\n    Iterator<Entry<ID, NodeInfo<ID, N>>> it = nodes.entrySet().iterator();\n\n    while (it.hasNext()) {\n      Entry<ID, NodeInfo<ID, N>> e = it.next();\n      if (e.getValue().predecessors.isEmpty()) {\n        it.remove();\n        NodeInfo<ID, N> ret = e.getValue();\n        forgetNodeInSuccessors(ret, nodes);\n        return ret;\n      }\n    }\n\n    return null;\n  }\n\n  private static final class NodeInfo<ID, N> {\n    private ID id;\n    private int sourcePosition;\n    private Set<ID> predecessors;\n    private Set<ID> successors;\n    private N node;\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/URLEncodedUtils.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport java.io.UnsupportedEncodingException;\nimport java.net.URI;\nimport java.net.URLDecoder;\nimport java.net.URLEncoder;\nimport java.util.*;\n\n/** A collection of utilities for encoding URLs. */\npublic class URLEncodedUtils {\n\n  private static final String PARAMETER_SEPARATOR = \"&\";\n  private static final String NAME_VALUE_SEPARATOR = \"=\";\n\n  /**\n   * Returns Map<String, Set<String>> as built from the URI's query portion. For example, a URI of\n   * http://example.org/path/to/file?a=1&b=2&c=3&c=4 would return a Map three key is a name name of\n   * parameter Set<String> is a values, a={1}, one for b={2} and two for c={3,4}.\n   *\n   * <p>\n   *\n   * <p>This is typically useful while parsing an HTTP PUT.\n   *\n   * @param uri uri to parse\n   * @param encoding encoding to use while parsing the query.\n   */\n  public static Map<String, Set<String>> parse(final URI uri, final String encoding) {\n    Map<String, Set<String>> result = Collections.emptyMap();\n    final String query = uri.getRawQuery();\n    if (query != null && query.length() > 0) {\n      result = new HashMap<>();\n      parse(result, new Scanner(query), encoding, true);\n    }\n    return result;\n  }\n\n  /**\n   * Returns Map<String, Set<String>> as built from the URI's query portion. Parameters encoding\n   * does not performed. For example, a URI of http://example.org/path/to/file?a=1&b=2&c=3&c=4 would\n   * return a Map three key is a name name of parameter Set<String> is a values, a={1}, one for\n   * b={2} and two for c={3,4}.\n   *\n   * <p>\n   *\n   * <p>This is typically useful while parsing an HTTP PUT.\n   *\n   * @param uri uri to parse\n   */\n  public static Map<String, Set<String>> parse(final URI uri) {\n    return parse(uri, true);\n  }\n\n  /**\n   * Returns Map<String, Set<String>> as built from the URI's query portion. Parameters encoding\n   * does not performed. For example, a URI of http://example.org/path/to/file?a=1&b=2&c=3&c=4 would\n   * return a Map three key is a name name of parameter Set<String> is a values, a={1}, one for\n   * b={2} and two for c={3,4}.\n   *\n   * <p>\n   *\n   * <p>This is typically useful while parsing an HTTP PUT.\n   *\n   * @param uri uri to parse\n   * @param decodeQueryParam decode query parameter or not.\n   */\n  public static Map<String, Set<String>> parse(final URI uri, boolean decodeQueryParam) {\n    Map<String, Set<String>> result = Collections.emptyMap();\n    final String query = uri.getRawQuery();\n    if (query != null && query.length() > 0) {\n      result = new HashMap<>();\n      parse(result, new Scanner(query), null, decodeQueryParam);\n    }\n    return result;\n  }\n\n  /**\n   * Adds all parameters within the Scanner to the list of <code>parameters</code>, as encoded by\n   * <code>encoding</code>. If <code>encoding</code> is null encoding does not performed. For\n   * example, a scanner containing the string <code>a=1&b=2&c=3</code> would add the Map<String,\n   * Set<String>> a=1, b=2, and c=3 to the list of parameters.\n   *\n   * @param parameters List to add parameters to.\n   * @param scanner Input that contains the parameters to parse.\n   * @param encoding Encoding to use when decoding the parameters. If encoding is null encoding does\n   *     not performed.\n   */\n  private static void parse(\n      final Map<String, Set<String>> parameters,\n      final Scanner scanner,\n      final String encoding,\n      boolean decodeQueryParam) {\n    scanner.useDelimiter(PARAMETER_SEPARATOR);\n    while (scanner.hasNext()) {\n      final String[] nameValue = scanner.next().split(NAME_VALUE_SEPARATOR);\n      if (nameValue.length == 0 || nameValue.length > 2)\n        throw new IllegalArgumentException(\"bad parameter\");\n\n      final String name = decodeQueryParam ? decode(nameValue[0], encoding) : nameValue[0];\n      String value = null;\n      if (nameValue.length == 2)\n        value = decodeQueryParam ? decode(nameValue[1], encoding) : nameValue[1];\n\n      Set<String> values = parameters.get(name);\n      if (values == null) {\n        values = new LinkedHashSet<>();\n        parameters.put(name, values);\n      }\n      if (value != null) {\n        values.add(value);\n      }\n    }\n  }\n\n  /**\n   * Returns a String that is suitable for use as an <code>application/x-www-form-urlencoded</code>\n   * list of parameters in an HTTP PUT or HTTP POST.\n   *\n   * @param parameters The parameters to include.\n   * @param encoding The encoding to use.\n   */\n  public static String format(final Map<String, Set<String>> parameters, final String encoding) {\n    final StringBuilder result = new StringBuilder();\n\n    for (Map.Entry<String, Set<String>> parameter : parameters.entrySet()) {\n      final String encodedName = encode(parameter.getKey(), encoding);\n      final Set<String> values = parameter.getValue();\n      if (values == null || values.size() == 0) {\n        result.append(encodedName);\n        result.append(NAME_VALUE_SEPARATOR);\n        result.append(\"\");\n      } else {\n        for (String value : values) {\n          final String encodedValue = value != null ? encode(value, encoding) : \"\";\n          if (result.length() > 0) result.append(PARAMETER_SEPARATOR);\n          result.append(encodedName);\n          result.append(NAME_VALUE_SEPARATOR);\n          result.append(encodedValue);\n        }\n      }\n    }\n    return result.toString();\n  }\n\n  private static String decode(final String content, final String encoding) {\n    try {\n      return URLDecoder.decode(content, encoding != null ? encoding : \"UTF-8\");\n    } catch (UnsupportedEncodingException problem) {\n      throw new IllegalArgumentException(problem);\n    }\n  }\n\n  private static String encode(final String content, final String encoding) {\n    try {\n      return URLEncoder.encode(content, encoding != null ? encoding : \"UTF-8\");\n    } catch (UnsupportedEncodingException problem) {\n      throw new IllegalArgumentException(problem);\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/UrlUtils.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport jakarta.ws.rs.core.UriInfo;\nimport java.io.UnsupportedEncodingException;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.net.URLDecoder;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/** TODO replace this class with URLEncodedUtils */\npublic class UrlUtils {\n  /**\n   * Retrieve query parameters map from String representation of url\n   *\n   * @param url\n   * @return - <code>Map</code> with parameters names as map keys and parameters values as map\n   *     values\n   * @throws UnsupportedEncodingException\n   */\n  public static Map<String, List<String>> getQueryParameters(URL url)\n      throws UnsupportedEncodingException {\n    Map<String, List<String>> params = new HashMap<>();\n    String query = url.getQuery();\n    if (query != null) {\n      for (String param : query.split(\"&\")) {\n        String pair[] = param.split(\"=\");\n        String key = URLDecoder.decode(pair[0], \"UTF-8\");\n        String value = null;\n        if (pair.length > 1) {\n          value = URLDecoder.decode(pair[1], \"UTF-8\");\n        }\n        List<String> values = params.get(key);\n        if (values == null) {\n          values = new ArrayList<>();\n          params.put(key, values);\n        }\n        values.add(value);\n      }\n    }\n    return params;\n  }\n\n  /**\n   * Get state query parameter from request url.\n   *\n   * @return state parameter encoded in application/x-www-form-urlencoded MIME format\n   */\n  public static String getState(URL requestUrl) {\n    final String query = requestUrl.getQuery();\n    if (!isNullOrEmpty(query)) {\n      int start = query.indexOf(\"state=\");\n      if (start < 0) {\n        return null;\n      }\n      int end = query.indexOf('&', start);\n      if (end < 0) {\n        end = query.length();\n      }\n\n      // {@code OAuthAuthenticator} encodes state parameter in UTF-8\n      return URLDecoder.decode(query.substring(start + 6, end), StandardCharsets.UTF_8);\n    }\n    return null;\n  }\n\n  /**\n   * Retrieve parameters map from state parameter.\n   *\n   * @param state state parameter encoded in application/x-www-form-urlencoded MIME format\n   * @return - <code>Map</code> with parameters names as map keys and parameters values as map\n   *     values\n   */\n  public static Map<String, List<String>> getQueryParametersFromState(String state) {\n    Map<String, List<String>> params = new HashMap<>();\n    if (isNullOrEmpty(state)) {\n      return params;\n    }\n    try {\n      for (String pair : URLDecoder.decode(state, \"UTF-8\").split(\"&\")) {\n        if (pair.isEmpty()) {\n          continue;\n        }\n        String name;\n        String value;\n        int eq = pair.indexOf('=');\n        if (eq < 0) {\n          name = pair;\n          value = \"\";\n        } else {\n          name = pair.substring(0, eq);\n          value = pair.substring(eq + 1);\n        }\n        List<String> paramValues = params.computeIfAbsent(name, values -> new ArrayList<>());\n        paramValues.add(value);\n      }\n    } catch (UnsupportedEncodingException ignored) {\n      // should never happen, UTF-8 supported.\n    }\n    return params;\n  }\n\n  /**\n   * Extract parameter value from given parameters map.\n   *\n   * @param parameters <code>Map</code> with parameters names as map keys and parameters values as\n   *     map values\n   * @param name name of the requested parameter\n   * @return parameter value or null if it was not found in parameters map\n   */\n  public static String getParameter(Map<String, List<String>> parameters, String name) {\n    List<String> l = parameters.get(name);\n    if (!(l == null || l.isEmpty())) {\n      return l.get(0);\n    }\n    return null;\n  }\n\n  /** Extract URL from given URI information. */\n  public static URL getRequestUrl(UriInfo uriInfo) {\n    try {\n      return uriInfo.getRequestUri().toURL();\n    } catch (MalformedURLException e) {\n      // should never happen\n      throw new RuntimeException(e.getMessage(), e);\n    }\n  }\n\n  private UrlUtils() {}\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/ZipUtils.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport java.io.BufferedInputStream;\nimport java.io.BufferedOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.util.Collection;\nimport java.util.Enumeration;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.function.Consumer;\nimport java.util.regex.Pattern;\nimport java.util.stream.Stream;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipFile;\nimport java.util.zip.ZipInputStream;\nimport java.util.zip.ZipOutputStream;\n\n/**\n * Utils for ZIP.\n *\n * @author Eugene Voevodin\n * @author Sergii Kabashniuk\n * @author Thomas Mäder\n */\npublic class ZipUtils {\n  private static final int BUF_SIZE = 4096;\n\n  private static class ExceptionWrapper extends RuntimeException {\n    private static final long serialVersionUID = 1L;\n\n    public ExceptionWrapper(Throwable cause) {\n      super(cause);\n    }\n  }\n\n  /**\n   * Creates a {@link ZipOutputStream} with proper buffering and options\n   *\n   * @param zip\n   * @return a newly opened stream\n   * @throws FileNotFoundException\n   */\n  public static ZipOutputStream stream(Path zip) throws FileNotFoundException {\n    ZipOutputStream result =\n        new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zip.toFile())));\n    result.setLevel(0);\n    return result;\n  }\n\n  /**\n   * This is equivalent to writing {@code #add(out, f, f.getParent())}\n   *\n   * @param out the stream to write to\n   * @param f the file or directory\n   * @throws IOException\n   */\n  public static void add(ZipOutputStream out, Path f) throws IOException {\n    add(out, f, f.getParent());\n  }\n\n  /**\n   * Recursively add the contents of the given file or directory to a {@link ZipOutputStream}\n   *\n   * @param out The zip file to add to\n   * @param f the file or directory to add to\n   * @param rootPath The path the zip entries are relative to. If f is /a/b/c and rootPath is /a,\n   *     the entry corresponding to f will be named b/c. Must be a prefix of f.\n   * @throws IOException\n   */\n  public static void add(ZipOutputStream out, Path f, Path rootPath) throws IOException {\n    if (!f.startsWith(rootPath)) {\n      throw new IllegalArgumentException(\n          \"'\" + String.valueOf(rootPath) + \"' is not a prefix of '\" + String.valueOf(f) + \"'\");\n    }\n    if (Files.isDirectory(f)) {\n      addDirectory(out, f, rootPath);\n    } else {\n      addFileEntry(out, relativePath(rootPath, f), f.toFile());\n    }\n  }\n\n  private static void addDirectory(ZipOutputStream out, Path d, Path root) throws IOException {\n    if (!root.equals(d)) {\n      addDirectoryEntry(out, relativePath(root, d));\n    }\n    try (Stream<Path> entries = Files.list(d)) {\n      entries.forEach(\n          path -> {\n            try {\n              add(out, path, root);\n            } catch (IOException e) {\n              throw new ExceptionWrapper(e);\n            }\n          });\n    } catch (ExceptionWrapper e) {\n      throw (IOException) e.getCause();\n    }\n  }\n\n  private static String relativePath(Path root, Path f) {\n    return root.relativize(f).toString().replaceAll(File.pathSeparator, \"/\");\n  }\n\n  private static void addDirectoryEntry(ZipOutputStream zipOut, String entryName)\n      throws IOException {\n    final ZipEntry zipEntry = new ZipEntry(entryName.endsWith(\"/\") ? entryName : (entryName + '/'));\n    zipOut.putNextEntry(zipEntry);\n    zipOut.closeEntry();\n  }\n\n  private static void addFileEntry(ZipOutputStream zipOut, String entryName, File file)\n      throws IOException {\n    final ZipEntry zipEntryEntry = new ZipEntry(entryName);\n    zipOut.putNextEntry(zipEntryEntry);\n    try (InputStream in = new BufferedInputStream(new FileInputStream(file))) {\n      final byte[] buf = new byte[BUF_SIZE];\n      int r;\n      while ((r = in.read(buf)) != -1) {\n        zipOut.write(buf, 0, r);\n      }\n    }\n    zipOut.closeEntry();\n  }\n\n  public static Collection<String> listEntries(File zip) throws IOException {\n    try (InputStream in = new FileInputStream(zip)) {\n      return listEntries(in);\n    }\n  }\n\n  public static Collection<String> listEntries(InputStream in) throws IOException {\n    final List<String> list = new LinkedList<>();\n    final ZipInputStream zipIn = new ZipInputStream(in);\n    ZipEntry zipEntry;\n    while ((zipEntry = zipIn.getNextEntry()) != null) {\n      if (!zipEntry.isDirectory()) {\n        list.add(zipEntry.getName());\n      }\n      zipIn.closeEntry();\n    }\n    return list;\n  }\n\n  public static void unzip(File zip, File targetDir) throws IOException {\n    try (InputStream in = new FileInputStream(zip)) {\n      unzip(in, targetDir);\n    }\n  }\n\n  public static void unzip(InputStream in, File targetDir) throws IOException {\n    final ZipInputStream zipIn = new ZipInputStream(in);\n    final byte[] b = new byte[BUF_SIZE];\n    ZipEntry zipEntry;\n    while ((zipEntry = zipIn.getNextEntry()) != null) {\n      final File file = new File(targetDir, zipEntry.getName());\n      if (!zipEntry.isDirectory()) {\n        final File parent = file.getParentFile();\n        if (!parent.exists()) {\n          if (!parent.mkdirs()) {\n            throw new IOException(\"Unable to create parent folder \" + parent.getAbsolutePath());\n          }\n        }\n        try (FileOutputStream fos = new FileOutputStream(file)) {\n          int r;\n          while ((r = zipIn.read(b)) != -1) {\n            fos.write(b, 0, r);\n          }\n        }\n      } else {\n        if (!file.exists()) {\n          if (!file.mkdirs()) {\n            throw new IOException(\"Unable to create folder \" + file.getAbsolutePath());\n          }\n        }\n      }\n      zipIn.closeEntry();\n    }\n  }\n\n  /**\n   * Provides streams to all resources matching {@code filter} criteria inside the archive.\n   *\n   * @param zip zip file to get resources from\n   * @param filter the search criteria\n   * @throws IOException\n   */\n  public static void getResources(ZipFile zip, Pattern filter, Consumer<InputStream> consumer)\n      throws IOException {\n    Enumeration<? extends ZipEntry> zipEntries = zip.entries();\n    while (zipEntries.hasMoreElements()) {\n      ZipEntry zipEntry = zipEntries.nextElement();\n      final String name = zipEntry.getName();\n      if (filter.matcher(name).matches()) {\n        try (InputStream in = zip.getInputStream(zipEntry)) {\n          consumer.accept(in);\n        }\n      }\n    }\n  }\n\n  /**\n   * Checks is specified file is zip file or not. Zip file <a\n   * href=\"http://en.wikipedia.org/wiki/Zip_(file_format)#File_headers\">headers description</a>.\n   */\n  public static boolean isZipFile(File file) throws IOException {\n    if (file.isDirectory()) {\n      return false;\n    }\n    // NOTE: little-indian bytes order!\n    final byte[] bytes = new byte[4];\n    try (FileInputStream fIn = new FileInputStream(file)) {\n      if (fIn.read(bytes) != bytes.length) {\n        return false;\n      }\n    }\n\n    ByteBuffer zipFileHeaderSignature = ByteBuffer.wrap(bytes);\n    zipFileHeaderSignature.order(ByteOrder.LITTLE_ENDIAN);\n    return 0x04034b50 == zipFileHeaderSignature.getInt();\n  }\n\n  private ZipUtils() {}\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/CopyThreadLocalCallable.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.concurrent;\n\nimport java.util.Map;\nimport java.util.concurrent.Callable;\nimport org.slf4j.MDC;\n\n/**\n * @author andrew00x\n */\nclass CopyThreadLocalCallable<T> implements Callable<T> {\n  private final Callable<? extends T> wrapped;\n  private final ThreadLocalPropagateContext.ThreadLocalState threadLocalState;\n  private Map<String, String> currentMdcState;\n\n  CopyThreadLocalCallable(Callable<? extends T> wrapped) {\n    // Called from main thread. Copy the current values of all the ThreadLocal variables which\n    // registered in ThreadLocalPropagateContext.\n    this.wrapped = wrapped;\n    this.threadLocalState = ThreadLocalPropagateContext.currentThreadState();\n    this.currentMdcState = MDC.getCopyOfContextMap();\n  }\n\n  @Override\n  public T call() throws Exception {\n    try {\n      threadLocalState.propagate();\n      if (currentMdcState != null) {\n        MDC.setContextMap(currentMdcState);\n      }\n      return wrapped.call();\n    } finally {\n      threadLocalState.cleanup();\n      MDC.clear();\n    }\n  }\n\n  @Override\n  public String toString() {\n    return \"CopyThreadLocalCallable{ \" + wrapped.toString() + \" }\";\n  }\n\n  public Callable<? extends T> getWrapped() {\n    return wrapped;\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/CopyThreadLocalRunnable.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.concurrent;\n\nimport java.util.Map;\nimport org.slf4j.MDC;\n\n/**\n * @author andrew00x\n */\nclass CopyThreadLocalRunnable implements Runnable {\n  private final Runnable wrapped;\n  private final ThreadLocalPropagateContext.ThreadLocalState threadLocalState;\n  private Map<String, String> currentMdcState;\n\n  CopyThreadLocalRunnable(Runnable wrapped) {\n    // Called from main thread. Copy the current values of all the ThreadLocal variables which\n    // registered in ThreadLocalPropagateContext.\n    this.wrapped = wrapped;\n    this.threadLocalState = ThreadLocalPropagateContext.currentThreadState();\n    this.currentMdcState = MDC.getCopyOfContextMap();\n  }\n\n  @Override\n  public void run() {\n    try {\n      threadLocalState.propagate();\n      if (currentMdcState != null) {\n        MDC.setContextMap(currentMdcState);\n      }\n      wrapped.run();\n    } finally {\n      threadLocalState.cleanup();\n      MDC.clear();\n    }\n  }\n\n  @Override\n  public String toString() {\n    return \"CopyThreadLocalRunnable{ \" + wrapped.toString() + \" }\";\n  }\n\n  public Runnable getWrapped() {\n    return wrapped;\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/LoggingUncaughtExceptionHandler.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.concurrent;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Writes uncaught exceptions in threads being run by {@link java.util.concurrent.ExecutorService}\n * into application log.\n *\n * @author Max Shaposhnik\n */\npublic class LoggingUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {\n\n  private static final Logger LOG = LoggerFactory.getLogger(LoggingUncaughtExceptionHandler.class);\n\n  private static final LoggingUncaughtExceptionHandler INSTANCE =\n      new LoggingUncaughtExceptionHandler();\n\n  @Override\n  public void uncaughtException(Thread t, Throwable e) {\n    LOG.error(\n        String.format(\n            \"Runtime exception caught in thread %s. Message: %s\",\n            t.getName(), e.getLocalizedMessage()),\n        e);\n  }\n\n  public static LoggingUncaughtExceptionHandler getInstance() {\n    return INSTANCE;\n  }\n\n  private LoggingUncaughtExceptionHandler() {}\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/PropagatedThreadLocalsProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.concurrent;\n\n/**\n * Helps to identify classes which need propagating ThreadLocal variables with\n * ThreadLocalPropagateContext. Useful to avoid manual registration of ThreadLocal in\n * ThreadLocalPropagateContext.\n *\n * <pre>\n * Set&lt;PropagatedThreadLocalsProvider&gt; ps = ... // Look up all implementations of PropagatedThreadLocalsProvider\n * for (PropagatedThreadLocalsProvider p : ps) {\n *     for (ThreadLocal tl : p.getThreadLocals()) {\n *         ThreadLocalPropagateContext.addThreadLocal(tl);\n *     }\n * }\n * </pre>\n *\n * @author andrew00x\n */\npublic interface PropagatedThreadLocalsProvider {\n  ThreadLocal<?>[] getThreadLocals();\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/StripedLocks.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.concurrent;\n\nimport com.google.common.util.concurrent.Striped;\nimport java.util.concurrent.locks.Lock;\nimport java.util.concurrent.locks.ReadWriteLock;\n\n/**\n * Helper class to use striped locks in try-with-resources construction. Examples of usage:\n *\n * <pre>{@code\n * StripedLocks stripedLocks = new StripedLocks(16);\n * try (Unlocker u = stripedLocks.writeLock(myKey)) {\n *     syncedObject.write();\n * }\n *\n * try (Unlocker u = stripedLocks.readLock(myKey)) {\n *     syncedObject.read();\n * }\n *\n * try (Unlocker u = stripedLocks.writeAllLock(myKey)) {\n *     for (ObjectToSync objectToSync : allObjectsToSync) {\n *         objectToSync.write();\n *     }\n * }\n * }</pre>\n *\n * @author Alexander Garagatyi\n * @author Sergii Leschenko\n * @author Yevhenii Voevodin\n */\npublic class StripedLocks {\n\n  private final Striped<ReadWriteLock> striped;\n\n  public StripedLocks(int stripesCount) {\n    striped = Striped.readWriteLock(stripesCount);\n  }\n\n  /** Acquire read lock for provided key. */\n  public Unlocker readLock(String key) {\n    Lock lock = striped.get(key).readLock();\n    lock.lock();\n    return new LockUnlocker(lock);\n  }\n\n  /** Acquire write lock for provided key. */\n  public Unlocker writeLock(String key) {\n    Lock lock = striped.get(key).writeLock();\n    lock.lock();\n    return new LockUnlocker(lock);\n  }\n\n  /** Acquire write lock for all possible keys. */\n  public Unlocker writeAllLock() {\n    Lock[] locks = getAllWriteLocks();\n    for (Lock lock : locks) {\n      lock.lock();\n    }\n    return new LocksUnlocker(locks);\n  }\n\n  private Lock[] getAllWriteLocks() {\n    Lock[] locks = new Lock[striped.size()];\n    for (int i = 0; i < striped.size(); i++) {\n      locks[i] = striped.getAt(i).writeLock();\n    }\n    return locks;\n  }\n\n  private static class LockUnlocker implements Unlocker {\n\n    private final Lock lock;\n\n    private LockUnlocker(Lock lock) {\n      this.lock = lock;\n    }\n\n    @Override\n    public void unlock() {\n      lock.unlock();\n    }\n  }\n\n  private static class LocksUnlocker implements Unlocker {\n\n    private final Lock[] locks;\n\n    private LocksUnlocker(Lock[] locks) {\n      this.locks = locks;\n    }\n\n    @Override\n    public void unlock() {\n      for (Lock lock : locks) {\n        lock.unlock();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/ThreadLocalPropagateContext.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.concurrent;\n\nimport java.util.concurrent.Callable;\nimport java.util.concurrent.CopyOnWriteArrayList;\n\n/**\n * Helps propagating ThreadLocal variables to the child Threads, e.g. when {@link\n * java.util.concurrent.ExecutorService} is in use.\n *\n * <p>Usage example:\n *\n * <pre>\n * private static ThreadLocal&lt;MyClass&gt; myThreadLocal = new ThreadLocal&lt;&gt;();\n * static {\n *    // register ThreadLocal variable\n *    ThreadLocalPropagateContext.addThreadLocal(myThreadLocal);\n * }\n *\n * private ExecutorService executor = ...;\n *\n * ...\n *\n * // If need to start Runnable task with executor.\n * myThreadLocal.set(new MyClass()); // initialize ThreadLocal in 'main' thread\n * Runnable myRunnable = new Runnable() {\n *     public void run() {\n *         MyClass v = myThreadLocal.get(); // get ThreadLocal in 'child' thread and do something with it\n *     }\n * }\n * executor.submit(ThreadLocalPropagateContext.wrap(myRunnable)); // wrap Runnable and submit it to executor\n * </pre>\n *\n * @author andrew00x\n */\npublic class ThreadLocalPropagateContext {\n\n  private static CopyOnWriteArrayList<ThreadLocal<?>> toPropagate = new CopyOnWriteArrayList<>();\n\n  /**\n   * Register ThreadLocal in this context. After registration value of ThreadLocal from parent\n   * Thread is copied to the child thread when method {@link #wrap(Runnable)} or {@link\n   * #wrap(java.util.concurrent.Callable)}.\n   */\n  public static void addThreadLocal(ThreadLocal<?> threadLocal) {\n    if (threadLocal == null) {\n      throw new IllegalArgumentException();\n    }\n    toPropagate.addIfAbsent(threadLocal);\n  }\n\n  /**\n   * Get list of all registered ThreadLocal.\n   *\n   * @return list of all registered ThreadLocal\n   */\n  public static ThreadLocal<?>[] getThreadLocals() {\n    return toPropagate.toArray(new ThreadLocal[toPropagate.size()]);\n  }\n\n  /**\n   * Register ThreadLocal from this context.\n   *\n   * @see #addThreadLocal(ThreadLocal)\n   */\n  public static void removeThreadLocal(ThreadLocal<?> threadLocal) {\n    if (threadLocal == null) {\n      return;\n    }\n    toPropagate.remove(threadLocal);\n  }\n\n  /** Clear all registered ThreadLocal variables. */\n  public void clear() {\n    toPropagate.clear();\n  }\n\n  public static Runnable wrap(Runnable task) {\n    return new CopyThreadLocalRunnable(task);\n  }\n\n  public static <T> Callable<T> wrap(Callable<? extends T> task) {\n    return new CopyThreadLocalCallable<>(task);\n  }\n\n  static ThreadLocalState currentThreadState() {\n    final ThreadLocal[] threadLocals = toPropagate.toArray(new ThreadLocal[toPropagate.size()]);\n    final Object[] values = new Object[threadLocals.length];\n    for (int i = 0, l = threadLocals.length; i < l; i++) {\n      values[i] = threadLocals[i].get();\n    }\n    return new ThreadLocalState(threadLocals, values);\n  }\n\n  static class ThreadLocalState {\n    private final ThreadLocal[] threadLocals;\n    private final Object[] values;\n    private Object[] previousValues;\n\n    private ThreadLocalState(ThreadLocal[] threadLocals, Object[] values) {\n      this.threadLocals = threadLocals;\n      this.values = values;\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    void propagate() {\n      previousValues = new Object[threadLocals.length];\n      for (int i = 0, l = values.length; i < l; i++) {\n        previousValues[i] = threadLocals[i].get();\n        threadLocals[i].set(values[i]);\n      }\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    void cleanup() {\n      if (previousValues == null) {\n        return; // method propagate wasn't called\n      }\n      for (int i = 0, l = previousValues.length; i < l; i++) {\n        threadLocals[i].set(previousValues[i]);\n      }\n    }\n  }\n\n  private ThreadLocalPropagateContext() {}\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/Unlocker.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.concurrent;\n\n/**\n * An interface that allows implementations to enclose locked instance and unlock it later by\n * calling {@link #unlock()}.\n *\n * <p>This is designed to be used in try-with-resources statement.\n *\n * <p>The example:\n *\n * <pre>\n *     try (@SuppressWarnings(\"unused\") Unlocker u = customLocks.lock(\"key\")) {\n *         // do something in lock\n *     }\n * </pre>\n *\n * @author Sergii Leschenko\n * @author Yevhenii Voevodin\n */\npublic interface Unlocker extends AutoCloseable {\n\n  /** Unlocks the corresponding lock in implementation specific manner. */\n  void unlock();\n\n  @Override\n  default void close() {\n    unlock();\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/CommandLine.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Manages command line options and create native OS process. Also manages creating {@link Process}\n * object by {@link CommandLine#createProcess()}. All options represented as-is, without any\n * escaping or encoding.\n *\n * @author Evgen Vidolob\n */\npublic class CommandLine {\n  private String executablePath;\n  private boolean redirectErrorStream;\n  private File workingDirectory;\n\n  private Map<String, String> environment = new HashMap<>();\n  private List<String> parameters = new ArrayList<>();\n\n  public CommandLine() {}\n\n  public CommandLine(String... command) {\n    this(Arrays.asList(command));\n  }\n\n  public CommandLine(List<String> command) {\n    if (command.size() > 0) {\n      executablePath = command.get(0);\n      if (command.size() > 1) {\n        addParameters(command.subList(0, command.size()));\n      }\n    }\n  }\n\n  public String getExecutablePath() {\n    return executablePath;\n  }\n\n  public void setExecutablePath(String executablePath) {\n    this.executablePath = executablePath;\n  }\n\n  public void addParameters(List<String> parameters) {\n    this.parameters.addAll(parameters);\n  }\n\n  public File getWorkingDirectory() {\n    return workingDirectory;\n  }\n\n  public void setWorkingDirectory(File workingDirectory) {\n    this.workingDirectory = workingDirectory;\n  }\n\n  public void setWorkingDirectory(String path) {\n    if (path != null && !path.isEmpty()) {\n      workingDirectory = new File(path);\n    }\n  }\n\n  public Map<String, String> getEnvironment() {\n    return environment;\n  }\n\n  public boolean isRedirectErrorStream() {\n    return redirectErrorStream;\n  }\n\n  public void setRedirectErrorStream(boolean redirectErrorStream) {\n    this.redirectErrorStream = redirectErrorStream;\n  }\n\n  public Process createProcess() throws ExecutionException {\n    List<String> commandLine = createCommandLine();\n    try {\n      return runProcess(commandLine);\n    } catch (IOException e) {\n      throw new ExecutionException(e);\n    }\n  }\n\n  private Process runProcess(List<String> commandLine) throws IOException {\n    ProcessBuilder processBuilder = new ProcessBuilder(commandLine);\n    Map<String, String> environment = processBuilder.environment();\n    environment.clear();\n    environment.putAll(this.environment);\n    processBuilder.directory(workingDirectory);\n    processBuilder.redirectErrorStream(redirectErrorStream);\n    return processBuilder.start();\n  }\n\n  private List<String> createCommandLine() {\n    List<String> commandLine = new ArrayList<>(parameters.size() + 1);\n    commandLine.add(executablePath);\n    commandLine.addAll(parameters);\n    return commandLine;\n  }\n\n  public void addParameter(String parameter) {\n    parameters.add(parameter);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/ExecutionException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\n/**\n * Exception throw by {@link ProcessExecutor}\n *\n * @author Evgen Vidolob\n */\npublic class ExecutionException extends Exception {\n\n  public ExecutionException(String message) {\n    super(message);\n  }\n\n  public ExecutionException(String message, Throwable cause) {\n    super(message, cause);\n  }\n\n  public ExecutionException(Throwable cause) {\n    super(cause);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/Executor.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\nimport java.util.concurrent.Future;\n\n/**\n * Executor for asynchronous execution.\n *\n * @author Evgen Vidolob\n */\npublic interface Executor {\n\n  Future<?> execute(Runnable runnable);\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/ExecutorServiceBuilder.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\nimport java.time.Duration;\nimport java.util.concurrent.BlockingQueue;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.LinkedBlockingQueue;\nimport java.util.concurrent.RejectedExecutionHandler;\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Helper class to build {@link ExecutorService} from parts like corePoolSize, maxPoolSize,\n * threadFactory, etc.\n *\n * @author Sergii Kabashniuk\n */\npublic class ExecutorServiceBuilder {\n\n  private int corePoolSize;\n  private int maxPoolSize;\n  private boolean allowCoreThreadTimeOut;\n  private Duration keepAliveTime;\n  private BlockingQueue<Runnable> workQueue;\n  private ThreadFactory threadFactory;\n  private RejectedExecutionHandler handler;\n\n  public ExecutorServiceBuilder() {\n    this.corePoolSize = 0;\n    this.maxPoolSize = 1;\n    this.allowCoreThreadTimeOut = false;\n    this.keepAliveTime = Duration.ofSeconds(60);\n    this.workQueue = new LinkedBlockingQueue<>();\n    this.threadFactory = Executors.defaultThreadFactory();\n    this.handler = new ThreadPoolExecutor.AbortPolicy();\n  }\n\n  /**\n   * @param corePoolSize - configure corePoolSize the number of threads to keep in the pool, even if\n   *     they are idle, unless {@code allowCoreThreadTimeOut} is set.\n   */\n  public ExecutorServiceBuilder corePoolSize(int corePoolSize) {\n    this.corePoolSize = corePoolSize;\n    return this;\n  }\n\n  /**\n   * @param maxPoolSize - configure the maximum number of threads to allow in the pool.\n   */\n  public ExecutorServiceBuilder maxPoolSize(int maxPoolSize) {\n    if (maxPoolSize < corePoolSize) {\n      throw new IllegalArgumentException(\"maxPoolSize must be greater than corePoolSize\");\n    }\n    this.maxPoolSize = maxPoolSize;\n    return this;\n  }\n\n  /**\n   * @param allowCoreThreadTimeOut - allow core threads to time out an terminate.\n   */\n  public ExecutorServiceBuilder allowCoreThreadTimeOut(boolean allowCoreThreadTimeOut) {\n    this.allowCoreThreadTimeOut = allowCoreThreadTimeOut;\n    return this;\n  }\n\n  /**\n   * @param time - configure keepAliveTime parameter of {@code ThreadPoolExecutor}\n   */\n  public ExecutorServiceBuilder keepAliveTime(Duration time) {\n    this.keepAliveTime = time;\n    return this;\n  }\n\n  /**\n   * @param workQueue - configure the type of the task queue that would be used in {@code\n   *     ThreadPoolExecutor}\n   */\n  public ExecutorServiceBuilder workQueue(BlockingQueue<Runnable> workQueue) {\n    this.workQueue = workQueue;\n    return this;\n  }\n\n  /**\n   * @param queueCapacity - configure {@code LinkedBlockingQueue} with queueCapacity capacity to be\n   *     used in {@code ThreadPoolExecutor}\n   */\n  public ExecutorServiceBuilder queueCapacity(int queueCapacity) {\n    this.workQueue = new LinkedBlockingQueue<>(queueCapacity);\n    return this;\n  }\n\n  /**\n   * @param handler - configure instance of {@code RejectedExecutionHandler} to be used in {@code\n   *     ThreadPoolExecutor}\n   */\n  public ExecutorServiceBuilder rejectedExecutionHandler(RejectedExecutionHandler handler) {\n    this.handler = handler;\n    return this;\n  }\n\n  /**\n   * @param threadFactory - configure instance of {@code ThreadFactory} to be used in {@code\n   *     ThreadPoolExecutor}\n   */\n  public ExecutorServiceBuilder threadFactory(ThreadFactory threadFactory) {\n    this.threadFactory = threadFactory;\n    return this;\n  }\n\n  public ExecutorService build() {\n\n    final ThreadPoolExecutor executor =\n        new ThreadPoolExecutor(\n            corePoolSize,\n            maxPoolSize,\n            keepAliveTime.toMillis(),\n            TimeUnit.MILLISECONDS,\n            workQueue,\n            threadFactory,\n            handler);\n    executor.allowCoreThreadTimeOut(allowCoreThreadTimeOut);\n\n    return executor;\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/JavaParameters.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Holds all parameters that needed to start new JVM instance. <br>\n * Set all needed parameters and call {@link #createCommand()} to receive command line.\n *\n * @author Evgen Vidolob\n */\npublic class JavaParameters {\n\n  private String workingDirectory;\n  private String javaExecutable;\n  private String jarPath;\n  private String mainClassName;\n\n  private List<String> classPath = new ArrayList<>();\n  private List<String> vmParameters = new ArrayList<>();\n  private Map<String, String> enviroment = new HashMap<>();\n\n  private ParametersList parametersList = new ParametersList();\n\n  public String getJavaExecutable() {\n    return javaExecutable;\n  }\n\n  public String getMainClassName() {\n    return mainClassName;\n  }\n\n  public List<String> getClassPath() {\n    return classPath;\n  }\n\n  public List<String> getVmParameters() {\n    return vmParameters;\n  }\n\n  public String getWorkingDirectory() {\n    return workingDirectory;\n  }\n\n  public ParametersList getParametersList() {\n    return parametersList;\n  }\n\n  public void setWorkingDirectory(String workingDirectory) {\n    this.workingDirectory = workingDirectory;\n  }\n\n  public void setJavaExecutable(String javaExecutable) {\n    this.javaExecutable = javaExecutable;\n  }\n\n  public void setMainClassName(String mainClassName) {\n    this.mainClassName = mainClassName;\n  }\n\n  public String getJarPath() {\n    return jarPath;\n  }\n\n  public void setJarPath(String jarPath) {\n    this.jarPath = jarPath;\n  }\n\n  public Map<String, String> getEnviroment() {\n    return enviroment;\n  }\n\n  public CommandLine createCommand() {\n    CommandLine result = new CommandLine(javaExecutable);\n    result.getEnvironment().putAll(enviroment);\n    result.addParameters(vmParameters);\n    result.addParameter(\"-classpath\");\n    result.addParameter(createClasspath(classPath));\n\n    if (mainClassName != null) {\n      result.addParameter(mainClassName);\n    } else if (jarPath != null) {\n      result.addParameter(\"-jar\");\n      result.addParameter(jarPath);\n    }\n\n    result.addParameters(parametersList.getParameters());\n\n    result.setWorkingDirectory(workingDirectory);\n    return result;\n  }\n\n  private String createClasspath(List<String> classPath) {\n    return classPath.stream().reduce((s, s2) -> s + \":\" + s2).get();\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/OutputReader.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\nimport java.io.IOException;\nimport java.io.Reader;\nimport java.util.concurrent.Future;\nimport java.util.function.Consumer;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Asynchronously non blocking read process output. Class use external executor to run read thread\n *\n * @author Evgen Vidolob\n */\npublic class OutputReader {\n  private static final Logger LOG = LoggerFactory.getLogger(OutputReader.class);\n\n  private static final int SLEEP_WHEN_WAS_ACTIVE = 1;\n  private static final int SLEEP_WHEN_IDLE = 5;\n\n  private final Executor executor;\n  private final Consumer<String> textConsumer;\n  private final Reader reader;\n\n  private final char[] buffer = new char[8192];\n  private final StringBuilder lineBuilder = new StringBuilder();\n\n  private Future<?> readingFuture;\n\n  private volatile boolean isStopped;\n\n  public OutputReader(Reader reader, Executor executor, Consumer<String> textConsumer) {\n    this.executor = executor;\n    this.textConsumer = textConsumer;\n    this.reader = reader;\n  }\n\n  /** Start reading thread */\n  public void start() {\n    if (readingFuture == null) {\n      readingFuture = executor.execute(() -> doStart());\n    }\n  }\n\n  public void stop() {\n    isStopped = true;\n  }\n\n  public void waitFor() throws InterruptedException {\n    try {\n      readingFuture.get();\n    } catch (java.util.concurrent.ExecutionException e) {\n      LOG.error(e.getMessage(), e);\n    }\n  }\n\n  private void doStart() {\n    try {\n      while (true) {\n        boolean active = readIfAvailable();\n        if (isStopped) {\n          break;\n        }\n\n        try {\n          Thread.sleep(getTimeToSleep(active));\n        } catch (InterruptedException ignored) {\n        }\n      }\n    } catch (Exception e) {\n      LOG.error(e.getMessage(), e);\n    } finally {\n      close();\n    }\n  }\n\n  private void close() {\n    try {\n      reader.close();\n    } catch (IOException e) {\n      LOG.error(\"Cannot close stream\", e);\n    }\n  }\n\n  private int getTimeToSleep(boolean active) {\n    return active ? SLEEP_WHEN_WAS_ACTIVE : SLEEP_WHEN_IDLE;\n  }\n\n  private boolean readIfAvailable() throws IOException {\n    boolean read = false;\n    int charCount;\n    while (reader.ready() && (charCount = reader.read(buffer)) > 1) {\n      read = true;\n      processRead(lineBuilder, buffer, charCount);\n    }\n\n    if (lineBuilder.length() > 0) {\n      consumeLine(lineBuilder);\n    }\n    return read;\n  }\n\n  private void consumeLine(StringBuilder lineBuilder) {\n    textConsumer.accept(lineBuilder.toString());\n    lineBuilder.setLength(0);\n  }\n\n  private void processRead(StringBuilder lineBuilder, char[] buffer, int charCount) {\n    for (int i = 0; i < charCount; i++) {\n      char c = buffer[i];\n      lineBuilder.append(c);\n      if (c == '\\n') {\n        consumeLine(lineBuilder);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/ParametersList.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\nimport static java.util.Collections.unmodifiableList;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/** Represent and configure program parameters */\npublic class ParametersList {\n  private final List<String> parameters = new ArrayList<>();\n\n  public void add(String name, String value) {\n    parameters.add(name);\n    parameters.add(value);\n  }\n\n  /**\n   * Adds a parameter without name.\n   *\n   * @param value value of the parameter\n   */\n  public void add(String value) {\n    parameters.add(value);\n  }\n\n  public List<String> getParameters() {\n    return unmodifiableList(parameters);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/ProcessEvent.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\nimport java.util.EventObject;\n\n/**\n * @author Evgen Vidolob\n */\npublic class ProcessEvent extends EventObject {\n\n  private String text;\n  private int exitCode;\n\n  /**\n   * Constructs a prototypical Event.\n   *\n   * @param source The object on which the Event initially occurred.\n   * @exception IllegalArgumentException if source is null.\n   */\n  public ProcessEvent(ProcessHandler source) {\n    super(source);\n  }\n\n  public ProcessEvent(ProcessHandler source, String text) {\n    super(source);\n    this.text = text;\n  }\n\n  public ProcessEvent(ProcessHandler source, String text, int exitCode) {\n    super(source);\n    this.text = text;\n    this.exitCode = exitCode;\n  }\n\n  public ProcessEvent(ProcessHandler source, int exitCode) {\n    super(source);\n    this.exitCode = exitCode;\n  }\n\n  public String getText() {\n    return text;\n  }\n\n  public int getExitCode() {\n    return exitCode;\n  }\n\n  public ProcessHandler getProcessHandler() {\n    return (ProcessHandler) source;\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/ProcessExecutor.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\n/**\n * External process executor\n *\n * @author Evgen Vidolob\n */\npublic interface ProcessExecutor {\n\n  ProcessHandler execute() throws ExecutionException;\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/ProcessHandler.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Proxy;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.CopyOnWriteArrayList;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.SynchronousQueue;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Handler for native OS process\n *\n * @author Evgen Vidolob\n */\npublic class ProcessHandler implements Executor {\n  private static final Logger LOG = LoggerFactory.getLogger(ProcessHandler.class);\n\n  private final Process process;\n  private final WaitForProcessEnd waitForProcess;\n  private final ExecutorService executorService;\n  private final ProcessListener listenerNotifier;\n  private final TerminatingTaskRunner terminatingListener;\n  private final CountDownLatch latch;\n\n  private final List<ProcessListener> listeners = new CopyOnWriteArrayList<>();\n\n  private volatile ProcessState state = ProcessState.INITIAL;\n\n  public ProcessHandler(Process process) {\n    executorService = createExecutorService();\n    this.process = process;\n    waitForProcess = new WaitForProcessEnd(process, this);\n    listenerNotifier = createNotifier();\n    terminatingListener = new TerminatingTaskRunner();\n    addProcessListener(terminatingListener);\n    latch = new CountDownLatch(1);\n  }\n\n  private ProcessListener createNotifier() {\n    InvocationHandler invocationHandler =\n        (proxy, method, args) -> {\n          // call method over all listeners\n          for (ProcessListener listener : listeners) {\n            method.invoke(listener, args);\n          }\n          return null;\n        };\n\n    return (ProcessListener)\n        Proxy.newProxyInstance(\n            ProcessListener.class.getClassLoader(),\n            new Class[] {ProcessListener.class},\n            invocationHandler);\n  }\n\n  private ExecutorService createExecutorService() {\n    return new ThreadPoolExecutor(\n        10,\n        Integer.MAX_VALUE,\n        1,\n        TimeUnit.MINUTES,\n        new SynchronousQueue<>(),\n        (r -> new Thread(r, \"Native process polled Thread\")));\n  }\n\n  public boolean isProcessTerminating() {\n    return false;\n  }\n\n  public boolean isProcessTerminated() {\n    return false;\n  }\n\n  public void addProcessListener(ProcessListener processListener) {\n    listeners.add(processListener);\n  }\n\n  public void startNotify() {\n    addProcessListener(\n        new ProcessListener() {\n          @Override\n          public void onStart(ProcessEvent event) {\n            try {\n              OutputReader stdOutReader = createStdOutReader();\n              stdOutReader.start();\n\n              OutputReader stdErrReader = createStdErrReader();\n              stdErrReader.start();\n\n              waitForProcess.setEndCallback(\n                  exitCode -> {\n                    try {\n                      stdErrReader.stop();\n                      stdOutReader.stop();\n                      try {\n                        stdErrReader.waitFor();\n                        stdOutReader.waitFor();\n                      } catch (InterruptedException ignore) {\n                      }\n                    } finally {\n                      ProcessHandler.this.onProcessTerminated(exitCode);\n                      latch.countDown();\n                    }\n                  });\n            } finally {\n              removeProcessListener(this);\n            }\n          }\n\n          @Override\n          public void onText(ProcessEvent event, ProcessOutputType outputType) {}\n\n          @Override\n          public void onProcessTerminated(ProcessEvent event) {}\n\n          @Override\n          public void onProcessWillTerminate(ProcessEvent event) {}\n        });\n    state = ProcessState.RUNNING;\n    listenerNotifier.onStart(new ProcessEvent(this));\n  }\n\n  private void onProcessTerminated(int exitCode) {\n    terminatingListener.runTask(\n        () -> {\n          if (state == ProcessState.RUNNING) {\n            state = ProcessState.TERMINATING;\n            notifyOnTerminating();\n          }\n\n          if (state == ProcessState.TERMINATING) {\n            state = ProcessState.TERMINATED;\n            listenerNotifier.onProcessTerminated(new ProcessEvent(ProcessHandler.this, exitCode));\n          }\n        });\n  }\n\n  private void removeProcessListener(ProcessListener listener) {\n    listeners.remove(listener);\n  }\n\n  private OutputReader createStdErrReader() {\n    return new OutputReader(\n        new InputStreamReader(process.getErrorStream()),\n        this,\n        (s -> notifyOnText(s, ProcessOutputType.STDERR)));\n  }\n\n  private void notifyOnTerminating() {\n    listenerNotifier.onProcessWillTerminate(new ProcessEvent(this));\n  }\n\n  private void notifyOnText(String text, ProcessOutputType type) {\n    listenerNotifier.onText(new ProcessEvent(this, text), type);\n  }\n\n  private OutputReader createStdOutReader() {\n    return new OutputReader(\n        new InputStreamReader(process.getInputStream()),\n        this,\n        (s -> {\n          notifyOnText(s, ProcessOutputType.STDOUT);\n        }));\n  }\n\n  @Override\n  public Future<?> execute(Runnable runnable) {\n    return executorService.submit(runnable);\n  }\n\n  public boolean isStarted() {\n    return state != ProcessState.INITIAL;\n  }\n\n  public void destroyProcess() {\n    terminatingListener.runTask(\n        () -> {\n          if (state == ProcessState.RUNNING) {\n            state = ProcessState.TERMINATING;\n            notifyOnTerminating();\n            try {\n              closeStream();\n            } finally {\n              process.destroy();\n            }\n          }\n        });\n  }\n\n  private void closeStream() {\n    try {\n      process.getOutputStream().close();\n    } catch (IOException e) {\n      LOG.error(e.getMessage(), e);\n    }\n  }\n\n  public boolean waitFor() {\n    try {\n      latch.await();\n      return true;\n    } catch (InterruptedException ignored) {\n      return false;\n    }\n  }\n\n  private enum ProcessState {\n    INITIAL,\n    RUNNING,\n    TERMINATING,\n    TERMINATED\n  }\n\n  private class TerminatingTaskRunner implements ProcessListener {\n\n    private List<Runnable> tasks = new ArrayList<>();\n\n    @Override\n    public void onStart(ProcessEvent event) {\n      removeProcessListener(this);\n      runAllTasks();\n    }\n\n    public void runTask(Runnable task) {\n      if (isStarted()) {\n        task.run();\n      } else {\n        synchronized (tasks) {\n          tasks.add(task);\n        }\n        if (isStarted()) {\n          runAllTasks();\n        }\n      }\n    }\n\n    private void runAllTasks() {\n      List<Runnable> taskList;\n      synchronized (tasks) {\n        taskList = new ArrayList<>(tasks);\n        tasks.clear();\n      }\n      taskList.forEach(Runnable::run);\n    }\n\n    @Override\n    public void onText(ProcessEvent event, ProcessOutputType outputType) {}\n\n    @Override\n    public void onProcessTerminated(ProcessEvent event) {}\n\n    @Override\n    public void onProcessWillTerminate(ProcessEvent event) {}\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/ProcessListener.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\nimport java.util.EventListener;\n\n/**\n * Listener for {@link ProcessHandler}\n *\n * @author Evgen Vidolob\n */\npublic interface ProcessListener extends EventListener {\n\n  void onStart(ProcessEvent event);\n\n  void onText(ProcessEvent event, ProcessOutputType outputType);\n\n  void onProcessTerminated(ProcessEvent event);\n\n  void onProcessWillTerminate(ProcessEvent event);\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/ProcessOutputType.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\n/**\n * Contains native OS process output types\n *\n * @author Evgen Vidolob\n */\npublic enum ProcessOutputType {\n  SYSTEM,\n  STDOUT,\n  STDERR\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/execution/WaitForProcessEnd.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\nimport java.util.concurrent.ArrayBlockingQueue;\nimport java.util.concurrent.BlockingQueue;\nimport java.util.concurrent.Future;\nimport java.util.function.Consumer;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Wait until the {@code Process} has terminated.\n *\n * @author Evgen Vidolob\n */\npublic class WaitForProcessEnd {\n\n  private static final Logger LOG = LoggerFactory.getLogger(WaitForProcessEnd.class);\n\n  private final Future<?> waitFor;\n  private final BlockingQueue<Consumer<Integer>> endCallback =\n      new ArrayBlockingQueue<Consumer<Integer>>(1);\n\n  public WaitForProcessEnd(Process process, Executor executor) {\n    waitFor =\n        executor.execute(\n            () -> {\n              int exitCode = 0;\n              try {\n                while (true) {\n                  try {\n                    exitCode = process.waitFor();\n                    break;\n                  } catch (InterruptedException e) {\n                    LOG.error(e.getMessage(), e);\n                  }\n                }\n\n              } finally {\n                try {\n                  endCallback.take().accept(exitCode);\n                } catch (InterruptedException e) {\n                  LOG.error(e.getMessage(), e);\n                }\n              }\n            });\n  }\n\n  public void setEndCallback(Consumer<Integer> callback) {\n    endCallback.offer(callback);\n  }\n\n  public void stop() {\n    waitFor.cancel(true);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/os/WindowsPathEscaper.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.os;\n\n/**\n * Escapes Windows path to unix-style path.\n *\n * @author Alexander Garagatyi\n */\npublic class WindowsPathEscaper {\n\n  /** Implements singleton pattern. */\n  private static final WindowsPathEscaper escaper = new WindowsPathEscaper();\n\n  /** Does nothing. Can be used for mocking purposes. */\n  public WindowsPathEscaper() {}\n\n  /**\n   * Static version of method that escapes paths on Windows. It is discouraged to use this method\n   * because it is too hard to mock it. Use {@link #escapePath(String)} instead.\n   *\n   * @param path path on Windows. Can be unix-style path also.\n   * @return unix-style path\n   * @see #escapePath(String)\n   */\n  public static String escapePathStatic(String path) {\n    return escaper.escapePath(path);\n  }\n\n  /**\n   * Escapes Windows path to unix-style path.\n   *\n   * @param path path on Windows. Can be unix-style path also.\n   * @return unix-style path\n   */\n  public String escapePath(String path) {\n    String esc;\n    if (path.indexOf(\":\") == 1) {\n      // check and replace only occurrence of \":\" after disk label on Windows host (e.g. C:/)\n      // but keep other occurrences it can be marker for docker mount volumes\n      // (e.g. /path/dir/from/host:/name/of/dir/in/container\n      //       )\n      esc = path.replaceFirst(\":\", \"\").replace('\\\\', '/');\n      esc =\n          Character.toLowerCase(esc.charAt(0))\n              + esc.substring(1); // letter of disk mark must be lower case\n    } else {\n      esc = path.replace('\\\\', '/');\n    }\n    if (!esc.startsWith(\"/\")) {\n      esc = \"/\" + esc;\n    }\n    return esc;\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/reflect/ParameterizedTypeImpl.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.reflect;\n\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.Arrays;\n\n/**\n * Provides runtime information about parameterized type.\n *\n * @author andrew00x\n */\npublic final class ParameterizedTypeImpl implements ParameterizedType {\n\n  private final Type[] typeArguments;\n  private final Class<?> rawType;\n\n  public ParameterizedTypeImpl(Class<?> rawType, Type... typeArguments) {\n    this.rawType = rawType;\n    this.typeArguments = new Type[typeArguments.length];\n    System.arraycopy(typeArguments, 0, this.typeArguments, 0, this.typeArguments.length);\n  }\n\n  @Override\n  public Type[] getActualTypeArguments() {\n    return Arrays.copyOf(typeArguments, typeArguments.length);\n  }\n\n  @Override\n  public Type getRawType() {\n    return rawType;\n  }\n\n  @Override\n  public Type getOwnerType() {\n    return null;\n  }\n\n  @Override\n  public String toString() {\n    StringBuilder builder = new StringBuilder();\n    builder.append(rawType.getName());\n    builder.append('<');\n    for (int i = 0, length = typeArguments.length; i < length; i++) {\n      if (i > 0) {\n        builder.append(\", \");\n      }\n      builder.append(\n          typeArguments[i] instanceof Class\n              ? ((Class<?>) typeArguments[i]).getName()\n              : typeArguments[i].toString());\n    }\n    builder.append('>');\n    return builder.toString();\n  }\n\n  @Override\n  public int hashCode() {\n    int hashCode = 7;\n    hashCode = 31 * hashCode + rawType.hashCode();\n    hashCode = 31 * hashCode + Arrays.hashCode(typeArguments);\n    return hashCode;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof ParameterizedType)) {\n      return false;\n    }\n    ParameterizedType other = (ParameterizedType) o;\n    return rawType.equals(other.getRawType())\n        && Arrays.equals(typeArguments, other.getActualTypeArguments());\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/ws/rs/ExtMediaType.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.ws.rs;\n\nimport jakarta.ws.rs.core.MediaType;\n\n/**\n * Extended media type.\n *\n * @author Tareq Sharafy (tareq.sharafy@sap.com)\n */\npublic interface ExtMediaType {\n  /** A {@code String} constant representing \"{@value #APPLICATION_ZIP}\" media type. */\n  public static final String APPLICATION_ZIP = \"application/zip\";\n\n  /** A {@link MediaType} constant representing \"{@value #APPLICATION_ZIP}\" media type. */\n  public static final MediaType APPLICATION_ZIP_TYPE = new MediaType(\"application\", \"zip\");\n\n  /** A {@code String} constant representing \"{@value #APPLICATION_X_TAR}\" media type. */\n  String APPLICATION_X_TAR = \"application/x-tar\";\n\n  /** A {@link MediaType} constant representing \"{@value #APPLICATION_X_TAR}\" media type. */\n  MediaType APPLICATION_X_TAR_TYPE = new MediaType(\"application\", \"x-tar\");\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/java/org/eclipse/che/commons/lang/IoUtilTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport static org.testng.Assert.assertTrue;\n\nimport java.net.URI;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.testng.annotations.Test;\n\n/**\n * @author Anatolii Bazko\n */\npublic class IoUtilTest {\n  @Test\n  public void shouldListFileResources() throws Exception {\n    List<String> resources = new ArrayList<>();\n    IoUtil.listResources(\n        getClass().getResource(\"/\").toURI(), path -> resources.add(path.getFileName().toString()));\n\n    assertTrue(resources.contains(\"logback-test.xml\"));\n    assertTrue(resources.contains(\"findbugs-exclude.xml\"));\n  }\n\n  @Test\n  public void shouldListChildrenResourcesInJar() throws Exception {\n    URL testJar = Thread.currentThread().getContextClassLoader().getResource(\"che/che.jar\");\n    URI codenvyDir = URI.create(\"jar:\" + testJar + \"!/codenvy\");\n\n    List<String> resources = new ArrayList<>();\n    IoUtil.listResources(codenvyDir, path -> resources.add(path.getFileName().toString()));\n\n    assertTrue(resources.contains(\"a.json\"));\n    assertTrue(resources.contains(\"b.json\"));\n  }\n\n  @Test\n  public void shouldListParentResourcesInJar() throws Exception {\n    URL testJar = Thread.currentThread().getContextClassLoader().getResource(\"che/che.jar\");\n    URI codenvyDir = URI.create(\"jar:\" + testJar + \"!/\");\n\n    List<String> resources = new ArrayList<>();\n    IoUtil.listResources(\n        codenvyDir, path -> resources.add(path.getFileName().toString().replace(\"/\", \"\")));\n\n    assertTrue(resources.contains(\"codenvy\"));\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/java/org/eclipse/che/commons/lang/PathUtilTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\n\nimport org.testng.annotations.Test;\n\n/** Tests for {@link PathUtil} */\npublic class PathUtilTest {\n\n  @Test\n  public void testCanonicalPath() throws Exception {\n    String path = PathUtil.toCanonicalPath(\"/foo/../bar\", false);\n    assertNotNull(path);\n    assertFalse(path.isEmpty());\n    assertEquals(path, \"/bar\");\n  }\n\n  @Test\n  public void testRemoveLastSlash() throws Exception {\n    String path = PathUtil.toCanonicalPath(\"/foo/bar/\", true);\n    assertNotNull(path);\n    assertFalse(path.isEmpty());\n    assertEquals(path, \"/foo/bar\");\n  }\n\n  @Test\n  public void testEliminationDot() throws Exception {\n    String path = PathUtil.toCanonicalPath(\"./bar\", false);\n    assertNotNull(path);\n    assertFalse(path.isEmpty());\n    assertEquals(path, \"bar\");\n  }\n\n  @Test\n  public void testCanonicalPathWithFile() throws Exception {\n    String path = PathUtil.toCanonicalPath(\"/foo/../bar/pom.xml\", false);\n    assertNotNull(path);\n    assertFalse(path.isEmpty());\n    assertEquals(path, \"/bar/pom.xml\");\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/java/org/eclipse/che/commons/lang/SizeTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport java.text.DecimalFormat;\nimport org.testng.Assert;\nimport org.testng.annotations.Test;\n\n/**\n * @author andrew00x\n */\npublic class SizeTest {\n  char sep = new DecimalFormat().getDecimalFormatSymbols().getDecimalSeparator();\n\n  @Test\n  public void testToHumanSize() {\n    Assert.assertEquals(Size.toHumanSize(1024), \"1 kB\");\n    Assert.assertEquals(Size.toHumanSize(1000), \"1000 B\");\n    Assert.assertEquals(Size.toHumanSize(1024 * 1024), \"1 MB\");\n    Assert.assertEquals(Size.toHumanSize(5 * 1024 * 1024), \"5 MB\");\n    Assert.assertEquals(Size.toHumanSize(5L * 1024 * 1024 * 1024), \"5 GB\");\n    Assert.assertEquals(Size.toHumanSize(7539480), \"7\" + sep + \"2 MB\");\n    Assert.assertEquals(Size.toHumanSize(10226124), \"9\" + sep + \"8 MB\");\n  }\n\n  @Test\n  public void testParseToByte() {\n    Assert.assertEquals(Size.parseSize(\"1 kB\"), 1024);\n    Assert.assertEquals(Size.parseSize(\"1000B\"), 1000);\n    Assert.assertEquals(Size.parseSize(\"1000\"), 1000);\n    Assert.assertEquals(Size.parseSize(\"1 MB\"), 1024 * 1024);\n    Assert.assertEquals(Size.parseSize(\"5 mb\"), 5 * 1024 * 1024);\n    Assert.assertEquals(Size.parseSize(\"9.8M\"), Float.valueOf(9.8f * 1024 * 1024).longValue());\n  }\n\n  @Test\n  public void testParseToMegabyte() {\n    Assert.assertEquals(Size.parseSizeToMegabytes(\"10485760\"), 10);\n    Assert.assertEquals(Size.parseSizeToMegabytes(\"12 MB\"), 12);\n    Assert.assertEquals(Size.parseSizeToMegabytes(\"1GB\"), 1024);\n  }\n\n  @Test(expectedExceptions = IllegalArgumentException.class)\n  public void testParseErrorInvalidSuffix() {\n    Size.parseSize(\"1 xx\");\n  }\n\n  @Test(expectedExceptions = IllegalArgumentException.class)\n  public void testParseErrorInvalidNumber() {\n    Size.parseSize(\"1.x kB\");\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/java/org/eclipse/che/commons/lang/TestURLEncodedUtils.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport static org.testng.Assert.*;\n\nimport java.net.URI;\nimport java.util.*;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class TestURLEncodedUtils {\n\n  static final int SWISS_GERMAN_HELLO[] = {\n    0x47, 0x72, 0xFC, 0x65, 0x7A, 0x69, 0x5F, 0x7A, 0xE4, 0x6D, 0xE4\n  };\n  static final int RUSSIAN_HELLO[] = {\n    0x412, 0x441, 0x435, 0x43C, 0x5F, 0x43F, 0x440, 0x438, 0x432, 0x435, 0x442\n  };\n\n  private static String constructString(int[] unicodeChars) {\n    StringBuffer buffer = new StringBuffer();\n    if (unicodeChars != null) {\n      for (int i = 0; i < unicodeChars.length; i++) {\n        buffer.append((char) unicodeChars[i]);\n      }\n    }\n    return buffer.toString();\n  }\n\n  private static void assertNameValuePair(\n      final Map<String, Set<String>> parameter, final String expectedName, final String... values) {\n    Set<String> actualValues = parameter.get(expectedName);\n    assertNotNull(actualValues);\n    assertEquals(actualValues.size(), values.length);\n    for (String value : values) {\n      assertTrue(actualValues.contains(value));\n    }\n  }\n\n  @Test\n  public void shouldBeAbleToParseEmptyURI() throws Exception {\n    // given\n    // when\n\n    Map<String, Set<String>> parameters = parse(\"\", null);\n    // then\n    assertTrue(parameters.isEmpty());\n  }\n\n  @Test(dataProvider = \"uris\")\n  public void shouldParseURI(String url, String expectedName, String[] expectedValues)\n      throws Exception {\n\n    assertNameValuePair(parse(url, \"UTF-8\"), expectedName, expectedValues);\n  }\n\n  @Test(dataProvider = \"uris\")\n  public void shouldFormatURI(String url, String expectedName, String[] expectedValues)\n      throws Exception {\n    // given\n    Map<String, Set<String>> parameters = new HashMap<>();\n    parameters.put(expectedName, new LinkedHashSet<>(Arrays.asList(expectedValues)));\n    // when\n    String actual = URLEncodedUtils.format(parameters, \"UTF-8\");\n    // then\n    if (\"Name3\".equals(url)) {\n      assertEquals(actual, url + \"=\");\n    } else {\n      assertEquals(actual, url);\n    }\n  }\n\n  @Test\n  public void shouldFormatURIWithMultipleParams() throws Exception {\n\n    // given\n    Map<String, Set<String>> parameters = new LinkedHashMap<>();\n    parameters.put(\"Name5\", new LinkedHashSet<>(Arrays.asList(new String[] {\"aaa\"})));\n    parameters.put(\"Name6\", new LinkedHashSet<>(Arrays.asList(new String[] {\"bbb\"})));\n    // when\n    String actual = URLEncodedUtils.format(parameters, \"UTF-8\");\n    // then\n    assertEquals(actual, \"Name5=aaa&Name6=bbb\");\n  }\n\n  @Test\n  public void shouldParseURIWithMultipleParams() throws Exception {\n\n    Map<String, Set<String>> parameters = parse(\"Name5=aaa&Name6=bbb\", null);\n    assertNameValuePair(parameters, \"Name5\", \"aaa\");\n    assertNameValuePair(parameters, \"Name6\", \"bbb\");\n  }\n\n  @DataProvider(name = \"uris\")\n  public Object[][] uris() {\n    return new Object[][] {\n      {\"Name1=Value1\", \"Name1\", new String[] {\"Value1\"}},\n      {\"Name2=\", \"Name2\", new String[] {}},\n      {\"Name3\", \"Name3\", new String[] {}},\n      {\"Name4=Value+4%21\", \"Name4\", new String[] {\"Value 4!\"}},\n      {\"Name4=Value%2B4%21\", \"Name4\", new String[] {\"Value+4!\"}},\n      {\"Name4=Value+4%21+%214\", \"Name4\", new String[] {\"Value 4! !4\"}},\n      {\"Name7=aaa&Name7=b%2Cb&Name7=ccc\", \"Name7\", new String[] {\"aaa\", \"b,b\", \"ccc\"}},\n      {\"Name8=xx%2C++yy++%2Czz\", \"Name8\", new String[] {\"xx,  yy  ,zz\"}},\n    };\n  }\n\n  @Test\n  public void shouldFormatUTF8() {\n    // given\n    String ru_hello = constructString(RUSSIAN_HELLO);\n    String ch_hello = constructString(SWISS_GERMAN_HELLO);\n\n    Map<String, Set<String>> parameters = new LinkedHashMap<>();\n    parameters.put(\"russian\", new LinkedHashSet<>(Arrays.asList(new String[] {ru_hello})));\n    parameters.put(\"swiss\", new LinkedHashSet<>(Arrays.asList(new String[] {ch_hello})));\n    // when\n    String actual = URLEncodedUtils.format(parameters, \"UTF-8\");\n    // then\n    assertEquals(\n        actual,\n        \"russian=%D0%92%D1%81%D0%B5%D0%BC_%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82\"\n            + \"&swiss=Gr%C3%BCezi_z%C3%A4m%C3%A4\");\n  }\n\n  @Test\n  public void shouldParseUTF8() {\n    // given\n    String ru_hello = constructString(RUSSIAN_HELLO);\n    String ch_hello = constructString(SWISS_GERMAN_HELLO);\n\n    // when\n    Map<String, Set<String>> parameters =\n        parse(\n            \"russian=%D0%92%D1%81%D0%B5%D0%BC_%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82\"\n                + \"&swiss=Gr%C3%BCezi_z%C3%A4m%C3%A4\",\n            \"UTF-8\");\n    // then\n    assertNameValuePair(parameters, \"russian\", ru_hello);\n    assertNameValuePair(parameters, \"swiss\", ch_hello);\n  }\n\n  @Test\n  public void shouldParseWithoutDecoding() {\n    // given\n    String ru_hello = \"%D0%92%D1%81%D0%B5%D0%BC_%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82\";\n    String ch_hello = \"Gr%C3%BCezi_z%C3%A4m%C3%A4\";\n\n    // when\n    Map<String, Set<String>> parameters =\n        URLEncodedUtils.parse(\n            URI.create(\"http://hc.apache.org/params?russian=\" + ru_hello + \"&swiss=\" + ch_hello),\n            false);\n    // then\n    assertNameValuePair(parameters, \"russian\", ru_hello);\n    assertNameValuePair(parameters, \"swiss\", ch_hello);\n  }\n\n  private Map<String, Set<String>> parse(final String params, final String encoding) {\n    return URLEncodedUtils.parse(URI.create(\"http://hc.apache.org/params?\" + params), encoding);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/java/org/eclipse/che/commons/lang/TopologicalSortTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport static java.util.stream.Collectors.toList;\nimport static java.util.stream.Collectors.toSet;\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.function.Function;\nimport java.util.stream.Stream;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class TopologicalSortTest {\n\n  @Test(dataProvider = \"sortingCases\")\n  public void shouldApplySorting(List<Var> list, List<Var> expectedSorting) throws Exception {\n    // when\n    sort(list);\n\n    // then\n    assertEquals(list, expectedSorting);\n  }\n\n  @DataProvider\n  public static Object[][] sortingCases() {\n    return new Object[][] {\n      // keep order if no dependencies\n      new Object[] {\n        vars(var('b', \".\"), var('a', \".\"), var('c', \".\")),\n        vars(var('b', \".\"), var('a', \".\"), var('c', \".\"))\n      },\n\n      // sort dependents after dependencies\n      new Object[] {\n        vars(var('a', \"b\"), var('b', \".\"), var('c', \".\")),\n        vars(var('b', \".\"), var('a', \"b\"), var('c', \".\"))\n      },\n\n      // sort dependents after dependencies, multiple dependencies\n      new Object[] {\n        vars(var('a', \"bc\"), var('b', \".\"), var('c', \".\")),\n        vars(var('b', \".\"), var('c', \".\"), var('a', \"bc\"))\n      },\n\n      // sort dependents after dependencies, check dependee moved after dependencies\n      new Object[] {\n        vars(var('d', \".\"), var('a', \"c\"), var('b', \".\"), var('c', \".\")),\n        vars(var('d', \".\"), var('b', \".\"), var('c', \".\"), var('a', \"c\"))\n      },\n\n      // test the robustness against cycles\n\n      // dependent directly on itself\n      new Object[] {vars(var('a', \"a\")), vars(var('a', \"a\"))},\n\n      // two mutually dependent nodes\n      new Object[] {vars(var('a', \"b\"), var('b', \"a\")), vars(var('a', \"b\"), var('b', \"a\"))},\n\n      // independent node mixed inside a cycle\n      new Object[] {\n        vars(var('b', \"c\"), var('d', \".\"), var('a', \"b\"), var('c', \"a\")),\n        vars(var('d', \".\"), var('b', \"c\"), var('a', \"b\"), var('c', \"a\"))\n      },\n\n      // cycle (a-b-c) with one of the nodes also depending on another node (a-d),\n      // mixed with a \"chain\" (f-e-b)\n      new Object[] {\n        vars(\n            var('f', \"e\"),\n            var('a', \"bd\"),\n            var('b', \"c\"),\n            var('e', \"b\"),\n            var('c', \"a\"),\n            var('d', \".\")),\n        vars(\n            var('d', \".\"),\n            var('a', \"bd\"),\n            var('b', \"c\"),\n            var('c', \"a\"),\n            var('e', \"b\"),\n            var('f', \"e\"))\n      },\n\n      // removes duplicates\n      new Object[] {\n        vars(var('a', \".\"), var('a', \".\"), var('b', \".\")), vars(var('a', \".\"), var('b', \".\"))\n      }\n    };\n  }\n\n  private static Var var(char name, String value) {\n    return new Var(name, value.chars().mapToObj(c -> (char) c).collect(toSet()));\n  }\n\n  private static List<Var> vars(Var... vars) {\n    return Stream.of(vars).collect(toList());\n  }\n\n  private static void sort(List<Var> vars) {\n    Function<Var, Character> idFunction = v -> v.name;\n    Function<Var, Set<Character>> predecessors =\n        v -> v.dependencies.stream().filter(Character::isAlphabetic).collect(toSet());\n\n    TopologicalSort<Var, Character> sort = new TopologicalSort<>(idFunction, predecessors);\n    List<Var> newVars = sort.sort(vars);\n    vars.clear();\n    vars.addAll(newVars);\n  }\n\n  private static final class Var {\n\n    private final char name;\n    private final Set<Character> dependencies;\n\n    private Var(char name, Set<Character> dependencies) {\n      this.name = name;\n      this.dependencies = dependencies;\n    }\n\n    @Override\n    public boolean equals(Object o) {\n      if (this == o) {\n        return true;\n      }\n      if (o == null || getClass() != o.getClass()) {\n        return false;\n      }\n      Var var = (Var) o;\n      return name == var.name && dependencies.equals(var.dependencies);\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(name, dependencies);\n    }\n\n    @Override\n    public String toString() {\n      return \"Var{\" + \"name='\" + name + '\\'' + \", deps='\" + dependencies + '\\'' + '}';\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/java/org/eclipse/che/commons/lang/UrlUtilsTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport static org.testng.Assert.*;\n\nimport java.net.URL;\nimport java.net.URLEncoder;\nimport java.util.HashMap;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.Map;\nimport org.testng.annotations.Test;\n\npublic class UrlUtilsTest {\n  @Test\n  public void shouldExtractParametersWithoutValue() throws Exception {\n    Map<String, List<String>> params =\n        UrlUtils.getQueryParameters(new URL(\"http://codenvy.com/factory?v\"));\n    assertTrue(params.containsKey(\"v\"));\n    assertNull(params.get(\"v\").iterator().next());\n  }\n\n  @Test\n  public void shouldExtractParametersWithMultipleValues() throws Exception {\n    Map<String, List<String>> expectedParams = new HashMap<>();\n    List<String> v = new LinkedList<>();\n    v.add(\"123\");\n    v.add(\"qwe\");\n    v.add(\"www\");\n    expectedParams.put(\"v\", v);\n\n    Map<String, List<String>> params =\n        UrlUtils.getQueryParameters(new URL(\"http://codenvy.com/factory?v=123&v=qwe&v=www\"));\n\n    assertEquals(params, expectedParams);\n  }\n\n  @Test\n  public void shouldExtractParametersWithMultipleValuesDividedAnotherParameters() throws Exception {\n    Map<String, List<String>> expectedParams = new HashMap<>();\n    List<String> v = new LinkedList<>();\n    v.add(\"123\");\n    v.add(\"qwe\");\n    v.add(\"www\");\n    List<String> par = new LinkedList<>();\n    par.add(\"test\");\n    expectedParams.put(\"v\", v);\n    expectedParams.put(\"par\", par);\n\n    Map<String, List<String>> params =\n        UrlUtils.getQueryParameters(\n            new URL(\"http://codenvy.com/factory?v=123&par=test&v=qwe&v=www\"));\n\n    assertEquals(params, expectedParams);\n  }\n\n  @Test\n  public void shouldIgnoreSlashAtTheEndOfPath() throws Exception {\n    Map<String, List<String>> expectedParams = new HashMap<>();\n    List<String> v = new LinkedList<>();\n    v.add(\"123\");\n    v.add(\"qwe\");\n    v.add(\"www\");\n    List<String> par = new LinkedList<>();\n    par.add(\"test\");\n    expectedParams.put(\"v\", v);\n    expectedParams.put(\"par\", par);\n\n    Map<String, List<String>> params =\n        UrlUtils.getQueryParameters(\n            new URL(\"http://codenvy.com/factory/?v=123&par=test&v=qwe&v=www\"));\n\n    assertEquals(params, expectedParams);\n  }\n\n  @Test\n  public void shouldExtractEncodedParameters() throws Exception {\n    Map<String, List<String>> expectedParams = new HashMap<>();\n    List<String> vcsurl = new LinkedList<>();\n    vcsurl.add(\"http://github/some/path?somequery=qwe&somequery=sss&somequery=rty\");\n    expectedParams.put(\"vcsurl\", vcsurl);\n\n    Map<String, List<String>> params =\n        UrlUtils.getQueryParameters(\n            new URL(\n                \"http://codenvy.com/factory?vcsurl=\"\n                    + URLEncoder.encode(\n                        \"http://github/some/path?somequery=qwe&somequery=sss&somequery=rty\",\n                        \"UTF-8\")));\n\n    assertEquals(params, expectedParams);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/java/org/eclipse/che/commons/lang/ZipUtilsTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URL;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.Random;\nimport java.util.function.Consumer;\nimport java.util.regex.Pattern;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipFile;\nimport java.util.zip.ZipOutputStream;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class ZipUtilsTest {\n\n  public static final String FILE_NAME = \"test\";\n  private File zipFile;\n  private byte[] testData;\n\n  @BeforeMethod\n  public void setUp() throws IOException {\n    zipFile = File.createTempFile(\"test\", \"zip\");\n    zipFile.deleteOnExit();\n\n    testData = new byte[2048];\n    Random random = new Random();\n    random.nextBytes(testData);\n\n    try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))) {\n      ZipEntry entry = new ZipEntry(FILE_NAME);\n      entry.setSize(testData.length);\n      zos.putNextEntry(entry);\n      zos.write(testData);\n      zos.closeEntry();\n      zos.close();\n    }\n  }\n\n  @Test\n  public void shouldBeAbleToDetectZipFile() throws IOException {\n    Assert.assertTrue(ZipUtils.isZipFile(zipFile));\n  }\n\n  @Test\n  public void testGetResources() throws Exception {\n    URL testJar = ZipUtilsTest.class.getResource(\"/che/che.jar\");\n    @SuppressWarnings(\"unchecked\")\n    Consumer<InputStream> consumer = mock(Consumer.class);\n\n    ZipUtils.getResources(\n        new ZipFile(testJar.getFile()), Pattern.compile(\".*[//]?codenvy/[^//]+[.]json\"), consumer);\n\n    verify(consumer, times(2)).accept(any(InputStream.class));\n  }\n\n  @Test\n  public void testUnzipFile() throws Exception {\n    Path targetDir = Paths.get(zipFile.getParent());\n    ZipUtils.unzip(zipFile, targetDir.toFile());\n    Path unzippedFile = Paths.get(targetDir.toString(), FILE_NAME);\n    Assert.assertEquals(testData, Files.readAllBytes(unzippedFile));\n    Files.delete(unzippedFile);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/java/org/eclipse/che/commons/lang/ZipUtilsWriteTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang;\n\nimport static org.eclipse.che.commons.lang.ZipUtils.add;\nimport static org.eclipse.che.commons.lang.ZipUtils.listEntries;\nimport static org.eclipse.che.commons.lang.ZipUtils.stream;\nimport static org.testng.Assert.assertTrue;\n\nimport java.io.IOException;\nimport java.nio.file.FileVisitResult;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.nio.file.SimpleFileVisitor;\nimport java.nio.file.attribute.BasicFileAttributes;\nimport java.util.Collection;\nimport java.util.Random;\nimport java.util.zip.ZipOutputStream;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class ZipUtilsWriteTest {\n  private Path zipFile;\n  private Path tempDir;\n\n  private static Random random = new Random();\n\n  @BeforeMethod\n  public void setUp() throws IOException {\n    this.zipFile = Files.createTempFile(\"ZipUtilsTest\", \".zip\");\n    this.tempDir = createZipDir();\n  }\n\n  private Path createZipDir() throws IOException {\n    Path rootDir = Files.createTempDirectory(\"ZipUtilTest\");\n    createFile(rootDir, \"foo.bar\");\n    createFile(rootDir, \"inner/temp.bla\");\n    return rootDir;\n  }\n\n  private void createFile(Path rootDir, String relativePath) throws IOException {\n    Path file = rootDir.resolve(relativePath);\n    Files.createDirectories(file.getParent());\n    byte[] buf = new byte[1024];\n    random.nextBytes(buf);\n    Files.write(file, buf);\n  }\n\n  @AfterMethod\n  public void tearDown() throws IOException {\n    Files.delete(zipFile);\n    Files.walkFileTree(\n        tempDir,\n        new SimpleFileVisitor<Path>() {\n          @Override\n          public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)\n              throws IOException {\n            Files.delete(file);\n            return FileVisitResult.CONTINUE;\n          }\n\n          @Override\n          public FileVisitResult postVisitDirectory(Path dir, IOException e) throws IOException {\n            if (e == null) {\n              Files.delete(dir);\n              return FileVisitResult.CONTINUE;\n            } else {\n              throw e;\n            }\n          }\n        });\n  }\n\n  @Test\n  public void testAddFileWithParent() throws IOException {\n    try (ZipOutputStream out = stream(zipFile)) {\n      add(out, tempDir, tempDir);\n    }\n    Collection<String> entries = listEntries(zipFile.toFile());\n    assertTrue(entries.contains(\"foo.bar\"));\n    assertTrue(entries.contains(Paths.get(\"inner/temp.bla\").toString()));\n  }\n\n  @Test\n  public void testAddFile() throws IOException {\n    try (ZipOutputStream out = stream(zipFile)) {\n      add(out, tempDir);\n    }\n    Collection<String> entries = listEntries(zipFile.toFile());\n    String tempFileName = tempDir.getFileName().toString();\n    assertTrue(entries.contains(Paths.get(tempFileName + \"/foo.bar\").toString()));\n    assertTrue(entries.contains(Paths.get(tempFileName + \"/inner/temp.bla\").toString()));\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/java/org/eclipse/che/commons/lang/concurrent/ThreadLocalPropagateContextTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.concurrent;\n\nimport java.util.concurrent.Callable;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport org.testng.Assert;\nimport org.testng.annotations.AfterTest;\nimport org.testng.annotations.BeforeTest;\nimport org.testng.annotations.Test;\n\n/**\n * @author andrew00x\n */\npublic class ThreadLocalPropagateContextTest {\n  private static ThreadLocal<String> tl1 = new ThreadLocal<>();\n\n  private ExecutorService exec;\n  private final String tlValue = \"my value\";\n\n  @BeforeTest\n  public void setUp() {\n    tl1.set(tlValue);\n    ThreadLocalPropagateContext.addThreadLocal(tl1);\n    Assert.assertEquals(ThreadLocalPropagateContext.getThreadLocals().length, 1);\n    exec = Executors.newSingleThreadExecutor();\n  }\n\n  @AfterTest\n  public void tearDown() {\n    if (exec != null) {\n      exec.shutdownNow();\n    }\n    ThreadLocalPropagateContext.removeThreadLocal(tl1);\n    Assert.assertEquals(ThreadLocalPropagateContext.getThreadLocals().length, 0);\n    tl1.remove();\n  }\n\n  @Test\n  public void testRunnableWithoutThreadLocalPropagateContext() throws Exception {\n    final String[] holder = new String[1];\n    exec.submit(\n            new Runnable() {\n              @Override\n              public void run() {\n                holder[0] = tl1.get();\n              }\n            })\n        .get();\n    Assert.assertNull(holder[0]);\n  }\n\n  @Test\n  public void testRunnableWithThreadLocalPropagateContext() throws Exception {\n    final String[] holder = new String[1];\n    exec.submit(\n            ThreadLocalPropagateContext.wrap(\n                new Runnable() {\n                  @Override\n                  public void run() {\n                    holder[0] = tl1.get();\n                  }\n                }))\n        .get();\n    Assert.assertEquals(holder[0], tlValue);\n  }\n\n  @Test\n  public void testCallableWithoutThreadLocalPropagateContext() throws Exception {\n    final String v =\n        exec.submit(\n                new Callable<String>() {\n                  @Override\n                  public String call() {\n                    return tl1.get();\n                  }\n                })\n            .get();\n    Assert.assertNull(v);\n  }\n\n  @Test\n  public void testCallableWithThreadLocalPropagateContext() throws Exception {\n    final String v =\n        exec.submit(\n                ThreadLocalPropagateContext.wrap(\n                    new Callable<String>() {\n                      @Override\n                      public String call() {\n                        return tl1.get();\n                      }\n                    }))\n            .get();\n    Assert.assertEquals(v, tlValue);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/java/org/eclipse/che/commons/lang/execution/ExecutorServiceBuilderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.execution;\n\nimport static org.testng.Assert.*;\n\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.testng.annotations.Test;\n\npublic class ExecutorServiceBuilderTest {\n  ThreadFactory threadFactory =\n      new ThreadFactoryBuilder()\n          .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n          .setNameFormat(ExecutorServiceBuilderTest.class + \"-%d\")\n          .setDaemon(true)\n          .build();\n\n  @Test\n  public void testBuild() {\n\n    ExecutorService executorService =\n        new ExecutorServiceBuilder()\n            .corePoolSize(6)\n            .maxPoolSize(12)\n            .queueCapacity(5000)\n            .threadFactory(threadFactory)\n            .build();\n\n    assertTrue(executorService instanceof ThreadPoolExecutor);\n\n    ThreadPoolExecutor threadPoolExecutorService = (ThreadPoolExecutor) executorService;\n    assertEquals(threadPoolExecutorService.getCorePoolSize(), 6);\n    assertEquals(threadPoolExecutorService.getMaximumPoolSize(), 12);\n    assertEquals(threadPoolExecutorService.getThreadFactory(), threadFactory);\n  }\n\n  @Test(\n      expectedExceptions = IllegalArgumentException.class,\n      expectedExceptionsMessageRegExp = \"maxPoolSize must be greater than corePoolSize\")\n  public void testSetMaxLowerThenCore() {\n    new ExecutorServiceBuilder().corePoolSize(6).maxPoolSize(1).build();\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/java/org/eclipse/che/commons/lang/os/WindowsPathEscaperTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.lang.os;\n\nimport static org.testng.Assert.assertEquals;\n\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\npublic class WindowsPathEscaperTest {\n  /**\n   * E.g from\n   * https://github.com/boot2docker/boot2docker/blob/master/README.md#virtualbox-guest-additions\n   *\n   * <p>Users should be /Users /Users should be /Users c/Users should be /c/Users /c/Users should be\n   * /c/Users c:/Users should be /c/Users\n   */\n  @Test(dataProvider = \"pathProvider\")\n  public void shouldStaticallyEscapePathForWindowsHost(String windowsPath, String expectedPath) {\n    assertEquals(WindowsPathEscaper.escapePathStatic(windowsPath), expectedPath);\n  }\n\n  /**\n   * E.g from\n   * https://github.com/boot2docker/boot2docker/blob/master/README.md#virtualbox-guest-additions\n   *\n   * <p>Users should be /Users /Users should be /Users c/Users should be /c/Users /c/Users should be\n   * /c/Users c:/Users should be /c/Users\n   */\n  @Test(dataProvider = \"pathProvider\")\n  public void shouldNonStaticallyEscapePathForWindowsHost(String windowsPath, String expectedPath) {\n    WindowsPathEscaper windowsPathEscaper = new WindowsPathEscaper();\n    assertEquals(windowsPathEscaper.escapePath(windowsPath), expectedPath);\n  }\n\n  @DataProvider(name = \"pathProvider\")\n  public static Object[][] pathProvider() {\n    return new Object[][] {\n      {\"Users\", \"/Users\"},\n      {\"/Users\", \"/Users\"},\n      {\"c/Users\", \"/c/Users\"},\n      {\"/c/Users\", \"/c/Users\"},\n      {\"c:/Users\", \"/c/Users\"},\n      {\"C:/Users\", \"/c/Users\"},\n      {\n        \"C:/Users/path/dir/from/host:/name/of/dir/in/container\",\n        \"/c/Users/path/dir/from/host:/name/of/dir/in/container\"\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/resources/findbugs-exclude.xml",
    "content": "<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<FindBugsFilter>\n    <Match>\n        <Class name=\"org.eclipse.che.commons.lang.cache.SLRUCache\"/>\n    </Match>\n    <Match>\n        <Class name=\"org.eclipse.che.commons.lang.cache.SLRUCache$1\"/>\n    </Match>\n    <Match>\n        <Class name=\"org.eclipse.che.commons.lang.cache.SLRUCache$2\"/>\n    </Match>\n</FindBugsFilter>"
  },
  {
    "path": "core/commons/che-core-commons-lang/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"DEBUG\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-commons-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-commons-observability</artifactId>\n    <name>Che Core :: Commons :: Tracing and Monitoring wrapper</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.micrometer</groupId>\n            <artifactId>micrometer-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.opentracing</groupId>\n            <artifactId>opentracing-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.opentracing.contrib</groupId>\n            <artifactId>opentracing-concurrent</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.validation</groupId>\n            <artifactId>jakarta.validation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-schedule</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/main/java/io/micrometer/core/instrument/internal/TimedCronExecutorService.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage io.micrometer.core.instrument.internal;\n\nimport static java.util.stream.Collectors.toList;\n\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Tag;\nimport io.micrometer.core.instrument.Tags;\nimport io.micrometer.core.instrument.Timer;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.concurrent.Callable;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.ScheduledFuture;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\nimport org.eclipse.che.commons.schedule.executor.CronExecutorService;\nimport org.eclipse.che.commons.schedule.executor.CronExpression;\n\n/**\n * A {@link CronExecutorService} that is timed. It provides the same metrics as {@link\n * io.micrometer.core.instrument.internal.TimedScheduledExecutorService} plus adds one extra counter\n * {@code executor.scheduled.cron}. The counter represents the number of invocations of method\n * {@link CronExecutorService#schedule(Runnable, CronExpression)}\n *\n * @author Sergii Kabashniuk\n */\npublic class TimedCronExecutorService implements CronExecutorService {\n  private final CronExecutorService delegate;\n\n  private final Counter scheduledCron;\n\n  private final MeterRegistry registry;\n  private final Timer executionTimer;\n  private final Timer idleTimer;\n  private final Counter scheduledOnce;\n  private final Counter scheduledRepetitively;\n\n  public TimedCronExecutorService(\n      MeterRegistry registry,\n      CronExecutorService delegate,\n      String executorServiceName,\n      Iterable<Tag> tags) {\n    this.registry = registry;\n    this.delegate = delegate;\n    this.executionTimer =\n        registry.timer(\"executor\", Tags.concat(tags, \"name\", executorServiceName));\n    this.idleTimer =\n        registry.timer(\"executor.idle\", Tags.concat(tags, \"name\", executorServiceName));\n    this.scheduledOnce =\n        registry.counter(\"executor.scheduled.once\", Tags.concat(tags, \"name\", executorServiceName));\n    this.scheduledRepetitively =\n        registry.counter(\n            \"executor.scheduled.repetitively\", Tags.concat(tags, \"name\", executorServiceName));\n    this.scheduledCron =\n        registry.counter(\"executor.scheduled.cron\", Tags.concat(tags, \"name\", executorServiceName));\n  }\n\n  @Override\n  public void shutdown() {\n    delegate.shutdown();\n  }\n\n  @Override\n  public List<Runnable> shutdownNow() {\n    return delegate.shutdownNow();\n  }\n\n  @Override\n  public boolean isShutdown() {\n    return delegate.isShutdown();\n  }\n\n  @Override\n  public boolean isTerminated() {\n    return delegate.isTerminated();\n  }\n\n  @Override\n  public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {\n    return delegate.awaitTermination(timeout, unit);\n  }\n\n  @Override\n  public <T> Future<T> submit(Callable<T> task) {\n    return delegate.submit(wrap(task));\n  }\n\n  @Override\n  public <T> Future<T> submit(Runnable task, T result) {\n    return delegate.submit(wrap(task), result);\n  }\n\n  @Override\n  public Future<?> submit(Runnable task) {\n    return delegate.submit(wrap(task));\n  }\n\n  @Override\n  public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)\n      throws InterruptedException {\n    return delegate.invokeAll(wrapAll(tasks));\n  }\n\n  @Override\n  public <T> List<Future<T>> invokeAll(\n      Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)\n      throws InterruptedException {\n    return delegate.invokeAll(wrapAll(tasks), timeout, unit);\n  }\n\n  @Override\n  public <T> T invokeAny(Collection<? extends Callable<T>> tasks)\n      throws InterruptedException, ExecutionException {\n    return delegate.invokeAny(wrapAll(tasks));\n  }\n\n  @Override\n  public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)\n      throws InterruptedException, ExecutionException, TimeoutException {\n    return delegate.invokeAny(wrapAll(tasks), timeout, unit);\n  }\n\n  @Override\n  public void execute(Runnable command) {\n    delegate.execute(wrap(command));\n  }\n\n  @Override\n  public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {\n    scheduledOnce.increment();\n    return delegate.schedule(executionTimer.wrap(command), delay, unit);\n  }\n\n  @Override\n  public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {\n    scheduledOnce.increment();\n    return delegate.schedule(executionTimer.wrap(callable), delay, unit);\n  }\n\n  @Override\n  public ScheduledFuture<?> scheduleAtFixedRate(\n      Runnable command, long initialDelay, long period, TimeUnit unit) {\n    scheduledRepetitively.increment();\n    return delegate.scheduleAtFixedRate(executionTimer.wrap(command), initialDelay, period, unit);\n  }\n\n  @Override\n  public ScheduledFuture<?> scheduleWithFixedDelay(\n      Runnable command, long initialDelay, long delay, TimeUnit unit) {\n    scheduledRepetitively.increment();\n    return delegate.scheduleWithFixedDelay(executionTimer.wrap(command), initialDelay, delay, unit);\n  }\n\n  private Runnable wrap(Runnable task) {\n    return new TimedRunnable(registry, executionTimer, idleTimer, task);\n  }\n\n  private <T> Callable<T> wrap(Callable<T> task) {\n    return new TimedCallable<>(registry, executionTimer, idleTimer, task);\n  }\n\n  private <T> Collection<? extends Callable<T>> wrapAll(Collection<? extends Callable<T>> tasks) {\n    return tasks.stream().map(this::wrap).collect(toList());\n  }\n\n  @Override\n  public Future<?> schedule(Runnable task, CronExpression expression) {\n    scheduledCron.increment();\n    return delegate.schedule(executionTimer.wrap(task), expression);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/CountedRejectedExecutionHandler.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Tag;\nimport io.micrometer.core.instrument.Tags;\nimport io.micrometer.core.instrument.binder.BaseUnits;\nimport java.util.concurrent.RejectedExecutionHandler;\nimport java.util.concurrent.ThreadPoolExecutor;\n\n/**\n * Wrapper of {@link RejectedExecutionHandler} that reports to {@link MeterRegistry} number of\n * rejections.\n */\npublic class CountedRejectedExecutionHandler implements RejectedExecutionHandler {\n\n  private final RejectedExecutionHandler delegate;\n  private final Counter counter;\n\n  public CountedRejectedExecutionHandler(\n      RejectedExecutionHandler delegate, MeterRegistry registry, String name, Iterable<Tag> tags) {\n    this.delegate = delegate;\n    this.counter =\n        Counter.builder(\"executor.rejected\")\n            .tags(Tags.concat(tags, \"name\", name))\n            .description(\"The number of tasks not accepted for execution\")\n            .baseUnit(BaseUnits.TASKS)\n            .register(registry);\n  }\n\n  @Override\n  public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {\n    counter.increment();\n    delegate.rejectedExecution(r, executor);\n  }\n\n  public static void monitorRejections(\n      MeterRegistry registry, ThreadPoolExecutor executor, String name, Iterable<Tag> tags) {\n    executor.setRejectedExecutionHandler(\n        new CountedRejectedExecutionHandler(\n            executor.getRejectedExecutionHandler(), registry, name, tags));\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/CountedThreadFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.Gauge;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Tag;\nimport io.micrometer.core.instrument.Tags;\nimport io.micrometer.core.instrument.binder.BaseUnits;\nimport jakarta.validation.constraints.NotNull;\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.atomic.AtomicInteger;\n\n/** A {@link ThreadFactory} that monitors the number of threads created, running and terminated. */\npublic class CountedThreadFactory implements ThreadFactory {\n\n  private final ThreadFactory delegate;\n  private final Counter created;\n  private final AtomicInteger running = new AtomicInteger(0);\n  private final Counter terminated;\n\n  /**\n   * Wraps a {@link ThreadFactory} with an explicit name and records the number of created, running\n   * and terminated threads.\n   *\n   * @param delegate {@link ThreadFactory} to wrap.\n   * @param registry {@link MeterRegistry} that will contain the metrics.\n   * @param name name for this delegate.\n   * @param tags tags that can provide additional context.\n   */\n  public CountedThreadFactory(\n      ThreadFactory delegate, MeterRegistry registry, String name, Iterable<Tag> tags) {\n    this.delegate = delegate;\n    this.created =\n        Counter.builder(\"thread.factory.created\")\n            .tags(Tags.concat(tags, \"name\", name))\n            .description(\n                \"The approximate number of threads which were created with a thread factory\")\n            .baseUnit(BaseUnits.THREADS)\n            .register(registry);\n    this.terminated =\n        Counter.builder(\"thread.factory.terminated\")\n            .tags(Tags.concat(tags, \"name\", name))\n            .description(\"The approximate number of threads which have finished execution\")\n            .baseUnit(BaseUnits.THREADS)\n            .register(registry);\n    Gauge.builder(\"thread.factory.running\", running, AtomicInteger::get)\n        .tags(Tags.concat(tags, \"name\", name))\n        .description(\n            \"The approximate number of threads which have started to execute, but have not terminated\")\n        .baseUnit(BaseUnits.THREADS)\n        .register(registry);\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public Thread newThread(@NotNull Runnable runnable) {\n\n    Thread thread =\n        delegate.newThread(\n            () -> {\n              running.incrementAndGet();\n              try {\n                runnable.run();\n              } finally {\n                running.decrementAndGet();\n                terminated.increment();\n              }\n            });\n    created.increment();\n    return thread;\n  }\n\n  public static void monitorThreads(\n      MeterRegistry registry, ThreadPoolExecutor executor, String name, Iterable<Tag> tags) {\n    executor.setThreadFactory(\n        new CountedThreadFactory(executor.getThreadFactory(), registry, name, tags));\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/ExecutorServiceWrapper.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport com.google.common.annotations.Beta;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.ScheduledExecutorService;\nimport org.eclipse.che.commons.schedule.executor.CronExecutorService;\n\n/**\n * Wrapper of different implemntations of {@link ExecutorService}. At this moment supported: {@link\n * ExecutorService}, {@link ScheduledExecutorService} and {@link CronExecutorService}.\n *\n * <p>Depending on implementation and environment configuration wrapper can add to the original\n * class different capabilities like monitoring or tracing.\n *\n * @author Sergii Kabashniuk\n */\n@Beta\npublic interface ExecutorServiceWrapper {\n\n  /**\n   * Creates wrapper for the given executor.\n   *\n   * @param executor {@link ExecutorService} that has to be wrapped.\n   * @param name unique name that can identify concrete instance of executor.\n   * @param tags key/value pairs that gives some context about provided executor.\n   * @return wrapped instance of given executor.\n   */\n  ExecutorService wrap(ExecutorService executor, String name, String... tags);\n\n  /**\n   * Creates wrapper for the given executor.\n   *\n   * @param executor {@link ScheduledExecutorService} that has to be wrapped.\n   * @param name unique name that can identify concrete instance of executor.\n   * @param tags key/value pairs that gives some context about provided executor.\n   * @return wrapped instance of given executor.\n   */\n  ScheduledExecutorService wrap(ScheduledExecutorService executor, String name, String... tags);\n\n  /**\n   * Creates wrapper for the given executor.\n   *\n   * @param executor {@link CronExecutorService} that has to be wrapped.\n   * @param name unique name that can identify concrete instance of executor.\n   * @param tags key/value pairs that gives some context about provided executor.\n   * @return wrapped instance of given executor.\n   */\n  CronExecutorService wrap(CronExecutorService executor, String name, String... tags);\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/MeteredAndTracedExecutorServiceWrapper.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.ScheduledExecutorService;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.schedule.executor.CronExecutorService;\n\n/**\n * Implementation of {@code ExecutorServiceWrapper} that add all sort of monitoring and tracing\n * capabilities. Monitoring allayed first, tracing second.\n */\n@Singleton\npublic class MeteredAndTracedExecutorServiceWrapper implements ExecutorServiceWrapper {\n\n  private final MeteredExecutorServiceWrapper meteredExecutorServiceWrapper;\n  private final TracedExecutorServiceWrapper tracedExecutorServiceWrapper;\n\n  @Inject\n  public MeteredAndTracedExecutorServiceWrapper(\n      MeteredExecutorServiceWrapper meteredExecutorServiceWrapper,\n      TracedExecutorServiceWrapper tracedExecutorServiceWrapper) {\n\n    this.meteredExecutorServiceWrapper = meteredExecutorServiceWrapper;\n    this.tracedExecutorServiceWrapper = tracedExecutorServiceWrapper;\n  }\n\n  @Override\n  public ExecutorService wrap(ExecutorService executor, String name, String... tags) {\n    return tracedExecutorServiceWrapper.wrap(\n        meteredExecutorServiceWrapper.wrap(executor, name, tags), name, tags);\n  }\n\n  @Override\n  public ScheduledExecutorService wrap(\n      ScheduledExecutorService executor, String name, String... tags) {\n    return tracedExecutorServiceWrapper.wrap(\n        meteredExecutorServiceWrapper.wrap(executor, name, tags), name, tags);\n  }\n\n  @Override\n  public CronExecutorService wrap(CronExecutorService executor, String name, String... tags) {\n    return tracedExecutorServiceWrapper.wrap(\n        meteredExecutorServiceWrapper.wrap(executor, name, tags), name, tags);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/MeteredExecutorServiceWrapper.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Tags;\nimport io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics;\nimport io.micrometer.core.instrument.internal.TimedCronExecutorService;\nimport io.micrometer.core.lang.Nullable;\nimport java.lang.reflect.Field;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.schedule.executor.CronExecutorService;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Implementation of {@code ExecutorServiceWrapper} that add all sort of monitoring capabilities\n * from {@code ExecutorServiceMetrics}.\n *\n * <p>Also in case if a provided executor is an instance of {@code ThreadPoolExecutor} it will add\n * metrics provided by {@code CountedThreadFactory} and {@code CountedRejectedExecutionHandler}. In\n * case if {@code ExecutorService} provided by {@code Executors} class are the instances of\n * java.util.concurrent.Executors$DelegatedScheduledExecutorService or\n * java.util.concurrent.Executors$FinalizableDelegatedExecutorService there would be an attempt to\n * unwrap them to get underlying {@code ThreadPoolExecutor} to be able to provide {@code\n * CountedThreadFactory} and {@code CountedRejectedExecutionHandler} statistics. Failed unwrapping\n * attempt would be only logged, no exception would be raised and no additional statistic would be\n * published.\n */\n@Singleton\npublic class MeteredExecutorServiceWrapper implements ExecutorServiceWrapper {\n  private static final Logger LOG = LoggerFactory.getLogger(MeteredExecutorServiceWrapper.class);\n\n  private final MeterRegistry meterRegistry;\n\n  @Inject\n  public MeteredExecutorServiceWrapper(MeterRegistry meterRegistry) {\n    this.meterRegistry = meterRegistry;\n  }\n\n  @Override\n  public ScheduledExecutorService wrap(\n      ScheduledExecutorService executor, String name, String... tags) {\n\n    monitorThreadPoolExecutor(executor, name, tags);\n    return ExecutorServiceMetrics.monitor(meterRegistry, executor, name, Tags.of(tags));\n  }\n\n  @Override\n  public ExecutorService wrap(ExecutorService executor, String name, String... tags) {\n    monitorThreadPoolExecutor(executor, name, tags);\n    return ExecutorServiceMetrics.monitor(meterRegistry, executor, name, Tags.of(tags));\n  }\n\n  @Override\n  public CronExecutorService wrap(CronExecutorService executor, String name, String... tags) {\n    monitorThreadPoolExecutor(executor, name, tags);\n    new io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics(\n            executor, name, Tags.of(tags))\n        .bindTo(meterRegistry);\n\n    return new TimedCronExecutorService(meterRegistry, executor, name, Tags.of(tags));\n  }\n\n  private void monitorThreadPoolExecutor(ExecutorService executor, String name, String... tags) {\n    String className = executor.getClass().getName();\n    ThreadPoolExecutor unwrappedThreadPoolExecutor = null;\n    if (executor instanceof ThreadPoolExecutor) {\n      unwrappedThreadPoolExecutor = (ThreadPoolExecutor) executor;\n    } else if (className.equals(\n        \"java.util.concurrent.Executors$DelegatedScheduledExecutorService\")) {\n      unwrappedThreadPoolExecutor = unwrapThreadPoolExecutor(executor, executor.getClass());\n    } else if (className.equals(\n        \"java.util.concurrent.Executors$FinalizableDelegatedExecutorService\")) {\n      unwrappedThreadPoolExecutor =\n          unwrapThreadPoolExecutor(executor, executor.getClass().getSuperclass());\n    }\n    if (unwrappedThreadPoolExecutor != null) {\n      CountedThreadFactory.monitorThreads(\n          meterRegistry, unwrappedThreadPoolExecutor, name, Tags.of(tags));\n      CountedRejectedExecutionHandler.monitorRejections(\n          meterRegistry, unwrappedThreadPoolExecutor, name, Tags.of(tags));\n    }\n  }\n\n  /**\n   * Every ScheduledThreadPoolExecutor created by {@link Executors} is wrapped. Also, {@link\n   * Executors#newSingleThreadExecutor()} wrap a regular {@link ThreadPoolExecutor}.\n   */\n  @Nullable\n  private ThreadPoolExecutor unwrapThreadPoolExecutor(ExecutorService executor, Class<?> wrapper) {\n    try {\n      Field e = wrapper.getDeclaredField(\"e\");\n      e.setAccessible(true);\n      return (ThreadPoolExecutor) e.get(executor);\n    } catch (NoSuchFieldException | IllegalAccessException e) {\n      LOG.error(\n          String.format(\n              \"Unable to unwrap ThreadPoolExecutor from %s instance of %s.\"\n                  + \" CountedThreadFactory and CountedThreadFactory statistic would be omitted\",\n              executor, wrapper),\n          e);\n    }\n    return null;\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/NoopExecutorServiceWrapper.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.ScheduledExecutorService;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.schedule.executor.CronExecutorService;\n\n/**\n * Implementation of {@link ExecutorServiceWrapper} that adds nothing. All wrap methods return the\n * same instance as result.\n *\n * @author Sergii Kabashniuk\n */\n@Singleton\npublic class NoopExecutorServiceWrapper implements ExecutorServiceWrapper {\n\n  @Override\n  public ExecutorService wrap(ExecutorService executor, String name, String... tags) {\n    return executor;\n  }\n\n  @Override\n  public ScheduledExecutorService wrap(\n      ScheduledExecutorService executor, String name, String... tags) {\n    return executor;\n  }\n\n  @Override\n  public CronExecutorService wrap(CronExecutorService executor, String name, String... tags) {\n    return executor;\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/ObservableThreadPullLauncher.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.eclipse.che.commons.schedule.executor.CronThreadPoolExecutor;\nimport org.eclipse.che.commons.schedule.executor.ThreadPullLauncher;\n\n/** Monitored and traced implementation of {@code ThreadPullLauncher}. */\n@Singleton\npublic class ObservableThreadPullLauncher extends ThreadPullLauncher {\n\n  @Inject\n  public ObservableThreadPullLauncher(\n      ExecutorServiceWrapper wrapper, @Named(\"schedule.core_pool_size\") Integer corePoolSize) {\n    super(\n        wrapper.wrap(\n            new CronThreadPoolExecutor(\n                corePoolSize,\n                new ThreadFactoryBuilder()\n                    .setNameFormat(\"Annotated-scheduler-%d\")\n                    .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n                    .setDaemon(false)\n                    .build()),\n            CronThreadPoolExecutor.class.getName()));\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/TracedCronExecutorService.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport io.opentracing.Tracer;\nimport io.opentracing.contrib.concurrent.TracedRunnable;\nimport io.opentracing.contrib.concurrent.TracedScheduledExecutorService;\nimport java.util.concurrent.Future;\nimport javax.inject.Inject;\nimport org.eclipse.che.commons.schedule.executor.CronExecutorService;\nimport org.eclipse.che.commons.schedule.executor.CronExpression;\n\n/**\n * Executor which propagates span from parent thread to submitted. Optionally it creates parent span\n * if traceWithActiveSpanOnly = false.\n */\npublic class TracedCronExecutorService extends TracedScheduledExecutorService\n    implements CronExecutorService {\n\n  private final CronExecutorService delegate;\n\n  @Inject\n  public TracedCronExecutorService(CronExecutorService delegate, Tracer tracer) {\n    super(delegate, tracer);\n    this.delegate = delegate;\n  }\n\n  @Override\n  public Future<?> schedule(Runnable task, CronExpression expression) {\n    return delegate.schedule(\n        tracer.activeSpan() == null ? task : new TracedRunnable(task, tracer), expression);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/TracedExecutorServiceWrapper.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport io.opentracing.Tracer;\nimport io.opentracing.contrib.concurrent.TracedExecutorService;\nimport io.opentracing.contrib.concurrent.TracedScheduledExecutorService;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.ScheduledExecutorService;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.schedule.executor.CronExecutorService;\n\n/**\n * Implementation of {@code ExecutorServiceWrapper} that add all sort of tracing capabilities with\n * help of traced implementation.\n */\n@Singleton\npublic class TracedExecutorServiceWrapper implements ExecutorServiceWrapper {\n\n  private final Tracer tracer;\n\n  @Inject\n  public TracedExecutorServiceWrapper(Tracer tracer) {\n    this.tracer = tracer;\n  }\n\n  @Override\n  public ExecutorService wrap(ExecutorService executor, String name, String... tags) {\n    return new TracedExecutorService(executor, tracer);\n  }\n\n  @Override\n  public ScheduledExecutorService wrap(\n      ScheduledExecutorService executor, String name, String... tags) {\n    return new TracedScheduledExecutorService(executor, tracer);\n  }\n\n  @Override\n  public CronExecutorService wrap(CronExecutorService executor, String name, String... tags) {\n    return new TracedCronExecutorService(executor, tracer);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/main/java/org/eclipse/che/commons/observability/deploy/ExecutorWrapperModule.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability.deploy;\n\nimport com.google.inject.AbstractModule;\nimport org.eclipse.che.commons.observability.*;\nimport org.eclipse.che.commons.schedule.executor.ThreadPullLauncher;\n\npublic class ExecutorWrapperModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n\n    if (Boolean.parseBoolean(System.getenv(\"CHE_METRICS_ENABLED\"))) {\n      if (Boolean.parseBoolean(System.getenv(\"CHE_TRACING_ENABLED\"))) {\n        bind(ExecutorServiceWrapper.class)\n            .to(MeteredAndTracedExecutorServiceWrapper.class)\n            .asEagerSingleton();\n      } else {\n        bind(ExecutorServiceWrapper.class)\n            .to(MeteredExecutorServiceWrapper.class)\n            .asEagerSingleton();\n      }\n    } else {\n      if (Boolean.parseBoolean(System.getenv(\"CHE_TRACING_ENABLED\"))) {\n        bind(ExecutorServiceWrapper.class)\n            .to(TracedExecutorServiceWrapper.class)\n            .asEagerSingleton();\n      } else {\n        bind(ExecutorServiceWrapper.class).to(NoopExecutorServiceWrapper.class).asEagerSingleton();\n      }\n    }\n\n    bind(ThreadPullLauncher.class).to(ObservableThreadPullLauncher.class);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/test/java/io/micrometer/core/instrument/internal/TimedCronExecutorServiceTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage io.micrometer.core.instrument.internal;\n\nimport static org.eclipse.che.commons.test.AssertRetry.assertWithRetry;\n\nimport io.micrometer.core.instrument.MockClock;\nimport io.micrometer.core.instrument.Tag;\nimport io.micrometer.core.instrument.Tags;\nimport io.micrometer.core.instrument.simple.SimpleConfig;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport java.text.ParseException;\nimport java.util.concurrent.CountDownLatch;\nimport org.eclipse.che.commons.schedule.executor.CronExpression;\nimport org.eclipse.che.commons.schedule.executor.CronThreadPoolExecutor;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class TimedCronExecutorServiceTest {\n\n  private SimpleMeterRegistry registry;\n\n  private Iterable<Tag> userTags = Tags.of(\"userTagKey\", \"userTagValue\");\n\n  @BeforeMethod\n  public void setup() {\n    registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock());\n  }\n\n  @Test\n  public void executor() throws InterruptedException, ParseException {\n    // given\n    TimedCronExecutorService executorService =\n        new TimedCronExecutorService(\n            registry,\n            new CronThreadPoolExecutor(1),\n            TimedCronExecutorServiceTest.class.getName(),\n            userTags);\n    CountDownLatch lock = new CountDownLatch(1);\n    // when\n    executorService.schedule(\n        () -> {\n          lock.countDown();\n        },\n        // one time per second\n        new CronExpression(\" * * * ? * * *\"));\n\n    lock.await();\n    // then\n    assertWithRetry(\n        () ->\n            registry\n                .get(\"executor.scheduled.cron\")\n                .tags(userTags)\n                .tag(\"name\", TimedCronExecutorServiceTest.class.getName())\n                .counter()\n                .count(),\n        1.0,\n        10,\n        50);\n\n    assertWithRetry(\n        () ->\n            registry\n                .get(\"executor\")\n                .tags(userTags)\n                .tag(\"name\", TimedCronExecutorServiceTest.class.getName())\n                .timer()\n                .count(),\n        1L,\n        10,\n        50);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/CountedRejectedExecutionHandlerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport static org.testng.Assert.assertEquals;\n\nimport io.micrometer.core.instrument.MockClock;\nimport io.micrometer.core.instrument.Tag;\nimport io.micrometer.core.instrument.Tags;\nimport io.micrometer.core.instrument.simple.SimpleConfig;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.SynchronousQueue;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class CountedRejectedExecutionHandlerTest {\n\n  private SimpleMeterRegistry registry;\n  private Iterable<Tag> userTags = Tags.of(\"userTagKey\", \"userTagValue\");\n\n  @BeforeMethod\n  public void setup() {\n    registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock());\n  }\n\n  @Test\n  public void countRejections() {\n    // given\n    ThreadPoolExecutor executor =\n        new ThreadPoolExecutor(0, 1, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());\n    executor.setRejectedExecutionHandler((r, executor1) -> {});\n\n    CountedRejectedExecutionHandler.monitorRejections(\n        registry, executor, CountedRejectedExecutionHandler.class.getName(), userTags);\n    CountDownLatch runnableTaskComplete = new CountDownLatch(1);\n    Runnable stub =\n        () -> {\n          try {\n            runnableTaskComplete.await(10, TimeUnit.SECONDS);\n          } catch (InterruptedException e) {\n            throw new IllegalStateException(\"runnable interrupted before completion\");\n          }\n        };\n    executor.submit(stub);\n\n    // then\n    for (int i = 0; i < 14; i++) {\n      executor.submit(\n          () -> {\n            // do nothing. Task has to be rejected.\n          });\n    }\n    // when\n    assertEquals(\n        registry\n            .get(\"executor.rejected\")\n            .tags(userTags)\n            .tag(\"name\", CountedRejectedExecutionHandler.class.getName())\n            .counter()\n            .count(),\n        14.0);\n    // cleanup\n    runnableTaskComplete.countDown();\n    executor.shutdownNow();\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/CountedThreadFactoryTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\n\nimport io.micrometer.core.instrument.MockClock;\nimport io.micrometer.core.instrument.Tag;\nimport io.micrometer.core.instrument.Tags;\nimport io.micrometer.core.instrument.simple.SimpleConfig;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class CountedThreadFactoryTest {\n\n  private SimpleMeterRegistry registry;\n  private Iterable<Tag> userTags = Tags.of(\"userTagKey\", \"userTagValue\");\n\n  @BeforeMethod\n  public void setup() {\n    registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock());\n  }\n\n  @Test\n  public void shouldCountCreatedThreads() {\n    // given\n    ThreadFactory factory =\n        new CountedThreadFactory(\n            Executors.defaultThreadFactory(),\n            registry,\n            CountedThreadFactoryTest.class.getName(),\n            userTags);\n    // when\n    factory.newThread(() -> {});\n\n    // then\n    assertEquals(\n        registry\n            .get(\"thread.factory.created\")\n            .tags(userTags)\n            .tag(\"name\", CountedThreadFactoryTest.class.getName())\n            .counter()\n            .count(),\n        1.0);\n  }\n\n  @Test\n  public void shouldCountRunningThreads() throws InterruptedException {\n    // given\n    ThreadFactory factory =\n        new CountedThreadFactory(\n            Executors.defaultThreadFactory(),\n            registry,\n            CountedThreadFactoryTest.class.getName(),\n            userTags);\n\n    CountDownLatch runnableTaskStart = new CountDownLatch(1);\n    CountDownLatch runnableTaskComplete = new CountDownLatch(1);\n    Runnable task =\n        () -> {\n          runnableTaskStart.countDown();\n          try {\n            Assert.assertTrue(runnableTaskComplete.await(10, TimeUnit.SECONDS));\n          } catch (InterruptedException e) {\n            throw new IllegalStateException(\"runnable interrupted before completion\");\n          }\n        };\n\n    // when\n    Thread thread = factory.newThread(task);\n    thread.start();\n\n    // then\n    runnableTaskStart.await();\n    assertEquals(\n        registry\n            .get(\"thread.factory.running\")\n            .tags(userTags)\n            .tag(\"name\", CountedThreadFactoryTest.class.getName())\n            .gauge()\n            .value(),\n        1.0);\n\n    runnableTaskComplete.countDown();\n    thread.join();\n    assertEquals(\n        registry\n            .get(\"thread.factory.running\")\n            .tags(userTags)\n            .tag(\"name\", CountedThreadFactoryTest.class.getName())\n            .gauge()\n            .value(),\n        0.0);\n\n    // put here to ensure that thread are not GCd\n    assertFalse(thread.isAlive());\n    // put here to ensure that factory are not GCd\n    assertNotNull(factory);\n  }\n\n  @Test\n  public void shouldCountRunningAndTerminatedThreadsInExecutorPool()\n      throws InterruptedException, TimeoutException, ExecutionException {\n    // given\n    JoinableThreadFactory factory =\n        new JoinableThreadFactory(\n            new CountedThreadFactory(\n                Executors.defaultThreadFactory(),\n                registry,\n                CountedThreadFactoryTest.class.getName(),\n                userTags));\n    ExecutorService executor = Executors.newCachedThreadPool(factory);\n\n    CountDownLatch runnableTaskStart = new CountDownLatch(10);\n    CountDownLatch runnableTaskComplete = new CountDownLatch(1);\n\n    Runnable task =\n        () -> {\n          runnableTaskStart.countDown();\n          try {\n            Assert.assertTrue(runnableTaskComplete.await(10, TimeUnit.SECONDS));\n          } catch (InterruptedException e) {\n            throw new IllegalStateException(\"runnable interrupted before completion\");\n          }\n        };\n    List<Future> futures = new ArrayList<>(10);\n    for (int i = 0; i < 10; i++) {\n      futures.add(executor.submit(task));\n    }\n    runnableTaskStart.await();\n    assertEquals(\n        registry\n            .get(\"thread.factory.running\")\n            .tags(userTags)\n            .tag(\"name\", CountedThreadFactoryTest.class.getName())\n            .gauge()\n            .value(),\n        10.0);\n    assertEquals(\n        registry\n            .get(\"thread.factory.terminated\")\n            .tags(userTags)\n            .tag(\"name\", CountedThreadFactoryTest.class.getName())\n            .counter()\n            .count(),\n        0.0);\n\n    runnableTaskComplete.countDown();\n\n    for (Future future : futures) {\n      future.get(1, TimeUnit.MINUTES);\n    }\n    executor.shutdownNow();\n    Assert.assertTrue(executor.awaitTermination(10, TimeUnit.SECONDS));\n    factory.joinAll();\n    assertEquals(\n        registry\n            .get(\"thread.factory.running\")\n            .tags(userTags)\n            .tag(\"name\", CountedThreadFactoryTest.class.getName())\n            .gauge()\n            .value(),\n        0.0);\n    assertEquals(\n        registry\n            .get(\"thread.factory.terminated\")\n            .tags(userTags)\n            .tag(\"name\", CountedThreadFactoryTest.class.getName())\n            .counter()\n            .count(),\n        10.0);\n    // put here to ensure that factory are not GCd\n    assertNotNull(factory);\n  }\n\n  public static class JoinableThreadFactory implements ThreadFactory {\n\n    private final ThreadFactory delegate;\n    private final List<Thread> threads;\n\n    public JoinableThreadFactory(ThreadFactory delegate) {\n      this.delegate = delegate;\n      this.threads = new ArrayList<>();\n    }\n\n    @Override\n    public Thread newThread(Runnable r) {\n      Thread result = delegate.newThread(r);\n      threads.add(result);\n      return result;\n    }\n\n    public void joinAll() throws InterruptedException {\n      for (Thread thread : threads) {\n        if (thread.isAlive()) {\n          thread.join();\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/MeteredExecutorServiceWrapperTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport static org.eclipse.che.commons.test.AssertRetry.assertWithRetry;\nimport static org.testng.Assert.assertTrue;\n\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.MockClock;\nimport io.micrometer.core.instrument.Tag;\nimport io.micrometer.core.instrument.Tags;\nimport io.micrometer.core.instrument.simple.SimpleConfig;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport java.text.ParseException;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\nimport org.eclipse.che.commons.schedule.executor.CronExecutorService;\nimport org.eclipse.che.commons.schedule.executor.CronExpression;\nimport org.eclipse.che.commons.schedule.executor.CronThreadPoolExecutor;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Ignore;\nimport org.testng.annotations.Test;\n\n@Ignore\npublic class MeteredExecutorServiceWrapperTest {\n\n  private MeterRegistry registry;\n\n  private ExecutorServiceWrapper executorServiceWrapper;\n  private Iterable<Tag> userTags = Tags.of(\"userTagKey\", \"userTagValue\");\n\n  private ExecutorService executor;\n\n  @BeforeMethod\n  public void setup() {\n    registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock());\n    executorServiceWrapper = new MeteredExecutorServiceWrapper(registry);\n  }\n\n  @AfterMethod\n  public void cleanup() {\n    if (executor == null) return;\n    // Tell threads to finish off.\n    executor.shutdown(); // Disable new tasks from being submitted\n    try {\n      // Wait a while for existing tasks to terminate\n      if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {\n        executor.shutdownNow(); // Cancel currently executing tasks\n        // Wait a while for tasks to respond to being cancelled\n        if (!executor.awaitTermination(60, TimeUnit.SECONDS))\n          System.out.println(\"Pool did not terminate\");\n      }\n    } catch (InterruptedException ie) {\n      // (Re-)Cancel if current thread also interrupted\n      executor.shutdownNow();\n      // Preserve interrupt status\n      Thread.currentThread().interrupt();\n    }\n  }\n\n  @Test\n  public void shouldRecordExecutorServiceMetrics()\n      throws InterruptedException, TimeoutException, ExecutionException {\n    // given\n    executor =\n        executorServiceWrapper.wrap(\n            Executors.newSingleThreadExecutor(),\n            MeteredExecutorServiceWrapperTest.class.getName(),\n            \"userTagKey\",\n            \"userTagValue\");\n    CountDownLatch runnableTaskStart = new CountDownLatch(1);\n    // when\n    Future<?> future = executor.submit(runnableTaskStart::countDown);\n    // then\n    runnableTaskStart.await(10, TimeUnit.SECONDS);\n    future.get(1, TimeUnit.MINUTES);\n\n    assertCounter(\"thread.factory.terminated\", 0.0);\n    assertGauge(\"thread.factory.running\", 1.0);\n    assertCounter(\"thread.factory.created\", 1.0);\n    assertCounter(\"executor.rejected\", 0.0);\n    assertGauge(\"executor.pool.size\", 1.0);\n    assertFunctionCounter(\"executor.completed\", 1.0);\n    assertGauge(\"executor.queued\", 0.0);\n    assertTimerCount(\"executor.idle\", 1L);\n    assertGauge(\"executor.queue.remaining\", (double) Integer.MAX_VALUE);\n    assertTimerCount(\"executor\", 1L);\n    assertGauge(\"executor.active\", 0.0);\n  }\n\n  @Test\n  public void shouldRecordScheduledExecutorServiceMetrics() throws InterruptedException {\n    // given\n    executor =\n        executorServiceWrapper.wrap(\n            Executors.newSingleThreadScheduledExecutor(),\n            MeteredExecutorServiceWrapperTest.class.getName(),\n            \"userTagKey\",\n            \"userTagValue\");\n    CountDownLatch runnableTaskStart = new CountDownLatch(1);\n    // when\n    ((ScheduledExecutorService) executor)\n        .scheduleAtFixedRate(runnableTaskStart::countDown, 0, 100, TimeUnit.SECONDS);\n    // then\n\n    runnableTaskStart.await(10, TimeUnit.SECONDS);\n\n    assertCounter(\"thread.factory.terminated\", 0.0);\n    assertGauge(\"thread.factory.running\", 1.0);\n    assertCounter(\"thread.factory.created\", 1.0);\n    assertCounter(\"executor.rejected\", 0.0);\n    assertGauge(\"executor.pool.size\", 1.0);\n    assertFunctionCounter(\"executor.completed\", 1.0);\n    assertGauge(\"executor.queued\", 1.0);\n    assertTimerCount(\"executor.idle\", 0L);\n    assertGauge(\"executor.queue.remaining\", (double) Integer.MAX_VALUE);\n    assertTimerCount(\"executor\", 1L);\n    assertGauge(\"executor.active\", 0.0);\n    assertCounter(\"executor.scheduled.once\", 0.0);\n    assertCounter(\"executor.scheduled.repetitively\", 1.0);\n  }\n\n  @Test\n  public void shouldRecordCronExecutorServiceMetrics() throws InterruptedException, ParseException {\n    // given\n    CronExecutorService executor =\n        executorServiceWrapper.wrap(\n            new CronThreadPoolExecutor(1),\n            MeteredExecutorServiceWrapperTest.class.getName(),\n            \"userTagKey\",\n            \"userTagValue\");\n    CountDownLatch runnableTaskStart = new CountDownLatch(1);\n    // when\n    executor.schedule(runnableTaskStart::countDown, new CronExpression(\" * * * ? * * *\"));\n    // then\n    runnableTaskStart.await(10, TimeUnit.SECONDS);\n\n    assertCounter(\"thread.factory.terminated\", 0.0);\n    assertGauge(\"thread.factory.running\", 2.0);\n    assertCounter(\"thread.factory.created\", 2.0);\n    assertCounter(\"executor.rejected\", 0.0);\n    assertGauge(\"executor.pool.size\", 2.0);\n    assertFunctionCounter(\"executor.completed\", 1.0);\n    assertGauge(\"executor.queued\", 1.0);\n    assertTimerCount(\"executor.idle\", 0L);\n    assertTrue(\n        registry\n                .get(\"executor.queue.remaining\")\n                .tag(\"name\", MeteredExecutorServiceWrapperTest.class.getName())\n                .tags(userTags)\n                .gauge()\n                .value()\n            > 0.0);\n\n    assertTimerCount(\"executor\", 1L);\n    assertGauge(\"executor.active\", 1.0);\n    assertCounter(\"executor.scheduled.once\", 0.0);\n    assertCounter(\"executor.scheduled.repetitively\", 0.0);\n    assertCounter(\"executor.scheduled.cron\", 1.0);\n  }\n\n  public void assertCounter(String counterName, Double value) throws InterruptedException {\n    assertWithRetry(\n        () ->\n            registry\n                .get(counterName)\n                .tag(\"name\", MeteredExecutorServiceWrapperTest.class.getName())\n                .tags(userTags)\n                .counter()\n                .count(),\n        value,\n        20,\n        50);\n  }\n\n  public void assertFunctionCounter(String counterName, Double value) throws InterruptedException {\n    assertWithRetry(\n        () ->\n            registry\n                .get(counterName)\n                .tag(\"name\", MeteredExecutorServiceWrapperTest.class.getName())\n                .tags(userTags)\n                .functionCounter()\n                .count(),\n        value,\n        20,\n        50);\n  }\n\n  public void assertGauge(String gaugeName, Double value) throws InterruptedException {\n    assertWithRetry(\n        () ->\n            registry\n                .get(gaugeName)\n                .tag(\"name\", MeteredExecutorServiceWrapperTest.class.getName())\n                .tags(userTags)\n                .gauge()\n                .value(),\n        value,\n        20,\n        50);\n  }\n\n  public void assertTimerCount(String timerName, Long value) throws InterruptedException {\n    assertWithRetry(\n        () ->\n            registry\n                .get(timerName)\n                .tag(\"name\", MeteredExecutorServiceWrapperTest.class.getName())\n                .tags(userTags)\n                .timer()\n                .count(),\n        value,\n        20,\n        50);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/test/java/org/eclipse/che/commons/observability/NoopExecutorServiceWrapperTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.observability;\n\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorService;\nimport org.eclipse.che.commons.schedule.executor.CronExecutorService;\nimport org.eclipse.che.commons.schedule.executor.CronThreadPoolExecutor;\nimport org.testng.Assert;\nimport org.testng.annotations.Test;\n\npublic class NoopExecutorServiceWrapperTest {\n  NoopExecutorServiceWrapper noopExecutorServiceWrapper = new NoopExecutorServiceWrapper();\n\n  @Test\n  public void testWrapExecutorService() {\n    // given\n    ExecutorService executorService = Executors.newSingleThreadExecutor();\n    // when\n    ExecutorService result =\n        noopExecutorServiceWrapper.wrap(\n            executorService, NoopExecutorServiceWrapper.class.getName(), \"key\", \"value\");\n    // then\n    Assert.assertSame(result, executorService);\n  }\n\n  @Test\n  public void testWrapScheduledExecutorService() {\n    // given\n    ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();\n    // when\n    ScheduledExecutorService result =\n        noopExecutorServiceWrapper.wrap(\n            executorService, NoopExecutorServiceWrapper.class.getName(), \"key\", \"value\");\n    // then\n    Assert.assertSame(result, executorService);\n  }\n\n  @Test\n  public void testWrapCronExecutorService() {\n    // given\n    CronExecutorService executorService = new CronThreadPoolExecutor(1);\n    // when\n    CronExecutorService result =\n        noopExecutorServiceWrapper.wrap(\n            executorService, NoopExecutorServiceWrapper.class.getName(), \"key\", \"value\");\n    // then\n    Assert.assertSame(result, executorService);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-observability/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/README.md",
    "content": "# Che job scheduling framework\n## About\nThere is such a common programming use case when you need to execute some method periodically.\nUsually it is implemented with some sort of a ThreadPoolExecutor. However, often developers don't pay\nenough attention to thread start stop routine. As a result we have an unnamed thread or thread\nthat never stops, etc. Scheduling framework will take away all threading routine away from\ndeveloper and add a couple of new features.\n\n## Features\n- Run job with a fixed rate\n- Run job with a fixed delay\n- Run job according to the cron expression\n- Error logging\n- Container configuration\n- Automatic job discovering\n- Automatic thread pull start and shutdown.\n\n## TODO\n- Ability to run demon jobs (can be terminated during JVM shutdown)\n- Metrics and statistic\n- Ability to control thread names\n- Time by UTC\n- Do not interrupt future jobs on exceptions\n- Ability to disable task.\n\n## How to use\n### Installation\nThere is a couple of steps you need to do before start. Usually you need to do it once, in target war.\n\n\nFirst: add maven dependency.\n```xml\n<dependency>\n    <groupId>org.eclipse.che.core</groupId>\n    <artifactId>che-core-commons-schedule</artifactId>\n</dependency>\n```\nSecond: You need to install Guice module\n```java\ninstall(new org.eclipse.che.commons.schedule.executor.ScheduleModule());\n```\nThread: You need to configure core pool size. This is the minimum number of workers to keep alive.\n```java\n@Named(\"schedule.core_pool_size\") Integer corePoolSize\n```\nNote: actual number of threads will be corePoolSize+1. One thread is needed to monitor cron jobs.\n\n### Implementations notes\nFramework can execute methods with any visibility and any name. But method must have 0 parameters.\nIf method that need to be executed is\n```java\nvoid run()\n```\nand class implements java.lang.Runnable then this method will be executed without reflection that suppose to be faster then using reflections. Best practices\nis to implement Runnable interface and schedule method run.\nClasses must be annotated with javax.inject.Singleton or com.google.inject.Singleton and binded in guice as Eager singleton.\n\n\n\n### Run job with fixed rate\nIf you would like to execute some method with fixed rate. You can mark it with annotation\nfor execution a periodic action that becomes enabled first after the given initial delay,\nand subsequently with the given period; that is executions will commence after initialDelay\nthen initialDelay+period, then initialDelay + 2 * period, and so on.\nIf any execution of the task encounters an exception, subsequent  executions are suppressed.\nOtherwise, the task will only terminate via cancellation or termination of the executor.\nIf any execution of this task takes longer than its period,\nthen subsequent executions may start late, but will not concurrently execute.\nAnalogue of java.util.concurrent.ScheduledExecutorService#scheduleAtFixedRate\n\nExample 1: Given method scheduleBackup will be executed once a minute after 1 minute initial delay.\n```java\n\n@Singleton\npublic class WorkspaceFsBackupScheduler {\n...\n   @ScheduleRate(initialDelay = 1, period = 1, unit = TimeUnit.MINUTES)\n   public void scheduleBackup() {\n   ...\n   }\n```\n\nExample 2: Same as example 1, but timings configured over container named parameters.\n```java\n@Singleton\npublic class WorkspaceFsBackupScheduler {\n    ...\n    @ScheduleRate(initialDelayParameterName = \"fs.backup.init_dalay\",\n                  periodParameterName = \"fs.backup.period\",\n                  unit = TimeUnit.MINUTES)\n    public void scheduleBackup() {\n       ...\n    }\n```\n<blockquote>\n    <p>NOTE: if initialDelay and initialDelayParameterName  configured at the same time, initialDelayParameterName has greater weight\n       when statically configured value. Same for period and periodParameterName.</p>\n</blockquote>\n\n### Run job with fixed delay\nIf you would like to execute some method with fixed delay you can mark method with annotation\nfor execution periodic action that becomes enabled first after the given initial delay, and subsequently\nwith the given delay between the termination of one execution and the commencement of the next.  Analogue of java.util.concurrent.ScheduledExecutorService#scheduleAtFixedRate\n\nExample 1:  Given method registerRoutingRules will be executed with minute after 1 daley between end and start of\nnew job after 1 minute initial delay.\n```java\n@Singleton // should be eager\npublic class RouterRulesRegistry {\n\n    @ScheduleDelay(initialDelay = 1,\n            delay = 1,\n            unit = TimeUnit.MINUTES)\n    private void registerRoutingRules() throws Exception {\n     ...\n    }\n```\n\nExample 2:  Same as example 1, but timings configured over container named parameters.\n```java\n@Singleton // should be eager\npublic class RouterRulesRegistry {\n\n    @ScheduleDelay(initialDelayParameterName = \"router.rules.initialDelay\",\n            delayParameterName = \"router.rules.delay\",\n            unit = TimeUnit.MINUTES)\n    private void registerRoutingRules() throws Exception {\n     ...\n    }\n```\n<blockquote>\n    <p>NOTE: if initialDelayParameterName and initialDelay  configured at the same time, initialDelayParameterName has greater weight\n       when statically configured value. Same for delay and delayParameterName.</p>\n</blockquote>\n\n### Disabling scheduling by rate or period\nIf a scheduled method has been configured through `delayParameterName` or `periodParameterName`, it is possible to disable\nthe scheduling by setting a non positive value to the parameter.\n\nExample: Disabling scheduling of this `registerRoutingRules` method:\n\n```java\n@Singleton // should be eager\npublic class RouterRulesRegistry {\n\n    @ScheduleDelay(initialDelayParameterName = \"router.rules.initialDelay\",\n            delayParameterName = \"router.rules.delay\",\n            unit = TimeUnit.MINUTES)\n    private void registerRoutingRules() throws Exception {\n     ...\n    }\n```\n\nIn che.properties:\n```\nrouter.rules.delay=-1\n```\nwill disable the scheduling\n\n### Run job according to the cron expression\nIf you would like to execute some method according to the cron expression you can mark method with annotation @ScheduleCron\nExample 1 :  Send each Sunday at 1:00 AM.\n\n```java\n@Singleton\npublic class ReportSender {\n    @ScheduleCron(cron = \"0 0 1 ? * SUN *\")  //\n    public void sendWeeklyReports() {\n    ...\n    }\n```\n\nExample 2 :   Same as example 1, but cron expression configured over container named parameter \"report.sender.cron\".\n\n```java\n@Singleton\npublic class ReportSender {\n    @ScheduleCron(cronParameterName = \"report.sender.cron\")  //\n    public void sendWeeklyReports() {\n    ...\n    }\n```\n\n<blockquote>\n    <p>NOTE: if cronParameterName and cron  configured at the same time, cronParameterName has grater weight\n       when statically configured value.</p>\n</blockquote>\n\n#### Cron expression syntax.\n<dl>\nCron expressions provide the ability to specify complex time combinations such as \n&quot;At 8:00am every Monday through Friday&quot; or &quot;At 1:30am every\nlast Friday of the month&quot;.\n<P>\nCron expressions are comprised of 6 required fields and one optional field\nseparated by white space. The fields respectively are described as follows:\n  *\n<table cellspacing=\"8\">\n<tr>\n<th align=\"left\">Field Name</th>\n<th align=\"left\">&nbsp;</th>\n<th align=\"left\">Allowed Values</th>\n<th align=\"left\">&nbsp;</th>\n<th align=\"left\">Allowed Special Characters</th>\n</tr>\n<tr>\n<td align=\"left\"><code>Seconds</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>0-59</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>, - * /</code></td>\n</tr>\n<tr>\n<td align=\"left\"><code>Minutes</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>0-59</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>, - * /</code></td>\n</tr>\n<tr>\n<td align=\"left\"><code>Hours</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>0-23</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>, - * /</code></td>\n</tr>\n<tr>\n<td align=\"left\"><code>Day-of-month</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>1-31</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>, - * ? / L W</code></td>\n</tr>\n<tr>\n<td align=\"left\"><code>Month</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>1-12 or JAN-DEC</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>, - * /</code></td>\n</tr>\n<tr>\n<td align=\"left\"><code>Day-of-Week</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>1-7 or SUN-SAT</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>, - * ? / L #</code></td>\n</tr>\n<tr>\n<td align=\"left\"><code>Year (Optional)</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>empty, 1970-2199</code></td>\n<td align=\"left\">&nbsp;</th>\n<td align=\"left\"><code>, - * /</code></td>\n</tr>\n</table>\n<P>\nThe '*' character is used to specify all values. For example, &quot;*&quot;\nin the minute field means &quot;every minute&quot;.\n<P>\nThe '?' character is allowed for the day-of-month and day-of-week fields. It\nis used to specify 'no specific value'. This is useful when you need to\nspecify something in one of the two fields, but not the other.\n<P>\nThe '-' character is used to specify ranges For example &quot;10-12&quot; in\nthe hour field means &quot;the hours 10, 11 and 12&quot;.\n<P>\nThe ',' character is used to specify additional values. For example\n&quot;MON,WED,FRI&quot; in the day-of-week field means &quot;the days Monday,\nWednesday, and Friday&quot;.\n<P>\nThe '/' character is used to specify increments. For example &quot;0/15&quot;\nin the seconds field means &quot;the seconds 0, 15, 30, and 45&quot;. And\n&quot;5/15&quot; in the seconds field means &quot;the seconds 5, 20, 35, and\n50&quot;.  Specifying '*' before the  '/' is equivalent to specifying 0 is\nthe value to start with. Essentially, for each field in the expression, there\nis a set of numbers that can be turned on or off. For seconds and minutes,\nthe numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to\n31, and for months 1 to 12. The &quot;/&quot; character simply helps you turn\non every &quot;nth&quot; value in the given set. Thus &quot;7/6&quot; in the\nmonth field only turns on month &quot;7&quot;, it does NOT mean every 6th\nmonth, please note that subtlety.\n<P>\nThe 'L' character is allowed for the day-of-month and day-of-week fields.\nThis character is short-hand for &quot;last&quot;, but it has different\nmeaning in each of the two fields. For example, the value &quot;L&quot; in\nthe day-of-month field means &quot;the last day of the month&quot; - day 31\nfor January, day 28 for February on non-leap years. If used in the\nday-of-week field by itself, it simply means &quot;7&quot; or\n&quot;SAT&quot;. But if used in the day-of-week field after another value, it\nmeans &quot;the last xxx day of the month&quot; - for example &quot;6L&quot;\nmeans &quot;the last friday of the month&quot;. You can also specify an offset\nfrom the last day of the month, such as \"L-3\" which would mean the third-to-last\nday of the calendar month. <i>When using the 'L' option, it is important not to\nspecify lists, or ranges of values, as you'll get confusing/unexpected results.</i>\n<P>\nThe 'W' character is allowed for the day-of-month field.  This character\nis used to specify the weekday (Monday-Friday) nearest the given day.  As an\nexample, if you were to specify &quot;15W&quot; as the value for the\nday-of-month field, the meaning is: &quot;the nearest weekday to the 15th of\nthe month&quot;. So if the 15th is a Saturday, the trigger will fire on\nFriday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the\n16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th.\nHowever if you specify &quot;1W&quot; as the value for day-of-month, and the\n1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not\n'jump' over the boundary of a month's days.  The 'W' character can only be\nspecified when the day-of-month is a single day, not a range or list of days.\n<P>\nThe 'L' and 'W' characters can also be combined for the day-of-month\nexpression to yield 'LW', which translates to &quot;last weekday of the\nmonth&quot;.\n<P>\nThe '#' character is allowed for the day-of-week field. This character is\nused to specify &quot;the nth&quot; XXX day of the month. For example, the\nvalue of &quot;6#3&quot; in the day-of-week field means the third Friday of\nthe month (day 6 = Friday and &quot;#3&quot; = the 3rd one in the month).\nOther examples: &quot;2#1&quot; = the first Monday of the month and\n&quot;4#5&quot; = the fifth Wednesday of the month. Note that if you specify\n&quot;#5&quot; and there is not 5 of the given day-of-week in the month, then\nno firing will occur that month.  If the '#' character is used, there can\nonly be one expression in the day-of-week field (&quot;3#1,6#3&quot; is\nnot valid, since there are two expressions).\n<P>\n<!--The 'C' character is allowed for the day-of-month and day-of-week fields.\nThis character is short-hand for \"calendar\". This means values are\ncalculated against the associated calendar, if any. If no calendar is\nassociated, then it is equivalent to having an all-inclusive calendar. A\nvalue of \"5C\" in the day-of-month field means \"the first day included by the\ncalendar on or after the 5th\". A value of \"1C\" in the day-of-week field\nmeans \"the first day included by the calendar on or after Sunday\".-->\n<P>\nThe legal characters and the names of months and days of the week are not\ncase sensitive.\n  *\n<p>\n<b>NOTES:</b>\n<ul>\n<li>Support for specifying both a day-of-week and a day-of-month value is\nnot complete (you'll need to use the '?' character in one of these fields).\n</li>\n<li>Overflowing ranges is supported - that is, having a larger number on\nthe left hand side than the right. You might do 22-2 to catch 10 o'clock\nat night until 2 o'clock in the morning, or you might have NOV-FEB. It is\nvery important to note that overuse of overflowing ranges creates ranges\nthat don't make sense and no effort has been made to determine which\ninterpretation CronExpression chooses. An example would be\n\"0 0 14-6 ? * FRI-MON\". </li>\n</ul>\n</p>\n<dl>\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-commons-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-commons-schedule</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: Commons :: Scheduler service</name>\n    <properties>\n        <findbugs.excludeFilterFile>${project.build.testSourceDirectory}/../resources/findbugs-exclude.xml</findbugs.excludeFilterFile>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.annotation</groupId>\n            <artifactId>jakarta.annotation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-inject</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Test dependencies -->\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>com.mycila</groupId>\n                <artifactId>license-maven-plugin</artifactId>\n                <configuration>\n                    <excludes>\n                        <!-- Apache License -->\n                        <exclude>**/**/CronExpression*.java</exclude>\n                    </excludes>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/Launcher.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.schedule;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Launcher of periodic jobs.\n *\n * @author Sergii Kabashniuk\n */\npublic interface Launcher {\n  /**\n   * execution periodic action according to the cron expression. See more {@link\n   * org.eclipse.che.commons.schedule.executor.CronExpression}\n   */\n  void scheduleCron(Runnable runnable, String cron);\n\n  /**\n   * Execute periodic action that becomes enabled first after the given initial delay, and\n   * subsequently with the given delay between the termination of one execution and the commencement\n   * of the next.\n   *\n   * <p>Analogue of {@link\n   * java.util.concurrent.ScheduledExecutorService#scheduleAtFixedRate(Runnable, long, long,\n   * java.util.concurrent.TimeUnit)} }\n   */\n  void scheduleWithFixedDelay(Runnable runnable, long initialDelay, long delay, TimeUnit unit);\n\n  /**\n   * Execute a periodic action that becomes enabled first after the given initial delay, and\n   * subsequently with the given period; that is executions will commence after initialDelay then\n   * initialDelay+period, then initialDelay + 2 * period, and so on. If any execution of the task\n   * encounters an exception, subsequent executions are suppressed. Otherwise, the task will only\n   * terminate via cancellation or termination of the executor. If any execution of this task takes\n   * longer than its period, then subsequent executions may start late, but will not concurrently\n   * execute.\n   *\n   * <p>Analogue of {@link\n   * java.util.concurrent.ScheduledExecutorService#scheduleAtFixedRate(Runnable, long, long,\n   * java.util.concurrent.TimeUnit)} }\n   */\n  void scheduleAtFixedRate(Runnable runnable, long initialDelay, long period, TimeUnit unit);\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/ScheduleCron.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.schedule;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Mark method for execution periodic action according to the cron expression. See more {@link\n * org.eclipse.che.commons.schedule.executor.CronExpression}\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface ScheduleCron {\n\n  /**\n   * @return - cron expression.\n   */\n  String cron() default \"\";\n\n  /**\n   * @return name of guice parameter with cron expression.\n   */\n  String cronParameterName() default \"\";\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/ScheduleDelay.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.schedule;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Mark method for execution periodic action that becomes enabled first after the given initial\n * delay, and subsequently with the given delay between the termination of one execution and the\n * commencement of the next.\n *\n * <p>Analogue of {@link java.util.concurrent.ScheduledExecutorService#scheduleAtFixedRate(Runnable,\n * long, long, java.util.concurrent.TimeUnit)} }\n *\n * @author Sergii Kabashniuk\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface ScheduleDelay {\n\n  /**\n   * @return - the time to delay first execution\n   */\n  long initialDelay() default 0;\n\n  /**\n   * @return the delay between the termination of one execution and the commencement of the next\n   */\n  long delay() default 0;\n\n  /**\n   * @return the time unit of the initialDelay and delay parameters\n   */\n  TimeUnit unit() default TimeUnit.SECONDS;\n\n  /**\n   * @return - name of configuration parameter for initialDelay\n   */\n  String initialDelayParameterName() default \"\";\n\n  /**\n   * @return - name of configuration parameter for delay. A non positive delay value will disable\n   *     the scheduling of the method.\n   */\n  String delayParameterName() default \"\";\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/ScheduleRate.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.schedule;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Mark method for execution a periodic action that becomes enabled first after the given initial\n * delay, and subsequently with the given period; that is executions will commence after\n * initialDelay then initialDelay+period, then initialDelay + 2 * period, and so on. If any\n * execution of the task encounters an exception, subsequent executions are suppressed. Otherwise,\n * the task will only terminate via cancellation or termination of the executor. If any execution of\n * this task takes longer than its period, then subsequent executions may start late, but will not\n * concurrently execute.\n *\n * <p>Analogue of {@link java.util.concurrent.ScheduledExecutorService#scheduleAtFixedRate(Runnable,\n * long, long, java.util.concurrent.TimeUnit)} }\n *\n * @author Sergii Kabashniuk\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface ScheduleRate {\n\n  /**\n   * @return - the time to delay first execution\n   */\n  long initialDelay() default 0;\n\n  /**\n   * @return the period between successive executions\n   */\n  long period() default 0;\n\n  /**\n   * @return the time unit of the initialDelay and period parameters\n   */\n  TimeUnit unit() default TimeUnit.SECONDS;\n\n  /**\n   * @return - name of configuration parameter for initialDelay\n   */\n  String initialDelayParameterName() default \"\";\n\n  /**\n   * @return - name of configuration parameter for period. A non positive period value will disable\n   *     the scheduling of the method.\n   */\n  String periodParameterName() default \"\";\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/CronExecutorService.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.schedule.executor;\n\nimport java.util.concurrent.Future;\nimport java.util.concurrent.ScheduledExecutorService;\n\n/** Executor service that schedules a task for execution via a cron expression. */\npublic interface CronExecutorService extends ScheduledExecutorService {\n  /**\n   * Schedules the specified task to execute according to the specified cron expression.\n   *\n   * @param task the Runnable task to schedule\n   * @param expression a cron expression\n   */\n  Future<?> schedule(Runnable task, CronExpression expression);\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/CronExpression.java",
    "content": "/*\n * All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy\n * of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n *\n */\n\npackage org.eclipse.che.commons.schedule.executor;\n\nimport java.io.Serializable;\nimport java.text.ParseException;\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.SortedSet;\nimport java.util.StringTokenizer;\nimport java.util.TimeZone;\nimport java.util.TreeSet;\n\n/**\n * Provides a parser and evaluator for unix-like cron expressions. Cron expressions provide the\n * ability to specify complex time combinations such as &quot;At 8:00am every Monday through\n * Friday&quot; or &quot;At 1:30am every last Friday of the month&quot;.\n *\n * <p>Cron expressions are comprised of 6 required fields and one optional field separated by white\n * space. The fields respectively are described as follows:\n *\n * <table cellspacing=\"8\">\n * <tr>\n * <th align=\"left\">Field Name</th>\n * <th align=\"left\">&nbsp;</th>\n * <th align=\"left\">Allowed Values</th>\n * <th align=\"left\">&nbsp;</th>\n * <th align=\"left\">Allowed Special Characters</th>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Seconds</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>0-59</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * /</code></td>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Minutes</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>0-59</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * /</code></td>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Hours</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>0-23</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * /</code></td>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Day-of-month</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>1-31</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * ? / L W</code></td>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Month</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>1-12 or JAN-DEC</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * /</code></td>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Day-of-Week</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>1-7 or SUN-SAT</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * ? / L #</code></td>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Year (Optional)</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>empty, 1970-2199</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * /</code></td>\n * </tr>\n * </table>\n *\n * <p>The '*' character is used to specify all values. For example, &quot;*&quot; in the minute\n * field means &quot;every minute&quot;.\n *\n * <p>The '?' character is allowed for the day-of-month and day-of-week fields. It is used to\n * specify 'no specific value'. This is useful when you need to specify something in one of the two\n * fields, but not the other.\n *\n * <p>The '-' character is used to specify ranges For example &quot;10-12&quot; in the hour field\n * means &quot;the hours 10, 11 and 12&quot;.\n *\n * <p>The ',' character is used to specify additional values. For example &quot;MON,WED,FRI&quot; in\n * the day-of-week field means &quot;the days Monday, Wednesday, and Friday&quot;.\n *\n * <p>The '/' character is used to specify increments. For example &quot;0/15&quot; in the seconds\n * field means &quot;the seconds 0, 15, 30, and 45&quot;. And &quot;5/15&quot; in the seconds field\n * means &quot;the seconds 5, 20, 35, and 50&quot;. Specifying '*' before the '/' is equivalent to\n * specifying 0 is the value to start with. Essentially, for each field in the expression, there is\n * a set of numbers that can be turned on or off. For seconds and minutes, the numbers range from 0\n * to 59. For hours 0 to 23, for days of the month 0 to 31, and for months 1 to 12. The\n * &quot;/&quot; character simply helps you turn on every &quot;nth&quot; value in the given set.\n * Thus &quot;7/6&quot; in the month field only turns on month &quot;7&quot;, it does NOT mean every\n * 6th month, please note that subtlety.\n *\n * <p>The 'L' character is allowed for the day-of-month and day-of-week fields. This character is\n * short-hand for &quot;last&quot;, but it has different meaning in each of the two fields. For\n * example, the value &quot;L&quot; in the day-of-month field means &quot;the last day of the\n * month&quot; - day 31 for January, day 28 for February on non-leap years. If used in the\n * day-of-week field by itself, it simply means &quot;7&quot; or &quot;SAT&quot;. But if used in the\n * day-of-week field after another value, it means &quot;the last xxx day of the month&quot; - for\n * example &quot;6L&quot; means &quot;the last friday of the month&quot;. You can also specify an\n * offset from the last day of the month, such as \"L-3\" which would mean the third-to-last day of\n * the calendar month. <i>When using the 'L' option, it is important not to specify lists, or ranges\n * of values, as you'll get confusing/unexpected results.</i>\n *\n * <p>The 'W' character is allowed for the day-of-month field. This character is used to specify the\n * weekday (Monday-Friday) nearest the given day. As an example, if you were to specify\n * &quot;15W&quot; as the value for the day-of-month field, the meaning is: &quot;the nearest\n * weekday to the 15th of the month&quot;. So if the 15th is a Saturday, the trigger will fire on\n * Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the 16th. If the 15th\n * is a Tuesday, then it will fire on Tuesday the 15th. However if you specify &quot;1W&quot; as the\n * value for day-of-month, and the 1st is a Saturday, the trigger will fire on Monday the 3rd, as it\n * will not 'jump' over the boundary of a month's days. The 'W' character can only be specified when\n * the day-of-month is a single day, not a range or list of days.\n *\n * <p>The 'L' and 'W' characters can also be combined for the day-of-month expression to yield 'LW',\n * which translates to &quot;last weekday of the month&quot;.\n *\n * <p>The '#' character is allowed for the day-of-week field. This character is used to specify\n * &quot;the nth&quot; XXX day of the month. For example, the value of &quot;6#3&quot; in the\n * day-of-week field means the third Friday of the month (day 6 = Friday and &quot;#3&quot; = the\n * 3rd one in the month). Other examples: &quot;2#1&quot; = the first Monday of the month and\n * &quot;4#5&quot; = the fifth Wednesday of the month. Note that if you specify &quot;#5&quot; and\n * there is not 5 of the given day-of-week in the month, then no firing will occur that month. If\n * the '#' character is used, there can only be one expression in the day-of-week field\n * (&quot;3#1,6#3&quot; is not valid, since there are two expressions).\n *\n * <p>\n * <!--The 'C' character is allowed for the day-of-month and day-of-week fields.\n * This character is short-hand for \"calendar\". This means values are\n * calculated against the associated calendar, if any. If no calendar is\n * associated, then it is equivalent to having an all-inclusive calendar. A\n * value of \"5C\" in the day-of-month field means \"the first day included by the\n * calendar on or after the 5th\". A value of \"1C\" in the day-of-week field\n * means \"the first day included by the calendar on or after Sunday\".-->\n *\n * <p>The legal characters and the names of months and days of the week are not case sensitive.\n *\n * <p><b>NOTES:</b>\n *\n * <ul>\n *   <li>Support for specifying both a day-of-week and a day-of-month value is not complete (you'll\n *       need to use the '?' character in one of these fields).\n *   <li>Overflowing ranges is supported - that is, having a larger number on the left hand side\n *       than the right. You might do 22-2 to catch 10 o'clock at night until 2 o'clock in the\n *       morning, or you might have NOV-FEB. It is very important to note that overuse of\n *       overflowing ranges creates ranges that don't make sense and no effort has been made to\n *       determine which interpretation CronExpression chooses. An example would be \"0 0 14-6 ? *\n *       FRI-MON\".\n * </ul>\n *\n * @author Sharada Jambula, James House\n * @author Contributions from Mads Henderson\n * @author Refactoring from CronTrigger to CronExpression by Aaron Craven\n */\npublic final class CronExpression implements Serializable, Cloneable {\n\n  private static final long serialVersionUID = 12423409423L;\n\n  protected static final int SECOND = 0;\n  protected static final int MINUTE = 1;\n  protected static final int HOUR = 2;\n  protected static final int DAY_OF_MONTH = 3;\n  protected static final int MONTH = 4;\n  protected static final int DAY_OF_WEEK = 5;\n  protected static final int YEAR = 6;\n  protected static final int ALL_SPEC_INT = 99; // '*'\n  protected static final int NO_SPEC_INT = 98; // '?'\n  protected static final Integer ALL_SPEC = ALL_SPEC_INT;\n  protected static final Integer NO_SPEC = NO_SPEC_INT;\n\n  protected static final Map<String, Integer> monthMap = new HashMap<String, Integer>(20);\n  protected static final Map<String, Integer> dayMap = new HashMap<String, Integer>(60);\n\n  static {\n    monthMap.put(\"JAN\", 0);\n    monthMap.put(\"FEB\", 1);\n    monthMap.put(\"MAR\", 2);\n    monthMap.put(\"APR\", 3);\n    monthMap.put(\"MAY\", 4);\n    monthMap.put(\"JUN\", 5);\n    monthMap.put(\"JUL\", 6);\n    monthMap.put(\"AUG\", 7);\n    monthMap.put(\"SEP\", 8);\n    monthMap.put(\"OCT\", 9);\n    monthMap.put(\"NOV\", 10);\n    monthMap.put(\"DEC\", 11);\n\n    dayMap.put(\"SUN\", 1);\n    dayMap.put(\"MON\", 2);\n    dayMap.put(\"TUE\", 3);\n    dayMap.put(\"WED\", 4);\n    dayMap.put(\"THU\", 5);\n    dayMap.put(\"FRI\", 6);\n    dayMap.put(\"SAT\", 7);\n  }\n\n  private final String cronExpression;\n  private TimeZone timeZone = null;\n  protected transient TreeSet<Integer> seconds;\n  protected transient TreeSet<Integer> minutes;\n  protected transient TreeSet<Integer> hours;\n  protected transient TreeSet<Integer> daysOfMonth;\n  protected transient TreeSet<Integer> months;\n  protected transient TreeSet<Integer> daysOfWeek;\n  protected transient TreeSet<Integer> years;\n\n  protected transient boolean lastdayOfWeek = false;\n  protected transient int nthdayOfWeek = 0;\n  protected transient boolean lastdayOfMonth = false;\n  protected transient boolean nearestWeekday = false;\n  protected transient int lastdayOffset = 0;\n  protected transient boolean expressionParsed = false;\n\n  public static final int MAX_YEAR = Calendar.getInstance().get(Calendar.YEAR) + 100;\n\n  /**\n   * Constructs a new <CODE>CronExpression</CODE> based on the specified parameter.\n   *\n   * @param cronExpression String representation of the cron expression the new object should\n   *     represent\n   * @throws java.text.ParseException if the string expression cannot be parsed into a valid <CODE>\n   *     CronExpression</CODE>\n   */\n  public CronExpression(String cronExpression) throws ParseException {\n    if (cronExpression == null) {\n      throw new IllegalArgumentException(\"cronExpression cannot be null\");\n    }\n\n    this.cronExpression = cronExpression.toUpperCase(Locale.US);\n\n    buildExpression(this.cronExpression);\n  }\n\n  /**\n   * Constructs a new {@code CronExpression} as a copy of an existing instance.\n   *\n   * @param expression The existing cron expression to be copied\n   */\n  public CronExpression(CronExpression expression) {\n    /*\n     * We don't call the other constructor here since we need to swallow the\n     * ParseException. We also elide some of the sanity checking as it is\n     * not logically trippable.\n     */\n    this.cronExpression = expression.getCronExpression();\n    try {\n      buildExpression(cronExpression);\n    } catch (ParseException ex) {\n      throw new AssertionError();\n    }\n    if (expression.getTimeZone() != null) {\n      setTimeZone((TimeZone) expression.getTimeZone().clone());\n    }\n  }\n\n  /**\n   * Indicates whether the given date satisfies the cron expression. Note that milliseconds are\n   * ignored, so two Dates falling on different milliseconds of the same second will always have the\n   * same result here.\n   *\n   * @param date the date to evaluate\n   * @return a boolean indicating whether the given date satisfies the cron expression\n   */\n  public boolean isSatisfiedBy(Date date) {\n    Calendar testDateCal = Calendar.getInstance(getTimeZone());\n    testDateCal.setTime(date);\n    testDateCal.set(Calendar.MILLISECOND, 0);\n    Date originalDate = testDateCal.getTime();\n\n    testDateCal.add(Calendar.SECOND, -1);\n\n    Date timeAfter = getTimeAfter(testDateCal.getTime());\n\n    return ((timeAfter != null) && (timeAfter.equals(originalDate)));\n  }\n\n  /**\n   * Returns the next date/time <I>after</I> the given date/time which satisfies the cron\n   * expression.\n   *\n   * @param date the date/time at which to begin the search for the next valid date/time\n   * @return the next valid date/time\n   */\n  public Date getNextValidTimeAfter(Date date) {\n    return getTimeAfter(date);\n  }\n\n  /**\n   * Returns the next date/time <I>after</I> the given date/time which does <I>not</I> satisfy the\n   * expression\n   *\n   * @param date the date/time at which to begin the search for the next invalid date/time\n   * @return the next valid date/time\n   */\n  public Date getNextInvalidTimeAfter(Date date) {\n    long difference = 1000;\n\n    // move back to the nearest second so differences will be accurate\n    Calendar adjustCal = Calendar.getInstance(getTimeZone());\n    adjustCal.setTime(date);\n    adjustCal.set(Calendar.MILLISECOND, 0);\n    Date lastDate = adjustCal.getTime();\n\n    Date newDate;\n\n    // FUTURE_TODO: (QUARTZ-481) IMPROVE THIS! The following is a BAD solution to this problem.\n    // Performance will be very bad here, depending on the cron expression. It is, however A\n    // solution.\n\n    // keep getting the next included time until it's farther than one second\n    // apart. At that point, lastDate is the last valid fire time. We return\n    // the second immediately following it.\n    while (difference == 1000) {\n      newDate = getTimeAfter(lastDate);\n      if (newDate == null) break;\n\n      difference = newDate.getTime() - lastDate.getTime();\n\n      if (difference == 1000) {\n        lastDate = newDate;\n      }\n    }\n\n    return new Date(lastDate.getTime() + 1000);\n  }\n\n  /** Returns the time zone for which this <code>CronExpression</code> will be resolved. */\n  public TimeZone getTimeZone() {\n    if (timeZone == null) {\n      timeZone = TimeZone.getDefault();\n    }\n\n    return timeZone;\n  }\n\n  /** Sets the time zone for which this <code>CronExpression</code> will be resolved. */\n  public void setTimeZone(TimeZone timeZone) {\n    this.timeZone = timeZone;\n  }\n\n  /**\n   * Returns the string representation of the <CODE>CronExpression</CODE>\n   *\n   * @return a string representation of the <CODE>CronExpression</CODE>\n   */\n  @Override\n  public String toString() {\n    return cronExpression;\n  }\n\n  /**\n   * Indicates whether the specified cron expression can be parsed into a valid cron expression\n   *\n   * @param cronExpression the expression to evaluate\n   * @return a boolean indicating whether the given expression is a valid cron expression\n   */\n  public static boolean isValidExpression(String cronExpression) {\n\n    try {\n      new CronExpression(cronExpression);\n    } catch (ParseException pe) {\n      return false;\n    }\n\n    return true;\n  }\n\n  public static void validateExpression(String cronExpression) throws ParseException {\n\n    new CronExpression(cronExpression);\n  }\n\n  ////////////////////////////////////////////////////////////////////////////\n  //\n  // Expression Parsing Functions\n  //\n  ////////////////////////////////////////////////////////////////////////////\n\n  protected void buildExpression(String expression) throws ParseException {\n    expressionParsed = true;\n\n    try {\n\n      if (seconds == null) {\n        seconds = new TreeSet<Integer>();\n      }\n      if (minutes == null) {\n        minutes = new TreeSet<Integer>();\n      }\n      if (hours == null) {\n        hours = new TreeSet<Integer>();\n      }\n      if (daysOfMonth == null) {\n        daysOfMonth = new TreeSet<Integer>();\n      }\n      if (months == null) {\n        months = new TreeSet<Integer>();\n      }\n      if (daysOfWeek == null) {\n        daysOfWeek = new TreeSet<Integer>();\n      }\n      if (years == null) {\n        years = new TreeSet<Integer>();\n      }\n\n      int exprOn = SECOND;\n\n      StringTokenizer exprsTok = new StringTokenizer(expression, \" \\t\", false);\n\n      while (exprsTok.hasMoreTokens() && exprOn <= YEAR) {\n        String expr = exprsTok.nextToken().trim();\n\n        // throw an exception if L is used with other days of the month\n        if (exprOn == DAY_OF_MONTH\n            && expr.indexOf('L') != -1\n            && expr.length() > 1\n            && expr.contains(\",\")) {\n          throw new ParseException(\n              \"Support for specifying 'L' and 'LW' with other days of the month is not implemented\",\n              -1);\n        }\n        // throw an exception if L is used with other days of the week\n        if (exprOn == DAY_OF_WEEK\n            && expr.indexOf('L') != -1\n            && expr.length() > 1\n            && expr.contains(\",\")) {\n          throw new ParseException(\n              \"Support for specifying 'L' with other days of the week is not implemented\", -1);\n        }\n        if (exprOn == DAY_OF_WEEK\n            && expr.indexOf('#') != -1\n            && expr.indexOf('#', expr.indexOf('#') + 1) != -1) {\n          throw new ParseException(\n              \"Support for specifying multiple \\\"nth\\\" days is not implemented.\", -1);\n        }\n\n        StringTokenizer vTok = new StringTokenizer(expr, \",\");\n        while (vTok.hasMoreTokens()) {\n          String v = vTok.nextToken();\n          storeExpressionVals(0, v, exprOn);\n        }\n\n        exprOn++;\n      }\n\n      if (exprOn <= DAY_OF_WEEK) {\n        throw new ParseException(\"Unexpected end of expression.\", expression.length());\n      }\n\n      if (exprOn <= YEAR) {\n        storeExpressionVals(0, \"*\", YEAR);\n      }\n\n      TreeSet<Integer> dow = getSet(DAY_OF_WEEK);\n      TreeSet<Integer> dom = getSet(DAY_OF_MONTH);\n\n      // Copying the logic from the UnsupportedOperationException below\n      boolean dayOfMSpec = !dom.contains(NO_SPEC);\n      boolean dayOfWSpec = !dow.contains(NO_SPEC);\n\n      if (!dayOfMSpec || dayOfWSpec) {\n        if (!dayOfWSpec || dayOfMSpec) {\n          throw new ParseException(\n              \"Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.\",\n              0);\n        }\n      }\n    } catch (ParseException pe) {\n      throw pe;\n    } catch (Exception e) {\n      throw new ParseException(\"Illegal cron expression format (\" + e.toString() + \")\", 0);\n    }\n  }\n\n  protected int storeExpressionVals(int pos, String s, int type) throws ParseException {\n\n    int incr = 0;\n    int i = skipWhiteSpace(pos, s);\n    if (i >= s.length()) {\n      return i;\n    }\n    char c = s.charAt(i);\n    if ((c >= 'A')\n        && (c <= 'Z')\n        && (!s.equals(\"L\"))\n        && (!s.equals(\"LW\"))\n        && (!s.matches(\"^L-[0-9]*[W]?\"))) {\n      String sub = s.substring(i, i + 3);\n      int sval = -1;\n      int eval = -1;\n      if (type == MONTH) {\n        sval = getMonthNumber(sub) + 1;\n        if (sval <= 0) {\n          throw new ParseException(\"Invalid Month value: '\" + sub + \"'\", i);\n        }\n        if (s.length() > i + 3) {\n          c = s.charAt(i + 3);\n          if (c == '-') {\n            i += 4;\n            sub = s.substring(i, i + 3);\n            eval = getMonthNumber(sub) + 1;\n            if (eval <= 0) {\n              throw new ParseException(\"Invalid Month value: '\" + sub + \"'\", i);\n            }\n          }\n        }\n      } else if (type == DAY_OF_WEEK) {\n        sval = getDayOfWeekNumber(sub);\n        if (sval < 0) {\n          throw new ParseException(\"Invalid Day-of-Week value: '\" + sub + \"'\", i);\n        }\n        if (s.length() > i + 3) {\n          c = s.charAt(i + 3);\n          if (c == '-') {\n            i += 4;\n            sub = s.substring(i, i + 3);\n            eval = getDayOfWeekNumber(sub);\n            if (eval < 0) {\n              throw new ParseException(\"Invalid Day-of-Week value: '\" + sub + \"'\", i);\n            }\n          } else if (c == '#') {\n            try {\n              i += 4;\n              nthdayOfWeek = Integer.parseInt(s.substring(i));\n              if (nthdayOfWeek < 1 || nthdayOfWeek > 5) {\n                throw new Exception();\n              }\n            } catch (Exception e) {\n              throw new ParseException(\n                  \"A numeric value between 1 and 5 must follow the '#' option\", i);\n            }\n          } else if (c == 'L') {\n            lastdayOfWeek = true;\n            i++;\n          }\n        }\n\n      } else {\n        throw new ParseException(\"Illegal characters for this position: '\" + sub + \"'\", i);\n      }\n      if (eval != -1) {\n        incr = 1;\n      }\n      addToSet(sval, eval, incr, type);\n      return (i + 3);\n    }\n\n    if (c == '?') {\n      i++;\n      if ((i + 1) < s.length() && (s.charAt(i) != ' ' && s.charAt(i + 1) != '\\t')) {\n        throw new ParseException(\"Illegal character after '?': \" + s.charAt(i), i);\n      }\n      if (type != DAY_OF_WEEK && type != DAY_OF_MONTH) {\n        throw new ParseException(\"'?' can only be specfied for Day-of-Month or Day-of-Week.\", i);\n      }\n      if (type == DAY_OF_WEEK && !lastdayOfMonth) {\n        int val = daysOfMonth.last();\n        if (val == NO_SPEC_INT) {\n          throw new ParseException(\n              \"'?' can only be specfied for Day-of-Month -OR- Day-of-Week.\", i);\n        }\n      }\n\n      addToSet(NO_SPEC_INT, -1, 0, type);\n      return i;\n    }\n\n    if (c == '*' || c == '/') {\n      if (c == '*' && (i + 1) >= s.length()) {\n        addToSet(ALL_SPEC_INT, -1, incr, type);\n        return i + 1;\n      } else if (c == '/'\n          && ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s.charAt(i + 1) == '\\t')) {\n        throw new ParseException(\"'/' must be followed by an integer.\", i);\n      } else if (c == '*') {\n        i++;\n      }\n      c = s.charAt(i);\n      if (c == '/') { // is an increment specified?\n        i++;\n        if (i >= s.length()) {\n          throw new ParseException(\"Unexpected end of string.\", i);\n        }\n\n        incr = getNumericValue(s, i);\n\n        i++;\n        if (incr > 10) {\n          i++;\n        }\n        if (incr > 59 && (type == SECOND || type == MINUTE)) {\n          throw new ParseException(\"Increment > 60 : \" + incr, i);\n        } else if (incr > 23 && (type == HOUR)) {\n          throw new ParseException(\"Increment > 24 : \" + incr, i);\n        } else if (incr > 31 && (type == DAY_OF_MONTH)) {\n          throw new ParseException(\"Increment > 31 : \" + incr, i);\n        } else if (incr > 7 && (type == DAY_OF_WEEK)) {\n          throw new ParseException(\"Increment > 7 : \" + incr, i);\n        } else if (incr > 12 && (type == MONTH)) {\n          throw new ParseException(\"Increment > 12 : \" + incr, i);\n        }\n      } else {\n        incr = 1;\n      }\n\n      addToSet(ALL_SPEC_INT, -1, incr, type);\n      return i;\n    } else if (c == 'L') {\n      i++;\n      if (type == DAY_OF_MONTH) {\n        lastdayOfMonth = true;\n      }\n      if (type == DAY_OF_WEEK) {\n        addToSet(7, 7, 0, type);\n      }\n      if (type == DAY_OF_MONTH && s.length() > i) {\n        c = s.charAt(i);\n        if (c == '-') {\n          ValueSet vs = getValue(0, s, i + 1);\n          lastdayOffset = vs.value;\n          if (lastdayOffset > 30)\n            throw new ParseException(\"Offset from last day must be <= 30\", i + 1);\n          i = vs.pos;\n        }\n        if (s.length() > i) {\n          c = s.charAt(i);\n          if (c == 'W') {\n            nearestWeekday = true;\n            i++;\n          }\n        }\n      }\n      return i;\n    } else if (c >= '0' && c <= '9') {\n      int val = Integer.parseInt(String.valueOf(c));\n      i++;\n      if (i >= s.length()) {\n        addToSet(val, -1, -1, type);\n      } else {\n        c = s.charAt(i);\n        if (c >= '0' && c <= '9') {\n          ValueSet vs = getValue(val, s, i);\n          val = vs.value;\n          i = vs.pos;\n        }\n        i = checkNext(i, s, val, type);\n        return i;\n      }\n    } else {\n      throw new ParseException(\"Unexpected character: \" + c, i);\n    }\n\n    return i;\n  }\n\n  protected int checkNext(int pos, String s, int val, int type) throws ParseException {\n\n    int end = -1;\n    int i = pos;\n\n    if (i >= s.length()) {\n      addToSet(val, end, -1, type);\n      return i;\n    }\n\n    char c = s.charAt(pos);\n\n    if (c == 'L') {\n      if (type == DAY_OF_WEEK) {\n        if (val < 1 || val > 7)\n          throw new ParseException(\"Day-of-Week values must be between 1 and 7\", -1);\n        lastdayOfWeek = true;\n      } else {\n        throw new ParseException(\"'L' option is not valid here. (pos=\" + i + \")\", i);\n      }\n      TreeSet<Integer> set = getSet(type);\n      set.add(val);\n      i++;\n      return i;\n    }\n\n    if (c == 'W') {\n      if (type == DAY_OF_MONTH) {\n        nearestWeekday = true;\n      } else {\n        throw new ParseException(\"'W' option is not valid here. (pos=\" + i + \")\", i);\n      }\n      if (val > 31)\n        throw new ParseException(\n            \"The 'W' option does not make sense with values larger than 31 (max number of days in a month)\",\n            i);\n      TreeSet<Integer> set = getSet(type);\n      set.add(val);\n      i++;\n      return i;\n    }\n\n    if (c == '#') {\n      if (type != DAY_OF_WEEK) {\n        throw new ParseException(\"'#' option is not valid here. (pos=\" + i + \")\", i);\n      }\n      i++;\n      try {\n        nthdayOfWeek = Integer.parseInt(s.substring(i));\n        if (nthdayOfWeek < 1 || nthdayOfWeek > 5) {\n          throw new Exception();\n        }\n      } catch (Exception e) {\n        throw new ParseException(\"A numeric value between 1 and 5 must follow the '#' option\", i);\n      }\n\n      TreeSet<Integer> set = getSet(type);\n      set.add(val);\n      i++;\n      return i;\n    }\n\n    if (c == '-') {\n      i++;\n      c = s.charAt(i);\n      int v = Integer.parseInt(String.valueOf(c));\n      end = v;\n      i++;\n      if (i >= s.length()) {\n        addToSet(val, end, 1, type);\n        return i;\n      }\n      c = s.charAt(i);\n      if (c >= '0' && c <= '9') {\n        ValueSet vs = getValue(v, s, i);\n        end = vs.value;\n        i = vs.pos;\n      }\n      if (i < s.length() && ((c = s.charAt(i)) == '/')) {\n        i++;\n        c = s.charAt(i);\n        int v2 = Integer.parseInt(String.valueOf(c));\n        i++;\n        if (i >= s.length()) {\n          addToSet(val, end, v2, type);\n          return i;\n        }\n        c = s.charAt(i);\n        if (c >= '0' && c <= '9') {\n          ValueSet vs = getValue(v2, s, i);\n          int v3 = vs.value;\n          addToSet(val, end, v3, type);\n          i = vs.pos;\n          return i;\n        } else {\n          addToSet(val, end, v2, type);\n          return i;\n        }\n      } else {\n        addToSet(val, end, 1, type);\n        return i;\n      }\n    }\n\n    if (c == '/') {\n      i++;\n      c = s.charAt(i);\n      int v2 = Integer.parseInt(String.valueOf(c));\n      i++;\n      if (i >= s.length()) {\n        addToSet(val, end, v2, type);\n        return i;\n      }\n      c = s.charAt(i);\n      if (c >= '0' && c <= '9') {\n        ValueSet vs = getValue(v2, s, i);\n        int v3 = vs.value;\n        addToSet(val, end, v3, type);\n        i = vs.pos;\n        return i;\n      } else {\n        throw new ParseException(\"Unexpected character '\" + c + \"' after '/'\", i);\n      }\n    }\n\n    addToSet(val, end, 0, type);\n    i++;\n    return i;\n  }\n\n  public String getCronExpression() {\n    return cronExpression;\n  }\n\n  public String getExpressionSummary() {\n    StringBuilder buf = new StringBuilder();\n\n    buf.append(\"seconds: \");\n    buf.append(getExpressionSetSummary(seconds));\n    buf.append(\"\\n\");\n    buf.append(\"minutes: \");\n    buf.append(getExpressionSetSummary(minutes));\n    buf.append(\"\\n\");\n    buf.append(\"hours: \");\n    buf.append(getExpressionSetSummary(hours));\n    buf.append(\"\\n\");\n    buf.append(\"daysOfMonth: \");\n    buf.append(getExpressionSetSummary(daysOfMonth));\n    buf.append(\"\\n\");\n    buf.append(\"months: \");\n    buf.append(getExpressionSetSummary(months));\n    buf.append(\"\\n\");\n    buf.append(\"daysOfWeek: \");\n    buf.append(getExpressionSetSummary(daysOfWeek));\n    buf.append(\"\\n\");\n    buf.append(\"lastdayOfWeek: \");\n    buf.append(lastdayOfWeek);\n    buf.append(\"\\n\");\n    buf.append(\"nearestWeekday: \");\n    buf.append(nearestWeekday);\n    buf.append(\"\\n\");\n    buf.append(\"NthDayOfWeek: \");\n    buf.append(nthdayOfWeek);\n    buf.append(\"\\n\");\n    buf.append(\"lastdayOfMonth: \");\n    buf.append(lastdayOfMonth);\n    buf.append(\"\\n\");\n    buf.append(\"years: \");\n    buf.append(getExpressionSetSummary(years));\n    buf.append(\"\\n\");\n\n    return buf.toString();\n  }\n\n  protected String getExpressionSetSummary(java.util.Set<Integer> set) {\n\n    if (set.contains(NO_SPEC)) {\n      return \"?\";\n    }\n    if (set.contains(ALL_SPEC)) {\n      return \"*\";\n    }\n\n    StringBuilder buf = new StringBuilder();\n\n    Iterator<Integer> itr = set.iterator();\n    boolean first = true;\n    while (itr.hasNext()) {\n      Integer iVal = itr.next();\n      String val = iVal.toString();\n      if (!first) {\n        buf.append(\",\");\n      }\n      buf.append(val);\n      first = false;\n    }\n\n    return buf.toString();\n  }\n\n  protected String getExpressionSetSummary(java.util.ArrayList<Integer> list) {\n\n    if (list.contains(NO_SPEC)) {\n      return \"?\";\n    }\n    if (list.contains(ALL_SPEC)) {\n      return \"*\";\n    }\n\n    StringBuilder buf = new StringBuilder();\n\n    Iterator<Integer> itr = list.iterator();\n    boolean first = true;\n    while (itr.hasNext()) {\n      Integer iVal = itr.next();\n      String val = iVal.toString();\n      if (!first) {\n        buf.append(\",\");\n      }\n      buf.append(val);\n      first = false;\n    }\n\n    return buf.toString();\n  }\n\n  protected int skipWhiteSpace(int i, String s) {\n    for (; i < s.length() && (s.charAt(i) == ' ' || s.charAt(i) == '\\t'); i++) {\n      ;\n    }\n\n    return i;\n  }\n\n  protected int findNextWhiteSpace(int i, String s) {\n    for (; i < s.length() && (s.charAt(i) != ' ' || s.charAt(i) != '\\t'); i++) {\n      ;\n    }\n\n    return i;\n  }\n\n  protected void addToSet(int val, int end, int incr, int type) throws ParseException {\n\n    TreeSet<Integer> set = getSet(type);\n\n    if (type == SECOND || type == MINUTE) {\n      if ((val < 0 || val > 59 || end > 59) && (val != ALL_SPEC_INT)) {\n        throw new ParseException(\"Minute and Second values must be between 0 and 59\", -1);\n      }\n    } else if (type == HOUR) {\n      if ((val < 0 || val > 23 || end > 23) && (val != ALL_SPEC_INT)) {\n        throw new ParseException(\"Hour values must be between 0 and 23\", -1);\n      }\n    } else if (type == DAY_OF_MONTH) {\n      if ((val < 1 || val > 31 || end > 31) && (val != ALL_SPEC_INT) && (val != NO_SPEC_INT)) {\n        throw new ParseException(\"Day of month values must be between 1 and 31\", -1);\n      }\n    } else if (type == MONTH) {\n      if ((val < 1 || val > 12 || end > 12) && (val != ALL_SPEC_INT)) {\n        throw new ParseException(\"Month values must be between 1 and 12\", -1);\n      }\n    } else if (type == DAY_OF_WEEK) {\n      if ((val == 0 || val > 7 || end > 7) && (val != ALL_SPEC_INT) && (val != NO_SPEC_INT)) {\n        throw new ParseException(\"Day-of-Week values must be between 1 and 7\", -1);\n      }\n    }\n\n    if ((incr == 0 || incr == -1) && val != ALL_SPEC_INT) {\n      if (val != -1) {\n        set.add(val);\n      } else {\n        set.add(NO_SPEC);\n      }\n\n      return;\n    }\n\n    int startAt = val;\n    int stopAt = end;\n\n    if (val == ALL_SPEC_INT && incr <= 0) {\n      incr = 1;\n      set.add(ALL_SPEC); // put in a marker, but also fill values\n    }\n\n    if (type == SECOND || type == MINUTE) {\n      if (stopAt == -1) {\n        stopAt = 59;\n      }\n      if (startAt == -1 || startAt == ALL_SPEC_INT) {\n        startAt = 0;\n      }\n    } else if (type == HOUR) {\n      if (stopAt == -1) {\n        stopAt = 23;\n      }\n      if (startAt == -1 || startAt == ALL_SPEC_INT) {\n        startAt = 0;\n      }\n    } else if (type == DAY_OF_MONTH) {\n      if (stopAt == -1) {\n        stopAt = 31;\n      }\n      if (startAt == -1 || startAt == ALL_SPEC_INT) {\n        startAt = 1;\n      }\n    } else if (type == MONTH) {\n      if (stopAt == -1) {\n        stopAt = 12;\n      }\n      if (startAt == -1 || startAt == ALL_SPEC_INT) {\n        startAt = 1;\n      }\n    } else if (type == DAY_OF_WEEK) {\n      if (stopAt == -1) {\n        stopAt = 7;\n      }\n      if (startAt == -1 || startAt == ALL_SPEC_INT) {\n        startAt = 1;\n      }\n    } else if (type == YEAR) {\n      if (stopAt == -1) {\n        stopAt = MAX_YEAR;\n      }\n      if (startAt == -1 || startAt == ALL_SPEC_INT) {\n        startAt = 1970;\n      }\n    }\n\n    // if the end of the range is before the start, then we need to overflow into\n    // the next day, month etc. This is done by adding the maximum amount for that\n    // type, and using modulus max to determine the value being added.\n    int max = -1;\n    if (stopAt < startAt) {\n      switch (type) {\n        case SECOND:\n          max = 60;\n          break;\n        case MINUTE:\n          max = 60;\n          break;\n        case HOUR:\n          max = 24;\n          break;\n        case MONTH:\n          max = 12;\n          break;\n        case DAY_OF_WEEK:\n          max = 7;\n          break;\n        case DAY_OF_MONTH:\n          max = 31;\n          break;\n        case YEAR:\n          throw new IllegalArgumentException(\"Start year must be less than stop year\");\n        default:\n          throw new IllegalArgumentException(\"Unexpected type encountered\");\n      }\n      stopAt += max;\n    }\n\n    for (int i = startAt; i <= stopAt; i += incr) {\n      if (max == -1) {\n        // ie: there's no max to overflow over\n        set.add(i);\n      } else {\n        // take the modulus to get the real value\n        int i2 = i % max;\n\n        // 1-indexed ranges should not include 0, and should include their max\n        if (i2 == 0 && (type == MONTH || type == DAY_OF_WEEK || type == DAY_OF_MONTH)) {\n          i2 = max;\n        }\n\n        set.add(i2);\n      }\n    }\n  }\n\n  TreeSet<Integer> getSet(int type) {\n    switch (type) {\n      case SECOND:\n        return seconds;\n      case MINUTE:\n        return minutes;\n      case HOUR:\n        return hours;\n      case DAY_OF_MONTH:\n        return daysOfMonth;\n      case MONTH:\n        return months;\n      case DAY_OF_WEEK:\n        return daysOfWeek;\n      case YEAR:\n        return years;\n      default:\n        return null;\n    }\n  }\n\n  protected ValueSet getValue(int v, String s, int i) {\n    char c = s.charAt(i);\n    StringBuilder s1 = new StringBuilder(String.valueOf(v));\n    while (c >= '0' && c <= '9') {\n      s1.append(c);\n      i++;\n      if (i >= s.length()) {\n        break;\n      }\n      c = s.charAt(i);\n    }\n    ValueSet val = new ValueSet();\n\n    val.pos = (i < s.length()) ? i : i + 1;\n    val.value = Integer.parseInt(s1.toString());\n    return val;\n  }\n\n  protected int getNumericValue(String s, int i) {\n    int endOfVal = findNextWhiteSpace(i, s);\n    String val = s.substring(i, endOfVal);\n    return Integer.parseInt(val);\n  }\n\n  protected int getMonthNumber(String s) {\n    Integer integer = monthMap.get(s);\n\n    if (integer == null) {\n      return -1;\n    }\n\n    return integer;\n  }\n\n  protected int getDayOfWeekNumber(String s) {\n    Integer integer = dayMap.get(s);\n\n    if (integer == null) {\n      return -1;\n    }\n\n    return integer;\n  }\n\n  ////////////////////////////////////////////////////////////////////////////\n  //\n  // Computation Functions\n  //\n  ////////////////////////////////////////////////////////////////////////////\n\n  public Date getTimeAfter(Date afterTime) {\n\n    // Computation is based on Gregorian year only.\n    Calendar cl = new java.util.GregorianCalendar(getTimeZone());\n\n    // move ahead one second, since we're computing the time *after* the\n    // given time\n    afterTime = new Date(afterTime.getTime() + 1000);\n    // CronTrigger does not deal with milliseconds\n    cl.setTime(afterTime);\n    cl.set(Calendar.MILLISECOND, 0);\n\n    boolean gotOne = false;\n    // loop until we've computed the next time, or we've past the endTime\n    while (!gotOne) {\n\n      // if (endTime != null && cl.getTime().after(endTime)) return null;\n      if (cl.get(Calendar.YEAR) > 2999) { // prevent endless loop...\n        return null;\n      }\n\n      SortedSet<Integer> st = null;\n      int t = 0;\n\n      int sec = cl.get(Calendar.SECOND);\n      int min = cl.get(Calendar.MINUTE);\n\n      // get second.................................................\n      st = seconds.tailSet(sec);\n      if (st != null && st.size() != 0) {\n        sec = st.first();\n      } else {\n        sec = seconds.first();\n        min++;\n        cl.set(Calendar.MINUTE, min);\n      }\n      cl.set(Calendar.SECOND, sec);\n\n      min = cl.get(Calendar.MINUTE);\n      int hr = cl.get(Calendar.HOUR_OF_DAY);\n      t = -1;\n\n      // get minute.................................................\n      st = minutes.tailSet(min);\n      if (st != null && st.size() != 0) {\n        t = min;\n        min = st.first();\n      } else {\n        min = minutes.first();\n        hr++;\n      }\n      if (min != t) {\n        cl.set(Calendar.SECOND, 0);\n        cl.set(Calendar.MINUTE, min);\n        setCalendarHour(cl, hr);\n        continue;\n      }\n      cl.set(Calendar.MINUTE, min);\n\n      hr = cl.get(Calendar.HOUR_OF_DAY);\n      int day = cl.get(Calendar.DAY_OF_MONTH);\n      t = -1;\n\n      // get hour...................................................\n      st = hours.tailSet(hr);\n      if (st != null && st.size() != 0) {\n        t = hr;\n        hr = st.first();\n      } else {\n        hr = hours.first();\n        day++;\n      }\n      if (hr != t) {\n        cl.set(Calendar.SECOND, 0);\n        cl.set(Calendar.MINUTE, 0);\n        cl.set(Calendar.DAY_OF_MONTH, day);\n        setCalendarHour(cl, hr);\n        continue;\n      }\n      cl.set(Calendar.HOUR_OF_DAY, hr);\n\n      day = cl.get(Calendar.DAY_OF_MONTH);\n      int mon = cl.get(Calendar.MONTH) + 1;\n      // '+ 1' because calendar is 0-based for this field, and we are\n      // 1-based\n      t = -1;\n      int tmon = mon;\n\n      // get day...................................................\n      boolean dayOfMSpec = !daysOfMonth.contains(NO_SPEC);\n      boolean dayOfWSpec = !daysOfWeek.contains(NO_SPEC);\n      if (dayOfMSpec && !dayOfWSpec) { // get day by day of month rule\n        st = daysOfMonth.tailSet(day);\n        if (lastdayOfMonth) {\n          if (!nearestWeekday) {\n            t = day;\n            day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n            day -= lastdayOffset;\n            if (t > day) {\n              mon++;\n              if (mon > 12) {\n                mon = 1;\n                tmon = 3333; // ensure test of mon != tmon further below fails\n                cl.add(Calendar.YEAR, 1);\n              }\n              day = 1;\n            }\n          } else {\n            t = day;\n            day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n            day -= lastdayOffset;\n\n            java.util.Calendar tcal = java.util.Calendar.getInstance(getTimeZone());\n            tcal.set(Calendar.SECOND, 0);\n            tcal.set(Calendar.MINUTE, 0);\n            tcal.set(Calendar.HOUR_OF_DAY, 0);\n            tcal.set(Calendar.DAY_OF_MONTH, day);\n            tcal.set(Calendar.MONTH, mon - 1);\n            tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR));\n\n            int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n            int dow = tcal.get(Calendar.DAY_OF_WEEK);\n\n            if (dow == Calendar.SATURDAY && day == 1) {\n              day += 2;\n            } else if (dow == Calendar.SATURDAY) {\n              day -= 1;\n            } else if (dow == Calendar.SUNDAY && day == ldom) {\n              day -= 2;\n            } else if (dow == Calendar.SUNDAY) {\n              day += 1;\n            }\n\n            tcal.set(Calendar.SECOND, sec);\n            tcal.set(Calendar.MINUTE, min);\n            tcal.set(Calendar.HOUR_OF_DAY, hr);\n            tcal.set(Calendar.DAY_OF_MONTH, day);\n            tcal.set(Calendar.MONTH, mon - 1);\n            Date nTime = tcal.getTime();\n            if (nTime.before(afterTime)) {\n              day = 1;\n              mon++;\n            }\n          }\n        } else if (nearestWeekday) {\n          t = day;\n          day = daysOfMonth.first();\n\n          java.util.Calendar tcal = java.util.Calendar.getInstance(getTimeZone());\n          tcal.set(Calendar.SECOND, 0);\n          tcal.set(Calendar.MINUTE, 0);\n          tcal.set(Calendar.HOUR_OF_DAY, 0);\n          tcal.set(Calendar.DAY_OF_MONTH, day);\n          tcal.set(Calendar.MONTH, mon - 1);\n          tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR));\n\n          int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n          int dow = tcal.get(Calendar.DAY_OF_WEEK);\n\n          if (dow == Calendar.SATURDAY && day == 1) {\n            day += 2;\n          } else if (dow == Calendar.SATURDAY) {\n            day -= 1;\n          } else if (dow == Calendar.SUNDAY && day == ldom) {\n            day -= 2;\n          } else if (dow == Calendar.SUNDAY) {\n            day += 1;\n          }\n\n          tcal.set(Calendar.SECOND, sec);\n          tcal.set(Calendar.MINUTE, min);\n          tcal.set(Calendar.HOUR_OF_DAY, hr);\n          tcal.set(Calendar.DAY_OF_MONTH, day);\n          tcal.set(Calendar.MONTH, mon - 1);\n          Date nTime = tcal.getTime();\n          if (nTime.before(afterTime)) {\n            day = daysOfMonth.first();\n            mon++;\n          }\n        } else if (st != null && st.size() != 0) {\n          t = day;\n          day = st.first();\n          // make sure we don't over-run a short month, such as february\n          int lastDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n          if (day > lastDay) {\n            day = daysOfMonth.first();\n            mon++;\n          }\n        } else {\n          day = daysOfMonth.first();\n          mon++;\n        }\n\n        if (day != t || mon != tmon) {\n          cl.set(Calendar.SECOND, 0);\n          cl.set(Calendar.MINUTE, 0);\n          cl.set(Calendar.HOUR_OF_DAY, 0);\n          cl.set(Calendar.DAY_OF_MONTH, day);\n          cl.set(Calendar.MONTH, mon - 1);\n          // '- 1' because calendar is 0-based for this field, and we\n          // are 1-based\n          continue;\n        }\n      } else if (dayOfWSpec && !dayOfMSpec) { // get day by day of week rule\n        if (lastdayOfWeek) { // are we looking for the last XXX day of\n          // the month?\n          int dow = daysOfWeek.first(); // desired\n          // d-o-w\n          int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w\n          int daysToAdd = 0;\n          if (cDow < dow) {\n            daysToAdd = dow - cDow;\n          }\n          if (cDow > dow) {\n            daysToAdd = dow + (7 - cDow);\n          }\n\n          int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n\n          if (day + daysToAdd > lDay) { // did we already miss the\n            // last one?\n            cl.set(Calendar.SECOND, 0);\n            cl.set(Calendar.MINUTE, 0);\n            cl.set(Calendar.HOUR_OF_DAY, 0);\n            cl.set(Calendar.DAY_OF_MONTH, 1);\n            cl.set(Calendar.MONTH, mon);\n            // no '- 1' here because we are promoting the month\n            continue;\n          }\n\n          // find date of last occurrence of this day in this month...\n          while ((day + daysToAdd + 7) <= lDay) {\n            daysToAdd += 7;\n          }\n\n          day += daysToAdd;\n\n          if (daysToAdd > 0) {\n            cl.set(Calendar.SECOND, 0);\n            cl.set(Calendar.MINUTE, 0);\n            cl.set(Calendar.HOUR_OF_DAY, 0);\n            cl.set(Calendar.DAY_OF_MONTH, day);\n            cl.set(Calendar.MONTH, mon - 1);\n            // '- 1' here because we are not promoting the month\n            continue;\n          }\n\n        } else if (nthdayOfWeek != 0) {\n          // are we looking for the Nth XXX day in the month?\n          int dow = daysOfWeek.first(); // desired\n          // d-o-w\n          int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w\n          int daysToAdd = 0;\n          if (cDow < dow) {\n            daysToAdd = dow - cDow;\n          } else if (cDow > dow) {\n            daysToAdd = dow + (7 - cDow);\n          }\n\n          boolean dayShifted = false;\n          if (daysToAdd > 0) {\n            dayShifted = true;\n          }\n\n          day += daysToAdd;\n          int weekOfMonth = day / 7;\n          if (day % 7 > 0) {\n            weekOfMonth++;\n          }\n\n          daysToAdd = (nthdayOfWeek - weekOfMonth) * 7;\n          day += daysToAdd;\n          if (daysToAdd < 0 || day > getLastDayOfMonth(mon, cl.get(Calendar.YEAR))) {\n            cl.set(Calendar.SECOND, 0);\n            cl.set(Calendar.MINUTE, 0);\n            cl.set(Calendar.HOUR_OF_DAY, 0);\n            cl.set(Calendar.DAY_OF_MONTH, 1);\n            cl.set(Calendar.MONTH, mon);\n            // no '- 1' here because we are promoting the month\n            continue;\n          } else if (daysToAdd > 0 || dayShifted) {\n            cl.set(Calendar.SECOND, 0);\n            cl.set(Calendar.MINUTE, 0);\n            cl.set(Calendar.HOUR_OF_DAY, 0);\n            cl.set(Calendar.DAY_OF_MONTH, day);\n            cl.set(Calendar.MONTH, mon - 1);\n            // '- 1' here because we are NOT promoting the month\n            continue;\n          }\n        } else {\n          int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w\n          int dow = daysOfWeek.first(); // desired\n          // d-o-w\n          st = daysOfWeek.tailSet(cDow);\n          if (st != null && st.size() > 0) {\n            dow = st.first();\n          }\n\n          int daysToAdd = 0;\n          if (cDow < dow) {\n            daysToAdd = dow - cDow;\n          }\n          if (cDow > dow) {\n            daysToAdd = dow + (7 - cDow);\n          }\n\n          int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n\n          if (day + daysToAdd > lDay) { // will we pass the end of\n            // the month?\n            cl.set(Calendar.SECOND, 0);\n            cl.set(Calendar.MINUTE, 0);\n            cl.set(Calendar.HOUR_OF_DAY, 0);\n            cl.set(Calendar.DAY_OF_MONTH, 1);\n            cl.set(Calendar.MONTH, mon);\n            // no '- 1' here because we are promoting the month\n            continue;\n          } else if (daysToAdd > 0) { // are we swithing days?\n            cl.set(Calendar.SECOND, 0);\n            cl.set(Calendar.MINUTE, 0);\n            cl.set(Calendar.HOUR_OF_DAY, 0);\n            cl.set(Calendar.DAY_OF_MONTH, day + daysToAdd);\n            cl.set(Calendar.MONTH, mon - 1);\n            // '- 1' because calendar is 0-based for this field,\n            // and we are 1-based\n            continue;\n          }\n        }\n      } else { // dayOfWSpec && !dayOfMSpec\n        throw new UnsupportedOperationException(\n            \"Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.\");\n      }\n      cl.set(Calendar.DAY_OF_MONTH, day);\n\n      mon = cl.get(Calendar.MONTH) + 1;\n      // '+ 1' because calendar is 0-based for this field, and we are\n      // 1-based\n      int year = cl.get(Calendar.YEAR);\n      t = -1;\n\n      // test for expressions that never generate a valid fire date,\n      // but keep looping...\n      if (year > MAX_YEAR) {\n        return null;\n      }\n\n      // get month...................................................\n      st = months.tailSet(mon);\n      if (st != null && st.size() != 0) {\n        t = mon;\n        mon = st.first();\n      } else {\n        mon = months.first();\n        year++;\n      }\n      if (mon != t) {\n        cl.set(Calendar.SECOND, 0);\n        cl.set(Calendar.MINUTE, 0);\n        cl.set(Calendar.HOUR_OF_DAY, 0);\n        cl.set(Calendar.DAY_OF_MONTH, 1);\n        cl.set(Calendar.MONTH, mon - 1);\n        // '- 1' because calendar is 0-based for this field, and we are\n        // 1-based\n        cl.set(Calendar.YEAR, year);\n        continue;\n      }\n      cl.set(Calendar.MONTH, mon - 1);\n      // '- 1' because calendar is 0-based for this field, and we are\n      // 1-based\n\n      year = cl.get(Calendar.YEAR);\n      t = -1;\n\n      // get year...................................................\n      st = years.tailSet(year);\n      if (st != null && st.size() != 0) {\n        t = year;\n        year = st.first();\n      } else {\n        return null; // ran out of years...\n      }\n\n      if (year != t) {\n        cl.set(Calendar.SECOND, 0);\n        cl.set(Calendar.MINUTE, 0);\n        cl.set(Calendar.HOUR_OF_DAY, 0);\n        cl.set(Calendar.DAY_OF_MONTH, 1);\n        cl.set(Calendar.MONTH, 0);\n        // '- 1' because calendar is 0-based for this field, and we are\n        // 1-based\n        cl.set(Calendar.YEAR, year);\n        continue;\n      }\n      cl.set(Calendar.YEAR, year);\n\n      gotOne = true;\n    } // while( !done )\n\n    return cl.getTime();\n  }\n\n  /**\n   * Advance the calendar to the particular hour paying particular attention to daylight saving\n   * problems.\n   *\n   * @param cal the calendar to operate on\n   * @param hour the hour to set\n   */\n  protected void setCalendarHour(Calendar cal, int hour) {\n    cal.set(java.util.Calendar.HOUR_OF_DAY, hour);\n    if (cal.get(java.util.Calendar.HOUR_OF_DAY) != hour && hour != 24) {\n      cal.set(java.util.Calendar.HOUR_OF_DAY, hour + 1);\n    }\n  }\n\n  /**\n   * NOT YET IMPLEMENTED: Returns the time before the given time that the <code>CronExpression\n   * </code> matches.\n   */\n  public Date getTimeBefore(Date endTime) {\n    // FUTURE_TODO: implement QUARTZ-423\n    return null;\n  }\n\n  /**\n   * NOT YET IMPLEMENTED: Returns the final time that the <code>CronExpression</code> will match.\n   */\n  public Date getFinalFireTime() {\n    // FUTURE_TODO: implement QUARTZ-423\n    return null;\n  }\n\n  protected boolean isLeapYear(int year) {\n    return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));\n  }\n\n  protected int getLastDayOfMonth(int monthNum, int year) {\n\n    switch (monthNum) {\n      case 1:\n        return 31;\n      case 2:\n        return (isLeapYear(year)) ? 29 : 28;\n      case 3:\n        return 31;\n      case 4:\n        return 30;\n      case 5:\n        return 31;\n      case 6:\n        return 30;\n      case 7:\n        return 31;\n      case 8:\n        return 31;\n      case 9:\n        return 30;\n      case 10:\n        return 31;\n      case 11:\n        return 30;\n      case 12:\n        return 31;\n      default:\n        throw new IllegalArgumentException(\"Illegal month number: \" + monthNum);\n    }\n  }\n\n  private void readObject(java.io.ObjectInputStream stream)\n      throws java.io.IOException, ClassNotFoundException {\n\n    stream.defaultReadObject();\n    try {\n      buildExpression(cronExpression);\n    } catch (Exception ignore) {\n    } // never happens\n  }\n\n  @Override\n  @Deprecated\n  public Object clone() {\n    return new CronExpression(this);\n  }\n}\n\nclass ValueSet {\n  public int value;\n\n  public int pos;\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/CronThreadPoolExecutor.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.schedule.executor;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.concurrent.CancellationException;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.RejectedExecutionException;\nimport java.util.concurrent.RejectedExecutionHandler;\nimport java.util.concurrent.ScheduledThreadPoolExecutor;\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.TimeUnit;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Scheduled thread-pool executor implementation that leverages a CronExpression to calculate future\n * execution times for scheduled tasks.\n */\npublic class CronThreadPoolExecutor extends ScheduledThreadPoolExecutor\n    implements CronExecutorService {\n\n  private static final Logger LOG = LoggerFactory.getLogger(CronThreadPoolExecutor.class);\n\n  private final List<CountDownLatch> cronJobWatchDogs;\n\n  /**\n   * Constructs a new CronThreadPoolExecutor.\n   *\n   * @param corePoolSize the pool size\n   */\n  public CronThreadPoolExecutor(int corePoolSize) {\n    super(corePoolSize);\n    this.cronJobWatchDogs = new ArrayList<>();\n    this.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);\n  }\n\n  /**\n   * Constructs a new CronThreadPoolExecutor.\n   *\n   * @param corePoolSize the pool size\n   * @param threadFactory the thread factory\n   */\n  public CronThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) {\n    super(corePoolSize, threadFactory);\n    this.cronJobWatchDogs = new ArrayList<>();\n    this.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);\n  }\n\n  /**\n   * Constructs a new CronThreadPoolExecutor.\n   *\n   * @param corePoolSize the pool size\n   * @param handler the handler for rejected executions\n   */\n  public CronThreadPoolExecutor(int corePoolSize, RejectedExecutionHandler handler) {\n    super(corePoolSize, handler);\n    this.cronJobWatchDogs = new ArrayList<>();\n    this.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);\n  }\n\n  /**\n   * Constructs a new CronThreadPoolExecutor.\n   *\n   * @param corePoolSize the pool size\n   * @param handler the handler for rejecting executions\n   * @param threadFactory the thread factory\n   */\n  public CronThreadPoolExecutor(\n      int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler) {\n    super(corePoolSize, threadFactory, handler);\n    this.cronJobWatchDogs = new ArrayList<>();\n  }\n\n  @Override\n  public Future<?> schedule(final Runnable task, final CronExpression expression) {\n    if (task == null) {\n      throw new NullPointerException();\n    }\n    setCorePoolSize(getCorePoolSize() + 1);\n    Runnable scheduleTask =\n        new Runnable() {\n          @Override\n          public void run() {\n            CountDownLatch countDownLatch = new CountDownLatch(1);\n            cronJobWatchDogs.add(countDownLatch);\n            Date now = new Date();\n            Date time = expression.getNextValidTimeAfter(now);\n            try {\n              while (time != null) {\n                CronThreadPoolExecutor.this.schedule(\n                    task, time.getTime() - now.getTime(), TimeUnit.MILLISECONDS);\n                while (now.before(time)) {\n                  LOG.debug(\"Cron watch dog wait {} \", time.getTime() - now.getTime());\n                  if (countDownLatch.await(time.getTime() - now.getTime(), TimeUnit.MILLISECONDS)) {\n                    LOG.debug(\"Stopping cron watch dog.\");\n                    return;\n                  }\n                  now = new Date();\n                }\n                time = expression.getNextValidTimeAfter(now);\n              }\n            } catch (InterruptedException e) {\n              Thread.currentThread().interrupt();\n            } catch (RejectedExecutionException | CancellationException e) {\n              LOG.error(e.getMessage(), e);\n            }\n          }\n        };\n    return this.submit(scheduleTask);\n  }\n\n  @Override\n  public void shutdown() {\n\n    for (CountDownLatch cronJobWatchDog : cronJobWatchDogs) {\n      cronJobWatchDog.countDown();\n    }\n    cronJobWatchDogs.clear();\n    super.shutdown();\n    LOG.debug(\n        \"Active {} Pool {}, CEPTAS {} ,  EEDTAS {} , Task count {} , queue size {}\",\n        getActiveCount(),\n        getPoolSize(),\n        getContinueExistingPeriodicTasksAfterShutdownPolicy(),\n        getExecuteExistingDelayedTasksAfterShutdownPolicy(),\n        getTaskCount(),\n        getQueue().size());\n  }\n\n  @Override\n  public List<Runnable> shutdownNow() {\n    for (CountDownLatch cronJobWatchDog : cronJobWatchDogs) {\n      cronJobWatchDog.countDown();\n    }\n    cronJobWatchDogs.clear();\n    LOG.debug(\n        \"Active {} Pool {}, CEPTAS {} ,  EEDTAS {} , Task count {} , queue size {}\",\n        getActiveCount(),\n        getPoolSize(),\n        getContinueExistingPeriodicTasksAfterShutdownPolicy(),\n        getExecuteExistingDelayedTasksAfterShutdownPolicy(),\n        getTaskCount(),\n        getQueue().size());\n    return super.shutdownNow();\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/LoggedRunnable.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.schedule.executor;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.concurrent.TimeUnit;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Invoke given method of given object.\n *\n * @author Sergii Kabashniuk\n */\npublic class LoggedRunnable implements Runnable {\n  private static final Logger LOG = LoggerFactory.getLogger(LoggedRunnable.class);\n\n  private final Object object;\n  private final Method method;\n\n  public LoggedRunnable(Object object, Method method) {\n    this.object = object;\n    this.method = method;\n  }\n\n  @Override\n  public void run() {\n    long startTime = System.currentTimeMillis();\n    try {\n      if (object instanceof Runnable\n          && method.getName().equals(\"run\")\n          && method.getParameterTypes().length == 0) {\n        LOG.debug(\n            \"Invoking method 'run' of class '{}' instance '{}'\",\n            object.getClass().getName(),\n            object);\n\n        ((Runnable) object).run();\n\n        LOG.debug(\n            \"Method of class '{}' instance '{}' is completed in {} sec\",\n            object.getClass().getName(),\n            object,\n            TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - startTime));\n      } else {\n        try {\n          LOG.debug(\n              \"Invoking method '{}' of class '{}' instance '{}'\",\n              method.getName(),\n              object.getClass().getName(),\n              object);\n\n          method.invoke(object);\n\n          LOG.debug(\n              \"Method of class '{}' instance '{}' is completed in {} sec\",\n              object.getClass().getName(),\n              object,\n              TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - startTime));\n        } catch (InvocationTargetException | IllegalAccessException e) {\n          LOG.error(\n              \"Error occurred during invocation of method '{}#{}'. Instance: '{}'. Error: {}\",\n              object.getClass().getName(),\n              method.getName(),\n              object,\n              e.getMessage(),\n              e);\n        }\n      }\n    } catch (Exception e) {\n      LOG.error(\n          \"Error occurred during invocation of method '{}#{}'. Instance: '{}'. Error: {}\",\n          object.getClass().getName(),\n          method.getName(),\n          object,\n          e.getMessage(),\n          e);\n      throw e;\n    }\n  }\n\n  @Override\n  public String toString() {\n    return \"LoggedRunnable{\"\n        + \"methodToInvoke=\"\n        + object.getClass().getName()\n        + '#'\n        + method.getName()\n        + '}';\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/ScheduleModule.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.schedule.executor;\n\nimport com.google.inject.Binder;\nimport com.google.inject.Module;\nimport org.eclipse.che.commons.schedule.Launcher;\nimport org.eclipse.che.inject.lifecycle.InternalScheduleModule;\n\n/**\n * Guice deployment module.\n *\n * @author Sergii Kabashniuk\n */\npublic class ScheduleModule implements Module {\n  @Override\n  public void configure(Binder binder) {\n    binder.bind(Launcher.class).to(ThreadPullLauncher.class).asEagerSingleton();\n    binder.install(new InternalScheduleModule());\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/ThreadPullLauncher.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.schedule.executor;\n\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport jakarta.annotation.PreDestroy;\nimport java.text.ParseException;\nimport java.util.concurrent.TimeUnit;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.eclipse.che.commons.schedule.Launcher;\nimport org.eclipse.che.inject.ConfigurationException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Execute method marked with @ScheduleCron @ScheduleDelay and @ScheduleRate annotations using\n * CronThreadPoolExecutor.\n *\n * @author Sergii Kabashniuk\n */\n@Singleton\npublic class ThreadPullLauncher implements Launcher {\n  private static final Logger LOG = LoggerFactory.getLogger(CronThreadPoolExecutor.class);\n  private final CronExecutorService service;\n\n  /**\n   * @param corePoolSize the number of threads to keep in the pool, even if they are idle, unless\n   *     {@code allowCoreThreadTimeOut} is set\n   */\n  @Inject\n  public ThreadPullLauncher(@Named(\"schedule.core_pool_size\") Integer corePoolSize) {\n    this(\n        new CronThreadPoolExecutor(\n            corePoolSize,\n            new ThreadFactoryBuilder()\n                .setNameFormat(\"Annotated-scheduler-%d\")\n                .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n                .setDaemon(false)\n                .build()));\n  }\n\n  protected ThreadPullLauncher(CronExecutorService service) {\n    this.service = service;\n  }\n\n  @PreDestroy\n  public void shutdown() throws InterruptedException {\n    // Tell threads to finish off.\n    service.shutdown(); // Disable new tasks from being submitted\n    try {\n      // Wait a while for existing tasks to terminate\n      if (!service.awaitTermination(60, TimeUnit.SECONDS)) {\n        service.shutdownNow(); // Cancel currently executing tasks\n        // Wait a while for tasks to respond to being cancelled\n        if (!service.awaitTermination(60, TimeUnit.SECONDS)) LOG.warn(\"Pool did not terminate\");\n      }\n    } catch (InterruptedException ie) {\n      // (Re-)Cancel if current thread also interrupted\n      service.shutdownNow();\n      // Preserve interrupt status\n      Thread.currentThread().interrupt();\n    }\n  }\n\n  @Override\n  public void scheduleCron(Runnable runnable, String cron) {\n    if (cron == null || cron.isEmpty()) {\n      throw new ConfigurationException(\"Cron parameter can't be null\");\n    }\n    try {\n      CronExpression expression = new CronExpression(cron);\n      service.schedule(runnable, expression);\n      LOG.debug(\"Schedule method {} with cron  {} schedule\", runnable, cron);\n    } catch (ParseException e) {\n      LOG.error(e.getLocalizedMessage(), e);\n      throw new ConfigurationException(e.getLocalizedMessage());\n    }\n  }\n\n  @Override\n  public void scheduleWithFixedDelay(\n      Runnable runnable, long initialDelay, long delay, TimeUnit unit) {\n    if (delay <= 0) {\n      LOG.debug(\n          \"Method {} has not been scheduled (delay <= 0). Initial delay {} delay {} unit {}\",\n          runnable,\n          initialDelay,\n          delay,\n          unit);\n      return;\n    }\n\n    service.scheduleWithFixedDelay(runnable, initialDelay, delay, unit);\n    LOG.debug(\n        \"Schedule method {} with fixed initial delay {} delay {} unit {}\",\n        runnable,\n        initialDelay,\n        delay,\n        unit);\n  }\n\n  @Override\n  public void scheduleAtFixedRate(\n      Runnable runnable, long initialDelay, long period, TimeUnit unit) {\n    if (period <= 0) {\n      LOG.debug(\n          \"Method {} with fixed rate has not been scheduled (period <= 0). Initial delay {} period {} unit {}\",\n          runnable,\n          initialDelay,\n          period,\n          unit);\n      return;\n    }\n\n    service.scheduleAtFixedRate(runnable, initialDelay, period, unit);\n    LOG.debug(\n        \"Schedule method {} with fixed rate. Initial delay {} period {} unit {}\",\n        runnable,\n        initialDelay,\n        period,\n        unit);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/inject/lifecycle/InternalScheduleModule.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject.lifecycle;\n\nimport com.google.inject.Injector;\nimport com.google.inject.Provider;\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.matcher.Matchers;\nimport com.google.inject.spi.TypeEncounter;\nimport com.google.inject.spi.TypeListener;\nimport org.eclipse.che.commons.schedule.Launcher;\n\n/**\n * Launch method marked with @ScheduleCron @ScheduleDelay and @ScheduleRate annotations using\n * Launcher\n *\n * <p>Note do not inject this module. Use {@link\n * org.eclipse.che.commons.schedule.executor.ScheduleModule}\n *\n * @author Sergii Kabashniuk\n */\npublic class InternalScheduleModule extends LifecycleModule {\n\n  @Override\n  protected void configure() {\n    bindListener(\n        Matchers.any(),\n        new ScheduleTypeListener(getProvider(Launcher.class), getProvider(Injector.class)));\n  }\n\n  private static class ScheduleTypeListener implements TypeListener {\n    private final Provider<Launcher> launcher;\n    private final Provider<Injector> injector;\n\n    private ScheduleTypeListener(Provider<Launcher> launcher, Provider<Injector> injector) {\n      this.launcher = launcher;\n      this.injector = injector;\n    }\n\n    @Override\n    public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {\n      encounter.register(new ScheduleInjectionListener<I>(launcher, injector));\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/inject/lifecycle/ScheduleInjectionListener.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.inject.lifecycle;\n\nimport com.google.inject.ConfigurationException;\nimport com.google.inject.Injector;\nimport com.google.inject.Key;\nimport com.google.inject.Provider;\nimport com.google.inject.ProvisionException;\nimport com.google.inject.matcher.Matcher;\nimport com.google.inject.matcher.Matchers;\nimport com.google.inject.name.Names;\nimport com.google.inject.spi.InjectionListener;\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.AnnotatedElement;\nimport java.lang.reflect.Method;\nimport org.eclipse.che.commons.schedule.Launcher;\nimport org.eclipse.che.commons.schedule.ScheduleCron;\nimport org.eclipse.che.commons.schedule.ScheduleDelay;\nimport org.eclipse.che.commons.schedule.ScheduleRate;\nimport org.eclipse.che.commons.schedule.executor.LoggedRunnable;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Listen guice injections and launch method marked with schedule annotations.\n *\n * @author Sergii Kabashniuk\n */\npublic class ScheduleInjectionListener<T> extends LifecycleModule implements InjectionListener<T> {\n  private static final Logger LOG = LoggerFactory.getLogger(ScheduleInjectionListener.class);\n\n  private final Matcher<AnnotatedElement> javaxSingleton =\n      Matchers.annotatedWith(javax.inject.Singleton.class);\n  private final Matcher<AnnotatedElement> googleSingleton =\n      Matchers.annotatedWith(com.google.inject.Singleton.class);\n\n  private final Provider<Launcher> launcherProvider;\n  private final Provider<Injector> injectorProvider;\n\n  public ScheduleInjectionListener(\n      Provider<Launcher> launcherProvider, Provider<Injector> injectorProvider) {\n    this.launcherProvider = launcherProvider;\n    this.injectorProvider = injectorProvider;\n  }\n\n  private <T> T getValue(Class<T> configurationType, String configurationKey) {\n    try {\n      return injectorProvider\n          .get()\n          .getInstance(Key.get(configurationType, Names.named(configurationKey)));\n    } catch (ConfigurationException | ProvisionException e) {\n      return null;\n    }\n  }\n\n  private long getValue(String configurationKey) {\n    String stringValue = getValue(String.class, configurationKey);\n    if (stringValue != null) {\n      long result = Long.parseLong(stringValue);\n      if (result == 0) {\n        throw new RuntimeException(\"Invalid value 0 for parameter \" + configurationKey);\n      }\n      return result;\n    }\n    Long longValue = getValue(Long.class, configurationKey);\n    if (longValue != null) {\n      long result = longValue.longValue();\n      if (result == 0) {\n        throw new RuntimeException(\"Invalid value 0 for parameter \" + configurationKey);\n      }\n      return result;\n    }\n    Integer intValue = getValue(Integer.class, configurationKey);\n    if (intValue != null) {\n      long result = intValue.longValue();\n      if (result == 0) {\n        throw new RuntimeException(\"Invalid value 0 for parameter \" + configurationKey);\n      }\n      return result;\n    }\n    throw new RuntimeException(\"Parameter \" + configurationKey + \" is not configured\");\n  }\n\n  private void launch(Object object, Method method, ScheduleCron annotation) {\n    Launcher launcher = launcherProvider.get();\n    launcher.scheduleCron(\n        new LoggedRunnable(object, method),\n        annotation.cronParameterName().isEmpty()\n            ? annotation.cron()\n            : getValue(String.class, annotation.cronParameterName()));\n  }\n\n  private void launch(Object object, Method method, ScheduleDelay annotation) {\n    if (annotation.delayParameterName().isEmpty() && annotation.delay() == 0) {\n      throw new RuntimeException(\"Delay parameter is not configured\");\n    }\n\n    Launcher launcher = launcherProvider.get();\n\n    launcher.scheduleWithFixedDelay(\n        new LoggedRunnable(object, method),\n        annotation.initialDelayParameterName().isEmpty()\n            ? annotation.initialDelay()\n            : getValue(annotation.initialDelayParameterName()),\n        annotation.delayParameterName().isEmpty()\n            ? annotation.delay()\n            : getValue(annotation.delayParameterName()),\n        annotation.unit());\n  }\n\n  private void launch(Object object, Method method, ScheduleRate annotation) {\n    if (annotation.periodParameterName().isEmpty() && annotation.period() == 0) {\n      throw new RuntimeException(\"Period parameter is not configured\");\n    }\n\n    Launcher launcher = launcherProvider.get();\n    launcher.scheduleAtFixedRate(\n        new LoggedRunnable(object, method),\n        annotation.initialDelayParameterName().isEmpty()\n            ? annotation.initialDelay()\n            : getValue(annotation.initialDelayParameterName()),\n        annotation.periodParameterName().isEmpty()\n            ? annotation.period()\n            : getValue(annotation.periodParameterName()),\n        annotation.unit());\n  }\n\n  private void launch(Object object, Class<? extends Annotation> annotationType) {\n\n    boolean isSingleton =\n        javaxSingleton.matches(object.getClass()) || googleSingleton.matches(object.getClass());\n    for (Method method : get(object.getClass(), annotationType)) {\n      if (!isSingleton) {\n        throw new RuntimeException(\n            \"Scheduled class \" + object.getClass() + \" should be marked as singleton\");\n      }\n      if (annotationType.equals(ScheduleRate.class)) {\n        launch(object, method, method.getAnnotation(ScheduleRate.class));\n      } else if (annotationType.equals(ScheduleDelay.class)) {\n        launch(object, method, method.getAnnotation(ScheduleDelay.class));\n      } else if (annotationType.equals(ScheduleCron.class)) {\n        launch(object, method, method.getAnnotation(ScheduleCron.class));\n      }\n    }\n  }\n\n  @Override\n  public void afterInjection(T injectee) {\n    launch(injectee, ScheduleCron.class);\n    launch(injectee, ScheduleRate.class);\n    launch(injectee, ScheduleDelay.class);\n  }\n\n  @Override\n  protected void configure() {}\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/test/java/org/eclipse/che/commons/schedule/executor/CronExpressionTest.java",
    "content": "/*\n * Copyright 2001-2009 Terracotta, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy\n * of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\npackage org.eclipse.che.commons.schedule.executor;\n\nimport static org.testng.Assert.*;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.text.ParseException;\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.TimeZone;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.testng.annotations.Test;\n\npublic class CronExpressionTest {\n  private static final Logger LOG = LoggerFactory.getLogger(CronExpressionTest.class);\n\n  private static final String[] VERSIONS = new String[] {\"1.5.2\"};\n\n  private static final TimeZone EST_TIME_ZONE = TimeZone.getTimeZone(\"US/Eastern\");\n\n  /**\n   * Get the object to serialize when generating serialized file for future tests, and against which\n   * to validate deserialized object.\n   */\n  protected Object getTargetObject() throws ParseException {\n    CronExpression cronExpression = new CronExpression(\"0 15 10 * * ? 2005\");\n    cronExpression.setTimeZone(EST_TIME_ZONE);\n\n    return cronExpression;\n  }\n\n  /** Get the Quartz versions for which we should verify serialization backwards compatibility. */\n  protected String[] getVersions() {\n    return VERSIONS;\n  }\n\n  /** Verify that the target object and the object we just deserialized match. */\n  protected void verifyMatch(Object target, Object deserialized) {\n    CronExpression targetCronExpression = (CronExpression) target;\n    CronExpression deserializedCronExpression = (CronExpression) deserialized;\n\n    assertNotNull(deserializedCronExpression);\n    assertEquals(\n        targetCronExpression.getCronExpression(), deserializedCronExpression.getCronExpression());\n    assertEquals(targetCronExpression.getTimeZone(), deserializedCronExpression.getTimeZone());\n  }\n\n  /*\n   * Test method for 'org.quartz.CronExpression.isSatisfiedBy(Date)'.\n   */\n  @Test\n  public void testIsSatisfiedBy() throws Exception {\n    CronExpression cronExpression = new CronExpression(\"0 15 10 * * ? 2005\");\n\n    Calendar cal = Calendar.getInstance();\n\n    cal.set(2005, Calendar.JUNE, 1, 10, 15, 0);\n    assertTrue(cronExpression.isSatisfiedBy(cal.getTime()));\n\n    cal.set(Calendar.YEAR, 2006);\n    assertFalse(cronExpression.isSatisfiedBy(cal.getTime()));\n\n    cal = Calendar.getInstance();\n    cal.set(2005, Calendar.JUNE, 1, 10, 16, 0);\n    assertFalse(cronExpression.isSatisfiedBy(cal.getTime()));\n\n    cal = Calendar.getInstance();\n    cal.set(2005, Calendar.JUNE, 1, 10, 14, 0);\n    assertFalse(cronExpression.isSatisfiedBy(cal.getTime()));\n  }\n\n  @Test\n  public void testLastDayOffset() throws Exception {\n    CronExpression cronExpression = new CronExpression(\"0 15 10 L-2 * ? 2010\");\n\n    Calendar cal = Calendar.getInstance();\n\n    cal.set(2010, Calendar.OCTOBER, 29, 10, 15, 0); // last day - 2\n    assertTrue(cronExpression.isSatisfiedBy(cal.getTime()));\n\n    cal.set(2010, Calendar.OCTOBER, 28, 10, 15, 0);\n    assertFalse(cronExpression.isSatisfiedBy(cal.getTime()));\n\n    cronExpression = new CronExpression(\"0 15 10 L-5W * ? 2010\");\n\n    cal.set(2010, Calendar.OCTOBER, 26, 10, 15, 0); // last day - 5\n    assertTrue(cronExpression.isSatisfiedBy(cal.getTime()));\n\n    cronExpression = new CronExpression(\"0 15 10 L-1 * ? 2010\");\n\n    cal.set(2010, Calendar.OCTOBER, 30, 10, 15, 0); // last day - 1\n    assertTrue(cronExpression.isSatisfiedBy(cal.getTime()));\n\n    cronExpression = new CronExpression(\"0 15 10 L-1W * ? 2010\");\n\n    cal.set(\n        2010,\n        Calendar.OCTOBER,\n        29,\n        10,\n        15,\n        0); // nearest weekday to last day - 1 (29th is a friday in 2010)\n    assertTrue(cronExpression.isSatisfiedBy(cal.getTime()));\n  }\n\n  /*\n   * QUARTZ-571: Showing that expressions with months correctly serialize.\n   */\n  @Test\n  public void testQuartz571() throws Exception {\n    CronExpression cronExpression = new CronExpression(\"19 15 10 4 Apr ? \");\n\n    ByteArrayOutputStream baos = new ByteArrayOutputStream();\n    ObjectOutputStream oos = new ObjectOutputStream(baos);\n    oos.writeObject(cronExpression);\n    oos.flush();\n    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());\n    ObjectInputStream ois = new ObjectInputStream(bais);\n    CronExpression newExpression = (CronExpression) ois.readObject();\n\n    assertEquals(newExpression.getCronExpression(), cronExpression.getCronExpression());\n\n    // if broken, this will throw an exception\n    newExpression.getNextValidTimeAfter(new Date());\n  }\n\n  /** QTZ-259 : last day offset causes repeating fire time */\n  @Test\n  public void testQtz259() throws Exception {\n    CronExpression cronExpression = new CronExpression(\"0 0 0 L-2 * ? *\");\n\n    int i = 0;\n    Date pdate = cronExpression.getNextValidTimeAfter(new Date());\n    while (++i < 26) {\n      Date date = cronExpression.getNextValidTimeAfter(pdate);\n      LOG.debug(\"fireTime: \" + date + \", previousFireTime: \" + pdate);\n      assertFalse(pdate.equals(date), \"Next fire time is the same as previous fire time!\");\n      pdate = date;\n    }\n  }\n\n  /** QTZ-259 : last day offset causes repeating fire time */\n  @Test\n  public void testQtz259LW() throws Exception {\n    CronExpression cronExpression = new CronExpression(\"0 0 0 LW * ? *\");\n\n    int i = 0;\n    Date pdate = cronExpression.getNextValidTimeAfter(new Date());\n    while (++i < 26) {\n      Date date = cronExpression.getNextValidTimeAfter(pdate);\n      LOG.debug(\"fireTime: \" + date + \", previousFireTime: \" + pdate);\n      assertFalse(pdate.equals(date), \"Next fire time is the same as previous fire time!\");\n      pdate = date;\n    }\n  }\n\n  /*\n   * QUARTZ-574: Showing that storeExpressionVals correctly calculates the month number\n   */\n  @Test\n  public void testQuartz574() {\n    try {\n      new CronExpression(\"* * * * Foo ? \");\n      fail(\"Expected ParseException did not fire for non-existent month\");\n    } catch (ParseException pe) {\n      assertTrue(\n          pe.getMessage().startsWith(\"Invalid Month value:\"), \"Incorrect ParseException thrown\");\n    }\n\n    try {\n      new CronExpression(\"* * * * Jan-Foo ? \");\n      fail(\"Expected ParseException did not fire for non-existent month\");\n    } catch (ParseException pe) {\n      assertTrue(\n          pe.getMessage().startsWith(\"Invalid Month value:\"), \"Incorrect ParseException thrown\");\n    }\n  }\n\n  @Test\n  public void testQuartz621() {\n    try {\n      new CronExpression(\"0 0 * * * *\");\n      fail(\"Expected ParseException did not fire for wildcard day-of-month and day-of-week\");\n    } catch (ParseException pe) {\n      assertTrue(\n          pe.getMessage()\n              .startsWith(\n                  \"Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.\"),\n          \"Incorrect ParseException thrown\");\n    }\n    try {\n      new CronExpression(\"0 0 * 4 * *\");\n      fail(\n          \"Expected ParseException did not fire for specified day-of-month and wildcard day-of-week\");\n    } catch (ParseException pe) {\n      assertTrue(\n          pe.getMessage()\n              .startsWith(\n                  \"Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.\"),\n          \"Incorrect ParseException thrown\");\n    }\n    try {\n      new CronExpression(\"0 0 * * * 4\");\n      fail(\n          \"Expected ParseException did not fire for wildcard day-of-month and specified day-of-week\");\n    } catch (ParseException pe) {\n      assertTrue(\n          pe.getMessage()\n              .startsWith(\n                  \"Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.\"),\n          \"Incorrect ParseException thrown\");\n    }\n  }\n\n  @Test\n  public void testQuartz640() throws ParseException {\n    try {\n      new CronExpression(\"0 43 9 1,5,29,L * ?\");\n      fail(\"Expected ParseException did not fire for L combined with other days of the month\");\n    } catch (ParseException pe) {\n      assertTrue(\n          pe.getMessage()\n              .startsWith(\n                  \"Support for specifying 'L' and 'LW' with other days of the month is not implemented\"),\n          \"Incorrect ParseException thrown\");\n    }\n    try {\n      new CronExpression(\"0 43 9 ? * SAT,SUN,L\");\n      fail(\"Expected ParseException did not fire for L combined with other days of the week\");\n    } catch (ParseException pe) {\n      assertTrue(\n          pe.getMessage()\n              .startsWith(\n                  \"Support for specifying 'L' with other days of the week is not implemented\"),\n          \"Incorrect ParseException thrown\");\n    }\n    try {\n      new CronExpression(\"0 43 9 ? * 6,7,L\");\n      fail(\"Expected ParseException did not fire for L combined with other days of the week\");\n    } catch (ParseException pe) {\n      assertTrue(\n          pe.getMessage()\n              .startsWith(\n                  \"Support for specifying 'L' with other days of the week is not implemented\"),\n          \"Incorrect ParseException thrown\");\n    }\n    try {\n      new CronExpression(\"0 43 9 ? * 5L\");\n    } catch (ParseException pe) {\n      fail(\"Unexpected ParseException thrown for supported '5L' expression.\");\n    }\n  }\n\n  @Test\n  public void testQtz96() throws ParseException {\n    try {\n      new CronExpression(\"0/5 * * 32W 1 ?\");\n      fail(\"Expected ParseException did not fire for W with value larger than 31\");\n    } catch (ParseException pe) {\n      assertTrue(\n          pe.getMessage().startsWith(\"The 'W' option does not make sense with values larger than\"),\n          \"Incorrect ParseException thrown\");\n    }\n  }\n\n  @Test\n  public void testQtz395_CopyConstructorMustPreserveTimeZone() throws ParseException {\n    TimeZone nonDefault = TimeZone.getTimeZone(\"Europe/Brussels\");\n    if (nonDefault.equals(TimeZone.getDefault())) {\n      nonDefault = EST_TIME_ZONE;\n    }\n    CronExpression cronExpression = new CronExpression(\"0 15 10 * * ? 2005\");\n    cronExpression.setTimeZone(nonDefault);\n\n    CronExpression copyCronExpression = new CronExpression(cronExpression);\n    assertEquals(nonDefault, copyCronExpression.getTimeZone());\n  }\n\n  //    // execute with version number to generate a new version's serialized form\n  //    public static void main(String[] args) throws Exception {\n  //        new CronExpressionTest().writeJobDataFile(\"1.5.2\");\n  //    }\n\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/test/resources/findbugs-exclude.xml",
    "content": "<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<FindBugsFilter>\n    <Match>\n        <Class name=\"org.eclipse.che.commons.schedule.executor.CronExpression\"/>\n    </Match>\n    <Match>\n        <Class name=\"org.eclipse.che.commons.schedule.executor.LoggedRunnable\"/>\n        <Method name=\"run\" />\n        <Bug pattern=\"REC_CATCH_EXCEPTION\" />\n    </Match>\n</FindBugsFilter>"
  },
  {
    "path": "core/commons/che-core-commons-schedule/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "core/commons/che-core-commons-test/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-commons-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-commons-test</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: Commons :: Utilities for tests</name>\n    <properties>\n        <findbugs.failonerror>true</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-persist</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>jakarta.persistence</artifactId>\n            <scope>provided</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/AssertRetry.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test;\n\nimport java.util.function.Supplier;\nimport org.testng.Assert;\n\npublic class AssertRetry {\n  /**\n   * Assert that is making several attempts with pauses to match expected value with the value\n   * provided by Supplier.\n   */\n  public static <V> void assertWithRetry(\n      Supplier<V> predicate, V expected, int times, int pause_millis) throws InterruptedException {\n    for (int i = 0; i <= times; i++) {\n      V actual = predicate.get();\n      if (expected.equals(actual)) {\n        return;\n      } else if (i + 1 <= times) {\n        Thread.sleep(pause_millis);\n      }\n    }\n    Assert.fail(\"Unable to obtain the expected value \" + expected + \" after \" + times + \" retries\");\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/SystemPropertiesHelper.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * Example of usage in tests:\n *\n * <pre>{@code\n * SystemPropertiesHelper systemPropertiesHelper;\n *\n * public void setUp() {\n *     systemPropertiesHelper = SystemPropertiesHelper.overrideSystemProperties()\n *         .property(\"name1\", \"value1\")\n *         .property(\"name2\", \"value2\");\n * }\n *\n * public void tearDown() {\n *     systemPropertiesHelper.restoreFromBackup();\n * }\n * }</pre>\n */\npublic class SystemPropertiesHelper {\n\n  private Map<String, String> backup;\n\n  private SystemPropertiesHelper() {\n    backup = new HashMap<>();\n  }\n\n  public static SystemPropertiesHelper overrideSystemProperties() {\n    return new SystemPropertiesHelper();\n  }\n\n  public SystemPropertiesHelper property(String name, String value) {\n    backupCurrentValue(name);\n    System.setProperty(name, value);\n    return this;\n  }\n\n  public SystemPropertiesHelper restoreFromBackup() {\n    for (Map.Entry<String, String> entry : backup.entrySet()) {\n      if (entry.getValue() == null) {\n        System.clearProperty(entry.getKey());\n      } else {\n        System.setProperty(entry.getKey(), entry.getValue());\n      }\n    }\n    backup.clear();\n    return this;\n  }\n\n  private void backupCurrentValue(String name) {\n    String value = System.getProperty(name);\n    backup.put(name, value);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/mockito/answer/SelfReturningAnswer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.mockito.answer;\n\nimport org.mockito.Mockito;\nimport org.mockito.invocation.InvocationOnMock;\nimport org.mockito.stubbing.Answer;\n\n/**\n * Allows create mocks for builder-like classes easily\n *\n * <p>If builder-like classes needs to be mocked then:\n *\n * <ul>\n *   <li>methods of that class returns the same object\n *   <li>not all methods can be called\n *   <li>methods can be called in different order\n * </ul>\n *\n * In that case it is hard to mock that class. With the help of this class it can be achieved as:\n *\n * <pre class=\"code\"><code class=\"java\">\n *     HttpJsonRequest httpJsonRequest = mock(HttpJsonRequest.class, new SelfReturningAnswer());\n * </code></pre>\n *\n * In that case all methods of httpJsonRequest that returns HttpJsonRequest will return\n * httpJsonRequest;\n *\n * @author Alexander Garagatyi\n */\npublic class SelfReturningAnswer implements Answer<Object> {\n  public Object answer(InvocationOnMock invocation) throws Throwable {\n    Object mock = invocation.getMock();\n    if (invocation.getMethod().getReturnType().isInstance(mock)) {\n      return mock;\n    } else {\n      return Mockito.RETURNS_DEFAULTS.answer(invocation);\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/mockito/answer/WaitingAnswer.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.mockito.answer;\n\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.TimeUnit;\nimport org.mockito.invocation.InvocationOnMock;\nimport org.mockito.stubbing.Answer;\n\n/**\n * Answer class that helps to lock execution of test in separate threads for testing purposes.\n *\n * <p>It can hold waiting thread until this answer is called.<br>\n * It can hold waiting thread that uses mock until answering to mock call is allowed.\n *\n * <p>Here is an example of complex test that ensures that (for example) locked area is not called\n * when other thread try to access it.\n *\n * <pre class=\"code\"><code class=\"java\">\n *     // given\n *     WaitingAnswer<Void> waitingAnswer = new WaitingAnswer<>();\n *     doAnswer(waitingAnswer).when(someClassUsedInTestedClass).someMethod(eq(param1), eq(param2));\n *\n *     // start doing something in a separate thread\n *     executor.execute(() -> testedClass.doSomething());\n *     // wait until separate thread call answer to find the moment when critical area is occupied\n *     // to make test fast wait not more that provided timeout\n *     waitingAnswer.waitAnswerCall(1, TimeUnit.SECONDS);\n *\n *     // when\n *     try {\n *         // start doing something in current thread\n *         testedClass.doSomething()\n *         // this area should not be reachable until answer is completed!\n *         fail(\"Error message\");\n *     } finally {\n *         // In this case exception can be suppressed\n *         // Test is simplified to provide clean example\n *\n *         // then\n *         // complete waiting answer\n *         waitingAnswer.completeAnswer();\n *         // ensure that someMethod is called only once to confirm that testedClass.doSomething()\n *         // doesn't call it this particular test\n *         verify(someClassUsedInTestedClass, timeout(100).times(1)).someMethod(any(), any());\n *     }\n * </code></pre>\n *\n * @author Alexander Garagatyi\n */\npublic class WaitingAnswer<T> implements Answer<T> {\n\n  private final CountDownLatch answerIsCalledLatch;\n  private final CountDownLatch answerResultIsUnlockedLatch;\n\n  private long maxWaitingTime;\n  private TimeUnit maxWaitingUnit;\n  private T result;\n\n  private volatile String error;\n\n  public WaitingAnswer() {\n    this.maxWaitingTime = 1;\n    this.maxWaitingUnit = TimeUnit.SECONDS;\n    this.result = null;\n    this.answerIsCalledLatch = new CountDownLatch(1);\n    this.answerResultIsUnlockedLatch = new CountDownLatch(1);\n    this.error = null;\n  }\n\n  public WaitingAnswer(long maxWaitingTime, TimeUnit maxWaitingUnit) {\n    this();\n    this.maxWaitingTime = maxWaitingTime;\n    this.maxWaitingUnit = maxWaitingUnit;\n  }\n\n  public WaitingAnswer(T result) {\n    this();\n    this.result = result;\n  }\n\n  public WaitingAnswer(T result, long maxWaitingTime, TimeUnit maxWaitingUnit) {\n    this();\n    this.result = result;\n    this.maxWaitingTime = maxWaitingTime;\n    this.maxWaitingUnit = maxWaitingUnit;\n  }\n\n  /**\n   * Waits until answer is called in method {@link #answer(InvocationOnMock)}.\n   *\n   * @param maxWaitingTime max time to wait\n   * @param maxWaitingUnit time unit of the max waiting time argument\n   * @throws Exception if the waiting time elapsed before this answer is called\n   * @see #answer(InvocationOnMock)\n   */\n  public void waitAnswerCall(long maxWaitingTime, TimeUnit maxWaitingUnit) throws Exception {\n    if (!answerIsCalledLatch.await(maxWaitingTime, maxWaitingUnit)) {\n      error = \"Waiting time elapsed but answer is not called\";\n      throw new Exception(error);\n    }\n  }\n\n  /**\n   * Stops process of waiting returning result of answer in method {@link\n   * #answer(InvocationOnMock)}.\n   *\n   * @throws Exception if this answer waiting time elapsed before this method is called\n   * @see #answer(InvocationOnMock)\n   */\n  public void completeAnswer() throws Exception {\n    answerResultIsUnlockedLatch.countDown();\n    if (error != null) {\n      throw new Exception(error);\n    }\n  }\n\n  /**\n   * Stops waiting until answer is called in method {@link #waitAnswerCall(long, TimeUnit)} and then\n   * waits until method {@link #completeAnswer()} is called.\n   *\n   * @param invocationOnMock see {@link Answer#answer(InvocationOnMock)}\n   * @return returns answer result if provided in constructor or null otherwise\n   * @throws Exception if answer call or answer result waiting time is elapsed\n   * @throws Throwable in the same cases as in {@link Answer#answer(InvocationOnMock)}\n   * @see #waitAnswerCall(long, TimeUnit)\n   * @see #completeAnswer()\n   * @see Answer#answer(InvocationOnMock)\n   */\n  @Override\n  public T answer(InvocationOnMock invocationOnMock) throws Throwable {\n    // report start of answer call\n    answerIsCalledLatch.countDown();\n    if (error != null) {\n      throw new Exception(error);\n    }\n    // wait until another thread unlocks returning of answer\n    if (!answerResultIsUnlockedLatch.await(maxWaitingTime, maxWaitingUnit)) {\n      error = \"Waiting time elapsed but completeAnswer is not called\";\n      throw new Exception(error);\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/servlet/MockServletInputStream.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.servlet;\n\nimport jakarta.servlet.ReadListener;\nimport jakarta.servlet.ServletInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\n\n/** Utility class for mocking {@link ServletInputStream} */\npublic class MockServletInputStream extends ServletInputStream {\n  private final InputStream data;\n\n  public MockServletInputStream(InputStream data) {\n    this.data = data;\n  }\n\n  @Override\n  public int read() throws IOException {\n    return this.data.read();\n  }\n\n  @Override\n  public boolean isFinished() {\n    return false;\n  }\n\n  @Override\n  public boolean isReady() {\n    return false;\n  }\n\n  @Override\n  public void setReadListener(ReadListener readListener) {}\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/JpaCleaner.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.tck;\n\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.persistence.EntityManagerFactory;\n\n/**\n * This class is designed to close {@link EntityManagerFactory} on finish of tck test with jpa\n * implementation.\n *\n * <p>Examples of usage:<br>\n * <code>bind(TckResourcesCleaner.class).to(JpaCleaner.class)</code><br>\n * <code>\n * bind(TckResourcesCleaner.class).annotatedWith(Names.named(MyTckTest.class.getName())).to(JpaCleaner.class);\n * </code>\n *\n * @author Sergii Leschenko\n */\npublic class JpaCleaner implements TckResourcesCleaner {\n  @Inject private Provider<EntityManagerFactory> entityManagerFactory;\n\n  @Override\n  public void clean() {\n    entityManagerFactory.get().close();\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckListener.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.tck;\n\nimport static java.lang.String.format;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.ConfigurationException;\nimport com.google.inject.Guice;\nimport com.google.inject.Injector;\nimport com.google.inject.Key;\nimport com.google.inject.Module;\nimport com.google.inject.name.Names;\nimport java.util.Iterator;\nimport java.util.ServiceLoader;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\nimport org.testng.ITestContext;\nimport org.testng.ITestNGMethod;\n\n/**\n * The listener is designed to instantiate {@link TckModule tck modules} using {@link ServiceLoader}\n * mechanism. The components provided by those modules will be injected into a test class whether\n * it's necessary to do so. For each test class will be used new instance of injector. Listener\n * requires tck test to be in own separated suite, if it finds more tests in suite it'll throw\n * {@link IllegalArgumentException} on suite start. After test suite is finished listener'll try to\n * find test specific or common instance of {@link TckResourcesCleaner}. It is optional and can be\n * bound in modules.\n *\n * <p>The listener expects at least one implementation of {@code TckModule} to be configured, if it\n * doesn't find any of the {@code TckModule} implementations then it will report an appropriate\n * exception and TckTest will fail(as it requires components to be injected into it). If it finds\n * more than one {@code TckModule} implementation it will use all of the found.\n *\n * <p>The usage example:\n *\n * <pre>\n * package org.eclipse.mycomponent;\n *\n * &#064;org.testng.annotations.Listeners(TckListener)\n * // Tck test must have own suite because of cleaning resources on suite finishing\n * &#064;org.testng.annotations.Test(suiteName = \"MySuite\")\n * class SubjectTest {\n *\n *     &#064;javax.inject.Inject\n *     private Component1 component1.\n *     &#064;javax.inject.Inject\n *     private Component2 component2;\n *\n *     &#064;org.testng.annotations.Test\n *     public void test() {\n *          // use components\n *     }\n * }\n *\n * class MyTckModule extends TckModule {\n *     public void configure() {\n *         bind(Component1.class).to(...);\n *         bind(Component2.class).toInstance(new Component2(() -> testContext.getAttribute(\"server_url\").toString()));\n *         bind(TckResourcesCleaner.class).to(...);\n *         bind(TckResourcesCleaner.class).annotatedWith(Names.named(SubjectTest.class.getName())).to(...);\n *     }\n * }\n *\n * // Allows to add pre/post test actions like db server start/stop\n * class DBServerListener implements ITestListener {\n *      // ...\n *      public void onStart(ITestContext context) {\n *          String url = dbServer.start();\n *          context.setAttribute(\"server_url\", url)l\n *      }\n *\n *      public void onFinish(ITestContext context) {\n *          dbServer.stop();\n *      }\n *      // ...\n * }\n * </pre>\n *\n * <p>Configuring:\n *\n * <pre>\n * <i>META-INF/services/org.eclipse.che.commons.test.tck.TckModule</i>\n * org.eclipse.mycomponent.MyTckModule\n *\n * <i>META-INF/services/org.testng.ITestNGListener</i>\n * org.eclipse.mycomponent.DBServerListener\n * </pre>\n *\n * @author Yevhenii Voevodin\n * @author Sergii Leschenko\n * @see org.testng.annotations.Listeners\n * @see org.testng.IInvokedMethodListener\n * @see TckResourcesCleaner\n */\npublic class TckListener extends TestListenerAdapter {\n  private Injector injector;\n  private Object instance;\n\n  @Override\n  public void onStart(ITestContext context) {\n    final Set<Object> instances =\n        Stream.of(context.getAllTestMethods())\n            .map(ITestNGMethod::getInstance)\n            .collect(Collectors.toSet());\n\n    if (instances.size() != 1) {\n      throw new IllegalStateException(\"Tck test should be one and only one in suite.\");\n    }\n\n    instance = instances.iterator().next();\n\n    injector = Guice.createInjector(createModule(context, instance.getClass().getName()));\n    injector.injectMembers(instance);\n  }\n\n  @Override\n  public void onFinish(ITestContext context) {\n    if (injector == null || instance == null) {\n      throw new IllegalStateException(\"Looks like onFinish method is invoked before onStart.\");\n    }\n\n    // try to get test specific resources cleaner\n    TckResourcesCleaner resourcesCleaner =\n        getResourcesCleaner(\n            injector,\n            Key.get(TckResourcesCleaner.class, Names.named(instance.getClass().getName())));\n    if (resourcesCleaner == null) {\n      // try to get common resources cleaner\n      resourcesCleaner = getResourcesCleaner(injector, Key.get(TckResourcesCleaner.class));\n    }\n\n    if (resourcesCleaner != null) {\n      resourcesCleaner.clean();\n    }\n  }\n\n  private TckResourcesCleaner getResourcesCleaner(Injector injector, Key<TckResourcesCleaner> key) {\n    try {\n      return injector.getInstance(key);\n    } catch (ConfigurationException ignored) {\n    }\n    return null;\n  }\n\n  private Module createModule(ITestContext testContext, String name) {\n    final Iterator<TckModule> moduleIterator = ServiceLoader.load(TckModule.class).iterator();\n    if (!moduleIterator.hasNext()) {\n      throw new IllegalStateException(\n          format(\n              \"Couldn't find a TckModule configuration. \"\n                  + \"You probably forgot to configure resources/META-INF/services/%s, or even \"\n                  + \"provide an implementation of the TckModule which is required by the jpa test class %s\",\n              TckModule.class.getName(), name));\n    }\n    return new CompoundModule(testContext, moduleIterator);\n  }\n\n  private static class CompoundModule extends AbstractModule {\n    private final ITestContext testContext;\n    private final Iterator<TckModule> moduleIterator;\n\n    private CompoundModule(ITestContext testContext, Iterator<TckModule> moduleIterator) {\n      this.testContext = testContext;\n      this.moduleIterator = moduleIterator;\n    }\n\n    @Override\n    protected void configure() {\n      bind(ITestContext.class).toInstance(testContext);\n      while (moduleIterator.hasNext()) {\n        final TckModule module = moduleIterator.next();\n        module.setTestContext(testContext);\n        install(module);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckModule.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.tck;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.Module;\nimport java.util.ServiceLoader;\nimport org.testng.ITestContext;\n\n/**\n * Abstract class for those Guice {@link Module modules} which provide TCK tests components, which\n * will be injected directly into the test class.\n *\n * <p>The {@link ServiceLoader} mechanism is used for loading such modules and for injecting them\n * later. So each module which is TCK module must provide the implementations list(as described by\n * {@code ServiceLoader} mechanism) in the file named\n * <i>org.eclipse.che.commons.test.tck.TckModule</i> usually under\n * <i>test/resources/META-INF/services</i> directory, then the {@link TckListener} will recognise\n * and load it.\n *\n * @author Yevhenii Voevodin\n * @see TckListener\n */\npublic abstract class TckModule extends AbstractModule {\n\n  /**\n   * It is guaranteed that this field is always present and can be reused by implementation, it will\n   * be set by {@link TckListener} immediately after module implementation is loaded by {@link\n   * ServiceLoader}.\n   */\n  private ITestContext testContext;\n\n  /** Returns the {@link ITestContext context} of currently executing test suite. */\n  protected ITestContext getTestContext() {\n    return testContext;\n  }\n\n  /**\n   * Sets the context of currently executing test suite. This method designed to be used by {@link\n   * TckListener} for setting the context before installing modules.\n   */\n  void setTestContext(ITestContext testContext) {\n    this.testContext = testContext;\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckResourcesCleaner.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.tck;\n\n/**\n * This class is designed to clean up resources after tck test.\n *\n * <p>Implementation should be defined in {@link TckModule}. It can be defined common for all tests\n * or test specific by using @Named annotation. Cleaning of resources is invoked after finish of all\n * tests methods from one test suite that should contains one and only one tck test class.\n *\n * <p>The usage example:\n *\n * <pre>\n * class MyTckModule extends TckModule {\n *     public void configure() {\n *         bind(TckResourcesCleaner.class).to(...);\n *         bind(TckResourcesCleaner.class).annotatedWith(Names.named(SomeTest.class.getName())).to(...);\n *     }\n * }\n * </pre>\n *\n * @author Sergii Leschenko\n * @see TckListener\n */\npublic interface TckResourcesCleaner {\n  /**\n   * Clean up resources.\n   *\n   * <p>Note: it is invoked after finish of all methods from one test suite.\n   */\n  void clean();\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TestListenerAdapter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.tck;\n\nimport org.testng.ITestContext;\nimport org.testng.ITestListener;\nimport org.testng.ITestResult;\n\n/**\n * Skeletal implementation of the {@link ITestListener}. In most cases only 2 methods are needed\n * {@link #onStart(ITestContext)} and {@link #onFinish(ITestContext)}.\n *\n * @author Yevhenii Voevodin\n */\npublic abstract class TestListenerAdapter implements ITestListener {\n\n  @Override\n  public void onTestStart(ITestResult result) {}\n\n  @Override\n  public void onTestSuccess(ITestResult result) {}\n\n  @Override\n  public void onTestFailure(ITestResult result) {}\n\n  @Override\n  public void onTestSkipped(ITestResult result) {}\n\n  @Override\n  public void onTestFailedButWithinSuccessPercentage(ITestResult result) {}\n\n  @Override\n  public void onStart(ITestContext context) {}\n\n  @Override\n  public void onFinish(ITestContext context) {}\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/repository/JpaTckRepository.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.tck.repository;\n\nimport static java.lang.String.format;\n\nimport com.google.inject.Inject;\nimport com.google.inject.persist.UnitOfWork;\nimport java.util.Collection;\nimport javax.inject.Provider;\nimport javax.persistence.Entity;\nimport javax.persistence.EntityManager;\n\n/**\n * Simplifies implementation for Jpa repository in general case.\n *\n * <p>Expected usage:\n *\n * <pre>\n *      class MyTckModule extends TckModule {\n *          &#064;Override configure() {\n *              bind(new TypeLiteral&lt;TckRepository&lt;UserImpl&gt;&gt;() {})\n *                  .toInstance(new JpaTckRepository(Concrete.class));\n *          }\n *      }\n * </pre>\n *\n * @param <T> type of the entity\n * @author Yevhenii Voevodin\n */\npublic class JpaTckRepository<T> implements TckRepository<T> {\n\n  @Inject protected Provider<EntityManager> managerProvider;\n\n  @Inject protected UnitOfWork uow;\n\n  private final Class<? extends T> entityClass;\n\n  public JpaTckRepository(Class<? extends T> entityClass) {\n    this.entityClass = entityClass;\n  }\n\n  @Override\n  public void createAll(Collection<? extends T> entities) throws TckRepositoryException {\n    uow.begin();\n    final EntityManager manager = managerProvider.get();\n    try {\n      manager.getTransaction().begin();\n      for (T entity : entities) {\n        manager.persist(entity);\n        manager.flush();\n      }\n\n      manager.getTransaction().commit();\n    } catch (RuntimeException x) {\n      if (manager.getTransaction().isActive()) {\n        manager.getTransaction().rollback();\n      }\n      throw new TckRepositoryException(x.getLocalizedMessage(), x);\n    } finally {\n      uow.end();\n    }\n  }\n\n  @Override\n  public void removeAll() throws TckRepositoryException {\n    uow.begin();\n    final EntityManager manager = managerProvider.get();\n    try {\n      manager.getTransaction().begin();\n      // The query 'DELETE FROM Entity' won't be correct as it will ignore orphanRemoval\n      // and may also ignore some configuration options, while EntityManager#remove won't\n      manager\n          .createQuery(format(\"SELECT e FROM %s e\", getEntityName(entityClass)), entityClass)\n          .getResultList()\n          .forEach(manager::remove);\n      manager.getTransaction().commit();\n    } catch (RuntimeException x) {\n      if (manager.getTransaction().isActive()) {\n        manager.getTransaction().rollback();\n      }\n      throw new TckRepositoryException(x.getLocalizedMessage(), x);\n    } finally {\n      uow.end();\n    }\n  }\n\n  private String getEntityName(Class<?> clazz) {\n    if (!clazz.isAnnotationPresent(Entity.class)) {\n      return clazz.getSimpleName();\n    }\n    final Entity entity = clazz.getAnnotation(Entity.class);\n    if (entity.name().isEmpty()) {\n      return clazz.getSimpleName();\n    }\n    return entity.name();\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/repository/TckRepository.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.tck.repository;\n\nimport java.util.Collection;\n\n/**\n * The interface which allows to create TCK tests for DAO interfaces by providing operations for\n * creating/removing batch of elements. The interface is designed to work with entities, which means\n * that entity marshaling and unmarshalling to/from db objects must be tested by implementation\n * separately.\n *\n * @param <T> the type of the object managed by the repository\n * @author Yevhenii Voevodin\n */\npublic interface TckRepository<T> {\n\n  /**\n   * Creates all the given {@code entities} in the storage.\n   *\n   * <p>Note that implementation must fail if it is impossible to create any of the given entities.\n   *\n   * @param entities elements to create\n   * @throws TckRepositoryException when any error occurs during the storing\n   */\n  void createAll(Collection<? extends T> entities) throws TckRepositoryException;\n\n  /**\n   * Clears the storage.\n   *\n   * <p>Note that implementation must fail if it is impossible to remove all the entities.\n   *\n   * @throws TckRepositoryException when any error occurs during the clearing\n   */\n  void removeAll() throws TckRepositoryException;\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/repository/TckRepositoryException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.tck.repository;\n\nimport java.util.Collection;\n\n/**\n * Thrown when any error occurs during {@link TckRepository#createAll(Collection)} or {@link\n * TckRepository#removeAll()} invocation. Usually wraps exceptions occurred during the\n * storing/removing.\n *\n * @author Yevhenii Voevodin\n */\npublic class TckRepositoryException extends Exception {\n\n  public TckRepositoryException(String message) {\n    super(message);\n  }\n\n  public TckRepositoryException(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/main/resources/org/eclipse/che/commons/test/db/persistence.xml.template",
    "content": "<!--\n\n    Copyright (c) 2012-2025 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<persistence xmlns=\"http://java.sun.com/xml/ns/persistence\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             xsi:schemaLocation=\"http://java.sun.com/xml/ns/persistence persistence_1_0.xsd\" version=\"1.0\">\n    <persistence-unit name=\"$unit$\" transaction-type=\"RESOURCE_LOCAL\">\n        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>\n        $!\n                Add entity classes as <class>fqn.MyEntity.class</class>\n        !$\n        $if(entity_classes)$\n        $trunc(entity_classes) : {class | <class>$class$</class>\n        }$        <class>$last(entity_classes)$</class>\n        $endif$\n        $!\n                Add properties as <property name=\"propertyName\" value=\"propertyValue\"/>\n        !$\n        $if(properties)$\n        <properties>\n            $trunc(properties) : {prop | <property name=\"$prop$\" value=\"$properties.(prop)$\"/>\n            }$            <property name=\"$last(properties)$\" value=\"$properties.(last(properties))$\"/>\n        </properties>\n        $endif$\n    </persistence-unit>\n</persistence>\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/AssertRetryTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test;\n\nimport static org.testng.Assert.*;\n\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport org.testng.annotations.Test;\n\npublic class AssertRetryTest {\n\n  @Test\n  public void testAssertWithRetry() throws InterruptedException {\n    // Given\n    AtomicBoolean atomicBoolean = new AtomicBoolean(false);\n    // When\n    new Thread(\n            () -> {\n              try {\n                Thread.sleep(100);\n                atomicBoolean.getAndSet(true);\n              } catch (InterruptedException e) {\n              }\n            })\n        .start();\n    // then\n    AssertRetry.assertWithRetry(() -> atomicBoolean.get(), Boolean.TRUE, 100, 10);\n  }\n\n  @Test(expectedExceptions = AssertionError.class)\n  public void testAssertFailWithRetry() throws InterruptedException {\n    // Given\n    AtomicBoolean atomicBoolean = new AtomicBoolean(false);\n    // When\n    new Thread(\n            () -> {\n              try {\n                Thread.sleep(100);\n                atomicBoolean.getAndSet(true);\n              } catch (InterruptedException e) {\n              }\n            })\n        .start();\n    // then\n    AssertRetry.assertWithRetry(() -> atomicBoolean.get(), Boolean.TRUE, 2, 10);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/tck/DBServerListener.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.tck;\n\nimport org.testng.ITestContext;\n\n/**\n * Listener representing fake db server url injection for testing \"attributes sharing\" using {@link\n * ITestContext} test suite instance.\n *\n * @author Yevhenii Voevodin\n */\npublic class DBServerListener extends TestListenerAdapter {\n\n  public static final String DB_SERVER_URL_ATTRIBUTE_NAME = \"db_server_url\";\n  public static final String DB_SERVER_URL = \"localhost:12345\";\n\n  @Override\n  public void onStart(ITestContext context) {\n    context.setAttribute(DB_SERVER_URL_ATTRIBUTE_NAME, DB_SERVER_URL);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/tck/TckComponentsTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.tck;\n\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.commons.test.tck.repository.TckRepository;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@code org.eclipse.che.commons.test.tck.*} package.\n *\n * @author Yevhenii Voevodin\n */\n@Listeners(TckListener.class)\n@Test(suiteName = \"tck\")\npublic class TckComponentsTest {\n\n  @Inject private TckRepository<Entity> tckRepository;\n\n  @Inject private DBUrlProvider dbUrlProvider;\n\n  @Test\n  public void testComponentsAreInjected() {\n    assertNotNull(tckRepository, \"TckRepository is not injected\");\n    assertNotNull(dbUrlProvider, \"DBUrlProvider is not injected\");\n    assertEquals(\n        dbUrlProvider.getUrl(), DBServerListener.DB_SERVER_URL, \"Value is set to ITestContext\");\n  }\n\n  public interface Entity {}\n\n  public interface DBUrlProvider {\n    String getUrl();\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/tck/TestModule1.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.tck;\n\nimport com.google.inject.TypeLiteral;\nimport java.util.Collection;\nimport org.eclipse.che.commons.test.tck.TckComponentsTest.Entity;\nimport org.eclipse.che.commons.test.tck.repository.TckRepository;\nimport org.eclipse.che.commons.test.tck.repository.TckRepositoryException;\n\n/**\n * @author Yevhenii Voevodin\n */\npublic class TestModule1 extends TckModule {\n\n  @Override\n  public void configure() {\n    bind(new TypeLiteral<TckRepository<Entity>>() {})\n        .toInstance(\n            new TckRepository<Entity>() {\n              @Override\n              public void createAll(Collection<? extends Entity> entities)\n                  throws TckRepositoryException {}\n\n              @Override\n              public void removeAll() throws TckRepositoryException {}\n            });\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/tck/TestModule2.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.test.tck;\n\nimport static org.eclipse.che.commons.test.tck.DBServerListener.DB_SERVER_URL_ATTRIBUTE_NAME;\n\nimport org.eclipse.che.commons.test.tck.TckComponentsTest.DBUrlProvider;\n\n/**\n * @author Yevhenii Voevodin\n */\npublic class TestModule2 extends TckModule {\n\n  @Override\n  public void configure() {\n    bind(DBUrlProvider.class)\n        .toInstance(() -> getTestContext().getAttribute(DB_SERVER_URL_ATTRIBUTE_NAME).toString());\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/test/resources/META-INF/services/org.eclipse.che.commons.test.tck.TckModule",
    "content": "org.eclipse.che.commons.test.tck.TestModule1\norg.eclipse.che.commons.test.tck.TestModule2\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/test/resources/META-INF/services/org.testng.ITestNGListener",
    "content": "org.eclipse.che.commons.test.tck.DBServerListener\n"
  },
  {
    "path": "core/commons/che-core-commons-test/src/test/resources/org/eclipse/che/commons/test/db/test-persistence-1.xml",
    "content": "<!--\n\n    Copyright (c) 2012-2025 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<persistence xmlns=\"http://java.sun.com/xml/ns/persistence\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             xsi:schemaLocation=\"http://java.sun.com/xml/ns/persistence persistence_1_0.xsd\" version=\"1.0\">\n    <persistence-unit name=\"test-unit\" transaction-type=\"RESOURCE_LOCAL\">\n        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>\n        <class>org.eclipse.che.commons.test.db.PersistTestModuleBuilderTest$MyEntity1</class>\n        <class>org.eclipse.che.commons.test.db.PersistTestModuleBuilderTest$MyEntity2</class>\n        <properties>\n            <property name=\"jakarta.persistence.jdbc.driver\" value=\"org.h2.Driver\"/>\n            <property name=\"jakarta.persistence.jdbc.url\" value=\"jdbc:h2:mem:test\"/>\n            <property name=\"jakarta.persistence.jdbc.user\" value=\"username\"/>\n            <property name=\"jakarta.persistence.jdbc.password\" value=\"secret\"/>\n            <property name=\"eclipselink.logging.level\" value=\"FINE\"/>\n            <property name=\"eclipselink.exception-handler\" value=\"org.eclipse.che.commons.test.db.PersistTestModuleBuilderTest$MyExceptionHandler\"/>\n            <property name=\"custom-property\" value=\"value\"/>\n        </properties>\n    </persistence-unit>\n</persistence>\n"
  },
  {
    "path": "core/commons/che-core-commons-tracing/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-commons-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-commons-tracing</artifactId>\n    <name>Che Core :: Commons :: Tracing</name>\n    <dependencies>\n        <dependency>\n            <groupId>io.opentracing</groupId>\n            <artifactId>opentracing-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <!-- for the @Beta annotation -->\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <!-- for the @Inject annotation -->\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n            <scope>provided</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "core/commons/che-core-commons-tracing/src/main/java/org/eclipse/che/commons/tracing/AnnotationAwareBooleanTag.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.tracing;\n\nimport com.google.common.annotations.Beta;\nimport io.opentracing.tag.BooleanTag;\nimport java.util.function.Supplier;\nimport org.eclipse.che.commons.annotation.Traced;\n\n/**\n * A specialization of the {@link BooleanTag} that adds support for setting a tag in a {@link\n * Traced @Traced} method.\n */\n@Beta\npublic class AnnotationAwareBooleanTag extends BooleanTag {\n\n  public AnnotationAwareBooleanTag(String key) {\n    super(key);\n  }\n\n  /**\n   * Sets the value of the tag for the span of the {@link Traced @Traced} method.\n   *\n   * @param value the value to set\n   */\n  public void set(Boolean value) {\n    set(() -> value);\n  }\n\n  /**\n   * Sets the value of the tag for the span of the {@link Traced @Traced} method.\n   *\n   * @param value the supplier of the value to set\n   */\n  public void set(Supplier<Boolean> value) {\n    Traced.Tags.addBoolean(getKey(), value);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-tracing/src/main/java/org/eclipse/che/commons/tracing/AnnotationAwareIntTag.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.tracing;\n\nimport com.google.common.annotations.Beta;\nimport io.opentracing.tag.IntTag;\nimport java.util.function.Supplier;\nimport org.eclipse.che.commons.annotation.Traced;\n\n/**\n * A specialization of the {@link IntTag} that adds support for setting a tag in a {@link\n * Traced @Traced} method.\n */\n@Beta\npublic class AnnotationAwareIntTag extends IntTag {\n\n  public AnnotationAwareIntTag(String key) {\n    super(key);\n  }\n\n  /**\n   * Sets the value of the tag for the span of the {@link Traced @Traced} method.\n   *\n   * @param value the value to set\n   */\n  public void set(Integer value) {\n    set(() -> value);\n  }\n\n  /**\n   * Sets the value of the tag for the span of the {@link Traced @Traced} method.\n   *\n   * @param value the supplier of the value to set\n   */\n  public void set(Supplier<Integer> value) {\n    Traced.Tags.addInteger(getKey(), value);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-tracing/src/main/java/org/eclipse/che/commons/tracing/AnnotationAwareStringTag.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.tracing;\n\nimport com.google.common.annotations.Beta;\nimport io.opentracing.tag.StringTag;\nimport java.util.function.Supplier;\nimport org.eclipse.che.commons.annotation.Traced;\n\n/**\n * A specialization of the {@link StringTag} that adds support for setting a tag in a {@link\n * Traced @Traced} method.\n */\n@Beta\npublic class AnnotationAwareStringTag extends StringTag {\n\n  public AnnotationAwareStringTag(String key) {\n    super(key);\n  }\n\n  /**\n   * Sets the value of the tag for the span of the {@link Traced @Traced} method.\n   *\n   * @param value the value to set\n   */\n  public void set(String value) {\n    set(() -> value);\n  }\n\n  /**\n   * Sets the value of the tag for the span of the {@link Traced @Traced} method.\n   *\n   * @param value the supplier of the value to set\n   */\n  public void set(Supplier<String> value) {\n    Traced.Tags.addString(getKey(), value);\n  }\n}\n"
  },
  {
    "path": "core/commons/che-core-commons-tracing/src/main/java/org/eclipse/che/commons/tracing/TracingTags.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.commons.tracing;\n\nimport static com.google.common.base.MoreObjects.firstNonNull;\n\nimport com.google.common.annotations.Beta;\nimport io.opentracing.Span;\nimport io.opentracing.tag.Tags;\n\n/** The standard tags used in Che server. */\n@Beta\npublic final class TracingTags {\n\n  /** The id of the workspace the span is related to. */\n  public static final AnnotationAwareStringTag WORKSPACE_ID =\n      new AnnotationAwareStringTag(\"workspace.id\");\n\n  /** The name of the machine (container) the span is related to. */\n  public static final AnnotationAwareStringTag MACHINE_NAME =\n      new AnnotationAwareStringTag(\"machine.name\");\n\n  /** The id of the user the span is related to. */\n  public static final AnnotationAwareStringTag USER_ID = new AnnotationAwareStringTag(\"user.id\");\n\n  /** The id of the stack the span is related to. */\n  public static final AnnotationAwareStringTag STACK_ID = new AnnotationAwareStringTag(\"stack.id\");\n\n  /**\n   * The entity that stopped workspace, which can be either user ID, or name of component that\n   * stopped it (e.g. activity checker) .\n   */\n  public static final AnnotationAwareStringTag STOPPED_BY =\n      new AnnotationAwareStringTag(\"stopped_by\");\n\n  /**\n   * This is the standard {@link Tags#ERROR} \"reexported\" as an annotation aware tag so that it can\n   * be easily set in the {@link org.eclipse.che.commons.annotation.Traced @Traced} methods.\n   */\n  public static final AnnotationAwareBooleanTag ERROR =\n      new AnnotationAwareBooleanTag(Tags.ERROR.getKey());\n\n  /** We can record the reason for an error in this tag. */\n  public static final AnnotationAwareStringTag ERROR_REASON =\n      new AnnotationAwareStringTag(\"error.reason\");\n\n  /**\n   * If some asynchronous job has been cancelled due to some reason (but itself didn't fail) one can\n   * use this tag instead of the \"error\" tag.\n   */\n  public static final AnnotationAwareBooleanTag CANCELLED =\n      new AnnotationAwareBooleanTag(\"cancelled\");\n\n  /** A place to report the reason for the cancellation as a tag on a span */\n  public static final AnnotationAwareStringTag CANCELLED_REASON =\n      new AnnotationAwareStringTag(\"cancelled.reason\");\n\n  /**\n   * This is the standard {@link Tags#SAMPLING_PRIORITY} \"reexported\" as an annotation aware tag so\n   * that it can be easily set in the {@link org.eclipse.che.commons.annotation.Traced @Traced}\n   * methods.\n   */\n  public static final AnnotationAwareIntTag SAMPLING_PRIORITY =\n      new AnnotationAwareIntTag(Tags.SAMPLING_PRIORITY.getKey());\n\n  /** Set error status and associated tags on a span, given a throwable */\n  public static void setErrorStatus(Span span, Throwable e) {\n    TracingTags.ERROR.set(span, true);\n    TracingTags.ERROR_REASON.set(span, firstNonNull(e.getMessage(), \"Unknown reason\"));\n    TracingTags.SAMPLING_PRIORITY.set(span, 1);\n  }\n\n  private TracingTags() {}\n}\n"
  },
  {
    "path": "core/commons/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n        <relativePath>../pom.xml</relativePath>\n    </parent>\n    <artifactId>che-core-commons-parent</artifactId>\n    <packaging>pom</packaging>\n    <name>Che Core :: Commons :: Parent</name>\n    <modules>\n        <module>che-core-commons-annotations</module>\n        <module>che-core-commons-lang</module>\n        <module>che-core-commons-inject</module>\n        <module>che-core-commons-json</module>\n        <module>che-core-commons-schedule</module>\n        <module>che-core-commons-test</module>\n        <module>che-core-commons-j2ee</module>\n        <module>che-core-commons-tracing</module>\n        <module>che-core-commons-observability</module>\n    </modules>\n</project>\n"
  },
  {
    "path": "core/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-server</artifactId>\n        <groupId>org.eclipse.che</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n        <relativePath>../pom.xml</relativePath>\n    </parent>\n    <groupId>org.eclipse.che.core</groupId>\n    <artifactId>che-core-parent</artifactId>\n    <packaging>pom</packaging>\n    <name>Che Core Parent</name>\n    <modules>\n        <module>commons</module>\n        <module>che-core-api-dto</module>\n        <module>che-core-api-dto-maven-plugin</module>\n        <module>che-core-typescript-dto-maven-plugin</module>\n        <module>che-core-api-core</module>\n        <module>che-core-api-model</module>\n        <module>che-core-logback</module>\n        <module>che-core-tracing-core</module>\n        <module>che-core-tracing-web</module>\n        <module>che-core-metrics-core</module>\n        <module>che-core-tracing-metrics</module>\n    </modules>\n</project>\n"
  },
  {
    "path": "deploy/cert-manager/ca-cert-generator-role-binding.yml",
    "content": "---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  name: ca-cert-generator-role-binding\n  namespace: cert-manager\nsubjects:\n- kind: ServiceAccount\n  name: ca-cert-generator\n  apiGroup: ''\nroleRef:\n  kind: Role\n  name: ca-cert-generator-role\n  apiGroup: ''\n"
  },
  {
    "path": "deploy/cert-manager/ca-cert-generator-role.yml",
    "content": "---\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  name: ca-cert-generator-role\n  namespace: cert-manager\nrules:\n- apiGroups:\n    - ''\n  resources:\n    - secrets\n  verbs:\n    - create\n"
  },
  {
    "path": "deploy/cert-manager/che-certificate.yml",
    "content": "---\napiVersion: cert-manager.io/v1\nkind: Certificate\nmetadata:\n  name: che-certificate\n  namespace: che\nspec:\n  secretName: che-tls\n  issuerRef:\n    name: che-cluster-issuer\n    kind: ClusterIssuer\n  # This is a template and it will be set from --domain parameter\n  # For example: '*.192.168.99.100.nip.io'\n  commonName: '*.<domain>'\n  dnsNames:\n    - '*.<domain>'\n"
  },
  {
    "path": "deploy/cert-manager/che-cluster-issuer.yml",
    "content": "---\napiVersion: cert-manager.io/v1\nkind: ClusterIssuer\nmetadata:\n  name: che-cluster-issuer\n  namespace: cert-manager\nspec:\n  ca:\n    secretName: ca\n"
  },
  {
    "path": "devfile.yaml",
    "content": "schemaVersion: 2.3.0\nmetadata:\n  name: che-server\n  generateName: che-server-\ncomponents:\n  - container:\n      image: quay.io/devfile/universal-developer-image:ubi9-latest\n      memoryLimit: 12G\n      memoryRequest: 512Mi\n      cpuRequest: 1000m\n      cpuLimit: 5000m\n      mountSources: true\n      volumeMounts:\n        - name: m2\n          path: /home/user/.m2\n    name: tools\n  - name: m2\n    volume: {}\ncommands:\n  - id: build-sources\n    exec:\n      label: \"1. Build sources\"\n      component: tools\n      workingDir: ${PROJECT_SOURCE}\n      commandLine: |\n        mvn clean install -V -e -Pfast -DskipTests -Dskip-validate-sources -Denforcer.skip=true\n      group:\n        kind: build\n        isDefault: true\n  - id: build-image\n    exec:\n      label: \"2. Build image\"\n      component: tools\n      workingDir: ${PROJECT_SOURCE}\n      commandLine: |\n        ./build/build.sh\n      group:\n        kind: build\n        isDefault: true\n  - id: install-chectl\n    exec:\n      label: \"3. Install chectl\"\n      component: tools\n      group:\n        kind: build\n      workingDir: ${HOME}\n      commandLine: |\n        get_arch() {\n          case \"$(uname -m)\" in\n            \"x86_64\")\n            echo \"x64\"\n              ;;\n\n            \"aarch64\")\n              echo \"arm64\"\n              ;;\n\n            \"armv7l\")\n               echo \"arm\"\n              ;;\n\n            \"ppc64le\")\n               echo \"ppc64le\"\n              ;;\n\n            \"s390x\")\n               echo \"s390x\"\n              ;;\n\n            \"arm64\")\n               echo \"arm64\"\n              ;;\n            *)\n              error \"unsupported arch: $(uname -m)\"\n              return 1\n              ;;\n          esac\n        }\n        get_operating_system() {\n          SHORT_UNAME=$(uname -s)\n          if [ \"$(uname)\" == \"Darwin\" ]; then\n            echo \"darwin\"\n          elif [ \"${SHORT_UNAME:0:5}\" == \"Linux\" ]; then\n            echo \"linux\"\n          else\n            error \"This installer is only supported on Linux and macOS. Found $(uname)\"\n            return 1\n          fi\n        }\n        curl -LJO $(curl -fsSL https://che-incubator.github.io/chectl/download-link/stable-$(get_operating_system)-$(get_arch))\n        tar -xf chectl-linux-x64.tar.gz -C $HOME/\n        echo 'export PATH=$HOME/chectl/bin/:$PATH' >> $HOME/.bashrc\n  - id: install-claude\n    exec:\n      label: \"4. Install Claude CLI\"\n      commandLine: curl -fsSL https://claude.ai/install.sh -o claude-install.sh && chmod +x claude-install.sh && ./claude-install.sh\n      component: tools\n  - id: run-claude-yolo\n    exec:\n      label: \"5. Run Claude YOLO\"\n      commandLine: claude --dangerously-skip-permissions\n      component: tools\n"
  },
  {
    "path": "docs/README.md",
    "content": "Docs are located at [https://github.com/eclipse/che-docs](https://github.com/eclipse/che-docs).\n"
  },
  {
    "path": "docs/grafana/dashboard.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"limit\": 100,\n        \"name\": \"Annotations & Alerts\",\n        \"showIn\": 0,\n        \"type\": \"dashboard\"\n      },\n      {\n        \"datasource\": null,\n        \"enable\": true,\n        \"expr\": \"resets(process_uptime_seconds{application=\\\"$application\\\", instance=\\\"$instance\\\"}[1m]) > 0\",\n        \"iconColor\": \"rgba(255, 96, 96, 1)\",\n        \"name\": \"Restart Detection\",\n        \"showIn\": 0,\n        \"step\": \"1m\",\n        \"tagKeys\": \"restart-tag\",\n        \"textFormat\": \"uptime reset\",\n        \"titleFormat\": \"Restart\"\n      }\n    ]\n  },\n  \"description\": \"Che Server JVM\",\n  \"editable\": true,\n  \"gnetId\": 4701,\n  \"graphTooltip\": 1,\n  \"iteration\": 1559737330617,\n  \"links\": [],\n  \"panels\": [\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 125,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"Quick Facts\",\n      \"type\": \"row\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": true,\n      \"colors\": [\n        \"rgba(245, 54, 54, 0.9)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(50, 172, 45, 0.97)\"\n      ],\n      \"datasource\": null,\n      \"decimals\": 1,\n      \"editable\": true,\n      \"error\": false,\n      \"format\": \"s\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"height\": \"\",\n      \"id\": 63,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"options\": {},\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"70%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": false,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": false\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"process_uptime_seconds{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 14400\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"Uptime\",\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": true,\n      \"colors\": [\n        \"rgba(245, 54, 54, 0.9)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(50, 172, 45, 0.97)\"\n      ],\n      \"datasource\": null,\n      \"decimals\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"format\": \"dateTimeAsIso\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 1\n      },\n      \"height\": \"\",\n      \"id\": 92,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"options\": {},\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"70%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": false,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": false\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"process_start_time_seconds{application=\\\"$application\\\", instance=\\\"$instance\\\"}*1000\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 14400\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"Start time\",\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"70%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": true,\n      \"colors\": [\n        \"rgba(50, 172, 45, 0.97)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(245, 54, 54, 0.9)\"\n      ],\n      \"datasource\": null,\n      \"decimals\": 2,\n      \"editable\": true,\n      \"error\": false,\n      \"format\": \"percent\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 1\n      },\n      \"id\": 65,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"options\": {},\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"70%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": false,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": false\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", area=\\\"heap\\\"})*100/sum(jvm_memory_max_bytes{application=\\\"$application\\\",instance=\\\"$instance\\\", area=\\\"heap\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 14400\n        }\n      ],\n      \"thresholds\": \"70,90\",\n      \"title\": \"Heap used\",\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": true,\n      \"colors\": [\n        \"rgba(50, 172, 45, 0.97)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(245, 54, 54, 0.9)\"\n      ],\n      \"datasource\": null,\n      \"decimals\": 2,\n      \"editable\": true,\n      \"error\": false,\n      \"format\": \"percent\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 1\n      },\n      \"id\": 75,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 2,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"options\": {},\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"70%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        },\n        {\n          \"from\": \"-99999999999999999999999999999999\",\n          \"text\": \"N/A\",\n          \"to\": \"0\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": false,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": false\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", area=\\\"nonheap\\\"})*100/sum(jvm_memory_max_bytes{application=\\\"$application\\\",instance=\\\"$instance\\\", area=\\\"nonheap\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 14400\n        }\n      ],\n      \"thresholds\": \"70,90\",\n      \"title\": \"Non-Heap used\",\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        },\n        {\n          \"op\": \"=\",\n          \"text\": \"x\",\n          \"value\": \"\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 4\n      },\n      \"id\": 127,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"JVM Memory\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 5\n      },\n      \"id\": 24,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", area=\\\"heap\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"used\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"sum(jvm_memory_committed_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", area=\\\"heap\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"committed\",\n          \"refId\": \"B\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"sum(jvm_memory_max_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", area=\\\"heap\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"max\",\n          \"refId\": \"C\",\n          \"step\": 2400\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"JVM Heap\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"mbytes\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 5\n      },\n      \"id\": 25,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", area=\\\"nonheap\\\"})\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"used\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"sum(jvm_memory_committed_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", area=\\\"nonheap\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"committed\",\n          \"refId\": \"B\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"sum(jvm_memory_max_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", area=\\\"nonheap\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"max\",\n          \"refId\": \"C\",\n          \"step\": 2400\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"JVM Non-Heap\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"mbytes\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 5\n      },\n      \"id\": 26,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"used\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"sum(jvm_memory_committed_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"committed\",\n          \"refId\": \"B\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"sum(jvm_memory_max_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"max\",\n          \"refId\": \"C\",\n          \"step\": 2400\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"JVM Total\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"mbytes\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 5\n      },\n      \"id\": 86,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"process_memory_vss_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": true,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"vss\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"process_memory_rss_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"rss\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"process_memory_pss_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"pss\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"process_memory_swap_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"swap\",\n          \"refId\": \"D\"\n        },\n        {\n          \"expr\": \"process_memory_swappss_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"swappss\",\n          \"refId\": \"E\"\n        },\n        {\n          \"expr\": \"process_memory_pss_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\"} + process_memory_swap_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"phys (pss+swap)\",\n          \"refId\": \"F\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"JVM Process Memory\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"mbytes\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 12\n      },\n      \"id\": 128,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"JVM Misc\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 13\n      },\n      \"id\": 106,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"system_cpu_usage{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"system\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"process_cpu_usage{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"process\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"avg_over_time(process_cpu_usage{application=\\\"$application\\\", instance=\\\"$instance\\\"}[1h])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"process-1h\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"CPU\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"short\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"decimals\": 1,\n          \"format\": \"percentunit\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": \"1\",\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 13\n      },\n      \"id\": 93,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"system_load_average_1m{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"system-1m\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"system_cpu_count{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"cpu\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Load\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"short\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"decimals\": 1,\n          \"format\": \"short\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 13\n      },\n      \"id\": 32,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_threads_live{application=\\\"$application\\\", instance=\\\"$instance\\\"} or jvm_threads_live_threads{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"live\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"jvm_threads_daemon{application=\\\"$application\\\", instance=\\\"$instance\\\"} or jvm_threads_daemon_threads{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"daemon\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"jvm_threads_peak{application=\\\"$application\\\", instance=\\\"$instance\\\"} or jvm_threads_peak_threads{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"peak\",\n          \"refId\": \"C\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"process_threads{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"process\",\n          \"refId\": \"D\",\n          \"step\": 2400\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Threads\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"short\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"decimals\": 0,\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {\n        \"blocked\": \"#bf1b00\",\n        \"new\": \"#fce2de\",\n        \"runnable\": \"#7eb26d\",\n        \"terminated\": \"#511749\",\n        \"timed-waiting\": \"#c15c17\",\n        \"waiting\": \"#eab839\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 13\n      },\n      \"id\": 124,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_threads_states_threads{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{state}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Thread States\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {\n        \"debug\": \"#1F78C1\",\n        \"error\": \"#BF1B00\",\n        \"info\": \"#508642\",\n        \"trace\": \"#6ED0E0\",\n        \"warn\": \"#EAB839\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 18,\n        \"x\": 0,\n        \"y\": 20\n      },\n      \"height\": \"\",\n      \"id\": 91,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": true,\n        \"hideEmpty\": false,\n        \"hideZero\": false,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": true,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [\n        {\n          \"alias\": \"error\",\n          \"yaxis\": 1\n        },\n        {\n          \"alias\": \"warn\",\n          \"yaxis\": 1\n        }\n      ],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"increase(logback_events_total{application=\\\"$application\\\", instance=\\\"$instance\\\"}[1m])\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{level}}\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 1200\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Log Events (1m)\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"short\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"decimals\": 0,\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 20\n      },\n      \"id\": 61,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"process_open_fds{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"open\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"process_max_fds{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"max\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"process_files_open{application=\\\"$application\\\", instance=\\\"$instance\\\"} or process_files_open_files{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"open\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"process_files_max{application=\\\"$application\\\", instance=\\\"$instance\\\"} or process_files_max_files{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"max\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"File Descriptors\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"short\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"decimals\": 0,\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 10,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 27\n      },\n      \"id\": 129,\n      \"panels\": [],\n      \"repeat\": \"persistence_counts\",\n      \"title\": \"JVM Memory Pools (Heap)\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 28\n      },\n      \"id\": 3,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"maxPerRow\": 3,\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"repeat\": \"jvm_memory_pool_heap\",\n      \"scopedVars\": {\n        \"jvm_memory_pool_heap\": {\n          \"selected\": false,\n          \"text\": \"PS Eden Space\",\n          \"value\": \"PS Eden Space\"\n        }\n      },\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_heap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"used\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 1800\n        },\n        {\n          \"expr\": \"jvm_memory_committed_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_heap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"commited\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 1800\n        },\n        {\n          \"expr\": \"jvm_memory_max_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_heap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"max\",\n          \"metric\": \"\",\n          \"refId\": \"C\",\n          \"step\": 1800\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"$jvm_memory_pool_heap\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"mbytes\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 28\n      },\n      \"id\": 134,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"maxPerRow\": 3,\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"repeat\": null,\n      \"repeatIteration\": 1559737330617,\n      \"repeatPanelId\": 3,\n      \"scopedVars\": {\n        \"jvm_memory_pool_heap\": {\n          \"selected\": false,\n          \"text\": \"PS Old Gen\",\n          \"value\": \"PS Old Gen\"\n        }\n      },\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_heap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"used\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 1800\n        },\n        {\n          \"expr\": \"jvm_memory_committed_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_heap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"commited\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 1800\n        },\n        {\n          \"expr\": \"jvm_memory_max_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_heap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"max\",\n          \"metric\": \"\",\n          \"refId\": \"C\",\n          \"step\": 1800\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"$jvm_memory_pool_heap\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"mbytes\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 28\n      },\n      \"id\": 135,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"maxPerRow\": 3,\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"repeat\": null,\n      \"repeatIteration\": 1559737330617,\n      \"repeatPanelId\": 3,\n      \"scopedVars\": {\n        \"jvm_memory_pool_heap\": {\n          \"selected\": false,\n          \"text\": \"PS Survivor Space\",\n          \"value\": \"PS Survivor Space\"\n        }\n      },\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_heap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"used\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 1800\n        },\n        {\n          \"expr\": \"jvm_memory_committed_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_heap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"commited\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 1800\n        },\n        {\n          \"expr\": \"jvm_memory_max_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_heap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"max\",\n          \"metric\": \"\",\n          \"refId\": \"C\",\n          \"step\": 1800\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"$jvm_memory_pool_heap\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"mbytes\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 35\n      },\n      \"id\": 130,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"JVM Memory Pools (Non-Heap)\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 36\n      },\n      \"id\": 78,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"maxPerRow\": 3,\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"repeat\": \"jvm_memory_pool_nonheap\",\n      \"scopedVars\": {\n        \"jvm_memory_pool_nonheap\": {\n          \"selected\": false,\n          \"text\": \"Metaspace\",\n          \"value\": \"Metaspace\"\n        }\n      },\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_nonheap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"used\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 1800\n        },\n        {\n          \"expr\": \"jvm_memory_committed_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_nonheap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"commited\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 1800\n        },\n        {\n          \"expr\": \"jvm_memory_max_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_nonheap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"max\",\n          \"metric\": \"\",\n          \"refId\": \"C\",\n          \"step\": 1800\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"$jvm_memory_pool_nonheap\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"mbytes\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 36\n      },\n      \"id\": 136,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"maxPerRow\": 3,\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"repeat\": null,\n      \"repeatIteration\": 1559737330617,\n      \"repeatPanelId\": 78,\n      \"scopedVars\": {\n        \"jvm_memory_pool_nonheap\": {\n          \"selected\": false,\n          \"text\": \"Compressed Class Space\",\n          \"value\": \"Compressed Class Space\"\n        }\n      },\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_nonheap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"used\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 1800\n        },\n        {\n          \"expr\": \"jvm_memory_committed_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_nonheap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"commited\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 1800\n        },\n        {\n          \"expr\": \"jvm_memory_max_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_nonheap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"max\",\n          \"metric\": \"\",\n          \"refId\": \"C\",\n          \"step\": 1800\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"$jvm_memory_pool_nonheap\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"mbytes\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 36\n      },\n      \"id\": 137,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"maxPerRow\": 3,\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"repeat\": null,\n      \"repeatIteration\": 1559737330617,\n      \"repeatPanelId\": 78,\n      \"scopedVars\": {\n        \"jvm_memory_pool_nonheap\": {\n          \"selected\": false,\n          \"text\": \"Code Cache\",\n          \"value\": \"Code Cache\"\n        }\n      },\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_nonheap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"used\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 1800\n        },\n        {\n          \"expr\": \"jvm_memory_committed_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_nonheap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"commited\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 1800\n        },\n        {\n          \"expr\": \"jvm_memory_max_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=~\\\"$jvm_memory_pool_nonheap\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"max\",\n          \"metric\": \"\",\n          \"refId\": \"C\",\n          \"step\": 1800\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"$jvm_memory_pool_nonheap\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"mbytes\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 43\n      },\n      \"id\": 131,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"Garbage Collection\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 44\n      },\n      \"id\": 98,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"rate(jvm_gc_pause_seconds_count{application=\\\"$application\\\", instance=\\\"$instance\\\"}[1m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{action}} ({{cause}})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Collections\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"ops\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 44\n      },\n      \"id\": 101,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"rate(jvm_gc_pause_seconds_sum{application=\\\"$application\\\", instance=\\\"$instance\\\"}[1m])/rate(jvm_gc_pause_seconds_count{application=\\\"$application\\\", instance=\\\"$instance\\\"}[1m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"avg {{action}} ({{cause}})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"jvm_gc_pause_seconds_max{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"max {{action}} ({{cause}})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Pause Durations\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"s\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 44\n      },\n      \"id\": 99,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"rate(jvm_gc_memory_allocated_bytes_total{application=\\\"$application\\\", instance=\\\"$instance\\\"}[1m])\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"allocated\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"rate(jvm_gc_memory_promoted_bytes_total{application=\\\"$application\\\", instance=\\\"$instance\\\"}[1m])\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"promoted\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Allocated/Promoted\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"Bps\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 51\n      },\n      \"id\": 132,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"Classloading\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 52\n      },\n      \"id\": 37,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_classes_loaded{application=\\\"$application\\\", instance=\\\"$instance\\\"} or jvm_classes_loaded_classes{application=\\\"$application\\\", instance=\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"loaded\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 1200\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Classes loaded\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"short\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 52\n      },\n      \"id\": 38,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"delta(jvm_classes_loaded{application=\\\"$application\\\",instance=\\\"$instance\\\"}[5m]) or delta(jvm_classes_loaded_classes{application=\\\"$application\\\",instance=\\\"$instance\\\"}[5m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"delta\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 1200\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Class delta (5m)\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"ops\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"decimals\": null,\n          \"format\": \"short\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 59\n      },\n      \"id\": 133,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"Buffer Pools\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 60\n      },\n      \"id\": 33,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_buffer_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=\\\"direct\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"used\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"jvm_buffer_total_capacity_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=\\\"direct\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"capacity\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 2400\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Direct Buffers\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"short\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 60\n      },\n      \"id\": 83,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_buffer_count{application=\\\"$application\\\", instance=\\\"$instance\\\", id=\\\"direct\\\"} or jvm_buffer_count_buffers{application=\\\"$application\\\", instance=\\\"$instance\\\", id=\\\"direct\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"count\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2400\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Direct Buffers\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"short\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"decimals\": 0,\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 60\n      },\n      \"id\": 85,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_buffer_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=\\\"mapped\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"used\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2400\n        },\n        {\n          \"expr\": \"jvm_buffer_total_capacity_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", id=\\\"mapped\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"capacity\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 2400\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Mapped Buffers\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"short\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": null,\n      \"editable\": true,\n      \"error\": false,\n      \"fill\": 1,\n      \"grid\": {\n        \"leftLogBase\": 1,\n        \"leftMax\": null,\n        \"leftMin\": null,\n        \"rightLogBase\": 1,\n        \"rightMax\": null,\n        \"rightMin\": null\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 60\n      },\n      \"id\": 84,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {},\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"jvm_buffer_count{application=\\\"$application\\\", instance=\\\"$instance\\\", id=\\\"mapped\\\"} or jvm_buffer_count_buffers{application=\\\"$application\\\", instance=\\\"$instance\\\", id=\\\"mapped\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"count\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2400\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Mapped Buffers\",\n      \"tooltip\": {\n        \"msResolution\": false,\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"cumulative\"\n      },\n      \"type\": \"graph\",\n      \"x-axis\": true,\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"y-axis\": true,\n      \"y_formats\": [\n        \"short\",\n        \"short\"\n      ],\n      \"yaxes\": [\n        {\n          \"decimals\": 0,\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": 0,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    }\n  ],\n  \"refresh\": \"15m\",\n  \"schemaVersion\": 18,\n  \"style\": \"dark\",\n  \"tags\": [],\n  \"templating\": {\n    \"list\": [\n      {\n        \"allValue\": null,\n        \"current\": {\n          \"isNone\": true,\n          \"text\": \"None\",\n          \"value\": \"\"\n        },\n        \"datasource\": null,\n        \"definition\": \"\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Application\",\n        \"multi\": false,\n        \"name\": \"application\",\n        \"options\": [],\n        \"query\": \"label_values(application)\",\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allFormat\": \"glob\",\n        \"allValue\": null,\n        \"datasource\": null,\n        \"definition\": \"\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Instance\",\n        \"multi\": false,\n        \"multiFormat\": \"glob\",\n        \"name\": \"instance\",\n        \"options\": [],\n        \"query\": \"label_values(jvm_memory_used_bytes{application=\\\"$application\\\"}, instance)\",\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allFormat\": \"glob\",\n        \"allValue\": null,\n        \"current\": {\n          \"text\": \"All\",\n          \"value\": \"$__all\"\n        },\n        \"datasource\": null,\n        \"definition\": \"\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"JVM Memory Pools Heap\",\n        \"multi\": false,\n        \"multiFormat\": \"glob\",\n        \"name\": \"jvm_memory_pool_heap\",\n        \"options\": [],\n        \"query\": \"label_values(jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", area=\\\"heap\\\"},id)\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allFormat\": \"glob\",\n        \"allValue\": null,\n        \"current\": {\n          \"text\": \"All\",\n          \"value\": \"$__all\"\n        },\n        \"datasource\": null,\n        \"definition\": \"\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"JVM Memory Pools Non-Heap\",\n        \"multi\": false,\n        \"multiFormat\": \"glob\",\n        \"name\": \"jvm_memory_pool_nonheap\",\n        \"options\": [],\n        \"query\": \"label_values(jvm_memory_used_bytes{application=\\\"$application\\\", instance=\\\"$instance\\\", area=\\\"nonheap\\\"},id)\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 2,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": null,\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"refresh\": 1,\n        \"regex\": \".*che.*\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-24h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"now\": true,\n    \"refresh_intervals\": [\n      \"5s\",\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"browser\",\n  \"title\": \"Che Server JVM\",\n  \"uid\": \"Jv-xDZrmk\",\n  \"version\": 1\n}\n"
  },
  {
    "path": "docs/grafana/openshift-console-dashboard.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"limit\": 100,\n        \"name\": \"Annotations & Alerts\",\n        \"showIn\": 0,\n        \"type\": \"dashboard\"\n      },\n      {\n        \"datasource\": null,\n        \"enable\": true,\n        \"expr\": \"resets(process_uptime_seconds{instance=\\\"$instance\\\"}[1m]) > 0\",\n        \"iconColor\": \"rgba(255, 96, 96, 1)\",\n        \"name\": \"Restart Detection\",\n        \"showIn\": 0,\n        \"step\": \"1m\",\n        \"tagKeys\": \"restart-tag\",\n        \"textFormat\": \"uptime reset\",\n        \"titleFormat\": \"Restart\"\n      }\n    ]\n  },\n  \"description\": \"Che Server JVM\",\n  \"editable\": true,\n  \"gnetId\": 4701,\n  \"graphTooltip\": 1,\n  \"id\": 6,\n  \"iteration\": 1681311119023,\n  \"links\": [],\n  \"rows\": [\n    {\n      \"collapse\": false,\n      \"height\": \"100px\",\n      \"panels\": [\n        {\n          \"cacheTimeout\": null,\n          \"colorBackground\": false,\n          \"colorValue\": true,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"datasource\": null,\n          \"decimals\": 1,\n          \"editable\": true,\n          \"error\": false,\n          \"format\": \"\",\n          \"gauge\": {\n            \"maxValue\": 100,\n            \"minValue\": 0,\n            \"show\": false,\n            \"thresholdLabels\": false,\n            \"thresholdMarkers\": true\n          },\n          \"gridPos\": {\n            \"h\": 3,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 1\n          },\n          \"height\": \"\",\n          \"id\": 63,\n          \"interval\": null,\n          \"links\": [],\n          \"mappingType\": 1,\n          \"mappingTypes\": [\n            {\n              \"name\": \"value to text\",\n              \"value\": 1\n            },\n            {\n              \"name\": \"range to text\",\n              \"value\": 2\n            }\n          ],\n          \"maxDataPoints\": 100,\n          \"nullPointMode\": \"connected\",\n          \"nullText\": null,\n          \"postfix\": \"hours\",\n          \"postfixFontSize\": \"80%\",\n          \"prefix\": \"\",\n          \"prefixFontSize\": \"70%\",\n          \"rangeMaps\": [\n            {\n              \"from\": \"null\",\n              \"text\": \"N/A\",\n              \"to\": \"null\"\n            }\n          ],\n          \"sparkline\": {\n            \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n            \"full\": false,\n            \"lineColor\": \"rgb(31, 120, 193)\",\n            \"show\": false\n          },\n          \"tableColumn\": \"\",\n          \"span\": 2,\n          \"targets\": [\n            {\n              \"expr\": \"process_uptime_seconds{instance=\\\"$instance\\\"} / (60 * 60)\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 14400\n            }\n          ],\n          \"thresholds\": \"\",\n          \"title\": \"Uptime\",\n          \"type\": \"singlestat\",\n          \"valueFontSize\": \"80%\",\n          \"valueMaps\": [\n            {\n              \"op\": \"=\",\n              \"text\": \"N/A\",\n              \"value\": \"null\"\n            }\n          ],\n          \"valueName\": \"current\"\n        },\n        {\n          \"cacheTimeout\": null,\n          \"colorBackground\": false,\n          \"colorValue\": true,\n          \"colors\": [\n            \"rgba(50, 172, 45, 0.97)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(245, 54, 54, 0.9)\"\n          ],\n          \"datasource\": null,\n          \"decimals\": 2,\n          \"editable\": true,\n          \"error\": false,\n          \"format\": \"none\",\n          \"gauge\": {\n            \"maxValue\": 100,\n            \"minValue\": 0,\n            \"show\": false,\n            \"thresholdLabels\": false,\n            \"thresholdMarkers\": true\n          },\n          \"gridPos\": {\n            \"h\": 3,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 1\n          },\n          \"id\": 65,\n          \"interval\": null,\n          \"links\": [],\n          \"mappingType\": 1,\n          \"mappingTypes\": [\n            {\n              \"name\": \"value to text\",\n              \"value\": 1\n            },\n            {\n              \"name\": \"range to text\",\n              \"value\": 2\n            }\n          ],\n          \"maxDataPoints\": 100,\n          \"nullPointMode\": \"connected\",\n          \"nullText\": null,\n          \"postfix\": \"%\",\n          \"postfixFontSize\": \"80%\",\n          \"prefix\": \"\",\n          \"prefixFontSize\": \"70%\",\n          \"rangeMaps\": [\n            {\n              \"from\": \"null\",\n              \"text\": \"N/A\",\n              \"to\": \"null\"\n            }\n          ],\n          \"sparkline\": {\n            \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n            \"full\": false,\n            \"lineColor\": \"rgb(31, 120, 193)\",\n            \"show\": false\n          },\n          \"tableColumn\": \"\",\n          \"span\": 2,\n          \"targets\": [\n            {\n              \"expr\": \"sum(jvm_memory_used_bytes{instance=\\\"$instance\\\", area=\\\"heap\\\"})*100/sum(jvm_memory_max_bytes{instance=\\\"$instance\\\", area=\\\"heap\\\"})\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"\",\n              \"refId\": \"A\",\n              \"step\": 14400\n            }\n          ],\n          \"thresholds\": \"70,90\",\n          \"title\": \"Heap used\",\n          \"type\": \"singlestat\",\n          \"valueFontSize\": \"80%\",\n          \"valueMaps\": [\n            {\n              \"op\": \"=\",\n              \"text\": \"N/A\",\n              \"value\": \"null\"\n            }\n          ],\n          \"valueName\": \"current\"\n        },\n        {\n          \"cacheTimeout\": null,\n          \"colorBackground\": false,\n          \"colorValue\": true,\n          \"colors\": [\n            \"rgba(50, 172, 45, 0.97)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(245, 54, 54, 0.9)\"\n          ],\n          \"datasource\": null,\n          \"decimals\": 2,\n          \"editable\": true,\n          \"error\": false,\n          \"format\": \"none\",\n          \"gauge\": {\n            \"maxValue\": 100,\n            \"minValue\": 0,\n            \"show\": false,\n            \"thresholdLabels\": false,\n            \"thresholdMarkers\": true\n          },\n          \"gridPos\": {\n            \"h\": 3,\n            \"w\": 8,\n            \"x\": 16,\n            \"y\": 1\n          },\n          \"id\": 75,\n          \"interval\": null,\n          \"links\": [],\n          \"mappingType\": 2,\n          \"mappingTypes\": [\n            {\n              \"name\": \"value to text\",\n              \"value\": 1\n            },\n            {\n              \"name\": \"range to text\",\n              \"value\": 2\n            }\n          ],\n          \"maxDataPoints\": 100,\n          \"nullPointMode\": \"connected\",\n          \"nullText\": null,\n          \"postfix\": \"%\",\n          \"postfixFontSize\": \"80%\",\n          \"prefix\": \"\",\n          \"prefixFontSize\": \"70%\",\n          \"rangeMaps\": [\n            {\n              \"from\": \"null\",\n              \"text\": \"N/A\",\n              \"to\": \"null\"\n            },\n            {\n              \"from\": \"-99999999999999999999999999999999\",\n              \"text\": \"N/A\",\n              \"to\": \"0\"\n            }\n          ],\n          \"sparkline\": {\n            \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n            \"full\": false,\n            \"lineColor\": \"rgb(31, 120, 193)\",\n            \"show\": false\n          },\n          \"tableColumn\": \"\",\n          \"span\": 2,\n          \"targets\": [\n            {\n              \"expr\": \"sum(jvm_memory_used_bytes{instance=\\\"$instance\\\", area=\\\"nonheap\\\"})*100/sum(jvm_memory_max_bytes{instance=\\\"$instance\\\", area=\\\"nonheap\\\"})\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"\",\n              \"refId\": \"A\",\n              \"step\": 14400\n            }\n          ],\n          \"thresholds\": \"70,90\",\n          \"title\": \"Non-Heap used\",\n          \"type\": \"singlestat\",\n          \"valueFontSize\": \"80%\",\n          \"valueMaps\": [\n            {\n              \"op\": \"=\",\n              \"text\": \"N/A\",\n              \"value\": \"null\"\n            },\n            {\n              \"op\": \"=\",\n              \"text\": \"x\",\n              \"value\": \"\"\n            }\n          ],\n          \"valueName\": \"current\"\n        }\n      ],\n      \"repeat\": null,\n      \"repeatIteration\": null,\n      \"repeatRowId\": null,\n      \"showTitle\": true,\n      \"title\": \"Quick Facts\",\n      \"titleSize\": \"h6\"\n    },\n    {\n      \"collapse\": false,\n      \"height\": \"250px\",\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 0,\n            \"y\": 5\n          },\n          \"hiddenSeries\": false,\n          \"id\": 24,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"sum(jvm_memory_used_bytes{instance=\\\"$instance\\\", area=\\\"heap\\\"})\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"sum(jvm_memory_committed_bytes{instance=\\\"$instance\\\", area=\\\"heap\\\"})\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"committed\",\n              \"refId\": \"B\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"sum(jvm_memory_max_bytes{instance=\\\"$instance\\\", area=\\\"heap\\\"})\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"refId\": \"C\",\n              \"step\": 2400\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"JVM Heap\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"mbytes\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 6,\n            \"y\": 5\n          },\n          \"hiddenSeries\": false,\n          \"id\": 25,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"sum(jvm_memory_used_bytes{instance=\\\"$instance\\\", area=\\\"nonheap\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"sum(jvm_memory_committed_bytes{instance=\\\"$instance\\\", area=\\\"nonheap\\\"})\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"committed\",\n              \"refId\": \"B\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"sum(jvm_memory_max_bytes{instance=\\\"$instance\\\", area=\\\"nonheap\\\"})\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"refId\": \"C\",\n              \"step\": 2400\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"JVM Non-Heap\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"mbytes\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 12,\n            \"y\": 5\n          },\n          \"hiddenSeries\": false,\n          \"id\": 26,\n          \"legend\": {\n            \"alignAsTable\": false,\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"sum(jvm_memory_used_bytes{instance=\\\"$instance\\\"})\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"sum(jvm_memory_committed_bytes{instance=\\\"$instance\\\"})\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"committed\",\n              \"refId\": \"B\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"sum(jvm_memory_max_bytes{instance=\\\"$instance\\\"})\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"refId\": \"C\",\n              \"step\": 2400\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"JVM Total\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"mbytes\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 18,\n            \"y\": 5\n          },\n          \"hiddenSeries\": false,\n          \"id\": 86,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"process_memory_vss_bytes{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"vss\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"process_memory_rss_bytes{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"rss\",\n              \"refId\": \"B\"\n            },\n            {\n              \"expr\": \"process_memory_pss_bytes{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"pss\",\n              \"refId\": \"C\"\n            },\n            {\n              \"expr\": \"process_memory_swap_bytes{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"swap\",\n              \"refId\": \"D\"\n            },\n            {\n              \"expr\": \"process_memory_swappss_bytes{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"swappss\",\n              \"refId\": \"E\"\n            },\n            {\n              \"expr\": \"process_memory_pss_bytes{instance=\\\"$instance\\\"} + process_memory_swap_bytes{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"phys (pss+swap)\",\n              \"refId\": \"F\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"JVM Process Memory\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"mbytes\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": \"0\",\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        }\n      ],\n      \"repeat\": null,\n      \"repeatIteration\": null,\n      \"repeatRowId\": null,\n      \"showTitle\": true,\n      \"title\": \"JVM Memory\",\n      \"titleSize\": \"h6\"\n    },\n    {\n      \"collapse\": false,\n      \"height\": \"250px\",\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 0,\n            \"y\": 13\n          },\n          \"hiddenSeries\": false,\n          \"id\": 106,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"system_cpu_usage{instance=\\\"$instance\\\"} * 100\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"system\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"process_cpu_usage{instance=\\\"$instance\\\"} * 100\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"process\",\n              \"refId\": \"B\"\n            },\n            {\n              \"expr\": \"avg_over_time(process_cpu_usage{instance=\\\"$instance\\\"}[1h]) * 100\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"process-1h\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"CPU Usage (%)\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"short\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"decimals\": 1,\n              \"format\": \"percentunit\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"max\": \"1\",\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 6,\n            \"y\": 13\n          },\n          \"hiddenSeries\": false,\n          \"id\": 93,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"system_load_average_1m{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"system-1m\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"system_cpu_count{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"cpu\",\n              \"refId\": \"B\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Load\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"short\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"decimals\": 1,\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 12,\n            \"y\": 13\n          },\n          \"hiddenSeries\": false,\n          \"id\": 32,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_threads_live{instance=\\\"$instance\\\"} or jvm_threads_live_threads{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"live\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"jvm_threads_daemon{instance=\\\"$instance\\\"} or jvm_threads_daemon_threads{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"daemon\",\n              \"metric\": \"\",\n              \"refId\": \"B\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"jvm_threads_peak{instance=\\\"$instance\\\"} or jvm_threads_peak_threads{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"peak\",\n              \"refId\": \"C\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"process_threads{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"process\",\n              \"refId\": \"D\",\n              \"step\": 2400\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Threads\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"short\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"decimals\": 0,\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {\n            \"blocked\": \"#bf1b00\",\n            \"new\": \"#fce2de\",\n            \"runnable\": \"#7eb26d\",\n            \"terminated\": \"#511749\",\n            \"timed-waiting\": \"#c15c17\",\n            \"waiting\": \"#eab839\"\n          },\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 18,\n            \"y\": 13\n          },\n          \"hiddenSeries\": false,\n          \"id\": 124,\n          \"legend\": {\n            \"alignAsTable\": false,\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"rightSide\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_threads_states_threads{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{state}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Thread States\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {\n            \"debug\": \"#1F78C1\",\n            \"error\": \"#BF1B00\",\n            \"info\": \"#508642\",\n            \"trace\": \"#6ED0E0\",\n            \"warn\": \"#EAB839\"\n          },\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 18,\n            \"x\": 0,\n            \"y\": 20\n          },\n          \"height\": \"\",\n          \"hiddenSeries\": false,\n          \"id\": 91,\n          \"legend\": {\n            \"alignAsTable\": false,\n            \"avg\": false,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": false,\n            \"rightSide\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": true,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [\n            {\n              \"alias\": \"error\",\n              \"yaxis\": 1\n            },\n            {\n              \"alias\": \"warn\",\n              \"yaxis\": 1\n            }\n          ],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"increase(logback_events_total{instance=\\\"$instance\\\"}[1m])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{level}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 1200\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Log Events (1m)\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"short\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"decimals\": 0,\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": \"0\",\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 18,\n            \"y\": 20\n          },\n          \"hiddenSeries\": false,\n          \"id\": 61,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"process_open_fds{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"open\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"process_max_fds{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"metric\": \"\",\n              \"refId\": \"B\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"process_files_open{instance=\\\"$instance\\\"} or process_files_open_files{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"open\",\n              \"refId\": \"C\"\n            },\n            {\n              \"expr\": \"process_files_max{instance=\\\"$instance\\\"} or process_files_max_files{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"refId\": \"D\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"File Descriptors\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"short\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"decimals\": 0,\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 10,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        }\n      ],\n      \"repeat\": null,\n      \"repeatIteration\": null,\n      \"repeatRowId\": null,\n      \"showTitle\": true,\n      \"title\": \"JVM Misc\",\n      \"titleSize\": \"h6\"\n    },\n    {\n      \"collapse\": false,\n      \"height\": \"250px\",\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 28\n          },\n          \"hiddenSeries\": false,\n          \"id\": 3,\n          \"legend\": {\n            \"alignAsTable\": false,\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"rightSide\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"maxPerRow\": 3,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"repeat\": null,\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_memory_used_bytes{instance=\\\"$instance\\\", id=\\\"Eden Space\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 1800\n            },\n            {\n              \"expr\": \"jvm_memory_committed_bytes{instance=\\\"$instance\\\", id=~\\\"Eden Space\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"committed\",\n              \"metric\": \"\",\n              \"refId\": \"B\",\n              \"step\": 1800\n            },\n            {\n              \"expr\": \"jvm_memory_max_bytes{instance=\\\"$instance\\\", id=\\\"Eden Space\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"metric\": \"\",\n              \"refId\": \"C\",\n              \"step\": 1800\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Eden Space\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"mbytes\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 28\n          },\n          \"hiddenSeries\": false,\n          \"id\": 134,\n          \"legend\": {\n            \"alignAsTable\": false,\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"rightSide\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"maxPerRow\": 3,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"repeat\": null,\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_memory_used_bytes{instance=\\\"$instance\\\", id=\\\"Survivor Space\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 1800\n            },\n            {\n              \"expr\": \"jvm_memory_committed_bytes{instance=\\\"$instance\\\", id=\\\"Survivor Space\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"committed\",\n              \"metric\": \"\",\n              \"refId\": \"B\",\n              \"step\": 1800\n            },\n            {\n              \"expr\": \"jvm_memory_max_bytes{instance=\\\"$instance\\\", id=\\\"Survivor Space\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"metric\": \"\",\n              \"refId\": \"C\",\n              \"step\": 1800\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Survivor Space\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"mbytes\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 16,\n            \"y\": 28\n          },\n          \"hiddenSeries\": false,\n          \"id\": 135,\n          \"legend\": {\n            \"alignAsTable\": false,\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"rightSide\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"maxPerRow\": 3,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"repeat\": null,\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_memory_used_bytes{instance=\\\"$instance\\\", id=\\\"Tenured Gen\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 1800\n            },\n            {\n              \"expr\": \"jvm_memory_committed_bytes{instance=\\\"$instance\\\", id=\\\"Tenured Gen\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"committed\",\n              \"metric\": \"\",\n              \"refId\": \"B\",\n              \"step\": 1800\n            },\n            {\n              \"expr\": \"jvm_memory_max_bytes{instance=\\\"$instance\\\", id=\\\"Tenured Gen\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"metric\": \"\",\n              \"refId\": \"C\",\n              \"step\": 1800\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Tenured Gen\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"mbytes\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        }\n      ],\n      \"repeat\": null,\n      \"repeatIteration\": null,\n      \"repeatRowId\": null,\n      \"showTitle\": true,\n      \"title\": \"JVM Memory Pools (Heap)\",\n      \"titleSize\": \"h6\"\n    },\n    {\n      \"collapse\": false,\n      \"height\": \"250px\",\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 36\n          },\n          \"hiddenSeries\": false,\n          \"id\": 78,\n          \"legend\": {\n            \"alignAsTable\": false,\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"rightSide\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"maxPerRow\": 3,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"repeat\": \"null\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_memory_used_bytes{instance=\\\"$instance\\\", id=\\\"Metaspace\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 1800\n            },\n            {\n              \"expr\": \"jvm_memory_committed_bytes{instance=\\\"$instance\\\", id=\\\"Metaspace\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"committed\",\n              \"metric\": \"\",\n              \"refId\": \"B\",\n              \"step\": 1800\n            },\n            {\n              \"expr\": \"jvm_memory_max_bytes{instance=\\\"$instance\\\", id=\\\"Metaspace\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"metric\": \"\",\n              \"refId\": \"C\",\n              \"step\": 1800\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Metaspace\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"mbytes\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 36\n          },\n          \"hiddenSeries\": false,\n          \"id\": 136,\n          \"legend\": {\n            \"alignAsTable\": false,\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"rightSide\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"maxPerRow\": 3,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"repeat\": null,\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_memory_used_bytes{instance=\\\"$instance\\\", id=\\\"Compressed Class Space\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 1800\n            },\n            {\n              \"expr\": \"jvm_memory_committed_bytes{instance=\\\"$instance\\\", id=\\\"Compressed Class Space\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"committed\",\n              \"metric\": \"\",\n              \"refId\": \"B\",\n              \"step\": 1800\n            },\n            {\n              \"expr\": \"jvm_memory_max_bytes{instance=\\\"$instance\\\", id=\\\"Compressed Class Space\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"metric\": \"\",\n              \"refId\": \"C\",\n              \"step\": 1800\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Compressed Class Space\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"mbytes\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 16,\n            \"y\": 36\n          },\n          \"hiddenSeries\": false,\n          \"id\": 138,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_memory_used_bytes{instance=\\\"$instance\\\", id=\\\"CodeHeap 'profiled nmethods'\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"refId\": \"A\"\n            },\n            {\n              \"expr\": \"jvm_memory_committed_bytes{instance=\\\"$instance\\\", id=\\\"CodeHeap 'profiled nmethods'\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"committed\",\n              \"refId\": \"B\"\n            },\n            {\n              \"expr\": \"jvm_memory_max_bytes{instance=\\\"$instance\\\", id=\\\"CodeHeap 'profiled nmethods'\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"CodeHeap 'profiled nmethods'\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 6,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 43\n          },\n          \"hiddenSeries\": false,\n          \"id\": 140,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_memory_used_bytes{instance=\\\"$instance\\\", id=\\\"CodeHeap 'non-profiled nmethods'\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"refId\": \"A\"\n            },\n            {\n              \"expr\": \"jvm_memory_committed_bytes{instance=\\\"$instance\\\", id=\\\"CodeHeap 'non-profiled nmethods'\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"committed\",\n              \"refId\": \"B\"\n            },\n            {\n              \"expr\": \"jvm_memory_max_bytes{instance=\\\"$instance\\\", id=\\\"CodeHeap 'non-profiled nmethods'\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"CodeHeap 'non-profiled nmethods'\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": \"0\",\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 6,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 43\n          },\n          \"hiddenSeries\": false,\n          \"id\": 142,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": true,\n            \"max\": true,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_memory_used_bytes{instance=\\\"$instance\\\", id=\\\"CodeHeap 'non-nmethods'\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"refId\": \"A\"\n            },\n            {\n              \"expr\": \"jvm_memory_committed_bytes{instance=\\\"$instance\\\", id=\\\"CodeHeap 'non-nmethods'\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"committed\",\n              \"refId\": \"B\"\n            },\n            {\n              \"expr\": \"jvm_memory_max_bytes{instance=\\\"$instance\\\", id=\\\"CodeHeap 'non-nmethods'\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"max\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"CodeHeap 'non-nmethods'\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        }\n      ],\n      \"repeat\": null,\n      \"repeatIteration\": null,\n      \"repeatRowId\": null,\n      \"showTitle\": true,\n      \"title\": \"JVM Memory Pools (Non-Heap)\",\n      \"titleSize\": \"h6\"\n    },\n    {\n      \"collapse\": false,\n      \"height\": \"250px\",\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 50\n          },\n          \"hiddenSeries\": false,\n          \"id\": 98,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"rate(jvm_gc_pause_seconds_count{instance=\\\"$instance\\\"}[1m])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{action}} ({{cause}})\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Collections (ops/s)\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"ops\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": \"0\",\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 50\n          },\n          \"hiddenSeries\": false,\n          \"id\": 101,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"rate(jvm_gc_pause_seconds_sum{instance=\\\"$instance\\\"}[1m])/rate(jvm_gc_pause_seconds_count{instance=\\\"$instance\\\"}[1m])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"instant\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"avg {{action}} ({{cause}})\",\n              \"refId\": \"A\"\n            },\n            {\n              \"expr\": \"jvm_gc_pause_seconds_max{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"instant\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"max {{action}} ({{cause}})\",\n              \"refId\": \"B\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Pause Durations\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"s\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": \"0\",\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 16,\n            \"y\": 50\n          },\n          \"hiddenSeries\": false,\n          \"id\": 99,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"rate(jvm_gc_memory_allocated_bytes_total{instance=\\\"$instance\\\"}[1m])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"allocated\",\n              \"refId\": \"A\"\n            },\n            {\n              \"expr\": \"rate(jvm_gc_memory_promoted_bytes_total{instance=\\\"$instance\\\"}[1m])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"promoted\",\n              \"refId\": \"B\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Allocated/Promoted\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"Bps\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": \"0\",\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        }\n      ],\n      \"repeat\": null,\n      \"repeatIteration\": null,\n      \"repeatRowId\": null,\n      \"showTitle\": true,\n      \"title\": \"Garbage Collection\",\n      \"titleSize\": \"h6\"\n    },\n    {\n      \"collapse\": false,\n      \"height\": \"250px\",\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 58\n          },\n          \"hiddenSeries\": false,\n          \"id\": 37,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_classes_loaded{instance=\\\"$instance\\\"} or jvm_classes_loaded_classes{instance=\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"loaded\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 1200\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Classes loaded\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"short\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 58\n          },\n          \"hiddenSeries\": false,\n          \"id\": 38,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"delta(jvm_classes_loaded{instance=\\\"$instance\\\"}[5m]) or delta(jvm_classes_loaded_classes{instance=\\\"$instance\\\"}[5m])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"delta\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 1200\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Class delta (5m)\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"ops\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"decimals\": null,\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        }\n      ],\n      \"repeat\": null,\n      \"repeatIteration\": null,\n      \"repeatRowId\": null,\n      \"showTitle\": true,\n      \"title\": \"Classloading\",\n      \"titleSize\": \"h6\"\n    },\n    {\n      \"collapse\": false,\n      \"height\": \"250px\",\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 0,\n            \"y\": 66\n          },\n          \"hiddenSeries\": false,\n          \"id\": 33,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_buffer_memory_used_bytes{instance=\\\"$instance\\\", id=\\\"direct\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"jvm_buffer_total_capacity_bytes{instance=\\\"$instance\\\", id=\\\"direct\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"capacity\",\n              \"metric\": \"\",\n              \"refId\": \"B\",\n              \"step\": 2400\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Direct Buffers\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"short\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 6,\n            \"y\": 66\n          },\n          \"hiddenSeries\": false,\n          \"id\": 83,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_buffer_count{instance=\\\"$instance\\\", id=\\\"direct\\\"} or jvm_buffer_count_buffers{instance=\\\"$instance\\\", id=\\\"direct\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"count\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 2400\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Direct Buffers\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"short\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"decimals\": 0,\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 12,\n            \"y\": 66\n          },\n          \"hiddenSeries\": false,\n          \"id\": 85,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_buffer_memory_used_bytes{instance=\\\"$instance\\\", id=\\\"mapped\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"used\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 2400\n            },\n            {\n              \"expr\": \"jvm_buffer_total_capacity_bytes{instance=\\\"$instance\\\", id=\\\"mapped\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"capacity\",\n              \"metric\": \"\",\n              \"refId\": \"B\",\n              \"step\": 2400\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Mapped Buffers\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"short\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": null,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {\n            \"leftLogBase\": 1,\n            \"leftMax\": null,\n            \"leftMin\": null,\n            \"rightLogBase\": 1,\n            \"rightMax\": null,\n            \"rightMin\": null\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 6,\n            \"x\": 18,\n            \"y\": 66\n          },\n          \"hiddenSeries\": false,\n          \"id\": 84,\n          \"legend\": {\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"dataLinks\": []\n          },\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"span\": 6,\n          \"targets\": [\n            {\n              \"expr\": \"jvm_buffer_count{instance=\\\"$instance\\\", id=\\\"mapped\\\"} or jvm_buffer_count_buffers{instance=\\\"$instance\\\", id=\\\"mapped\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"count\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 2400\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeRegions\": [],\n          \"timeShift\": null,\n          \"title\": \"Mapped Buffers\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"x-axis\": true,\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"y-axis\": true,\n          \"y_formats\": [\n            \"short\",\n            \"short\"\n          ],\n          \"yaxes\": [\n            {\n              \"decimals\": 0,\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": null\n          }\n        }\n      ],\n      \"repeat\": null,\n      \"repeatIteration\": null,\n      \"repeatRowId\": null,\n      \"showTitle\": true,\n      \"title\": \"Buffer Pools\",\n      \"titleSize\": \"h6\"\n    }\n  ],\n  \"refresh\": \"15m\",\n  \"schemaVersion\": 22,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"dev-spaces\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"allFormat\": \"glob\",\n        \"allValue\": null,\n        \"current\": {\n          \"text\": \"10.128.2.176:8087\",\n          \"value\": \"10.128.2.176:8087\"\n        },\n        \"datasource\": null,\n        \"definition\": \"\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"index\": -1,\n        \"label\": \"Instance\",\n        \"multi\": false,\n        \"multiFormat\": \"glob\",\n        \"name\": \"instance\",\n        \"options\": [],\n        \"query\": \"label_values(jvm_memory_used_bytes, instance)\",\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-24h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"now\": true,\n    \"refresh_intervals\": [\n      \"5s\",\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"browser\",\n  \"title\": \"Che Server JVM\",\n  \"uid\": \"Jv-xDZrmk\",\n  \"variables\": {\n    \"list\": []\n  },\n  \"version\": 1\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-distributed/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-infrastructures-parent</artifactId>\n        <groupId>org.eclipse.che.infrastructure</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>infrastructure-distributed</artifactId>\n    <packaging>jar</packaging>\n    <name>Infrastructure :: Distributed components</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.infrastructure</groupId>\n            <artifactId>infrastructure-kubernetes</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.jgroups</groupId>\n            <artifactId>jgroups</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "infrastructures/infrastructure-distributed/src/main/java/org/eclipse/che/multiuser/api/distributed/WorkspaceStopPropagator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.distributed;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.multiuser.api.distributed.cache.JGroupsWorkspaceStatusCache;\nimport org.eclipse.che.multiuser.api.distributed.cache.StatusChangeListener;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.event.KubernetesRuntimeStoppedEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.event.KubernetesRuntimeStoppingEvent;\n\n/**\n * Propagate workspace status changes.\n *\n * <p>It's needed to synchronize interrupt/stop operations between Che Servers instances. There can\n * be two Che Servers in case of Rolling Update.\n *\n * @author Sergii Leshchenko\n * @see org.eclipse.che.workspace.infrastructure.kubernetes.StartSynchronizer\n */\n@Singleton\npublic class WorkspaceStopPropagator implements StatusChangeListener {\n\n  private final EventService eventService;\n\n  @Inject\n  public WorkspaceStopPropagator(\n      EventService eventService, JGroupsWorkspaceStatusCache statusCache) {\n    this.eventService = eventService;\n    statusCache.subscribe(this);\n  }\n\n  @Override\n  public void statusChanged(String workspaceId, WorkspaceStatus status) {\n    switch (status) {\n      case STOPPING:\n        // is supposed to notify start synchronizer that workspace is stopping\n        // so, if runtime is starting then start will be interrupted\n        eventService.publish(new KubernetesRuntimeStoppingEvent(workspaceId));\n        break;\n      case STOPPED:\n        // is supposed to notify start synchronizer that workspace is stopped\n        // so, if runtime start was interrupting then interruption will be considered as finished\n        eventService.publish(new KubernetesRuntimeStoppedEvent(workspaceId));\n        break;\n      default:\n        // there is no needed to publish other statuses\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-distributed/src/main/java/org/eclipse/che/multiuser/api/distributed/cache/JGroupsWorkspaceStatusCache.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.distributed.cache;\n\nimport java.io.IOException;\nimport java.util.HashMap;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.workspace.server.WorkspaceStatusCache;\nimport org.jgroups.JChannel;\nimport org.jgroups.blocks.ReplicatedHashMap;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * JGroups based implementation of {@link WorkspaceStatusCache}.\n *\n * @author Anton Korneta\n */\n@Singleton\npublic class JGroupsWorkspaceStatusCache implements WorkspaceStatusCache {\n\n  private static final String CHANNEL_NAME = \"WorkspaceStateCache\";\n  private static final Logger LOG = LoggerFactory.getLogger(JGroupsWorkspaceStatusCache.class);\n\n  private final ReplicatedHashMap<String, WorkspaceStatus> delegate;\n\n  @Inject\n  public JGroupsWorkspaceStatusCache(@Named(\"jgroups.config.file\") String confFile) {\n    try {\n      JChannel channel = new JChannel(confFile).connect(CHANNEL_NAME);\n      delegate = new ReplicatedHashMap<>(channel);\n      delegate.setBlockingUpdates(true);\n      delegate.start(5000);\n    } catch (Exception ex) {\n      throw new RuntimeException(\"Jgroups cache creation failed. Cause :\" + ex.getMessage());\n    }\n  }\n\n  @Override\n  public WorkspaceStatus get(String workspaceId) {\n    return delegate.get(workspaceId);\n  }\n\n  @Override\n  public WorkspaceStatus replace(String workspaceId, WorkspaceStatus newStatus) {\n    return delegate.replace(workspaceId, newStatus);\n  }\n\n  @Override\n  public boolean replace(\n      String workspaceId, WorkspaceStatus prevStatus, WorkspaceStatus newStatus) {\n    return delegate.replace(workspaceId, prevStatus, newStatus);\n  }\n\n  @Override\n  public WorkspaceStatus remove(String workspaceId) {\n    return delegate.remove(workspaceId);\n  }\n\n  @Override\n  public WorkspaceStatus putIfAbsent(String workspaceId, WorkspaceStatus status) {\n    return delegate.putIfAbsent(workspaceId, status);\n  }\n\n  @Override\n  public Map<String, WorkspaceStatus> asMap() {\n    return new HashMap<>(delegate);\n  }\n\n  /**\n   * Subscribes status changes listener.\n   *\n   * @param listener listener instance that will receive status changed events\n   */\n  public void subscribe(StatusChangeListener listener) {\n    delegate.addNotifier(\n        new ReplicatedMapNotificationAdapter() {\n          @Override\n          public void entrySet(Object workspaceId, Object workspaceStatus) {\n            listener.statusChanged((String) workspaceId, (WorkspaceStatus) workspaceStatus);\n          }\n\n          @Override\n          public void entryRemoved(Object workspaceId) {\n            listener.statusChanged((String) workspaceId, WorkspaceStatus.STOPPED);\n          }\n        });\n  }\n\n  /** Stops workspace status cache. */\n  public void shutdown() {\n    try {\n      delegate.close();\n    } catch (IOException | RuntimeException ex) {\n      LOG.error(\"Failed to stop workspace status cache. Cause: \" + ex.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-distributed/src/main/java/org/eclipse/che/multiuser/api/distributed/cache/ReplicatedMapNotificationAdapter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.distributed.cache;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.jgroups.View;\nimport org.jgroups.blocks.ReplicatedHashMap;\n\n/**\n * <b>Purpose</b>: Provides an empty implementation of {@link ReplicatedHashMap.Notification}. Users\n * who do not require to be notified about all map changes can subclass this class and implement\n * only the methods required.\n *\n * @author Sergii Leshchenko\n */\npublic class ReplicatedMapNotificationAdapter implements ReplicatedHashMap.Notification {\n  @Override\n  public void entrySet(Object key, Object value) {}\n\n  @Override\n  public void entryRemoved(Object key) {}\n\n  @Override\n  public void contentsSet(Map new_entries) {}\n\n  @Override\n  public void contentsCleared() {}\n\n  @Override\n  public void viewChange(View view, List mbrs_joined, List mbrs_left) {}\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-distributed/src/main/java/org/eclipse/che/multiuser/api/distributed/cache/StatusChangeListener.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.distributed.cache;\n\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\n\n/**\n * Listener interface for being notified about workspace status changes in {@link\n * JGroupsWorkspaceStatusCache}.\n *\n * <p>Note that JGroupsWorkspaceStatusCache is distributed cache and listener will receiver changes\n * that are made by this instance or any another is a cluster.\n *\n * @author Sergii Leshchenko\n */\npublic interface StatusChangeListener {\n  void statusChanged(String workspaceId, WorkspaceStatus status);\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-distributed/src/main/java/org/eclipse/che/multiuser/api/distributed/lock/JGroupsWorkspaceLockService.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.distributed.lock;\n\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport java.util.concurrent.locks.Lock;\nimport javax.inject.Named;\nimport org.eclipse.che.api.workspace.server.WorkspaceLockService;\nimport org.eclipse.che.commons.lang.concurrent.Unlocker;\nimport org.jgroups.JChannel;\nimport org.jgroups.blocks.locking.LockService;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * JGroups based implementation of {@link WorkspaceLockService}.\n *\n * @author Anton Korneta\n */\n@Singleton\npublic class JGroupsWorkspaceLockService implements WorkspaceLockService {\n  private static final Logger LOG = LoggerFactory.getLogger(JGroupsWorkspaceLockService.class);\n\n  private static final String CHANNEL_NAME = \"WorkspaceLocks\";\n\n  private final LockService lockService;\n  private final JChannel channel;\n\n  @Inject\n  public JGroupsWorkspaceLockService(@Named(\"jgroups.config.file\") String confFile) {\n    try {\n      this.channel = new JChannel(confFile);\n      this.lockService = new LockService(channel);\n      channel.connect(CHANNEL_NAME);\n    } catch (Exception ex) {\n      throw new RuntimeException(ex);\n    }\n  }\n\n  @Override\n  public Unlocker readLock(String key) {\n    // JGroups lock service does not contain an associated pair of read/write locks, that's why\n    // there no way provide a reliable version of a read lock.\n    return writeLock(key);\n  }\n\n  @Override\n  public Unlocker writeLock(String key) {\n    final Lock lock = lockService.getLock(key);\n    lock.lock();\n    return new UnlockerImpl(lock);\n  }\n\n  private class UnlockerImpl implements Unlocker {\n    private final Lock lock;\n\n    public UnlockerImpl(Lock lock) {\n      this.lock = lock;\n    }\n\n    @Override\n    public void unlock() {\n      lock.unlock();\n    }\n  }\n\n  /** Stops the workspace lock service. */\n  public void shutdown() {\n    try {\n      channel.close();\n    } catch (RuntimeException ex) {\n      LOG.error(\"Failed to stop workspace locks service. Cause: \" + ex.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-distributed/src/main/java/org/eclipse/che/multiuser/api/distributed/subscription/DistributedRemoteSubscriptionStorage.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.distributed.subscription;\n\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport com.google.inject.Singleton;\nimport java.util.Collections;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.locks.Lock;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.notification.RemoteSubscriptionContext;\nimport org.eclipse.che.api.core.notification.RemoteSubscriptionStorage;\nimport org.jgroups.JChannel;\nimport org.jgroups.blocks.ReplicatedHashMap;\nimport org.jgroups.blocks.locking.LockService;\nimport org.slf4j.Logger;\n\n/**\n * Replicated map-based implementation of {@link RemoteSubscriptionStorage}\n *\n * @author Max Shaposhnik (mshaposh@redhat.com)\n */\n@Singleton\npublic class DistributedRemoteSubscriptionStorage implements RemoteSubscriptionStorage {\n\n  private static final Logger LOG = getLogger(DistributedRemoteSubscriptionStorage.class);\n\n  private static final String CHANNEL_NAME = \"RemoteSubscriptionChannel\";\n\n  private final ReplicatedHashMap<String, Set<RemoteSubscriptionContext>> subscriptions;\n  private final LockService lockService;\n  private final JChannel channel;\n\n  @Inject\n  public DistributedRemoteSubscriptionStorage(@Named(\"jgroups.config.file\") String confFile)\n      throws Exception {\n    try {\n      channel = new JChannel(confFile);\n      this.lockService = new LockService(channel);\n      channel.connect(CHANNEL_NAME);\n      subscriptions = new ReplicatedHashMap<>(channel);\n      subscriptions.setBlockingUpdates(true);\n      subscriptions.start(5000);\n    } catch (Exception e) {\n      LOG.error(\"Unable to create distributed event subscriptions map.\", e);\n      throw e;\n    }\n  }\n\n  @Override\n  public Set<RemoteSubscriptionContext> getByMethod(String method) {\n    return subscriptions.getOrDefault(method, Collections.emptySet());\n  }\n\n  @Override\n  public void addSubscription(String method, RemoteSubscriptionContext remoteSubscriptionContext) {\n    Lock lock = lockService.getLock(method);\n    lock.lock();\n    try {\n      Set<RemoteSubscriptionContext> existing =\n          subscriptions.getOrDefault(method, ConcurrentHashMap.newKeySet(1));\n      existing.add(remoteSubscriptionContext);\n      subscriptions.put(method, existing);\n    } finally {\n      lock.unlock();\n    }\n  }\n\n  @Override\n  public void removeSubscription(String method, String endpointId) {\n    Lock lock = lockService.getLock(method);\n    lock.lock();\n    try {\n      Set<RemoteSubscriptionContext> existing = subscriptions.get(method);\n      if (existing == null) {\n        return;\n      }\n      existing.removeIf(\n          remoteSubscriptionContext ->\n              Objects.equals(remoteSubscriptionContext.getEndpointId(), endpointId));\n      if (existing.isEmpty()) {\n        subscriptions.remove(method);\n      } else {\n        subscriptions.put(method, existing);\n      }\n    } finally {\n      lock.unlock();\n    }\n  }\n\n  /** Stops remote subscription storage. */\n  public void shutdown() {\n    try {\n      channel.close();\n    } catch (RuntimeException ex) {\n      LOG.error(\"Failed to stop remote subscription storage. Cause: \" + ex.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-distributed/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n%nopex</pattern>\n        </encoder>\n    </appender>\n    <appender name=\"file\" class=\"ch.qos.logback.core.FileAppender\">\n        <File>target/log/test.log</File>\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n\n    <root level=\"ERROR\">\n        <appender-ref ref=\"stdout\"/>\n        <appender-ref ref=\"file\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "infrastructures/infrastructure-factory/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-infrastructures-parent</artifactId>\n        <groupId>org.eclipse.che.infrastructure</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>infrastructure-factory</artifactId>\n    <packaging>jar</packaging>\n    <name>Infrastructure :: Factory components</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-client-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-model-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.infrastructure</groupId>\n            <artifactId>infrastructure-kubernetes</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/KubernetesScmModule.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\nimport com.google.inject.AbstractModule;\nimport org.eclipse.che.api.factory.server.scm.kubernetes.KubernetesAuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.kubernetes.KubernetesGitCredentialManager;\nimport org.eclipse.che.api.factory.server.scm.kubernetes.KubernetesPersonalAccessTokenManager;\n\npublic class KubernetesScmModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    bind(GitCredentialManager.class).to(KubernetesGitCredentialManager.class);\n    bind(PersonalAccessTokenManager.class).to(KubernetesPersonalAccessTokenManager.class);\n    bind(AuthorisationRequestManager.class).to(KubernetesAuthorisationRequestManager.class);\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesAuthorisationRequestManager.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.kubernetes;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.commons.lang.UrlUtils.getParameter;\nimport static org.eclipse.che.commons.lang.UrlUtils.getQueryParametersFromState;\nimport static org.eclipse.che.commons.lang.UrlUtils.getRequestUrl;\nimport static org.eclipse.che.commons.lang.UrlUtils.getState;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.PREFERENCES_CONFIGMAP_NAME;\n\nimport com.google.gson.Gson;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.dsl.base.PatchContext;\nimport io.fabric8.kubernetes.client.dsl.base.PatchType;\nimport jakarta.ws.rs.core.UriInfo;\nimport java.net.URL;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Store and retrieve rejected authorisation requests in the Kubernetes ConfigMap. */\n@Singleton\npublic class KubernetesAuthorisationRequestManager implements AuthorisationRequestManager {\n  private static final Logger LOG =\n      LoggerFactory.getLogger(KubernetesAuthorisationRequestManager.class);\n\n  private final KubernetesNamespaceFactory namespaceFactory;\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  private static final String SKIP_AUTHORISATION_MAP_KEY = \"skip-authorisation\";\n\n  @Inject\n  public KubernetesAuthorisationRequestManager(\n      KubernetesNamespaceFactory namespaceFactory,\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory) {\n    this.namespaceFactory = namespaceFactory;\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n  }\n\n  @Override\n  public void store(String scmProviderName) {\n    if (isStored(scmProviderName)) {\n      return;\n    }\n    ConfigMap configMap = getConfigMap();\n    HashSet<String> fromJson = getSkipAuthorisationValues();\n    fromJson.add(scmProviderName);\n\n    configMap.setData(Map.of(SKIP_AUTHORISATION_MAP_KEY, fromJson.toString()));\n\n    patchConfigMap(configMap);\n  }\n\n  @Override\n  public void remove(String scmProviderName) {\n    if (!isStored(scmProviderName)) {\n      return;\n    }\n    ConfigMap configMap = getConfigMap();\n    HashSet<String> fromJson = getSkipAuthorisationValues();\n    fromJson.remove(scmProviderName);\n\n    configMap.setData(Map.of(SKIP_AUTHORISATION_MAP_KEY, fromJson.toString()));\n\n    patchConfigMap(configMap);\n  }\n\n  @Override\n  public boolean isStored(String scmProviderName) {\n    try {\n      return getSkipAuthorisationValues().contains(scmProviderName);\n    } catch (Exception e) {\n      // In environments where the Kubernetes configmap cannot be read (e.g. when running\n      // che-server standalone without a properly configured service account), treat the\n      // preference as \"not stored\" so the factory resolver can continue processing.\n      LOG.debug(\n          \"Cannot read authorisation preferences configmap ({}); defaulting to false.\",\n          e.getMessage());\n      return false;\n    }\n  }\n\n  @Override\n  public void callback(UriInfo uriInfo, List<String> errorValues) {\n    URL requestUrl = getRequestUrl(uriInfo);\n    Map<String, List<String>> params = getQueryParametersFromState(getState(requestUrl));\n    errorValues = errorValues == null ? uriInfo.getQueryParameters().get(\"error\") : errorValues;\n    if (errorValues != null && errorValues.contains(\"access_denied\")) {\n      String oauthProvider = getParameter(params, \"oauth_provider\");\n      if (!isNullOrEmpty(oauthProvider)) {\n        store(oauthProvider);\n      }\n    }\n  }\n\n  private ConfigMap getConfigMap() {\n    try (KubernetesClient kubernetesClient = cheServerKubernetesClientFactory.create()) {\n      String namespace = getFirstNamespace();\n      return kubernetesClient\n          .configMaps()\n          .inNamespace(namespace)\n          .withName(PREFERENCES_CONFIGMAP_NAME)\n          .get();\n    } catch (UnsatisfiedScmPreconditionException\n        | ScmConfigurationPersistenceException\n        | InfrastructureException e) {\n      throw new RuntimeException(e);\n    }\n  }\n\n  private void patchConfigMap(ConfigMap configMap) {\n    try (KubernetesClient kubernetesClient = cheServerKubernetesClientFactory.create()) {\n      kubernetesClient\n          .configMaps()\n          .inNamespace(getFirstNamespace())\n          .withName(PREFERENCES_CONFIGMAP_NAME)\n          .patch(PatchContext.of(PatchType.STRATEGIC_MERGE), configMap);\n    } catch (UnsatisfiedScmPreconditionException\n        | ScmConfigurationPersistenceException\n        | InfrastructureException e) {\n      throw new RuntimeException(e);\n    }\n  }\n\n  private HashSet<String> getSkipAuthorisationValues() {\n    String data = getConfigMap().getData().get(SKIP_AUTHORISATION_MAP_KEY);\n    return new Gson().fromJson(isNullOrEmpty(data) ? \"[]\" : data, HashSet.class);\n  }\n\n  private String getFirstNamespace()\n      throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException {\n    try {\n      return namespaceFactory.list().stream()\n          .map(KubernetesNamespaceMeta::getName)\n          .findFirst()\n          .orElseThrow(\n              () ->\n                  new UnsatisfiedScmPreconditionException(\n                      \"No user namespace found. Cannot read SCM credentials.\"));\n    } catch (InfrastructureException e) {\n      throw new ScmConfigurationPersistenceException(e.getMessage(), e);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesGitCredentialManager.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.kubernetes;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher.OAUTH_2_PREFIX;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_AUTOMOUNT;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_DEV_WORKSPACE_MOUNT_PATH;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_GIT_CREDENTIALS;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_AS;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_PATH;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.DEV_WORKSPACE_PREFIX;\n\nimport com.google.common.collect.ImmutableMap;\nimport com.google.common.net.PercentEscaper;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.net.URLEncoder;\nimport java.util.Base64;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.scm.GitCredentialManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.commons.lang.StringUtils;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\n\n/**\n * Creates or updates Git credentials secret in user's namespace to allow Git operations on private\n * repositories.\n */\n@Singleton\npublic class KubernetesGitCredentialManager implements GitCredentialManager {\n  public static final String NAME_PATTERN = \"git-credentials-secret-\";\n  public static final String ANNOTATION_SCM_URL = \"che.eclipse.org/scm-url\";\n  public static final String ANNOTATION_SCM_USERNAME = \"che.eclipse.org/scm-username\";\n  public static final String ANNOTATION_CHE_USERID = \"che.eclipse.org/che-userid\";\n  public static final String CREDENTIALS_MOUNT_PATH = \"/.git-credentials\";\n  public static final String LABEL_DEV_WORKSPACE_CREDENTIAL =\n      DEV_WORKSPACE_PREFIX + \"/git-credential\";\n\n  public static final String LABEL_DEV_WORKSPACE_WATCH_SECRET =\n      \"controller.devfile.io/watch-secret\";\n\n  // Labels that that are use to search for already existing secret.\n  private static final Map<String, String> SEARCH_LABELS =\n      ImmutableMap.of(\n          \"app.kubernetes.io/part-of\", \"che.eclipse.org\",\n          \"app.kubernetes.io/component\", \"workspace-secret\");\n  // Labels that will be added to newly created secret.\n  private static final Map<String, String> NEW_SECRET_LABELS =\n      ImmutableMap.<String, String>builder()\n          .putAll(SEARCH_LABELS)\n          .put(LABEL_DEV_WORKSPACE_CREDENTIAL, \"true\")\n          .put(LABEL_DEV_WORKSPACE_WATCH_SECRET, \"true\")\n          .build();\n\n  static final Map<String, String> DEFAULT_SECRET_ANNOTATIONS =\n      ImmutableMap.of(\n          ANNOTATION_AUTOMOUNT, \"true\",\n          ANNOTATION_MOUNT_PATH, CREDENTIALS_MOUNT_PATH,\n          ANNOTATION_MOUNT_AS, \"file\",\n          ANNOTATION_GIT_CREDENTIALS, \"true\",\n          ANNOTATION_DEV_WORKSPACE_MOUNT_PATH, CREDENTIALS_MOUNT_PATH);\n\n  private final KubernetesNamespaceFactory namespaceFactory;\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n\n  @Inject\n  public KubernetesGitCredentialManager(\n      KubernetesNamespaceFactory namespaceFactory,\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory) {\n    this.namespaceFactory = namespaceFactory;\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n  }\n\n  @Override\n  public void createOrReplace(PersonalAccessToken personalAccessToken)\n      throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException {\n    try {\n      final String namespace = getFirstNamespace();\n      final KubernetesClient client = cheServerKubernetesClientFactory.create();\n      // to avoid duplicating secrets we try to reuse existing one by matching\n      // hostname/username if possible, and update it. Otherwise, create new one.\n      Optional<Secret> existing =\n          client\n              .secrets()\n              .inNamespace(namespace)\n              .withLabels(SEARCH_LABELS)\n              .list()\n              .getItems()\n              .stream()\n              .filter(s -> s.getMetadata().getAnnotations() != null)\n              .filter(\n                  s ->\n                      Boolean.parseBoolean(\n                              s.getMetadata().getAnnotations().get(ANNOTATION_GIT_CREDENTIALS))\n                          && personalAccessToken\n                              .getScmProviderUrl()\n                              .equals(\n                                  StringUtils.trimEnd(\n                                      s.getMetadata().getAnnotations().get(ANNOTATION_SCM_URL),\n                                      '/'))\n                          && personalAccessToken\n                              .getCheUserId()\n                              .equals(s.getMetadata().getAnnotations().get(ANNOTATION_CHE_USERID)))\n              .findFirst();\n\n      Secret secret =\n          existing.orElseGet(\n              () -> {\n                Map<String, String> annotations = new HashMap<>(DEFAULT_SECRET_ANNOTATIONS);\n                annotations.put(ANNOTATION_SCM_URL, personalAccessToken.getScmProviderUrl());\n                annotations.put(ANNOTATION_CHE_USERID, personalAccessToken.getCheUserId());\n                ObjectMeta meta =\n                    new ObjectMetaBuilder()\n                        .withName(NameGenerator.generate(NAME_PATTERN, 5))\n                        .withAnnotations(annotations)\n                        .withLabels(NEW_SECRET_LABELS)\n                        .build();\n                return new SecretBuilder().withMetadata(meta).build();\n              });\n      URL scmUrl = new URL(personalAccessToken.getScmProviderUrl());\n      secret.setData(\n          Map.of(\n              \"credentials\",\n              Base64.getEncoder()\n                  .encodeToString(\n                      format(\n                              \"%s://%s:%s@%s%s\",\n                              scmUrl.getProtocol(),\n                              getUsernameSegment(personalAccessToken),\n                              URLEncoder.encode(personalAccessToken.getToken(), UTF_8),\n                              scmUrl.getHost(),\n                              scmUrl.getPort() != 80 && scmUrl.getPort() != -1\n                                  ? \":\" + scmUrl.getPort()\n                                  : \"\")\n                          .getBytes())));\n      client.secrets().inNamespace(namespace).createOrReplace(secret);\n    } catch (InfrastructureException | MalformedURLException e) {\n      throw new ScmConfigurationPersistenceException(e.getMessage(), e);\n    }\n  }\n\n  /**\n   * Returns username URL segment for git credentials. For OAuth2 tokens it is \"oauth2\", for others\n   * - {@param personalAccessToken#getScmUserName()} or just \"username\" string if the token has a\n   * non-null {@param personalAccessToken#getScmOrganization()}. This is needed to support providers\n   * that do not have username in their user object. Such providers have an additional organization\n   * field.\n   */\n  private String getUsernameSegment(PersonalAccessToken personalAccessToken) {\n    // Special characters are not allowed in URL username segment, so we need to escape them.\n    PercentEscaper percentEscaper = new PercentEscaper(\"\", false);\n    return personalAccessToken.getScmTokenName().startsWith(OAUTH_2_PREFIX)\n            // Most of the git providers work with git credentials with OAuth token in format\n            // \"ouath2:<oauth token>\"\n            // but bitbucket requires username to be explicitly set: \"<username>:<oauth token>\n            // TODO: needs to be moved to the specific bitbucket implementation.\n            && !personalAccessToken.getScmProviderName().equals(\"bitbucket\")\n        ? \"oauth2\"\n        : isNullOrEmpty(personalAccessToken.getScmOrganization())\n            ? percentEscaper.escape(personalAccessToken.getScmUserName())\n            : \"username\";\n  }\n\n  /**\n   * It is not guaranteed that this code will always return same namespace, but since credentials\n   * are now added into manually pre-created user namespace, we can expect always the same result\n   * will be returned.\n   */\n  private String getFirstNamespace()\n      throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException {\n    try {\n      Optional<String> namespace =\n          namespaceFactory.list().stream().map(KubernetesNamespaceMeta::getName).findFirst();\n      if (namespace.isEmpty()) {\n        throw new UnsatisfiedScmPreconditionException(\n            \"No user namespace found. Cannot read SCM credentials.\");\n      }\n      return namespace.get();\n    } catch (InfrastructureException e) {\n      throw new ScmConfigurationPersistenceException(e.getMessage(), e);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesPersonalAccessTokenManager.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.kubernetes;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.LabelSelector;\nimport io.fabric8.kubernetes.api.model.LabelSelectorBuilder;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.Base64;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.scm.GitCredentialManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenParams;\nimport org.eclipse.che.api.factory.server.scm.ScmPersonalAccessTokenFetcher;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Manages personal access token secrets used for private repositories authentication. */\n@Singleton\npublic class KubernetesPersonalAccessTokenManager implements PersonalAccessTokenManager {\n  public static final Map<String, String> SECRET_LABELS =\n      ImmutableMap.of(\n          \"app.kubernetes.io/part-of\", \"che.eclipse.org\",\n          \"app.kubernetes.io/component\", \"scm-personal-access-token\");\n  public static final LabelSelector KUBERNETES_PERSONAL_ACCESS_TOKEN_LABEL_SELECTOR =\n      new LabelSelectorBuilder().withMatchLabels(SECRET_LABELS).build();\n\n  public static final String NAME_PATTERN = \"personal-access-token-\";\n\n  public static final String ANNOTATION_CHE_USERID = \"che.eclipse.org/che-userid\";\n  public static final String ANNOTATION_SCM_PROVIDER_NAME = \"che.eclipse.org/scm-provider-name\";\n  public static final String ANNOTATION_SCM_ORGANIZATION = \"che.eclipse.org/scm-organization\";\n  public static final String ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_ID =\n      \"che.eclipse.org/scm-personal-access-token-id\";\n  public static final String ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME =\n      \"che.eclipse.org/scm-personal-access-token-name\";\n  public static final String ANNOTATION_SCM_URL = \"che.eclipse.org/scm-url\";\n  public static final String TOKEN_DATA_FIELD = \"token\";\n\n  private final KubernetesNamespaceFactory namespaceFactory;\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  private final ScmPersonalAccessTokenFetcher scmPersonalAccessTokenFetcher;\n  private final GitCredentialManager gitCredentialManager;\n\n  private static final Logger LOG =\n      LoggerFactory.getLogger(KubernetesPersonalAccessTokenManager.class);\n\n  @Inject\n  public KubernetesPersonalAccessTokenManager(\n      KubernetesNamespaceFactory namespaceFactory,\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory,\n      ScmPersonalAccessTokenFetcher scmPersonalAccessTokenFetcher,\n      GitCredentialManager gitCredentialManager) {\n    this.namespaceFactory = namespaceFactory;\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n    this.scmPersonalAccessTokenFetcher = scmPersonalAccessTokenFetcher;\n    this.gitCredentialManager = gitCredentialManager;\n  }\n\n  @Override\n  public void store(PersonalAccessToken personalAccessToken)\n      throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException {\n    try {\n      String namespace = getFirstNamespace();\n      ObjectMeta meta =\n          new ObjectMetaBuilder()\n              .withName(NameGenerator.generate(NAME_PATTERN, 5))\n              .withAnnotations(\n                  new ImmutableMap.Builder<String, String>()\n                      .put(ANNOTATION_CHE_USERID, personalAccessToken.getCheUserId())\n                      .put(ANNOTATION_SCM_URL, personalAccessToken.getScmProviderUrl())\n                      .put(ANNOTATION_SCM_PROVIDER_NAME, personalAccessToken.getScmProviderName())\n                      .put(\n                          ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_ID,\n                          personalAccessToken.getScmTokenId())\n                      .put(\n                          ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                          personalAccessToken.getScmTokenName())\n                      .build())\n              .withLabels(SECRET_LABELS)\n              .build();\n\n      Secret secret =\n          new SecretBuilder()\n              .withMetadata(meta)\n              .withData(\n                  Map.of(\n                      TOKEN_DATA_FIELD,\n                      Base64.getEncoder()\n                          .encodeToString(\n                              personalAccessToken.getToken().getBytes(StandardCharsets.UTF_8))))\n              .build();\n\n      cheServerKubernetesClientFactory\n          .create()\n          .secrets()\n          .inNamespace(namespace)\n          .createOrReplace(secret);\n    } catch (KubernetesClientException | InfrastructureException e) {\n      throw new ScmConfigurationPersistenceException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public void remove(String scmServerUrl) {\n    try {\n      for (KubernetesNamespaceMeta namespaceMeta : getKubernetesNamespaceMetas(null)) {\n        List<Secret> secrets = doGetPersonalAccessTokenSecrets(namespaceMeta);\n        Optional<Secret> optionalSecret =\n            secrets.stream()\n                .filter(\n                    secret ->\n                        isSecretMatchesSearchCriteria(\n                            EnvironmentContext.getCurrent().getSubject(),\n                            null,\n                            scmServerUrl,\n                            secret))\n                .findFirst();\n        if (optionalSecret.isPresent()\n            && isSecretMatchesSearchCriteria(\n                EnvironmentContext.getCurrent().getSubject(),\n                null,\n                scmServerUrl,\n                optionalSecret.get())) {\n          cheServerKubernetesClientFactory\n              .create()\n              .secrets()\n              .inNamespace(namespaceMeta.getName())\n              .delete(optionalSecret.get());\n        }\n      }\n    } catch (InfrastructureException | ScmConfigurationPersistenceException e) {\n      LOG.debug(\"Failed to remove personal access token\", e);\n    }\n  }\n\n  @Override\n  public PersonalAccessToken fetchAndSave(Subject cheUser, String scmServerUrl)\n      throws UnsatisfiedScmPreconditionException,\n          ScmConfigurationPersistenceException,\n          ScmUnauthorizedException,\n          ScmCommunicationException,\n          UnknownScmProviderException {\n    PersonalAccessToken personalAccessToken =\n        scmPersonalAccessTokenFetcher.fetchPersonalAccessToken(cheUser, scmServerUrl);\n    store(personalAccessToken);\n    return personalAccessToken;\n  }\n\n  @Override\n  public PersonalAccessToken get(String scmServerUrl)\n      throws ScmConfigurationPersistenceException,\n          ScmUnauthorizedException,\n          ScmCommunicationException,\n          UnknownScmProviderException,\n          UnsatisfiedScmPreconditionException {\n    Subject subject = EnvironmentContext.getCurrent().getSubject();\n    Optional<PersonalAccessToken> tokenOptional =\n        doGetPersonalAccessTokens(subject, null, scmServerUrl, null).stream().findFirst();\n    if (tokenOptional.isPresent()) {\n      return tokenOptional.get();\n    } else {\n      // try to authenticate for the given URL\n      return fetchAndSave(subject, scmServerUrl);\n    }\n  }\n\n  @Override\n  public Optional<PersonalAccessToken> get(\n      Subject cheUser,\n      String oAuthProviderName,\n      @Nullable String scmServerUrl,\n      @Nullable String namespaceName)\n      throws ScmConfigurationPersistenceException, ScmCommunicationException {\n    return doGetPersonalAccessTokens(cheUser, oAuthProviderName, scmServerUrl, namespaceName)\n        .stream()\n        .findFirst();\n  }\n\n  private List<PersonalAccessToken> doGetPersonalAccessTokens(\n      Subject cheUser,\n      @Nullable String oAuthProviderName,\n      @Nullable String scmServerUrl,\n      @Nullable String namespaceName)\n      throws ScmConfigurationPersistenceException, ScmCommunicationException {\n    List<PersonalAccessToken> result = new ArrayList<>();\n    try {\n      LOG.debug(\n          \"Fetching personal access token for user {} and OAuth provider {}\",\n          cheUser.getUserId(),\n          oAuthProviderName);\n\n      for (KubernetesNamespaceMeta namespaceMeta : getKubernetesNamespaceMetas(namespaceName)) {\n        List<Secret> secrets = doGetPersonalAccessTokenSecrets(namespaceMeta);\n\n        for (Secret secret : secrets) {\n          LOG.debug(\"Checking secret {}\", secret.getMetadata().getName());\n          if (deleteSecretIfMisconfigured(secret)) {\n            LOG.debug(\"Secret {} is misconfigured and was deleted\", secret.getMetadata().getName());\n            continue;\n          }\n\n          if (isSecretMatchesSearchCriteria(cheUser, oAuthProviderName, scmServerUrl, secret)) {\n            LOG.debug(\"Iterating over secret {}\", secret.getMetadata().getName());\n            PersonalAccessTokenParams personalAccessTokenParams =\n                this.secret2PersonalAccessTokenParams(secret);\n            Optional<String> scmUsername =\n                scmPersonalAccessTokenFetcher.getScmUsername(personalAccessTokenParams);\n\n            if (scmUsername.isPresent()) {\n              LOG.debug(\n                  \"Creating personal access token for user {} and OAuth provider {}\",\n                  cheUser.getUserId(),\n                  oAuthProviderName);\n              Map<String, String> secretAnnotations = secret.getMetadata().getAnnotations();\n\n              PersonalAccessToken personalAccessToken =\n                  new PersonalAccessToken(\n                      personalAccessTokenParams.getScmProviderUrl(),\n                      getScmProviderName(personalAccessTokenParams),\n                      secretAnnotations.get(ANNOTATION_CHE_USERID),\n                      personalAccessTokenParams.getOrganization(),\n                      scmUsername.get(),\n                      personalAccessTokenParams.getScmTokenName(),\n                      personalAccessTokenParams.getScmTokenId(),\n                      personalAccessTokenParams.getToken());\n              result.add(personalAccessToken);\n              continue;\n            }\n\n            // Removing token that is no longer valid. If several tokens exist the next one could\n            // be valid. If no valid token can be found, the caller should react in the same way\n            // as it reacts if no token exists. Usually, that means that process of new token\n            // retrieval would be initiated.\n            cheServerKubernetesClientFactory\n                .create()\n                .secrets()\n                .inNamespace(namespaceMeta.getName())\n                .delete(secret);\n            LOG.debug(\"Secret {} is misconfigured and was deleted\", secret.getMetadata().getName());\n          }\n        }\n      }\n    } catch (InfrastructureException | UnknownScmProviderException e) {\n      LOG.debug(\"Failed to get personal access token\", e);\n      throw new ScmConfigurationPersistenceException(e.getMessage(), e);\n    }\n    return result;\n  }\n\n  /**\n   * Returns the list of namespaces to search for the personal access token secrets.\n   *\n   * @param namespaceName the user's namespace name\n   */\n  private List<KubernetesNamespaceMeta> getKubernetesNamespaceMetas(@Nullable String namespaceName)\n      throws InfrastructureException {\n    if (namespaceName != null) {\n      return namespaceFactory\n          .fetchNamespace(namespaceName)\n          .map(List::of)\n          .orElseGet(Collections::emptyList);\n    } else {\n      return namespaceFactory.list();\n    }\n  }\n\n  private List<Secret> doGetPersonalAccessTokenSecrets(KubernetesNamespaceMeta namespaceMeta)\n      throws ScmConfigurationPersistenceException {\n    try {\n      List<Secret> secrets =\n          namespaceFactory\n              .access(null, namespaceMeta.getName())\n              .secrets()\n              .get(KUBERNETES_PERSONAL_ACCESS_TOKEN_LABEL_SELECTOR);\n\n      // sort secrets to get the newest one first\n      // Assign to new list to avoid UnsupportedOperationException (ImmutableList)\n      secrets =\n          secrets.stream()\n              .sorted(Comparator.comparing(secret -> secret.getMetadata().getCreationTimestamp()))\n              .collect(Collectors.toList());\n      Collections.reverse(secrets);\n      return secrets;\n    } catch (InfrastructureException e) {\n      LOG.debug(\"Failed to get personal access token secret\", e);\n      throw new ScmConfigurationPersistenceException(e.getMessage(), e);\n    }\n  }\n\n  /**\n   * Returns the name of the SCM provider. If the name is not set, the name of the token is used.\n   * This is used to support back compatibility with the old token secrets, which do not have the\n   * 'che.eclipse.org/scm-provider-name' annotation.\n   *\n   * @param params the parameters of the personal access token\n   * @return the name of the SCM provider\n   */\n  private String getScmProviderName(PersonalAccessTokenParams params) {\n    return isNullOrEmpty(params.getScmProviderName())\n        ? params.getScmTokenName()\n        : params.getScmProviderName();\n  }\n\n  private boolean deleteSecretIfMisconfigured(Secret secret) throws InfrastructureException {\n    Map<String, String> secretAnnotations = secret.getMetadata().getAnnotations();\n    LOG.debug(\"Secret annotations: {}\", secretAnnotations);\n    String configuredScmServerUrl = secretAnnotations.get(ANNOTATION_SCM_URL);\n    LOG.debug(\"SCM server URL: {}\", configuredScmServerUrl);\n    String configuredCheUserId = secretAnnotations.get(ANNOTATION_CHE_USERID);\n    LOG.debug(\"Che user ID: {}\", configuredCheUserId);\n    String configuredOAuthProviderName =\n        secretAnnotations.get(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME);\n    LOG.debug(\"OAuth provider name: {}\", configuredOAuthProviderName);\n\n    // if any of the required annotations is missing, the secret is not valid\n    if (isNullOrEmpty(configuredScmServerUrl)\n        || isNullOrEmpty(configuredCheUserId)\n        || isNullOrEmpty(configuredOAuthProviderName)) {\n      LOG.debug(\"deleting secret {}\", secret.getMetadata().getName());\n      cheServerKubernetesClientFactory\n          .create()\n          .secrets()\n          .inNamespace(secret.getMetadata().getNamespace())\n          .delete(secret);\n      return true;\n    }\n\n    return false;\n  }\n\n  private PersonalAccessTokenParams secret2PersonalAccessTokenParams(Secret secret) {\n    Map<String, String> secretAnnotations = secret.getMetadata().getAnnotations();\n\n    String token = new String(Base64.getDecoder().decode(secret.getData().get(\"token\"))).trim();\n    String configuredOAuthTokenName =\n        secretAnnotations.get(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME);\n    String configuredTokenId = secretAnnotations.get(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_ID);\n    String configuredScmOrganization = secretAnnotations.get(ANNOTATION_SCM_ORGANIZATION);\n    String configuredScmServerUrl = secretAnnotations.get(ANNOTATION_SCM_URL);\n    String configuredScmProviderName = secretAnnotations.get(ANNOTATION_SCM_PROVIDER_NAME);\n\n    return new PersonalAccessTokenParams(\n        trimEnd(configuredScmServerUrl, '/'),\n        configuredScmProviderName,\n        configuredOAuthTokenName,\n        configuredTokenId,\n        token,\n        configuredScmOrganization);\n  }\n\n  private boolean isSecretMatchesSearchCriteria(\n      Subject cheUser,\n      @Nullable String oAuthProviderName,\n      @Nullable String scmServerUrl,\n      Secret secret) {\n    Map<String, String> secretAnnotations = secret.getMetadata().getAnnotations();\n    String configuredScmServerUrl = secretAnnotations.get(ANNOTATION_SCM_URL);\n    String configuredCheUserId = secretAnnotations.get(ANNOTATION_CHE_USERID);\n    String configuredOAuthProviderName =\n        secretAnnotations.get(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME);\n\n    return (configuredCheUserId.equals(cheUser.getUserId()))\n        && (oAuthProviderName == null || oAuthProviderName.equals(configuredOAuthProviderName))\n        && (scmServerUrl == null\n            || trimEnd(configuredScmServerUrl, '/').equals(trimEnd(scmServerUrl, '/')));\n  }\n\n  @Override\n  public PersonalAccessToken getAndStore(String scmServerUrl)\n      throws ScmCommunicationException,\n          ScmConfigurationPersistenceException,\n          UnknownScmProviderException,\n          UnsatisfiedScmPreconditionException,\n          ScmUnauthorizedException {\n    PersonalAccessToken personalAccessToken = get(scmServerUrl);\n    gitCredentialManager.createOrReplace(personalAccessToken);\n    return personalAccessToken;\n  }\n\n  @Override\n  public void forceRefreshPersonalAccessToken(String scmServerUrl)\n      throws ScmUnauthorizedException,\n          ScmCommunicationException,\n          UnknownScmProviderException,\n          UnsatisfiedScmPreconditionException,\n          ScmConfigurationPersistenceException {\n    Subject subject = EnvironmentContext.getCurrent().getSubject();\n    PersonalAccessToken personalAccessToken =\n        scmPersonalAccessTokenFetcher.refreshPersonalAccessToken(subject, scmServerUrl);\n    gitCredentialManager.createOrReplace(personalAccessToken);\n    store(personalAccessToken);\n    removePreviousTokenSecretsIfPresent(scmServerUrl);\n  }\n\n  private void removePreviousTokenSecretsIfPresent(String scmServerUrl)\n      throws ScmConfigurationPersistenceException, UnsatisfiedScmPreconditionException {\n    try {\n      for (KubernetesNamespaceMeta namespaceMeta : namespaceFactory.list()) {\n        List<Secret> secrets = doGetPersonalAccessTokenSecrets(namespaceMeta);\n        for (int i = 1; i < secrets.size(); i++) {\n          Secret secret = secrets.get(i);\n          if (secret.getMetadata().getAnnotations().get(ANNOTATION_SCM_URL).equals(scmServerUrl)) {\n            cheServerKubernetesClientFactory\n                .create()\n                .secrets()\n                .inNamespace(getFirstNamespace())\n                .delete(secret);\n          }\n        }\n      }\n    } catch (InfrastructureException e) {\n      throw new ScmConfigurationPersistenceException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public void storeGitCredentials(String scmServerUrl)\n      throws UnsatisfiedScmPreconditionException,\n          ScmConfigurationPersistenceException,\n          ScmCommunicationException,\n          ScmUnauthorizedException {\n    Subject subject = EnvironmentContext.getCurrent().getSubject();\n    Optional<PersonalAccessToken> tokenOptional =\n        doGetPersonalAccessTokens(subject, null, scmServerUrl, null).stream().findFirst();\n    if (tokenOptional.isPresent()) {\n      PersonalAccessToken personalAccessToken = tokenOptional.get();\n      gitCredentialManager.createOrReplace(personalAccessToken);\n    }\n  }\n\n  private String getFirstNamespace()\n      throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException {\n    try {\n      return namespaceFactory.list().stream()\n          .map(KubernetesNamespaceMeta::getName)\n          .findFirst()\n          .orElseThrow(\n              () ->\n                  new UnsatisfiedScmPreconditionException(\n                      \"No user namespace found. Cannot read SCM credentials.\"));\n    } catch (InfrastructureException e) {\n      throw new ScmConfigurationPersistenceException(e.getMessage(), e);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-factory/src/test/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesAuthorisationRequestManagerTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.kubernetes;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.PREFERENCES_CONFIGMAP_NAME;\nimport static org.mockito.ArgumentMatchers.anyMap;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapList;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.dsl.MixedOperation;\nimport io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport java.util.Collections;\nimport java.util.Map;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.server.impls.KubernetesNamespaceMetaImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesAuthorisationRequestManagerTest {\n  @Mock private KubernetesNamespaceFactory namespaceFactory;\n\n  @Mock\n  private MixedOperation<ConfigMap, ConfigMapList, Resource<ConfigMap>> configMapsMixedOperation;\n\n  @Mock NonNamespaceOperation<ConfigMap, ConfigMapList, Resource<ConfigMap>> nonNamespaceOperation;\n\n  @Mock private Resource<ConfigMap> configMapResource;\n\n  @Mock private ConfigMap configMap;\n\n  @Mock private KubernetesClient kubeClient;\n\n  @Mock private CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n\n  private KubernetesAuthorisationRequestManager authorisationRequestManager;\n\n  @BeforeMethod\n  protected void init() throws Exception {\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(Collections.singletonList(meta));\n\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.configMaps()).thenReturn(configMapsMixedOperation);\n    when(configMapsMixedOperation.inNamespace(eq(meta.getName())))\n        .thenReturn(nonNamespaceOperation);\n    when(nonNamespaceOperation.withName(eq(PREFERENCES_CONFIGMAP_NAME)))\n        .thenReturn(configMapResource);\n    when(configMapResource.get()).thenReturn(configMap);\n\n    authorisationRequestManager =\n        new KubernetesAuthorisationRequestManager(\n            namespaceFactory, cheServerKubernetesClientFactory);\n  }\n\n  @Test\n  public void shouldStoreAuthorisationRequestToEmptyConfigMap() {\n    // given\n    ArgumentCaptor<Map<String, String>> captor = ArgumentCaptor.forClass(Map.class);\n\n    // when\n    authorisationRequestManager.store(\"test-provider\");\n\n    // then\n    verify(configMap).setData(captor.capture());\n    Map<String, String> value = captor.getValue();\n    assertEquals(value.get(\"skip-authorisation\"), \"[test-provider]\");\n  }\n\n  @Test\n  public void shouldStoreAuthorisationRequestToNonEmptyConfigMap() {\n    // given\n    when(configMap.getData()).thenReturn(Map.of(\"skip-authorisation\", \"[existing-provider]\"));\n    ArgumentCaptor<Map<String, String>> captor = ArgumentCaptor.forClass(Map.class);\n\n    // when\n    authorisationRequestManager.store(\"test-provider\");\n\n    // then\n    verify(configMap).setData(captor.capture());\n    Map<String, String> value = captor.getValue();\n    assertEquals(value.get(\"skip-authorisation\"), \"[test-provider, existing-provider]\");\n  }\n\n  @Test\n  public void shouldNotStoreAuthorisationRequestIfAlreadyStored() {\n    // given\n    when(configMap.getData()).thenReturn(Map.of(\"skip-authorisation\", \"[test-provider]\"));\n\n    // when\n    authorisationRequestManager.store(\"test-provider\");\n\n    // then\n    verify(configMap, never()).setData(anyMap());\n  }\n\n  @Test\n  public void shouldRemoveAuthorisationRequestFromNonEmptyConfigMap() {\n    // given\n    when(configMap.getData())\n        .thenReturn(Map.of(\"skip-authorisation\", \"[test-provider, existing-provider]\"));\n    ArgumentCaptor<Map<String, String>> captor = ArgumentCaptor.forClass(Map.class);\n\n    // when\n    authorisationRequestManager.remove(\"test-provider\");\n\n    // then\n    verify(configMap).setData(captor.capture());\n    Map<String, String> value = captor.getValue();\n    assertEquals(value.get(\"skip-authorisation\"), \"[existing-provider]\");\n  }\n\n  @Test\n  public void shouldRemoveAuthorisationRequestFromSingleValueConfigMap() {\n    // given\n    when(configMap.getData()).thenReturn(Map.of(\"skip-authorisation\", \"[test-provider]\"));\n    ArgumentCaptor<Map<String, String>> captor = ArgumentCaptor.forClass(Map.class);\n\n    // when\n    authorisationRequestManager.remove(\"test-provider\");\n\n    // then\n    verify(configMap).setData(captor.capture());\n    Map<String, String> value = captor.getValue();\n    assertEquals(value.get(\"skip-authorisation\"), \"[]\");\n  }\n\n  @Test\n  public void shouldNotRemoveAuthorisationRequestIfAlreadyRemoved() {\n    // given\n    when(configMap.getData()).thenReturn(Map.of(\"skip-authorisation\", \"[]\"));\n\n    // when\n    authorisationRequestManager.remove(\"test-provider\");\n\n    // then\n    verify(configMap, never()).setData(anyMap());\n  }\n\n  @Test\n  public void shouldReturnFalseAuthorisationRequestStateFromEmptyConfigMap() {\n    // when\n    boolean stored = authorisationRequestManager.isStored(\"test-provider\");\n\n    // then\n    assertFalse(stored);\n  }\n\n  @Test\n  public void shouldReturnFalseAuthorisationRequestStateFromNonEmptyConfigMap() {\n    // given\n    when(configMap.getData()).thenReturn(Map.of(\"skip-authorisation\", \"[existing-provider]\"));\n\n    // when\n    boolean stored = authorisationRequestManager.isStored(\"test-provider\");\n\n    // then\n    assertFalse(stored);\n  }\n\n  @Test\n  public void shouldReturnTrueAuthorisationRequestStateFromNonEmptyConfigMap() {\n    // given\n    when(configMap.getData())\n        .thenReturn(Map.of(\"skip-authorisation\", \"[existing-provider, test-provider]\"));\n\n    // when\n    boolean stored = authorisationRequestManager.isStored(\"test-provider\");\n\n    // then\n    assertTrue(stored);\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-factory/src/test/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesGitCredentialManagerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.kubernetes;\n\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.api.factory.server.scm.kubernetes.KubernetesGitCredentialManager.ANNOTATION_CHE_USERID;\nimport static org.eclipse.che.api.factory.server.scm.kubernetes.KubernetesGitCredentialManager.ANNOTATION_SCM_URL;\nimport static org.eclipse.che.api.factory.server.scm.kubernetes.KubernetesGitCredentialManager.DEFAULT_SECRET_ANNOTATIONS;\nimport static org.eclipse.che.api.factory.server.scm.kubernetes.KubernetesGitCredentialManager.NAME_PATTERN;\nimport static org.mockito.ArgumentMatchers.anyMap;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.api.model.SecretList;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable;\nimport io.fabric8.kubernetes.client.dsl.MixedOperation;\nimport io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport java.util.Base64;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.server.impls.KubernetesNamespaceMetaImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesGitCredentialManagerTest {\n\n  @Mock private KubernetesNamespaceFactory namespaceFactory;\n  @Mock private CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  @Mock private KubernetesClient kubeClient;\n\n  @Mock private MixedOperation<Secret, SecretList, Resource<Secret>> secretsMixedOperation;\n\n  @Mock NonNamespaceOperation<Secret, SecretList, Resource<Secret>> nonNamespaceOperation;\n\n  @Mock private FilterWatchListDeletable<Secret, SecretList, Resource<Secret>> filterWatchDeletable;\n\n  @Mock private SecretList secretList;\n\n  KubernetesGitCredentialManager kubernetesGitCredentialManager;\n\n  @BeforeMethod\n  protected void init() {\n    kubernetesGitCredentialManager =\n        new KubernetesGitCredentialManager(namespaceFactory, cheServerKubernetesClientFactory);\n    assertNotNull(this.kubernetesGitCredentialManager);\n  }\n\n  @Test\n  public void testCreateAndSaveNewPATGitCredential() throws Exception {\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(Collections.singletonList(meta));\n\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n    when(secretsMixedOperation.inNamespace(eq(meta.getName()))).thenReturn(nonNamespaceOperation);\n    when(nonNamespaceOperation.withLabels(anyMap())).thenReturn(filterWatchDeletable);\n    when(filterWatchDeletable.list()).thenReturn(secretList);\n    when(secretList.getItems()).thenReturn(emptyList());\n    ArgumentCaptor<Secret> captor = ArgumentCaptor.forClass(Secret.class);\n\n    PersonalAccessToken token =\n        new PersonalAccessToken(\n            \"https://bitbucket.com\",\n            \"provider\",\n            \"cheUser\",\n            \"username\",\n            \"token-name\",\n            \"tid-23434\",\n            \"token123\");\n\n    // when\n    kubernetesGitCredentialManager.createOrReplace(token);\n    // then\n    verify(nonNamespaceOperation).createOrReplace(captor.capture());\n    Secret createdSecret = captor.getValue();\n    assertNotNull(createdSecret);\n    assertEquals(\n        new String(Base64.getDecoder().decode(createdSecret.getData().get(\"credentials\"))),\n        \"https://username:token123@bitbucket.com\");\n    assertTrue(createdSecret.getMetadata().getName().startsWith(NAME_PATTERN));\n    assertFalse(createdSecret.getMetadata().getName().contains(token.getScmUserName()));\n  }\n\n  @Test\n  public void shouldUseHardcodedUsernameIfScmOrganizationIsDefined() throws Exception {\n    // given\n    KubernetesNamespaceMeta namespaceMeta = new KubernetesNamespaceMetaImpl(\"test\");\n    PersonalAccessToken token =\n        new PersonalAccessToken(\n            \"https://bitbucket-server.com:5648\",\n            \"cheUser\",\n            \"cheOrganization\",\n            \"username\",\n            \"token-name\",\n            \"tid-23434\",\n            \"token123\");\n\n    Map<String, String> annotations = new HashMap<>(DEFAULT_SECRET_ANNOTATIONS);\n\n    annotations.put(ANNOTATION_SCM_URL, token.getScmProviderUrl() + \"/\");\n    annotations.put(ANNOTATION_CHE_USERID, token.getCheUserId());\n    ObjectMeta objectMeta =\n        new ObjectMetaBuilder()\n            .withName(NameGenerator.generate(NAME_PATTERN, 5))\n            .withAnnotations(annotations)\n            .build();\n    Secret existing =\n        new SecretBuilder()\n            .withMetadata(objectMeta)\n            .withData(Map.of(\"credentials\", \"foo 123\"))\n            .build();\n\n    when(namespaceFactory.list()).thenReturn(Collections.singletonList(namespaceMeta));\n\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n    when(secretsMixedOperation.inNamespace(eq(namespaceMeta.getName())))\n        .thenReturn(nonNamespaceOperation);\n    when(nonNamespaceOperation.withLabels(anyMap())).thenReturn(filterWatchDeletable);\n    when(filterWatchDeletable.list()).thenReturn(secretList);\n    when(secretList.getItems()).thenReturn(singletonList(existing));\n\n    // when\n    kubernetesGitCredentialManager.createOrReplace(token);\n    // then\n    ArgumentCaptor<Secret> captor = ArgumentCaptor.forClass(Secret.class);\n    verify(nonNamespaceOperation).createOrReplace(captor.capture());\n    Secret createdSecret = captor.getValue();\n    assertNotNull(createdSecret);\n    assertEquals(\n        new String(Base64.getDecoder().decode(createdSecret.getData().get(\"credentials\"))),\n        \"https://username:token123@bitbucket-server.com:5648\");\n  }\n\n  @Test\n  public void testCreateAndSaveNewOAuthGitCredential() throws Exception {\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(Collections.singletonList(meta));\n\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n    when(secretsMixedOperation.inNamespace(eq(meta.getName()))).thenReturn(nonNamespaceOperation);\n    when(nonNamespaceOperation.withLabels(anyMap())).thenReturn(filterWatchDeletable);\n    when(filterWatchDeletable.list()).thenReturn(secretList);\n    when(secretList.getItems()).thenReturn(emptyList());\n    ArgumentCaptor<Secret> captor = ArgumentCaptor.forClass(Secret.class);\n\n    PersonalAccessToken token =\n        new PersonalAccessToken(\n            \"https://bitbucket.com\",\n            \"provider\",\n            \"cheUser\",\n            \"username\",\n            \"oauth2-token-name\",\n            \"tid-23434\",\n            \"token123\");\n\n    // when\n    kubernetesGitCredentialManager.createOrReplace(token);\n    // then\n    verify(nonNamespaceOperation).createOrReplace(captor.capture());\n    Secret createdSecret = captor.getValue();\n    assertNotNull(createdSecret);\n    assertEquals(\n        new String(Base64.getDecoder().decode(createdSecret.getData().get(\"credentials\"))),\n        \"https://oauth2:token123@bitbucket.com\");\n    assertTrue(createdSecret.getMetadata().getName().startsWith(NAME_PATTERN));\n    assertFalse(createdSecret.getMetadata().getName().contains(token.getScmUserName()));\n  }\n\n  @Test\n  public void testCreateAndSaveNewBitbucketOAuthGitCredential() throws Exception {\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(Collections.singletonList(meta));\n\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n    when(secretsMixedOperation.inNamespace(eq(meta.getName()))).thenReturn(nonNamespaceOperation);\n    when(nonNamespaceOperation.withLabels(anyMap())).thenReturn(filterWatchDeletable);\n    when(filterWatchDeletable.list()).thenReturn(secretList);\n    when(secretList.getItems()).thenReturn(emptyList());\n    ArgumentCaptor<Secret> captor = ArgumentCaptor.forClass(Secret.class);\n\n    PersonalAccessToken token =\n        new PersonalAccessToken(\n            \"https://bitbucket.com\",\n            \"bitbucket\",\n            \"cheUser\",\n            \"username\",\n            \"oauth2-token-name\",\n            \"tid-23434\",\n            \"token123\");\n\n    // when\n    kubernetesGitCredentialManager.createOrReplace(token);\n    // then\n    verify(nonNamespaceOperation).createOrReplace(captor.capture());\n    Secret createdSecret = captor.getValue();\n    assertNotNull(createdSecret);\n    assertEquals(\n        new String(Base64.getDecoder().decode(createdSecret.getData().get(\"credentials\"))),\n        \"https://username:token123@bitbucket.com\");\n    assertTrue(createdSecret.getMetadata().getName().startsWith(NAME_PATTERN));\n    assertFalse(createdSecret.getMetadata().getName().contains(token.getScmUserName()));\n  }\n\n  @Test\n  public void testUpdateTokenInExistingCredential() throws Exception {\n    KubernetesNamespaceMeta namespaceMeta = new KubernetesNamespaceMetaImpl(\"test\");\n    PersonalAccessToken token =\n        new PersonalAccessToken(\n            \"https://bitbucket.com:5648\",\n            \"provider\",\n            \"cheUser\",\n            \"username\",\n            \"token-name\",\n            \"tid-23434\",\n            \"token123\");\n\n    Map<String, String> annotations = new HashMap<>(DEFAULT_SECRET_ANNOTATIONS);\n\n    annotations.put(ANNOTATION_SCM_URL, token.getScmProviderUrl() + \"/\");\n    annotations.put(ANNOTATION_CHE_USERID, token.getCheUserId());\n    ObjectMeta objectMeta =\n        new ObjectMetaBuilder()\n            .withName(NameGenerator.generate(NAME_PATTERN, 5))\n            .withAnnotations(annotations)\n            .build();\n    Secret existing =\n        new SecretBuilder()\n            .withMetadata(objectMeta)\n            .withData(Map.of(\"credentials\", \"foo 123\"))\n            .build();\n\n    when(namespaceFactory.list()).thenReturn(Collections.singletonList(namespaceMeta));\n\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n    when(secretsMixedOperation.inNamespace(eq(namespaceMeta.getName())))\n        .thenReturn(nonNamespaceOperation);\n    when(nonNamespaceOperation.withLabels(anyMap())).thenReturn(filterWatchDeletable);\n    when(filterWatchDeletable.list()).thenReturn(secretList);\n    when(secretList.getItems()).thenReturn(singletonList(existing));\n\n    // when\n    kubernetesGitCredentialManager.createOrReplace(token);\n    // then\n    ArgumentCaptor<Secret> captor = ArgumentCaptor.forClass(Secret.class);\n    verify(nonNamespaceOperation).createOrReplace(captor.capture());\n    Secret createdSecret = captor.getValue();\n    assertNotNull(createdSecret);\n    assertEquals(\n        new String(Base64.getDecoder().decode(createdSecret.getData().get(\"credentials\"))),\n        \"https://username:token123@bitbucket.com:5648\");\n    assertEquals(createdSecret.getMetadata().getName(), objectMeta.getName());\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-factory/src/test/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesPersonalAccessTokenManagerTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.kubernetes;\n\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.api.factory.server.scm.kubernetes.KubernetesPersonalAccessTokenManager.*;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.LabelSelector;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.api.model.SecretList;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.dsl.MixedOperation;\nimport io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport java.util.Arrays;\nimport java.util.Base64;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.eclipse.che.api.factory.server.scm.GitCredentialManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenParams;\nimport org.eclipse.che.api.factory.server.scm.ScmPersonalAccessTokenFetcher;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.server.impls.KubernetesNamespaceMetaImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesSecrets;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.stubbing.Answer;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesPersonalAccessTokenManagerTest {\n\n  @Mock private KubernetesNamespaceFactory namespaceFactory;\n  @Mock private CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  @Mock private ScmPersonalAccessTokenFetcher scmPersonalAccessTokenFetcher;\n\n  @Mock private KubernetesClient kubeClient;\n  @Mock private GitCredentialManager gitCredentialManager;\n\n  @Mock private MixedOperation<Secret, SecretList, Resource<Secret>> secretsMixedOperation;\n\n  @Mock NonNamespaceOperation<Secret, SecretList, Resource<Secret>> nonNamespaceOperation;\n\n  KubernetesPersonalAccessTokenManager personalAccessTokenManager;\n\n  @BeforeMethod\n  protected void init() {\n    personalAccessTokenManager =\n        new KubernetesPersonalAccessTokenManager(\n            namespaceFactory,\n            cheServerKubernetesClientFactory,\n            scmPersonalAccessTokenFetcher,\n            gitCredentialManager);\n    assertNotNull(this.personalAccessTokenManager);\n  }\n\n  @Test\n  public void shouldTrimBlankCharsInToken() throws Exception {\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(singletonList(meta));\n    KubernetesNamespace kubernetesnamespace = Mockito.mock(KubernetesNamespace.class);\n    KubernetesSecrets secrets = Mockito.mock(KubernetesSecrets.class);\n    when(namespaceFactory.access(eq(null), eq(meta.getName()))).thenReturn(kubernetesnamespace);\n    when(kubernetesnamespace.secrets()).thenReturn(secrets);\n    when(scmPersonalAccessTokenFetcher.getScmUsername(any(PersonalAccessTokenParams.class)))\n        .thenReturn(Optional.of(\"user\"));\n\n    Map<String, String> data =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\" token_value \\n\".getBytes(UTF_8)));\n\n    ObjectMeta meta1 =\n        new ObjectMetaBuilder()\n            .withCreationTimestamp(\"2021-07-01T12:00:00Z\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host1\"))\n            .build();\n\n    Secret secret = new SecretBuilder().withMetadata(meta1).withData(data).build();\n\n    when(secrets.get(any(LabelSelector.class))).thenReturn(List.of(secret));\n\n    // when\n    PersonalAccessToken token =\n        personalAccessTokenManager\n            .get(\n                new SubjectImpl(\"user\", Collections.emptyList(), \"user\", \"t1\", false),\n                null,\n                \"http://host1\",\n                null)\n            .get();\n\n    // then\n    assertEquals(token.getToken(), \"token_value\");\n  }\n\n  @Test\n  public void testSavingOfPersonalAccessToken() throws Exception {\n\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(singletonList(meta));\n\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n    when(secretsMixedOperation.inNamespace(eq(meta.getName()))).thenReturn(nonNamespaceOperation);\n    ArgumentCaptor<Secret> captor = ArgumentCaptor.forClass(Secret.class);\n\n    PersonalAccessToken token =\n        new PersonalAccessToken(\n            \"https://bitbucket.com\",\n            \"provider\",\n            \"cheUser\",\n            \"username\",\n            \"token-name\",\n            \"tid-24\",\n            \"token123\");\n\n    // when\n    personalAccessTokenManager.store(token);\n\n    // then\n    verify(nonNamespaceOperation).createOrReplace(captor.capture());\n    Secret createdSecret = captor.getValue();\n    assertNotNull(createdSecret);\n    assertTrue(\n        createdSecret\n            .getMetadata()\n            .getName()\n            .startsWith(KubernetesPersonalAccessTokenManager.NAME_PATTERN));\n    assertEquals(\n        createdSecret.getData().get(\"token\"),\n        Base64.getEncoder().encodeToString(token.getToken().getBytes()));\n  }\n\n  @Test\n  public void testGetTokenFromNamespace() throws Exception {\n\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(singletonList(meta));\n    KubernetesNamespace kubernetesnamespace = Mockito.mock(KubernetesNamespace.class);\n    KubernetesSecrets secrets = Mockito.mock(KubernetesSecrets.class);\n    when(namespaceFactory.access(eq(null), eq(meta.getName()))).thenReturn(kubernetesnamespace);\n    when(kubernetesnamespace.secrets()).thenReturn(secrets);\n    when(scmPersonalAccessTokenFetcher.getScmUsername(any(PersonalAccessTokenParams.class)))\n        .thenReturn(Optional.of(\"user\"));\n\n    Map<String, String> data1 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token1\".getBytes(UTF_8)));\n    Map<String, String> data2 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token2\".getBytes(UTF_8)));\n    Map<String, String> data3 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token3\".getBytes(UTF_8)));\n\n    ObjectMeta meta1 =\n        new ObjectMetaBuilder()\n            .withCreationTimestamp(\"2021-07-01T12:00:00Z\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user1\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host1\"))\n            .build();\n    ObjectMeta meta2 =\n        new ObjectMetaBuilder()\n            .withCreationTimestamp(\"2021-07-02T12:00:00Z\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user1\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host2\"))\n            .build();\n    ObjectMeta meta3 =\n        new ObjectMetaBuilder()\n            .withCreationTimestamp(\"2021-07-03T12:00:00Z\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user2\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host3\"))\n            .build();\n\n    Secret secret1 = new SecretBuilder().withMetadata(meta1).withData(data1).build();\n    Secret secret2 = new SecretBuilder().withMetadata(meta2).withData(data2).build();\n    Secret secret3 = new SecretBuilder().withMetadata(meta3).withData(data3).build();\n\n    when(secrets.get(any(LabelSelector.class)))\n        .thenReturn(Arrays.asList(secret1, secret2, secret3));\n\n    // when\n    PersonalAccessToken token =\n        personalAccessTokenManager\n            .get(\n                new SubjectImpl(\"user\", Collections.emptyList(), \"user1\", \"t1\", false),\n                null,\n                \"http://host1\",\n                null)\n            .get();\n\n    // then\n    assertEquals(token.getCheUserId(), \"user1\");\n    assertEquals(token.getScmProviderUrl(), \"http://host1\");\n    assertEquals(token.getToken(), \"token1\");\n  }\n\n  @Test\n  public void shouldGetTokenFromASecretWithSCMUsername() throws Exception {\n\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(singletonList(meta));\n    KubernetesNamespace kubernetesnamespace = Mockito.mock(KubernetesNamespace.class);\n    KubernetesSecrets secrets = Mockito.mock(KubernetesSecrets.class);\n    when(namespaceFactory.access(eq(null), eq(meta.getName()))).thenReturn(kubernetesnamespace);\n    when(kubernetesnamespace.secrets()).thenReturn(secrets);\n    when(scmPersonalAccessTokenFetcher.getScmUsername(any(PersonalAccessTokenParams.class)))\n        .thenReturn(Optional.of(\"user\"));\n\n    Map<String, String> data =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token1\".getBytes(UTF_8)));\n\n    ObjectMeta metaData =\n        new ObjectMetaBuilder()\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user1\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host1\",\n                    \"che.eclipse.org/scm-username\",\n                    \"scm-username\"))\n            .build();\n\n    Secret secret = new SecretBuilder().withMetadata(metaData).withData(data).build();\n\n    when(secrets.get(any(LabelSelector.class))).thenReturn(singletonList(secret));\n\n    // when\n    Optional<PersonalAccessToken> tokenOptional =\n        personalAccessTokenManager.get(\n            new SubjectImpl(\"user\", Collections.emptyList(), \"user1\", \"t1\", false),\n            null,\n            \"http://host1\",\n            null);\n    // then\n    assertTrue(tokenOptional.isPresent());\n    assertEquals(tokenOptional.get().getCheUserId(), \"user1\");\n    assertEquals(tokenOptional.get().getScmProviderUrl(), \"http://host1\");\n    assertEquals(tokenOptional.get().getToken(), \"token1\");\n  }\n\n  @Test\n  public void shouldGetTokenFromASecretWithoutSCMUsername() throws Exception {\n\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(singletonList(meta));\n    KubernetesNamespace kubernetesnamespace = Mockito.mock(KubernetesNamespace.class);\n    KubernetesSecrets secrets = Mockito.mock(KubernetesSecrets.class);\n    when(namespaceFactory.access(eq(null), eq(meta.getName()))).thenReturn(kubernetesnamespace);\n    when(kubernetesnamespace.secrets()).thenReturn(secrets);\n    when(scmPersonalAccessTokenFetcher.getScmUsername(any(PersonalAccessTokenParams.class)))\n        .thenReturn(Optional.of(\"user\"));\n\n    Map<String, String> data =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token1\".getBytes(UTF_8)));\n\n    ObjectMeta metaData =\n        new ObjectMetaBuilder()\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user1\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host1\"))\n            .build();\n\n    Secret secret = new SecretBuilder().withMetadata(metaData).withData(data).build();\n\n    when(secrets.get(any(LabelSelector.class))).thenReturn(singletonList(secret));\n\n    // when\n    Optional<PersonalAccessToken> tokenOptional =\n        personalAccessTokenManager.get(\n            new SubjectImpl(\"user\", Collections.emptyList(), \"user1\", \"t1\", false),\n            null,\n            \"http://host1\",\n            null);\n\n    // then\n    assertTrue(tokenOptional.isPresent());\n    assertEquals(tokenOptional.get().getCheUserId(), \"user1\");\n    assertEquals(tokenOptional.get().getScmProviderUrl(), \"http://host1\");\n    assertEquals(tokenOptional.get().getToken(), \"token1\");\n  }\n\n  @Test\n  public void testGetTokenFromNamespaceWithTrailingSlashMismatch() throws Exception {\n\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(singletonList(meta));\n    KubernetesNamespace kubernetesnamespace = Mockito.mock(KubernetesNamespace.class);\n    KubernetesSecrets secrets = Mockito.mock(KubernetesSecrets.class);\n    when(namespaceFactory.access(eq(null), eq(meta.getName()))).thenReturn(kubernetesnamespace);\n    when(kubernetesnamespace.secrets()).thenReturn(secrets);\n    when(scmPersonalAccessTokenFetcher.getScmUsername(any(PersonalAccessTokenParams.class)))\n        .thenReturn(Optional.of(\"user\"));\n\n    Map<String, String> data1 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token1\".getBytes(UTF_8)));\n    Map<String, String> data2 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token2\".getBytes(UTF_8)));\n\n    ObjectMeta meta1 =\n        new ObjectMetaBuilder()\n            .withCreationTimestamp(\"2021-07-01T12:00:00Z\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user1\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host1.com/\"))\n            .build();\n    ObjectMeta meta2 =\n        new ObjectMetaBuilder()\n            .withCreationTimestamp(\"2021-08-01T12:00:00Z\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user1\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host2.com\"))\n            .build();\n\n    Secret secret1 = new SecretBuilder().withMetadata(meta1).withData(data1).build();\n    Secret secret2 = new SecretBuilder().withMetadata(meta2).withData(data2).build();\n\n    when(secrets.get(any(LabelSelector.class))).thenReturn(Arrays.asList(secret1, secret2));\n\n    // when\n    PersonalAccessToken token1 =\n        personalAccessTokenManager\n            .get(\n                new SubjectImpl(\"user\", Collections.emptyList(), \"user1\", \"t1\", false),\n                null,\n                \"http://host1.com\",\n                null)\n            .get();\n    PersonalAccessToken token2 =\n        personalAccessTokenManager\n            .get(\n                new SubjectImpl(\"user\", Collections.emptyList(), \"user1\", \"t1\", false),\n                null,\n                \"http://host2.com/\",\n                null)\n            .get();\n\n    // then\n    assertNotNull(token1);\n    assertNotNull(token2);\n  }\n\n  @Test\n  public void shouldDeleteMisconfiguredTokensOnGet() throws Exception {\n    // given\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(singletonList(meta));\n    KubernetesNamespace kubernetesnamespace = Mockito.mock(KubernetesNamespace.class);\n    KubernetesSecrets secrets = Mockito.mock(KubernetesSecrets.class);\n    when(namespaceFactory.access(eq(null), eq(meta.getName()))).thenReturn(kubernetesnamespace);\n    when(kubernetesnamespace.secrets()).thenReturn(secrets);\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n    when(secretsMixedOperation.inNamespace(eq(meta.getName()))).thenReturn(nonNamespaceOperation);\n    Map<String, String> data1 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token1\".getBytes(UTF_8)));\n    ObjectMeta meta1 =\n        new ObjectMetaBuilder()\n            .withNamespace(\"test\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user1\"))\n            .build();\n    Secret secret1 = new SecretBuilder().withMetadata(meta1).withData(data1).build();\n    when(secrets.get(any(LabelSelector.class))).thenReturn(Arrays.asList(secret1));\n    // when\n    Optional<PersonalAccessToken> token =\n        personalAccessTokenManager.get(\n            new SubjectImpl(\"user\", Collections.emptyList(), \"user1\", \"t1\", false),\n            null,\n            \"http://host1\",\n            null);\n    // then\n    assertFalse(token.isPresent());\n    verify(nonNamespaceOperation, times(1)).delete(eq(secret1));\n  }\n\n  @Test\n  public void shouldDeleteInvalidTokensOnGet() throws Exception {\n    // given\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(singletonList(meta));\n    KubernetesNamespace kubernetesnamespace = Mockito.mock(KubernetesNamespace.class);\n    KubernetesSecrets secrets = Mockito.mock(KubernetesSecrets.class);\n    when(namespaceFactory.access(eq(null), eq(meta.getName()))).thenReturn(kubernetesnamespace);\n    when(kubernetesnamespace.secrets()).thenReturn(secrets);\n    when(scmPersonalAccessTokenFetcher.getScmUsername(any(PersonalAccessTokenParams.class)))\n        .thenReturn(Optional.empty());\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n    when(secretsMixedOperation.inNamespace(eq(meta.getName()))).thenReturn(nonNamespaceOperation);\n    Map<String, String> data1 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token1\".getBytes(UTF_8)));\n    ObjectMeta meta1 =\n        new ObjectMetaBuilder()\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user1\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host1\"))\n            .build();\n    Secret secret1 = new SecretBuilder().withMetadata(meta1).withData(data1).build();\n    when(secrets.get(any(LabelSelector.class))).thenReturn(Arrays.asList(secret1));\n    // when\n    Optional<PersonalAccessToken> token =\n        personalAccessTokenManager.get(\n            new SubjectImpl(\"user\", Collections.emptyList(), \"user1\", \"t1\", false),\n            null,\n            \"http://host1\",\n            null);\n    // then\n    assertFalse(token.isPresent());\n    verify(nonNamespaceOperation, times(1)).delete(eq(secret1));\n  }\n\n  @Test(dependsOnMethods = \"shouldDeleteInvalidTokensOnGet\")\n  public void shouldReturnFirstValidTokenAndDeleteTheInvalidOne() throws Exception {\n    // given\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(singletonList(meta));\n    KubernetesNamespace kubernetesnamespace = Mockito.mock(KubernetesNamespace.class);\n    KubernetesSecrets secrets = Mockito.mock(KubernetesSecrets.class);\n    when(namespaceFactory.access(eq(null), eq(meta.getName()))).thenReturn(kubernetesnamespace);\n    when(kubernetesnamespace.secrets()).thenReturn(secrets);\n    when(scmPersonalAccessTokenFetcher.getScmUsername(any(PersonalAccessTokenParams.class)))\n        .thenAnswer(\n            (Answer<Optional<String>>)\n                invocation -> {\n                  PersonalAccessTokenParams params = invocation.getArgument(0);\n                  return \"id2\".equals(params.getScmTokenId())\n                      ? Optional.of(\"user\")\n                      : Optional.empty();\n                });\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n\n    when(secretsMixedOperation.inNamespace(eq(meta.getName()))).thenReturn(nonNamespaceOperation);\n    Map<String, String> data1 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token1\".getBytes(UTF_8)));\n    Map<String, String> data2 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token2\".getBytes(UTF_8)));\n    ObjectMeta meta1 =\n        new ObjectMetaBuilder()\n            .withCreationTimestamp(\"2021-07-01T12:00:00Z\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user1\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host1\",\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_ID,\n                    \"id1\"))\n            .build();\n    ObjectMeta meta2 =\n        new ObjectMetaBuilder()\n            .withCreationTimestamp(\"2021-07-02T12:00:00Z\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user1\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host1\",\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_ID,\n                    \"id2\"))\n            .build();\n    Secret secret1 = new SecretBuilder().withMetadata(meta1).withData(data1).build();\n    Secret secret2 = new SecretBuilder().withMetadata(meta2).withData(data2).build();\n    when(secrets.get(any(LabelSelector.class))).thenReturn(Arrays.asList(secret1, secret2));\n    // when\n    Optional<PersonalAccessToken> token =\n        personalAccessTokenManager.get(\n            new SubjectImpl(\"user\", Collections.emptyList(), \"user1\", \"t1\", false),\n            null,\n            \"http://host1\",\n            null);\n    // then\n    assertTrue(token.isPresent());\n    assertEquals(token.get().getScmTokenId(), \"id2\");\n    verify(nonNamespaceOperation, times(1)).delete(eq(secret1));\n  }\n\n  @Test\n  public void shouldReturnFirstValidTokenAndDeleteTheOlderOne() throws Exception {\n    // given\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(singletonList(meta));\n    KubernetesNamespace kubernetesnamespace = Mockito.mock(KubernetesNamespace.class);\n    KubernetesSecrets secrets = Mockito.mock(KubernetesSecrets.class);\n    when(kubernetesnamespace.secrets()).thenReturn(secrets);\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n    Map<String, String> data1 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token1\".getBytes(UTF_8)));\n    Map<String, String> data2 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token2\".getBytes(UTF_8)));\n    ObjectMeta meta1 =\n        new ObjectMetaBuilder()\n            .withCreationTimestamp(\"2021-07-01T12:00:00Z\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user1\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host1\",\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_ID,\n                    \"id1\"))\n            .build();\n    ObjectMeta meta2 =\n        new ObjectMetaBuilder()\n            .withCreationTimestamp(\"2021-07-02T12:00:00Z\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user1\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host1\",\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_ID,\n                    \"id2\"))\n            .build();\n    Secret secret1 = new SecretBuilder().withMetadata(meta1).withData(data1).build();\n    Secret secret2 = new SecretBuilder().withMetadata(meta2).withData(data2).build();\n    when(secrets.get(any(LabelSelector.class))).thenReturn(Arrays.asList(secret1, secret2));\n    when(namespaceFactory.access(eq(null), eq(meta.getName()))).thenReturn(kubernetesnamespace);\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n    when(secretsMixedOperation.inNamespace(eq(meta.getName()))).thenReturn(nonNamespaceOperation);\n    when(kubernetesnamespace.secrets()).thenReturn(secrets);\n    PersonalAccessToken token =\n        new PersonalAccessToken(\n            \"http://host1\", \"provider\", \"cheUser\", \"username\", \"token-name\", \"tid-24\", \"token123\");\n    when(scmPersonalAccessTokenFetcher.refreshPersonalAccessToken(\n            any(org.eclipse.che.commons.subject.Subject.class), eq(\"http://host1\")))\n        .thenReturn(token);\n\n    // when\n    personalAccessTokenManager.forceRefreshPersonalAccessToken(\"http://host1\");\n\n    // then\n    verify(nonNamespaceOperation, times(1)).delete(eq(secret1));\n  }\n\n  @Test\n  public void shouldRemoveToken() throws Exception {\n    // given\n    Subject subject = mock(Subject.class);\n    when(subject.getUserId()).thenReturn(\"user\");\n    EnvironmentContext context = spy(EnvironmentContext.getCurrent());\n    EnvironmentContext.setCurrent(context);\n    doReturn(subject).when(context).getSubject();\n    KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl(\"test\");\n    when(namespaceFactory.list()).thenReturn(singletonList(meta));\n    KubernetesNamespace kubernetesnamespace = Mockito.mock(KubernetesNamespace.class);\n    KubernetesSecrets secrets = Mockito.mock(KubernetesSecrets.class);\n    when(kubernetesnamespace.secrets()).thenReturn(secrets);\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n    Map<String, String> data1 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token1\".getBytes(UTF_8)));\n    Map<String, String> data2 =\n        Map.of(\"token\", Base64.getEncoder().encodeToString(\"token2\".getBytes(UTF_8)));\n    ObjectMeta meta1 =\n        new ObjectMetaBuilder()\n            .withCreationTimestamp(\"2021-07-01T12:00:00Z\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host1\",\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_ID,\n                    \"id1\"))\n            .build();\n    ObjectMeta meta2 =\n        new ObjectMetaBuilder()\n            .withCreationTimestamp(\"2021-07-02T12:00:00Z\")\n            .withAnnotations(\n                Map.of(\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME,\n                    \"github\",\n                    ANNOTATION_CHE_USERID,\n                    \"user\",\n                    ANNOTATION_SCM_URL,\n                    \"http://host2\",\n                    ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_ID,\n                    \"id2\"))\n            .build();\n    Secret secret1 = new SecretBuilder().withMetadata(meta1).withData(data1).build();\n    Secret secret2 = new SecretBuilder().withMetadata(meta2).withData(data2).build();\n    when(secrets.get(any(LabelSelector.class))).thenReturn(Arrays.asList(secret1, secret2));\n    when(namespaceFactory.access(eq(null), eq(meta.getName()))).thenReturn(kubernetesnamespace);\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubeClient);\n    when(kubeClient.secrets()).thenReturn(secretsMixedOperation);\n    when(secretsMixedOperation.inNamespace(eq(meta.getName()))).thenReturn(nonNamespaceOperation);\n    when(kubernetesnamespace.secrets()).thenReturn(secrets);\n\n    // when\n    personalAccessTokenManager.remove(\"http://host1\");\n\n    // then\n    verify(nonNamespaceOperation, times(1)).delete(eq(secret1));\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-factory/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n%nopex</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"ERROR\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "infrastructures/infrastructure-metrics/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-infrastructures-parent</artifactId>\n        <groupId>org.eclipse.che.infrastructure</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n        <relativePath>../pom.xml</relativePath>\n    </parent>\n    <artifactId>infrastructure-metrics</artifactId>\n    <name>Infrastructure :: Metrics</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.micrometer</groupId>\n            <artifactId>micrometer-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.infrastructure</groupId>\n            <artifactId>infrastructure-kubernetes</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "infrastructures/infrastructure-metrics/src/main/java/org/eclipse/che/workspace/infrastructure/metrics/CurrentLogwatchersMeterBinder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.metrics;\n\nimport io.micrometer.core.instrument.Gauge;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport java.util.concurrent.atomic.AtomicLong;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.RuntimeLogEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.event.WatchLogStartedEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.event.WatchLogStoppedEvent;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Counts sent messages and bytes to runtime log by listening to {@link RuntimeLogEvent}s. */\n@Singleton\npublic class CurrentLogwatchersMeterBinder implements MeterBinder {\n\n  private static final Logger LOG = LoggerFactory.getLogger(CurrentLogwatchersMeterBinder.class);\n\n  private final EventService eventService;\n  private final AtomicLong currentWatchersCounter;\n\n  @Inject\n  CurrentLogwatchersMeterBinder(EventService eventService) {\n    this.eventService = eventService;\n    this.currentWatchersCounter = new AtomicLong();\n  }\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n    Gauge.builder(\"log_watchers\", this::current).register(registry);\n\n    eventService.subscribe(\n        (e) -> currentWatchersCounter.incrementAndGet(), WatchLogStartedEvent.class);\n    eventService.subscribe(\n        (e) -> {\n          long counter = currentWatchersCounter.decrementAndGet();\n          if (counter < 0) {\n            LOG.warn(\n                \"WatchLog current instances counter decremented below 0. Counter set explicitly to 0. This should not happen. Please report a bug if you see this message in the log.\");\n            currentWatchersCounter.set(0);\n          }\n        },\n        WatchLogStoppedEvent.class);\n  }\n\n  private long current() {\n    return currentWatchersCounter.get();\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-metrics/src/main/java/org/eclipse/che/workspace/infrastructure/metrics/InfrastructureMetricsModule.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.metrics;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\nimport io.micrometer.core.instrument.binder.MeterBinder;\n\n/**\n * A Guice module to bind infrastructure specific metric binders to a single multi-binder. The set\n * of all metric binders is used to produce the Prometheus metrics on request.\n */\npublic class InfrastructureMetricsModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    Multibinder<MeterBinder> meterMultibinder =\n        Multibinder.newSetBinder(binder(), MeterBinder.class);\n\n    meterMultibinder.addBinding().to(CurrentLogwatchersMeterBinder.class);\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-metrics/src/test/java/org/eclipse/che/workspace/infrastructure/metrics/CurrentLogwatchersMeterBinderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.metrics;\n\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.event.WatchLogStartedEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.event.WatchLogStoppedEvent;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class CurrentLogwatchersMeterBinderTest {\n\n  private final String metricsKey = \"log_watchers\";\n\n  private MeterRegistry registry;\n  private EventService eventService;\n  private CurrentLogwatchersMeterBinder binder;\n\n  @BeforeMethod\n  public void setUp() {\n    registry = new SimpleMeterRegistry();\n    eventService = new EventService();\n    binder = new CurrentLogwatchersMeterBinder(eventService);\n    binder.bindTo(registry);\n  }\n\n  @Test\n  public void testCurrentLogwatcherGaugeReactsOnEvents() {\n    Assert.assertEquals(registry.get(metricsKey).gauge().value(), 0.0);\n\n    eventService.publish(new WatchLogStartedEvent(\"container\"));\n    Assert.assertEquals(registry.get(metricsKey).gauge().value(), 1.0);\n\n    eventService.publish(new WatchLogStartedEvent(\"container\"));\n    Assert.assertEquals(registry.get(metricsKey).gauge().value(), 2.0);\n\n    eventService.publish(new WatchLogStoppedEvent(\"container\"));\n    Assert.assertEquals(registry.get(metricsKey).gauge().value(), 1.0);\n\n    eventService.publish(new WatchLogStartedEvent(\"container\"));\n    Assert.assertEquals(registry.get(metricsKey).gauge().value(), 2.0);\n\n    eventService.publish(new WatchLogStoppedEvent(\"container\"));\n    eventService.publish(new WatchLogStoppedEvent(\"container\"));\n    Assert.assertEquals(registry.get(metricsKey).gauge().value(), 0.0);\n  }\n\n  @Test\n  public void testLogwatcherGaugeCantGoBelowZero() {\n    Assert.assertEquals(registry.get(metricsKey).gauge().value(), 0.0);\n\n    eventService.publish(new WatchLogStoppedEvent(\"container\"));\n    Assert.assertEquals(registry.get(metricsKey).gauge().value(), 0.0);\n\n    eventService.publish(new WatchLogStartedEvent(\"container\"));\n    eventService.publish(new WatchLogStoppedEvent(\"container\"));\n    eventService.publish(new WatchLogStoppedEvent(\"container\"));\n    Assert.assertEquals(registry.get(metricsKey).gauge().value(), 0.0);\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-permission/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-infrastructures-parent</artifactId>\n        <groupId>org.eclipse.che.infrastructure</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>infrastructure-permission</artifactId>\n    <name>Infrastructure :: Kubernetes Permissions</name>\n    <dependencies>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.infrastructure</groupId>\n            <artifactId>infrastructure-kubernetes</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-permission</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "infrastructures/infrastructure-permission/src/main/java/org/eclipse/che/multiuser/permission/workspace/infra/kubernetes/BrokerServicePermissionFilter.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.permission.workspace.infra.kubernetes;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events.BrokerService.BROKER_RESULT_METHOD;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events.BrokerService.BROKER_STATUS_CHANGED_METHOD;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeIdentityDto;\nimport org.eclipse.che.api.workspace.shared.dto.event.BrokerStatusChangedEvent;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.multiuser.api.permission.server.jsonrpc.JsonRpcPermissionsFilterAdapter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events.BrokerService;\n\n/**\n * Add permissions checking before {@link BrokerService} methods invocation.\n *\n * @author Sergii Leshchenko\n */\n@Singleton\npublic class BrokerServicePermissionFilter extends JsonRpcPermissionsFilterAdapter {\n  @Inject\n  public void register(RequestHandlerManager requestHandlerManager) {\n    requestHandlerManager.registerMethodInvokerFilter(\n        this, BROKER_STATUS_CHANGED_METHOD, BROKER_RESULT_METHOD);\n  }\n\n  @Override\n  public void doAccept(String method, Object... params) throws ForbiddenException {\n    String workspaceId;\n    switch (method) {\n      case BROKER_STATUS_CHANGED_METHOD:\n      case BROKER_RESULT_METHOD:\n        RuntimeIdentityDto runtimeId = ((BrokerStatusChangedEvent) params[0]).getRuntimeId();\n        if (runtimeId == null || runtimeId.getWorkspaceId() == null) {\n          throw new ForbiddenException(\"Workspace id must be specified\");\n        }\n        workspaceId = runtimeId.getWorkspaceId();\n        break;\n      default:\n        throw new ForbiddenException(\"Unknown method is configured to be filtered.\");\n    }\n\n    Subject currentSubject = EnvironmentContext.getCurrent().getSubject();\n    if (!currentSubject.hasPermission(\"workspace\", workspaceId, \"run\")) {\n      throw new ForbiddenException(\n          \"User doesn't have the required permissions to the specified workspace\");\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-permission/src/test/java/org/eclipse/che/multiuser/permission/workspace/infra/kubernetes/BrokerServicePermissionFilterTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.permission.workspace.infra.kubernetes;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events.BrokerService.BROKER_RESULT_METHOD;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events.BrokerService.BROKER_STATUS_CHANGED_METHOD;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.when;\n\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeIdentityDto;\nimport org.eclipse.che.api.workspace.shared.dto.event.BrokerStatusChangedEvent;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link BrokerServicePermissionFilter}\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class BrokerServicePermissionFilterTest {\n\n  @Mock private RequestHandlerManager requestHandlerManager;\n\n  @Mock private Subject subject;\n\n  private BrokerServicePermissionFilter permissionFilter;\n\n  @BeforeMethod\n  public void setUp() {\n    EnvironmentContext.getCurrent().setSubject(subject);\n    permissionFilter = new BrokerServicePermissionFilter();\n  }\n\n  @AfterMethod\n  public void tearDown() {\n    EnvironmentContext.reset();\n  }\n\n  @Test\n  public void shouldRegisterItself() {\n    // when\n    permissionFilter.register(requestHandlerManager);\n\n    // then\n    requestHandlerManager.registerMethodInvokerFilter(\n        permissionFilter, BROKER_STATUS_CHANGED_METHOD, BROKER_RESULT_METHOD);\n  }\n\n  @Test(\n      dataProvider = \"coveredMethods\",\n      expectedExceptions = ForbiddenException.class,\n      expectedExceptionsMessageRegExp =\n          \"User doesn't have the required permissions to the specified workspace\")\n  public void shouldThrowExceptionIfUserDoesNotHaveRunPermission(String method) throws Exception {\n    // given\n    when(subject.hasPermission(eq(\"workspace\"), eq(\"ws123\"), eq(\"run\"))).thenReturn(false);\n\n    // when\n    permissionFilter.doAccept(\n        method,\n        DtoFactory.newDto(BrokerStatusChangedEvent.class)\n            .withRuntimeId(DtoFactory.newDto(RuntimeIdentityDto.class).withWorkspaceId(\"ws123\")));\n  }\n\n  @Test(dataProvider = \"coveredMethods\")\n  public void shouldDoNothingIfUserHasRunPermissions(String method) throws Exception {\n    // given\n    when(subject.hasPermission(\"workspace\", \"ws123\", \"run\")).thenReturn(true);\n\n    // when\n    permissionFilter.doAccept(\n        method,\n        DtoFactory.newDto(BrokerStatusChangedEvent.class)\n            .withRuntimeId(DtoFactory.newDto(RuntimeIdentityDto.class).withWorkspaceId(\"ws123\")));\n  }\n\n  @Test(\n      expectedExceptions = ForbiddenException.class,\n      expectedExceptionsMessageRegExp = \"Unknown method is configured to be filtered\\\\.\")\n  public void shouldThrowExceptionIfUnknownMethodIsInvoking() throws Exception {\n    // when\n    permissionFilter.doAccept(\n        \"unknown\",\n        DtoFactory.newDto(BrokerStatusChangedEvent.class)\n            .withRuntimeId(DtoFactory.newDto(RuntimeIdentityDto.class).withWorkspaceId(\"ws123\")));\n  }\n\n  @DataProvider\n  public Object[][] coveredMethods() {\n    return new Object[][] {{BROKER_STATUS_CHANGED_METHOD}, {BROKER_RESULT_METHOD}};\n  }\n}\n"
  },
  {
    "path": "infrastructures/infrastructure-permission/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n%nopex</pattern>\n        </encoder>\n    </appender>\n    <appender name=\"file\" class=\"ch.qos.logback.core.FileAppender\">\n        <File>target/log/test.log</File>\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n\n    <root level=\"ERROR\">\n        <appender-ref ref=\"stdout\"/>\n        <appender-ref ref=\"file\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "infrastructures/kubernetes/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-infrastructures-parent</artifactId>\n        <groupId>org.eclipse.che.infrastructure</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>infrastructure-kubernetes</artifactId>\n    <name>Infrastructure :: Kubernetes</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.dataformat</groupId>\n            <artifactId>jackson-dataformat-yaml</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-assistedinject</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-persist</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-client-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-model-apps</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-model-batch</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-model-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-model-networking</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-model-rbac</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>openshift-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.opentracing</groupId>\n            <artifactId>opentracing-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.swagger.core.v3</groupId>\n            <artifactId>swagger-annotations-jakarta</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.annotation</groupId>\n            <artifactId>jakarta.annotation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.validation</groupId>\n            <artifactId>jakarta.validation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-ssh</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-ssh-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-system</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-user</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-inject</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-observability</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-tracing</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-machine-authentication</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>jakarta.persistence</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-client</artifactId>\n            <scope>test</scope>\n            <!-- Fix CVE-2025-24970 -->\n            <exclusions>\n                <exclusion>\n                    <artifactId>netty-handler</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-handler-proxy</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-codec-http</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-resolver</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-buffer</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-transport</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-codec</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-common</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-server-mock</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>mockwebserver</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.netty</groupId>\n            <artifactId>netty-handler</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.netty</groupId>\n            <artifactId>netty-handler-proxy</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-sql-schema</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.jpa</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.flywaydb</groupId>\n            <artifactId>flyway-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.infrastructure</groupId>\n                        <artifactId>infrastructure-kubernetes</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n                <configuration>\n                    <dtoPackages>\n                        <package>org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto</package>\n                    </dtoPackages>\n                    <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                    <genClassName>org.eclipse.che.workspace.infrastructure.kubernetes.api.server.dto.DtoServerImpls</genClassName>\n                    <impl>server</impl>\n                </configuration>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-resource</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <!-- Create the test jar -->\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>test-jar</goal>\n                        </goals>\n                        <configuration>\n                            <includes>\n                                <include>**/tck/*.*</include>\n                            </includes>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>com.mycila</groupId>\n                <artifactId>license-maven-plugin</artifactId>\n                <configuration>\n                    <excludes>\n                        <exclude>src/test/resources/jwtproxy-confg.yaml</exclude>\n                    </excludes>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/Annotations.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport com.google.common.base.Strings;\nimport com.google.common.reflect.TypeToken;\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\n\n/**\n * Helps to convert servers related entities (like {@link ServerConfig} and machine name) to\n * Kubernetes annotations and vise-versa.\n *\n * @author Sergii Leshchenko\n */\npublic class Annotations {\n  public static final String ANNOTATION_PREFIX = \"org.eclipse.che.\";\n\n  public static final String SERVER_PORT_ANNOTATION_FMT = ANNOTATION_PREFIX + \"server.%s.port\";\n  public static final String SERVER_PROTOCOL_ANNOTATION_FMT =\n      ANNOTATION_PREFIX + \"server.%s.protocol\";\n  public static final String SERVER_PATH_ANNOTATION_FMT = ANNOTATION_PREFIX + \"server.%s.path\";\n  public static final String SERVER_ATTR_ANNOTATION_FMT =\n      ANNOTATION_PREFIX + \"server.%s.attributes\";\n\n  public static final String MACHINE_NAME_ANNOTATION = ANNOTATION_PREFIX + \"machine.name\";\n\n  /**\n   * Object annotated with this set to `true` should be created in Che installation namespace. It's\n   * used only internally so it may be removed before actually creating k8s object, so it's not\n   * exposed.\n   */\n  public static final String CREATE_IN_CHE_INSTALLATION_NAMESPACE =\n      ANNOTATION_PREFIX + \"installation.namespace\";\n\n  /** Pattern that matches server annotations e.g. \"org.eclipse.che.server.exec-agent.port\". */\n  private static final Pattern SERVER_ANNOTATION_PATTERN =\n      Pattern.compile(\"org\\\\.eclipse\\\\.che\\\\.server\\\\.(?<ref>[\\\\w-/]+)\\\\..+\");\n\n  private static final Gson GSON = new GsonBuilder().disableHtmlEscaping().create();\n  // used to avoid frequent creations of the object at runtime\n  private static final java.lang.reflect.Type mapTypeToken =\n      new TypeToken<Map<String, String>>() {}.getType();\n\n  /** Creates new annotations serializer. */\n  public static Serializer newSerializer() {\n    return new Serializer();\n  }\n\n  /** Creates new label deserializer from given annotations. */\n  public static Deserializer newDeserializer(Map<String, String> annotations) {\n    return new Deserializer(annotations);\n  }\n\n  /** Helps to serialize ServerConfig entities to Kubernetes annotations. */\n  public static class Serializer {\n    private final Map<String, String> annotations = new HashMap<>();\n\n    /**\n     * Serializes server configuration as Kubernetes annotations. Appends serialization result to\n     * this aggregate.\n     *\n     * @param ref server reference e.g. \"exec-agent\"\n     * @param server server configuration\n     * @return this serializer\n     */\n    public Serializer server(String ref, ServerConfig server) {\n      annotations.put(String.format(SERVER_PORT_ANNOTATION_FMT, ref), server.getPort());\n      annotations.put(String.format(SERVER_PROTOCOL_ANNOTATION_FMT, ref), server.getProtocol());\n      if (server.getPath() != null) {\n        annotations.put(String.format(SERVER_PATH_ANNOTATION_FMT, ref), server.getPath());\n      }\n      if (server.getAttributes() != null) {\n        annotations.put(\n            String.format(SERVER_ATTR_ANNOTATION_FMT, ref), GSON.toJson(server.getAttributes()));\n      }\n      return this;\n    }\n\n    public Serializer servers(Map<String, ? extends ServerConfig> servers) {\n      servers.forEach(this::server);\n      return this;\n    }\n\n    public Serializer machineName(String machineName) {\n      annotations.put(MACHINE_NAME_ANNOTATION, machineName);\n      return this;\n    }\n\n    public Map<String, String> annotations() {\n      return annotations;\n    }\n  }\n\n  /** Helps to deserialize Kuberbetes annotations to known {@link ServerConfig} related entities. */\n  public static class Deserializer {\n    private final Map<String, String> annotations;\n\n    public Deserializer(Map<String, String> annotations) {\n      this.annotations = annotations != null ? annotations : Collections.emptyMap();\n    }\n\n    /** Retrieves server configuration from annotations and returns (ref -> server config) map. */\n    public Map<String, ServerConfigImpl> servers() {\n      Map<String, ServerConfigImpl> servers = new HashMap<>();\n      for (Map.Entry<String, String> entry : annotations.entrySet()) {\n        Matcher refMatcher = SERVER_ANNOTATION_PATTERN.matcher(entry.getKey());\n        if (refMatcher.matches()) {\n          String ref = refMatcher.group(\"ref\");\n          if (!servers.containsKey(ref)) {\n            // Null is serialized to empty string in annotations, but empty string as protocol\n            // doesn't make any sense, so convert empty protocol to null which is respected\n            // in other components\n            String protocol =\n                Strings.emptyToNull(\n                    annotations.get(String.format(SERVER_PROTOCOL_ANNOTATION_FMT, ref)));\n            servers.put(\n                ref,\n                new ServerConfigImpl(\n                    annotations.get(String.format(SERVER_PORT_ANNOTATION_FMT, ref)),\n                    protocol,\n                    annotations.get(String.format(SERVER_PATH_ANNOTATION_FMT, ref)),\n                    GSON.fromJson(\n                        annotations.get(String.format(SERVER_ATTR_ANNOTATION_FMT, ref)),\n                        mapTypeToken)));\n          }\n        }\n      }\n      return servers;\n    }\n\n    public String machineName() {\n      return annotations.get(MACHINE_NAME_ANNOTATION);\n    }\n  }\n\n  private Annotations() {}\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/CheServerKubernetesClientFactory.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport io.fabric8.kubernetes.client.Config;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\n\n/**\n * This {@link KubernetesClientFactory} ensures that we use `che` ServiceAccount and not related to\n * any workspace. It always provides client with default {@link Config}. It's useful for operations\n * that needs permissions of `che` SA, such as operations inside `che` namespace (like creating a\n * ConfigMaps for Gateway router) or some cluster-wide actions (like labeling the namespaces).\n */\n@Singleton\npublic class CheServerKubernetesClientFactory extends KubernetesClientFactory {\n\n  @Inject\n  public CheServerKubernetesClientFactory(KubernetesClientConfigFactory configBuilder) {\n    super(configBuilder);\n  }\n\n  /**\n   * @param workspaceId ignored\n   */\n  @Override\n  public KubernetesClient create(String workspaceId) throws InfrastructureException {\n    return create();\n  }\n\n  /**\n   * creates an instance of {@link KubernetesClient} that is meant to be used on Che installation\n   * namespace\n   */\n  @Override\n  public KubernetesClient create() throws InfrastructureException {\n    return super.create();\n  }\n\n  @Override\n  protected Config buildConfig(Config config, String workspaceId) {\n    return config;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/Constants.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\n/**\n * Constants for Kubernetes implementation of spi.\n *\n * @author Sergii Leshchenko\n */\npublic final class Constants {\n\n  /**\n   * The label that contains a value with original object name.\n   *\n   * <p>Names of Kubernetes objects should be modified to avoid collision with objects of other\n   * workspaces.\n   *\n   * @see org.eclipse.che.workspace.infrastructure.kubernetes.provision.UniqueNamesProvisioner\n   */\n  public static final String CHE_ORIGINAL_NAME_LABEL = \"che.original_name\";\n\n  /** The label that contains a value with workspace id to which object belongs to. */\n  public static final String CHE_WORKSPACE_ID_LABEL = \"che.workspace_id\";\n\n  /** The label that contains a value with user id to which object belongs to. */\n  public static final String CHE_USER_ID_LABEL = \"che.user_id\";\n\n  /** The label that contains name of deployment responsible for Pod. */\n  public static final String CHE_DEPLOYMENT_NAME_LABEL = \"che.deployment_name\";\n\n  /** The label that contains a value with volume name. */\n  public static final String CHE_VOLUME_NAME_LABEL = \"che.workspace.volume_name\";\n\n  /** Kubernetes Pod status phase values */\n  public static final String POD_STATUS_PHASE_RUNNING = \"Running\";\n\n  public static final String POD_STATUS_PHASE_FAILED = \"Failed\";\n  public static final String POD_STATUS_PHASE_SUCCEEDED = \"Succeeded\";\n\n  /** DevWorkspace labels and annotations for mounting secrets and configmaps. */\n  public static final String DEV_WORKSPACE_MOUNT_LABEL =\n      \"controller.devfile.io/mount-to-devworkspace\";\n\n  public static final String DEV_WORKSPACE_WATCH_SECRET_LABEL =\n      \"controller.devfile.io/watch-secret\";\n\n  public static final String DEV_WORKSPACE_MOUNT_PATH_ANNOTATION =\n      \"controller.devfile.io/mount-path\";\n  public static final String DEV_WORKSPACE_MOUNT_AS_ANNOTATION = \"controller.devfile.io/mount-as\";\n\n  private Constants() {}\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/K8sInfraNamespaceWsAttributeValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.workspace.shared.Constants.WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE;\n\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.workspace.server.WorkspaceAttributeValidator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.NamespaceNameValidator;\n\n/**\n * Validates the values of {@link\n * org.eclipse.che.api.workspace.shared.Constants#WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE}\n * before workspace creation and updating.\n *\n * @author Sergii Leshchenko\n */\npublic class K8sInfraNamespaceWsAttributeValidator implements WorkspaceAttributeValidator {\n\n  private final Provider<KubernetesNamespaceFactory> namespaceFactoryProvider;\n\n  @Inject\n  public K8sInfraNamespaceWsAttributeValidator(\n      Provider<KubernetesNamespaceFactory> namespaceFactoryProvider) {\n    this.namespaceFactoryProvider = namespaceFactoryProvider;\n  }\n\n  /**\n   * Validates value of {@link\n   * org.eclipse.che.api.workspace.shared.Constants#WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE}.\n   *\n   * @param attributes workspace attributes to validate\n   * @throws ValidationException when infra namespace value has wrong format\n   * @throws ValidationException when the current user is not permitted to use the specified infra\n   *     namespace\n   */\n  @Override\n  public void validate(Map<String, String> attributes) throws ValidationException {\n    String namespace = attributes.get(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE);\n    if (!isNullOrEmpty(namespace)) {\n      NamespaceNameValidator.validate(namespace);\n      namespaceFactoryProvider.get().checkIfNamespaceIsAllowed(namespace);\n    }\n  }\n\n  /**\n   * Validates value of {@link\n   * org.eclipse.che.api.workspace.shared.Constants#WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE}\n   * before updating.\n   *\n   * @param existing actual workspace attributes\n   * @param update new workspace attributes to validate\n   * @throws ValidationException when new attributes removes or updates infra namespace value\n   */\n  @Override\n  public void validateUpdate(Map<String, String> existing, Map<String, String> update)\n      throws ValidationException {\n    String existingNamespace = existing.get(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE);\n    String updateNamespace = update.get(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE);\n\n    if (isNullOrEmpty(updateNamespace)) {\n      if (isNullOrEmpty(existingNamespace)) {\n        // this workspace was created before we start storing namespace info\n        // namespace info will be stored during the next workspace start\n        return;\n      }\n\n      throw new ValidationException(\n          format(\n              \"The namespace information must not be updated or \"\n                  + \"deleted. You must provide \\\"%s\\\" attribute with \\\"%s\\\" as a value\",\n              WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, existingNamespace));\n    }\n\n    if (isNullOrEmpty(existingNamespace)) {\n      // this would mean that the user made an update to the workspace without it having the\n      // namespace attribute stored. This is very, very unlikely, because the setting of attributes\n      // happens during the creation process. But let's just cover this case anyway, just to be\n      // sure.\n      validate(update);\n\n      // everything is fine. We allow to change infra namespace in such case.\n      return;\n    }\n\n    if (!updateNamespace.equals(existingNamespace)) {\n      throw new ValidationException(\n          format(\n              \"The namespace from the provided object \\\"%s\\\" does \"\n                  + \"not match the actual namespace \\\"%s\\\"\",\n              updateNamespace, existingNamespace));\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/KubernetesClientConfigFactory.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport io.fabric8.kubernetes.client.Config;\nimport io.fabric8.kubernetes.client.ConfigBuilder;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * This class allows customizing the Kubernetes {@link Config} according to the current context\n * (workspace ID, current user).\n *\n * @author David Festal\n */\npublic class KubernetesClientConfigFactory {\n  private final String masterUrl;\n  private final Boolean doTrustCerts;\n\n  public KubernetesClientConfigFactory(String masterUrl, Boolean doTrustCerts) {\n    this.masterUrl = masterUrl;\n    this.doTrustCerts = doTrustCerts;\n  }\n\n  /**\n   * Builds the Kubernetes {@link Config} object based on a default {@link Config} object and an\n   * optional workspace Id.\n   */\n  public Config buildConfig(Config defaultConfig, @Nullable String workspaceId)\n      throws InfrastructureException {\n    return defaultConfig;\n  }\n\n  /**\n   * Builds the default Kubernetes {@link Config} that will be the base configuration to create\n   * per-workspace configurations.\n   */\n  protected Config buildDefaultConfig() {\n    ConfigBuilder configBuilder = new ConfigBuilder();\n    if (!isNullOrEmpty(masterUrl)) {\n      configBuilder.withMasterUrl(masterUrl);\n    }\n\n    if (doTrustCerts != null) {\n      configBuilder.withTrustCerts(doTrustCerts);\n    }\n\n    return configBuilder.build();\n  }\n\n  /**\n   * Returns true if implementation personalizes config to the current subject, otherwise returns\n   * false if default config is always used.\n   */\n  public boolean isPersonalized() {\n    return false;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/KubernetesClientFactory.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport io.fabric8.kubernetes.client.Config;\nimport io.fabric8.kubernetes.client.DefaultKubernetesClient;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.http.HttpClient;\nimport io.fabric8.kubernetes.client.utils.HttpClientUtils;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * @author Sergii Leshchenko\n * @author Anton Korneta\n */\n@Singleton\npublic class KubernetesClientFactory {\n\n  /** {@link HttpClient} instance shared by all Kubernetes clients. */\n  protected final HttpClient httpClient;\n\n  protected final KubernetesClientConfigFactory configBuilder;\n\n  @Inject\n  public KubernetesClientFactory(KubernetesClientConfigFactory configBuilder) {\n    this.httpClient = HttpClientUtils.createHttpClient(configBuilder.buildDefaultConfig());\n    this.configBuilder = configBuilder;\n  }\n\n  /**\n   * Creates an instance of {@link KubernetesClient} that can be used to perform any operation\n   * related to a given workspace. </br> For all operations performed in the context of a given\n   * workspace (workspace start, workspace stop, etc ...), this method should be used to retrieve a\n   * Kubernetes client.\n   *\n   * @param workspaceId Identifier of the workspace on which Kubernetes operations will be performed\n   * @throws InfrastructureException if any error occurs on client instance creation.\n   */\n  public KubernetesClient create(String workspaceId) throws InfrastructureException {\n    Config configForWorkspace = buildConfig(getDefaultConfig(), workspaceId);\n\n    return create(configForWorkspace);\n  }\n\n  /**\n   * Creates an instance of {@link KubernetesClient} that can be used to perform any operation\n   * <strong>that is not related to a given workspace</strong>. </br> For all operations performed\n   * in the context of a given workspace (workspace start, workspace stop, etc ...), the {@code\n   * create(String workspaceId)} method should be used to retrieve a Kubernetes client.\n   *\n   * @throws InfrastructureException if any error occurs on client instance creation.\n   */\n  public KubernetesClient create() throws InfrastructureException {\n    return create(buildConfig(getDefaultConfig(), null));\n  }\n\n  /**\n   * Shuts down the {@link KubernetesClient} by closing its connection pool. Typically should be\n   * called on application tear down.\n   */\n  public void shutdownClient() {\n    httpClient.close();\n  }\n\n  /**\n   * Retrieves the default Kubernetes {@link Config} that will be the base configuration to create\n   * per-workspace configurations.\n   */\n  public Config getDefaultConfig() {\n    return configBuilder.buildDefaultConfig();\n  }\n\n  /**\n   * Builds the Kubernetes {@link Config} object based on a provided {@link Config} object and an\n   * optional workspace ID.\n   */\n  protected Config buildConfig(Config config, @Nullable String workspaceId)\n      throws InfrastructureException {\n    return configBuilder.buildConfig(config, workspaceId);\n  }\n\n  /**\n   * Creates instance of {@link KubernetesClient} that uses an {@link HttpClient} instance derived\n   * from the shared {@code httpClient} instance in which interceptors are overridden to\n   * authenticate with the credentials (user/password or Oauth token) contained in the {@code\n   * config} parameter.\n   */\n  protected KubernetesClient create(Config config) {\n    return new UnclosableKubernetesClient(httpClient, config);\n  }\n\n  /**\n   * Decorates the {@link DefaultKubernetesClient} so that it can not be closed from the outside.\n   */\n  private static class UnclosableKubernetesClient extends DefaultKubernetesClient {\n\n    public UnclosableKubernetesClient(HttpClient httpClient, Config config) {\n      super(httpClient, config);\n    }\n\n    @Override\n    public void close() {}\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/KubernetesClientTermination.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport java.util.Collections;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.system.server.ServiceTermination;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Termination for Kubernetes HTTP client.\n *\n * @author Max Shaposhnik (mshaposh@redhat.com)\n */\npublic class KubernetesClientTermination implements ServiceTermination {\n\n  private static final Logger LOG = LoggerFactory.getLogger(KubernetesClientTermination.class);\n\n  private KubernetesClientFactory kubernetesClientFactory;\n\n  @Inject\n  public KubernetesClientTermination(KubernetesClientFactory factory) {\n    this.kubernetesClientFactory = factory;\n  }\n\n  @Override\n  public void terminate() throws InterruptedException {\n    suspend();\n  }\n\n  @Override\n  public void suspend() throws InterruptedException {\n    try {\n      kubernetesClientFactory.shutdownClient();\n    } catch (RuntimeException e) {\n      LOG.error(e.getMessage());\n    }\n  }\n\n  @Override\n  public String getServiceName() {\n    return \"KubernetesClient\";\n  }\n\n  @Override\n  public Set<String> getDependencies() {\n    return Collections.emptySet();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/KubernetesEnvironmentProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.CertificateProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.GatewayRouterProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.GitConfigProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ImagePullSecretProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.PodTerminationGracePeriodProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.SecurityContextProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ServiceAccountProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.SshKeysProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisionerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.UniqueNamesProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.VcsSslCertificateProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.env.EnvVarsConverter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.limits.ram.ContainerResourceProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.restartpolicy.RestartPolicyRewriter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.server.ServersConverter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.PreviewUrlExposer;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Applies the set of configurations to the Kubernetes environment and environment configuration\n * with the desired order, which corresponds to the needs of the Kubernetes infrastructure.\n *\n * @author Anton Korneta\n * @author Alexander Garagatyi\n */\npublic interface KubernetesEnvironmentProvisioner<T extends KubernetesEnvironment> {\n\n  void provision(T k8sEnv, RuntimeIdentity identity) throws InfrastructureException;\n\n  @Singleton\n  class KubernetesEnvironmentProvisionerImpl\n      implements KubernetesEnvironmentProvisioner<KubernetesEnvironment> {\n\n    private static final Logger LOG =\n        LoggerFactory.getLogger(KubernetesEnvironmentProvisionerImpl.class);\n\n    private final UniqueNamesProvisioner<KubernetesEnvironment> uniqueNamesProvisioner;\n    private final ServersConverter<KubernetesEnvironment> serversConverter;\n    private final EnvVarsConverter envVarsConverter;\n    private final RestartPolicyRewriter restartPolicyRewriter;\n    private final ContainerResourceProvisioner resourceLimitRequestProvisioner;\n    private final SecurityContextProvisioner securityContextProvisioner;\n    private final PodTerminationGracePeriodProvisioner podTerminationGracePeriodProvisioner;\n    private final TlsProvisioner<KubernetesEnvironment> externalServerTlsProvisioner;\n    private final ImagePullSecretProvisioner imagePullSecretProvisioner;\n    private final ServiceAccountProvisioner serviceAccountProvisioner;\n    private final CertificateProvisioner certificateProvisioner;\n    private final SshKeysProvisioner sshKeysProvisioner;\n    private final GitConfigProvisioner gitConfigProvisioner;\n    private final PreviewUrlExposer<KubernetesEnvironment> previewUrlExposer;\n    private final VcsSslCertificateProvisioner vcsSslCertificateProvisioner;\n    private final GatewayRouterProvisioner gatewayRouterProvisioner;\n\n    @Inject\n    public KubernetesEnvironmentProvisionerImpl(\n        UniqueNamesProvisioner<KubernetesEnvironment> uniqueNamesProvisioner,\n        ServersConverter<KubernetesEnvironment> serversConverter,\n        EnvVarsConverter envVarsConverter,\n        RestartPolicyRewriter restartPolicyRewriter,\n        ContainerResourceProvisioner resourceLimitRequestProvisioner,\n        SecurityContextProvisioner securityContextProvisioner,\n        PodTerminationGracePeriodProvisioner podTerminationGracePeriodProvisioner,\n        TlsProvisionerProvider<KubernetesEnvironment> externalServerTlsProvisionerProvider,\n        ImagePullSecretProvisioner imagePullSecretProvisioner,\n        ServiceAccountProvisioner serviceAccountProvisioner,\n        CertificateProvisioner certificateProvisioner,\n        SshKeysProvisioner sshKeysProvisioner,\n        GitConfigProvisioner gitConfigProvisioner,\n        PreviewUrlExposer<KubernetesEnvironment> previewUrlExposer,\n        VcsSslCertificateProvisioner vcsSslCertificateProvisioner,\n        GatewayRouterProvisioner gatewayRouterProvisioner) {\n      this.uniqueNamesProvisioner = uniqueNamesProvisioner;\n      this.serversConverter = serversConverter;\n      this.envVarsConverter = envVarsConverter;\n      this.restartPolicyRewriter = restartPolicyRewriter;\n      this.resourceLimitRequestProvisioner = resourceLimitRequestProvisioner;\n      this.securityContextProvisioner = securityContextProvisioner;\n      this.podTerminationGracePeriodProvisioner = podTerminationGracePeriodProvisioner;\n      this.externalServerTlsProvisioner = externalServerTlsProvisionerProvider.get();\n      this.imagePullSecretProvisioner = imagePullSecretProvisioner;\n      this.serviceAccountProvisioner = serviceAccountProvisioner;\n      this.certificateProvisioner = certificateProvisioner;\n      this.sshKeysProvisioner = sshKeysProvisioner;\n      this.vcsSslCertificateProvisioner = vcsSslCertificateProvisioner;\n      this.gitConfigProvisioner = gitConfigProvisioner;\n      this.previewUrlExposer = previewUrlExposer;\n      this.gatewayRouterProvisioner = gatewayRouterProvisioner;\n    }\n\n    @Traced\n    public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n        throws InfrastructureException {\n      final String workspaceId = identity.getWorkspaceId();\n      TracingTags.WORKSPACE_ID.set(workspaceId);\n\n      LOG.debug(\"Start provisioning Kubernetes environment for workspace '{}'\", workspaceId);\n\n      // 1st stage - converting Che model env to Kubernetes env\n      LOG.debug(\"Provisioning servers & env vars converters for workspace '{}'\", workspaceId);\n      serversConverter.provision(k8sEnv, identity);\n      previewUrlExposer.expose(k8sEnv);\n      envVarsConverter.provision(k8sEnv, identity);\n\n      // 2nd stage - add Kubernetes env items\n      LOG.debug(\"Provisioning environment items for workspace '{}'\", workspaceId);\n      restartPolicyRewriter.provision(k8sEnv, identity);\n      resourceLimitRequestProvisioner.provision(k8sEnv, identity);\n      externalServerTlsProvisioner.provision(k8sEnv, identity);\n      securityContextProvisioner.provision(k8sEnv, identity);\n      podTerminationGracePeriodProvisioner.provision(k8sEnv, identity);\n      imagePullSecretProvisioner.provision(k8sEnv, identity);\n      serviceAccountProvisioner.provision(k8sEnv, identity);\n      certificateProvisioner.provision(k8sEnv, identity);\n      sshKeysProvisioner.provision(k8sEnv, identity);\n      vcsSslCertificateProvisioner.provision(k8sEnv, identity);\n      gitConfigProvisioner.provision(k8sEnv, identity);\n      gatewayRouterProvisioner.provision(k8sEnv, identity);\n      uniqueNamesProvisioner.provision(k8sEnv, identity);\n      LOG.debug(\"Provisioning Kubernetes environment done for workspace '{}'\", workspaceId);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/KubernetesInfraModule.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport static com.google.inject.name.Names.named;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.DOCKERIMAGE_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.DefaultHostExternalServiceExposureStrategy.DEFAULT_HOST_STRATEGY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.SingleHostExternalServiceExposureStrategy.SINGLE_HOST_STRATEGY;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.assistedinject.FactoryModuleBuilder;\nimport com.google.inject.multibindings.MapBinder;\nimport com.google.inject.multibindings.Multibinder;\nimport java.util.Map;\nimport org.eclipse.che.api.system.server.ServiceTermination;\nimport org.eclipse.che.api.workspace.server.NoEnvironmentFactory;\nimport org.eclipse.che.api.workspace.server.WorkspaceAttributeValidator;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileBindings;\nimport org.eclipse.che.api.workspace.server.devfile.validator.ComponentIntegrityValidator.NoopComponentIntegrityValidator;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironmentFactory;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.CheApiExternalEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.CheApiInternalEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.wsplugins.ChePluginsApplier;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.server.KubernetesNamespaceService;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.PermissionsCleaner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.cache.jpa.JpaKubernetesRuntimeCacheModule;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.devfile.DockerimageComponentToWorkspaceApplier;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesComponentToWorkspaceApplier;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesComponentValidator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesDevfileBindings;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironmentFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.RemoveNamespaceOnWorkspaceRemove;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.CredentialsSecretConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.GitconfigConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.NamespaceConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.OAuthTokenSecretsConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.PreferencesConfigMapConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.SshConfigConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.UserPermissionConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.UserPreferencesConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.UserProfileConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.WorkspaceServiceAccountConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.GatewayTlsProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.IngressTlsProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.KubernetesCheApiExternalEnvVarProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.KubernetesCheApiInternalEnvVarProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.KubernetesPreviewUrlCommandProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.PreviewUrlCommandProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.server.ServersConverter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.IngressAnnotationsProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.PreviewUrlExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.WorkspaceExposureType;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.DefaultHostExternalServiceExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServiceExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.GatewayServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.IngressServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.KubernetesExternalServerExposerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultihostIngressServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ServiceExposureStrategyProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.SingleHostExternalServiceExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposerFactoryProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.NonTlsDistributedClusterModeNotifier;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.KubernetesPluginsToolingApplier;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.PluginBrokerManager;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.BrokerEnvironmentFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.KubernetesBrokerEnvironmentFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events.BrokerService;\n\n/**\n * @author Sergii Leshchenko\n */\npublic class KubernetesInfraModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    Multibinder<WorkspaceAttributeValidator> workspaceAttributeValidators =\n        Multibinder.newSetBinder(binder(), WorkspaceAttributeValidator.class);\n    workspaceAttributeValidators.addBinding().to(K8sInfraNamespaceWsAttributeValidator.class);\n\n    // order matters here!\n    // We first need to grant permissions to user, only then we can run other configurators with\n    // user's client.\n    Multibinder<NamespaceConfigurator> namespaceConfigurators =\n        Multibinder.newSetBinder(binder(), NamespaceConfigurator.class);\n    namespaceConfigurators.addBinding().to(UserPermissionConfigurator.class);\n    namespaceConfigurators.addBinding().to(CredentialsSecretConfigurator.class);\n    namespaceConfigurators.addBinding().to(OAuthTokenSecretsConfigurator.class);\n    namespaceConfigurators.addBinding().to(PreferencesConfigMapConfigurator.class);\n    namespaceConfigurators.addBinding().to(WorkspaceServiceAccountConfigurator.class);\n    namespaceConfigurators.addBinding().to(UserProfileConfigurator.class);\n    namespaceConfigurators.addBinding().to(UserPreferencesConfigurator.class);\n    namespaceConfigurators.addBinding().to(SshConfigConfigurator.class);\n    namespaceConfigurators.addBinding().to(GitconfigConfigurator.class);\n\n    bind(PermissionsCleaner.class).asEagerSingleton();\n\n    bind(KubernetesNamespaceService.class);\n\n    MapBinder<String, InternalEnvironmentFactory> factories =\n        MapBinder.newMapBinder(binder(), String.class, InternalEnvironmentFactory.class);\n\n    factories.addBinding(KubernetesEnvironment.TYPE).to(KubernetesEnvironmentFactory.class);\n    factories.addBinding(Constants.NO_ENVIRONMENT_RECIPE_TYPE).to(NoEnvironmentFactory.class);\n\n    MapBinder<WorkspaceExposureType, TlsProvisioner<KubernetesEnvironment>> tlsProvisioners =\n        MapBinder.newMapBinder(\n            binder(),\n            new TypeLiteral<WorkspaceExposureType>() {},\n            new TypeLiteral<TlsProvisioner<KubernetesEnvironment>>() {});\n    tlsProvisioners\n        .addBinding(WorkspaceExposureType.GATEWAY)\n        .to(new TypeLiteral<GatewayTlsProvisioner<KubernetesEnvironment>>() {});\n    tlsProvisioners.addBinding(WorkspaceExposureType.NATIVE).to(IngressTlsProvisioner.class);\n\n    bind(new TypeLiteral<KubernetesEnvironmentProvisioner<KubernetesEnvironment>>() {})\n        .to(KubernetesEnvironmentProvisioner.KubernetesEnvironmentProvisionerImpl.class);\n\n    install(new FactoryModuleBuilder().build(StartSynchronizerFactory.class));\n\n    bind(RemoveNamespaceOnWorkspaceRemove.class).asEagerSingleton();\n\n    bind(CheApiInternalEnvVarProvider.class).to(KubernetesCheApiInternalEnvVarProvider.class);\n    bind(CheApiExternalEnvVarProvider.class).to(KubernetesCheApiExternalEnvVarProvider.class);\n\n    Multibinder.newSetBinder(binder(), ServiceTermination.class)\n        .addBinding()\n        .to(KubernetesClientTermination.class);\n\n    MapBinder<String, ExternalServiceExposureStrategy> ingressStrategies =\n        MapBinder.newMapBinder(binder(), String.class, ExternalServiceExposureStrategy.class);\n    ingressStrategies\n        .addBinding(MULTI_HOST_STRATEGY)\n        .to(MultiHostExternalServiceExposureStrategy.class);\n    ingressStrategies\n        .addBinding(SINGLE_HOST_STRATEGY)\n        .to(SingleHostExternalServiceExposureStrategy.class);\n    ingressStrategies\n        .addBinding(DEFAULT_HOST_STRATEGY)\n        .to(DefaultHostExternalServiceExposureStrategy.class);\n    bind(ExternalServiceExposureStrategy.class).toProvider(ServiceExposureStrategyProvider.class);\n\n    MapBinder<WorkspaceExposureType, ExternalServerExposer<KubernetesEnvironment>>\n        exposureStrategies =\n            MapBinder.newMapBinder(binder(), new TypeLiteral<>() {}, new TypeLiteral<>() {});\n    exposureStrategies\n        .addBinding(WorkspaceExposureType.NATIVE)\n        .to(new TypeLiteral<IngressServerExposer<KubernetesEnvironment>>() {});\n    exposureStrategies\n        .addBinding(WorkspaceExposureType.GATEWAY)\n        .to(new TypeLiteral<GatewayServerExposer<KubernetesEnvironment>>() {});\n\n    bind(new TypeLiteral<ExternalServerExposer<KubernetesEnvironment>>() {})\n        .annotatedWith(com.google.inject.name.Names.named(\"multihost-exposer\"))\n        .to(new TypeLiteral<MultihostIngressServerExposer<KubernetesEnvironment>>() {});\n\n    bind(new TypeLiteral<ExternalServerExposerProvider<KubernetesEnvironment>>() {})\n        .to(new TypeLiteral<KubernetesExternalServerExposerProvider<KubernetesEnvironment>>() {});\n\n    bind(ServersConverter.class).to(new TypeLiteral<ServersConverter<KubernetesEnvironment>>() {});\n    bind(PreviewUrlExposer.class)\n        .to(new TypeLiteral<PreviewUrlExposer<KubernetesEnvironment>>() {});\n    bind(PreviewUrlCommandProvisioner.class)\n        .to(new TypeLiteral<KubernetesPreviewUrlCommandProvisioner>() {});\n\n    bind(new TypeLiteral<Map<String, String>>() {})\n        .annotatedWith(named(\"infra.kubernetes.ingress.annotations\"))\n        .toProvider(IngressAnnotationsProvider.class);\n\n    install(new JpaKubernetesRuntimeCacheModule());\n\n    bind(SecureServerExposerFactoryProvider.class)\n        .to(new TypeLiteral<SecureServerExposerFactoryProvider<KubernetesEnvironment>>() {});\n\n    MapBinder<String, ChePluginsApplier> chePluginsAppliers =\n        MapBinder.newMapBinder(binder(), String.class, ChePluginsApplier.class);\n    chePluginsAppliers\n        .addBinding(KubernetesEnvironment.TYPE)\n        .to(KubernetesPluginsToolingApplier.class);\n\n    bind(BrokerService.class);\n\n    bind(new TypeLiteral<BrokerEnvironmentFactory<KubernetesEnvironment>>() {})\n        .to(KubernetesBrokerEnvironmentFactory.class);\n\n    bind(PluginBrokerManager.class)\n        .to(new TypeLiteral<PluginBrokerManager<KubernetesEnvironment>>() {});\n\n    DevfileBindings.onComponentIntegrityValidatorBinder(\n        binder(),\n        binder -> {\n          binder.addBinding(KUBERNETES_COMPONENT_TYPE).to(KubernetesComponentValidator.class);\n          binder.addBinding(DOCKERIMAGE_COMPONENT_TYPE).to(NoopComponentIntegrityValidator.class);\n        });\n\n    DevfileBindings.onWorkspaceApplierBinder(\n        binder(),\n        binder -> {\n          binder\n              .addBinding(KUBERNETES_COMPONENT_TYPE)\n              .to(KubernetesComponentToWorkspaceApplier.class);\n          binder\n              .addBinding(DOCKERIMAGE_COMPONENT_TYPE)\n              .to(DockerimageComponentToWorkspaceApplier.class);\n        });\n\n    KubernetesDevfileBindings.addKubernetesBasedEnvironmentTypeBindings(\n        binder(), KubernetesEnvironment.TYPE);\n    KubernetesDevfileBindings.addKubernetesBasedComponentTypeBindings(\n        binder(), KUBERNETES_COMPONENT_TYPE);\n\n    // We need to initialize the bindings somehow. Because no other environment type is upgradable\n    // to kubernetes, we just call this in a way that initializes the binding with an empty map.\n    KubernetesDevfileBindings.addAllowedEnvironmentTypeUpgradeBindings(\n        binder(), KubernetesEnvironment.TYPE);\n\n    bind(NonTlsDistributedClusterModeNotifier.class);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/KubernetesInfrastructure.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport javax.inject.Singleton;\n\n/**\n * @author Sergii Leshchenko\n */\n@Singleton\npublic class KubernetesInfrastructure {\n\n  public static final String NAME = \"kubernetes\";\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/KubernetesInfrastructureException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\n\n/**\n * An exception thrown by {@link KubernetesInfrastructure} and related components. Indicates that an\n * infrastructure operation can't be performed or an error occurred during operation execution.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesInfrastructureException extends InfrastructureException {\n  public KubernetesInfrastructureException(KubernetesClientException e) {\n    super(extractMessage(e), e);\n  }\n\n  private static String extractMessage(KubernetesClientException e) {\n    int code = e.getCode();\n    if (code == 401 || code == 403) {\n      return e.getMessage()\n          + \" The error may be caused by an expired token or changed password. \"\n          + \"Update Che server deployment with a new token or password.\";\n    } else {\n      return e.getMessage();\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/MachineLogsPublisher.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.cache.KubernetesMachineCache;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesMachineImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEventHandler;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.slf4j.Logger;\n\n/** Listens pod events and publish them as machine logs. */\npublic class MachineLogsPublisher implements PodEventHandler {\n\n  private static final Logger LOG = getLogger(MachineLogsPublisher.class);\n\n  private final RuntimeEventsPublisher eventPublisher;\n  private final KubernetesMachineCache machines;\n  private final RuntimeIdentity runtimeIdentity;\n\n  public MachineLogsPublisher(\n      RuntimeEventsPublisher eventPublisher,\n      KubernetesMachineCache machines,\n      RuntimeIdentity runtimeIdentity) {\n    this.eventPublisher = eventPublisher;\n    this.machines = machines;\n    this.runtimeIdentity = runtimeIdentity;\n  }\n\n  @Override\n  public void handle(PodEvent event) {\n    final String podName = event.getPodName();\n    try {\n      for (KubernetesMachineImpl machine : machines.getMachines(runtimeIdentity).values()) {\n        if (machine.getPodName().equals(podName)) {\n          eventPublisher.sendMachineLogEvent(\n              machine.getName(), event.getMessage(), event.getCreationTimeStamp(), runtimeIdentity);\n          return;\n        }\n      }\n    } catch (InfrastructureException e) {\n      LOG.error(\"Error while machine fetching for logs publishing. Cause: {}\", e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/Names.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_ORIGINAL_NAME_LABEL;\n\nimport com.google.common.collect.Maps;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\n\n/**\n * Helps to work with Kubernetes objects names.\n *\n * @author Sergii Leshchenko\n */\npublic class Names {\n\n  public static final int MAX_CONTAINER_NAME_LENGTH = 63; // K8S container name limit\n\n  private static final char WORKSPACE_ID_PREFIX_SEPARATOR = '.';\n\n  private static final int GENERATED_PART_SIZE = 8;\n\n  private static final String CONTAINER_DISPLAY_NAMES_FMT =\n      \"org.eclipse.che.container.display-name/%s\";\n\n  /**\n   * Returns machine name for the specified container in the specified pod.\n   *\n   * <p>This is a convenience method for {@link #machineName(ObjectMeta, Container)}\n   */\n  public static String machineName(PodData podData, Container container) {\n    return machineName(podData.getMetadata(), container);\n  }\n\n  /**\n   * Records the machine name used for given container in the annotations of the object metadata.\n   *\n   * @param objectMeta the object metadata\n   * @param containerName the name of the container\n   * @param machineName the name of the machine of the container\n   */\n  public static void putMachineName(\n      ObjectMeta objectMeta, String containerName, String machineName) {\n\n    Map<String, String> annotations = objectMeta.getAnnotations();\n    if (annotations == null) {\n      objectMeta.setAnnotations(annotations = new HashMap<>());\n    }\n\n    putMachineName(annotations, containerName, machineName);\n  }\n\n  /**\n   * Transforms the provided mapping of container names to machine names into a map of annotations\n   * to be put in some Kubernetes object's metadata.\n   *\n   * @param containerToMachineNames the mapping of container names to machine names\n   * @return a map of annotations\n   */\n  public static Map<String, String> createMachineNameAnnotations(\n      Map<String, String> containerToMachineNames) {\n\n    Map<String, String> ret = new HashMap<>();\n\n    containerToMachineNames.forEach((c, m) -> putMachineName(ret, c, m));\n\n    return ret;\n  }\n\n  /**\n   * Similar to {@link #createMachineNameAnnotations(Map)} but only creates annotations for a single\n   * mapping.\n   *\n   * @param containerName the name of the container\n   * @param machineName the name of the machine\n   * @return a map of annotations for the container-machine mapping\n   * @see #createMachineNameAnnotations(Map)\n   */\n  public static Map<String, String> createMachineNameAnnotations(\n      String containerName, String machineName) {\n    Map<String, String> ret = Maps.newHashMapWithExpectedSize(2);\n    putMachineName(ret, containerName, machineName);\n    return ret;\n  }\n\n  private static void putMachineName(\n      Map<String, String> annotations, String containerName, String machineName) {\n    annotations.put(format(CONTAINER_DISPLAY_NAMES_FMT, containerName), machineName);\n  }\n\n  /**\n   * Returns machine name for the specified container in the specified pod.\n   *\n   * <p>Machine name is evaluated by the following algorithm:<br>\n   *\n   * <pre>\n   * If an annotation with machine name for the corresponding container exists\n   *   then return this value\n   * If a label with original pod name exists\n   *   then return originalPodName + '/' + containerName\n   * otherwise return podName + '/' + containerName as machine name\n   * </pre>\n   */\n  public static String machineName(ObjectMeta podMeta, Container container) {\n    final Map<String, String> annotations = podMeta.getAnnotations();\n    final String machineName;\n    final String containerName = container.getName();\n\n    if (containerName != null && containerName.length() > MAX_CONTAINER_NAME_LENGTH) {\n      throw new IllegalArgumentException(\n          format(\n              \"The container name '%s' exceeds the allowed limit of %s characters.\",\n              containerName, MAX_CONTAINER_NAME_LENGTH));\n    }\n\n    if (annotations != null\n        && (machineName = annotations.get(format(CONTAINER_DISPLAY_NAMES_FMT, containerName)))\n            != null) {\n      return machineName;\n    }\n\n    final String originalPodName;\n    final Map<String, String> labels = podMeta.getLabels();\n    if (labels != null && (originalPodName = labels.get(CHE_ORIGINAL_NAME_LABEL)) != null) {\n      return originalPodName + '/' + containerName;\n    }\n    return podMeta.getName() + '/' + containerName;\n  }\n\n  /** Return pod name that will be unique for a whole namespace. */\n  public static String uniqueResourceName(String originalResourceName, String workspaceId) {\n    return workspaceId + WORKSPACE_ID_PREFIX_SEPARATOR + originalResourceName;\n  }\n\n  /** Returns randomly generated name with given prefix. */\n  public static String generateName(String prefix) {\n    return NameGenerator.generate(prefix, GENERATED_PART_SIZE);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/RuntimeLogsPublisher.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport java.util.Set;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEventHandler;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\n\n/** Listens pod events and publish them as runtime logs. */\npublic class RuntimeLogsPublisher implements PodEventHandler {\n\n  private final RuntimeEventsPublisher eventPublisher;\n  private final RuntimeIdentity runtimeIdentity;\n  private final Set<String> pods;\n\n  public RuntimeLogsPublisher(\n      RuntimeEventsPublisher eventPublisher, RuntimeIdentity runtimeIdentity, Set<String> pods) {\n    this.eventPublisher = eventPublisher;\n    this.pods = pods;\n    this.runtimeIdentity = runtimeIdentity;\n  }\n\n  @Override\n  public void handle(PodEvent event) {\n    final String podName = event.getPodName();\n    if (pods.contains(podName)) {\n      eventPublisher.sendRuntimeLogEvent(\n          event.getMessage(), event.getCreationTimeStamp(), runtimeIdentity);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/StartSynchronizer.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport com.google.inject.assistedinject.Assisted;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.CompletionException;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.TimeUnit;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.core.notification.EventSubscriber;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.RuntimeStartInterruptedException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.event.KubernetesRuntimeStoppedEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.event.KubernetesRuntimeStoppingEvent;\n\n/**\n * Controls the runtime start flow and helps to cancel it.\n *\n * <p>The runtime start with cancellation using the Start Synchronizer might look like:\n *\n * <pre>\n * ...\n *   public void startRuntime() {\n *     startSynchronizer.setStartThread();\n *     try {\n *       startMachines();\n *       startSynchronizer.checkFailure();\n *\n *       // ...\n *\n *       waitMachines()\n *         .then(startSynchronizer.checkFailure())\n *         .then(bootstrapAsync())\n *         .then(startSynchronizer.checkFailure())\n *         .then(checkServers)\n *         // ...\n *\n *       startSynchronizer.complete();\n *     } catch (Exception ex) {\n *       startSynchronizer.completeExceptionally(ex);\n *       throw ex;\n *     }\n *   }\n * ...\n * </pre>\n *\n * <p>At the same time stopping might look like:\n *\n * <pre>\n * ...\n *   public void stopRuntime() {\n *     if (startSynchronizer.interrupt()) {\n *       try {\n *         if (startSynchronizer.awaitInterruption(30)) {\n *           // runtime is interrupted correctly\n *         } else {\n *           // runtime is not interrupted correctly in time\n *           // need to forcibly stop it and clean up used resources\n *         }\n *       } catch (RuntimeStartInterruptedException ex) {\n *         // normal stop\n *       } catch (InterruptedException ex) {\n *         Thread.currentThread().interrupt();\n *         ...\n *       }\n *     }\n *   }\n * ...\n * </pre>\n *\n * <p>Note that class is designed to work in clustered mode. For this purpose it listens to {@link\n * KubernetesRuntimeStoppedEvent} and {@link KubernetesRuntimeStoppingEvent} events. So, if Che\n * Server is run in clustered mode then the described events must be published via {@link\n * EventService} otherwise start interruption won't work correctly.\n *\n * @author Sergii Leshchenko\n */\npublic class StartSynchronizer {\n\n  private final RuntimeIdentity runtimeId;\n  private final EventService eventService;\n\n  // future that holds error that occurs during runtime start\n  // failure must be completed with null value when start is finished without any exception\n  private final CompletableFuture<Void> startFailure;\n\n  // latch that indicates whether start is completed or not\n  private CountDownLatch completionLatch;\n\n  // thread which is performing start\n  // it may be nullable when start is performing on another Che Server instance\n  private Thread startThread;\n\n  // flag that indicates whether start is in progress or not\n  private boolean isStarting;\n  private long startTimeMillis;\n\n  private final RuntimeStartInterrupter runtimeStartInterrupter;\n  private final RuntimeStopWatcher runtimeStopWatcher;\n\n  @Inject\n  public StartSynchronizer(EventService eventService, @Assisted RuntimeIdentity runtimeId) {\n    this.eventService = eventService;\n    this.startFailure = new CompletableFuture<>();\n    this.completionLatch = new CountDownLatch(0);\n    this.runtimeId = runtimeId;\n    this.runtimeStartInterrupter = new RuntimeStartInterrupter();\n    this.runtimeStopWatcher = new RuntimeStopWatcher();\n    this.isStarting = false;\n  }\n\n  /** Registers a runtime start. */\n  public synchronized void start() {\n    if (!isStarting) {\n      isStarting = true;\n      startTimeMillis = System.currentTimeMillis();\n      completionLatch = new CountDownLatch(1);\n      eventService.subscribe(runtimeStartInterrupter, KubernetesRuntimeStoppingEvent.class);\n      eventService.subscribe(runtimeStopWatcher, KubernetesRuntimeStoppedEvent.class);\n    }\n  }\n\n  /**\n   * Sets {@link Thread#currentThread()} as a {@link #startThread}.\n   *\n   * @throws InternalInfrastructureException when {@link #startThread} is already set.\n   */\n  public synchronized void setStartThread() throws InternalInfrastructureException {\n    if (startThread != null) {\n      throw new InternalInfrastructureException(\"Runtime is already started\");\n    }\n    startThread = Thread.currentThread();\n  }\n\n  /**\n   * Registers start completion.\n   *\n   * <p>It also releases {@link #awaitInterruption(long, TimeUnit)}.\n   *\n   * @throws RuntimeStartInterruptedException when start was interrupted\n   * @throws InfrastructureException when any other exception occurs during start\n   */\n  public synchronized void complete() throws InfrastructureException {\n    completionLatch.countDown();\n    startThread = null;\n    isStarting = false;\n    eventService.unsubscribe(runtimeStartInterrupter);\n    eventService.unsubscribe(runtimeStopWatcher);\n\n    // try to complete start failure holder and\n    // rethrow original exception if it is already completed exceptionally\n    if (!startFailure.complete(null) && startFailure.isCompletedExceptionally()) {\n      try {\n        // future is already completed.\n        startFailure.getNow(null);\n      } catch (CompletionException e) {\n        rethrowCause(e);\n      }\n    }\n  }\n\n  /**\n   * Registers exception that occurs during runtime start.\n   *\n   * <p>Note that only first exception will be saved.\n   *\n   * <p>It also releases {@link #awaitInterruption(long, TimeUnit)}.\n   */\n  public synchronized void completeExceptionally(Exception ex) {\n    startFailure.completeExceptionally(ex);\n\n    completionLatch.countDown();\n    startThread = null;\n    isStarting = false;\n    eventService.unsubscribe(runtimeStartInterrupter);\n    eventService.unsubscribe(runtimeStopWatcher);\n  }\n\n  /**\n   * Checks if start is failed.\n   *\n   * <p>If yes then original exception will be rethrown.\n   *\n   * @throws RuntimeStartInterruptedException when start was interrupted\n   * @throws InfrastructureException when any other exception occurs during start\n   */\n  public void checkFailure() throws InfrastructureException {\n    try {\n      startFailure.getNow(null);\n      // no exception hasn't occurred yet\n    } catch (CompletionException e) {\n      rethrowCause(e);\n    }\n  }\n\n  /** Returns future that holds error that occurs during runtime start */\n  public CompletableFuture<Void> getStartFailure() {\n    return startFailure;\n  }\n\n  /**\n   * Interrupts workspace start if it is in progress and is not interrupted yet\n   *\n   * @return true if workspace start is interrupted, false otherwise\n   */\n  public synchronized boolean interrupt() {\n    if (!isStarting) {\n      return false;\n    }\n    startFailure.completeExceptionally(new RuntimeStartInterruptedException(runtimeId));\n\n    if (startThread != null) {\n      startThread.interrupt();\n      // set to not to interrupt twice\n      startThread = null;\n    }\n\n    return true;\n  }\n\n  /**\n   * Awaits until workspace start process will be completed.\n   *\n   * <p>Returns true is interruption is completed. Or returns false when interruption wasn't\n   * received or processed by start thread and workspace is STARTING or STOPPING. So it's needed to\n   * stop a runtime and clean up used resources.\n   *\n   * @throws InterruptedException if the current thread is interrupted while waiting\n   */\n  public boolean awaitInterruption(long timeout, TimeUnit unit) throws InterruptedException {\n    boolean isCompleted = completionLatch.await(timeout, unit);\n\n    if (isCompleted) {\n      // check start failure\n      try {\n        startFailure.get();\n      } catch (ExecutionException e) {\n        // start is interrupted or failed. Resources are freed\n        return true;\n      }\n    }\n    // runtime start is still in progress\n    return false;\n  }\n\n  /** Returns true if start is completed, false otherwise. */\n  public boolean isCompleted() {\n    return completionLatch.getCount() == 0;\n  }\n\n  /** Returns start failure exception if occurred otherwise null will be returned. */\n  public InfrastructureException getStartFailureNow() {\n    try {\n      startFailure.getNow(null);\n      return null;\n    } catch (CompletionException e) {\n      Throwable cause = e.getCause();\n      if (cause instanceof InfrastructureException) {\n        return (InfrastructureException) cause;\n      } else {\n        return new InternalInfrastructureException(cause.getMessage(), cause);\n      }\n    }\n  }\n\n  private void rethrowCause(Throwable e) throws InfrastructureException {\n    try {\n      throw e.getCause();\n    } catch (InfrastructureException ex) {\n      throw ex;\n    } catch (Throwable ex) {\n      throw new InternalInfrastructureException(ex.getMessage(), ex);\n    }\n  }\n\n  /**\n   * Listens {@link KubernetesRuntimeStoppingEvent} and interrupts workspace start when workspace\n   * become {@link WorkspaceStatus#STOPPING}.\n   */\n  private class RuntimeStartInterrupter implements EventSubscriber<KubernetesRuntimeStoppingEvent> {\n    @Override\n    public void onEvent(KubernetesRuntimeStoppingEvent event) {\n      if (event.getWorkspaceId().equals(runtimeId.getWorkspaceId())) {\n        interrupt();\n      }\n    }\n  }\n\n  /**\n   * Listens {@link KubernetesRuntimeStoppedEvent} and releases {@link #completionLatch} when\n   * workspace become {@link WorkspaceStatus#STOPPED}.\n   */\n  private class RuntimeStopWatcher implements EventSubscriber<KubernetesRuntimeStoppedEvent> {\n    @Override\n    public void onEvent(KubernetesRuntimeStoppedEvent event) {\n      if (event.getWorkspaceId().equals(runtimeId.getWorkspaceId())) {\n        try {\n          // try to complete start it if is not completed yet\n          complete();\n        } catch (InfrastructureException ignored) {\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/StartSynchronizerFactory.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\n\n/**\n * @author Sergii Leshchenko\n */\npublic interface StartSynchronizerFactory {\n  StartSynchronizer create(RuntimeIdentity runtimeIdentity);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/Warnings.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\n/**\n * Constants for Kubernetes infrastructure specific warnings.\n *\n * @author Sergii Leshchenko\n */\npublic final class Warnings {\n\n  public static final int INGRESSES_IGNORED_WARNING_CODE = 4100;\n  public static final String INGRESSES_IGNORED_WARNING_MESSAGE =\n      \"Ingresses specified in Kubernetes recipe are ignored. \"\n          + \"To expose ports please define servers in machine configuration.\";\n\n  public static final int RESTART_POLICY_SET_TO_NEVER_WARNING_CODE = 4104;\n  public static final String RESTART_POLICY_SET_TO_NEVER_WARNING_MESSAGE_FMT =\n      \"Restart policy '%s' for pod '%s' is rewritten with %s\";\n\n  public static final int UNKNOWN_SECURE_SERVER_EXPOSER_CONFIGURED_IN_WS_WARNING_CODE = 4105;\n\n  public static final int COMMAND_IS_CONFIGURED_IN_PLUGIN_WITHOUT_CONTAINERS_WARNING_CODE = 4106;\n  public static final String\n      COMMAND_IS_CONFIGURED_IN_PLUGIN_WITHOUT_CONTAINERS_WARNING_MESSAGE_FMT =\n          \"There are configured commands for plugin '%s' that doesn't have any containers\";\n\n  public static final int COMMAND_IS_CONFIGURED_IN_PLUGIN_WITH_MULTIPLY_CONTAINERS_WARNING_CODE =\n      4107;\n  public static final String\n      COMMAND_IS_CONFIGURED_IN_PLUGIN_WITH_MULTIPLY_CONTAINERS_WARNING_MESSAGE_FMT =\n          \"There are configured commands for plugin '%s' that has multiply containers. Commands will be configured to be run in first container\";\n\n  public static final int JSON_IS_NOT_A_VALID_REPRESENTATION_FOR_AN_OBJECT_OF_TYPE_WARNING_CODE =\n      4108;\n  public static final String JSON_IS_NOT_A_VALID_REPRESENTATION_FOR_AN_OBJECT_OF_TYPE_MESSAGE_FMT =\n      \"Unable to provision git configuration into runtime. \"\n          + \"Json object in user preferences is not a valid representation for an object of type map: '%s'\";\n\n  public static final int EXCEPTION_IN_USER_MANAGEMENT_DURING_GIT_PROVISION_WARNING_CODE = 4109;\n  public static final String EXCEPTION_IN_USER_MANAGEMENT_DURING_GIT_PROVISION_MESSAGE_FMT =\n      \"Unable to provision git configuration into runtime. \"\n          + \"Internal server error occurred during operating with user management: '%s'\";\n\n  public static final int NOT_ABLE_TO_PROVISION_OBJECTS_FOR_PREVIEW_URL = 4110;\n  public static final String NOT_ABLE_TO_PROVISION_OBJECTS_FOR_PREVIEW_URL_MESSAGE =\n      \"Not able to provision objects for PreviewUrl. Message: '%s'\";\n\n  public static final int NOT_ABLE_TO_PROVISION_SSH_KEYS = 4111;\n  public static final String NOT_ABLE_TO_PROVISION_SSH_KEYS_MESSAGE =\n      \"Not able to provision SSH Keys. Message: '%s'\";\n\n  public static final int NOT_ABLE_TO_PROVISION_WORKSPACE_DEPLOYMENT = 4200;\n  public static final String NOT_ABLE_TO_PROVISION_WORKSPACE_DEPLOYMENT_MESSAGE =\n      \"Not able to find workspace attributes for %s. Reason %s\";\n\n  public static final int NOT_ABLE_TO_PROVISION_WORKSPACE_DEPLOYMENT_LABELS_OR_ANNOTATIONS = 4250;\n  public static final String\n      NOT_ABLE_TO_PROVISION_WORKSPACE_DEPLOYMENT_LABELS_OR_ANNOTATIONS_MESSAGE =\n          \"Not able to provision workspace %s deployment labels or annotations because of invalid configuration. Reason: '%s'\";\n\n  public static final int SSH_KEYS_WILL_NOT_BE_MOUNTED = 4300;\n  public static final String SSH_KEYS_WILL_NOT_BE_MOUNTED_MESSAGE =\n      \"Ssh keys %s have invalid names and can't be mounted to workspace %s.\";\n\n  private Warnings() {}\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/api/server/KubernetesNamespaceService.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.api.server;\n\nimport static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport com.google.common.annotations.Beta;\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.media.ArraySchema;\nimport io.swagger.v3.oas.annotations.media.Content;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.POST;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.Produces;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.rest.Service;\nimport org.eclipse.che.api.core.rest.shared.dto.ExtendedError;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto.KubernetesNamespaceMetaDto;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.NamespaceProvisioner;\n\n/**\n * @author Sergii Leshchenko\n */\n@Tag(name = \"kubernetes-namespace\", description = \"Kubernetes REST API for working with Namespaces\")\n@Path(\"/kubernetes/namespace\")\n@Beta\npublic class KubernetesNamespaceService extends Service {\n\n  private final KubernetesNamespaceFactory namespaceFactory;\n  private final NamespaceProvisioner namespaceProvisioner;\n\n  @Inject\n  public KubernetesNamespaceService(\n      KubernetesNamespaceFactory namespaceFactory, NamespaceProvisioner namespaceProvisioner) {\n    this.namespaceFactory = namespaceFactory;\n    this.namespaceProvisioner = namespaceProvisioner;\n  }\n\n  @GET\n  @Produces(APPLICATION_JSON)\n  @Operation(\n      summary =\n          \"Get k8s namespaces where user is able to create workspaces. This operation can be performed only by authorized user.\"\n              + \"This is under beta and may be significant changed\",\n      responses = {\n        @ApiResponse(\n            responseCode = \"200\",\n            description = \"The namespaces successfully fetched\",\n            content =\n                @Content(array = @ArraySchema(schema = @Schema(implementation = String.class)))),\n        @ApiResponse(\n            responseCode = \"500\",\n            description = \"Internal server error occurred during namespaces fetching\")\n      })\n  public List<KubernetesNamespaceMetaDto> getNamespaces() throws InfrastructureException {\n    return namespaceFactory.list().stream().map(this::asDto).collect(Collectors.toList());\n  }\n\n  @POST\n  @Path(\"provision\")\n  @Produces(APPLICATION_JSON)\n  @Operation(\n      summary =\n          \"Provision k8s namespace where user is able to create workspaces. This operation can be performed only by an authorized user.\"\n              + \" This is a beta feature that may be significantly changed.\",\n      responses = {\n        @ApiResponse(\n            responseCode = \"200\",\n            description = \"The namespace successfully provisioned\",\n            content =\n                @Content(schema = @Schema(implementation = KubernetesNamespaceMetaDto.class))),\n        @ApiResponse(\n            responseCode = \"500\",\n            description = \"Internal server error occurred during namespace provisioning\")\n      })\n  public KubernetesNamespaceMetaDto provision() throws ApiException {\n    try {\n      return asDto(\n          namespaceProvisioner.provision(\n              new NamespaceResolutionContext(EnvironmentContext.getCurrent().getSubject())));\n    } catch (InfrastructureException e) {\n      throw new ServerException(newDto(ExtendedError.class).withMessage(e.getMessage()));\n    }\n  }\n\n  private KubernetesNamespaceMetaDto asDto(KubernetesNamespaceMeta kubernetesNamespaceMeta) {\n    return DtoFactory.newDto(KubernetesNamespaceMetaDto.class)\n        .withName(kubernetesNamespaceMeta.getName())\n        .withAttributes(kubernetesNamespaceMeta.getAttributes());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/api/server/impls/KubernetesNamespaceMetaImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.api.server.impls;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\n\n/**\n * @author Sergii Leshchenko\n */\npublic class KubernetesNamespaceMetaImpl implements KubernetesNamespaceMeta {\n\n  private String name;\n  private Map<String, String> attributes;\n\n  public KubernetesNamespaceMetaImpl(String name) {\n    this.name = name;\n  }\n\n  public KubernetesNamespaceMetaImpl(String name, Map<String, String> attributes) {\n    this.name = name;\n    if (attributes != null) {\n      this.attributes = new HashMap<>(attributes);\n    }\n  }\n\n  public KubernetesNamespaceMetaImpl(KubernetesNamespaceMeta namespaceMeta) {\n    this(namespaceMeta.getName(), namespaceMeta.getAttributes());\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof KubernetesNamespaceMetaImpl)) {\n      return false;\n    }\n    KubernetesNamespaceMetaImpl that = (KubernetesNamespaceMetaImpl) o;\n    return Objects.equals(getName(), that.getName())\n        && Objects.equals(getAttributes(), that.getAttributes());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(getName(), getAttributes());\n  }\n\n  @Override\n  public String toString() {\n    return \"KubernetesNamespaceMetaImpl{\"\n        + \"name='\"\n        + name\n        + '\\''\n        + \", attributes=\"\n        + attributes\n        + '}';\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/api/shared/KubernetesNamespaceMeta.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.api.shared;\n\nimport java.util.Map;\n\n/**\n * Describes meta information about kubernetes namespace.\n *\n * @author Sergii Leshchenko\n */\npublic interface KubernetesNamespaceMeta {\n\n  /**\n   * Attribute that shows if k8s namespace is configured as default. Possible values: true/false.\n   * Absent value should be considered as false.\n   */\n  String DEFAULT_ATTRIBUTE = \"default\";\n\n  /**\n   * Attributes that contains information about current namespace status. Example values: Active,\n   * Terminating. Absent value indicates that namespace is not created yet.\n   */\n  String PHASE_ATTRIBUTE = \"phase\";\n\n  /**\n   * Returns the name of namespace.\n   *\n   * <p>Value may be not a name of existing namespace, but predicted name with placeholders inside,\n   * like <workspaceid>.\n   */\n  String getName();\n\n  /** Returns namespace attributes, which may contains additional info about it like description. */\n  Map<String, String> getAttributes();\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/api/shared/dto/DockerAuthConfig.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Implementation of docker AuthConfig object\n *\n * @author andrew00x\n * @see <a href=\"https://github.com/docker/docker/blob/v1.6.0/registry/auth.go#L29\">source</a>\n */\n@DTO\npublic interface DockerAuthConfig {\n  String getUsername();\n\n  void setUsername(String username);\n\n  DockerAuthConfig withUsername(String username);\n\n  String getPassword();\n\n  void setPassword(String password);\n\n  DockerAuthConfig withPassword(String password);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/api/shared/dto/DockerAuthConfigs.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto;\n\nimport java.util.Map;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Implementation of docker model ConfigFile object\n *\n * @author Max Shaposhnik\n * @see <a href=\"https://github.com/docker/docker/blob/v1.6.0/registry/auth.go#L37\">source</a>\n */\n@DTO\npublic interface DockerAuthConfigs {\n\n  Map<String, DockerAuthConfig> getConfigs();\n\n  void setConfigs(Map<String, DockerAuthConfig> configs);\n\n  DockerAuthConfigs withConfigs(Map<String, DockerAuthConfig> configs);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/api/shared/dto/KubernetesNamespaceMetaDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto;\n\nimport java.util.Map;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\n\n/**\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface KubernetesNamespaceMetaDto extends KubernetesNamespaceMeta {\n  @Override\n  String getName();\n\n  void setName(String name);\n\n  KubernetesNamespaceMetaDto withName(String name);\n\n  @Override\n  Map<String, String> getAttributes();\n\n  void setAttributes(Map<String, String> attributes);\n\n  KubernetesNamespaceMetaDto withAttributes(Map<String, String> attributes);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/authorization/AuthorizationChecker.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.authorization;\n\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.subject.Subject;\n\n/** This {@link AuthorizationChecker} checks if user is allowed to use Che. */\npublic interface AuthorizationChecker {\n\n  boolean isAuthorized(Subject subject) throws InfrastructureException;\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/authorization/AuthorizationException.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.authorization;\n\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\n\n/**\n * An exception thrown by RuntimeInfrastructure and related components. Indicates that a user is not\n * authorized to use Che.\n *\n * @author Anatolii Bazko\n */\npublic class AuthorizationException extends InfrastructureException {\n  public AuthorizationException(String message) {\n    super(message);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/authorization/KubernetesOIDCAuthorizationCheckerImpl.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.authorization;\n\nimport static org.eclipse.che.commons.lang.StringUtils.strToSet;\n\nimport java.util.Collections;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.subject.Subject;\n\n/** This {@link KubernetesOIDCAuthorizationCheckerImpl} checks if user is allowed to use Che. */\n@Singleton\npublic class KubernetesOIDCAuthorizationCheckerImpl implements AuthorizationChecker {\n\n  private final Set<String> allowUsers;\n  private final Set<String> allowGroups;\n  private final Set<String> denyUsers;\n  private final Set<String> denyGroups;\n\n  @Inject\n  public KubernetesOIDCAuthorizationCheckerImpl(\n      @Nullable @Named(\"che.infra.kubernetes.advanced_authorization.allow_users\") String allowUsers,\n      @Nullable @Named(\"che.infra.kubernetes.advanced_authorization.allow_groups\")\n          String allowGroups,\n      @Nullable @Named(\"che.infra.kubernetes.advanced_authorization.deny_users\") String denyUsers,\n      @Nullable @Named(\"che.infra.kubernetes.advanced_authorization.deny_groups\") String denyGroups,\n      @Named(\"che.infra.kubernetes.advanced_authorization.delimiter\") String delimiter) {\n    this.allowUsers = strToSet(allowUsers, delimiter);\n    this.allowGroups = strToSet(allowGroups, delimiter);\n    this.denyUsers = strToSet(denyUsers, delimiter);\n    this.denyGroups = strToSet(denyGroups, delimiter);\n  }\n\n  public boolean isAuthorized(Subject subject) {\n    return isAllowedUser(subject) && !isDeniedUser(subject);\n  }\n\n  private boolean isAllowedUser(Subject subject) {\n    // All users from all groups are allowed by default\n    if (allowUsers.isEmpty() && allowGroups.isEmpty()) {\n      return true;\n    }\n\n    if (allowUsers.contains(subject.getUserName())) {\n      return true;\n    }\n\n    return !Collections.disjoint(allowGroups, subject.getGroups());\n  }\n\n  private boolean isDeniedUser(Subject subject) {\n    // All users from all groups are allowed by default\n    if (denyUsers.isEmpty() && denyGroups.isEmpty()) {\n      return false;\n    }\n\n    if (denyUsers.contains(subject.getUserName())) {\n      return true;\n    }\n\n    return !Collections.disjoint(denyGroups, subject.getGroups());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/authorization/PermissionsCleaner.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.authorization;\n\nimport static org.eclipse.che.commons.lang.StringUtils.strToSet;\n\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\n\n/** This {@link PermissionsCleaner} cleans up all user's permissions. */\n@Singleton\npublic class PermissionsCleaner {\n\n  private final Set<String> userClusterRoles;\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n\n  @Inject\n  public PermissionsCleaner(\n      @Nullable @Named(\"che.infra.kubernetes.user_cluster_roles\") String userClusterRoles,\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory) {\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n    this.userClusterRoles = strToSet(userClusterRoles);\n  }\n\n  public void cleanUp(String namespaceName) throws InfrastructureException {\n    KubernetesClient client = cheServerKubernetesClientFactory.create();\n    for (String userClusterRole : userClusterRoles) {\n      client.rbac().roleBindings().inNamespace(namespaceName).withName(userClusterRole).delete();\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/cache/KubernetesMachineCache.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.cache;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.MachineStatus;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.core.model.workspace.runtime.ServerStatus;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesMachineImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesServerImpl;\n\n/**\n * Caches kubernetes machines.\n *\n * @author Sergii Leshchenko\n */\npublic interface KubernetesMachineCache {\n\n  /**\n   * Put machine state into cache.\n   *\n   * <p>Note that this method MUST NOT be used for machine state updating.\n   *\n   * @param runtimeIdentity runtime identifier\n   * @param machine machine to cache\n   * @throws InfrastructureException if machine with specified runtime id and name is already cached\n   * @throws InfrastructureException if any exception occurs during machine caching\n   */\n  void put(RuntimeIdentity runtimeIdentity, KubernetesMachineImpl machine)\n      throws InfrastructureException;\n\n  /**\n   * Returns cached machine which belong to the specified runtime id.\n   *\n   * @param runtimeIdentity runtime identifier.\n   * @throws InfrastructureException if any exception occurs during machines fetching\n   */\n  Map<String, KubernetesMachineImpl> getMachines(RuntimeIdentity runtimeIdentity)\n      throws InfrastructureException;\n\n  /**\n   * Returns cached server.\n   *\n   * @param runtimeIdentity runtime identifier\n   * @param machineName machine name to which the server belong to\n   * @param serverName server name\n   * @throws InfrastructureException if any exception occurs during server fetching\n   */\n  KubernetesServerImpl getServer(\n      RuntimeIdentity runtimeIdentity, String machineName, String serverName)\n      throws InfrastructureException;\n\n  /**\n   * Updates machine status.\n   *\n   * @param runtimeIdentity runtime identifier\n   * @param machineName machine name to which the server belong to\n   * @param newStatus status to update\n   * @throws InfrastructureException if any exception occurs during machine status updating\n   */\n  void updateMachineStatus(\n      RuntimeIdentity runtimeIdentity, String machineName, MachineStatus newStatus)\n      throws InfrastructureException;\n\n  /**\n   * Updates server status.\n   *\n   * @param runtimeIdentity runtime identifier\n   * @param machineName machine name to which the server belong to\n   * @param serverName server name\n   * @param newStatus status to update\n   * @return true if status is update, false if the server already has the same status.\n   * @throws InfrastructureException if any exception occurs during server status updating\n   */\n  boolean updateServerStatus(\n      RuntimeIdentity runtimeIdentity,\n      String machineName,\n      String serverName,\n      ServerStatus newStatus)\n      throws InfrastructureException;\n\n  /**\n   * Returns cached machine which belong to the specified runtime id.\n   *\n   * @param identity runtime identity\n   * @throws InfrastructureException if any exception occurs during machines removing\n   */\n  void remove(RuntimeIdentity identity) throws InfrastructureException;\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/cache/KubernetesRuntimeStateCache.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.cache;\n\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.function.Predicate;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesRuntimeState;\n\n/**\n * Caches runtime state.\n *\n * @author Sergii Leshchenko\n */\npublic interface KubernetesRuntimeStateCache {\n\n  /**\n   * Put runtime state into cache.\n   *\n   * @param state state to cache\n   * @return true if state is put, false if state is already cached\n   * @throws InfrastructureException if any exception occurs during entity putting\n   */\n  boolean putIfAbsent(KubernetesRuntimeState state) throws InfrastructureException;\n\n  /**\n   * Returns runtime identities of cached runtimes.\n   *\n   * @throws InfrastructureException if any exception occurs during entities fetching\n   */\n  Set<RuntimeIdentity> getIdentities() throws InfrastructureException;\n\n  /**\n   * Returns optional with status of the runtime with specified identifier or empty optional if\n   * there is not cached state.\n   *\n   * @param runtimeId runtime identifier\n   * @throws InfrastructureException if any exception occurs during status fetching\n   */\n  Optional<WorkspaceStatus> getStatus(RuntimeIdentity runtimeId) throws InfrastructureException;\n\n  /**\n   * Returns commands of the runtime with specified identifier or empty list when state is not\n   * cached.\n   *\n   * @param runtimeId runtime identifier\n   * @throws InfrastructureException if any exception occurs during commands fetching\n   */\n  List<? extends Command> getCommands(RuntimeIdentity runtimeId) throws InfrastructureException;\n\n  /**\n   * Returns optional with state of the runtime with specified identifier.\n   *\n   * @param runtimeId runtime identifier\n   * @throws InfrastructureException if any exception occurs during state fetching\n   */\n  Optional<KubernetesRuntimeState> get(RuntimeIdentity runtimeId) throws InfrastructureException;\n\n  /**\n   * Updates status of cached runtime.\n   *\n   * @param runtimeId runtime identifier\n   * @param newStatus status to update\n   * @throws InfrastructureException if any exception occurs during status updating\n   */\n  void updateStatus(RuntimeIdentity runtimeId, WorkspaceStatus newStatus)\n      throws InfrastructureException;\n\n  /**\n   * Updates status of cached runtime if previous value matches the specified predicate.\n   *\n   * @param identity runtime identifier\n   * @param predicate predicate to test the previous status\n   * @param newStatus status to update\n   * @return true if status is updated, false if status is not specified because\n   * @throws InfrastructureException if any exception occurs during status updating\n   */\n  boolean updateStatus(\n      RuntimeIdentity identity, Predicate<WorkspaceStatus> predicate, WorkspaceStatus newStatus)\n      throws InfrastructureException;\n\n  /**\n   * Updates commands of cached runtime state.\n   *\n   * @param identity runtime identifier\n   * @param commands commands to store\n   * @throws InfrastructureException if there is no cached state for specified runtime identifier\n   * @throws InfrastructureException if any exception occurs during commands updating\n   */\n  void updateCommands(RuntimeIdentity identity, List<? extends Command> commands)\n      throws InfrastructureException;\n\n  /**\n   * Removes state of the runtime with specified identifier.\n   *\n   * @param runtimeId runtime identifier\n   * @throws InfrastructureException if any exception occurs during state removing\n   */\n  void remove(RuntimeIdentity runtimeId) throws InfrastructureException;\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/cache/jpa/JpaKubernetesMachineCache.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.cache.jpa;\n\nimport static java.lang.String.format;\nimport static java.util.stream.Collectors.toMap;\n\nimport com.google.inject.persist.Transactional;\nimport java.util.Collection;\nimport java.util.Map;\nimport java.util.function.Function;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.persistence.EntityManager;\nimport org.eclipse.che.api.core.model.workspace.runtime.MachineStatus;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.core.model.workspace.runtime.ServerStatus;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.cache.KubernetesMachineCache;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesMachineImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesMachineImpl.MachineId;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesServerImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesServerImpl.ServerId;\n\n/**\n * JPA based implementation of {@link KubernetesMachineCache}.\n *\n * @author Sergii Leshchenko\n */\npublic class JpaKubernetesMachineCache implements KubernetesMachineCache {\n\n  private final Provider<EntityManager> managerProvider;\n\n  @Inject\n  public JpaKubernetesMachineCache(Provider<EntityManager> managerProvider) {\n    this.managerProvider = managerProvider;\n  }\n\n  @Override\n  public void put(RuntimeIdentity runtimeIdentity, KubernetesMachineImpl machine)\n      throws InfrastructureException {\n    try {\n      doPutMachine(machine);\n    } catch (RuntimeException e) {\n      throw new InfrastructureException(e.getMessage(), e);\n    }\n  }\n\n  @Transactional(rollbackOn = InfrastructureException.class)\n  @Override\n  public Map<String, KubernetesMachineImpl> getMachines(RuntimeIdentity runtimeIdentity)\n      throws InfrastructureException {\n    try {\n      return managerProvider\n          .get()\n          .createNamedQuery(\"KubernetesMachine.getByWorkspaceId\", KubernetesMachineImpl.class)\n          .setParameter(\"workspaceId\", runtimeIdentity.getWorkspaceId())\n          .getResultList()\n          .stream()\n          .collect(toMap(KubernetesMachineImpl::getName, Function.identity()));\n    } catch (RuntimeException e) {\n      throw new InfrastructureException(e.getMessage(), e);\n    }\n  }\n\n  @Transactional(rollbackOn = InfrastructureException.class)\n  @Override\n  public KubernetesServerImpl getServer(\n      RuntimeIdentity runtimeIdentity, String machineName, String serverName)\n      throws InfrastructureException {\n    try {\n      String workspaceId = runtimeIdentity.getWorkspaceId();\n      KubernetesServerImpl server =\n          managerProvider\n              .get()\n              .find(KubernetesServerImpl.class, new ServerId(workspaceId, machineName, serverName));\n      if (server == null) {\n        throw new InfrastructureException(\n            format(\"Server with name '%s' was not found\", serverName));\n      }\n      return server;\n    } catch (RuntimeException e) {\n      throw new InfrastructureException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public void updateMachineStatus(\n      RuntimeIdentity runtimeIdentity, String machineName, MachineStatus newStatus)\n      throws InfrastructureException {\n    try {\n      doUpdateMachineStatus(runtimeIdentity.getWorkspaceId(), machineName, newStatus);\n    } catch (RuntimeException e) {\n      throw new InfrastructureException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public boolean updateServerStatus(\n      RuntimeIdentity runtimeIdentity,\n      String machineName,\n      String serverName,\n      ServerStatus newStatus)\n      throws InfrastructureException {\n    try {\n      return doUpdateServerStatus(runtimeIdentity, machineName, serverName, newStatus);\n    } catch (RuntimeException e) {\n      throw new InfrastructureException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public void remove(RuntimeIdentity runtimeIdentity) throws InfrastructureException {\n    try {\n      doRemove(runtimeIdentity);\n    } catch (RuntimeException e) {\n      throw new InfrastructureException(e.getMessage(), e);\n    }\n  }\n\n  @Transactional(rollbackOn = {RuntimeException.class, InfrastructureException.class})\n  protected void doRemove(RuntimeIdentity runtimeIdentity) throws InfrastructureException {\n    EntityManager em = managerProvider.get();\n\n    Collection<KubernetesMachineImpl> machines = getMachines(runtimeIdentity).values();\n\n    for (KubernetesMachineImpl machine : machines) {\n      em.remove(machine);\n    }\n\n    em.flush();\n  }\n\n  @Transactional\n  protected void doPutMachine(KubernetesMachineImpl machine) {\n    EntityManager em = managerProvider.get();\n    em.persist(machine);\n    em.flush();\n  }\n\n  @Transactional\n  protected void doUpdateMachineStatus(String workspaceId, String machineName, MachineStatus status)\n      throws InfrastructureException {\n    EntityManager entityManager = managerProvider.get();\n\n    KubernetesMachineImpl machine =\n        entityManager.find(KubernetesMachineImpl.class, new MachineId(workspaceId, machineName));\n\n    if (machine == null) {\n      throw new InfrastructureException(\n          format(\"Machine '%s:%s' was not found\", workspaceId, machineName));\n    }\n\n    machine.setStatus(status);\n\n    entityManager.flush();\n  }\n\n  @Transactional(rollbackOn = {RuntimeException.class, InfrastructureException.class})\n  protected boolean doUpdateServerStatus(\n      RuntimeIdentity runtimeIdentity, String machineName, String serverName, ServerStatus status)\n      throws InfrastructureException {\n    EntityManager entityManager = managerProvider.get();\n\n    KubernetesServerImpl server = getServer(runtimeIdentity, machineName, serverName);\n\n    if (server.getStatus() != status) {\n      server.setStatus(status);\n      entityManager.flush();\n      return true;\n    }\n    return false;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/cache/jpa/JpaKubernetesRuntimeCacheModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.cache.jpa;\n\nimport com.google.inject.AbstractModule;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.cache.KubernetesMachineCache;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.cache.KubernetesRuntimeStateCache;\n\n/**\n * @author Sergii Leshchenko\n */\npublic class JpaKubernetesRuntimeCacheModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    bind(KubernetesRuntimeStateCache.class).to(JpaKubernetesRuntimeStateCache.class);\n    bind(KubernetesMachineCache.class).to(JpaKubernetesMachineCache.class);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/cache/jpa/JpaKubernetesRuntimeStateCache.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.cache.jpa;\n\nimport static java.util.Collections.emptyList;\n\nimport com.google.inject.persist.Transactional;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.function.Predicate;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.persistence.EntityManager;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.cache.KubernetesRuntimeStateCache;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesRuntimeCommandImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.model.KubernetesRuntimeState;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * JPA based implementation of {@link KubernetesRuntimeStateCache}.\n *\n * @author Sergii Leshchenko\n */\npublic class JpaKubernetesRuntimeStateCache implements KubernetesRuntimeStateCache {\n  private static final Logger LOG = LoggerFactory.getLogger(JpaKubernetesRuntimeStateCache.class);\n\n  private final Provider<EntityManager> managerProvider;\n  private final EventService eventService;\n\n  @Inject\n  public JpaKubernetesRuntimeStateCache(\n      Provider<EntityManager> managerProvider, EventService eventService) {\n    this.managerProvider = managerProvider;\n    this.eventService = eventService;\n  }\n\n  @Override\n  public boolean putIfAbsent(KubernetesRuntimeState runtimeState) throws InfrastructureException {\n    try {\n      doPutIfAbsent(runtimeState);\n      return true;\n    } catch (RuntimeException e) {\n      throw new InfrastructureException(e.getMessage(), e);\n    }\n  }\n\n  @Transactional(rollbackOn = InfrastructureException.class)\n  @Override\n  public Set<RuntimeIdentity> getIdentities() throws InfrastructureException {\n    try {\n      return managerProvider\n          .get()\n          .createNamedQuery(\"KubernetesRuntime.getAll\", KubernetesRuntimeState.class)\n          .getResultList()\n          .stream()\n          .map(KubernetesRuntimeState::getRuntimeId)\n          .collect(Collectors.toSet());\n    } catch (RuntimeException x) {\n      throw new InfrastructureException(x.getMessage(), x);\n    }\n  }\n\n  @Transactional(rollbackOn = InfrastructureException.class)\n  @Override\n  public Optional<WorkspaceStatus> getStatus(RuntimeIdentity id) throws InfrastructureException {\n    try {\n      Optional<KubernetesRuntimeState> runtimeStateOpt = get(id);\n      return runtimeStateOpt.map(KubernetesRuntimeState::getStatus);\n    } catch (RuntimeException x) {\n      throw new InfrastructureException(x.getMessage(), x);\n    }\n  }\n\n  @Override\n  public List<? extends Command> getCommands(RuntimeIdentity runtimeId)\n      throws InfrastructureException {\n    Optional<KubernetesRuntimeState> k8sRuntimeState = get(runtimeId);\n    if (k8sRuntimeState.isPresent()) {\n      return k8sRuntimeState.get().getCommands();\n    } else {\n      // runtime is not started yet\n      return emptyList();\n    }\n  }\n\n  @Transactional(rollbackOn = InfrastructureException.class)\n  @Override\n  public Optional<KubernetesRuntimeState> get(RuntimeIdentity runtimeId)\n      throws InfrastructureException {\n    try {\n      return Optional.ofNullable(\n          managerProvider.get().find(KubernetesRuntimeState.class, runtimeId.getWorkspaceId()));\n    } catch (RuntimeException x) {\n      throw new InfrastructureException(x.getMessage(), x);\n    }\n  }\n\n  @Override\n  public void updateStatus(RuntimeIdentity runtimeId, WorkspaceStatus newStatus)\n      throws InfrastructureException {\n    try {\n      doUpdateStatus(runtimeId, newStatus);\n    } catch (RuntimeException x) {\n      throw new InfrastructureException(x.getMessage(), x);\n    }\n  }\n\n  @Override\n  public boolean updateStatus(\n      RuntimeIdentity identity, Predicate<WorkspaceStatus> predicate, WorkspaceStatus newStatus)\n      throws InfrastructureException {\n    try {\n      doUpdateStatus(identity, predicate, newStatus);\n      return true;\n    } catch (IllegalStateException e) {\n      return false;\n    } catch (RuntimeException e) {\n      throw new InfrastructureException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public void updateCommands(RuntimeIdentity identity, List<? extends Command> commands)\n      throws InfrastructureException {\n    try {\n      doUpdateCommands(\n          identity,\n          commands.stream().map(KubernetesRuntimeCommandImpl::new).collect(Collectors.toList()));\n    } catch (RuntimeException e) {\n      throw new InfrastructureException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public void remove(RuntimeIdentity runtimeId) throws InfrastructureException {\n    try {\n      doRemove(runtimeId);\n    } catch (ServerException | RuntimeException x) {\n      throw new InfrastructureException(x.getMessage(), x);\n    }\n  }\n\n  @Transactional(rollbackOn = InfrastructureException.class)\n  protected Optional<KubernetesRuntimeState> find(String workspaceId)\n      throws InfrastructureException {\n    try {\n      return Optional.ofNullable(\n          managerProvider.get().find(KubernetesRuntimeState.class, workspaceId));\n    } catch (RuntimeException x) {\n      throw new InfrastructureException(x.getMessage(), x);\n    }\n  }\n\n  @Transactional(rollbackOn = {RuntimeException.class, ServerException.class})\n  protected void doRemove(RuntimeIdentity runtimeIdentity) throws ServerException {\n    EntityManager em = managerProvider.get();\n\n    KubernetesRuntimeState runtime =\n        em.find(KubernetesRuntimeState.class, runtimeIdentity.getWorkspaceId());\n\n    if (runtime != null) {\n      em.remove(runtime);\n    }\n  }\n\n  @Transactional(rollbackOn = {RuntimeException.class, InfrastructureException.class})\n  protected void doUpdateStatus(RuntimeIdentity id, WorkspaceStatus status)\n      throws InfrastructureException {\n    Optional<KubernetesRuntimeState> runtimeStateOpt = get(id);\n\n    if (!runtimeStateOpt.isPresent()) {\n      throw new InfrastructureException(\n          \"Runtime state for workspace with id '\" + id.getWorkspaceId() + \"' was not found\");\n    }\n\n    runtimeStateOpt.get().setStatus(status);\n\n    managerProvider.get().flush();\n  }\n\n  @Transactional(rollbackOn = {RuntimeException.class, InfrastructureException.class})\n  protected void doUpdateStatus(\n      RuntimeIdentity id, Predicate<WorkspaceStatus> predicate, WorkspaceStatus newStatus)\n      throws InfrastructureException {\n    EntityManager entityManager = managerProvider.get();\n\n    Optional<KubernetesRuntimeState> existingStateOpt = get(id);\n\n    if (!existingStateOpt.isPresent()) {\n      throw new InfrastructureException(\n          \"Runtime state for workspace with id '\" + id.getWorkspaceId() + \"' was not found\");\n    }\n\n    KubernetesRuntimeState existingState = existingStateOpt.get();\n    if (!predicate.test(existingState.getStatus())) {\n      throw new IllegalStateException(\"Runtime status doesn't match to the specified predicate\");\n    }\n\n    existingState.setStatus(newStatus);\n    entityManager.flush();\n  }\n\n  @Transactional(rollbackOn = {RuntimeException.class, InfrastructureException.class})\n  protected void doUpdateCommands(RuntimeIdentity id, List<KubernetesRuntimeCommandImpl> commands)\n      throws InfrastructureException {\n    Optional<KubernetesRuntimeState> runtimeStateOpt = get(id);\n\n    if (!runtimeStateOpt.isPresent()) {\n      throw new InfrastructureException(\n          \"Runtime state for workspace with id '\" + id.getWorkspaceId() + \"' was not found\");\n    }\n\n    runtimeStateOpt.get().setCommands(commands);\n\n    managerProvider.get().flush();\n  }\n\n  @Transactional\n  protected void doPutIfAbsent(KubernetesRuntimeState runtimeState) {\n    EntityManager em = managerProvider.get();\n    em.persist(runtimeState);\n    em.flush();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/ContainerSearch.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.devfile;\n\nimport static java.util.stream.Collectors.toList;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodTemplate;\nimport io.fabric8.kubernetes.api.model.ReplicationController;\nimport io.fabric8.kubernetes.api.model.apps.DaemonSet;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.apps.ReplicaSet;\nimport io.fabric8.kubernetes.api.model.apps.StatefulSet;\nimport io.fabric8.kubernetes.api.model.batch.v1.CronJob;\nimport io.fabric8.kubernetes.api.model.batch.v1.Job;\nimport io.fabric8.openshift.api.model.DeploymentConfig;\nimport io.fabric8.openshift.api.model.Template;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Stream;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Container search goes through a list of Kubernetes resources and recursively looks for containers\n * that match the provided criteria.\n *\n * <p>The {@code parentName} constraint works both on the {@code name} and, if name is not set on\n * given k8s object, on the {@code generateName}.\n */\npublic class ContainerSearch {\n\n  private final @Nullable String parentName;\n  private final @Nullable Map<String, String> parentSelector;\n  private final @Nullable String containerName;\n\n  /**\n   * Constructs a new {@code ContainerSearch} instance in somewhat unsurprising manner.\n   *\n   * @param parentName the name of the parent object that should (indirectly) contain the containers\n   * @param parentSelector the labels to match on the parent object, if any\n   * @param containerName only search for containers with given name\n   */\n  public ContainerSearch(\n      @Nullable String parentName,\n      @Nullable Map<String, String> parentSelector,\n      @Nullable String containerName) {\n    this.parentName = parentName;\n    this.parentSelector = parentSelector;\n    this.containerName = containerName;\n  }\n\n  /**\n   * Searches for containers in the provided list of Kubernetes objects. If any given item in the\n   * list can contain a container (i.e. it is a pod, deployment, etc.) the item is searched for the\n   * containers recursively.\n   *\n   * @param list the list of Kubernetes resources to sift through\n   * @return a list of containers found in the provided object list\n   */\n  public List<Container> search(Collection<? extends HasMetadata> list) {\n    return list.stream()\n        .filter(this::matchMetadata)\n        .flatMap(this::findContainers)\n        .filter(this::matchContainer)\n        .collect(toList());\n  }\n\n  private Stream<Container> findContainers(HasMetadata o) {\n    // hopefully, this covers all types of objects that can contain a container\n    if (o instanceof Pod) {\n      return ((Pod) o).getSpec().getContainers().stream();\n    } else if (o instanceof PodTemplate) {\n      return ((PodTemplate) o).getTemplate().getSpec().getContainers().stream();\n    } else if (o instanceof DaemonSet) {\n      return ((DaemonSet) o).getSpec().getTemplate().getSpec().getContainers().stream();\n    } else if (o instanceof Deployment) {\n      return ((Deployment) o).getSpec().getTemplate().getSpec().getContainers().stream();\n    } else if (o instanceof Job) {\n      return ((Job) o).getSpec().getTemplate().getSpec().getContainers().stream();\n    } else if (o instanceof ReplicaSet) {\n      return ((ReplicaSet) o).getSpec().getTemplate().getSpec().getContainers().stream();\n    } else if (o instanceof ReplicationController) {\n      return ((ReplicationController) o).getSpec().getTemplate().getSpec().getContainers().stream();\n    } else if (o instanceof StatefulSet) {\n      return ((StatefulSet) o).getSpec().getTemplate().getSpec().getContainers().stream();\n    } else if (o instanceof CronJob) {\n      return ((CronJob) o)\n          .getSpec().getJobTemplate().getSpec().getTemplate().getSpec().getContainers().stream();\n    } else if (o instanceof DeploymentConfig) {\n      return ((DeploymentConfig) o).getSpec().getTemplate().getSpec().getContainers().stream();\n    } else if (o instanceof Template) {\n      return ((Template) o).getObjects().stream().flatMap(t -> findContainers((HasMetadata) t));\n    } else {\n      return Stream.empty();\n    }\n  }\n\n  private boolean matchContainer(Container container) {\n    return this.containerName == null || this.containerName.equals(container.getName());\n  }\n\n  private boolean matchMetadata(HasMetadata object) {\n    ObjectMeta metaData = object.getMetadata();\n    return matchesByName(metaData, parentName)\n        && (parentSelector == null || SelectorFilter.test(metaData, parentSelector));\n  }\n\n  private boolean matchesByName(@Nullable ObjectMeta metaData, @Nullable String name) {\n    if (name == null) {\n      return true;\n    }\n\n    String metaName = metaData == null ? null : metaData.getName();\n    String metaGenerateName = metaData == null ? null : metaData.getGenerateName();\n\n    // do not compare by the generateName if a name exists\n    if (metaName != null) {\n      return name.equals(metaName);\n    } else {\n      return name.equals(metaGenerateName);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentToWorkspaceApplier.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.devfile;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.core.model.workspace.config.Command.MACHINE_NAME_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.DEVFILE_COMPONENT_ALIAS_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.DOCKERIMAGE_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentToWorkspaceApplier.convertEndpointsIntoServers;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.SingleHostExternalServiceExposureStrategy.SINGLE_HOST_STRATEGY;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.EnvVar;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.workspace.server.devfile.Constants;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentToWorkspaceApplier;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.VolumeImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.Containers;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.KubernetesSize;\n\n/**\n * Applies changes on workspace config according to the specified dockerimage component.\n *\n * <p>The {@code dockerimage} devfile components are handled as Kubernetes deployments internally.\n *\n * @author Sergii Leshchenko\n */\npublic class DockerimageComponentToWorkspaceApplier implements ComponentToWorkspaceApplier {\n\n  /**\n   * Label that contains component name to which object belongs to and it is provisioned for\n   * generated deployments and its pod templates.\n   */\n  static final String CHE_COMPONENT_NAME_LABEL = \"che.component.name\";\n\n  private final KubernetesEnvironmentProvisioner k8sEnvProvisioner;\n  private final String devfileEndpointsExposure;\n\n  @Inject\n  public DockerimageComponentToWorkspaceApplier(\n      @Named(\"che.infra.kubernetes.singlehost.workspace.devfile_endpoint_exposure\")\n          String devfileEndpointsExposure,\n      KubernetesEnvironmentProvisioner k8sEnvProvisioner) {\n    this.k8sEnvProvisioner = k8sEnvProvisioner;\n    this.devfileEndpointsExposure = devfileEndpointsExposure;\n  }\n\n  /**\n   * Applies changes on workspace config according to the specified dockerimage component.\n   *\n   * <p>Dockerimage component is provisioned as Deployment in Kubernetes recipe.<br>\n   * Generated deployment contains container with environment variables, memory limit, docker image,\n   * arguments and commands specified in component.<br>\n   * Also, environment is provisioned with machine config with volumes and servers specified, then\n   * Kubernetes infra will created needed PVC, Services, Ingresses, Routes according to specified\n   * configuration.\n   *\n   * @param workspaceConfig workspace config on which changes should be applied\n   * @param dockerimageComponent dockerimage component that should be applied\n   * @param contentProvider optional content provider that may be used for external component\n   *     resource fetching\n   * @throws DevfileException if specified workspace config already has default environment where\n   *     dockerimage component should be stored\n   * @throws IllegalArgumentException if specified workspace config or plugin component is null\n   * @throws IllegalArgumentException if specified component has type different from dockerimage\n   */\n  @Override\n  public void apply(\n      WorkspaceConfigImpl workspaceConfig,\n      ComponentImpl dockerimageComponent,\n      FileContentProvider contentProvider)\n      throws DevfileException {\n    checkArgument(workspaceConfig != null, \"Workspace config must not be null\");\n    checkArgument(dockerimageComponent != null, \"Component must not be null\");\n    checkArgument(\n        DOCKERIMAGE_COMPONENT_TYPE.equals(dockerimageComponent.getType()),\n        format(\"Plugin must have `%s` type\", DOCKERIMAGE_COMPONENT_TYPE));\n\n    String componentAlias = dockerimageComponent.getAlias();\n    String machineName =\n        componentAlias == null ? toMachineName(dockerimageComponent.getImage()) : componentAlias;\n\n    MachineConfigImpl machineConfig = createMachineConfig(dockerimageComponent, componentAlias);\n    List<HasMetadata> componentObjects = createComponentObjects(dockerimageComponent, machineName);\n\n    k8sEnvProvisioner.provision(\n        workspaceConfig,\n        KubernetesEnvironment.TYPE,\n        componentObjects,\n        ImmutableMap.of(machineName, machineConfig));\n\n    workspaceConfig.getCommands().stream()\n        .filter(\n            c ->\n                componentAlias != null\n                    && componentAlias.equals(\n                        c.getAttributes().get(Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE)))\n        .forEach(c -> c.getAttributes().put(MACHINE_NAME_ATTRIBUTE, machineName));\n  }\n\n  private MachineConfigImpl createMachineConfig(\n      ComponentImpl dockerimageComponent, String componentAlias) {\n    MachineConfigImpl machineConfig = new MachineConfigImpl();\n    machineConfig\n        .getServers()\n        .putAll(\n            convertEndpointsIntoServers(\n                dockerimageComponent.getEndpoints(),\n                !SINGLE_HOST_STRATEGY.equals(devfileEndpointsExposure)));\n\n    dockerimageComponent\n        .getVolumes()\n        .forEach(\n            v ->\n                machineConfig\n                    .getVolumes()\n                    .put(v.getName(), new VolumeImpl().withPath(v.getContainerPath())));\n\n    if (!isNullOrEmpty(componentAlias)) {\n      machineConfig.getAttributes().put(DEVFILE_COMPONENT_ALIAS_ATTRIBUTE, componentAlias);\n    }\n\n    return machineConfig;\n  }\n\n  private List<HasMetadata> createComponentObjects(\n      ComponentImpl dockerimageComponent, String machineName) {\n    List<HasMetadata> componentObjects = new ArrayList<>();\n    Deployment deployment =\n        buildDeployment(\n            machineName,\n            dockerimageComponent.getImage(),\n            dockerimageComponent.getMemoryRequest(),\n            dockerimageComponent.getMemoryLimit(),\n            dockerimageComponent.getCpuRequest(),\n            dockerimageComponent.getCpuLimit(),\n            dockerimageComponent.getEnv().stream()\n                .map(e -> new EnvVar(e.getName(), e.getValue(), null))\n                .collect(Collectors.toCollection(ArrayList::new)),\n            dockerimageComponent.getCommand(),\n            dockerimageComponent.getArgs());\n    componentObjects.add(deployment);\n\n    return componentObjects;\n  }\n\n  private Deployment buildDeployment(\n      String name,\n      String image,\n      String memoryRequest,\n      String memoryLimit,\n      String cpuRequest,\n      String cpuLimit,\n      List<EnvVar> env,\n      List<String> command,\n      List<String> args) {\n    Container container =\n        new ContainerBuilder()\n            .withImage(image)\n            .withName(name)\n            .withEnv(env)\n            .withCommand(command)\n            .withArgs(args)\n            .build();\n\n    Containers.addRamLimit(container, memoryLimit);\n    if (!isNullOrEmpty(memoryRequest)) {\n      Containers.addRamRequest(container, memoryRequest);\n    }\n    if (!isNullOrEmpty(cpuRequest)) {\n      Containers.addCpuRequest(container, KubernetesSize.toCores(cpuRequest));\n    }\n    if (!isNullOrEmpty(cpuLimit)) {\n      Containers.addCpuLimit(container, KubernetesSize.toCores(cpuLimit));\n    }\n    return new DeploymentBuilder()\n        .withNewMetadata()\n        .addToLabels(CHE_COMPONENT_NAME_LABEL, name)\n        .withName(name)\n        .endMetadata()\n        .withNewSpec()\n        .withNewSelector()\n        .addToMatchLabels(CHE_COMPONENT_NAME_LABEL, name)\n        .endSelector()\n        .withNewTemplate()\n        .withNewMetadata()\n        .withName(name)\n        .addToLabels(CHE_COMPONENT_NAME_LABEL, name)\n        .addToAnnotations(Names.createMachineNameAnnotations(name, name))\n        .endMetadata()\n        .withNewSpec()\n        .withContainers(container)\n        .endSpec()\n        .endTemplate()\n        .endSpec()\n        .build();\n  }\n\n  @VisibleForTesting\n  static String toMachineName(String imageName) throws DevfileException {\n    if (imageName.isEmpty()) {\n      return imageName;\n    }\n\n    if (imageName.length() > Names.MAX_CONTAINER_NAME_LENGTH) {\n      throw new DevfileException(\n          format(\n              \"The image name '%s' is longer than 63 characters and as such cannot be used as a container\"\n                  + \" name. Please provide an alias for the component with that image.\",\n              imageName));\n    }\n\n    // the name needs to be both a valid k8s label and a valid machine name.\n    String clean = imageName.replaceAll(\"[^-a-zA-Z0-9_]\", \"-\");\n\n    if (isInvalidStartEndChar(clean.charAt(0))\n        || isInvalidStartEndChar(clean.charAt(clean.length() - 1))) {\n      throw new DevfileException(\n          format(\n              \"Cannot convert image %s to a valid component name.\"\n                  + \" Please provide an alias that conforms to the Kubernetes label value format.\",\n              imageName));\n    }\n\n    return clean;\n  }\n\n  /**\n   * @return true if the character isn't an ASCII letter (of either case) or a number.\n   */\n  private static boolean isInvalidStartEndChar(char ch) {\n    return ch < '0' || ch > 'z';\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentToWorkspaceApplier.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.devfile;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.stream.Collectors.toList;\nimport static org.eclipse.che.api.core.model.workspace.config.Command.MACHINE_NAME_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.DEVFILE_COMPONENT_ALIAS_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Components.getIdentifiableComponentName;\nimport static org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentToWorkspaceApplier.convertEndpointsIntoServers;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Names.machineName;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesDevfileBindings.KUBERNETES_BASED_COMPONENTS_KEY_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.SingleHostExternalServiceExposureStrategy.SINGLE_HOST_STRATEGY;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceConfig;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.api.core.model.workspace.devfile.Entrypoint;\nimport org.eclipse.che.api.workspace.server.devfile.Constants;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileRecipeFormatException;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentToWorkspaceApplier;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.VolumeImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.EnvVars;\n\n/**\n * Applies changes on workspace config according to the specified kubernetes/openshift component.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesComponentToWorkspaceApplier implements ComponentToWorkspaceApplier {\n\n  private final KubernetesRecipeParser objectsParser;\n  private final KubernetesEnvironmentProvisioner k8sEnvProvisioner;\n  private final String environmentType;\n  private final Set<String> kubernetesBasedComponentTypes;\n  private final EnvVars envVars;\n  private final String devfileEndpointsExposure;\n\n  @Inject\n  public KubernetesComponentToWorkspaceApplier(\n      KubernetesRecipeParser objectsParser,\n      KubernetesEnvironmentProvisioner k8sEnvProvisioner,\n      EnvVars envVars,\n      @Named(\"che.infra.kubernetes.singlehost.workspace.devfile_endpoint_exposure\")\n          String devfileEndpointsExposure,\n      @Named(KUBERNETES_BASED_COMPONENTS_KEY_NAME) Set<String> kubernetesBasedComponentTypes) {\n    this(\n        objectsParser,\n        k8sEnvProvisioner,\n        envVars,\n        KubernetesEnvironment.TYPE,\n        devfileEndpointsExposure,\n        kubernetesBasedComponentTypes);\n  }\n\n  protected KubernetesComponentToWorkspaceApplier(\n      KubernetesRecipeParser objectsParser,\n      KubernetesEnvironmentProvisioner k8sEnvProvisioner,\n      EnvVars envVars,\n      String environmentType,\n      String devfileEndpointsExposure,\n      Set<String> kubernetesBasedComponentTypes) {\n    this.objectsParser = objectsParser;\n    this.k8sEnvProvisioner = k8sEnvProvisioner;\n    this.environmentType = environmentType;\n    this.kubernetesBasedComponentTypes = kubernetesBasedComponentTypes;\n    this.envVars = envVars;\n    this.devfileEndpointsExposure = devfileEndpointsExposure;\n  }\n\n  /**\n   * Applies changes on workspace config according to the specified kubernetes/openshift component.\n   *\n   * @param workspaceConfig workspace config on which changes should be applied\n   * @param k8sComponent kubernetes/openshift component that should be applied\n   * @param contentProvider content provider that may be used for external component resource\n   *     fetching\n   * @throws IllegalArgumentException if specified workspace config or plugin component is null\n   * @throws IllegalArgumentException if specified component has type different from chePlugin\n   * @throws DevfileException if specified content provider is null while kubernetes/openshift\n   *     component required external file content\n   * @throws DevfileException if external file content is empty or any error occurred during content\n   *     retrieving\n   */\n  @Override\n  public void apply(\n      WorkspaceConfigImpl workspaceConfig,\n      ComponentImpl k8sComponent,\n      FileContentProvider contentProvider)\n      throws DevfileException {\n    checkArgument(workspaceConfig != null, \"Workspace config must not be null\");\n    checkArgument(k8sComponent != null, \"Component must not be null\");\n    checkArgument(\n        kubernetesBasedComponentTypes.contains(k8sComponent.getType()),\n        format(\"Plugin must have %s type\", String.join(\" or \", kubernetesBasedComponentTypes)));\n\n    String componentContent = retrieveContent(k8sComponent, contentProvider);\n\n    final List<HasMetadata> componentObjects =\n        prepareComponentObjects(k8sComponent, componentContent);\n\n    List<PodData> podsData = getPodDatas(componentObjects);\n\n    if (!k8sComponent.getEnv().isEmpty()) {\n      podsData.forEach(p -> envVars.apply(p, k8sComponent.getEnv()));\n    }\n\n    Map<String, MachineConfigImpl> machineConfigs = prepareMachineConfigs(podsData, k8sComponent);\n    linkCommandsToMachineName(workspaceConfig, k8sComponent, machineConfigs.keySet());\n\n    k8sEnvProvisioner.provision(workspaceConfig, environmentType, componentObjects, machineConfigs);\n  }\n\n  private List<HasMetadata> prepareComponentObjects(Component k8sComponent, String componentContent)\n      throws DevfileRecipeFormatException {\n    final List<HasMetadata> componentObjects;\n\n    if (!k8sComponent.getSelector().isEmpty()) {\n      componentObjects =\n          SelectorFilter.filter(\n              new ArrayList<>(unmarshalComponentObjects(k8sComponent, componentContent)),\n              k8sComponent.getSelector());\n    } else {\n      componentObjects = new ArrayList<>(unmarshalComponentObjects(k8sComponent, componentContent));\n    }\n\n    applyEntrypoints(k8sComponent.getEntrypoints(), componentObjects);\n    return componentObjects;\n  }\n\n  /**\n   * Creates map of machine names and corresponding {@link MachineConfigImpl} with component alias\n   * attribute set.\n   */\n  private Map<String, MachineConfigImpl> prepareMachineConfigs(\n      List<PodData> podsData, ComponentImpl component) throws DevfileException {\n    Map<String, MachineConfigImpl> machineConfigs = new HashMap<>();\n    for (PodData podData : podsData) {\n      List<Container> containers = new ArrayList<>();\n      containers.addAll(podData.getSpec().getContainers());\n      containers.addAll(podData.getSpec().getInitContainers());\n      for (Container container : containers) {\n        String machineName = machineName(podData, container);\n\n        MachineConfigImpl config = new MachineConfigImpl();\n        if (!isNullOrEmpty(component.getAlias())) {\n          config.getAttributes().put(DEVFILE_COMPONENT_ALIAS_ATTRIBUTE, component.getAlias());\n        }\n        provisionVolumes(component, container, config);\n        provisionEndpoints(component, config);\n\n        machineConfigs.put(machineName, config);\n      }\n    }\n    return machineConfigs;\n  }\n\n  private void provisionEndpoints(Component component, MachineConfigImpl config) {\n    config\n        .getServers()\n        .putAll(\n            convertEndpointsIntoServers(\n                component.getEndpoints(), !SINGLE_HOST_STRATEGY.equals(devfileEndpointsExposure)));\n  }\n\n  private void provisionVolumes(\n      ComponentImpl component, Container container, MachineConfigImpl config)\n      throws DevfileException {\n    for (org.eclipse.che.api.workspace.server.model.impl.devfile.VolumeImpl componentVolume :\n        component.getVolumes()) {\n      Optional<VolumeMount> sameNameMount =\n          container.getVolumeMounts().stream()\n              .filter(vm -> vm.getName().equals(componentVolume.getName()))\n              .findFirst();\n      if (sameNameMount.isPresent()\n          && sameNameMount.get().getMountPath().equals(componentVolume.getContainerPath())) {\n        continue;\n      } else if (sameNameMount.isPresent()) {\n        throw new DevfileException(\n            format(\n                \"Conflicting volume with same name ('%s') but different path ('%s') found for component '%s' and its container '%s'.\",\n                componentVolume.getName(),\n                componentVolume.getContainerPath(),\n                getIdentifiableComponentName(component),\n                container.getName()));\n      }\n      if (container.getVolumeMounts().stream()\n          .anyMatch(vm -> vm.getMountPath().equals(componentVolume.getContainerPath()))) {\n        throw new DevfileException(\n            format(\n                \"Conflicting volume with same path ('%s') but different name ('%s') found for component '%s' and its container '%s'.\",\n                componentVolume.getContainerPath(),\n                componentVolume.getName(),\n                getIdentifiableComponentName(component),\n                container.getName()));\n      }\n      config\n          .getVolumes()\n          .put(\n              componentVolume.getName(),\n              new VolumeImpl().withPath(componentVolume.getContainerPath()));\n    }\n  }\n\n  private String retrieveContent(Component recipeComponent, FileContentProvider fileContentProvider)\n      throws DevfileException {\n    checkArgument(fileContentProvider != null, \"Content provider must not be null\");\n    if (!isNullOrEmpty(recipeComponent.getReferenceContent())) {\n      return recipeComponent.getReferenceContent();\n    }\n\n    String recipeFileContent;\n    try {\n      recipeFileContent = fileContentProvider.fetchContent(recipeComponent.getReference());\n    } catch (DevfileException e) {\n      throw new DevfileException(\n          format(\n              \"Fetching content of file `%s` specified in `reference` field of component `%s` is not supported. \"\n                  + \"Please provide its content in `referenceContent` field. Cause: %s\",\n              recipeComponent.getReference(),\n              getIdentifiableComponentName(recipeComponent),\n              e.getMessage()),\n          e);\n    } catch (IOException e) {\n      throw new DevfileException(\n          format(\n              \"Error during recipe content retrieval for component '%s' with type '%s': %s\",\n              getIdentifiableComponentName(recipeComponent),\n              recipeComponent.getType(),\n              e.getMessage()),\n          e);\n    }\n    if (isNullOrEmpty(recipeFileContent)) {\n      throw new DevfileException(\n          format(\n              \"The reference file '%s' defined in component '%s' is empty.\",\n              recipeComponent.getReference(), getIdentifiableComponentName(recipeComponent)));\n    }\n    return recipeFileContent;\n  }\n\n  /**\n   * Set {@link Command#MACHINE_NAME_ATTRIBUTE} to commands which are configured in the specified\n   * component.\n   *\n   * <p>Machine name will be set only if the specified recipe objects has the only one container.\n   */\n  private void linkCommandsToMachineName(\n      WorkspaceConfig workspaceConfig, Component component, Set<String> machinesNames) {\n    List<? extends Command> componentCommands =\n        workspaceConfig.getCommands().stream()\n            .filter(\n                c ->\n                    component.getAlias() != null\n                        && component\n                            .getAlias()\n                            .equals(\n                                c.getAttributes().get(Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE)))\n            .collect(toList());\n    if (componentCommands.isEmpty()) {\n      return;\n    }\n\n    if (machinesNames.size() != 1) {\n      // many or no pods - can't estimate the name because of ambiguity or lack of information\n      return;\n    }\n\n    String machineName = machinesNames.iterator().next();\n    componentCommands.forEach(c -> c.getAttributes().put(MACHINE_NAME_ATTRIBUTE, machineName));\n  }\n\n  private List<PodData> getPodDatas(List<HasMetadata> componentsObjects) {\n    List<PodData> podsData = new ArrayList<>();\n\n    componentsObjects.stream()\n        .filter(hasMetadata -> hasMetadata instanceof Pod)\n        .map(hasMetadata -> (Pod) hasMetadata)\n        .forEach(p -> podsData.add(new PodData(p)));\n\n    componentsObjects.stream()\n        .filter(hasMetadata -> hasMetadata instanceof Deployment)\n        .map(hasMetadata -> (Deployment) hasMetadata)\n        .forEach(d -> podsData.add(new PodData(d)));\n    return podsData;\n  }\n\n  private List<HasMetadata> unmarshalComponentObjects(\n      Component k8sComponent, String componentreferenceContent)\n      throws DevfileRecipeFormatException {\n    try {\n      return unmarshal(componentreferenceContent);\n    } catch (DevfileRecipeFormatException e) {\n      throw new DevfileRecipeFormatException(\n          format(\n              \"Error occurred during parsing list from file %s for component '%s': %s\",\n              k8sComponent.getReference(),\n              getIdentifiableComponentName(k8sComponent),\n              e.getMessage()),\n          e);\n    }\n  }\n\n  private List<HasMetadata> unmarshal(String recipeContent) throws DevfileRecipeFormatException {\n    try {\n      return objectsParser.parse(recipeContent);\n    } catch (Exception e) {\n      throw new DevfileRecipeFormatException(e.getMessage(), e);\n    }\n  }\n\n  private void applyEntrypoints(List<? extends Entrypoint> entrypoints, List<HasMetadata> list) {\n    entrypoints.forEach(ep -> applyEntrypoint(ep, list));\n  }\n\n  private void applyEntrypoint(Entrypoint entrypoint, List<HasMetadata> list) {\n    ContainerSearch search =\n        new ContainerSearch(\n            entrypoint.getParentName(),\n            entrypoint.getParentSelector(),\n            entrypoint.getContainerName());\n\n    List<Container> cs = search.search(list);\n\n    List<String> command = entrypoint.getCommand();\n    List<String> args = entrypoint.getArgs();\n\n    for (Container c : cs) {\n      c.setCommand(command);\n      c.setArgs(args);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.devfile;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.workspace.server.devfile.Components.getIdentifiableComponentName;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport java.io.IOException;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.api.core.model.workspace.devfile.Entrypoint;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.api.workspace.server.devfile.validator.ComponentIntegrityValidator;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;\n\npublic class KubernetesComponentValidator implements ComponentIntegrityValidator {\n  private final KubernetesRecipeParser kubernetesRecipeParser;\n  private final Set<String> k8sBasedComponentTypes;\n\n  @Inject\n  public KubernetesComponentValidator(\n      KubernetesRecipeParser kubernetesRecipeParser,\n      @Named(KubernetesDevfileBindings.KUBERNETES_BASED_COMPONENTS_KEY_NAME)\n          Set<String> k8sBasedComponentTypes) {\n    this.kubernetesRecipeParser = kubernetesRecipeParser;\n    this.k8sBasedComponentTypes = k8sBasedComponentTypes;\n  }\n\n  @Override\n  public void validateComponent(Component component, FileContentProvider contentProvider)\n      throws DevfileFormatException {\n    try {\n      List<HasMetadata> selectedObjects = validateSelector(component, contentProvider);\n      validateEntrypointSelector(component, selectedObjects);\n    } catch (Exception e) {\n      throw new DevfileFormatException(\n          format(\n              \"Failed to validate content reference of component '%s' of type '%s': %s\",\n              getIdentifiableComponentName(component), component.getType(), e.getMessage()),\n          e);\n    }\n  }\n\n  /**\n   * Validates that the selector, if any, selects some objects from the component's referenced\n   * content. Only does anything for kubernetes and openshift components.\n   *\n   * @param component the component to check\n   * @param contentProvider the content provider to use when fetching content\n   * @return the list of referenced objects matching the selector or empty list\n   * @throws ValidationException on failure to validate the referenced content\n   * @throws InfrastructureException on failure to parse the referenced content\n   * @throws IOException on failure to retrieve the referenced content\n   * @throws DevfileException if the selector filters out all referenced objects\n   */\n  private List<HasMetadata> validateSelector(\n      Component component, FileContentProvider contentProvider)\n      throws ValidationException, InfrastructureException, IOException, DevfileException {\n\n    if (!k8sBasedComponentTypes.contains(component.getType())) {\n      return Collections.emptyList();\n    }\n\n    List<HasMetadata> content = getReferencedKubernetesList(component, contentProvider);\n\n    Map<String, String> selector = component.getSelector();\n    if (selector == null || selector.isEmpty()) {\n      return content;\n    }\n\n    content = SelectorFilter.filter(content, selector);\n\n    if (content.isEmpty()) {\n      throw new DevfileException(\n          format(\n              \"The selector of the component '%s' of type '%s' filters out all objects from\"\n                  + \" the list.\",\n              getIdentifiableComponentName(component), component.getType()));\n    }\n\n    return content;\n  }\n\n  private void validateEntrypointSelector(Component component, List<HasMetadata> filteredObjects)\n      throws DevfileException {\n\n    if (component.getEntrypoints() == null || component.getEntrypoints().isEmpty()) {\n      return;\n    }\n\n    for (Entrypoint ep : component.getEntrypoints()) {\n      ContainerSearch search =\n          new ContainerSearch(ep.getParentName(), ep.getParentSelector(), ep.getContainerName());\n\n      List<Container> cs = search.search(filteredObjects);\n\n      if (cs.isEmpty()) {\n        throw new DevfileFormatException(\n            format(\n                \"Component '%s' of type '%s' contains an entry point that doesn't match any\"\n                    + \" container.\",\n                getIdentifiableComponentName(component), component.getType()));\n      }\n    }\n  }\n\n  private List<HasMetadata> getReferencedKubernetesList(\n      Component component, FileContentProvider contentProvider)\n      throws ValidationException, InfrastructureException, IOException, DevfileException {\n    List<HasMetadata> content;\n    if (component.getReferenceContent() != null) {\n      content = kubernetesRecipeParser.parse(component.getReferenceContent());\n    } else if (component.getReference() != null) {\n      String data = contentProvider.fetchContent(component.getReference());\n      content = kubernetesRecipeParser.parse(data);\n    } else {\n      content = Collections.emptyList();\n    }\n\n    return content;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesDevfileBindings.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.devfile;\n\nimport com.google.inject.Binder;\nimport com.google.inject.multibindings.MapBinder;\nimport com.google.inject.multibindings.Multibinder;\nimport com.google.inject.name.Names;\n\n/**\n * A utility class to ease the binding of Kubernetes-related devfile bindings in a Guice module.\n *\n * <p>Consult the individual methods to see if you need to use them.\n */\npublic class KubernetesDevfileBindings {\n\n  public static final String ALLOWED_ENVIRONMENT_TYPE_UPGRADES_KEY_NAME =\n      \"allowedEnvironmentTypeUpgrades\";\n  public static final String KUBERNETES_BASED_ENVIRONMENTS_KEY_NAME = \"kubernetesBasedEnvironments\";\n  public static final String KUBERNETES_BASED_COMPONENTS_KEY_NAME = \"kubernetesBasedComponents\";\n\n  /**\n   * Any workspace environments based on Kubernetes recipes need to register the binding using this\n   * method so that the {@link KubernetesComponentProvisioner} and {@link\n   * KubernetesEnvironmentProvisioner} can work properly with these environments.\n   *\n   * @param baseBinder the binder available in the Guice module calling this method.\n   * @param environmentTypes the environment types to be registered as handled by Kubernetes recipes\n   */\n  public static void addKubernetesBasedEnvironmentTypeBindings(\n      Binder baseBinder, String... environmentTypes) {\n    Multibinder<String> binder =\n        Multibinder.newSetBinder(\n            baseBinder, String.class, Names.named(KUBERNETES_BASED_ENVIRONMENTS_KEY_NAME));\n    for (String envType : environmentTypes) {\n      binder.addBinding().toInstance(envType);\n    }\n  }\n\n  /**\n   * Any devfile components based on Kubernetes recipes need to register the binding using this\n   * method so that the {@link KubernetesComponentProvisioner} and {@link\n   * KubernetesComponentToWorkspaceApplier} can work properly with these components.\n   *\n   * @param baseBinder the binder available in the Guice module calling this method.\n   * @param componentTypes the component types to be registered as handled by Kubernetes recipes\n   */\n  public static void addKubernetesBasedComponentTypeBindings(\n      Binder baseBinder, String... componentTypes) {\n    Multibinder<String> binder =\n        Multibinder.newSetBinder(\n            baseBinder, String.class, Names.named(KUBERNETES_BASED_COMPONENTS_KEY_NAME));\n    for (String envType : componentTypes) {\n      binder.addBinding().toInstance(envType);\n    }\n  }\n\n  /**\n   * It is possible \"upgrade\" a kubernetes-based environment to a more specific type (e.g. a\n   * Kubernetes can be upgraded to Openshift environment, because Openshift is compatible with\n   * Kubernetes, but an Openshift environment cannot be \"upgraded\" Kubernetes environment, because\n   * Kubernetes is not itself compatible with Openshift).\n   *\n   * @param baseBinder the binder available in the Guice module calling this method\n   * @param targetEnvironmentType the environment type to upgrade to, if possible\n   * @param baseEnvironmentTypes the environments from which it is possible to upgrade to the target\n   *     environment type.\n   */\n  public static void addAllowedEnvironmentTypeUpgradeBindings(\n      Binder baseBinder, String targetEnvironmentType, String... baseEnvironmentTypes) {\n    MapBinder<String, String> binder =\n        MapBinder.newMapBinder(\n                baseBinder,\n                String.class,\n                String.class,\n                Names.named(ALLOWED_ENVIRONMENT_TYPE_UPGRADES_KEY_NAME))\n            .permitDuplicates();\n\n    for (String baseType : baseEnvironmentTypes) {\n      binder.addBinding(targetEnvironmentType).toInstance(baseType);\n    }\n  }\n\n  private KubernetesDevfileBindings() {}\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesEnvironmentProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.devfile;\n\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyMap;\nimport static org.eclipse.che.api.workspace.shared.Constants.PROJECTS_VOLUME_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesDevfileBindings.ALLOWED_ENVIRONMENT_TYPE_UPGRADES_KEY_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesDevfileBindings.KUBERNETES_BASED_ENVIRONMENTS_KEY_NAME;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.KubernetesListBuilder;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaim;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.kubernetes.client.utils.Serialization;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileRecipeFormatException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.api.workspace.server.model.impl.EnvironmentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.RecipeImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;\n\n/**\n * Provisions default K8s/OS environment with specified objects (K8s/OS objects, machines) into\n * {@link WorkspaceConfigImpl}.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesEnvironmentProvisioner {\n  @VisibleForTesting static final String YAML_CONTENT_TYPE = \"application/x-yaml\";\n\n  private final KubernetesRecipeParser objectsParser;\n  private final Map<String, Set<String>> allowedEnvironmentTypeUpgrades;\n  private final Set<String> k8sBasedEnvTypes;\n\n  @Inject\n  public KubernetesEnvironmentProvisioner(\n      KubernetesRecipeParser objectsParser,\n      @Named(ALLOWED_ENVIRONMENT_TYPE_UPGRADES_KEY_NAME)\n          Map<String, Set<String>> allowedEnvironmentTypeUpgrades,\n      @Named(KUBERNETES_BASED_ENVIRONMENTS_KEY_NAME) Set<String> k8sBasedEnvTypes) {\n    this.objectsParser = objectsParser;\n    this.allowedEnvironmentTypeUpgrades = allowedEnvironmentTypeUpgrades;\n    this.k8sBasedEnvTypes = k8sBasedEnvTypes;\n  }\n\n  /**\n   * Provisions default K8s/OS environment with specified objects (K8s/OS objects, machines) into\n   * {@link WorkspaceConfigImpl}.\n   *\n   * <p>If there is already a default environment with kubernetes/openshift recipe then content will\n   * be updated with result or merging existing objects and specified ones.\n   *\n   * @param workspaceConfig workspace where recipe should be provisioned\n   * @param environmentType type of environment that should be provisioned. Should be one of the\n   *     Kubernetes-based environments.\n   * @param componentObjects objects that should be provisioned into the workspace config\n   * @param machines machines that should be provisioned into the workspace config\n   * @throws DevfileRecipeFormatException if exception occurred during existing environment parsing\n   * @throws DevfileRecipeFormatException if exception occurred during kubernetes object\n   *     serialization\n   * @throws DevfileException if any other exception occurred\n   */\n  public void provision(\n      WorkspaceConfigImpl workspaceConfig,\n      String environmentType,\n      List<HasMetadata> componentObjects,\n      Map<String, MachineConfigImpl> machines)\n      throws DevfileException, DevfileRecipeFormatException {\n    String defaultEnv = workspaceConfig.getDefaultEnv();\n    EnvironmentImpl environment = workspaceConfig.getEnvironments().get(defaultEnv);\n    if (environment == null) {\n      checkItemsHasUniqueKindToName(componentObjects);\n\n      RecipeImpl recipe =\n          new RecipeImpl(environmentType, YAML_CONTENT_TYPE, asYaml(componentObjects), null);\n      String envName = \"default\";\n      EnvironmentImpl env = new EnvironmentImpl(recipe, emptyMap());\n      env.getMachines().putAll(machines);\n      workspaceConfig.getEnvironments().put(envName, env);\n      workspaceConfig.setDefaultEnv(envName);\n    } else {\n      RecipeImpl envRecipe = environment.getRecipe();\n\n      for (Entry<String, MachineConfigImpl> machineEntry : machines.entrySet()) {\n        if (environment.getMachines().put(machineEntry.getKey(), machineEntry.getValue()) != null) {\n          throw new DevfileException(\n              format(\"Environment already contains machine '%s'\", machineEntry.getKey()));\n        }\n      }\n      environment.getMachines().putAll(machines);\n\n      // check if it is needed to update recipe type since\n      // kubernetes component is compatible with openshift but not vice versa\n\n      Set<String> allowedEnvTypeBases = allowedEnvironmentTypeUpgrades.get(environmentType);\n      if (allowedEnvTypeBases != null) {\n        envRecipe.setType(environmentType);\n      }\n\n      // workspace already has k8s/OS recipe\n      // it is needed to merge existing recipe objects with component's ones\n      List<HasMetadata> envObjects = unmarshalObjects(envRecipe);\n      mergeProjectsPVC(envObjects, componentObjects);\n      envObjects.addAll(componentObjects);\n      checkItemsHasUniqueKindToName(envObjects);\n\n      envRecipe.setContent(asYaml(envObjects));\n    }\n  }\n\n  private void mergeProjectsPVC(List<HasMetadata> envObjects, List<HasMetadata> componentObjects) {\n    componentObjects.removeIf(\n        co ->\n            co instanceof PersistentVolumeClaim\n                && co.getMetadata().getName().equals(PROJECTS_VOLUME_NAME)\n                && envObjects.stream()\n                    .filter(envObject -> envObject instanceof PersistentVolumeClaim)\n                    .anyMatch(pvc -> pvc.equals(co)));\n  }\n\n  private List<HasMetadata> unmarshalObjects(RecipeImpl k8sRecipe) throws DevfileException {\n    if (!k8sBasedEnvTypes.contains(k8sRecipe.getType())) {\n      String allowedEnvTypes = String.join(\" or \", k8sBasedEnvTypes);\n      throw new DevfileException(\n          format(\n              \"Kubernetes component can only be applied to a workspace with any of %s recipe type\"\n                  + \" but workspace has a recipe of type '%s'\",\n              allowedEnvTypes, k8sRecipe.getType()));\n    }\n\n    return unmarshal(k8sRecipe.getContent());\n  }\n\n  /**\n   * Makes sure that all items of the specified list have unique names per kind.\n   *\n   * @param list the list to check\n   * @throws DevfileFormatException if objects list contains item with no unique combination of kind\n   *     and name\n   */\n  private void checkItemsHasUniqueKindToName(List<HasMetadata> list) throws DevfileFormatException {\n    Set<Pair<String, String>> uniqueKindToName = new HashSet<>();\n    for (HasMetadata hasMeta : list) {\n      if (!uniqueKindToName.add(new Pair<>(hasMeta.getKind(), hasMeta.getMetadata().getName()))) {\n        throw new DevfileFormatException(\n            format(\n                \"Components can not have objects with the same name and kind but there are multiple objects with kind '%s' and name '%s'\",\n                hasMeta.getKind(), hasMeta.getMetadata().getName()));\n      }\n    }\n  }\n\n  private String asYaml(List<HasMetadata> list) throws DevfileRecipeFormatException {\n    try {\n      return Serialization.asYaml(new KubernetesListBuilder().withItems(list).build());\n    } catch (KubernetesClientException e) {\n      throw new DevfileRecipeFormatException(\n          format(\n              \"Unable to deserialize objects to store them in workspace config. Error: %s\",\n              e.getMessage()),\n          e);\n    }\n  }\n\n  private List<HasMetadata> unmarshal(String recipeContent) throws DevfileRecipeFormatException {\n    try {\n      return objectsParser.parse(recipeContent);\n    } catch (Exception e) {\n      throw new DevfileRecipeFormatException(e.getMessage(), e);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/SelectorFilter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.devfile;\n\nimport static java.util.stream.Collectors.toCollection;\n\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/** Helper class to filter Kubernetes objects by a selector. */\npublic class SelectorFilter {\n\n  /**\n   * Uses the {@link #test(ObjectMeta, Map)} method to filter the provided list.\n   *\n   * @param list the list to filter\n   * @param selector the selector to match the metadata of the objects in the list with\n   * @return the filtered list\n   */\n  public static List<HasMetadata> filter(List<HasMetadata> list, Map<String, String> selector) {\n    return list.stream()\n        .filter(o -> test(o.getMetadata(), selector))\n        .collect(toCollection(ArrayList::new));\n  }\n\n  /**\n   * Returns true is specified object is matched by specified selector, false otherwise.\n   *\n   * <p>An empty selector is considered to match anything.\n   *\n   * @param metadata object metadata to check matching\n   * @param selector the selector to match the metadata with\n   */\n  public static boolean test(@Nullable ObjectMeta metadata, Map<String, String> selector) {\n    if (selector.isEmpty()) {\n      // anything matches if we have nothing to select with\n      return true;\n    }\n\n    if (metadata == null) {\n      return false;\n    }\n\n    Map<String, String> labels = metadata.getLabels();\n    if (labels == null) {\n      return false;\n    }\n\n    return labels.entrySet().containsAll(selector.entrySet());\n  }\n\n  private SelectorFilter() {\n    throw new AssertionError(\"Thou shall not instantiate me!\");\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/docker/auth/UserSpecificDockerRegistryCredentialsProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.docker.auth;\n\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport java.util.Base64;\nimport org.eclipse.che.api.user.server.PreferenceManager;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto.DockerAuthConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto.DockerAuthConfigs;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Class for reading credentials for docker registries from user preferences.\n *\n * @author Mykola Morhun\n */\n@Singleton\npublic class UserSpecificDockerRegistryCredentialsProvider {\n  private static final String DOCKER_REGISTRY_CREDENTIALS_KEY = \"dockerCredentials\";\n\n  private static final Logger LOG =\n      LoggerFactory.getLogger(UserSpecificDockerRegistryCredentialsProvider.class);\n\n  private PreferenceManager preferenceManager;\n\n  @Inject\n  public UserSpecificDockerRegistryCredentialsProvider(PreferenceManager preferenceManager) {\n    this.preferenceManager = preferenceManager;\n  }\n\n  /**\n   * Gets and decode credentials for docker registries from user preferences. If it hasn't saved\n   * yet, {@code AuthConfigs} with empty map will be returned.\n   *\n   * @return docker registry credentials from user preferences or null when preferences can't be\n   *     retrieved or parsed\n   */\n  @Nullable\n  public DockerAuthConfigs getCredentials() {\n    try {\n      String encodedCredentials =\n          preferenceManager\n              .find(\n                  EnvironmentContext.getCurrent().getSubject().getUserId(),\n                  DOCKER_REGISTRY_CREDENTIALS_KEY)\n              .get(DOCKER_REGISTRY_CREDENTIALS_KEY);\n      String credentials =\n          encodedCredentials != null\n              ? new String(Base64.getDecoder().decode(encodedCredentials), \"UTF-8\")\n              : \"{}\";\n\n      return DtoFactory.newDto(DockerAuthConfigs.class)\n          .withConfigs(\n              DtoFactory.getInstance().createMapDtoFromJson(credentials, DockerAuthConfig.class));\n    } catch (Exception e) {\n      LOG.warn(e.getLocalizedMessage());\n      return null;\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/CheInstallationLocation.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment;\n\nimport com.google.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\n\n/**\n * This class checks the KUBERNETES_NAMESPACE and POD_NAMESPACE environment variables to determine\n * what namespace Che is installed in. Users should use this class to retrieve the installation\n * namespace name.\n *\n * @author Tom George\n */\n@Singleton\npublic class CheInstallationLocation {\n  @Inject(optional = true)\n  @Named(\"env.KUBERNETES_NAMESPACE\")\n  String kubernetesNamespace;\n\n  @Inject(optional = true)\n  @Named(\"env.POD_NAMESPACE\")\n  String podNamespace;\n\n  /**\n   * @return The name of the namespace where Che is installed or null if both {@code\n   *     KUBERNETES_NAMESPACE} and {@code POD_NAMESPACE} environment variables are not set\n   * @throws InfrastructureException when both {@code KUBERNETES_NAMESPACE} and {@code\n   *     POD_NAMESPACE} are null\n   */\n  public String getInstallationLocationNamespace() throws InfrastructureException {\n    if (kubernetesNamespace == null && podNamespace == null) {\n      throw new InfrastructureException(\n          \"Neither KUBERNETES_NAMESPACE nor POD_NAMESPACE is defined. Unable to determine Che installation location\");\n    }\n    return kubernetesNamespace == null ? podNamespace : kubernetesNamespace;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/KubernetesEnvironment.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaim;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.PodTemplateSpec;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironment;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalRecipe;\n\n/**\n * Holds objects of Kubernetes environment.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesEnvironment extends InternalEnvironment {\n\n  public static final String TYPE = \"kubernetes\";\n\n  private final Map<String, Pod> pods;\n  private final Map<String, Deployment> deployments;\n\n  /**\n   * Stores abstracted spec and meta from either a deployment or pod.\n   *\n   * <p>{@link PodData}\n   */\n  private final Map<String, PodData> podData;\n\n  private final Map<String, Service> services;\n  private final Map<String, Ingress> ingresses;\n  private final Map<String, PersistentVolumeClaim> persistentVolumeClaims;\n  private final Map<String, Secret> secrets;\n  private final Map<String, ConfigMap> configMaps;\n  private final Map<String, Map<String, Pod>> injectablePods;\n\n  /** Returns builder for creating environment from blank {@link KubernetesEnvironment}. */\n  public static Builder builder() {\n    return new Builder();\n  }\n\n  /**\n   * Returns builder for creating environment based on specified {@link InternalEnvironment}.\n   *\n   * <p>It means that {@link InternalEnvironment} specific fields like machines, warnings will be\n   * preconfigured in Builder.\n   */\n  public static Builder builder(InternalEnvironment internalEnvironment) {\n    return new Builder(internalEnvironment);\n  }\n\n  public KubernetesEnvironment(KubernetesEnvironment k8sEnv) {\n    this(\n        k8sEnv,\n        k8sEnv.getPodsCopy(),\n        k8sEnv.getDeploymentsCopy(),\n        k8sEnv.getServices(),\n        k8sEnv.getIngresses(),\n        k8sEnv.getPersistentVolumeClaims(),\n        k8sEnv.getSecrets(),\n        k8sEnv.getConfigMaps());\n  }\n\n  protected KubernetesEnvironment(\n      InternalEnvironment internalEnvironment,\n      Map<String, Pod> pods,\n      Map<String, Deployment> deployments,\n      Map<String, Service> services,\n      Map<String, Ingress> ingresses,\n      Map<String, PersistentVolumeClaim> persistentVolumeClaims,\n      Map<String, Secret> secrets,\n      Map<String, ConfigMap> configMaps) {\n    super(internalEnvironment);\n    setType(TYPE);\n    this.pods = new HashMap<>(pods);\n    this.deployments = new HashMap<>(deployments);\n    this.services = services;\n    this.ingresses = ingresses;\n    this.persistentVolumeClaims = persistentVolumeClaims;\n    this.secrets = secrets;\n    this.configMaps = configMaps;\n    this.podData = new HashMap<>();\n    this.injectablePods = new HashMap<>();\n    pods.forEach((name, pod) -> podData.put(name, new PodData(pod)));\n    deployments.forEach((name, deployment) -> podData.put(name, new PodData(deployment)));\n  }\n\n  protected KubernetesEnvironment(\n      InternalRecipe internalRecipe,\n      Map<String, InternalMachineConfig> machines,\n      List<Warning> warnings,\n      Map<String, Pod> pods,\n      Map<String, Deployment> deployments,\n      Map<String, Service> services,\n      Map<String, Ingress> ingresses,\n      Map<String, PersistentVolumeClaim> persistentVolumeClaims,\n      Map<String, Secret> secrets,\n      Map<String, ConfigMap> configMaps) {\n    super(internalRecipe, machines, warnings);\n    setType(TYPE);\n    this.pods = pods;\n    this.deployments = deployments;\n    this.services = services;\n    this.ingresses = ingresses;\n    this.persistentVolumeClaims = persistentVolumeClaims;\n    this.secrets = secrets;\n    this.configMaps = configMaps;\n    this.podData = new HashMap<>();\n    this.injectablePods = new HashMap<>();\n    pods.forEach((name, pod) -> podData.put(name, new PodData(pod)));\n    deployments.forEach((name, deployment) -> podData.put(name, new PodData(deployment)));\n  }\n\n  @Override\n  public KubernetesEnvironment setType(String type) {\n    return (KubernetesEnvironment) super.setType(type);\n  }\n\n  /**\n   * Returns pods that should be created when environment starts.\n   *\n   * <p>Note: This map <b>should not</b> be changed, as it will only return pods and not\n   * deployments. If objects in the map need to be changed, see {@link #getPodsData()}\n   *\n   * <p>If pods need to be added to the environment, then {@link #addPod(Pod)} should be used\n   * instead.\n   */\n  public Map<String, Pod> getPodsCopy() {\n    return ImmutableMap.copyOf(pods);\n  }\n\n  /**\n   * Returns deployments that should be created when environment starts.\n   *\n   * <p>Note: This map <b>should not</b> be changed. If objects in the map need to be changed, see\n   * {@link #getPodsData()}\n   *\n   * <p>If pods need to be added to the environment, then {@link #addPod(Pod)} should be used\n   * instead.\n   */\n  public Map<String, Deployment> getDeploymentsCopy() {\n    return ImmutableMap.copyOf(deployments);\n  }\n\n  /**\n   * Returns {@link PodData} representing the metadata and pod spec of objects (pods or deployments)\n   * that should be created when environment starts. The data returned by this method represents all\n   * deployment and pod objects that form the workspace, and should be used when provisioning or\n   * performing any action that needs to see every object in the environment.\n   *\n   * <p>If pods need to be added to the environment, then {@link #addPod(Pod)} should be used\n   * instead.\n   */\n  public Map<String, PodData> getPodsData() {\n    return ImmutableMap.copyOf(podData);\n  }\n\n  /**\n   * Add a pod to the current environment. This method is necessary as the map returned by {@link\n   * #getPodsCopy()} is a copy. This method also adds the relevant data to {@link #getPodsData()}.\n   */\n  public void addPod(Pod pod) {\n    String podName = pod.getMetadata().getName();\n    pods.put(podName, pod);\n    podData.put(podName, new PodData(pod.getSpec(), pod.getMetadata()));\n  }\n\n  /**\n   * Get the pods that are meant to be injected into other deployments, like JWT proxy.\n   *\n   * <p>The keys in the returned map are machine names of machines that require the pods to be\n   * injected into their deployments. The values are maps of the injectable pods keyed by their\n   * names.\n   */\n  public Map<String, Map<String, Pod>> getInjectablePodsCopy() {\n    return ImmutableMap.copyOf(injectablePods);\n  }\n\n  /**\n   * An injectable pod is a pod that is intended to be merged into all deployments that require it.\n   * This is established by tracking the names of the machines that require this additional pod.\n   *\n   * @param requiringMachine the name of the machine that has been determined to require this\n   *     additional pod\n   * @param injectablePodMachineName the name of the injectable pod\n   * @param pod the pod to merge into the deployment containing the machine\n   */\n  public void addInjectablePod(String requiringMachine, String injectablePodMachineName, Pod pod) {\n    this.injectablePods\n        .computeIfAbsent(requiringMachine, __ -> new HashMap<>())\n        .put(injectablePodMachineName, pod);\n    this.podData.put(injectablePodMachineName, new PodData(pod, PodRole.INJECTABLE));\n  }\n\n  /** Returns services that should be created when environment starts. */\n  public Map<String, Service> getServices() {\n    return services;\n  }\n\n  /** Returns ingresses that should be created when environment starts. */\n  public Map<String, Ingress> getIngresses() {\n    return ingresses;\n  }\n\n  /** Returns PVCs that should be created when environment starts. */\n  public Map<String, PersistentVolumeClaim> getPersistentVolumeClaims() {\n    return persistentVolumeClaims;\n  }\n\n  /** Returns secrets that should be created when environment starts. */\n  public Map<String, Secret> getSecrets() {\n    return secrets;\n  }\n\n  /** Returns config maps that should be created when environment starts. */\n  public Map<String, ConfigMap> getConfigMaps() {\n    return configMaps;\n  }\n\n  public static class Builder {\n    protected final InternalEnvironment internalEnvironment;\n\n    protected final Map<String, Pod> pods = new HashMap<>();\n    protected final Map<String, Deployment> deployments = new HashMap<>();\n    protected final Map<String, PodData> podData = new HashMap<>();\n    protected final Map<String, Service> services = new HashMap<>();\n    protected final Map<String, Ingress> ingresses = new HashMap<>();\n    protected final Map<String, PersistentVolumeClaim> pvcs = new HashMap<>();\n    protected final Map<String, Secret> secrets = new HashMap<>();\n    protected final Map<String, ConfigMap> configMaps = new HashMap<>();\n    protected final Map<String, String> attributes = new HashMap<>();\n\n    protected Builder() {\n      this.internalEnvironment = new InternalEnvironment() {};\n    }\n\n    public Builder(InternalEnvironment internalEnvironment) {\n      this.internalEnvironment = internalEnvironment;\n    }\n\n    public Builder setInternalRecipe(InternalRecipe internalRecipe) {\n      internalEnvironment.setRecipe(internalRecipe);\n      return this;\n    }\n\n    public Builder setMachines(Map<String, InternalMachineConfig> machines) {\n      internalEnvironment.setMachines(new HashMap<>(machines));\n      return this;\n    }\n\n    public Builder setWarnings(List<Warning> warnings) {\n      internalEnvironment.setWarnings(new ArrayList<>(warnings));\n      return this;\n    }\n\n    public Builder setCommands(List<? extends Command> commands) {\n      internalEnvironment.setCommands(new ArrayList<>(commands));\n      return this;\n    }\n\n    public Builder setPods(Map<String, Pod> pods) {\n      this.pods.putAll(pods);\n      return this;\n    }\n\n    public Builder setDeployments(Map<String, Deployment> deployments) {\n      this.deployments.putAll(deployments);\n      return this;\n    }\n\n    public Builder setServices(Map<String, Service> services) {\n      this.services.putAll(services);\n      return this;\n    }\n\n    public Builder setIngresses(Map<String, Ingress> ingresses) {\n      this.ingresses.putAll(ingresses);\n      return this;\n    }\n\n    public Builder setPersistentVolumeClaims(Map<String, PersistentVolumeClaim> pvcs) {\n      this.pvcs.putAll(pvcs);\n      return this;\n    }\n\n    public Builder setSecrets(Map<String, Secret> secrets) {\n      this.secrets.putAll(secrets);\n      return this;\n    }\n\n    public Builder setConfigMaps(Map<String, ConfigMap> configMaps) {\n      this.configMaps.putAll(configMaps);\n      return this;\n    }\n\n    public Builder setAttributes(Map<String, String> attributes) {\n      this.attributes.putAll(attributes);\n      return this;\n    }\n\n    public KubernetesEnvironment build() {\n      return new KubernetesEnvironment(\n          internalEnvironment, pods, deployments, services, ingresses, pvcs, secrets, configMaps);\n    }\n  }\n\n  public enum PodRole {\n    DEPLOYMENT,\n    INJECTABLE\n  }\n\n  /**\n   * Abstraction of pod, since deployments store pod spec and meta within a PodSpecTemplate instead\n   * of a pod object. This class allows us to use one class to support passing of the relevant parts\n   * of a pod or deployment when it comes to provisioning.\n   *\n   * <p>The methods for accessing metadata and spec are identical to that of the Pod class (i.e.\n   * {@code getSpec()} and {@code getMetadata()}.\n   *\n   * <p>This class additionally specifies the role of the pod in the final workspace which the\n   * provisioners can use to specialize their behavior for.\n   */\n  public static class PodData {\n    private PodSpec podSpec;\n    private ObjectMeta podMeta;\n    private PodRole role;\n\n    public PodData(PodSpec podSpec, ObjectMeta podMeta, PodRole role) {\n      this.podSpec = podSpec;\n      this.podMeta = podMeta;\n      this.role = role;\n    }\n\n    public PodData(PodSpec podSpec, ObjectMeta podMeta) {\n      this(podSpec, podMeta, PodRole.DEPLOYMENT);\n    }\n\n    public PodData(Pod pod) {\n      this(pod.getSpec(), pod.getMetadata());\n    }\n\n    public PodData(Pod pod, PodRole role) {\n      this(pod.getSpec(), pod.getMetadata(), role);\n    }\n\n    public PodData(Deployment deployment) {\n      PodTemplateSpec podTemplate = deployment.getSpec().getTemplate();\n\n      // it is not required for PodTemplate to have name specified\n      // but many of Che Server components rely that PodData has name\n      // so, provision name from deployment if it is missing\n      ObjectMeta podTemplateMeta = podTemplate.getMetadata();\n      if (podTemplateMeta == null) {\n        podTemplate.setMetadata(\n            new ObjectMetaBuilder().withName(deployment.getMetadata().getName()).build());\n      } else {\n        if (podTemplateMeta.getName() == null) {\n          podTemplateMeta.setName(deployment.getMetadata().getName());\n        }\n      }\n\n      this.podSpec = podTemplate.getSpec();\n      this.podMeta = podTemplate.getMetadata();\n      this.role = PodRole.DEPLOYMENT;\n    }\n\n    public PodSpec getSpec() {\n      return podSpec;\n    }\n\n    public void setSpec(PodSpec podSpec) {\n      this.podSpec = podSpec;\n    }\n\n    public ObjectMeta getMetadata() {\n      return podMeta;\n    }\n\n    public void setMetadata(ObjectMeta podMeta) {\n      this.podMeta = podMeta;\n    }\n\n    public PodRole getRole() {\n      return role;\n    }\n\n    public void setRole(PodRole role) {\n      this.role = role;\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) {\n        return true;\n      }\n      if (!(obj instanceof PodData)) {\n        return false;\n      }\n      final PodData that = (PodData) obj;\n      return Objects.equals(podSpec, that.podSpec)\n          && Objects.equals(podMeta, that.podMeta)\n          && Objects.equals(role, that.role);\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(podSpec, podMeta, role);\n    }\n\n    @Override\n    public String toString() {\n      return \"PodData{\" + \"podSpec=\" + podSpec + \", podMeta=\" + podMeta + \", role=\" + role + '}';\n    }\n  }\n\n  @Override\n  public String toString() {\n    return \"KubernetesEnvironment{\"\n        + \"pods=\"\n        + pods\n        + \", deployments=\"\n        + deployments\n        + \", podData=\"\n        + podData\n        + \", services=\"\n        + services\n        + \", ingresses=\"\n        + ingresses\n        + \", persistentVolumeClaims=\"\n        + persistentVolumeClaims\n        + \", secrets=\"\n        + secrets\n        + \", configMaps=\"\n        + configMaps\n        + \", injectablePods=\"\n        + injectablePods\n        + \"} \"\n        + super.toString();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/KubernetesEnvironmentFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.environment.PodMerger.DEPLOYMENT_NAME_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putLabel;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.setSelector;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaim;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.api.workspace.server.model.impl.WarningImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironment;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironmentFactory;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalRecipe;\nimport org.eclipse.che.api.workspace.server.spi.environment.MachineConfigsValidator;\nimport org.eclipse.che.api.workspace.server.spi.environment.RecipeRetriever;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Warnings;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\n\n/**\n * Parses {@link InternalEnvironment} into {@link KubernetesEnvironment}.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesEnvironmentFactory\n    extends InternalEnvironmentFactory<KubernetesEnvironment> {\n\n  private final KubernetesRecipeParser recipeParser;\n  private final KubernetesEnvironmentValidator envValidator;\n  private final PodMerger podMerger;\n\n  @Inject\n  public KubernetesEnvironmentFactory(\n      RecipeRetriever recipeRetriever,\n      MachineConfigsValidator machinesValidator,\n      KubernetesRecipeParser recipeParser,\n      KubernetesEnvironmentValidator envValidator,\n      PodMerger podMerger) {\n    super(recipeRetriever, machinesValidator);\n    this.recipeParser = recipeParser;\n    this.envValidator = envValidator;\n    this.podMerger = podMerger;\n  }\n\n  @Override\n  protected KubernetesEnvironment doCreate(\n      @Nullable InternalRecipe recipe,\n      Map<String, InternalMachineConfig> machines,\n      List<Warning> sourceWarnings)\n      throws InfrastructureException, ValidationException {\n    checkNotNull(recipe, \"Null recipe is not supported by kubernetes environment factory\");\n    List<Warning> warnings = new ArrayList<>();\n    if (sourceWarnings != null) {\n      warnings.addAll(sourceWarnings);\n    }\n\n    final List<HasMetadata> recipeObjects = recipeParser.parse(recipe);\n\n    Map<String, Pod> pods = new HashMap<>();\n    Map<String, Deployment> deployments = new HashMap<>();\n    Map<String, Service> services = new HashMap<>();\n    Map<String, ConfigMap> configMaps = new HashMap<>();\n    Map<String, PersistentVolumeClaim> pvcs = new HashMap<>();\n    Map<String, Secret> secrets = new HashMap<>();\n    boolean isAnyIngressPresent = false;\n    for (HasMetadata object : recipeObjects) {\n      checkNotNull(object.getKind(), \"Environment contains object without specified kind field\");\n      checkNotNull(object.getMetadata(), \"%s metadata must not be null\", object.getKind());\n      checkNotNull(object.getMetadata().getName(), \"%s name must not be null\", object.getKind());\n\n      if (object instanceof Pod) {\n        putInto(pods, object.getMetadata().getName(), (Pod) object);\n      } else if (object instanceof Deployment) {\n        putInto(deployments, object.getMetadata().getName(), (Deployment) object);\n      } else if (object instanceof Service) {\n        putInto(services, object.getMetadata().getName(), (Service) object);\n      } else if (object instanceof Ingress) {\n        isAnyIngressPresent = true;\n      } else if (object instanceof PersistentVolumeClaim) {\n        putInto(pvcs, object.getMetadata().getName(), (PersistentVolumeClaim) object);\n      } else if (object instanceof Secret) {\n        putInto(secrets, object.getMetadata().getName(), (Secret) object);\n      } else if (object instanceof ConfigMap) {\n        putInto(configMaps, object.getMetadata().getName(), (ConfigMap) object);\n      } else {\n        throw new ValidationException(\n            format(\n                \"Found unknown object type in recipe -- name: '%s', kind: '%s'\",\n                object.getMetadata().getName(), object.getKind()));\n      }\n    }\n\n    if (deployments.size() + pods.size() > 1) {\n      mergePods(pods, deployments, services);\n    }\n\n    if (isAnyIngressPresent) {\n      warnings.add(\n          new WarningImpl(\n              Warnings.INGRESSES_IGNORED_WARNING_CODE, Warnings.INGRESSES_IGNORED_WARNING_MESSAGE));\n    }\n\n    KubernetesEnvironment k8sEnv =\n        KubernetesEnvironment.builder()\n            .setInternalRecipe(recipe)\n            .setMachines(machines)\n            .setWarnings(warnings)\n            .setPods(pods)\n            .setDeployments(deployments)\n            .setServices(services)\n            .setPersistentVolumeClaims(pvcs)\n            .setIngresses(new HashMap<>())\n            .setSecrets(secrets)\n            .setConfigMaps(configMaps)\n            .build();\n\n    envValidator.validate(k8sEnv);\n\n    return k8sEnv;\n  }\n\n  /**\n   * Merges the specified pods and deployments to a single Deployment.\n   *\n   * <p>Note that method will modify the specified collections and put work result there.\n   *\n   * @param pods pods to merge\n   * @param deployments deployments to merge\n   * @param services services to reconfigure to point new deployment\n   * @throws ValidationException if the specified lists has pods with conflicting configuration\n   */\n  private void mergePods(\n      Map<String, Pod> pods, Map<String, Deployment> deployments, Map<String, Service> services)\n      throws ValidationException {\n    List<PodData> podsData =\n        Stream.concat(\n                pods.values().stream().map(PodData::new),\n                deployments.values().stream().map(PodData::new))\n            .collect(Collectors.toList());\n\n    Deployment deployment = podMerger.merge(podsData);\n    String deploymentName = deployment.getMetadata().getName();\n\n    // provision merged deployment instead of recipe pods/deployments\n    pods.clear();\n    deployments.clear();\n    deployments.put(deploymentName, deployment);\n\n    // multiple pods/deployments are merged to one deployment\n    // to avoid issues because of overriding labels\n    // provision const label and selector to match all services to merged Deployment\n    putLabel(\n        deployment.getSpec().getTemplate().getMetadata(), DEPLOYMENT_NAME_LABEL, deploymentName);\n    services.values().forEach(s -> setSelector(s, DEPLOYMENT_NAME_LABEL, deploymentName));\n  }\n\n  /**\n   * Puts the specified key/value pair into the specified map or throw an exception if map already\n   * contains such key.\n   *\n   * @param map the map to put key/value pair\n   * @param key key that should be put\n   * @param value value that should be put\n   * @param <T> type of object to put\n   * @throws ValidationException if the specified map already contains the specified key\n   */\n  private <T extends HasMetadata> void putInto(Map<String, T> map, String key, T value)\n      throws ValidationException {\n    if (map.put(key, value) != null) {\n      String kind = value.getKind();\n      String name = value.getMetadata().getName();\n      throw new ValidationException(\n          format(\n              \"Environment can not contain two '%s' objects with the same name '%s'\", kind, name));\n    }\n  }\n\n  private void checkNotNull(Object object, String errorMessage) throws ValidationException {\n    if (object == null) {\n      throw new ValidationException(errorMessage);\n    }\n  }\n\n  private void checkNotNull(Object object, String messageFmt, Object... messageArguments)\n      throws ValidationException {\n    if (object == null) {\n      throw new ValidationException(format(messageFmt, messageArguments));\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/KubernetesEnvironmentPodsValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironmentValidator.checkArgument;\n\nimport com.google.common.base.Joiner;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaimVolumeSource;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\n\n/**\n * Validates {@link KubernetesEnvironment#getPodsData()}.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesEnvironmentPodsValidator {\n\n  public void validate(KubernetesEnvironment env) throws ValidationException {\n    checkArgument(\n        !env.getPodsData().isEmpty(), \"Environment should contain at least 1 pod or deployment\");\n\n    ensureHasMetaAndSpec(env.getPodsData());\n\n    ensureConfiguredMachinesHaveContainers(env);\n\n    validatePodVolumes(env);\n  }\n\n  private void ensureHasMetaAndSpec(Map<String, PodData> podsData) throws ValidationException {\n    for (PodData podData : podsData.values()) {\n      if (podData.getMetadata() == null) {\n        throw new ValidationException(\"Environment contains pod with missing metadata\");\n      }\n\n      if (podData.getSpec() == null) {\n        throw new ValidationException(\n            String.format(\"Pod '%s' with missing metadata\", podData.getMetadata().getName()));\n      }\n    }\n  }\n\n  private void validatePodVolumes(KubernetesEnvironment env) throws ValidationException {\n    Set<String> pvcsNames = env.getPersistentVolumeClaims().keySet();\n    for (PodData pod : env.getPodsData().values()) {\n      Set<String> volumesNames = new HashSet<>();\n      for (Volume volume : pod.getSpec().getVolumes()) {\n        volumesNames.add(volume.getName());\n\n        PersistentVolumeClaimVolumeSource pvcSource = volume.getPersistentVolumeClaim();\n        if (pvcSource != null && !pvcsNames.contains(pvcSource.getClaimName())) {\n          throw new ValidationException(\n              String.format(\n                  \"Pod '%s' contains volume '%s' with PVC sources that references missing PVC '%s'\",\n                  pod.getMetadata().getName(), volume.getName(), pvcSource.getClaimName()));\n        }\n      }\n\n      List<Container> containers = new ArrayList<>();\n      containers.addAll(pod.getSpec().getContainers());\n      containers.addAll(pod.getSpec().getInitContainers());\n      for (Container container : containers) {\n        for (VolumeMount volumeMount : container.getVolumeMounts()) {\n          if (!volumesNames.contains(volumeMount.getName())) {\n            throw new ValidationException(\n                String.format(\n                    \"Container '%s' in pod '%s' contains volume mount that references missing volume '%s'\",\n                    container.getName(), pod.getMetadata().getName(), volumeMount.getName()));\n          }\n        }\n      }\n    }\n  }\n\n  private void ensureConfiguredMachinesHaveContainers(KubernetesEnvironment env)\n      throws ValidationException {\n    Set<String> missingMachines = new HashSet<>(env.getMachines().keySet());\n    for (PodData pod : env.getPodsData().values()) {\n      if (pod.getSpec() != null && pod.getSpec().getContainers() != null) {\n        for (Container container : pod.getSpec().getContainers()) {\n          missingMachines.remove(Names.machineName(pod, container));\n        }\n        for (Container container : pod.getSpec().getInitContainers()) {\n          missingMachines.remove(Names.machineName(pod, container));\n        }\n      }\n    }\n    checkArgument(\n        missingMachines.isEmpty(),\n        \"Environment contains machines that are missing in recipe: %s\",\n        Joiner.on(\", \").join(missingMachines));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/KubernetesEnvironmentValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment;\n\nimport static java.lang.String.format;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ValidationException;\n\n/**\n * Validates {@link KubernetesEnvironment}.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesEnvironmentValidator {\n  private final KubernetesEnvironmentPodsValidator podsValidator;\n\n  @Inject\n  public KubernetesEnvironmentValidator(KubernetesEnvironmentPodsValidator podsValidator) {\n    this.podsValidator = podsValidator;\n  }\n\n  /**\n   * Validates {@link KubernetesEnvironment}.\n   *\n   * @param env environment to perform validation\n   * @throws ValidationException if the specified {@link KubernetesEnvironment} is invalid\n   */\n  public void validate(KubernetesEnvironment env) throws ValidationException {\n    podsValidator.validate(env);\n\n    // TODO Implement validation for other Kubernetes objects\n    // https://github.com/eclipse/che/issues/7381\n  }\n\n  static void checkArgument(boolean expression, String error) throws ValidationException {\n    if (!expression) {\n      throw new ValidationException(error);\n    }\n  }\n\n  static void checkArgument(\n      boolean expression, String errorMessageTemplate, Object... errorMessageParams)\n      throws ValidationException {\n    if (!expression) {\n      throw new ValidationException(format(errorMessageTemplate, errorMessageParams));\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/KubernetesRecipeParser.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment;\n\nimport static com.google.common.base.Preconditions.checkNotNull;\nimport static java.lang.String.format;\n\nimport com.google.common.collect.ImmutableSet;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport java.io.ByteArrayInputStream;\nimport java.util.List;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalRecipe;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\n\n/**\n * Parses Kubernetes objects from recipe.\n *\n * <p>Note that this class can also parse OpenShift specific objects.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesRecipeParser {\n\n  private static final Set<String> SUPPORTED_CONTENT_TYPES =\n      ImmutableSet.of(\"application/x-yaml\", \"text/yaml\", \"text/x-yaml\");\n\n  private final KubernetesClientFactory clientFactory;\n\n  @Inject\n  public KubernetesRecipeParser(KubernetesClientFactory clientFactory) {\n    this.clientFactory = clientFactory;\n  }\n\n  /**\n   * Parses Kubernetes objects from recipe.\n   *\n   * @param recipe that contains objects to parse\n   * @return parsed objects\n   * @throws IllegalArgumentException if recipe content is null\n   * @throws IllegalArgumentException if recipe content type is null\n   * @throws ValidationException if recipe content has broken format\n   * @throws ValidationException if recipe content has unrecognized objects\n   * @throws InfrastructureException when exception occurred during kubernetes client creation\n   */\n  public List<HasMetadata> parse(InternalRecipe recipe)\n      throws ValidationException, InfrastructureException {\n    String content = recipe.getContent();\n    String contentType = recipe.getContentType();\n    checkNotNull(contentType, \"Recipe content type must not be null\");\n\n    if (!SUPPORTED_CONTENT_TYPES.contains(contentType)) {\n      throw new ValidationException(\n          format(\n              \"Provided environment recipe content type '%s' is unsupported. Supported values are: %s\",\n              contentType, String.join(\", \", SUPPORTED_CONTENT_TYPES)));\n    }\n\n    return parse(content);\n  }\n\n  /**\n   * Parses Kubernetes objects from recipe content.\n   *\n   * @param recipeContent recipe content that should be parsed\n   * @return parsed objects\n   * @throws IllegalArgumentException if recipe content is null\n   * @throws ValidationException if recipe content has broken format\n   * @throws ValidationException if recipe content has unrecognized objects\n   * @throws InfrastructureException when exception occurred during kubernetes client creation\n   */\n  public List<HasMetadata> parse(String recipeContent)\n      throws ValidationException, InfrastructureException {\n    checkNotNull(recipeContent, \"Recipe content type must not be null\");\n\n    try {\n      // Behavior:\n      // - If `content` is a single object like Deployment, load().get() will get the object in that\n      // list\n      // - If `content` is a Kubernetes List, load().get() will get the objects in that list\n      // - If `content` is an OpenShift template, load().get() will get the objects in the template\n      //   with parameters substituted (e.g. with default values).\n      List<HasMetadata> parsed =\n          clientFactory.create().load(new ByteArrayInputStream(recipeContent.getBytes())).get();\n\n      // needed because Che master namespace is set by K8s API during list loading\n      parsed.stream()\n          .filter(o -> o.getMetadata() != null)\n          .forEach(o -> o.getMetadata().setNamespace(null));\n\n      return parsed;\n    } catch (KubernetesClientException e) {\n      // KubernetesClient wraps the error when a JsonMappingException occurs so we need the cause\n      String message = e.getCause() == null ? e.getMessage() : e.getCause().getMessage();\n      if (message.contains(\"\\n\")) {\n        // Clean up message if it comes from JsonMappingException. Format is e.g.\n        // `No resource type found for:v1#Route1\\n at [...]`\n        message = message.split(\"\\\\n\", 2)[0];\n      }\n      throw new ValidationException(format(\"Could not parse Kubernetes recipe: %s\", message));\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/PodMerger.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.workspace.shared.Constants.PROJECTS_VOLUME_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putAnnotations;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putLabels;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.LocalObjectReference;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.PodSecurityContext;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.PodTemplateSpec;\nimport io.fabric8.kubernetes.api.model.Toleration;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\n\n/**\n * Helps to merge multiple pods to a single deployment.\n *\n * @author Sergii Leshchenko\n */\npublic class PodMerger {\n  /** Key of pod template metadata that contains deployment name. */\n  public static final String DEPLOYMENT_NAME_LABEL = \"deployment\";\n\n  private static final String DEFAULT_DEPLOYMENT_NAME = \"workspace\";\n\n  /**\n   * Creates a new deployments that contains all pods from the specified pods data lists.\n   *\n   * <p>If multiple pods have labels, annotations, additionalProperties with the same key then\n   * override will happen and result pod template will have only the last value. You may need to\n   * reconfigure objects that rely on these value, like selector field in Service. You can use all\n   * of pod template labels for reconfiguring or single {@link #DEFAULT_DEPLOYMENT_NAME} label that\n   * contains deployment name;\n   *\n   * @param podsData the pods data to be merged\n   * @return a new Deployment that have pod template that is result of merging the specified lists\n   * @throws ValidationException if pods can not be merged because of critical names collisions like\n   *     volumes names\n   */\n  public Deployment merge(List<PodData> podsData) throws ValidationException {\n    Deployment baseDeployment = createEmptyDeployment(DEFAULT_DEPLOYMENT_NAME);\n    PodTemplateSpec basePodTemplate = baseDeployment.getSpec().getTemplate();\n    ObjectMeta basePodMeta = basePodTemplate.getMetadata();\n    PodSpec baseSpec = basePodTemplate.getSpec();\n\n    Set<String> containerNames = new HashSet<>();\n    Set<String> initContainerNames = new HashSet<>();\n    Set<String> volumes = new HashSet<>();\n    Set<String> pullSecrets = new HashSet<>();\n    for (PodData podData : podsData) {\n      // if there are entries with such keys then values will be overridden\n      ObjectMeta podMeta = podData.getMetadata();\n      putLabels(basePodMeta, podMeta.getLabels());\n      putAnnotations(basePodMeta, podMeta.getAnnotations());\n\n      basePodMeta.getAdditionalProperties().putAll(podMeta.getAdditionalProperties());\n\n      for (Container container : podData.getSpec().getContainers()) {\n        String containerName = container.getName();\n\n        // generate container name to avoid collisions\n        while (!containerNames.add(container.getName())) {\n          containerName = NameGenerator.generate(container.getName(), 4);\n          container.setName(containerName);\n        }\n\n        // store original recipe machine name\n        Names.putMachineName(basePodMeta, containerName, Names.machineName(podMeta, container));\n\n        baseSpec.getContainers().add(container);\n      }\n\n      for (Container initContainer : podData.getSpec().getInitContainers()) {\n        // generate container name to avoid collisions\n        while (!initContainerNames.add(initContainer.getName())) {\n          initContainer.setName(NameGenerator.generate(initContainer.getName(), 4));\n        }\n        // store original recipe machine name\n        Names.putMachineName(\n            basePodMeta, initContainer.getName(), Names.machineName(podMeta, initContainer));\n        baseSpec.getInitContainers().add(initContainer);\n      }\n\n      for (Volume volume : podData.getSpec().getVolumes()) {\n        if (!volumes.add(volume.getName())) {\n          if (volume.getName().equals(PROJECTS_VOLUME_NAME)) {\n            // project volume already added, can be skipped\n            continue;\n          }\n          throw new ValidationException(\n              format(\n                  \"Pods have to have volumes with unique names but there are multiple `%s` volumes\",\n                  volume.getName()));\n        }\n        baseSpec.getVolumes().add(volume);\n      }\n\n      for (LocalObjectReference pullSecret : podData.getSpec().getImagePullSecrets()) {\n        if (pullSecrets.add(pullSecret.getName())) {\n          // add pull secret only if it is not present yet\n          baseSpec.getImagePullSecrets().add(pullSecret);\n        }\n      }\n      if (podData.getSpec().getTerminationGracePeriodSeconds() != null) {\n        if (baseSpec.getTerminationGracePeriodSeconds() != null) {\n          baseSpec.setTerminationGracePeriodSeconds(\n              Long.max(\n                  baseSpec.getTerminationGracePeriodSeconds(),\n                  podData.getSpec().getTerminationGracePeriodSeconds()));\n        } else {\n          baseSpec.setTerminationGracePeriodSeconds(\n              podData.getSpec().getTerminationGracePeriodSeconds());\n        }\n      }\n\n      baseSpec.setSecurityContext(\n          mergeSecurityContexts(\n              baseSpec.getSecurityContext(), podData.getSpec().getSecurityContext()));\n\n      baseSpec.setServiceAccount(\n          mergeServiceAccount(baseSpec.getServiceAccount(), podData.getSpec().getServiceAccount()));\n\n      baseSpec.setServiceAccountName(\n          mergeServiceAccountName(\n              baseSpec.getServiceAccountName(), podData.getSpec().getServiceAccountName()));\n\n      baseSpec.setNodeSelector(\n          mergeNodeSelector(baseSpec.getNodeSelector(), podData.getSpec().getNodeSelector()));\n\n      // if there are entries with such keys then values will be overridden\n      baseSpec.getAdditionalProperties().putAll(podData.getSpec().getAdditionalProperties());\n\n      // add tolerations to baseSpec if any\n      for (Toleration toleration : podData.getSpec().getTolerations()) {\n        if (!baseSpec.getTolerations().contains(toleration)) {\n          baseSpec.getTolerations().add(toleration);\n        }\n      }\n    }\n\n    Map<String, String> matchLabels = new HashMap<>();\n    matchLabels.put(DEPLOYMENT_NAME_LABEL, baseDeployment.getMetadata().getName());\n    putLabels(basePodMeta, matchLabels);\n    baseDeployment.getSpec().getSelector().setMatchLabels(matchLabels);\n\n    return baseDeployment;\n  }\n\n  private Deployment createEmptyDeployment(String name) {\n    return new DeploymentBuilder()\n        .withMetadata(new ObjectMetaBuilder().withName(name).build())\n        .withNewSpec()\n        .withNewSelector()\n        .endSelector()\n        .withReplicas(1)\n        .withNewTemplate()\n        .withNewMetadata()\n        .endMetadata()\n        .withSpec(new PodSpec())\n        .endTemplate()\n        .endSpec()\n        .build();\n  }\n\n  private PodSecurityContext mergeSecurityContexts(\n      @Nullable PodSecurityContext a, @Nullable PodSecurityContext b) throws ValidationException {\n    return nonNullOrEqual(a, b, \"Cannot merge pods with different security contexts: %s, %s\");\n  }\n\n  private String mergeServiceAccount(@Nullable String a, @Nullable String b)\n      throws ValidationException {\n    return nonNullOrEqual(a, b, \"Cannot merge pods with different service accounts: %s, %s\");\n  }\n\n  private String mergeServiceAccountName(@Nullable String a, @Nullable String b)\n      throws ValidationException {\n    return nonNullOrEqual(a, b, \"Cannot merge pods with different service account names: %s, %s\");\n  }\n\n  @Nullable\n  private static <T> T nonNullOrEqual(@Nullable T a, @Nullable T b, String errorMessageTemplate)\n      throws ValidationException {\n    if (a == null) {\n      return b;\n    } else if (b == null || a.equals(b)) {\n      return a;\n    } else {\n      throw new ValidationException(String.format(errorMessageTemplate, a, b));\n    }\n  }\n\n  private Map<String, String> mergeNodeSelector(\n      @Nullable Map<String, String> base, @Nullable Map<String, String> nodeSelector) {\n    Map<String, String> mergedMap = base;\n    if (nodeSelector != null && !nodeSelector.isEmpty()) {\n      if (mergedMap == null) {\n        mergedMap = new HashMap<>();\n      }\n      mergedMap.putAll(nodeSelector);\n    }\n    return mergedMap;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/util/EntryPoint.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment.util;\n\nimport com.google.common.collect.ImmutableList;\nimport java.util.List;\nimport java.util.Objects;\n\n/** Represents an entry-point definition parsed from a string using the {@link EntryPointParser}. */\npublic final class EntryPoint {\n\n  private final List<String> command;\n  private final List<String> arguments;\n\n  public EntryPoint(List<String> command, List<String> arguments) {\n    this.command = ImmutableList.copyOf(command);\n    this.arguments = ImmutableList.copyOf(arguments);\n  }\n\n  /**\n   * @return unmodifiable list representing the command of the entrypoint\n   */\n  public List<String> getCommand() {\n    return command;\n  }\n\n  /**\n   * @return unmodifiable list representing the arguments of the entrypoint\n   */\n  public List<String> getArguments() {\n    return arguments;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    EntryPoint that = (EntryPoint) o;\n    return Objects.equals(command, that.command) && Objects.equals(arguments, that.arguments);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(command, arguments);\n  }\n\n  @Override\n  public String toString() {\n    return \"EntryPoint{\" + \"command=\" + command + \", arguments=\" + arguments + '}';\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/util/EntryPointParser.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment.util;\n\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyList;\n\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.core.type.TypeReference;\nimport com.fasterxml.jackson.dataformat.yaml.YAMLMapper;\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.MachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\n\n/** Can be used to parse container entry-point definition specified as a YAML list of strings. */\npublic class EntryPointParser {\n  private final YAMLMapper mapper = new YAMLMapper();\n\n  /**\n   * Parses the attributes contained in the provided machine config and produces an entry point\n   * definition.\n   *\n   * <p>This method looks for the values of the {@link MachineConfig#CONTAINER_COMMAND_ATTRIBUTE}\n   * and {@link MachineConfig#CONTAINER_ARGS_ATTRIBUTE} attributews in the provided map and\n   * constructs an Entrypoint instance parsed out of the contents of those attributes.\n   *\n   * @param machineAttributes the attributes of a machine to extract the entry point info from\n   * @return an entry point definition, never null\n   * @throws InfrastructureException on failure to parse the command or arguments\n   */\n  public EntryPoint parse(Map<String, String> machineAttributes) throws InfrastructureException {\n    String command = machineAttributes.get(MachineConfig.CONTAINER_COMMAND_ATTRIBUTE);\n    String args = machineAttributes.get(MachineConfig.CONTAINER_ARGS_ATTRIBUTE);\n\n    List<String> commandList =\n        command == null\n            ? emptyList()\n            : parseAsList(command, MachineConfig.CONTAINER_COMMAND_ATTRIBUTE);\n    List<String> argList =\n        args == null ? emptyList() : parseAsList(args, MachineConfig.CONTAINER_ARGS_ATTRIBUTE);\n\n    return new EntryPoint(commandList, argList);\n  }\n\n  /**\n   * Serializes an entry (that might have been produced from {@link #parse(Map)}) back to a string\n   * representation.\n   *\n   * @param entry the command or args entry\n   * @return a serialized representation of the entry\n   */\n  public String serializeEntry(List<String> entry) {\n    try {\n      return mapper.writer().writeValueAsString(entry);\n    } catch (JsonProcessingException e) {\n      throw new IllegalStateException(\n          format(\"Failed to serialize list of strings %s to YAML\", entry), e);\n    }\n  }\n\n  private List<String> parseAsList(String data, String attributeName)\n      throws InfrastructureException {\n    try {\n      return mapper.readValue(data, new TypeReference<List<String>>() {});\n    } catch (IOException e) {\n      throw new InfrastructureException(\n          format(\n              \"Failed to parse the attribute %s as a YAML list. The value was %s\",\n              attributeName, data),\n          e.getCause());\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/event/KubernetesRuntimeStoppedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.event;\n\nimport java.util.Objects;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.StartSynchronizer;\n\n/**\n * Should published via {@link EventService} when workspace becomes {@link WorkspaceStatus#STOPPED}.\n *\n * <p>Note that is not published by default. It is needed for {@link StartSynchronizer} to\n * synchronize state in cluster mode.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesRuntimeStoppedEvent {\n\n  private final String workspaceId;\n\n  public KubernetesRuntimeStoppedEvent(String workspaceId) {\n    this.workspaceId = workspaceId;\n  }\n\n  public String getWorkspaceId() {\n    return workspaceId;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof KubernetesRuntimeStoppedEvent)) {\n      return false;\n    }\n    final KubernetesRuntimeStoppedEvent that = (KubernetesRuntimeStoppedEvent) obj;\n    return Objects.equals(workspaceId, that.workspaceId);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hashCode(workspaceId);\n  }\n\n  @Override\n  public String toString() {\n    return \"KubernetesRuntimeStoppedEvent{\" + \"workspaceId='\" + workspaceId + '\\'' + '}';\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/event/KubernetesRuntimeStoppingEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.event;\n\nimport java.util.Objects;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.StartSynchronizer;\n\n/**\n * Should published via {@link EventService} when workspace becomes {@link\n * WorkspaceStatus#STOPPING}.\n *\n * <p>Note that is not published by default. It is needed for {@link StartSynchronizer} to\n * synchronize state in cluster mode.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesRuntimeStoppingEvent {\n\n  private final String workspaceId;\n\n  public KubernetesRuntimeStoppingEvent(String workspaceId) {\n    this.workspaceId = workspaceId;\n  }\n\n  public String getWorkspaceId() {\n    return workspaceId;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof KubernetesRuntimeStoppingEvent)) {\n      return false;\n    }\n    final KubernetesRuntimeStoppingEvent that = (KubernetesRuntimeStoppingEvent) obj;\n    return Objects.equals(workspaceId, that.workspaceId);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hashCode(workspaceId);\n  }\n\n  @Override\n  public String toString() {\n    return \"KubernetesRuntimeStoppingEvent{\" + \"workspaceId='\" + workspaceId + '\\'' + '}';\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/model/KubernetesMachineImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.model;\n\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.stream.Collectors;\nimport javax.persistence.CascadeType;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Embeddable;\nimport javax.persistence.EmbeddedId;\nimport javax.persistence.Entity;\nimport javax.persistence.EnumType;\nimport javax.persistence.Enumerated;\nimport javax.persistence.FetchType;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.JoinColumns;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.NamedQueries;\nimport javax.persistence.NamedQuery;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.runtime.Machine;\nimport org.eclipse.che.api.core.model.workspace.runtime.MachineStatus;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerImpl;\n\n/**\n * @author Sergii Leshchenko\n */\n@Entity(name = \"KubernetesMachine\")\n@Table(name = \"che_k8s_machine\")\n@NamedQueries({\n  @NamedQuery(\n      name = \"KubernetesMachine.getByWorkspaceId\",\n      query = \"SELECT m FROM KubernetesMachine m WHERE m.machineId.workspaceId = :workspaceId\")\n})\npublic class KubernetesMachineImpl implements Machine {\n\n  @EmbeddedId private MachineId machineId;\n\n  @Column(name = \"pod_name\")\n  private String podName;\n\n  @Column(name = \"container_name\")\n  private String containerName;\n\n  @Column(name = \"status\")\n  @Enumerated(EnumType.STRING)\n  private MachineStatus status;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"che_k8s_machine_attributes\",\n      joinColumns = {\n        @JoinColumn(name = \"workspace_id\", referencedColumnName = \"workspace_id\"),\n        @JoinColumn(name = \"machine_name\", referencedColumnName = \"machine_name\")\n      })\n  @MapKeyColumn(name = \"attribute_key\")\n  @Column(name = \"attribute\")\n  private Map<String, String> attributes;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumns({\n    @JoinColumn(name = \"workspace_id\", referencedColumnName = \"workspace_id\"),\n    @JoinColumn(name = \"machine_name\", referencedColumnName = \"machine_name\")\n  })\n  @MapKeyColumn(name = \"server_name\", insertable = false, updatable = false)\n  private Map<String, KubernetesServerImpl> servers;\n\n  public KubernetesMachineImpl() {}\n\n  public KubernetesMachineImpl(\n      String workspaceId,\n      String machineName,\n      String podName,\n      String containerName,\n      MachineStatus status,\n      Map<String, String> attributes,\n      Map<String, ServerImpl> servers) {\n    this.machineId = new MachineId(workspaceId, machineName);\n    this.podName = podName;\n    this.containerName = containerName;\n    this.status = status;\n    this.attributes = attributes;\n    this.servers =\n        servers.entrySet().stream()\n            .collect(\n                Collectors.toMap(\n                    Map.Entry::getKey,\n                    e ->\n                        new KubernetesServerImpl(\n                            workspaceId, machineName, e.getKey(), e.getValue())));\n  }\n\n  public MachineStatus getStatus() {\n    return status;\n  }\n\n  public void setStatus(MachineStatus status) {\n    this.status = status;\n  }\n\n  public MachineId getMachineId() {\n    return machineId;\n  }\n\n  public String getPodName() {\n    return podName;\n  }\n\n  public String getContainerName() {\n    return containerName;\n  }\n\n  public Map<String, String> getAttributes() {\n    return attributes;\n  }\n\n  public Map<String, KubernetesServerImpl> getServers() {\n    return servers;\n  }\n\n  public String getName() {\n    return machineId.machineName;\n  }\n\n  public String getWorkspaceId() {\n    return machineId.workspaceId;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof KubernetesMachineImpl)) {\n      return false;\n    }\n    final KubernetesMachineImpl that = (KubernetesMachineImpl) obj;\n    return Objects.equals(machineId, that.machineId)\n        && Objects.equals(podName, that.podName)\n        && Objects.equals(containerName, that.containerName)\n        && Objects.equals(status, that.status)\n        && getAttributes().equals(that.getAttributes())\n        && getServers().equals(that.getServers());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(machineId);\n    hash = 31 * hash + Objects.hashCode(podName);\n    hash = 31 * hash + Objects.hashCode(containerName);\n    hash = 31 * hash + Objects.hashCode(status);\n    hash = 31 * hash + getAttributes().hashCode();\n    hash = 31 * hash + getServers().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"KubernetesMachineImpl{\"\n        + \"machineId=\"\n        + machineId\n        + \", podName='\"\n        + podName\n        + '\\''\n        + \", containerName='\"\n        + containerName\n        + '\\''\n        + \", status=\"\n        + status\n        + \", attributes=\"\n        + attributes\n        + \", servers=\"\n        + servers\n        + '}';\n  }\n\n  @Embeddable\n  public static class MachineId {\n\n    @Column(name = \"workspace_id\")\n    private String workspaceId;\n\n    @Column(name = \"machine_name\")\n    private String machineName;\n\n    public MachineId() {}\n\n    public MachineId(String workspaceId, String machineName) {\n      this.workspaceId = workspaceId;\n      this.machineName = machineName;\n    }\n\n    public String getWorkspaceId() {\n      return workspaceId;\n    }\n\n    public String getMachineName() {\n      return machineName;\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) {\n        return true;\n      }\n      if (!(obj instanceof MachineId)) {\n        return false;\n      }\n      final MachineId that = (MachineId) obj;\n      return Objects.equals(workspaceId, that.workspaceId)\n          && Objects.equals(machineName, that.machineName);\n    }\n\n    @Override\n    public int hashCode() {\n      int hash = 7;\n      hash = 31 * hash + Objects.hashCode(workspaceId);\n      hash = 31 * hash + Objects.hashCode(machineName);\n      return hash;\n    }\n\n    @Override\n    public String toString() {\n      return \"MachineId{\"\n          + \"workspaceId='\"\n          + workspaceId\n          + '\\''\n          + \", machineName='\"\n          + machineName\n          + '\\''\n          + '}';\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/model/KubernetesRuntimeCommandImpl.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.model;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.StringJoiner;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Embedded;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.devfile.PreviewUrl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.PreviewUrlImpl;\n\n/**\n * Data object for {@link Command}.\n *\n * @author Serhii Leshchenko\n */\n@Entity(name = \"KubernetesRuntimeCommand\")\n@Table(name = \"k8s_runtime_command\")\npublic class KubernetesRuntimeCommandImpl implements Command {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"name\", nullable = false)\n  private String name;\n\n  @Column(name = \"commandline\", nullable = false, columnDefinition = \"TEXT\")\n  private String commandLine;\n\n  @Column(name = \"type\", nullable = false)\n  private String type;\n\n  @Embedded private PreviewUrlImpl previewUrl;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"k8s_runtime_command_attributes\",\n      joinColumns = @JoinColumn(name = \"command_id\"))\n  @MapKeyColumn(name = \"name\")\n  @Column(name = \"value_param\", columnDefinition = \"TEXT\")\n  private Map<String, String> attributes;\n\n  public KubernetesRuntimeCommandImpl() {}\n\n  public KubernetesRuntimeCommandImpl(String name, String commandLine, String type) {\n    this.name = name;\n    this.commandLine = commandLine;\n    this.type = type;\n  }\n\n  public KubernetesRuntimeCommandImpl(Command command) {\n    this.name = command.getName();\n    this.commandLine = command.getCommandLine();\n    this.type = command.getType();\n    if (command.getPreviewUrl() != null) {\n      this.previewUrl = new PreviewUrlImpl(command.getPreviewUrl());\n    }\n    this.attributes = command.getAttributes();\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public String getCommandLine() {\n    return commandLine;\n  }\n\n  public void setCommandLine(String commandLine) {\n    this.commandLine = commandLine;\n  }\n\n  @Override\n  public PreviewUrl getPreviewUrl() {\n    return previewUrl;\n  }\n\n  public void setPreviewUrl(PreviewUrlImpl previewUrl) {\n    this.previewUrl = previewUrl;\n  }\n\n  @Override\n  public String getType() {\n    return type;\n  }\n\n  public void setType(String type) {\n    this.type = type;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    KubernetesRuntimeCommandImpl that = (KubernetesRuntimeCommandImpl) o;\n    return Objects.equals(id, that.id)\n        && Objects.equals(name, that.name)\n        && Objects.equals(commandLine, that.commandLine)\n        && Objects.equals(type, that.type)\n        && Objects.equals(previewUrl, that.previewUrl)\n        && Objects.equals(attributes, that.attributes);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, name, commandLine, type, previewUrl, attributes);\n  }\n\n  @Override\n  public String toString() {\n    return new StringJoiner(\", \", KubernetesRuntimeCommandImpl.class.getSimpleName() + \"[\", \"]\")\n        .add(\"id=\" + id)\n        .add(\"name='\" + name + \"'\")\n        .add(\"commandLine='\" + commandLine + \"'\")\n        .add(\"type='\" + type + \"'\")\n        .add(\"previewUrl=\" + previewUrl)\n        .add(\"attributes=\" + attributes)\n        .toString();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/model/KubernetesRuntimeState.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.model;\n\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.stream.Collectors;\nimport javax.persistence.CascadeType;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.EnumType;\nimport javax.persistence.Enumerated;\nimport javax.persistence.FetchType;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.NamedQueries;\nimport javax.persistence.NamedQuery;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.RuntimeIdentityImpl;\n\n/**\n * @author Sergii Leshchenko\n */\n@Entity(name = \"KubernetesRuntime\")\n@Table(name = \"che_k8s_runtime\")\n@NamedQueries({\n  @NamedQuery(name = \"KubernetesRuntime.getAll\", query = \"SELECT r FROM KubernetesRuntime r\")\n})\npublic class KubernetesRuntimeState {\n  @Id\n  @Column(name = \"workspace_id\")\n  private String workspaceId;\n\n  @Column(name = \"env_name\")\n  private String envName;\n\n  @Column(name = \"owner_id\")\n  private String ownerId;\n\n  @Column(name = \"namespace\")\n  private String namespace;\n\n  @Column(name = \"status\")\n  @Enumerated(EnumType.STRING)\n  private WorkspaceStatus status;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"workspace_id\", referencedColumnName = \"workspace_id\")\n  private List<KubernetesRuntimeCommandImpl> commands;\n\n  public KubernetesRuntimeState() {}\n\n  public KubernetesRuntimeState(\n      RuntimeIdentity runtimeIdentity, WorkspaceStatus status, List<? extends Command> commands) {\n    this.envName = runtimeIdentity.getEnvName();\n    this.workspaceId = runtimeIdentity.getWorkspaceId();\n    this.ownerId = runtimeIdentity.getOwnerId();\n    this.namespace = runtimeIdentity.getInfrastructureNamespace();\n    this.status = status;\n    if (commands != null) {\n      this.commands =\n          commands.stream().map(KubernetesRuntimeCommandImpl::new).collect(Collectors.toList());\n    }\n  }\n\n  public KubernetesRuntimeState(KubernetesRuntimeState entity) {\n    this(entity.getRuntimeId(), entity.getStatus(), entity.getCommands());\n  }\n\n  public String getNamespace() {\n    return namespace;\n  }\n\n  public RuntimeIdentity getRuntimeId() {\n    return new RuntimeIdentityImpl(workspaceId, envName, ownerId, namespace);\n  }\n\n  public WorkspaceStatus getStatus() {\n    return status;\n  }\n\n  public void setStatus(WorkspaceStatus status) {\n    this.status = status;\n  }\n\n  public KubernetesRuntimeState withStatus(WorkspaceStatus status) {\n    this.status = status;\n    return this;\n  }\n\n  public List<KubernetesRuntimeCommandImpl> getCommands() {\n    return commands;\n  }\n\n  public void setCommands(List<KubernetesRuntimeCommandImpl> commands) {\n    this.commands = commands;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof KubernetesRuntimeState)) {\n      return false;\n    }\n    KubernetesRuntimeState that = (KubernetesRuntimeState) o;\n    return Objects.equals(workspaceId, that.workspaceId)\n        && Objects.equals(envName, that.envName)\n        && Objects.equals(ownerId, that.ownerId)\n        && Objects.equals(namespace, that.namespace)\n        && getStatus() == that.getStatus();\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(workspaceId, envName, ownerId, namespace, getStatus());\n  }\n\n  @Override\n  public String toString() {\n    return \"KubernetesRuntimeState{\"\n        + \"workspaceId='\"\n        + workspaceId\n        + '\\''\n        + \", envName='\"\n        + envName\n        + '\\''\n        + \", ownerId='\"\n        + ownerId\n        + '\\''\n        + \", namespace='\"\n        + namespace\n        + '\\''\n        + \", status=\"\n        + status\n        + '}';\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/model/KubernetesServerImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.model;\n\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Embeddable;\nimport javax.persistence.EmbeddedId;\nimport javax.persistence.Entity;\nimport javax.persistence.EnumType;\nimport javax.persistence.Enumerated;\nimport javax.persistence.FetchType;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\nimport org.eclipse.che.api.core.model.workspace.runtime.ServerStatus;\n\n/**\n * @author Sergii Leshchenko\n */\n@Entity(name = \"KubernetesServer\")\n@Table(name = \"che_k8s_server\")\npublic class KubernetesServerImpl implements Server {\n\n  @EmbeddedId private ServerId serverId;\n\n  @Column(name = \"url\")\n  private String url;\n\n  @Column(name = \"status\")\n  @Enumerated(EnumType.STRING)\n  private ServerStatus status;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"che_k8s_server_attributes\",\n      joinColumns = {\n        @JoinColumn(name = \"workspace_id\", referencedColumnName = \"workspace_id\"),\n        @JoinColumn(name = \"machine_name\", referencedColumnName = \"machine_name\"),\n        @JoinColumn(name = \"server_name\", referencedColumnName = \"server_name\")\n      })\n  @MapKeyColumn(name = \"attribute_key\")\n  @Column(name = \"attribute\")\n  private Map<String, String> attributes;\n\n  public KubernetesServerImpl() {}\n\n  public KubernetesServerImpl(\n      String workspaceId, String machineName, String serverName, Server server) {\n    this.serverId = new ServerId(workspaceId, machineName, serverName);\n    this.url = server.getUrl();\n    this.status = server.getStatus();\n    this.attributes = server.getAttributes();\n  }\n\n  @Override\n  public String getUrl() {\n    return url;\n  }\n\n  @Override\n  public ServerStatus getStatus() {\n    return status;\n  }\n\n  public void setStatus(ServerStatus status) {\n    this.status = status;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    return attributes;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof KubernetesServerImpl)) {\n      return false;\n    }\n    final KubernetesServerImpl that = (KubernetesServerImpl) obj;\n    return Objects.equals(serverId, that.serverId)\n        && Objects.equals(url, that.url)\n        && Objects.equals(status, that.status)\n        && getAttributes().equals(that.getAttributes());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(serverId);\n    hash = 31 * hash + Objects.hashCode(url);\n    hash = 31 * hash + Objects.hashCode(status);\n    hash = 31 * hash + getAttributes().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"KubernetesServerImpl{\"\n        + \"serverId=\"\n        + serverId\n        + \", url='\"\n        + url\n        + '\\''\n        + \", status=\"\n        + status\n        + \", attributes=\"\n        + attributes\n        + '}';\n  }\n\n  @Embeddable\n  public static class ServerId {\n    @Column(name = \"workspace_id\")\n    private String workspaceId;\n\n    @Column(name = \"machine_name\")\n    private String machineName;\n\n    @Column(name = \"server_name\")\n    private String serverName;\n\n    public ServerId() {}\n\n    public ServerId(String workspaceId, String machineName, String serverName) {\n      this.workspaceId = workspaceId;\n      this.machineName = machineName;\n      this.serverName = serverName;\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) {\n        return true;\n      }\n      if (!(obj instanceof ServerId)) {\n        return false;\n      }\n      final ServerId that = (ServerId) obj;\n      return Objects.equals(workspaceId, that.workspaceId)\n          && Objects.equals(machineName, that.machineName)\n          && Objects.equals(serverName, that.serverName);\n    }\n\n    @Override\n    public int hashCode() {\n      int hash = 7;\n      hash = 31 * hash + Objects.hashCode(workspaceId);\n      hash = 31 * hash + Objects.hashCode(machineName);\n      hash = 31 * hash + Objects.hashCode(serverName);\n      return hash;\n    }\n\n    @Override\n    public String toString() {\n      return \"ServerId{\"\n          + \"workspaceId='\"\n          + workspaceId\n          + '\\''\n          + \", machineName='\"\n          + machineName\n          + '\\''\n          + \", serverName='\"\n          + serverName\n          + '\\''\n          + '}';\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/multiuser/oauth/KubernetesOidcProviderConfigFactory.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.multiuser.oauth;\n\nimport io.fabric8.kubernetes.client.Config;\nimport io.fabric8.kubernetes.client.ConfigBuilder;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientConfigFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * This class creates {@link Config} from Kubernetes OIDC token. It does not guarantee that token is\n * valid.\n */\n@Singleton\npublic class KubernetesOidcProviderConfigFactory extends KubernetesClientConfigFactory {\n  private static final Logger LOG =\n      LoggerFactory.getLogger(KubernetesOidcProviderConfigFactory.class);\n\n  @Inject\n  public KubernetesOidcProviderConfigFactory(\n      @Nullable @Named(\"che.infra.kubernetes.master_url\") String masterUrl,\n      @Nullable @Named(\"che.infra.kubernetes.trust_certs\") Boolean doTrustCerts) {\n    super(masterUrl, doTrustCerts);\n  }\n\n  @Override\n  public boolean isPersonalized() {\n    return getToken().isPresent();\n  }\n\n  /**\n   * Builds the OpenShift {@link Config} object based on a default {@link Config} object and token\n   * stored in {@link EnvironmentContext}. It ignores 'workspaceId'.\n   */\n  public Config buildConfig(Config defaultConfig, @Nullable String workspaceId) {\n    return getToken()\n        .map((token) -> new ConfigBuilder(defaultConfig).withOauthToken(token).build())\n        .orElseGet(\n            () -> {\n              LOG.debug(\"NO TOKEN FOUND. Getting default client config.\");\n              return defaultConfig;\n            });\n  }\n\n  private Optional<String> getToken() {\n    return Optional.ofNullable(EnvironmentContext.getCurrent().getSubject().getToken());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/AbstractWorkspaceServiceAccount.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.singletonList;\n\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.KubernetesResourceList;\nimport io.fabric8.kubernetes.api.model.ServiceAccountBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.kubernetes.client.dsl.MixedOperation;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.function.Function;\nimport org.eclipse.che.api.user.server.PreferenceManager;\nimport org.eclipse.che.api.user.server.UserManager;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.KubernetesSharedPool;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * This class implements the logic for creating the roles and role bindings for the workspace\n * service account. Because of the differences between Kubernetes and OpenShift we need to use a lot\n * of generic params.\n *\n * @param <Client> the type of the client to use\n * @param <R> the Role type\n * @param <B> the RoleBinding type\n */\npublic abstract class AbstractWorkspaceServiceAccount<\n    Client extends KubernetesClient, R extends HasMetadata, B extends HasMetadata> {\n  private static final Logger LOG = LoggerFactory.getLogger(AbstractWorkspaceServiceAccount.class);\n  public static final String EXEC_ROLE_NAME = \"exec\";\n  public static final String VIEW_ROLE_NAME = \"workspace-view\";\n  public static final String METRICS_ROLE_NAME = \"workspace-metrics\";\n  public static final String SECRETS_ROLE_NAME = \"workspace-secrets\";\n  public static final String CONFIGMAPS_ROLE_NAME = \"workspace-configmaps\";\n  public static final String CREDENTIALS_SECRET_NAME = \"workspace-credentials-secret\";\n  public static final String PREFERENCES_CONFIGMAP_NAME = \"workspace-preferences-configmap\";\n  public static final String GIT_USERDATA_CONFIGMAP_NAME = \"workspace-userdata-gitconfig-configmap\";\n\n  protected final String namespace;\n  protected final String serviceAccountName;\n  private final ClientFactory<Client> clientFactory;\n  private final String workspaceId;\n  private final Set<String> clusterRoleNames;\n  private final Function<\n          Client, MixedOperation<R, ? extends KubernetesResourceList<R>, ? extends Resource<R>>>\n      roles;\n  private final Function<\n          Client, MixedOperation<B, ? extends KubernetesResourceList<B>, ? extends Resource<B>>>\n      roleBindings;\n\n  protected AbstractWorkspaceServiceAccount(\n      String workspaceId,\n      String namespace,\n      String serviceAccountName,\n      Set<String> clusterRoleNames,\n      ClientFactory<Client> clientFactory,\n      Function<\n              Client, MixedOperation<R, ? extends KubernetesResourceList<R>, ? extends Resource<R>>>\n          roles,\n      Function<\n              Client, MixedOperation<B, ? extends KubernetesResourceList<B>, ? extends Resource<B>>>\n          roleBindings) {\n    this.workspaceId = workspaceId;\n    this.namespace = namespace;\n    this.serviceAccountName = serviceAccountName;\n    this.clusterRoleNames = clusterRoleNames;\n    this.clientFactory = clientFactory;\n    this.roles = roles;\n    this.roleBindings = roleBindings;\n  }\n\n  /**\n   * Make sure that workspace service account exists and has `view` and `exec` role bindings, as\n   * well as create workspace-view and exec roles in namespace scope\n   *\n   * @throws InfrastructureException when any exception occurred\n   */\n  public void prepare() throws InfrastructureException {\n    Client k8sClient = clientFactory.create(workspaceId);\n    if (k8sClient.serviceAccounts().inNamespace(namespace).withName(serviceAccountName).get()\n        == null) {\n      createWorkspaceServiceAccount(k8sClient);\n    }\n    ensureImplicitRolesWithBindings(k8sClient);\n    ensureExplicitClusterRoleBindings(k8sClient);\n  }\n\n  /**\n   * Creates implicit Roles and RoleBindings for workspace ServiceAccount that we need to have fully\n   * working workspaces with this SA.\n   *\n   * <p>creates {@code <sa>-exec} and {@code <sa>-view}\n   */\n  private void ensureImplicitRolesWithBindings(Client k8sClient) {\n    // exec role\n    ensureRoleWithBinding(\n        k8sClient,\n        buildRole(\n            EXEC_ROLE_NAME,\n            singletonList(\"pods/exec\"),\n            emptyList(),\n            singletonList(\"\"),\n            singletonList(\"create\")),\n        serviceAccountName + \"-exec\");\n\n    // view role\n    ensureRoleWithBinding(\n        k8sClient,\n        buildRole(\n            VIEW_ROLE_NAME,\n            Arrays.asList(\"pods\", \"services\"),\n            emptyList(),\n            singletonList(\"\"),\n            singletonList(\"list\")),\n        serviceAccountName + \"-view\");\n\n    // metrics role\n    try {\n      if (k8sClient.supportsApiPath(\"/apis/metrics.k8s.io\")) {\n        ensureRoleWithBinding(\n            k8sClient,\n            buildRole(\n                METRICS_ROLE_NAME,\n                Arrays.asList(\"pods\", \"nodes\"),\n                emptyList(),\n                singletonList(\"metrics.k8s.io\"),\n                Arrays.asList(\"list\", \"get\", \"watch\")),\n            serviceAccountName + \"-metrics\");\n      }\n    } catch (KubernetesClientException e) {\n      // workaround to unblock workspace start if no permissions for metrics\n      if (e.getCode() == 403) {\n        LOG.warn(\n            \"Unable to add metrics roles due to insufficient permissions. Workspace metrics will be disabled.\");\n      } else {\n        throw e;\n      }\n    }\n\n    // credentials-secret role\n    ensureRoleWithBinding(\n        k8sClient,\n        buildRole(\n            SECRETS_ROLE_NAME,\n            singletonList(\"secrets\"),\n            singletonList(CREDENTIALS_SECRET_NAME),\n            singletonList(\"\"),\n            Arrays.asList(\"get\", \"patch\")),\n        serviceAccountName + \"-secrets\");\n\n    // preferences-configmap role\n    ensureRoleWithBinding(\n        k8sClient,\n        buildRole(\n            CONFIGMAPS_ROLE_NAME,\n            singletonList(\"configmaps\"),\n            singletonList(PREFERENCES_CONFIGMAP_NAME),\n            singletonList(\"\"),\n            Arrays.asList(\"get\", \"patch\")),\n        serviceAccountName + \"-configmaps\");\n  }\n\n  private void ensureRoleWithBinding(Client k8sClient, R role, String bindingName) {\n    ensureRole(k8sClient, role);\n    //noinspection unchecked\n    roleBindings\n        .apply(k8sClient)\n        .inNamespace(namespace)\n        .createOrReplace(createRoleBinding(role.getMetadata().getName(), bindingName, false));\n  }\n\n  /**\n   * Creates workspace ServiceAccount ClusterRoleBindings that are defined in\n   * 'che.infra.kubernetes.workspace_sa_cluster_roles' property.\n   *\n   * @see KubernetesNamespaceFactory#KubernetesNamespaceFactory(String, String, String, boolean,\n   *     boolean, String, String, KubernetesClientFactory, CheServerKubernetesClientFactory,\n   *     UserManager, PreferenceManager, KubernetesSharedPool)\n   */\n  private void ensureExplicitClusterRoleBindings(Client k8sClient) {\n    // If the user specified an additional cluster roles for the workspace,\n    // create a role binding for them too\n    int idx = 0;\n    for (String clusterRoleName : this.clusterRoleNames) {\n      if (k8sClient.rbac().clusterRoles().withName(clusterRoleName).get() != null) {\n        //noinspection unchecked\n        roleBindings\n            .apply(k8sClient)\n            .inNamespace(namespace)\n            .createOrReplace(\n                createRoleBinding(clusterRoleName, serviceAccountName + \"-cluster\" + idx++, true));\n      } else {\n        LOG.warn(\n            \"Unable to find the cluster role {}. Skip creating custom role binding.\",\n            clusterRoleName);\n      }\n    }\n  }\n\n  /**\n   * Builds a new role in the configured namespace but does not persist it.\n   *\n   * @param name the name of the role\n   * @param resources the resources the role grants access to\n   * @param resourceNames specific resource names witch the role grants access to.\n   * @param verbs the verbs the role allows\n   * @return the role object for the given type of Client\n   */\n  protected abstract R buildRole(\n      String name,\n      List<String> resources,\n      List<String> resourceNames,\n      List<String> apiGroups,\n      List<String> verbs);\n\n  /**\n   * Builds a new role binding but does not persist it.\n   *\n   * @param roleName the name of the role to bind to\n   * @param bindingName the name of the binding\n   * @param clusterRole whether the binding is for a cluster role or to a role in the namespace\n   * @return\n   */\n  protected abstract B createRoleBinding(String roleName, String bindingName, boolean clusterRole);\n\n  private void createWorkspaceServiceAccount(Client k8sClient) {\n    k8sClient\n        .serviceAccounts()\n        .inNamespace(namespace)\n        .createOrReplace(\n            new ServiceAccountBuilder()\n                .withAutomountServiceAccountToken(true)\n                .withNewMetadata()\n                .withName(serviceAccountName)\n                .endMetadata()\n                .build());\n  }\n\n  private void ensureRole(Client k8sClient, R role) {\n    //noinspection unchecked\n    roles.apply(k8sClient).inNamespace(namespace).createOrReplace(role);\n  }\n\n  public interface ClientFactory<C extends KubernetesClient> {\n\n    C create(String workspaceId) throws InfrastructureException;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/K8sVersion.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport io.fabric8.kubernetes.client.VersionInfo;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Gets version of k8s cluster from given {@link KubernetesClientFactory#create()} and provides\n * functions over it. It lazy-loads {@link VersionInfo} from k8s and use the stored data after.\n * Future methods implementations must ensure that {@link VersionInfo} is properly lazy-loaded.\n *\n * <p>In case of issue like infrastructure or parsing failures, this implementation assumes that\n * we're on newer version.\n *\n * <p>Parsing of version strings is very naive, we just strip all non-digit characters and parse as\n * integer. This should be enough for standard version strings and where it fails, we assume we're\n * on newer version. These are version formats from various platforms:\n *\n * <pre>\n * minikube v1.11.0 with k8s 1.17.6:\n * {\n *  major=1,\n *  minor=17,\n *  ...\n * }\n *\n * minishift v1.34.2+83ebaab:\n * {\n *   major=1,\n *   minor=11+,\n *   ...\n * }\n *\n * crc 1.12.0+6710aff with OpenShift version 4.4.8\n * {\n *  major=1,\n *  minor=17+,\n *  ...\n * }\n * </pre>\n */\n@Singleton\npublic class K8sVersion {\n\n  private static final Logger LOG = LoggerFactory.getLogger(K8sVersion.class);\n\n  private final KubernetesClientFactory clientFactory;\n  private VersionInfo versionInfo;\n  private int major;\n  private int minor;\n\n  @Inject\n  public K8sVersion(KubernetesClientFactory clientFactory) {\n    this.clientFactory = clientFactory;\n  }\n\n  /**\n   * Returns 'true' if k8s version is newer or equal than given {@code major.minor}. 'false' if k8s\n   * version is older.\n   *\n   * <p>In case of any issue like infrastructure or parse failures, assume we're on newer version\n   * and return 'true'.\n   *\n   * @param major major version to compare\n   * @param minor minor version to compare\n   * @return true if k8s version is newer or equal than given {@code major.minor}\n   */\n  public boolean newerOrEqualThan(int major, int minor) {\n    try {\n      initVersionInfo();\n    } catch (InfrastructureException ie) {\n      LOG.warn(\"Unable to obtain k8s VersionInfo.\", ie);\n      return true;\n    }\n\n    if (this.major > major) {\n      return true;\n    } else if (this.major == major) {\n      return this.minor >= minor;\n    } else {\n      return false;\n    }\n  }\n\n  /**\n   * Returns 'true' if k8s version is older than given {@code major.minor}. 'false' if k8s version\n   * is newer or equal.\n   *\n   * <p>In case of any issue like infrastructure or parse failures, assume we're on newer version\n   * and return 'false'.\n   *\n   * @param major major version to compare\n   * @param minor minor version to compare\n   * @return true if given {@code major.minor} version is older than k8s version\n   */\n  public boolean olderThan(int major, int minor) {\n    return !newerOrEqualThan(major, minor);\n  }\n\n  private void initVersionInfo() throws InfrastructureException {\n    if (versionInfo == null) {\n      synchronized (this) {\n        if (versionInfo == null) {\n          versionInfo = clientFactory.create().getVersion();\n          LOG.debug(\"Obtained k8s version {} {}\", versionInfo.getMajor(), versionInfo.getMinor());\n          parseVersions();\n        }\n      }\n    }\n  }\n\n  /**\n   * Try parse versions into integers. This naive implementation removes all non-digits and try to\n   * parse what's left into integer.\n   */\n  private void parseVersions() {\n    try {\n      this.major = parseVersionNumber(versionInfo.getMajor());\n      this.minor = parseVersionNumber(versionInfo.getMinor());\n    } catch (NumberFormatException nfe) {\n      LOG.warn(\n          \"Unable to parse k8s version [major: {}, minor: {}].\",\n          versionInfo.getMajor(),\n          versionInfo.getMinor(),\n          nfe);\n      this.major = Integer.MAX_VALUE;\n      this.minor = Integer.MAX_VALUE;\n    }\n  }\n\n  private int parseVersionNumber(String versionString) {\n    versionString = versionString.replaceAll(\"\\\\D+\", \"\");\n    return Integer.parseInt(versionString);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesConfigsMaps.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static io.fabric8.kubernetes.api.model.DeletionPropagation.BACKGROUND;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_WORKSPACE_ID_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putLabel;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport java.util.Optional;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructureException;\n\n/**\n * Defines an internal API for managing {@link ConfigMap} instances in {@link\n * KubernetesConfigsMaps#namespace predefined namespace}.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesConfigsMaps {\n  private final String namespace;\n  private final String workspaceId;\n  private final KubernetesClientFactory clientFactory;\n\n  KubernetesConfigsMaps(\n      String namespace, String workspaceId, KubernetesClientFactory clientFactory) {\n    this.namespace = namespace;\n    this.workspaceId = workspaceId;\n    this.clientFactory = clientFactory;\n  }\n\n  /**\n   * Retrieves config map by name.\n   *\n   * @param configMapName name of config map to get\n   * @return config map optional\n   * @throws InfrastructureException when any exception occurs\n   */\n  public Optional<ConfigMap> get(String configMapName) throws InfrastructureException {\n    return Optional.ofNullable(\n        clientFactory\n            .create(workspaceId)\n            .configMaps()\n            .inNamespace(namespace)\n            .withName(configMapName)\n            .get());\n  }\n\n  /**\n   * Creates specified config map.\n   *\n   * @param configMap config map to create\n   * @throws InfrastructureException when any exception occurs\n   * @return created {@link ConfigMap}\n   */\n  public ConfigMap create(ConfigMap configMap) throws InfrastructureException {\n    putLabel(configMap, CHE_WORKSPACE_ID_LABEL, workspaceId);\n    try {\n      return clientFactory\n          .create(workspaceId)\n          .configMaps()\n          .inNamespace(namespace)\n          .create(configMap);\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Deletes all existing config maps.\n   *\n   * @throws InfrastructureException when any exception occurs\n   */\n  public void delete() throws InfrastructureException {\n    try {\n      clientFactory\n          .create(workspaceId)\n          .configMaps()\n          .inNamespace(namespace)\n          .withLabel(CHE_WORKSPACE_ID_LABEL, workspaceId)\n          .withPropagationPolicy(BACKGROUND)\n          .delete();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesDeployments.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static io.fabric8.kubernetes.api.model.DeletionPropagation.BACKGROUND;\nimport static java.lang.String.format;\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static java.util.concurrent.CompletableFuture.allOf;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_DEPLOYMENT_NAME_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_WORKSPACE_ID_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.POD_STATUS_PHASE_FAILED;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.POD_STATUS_PHASE_RUNNING;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.POD_STATUS_PHASE_SUCCEEDED;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putLabel;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.setSelector;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.common.base.Strings;\nimport io.fabric8.kubernetes.api.model.ContainerStateTerminated;\nimport io.fabric8.kubernetes.api.model.ContainerStateWaiting;\nimport io.fabric8.kubernetes.api.model.ContainerStatus;\nimport io.fabric8.kubernetes.api.model.Event;\nimport io.fabric8.kubernetes.api.model.LocalObjectReference;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectReference;\nimport io.fabric8.kubernetes.api.model.OwnerReference;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.PodStatus;\nimport io.fabric8.kubernetes.api.model.ServiceAccount;\nimport io.fabric8.kubernetes.api.model.StatusDetails;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.kubernetes.client.Watch;\nimport io.fabric8.kubernetes.client.Watcher;\nimport io.fabric8.kubernetes.client.WatcherException;\nimport io.fabric8.kubernetes.client.dsl.ExecListener;\nimport io.fabric8.kubernetes.client.dsl.ExecWatch;\nimport io.fabric8.kubernetes.client.dsl.PodResource;\nimport io.fabric8.kubernetes.client.dsl.ScalableResource;\nimport java.io.ByteArrayOutputStream;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLEncoder;\nimport java.text.ParseException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ConcurrentLinkedQueue;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.Executor;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\nimport java.util.function.BiConsumer;\nimport java.util.function.Predicate;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodActionHandler;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEventHandler;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.LogWatchTimeouts;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.LogWatcher;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.PodLogHandler;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.PodEvents;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Defines an internal API for managing {@link Pod} and {@link Deployment} instances in {@link\n * KubernetesDeployments#namespace predefined namespace}.\n *\n * @author Sergii Leshchenko\n * @author Anton Korneta\n * @author Angel Misevski\n */\npublic class KubernetesDeployments {\n\n  private static final Logger LOG = LoggerFactory.getLogger(KubernetesDeployments.class);\n\n  private static final String CONTAINER_NAME_GROUP = \"name\";\n  // when event is related to container `fieldPath` field contains\n  // information in the following format: `spec.container{web}`, where `web` is container name\n  private static final Pattern CONTAINER_FIELD_PATH_PATTERN =\n      Pattern.compile(\"spec.containers\\\\{(?<\" + CONTAINER_NAME_GROUP + \">.*)}\");\n\n  // TODO https://github.com/eclipse/che/issues/7656\n  public static final int POD_REMOVAL_TIMEOUT_MIN = 5;\n  public static final int POD_CREATION_TIMEOUT_MIN = 1;\n\n  private static final String POD_OBJECT_KIND = \"Pod\";\n  private static final String REPLICASET_OBJECT_KIND = \"ReplicaSet\";\n  private static final String DEPLOYMENT_OBJECT_KIND = \"Deployment\";\n  // error stream data initial capacity\n  public static final int ERROR_BUFF_INITIAL_CAP = 2048;\n  public static final String STDOUT = \"stdout\";\n  public static final String STDERR = \"stderr\";\n\n  protected final String namespace;\n  protected final String workspaceId;\n  private final KubernetesClientFactory clientFactory;\n  private final ConcurrentLinkedQueue<PodActionHandler> podActionHandlers;\n  private final ConcurrentLinkedQueue<PodEventHandler> containerEventsHandlers;\n  private final Executor executor;\n  private Watch podWatch;\n  private Watch containerWatch;\n  private Date watcherInitializationDate;\n  private LogWatcher logWatcher;\n\n  protected KubernetesDeployments(\n      String namespace,\n      String workspaceId,\n      KubernetesClientFactory clientFactory,\n      Executor executor) {\n    this.namespace = namespace;\n    this.workspaceId = workspaceId;\n    this.clientFactory = clientFactory;\n    this.containerEventsHandlers = new ConcurrentLinkedQueue<>();\n    this.podActionHandlers = new ConcurrentLinkedQueue<>();\n    this.executor = executor;\n  }\n\n  /**\n   * Starts the specified Pod via a Deployment.\n   *\n   * @param pod pod to deploy\n   * @return created pod\n   * @throws InfrastructureException when any exception occurs\n   */\n  public Pod deploy(Pod pod) throws InfrastructureException {\n    putLabel(pod, CHE_WORKSPACE_ID_LABEL, workspaceId);\n    // Since we use the pod's metadata as the deployment's metadata\n    // This is used to identify the pod in CreateWatcher.\n    String originalName = pod.getMetadata().getName();\n    putLabel(pod, CHE_DEPLOYMENT_NAME_LABEL, originalName);\n\n    ObjectMeta metadata = pod.getMetadata();\n    PodSpec podSpec = pod.getSpec();\n    podSpec.setRestartPolicy(\"Always\"); // Only allowable value\n\n    Deployment deployment =\n        new DeploymentBuilder()\n            .withMetadata(metadata)\n            .withNewSpec()\n            .withNewSelector()\n            .withMatchLabels(metadata.getLabels())\n            .endSelector()\n            .withReplicas(1)\n            .withNewTemplate()\n            .withMetadata(metadata)\n            .withSpec(podSpec)\n            .endTemplate()\n            .endSpec()\n            .build();\n    return createDeployment(deployment, workspaceId);\n  }\n\n  public Pod deploy(Deployment deployment) throws InfrastructureException {\n    ObjectMeta podMeta = deployment.getSpec().getTemplate().getMetadata();\n    putLabel(podMeta, CHE_WORKSPACE_ID_LABEL, workspaceId);\n    putLabel(podMeta, CHE_DEPLOYMENT_NAME_LABEL, deployment.getMetadata().getName());\n    putLabel(deployment.getMetadata(), CHE_WORKSPACE_ID_LABEL, workspaceId);\n    // Match condition for a deployment is an AND of all labels\n    setSelector(deployment, podMeta.getLabels());\n    // Avoid accidental setting of multiple replicas\n    deployment.getSpec().setReplicas(1);\n\n    PodSpec podSpec = deployment.getSpec().getTemplate().getSpec();\n    podSpec.setRestartPolicy(\"Always\"); // Only allowable value\n\n    return createDeployment(deployment, workspaceId);\n  }\n\n  private Pod createDeployment(Deployment deployment, String workspaceId)\n      throws InfrastructureException {\n    addPullSecretsOfSA(deployment);\n    final String deploymentName = deployment.getMetadata().getName();\n    final CompletableFuture<Pod> createFuture = new CompletableFuture<>();\n    final Watch createWatch =\n        clientFactory\n            .create(workspaceId)\n            .pods()\n            .inNamespace(namespace)\n            .withLabels(\n                Map.of(\n                    CHE_WORKSPACE_ID_LABEL, workspaceId, CHE_DEPLOYMENT_NAME_LABEL, deploymentName))\n            .watch(new CreateWatcher(createFuture, workspaceId, deploymentName));\n    try {\n      clientFactory\n          .create(workspaceId)\n          .apps()\n          .deployments()\n          .inNamespace(namespace)\n          .create(deployment);\n      return createFuture.get(POD_CREATION_TIMEOUT_MIN, TimeUnit.MINUTES);\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    } catch (InterruptedException e) {\n      Thread.currentThread().interrupt();\n      throw new InfrastructureException(\n          format(\n              \"Interrupted while waiting for Pod creation. -id: %s -message: %s\",\n              deploymentName, e.getMessage()));\n    } catch (ExecutionException e) {\n      throw new InfrastructureException(\n          format(\n              \"Error occured while waiting for Pod creation. -id: %s -message: %s\",\n              deploymentName, e.getCause().getMessage()));\n    } catch (TimeoutException e) {\n      throw new InfrastructureException(\n          format(\n              \"Pod creation timeout exceeded. -id: %s -message: %s\",\n              deploymentName, e.getMessage()));\n    } finally {\n      createWatch.close();\n    }\n  }\n\n  /**\n   * Create a terminating pod that is not part of a Deployment.\n   *\n   * @param pod the Pod to create\n   * @return the created pod\n   * @throws InfrastructureException when any error occurs\n   */\n  public Pod create(Pod pod) throws InfrastructureException {\n    putLabel(pod, CHE_WORKSPACE_ID_LABEL, workspaceId);\n    try {\n      return clientFactory.create(workspaceId).pods().inNamespace(namespace).create(pod);\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Returns all existing pods.\n   *\n   * @throws InfrastructureException when any exception occurs\n   */\n  public List<Pod> get() throws InfrastructureException {\n    try {\n      return clientFactory\n          .create(workspaceId)\n          .pods()\n          .inNamespace(namespace)\n          .withLabel(CHE_WORKSPACE_ID_LABEL, workspaceId)\n          .list()\n          .getItems();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Returns optional with pod that either has specified name or is controlled by Deployment with\n   * specified name.\n   *\n   * @param name name of the Pod or Deployment\n   * @throws InfrastructureException when any exception occurs\n   */\n  public Optional<Pod> get(String name) throws InfrastructureException {\n    return findPod(name);\n  }\n\n  /**\n   * Returns a future which completes when pod state satisfies the specified predicate.\n   *\n   * <p>Note that for resource cleanup, the resulting future must be explicitly cancelled when its\n   * completion no longer important.\n   *\n   * @param name name of pod or deployment containing pod that should be watched\n   * @param predicate predicate to perform state check\n   * @return pod that satisfies the specified predicate\n   * @throws InfrastructureException when specified pod or deployment does not exist\n   * @throws InfrastructureException when any other exception occurs\n   */\n  public CompletableFuture<Pod> waitAsync(String name, Predicate<Pod> predicate)\n      throws InfrastructureException {\n    String podName = getPodName(name);\n    CompletableFuture<Pod> future = new CompletableFuture<>();\n    try {\n\n      PodResource podResource =\n          clientFactory.create(workspaceId).pods().inNamespace(namespace).withName(podName);\n\n      Watch watch =\n          podResource.watch(\n              new Watcher<>() {\n                @Override\n                public void eventReceived(Action action, Pod pod) {\n                  if (predicate.test(pod)) {\n                    future.complete(pod);\n                  }\n                }\n\n                @Override\n                public void onClose(WatcherException cause) {\n                  future.completeExceptionally(\n                      new InfrastructureException(\n                          \"Waiting for pod '\" + podName + \"' was interrupted\"));\n                }\n              });\n\n      Pod actualPod = podResource.get();\n      if (actualPod == null) {\n        if (name.equals(podName)) { // `name` refers to a bare pod\n          throw new InfrastructureException(\"Specified pod \" + podName + \" doesn't exist\");\n        } else { // `name` refers to a deployment\n          throw new InfrastructureException(\"No pod in deployment \" + name + \" found.\");\n        }\n      }\n      if (predicate.test(actualPod)) {\n        return CompletableFuture.completedFuture(actualPod);\n      }\n\n      future.whenComplete((ok, ex) -> watch.close());\n      return future;\n\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Subscribes to pod events and returns the resulting future, which completes when pod becomes\n   * running.\n   *\n   * <p>Note that the resulting future must be explicitly cancelled when its completion no longer\n   * important because of finalization allocated resources.\n   *\n   * @param name the pod or deployment (that contains pod) name that should be watched\n   * @return completable future that is completed when one of the following conditions is met:\n   *     <ul>\n   *       <li>complete successfully in case of \"Running\" pod state.\n   *       <li>complete exceptionally in case of \"Failed\" pod state. Exception will contain pod\n   *           status reason value, or if absent, it will attempt to retrieve pod logs.\n   *       <li>complete exceptionally in case of \"Succeeded\" pod state. (workspace container has\n   *           been terminated).\n   *       <li>complete exceptionally when exception while getting pod resource occurred.\n   *       <li>complete exceptionally when connection problem occurred.\n   *     </ul>\n   *     otherwise, it must be explicitly closed\n   */\n  public CompletableFuture<Void> waitRunningAsync(String name) {\n    final CompletableFuture<Void> podRunningFuture = new CompletableFuture<>();\n    try {\n      final String podName = getPodName(name);\n      final PodResource podResource =\n          clientFactory.create(workspaceId).pods().inNamespace(namespace).withName(podName);\n      final Watch watch =\n          podResource.watch(\n              new Watcher<>() {\n                @Override\n                public void eventReceived(Action action, Pod pod) {\n                  handleStartingPodStatus(podRunningFuture, pod);\n                }\n\n                @Override\n                public void onClose(WatcherException cause) {\n                  podRunningFuture.completeExceptionally(\n                      new InfrastructureException(\n                          \"Waiting for pod '\" + podName + \"' was interrupted\"));\n                }\n              });\n\n      podRunningFuture.whenComplete((ok, ex) -> watch.close());\n      final Pod pod = podResource.get();\n      if (pod == null) {\n        InfrastructureException ex;\n        if (name.equals(podName)) { // `name` refers to bare pod\n          ex = new InfrastructureException(\"Specified pod \" + podName + \" doesn't exist\");\n        } else {\n          ex = new InfrastructureException(\"No pod in deployment \" + name + \" found.\");\n        }\n        podRunningFuture.completeExceptionally(ex);\n      } else {\n        handleStartingPodStatus(podRunningFuture, pod);\n      }\n    } catch (KubernetesClientException | InfrastructureException ex) {\n      podRunningFuture.completeExceptionally(ex);\n    }\n    return podRunningFuture;\n  }\n\n  private void handleStartingPodStatus(CompletableFuture<Void> podRunningFuture, Pod pod) {\n    PodStatus status = pod.getStatus();\n    String podPhase = status.getPhase();\n    if (POD_STATUS_PHASE_RUNNING.equals(podPhase)) {\n      // check that all the containers are ready...\n      Map<String, String> terminatedContainers = new HashMap<>();\n      List<String> restartingContainers = new ArrayList<>();\n\n      for (ContainerStatus cs : status.getContainerStatuses()) {\n        ContainerStateTerminated terminated = cs.getState().getTerminated();\n\n        if (terminated == null) {\n          ContainerStateWaiting waiting = cs.getState().getWaiting();\n          // we've caught the container waiting for a restart after a failure\n          if (waiting != null) {\n            terminated = cs.getLastState().getTerminated();\n          }\n        }\n\n        if (terminated != null) {\n          terminatedContainers.put(\n              cs.getName(),\n              format(\n                  \"reason = '%s', exit code = %d, message = '%s'\",\n                  terminated.getReason(), terminated.getExitCode(), terminated.getMessage()));\n        }\n\n        if (cs.getRestartCount() != null && cs.getRestartCount() > 0) {\n          restartingContainers.add(cs.getName());\n        }\n      }\n\n      if (terminatedContainers.isEmpty() && restartingContainers.isEmpty()) {\n        podRunningFuture.complete(null);\n      } else {\n        StringBuilder errorMessage = new StringBuilder();\n\n        if (!restartingContainers.isEmpty()) {\n          errorMessage.append(\"The following containers have restarted during the startup:\\n\");\n          errorMessage.append(String.join(\", \", restartingContainers));\n        }\n\n        if (!terminatedContainers.isEmpty()) {\n          if (errorMessage.length() > 0) {\n            errorMessage.append(\"\\n\");\n          }\n\n          errorMessage.append(\"The following containers have terminated:\\n\");\n          errorMessage.append(\n              terminatedContainers.entrySet().stream()\n                  .map(e -> e.getKey() + \": \" + e.getValue())\n                  .collect(Collectors.joining(\"\" + \"\\n\")));\n        }\n\n        podRunningFuture.completeExceptionally(\n            new InfrastructureException(errorMessage.toString()));\n      }\n\n      return;\n    }\n\n    if (POD_STATUS_PHASE_SUCCEEDED.equals(podPhase)) {\n      podRunningFuture.completeExceptionally(\n          new InfrastructureException(\n              \"Pod container has been terminated. Container must be configured to use a non-terminating command.\"));\n      return;\n    }\n\n    if (POD_STATUS_PHASE_FAILED.equals(podPhase)) {\n      String exceptionMessage = \"Pod '\" + pod.getMetadata().getName() + \"' failed to start.\";\n      String reason = pod.getStatus().getReason();\n      if (Strings.isNullOrEmpty(reason)) {\n        try {\n          String podLog =\n              clientFactory\n                  .create(workspaceId)\n                  .pods()\n                  .inNamespace(namespace)\n                  .withName(pod.getMetadata().getName())\n                  .getLog();\n          exceptionMessage = exceptionMessage.concat(\" Pod logs: \").concat(podLog);\n\n        } catch (InfrastructureException | KubernetesClientException e) {\n          exceptionMessage =\n              exceptionMessage.concat(\" Error occurred while fetching pod logs: \" + e.getMessage());\n        }\n      } else {\n        exceptionMessage = exceptionMessage.concat(\" Reason: \").concat(reason);\n      }\n      podRunningFuture.completeExceptionally(new InfrastructureException(exceptionMessage));\n      LOG.warn(exceptionMessage);\n    }\n  }\n\n  /**\n   * Starts watching the pods inside Kubernetes namespace and registers a specified handler for such\n   * events. Note that watcher can be started only once so two times invocation of this method will\n   * not produce new watcher and just register the event handlers.\n   *\n   * @param handler pod action events handler\n   * @throws InfrastructureException if any error occurs while watcher starting\n   */\n  public void watch(PodActionHandler handler) throws InfrastructureException {\n    if (podWatch == null) {\n      final Watcher<Pod> watcher =\n          new Watcher<>() {\n            @Override\n            public void eventReceived(Action action, Pod pod) {\n              podActionHandlers.forEach(h -> h.handle(action, pod));\n            }\n\n            @Override\n            public void onClose(WatcherException cause) {}\n          };\n      try {\n        podWatch =\n            clientFactory\n                .create(workspaceId)\n                .pods()\n                .inNamespace(namespace)\n                .withLabel(CHE_WORKSPACE_ID_LABEL, workspaceId)\n                .watch(watcher);\n      } catch (KubernetesClientException ex) {\n        throw new KubernetesInfrastructureException(ex);\n      }\n    }\n    podActionHandlers.add(handler);\n  }\n\n  /**\n   * Registers a specified handler for handling events about changes in pods containers. Registering\n   * several handlers doesn't create multiple websocket connections, so it is efficient to call this\n   * method several times instead of using composite handler to combine other handlers.\n   *\n   * @param handler pod container events handler\n   * @throws InfrastructureException if any error occurs while watcher starting\n   */\n  public void watchEvents(PodEventHandler handler) throws InfrastructureException {\n    if (containerWatch == null) {\n      final Watcher<Event> watcher =\n          new Watcher<>() {\n            @Override\n            public void eventReceived(Action action, Event event) {\n              ObjectReference involvedObject = event.getInvolvedObject();\n\n              if (POD_OBJECT_KIND.equals(involvedObject.getKind())\n                  || REPLICASET_OBJECT_KIND.equals(involvedObject.getKind())\n                  || DEPLOYMENT_OBJECT_KIND.equals(involvedObject.getKind())) {\n                String podName = involvedObject.getName();\n                String lastTimestamp = event.getLastTimestamp();\n                if (lastTimestamp == null) {\n                  String firstTimestamp = event.getFirstTimestamp();\n                  if (firstTimestamp != null) {\n                    // Done in the same way like it made in\n                    // https://github.com/kubernetes/kubernetes/pull/86557\n                    lastTimestamp = firstTimestamp;\n                  } else {\n                    LOG.debug(\n                        \"lastTimestamp and firstTimestamp are undefined. Event: {}.  Fallback to the current time.\",\n                        event);\n                    lastTimestamp = PodEvents.convertDateToEventTimestamp(new Date());\n                  }\n                }\n\n                PodEvent podEvent =\n                    new PodEvent(\n                        podName,\n                        getContainerName(involvedObject.getFieldPath()),\n                        event.getReason(),\n                        event.getMessage(),\n                        event.getMetadata().getCreationTimestamp(),\n                        lastTimestamp);\n\n                try {\n                  if (happenedAfterWatcherInitialization(podEvent)) {\n                    containerEventsHandlers.forEach(h -> h.handle(podEvent));\n                  }\n                } catch (ParseException e) {\n                  LOG.error(\n                      \"Failed to parse last timestamp of the event. Cause: {}. Event: {}\",\n                      e.getMessage(),\n                      podEvent,\n                      e);\n                }\n              }\n            }\n\n            @Override\n            public void onClose(WatcherException ignored) {}\n\n            /**\n             * Returns the container name if the event is related to container. When the event is\n             * related to container `fieldPath` field contain information in the following format:\n             * `spec.container{web}`, where `web` is container name\n             */\n            private String getContainerName(String fieldPath) {\n              String containerName = null;\n              if (fieldPath != null) {\n                Matcher containerFieldMatcher = CONTAINER_FIELD_PATH_PATTERN.matcher(fieldPath);\n                if (containerFieldMatcher.matches()) {\n                  containerName = containerFieldMatcher.group(CONTAINER_NAME_GROUP);\n                }\n              }\n              return containerName;\n            }\n\n            /**\n             * Returns true if 'lastTimestamp' of the event is *after* the time of the watcher\n             * initialization\n             */\n            private boolean happenedAfterWatcherInitialization(PodEvent event)\n                throws ParseException {\n              String eventLastTimestamp = event.getLastTimestamp();\n              Date eventLastTimestampDate =\n                  PodEvents.convertEventTimestampToDate(eventLastTimestamp);\n              return eventLastTimestampDate.after(watcherInitializationDate);\n            }\n          };\n      try {\n        watcherInitializationDate = new Date();\n        containerWatch =\n            clientFactory.create(workspaceId).v1().events().inNamespace(namespace).watch(watcher);\n      } catch (KubernetesClientException ex) {\n        throw new KubernetesInfrastructureException(ex);\n      }\n    }\n    containerEventsHandlers.add(handler);\n  }\n\n  /**\n   * Start watching the logs of this deployment.\n   *\n   * @param handler is processing log messages\n   * @param podNames pods of interest for watching the logs\n   */\n  public synchronized void watchLogs(\n      PodLogHandler handler,\n      RuntimeEventsPublisher eventsPublisher,\n      LogWatchTimeouts timeouts,\n      Set<String> podNames,\n      long limitInputStreamBytes)\n      throws InfrastructureException {\n    if (logWatcher == null) {\n      LOG.debug(\"start watching logs of pods '{}' of  workspace '{}'\", podNames, workspaceId);\n      logWatcher =\n          new LogWatcher(\n              clientFactory,\n              eventsPublisher,\n              workspaceId,\n              namespace,\n              podNames,\n              executor,\n              timeouts,\n              limitInputStreamBytes);\n      logWatcher.addLogHandler(handler);\n      watchEvents(logWatcher);\n    } else {\n      LOG.debug(\"Already watching logs of workspace [{}], just adding log handler\", workspaceId);\n      logWatcher.addLogHandler(handler);\n    }\n  }\n\n  public void stopWatch() {\n    stopWatch(false);\n  }\n\n  /**\n   * Stops watching the pods inside Kubernetes namespace.\n   *\n   * @param failed true if workspace startup ended in failure.\n   */\n  public void stopWatch(boolean failed) {\n    try {\n      if (podWatch != null) {\n        podWatch.close();\n      }\n    } catch (KubernetesClientException ex) {\n      LOG.error(\n          \"Failed to stop pod watcher for namespace '{}' cause '{}'\", namespace, ex.getMessage());\n    }\n    podActionHandlers.clear();\n\n    try {\n      if (containerWatch != null) {\n        containerWatch.close();\n      }\n    } catch (KubernetesClientException ex) {\n      LOG.error(\n          \"Failed to stop pods containers watcher for namespace '{}' cause '{}'\",\n          namespace,\n          ex.getMessage());\n    }\n    containerEventsHandlers.clear();\n\n    if (logWatcher != null) {\n      logWatcher.close(failed);\n      logWatcher = null;\n    }\n  }\n\n  /**\n   * Executes command in specified container.\n   *\n   * @param name pod name (or name of deployment containing pod) where command will be executed\n   * @param containerName container name where command will be executed\n   * @param timeoutMin timeout to wait until process will be done\n   * @param command command to execute\n   * @param outputConsumer command output biconsumer, that is accepts stream type and message\n   * @throws InfrastructureException when specified timeout is reached\n   * @throws InfrastructureException when {@link Thread} is interrupted while command executing\n   * @throws InfrastructureException when command error stream is not empty\n   * @throws InfrastructureException when any other exception occurs\n   */\n  public void exec(\n      String name,\n      String containerName,\n      int timeoutMin,\n      String[] command,\n      BiConsumer<String, String> outputConsumer)\n      throws InfrastructureException {\n    final String podName = getPodName(name);\n    final ExecWatchdog watchdog = new ExecWatchdog();\n    final ByteArrayOutputStream errStream = new ByteArrayOutputStream(ERROR_BUFF_INITIAL_CAP);\n    try (ExecWatch watch =\n        clientFactory\n            .create(workspaceId)\n            .pods()\n            .inNamespace(namespace)\n            .withName(podName)\n            .inContainer(containerName)\n            .writingError(errStream)\n            .usingListener(watchdog)\n            .exec(encode(command))) {\n      try {\n        watchdog.wait(timeoutMin, TimeUnit.MINUTES);\n        final byte[] error = errStream.toByteArray();\n        if (error.length > 0) {\n          final String cmd = Arrays.stream(command).collect(Collectors.joining(\" \", \"\", \"\\n\"));\n          final String err = new String(error, UTF_8);\n          outputConsumer.accept(STDOUT, cmd);\n          outputConsumer.accept(STDERR, err);\n          throw new InfrastructureException(err);\n        }\n      } catch (InterruptedException ex) {\n        Thread.currentThread().interrupt();\n        throw new InfrastructureException(ex.getMessage(), ex);\n      }\n    } catch (KubernetesClientException ex) {\n      throw new KubernetesInfrastructureException(ex);\n    }\n  }\n\n  /**\n   * Executes command in specified container.\n   *\n   * @param name pod name (or name of deployment containing pod) where command will be executed\n   * @param containerName container name where command will be executed\n   * @param timeoutMin timeout to wait until process will be done\n   * @param command command to execute\n   * @throws InfrastructureException when specified timeout is reached\n   * @throws InfrastructureException when {@link Thread} is interrupted while command executing\n   * @throws InfrastructureException when any other exception occurs\n   */\n  public void exec(String name, String containerName, int timeoutMin, String[] command)\n      throws InfrastructureException {\n    final String podName = getPodName(name);\n    final ExecWatchdog watchdog = new ExecWatchdog();\n    try (ExecWatch watch =\n        clientFactory\n            .create(workspaceId)\n            .pods()\n            .inNamespace(namespace)\n            .withName(podName)\n            .inContainer(containerName)\n            // redirecting error output to exec watch out stream\n            .redirectingError()\n            .usingListener(watchdog)\n            .exec(encode(command))) {\n      try {\n        watchdog.wait(timeoutMin, TimeUnit.MINUTES);\n      } catch (InterruptedException e) {\n        Thread.currentThread().interrupt();\n        throw new InfrastructureException(e.getMessage(), e);\n      }\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Get logs from pod with specified name. The name can refer to either a deployment or pod\n   * directly. In case of a deployment being provided, logs are returned from pods in that\n   * deployment.\n   *\n   * @return the logs from the pod or null if pod cannot be found.\n   */\n  @Nullable\n  public String getPodLogs(String name) {\n    String podName;\n    try {\n      podName = getPodName(name);\n      return clientFactory\n          .create(workspaceId)\n          .pods()\n          .inNamespace(namespace)\n          .withName(podName)\n          .getLog();\n    } catch (InfrastructureException e) {\n      LOG.error(\"Could not get logs from pod {}. Pod not found\", name);\n      return null;\n    }\n  }\n\n  /**\n   * Deletes pod or deployment with given name. If a Pod controlled by a Deployment is specified,\n   * the owning Deployment will be deleted instead.\n   *\n   * <p>Note that this method will mark Kubernetes pod as interrupted and then will wait until pod\n   * will be killed.\n   *\n   * @param name name of pod or deployment to remove\n   * @throws InfrastructureException when {@link Thread} is interrupted while command executing\n   * @throws InfrastructureException when pod removal timeout is reached\n   * @throws InfrastructureException when any other exception occurs\n   */\n  public void delete(String name) throws InfrastructureException {\n    try {\n      Pod pod =\n          clientFactory.create(workspaceId).pods().inNamespace(namespace).withName(name).get();\n      if (pod != null) {\n        doDeletePod(name).get(POD_REMOVAL_TIMEOUT_MIN, TimeUnit.MINUTES);\n      } else {\n        doDeleteDeployment(name).get(POD_REMOVAL_TIMEOUT_MIN, TimeUnit.MINUTES);\n      }\n    } catch (InterruptedException ex) {\n      Thread.currentThread().interrupt();\n      throw new InfrastructureException(\n          \"Interrupted while waiting for pod removal. \" + ex.getMessage());\n    } catch (ExecutionException ex) {\n      throw new InfrastructureException(\n          \"Error occurred while waiting for pod removal. \" + ex.getMessage());\n    } catch (TimeoutException ex) {\n      throw new InfrastructureException(\"Pod removal timeout reached \" + ex.getMessage());\n    }\n  }\n\n  /**\n   * Deletes all existing pods and the Deployments that control them.\n   *\n   * <p>Note that this method will mark Kubernetes pods as interrupted and then will wait until all\n   * pods will be killed.\n   *\n   * @throws InfrastructureException when {@link Thread} is interrupted while command executing\n   * @throws InfrastructureException when pods removal timeout is reached\n   * @throws InfrastructureException when any other exception occurs\n   */\n  public void delete() throws InfrastructureException {\n    try {\n      final List<CompletableFuture<Void>> deleteFutures = new ArrayList<>();\n      // We first delete all deployments, then clean up any bare Pods.\n      List<Deployment> deployments =\n          clientFactory\n              .create(workspaceId)\n              .apps()\n              .deployments()\n              .inNamespace(namespace)\n              .withLabel(CHE_WORKSPACE_ID_LABEL, workspaceId)\n              .list()\n              .getItems();\n      for (Deployment deployment : deployments) {\n        deleteFutures.add(doDeleteDeployment(deployment.getMetadata().getName()));\n      }\n      // We have to be careful to not include pods that are controlled by a deployment\n      List<Pod> pods =\n          clientFactory\n              .create(workspaceId)\n              .pods()\n              .inNamespace(namespace)\n              .withLabel(CHE_WORKSPACE_ID_LABEL, workspaceId)\n              .withoutLabel(CHE_DEPLOYMENT_NAME_LABEL)\n              .list()\n              .getItems();\n      for (Pod pod : pods) {\n        List<OwnerReference> ownerReferences = pod.getMetadata().getOwnerReferences();\n        if (ownerReferences == null || ownerReferences.isEmpty()) {\n          deleteFutures.add(doDeletePod(pod.getMetadata().getName()));\n        }\n      }\n      final CompletableFuture<Void> removed =\n          allOf(deleteFutures.toArray(new CompletableFuture[deleteFutures.size()]));\n      try {\n        removed.get(POD_REMOVAL_TIMEOUT_MIN, TimeUnit.MINUTES);\n      } catch (InterruptedException e) {\n        Thread.currentThread().interrupt();\n        throw new InfrastructureException(\n            \"Interrupted while waiting for pod removal. \" + e.getMessage());\n      } catch (ExecutionException e) {\n        throw new InfrastructureException(\n            \"Error occurred while waiting for pod removing. \" + e.getMessage());\n      } catch (TimeoutException ex) {\n        throw new InfrastructureException(\"Pods removal timeout reached \" + ex.getMessage());\n      }\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  protected CompletableFuture<Void> doDeleteDeployment(String deploymentName)\n      throws InfrastructureException {\n    // Try to get pod name if it exists (it may not, if e.g. workspace config refers to\n    // nonexistent service account).\n    String podName;\n    try {\n      podName = getPodName(deploymentName);\n    } catch (InfrastructureException e) {\n      // Not an error, just means the Deployment has failed to create a pod.\n      podName = null;\n    }\n\n    Watch toCloseOnException = null;\n    try {\n      ScalableResource<Deployment> deploymentResource =\n          clientFactory\n              .create(workspaceId)\n              .apps()\n              .deployments()\n              .inNamespace(namespace)\n              .withName(deploymentName);\n      if (deploymentResource.get() == null) {\n        throw new InfrastructureException(\n            format(\"No deployment found to delete for name %s\", deploymentName));\n      }\n\n      final CompletableFuture<Void> deleteFuture = new CompletableFuture<>();\n      final Watch watch;\n      // If we have a Pod, we have to watch to make sure it is deleted, otherwise, we watch the\n      // Deployment we are deleting.\n      if (!Strings.isNullOrEmpty(podName)) {\n        PodResource podResource =\n            clientFactory.create(workspaceId).pods().inNamespace(namespace).withName(podName);\n        watch = podResource.watch(new DeleteWatcher<>(deleteFuture));\n        toCloseOnException = watch;\n      } else {\n        watch = deploymentResource.watch(new DeleteWatcher<>(deleteFuture));\n        toCloseOnException = watch;\n      }\n\n      List<StatusDetails> deleted = deploymentResource.withPropagationPolicy(BACKGROUND).delete();\n\n      if (deleted == null || deleted.isEmpty()) {\n        deleteFuture.complete(null);\n      }\n      return deleteFuture.whenComplete(\n          (v, e) -> {\n            if (e != null) {\n              LOG.warn(\"Failed to remove deployment {} cause {}\", deploymentName, e.getMessage());\n            }\n            watch.close();\n          });\n    } catch (KubernetesClientException e) {\n      if (toCloseOnException != null) {\n        toCloseOnException.close();\n      }\n      throw new KubernetesInfrastructureException(e);\n    } catch (Exception e) {\n      if (toCloseOnException != null) {\n        toCloseOnException.close();\n      }\n      throw e;\n    }\n  }\n\n  protected CompletableFuture<Void> doDeletePod(String podName) throws InfrastructureException {\n    Watch toCloseOnException = null;\n    try {\n      PodResource podResource =\n          clientFactory.create(workspaceId).pods().inNamespace(namespace).withName(podName);\n      if (podResource.get() == null) {\n        throw new InfrastructureException(format(\"No pod found to delete for name %s\", podName));\n      }\n\n      final CompletableFuture<Void> deleteFuture = new CompletableFuture<>();\n      final Watch watch = podResource.watch(new DeleteWatcher<>(deleteFuture));\n      toCloseOnException = watch;\n\n      List<StatusDetails> deleted = podResource.withPropagationPolicy(BACKGROUND).delete();\n      if (deleted == null || deleted.isEmpty()) {\n        deleteFuture.complete(null);\n      }\n      return deleteFuture.whenComplete(\n          (v, e) -> {\n            if (e != null) {\n              LOG.warn(\"Failed to remove pod {} cause {}\", podName, e.getMessage());\n            }\n            watch.close();\n          });\n    } catch (KubernetesClientException e) {\n      if (toCloseOnException != null) {\n        toCloseOnException.close();\n      }\n      throw new KubernetesInfrastructureException(e);\n    } catch (Exception e) {\n      if (toCloseOnException != null) {\n        toCloseOnException.close();\n      }\n      throw e;\n    }\n  }\n\n  private String[] encode(String[] toEncode) throws InfrastructureException {\n    String[] encoded = new String[toEncode.length];\n    for (int i = 0; i < toEncode.length; i++) {\n      try {\n        encoded[i] = URLEncoder.encode(toEncode[i], \"UTF-8\");\n      } catch (UnsupportedEncodingException e) {\n        throw new InfrastructureException(e.getMessage(), e);\n      }\n    }\n    return encoded;\n  }\n\n  private Optional<Pod> findPod(String name) throws InfrastructureException {\n    Pod pod = clientFactory.create(workspaceId).pods().inNamespace(namespace).withName(name).get();\n    if (pod != null) {\n      return Optional.of(pod);\n    }\n    Deployment deployment =\n        clientFactory\n            .create(workspaceId)\n            .apps()\n            .deployments()\n            .inNamespace(namespace)\n            .withName(name)\n            .get();\n    if (deployment == null) {\n      return Optional.empty();\n    }\n    Map<String, String> selector = deployment.getSpec().getSelector().getMatchLabels();\n    List<Pod> pods =\n        clientFactory\n            .create(workspaceId)\n            .pods()\n            .inNamespace(namespace)\n            .withLabels(selector)\n            .list()\n            .getItems();\n    if (pods.isEmpty()) {\n      return Optional.empty();\n    } else if (pods.size() > 1) {\n      throw new InfrastructureException(format(\"Found multiple pods in Deployment '%s'\", name));\n    }\n\n    return Optional.of(pods.get(0));\n  }\n\n  /**\n   * Returns the name of a specified Pod given either the actual Pod name or the name of the\n   * Deployment that controls it. <br>\n   * This is necessary because we are trying to transparently wrap Pods in Deployment; attempting to\n   * create a Pod named {@code testPod} will result in a Deployment with name {@code testPod}, which\n   * will in turn create a Pod named e.g {@code testPod-1-xxxxx}.\n   *\n   * @param name Pod or Deployment name\n   * @return the name of the intended pod.\n   */\n  private String getPodName(String name) throws InfrastructureException {\n    Optional<Pod> pod = findPod(name);\n    if (pod.isPresent()) {\n      return pod.get().getMetadata().getName();\n    } else {\n      throw new InfrastructureException(format(\"Failed to find pod with name %s\", name));\n    }\n  }\n\n  private static class CreateWatcher implements Watcher<Pod> {\n\n    private final CompletableFuture<Pod> future;\n    private final String workspaceId;\n    private final String deploymentName;\n\n    private CreateWatcher(\n        CompletableFuture<Pod> future, String workspaceId, String deploymentName) {\n      this.future = future;\n      this.workspaceId = workspaceId;\n      this.deploymentName = deploymentName;\n    }\n\n    @Override\n    public void eventReceived(Action action, Pod resource) {\n      if (action == Action.ADDED) {\n        future.complete(resource);\n      }\n    }\n\n    @Override\n    public void onClose(WatcherException cause) {\n      future.completeExceptionally(\n          new RuntimeException(\"Websocket connection closed before Pod creation event received\"));\n    }\n  }\n\n  private static class DeleteWatcher<T> implements Watcher<T> {\n\n    private final CompletableFuture<Void> future;\n\n    private DeleteWatcher(CompletableFuture<Void> future) {\n      this.future = future;\n    }\n\n    @Override\n    public void eventReceived(Action action, T hasMetadata) {\n      if (action == Action.DELETED) {\n        future.complete(null);\n      }\n    }\n\n    @Override\n    public void onClose(WatcherException e) {\n      // if event about removing is received then this completion has no effect\n      future.completeExceptionally(\n          new RuntimeException(\n              \"Websocket connection is closed. But event about removing is not received.\", e));\n    }\n  }\n\n  private class ExecWatchdog implements ExecListener {\n\n    private final CompletableFuture<Void> completionFuture;\n\n    private ExecWatchdog() {\n      this.completionFuture = new CompletableFuture<>();\n    }\n\n    @Override\n    public void onFailure(Throwable t, Response response) {\n      completionFuture.completeExceptionally(t);\n    }\n\n    @Override\n    public void onClose(int code, String reason) {\n      completionFuture.complete(null);\n    }\n\n    public void wait(long timeout, TimeUnit timeUnit)\n        throws InterruptedException, InfrastructureException {\n      try {\n        completionFuture.get(timeout, timeUnit);\n      } catch (ExecutionException e) {\n        throw new InfrastructureException(\n            \"Error occured while executing command in pod: \" + e.getMessage(), e);\n      } catch (TimeoutException e) {\n        throw new InfrastructureException(\"Timeout reached while execution of command\");\n      }\n    }\n  }\n\n  @VisibleForTesting\n  void addPullSecretsOfSA(Deployment deployment) throws InfrastructureException {\n    final PodSpec podSpec = deployment.getSpec().getTemplate().getSpec();\n    final String podServiceAccountName = podSpec.getServiceAccountName();\n    if (podServiceAccountName == null) {\n      return;\n    }\n    ServiceAccount podServiceAccount =\n        clientFactory\n            .create(workspaceId)\n            .serviceAccounts()\n            .inNamespace(namespace)\n            .withName(podServiceAccountName)\n            .get();\n    if (podServiceAccount == null) {\n      return;\n    }\n    Set<LocalObjectReference> uniquePullSecrets = new HashSet<>();\n    if (podSpec.getImagePullSecrets() != null) {\n      uniquePullSecrets.addAll(podSpec.getImagePullSecrets());\n    }\n    if (podServiceAccount.getImagePullSecrets() != null) {\n      uniquePullSecrets.addAll(podServiceAccount.getImagePullSecrets());\n    }\n    podSpec.setImagePullSecrets(new ArrayList<>(uniquePullSecrets));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesIngresses.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static io.fabric8.kubernetes.api.model.DeletionPropagation.BACKGROUND;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_WORKSPACE_ID_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putLabel;\n\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.kubernetes.client.Watch;\nimport io.fabric8.kubernetes.client.Watcher;\nimport io.fabric8.kubernetes.client.WatcherException;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport java.util.List;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\nimport java.util.function.Predicate;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructureException;\n\n/**\n * Defines an internal API for managing {@link Ingress} instances in {@link\n * KubernetesIngresses#namespace predefined namespace}.\n *\n * @author Sergii Leshchenko\n * @author Guy Daich\n */\npublic class KubernetesIngresses {\n\n  private final String namespace;\n  private final String workspaceId;\n  private final KubernetesClientFactory clientFactory;\n\n  KubernetesIngresses(String namespace, String workspaceId, KubernetesClientFactory clientFactory) {\n    this.namespace = namespace;\n    this.workspaceId = workspaceId;\n    this.clientFactory = clientFactory;\n  }\n\n  public Ingress create(Ingress ingress) throws InfrastructureException {\n    putLabel(ingress, CHE_WORKSPACE_ID_LABEL, workspaceId);\n    try {\n      return clientFactory\n          .create(workspaceId)\n          .network()\n          .v1()\n          .ingresses()\n          .inNamespace(namespace)\n          .withName(ingress.getMetadata().getName())\n          .create(ingress);\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  public List<Ingress> get() throws InfrastructureException {\n    try {\n      return clientFactory\n          .create(workspaceId)\n          .network()\n          .v1()\n          .ingresses()\n          .inNamespace(namespace)\n          .withLabel(CHE_WORKSPACE_ID_LABEL, workspaceId)\n          .list()\n          .getItems();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  public Ingress wait(String name, long timeout, TimeUnit timeoutUnit, Predicate<Ingress> predicate)\n      throws InfrastructureException {\n    CompletableFuture<Ingress> future = new CompletableFuture<>();\n    Watch watch = null;\n    try {\n      Resource<Ingress> ingressResource =\n          clientFactory\n              .create(workspaceId)\n              .network()\n              .v1()\n              .ingresses()\n              .inNamespace(namespace)\n              .withName(name);\n\n      watch =\n          ingressResource.watch(\n              new Watcher<>() {\n                @Override\n                public void eventReceived(Action action, Ingress ingress) {\n                  if (predicate.test(ingress)) {\n                    future.complete(ingress);\n                  }\n                }\n\n                @Override\n                public void onClose(WatcherException cause) {\n                  future.completeExceptionally(\n                      new InfrastructureException(\n                          \"Waiting for ingress '\" + name + \"' was interrupted\"));\n                }\n              });\n\n      Ingress actualIngress = ingressResource.get();\n      if (actualIngress == null) {\n        throw new InfrastructureException(\"Specified ingress \" + name + \" doesn't exist\");\n      }\n      if (predicate.test(actualIngress)) {\n        return actualIngress;\n      }\n      try {\n        return future.get(timeout, timeoutUnit);\n      } catch (ExecutionException e) {\n        throw new InfrastructureException(e.getCause().getMessage(), e);\n      } catch (TimeoutException e) {\n        throw new InfrastructureException(\"Waiting for ingress '\" + name + \"' reached timeout\");\n      } catch (InterruptedException e) {\n        Thread.currentThread().interrupt();\n        throw new InfrastructureException(\"Waiting for ingress '\" + name + \"' was interrupted\");\n      }\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    } finally {\n      if (watch != null) {\n        watch.close();\n      }\n    }\n  }\n\n  public void delete() throws InfrastructureException {\n    try {\n      clientFactory\n          .create(workspaceId)\n          .network()\n          .v1()\n          .ingresses()\n          .inNamespace(namespace)\n          .withLabel(CHE_WORKSPACE_ID_LABEL, workspaceId)\n          .withPropagationPolicy(BACKGROUND)\n          .delete();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesNamespace.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static io.fabric8.kubernetes.api.model.DeletionPropagation.BACKGROUND;\nimport static java.lang.String.format;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.Namespace;\nimport io.fabric8.kubernetes.api.model.NamespaceBuilder;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaim;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServiceAccount;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.kubernetes.client.Watch;\nimport io.fabric8.kubernetes.client.Watcher;\nimport io.fabric8.kubernetes.client.WatcherException;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.Executor;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\nimport java.util.function.Predicate;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructureException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Defines an internal API for managing subset of objects inside {@link Namespace} instance.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesNamespace {\n\n  private static final Logger LOG = LoggerFactory.getLogger(KubernetesNamespace.class);\n\n  /** An experimental value used to determine how long to wait for the 'default' service account. */\n  private static final int SERVICE_ACCOUNT_READINESS_TIMEOUT_SEC = 3;\n\n  /**\n   * Default service account is used to get access to the API server so we need to be sure that it\n   * is accessible, more detailed information about service accounts by default you can find here:\n   * https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\n   */\n  private static final String DEFAULT_SERVICE_ACCOUNT_NAME = \"default\";\n\n  protected static final String MANAGED_NAMESPACE_LABEL = \"che-managed\";\n\n  private final String workspaceId;\n  private final String name;\n\n  private final KubernetesDeployments deployments;\n  private final KubernetesServices services;\n  private final KubernetesPersistentVolumeClaims pvcs;\n  private final KubernetesIngresses ingresses;\n\n  /** Factory for cluster related operations clients (like labeling the namespaces) */\n  private final CheServerKubernetesClientFactory cheSAClientFactory;\n\n  private final KubernetesSecrets secrets;\n  private final KubernetesConfigsMaps configMaps;\n\n  @VisibleForTesting\n  protected KubernetesNamespace(\n      CheServerKubernetesClientFactory cheSAClientFactory,\n      String workspaceId,\n      String name,\n      KubernetesDeployments deployments,\n      KubernetesServices services,\n      KubernetesPersistentVolumeClaims pvcs,\n      KubernetesIngresses kubernetesIngresses,\n      KubernetesSecrets secrets,\n      KubernetesConfigsMaps configMaps) {\n    this.cheSAClientFactory = cheSAClientFactory;\n    this.workspaceId = workspaceId;\n    this.name = name;\n    this.deployments = deployments;\n    this.services = services;\n    this.pvcs = pvcs;\n    this.ingresses = kubernetesIngresses;\n    this.secrets = secrets;\n    this.configMaps = configMaps;\n  }\n\n  public KubernetesNamespace(\n      CheServerKubernetesClientFactory cheSAClientFactory,\n      Executor executor,\n      String name,\n      String workspaceId) {\n    this.cheSAClientFactory = cheSAClientFactory;\n    this.workspaceId = workspaceId;\n    this.name = name;\n    this.deployments = new KubernetesDeployments(name, workspaceId, cheSAClientFactory, executor);\n    this.services = new KubernetesServices(name, workspaceId, cheSAClientFactory);\n    this.pvcs = new KubernetesPersistentVolumeClaims(name, workspaceId, cheSAClientFactory);\n    this.ingresses = new KubernetesIngresses(name, workspaceId, cheSAClientFactory);\n    this.secrets = new KubernetesSecrets(name, workspaceId, cheSAClientFactory);\n    this.configMaps = new KubernetesConfigsMaps(name, workspaceId, cheSAClientFactory);\n  }\n\n  /**\n   * Prepare namespace for using.\n   *\n   * <p>Preparing includes creating if needed and waiting for default service account.\n   *\n   * <p>The method will try to label the namespace with provided `labels`. It does not matter if the\n   * namespace already exists or we create new one. If update labels operation fail due to lack of\n   * permission, we do not fail completely.\n   *\n   * <p>The method will try to annotate the namespace with provided `annotations`. It does not\n   * matter if the namespace already exists or we create new one. If update annotations operation\n   * fail due to lack of permission, we do not fail completely.\n   *\n   * @param canCreate defines what to do when the namespace is not found. The namespace is created\n   *     when {@code true}, otherwise an exception is thrown.\n   * @param labels labels that should be set to the namespace\n   * @param annotations annotations that should be set to the namespace\n   * @throws InfrastructureException if any exception occurs during namespace preparation or if the\n   *     namespace doesn't exist and {@code canCreate} is {@code false}.\n   */\n  void prepare(boolean canCreate, Map<String, String> labels, Map<String, String> annotations)\n      throws InfrastructureException {\n    KubernetesClient client = cheSAClientFactory.create(workspaceId);\n    Namespace namespace = get(name, client);\n\n    if (namespace == null) {\n      if (!canCreate) {\n        throw new InfrastructureException(\n            format(\"Creating the namespace '%s' is not allowed, yet it was not found.\", name));\n      }\n      create(name, client);\n    }\n    label(client.namespaces().withName(name).get(), labels);\n    annotate(client.namespaces().withName(name).get(), annotations);\n  }\n\n  /**\n   * Applies given `ensureLabels` into given `namespace` and update the `namespace` in the\n   * Kubernetes.\n   *\n   * <p>If we do not have permissions to do so (code=403), this method does not throw any exception.\n   *\n   * @param namespace namespace to label\n   * @param ensureLabels these labels should be applied on given `namespace`\n   * @throws InfrastructureException if something goes wrong with update, except lack of permissions\n   */\n  protected void label(Namespace namespace, Map<String, String> ensureLabels)\n      throws InfrastructureException {\n    if (ensureLabels.isEmpty()) {\n      return;\n    }\n    Map<String, String> currentLabels = namespace.getMetadata().getLabels();\n    Map<String, String> newLabels =\n        currentLabels != null ? new HashMap<>(currentLabels) : new HashMap<>();\n\n    if (newLabels.entrySet().containsAll(ensureLabels.entrySet())) {\n      LOG.debug(\n          \"Nothing to do, namespace [{}] already has all required labels.\",\n          namespace.getMetadata().getName());\n      return;\n    }\n\n    try {\n      // update the namespace with new labels\n      cheSAClientFactory\n          .create()\n          .namespaces()\n          .createOrReplace(\n              new NamespaceBuilder(namespace)\n                  .editMetadata()\n                  .addToLabels(ensureLabels)\n                  .endMetadata()\n                  .build());\n    } catch (KubernetesClientException kce) {\n      if (kce.getCode() == 403) {\n        LOG.warn(\n            \"Can't label the namespace due to lack of permissions. Grant cluster-wide permissions \"\n                + \"to `get` and `update` the `namespaces` to the `che` service account \"\n                + \"(Che operator might have already prepared a cluster role called \"\n                + \"`che-namespace-editor` for this, depending on its configuration). \"\n                + \"Alternatively, consider disabling the feature by setting \"\n                + \"`che.infra.kubernetes.namepsace.label` to `false`.\");\n        return;\n      }\n      throw new InfrastructureException(kce);\n    }\n  }\n\n  /**\n   * Applies given `ensureAnnotations` into given `namespace` and update the `namespace` in the\n   * Kubernetes.\n   *\n   * <p>If we do not have permissions to do so (code=403), this method does not throw any exception.\n   *\n   * @param namespace namespace to annotate\n   * @param ensureAnnotations these annotations should be applied on given `namespace`\n   * @throws InfrastructureException if something goes wrong with update, except lack of permissions\n   */\n  protected void annotate(Namespace namespace, Map<String, String> ensureAnnotations)\n      throws InfrastructureException {\n    if (ensureAnnotations.isEmpty()) {\n      return;\n    }\n    Map<String, String> currentAnnotations = namespace.getMetadata().getAnnotations();\n    Map<String, String> newAnnotations =\n        currentAnnotations != null ? new HashMap<>(currentAnnotations) : new HashMap<>();\n\n    if (newAnnotations.entrySet().containsAll(ensureAnnotations.entrySet())) {\n      LOG.debug(\n          \"Nothing to do, namespace [{}] already has all required annotations.\",\n          namespace.getMetadata().getName());\n      return;\n    }\n\n    try {\n      // update the namespace with new annotations\n      cheSAClientFactory\n          .create()\n          .namespaces()\n          .createOrReplace(\n              new NamespaceBuilder(namespace)\n                  .editMetadata()\n                  .addToAnnotations(ensureAnnotations)\n                  .endMetadata()\n                  .build());\n    } catch (KubernetesClientException kce) {\n      if (kce.getCode() == 403) {\n        LOG.warn(\n            \"Can't annotate the namespace due to lack of permissions. Grant cluster-wide permissions \"\n                + \"to `get` and `update` the `namespaces` to the `che` service account \"\n                + \"(Che operator might have already prepared a cluster role called \"\n                + \"`che-namespace-editor` for this, depending on its configuration). \"\n                + \"Alternatively, consider disabling the feature by setting \"\n                + \"`che.infra.kubernetes.namepsace.annotate` to `false`.\");\n        return;\n      }\n      throw new InfrastructureException(kce);\n    }\n  }\n\n  /**\n   * Deletes the namespace. Deleting a non-existent namespace is not an error as is not an attempt\n   * to delete a namespace that is already being deleted.\n   *\n   * @throws InfrastructureException if any unexpected exception occurs during namespace deletion\n   */\n  void delete() throws InfrastructureException {\n    KubernetesClient client = cheSAClientFactory.create(workspaceId);\n\n    try {\n      delete(name, client);\n    } catch (KubernetesClientException e) {\n      if (e.getCode() == 403) {\n        throw new InfrastructureException(\n            format(\n                \"Could not access the namespace %s when deleting it for workspace %s\",\n                name, workspaceId),\n            e);\n      }\n\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /** Returns namespace name */\n  public String getName() {\n    return name;\n  }\n\n  /** Returns identifier of the workspace for which current namespace is used */\n  public String getWorkspaceId() {\n    return workspaceId;\n  }\n\n  /** Returns object for managing {@link Pod} instances inside namespace. */\n  public KubernetesDeployments deployments() {\n    return deployments;\n  }\n\n  /** Returns object for managing {@link Service} instances inside namespace. */\n  public KubernetesServices services() {\n    return services;\n  }\n\n  /** Returns object for managing {@link PersistentVolumeClaim} instances inside namespace. */\n  public KubernetesPersistentVolumeClaims persistentVolumeClaims() {\n    return pvcs;\n  }\n\n  /** Returns object for managing {@link Ingress} instances inside namespace. */\n  public KubernetesIngresses ingresses() {\n    return ingresses;\n  }\n\n  /** Returns object for managing {@link Secret} instances inside namespace. */\n  public KubernetesSecrets secrets() {\n    return secrets;\n  }\n\n  /** Returns object for managing {@link ConfigMap} instances inside namespace. */\n  public KubernetesConfigsMaps configMaps() {\n    return configMaps;\n  }\n\n  /** Removes all object except persistent volume claims inside namespace. */\n  public void cleanUp() throws InfrastructureException {\n    doRemove(\n        ingresses::delete,\n        services::delete,\n        deployments::delete,\n        secrets::delete,\n        configMaps::delete);\n  }\n\n  /**\n   * Performs all the specified operations and throw exception with composite message if errors\n   * occurred while any operation execution\n   */\n  protected void doRemove(RemoveOperation... operations) throws InfrastructureException {\n    StringBuilder errors = new StringBuilder();\n    for (RemoveOperation operation : operations) {\n      try {\n        operation.perform();\n      } catch (InternalInfrastructureException e) {\n        LOG.warn(\n            \"Internal infra error occurred while cleaning up the namespace for workspace with id \"\n                + workspaceId,\n            e);\n        errors.append(\" \").append(e.getMessage());\n      } catch (InfrastructureException e) {\n        errors.append(\" \").append(e.getMessage());\n      }\n    }\n\n    if (errors.length() > 0) {\n      throw new InfrastructureException(\n          \"Error(s) occurs while cleaning up the namespace.\" + errors.toString());\n    }\n  }\n\n  private Namespace create(String namespaceName, KubernetesClient client)\n      throws InfrastructureException {\n    try {\n      Namespace namespace =\n          client\n              .namespaces()\n              .create(\n                  new NamespaceBuilder()\n                      .withNewMetadata()\n                      .withName(namespaceName)\n                      .endMetadata()\n                      .build());\n      waitDefaultServiceAccount(namespaceName, client);\n      return namespace;\n    } catch (KubernetesClientException e) {\n      if (e.getCode() == 403) {\n        LOG.error(\n            \"Unable to create new Kubernetes project due to lack of permissions.\"\n                + \"When using workspace namespace placeholders, service account with lenient permissions (cluster-admin) must be used.\");\n      }\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  private void delete(String namespaceName, KubernetesClient client)\n      throws InfrastructureException {\n    try {\n      client.namespaces().withName(namespaceName).withPropagationPolicy(BACKGROUND).delete();\n    } catch (KubernetesClientException e) {\n      if (e.getCode() == 404) {\n        LOG.warn(\n            format(\n                \"Tried to delete namespace '%s' but it doesn't exist in the cluster.\",\n                namespaceName),\n            e);\n      } else if (e.getCode() == 409) {\n        LOG.info(format(\"The namespace '%s' is currently being deleted.\", namespaceName), e);\n      } else {\n        throw new KubernetesInfrastructureException(e);\n      }\n    }\n  }\n\n  /**\n   * Waits few seconds until 'default' service account become available otherwise an infrastructure\n   * exception will be thrown.\n   */\n  protected void waitDefaultServiceAccount(String namespaceName, KubernetesClient client)\n      throws InfrastructureException {\n    final Predicate<ServiceAccount> predicate = Objects::nonNull;\n    final CompletableFuture<ServiceAccount> future = new CompletableFuture<>();\n    Watch watch = null;\n    try {\n      final Resource<ServiceAccount> saResource =\n          client\n              .serviceAccounts()\n              .inNamespace(namespaceName)\n              .withName(DEFAULT_SERVICE_ACCOUNT_NAME);\n      watch =\n          saResource.watch(\n              new Watcher<>() {\n                @Override\n                public void eventReceived(Action action, ServiceAccount serviceAccount) {\n                  if (predicate.test(serviceAccount)) {\n                    future.complete(serviceAccount);\n                  }\n                }\n\n                @Override\n                public void onClose(WatcherException cause) {\n                  future.completeExceptionally(\n                      new InfrastructureException(\n                          \"Waiting for service account '\"\n                              + DEFAULT_SERVICE_ACCOUNT_NAME\n                              + \"' was interrupted\"));\n                }\n              });\n      if (predicate.test(saResource.get())) {\n        return;\n      }\n      try {\n        future.get(SERVICE_ACCOUNT_READINESS_TIMEOUT_SEC, TimeUnit.SECONDS);\n      } catch (ExecutionException ex) {\n        throw new InfrastructureException(ex.getCause().getMessage(), ex);\n      } catch (TimeoutException ex) {\n        throw new InfrastructureException(\n            \"Waiting for service account '\" + DEFAULT_SERVICE_ACCOUNT_NAME + \"' reached timeout\");\n      } catch (InterruptedException ex) {\n        Thread.currentThread().interrupt();\n        throw new InfrastructureException(\n            \"Waiting for service account '\" + DEFAULT_SERVICE_ACCOUNT_NAME + \"' was interrupted\");\n      }\n    } catch (KubernetesClientException ex) {\n      throw new KubernetesInfrastructureException(ex);\n    } finally {\n      if (watch != null) {\n        watch.close();\n      }\n    }\n  }\n\n  private Namespace get(String namespaceName, KubernetesClient client)\n      throws InfrastructureException {\n    try {\n      return client.namespaces().withName(namespaceName).get();\n    } catch (KubernetesClientException e) {\n      if (e.getCode() == 403) {\n        // namespace is foreign or doesn't exist\n        LOG.warn(\n            \"Trying to get namespace '{}', but failed because the lack of permissions.\",\n            namespaceName);\n        return null;\n      } else {\n        throw new KubernetesInfrastructureException(e);\n      }\n    }\n  }\n\n  protected interface RemoveOperation {\n\n    void perform() throws InfrastructureException;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesNamespaceFactory.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.api.workspace.shared.Constants.WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta.DEFAULT_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta.PHASE_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.NamespaceNameValidator.METADATA_NAME_MAX_LENGTH;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.common.base.Joiner;\nimport com.google.common.base.Splitter;\nimport com.google.common.collect.ImmutableSet;\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.Namespace;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.Workspace;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.user.server.PreferenceManager;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.inject.ConfigurationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.server.impls.KubernetesNamespaceMetaImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.AuthorizationChecker;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.AuthorizationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.PermissionsCleaner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.NamespaceConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.KubernetesSharedPool;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Helps to create {@link KubernetesNamespace} instances.\n *\n * @author Anton Korneta\n */\n@Singleton\npublic class KubernetesNamespaceFactory {\n\n  private static final Logger LOG = LoggerFactory.getLogger(KubernetesNamespaceFactory.class);\n\n  private static final Map<String, Function<NamespaceResolutionContext, String>>\n      NAMESPACE_NAME_PLACEHOLDERS = new HashMap<>();\n  private static final Set<String> REQUIRED_NAMESPACE_NAME_PLACEHOLDERS = new HashSet<>();\n  private static final String USERNAME_PLACEHOLDER = \"<username>\";\n  private static final String USERID_PLACEHOLDER = \"<userid>\";\n\n  static final String NAMESPACE_TEMPLATE_ATTRIBUTE = \"infrastructureNamespaceTemplate\";\n\n  static {\n    NAMESPACE_NAME_PLACEHOLDERS.put(USERNAME_PLACEHOLDER, NamespaceResolutionContext::getUserName);\n    NAMESPACE_NAME_PLACEHOLDERS.put(USERID_PLACEHOLDER, NamespaceResolutionContext::getUserId);\n    REQUIRED_NAMESPACE_NAME_PLACEHOLDERS.add(USERNAME_PLACEHOLDER);\n    REQUIRED_NAMESPACE_NAME_PLACEHOLDERS.add(USERID_PLACEHOLDER);\n  }\n\n  private final String defaultNamespaceName;\n  protected final boolean labelNamespaces;\n  protected final boolean annotateNamespaces;\n  protected final Map<String, String> namespaceLabels;\n  protected final Map<String, String> namespaceAnnotations;\n\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  private final boolean namespaceCreationAllowed;\n  private final PreferenceManager preferenceManager;\n  protected final Set<NamespaceConfigurator> namespaceConfigurators;\n  protected final KubernetesSharedPool sharedPool;\n  protected final AuthorizationChecker authorizationChecker;\n  protected final PermissionsCleaner permissionsCleaner;\n\n  @Inject\n  public KubernetesNamespaceFactory(\n      @Nullable @Named(\"che.infra.kubernetes.namespace.default\") String defaultNamespaceName,\n      @Named(\"che.infra.kubernetes.namespace.creation_allowed\") boolean namespaceCreationAllowed,\n      @Named(\"che.infra.kubernetes.namespace.label\") boolean labelNamespaces,\n      @Named(\"che.infra.kubernetes.namespace.annotate\") boolean annotateNamespaces,\n      @Named(\"che.infra.kubernetes.namespace.labels\") String namespaceLabels,\n      @Named(\"che.infra.kubernetes.namespace.annotations\") String namespaceAnnotations,\n      Set<NamespaceConfigurator> namespaceConfigurators,\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory,\n      PreferenceManager preferenceManager,\n      KubernetesSharedPool sharedPool,\n      AuthorizationChecker authorizationChecker,\n      PermissionsCleaner permissionsCleaner)\n      throws ConfigurationException {\n    this.namespaceCreationAllowed = namespaceCreationAllowed;\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n    this.defaultNamespaceName = defaultNamespaceName;\n    this.preferenceManager = preferenceManager;\n    this.sharedPool = sharedPool;\n    this.labelNamespaces = labelNamespaces;\n    this.annotateNamespaces = annotateNamespaces;\n    this.namespaceConfigurators = ImmutableSet.copyOf(namespaceConfigurators);\n    this.authorizationChecker = authorizationChecker;\n    this.permissionsCleaner = permissionsCleaner;\n\n    //noinspection UnstableApiUsage\n    Splitter.MapSplitter csvMapSplitter = Splitter.on(\",\").withKeyValueSeparator(\"=\");\n    //noinspection UnstableApiUsage\n    this.namespaceLabels =\n        isNullOrEmpty(namespaceLabels) ? emptyMap() : csvMapSplitter.split(namespaceLabels);\n    //noinspection UnstableApiUsage\n    this.namespaceAnnotations =\n        isNullOrEmpty(namespaceAnnotations)\n            ? emptyMap()\n            : csvMapSplitter.split(namespaceAnnotations);\n\n    if (isNullOrEmpty(defaultNamespaceName)) {\n      throw new ConfigurationException(\"che.infra.kubernetes.namespace.default must be configured\");\n    } else if (REQUIRED_NAMESPACE_NAME_PLACEHOLDERS.stream()\n        .noneMatch(defaultNamespaceName::contains)) {\n      throw new ConfigurationException(\n          format(\n              \"Only 'per user' is allowed.\"\n                  + \"Using the %s placeholder is required in the 'che.infra.kubernetes.namespace.default' parameter.\"\n                  + \" The current value is: `%s`.\",\n              Joiner.on(\" or \").join(REQUIRED_NAMESPACE_NAME_PLACEHOLDERS), defaultNamespaceName));\n    }\n  }\n\n  /**\n   * Creates a Kubernetes namespace for the specified workspace.\n   *\n   * <p>Namespace won't be prepared. This method should be used only in case workspace recovering.\n   *\n   * @param workspaceId identifier of the workspace\n   * @return created namespace\n   */\n  public KubernetesNamespace access(String workspaceId, String namespace) {\n    return doCreateNamespaceAccess(workspaceId, namespace);\n  }\n\n  @VisibleForTesting\n  KubernetesNamespace doCreateNamespaceAccess(String workspaceId, String name) {\n    return new KubernetesNamespace(\n        cheServerKubernetesClientFactory, sharedPool.getExecutor(), name, workspaceId);\n  }\n\n  /**\n   * Checks if the current user is able to use the specified namespace for their new workspaces.\n   *\n   * @param namespaceName namespace name to check\n   * @throws ValidationException if the specified namespace is not permitted for the current user\n   */\n  public void checkIfNamespaceIsAllowed(String namespaceName) throws ValidationException {\n    NamespaceResolutionContext context =\n        new NamespaceResolutionContext(EnvironmentContext.getCurrent().getSubject());\n    final String defaultNamespace =\n        findStoredNamespace(context).orElse(evalPlaceholders(defaultNamespaceName, context));\n    if (!namespaceName.equals(defaultNamespace)) {\n      try {\n        List<KubernetesNamespaceMeta> labeledNamespaces = findPreparedNamespaces(context);\n        if (labeledNamespaces.stream().noneMatch(n -> n.getName().equals(namespaceName))) {\n          throw new ValidationException(\n              format(\n                  \"User defined namespaces are not allowed. Only the default namespace '%s' is available.\",\n                  defaultNamespace));\n        }\n      } catch (InfrastructureException e) {\n        throw new ValidationException(\"Some infrastructure failure caused failed validation.\", e);\n      }\n    }\n  }\n\n  /** Returns list of k8s namespaces names where a user is able to run workspaces. */\n  public List<KubernetesNamespaceMeta> list() throws InfrastructureException {\n\n    NamespaceResolutionContext resolutionCtx =\n        new NamespaceResolutionContext(EnvironmentContext.getCurrent().getSubject());\n\n    List<KubernetesNamespaceMeta> labeledNamespaces = findPreparedNamespaces(resolutionCtx);\n    if (!labeledNamespaces.isEmpty()) {\n      return labeledNamespaces;\n    } else {\n      return singletonList(getDefaultNamespace(resolutionCtx));\n    }\n  }\n\n  /**\n   * Returns default namespace, it's based on existing namespace if there is such or just object\n   * holder if there is no such namespace on cluster.\n   */\n  private KubernetesNamespaceMeta getDefaultNamespace(NamespaceResolutionContext resolutionCtx)\n      throws InfrastructureException {\n    String evaluatedName = evaluateNamespaceName(resolutionCtx);\n\n    Optional<KubernetesNamespaceMeta> defaultNamespaceOpt = fetchNamespace(evaluatedName);\n\n    KubernetesNamespaceMeta defaultNamespace =\n        defaultNamespaceOpt\n            // if the predefined namespace does not exist - return dummy info and it will be created\n            // during the first workspace start\n            .orElseGet(() -> new KubernetesNamespaceMetaImpl(evaluatedName));\n\n    defaultNamespace.getAttributes().put(DEFAULT_ATTRIBUTE, \"true\");\n    return defaultNamespace;\n  }\n\n  /**\n   * Fetches the specified namespace from a cluster.\n   *\n   * @param name name of namespace that should be fetched.\n   * @return optional with kubernetes namespace meta\n   * @throws InfrastructureException when any error occurs during namespace fetching\n   */\n  public Optional<KubernetesNamespaceMeta> fetchNamespace(String name)\n      throws InfrastructureException {\n    try {\n      Namespace namespace =\n          cheServerKubernetesClientFactory.create().namespaces().withName(name).get();\n      if (namespace == null) {\n        return Optional.empty();\n      } else {\n        return Optional.of(asNamespaceMeta(namespace));\n      }\n    } catch (KubernetesClientException e) {\n      throw new InfrastructureException(\n          \"Error occurred when tried to fetch default namespace. Cause: \" + e.getMessage(), e);\n    }\n  }\n\n  private KubernetesNamespaceMeta asNamespaceMeta(Namespace namespace) {\n    Map<String, String> attributes = new HashMap<>(2);\n    if (namespace.getStatus() != null && namespace.getStatus().getPhase() != null) {\n      attributes.put(PHASE_ATTRIBUTE, namespace.getStatus().getPhase());\n    }\n    return new KubernetesNamespaceMetaImpl(namespace.getMetadata().getName(), attributes);\n  }\n\n  /**\n   * Tells the caller whether the namespace that is being prepared for the provided workspace\n   * runtime identity can be created or is expected to already be present.\n   *\n   * @return true if the namespace can be created, false if the namespace is expected to already\n   *     exist\n   */\n  protected boolean canCreateNamespace() {\n    return namespaceCreationAllowed;\n  }\n\n  /**\n   * A managed namespace of a workspace is a namespace that is fully controlled by Che. Such\n   * namespaces are deleted when the workspace is deleted.\n   *\n   * @param namespaceName the name of the namespace the workspace is stored in\n   * @param workspace the workspace\n   */\n  protected boolean isWorkspaceNamespaceManaged(String namespaceName, Workspace workspace) {\n    return namespaceName != null && namespaceName.contains(workspace.getId());\n  }\n\n  public KubernetesNamespace getOrCreate(RuntimeIdentity identity) throws InfrastructureException {\n    KubernetesNamespace namespace = get(identity);\n\n    var subject = EnvironmentContext.getCurrent().getSubject();\n    var userName = subject.getUserName();\n\n    validateAuthorization(namespace.getName(), subject);\n\n    NamespaceResolutionContext resolutionCtx =\n        new NamespaceResolutionContext(identity.getWorkspaceId(), subject.getUserId(), userName);\n    Map<String, String> namespaceAnnotationsEvaluated =\n        evaluateAnnotationPlaceholders(resolutionCtx);\n\n    namespace.prepare(\n        canCreateNamespace(),\n        labelNamespaces ? namespaceLabels : emptyMap(),\n        annotateNamespaces ? namespaceAnnotationsEvaluated : emptyMap());\n\n    configureNamespace(resolutionCtx, namespace.getName());\n\n    return namespace;\n  }\n\n  public KubernetesNamespace get(RuntimeIdentity identity) throws InfrastructureException {\n    String workspaceId = identity.getWorkspaceId();\n    String namespaceName = identity.getInfrastructureNamespace();\n    return doCreateNamespaceAccess(workspaceId, namespaceName);\n  }\n\n  /** Gets a namespace the workspace is deployed to. */\n  public KubernetesNamespace get(Workspace workspace) throws InfrastructureException {\n    return doCreateNamespaceAccess(workspace.getId(), getNamespaceName(workspace));\n  }\n\n  /** Returns a namespace name where workspace is assigned to. */\n  protected String getNamespaceName(Workspace workspace) throws InfrastructureException {\n    String namespace = workspace.getAttributes().get(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE);\n    if (namespace == null) {\n      // it seems to be legacy workspace since the namespace is not stored in workspace attributes\n      // it's needed to evaluate that with current user and workspace id\n      NamespaceResolutionContext resolutionCtx =\n          new NamespaceResolutionContext(\n              workspace.getId(),\n              EnvironmentContext.getCurrent().getSubject().getUserId(),\n              EnvironmentContext.getCurrent().getSubject().getUserName());\n      namespace = evaluateNamespaceName(resolutionCtx);\n\n      LOG.warn(\n          \"Workspace '{}' doesn't have an explicit namespace assigned.\"\n              + \" The legacy namespace resolution resolved it to '{}'.\",\n          workspace.getId(),\n          namespace);\n    }\n\n    if (!NamespaceNameValidator.isValid(namespace)) {\n      // At a certain unfortunate past version of Che, we stored invalid namespace names.\n      // At this point in time, we're trying to work with an existing workspace that never could\n      // started OR has been running since before that unfortunate version. In both cases, going\n      // back to the default namespace name is the most safe bet we can make.\n\n      // but of course, our attempt will be futile if we're running in a context that doesn't know\n      // the current user.\n      Subject subj = EnvironmentContext.getCurrent().getSubject();\n      if (!subj.isAnonymous()) {\n        NamespaceResolutionContext resolutionCtx =\n            new NamespaceResolutionContext(workspace.getId(), subj.getUserId(), subj.getUserName());\n\n        String defaultNamespace = evaluateNamespaceName(resolutionCtx);\n\n        LOG.warn(\n            \"The namespace '{}' of the workspace '{}' is not valid. Trying to recover\"\n                + \" from this situation using a default namespace which resolved to '{}'.\",\n            namespace,\n            workspace.getId(),\n            defaultNamespace);\n\n        namespace = defaultNamespace;\n      } else {\n        // log a warning including a stacktrace to be able to figure out from where we got here...\n        LOG.warn(\n            \"The namespace '{}' of the workspace '{}' is not valid but we currently don't have\"\n                + \" an active user to try an recover from this situation. We're letting the parent\"\n                + \" workflow continue, but it may fail at some later point in time because of\"\n                + \" the incorrect namespace name in use.\",\n            namespace,\n            workspace.getId(),\n            new Throwable());\n      }\n\n      // ok, we tried to recover the namespace but nothing helped.\n    }\n\n    return namespace;\n  }\n\n  /**\n   * Evaluates namespace according to the specified context.\n   *\n   * <p>First we try to find namespace with labels set in `che.infra.kubernetes.namespace.labels`\n   * property. If any found, we take the first one and use it. See: {@link\n   * KubernetesNamespaceFactory#findFirstLabeledNamespace(NamespaceResolutionContext)}\n   *\n   * <p>Then we try to find namespace stored in persisted user's preferences and use it if found.\n   * See: {@link KubernetesNamespaceFactory#findStoredNamespace(NamespaceResolutionContext)}\n   *\n   * <p>As a last option, we construct namespace name from `che.infra.kubernetes.namespace.default`\n   * property. See: {@link\n   * KubernetesNamespaceFactory#evalDefaultNamespace(NamespaceResolutionContext)}\n   *\n   * @param resolutionCtx context for namespace evaluation\n   * @return evaluated namespace name\n   * @throws InfrastructureException when there legacy namespace doesn't exist and default namespace\n   *     is not configured\n   * @throws InfrastructureException when any exception occurs during evaluation\n   */\n  public String evaluateNamespaceName(NamespaceResolutionContext resolutionCtx)\n      throws InfrastructureException {\n    Optional<String> namespace =\n        findFirstLabeledNamespace(resolutionCtx).or(() -> findStoredNamespace(resolutionCtx));\n    if (namespace.isPresent()) {\n      return namespace.get();\n    } else {\n      return evalDefaultNamespace(resolutionCtx);\n    }\n  }\n\n  /**\n   * Finds first namespace matches labels set by `che.infra.kubernetes.namespace.labels` property.\n   *\n   * @return first found labeled namespace if such namespace exists\n   */\n  private Optional<String> findFirstLabeledNamespace(NamespaceResolutionContext resolutionCtx)\n      throws InfrastructureException {\n    List<KubernetesNamespaceMeta> labeledNamespaces = findPreparedNamespaces(resolutionCtx);\n    if (!labeledNamespaces.isEmpty()) {\n      String foundNamespace =\n          labeledNamespaces.stream()\n              .findFirst()\n              .map(KubernetesNamespaceMeta::getName)\n              .orElseThrow(\n                  () ->\n                      new InfrastructureException(\n                          \"Failed when fetching labeled namespaces. It should not happen. Please report a bug if you see this!\"));\n      if (labeledNamespaces.size() > 1) {\n        LOG.warn(\n            \"found '{}' matching labeled namespaces {}. Using '{}'.\",\n            labeledNamespaces.size(),\n            labeledNamespaces.toString(),\n            foundNamespace);\n      }\n      return Optional.of(foundNamespace);\n    } else {\n      return Optional.empty();\n    }\n  }\n\n  /**\n   * Finds namespace name stored in User's preferences and ensures it is still valid.\n   *\n   * @return user's stored namespace if exists\n   */\n  private Optional<String> findStoredNamespace(NamespaceResolutionContext resolutionCtx) {\n    Optional<Pair<String, String>> storedNamespace = getPreferencesNamespaceName(resolutionCtx);\n    if (storedNamespace.isPresent() && storedNamespace.get().second.equals(defaultNamespaceName)) {\n      return Optional.of(storedNamespace.get().first);\n    } else {\n      return Optional.empty();\n    }\n  }\n\n  /**\n   * Constructs the namespace name from `che.infra.kubernetes.namespace.default` property. Ensures\n   * that all placeholders are evaluated and final namespace name is in valid format.\n   *\n   * @return ready-to-use namespace name\n   */\n  private String evalDefaultNamespace(NamespaceResolutionContext resolutionCtx)\n      throws InfrastructureException {\n    String namespace = evalPlaceholders(defaultNamespaceName, resolutionCtx);\n\n    if (!NamespaceNameValidator.isValid(namespace)) {\n      Optional<KubernetesNamespaceMeta> namespaceMetaOptional;\n      String normalizedNamespace = normalizeNamespaceName(namespace);\n      if (normalizedNamespace.isEmpty()) {\n        throw new InfrastructureException(\n            format(\n                \"Evaluated empty namespace name for workspace %s\", resolutionCtx.getWorkspaceId()));\n      }\n      do {\n        normalizedNamespace =\n            normalizedNamespace\n                .substring(0, Math.min(55, normalizedNamespace.length()))\n                .concat(NameGenerator.generate(\"-\", 6));\n        namespaceMetaOptional = fetchNamespace(normalizedNamespace);\n      } while (namespaceMetaOptional.isPresent());\n      namespace = normalizedNamespace;\n    }\n\n    LOG.debug(\n        \"Evaluated the namespace for workspace {} using the namespace default to {}\",\n        resolutionCtx.getWorkspaceId(),\n        namespace);\n    return namespace;\n  }\n\n  /**\n   * Finds all namespaces that matches the labels configured in\n   * `che.infra.kubernetes.namespace.labels` and annotations in\n   * `che.infra.kubernetes.namespace.annotations` properties. Makes sure that placeholder in the\n   * annotations property are correctly evaluated.\n   *\n   * <p>If used ServiceAccount does not have permissions to list the namespaces, returns the empty\n   * list.\n   *\n   * @return namespaces that matches the configured labels and annotations\n   * @throws InfrastructureException in case of any Kubernetes request failure\n   */\n  protected List<KubernetesNamespaceMeta> findPreparedNamespaces(\n      NamespaceResolutionContext namespaceCtx) throws InfrastructureException {\n    try {\n      List<Namespace> workspaceNamespaces =\n          cheServerKubernetesClientFactory\n              .create()\n              .namespaces()\n              .withLabels(namespaceLabels)\n              .list()\n              .getItems();\n      if (!workspaceNamespaces.isEmpty()) {\n        Map<String, String> evaluatedAnnotations = evaluateAnnotationPlaceholders(namespaceCtx);\n        return workspaceNamespaces.stream()\n            .filter(p -> matchesAnnotations(p, evaluatedAnnotations))\n            .map(this::asNamespaceMeta)\n            .collect(Collectors.toList());\n      } else {\n        return emptyList();\n      }\n    } catch (KubernetesClientException kce) {\n      if (kce.getCode() == 403) {\n        LOG.warn(\n            \"Trying to fetch namespaces with labels '{}', but failed for lack of permissions. Cause: '{}'\",\n            namespaceLabels,\n            kce.getMessage());\n        return emptyList();\n      } else {\n        throw new InfrastructureException(\n            \"Error occurred when tried to list all available namespaces. Cause: \"\n                + kce.getMessage(),\n            kce);\n      }\n    }\n  }\n\n  protected void configureNamespace(\n      NamespaceResolutionContext namespaceResolutionContext, String namespaceName)\n      throws InfrastructureException {\n    for (NamespaceConfigurator configurator : namespaceConfigurators) {\n      configurator.configure(namespaceResolutionContext, namespaceName);\n    }\n  }\n\n  /**\n   * Evaluate placeholder in `che.infra.kubernetes.namespace.annotations` property with given {@link\n   * NamespaceResolutionContext}.\n   *\n   * @return evaluated labels\n   */\n  protected Map<String, String> evaluateAnnotationPlaceholders(\n      NamespaceResolutionContext namespaceCtx) {\n    Map<String, String> evaluatedAnnotations = new HashMap<>();\n    for (String annotationName : namespaceAnnotations.keySet()) {\n      String evaluatedAnnotationValue =\n          namespaceAnnotations\n              .get(annotationName)\n              .replace(USERNAME_PLACEHOLDER, namespaceCtx.getUserName());\n      evaluatedAnnotations.put(annotationName, evaluatedAnnotationValue);\n    }\n    return evaluatedAnnotations;\n  }\n\n  /**\n   * Checks if given `object` contains all given `annotations` with exact values.\n   *\n   * @param object to check\n   * @param annotations that given `object` has to contain\n   * @return true if `object` contains all `annotations`. False otherwise.\n   */\n  protected boolean matchesAnnotations(HasMetadata object, Map<String, String> annotations) {\n    if (object.getMetadata().getAnnotations() == null) {\n      return false;\n    }\n    return object.getMetadata().getAnnotations().entrySet().containsAll(annotations.entrySet());\n  }\n\n  public void deleteIfManaged(Workspace workspace) throws InfrastructureException {\n    KubernetesNamespace namespace = get(workspace);\n    if (isWorkspaceNamespaceManaged(namespace.getName(), workspace)) {\n      namespace.delete();\n    }\n  }\n\n  protected void validateAuthorization(String namespaceName, Subject subject)\n      throws InfrastructureException {\n    if (!authorizationChecker.isAuthorized(subject)) {\n      try {\n        permissionsCleaner.cleanUp(namespaceName);\n      } catch (InfrastructureException | KubernetesClientException e) {\n        LOG.error(\n            \"Failed to clean up permissions for user '{}' in namespace '{}'. Cause: {}\",\n            subject.getUserName(),\n            namespaceName,\n            e.getMessage(),\n            e);\n      }\n\n      throw new AuthorizationException(\n          format(\n              \"User '%s' is not authorized to create a project. Please contact your system administrator.\",\n              subject.getUserName()));\n    }\n  }\n\n  protected String evalPlaceholders(String namespace, NamespaceResolutionContext ctx) {\n    checkArgument(!isNullOrEmpty(namespace));\n    String evaluated = namespace;\n    for (Entry<String, Function<NamespaceResolutionContext, String>> placeHolder :\n        NAMESPACE_NAME_PLACEHOLDERS.entrySet()) {\n\n      String key = placeHolder.getKey();\n      String value = placeHolder.getValue().apply(ctx);\n\n      if (value != null) {\n        evaluated = evaluated.replaceAll(key, value);\n      }\n    }\n    return evaluated;\n  }\n\n  /**\n   * Stores computed namespace name and it's template into user preferences. Template is required to\n   * track its changes and re-generate namespace in case it didn't matches.\n   */\n  private void recordEvaluatedNamespaceName(String namespace, NamespaceResolutionContext context) {\n    try {\n      final String owner = context.getUserId();\n      Map<String, String> preferences = preferenceManager.find(owner);\n      preferences.put(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, namespace);\n      preferences.put(NAMESPACE_TEMPLATE_ATTRIBUTE, defaultNamespaceName);\n      preferenceManager.update(owner, preferences);\n    } catch (ServerException e) {\n      LOG.error(\"Failed storing namespace name in user properties.\", e);\n    }\n  }\n\n  /** Returns stored namespace if any, and its default template. */\n  private Optional<Pair<String, String>> getPreferencesNamespaceName(\n      NamespaceResolutionContext context) {\n    try {\n      String owner = context.getUserId();\n      Map<String, String> preferences = preferenceManager.find(owner);\n      if (preferences.containsKey(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE)\n          && preferences.containsKey(NAMESPACE_TEMPLATE_ATTRIBUTE)) {\n        return Optional.of(\n            Pair.of(\n                preferences.get(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE),\n                preferences.get(NAMESPACE_TEMPLATE_ATTRIBUTE)));\n      }\n    } catch (ServerException e) {\n      LOG.error(e.getMessage(), e);\n    }\n    return Optional.empty();\n  }\n\n  /**\n   * Normalizes input namespace name to K8S accepted format\n   *\n   * @param namespaceName input namespace name\n   * @return normalized namespace name\n   */\n  @VisibleForTesting\n  String normalizeNamespaceName(String namespaceName) {\n    namespaceName =\n        namespaceName\n            .toLowerCase()\n            .replaceAll(\"[^-a-zA-Z0-9]\", \"-\") // replace invalid chars with '-'\n            .replaceAll(\"-+\", \"-\") // replace multiple '-' with single ones\n            .replaceAll(\"^-|-$\", \"\"); // trim dashes at beginning/end of the string\n    if (namespaceName.startsWith(\"kube-\")) {\n      namespaceName = \"che-\" + namespaceName;\n    }\n    return namespaceName.substring(\n        0,\n        Math.min(\n            namespaceName.length(),\n            METADATA_NAME_MAX_LENGTH)); // limit length to METADATA_NAME_MAX_LENGTH\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesObjectUtil.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.Boolean.FALSE;\nimport static java.lang.Boolean.TRUE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Annotations.CREATE_IN_CHE_INSTALLATION_NAMESPACE;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.LabelSelector;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaim;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaimBuilder;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaimFluent;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaimVolumeSource;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaimVolumeSourceBuilder;\nimport io.fabric8.kubernetes.api.model.Quantity;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServiceSpec;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport io.fabric8.kubernetes.api.model.VolumeMountBuilder;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentSpec;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\n\n/**\n * Helps to work with Kubernetes objects.\n *\n * @author Anton Korneta\n */\npublic class KubernetesObjectUtil {\n\n  private static final String STORAGE_PARAM = \"storage\";\n  private static final String VALID_CONFIG_MAP_KEY_NAME = \"[-._a-zA-Z0-9]+\";\n  private static final Pattern VALID_CONFIG_MAP_KEY_NAME_PATTERN =\n      Pattern.compile(VALID_CONFIG_MAP_KEY_NAME);\n\n  /** Checks if the specified object has the specified label. */\n  public static boolean isLabeled(HasMetadata source, String key, String value) {\n    ObjectMeta metadata = source.getMetadata();\n\n    if (metadata == null) {\n      return false;\n    }\n\n    Map<String, String> labels = metadata.getLabels();\n    if (labels == null) {\n      return false;\n    }\n\n    return value.equals(labels.get(key));\n  }\n\n  /** Adds label to target Kubernetes object. */\n  public static void putLabel(HasMetadata target, String key, String value) {\n    ObjectMeta metadata = target.getMetadata();\n\n    if (metadata == null) {\n      target.setMetadata(metadata = new ObjectMeta());\n    }\n\n    putLabel(target.getMetadata(), key, value);\n  }\n\n  /** Adds labels to target Kubernetes object. */\n  public static void putLabels(ObjectMeta metadata, Map<String, String> labels) {\n    if (labels == null || labels.isEmpty()) {\n      return;\n    }\n\n    Map<String, String> metaLabels = metadata.getLabels();\n    if (metaLabels == null) {\n      metadata.setLabels(new HashMap<>(labels));\n    } else {\n      metaLabels.putAll(labels);\n    }\n  }\n\n  /** Adds label to target Kubernetes object. */\n  public static void putLabel(ObjectMeta metadata, String key, String value) {\n    Map<String, String> labels = metadata.getLabels();\n    if (labels == null) {\n      metadata.setLabels(labels = new HashMap<>());\n    }\n\n    labels.put(key, value);\n  }\n\n  /** Adds annotation to target Kubernetes object. */\n  public static void putAnnotation(HasMetadata target, String key, String value) {\n    ObjectMeta metadata = target.getMetadata();\n\n    if (metadata == null) {\n      target.setMetadata(metadata = new ObjectMeta());\n    }\n\n    putAnnotation(metadata, key, value);\n  }\n\n  /** Adds annotation to target ObjectMeta object. */\n  public static void putAnnotation(ObjectMeta metadata, String key, String value) {\n    Map<String, String> annotations = metadata.getAnnotations();\n    if (annotations == null) {\n      metadata.setAnnotations(annotations = new HashMap<>());\n    }\n\n    annotations.put(key, value);\n  }\n\n  /** Adds annotations to target ObjectMeta object. */\n  public static void putAnnotations(ObjectMeta metadata, Map<String, String> annotations) {\n    if (annotations == null || annotations.isEmpty()) {\n      return;\n    }\n\n    Map<String, String> metaAnnotations = metadata.getAnnotations();\n    if (metaAnnotations == null) {\n      metadata.setAnnotations(new HashMap<>(annotations));\n    } else {\n      metaAnnotations.putAll(annotations);\n    }\n  }\n\n  /** Adds selector into target Kubernetes service. */\n  public static void putSelector(Service target, String key, String value) {\n    ServiceSpec spec = target.getSpec();\n\n    if (spec == null) {\n      target.setSpec(spec = new ServiceSpec());\n    }\n\n    Map<String, String> selector = spec.getSelector();\n    if (selector == null) {\n      spec.setSelector(selector = new HashMap<>());\n    }\n\n    selector.put(key, value);\n  }\n\n  /** Sets the specified key/value par of a selector into target Kubernetes service. */\n  public static void setSelector(Service target, String key, String value) {\n    ServiceSpec spec = target.getSpec();\n\n    if (spec == null) {\n      spec = new ServiceSpec();\n      target.setSpec(spec);\n    }\n\n    HashMap<String, String> selector = new HashMap<>();\n    selector.put(key, value);\n    spec.setSelector(selector);\n  }\n\n  /** Sets the specified match labels for a selector into target Kubernetes Deployment. */\n  public static void setSelector(Deployment target, Map<String, String> matchLabels) {\n    DeploymentSpec spec = target.getSpec();\n\n    if (spec == null) {\n      spec = new DeploymentSpec();\n      target.setSpec(spec);\n    }\n\n    LabelSelector selector = spec.getSelector();\n    if (selector == null) {\n      selector = new LabelSelector();\n      spec.setSelector(selector);\n    }\n\n    selector.setMatchLabels(new HashMap<>(matchLabels));\n  }\n\n  /**\n   * Returns new instance of {@link PersistentVolumeClaim} with specified name, accessMode and\n   * quantity.\n   */\n  public static PersistentVolumeClaim newPVC(String name, String accessMode, String quantity) {\n    return newPVC(name, accessMode, quantity, null);\n  }\n\n  /**\n   * Returns new instance of {@link PersistentVolumeClaim} with specified name, accessMode, quantity\n   * and storageClassName.\n   */\n  public static PersistentVolumeClaim newPVC(\n      String name, String accessMode, String quantity, String storageClassName) {\n    PersistentVolumeClaimFluent<PersistentVolumeClaimBuilder>.SpecNested<\n            PersistentVolumeClaimBuilder>\n        specs =\n            new PersistentVolumeClaimBuilder()\n                .withNewMetadata()\n                .withName(name)\n                .endMetadata()\n                .withNewSpec()\n                .withAccessModes(accessMode);\n    if (!isNullOrEmpty(storageClassName)) {\n      specs.withStorageClassName(storageClassName);\n    }\n    return specs\n        .withNewResources()\n        .withRequests(ImmutableMap.of(STORAGE_PARAM, new Quantity(quantity)))\n        .endResources()\n        .endSpec()\n        .build();\n  }\n\n  /** Returns new instance of {@link VolumeMount} with specified name, mountPath and subPath. */\n  public static VolumeMount newVolumeMount(String name, String mountPath, String subPath) {\n    return new VolumeMountBuilder()\n        .withMountPath(mountPath)\n        .withName(name)\n        .withSubPath(subPath)\n        .build();\n  }\n\n  /** Returns new instance of {@link Volume} with specified name and name of claim related to. */\n  public static Volume newVolume(String name, String pvcName) {\n    final PersistentVolumeClaimVolumeSource pvcs =\n        new PersistentVolumeClaimVolumeSourceBuilder().withClaimName(pvcName).build();\n    return new VolumeBuilder().withPersistentVolumeClaim(pvcs).withName(name).build();\n  }\n\n  /**\n   * Checks the object if it is propetly annotated to be created in Che installation namespace.\n   *\n   * <p>Create in Che installation namespace only if there is {@link\n   * Annotations#CREATE_IN_CHE_INSTALLATION_NAMESPACE} annotation set exactly to `true`. In all\n   * other cases we create the object in Workspace's namespace.\n   *\n   * @param k8sObject object to check\n   * @return `true` if {@link Annotations#CREATE_IN_CHE_INSTALLATION_NAMESPACE} is set to `true`.\n   *     `false` otherwise.\n   */\n  public static boolean shouldCreateInCheNamespace(HasMetadata k8sObject) {\n    if (k8sObject.getMetadata() == null) {\n      return false;\n    }\n    Map<String, String> annotations = k8sObject.getMetadata().getAnnotations();\n    if (annotations == null || annotations.isEmpty()) {\n      return false;\n    }\n\n    return annotations\n        .getOrDefault(CREATE_IN_CHE_INSTALLATION_NAMESPACE, FALSE.toString())\n        .equals(TRUE.toString());\n  }\n\n  /** Checks the provided name is a valid kubernetes config map key name */\n  public static boolean isValidConfigMapKeyName(String configMapKeyName) {\n    return VALID_CONFIG_MAP_KEY_NAME_PATTERN.matcher(configMapKeyName).matches();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesPersistentVolumeClaims.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static io.fabric8.kubernetes.api.model.DeletionPropagation.BACKGROUND;\nimport static java.util.stream.Collectors.toSet;\n\nimport io.fabric8.kubernetes.api.model.Event;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaim;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.kubernetes.client.Watch;\nimport io.fabric8.kubernetes.client.Watcher;\nimport io.fabric8.kubernetes.client.WatcherException;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructureException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Defines an internal API for managing {@link PersistentVolumeClaim} instances in {@link\n * KubernetesPersistentVolumeClaims#namespace predefined namespace}.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesPersistentVolumeClaims {\n\n  private static final Logger LOG = LoggerFactory.getLogger(KubernetesPersistentVolumeClaims.class);\n\n  private static final String PVC_BOUND_PHASE = \"Bound\";\n  private static final String PVC_EVENT_REASON_FIELD_KEY = \"reason\";\n  private static final String PVC_EVENT_WAIT_CONSUMER_REASON = \"WaitForFirstConsumer\";\n  private static final String PVC_EVENT_UID_FIELD_KEY = \"involvedObject.uid\";\n\n  private final String namespace;\n  private final String workspaceId;\n  private final KubernetesClientFactory clientFactory;\n\n  KubernetesPersistentVolumeClaims(\n      String namespace, String workspaceId, KubernetesClientFactory clientFactory) {\n    this.namespace = namespace;\n    this.clientFactory = clientFactory;\n    this.workspaceId = workspaceId;\n  }\n\n  /**\n   * Creates specified persistent volume claim.\n   *\n   * @param pvc persistent volume claim to create\n   * @return created persistent volume claim\n   * @throws InfrastructureException when any exception occurs\n   */\n  public PersistentVolumeClaim create(PersistentVolumeClaim pvc) throws InfrastructureException {\n    try {\n      return clientFactory\n          .create(workspaceId)\n          .persistentVolumeClaims()\n          .inNamespace(namespace)\n          .create(pvc);\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Returns all existing persistent volume claims.\n   *\n   * @throws InfrastructureException when any exception occurs\n   */\n  public List<PersistentVolumeClaim> get() throws InfrastructureException {\n    try {\n      return clientFactory\n          .create(workspaceId)\n          .persistentVolumeClaims()\n          .inNamespace(namespace)\n          .list()\n          .getItems();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Returns all existing persistent volume claims with given label.\n   *\n   * @param labelName name of provided label\n   * @param labelValue value of provided label\n   * @return list of matched PVCs\n   * @throws InfrastructureException when any exception occurs while fetching the pvcs\n   */\n  public List<PersistentVolumeClaim> getByLabel(String labelName, String labelValue)\n      throws InfrastructureException {\n    try {\n      return clientFactory\n          .create(workspaceId)\n          .persistentVolumeClaims()\n          .inNamespace(namespace)\n          .withLabel(labelName, labelValue)\n          .list()\n          .getItems();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Creates all PVCs which are not present in current Kubernetes namespace.\n   *\n   * @param toCreate collection of PVCs to create\n   * @throws InfrastructureException when any error occurs while creation\n   */\n  public void createIfNotExist(Collection<PersistentVolumeClaim> toCreate)\n      throws InfrastructureException {\n    final Set<String> existing =\n        get().stream().map(p -> p.getMetadata().getName()).collect(toSet());\n    for (PersistentVolumeClaim pvc : toCreate) {\n      if (!existing.contains(pvc.getMetadata().getName())) {\n        create(pvc);\n      }\n    }\n  }\n\n  /**\n   * Removes all PVCs which have the specified labels.\n   *\n   * @param labels labels to filter PVCs\n   * @throws InfrastructureException when any error occurs while removing\n   */\n  public void delete(Map<String, String> labels) throws InfrastructureException {\n    try {\n      clientFactory\n          .create(workspaceId)\n          .persistentVolumeClaims()\n          .inNamespace(namespace)\n          .withLabels(labels)\n          .withPropagationPolicy(BACKGROUND)\n          .delete();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Removes PVC by name.\n   *\n   * @param name the name of the PVC\n   * @throws InfrastructureException when any error occurs while removing\n   */\n  public void delete(final String name) throws InfrastructureException {\n    try {\n      clientFactory\n          .create(workspaceId)\n          .persistentVolumeClaims()\n          .inNamespace(namespace)\n          .withName(name)\n          .withPropagationPolicy(BACKGROUND)\n          .delete();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Waits until persistent volume claim state is bound. If used k8s Storage Class has\n   * 'volumeBindingMode: WaitForFirstConsumer', we don't wait to avoid deadlock.\n   *\n   * @param name name of persistent volume claim that should be watched\n   * @param timeoutMillis waiting timeout in milliseconds\n   * @return persistent volume claim that is bound or in waiting for consumer state\n   * @throws InfrastructureException when specified timeout is reached\n   * @throws InfrastructureException when {@link Thread} is interrupted while waiting\n   * @throws InfrastructureException when any other exception occurs\n   */\n  public PersistentVolumeClaim waitBound(String name, long timeoutMillis)\n      throws InfrastructureException {\n    try {\n      Resource<PersistentVolumeClaim> pvcResource =\n          clientFactory\n              .create(workspaceId)\n              .persistentVolumeClaims()\n              .inNamespace(namespace)\n              .withName(name);\n\n      PersistentVolumeClaim actualPvc = pvcResource.get();\n      if (actualPvc.getStatus().getPhase().equals(PVC_BOUND_PHASE)) {\n        return actualPvc;\n      }\n\n      CompletableFuture<PersistentVolumeClaim> future = new CompletableFuture<>();\n      // any of these watchers can finish the operation resolving the future\n      try (Watch boundWatcher = pvcIsBoundWatcher(future, pvcResource);\n          Watch waitingWatcher = pvcIsWaitingForConsumerWatcher(future, actualPvc)) {\n        return future.get(timeoutMillis, TimeUnit.MILLISECONDS);\n      } catch (ExecutionException e) {\n        // May happen only if WebSocket Connection is closed before needed event received.\n        // Throw internal exception because there may be some cluster/network issues that admin\n        // should take a look.\n        throw new InternalInfrastructureException(e.getCause().getMessage(), e);\n      } catch (TimeoutException e) {\n        // May happen when PVC is not bound in the time.\n        // Throw internal exception because there may be some cluster configuration/performance\n        // issues that admin should take a look.\n        throw new InternalInfrastructureException(\n            \"Waiting for persistent volume claim '\" + name + \"' reached timeout\");\n      } catch (InterruptedException e) {\n        Thread.currentThread().interrupt();\n        throw new InfrastructureException(\n            \"Waiting for persistent volume claim '\" + name + \"' was interrupted\");\n      }\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  private Watch pvcIsBoundWatcher(\n      CompletableFuture<PersistentVolumeClaim> future,\n      Resource<PersistentVolumeClaim> pvcResource) {\n    return pvcResource.watch(\n        new Watcher<PersistentVolumeClaim>() {\n          @Override\n          public void eventReceived(Action action, PersistentVolumeClaim pvc) {\n            if (pvc.getStatus().getPhase().equals(PVC_BOUND_PHASE)) {\n              LOG.debug(\"pvc '\" + pvc.getMetadata().getName() + \"' is bound\");\n              future.complete(pvc);\n            }\n          }\n\n          @Override\n          public void onClose(WatcherException cause) {\n            safelyFinishFutureOnClose(cause, future, pvcResource.get().getMetadata().getName());\n          }\n        });\n  }\n\n  /**\n   * Creates and returns {@link Watch} that watches for 'WaitForFirstConsumer' events on given PVC.\n   */\n  private Watch pvcIsWaitingForConsumerWatcher(\n      CompletableFuture<PersistentVolumeClaim> future, PersistentVolumeClaim actualPvc)\n      throws InfrastructureException {\n    return clientFactory\n        .create(workspaceId)\n        .v1()\n        .events()\n        .inNamespace(namespace)\n        .withField(PVC_EVENT_REASON_FIELD_KEY, PVC_EVENT_WAIT_CONSUMER_REASON)\n        .withField(PVC_EVENT_UID_FIELD_KEY, actualPvc.getMetadata().getUid())\n        .watch(\n            new Watcher<Event>() {\n              @Override\n              public void eventReceived(Action action, Event resource) {\n                LOG.debug(\n                    \"PVC '\"\n                        + actualPvc.getMetadata().getName()\n                        + \"' is waiting for first consumer. Don't wait to bound to avoid deadlock.\");\n                future.complete(actualPvc);\n              }\n\n              @Override\n              public void onClose(WatcherException cause) {\n                safelyFinishFutureOnClose(cause, future, actualPvc.getMetadata().getName());\n              }\n            });\n  }\n\n  private void safelyFinishFutureOnClose(\n      WatcherException cause, CompletableFuture<PersistentVolumeClaim> future, String pvcName) {\n    if (cause != null) {\n      future.completeExceptionally(\n          new InfrastructureException(\n              \"Waiting for persistent volume claim '\" + pvcName + \"' was interrupted\"));\n    } else if (!future.isDone()) {\n      future.cancel(true);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesSecrets.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static io.fabric8.kubernetes.api.model.DeletionPropagation.BACKGROUND;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_WORKSPACE_ID_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putLabel;\n\nimport io.fabric8.kubernetes.api.model.LabelSelector;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport java.util.List;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructureException;\n\n/**\n * Defines an internal API for managing {@link Secret} instances in {@link\n * KubernetesSecrets#namespace predefined namespace}.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesSecrets {\n  private final String namespace;\n  private final String workspaceId;\n  private final KubernetesClientFactory clientFactory;\n\n  KubernetesSecrets(String namespace, String workspaceId, KubernetesClientFactory clientFactory) {\n    this.namespace = namespace;\n    this.workspaceId = workspaceId;\n    this.clientFactory = clientFactory;\n  }\n\n  /**\n   * Creates specified secret.\n   *\n   * @param secret secret to create\n   * @throws InfrastructureException when any exception occurs\n   */\n  public void create(Secret secret) throws InfrastructureException {\n    putLabel(secret, CHE_WORKSPACE_ID_LABEL, workspaceId);\n    try {\n      clientFactory.create(workspaceId).secrets().inNamespace(namespace).create(secret);\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Finds secrets matching specified label selector.\n   *\n   * @param labelSelector selector to filter secrets\n   * @return matched secrets list\n   * @throws InfrastructureException when any exception occurs\n   */\n  public List<Secret> get(LabelSelector labelSelector) throws InfrastructureException {\n    try {\n      return clientFactory\n          .create(workspaceId)\n          .secrets()\n          .inNamespace(namespace)\n          .withLabelSelector(labelSelector)\n          .list()\n          .getItems();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Get all secrets.\n   *\n   * @return namespace secrets list\n   * @throws InfrastructureException when any exception occurs\n   */\n  public List<Secret> get() throws InfrastructureException {\n    try {\n      return clientFactory.create(workspaceId).secrets().inNamespace(namespace).list().getItems();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Deletes all existing secrets.\n   *\n   * @throws InfrastructureException when any exception occurs\n   */\n  public void delete() throws InfrastructureException {\n    try {\n      clientFactory\n          .create(workspaceId)\n          .secrets()\n          .inNamespace(namespace)\n          .withLabel(CHE_WORKSPACE_ID_LABEL, workspaceId)\n          .withPropagationPolicy(BACKGROUND)\n          .delete();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesServices.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static io.fabric8.kubernetes.api.model.DeletionPropagation.BACKGROUND;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_WORKSPACE_ID_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putLabel;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putSelector;\n\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport java.util.List;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructureException;\n\n/**\n * Defines an internal API for managing {@link Service} instances in {@link\n * KubernetesServices#namespace predefined namespace}.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesServices {\n  private final String namespace;\n  private final String workspaceId;\n  private final KubernetesClientFactory clientFactory;\n\n  KubernetesServices(String namespace, String workspaceId, KubernetesClientFactory clientFactory) {\n    this.namespace = namespace;\n    this.workspaceId = workspaceId;\n    this.clientFactory = clientFactory;\n  }\n\n  /**\n   * Creates specified service.\n   *\n   * @param service service to create\n   * @return created service\n   * @throws InfrastructureException when any exception occurs\n   */\n  public Service create(Service service) throws InfrastructureException {\n    putLabel(service, CHE_WORKSPACE_ID_LABEL, workspaceId);\n    putSelector(service, CHE_WORKSPACE_ID_LABEL, workspaceId);\n    try {\n      return clientFactory.create(workspaceId).services().inNamespace(namespace).create(service);\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Returns all existing services.\n   *\n   * @throws InfrastructureException when any exception occurs\n   */\n  public List<Service> get() throws InfrastructureException {\n    try {\n      return clientFactory\n          .create(workspaceId)\n          .services()\n          .inNamespace(namespace)\n          .withLabel(CHE_WORKSPACE_ID_LABEL, workspaceId)\n          .list()\n          .getItems();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Deletes all existing services.\n   *\n   * @throws InfrastructureException when any exception occurs\n   */\n  public void delete() throws InfrastructureException {\n    try {\n      clientFactory\n          .create(workspaceId)\n          .services()\n          .inNamespace(namespace)\n          .withLabel(CHE_WORKSPACE_ID_LABEL, workspaceId)\n          .withPropagationPolicy(BACKGROUND)\n          .delete();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesWorkspaceServiceAccount.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport io.fabric8.kubernetes.api.model.rbac.PolicyRuleBuilder;\nimport io.fabric8.kubernetes.api.model.rbac.Role;\nimport io.fabric8.kubernetes.api.model.rbac.RoleBinding;\nimport io.fabric8.kubernetes.api.model.rbac.RoleBindingBuilder;\nimport io.fabric8.kubernetes.api.model.rbac.RoleBuilder;\nimport io.fabric8.kubernetes.api.model.rbac.SubjectBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport java.util.List;\nimport java.util.Set;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\n\n/**\n * Holds logic for preparing workspace service account.\n *\n * <p>It checks that required service account, roles and role bindings exist and creates if needed.\n *\n * @author Sergii Leshchenko\n */\npublic class KubernetesWorkspaceServiceAccount\n    extends AbstractWorkspaceServiceAccount<KubernetesClient, Role, RoleBinding> {\n\n  public KubernetesWorkspaceServiceAccount(\n      String workspaceId,\n      String namespace,\n      String serviceAccountName,\n      Set<String> clusterRoleNames,\n      KubernetesClientFactory clientFactory) {\n    super(\n        workspaceId,\n        namespace,\n        serviceAccountName,\n        clusterRoleNames,\n        clientFactory::create,\n        c -> c.rbac().roles(),\n        c -> c.rbac().roleBindings());\n  }\n\n  @Override\n  protected Role buildRole(\n      String name,\n      List<String> resources,\n      List<String> resourceNames,\n      List<String> apiGroups,\n      List<String> verbs) {\n    return new RoleBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .endMetadata()\n        .withRules(\n            new PolicyRuleBuilder()\n                .withResources(resources)\n                .withResourceNames(resourceNames)\n                .withApiGroups(apiGroups)\n                .withVerbs(verbs)\n                .build())\n        .build();\n  }\n\n  @Override\n  protected RoleBinding createRoleBinding(\n      String roleName, String bindingName, boolean clusterRole) {\n    return new RoleBindingBuilder()\n        .withNewMetadata()\n        .withName(bindingName)\n        .withNamespace(namespace)\n        .endMetadata()\n        .withNewRoleRef()\n        .withKind(clusterRole ? \"ClusterRole\" : \"Role\")\n        .withName(roleName)\n        .endRoleRef()\n        .withSubjects(\n            new SubjectBuilder()\n                .withKind(\"ServiceAccount\")\n                .withName(serviceAccountName)\n                .withNamespace(namespace)\n                .build())\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/NamespaceNameValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.api.core.ValidationException;\n\npublic final class NamespaceNameValidator {\n\n  static final int METADATA_NAME_MAX_LENGTH = 63;\n  private static final String METADATA_NAME_REGEX = \"[a-z0-9]([-a-z0-9]*[a-z0-9])?\";\n  private static final Pattern METADATA_NAME_PATTERN = Pattern.compile(METADATA_NAME_REGEX);\n\n  private NamespaceNameValidator() {\n    throw new AssertionError();\n  }\n\n  /**\n   * Checks whether the provided name is a valid namespace name and throws an exception detailing\n   * the validation result if it is not.\n   *\n   * @throws ValidationException if the provided name is not a valid namespace name\n   */\n  public static void validate(String namespaceName) throws ValidationException {\n    ValidationResult res = validateInternal(namespaceName);\n    if (!res.isOk()) {\n      throw res.toException(namespaceName);\n    }\n  }\n\n  /**\n   * Similar to {@link #validate(String)} but doesn't throw an exception. The caller cannot\n   * distinguish why the name is not valid.\n   *\n   * @return true if the namespace is valid, false otherwise\n   */\n  public static boolean isValid(String name) {\n    return validateInternal(name).isOk();\n  }\n\n  @VisibleForTesting\n  static ValidationResult validateInternal(String namespaceName) {\n    if (isNullOrEmpty(namespaceName)) {\n      return ValidationResult.NULL_OR_EMPTY;\n    }\n\n    if (namespaceName.length() > METADATA_NAME_MAX_LENGTH) {\n      return ValidationResult.TOO_LONG;\n    }\n\n    if (!METADATA_NAME_PATTERN.matcher(namespaceName).matches()) {\n      return ValidationResult.INVALID;\n    }\n\n    return ValidationResult.OK;\n  }\n\n  @VisibleForTesting\n  enum ValidationResult {\n    OK,\n    NULL_OR_EMPTY,\n    TOO_LONG,\n    INVALID;\n\n    boolean isOk() {\n      return this == OK;\n    }\n\n    ValidationException toException(String namespaceName) {\n      switch (this) {\n        case OK:\n          throw new IllegalStateException(\n              \"Tried to convert a successful validation into\" + \" an exception. This is a bug.\");\n        case NULL_OR_EMPTY:\n          return new ValidationException(\"Namespace name cannot be undefined.\");\n        case TOO_LONG:\n          return new ValidationException(\n              \"The specified namespace \"\n                  + namespaceName\n                  + \" is invalid: must be no more than 63 characters\");\n        case INVALID:\n          return new ValidationException(\n              \"The specified namespace \"\n                  + namespaceName\n                  + \" is invalid: a DNS-1123 label must consist of lower case alphanumeric\"\n                  + \" characters or '-', and must start and end with an\"\n                  + \" alphanumeric character (e.g. 'my-name', or '123-abc', regex used for\"\n                  + \" validation is '\"\n                  + METADATA_NAME_REGEX\n                  + \"')\");\n        default:\n          throw new IllegalStateException(\n              format(\n                  \"Could not convert namespace validation failure '%s' to a validation exception.\"\n                      + \" This is a bug.\",\n                  this));\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/RemoveNamespaceOnWorkspaceRemove.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.core.notification.EventSubscriber;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.shared.event.WorkspaceRemovedEvent;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Listener for removing Kubernetes namespace on {@code WorkspaceRemovedEvent}.\n *\n * @author Sergii Leshchenko\n */\n@Singleton\npublic class RemoveNamespaceOnWorkspaceRemove implements EventSubscriber<WorkspaceRemovedEvent> {\n  private static final Logger LOG = LoggerFactory.getLogger(RemoveNamespaceOnWorkspaceRemove.class);\n\n  private final KubernetesNamespaceFactory namespaceFactory;\n\n  @Inject\n  public RemoveNamespaceOnWorkspaceRemove(KubernetesNamespaceFactory namespaceFactory) {\n    this.namespaceFactory = namespaceFactory;\n  }\n\n  @Inject\n  public void subscribe(EventService eventService) {\n    eventService.subscribe(this);\n  }\n\n  @Override\n  public void onEvent(WorkspaceRemovedEvent event) {\n    String workspaceId = event.getWorkspace().getId();\n    try {\n      namespaceFactory.deleteIfManaged(event.getWorkspace());\n    } catch (InfrastructureException e) {\n      LOG.warn(\n          \"Fail to remove Kubernetes namespace for workspace with id {}. Cause: {}\",\n          workspaceId,\n          e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/CredentialsSecretConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport java.util.Base64;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * This {@link NamespaceConfigurator} ensures that Secret {@link\n * org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount#CREDENTIALS_SECRET_NAME}\n * is present in the Workspace namespace.\n */\n@Singleton\npublic class CredentialsSecretConfigurator implements NamespaceConfigurator {\n\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n  private static final int SSL_ERROR_CODE = 495;\n\n  private static final Map<String, String> SEARCH_LABELS =\n      ImmutableMap.of(\n          \"app.kubernetes.io/part-of\", \"che.eclipse.org\",\n          \"app.kubernetes.io/component\", \"scm-personal-access-token\");\n  private static final String ANNOTATION_SCM_URL = \"che.eclipse.org/scm-url\";\n  private static final String MERGED_GIT_CREDENTIALS_SECRET_NAME =\n      \"devworkspace-merged-git-credentials\";\n\n  private static final Logger LOG = LoggerFactory.getLogger(CredentialsSecretConfigurator.class);\n\n  @Inject\n  public CredentialsSecretConfigurator(\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n  }\n\n  @Override\n  public void configure(NamespaceResolutionContext namespaceResolutionContext, String namespaceName)\n      throws InfrastructureException {\n    var client = cheServerKubernetesClientFactory.create();\n    Secret mergedCredentialsSecret =\n        client\n            .secrets()\n            .inNamespace(namespaceName)\n            .withName(MERGED_GIT_CREDENTIALS_SECRET_NAME)\n            .get();\n\n    for (Secret s :\n        client.secrets().inNamespace(namespaceName).withLabels(SEARCH_LABELS).list().getItems()) {\n      if (mergedCredentialsSecret == null\n          || !getSecretData(mergedCredentialsSecret, \"credentials\")\n              .contains(getSecretData(s, \"token\"))) {\n        String scmServerUrl = s.getMetadata().getAnnotations().get(ANNOTATION_SCM_URL);\n        try {\n          personalAccessTokenManager.storeGitCredentials(scmServerUrl);\n        } catch (ScmCommunicationException\n            | ScmConfigurationPersistenceException\n            | UnsatisfiedScmPreconditionException\n            | ScmUnauthorizedException e) {\n          if (e instanceof ScmCommunicationException\n              && ((ScmCommunicationException) e).getStatusCode() == SSL_ERROR_CODE) {\n            // need to remove the PAT secret as invalid\n            personalAccessTokenManager.remove(scmServerUrl);\n            throw new InfrastructureException(e.getMessage(), e);\n          }\n          LOG.error(e.getMessage(), e);\n        }\n      }\n    }\n  }\n\n  private String getSecretData(Secret secret, String key) {\n    return new String(Base64.getDecoder().decode(secret.getData().get(key).getBytes()));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.StringJoiner;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.factory.server.scm.GitUserData;\nimport org.eclipse.che.api.factory.server.scm.GitUserDataFetcher;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class GitconfigConfigurator implements NamespaceConfigurator {\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  private final Set<GitUserDataFetcher> gitUserDataFetchers;\n  private static final Logger LOG = LoggerFactory.getLogger(GitconfigConfigurator.class);\n  private static final String CONFIGMAP_DATA_KEY = \"gitconfig\";\n  // TODO: rename to a more generic name, since it is not only for user data\n  private static final String GITCONFIG_CONFIGMAP_NAME = \"workspace-userdata-gitconfig-configmap\";\n  private static final Map<String, String> GITCONFIG_CONFIGMAP_LABELS =\n      ImmutableMap.of(\n          \"controller.devfile.io/mount-to-devworkspace\",\n          \"true\",\n          \"controller.devfile.io/watch-configmap\",\n          \"true\");\n  private static final Map<String, String> GITCONFIG_CONFIGMAP_ANNOTATIONS =\n      ImmutableMap.of(\n          \"controller.devfile.io/mount-as\", \"subpath\", \"controller.devfile.io/mount-path\", \"/etc\");\n  private final Pattern usernmaePattern =\n      Pattern.compile(\"\\\\[user](.|\\\\s)*name\\\\s*=\\\\s*(?<username>.*)\");\n  private final Pattern emailPattern =\n      Pattern.compile(\"\\\\[user](.|\\\\s)*email\\\\s*=\\\\s*(?<email>.*)\");\n  private final Pattern emptyStringPattern = Pattern.compile(\"[\\\"']\\\\s*[\\\"']\");\n  private final Pattern gitconfigSectionPattern =\n      Pattern.compile(\"\\\\[(?<sectionName>[a-zA-Z0-9]+)](\\\\n\\\\s*\\\\S*\\\\s*=.*)*\");\n\n  @Inject\n  public GitconfigConfigurator(\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory,\n      Set<GitUserDataFetcher> gitUserDataFetchers) {\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n    this.gitUserDataFetchers = gitUserDataFetchers;\n  }\n\n  @Override\n  public void configure(NamespaceResolutionContext namespaceResolutionContext, String namespaceName)\n      throws InfrastructureException {\n    KubernetesClient client = cheServerKubernetesClientFactory.create();\n    Optional<String> gitconfigOptional = getGitconfig(client, namespaceName);\n    // Try to get username and email from the gitconfig configmap if present.\n    Optional<Pair<String, String>> usernameAndEmailFromGitconfigOptional =\n        gitconfigOptional.isPresent()\n            ? getUsernameAndEmailFromGitconfig(gitconfigOptional.get())\n            : Optional.empty();\n    // If username and email are not present in the gitconfig configmap, or the values are empty, or\n    // the gitconfig configmap is empty, try to get them from the fetcher.\n    if (usernameAndEmailFromGitconfigOptional.isEmpty()) {\n      Optional<Pair<String, String>> usernameAndEmailFromFetcher =\n          // Fetch username and email from a token secret if it is present.\n          getUsernameAndEmailFromFetcher(namespaceName);\n      // If username and email are present, create or update the gitconfig configmap.\n      if (usernameAndEmailFromFetcher.isPresent()) {\n        ConfigMap gitconfigConfigmap = buildGitconfigConfigmap();\n        Optional<String> gitconfigSectionsOptional =\n            generateGitconfigSections(gitconfigOptional, usernameAndEmailFromFetcher);\n        gitconfigConfigmap.setData(\n            ImmutableMap.of(CONFIGMAP_DATA_KEY, gitconfigSectionsOptional.orElse(\"\")));\n        client.configMaps().inNamespace(namespaceName).createOrReplace(gitconfigConfigmap);\n      }\n    }\n  }\n\n  private ConfigMap buildGitconfigConfigmap() {\n    return new ConfigMapBuilder()\n        .withNewMetadata()\n        .withName(GITCONFIG_CONFIGMAP_NAME)\n        .withLabels(GITCONFIG_CONFIGMAP_LABELS)\n        .withAnnotations(GITCONFIG_CONFIGMAP_ANNOTATIONS)\n        .endMetadata()\n        .build();\n  }\n\n  private Optional<String> generateGitconfigSections(\n      Optional<String> gitconfigOptional, Optional<Pair<String, String>> usernameAndEmailOptional) {\n    Optional<String> userSectionOptional =\n        usernameAndEmailOptional.map(p -> generateUserSection(p.first, p.second));\n    StringJoiner joiner = new StringJoiner(\"\\n\");\n    userSectionOptional.ifPresent(joiner::add);\n    gitconfigOptional.flatMap(this::getOtherStoredSections).ifPresent(joiner::add);\n    return joiner.length() > 0 ? Optional.of(joiner.toString()) : Optional.empty();\n  }\n\n  Optional<String> getOtherStoredSections(String gitconfig) {\n    StringJoiner joiner = new StringJoiner(\"\\n\");\n    Matcher matcher = gitconfigSectionPattern.matcher(gitconfig);\n    while (matcher.find()) {\n      String sectionName = matcher.group(\"sectionName\");\n      if (!sectionName.equals(\"user\") && !sectionName.equals(\"http\")) {\n        joiner.add(matcher.group());\n      }\n    }\n    return joiner.length() > 0 ? Optional.of(joiner.toString()) : Optional.empty();\n  }\n\n  private Optional<Pair<String, String>> getUsernameAndEmailFromGitconfig(String gitconfig) {\n    if (gitconfig.contains(\"[user]\")) {\n      Matcher usernameMatcher = usernmaePattern.matcher(gitconfig);\n      Matcher emailMatcher = emailPattern.matcher(gitconfig);\n      if (usernameMatcher.find() && emailMatcher.find()) {\n        String username = usernameMatcher.group(\"username\");\n        String email = emailMatcher.group(\"email\");\n        if (!emptyStringPattern.matcher(username).matches()\n            && !emptyStringPattern.matcher(email).matches()) {\n          return Optional.of(new Pair<>(username, email));\n        }\n      }\n    }\n    return Optional.empty();\n  }\n\n  private Optional<Pair<String, String>> getUsernameAndEmailFromFetcher(String namespaceName) {\n    GitUserData gitUserData;\n    for (GitUserDataFetcher fetcher : gitUserDataFetchers) {\n      try {\n        gitUserData = fetcher.fetchGitUserData(namespaceName);\n        if (!isNullOrEmpty(gitUserData.getScmUsername())\n            && !isNullOrEmpty(gitUserData.getScmUserEmail())) {\n          return Optional.of(\n              new Pair<>(gitUserData.getScmUsername(), gitUserData.getScmUserEmail()));\n        }\n      } catch (ScmUnauthorizedException\n          | ScmCommunicationException\n          | ScmConfigurationPersistenceException\n          | ScmItemNotFoundException\n          | ScmBadRequestException e) {\n        LOG.debug(\"No GitUserDataFetcher is configured. \" + e.getMessage());\n      }\n    }\n    return Optional.empty();\n  }\n\n  private String generateUserSection(String username, String email) {\n    return String.format(\"[user]\\n\\tname = %1$s\\n\\temail = %2$s\", username, email);\n  }\n\n  private Optional<String> getGitconfig(KubernetesClient client, String namespaceName) {\n    ConfigMap gitconfigConfigmap =\n        client.configMaps().inNamespace(namespaceName).withName(GITCONFIG_CONFIGMAP_NAME).get();\n    if (gitconfigConfigmap != null) {\n      String gitconfig = gitconfigConfigmap.getData().get(CONFIGMAP_DATA_KEY);\n      if (!isNullOrEmpty(gitconfig)) {\n        return Optional.of(gitconfig);\n      }\n    }\n    return Optional.empty();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/NamespaceConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport io.fabric8.kubernetes.api.model.Secret;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.NamespaceProvisioner;\n\n/**\n * Configures user's namespace after provisioning in {@link NamespaceProvisioner} with whatever is\n * needed. Such as creating user profile and preferences {@link Secret} in user namespace.\n *\n * @author Pavol Baran\n */\npublic interface NamespaceConfigurator {\n\n  /**\n   * Configures user's namespace after provisioning.\n   *\n   * @param namespaceResolutionContext users namespace context\n   * @throws InfrastructureException when any error occurs\n   */\n  void configure(NamespaceResolutionContext namespaceResolutionContext, String namespaceName)\n      throws InfrastructureException;\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/OAuthTokenSecretsConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Ensures that OAuth token that are represented by Kubernetes Secrets are valid.\n *\n * @author Anatolii Bazko\n */\n@Singleton\npublic class OAuthTokenSecretsConfigurator implements NamespaceConfigurator {\n\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n\n  private static final String ANNOTATION_SCM_URL = \"che.eclipse.org/scm-url\";\n  private static final String ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME =\n      \"che.eclipse.org/scm-personal-access-token-name\";\n\n  private static final Map<String, String> SEARCH_LABELS =\n      ImmutableMap.of(\n          \"app.kubernetes.io/part-of\", \"che.eclipse.org\",\n          \"app.kubernetes.io/component\", \"scm-personal-access-token\");\n\n  private static final Logger LOG = LoggerFactory.getLogger(OAuthTokenSecretsConfigurator.class);\n\n  @Inject\n  public OAuthTokenSecretsConfigurator(\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n  }\n\n  @Override\n  public void configure(NamespaceResolutionContext namespaceResolutionContext, String namespaceName)\n      throws InfrastructureException {\n    var client = cheServerKubernetesClientFactory.create();\n    client.secrets().inNamespace(namespaceName).withLabels(SEARCH_LABELS).list().getItems().stream()\n        .filter(\n            s ->\n                s.getMetadata().getAnnotations() != null\n                    && s.getMetadata().getAnnotations().containsKey(ANNOTATION_SCM_URL)\n                    && s.getMetadata()\n                        .getAnnotations()\n                        .containsKey(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME)\n                    && s.getMetadata()\n                        .getAnnotations()\n                        .get(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME)\n                        .startsWith(PersonalAccessTokenFetcher.OAUTH_2_PREFIX))\n        .forEach(\n            s -> {\n              try {\n                Subject cheSubject = EnvironmentContext.getCurrent().getSubject();\n                personalAccessTokenManager.get(\n                    cheSubject,\n                    null,\n                    s.getMetadata().getAnnotations().get(ANNOTATION_SCM_URL),\n                    namespaceName);\n              } catch (ScmConfigurationPersistenceException | ScmCommunicationException e) {\n                LOG.error(e.getMessage(), e);\n              }\n            });\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/PreferencesConfigMapConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.PREFERENCES_CONFIGMAP_NAME;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\n\n/**\n * This {@link NamespaceConfigurator} ensures that ConfigMap {@link\n * org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount#PREFERENCES_CONFIGMAP_NAME}\n * is present in the Workspace namespace.\n */\npublic class PreferencesConfigMapConfigurator implements NamespaceConfigurator {\n\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n\n  @Inject\n  public PreferencesConfigMapConfigurator(\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory) {\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n  }\n\n  @Override\n  public void configure(NamespaceResolutionContext namespaceResolutionContext, String namespaceName)\n      throws InfrastructureException {\n    var client = cheServerKubernetesClientFactory.create();\n    if (client.configMaps().inNamespace(namespaceName).withName(PREFERENCES_CONFIGMAP_NAME).get()\n        == null) {\n      ConfigMap configMap =\n          new ConfigMapBuilder()\n              .withNewMetadata()\n              .withName(PREFERENCES_CONFIGMAP_NAME)\n              .endMetadata()\n              .build();\n      client.configMaps().inNamespace(namespaceName).create(configMap);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/SshConfigConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport java.util.Base64;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\n\n/**\n * This {@link NamespaceConfigurator} ensures that the SSH key Secret from the Workspace namespace\n * does not contain the `ssh_config` key in its data. If the key is present in the Secret data,\n * remove it in order to avoid mount collisions from the `git-ssh-config` ConfigMap and Create a\n * dedicated ConfigMap to mount SSH Config. See\n * https://github.com/eclipse-che/che-dashboard/pull/1443\n */\npublic class SshConfigConfigurator implements NamespaceConfigurator {\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n\n  @Inject\n  public SshConfigConfigurator(CheServerKubernetesClientFactory cheServerKubernetesClientFactory) {\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n  }\n\n  @Override\n  public void configure(NamespaceResolutionContext namespaceResolutionContext, String namespaceName)\n      throws InfrastructureException {\n    String configKeyName = \"ssh_config\";\n    String config =\n        \"host *\\n\"\n            + \"  IdentityFile /etc/ssh/dwo_ssh_key\\n\"\n            + \"  StrictHostKeyChecking = no\\n\"\n            + \"\\n\"\n            + \"Include /etc/ssh/ssh_config.d/*.conf\";\n\n    KubernetesClient client = cheServerKubernetesClientFactory.create();\n\n    Secret secret = client.secrets().inNamespace(namespaceName).withName(\"git-ssh-key\").get();\n    if (secret != null && secret.getData().containsKey(configKeyName)) {\n      if (trimEnd(new String(Base64.getDecoder().decode(secret.getData().get(configKeyName))), '\\n')\n          .equals(config)) {\n        return;\n      }\n      secret.getData().put(configKeyName, Base64.getEncoder().encodeToString(config.getBytes()));\n      client.secrets().inNamespace(namespaceName).resource(secret).patch();\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/SshKeysConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.stream.Collectors.toList;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.DEV_WORKSPACE_MOUNT_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.DEV_WORKSPACE_MOUNT_PATH_ANNOTATION;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.DEV_WORKSPACE_WATCH_SECRET_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.isValidConfigMapKeyName;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport jakarta.validation.constraints.NotNull;\nimport java.util.Base64;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.regex.Pattern;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.ssh.server.SshManager;\nimport org.eclipse.che.api.ssh.server.model.impl.SshPairImpl;\nimport org.eclipse.che.api.ssh.shared.model.SshPair;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * This class mounts existing user SSH Keys into a special Kubernetes Secret on user-s namespace.\n */\npublic class SshKeysConfigurator implements NamespaceConfigurator {\n\n  public static final String SSH_KEY_SECRET_NAME = \"che-git-ssh-key\";\n  private static final String SSH_KEYS_WILL_NOT_BE_MOUNTED_MESSAGE =\n      \"Ssh keys %s have invalid names and can't be mounted to namespace %s.\";\n\n  private static final String SSH_BASE_CONFIG_PATH = \"/etc/ssh/\";\n\n  private final SshManager sshManager;\n\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n\n  private static final Logger LOG = LoggerFactory.getLogger(SshKeysConfigurator.class);\n\n  public static final Pattern VALID_DOMAIN_PATTERN =\n      Pattern.compile(\"^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\");\n\n  @Inject\n  public SshKeysConfigurator(\n      SshManager sshManager, CheServerKubernetesClientFactory cheServerKubernetesClientFactory) {\n    this.sshManager = sshManager;\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n  }\n\n  @Override\n  public void configure(NamespaceResolutionContext namespaceResolutionContext, String namespaceName)\n      throws InfrastructureException {\n\n    var client = cheServerKubernetesClientFactory.create();\n    List<SshPairImpl> vcsSshPairs = getVcsSshPairs(namespaceResolutionContext);\n\n    List<String> invalidSshKeyNames =\n        vcsSshPairs.stream()\n            .filter(keyPair -> !isValidSshKeyPair(keyPair))\n            .map(SshPairImpl::getName)\n            .collect(toList());\n\n    if (!invalidSshKeyNames.isEmpty()) {\n      String message =\n          format(\n              SSH_KEYS_WILL_NOT_BE_MOUNTED_MESSAGE, invalidSshKeyNames.toString(), namespaceName);\n      LOG.warn(message);\n      // filter\n      vcsSshPairs = vcsSshPairs.stream().filter(this::isValidSshKeyPair).collect(toList());\n    }\n\n    if (vcsSshPairs.size() == 0) {\n      // nothing to provision\n      return;\n    }\n    doProvisionSshKeys(vcsSshPairs, client, namespaceName);\n  }\n\n  /**\n   * Return list of keys related to the VCS (Version Control Systems), Git, SVN and etc. Usually\n   * managed by user\n   *\n   * @param context NamespaceResolutionContext\n   * @return list of ssh pairs\n   */\n  private List<SshPairImpl> getVcsSshPairs(NamespaceResolutionContext context)\n      throws InfrastructureException {\n    List<SshPairImpl> sshPairs;\n    try {\n      sshPairs = sshManager.getPairs(context.getUserId(), \"vcs\");\n    } catch (ServerException e) {\n      String message = format(\"Unable to get SSH Keys. Cause: %s\", e.getMessage());\n      LOG.warn(message);\n      throw new InfrastructureException(e);\n    }\n    return sshPairs;\n  }\n\n  @VisibleForTesting\n  boolean isValidSshKeyPair(SshPairImpl keyPair) {\n    return isValidConfigMapKeyName(keyPair.getName())\n        && VALID_DOMAIN_PATTERN.matcher(keyPair.getName()).matches();\n  }\n\n  private void doProvisionSshKeys(\n      List<SshPairImpl> sshPairs, KubernetesClient client, String namespaceName) {\n\n    StringBuilder sshConfigData = new StringBuilder();\n    Map<String, String> data = new HashMap<>();\n\n    for (SshPair sshPair : sshPairs) {\n      sshConfigData.append(buildConfig(sshPair.getName()));\n      if (!isNullOrEmpty(sshPair.getPrivateKey()) && !isNullOrEmpty(sshPair.getPublicKey())) {\n        data.put(\n            sshPair.getName(),\n            Base64.getEncoder().encodeToString(sshPair.getPrivateKey().getBytes()));\n        data.put(\n            sshPair.getName() + \".pub\",\n            Base64.getEncoder().encodeToString(sshPair.getPublicKey().getBytes()));\n      }\n    }\n    data.put(\"ssh_config\", Base64.getEncoder().encodeToString(sshConfigData.toString().getBytes()));\n    Secret secret =\n        new SecretBuilder()\n            .addToData(data)\n            .withType(\"generic\")\n            .withMetadata(buildMetadata())\n            .build();\n\n    client.secrets().inNamespace(namespaceName).createOrReplace(secret);\n  }\n\n  private ObjectMeta buildMetadata() {\n    return new ObjectMetaBuilder()\n        .withName(SSH_KEY_SECRET_NAME)\n        .withLabels(\n            Map.of(\n                DEV_WORKSPACE_MOUNT_LABEL, \"true\",\n                DEV_WORKSPACE_WATCH_SECRET_LABEL, \"true\"))\n        .withAnnotations(Map.of(DEV_WORKSPACE_MOUNT_PATH_ANNOTATION, SSH_BASE_CONFIG_PATH))\n        .build();\n  }\n\n  /**\n   * Returns the ssh configuration entry which includes host, identity file location and Host Key\n   * checking policy\n   *\n   * <p>Example of provided configuration:\n   *\n   * <pre>\n   * host github.com\n   * IdentityFile /.ssh/private/github-com/private\n   * StrictHostKeyChecking = no\n   * </pre>\n   *\n   * or\n   *\n   * <pre>\n   * host *\n   * IdentityFile /.ssh/private/default-123456/private\n   * StrictHostKeyChecking = no\n   * </pre>\n   *\n   * @param name the of key given during generate for vcs service we will consider it as host of\n   *     version control service (e.g. github.com, gitlab.com and etc) if name starts from\n   *     \"default-{anyString}\" it will be replaced on wildcard \"*\" host name. Name with format\n   *     \"default-{anyString}\" will be generated on client side by Theia SSH Plugin, if user doesn't\n   *     provide own name. Details see here:\n   *     https://github.com/eclipse/che/issues/13494#issuecomment-512761661. Note: behavior can be\n   *     improved in 7.x releases after 7.0.0\n   * @return the ssh configuration which include host, identity file location and Host Key checking\n   *     policy\n   */\n  private String buildConfig(@NotNull String name) {\n    String host = name.startsWith(\"default-\") ? \"*\" : name;\n    return \"host \"\n        + host\n        + \"\\nIdentityFile \"\n        + SSH_BASE_CONFIG_PATH\n        + name\n        + \"\\nStrictHostKeyChecking = no\"\n        + \"\\n\\n\";\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/UserPermissionConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.base.Splitter;\nimport com.google.common.collect.Sets;\nimport io.fabric8.kubernetes.api.model.rbac.RoleBindingBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport java.util.Collections;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\n\n/**\n * This {@link NamespaceConfigurator} ensures that User has assigned configured ClusterRoles from\n * `che.infra.kubernetes.user_cluster_roles` property. These are assigned with RoleBindings in\n * user's namespace.\n */\n@Singleton\npublic class UserPermissionConfigurator implements NamespaceConfigurator {\n\n  private final Set<String> userClusterRoles;\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n\n  @Inject\n  public UserPermissionConfigurator(\n      @Nullable @Named(\"che.infra.kubernetes.user_cluster_roles\") String userClusterRoles,\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory) {\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n    if (!isNullOrEmpty(userClusterRoles)) {\n      this.userClusterRoles =\n          Sets.newHashSet(\n              Splitter.on(\",\").trimResults().omitEmptyStrings().split(userClusterRoles));\n    } else {\n      this.userClusterRoles = Collections.emptySet();\n    }\n  }\n\n  @Override\n  public void configure(NamespaceResolutionContext namespaceResolutionContext, String namespaceName)\n      throws InfrastructureException {\n    if (!userClusterRoles.isEmpty()) {\n      bindRoles(\n          cheServerKubernetesClientFactory.create(),\n          namespaceName,\n          namespaceResolutionContext.getUserName(),\n          userClusterRoles);\n    }\n  }\n\n  private void bindRoles(\n      KubernetesClient client, String namespaceName, String username, Set<String> clusterRoles) {\n    for (String clusterRole : clusterRoles) {\n      client\n          .rbac()\n          .roleBindings()\n          .inNamespace(namespaceName)\n          .createOrReplace(\n              new RoleBindingBuilder()\n                  .withNewMetadata()\n                  .withName(clusterRole)\n                  .endMetadata()\n                  .addToSubjects(\n                      new io.fabric8.kubernetes.api.model.rbac.Subject(\n                          \"rbac.authorization.k8s.io\", \"User\", username, namespaceName))\n                  .withNewRoleRef()\n                  .withApiGroup(\"rbac.authorization.k8s.io\")\n                  .withKind(\"ClusterRole\")\n                  .withName(clusterRole)\n                  .endRoleRef()\n                  .build());\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/UserPreferencesConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Creates {@link Secret} with user preferences. This serves as a way for DevWorkspaces to acquire\n * information about the user.\n *\n * @author Pavol Baran\n */\n@Deprecated\n@Singleton\npublic class UserPreferencesConfigurator implements NamespaceConfigurator {\n  private static final Logger LOG = LoggerFactory.getLogger(UserProfileConfigurator.class);\n  private static final String USER_PREFERENCES_SECRET_NAME = \"user-preferences\";\n  private static final String USER_PREFERENCES_SECRET_MOUNT_PATH = \"/config/user/preferences\";\n  private static final int PREFERENCE_NAME_MAX_LENGTH = 253;\n\n  @Inject\n  public UserPreferencesConfigurator() {}\n\n  @Override\n  public void configure(\n      NamespaceResolutionContext namespaceResolutionContext, String namespaceName) {\n    LOG.debug(\"'user-preferences' secret is obsolete and not configured anymore for DevWorkspaces\");\n  }\n\n  /**\n   * Some preferences names are not compatible with k8s restrictions on key field in secret. The\n   * keys of data must consist of alphanumeric characters, -, _ or . This method replaces illegal\n   * characters with -\n   *\n   * @param name original preference name\n   * @return k8s compatible preference name used as a key field in Secret\n   */\n  @VisibleForTesting\n  String normalizePreferenceName(String name) {\n    name = name.replaceAll(\"[^-._a-zA-Z0-9]+\", \"-\").replaceAll(\"-+\", \"-\");\n    return name.substring(0, Math.min(name.length(), PREFERENCE_NAME_MAX_LENGTH));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/UserProfileConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.DEV_WORKSPACE_MOUNT_AS_ANNOTATION;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.DEV_WORKSPACE_MOUNT_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.DEV_WORKSPACE_MOUNT_PATH_ANNOTATION;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.DEV_WORKSPACE_WATCH_SECRET_LABEL;\n\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport java.util.Base64;\nimport java.util.HashMap;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\n\n/**\n * Creates {@link Secret} with user profile information such as his id, name and email. This serves\n * as a way for DevWorkspaces to acquire information about the user.\n *\n * @author Pavol Baran\n */\n@Singleton\npublic class UserProfileConfigurator implements NamespaceConfigurator {\n  private static final String USER_PROFILE_SECRET_NAME = \"user-profile\";\n  private static final String USER_PROFILE_SECRET_MOUNT_PATH = \"/config/user/profile\";\n\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n\n  @Inject\n  public UserProfileConfigurator(\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory) {\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n  }\n\n  @Override\n  public void configure(NamespaceResolutionContext namespaceResolutionContext, String namespaceName)\n      throws InfrastructureException {\n    Secret userProfileSecret = prepareProfileSecret(namespaceResolutionContext);\n    try {\n      cheServerKubernetesClientFactory\n          .create()\n          .secrets()\n          .inNamespace(namespaceName)\n          .createOrReplace(userProfileSecret);\n    } catch (KubernetesClientException e) {\n      throw new InfrastructureException(\n          \"Error occurred while trying to create user profile secret.\", e);\n    }\n  }\n\n  private Secret prepareProfileSecret(NamespaceResolutionContext namespaceResolutionContext)\n      throws InfrastructureException {\n    var userId = namespaceResolutionContext.getUserId();\n    var userName = namespaceResolutionContext.getUserName();\n    var userEmail = userName + \"@che\";\n\n    Base64.Encoder enc = Base64.getEncoder();\n    final Map<String, String> userProfileData = new HashMap<>();\n    userProfileData.put(\"id\", enc.encodeToString(userId.getBytes()));\n    userProfileData.put(\"name\", enc.encodeToString(userName.getBytes()));\n    userProfileData.put(\"email\", enc.encodeToString(userEmail.getBytes()));\n\n    return new SecretBuilder()\n        .addToData(userProfileData)\n        .withNewMetadata()\n        .withName(USER_PROFILE_SECRET_NAME)\n        .addToLabels(DEV_WORKSPACE_MOUNT_LABEL, \"true\")\n        .addToLabels(DEV_WORKSPACE_WATCH_SECRET_LABEL, \"true\")\n        .addToLabels(\"app.kubernetes.io/part-of\", \"che.eclipse.org\")\n        .addToAnnotations(DEV_WORKSPACE_MOUNT_AS_ANNOTATION, \"file\")\n        .addToAnnotations(DEV_WORKSPACE_MOUNT_PATH_ANNOTATION, USER_PROFILE_SECRET_MOUNT_PATH)\n        .endMetadata()\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/WorkspaceServiceAccountConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.common.base.Splitter;\nimport com.google.common.collect.Sets;\nimport java.util.Collections;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesWorkspaceServiceAccount;\n\n/**\n * This {@link NamespaceConfigurator} ensures that workspace ServiceAccount with proper ClusterRole\n * is set in Workspace namespace.\n */\n@Singleton\npublic class WorkspaceServiceAccountConfigurator implements NamespaceConfigurator {\n\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n\n  private final String serviceAccountName;\n  private final Set<String> clusterRoleNames;\n\n  @Inject\n  public WorkspaceServiceAccountConfigurator(\n      @Nullable @Named(\"che.infra.kubernetes.service_account_name\") String serviceAccountName,\n      @Nullable @Named(\"che.infra.kubernetes.workspace_sa_cluster_roles\") String clusterRoleNames,\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory) {\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n    this.serviceAccountName = serviceAccountName;\n    if (!isNullOrEmpty(clusterRoleNames)) {\n      this.clusterRoleNames =\n          Sets.newHashSet(\n              Splitter.on(\",\").trimResults().omitEmptyStrings().split(clusterRoleNames));\n    } else {\n      this.clusterRoleNames = Collections.emptySet();\n    }\n  }\n\n  @Override\n  public void configure(NamespaceResolutionContext namespaceResolutionContext, String namespaceName)\n      throws InfrastructureException {\n    if (!isNullOrEmpty(serviceAccountName)) {\n      KubernetesWorkspaceServiceAccount workspaceServiceAccount =\n          doCreateServiceAccount(namespaceResolutionContext.getWorkspaceId(), namespaceName);\n      workspaceServiceAccount.prepare();\n    }\n  }\n\n  @VisibleForTesting\n  public KubernetesWorkspaceServiceAccount doCreateServiceAccount(\n      String workspaceId, String namespaceName) {\n    return new KubernetesWorkspaceServiceAccount(\n        workspaceId,\n        namespaceName,\n        serviceAccountName,\n        clusterRoleNames,\n        cheServerKubernetesClientFactory);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/event/PodActionHandler.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event;\n\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.client.Watcher.Action;\n\n/**\n * Defines the handling mechanism for Kubernetes pod action events.\n *\n * @author Anton Korneta\n */\npublic interface PodActionHandler {\n\n  /** Handles the pod action events. */\n  void handle(Action action, Pod pod);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/event/PodEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event;\n\nimport java.util.Objects;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * The event that should be published when the pod event occurs, e.g. pulling image, created\n * container\n *\n * @author Sergii Leshchenko\n */\npublic class PodEvent {\n  private final String podName;\n  @Nullable private final String containerName;\n  private final String reason;\n  private final String message;\n  private final String creationTimestamp;\n  private final String lastTimestamp;\n\n  public PodEvent(\n      String podName,\n      String containerName,\n      String reason,\n      String message,\n      String creationTimestamp,\n      String lastTimestamp) {\n    this.podName = podName;\n    this.containerName = containerName;\n    this.reason = reason;\n    this.message = message;\n    this.creationTimestamp = creationTimestamp;\n    this.lastTimestamp = lastTimestamp;\n  }\n\n  /** Returns name of pod related to the event. */\n  public String getPodName() {\n    return podName;\n  }\n\n  /**\n   * Returns container name produced by the event. Could be null if the event is related to the pod\n   * but not any particular 'container'\n   */\n  @Nullable\n  public String getContainerName() {\n    return containerName;\n  }\n\n  /** Returns the reason of the event. */\n  public String getReason() {\n    return reason;\n  }\n\n  /** Returns the contents of the event. */\n  public String getMessage() {\n    return message;\n  }\n\n  /** Returns creation timestamp in format '2018-05-15T16:17:54Z' */\n  public String getCreationTimeStamp() {\n    return creationTimestamp;\n  }\n\n  /** Returns last timestamp in format '2018-05-15T16:17:54Z' */\n  public String getLastTimestamp() {\n    return lastTimestamp;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    PodEvent that = (PodEvent) o;\n    return Objects.equals(podName, that.podName)\n        && Objects.equals(containerName, that.containerName)\n        && Objects.equals(reason, that.reason)\n        && Objects.equals(message, that.message)\n        && Objects.equals(creationTimestamp, that.creationTimestamp)\n        && Objects.equals(lastTimestamp, that.lastTimestamp);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(podName, containerName, reason, message, creationTimestamp, lastTimestamp);\n  }\n\n  @Override\n  public String toString() {\n    return \"PodEvent{\"\n        + \"podName='\"\n        + podName\n        + '\\''\n        + \", containerName='\"\n        + containerName\n        + '\\''\n        + \", reason='\"\n        + reason\n        + '\\''\n        + \", message='\"\n        + message\n        + '\\''\n        + \", creationTimestamp='\"\n        + creationTimestamp\n        + '\\''\n        + \", lastTimestamp='\"\n        + lastTimestamp\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/event/PodEventHandler.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event;\n\n/**\n * Defines the handling mechanism for Kubernetes events.\n *\n * @author Sergii Leshchenko\n */\npublic interface PodEventHandler {\n\n  /** Handles the container event. */\n  void handle(PodEvent event);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/log/ContainerLogWatch.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log;\n\nimport com.google.common.base.Stopwatch;\nimport com.google.common.io.ByteStreams;\nimport com.google.gson.JsonObject;\nimport com.google.gson.JsonParseException;\nimport com.google.gson.JsonParser;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.dsl.LogWatch;\nimport java.io.BufferedReader;\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.util.Objects;\nimport java.util.StringJoiner;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * This class is responsible for watching logs in a single container instance. Messages are\n * provided, unbuffered, to a provided {@link PodLogHandler}\n *\n * <p>Reading logs is a blocking operation.\n */\nclass ContainerLogWatch implements Runnable, Closeable {\n\n  private static final Logger LOG = LoggerFactory.getLogger(ContainerLogWatch.class);\n\n  private final KubernetesClient client;\n  private final RuntimeEventsPublisher eventPublisher;\n  private final PodLogHandler logHandler;\n  private final LogWatchTimeouts timeouts;\n  private final long inputStreamLimit;\n\n  private final String namespace;\n  private final String podName;\n  private final String containerName;\n\n  // current LogWatch instance. We need it so we can close it from outside in close() method.\n  private LogWatch currentLogWatch;\n\n  // json parser used to parse log messages to check for errorness\n  private final JsonParser jsonParser = new JsonParser();\n\n  // flag whether we should still try to get the logs\n  private boolean closed = false;\n\n  ContainerLogWatch(\n      KubernetesClient client,\n      RuntimeEventsPublisher eventPublisher,\n      String namespace,\n      String podName,\n      String containerName,\n      PodLogHandler logHandler,\n      LogWatchTimeouts timeouts,\n      long inputStreamLimit) {\n    this.client = client;\n    this.eventPublisher = eventPublisher;\n    this.namespace = namespace;\n    this.podName = podName;\n    this.containerName = containerName;\n    this.logHandler = logHandler;\n    this.timeouts = timeouts;\n    this.inputStreamLimit = inputStreamLimit;\n  }\n\n  /**\n   * Do the best effort to get the logs from the container. The method is trying for {@link\n   * LogWatchTimeouts#getWatchTimeoutMs()} to get the logs from the container. If response on log\n   * request from the k8s is 40x, it possibly means that container is not ready to get the logs and\n   * we'll try again after {@link LogWatchTimeouts#getWaitBeforeNextTry()} milliseconds.\n   */\n  @Override\n  public void run() {\n    Stopwatch stopwatch = Stopwatch.createStarted();\n    // we try to get logs for `timeouts.getWatchTimeoutMs()`\n    while (stopwatch.elapsed(TimeUnit.MILLISECONDS) < timeouts.getWatchTimeoutMs()) {\n\n      // request k8s to get the logs from the container\n      try (LogWatch logWatch =\n          client\n              .pods()\n              .inNamespace(namespace)\n              .withName(podName)\n              .inContainer(containerName)\n              .watchLog()) {\n        eventPublisher.sendWatchLogStartedEvent(containerKey());\n\n        // we need to synchroinze here to avoid adding new `currentLogWatch` after we close it\n        synchronized (this) {\n          if (closed) {\n            return;\n          }\n          currentLogWatch = logWatch;\n        }\n\n        if (currentLogWatch.getOutput() == null\n            || !readAndHandle(\n                ByteStreams.limit(currentLogWatch.getOutput(), inputStreamLimit), logHandler)) {\n          // failed to get the logs this time, so removing this watcher\n          LOG.trace(\n              \"failed to get the logs for '{} : {} : {}'. Container probably still starting after [{}]ms.\",\n              namespace,\n              podName,\n              containerName,\n              stopwatch.elapsed(TimeUnit.MILLISECONDS));\n\n          // wait before next try\n          Thread.sleep(timeouts.getWaitBeforeNextTry());\n        } else {\n          LOG.debug(\n              \"finished watching the logs of '{} : {} : {}'\", namespace, podName, containerName);\n          return;\n        }\n      } catch (InterruptedException e) {\n        LOG.error(\n            \"Failed watch the logs '{} : {} : {}', nothing better to do here.\",\n            namespace,\n            podName,\n            containerName,\n            e);\n        return;\n      } finally {\n        eventPublisher.sendWatchLogStoppedEvent(containerKey());\n      }\n    }\n  }\n\n  /**\n   * Reads given inputStream. If we receive error message about pod is initializing from k8s (see:\n   * {@link ContainerLogWatch#isErrorMessage(String)}, returns false immediately so we can try again\n   * later. Otherwise keeps reading the messages from the stream and gives them to given handler. Be\n   * aware that it is blocking and potentially long operation!\n   *\n   * @param inputStream to read log messages from\n   * @param handler we delegate log messages to this handler.\n   * @return false if error message received from k8s, true at the end of the stream or if\n   *     interrupted\n   */\n  private boolean readAndHandle(InputStream inputStream, PodLogHandler handler) {\n    try (BufferedReader in = new BufferedReader(new InputStreamReader(inputStream))) {\n      String logMessage;\n      while ((logMessage = in.readLine()) != null) {\n        if (!this.isErrorMessage(logMessage)) {\n          handler.handle(logMessage, containerName);\n        } else {\n          LOG.debug(\"error message [{}]\", logMessage);\n          LOG.debug(\n              \"failed to get the logs for [{} : {}], should try again if enough time.\",\n              podName,\n              containerName);\n          return false;\n        }\n      }\n    } catch (IOException e) {\n      // TODO: can we somehow recognize if it is failure or intended close()?\n      LOG.debug(\n          \"End of watching log of [{} : {} : {}]. It could be either intended or some connection failure.\",\n          namespace,\n          podName,\n          containerName);\n      LOG.trace(\"End of watching log of [{} : {} : {}]\", namespace, podName, containerName, e);\n    }\n    return true;\n  }\n\n  /**\n   * Tells whether given `message` is error message so we should try to watch again.\n   *\n   * <p>error message should look like this:\n   *\n   * <pre>\n   *   {\n   *    \"kind\":\"Status\",\n   *    \"apiVersion\":\"v1\",\n   *    \"metadata\":{},\n   *    \"status\":\"Failure\",\n   *    \"message\":\"container \\\"che-plugin-metadata-broker-v3-1-1\\\" in pod\n   *      \\\"workspace1a7u0mmfknhsgzqc.che-plugin-broker\\\" is waiting to start: ContainerCreating\",\n   *    \"reason\":\"BadRequest\",\n   *    \"code\":400}\n   * </pre>\n   *\n   * <p>Regular message is usually not a json, so we first try to find pod name. That should\n   * eliminate close to 100% regular messages to being checked for error, because container app\n   * should not know where it runs. If this initial check fails, we try to parse the message as a\n   * json and match it for more details.\n   *\n   * @param message to check\n   * @return true if message is an json error message, false otherwise\n   */\n  private boolean isErrorMessage(String message) {\n    if (!message.contains(podName)) {\n      return false;\n    }\n    try {\n      JsonObject json = jsonParser.parse(message).getAsJsonObject();\n      return !(!\"Status\".equals(json.get(\"kind\").getAsString())\n          || !\"Failure\".equals(json.get(\"status\").getAsString())\n          || !json.has(\"code\")\n          || !json.get(\"code\").getAsString().contains(\"40\"));\n    } catch (JsonParseException jpe) {\n      LOG.debug(\"Cannot parse the message as JSON.\", jpe);\n      return false;\n    }\n  }\n\n  @Override\n  public void close() {\n    synchronized (this) {\n      closed = true;\n      if (currentLogWatch != null) {\n        currentLogWatch.close();\n      }\n    }\n  }\n\n  private String containerKey() {\n    return namespace + \":\" + podName + \":\" + containerName;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    ContainerLogWatch that = (ContainerLogWatch) o;\n    return Objects.equals(namespace, that.namespace)\n        && Objects.equals(podName, that.podName)\n        && Objects.equals(containerName, that.containerName);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(namespace, podName, containerName);\n  }\n\n  @Override\n  public String toString() {\n    return new StringJoiner(\", \", ContainerLogWatch.class.getSimpleName() + \"[\", \"]\")\n        .add(\"namespace='\" + namespace + \"'\")\n        .add(\"podName='\" + podName + \"'\")\n        .add(\"containerName='\" + containerName + \"'\")\n        .toString();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/log/LogWatchTimeouts.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log;\n\n/** Various timeouts used in watching workspace logs logic. All values are in milliseconds. */\npublic class LogWatchTimeouts {\n\n  /** Standard timeouts gentle to io resources. Use this unless you need something more eager. */\n  public static final LogWatchTimeouts DEFAULT = new LogWatchTimeouts(30_000, 2_000, 5_000);\n\n  /** Aggressive timeouts for more short-lived tasks. */\n  public static final LogWatchTimeouts AGGRESSIVE = new LogWatchTimeouts(5_000, 100, 2_500);\n\n  private final long watchTimeoutMs;\n  private final long waitBetweenTriesMs;\n  private final long waitBeforeCleanupMs;\n\n  public LogWatchTimeouts(long watchTimeoutMs, long waitBetweenTriesMs, long waitBeforeCleanupMs) {\n    this.watchTimeoutMs = watchTimeoutMs;\n    this.waitBetweenTriesMs = waitBetweenTriesMs;\n    this.waitBeforeCleanupMs = waitBeforeCleanupMs;\n  }\n\n  /**\n   * How long we should try watch the logs.\n   *\n   * @return timeout in ms\n   */\n  public long getWatchTimeoutMs() {\n    return watchTimeoutMs;\n  }\n\n  /**\n   * How long to block cleanup to get all container logs.\n   *\n   * @return timeout in ms\n   */\n  public long getWaitBeforeCleanupMs() {\n    return waitBeforeCleanupMs;\n  }\n\n  /**\n   * How long to wait between individual tries to get container logs.\n   *\n   * @return timeout in ms\n   */\n  public long getWaitBeforeNextTry() {\n    return waitBetweenTriesMs;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/log/LogWatcher.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log;\n\nimport static org.eclipse.che.api.workspace.shared.Constants.DEBUG_WORKSPACE_START;\nimport static org.eclipse.che.api.workspace.shared.Constants.DEBUG_WORKSPACE_START_LOG_LIMIT_BYTES;\n\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport java.io.Closeable;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.StringJoiner;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.Executor;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEventHandler;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * This class watches workspace's pod events and tries to read the logs of all its containers.\n *\n * <p>Current implementation uses provided thread-pool and each container log watch session runs in\n * separate thread from this thread-pool.\n *\n * <p>Watching logs of individual containers is delegated to instances of {@link ContainerLogWatch}.\n */\npublic class LogWatcher implements PodEventHandler, Closeable {\n\n  private static final Logger LOG = LoggerFactory.getLogger(LogWatcher.class);\n\n  // 10MB\n  public static final Long DEFAULT_LOG_LIMIT_BYTES = 10L * 1024 * 1024;\n\n  private static final String STARTED_EVENT_REASON = \"Started\";\n\n  private final KubernetesClient client;\n  private final RuntimeEventsPublisher eventsPublisher;\n  private final Set<PodLogHandler> logHandlers = ConcurrentHashMap.newKeySet();\n  private final Executor containerWatchersThreadPool;\n  private final LogWatchTimeouts timeouts;\n  private final long inputStreamLimit;\n\n  private final String namespace;\n  private final String workspaceId;\n  private final Set<String> podsOfInterest;\n\n  private boolean closed = false;\n\n  /**\n   * Map of current watchers where key is name of the container and value is {@link\n   * ContainerLogWatch} instance.\n   */\n  private final Map<String, ContainerLogWatch> currentContainerWatchers = new ConcurrentHashMap<>();\n\n  public LogWatcher(\n      KubernetesClientFactory clientFactory,\n      RuntimeEventsPublisher eventsPublisher,\n      String workspaceId,\n      String namespace,\n      Set<String> podsOfInterest,\n      Executor executor,\n      LogWatchTimeouts timeouts,\n      long inputStreamLimit)\n      throws InfrastructureException {\n    this.client = clientFactory.create(workspaceId);\n    this.eventsPublisher = eventsPublisher;\n    this.workspaceId = workspaceId;\n    this.namespace = namespace;\n    this.containerWatchersThreadPool = executor;\n    this.timeouts = timeouts;\n    this.podsOfInterest = podsOfInterest;\n    this.inputStreamLimit = inputStreamLimit;\n  }\n\n  public void addLogHandler(PodLogHandler handler) {\n    logHandlers.add(handler);\n  }\n\n  @Override\n  public void handle(PodEvent event) {\n    final String podName = event.getPodName();\n\n    final String containerName = event.getContainerName();\n    if (containerName != null && event.getReason().equals(STARTED_EVENT_REASON)) {\n      for (PodLogHandler logHandler : logHandlers) {\n        // we need to synchronize here so we won't add new watcher while we're cleaning them\n        synchronized (this) {\n          if (closed) {\n            return;\n          }\n          if (podsOfInterest.contains(podName)\n              && !currentContainerWatchers.containsKey(podContainerKey(podName, containerName))) {\n            ContainerLogWatch logWatch =\n                new ContainerLogWatch(\n                    client,\n                    eventsPublisher,\n                    namespace,\n                    podName,\n                    containerName,\n                    logHandler,\n                    timeouts,\n                    inputStreamLimit);\n            currentContainerWatchers.put(podContainerKey(podName, containerName), logWatch);\n            LOG.trace(\n                \"adding [{}] to watching containers now watching [{}]\",\n                containerName,\n                currentContainerWatchers.keySet());\n            containerWatchersThreadPool.execute(logWatch);\n          } else {\n            LOG.debug(\n                \"Not for this handler or already watching '{} : {} : {}'\",\n                namespace,\n                podName,\n                containerName);\n          }\n        }\n      }\n    }\n  }\n\n  private String podContainerKey(String podName, String containerName) {\n    return podName + \":\" + containerName;\n  }\n\n  public void close() {\n    this.close(false);\n  }\n\n  /**\n   * Closes all opened log watchers. In case of failed workspace, we want to block the pod for some\n   * time before removing it so we have better chance to get all the logs from it. If that's the\n   * case, use {@code needWait=false}. Otherwise watchers will be cleaned immediately, which does\n   * not ensure that we get all the logs.\n   *\n   * @param needWait true if we need to pause before cleanup\n   */\n  public void close(boolean needWait) {\n    try {\n      if (needWait) {\n        LOG.debug(\n            \"Waiting '{}ms' before closing all log watchers for workspace '{}'.\",\n            timeouts.getWaitBeforeCleanupMs(),\n            workspaceId);\n        Thread.sleep(timeouts.getWaitBeforeCleanupMs());\n      }\n    } catch (InterruptedException e) {\n      LOG.error(\n          \"Interrupted while waiting before closing the log watch for workspace '{}'.\",\n          workspaceId,\n          e);\n    } finally {\n      LOG.debug(\"Closing all log watchers for '{}'\", workspaceId);\n      synchronized (this) {\n        closed = true;\n        currentContainerWatchers.values().forEach(ContainerLogWatch::close);\n        currentContainerWatchers.clear();\n      }\n    }\n  }\n\n  @Override\n  public String toString() {\n    return new StringJoiner(\", \", LogWatcher.class.getSimpleName() + \"[\", \"]\")\n        .add(\"namespace='\" + namespace + \"'\")\n        .add(\"workspaceId='\" + workspaceId + \"'\")\n        .toString();\n  }\n\n  /**\n   * Gets log limit bytes from given `startOptions` if it's set there under {@link\n   * org.eclipse.che.api.workspace.shared.Constants#DEBUG_WORKSPACE_START_LOG_LIMIT_BYTES} key.\n   * Otherwise returns default {@link LogWatcher#DEFAULT_LOG_LIMIT_BYTES}.\n   *\n   * @param startOptions options where we'll try to find log limit param\n   * @return valid log limit bytes\n   */\n  public static long getLogLimitBytes(Map<String, String> startOptions) {\n    if (startOptions == null\n        || startOptions.isEmpty()\n        || !startOptions.containsKey(DEBUG_WORKSPACE_START_LOG_LIMIT_BYTES)) {\n      return DEFAULT_LOG_LIMIT_BYTES;\n    } else {\n      try {\n        return Long.parseLong(startOptions.get(DEBUG_WORKSPACE_START_LOG_LIMIT_BYTES));\n      } catch (NumberFormatException nfe) {\n        LOG.debug(\n            \"failed to parse log limit bytes value from startOptions. Value '{}'\",\n            startOptions.get(DEBUG_WORKSPACE_START_LOG_LIMIT_BYTES),\n            nfe);\n        return DEFAULT_LOG_LIMIT_BYTES;\n      }\n    }\n  }\n\n  /**\n   * Takes `startOptions` map and tells whether it's set so we should watch the logs. To return\n   * true, flag must be stored under {@link\n   * org.eclipse.che.api.workspace.shared.Constants#DEBUG_WORKSPACE_START} key.\n   *\n   * @param startOptions options where we'll try to find log watch flag\n   * @return true if we should watch the logs, false otherwise\n   */\n  public static boolean shouldWatchLogs(Map<String, String> startOptions) {\n    if (startOptions == null || startOptions.isEmpty()) {\n      return false;\n    }\n    return Boolean.parseBoolean(\n        startOptions.getOrDefault(DEBUG_WORKSPACE_START, Boolean.FALSE.toString()));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/log/PodLogHandler.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log;\n\n/**\n * Handle log message of the pod's container. Implementors must be also aware of pods that are\n * interest of this handler.\n */\npublic interface PodLogHandler {\n\n  /**\n   * Receives single log message and do something with it. It receives also containerName so we can\n   * better format the message for the end-user.\n   *\n   * @param message single log message\n   * @param containerName source container of this log message\n   */\n  void handle(String message, String containerName);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/log/PodLogToEventPublisher.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log;\n\nimport java.time.ZonedDateTime;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** This class is responsible for reading the logs. It is aware of machines it should follow. */\npublic class PodLogToEventPublisher implements PodLogHandler {\n\n  private final Logger LOG = LoggerFactory.getLogger(this.getClass());\n\n  private final String LOG_MESSAGE_FORMAT = \"[%s] -> %s\";\n\n  private final RuntimeEventsPublisher eventsPublisher;\n  private final RuntimeIdentity identity;\n\n  public PodLogToEventPublisher(RuntimeEventsPublisher eventsPublisher, RuntimeIdentity identity) {\n    this.eventsPublisher = eventsPublisher;\n    this.identity = identity;\n  }\n\n  /**\n   * Receives the message, formats it and send it to {@link PodLogToEventPublisher#eventsPublisher}\n   *\n   * @param message to handle\n   * @param containerName source container of the log message\n   */\n  @Override\n  public void handle(String message, String containerName) {\n    LOG.trace(\"forwarding message '{}' from the container '{}'\", message, containerName);\n    eventsPublisher.sendRuntimeLogEvent(\n        String.format(LOG_MESSAGE_FORMAT, containerName, message),\n        ZonedDateTime.now().toString(),\n        identity);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/log/event/WatchLogStartedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.event;\n\nimport java.util.Objects;\nimport java.util.StringJoiner;\n\n/**\n * This event should be fired when WatchLog instance started and there is active connection to k8s\n * API watching logs of particular container.\n */\npublic class WatchLogStartedEvent {\n\n  private final String container;\n\n  public WatchLogStartedEvent(String container) {\n    this.container = container;\n  }\n\n  public String getContainer() {\n    return container;\n  }\n\n  @Override\n  public String toString() {\n    return new StringJoiner(\", \", WatchLogStartedEvent.class.getSimpleName() + \"[\", \"]\")\n        .add(\"container='\" + container + \"'\")\n        .toString();\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    WatchLogStartedEvent that = (WatchLogStartedEvent) o;\n    return Objects.equals(container, that.container);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(container);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/log/event/WatchLogStoppedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.event;\n\nimport java.util.Objects;\nimport java.util.StringJoiner;\n\n/**\n * This event should be fired when WatchLog instance stopped and particular container's logs are no\n * longer watched.\n */\npublic class WatchLogStoppedEvent {\n\n  private final String container;\n\n  public WatchLogStoppedEvent(String container) {\n    this.container = container;\n  }\n\n  public String getContainer() {\n    return container;\n  }\n\n  @Override\n  public String toString() {\n    return new StringJoiner(\", \", WatchLogStoppedEvent.class.getSimpleName() + \"[\", \"]\")\n        .add(\"container='\" + container + \"'\")\n        .toString();\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    WatchLogStoppedEvent that = (WatchLogStoppedEvent) o;\n    return Objects.equals(container, that.container);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(container);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/CertificateProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.common.collect.ImmutableMap;\nimport com.google.inject.Inject;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.api.model.SecretVolumeSourceBuilder;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport io.fabric8.kubernetes.api.model.VolumeMountBuilder;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodRole;\n\n/**\n * Mount configured self-signed certificate as file in each workspace machines if configured.\n *\n * @author Sergii Leshchenko\n */\n@Singleton\npublic class CertificateProvisioner implements ConfigurationProvisioner<KubernetesEnvironment> {\n\n  public static final String CHE_SELF_SIGNED_CERT_SECRET_SUFFIX = \"-che-self-signed-cert\";\n  public static final String CHE_SELF_SIGNED_CERT_VOLUME = \"che-self-signed-cert\";\n  public static final String CERT_MOUNT_PATH = \"/tmp/che/secret/\";\n  public static final String CA_CERT_FILE = \"ca.crt\";\n\n  @Inject(optional = true)\n  @Named(\"che.self_signed_cert\")\n  private String certificate;\n\n  public CertificateProvisioner() {}\n\n  @VisibleForTesting\n  CertificateProvisioner(String certificate) {\n    this.certificate = certificate;\n  }\n\n  public boolean isConfigured() {\n    return !isNullOrEmpty(certificate);\n  }\n\n  public String getCertPath() {\n    return CERT_MOUNT_PATH + CA_CERT_FILE;\n  }\n\n  @Override\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n    if (!isConfigured()) {\n      return;\n    }\n    String selfSignedCertSecretName =\n        identity.getWorkspaceId() + CHE_SELF_SIGNED_CERT_SECRET_SUFFIX;\n    k8sEnv\n        .getSecrets()\n        .put(\n            selfSignedCertSecretName,\n            new SecretBuilder()\n                .withNewMetadata()\n                .withName(selfSignedCertSecretName)\n                .endMetadata()\n                .withStringData(ImmutableMap.of(CA_CERT_FILE, certificate))\n                .build());\n\n    for (PodData pod : k8sEnv.getPodsData().values()) {\n      if (pod.getRole() == PodRole.DEPLOYMENT) {\n        if (pod.getSpec().getVolumes().stream()\n            .noneMatch(v -> v.getName().equals(CHE_SELF_SIGNED_CERT_VOLUME))) {\n          pod.getSpec().getVolumes().add(buildCertSecretVolume(selfSignedCertSecretName));\n        }\n      }\n\n      for (Container container : pod.getSpec().getInitContainers()) {\n        provisionCertVolumeMountIfNeeded(container);\n      }\n      for (Container container : pod.getSpec().getContainers()) {\n        provisionCertVolumeMountIfNeeded(container);\n      }\n    }\n  }\n\n  private void provisionCertVolumeMountIfNeeded(Container container) {\n    if (container.getVolumeMounts().stream()\n        .noneMatch(vm -> vm.getName().equals(CHE_SELF_SIGNED_CERT_VOLUME))) {\n      container.getVolumeMounts().add(buildCertVolumeMount());\n    }\n  }\n\n  private VolumeMount buildCertVolumeMount() {\n    return new VolumeMountBuilder()\n        .withName(CHE_SELF_SIGNED_CERT_VOLUME)\n        .withReadOnly(true)\n        .withMountPath(CERT_MOUNT_PATH)\n        .build();\n  }\n\n  private Volume buildCertSecretVolume(String secretName) {\n    return new VolumeBuilder()\n        .withName(CHE_SELF_SIGNED_CERT_VOLUME)\n        .withSecret(new SecretVolumeSourceBuilder().withSecretName(secretName).build())\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/ConfigurationProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * Modifies workspace environment configuration and Kubernetes environment with everything needed.\n *\n * @author Anton Korneta\n */\npublic interface ConfigurationProvisioner<T extends KubernetesEnvironment> {\n\n  /**\n   * Configures the Kubernetes environment and workspace environment with infrastructure needs.\n   *\n   * @param k8sEnv Kubernetes environment\n   * @param identity runtime identity\n   * @throws InfrastructureException when any error occurs\n   */\n  void provision(T k8sEnv, RuntimeIdentity identity) throws InfrastructureException;\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/GatewayRouterProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVICE_NAME_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVICE_PORT_ATTRIBUTE;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.GatewayRouteConfigGenerator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.GatewayRouteConfigGeneratorFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.GatewayConfigmapLabels;\n\n/**\n * This provisioner finds {@link ConfigMap}s, that configures the single-host Gateway, generates\n * Gateway configuration and puts it into their data.\n *\n * <p>It uses {@link GatewayRouteConfigGenerator} to generate the gateway configuration.\n */\npublic class GatewayRouterProvisioner implements ConfigurationProvisioner<KubernetesEnvironment> {\n\n  private final GatewayRouteConfigGeneratorFactory configGeneratorFactory;\n  private final GatewayConfigmapLabels configmapLabels;\n\n  @Inject\n  public GatewayRouterProvisioner(\n      GatewayRouteConfigGeneratorFactory configGeneratorFactory,\n      GatewayConfigmapLabels configmapLabels) {\n    this.configGeneratorFactory = configGeneratorFactory;\n    this.configmapLabels = configmapLabels;\n  }\n\n  @Override\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n    for (Entry<String, ConfigMap> configMapEntry : k8sEnv.getConfigMaps().entrySet()) {\n      if (configmapLabels.isGatewayConfig(configMapEntry.getValue())) {\n        ConfigMap gatewayConfigMap = configMapEntry.getValue();\n\n        Map<String, ServerConfigImpl> servers =\n            new Annotations.Deserializer(gatewayConfigMap.getMetadata().getAnnotations()).servers();\n        if (servers.size() != 1) {\n          throw new InfrastructureException(\n              \"Expected exactly 1 server in gateway config ConfigMap's '\"\n                  + gatewayConfigMap.getMetadata().getName()\n                  + \"' annotations. This is a bug, please report.\");\n        }\n        Entry<String, ServerConfigImpl> serverConfigEntry = servers.entrySet().iterator().next();\n        ServerConfigImpl server = serverConfigEntry.getValue();\n\n        if (!server.getAttributes().containsKey(SERVICE_NAME_ATTRIBUTE)\n            || !server.getAttributes().containsKey(SERVICE_PORT_ATTRIBUTE)) {\n          throw new InfrastructureException(\n              \"Expected `serviceName` and `servicePort` in gateway config ServerConfig attributes for gateway config Configmap '\"\n                  + gatewayConfigMap.getMetadata().getName()\n                  + \"'. This is a bug, please report.\");\n        }\n\n        // We're now creating only 1 gateway route configuration per ConfigMap, so we need to create\n        // generator in each loop iteration.\n        GatewayRouteConfigGenerator gatewayRouteConfigGenerator = configGeneratorFactory.create();\n        gatewayRouteConfigGenerator.addRouteConfig(configMapEntry.getKey(), gatewayConfigMap);\n\n        Map<String, String> gatewayConfiguration =\n            gatewayRouteConfigGenerator.generate(identity.getInfrastructureNamespace());\n        gatewayConfigMap.setData(gatewayConfiguration);\n\n        // Configuration is now generated, so remove these internal attributes\n        server.getAttributes().remove(SERVICE_NAME_ATTRIBUTE);\n        server.getAttributes().remove(SERVICE_PORT_ATTRIBUTE);\n        gatewayConfigMap\n            .getMetadata()\n            .getAnnotations()\n            .putAll(\n                new Annotations.Serializer()\n                    .server(serverConfigEntry.getKey(), server)\n                    .annotations());\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/GatewayTlsProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisioner.getSecureProtocol;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.WorkspaceExposureType;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.GatewayConfigmapLabels;\n\n/**\n * Enables Transport Layer Security (TLS) for external server implemented with gateway ConfigMaps.\n */\n@Singleton\npublic class GatewayTlsProvisioner<T extends KubernetesEnvironment>\n    implements ConfigurationProvisioner<T>, TlsProvisioner<T> {\n\n  private final boolean isTlsEnabled;\n  private final GatewayConfigmapLabels configmapLabels;\n  private final TlsProvisioner<T> nativeProvisioner;\n\n  @Inject\n  public GatewayTlsProvisioner(\n      @Named(\"che.infra.kubernetes.tls_enabled\") boolean isTlsEnabled,\n      GatewayConfigmapLabels configmapLabels,\n      TlsProvisionerProvider<T> provisionerProvider) {\n    this.isTlsEnabled = isTlsEnabled;\n    this.configmapLabels = configmapLabels;\n    this.nativeProvisioner = provisionerProvider.get(WorkspaceExposureType.NATIVE);\n  }\n\n  @Override\n  public void provision(T k8sEnv, RuntimeIdentity identity) throws InfrastructureException {\n    if (!isTlsEnabled) {\n      return;\n    }\n\n    for (ConfigMap configMap : k8sEnv.getConfigMaps().values()) {\n      if (configmapLabels.isGatewayConfig(configMap)) {\n        useSecureProtocolForGatewayConfigMap(configMap);\n      }\n    }\n\n    nativeProvisioner.provision(k8sEnv, identity);\n  }\n\n  private void useSecureProtocolForGatewayConfigMap(ConfigMap configMap)\n      throws InfrastructureException {\n    Map<String, ServerConfigImpl> servers =\n        Annotations.newDeserializer(configMap.getMetadata().getAnnotations()).servers();\n\n    if (servers.isEmpty()) {\n      return;\n    }\n    if (servers.size() != 1) {\n      throw new InfrastructureException(\n          \"Expected exactly 1 server in Gateway configuration ConfigMap '\"\n              + configMap.getMetadata().getName()\n              + \"'. This is a bug, please report.\");\n    }\n    Entry<String, ServerConfigImpl> serverConfigEntry = servers.entrySet().iterator().next();\n    ServerConfigImpl serverConfig = serverConfigEntry.getValue();\n\n    serverConfig.setProtocol(getSecureProtocol(serverConfig.getProtocol()));\n    configMap\n        .getMetadata()\n        .getAnnotations()\n        .putAll(\n            Annotations.newSerializer()\n                .server(serverConfigEntry.getKey(), serverConfig)\n                .annotations());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/GitConfigProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static java.util.Optional.empty;\nimport static java.util.Optional.of;\n\nimport com.google.gson.Gson;\nimport com.google.gson.JsonSyntaxException;\nimport com.google.gson.reflect.TypeToken;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.api.model.ConfigMapVolumeSourceBuilder;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport io.fabric8.kubernetes.api.model.VolumeMountBuilder;\nimport java.lang.reflect.Type;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.user.server.PreferenceManager;\nimport org.eclipse.che.api.user.server.UserManager;\nimport org.eclipse.che.api.workspace.server.model.impl.WarningImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Warnings;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodRole;\n\n@Singleton\npublic class GitConfigProvisioner implements ConfigurationProvisioner<KubernetesEnvironment> {\n\n  public static final String GIT_CONFIG_MAP_NAME = \"gitconfig\";\n\n  private static final String GIT_BASE_CONFIG_PATH = \"/etc/\";\n  public static final String GIT_CONFIG = \"gitconfig\";\n  private static final String GIT_CONFIG_PATH = GIT_BASE_CONFIG_PATH + GIT_CONFIG;\n  private static final String PREFERENCES_KEY_FILTER = \"theia-user-preferences\";\n  private static final String GIT_USER_NAME_PROPERTY = \"git.user.name\";\n  private static final String GIT_USER_EMAIL_PROPERTY = \"git.user.email\";\n  private static final String CONFIG_MAP_VOLUME_NAME = \"gitconfigvolume\";\n  private static final String HTTPS = \"https://\";\n\n  private PreferenceManager preferenceManager;\n  private UserManager userManager;\n  private VcsSslCertificateProvisioner vcsSslCertificateProvisioner;\n\n  @Inject\n  public GitConfigProvisioner(\n      PreferenceManager preferenceManager,\n      UserManager userManager,\n      VcsSslCertificateProvisioner vcsSslCertificateProvisioner) {\n    this.preferenceManager = preferenceManager;\n    this.userManager = userManager;\n    this.vcsSslCertificateProvisioner = vcsSslCertificateProvisioner;\n  }\n\n  @Override\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n\n    try {\n      Pair<String, String> userAndEmail = getUserFromPreferences();\n\n      if (userAndEmail == null) {\n        userAndEmail = getUserFromUserManager();\n      }\n\n      prepareAndProvisionGitConfiguration(\n          userAndEmail.first, userAndEmail.second, k8sEnv, identity);\n    } catch (ServerException | NotFoundException e) {\n      reportWarning(\n          k8sEnv,\n          Warnings.EXCEPTION_IN_USER_MANAGEMENT_DURING_GIT_PROVISION_WARNING_CODE,\n          format(\n              Warnings.EXCEPTION_IN_USER_MANAGEMENT_DURING_GIT_PROVISION_MESSAGE_FMT,\n              e.getMessage()));\n    } catch (JsonSyntaxException e) {\n      reportWarning(\n          k8sEnv,\n          Warnings.JSON_IS_NOT_A_VALID_REPRESENTATION_FOR_AN_OBJECT_OF_TYPE_WARNING_CODE,\n          format(\n              Warnings.JSON_IS_NOT_A_VALID_REPRESENTATION_FOR_AN_OBJECT_OF_TYPE_MESSAGE_FMT,\n              e.getMessage()));\n    }\n  }\n\n  private void reportWarning(KubernetesEnvironment k8sEnv, int code, String message) {\n    k8sEnv.getWarnings().add(new WarningImpl(code, message));\n  }\n\n  private Pair<String, String> getUserFromPreferences()\n      throws ServerException, JsonSyntaxException {\n    String preferenceJson = getPreferenceJson(PREFERENCES_KEY_FILTER);\n    Map<String, Object> preferences = getMapFromJsonObject(preferenceJson);\n\n    String name = getStringValueOrNull(preferences, GIT_USER_NAME_PROPERTY);\n    String email = getStringValueOrNull(preferences, GIT_USER_EMAIL_PROPERTY);\n\n    return isNullOrEmpty(name) && isNullOrEmpty(email) ? null : Pair.of(name, email);\n  }\n\n  private Pair<String, String> getUserFromUserManager() throws NotFoundException, ServerException {\n    String userId = EnvironmentContext.getCurrent().getSubject().getUserId();\n    User user = userManager.getById(userId);\n\n    return Pair.of(user.getName(), user.getEmail());\n  }\n\n  private void prepareAndProvisionGitConfiguration(\n      String name, String email, KubernetesEnvironment k8sEnv, RuntimeIdentity identity) {\n    prepareGitConfigurationContent(name, email)\n        .ifPresent(content -> doProvisionGitConfiguration(GIT_CONFIG_MAP_NAME, content, k8sEnv));\n  }\n\n  private String getStringValueOrNull(Map<String, Object> map, String key) {\n    Object value = map.get(key);\n\n    return value instanceof String ? (String) value : null;\n  }\n\n  private Map<String, Object> getMapFromJsonObject(String json) throws JsonSyntaxException {\n    if (isNullOrEmpty(json)) {\n      return emptyMap();\n    }\n\n    Type typeToken = new TypeToken<Map<String, Object>>() {}.getType();\n\n    /*\n    The main idea to implicit cast map from string:object to string:string is that,\n    we're looking for a two specific properties in the end, that have 100% string values,\n    so we don't care about what we have in other properties.\n    */\n\n    return new Gson().fromJson(json, typeToken);\n  }\n\n  private String getPreferenceJson(String keyFilter) throws ServerException {\n    String userId = EnvironmentContext.getCurrent().getSubject().getUserId();\n    Map<String, String> preferencesMap = preferenceManager.find(userId, keyFilter);\n\n    return preferencesMap.get(keyFilter);\n  }\n\n  private Optional<String> prepareGitConfigurationContent(String userName, String userEmail) {\n    if (isNullOrEmpty(userName) && isNullOrEmpty(userEmail)) {\n      return empty();\n    }\n\n    StringBuilder config = new StringBuilder();\n    config.append(\"[user]\").append('\\n');\n\n    if (userName != null) {\n      config.append('\\t').append(\"name = \").append(userName).append('\\n');\n    }\n\n    if (userEmail != null) {\n      config.append('\\t').append(\"email = \").append(userEmail).append('\\n');\n    }\n\n    if (vcsSslCertificateProvisioner.isConfigured()) {\n      String host = vcsSslCertificateProvisioner.getGitServerHost();\n\n      // Will add leading scheme (https://) if it not provide in configuration.\n      // If host not configured wil return empty string, it will means that\n      // provided certificate will used for all https connections.\n\n      StringBuilder gitServerHosts = new StringBuilder();\n      if (!isNullOrEmpty(host)) {\n        gitServerHosts.append(\" \\\"\");\n        if (!host.startsWith(HTTPS)) {\n          gitServerHosts.append(HTTPS);\n        }\n        gitServerHosts.append(host);\n        gitServerHosts.append(\"\\\"\");\n      }\n\n      config\n          .append(\"[http\")\n          .append(gitServerHosts.toString())\n          .append(\"]\")\n          .append('\\n')\n          .append('\\t')\n          .append(\"sslCAInfo = \")\n          .append(vcsSslCertificateProvisioner.getCertPath());\n    }\n\n    return of(config.toString());\n  }\n\n  private void doProvisionGitConfiguration(\n      String gitConfigMapName, String gitConfig, KubernetesEnvironment k8sEnv) {\n    Map<String, String> gitConfigData = singletonMap(GIT_CONFIG, gitConfig);\n    ConfigMap configMap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(gitConfigMapName)\n            .endMetadata()\n            .withData(gitConfigData)\n            .build();\n\n    k8sEnv.getConfigMaps().put(configMap.getMetadata().getName(), configMap);\n    k8sEnv\n        .getPodsData()\n        .values()\n        .forEach(\n            p -> mountConfigFile(p.getSpec(), gitConfigMapName, p.getRole() != PodRole.INJECTABLE));\n  }\n\n  private void mountConfigFile(PodSpec podSpec, String gitConfigMapName, boolean addVolume) {\n    if (addVolume) {\n      podSpec\n          .getVolumes()\n          .add(\n              new VolumeBuilder()\n                  .withName(CONFIG_MAP_VOLUME_NAME)\n                  .withConfigMap(\n                      new ConfigMapVolumeSourceBuilder().withName(gitConfigMapName).build())\n                  .build());\n    }\n\n    List<Container> containers = podSpec.getContainers();\n    containers.forEach(\n        container -> {\n          VolumeMount volumeMount =\n              new VolumeMountBuilder()\n                  .withName(CONFIG_MAP_VOLUME_NAME)\n                  .withMountPath(GIT_CONFIG_PATH)\n                  .withSubPath(GIT_CONFIG)\n                  .withReadOnly(false)\n                  .build();\n          container.getVolumeMounts().add(volumeMount);\n        });\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/ImagePullSecretProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport com.google.common.collect.ImmutableList;\nimport com.google.gson.Gson;\nimport com.google.gson.stream.JsonWriter;\nimport io.fabric8.kubernetes.api.model.LocalObjectReference;\nimport io.fabric8.kubernetes.api.model.LocalObjectReferenceBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport java.io.IOException;\nimport java.io.StringWriter;\nimport java.util.Base64;\nimport java.util.List;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto.DockerAuthConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto.DockerAuthConfigs;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.docker.auth.UserSpecificDockerRegistryCredentialsProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * This class allows workspace-related pods the pull images from the private docker registries\n * defined in the Dashboard 'Administration' page, even with the Kubernetes and OpenShift\n * infrastructures. <br>\n * <br>\n * <strong>How it works</strong> <br>\n * When starting a workspace, this provisioner adds an <a\n * href=\"https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod\">{@code\n * imagePullSecret}</a> into environment that reflects the user private registries settings.\n *\n * <p>Then a reference to the created {@code imagePullSecret} is added in each workspace POD\n * specification.\n *\n * @author David Festal\n */\npublic class ImagePullSecretProvisioner implements ConfigurationProvisioner<KubernetesEnvironment> {\n\n  static final String SECRET_NAME_SUFFIX = \"-private-registries\";\n\n  private final UserSpecificDockerRegistryCredentialsProvider credentialsProvider;\n\n  @Inject\n  public ImagePullSecretProvisioner(\n      UserSpecificDockerRegistryCredentialsProvider credentialsProvider) {\n    this.credentialsProvider = credentialsProvider;\n  }\n\n  @Override\n  @Traced\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n\n    TracingTags.WORKSPACE_ID.set(identity::getWorkspaceId);\n\n    DockerAuthConfigs credentials = credentialsProvider.getCredentials();\n    if (credentials == null) {\n      return;\n    }\n\n    Map<String, DockerAuthConfig> authConfigs = credentials.getConfigs();\n\n    if (authConfigs == null || authConfigs.isEmpty()) {\n      return;\n    }\n\n    String encodedConfig =\n        Base64.getEncoder().encodeToString(generateDockerCfg(authConfigs).getBytes());\n\n    Secret secret =\n        new SecretBuilder()\n            .addToData(\".dockercfg\", encodedConfig)\n            .withType(\"kubernetes.io/dockercfg\")\n            .withNewMetadata()\n            .withName(identity.getWorkspaceId() + SECRET_NAME_SUFFIX)\n            .endMetadata()\n            .build();\n\n    k8sEnv.getSecrets().put(secret.getMetadata().getName(), secret);\n\n    k8sEnv\n        .getPodsData()\n        .values()\n        .forEach(p -> addImagePullSecret(secret.getMetadata().getName(), p.getSpec()));\n  }\n\n  /**\n   * Generates a dockercfg file with the authentication information contained in the given {@code\n   * authConfigs} parameter.\n   *\n   * <p>The syntax of the produced <code>dockercfg</code> file is as follow:\n   *\n   * <pre><code>\n   *   {\n   *     \"private.repo.1\" : {\n   *        \"username\": \"theUsername1\",\n   *        \"password\": \"thePassword1\",\n   *        \"email\": \"theEmail1\",\n   *        \"auth\": \"<base64 encoding of username:password>\",\n   *      },\n   *     \"private.repo.2\" : {\n   *        \"username\": \"theUsername2\",\n   *        \"password\": \"thePassword2\",\n   *        \"email\": \"theEmail2\",\n   *        \"auth\": \"<base64 encoding of username:password>\",\n   *      }\n   *   }\n   * </code></pre>\n   */\n  private String generateDockerCfg(Map<String, DockerAuthConfig> authConfigs)\n      throws InfrastructureException {\n    try (StringWriter strWriter = new StringWriter();\n        JsonWriter jsonWriter = new Gson().newJsonWriter(strWriter)) {\n      Base64.Encoder encoder = Base64.getEncoder();\n\n      jsonWriter.beginObject();\n      for (Map.Entry<String, DockerAuthConfig> entry : authConfigs.entrySet()) {\n        String name = entry.getKey();\n        DockerAuthConfig dockerAuthConfig = entry.getValue();\n        try {\n          if (!name.startsWith(\"https://\") && !name.startsWith(\"http://\")) {\n            name = \"https://\" + name;\n          }\n          jsonWriter.name(name);\n          jsonWriter.beginObject();\n          jsonWriter.name(\"username\");\n          jsonWriter.value(dockerAuthConfig.getUsername());\n          jsonWriter.name(\"password\");\n          jsonWriter.value(dockerAuthConfig.getPassword());\n          jsonWriter.name(\"email\");\n          jsonWriter.value(\"email@email\");\n          String auth = dockerAuthConfig.getUsername() + ':' + dockerAuthConfig.getPassword();\n          jsonWriter.name(\"auth\");\n          jsonWriter.value(encoder.encodeToString(auth.getBytes()));\n          jsonWriter.endObject();\n        } catch (IOException e) {\n          throw new InfrastructureException(\n              \"Unexpected exception occurred while building the 'ImagePullSecret' from private docker registry user preferences\",\n              e);\n        }\n      }\n\n      jsonWriter.endObject();\n      jsonWriter.flush();\n      return strWriter.toString();\n    } catch (IOException e) {\n      throw new InfrastructureException(e);\n    }\n  }\n\n  private void addImagePullSecret(String secretName, PodSpec podSpec) {\n    List<LocalObjectReference> imagePullSecrets = podSpec.getImagePullSecrets();\n    podSpec.setImagePullSecrets(\n        ImmutableList.<LocalObjectReference>builder()\n            .add(new LocalObjectReferenceBuilder().withName(secretName).build())\n            .addAll(imagePullSecrets)\n            .build());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/IngressTlsProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisioner.getSecureProtocol;\n\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressTLS;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressTLSBuilder;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.inject.ConfigurationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * Enables Transport Layer Security (TLS) for external server ingresses\n *\n * @author Guy Daich\n */\n@Singleton\npublic class IngressTlsProvisioner\n    implements ConfigurationProvisioner<KubernetesEnvironment>,\n        TlsProvisioner<KubernetesEnvironment> {\n  static final String TLS_SECRET_TYPE = \"kubernetes.io/tls\";\n\n  private final boolean isTlsEnabled;\n  private final String tlsSecretName;\n  private final String tlsCert;\n  private final String tlsKey;\n\n  @Inject\n  public IngressTlsProvisioner(\n      @Named(\"che.infra.kubernetes.tls_enabled\") boolean isTlsEnabled,\n      @Named(\"che.infra.kubernetes.tls_secret\") String tlsSecretName,\n      @Nullable @Named(\"che.infra.kubernetes.tls_cert\") String tlsCert,\n      @Nullable @Named(\"che.infra.kubernetes.tls_key\") String tlsKey) {\n    this.isTlsEnabled = isTlsEnabled;\n    this.tlsSecretName = tlsSecretName;\n\n    if (isNullOrEmpty(tlsCert) != isNullOrEmpty(tlsKey)) {\n      throw new ConfigurationException(\n          \"None or both of `che.infra.kubernetes.tls_cert` and \"\n              + \"`che.infra.kubernetes.tls_key` must be configured with non-null value.\");\n    }\n    this.tlsCert = tlsCert;\n    this.tlsKey = tlsKey;\n  }\n\n  @Override\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws KubernetesInfrastructureException {\n    if (!isTlsEnabled) {\n      return;\n    }\n\n    String wsTlsSecretName = tlsSecretName;\n\n    if (!isNullOrEmpty(tlsCert) && !isNullOrEmpty(tlsKey)) {\n      wsTlsSecretName = identity.getWorkspaceId() + '-' + tlsSecretName;\n      provisionTlsSecret(k8sEnv, wsTlsSecretName);\n    }\n\n    for (Ingress ingress : k8sEnv.getIngresses().values()) {\n      useSecureProtocolForIngressServers(ingress);\n      enableTLS(ingress, wsTlsSecretName);\n    }\n  }\n\n  private void provisionTlsSecret(KubernetesEnvironment k8sEnv, String wsTlsSecretName) {\n    Map<String, String> data = new HashMap<>();\n    data.put(\"tls.crt\", tlsCert);\n    data.put(\"tls.key\", tlsKey);\n\n    Secret tlsSecret =\n        new SecretBuilder()\n            .withNewMetadata()\n            .withName(wsTlsSecretName)\n            .endMetadata()\n            .withStringData(data)\n            .withType(TLS_SECRET_TYPE)\n            .build();\n\n    k8sEnv.getSecrets().put(wsTlsSecretName, tlsSecret);\n  }\n\n  private void enableTLS(Ingress ingress, String wsTlsSecretName) {\n    String host = ingress.getSpec().getRules().get(0).getHost();\n\n    IngressTLSBuilder ingressTLSBuilder = new IngressTLSBuilder().withHosts(host);\n\n    // according to ingress tls spec, secret name is optional\n    // when working in single-host mode, nginx controller wil reuse the che-master secret\n    // https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/api/extensions/v1beta1/types.go\n    if (!isNullOrEmpty(wsTlsSecretName)) {\n      ingressTLSBuilder.withSecretName(wsTlsSecretName);\n    }\n\n    IngressTLS ingressTLS = ingressTLSBuilder.build();\n    List<IngressTLS> ingressTLSList = new ArrayList<>(Collections.singletonList(ingressTLS));\n    ingress.getSpec().setTls(ingressTLSList);\n  }\n\n  private void useSecureProtocolForIngressServers(final Ingress ingress) {\n    Map<String, ServerConfigImpl> servers =\n        Annotations.newDeserializer(ingress.getMetadata().getAnnotations()).servers();\n\n    if (servers.isEmpty()) {\n      return;\n    }\n\n    servers.values().forEach(s -> s.setProtocol(getSecureProtocol(s.getProtocol())));\n\n    Map<String, String> annotations = Annotations.newSerializer().servers(servers).annotations();\n\n    ingress.getMetadata().getAnnotations().putAll(annotations);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/KubernetesCheApiExternalEnvVarProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.CheApiExternalEnvVarProvider;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * Provides env variable to Kubernetes machine with url of Che API.\n *\n * @author Mykhailo Kuznietsov\n */\npublic class KubernetesCheApiExternalEnvVarProvider implements CheApiExternalEnvVarProvider {\n\n  private final String cheServerEndpoint;\n\n  @Inject\n  public KubernetesCheApiExternalEnvVarProvider(@Named(\"che.api\") String cheServerEndpoint) {\n    this.cheServerEndpoint = cheServerEndpoint;\n  }\n\n  @Override\n  public Pair<String, String> get(RuntimeIdentity runtimeIdentity) throws InfrastructureException {\n    return Pair.of(CHE_API_EXTERNAL_VARIABLE, cheServerEndpoint);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/KubernetesCheApiInternalEnvVarProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.CheApiInternalEnvVarProvider;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * Provides env variable to Kubernetes machine with url of Che API.\n *\n * @author Mykhailo Kuznietsov\n */\npublic class KubernetesCheApiInternalEnvVarProvider implements CheApiInternalEnvVarProvider {\n\n  private final String cheServerEndpoint;\n\n  @Inject\n  public KubernetesCheApiInternalEnvVarProvider(\n      @Nullable @Named(\"che.api.internal\") String cheServerEndpoint) {\n    this.cheServerEndpoint = cheServerEndpoint;\n  }\n\n  @Override\n  public Pair<String, String> get(RuntimeIdentity runtimeIdentity) throws InfrastructureException {\n    if (isNullOrEmpty(this.cheServerEndpoint)) {\n      return null;\n    }\n    return Pair.of(CHE_API_INTERNAL_VARIABLE, cheServerEndpoint);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/KubernetesPreviewUrlCommandProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressRule;\nimport java.util.List;\nimport java.util.Optional;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.Ingresses;\n\n/**\n * Extends {@link PreviewUrlCommandProvisioner} where needed. For Kubernetes, we work with {@link\n * Ingress}es and {@link KubernetesNamespace}.\n */\n@Singleton\npublic class KubernetesPreviewUrlCommandProvisioner\n    extends PreviewUrlCommandProvisioner<KubernetesEnvironment, Ingress> {\n\n  @Override\n  protected List<Ingress> loadExposureObjects(KubernetesNamespace namespace)\n      throws InfrastructureException {\n    return namespace.ingresses().get();\n  }\n\n  @Override\n  protected Optional<String> findHostForServicePort(\n      List<Ingress> ingresses, Service service, int port) {\n    return Ingresses.findIngressRuleForServicePort(ingresses, service, port)\n        .map(IngressRule::getHost);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/NamespaceProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport io.fabric8.kubernetes.api.model.Namespace;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.workspace.server.model.impl.RuntimeIdentityImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.NamespaceConfigurator;\n\n/**\n * Provisions the k8s {@link Namespace}. After provisioning, configures the namespace through {@link\n * NamespaceConfigurator}.\n *\n * @author Pavol Baran\n */\npublic class NamespaceProvisioner {\n  private final KubernetesNamespaceFactory namespaceFactory;\n\n  @Inject\n  public NamespaceProvisioner(KubernetesNamespaceFactory namespaceFactory) {\n    this.namespaceFactory = namespaceFactory;\n  }\n\n  /** Tests for this method are in KubernetesNamespaceFactoryTest. */\n  public KubernetesNamespaceMeta provision(NamespaceResolutionContext namespaceResolutionContext)\n      throws InfrastructureException {\n    KubernetesNamespace namespace =\n        namespaceFactory.getOrCreate(\n            new RuntimeIdentityImpl(\n                null,\n                null,\n                namespaceResolutionContext.getUserId(),\n                namespaceFactory.evaluateNamespaceName(namespaceResolutionContext)));\n\n    return namespaceFactory\n        .fetchNamespace(namespace.getName())\n        .orElseThrow(\n            () -> new InfrastructureException(\"Not able to find namespace \" + namespace.getName()));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/PodTerminationGracePeriodProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\n\n/**\n * Adds grace termination period to workspace pods.\n *\n * <p>Note: if `terminationGracePeriodSeconds` have been explicitly set in Kubernetes / OpenShift\n * recipe it will not be overridden\n *\n * @author Ilya Buziuk (ibuziuk@redhat.com)\n */\npublic class PodTerminationGracePeriodProvisioner implements ConfigurationProvisioner {\n  private final long graceTerminationPeriodSec;\n\n  @Inject\n  public PodTerminationGracePeriodProvisioner(\n      @Named(\"che.infra.kubernetes.pod.termination_grace_period_sec\")\n          long graceTerminationPeriodSec) {\n    this.graceTerminationPeriodSec = graceTerminationPeriodSec;\n  }\n\n  @Override\n  @Traced\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n\n    TracingTags.WORKSPACE_ID.set(identity::getWorkspaceId);\n\n    for (PodData pod : k8sEnv.getPodsData().values()) {\n      if (!isTerminationGracePeriodSet(pod.getSpec())) {\n        pod.getSpec().setTerminationGracePeriodSeconds(getGraceTerminationPeriodSec(k8sEnv));\n      }\n    }\n  }\n\n  /**\n   * Returns true if 'terminationGracePeriodSeconds' have been explicitly set in Kubernetes /\n   * OpenShift recipe, false otherwise\n   */\n  private boolean isTerminationGracePeriodSet(final PodSpec podSpec) {\n    return podSpec.getTerminationGracePeriodSeconds() != null;\n  }\n\n  private long getGraceTerminationPeriodSec(KubernetesEnvironment k8sEnv) {\n    return graceTerminationPeriodSec;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/PreviewUrlCommandProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static org.eclipse.che.api.core.model.workspace.config.Command.PREVIEW_URL_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Warnings.NOT_ABLE_TO_PROVISION_OBJECTS_FOR_PREVIEW_URL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Warnings.NOT_ABLE_TO_PROVISION_OBJECTS_FOR_PREVIEW_URL_MESSAGE;\n\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WarningImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.Services;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Updates commands with proper Preview URL attribute.\n *\n * <p>Goes through all {@link CommandImpl}s in given {@link KubernetesEnvironment} and for ones that\n * have defined Preview URL tries to find matching {@link Service} and {@link Ingress} from given\n * {@link KubernetesNamespace}. When found, it composes full URL and set it as attribute of a\n * command with key {@link\n * org.eclipse.che.api.core.model.workspace.config.Command#PREVIEW_URL_ATTRIBUTE}.\n *\n * @param <E> type of the environment\n */\npublic abstract class PreviewUrlCommandProvisioner<\n    E extends KubernetesEnvironment, T extends HasMetadata> {\n\n  private static final Logger LOG = LoggerFactory.getLogger(PreviewUrlCommandProvisioner.class);\n\n  public void provision(E env, KubernetesNamespace namespace) throws InfrastructureException {\n    injectsPreviewUrlToCommands(env, namespace);\n  }\n\n  /**\n   * Go through all commands, find matching service and exposed host. Then construct full preview\n   * url from this data and set it as Command's parameter under `previewUrl` key.\n   *\n   * @param env environment to get commands\n   * @param namespace current kubernetes namespace where we're looking for services and ingresses\n   */\n  private void injectsPreviewUrlToCommands(E env, KubernetesNamespace namespace)\n      throws InfrastructureException {\n    if (env.getCommands() == null) {\n      return;\n    }\n\n    List<T> exposureObjects = loadExposureObjects(namespace);\n    List<Service> services = namespace.services().get();\n    for (CommandImpl command :\n        env.getCommands().stream()\n            .filter(c -> c.getPreviewUrl() != null)\n            .collect(Collectors.toList())) {\n      Optional<Service> foundService =\n          Services.findServiceWithPort(services, command.getPreviewUrl().getPort());\n      if (!foundService.isPresent()) {\n        String message =\n            String.format(\n                \"unable to find service for port '%s' for command '%s'\",\n                command.getPreviewUrl().getPort(), command.getName());\n        LOG.warn(message);\n        env.addWarning(\n            new WarningImpl(\n                NOT_ABLE_TO_PROVISION_OBJECTS_FOR_PREVIEW_URL,\n                String.format(NOT_ABLE_TO_PROVISION_OBJECTS_FOR_PREVIEW_URL_MESSAGE, message)));\n        continue;\n      }\n\n      Optional<String> foundHost =\n          findHostForServicePort(\n              exposureObjects, foundService.get(), command.getPreviewUrl().getPort());\n      if (foundHost.isPresent()) {\n        command.getAttributes().put(PREVIEW_URL_ATTRIBUTE, foundHost.get());\n      } else {\n        String message =\n            String.format(\n                \"unable to find ingress for service '%s' and port '%s'\",\n                foundService.get(), command.getPreviewUrl().getPort());\n        LOG.warn(message);\n        env.addWarning(\n            new WarningImpl(\n                NOT_ABLE_TO_PROVISION_OBJECTS_FOR_PREVIEW_URL,\n                String.format(NOT_ABLE_TO_PROVISION_OBJECTS_FOR_PREVIEW_URL_MESSAGE, message)));\n      }\n    }\n  }\n\n  /**\n   * Loads exposure objects of running infrastructure. Kubernetes implementation should return\n   * `List<Ingress>`, OpenShift implementation `List<Route>`.\n   */\n  protected abstract List<T> loadExposureObjects(KubernetesNamespace namespace)\n      throws InfrastructureException;\n\n  protected abstract Optional<String> findHostForServicePort(\n      List<T> ingressList, Service service, int port) throws InternalInfrastructureException;\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/SecurityContextProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport io.fabric8.kubernetes.api.model.PodSecurityContextBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * @author Sergii Leshchenko\n */\npublic class SecurityContextProvisioner implements ConfigurationProvisioner<KubernetesEnvironment> {\n\n  private final Long runAsUser;\n  private final Long fsGroup;\n\n  @Inject\n  public SecurityContextProvisioner(\n      @Nullable @Named(\"che.infra.kubernetes.pod.security_context.run_as_user\") String runAsUser,\n      @Nullable @Named(\"che.infra.kubernetes.pod.security_context.fs_group\") String fsGroup) {\n    this.runAsUser = runAsUser == null ? null : Long.parseLong(runAsUser);\n    this.fsGroup = fsGroup == null ? null : Long.parseLong(fsGroup);\n  }\n\n  @Override\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n    if (runAsUser != null) {\n      k8sEnv.getPodsData().values().forEach(p -> provision(p.getSpec()));\n    }\n  }\n\n  public void provision(PodSpec podSpec) {\n    podSpec.setSecurityContext(\n        new PodSecurityContextBuilder().withRunAsUser(runAsUser).withFsGroup(fsGroup).build());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/ServiceAccountProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\n\n/**\n * Sets the service account to workspace pods if configured.\n *\n * <p>Service account won't be set to pods if property value is `NULL` and then Kubernetes\n * infrastructure will set default one.\n *\n * @author Sergii Leshchenko\n */\n@Singleton\npublic class ServiceAccountProvisioner implements ConfigurationProvisioner {\n\n  private final String serviceAccount;\n\n  @Inject\n  public ServiceAccountProvisioner(\n      @Nullable @Named(\"che.infra.kubernetes.service_account_name\") String serviceAccount) {\n    this.serviceAccount = serviceAccount;\n  }\n\n  @Override\n  @Traced\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n\n    TracingTags.WORKSPACE_ID.set(identity::getWorkspaceId);\n\n    if (!isNullOrEmpty(serviceAccount)) {\n      for (PodData pod : k8sEnv.getPodsData().values()) {\n        pod.getSpec().setServiceAccountName(serviceAccount);\n        pod.getSpec().setAutomountServiceAccountToken(true);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/SshKeysProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.Collections.singletonList;\nimport static java.util.stream.Collectors.toList;\nimport static java.util.stream.Collectors.toMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Warnings.NOT_ABLE_TO_PROVISION_SSH_KEYS;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Warnings.NOT_ABLE_TO_PROVISION_SSH_KEYS_MESSAGE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.isValidConfigMapKeyName;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.api.model.ConfigMapVolumeSourceBuilder;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.api.model.SecretVolumeSourceBuilder;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport io.fabric8.kubernetes.api.model.VolumeMountBuilder;\nimport jakarta.validation.constraints.NotNull;\nimport java.time.ZonedDateTime;\nimport java.util.ArrayList;\nimport java.util.Base64;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.regex.Pattern;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.ssh.server.SshManager;\nimport org.eclipse.che.api.ssh.server.model.impl.SshPairImpl;\nimport org.eclipse.che.api.ssh.shared.model.SshPair;\nimport org.eclipse.che.api.workspace.server.model.impl.WarningImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Warnings;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodRole;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * This class allows mount user SSH Keys as <a\n * href=\"https://kubernetes.io/docs/concepts/configuration/secret\">Kubernetes Secrets</a> on each\n * workspace container.<br>\n *\n * <p><strong>How it works:</strong>\n *\n * <ul>\n *   <li>all registered SSH Keys are fetched;\n *   <li>create single K8s Secret with opaque type for storing SSH keys;\n *   <li>in following secret key represents host name and value contains private SSH key;\n *   <li>each key and value in secret is represented on file system by the following structure:\n *       '/etc/ssh/private/{hostName}/ssh-privatekey', where <code>hostName</code> is a key taken\n *       from secret and <code>ssh-privatekey</code> is a file that contains SSH private key taking\n *       by the following key name;\n *   <li>for VCS keys, ConfigMap with SSH settings is created and mounted to container by path\n *       '/etc/ssh/ssh_config'.\n * </ul>\n *\n * @author Vitalii Parfonov\n * @author Vlad Zhukovskyi\n */\npublic class SshKeysProvisioner implements ConfigurationProvisioner<KubernetesEnvironment> {\n\n  private static String SSH_BASE_CONFIG_PATH = \"/etc/ssh/\";\n\n  private static final String SSH_PRIVATE_KEYS = \"private\";\n  private static final String SSH_PRIVATE_KEYS_PATH = SSH_BASE_CONFIG_PATH + SSH_PRIVATE_KEYS;\n\n  private static final String SSH_CONFIG = \"ssh_config\";\n  private static final String SSH_CONFIG_PATH = SSH_BASE_CONFIG_PATH + SSH_CONFIG;\n\n  private static final String SSH_CONFIG_MAP_NAME = \"sshconfigmap\";\n  private static final String SSH_SECRET_NAME_SUFFIX = \"-sshprivatekeys\";\n\n  private static final String SSH_SECRET_TYPE = \"opaque\";\n\n  public static final Pattern VALID_DOMAIN_PATTERN =\n      Pattern.compile(\"^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\");\n\n  private static final Logger LOG = LoggerFactory.getLogger(SshKeysProvisioner.class);\n\n  private final SshManager sshManager;\n  private final RuntimeEventsPublisher runtimeEventsPublisher;\n\n  @Inject\n  public SshKeysProvisioner(SshManager sshManager, RuntimeEventsPublisher runtimeEventsPublisher) {\n    this.sshManager = sshManager;\n    this.runtimeEventsPublisher = runtimeEventsPublisher;\n  }\n\n  @Override\n  @Traced\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n    String workspaceId = identity.getWorkspaceId();\n    TracingTags.WORKSPACE_ID.set(workspaceId);\n\n    List<SshPairImpl> vcsSshPairs = getVcsSshPairs(k8sEnv, identity);\n    List<SshPairImpl> systemSshPairs = getSystemSshPairs(k8sEnv, identity);\n\n    List<SshPairImpl> allSshPairs = new ArrayList<>(vcsSshPairs);\n    allSshPairs.addAll(systemSshPairs);\n\n    List<String> invalidSshKeyNames =\n        allSshPairs.stream()\n            .filter(keyPair -> !isValidSshKeyPair(keyPair))\n            .map(SshPairImpl::getName)\n            .collect(toList());\n\n    if (!invalidSshKeyNames.isEmpty()) {\n      String message =\n          format(\n              Warnings.SSH_KEYS_WILL_NOT_BE_MOUNTED_MESSAGE,\n              invalidSshKeyNames.toString(),\n              identity.getWorkspaceId());\n      LOG.warn(message);\n      k8sEnv.addWarning(new WarningImpl(Warnings.SSH_KEYS_WILL_NOT_BE_MOUNTED, message));\n      runtimeEventsPublisher.sendRuntimeLogEvent(message, ZonedDateTime.now().toString(), identity);\n    }\n\n    doProvisionSshKeys(\n        allSshPairs.stream().filter(this::isValidSshKeyPair).collect(toList()),\n        k8sEnv,\n        workspaceId);\n    doProvisionVcsSshConfig(\n        vcsSshPairs.stream().filter(this::isValidSshKeyPair).collect(toList()),\n        k8sEnv,\n        workspaceId);\n  }\n\n  /**\n   * Return list of keys related to the VCS (Version Control Systems), Git, SVN and etc. Usually\n   * managed by user\n   *\n   * @param identity\n   * @return list of ssh pairs\n   */\n  private List<SshPairImpl> getVcsSshPairs(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n    List<SshPairImpl> sshPairs;\n    try {\n      sshPairs = sshManager.getPairs(identity.getOwnerId(), \"vcs\");\n    } catch (ServerException e) {\n      String message = format(\"Unable to get SSH Keys. Cause: %s\", e.getMessage());\n      LOG.warn(message);\n      k8sEnv.addWarning(\n          new WarningImpl(\n              NOT_ABLE_TO_PROVISION_SSH_KEYS,\n              format(NOT_ABLE_TO_PROVISION_SSH_KEYS_MESSAGE, message)));\n      throw new InfrastructureException(e);\n    }\n    if (sshPairs.isEmpty()) {\n      try {\n        sshPairs =\n            singletonList(\n                sshManager.generatePair(\n                    identity.getOwnerId(), \"vcs\", \"default-\" + new Date().getTime()));\n      } catch (ServerException | ConflictException e) {\n        String message =\n            format(\"Unable to generate the initial SSH key. Cause: %s\", e.getMessage());\n        LOG.warn(message);\n        k8sEnv.addWarning(\n            new WarningImpl(\n                NOT_ABLE_TO_PROVISION_SSH_KEYS,\n                format(NOT_ABLE_TO_PROVISION_SSH_KEYS_MESSAGE, message)));\n        throw new InfrastructureException(e);\n      }\n    }\n    return sshPairs;\n  }\n\n  /**\n   * Return system (aka 'internal') ssh keys, this key used for internal services like rsync via ssh\n   * and etc. Not generated or managed by a user\n   *\n   * @param identity\n   * @return list of keys pair\n   */\n  private List<SshPairImpl> getSystemSshPairs(KubernetesEnvironment k8sEn, RuntimeIdentity identity)\n      throws InfrastructureException {\n    List<SshPairImpl> sshPairs;\n    try {\n      sshPairs = sshManager.getPairs(identity.getOwnerId(), \"internal\");\n    } catch (ServerException e) {\n      String message = format(\"Unable to get SSH Keys. Cause: %s\", e.getMessage());\n      LOG.warn(message);\n      k8sEn.addWarning(\n          new WarningImpl(\n              NOT_ABLE_TO_PROVISION_SSH_KEYS,\n              format(NOT_ABLE_TO_PROVISION_SSH_KEYS_MESSAGE, message)));\n      throw new InfrastructureException(e);\n    }\n    return sshPairs;\n  }\n\n  private void doProvisionSshKeys(\n      List<SshPairImpl> sshPairs, KubernetesEnvironment k8sEnv, String wsId) {\n\n    Map<String, String> data =\n        sshPairs.stream()\n            .filter(sshPair -> !isNullOrEmpty(sshPair.getPrivateKey()))\n            .collect(\n                toMap(\n                    SshPairImpl::getName,\n                    sshPair ->\n                        Base64.getEncoder().encodeToString(sshPair.getPrivateKey().getBytes())));\n\n    Secret secret =\n        new SecretBuilder()\n            .addToData(data)\n            .withType(SSH_SECRET_TYPE)\n            .withNewMetadata()\n            .withName(wsId + SSH_SECRET_NAME_SUFFIX)\n            .endMetadata()\n            .build();\n\n    k8sEnv.getSecrets().put(secret.getMetadata().getName(), secret);\n\n    k8sEnv\n        .getPodsData()\n        .values()\n        .forEach(\n            p -> {\n              mountSshKeySecret(\n                  secret.getMetadata().getName(), p.getSpec(), p.getRole() != PodRole.INJECTABLE);\n            });\n  }\n\n  private void mountSshKeySecret(String secretName, PodSpec podSpec, boolean addVolume) {\n    if (addVolume) {\n      podSpec\n          .getVolumes()\n          .add(\n              new VolumeBuilder()\n                  .withName(secretName)\n                  .withSecret(\n                      new SecretVolumeSourceBuilder()\n                          .withSecretName(secretName)\n                          .withDefaultMode(0600)\n                          .build())\n                  .build());\n    }\n\n    List<Container> containers = podSpec.getContainers();\n    containers.forEach(\n        container -> {\n          VolumeMount volumeMount =\n              new VolumeMountBuilder()\n                  .withName(secretName)\n                  .withReadOnly(true)\n                  .withMountPath(SSH_PRIVATE_KEYS_PATH)\n                  .build();\n          container.getVolumeMounts().add(volumeMount);\n        });\n  }\n\n  private void doProvisionVcsSshConfig(\n      List<SshPairImpl> vcsSshPairs, KubernetesEnvironment k8sEnv, String wsId) {\n    StringBuilder sshConfigData = new StringBuilder();\n    for (SshPair sshPair : vcsSshPairs) {\n      sshConfigData.append(buildConfig(sshPair.getName()));\n    }\n\n    Map<String, String> sshConfig = new HashMap<>();\n    sshConfig.put(SSH_CONFIG, sshConfigData.toString());\n    ConfigMap configMap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(SSH_CONFIG_MAP_NAME)\n            .endMetadata()\n            .withData(sshConfig)\n            .build();\n\n    k8sEnv.getConfigMaps().put(configMap.getMetadata().getName(), configMap);\n    k8sEnv\n        .getPodsData()\n        .values()\n        .forEach(\n            p ->\n                mountConfigFile(\n                    p.getSpec(), SSH_CONFIG_MAP_NAME, p.getRole() != PodRole.INJECTABLE));\n  }\n\n  private void mountConfigFile(PodSpec podSpec, String sshConfigMapName, boolean addVolume) {\n    String configMapVolumeName = \"ssshkeyconfigvolume\";\n    if (addVolume) {\n      podSpec\n          .getVolumes()\n          .add(\n              new VolumeBuilder()\n                  .withName(configMapVolumeName)\n                  .withConfigMap(\n                      new ConfigMapVolumeSourceBuilder().withName(sshConfigMapName).build())\n                  .build());\n    }\n\n    List<Container> containers = podSpec.getContainers();\n    containers.forEach(\n        container -> {\n          VolumeMount volumeMount =\n              new VolumeMountBuilder()\n                  .withName(configMapVolumeName)\n                  .withMountPath(SSH_CONFIG_PATH)\n                  .withSubPath(SSH_CONFIG)\n                  .withReadOnly(true)\n                  .build();\n          container.getVolumeMounts().add(volumeMount);\n        });\n  }\n\n  @VisibleForTesting\n  boolean isValidSshKeyPair(SshPairImpl keyPair) {\n    return isValidConfigMapKeyName(keyPair.getName())\n        && VALID_DOMAIN_PATTERN.matcher(keyPair.getName()).matches();\n  }\n\n  /**\n   * Returns the ssh configuration entry which includes host, identity file location and Host Key\n   * checking policy\n   *\n   * <p>Example of provided configuration:\n   *\n   * <pre>\n   * host github.com\n   * IdentityFile /etc/ssh/private/github-com/ssh-privatekey\n   * StrictHostKeyChecking = no\n   * </pre>\n   *\n   * or\n   *\n   * <pre>\n   * host *\n   * IdentityFile /etc/ssh/private/default-123456/ssh-privatekey\n   * StrictHostKeyChecking = no\n   * </pre>\n   *\n   * @param name the of key given during generate for vcs service we will consider it as host of\n   *     version control service (e.g. github.com, gitlab.com and etc) if name starts from\n   *     \"default-{anyString}\" it will be replaced on wildcard \"*\" host name. Name with format\n   *     \"default-{anyString}\" will be generated on client side by Theia SSH Plugin, if user doesn't\n   *     provide own name. Details see here:\n   *     https://github.com/eclipse/che/issues/13494#issuecomment-512761661. Note: behavior can be\n   *     improved in 7.x releases after 7.0.0\n   * @return the ssh configuration which include host, identity file location and Host Key checking\n   *     policy\n   */\n  private String buildConfig(@NotNull String name) {\n    String host = name.startsWith(\"default-\") ? \"*\" : name;\n    return \"host \"\n        + host\n        + \"\\nIdentityFile \"\n        + SSH_PRIVATE_KEYS_PATH\n        + \"/\"\n        + name\n        + \"\\nStrictHostKeyChecking = no\"\n        + \"\\n\\n\";\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/TlsProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * Enables TLS on underlying endpoints implementation. Implementation of this interface must check\n * that tls is enabled - `che.infra.kubernetes.tls_enabled=true`.\n *\n * @param <T> environment type\n */\npublic interface TlsProvisioner<T extends KubernetesEnvironment> {\n\n  /**\n   * If TLS enabled, updates protocol to secure one and ensures that underlying exposure objects are\n   * properly configured.\n   *\n   * @throws InfrastructureException in case of any infrastructure failure\n   */\n  void provision(T k8sEnv, RuntimeIdentity identity) throws InfrastructureException;\n\n  /**\n   * Returns the secure version of the provided protocol or the same protocol if the conversion is\n   * not known. Currently only understands \"ws\" and \"http\".\n   */\n  static String getSecureProtocol(final String protocol) {\n    if (\"ws\".equals(protocol)) {\n      return \"wss\";\n    } else if (\"http\".equals(protocol)) {\n      return \"https\";\n    } else {\n      return protocol;\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/TlsProvisionerProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.AbstractExposureStrategyAwareProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.WorkspaceExposureType;\n\n/**\n * Provides {@link TlsProvisioner} based on `che.infra.kubernetes.server_strategy` and\n * `che.infra.kubernetes.singlehost.workspace.exposure` properties.\n *\n * @param <T> type of environment\n */\npublic class TlsProvisionerProvider<T extends KubernetesEnvironment>\n    extends AbstractExposureStrategyAwareProvider<TlsProvisioner<T>> {\n\n  @Inject\n  public TlsProvisionerProvider(\n      @Named(\"che.infra.kubernetes.server_strategy\") String exposureStrategy,\n      @Named(\"che.infra.kubernetes.singlehost.workspace.exposure\") String wsExposureType,\n      Map<WorkspaceExposureType, TlsProvisioner<T>> mapping) {\n    super(\n        exposureStrategy,\n        wsExposureType,\n        mapping,\n        \"Could not initialize TLS provisioners for workspace exposure type '%s'.\");\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/UniqueNamesProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putLabel;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapEnvSource;\nimport io.fabric8.kubernetes.api.model.ConfigMapKeySelector;\nimport io.fabric8.kubernetes.api.model.ConfigMapVolumeSource;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Constants;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\n\n/**\n * Makes names of Kubernetes pods, ingresses and config maps unique whole namespace by {@link\n * Names}.\n *\n * <p>Original names will be stored in {@link Constants#CHE_ORIGINAL_NAME_LABEL} label of renamed\n * object.\n *\n * @author Anton Korneta\n * @see Names#uniqueResourceName(String, String)\n * @see Names#generateName(String)\n */\n@Singleton\npublic class UniqueNamesProvisioner<T extends KubernetesEnvironment>\n    implements ConfigurationProvisioner<T> {\n\n  @Override\n  @Traced\n  public void provision(T k8sEnv, RuntimeIdentity identity) throws InfrastructureException {\n    final String workspaceId = identity.getWorkspaceId();\n\n    TracingTags.WORKSPACE_ID.set(workspaceId);\n\n    final Map<String, ConfigMap> configMaps = k8sEnv.getConfigMaps();\n    Map<String, String> configMapNameTranslation = new HashMap<>();\n    for (ConfigMap configMap : configMaps.values()) {\n      final String originalName = configMap.getMetadata().getName();\n      putLabel(configMap.getMetadata(), Constants.CHE_ORIGINAL_NAME_LABEL, originalName);\n      final String uniqueName = Names.uniqueResourceName(originalName, workspaceId);\n      configMap.getMetadata().setName(uniqueName);\n      configMapNameTranslation.put(originalName, uniqueName);\n    }\n\n    final Collection<PodData> podData = k8sEnv.getPodsData().values();\n    for (PodData pod : podData) {\n      final ObjectMeta podMeta = pod.getMetadata();\n      putLabel(podMeta, Constants.CHE_ORIGINAL_NAME_LABEL, podMeta.getName());\n      final String podName = Names.uniqueResourceName(podMeta.getName(), workspaceId);\n      podMeta.setName(podName);\n      if (configMapNameTranslation.size() > 0) {\n        rewriteConfigMapNames(pod, configMapNameTranslation);\n      }\n    }\n\n    // We explicitly need to modify the deployments in the environment to provision unique names\n    // for them.\n    final Collection<Deployment> deployments = k8sEnv.getDeploymentsCopy().values();\n    for (Deployment deployment : deployments) {\n      final ObjectMeta deploymentMeta = deployment.getMetadata();\n      final String originalName = deploymentMeta.getName();\n      putLabel(deploymentMeta, Constants.CHE_ORIGINAL_NAME_LABEL, originalName);\n      final String deploymentName = Names.uniqueResourceName(originalName, workspaceId);\n      deploymentMeta.setName(deploymentName);\n    }\n\n    final Set<Ingress> ingresses = new HashSet<>(k8sEnv.getIngresses().values());\n    k8sEnv.getIngresses().clear();\n    for (Ingress ingress : ingresses) {\n      final ObjectMeta ingressMeta = ingress.getMetadata();\n      putLabel(ingress, Constants.CHE_ORIGINAL_NAME_LABEL, ingressMeta.getName());\n      final String ingressName = Names.generateName(\"ingress\");\n      ingressMeta.setName(ingressName);\n      k8sEnv.getIngresses().put(ingressName, ingress);\n    }\n  }\n\n  private void rewriteConfigMapNames(PodData pod, Map<String, String> configMapNameTranslation) {\n    // First update any env vars that reference configMaps.\n    for (Container container : pod.getSpec().getContainers()) {\n      // Can set env vars to key/value pairs in configmap\n      if (container.getEnv() != null) {\n        container.getEnv().stream()\n            .filter(\n                env ->\n                    env.getValueFrom() != null && env.getValueFrom().getConfigMapKeyRef() != null)\n            .forEach(\n                env -> {\n                  ConfigMapKeySelector configMap = env.getValueFrom().getConfigMapKeyRef();\n                  String originalName = configMap.getName();\n                  // Since pods can reference configmaps that don't exist, we only change the name\n                  // if the configmap does exist to aid debugging recipes (otherwise message is just\n                  // null).\n                  if (configMapNameTranslation.containsKey(originalName)) {\n                    configMap.setName(configMapNameTranslation.get(originalName));\n                  }\n                });\n      }\n      if (container.getEnvFrom() != null) {\n        // Can use all entries in configMap as env vars\n        container.getEnvFrom().stream()\n            .filter(envFrom -> envFrom.getConfigMapRef() != null)\n            .forEach(\n                envFrom -> {\n                  ConfigMapEnvSource configMapRef = envFrom.getConfigMapRef();\n                  String originalName = configMapRef.getName();\n                  if (configMapNameTranslation.containsKey(originalName)) {\n                    configMapRef.setName(configMapNameTranslation.get(originalName));\n                  }\n                });\n      }\n    }\n    // Next update any mounted configMaps\n    List<Volume> volumes = pod.getSpec().getVolumes();\n    if (pod.getSpec().getVolumes() != null) {\n      volumes.stream()\n          .filter(vol -> vol.getConfigMap() != null)\n          .forEach(\n              volume -> {\n                ConfigMapVolumeSource configMapVolume = volume.getConfigMap();\n                String originalName = configMapVolume.getName();\n                if (configMapNameTranslation.containsKey(originalName)) {\n                  configMapVolume.setName(configMapNameTranslation.get(originalName));\n                }\n              });\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/VcsSslCertificateProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.util.Collections.singletonMap;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.inject.Inject;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.api.model.ConfigMapVolumeSourceBuilder;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport io.fabric8.kubernetes.api.model.VolumeMountBuilder;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodRole;\n\n/**\n * Mount configured self-signed certificate for git provider as file in each workspace machines if\n * configured.\n *\n * @author Vitalii Parfonov\n */\n@Singleton\npublic class VcsSslCertificateProvisioner\n    implements ConfigurationProvisioner<KubernetesEnvironment> {\n  static final String CHE_GIT_SELF_SIGNED_CERT_CONFIG_MAP_SUFFIX = \"-che-git-self-signed-cert\";\n  static final String CHE_GIT_SELF_SIGNED_VOLUME = \"che-git-self-signed-cert\";\n  static final String CERT_MOUNT_PATH = \"/etc/che/git/cert/\";\n  static final String CA_CERT_FILE = \"ca.crt\";\n\n  @Inject(optional = true)\n  @Named(\"che.git.self_signed_cert\")\n  private String certificate;\n\n  @Inject(optional = true)\n  @Named(\"che.git.self_signed_cert_host\")\n  private String host;\n\n  public VcsSslCertificateProvisioner() {}\n\n  @VisibleForTesting\n  VcsSslCertificateProvisioner(String certificate, String host) {\n    this.certificate = certificate;\n    this.host = host;\n  }\n\n  /**\n   * @return true only if system configured for using self-signed certificate fot https git\n   *     operation\n   */\n  public boolean isConfigured() {\n    return !isNullOrEmpty(certificate);\n  }\n\n  /**\n   * @return path to the certificate file\n   */\n  public String getCertPath() {\n    return CERT_MOUNT_PATH + CA_CERT_FILE;\n  }\n\n  /**\n   * Return given in configuration git server host (e.g. 110.23.0.1:3000).\n   *\n   * @return git server host for git config if it configured in che.git.self_signed_cert_host\n   */\n  public String getGitServerHost() {\n    return host;\n  }\n\n  @Override\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n    if (!isConfigured()) {\n      return;\n    }\n    String selfSignedCertConfigMapName =\n        identity.getWorkspaceId() + CHE_GIT_SELF_SIGNED_CERT_CONFIG_MAP_SUFFIX;\n    k8sEnv\n        .getConfigMaps()\n        .put(\n            selfSignedCertConfigMapName,\n            new ConfigMapBuilder()\n                .withNewMetadata()\n                .withName(selfSignedCertConfigMapName)\n                .endMetadata()\n                .withData(singletonMap(CA_CERT_FILE, certificate))\n                .build());\n\n    for (PodData pod : k8sEnv.getPodsData().values()) {\n      if (pod.getRole() != PodRole.INJECTABLE) {\n        if (pod.getSpec().getVolumes().stream()\n            .noneMatch(v -> v.getName().equals(CHE_GIT_SELF_SIGNED_VOLUME))) {\n          pod.getSpec().getVolumes().add(buildCertVolume(selfSignedCertConfigMapName));\n        }\n      }\n\n      for (Container container : pod.getSpec().getInitContainers()) {\n        provisionCertVolumeMountIfNeeded(container);\n      }\n      for (Container container : pod.getSpec().getContainers()) {\n        provisionCertVolumeMountIfNeeded(container);\n      }\n    }\n  }\n\n  private void provisionCertVolumeMountIfNeeded(Container container) {\n    if (container.getVolumeMounts().stream()\n        .noneMatch(vm -> vm.getName().equals(CHE_GIT_SELF_SIGNED_VOLUME))) {\n      container.getVolumeMounts().add(buildCertVolumeMount());\n    }\n  }\n\n  private VolumeMount buildCertVolumeMount() {\n    return new VolumeMountBuilder()\n        .withName(CHE_GIT_SELF_SIGNED_VOLUME)\n        .withReadOnly(true)\n        .withMountPath(CERT_MOUNT_PATH)\n        .build();\n  }\n\n  private Volume buildCertVolume(String configMapName) {\n    return new VolumeBuilder()\n        .withName(CHE_GIT_SELF_SIGNED_VOLUME)\n        .withConfigMap(new ConfigMapVolumeSourceBuilder().withName(configMapName).build())\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/env/EnvVarsConverter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.env;\n\nimport static java.util.function.Function.identity;\nimport static java.util.stream.Collectors.toMap;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.EnvVar;\nimport java.util.List;\nimport java.util.Map;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.config.MachineConfig;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.commons.lang.TopologicalSort;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ConfigurationProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.EnvVars;\n\n/**\n * Converts environment variables in {@link MachineConfig} to Kubernetes environment variables.\n *\n * @author Alexander Garagatyi\n */\n@Singleton\npublic class EnvVarsConverter implements ConfigurationProvisioner {\n\n  private final TopologicalSort<EnvVar, String> topoSort =\n      new TopologicalSort<>(EnvVar::getName, EnvVars::extractReferencedVariables);\n\n  @Override\n  @Traced\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n\n    TracingTags.WORKSPACE_ID.set(identity::getWorkspaceId);\n\n    for (PodData pod : k8sEnv.getPodsData().values()) {\n      for (Container container : pod.getSpec().getContainers()) {\n        String machineName = Names.machineName(pod, container);\n        InternalMachineConfig machineConf = k8sEnv.getMachines().get(machineName);\n\n        // we need to combine the env vars from the machine config with the variables already\n        // present in the container. Let's key the variables by name and use the map for merging\n        Map<String, EnvVar> envVars =\n            machineConf.getEnv().entrySet().stream()\n                .map(e -> new EnvVar(e.getKey(), e.getValue(), null))\n                .collect(toMap(EnvVar::getName, identity()));\n\n        // the env vars defined in our machine config take precedence over the ones already defined\n        // in the container, if any\n        container.getEnv().forEach(v -> envVars.putIfAbsent(v.getName(), v));\n\n        // The environment variable expansion only works if a variable that is referenced\n        // is already defined earlier in the list of environment variables.\n        // We need to produce a list where variables that reference others always appear later\n        // in the list.\n\n        List<EnvVar> sorted = topoSort.sort(envVars.values());\n\n        container.setEnv(sorted);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/limits/ram/ContainerResourceProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.limits.ram;\n\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_REQUEST_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_REQUEST_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Names.machineName;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.environment.ResourceLimitAttributesProvisioner;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ConfigurationProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.Containers;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.KubernetesSize;\n\n/**\n * Sets or overrides Kubernetes container RAM and CPU limit and request if corresponding attributes\n * are present in machine config corresponding to the container.\n *\n * <p>There are two memory-related properties:\n *\n * <ul>\n *   <li>che.workspace.default_memory_limit_mb - defines default machine memory limit\n *   <li>che.workspace.default_memory_request_mb - defines default requested machine memory\n *       allocation.\n * </ul>\n *\n * <p>Similarly, there are two CPU-related properties:\n *\n * <ul>\n *   <li>che.workspace.default_cpu_limit_cores - defines default machine CPU limit\n *   <li>che.workspace.default_cpu_request_cores - defines default machine CPU request\n * </ul>\n *\n * @author Anton Korneta\n * @author Max Shaposhnyk\n */\n@Singleton\npublic class ContainerResourceProvisioner implements ConfigurationProvisioner {\n\n  private final long defaultMachineMaxMemorySizeAttribute;\n  private final long defaultMachineRequestMemorySizeAttribute;\n  private final float defaultMachineCpuLimitAttribute;\n  private final float defaultMachineCpuRequestAttribute;\n\n  @Inject\n  public ContainerResourceProvisioner(\n      @Named(\"che.workspace.default_memory_limit_mb\") long defaultMachineMaxMemorySizeAttribute,\n      @Named(\"che.workspace.default_memory_request_mb\")\n          long defaultMachineRequestMemorySizeAttribute,\n      @Named(\"che.workspace.default_cpu_limit_cores\") String defaultMachineCpuLimitAttribute,\n      @Named(\"che.workspace.default_cpu_request_cores\") String defaultMachineCpuRequestAttribute) {\n    this.defaultMachineMaxMemorySizeAttribute = defaultMachineMaxMemorySizeAttribute * 1024 * 1024;\n    this.defaultMachineRequestMemorySizeAttribute =\n        defaultMachineRequestMemorySizeAttribute * 1024 * 1024;\n    this.defaultMachineCpuLimitAttribute = KubernetesSize.toCores(defaultMachineCpuLimitAttribute);\n    this.defaultMachineCpuRequestAttribute =\n        KubernetesSize.toCores(defaultMachineCpuRequestAttribute);\n  }\n\n  @Override\n  @Traced\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n\n    TracingTags.WORKSPACE_ID.set(identity::getWorkspaceId);\n\n    final Map<String, InternalMachineConfig> machines = k8sEnv.getMachines();\n    for (PodData pod : k8sEnv.getPodsData().values()) {\n      for (Container container : pod.getSpec().getContainers()) {\n\n        // make sure that machine configs have settings for RAM limit and request\n        InternalMachineConfig machineConfig = machines.get(machineName(pod, container));\n        ResourceLimitAttributesProvisioner.provisionMemory(\n            machineConfig,\n            Containers.getRamLimit(container),\n            Containers.getRamRequest(container),\n            defaultMachineMaxMemorySizeAttribute,\n            defaultMachineRequestMemorySizeAttribute);\n\n        // make sure that machine configs have settings for CPU limit and request\n        ResourceLimitAttributesProvisioner.provisionCPU(\n            machineConfig,\n            Containers.getCpuLimit(container),\n            Containers.getCpuRequest(container),\n            defaultMachineCpuLimitAttribute,\n            defaultMachineCpuRequestAttribute);\n\n        // reapply memory and CPU settings to k8s container to make sure that provisioned\n        // values above are set. Non-positive value means that limit is disabled, so just\n        // ignoring them.\n        final Map<String, String> attributes = machineConfig.getAttributes();\n        long memLimit = Long.parseLong(attributes.get(MEMORY_LIMIT_ATTRIBUTE));\n        if (memLimit > 0) {\n          Containers.addRamLimit(container, memLimit);\n        }\n        long memRequest = Long.parseLong(attributes.get(MEMORY_REQUEST_ATTRIBUTE));\n        if (memRequest > 0) {\n          Containers.addRamRequest(container, memRequest);\n        }\n        float cpuLimit = Float.parseFloat(attributes.get(CPU_LIMIT_ATTRIBUTE));\n        if (cpuLimit > 0) {\n          Containers.addCpuLimit(container, cpuLimit);\n        }\n        float cpuRequest = Float.parseFloat(attributes.get(CPU_REQUEST_ATTRIBUTE));\n        if (cpuRequest > 0) Containers.addCpuRequest(container, cpuRequest);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/restartpolicy/RestartPolicyRewriter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.restartpolicy;\n\nimport static java.lang.String.format;\n\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.WarningImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Warnings;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ConfigurationProvisioner;\n\n/**\n * Rewrites restart policy to supported one - 'Never'.\n *\n * @author Alexander Garagatyi\n */\npublic class RestartPolicyRewriter implements ConfigurationProvisioner {\n\n  static final String DEFAULT_RESTART_POLICY = \"Never\";\n\n  @Override\n  @Traced\n  public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n\n    TracingTags.WORKSPACE_ID.set(identity::getWorkspaceId);\n\n    for (PodData podConfig : k8sEnv.getPodsData().values()) {\n      final String podName = podConfig.getMetadata().getName();\n      final PodSpec podSpec = podConfig.getSpec();\n      rewriteRestartPolicy(podSpec, podName, k8sEnv);\n    }\n  }\n\n  private void rewriteRestartPolicy(PodSpec podSpec, String podName, KubernetesEnvironment env) {\n    final String restartPolicy = podSpec.getRestartPolicy();\n\n    if (restartPolicy != null && !DEFAULT_RESTART_POLICY.equalsIgnoreCase(restartPolicy)) {\n      final String warnMsg =\n          format(\n              Warnings.RESTART_POLICY_SET_TO_NEVER_WARNING_MESSAGE_FMT,\n              restartPolicy,\n              podName,\n              DEFAULT_RESTART_POLICY);\n      env.addWarning(new WarningImpl(Warnings.RESTART_POLICY_SET_TO_NEVER_WARNING_CODE, warnMsg));\n    }\n    podSpec.setRestartPolicy(DEFAULT_RESTART_POLICY);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/secret/EnvironmentVariableSecretApplier.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_AUTOMOUNT;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_ENV_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_ENV_NAME_TEMPLATE;\n\nimport com.google.common.annotations.Beta;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.EnvVarBuilder;\nimport io.fabric8.kubernetes.api.model.EnvVarSourceBuilder;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretKeySelectorBuilder;\nimport java.time.ZonedDateTime;\nimport java.util.List;\nimport java.util.Map.Entry;\nimport java.util.Objects;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodRole;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Mounts Kubernetes secret with specific annotations as an environment variable(s) in workspace\n * containers. Allows per-component control of secret applying in devfile.\n */\n@Beta\n@Singleton\npublic class EnvironmentVariableSecretApplier\n    extends KubernetesSecretApplier<KubernetesEnvironment> {\n\n  @Inject private RuntimeEventsPublisher runtimeEventsPublisher;\n\n  private static final Logger LOG = LoggerFactory.getLogger(EnvironmentVariableSecretApplier.class);\n\n  /**\n   * Applies secret as environment variable into workspace containers, respecting automount\n   * attribute and optional devfile automount property override.\n   *\n   * @param env kubernetes environment with workspace containers configuration\n   * @param runtimeIdentity identity of current runtime\n   * @param secret source secret to apply\n   * @throws InfrastructureException on misconfigured secrets or other apply error\n   */\n  @Override\n  public void applySecret(KubernetesEnvironment env, RuntimeIdentity runtimeIdentity, Secret secret)\n      throws InfrastructureException {\n    boolean secretAutomount =\n        Boolean.parseBoolean(secret.getMetadata().getAnnotations().get(ANNOTATION_AUTOMOUNT));\n    for (PodData podData : env.getPodsData().values()) {\n      if (!podData.getRole().equals(PodRole.DEPLOYMENT)) {\n        continue;\n      }\n      for (Container container : podData.getSpec().getContainers()) {\n        Optional<ComponentImpl> component = getComponent(env, container.getName());\n        // skip components that explicitly disable automount\n        if (component.isPresent() && isComponentAutomountFalse(component.get())) {\n          continue;\n        }\n        // if automount disabled globally and not overridden in component\n        if (!secretAutomount\n            && (!component.isPresent() || !isComponentAutomountTrue(component.get()))) {\n          continue;\n        }\n        for (Entry<String, String> secretDataEntry : secret.getData().entrySet()) {\n          final String mountEnvName = envName(secret, secretDataEntry.getKey(), runtimeIdentity);\n          container\n              .getEnv()\n              .add(\n                  new EnvVarBuilder()\n                      .withName(mountEnvName)\n                      .withValueFrom(\n                          new EnvVarSourceBuilder()\n                              .withSecretKeyRef(\n                                  new SecretKeySelectorBuilder()\n                                      .withName(secret.getMetadata().getName())\n                                      .withKey(secretDataEntry.getKey())\n                                      .build())\n                              .build())\n                      .build());\n        }\n      }\n    }\n  }\n\n  private String envName(Secret secret, String key, RuntimeIdentity runtimeIdentity)\n      throws InfrastructureException {\n    String mountEnvName;\n    if (secret.getData().size() == 1) {\n      List<String> providedNames =\n          Stream.of(\n                  secret.getMetadata().getAnnotations().get(ANNOTATION_ENV_NAME),\n                  secret\n                      .getMetadata()\n                      .getAnnotations()\n                      .get(format(ANNOTATION_ENV_NAME_TEMPLATE, key)))\n              .filter(Objects::nonNull)\n              .collect(Collectors.toList());\n      if (providedNames.isEmpty()) {\n        throw new InfrastructureException(\n            format(\n                \"Unable to mount secret '%s': It is configured to be mount as a environment variable, but its name was not specified. Please define the '%s' annotation on the secret to specify it.\",\n                secret.getMetadata().getName(), ANNOTATION_ENV_NAME));\n      }\n\n      if (providedNames.size() > 1) {\n        String msg =\n            String.format(\n                \"Secret '%s' defines multiple environment variable name annotations, but contains only one data entry. That may cause inconsistent behavior and needs to be corrected.\",\n                secret.getMetadata().getName());\n        LOG.warn(msg);\n        runtimeEventsPublisher.sendRuntimeLogEvent(\n            msg, ZonedDateTime.now().toString(), runtimeIdentity);\n      }\n      mountEnvName = providedNames.get(0);\n    } else {\n      mountEnvName =\n          secret.getMetadata().getAnnotations().get(format(ANNOTATION_ENV_NAME_TEMPLATE, key));\n      if (mountEnvName == null) {\n        throw new InfrastructureException(\n            format(\n                \"Unable to mount key '%s'  of secret '%s': It is configured to be mount as a environment variable, but its name was not specified. Please define the '%s' annotation on the secret to specify it.\",\n                key, secret.getMetadata().getName(), format(ANNOTATION_ENV_NAME_TEMPLATE, key)));\n      }\n    }\n    return mountEnvName;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/secret/FileSecretApplier.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_AUTOMOUNT;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_PATH;\n\nimport com.google.common.annotations.Beta;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretVolumeSourceBuilder;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport io.fabric8.kubernetes.api.model.VolumeMountBuilder;\nimport java.nio.file.Paths;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.VolumeImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodRole;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.K8sVersion;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Mounts Kubernetes secret with specific annotations as an file in workspace containers. Via\n * devfile, allows per-component control of secret applying and path overrides using specific\n * property.\n */\n@Beta\n@Singleton\npublic class FileSecretApplier extends KubernetesSecretApplier<KubernetesEnvironment> {\n\n  private static final Logger LOG = LoggerFactory.getLogger(FileSecretApplier.class);\n\n  private final K8sVersion k8sVersion;\n\n  @Inject\n  public FileSecretApplier(K8sVersion k8sVersion) {\n    this.k8sVersion = k8sVersion;\n  }\n\n  /**\n   * Applies secret as file into workspace containers, respecting automount attribute and optional\n   * devfile automount property and/or mount path override.\n   *\n   * @param env kubernetes environment with workspace containers configuration\n   * @param runtimeIdentity identity of current runtime\n   * @param secret source secret to apply\n   * @throws InfrastructureException on misconfigured secrets or other apply error\n   */\n  @Override\n  public void applySecret(KubernetesEnvironment env, RuntimeIdentity runtimeIdentity, Secret secret)\n      throws InfrastructureException {\n    final String secretMountPath = secret.getMetadata().getAnnotations().get(ANNOTATION_MOUNT_PATH);\n    boolean secretAutomount =\n        Boolean.parseBoolean(secret.getMetadata().getAnnotations().get(ANNOTATION_AUTOMOUNT));\n    if (secretMountPath == null) {\n      throw new InfrastructureException(\n          format(\n              \"Unable to mount secret '%s': It is configured to be mounted as a file but the mount path was not specified. Please define the '%s' annotation on the secret to specify it.\",\n              secret.getMetadata().getName(), ANNOTATION_MOUNT_PATH));\n    }\n\n    Volume volumeFromSecret =\n        new VolumeBuilder()\n            .withName(secret.getMetadata().getName())\n            .withSecret(\n                new SecretVolumeSourceBuilder()\n                    .withSecretName(secret.getMetadata().getName())\n                    .build())\n            .build();\n\n    for (PodData podData : env.getPodsData().values()) {\n      if (!podData.getRole().equals(PodRole.DEPLOYMENT)) {\n        continue;\n      }\n      if (podData.getSpec().getVolumes().stream()\n          .anyMatch(v -> v.getName().equals(volumeFromSecret.getName()))) {\n        volumeFromSecret.setName(volumeFromSecret.getName() + \"_\" + NameGenerator.generate(\"\", 6));\n      }\n\n      podData.getSpec().getVolumes().add(volumeFromSecret);\n\n      for (Container container : podData.getSpec().getContainers()) {\n        Optional<ComponentImpl> component = getComponent(env, container.getName());\n        // skip components that explicitly disable automount\n        if (component.isPresent() && isComponentAutomountFalse(component.get())) {\n          continue;\n        }\n        // if automount disabled globally and not overridden in component\n        if (!secretAutomount\n            && (!component.isPresent() || !isComponentAutomountTrue(component.get()))) {\n          continue;\n        }\n        // find path override if any\n        Optional<String> overridePathOptional = Optional.empty();\n        if (component.isPresent()) {\n          overridePathOptional =\n              getOverridenComponentPath(component.get(), secret.getMetadata().getName());\n        }\n        final String componentMountPath = overridePathOptional.orElse(secretMountPath);\n        // it's not possible to mount multiple volumes on same path on older k8s, so we\n        // remove the existing mount here to replace it with new one.\n        if (k8sVersion.olderThan(1, 13)) {\n          LOG.debug(\n              \"Unable to mount multiple VolumeMounts on same path on this k8s version. Removing conflicting volumes in favor of secret mounts.\");\n          container\n              .getVolumeMounts()\n              .removeIf(vm -> Paths.get(vm.getMountPath()).equals(Paths.get(componentMountPath)));\n        }\n\n        container\n            .getVolumeMounts()\n            .addAll(\n                secret.getData().keySet().stream()\n                    .map(\n                        secretFile ->\n                            buildVolumeMount(volumeFromSecret, componentMountPath, secretFile))\n                    .collect(Collectors.toList()));\n      }\n    }\n  }\n\n  private VolumeMount buildVolumeMount(\n      Volume volumeFromSecret, String componentMountPath, String secretFile) {\n    VolumeMountBuilder volumeMountBuilder =\n        new VolumeMountBuilder().withName(volumeFromSecret.getName()).withReadOnly(true);\n\n    // subPaths are supported from k8s v1.13\n    if (k8sVersion.newerOrEqualThan(1, 13)) {\n      volumeMountBuilder\n          .withMountPath(componentMountPath + \"/\" + secretFile)\n          .withSubPath(secretFile);\n    } else {\n      volumeMountBuilder.withMountPath(componentMountPath);\n      LOG.debug(\"This version of k8s does not support sutPaths for VolumeMounts.\");\n    }\n\n    return volumeMountBuilder.build();\n  }\n\n  private Optional<String> getOverridenComponentPath(ComponentImpl component, String secretName) {\n    Optional<VolumeImpl> matchedVolume =\n        component.getVolumes().stream().filter(v -> v.getName().equals(secretName)).findFirst();\n    if (matchedVolume.isPresent() && !isNullOrEmpty(matchedVolume.get().getContainerPath())) {\n      return Optional.of(matchedVolume.get().getContainerPath());\n    }\n    return Optional.empty();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/secret/GitCredentialStorageFileSecretApplier.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_PATH;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_USER_NAME;\n\nimport com.google.common.annotations.Beta;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.K8sVersion;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.GitConfigProvisioner;\n\n/**\n * An instance of {@link FileSecretApplier} that is trying to adjust the content of git-config that\n * was added by {@link GitConfigProvisioner}. The adjustment is adding configuration of git\n * credentials store, which is pointing to the file that is going to be mount to the container from\n * the secret.\n */\n@Beta\n@Singleton\npublic class GitCredentialStorageFileSecretApplier extends FileSecretApplier {\n\n  private static final String GIT_CREDENTIALS_FILE_STORE_PATTERN =\n      \"\\n[credential]\\n\\thelper = store --file %s\\n\";\n\n  @Inject\n  public GitCredentialStorageFileSecretApplier(K8sVersion k8sVersion) {\n    super(k8sVersion);\n  }\n\n  @Override\n  public void applySecret(KubernetesEnvironment env, RuntimeIdentity runtimeIdentity, Secret secret)\n      throws InfrastructureException {\n    super.applySecret(env, runtimeIdentity, secret);\n    final String secretMountPath = secret.getMetadata().getAnnotations().get(ANNOTATION_MOUNT_PATH);\n    Set<String> keys = secret.getData().keySet();\n    if (keys.size() != 1) {\n      throw new InfrastructureException(\n          format(\n              \"Invalid git credential secret data. It should contain only 1 data item but it have %d\",\n              keys.size()));\n    }\n    Path gitSecretFilePath = Paths.get(secretMountPath, keys.iterator().next());\n    ConfigMap gitConfigMap = env.getConfigMaps().get(GitConfigProvisioner.GIT_CONFIG_MAP_NAME);\n    if (gitConfigMap != null) {\n      Map<String, String> gitConfigMapData = gitConfigMap.getData();\n      String gitConfig = gitConfigMapData.get(GitConfigProvisioner.GIT_CONFIG);\n      if (gitConfig != null) {\n        if (gitConfig.contains(\"helper = store --file\") && gitConfig.contains(\"[credential]\")) {\n          throw new InfrastructureException(\n              format(\n                  \"Multiple git credential secrets for user %s found in namespace %s. That may be caused by reinstalling product without user namespaces cleanup or using multiple instances of product with the same namespace namings template.\",\n                  secret.getMetadata().getAnnotations().get(ANNOTATION_USER_NAME),\n                  secret.getMetadata().getNamespace()));\n        }\n\n        HashMap<String, String> newGitConfigMapData = new HashMap<>(gitConfigMapData);\n        newGitConfigMapData.put(\n            GitConfigProvisioner.GIT_CONFIG,\n            gitConfig\n                + String.format(GIT_CREDENTIALS_FILE_STORE_PATTERN, gitSecretFilePath.toString()));\n        gitConfigMap.setData(newGitConfigMapData);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/secret/KubernetesSecretAnnotationNames.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret;\n\n/**\n * Set of annotations used in auto-mount secrets to specify theirs type and/or expected behaviour.\n */\npublic class KubernetesSecretAnnotationNames {\n\n  /** Common prefix for all annotations */\n  public static final String ANNOTATION_PREFIX = \"che.eclipse.org\";\n\n  /** Indicates the way secret should be mount. Supported values are 'file' and 'env' */\n  public static final String ANNOTATION_MOUNT_AS = ANNOTATION_PREFIX + \"/\" + \"mount-as\";\n\n  /** Indicates whether given secret should be automatically mount into all workspace containers */\n  public static final String ANNOTATION_AUTOMOUNT =\n      ANNOTATION_PREFIX + \"/\" + \"automount-workspace-secret\";\n\n  /** Indicates whether given secret is a git credential secret. */\n  public static final String ANNOTATION_GIT_CREDENTIALS =\n      ANNOTATION_PREFIX + \"/\" + \"git-credential\";\n\n  /** Defines user name given secret belongs to */\n  public static final String ANNOTATION_USER_NAME = ANNOTATION_PREFIX + \"/\" + \"scm-username\";\n\n  /** For 'file' type secrets defines the path where ih should be mount */\n  public static final String ANNOTATION_MOUNT_PATH = ANNOTATION_PREFIX + \"/\" + \"mount-path\";\n\n  /** For 'env' type secrets defines the environment variable name to mount secret with */\n  public static final String ANNOTATION_ENV_NAME = ANNOTATION_PREFIX + \"/\" + \"env-name\";\n\n  /** For 'env' type secrets defines the environment variable name template to mount secret with */\n  public static final String ANNOTATION_ENV_NAME_TEMPLATE = ANNOTATION_PREFIX + \"/%s_\" + \"env-name\";\n\n  /** Common prefix for annotations associated with devworkspaces */\n  public static final String DEV_WORKSPACE_PREFIX = \"controller.devfile.io\";\n\n  /** For 'file' type secrets defines the path where ih should be mount */\n  public static final String ANNOTATION_DEV_WORKSPACE_MOUNT_PATH =\n      DEV_WORKSPACE_PREFIX + \"/\" + \"mount-path\";\n\n  private KubernetesSecretAnnotationNames() {}\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/secret/KubernetesSecretApplier.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret;\n\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.DEVFILE_COMPONENT_ALIAS_ATTRIBUTE;\n\nimport com.google.common.annotations.Beta;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * Base class for secret appliers. Contains common functionality to find devfile components by name\n * and check override automount properties.\n */\n@Beta\npublic abstract class KubernetesSecretApplier<E extends KubernetesEnvironment> {\n\n  /**\n   * Applies particular secret to workspace containers.\n   *\n   * @param env environment to retrieve components from\n   * @param runtimeIdentity identity of current runtime\n   * @param secret secret to apply\n   * @throws InfrastructureException when secret applying error\n   */\n  public abstract void applySecret(E env, RuntimeIdentity runtimeIdentity, Secret secret)\n      throws InfrastructureException;\n\n  /**\n   * Tries to retrieve devfile component by given container name.\n   *\n   * @param env kubernetes environment of the workspace\n   * @param containerName name of container to find it's parent component\n   * @return matched component\n   */\n  final Optional<ComponentImpl> getComponent(E env, String containerName) {\n    InternalMachineConfig internalMachineConfig = env.getMachines().get(containerName);\n    if (internalMachineConfig != null) {\n      String componentName =\n          internalMachineConfig.getAttributes().get(DEVFILE_COMPONENT_ALIAS_ATTRIBUTE);\n      if (componentName != null) {\n        return env.getDevfile().getComponents().stream()\n            .filter(c -> componentName.equals(c.getAlias()))\n            .findFirst();\n      }\n    }\n    return Optional.empty();\n  }\n\n  /**\n   * @param component source component\n   * @return {@code true} when {@code automountWorkspaceSecret} property explicitly set to {@code\n   *     false},or {@code false} otherwise.\n   */\n  final boolean isComponentAutomountFalse(ComponentImpl component) {\n    return component.getAutomountWorkspaceSecrets() != null\n        && !component.getAutomountWorkspaceSecrets();\n  }\n\n  /**\n   * @param component source component\n   * @return {@code true} when {@code automountWorkspaceSecret} property explicitly set to {@code\n   *     true},or {@code false} otherwise.\n   */\n  final boolean isComponentAutomountTrue(ComponentImpl component) {\n    return component.getAutomountWorkspaceSecrets() != null\n        && component.getAutomountWorkspaceSecrets();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/secret/SecretAsContainerResourceProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret;\n\nimport static java.lang.Boolean.parseBoolean;\nimport static java.lang.String.format;\nimport static java.util.stream.Collectors.toMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_GIT_CREDENTIALS;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_AS;\n\nimport com.google.common.annotations.Beta;\nimport io.fabric8.kubernetes.api.model.LabelSelector;\nimport io.fabric8.kubernetes.api.model.LabelSelectorBuilder;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport java.util.Arrays;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\n\n/**\n * Finds secrets with specific labels in namespace, and mount their values as file or environment\n * variable into workspace containers. Secrets annotated with \"che.eclipse.org/mount-as=env\" are\n * mount as env variables, env name is read from \"che.eclipse.org/env-name\" annotation. Secrets\n * which having \"che.eclipse.org/mount-as=file\" are mounted as file in the folder specified by\n * \"che.eclipse.org/mount-path\" annotation. Refer to che docs for concrete examples.\n */\n@Beta\n@Singleton\npublic class SecretAsContainerResourceProvisioner<E extends KubernetesEnvironment> {\n\n  private final FileSecretApplier fileSecretApplier;\n  private final EnvironmentVariableSecretApplier environmentVariableSecretApplier;\n\n  private final GitCredentialStorageFileSecretApplier gitCredentialStorageFileSecretApplier;\n  private final Map<String, String> secretLabels;\n\n  @Inject\n  public SecretAsContainerResourceProvisioner(\n      FileSecretApplier fileSecretApplier,\n      EnvironmentVariableSecretApplier environmentVariableSecretApplier,\n      GitCredentialStorageFileSecretApplier gitCredentialStorageFileSecretApplier,\n      @Named(\"che.workspace.provision.secret.labels\") String[] labels) {\n    this.fileSecretApplier = fileSecretApplier;\n    this.environmentVariableSecretApplier = environmentVariableSecretApplier;\n    this.gitCredentialStorageFileSecretApplier = gitCredentialStorageFileSecretApplier;\n    this.secretLabels =\n        Arrays.stream(labels)\n            .map(item -> item.split(\"=\", 2))\n            .collect(toMap(p -> p[0], p -> p.length == 1 ? \"\" : p[1]));\n  }\n\n  public void provision(E env, RuntimeIdentity runtimeIdentity, KubernetesNamespace namespace)\n      throws InfrastructureException {\n    LabelSelector selector = new LabelSelectorBuilder().withMatchLabels(secretLabels).build();\n    for (Secret secret : namespace.secrets().get(selector)) {\n      if (secret.getMetadata().getAnnotations() == null) {\n        throw new InfrastructureException(\n            format(\n                \"Unable to mount secret '%s': it has missing required annotations. Please check documentation for secret format guide.\",\n                secret.getMetadata().getName()));\n      }\n      String mountType = secret.getMetadata().getAnnotations().get(ANNOTATION_MOUNT_AS);\n      if (\"env\".equalsIgnoreCase(mountType)) {\n        environmentVariableSecretApplier.applySecret(env, runtimeIdentity, secret);\n      } else if (\"file\".equalsIgnoreCase(mountType)) {\n        if (parseBoolean(secret.getMetadata().getAnnotations().get(ANNOTATION_GIT_CREDENTIALS))) {\n          gitCredentialStorageFileSecretApplier.applySecret(env, runtimeIdentity, secret);\n        } else {\n          fileSecretApplier.applySecret(env, runtimeIdentity, secret);\n        }\n\n      } else {\n        throw new InfrastructureException(\n            format(\n                \"Unable to mount secret '%s': it has missing or unknown type of the mount. Please make sure that '%s' annotation has value either 'env' or 'file'.\",\n                secret.getMetadata().getName(), ANNOTATION_MOUNT_AS));\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/server/ServersConverter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.server;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ConfigurationProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposerFactoryProvider;\n\n/**\n * Converts {@link ServerConfig} to Kubernetes related objects to add a server into Kubernetes\n * runtime.\n *\n * <p>Adds Kubernetes objects by calling {@link KubernetesServerExposer#expose(Map)} on each machine\n * with servers.\n *\n * @author Alexander Garagatyi\n */\n@Singleton\npublic class ServersConverter<T extends KubernetesEnvironment>\n    implements ConfigurationProvisioner<T> {\n\n  private final ExternalServerExposer<T> externalServerExposer;\n  private final SecureServerExposerFactoryProvider<T> secureServerExposerFactoryProvider;\n\n  @Inject\n  public ServersConverter(\n      ExternalServerExposerProvider<T> externalServerExposer,\n      SecureServerExposerFactoryProvider<T> secureServerExposerFactoryProvider) {\n    this.externalServerExposer = externalServerExposer.get();\n    this.secureServerExposerFactoryProvider = secureServerExposerFactoryProvider;\n  }\n\n  @Override\n  @Traced\n  public void provision(T k8sEnv, RuntimeIdentity identity) throws InfrastructureException {\n\n    TracingTags.WORKSPACE_ID.set(identity::getWorkspaceId);\n\n    SecureServerExposer<T> secureServerExposer =\n        secureServerExposerFactoryProvider.get(k8sEnv).create(identity);\n\n    for (PodData podConfig : k8sEnv.getPodsData().values()) {\n      final PodSpec podSpec = podConfig.getSpec();\n      for (Container containerConfig : podSpec.getContainers()) {\n        String machineName = Names.machineName(podConfig, containerConfig);\n        InternalMachineConfig machineConfig = k8sEnv.getMachines().get(machineName);\n        if (!machineConfig.getServers().isEmpty()) {\n          KubernetesServerExposer kubernetesServerExposer =\n              new KubernetesServerExposer<>(\n                  externalServerExposer,\n                  secureServerExposer,\n                  machineName,\n                  podConfig,\n                  containerConfig,\n                  k8sEnv);\n          kubernetesServerExposer.expose(machineConfig.getServers());\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/AbstractExposureStrategyAwareProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server;\n\nimport java.util.Map;\nimport javax.inject.Named;\nimport javax.inject.Provider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.SingleHostExternalServiceExposureStrategy;\n\n/**\n * A simple base class for providers that are dependent on the server exposure strategy and\n * single-host workspace exposure.\n *\n * @param <T> the type this provider provides.\n */\npublic abstract class AbstractExposureStrategyAwareProvider<T> implements Provider<T> {\n\n  protected final T instance;\n  protected final Map<WorkspaceExposureType, T> instanceMap;\n\n  /**\n   * Constructs a new provider returning one of the instances from the provided mapping\n   *\n   * <p>If the server exposure strategy is not \"single-host\", the {@link\n   * WorkspaceExposureType#NATIVE native} is used to lookup the instance from the map.\n   *\n   * <p>If the server exposure strategy is \"single-host\", the appropriate instance is looked up in\n   * the mapping that corresponds to the {@code singleHostType}.\n   *\n   * @param exposureStrategy the server exposure strategy\n   * @param wsExposureType the type of workspace exposure under single-host\n   * @param mapping the mapping for the different exposure types\n   * @param errorMessageTemplate the template for the error message which should contain a single\n   *     '%s' that is going to be replaced by the \"wsExposureType\" value.\n   * @throws IllegalStateException if the mapping doesn't contain a value for the chosen server\n   *     strategy and workspace exposure\n   */\n  protected AbstractExposureStrategyAwareProvider(\n      @Named(\"che.infra.kubernetes.server_strategy\") String exposureStrategy,\n      @Named(\"che.infra.kubernetes.singlehost.workspace.exposure\") String wsExposureType,\n      Map<WorkspaceExposureType, T> mapping,\n      String errorMessageTemplate) {\n    if (exposureStrategy.equals(SingleHostExternalServiceExposureStrategy.SINGLE_HOST_STRATEGY)) {\n      instance = mapping.get(WorkspaceExposureType.fromConfigurationValue(wsExposureType));\n    } else {\n      instance = mapping.get(WorkspaceExposureType.NATIVE);\n    }\n\n    if (instance == null) {\n      throw new IllegalStateException(String.format(errorMessageTemplate, wsExposureType));\n    }\n\n    instanceMap = mapping;\n  }\n\n  /** Returns the object mapped to the configured exposure type. */\n  public T get() {\n    return instance;\n  }\n\n  /** Returns the object mapped to the provided exposure type. */\n  public T get(WorkspaceExposureType exposureType) {\n    return instanceMap.get(exposureType);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/IngressAnnotationsProvider.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server;\n\nimport com.google.common.reflect.TypeToken;\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\nimport java.lang.reflect.Type;\nimport java.util.Collections;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * @author Alexander Garagatyi\n */\n@Singleton\npublic class IngressAnnotationsProvider implements Provider<Map<String, String>> {\n\n  private static final Gson GSON = new GsonBuilder().disableHtmlEscaping().create();\n  private static final Type type = new TypeToken<Map<String, String>>() {}.getType();\n  private final Map<String, String> annotations;\n  private static final Logger LOG = LoggerFactory.getLogger(IngressAnnotationsProvider.class);\n\n  @Inject\n  public IngressAnnotationsProvider(\n      @Nullable @Named(\"che.infra.kubernetes.ingress.annotations_json\") String annotationsString) {\n\n    if (annotationsString != null) {\n      annotations = GSON.fromJson(annotationsString, type);\n    } else {\n      annotations = Collections.emptyMap();\n      LOG.warn(\n          \"Ingresses annotations are absent. Make sure that workspace ingresses don't need \"\n              + \"to be configured according to ingress controller.\");\n    }\n  }\n\n  @Override\n  public Map<String, String> get() {\n    return annotations;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/KubernetesServerExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server;\n\nimport static java.lang.Integer.parseInt;\nimport static java.util.stream.Collectors.toMap;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVER_NAME_ATTRIBUTE;\nimport static org.eclipse.che.commons.lang.NameGenerator.generate;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_ORIGINAL_NAME_LABEL;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerPort;\nimport io.fabric8.kubernetes.api.model.ContainerPortBuilder;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServicePortBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Constants;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ConfigurationProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.UniqueNamesProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposer;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Helps to modify {@link KubernetesEnvironment} to make servers that are configured by {@link\n * ServerConfig} publicly or workspace-wide accessible.\n *\n * <p>To make server accessible it is needed to make sure that container port is declared, create\n * {@link Service}. To make it also publicly accessible it is needed to create corresponding {@link\n * Ingress} for exposing this port.\n *\n * <p>Created services and ingresses will have serialized servers which are exposed by the\n * corresponding object and machine name to which these servers belongs to.\n *\n * <p>Container, service and ingress are linked in the following way:\n *\n * <pre>\n * Pod\n * metadata:\n *   labels:\n *     type: web-app\n * spec:\n *   containers:\n *   ...\n *   - ports:\n *     - containerPort: 8080\n *       name: web-app\n *       protocol: TCP\n *   ...\n * </pre>\n *\n * Then services expose containers ports in the following way:\n *\n * <pre>\n * Service\n * metadata:\n *   name: service123\n * spec:\n *   selector:                        ---->> Pod.metadata.labels\n *     type: web-app\n *   ports:\n *     - name: web-app\n *       port: 8080\n *       targetPort: [8080|web-app]   ---->> Pod.spec.ports[0].[containerPort|name]\n *       protocol: TCP                ---->> Pod.spec.ports[0].protocol\n * </pre>\n *\n * Then, a server exposer strategy is used to expose one of the service's ports, to outside of the\n * cluster. Currently, Host-Based and Path-Based Ingresses can be used to expose service ports.\n *\n * <p>For accessing publicly accessible server user will use ingress host or its load balancer IP.\n * For accessing workspace-wide accessible server user will use service name. Information about\n * servers that are exposed by ingress and/or service are stored in annotations of a ingress or\n * service.\n *\n * @author Sergii Leshchenko\n * @author Alexander Garagatyi\n * @see Annotations\n */\npublic class KubernetesServerExposer<T extends KubernetesEnvironment> {\n\n  private static final Logger LOG = LoggerFactory.getLogger(KubernetesServerExposer.class);\n\n  public static final int SERVER_UNIQUE_PART_SIZE = 8;\n  public static final String SERVER_PREFIX = \"server\";\n\n  private final ExternalServerExposer<T> externalServerExposer;\n  private final SecureServerExposer<T> secureServerExposer;\n  private final String machineName;\n  private final Container container;\n  private final PodData pod;\n  private final T k8sEnv;\n\n  public KubernetesServerExposer(\n      ExternalServerExposer<T> externalServerExposer,\n      SecureServerExposer<T> secureServerExposer,\n      String machineName,\n      PodData pod,\n      Container container,\n      T k8sEnv) {\n    this.externalServerExposer = externalServerExposer;\n    this.secureServerExposer = secureServerExposer;\n    this.machineName = machineName;\n    this.pod = pod;\n    this.container = container;\n    this.k8sEnv = k8sEnv;\n  }\n\n  /**\n   * A helper method to split the servers to unique sets that should be exposed together.\n   *\n   * <p>The consumer is responsible for doing the actual exposure and is supplied 2 pieces of data.\n   * The first is the server ID, which is non-null for any unique server from the input set and null\n   * for any compound set of servers that should be exposed together. The caller is responsible for\n   * figuring out an appropriate ID in such case.\n   *\n   * @param allServers all unique and non-unique servers mixed together\n   * @param consumer the consumer responsible for handling the split sets of servers\n   */\n  private static void onEachExposableServerSet(\n      Map<String, ServerConfig> allServers, ServerSetExposer consumer)\n      throws InfrastructureException {\n    Map<String, ServerConfig> nonUniqueServers = new HashMap<>();\n\n    for (Map.Entry<String, ServerConfig> e : allServers.entrySet()) {\n      String serverId = makeServerNameValidForDns(e.getKey());\n      if (e.getValue().isUnique()) {\n        consumer.expose(serverId, ImmutableMap.of(serverId, e.getValue()));\n      } else {\n        nonUniqueServers.put(serverId, e.getValue());\n      }\n    }\n\n    if (!nonUniqueServers.isEmpty()) {\n      consumer.expose(null, nonUniqueServers);\n    }\n  }\n\n  /** Replaces {@code /} with {@code -} in the provided name in an attempt to make it DNS safe. */\n  public static String makeServerNameValidForDns(String name) {\n    return name.replaceAll(\"/\", \"-\");\n  }\n\n  /**\n   * Exposes specified servers.\n   *\n   * <p>Note that created Kubernetes objects will select the corresponding pods by {@link\n   * Constants#CHE_ORIGINAL_NAME_LABEL} label. That should be added by {@link\n   * UniqueNamesProvisioner}.\n   *\n   * @param servers servers to expose\n   * @see ConfigurationProvisioner#provision(KubernetesEnvironment, RuntimeIdentity)\n   */\n  public void expose(Map<String, ? extends ServerConfig> servers) throws InfrastructureException {\n    Map<String, ServerConfig> internalServers = new HashMap<>();\n    Map<String, ServerConfig> externalServers = new HashMap<>();\n    Map<String, ServerConfig> secureServers = new HashMap<>();\n    Map<String, ServicePort> unsecuredPorts = new HashMap<>();\n    Map<String, ServicePort> securedPorts = new HashMap<>();\n\n    splitServersAndPortsByExposureType(\n        servers, internalServers, externalServers, secureServers, unsecuredPorts, securedPorts);\n\n    provisionServicesForDiscoverableServers(servers);\n\n    Optional<Service> serviceOpt = createService(internalServers, unsecuredPorts);\n\n    if (serviceOpt.isPresent()) {\n      Service service = serviceOpt.get();\n      String serviceName = service.getMetadata().getName();\n      k8sEnv.getServices().put(serviceName, service);\n      exposeNonSecureServers(serviceName, externalServers, unsecuredPorts);\n    }\n\n    exposeSecureServers(secureServers, securedPorts);\n  }\n\n  // TODO: this creates discoverable services as an extra services. Service for same {@link\n  //  ServerConfig} is also created later in in {@link #exposeNonSecureServers(Map, Map, Map)} or\n  //  {@link #exposeSecureServers(Map, Map)} as a non-discoverable one. This was added during\n  //  working on adding endpoints for kubernetes/openshift components, to keep behavior consistent.\n  //  However, this logic is probably broken and should be changed.\n  /**\n   * Creates services with defined names for discoverable {@link ServerConfig}s. The name is taken\n   * from {@link ServerConfig}'s attributes under {@link ServerConfig#SERVER_NAME_ATTRIBUTE} and\n   * must be set, otherwise service won't be created.\n   */\n  private void provisionServicesForDiscoverableServers(\n      Map<String, ? extends ServerConfig> servers) {\n    for (String serverName : servers.keySet()) {\n      ServerConfig server = servers.get(serverName);\n      if (server.getAttributes().containsKey(SERVER_NAME_ATTRIBUTE)) {\n        // remove the name from attributes so we don't send it to the client\n        String endpointName = server.getAttributes().remove(SERVER_NAME_ATTRIBUTE);\n        if (server.isDiscoverable()) {\n          Service service =\n              new ServerServiceBuilder()\n                  .withName(endpointName)\n                  .withMachineName(machineName)\n                  .withSelectorEntry(CHE_ORIGINAL_NAME_LABEL, pod.getMetadata().getName())\n                  .withPorts(Collections.singletonList(getServicePort(server)))\n                  .withServers(Collections.singletonMap(serverName, server))\n                  .build();\n          k8sEnv.getServices().put(service.getMetadata().getName(), service);\n        }\n      }\n    }\n  }\n\n  private void splitServersAndPortsByExposureType(\n      Map<String, ? extends ServerConfig> servers,\n      Map<String, ServerConfig> internalServers,\n      Map<String, ServerConfig> externalServers,\n      Map<String, ServerConfig> secureServers,\n      Map<String, ServicePort> unsecuredPorts,\n      Map<String, ServicePort> securedPorts) {\n\n    servers.forEach(\n        (key, value) -> {\n          ServicePort sp = getServicePort(value);\n          exposeInContainerIfNeeded(sp);\n          if (value.isInternal()) {\n            // Server is internal. It doesn't make sense to make an it secure since\n            // it is available only within workspace servers\n            internalServers.put(key, value);\n            unsecuredPorts.put(value.getPort(), sp);\n          } else {\n            // Server is external. Check if it should be secure or not\n            if (value.isSecure()) {\n              secureServers.put(key, value);\n              securedPorts.put(value.getPort(), sp);\n            } else {\n              externalServers.put(key, value);\n              unsecuredPorts.put(value.getPort(), sp);\n            }\n          }\n        });\n  }\n\n  private void exposeNonSecureServers(\n      String serviceName,\n      Map<String, ServerConfig> externalServers,\n      Map<String, ServicePort> unsecuredPorts)\n      throws InfrastructureException {\n\n    for (ServicePort servicePort : unsecuredPorts.values()) {\n      // expose service port related external servers if exist\n      Map<String, ServerConfig> matchedExternalServers = match(externalServers, servicePort);\n      if (!matchedExternalServers.isEmpty()) {\n        onEachExposableServerSet(\n            matchedExternalServers,\n            (serverId, srvrs) ->\n                externalServerExposer.expose(\n                    k8sEnv, machineName, serviceName, serverId, servicePort, srvrs));\n      }\n    }\n  }\n\n  private Optional<Service> createService(\n      Map<String, ServerConfig> internalServers, Map<String, ServicePort> unsecuredPorts) {\n    Map<String, ServerConfig> allInternalServers = new HashMap<>(internalServers);\n    if (unsecuredPorts.isEmpty()) {\n      return Optional.empty();\n    }\n\n    Service service =\n        new ServerServiceBuilder()\n            .withName(generate(SERVER_PREFIX, SERVER_UNIQUE_PART_SIZE) + '-' + machineName)\n            .withMachineName(machineName)\n            .withSelectorEntry(CHE_ORIGINAL_NAME_LABEL, pod.getMetadata().getName())\n            .withPorts(new ArrayList<>(unsecuredPorts.values()))\n            .withServers(allInternalServers)\n            .build();\n\n    return Optional.of(service);\n  }\n\n  private void exposeSecureServers(\n      Map<String, ServerConfig> securedServers, Map<String, ServicePort> securedPorts)\n      throws InfrastructureException {\n\n    if (securedPorts.isEmpty()) {\n      return;\n    }\n\n    Optional<Service> secureService =\n        secureServerExposer.createService(securedPorts.values(), pod, machineName, securedServers);\n\n    String secureServiceName =\n        secureService\n            .map(\n                s -> {\n                  String n = s.getMetadata().getName();\n                  k8sEnv.getServices().put(n, s);\n                  return n;\n                })\n            .orElse(null);\n\n    for (ServicePort servicePort : securedPorts.values()) {\n      // expose service port related secure servers if exist\n      Map<String, ServerConfig> matchedSecureServers = match(securedServers, servicePort);\n      if (!matchedSecureServers.isEmpty()) {\n        onEachExposableServerSet(\n            matchedSecureServers,\n            (serverId, srvrs) -> {\n              secureServerExposer.expose(\n                  k8sEnv, pod, machineName, secureServiceName, serverId, servicePort, srvrs);\n            });\n      }\n    }\n  }\n\n  private Map<String, ServerConfig> match(\n      Map<String, ServerConfig> servers, ServicePort servicePort) {\n    int port = servicePort.getTargetPort().getIntVal();\n    return servers.entrySet().stream()\n        .filter(e -> parseInt(e.getValue().getPort().split(\"/\")[0]) == port)\n        .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));\n  }\n\n  private ServicePort getServicePort(ServerConfig serverConfig) {\n    String[] portProtocol = serverConfig.getPort().split(\"/\");\n    int port = parseInt(portProtocol[0]);\n    String protocol = portProtocol.length > 1 ? portProtocol[1].toUpperCase() : \"TCP\";\n    return new ServicePortBuilder()\n        .withName(\"server-\" + port)\n        .withPort(port)\n        .withProtocol(protocol)\n        .withNewTargetPort(port)\n        .build();\n  }\n\n  private void exposeInContainerIfNeeded(ServicePort servicePort) {\n    if (container.getPorts().stream()\n        .noneMatch(\n            p ->\n                p.getContainerPort().equals(servicePort.getPort())\n                    && servicePort.getProtocol().equals(p.getProtocol()))) {\n      ContainerPort containerPort =\n          new ContainerPortBuilder()\n              .withContainerPort(servicePort.getPort())\n              .withProtocol(servicePort.getProtocol())\n              .build();\n      container.getPorts().add(containerPort);\n    }\n  }\n\n  @FunctionalInterface\n  private interface ServerSetExposer {\n    void expose(String serverId, Map<String, ServerConfig> serverSet)\n        throws InfrastructureException;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/PreviewUrlExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server;\n\nimport static org.eclipse.che.commons.lang.NameGenerator.generate;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer.SERVER_PREFIX;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer.SERVER_UNIQUE_PART_SIZE;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.Ingresses;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.Services;\n\n/**\n * For Commands that have defined Preview URL, tries to find existing {@link Service} and {@link\n * Ingress}. When not found, we create new ones and put them into given {@link\n * KubernetesEnvironment}.\n *\n * @param <T> type of the environment\n */\n@Singleton\npublic class PreviewUrlExposer<T extends KubernetesEnvironment> {\n\n  private final ExternalServerExposer<T> externalServerExposer;\n\n  @Inject\n  public PreviewUrlExposer(ExternalServerExposerProvider<T> externalServerExposer) {\n    this(externalServerExposer.get());\n  }\n\n  @VisibleForTesting\n  protected PreviewUrlExposer(ExternalServerExposer<T> externalServerExposer) {\n    this.externalServerExposer = externalServerExposer;\n  }\n\n  public void expose(T env) throws InternalInfrastructureException {\n    List<CommandImpl> previewUrlCommands =\n        env.getCommands().stream()\n            .filter(c -> c.getPreviewUrl() != null)\n            .collect(Collectors.toList());\n\n    List<ServicePort> portsToProvision = new ArrayList<>();\n    for (CommandImpl command : previewUrlCommands) {\n      int port = command.getPreviewUrl().getPort();\n      Optional<Service> foundService =\n          Services.findServiceWithPort(env.getServices().values(), port);\n      if (foundService.isPresent()) {\n        if (!hasMatchingEndpoint(env, foundService.get(), port)) {\n          ServicePort servicePort =\n              Services.findPort(foundService.get(), port)\n                  .orElseThrow(\n                      () ->\n                          new InternalInfrastructureException(\n                              String.format(\n                                  \"Port '%d' in service '%s' not found. This is not expected, please report a bug!\",\n                                  port, foundService.get().getMetadata().getName())));\n          String serviceName = foundService.get().getMetadata().getName();\n          externalServerExposer.expose(\n              env, null, serviceName, serviceName, servicePort, Collections.emptyMap());\n        }\n      } else {\n        portsToProvision.add(createServicePort(port));\n      }\n    }\n\n    if (!portsToProvision.isEmpty()) {\n      String serverName = generate(SERVER_PREFIX, SERVER_UNIQUE_PART_SIZE) + \"-previewUrl\";\n      Service service =\n          new ServerServiceBuilder().withName(serverName).withPorts(portsToProvision).build();\n      env.getServices().put(serverName, service);\n      portsToProvision.forEach(\n          port ->\n              externalServerExposer.expose(\n                  env,\n                  null,\n                  service.getMetadata().getName(),\n                  service.getMetadata().getName(),\n                  port,\n                  Collections.emptyMap()));\n    }\n  }\n\n  private ServicePort createServicePort(int port) {\n    return new ServicePort(null, \"server-\" + port, null, port, \"TCP\", new IntOrString(port));\n  }\n\n  protected boolean hasMatchingEndpoint(T env, Service service, int port) {\n    return Ingresses.findIngressRuleForServicePort(env.getIngresses().values(), service, port)\n        .isPresent();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/RuntimeServerBuilder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.runtime.ServerStatus;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerImpl;\nimport org.eclipse.che.api.workspace.shared.Constants;\n\n/**\n * Helper class to build {@link ServerImpl} from parts like port, host, path, etc. It also adds port\n * that let to server creation as attribute {@link\n * org.eclipse.che.api.workspace.shared.Constants#SERVER_PORT_ATTRIBUTE}\n *\n * @author Oleksandr Garagatyi\n */\npublic class RuntimeServerBuilder {\n\n  private String protocol;\n  private String host;\n  private String port;\n  private String path;\n  private String endpointOrigin;\n  private Map<String, String> attributes;\n  private String targetPort;\n\n  public RuntimeServerBuilder protocol(String protocol) {\n    this.protocol = protocol;\n    return this;\n  }\n\n  public RuntimeServerBuilder host(String host) {\n    this.host = host;\n    return this;\n  }\n\n  public RuntimeServerBuilder port(String port) {\n    this.port = port;\n    return this;\n  }\n\n  public RuntimeServerBuilder path(String path) {\n    this.path = path;\n    return this;\n  }\n\n  public RuntimeServerBuilder endpointOrigin(String authPath) {\n    this.endpointOrigin = authPath;\n    return this;\n  }\n\n  public RuntimeServerBuilder attributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n    return this;\n  }\n\n  public RuntimeServerBuilder targetPort(String targetPort) {\n    this.targetPort = removeSuffix(targetPort);\n    return this;\n  }\n\n  public ServerImpl build() {\n    if (endpointOrigin == null) {\n      endpointOrigin = \"/\";\n    }\n    StringBuilder ub = new StringBuilder();\n    if (protocol != null) {\n      ub.append(protocol).append(\"://\");\n    } else {\n      ub.append(\"tcp://\");\n    }\n    ub.append(host);\n    if (port != null) {\n      ub.append(':').append(removeSuffix(port));\n    }\n    if (path != null) {\n      if (!path.isEmpty() && !path.startsWith(\"/\")) {\n        ub.append(\"/\");\n      }\n      ub.append(path);\n    }\n    Map<String, String> completeAttributes = new HashMap<>(attributes);\n    completeAttributes.put(Constants.SERVER_PORT_ATTRIBUTE, targetPort);\n    ServerConfig.setEndpointOrigin(completeAttributes, endpointOrigin);\n    return new ServerImpl()\n        .withUrl(ub.toString())\n        .withStatus(ServerStatus.UNKNOWN)\n        .withAttributes(completeAttributes);\n  }\n\n  /** Removes suffix of {@link ServerConfig} such as \"/tcp\" when port value \"8080/tcp\". */\n  private String removeSuffix(String port) {\n    return port.split(\"/\")[0];\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/ServerServiceBuilder.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server;\n\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\n\n/**\n * Helps to build service that expose servers.\n *\n * @author Sergii Leshchenko\n */\npublic class ServerServiceBuilder {\n\n  private String name;\n  private String machineName;\n  private final Map<String, String> selector = new HashMap<>();\n  private List<ServicePort> ports = Collections.emptyList();\n  private Map<String, ? extends ServerConfig> serversConfigs = Collections.emptyMap();\n\n  public ServerServiceBuilder withName(String name) {\n    this.name = name;\n    return this;\n  }\n\n  public ServerServiceBuilder withSelectorEntry(String key, String value) {\n    selector.put(key, value);\n    return this;\n  }\n\n  public ServerServiceBuilder withPorts(List<ServicePort> ports) {\n    this.ports = ports;\n    return this;\n  }\n\n  public ServerServiceBuilder withServers(Map<String, ? extends ServerConfig> serversConfigs) {\n    this.serversConfigs = serversConfigs;\n    return this;\n  }\n\n  public ServerServiceBuilder withMachineName(String machineName) {\n    this.machineName = machineName;\n    return this;\n  }\n\n  public Service build() {\n    io.fabric8.kubernetes.api.model.ServiceBuilder builder =\n        new io.fabric8.kubernetes.api.model.ServiceBuilder();\n    return builder\n        .withNewMetadata()\n        .withName(name.replace(\"/\", \"-\").toLowerCase())\n        .withAnnotations(\n            Annotations.newSerializer()\n                .servers(serversConfigs)\n                .machineName(machineName)\n                .annotations())\n        .endMetadata()\n        .withNewSpec()\n        .withSelector(selector)\n        .withPorts(ports)\n        .endSpec()\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/WorkspaceExposureType.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server;\n\nimport static java.util.Objects.requireNonNull;\n\n/** Lists all the possible types of workspace exposure. */\npublic enum WorkspaceExposureType {\n  GATEWAY(\"gateway\"),\n  NATIVE(\"native\");\n\n  private final String configValue;\n\n  WorkspaceExposureType(String configValue) {\n    this.configValue = configValue;\n  }\n\n  public String getConfigValue() {\n    return configValue;\n  }\n\n  public static WorkspaceExposureType fromConfigurationValue(String configValue) {\n    requireNonNull(configValue);\n    for (WorkspaceExposureType s : WorkspaceExposureType.values()) {\n      if (s.configValue.equals(configValue)) {\n        return s;\n      }\n    }\n\n    throw new IllegalArgumentException(\"Unknown server resolver strategy: \" + configValue);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/CombinedSingleHostServerExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static java.util.stream.Collectors.toMap;\n\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * This {@link ExternalServerExposer} is used in single-host mode when we need to expose some\n * servers on subdomain, instead of subpaths.\n *\n * <p>It aggregates 2 {@link ExternalServerExposer}s, using one to expose servers on subdomand, and\n * 2nd to expose servers on subpaths. It determines which to use for individual server based on some\n * attribute in {@link ServerConfig#getAttributes()} (see implementation {@link\n * CombinedSingleHostServerExposer#expose(KubernetesEnvironment, String, String, String,\n * ServicePort, Map)} for the details).\n *\n * @param <T> environment type\n */\npublic class CombinedSingleHostServerExposer<T extends KubernetesEnvironment>\n    implements ExternalServerExposer<T> {\n\n  private final ExternalServerExposer<T> subdomainServerExposer;\n  private final ExternalServerExposer<T> subpathServerExposer;\n\n  public CombinedSingleHostServerExposer(\n      ExternalServerExposer<T> subdomainServerExposer,\n      ExternalServerExposer<T> subpathServerExposer) {\n    this.subdomainServerExposer = subdomainServerExposer;\n    this.subpathServerExposer = subpathServerExposer;\n  }\n\n  /**\n   * Exposes given 'externalServers' to either subdomain or subpath, using 2 different {@link\n   * ExternalServerExposer}s. Which one to use for individual server is determined with {@link\n   * ServerConfig#REQUIRE_SUBDOMAIN} attribute.\n   *\n   * @param k8sEnv environment\n   * @param machineName machine containing servers\n   * @param serviceName service associated with machine, mapping all machine server ports\n   * @param serverId non-null for a unique server, null for a compound set of servers that should be\n   *     exposed together.\n   * @param servicePort specific service port to be exposed externally\n   * @param externalServers server configs of servers to be exposed externally\n   */\n  @Override\n  public void expose(\n      T k8sEnv,\n      String machineName,\n      String serviceName,\n      String serverId,\n      ServicePort servicePort,\n      Map<String, ServerConfig> externalServers) {\n\n    if (serverId == null) {\n      // this is the ID for non-unique servers\n      serverId = servicePort.getName();\n    }\n\n    Map<String, ServerConfig> subpathServers = getStrategyConformingServers(externalServers);\n    Map<String, ServerConfig> subdomainServers = getServersRequiringSubdomain(externalServers);\n\n    if (!subpathServers.isEmpty()) {\n      subpathServerExposer.expose(\n          k8sEnv, machineName, serviceName, serverId, servicePort, subpathServers);\n    }\n\n    if (!subdomainServers.isEmpty()) {\n      subdomainServerExposer.expose(\n          k8sEnv, machineName, serviceName, serverId, servicePort, subdomainServers);\n    }\n  }\n\n  @Override\n  public Map<String, ServerConfig> getStrategyConformingServers(\n      Map<String, ServerConfig> externalServers) {\n    return externalServers.entrySet().stream()\n        .filter(e -> !e.getValue().isRequireSubdomain())\n        .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));\n  }\n\n  @Override\n  public Map<String, ServerConfig> getServersRequiringSubdomain(\n      Map<String, ServerConfig> externalServers) {\n    return externalServers.entrySet().stream()\n        .filter(e -> e.getValue().isRequireSubdomain())\n        .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/DefaultHostExternalServiceExposureStrategy.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\n/**\n * Provides a path-based strategy for exposing service ports outside the cluster using Ingress\n * Ingresses will be created without an explicit host (defaulting to *).\n *\n * <p>This strategy uses different Ingress path entries <br>\n * Each external server is exposed with a unique path prefix.\n *\n * <p>This strategy imposes limitation on user-developed applications. <br>\n * It should only be used for local development with a single IP address\n *\n * <pre>\n *   Path-Based Ingress exposing service's port:\n * Ingress\n * ...\n * spec:\n *   rules:\n *     - http:\n *         paths:\n *           - path: service123/webapp        ---->> Service.metadata.name + / + Service.spec.ports[0].name\n *             backend:\n *               serviceName: service123      ---->> Service.metadata.name\n *               servicePort: [8080|web-app]  ---->> Service.spec.ports[0].[port|name]\n * </pre>\n *\n * @author Sergii Leshchenko\n * @author Guy Daich\n */\npublic class DefaultHostExternalServiceExposureStrategy implements ExternalServiceExposureStrategy {\n\n  public static final String DEFAULT_HOST_STRATEGY = \"default-host\";\n\n  @Override\n  public String getExternalHost(String serviceName, String serverName) {\n    return null;\n  }\n\n  @Override\n  public String getExternalPath(String serviceName, String serverName) {\n    return \"/\" + serviceName + \"/\" + serverName;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/ExternalServerExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.Collections;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver.ServerResolver;\n\n/**\n * Helps to expose internal Che services to outside the cluster. Implementations should create\n * objects in given {@link KubernetesEnvironment}. These object must be properly annotated (see\n * {@link org.eclipse.che.workspace.infrastructure.kubernetes.Annotations}) so {@link\n * ServerResolver} can later use them.\n *\n * @param <T> environment type\n */\npublic interface ExternalServerExposer<T extends KubernetesEnvironment> {\n\n  /**\n   * Exposes service port on given service. The exposed service port is associated with a specific\n   * Server configuration. Server configuration should be encoded in the exposing object's\n   * annotations, to be used by {@link ServerResolver}.\n   *\n   * @param k8sEnv environment\n   * @param machineName machine containing servers\n   * @param serviceName service associated with machine, mapping all machine server ports\n   * @param serverId non-null for a unique server, null for a compound set of servers that should be\n   *     exposed together.\n   * @param servicePort specific service port to be exposed externally\n   * @param externalServers server configs of servers to be exposed externally\n   */\n  void expose(\n      T k8sEnv,\n      @Nullable String machineName,\n      String serviceName,\n      String serverId,\n      ServicePort servicePort,\n      Map<String, ServerConfig> externalServers);\n\n  /**\n   * Returns the servers from the provided map that should be deployed using the current configured\n   * server exposure strategy.\n   *\n   * @param externalServers all the external servers that are being deployed\n   * @return a view of the provided map\n   */\n  default Map<String, ServerConfig> getStrategyConformingServers(\n      Map<String, ServerConfig> externalServers) {\n    return externalServers;\n  }\n\n  /**\n   * Returns the servers from the provided map that should be deployed on a subdomain regardless of\n   * the current configured server exposure strategy.\n   *\n   * @param externalServers all the external servers that are being deployed\n   * @return a view of the provided map\n   */\n  default Map<String, ServerConfig> getServersRequiringSubdomain(\n      Map<String, ServerConfig> externalServers) {\n    return Collections.emptyMap();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/ExternalServerExposerProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport javax.inject.Provider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * Provides {@link ExternalServerExposer} implementations based on configuration.\n *\n * @param <T> type of environment\n */\npublic interface ExternalServerExposerProvider<T extends KubernetesEnvironment>\n    extends Provider<ExternalServerExposer<T>> {}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/ExternalServerIngressBuilder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressPath;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressPathBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressRuleValue;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressRuleValueBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBackendBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressRule;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressRuleBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressServiceBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressServiceBackendBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressSpec;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressSpecBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.ServiceBackendPortBuilder;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\n\n/**\n * helper class for builder ingresses. Creates an ingress with a single rule, based on hostname,\n * http path. Ingress maps path to a specific service and service port.\n *\n * @author Guy Daich\n */\npublic class ExternalServerIngressBuilder {\n\n  private String host;\n  private String path;\n  private String name;\n  private String serviceName;\n  private String servicePortName;\n  private Integer servicePort;\n  private Map<String, ? extends ServerConfig> serversConfigs;\n  private String machineName;\n  private Map<String, String> annotations;\n  private Map<String, String> labels;\n\n  @VisibleForTesting static final String INGRESS_PATH_TYPE = \"Prefix\";\n\n  public ExternalServerIngressBuilder withHost(String host) {\n    this.host = host;\n    return this;\n  }\n\n  public ExternalServerIngressBuilder withPath(String path) {\n    this.path = path;\n    return this;\n  }\n\n  public ExternalServerIngressBuilder withName(String name) {\n    this.name = name;\n    return this;\n  }\n\n  public ExternalServerIngressBuilder withServiceName(String serviceName) {\n    this.serviceName = serviceName;\n    return this;\n  }\n\n  public ExternalServerIngressBuilder withAnnotations(Map<String, String> annotations) {\n    this.annotations = annotations;\n    return this;\n  }\n\n  public ExternalServerIngressBuilder withServicePort(Integer targetPort) {\n    this.servicePort = targetPort;\n    return this;\n  }\n\n  public ExternalServerIngressBuilder withServicePortName(String targetPortName) {\n    this.servicePortName = targetPortName;\n    return this;\n  }\n\n  public ExternalServerIngressBuilder withServers(\n      Map<String, ? extends ServerConfig> serversConfigs) {\n    this.serversConfigs = serversConfigs;\n    return this;\n  }\n\n  public ExternalServerIngressBuilder withMachineName(String machineName) {\n    this.machineName = machineName;\n    return this;\n  }\n\n  public ExternalServerIngressBuilder withLabels(Map<String, String> labels) {\n    this.labels = labels;\n    return this;\n  }\n\n  public Ingress build() {\n\n    ServiceBackendPortBuilder serviceBackendPortBuilder = new ServiceBackendPortBuilder();\n\n    // cannot set both port and name\n    if (!isNullOrEmpty(servicePortName)) {\n      serviceBackendPortBuilder.withName(servicePortName);\n    } else if (servicePort != null) {\n      serviceBackendPortBuilder.withNumber(servicePort);\n    }\n\n    IngressServiceBackend ingressServiceBackend =\n        new IngressServiceBackendBuilder()\n            .withPort(serviceBackendPortBuilder.build())\n            .withName(serviceName)\n            .build();\n\n    IngressBackend ingressBackend =\n        new IngressBackendBuilder().withService(ingressServiceBackend).build();\n\n    HTTPIngressPathBuilder httpIngressPathBuilder =\n        new HTTPIngressPathBuilder().withBackend(ingressBackend).withPathType(INGRESS_PATH_TYPE);\n\n    if (!isNullOrEmpty(path)) {\n      httpIngressPathBuilder.withPath(path);\n    }\n\n    HTTPIngressPath httpIngressPath = httpIngressPathBuilder.build();\n\n    HTTPIngressRuleValue httpIngressRuleValue =\n        new HTTPIngressRuleValueBuilder().withPaths(httpIngressPath).build();\n    IngressRuleBuilder ingressRuleBuilder = new IngressRuleBuilder().withHttp(httpIngressRuleValue);\n\n    if (!isNullOrEmpty(host)) {\n      ingressRuleBuilder.withHost(host);\n    }\n\n    IngressRule ingressRule = ingressRuleBuilder.build();\n\n    IngressSpec ingressSpec = new IngressSpecBuilder().withRules(ingressRule).build();\n\n    Map<String, String> ingressAnnotations = new HashMap<>(annotations);\n    ingressAnnotations.putAll(\n        Annotations.newSerializer().servers(serversConfigs).machineName(machineName).annotations());\n\n    return new IngressBuilder()\n        .withSpec(ingressSpec)\n        .withMetadata(\n            new ObjectMetaBuilder()\n                .withName(name)\n                .withAnnotations(ingressAnnotations)\n                .withLabels(labels)\n                .build())\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/ExternalServiceExposureStrategy.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Implementations of this strategy are used by the {@link ExternalServerExposer} to compose an\n * Ingress rule that exposes the services.\n */\npublic interface ExternalServiceExposureStrategy {\n\n  /** Returns a host that should be used to expose the service */\n  @Nullable\n  String getExternalHost(String serviceName, String serverName);\n\n  /** Returns the path on which the service should be exposed */\n  String getExternalPath(String serviceName, String serverName);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/GatewayRouteConfigGenerator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport java.util.Map;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\n\n/**\n * Generates config for external servers that we want to expose in the Gateway.\n *\n * <p>Implementation provides configuration for specific Gateway technology (e.g., Traefik).\n */\npublic interface GatewayRouteConfigGenerator {\n\n  /**\n   * Add prepared {@link ConfigMap},that will hold gateway route configuration, to the generator. So\n   * it can be generated later with {@link GatewayRouteConfigGenerator#generate(String)}.\n   *\n   * <p>Provided {@link ConfigMap} must be annotated with {@link\n   * org.eclipse.che.api.core.model.workspace.config.ServerConfig} annotations. It's responsibility\n   * of the caller to ensure that. The {@link GatewayRouteConfigGenerator} fails on {@link\n   * GatewayRouteConfigGenerator#generate(String)} when invalid {@link ConfigMap}s are added to it.\n   *\n   * @param routeConfig config to add\n   */\n  void addRouteConfig(String name, ConfigMap routeConfig) throws InfrastructureException;\n\n  /**\n   * Generates content of configurations for services, defined earlier by added {@link\n   * GatewayRouteConfigGenerator#addRouteConfig(String, ConfigMap)}. Returned {@code Map<String,\n   * String>} must be ready to be used as a {@link ConfigMap}'s data, which is further injected into\n   * Gateway pod.\n   *\n   * <p>Implementation must ensure that Gateway configured with returned content will route the\n   * requests on {@code path} into {@code serviceUrl}. Also it must strip {@code path} from request\n   * url.\n   *\n   * <p>Returned Map's Keys will be used as file names, Values as their content. e.g.:\n   *\n   * <pre>\n   *   service1.yml: {config-content-for-service-1}\n   *   service2.yml: {config-content-for-service-2}\n   * </pre>\n   *\n   * @return full content of configuration for the services\n   */\n  Map<String, String> generate(String namespace) throws InfrastructureException;\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/GatewayRouteConfigGeneratorFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * This Factory provides {@link GatewayRouteConfigGenerator} instances, so implementation using\n * these can stay Gateway technology agnostic.\n */\n@Singleton\npublic class GatewayRouteConfigGeneratorFactory {\n\n  private final String clusterDomain;\n\n  @Inject\n  public GatewayRouteConfigGeneratorFactory(\n      @Nullable @Named(\"che.infra.kubernetes.cluster_domain\") String clusterDomain) {\n    this.clusterDomain = clusterDomain;\n  }\n\n  public GatewayRouteConfigGenerator create() {\n    return new TraefikGatewayRouteConfigGenerator(clusterDomain);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/GatewayServerExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static java.lang.Boolean.TRUE;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVICE_NAME_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVICE_PORT_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Annotations.CREATE_IN_CHE_INSTALLATION_NAMESPACE;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.GatewayConfigmapLabels;\n\n/**\n * Uses gateway configured with ConfigMaps to expose servers.\n *\n * @param <T> type of environment\n */\npublic class GatewayServerExposer<T extends KubernetesEnvironment>\n    implements ExternalServerExposer<T> {\n\n  private final ExternalServiceExposureStrategy strategy;\n  private final GatewayConfigmapLabels configmapLabels;\n\n  @Inject\n  public GatewayServerExposer(\n      ExternalServiceExposureStrategy strategy, GatewayConfigmapLabels configmapLabels) {\n    this.strategy = strategy;\n    this.configmapLabels = configmapLabels;\n  }\n\n  /**\n   * Exposes service port on given service externally (outside kubernetes cluster) using the Gateway\n   * specific configurations.\n   *\n   * @param k8sEnv Kubernetes environment\n   * @param machineName machine containing servers\n   * @param serviceName service associated with machine, mapping all machine server ports\n   * @param serverId non-null for a unique server, null for a compound set of servers that should be\n   *     exposed together.\n   * @param servicePort specific service port to be exposed externally\n   * @param externalServers server configs of servers to be exposed externally\n   */\n  @Override\n  public void expose(\n      T k8sEnv,\n      @Nullable String machineName,\n      String serviceName,\n      String serverId,\n      ServicePort servicePort,\n      Map<String, ServerConfig> externalServers) {\n\n    if (serverId == null) {\n      // this is the ID for non-unique servers\n      serverId = servicePort.getName();\n    }\n\n    for (String esKey : externalServers.keySet()) {\n      final String serverName = KubernetesServerExposer.makeServerNameValidForDns(serverId);\n      final String name = createName(serviceName, serverName);\n      k8sEnv\n          .getConfigMaps()\n          .put(\n              name,\n              createGatewayRouteConfigmap(\n                  name,\n                  machineName,\n                  serviceName,\n                  servicePort,\n                  serverName,\n                  esKey,\n                  externalServers.get(esKey)));\n    }\n  }\n\n  private ConfigMap createGatewayRouteConfigmap(\n      String name,\n      String machineName,\n      String serviceName,\n      ServicePort servicePort,\n      String serverName,\n      String scRef,\n      ServerConfig serverConfig) {\n\n    final String path = ensureEndsWithSlash(strategy.getExternalPath(serviceName, serverName));\n    serverConfig.getAttributes().put(SERVICE_NAME_ATTRIBUTE, serviceName);\n    ServerConfig.setEndpointOrigin(serverConfig.getAttributes(), path);\n    serverConfig\n        .getAttributes()\n        .put(SERVICE_PORT_ATTRIBUTE, getTargetPort(servicePort.getTargetPort()));\n\n    final Map<String, String> annotations =\n        Annotations.newSerializer()\n            .server(scRef, serverConfig)\n            .machineName(machineName)\n            .annotations();\n    annotations.put(CREATE_IN_CHE_INSTALLATION_NAMESPACE, TRUE.toString());\n\n    ConfigMapBuilder gatewayConfigMap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(name)\n            .withLabels(configmapLabels.getLabels())\n            .withAnnotations(annotations)\n            .endMetadata();\n    return gatewayConfigMap.build();\n  }\n\n  private String ensureEndsWithSlash(String path) {\n    return path.endsWith(\"/\") ? path : path + '/';\n  }\n\n  private String createName(String serviceName, String serverName) {\n    return serviceName + \"-\" + serverName;\n  }\n\n  private String getTargetPort(IntOrString targetPort) {\n    return targetPort.getIntVal() != null\n        ? targetPort.getIntVal().toString()\n        : targetPort.getStrVal();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/IngressPathTransformInverter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.IngressServerExposer.PATH_TRANSFORM_PATH_CATCH;\n\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * This class is used to undo the effect of the \"che.infra.kubernetes.ingress.path_transform\"\n * configuration on the ingress paths. I.e. use this to get the path-part of the URL exposed by an\n * ingress given an ingress path.\n *\n * <p>This is usually a noop, apart from the single-host mode.\n */\npublic class IngressPathTransformInverter {\n  private static final Logger LOGGER = LoggerFactory.getLogger(IngressPathTransformInverter.class);\n  private static final Pattern PATH_FORMAT_DECONSTRUCTION_REGEX =\n      Pattern.compile(\"(.*)\" + PATH_TRANSFORM_PATH_CATCH + \"(.*)\");\n\n  private final Pattern pathTransformInverse;\n\n  @Inject\n  public IngressPathTransformInverter(\n      @Nullable @Named(\"che.infra.kubernetes.ingress.path_transform\") String pathTransformFmt) {\n    this.pathTransformInverse = extractPathFromFmt(pathTransformFmt);\n  }\n\n  /**\n   * Given the ingress path transformation from the configuration, this method constructs a regex\n   * that is able to extract the original path from a value transformed by the path transformation.\n   * E.g. when applied to the transformed path, the regex will extract the substring corresponding\n   * to the original \"%s\" in the path transformation.\n   *\n   * @param pathTransformFmt the path transformation format\n   * @return the regex that essentially reverts the effect of the path transformation\n   */\n  private static Pattern extractPathFromFmt(String pathTransformFmt) {\n    if (pathTransformFmt == null) {\n      return Pattern.compile(\"^(.*)$\");\n    }\n    Matcher m = PATH_FORMAT_DECONSTRUCTION_REGEX.matcher(pathTransformFmt);\n    if (m.matches() && m.groupCount() == 2) {\n      String prefix = Pattern.quote(m.group(1));\n      String suffix = Pattern.quote(m.group(2));\n      return Pattern.compile(\"^\" + prefix + \"(.*)\" + suffix + \"$\");\n    } else {\n      LOGGER.warn(\n          format(\n              \"Invalid path transformation format '%s' could not be successfully matched by the\"\n                  + \" deconstruction regex '%s'. Using the path transformation as is which can result in malfunctioning\"\n                  + \" ingresses.\",\n              pathTransformFmt, PATH_FORMAT_DECONSTRUCTION_REGEX));\n      return Pattern.compile(Pattern.quote(pathTransformFmt));\n    }\n  }\n\n  /**\n   * Sometimes, the exposer needs to modify the path contained in the object exposing the server\n   * (i.e. ingress in this case). Namely, this is needed to make the URL rewriting work for\n   * single-host strategy where the path needs to contain a regular expression match group to retain\n   * some of the path (at least in the case of the nginx ingress controller).\n   *\n   * <p>This method reverts such mangling and returns to the user a path that can be used by the\n   * HTTP clients.\n   *\n   * @param path the path contained within the configuration of the object that needs to be\n   *     demangled\n   * @return the path demangled such that it can be used in an externally reachable URL or the\n   *     untouched path if the path doesn't match the configured path format.\n   */\n  public String undoPathTransformation(String path) {\n    Matcher matcher = pathTransformInverse.matcher(path);\n    if (matcher.matches()) {\n      return matcher.group(1);\n    } else {\n      return path;\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/IngressServerExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static java.util.Collections.emptyMap;\n\nimport com.google.common.base.Splitter;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport java.util.HashMap;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer;\n\n/**\n * Uses Kubernetes {@link Ingress}es to expose the services.\n *\n * @see ExternalServerExposer\n */\n@Singleton\npublic class IngressServerExposer<T extends KubernetesEnvironment>\n    implements ExternalServerExposer<T> {\n\n  /**\n   * A string to look for in the value of the \"che.infra.kubernetes.ingress.path_transform\"\n   * configuration property that marks the location where the generated public path of the service\n   * should be put in the final string representing the ingress path.\n   */\n  static final String PATH_TRANSFORM_PATH_CATCH = \"%s\";\n\n  static final String SERVICE_NAME_PLACEHOLDER = \"<service-name>\";\n\n  private final ExternalServiceExposureStrategy serviceExposureStrategy;\n  private final Map<String, String> preconfiguredAnnotations;\n  private final Map<String, String> labels;\n  private final String pathTransformFmt;\n\n  @Inject\n  public IngressServerExposer(\n      ExternalServiceExposureStrategy serviceExposureStrategy,\n      @Named(\"infra.kubernetes.ingress.annotations\") Map<String, String> annotations,\n      @Nullable @Named(\"che.infra.kubernetes.ingress.labels\") String labelsProperty,\n      @Nullable @Named(\"che.infra.kubernetes.ingress.path_transform\") String pathTransformFmt) {\n    this.serviceExposureStrategy = serviceExposureStrategy;\n    this.preconfiguredAnnotations = annotations;\n    this.pathTransformFmt = pathTransformFmt == null ? PATH_TRANSFORM_PATH_CATCH : pathTransformFmt;\n    this.labels =\n        labelsProperty != null\n            ? Splitter.on(\",\").withKeyValueSeparator(\"=\").split(labelsProperty)\n            : emptyMap();\n  }\n\n  /**\n   * Exposes service port on given service externally (outside kubernetes cluster) using {@link\n   * Ingress}.\n   *\n   * @see ExternalServerExposer#expose(KubernetesEnvironment, String, String, String, ServicePort,\n   *     Map)\n   */\n  @Override\n  public void expose(\n      T k8sEnv,\n      @Nullable String machineName,\n      String serviceName,\n      String serverId,\n      ServicePort servicePort,\n      Map<String, ServerConfig> externalServers) {\n\n    if (serverId == null) {\n      // this is the ID for non-unique servers\n      serverId = servicePort.getName();\n    }\n\n    Ingress ingress =\n        generateIngress(machineName, serviceName, serverId, servicePort, externalServers);\n\n    k8sEnv.getIngresses().put(ingress.getMetadata().getName(), ingress);\n  }\n\n  private Ingress generateIngress(\n      String machineName,\n      String serviceName,\n      String serverId,\n      ServicePort servicePort,\n      Map<String, ServerConfig> servers) {\n\n    String serverName = KubernetesServerExposer.makeServerNameValidForDns(serverId);\n    ExternalServerIngressBuilder ingressBuilder = new ExternalServerIngressBuilder();\n    String host = serviceExposureStrategy.getExternalHost(serviceName, serverName);\n    if (host != null) {\n      ingressBuilder = ingressBuilder.withHost(host);\n    }\n\n    Map<String, String> annotations = new HashMap<>(preconfiguredAnnotations);\n    for (Map.Entry<String, String> entry : annotations.entrySet()) {\n      String value = entry.getValue();\n      if (value.contains(SERVICE_NAME_PLACEHOLDER)) {\n        entry.setValue(value.replaceAll(SERVICE_NAME_PLACEHOLDER, serviceName));\n      }\n    }\n\n    return ingressBuilder\n        .withPath(\n            String.format(\n                pathTransformFmt,\n                ensureEndsWithSlash(\n                    serviceExposureStrategy.getExternalPath(serviceName, serverName))))\n        .withName(getIngressName(serviceName, serverName))\n        .withMachineName(machineName)\n        .withServiceName(serviceName)\n        .withAnnotations(annotations)\n        .withLabels(labels)\n        .withServicePortName(servicePort.getName())\n        .withServicePort(servicePort.getPort())\n        .withServers(servers)\n        .build();\n  }\n\n  private static String ensureEndsWithSlash(String path) {\n    return path.endsWith(\"/\") ? path : path + '/';\n  }\n\n  private static String getIngressName(String serviceName, String serverName) {\n    return serviceName + \"-\" + serverName;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/KubernetesExternalServerExposerProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.SingleHostExternalServiceExposureStrategy.SINGLE_HOST_STRATEGY;\n\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.AbstractExposureStrategyAwareProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.WorkspaceExposureType;\n\n/**\n * Provides {@link ExternalServerExposer} based on `che.infra.kubernetes.server_strategy` and\n * `che.infra.kubernetes.singlehost.workspace.exposure` properties.\n *\n * <p>Based on server strategy, it can create a {@link CombinedSingleHostServerExposer} with\n * Kubernetes specific {@link IngressServerExposer} for exposing servers on subdomains.\n *\n * @param <T> type of environment\n */\n@Singleton\npublic class KubernetesExternalServerExposerProvider<T extends KubernetesEnvironment>\n    extends AbstractExposureStrategyAwareProvider<ExternalServerExposer<T>>\n    implements ExternalServerExposerProvider<T> {\n\n  private final ExternalServerExposer<T> combinedInstance;\n\n  @Inject\n  public KubernetesExternalServerExposerProvider(\n      @Named(\"che.infra.kubernetes.server_strategy\") String exposureStrategy,\n      @Named(\"che.infra.kubernetes.singlehost.workspace.exposure\") String exposureType,\n      @Named(\"che.infra.kubernetes.singlehost.workspace.devfile_endpoint_exposure\")\n          String devfileEndpointsExposure,\n      @Named(\"multihost-exposer\") ExternalServerExposer<T> multihostExposer,\n      Map<WorkspaceExposureType, ExternalServerExposer<T>> exposers) {\n    super(\n        exposureStrategy,\n        exposureType,\n        exposers,\n        \"Could not find an external server exposer implementation for the exposure type '%s'.\");\n\n    if (SINGLE_HOST_STRATEGY.equals(exposureStrategy)\n        && MULTI_HOST_STRATEGY.equals(devfileEndpointsExposure)) {\n      this.combinedInstance = new CombinedSingleHostServerExposer<>(multihostExposer, instance);\n    } else {\n      this.combinedInstance = null;\n    }\n  }\n\n  @Override\n  public ExternalServerExposer<T> get() {\n    return combinedInstance != null ? combinedInstance : instance;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/MultiHostExternalServiceExposureStrategy.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ServiceExposureStrategyProvider.STRATEGY_PROPERTY;\n\nimport com.google.common.base.Strings;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.inject.ConfigurationException;\n\n/**\n * Provides a host-based strategy for exposing service ports outside the cluster using Ingress\n *\n * <p>This strategy uses different Ingress host entries <br>\n * Each external server is exposed with a unique subdomain of CHE_DOMAIN.\n *\n * <pre>\n *   Host-Based Ingress exposing service's port:\n * Ingress\n * ...\n * spec:\n *   rules:\n *     - host: service123-webapp.che-domain   ---->> Service.metadata.name + - + Service.spec.ports[0].name + . + CHE_DOMAIN\n *     - http:\n *         paths:\n *           - path: /\n *             backend:\n *               serviceName: service123      ---->> Service.metadata.name\n *               servicePort: [8080|web-app]  ---->> Service.spec.ports[0].[port|name]\n * </pre>\n *\n * @author Sergii Leshchenko\n * @author Guy Daich\n */\npublic class MultiHostExternalServiceExposureStrategy implements ExternalServiceExposureStrategy {\n\n  public static final String MULTI_HOST_STRATEGY = \"multi-host\";\n  protected static final String INGRESS_DOMAIN_PROPERTY = \"che.infra.kubernetes.ingress.domain\";\n\n  private final String domain;\n\n  @Inject\n  public MultiHostExternalServiceExposureStrategy(\n      @Named(INGRESS_DOMAIN_PROPERTY) String domain, @Named(STRATEGY_PROPERTY) String strategy) {\n    if (Strings.isNullOrEmpty(domain) && MULTI_HOST_STRATEGY.equals(strategy)) {\n      throw new ConfigurationException(\n          format(\n              \"Strategy of generating ingress URLs for Che servers is set to '%s', \"\n                  + \"but property '%s' is not set\",\n              MULTI_HOST_STRATEGY, INGRESS_DOMAIN_PROPERTY));\n    }\n    this.domain = domain;\n  }\n\n  @Override\n  public String getExternalHost(String serviceName, String serverName) {\n    return serviceName + \"-\" + serverName + \".\" + domain;\n  }\n\n  @Override\n  public String getExternalPath(String serviceName, String serverName) {\n    return \"/\";\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/MultihostIngressServerExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * Uses Kubernetes {@link Ingress}es to expose the services using subdomains a.k.a. multi-host.\n *\n * @see ExternalServerExposer\n */\n@Singleton\npublic class MultihostIngressServerExposer<T extends KubernetesEnvironment>\n    extends IngressServerExposer<T> implements ExternalServerExposer<T> {\n  @Inject\n  public MultihostIngressServerExposer(\n      MultiHostExternalServiceExposureStrategy serviceExposureStrategy,\n      @Named(\"infra.kubernetes.ingress.annotations\") Map<String, String> annotations,\n      @Nullable @Named(\"che.infra.kubernetes.ingress.labels\") String labelsProperty,\n      @Nullable @Named(\"che.infra.kubernetes.ingress.path_transform\") String pathTransformFmt) {\n    super(serviceExposureStrategy, annotations, labelsProperty, pathTransformFmt);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/ServiceExposureStrategyProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static java.lang.String.format;\n\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport org.eclipse.che.inject.ConfigurationException;\n\n@Singleton\npublic class ServiceExposureStrategyProvider implements Provider<ExternalServiceExposureStrategy> {\n\n  public static final String STRATEGY_PROPERTY = \"che.infra.kubernetes.server_strategy\";\n\n  private final ExternalServiceExposureStrategy namingStrategy;\n  private final ExternalServiceExposureStrategy multiHostStrategy;\n\n  @Inject\n  public ServiceExposureStrategyProvider(\n      @Named(STRATEGY_PROPERTY) String strategy,\n      Map<String, ExternalServiceExposureStrategy> strategies) {\n\n    namingStrategy = strategies.get(strategy);\n\n    if (namingStrategy == null) {\n      throw new ConfigurationException(\n          format(\"Unsupported server naming strategy '%s' configured\", strategy));\n    }\n\n    multiHostStrategy =\n        strategies.get(MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY);\n    if (multiHostStrategy == null) {\n      throw new ConfigurationException(\n          \"No implementation for 'multi-host' server exposure strategy configured even though it is\"\n              + \" mandatory.\");\n    }\n  }\n\n  /** Returns the configured exposure strategy. */\n  @Override\n  public ExternalServiceExposureStrategy get() {\n    return namingStrategy;\n  }\n\n  /**\n   * Returns the multi-host exposure strategy, regardless of which default exposure strategy is\n   * configured. This is used in workspaces with mixed endpoints (i.e. plugins by default deployed\n   * using the configured strategy and devfile endpoints by default deployed using multi-host).\n   */\n  public ExternalServiceExposureStrategy getMultiHostStrategy() {\n    return multiHostStrategy;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/SingleHostExternalServiceExposureStrategy.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\n\n/**\n * Provides a path-based strategy for exposing service ports outside the cluster using Ingress.\n * Ingresses will be created with a common host name for all workspaces.\n *\n * <p>This strategy uses different Ingress path entries <br>\n * Each external server is exposed with a unique path prefix.\n *\n * <p>This strategy imposes limitation on user-developed applications. <br>\n *\n * <pre>\n *   Path-Based Ingress exposing service's port:\n * Ingress\n * ...\n * spec:\n *   rules:\n *     - host: CHE_HOST\n *       http:\n *         paths:\n *           - path: service123/webapp        ---->> Service.metadata.name + / + Service.spec.ports[0].name\n *             backend:\n *               serviceName: service123      ---->> Service.metadata.name\n *               servicePort: [8080|web-app]  ---->> Service.spec.ports[0].[port|name]\n * </pre>\n *\n * @author Sergii Leshchenko\n * @author Guy Daich\n */\npublic class SingleHostExternalServiceExposureStrategy implements ExternalServiceExposureStrategy {\n\n  public static final String SINGLE_HOST_STRATEGY = \"single-host\";\n  private final String cheHost;\n\n  @Inject\n  public SingleHostExternalServiceExposureStrategy(@Named(\"che.host\") String cheHost) {\n    this.cheHost = cheHost;\n  }\n\n  @Override\n  public String getExternalHost(String serviceName, String serverName) {\n    return cheHost;\n  }\n\n  @Override\n  public String getExternalPath(String serviceName, String serverName) {\n    return \"/\" + serviceName + \"/\" + serverName;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/TraefikGatewayRouteConfigGenerator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature.WRITE_DOC_START_MARKER;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVICE_NAME_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVICE_PORT_ATTRIBUTE;\n\nimport com.fasterxml.jackson.dataformat.yaml.YAMLFactory;\nimport com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;\nimport com.google.common.base.Strings;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport java.io.IOException;\nimport java.io.StringWriter;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\n\n/**\n * Config generator for Traefik Gateway.\n *\n * <p>Content of single service configuration looks like this:\n *\n * <pre>\n * http:\n *   routers:\n *     {name}:\n *       rule: \"PathPrefix(`{path}`)\"\n *       service: {name}\n *       middlewares:\n *       - \"{name}\"\n *       priority: 100\n *   services:\n *     {name}:\n *       loadBalancer:\n *         servers:\n *         - url: '{serviceUrl}'\n *   middlewares:\n *     {name}:\n *       stripPrefix:\n *         prefixes:\n *         - \"{GatewayRouteConfig#routePath}\"\n * </pre>\n */\npublic class TraefikGatewayRouteConfigGenerator implements GatewayRouteConfigGenerator {\n\n  private static final String SERVICE_URL_FORMAT_WITH_CLUSTER_DOMAIN = \"http://%s.%s.svc.%s:%s\";\n  private static final String SERVICE_URL_FORMAT_WITHOUT_CLUSTER_DOMAIN = \"http://%s.%s.svc:%s\";\n\n  private final String clusterDomain;\n\n  public TraefikGatewayRouteConfigGenerator(@Nullable String clusterDomain) {\n    this.clusterDomain = clusterDomain;\n  }\n\n  private final Map<String, ConfigMap> routeConfigs = new HashMap<>();\n\n  @Override\n  public void addRouteConfig(String name, ConfigMap routeConfig) {\n    this.routeConfigs.put(name, routeConfig);\n  }\n\n  /**\n   * Generates configuration for all configs added by {@link\n   * TraefikGatewayRouteConfigGenerator#addRouteConfig(String, ConfigMap)} so far. It does not\n   * change them, so this method can be used repeatedly.\n   *\n   * <p>Returned {@code Map<String, String>} has keys created from {@code name} parameter of {@link\n   * TraefikGatewayRouteConfigGenerator#addRouteConfig(String, ConfigMap)} + '.yml' suffix. Values\n   * are full configuration for single gateway route. This map is suppose to be directly used as\n   * {@link ConfigMap}'s data.\n   *\n   * @return map with added routes configurations\n   */\n  @Override\n  public Map<String, String> generate(String namespace) throws InfrastructureException {\n    Map<String, String> cmData = new HashMap<>();\n    for (Entry<String, ConfigMap> routeConfig : routeConfigs.entrySet()) {\n      Map<String, ServerConfigImpl> servers =\n          new Annotations.Deserializer(routeConfig.getValue().getMetadata().getAnnotations())\n              .servers();\n      if (servers.size() != 1) {\n        throw new InfrastructureException(\n            \"Expected exactly 1 server [\" + routeConfig.getValue().toString() + \"]\");\n      }\n      ServerConfigImpl server = servers.get(servers.keySet().iterator().next());\n      String serviceName = server.getAttributes().get(SERVICE_NAME_ATTRIBUTE);\n      String servicePort = server.getAttributes().get(SERVICE_PORT_ATTRIBUTE);\n\n      String traefikRouteConfig =\n          generate(\n              routeConfig.getKey(),\n              createServiceUrl(serviceName, servicePort, namespace),\n              server.getEndpointOrigin());\n      cmData.put(routeConfig.getKey() + \".yml\", traefikRouteConfig);\n    }\n    return cmData;\n  }\n\n  /**\n   * Generates Traefik specific configuration for single service.\n   *\n   * @param name name of the service\n   * @param serviceUrl url of service we want to route to\n   * @param path path to route and strip\n   * @return traefik service route config\n   */\n  private String generate(String name, String serviceUrl, String path)\n      throws InfrastructureException {\n    StringWriter sw = new StringWriter();\n    try {\n      YAMLGenerator generator =\n          YAMLFactory.builder().disable(WRITE_DOC_START_MARKER).build().createGenerator(sw);\n\n      generator.writeStartObject();\n      generator.writeFieldName(\"http\");\n      generator.writeStartObject();\n\n      generator.writeFieldName(\"routers\");\n      generateRouters(generator, name, path);\n\n      generator.writeFieldName(\"services\");\n      generateServices(generator, name, serviceUrl);\n\n      generator.writeFieldName(\"middlewares\");\n      generateMiddlewares(generator, name, path);\n\n      generator.writeEndObject();\n      generator.writeEndObject();\n\n      generator.flush();\n\n      return sw.toString();\n    } catch (IOException e) {\n      throw new InfrastructureException(e);\n    }\n  }\n\n  /**\n   * generates Routers part of Traefik config\n   *\n   * <pre>\n   * {name}:\n   *   rule: \"PathPrefix(`{path}`)\"\n   *   service: \"{name}\"\n   *   middlewares:\n   *   - \"{name}\"\n   *   priority: 100\n   * </pre>\n   */\n  private void generateRouters(YAMLGenerator generator, String name, String path)\n      throws IOException {\n    generator.writeStartObject();\n    generator.writeFieldName(name);\n    generator.writeStartObject();\n    generator.writeFieldName(\"rule\");\n    generator.writeString(\"PathPrefix(`\" + path + \"`)\");\n    generator.writeFieldName(\"service\");\n    generator.writeString(name);\n    generator.writeFieldName(\"middlewares\");\n    generator.writeStartArray();\n    generator.writeString(name);\n    generator.writeEndArray();\n    generator.writeFieldName(\"priority\");\n    generator.writeNumber(100);\n    generator.writeEndObject();\n    generator.writeEndObject();\n  }\n\n  /**\n   * generates Services part of Traefik config\n   *\n   * <pre>\n   * {name}:\n   *   loadBalancer:\n   *     servers:\n   *     - url: \"{serviceUrl}\"\n   * </pre>\n   */\n  private void generateServices(YAMLGenerator generator, String name, String serviceUrl)\n      throws IOException {\n    generator.writeStartObject();\n    generator.writeFieldName(name);\n    generator.writeStartObject();\n    generator.writeFieldName(\"loadBalancer\");\n    generator.writeStartObject();\n    generator.writeFieldName(\"servers\");\n    generator.writeStartArray();\n    generator.writeStartObject();\n    generator.writeFieldName(\"url\");\n    generator.writeString(serviceUrl);\n    generator.writeEndObject();\n    generator.writeEndArray();\n    generator.writeEndObject();\n    generator.writeEndObject();\n    generator.writeEndObject();\n  }\n\n  /**\n   * generates Middlewares part of Traefik config\n   *\n   * <pre>\n   * {name}:\n   *   stripPrefix:\n   *     prefixes:\n   *     - \"{path}\"\n   * </pre>\n   */\n  private void generateMiddlewares(YAMLGenerator generator, String name, String path)\n      throws IOException {\n    generator.writeStartObject();\n    generator.writeFieldName(name);\n    generator.writeStartObject();\n    generator.writeFieldName(\"stripPrefix\");\n    generator.writeStartObject();\n    generator.writeFieldName(\"prefixes\");\n    generator.writeStartArray();\n    generator.writeString(path);\n    generator.writeEndArray();\n    generator.writeEndObject();\n    generator.writeEndObject();\n    generator.writeEndObject();\n  }\n\n  private String createServiceUrl(String serviceName, String servicePort, String serviceNamespace) {\n    if (Strings.isNullOrEmpty(clusterDomain)) {\n      return String.format(\n          SERVICE_URL_FORMAT_WITHOUT_CLUSTER_DOMAIN, serviceName, serviceNamespace, servicePort);\n    } else {\n      return String.format(\n          SERVICE_URL_FORMAT_WITH_CLUSTER_DOMAIN,\n          serviceName,\n          serviceNamespace,\n          clusterDomain,\n          servicePort);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/resolver/AbstractServerResolver.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.collect.ArrayListMultimap;\nimport com.google.common.collect.Multimap;\nimport io.fabric8.kubernetes.api.model.Service;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerImpl;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.RuntimeServerBuilder;\n\n/**\n * {@link ServerResolver} implementations that uses {@link Service} for internal servers can use\n * this abstract class. The implementation then must define how to resolve external servers by\n * implementing {@link AbstractServerResolver#resolveExternalServers(String)}.\n */\npublic abstract class AbstractServerResolver implements ServerResolver {\n\n  private final Multimap<String, Service> services;\n\n  public AbstractServerResolver(Iterable<Service> services) {\n    this.services = ArrayListMultimap.create();\n    for (Service service : services) {\n      String machineName =\n          Annotations.newDeserializer(service.getMetadata().getAnnotations()).machineName();\n      this.services.put(machineName, service);\n    }\n  }\n\n  /**\n   * Joins together the two URL path fragments together and makes sure the returned path ends with a\n   * slash.\n   *\n   * @param fragment1 the root path fragment\n   * @param fragment2 the sub-path fragment\n   * @return the two path fragments joined together\n   */\n  protected static String buildPath(String fragment1, @Nullable String fragment2) {\n    StringBuilder sb = new StringBuilder(fragment1);\n\n    if (!isNullOrEmpty(fragment2)) {\n      if (!fragment1.endsWith(\"/\")) {\n        sb.append('/');\n      }\n\n      if (fragment2.startsWith(\"/\")) {\n        sb.append(fragment2.substring(1));\n      } else {\n        sb.append(fragment2);\n      }\n    }\n\n    // always end server URLs with a slash, so that they can be safely sub-path'd..\n    if (sb.charAt(sb.length() - 1) != '/') {\n      sb.append('/');\n    }\n\n    return sb.toString();\n  }\n\n  @Override\n  public final Map<String, ServerImpl> resolve(String machineName) {\n    Map<String, ServerImpl> servers = new HashMap<>();\n    servers.putAll(resolveInternalServers(machineName));\n    servers.putAll(resolveExternalServers(machineName));\n    return servers;\n  }\n\n  private Map<String, ServerImpl> resolveInternalServers(String machineName) {\n    return services.get(machineName).stream()\n        .map(this::resolveServiceServers)\n        .flatMap(s -> s.entrySet().stream())\n        .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (s1, s2) -> s2));\n  }\n\n  private Map<String, ServerImpl> resolveServiceServers(Service service) {\n    return Annotations.newDeserializer(service.getMetadata().getAnnotations())\n        .servers()\n        .entrySet()\n        .stream()\n        .collect(\n            Collectors.toMap(\n                Entry::getKey,\n                e ->\n                    // this is only used for internal servers, for which it doesn't make sense to be\n                    // secure. Therefore we don't\n                    // define the authOrigin() on these...\n                    new RuntimeServerBuilder()\n                        .protocol(e.getValue().getProtocol())\n                        .host(service.getMetadata().getName())\n                        .port(e.getValue().getPort())\n                        .path(e.getValue().getPath())\n                        .attributes(e.getValue().getAttributes())\n                        .targetPort(e.getValue().getPort())\n                        .build(),\n                (s1, s2) -> s2));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/resolver/AbstractServerResolverFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.Service;\nimport java.util.List;\nimport java.util.Map;\nimport javax.inject.Named;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.AbstractExposureStrategyAwareProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.WorkspaceExposureType;\n\n/**\n * An abstract class that specifies the logic for creating the server resolvers for given cluster\n * type.\n *\n * @param <T> Type representing the object for exposing endpoints in the cluster. I.e. ingress or\n *     route.\n */\npublic class AbstractServerResolverFactory<T> {\n\n  private final ResolverConstructorProvider<T> constructorProvider;\n\n  protected AbstractServerResolverFactory(\n      @Named(\"che.infra.kubernetes.server_strategy\") String exposureStrategy,\n      @Named(\"che.infra.kubernetes.singlehost.workspace.exposure\") String wsExposureType,\n      Map<WorkspaceExposureType, ResolverConstructor<T>> mapping,\n      String errorMessageTemplate) {\n    constructorProvider =\n        new ResolverConstructorProvider<T>(\n            exposureStrategy, wsExposureType, mapping, errorMessageTemplate);\n  }\n\n  /**\n   * Create {@link ServerResolver} for configured server strategy.\n   *\n   * @return {@link ServerResolver} instance\n   */\n  public ServerResolver create(\n      List<Service> services, List<T> ingresses, List<ConfigMap> configMaps) {\n    return constructorProvider.get().create(services, ingresses, configMaps);\n  }\n\n  /** Constructs a new {@link ServerResolver} instance from the provided parameters. */\n  protected interface ResolverConstructor<T> {\n    ServerResolver create(List<Service> services, List<T> ingresses, List<ConfigMap> configMaps);\n  }\n\n  /**\n   * Let's reuse the logic for picking the right \"thing\" based on the server and workspace exposure\n   * types that is implemented in {@link AbstractExposureStrategyAwareProvider}.\n   */\n  private static final class ResolverConstructorProvider<T>\n      extends AbstractExposureStrategyAwareProvider<ResolverConstructor<T>> {\n\n    protected ResolverConstructorProvider(\n        String exposureStrategy,\n        String wsExposureType,\n        Map<WorkspaceExposureType, ResolverConstructor<T>> mapping,\n        String errorMessageTemplate) {\n      super(exposureStrategy, wsExposureType, mapping, errorMessageTemplate);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/resolver/ConfigMapServerResolver.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver;\n\nimport com.google.common.collect.ArrayListMultimap;\nimport com.google.common.collect.Multimap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.Service;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.RuntimeServerBuilder;\n\n/** Resolves servers from ConfigMaps, used with Gateway based single-host */\npublic class ConfigMapServerResolver extends AbstractServerResolver {\n\n  private final Multimap<String, ConfigMap> configMaps;\n  private final String cheHost;\n  private final ServerResolver nativeServerResolver;\n\n  public ConfigMapServerResolver(\n      Iterable<Service> services,\n      Iterable<ConfigMap> configMaps,\n      String cheHost,\n      ServerResolver nativeServerResolver) {\n    super(services);\n    this.nativeServerResolver = nativeServerResolver;\n    this.cheHost = cheHost;\n\n    this.configMaps = ArrayListMultimap.create();\n    for (ConfigMap configMap : configMaps) {\n      String machineName =\n          Annotations.newDeserializer(configMap.getMetadata().getAnnotations()).machineName();\n      if (machineName != null) {\n        this.configMaps.put(machineName, configMap);\n      }\n    }\n  }\n\n  @Override\n  public Map<String, ServerImpl> resolveExternalServers(String machineName) {\n    Map<String, ServerImpl> serverMap = new HashMap<>();\n    serverMap.putAll(nativeServerResolver.resolveExternalServers(machineName));\n    serverMap.putAll(\n        configMaps.get(machineName).stream()\n            .map(this::fillGatewayServers)\n            .flatMap(m -> m.entrySet().stream())\n            .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (s1, s2) -> s2)));\n    return serverMap;\n  }\n\n  private Map<String, ServerImpl> fillGatewayServers(ConfigMap configMap) {\n    return Annotations.newDeserializer(configMap.getMetadata().getAnnotations())\n        .servers()\n        .entrySet()\n        .stream()\n        .collect(\n            Collectors.toMap(\n                Entry::getKey,\n                e -> {\n                  boolean requiresSubdomain = e.getValue().isRequireSubdomain();\n                  String root = requiresSubdomain ? \"/\" : e.getValue().getEndpointOrigin();\n                  String path = buildPath(root, e.getValue().getPath());\n\n                  return new RuntimeServerBuilder()\n                      .protocol(e.getValue().getProtocol())\n                      .host(cheHost)\n                      .path(path)\n                      .endpointOrigin(root)\n                      .attributes(e.getValue().getAttributes())\n                      .targetPort(e.getValue().getPort())\n                      .build();\n                },\n                (s1, s2) -> s2));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/resolver/IngressServerResolver.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver;\n\nimport com.google.common.collect.ArrayListMultimap;\nimport com.google.common.collect.Multimap;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressRule;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.RuntimeServerBuilder;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.IngressPathTransformInverter;\n\n/**\n * Helps to resolve {@link ServerImpl servers} by machine name according to specified {@link Ingress\n * ingresses} and {@link Service services}.\n *\n * <p>Objects annotations are used to check if {@link Service service} or {@link Ingress ingress}\n * exposes the specified machine servers.\n *\n * @author Sergii Leshchenko\n * @author Alexander Garagatyi\n * @see KubernetesServerExposer\n * @see Annotations\n */\npublic class IngressServerResolver extends AbstractServerResolver {\n  private final Multimap<String, Ingress> ingresses;\n  private final IngressPathTransformInverter pathTransformInverter;\n\n  public IngressServerResolver(\n      IngressPathTransformInverter pathTransformInverter,\n      List<Service> services,\n      List<Ingress> ingresses) {\n    super(services);\n    this.pathTransformInverter = pathTransformInverter;\n\n    this.ingresses = ArrayListMultimap.create();\n    for (Ingress ingress : ingresses) {\n      String machineName =\n          Annotations.newDeserializer(ingress.getMetadata().getAnnotations()).machineName();\n      this.ingresses.put(machineName, ingress);\n    }\n  }\n\n  @Override\n  public Map<String, ServerImpl> resolveExternalServers(String machineName) {\n    return ingresses.get(machineName).stream()\n        .map(this::fillIngressServers)\n        .flatMap(m -> m.entrySet().stream())\n        .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (v1, v2) -> v2));\n  }\n\n  private Map<String, ServerImpl> fillIngressServers(Ingress ingress) {\n    IngressRule ingressRule = ingress.getSpec().getRules().get(0);\n\n    // host either set by rule, or determined by LB ip\n    final String host =\n        ingressRule.getHost() != null\n            ? ingressRule.getHost()\n            : ingress.getStatus().getLoadBalancer().getIngress().get(0).getIp();\n\n    return Annotations.newDeserializer(ingress.getMetadata().getAnnotations())\n        .servers()\n        .entrySet()\n        .stream()\n        .collect(\n            Collectors.toMap(\n                Entry::getKey,\n                e -> {\n                  String root =\n                      pathTransformInverter.undoPathTransformation(\n                          ingressRule.getHttp().getPaths().get(0).getPath());\n\n                  String path = buildPath(root, e.getValue().getPath());\n\n                  // the /jwt/auth needs to be based on the webroot of the server, not the path of\n                  // the endpoint.\n                  String endpointOrigin = buildPath(root, \"/\");\n\n                  return new RuntimeServerBuilder()\n                      .protocol(e.getValue().getProtocol())\n                      .host(host)\n                      .path(path)\n                      .endpointOrigin(endpointOrigin)\n                      .attributes(e.getValue().getAttributes())\n                      .targetPort(e.getValue().getPort())\n                      .build();\n                }));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/resolver/KubernetesServerResolverFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.WorkspaceExposureType.GATEWAY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.WorkspaceExposureType.NATIVE;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.IngressPathTransformInverter;\n\n/**\n * Factory that decides by configuration, which {@link ServerResolver} implementation to use in\n * Kubernetes environment.\n */\n@Singleton\npublic class KubernetesServerResolverFactory extends AbstractServerResolverFactory<Ingress> {\n  @Inject\n  public KubernetesServerResolverFactory(\n      IngressPathTransformInverter pathTransformInverter,\n      @Named(\"che.host\") String cheHost,\n      @Named(\"che.infra.kubernetes.server_strategy\") String exposureStrategy,\n      @Named(\"che.infra.kubernetes.singlehost.workspace.exposure\") String wsExposureType) {\n\n    super(\n        exposureStrategy,\n        wsExposureType,\n        ImmutableMap.of(\n            GATEWAY,\n                (ss, is, cs) ->\n                    new ConfigMapServerResolver(\n                        ss, cs, cheHost, new IngressServerResolver(pathTransformInverter, ss, is)),\n            NATIVE, (ss, is, cs) -> new IngressServerResolver(pathTransformInverter, ss, is)),\n        \"Failed to initialize KubernetesServerResolverFactory for workspace exposure type '%s'.\");\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/resolver/ServerResolver.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver;\n\nimport io.fabric8.kubernetes.api.model.Service;\nimport java.util.Map;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposer;\n\n/**\n * Helps to resolve {@link ServerImpl servers} by machine name according to {@link Service services}\n * and implementation specific k8s objects.\n *\n * <p>Objects annotations are used to check if they exposes the specified machine servers.\n *\n * @see ExternalServerExposer\n * @see Annotations\n */\npublic interface ServerResolver {\n\n  /**\n   * Resolves servers by the specified machine name.\n   *\n   * @param machineName machine to resolve servers\n   * @return resolved servers\n   */\n  Map<String, ServerImpl> resolve(String machineName);\n\n  /**\n   * Resolve external servers from implementation specific k8s object and it's annotations.\n   *\n   * @param machineName machine to resolve servers\n   * @return resolved servers\n   */\n  Map<String, ServerImpl> resolveExternalServers(String machineName);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/DefaultSecureServerExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.inject.assistedinject.Assisted;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.Collection;\nimport java.util.Map;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.PassThroughProxyProvisioner;\n\n/**\n * Exposes secure servers using a proxy.\n *\n * <p>To expose secure servers it provisions proxy objects into environment with {@link\n * org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.ProxyProvisioner}. Then proxy\n * service port is made public accessible by {@link ExternalServerExposer <T>}.\n *\n * <p>In this way, requests to exposed secure servers will be routed via the proxy that is added one\n * per workspace.\n *\n * @see\n *     org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.JwtProxyProvisioner\n * @see PassThroughProxyProvisioner\n */\npublic class DefaultSecureServerExposer<T extends KubernetesEnvironment>\n    implements SecureServerExposer<T> {\n\n  private final ExternalServerExposer<T> exposer;\n  private final ProxyProvisioner proxyProvisioner;\n\n  @VisibleForTesting\n  public DefaultSecureServerExposer(\n      ProxyProvisioner jwtProxyProvisioner, ExternalServerExposer<T> exposer) {\n    this.exposer = exposer;\n    this.proxyProvisioner = jwtProxyProvisioner;\n  }\n\n  @Inject\n  public DefaultSecureServerExposer(\n      @Assisted RuntimeIdentity identity,\n      ProxyProvisionerFactory proxyProvisionerFactory,\n      ExternalServerExposerProvider<T> exposer) {\n    this.exposer = exposer.get();\n    this.proxyProvisioner = proxyProvisionerFactory.create(identity);\n  }\n\n  /**\n   * This always returns an empty optional because JWT proxy is injected into the workspace pod and\n   * assumes the servers it exposes listen on localhost.\n   *\n   * @see\n   *     org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposer#createService(Collection,\n   *     PodData, String, Map)\n   */\n  @Override\n  public Optional<Service> createService(\n      Collection<ServicePort> allSecurePorts,\n      PodData pod,\n      String machineName,\n      Map<String, ? extends ServerConfig> secureServers) {\n    return Optional.empty();\n  }\n\n  @Override\n  public void expose(\n      T k8sEnv,\n      PodData pod,\n      String machineName,\n      @Nullable String serviceName,\n      @Nullable String serverId,\n      ServicePort servicePort,\n      Map<String, ServerConfig> secureServers)\n      throws InfrastructureException {\n\n    Map<String, ServerConfig> conformingServers =\n        exposer.getStrategyConformingServers(secureServers);\n    Map<String, ServerConfig> subdomainServers =\n        exposer.getServersRequiringSubdomain(secureServers);\n\n    if (!conformingServers.isEmpty()) {\n      doExpose(\n          k8sEnv, pod, machineName, serviceName, serverId, servicePort, false, conformingServers);\n    }\n\n    if (!subdomainServers.isEmpty()) {\n      doExpose(\n          k8sEnv, pod, machineName, serviceName, serverId, servicePort, true, subdomainServers);\n    }\n  }\n\n  private void doExpose(\n      T k8sEnv,\n      PodData pod,\n      String machineName,\n      @Nullable String serviceName,\n      @Nullable String serverId,\n      ServicePort servicePort,\n      boolean requireSubdomain,\n      Map<String, ServerConfig> secureServers)\n      throws InfrastructureException {\n    ServicePort exposedServicePort =\n        proxyProvisioner.expose(\n            k8sEnv,\n            pod,\n            machineName,\n            serviceName,\n            servicePort,\n            servicePort.getProtocol(),\n            requireSubdomain,\n            secureServers);\n\n    exposer.expose(\n        k8sEnv,\n        machineName,\n        proxyProvisioner.getServiceName(),\n        serverId,\n        exposedServicePort,\n        secureServers);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/ProxyProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure;\n\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\n\n/**\n * A proxy provisioner is a class responsible for provisioning and exposing a reverse proxy that\n * should proxy the access to a backend service.\n */\npublic interface ProxyProvisioner {\n  int FIRST_AVAILABLE_PROXY_PORT = 4400;\n\n  /**\n   * Modifies the provided environment with Kubernetes objects needed for the proxy and creates a\n   * service that is pointing to the proxy that can then be used to expose the proxy.\n   *\n   * <p>Note that this method is called multiple times (once for each backend service) and so has to\n   * build the kubernetes objects and configuration iteratively, if required.\n   *\n   * @param k8sEnv Kubernetes environment to modify\n   * @param pod the pod that runs the server being exposed\n   * @param backendServiceName service name that will be exposed\n   * @param backendServicePort service port that will be exposed\n   * @param protocol protocol that will be used for exposed port\n   * @param requireSubdomain if true, the supplied servers are supposed to require a subdomain, if\n   *     false the servers are considered to follow the configured exposure strategy\n   * @param secureServers secure servers to expose\n   * @return JWTProxy service port that expose the specified one\n   * @throws InfrastructureException if any exception occurs during port exposing\n   */\n  ServicePort expose(\n      KubernetesEnvironment k8sEnv,\n      PodData pod,\n      String machineName,\n      @Nullable String backendServiceName,\n      ServicePort backendServicePort,\n      String protocol,\n      boolean requireSubdomain,\n      Map<String, ServerConfig> secureServers)\n      throws InfrastructureException;\n\n  /** The name of the service handling the traffic to the proxy. */\n  String getServiceName();\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/ProxyProvisionerFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\n\n/** Interface to help create instance of {@link ProxyProvisioner} using Guice. */\npublic interface ProxyProvisionerFactory {\n  ProxyProvisioner create(RuntimeIdentity identity);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/SecureServerExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure;\n\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.Collection;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\n\n/**\n * Modifies the specified Kubernetes environment to expose secure servers.\n *\n * <p>Note that ONE {@link SecureServerExposer} instance should be used for one workspace start.\n *\n * @author Sergii Leshchenko\n */\npublic interface SecureServerExposer<T extends KubernetesEnvironment> {\n\n  String AUTH_ENDPOINT_PATH = \"/jwt/auth\";\n\n  /**\n   * Creates a service that should handle the traffic for the provided secure ports that are exposed\n   * on the container from the pod.\n   *\n   * <p>The exposer may choose to not create such service or to create a service for only a subset\n   * of the ports.\n   *\n   * @param allSecurePorts the secure ports on the container\n   * @param pod the pod containing the container\n   * @return an optional service to put \"in front of\" the pod to service the ports, empty if no such\n   *     service should be created.\n   */\n  Optional<Service> createService(\n      Collection<ServicePort> allSecurePorts,\n      PodData pod,\n      String machineName,\n      Map<String, ? extends ServerConfig> secureServers);\n\n  /**\n   * Modifies the specified Kubernetes environment to expose secure servers.\n   *\n   * @param k8sEnv Kubernetes environment that should be modified.\n   * @param pod the pod containing the exposed server\n   * @param machineName machine name to which secure servers belong to\n   * @param serviceName service name that exposes secure servers. Will be null if {@link\n   *     #createService(Collection, PodData, String, Map)} returned empty optional\n   * @param serverId non-null for a unique server, null for a compound set of servers that should be\n   *     exposed together.\n   * @param servicePort service port that exposes secure servers\n   * @param secureServers secure servers to expose\n   * @throws InfrastructureException when any exception occurs during servers exposing\n   */\n  void expose(\n      T k8sEnv,\n      PodData pod,\n      String machineName,\n      @Nullable String serviceName,\n      @Nullable String serverId,\n      ServicePort servicePort,\n      Map<String, ServerConfig> secureServers)\n      throws InfrastructureException;\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/SecureServerExposerFactory.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * Helps to create {@link SecureServerExposer} instances.\n *\n * <p>Note that ONE {@link SecureServerExposer} instance should be used for one workspace start.\n *\n * @author Sergii Leshchenko\n */\npublic interface SecureServerExposerFactory<T extends KubernetesEnvironment> {\n  SecureServerExposer<T> create(RuntimeIdentity runtimeId);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/SecureServerExposerFactoryProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure;\n\nimport static java.lang.String.format;\n\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.workspace.server.model.impl.WarningImpl;\nimport org.eclipse.che.inject.ConfigurationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Warnings;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * Provides implementation of {@link SecureServerExposerFactory} according to workspace config\n * attribute with name `che.server.secure_exposer` if it is present and contains bound\n * implementation key or configuration property with name `che.server.secure_exposer` otherwise.\n *\n * @author Sergii Leshchenko\n * @author Oleksandr Garagatyi\n */\npublic class SecureServerExposerFactoryProvider<T extends KubernetesEnvironment> {\n\n  public static final String SECURE_EXPOSER_IMPL_PROPERTY = \"che.server.secure_exposer\";\n  public static final String UNKNOWN_EXPOSER_ERROR_TEMPLATE =\n      \"Unknown secure servers exposer '%s' is configured in workspace. Currently supported: %s.\";\n\n  private final Map<String, SecureServerExposerFactory<T>> factories;\n  private final String unknownExposerErrorTemplate;\n  private final SecureServerExposerFactory<T> serverExposerFactory;\n\n  @Inject\n  public SecureServerExposerFactoryProvider(\n      @Named(SECURE_EXPOSER_IMPL_PROPERTY) String serverExposer,\n      Map<String, SecureServerExposerFactory<T>> factories) {\n    String knownExposers = String.join(\", \", factories.keySet());\n    serverExposerFactory = factories.get(serverExposer);\n    if (serverExposerFactory == null) {\n      throw new ConfigurationException(\n          format(\n              \"Unknown secure servers exposer '%s' is configured. Currently supported: %s.\",\n              serverExposer, knownExposers));\n    }\n    this.unknownExposerErrorTemplate = format(UNKNOWN_EXPOSER_ERROR_TEMPLATE, \"%s\", knownExposers);\n    this.factories = factories;\n  }\n\n  /**\n   * Creates instance of {@link SecureServerExposerFactory} that will expose secure servers of\n   * provided Kubernetes environment for runtime with the specified runtime identity.\n   */\n  public SecureServerExposerFactory<T> get(T k8sEnv) {\n    String envExposerImpl = k8sEnv.getAttributes().get(SECURE_EXPOSER_IMPL_PROPERTY);\n    if (envExposerImpl != null) {\n      if (factories.containsKey(envExposerImpl)) {\n        return factories.get(envExposerImpl);\n      }\n      k8sEnv\n          .getWarnings()\n          .add(\n              new WarningImpl(\n                  Warnings.UNKNOWN_SECURE_SERVER_EXPOSER_CONFIGURED_IN_WS_WARNING_CODE,\n                  format(unknownExposerErrorTemplate, envExposerImpl)));\n    }\n\n    return this.serverExposerFactory;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/AbstractJwtProxyProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy;\n\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.emptyMap;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_REQUEST_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_REQUEST_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.CONTAINER_SOURCE_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.TOOL_CONTAINER_SOURCE;\nimport static org.eclipse.che.commons.lang.NameGenerator.generate;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_ORIGINAL_NAME_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer.SERVER_PREFIX;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer.SERVER_UNIQUE_PART_SIZE;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.common.base.Preconditions;\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServicePortBuilder;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport java.security.KeyPair;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.commons.lang.Size;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.ServerServiceBuilder;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServiceExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.ProxyProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory.JwtProxyConfigBuilderFactory;\n\n/**\n * A base class for both {@link JwtProxyProvisioner} and {@link PassThroughProxyProvisioner} that\n * contains the bulk of the provisioning logic.\n */\nabstract class AbstractJwtProxyProvisioner implements ProxyProvisioner {\n\n  static final String JWT_PROXY_MACHINE_NAME = \"che-jwtproxy\";\n  public static final String JWT_PROXY_POD_NAME = JWT_PROXY_MACHINE_NAME;\n  static final int MEGABYTES_TO_BYTES_DIVIDER = 1024 * 1024;\n  static final String PUBLIC_KEY_HEADER = \"-----BEGIN PUBLIC KEY-----\\n\";\n  static final String PUBLIC_KEY_FOOTER = \"\\n-----END PUBLIC KEY-----\";\n  static final String JWT_PROXY_CONFIG_FILE = \"config.yaml\";\n  static final String JWT_PROXY_CONFIG_FOLDER = \"/che-jwtproxy-config\";\n  static final String JWT_PROXY_PUBLIC_KEY_FILE = \"mykey.pub\";\n  private final JwtProxyConfigBuilder proxyConfigBuilder;\n  private final String jwtProxyImage;\n  private final Map<String, String> attributes;\n  private final String serviceName;\n  private final ExternalServiceExposureStrategy externalServiceExposureStrategy;\n  private final ExternalServiceExposureStrategy multiHostExternalServiceExposureStrategy;\n  private final CookiePathStrategy cookiePathStrategy;\n  private final MultiHostCookiePathStrategy multihostCookiePathStrategy;\n  private int availablePort;\n  private final KeyPair keyPair;\n  private final boolean detectCookieAuth;\n\n  /**\n   * Constructor!\n   *\n   * @param signatureKeyPair the key pair for JWT proxy SSH comms\n   * @param jwtProxyConfigBuilderFactory factory to create a JWT proxy config builder\n   * @param externalServiceExposureStrategy the strategy to expose external servers\n   * @param cookiePathStrategy the strategy for the cookie path of the JWT auth cookies, if used\n   * @param jwtProxyImage the image of JWT proxy to use\n   * @param memoryLimitBytes the memory limit of the JWT proxy container\n   * @param workspaceId the workspace ID being started\n   * @param detectCookieAuth whether to look for cookie auth requirements in the proxied servers or\n   *     whether to ignore such requirements\n   */\n  AbstractJwtProxyProvisioner(\n      KeyPair signatureKeyPair,\n      JwtProxyConfigBuilderFactory jwtProxyConfigBuilderFactory,\n      ExternalServiceExposureStrategy externalServiceExposureStrategy,\n      ExternalServiceExposureStrategy multiHostStrategy,\n      CookiePathStrategy cookiePathStrategy,\n      MultiHostCookiePathStrategy multihostCookiePathStrategy,\n      String jwtProxyImage,\n      String memoryRequestBytes,\n      String memoryLimitBytes,\n      String cpuRequestCores,\n      String cpuLimitCores,\n      String workspaceId,\n      boolean detectCookieAuth) {\n    this.keyPair = signatureKeyPair;\n    this.proxyConfigBuilder = jwtProxyConfigBuilderFactory.create(workspaceId);\n    this.jwtProxyImage = jwtProxyImage;\n    this.externalServiceExposureStrategy = externalServiceExposureStrategy;\n    this.multiHostExternalServiceExposureStrategy = multiHostStrategy;\n    this.cookiePathStrategy = cookiePathStrategy;\n    this.multihostCookiePathStrategy = multihostCookiePathStrategy;\n    this.serviceName = generate(SERVER_PREFIX, SERVER_UNIQUE_PART_SIZE) + \"-jwtproxy\";\n\n    this.availablePort = FIRST_AVAILABLE_PROXY_PORT;\n    long memoryLimitLong = Size.parseSizeToMegabytes(memoryLimitBytes) * MEGABYTES_TO_BYTES_DIVIDER;\n    long memoryRequestLong =\n        Size.parseSizeToMegabytes(memoryRequestBytes) * MEGABYTES_TO_BYTES_DIVIDER;\n    this.attributes =\n        ImmutableMap.of(\n            MEMORY_LIMIT_ATTRIBUTE,\n            Long.toString(memoryLimitLong),\n            MEMORY_REQUEST_ATTRIBUTE,\n            Long.toString(memoryRequestLong),\n            CPU_LIMIT_ATTRIBUTE,\n            cpuLimitCores,\n            CPU_REQUEST_ATTRIBUTE,\n            cpuRequestCores,\n            CONTAINER_SOURCE_ATTRIBUTE,\n            TOOL_CONTAINER_SOURCE);\n\n    this.detectCookieAuth = detectCookieAuth;\n  }\n\n  /**\n   * Returns an exposure configuration of the provided server.\n   *\n   * @param serverConfig the server configuration\n   * @return the exposure configuration for the server\n   */\n  protected abstract ExposureConfiguration getExposureConfiguration(ServerConfig serverConfig);\n\n  /**\n   * Modifies Kubernetes environment to expose the specified service port via JWTProxy.\n   *\n   * @param k8sEnv Kubernetes environment to modify\n   * @param pod the pod that runs the server being exposed\n   * @param backendServiceName service name that will be exposed\n   * @param backendServicePort service port that will be exposed\n   * @param protocol protocol that will be used for exposed port\n   * @param secureServers secure servers to expose\n   * @return JWTProxy service port that expose the specified one\n   * @throws InfrastructureException if any exception occurs during port exposing\n   */\n  @Override\n  public ServicePort expose(\n      KubernetesEnvironment k8sEnv,\n      PodData pod,\n      String machineName,\n      String backendServiceName,\n      ServicePort backendServicePort,\n      String protocol,\n      boolean requireSubdomain,\n      Map<String, ServerConfig> secureServers)\n      throws InfrastructureException {\n    Preconditions.checkArgument(\n        secureServers != null && !secureServers.isEmpty(), \"Secure servers are missing\");\n    ensureJwtProxyInjected(k8sEnv, machineName, pod);\n\n    Set<String> excludes = new HashSet<>();\n    Boolean cookiesAuthEnabled = null;\n    for (ServerConfig serverConfig : secureServers.values()) {\n      ExposureConfiguration config = getExposureConfiguration(serverConfig);\n\n      // accumulate unsecured paths\n      if (config.excludedPaths != null) {\n        excludes.addAll(config.excludedPaths);\n      }\n\n      // calculate `cookiesAuthEnabled` attributes\n      if (detectCookieAuth) {\n        if (cookiesAuthEnabled == null) {\n          cookiesAuthEnabled = config.cookiesAuthEnabled;\n        } else {\n          if (!cookiesAuthEnabled.equals(config.cookiesAuthEnabled)) {\n            throw new InfrastructureException(\n                \"Secure servers which expose the same port should have the same `cookiesAuthEnabled` value.\");\n          }\n        }\n      }\n    }\n\n    int listenPort = availablePort++;\n\n    ServicePort exposedPort =\n        new ServicePortBuilder()\n            .withName(\"server-\" + listenPort)\n            .withPort(listenPort)\n            .withProtocol(protocol)\n            .withNewTargetPort(listenPort)\n            .build();\n\n    k8sEnv.getServices().get(serviceName).getSpec().getPorts().add(exposedPort);\n\n    CookiePathStrategy actualCookiePathStrategy =\n        requireSubdomain ? multihostCookiePathStrategy : cookiePathStrategy;\n    ExternalServiceExposureStrategy actualExposureStrategy =\n        requireSubdomain\n            ? multiHostExternalServiceExposureStrategy\n            : externalServiceExposureStrategy;\n\n    // JwtProxySecureServerExposer creates no service for the exposed secure servers and\n    // assumes everything will be proxied from localhost, because JWT proxy is collocated\n    // with the workspace pod (because it is added to the environment as an injectable pod).\n    // This method historically supported proxying secure servers exposed through a service\n    // (which is not secure in absence of a appropriate network policy). The support for\n    // accessing the backend server through a service was kept here because it doesn't add\n    // any additional complexity to this method and keeps the door open for the\n    // JwtProxySecureServerExposer to be enhanced in the future with support for service-handled\n    // secure servers.\n    backendServiceName = backendServiceName == null ? \"127.0.0.1\" : backendServiceName;\n    proxyConfigBuilder.addVerifierProxy(\n        listenPort,\n        \"http://\" + backendServiceName + \":\" + backendServicePort.getTargetPort().getIntVal(),\n        excludes,\n        cookiesAuthEnabled == null ? false : cookiesAuthEnabled,\n        actualCookiePathStrategy.get(serviceName, exposedPort),\n        actualExposureStrategy.getExternalPath(serviceName, exposedPort.getName()));\n    k8sEnv\n        .getConfigMaps()\n        .get(getConfigMapName())\n        .getData()\n        .put(JWT_PROXY_CONFIG_FILE, proxyConfigBuilder.build());\n\n    return exposedPort;\n  }\n\n  /** Returns service name that exposed JWTProxy Pod. */\n  public String getServiceName() {\n    return serviceName;\n  }\n\n  /** Returns config map name that will be mounted into JWTProxy Pod. */\n  @VisibleForTesting\n  String getConfigMapName() {\n    return \"jwtproxy-config\";\n  }\n\n  private void ensureJwtProxyInjected(KubernetesEnvironment k8sEnv, String machineName, PodData pod)\n      throws InfrastructureException {\n    if (!k8sEnv.getMachines().containsKey(JWT_PROXY_MACHINE_NAME)) {\n      k8sEnv.getMachines().put(JWT_PROXY_MACHINE_NAME, createJwtProxyMachine());\n      Pod jwtProxyPod = createJwtProxyPod();\n      k8sEnv.addInjectablePod(machineName, JWT_PROXY_MACHINE_NAME, jwtProxyPod);\n\n      Map<String, String> initConfigMapData = new HashMap<>();\n      initConfigMapData.put(\n          JWT_PROXY_PUBLIC_KEY_FILE,\n          PUBLIC_KEY_HEADER\n              + java.util.Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded())\n              + PUBLIC_KEY_FOOTER);\n\n      initConfigMapData.put(JWT_PROXY_CONFIG_FILE, proxyConfigBuilder.build());\n\n      ConfigMap jwtProxyConfigMap =\n          new ConfigMapBuilder()\n              .withNewMetadata()\n              .withName(getConfigMapName())\n              .endMetadata()\n              .withData(initConfigMapData)\n              .build();\n      k8sEnv.getConfigMaps().put(jwtProxyConfigMap.getMetadata().getName(), jwtProxyConfigMap);\n\n      Service jwtProxyService =\n          new ServerServiceBuilder()\n              .withName(serviceName)\n              // we're merely injecting the pod, so we need a selector that is going to hit the\n              // pod that runs the server that we're exposing\n              .withSelectorEntry(CHE_ORIGINAL_NAME_LABEL, pod.getMetadata().getName())\n              .withMachineName(JWT_PROXY_MACHINE_NAME)\n              .withPorts(emptyList())\n              .build();\n      k8sEnv.getServices().put(jwtProxyService.getMetadata().getName(), jwtProxyService);\n    }\n  }\n\n  private InternalMachineConfig createJwtProxyMachine() {\n    return new InternalMachineConfig(emptyMap(), emptyMap(), attributes, null);\n  }\n\n  private Pod createJwtProxyPod() {\n    String containerName = Names.generateName(\"che-jwtproxy\");\n    return new PodBuilder()\n        .withNewMetadata()\n        .withName(JWT_PROXY_POD_NAME)\n        .withAnnotations(Names.createMachineNameAnnotations(containerName, JWT_PROXY_MACHINE_NAME))\n        .endMetadata()\n        .withNewSpec()\n        .withContainers(\n            new ContainerBuilder()\n                .withName(containerName)\n                .withImage(jwtProxyImage)\n                .withVolumeMounts(\n                    new VolumeMount(\n                        JWT_PROXY_CONFIG_FOLDER + \"/\",\n                        null,\n                        \"che-jwtproxy-config-volume\",\n                        false,\n                        null,\n                        null,\n                        null))\n                .withArgs(\"-config\", JWT_PROXY_CONFIG_FOLDER + \"/\" + JWT_PROXY_CONFIG_FILE)\n                .addNewEnv()\n                .withName(\"XDG_CONFIG_HOME\")\n                .withValue(JWT_PROXY_CONFIG_FOLDER)\n                .endEnv()\n                .build())\n        .withVolumes(\n            new VolumeBuilder()\n                .withName(\"che-jwtproxy-config-volume\")\n                .withNewConfigMap()\n                .withName(getConfigMapName())\n                .endConfigMap()\n                .build())\n        .endSpec()\n        .build();\n  }\n\n  protected static final class ExposureConfiguration {\n    private final List<String> excludedPaths;\n    private final Boolean cookiesAuthEnabled;\n\n    public ExposureConfiguration(ServerConfig serverConfig) {\n      this(serverConfig.getUnsecuredPaths(), serverConfig.isCookiesAuthEnabled());\n    }\n\n    public ExposureConfiguration(List<String> excludedPaths, Boolean cookiesAuthEnabled) {\n      this.excludedPaths = excludedPaths;\n      this.cookiesAuthEnabled = cookiesAuthEnabled;\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/CookiePathStrategy.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.DefaultHostExternalServiceExposureStrategy.DEFAULT_HOST_STRATEGY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.SingleHostExternalServiceExposureStrategy.SINGLE_HOST_STRATEGY;\n\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.function.BiFunction;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ServiceExposureStrategyProvider;\n\n/**\n * The cookie path for the access token cookie is server-strategy dependent. This class represents\n * the different strategies for getting the cookie path.\n *\n * <p>Note that instead of going with full-blown strategy pattern and different implementations of\n * some interface and a provider for the currently active strategy (as is done for example with\n * {@link\n * org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServiceExposureStrategy}),\n * this class merely internally uses different functions for different service exposure strategies.\n * This is done because the full-blown strategy pattern implementation felt like over-engineering\n * when compared with the simplicity of the functions.\n */\n@Singleton\npublic class CookiePathStrategy {\n\n  private final BiFunction<String, ServicePort, String> getCookiePath;\n\n  @Inject\n  public CookiePathStrategy(\n      @Named(ServiceExposureStrategyProvider.STRATEGY_PROPERTY) String serverStrategy) {\n    switch (serverStrategy) {\n      case MULTI_HOST_STRATEGY:\n        getCookiePath = (__, ___) -> \"/\";\n        break;\n      case SINGLE_HOST_STRATEGY:\n      case DEFAULT_HOST_STRATEGY:\n        getCookiePath = (serviceName, __) -> serviceName;\n        break;\n      default:\n        throw new IllegalArgumentException(\n            format(\"Unsupported server strategy: %s\", serverStrategy));\n    }\n  }\n\n  public String get(String serviceName, ServicePort port) {\n    return getCookiePath.apply(serviceName, port);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/JwtProxyConfigBuilder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.JwtProxyProvisioner.JWT_PROXY_CONFIG_FOLDER;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.JwtProxyProvisioner.JWT_PROXY_PUBLIC_KEY_FILE;\n\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.MapperFeature;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.dataformat.yaml.YAMLFactory;\nimport com.google.common.collect.ImmutableMap;\nimport com.google.inject.assistedinject.Assisted;\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.model.Config;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.model.JWTProxy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.model.RegistrableComponentConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.model.SignerProxyConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.model.VerifierConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.model.VerifierProxyConfig;\n\n/**\n * Helps to build JWTProxy config with several verifier proxies.\n *\n * @author Sergii Leshchenko\n */\npublic class JwtProxyConfigBuilder {\n\n  private static final ObjectMapper YAML_PARSER =\n      new ObjectMapper(new YAMLFactory())\n          .configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);\n\n  private final String workspaceId;\n  private final URI authPageUrl;\n  private final String issuer;\n  private final String ttl;\n  private final List<VerifierProxy> verifierProxies = new ArrayList<>();\n\n  @Inject\n  public JwtProxyConfigBuilder(\n      @Named(\"che.api\") URI apiEndpoint,\n      @Named(\"che.server.secure_exposer.jwtproxy.token.issuer\") String issuer,\n      @Named(\"che.server.secure_exposer.jwtproxy.token.ttl\") String ttl,\n      @Nullable @Named(\"che.server.secure_exposer.jwtproxy.auth.loader.path\") String loaderPath,\n      @Assisted String workspaceId) {\n    this.workspaceId = workspaceId;\n    this.authPageUrl =\n        isNullOrEmpty(loaderPath)\n            ? null\n            : UriBuilder.fromUri(apiEndpoint).replacePath(loaderPath).build();\n    this.issuer = issuer;\n    this.ttl = ttl;\n  }\n\n  /**\n   * Adds a proxy before a service that will perform the JWT authentication on its behalf.\n   *\n   * @param listenPort the port to listen on\n   * @param upstream the URL to the backend service this proxy should be put in front of\n   * @param excludes the list of unsecured paths that the proxy should let pass through\n   * @param cookiesAuthEnabled should the JWT proxy use cookies?\n   * @param cookiePath the path of the cookie. This is should either be \"/\" or some portion of the\n   *     URL the JWT proxy will be exposed on. It is used to enable using different proxies for\n   *     different services, each with a different auth cookie. Super useful for having multiple\n   *     workspaces, each authenticated with its machine token.\n   * @param publicBasePath the prefix used to generate the redirect back to the original page from\n   *     the auth page by the JWT proxy. This is to work across path-rewriting proxies like nginx\n   *     ingress controller.\n   */\n  public void addVerifierProxy(\n      Integer listenPort,\n      String upstream,\n      Set<String> excludes,\n      boolean cookiesAuthEnabled,\n      String cookiePath,\n      String publicBasePath) {\n    verifierProxies.add(\n        new VerifierProxy(\n            listenPort, upstream, excludes, cookiesAuthEnabled, cookiePath, publicBasePath));\n  }\n\n  public String build() throws InternalInfrastructureException {\n    List<VerifierProxyConfig> proxyConfigs = new ArrayList<>();\n    Config config =\n        new Config()\n            .withJWTProxy(\n                new JWTProxy()\n                    .withSignerProxy(new SignerProxyConfig().withEnabled(false))\n                    .withVerifiedProxyConfigs(proxyConfigs));\n\n    for (VerifierProxy verifierProxy : verifierProxies) {\n      VerifierConfig verifierConfig =\n          new VerifierConfig()\n              .withAudience(workspaceId)\n              .withUpstream(verifierProxy.upstream)\n              .withMaxSkew(\"1m\")\n              .withMaxTtl(ttl)\n              .withKeyServer(\n                  new RegistrableComponentConfig()\n                      .withType(\"preshared\")\n                      .withOptions(\n                          ImmutableMap.of(\n                              \"issuer\",\n                              issuer,\n                              \"key_id\",\n                              workspaceId,\n                              \"public_key_path\",\n                              JWT_PROXY_CONFIG_FOLDER + '/' + JWT_PROXY_PUBLIC_KEY_FILE)))\n              .withCookiesEnabled(verifierProxy.cookiesAuthEnabled)\n              .withCookiePath(ensureStartsWithSlash(verifierProxy.cookiePath))\n              .withClaimsVerifier(\n                  Collections.singleton(\n                      new RegistrableComponentConfig()\n                          .withType(\"static\")\n                          .withOptions(ImmutableMap.of(\"iss\", issuer))))\n              .withNonceStorage(new RegistrableComponentConfig().withType(\"void\"));\n\n      if (!verifierProxy.excludes.isEmpty()) {\n        verifierConfig.setExcludes(verifierProxy.excludes);\n      }\n\n      if (verifierProxy.cookiesAuthEnabled && authPageUrl != null) {\n        verifierConfig.setAuthUrl(authPageUrl.toString());\n      }\n\n      if (verifierProxy.publicBasePath != null) {\n        verifierConfig.setPublicBasePath(verifierProxy.publicBasePath);\n      }\n\n      VerifierProxyConfig proxyConfig =\n          new VerifierProxyConfig()\n              .withListenAddr(\":\" + verifierProxy.listenPort)\n              .withVerifierConfig(verifierConfig);\n\n      proxyConfigs.add(proxyConfig);\n    }\n\n    try {\n      return YAML_PARSER.writeValueAsString(config);\n    } catch (JsonProcessingException e) {\n      throw new InternalInfrastructureException(\n          \"Error during creation of JWTProxy config YAML: \" + e.getMessage(), e);\n    }\n  }\n\n  private static final class VerifierProxy {\n    final Integer listenPort;\n    final String upstream;\n    final Set<String> excludes;\n    final boolean cookiesAuthEnabled;\n    final String cookiePath;\n    final String publicBasePath;\n\n    VerifierProxy(\n        Integer listenPort,\n        String upstream,\n        Set<String> excludes,\n        boolean cookiesAuthEnabled,\n        String cookiePath,\n        String publicBasePath) {\n      this.listenPort = listenPort;\n      this.upstream = upstream;\n      this.excludes = excludes;\n      this.cookiesAuthEnabled = cookiesAuthEnabled;\n      this.cookiePath = cookiePath;\n      this.publicBasePath = publicBasePath;\n    }\n  }\n\n  private static String ensureStartsWithSlash(String val) {\n    if (isNullOrEmpty(val)) {\n      return \"/\";\n    } else {\n      return val.charAt(0) == '/' ? val : \"/\" + val;\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/JwtProxyProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy;\n\nimport com.google.inject.assistedinject.Assisted;\nimport java.security.KeyPair;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignatureKeyManager;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignatureKeyManagerException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ServiceExposureStrategyProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory.JwtProxyConfigBuilderFactory;\n\n/**\n * Modifies Kubernetes environment to expose the specified service port via JWTProxy.\n *\n * <p>Exposing includes the following operation:\n *\n * <ul>\n *   <li>Putting Machine configuration into Kubernetes environment if absent;\n *   <li>Putting JwtProxy pod with one container if absent;\n *   <li>Putting JwtProxy service that will expose added JWTProxy pod if absent;\n *   <li>Putting JwtProxy ConfigMap that contains public key and JwtProxy config in yaml format if\n *       absent;\n *   <li>Updating JwtProxy Service to expose port for secure server;\n *   <li>Updating JwtProxy configuration in config map by adding the corresponding verifier proxy\n *       there;\n * </ul>\n *\n * @see JwtProxyConfigBuilder\n * @see SignatureKeyManager\n * @author Sergii Leshchenko\n */\npublic class JwtProxyProvisioner extends AbstractJwtProxyProvisioner {\n\n  @Inject\n  public JwtProxyProvisioner(\n      SignatureKeyManager signatureKeyManager,\n      JwtProxyConfigBuilderFactory jwtProxyConfigBuilderFactory,\n      ServiceExposureStrategyProvider serviceExposureStrategyProvider,\n      CookiePathStrategy cookiePathStrategy,\n      MultiHostCookiePathStrategy multiHostCookiePathStrategy,\n      @Named(\"che.server.secure_exposer.jwtproxy.image\") String jwtProxyImage,\n      @Named(\"che.server.secure_exposer.jwtproxy.memory_request\") String memoryRequestBytes,\n      @Named(\"che.server.secure_exposer.jwtproxy.memory_limit\") String memoryLimitBytes,\n      @Named(\"che.server.secure_exposer.jwtproxy.cpu_request\") String cpuRequestCores,\n      @Named(\"che.server.secure_exposer.jwtproxy.cpu_limit\") String cpuLimitCores,\n      @Assisted RuntimeIdentity identity)\n      throws InternalInfrastructureException {\n    super(\n        constructKeyPair(signatureKeyManager, identity),\n        jwtProxyConfigBuilderFactory,\n        serviceExposureStrategyProvider.get(),\n        serviceExposureStrategyProvider.getMultiHostStrategy(),\n        cookiePathStrategy,\n        multiHostCookiePathStrategy,\n        jwtProxyImage,\n        memoryRequestBytes,\n        memoryLimitBytes,\n        cpuRequestCores,\n        cpuLimitCores,\n        identity.getWorkspaceId(),\n        true);\n  }\n\n  private static KeyPair constructKeyPair(\n      SignatureKeyManager signatureKeyManager, RuntimeIdentity identity)\n      throws InternalInfrastructureException {\n    try {\n      return signatureKeyManager.getOrCreateKeyPair(identity.getWorkspaceId());\n    } catch (SignatureKeyManagerException e) {\n      throw new InternalInfrastructureException(\n          \"Signature key pair for machine authentication cannot be retrieved. Reason: \"\n              + e.getMessage());\n    }\n  }\n\n  @Override\n  protected ExposureConfiguration getExposureConfiguration(ServerConfig serverConfig) {\n    return new ExposureConfiguration(serverConfig);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/JwtProxySecureServerExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.inject.assistedinject.Assisted;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.DefaultSecureServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory.JwtProxyProvisionerFactory;\n\n/**\n * Exposes secure servers with JWTProxy.\n *\n * <p>To expose secure servers it provisions JwtProxy objects into environment with {@link\n * JwtProxyProvisioner}. Then JwtProxy service port is made public accessible by {@link\n * ExternalServerExposer <T>}.\n *\n * <p>In this way, requests to exposed secure servers will be routed via JwtProxy pod that is added\n * one per workspace. And it will be impossible to requests secure servers if there is no machine\n * token in request.\n *\n * @see JwtProxyProvisioner\n * @author Sergii Leshchenko\n */\npublic class JwtProxySecureServerExposer<T extends KubernetesEnvironment>\n    extends DefaultSecureServerExposer<T> {\n\n  @VisibleForTesting\n  JwtProxySecureServerExposer(\n      JwtProxyProvisioner jwtProxyProvisioner, ExternalServerExposer<T> exposer) {\n    super(jwtProxyProvisioner, exposer);\n  }\n\n  @Inject\n  public JwtProxySecureServerExposer(\n      @Assisted RuntimeIdentity identity,\n      JwtProxyProvisionerFactory jwtProxyProvisionerFactory,\n      ExternalServerExposerProvider<T> exposer) {\n    super(identity, jwtProxyProvisionerFactory, exposer);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/MultiHostCookiePathStrategy.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY;\n\nimport javax.inject.Singleton;\n\n/**\n * A specialization of the {@link CookiePathStrategy} for multi-host server strategy. We need this\n * declared specifically to be able to use both the configured strategy and multi-host in case of\n * workspaces with mixed endpoints.\n */\n@Singleton\npublic class MultiHostCookiePathStrategy extends CookiePathStrategy {\n  public MultiHostCookiePathStrategy() {\n    super(MULTI_HOST_STRATEGY);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/PassThroughProxyProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy;\n\nimport static java.util.Collections.singletonList;\n\nimport com.google.inject.assistedinject.Assisted;\nimport java.security.KeyPair;\nimport java.security.KeyPairGenerator;\nimport java.security.NoSuchAlgorithmException;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ServiceExposureStrategyProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory.JwtProxyConfigBuilderFactory;\n\n/**\n * A Jwt Proxy provisioner that configures JWT proxy to just pass through all the traffic without\n * any authentication. Should be used in the single user mode only for \"securing\" the secure\n * servers.\n */\npublic class PassThroughProxyProvisioner extends AbstractJwtProxyProvisioner {\n\n  @Inject\n  public PassThroughProxyProvisioner(\n      JwtProxyConfigBuilderFactory jwtProxyConfigBuilderFactory,\n      ServiceExposureStrategyProvider serviceExposureStrategyProvider,\n      CookiePathStrategy cookiePathStrategy,\n      MultiHostCookiePathStrategy multiHostCookiePathStrategy,\n      @Named(\"che.server.secure_exposer.jwtproxy.image\") String jwtImage,\n      @Named(\"che.server.secure_exposer.jwtproxy.memory_request\") String memoryRequestBytes,\n      @Named(\"che.server.secure_exposer.jwtproxy.memory_limit\") String memoryLimitBytes,\n      @Named(\"che.server.secure_exposer.jwtproxy.cpu_request\") String cpuRequestCores,\n      @Named(\"che.server.secure_exposer.jwtproxy.cpu_limit\") String cpuLimitCores,\n      @Assisted RuntimeIdentity identity)\n      throws InternalInfrastructureException {\n    super(\n        constructSignatureKeyPair(),\n        jwtProxyConfigBuilderFactory,\n        serviceExposureStrategyProvider.get(),\n        serviceExposureStrategyProvider.getMultiHostStrategy(),\n        cookiePathStrategy,\n        multiHostCookiePathStrategy,\n        jwtImage,\n        memoryRequestBytes,\n        memoryLimitBytes,\n        cpuRequestCores,\n        cpuLimitCores,\n        identity.getWorkspaceId(),\n        false);\n  }\n\n  /**\n   * Constructs a key pair to satisfy JWT proxy which needs a key pair in its configuration. In case\n   * of pass-through proxy, this key pair is unused so we just generate a random one.\n   *\n   * @return a random key pair\n   * @throws InternalInfrastructureException if RSA is not available as a key pair generator. This\n   *     should not happen.\n   */\n  private static KeyPair constructSignatureKeyPair() throws InternalInfrastructureException {\n    try {\n      KeyPairGenerator kpg = KeyPairGenerator.getInstance(\"RSA\");\n      kpg.initialize(512);\n      return kpg.generateKeyPair();\n    } catch (NoSuchAlgorithmException e) {\n      throw new InternalInfrastructureException(\n          \"Could not generate a fake key pair to support JWT proxy in single-user mode.\");\n    }\n  }\n\n  @Override\n  protected ExposureConfiguration getExposureConfiguration(ServerConfig serverConfig) {\n    // exclude everything on each server from JWT proxy auth, making it effectively a passthrough\n    // proxy\n    return new ExposureConfiguration(singletonList(\"/\"), false);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/PassThroughProxySecureServerExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.inject.assistedinject.Assisted;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.DefaultSecureServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory.PassThroughProxyProvisionerFactory;\n\n/**\n * Exposes secure servers with JWTProxy.\n *\n * <p>To expose secure servers it provisions JwtProxy objects into environment with {@link\n * PassThroughProxyProvisioner}. Then JwtProxy service port is made public accessible by {@link\n * ExternalServerExposer <T>}.\n *\n * <p>In this way, requests to exposed secure servers will be routed via JwtProxy pod that is added\n * one per workspace.\n *\n * @see PassThroughProxyProvisioner\n */\npublic class PassThroughProxySecureServerExposer<T extends KubernetesEnvironment>\n    extends DefaultSecureServerExposer<T> {\n\n  @VisibleForTesting\n  PassThroughProxySecureServerExposer(\n      PassThroughProxyProvisioner passThroughProxyProvisioner, ExternalServerExposer<T> exposer) {\n    super(passThroughProxyProvisioner, exposer);\n  }\n\n  @Inject\n  public PassThroughProxySecureServerExposer(\n      @Assisted RuntimeIdentity identity,\n      PassThroughProxyProvisionerFactory jwtProxyProvisionerFactory,\n      ExternalServerExposerProvider<T> exposer) {\n    super(identity, jwtProxyProvisionerFactory, exposer);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/factory/JwtProxyConfigBuilderFactory.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory;\n\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.JwtProxyConfigBuilder;\n\npublic interface JwtProxyConfigBuilderFactory {\n  JwtProxyConfigBuilder create(String workspaceId);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/factory/JwtProxyProvisionerFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.ProxyProvisionerFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.JwtProxyProvisioner;\n\n/**\n * Helps to create {@link JwtProxyProvisioner} with fields injected from DI container.\n *\n * @author Sergii Leshchenko\n */\npublic interface JwtProxyProvisionerFactory extends ProxyProvisionerFactory {\n  JwtProxyProvisioner create(RuntimeIdentity runtimeId);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/factory/JwtProxySecureServerExposerFactory.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposerFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.JwtProxySecureServerExposer;\n\n/**\n * Helps to create {@link JwtProxySecureServerExposerFactory} with fields injected from DI\n * container.\n *\n * @author Sergii Leshchenko\n */\npublic interface JwtProxySecureServerExposerFactory<T extends KubernetesEnvironment>\n    extends SecureServerExposerFactory<T> {\n  @Override\n  JwtProxySecureServerExposer<T> create(RuntimeIdentity identity);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/factory/PassThroughProxyProvisionerFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.ProxyProvisionerFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.PassThroughProxyProvisioner;\n\n/** Helps to create {@link PassThroughProxyProvisioner} with fields injected from DI container. */\npublic interface PassThroughProxyProvisionerFactory extends ProxyProvisionerFactory {\n  @Override\n  PassThroughProxyProvisioner create(RuntimeIdentity runtimeId);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/factory/PassThroughProxySecureServerExposerFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposerFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.PassThroughProxySecureServerExposer;\n\n/**\n * Helps to create {@link PassThroughProxySecureServerExposer} with fields injected from DI\n * container.\n */\npublic interface PassThroughProxySecureServerExposerFactory<T extends KubernetesEnvironment>\n    extends SecureServerExposerFactory<T> {\n  @Override\n  PassThroughProxySecureServerExposer<T> create(RuntimeIdentity identity);\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/model/Config.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.model;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\n\n/**\n * Describes parent node of jwtproxy config.\n *\n * @author Mykhailo Kuznietsov\n */\npublic class Config {\n  @JsonProperty(\"jwtproxy\")\n  private JWTProxy jwtProxy;\n\n  public JWTProxy getJwtProxy() {\n    return jwtProxy;\n  }\n\n  public void setJwtProxy(JWTProxy jwtProxy) {\n    this.jwtProxy = jwtProxy;\n  }\n\n  public Config withJWTProxy(JWTProxy jwtProxy) {\n    this.jwtProxy = jwtProxy;\n    return this;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/model/JWTProxy.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.model;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport java.util.List;\n\n/**\n * Describes single signer and multiple verifier proxy configs.\n *\n * @author Mykhailo Kuznietsov\n */\npublic class JWTProxy {\n  @JsonProperty(\"verifier_proxies\")\n  private List<VerifierProxyConfig> verifiedProxyConfigs;\n\n  @JsonProperty(\"signer_proxy\")\n  private SignerProxyConfig signerProxy;\n\n  public List<VerifierProxyConfig> getVerifiedProxyConfigs() {\n    return verifiedProxyConfigs;\n  }\n\n  public void setVerifiedProxyConfigs(List<VerifierProxyConfig> verifiedProxyConfigs) {\n    this.verifiedProxyConfigs = verifiedProxyConfigs;\n  }\n\n  public JWTProxy withVerifiedProxyConfigs(List<VerifierProxyConfig> verifiedProxyConfigs) {\n    this.verifiedProxyConfigs = verifiedProxyConfigs;\n    return this;\n  }\n\n  public SignerProxyConfig getSignerProxy() {\n    return signerProxy;\n  }\n\n  public void setSignerProxy(SignerProxyConfig signerProxy) {\n    this.signerProxy = signerProxy;\n  }\n\n  public JWTProxy withSignerProxy(SignerProxyConfig signerProxy) {\n    this.signerProxy = signerProxy;\n    return this;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/model/RegistrableComponentConfig.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.model;\n\nimport com.fasterxml.jackson.annotation.JsonInclude;\nimport com.fasterxml.jackson.annotation.JsonInclude.Include;\nimport java.util.Map;\n\n/**\n * Describes jwtproxy standard registrable component (type + options map).\n *\n * @author Mykhailo Kuznietsov\n */\n@JsonInclude(Include.NON_NULL)\npublic class RegistrableComponentConfig {\n  private String type;\n  private Map<String, ?> options;\n\n  public String getType() {\n    return type;\n  }\n\n  public void setType(String type) {\n    this.type = type;\n  }\n\n  public RegistrableComponentConfig withType(String type) {\n    this.type = type;\n    return this;\n  }\n\n  public Map<String, ?> getOptions() {\n    return options;\n  }\n\n  public void setOptions(Map<String, Object> options) {\n    this.options = options;\n  }\n\n  public RegistrableComponentConfig withOptions(Map<String, ?> options) {\n    this.options = options;\n    return this;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/model/SignerProxyConfig.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.model;\n\n/**\n * Describes signer proxy configuration\n *\n * @author Mykhailo Kuznietsov\n */\npublic class SignerProxyConfig {\n\n  private boolean enabled;\n\n  public boolean isEnabled() {\n    return enabled;\n  }\n\n  public void setEnabled(boolean enabled) {\n    this.enabled = enabled;\n  }\n\n  public SignerProxyConfig withEnabled(boolean enabled) {\n    this.enabled = enabled;\n    return this;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/model/VerifierConfig.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.model;\n\nimport com.fasterxml.jackson.annotation.JsonInclude;\nimport com.fasterxml.jackson.annotation.JsonInclude.Include;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport java.util.Set;\n\n@JsonInclude(Include.NON_NULL)\n/**\n * Describes JWT verifier configuration\n *\n * @author Mykhailo Kuznietsov\n */\npublic class VerifierConfig {\n  private String upstream;\n\n  private String audience;\n\n  @JsonProperty(\"max_skew\")\n  private String maxSkew;\n\n  @JsonProperty(\"max_ttl\")\n  private String maxTtl;\n\n  @JsonProperty(\"nonce_storage\")\n  private RegistrableComponentConfig nonceStorage;\n\n  @JsonProperty(\"key_server\")\n  private RegistrableComponentConfig keyServer;\n\n  @JsonProperty(\"claims_verifiers\")\n  private Set<RegistrableComponentConfig> claimsVerifiers;\n\n  @JsonProperty(\"auth_redirect_url\")\n  private String authUrl;\n\n  @JsonProperty(\"auth_cookies_enabled\")\n  private boolean cookiesEnabled;\n\n  private Set<String> excludes;\n\n  @JsonProperty(\"public_base_path\")\n  private String publicBasePath;\n\n  @JsonProperty(\"cookie_path\")\n  private String cookiePath;\n\n  public String getAudience() {\n    return audience;\n  }\n\n  public void setAudience(String audience) {\n    this.audience = audience;\n  }\n\n  public VerifierConfig withAudience(String audience) {\n    this.audience = audience;\n    return this;\n  }\n\n  public String getMaxSkew() {\n    return maxSkew;\n  }\n\n  public void setMaxSkew(String maxSkew) {\n    this.maxSkew = maxSkew;\n  }\n\n  public VerifierConfig withMaxSkew(String maxSkew) {\n    this.maxSkew = maxSkew;\n    return this;\n  }\n\n  public String getMaxTtl() {\n    return maxTtl;\n  }\n\n  public void setMaxTtl(String maxTtl) {\n    this.maxTtl = maxTtl;\n  }\n\n  public VerifierConfig withMaxTtl(String maxTtl) {\n    this.maxTtl = maxTtl;\n    return this;\n  }\n\n  public String getUpstream() {\n    return upstream;\n  }\n\n  public void setUpstream(String upstream) {\n    this.upstream = upstream;\n  }\n\n  public VerifierConfig withUpstream(String upstream) {\n    this.upstream = upstream;\n    return this;\n  }\n\n  public RegistrableComponentConfig getNonceStorage() {\n    return nonceStorage;\n  }\n\n  public void setNonceStorage(RegistrableComponentConfig nonceStorage) {\n    this.nonceStorage = nonceStorage;\n  }\n\n  public VerifierConfig withNonceStorage(RegistrableComponentConfig nonceStorage) {\n    this.nonceStorage = nonceStorage;\n    return this;\n  }\n\n  public RegistrableComponentConfig getKeyServer() {\n    return keyServer;\n  }\n\n  public void setKeyServer(RegistrableComponentConfig keyServer) {\n    this.keyServer = keyServer;\n  }\n\n  public VerifierConfig withKeyServer(RegistrableComponentConfig keyServer) {\n    this.keyServer = keyServer;\n    return this;\n  }\n\n  public Set<RegistrableComponentConfig> getClaimsVerifiers() {\n    return claimsVerifiers;\n  }\n\n  public void setClaimsVerifiers(Set<RegistrableComponentConfig> claimsVerifiers) {\n    this.claimsVerifiers = claimsVerifiers;\n  }\n\n  public VerifierConfig withClaimsVerifier(Set<RegistrableComponentConfig> claimsVerifiers) {\n    this.claimsVerifiers = claimsVerifiers;\n    return this;\n  }\n\n  public Set<String> getExcludes() {\n    return excludes;\n  }\n\n  public void setExcludes(Set<String> excludes) {\n    this.excludes = excludes;\n  }\n\n  public VerifierConfig withExcludes(Set<String> excludes) {\n    this.excludes = excludes;\n    return this;\n  }\n\n  public String getAuthUrl() {\n    return authUrl;\n  }\n\n  public void setAuthUrl(String authUrl) {\n    this.authUrl = authUrl;\n  }\n\n  public VerifierConfig withAuthUrl(String authUrl) {\n    this.authUrl = authUrl;\n    return this;\n  }\n\n  public boolean getCookiesEnabled() {\n    return cookiesEnabled;\n  }\n\n  public VerifierConfig setCookiesEnabled(boolean cookiesEnabled) {\n    this.cookiesEnabled = cookiesEnabled;\n    return this;\n  }\n\n  public VerifierConfig withCookiesEnabled(boolean cookiesEnabled) {\n    this.cookiesEnabled = cookiesEnabled;\n    return this;\n  }\n\n  public String getPublicBasePath() {\n    return publicBasePath;\n  }\n\n  public void setPublicBasePath(String publicBasePath) {\n    this.publicBasePath = publicBasePath;\n  }\n\n  public VerifierConfig withPublicBasePath(String publicBasePath) {\n    this.publicBasePath = publicBasePath;\n    return this;\n  }\n\n  public String getCookiePath() {\n    return cookiePath;\n  }\n\n  public void setCookiePath(String cookiePath) {\n    this.cookiePath = cookiePath;\n  }\n\n  public VerifierConfig withCookiePath(String cookiePath) {\n    this.cookiePath = cookiePath;\n    return this;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/model/VerifierProxyConfig.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.model;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\n\n/**\n * Describes configuration of the verifier proxy.\n *\n * @author Mykhailo Kuznietsov\n */\npublic class VerifierProxyConfig {\n  @JsonProperty(\"listen_addr\")\n  private String listenAddr;\n\n  @JsonProperty(\"verifier\")\n  private VerifierConfig verifierConfig;\n\n  public String getListenAddr() {\n    return listenAddr;\n  }\n\n  public void setListenAddr(String listenAddr) {\n    this.listenAddr = listenAddr;\n  }\n\n  public VerifierProxyConfig withListenAddr(String listenAddr) {\n    this.listenAddr = listenAddr;\n    return this;\n  }\n\n  public VerifierConfig getVerifierConfig() {\n    return verifierConfig;\n  }\n\n  public void setVerifierConfig(VerifierConfig verifierConfig) {\n    this.verifierConfig = verifierConfig;\n  }\n\n  public VerifierProxyConfig withVerifierConfig(VerifierConfig verifierConfig) {\n    this.verifierConfig = verifierConfig;\n    return this;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/Containers.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.Quantity;\nimport io.fabric8.kubernetes.api.model.ResourceRequirements;\nimport io.fabric8.kubernetes.api.model.ResourceRequirementsBuilder;\n\n/**\n * Helps to simplify the interaction with the {@link Container}.\n *\n * @author Anton Korneta\n */\npublic class Containers {\n\n  private Containers() {}\n\n  /**\n   * Returns the RAM limit in bytes, if it is present in given container otherwise 0 will be\n   * returned.\n   */\n  public static long getRamLimit(Container container) {\n    final ResourceRequirements resources = container.getResources();\n    final Quantity quantity;\n    if (resources != null\n        && resources.getLimits() != null\n        && (quantity = resources.getLimits().get(\"memory\")) != null\n        && quantity.getAmount() != null) {\n      return Quantity.getAmountInBytes(quantity).longValue();\n    }\n    return 0;\n  }\n\n  /**\n   * Sets given RAM limit in bytes to specified container. Note if the container already contains a\n   * RAM limit, it will be overridden, other resources won't be affected.\n   */\n  public static void addRamLimit(Container container, long ramLimit) {\n    final ResourceRequirementsBuilder resourceBuilder;\n    if (container.getResources() != null) {\n      resourceBuilder = new ResourceRequirementsBuilder(container.getResources());\n    } else {\n      resourceBuilder = new ResourceRequirementsBuilder();\n    }\n    container.setResources(\n        resourceBuilder.addToLimits(\"memory\", new Quantity(String.valueOf(ramLimit))).build());\n  }\n\n  /**\n   * Sets given RAM limit in kubernetes notion to specified container. Note if the container already\n   * contains a RAM limit, it will be overridden, other resources won't be affected.\n   */\n  public static void addRamLimit(Container container, String limitInK8sNotion) {\n    final ResourceRequirementsBuilder resourceBuilder;\n    if (container.getResources() != null) {\n      resourceBuilder = new ResourceRequirementsBuilder(container.getResources());\n    } else {\n      resourceBuilder = new ResourceRequirementsBuilder();\n    }\n    container.setResources(\n        resourceBuilder.addToLimits(\"memory\", new Quantity(limitInK8sNotion)).build());\n  }\n\n  /**\n   * Returns the RAM request in bytes, if it is present in given container otherwise 0 will be\n   * returned.\n   */\n  public static long getRamRequest(Container container) {\n    final ResourceRequirements resources = container.getResources();\n    final Quantity quantity;\n    if (resources != null\n        && resources.getRequests() != null\n        && (quantity = resources.getRequests().get(\"memory\")) != null\n        && quantity.getAmount() != null) {\n      return Quantity.getAmountInBytes(quantity).longValue();\n    }\n    return 0;\n  }\n\n  /**\n   * Sets given RAM request in bytes to specified container. Note if the container already contains\n   * a RAM limit, it will be overridden, other resources won't be affected.\n   */\n  public static void addRamRequest(Container container, long ramRequest) {\n    final ResourceRequirementsBuilder resourceBuilder;\n    if (container.getResources() != null) {\n      resourceBuilder = new ResourceRequirementsBuilder(container.getResources());\n    } else {\n      resourceBuilder = new ResourceRequirementsBuilder();\n    }\n    container.setResources(\n        resourceBuilder.addToRequests(\"memory\", new Quantity(String.valueOf(ramRequest))).build());\n  }\n\n  /**\n   * Sets given RAM request in kubernetes notion to specified container. Note if the container\n   * already contains a RAM request, it will be overridden, other resources won't be affected.\n   */\n  public static void addRamRequest(Container container, String limitInK8sNotion) {\n    final ResourceRequirementsBuilder resourceBuilder;\n    if (container.getResources() != null) {\n      resourceBuilder = new ResourceRequirementsBuilder(container.getResources());\n    } else {\n      resourceBuilder = new ResourceRequirementsBuilder();\n    }\n    container.setResources(\n        resourceBuilder.addToRequests(\"memory\", new Quantity(limitInK8sNotion)).build());\n  }\n\n  /**\n   * Returns the CPU limit in cores, if it is present in given container otherwise 0 will be\n   * returned.\n   */\n  public static float getCpuLimit(Container container) {\n    final ResourceRequirements resources = container.getResources();\n    final Quantity quantity;\n    if (resources != null\n        && resources.getLimits() != null\n        && (quantity = resources.getLimits().get(\"cpu\")) != null\n        && quantity.getAmount() != null) {\n      return KubernetesSize.toCores(quantity);\n    }\n    return 0;\n  }\n\n  /**\n   * Sets given CPU limit in cores to specified container. Note if the container already contains a\n   * CPU limit, it will be overridden, other resources won't be affected.\n   */\n  public static void addCpuLimit(Container container, float cpuLimit) {\n    final ResourceRequirementsBuilder resourceBuilder;\n    if (container.getResources() != null) {\n      resourceBuilder = new ResourceRequirementsBuilder(container.getResources());\n    } else {\n      resourceBuilder = new ResourceRequirementsBuilder();\n    }\n    container.setResources(\n        resourceBuilder.addToLimits(\"cpu\", new Quantity(Float.toString(cpuLimit))).build());\n  }\n\n  /**\n   * Sets given CPU limit in kubernetes notion to specified container. Note if the container already\n   * contains a CPU limit, it will be overridden, other resources won't be affected.\n   */\n  public static void addCpuLimit(Container container, String limitInK8sNotion) {\n    final ResourceRequirementsBuilder resourceBuilder;\n    if (container.getResources() != null) {\n      resourceBuilder = new ResourceRequirementsBuilder(container.getResources());\n    } else {\n      resourceBuilder = new ResourceRequirementsBuilder();\n    }\n    container.setResources(\n        resourceBuilder.addToLimits(\"cpu\", new Quantity(limitInK8sNotion)).build());\n  }\n\n  /**\n   * Returns the CPU request in bytes, if it is present in given container otherwise 0 will be\n   * returned.\n   */\n  public static float getCpuRequest(Container container) {\n    final ResourceRequirements resources = container.getResources();\n    final Quantity quantity;\n    if (resources != null\n        && resources.getRequests() != null\n        && (quantity = resources.getRequests().get(\"cpu\")) != null\n        && quantity.getAmount() != null) {\n      return KubernetesSize.toCores(quantity);\n    }\n    return 0;\n  }\n\n  /**\n   * Sets given CPU request in bytes to specified container. Note if the container already contains\n   * a CPU limit, it will be overridden, other resources won't be affected.\n   */\n  public static void addCpuRequest(Container container, float cpuRequest) {\n    final ResourceRequirementsBuilder resourceBuilder;\n    if (container.getResources() != null) {\n      resourceBuilder = new ResourceRequirementsBuilder(container.getResources());\n    } else {\n      resourceBuilder = new ResourceRequirementsBuilder();\n    }\n    container.setResources(\n        resourceBuilder.addToRequests(\"cpu\", new Quantity(Float.toString(cpuRequest))).build());\n  }\n\n  /**\n   * Sets given CPU request in kubernetes notion to specified container. Note if the container\n   * already contains a CPU request, it will be overridden, other resources won't be affected.\n   */\n  public static void addCpuRequest(Container container, String limitInK8sNotion) {\n    final ResourceRequirementsBuilder resourceBuilder;\n    if (container.getResources() != null) {\n      resourceBuilder = new ResourceRequirementsBuilder(container.getResources());\n    } else {\n      resourceBuilder = new ResourceRequirementsBuilder();\n    }\n    container.setResources(\n        resourceBuilder.addToRequests(\"cpu\", new Quantity(limitInK8sNotion)).build());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/EnvVars.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.EnvVar;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.util.stream.Stream;\nimport org.eclipse.che.api.core.model.workspace.devfile.Env;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\n\n/** Utility class for dealing with environment variables */\npublic class EnvVars {\n\n  private static final Pattern REFERENCE_PATTERN = Pattern.compile(\"\\\\$\\\\(\\\\w+\\\\)\");\n\n  /**\n   * Applies the specified env vars list to the specified pod data(containers and init containers).\n   *\n   * <p>If a container does not have the corresponding env - it will be provisioned, if it has - the\n   * value will be overridden.\n   *\n   * @param podData pod to supply env vars\n   * @param env env vars to apply\n   */\n  public void apply(PodData podData, List<? extends Env> env) {\n    Stream.concat(\n            podData.getSpec().getInitContainers().stream(),\n            podData.getSpec().getContainers().stream())\n        .forEach(c -> apply(c, env));\n  }\n\n  /**\n   * Applies the specified env vars list to the specified containers.\n   *\n   * <p>If a container does not have the corresponding env - it will be provisioned, if it has - the\n   * value will be overridden.\n   *\n   * @param container pod to supply env vars\n   * @param toApply env vars to apply\n   */\n  public void apply(Container container, List<? extends Env> toApply) {\n    List<EnvVar> targetEnv = container.getEnv();\n    if (targetEnv == null) {\n      targetEnv = new ArrayList<>();\n      container.setEnv(targetEnv);\n    }\n\n    for (Env env : toApply) {\n      apply(targetEnv, env);\n    }\n  }\n\n  private void apply(List<EnvVar> targetEnv, Env env) {\n    Optional<EnvVar> existingOpt =\n        targetEnv.stream().filter(e -> e.getName().equals(env.getName())).findAny();\n    if (existingOpt.isPresent()) {\n      EnvVar envVar = existingOpt.get();\n      envVar.setValue(env.getValue());\n      envVar.setValueFrom(null);\n    } else {\n      targetEnv.add(new EnvVar(env.getName(), env.getValue(), null));\n    }\n  }\n\n  /**\n   * Looks at the value of the provided environment variable and returns a set of environment\n   * variable references in the Kubernetes convention of {@literal $(VAR_NAME)}.\n   *\n   * <p>See <a\n   * href=\"https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.13/#envvar-v1-core\">API\n   * docs</a> and/or <a\n   * href=\"https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/#using-environment-variables-inside-of-your-config\">documentation</a>.\n   *\n   * @param var the environment variable to analyze\n   * @return a set of variable references, never null\n   */\n  public static Set<String> extractReferencedVariables(EnvVar var) {\n    String val = var.getValue();\n    if (val == null) {\n      return Collections.emptySet();\n    }\n\n    Matcher matcher = REFERENCE_PATTERN.matcher(val);\n\n    // let's just keep the initial size small, because usually there are not that many references\n    // present.\n    Set<String> ret = new HashSet<>(2);\n\n    while (matcher.find()) {\n      int start = matcher.start();\n\n      // the variable reference can be escaped using a double $, e.g. $$(VAR) is not a reference\n      if (start > 0 && val.charAt(start - 1) == '$') {\n        continue;\n      }\n\n      // extract the variable name out of the reference $(NAME) -> NAME\n      String refName = matcher.group().substring(2, matcher.group().length() - 1);\n      ret.add(refName);\n    }\n\n    return ret;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/GatewayConfigmapLabels.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.isLabeled;\n\nimport com.google.common.base.Splitter;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.inject.ConfigurationException;\n\n/** Little utility bean helping with Gateway ConfigMaps labels. */\n@Singleton\npublic class GatewayConfigmapLabels {\n\n  private final Map<String, String> labels;\n\n  @Inject\n  public GatewayConfigmapLabels(\n      @Named(\"che.infra.kubernetes.singlehost.gateway.configmap_labels\") String labelsProperty) {\n    if (isNullOrEmpty(labelsProperty)) {\n      throw new ConfigurationException(\n          \"for gateway single-host, 'che.infra.kubernetes.singlehost.gateway.configmap_labels' property must be defined\");\n    }\n    try {\n      this.labels = Splitter.on(\",\").trimResults().withKeyValueSeparator(\"=\").split(labelsProperty);\n    } catch (IllegalArgumentException iae) {\n      throw new ConfigurationException(\n          \"'che.infra.kubernetes.singlehost.gateway.configmap_labels' is set to invalid value. It must be in format `name1=value1,name2=value2`. Check the documentation for further details.\",\n          iae);\n    }\n  }\n\n  public Map<String, String> getLabels() {\n    return labels;\n  }\n\n  /**\n   * Check whether configmap is gateway route configuration. That is defined with labels provided by\n   * `che.infra.kubernetes.singlehost.gateway.configmap_labels` configuration property.\n   *\n   * @param configMap to check\n   * @return `true` if ConfigMap is gateway route configuration, `false` otherwise\n   */\n  public boolean isGatewayConfig(ConfigMap configMap) {\n    for (Entry<String, String> labelEntry : labels.entrySet()) {\n      if (!isLabeled(configMap, labelEntry.getKey(), labelEntry.getValue())) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/Ingresses.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressPath;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressRule;\nimport io.fabric8.kubernetes.api.model.networking.v1.ServiceBackendPort;\nimport java.util.Collection;\nimport java.util.Optional;\n\n/** Util class that helps working with k8s Ingresses */\npublic class Ingresses {\n\n  /**\n   * In given {@code ingresses} finds {@link IngressRule} for given {@code service} and {@code\n   * port}.\n   *\n   * @return found {@link IngressRule} or {@link Optional#empty()}\n   */\n  public static Optional<IngressRule> findIngressRuleForServicePort(\n      Collection<Ingress> ingresses, Service service, int port) {\n    Optional<ServicePort> foundPort = Services.findPort(service, port);\n    if (!foundPort.isPresent()) {\n      return Optional.empty();\n    }\n\n    for (Ingress ingress : ingresses) {\n      for (IngressRule rule : ingress.getSpec().getRules()) {\n        for (HTTPIngressPath path : rule.getHttp().getPaths()) {\n          IngressBackend backend = path.getBackend();\n          if (backend.getService().getName().equals(service.getMetadata().getName())\n              && matchesServicePort(backend.getService().getPort(), foundPort.get())) {\n            return Optional.of(rule);\n          }\n        }\n      }\n    }\n    return Optional.empty();\n  }\n\n  private static boolean matchesServicePort(\n      ServiceBackendPort backendPort, ServicePort servicePort) {\n    if (backendPort.getName() != null && backendPort.getName().equals(servicePort.getName())) {\n      return true;\n    }\n    if (backendPort.getNumber() != null && backendPort.getNumber().equals(servicePort.getPort())) {\n      return true;\n    }\n    return false;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/KubernetesSharedPool.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ThreadFactory;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.observability.ExecutorServiceWrapper;\n\n/**\n * Provides single {@link ExecutorService} instance with daemon threads for Kubernetes/Openshfit\n * infrastructures components.\n *\n * @author Anton Korneta\n */\n@Singleton\npublic class KubernetesSharedPool {\n\n  private final ExecutorService executor;\n\n  @Inject\n  public KubernetesSharedPool(ExecutorServiceWrapper executorServiceWrapper) {\n    final ThreadFactory factory =\n        new ThreadFactoryBuilder()\n            .setNameFormat(\"KubernetesMachineSharedPool-%d\")\n            .setDaemon(true)\n            .build();\n    this.executor =\n        executorServiceWrapper.wrap(\n            Executors.newCachedThreadPool(factory), KubernetesSharedPool.class.getName());\n  }\n\n  public ExecutorService getExecutor() {\n    return executor;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/KubernetesSize.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport io.fabric8.kubernetes.api.model.Quantity;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * Helps to convert bytes from/to Kubernetes format.\n *\n * @author Anton Korneta\n */\npublic class KubernetesSize {\n\n  // si system multipliers\n  private static final int K = 1000;\n  private static final long M = K * K;\n  private static final long G = M * K;\n  private static final long T = G * K;\n  private static final long P = T * K;\n  private static final long E = P * K;\n\n  // power of 2 multipliers\n  private static final int KI = 1024;\n  private static final long MI = KI * KI;\n  private static final long GI = MI * KI;\n  private static final long TI = GI * KI;\n  private static final long PI = TI * KI;\n  private static final long EI = PI * KI;\n\n  private static final Pattern HUMAN_SIZE_MEMORY_PATTERN =\n      Pattern.compile(\"^([-+]?[0-9]*\\\\.?[0-9]+([eE][-+]?[0-9]+)?)\\\\s*(\\\\S+)?$\");\n\n  private static final Pattern HUMAN_SIZE_CPU_PATTERN =\n      Pattern.compile(\"^([-+]?[0-9]*\\\\.?[0-9]+)(m)?$\");\n\n  /**\n   * Converts memory in Kubernetes format to bytes.\n   *\n   * <p>Format: \"< number >< modifier >\" <br>\n   * Where modifier is one of the following (case-insensitive): b, bi, k, ki, kib, m, mi, mib, g,\n   * gi, gib, t, ti, tib, p, pi, pib, e, ei, eib\n   *\n   * <ul>\n   *   Conversion rules:\n   *   <li>b, bi conversion not needed\n   *   <li>k multiplied by 1000\n   *   <li>ki, kib multiplied by 1024\n   *   <li>m multiplied by 1048576\n   *   <li>mi, mib multiplied by 1000000\n   *   <li>g multiplied by 1073741824\n   *   <li>gi, gib multiplied by 1000000000\n   *   <li>t multiplied by 1,09951162778e+12\n   *   <li>ti,tib multiplied by 1e+12\n   *   <li>p multiplied by 1,12589990684e+15\n   *   <li>pi, pib multiplied by 1e+15\n   *   <li>e multiplied by 1,1529215046e+18\n   *   <li>ei, eib multiplied by 1e+18\n   * </ul>\n   *\n   * @throws IllegalArgumentException if specified string can not be parsed\n   */\n  public static long toBytes(String sizeString) {\n    final Matcher matcher;\n    if ((matcher = HUMAN_SIZE_MEMORY_PATTERN.matcher(sizeString)).matches()) {\n      final float size = Float.parseFloat(matcher.group(1));\n      final String suffix = matcher.group(3);\n      if (suffix == null) {\n        return (long) size;\n      }\n      switch (suffix.toLowerCase()) {\n        case \"b\":\n        case \"bi\":\n          return (long) size;\n        case \"k\":\n          return (long) (size * K);\n        case \"ki\":\n        case \"kib\":\n          return (long) (size * KI);\n        case \"m\":\n          return (long) (size * M);\n        case \"mi\":\n        case \"mib\":\n          return (long) (size * MI);\n        case \"g\":\n          return (long) (size * G);\n        case \"gi\":\n        case \"gib\":\n          return (long) (size * GI);\n        case \"t\":\n          return (long) (size * T);\n        case \"ti\":\n        case \"tib\":\n          return (long) (size * TI);\n        case \"p\":\n          return (long) (size * P);\n        case \"pi\":\n        case \"pib\":\n          return (long) (size * PI);\n        case \"e\":\n          return (long) (size * E);\n        case \"ei\":\n        case \"eib\":\n          return (long) (size * EI);\n      }\n    }\n    throw new IllegalArgumentException(\"Invalid Kubernetes size format provided: \" + sizeString);\n  }\n\n  /** Converts memory from bytes into Kubernetes human readable format. */\n  public static String toKubeSize(long bytes, boolean si) {\n    final int multiplier = si ? K : KI;\n    if (bytes < multiplier) {\n      return bytes + \"B\";\n    }\n    final int e = (int) (Math.log(bytes) / Math.log(multiplier));\n    final String unit = (si ? \"kMGTPE\" : \"KMGTPE\").charAt(e - 1) + (si ? \"\" : \"i\");\n    final float size = bytes / (float) Math.pow(multiplier, e);\n    return String.format((size % 1.0f == 0) ? \"%.0f%s\" : \"%.1f%s\", size, unit);\n  }\n\n  /**\n   * Converts CPU resource in Kubernetes format to cores.\n   *\n   * <p>Format: \"< number >< m>\" <br>\n   *\n   * <ul>\n   *   Conversion rules:\n   *   <li>m divided by 1000\n   * </ul>\n   *\n   * @throws IllegalArgumentException if specified string can not be parsed\n   */\n  public static float toCores(String cpuString) {\n    final Matcher matcher;\n    if ((matcher = HUMAN_SIZE_CPU_PATTERN.matcher(cpuString)).matches()) {\n      final float size = Float.parseFloat(matcher.group(1));\n      final String suffix = matcher.group(2);\n      if (suffix == null) {\n        return size;\n      }\n      if (suffix.toLowerCase().equals(\"m\")) {\n        return size / K;\n      }\n    }\n    throw new IllegalArgumentException(\"Invalid Kubernetes CPU size format provided: \" + cpuString);\n  }\n\n  /**\n   * Converts CPU resource from {@link Quantity} object to cores.\n   *\n   * <p>see {@link KubernetesSize#toCores(String)} for conversion rules\n   *\n   * @param quantity to convert\n   * @return value in cores\n   */\n  public static float toCores(Quantity quantity) {\n    return toCores(quantity.getAmount() + quantity.getFormat());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/NonTlsDistributedClusterModeNotifier.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport jakarta.annotation.PostConstruct;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.util.ApiInfoLogInformer;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Prints warning into logs on startup when Che is running in non-TLS mode. */\n@Singleton\npublic class NonTlsDistributedClusterModeNotifier {\n\n  private static final Logger LOG = LoggerFactory.getLogger(ApiInfoLogInformer.class);\n\n  private final boolean isTlsEnabled;\n\n  @Inject\n  public NonTlsDistributedClusterModeNotifier(\n      @Named(\"che.infra.kubernetes.tls_enabled\") boolean isTlsEnabled) {\n    this.isTlsEnabled = isTlsEnabled;\n  }\n\n  @PostConstruct\n  public void printWarnOnStartup() {\n    if (!isTlsEnabled) {\n      LOG.warn(\n          \"Eclipse Che deployed on non-TLS mode. This may cause client-side problems opening workspaces on multi-cluster installations.\"\n              + \" See https://eclipse.org/che/docs/che-7/introduction-to-eclipse-che/#problems-opening-workspace-in-newest-chrome-versions-on-non-tls-installations-on-distributed-clusters for details.\");\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/PodEvents.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport com.google.common.base.Strings;\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEvent;\n\n/**\n * Helps to simplify the interaction with the {@link PodEvent}.\n *\n * @author Ilya Buziuk\n */\npublic final class PodEvents {\n  private static final String DATE_FORMAT = \"yyyy-MM-dd'T'HH:mm:ssX\";\n\n  private PodEvents() {}\n\n  /**\n   * Converts the time of {@link PodEvent} e.g. '2018-05-15T16:17:54Z' to the {@link Date} format\n   */\n  public static Date convertEventTimestampToDate(String timestamp) throws ParseException {\n    if (Strings.isNullOrEmpty(timestamp)) {\n      throw new IllegalArgumentException(\"Pod event timestamp can not be blank\");\n    }\n    return new SimpleDateFormat(DATE_FORMAT).parse(timestamp);\n  }\n\n  /** Converts the {@link Date} to {@link PodEvent} timestamp format e.g. '2018-05-15T16:17:54Z' */\n  public static String convertDateToEventTimestamp(Date date) {\n    return new SimpleDateFormat(DATE_FORMAT).format(date);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/RuntimeEventsPublisher.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.MachineStatus;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\nimport org.eclipse.che.api.core.model.workspace.runtime.ServerStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.server.DtoConverter;\nimport org.eclipse.che.api.workspace.server.event.RuntimeAbnormalStoppedEvent;\nimport org.eclipse.che.api.workspace.server.event.RuntimeAbnormalStoppingEvent;\nimport org.eclipse.che.api.workspace.shared.dto.event.MachineStatusEvent;\nimport org.eclipse.che.api.workspace.shared.dto.event.RuntimeLogEvent;\nimport org.eclipse.che.api.workspace.shared.dto.event.ServerStatusEvent;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.event.WatchLogStartedEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.event.WatchLogStoppedEvent;\n\n/**\n * @author Anton Korneta\n */\n@Singleton\npublic class RuntimeEventsPublisher {\n\n  private final EventService eventService;\n\n  @Inject\n  public RuntimeEventsPublisher(EventService eventService) {\n    this.eventService = eventService;\n  }\n\n  public void sendStartingEvent(String machineName, RuntimeIdentity runtimeId) {\n    eventService.publish(\n        DtoFactory.newDto(MachineStatusEvent.class)\n            .withIdentity(DtoConverter.asDto(runtimeId))\n            .withEventType(MachineStatus.STARTING)\n            .withMachineName(machineName));\n  }\n\n  public void sendRunningEvent(String machineName, RuntimeIdentity runtimeId) {\n    eventService.publish(\n        DtoFactory.newDto(MachineStatusEvent.class)\n            .withIdentity(DtoConverter.asDto(runtimeId))\n            .withEventType(MachineStatus.RUNNING)\n            .withMachineName(machineName));\n  }\n\n  public void sendFailedEvent(String machineName, String message, RuntimeIdentity runtimeId) {\n    eventService.publish(\n        DtoFactory.newDto(MachineStatusEvent.class)\n            .withIdentity(DtoConverter.asDto(runtimeId))\n            .withEventType(MachineStatus.FAILED)\n            .withMachineName(machineName)\n            .withError(message));\n  }\n\n  public void sendServerStatusEvent(\n      String machineName, String serverName, Server server, RuntimeIdentity runtimeId) {\n    eventService.publish(\n        DtoFactory.newDto(ServerStatusEvent.class)\n            .withIdentity(DtoConverter.asDto(runtimeId))\n            .withMachineName(machineName)\n            .withServerName(serverName)\n            .withStatus(server.getStatus())\n            .withServerUrl(server.getUrl()));\n  }\n\n  public void sendServerRunningEvent(\n      String machineName, String serverName, String serverUrl, RuntimeIdentity runtimeId) {\n    eventService.publish(\n        DtoFactory.newDto(ServerStatusEvent.class)\n            .withIdentity(DtoConverter.asDto(runtimeId))\n            .withMachineName(machineName)\n            .withServerName(serverName)\n            .withStatus(ServerStatus.RUNNING)\n            .withServerUrl(serverUrl));\n  }\n\n  public void sendMachineLogEvent(\n      String machineName, String text, String time, RuntimeIdentity runtimeId) {\n    eventService.publish(\n        DtoFactory.newDto(RuntimeLogEvent.class)\n            .withMachineName(machineName)\n            .withRuntimeId(DtoConverter.asDto(runtimeId))\n            .withText(text)\n            .withTime(time));\n  }\n\n  public void sendRuntimeLogEvent(String text, String time, RuntimeIdentity runtimeId) {\n    eventService.publish(\n        DtoFactory.newDto(RuntimeLogEvent.class)\n            .withRuntimeId(DtoConverter.asDto(runtimeId))\n            .withText(text)\n            .withTime(time));\n  }\n\n  public void sendAbnormalStoppedEvent(RuntimeIdentity runtimeId, String reason) {\n    eventService.publish(new RuntimeAbnormalStoppedEvent(runtimeId, reason));\n  }\n\n  public void sendAbnormalStoppingEvent(RuntimeIdentity runtimeId, String reason) {\n    eventService.publish(new RuntimeAbnormalStoppingEvent(runtimeId, reason));\n  }\n\n  public void sendWatchLogStartedEvent(String container) {\n    eventService.publish(new WatchLogStartedEvent(container));\n  }\n\n  public void sendWatchLogStoppedEvent(String container) {\n    eventService.publish(new WatchLogStoppedEvent(container));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/Services.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.Collection;\nimport java.util.Optional;\n\n/** Utility class to help work with {@link Service}s */\npublic class Services {\n\n  /**\n   * Try to find port in given service.\n   *\n   * @return {@link Optional} of found {@link ServicePort}, or {@link Optional#empty()} when not\n   *     found.\n   */\n  public static Optional<ServicePort> findPort(Service service, int port) {\n    if (service == null || service.getSpec() == null || service.getSpec().getPorts() == null) {\n      return Optional.empty();\n    }\n    return service.getSpec().getPorts().stream()\n        .filter(p -> p.getPort() != null && p.getPort() == port)\n        .findFirst();\n  }\n\n  /**\n   * Go through all given services and finds one that has given port.\n   *\n   * @return {@link Optional} of found {@link Service}, or {@link Optional#empty()} when not found.\n   */\n  public static Optional<Service> findServiceWithPort(Collection<Service> services, int port) {\n    if (services == null) {\n      return Optional.empty();\n    }\n    return services.stream().filter(s -> Services.findPort(s, port).isPresent()).findFirst();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/TracingSpanConstants.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\n/**\n * Constants used as names for spans when tracing kubernetes infra events.\n *\n * @author amisevsk\n */\npublic class TracingSpanConstants {\n\n  /** Span name for the wait phase after objects are created until they are ready */\n  public static final String WAIT_MACHINES_START = \"WaitMachinesStart\";\n\n  /** Span name for async wait for pods to be running */\n  public static final String WAIT_RUNNING_ASYNC = \"WaitRunningAsync\";\n\n  /** Span name for async wait for servers to be running */\n  public static final String CHECK_SERVERS = \"CheckServers\";\n\n  /** Span name for wait for broker storage to be ready */\n  public static final String PREPARE_STORAGE_PHASE = \"PrepareStorage\";\n\n  /** Span name for wait for plugin broker to be deployed */\n  public static final String DEPLOY_BROKER_PHASE = \"DeployBroker\";\n\n  /** Span name for wait for plugin broker's results */\n  public static final String WAIT_BROKERS_RESULT_PHASE = \"WaitBrokerResult\";\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/UnrecoverablePodEventListener.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport com.google.common.base.Strings;\nimport java.util.Set;\nimport java.util.function.Consumer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEventHandler;\n\n/**\n * Listens Pod events and propagates unrecoverable events via the specified handler.\n *\n * @author Sergii Leshchenko\n * @author Ilya Buziuk\n */\npublic class UnrecoverablePodEventListener implements PodEventHandler {\n\n  private final Set<String> pods;\n  private final Consumer<PodEvent> unrecoverableEventHandler;\n  private final Set<String> unrecoverableEvents;\n\n  public UnrecoverablePodEventListener(\n      Set<String> unrecoverableEvents,\n      Set<String> pods,\n      Consumer<PodEvent> unrecoverableEventHandler) {\n    this.unrecoverableEvents = unrecoverableEvents;\n    this.pods = pods;\n    this.unrecoverableEventHandler = unrecoverableEventHandler;\n  }\n\n  @Override\n  public void handle(PodEvent event) {\n    if (isWorkspaceEvent(event) && (isFailedContainer(event) || isUnrecoverable(event))) {\n      unrecoverableEventHandler.accept(event);\n    }\n  }\n\n  /** Returns true if event belongs to one of the workspace pods, false otherwise */\n  private boolean isWorkspaceEvent(PodEvent event) {\n    String podName = event.getPodName();\n    if (Strings.isNullOrEmpty(podName)) {\n      return false;\n    }\n    // Note it is necessary to compare via startsWith rather than equals here, as pods managed by\n    // deployments have their name set as [deploymentName]-[hash]. `workspacePodName` is used to\n    // define the deployment name, so pods that are created aren't an exact match.\n    return pods.stream().anyMatch(podName::startsWith);\n  }\n\n  /**\n   * Returns true if event reason or message matches one of the comma separated values defined in\n   * 'che.infra.kubernetes.workspace_unrecoverable_events',false otherwise\n   *\n   * @param event event to check\n   */\n  private boolean isUnrecoverable(PodEvent event) {\n    boolean isUnrecoverable = false;\n    String reason = event.getReason();\n    String message = event.getMessage();\n    // Consider unrecoverable if event reason 'equals' one of the property values e.g. \"Failed\n    // Mount\"\n    if (unrecoverableEvents.contains(reason)) {\n      isUnrecoverable = true;\n    } else {\n      for (String e : unrecoverableEvents) {\n        // Consider unrecoverable if event message 'startsWith' one of the property values e.g.\n        // \"Failed to pull image\"\n        if (message != null && message.startsWith(e)) {\n          isUnrecoverable = true;\n        }\n      }\n    }\n    return isUnrecoverable;\n  }\n\n  /**\n   * This method detects whether the pod event corresponds to a container that failed to start. Note\n   * that this is handled differently from the the {@link #isUnrecoverable(PodEvent)} because we are\n   * specifically looking at failed containers and don't consider the event message in the logic.\n   *\n   * @param event an event on the pod\n   * @return true if the event is about a failed container, false otherwise\n   */\n  private boolean isFailedContainer(PodEvent event) {\n    return \"Failed\".equals(event.getReason()) && event.getContainerName() != null;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/UnrecoverablePodEventListenerFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport com.google.common.collect.ImmutableSet;\nimport java.util.Set;\nimport java.util.function.Consumer;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEvent;\n\n/**\n * Helps to create {@link UnrecoverablePodEventListener} instaces.\n *\n * @author Sergii Leshchenko\n */\n@Singleton\npublic class UnrecoverablePodEventListenerFactory {\n\n  private final Set<String> unrecoverableEvents;\n\n  @Inject\n  public UnrecoverablePodEventListenerFactory(\n      @Named(\"che.infra.kubernetes.workspace_unrecoverable_events\") String[] unrecoverableEvents) {\n    this.unrecoverableEvents = ImmutableSet.copyOf(unrecoverableEvents);\n  }\n\n  /**\n   * Creates unrecoverable events listener.\n   *\n   * @param pods pods which unrecoverable events should be propagated\n   * @param unrecoverableEventHandler handler which is invoked when unrecoverable event occurs\n   * @return created unrecoverable events listener\n   * @throws IllegalStateException is unrecoverable events are not configured.\n   * @see #isConfigured()\n   */\n  public UnrecoverablePodEventListener create(\n      Set<String> pods, Consumer<PodEvent> unrecoverableEventHandler) {\n    if (!isConfigured()) {\n      throw new IllegalStateException(\"Unrecoverable events are not configured\");\n    }\n\n    return new UnrecoverablePodEventListener(unrecoverableEvents, pods, unrecoverableEventHandler);\n  }\n\n  public UnrecoverablePodEventListener create(\n      KubernetesEnvironment environment, Consumer<PodEvent> unrecoverableEventHandler) {\n    if (!isConfigured()) {\n      throw new IllegalStateException(\"Unrecoverable events are not configured\");\n    }\n\n    Set<String> toWatch =\n        environment.getPodsData().values().stream()\n            .map(podData -> podData.getMetadata().getName())\n            .collect(Collectors.toSet());\n\n    return new UnrecoverablePodEventListener(\n        unrecoverableEvents, toWatch, unrecoverableEventHandler);\n  }\n\n  /**\n   * Returns true if unrecoverable events are configured and it's possible to create unrecoverable\n   * events listener, false otherwise\n   */\n  public boolean isConfigured() {\n    return !unrecoverableEvents.isEmpty();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/BrokersResult.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport com.google.common.annotations.Beta;\nimport com.google.common.annotations.VisibleForTesting;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\n\n/**\n * @author Alexander Garagatyi\n */\n@Beta\npublic class BrokersResult {\n\n  private final CompletableFuture<List<ChePlugin>> future;\n  private final AtomicBoolean started;\n\n  public BrokersResult() {\n    future = new CompletableFuture<>();\n    started = new AtomicBoolean();\n  }\n\n  /**\n   * Submits exception indicating an error if the brokering process.\n   *\n   * <p>Completes call of {@link #get(long, TimeUnit)} with {@link ExecutionException} containing\n   * provided exception\n   *\n   * @param e exception indicating brokering error\n   * @throws IllegalStateException if called before the call of {@link #get(long, TimeUnit)}\n   */\n  public void error(Exception e) {\n    if (!started.get()) {\n      throw new IllegalStateException(\n          \"Submitting a broker error is not allowed before calling BrokerResult#get\");\n    }\n    future.completeExceptionally(e);\n  }\n\n  /**\n   * Submits the result of a broker execution.\n   *\n   * @param toolingFromBroker tooling evaluated by a broker that needs to be added into a workspace\n   * @throws InfrastructureException if called second time which indicates incorrect usage of the\n   *     {@link BrokersResult}\n   * @throws IllegalStateException if called before the call of {@link #get(long, TimeUnit)}\n   */\n  public void setResult(List<ChePlugin> toolingFromBroker) throws InfrastructureException {\n    if (!started.get()) {\n      throw new IllegalStateException(\n          \"Submitting a broker result is not allowed before calling BrokerResult#get\");\n    }\n    if (future.isDone()) {\n      throw new InfrastructureException(\n          \"Plugins brokering result is unexpectedly submitted more than one time. This indicates unexpected behavior of the system\");\n    }\n    future.complete(new ArrayList<>(toolingFromBroker));\n  }\n\n  /**\n   * Waits for the tooling that needs to be injected into a workspace being submitted by a call of\n   * {@link #setResult(List)}.\n   *\n   * <p>If provided timeout elapses before needed call of {@link #setResult(List)} method ends with\n   * an exception. This method is based on {@link CompletableFuture#get(long, TimeUnit)} so it also\n   * inherits parameters and thrown exception.\n   *\n   * @return tooling submitted by broker that needs to be injected into a workspace\n   * @throws IllegalStateException if called more than one time\n   * @see CompletableFuture#get(long, TimeUnit)\n   */\n  public List<ChePlugin> get(long waitTime, TimeUnit tu)\n      throws ExecutionException, InterruptedException, TimeoutException {\n    if (started.compareAndSet(false, true)) {\n      return future.get(waitTime, tu);\n    } else {\n      throw new IllegalStateException(\"BrokerResult#get doesn't support multiple calls\");\n    }\n  }\n\n  @VisibleForTesting\n  boolean isStarted() {\n    return started.get();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/ChePluginsVolumeApplier.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.newVolume;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.newVolumeMount;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport java.util.Collection;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.Volume;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * Components for applying workspace plugin volumes to the kubernetes {@link\n * io.fabric8.kubernetes.api.model.Container}.\n */\n@Singleton\npublic class ChePluginsVolumeApplier {\n\n  @Inject\n  public ChePluginsVolumeApplier() {}\n\n  public void applyVolumes(\n      KubernetesEnvironment.PodData pod,\n      Container container,\n      Collection<Volume> volumes,\n      KubernetesEnvironment k8sEnv) {\n    for (Volume volume : volumes) {\n      String podVolumeName = provisionPodVolume(volume, pod, k8sEnv);\n\n      container.getVolumeMounts().add(newVolumeMount(podVolumeName, volume.getMountPath(), \"\"));\n    }\n  }\n\n  private String provisionPodVolume(\n      Volume volume, KubernetesEnvironment.PodData pod, KubernetesEnvironment k8sEnv) {\n    if (volume.isEphemeral()) {\n      addEmptyDirVolumeIfAbsent(pod.getSpec(), volume.getName());\n      return volume.getName();\n    } else {\n      return provisionPVCPodVolume(volume, pod, k8sEnv).getName();\n    }\n  }\n\n  private io.fabric8.kubernetes.api.model.Volume provisionPVCPodVolume(\n      Volume volume, KubernetesEnvironment.PodData pod, KubernetesEnvironment k8sEnv) {\n    String pvcName = volume.getName();\n\n    PodSpec podSpec = pod.getSpec();\n    Optional<io.fabric8.kubernetes.api.model.Volume> volumeOpt =\n        podSpec.getVolumes().stream()\n            .filter(\n                vm ->\n                    vm.getPersistentVolumeClaim() != null\n                        && pvcName.equals(vm.getPersistentVolumeClaim().getClaimName()))\n            .findAny();\n    io.fabric8.kubernetes.api.model.Volume podVolume;\n    if (volumeOpt.isPresent()) {\n      podVolume = volumeOpt.get();\n    } else {\n      podVolume = newVolume(pvcName, pvcName);\n      podSpec.getVolumes().add(podVolume);\n    }\n    return podVolume;\n  }\n\n  private void addEmptyDirVolumeIfAbsent(PodSpec podSpec, String uniqueVolumeName) {\n    if (podSpec.getVolumes().stream()\n        .noneMatch(volume -> volume.getName().equals(uniqueVolumeName))) {\n      podSpec\n          .getVolumes()\n          .add(\n              new VolumeBuilder()\n                  .withName(uniqueVolumeName)\n                  .withNewEmptyDir()\n                  .endEmptyDir()\n                  .build());\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/K8sContainerResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.Math.min;\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyList;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.ContainerPort;\nimport io.fabric8.kubernetes.api.model.ContainerPortBuilder;\nimport io.fabric8.kubernetes.api.model.ExecAction;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainer;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePluginEndpoint;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.EnvVar;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.Exec;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.Handler;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.Lifecycle;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.Containers;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.KubernetesSize;\n\n/**\n * Resolves Kubernetes container {@link Container} configuration from Che workspace sidecar and Che\n * plugin endpoints.\n *\n * @author Oleksandr Garagatyi\n */\npublic class K8sContainerResolver {\n\n  private final String imagePullPolicy;\n  private final CheContainer cheContainer;\n  private final List<ChePluginEndpoint> containerEndpoints;\n\n  public K8sContainerResolver(\n      String imagePullPolicy, CheContainer container, List<ChePluginEndpoint> containerEndpoints) {\n    this.imagePullPolicy = imagePullPolicy;\n    this.cheContainer = container;\n    this.containerEndpoints = containerEndpoints;\n  }\n\n  public List<ChePluginEndpoint> getEndpoints() {\n    return containerEndpoints;\n  }\n\n  public Container resolve() throws InfrastructureException {\n    Container container =\n        new ContainerBuilder()\n            .withImage(cheContainer.getImage())\n            .withImagePullPolicy(imagePullPolicy)\n            .withName(buildContainerName(cheContainer.getName()))\n            .withEnv(toK8sEnv(cheContainer.getEnv()))\n            .withPorts(getContainerPorts())\n            .withCommand(cheContainer.getCommand())\n            .withArgs(cheContainer.getArgs())\n            .withLifecycle(toK8sLifecycle(cheContainer.getLifecycle()))\n            .build();\n\n    provisionMemoryLimit(container, cheContainer);\n    provisionMemoryRequest(container, cheContainer);\n    provisionCpuLimit(container, cheContainer);\n    provisionCpuRequest(container, cheContainer);\n\n    return container;\n  }\n\n  private io.fabric8.kubernetes.api.model.Lifecycle toK8sLifecycle(Lifecycle lifecycle) {\n    if (lifecycle == null) {\n      return null;\n    }\n    io.fabric8.kubernetes.api.model.LifecycleHandler postStart =\n        toK8sHandler(lifecycle.getPostStart());\n    io.fabric8.kubernetes.api.model.LifecycleHandler preStop = toK8sHandler(lifecycle.getPreStop());\n    io.fabric8.kubernetes.api.model.Lifecycle k8sLifecycle =\n        new io.fabric8.kubernetes.api.model.Lifecycle(postStart, preStop, \"SIGTERM\");\n    return k8sLifecycle;\n  }\n\n  private io.fabric8.kubernetes.api.model.LifecycleHandler toK8sHandler(Handler handler) {\n    if (handler == null || handler.getExec() == null) {\n      return null;\n    }\n    ExecAction exec = toExecAction(handler.getExec());\n    if (exec == null) {\n      return null;\n    }\n    // TODO: add 'httpGetAction' and 'tcpSocketAction' support\n    io.fabric8.kubernetes.api.model.LifecycleHandler k8SHandler =\n        new io.fabric8.kubernetes.api.model.LifecycleHandler(exec, null, null, null);\n    return k8SHandler;\n  }\n\n  private ExecAction toExecAction(Exec exec) {\n    if (exec == null || exec.getCommand().isEmpty()) {\n      return null;\n    }\n    return new ExecAction(exec.getCommand());\n  }\n\n  private void provisionMemoryLimit(Container container, CheContainer cheContainer)\n      throws InfrastructureException {\n    String memoryLimit = cheContainer.getMemoryLimit();\n    if (isNullOrEmpty(memoryLimit)) {\n      return;\n    }\n    try {\n      KubernetesSize.toBytes(memoryLimit);\n    } catch (IllegalArgumentException e) {\n      throw new InfrastructureException(\n          format(\n              \"Sidecar memory limit field contains illegal value '%s'. Error: '%s'\",\n              memoryLimit, e.getMessage()));\n    }\n    Containers.addRamLimit(container, memoryLimit);\n  }\n\n  private void provisionMemoryRequest(Container container, CheContainer cheContainer)\n      throws InfrastructureException {\n    String memoryRequest = cheContainer.getMemoryRequest();\n    if (isNullOrEmpty(memoryRequest)) {\n      return;\n    }\n    try {\n      KubernetesSize.toBytes(memoryRequest);\n    } catch (IllegalArgumentException e) {\n      throw new InfrastructureException(\n          format(\n              \"Sidecar memory request field contains illegal value '%s'. Error: '%s'\",\n              memoryRequest, e.getMessage()));\n    }\n    Containers.addRamRequest(container, memoryRequest);\n  }\n\n  private void provisionCpuLimit(Container container, CheContainer cheContainer)\n      throws InfrastructureException {\n    String cpuLimit = cheContainer.getCpuLimit();\n    if (isNullOrEmpty(cpuLimit)) {\n      return;\n    }\n    try {\n      KubernetesSize.toCores(cpuLimit);\n    } catch (IllegalArgumentException e) {\n      throw new InfrastructureException(\n          format(\n              \"Sidecar CPU limit field contains illegal value '%s'. Error: '%s'\",\n              cpuLimit, e.getMessage()));\n    }\n    Containers.addCpuLimit(container, cpuLimit);\n  }\n\n  private void provisionCpuRequest(Container container, CheContainer cheContainer)\n      throws InfrastructureException {\n    String cpuRequest = cheContainer.getCpuRequest();\n    if (isNullOrEmpty(cpuRequest)) {\n      return;\n    }\n    try {\n      KubernetesSize.toCores(cpuRequest);\n    } catch (IllegalArgumentException e) {\n      throw new InfrastructureException(\n          format(\n              \"Sidecar CPU request field contains illegal value '%s'. Error: '%s'\",\n              cpuRequest, e.getMessage()));\n    }\n    Containers.addCpuRequest(container, cpuRequest);\n  }\n\n  private List<ContainerPort> getContainerPorts() {\n    return containerEndpoints.stream()\n        .map(\n            endpoint ->\n                new ContainerPortBuilder()\n                    .withContainerPort(endpoint.getTargetPort())\n                    .withProtocol(\"TCP\")\n                    .build())\n        .collect(Collectors.toList());\n  }\n\n  private List<io.fabric8.kubernetes.api.model.EnvVar> toK8sEnv(List<EnvVar> env) {\n    if (env == null) {\n      return emptyList();\n    }\n    return env.stream()\n        .map(e -> new io.fabric8.kubernetes.api.model.EnvVar(e.getName(), e.getValue(), null))\n        .collect(Collectors.toList());\n  }\n\n  private String buildContainerName(String cheContainerName) {\n    String uniqueName = NameGenerator.generate(cheContainerName, 3).toLowerCase();\n    return uniqueName.substring(0, min(uniqueName.length(), Names.MAX_CONTAINER_NAME_LENGTH));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/K8sContainerResolverBuilder.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainer;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainerPort;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePluginEndpoint;\n\n/**\n * @author Oleksandr Garagatyi\n */\npublic class K8sContainerResolverBuilder {\n\n  private String imagePullPolicy;\n  private CheContainer container;\n  private List<ChePluginEndpoint> pluginEndpoints;\n\n  public K8sContainerResolverBuilder setContainer(CheContainer container) {\n    this.container = container;\n    return this;\n  }\n\n  public K8sContainerResolverBuilder setPluginEndpoints(List<ChePluginEndpoint> pluginEndpoints) {\n    this.pluginEndpoints = pluginEndpoints;\n    return this;\n  }\n\n  public K8sContainerResolverBuilder setImagePullPolicy(String imagePullPolicy) {\n    this.imagePullPolicy = imagePullPolicy;\n    return this;\n  }\n\n  public K8sContainerResolver build() {\n    if (container == null || pluginEndpoints == null) {\n      throw new IllegalStateException();\n    }\n    List<ChePluginEndpoint> containerEndpoints =\n        getContainerEndpoints(container.getPorts(), pluginEndpoints);\n    return new K8sContainerResolver(imagePullPolicy, container, containerEndpoints);\n  }\n\n  private List<ChePluginEndpoint> getContainerEndpoints(\n      List<CheContainerPort> ports, List<ChePluginEndpoint> endpoints) {\n\n    if (ports == null || ports.isEmpty()) {\n      return Collections.emptyList();\n    }\n    return ports.stream()\n        .map(CheContainerPort::getExposedPort)\n        .flatMap(port -> endpoints.stream().filter(e -> e.getTargetPort() == port))\n        .collect(Collectors.toList());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/KubernetesArtifactsBrokerApplier.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport com.google.common.annotations.Beta;\nimport com.google.inject.Inject;\nimport io.fabric8.kubernetes.api.model.Container;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironment;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.PluginFQN;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.BrokerEnvironmentFactory;\n\n/**\n * Given a {@link InternalEnvironment} representing a workspace, adds the artifacts plugin broker as\n * an init container to the workspace Pod in order to ensure that any extensions are downloaded.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Angel Misevski\n */\n@Beta\npublic class KubernetesArtifactsBrokerApplier<E extends KubernetesEnvironment> {\n\n  private final BrokerEnvironmentFactory<E> brokerEnvironmentFactory;\n\n  @Inject\n  public KubernetesArtifactsBrokerApplier(BrokerEnvironmentFactory<E> brokerEnvironmentFactory) {\n    this.brokerEnvironmentFactory = brokerEnvironmentFactory;\n  }\n\n  /**\n   * Apply plugin broker as init container to workspace environment. Workspace environment will have\n   * broker's configmap, machines, and volumes added in addition to the init container\n   */\n  public void apply(\n      E workspaceEnvironment,\n      RuntimeIdentity runtimeID,\n      Collection<PluginFQN> pluginFQNs,\n      boolean mergePlugins)\n      throws InfrastructureException {\n\n    E brokerEnvironment =\n        brokerEnvironmentFactory.createForArtifactsBroker(pluginFQNs, runtimeID, mergePlugins);\n\n    Map<String, PodData> workspacePods = workspaceEnvironment.getPodsData();\n    if (workspacePods.size() != 1) {\n      throw new InfrastructureException(\n          \"Che plugins tooling configuration can be applied to a workspace with one pod only.\");\n    }\n    PodData workspacePod = workspacePods.values().iterator().next();\n\n    Map<String, PodData> brokerPods = brokerEnvironment.getPodsData();\n    if (brokerPods.size() != 1) {\n      throw new InfrastructureException(\"Broker environment must have only one Pod.\");\n    }\n    PodData brokerPod = brokerPods.values().iterator().next();\n\n    // Add broker machines to workspace environment so that the init containers can be provisioned.\n    List<Container> brokerContainers = brokerPod.getSpec().getContainers();\n    for (Container container : brokerContainers) {\n      InternalMachineConfig brokerMachine =\n          brokerEnvironment.getMachines().get(Names.machineName(brokerPod, container));\n      if (brokerMachine == null) {\n        throw new InfrastructureException(\n            String.format(\n                \"Could not retrieve the specification of the plugin broker container %s\",\n                container.getName()));\n      }\n      workspaceEnvironment\n          .getMachines()\n          .put(Names.machineName(workspacePod, container), brokerMachine);\n    }\n\n    workspaceEnvironment.getConfigMaps().putAll(brokerEnvironment.getConfigMaps());\n    workspacePod.getSpec().getInitContainers().addAll(brokerPod.getSpec().getContainers());\n    workspacePod.getSpec().getVolumes().addAll(brokerPod.getSpec().getVolumes());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/KubernetesPluginsToolingApplier.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyList;\nimport static org.eclipse.che.api.core.model.workspace.config.Command.MACHINE_NAME_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.Command.WORKING_DIRECTORY_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.CONTAINER_SOURCE_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.PLUGIN_MACHINE_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.TOOL_CONTAINER_SOURCE;\n\nimport com.google.common.annotations.Beta;\nimport com.google.common.collect.ArrayListMultimap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.EnvVar;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.Service;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WarningImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironment;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.wsplugins.ChePluginsApplier;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainer;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePluginEndpoint;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.Command;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Warnings;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.EnvVars;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.KubernetesSize;\n\n/**\n * Applies Che plugins tooling configuration to a kubernetes internal runtime object.\n *\n * @author Oleksander Garagatyi\n * @author Sergii Leshchenko\n */\n@Beta\n@Singleton\npublic class KubernetesPluginsToolingApplier implements ChePluginsApplier {\n\n  private static final String CHE_WORKSPACE_POD = \"che-workspace-pod\";\n\n  private final String defaultSidecarMemoryLimitBytes;\n  private final String defaultSidecarMemoryRequestBytes;\n  private final String defaultSidecarCpuLimitCores;\n  private final String defaultSidecarCpuRequestCores;\n  private final boolean isAuthEnabled;\n  private final ChePluginsVolumeApplier chePluginsVolumeApplier;\n  private final EnvVars envVars;\n\n  @Inject\n  public KubernetesPluginsToolingApplier(\n      @Named(\"che.workspace.sidecar.default_memory_limit_mb\") long defaultSidecarMemoryLimitMB,\n      @Named(\"che.workspace.sidecar.default_memory_request_mb\") long defaultSidecarMemoryRequestMB,\n      @Named(\"che.workspace.sidecar.default_cpu_limit_cores\") String defaultSidecarCpuLimitCores,\n      @Named(\"che.workspace.sidecar.default_cpu_request_cores\")\n          String defaultSidecarCpuRequestCores,\n      @Named(\"che.agents.auth_enabled\") boolean isAuthEnabled,\n      ChePluginsVolumeApplier chePluginsVolumeApplier,\n      EnvVars envVars) {\n    this.defaultSidecarMemoryLimitBytes = toBytesString(defaultSidecarMemoryLimitMB);\n    this.defaultSidecarMemoryRequestBytes = toBytesString(defaultSidecarMemoryRequestMB);\n    this.defaultSidecarCpuLimitCores =\n        Float.toString(KubernetesSize.toCores(defaultSidecarCpuLimitCores));\n    this.defaultSidecarCpuRequestCores =\n        Float.toString(KubernetesSize.toCores(defaultSidecarCpuRequestCores));\n    this.isAuthEnabled = isAuthEnabled;\n    this.chePluginsVolumeApplier = chePluginsVolumeApplier;\n    this.envVars = envVars;\n  }\n\n  @Override\n  public void apply(\n      RuntimeIdentity runtimeIdentity,\n      InternalEnvironment internalEnvironment,\n      Collection<ChePlugin> chePlugins)\n      throws InfrastructureException {\n    if (chePlugins.isEmpty()) {\n      return;\n    }\n\n    KubernetesEnvironment k8sEnv = (KubernetesEnvironment) internalEnvironment;\n\n    Map<String, PodData> pods = k8sEnv.getPodsData();\n    switch (pods.size()) {\n      case 0:\n        addToolingPod(k8sEnv);\n        pods = k8sEnv.getPodsData();\n        break;\n      case 1:\n        break;\n      default:\n        throw new InfrastructureException(\n            \"Che plugins tooling configuration can be applied to a workspace with one pod only\");\n    }\n    PodData pod = pods.values().iterator().next();\n\n    CommandsResolver commandsResolver = new CommandsResolver(k8sEnv);\n    for (ChePlugin chePlugin : chePlugins) {\n      Map<String, ComponentImpl> devfilePlugins =\n          k8sEnv.getDevfile().getComponents().stream()\n              .filter(c -> c.getType().equals(\"cheEditor\") || c.getType().equals(\"chePlugin\"))\n              .collect(Collectors.toMap(ComponentImpl::getId, Function.identity()));\n      if (!devfilePlugins.containsKey(chePlugin.getId())) {\n        throw new InfrastructureException(\n            String.format(\n                \"The downloaded plugin '%s' configuration does not have the \"\n                    + \"corresponding component in devfile. Devfile contains the following cheEditor/chePlugins: %s\",\n                chePlugin.getId(), devfilePlugins.keySet()));\n      }\n      ComponentImpl pluginRelatedComponent = devfilePlugins.get(chePlugin.getId());\n\n      for (CheContainer container : chePlugin.getInitContainers()) {\n        Container k8sInitContainer = toK8sContainer(container);\n        envVars.apply(k8sInitContainer, pluginRelatedComponent.getEnv());\n        chePluginsVolumeApplier.applyVolumes(pod, k8sInitContainer, container.getVolumes(), k8sEnv);\n        pod.getSpec().getInitContainers().add(k8sInitContainer);\n      }\n\n      Collection<CommandImpl> pluginRelatedCommands = commandsResolver.resolve(chePlugin);\n\n      for (CheContainer container : chePlugin.getContainers()) {\n        addSidecar(\n            pod,\n            container,\n            chePlugin,\n            k8sEnv,\n            pluginRelatedCommands,\n            pluginRelatedComponent,\n            runtimeIdentity);\n      }\n    }\n\n    chePlugins.forEach(chePlugin -> populateWorkspaceEnvVars(chePlugin, k8sEnv));\n  }\n\n  private void addToolingPod(KubernetesEnvironment kubernetesEnvironment) {\n    Pod pod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(CHE_WORKSPACE_POD)\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n\n    kubernetesEnvironment.addPod(pod);\n  }\n\n  private void populateWorkspaceEnvVars(\n      ChePlugin chePlugin, KubernetesEnvironment kubernetesEnvironment) {\n\n    List<EnvVar> workspaceEnv = toK8sEnvVars(chePlugin.getWorkspaceEnv());\n    kubernetesEnvironment.getPodsData().values().stream()\n        .flatMap(pod -> pod.getSpec().getContainers().stream())\n        .forEach(container -> container.getEnv().addAll(workspaceEnv));\n  }\n\n  private List<EnvVar> toK8sEnvVars(\n      List<org.eclipse.che.api.workspace.server.wsplugins.model.EnvVar> workspaceEnv) {\n    if (workspaceEnv == null) {\n      return emptyList();\n    }\n    return workspaceEnv.stream()\n        .map(e -> new EnvVar(e.getName(), e.getValue(), null))\n        .collect(Collectors.toList());\n  }\n\n  private Container toK8sContainer(CheContainer container) throws InfrastructureException {\n    return toK8sContainerResolver(container, emptyList()).resolve();\n  }\n\n  private K8sContainerResolver toK8sContainerResolver(\n      CheContainer container, List<ChePluginEndpoint> endpoints) {\n    return new K8sContainerResolverBuilder()\n        .setContainer(container)\n        .setPluginEndpoints(endpoints)\n        .build();\n  }\n\n  /**\n   * Adds k8s and Che specific configuration of a sidecar into the environment. For example:\n   * <li>k8s container configuration {@link Container}\n   * <li>k8s service configuration {@link Service}\n   * <li>Che machine config {@link InternalMachineConfig}\n   * <li>Fill in machine name attribute in related commands\n   *\n   * @throws InfrastructureException when any error occurs\n   */\n  private void addSidecar(\n      PodData pod,\n      CheContainer container,\n      ChePlugin chePlugin,\n      KubernetesEnvironment k8sEnv,\n      Collection<CommandImpl> sidecarRelatedCommands,\n      Component pluginRelatedComponent,\n      RuntimeIdentity runtimeIdentity)\n      throws InfrastructureException {\n\n    K8sContainerResolver k8sContainerResolver =\n        toK8sContainerResolver(container, chePlugin.getEndpoints());\n    List<ChePluginEndpoint> containerEndpoints = k8sContainerResolver.getEndpoints();\n\n    Container k8sContainer = k8sContainerResolver.resolve();\n    envVars.apply(k8sContainer, pluginRelatedComponent.getEnv());\n    chePluginsVolumeApplier.applyVolumes(pod, k8sContainer, container.getVolumes(), k8sEnv);\n\n    String machineName = k8sContainer.getName();\n    Names.putMachineName(pod.getMetadata(), k8sContainer.getName(), machineName);\n    pod.getSpec().getContainers().add(k8sContainer);\n\n    MachineResolver machineResolver =\n        new MachineResolverBuilder()\n            .setCheContainer(container)\n            .setContainer(k8sContainer)\n            .setContainerEndpoints(containerEndpoints)\n            .setDefaultSidecarMemoryLimitAttribute(defaultSidecarMemoryLimitBytes)\n            .setDefaultSidecarMemoryRequestAttribute(defaultSidecarMemoryRequestBytes)\n            .setDefaultSidecarCpuLimitAttribute(defaultSidecarCpuLimitCores)\n            .setDefaultSidecarCpuRequestAttribute(defaultSidecarCpuRequestCores)\n            .setComponent(pluginRelatedComponent)\n            .build();\n\n    InternalMachineConfig machineConfig = machineResolver.resolve();\n    machineConfig.getAttributes().put(CONTAINER_SOURCE_ATTRIBUTE, TOOL_CONTAINER_SOURCE);\n    machineConfig.getAttributes().put(PLUGIN_MACHINE_ATTRIBUTE, chePlugin.getId());\n    k8sEnv.getMachines().put(machineName, machineConfig);\n\n    sidecarRelatedCommands.forEach(\n        c ->\n            c.getAttributes()\n                .put(\n                    org.eclipse.che.api.core.model.workspace.config.Command.MACHINE_NAME_ATTRIBUTE,\n                    machineName));\n\n    container.getCommands().stream()\n        .map(c -> asCommand(machineName, c))\n        .forEach(c -> k8sEnv.getCommands().add(c));\n\n    SidecarServicesProvisioner sidecarServicesProvisioner =\n        new SidecarServicesProvisioner(containerEndpoints, pod.getMetadata().getName());\n    sidecarServicesProvisioner.provision(k8sEnv);\n  }\n\n  private CommandImpl asCommand(String machineName, Command command) {\n    CommandImpl cmd =\n        new CommandImpl(command.getName(), String.join(\" \", command.getCommand()), \"custom\");\n    cmd.getAttributes().put(WORKING_DIRECTORY_ATTRIBUTE, command.getWorkingDir());\n    cmd.getAttributes().put(MACHINE_NAME_ATTRIBUTE, machineName);\n    return cmd;\n  }\n\n  private String toBytesString(long memoryLimitMB) {\n    return String.valueOf(memoryLimitMB * 1024L * 1024L);\n  }\n\n  private static class CommandsResolver {\n\n    private final KubernetesEnvironment k8sEnvironment;\n    private final ArrayListMultimap<String, CommandImpl> pluginRefToCommand;\n\n    public CommandsResolver(KubernetesEnvironment k8sEnvironment) {\n      this.k8sEnvironment = k8sEnvironment;\n\n      pluginRefToCommand = ArrayListMultimap.create();\n      k8sEnvironment\n          .getCommands()\n          .forEach(\n              (c) -> {\n                String pluginRef =\n                    c.getAttributes()\n                        .get(\n                            org.eclipse.che.api.core.model.workspace.config.Command\n                                .PLUGIN_ATTRIBUTE);\n                if (pluginRef != null) {\n                  pluginRefToCommand.put(pluginRef, c);\n                }\n              });\n    }\n\n    private Collection<CommandImpl> resolve(ChePlugin chePlugin) {\n      List<CheContainer> containers = chePlugin.getContainers();\n\n      String pluginRef = chePlugin.getId();\n      Collection<CommandImpl> pluginsCommands = pluginRefToCommand.removeAll(pluginRef);\n\n      if (pluginsCommands.isEmpty()) {\n        // specified plugin doesn't have configured commands\n        return emptyList();\n      }\n\n      if (containers.isEmpty()) {\n        k8sEnvironment\n            .getWarnings()\n            .add(\n                new WarningImpl(\n                    Warnings.COMMAND_IS_CONFIGURED_IN_PLUGIN_WITHOUT_CONTAINERS_WARNING_CODE,\n                    format(\n                        Warnings\n                            .COMMAND_IS_CONFIGURED_IN_PLUGIN_WITHOUT_CONTAINERS_WARNING_MESSAGE_FMT,\n                        pluginRef)));\n        return emptyList();\n      }\n\n      if (containers.size() > 1) {\n        k8sEnvironment\n            .getWarnings()\n            .add(\n                new WarningImpl(\n                    Warnings.COMMAND_IS_CONFIGURED_IN_PLUGIN_WITH_MULTIPLY_CONTAINERS_WARNING_CODE,\n                    format(\n                        Warnings\n                            .COMMAND_IS_CONFIGURED_IN_PLUGIN_WITH_MULTIPLY_CONTAINERS_WARNING_MESSAGE_FMT,\n                        pluginRef)));\n      }\n\n      return pluginsCommands;\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/KubernetesPluginsToolingValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport static java.lang.String.format;\n\nimport java.util.List;\nimport java.util.regex.Pattern;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainer;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\n\n@Singleton\npublic class KubernetesPluginsToolingValidator {\n\n  // Pattern is from K8S Container class\n  private static final Pattern namePattern = Pattern.compile(\"[a-z0-9]([-a-z0-9]*[a-z0-9])?\");\n\n  public void validatePluginNames(List<? extends ChePlugin> plugins) throws ValidationException {\n    for (ChePlugin plugin : plugins) {\n      if (plugin.getName() != null) {\n        final String formattedPluginName = plugin.getName().toLowerCase();\n        checkValid(\n            formattedPluginName,\n            \"Plugin name `%s` contains unacceptable symbols and cannot be used as part of container naming.\");\n      }\n      for (CheContainer container : plugin.getContainers()) {\n        if (container.getName() != null) {\n          final String formattedContainerName = container.getName().toLowerCase();\n          checkValid(\n              formattedContainerName,\n              \"Container name `%s` contains unacceptable symbols and cannot be used as part of container naming.\");\n        }\n      }\n    }\n  }\n\n  private void checkValid(String input, String errorMessage) throws ValidationException {\n    if (!namePattern.matcher(input).matches()) {\n      throw new ValidationException(format(errorMessage, input));\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/MachineResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyMap;\nimport static java.util.stream.Collectors.toMap;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_REQUEST_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.DEVFILE_COMPONENT_ALIAS_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_REQUEST_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.PROJECTS_VOLUME_NAME;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.Quantity;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.VolumeImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainer;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePluginEndpoint;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.Volume;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.Containers;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.KubernetesSize;\n\n/**\n * @author Oleksandr Garagatyi\n */\npublic class MachineResolver {\n\n  private final Container container;\n  private final CheContainer cheContainer;\n  private final String defaultSidecarMemoryLimitBytes;\n  private final String defaultSidecarMemoryRequestBytes;\n  private final String defaultSidecarCpuLimitCores;\n  private final String defaultSidecarCpuRequestCores;\n  private final List<ChePluginEndpoint> containerEndpoints;\n  private final Component component;\n\n  public MachineResolver(\n      Container container,\n      CheContainer cheContainer,\n      String defaultSidecarMemoryLimitBytes,\n      String defaultSidecarMemoryRequestBytes,\n      String defaultSidecarCpuLimitCores,\n      String defaultSidecarCpuRequestCores,\n      List<ChePluginEndpoint> containerEndpoints,\n      Component component) {\n    this.container = container;\n    this.cheContainer = cheContainer;\n    this.defaultSidecarMemoryLimitBytes = defaultSidecarMemoryLimitBytes;\n    this.defaultSidecarMemoryRequestBytes = defaultSidecarMemoryRequestBytes;\n    this.defaultSidecarCpuLimitCores = defaultSidecarCpuLimitCores;\n    this.defaultSidecarCpuRequestCores = defaultSidecarCpuRequestCores;\n    this.containerEndpoints = containerEndpoints;\n    this.component = component;\n  }\n\n  public InternalMachineConfig resolve() throws InfrastructureException {\n    InternalMachineConfig machineConfig =\n        new InternalMachineConfig(\n            toServers(containerEndpoints),\n            emptyMap(),\n            resolveMachineAttributes(),\n            toWorkspaceVolumes(cheContainer));\n    applyDevfileVolumes(machineConfig);\n    applyDevfileEndpoints(machineConfig);\n    normalizeMemory(container, machineConfig);\n    normalizeCpu(container, machineConfig);\n    return machineConfig;\n  }\n\n  private void applyDevfileVolumes(InternalMachineConfig machineConfig) {\n    for (org.eclipse.che.api.core.model.workspace.devfile.Volume volume : component.getVolumes()) {\n      machineConfig\n          .getVolumes()\n          .put(volume.getName(), new VolumeImpl().withPath(volume.getContainerPath()));\n    }\n  }\n\n  private void applyDevfileEndpoints(InternalMachineConfig machineConfig)\n      throws InfrastructureException {\n    for (org.eclipse.che.api.core.model.workspace.devfile.Endpoint endpoint :\n        component.getEndpoints()) {\n      if (!machineConfig.getServers().containsKey(endpoint.getName())) {\n        machineConfig\n            .getServers()\n            .put(endpoint.getName(), ServerConfigImpl.createFromEndpoint(endpoint));\n      } else {\n        throw new InfrastructureException(\n            format(\n                \"Devfile overrides the endpoint '%s' of the plugin/editor component '%s'. \"\n                    + \"This is not allowed because it would most probably cause the workspace \"\n                    + \"to malfunction. Please change the name of the endpoint in the devfile and try \"\n                    + \"to start the workspace again.\",\n                component.getId(), endpoint.getName()));\n      }\n    }\n  }\n\n  private Map<String, String> resolveMachineAttributes() {\n    Map<String, String> attributes = new HashMap<>();\n\n    String alias = component.getAlias();\n    if (alias != null) {\n      attributes.put(DEVFILE_COMPONENT_ALIAS_ATTRIBUTE, alias);\n    }\n\n    return attributes;\n  }\n\n  private void normalizeMemory(Container container, InternalMachineConfig machineConfig) {\n    long ramLimit = Containers.getRamLimit(container);\n    if (ramLimit == 0) {\n      machineConfig.getAttributes().put(MEMORY_LIMIT_ATTRIBUTE, defaultSidecarMemoryLimitBytes);\n    }\n    String overriddenSidecarMemLimit = component.getMemoryLimit();\n    if (!isNullOrEmpty(overriddenSidecarMemLimit)) {\n      machineConfig\n          .getAttributes()\n          .put(\n              MEMORY_LIMIT_ATTRIBUTE,\n              Long.toString(\n                  Quantity.getAmountInBytes(Quantity.parse(overriddenSidecarMemLimit))\n                      .longValue()));\n    }\n\n    long ramRequest = Containers.getRamRequest(container);\n    if (ramRequest == 0) {\n      machineConfig.getAttributes().put(MEMORY_REQUEST_ATTRIBUTE, defaultSidecarMemoryRequestBytes);\n    }\n    String overriddenSidecarMemRequest = component.getMemoryRequest();\n    if (!isNullOrEmpty(overriddenSidecarMemRequest)) {\n      machineConfig\n          .getAttributes()\n          .put(\n              MEMORY_REQUEST_ATTRIBUTE,\n              Long.toString(\n                  Quantity.getAmountInBytes(Quantity.parse(overriddenSidecarMemRequest))\n                      .longValue()));\n    }\n  }\n\n  private void normalizeCpu(Container container, InternalMachineConfig machineConfig) {\n    float cpuLimit = Containers.getCpuLimit(container);\n    if (cpuLimit == 0) {\n      machineConfig.getAttributes().put(CPU_LIMIT_ATTRIBUTE, defaultSidecarCpuLimitCores);\n    }\n    String overriddenSidecarCpuLimit = component.getCpuLimit();\n    if (!isNullOrEmpty(overriddenSidecarCpuLimit)) {\n      machineConfig\n          .getAttributes()\n          .put(\n              CPU_LIMIT_ATTRIBUTE,\n              Float.toString(KubernetesSize.toCores(overriddenSidecarCpuLimit)));\n    }\n\n    float cpuRequest = Containers.getCpuRequest(container);\n    if (cpuRequest == 0) {\n      machineConfig.getAttributes().put(CPU_REQUEST_ATTRIBUTE, defaultSidecarCpuRequestCores);\n    }\n    String overriddenSidecarCpuRequest = component.getCpuRequest();\n    if (!isNullOrEmpty(overriddenSidecarCpuRequest)) {\n      machineConfig\n          .getAttributes()\n          .put(\n              CPU_REQUEST_ATTRIBUTE,\n              Float.toString(KubernetesSize.toCores(overriddenSidecarCpuRequest)));\n    }\n  }\n\n  private Map<String, ? extends org.eclipse.che.api.core.model.workspace.config.Volume>\n      toWorkspaceVolumes(CheContainer container) throws InfrastructureException {\n\n    Map<String, VolumeImpl> result = new HashMap<>();\n\n    for (Volume volume : container.getVolumes()) {\n      if (volume.getName().equals(PROJECTS_VOLUME_NAME)) {\n        throw new InfrastructureException(\n            \"Plugin '%s' tried to manually mount the '%s' volume into its container '%s' on\"\n                + \" path '%s'. This is illegal because sources need to be mounted to '%s'. Set\"\n                + \" the mountSources attribute to true instead and remove the manual volume\"\n                + \" mount in the plugin.\");\n      }\n    }\n    return result;\n  }\n\n  private Map<String, ? extends ServerConfig> toServers(List<ChePluginEndpoint> endpoints) {\n    return endpoints.stream().collect(toMap(ChePluginEndpoint::getName, this::toServer));\n  }\n\n  private ServerConfigImpl toServer(ChePluginEndpoint endpoint) {\n    ServerConfigImpl serverConfig =\n        new ServerConfigImpl().withPort(endpoint.getTargetPort() + \"/tcp\");\n    serverConfig.getAttributes().put(\"internal\", Boolean.toString(!endpoint.isPublic()));\n    for (Entry<String, String> attribute : endpoint.getAttributes().entrySet()) {\n      switch (attribute.getKey()) {\n        case \"protocol\":\n          serverConfig.setProtocol(attribute.getValue());\n          break;\n        case \"path\":\n          serverConfig.setPath(attribute.getValue());\n          break;\n        default:\n          serverConfig.getAttributes().put(attribute.getKey(), attribute.getValue());\n      }\n    }\n    return serverConfig;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/MachineResolverBuilder.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport java.util.List;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainer;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePluginEndpoint;\n\n/**\n * @author Alexander Garagatyi\n */\npublic class MachineResolverBuilder {\n\n  private Container container;\n  private CheContainer cheContainer;\n  private String defaultSidecarMemoryLimitAttribute;\n  private String defaultSidecarMemoryRequestAttribute;\n  private String defaultSidecarCpuLimitAttribute;\n  private String defaultSidecarCpuRequestAttribute;\n  private List<ChePluginEndpoint> containerEndpoints;\n  private Component component;\n\n  public MachineResolver build() {\n    if (container == null\n        || cheContainer == null\n        || defaultSidecarMemoryLimitAttribute == null\n        || defaultSidecarMemoryRequestAttribute == null\n        || defaultSidecarCpuLimitAttribute == null\n        || defaultSidecarCpuRequestAttribute == null\n        || containerEndpoints == null) {\n      throw new IllegalStateException(\n          \"Unable to build MachineResolver because some fields are null\");\n    }\n\n    return new MachineResolver(\n        container,\n        cheContainer,\n        defaultSidecarMemoryLimitAttribute,\n        defaultSidecarMemoryRequestAttribute,\n        defaultSidecarCpuLimitAttribute,\n        defaultSidecarCpuRequestAttribute,\n        containerEndpoints,\n        component);\n  }\n\n  public MachineResolverBuilder setContainer(Container container) {\n    this.container = container;\n    return this;\n  }\n\n  public MachineResolverBuilder setCheContainer(CheContainer cheContainer) {\n    this.cheContainer = cheContainer;\n    return this;\n  }\n\n  public MachineResolverBuilder setDefaultSidecarMemoryLimitAttribute(\n      String defaultSidecarMemoryLimitAttribute) {\n    this.defaultSidecarMemoryLimitAttribute = defaultSidecarMemoryLimitAttribute;\n    return this;\n  }\n\n  public MachineResolverBuilder setDefaultSidecarMemoryRequestAttribute(\n      String defaultSidecarMemoryRequestAttribute) {\n    this.defaultSidecarMemoryRequestAttribute = defaultSidecarMemoryRequestAttribute;\n    return this;\n  }\n\n  public MachineResolverBuilder setDefaultSidecarCpuLimitAttribute(\n      String defaultSidecarCpuLimitAttribute) {\n    this.defaultSidecarCpuLimitAttribute = defaultSidecarCpuLimitAttribute;\n    return this;\n  }\n\n  public MachineResolverBuilder setDefaultSidecarCpuRequestAttribute(\n      String defaultSidecarCpuRequestAttribute) {\n    this.defaultSidecarCpuRequestAttribute = defaultSidecarCpuRequestAttribute;\n    return this;\n  }\n\n  public MachineResolverBuilder setContainerEndpoints(List<ChePluginEndpoint> containerEndpoints) {\n    this.containerEndpoints = containerEndpoints;\n    return this;\n  }\n\n  public MachineResolverBuilder setComponent(Component component) {\n    this.component = component;\n    return this;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/PluginBrokerManager.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport com.google.common.annotations.Beta;\nimport io.opentracing.Tracer;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.PluginFQN;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesEnvironmentProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.StartSynchronizer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.UnrecoverablePodEventListenerFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.BrokerEnvironmentFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.DeployBroker;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.ListenBrokerEvents;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.PrepareStorage;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.WaitBrokerResult;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Deploys Che plugin broker in a workspace, receives result of its execution and return resolved\n * workspace tooling or error of plugin broker execution.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Oleksandr Garagatyi\n */\n@Beta\npublic class PluginBrokerManager<E extends KubernetesEnvironment> {\n\n  private static final Logger LOG = LoggerFactory.getLogger(PluginBrokerManager.class);\n\n  private final int pluginBrokerWaitingTimeout;\n  private final KubernetesNamespaceFactory factory;\n  private final EventService eventService;\n  private final KubernetesPluginsToolingValidator pluginsValidator;\n  private final BrokerEnvironmentFactory<E> brokerEnvironmentFactory;\n  private final KubernetesEnvironmentProvisioner<E> environmentProvisioner;\n  private final UnrecoverablePodEventListenerFactory unrecoverablePodEventListenerFactory;\n  private final RuntimeEventsPublisher runtimeEventsPublisher;\n  private final Tracer tracer;\n\n  @Inject\n  public PluginBrokerManager(\n      KubernetesNamespaceFactory factory,\n      EventService eventService,\n      KubernetesPluginsToolingValidator pluginsValidator,\n      KubernetesEnvironmentProvisioner<E> environmentProvisioner,\n      BrokerEnvironmentFactory<E> brokerEnvironmentFactory,\n      UnrecoverablePodEventListenerFactory unrecoverablePodEventListenerFactory,\n      @Named(\"che.workspace.plugin_broker.wait_timeout_min\") int pluginBrokerWaitingTimeout,\n      RuntimeEventsPublisher runtimeEventsPublisher,\n      Tracer tracer) {\n    this.factory = factory;\n    this.eventService = eventService;\n    this.pluginsValidator = pluginsValidator;\n    this.brokerEnvironmentFactory = brokerEnvironmentFactory;\n    this.environmentProvisioner = environmentProvisioner;\n    this.pluginBrokerWaitingTimeout = pluginBrokerWaitingTimeout;\n    this.unrecoverablePodEventListenerFactory = unrecoverablePodEventListenerFactory;\n    this.runtimeEventsPublisher = runtimeEventsPublisher;\n    this.tracer = tracer;\n  }\n\n  /**\n   * Deploys Che plugin brokers in a workspace, receives result of theirs execution and returns\n   * resolved workspace tooling or error of plugins brokering execution.\n   *\n   * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n   */\n  @Beta\n  @Traced\n  public List<ChePlugin> getTooling(\n      RuntimeIdentity identity,\n      StartSynchronizer startSynchronizer,\n      Collection<PluginFQN> pluginFQNs,\n      boolean mergePlugins,\n      Map<String, String> startOptions)\n      throws InfrastructureException {\n\n    String workspaceId = identity.getWorkspaceId();\n    KubernetesNamespace kubernetesNamespace = factory.getOrCreate(identity);\n    BrokersResult brokersResult = new BrokersResult();\n\n    E brokerEnvironment =\n        brokerEnvironmentFactory.createForMetadataBroker(pluginFQNs, identity, mergePlugins);\n    environmentProvisioner.provision(brokerEnvironment, identity);\n\n    ListenBrokerEvents listenBrokerEvents = getListenEventPhase(workspaceId, brokersResult);\n    PrepareStorage prepareStorage =\n        getPrepareStoragePhase(identity, startSynchronizer, brokerEnvironment);\n    WaitBrokerResult waitBrokerResult = getWaitBrokerPhase(workspaceId, brokersResult);\n    DeployBroker deployBroker =\n        getDeployBrokerPhase(\n            identity, kubernetesNamespace, brokerEnvironment, brokersResult, startOptions);\n    LOG.debug(\"Entering plugin brokers deployment chain workspace '{}'\", workspaceId);\n    listenBrokerEvents.then(prepareStorage).then(deployBroker).then(waitBrokerResult);\n    return listenBrokerEvents.execute();\n  }\n\n  private ListenBrokerEvents getListenEventPhase(String workspaceId, BrokersResult brokersResult) {\n    return new ListenBrokerEvents(workspaceId, pluginsValidator, brokersResult, eventService);\n  }\n\n  private PrepareStorage getPrepareStoragePhase(\n      RuntimeIdentity identity,\n      StartSynchronizer startSynchronizer,\n      KubernetesEnvironment brokerEnvironment) {\n    return new PrepareStorage(identity, brokerEnvironment, startSynchronizer, tracer);\n  }\n\n  private DeployBroker getDeployBrokerPhase(\n      RuntimeIdentity runtimeId,\n      KubernetesNamespace kubernetesNamespace,\n      KubernetesEnvironment brokerEnvironment,\n      BrokersResult brokersResult,\n      Map<String, String> startOptions) {\n    return new DeployBroker(\n        runtimeId,\n        kubernetesNamespace,\n        brokerEnvironment,\n        brokersResult,\n        unrecoverablePodEventListenerFactory,\n        runtimeEventsPublisher,\n        tracer,\n        startOptions);\n  }\n\n  private WaitBrokerResult getWaitBrokerPhase(String workspaceId, BrokersResult brokersResult) {\n    return new WaitBrokerResult(workspaceId, brokersResult, pluginBrokerWaitingTimeout, tracer);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/SidecarServicesProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport static java.lang.String.format;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_ORIGINAL_NAME_LABEL;\n\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServiceBuilder;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServicePortBuilder;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePluginEndpoint;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * Resolves Kubernetes {@link Service}s needed for a proper accessibility of a Che workspace\n * sidecar.\n *\n * <p>Proper accessibility here means that sidecar endpoint should be discoverable by an endpoint\n * name inside of a workspace.\n *\n * @author Oleksandr Garagatyi\n */\npublic class SidecarServicesProvisioner {\n\n  private final List<ChePluginEndpoint> endpoints;\n  private final String podName;\n\n  public SidecarServicesProvisioner(List<ChePluginEndpoint> containerEndpoints, String podName) {\n    this.endpoints = containerEndpoints;\n    this.podName = podName;\n  }\n\n  /**\n   * Add k8s Service objects to environment to provide service discovery in sidecar based\n   * workspaces.\n   */\n  public void provision(KubernetesEnvironment kubernetesEnvironment)\n      throws InfrastructureException {\n    for (ChePluginEndpoint endpoint : endpoints) {\n      if (!isDiscoverable(endpoint)) {\n        continue;\n      }\n\n      String serviceName = endpoint.getName();\n      Service service = createService(serviceName, podName, endpoint.getTargetPort());\n\n      Map<String, Service> services = kubernetesEnvironment.getServices();\n      if (!services.containsKey(serviceName)) {\n        services.put(serviceName, service);\n      } else {\n        throw new InfrastructureException(\n            format(\n                \"Applying of sidecar tooling failed. Kubernetes service with name '%s' already exists in the workspace environment.\",\n                serviceName));\n      }\n    }\n  }\n\n  private boolean isDiscoverable(ChePluginEndpoint endpoint) {\n    return Boolean.parseBoolean(endpoint.getAttributes().getOrDefault(\"discoverable\", \"true\"));\n  }\n\n  private Service createService(String name, String podName, int port) {\n    ServicePort servicePort =\n        new ServicePortBuilder().withPort(port).withProtocol(\"TCP\").withNewTargetPort(port).build();\n    return new ServiceBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .endMetadata()\n        .withNewSpec()\n        .withSelector(singletonMap(CHE_ORIGINAL_NAME_LABEL, podName))\n        .withPorts(singletonList(servicePort))\n        .endSpec()\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/brokerphases/BrokerEnvironmentFactory.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.util.Collections.singletonMap;\n\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.common.base.MoreObjects;\nimport com.google.common.base.Strings;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.EnvVar;\nimport io.fabric8.kubernetes.api.model.EnvVarBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.VolumeImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.AgentAuthEnableEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.MachineTokenEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.PluginFQN;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.CertificateProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.Containers;\n\n/**\n * Creates {@link KubernetesEnvironment} with everything needed to deploy Plugin brokers.\n *\n * <p>It has to be extended to be used in the kubernetes or openshift infrastructures because of the\n * usage of a complex inheritance between components of these infrastructures.\n *\n * @author Oleksandr Garagatyi\n */\npublic abstract class BrokerEnvironmentFactory<E extends KubernetesEnvironment> {\n\n  @VisibleForTesting static final String CONFIG_MAP_NAME_SUFFIX = \"broker-config-map\";\n  @VisibleForTesting static final String CONFIG_FILE = \"config.json\";\n  private static final String BROKER_VOLUME = \"broker-config-volume\";\n  private static final String CONF_FOLDER = \"/broker-config\";\n  private static final String PLUGINS_VOLUME_NAME = \"plugins\";\n  private static final String BROKERS_POD_NAME = \"che-plugin-broker\";\n\n  private final ObjectMapper objectMapper = new ObjectMapper();\n  private final String cheWebsocketEndpoint;\n  private final String brokerPullPolicy;\n  private final AgentAuthEnableEnvVarProvider authEnableEnvVarProvider;\n  private final MachineTokenEnvVarProvider machineTokenEnvVarProvider;\n  private final String artifactsBrokerImage;\n  private final String metadataBrokerImage;\n  private final String pluginRegistryUrl;\n  private final String certificateMountPath;\n  private final CertificateProvisioner certProvisioner;\n\n  public BrokerEnvironmentFactory(\n      String cheWebsocketEndpoint,\n      String cheWebsocketInternalEndpoint,\n      String brokerPullPolicy,\n      AgentAuthEnableEnvVarProvider authEnableEnvVarProvider,\n      MachineTokenEnvVarProvider machineTokenEnvVarProvider,\n      String artifactsBrokerImage,\n      String metadataBrokerImage,\n      String pluginRegistryExternalUrl,\n      String pluginRegistryInternalUrl,\n      String certificateMountPath,\n      CertificateProvisioner certProvisioner) {\n    this.cheWebsocketEndpoint =\n        isNullOrEmpty(cheWebsocketInternalEndpoint)\n            ? cheWebsocketEndpoint\n            : cheWebsocketInternalEndpoint;\n    this.brokerPullPolicy = brokerPullPolicy;\n    this.authEnableEnvVarProvider = authEnableEnvVarProvider;\n    this.machineTokenEnvVarProvider = machineTokenEnvVarProvider;\n    this.artifactsBrokerImage = artifactsBrokerImage;\n    this.metadataBrokerImage = metadataBrokerImage;\n    this.pluginRegistryUrl =\n        isNullOrEmpty(pluginRegistryInternalUrl)\n            ? pluginRegistryExternalUrl\n            : pluginRegistryInternalUrl;\n    this.certificateMountPath = certificateMountPath;\n    this.certProvisioner = certProvisioner;\n  }\n\n  /**\n   * Creates {@link KubernetesEnvironment} with everything needed to deploy metadata plugin broker.\n   *\n   * @param pluginFQNs fully qualified names of plugins that needs to be resolved by the broker\n   * @param runtimeID ID of the runtime the broker would be started\n   * @return kubernetes environment (or its extension) with the Plugin broker objects\n   */\n  public E createForMetadataBroker(\n      Collection<PluginFQN> pluginFQNs, RuntimeIdentity runtimeID, boolean mergePlugins)\n      throws InfrastructureException {\n    BrokersConfigs brokersConfigs =\n        getBrokersConfigs(pluginFQNs, runtimeID, metadataBrokerImage, mergePlugins);\n    return doCreate(brokersConfigs);\n  }\n\n  /**\n   * Creates {@link KubernetesEnvironment} with everything needed to deploy artifacts plugin broker.\n   *\n   * @param pluginFQNs fully qualified names of plugins that needs to be resolved by the broker\n   * @param runtimeID ID of the runtime the broker would be started\n   * @param mergePlugins whether the broker should be configured to merge plugins where possible\n   * @return kubernetes environment (or its extension) with the Plugin broker objects\n   */\n  public E createForArtifactsBroker(\n      Collection<PluginFQN> pluginFQNs, RuntimeIdentity runtimeID, boolean mergePlugins)\n      throws InfrastructureException {\n    BrokersConfigs brokersConfigs =\n        getBrokersConfigs(pluginFQNs, runtimeID, artifactsBrokerImage, mergePlugins);\n    brokersConfigs\n        .machines\n        .values()\n        .forEach(\n            m -> m.getVolumes().put(PLUGINS_VOLUME_NAME, new VolumeImpl().withPath(\"/plugins\")));\n    return doCreate(brokersConfigs);\n  }\n\n  protected BrokersConfigs getBrokersConfigs(\n      Collection<PluginFQN> pluginFQNs,\n      RuntimeIdentity runtimeID,\n      String brokerImage,\n      boolean mergePlugins)\n      throws InfrastructureException {\n\n    String configMapName = generateUniqueName(CONFIG_MAP_NAME_SUFFIX);\n    String configMapVolume = generateUniqueName(BROKER_VOLUME);\n    ConfigMap configMap = newConfigMap(configMapName, pluginFQNs);\n\n    Pod pod = newPod();\n    List<EnvVar> envVars =\n        Stream.of(\n                authEnableEnvVarProvider.get(runtimeID), machineTokenEnvVarProvider.get(runtimeID))\n            .map(this::asEnvVar)\n            .collect(Collectors.toList());\n    Container container =\n        newContainer(runtimeID, envVars, brokerImage, configMapVolume, mergePlugins);\n    pod.getSpec().getContainers().add(container);\n    pod.getSpec().getVolumes().add(newConfigMapVolume(configMapName, configMapVolume));\n\n    InternalMachineConfig machineConfig = new InternalMachineConfig();\n    String machineName = Names.machineName(pod.getMetadata(), container);\n\n    BrokersConfigs configs = new BrokersConfigs();\n    configs.configMaps = singletonMap(configMapName, configMap);\n    configs.machines = singletonMap(machineName, machineConfig);\n    configs.pods = singletonMap(pod.getMetadata().getName(), pod);\n\n    return configs;\n  }\n\n  /** Needed to implement this component in both - Kubernetes and Openshift infrastructures. */\n  protected abstract E doCreate(BrokersConfigs brokerConfigs);\n\n  private Container newContainer(\n      RuntimeIdentity runtimeId,\n      List<EnvVar> envVars,\n      String image,\n      @Nullable String brokerVolumeName,\n      boolean mergePlugins) {\n    String containerName = generateContainerNameFromImageRef(image);\n    String[] cmdArgs = getCommandLineArgs(runtimeId, mergePlugins).toArray(new String[0]);\n    final ContainerBuilder cb =\n        new ContainerBuilder()\n            .withName(containerName)\n            .withImage(image)\n            .withArgs(cmdArgs)\n            .withImagePullPolicy(brokerPullPolicy)\n            .withEnv(envVars);\n    if (brokerVolumeName != null) {\n      cb.withVolumeMounts(\n          new VolumeMount(CONF_FOLDER + \"/\", null, brokerVolumeName, true, null, null, null));\n      cb.addToArgs(\"--metas\", CONF_FOLDER + \"/\" + CONFIG_FILE);\n    }\n    Container container = cb.build();\n    Containers.addRamLimit(container, \"250Mi\");\n    Containers.addRamRequest(container, \"250Mi\");\n    Containers.addCpuLimit(container, \"300m\");\n    Containers.addCpuRequest(container, \"300m\");\n    return container;\n  }\n\n  protected List<String> getCommandLineArgs(RuntimeIdentity runtimeId, boolean mergePlugins) {\n    ArrayList<String> args =\n        new ArrayList<>(\n            Arrays.asList(\n                \"--push-endpoint\",\n                cheWebsocketEndpoint,\n                \"--runtime-id\",\n                String.format(\n                    \"%s:%s:%s\",\n                    runtimeId.getWorkspaceId(),\n                    MoreObjects.firstNonNull(runtimeId.getEnvName(), \"\"),\n                    runtimeId.getOwnerId()),\n                \"--cacert\",\n                certProvisioner.isConfigured() ? certProvisioner.getCertPath() : \"\",\n                \"--registry-address\",\n                Strings.nullToEmpty(pluginRegistryUrl)));\n    if (mergePlugins) {\n      args.add(\"--merge-plugins\");\n    }\n    return args;\n  }\n\n  private Pod newPod() {\n    return new PodBuilder()\n        .withNewMetadata()\n        .withName(BROKERS_POD_NAME)\n        .endMetadata()\n        .withNewSpec()\n        .withRestartPolicy(\"Never\")\n        .endSpec()\n        .build();\n  }\n\n  private ConfigMap newConfigMap(String configMapName, Collection<PluginFQN> pluginFQNs)\n      throws InternalInfrastructureException {\n    try {\n      return new ConfigMapBuilder()\n          .withNewMetadata()\n          .withName(configMapName)\n          .endMetadata()\n          .withData(singletonMap(CONFIG_FILE, objectMapper.writeValueAsString(pluginFQNs)))\n          .build();\n    } catch (JsonProcessingException e) {\n      throw new InternalInfrastructureException(e.getMessage(), e);\n    }\n  }\n\n  private Volume newConfigMapVolume(String configMapName, String configMapVolume) {\n    return new VolumeBuilder()\n        .withName(configMapVolume)\n        .withNewConfigMap()\n        .withName(configMapName)\n        .endConfigMap()\n        .build();\n  }\n\n  private EnvVar asEnvVar(Pair<String, String> envVar) {\n    return new EnvVarBuilder().withName(envVar.first).withValue(envVar.second).build();\n  }\n\n  private String generateUniqueName(String suffix) {\n    return NameGenerator.generate(suffix, 6);\n  }\n\n  /**\n   * Generate a container name from an image reference. Since full image references can be over 63\n   * characters, we need to strip registry and organization from the image reference to limit name\n   * length.\n   */\n  @VisibleForTesting\n  protected String generateContainerNameFromImageRef(String image) {\n    String containerName;\n    if (image.contains(\"@\")) {\n      // Image is tagged with digest; we trim digest to 10 chars and remove \"sha256\"\n      String[] parts = image.split(\"@\");\n      String imagePart = parts[0];\n      String digest = parts[1];\n      if (digest.contains(\":\")) {\n        digest = digest.split(\":\")[1];\n      }\n      if (digest.length() > 10) {\n        digest = digest.substring(0, 10);\n      }\n      image = String.format(\"%s-%s\", imagePart, digest);\n    }\n    containerName = image.toLowerCase().replaceAll(\"[^/]*/\", \"\").replaceAll(\"[^\\\\d\\\\w-]\", \"-\");\n    if (containerName.length() > 63) {\n      containerName = containerName.substring(0, 63);\n    }\n    return containerName;\n  }\n\n  public static class BrokersConfigs {\n    public Map<String, InternalMachineConfig> machines;\n    public Map<String, ConfigMap> configMaps;\n    public Map<String, Pod> pods;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/brokerphases/BrokerPhase.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases;\n\nimport com.google.common.annotations.Beta;\nimport java.util.List;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\n\n/**\n * Phase of Che plugin broker lifecycle used to separate and simplify different stages on Che plugin\n * broker execution.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Oleksandr Garagatyi\n */\n@Beta\npublic abstract class BrokerPhase {\n\n  protected BrokerPhase nextPhase;\n\n  @Beta\n  public BrokerPhase then(BrokerPhase next) {\n    this.nextPhase = next;\n    return next;\n  }\n\n  /**\n   * Executes this phase. Broker phase implementation should call next {@link BrokerPhase} if it is\n   * set.\n   *\n   * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n   *\n   * @throws InfrastructureException when an error occurs during the progressing of this stage\n   */\n  @Beta\n  public abstract List<ChePlugin> execute() throws InfrastructureException;\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/brokerphases/DeployBroker.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.util.TracingSpanConstants.DEPLOY_BROKER_PHASE;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport com.google.common.annotations.Beta;\nimport com.google.common.collect.ImmutableSet;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.opentracing.Span;\nimport io.opentracing.Tracer;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.RuntimeLogsPublisher;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesDeployments;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.LogWatchTimeouts;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.LogWatcher;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.PodLogToEventPublisher;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.UnrecoverablePodEventListener;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.UnrecoverablePodEventListenerFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.BrokersResult;\nimport org.slf4j.Logger;\n\n/**\n * Deploys Che plugin broker in a workspace, calls next {@link BrokerPhase} and removes deployment\n * after next phase completes.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Oleksandr Garagatyi\n */\n@Beta\npublic class DeployBroker extends BrokerPhase {\n\n  private static final Logger LOG = getLogger(DeployBroker.class);\n\n  private final RuntimeEventsPublisher runtimeEventsPublisher;\n  private final KubernetesNamespace namespace;\n  private final KubernetesEnvironment brokerEnvironment;\n  private final BrokersResult brokersResult;\n  private final UnrecoverablePodEventListenerFactory factory;\n  private final RuntimeIdentity runtimeId;\n  private final Tracer tracer;\n  private final Map<String, String> startOptions;\n\n  public DeployBroker(\n      RuntimeIdentity runtimeId,\n      KubernetesNamespace namespace,\n      KubernetesEnvironment brokerEnvironment,\n      BrokersResult brokersResult,\n      UnrecoverablePodEventListenerFactory factory,\n      RuntimeEventsPublisher runtimeEventsPublisher,\n      Tracer tracer,\n      Map<String, String> startOptions) {\n    this.runtimeId = runtimeId;\n    this.namespace = namespace;\n    this.brokerEnvironment = brokerEnvironment;\n    this.brokersResult = brokersResult;\n    this.factory = factory;\n    this.runtimeEventsPublisher = runtimeEventsPublisher;\n    this.tracer = tracer;\n    this.startOptions = startOptions;\n  }\n\n  @Override\n  public List<ChePlugin> execute() throws InfrastructureException {\n    LOG.debug(\"Starting brokers pod for workspace '{}'\", runtimeId.getWorkspaceId());\n    Span tracingSpan = tracer.buildSpan(DEPLOY_BROKER_PHASE).start();\n    TracingTags.WORKSPACE_ID.set(tracingSpan, runtimeId.getWorkspaceId());\n\n    KubernetesDeployments deployments = namespace.deployments();\n    try {\n      // Creates config map that can inject Che tooling plugins meta files into a Che plugin\n      // broker in a workspace.\n      for (ConfigMap configMap : brokerEnvironment.getConfigMaps().values()) {\n        namespace.configMaps().create(configMap);\n      }\n\n      for (Secret secret : brokerEnvironment.getSecrets().values()) {\n        namespace.secrets().create(secret);\n      }\n\n      Pod pluginBrokerPod = getPluginBrokerPod(brokerEnvironment.getPodsCopy());\n\n      if (factory.isConfigured()) {\n        UnrecoverablePodEventListener unrecoverableEventListener =\n            factory.create(\n                ImmutableSet.of(pluginBrokerPod.getMetadata().getName()),\n                this::handleUnrecoverableEvent);\n        namespace.deployments().watchEvents(unrecoverableEventListener);\n      }\n\n      namespace\n          .deployments()\n          .watchEvents(\n              new RuntimeLogsPublisher(\n                  runtimeEventsPublisher,\n                  runtimeId,\n                  ImmutableSet.of(pluginBrokerPod.getMetadata().getName())));\n\n      deployments.create(pluginBrokerPod);\n\n      watchLogsIfDebugEnabled(startOptions, pluginBrokerPod);\n\n      LOG.debug(\"Brokers pod is created for workspace '{}'\", runtimeId.getWorkspaceId());\n      tracingSpan.finish();\n      return nextPhase.execute();\n    } catch (InfrastructureException e) {\n\n      namespace.deployments().stopWatch(true);\n      // Ensure span is finished with exception message\n      TracingTags.setErrorStatus(tracingSpan, e);\n      tracingSpan.finish();\n      throw e;\n    } finally {\n      namespace.deployments().stopWatch();\n      try {\n        deployments.delete();\n      } catch (InfrastructureException e) {\n        LOG.error(\"Brokers pod removal failed. Error: \" + e.getLocalizedMessage(), e);\n      }\n      try {\n        namespace.secrets().delete();\n      } catch (InfrastructureException ex) {\n        LOG.error(\"Brokers secret removal failed. Error: \" + ex.getLocalizedMessage(), ex);\n      }\n      try {\n        namespace.configMaps().delete();\n      } catch (InfrastructureException ex) {\n        LOG.error(\"Brokers config map removal failed. Error: \" + ex.getLocalizedMessage(), ex);\n      }\n    }\n  }\n\n  private void watchLogsIfDebugEnabled(Map<String, String> startOptions, Pod pluginBrokerPod)\n      throws InfrastructureException {\n    if (LogWatcher.shouldWatchLogs(startOptions)) {\n      LOG.debug(\n          \"Will watch the logs of plugin broker of workspace '{}'\", runtimeId.getWorkspaceId());\n      namespace\n          .deployments()\n          .watchLogs(\n              new PodLogToEventPublisher(runtimeEventsPublisher, runtimeId),\n              runtimeEventsPublisher,\n              LogWatchTimeouts.AGGRESSIVE,\n              ImmutableSet.of(pluginBrokerPod.getMetadata().getName()),\n              LogWatcher.getLogLimitBytes(startOptions));\n    }\n  }\n\n  private void handleUnrecoverableEvent(PodEvent podEvent) {\n    String reason = podEvent.getReason();\n    String message = podEvent.getMessage();\n    LOG.error(\n        \"Unrecoverable event occurred during plugin brokering for workspace '{}' startup: {}, {}, {}\",\n        runtimeId.getWorkspaceId(),\n        reason,\n        message,\n        podEvent.getPodName());\n    brokersResult.error(\n        new InfrastructureException(\n            format(\n                \"Unrecoverable event occurred: '%s', '%s', '%s'\",\n                reason, message, podEvent.getPodName())));\n  }\n\n  private Pod getPluginBrokerPod(Map<String, Pod> pods) throws InfrastructureException {\n    if (pods.size() != 1) {\n      throw new InternalInfrastructureException(\n          format(\n              \"Plugin broker environment must have only \"\n                  + \"one pod. Workspace `%s` contains `%s` pods.\",\n              runtimeId.getWorkspaceId(), pods.size()));\n    }\n\n    return pods.values().iterator().next();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/brokerphases/KubernetesBrokerEnvironmentFactory.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases;\n\nimport com.google.common.annotations.Beta;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.AgentAuthEnableEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.MachineTokenEnvVarProvider;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.CertificateProvisioner;\n\n/**\n * Extends {@link BrokerEnvironmentFactory} to be used in the kubernetes infrastructure.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Oleksandr Garagatyi\n */\n@Beta\npublic class KubernetesBrokerEnvironmentFactory\n    extends BrokerEnvironmentFactory<KubernetesEnvironment> {\n\n  @Inject\n  public KubernetesBrokerEnvironmentFactory(\n      @Named(\"che.websocket.endpoint\") String cheWebsocketEndpoint,\n      @Nullable @Named(\"che.websocket.internal.endpoint\") String cheWebsocketInternalEndpoint,\n      @Named(\"che.workspace.plugin_broker.pull_policy\") String brokerPullPolicy,\n      @Named(\"che.infra.kubernetes.trusted_ca.mount_path\") String certificateMountPath,\n      AgentAuthEnableEnvVarProvider authEnableEnvVarProvider,\n      MachineTokenEnvVarProvider machineTokenEnvVarProvider,\n      @Named(\"che.workspace.plugin_broker.artifacts.image\") String artifactsBrokerImage,\n      @Named(\"che.workspace.plugin_broker.metadata.image\") String metadataBrokerImage,\n      @Nullable @Named(\"che.workspace.plugin_registry_url\") String pluginRegistryExternalUrl,\n      @Nullable @Named(\"che.workspace.plugin_registry_internal_url\")\n          String pluginRegistryInternalUrl,\n      CertificateProvisioner certProvisioner) {\n    super(\n        cheWebsocketEndpoint,\n        cheWebsocketInternalEndpoint,\n        brokerPullPolicy,\n        authEnableEnvVarProvider,\n        machineTokenEnvVarProvider,\n        artifactsBrokerImage,\n        metadataBrokerImage,\n        pluginRegistryExternalUrl,\n        pluginRegistryInternalUrl,\n        certificateMountPath,\n        certProvisioner);\n  }\n\n  @Override\n  protected KubernetesEnvironment doCreate(BrokersConfigs brokersConfigs) {\n    return KubernetesEnvironment.builder()\n        .setConfigMaps(brokersConfigs.configMaps)\n        .setMachines(brokersConfigs.machines)\n        .setPods(brokersConfigs.pods)\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/brokerphases/ListenBrokerEvents.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases;\n\nimport com.google.common.annotations.Beta;\nimport java.util.List;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.BrokersResult;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.KubernetesPluginsToolingValidator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events.BrokerEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events.BrokerStatusListener;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Subscribes to Che plugin broker events, passes future that should be completed upon broker result\n * received to {@link BrokerStatusListener} and calls next {@link BrokerPhase}.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Oleksandr Garagatyi\n */\n@Beta\npublic class ListenBrokerEvents extends BrokerPhase {\n\n  private static final Logger LOG = LoggerFactory.getLogger(ListenBrokerEvents.class);\n\n  private final String workspaceId;\n  private final BrokersResult brokersResult;\n  private final EventService eventService;\n  private final KubernetesPluginsToolingValidator pluginsValidator;\n\n  public ListenBrokerEvents(\n      String workspaceId,\n      KubernetesPluginsToolingValidator pluginsValidator,\n      BrokersResult brokersResult,\n      EventService eventService) {\n    this.workspaceId = workspaceId;\n    this.pluginsValidator = pluginsValidator;\n    this.brokersResult = brokersResult;\n    this.eventService = eventService;\n  }\n\n  @Override\n  public List<ChePlugin> execute() throws InfrastructureException {\n    BrokerStatusListener brokerStatusListener =\n        new BrokerStatusListener(workspaceId, pluginsValidator, brokersResult);\n    try {\n      LOG.debug(\"Subscribing broker events listener for workspace '{}'\", workspaceId);\n      eventService.subscribe(brokerStatusListener, BrokerEvent.class);\n\n      return nextPhase.execute();\n    } finally {\n      eventService.unsubscribe(brokerStatusListener);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/brokerphases/PrepareStorage.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.util.TracingSpanConstants.PREPARE_STORAGE_PHASE;\n\nimport com.google.common.annotations.Beta;\nimport io.opentracing.Span;\nimport io.opentracing.Tracer;\nimport java.util.List;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.StartSynchronizer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * Prepares PVC in a workspace and calls next {@link BrokerPhase}.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Oleksandr Garagatyi\n */\n@Beta\npublic class PrepareStorage extends BrokerPhase {\n\n  private final RuntimeIdentity identity;\n  private final Tracer tracer;\n\n  public PrepareStorage(\n      RuntimeIdentity identity,\n      KubernetesEnvironment brokerEnvironment,\n      StartSynchronizer startSynchronizer,\n      Tracer tracer) {\n    this.identity = identity;\n    this.tracer = tracer;\n  }\n\n  @Override\n  public List<ChePlugin> execute() throws InfrastructureException {\n    Span tracingSpan = tracer.buildSpan(PREPARE_STORAGE_PHASE).start();\n    TracingTags.WORKSPACE_ID.set(tracingSpan, identity.getWorkspaceId());\n\n    return nextPhase.execute();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/brokerphases/WaitBrokerResult.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.util.TracingSpanConstants.WAIT_BROKERS_RESULT_PHASE;\n\nimport com.google.common.annotations.Beta;\nimport io.opentracing.Span;\nimport io.opentracing.Tracer;\nimport java.util.List;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.BrokersResult;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Wait until Che plugin broker future finishes and returns resulting workspace tooling or error.\n * Also calls next {@link BrokerPhase}.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Oleksandr Garagatyi\n */\n@Beta\npublic class WaitBrokerResult extends BrokerPhase {\n\n  private static final Logger LOG = LoggerFactory.getLogger(WaitBrokerResult.class);\n\n  private final BrokersResult brokersResult;\n  private final String workspaceId;\n  private final Tracer tracer;\n\n  private final int resultWaitingTimeout;\n\n  public WaitBrokerResult(\n      String workspaceId, BrokersResult brokersResult, int resultWaitingTimeout, Tracer tracer) {\n    this.workspaceId = workspaceId;\n    this.brokersResult = brokersResult;\n    this.resultWaitingTimeout = resultWaitingTimeout;\n    this.tracer = tracer;\n  }\n\n  @Override\n  public List<ChePlugin> execute() throws InfrastructureException {\n    Span tracingSpan = tracer.buildSpan(WAIT_BROKERS_RESULT_PHASE).start();\n    TracingTags.WORKSPACE_ID.set(tracingSpan, workspaceId);\n\n    try {\n      LOG.debug(\"Trying to get brokers result for workspace '{}'\", workspaceId);\n      return brokersResult.get(resultWaitingTimeout, TimeUnit.MINUTES);\n    } catch (InterruptedException e) {\n      TracingTags.setErrorStatus(tracingSpan, e);\n      throw new InfrastructureException(\n          \"Plugins installation process was interrupted. Error: \" + e.getMessage(), e);\n    } catch (ExecutionException e) {\n      TracingTags.setErrorStatus(tracingSpan, e);\n      throw new InfrastructureException(\n          \"Plugins installation process failed. Error: \" + e.getCause().getMessage(), e.getCause());\n    } catch (TimeoutException e) {\n      TracingTags.setErrorStatus(tracingSpan, e);\n      throw new InfrastructureException(\"Plugins installation process timed out\");\n    } finally {\n      tracingSpan.finish();\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/events/BrokerEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events;\n\nimport com.google.common.annotations.Beta;\nimport java.util.List;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\nimport org.eclipse.che.api.workspace.shared.dto.BrokerStatus;\nimport org.eclipse.che.api.workspace.shared.dto.event.BrokerStatusChangedEvent;\n\n/**\n * Event sent by a plugin broker with results of broker invocation.\n *\n * <p>This class differs from {@link BrokerStatusChangedEvent} it is version of latter with a\n * prettier format. It has workspace tooling in a POJO representation instead of stringified JSON.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @see BrokerStatusChangedEvent\n */\n@Beta\npublic class BrokerEvent {\n  private BrokerStatus status;\n  private RuntimeIdentity runtimeId;\n  private String error;\n  private List<ChePlugin> tooling;\n\n  @SuppressWarnings(\"unused\")\n  public BrokerEvent() {}\n\n  public BrokerEvent(BrokerStatusChangedEvent resultEvent, List<ChePlugin> tooling) {\n    this.error = resultEvent.getError();\n    this.status = resultEvent.getStatus();\n    this.runtimeId = resultEvent.getRuntimeId();\n    this.tooling = tooling;\n  }\n\n  public BrokerStatus getStatus() {\n    return status;\n  }\n\n  public BrokerEvent withStatus(BrokerStatus status) {\n    this.status = status;\n    return this;\n  }\n\n  public RuntimeIdentity getRuntimeId() {\n    return runtimeId;\n  }\n\n  public BrokerEvent withRuntimeId(RuntimeIdentity runtimeId) {\n    this.runtimeId = runtimeId;\n    return this;\n  }\n\n  public String getError() {\n    return error;\n  }\n\n  public BrokerEvent withError(String error) {\n    this.error = error;\n    return this;\n  }\n\n  List<ChePlugin> getTooling() {\n    return tooling;\n  }\n\n  BrokerEvent withTooling(List<ChePlugin> tooling) {\n    this.tooling = tooling;\n    return this;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/events/BrokerService.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport com.fasterxml.jackson.core.type.TypeReference;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.google.common.annotations.Beta;\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerConfigurator;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\nimport org.eclipse.che.api.workspace.shared.dto.event.BrokerLogEvent;\nimport org.eclipse.che.api.workspace.shared.dto.event.BrokerStatusChangedEvent;\nimport org.eclipse.che.api.workspace.shared.dto.event.RuntimeLogEvent;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.slf4j.Logger;\n\n/**\n * Configure JSON_RPC consumers of Che plugin broker events. Also converts {@link\n * BrokerStatusChangedEvent} to {@link BrokerEvent}.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Oleksander Garagatyi\n */\n@Beta\n@Singleton\npublic class BrokerService {\n\n  private static final Logger LOG = getLogger(BrokerService.class);\n\n  public static final String BROKER_RESULT_METHOD = \"broker/result\";\n  public static final String BROKER_STATUS_CHANGED_METHOD = \"broker/statusChanged\";\n  public static final String BROKER_LOG_METHOD = \"broker/log\";\n\n  private final ObjectMapper objectMapper = new ObjectMapper();\n  private final EventService eventService;\n\n  @Inject\n  public BrokerService(EventService eventService) {\n    this.eventService = eventService;\n  }\n\n  @Inject\n  public void configureMethods(RequestHandlerConfigurator requestHandler) {\n    requestHandler\n        .newConfiguration()\n        .methodName(BROKER_STATUS_CHANGED_METHOD)\n        .paramsAsDto(BrokerStatusChangedEvent.class)\n        .noResult()\n        .withConsumer(this::handle);\n\n    requestHandler\n        .newConfiguration()\n        .methodName(BROKER_RESULT_METHOD)\n        .paramsAsDto(BrokerStatusChangedEvent.class)\n        .noResult()\n        .withConsumer(this::handle);\n\n    requestHandler\n        .newConfiguration()\n        .methodName(BROKER_LOG_METHOD)\n        .paramsAsDto(BrokerLogEvent.class)\n        .noResult()\n        .withConsumer(this::handle);\n  }\n\n  private void handle(BrokerLogEvent brokerLogEvent) {\n    eventService.publish(\n        DtoFactory.newDto(RuntimeLogEvent.class)\n            .withRuntimeId(brokerLogEvent.getRuntimeId())\n            .withText(brokerLogEvent.getText())\n            .withTime(brokerLogEvent.getTime()));\n  }\n\n  private void handle(BrokerStatusChangedEvent event) {\n    String encodedTooling = event.getTooling();\n    RuntimeIdentity runtimeId = event.getRuntimeId();\n    if (event.getStatus() == null || runtimeId == null || runtimeId.getWorkspaceId() == null) {\n      LOG.error(\"Broker event skipped due to illegal content: {}\", event);\n      return;\n    }\n    eventService.publish(new BrokerEvent(event, parseTooling(encodedTooling)));\n  }\n\n  @Nullable\n  private List<ChePlugin> parseTooling(String toolingString) {\n    if (!isNullOrEmpty(toolingString)) {\n      try {\n        List<ChePlugin> plugins =\n            objectMapper.readValue(toolingString, new TypeReference<List<ChePlugin>>() {});\n        // when id of plugin is not set, we can compose it from publisher, name and version\n        return plugins.stream().map(this::composePluginIdWhenNull).collect(Collectors.toList());\n      } catch (IOException e) {\n        LOG.error(\"Parsing Che plugin broker event failed. Error: \" + e.getMessage(), e);\n      }\n    }\n    return null;\n  }\n\n  private ChePlugin composePluginIdWhenNull(ChePlugin plugin) {\n    if (isNullOrEmpty(plugin.getId())\n        && !isNullOrEmpty(plugin.getPublisher())\n        && !isNullOrEmpty(plugin.getName())\n        && !isNullOrEmpty(plugin.getVersion())) {\n      plugin.setId(plugin.getPublisher() + \"/\" + plugin.getName() + \"/\" + plugin.getVersion());\n    }\n    return plugin;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/events/BrokerStatusListener.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events;\n\nimport static java.lang.String.format;\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport com.google.common.annotations.Beta;\nimport java.util.List;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.notification.EventSubscriber;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.BrokersResult;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.KubernetesPluginsToolingValidator;\nimport org.slf4j.Logger;\n\n/**\n * Listens for {@link BrokerEvent} and completes or exceptionally completes a start and done futures\n * depending on the event state.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Oleksandr Garagatyi\n */\n@Beta\npublic class BrokerStatusListener implements EventSubscriber<BrokerEvent> {\n\n  private static final Logger LOG = getLogger(BrokerStatusListener.class);\n\n  private final String workspaceId;\n  private final KubernetesPluginsToolingValidator pluginsValidator;\n  private final BrokersResult brokersResult;\n\n  public BrokerStatusListener(\n      String workspaceId,\n      KubernetesPluginsToolingValidator pluginsValidator,\n      BrokersResult brokersResult) {\n    this.workspaceId = workspaceId;\n    this.pluginsValidator = pluginsValidator;\n    this.brokersResult = brokersResult;\n  }\n\n  @Override\n  public void onEvent(BrokerEvent event) {\n    if (event.getRuntimeId() == null\n        || !workspaceId.equals(event.getRuntimeId().getWorkspaceId())) {\n      return;\n    }\n\n    switch (event.getStatus()) {\n      case DONE:\n        List<ChePlugin> tooling = event.getTooling();\n        if (tooling != null) {\n          try {\n            pluginsValidator.validatePluginNames(tooling);\n          } catch (ValidationException e) {\n            brokersResult.error(e);\n            return;\n          }\n          try {\n            brokersResult.setResult(tooling);\n          } catch (InfrastructureException e) {\n            LOG.error(e.getLocalizedMessage(), e);\n          }\n        } else {\n          brokersResult.error(\n              new InternalInfrastructureException(\n                  format(\n                      \"Plugin brokering process for workspace `%s` is finished but plugins list is missing\",\n                      workspaceId)));\n        }\n        break;\n      case FAILED:\n        brokersResult.error(\n            new InfrastructureException(\n                format(\n                    \"Plugin brokering process for workspace %s failed with error: %s\",\n                    workspaceId, event.getError())));\n        break;\n      case STARTED:\n      default:\n        // do nothing\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/AnnotationsTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableMap;\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.testng.annotations.Test;\n\n/**\n * Test for {@link Annotations}.\n *\n * @author Sergii Leshchenko\n */\npublic class AnnotationsTest {\n  static final Gson GSON = new GsonBuilder().disableHtmlEscaping().create();\n  static final Map<String, String> ATTRIBUTES = singletonMap(\"key\", \"value\");\n  static final String stringAttributes = GSON.toJson(ATTRIBUTES);\n  static final String stringEmptyAttributes = GSON.toJson(emptyMap());\n\n  @Test\n  public void serialization() {\n    Map<String, String> serialized =\n        Annotations.newSerializer()\n            .server(\n                \"my-server1/http\",\n                new ServerConfigImpl(\"8000/tcp\", \"http\", \"/api/info\", ATTRIBUTES))\n            .servers(\n                ImmutableMap.of(\n                    \"my-server2\", new ServerConfigImpl(\"8080/tcp\", \"ws\", \"/connect\", emptyMap())))\n            .machineName(\"test-machine\")\n            .annotations();\n    Map<String, String> expected =\n        ImmutableMap.<String, String>builder()\n            .put(\"org.eclipse.che.server.my-server1/http.port\", \"8000/tcp\")\n            .put(\"org.eclipse.che.server.my-server1/http.protocol\", \"http\")\n            .put(\"org.eclipse.che.server.my-server1/http.path\", \"/api/info\")\n            .put(\"org.eclipse.che.server.my-server1/http.attributes\", stringAttributes)\n            .put(\"org.eclipse.che.server.my-server2.port\", \"8080/tcp\")\n            .put(\"org.eclipse.che.server.my-server2.protocol\", \"ws\")\n            .put(\"org.eclipse.che.server.my-server2.path\", \"/connect\")\n            .put(\"org.eclipse.che.server.my-server2.attributes\", stringEmptyAttributes)\n            .put(\"org.eclipse.che.machine.name\", \"test-machine\")\n            .build();\n\n    assertEquals(serialized, expected);\n  }\n\n  @Test\n  public void deserialization() {\n    ImmutableMap<String, String> annotations =\n        ImmutableMap.<String, String>builder()\n            .put(\"custom-label\", \"value\")\n            .put(\"org.eclipse.che.server.my-server1/http.port\", \"8000/tcp\")\n            .put(\"org.eclipse.che.server.my-server1/http.protocol\", \"http\")\n            .put(\"org.eclipse.che.server.my-server1/http.path\", \"/api/info\")\n            .put(\"org.eclipse.che.server.my-server2.port\", \"8080/tcp\")\n            .put(\"org.eclipse.che.server.my-server2.protocol\", \"ws\")\n            .put(\"org.eclipse.che.server.my-server2.path\", \"/connect\")\n            .put(\"org.eclipse.che.server.my-server2.attributes\", stringAttributes)\n            .put(\"org.eclipse.che.server.my-server3.port\", \"7070/tcp\")\n            .put(\"org.eclipse.che.server.my-server3.protocol\", \"http\")\n            .put(\"org.eclipse.che.server.my-server3.attributes\", stringEmptyAttributes)\n            .put(\"org.eclipse.che.machine.name\", \"test-machine\")\n            .build();\n\n    Annotations.Deserializer deserializer = Annotations.newDeserializer(annotations);\n\n    Map<String, ServerConfigImpl> servers = deserializer.servers();\n\n    assertEquals(deserializer.machineName(), \"test-machine\");\n\n    Map<String, ServerConfigImpl> expected = new HashMap<>();\n    expected.put(\"my-server1/http\", new ServerConfigImpl(\"8000/tcp\", \"http\", \"/api/info\", null));\n    expected.put(\"my-server2\", new ServerConfigImpl(\"8080/tcp\", \"ws\", \"/connect\", ATTRIBUTES));\n    expected.put(\"my-server3\", new ServerConfigImpl(\"7070/tcp\", \"http\", null, emptyMap()));\n    assertEquals(servers, expected);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/K8sInfraNamespaceWsAttributeValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport static java.util.Collections.emptyMap;\nimport static org.eclipse.che.api.workspace.shared.Constants.WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\n\nimport com.google.common.collect.ImmutableMap;\nimport javax.inject.Provider;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link K8sInfraNamespaceWsAttributeValidator}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class K8sInfraNamespaceWsAttributeValidatorTest {\n\n  @Mock private KubernetesNamespaceFactory namespaceFactory;\n  @Mock private Provider<KubernetesNamespaceFactory> namespaceFactoryProvider;\n\n  @InjectMocks private K8sInfraNamespaceWsAttributeValidator validator;\n\n  @BeforeMethod\n  public void setUp() {\n    lenient().when(namespaceFactoryProvider.get()).thenReturn(namespaceFactory);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"The specified namespace [a]{64} is invalid: must be no more than 63 characters\")\n  public void testWhenNamespaceNameContainsMoreThan63Characters() throws ValidationException {\n    StringBuilder sb = new StringBuilder();\n    for (int i = 0; i < 64; i++) {\n      sb.append('a');\n    }\n\n    validator.validate(\n        ImmutableMap.of(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, sb.toString()));\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"The specified namespace .* is invalid: a DNS\\\\-1123 label must consist \"\n              + \"of lower case alphanumeric characters or '\\\\-', and must start and end with an \"\n              + \"alphanumeric character \\\\(e\\\\.g\\\\. .*\",\n      dataProvider = \"invalidNamespaces\")\n  public void testWhenNamespaceNameHasNoValidFormat(String name) throws ValidationException {\n    validator.validate(ImmutableMap.of(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, name));\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"The specified namespace name is not valid\")\n  public void testWhenNamespaceFactoryThrowsErrorOnCheckingIfNamespaceIsAllowed()\n      throws ValidationException {\n    doThrow(new ValidationException(\"The specified namespace name is not valid\"))\n        .when(namespaceFactory)\n        .checkIfNamespaceIsAllowed(anyString());\n\n    validator.validate(ImmutableMap.of(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"any\"));\n  }\n\n  @Test\n  public void shouldDoNothingWhenNamespaceAttributeIsMissing() throws ValidationException {\n    validator.validate(emptyMap());\n\n    verifyNoMoreInteractions(namespaceFactory);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"The namespace from the provided object \\\"new\\\" does not match the actual namespace \\\"actual\\\"\")\n  public void shouldDoNotAllowToChangeNamespaceAttribute() throws ValidationException {\n    validator.validateUpdate(\n        ImmutableMap.of(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"actual\"),\n        ImmutableMap.of(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"new\"));\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"The namespace information must not be updated or deleted. You must provide \\\"infrastructureNamespace\\\" attribute with \\\"che-workspaces\\\" as a value\")\n  public void shouldDoNotAllowToRemoveNamespaceAttribute() throws ValidationException {\n    validator.validateUpdate(\n        ImmutableMap.of(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"che-workspaces\"),\n        emptyMap());\n  }\n\n  @Test\n  public void shouldValidateFullyIfExistingIsEmpty() throws ValidationException {\n    validator.validateUpdate(\n        emptyMap(),\n        ImmutableMap.of(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"che-workspaces\"));\n\n    verify(namespaceFactory).checkIfNamespaceIsAllowed(eq(\"che-workspaces\"));\n  }\n\n  @Test\n  public void shouldNotValidateFullyIfExistingIsNotEmpty() throws ValidationException {\n    validator.validateUpdate(\n        ImmutableMap.of(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"che-workspaces\"),\n        ImmutableMap.of(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"che-workspaces\"));\n\n    verify(namespaceFactory, never()).checkIfNamespaceIsAllowed(any());\n  }\n\n  @DataProvider\n  public Object[][] invalidNamespaces() {\n    return new String[][] {{\"name!space\"}, {\"name@space\"}, {\"-namespace\"}, {\"namespace-\"}};\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/KubernetesArtifactsBrokerApplierTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Names.createMachineNameAnnotations;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyBoolean;\nimport static org.mockito.Mockito.doReturn;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.PluginFQN;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.KubernetesArtifactsBrokerApplier;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.BrokerEnvironmentFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link KubernetesArtifactsBrokerApplier}.\n *\n * @author Angel Misevski\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesArtifactsBrokerApplierTest {\n\n  private static final String WORKSPACE_POD_NAME = \"workspacePod\";\n  private static final String WORKSPACE_MACHINE_NAME = \"workspaceMachine\";\n  private static final String WORKSPACE_CONTAINER_NAME = \"workspaceContainer\";\n  private static final Map<String, String> workspacePodAnnotations =\n      createMachineNameAnnotations(WORKSPACE_CONTAINER_NAME, WORKSPACE_MACHINE_NAME);\n\n  private static final String BROKER_POD_NAME = \"brokerPod\";\n  private static final String BROKER_MACHINE_NAME = \"brokerMachine\";\n  private static final String BROKER_CONTAINER_NAME = \"brokerContainer\";\n  private static final String BROKER_CONFIGMAP_NAME = \"brokerConfigMap\";\n  private static final Map<String, String> brokerPodAnnotations =\n      createMachineNameAnnotations(BROKER_CONTAINER_NAME, BROKER_MACHINE_NAME);\n\n  private static final Map<String, String> brokerConfigMapData =\n      ImmutableMap.of(\"brokerConfigKey\", \"brokerConfigValue\");\n\n  @Mock private BrokerEnvironmentFactory<KubernetesEnvironment> brokerEnvironmentFactory;\n  @Mock private RuntimeIdentity runtimeID;\n  @Mock private Collection<PluginFQN> pluginFQNs;\n\n  // Broker Environment mocks\n  @Mock private InternalMachineConfig brokerMachine;\n  private Volume brokerVolume;\n  private ConfigMap brokerConfigMap;\n  private Container brokerContainer;\n\n  // Workspace Environment mocks\n  private KubernetesEnvironment workspaceEnvironment;\n  private Pod workspacePod;\n\n  private KubernetesArtifactsBrokerApplier<KubernetesEnvironment> applier;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    // Workspace env setup\n    ObjectMeta workspacePodMeta =\n        new ObjectMetaBuilder().withAnnotations(workspacePodAnnotations).build();\n    workspacePod = new PodBuilder().withMetadata(workspacePodMeta).withSpec(new PodSpec()).build();\n    Map<String, ConfigMap> workspaceConfigMaps = new HashMap<>();\n    workspaceEnvironment =\n        KubernetesEnvironment.builder()\n            .setPods(ImmutableMap.of(WORKSPACE_POD_NAME, workspacePod))\n            .setMachines(new HashMap<>())\n            .setConfigMaps(workspaceConfigMaps)\n            .build();\n\n    // Broker env setup\n    ObjectMeta brokerPodMeta =\n        new ObjectMetaBuilder().withAnnotations(brokerPodAnnotations).build();\n    brokerContainer = new ContainerBuilder().withName(BROKER_CONTAINER_NAME).build();\n    brokerVolume = new VolumeBuilder().build();\n    Pod brokerPod =\n        new PodBuilder()\n            .withMetadata(brokerPodMeta)\n            .withNewSpec()\n            .withContainers(brokerContainer)\n            .withVolumes(brokerVolume)\n            .endSpec()\n            .build();\n    brokerConfigMap = new ConfigMapBuilder().addToData(brokerConfigMapData).build();\n    KubernetesEnvironment brokerEnvironment =\n        KubernetesEnvironment.builder()\n            .setPods(ImmutableMap.of(BROKER_POD_NAME, brokerPod))\n            .setConfigMaps(ImmutableMap.of(BROKER_CONFIGMAP_NAME, brokerConfigMap))\n            .setMachines(ImmutableMap.of(BROKER_MACHINE_NAME, brokerMachine))\n            .build();\n    doReturn(brokerEnvironment)\n        .when(brokerEnvironmentFactory)\n        .createForArtifactsBroker(any(), any(), anyBoolean());\n\n    applier = new KubernetesArtifactsBrokerApplier<>(brokerEnvironmentFactory);\n  }\n\n  @Test\n  public void shouldAddBrokerMachineToWorkspaceEnvironment() throws Exception {\n    applier.apply(workspaceEnvironment, runtimeID, pluginFQNs, false);\n\n    assertNotNull(workspaceEnvironment.getMachines());\n    assertTrue(workspaceEnvironment.getMachines().values().contains(brokerMachine));\n  }\n\n  @Test\n  public void shouldAddBrokerConfigMapsToWorkspaceEnvironment() throws Exception {\n    applier.apply(workspaceEnvironment, runtimeID, pluginFQNs, false);\n\n    ConfigMap workspaceConfigMap = workspaceEnvironment.getConfigMaps().get(BROKER_CONFIGMAP_NAME);\n    assertNotNull(workspaceConfigMap);\n    assertFalse(workspaceConfigMap.getData().isEmpty());\n    assertTrue(\n        workspaceConfigMap.getData().entrySet().stream()\n            .allMatch(e -> brokerConfigMap.getData().get(e.getKey()).equals(e.getValue())));\n  }\n\n  @Test\n  public void shouldAddBrokerAsInitContainerOnWorkspacePod() throws Exception {\n    applier.apply(workspaceEnvironment, runtimeID, pluginFQNs, false);\n\n    List<Container> initContainers = workspacePod.getSpec().getInitContainers();\n    assertEquals(initContainers.size(), 1);\n    assertEquals(initContainers.iterator().next(), brokerContainer);\n  }\n\n  @Test\n  public void shouldAddBrokerVolumesToWorkspacePod() throws Exception {\n    applier.apply(workspaceEnvironment, runtimeID, pluginFQNs, false);\n\n    List<Volume> workspaceVolumes = workspacePod.getSpec().getVolumes();\n    assertEquals(workspaceVolumes.size(), 1);\n    assertEquals(workspaceVolumes.iterator().next(), brokerVolume);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/KubernetesEnvironmentProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.inOrder;\nimport static org.mockito.Mockito.when;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesEnvironmentProvisioner.KubernetesEnvironmentProvisionerImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.CertificateProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.GatewayRouterProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.GitConfigProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ImagePullSecretProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.PodTerminationGracePeriodProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.SecurityContextProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ServiceAccountProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.SshKeysProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisionerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.UniqueNamesProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.VcsSslCertificateProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.env.EnvVarsConverter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.limits.ram.ContainerResourceProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.restartpolicy.RestartPolicyRewriter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.server.ServersConverter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.PreviewUrlExposer;\nimport org.mockito.InOrder;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link KubernetesEnvironmentProvisioner}.\n *\n * @author Anton Korneta\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesEnvironmentProvisionerTest {\n\n  @Mock private UniqueNamesProvisioner<KubernetesEnvironment> uniqueNamesProvisioner;\n  @Mock private KubernetesEnvironment k8sEnv;\n  @Mock private RuntimeIdentity runtimeIdentity;\n  @Mock private EnvVarsConverter envVarsProvisioner;\n  @Mock private ServersConverter<KubernetesEnvironment> serversProvisioner;\n  @Mock private RestartPolicyRewriter restartPolicyRewriter;\n  @Mock private ContainerResourceProvisioner ramLimitProvisioner;\n  @Mock private SecurityContextProvisioner securityContextProvisioner;\n  @Mock private PodTerminationGracePeriodProvisioner podTerminationGracePeriodProvisioner;\n\n  @Mock\n  private TlsProvisionerProvider<KubernetesEnvironment> externalServerIngressTlsProvisionerProvider;\n\n  @Mock private TlsProvisioner<KubernetesEnvironment> externalServerIngressTlsProvisioner;\n  @Mock private ImagePullSecretProvisioner imagePullSecretProvisioner;\n  @Mock private ServiceAccountProvisioner serviceAccountProvisioner;\n  @Mock private CertificateProvisioner certificateProvisioner;\n  @Mock private SshKeysProvisioner sshKeysProvisioner;\n  @Mock private GitConfigProvisioner gitConfigProvisioner;\n  @Mock private PreviewUrlExposer previewUrlExposer;\n  @Mock private VcsSslCertificateProvisioner vcsSslCertificateProvisioner;\n  @Mock private GatewayRouterProvisioner gatewayRouterProvisioner;\n\n  private KubernetesEnvironmentProvisioner<KubernetesEnvironment> k8sInfraProvisioner;\n\n  private InOrder provisionOrder;\n\n  @BeforeMethod\n  public void setUp() {\n    when(externalServerIngressTlsProvisionerProvider.get())\n        .thenReturn(externalServerIngressTlsProvisioner);\n    k8sInfraProvisioner =\n        new KubernetesEnvironmentProvisionerImpl(\n            uniqueNamesProvisioner,\n            serversProvisioner,\n            envVarsProvisioner,\n            restartPolicyRewriter,\n            ramLimitProvisioner,\n            securityContextProvisioner,\n            podTerminationGracePeriodProvisioner,\n            externalServerIngressTlsProvisionerProvider,\n            imagePullSecretProvisioner,\n            serviceAccountProvisioner,\n            certificateProvisioner,\n            sshKeysProvisioner,\n            gitConfigProvisioner,\n            previewUrlExposer,\n            vcsSslCertificateProvisioner,\n            gatewayRouterProvisioner);\n    provisionOrder =\n        inOrder(\n            uniqueNamesProvisioner,\n            serversProvisioner,\n            envVarsProvisioner,\n            restartPolicyRewriter,\n            ramLimitProvisioner,\n            securityContextProvisioner,\n            podTerminationGracePeriodProvisioner,\n            externalServerIngressTlsProvisioner,\n            imagePullSecretProvisioner,\n            serviceAccountProvisioner,\n            certificateProvisioner,\n            gitConfigProvisioner,\n            previewUrlExposer,\n            gatewayRouterProvisioner);\n  }\n\n  @Test\n  public void performsOrderedProvisioning() throws Exception {\n    k8sInfraProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    provisionOrder.verify(serversProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));\n    provisionOrder.verify(envVarsProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));\n    provisionOrder.verify(restartPolicyRewriter).provision(eq(k8sEnv), eq(runtimeIdentity));\n\n    provisionOrder.verify(ramLimitProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));\n    provisionOrder\n        .verify(externalServerIngressTlsProvisioner)\n        .provision(eq(k8sEnv), eq(runtimeIdentity));\n    provisionOrder.verify(securityContextProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));\n    provisionOrder\n        .verify(podTerminationGracePeriodProvisioner)\n        .provision(eq(k8sEnv), eq(runtimeIdentity));\n    provisionOrder.verify(imagePullSecretProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));\n    provisionOrder.verify(serviceAccountProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));\n    provisionOrder.verify(certificateProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));\n    provisionOrder.verify(gitConfigProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));\n    provisionOrder.verify(gatewayRouterProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));\n    provisionOrder.verify(uniqueNamesProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));\n    provisionOrder.verifyNoMoreInteractions();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/StartSynchronizerTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNull;\nimport static org.testng.Assert.assertTrue;\nimport static org.testng.Assert.fail;\n\nimport java.lang.reflect.Field;\nimport java.util.Collections;\nimport java.util.Set;\nimport java.util.concurrent.CompletionException;\nimport java.util.concurrent.ConcurrentMap;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.core.notification.EventSubscriber;\nimport org.eclipse.che.api.workspace.server.model.impl.RuntimeIdentityImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.RuntimeStartInterruptedException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.event.KubernetesRuntimeStoppedEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.event.KubernetesRuntimeStoppingEvent;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link StartSynchronizer}\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class StartSynchronizerTest {\n  @Mock private EventService eventService;\n  private RuntimeIdentityImpl runtimeId;\n\n  private StartSynchronizer startSynchronizer;\n\n  @BeforeMethod\n  public void setUp() {\n    runtimeId = new RuntimeIdentityImpl(\"workspace123\", \"envName\", \"ownerId\", \"infraNamespace\");\n    startSynchronizer = new StartSynchronizer(eventService, runtimeId);\n  }\n\n  @Test\n  public void testSuccessfulStartCompletion() throws Exception {\n    // given\n    startSynchronizer.setStartThread();\n\n    // when\n    startSynchronizer.complete();\n\n    // then\n    assertTrue(startSynchronizer.isCompleted());\n    assertTrue(startSynchronizer.getStartFailure().isDone());\n    assertFalse(startSynchronizer.getStartFailure().isCompletedExceptionally());\n  }\n\n  @Test\n  public void testFailureStartCompletion() throws Exception {\n    // given\n    startSynchronizer.setStartThread();\n    RuntimeStartInterruptedException expected = new RuntimeStartInterruptedException(runtimeId);\n\n    // when\n    startSynchronizer.completeExceptionally(expected);\n\n    // then\n    assertTrue(startSynchronizer.isCompleted());\n    assertTrue(startSynchronizer.getStartFailure().isCompletedExceptionally());\n    try {\n      startSynchronizer.getStartFailure().getNow(null);\n      fail(\"Start failure is empty\");\n    } catch (CompletionException actual) {\n      assertEquals(actual.getCause(), expected);\n    }\n  }\n\n  @Test(expectedExceptions = RuntimeStartInterruptedException.class)\n  public void shouldThrowExceptionOnCheckingFailureIfStartIsCompletedExceptionally()\n      throws Exception {\n    // given\n    startSynchronizer.start();\n    RuntimeStartInterruptedException expected = new RuntimeStartInterruptedException(runtimeId);\n    startSynchronizer.completeExceptionally(expected);\n\n    // when\n    startSynchronizer.checkFailure();\n  }\n\n  @Test\n  public void shouldNotThrowExceptionOnCheckingFailureIfStartIsNotCompleted() throws Exception {\n    // given\n    startSynchronizer.start();\n\n    // when\n    startSynchronizer.checkFailure();\n  }\n\n  @Test\n  public void shouldNotThrowExceptionOnCheckingFailureIfStartIsCompleted() throws Exception {\n    // given\n    startSynchronizer.start();\n    startSynchronizer.complete();\n\n    // when\n    startSynchronizer.checkFailure();\n  }\n\n  @Test\n  public void shouldInterruptStartThread() throws Exception {\n    // given\n    startSynchronizer.start();\n    startSynchronizer.setStartThread();\n\n    // when\n    startSynchronizer.interrupt();\n\n    // then\n    assertTrue(Thread.interrupted());\n  }\n\n  @Test(\n      expectedExceptions = InternalInfrastructureException.class,\n      expectedExceptionsMessageRegExp = \"Runtime is already started\")\n  public void shouldNotSetStartThreadIfItIsAlreadySet() throws Exception {\n    // given\n    startSynchronizer.setStartThread();\n\n    // when\n    startSynchronizer.setStartThread();\n  }\n\n  @Test\n  public void shouldNotInterruptThreadIfItWasNotSet() {\n    // given\n    startSynchronizer.start();\n\n    // when\n    startSynchronizer.interrupt();\n\n    // then\n    assertFalse(Thread.interrupted());\n  }\n\n  @Test\n  public void shouldSubscribeOnRuntimeStoppingAndStoppedEventsWhenStartIsCalled() {\n    // when\n    startSynchronizer.start();\n\n    // then\n    verify(eventService).subscribe(any(), eq(KubernetesRuntimeStoppingEvent.class));\n    verify(eventService).subscribe(any(), eq(KubernetesRuntimeStoppedEvent.class));\n  }\n\n  @Test(expectedExceptions = RuntimeStartInterruptedException.class)\n  public void shouldInterruptStartWhenStoppingEventIsPublished() throws Exception {\n    // given\n    EventService eventService = new EventService();\n    StartSynchronizer localStartSynchronizer = new StartSynchronizer(eventService, runtimeId);\n    localStartSynchronizer.start();\n\n    // when\n    eventService.publish(new KubernetesRuntimeStoppingEvent(\"workspace123\"));\n\n    // then\n    localStartSynchronizer.checkFailure();\n  }\n\n  @Test\n  public void shouldCompleteStartWhenStoppedEventIsPublished() {\n    // given\n    EventService eventService = new EventService();\n    StartSynchronizer localStartSynchronizer = new StartSynchronizer(eventService, runtimeId);\n    localStartSynchronizer.start();\n\n    // when\n    eventService.publish(new KubernetesRuntimeStoppedEvent(\"workspace123\"));\n\n    // then\n    assertTrue(localStartSynchronizer.isCompleted());\n  }\n\n  @Test(expectedExceptions = RuntimeStartInterruptedException.class)\n  public void shouldRethrowOriginalExceptionIfStartCompletedExceptionallyOnCompletion()\n      throws Exception {\n    // given\n    startSynchronizer.completeExceptionally(new RuntimeStartInterruptedException(runtimeId));\n\n    // when\n    startSynchronizer.complete();\n  }\n\n  @Test\n  public void shouldUnsubscribeEventsWhenItIsCompleted() throws Exception {\n    // given\n    runtimeId = new RuntimeIdentityImpl(\"workspace123\", \"envName\", \"ownerId\", \"infraNamespace\");\n    EventService eventService = new EventService();\n    startSynchronizer = new StartSynchronizer(eventService, runtimeId);\n    startSynchronizer.start();\n\n    // when\n    startSynchronizer.complete();\n\n    // then\n    assertSubscribersNumber(eventService, KubernetesRuntimeStoppingEvent.class, 0);\n    assertSubscribersNumber(eventService, KubernetesRuntimeStoppedEvent.class, 0);\n  }\n\n  @Test\n  public void shouldUnsubscribeEventsWhenItIscCompleteExceptionally() throws Exception {\n    // given\n    runtimeId = new RuntimeIdentityImpl(\"workspace123\", \"envName\", \"ownerId\", \"infraNamespace\");\n    EventService eventService = new EventService();\n    startSynchronizer = new StartSynchronizer(eventService, runtimeId);\n    startSynchronizer.start();\n\n    // when\n    startSynchronizer.completeExceptionally(new Exception());\n\n    // then\n    assertSubscribersNumber(eventService, KubernetesRuntimeStoppingEvent.class, 0);\n    assertSubscribersNumber(eventService, KubernetesRuntimeStoppedEvent.class, 0);\n  }\n\n  @Test\n  public void shouldNotHaveAnyEventSubscribersBeforeStart() throws Exception {\n    // given\n    runtimeId = new RuntimeIdentityImpl(\"workspace123\", \"envName\", \"ownerId\", \"infraNamespace\");\n    EventService eventService = new EventService();\n\n    // when\n    startSynchronizer = new StartSynchronizer(eventService, runtimeId);\n\n    // then\n    assertSubscriberTypesNumber(eventService, 0);\n  }\n\n  @Test\n  public void shouldAddSubscribersAfterStart() throws Exception {\n    // given\n    runtimeId = new RuntimeIdentityImpl(\"workspace123\", \"envName\", \"ownerId\", \"infraNamespace\");\n    EventService eventService = new EventService();\n    startSynchronizer = new StartSynchronizer(eventService, runtimeId);\n\n    // when\n    startSynchronizer.start();\n\n    // then\n    assertSubscriberTypesNumber(eventService, 2);\n    assertSubscribersNumber(eventService, KubernetesRuntimeStoppingEvent.class, 1);\n    assertSubscribersNumber(eventService, KubernetesRuntimeStoppedEvent.class, 1);\n  }\n\n  @Test\n  public void shouldAwaitTerminationWhenItIsCompleted() throws Exception {\n    // given\n    startSynchronizer.complete();\n\n    // when\n    boolean isInterrupted = startSynchronizer.awaitInterruption(1, TimeUnit.SECONDS);\n\n    // then\n    assertFalse(isInterrupted);\n  }\n\n  @Test\n  public void shouldAwaitTerminationWhenItIsCompletedExceptionally() throws Exception {\n    // given\n    startSynchronizer.completeExceptionally(new RuntimeStartInterruptedException(runtimeId));\n\n    // when\n    boolean isInterrupted = startSynchronizer.awaitInterruption(1, TimeUnit.SECONDS);\n\n    // then\n    assertTrue(isInterrupted);\n  }\n\n  @Test\n  public void shouldReturnFalseOnAwaitingTerminationWhenItIsNotCompletedInTime() throws Exception {\n    // given\n    startSynchronizer.start();\n\n    // when\n    boolean isInterrupted = startSynchronizer.awaitInterruption(10, TimeUnit.MILLISECONDS);\n\n    // then\n    assertFalse(isInterrupted);\n  }\n\n  @Test\n  public void shouldNotInterruptStartIfItIsNotStarted() {\n    // when\n    boolean isInterrupted = startSynchronizer.interrupt();\n\n    // then\n    assertFalse(isInterrupted);\n  }\n\n  @Test\n  public void shouldWrapExceptionIntoInternalExcWhenItIsCompletedWithNonInfraException() {\n    // given\n    RuntimeException toThrow = new RuntimeException(\"test exception\");\n    startSynchronizer.completeExceptionally(toThrow);\n\n    // when\n    InfrastructureException startFailure = startSynchronizer.getStartFailureNow();\n\n    // then\n    assertTrue(startFailure instanceof InternalInfrastructureException);\n    assertEquals(startFailure.getCause(), toThrow);\n  }\n\n  @Test\n  public void shouldReturnStartFailureWhenItIsCompletedExceptionally() {\n    // given\n    InfrastructureException toThrow = new RuntimeStartInterruptedException(runtimeId);\n    startSynchronizer.completeExceptionally(toThrow);\n\n    // when\n    InfrastructureException startFailure = startSynchronizer.getStartFailureNow();\n\n    // then\n    assertTrue(startFailure instanceof RuntimeStartInterruptedException);\n    assertEquals(startFailure, toThrow);\n  }\n\n  @Test\n  public void shouldReturnNullOnGettingStartFailureWhenItIsNotCompletedExceptionally()\n      throws Exception {\n    // given\n    startSynchronizer.complete();\n\n    // when\n    InfrastructureException startFailure = startSynchronizer.getStartFailureNow();\n\n    // then\n    assertNull(startFailure);\n  }\n\n  @Test\n  public void shouldReturnStartFailureWhenItIsNotCompletedYet() {\n    // when\n    InfrastructureException startFailure = startSynchronizer.getStartFailureNow();\n\n    // then\n    assertNull(startFailure);\n  }\n\n  private static void assertSubscribersNumber(\n      EventService service, Class<?> eventType, int expectNumberOfSubscribers) throws Exception {\n    Field privateStringField = EventService.class.getDeclaredField(\"subscribersByEventType\");\n\n    privateStringField.setAccessible(true);\n\n    ConcurrentMap<Class<?>, Set<EventSubscriber>> subscribersByEventType =\n        (ConcurrentMap<Class<?>, Set<EventSubscriber>>) privateStringField.get(service);\n    Set<EventSubscriber> subscribers =\n        subscribersByEventType.getOrDefault(eventType, Collections.emptySet());\n    assertEquals(subscribers.size(), expectNumberOfSubscribers);\n  }\n\n  private static void assertSubscriberTypesNumber(\n      EventService service, int expectNumberOfSubscribers) throws Exception {\n    Field privateStringField = EventService.class.getDeclaredField(\"subscribersByEventType\");\n\n    privateStringField.setAccessible(true);\n\n    ConcurrentMap<Class<?>, Set<EventSubscriber>> subscribersByEventType =\n        (ConcurrentMap<Class<?>, Set<EventSubscriber>>) privateStringField.get(service);\n    assertEquals(subscribersByEventType.size(), expectNumberOfSubscribers);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/api/server/KubernetesNamespaceServiceTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.api.server;\n\nimport static io.restassured.RestAssured.given;\nimport static java.util.Collections.singletonList;\nimport static org.everrest.assured.JettyHttpServer.ADMIN_USER_NAME;\nimport static org.everrest.assured.JettyHttpServer.ADMIN_USER_PASSWORD;\nimport static org.everrest.assured.JettyHttpServer.SECURE_PATH;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.restassured.response.Response;\nimport java.util.Collections;\nimport java.util.List;\nimport org.eclipse.che.api.core.rest.ApiExceptionMapper;\nimport org.eclipse.che.api.core.rest.CheJsonProvider;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.server.impls.KubernetesNamespaceMetaImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto.KubernetesNamespaceMetaDto;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.NamespaceProvisioner;\nimport org.everrest.assured.EverrestJetty;\nimport org.everrest.core.Filter;\nimport org.everrest.core.GenericContainerRequest;\nimport org.everrest.core.RequestFilter;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.Assert;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@link KubernetesNamespaceService}\n *\n * @author Sergii Leshchenko\n */\n@Listeners(value = {EverrestJetty.class, MockitoTestNGListener.class})\npublic class KubernetesNamespaceServiceTest {\n\n  @SuppressWarnings(\"unused\")\n  private static final ApiExceptionMapper MAPPER = new ApiExceptionMapper();\n\n  @SuppressWarnings(\"unused\")\n  private static final EnvironmentFilter FILTER = new EnvironmentFilter();\n\n  private static final Subject SUBJECT =\n      new SubjectImpl(\"john\", Collections.emptyList(), \"id-123\", \"token\", false);\n\n  @SuppressWarnings(\"unused\") // is declared for deploying by everrest-assured\n  private CheJsonProvider jsonProvider = new CheJsonProvider(Collections.emptySet());\n\n  @Mock private KubernetesNamespaceFactory namespaceFactory;\n  @Mock private NamespaceProvisioner namespaceProvisioner;\n\n  @InjectMocks private KubernetesNamespaceService service;\n\n  @Test\n  public void shouldReturnNamespaces() throws Exception {\n    KubernetesNamespaceMetaImpl namespaceMeta =\n        new KubernetesNamespaceMetaImpl(\n            \"ws-namespace\", ImmutableMap.of(\"phase\", \"active\", \"default\", \"true\"));\n    when(namespaceFactory.list()).thenReturn(singletonList(namespaceMeta));\n\n    final Response response =\n        given()\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .when()\n            .get(SECURE_PATH + \"/kubernetes/namespace\");\n\n    assertEquals(response.getStatusCode(), 200);\n    List<KubernetesNamespaceMetaDto> namespaces =\n        unwrapDtoList(response, KubernetesNamespaceMetaDto.class);\n    assertEquals(namespaces.size(), 1);\n    assertEquals(new KubernetesNamespaceMetaImpl(namespaces.get(0)), namespaceMeta);\n    verify(namespaceFactory).list();\n  }\n\n  @Test\n  public void shouldProvisionNamespace() throws Exception {\n    // given\n    KubernetesNamespaceMetaImpl namespaceMeta =\n        new KubernetesNamespaceMetaImpl(\n            \"ws-namespace\", ImmutableMap.of(\"phase\", \"active\", \"default\", \"true\"));\n    when(namespaceProvisioner.provision(any(NamespaceResolutionContext.class)))\n        .thenReturn(namespaceMeta);\n    // when\n    final Response response =\n        given()\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .when()\n            .post(SECURE_PATH + \"/kubernetes/namespace/provision\");\n    // then\n\n    assertEquals(response.getStatusCode(), 200);\n    KubernetesNamespaceMetaDto actual = unwrapDto(response, KubernetesNamespaceMetaDto.class);\n    assertEquals(actual.getName(), namespaceMeta.getName());\n    assertEquals(actual.getAttributes(), namespaceMeta.getAttributes());\n    verify(namespaceProvisioner).provision(any(NamespaceResolutionContext.class));\n  }\n\n  @Test\n  public void shouldProvisionNamespaceWithCorrectContext() throws Exception {\n    // given\n    KubernetesNamespaceMetaImpl namespaceMeta =\n        new KubernetesNamespaceMetaImpl(\n            \"ws-namespace\", ImmutableMap.of(\"phase\", \"active\", \"default\", \"true\"));\n    when(namespaceProvisioner.provision(any(NamespaceResolutionContext.class)))\n        .thenReturn(namespaceMeta);\n    // when\n    final Response response =\n        given()\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .when()\n            .post(SECURE_PATH + \"/kubernetes/namespace/provision\");\n    // then\n\n    assertEquals(response.getStatusCode(), 200);\n    ArgumentCaptor<NamespaceResolutionContext> captor =\n        ArgumentCaptor.forClass(NamespaceResolutionContext.class);\n    verify(namespaceProvisioner).provision(captor.capture());\n    NamespaceResolutionContext actualContext = captor.getValue();\n    assertEquals(actualContext.getUserId(), SUBJECT.getUserId());\n    assertEquals(actualContext.getUserName(), SUBJECT.getUserName());\n    Assert.assertNull(actualContext.getWorkspaceId());\n  }\n\n  private static <T> List<T> unwrapDtoList(Response response, Class<T> dtoClass) {\n    return DtoFactory.getInstance().createListDtoFromJson(response.body().print(), dtoClass);\n  }\n\n  private static <T> T unwrapDto(Response response, Class<T> dtoClass) {\n    return DtoFactory.getInstance().createDtoFromJson(response.body().print(), dtoClass);\n  }\n\n  @Filter\n  public static class EnvironmentFilter implements RequestFilter {\n    public void doFilter(GenericContainerRequest request) {\n      EnvironmentContext.getCurrent().setSubject(SUBJECT);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/authorization/KubernetesAuthorizationCheckerTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.authorization;\n\nimport java.util.Arrays;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.Assert;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesAuthorizationCheckerTest {\n\n  @Mock private CheServerKubernetesClientFactory clientFactory;\n  private static Subject user1 =\n      new SubjectImpl(\"user1\", Arrays.asList(\"group1\"), \"id\", \"token\", false);\n\n  @Test(dataProvider = \"advancedAuthorizationData\")\n  public void advancedAuthorization(\n      Subject subject,\n      String allowedUsers,\n      String allowedGroups,\n      String deniedUsers,\n      String deniedGroups,\n      boolean expectedIsAuthorized)\n      throws InfrastructureException {\n    // give\n    KubernetesOIDCAuthorizationCheckerImpl authorizationChecker =\n        new KubernetesOIDCAuthorizationCheckerImpl(\n            allowedUsers, allowedGroups, deniedUsers, deniedGroups, \",\");\n\n    // when\n    boolean isAuthorized = authorizationChecker.isAuthorized(subject);\n\n    // then\n    Assert.assertEquals(isAuthorized, expectedIsAuthorized);\n  }\n\n  @DataProvider\n  public static Object[][] advancedAuthorizationData() {\n    return new Object[][] {\n      {user1, \"\", \"\", \"\", \"\", true},\n      {user1, \"\", \"\", \"\", \"group1\", false},\n      {user1, \"\", \"\", \"\", \"group2\", true},\n      {user1, \"\", \"\", \"user1\", \"\", false},\n      {user1, \"\", \"\", \"user1\", \"group1\", false},\n      {user1, \"\", \"\", \"user1\", \"group2\", false},\n      {user1, \"\", \"\", \"user2\", \"\", true},\n      {user1, \"\", \"\", \"user2\", \"group1\", false},\n      {user1, \"\", \"\", \"user2\", \"group2\", true},\n      {user1, \"\", \"group1\", \"\", \"\", true},\n      {user1, \"\", \"group1\", \"\", \"group1\", false},\n      {user1, \"\", \"group1\", \"\", \"group2\", true},\n      {user1, \"\", \"group1\", \"user1\", \"\", false},\n      {user1, \"\", \"group1\", \"user1\", \"group1\", false},\n      {user1, \"\", \"group1\", \"user1\", \"group2\", false},\n      {user1, \"\", \"group1\", \"user2\", \"\", true},\n      {user1, \"\", \"group1\", \"user2\", \"group1\", false},\n      {user1, \"\", \"group1\", \"user2\", \"group2\", true},\n      {user1, \"\", \"group2\", \"\", \"\", false},\n      {user1, \"\", \"group2\", \"\", \"group1\", false},\n      {user1, \"\", \"group2\", \"\", \"group2\", false},\n      {user1, \"\", \"group2\", \"user1\", \"\", false},\n      {user1, \"\", \"group2\", \"user1\", \"group1\", false},\n      {user1, \"\", \"group2\", \"user1\", \"group2\", false},\n      {user1, \"\", \"group2\", \"user2\", \"\", false},\n      {user1, \"\", \"group2\", \"user2\", \"group1\", false},\n      {user1, \"\", \"group2\", \"user2\", \"group2\", false},\n      {user1, \"user1\", \"\", \"\", \"\", true},\n      {user1, \"user1\", \"\", \"\", \"group1\", false},\n      {user1, \"user1\", \"\", \"\", \"group2\", true},\n      {user1, \"user1\", \"\", \"user1\", \"\", false},\n      {user1, \"user1\", \"\", \"user1\", \"group1\", false},\n      {user1, \"user1\", \"\", \"user1\", \"group2\", false},\n      {user1, \"user1\", \"\", \"user2\", \"\", true},\n      {user1, \"user1\", \"\", \"user2\", \"group1\", false},\n      {user1, \"user1\", \"\", \"user2\", \"group2\", true},\n      {user1, \"user1\", \"group1\", \"\", \"\", true},\n      {user1, \"user1\", \"group1\", \"\", \"group1\", false},\n      {user1, \"user1\", \"group1\", \"\", \"group2\", true},\n      {user1, \"user1\", \"group1\", \"user1\", \"\", false},\n      {user1, \"user1\", \"group1\", \"user1\", \"group1\", false},\n      {user1, \"user1\", \"group1\", \"user1\", \"group2\", false},\n      {user1, \"user1\", \"group1\", \"user2\", \"\", true},\n      {user1, \"user1\", \"group1\", \"user2\", \"group1\", false},\n      {user1, \"user1\", \"group1\", \"user2\", \"group2\", true},\n      {user1, \"user1\", \"group2\", \"\", \"\", true},\n      {user1, \"user1\", \"group2\", \"\", \"group1\", false},\n      {user1, \"user1\", \"group2\", \"\", \"group2\", true},\n      {user1, \"user1\", \"group2\", \"user1\", \"\", false},\n      {user1, \"user1\", \"group2\", \"user1\", \"group1\", false},\n      {user1, \"user1\", \"group2\", \"user1\", \"group2\", false},\n      {user1, \"user1\", \"group2\", \"user2\", \"\", true},\n      {user1, \"user1\", \"group2\", \"user2\", \"group1\", false},\n      {user1, \"user1\", \"group2\", \"user2\", \"group2\", true},\n      {user1, \"user2\", \"\", \"\", \"\", false},\n      {user1, \"user2\", \"\", \"\", \"group1\", false},\n      {user1, \"user2\", \"\", \"\", \"group2\", false},\n      {user1, \"user2\", \"\", \"user1\", \"\", false},\n      {user1, \"user2\", \"\", \"user1\", \"group1\", false},\n      {user1, \"user2\", \"\", \"user1\", \"group2\", false},\n      {user1, \"user2\", \"\", \"user2\", \"\", false},\n      {user1, \"user2\", \"\", \"user2\", \"group1\", false},\n      {user1, \"user2\", \"\", \"user2\", \"group2\", false},\n      {user1, \"user2\", \"group1\", \"\", \"\", true},\n      {user1, \"user2\", \"group1\", \"\", \"group1\", false},\n      {user1, \"user2\", \"group1\", \"\", \"group2\", true},\n      {user1, \"user2\", \"group1\", \"user1\", \"\", false},\n      {user1, \"user2\", \"group1\", \"user1\", \"group1\", false},\n      {user1, \"user2\", \"group1\", \"user1\", \"group2\", false},\n      {user1, \"user2\", \"group1\", \"user2\", \"\", true},\n      {user1, \"user2\", \"group1\", \"user2\", \"group1\", false},\n      {user1, \"user2\", \"group1\", \"user2\", \"group2\", true},\n      {user1, \"user2\", \"group2\", \"\", \"\", false},\n      {user1, \"user2\", \"group2\", \"\", \"group1\", false},\n      {user1, \"user2\", \"group2\", \"\", \"group2\", false},\n      {user1, \"user2\", \"group2\", \"user1\", \"\", false},\n      {user1, \"user2\", \"group2\", \"user1\", \"group1\", false},\n      {user1, \"user2\", \"group2\", \"user1\", \"group2\", false},\n      {user1, \"user2\", \"group2\", \"user2\", \"\", false},\n      {user1, \"user2\", \"group2\", \"user2\", \"group1\", false},\n      {user1, \"user2\", \"group2\", \"user2\", \"group2\", false},\n    };\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/ContainerSearchTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.devfile;\n\nimport static java.lang.String.format;\nimport static java.util.Arrays.asList;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.PodTemplate;\nimport io.fabric8.kubernetes.api.model.PodTemplateBuilder;\nimport io.fabric8.kubernetes.api.model.ReplicationController;\nimport io.fabric8.kubernetes.api.model.ReplicationControllerBuilder;\nimport io.fabric8.kubernetes.api.model.apps.DaemonSet;\nimport io.fabric8.kubernetes.api.model.apps.DaemonSetBuilder;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;\nimport io.fabric8.kubernetes.api.model.apps.ReplicaSet;\nimport io.fabric8.kubernetes.api.model.apps.ReplicaSetBuilder;\nimport io.fabric8.kubernetes.api.model.apps.StatefulSet;\nimport io.fabric8.kubernetes.api.model.apps.StatefulSetBuilder;\nimport io.fabric8.kubernetes.api.model.batch.v1.CronJob;\nimport io.fabric8.kubernetes.api.model.batch.v1.CronJobBuilder;\nimport io.fabric8.kubernetes.api.model.batch.v1.Job;\nimport io.fabric8.kubernetes.api.model.batch.v1.JobBuilder;\nimport io.fabric8.openshift.api.model.DeploymentConfig;\nimport io.fabric8.openshift.api.model.DeploymentConfigBuilder;\nimport io.fabric8.openshift.api.model.Template;\nimport io.fabric8.openshift.api.model.TemplateBuilder;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class ContainerSearchTest {\n\n  private List<HasMetadata> testList;\n\n  @BeforeMethod\n  public void setup() {\n    // These are all the object types that can be contained in a KubernetesList which can contain a\n    // container:\n    // Pod, PodTemplate, DaemonSet, Deployment, Job, ReplicaSet, ReplicationController, StatefulSet,\n    // CronJob, DeploymentConfig, Template\n\n    Container container1 = new ContainerBuilder().withName(\"container1\").build();\n    Container container2 = new ContainerBuilder().withName(\"container2\").build();\n    Container container3 = new ContainerBuilder().withName(\"container3\").build();\n    Container container4 = new ContainerBuilder().withName(\"container4\").build();\n    Container container5 = new ContainerBuilder().withName(\"container5\").build();\n    Container container6 = new ContainerBuilder().withName(\"container6\").build();\n    Container container7 = new ContainerBuilder().withName(\"container7\").build();\n    Container container8 = new ContainerBuilder().withName(\"container8\").build();\n    Container container9 = new ContainerBuilder().withName(\"container9\").build();\n    Container container10 = new ContainerBuilder().withName(\"container10\").build();\n    Container container11 = new ContainerBuilder().withName(\"container11\").build();\n    Container container12 = new ContainerBuilder().withName(\"container12\").build();\n\n    Pod podWithName =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"podWithName\")\n            .addToLabels(\"app\", \"che\")\n            .endMetadata()\n            .withNewSpec()\n            .withContainers(container1)\n            .endSpec()\n            .build();\n\n    Pod podWithGenerateName =\n        new PodBuilder()\n            .withNewMetadata()\n            .withGenerateName(\"podWithGenerateName\")\n            .endMetadata()\n            .withNewSpec()\n            .withContainers(container2)\n            .endSpec()\n            .build();\n\n    PodTemplate podTemplate =\n        new PodTemplateBuilder()\n            .withNewMetadata()\n            .withName(\"podTemplate\")\n            .addToLabels(\"app\", \"che\")\n            .endMetadata()\n            .withNewTemplate()\n            .withNewSpec()\n            .withContainers(container3)\n            .endSpec()\n            .endTemplate()\n            .build();\n\n    DaemonSet daemonSet =\n        new DaemonSetBuilder()\n            .withNewMetadata()\n            .withName(\"daemonSet\")\n            .endMetadata()\n            .withNewSpec()\n            .withNewTemplate()\n            .withNewSpec()\n            .withContainers(container4)\n            .endSpec()\n            .endTemplate()\n            .endSpec()\n            .build();\n\n    Deployment deployment =\n        new DeploymentBuilder()\n            .withNewMetadata()\n            .withName(\"deployment\")\n            .addToLabels(\"app\", \"che\")\n            .endMetadata()\n            .withNewSpec()\n            .withNewTemplate()\n            .withNewMetadata()\n            .withName(\"podWithName\")\n            .endMetadata()\n            .withNewSpec()\n            .withContainers(container5)\n            .endSpec()\n            .endTemplate()\n            .endSpec()\n            .build();\n\n    Job job =\n        new JobBuilder()\n            .withNewMetadata()\n            .withName(\"job\")\n            .endMetadata()\n            .withNewSpec()\n            .withNewTemplate()\n            .withNewSpec()\n            .withContainers(container6)\n            .endSpec()\n            .endTemplate()\n            .endSpec()\n            .build();\n\n    ReplicaSet replicaSet =\n        new ReplicaSetBuilder()\n            .withNewMetadata()\n            .withName(\"replicaSet\")\n            .addToLabels(\"app\", \"che\")\n            .endMetadata()\n            .withNewSpec()\n            .withNewTemplate()\n            .withNewSpec()\n            .withContainers(container7)\n            .endSpec()\n            .endTemplate()\n            .endSpec()\n            .build();\n\n    ReplicationController replicationController =\n        new ReplicationControllerBuilder()\n            .withNewMetadata()\n            .withName(\"replicationController\")\n            .endMetadata()\n            .withNewSpec()\n            .withNewTemplate()\n            .withNewSpec()\n            .withContainers(container8)\n            .endSpec()\n            .endTemplate()\n            .endSpec()\n            .build();\n\n    StatefulSet statefulSet =\n        new StatefulSetBuilder()\n            .withNewMetadata()\n            .withName(\"statefulSet\")\n            .addToLabels(\"app\", \"che\")\n            .endMetadata()\n            .withNewSpec()\n            .withNewTemplate()\n            .withNewSpec()\n            .withContainers(container9)\n            .endSpec()\n            .endTemplate()\n            .endSpec()\n            .build();\n\n    CronJob cronJob =\n        new CronJobBuilder()\n            .withNewMetadata()\n            .withName(\"cronJob\")\n            .endMetadata()\n            .withNewSpec()\n            .withNewJobTemplate()\n            .withNewSpec()\n            .withNewTemplate()\n            .withNewSpec()\n            .withContainers(container10)\n            .endSpec()\n            .endTemplate()\n            .endSpec()\n            .endJobTemplate()\n            .endSpec()\n            .build();\n\n    DeploymentConfig deploymentConfig =\n        new DeploymentConfigBuilder()\n            .withNewMetadata()\n            .withName(\"deploymentConfig\")\n            .addToLabels(\"app\", \"che\")\n            .endMetadata()\n            .withNewSpec()\n            .withNewTemplate()\n            .withNewSpec()\n            .withContainers(container11)\n            .endSpec()\n            .endTemplate()\n            .endSpec()\n            .build();\n    Template template =\n        new TemplateBuilder()\n            .addToObjects(\n                new DeploymentBuilder()\n                    .withNewMetadata()\n                    .withName(\"deploymentWithName\")\n                    .endMetadata()\n                    .withNewSpec()\n                    .withNewTemplate()\n                    .withNewMetadata()\n                    .withName(\"podWithName\")\n                    .endMetadata()\n                    .withNewSpec()\n                    .withContainers(container12)\n                    .endSpec()\n                    .endTemplate()\n                    .endSpec()\n                    .build())\n            .build();\n\n    // Pod, PodTemplate, DaemonSet, Deployment, Job, ReplicaSet, ReplicationController, StatefulSet,\n    // CronJob, DeploymentConfig, Template\n    testList =\n        asList(\n            podWithName,\n            podWithGenerateName,\n            podTemplate,\n            daemonSet,\n            deployment,\n            job,\n            replicaSet,\n            replicationController,\n            statefulSet,\n            cronJob,\n            deploymentConfig,\n            template);\n  }\n\n  @Test\n  public void shouldFindAllContainersIfNotRestricted() {\n    ContainerSearch search = new ContainerSearch(null, null, null);\n\n    List<Container> results = search.search(testList);\n\n    Assert.assertEquals(results.size(), 12);\n    assertContainsContainer(results, \"container1\");\n    assertContainsContainer(results, \"container2\");\n    assertContainsContainer(results, \"container3\");\n    assertContainsContainer(results, \"container4\");\n    assertContainsContainer(results, \"container5\");\n    assertContainsContainer(results, \"container6\");\n    assertContainsContainer(results, \"container7\");\n    assertContainsContainer(results, \"container8\");\n    assertContainsContainer(results, \"container9\");\n    assertContainsContainer(results, \"container10\");\n    assertContainsContainer(results, \"container11\");\n    assertContainsContainer(results, \"container12\");\n  }\n\n  @Test\n  public void shouldRestrictByName() {\n    ContainerSearch search = new ContainerSearch(\"podWithName\", null, null);\n\n    List<Container> results = search.search(testList);\n\n    Assert.assertEquals(results.size(), 1);\n    assertContainsContainer(results, \"container1\");\n  }\n\n  @Test\n  public void shouldRestrictByGenerateName() {\n    ContainerSearch search = new ContainerSearch(\"podWithGenerateName\", null, null);\n\n    List<Container> results = search.search(testList);\n\n    Assert.assertEquals(results.size(), 1);\n    assertContainsContainer(results, \"container2\");\n  }\n\n  @Test\n  public void shouldRestrictByContainerName() {\n    ContainerSearch search = new ContainerSearch(null, null, \"container7\");\n\n    List<Container> results = search.search(testList);\n\n    Assert.assertEquals(results.size(), 1);\n    assertContainsContainer(results, \"container7\");\n  }\n\n  @Test\n  public void shouldRestrictByParentSelector() {\n    Map<String, String> selector = ImmutableMap.of(\"app\", \"che\");\n    ContainerSearch search = new ContainerSearch(null, selector, null);\n\n    List<Container> results = search.search(testList);\n\n    Assert.assertEquals(results.size(), 6);\n    assertContainsContainer(results, \"container1\");\n    assertContainsContainer(results, \"container3\");\n    assertContainsContainer(results, \"container5\");\n    assertContainsContainer(results, \"container7\");\n    assertContainsContainer(results, \"container9\");\n    assertContainsContainer(results, \"container11\");\n  }\n\n  @Test\n  public void shouldConsiderEmptySelectorAsNotPresent() {\n    ContainerSearch search = new ContainerSearch(null, Collections.emptyMap(), null);\n\n    List<Container> results = search.search(testList);\n\n    Assert.assertEquals(results.size(), 12);\n    assertContainsContainer(results, \"container1\");\n    assertContainsContainer(results, \"container2\");\n    assertContainsContainer(results, \"container3\");\n    assertContainsContainer(results, \"container4\");\n    assertContainsContainer(results, \"container5\");\n    assertContainsContainer(results, \"container6\");\n    assertContainsContainer(results, \"container7\");\n    assertContainsContainer(results, \"container8\");\n    assertContainsContainer(results, \"container9\");\n    assertContainsContainer(results, \"container10\");\n    assertContainsContainer(results, \"container11\");\n    assertContainsContainer(results, \"container12\");\n  }\n\n  private static void assertContainsContainer(Collection<Container> containers, String name) {\n    Optional<Container> containerOptional =\n        containers.stream().filter(c -> name.equals(c.getName())).findAny();\n    if (containerOptional.isEmpty()) {\n      throw new AssertionError(format(\"Expected a container called %s but didn't find any.\", name));\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentToWorkspaceApplierTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.devfile;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.DEVFILE_COMPONENT_ALIAS_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.DOCKERIMAGE_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.PUBLIC_ENDPOINT_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.PROJECTS_VOLUME_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.devfile.DockerimageComponentToWorkspaceApplier.CHE_COMPONENT_NAME_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.SingleHostExternalServiceExposureStrategy.SINGLE_HOST_STRATEGY;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.EnvVar;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.PodTemplateSpec;\nimport io.fabric8.kubernetes.api.model.Quantity;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EndpointImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EnvImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.VolumeImpl;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.environment.MachineConfigsValidator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class DockerimageComponentToWorkspaceApplierTest {\n\n  private WorkspaceConfigImpl workspaceConfig;\n\n  private DockerimageComponentToWorkspaceApplier dockerimageComponentApplier;\n\n  @Mock private KubernetesEnvironmentProvisioner k8sEnvProvisioner;\n\n  @Captor private ArgumentCaptor<List<HasMetadata>> objectsCaptor;\n  @Captor private ArgumentCaptor<Map<String, MachineConfigImpl>> machinesCaptor;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    dockerimageComponentApplier =\n        new DockerimageComponentToWorkspaceApplier(MULTI_HOST_STRATEGY, k8sEnvProvisioner);\n    workspaceConfig = new WorkspaceConfigImpl();\n  }\n\n  @Test\n  public void\n      shouldProvisionK8sEnvironmentWithMachineConfigAndGeneratedDeploymentForSpecifiedDockerimage()\n          throws Exception {\n    // given\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    MachineConfigImpl machineConfig = machinesCaptor.getValue().get(\"jdk\");\n    assertNotNull(machineConfig);\n\n    List<HasMetadata> objects = objectsCaptor.getValue();\n    assertEquals(objects.size(), 1);\n    assertTrue(objects.get(0) instanceof Deployment);\n    Deployment deployment = (Deployment) objects.get(0);\n    PodTemplateSpec podTemplate = deployment.getSpec().getTemplate();\n    ObjectMeta podMeta = podTemplate.getMetadata();\n    assertEquals(podMeta.getName(), \"jdk\");\n\n    Map<String, String> deploymentSelector = deployment.getSpec().getSelector().getMatchLabels();\n    assertFalse(deploymentSelector.isEmpty());\n    assertTrue(podMeta.getLabels().entrySet().containsAll(deploymentSelector.entrySet()));\n\n    Container container = podTemplate.getSpec().getContainers().get(0);\n    assertEquals(container.getName(), \"jdk\");\n    assertEquals(container.getImage(), \"eclipse/ubuntu_jdk8:latest\");\n\n    assertEquals(Names.machineName(podMeta, container), \"jdk\");\n  }\n\n  @Test\n  public void shouldBeAbleToSetupSpecificImagePullPolicy() throws DevfileException {\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n    dockerimageComponentApplier =\n        new DockerimageComponentToWorkspaceApplier(MULTI_HOST_STRATEGY, k8sEnvProvisioner);\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            any(),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    MachineConfigImpl machineConfig = machinesCaptor.getValue().get(\"eclipse-ubuntu_jdk8-latest\");\n    assertNotNull(machineConfig);\n\n    List<HasMetadata> objects = objectsCaptor.getValue();\n    assertEquals(objects.size(), 1);\n    assertTrue(objects.get(0) instanceof Deployment);\n    Deployment deployment = (Deployment) objects.get(0);\n    PodTemplateSpec podTemplate = deployment.getSpec().getTemplate();\n    ObjectMeta podMeta = podTemplate.getMetadata();\n    assertEquals(podMeta.getName(), \"eclipse-ubuntu_jdk8-latest\");\n\n    Map<String, String> deploymentSelector = deployment.getSpec().getSelector().getMatchLabels();\n    assertFalse(deploymentSelector.isEmpty());\n    assertTrue(podMeta.getLabels().entrySet().containsAll(deploymentSelector.entrySet()));\n\n    Container container = podTemplate.getSpec().getContainers().get(0);\n    assertEquals(container.getName(), \"eclipse-ubuntu_jdk8-latest\");\n  }\n\n  @Test\n  public void shouldProvisionK8sEnvironmentWithMachineConfigFromSpecifiedDockerimageWithoutAlias()\n      throws Exception {\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            any(),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    MachineConfigImpl machineConfig = machinesCaptor.getValue().get(\"eclipse-ubuntu_jdk8-latest\");\n    assertNotNull(machineConfig);\n\n    List<HasMetadata> objects = objectsCaptor.getValue();\n    assertEquals(objects.size(), 1);\n    assertTrue(objects.get(0) instanceof Deployment);\n    Deployment deployment = (Deployment) objects.get(0);\n    PodTemplateSpec podTemplate = deployment.getSpec().getTemplate();\n    ObjectMeta podMeta = podTemplate.getMetadata();\n    assertEquals(podMeta.getName(), \"eclipse-ubuntu_jdk8-latest\");\n\n    Map<String, String> deploymentSelector = deployment.getSpec().getSelector().getMatchLabels();\n    assertFalse(deploymentSelector.isEmpty());\n    assertTrue(podMeta.getLabels().entrySet().containsAll(deploymentSelector.entrySet()));\n\n    Container container = podTemplate.getSpec().getContainers().get(0);\n    assertEquals(container.getName(), \"eclipse-ubuntu_jdk8-latest\");\n    assertEquals(container.getImage(), \"eclipse/ubuntu_jdk8:latest\");\n\n    assertEquals(\n        Names.machineName(podTemplate.getMetadata(), container), \"eclipse-ubuntu_jdk8-latest\");\n  }\n\n  @Test\n  public void shouldProvisionSpecifiedEnvVars() throws Exception {\n    // given\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n    dockerimageComponent.setEnv(singletonList(new EnvImpl(\"envName\", \"envValue\")));\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    List<HasMetadata> objects = objectsCaptor.getValue();\n    assertEquals(objects.size(), 1);\n    assertTrue(objects.get(0) instanceof Deployment);\n    Deployment deployment = (Deployment) objects.get(0);\n    PodTemplateSpec podTemplate = deployment.getSpec().getTemplate();\n    assertEquals(podTemplate.getSpec().getContainers().size(), 1);\n    Container container = podTemplate.getSpec().getContainers().get(0);\n    int env = container.getEnv().size();\n    assertEquals(env, 1);\n    EnvVar containerEnvVar = container.getEnv().get(0);\n    assertEquals(containerEnvVar.getName(), \"envName\");\n    assertEquals(containerEnvVar.getValue(), \"envValue\");\n  }\n\n  @Test\n  public void shouldProvisionContainerWithMemoryResourcesSpecified() throws Exception {\n    // given\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n    dockerimageComponent.setMemoryRequest(\"128M\");\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    List<HasMetadata> objects = objectsCaptor.getValue();\n    assertEquals(objects.size(), 1);\n    assertTrue(objects.get(0) instanceof Deployment);\n    Deployment deployment = (Deployment) objects.get(0);\n    PodTemplateSpec podTemplate = deployment.getSpec().getTemplate();\n    assertEquals(podTemplate.getSpec().getContainers().size(), 1);\n    Container container = podTemplate.getSpec().getContainers().get(0);\n    Quantity memoryLimit = container.getResources().getLimits().get(\"memory\");\n    assertEquals(memoryLimit.getAmount(), \"1\");\n    assertEquals(memoryLimit.getFormat(), \"G\");\n\n    Quantity memoryRequest = container.getResources().getRequests().get(\"memory\");\n    assertEquals(memoryRequest.getAmount(), \"128\");\n    assertEquals(memoryRequest.getFormat(), \"M\");\n  }\n\n  @Test\n  public void shouldProvisionContainerWithCpuLimitsSpecified() throws Exception {\n    // given\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n    dockerimageComponent.setCpuRequest(\"1576m\");\n    dockerimageComponent.setCpuLimit(\"2.22\");\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    List<HasMetadata> objects = objectsCaptor.getValue();\n    assertEquals(objects.size(), 1);\n    assertTrue(objects.get(0) instanceof Deployment);\n    Deployment deployment = (Deployment) objects.get(0);\n    PodTemplateSpec podTemplate = deployment.getSpec().getTemplate();\n    assertEquals(podTemplate.getSpec().getContainers().size(), 1);\n    Container container = podTemplate.getSpec().getContainers().get(0);\n    Quantity cpuLimit = container.getResources().getLimits().get(\"cpu\");\n    Quantity cpuRequest = container.getResources().getRequests().get(\"cpu\");\n    assertEquals(cpuRequest.getAmount(), \"1.576\");\n    assertEquals(cpuLimit.getAmount(), \"2.22\");\n  }\n\n  @Test\n  public void shouldProvisionMachineConfigWithConfiguredServers() throws Exception {\n    // given\n    EndpointImpl endpoint =\n        new EndpointImpl(\n            \"jdk-ls\",\n            4923,\n            ImmutableMap.of(\n                \"protocol\",\n                \"http\",\n                \"path\",\n                \"/ls\",\n                PUBLIC_ENDPOINT_ATTRIBUTE,\n                \"false\",\n                \"secure\",\n                \"false\"));\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n    dockerimageComponent.setEndpoints(singletonList(endpoint));\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    MachineConfigImpl machineConfig = machinesCaptor.getValue().get(\"jdk\");\n    assertNotNull(machineConfig);\n    assertEquals(machineConfig.getServers().size(), 1);\n    ServerConfigImpl serverConfig = machineConfig.getServers().get(\"jdk-ls\");\n    assertEquals(serverConfig.getProtocol(), \"http\");\n    assertEquals(serverConfig.getPath(), \"/ls\");\n    assertEquals(serverConfig.getPort(), \"4923\");\n    Map<String, String> attributes = serverConfig.getAttributes();\n    assertEquals(attributes.get(ServerConfig.INTERNAL_SERVER_ATTRIBUTE), \"true\");\n    assertEquals(attributes.get(\"secure\"), \"false\");\n    assertEquals(attributes.get(ServerConfig.REQUIRE_SUBDOMAIN), \"true\");\n  }\n\n  @Test\n  public void shouldProvisionServiceForDiscoverableServer() throws Exception {\n    // given\n    EndpointImpl endpoint =\n        new EndpointImpl(\n            \"jdk-ls\",\n            4923,\n            ImmutableMap.of(\n                \"protocol\",\n                \"http\",\n                \"path\",\n                \"/ls\",\n                PUBLIC_ENDPOINT_ATTRIBUTE,\n                \"false\",\n                \"secure\",\n                \"false\",\n                \"discoverable\",\n                \"true\"));\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n    dockerimageComponent.setEndpoints(singletonList(endpoint));\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n\n    List<HasMetadata> objects = objectsCaptor.getValue();\n    assertEquals(objects.size(), 1);\n    assertTrue(objects.get(0) instanceof Deployment);\n    Deployment deployment = (Deployment) objects.get(0);\n    assertEquals(\n        deployment.getSpec().getTemplate().getMetadata().getLabels().get(CHE_COMPONENT_NAME_LABEL),\n        \"jdk\");\n  }\n\n  @Test\n  public void shouldProvisionServersWithHttpPortIsTheCorrespondingAttrIsMissing() throws Exception {\n    // given\n    EndpointImpl endpoint = new EndpointImpl(\"jdk-ls\", 4923, emptyMap());\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n    dockerimageComponent.setEndpoints(singletonList(endpoint));\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    MachineConfigImpl machineConfig = machinesCaptor.getValue().get(\"jdk\");\n    assertNotNull(machineConfig);\n    assertEquals(machineConfig.getServers().size(), 1);\n    ServerConfigImpl serverConfig = machineConfig.getServers().get(\"jdk-ls\");\n    assertEquals(serverConfig.getProtocol(), \"http\");\n  }\n\n  @Test\n  public void shouldProvisionMachineConfigWithConfiguredVolumes() throws Exception {\n    // given\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n    dockerimageComponent.setVolumes(singletonList(new VolumeImpl(\"data\", \"/tmp/data/\")));\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    MachineConfigImpl machineConfig = machinesCaptor.getValue().get(\"jdk\");\n    assertNotNull(machineConfig);\n    org.eclipse.che.api.workspace.server.model.impl.VolumeImpl volume =\n        machineConfig.getVolumes().get(\"data\");\n    assertNotNull(volume);\n    assertEquals(volume.getPath(), \"/tmp/data/\");\n  }\n\n  @Test\n  public void shouldProvisionMachineConfigWithMountSources() throws Exception {\n    // given\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n    dockerimageComponent.setMountSources(true);\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    MachineConfigImpl machineConfig = machinesCaptor.getValue().get(\"jdk\");\n    assertNotNull(machineConfig);\n  }\n\n  @Test\n  public void shouldProvisionMachineConfigWithAliasAttribute() throws Exception {\n    // given\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk-alias\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    MachineConfigImpl machineConfig = machinesCaptor.getValue().get(\"jdk-alias\");\n    assertNotNull(machineConfig);\n    assertEquals(machineConfig.getAttributes().get(DEVFILE_COMPONENT_ALIAS_ATTRIBUTE), \"jdk-alias\");\n  }\n\n  @Test\n  public void shouldProvisionMachineConfigWithoutSourcesByDefault() throws Exception {\n    // given\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    MachineConfigImpl machineConfig = machinesCaptor.getValue().get(\"jdk\");\n    assertNotNull(machineConfig);\n    assertFalse(machineConfig.getVolumes().containsKey(PROJECTS_VOLUME_NAME));\n  }\n\n  @Test\n  public void shouldProvisionCommandAndArgs() throws Exception {\n    // given\n    List<String> command = singletonList(\"/usr/bin/rf\");\n    List<String> args = Arrays.asList(\"-r\", \"f\");\n\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"1G\");\n    dockerimageComponent.setCommand(command);\n    dockerimageComponent.setArgs(args);\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    List<HasMetadata> objects = objectsCaptor.getValue();\n    assertEquals(objects.size(), 1);\n    assertTrue(objects.get(0) instanceof Deployment);\n    Deployment deployment = (Deployment) objects.get(0);\n    PodTemplateSpec podTemplate = deployment.getSpec().getTemplate();\n    assertEquals(podTemplate.getSpec().getContainers().size(), 1);\n    Container container = podTemplate.getSpec().getContainers().get(0);\n    assertEquals(container.getCommand(), command);\n    assertEquals(container.getArgs(), args);\n  }\n\n  @Test\n  public void serverMustHaveRequireSubdomainWhenNonSinglehostDevfileExpose()\n      throws DevfileException {\n    dockerimageComponentApplier =\n        new DockerimageComponentToWorkspaceApplier(MULTI_HOST_STRATEGY, k8sEnvProvisioner);\n\n    // given\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"100M\");\n    dockerimageComponent.setEndpoints(\n        Arrays.asList(\n            new EndpointImpl(\"e1\", 1111, emptyMap()), new EndpointImpl(\"e2\", 2222, emptyMap())));\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    MachineConfigImpl machineConfig = machinesCaptor.getValue().get(\"jdk\");\n    assertNotNull(machineConfig);\n    assertEquals(machineConfig.getServers().size(), 2);\n    assertTrue(\n        ServerConfig.isRequireSubdomain(machineConfig.getServers().get(\"e1\").getAttributes()));\n    assertTrue(\n        ServerConfig.isRequireSubdomain(machineConfig.getServers().get(\"e2\").getAttributes()));\n  }\n\n  @Test\n  public void serverCantHaveRequireSubdomainWhenSinglehostDevfileExpose() throws DevfileException {\n    dockerimageComponentApplier =\n        new DockerimageComponentToWorkspaceApplier(SINGLE_HOST_STRATEGY, k8sEnvProvisioner);\n\n    // given\n    ComponentImpl dockerimageComponent = new ComponentImpl();\n    dockerimageComponent.setAlias(\"jdk\");\n    dockerimageComponent.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    dockerimageComponent.setImage(\"eclipse/ubuntu_jdk8:latest\");\n    dockerimageComponent.setMemoryLimit(\"100M\");\n    dockerimageComponent.setEndpoints(\n        Arrays.asList(\n            new EndpointImpl(\"e1\", 1111, emptyMap()), new EndpointImpl(\"e2\", 2222, emptyMap())));\n\n    // when\n    dockerimageComponentApplier.apply(workspaceConfig, dockerimageComponent, null);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig),\n            eq(KubernetesEnvironment.TYPE),\n            objectsCaptor.capture(),\n            machinesCaptor.capture());\n    MachineConfigImpl machineConfig = machinesCaptor.getValue().get(\"jdk\");\n    assertNotNull(machineConfig);\n    assertEquals(machineConfig.getServers().size(), 2);\n    assertFalse(\n        ServerConfig.isRequireSubdomain(machineConfig.getServers().get(\"e1\").getAttributes()));\n    assertFalse(\n        ServerConfig.isRequireSubdomain(machineConfig.getServers().get(\"e2\").getAttributes()));\n  }\n\n  @Test(dataProvider = \"imageNames\")\n  public void testGeneratesValidMachineNameFromImageName(String imageName)\n      throws ValidationException, DevfileException {\n\n    // given\n    String machineName = DockerimageComponentToWorkspaceApplier.toMachineName(imageName);\n    MachineConfigsValidator validator = new MachineConfigsValidator();\n    Map<String, InternalMachineConfig> configs = new HashMap<>();\n    configs.put(machineName, new InternalMachineConfig());\n\n    // when\n    validator.validate(configs);\n\n    // then no exception is thrown\n  }\n\n  @DataProvider\n  public static Object[][] imageNames() {\n    return new Object[][] {\n      new Object[] {\"maven\"}, new Object[] {\"maven-3.6\"}, new Object[] {\"eclipse/che-3.6:latest\"}\n    };\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentIntegrityValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.devfile;\n\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.when;\n\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EntrypointImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesComponentIntegrityValidatorTest {\n\n  @Mock private KubernetesRecipeParser kubernetesRecipeParser;\n  @Mock private FileContentProvider contentProvider;\n\n  private KubernetesComponentValidator validator;\n\n  @BeforeMethod\n  public void setup() {\n    Set<String> k8sComponentTypes = new HashSet<>();\n    k8sComponentTypes.add(KUBERNETES_COMPONENT_TYPE);\n    validator = new KubernetesComponentValidator(kubernetesRecipeParser, k8sComponentTypes);\n  }\n\n  @Test\n  public void shouldApplySelector() throws Exception {\n    // given\n    when(kubernetesRecipeParser.parse(any(String.class)))\n        .thenReturn(\n            Arrays.asList(\n                new PodBuilder().withNewMetadata().addToLabels(\"app\", \"test\").endMetadata().build(),\n                new PodBuilder()\n                    .withNewMetadata()\n                    .addToLabels(\"app\", \"other\")\n                    .endMetadata()\n                    .build()));\n\n    Map<String, String> selector = new HashMap<>();\n    selector.put(\"app\", \"test\");\n\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(\"ref\");\n    component.setSelector(selector);\n    component.setReferenceContent(\"content\");\n\n    // when\n    validator.validateComponent(component, contentProvider);\n\n    // then no exception is thrown\n  }\n\n  @Test\n  public void shouldApplyEntrypoint() throws Exception {\n    // given\n    when(kubernetesRecipeParser.parse(any(String.class)))\n        .thenReturn(\n            Arrays.asList(\n                new PodBuilder()\n                    .withNewSpec()\n                    .addNewContainer()\n                    .withName(\"container_a\")\n                    .endContainer()\n                    .endSpec()\n                    .build(),\n                new PodBuilder()\n                    .withNewSpec()\n                    .addNewContainer()\n                    .withName(\"container_b\")\n                    .endContainer()\n                    .endSpec()\n                    .build()));\n\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReferenceContent(\"content\");\n    component.setReference(\"ref\");\n\n    EntrypointImpl entrypoint = new EntrypointImpl();\n    entrypoint.setContainerName(\"container_a\");\n    component.setEntrypoints(Collections.singletonList(entrypoint));\n\n    // when\n    validator.validateComponent(component, contentProvider);\n\n    // then no exception is thrown\n  }\n\n  @Test\n  public void shouldValidateContainerMatchingEntrypointInPodMatchingSelector() throws Exception {\n    // given\n    when(kubernetesRecipeParser.parse(any(String.class)))\n        .thenReturn(\n            Arrays.asList(\n                new PodBuilder()\n                    .withNewMetadata()\n                    .addToLabels(\"app\", \"test\")\n                    .endMetadata()\n                    .withNewSpec()\n                    .addNewContainer()\n                    .withName(\"container_a\")\n                    .endContainer()\n                    .endSpec()\n                    .build(),\n                new PodBuilder()\n                    .withNewMetadata()\n                    .addToLabels(\"app\", \"other\")\n                    .endMetadata()\n                    .withNewSpec()\n                    .addNewContainer()\n                    .withName(\"container_a\")\n                    .endContainer()\n                    .endSpec()\n                    .build()));\n\n    Map<String, String> selector = new HashMap<>();\n    selector.put(\"app\", \"test\");\n\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(\"ref\");\n    component.setSelector(selector);\n    component.setReferenceContent(\"content\");\n\n    EntrypointImpl entrypoint = new EntrypointImpl();\n    entrypoint.setContainerName(\"container_a\");\n    component.setEntrypoints(Collections.singletonList(entrypoint));\n\n    // when\n    validator.validateComponent(component, contentProvider);\n\n    // then no exception is thrown\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"Failed to validate content reference of component 'ref' of type 'kubernetes': The selector of the component 'ref' of type 'kubernetes' filters out all objects from the list.\")\n  public void shouldThrowExceptionOnSelectorFilteringOutEverything() throws Exception {\n    // given\n    when(kubernetesRecipeParser.parse(any(String.class)))\n        .thenReturn(\n            Collections.singletonList(\n                new PodBuilder()\n                    .withNewMetadata()\n                    .addToLabels(\"app\", \"test\")\n                    .endMetadata()\n                    .build()));\n\n    Map<String, String> selector = new HashMap<>();\n    selector.put(\"app\", \"a different value\");\n\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(\"ref\");\n    component.setSelector(selector);\n    component.setReferenceContent(\"content\");\n\n    // when\n    validator.validateComponent(component, contentProvider);\n\n    // then exception is thrown\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"Failed to validate content reference of component 'ref' of type 'kubernetes': Component 'ref' of type 'kubernetes' contains an entry point that doesn't match any container.\")\n  public void shouldThrowExceptionOnEntrypointNotMatchingAnyContainer() throws Exception {\n    // given\n    when(kubernetesRecipeParser.parse(any(String.class)))\n        .thenReturn(\n            Collections.singletonList(\n                new PodBuilder()\n                    .withNewSpec()\n                    .addNewContainer()\n                    .withName(\"container\")\n                    .endContainer()\n                    .endSpec()\n                    .build()));\n\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReferenceContent(\"content\");\n    component.setReference(\"ref\");\n\n    EntrypointImpl entrypoint = new EntrypointImpl();\n    entrypoint.setContainerName(\"not that container\");\n    component.setEntrypoints(Collections.singletonList(entrypoint));\n\n    // when\n    validator.validateComponent(component, contentProvider);\n\n    // then exception is thrown\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"Failed to validate content reference of component 'ref' of type 'kubernetes': Component 'ref' of type 'kubernetes' contains an entry point that doesn't match any container.\")\n  public void shouldThrowExceptionOnEntrypointNotMatchingAnyContainerOfPodsMatchingSelector()\n      throws Exception {\n    // given\n    when(kubernetesRecipeParser.parse(any(String.class)))\n        .thenReturn(\n            Arrays.asList(\n                new PodBuilder()\n                    .withNewMetadata()\n                    .addToLabels(\"app\", \"test\")\n                    .endMetadata()\n                    .withNewSpec()\n                    .addNewContainer()\n                    .withName(\"container_a\")\n                    .endContainer()\n                    .endSpec()\n                    .build(),\n                new PodBuilder()\n                    .withNewMetadata()\n                    .addToLabels(\"app\", \"other\")\n                    .endMetadata()\n                    .withNewSpec()\n                    .addNewContainer()\n                    .withName(\"container_b\")\n                    .endContainer()\n                    .endSpec()\n                    .build()));\n\n    Map<String, String> selector = new HashMap<>();\n    selector.put(\"app\", \"test\");\n\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReferenceContent(\"content\");\n    component.setReference(\"ref\");\n    component.setSelector(selector);\n\n    EntrypointImpl entrypoint = new EntrypointImpl();\n    entrypoint.setContainerName(\"container_b\");\n    component.setEntrypoints(Collections.singletonList(entrypoint));\n\n    // when\n    validator.validateComponent(component, contentProvider);\n\n    // then exception is thrown\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentToWorkspaceApplierTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.devfile;\n\nimport static io.fabric8.kubernetes.client.utils.Serialization.unmarshal;\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.core.model.workspace.config.Command.MACHINE_NAME_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.DEVFILE_COMPONENT_ALIAS_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.REQUIRE_SUBDOMAIN;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.OPENSHIFT_COMPONENT_TYPE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.SingleHostExternalServiceExposureStrategy.SINGLE_HOST_STRATEGY;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyMap;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.KubernetesList;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.config.MachineConfig;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EndpointImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EntrypointImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EnvImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.VolumeImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.EnvVars;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\nimport org.testng.reporters.Files;\n\n/**\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesComponentToWorkspaceApplierTest {\n\n  public static final String REFERENCE_FILENAME = \"reference.yaml\";\n  public static final String COMPONENT_NAME = \"foo\";\n\n  private WorkspaceConfigImpl workspaceConfig;\n\n  private KubernetesComponentToWorkspaceApplier applier;\n  @Mock private KubernetesRecipeParser k8sRecipeParser;\n  @Mock private KubernetesEnvironmentProvisioner k8sEnvProvisioner;\n  @Mock private EnvVars envVars;\n  @Mock private FileContentProvider contentProvider;\n\n  @Captor private ArgumentCaptor<List<HasMetadata>> objectsCaptor;\n\n  private Set<String> k8sBasedComponents;\n\n  @BeforeMethod\n  public void setUp() {\n    k8sBasedComponents = new HashSet<>();\n    k8sBasedComponents.add(KUBERNETES_COMPONENT_TYPE);\n    k8sBasedComponents.add(\"openshift\"); // so that we can work with the petclinic.yaml\n    applier =\n        new KubernetesComponentToWorkspaceApplier(\n            k8sRecipeParser, k8sEnvProvisioner, envVars, MULTI_HOST_STRATEGY, k8sBasedComponents);\n\n    workspaceConfig = new WorkspaceConfigImpl();\n  }\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp =\n          \"Fetching content of file `reference.yaml` specified in `reference` field of component `foo` is not \"\n              + \"supported. Please provide its content in `referenceContent` field. Cause: fetch is not supported\")\n  public void\n      shouldThrowExceptionWhenRecipeComponentIsPresentAndContentProviderDoesNotSupportFetching()\n          throws Exception {\n    // given\n    when(contentProvider.fetchContent(anyString()))\n        .thenThrow(new DevfileException(\"fetch is not supported\"));\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n  }\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp =\n          \"Error occurred during parsing list from file \"\n              + REFERENCE_FILENAME\n              + \" for component '\"\n              + COMPONENT_NAME\n              + \"': .*\")\n  public void shouldThrowExceptionWhenRecipeContentIsNotAValidYaml() throws Exception {\n    // given\n    doThrow(new ValidationException(\"non valid\")).when(k8sRecipeParser).parse(anyString());\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    when(contentProvider.fetchContent(anyString())).thenReturn(\"some_non_yaml_content\");\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n  }\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp =\n          \"Error during recipe content retrieval for component 'foo' with type 'kubernetes': fetch failed\")\n  public void shouldThrowExceptionWhenExceptionHappensOnContentProvider() throws Exception {\n    // given\n    when(contentProvider.fetchContent(anyString())).thenThrow(new IOException(\"fetch failed\"));\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n  }\n\n  @Test\n  public void shouldProvisionEnvironmentWithCorrectRecipeTypeAndContentFromK8SList()\n      throws Exception {\n    // given\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    KubernetesList list = toK8SList(yamlRecipeContent);\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig), eq(KubernetesEnvironment.TYPE), eq(list.getItems()), anyMap());\n  }\n\n  @Test\n  public void shouldUseReferenceContentAsRecipeIfPresent() throws Exception {\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setReferenceContent(yamlRecipeContent);\n    component.setAlias(COMPONENT_NAME);\n\n    applier.apply(workspaceConfig, component, new URLFileContentProvider(null, null));\n\n    KubernetesList list = toK8SList(yamlRecipeContent);\n\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig), eq(KubernetesEnvironment.TYPE), eq(list.getItems()), anyMap());\n  }\n\n  @Test\n  public void shouldProvisionDevfileVolumesIfSpecifiedIntoMachineConfig() throws Exception {\n    // given\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    List<HasMetadata> k8sList = toK8SList(yamlRecipeContent).getItems();\n    doReturn(k8sList).when(k8sRecipeParser).parse(anyString());\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    component.setVolumes(asList(new VolumeImpl(\"foo\", \"/foo1\"), new VolumeImpl(\"bar\", \"/bar1\")));\n    ArgumentCaptor<Map<String, MachineConfigImpl>> mapCaptor = ArgumentCaptor.forClass(Map.class);\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    verify(k8sEnvProvisioner).provision(any(), any(), any(), mapCaptor.capture());\n    Map<String, MachineConfigImpl> configMaps = mapCaptor.getValue();\n\n    for (MachineConfig config : configMaps.values()) {\n      assertEquals(config.getVolumes().size(), 2);\n      assertTrue(\n          config.getVolumes().entrySet().stream()\n              .anyMatch(\n                  entry ->\n                      entry.getKey().equals(\"foo\") && entry.getValue().getPath().equals(\"/foo1\")));\n      assertTrue(\n          config.getVolumes().entrySet().stream()\n              .anyMatch(\n                  entry ->\n                      entry.getKey().equals(\"bar\") && entry.getValue().getPath().equals(\"/bar1\")));\n    }\n  }\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp =\n          \"Conflicting volume with same name \\\\('foo_volume'\\\\) but different path \\\\('/foo1'\\\\) found for component 'foo' and its container 'server'.\")\n  public void shouldThrowExceptionWhenDevfileVolumeNameExists() throws Exception {\n    // given\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    List<HasMetadata> k8sList = toK8SList(yamlRecipeContent).getItems();\n    doReturn(k8sList).when(k8sRecipeParser).parse(anyString());\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    component.setVolumes(Collections.singletonList(new VolumeImpl(\"foo_volume\", \"/foo1\")));\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n  }\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp =\n          \"Conflicting volume with same path \\\\('/foo/bar'\\\\) but different name \\\\('foo'\\\\) found for component 'foo' and its container 'server'.\")\n  public void shouldThrowExceptionWhenDevfileVolumePathExists() throws Exception {\n    // given\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    List<HasMetadata> k8sList = toK8SList(yamlRecipeContent).getItems();\n    doReturn(k8sList).when(k8sRecipeParser).parse(anyString());\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    component.setVolumes(Collections.singletonList(new VolumeImpl(\"foo\", \"/foo/bar\")));\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n  }\n\n  @Test\n  public void shouldProvisionEnvIntoK8SList() throws Exception {\n    // given\n    List<HasMetadata> k8sList = new ArrayList<>();\n    Pod pod1 =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"pod1\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    Pod pod2 =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"pod2\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    k8sList.add(pod1);\n    k8sList.add(pod2);\n    doReturn(k8sList).when(k8sRecipeParser).parse(anyString());\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    List<EnvImpl> envToApply = singletonList(new EnvImpl(\"TEST_ENV\", \"anyValue\"));\n    component.setEnv(envToApply);\n    when(contentProvider.fetchContent(anyString())).thenReturn(\"content\");\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    envVars.apply(new PodData(pod1), envToApply);\n    envVars.apply(new PodData(pod2), envToApply);\n  }\n\n  @Test\n  public void shouldProvisionMachinesMapWithComponentAttributePreSet() throws Exception {\n    @SuppressWarnings(\"unchecked\")\n    ArgumentCaptor<Map<String, MachineConfigImpl>> mapCaptor = ArgumentCaptor.forClass(Map.class);\n    // given\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    List<HasMetadata> k8sList = toK8SList(yamlRecipeContent).getItems();\n    doReturn(k8sList).when(k8sRecipeParser).parse(anyString());\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    component.setMountSources(true);\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    verify(k8sEnvProvisioner).provision(any(), any(), any(), mapCaptor.capture());\n    Map<String, MachineConfigImpl> machines = mapCaptor.getValue();\n    assertTrue(\n        machines.values().stream()\n            .allMatch(\n                config ->\n                    config\n                        .getAttributes()\n                        .get(DEVFILE_COMPONENT_ALIAS_ATTRIBUTE)\n                        .equals(component.getAlias())));\n  }\n\n  @Test\n  public void shouldFilterRecipeWithGivenSelectors() throws Exception {\n    // given\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n\n    final Map<String, String> selector = singletonMap(\"app.kubernetes.io/component\", \"webapp\");\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    component.setSelector(selector);\n    doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(\n            eq(workspaceConfig), eq(KubernetesEnvironment.TYPE), objectsCaptor.capture(), anyMap());\n    List<HasMetadata> resultItemsList = objectsCaptor.getValue();\n    assertEquals(resultItemsList.size(), 3);\n    assertEquals(1, resultItemsList.stream().filter(it -> \"Pod\".equals(it.getKind())).count());\n    assertEquals(1, resultItemsList.stream().filter(it -> \"Service\".equals(it.getKind())).count());\n    assertEquals(1, resultItemsList.stream().filter(it -> \"Route\".equals(it.getKind())).count());\n  }\n\n  @Test(dependsOnMethods = \"shouldFilterRecipeWithGivenSelectors\", enabled = false)\n  public void shouldSetMachineNameAttributeToCommandConfiguredInOpenShiftComponentWithOneContainer()\n      throws Exception {\n    // given\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());\n\n    final Map<String, String> selector = singletonMap(\"app.kubernetes.io/component\", \"webapp\");\n    ComponentImpl component = new ComponentImpl();\n    component.setType(OPENSHIFT_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    component.setSelector(selector);\n    CommandImpl command = new CommandImpl();\n    command.getAttributes().put(COMPONENT_ALIAS_COMMAND_ATTRIBUTE, COMPONENT_NAME);\n    workspaceConfig.getCommands().add(command);\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    CommandImpl actualCommand = workspaceConfig.getCommands().get(0);\n    assertEquals(actualCommand.getAttributes().get(MACHINE_NAME_ATTRIBUTE), \"petclinic/server\");\n  }\n\n  @Test\n  public void\n      shouldNotSetMachineNameAttributeToCommandConfiguredInOpenShiftComponentWithMultipleContainers()\n          throws Exception {\n    // given\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());\n\n    ComponentImpl component = new ComponentImpl();\n    component.setType(OPENSHIFT_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n\n    CommandImpl command = new CommandImpl();\n    command.getAttributes().put(COMPONENT_ALIAS_COMMAND_ATTRIBUTE, COMPONENT_NAME);\n    workspaceConfig.getCommands().add(command);\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    CommandImpl actualCommand = workspaceConfig.getCommands().get(0);\n    assertNull(actualCommand.getAttributes().get(MACHINE_NAME_ATTRIBUTE));\n  }\n\n  @Test\n  public void shouldChangeEntrypointsOnMatchingContainers() throws Exception {\n    // given\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());\n\n    List<String> command = asList(\"teh\", \"command\");\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n\n    EntrypointImpl entrypoint = new EntrypointImpl();\n    entrypoint.setParentName(\"petclinic\");\n    entrypoint.setCommand(command);\n    component.setEntrypoints(singletonList(entrypoint));\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    verify(k8sEnvProvisioner).provision(any(), any(), objectsCaptor.capture(), any());\n    List<HasMetadata> list = objectsCaptor.getValue();\n    for (HasMetadata o : list) {\n      if (o instanceof Pod) {\n        Pod p = (Pod) o;\n\n        // ignore pods that don't have containers\n        if (p.getSpec() == null) {\n          continue;\n        }\n\n        Container c = p.getSpec().getContainers().get(0);\n        if (o.getMetadata().getName().equals(\"petclinic\")) {\n          assertEquals(c.getCommand(), command);\n        } else {\n          assertTrue(c.getCommand() == null || c.getCommand().isEmpty());\n        }\n      }\n    }\n  }\n\n  @Test\n  public void shouldProvisionEndpointsToAllMachines()\n      throws IOException, ValidationException, InfrastructureException, DevfileException {\n    // given\n    String endpointName = \"petclinic-endpoint\";\n    Integer endpointPort = 8081;\n\n    String yamlRecipeContent = getResource(\"devfile/petclinicPods.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());\n\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    component.setEndpoints(singletonList(new EndpointImpl(endpointName, endpointPort, emptyMap())));\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    @SuppressWarnings(\"unchecked\")\n    ArgumentCaptor<Map<String, MachineConfigImpl>> objectsCaptor =\n        ArgumentCaptor.forClass(Map.class);\n    verify(k8sEnvProvisioner).provision(any(), any(), any(), objectsCaptor.capture());\n    Map<String, MachineConfigImpl> configs = objectsCaptor.getValue();\n    assertEquals(configs.size(), 3);\n    configs\n        .values()\n        .forEach(\n            machineConfig -> {\n              Map<String, ServerConfigImpl> serverConfigs = machineConfig.getServers();\n              assertEquals(serverConfigs.size(), 1);\n              assertTrue(serverConfigs.containsKey(endpointName));\n              assertEquals(serverConfigs.get(endpointName).getPort(), endpointPort.toString());\n              assertNull(serverConfigs.get(endpointName).getPath());\n            });\n  }\n\n  @Test\n  public void shouldProvisionEndpointWithAttributes()\n      throws IOException, ValidationException, InfrastructureException, DevfileException {\n    // given\n    String endpointName = \"petclinic-endpoint\";\n    Integer endpointPort = 8081;\n    String endpointProtocol = \"tcp\";\n    String endpointPath = \"path\";\n    String endpointPublic = \"false\";\n    String endpointSecure = \"false\";\n\n    String yamlRecipeContent = getResource(\"devfile/petclinicPods.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());\n\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    component.setEndpoints(\n        singletonList(\n            new EndpointImpl(\n                endpointName,\n                endpointPort,\n                ImmutableMap.of(\n                    \"protocol\",\n                    endpointProtocol,\n                    \"path\",\n                    endpointPath,\n                    \"public\",\n                    endpointPublic,\n                    \"secure\",\n                    endpointSecure))));\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    @SuppressWarnings(\"unchecked\")\n    ArgumentCaptor<Map<String, MachineConfigImpl>> objectsCaptor =\n        ArgumentCaptor.forClass(Map.class);\n    verify(k8sEnvProvisioner).provision(any(), any(), any(), objectsCaptor.capture());\n    Map<String, MachineConfigImpl> configs = objectsCaptor.getValue();\n    assertEquals(configs.size(), 3);\n    configs\n        .values()\n        .forEach(\n            machineConfig -> {\n              Map<String, ServerConfigImpl> serverConfigs = machineConfig.getServers();\n              assertEquals(serverConfigs.size(), 1);\n              assertTrue(serverConfigs.containsKey(endpointName));\n              assertEquals(serverConfigs.get(endpointName).getPort(), endpointPort.toString());\n              assertEquals(serverConfigs.get(endpointName).getPath(), endpointPath);\n              assertEquals(serverConfigs.get(endpointName).getProtocol(), endpointProtocol);\n              assertEquals(\n                  serverConfigs.get(endpointName).getAttributes().get(REQUIRE_SUBDOMAIN), \"true\");\n              assertEquals(\n                  serverConfigs.get(endpointName).isSecure(), Boolean.parseBoolean(endpointSecure));\n              assertEquals(\n                  serverConfigs.get(endpointName).isInternal(),\n                  !Boolean.parseBoolean(endpointPublic));\n            });\n  }\n\n  @Test\n  public void serverCantHaveRequireSubdomainWhenSinglehostDevfileExpose()\n      throws DevfileException, IOException, ValidationException, InfrastructureException {\n    applier =\n        new KubernetesComponentToWorkspaceApplier(\n            k8sRecipeParser,\n            k8sEnvProvisioner,\n            envVars,\n            \"Always\",\n            SINGLE_HOST_STRATEGY,\n            k8sBasedComponents);\n\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());\n\n    // given\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    component.setEndpoints(\n        Arrays.asList(\n            new EndpointImpl(\"e1\", 1111, emptyMap()), new EndpointImpl(\"e2\", 2222, emptyMap())));\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    @SuppressWarnings(\"unchecked\")\n    ArgumentCaptor<Map<String, MachineConfigImpl>> objectsCaptor =\n        ArgumentCaptor.forClass(Map.class);\n    verify(k8sEnvProvisioner).provision(any(), any(), any(), objectsCaptor.capture());\n    Map<String, MachineConfigImpl> machineConfigs = objectsCaptor.getValue();\n    assertEquals(machineConfigs.size(), 4);\n    machineConfigs\n        .values()\n        .forEach(\n            machineConfig -> {\n              assertEquals(machineConfig.getServers().size(), 2);\n              assertFalse(\n                  ServerConfig.isRequireSubdomain(\n                      machineConfig.getServers().get(\"e1\").getAttributes()));\n              assertFalse(\n                  ServerConfig.isRequireSubdomain(\n                      machineConfig.getServers().get(\"e2\").getAttributes()));\n            });\n  }\n\n  @Test\n  public void serverMustHaveRequireSubdomainWhenNonSinglehostDevfileExpose()\n      throws DevfileException, IOException, ValidationException, InfrastructureException {\n    applier =\n        new KubernetesComponentToWorkspaceApplier(\n            k8sRecipeParser,\n            k8sEnvProvisioner,\n            envVars,\n            \"Always\",\n            MULTI_HOST_STRATEGY,\n            k8sBasedComponents);\n\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());\n\n    // given\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    component.setEndpoints(\n        Arrays.asList(\n            new EndpointImpl(\"e1\", 1111, emptyMap()), new EndpointImpl(\"e2\", 2222, emptyMap())));\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    @SuppressWarnings(\"unchecked\")\n    ArgumentCaptor<Map<String, MachineConfigImpl>> objectsCaptor =\n        ArgumentCaptor.forClass(Map.class);\n    verify(k8sEnvProvisioner).provision(any(), any(), any(), objectsCaptor.capture());\n    Map<String, MachineConfigImpl> machineConfigs = objectsCaptor.getValue();\n    assertEquals(machineConfigs.size(), 4);\n    machineConfigs\n        .values()\n        .forEach(\n            machineConfig -> {\n              assertEquals(machineConfig.getServers().size(), 2);\n              assertTrue(\n                  ServerConfig.isRequireSubdomain(\n                      machineConfig.getServers().get(\"e1\").getAttributes()));\n              assertTrue(\n                  ServerConfig.isRequireSubdomain(\n                      machineConfig.getServers().get(\"e2\").getAttributes()));\n            });\n  }\n\n  private KubernetesList toK8SList(String content) {\n    return unmarshal(content, KubernetesList.class);\n  }\n\n  private String getResource(String resourceName) throws IOException {\n    return Files.readFile(getClass().getClassLoader().getResourceAsStream(resourceName));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesEnvironmentProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.devfile;\n\nimport static io.fabric8.kubernetes.client.utils.Serialization.unmarshal;\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.shared.Constants.PROJECTS_VOLUME_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesEnvironmentProvisioner.YAML_CONTENT_TYPE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.newPVC;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.doReturn;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.KubernetesList;\nimport io.fabric8.kubernetes.api.model.KubernetesListBuilder;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaim;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServiceBuilder;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;\nimport io.fabric8.kubernetes.client.utils.Serialization;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.api.workspace.server.model.impl.EnvironmentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.RecipeImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\nimport org.testng.reporters.Files;\n\n/**\n * Tests {@link KubernetesEnvironmentProvisioner}\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesEnvironmentProvisionerTest {\n\n  private WorkspaceConfigImpl workspaceConfig;\n\n  @Mock private KubernetesRecipeParser k8sRecipeParser;\n  private KubernetesEnvironmentProvisioner k8sEnvProvisioner;\n\n  @BeforeMethod\n  public void setUp() {\n    workspaceConfig = new WorkspaceConfigImpl();\n\n    // \"openshift\" is what we use in the test devfile files and what we need to test the upgrade\n    // and multiple k8s-based types\n    Map<String, Set<String>> allowedUpgrades = new HashMap<>();\n    allowedUpgrades\n        .compute(\"openshift\", (__, ___) -> new HashSet<>())\n        .add(KubernetesEnvironment.TYPE);\n    Set<String> k8sEnvTypes = new HashSet<>();\n    k8sEnvTypes.add(KubernetesEnvironment.TYPE);\n    k8sEnvTypes.add(\"openshift\");\n\n    k8sEnvProvisioner =\n        new KubernetesEnvironmentProvisioner(k8sRecipeParser, allowedUpgrades, k8sEnvTypes);\n  }\n\n  @Test\n  public void shouldProvisionEnvironmentWithCorrectRecipeTypeAndContentFromK8SList()\n      throws Exception {\n    // given\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    List<HasMetadata> componentsObjects = toK8SList(yamlRecipeContent).getItems();\n\n    // when\n    k8sEnvProvisioner.provision(\n        workspaceConfig, KubernetesEnvironment.TYPE, componentsObjects, emptyMap());\n\n    // then\n    String defaultEnv = workspaceConfig.getDefaultEnv();\n    assertNotNull(defaultEnv);\n    EnvironmentImpl environment = workspaceConfig.getEnvironments().get(defaultEnv);\n    assertNotNull(environment);\n    RecipeImpl recipe = environment.getRecipe();\n    assertNotNull(recipe);\n    assertEquals(recipe.getType(), KUBERNETES_COMPONENT_TYPE);\n    assertEquals(recipe.getContentType(), YAML_CONTENT_TYPE);\n\n    // it is expected that applier wrap original recipes objects in new Kubernetes list\n    KubernetesList expectedKubernetesList =\n        new KubernetesListBuilder().withItems(toK8SList(yamlRecipeContent).getItems()).build();\n    assertEquals(toK8SList(recipe.getContent()).getItems(), expectedKubernetesList.getItems());\n  }\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp = \"Environment already contains machine 'machine'\")\n  public void shouldThrowAnExceptionIfEnvironmentContainMachineWithSpecifiedName()\n      throws Exception {\n    // given\n    workspaceConfig.setDefaultEnv(\"default\");\n    workspaceConfig.setEnvironments(\n        ImmutableMap.of(\n            \"default\",\n            new EnvironmentImpl(null, ImmutableMap.of(\"machine\", new MachineConfigImpl()))));\n    // when\n    k8sEnvProvisioner.provision(\n        workspaceConfig,\n        KubernetesEnvironment.TYPE,\n        emptyList(),\n        ImmutableMap.of(\"machine\", new MachineConfigImpl()));\n  }\n\n  @Test\n  public void shouldUpgradeKubernetesEnvironmentToOpenShiftTypeOnOpenShiftComponentProvisioning()\n      throws Exception {\n    // given\n    workspaceConfig.setDefaultEnv(\"default\");\n    RecipeImpl existingRecipe =\n        new RecipeImpl(KubernetesEnvironment.TYPE, \"yaml\", \"existing-content\", null);\n    workspaceConfig\n        .getEnvironments()\n        .put(\"default\", new EnvironmentImpl(existingRecipe, emptyMap()));\n\n    List<HasMetadata> componentsObject = new ArrayList<>();\n    Deployment componentDeployment =\n        new DeploymentBuilder()\n            .withNewMetadata()\n            .withName(\"web-app\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    componentsObject.add(new DeploymentBuilder(componentDeployment).build());\n    doReturn(new ArrayList<>()).when(k8sRecipeParser).parse(anyString());\n\n    // when\n    k8sEnvProvisioner.provision(workspaceConfig, \"openshift\", componentsObject, emptyMap());\n\n    // then\n    EnvironmentImpl resultEnv =\n        workspaceConfig.getEnvironments().get(workspaceConfig.getDefaultEnv());\n    RecipeImpl resultRecipe = resultEnv.getRecipe();\n    assertEquals(resultRecipe.getType(), \"openshift\");\n  }\n\n  @Test\n  public void shouldProvisionComponentObjectsIntoExistingKubernetesRecipe() throws Exception {\n    // given\n    workspaceConfig.setDefaultEnv(\"default\");\n    RecipeImpl existingRecipe =\n        new RecipeImpl(KUBERNETES_COMPONENT_TYPE, \"yaml\", \"existing-content\", null);\n    workspaceConfig\n        .getEnvironments()\n        .put(\"default\", new EnvironmentImpl(existingRecipe, emptyMap()));\n\n    List<HasMetadata> recipeObjects = new ArrayList<>();\n    Deployment recipeDeployment =\n        new DeploymentBuilder()\n            .withNewMetadata()\n            .withName(\"db\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    recipeObjects.add(new DeploymentBuilder(recipeDeployment).build());\n    doReturn(recipeObjects).when(k8sRecipeParser).parse(anyString());\n\n    List<HasMetadata> componentsObject = new ArrayList<>();\n    Deployment componentDeployment =\n        new DeploymentBuilder()\n            .withNewMetadata()\n            .withName(\"web-app\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    componentsObject.add(new DeploymentBuilder(componentDeployment).build());\n\n    // when\n    k8sEnvProvisioner.provision(\n        workspaceConfig, KubernetesEnvironment.TYPE, componentsObject, emptyMap());\n\n    // then\n    // it is expected that applier wrap original recipes objects in new Kubernetes list\n    KubernetesList expectedKubernetesList =\n        new KubernetesListBuilder()\n            .withItems(Arrays.asList(recipeDeployment, componentDeployment))\n            .build();\n    EnvironmentImpl resultEnv =\n        workspaceConfig.getEnvironments().get(workspaceConfig.getDefaultEnv());\n    assertEquals(\n        toK8SList(resultEnv.getRecipe().getContent()).getItems(),\n        expectedKubernetesList.getItems());\n  }\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp =\n          \"Kubernetes component can only be applied to a workspace with any of kubernetes or openshift \"\n              + \"recipe type but workspace has a recipe of type 'any'\")\n  public void shouldThrowAnExceptionIfWorkspaceAlreadyContainNonK8sNorOSRecipe() throws Exception {\n    // given\n    workspaceConfig.setDefaultEnv(\"default\");\n    RecipeImpl existingRecipe = new RecipeImpl(\"any\", \"yaml\", \"existing-content\", null);\n    workspaceConfig\n        .getEnvironments()\n        .put(\"default\", new EnvironmentImpl(existingRecipe, emptyMap()));\n\n    List<HasMetadata> componentsObject = new ArrayList<>();\n    Deployment componentDeployment =\n        new DeploymentBuilder()\n            .withNewMetadata()\n            .withName(\"db\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    componentsObject.add(new DeploymentBuilder(componentDeployment).build());\n\n    // when\n    k8sEnvProvisioner.provision(\n        workspaceConfig, KubernetesEnvironment.TYPE, componentsObject, emptyMap());\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"Components can not have objects with the same name and kind \"\n              + \"but there are multiple objects with kind 'Service' and name 'db'\")\n  public void shouldThrowExceptionIfDifferentComponentsHaveObjectsWithTheSameKindAndName()\n      throws Exception {\n    // given\n    List<HasMetadata> componentsObject = new ArrayList<>();\n    Service service1 =\n        new ServiceBuilder()\n            .withNewMetadata()\n            .withName(\"db\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    Service service2 =\n        new ServiceBuilder()\n            .withNewMetadata()\n            .withName(\"db\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    componentsObject.add(new ServiceBuilder(service1).build());\n    componentsObject.add(new ServiceBuilder(service2).build());\n\n    // when\n    k8sEnvProvisioner.provision(\n        workspaceConfig, KubernetesEnvironment.TYPE, componentsObject, emptyMap());\n  }\n\n  @Test\n  public void shouldMergeProjectPVCIntoOne() throws Exception {\n    // given\n    PersistentVolumeClaim volumeClaim = newPVC(PROJECTS_VOLUME_NAME, \"ReadWriteMany\", \"1Gb\");\n    workspaceConfig.setDefaultEnv(\"default\");\n    RecipeImpl existingRecipe =\n        new RecipeImpl(\"kubernetes\", YAML_CONTENT_TYPE, Serialization.asYaml(volumeClaim), null);\n    doReturn(singletonList(volumeClaim)).when(k8sRecipeParser).parse(anyString());\n\n    workspaceConfig\n        .getEnvironments()\n        .put(\"default\", new EnvironmentImpl(existingRecipe, emptyMap()));\n\n    // try add same claim one more time (like another component adds it)\n    List<HasMetadata> componentsObject = new ArrayList<>();\n    componentsObject.add(volumeClaim);\n\n    // when\n    k8sEnvProvisioner.provision(\n        workspaceConfig, KubernetesEnvironment.TYPE, componentsObject, emptyMap());\n\n    // we still have only one PVC\n    EnvironmentImpl resultEnv =\n        workspaceConfig.getEnvironments().get(workspaceConfig.getDefaultEnv());\n    assertEquals(toK8SList(resultEnv.getRecipe().getContent()).getItems().size(), 1);\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"Components can not have objects with the same name and kind but there are multiple objects with kind 'Service' and name 'db'\")\n  public void shouldThrowExceptionIfComponentHasMultipleObjectsWithTheSameKindAndName()\n      throws Exception {\n    // given\n    List<HasMetadata> objects = new ArrayList<>();\n    Service service =\n        new ServiceBuilder()\n            .withNewMetadata()\n            .withName(\"db\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    objects.add(new ServiceBuilder(service).build());\n    objects.add(new ServiceBuilder(service).build());\n\n    // when\n    k8sEnvProvisioner.provision(workspaceConfig, KubernetesEnvironment.TYPE, objects, emptyMap());\n  }\n\n  private KubernetesList toK8SList(String content) {\n    return unmarshal(content, KubernetesList.class);\n  }\n\n  private String getResource(String resourceName) throws IOException {\n    return Files.readFile(getClass().getClassLoader().getResourceAsStream(resourceName));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/docker/auth/UserSpecificDockerRegistryCredentialsProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.docker.auth;\n\nimport static org.mockito.ArgumentMatchers.anyObject;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertNull;\n\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.user.server.PreferenceManager;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto.DockerAuthConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto.DockerAuthConfigs;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Mykola Morhun\n */\n@Listeners(MockitoTestNGListener.class)\npublic class UserSpecificDockerRegistryCredentialsProviderTest {\n\n  private static final String DOCKER_REGISTRY_CREDENTIALS_KEY = \"dockerCredentials\";\n\n  @Mock private PreferenceManager preferenceManager;\n\n  private UserSpecificDockerRegistryCredentialsProvider dockerCredentials;\n\n  @BeforeMethod\n  private void before() {\n    dockerCredentials = new UserSpecificDockerRegistryCredentialsProvider(preferenceManager);\n  }\n\n  @Test\n  public void shouldParseCredentialsFromUserPreferences() throws ServerException {\n    String base64encodedCredentials =\n        \"eyJyZWdpc3RyeS5jb206NTAwMCI6eyJ1c2VybmFtZSI6ImxvZ2luIiwicGFzc3dvcmQiOiJwYXNzIn19\";\n    setCredentialsIntoPreferences(base64encodedCredentials);\n    String registry = \"registry.com:5000\";\n    DockerAuthConfig dockerAuthConfig =\n        DtoFactory.newDto(DockerAuthConfig.class).withUsername(\"login\").withPassword(\"pass\");\n\n    DockerAuthConfigs parsedDockerAuthConfigs = dockerCredentials.getCredentials();\n\n    DockerAuthConfig parsedDockerAuthConfig = parsedDockerAuthConfigs.getConfigs().get(registry);\n\n    assertNotNull(parsedDockerAuthConfig);\n    assertEquals(parsedDockerAuthConfig.getUsername(), dockerAuthConfig.getUsername());\n    assertEquals(parsedDockerAuthConfig.getPassword(), dockerAuthConfig.getPassword());\n  }\n\n  @Test\n  public void shouldReturnNullIfDataFormatIsCorruptedInPreferences() throws ServerException {\n    String base64encodedCredentials = \"sdJfpwJwkek59kafj239lFfkHjhek5l1\";\n    setCredentialsIntoPreferences(base64encodedCredentials);\n\n    DockerAuthConfigs parsedDockerAuthConfigs = dockerCredentials.getCredentials();\n\n    assertNull(parsedDockerAuthConfigs);\n  }\n\n  @Test\n  public void shouldReturnNullIfDataFormatIsWrong() throws ServerException {\n    String base64encodedCredentials = \"eyJpbnZhbGlkIjoianNvbiJ9\";\n    setCredentialsIntoPreferences(base64encodedCredentials);\n\n    DockerAuthConfigs parsedDockerAuthConfigs = dockerCredentials.getCredentials();\n\n    assertNull(parsedDockerAuthConfigs);\n  }\n\n  @Test\n  public void shouldReturnConfigsWithEmptyMapIfNoCredentialsDataInUserPreferences()\n      throws ServerException {\n    String base64encodedCredentials = \"e30=\";\n    setCredentialsIntoPreferences(base64encodedCredentials);\n\n    DockerAuthConfigs parsedDockerAuthConfigs = dockerCredentials.getCredentials();\n\n    assertEquals(parsedDockerAuthConfigs.getConfigs().size(), 0);\n  }\n\n  private void setCredentialsIntoPreferences(String base64encodedCredentials)\n      throws ServerException {\n    Map<String, String> preferences = new HashMap<>();\n    preferences.put(DOCKER_REGISTRY_CREDENTIALS_KEY, base64encodedCredentials);\n\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"name\", Collections.emptyList(), \"id\", \"token1234\", false));\n    when(preferenceManager.find(anyObject(), anyObject())).thenReturn(preferences);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/CheInstallationLocationTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment;\n\nimport static org.testng.Assert.*;\n\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.testng.annotations.Test;\n\npublic class CheInstallationLocationTest {\n  @Test\n  public void returnKubernetesNamespaceWhenBothSet() throws InfrastructureException {\n    CheInstallationLocation cheInstallationLocation = new CheInstallationLocation();\n    cheInstallationLocation.kubernetesNamespace = \"kube\";\n    cheInstallationLocation.podNamespace = \"pod\";\n    assertEquals(cheInstallationLocation.getInstallationLocationNamespace(), \"kube\");\n  }\n\n  @Test\n  public void returnKubernetesNamespaceWhenItsOnlySet() throws InfrastructureException {\n    CheInstallationLocation cheInstallationLocation = new CheInstallationLocation();\n    cheInstallationLocation.kubernetesNamespace = \"kube\";\n    cheInstallationLocation.podNamespace = null;\n    assertEquals(cheInstallationLocation.getInstallationLocationNamespace(), \"kube\");\n  }\n\n  @Test\n  public void returnPodNamespaceWhenKubernetesNamespaceNotSet() throws InfrastructureException {\n    CheInstallationLocation cheInstallationLocation = new CheInstallationLocation();\n    cheInstallationLocation.kubernetesNamespace = null;\n    cheInstallationLocation.podNamespace = \"pod\";\n    assertEquals(cheInstallationLocation.getInstallationLocationNamespace(), \"pod\");\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void throwExceptionWhenNoneSet() throws InfrastructureException {\n    CheInstallationLocation cheInstallationLocation = new CheInstallationLocation();\n    cheInstallationLocation.kubernetesNamespace = null;\n    cheInstallationLocation.podNamespace = null;\n    cheInstallationLocation.getInstallationLocationNamespace();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/KubernetesEnvironmentFactoryTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment;\n\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Warnings.INGRESSES_IGNORED_WARNING_CODE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Warnings.INGRESSES_IGNORED_WARNING_MESSAGE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.environment.PodMerger.DEPLOYMENT_NAME_LABEL;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaim;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaimBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.PodTemplateSpec;\nimport io.fabric8.kubernetes.api.model.PodTemplateSpecBuilder;\nimport io.fabric8.kubernetes.api.model.Quantity;\nimport io.fabric8.kubernetes.api.model.ResourceRequirements;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServiceBuilder;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBuilder;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.workspace.server.model.impl.WarningImpl;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironment;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalRecipe;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link KubernetesEnvironmentFactory}.\n *\n * @author Anton Korneta\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesEnvironmentFactoryTest {\n\n  public static final String MACHINE_NAME_1 = \"machine1\";\n  public static final String MACHINE_NAME_2 = \"machine2\";\n\n  private KubernetesEnvironmentFactory k8sEnvFactory;\n\n  @Mock private KubernetesEnvironmentValidator k8sEnvValidator;\n  @Mock private InternalEnvironment internalEnvironment;\n  @Mock private InternalRecipe internalRecipe;\n  @Mock private InternalMachineConfig machineConfig1;\n  @Mock private InternalMachineConfig machineConfig2;\n  @Mock private KubernetesRecipeParser k8sRecipeParser;\n  @Mock private PodMerger podMerger;\n\n  @BeforeMethod\n  public void setup() throws Exception {\n    k8sEnvFactory =\n        new KubernetesEnvironmentFactory(null, null, k8sRecipeParser, k8sEnvValidator, podMerger);\n    lenient().when(internalEnvironment.getRecipe()).thenReturn(internalRecipe);\n  }\n\n  @Test\n  public void shouldCreateK8sEnvironmentWithServicesFromRecipe() throws Exception {\n    // given\n    Service service1 =\n        new ServiceBuilder().withNewMetadata().withName(\"service1\").endMetadata().build();\n    Service service2 =\n        new ServiceBuilder().withNewMetadata().withName(\"service2\").endMetadata().build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(asList(service1, service2));\n\n    // when\n    KubernetesEnvironment k8sEnv = k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    assertEquals(k8sEnv.getServices().size(), 2);\n    assertEquals(k8sEnv.getServices().get(\"service1\"), service1);\n    assertEquals(k8sEnv.getServices().get(\"service2\"), service2);\n  }\n\n  @Test\n  public void shouldCreateK8sEnvironmentWithPVCsFromRecipe() throws Exception {\n    // given\n    PersistentVolumeClaim pvc1 =\n        new PersistentVolumeClaimBuilder().withNewMetadata().withName(\"pvc1\").endMetadata().build();\n    PersistentVolumeClaim pvc2 =\n        new PersistentVolumeClaimBuilder().withNewMetadata().withName(\"pvc2\").endMetadata().build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(asList(pvc1, pvc2));\n\n    // when\n    KubernetesEnvironment k8sEnv = k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    assertEquals(k8sEnv.getPersistentVolumeClaims().size(), 2);\n    assertEquals(k8sEnv.getPersistentVolumeClaims().get(\"pvc1\"), pvc1);\n    assertEquals(k8sEnv.getPersistentVolumeClaims().get(\"pvc2\"), pvc2);\n  }\n\n  @Test\n  public void ignoreIgressesWhenRecipeContainsThem() throws Exception {\n    when(k8sRecipeParser.parse(any(InternalRecipe.class)))\n        .thenReturn(\n            asList(\n                new IngressBuilder().withNewMetadata().withName(\"ingress1\").endMetadata().build(),\n                new IngressBuilder().withNewMetadata().withName(\"ingress2\").endMetadata().build()));\n\n    final KubernetesEnvironment parsed =\n        k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    assertTrue(parsed.getIngresses().isEmpty());\n    assertEquals(parsed.getWarnings().size(), 1);\n    assertEquals(\n        parsed.getWarnings().get(0),\n        new WarningImpl(INGRESSES_IGNORED_WARNING_CODE, INGRESSES_IGNORED_WARNING_MESSAGE));\n  }\n\n  @Test\n  public void addSecretsWhenRecipeContainsThem() throws Exception {\n    Secret secret =\n        new SecretBuilder().withNewMetadata().withName(\"test-secret\").endMetadata().build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(secret));\n\n    final KubernetesEnvironment parsed =\n        k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    assertEquals(parsed.getSecrets().size(), 1);\n    assertEquals(\n        parsed.getSecrets().get(\"test-secret\").getMetadata().getName(),\n        secret.getMetadata().getName());\n  }\n\n  @Test\n  public void addConfigMapsWhenRecipeContainsThem() throws Exception {\n    ConfigMap configMap =\n        new ConfigMapBuilder().withNewMetadata().withName(\"test-configmap\").endMetadata().build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(configMap));\n\n    final KubernetesEnvironment parsed =\n        k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    assertEquals(parsed.getConfigMaps().size(), 1);\n    assertEquals(parsed.getConfigMaps().get(\"test-configmap\"), configMap);\n  }\n\n  @Test\n  public void addPodsWhenRecipeContainsThem() throws Exception {\n    // given\n    Pod pod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"pod\")\n            .endMetadata()\n            .withSpec(new PodSpec())\n            .build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(pod));\n\n    // when\n    KubernetesEnvironment k8sEnv = k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    assertEquals(k8sEnv.getPodsCopy().size(), 1);\n    assertEquals(k8sEnv.getPodsCopy().get(\"pod\"), pod);\n\n    assertEquals(k8sEnv.getPodsData().size(), 1);\n    assertEquals(k8sEnv.getPodsData().get(\"pod\").getMetadata(), pod.getMetadata());\n    assertEquals(k8sEnv.getPodsData().get(\"pod\").getSpec(), pod.getSpec());\n  }\n\n  @Test\n  public void addDeploymentsWhenRecipeContainsThem() throws Exception {\n    // given\n    PodTemplateSpec podTemplate =\n        new PodTemplateSpecBuilder()\n            .withNewMetadata()\n            .withName(\"deployment-pod\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    Deployment deployment =\n        new DeploymentBuilder()\n            .withNewMetadata()\n            .withName(\"deployment-test\")\n            .endMetadata()\n            .withNewSpec()\n            .withTemplate(podTemplate)\n            .endSpec()\n            .build();\n\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(deployment));\n\n    // when\n    final KubernetesEnvironment k8sEnv =\n        k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    assertEquals(k8sEnv.getDeploymentsCopy().size(), 1);\n    assertEquals(k8sEnv.getDeploymentsCopy().get(\"deployment-test\"), deployment);\n\n    assertEquals(k8sEnv.getPodsData().size(), 1);\n    assertEquals(\n        k8sEnv.getPodsData().get(\"deployment-test\").getMetadata(), podTemplate.getMetadata());\n    assertEquals(k8sEnv.getPodsData().get(\"deployment-test\").getSpec(), podTemplate.getSpec());\n  }\n\n  @Test\n  public void shouldUseDeploymentNameAsPodTemplateNameIfItIsMissing() throws Exception {\n    // given\n    PodTemplateSpec podTemplate = new PodTemplateSpecBuilder().withNewSpec().endSpec().build();\n    Deployment deployment =\n        new DeploymentBuilder()\n            .withNewMetadata()\n            .withName(\"deployment-test\")\n            .endMetadata()\n            .withNewSpec()\n            .withTemplate(podTemplate)\n            .endSpec()\n            .build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(asList(deployment));\n\n    // when\n    final KubernetesEnvironment k8sEnv =\n        k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    Deployment deploymentTest = k8sEnv.getDeploymentsCopy().get(\"deployment-test\");\n    assertNotNull(deploymentTest);\n    PodTemplateSpec resultPodTemplate = deploymentTest.getSpec().getTemplate();\n    assertEquals(resultPodTemplate.getMetadata().getName(), \"deployment-test\");\n  }\n\n  @Test\n  public void shouldMergeDeploymentAndPodIntoOneDeployment() throws Exception {\n    // given\n    PodTemplateSpec podTemplate =\n        new PodTemplateSpecBuilder()\n            .withNewMetadata()\n            .withName(\"deployment-pod\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    Deployment deployment =\n        new DeploymentBuilder()\n            .withNewMetadata()\n            .withName(\"deployment-test\")\n            .endMetadata()\n            .withNewSpec()\n            .withTemplate(podTemplate)\n            .endSpec()\n            .build();\n    Pod pod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"bare-pod\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(asList(deployment, pod));\n    Deployment merged = createEmptyDeployment(\"merged\");\n    when(podMerger.merge(any())).thenReturn(merged);\n\n    // when\n    final KubernetesEnvironment k8sEnv =\n        k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    verify(podMerger).merge(asList(new PodData(pod), new PodData(deployment)));\n    assertEquals(k8sEnv.getPodsData().size(), 1);\n\n    assertTrue(k8sEnv.getPodsCopy().isEmpty());\n\n    assertEquals(k8sEnv.getDeploymentsCopy().size(), 1);\n    assertEquals(k8sEnv.getDeploymentsCopy().get(\"merged\"), merged);\n  }\n\n  @Test\n  public void shouldReconfigureServiceToMatchMergedDeployment() throws Exception {\n    // given\n    Pod pod1 =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"bare-pod1\")\n            .withLabels(ImmutableMap.of(\"name\", \"pod1\"))\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    Pod pod2 =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"bare-pod2\")\n            .withLabels(ImmutableMap.of(\"name\", \"pod2\"))\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    Service service1 =\n        new ServiceBuilder()\n            .withNewMetadata()\n            .withName(\"pod1-service\")\n            .endMetadata()\n            .withNewSpec()\n            .withSelector(ImmutableMap.of(\"name\", \"pod1\"))\n            .endSpec()\n            .build();\n    Service service2 =\n        new ServiceBuilder()\n            .withNewMetadata()\n            .withName(\"pod2-service\")\n            .endMetadata()\n            .withNewSpec()\n            .withSelector(ImmutableMap.of(\"name\", \"pod2\"))\n            .endSpec()\n            .build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class)))\n        .thenReturn(asList(pod1, pod2, service1, service2));\n    Deployment merged = createEmptyDeployment(\"merged\");\n    when(podMerger.merge(any())).thenReturn(merged);\n\n    // when\n    final KubernetesEnvironment k8sEnv =\n        k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    verify(podMerger).merge(asList(new PodData(pod1), new PodData(pod2)));\n    PodData mergedPodData = k8sEnv.getPodsData().get(\"merged\");\n    assertEquals(mergedPodData.getMetadata().getLabels().get(DEPLOYMENT_NAME_LABEL), \"merged\");\n    assertTrue(\n        k8sEnv.getServices().values().stream()\n            .allMatch(\n                s ->\n                    ImmutableMap.of(DEPLOYMENT_NAME_LABEL, \"merged\")\n                        .equals(s.getSpec().getSelector())));\n  }\n\n  @Test(expectedExceptions = ValidationException.class)\n  public void exceptionOnRecipeLoadError() throws Exception {\n    when(k8sRecipeParser.parse(any(InternalRecipe.class)))\n        .thenThrow(new ValidationException(\"Could not parse recipe\"));\n\n    k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Environment can not contain two 'Service' objects with the same name 'db'\")\n  public void exceptionOnObjectsWithTheSameNameAndKind() throws Exception {\n    HasMetadata object1 =\n        new ServiceBuilder().withNewMetadata().withName(\"db\").endMetadata().build();\n    HasMetadata object2 =\n        new ServiceBuilder().withNewMetadata().withName(\"db\").endMetadata().build();\n\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(asList(object1, object2));\n\n    k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Environment contains object without specified kind field\")\n  public void exceptionOnObjectWithNoKindSpecified() throws Exception {\n    HasMetadata object = mock(HasMetadata.class);\n    when(object.getKind()).thenReturn(null);\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(object));\n\n    k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"MyObject metadata must not be null\")\n  public void exceptionOnObjectWithNoMetadataSpecified() throws Exception {\n    HasMetadata object = mock(HasMetadata.class);\n    when(object.getKind()).thenReturn(\"MyObject\");\n    when(object.getMetadata()).thenReturn(null);\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(object));\n\n    k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"MyObject name must not be null\")\n  public void exceptionOnObjectWithNoNameSpecified() throws Exception {\n    HasMetadata object = mock(HasMetadata.class);\n    when(object.getKind()).thenReturn(\"MyObject\");\n    when(object.getMetadata()).thenReturn(new ObjectMetaBuilder().withName(null).build());\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(object));\n\n    k8sEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n  }\n\n  private static PodData createPodData(String machineName, long ramLimit, long ramRequest) {\n    final String containerName = \"container_\" + machineName;\n    final Container containerMock = mock(Container.class);\n    final ResourceRequirements resourcesMock = mock(ResourceRequirements.class);\n    final Quantity limitQuantityMock = mock(Quantity.class);\n    final Quantity requestQuantityMock = mock(Quantity.class);\n    final PodSpec specMock = mock(PodSpec.class);\n    final ObjectMeta metadataMock = mock(ObjectMeta.class);\n    when(limitQuantityMock.getAmount()).thenReturn(String.valueOf(ramLimit));\n    when(requestQuantityMock.getAmount()).thenReturn(String.valueOf(ramRequest));\n    when(resourcesMock.getLimits()).thenReturn(ImmutableMap.of(\"memory\", limitQuantityMock));\n    when(resourcesMock.getRequests()).thenReturn(ImmutableMap.of(\"memory\", requestQuantityMock));\n    when(containerMock.getName()).thenReturn(containerName);\n    when(containerMock.getResources()).thenReturn(resourcesMock);\n    when(metadataMock.getAnnotations())\n        .thenReturn(Names.createMachineNameAnnotations(containerName, machineName));\n    when(specMock.getContainers()).thenReturn(ImmutableList.of(containerMock));\n    return new PodData(specMock, metadataMock);\n  }\n\n  private Deployment createEmptyDeployment(String name) {\n    return new DeploymentBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .endMetadata()\n        .withNewSpec()\n        .withNewTemplate()\n        .withNewMetadata()\n        .endMetadata()\n        .withNewSpec()\n        .endSpec()\n        .endTemplate()\n        .endSpec()\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/KubernetesEnvironmentPodsValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport io.fabric8.kubernetes.api.model.VolumeMountBuilder;\nimport java.util.Arrays;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link KubernetesEnvironmentPodsValidator}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesEnvironmentPodsValidatorTest {\n\n  @Mock private KubernetesEnvironment kubernetesEnvironment;\n\n  private KubernetesEnvironmentPodsValidator podsValidator;\n\n  @BeforeMethod\n  public void setUp() {\n    podsValidator = new KubernetesEnvironmentPodsValidator();\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Environment should contain at least 1 pod or deployment\")\n  public void shouldThrowExceptionWhenEnvDoesNotHaveAnyPods() throws Exception {\n    // given\n    when(kubernetesEnvironment.getPodsData()).thenReturn(emptyMap());\n\n    // when\n    podsValidator.validate(kubernetesEnvironment);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Environment contains machines that are missing in recipe: pod1/db\")\n  public void shouldThrowExceptionWhenMachineIsDeclaredButThereIsNotContainerInKubernetesRecipe()\n      throws Exception {\n    // given\n    String podName = \"pod1\";\n    Pod pod = createPod(\"pod1\", \"main\");\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    when(kubernetesEnvironment.getPodsData()).thenReturn(ImmutableMap.of(podName, podData));\n    when(kubernetesEnvironment.getMachines())\n        .thenReturn(ImmutableMap.of(podName + \"/db\", mock(InternalMachineConfig.class)));\n\n    // when\n    podsValidator.validate(kubernetesEnvironment);\n  }\n\n  @Test\n  public void shouldPassWhenMachineIsDeclaredAndIsInitContainerInKubernetesRecipe()\n      throws Exception {\n    // given\n    String podName = \"pod1\";\n    Pod pod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(podName)\n            .endMetadata()\n            .withNewSpec()\n            .withInitContainers(singletonList(createContainer(\"init\")))\n            .endSpec()\n            .build();\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    when(kubernetesEnvironment.getPodsData()).thenReturn(ImmutableMap.of(podName, podData));\n    when(kubernetesEnvironment.getMachines())\n        .thenReturn(ImmutableMap.of(podName + \"/init\", mock(InternalMachineConfig.class)));\n\n    // when\n    podsValidator.validate(kubernetesEnvironment);\n\n    // then\n    // no exception means machine matches init container - it's expected\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Environment contains pod with missing metadata\")\n  public void shouldThrowExceptionWhenPodHasNoMetadata() throws Exception {\n    // given\n    PodData podData = new PodData(new PodSpec(), null);\n    when(kubernetesEnvironment.getPodsData()).thenReturn(ImmutableMap.of(\"\", podData));\n\n    // when\n    podsValidator.validate(kubernetesEnvironment);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Pod 'pod1' with missing metadata\")\n  public void shouldThrowExceptionWhenPodHasNoSpec() throws Exception {\n    // given\n    PodData podData = new PodData(null, new ObjectMetaBuilder().withName(\"pod1\").build());\n    when(kubernetesEnvironment.getPodsData()).thenReturn(ImmutableMap.of(\"pod1\", podData));\n\n    // when\n    podsValidator.validate(kubernetesEnvironment);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Pod 'pod1' contains volume 'user-data' with PVC sources that references missing PVC 'non-existing'\")\n  public void shouldThrowExceptionWhenPodHasVolumeThatReferencesMissingPVC() throws Exception {\n    // given\n    String podName = \"pod1\";\n    Pod pod = createPod(\"pod1\", \"main\");\n    pod.getSpec()\n        .getVolumes()\n        .add(\n            new VolumeBuilder()\n                .withName(\"user-data\")\n                .withNewPersistentVolumeClaim()\n                .withClaimName(\"non-existing\")\n                .endPersistentVolumeClaim()\n                .build());\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    when(kubernetesEnvironment.getPodsData()).thenReturn(ImmutableMap.of(podName, podData));\n    when(kubernetesEnvironment.getMachines())\n        .thenReturn(ImmutableMap.of(podName + \"/main\", mock(InternalMachineConfig.class)));\n\n    // when\n    podsValidator.validate(kubernetesEnvironment);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Container 'main' in pod 'pod1' contains volume mount that references missing volume 'non-existing'\")\n  public void shouldThrowExceptionWhenContainerHasVolumeMountThatReferencesMissingPodVolume()\n      throws Exception {\n    // given\n    String podName = \"pod1\";\n    Pod pod = createPod(\"pod1\", \"main\");\n    pod.getSpec()\n        .getContainers()\n        .get(0)\n        .getVolumeMounts()\n        .add(new VolumeMountBuilder().withName(\"non-existing\").withMountPath(\"/tmp/data\").build());\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    when(kubernetesEnvironment.getPodsData()).thenReturn(ImmutableMap.of(podName, podData));\n    when(kubernetesEnvironment.getMachines())\n        .thenReturn(ImmutableMap.of(podName + \"/main\", mock(InternalMachineConfig.class)));\n\n    // when\n    podsValidator.validate(kubernetesEnvironment);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Container 'foo' in pod 'pod1' contains volume mount that references missing volume 'non-existing'\")\n  public void shouldThrowExceptionWhenInitContainerHasVolumeMountThatReferencesMissingPodVolume()\n      throws Exception {\n    // given\n    String podName = \"pod1\";\n    Pod pod = createPod(\"pod1\", \"main\");\n    pod.getSpec()\n        .getInitContainers()\n        .add(\n            new ContainerBuilder()\n                .withName(\"foo\")\n                .withVolumeMounts(\n                    new VolumeMountBuilder()\n                        .withName(\"non-existing\")\n                        .withMountPath(\"/tmp/data\")\n                        .build())\n                .build());\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    when(kubernetesEnvironment.getPodsData()).thenReturn(ImmutableMap.of(podName, podData));\n    when(kubernetesEnvironment.getMachines())\n        .thenReturn(ImmutableMap.of(podName + \"/main\", mock(InternalMachineConfig.class)));\n\n    // when\n    podsValidator.validate(kubernetesEnvironment);\n  }\n\n  private Pod createPod(String name, String... containers) {\n    return new PodBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .endMetadata()\n        .withNewSpec()\n        .withContainers(\n            Arrays.stream(containers).map(this::createContainer).collect(Collectors.toList()))\n        .endSpec()\n        .build();\n  }\n\n  private Container createContainer(String name) {\n    return new ContainerBuilder().withName(name).build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/KubernetesEnvironmentValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment;\n\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link KubernetesEnvironmentValidator}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesEnvironmentValidatorTest {\n  @Mock private KubernetesEnvironmentPodsValidator podsValidator;\n\n  @Mock private KubernetesEnvironment kubernetesEnvironment;\n\n  @InjectMocks private KubernetesEnvironmentValidator environmentValidator;\n\n  @Test\n  public void shouldPerformChecksOnEnvironmentValidation() throws Exception {\n    // when\n    environmentValidator.validate(kubernetesEnvironment);\n\n    // then\n    podsValidator.validate(kubernetesEnvironment);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/PodMergerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment;\n\nimport static org.eclipse.che.api.workspace.shared.Constants.PROJECTS_VOLUME_NAME;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.LocalObjectReference;\nimport io.fabric8.kubernetes.api.model.LocalObjectReferenceBuilder;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.PodSecurityContext;\nimport io.fabric8.kubernetes.api.model.PodSecurityContextBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.PodSpecBuilder;\nimport io.fabric8.kubernetes.api.model.PodTemplateSpec;\nimport io.fabric8.kubernetes.api.model.Toleration;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link PodMerger}.\n *\n * @author Sergii Leshchenko\n */\npublic class PodMergerTest {\n\n  private PodMerger podMerger;\n\n  @BeforeMethod\n  public void setUp() {\n    podMerger = new PodMerger();\n  }\n\n  @Test\n  public void shouldMergeMetasOfPodsData() throws Exception {\n    // given\n    ObjectMeta podMeta1 =\n        new ObjectMetaBuilder()\n            .withName(\"ignored-1\")\n            .withAnnotations(ImmutableMap.of(\"ann1\", \"v1\"))\n            .withLabels(ImmutableMap.of(\"label1\", \"v1\"))\n            .build();\n    podMeta1.setAdditionalProperty(\"add1\", 1L);\n    PodData podData1 = new PodData(new PodSpecBuilder().build(), podMeta1);\n\n    ObjectMeta podMeta2 =\n        new ObjectMetaBuilder()\n            .withName(\"ignored-2\")\n            .withAnnotations(ImmutableMap.of(\"ann2\", \"v2\"))\n            .withLabels(ImmutableMap.of(\"label2\", \"v2\"))\n            .build();\n    podMeta2.setAdditionalProperty(\"add2\", 2L);\n    PodData podData2 = new PodData(new PodSpecBuilder().build(), podMeta2);\n\n    // when\n    Deployment merged = podMerger.merge(Arrays.asList(podData1, podData2));\n\n    // then\n    PodTemplateSpec podTemplate = merged.getSpec().getTemplate();\n    ObjectMeta podMeta = podTemplate.getMetadata();\n    verifyContainsAllFrom(podMeta, podData1.getMetadata());\n    verifyContainsAllFrom(podMeta, podData2.getMetadata());\n  }\n\n  @Test\n  public void shouldMatchMergedPodTemplateLabelsWithDeploymentSelector() throws Exception {\n    // given\n    ObjectMeta podMeta1 =\n        new ObjectMetaBuilder()\n            .withName(\"ignored-1\")\n            .withAnnotations(ImmutableMap.of(\"ann1\", \"v1\"))\n            .withLabels(ImmutableMap.of(\"label1\", \"v1\"))\n            .build();\n    podMeta1.setAdditionalProperty(\"add1\", 1L);\n    PodData podData1 = new PodData(new PodSpecBuilder().build(), podMeta1);\n\n    // when\n    Deployment merged = podMerger.merge(Collections.singletonList(podData1));\n\n    // then\n    PodTemplateSpec podTemplate = merged.getSpec().getTemplate();\n    ObjectMeta podMeta = podTemplate.getMetadata();\n    Map<String, String> deploymentSelector = merged.getSpec().getSelector().getMatchLabels();\n    assertTrue(podMeta.getLabels().entrySet().containsAll(deploymentSelector.entrySet()));\n  }\n\n  @Test\n  public void shouldMergeSpecsOfPodsData() throws Exception {\n    // given\n    PodSpec podSpec1 =\n        new PodSpecBuilder()\n            .withContainers(new ContainerBuilder().withName(\"c1\").build())\n            .withInitContainers(new ContainerBuilder().withName(\"initC1\").build())\n            .withVolumes(new VolumeBuilder().withName(\"v1\").build())\n            .withNodeSelector(Map.of(\"foo1\", \"bar1\"))\n            .withImagePullSecrets(new LocalObjectReferenceBuilder().withName(\"secret1\").build())\n            .withTolerations(new Toleration(\"Effect\", \"key\", \"operator\", 0L, \"value1\"))\n            .build();\n    podSpec1.setAdditionalProperty(\"add1\", 1L);\n    PodData podData1 = new PodData(podSpec1, new ObjectMetaBuilder().build());\n\n    PodSpec podSpec2 =\n        new PodSpecBuilder()\n            .withContainers(new ContainerBuilder().withName(\"c2\").build())\n            .withInitContainers(new ContainerBuilder().withName(\"initC2\").build())\n            .withVolumes(new VolumeBuilder().withName(\"v2\").build())\n            .withNodeSelector(Map.of(\"foo2\", \"bar2\"))\n            .withImagePullSecrets(new LocalObjectReferenceBuilder().withName(\"secret2\").build())\n            .withTolerations(\n                new Toleration(\"Effect\", \"key\", \"operator\", 0L, \"value1\"),\n                new Toleration(\"Effect\", \"key\", \"operator\", 0L, \"value2\"))\n            .build();\n    podSpec2.setAdditionalProperty(\"add2\", 2L);\n    PodData podData2 = new PodData(podSpec2, new ObjectMetaBuilder().build());\n\n    // when\n    Deployment merged = podMerger.merge(Arrays.asList(podData1, podData2));\n\n    // then\n    PodTemplateSpec podTemplate = merged.getSpec().getTemplate();\n    verifyContainsAllFrom(podTemplate.getSpec(), podData1.getSpec());\n    verifyContainsAllFrom(podTemplate.getSpec(), podData2.getSpec());\n  }\n\n  @Test\n  public void shouldGenerateContainerNamesIfCollisionHappened() throws Exception {\n    // given\n    PodSpec podSpec1 =\n        new PodSpecBuilder().withContainers(new ContainerBuilder().withName(\"c\").build()).build();\n    PodData podData1 = new PodData(podSpec1, new ObjectMetaBuilder().build());\n\n    PodSpec podSpec2 =\n        new PodSpecBuilder().withContainers(new ContainerBuilder().withName(\"c\").build()).build();\n    PodData podData2 = new PodData(podSpec2, new ObjectMetaBuilder().build());\n\n    // when\n    Deployment merged = podMerger.merge(Arrays.asList(podData1, podData2));\n\n    // then\n    PodTemplateSpec podTemplate = merged.getSpec().getTemplate();\n    List<Container> containers = podTemplate.getSpec().getContainers();\n    assertEquals(containers.size(), 2);\n    Container container1 = containers.get(0);\n    assertEquals(container1.getName(), \"c\");\n    Container container2 = containers.get(1);\n    assertNotEquals(container2.getName(), \"c\");\n    assertTrue(container2.getName().startsWith(\"c\"));\n  }\n\n  @Test\n  public void shouldGenerateInitContainerNamesIfCollisionHappened() throws Exception {\n    // given\n    PodSpec podSpec1 =\n        new PodSpecBuilder()\n            .withInitContainers(new ContainerBuilder().withName(\"initC\").build())\n            .build();\n    PodData podData1 = new PodData(podSpec1, new ObjectMetaBuilder().build());\n\n    PodSpec podSpec2 =\n        new PodSpecBuilder()\n            .withInitContainers(new ContainerBuilder().withName(\"initC\").build())\n            .build();\n    PodData podData2 = new PodData(podSpec2, new ObjectMetaBuilder().build());\n    // when\n    Deployment merged = podMerger.merge(Arrays.asList(podData1, podData2));\n\n    // then\n    PodTemplateSpec podTemplate = merged.getSpec().getTemplate();\n    List<Container> initContainers = podTemplate.getSpec().getInitContainers();\n    assertEquals(initContainers.size(), 2);\n    Container container1 = initContainers.get(0);\n    assertEquals(container1.getName(), \"initC\");\n    Container container2 = initContainers.get(1);\n    assertNotEquals(container2.getName(), \"initC\");\n    assertTrue(container2.getName().startsWith(\"initC\"));\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Pods have to have volumes with unique names but there are multiple `volume` volumes\")\n  public void shouldThrownAnExceptionIfVolumeNameCollisionHappened() throws Exception {\n    // given\n    PodSpec podSpec1 =\n        new PodSpecBuilder().withVolumes(new VolumeBuilder().withName(\"volume\").build()).build();\n    podSpec1.setAdditionalProperty(\"add1\", 1L);\n    PodData podData1 = new PodData(podSpec1, new ObjectMetaBuilder().build());\n\n    PodSpec podSpec2 =\n        new PodSpecBuilder().withVolumes(new VolumeBuilder().withName(\"volume\").build()).build();\n    podSpec2.setAdditionalProperty(\"add2\", 2L);\n    PodData podData2 = new PodData(podSpec2, new ObjectMetaBuilder().build());\n\n    // when\n    podMerger.merge(Arrays.asList(podData1, podData2));\n  }\n\n  @Test\n  public void shouldMergeProjectVolumesWithoutException() throws Exception {\n    // given\n    PodSpec podSpec1 =\n        new PodSpecBuilder()\n            .withVolumes(new VolumeBuilder().withName(PROJECTS_VOLUME_NAME).build())\n            .build();\n    podSpec1.setAdditionalProperty(\"add1\", 1L);\n    PodData podData1 = new PodData(podSpec1, new ObjectMetaBuilder().build());\n\n    PodSpec podSpec2 =\n        new PodSpecBuilder()\n            .withVolumes(new VolumeBuilder().withName(PROJECTS_VOLUME_NAME).build())\n            .build();\n    podSpec2.setAdditionalProperty(\"add2\", 2L);\n    PodData podData2 = new PodData(podSpec2, new ObjectMetaBuilder().build());\n\n    // when\n    Deployment merged = podMerger.merge(Arrays.asList(podData1, podData2));\n\n    // then\n    PodTemplateSpec podTemplate = merged.getSpec().getTemplate();\n    assertEquals(podTemplate.getSpec().getVolumes().size(), 1);\n  }\n\n  @Test\n  public void shouldNotAddImagePullPolicyTwice() throws Exception {\n    // given\n    PodSpec podSpec1 =\n        new PodSpecBuilder()\n            .withImagePullSecrets(new LocalObjectReferenceBuilder().withName(\"secret\").build())\n            .build();\n    podSpec1.setAdditionalProperty(\"add1\", 1L);\n    PodData podData1 = new PodData(podSpec1, new ObjectMetaBuilder().build());\n\n    PodSpec podSpec2 =\n        new PodSpecBuilder()\n            .withImagePullSecrets(new LocalObjectReferenceBuilder().withName(\"secret\").build())\n            .build();\n    podSpec2.setAdditionalProperty(\"add2\", 2L);\n    PodData podData2 = new PodData(podSpec2, new ObjectMetaBuilder().build());\n\n    // when\n    Deployment merged = podMerger.merge(Arrays.asList(podData1, podData2));\n\n    // then\n    PodTemplateSpec podTemplate = merged.getSpec().getTemplate();\n    List<LocalObjectReference> imagePullSecrets = podTemplate.getSpec().getImagePullSecrets();\n    assertEquals(imagePullSecrets.size(), 1);\n    assertEquals(imagePullSecrets.get(0).getName(), \"secret\");\n  }\n\n  @Test(dataProvider = \"terminationGracePeriodProvider\")\n  public void shouldBeAbleToMergeTerminationGracePeriodS(\n      List<Long> terminationGracePeriods, Long expectedResultLong) throws ValidationException {\n    List<PodData> podData =\n        terminationGracePeriods.stream()\n            .map(\n                p ->\n                    new PodData(\n                        new PodSpecBuilder().withTerminationGracePeriodSeconds(p).build(),\n                        new ObjectMetaBuilder().build()))\n            .collect(Collectors.toList());\n\n    // when\n    Deployment merged = podMerger.merge(podData);\n    // then\n    PodTemplateSpec podTemplate = merged.getSpec().getTemplate();\n    assertEquals(podTemplate.getSpec().getTerminationGracePeriodSeconds(), expectedResultLong);\n  }\n\n  @DataProvider(name = \"terminationGracePeriodProvider\")\n  public Object[][] terminationGracePeriodProvider() {\n    return new Object[][] {\n      {Arrays.asList(32L, 30L, 27L), 32L},\n      {Arrays.asList(null, null, null), null},\n      {Arrays.asList(null, 30L, 27L), 30L},\n      {Arrays.asList(32L, null, 27L), 32L},\n      {Arrays.asList(null, 27L), 27L},\n      {Arrays.asList(27L, 27L), 27L},\n      {Arrays.asList(27L, null), 27L}\n    };\n  }\n\n  @Test\n  public void shouldAssignSecurityContextSharedByPods() throws Exception {\n    // given\n    PodSpec podSpec1 =\n        new PodSpecBuilder()\n            .withSecurityContext(new PodSecurityContextBuilder().withRunAsUser(42L).build())\n            .build();\n    podSpec1.setAdditionalProperty(\"add1\", 1L);\n    PodData podData1 = new PodData(podSpec1, new ObjectMetaBuilder().build());\n\n    PodSpec podSpec2 =\n        new PodSpecBuilder()\n            .withSecurityContext(new PodSecurityContextBuilder().withRunAsUser(42L).build())\n            .build();\n    podSpec2.setAdditionalProperty(\"add2\", 2L);\n    PodData podData2 = new PodData(podSpec2, new ObjectMetaBuilder().build());\n\n    // when\n    Deployment merged = podMerger.merge(Arrays.asList(podData1, podData2));\n\n    // then\n    PodTemplateSpec podTemplate = merged.getSpec().getTemplate();\n    PodSecurityContext sc = podTemplate.getSpec().getSecurityContext();\n    assertEquals(sc.getRunAsUser(), (Long) 42L);\n  }\n\n  @Test(expectedExceptions = ValidationException.class)\n  public void shouldFailIfSecurityContextDiffersInPods() throws Exception {\n    // given\n    PodSpec podSpec1 =\n        new PodSpecBuilder()\n            .withSecurityContext(new PodSecurityContextBuilder().withRunAsUser(42L).build())\n            .build();\n    podSpec1.setAdditionalProperty(\"add1\", 1L);\n    PodData podData1 = new PodData(podSpec1, new ObjectMetaBuilder().build());\n\n    PodSpec podSpec2 =\n        new PodSpecBuilder()\n            .withSecurityContext(new PodSecurityContextBuilder().withRunAsUser(43L).build())\n            .build();\n    podSpec2.setAdditionalProperty(\"add2\", 2L);\n    PodData podData2 = new PodData(podSpec2, new ObjectMetaBuilder().build());\n\n    // when\n    Deployment merged = podMerger.merge(Arrays.asList(podData1, podData2));\n\n    // then\n    // exception is thrown\n  }\n\n  @Test\n  public void shouldAssignServiceAccountSharedByPods() throws Exception {\n    // given\n    PodSpec podSpec1 = new PodSpecBuilder().withServiceAccount(\"sa\").build();\n    podSpec1.setAdditionalProperty(\"add1\", 1L);\n    PodData podData1 = new PodData(podSpec1, new ObjectMetaBuilder().build());\n\n    PodSpec podSpec2 = new PodSpecBuilder().withServiceAccount(\"sa\").build();\n    podSpec2.setAdditionalProperty(\"add2\", 2L);\n    PodData podData2 = new PodData(podSpec2, new ObjectMetaBuilder().build());\n\n    // when\n    Deployment merged = podMerger.merge(Arrays.asList(podData1, podData2));\n\n    // then\n    PodTemplateSpec podTemplate = merged.getSpec().getTemplate();\n    String sa = podTemplate.getSpec().getServiceAccount();\n    assertEquals(sa, \"sa\");\n  }\n\n  @Test(expectedExceptions = ValidationException.class)\n  public void shouldFailServiceAccountDiffersInPods() throws Exception {\n    // given\n    PodSpec podSpec1 = new PodSpecBuilder().withServiceAccount(\"sa\").build();\n    podSpec1.setAdditionalProperty(\"add1\", 1L);\n    PodData podData1 = new PodData(podSpec1, new ObjectMetaBuilder().build());\n\n    PodSpec podSpec2 = new PodSpecBuilder().withServiceAccount(\"sb\").build();\n    podSpec2.setAdditionalProperty(\"add2\", 2L);\n    PodData podData2 = new PodData(podSpec2, new ObjectMetaBuilder().build());\n\n    // when\n    Deployment merged = podMerger.merge(Arrays.asList(podData1, podData2));\n\n    // then\n    // exception is thrown\n  }\n\n  @Test\n  public void shouldAssignServiceAccountNameSharedByPods() throws Exception {\n    // given\n    PodSpec podSpec1 = new PodSpecBuilder().withServiceAccountName(\"sa\").build();\n    podSpec1.setAdditionalProperty(\"add1\", 1L);\n    PodData podData1 = new PodData(podSpec1, new ObjectMetaBuilder().build());\n\n    PodSpec podSpec2 = new PodSpecBuilder().withServiceAccountName(\"sa\").build();\n    podSpec2.setAdditionalProperty(\"add2\", 2L);\n    PodData podData2 = new PodData(podSpec2, new ObjectMetaBuilder().build());\n\n    // when\n    Deployment merged = podMerger.merge(Arrays.asList(podData1, podData2));\n\n    // then\n    PodTemplateSpec podTemplate = merged.getSpec().getTemplate();\n    String sa = podTemplate.getSpec().getServiceAccountName();\n    assertEquals(sa, \"sa\");\n  }\n\n  @Test(expectedExceptions = ValidationException.class)\n  public void shouldFailServiceAccountNameDiffersInPods() throws Exception {\n    // given\n    PodSpec podSpec1 = new PodSpecBuilder().withServiceAccountName(\"sa\").build();\n    podSpec1.setAdditionalProperty(\"add1\", 1L);\n    PodData podData1 = new PodData(podSpec1, new ObjectMetaBuilder().build());\n\n    PodSpec podSpec2 = new PodSpecBuilder().withServiceAccountName(\"sb\").build();\n    podSpec2.setAdditionalProperty(\"add2\", 2L);\n    PodData podData2 = new PodData(podSpec2, new ObjectMetaBuilder().build());\n\n    // when\n    Deployment merged = podMerger.merge(Arrays.asList(podData1, podData2));\n\n    // then\n    // exception is thrown\n  }\n\n  private void verifyContainsAllFrom(ObjectMeta source, ObjectMeta toCheck) {\n    assertTrue(source.getLabels().entrySet().containsAll(toCheck.getLabels().entrySet()));\n    assertTrue(source.getAnnotations().entrySet().containsAll(toCheck.getAnnotations().entrySet()));\n    assertTrue(\n        source\n            .getAdditionalProperties()\n            .entrySet()\n            .containsAll(toCheck.getAdditionalProperties().entrySet()));\n  }\n\n  private void verifyContainsAllFrom(PodSpec source, PodSpec toCheck) {\n    assertTrue(source.getContainers().containsAll(toCheck.getContainers()));\n    assertTrue(source.getInitContainers().containsAll(toCheck.getInitContainers()));\n    assertTrue(source.getVolumes().containsAll(toCheck.getVolumes()));\n    assertTrue(source.getImagePullSecrets().containsAll(toCheck.getImagePullSecrets()));\n    assertTrue(\n        source.getNodeSelector().entrySet().containsAll(toCheck.getNodeSelector().entrySet()));\n    assertTrue(\n        source\n            .getAdditionalProperties()\n            .entrySet()\n            .containsAll(toCheck.getAdditionalProperties().entrySet()));\n    assertTrue(source.getTolerations().containsAll(toCheck.getTolerations()));\n    assertEquals(toCheck.getTolerations().size(), new HashSet<>(toCheck.getTolerations()).size());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/environment/util/EntryPointParserTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.environment.util;\n\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.emptyList;\nimport static org.testng.AssertJUnit.assertEquals;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.MachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class EntryPointParserTest {\n\n  @Test\n  public void shouldParseCommandAndArgFromYAMLList() throws Exception {\n    Map<String, String> cfg = new HashMap<>();\n    cfg.put(MachineConfig.CONTAINER_COMMAND_ATTRIBUTE, \"['/bin/sh', '''yaml quoting ftw''']\");\n    cfg.put(MachineConfig.CONTAINER_ARGS_ATTRIBUTE, \"['x', 'y', '''z']\");\n\n    EntryPointParser parser = new EntryPointParser();\n\n    EntryPoint ep = parser.parse(cfg);\n\n    assertEquals(asList(\"/bin/sh\", \"'yaml quoting ftw'\"), ep.getCommand());\n    assertEquals(asList(\"x\", \"y\", \"'z\"), ep.getArguments());\n  }\n\n  @Test\n  public void shouldParseCommandFromYAMLList() throws Exception {\n    Map<String, String> cfg = new HashMap<>();\n    cfg.put(MachineConfig.CONTAINER_COMMAND_ATTRIBUTE, \"['/bin/sh', '''yaml quoting ftw''']\");\n\n    EntryPointParser parser = new EntryPointParser();\n\n    EntryPoint ep = parser.parse(cfg);\n\n    assertEquals(asList(\"/bin/sh\", \"'yaml quoting ftw'\"), ep.getCommand());\n    assertEquals(emptyList(), ep.getArguments());\n  }\n\n  @Test\n  public void shouldParseArgsFromYAMLList() throws Exception {\n    Map<String, String> cfg = new HashMap<>();\n    cfg.put(MachineConfig.CONTAINER_ARGS_ATTRIBUTE, \"['x', 'y', '''z', --yes]\");\n\n    EntryPointParser parser = new EntryPointParser();\n\n    EntryPoint ep = parser.parse(cfg);\n\n    assertEquals(emptyList(), ep.getCommand());\n    assertEquals(asList(\"x\", \"y\", \"'z\", \"--yes\"), ep.getArguments());\n  }\n\n  @Test(dataProvider = \"invalidEntryProvider\", expectedExceptions = InfrastructureException.class)\n  public void shouldFailOnOtherYAMLDataType(String invalidEntry) throws InfrastructureException {\n    Map<String, String> cfg = new HashMap<>();\n    cfg.put(MachineConfig.CONTAINER_ARGS_ATTRIBUTE, invalidEntry);\n\n    EntryPointParser parser = new EntryPointParser();\n    parser.parse(cfg);\n  }\n\n  @DataProvider\n  public static Object[][] invalidEntryProvider() {\n    return new Object[][] {\n      new String[] {\"key: value\"},\n      new String[] {\"42\"},\n      new String[] {\"true\"},\n      new String[] {\"string value\"},\n      new String[] {\"[a, b, [c]]\"}\n    };\n  }\n\n  @Test\n  public void shouldSerializeValidData() {\n    // given\n    List<String> data = asList(\"/bin/sh\", \"-c\");\n\n    EntryPointParser parser = new EntryPointParser();\n\n    // when\n    String serialized = parser.serializeEntry(data);\n\n    // then\n\n    // this is dependent on the configuration of the YAML generator used by the YAMLMapper used in\n    // the EntryPointParser so this may start failing on jackson-dataformat-yaml library upgrade\n    assertEquals(serialized, \"---\\n- \\\"/bin/sh\\\"\\n- \\\"-c\\\"\\n\");\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/multiuser/oauth/KubernetesOidcProviderConfigFactoryTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.multiuser.oauth;\n\nimport static org.testng.Assert.assertEquals;\n\nimport io.fabric8.kubernetes.client.Config;\nimport io.fabric8.kubernetes.client.ConfigBuilder;\nimport java.util.Collections;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesOidcProviderConfigFactoryTest {\n  private static final String TEST_TOKEN = \"touken\";\n\n  private Config defaultConfig;\n\n  private KubernetesOidcProviderConfigFactory kubernetesOidcProviderConfigFactory =\n      new KubernetesOidcProviderConfigFactory(null, null);\n\n  @BeforeMethod\n  public void setUp() {\n    EnvironmentContext.reset();\n    defaultConfig = new ConfigBuilder().build();\n  }\n\n  @Test\n  public void getDefaultConfigWhenNoTokenSet() {\n    Config resultConfig = kubernetesOidcProviderConfigFactory.buildConfig(defaultConfig, null);\n\n    assertEquals(resultConfig, defaultConfig);\n  }\n\n  @Test\n  public void getConfigWithTokenWhenTokenIsSet() {\n    EnvironmentContext.getCurrent()\n        .setSubject(\n            new SubjectImpl(\"test_name\", Collections.emptyList(), \"test_id\", TEST_TOKEN, false));\n\n    Config resultConfig = kubernetesOidcProviderConfigFactory.buildConfig(defaultConfig, null);\n\n    assertEquals(resultConfig.getOauthToken(), TEST_TOKEN);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/K8sVersionTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static io.fabric8.kubernetes.client.VersionInfo.VersionKeys.BUILD_DATE_FORMAT;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.VersionInfo;\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class K8sVersionTest {\n\n  private K8sVersion k8sVersion;\n\n  @Mock KubernetesClientFactory kubernetesClientFactory;\n\n  @Mock KubernetesClient kubernetesClient;\n\n  @BeforeMethod\n  public void setUp() throws InfrastructureException {\n    k8sVersion = new K8sVersion(kubernetesClientFactory);\n    when(kubernetesClientFactory.create()).thenReturn(kubernetesClient);\n  }\n\n  @Test(dataProvider = \"greaterThanData\")\n  public void testGreaterOrEqual(VersionInfo versionInfo, int major, int minor, boolean expected) {\n    when(kubernetesClient.getVersion()).thenReturn(versionInfo);\n    assertEquals(k8sVersion.newerOrEqualThan(major, minor), expected);\n  }\n\n  @Test(dataProvider = \"olderThanData\")\n  public void testOlderThan(VersionInfo versionInfo, int major, int minor, boolean expected) {\n    when(kubernetesClient.getVersion()).thenReturn(versionInfo);\n    assertEquals(k8sVersion.olderThan(major, minor), expected);\n  }\n\n  @Test\n  public void testGreaterOrEqualTrueWhenInfrastructureFails() throws InfrastructureException {\n    when(kubernetesClientFactory.create()).thenThrow(new InfrastructureException(\"eh\"));\n    assertTrue(k8sVersion.newerOrEqualThan(1, 1));\n    assertTrue(k8sVersion.newerOrEqualThan(-1, -1));\n    assertTrue(k8sVersion.newerOrEqualThan(0, 1));\n    assertTrue(k8sVersion.newerOrEqualThan(0, 0));\n    assertTrue(k8sVersion.newerOrEqualThan(1337, 1337));\n    assertTrue(k8sVersion.newerOrEqualThan(6655321, 6655321));\n  }\n\n  @Test\n  public void testOlderThanWhenInfrastructureFails() throws InfrastructureException {\n    when(kubernetesClientFactory.create()).thenThrow(new InfrastructureException(\"eh\"));\n    assertFalse(k8sVersion.olderThan(1, 1));\n    assertFalse(k8sVersion.olderThan(-1, -1));\n    assertFalse(k8sVersion.olderThan(0, 1));\n    assertFalse(k8sVersion.olderThan(0, 0));\n    assertFalse(k8sVersion.olderThan(1337, 1337));\n    assertFalse(k8sVersion.olderThan(6655321, 6655321));\n  }\n\n  @Test\n  public void testGreaterOrEqualWhenParseFailure() throws ParseException {\n    when(kubernetesClient.getVersion()).thenReturn(createDummyVersionInfo(\"abc\", \"cde\"));\n    assertTrue(k8sVersion.newerOrEqualThan(1, 1));\n    assertTrue(k8sVersion.newerOrEqualThan(-1, -1));\n    assertTrue(k8sVersion.newerOrEqualThan(0, 1));\n    assertTrue(k8sVersion.newerOrEqualThan(0, 0));\n    assertTrue(k8sVersion.newerOrEqualThan(1337, 1337));\n    assertTrue(k8sVersion.newerOrEqualThan(6655321, 6655321));\n  }\n\n  @Test\n  public void testOlderThanWhenParseFailure() throws ParseException {\n    when(kubernetesClient.getVersion()).thenReturn(createDummyVersionInfo(\"abc\", \"cde\"));\n    assertFalse(k8sVersion.olderThan(1, 1));\n    assertFalse(k8sVersion.olderThan(-1, -1));\n    assertFalse(k8sVersion.olderThan(0, 1));\n    assertFalse(k8sVersion.olderThan(0, 0));\n    assertFalse(k8sVersion.olderThan(1337, 1337));\n    assertFalse(k8sVersion.olderThan(6655321, 6655321));\n  }\n\n  @DataProvider\n  public Object[][] greaterThanData() throws ParseException {\n    VersionInfo versionInfo = createDummyVersionInfo(\"2\", \"10\");\n    return new Object[][] {\n      {versionInfo, 1, 9, true},\n      {versionInfo, 1, 10, true},\n      {versionInfo, 1, 11, true},\n      {versionInfo, 2, 9, true},\n      {versionInfo, 2, 10, true},\n      {versionInfo, 2, 11, false},\n      {versionInfo, 3, 9, false},\n      {versionInfo, 3, 10, false},\n      {versionInfo, 3, 11, false},\n      {createDummyVersionInfo(\"1\", \"17+\"), 1, 17, true},\n      {createDummyVersionInfo(\"1\", \"17+\"), 1, 18, false},\n      {createDummyVersionInfo(\"1\", \"17+\"), 1, 16, true},\n      {createDummyVersionInfo(\"1\", \"11+\"), 1, 17, false},\n    };\n  }\n\n  @DataProvider\n  public Object[][] olderThanData() throws ParseException {\n    VersionInfo versionInfo = createDummyVersionInfo(\"2\", \"10\");\n    return new Object[][] {\n      {versionInfo, 1, 9, false},\n      {versionInfo, 1, 10, false},\n      {versionInfo, 1, 11, false},\n      {versionInfo, 2, 9, false},\n      {versionInfo, 2, 10, false},\n      {versionInfo, 2, 11, true},\n      {versionInfo, 3, 9, true},\n      {versionInfo, 3, 10, true},\n      {versionInfo, 3, 11, true},\n      {createDummyVersionInfo(\"1\", \"17+\"), 1, 17, false},\n      {createDummyVersionInfo(\"1\", \"17+\"), 1, 11, false},\n      {createDummyVersionInfo(\"1\", \"11+\"), 1, 17, true},\n    };\n  }\n\n  private VersionInfo createDummyVersionInfo(String major, String minor) throws ParseException {\n    return new VersionInfo.Builder()\n        .withBuildDate(new SimpleDateFormat(BUILD_DATE_FORMAT).format(new Date()))\n        .withGitCommit(\"3f6f40d\")\n        .withGitVersion(\"1.17.1+3f6f40d\")\n        .withGitTreeState(\"clean\")\n        .withGoVersion(\"go1.13.4\")\n        .withPlatform(\"linux/amd64\")\n        .withCompiler(\"gc\")\n        .withMajor(major)\n        .withMinor(minor)\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesDeploymentsTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static io.fabric8.kubernetes.api.model.DeletionPropagation.BACKGROUND;\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.POD_STATUS_PHASE_FAILED;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.POD_STATUS_PHASE_RUNNING;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.POD_STATUS_PHASE_SUCCEEDED;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\nimport static org.testng.Assert.fail;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ContainerStateBuilder;\nimport io.fabric8.kubernetes.api.model.ContainerStatus;\nimport io.fabric8.kubernetes.api.model.Event;\nimport io.fabric8.kubernetes.api.model.EventList;\nimport io.fabric8.kubernetes.api.model.LabelSelector;\nimport io.fabric8.kubernetes.api.model.LocalObjectReference;\nimport io.fabric8.kubernetes.api.model.LocalObjectReferenceBuilder;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.ObjectReference;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodList;\nimport io.fabric8.kubernetes.api.model.PodStatus;\nimport io.fabric8.kubernetes.api.model.ServiceAccount;\nimport io.fabric8.kubernetes.api.model.ServiceAccountBuilder;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentList;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentSpec;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentSpecBuilder;\nimport io.fabric8.kubernetes.client.GracePeriodConfigurable;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.kubernetes.client.Watch;\nimport io.fabric8.kubernetes.client.Watcher;\nimport io.fabric8.kubernetes.client.dsl.AppsAPIGroupDSL;\nimport io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable;\nimport io.fabric8.kubernetes.client.dsl.MixedOperation;\nimport io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;\nimport io.fabric8.kubernetes.client.dsl.PodResource;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport io.fabric8.kubernetes.client.dsl.RollableScalableResource;\nimport io.fabric8.kubernetes.client.dsl.V1APIGroupDSL;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMixedDispatcher;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;\nimport io.fabric8.mockwebserver.Context;\nimport io.fabric8.mockwebserver.MockWebServer;\nimport io.fabric8.mockwebserver.ServerRequest;\nimport io.fabric8.mockwebserver.ServerResponse;\nimport java.lang.reflect.Field;\nimport java.util.ArrayList;\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Queue;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.Executor;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEventHandler;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.PodEvents;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesDeploymentsTest {\n  private static final String POD_NAME = \"podName\";\n  private static final String POD_OBJECT_KIND = \"Pod\";\n  private static final String REPLICASET_OBJECT_KIND = \"ReplicaSet\";\n  private static final String DEPLOYMENT_OBJECT_KIND = \"Deployment\";\n\n  @Mock private KubernetesClientFactory clientFactory;\n  @Mock private Executor executor;\n  @Mock private KubernetesClient kubernetesClient;\n\n  // Deployments Mocks\n  @Mock private AppsAPIGroupDSL apps;\n\n  @Mock\n  private MixedOperation<Deployment, DeploymentList, RollableScalableResource<Deployment>>\n      deploymentsMixedOperation;\n\n  @Mock\n  private NonNamespaceOperation<Deployment, DeploymentList, RollableScalableResource<Deployment>>\n      deploymentsNamespaceOperation;\n\n  @Mock private RollableScalableResource<Deployment> deploymentResource;\n  @Mock private Deployment deployment;\n  @Mock private ObjectMeta deploymentMetadata;\n  @Mock private DeploymentSpec deploymentSpec;\n  @Mock private GracePeriodConfigurable gracePeriodConfigurable;\n\n  // Pod Mocks\n  @Mock private Pod pod;\n  @Mock private PodStatus status;\n  @Mock private PodResource podResource;\n  @Mock private ObjectMeta metadata;\n  @Mock private MixedOperation podsMixedOperation;\n  @Mock private NonNamespaceOperation podsNamespaceOperation;\n\n  @Captor private ArgumentCaptor<Watcher<Pod>> watcherCaptor;\n\n  // Event Mocks\n  @Mock private Event event;\n  @Mock private ObjectReference objectReference;\n  @Mock private PodEventHandler podEventHandler;\n\n  @Mock private MixedOperation<Event, EventList, Resource<Event>> eventMixedOperation;\n\n  @Mock\n  private NonNamespaceOperation<Event, EventList, Resource<Event>> eventNamespaceMixedOperation;\n\n  @Captor private ArgumentCaptor<Watcher<Event>> eventWatcherCaptor;\n  @Mock private V1APIGroupDSL v1APIGroupDSL;\n\n  private KubernetesDeployments kubernetesDeployments;\n  private KubernetesMockServer kubernetesMockServer;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    lenient().when(clientFactory.create(anyString())).thenReturn(kubernetesClient);\n\n    lenient().when(pod.getStatus()).thenReturn(status);\n    lenient().when(pod.getMetadata()).thenReturn(metadata);\n    lenient().when(metadata.getName()).thenReturn(POD_NAME);\n\n    // Model DSL: client.pods().inNamespace(...).withName(...).get().getMetadata().getName();\n    lenient().doReturn(podsMixedOperation).when(kubernetesClient).pods();\n    lenient().doReturn(podsNamespaceOperation).when(podsMixedOperation).inNamespace(anyString());\n    lenient().doReturn(podResource).when(podsNamespaceOperation).withName(anyString());\n    lenient().doReturn(pod).when(podResource).get();\n\n    // Model DSL:\n    // client.apps().deployments(...).inNamespace(...).withName(...).get().getMetadata().getName();\n    lenient().doReturn(apps).when(kubernetesClient).apps();\n    lenient().doReturn(deploymentsMixedOperation).when(apps).deployments();\n    lenient()\n        .doReturn(deploymentsNamespaceOperation)\n        .when(deploymentsMixedOperation)\n        .inNamespace(anyString());\n    lenient()\n        .doReturn(deploymentResource)\n        .when(deploymentsNamespaceOperation)\n        .withName(anyString());\n    lenient().doReturn(deployment).when(deploymentResource).get();\n    lenient().doReturn(deploymentMetadata).when(deployment).getMetadata();\n    lenient().doReturn(deploymentSpec).when(deployment).getSpec();\n\n    // Model DSL: client.events().inNamespace(...).watch(...)\n    //            event.getInvolvedObject().getKind()\n    lenient().when(kubernetesClient.v1()).thenReturn(v1APIGroupDSL);\n    lenient().when(v1APIGroupDSL.events()).thenReturn(eventMixedOperation);\n    lenient().when(eventMixedOperation.inNamespace(any())).thenReturn(eventNamespaceMixedOperation);\n    lenient().when(event.getInvolvedObject()).thenReturn(objectReference);\n    lenient().when(event.getMetadata()).thenReturn(new ObjectMeta());\n    // Workaround to ensure mocked event happens 'after' watcher initialisation.\n    Date futureDate = new Date();\n    futureDate.setYear(3000);\n    lenient()\n        .when(event.getLastTimestamp())\n        .thenReturn(PodEvents.convertDateToEventTimestamp(futureDate));\n\n    kubernetesDeployments =\n        new KubernetesDeployments(\"namespace\", \"workspace123\", clientFactory, executor);\n    final Map<ServerRequest, Queue<ServerResponse>> responses = new HashMap<>();\n    kubernetesMockServer =\n        new KubernetesMockServer(\n            new Context(),\n            new MockWebServer(),\n            responses,\n            new KubernetesMixedDispatcher(responses),\n            true);\n    kubernetesMockServer.init();\n  }\n\n  @AfterMethod\n  public void cleanUp() {\n    kubernetesMockServer.destroy();\n  }\n\n  @Test\n  public void shouldReturnEmptyOptionalWhenPodNorDeploymentWasNotFound() throws Exception {\n    // given\n    when(podResource.get()).thenReturn(null);\n    when(deploymentResource.get()).thenReturn(null);\n\n    // when\n    Optional<Pod> pod = kubernetesDeployments.get(\"non-existing\");\n\n    // then\n    assertFalse(pod.isPresent());\n  }\n\n  @Test\n  public void shouldReturnOptionalWithPodWhenPodWithSpecifiedNameExists() throws Exception {\n    // given\n    when(podResource.get()).thenReturn(pod);\n\n    // when\n    Optional<Pod> fetchedPodOpt = kubernetesDeployments.get(\"existing\");\n\n    // then\n    assertTrue(fetchedPodOpt.isPresent());\n    verify(podsNamespaceOperation).withName(\"existing\");\n    assertEquals(fetchedPodOpt.get(), pod);\n  }\n\n  @Test\n  public void shouldReturnOptionalWithPodWhenPodWasNotFoundButDeploymentExists() throws Exception {\n    // given\n    when(podResource.get()).thenReturn(null);\n    when(deploymentResource.get()).thenReturn(deployment);\n    LabelSelector labelSelector = mock(LabelSelector.class);\n    doReturn(labelSelector).when(deploymentSpec).getSelector();\n    doReturn(ImmutableMap.of(\"deployment\", \"existing\")).when(labelSelector).getMatchLabels();\n\n    FilterWatchListDeletable filterList = mock(FilterWatchListDeletable.class);\n    doReturn(filterList).when(podsNamespaceOperation).withLabels(any());\n    PodList podList = mock(PodList.class);\n    doReturn(singletonList(pod)).when(podList).getItems();\n    doReturn(podList).when(filterList).list();\n\n    // when\n    Optional<Pod> fetchedPodOpt = kubernetesDeployments.get(\"existing\");\n\n    // then\n    assertTrue(fetchedPodOpt.isPresent());\n    verify(podsNamespaceOperation).withName(\"existing\");\n    verify(deploymentsNamespaceOperation).withName(\"existing\");\n    assertEquals(fetchedPodOpt.get(), pod);\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp = \"Found multiple pods in Deployment 'existing'\")\n  public void shouldThrowExceptionWhenMultiplePodsExistsForDeploymentsOnPodFetching()\n      throws Exception {\n    // given\n    when(podResource.get()).thenReturn(null);\n    when(deploymentResource.get()).thenReturn(deployment);\n    LabelSelector labelSelector = mock(LabelSelector.class);\n    doReturn(labelSelector).when(deploymentSpec).getSelector();\n    doReturn(ImmutableMap.of(\"deployment\", \"existing\")).when(labelSelector).getMatchLabels();\n\n    FilterWatchListDeletable filterList = mock(FilterWatchListDeletable.class);\n    doReturn(filterList).when(podsNamespaceOperation).withLabels(any());\n    PodList podList = mock(PodList.class);\n    doReturn(asList(pod, pod)).when(podList).getItems();\n    doReturn(podList).when(filterList).list();\n\n    // when\n    kubernetesDeployments.get(\"existing\");\n  }\n\n  @Test\n  public void shouldCompleteFutureForWaitingPodIfStatusIsRunning() {\n    // given\n    when(status.getPhase()).thenReturn(POD_STATUS_PHASE_RUNNING);\n    CompletableFuture<?> future = kubernetesDeployments.waitRunningAsync(POD_NAME);\n\n    // when\n    verify(podResource).watch(watcherCaptor.capture());\n    Watcher<Pod> watcher = watcherCaptor.getValue();\n    watcher.eventReceived(Watcher.Action.MODIFIED, pod);\n\n    // then\n    assertTrue(future.isDone());\n  }\n\n  @Test\n  public void\n      shouldCompleteExceptionallyFutureForWaitingPodIfStatusIsRunningButSomeContainersAreTerminated() {\n    // given\n    ContainerStatus containerStatus = mock(ContainerStatus.class);\n    when(containerStatus.getName()).thenReturn(\"FailingContainer\");\n    when(containerStatus.getState())\n        .thenReturn(\n            new ContainerStateBuilder()\n                .withNewTerminated()\n                .withReason(\"Completed\")\n                .endTerminated()\n                .build());\n\n    when(status.getPhase()).thenReturn(POD_STATUS_PHASE_RUNNING);\n    when(status.getContainerStatuses()).thenReturn(singletonList(containerStatus));\n    CompletableFuture<?> future = kubernetesDeployments.waitRunningAsync(POD_NAME);\n\n    // when\n    verify(podResource).watch(watcherCaptor.capture());\n    Watcher<Pod> watcher = watcherCaptor.getValue();\n    watcher.eventReceived(Watcher.Action.MODIFIED, pod);\n\n    // then\n    assertTrue(future.isDone());\n    assertTrue(future.isCompletedExceptionally());\n  }\n\n  @Test\n  public void\n      shouldCompleteExceptionallyFutureForWaitingPodIfStatusIsRunningButSomeContainersAreWaitingAndTerminatedBefore() {\n    // given\n    ContainerStatus containerStatus = mock(ContainerStatus.class);\n    when(containerStatus.getName()).thenReturn(\"FailingContainer\");\n    when(containerStatus.getState())\n        .thenReturn(\n            new ContainerStateBuilder().withNewWaiting().withMessage(\"bah\").endWaiting().build());\n    when(containerStatus.getLastState())\n        .thenReturn(\n            new ContainerStateBuilder()\n                .withNewTerminated()\n                .withReason(\"Completed\")\n                .endTerminated()\n                .build());\n\n    when(status.getPhase()).thenReturn(POD_STATUS_PHASE_RUNNING);\n    when(status.getContainerStatuses()).thenReturn(singletonList(containerStatus));\n    CompletableFuture<?> future = kubernetesDeployments.waitRunningAsync(POD_NAME);\n\n    // when\n    verify(podResource).watch(watcherCaptor.capture());\n    Watcher<Pod> watcher = watcherCaptor.getValue();\n    watcher.eventReceived(Watcher.Action.MODIFIED, pod);\n\n    // then\n    assertTrue(future.isDone());\n    assertTrue(future.isCompletedExceptionally());\n  }\n\n  @Test\n  public void shouldCompleteExceptionallyFutureForWaitingPodIfStatusIsSucceeded() throws Exception {\n    // given\n    when(status.getPhase()).thenReturn(POD_STATUS_PHASE_SUCCEEDED);\n    CompletableFuture future = kubernetesDeployments.waitRunningAsync(POD_NAME);\n\n    // when\n    verify(podResource).watch(watcherCaptor.capture());\n    Watcher<Pod> watcher = watcherCaptor.getValue();\n    watcher.eventReceived(Watcher.Action.MODIFIED, pod);\n\n    // then\n    assertTrue(future.isCompletedExceptionally());\n\n    try {\n      future.get();\n    } catch (ExecutionException e) {\n      assertEquals(\n          e.getCause().getMessage(),\n          \"Pod container has been terminated. Container must be configured to use a non-terminating command.\");\n    }\n  }\n\n  @Test\n  public void shouldCompleteExceptionallyFutureForWaitingPodIfStatusIsFailed() throws Exception {\n    // given\n    when(status.getPhase()).thenReturn(POD_STATUS_PHASE_FAILED);\n    when(pod.getStatus().getReason()).thenReturn(\"Evicted\");\n    CompletableFuture future = kubernetesDeployments.waitRunningAsync(POD_NAME);\n\n    // when\n    verify(podResource).watch(watcherCaptor.capture());\n    Watcher<Pod> watcher = watcherCaptor.getValue();\n    watcher.eventReceived(Watcher.Action.MODIFIED, pod);\n\n    // then\n    assertTrue(future.isCompletedExceptionally());\n\n    try {\n      future.get();\n    } catch (ExecutionException e) {\n      assertEquals(e.getCause().getMessage(), \"Pod 'podName' failed to start. Reason: Evicted\");\n    }\n  }\n\n  @Test\n  public void\n      shouldCompleteExceptionallyFutureForWaitingPodIfStatusIsFailedAndReasonIsNotAvailable()\n          throws Exception {\n    // given\n    when(status.getPhase()).thenReturn(POD_STATUS_PHASE_FAILED);\n    when(podResource.getLog()).thenReturn(\"Pod fail log\");\n    CompletableFuture future = kubernetesDeployments.waitRunningAsync(POD_NAME);\n\n    // when\n    verify(podResource).watch(watcherCaptor.capture());\n    Watcher<Pod> watcher = watcherCaptor.getValue();\n    watcher.eventReceived(Watcher.Action.MODIFIED, pod);\n\n    // then\n    assertTrue(future.isCompletedExceptionally());\n    try {\n      future.get();\n    } catch (ExecutionException e) {\n      assertEquals(\n          e.getCause().getMessage(), \"Pod 'podName' failed to start. Pod logs: Pod fail log\");\n    }\n  }\n\n  @Test\n  public void\n      shouldCompleteExceptionallyFutureForWaitingPodIfStatusIsFailedAndReasonNorLogsAreNotAvailable()\n          throws Exception {\n    // given\n    CompletableFuture future = kubernetesDeployments.waitRunningAsync(POD_NAME);\n\n    when(status.getPhase()).thenReturn(POD_STATUS_PHASE_FAILED);\n    doThrow(new InfrastructureException(\"Unable to create client\"))\n        .when(clientFactory)\n        .create(anyString());\n\n    // when\n    verify(podResource).watch(watcherCaptor.capture());\n    Watcher<Pod> watcher = watcherCaptor.getValue();\n    watcher.eventReceived(Watcher.Action.MODIFIED, pod);\n\n    // then\n    assertTrue(future.isCompletedExceptionally());\n    try {\n      future.get();\n    } catch (ExecutionException e) {\n      assertEquals(\n          e.getCause().getMessage(),\n          \"Pod 'podName' failed to start. Error occurred while fetching pod logs: Unable to create client\");\n    }\n  }\n\n  @Test\n  public void shouldCallHandlerForEventsOnPods() throws Exception {\n    // Given\n    when(objectReference.getKind()).thenReturn(POD_OBJECT_KIND);\n    kubernetesDeployments.watchEvents(podEventHandler);\n    verify(eventNamespaceMixedOperation).watch(eventWatcherCaptor.capture());\n    Watcher<Event> watcher = eventWatcherCaptor.getValue();\n\n    // When\n    watcher.eventReceived(Watcher.Action.ADDED, event);\n\n    // Then\n    verify(podEventHandler).handle(any());\n  }\n\n  @Test\n  public void shouldCallHandlerForEventsOnReplicaSets() throws Exception {\n    // Given\n    when(objectReference.getKind()).thenReturn(REPLICASET_OBJECT_KIND);\n    kubernetesDeployments.watchEvents(podEventHandler);\n    verify(eventNamespaceMixedOperation).watch(eventWatcherCaptor.capture());\n    Watcher<Event> watcher = eventWatcherCaptor.getValue();\n\n    // When\n    watcher.eventReceived(Watcher.Action.ADDED, event);\n\n    // Then\n    verify(podEventHandler).handle(any());\n  }\n\n  @Test\n  public void shouldCallHandlerForEventsOnDeployments() throws Exception {\n    // Given\n    when(objectReference.getKind()).thenReturn(DEPLOYMENT_OBJECT_KIND);\n    kubernetesDeployments.watchEvents(podEventHandler);\n    verify(eventNamespaceMixedOperation).watch(eventWatcherCaptor.capture());\n    Watcher<Event> watcher = eventWatcherCaptor.getValue();\n\n    // When\n    watcher.eventReceived(Watcher.Action.ADDED, event);\n\n    // Then\n    verify(podEventHandler).handle(any());\n  }\n\n  @Test\n  public void testDeleteNonExistingPodBeforeWatch() throws Exception {\n    final String POD_NAME = \"nonExistingPod\";\n\n    doReturn(emptyList()).when(podResource).delete();\n    doReturn(podResource).when(podResource).withPropagationPolicy(eq(BACKGROUND));\n    Watch watch = mock(Watch.class);\n    doReturn(watch).when(podResource).watch(any());\n\n    new KubernetesDeployments(\"\", \"\", clientFactory, executor)\n        .doDeletePod(POD_NAME)\n        .get(5, TimeUnit.SECONDS);\n\n    verify(watch).close();\n  }\n\n  @Test\n  public void testDeletePodThrowingKubernetesClientExceptionShouldCloseWatch() throws Exception {\n    final String POD_NAME = \"nonExistingPod\";\n    doReturn(podResource).when(podResource).withPropagationPolicy(eq(BACKGROUND));\n    doThrow(KubernetesClientException.class).when(podResource).delete();\n    Watch watch = mock(Watch.class);\n    doReturn(watch).when(podResource).watch(any());\n\n    try {\n      new KubernetesDeployments(\"\", \"\", clientFactory, executor)\n          .doDeletePod(POD_NAME)\n          .get(5, TimeUnit.SECONDS);\n    } catch (KubernetesInfrastructureException e) {\n      assertTrue(e.getCause() instanceof KubernetesClientException);\n      verify(watch).close();\n      return;\n    }\n    fail(\"The exception should have been rethrown\");\n  }\n\n  @Test\n  public void testDeleteNonExistingDeploymentBeforeWatch() throws Exception {\n    final String DEPLOYMENT_NAME = \"nonExistingPod\";\n    doReturn(deploymentResource).when(deploymentResource).withPropagationPolicy(eq(BACKGROUND));\n    doReturn(emptyList()).when(deploymentResource).delete();\n    Watch watch = mock(Watch.class);\n    doReturn(watch).when(podResource).watch(any());\n\n    new KubernetesDeployments(\"\", \"\", clientFactory, executor)\n        .doDeleteDeployment(DEPLOYMENT_NAME)\n        .get(5, TimeUnit.SECONDS);\n\n    verify(watch).close();\n  }\n\n  @Test\n  public void testDeleteDeploymentThrowingKubernetesClientExceptionShouldCloseWatch()\n      throws Exception {\n    final String DEPLOYMENT_NAME = \"nonExistingPod\";\n\n    doThrow(KubernetesClientException.class).when(deploymentResource).delete();\n    doReturn(deploymentResource).when(deploymentResource).withPropagationPolicy(eq(BACKGROUND));\n    Watch watch = mock(Watch.class);\n    doReturn(watch).when(podResource).watch(any());\n\n    try {\n      new KubernetesDeployments(\"\", \"\", clientFactory, executor)\n          .doDeleteDeployment(DEPLOYMENT_NAME)\n          .get(5, TimeUnit.SECONDS);\n    } catch (KubernetesInfrastructureException e) {\n      assertTrue(e.getCause() instanceof KubernetesClientException);\n      verify(watch).close();\n      return;\n    }\n    fail(\"The exception should have been rethrown\");\n  }\n\n  @Test\n  public void testDeletePodThrowingAnyExceptionShouldCloseWatch() throws Exception {\n    final String POD_NAME = \"nonExistingPod\";\n    doReturn(podResource).when(podResource).withPropagationPolicy(eq(BACKGROUND));\n    doThrow(RuntimeException.class).when(podResource).delete();\n\n    Watch watch = mock(Watch.class);\n    doReturn(watch).when(podResource).watch(any());\n\n    try {\n      new KubernetesDeployments(\"\", \"\", clientFactory, executor)\n          .doDeletePod(POD_NAME)\n          .get(5, TimeUnit.SECONDS);\n      fail(\"The exception should have been rethrown\");\n    } catch (RuntimeException e) {\n      verify(watch).close();\n      return;\n    }\n  }\n\n  @Test(\n      expectedExceptions = RuntimeException.class,\n      expectedExceptionsMessageRegExp =\n          \"testDeleteDeploymentThrowingAnyExceptionShouldCloseWatch msg\")\n  public void testDeleteDeploymentThrowingAnyExceptionShouldCloseWatch() throws Exception {\n    final String DEPLOYMENT_NAME = \"nonExistingPod\";\n    when(deploymentResource.withPropagationPolicy(eq(BACKGROUND)))\n        .thenReturn(gracePeriodConfigurable);\n    doThrow(new RuntimeException(\"testDeleteDeploymentThrowingAnyExceptionShouldCloseWatch msg\"))\n        .when(gracePeriodConfigurable)\n        .delete();\n    Watch watch = mock(Watch.class);\n    doReturn(watch).when(podResource).watch(any());\n\n    try {\n      new KubernetesDeployments(\"\", \"\", clientFactory, executor)\n          .doDeleteDeployment(DEPLOYMENT_NAME)\n          .get(5, TimeUnit.SECONDS);\n      fail(\"The exception should have been rethrown\");\n    } catch (RuntimeException e) {\n      verify(watch).close();\n      throw e;\n    }\n  }\n\n  @Test\n  public void shouldFallbackToFirstTimeStampIfLastTimeStampIsNull() throws InfrastructureException {\n    // Given\n    when(objectReference.getKind()).thenReturn(POD_OBJECT_KIND);\n    kubernetesDeployments.watchEvents(podEventHandler);\n    verify(eventNamespaceMixedOperation).watch(eventWatcherCaptor.capture());\n    Watcher<Event> watcher = eventWatcherCaptor.getValue();\n    Event event = mock(Event.class);\n    when(event.getInvolvedObject()).thenReturn(objectReference);\n    when(event.getMetadata()).thenReturn(new ObjectMeta());\n    Calendar cal = Calendar.getInstance();\n    cal.add(Calendar.YEAR, 1);\n    Date nextYear = cal.getTime();\n    when(event.getFirstTimestamp()).thenReturn(PodEvents.convertDateToEventTimestamp(nextYear));\n    when(event.getLastTimestamp()).thenReturn(null);\n\n    // When\n    watcher.eventReceived(Watcher.Action.ADDED, event);\n\n    // Then\n    verify(event, times(1)).getLastTimestamp();\n    verify(event, times(1)).getFirstTimestamp();\n    ArgumentCaptor<PodEvent> captor = ArgumentCaptor.forClass(PodEvent.class);\n    verify(podEventHandler).handle(captor.capture());\n    PodEvent podEvent = captor.getValue();\n    assertEquals(podEvent.getLastTimestamp(), PodEvents.convertDateToEventTimestamp(nextYear));\n  }\n\n  @Test\n  public void shouldUseLastTimestampIfAvailable() throws InfrastructureException {\n    // Given\n    when(objectReference.getKind()).thenReturn(POD_OBJECT_KIND);\n    kubernetesDeployments.watchEvents(podEventHandler);\n    verify(eventNamespaceMixedOperation).watch(eventWatcherCaptor.capture());\n    Watcher<Event> watcher = eventWatcherCaptor.getValue();\n    Event event = mock(Event.class);\n    when(event.getInvolvedObject()).thenReturn(objectReference);\n    when(event.getMetadata()).thenReturn(new ObjectMeta());\n    Calendar cal = Calendar.getInstance();\n    cal.add(Calendar.YEAR, 2);\n    Date nextYear = cal.getTime();\n    when(event.getLastTimestamp()).thenReturn(PodEvents.convertDateToEventTimestamp(nextYear));\n\n    // When\n    watcher.eventReceived(Watcher.Action.ADDED, event);\n\n    // Then\n    verify(event, times(1)).getLastTimestamp();\n    verify(event, never()).getFirstTimestamp();\n    ArgumentCaptor<PodEvent> captor = ArgumentCaptor.forClass(PodEvent.class);\n    verify(podEventHandler).handle(captor.capture());\n    PodEvent podEvent = captor.getValue();\n    assertEquals(podEvent.getLastTimestamp(), PodEvents.convertDateToEventTimestamp(nextYear));\n  }\n\n  @Test\n  public void shouldHandleEventWithEmptyLastTimestampAndFirstTimestamp() throws Exception {\n    // Given\n    when(objectReference.getKind()).thenReturn(POD_OBJECT_KIND);\n    kubernetesDeployments.watchEvents(podEventHandler);\n    Calendar cal = Calendar.getInstance();\n    cal.add(Calendar.MINUTE, -1);\n    Date minuteAgo = cal.getTime();\n\n    Field f = KubernetesDeployments.class.getDeclaredField(\"watcherInitializationDate\");\n    f.setAccessible(true);\n    f.set(kubernetesDeployments, minuteAgo);\n\n    verify(eventNamespaceMixedOperation).watch(eventWatcherCaptor.capture());\n    Watcher<Event> watcher = eventWatcherCaptor.getValue();\n    Event event = mock(Event.class);\n    when(event.getInvolvedObject()).thenReturn(objectReference);\n    when(event.getMetadata()).thenReturn(new ObjectMeta());\n    when(event.getLastTimestamp()).thenReturn(null);\n    when(event.getFirstTimestamp()).thenReturn(null);\n\n    // When\n    watcher.eventReceived(Watcher.Action.ADDED, event);\n\n    // Then\n    verify(event, times(1)).getLastTimestamp();\n    verify(event, times(1)).getFirstTimestamp();\n    ArgumentCaptor<PodEvent> captor = ArgumentCaptor.forClass(PodEvent.class);\n    verify(podEventHandler).handle(captor.capture());\n    PodEvent podEvent = captor.getValue();\n    assertNotNull(podEvent.getLastTimestamp());\n  }\n\n  @Test\n  public void deploymentShouldHaveImagePullSecretsOfSAAndSelf() throws InfrastructureException {\n    final var client = kubernetesMockServer.createClient();\n    doReturn(client).when(clientFactory).create(anyString());\n\n    final String serviceAccountName = \"workspace-sa\";\n    LocalObjectReference pullSecretOfSA =\n        new LocalObjectReferenceBuilder().withName(\"pullsecret-sa\").build();\n    LocalObjectReference pullSecretOfPod =\n        new LocalObjectReferenceBuilder().withName(\"pullsecret-pod\").build();\n    List<LocalObjectReference> imagePullSecrets = new ArrayList<>();\n    imagePullSecrets.add(pullSecretOfPod);\n\n    ServiceAccount serviceAccount =\n        new ServiceAccountBuilder()\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(serviceAccountName)\n                    .withNamespace(kubernetesDeployments.namespace)\n                    .build())\n            .withImagePullSecrets(pullSecretOfSA)\n            .build();\n    client.serviceAccounts().inNamespace(kubernetesDeployments.namespace).create(serviceAccount);\n\n    ObjectMeta objectMeta =\n        new ObjectMetaBuilder()\n            .withName(\"test-pod\")\n            .withNamespace(kubernetesDeployments.namespace)\n            .build();\n\n    Deployment deployment =\n        new DeploymentBuilder()\n            .withMetadata(objectMeta)\n            .withSpec(\n                new DeploymentSpecBuilder()\n                    .withNewTemplate()\n                    .withMetadata(objectMeta)\n                    .withNewSpec()\n                    .withImagePullSecrets(imagePullSecrets)\n                    .withServiceAccountName(serviceAccountName)\n                    .endSpec()\n                    .endTemplate()\n                    .build())\n            .build();\n\n    kubernetesDeployments.addPullSecretsOfSA(deployment);\n    imagePullSecrets.add(pullSecretOfSA);\n    assertTrue(\n        deployment\n            .getSpec()\n            .getTemplate()\n            .getSpec()\n            .getImagePullSecrets()\n            .containsAll(imagePullSecrets));\n  }\n\n  @Test\n  public void deploymentShouldHavePullSecretsOnlyOfSelfWithNonexistentSA()\n      throws InfrastructureException {\n    doReturn(kubernetesMockServer.createClient()).when(clientFactory).create(anyString());\n\n    LocalObjectReference pullSecretOfPod =\n        new LocalObjectReferenceBuilder().withName(\"pullsecret-pod\").build();\n\n    ObjectMeta objectMeta =\n        new ObjectMetaBuilder()\n            .withName(\"test-pod\")\n            .withNamespace(kubernetesDeployments.namespace)\n            .build();\n\n    Deployment deployment =\n        new DeploymentBuilder()\n            .withMetadata(objectMeta)\n            .withSpec(\n                new DeploymentSpecBuilder()\n                    .withNewTemplate()\n                    .withMetadata(objectMeta)\n                    .withNewSpec()\n                    .withImagePullSecrets(pullSecretOfPod)\n                    .withServiceAccountName(\"nonexistent-sa\")\n                    .endSpec()\n                    .endTemplate()\n                    .build())\n            .build();\n\n    kubernetesDeployments.addPullSecretsOfSA(deployment);\n    assertTrue(\n        deployment\n            .getSpec()\n            .getTemplate()\n            .getSpec()\n            .getImagePullSecrets()\n            .contains(pullSecretOfPod));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesNamespaceFactoryTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.emptySet;\nimport static java.util.Collections.singletonList;\nimport static java.util.Optional.empty;\nimport static org.eclipse.che.api.workspace.shared.Constants.WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta.DEFAULT_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta.PHASE_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.CREDENTIALS_SECRET_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.PREFERENCES_CONFIGMAP_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.SECRETS_ROLE_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory.NAMESPACE_TEMPLATE_ATTRIBUTE;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyMap;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNull;\nimport static org.testng.Assert.assertTrue;\nimport static org.testng.Assert.fail;\n\nimport ch.qos.logback.classic.spi.LoggingEvent;\nimport ch.qos.logback.core.Appender;\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.Namespace;\nimport io.fabric8.kubernetes.api.model.NamespaceBuilder;\nimport io.fabric8.kubernetes.api.model.NamespaceList;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.ServiceAccountList;\nimport io.fabric8.kubernetes.api.model.Status;\nimport io.fabric8.kubernetes.api.model.rbac.ClusterRoleBuilder;\nimport io.fabric8.kubernetes.api.model.rbac.PolicyRule;\nimport io.fabric8.kubernetes.api.model.rbac.Role;\nimport io.fabric8.kubernetes.api.model.rbac.RoleBindingList;\nimport io.fabric8.kubernetes.api.model.rbac.RoleList;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable;\nimport io.fabric8.kubernetes.client.dsl.MixedOperation;\nimport io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMixedDispatcher;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;\nimport io.fabric8.mockwebserver.Context;\nimport io.fabric8.mockwebserver.MockWebServer;\nimport io.fabric8.mockwebserver.ServerRequest;\nimport io.fabric8.mockwebserver.ServerResponse;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Queue;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.user.server.PreferenceManager;\nimport org.eclipse.che.api.workspace.server.model.impl.RuntimeIdentityImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl.WorkspaceImplBuilder;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.inject.ConfigurationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.server.impls.KubernetesNamespaceMetaImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.AuthorizationChecker;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.PermissionsCleaner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.NamespaceConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.PreferencesConfigMapConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.WorkspaceServiceAccountConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.NamespaceProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.KubernetesSharedPool;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.testng.Assert;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\nimport org.testng.collections.Sets;\n\n/**\n * Tests {@link KubernetesNamespaceFactory}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesNamespaceFactoryTest {\n\n  private static final String USER_ID = \"userid\";\n  private static final String USER_NAME = \"username\";\n  private static final String NAMESPACE_LABEL_NAME = \"component\";\n  private static final String NAMESPACE_LABELS = NAMESPACE_LABEL_NAME + \"=workspace\";\n  private static final String NAMESPACE_ANNOTATION_NAME = \"owner\";\n  private static final String NAMESPACE_ANNOTATIONS = NAMESPACE_ANNOTATION_NAME + \"=<username>\";\n\n  @Mock private KubernetesSharedPool pool;\n  @Mock private CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  private KubernetesClient k8sClient;\n  @Mock private PreferenceManager preferenceManager;\n  @Mock Appender mockedAppender;\n  @Mock AuthorizationChecker authorizationChecker;\n  @Mock PermissionsCleaner permissionsCleaner;\n\n  @Mock private NonNamespaceOperation namespaceOperation;\n\n  @Mock private Resource<Namespace> namespaceResource;\n\n  private KubernetesMockServer kubernetesMockServer;\n\n  private KubernetesNamespaceFactory namespaceFactory;\n\n  @Mock\n  private FilterWatchListDeletable<Namespace, NamespaceList, Resource<NamespaceList>>\n      namespaceListResource;\n\n  @Mock private NamespaceList namespaceList;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    final Map<ServerRequest, Queue<ServerResponse>> responses = new HashMap<>();\n    kubernetesMockServer =\n        new KubernetesMockServer(\n            new Context(),\n            new MockWebServer(),\n            responses,\n            new KubernetesMixedDispatcher(responses),\n            true);\n    kubernetesMockServer.init();\n    k8sClient = spy(kubernetesMockServer.createClient());\n    lenient().when(cheServerKubernetesClientFactory.create()).thenReturn(k8sClient);\n    lenient().when(k8sClient.namespaces()).thenReturn(namespaceOperation);\n\n    lenient().when(namespaceOperation.withName(any())).thenReturn(namespaceResource);\n    lenient().when(namespaceResource.get()).thenReturn(mock(Namespace.class));\n    lenient().when(authorizationChecker.isAuthorized(any(Subject.class))).thenReturn(true);\n\n    lenient().doReturn(namespaceListResource).when(namespaceOperation).withLabels(anyMap());\n    lenient().when(namespaceListResource.list()).thenReturn(namespaceList);\n    lenient().when(namespaceList.getItems()).thenReturn(Collections.emptyList());\n\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"jondoe\", Collections.emptyList(), \"i123\", null, false));\n  }\n\n  @AfterMethod\n  public void tearDown() {\n    EnvironmentContext.reset();\n    kubernetesMockServer.destroy();\n  }\n\n  @Test\n  public void shouldNotThrowExceptionIfDefaultNamespaceIsSpecifiedOnCheckingIfNamespaceIsAllowed()\n      throws Exception {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    namespaceFactory.checkIfNamespaceIsAllowed(\"jondoe-che\");\n  }\n\n  @Test\n  public void shouldLookAtStoredNamespacesOnCheckingIfNamespaceIsAllowed() throws Exception {\n\n    Map<String, String> prefs = new HashMap<>();\n    prefs.put(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"any-namespace\");\n    prefs.put(NAMESPACE_TEMPLATE_ATTRIBUTE, \"<username>-che\");\n\n    when(preferenceManager.find(anyString())).thenReturn(prefs);\n\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    namespaceFactory.checkIfNamespaceIsAllowed(\"any-namespace\");\n  }\n\n  @Test\n  public void shouldNormaliseNamespaceWhenUserNameStartsWithKube() {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"che-<userid>\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    assertEquals(\"che-kube-admin\", namespaceFactory.normalizeNamespaceName(\"kube:admin\"));\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"User defined namespaces are not allowed. Only the default namespace 'jondoe-che' is available.\")\n  public void\n      shouldThrowExceptionIfNonDefaultNamespaceIsSpecifiedAndUserDefinedAreNotAllowedOnCheckingIfNamespaceIsAllowed()\n          throws Exception {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    namespaceFactory.checkIfNamespaceIsAllowed(\"any-namespace\");\n  }\n\n  @Test(\n      expectedExceptions = ConfigurationException.class,\n      expectedExceptionsMessageRegExp = \"che.infra.kubernetes.namespace.default must be configured\")\n  public void shouldThrowExceptionIfNoDefaultNamespaceIsConfigured() {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            null,\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n  }\n\n  @Test\n  public void shouldReturnPreparedNamespacesWhenFound() throws InfrastructureException {\n    // given\n    List<Namespace> namespaces =\n        Arrays.asList(\n            new NamespaceBuilder()\n                .withNewMetadata()\n                .withName(\"ns1\")\n                .withAnnotations(Map.of(NAMESPACE_ANNOTATION_NAME, \"jondoe\"))\n                .endMetadata()\n                .withNewStatus()\n                .withPhase(\"Active\")\n                .endStatus()\n                .build(),\n            new NamespaceBuilder()\n                .withNewMetadata()\n                .withName(\"ns2\")\n                .withAnnotations(Map.of(NAMESPACE_ANNOTATION_NAME, \"jondoe\"))\n                .endMetadata()\n                .withNewStatus()\n                .withPhase(\"Active\")\n                .endStatus()\n                .build(),\n            new NamespaceBuilder()\n                .withNewMetadata()\n                .withName(\"ns3\")\n                .withAnnotations(Map.of(NAMESPACE_ANNOTATION_NAME, \"some_other_user\"))\n                .endMetadata()\n                .withNewStatus()\n                .withPhase(\"Active\")\n                .endStatus()\n                .build());\n    doReturn(namespaces).when(namespaceList).getItems();\n\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"jondoe\", Collections.emptyList(), \"123\", null, false));\n\n    // when\n    List<KubernetesNamespaceMeta> availableNamespaces = namespaceFactory.list();\n\n    // then\n    assertEquals(availableNamespaces.size(), 2);\n    verify(namespaceOperation).withLabels(Map.of(NAMESPACE_LABEL_NAME, \"workspace\"));\n    assertEquals(availableNamespaces.get(0).getName(), \"ns1\");\n    assertEquals(availableNamespaces.get(1).getName(), \"ns2\");\n  }\n\n  @Test\n  public void shouldNotThrowAnExceptionWhenNotAllowedToListNamespaces() throws Exception {\n    // given\n    Namespace ns =\n        new NamespaceBuilder()\n            .withNewMetadata()\n            .withName(\"ns1\")\n            .endMetadata()\n            .withNewStatus()\n            .withPhase(\"Active\")\n            .endStatus()\n            .build();\n    doThrow(new KubernetesClientException(\"Not allowed.\", 403, new Status()))\n        .when(namespaceList)\n        .getItems();\n    prepareNamespaceToBeFoundByName(\"jondoe-che\", ns);\n\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"jondoe\", Collections.emptyList(), \"123\", null, false));\n\n    // when\n    List<KubernetesNamespaceMeta> availableNamespaces = namespaceFactory.list();\n\n    // then\n    assertEquals(availableNamespaces.get(0).getName(), \"ns1\");\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void throwAnExceptionWhenErrorListingNamespaces() throws Exception {\n    // given\n    doThrow(new KubernetesClientException(\"Not allowed.\", 500, new Status()))\n        .when(namespaceList)\n        .getItems();\n\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    // when\n    namespaceFactory.list();\n\n    // then throw\n  }\n\n  @Test\n  public void shouldReturnDefaultNamespaceWhenItExists() throws Exception {\n    prepareNamespaceToBeFoundByName(\n        \"jondoe-che\",\n        new NamespaceBuilder()\n            .withNewMetadata()\n            .withName(\"jondoe-che\")\n            .endMetadata()\n            .withNewStatus()\n            .withPhase(\"Active\")\n            .endStatus()\n            .build());\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    List<KubernetesNamespaceMeta> availableNamespaces = namespaceFactory.list();\n    assertEquals(availableNamespaces.size(), 1);\n    KubernetesNamespaceMeta defaultNamespace = availableNamespaces.get(0);\n    assertEquals(defaultNamespace.getName(), \"jondoe-che\");\n    assertEquals(defaultNamespace.getAttributes().get(DEFAULT_ATTRIBUTE), \"true\");\n    assertEquals(defaultNamespace.getAttributes().get(PHASE_ATTRIBUTE), \"Active\");\n  }\n\n  @Test\n  public void shouldReturnDefaultNamespaceWhenItDoesNotExistAndUserDefinedIsNotAllowed()\n      throws Exception {\n    prepareNamespaceToBeFoundByName(\"jondoe-che\", null);\n\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    List<KubernetesNamespaceMeta> availableNamespaces = namespaceFactory.list();\n    assertEquals(availableNamespaces.size(), 1);\n    KubernetesNamespaceMeta defaultNamespace = availableNamespaces.get(0);\n    assertEquals(defaultNamespace.getName(), \"jondoe-che\");\n    assertEquals(defaultNamespace.getAttributes().get(DEFAULT_ATTRIBUTE), \"true\");\n    assertNull(\n        defaultNamespace\n            .getAttributes()\n            .get(PHASE_ATTRIBUTE)); // no phase - means such namespace does not exist\n  }\n\n  @Test\n  public void shouldCreatePreferencesConfigmapIfNotExists() throws Exception {\n    // given\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                Set.of(new PreferencesConfigMapConfigurator(cheServerKubernetesClientFactory)),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    when(toReturnNamespace.getName()).thenReturn(\"namespaceName\");\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n    MixedOperation mixedOperation = mock(MixedOperation.class);\n    when(k8sClient.configMaps()).thenReturn(mixedOperation);\n    when(mixedOperation.inNamespace(anyString())).thenReturn(namespaceOperation);\n    when(namespaceResource.get()).thenReturn(null);\n\n    // when\n    RuntimeIdentity identity =\n        new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"workspace123\");\n    namespaceFactory.getOrCreate(identity);\n\n    // then\n    ArgumentCaptor<ConfigMap> configMapCaptor = ArgumentCaptor.forClass(ConfigMap.class);\n    verify(namespaceOperation).create(configMapCaptor.capture());\n    ConfigMap configmap = configMapCaptor.getValue();\n    Assert.assertEquals(configmap.getMetadata().getName(), PREFERENCES_CONFIGMAP_NAME);\n  }\n\n  @Test\n  public void testAllConfiguratorsAreCalledWhenCreatingNamespace() throws InfrastructureException {\n    // given\n    String namespaceName = \"testNamespaceName\";\n    NamespaceConfigurator configurator1 = Mockito.mock(NamespaceConfigurator.class);\n    NamespaceConfigurator configurator2 = Mockito.mock(NamespaceConfigurator.class);\n    Set<NamespaceConfigurator> namespaceConfigurators = Set.of(configurator1, configurator2);\n\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                namespaceConfigurators,\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"jondoe\", Collections.emptyList(), \"123\", null, false));\n\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    when(toReturnNamespace.getName()).thenReturn(namespaceName);\n\n    RuntimeIdentity identity = new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"old-che\");\n    doReturn(toReturnNamespace).when(namespaceFactory).get(identity);\n\n    // when\n    KubernetesNamespace namespace = namespaceFactory.getOrCreate(identity);\n\n    // then\n    NamespaceResolutionContext resolutionCtx =\n        new NamespaceResolutionContext(\"workspace123\", \"123\", \"jondoe\");\n    verify(configurator1).configure(resolutionCtx, namespaceName);\n    verify(configurator2).configure(resolutionCtx, namespaceName);\n    assertEquals(namespace, toReturnNamespace);\n  }\n\n  @Test\n  public void shouldNotCreateCredentialsSecretIfExists() throws Exception {\n    // given\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                emptySet(),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    prepareNamespace(toReturnNamespace);\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n    MixedOperation mixedOperation = mock(MixedOperation.class);\n    lenient().when(k8sClient.secrets()).thenReturn(mixedOperation);\n    lenient().when(mixedOperation.inNamespace(anyString())).thenReturn(namespaceOperation);\n\n    // when\n    RuntimeIdentity identity =\n        new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"workspace123\");\n    namespaceFactory.getOrCreate(identity);\n\n    // then\n    verify(namespaceOperation, never()).create(any());\n  }\n\n  @Test\n  public void shouldNotCreatePreferencesConfigmapIfExists() throws Exception {\n    // given\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                emptySet(),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    prepareNamespace(toReturnNamespace);\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n    MixedOperation mixedOperation = mock(MixedOperation.class);\n    lenient().when(k8sClient.configMaps()).thenReturn(mixedOperation);\n    lenient().when(mixedOperation.inNamespace(anyString())).thenReturn(namespaceOperation);\n\n    // when\n    RuntimeIdentity identity =\n        new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"workspace123\");\n    namespaceFactory.getOrCreate(identity);\n\n    // then\n    verify(namespaceOperation, never()).create(any());\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Error occurred when tried to fetch default namespace. Cause: connection refused\")\n  public void shouldThrowExceptionWhenFailedToGetInfoAboutDefaultNamespace() throws Exception {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n    throwOnTryToGetNamespaceByName(\n        \"jondoe-che\", new KubernetesClientException(\"connection refused\"));\n\n    namespaceFactory.list();\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Error occurred when tried to list all available namespaces. Cause: connection refused\")\n  public void shouldThrowExceptionWhenFailedToGetNamespaces() throws Exception {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n    throwOnTryToGetNamespacesList(new KubernetesClientException(\"connection refused\"));\n\n    namespaceFactory.list();\n  }\n\n  @Test\n  public void shouldRequireNamespacePriorExistenceIfDifferentFromDefaultAndUserDefinedIsNotAllowed()\n      throws Exception {\n    // There is only one scenario where this can happen. The workspace was created and started in\n    // some default namespace. Then server was reconfigured to use a different default namespace\n    // AND the namespace of the workspace was MANUALLY deleted in the cluster. In this case, we\n    // should NOT try to re-create the namespace because it would be created in a namespace that\n    // is not configured. We DO allow it to start if the namespace still exists though.\n\n    // given\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                emptySet(),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    prepareNamespace(toReturnNamespace);\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n\n    // when\n    RuntimeIdentity identity = new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"old-che\");\n    KubernetesNamespace namespace = namespaceFactory.getOrCreate(identity);\n\n    // then\n    assertEquals(toReturnNamespace, namespace);\n    verify(toReturnNamespace).prepare(eq(true), any(), any());\n  }\n\n  @Test\n  public void shouldReturnDefaultNamespaceWhenCreatingIsNotIsNotAllowed() throws Exception {\n    // given\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-che\",\n                false,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                emptySet(),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    prepareNamespace(toReturnNamespace);\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n\n    // when\n    RuntimeIdentity identity =\n        new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"old-default\");\n    KubernetesNamespace namespace = namespaceFactory.getOrCreate(identity);\n\n    // then\n    assertEquals(toReturnNamespace, namespace);\n    verify(toReturnNamespace).prepare(eq(false), any(), any());\n  }\n\n  @Test\n  public void shouldPrepareWorkspaceServiceAccountIfItIsConfiguredAndNamespaceIsNotPredefined()\n      throws Exception {\n    // given\n    var serviceAccountCfg =\n        spy(\n            new WorkspaceServiceAccountConfigurator(\n                \"serviceAccount\", \"\", cheServerKubernetesClientFactory));\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                Set.of(serviceAccountCfg),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    prepareNamespace(toReturnNamespace);\n    when(toReturnNamespace.getName()).thenReturn(\"workspace123\");\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n\n    KubernetesWorkspaceServiceAccount serviceAccount =\n        mock(KubernetesWorkspaceServiceAccount.class);\n    doReturn(serviceAccount).when(serviceAccountCfg).doCreateServiceAccount(any(), any());\n\n    // when\n    RuntimeIdentity identity =\n        new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"workspace123\");\n    namespaceFactory.getOrCreate(identity);\n\n    // then\n    verify(serviceAccountCfg).doCreateServiceAccount(\"workspace123\", \"workspace123\");\n    verify(serviceAccount).prepare();\n  }\n\n  @Test\n  public void shouldBindToAllConfiguredClusterRoles() throws Exception {\n    // given\n    var serviceAccountConfigurator =\n        new WorkspaceServiceAccountConfigurator(\n            \"serviceAccount\", \"cr2, cr3\", cheServerKubernetesClientFactory);\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                Set.of(serviceAccountConfigurator),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    prepareNamespace(toReturnNamespace);\n    when(toReturnNamespace.getName()).thenReturn(\"workspace123\");\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n    when(k8sClient.supportsApiPath(eq(\"/apis/metrics.k8s.io\"))).thenReturn(true);\n    when(cheServerKubernetesClientFactory.create(any())).thenReturn(k8sClient);\n\n    // pre-create the cluster roles\n    Stream.of(\"cr1\", \"cr2\", \"cr3\")\n        .forEach(\n            cr ->\n                k8sClient\n                    .rbac()\n                    .clusterRoles()\n                    .createOrReplace(\n                        new ClusterRoleBuilder()\n                            .withNewMetadata()\n                            .withName(cr)\n                            .endMetadata()\n                            .build()));\n\n    // when\n    RuntimeIdentity identity =\n        new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"workspace123\");\n    namespaceFactory.getOrCreate(identity);\n\n    // then\n\n    ServiceAccountList sas = k8sClient.serviceAccounts().inNamespace(\"workspace123\").list();\n    assertEquals(sas.getItems().size(), 1);\n    assertEquals(sas.getItems().get(0).getMetadata().getName(), \"serviceAccount\");\n\n    RoleList roles = k8sClient.rbac().roles().inNamespace(\"workspace123\").list();\n    assertEquals(\n        roles.getItems().stream().map(r -> r.getMetadata().getName()).collect(Collectors.toSet()),\n        Sets.newHashSet(\n            \"workspace-configmaps\",\n            \"workspace-view\",\n            \"workspace-metrics\",\n            \"workspace-secrets\",\n            \"exec\"));\n    RoleBindingList bindings = k8sClient.rbac().roleBindings().inNamespace(\"workspace123\").list();\n    assertEquals(\n        bindings.getItems().stream()\n            .map(r -> r.getMetadata().getName())\n            .collect(Collectors.toSet()),\n        Sets.newHashSet(\n            \"serviceAccount-metrics\",\n            \"serviceAccount-cluster0\",\n            \"serviceAccount-cluster1\",\n            \"serviceAccount-configmaps\",\n            \"serviceAccount-view\",\n            \"serviceAccount-exec\",\n            \"serviceAccount-secrets\"));\n  }\n\n  @Test\n  public void shouldCreateAndBindCredentialsSecretRole() throws Exception {\n    // given\n    var serviceAccountConfigurator =\n        new WorkspaceServiceAccountConfigurator(\n            \"serviceAccount\", \"cr2, cr3\", cheServerKubernetesClientFactory);\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                Set.of(serviceAccountConfigurator),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    prepareNamespace(toReturnNamespace);\n    when(toReturnNamespace.getName()).thenReturn(\"workspace123\");\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n    when(cheServerKubernetesClientFactory.create(any())).thenReturn(k8sClient);\n\n    // when\n    RuntimeIdentity identity =\n        new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"workspace123\");\n    namespaceFactory.getOrCreate(identity);\n\n    // then\n    Optional<Role> roleOptional =\n        k8sClient.rbac().roles().inNamespace(\"workspace123\").list().getItems().stream()\n            .filter(r -> r.getMetadata().getName().equals(SECRETS_ROLE_NAME))\n            .findAny();\n    assertTrue(roleOptional.isPresent());\n    PolicyRule rule = roleOptional.get().getRules().get(0);\n    assertEquals(rule.getResources(), singletonList(\"secrets\"));\n    assertEquals(rule.getResourceNames(), singletonList(CREDENTIALS_SECRET_NAME));\n    assertEquals(rule.getApiGroups(), singletonList(\"\"));\n    assertEquals(rule.getVerbs(), Arrays.asList(\"get\", \"patch\"));\n    assertTrue(\n        k8sClient.rbac().roleBindings().inNamespace(\"workspace123\").list().getItems().stream()\n            .anyMatch(rb -> rb.getMetadata().getName().equals(\"serviceAccount-secrets\")));\n  }\n\n  @Test\n  public void shouldCreateExecAndViewRolesAndBindings() throws Exception {\n    // given\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                Set.of(\n                    new WorkspaceServiceAccountConfigurator(\n                        \"serviceAccount\", \"\", cheServerKubernetesClientFactory)),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    prepareNamespace(toReturnNamespace);\n    when(toReturnNamespace.getName()).thenReturn(\"workspace123\");\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n    when(k8sClient.supportsApiPath(eq(\"/apis/metrics.k8s.io\"))).thenReturn(true);\n    when(cheServerKubernetesClientFactory.create(any())).thenReturn(k8sClient);\n\n    // when\n    RuntimeIdentity identity =\n        new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"workspace123\");\n    namespaceFactory.getOrCreate(identity);\n\n    // then\n\n    ServiceAccountList sas = k8sClient.serviceAccounts().inNamespace(\"workspace123\").list();\n    assertEquals(sas.getItems().size(), 1);\n    assertEquals(sas.getItems().get(0).getMetadata().getName(), \"serviceAccount\");\n\n    RoleList roles = k8sClient.rbac().roles().inNamespace(\"workspace123\").list();\n    assertEquals(\n        roles.getItems().stream().map(r -> r.getMetadata().getName()).collect(Collectors.toSet()),\n        Sets.newHashSet(\n            \"workspace-configmaps\",\n            \"workspace-view\",\n            \"workspace-metrics\",\n            \"workspace-secrets\",\n            \"exec\"));\n    Role role1 = roles.getItems().get(0);\n    Role role2 = roles.getItems().get(1);\n\n    assertFalse(\n        role1.getRules().containsAll(role2.getRules())\n            && role2.getRules().containsAll(role1.getRules()),\n        \"exec and view roles should not be the same\");\n\n    RoleBindingList bindings = k8sClient.rbac().roleBindings().inNamespace(\"workspace123\").list();\n    assertEquals(\n        bindings.getItems().stream()\n            .map(r -> r.getMetadata().getName())\n            .collect(Collectors.toSet()),\n        Sets.newHashSet(\n            \"serviceAccount-metrics\",\n            \"serviceAccount-view\",\n            \"serviceAccount-exec\",\n            \"serviceAccount-configmaps\",\n            \"serviceAccount-secrets\"));\n  }\n\n  @Test\n  public void\n      testEvalNamespaceUsesNamespaceDefaultIfWorkspaceDoesntRecordNamespaceAndLegacyNamespaceDoesntExist()\n          throws Exception {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"che-<userid>\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    WorkspaceImpl workspace =\n        new WorkspaceImplBuilder().setId(\"workspace123\").setAttributes(emptyMap()).build();\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"jondoe\", Collections.emptyList(), \"123\", null, false));\n    String namespace = namespaceFactory.getNamespaceName(workspace);\n\n    assertEquals(namespace, \"che-123\");\n  }\n\n  @Test\n  public void testEvalNamespaceUsesNamespaceFromUserPreferencesIfExist() throws Exception {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"che-<userid>\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    Map<String, String> prefs = new HashMap<>();\n    prefs.put(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"che-123\");\n    prefs.put(NAMESPACE_TEMPLATE_ATTRIBUTE, \"che-<userid>\");\n\n    when(preferenceManager.find(anyString())).thenReturn(prefs);\n    String namespace =\n        namespaceFactory.evaluateNamespaceName(\n            new NamespaceResolutionContext(\"workspace123\", \"user123\", \"jondoe\"));\n\n    assertEquals(namespace, \"che-123\");\n  }\n\n  @Test\n  public void testEvalNamespaceSkipsNamespaceFromUserPreferencesIfTemplateChanged()\n      throws Exception {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"che-<userid>-<username>\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    Map<String, String> prefs = new HashMap<>();\n    // returned but ignored\n    prefs.put(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"che-123\");\n    prefs.put(NAMESPACE_TEMPLATE_ATTRIBUTE, \"che-<userid>\");\n\n    when(preferenceManager.find(anyString())).thenReturn(prefs);\n    String namespace =\n        namespaceFactory.evaluateNamespaceName(\n            new NamespaceResolutionContext(\"workspace123\", \"user123\", \"jondoe\"));\n\n    assertEquals(namespace, \"che-user123-jondoe\");\n  }\n\n  @Test\n  public void testEvalNamespaceSkipsNamespaceFromUserPreferencesIfUserAllowedPropertySetFalse()\n      throws Exception {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"che-<userid>-<username>\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    Map<String, String> prefs = new HashMap<>();\n    // returned but ignored\n    prefs.put(WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"che-123\");\n    prefs.put(NAMESPACE_TEMPLATE_ATTRIBUTE, \"che-<userid>\");\n\n    when(preferenceManager.find(anyString())).thenReturn(prefs);\n    String namespace =\n        namespaceFactory.evaluateNamespaceName(\n            new NamespaceResolutionContext(\"workspace123\", \"user123\", \"jondoe\"));\n\n    assertEquals(namespace, \"che-user123-jondoe\");\n  }\n\n  @Test\n  public void testEvalNamespaceKubeAdmin() throws Exception {\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"che-<username>\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                emptySet(),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    doReturn(empty()).when(namespaceFactory).fetchNamespace(anyString());\n\n    String namespace =\n        namespaceFactory.evaluateNamespaceName(\n            new NamespaceResolutionContext(\"workspace123\", \"kube:admin\", \"kube:admin\"));\n\n    assertTrue(namespace.startsWith(\"che-kube-admin-\"));\n    assertEquals(namespace.length(), 21);\n  }\n\n  @Test\n  public void testEvalNamespaceUsesWorkspaceRecordedNamespaceIfWorkspaceRecordsIt()\n      throws Exception {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"che-<userid>\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    WorkspaceImpl workspace =\n        new WorkspaceImplBuilder()\n            .setAttributes(\n                ImmutableMap.of(\n                    Constants.WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"wkspcnmspc\"))\n            .build();\n\n    String namespace = namespaceFactory.getNamespaceName(workspace);\n\n    assertEquals(namespace, \"wkspcnmspc\");\n  }\n\n  @Test\n  public void testEvalNamespaceTreatsWorkspaceRecordedNamespaceLiterally() throws Exception {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"che-<userid>\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    WorkspaceImpl workspace =\n        new WorkspaceImplBuilder()\n            .setAttributes(\n                ImmutableMap.of(Constants.WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE, \"ns34345\"))\n            .build();\n\n    String namespace = namespaceFactory.getNamespaceName(workspace);\n\n    assertEquals(namespace, \"ns34345\");\n  }\n\n  @Test\n  public void testEvalNamespaceNameWhenPreparedNamespacesFound() throws InfrastructureException {\n    List<Namespace> namespaces =\n        Arrays.asList(\n            new NamespaceBuilder()\n                .withNewMetadata()\n                .withName(\"ns1\")\n                .withAnnotations(Map.of(NAMESPACE_ANNOTATION_NAME, \"jondoe\"))\n                .endMetadata()\n                .withNewStatus()\n                .withPhase(\"Active\")\n                .endStatus()\n                .build(),\n            new NamespaceBuilder()\n                .withNewMetadata()\n                .withName(\"ns2\")\n                .withAnnotations(Map.of(NAMESPACE_ANNOTATION_NAME, \"jondoe\"))\n                .endMetadata()\n                .withNewStatus()\n                .withPhase(\"Active\")\n                .endStatus()\n                .build());\n    doReturn(namespaces).when(namespaceList).getItems();\n\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    String namespace =\n        namespaceFactory.evaluateNamespaceName(\n            new NamespaceResolutionContext(\"workspace123\", \"user123\", \"jondoe\"));\n\n    assertEquals(namespace, \"ns1\");\n  }\n\n  @Test\n  public void shouldHandleProvision() throws InfrastructureException {\n    // given\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-che\",\n                false,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                emptySet(),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    prepareNamespace(toReturnNamespace);\n    when(toReturnNamespace.getName()).thenReturn(\"jondoe-che\");\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n    KubernetesNamespaceMetaImpl namespaceMeta =\n        new KubernetesNamespaceMetaImpl(\n            \"jondoe-che\", ImmutableMap.of(\"phase\", \"active\", \"default\", \"true\"));\n    doReturn(Optional.of(namespaceMeta)).when(namespaceFactory).fetchNamespace(eq(\"jondoe-che\"));\n\n    // when\n    NamespaceResolutionContext context =\n        new NamespaceResolutionContext(\"workspace123\", \"user123\", \"jondoe\");\n    KubernetesNamespaceMeta actual = testProvisioning(context);\n\n    // then\n    assertEquals(actual.getName(), \"jondoe-che\");\n    assertEquals(actual.getAttributes(), ImmutableMap.of(\"phase\", \"active\", \"default\", \"true\"));\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp = \"Not able to find namespace jondoe-cha-cha-cha\")\n  public void shouldFailToProvisionIfNotAbleToFindNamespace() throws InfrastructureException {\n    // given\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-cha-cha-cha\",\n                false,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                emptySet(),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    prepareNamespace(toReturnNamespace);\n    when(toReturnNamespace.getName()).thenReturn(\"jondoe-cha-cha-cha\");\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n    KubernetesNamespaceMetaImpl namespaceMeta =\n        new KubernetesNamespaceMetaImpl(\n            \"jondoe-cha-cha-cha\", ImmutableMap.of(\"phase\", \"active\", \"default\", \"true\"));\n    doReturn(empty()).when(namespaceFactory).fetchNamespace(eq(\"jondoe-cha-cha-cha\"));\n\n    // when\n    NamespaceResolutionContext context =\n        new NamespaceResolutionContext(\"workspace123\", \"user123\", \"jondoe\");\n    testProvisioning(context);\n\n    // then\n    fail(\"should not reach this point since exception has to be thrown\");\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp = \"Error occurred when tried to fetch default namespace\")\n  public void shouldFail2ProvisionIfNotAbleToFindNamespace() throws InfrastructureException {\n    // given\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-cha-cha-cha\",\n                false,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                emptySet(),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    prepareNamespace(toReturnNamespace);\n    when(toReturnNamespace.getName()).thenReturn(\"jondoe-cha-cha-cha\");\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n    KubernetesNamespaceMetaImpl namespaceMeta =\n        new KubernetesNamespaceMetaImpl(\n            \"jondoe-cha-cha-cha\", ImmutableMap.of(\"phase\", \"active\", \"default\", \"true\"));\n    doThrow(new InfrastructureException(\"Error occurred when tried to fetch default namespace\"))\n        .when(namespaceFactory)\n        .fetchNamespace(eq(\"jondoe-cha-cha-cha\"));\n\n    // when\n    NamespaceResolutionContext context =\n        new NamespaceResolutionContext(\"workspace123\", \"user123\", \"jondoe\");\n\n    testProvisioning(context);\n\n    // then\n    fail(\"should not reach this point since exception has to be thrown\");\n  }\n\n  @Test\n  public void testUsernamePlaceholderInLabelsIsNotEvaluated() throws InfrastructureException {\n    List<Namespace> namespaces =\n        singletonList(\n            new NamespaceBuilder()\n                .withNewMetadata()\n                .withName(\"ns1\")\n                .withAnnotations(Map.of(NAMESPACE_ANNOTATION_NAME, \"jondoe\"))\n                .endMetadata()\n                .withNewStatus()\n                .withPhase(\"Active\")\n                .endStatus()\n                .build());\n    doReturn(namespaces).when(namespaceList).getItems();\n\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            \"try_placeholder_here=<username>\",\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"jondoe\", Collections.emptyList(), \"123\", null, false));\n    namespaceFactory.list();\n\n    verify(namespaceOperation).withLabels(Map.of(\"try_placeholder_here\", \"<username>\"));\n  }\n\n  @Test\n  public void testUsernamePlaceholderInAnnotationsIsEvaluated() throws InfrastructureException {\n\n    // given\n    namespaceFactory =\n        spy(\n            new KubernetesNamespaceFactory(\n                \"<username>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                \"try_placeholder_here=<username>\",\n                emptySet(),\n                cheServerKubernetesClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"jondoe\", Collections.emptyList(), \"123\", null, false));\n    KubernetesNamespace toReturnNamespace = mock(KubernetesNamespace.class);\n    prepareNamespace(toReturnNamespace);\n    doReturn(toReturnNamespace).when(namespaceFactory).doCreateNamespaceAccess(any(), any());\n\n    // when\n    RuntimeIdentity identity = new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"old-che\");\n    KubernetesNamespace namespace = namespaceFactory.getOrCreate(identity);\n\n    // then\n    assertEquals(toReturnNamespace, namespace);\n    verify(toReturnNamespace)\n        .prepare(eq(true), any(), eq(Map.of(\"try_placeholder_here\", \"jondoe\")));\n  }\n\n  @Test(dataProvider = \"invalidUsernames\")\n  public void normalizeTest(String raw, String expected) {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n    assertEquals(expected, namespaceFactory.normalizeNamespaceName(raw));\n  }\n\n  @Test\n  public void normalizeLengthTest() {\n    namespaceFactory =\n        new KubernetesNamespaceFactory(\n            \"che-<userid>\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            emptySet(),\n            cheServerKubernetesClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    assertEquals(\n        63,\n        namespaceFactory\n            .normalizeNamespaceName(\n                \"looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\")\n            .length());\n  }\n\n  public void assertEqualsMessage(String message) {\n    // verify using ArgumentCaptor\n    ArgumentCaptor<Appender> argumentCaptor = ArgumentCaptor.forClass(Appender.class);\n    Mockito.verify(mockedAppender).doAppend(argumentCaptor.capture());\n\n    // assert against argumentCaptor.getAllValues()\n    Assert.assertEquals(1, argumentCaptor.getAllValues().size());\n    Assert.assertEquals(\n        ((LoggingEvent) argumentCaptor.getAllValues().get(0)).getMessage(), message);\n  }\n\n  @BeforeMethod\n  public void addMockedAppender() {\n    ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(KubernetesNamespaceFactory.class))\n        .addAppender(mockedAppender);\n  }\n\n  @AfterMethod\n  public void detachMockedAppender() {\n    // remove the mock appender from static context\n    ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME))\n        .detachAppender(mockedAppender);\n  }\n\n  @DataProvider\n  public static Object[][] invalidUsernames() {\n    return new Object[][] {\n      new Object[] {\"gmail@foo.bar\", \"gmail-foo-bar\"},\n      new Object[] {\"_fef_123-ah_*zz**\", \"fef-123-ah-zz\"},\n      new Object[] {\"a-b#-hello\", \"a-b-hello\"},\n      new Object[] {\"a---------b\", \"a-b\"},\n      new Object[] {\"--ab--\", \"ab\"}\n    };\n  }\n\n  private void prepareNamespaceToBeFoundByName(String name, Namespace namespace) throws Exception {\n    @SuppressWarnings(\"unchecked\")\n    Resource<Namespace> getNamespaceByNameOperation = mock(Resource.class);\n    when(namespaceOperation.withName(name)).thenReturn(getNamespaceByNameOperation);\n\n    when(getNamespaceByNameOperation.get()).thenReturn(namespace);\n  }\n\n  private void throwOnTryToGetNamespaceByName(String namespaceName, Throwable e) throws Exception {\n    @SuppressWarnings(\"unchecked\")\n    Resource<Namespace> getNamespaceByNameOperation = mock(Resource.class);\n    when(namespaceOperation.withName(namespaceName)).thenReturn(getNamespaceByNameOperation);\n\n    when(getNamespaceByNameOperation.get()).thenThrow(e);\n  }\n\n  private void prepareListedNamespaces(List<Namespace> namespaces) throws Exception {\n    @SuppressWarnings(\"unchecked\")\n    NamespaceList namespaceList = mock(NamespaceList.class);\n    when(namespaceList.getItems()).thenReturn(namespaces);\n\n    when(namespaceListResource.list()).thenReturn(namespaceList);\n  }\n\n  private void throwOnTryToGetNamespacesList(Throwable e) throws Exception {\n    when(namespaceList.getItems()).thenThrow(e);\n  }\n\n  private void prepareNamespace(KubernetesNamespace namespace) throws InfrastructureException {\n    KubernetesSecrets secrets = mock(KubernetesSecrets.class);\n    lenient().when(namespace.secrets()).thenReturn(secrets);\n    KubernetesConfigsMaps configmaps = mock(KubernetesConfigsMaps.class);\n    lenient().when(namespace.secrets()).thenReturn(secrets);\n    lenient().when(namespace.configMaps()).thenReturn(configmaps);\n    Secret secretMock = mock(Secret.class);\n    ObjectMeta objectMeta = mock(ObjectMeta.class);\n    lenient().when(objectMeta.getName()).thenReturn(CREDENTIALS_SECRET_NAME);\n    lenient().when(secretMock.getMetadata()).thenReturn(objectMeta);\n    lenient().when(secrets.get()).thenReturn(Collections.singletonList(secretMock));\n  }\n\n  private Namespace createNamespace(String name, String phase) {\n    return new NamespaceBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .endMetadata()\n        .withNewStatus()\n        .withPhase(phase)\n        .endStatus()\n        .build();\n  }\n\n  private KubernetesNamespaceMeta testProvisioning(NamespaceResolutionContext context)\n      throws InfrastructureException {\n    return new NamespaceProvisioner(namespaceFactory).provision(context);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesNamespaceTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static io.fabric8.kubernetes.api.model.DeletionPropagation.BACKGROUND;\nimport static java.util.Collections.emptyMap;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doAnswer;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.Namespace;\nimport io.fabric8.kubernetes.api.model.NamespaceBuilder;\nimport io.fabric8.kubernetes.api.model.ServiceAccount;\nimport io.fabric8.kubernetes.api.model.Status;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.kubernetes.client.Watch;\nimport io.fabric8.kubernetes.client.Watcher;\nimport io.fabric8.kubernetes.client.Watcher.Action;\nimport io.fabric8.kubernetes.client.WatcherException;\nimport io.fabric8.kubernetes.client.dsl.MixedOperation;\nimport io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport java.util.Map;\nimport java.util.concurrent.Executor;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.stubbing.Answer;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link KubernetesNamespace}\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesNamespaceTest {\n\n  public static final String NAMESPACE = \"testNamespace\";\n  public static final String WORKSPACE_ID = \"workspace123\";\n\n  @Mock private KubernetesDeployments deployments;\n  @Mock private KubernetesServices services;\n  @Mock private KubernetesIngresses ingresses;\n  @Mock private KubernetesPersistentVolumeClaims pvcs;\n  @Mock private KubernetesSecrets secrets;\n  @Mock private KubernetesConfigsMaps configMaps;\n  @Mock private CheServerKubernetesClientFactory cheClientFactory;\n  @Mock private Executor executor;\n  @Mock private KubernetesClient kubernetesClient;\n  @Mock private NonNamespaceOperation namespaceOperation;\n  @Mock private Resource<ServiceAccount> serviceAccountResource;\n\n  private KubernetesNamespace k8sNamespace;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    lenient().when(cheClientFactory.create(anyString())).thenReturn(kubernetesClient);\n\n    lenient().doReturn(namespaceOperation).when(kubernetesClient).namespaces();\n\n    final MixedOperation mixedOperation = mock(MixedOperation.class);\n    final NonNamespaceOperation namespaceOperation = mock(NonNamespaceOperation.class);\n    lenient().doReturn(mixedOperation).when(kubernetesClient).serviceAccounts();\n    lenient().when(mixedOperation.inNamespace(anyString())).thenReturn(namespaceOperation);\n    lenient().when(namespaceOperation.withName(anyString())).thenReturn(serviceAccountResource);\n    lenient().when(serviceAccountResource.get()).thenReturn(mock(ServiceAccount.class));\n\n    k8sNamespace =\n        new KubernetesNamespace(\n            cheClientFactory,\n            WORKSPACE_ID,\n            NAMESPACE,\n            deployments,\n            services,\n            pvcs,\n            ingresses,\n            secrets,\n            configMaps);\n  }\n\n  @Test\n  public void testKubernetesNamespacePreparingWhenNamespaceExists() throws Exception {\n    // given\n    prepareNamespace(NAMESPACE);\n    KubernetesNamespace namespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n\n    // when\n    namespace.prepare(true, Map.of(), Map.of());\n\n    // then\n    verify(namespaceOperation, never()).create(any(Namespace.class));\n  }\n\n  @Test\n  public void testKubernetesNamespacePreparingCreationWhenNamespaceDoesNotExist() throws Exception {\n    // given\n    doThrow(new KubernetesClientException(\"error\", 403, null))\n        .doReturn(namespaceOperation)\n        .doReturn(namespaceOperation)\n        .when(kubernetesClient)\n        .namespaces();\n    Resource namespaceResource = mock(Resource.class);\n    doReturn(namespaceResource).when(namespaceOperation).withName(anyString());\n\n    KubernetesNamespace namespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n\n    // when\n    namespace.prepare(true, Map.of(), Map.of());\n\n    // then\n    ArgumentCaptor<Namespace> captor = ArgumentCaptor.forClass(Namespace.class);\n    verify(namespaceOperation).create(captor.capture());\n    Assert.assertEquals(captor.getValue().getMetadata().getName(), NAMESPACE);\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void throwsExceptionIfNamespaceDoesntExistAndNotAllowedToCreateIt() throws Exception {\n    // given\n    Resource resource = prepareNamespaceResource(NAMESPACE);\n    doThrow(new KubernetesClientException(\"error\", 403, null)).when(resource).get();\n    KubernetesNamespace namespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n\n    // when\n    namespace.prepare(false, Map.of(), Map.of());\n\n    // then\n    // exception is thrown\n  }\n\n  @Test\n  public void testKubernetesNamespaceCleaningUp() throws Exception {\n    // when\n    k8sNamespace.cleanUp();\n\n    verify(ingresses).delete();\n    verify(services).delete();\n    verify(deployments).delete();\n    verify(secrets).delete();\n    verify(configMaps).delete();\n  }\n\n  @Test\n  public void testKubernetesNamespaceCleaningUpIfExceptionsOccurs() throws Exception {\n    doThrow(new InfrastructureException(\"err1.\")).when(services).delete();\n    doThrow(new InfrastructureException(\"err2.\")).when(deployments).delete();\n\n    InfrastructureException error = null;\n    // when\n    try {\n      k8sNamespace.cleanUp();\n\n    } catch (InfrastructureException e) {\n      error = e;\n    }\n\n    // then\n    assertNotNull(error);\n    String message = error.getMessage();\n    assertEquals(message, \"Error(s) occurs while cleaning up the namespace. err1. err2.\");\n    verify(ingresses).delete();\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void testThrowsInfrastructureExceptionWhenFailedToGetNamespaceServiceAccounts()\n      throws Exception {\n    final Resource resource = prepareNamespaceResource(NAMESPACE);\n    doThrow(new KubernetesClientException(\"error\", 403, null)).when(resource).get();\n    doThrow(KubernetesClientException.class).when(kubernetesClient).serviceAccounts();\n\n    new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID)\n        .prepare(false, Map.of(), Map.of());\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void testThrowsInfrastructureExceptionWhenServiceAccountEventNotPublished()\n      throws Exception {\n    final Resource resource = prepareNamespaceResource(NAMESPACE);\n    doThrow(new KubernetesClientException(\"error\", 403, null)).when(resource).get();\n    when(serviceAccountResource.get()).thenReturn(null);\n\n    new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID)\n        .prepare(false, Map.of(), Map.of());\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void testThrowsInfrastructureExceptionWhenWatcherClosed() throws Exception {\n    final Resource resource = prepareNamespaceResource(NAMESPACE);\n    doThrow(new KubernetesClientException(\"error\", 403, null)).when(resource).get();\n    when(serviceAccountResource.get()).thenReturn(null);\n    doAnswer(\n            (Answer<Watch>)\n                invocation -> {\n                  final Watcher<ServiceAccount> watcher = invocation.getArgument(0);\n                  watcher.onClose(mock(WatcherException.class));\n                  return mock(Watch.class);\n                })\n        .when(serviceAccountResource)\n        .watch(any());\n\n    new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID)\n        .prepare(false, Map.of(), Map.of());\n  }\n\n  @Test\n  public void testStopsWaitingServiceAccountEventJustAfterEventReceived() throws Exception {\n    // given\n    doThrow(new KubernetesClientException(\"error\", 403, null))\n        .doReturn(namespaceOperation)\n        .doReturn(namespaceOperation)\n        .when(kubernetesClient)\n        .namespaces();\n    Resource namespaceResource = mock(Resource.class);\n    doReturn(namespaceResource).when(namespaceOperation).withName(anyString());\n\n    when(serviceAccountResource.get()).thenReturn(null);\n    doAnswer(\n            invocation -> {\n              final Watcher<ServiceAccount> watcher = invocation.getArgument(0);\n              watcher.eventReceived(Action.ADDED, mock(ServiceAccount.class));\n              return mock(Watch.class);\n            })\n        .when(serviceAccountResource)\n        .watch(any());\n\n    KubernetesNamespace namespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n\n    // when\n    namespace.prepare(true, Map.of(), Map.of());\n\n    verify(serviceAccountResource).get();\n    verify(serviceAccountResource).watch(any());\n  }\n\n  @Test\n  public void testDeletesExistingNamespace() throws Exception {\n    // given\n    KubernetesNamespace namespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n    Resource resource = prepareNamespaceResource(NAMESPACE);\n\n    // when\n    namespace.delete();\n\n    // then\n    verify(resource).delete();\n  }\n\n  @Test\n  public void testDoesntFailIfDeletedNamespaceDoesntExist() throws Exception {\n    // given\n    KubernetesNamespace namespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n    Resource resource = prepareNamespaceResource(NAMESPACE);\n    when(resource.delete()).thenThrow(new KubernetesClientException(\"err\", 404, null));\n\n    // when\n    namespace.delete();\n\n    // then\n    verify(resource).delete();\n    // and no exception is thrown\n  }\n\n  @Test\n  public void testDoesntFailIfDeletedNamespaceIsBeingDeleted() throws Exception {\n    // given\n    KubernetesNamespace namespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n    Resource resource = prepareNamespaceResource(NAMESPACE);\n    when(resource.delete()).thenThrow(new KubernetesClientException(\"err\", 409, null));\n\n    // when\n    namespace.delete();\n\n    // then\n    verify(resource).delete();\n    // and no exception is thrown\n  }\n\n  @Test\n  public void testLabelNamespace() throws InfrastructureException {\n    // given\n    prepareNamespace(NAMESPACE);\n    KubernetesNamespace kubernetesNamespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n\n    KubernetesClient cheKubeClient = mock(KubernetesClient.class);\n    doReturn(cheKubeClient).when(cheClientFactory).create();\n\n    NonNamespaceOperation nonNamespaceOperation = mock(NonNamespaceOperation.class);\n    doReturn(nonNamespaceOperation).when(cheKubeClient).namespaces();\n\n    ArgumentCaptor<Namespace> namespaceArgumentCaptor = ArgumentCaptor.forClass(Namespace.class);\n    doAnswer(a -> a.getArgument(0))\n        .when(nonNamespaceOperation)\n        .createOrReplace(namespaceArgumentCaptor.capture());\n\n    Map<String, String> labels = Map.of(\"label.with.this\", \"yes\", \"and.this\", \"of courese\");\n\n    // when\n    kubernetesNamespace.prepare(true, labels, emptyMap());\n\n    // then\n    Namespace updatedNamespace = namespaceArgumentCaptor.getValue();\n    assertTrue(\n        updatedNamespace.getMetadata().getLabels().entrySet().containsAll(labels.entrySet()));\n    assertEquals(updatedNamespace.getMetadata().getName(), NAMESPACE);\n  }\n\n  @Test\n  public void testDontTryToLabelNamespaceIfAlreadyLabeled() throws InfrastructureException {\n    // given\n    Map<String, String> labels = Map.of(\"label.with.this\", \"yes\", \"and.this\", \"of courese\");\n\n    Namespace namespace = prepareNamespace(NAMESPACE);\n    namespace.getMetadata().setLabels(labels);\n    KubernetesNamespace kubernetesNamespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n\n    KubernetesClient cheKubeClient = mock(KubernetesClient.class);\n    lenient().doReturn(cheKubeClient).when(cheClientFactory).create();\n\n    NonNamespaceOperation nonNamespaceOperation = mock(NonNamespaceOperation.class);\n    lenient().doReturn(nonNamespaceOperation).when(cheKubeClient).namespaces();\n\n    lenient()\n        .doAnswer(a -> a.getArgument(0))\n        .when(nonNamespaceOperation)\n        .createOrReplace(any(Namespace.class));\n\n    // when\n    kubernetesNamespace.prepare(true, labels, emptyMap());\n\n    // then\n    assertTrue(namespace.getMetadata().getLabels().entrySet().containsAll(labels.entrySet()));\n    verify(nonNamespaceOperation, never()).createOrReplace(any());\n  }\n\n  @Test\n  public void testDontTryToLabelNamespaceIfNoNamespacesProvided() throws InfrastructureException {\n    // given\n    Map<String, String> existingLabels = Map.of(\"some\", \"labels\");\n    Namespace namespace = prepareNamespace(NAMESPACE);\n    namespace.getMetadata().setLabels(existingLabels);\n    KubernetesNamespace kubernetesNamespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n\n    KubernetesClient cheKubeClient = mock(KubernetesClient.class);\n    lenient().doReturn(cheKubeClient).when(cheClientFactory).create();\n\n    NonNamespaceOperation nonNamespaceOperation = mock(NonNamespaceOperation.class);\n    lenient().doReturn(nonNamespaceOperation).when(cheKubeClient).namespaces();\n\n    lenient()\n        .doAnswer(a -> a.getArgument(0))\n        .when(nonNamespaceOperation)\n        .createOrReplace(any(Namespace.class));\n\n    // when\n    kubernetesNamespace.prepare(true, emptyMap(), emptyMap());\n\n    // then\n    assertTrue(\n        namespace.getMetadata().getLabels().entrySet().containsAll(existingLabels.entrySet()));\n    verify(nonNamespaceOperation, never()).createOrReplace(any());\n  }\n\n  public void testAnnotateNamespace() throws InfrastructureException {\n    // given\n    prepareNamespace(NAMESPACE);\n    KubernetesNamespace kubernetesNamespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n\n    KubernetesClient cheKubeClient = mock(KubernetesClient.class);\n    doReturn(cheKubeClient).when(cheClientFactory).create();\n\n    NonNamespaceOperation nonNamespaceOperation = mock(NonNamespaceOperation.class);\n    doReturn(nonNamespaceOperation).when(cheKubeClient).namespaces();\n\n    ArgumentCaptor<Namespace> namespaceArgumentCaptor = ArgumentCaptor.forClass(Namespace.class);\n    doAnswer(a -> a.getArgument(0))\n        .when(nonNamespaceOperation)\n        .createOrReplace(namespaceArgumentCaptor.capture());\n\n    Map<String, String> annotations = Map.of(\"annotate.with.this\", \"yes\", \"and.this\", \"of courese\");\n\n    // when\n    kubernetesNamespace.prepare(true, emptyMap(), annotations);\n\n    // then\n    Namespace updatedNamespace = namespaceArgumentCaptor.getValue();\n    assertTrue(\n        updatedNamespace\n            .getMetadata()\n            .getAnnotations()\n            .entrySet()\n            .containsAll(annotations.entrySet()));\n    assertEquals(updatedNamespace.getMetadata().getName(), NAMESPACE);\n  }\n\n  @Test\n  public void testDontTryToAnnotateNamespaceIfAlreadyAnnoted() throws InfrastructureException {\n    // given\n    Map<String, String> annotations =\n        Map.of(\"annotation.with.this\", \"yes\", \"and.this\", \"of courese\");\n\n    Namespace namespace = prepareNamespace(NAMESPACE);\n    namespace.getMetadata().setAnnotations(annotations);\n    KubernetesNamespace kubernetesNamespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n\n    // when\n    kubernetesNamespace.prepare(true, emptyMap(), annotations);\n\n    // then\n    assertTrue(\n        namespace.getMetadata().getAnnotations().entrySet().containsAll(annotations.entrySet()));\n  }\n\n  @Test\n  public void testDontTryToAnnotateNamespaceIfNoNamespacesProvided()\n      throws InfrastructureException {\n    // given\n    Map<String, String> existingAnnotations = Map.of(\"some\", \"annotations\");\n    Namespace namespace = prepareNamespace(NAMESPACE);\n    namespace.getMetadata().setAnnotations(existingAnnotations);\n    KubernetesNamespace kubernetesNamespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n\n    // when\n    kubernetesNamespace.prepare(true, emptyMap(), emptyMap());\n\n    // then\n    assertTrue(\n        namespace\n            .getMetadata()\n            .getAnnotations()\n            .entrySet()\n            .containsAll(existingAnnotations.entrySet()));\n  }\n\n  @Test\n  public void testDoNotFailWhenNoPermissionsToUpdateNamespace() throws InfrastructureException {\n    // given\n    Map<String, String> labels = Map.of(\"label.with.this\", \"yes\", \"and.this\", \"of courese\");\n\n    prepareNamespace(NAMESPACE);\n    KubernetesNamespace kubernetesNamespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n\n    KubernetesClient cheKubeClient = mock(KubernetesClient.class);\n    lenient().doReturn(cheKubeClient).when(cheClientFactory).create();\n\n    NonNamespaceOperation nonNamespaceOperation = mock(NonNamespaceOperation.class);\n    lenient().doReturn(nonNamespaceOperation).when(cheKubeClient).namespaces();\n\n    ArgumentCaptor<Namespace> namespaceArgumentCaptor = ArgumentCaptor.forClass(Namespace.class);\n    lenient()\n        .doThrow(new KubernetesClientException(\"No permissions.\", 403, new Status()))\n        .when(nonNamespaceOperation)\n        .createOrReplace(namespaceArgumentCaptor.capture());\n\n    // when\n    kubernetesNamespace.prepare(true, labels, emptyMap());\n\n    // then\n    Namespace updatedNamespace = namespaceArgumentCaptor.getValue();\n    assertTrue(\n        updatedNamespace.getMetadata().getLabels().entrySet().containsAll(labels.entrySet()));\n    assertEquals(updatedNamespace.getMetadata().getName(), NAMESPACE);\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void testFailWhenFailToUpdateNamespace() throws InfrastructureException {\n    // given\n    Map<String, String> labels = Map.of(\"label.with.this\", \"yes\", \"and.this\", \"of courese\");\n\n    Namespace namespace = prepareNamespace(NAMESPACE);\n    KubernetesNamespace kubernetesNamespace =\n        new KubernetesNamespace(cheClientFactory, executor, NAMESPACE, WORKSPACE_ID);\n\n    KubernetesClient cheKubeClient = mock(KubernetesClient.class);\n    lenient().doReturn(cheKubeClient).when(cheClientFactory).create();\n\n    NonNamespaceOperation nonNamespaceOperation = mock(NonNamespaceOperation.class);\n    lenient().doReturn(nonNamespaceOperation).when(cheKubeClient).namespaces();\n\n    lenient()\n        .doThrow(new KubernetesClientException(\"Some other error\", 500, new Status()))\n        .when(nonNamespaceOperation)\n        .createOrReplace(any(Namespace.class));\n\n    // when\n    kubernetesNamespace.prepare(true, labels, emptyMap());\n\n    // then\n    verify(nonNamespaceOperation).createOrReplace(namespace);\n  }\n\n  private Resource prepareNamespaceResource(String namespaceName) {\n    Resource namespaceResource = mock(Resource.class);\n    doReturn(namespaceResource).when(namespaceOperation).withName(namespaceName);\n    lenient()\n        .doReturn(namespaceResource)\n        .when(namespaceResource)\n        .withPropagationPolicy(eq(BACKGROUND));\n    when(namespaceResource.get())\n        .thenReturn(\n            new NamespaceBuilder().withNewMetadata().withName(namespaceName).endMetadata().build());\n    kubernetesClient.namespaces().withName(namespaceName).get();\n    return namespaceResource;\n  }\n\n  private Namespace prepareNamespace(String namespaceName) {\n    Namespace namespace =\n        new NamespaceBuilder().withNewMetadata().withName(namespaceName).endMetadata().build();\n    Resource namespaceResource = prepareNamespaceResource(namespaceName);\n    doReturn(namespace).when(namespaceResource).get();\n    return namespace;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesObjectUtilTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static org.testng.Assert.assertEquals;\n\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class KubernetesObjectUtilTest {\n  @Test(dataProvider = \"testNames\")\n  public void shouldTestisValidConfigMapKeyName(String nameToTest, boolean isValid) {\n    assertEquals(KubernetesObjectUtil.isValidConfigMapKeyName(nameToTest), isValid);\n  }\n\n  @DataProvider\n  public static Object[][] testNames() {\n    return new Object[][] {\n      new Object[] {\"foo.bar\", true},\n      new Object[] {\"https://foo.bar\", false},\n      new Object[] {\"_fef_123-ah_*zz**\", false},\n      new Object[] {\"_fef_123-ah_z.z\", true},\n      new Object[] {\"a-b#-hello\", false},\n      new Object[] {\"a---------b\", true},\n      new Object[] {\"--ab--\", true}\n    };\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesSecretsTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static io.fabric8.kubernetes.api.model.DeletionPropagation.BACKGROUND;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_WORKSPACE_ID_LABEL;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretList;\nimport io.fabric8.kubernetes.client.GracePeriodConfigurable;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable;\nimport io.fabric8.kubernetes.client.dsl.MixedOperation;\nimport io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link KubernetesSecrets}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesSecretsTest {\n\n  private static final String NAMESPACE = \"namespace\";\n  private static final String WORKSPACE_ID = \"workspace123\";\n\n  @Mock private KubernetesClient client;\n  @Mock private KubernetesClientFactory clientFactory;\n\n  @Mock private MixedOperation<Secret, SecretList, Resource<Secret>> secretsMixedOperation;\n\n  @Mock private NonNamespaceOperation<Secret, SecretList, Resource<Secret>> nonNamespaceOperation;\n\n  @Mock private FilterWatchListDeletable<Secret, SecretList, Resource<Secret>> deletableList;\n  @Mock private GracePeriodConfigurable<Secret> deletableSecret;\n\n  private KubernetesSecrets kubernetesSecrets;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    kubernetesSecrets = new KubernetesSecrets(\"namespace\", \"workspace123\", clientFactory);\n\n    when(clientFactory.create(\"workspace123\")).thenReturn(client);\n\n    when(client.secrets()).thenReturn(secretsMixedOperation);\n    lenient().when(secretsMixedOperation.inNamespace(any())).thenReturn(nonNamespaceOperation);\n    lenient().when(nonNamespaceOperation.withLabel(any(), any())).thenReturn(deletableList);\n    lenient().doReturn(deletableSecret).when(deletableList).withPropagationPolicy(eq(BACKGROUND));\n  }\n\n  @Test\n  public void testSecretCreation() throws Exception {\n    Secret secret = new Secret();\n\n    kubernetesSecrets.create(secret);\n\n    assertEquals(secret.getMetadata().getLabels().get(CHE_WORKSPACE_ID_LABEL), WORKSPACE_ID);\n    verify(secretsMixedOperation).inNamespace(NAMESPACE);\n    verify(nonNamespaceOperation).create(secret);\n  }\n\n  @Test\n  public void testSecretsRemoving() throws Exception {\n    kubernetesSecrets.delete();\n\n    verify(secretsMixedOperation).inNamespace(NAMESPACE);\n    verify(nonNamespaceOperation).withLabel(CHE_WORKSPACE_ID_LABEL, WORKSPACE_ID);\n    verify(deletableList).withPropagationPolicy(eq(BACKGROUND));\n    verify(deletableSecret).delete();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/KubernetesWorkspaceServiceAccountTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.CONFIGMAPS_ROLE_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.CREDENTIALS_SECRET_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.METRICS_ROLE_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.PREFERENCES_CONFIGMAP_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.SECRETS_ROLE_NAME;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.ServiceAccountBuilder;\nimport io.fabric8.kubernetes.api.model.rbac.PolicyRule;\nimport io.fabric8.kubernetes.api.model.rbac.Role;\nimport io.fabric8.kubernetes.api.model.rbac.RoleBindingBuilder;\nimport io.fabric8.kubernetes.api.model.rbac.RoleBindingList;\nimport io.fabric8.kubernetes.api.model.rbac.RoleBuilder;\nimport io.fabric8.kubernetes.api.model.rbac.RoleList;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMixedDispatcher;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;\nimport io.fabric8.mockwebserver.Context;\nimport io.fabric8.mockwebserver.MockWebServer;\nimport io.fabric8.mockwebserver.ServerRequest;\nimport io.fabric8.mockwebserver.ServerResponse;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Queue;\nimport java.util.Set;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesWorkspaceServiceAccountTest {\n\n  public static final String NAMESPACE = \"testNamespace\";\n  public static final String WORKSPACE_ID = \"workspace123\";\n  public static final String SA_NAME = \"workspace-sa\";\n  public static final Set<String> ROLE_NAMES = Collections.singleton(\"role-foo\");\n\n  @Mock private KubernetesClientFactory clientFactory;\n  private KubernetesClient k8sClient;\n  private KubernetesMockServer kubernetesMockServer;\n  private KubernetesWorkspaceServiceAccount serviceAccount;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    this.serviceAccount =\n        new KubernetesWorkspaceServiceAccount(\n            WORKSPACE_ID, NAMESPACE, SA_NAME, ROLE_NAMES, clientFactory);\n\n    final Map<ServerRequest, Queue<ServerResponse>> responses = new HashMap<>();\n    kubernetesMockServer =\n        new KubernetesMockServer(\n            new Context(),\n            new MockWebServer(),\n            responses,\n            new KubernetesMixedDispatcher(responses),\n            true);\n    kubernetesMockServer.init();\n\n    k8sClient = kubernetesMockServer.createClient();\n    when(clientFactory.create(anyString())).thenReturn(k8sClient);\n  }\n\n  @AfterMethod\n  public void tearDown() {\n    kubernetesMockServer.destroy();\n  }\n\n  @Test\n  public void shouldProvisionSARolesEvenIfItAlreadyExists() throws Exception {\n    ServiceAccountBuilder serviceAccountBuilder =\n        new ServiceAccountBuilder().withNewMetadata().withName(SA_NAME).endMetadata();\n    RoleBuilder roleBuilder = new RoleBuilder().withNewMetadata().withName(\"foo\").endMetadata();\n    RoleBindingBuilder roleBindingBuilder =\n        new RoleBindingBuilder().withNewMetadata().withName(\"foo-builder\").endMetadata();\n\n    // pre-create SA and some roles\n    k8sClient\n        .serviceAccounts()\n        .inNamespace(NAMESPACE)\n        .createOrReplace(serviceAccountBuilder.build());\n    k8sClient.rbac().roles().inNamespace(NAMESPACE).create(roleBuilder.build());\n    k8sClient.rbac().roleBindings().inNamespace(NAMESPACE).create(roleBindingBuilder.build());\n\n    // when\n    serviceAccount.prepare();\n\n    // then\n    // make sure more roles added\n    RoleList rl = k8sClient.rbac().roles().inNamespace(NAMESPACE).list();\n    assertTrue(rl.getItems().size() > 1);\n\n    RoleBindingList rbl = k8sClient.rbac().roleBindings().inNamespace(NAMESPACE).list();\n    assertTrue(rbl.getItems().size() > 1);\n  }\n\n  @Test\n  public void shouldCreateMetricsRoleIfAPIEnabledOnServer() throws Exception {\n    KubernetesClient localK8sClient = spy(k8sClient);\n    when(localK8sClient.supportsApiPath(eq(\"/apis/metrics.k8s.io\"))).thenReturn(true);\n    when(clientFactory.create(anyString())).thenReturn(localK8sClient);\n\n    // when\n    serviceAccount.prepare();\n\n    // then\n    // make sure metrics role & rb added\n    RoleList rl = k8sClient.rbac().roles().inNamespace(NAMESPACE).list();\n    assertTrue(\n        rl.getItems().stream().anyMatch(r -> r.getMetadata().getName().equals(METRICS_ROLE_NAME)));\n\n    RoleBindingList rbl = k8sClient.rbac().roleBindings().inNamespace(NAMESPACE).list();\n    assertTrue(\n        rbl.getItems().stream()\n            .anyMatch(rb -> rb.getMetadata().getName().equals(SA_NAME + \"-metrics\")));\n  }\n\n  @Test\n  public void shouldNotCreateMetricsRoleIfAPINotEnabledOnServer() throws Exception {\n    KubernetesClient localK8sClient = spy(k8sClient);\n    when(localK8sClient.supportsApiPath(eq(\"/apis/metrics.k8s.io\"))).thenReturn(false);\n    when(clientFactory.create(anyString())).thenReturn(localK8sClient);\n\n    // when\n    serviceAccount.prepare();\n\n    // then\n    // make sure metrics role & rb not added\n    RoleList rl = k8sClient.rbac().roles().inNamespace(NAMESPACE).list();\n    assertTrue(\n        rl.getItems().stream().noneMatch(r -> r.getMetadata().getName().equals(METRICS_ROLE_NAME)));\n\n    RoleBindingList rbl = k8sClient.rbac().roleBindings().inNamespace(NAMESPACE).list();\n    assertTrue(\n        rbl.getItems().stream()\n            .noneMatch(rb -> rb.getMetadata().getName().equals(SA_NAME + \"-metrics\")));\n  }\n\n  @Test\n  public void shouldCreateCredentialsSecretRole() throws Exception {\n    KubernetesClient localK8sClient = spy(k8sClient);\n    when(clientFactory.create(anyString())).thenReturn(localK8sClient);\n\n    // when\n    serviceAccount.prepare();\n\n    // then\n    RoleList rl = k8sClient.rbac().roles().inNamespace(NAMESPACE).list();\n    Optional<Role> roleOptional =\n        rl.getItems().stream()\n            .filter(r -> r.getMetadata().getName().equals(SECRETS_ROLE_NAME))\n            .findFirst();\n    assertTrue(roleOptional.isPresent());\n    PolicyRule rule = roleOptional.get().getRules().get(0);\n    assertEquals(rule.getResources(), singletonList(\"secrets\"));\n    assertEquals(rule.getResourceNames(), singletonList(CREDENTIALS_SECRET_NAME));\n    assertEquals(rule.getApiGroups(), singletonList(\"\"));\n    assertEquals(rule.getVerbs(), Arrays.asList(\"get\", \"patch\"));\n\n    RoleBindingList rbl = k8sClient.rbac().roleBindings().inNamespace(NAMESPACE).list();\n    assertTrue(\n        rbl.getItems().stream()\n            .anyMatch(rb -> rb.getMetadata().getName().equals(SA_NAME + \"-secrets\")));\n  }\n\n  @Test\n  public void shouldCreatePreferencesConfigmapRole() throws Exception {\n    KubernetesClient localK8sClient = spy(k8sClient);\n    when(clientFactory.create(anyString())).thenReturn(localK8sClient);\n\n    // when\n    serviceAccount.prepare();\n\n    // then\n    RoleList rl = k8sClient.rbac().roles().inNamespace(NAMESPACE).list();\n    Optional<Role> roleOptional =\n        rl.getItems().stream()\n            .filter(r -> r.getMetadata().getName().equals(CONFIGMAPS_ROLE_NAME))\n            .findFirst();\n    assertTrue(roleOptional.isPresent());\n    PolicyRule rule = roleOptional.get().getRules().get(0);\n    assertEquals(rule.getResources(), singletonList(\"configmaps\"));\n    assertEquals(rule.getResourceNames(), singletonList(PREFERENCES_CONFIGMAP_NAME));\n    assertEquals(rule.getApiGroups(), singletonList(\"\"));\n    assertEquals(rule.getVerbs(), Arrays.asList(\"get\", \"patch\"));\n\n    RoleBindingList rbl = k8sClient.rbac().roleBindings().inNamespace(NAMESPACE).list();\n    assertTrue(\n        rbl.getItems().stream()\n            .anyMatch(rb -> rb.getMetadata().getName().equals(SA_NAME + \"-configmaps\")));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/NamespaceNameValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.NamespaceNameValidator.ValidationResult.INVALID;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.NamespaceNameValidator.ValidationResult.NULL_OR_EMPTY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.NamespaceNameValidator.ValidationResult.TOO_LONG;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.NamespaceNameValidator.validateInternal;\nimport static org.testng.Assert.assertEquals;\n\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class NamespaceNameValidatorTest {\n\n  @Test\n  public void testFailsOnNull() {\n    assertEquals(validateInternal(null), NULL_OR_EMPTY);\n  }\n\n  @Test\n  public void testFailsOnEmpty() {\n    assertEquals(validateInternal(\"\"), NULL_OR_EMPTY);\n  }\n\n  @Test\n  public void testFailsOnTooLong() {\n    assertEquals(\n        validateInternal(\"0123456789012345678901234567890123456789012345678901234567890123\"),\n        TOO_LONG);\n  }\n\n  @Test(dataProvider = \"invalidDnsNames\")\n  public void testFailsOnInvalidChars(String invalidName) {\n    assertEquals(validateInternal(invalidName), INVALID);\n  }\n\n  @DataProvider\n  public static Object[][] invalidDnsNames() {\n    return new Object[][] {\n      new Object[] {\" \"},\n      new Object[] {\"-a\"},\n      new Object[] {\"a-\"},\n      new Object[] {\"A\"},\n      new Object[] {\"<\"},\n      new Object[] {\"@\"},\n      new Object[] {\"*\"},\n      new Object[] {\";\"},\n    };\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/RemoveNamespaceOnWorkspaceRemoveTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\n\nimport org.eclipse.che.api.core.model.workspace.Workspace;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.event.WorkspaceRemovedEvent;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Test for {@link RemoveNamespaceOnWorkspaceRemove}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class RemoveNamespaceOnWorkspaceRemoveTest {\n\n  private static final String WORKSPACE_ID = \"workspace123\";\n\n  @Mock private Workspace workspace;\n  @Mock private KubernetesNamespaceFactory namespaceFactory;\n\n  private RemoveNamespaceOnWorkspaceRemove removeNamespaceOnWorkspaceRemove;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    removeNamespaceOnWorkspaceRemove = spy(new RemoveNamespaceOnWorkspaceRemove(namespaceFactory));\n\n    lenient().doNothing().when(namespaceFactory).deleteIfManaged(any());\n    lenient().when(workspace.getId()).thenReturn(WORKSPACE_ID);\n  }\n\n  @Test\n  public void shouldSubscribeListenerToEventService() {\n    EventService eventService = mock(EventService.class);\n\n    removeNamespaceOnWorkspaceRemove.subscribe(eventService);\n\n    verify(eventService).subscribe(removeNamespaceOnWorkspaceRemove);\n  }\n\n  @Test\n  public void shouldRemoveNamespaceIfManagedOnWorkspaceRemovedEventIfNamespaceIsManaged()\n      throws Exception {\n    removeNamespaceOnWorkspaceRemove.onEvent(new WorkspaceRemovedEvent(workspace));\n\n    verify(namespaceFactory).deleteIfManaged(eq(workspace));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/CredentialsSecretConfiguratorTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMixedDispatcher;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;\nimport io.fabric8.mockwebserver.Context;\nimport io.fabric8.mockwebserver.MockWebServer;\nimport io.fabric8.mockwebserver.ServerRequest;\nimport io.fabric8.mockwebserver.ServerResponse;\nimport java.util.Base64;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Queue;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class CredentialsSecretConfiguratorTest {\n\n  private NamespaceConfigurator configurator;\n\n  @Mock private CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n  private KubernetesMockServer kubernetesMockServer;\n  private KubernetesClient kubernetesClient;\n\n  private NamespaceResolutionContext namespaceResolutionContext;\n  private final String TEST_NAMESPACE_NAME = \"namespace123\";\n  private final String TEST_WORKSPACE_ID = \"workspace123\";\n  private final String TEST_USER_ID = \"user123\";\n  private final String TEST_USERNAME = \"jondoe\";\n  private final String PAT_SECRET_NAME = \"personal-access-token-1\";\n  private static final String MERGED_GIT_CREDENTIALS_SECRET_NAME =\n      \"devworkspace-merged-git-credentials\";\n\n  private static final Map<String, String> SEARCH_LABELS =\n      ImmutableMap.of(\n          \"app.kubernetes.io/part-of\", \"che.eclipse.org\",\n          \"app.kubernetes.io/component\", \"scm-personal-access-token\");\n\n  @BeforeMethod\n  public void setUp() throws InfrastructureException {\n    configurator =\n        new CredentialsSecretConfigurator(\n            cheServerKubernetesClientFactory, personalAccessTokenManager);\n    final Map<ServerRequest, Queue<ServerResponse>> responses = new HashMap<>();\n    kubernetesMockServer =\n        new KubernetesMockServer(\n            new Context(),\n            new MockWebServer(),\n            responses,\n            new KubernetesMixedDispatcher(responses),\n            true);\n    kubernetesMockServer.init();\n    kubernetesClient = kubernetesMockServer.createClient();\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubernetesClient);\n\n    namespaceResolutionContext =\n        new NamespaceResolutionContext(TEST_WORKSPACE_ID, TEST_USER_ID, TEST_USERNAME);\n  }\n\n  @AfterMethod\n  public void cleanUp() {\n    kubernetesMockServer.destroy();\n  }\n\n  @Test\n  public void shouldStorePersonalAccessToken() throws Exception {\n    // given\n    kubernetesClient\n        .secrets()\n        .inNamespace(TEST_NAMESPACE_NAME)\n        .create(\n            new SecretBuilder()\n                .withNewMetadata()\n                .withName(PAT_SECRET_NAME)\n                .withLabels(SEARCH_LABELS)\n                .withAnnotations(Map.of(\"che.eclipse.org/scm-url\", \"test-url\"))\n                .endMetadata()\n                .build());\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n\n    // then\n    verify(personalAccessTokenManager).storeGitCredentials(eq(\"test-url\"));\n  }\n\n  @Test\n  public void shouldRemovePersonalAccessToken() throws Exception {\n    // given\n    doThrow(new ScmCommunicationException(\"test error\", 495))\n        .when(personalAccessTokenManager)\n        .storeGitCredentials(eq(\"test-url\"));\n    kubernetesClient\n        .secrets()\n        .inNamespace(TEST_NAMESPACE_NAME)\n        .create(\n            new SecretBuilder()\n                .withNewMetadata()\n                .withName(PAT_SECRET_NAME)\n                .withLabels(SEARCH_LABELS)\n                .withAnnotations(Map.of(\"che.eclipse.org/scm-url\", \"test-url\"))\n                .endMetadata()\n                .build());\n    // when\n    try {\n      configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n    } catch (Exception e) {\n      assertTrue(e instanceof InfrastructureException);\n      assertEquals(e.getMessage(), \"test error\");\n    }\n\n    // then\n    verify(personalAccessTokenManager).remove(eq(\"test-url\"));\n  }\n\n  @Test\n  public void doNothingWhenSecretAlreadyStored() throws Exception {\n    // given\n    kubernetesClient\n        .secrets()\n        .inNamespace(TEST_NAMESPACE_NAME)\n        .create(\n            new SecretBuilder()\n                .withNewMetadata()\n                .withName(MERGED_GIT_CREDENTIALS_SECRET_NAME)\n                .endMetadata()\n                .withData(\n                    Map.of(\n                        \"credentials\", Base64.getEncoder().encodeToString(\"test-token\".getBytes())))\n                .build());\n\n    kubernetesClient\n        .secrets()\n        .inNamespace(TEST_NAMESPACE_NAME)\n        .create(\n            new SecretBuilder()\n                .withNewMetadata()\n                .withName(PAT_SECRET_NAME)\n                .withLabels(SEARCH_LABELS)\n                .withAnnotations(Map.of(\"che.eclipse.org/scm-url\", \"test-url\"))\n                .endMetadata()\n                .withData(\n                    Map.of(\"token\", Base64.getEncoder().encodeToString(\"test-token\".getBytes())))\n                .build());\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n\n    // then\n    verify(personalAccessTokenManager, never()).storeGitCredentials(anyString());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/GitconfigConfiguratorTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMixedDispatcher;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;\nimport io.fabric8.mockwebserver.Context;\nimport io.fabric8.mockwebserver.MockWebServer;\nimport io.fabric8.mockwebserver.ServerRequest;\nimport io.fabric8.mockwebserver.ServerResponse;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Queue;\nimport java.util.Set;\nimport org.eclipse.che.api.factory.server.scm.GitUserData;\nimport org.eclipse.che.api.factory.server.scm.GitUserDataFetcher;\nimport org.eclipse.che.api.factory.server.scm.exception.*;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.Assert;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GitconfigConfiguratorTest {\n\n  private NamespaceConfigurator configurator;\n\n  @Mock private CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  @Mock private GitUserDataFetcher gitUserDataFetcher;\n  private KubernetesMockServer kubernetesMockServer;\n  private KubernetesClient kubernetesClient;\n\n  private NamespaceResolutionContext namespaceResolutionContext;\n  private final String TEST_NAMESPACE_NAME = \"namespace123\";\n  private final String TEST_WORKSPACE_ID = \"workspace123\";\n  private final String TEST_USER_ID = \"user123\";\n  private final String TEST_USERNAME = \"username123\";\n  private static final String GITCONFIG_CONFIGMAP_NAME = \"workspace-userdata-gitconfig-configmap\";\n  private static final Map<String, String> GITCONFIG_CONFIGMAP_LABELS =\n      ImmutableMap.of(\n          \"controller.devfile.io/mount-to-devworkspace\",\n          \"true\",\n          \"controller.devfile.io/watch-configmap\",\n          \"true\");\n  private static final Map<String, String> GITCONFIG_CONFIGMAP_ANNOTATIONS =\n      ImmutableMap.of(\n          \"controller.devfile.io/mount-as\", \"subpath\", \"controller.devfile.io/mount-path\", \"/etc\");\n\n  @BeforeMethod\n  public void setUp()\n      throws InfrastructureException, ScmCommunicationException, ScmUnauthorizedException {\n    configurator =\n        new GitconfigConfigurator(cheServerKubernetesClientFactory, Collections.emptySet());\n\n    final Map<ServerRequest, Queue<ServerResponse>> responses = new HashMap<>();\n    kubernetesMockServer =\n        new KubernetesMockServer(\n            new Context(),\n            new MockWebServer(),\n            responses,\n            new KubernetesMixedDispatcher(responses),\n            true);\n    kubernetesMockServer.init();\n    kubernetesClient = spy(kubernetesMockServer.createClient());\n\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubernetesClient);\n\n    namespaceResolutionContext =\n        new NamespaceResolutionContext(TEST_WORKSPACE_ID, TEST_USER_ID, TEST_USERNAME);\n  }\n\n  @AfterMethod\n  public void cleanUp() {\n    kubernetesMockServer.destroy();\n  }\n\n  @Test\n  public void shouldCreateGitconfigConfigmapWithUserSection() throws Exception {\n    // given\n    when(gitUserDataFetcher.fetchGitUserData(anyString()))\n        .thenReturn(new GitUserData(\"username\", \"userEmail\"));\n    configurator =\n        new GitconfigConfigurator(cheServerKubernetesClientFactory, Set.of(gitUserDataFetcher));\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n    // then\n    Assert.assertEquals(kubernetesMockServer.getLastRequest().getMethod(), \"POST\");\n    List<ConfigMap> configMaps =\n        kubernetesClient.configMaps().inNamespace(TEST_NAMESPACE_NAME).list().getItems();\n    Assert.assertEquals(configMaps.size(), 1);\n    String expected = \"[user]\\n\\tname = username\\n\\temail = userEmail\";\n    Assert.assertEquals(configMaps.get(0).getData().get(\"gitconfig\"), expected);\n  }\n\n  @Test\n  public void shouldNotCreateGitconfigConfigmap() throws Exception {\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n    // then\n    Assert.assertEquals(kubernetesMockServer.getLastRequest().getMethod(), \"GET\");\n    List<ConfigMap> configMaps =\n        kubernetesClient.configMaps().inNamespace(TEST_NAMESPACE_NAME).list().getItems();\n    Assert.assertEquals(configMaps.size(), 0);\n  }\n\n  @Test\n  public void shouldUpdateGitconfigConfigmapWithUserSection()\n      throws InfrastructureException,\n          InterruptedException,\n          ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmUnauthorizedException,\n          ScmConfigurationPersistenceException,\n          ScmBadRequestException {\n    // given\n    ConfigMap gitconfigConfigmap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(GITCONFIG_CONFIGMAP_NAME)\n            .withLabels(GITCONFIG_CONFIGMAP_LABELS)\n            .withAnnotations(GITCONFIG_CONFIGMAP_ANNOTATIONS)\n            .endMetadata()\n            .build();\n    gitconfigConfigmap.setData(\n        Collections.singletonMap(\"gitconfig\", \"[user]\\n\\tname = \\\"\\\"\\n\\temail= \\\"\\\"\"));\n    kubernetesClient.configMaps().inNamespace(TEST_NAMESPACE_NAME).create(gitconfigConfigmap);\n    configurator =\n        new GitconfigConfigurator(cheServerKubernetesClientFactory, Set.of(gitUserDataFetcher));\n    when(gitUserDataFetcher.fetchGitUserData(anyString()))\n        .thenReturn(new GitUserData(\"username\", \"userEmail\"));\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n    // then\n    Assert.assertEquals(kubernetesMockServer.getLastRequest().getMethod(), \"PUT\");\n    List<ConfigMap> configMaps =\n        kubernetesClient.configMaps().inNamespace(TEST_NAMESPACE_NAME).list().getItems();\n    Assert.assertEquals(configMaps.size(), 1);\n    String expected = \"[user]\\n\\tname = username\\n\\temail = userEmail\";\n    Assert.assertEquals(configMaps.get(0).getData().get(\"gitconfig\"), expected);\n  }\n\n  @Test\n  public void shouldUpdateGitconfigConfigmapWithStoredSectionsWithUserSection()\n      throws InfrastructureException,\n          InterruptedException,\n          ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmUnauthorizedException,\n          ScmConfigurationPersistenceException,\n          ScmBadRequestException {\n    // given\n    ConfigMap gitconfigConfigmap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(GITCONFIG_CONFIGMAP_NAME)\n            .withLabels(GITCONFIG_CONFIGMAP_LABELS)\n            .withAnnotations(GITCONFIG_CONFIGMAP_ANNOTATIONS)\n            .endMetadata()\n            .build();\n    gitconfigConfigmap.setData(\n        Collections.singletonMap(\n            \"gitconfig\",\n            \"[other]\\n\\tkey = value\\n[other1]\\n\\tkey = value\\n[user]\\n\\tname = \\\"\\\"\\n\\temail= \\\"\\\"\"));\n    kubernetesClient.configMaps().inNamespace(TEST_NAMESPACE_NAME).create(gitconfigConfigmap);\n    configurator =\n        new GitconfigConfigurator(cheServerKubernetesClientFactory, Set.of(gitUserDataFetcher));\n    when(gitUserDataFetcher.fetchGitUserData(anyString()))\n        .thenReturn(new GitUserData(\"username\", \"userEmail\"));\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n    // then\n    Assert.assertEquals(kubernetesMockServer.getLastRequest().getMethod(), \"PUT\");\n    List<ConfigMap> configMaps =\n        kubernetesClient.configMaps().inNamespace(TEST_NAMESPACE_NAME).list().getItems();\n    Assert.assertEquals(configMaps.size(), 1);\n    String expected =\n        \"[user]\\n\\tname = username\\n\\temail = userEmail\\n[other]\\n\\tkey = value\\n[other1]\\n\\tkey = value\";\n    Assert.assertEquals(configMaps.get(0).getData().get(\"gitconfig\"), expected);\n  }\n\n  @Test\n  public void shouldNotUpdateGitconfigConfigmapWithUserSection()\n      throws InfrastructureException,\n          InterruptedException,\n          ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmUnauthorizedException,\n          ScmConfigurationPersistenceException,\n          ScmBadRequestException {\n    // given\n    ConfigMap gitconfigConfigmap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(GITCONFIG_CONFIGMAP_NAME)\n            .withLabels(GITCONFIG_CONFIGMAP_LABELS)\n            .withAnnotations(GITCONFIG_CONFIGMAP_ANNOTATIONS)\n            .endMetadata()\n            .build();\n    gitconfigConfigmap.setData(\n        Collections.singletonMap(\n            \"gitconfig\", \"[user]\\n\\tname = gitconfig-username\\n\\temail = gitconfig-email\"));\n    kubernetesClient.configMaps().inNamespace(TEST_NAMESPACE_NAME).create(gitconfigConfigmap);\n    configurator =\n        new GitconfigConfigurator(cheServerKubernetesClientFactory, Set.of(gitUserDataFetcher));\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n    // then\n    Assert.assertEquals(kubernetesMockServer.getLastRequest().getMethod(), \"GET\");\n    List<ConfigMap> configMaps =\n        kubernetesClient.configMaps().inNamespace(TEST_NAMESPACE_NAME).list().getItems();\n    Assert.assertEquals(configMaps.size(), 1);\n    String expected = \"[user]\\n\\tname = gitconfig-username\\n\\temail = gitconfig-email\";\n    Assert.assertEquals(configMaps.get(0).getData().get(\"gitconfig\"), expected);\n    // Check that fetchGitUserData was not called.\n    verify(gitUserDataFetcher, never()).fetchGitUserData(anyString());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/PreferencesConfigMapConfiguratorTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.PREFERENCES_CONFIGMAP_NAME;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMixedDispatcher;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;\nimport io.fabric8.mockwebserver.Context;\nimport io.fabric8.mockwebserver.MockWebServer;\nimport io.fabric8.mockwebserver.ServerRequest;\nimport io.fabric8.mockwebserver.ServerResponse;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Queue;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.Assert;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class PreferencesConfigMapConfiguratorTest {\n  private NamespaceConfigurator configurator;\n\n  @Mock private CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  private KubernetesMockServer kubernetesMockServer;\n  private KubernetesClient kubernetesClient;\n\n  private NamespaceResolutionContext namespaceResolutionContext;\n  private final String TEST_NAMESPACE_NAME = \"namespace123\";\n  private final String TEST_WORKSPACE_ID = \"workspace123\";\n  private final String TEST_USER_ID = \"user123\";\n  private final String TEST_USERNAME = \"jondoe\";\n\n  @BeforeMethod\n  public void setUp() throws InfrastructureException {\n    configurator = new PreferencesConfigMapConfigurator(cheServerKubernetesClientFactory);\n\n    final Map<ServerRequest, Queue<ServerResponse>> responses = new HashMap<>();\n    kubernetesMockServer =\n        new KubernetesMockServer(\n            new Context(),\n            new MockWebServer(),\n            responses,\n            new KubernetesMixedDispatcher(responses),\n            true);\n    kubernetesMockServer.init();\n    kubernetesClient = spy(kubernetesMockServer.createClient());\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubernetesClient);\n\n    namespaceResolutionContext =\n        new NamespaceResolutionContext(TEST_WORKSPACE_ID, TEST_USER_ID, TEST_USERNAME);\n  }\n\n  @AfterMethod\n  public void tearDown() {\n    kubernetesMockServer.destroy();\n  }\n\n  @Test\n  public void createConfigmapWhenDoesntExist()\n      throws InfrastructureException, InterruptedException {\n    // given - clean env\n\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n\n    // then configmap created\n    Assert.assertEquals(kubernetesMockServer.getLastRequest().getMethod(), \"POST\");\n    Assert.assertNotNull(\n        kubernetesClient\n            .configMaps()\n            .inNamespace(TEST_NAMESPACE_NAME)\n            .withName(PREFERENCES_CONFIGMAP_NAME)\n            .get());\n    verify(cheServerKubernetesClientFactory, times(1)).create();\n  }\n\n  @Test\n  public void doNothingWhenConfigmapExists() throws InfrastructureException, InterruptedException {\n    // given - configmap already exists\n    kubernetesClient\n        .configMaps()\n        .inNamespace(TEST_NAMESPACE_NAME)\n        .create(\n            new ConfigMapBuilder()\n                .withNewMetadata()\n                .withName(PREFERENCES_CONFIGMAP_NAME)\n                .withAnnotations(Map.of(\"already\", \"created\"))\n                .endMetadata()\n                .build());\n\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n\n    // then - don't create the configmap\n    Assert.assertEquals(kubernetesMockServer.getLastRequest().getMethod(), \"GET\");\n    var configmaps =\n        kubernetesClient.configMaps().inNamespace(TEST_NAMESPACE_NAME).list().getItems();\n    Assert.assertEquals(configmaps.size(), 1);\n    Assert.assertEquals(configmaps.get(0).getMetadata().getAnnotations().get(\"already\"), \"created\");\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/SshKeysConfiguratorTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.DEV_WORKSPACE_MOUNT_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.DEV_WORKSPACE_WATCH_SECRET_LABEL;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMixedDispatcher;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;\nimport io.fabric8.mockwebserver.Context;\nimport io.fabric8.mockwebserver.MockWebServer;\nimport io.fabric8.mockwebserver.ServerRequest;\nimport io.fabric8.mockwebserver.ServerResponse;\nimport java.util.Base64;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Queue;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.ssh.server.SshManager;\nimport org.eclipse.che.api.ssh.server.model.impl.SshPairImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class SshKeysConfiguratorTest {\n\n  private static final String USER_ID = \"user-id\";\n  private static final String USER_NAME = \"user-name\";\n  private static final String USER_NAMESPACE = \"user-namespace\";\n\n  @Mock private CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  @Mock private SshManager sshManager;\n\n  @InjectMocks private SshKeysConfigurator sshKeysConfigurator;\n  private KubernetesMockServer kubernetesMockServer;\n  private KubernetesClient kubernetesClient;\n\n  private NamespaceResolutionContext context;\n\n  private final SshPairImpl sshPair =\n      new SshPairImpl(USER_ID, \"vcs\", \"github.com\", \"public-key\", \"private-key\");\n\n  @BeforeMethod\n  public void setUp() throws InfrastructureException, NotFoundException, ServerException {\n    context = new NamespaceResolutionContext(null, USER_ID, USER_NAME);\n    final Map<ServerRequest, Queue<ServerResponse>> responses = new HashMap<>();\n    kubernetesMockServer =\n        new KubernetesMockServer(\n            new Context(),\n            new MockWebServer(),\n            responses,\n            new KubernetesMixedDispatcher(responses),\n            true);\n    kubernetesMockServer.init();\n    kubernetesClient = kubernetesMockServer.createClient();\n    when(sshManager.getPairs(USER_ID, \"vcs\")).thenReturn(Collections.singletonList(sshPair));\n    when(cheServerKubernetesClientFactory.create()).thenReturn(kubernetesClient);\n  }\n\n  @AfterMethod\n  public void cleanUp() {\n    kubernetesClient.secrets().inNamespace(USER_NAMESPACE).delete();\n    kubernetesMockServer.destroy();\n  }\n\n  @Test\n  public void shouldCreateSSHKeysSecret() throws InfrastructureException {\n    sshKeysConfigurator.configure(context, USER_NAMESPACE);\n    List<Secret> secrets =\n        kubernetesClient\n            .secrets()\n            .inNamespace(USER_NAMESPACE)\n            .withLabels(\n                Map.of(\n                    DEV_WORKSPACE_MOUNT_LABEL, \"true\",\n                    DEV_WORKSPACE_WATCH_SECRET_LABEL, \"true\"))\n            .list()\n            .getItems();\n    assertEquals(secrets.size(), 1);\n    assertEquals(secrets.get(0).getMetadata().getName(), \"che-git-ssh-key\");\n    assertEquals(secrets.get(0).getData().size(), 3);\n    assertEquals(\n        new String(Base64.getDecoder().decode(secrets.get(0).getData().get(\"github.com\"))),\n        \"private-key\");\n    assertEquals(\n        new String(Base64.getDecoder().decode(secrets.get(0).getData().get(\"github.com.pub\"))),\n        \"public-key\");\n    assertEquals(\n        new String(Base64.getDecoder().decode(secrets.get(0).getData().get(\"ssh_config\"))),\n        \"host github.com\\n\"\n            + \"IdentityFile /etc/ssh/github.com\\n\"\n            + \"StrictHostKeyChecking = no\\n\\n\");\n  }\n\n  @Test\n  public void shouldNotCreateSSHKeysSecretFromBadSecret() throws Exception {\n    SshPairImpl sshPairLocal =\n        new SshPairImpl(USER_ID, \"vcs\", \"%sd$$$\", \"public-key\", \"private-key\");\n    when(sshManager.getPairs(USER_ID, \"vcs\")).thenReturn(List.of(sshPairLocal));\n    sshKeysConfigurator.configure(context, USER_NAMESPACE);\n    List<Secret> secrets =\n        kubernetesClient\n            .secrets()\n            .inNamespace(USER_NAMESPACE)\n            .withLabels(\n                Map.of(\n                    DEV_WORKSPACE_MOUNT_LABEL, \"true\",\n                    DEV_WORKSPACE_WATCH_SECRET_LABEL, \"true\"))\n            .list()\n            .getItems();\n    assertEquals(secrets.size(), 0);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/UserPermissionConfiguratorTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\n\nimport io.fabric8.kubernetes.api.model.rbac.RoleBindingBuilder;\nimport io.fabric8.kubernetes.api.model.rbac.Subject;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMixedDispatcher;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;\nimport io.fabric8.mockwebserver.Context;\nimport io.fabric8.mockwebserver.MockWebServer;\nimport io.fabric8.mockwebserver.ServerRequest;\nimport io.fabric8.mockwebserver.ServerResponse;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Queue;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.Assert;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class UserPermissionConfiguratorTest {\n\n  private NamespaceConfigurator configurator;\n\n  @Mock private CheServerKubernetesClientFactory clientFactory;\n  private KubernetesClient client;\n  private KubernetesMockServer kubernetesMockServer;\n\n  private NamespaceResolutionContext namespaceResolutionContext;\n  private final String TEST_NAMESPACE_NAME = \"namespace123\";\n  private final String TEST_WORKSPACE_ID = \"workspace123\";\n  private final String TEST_USER_ID = \"user123\";\n  private final String TEST_USERNAME = \"jondoe\";\n  private final String TEST_CLUSTER_ROLES = \"cr1,cr2\";\n\n  @BeforeMethod\n  public void setUp() throws InfrastructureException {\n    configurator = new UserPermissionConfigurator(TEST_CLUSTER_ROLES, clientFactory);\n\n    final Map<ServerRequest, Queue<ServerResponse>> responses = new HashMap<>();\n    kubernetesMockServer =\n        new KubernetesMockServer(\n            new Context(),\n            new MockWebServer(),\n            responses,\n            new KubernetesMixedDispatcher(responses),\n            true);\n    kubernetesMockServer.init();\n    client = spy(kubernetesMockServer.createClient());\n    lenient().when(clientFactory.create()).thenReturn(client);\n\n    namespaceResolutionContext =\n        new NamespaceResolutionContext(TEST_WORKSPACE_ID, TEST_USER_ID, TEST_USERNAME);\n  }\n\n  @AfterMethod\n  public void tearDown() {\n    kubernetesMockServer.destroy();\n  }\n\n  @Test\n  public void doNothingWhenNoClusterRolesSet()\n      throws InfrastructureException, InterruptedException {\n    // given - no cluster roles set\n    configurator = new UserPermissionConfigurator(\"\", clientFactory);\n\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n\n    // then - do nothing\n    Assert.assertNull(kubernetesMockServer.getLastRequest());\n    verify(clientFactory, never()).create();\n  }\n\n  @Test\n  public void bindAllClusterRolesWhenEmptyEnv() throws InfrastructureException {\n    // given - clean env\n\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n\n    // then - create all role bindings\n    var roleBindings =\n        kubernetesMockServer.createClient().rbac().roleBindings().inNamespace(TEST_NAMESPACE_NAME);\n    Assert.assertEquals(roleBindings.list().getItems().size(), 2);\n\n    var cr1 = roleBindings.withName(\"cr1\").get();\n    Assert.assertNotNull(cr1);\n    Assert.assertEquals(cr1.getSubjects().get(0).getName(), TEST_USERNAME);\n    Assert.assertEquals(cr1.getSubjects().get(0).getNamespace(), TEST_NAMESPACE_NAME);\n    Assert.assertEquals(cr1.getRoleRef().getName(), \"cr1\");\n\n    var cr2 = roleBindings.withName(\"cr2\").get();\n    Assert.assertNotNull(cr2);\n    Assert.assertEquals(cr2.getSubjects().get(0).getName(), TEST_USERNAME);\n    Assert.assertEquals(cr2.getSubjects().get(0).getNamespace(), TEST_NAMESPACE_NAME);\n    Assert.assertEquals(cr2.getRoleRef().getName(), \"cr2\");\n\n    verify(client, times(2)).rbac();\n  }\n\n  @Test\n  public void replaceExistingBindingsWithSameName() throws InfrastructureException {\n    // given - cr1 binding already exists\n    client\n        .rbac()\n        .roleBindings()\n        .inNamespace(TEST_NAMESPACE_NAME)\n        .create(\n            new RoleBindingBuilder()\n                .withNewMetadata()\n                .withName(\"cr1\")\n                .endMetadata()\n                .withSubjects(new Subject(\"blabol\", \"blabol\", \"blabol\", \"blabol\"))\n                .withNewRoleRef()\n                .withName(\"blabol\")\n                .endRoleRef()\n                .build());\n\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n\n    // then\n    var roleBindings = client.rbac().roleBindings().inNamespace(TEST_NAMESPACE_NAME);\n    Assert.assertEquals(roleBindings.list().getItems().size(), 2);\n\n    var cr1 = roleBindings.withName(\"cr1\").get();\n    Assert.assertEquals(cr1.getRoleRef().getName(), \"cr1\");\n    Assert.assertEquals(cr1.getSubjects().size(), 1);\n    Assert.assertEquals(cr1.getSubjects().get(0).getName(), TEST_USERNAME);\n    Assert.assertEquals(cr1.getSubjects().get(0).getNamespace(), TEST_NAMESPACE_NAME);\n  }\n\n  @Test\n  public void keepOtherClusterRoles() throws InfrastructureException {\n    // given - some other binding in place\n    client\n        .rbac()\n        .roleBindings()\n        .inNamespace(TEST_NAMESPACE_NAME)\n        .create(\n            new RoleBindingBuilder()\n                .withNewMetadata()\n                .withName(\"othercr\")\n                .endMetadata()\n                .withSubjects(new Subject(\"blabol\", \"blabol\", \"blabol\", \"blabol\"))\n                .withNewRoleRef()\n                .withName(\"blabol\")\n                .endRoleRef()\n                .build());\n\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n\n    // then\n    var roleBindings = client.rbac().roleBindings().inNamespace(TEST_NAMESPACE_NAME);\n    Assert.assertEquals(roleBindings.list().getItems().size(), 3);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/UserPreferencesConfiguratorTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.lenient;\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.user.server.PreferenceManager;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@link UserPreferencesConfigurator}.\n *\n * @author Pavol Baran\n */\n@Listeners(MockitoTestNGListener.class)\npublic class UserPreferencesConfiguratorTest {\n\n  private static final String USER_ID = \"user-id\";\n  private static final String USER_NAME = \"user-name\";\n  private static final String USER_EMAIL = \"user-email\";\n  private static final String USER_NAMESPACE = \"user-namespace\";\n\n  @Mock private KubernetesNamespaceFactory namespaceFactory;\n  @Mock private PreferenceManager preferenceManager;\n\n  @InjectMocks private UserPreferencesConfigurator userPreferencesConfigurator;\n\n  private NamespaceResolutionContext context;\n\n  @BeforeMethod\n  public void setUp() throws InfrastructureException, NotFoundException, ServerException {\n    context = new NamespaceResolutionContext(null, USER_ID, USER_NAME);\n\n    Map<String, String> preferences = new HashMap<>();\n    preferences.put(\"preference-name\", \"preference\");\n\n    lenient().when(namespaceFactory.evaluateNamespaceName(any())).thenReturn(USER_NAMESPACE);\n    lenient().when(preferenceManager.find(USER_ID)).thenReturn(preferences);\n  }\n\n  @Test\n  public void shouldNormalizePreferenceName() {\n    assertEquals(\n        userPreferencesConfigurator.normalizePreferenceName(\"codename:bond\"), \"codename-bond\");\n    assertEquals(userPreferencesConfigurator.normalizePreferenceName(\"some--:pref\"), \"some-pref\");\n    assertEquals(\n        userPreferencesConfigurator.normalizePreferenceName(\"pref[name].sub\"), \"pref-name-.sub\");\n  }\n\n  @Test\n  public void shouldKeepPreferenceName() {\n    assertEquals(\n        userPreferencesConfigurator.normalizePreferenceName(\"codename.bond\"), \"codename.bond\");\n    assertEquals(userPreferencesConfigurator.normalizePreferenceName(\"pref_name\"), \"pref_name\");\n    assertEquals(\n        userPreferencesConfigurator.normalizePreferenceName(\"some-name.over_rainbow\"),\n        \"some-name.over_rainbow\");\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/WorkspaceServiceAccountConfiguratorTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator;\n\nimport static java.util.stream.Collectors.joining;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.spy;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\n\nimport io.fabric8.kubernetes.api.model.rbac.ClusterRoleBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMixedDispatcher;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;\nimport io.fabric8.mockwebserver.Context;\nimport io.fabric8.mockwebserver.MockWebServer;\nimport io.fabric8.mockwebserver.ServerRequest;\nimport io.fabric8.mockwebserver.ServerResponse;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Queue;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesWorkspaceServiceAccount;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class WorkspaceServiceAccountConfiguratorTest {\n\n  private WorkspaceServiceAccountConfigurator configurator;\n\n  @Mock private CheServerKubernetesClientFactory clientFactory;\n  private KubernetesClient client;\n  private KubernetesMockServer kubernetesMockServer;\n\n  private NamespaceResolutionContext namespaceResolutionContext;\n  @Mock private KubernetesWorkspaceServiceAccount kubeWSA;\n  private final String TEST_NAMESPACE_NAME = \"namespace123\";\n  private final String TEST_WORKSPACE_ID = \"workspace123\";\n  private final String TEST_USER_ID = \"user123\";\n  private final String TEST_USERNAME = \"jondoe\";\n  private final String TEST_SERVICE_ACCOUNT = \"serviceAccount123\";\n  private final String TEST_CLUSTER_ROLES = \"cr1, cr2\";\n\n  @BeforeMethod\n  public void setUp() throws InfrastructureException {\n    configurator =\n        spy(\n            new WorkspaceServiceAccountConfigurator(\n                TEST_SERVICE_ACCOUNT, TEST_CLUSTER_ROLES, clientFactory));\n    //    when(configurator.doCreateServiceAccount(TEST_WORKSPACE_ID,\n    // TEST_NAMESPACE_NAME)).thenReturn(kubeWSA);\n\n    final Map<ServerRequest, Queue<ServerResponse>> responses = new HashMap<>();\n    kubernetesMockServer =\n        new KubernetesMockServer(\n            new Context(),\n            new MockWebServer(),\n            responses,\n            new KubernetesMixedDispatcher(responses),\n            true);\n    kubernetesMockServer.init();\n    client = spy(kubernetesMockServer.createClient());\n    lenient().when(clientFactory.create(TEST_WORKSPACE_ID)).thenReturn(client);\n\n    namespaceResolutionContext =\n        new NamespaceResolutionContext(TEST_WORKSPACE_ID, TEST_USER_ID, TEST_USERNAME);\n  }\n\n  @AfterMethod\n  public void tearDown() {\n    kubernetesMockServer.destroy();\n  }\n\n  @Test\n  public void createWorkspaceServiceAccountWithBindings() throws InfrastructureException {\n    // given - cluster roles exists in cluster\n    configurator =\n        new WorkspaceServiceAccountConfigurator(\n            TEST_SERVICE_ACCOUNT, TEST_CLUSTER_ROLES, clientFactory);\n    client\n        .rbac()\n        .clusterRoles()\n        .create(new ClusterRoleBuilder().withNewMetadata().withName(\"cr1\").endMetadata().build());\n    client\n        .rbac()\n        .clusterRoles()\n        .create(new ClusterRoleBuilder().withNewMetadata().withName(\"cr2\").endMetadata().build());\n\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n\n    // then - create service account with all the bindings\n    var serviceAccount =\n        client\n            .serviceAccounts()\n            .inNamespace(TEST_NAMESPACE_NAME)\n            .withName(TEST_SERVICE_ACCOUNT)\n            .get();\n    assertNotNull(serviceAccount);\n\n    var roleBindings =\n        client.rbac().roleBindings().inNamespace(TEST_NAMESPACE_NAME).list().getItems();\n    assertEquals(\n        roleBindings.size(),\n        6,\n        roleBindings.stream()\n            .map(r -> r.getMetadata().getName())\n            .collect(joining(\", \"))); // exec, secrets, configmaps, view bindings + cr1, cr2\n  }\n\n  @Test\n  public void dontCreateBindingsWhenClusterRolesDontExists() throws InfrastructureException {\n    // given - cluster roles exists in cluster\n    configurator =\n        new WorkspaceServiceAccountConfigurator(\n            TEST_SERVICE_ACCOUNT, TEST_CLUSTER_ROLES, clientFactory);\n\n    // when\n    configurator.configure(namespaceResolutionContext, TEST_NAMESPACE_NAME);\n\n    // then - create service account with default bindings\n    var serviceAccount =\n        client\n            .serviceAccounts()\n            .inNamespace(TEST_NAMESPACE_NAME)\n            .withName(TEST_SERVICE_ACCOUNT)\n            .get();\n    assertNotNull(serviceAccount);\n\n    var roleBindings =\n        client.rbac().roleBindings().inNamespace(TEST_NAMESPACE_NAME).list().getItems();\n    assertEquals(\n        roleBindings.size(),\n        4,\n        roleBindings.stream()\n            .map(r -> r.getMetadata().getName())\n            .collect(joining(\", \"))); // exec, secrets, configmaps, view bindings\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/log/ContainerLogWatchTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.doAnswer;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.timeout;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodList;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.dsl.ContainerResource;\nimport io.fabric8.kubernetes.client.dsl.LogWatch;\nimport io.fabric8.kubernetes.client.dsl.MixedOperation;\nimport io.fabric8.kubernetes.client.dsl.PodResource;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.PipedInputStream;\nimport java.io.PipedOutputStream;\nimport java.util.concurrent.CompletionStage;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class ContainerLogWatchTest {\n\n  private final String namespace = \"namespace123\";\n  private final String podname = \"pod123\";\n  private final String container = \"containre123\";\n  private final LogWatchTimeouts TIMEOUTS = new LogWatchTimeouts(100, 0, 0);\n  private final long LOG_LIMIT_BYTES = 1024;\n\n  @Mock KubernetesClient client;\n  @Mock RuntimeEventsPublisher eventsPublisher;\n\n  @Mock PodLogHandler podLogHandler;\n\n  @Mock MixedOperation<Pod, PodList, PodResource> pods;\n  @Mock PodResource podResource;\n\n  @Mock ContainerResource containerResource;\n\n  LogWatchMock logWatch;\n\n  @BeforeMethod\n  public void setUp() throws IOException {\n    logWatch = new LogWatchMock();\n\n    when(client.pods()).thenReturn(pods);\n    when(pods.inNamespace(namespace)).thenReturn(pods);\n    when(pods.withName(podname)).thenReturn(podResource);\n    when(podResource.inContainer(container)).thenReturn(containerResource);\n    when(containerResource.watchLog()).thenReturn(logWatch);\n  }\n\n  @Test\n  public void testSuccessfulFinishedContainerLogWatch() throws IOException {\n    PipedInputStream inputStream = new PipedInputStream();\n    PipedOutputStream outputStream = new PipedOutputStream(inputStream);\n    outputStream.write(\"first\\nsecond\".getBytes());\n    outputStream.write(\"\\nthird\".getBytes());\n    outputStream.close();\n    logWatch.setInputStream(inputStream);\n\n    ContainerLogWatch clw =\n        new ContainerLogWatch(\n            client,\n            eventsPublisher,\n            namespace,\n            podname,\n            container,\n            podLogHandler,\n            TIMEOUTS,\n            LOG_LIMIT_BYTES);\n    clw.run();\n\n    verify(podLogHandler).handle(\"first\", container);\n    verify(podLogHandler).handle(\"second\", container);\n    verify(podLogHandler).handle(\"third\", container);\n    assertTrue(logWatch.isClosed);\n\n    // verify events were properly fired\n    verify(eventsPublisher, times(1)).sendWatchLogStartedEvent(any(String.class));\n    verify(eventsPublisher, times(1)).sendWatchLogStoppedEvent(any(String.class));\n  }\n\n  @Test\n  public void testLimitInputStreamBytes() throws IOException {\n    PipedInputStream inputStream = new PipedInputStream();\n    PipedOutputStream outputStream = new PipedOutputStream(inputStream);\n    outputStream.write(\"This is long message that won't fit into the limit.\".getBytes());\n    outputStream.close();\n    logWatch.setInputStream(inputStream);\n\n    ContainerLogWatch clw =\n        new ContainerLogWatch(\n            client, eventsPublisher, namespace, podname, container, podLogHandler, TIMEOUTS, 4);\n    clw.run();\n\n    ArgumentCaptor<String> messageCaptor = ArgumentCaptor.forClass(String.class);\n    ArgumentCaptor<String> containerCaptor = ArgumentCaptor.forClass(String.class);\n    verify(podLogHandler, times(1)).handle(messageCaptor.capture(), containerCaptor.capture());\n    assertEquals(messageCaptor.getValue(), \"This\");\n    assertEquals(containerCaptor.getValue(), container);\n    assertTrue(logWatch.isClosed);\n\n    // verify events were properly fired\n    verify(eventsPublisher, times(1)).sendWatchLogStartedEvent(any(String.class));\n    verify(eventsPublisher, times(1)).sendWatchLogStoppedEvent(any(String.class));\n  }\n\n  @Test\n  public void testCloseFromOutside() throws IOException, InterruptedException {\n    PipedInputStream inputStream = new PipedInputStream();\n    PipedOutputStream outputStream = new PipedOutputStream(inputStream);\n    outputStream.write(\"message\\n\".getBytes());\n    logWatch.setInputStream(inputStream);\n\n    CountDownLatch latch = new CountDownLatch(1);\n    doAnswer(\n            (a) -> {\n              outputStream.write(\"nextMessage\\n\".getBytes());\n              latch.countDown();\n              return null;\n            })\n        .when(podLogHandler)\n        .handle(any(), any());\n\n    ContainerLogWatch clw =\n        new ContainerLogWatch(\n            client,\n            eventsPublisher,\n            namespace,\n            podname,\n            container,\n            podLogHandler,\n            TIMEOUTS,\n            LOG_LIMIT_BYTES);\n    new Thread(clw).start();\n\n    latch.await(1, TimeUnit.SECONDS);\n    clw.close();\n\n    assertTrue(logWatch.isClosed);\n\n    // verify events were properly fired\n    verify(eventsPublisher, times(1)).sendWatchLogStartedEvent(any(String.class));\n    verify(eventsPublisher, timeout(1000).times(1)).sendWatchLogStoppedEvent(any(String.class));\n  }\n\n  @Test\n  public void testCloseOfOutputStream() throws IOException, InterruptedException {\n    PipedInputStream inputStream = new PipedInputStream();\n    PipedOutputStream outputStream = new PipedOutputStream(inputStream);\n    outputStream.write(\"message\\n\".getBytes());\n    logWatch.setInputStream(inputStream);\n\n    CountDownLatch messageHandleLatch = new CountDownLatch(1);\n    doAnswer(\n            (a) -> {\n              messageHandleLatch.countDown();\n              return null;\n            })\n        .when(podLogHandler)\n        .handle(\"message\", container);\n\n    ContainerLogWatch clw =\n        new ContainerLogWatch(\n            client,\n            eventsPublisher,\n            namespace,\n            podname,\n            container,\n            podLogHandler,\n            TIMEOUTS,\n            LOG_LIMIT_BYTES);\n    new Thread(clw).start();\n\n    messageHandleLatch.await(1, TimeUnit.SECONDS);\n    outputStream.close();\n\n    CountDownLatch closeLatch = new CountDownLatch(1);\n    logWatch.setLatch(closeLatch);\n    closeLatch.await(1, TimeUnit.SECONDS);\n    assertTrue(logWatch.isClosed);\n\n    // verify events were properly fired\n    verify(eventsPublisher, times(1)).sendWatchLogStartedEvent(any(String.class));\n    verify(eventsPublisher, timeout(1000).times(1)).sendWatchLogStoppedEvent(any(String.class));\n  }\n\n  @Test\n  public void shouldRetryWhenErrorMessageReceived() throws IOException, InterruptedException {\n    // prepare error message logWatch\n    String podInitializingMessage =\n        \"{\\\"kind\\\":\\\"Status\\\",\"\n            + \"\\\"apiVersion\\\":\\\"v1\\\",\"\n            + \"\\\"metadata\\\":{},\"\n            + \"\\\"status\\\":\\\"Failure\\\",\"\n            + \"\\\"message\\\":\\\"container \\\\\\\"\"\n            + container\n            + \"\\\\\\\" in pod \\\\\\\"\"\n            + podname\n            + \"\\\\\\\" is waiting to start: ContainerCreating\\\",\"\n            + \"\\\"reason\\\":\\\"BadRequest\\\",\"\n            + \"\\\"code\\\":400}\";\n    PipedInputStream inputStream = new PipedInputStream();\n    PipedOutputStream outputStream = new PipedOutputStream(inputStream);\n    outputStream.write((podInitializingMessage + \"\\n\").getBytes());\n    outputStream.close();\n    logWatch.setInputStream(inputStream);\n\n    LogWatchMock logWatchRegularMessage = new LogWatchMock();\n    // prepare regular message logwatch\n    inputStream = new PipedInputStream();\n    outputStream = new PipedOutputStream(inputStream);\n    outputStream.write(\"message\\n\".getBytes());\n    outputStream.close();\n    logWatchRegularMessage.setInputStream(inputStream);\n    CountDownLatch messageHandleLatch = new CountDownLatch(2);\n    logWatchRegularMessage.setLatch(messageHandleLatch);\n    doAnswer(\n            (a) -> {\n              messageHandleLatch.countDown();\n              return null;\n            })\n        .when(podLogHandler)\n        .handle(\"message\", container);\n\n    // return error message logwatch first and regular message logwatch on second call\n    when(containerResource.watchLog()).thenReturn(logWatch).thenReturn(logWatchRegularMessage);\n\n    ContainerLogWatch clw =\n        new ContainerLogWatch(\n            client,\n            eventsPublisher,\n            namespace,\n            podname,\n            container,\n            podLogHandler,\n            TIMEOUTS,\n            LOG_LIMIT_BYTES);\n    new Thread(clw).start();\n\n    // wait for logwatch close, it means that error message was processed\n    CountDownLatch closeLatch = new CountDownLatch(1);\n    logWatch.setLatch(closeLatch);\n    closeLatch.await(1, TimeUnit.SECONDS);\n    assertTrue(logWatch.isClosed);\n\n    // wait for regular message\n    messageHandleLatch.await(1, TimeUnit.SECONDS);\n\n    // message was processed\n    verify(podLogHandler).handle(\"message\", container);\n    assertTrue(logWatchRegularMessage.isClosed);\n\n    // verify events were properly fired\n    verify(eventsPublisher, times(2)).sendWatchLogStartedEvent(any(String.class));\n    verify(eventsPublisher, timeout(1000).times(2)).sendWatchLogStoppedEvent(any(String.class));\n  }\n\n  @Test\n  public void shouldRetryWhenOutputIsNullFirst() throws IOException, InterruptedException {\n    logWatch.setInputStream(null);\n\n    LogWatchMock logWatchRegularMessage = new LogWatchMock();\n    // prepare regular message logwatch\n    PipedInputStream inputStream = new PipedInputStream();\n    PipedOutputStream outputStream = new PipedOutputStream(inputStream);\n    outputStream.write(\"message\\n\".getBytes());\n    outputStream.close();\n    logWatchRegularMessage.setInputStream(inputStream);\n    CountDownLatch messageHandleLatch = new CountDownLatch(2);\n    logWatchRegularMessage.setLatch(messageHandleLatch);\n    doAnswer(\n            (a) -> {\n              messageHandleLatch.countDown();\n              return null;\n            })\n        .when(podLogHandler)\n        .handle(\"message\", container);\n\n    // return null stream first and regular message stream on second call\n    when(containerResource.watchLog()).thenReturn(logWatch).thenReturn(logWatchRegularMessage);\n\n    ContainerLogWatch clw =\n        new ContainerLogWatch(\n            client,\n            eventsPublisher,\n            namespace,\n            podname,\n            container,\n            podLogHandler,\n            TIMEOUTS,\n            LOG_LIMIT_BYTES);\n    new Thread(clw).start();\n\n    // wait for logwatch close, it means that error message was processed\n    CountDownLatch closeLatch = new CountDownLatch(1);\n    logWatch.setLatch(closeLatch);\n    closeLatch.await(1, TimeUnit.SECONDS);\n    assertTrue(logWatch.isClosed);\n\n    // wait for regular message\n    messageHandleLatch.await(1, TimeUnit.SECONDS);\n\n    // message was processed\n    verify(podLogHandler).handle(\"message\", container);\n    assertTrue(logWatchRegularMessage.isClosed);\n\n    // verify events were properly fired\n    verify(eventsPublisher, times(2)).sendWatchLogStartedEvent(any(String.class));\n    verify(eventsPublisher, timeout(1000).times(2)).sendWatchLogStoppedEvent(any(String.class));\n  }\n\n  private class LogWatchMock implements LogWatch {\n\n    private InputStream inputStream;\n    private CountDownLatch latch;\n    private boolean isClosed = false;\n\n    private LogWatchMock() {}\n\n    public void setLatch(CountDownLatch latch) {\n      this.latch = latch;\n    }\n\n    public void setInputStream(InputStream inputStream) {\n      this.inputStream = inputStream;\n    }\n\n    @Override\n    public InputStream getOutput() {\n      return inputStream;\n    }\n\n    @Override\n    public CompletionStage<Throwable> onClose() {\n      return mock(CompletionStage.class);\n    }\n\n    @Override\n    public void close() {\n      isClosed = true;\n      if (inputStream != null) {\n        try {\n          inputStream.close();\n        } catch (IOException e) {\n          e.printStackTrace();\n        }\n      }\n      if (latch != null) {\n        latch.countDown();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/log/LogWatcherTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.workspace.shared.Constants.DEBUG_WORKSPACE_START;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.LogWatcher.DEFAULT_LOG_LIMIT_BYTES;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.Collections;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.Executor;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEvent;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class LogWatcherTest {\n\n  private final String POD = \"pod123\";\n  private final Set<String> PODNAMES = Collections.singleton(POD);\n  private final String WORKSPACE_ID = \"workspace123\";\n  private final String NAMESPACE = \"namespace123\";\n  private final LogWatchTimeouts TIMEOUTS = new LogWatchTimeouts(100, 0, 0);\n  private final long LIMIT_BYTES = 64;\n\n  @Mock private PodLogHandler handler;\n  @Mock private KubernetesClientFactory clientFactory;\n  @Mock private RuntimeEventsPublisher eventsPublisher;\n  @Mock private Executor executor;\n\n  @BeforeMethod\n  public void setUp() {}\n\n  @Test\n  public void executorIsNotCalledWhenContainerIsNull() throws InfrastructureException {\n    // given\n    LogWatcher logWatcher =\n        new LogWatcher(\n            clientFactory,\n            eventsPublisher,\n            WORKSPACE_ID,\n            NAMESPACE,\n            PODNAMES,\n            executor,\n            TIMEOUTS,\n            LIMIT_BYTES);\n    logWatcher.addLogHandler(handler);\n    PodEvent podEvent =\n        new PodEvent(\n            POD, null, \"somereallygoodreason\", \"someevenbettermessage\", \"123456789\", \"987654321\");\n\n    // when\n    logWatcher.handle(podEvent);\n\n    // then\n    verify(executor, times(0)).execute(any());\n  }\n\n  @Test\n  public void executorIsNotCalledWhenPodNameDontMatch() throws InfrastructureException {\n    // given\n    LogWatcher logWatcher =\n        new LogWatcher(\n            clientFactory,\n            eventsPublisher,\n            WORKSPACE_ID,\n            NAMESPACE,\n            PODNAMES,\n            executor,\n            TIMEOUTS,\n            LIMIT_BYTES);\n    logWatcher.addLogHandler(handler);\n    PodEvent podEvent =\n        new PodEvent(\n            \"someOtherPod\",\n            \"container123\",\n            \"Started\",\n            \"someevenbettermessage\",\n            \"123456789\",\n            \"987654321\");\n\n    // when\n    logWatcher.handle(podEvent);\n\n    // then\n    verify(executor, times(0)).execute(any());\n  }\n\n  @Test\n  public void executorIsNotCalledWhenReasonIsNotStarted() throws InfrastructureException {\n    // given\n    LogWatcher logWatcher =\n        new LogWatcher(\n            clientFactory,\n            eventsPublisher,\n            WORKSPACE_ID,\n            NAMESPACE,\n            PODNAMES,\n            executor,\n            TIMEOUTS,\n            LIMIT_BYTES);\n    logWatcher.addLogHandler(handler);\n    PodEvent podEvent =\n        new PodEvent(\n            POD, \"container123\", \"NotStarted\", \"someevenbettermessage\", \"123456789\", \"987654321\");\n\n    // when\n    logWatcher.handle(podEvent);\n\n    // then\n    verify(executor, times(0)).execute(any());\n  }\n\n  @Test\n  public void executorIsCalledWhenAllIsSet() throws InfrastructureException {\n    // given\n    LogWatcher logWatcher =\n        new LogWatcher(\n            clientFactory,\n            eventsPublisher,\n            WORKSPACE_ID,\n            NAMESPACE,\n            PODNAMES,\n            executor,\n            TIMEOUTS,\n            LIMIT_BYTES);\n    logWatcher.addLogHandler(handler);\n    PodEvent podEvent =\n        new PodEvent(\n            POD, \"container123\", \"Started\", \"someevenbettermessage\", \"123456789\", \"987654321\");\n\n    // when\n    logWatcher.handle(podEvent);\n\n    // then\n    verify(executor, times(1)).execute(any());\n  }\n\n  @Test\n  public void executorIsCalledJustOnceWhenSameEventArriveAgain() throws InfrastructureException {\n    // given\n    LogWatcher logWatcher =\n        new LogWatcher(\n            clientFactory,\n            eventsPublisher,\n            WORKSPACE_ID,\n            NAMESPACE,\n            PODNAMES,\n            executor,\n            TIMEOUTS,\n            LIMIT_BYTES);\n    logWatcher.addLogHandler(handler);\n    PodEvent podEvent =\n        new PodEvent(\n            POD, \"container123\", \"Started\", \"someevenbettermessage\", \"123456789\", \"987654321\");\n\n    // when\n    logWatcher.handle(podEvent);\n    logWatcher.handle(podEvent);\n\n    // then\n    verify(executor, times(1)).execute(any());\n  }\n\n  @Test\n  public void executorIsNotCalledAgainAfterCleanup() throws InfrastructureException {\n    // given\n    LogWatcher logWatcher =\n        new LogWatcher(\n            clientFactory,\n            eventsPublisher,\n            WORKSPACE_ID,\n            NAMESPACE,\n            PODNAMES,\n            executor,\n            TIMEOUTS,\n            LIMIT_BYTES);\n    logWatcher.addLogHandler(handler);\n    PodEvent podEvent =\n        new PodEvent(\n            POD, \"container123\", \"Started\", \"someevenbettermessage\", \"123456789\", \"987654321\");\n\n    // when\n    logWatcher.handle(podEvent);\n    logWatcher.close();\n    logWatcher.handle(podEvent);\n\n    // then\n    verify(executor, times(1)).execute(any());\n  }\n\n  @DataProvider\n  public Object[][] logLimitData() {\n    return new Object[][] {\n      {null, DEFAULT_LOG_LIMIT_BYTES},\n      {emptyMap(), DEFAULT_LOG_LIMIT_BYTES},\n      {singletonMap(\"bla\", \"bol\"), DEFAULT_LOG_LIMIT_BYTES},\n      {\n        ImmutableMap.of(Constants.DEBUG_WORKSPACE_START_LOG_LIMIT_BYTES, \"123\", \"other\", \"value\"),\n        123\n      }\n    };\n  }\n\n  @Test(dataProvider = \"logLimitData\")\n  public void testGettingLogLimitBytes(Map<String, String> startOptions, long expectedLimit) {\n    assertEquals(LogWatcher.getLogLimitBytes(startOptions), expectedLimit);\n  }\n\n  @DataProvider\n  public Object[][] shouldWatchLogsData() {\n    return new Object[][] {\n      {null, false},\n      {emptyMap(), false},\n      {singletonMap(\"bla\", \"bol\"), false},\n      {singletonMap(DEBUG_WORKSPACE_START, \"blbost\"), false},\n      {singletonMap(DEBUG_WORKSPACE_START, \"false\"), false},\n      {singletonMap(DEBUG_WORKSPACE_START, \"true\"), true},\n      {ImmutableMap.of(DEBUG_WORKSPACE_START, \"true\", \"bla\", \"bol\"), true},\n      {ImmutableMap.of(DEBUG_WORKSPACE_START, \"tttt\", \"bla\", \"bol\"), false},\n    };\n  }\n\n  @Test(dataProvider = \"shouldWatchLogsData\")\n  public void testShouldWatchLogsFromStartOptions(\n      Map<String, String> startOptions, boolean expected) {\n    assertEquals(LogWatcher.shouldWatchLogs(startOptions), expected);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/log/PodLogToEventPublisherTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.*;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class PodLogToEventPublisherTest {\n\n  @Mock RuntimeEventsPublisher eventsPublisher;\n\n  @Mock RuntimeIdentity identity;\n\n  @Test\n  public void sendMessageToPublisher() {\n    PodLogHandler handler = new PodLogToEventPublisher(eventsPublisher, identity);\n\n    handler.handle(\"message\", \"containerName\");\n\n    ArgumentCaptor<String> messageCaptor = ArgumentCaptor.forClass(String.class);\n    verify(eventsPublisher)\n        .sendRuntimeLogEvent(\n            messageCaptor.capture(), any(String.class), any(RuntimeIdentity.class));\n    String capturedMessage = messageCaptor.getValue();\n    assertTrue(capturedMessage.contains(\"message\"));\n    assertTrue(capturedMessage.contains(\"containerName\"));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/pvc/TestObjects.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.namespace.pvc;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport io.fabric8.kubernetes.api.model.VolumeMountBuilder;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.workspace.server.model.impl.VolumeImpl;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\n\n/**\n * Helps prepare objects for PVC strategy tests.\n *\n * @author Sergii Leshchenko\n */\npublic class TestObjects {\n\n  public static InternalMachineConfigBuilder newMachineConfig() {\n    return new InternalMachineConfigBuilder();\n  }\n\n  public static TestPodBuilder newPod(String podName) {\n    return new TestPodBuilder(podName);\n  }\n\n  public static TestContainerBuilder newContainer(String containerName) {\n    return new TestContainerBuilder(containerName);\n  }\n\n  public static class TestPodBuilder {\n\n    private String name;\n    private List<Container> initContainers = new ArrayList<>();\n    private List<Container> containers = new ArrayList<>();\n    private List<Volume> volumes = new ArrayList<>();\n\n    public TestPodBuilder(String podName) {\n      this.name = podName;\n    }\n\n    public TestPodBuilder withInitContainers(Container... containers) {\n      this.initContainers.addAll(Arrays.asList(containers));\n      return this;\n    }\n\n    public TestPodBuilder withContainers(Container... containers) {\n      this.containers.addAll(Arrays.asList(containers));\n      return this;\n    }\n\n    public TestPodBuilder withPVCVolume(String volumeName, String pvcName) {\n      this.volumes.add(\n          new VolumeBuilder()\n              .withName(volumeName)\n              .withNewPersistentVolumeClaim()\n              .withClaimName(pvcName)\n              .endPersistentVolumeClaim()\n              .build());\n      return this;\n    }\n\n    public Pod build() {\n      return new PodBuilder()\n          .withNewMetadata()\n          .withName(name)\n          .endMetadata()\n          .withNewSpec()\n          .withInitContainers(initContainers)\n          .withContainers(containers)\n          .withVolumes(volumes)\n          .endSpec()\n          .build();\n    }\n  }\n\n  public static class TestContainerBuilder {\n\n    private String name;\n    private List<VolumeMount> volumeMounts = new ArrayList<>();\n\n    public TestContainerBuilder(String containerName) {\n      this.name = containerName;\n    }\n\n    public TestContainerBuilder withVolumeMount(\n        String volumeName, String mountPath, String subpath) {\n      this.volumeMounts.add(\n          new VolumeMountBuilder()\n              .withName(volumeName)\n              .withMountPath(mountPath)\n              .withSubPath(subpath)\n              .build());\n      return this;\n    }\n\n    public Container build() {\n      return new ContainerBuilder().withName(name).withVolumeMounts(volumeMounts).build();\n    }\n  }\n\n  public static class InternalMachineConfigBuilder {\n\n    private Map<String, VolumeImpl> volumes = new HashMap<>();\n\n    public InternalMachineConfigBuilder withVolume(String volumeName, String path) {\n      volumes.put(volumeName, new VolumeImpl().withPath(path));\n      return this;\n    }\n\n    public InternalMachineConfig build() {\n      return new InternalMachineConfig(new HashMap<>(), new HashMap<>(), new HashMap<>(), volumes);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/CertificateProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static java.util.Collections.emptyMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.CertificateProvisioner.CA_CERT_FILE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.CertificateProvisioner.CERT_MOUNT_PATH;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.CertificateProvisioner.CHE_SELF_SIGNED_CERT_SECRET_SUFFIX;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.CertificateProvisioner.CHE_SELF_SIGNED_CERT_VOLUME;\nimport static org.mockito.Mockito.lenient;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretVolumeSource;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link CertificateProvisioner}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class CertificateProvisionerTest {\n\n  private static final String WORKSPACE_ID = \"workspace123\";\n  private static final String EXPECTED_CERT_NAME =\n      WORKSPACE_ID + CHE_SELF_SIGNED_CERT_SECRET_SUFFIX;\n\n  public static final String CERT_CONTENT = \"--BEGIN FJASBNDF END\";\n  @Mock private RuntimeIdentity runtimeId;\n  private CertificateProvisioner provisioner;\n  private KubernetesEnvironment k8sEnv;\n\n  @BeforeMethod\n  public void setUp() {\n    lenient().when(runtimeId.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n\n    provisioner = new CertificateProvisioner(\"--BEGIN FJASBNDF END\");\n    k8sEnv = KubernetesEnvironment.builder().build();\n  }\n\n  @Test\n  public void shouldReturnFalseIfCertificateIsNotSpecifiedOnIsConfiguredInvoking() {\n    // given\n    provisioner = new CertificateProvisioner(\"\");\n\n    // when\n    boolean configured = provisioner.isConfigured();\n\n    // then\n    assertFalse(configured);\n  }\n\n  @Test\n  public void shouldReturnTrueIfCertificateIsSpecifiedOnIsConfiguredInvoking() {\n    // given\n    provisioner = new CertificateProvisioner(CERT_CONTENT);\n\n    // when\n    boolean configured = provisioner.isConfigured();\n\n    // then\n    assertTrue(configured);\n  }\n\n  @Test\n  public void shouldReturnCertPathFile() {\n    // when\n    String certPath = provisioner.getCertPath();\n\n    // then\n    assertEquals(certPath, \"/tmp/che/secret/ca.crt\");\n  }\n\n  @Test\n  public void shouldAddSecretWithCertificateIntoEnvironment() throws Exception {\n    // when\n    provisioner.provision(k8sEnv, runtimeId);\n\n    // then\n    Map<String, Secret> secrets = k8sEnv.getSecrets();\n    assertEquals(secrets.size(), 1);\n\n    Secret certSecret = secrets.get(EXPECTED_CERT_NAME);\n    assertNotNull(certSecret);\n    assertEquals(certSecret.getMetadata().getName(), EXPECTED_CERT_NAME);\n    assertEquals(certSecret.getStringData().get(CA_CERT_FILE), CERT_CONTENT);\n  }\n\n  @Test\n  public void shouldAddVolumeAndVolumeMountsToPodsAndContainersInEnvironment() throws Exception {\n    // given\n    k8sEnv.addPod(createPod(\"pod\"));\n    k8sEnv.addPod(createPod(\"pod2\"));\n\n    // when\n    provisioner.provision(k8sEnv, runtimeId);\n\n    // then\n    for (Pod pod : k8sEnv.getPodsCopy().values()) {\n      verifyVolumeIsPresent(pod);\n\n      for (Container container : pod.getSpec().getInitContainers()) {\n        verifyVolumeMountIsPresent(container);\n      }\n\n      for (Container container : pod.getSpec().getContainers()) {\n        verifyVolumeMountIsPresent(container);\n      }\n    }\n  }\n\n  @Test\n  public void\n      shouldNotAddVolumeAndVolumeMountsToPodsAndContainersInEnvironmentIfCertIsNotConfigured()\n          throws Exception {\n    // given\n    provisioner = new CertificateProvisioner(\"\");\n    k8sEnv.addPod(createPod(\"pod\"));\n    k8sEnv.addPod(createPod(\"pod2\"));\n\n    // when\n    provisioner.provision(k8sEnv, runtimeId);\n\n    // then\n    for (Pod pod : k8sEnv.getPodsCopy().values()) {\n      assertTrue(pod.getSpec().getVolumes().isEmpty());\n      for (Container container : pod.getSpec().getContainers()) {\n        assertTrue(container.getVolumeMounts().isEmpty());\n      }\n    }\n  }\n\n  @Test\n  public void shouldNotAddVolumeButAddMountToInjectablePod() throws Exception {\n    // given\n    provisioner = new CertificateProvisioner(CERT_CONTENT);\n    k8sEnv.addPod(createPod(\"pod\"));\n    k8sEnv.addInjectablePod(\"r\", \"i\", createPod(\"injected\"));\n\n    // when\n    provisioner.provision(k8sEnv, runtimeId);\n\n    // then\n    Pod pod = k8sEnv.getPodsCopy().get(\"pod\");\n    Pod injected = k8sEnv.getInjectablePodsCopy().getOrDefault(\"r\", emptyMap()).get(\"i\");\n\n    assertNotNull(pod);\n    assertNotNull(injected);\n\n    verifyVolumeIsPresent(pod);\n    pod.getSpec().getContainers().forEach(this::verifyVolumeMountIsPresent);\n\n    assertTrue(injected.getSpec().getVolumes().isEmpty());\n    injected.getSpec().getContainers().forEach(this::verifyVolumeMountIsPresent);\n  }\n\n  private void verifyVolumeIsPresent(Pod pod) {\n    List<Volume> podVolumes = pod.getSpec().getVolumes();\n    assertEquals(podVolumes.size(), 1);\n    Volume certVolume = podVolumes.get(0);\n    assertEquals(certVolume.getName(), CHE_SELF_SIGNED_CERT_VOLUME);\n    SecretVolumeSource volumeSecret = certVolume.getSecret();\n    assertNotNull(volumeSecret);\n    assertEquals(volumeSecret.getSecretName(), EXPECTED_CERT_NAME);\n  }\n\n  private void verifyVolumeMountIsPresent(Container container) {\n    List<VolumeMount> volumeMounts = container.getVolumeMounts();\n    assertEquals(volumeMounts.size(), 1);\n    VolumeMount volumeMount = volumeMounts.get(0);\n    assertEquals(volumeMount.getName(), CHE_SELF_SIGNED_CERT_VOLUME);\n    assertTrue(volumeMount.getReadOnly());\n    assertEquals(volumeMount.getMountPath(), CERT_MOUNT_PATH);\n  }\n\n  private Pod createPod(String podName) {\n    return new PodBuilder()\n        .withNewMetadata()\n        .withName(podName)\n        .endMetadata()\n        .withNewSpec()\n        .withInitContainers(new ContainerBuilder().build())\n        .withContainers(new ContainerBuilder().build(), new ContainerBuilder().build())\n        .endSpec()\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/GatewayRouterProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static java.util.Collections.emptyMap;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVICE_NAME_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVICE_PORT_ATTRIBUTE;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport java.util.Collections;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.GatewayRouteConfigGenerator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.GatewayRouteConfigGeneratorFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.GatewayConfigmapLabels;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GatewayRouterProvisionerTest {\n\n  private final String NAMESPACE = \"nejmspejs\";\n\n  @Mock private GatewayRouteConfigGeneratorFactory configGeneratorFactory;\n  @Mock private GatewayRouteConfigGenerator gatewayRouteConfigGenerator;\n  @Mock private GatewayConfigmapLabels gatewayConfigmapLabels;\n  @Mock private KubernetesEnvironment env;\n  @Mock private RuntimeIdentity identity;\n\n  private GatewayRouterProvisioner gatewayRouterProvisioner;\n  private final ServerConfigImpl serverConfigWithoutAttributes =\n      new ServerConfigImpl(\"1234\", \"http\", \"/hello/there\", emptyMap());\n  private final ServerConfigImpl serverConfig =\n      new ServerConfigImpl(\n          \"1234\",\n          \"http\",\n          \"/hello/there\",\n          ImmutableMap.of(SERVICE_NAME_ATTRIBUTE, \"serviceName\", SERVICE_PORT_ATTRIBUTE, \"1111\"));\n\n  @BeforeMethod\n  public void setUp() {\n    lenient().when(configGeneratorFactory.create()).thenReturn(gatewayRouteConfigGenerator);\n    lenient().when(identity.getInfrastructureNamespace()).thenReturn(NAMESPACE);\n\n    when(gatewayConfigmapLabels.isGatewayConfig(any(ConfigMap.class))).thenReturn(true);\n    gatewayRouterProvisioner =\n        new GatewayRouterProvisioner(configGeneratorFactory, gatewayConfigmapLabels);\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void testFailWhenNoServersInConfigmapAnnotations() throws InfrastructureException {\n    // given\n    ConfigMap gatewayRouteConfigMap =\n        new ConfigMapBuilder().withNewMetadata().withName(\"route\").endMetadata().build();\n    when(env.getConfigMaps()).thenReturn(Collections.singletonMap(\"route\", gatewayRouteConfigMap));\n\n    // when\n    gatewayRouterProvisioner.provision(env, identity);\n\n    // then exception\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void testFailWhenMoreThanOneServerInConfigmapAnnotations() throws InfrastructureException {\n    // given\n    Map<String, String> annotationsWith2Servers =\n        new Annotations.Serializer()\n            .server(\"s1\", serverConfigWithoutAttributes)\n            .server(\"s2\", serverConfigWithoutAttributes)\n            .annotations();\n\n    ConfigMap gatewayRouteConfigMap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(\"route\")\n            .withAnnotations(annotationsWith2Servers)\n            .endMetadata()\n            .build();\n    when(env.getConfigMaps()).thenReturn(Collections.singletonMap(\"route\", gatewayRouteConfigMap));\n\n    // when\n    gatewayRouterProvisioner.provision(env, identity);\n\n    // then exception\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void testFailWhenServerHasNotAllNeededAttributes() throws InfrastructureException {\n    // given\n    Map<String, String> annotationsWith2Servers =\n        new Annotations.Serializer().server(\"s1\", serverConfigWithoutAttributes).annotations();\n\n    ConfigMap gatewayRouteConfigMap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(\"route\")\n            .withAnnotations(annotationsWith2Servers)\n            .endMetadata()\n            .build();\n    when(env.getConfigMaps()).thenReturn(Collections.singletonMap(\"route\", gatewayRouteConfigMap));\n\n    // when\n    gatewayRouterProvisioner.provision(env, identity);\n\n    // then exception\n  }\n\n  @Test\n  public void testNoProvisionWhenNoMatchingLabels() throws InfrastructureException {\n    // given\n    Map<String, String> annotationsWith2Servers =\n        new Annotations.Serializer().server(\"s1\", serverConfig).annotations();\n\n    ConfigMap gatewayRouteConfigMap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(\"route\")\n            .withAnnotations(annotationsWith2Servers)\n            .endMetadata()\n            .build();\n    when(env.getConfigMaps()).thenReturn(Collections.singletonMap(\"route\", gatewayRouteConfigMap));\n\n    when(gatewayConfigmapLabels.isGatewayConfig(gatewayRouteConfigMap)).thenReturn(false);\n\n    // when\n    gatewayRouterProvisioner.provision(env, identity);\n\n    // then\n    verify(configGeneratorFactory, never()).create();\n  }\n\n  @Test\n  public void testProvision() throws InfrastructureException {\n    // given\n    Map<String, String> annotationsWith2Servers =\n        new Annotations.Serializer().server(\"s1\", serverConfig).annotations();\n\n    ConfigMap gatewayRouteConfigMap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(\"route\")\n            .withAnnotations(annotationsWith2Servers)\n            .endMetadata()\n            .build();\n    when(env.getConfigMaps()).thenReturn(Collections.singletonMap(\"route\", gatewayRouteConfigMap));\n    Map<String, String> expectedData =\n        Collections.singletonMap(\"data.yml\", \"this is for sure generated configuration\");\n    when(gatewayRouteConfigGenerator.generate(NAMESPACE)).thenReturn(expectedData);\n\n    // when\n    gatewayRouterProvisioner.provision(env, identity);\n\n    // then\n    verify(configGeneratorFactory).create();\n    verify(gatewayRouteConfigGenerator).addRouteConfig(\"route\", gatewayRouteConfigMap);\n    verify(gatewayRouteConfigGenerator).generate(NAMESPACE);\n\n    Map<String, ServerConfigImpl> serverConfigsAfterProvisioning =\n        new Annotations.Deserializer(gatewayRouteConfigMap.getMetadata().getAnnotations())\n            .servers();\n    assertEquals(serverConfigsAfterProvisioning.size(), 1);\n    ServerConfigImpl server =\n        serverConfigsAfterProvisioning.get(\n            serverConfigsAfterProvisioning.keySet().iterator().next());\n\n    // verify that provisioner removes the internal attributes\n    assertFalse(server.getAttributes().containsKey(SERVICE_NAME_ATTRIBUTE));\n    assertFalse(server.getAttributes().containsKey(SERVICE_PORT_ATTRIBUTE));\n\n    // verify that provisioner included the data info configmap\n    Map<String, String> actualData = gatewayRouteConfigMap.getData();\n    assertEquals(actualData, expectedData);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/GatewayTlsProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.WorkspaceExposureType;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.GatewayConfigmapLabels;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GatewayTlsProvisionerTest {\n\n  public static final String WORKSPACE_ID = \"workspace123\";\n  @Mock private KubernetesEnvironment k8sEnv;\n  @Mock private RuntimeIdentity runtimeIdentity;\n  @Mock private GatewayConfigmapLabels gatewayConfigmapLabels;\n  @Mock private TlsProvisionerProvider<KubernetesEnvironment> tlsProvisionerProvider;\n  @Mock private TlsProvisioner<KubernetesEnvironment> nativeTlsProvisioner;\n\n  private final ServerConfigImpl httpServer =\n      new ServerConfigImpl(\"8080/tpc\", \"http\", \"/api\", emptyMap());\n  private final ServerConfigImpl wsServer =\n      new ServerConfigImpl(\"8080/tpc\", \"ws\", \"/ws\", emptyMap());\n  private final Map<String, String> annotations =\n      singletonMap(\"annotation-key\", \"annotation-value\");\n  private final String machine = \"machine\";\n\n  @BeforeMethod\n  public void setUp() {\n    lenient().when(gatewayConfigmapLabels.isGatewayConfig(any(ConfigMap.class))).thenReturn(true);\n    when(tlsProvisionerProvider.get(eq(WorkspaceExposureType.NATIVE)))\n        .thenReturn(nativeTlsProvisioner);\n  }\n\n  @Test(dataProvider = \"tlsProvisionData\")\n  public void provisionTlsForGatewayRouteConfigmaps(\n      ServerConfigImpl server, boolean tlsEnabled, String expectedProtocol) throws Exception {\n    // given\n    Map<String, String> composedAnnotations = new HashMap<>(annotations);\n    composedAnnotations.putAll(\n        Annotations.newSerializer().server(\"server\", server).machineName(machine).annotations());\n    ConfigMap routeConfigMap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(\"route\")\n            .withAnnotations(composedAnnotations)\n            .endMetadata()\n            .build();\n\n    GatewayTlsProvisioner<KubernetesEnvironment> gatewayTlsProvisioner =\n        new GatewayTlsProvisioner<>(tlsEnabled, gatewayConfigmapLabels, tlsProvisionerProvider);\n\n    lenient().when(k8sEnv.getConfigMaps()).thenReturn(singletonMap(\"route\", routeConfigMap));\n\n    // when\n    gatewayTlsProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    // then\n    Map<String, ServerConfigImpl> servers =\n        Annotations.newDeserializer(routeConfigMap.getMetadata().getAnnotations()).servers();\n    assertEquals(servers.get(\"server\").getProtocol(), expectedProtocol);\n  }\n\n  @DataProvider\n  public Object[][] tlsProvisionData() {\n    return new Object[][] {\n      {httpServer, true, \"https\"},\n      {httpServer, false, \"http\"},\n      {wsServer, true, \"wss\"},\n      {wsServer, false, \"ws\"},\n    };\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void throwExceptionWhenMultipleServersInGatewayRouteConfigAnnotations()\n      throws InfrastructureException {\n    // given\n    Map<String, String> composedAnnotations = new HashMap<>(annotations);\n    composedAnnotations.putAll(\n        Annotations.newSerializer()\n            .server(\"server1\", httpServer)\n            .server(\"server2\", wsServer)\n            .machineName(machine)\n            .annotations());\n    ConfigMap routeConfigMap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(\"route\")\n            .withAnnotations(composedAnnotations)\n            .endMetadata()\n            .build();\n\n    when(k8sEnv.getConfigMaps()).thenReturn(singletonMap(\"route\", routeConfigMap));\n    GatewayTlsProvisioner<KubernetesEnvironment> gatewayTlsProvisioner =\n        new GatewayTlsProvisioner<>(true, gatewayConfigmapLabels, tlsProvisionerProvider);\n\n    // when\n    gatewayTlsProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    // then exception\n  }\n\n  @Test\n  public void nativeRoutesProvisioned() throws Exception {\n    // given\n    GatewayTlsProvisioner<KubernetesEnvironment> gatewayTlsProvisioner =\n        new GatewayTlsProvisioner<>(true, gatewayConfigmapLabels, tlsProvisionerProvider);\n\n    // when\n    gatewayTlsProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    // then\n    verify(nativeTlsProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/GitConfigProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static java.lang.String.format;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.user.server.PreferenceManager;\nimport org.eclipse.che.api.user.server.UserManager;\nimport org.eclipse.che.api.workspace.server.model.impl.WarningImpl;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Warnings;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GitConfigProvisionerTest {\n\n  private KubernetesEnvironment k8sEnv;\n\n  @Mock private RuntimeIdentity runtimeIdentity;\n\n  @Mock private Pod pod;\n\n  @Mock private PodSpec podSpec;\n\n  @Mock private Container container;\n\n  @Mock private PreferenceManager preferenceManager;\n\n  @Mock private UserManager userManager;\n\n  @Mock private VcsSslCertificateProvisioner vcsSslCertificateProvisioner;\n\n  private GitConfigProvisioner gitConfigProvisioner;\n\n  @BeforeMethod\n  public void setup() {\n    k8sEnv = KubernetesEnvironment.builder().build();\n    ObjectMeta podMeta = new ObjectMetaBuilder().withName(\"wksp\").build();\n    when(pod.getMetadata()).thenReturn(podMeta);\n    when(pod.getSpec()).thenReturn(podSpec);\n    k8sEnv.addPod(pod);\n    gitConfigProvisioner =\n        new GitConfigProvisioner(preferenceManager, userManager, vcsSslCertificateProvisioner);\n\n    Subject subject = new SubjectImpl(null, Collections.emptyList(), \"id\", null, false);\n    EnvironmentContext environmentContext = new EnvironmentContext();\n    environmentContext.setSubject(subject);\n    EnvironmentContext.setCurrent(environmentContext);\n  }\n\n  @Test\n  public void testShouldDoNothingWhenGitPreferencesAndUserManagerAreEmpty() throws Exception {\n    Map<String, String> preferences = singletonMap(\"theia-user-preferences\", \"{}\");\n    when(preferenceManager.find(eq(\"id\"), eq(\"theia-user-preferences\"))).thenReturn(preferences);\n\n    User user = mock(User.class);\n    when(userManager.getById(eq(\"id\"))).thenReturn(user);\n    when(user.getName()).thenReturn(null);\n    when(user.getEmail()).thenReturn(null);\n\n    gitConfigProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    verifyNoMoreInteractions(runtimeIdentity);\n  }\n\n  @Test\n  public void testShouldExpectWarningWhenPreferenceManagerThrowsServerException() throws Exception {\n    when(preferenceManager.find(eq(\"id\"), eq(\"theia-user-preferences\")))\n        .thenThrow(new ServerException(\"message\"));\n\n    gitConfigProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    verifyNoMoreInteractions(runtimeIdentity);\n\n    List<Warning> warnings = k8sEnv.getWarnings();\n\n    assertEquals(warnings.size(), 1);\n\n    Warning actualWarning = warnings.get(0);\n    String warnMsg =\n        format(Warnings.EXCEPTION_IN_USER_MANAGEMENT_DURING_GIT_PROVISION_MESSAGE_FMT, \"message\");\n    Warning expectedWarning =\n        new WarningImpl(\n            Warnings.EXCEPTION_IN_USER_MANAGEMENT_DURING_GIT_PROVISION_WARNING_CODE, warnMsg);\n\n    assertEquals(expectedWarning, actualWarning);\n  }\n\n  @Test\n  public void testShouldExpectWarningWhenJsonObjectInPreferencesIsNotValid() throws Exception {\n    Map<String, String> preferences = singletonMap(\"theia-user-preferences\", \"{#$%}\");\n    when(preferenceManager.find(eq(\"id\"), eq(\"theia-user-preferences\"))).thenReturn(preferences);\n\n    gitConfigProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    verifyNoMoreInteractions(runtimeIdentity);\n\n    List<Warning> warnings = k8sEnv.getWarnings();\n\n    assertEquals(warnings.size(), 1);\n\n    Warning actualWarning = warnings.get(0);\n    String warnMsg =\n        format(\n            Warnings.JSON_IS_NOT_A_VALID_REPRESENTATION_FOR_AN_OBJECT_OF_TYPE_MESSAGE_FMT,\n            \"java.io.EOFException: End of input at line 1 column 6 path $.\");\n    Warning expectedWarning =\n        new WarningImpl(\n            Warnings.JSON_IS_NOT_A_VALID_REPRESENTATION_FOR_AN_OBJECT_OF_TYPE_WARNING_CODE,\n            warnMsg);\n\n    assertEquals(expectedWarning, actualWarning);\n  }\n\n  @Test\n  public void testShouldExpectWarningWhenUserManagerThrowsServerException() throws Exception {\n    when(userManager.getById(eq(\"id\"))).thenThrow(new ServerException(\"message\"));\n\n    gitConfigProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    verifyNoMoreInteractions(runtimeIdentity);\n\n    List<Warning> warnings = k8sEnv.getWarnings();\n\n    assertEquals(warnings.size(), 1);\n\n    Warning actualWarning = warnings.get(0);\n    String warnMsg =\n        format(Warnings.EXCEPTION_IN_USER_MANAGEMENT_DURING_GIT_PROVISION_MESSAGE_FMT, \"message\");\n    Warning expectedWarning =\n        new WarningImpl(\n            Warnings.EXCEPTION_IN_USER_MANAGEMENT_DURING_GIT_PROVISION_WARNING_CODE, warnMsg);\n\n    assertEquals(expectedWarning, actualWarning);\n  }\n\n  @Test\n  public void testShouldCheckIfPodHasMountAndK8HasConfigMapForGitConfig() throws Exception {\n    String json = \"{\\\"git.user.name\\\":\\\"user\\\",\\\"git.user.email\\\":\\\"email\\\"}\";\n    Map<String, String> preferences = singletonMap(\"theia-user-preferences\", json);\n    when(preferenceManager.find(eq(\"id\"), eq(\"theia-user-preferences\"))).thenReturn(preferences);\n\n    ObjectMeta podMeta = new ObjectMetaBuilder().withName(\"wksp\").build();\n    when(pod.getMetadata()).thenReturn(podMeta);\n    when(pod.getSpec()).thenReturn(podSpec);\n    when(podSpec.getContainers()).thenReturn(singletonList(container));\n\n    List<VolumeMount> volumeMounts = new ArrayList<>();\n\n    when(container.getVolumeMounts()).thenReturn(volumeMounts);\n    k8sEnv.addPod(pod);\n\n    gitConfigProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    assertEquals(volumeMounts.size(), 1);\n\n    VolumeMount mount = volumeMounts.get(0);\n\n    assertEquals(mount.getMountPath(), \"/etc/gitconfig\");\n    assertEquals(mount.getName(), \"gitconfigvolume\");\n    assertFalse(mount.getReadOnly());\n    assertEquals(mount.getSubPath(), \"gitconfig\");\n\n    assertEquals(k8sEnv.getConfigMaps().size(), 1);\n    assertTrue(k8sEnv.getConfigMaps().containsKey(\"gitconfig\"));\n\n    ConfigMap configMap = k8sEnv.getConfigMaps().get(\"gitconfig\");\n\n    assertEquals(configMap.getData().size(), 1);\n    assertTrue(configMap.getData().containsKey(\"gitconfig\"));\n\n    String gitconfig = configMap.getData().get(\"gitconfig\");\n    String expectedGitconfig = \"[user]\\n\\tname = user\\n\\temail = email\\n\";\n\n    assertEquals(gitconfig, expectedGitconfig);\n  }\n\n  @DataProvider(name = \"invalidEmailValues\")\n  public Object[][] invalidEmailValues() {\n    return new Object[][] {\n      {\"{\\\"git.user.name\\\":\\\"user\\\",\\\"git.user.email\\\":{}}\"},\n      {\"{\\\"git.user.name\\\":\\\"user\\\",\\\"git.user.email\\\":true}\"},\n      {\"{\\\"git.user.name\\\":\\\"user\\\",\\\"git.user.email\\\":1}\"},\n      {\"{\\\"git.user.name\\\":\\\"user\\\",\\\"git.user.email\\\":[]}\"},\n      {\"{\\\"git.user.name\\\":\\\"user\\\",\\\"git.user.email\\\":null}\"}\n    };\n  }\n\n  @Test(dataProvider = \"invalidEmailValues\")\n  public void testShouldParseOnlyNameWhenEmailIsNotAString(String json) throws Exception {\n    Map<String, String> preferences = singletonMap(\"theia-user-preferences\", json);\n    when(preferenceManager.find(eq(\"id\"), eq(\"theia-user-preferences\"))).thenReturn(preferences);\n\n    ObjectMeta podMeta = new ObjectMetaBuilder().withName(\"wksp\").build();\n    when(pod.getMetadata()).thenReturn(podMeta);\n    when(pod.getSpec()).thenReturn(podSpec);\n    when(podSpec.getContainers()).thenReturn(singletonList(container));\n\n    List<VolumeMount> volumeMounts = new ArrayList<>();\n\n    when(container.getVolumeMounts()).thenReturn(volumeMounts);\n    k8sEnv.addPod(pod);\n\n    gitConfigProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    assertEquals(volumeMounts.size(), 1);\n\n    VolumeMount mount = volumeMounts.get(0);\n\n    assertEquals(mount.getMountPath(), \"/etc/gitconfig\");\n    assertEquals(mount.getName(), \"gitconfigvolume\");\n    assertFalse(mount.getReadOnly());\n    assertEquals(mount.getSubPath(), \"gitconfig\");\n\n    assertEquals(k8sEnv.getConfigMaps().size(), 1);\n    assertTrue(k8sEnv.getConfigMaps().containsKey(\"gitconfig\"));\n\n    ConfigMap configMap = k8sEnv.getConfigMaps().get(\"gitconfig\");\n\n    assertEquals(configMap.getData().size(), 1);\n    assertTrue(configMap.getData().containsKey(\"gitconfig\"));\n\n    String gitconfig = configMap.getData().get(\"gitconfig\");\n    String expectedGitconfig = \"[user]\\n\\tname = user\\n\";\n\n    assertEquals(gitconfig, expectedGitconfig);\n  }\n\n  @DataProvider(name = \"invalidNameValues\")\n  public Object[][] invalidNameValues() {\n    return new Object[][] {\n      {\"{\\\"git.user.name\\\":{},\\\"git.user.email\\\":\\\"email\\\"}\"},\n      {\"{\\\"git.user.name\\\":true,\\\"git.user.email\\\":\\\"email\\\"}\"},\n      {\"{\\\"git.user.name\\\":1,\\\"git.user.email\\\":\\\"email\\\"}\"},\n      {\"{\\\"git.user.name\\\":[],\\\"git.user.email\\\":\\\"email\\\"}\"},\n      {\"{\\\"git.user.name\\\":null,\\\"git.user.email\\\":\\\"email\\\"}\"}\n    };\n  }\n\n  @Test(dataProvider = \"invalidNameValues\")\n  public void testShouldParseOnlyEmailWhenNameIsNotAString(String json) throws Exception {\n    Map<String, String> preferences = singletonMap(\"theia-user-preferences\", json);\n    when(preferenceManager.find(eq(\"id\"), eq(\"theia-user-preferences\"))).thenReturn(preferences);\n\n    ObjectMeta podMeta = new ObjectMetaBuilder().withName(\"wksp\").build();\n    when(pod.getMetadata()).thenReturn(podMeta);\n    when(pod.getSpec()).thenReturn(podSpec);\n    when(podSpec.getContainers()).thenReturn(singletonList(container));\n\n    List<VolumeMount> volumeMounts = new ArrayList<>();\n\n    when(container.getVolumeMounts()).thenReturn(volumeMounts);\n    k8sEnv.addPod(pod);\n\n    gitConfigProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    assertEquals(volumeMounts.size(), 1);\n\n    VolumeMount mount = volumeMounts.get(0);\n\n    assertEquals(mount.getMountPath(), \"/etc/gitconfig\");\n    assertEquals(mount.getName(), \"gitconfigvolume\");\n    assertFalse(mount.getReadOnly());\n    assertEquals(mount.getSubPath(), \"gitconfig\");\n\n    assertEquals(k8sEnv.getConfigMaps().size(), 1);\n    assertTrue(k8sEnv.getConfigMaps().containsKey(\"gitconfig\"));\n\n    ConfigMap configMap = k8sEnv.getConfigMaps().get(\"gitconfig\");\n\n    assertEquals(configMap.getData().size(), 1);\n    assertTrue(configMap.getData().containsKey(\"gitconfig\"));\n\n    String gitconfig = configMap.getData().get(\"gitconfig\");\n    String expectedGitconfig = \"[user]\\n\\temail = email\\n\";\n\n    assertEquals(gitconfig, expectedGitconfig);\n  }\n\n  @Test\n  public void\n      testShouldCheckIfPodHasMountAndK8HasConfigMapForGitConfigForDifferentTypeOfPreference()\n          throws Exception {\n    String json =\n        \"{\\\"chePlugins.repositories\\\":{\\\"Plugins\\\":\\\"http://url/\\\",\\\"my\\\":\\\"https://url/plugins.json\\\"}, \\\"git.user.name\\\":\\\"user\\\",\\\"git.user.email\\\":\\\"email\\\"}\";\n    Map<String, String> preferences = singletonMap(\"theia-user-preferences\", json);\n    when(preferenceManager.find(eq(\"id\"), eq(\"theia-user-preferences\"))).thenReturn(preferences);\n\n    ObjectMeta podMeta = new ObjectMetaBuilder().withName(\"wksp\").build();\n    when(pod.getMetadata()).thenReturn(podMeta);\n    when(pod.getSpec()).thenReturn(podSpec);\n    when(podSpec.getContainers()).thenReturn(singletonList(container));\n\n    List<VolumeMount> volumeMounts = new ArrayList<>();\n\n    when(container.getVolumeMounts()).thenReturn(volumeMounts);\n    k8sEnv.addPod(pod);\n\n    gitConfigProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    assertEquals(volumeMounts.size(), 1);\n\n    VolumeMount mount = volumeMounts.get(0);\n\n    assertEquals(mount.getMountPath(), \"/etc/gitconfig\");\n    assertEquals(mount.getName(), \"gitconfigvolume\");\n    assertFalse(mount.getReadOnly());\n    assertEquals(mount.getSubPath(), \"gitconfig\");\n\n    assertEquals(k8sEnv.getConfigMaps().size(), 1);\n    assertTrue(k8sEnv.getConfigMaps().containsKey(\"gitconfig\"));\n\n    ConfigMap configMap = k8sEnv.getConfigMaps().get(\"gitconfig\");\n\n    assertEquals(configMap.getData().size(), 1);\n    assertTrue(configMap.getData().containsKey(\"gitconfig\"));\n\n    String gitconfig = configMap.getData().get(\"gitconfig\");\n    String expectedGitconfig = \"[user]\\n\\tname = user\\n\\temail = email\\n\";\n\n    assertEquals(gitconfig, expectedGitconfig);\n  }\n\n  @Test\n  public void testShouldProvisionNameAndEmailFromUserManagerWhenUserPreferencesEmpty()\n      throws Exception {\n    String json = \"{}\";\n    Map<String, String> preferences = singletonMap(\"theia-user-preferences\", json);\n    when(preferenceManager.find(eq(\"id\"), eq(\"theia-user-preferences\"))).thenReturn(preferences);\n\n    ObjectMeta podMeta = new ObjectMetaBuilder().withName(\"wksp\").build();\n    when(pod.getMetadata()).thenReturn(podMeta);\n    when(pod.getSpec()).thenReturn(podSpec);\n    when(podSpec.getContainers()).thenReturn(singletonList(container));\n\n    User userMock = mock(User.class);\n    when(userMock.getName()).thenReturn(\"userMockName\");\n    when(userMock.getEmail()).thenReturn(\"userMockEmail\");\n    when(userManager.getById(eq(\"id\"))).thenReturn(userMock);\n\n    List<VolumeMount> volumeMounts = new ArrayList<>();\n\n    when(container.getVolumeMounts()).thenReturn(volumeMounts);\n    k8sEnv.addPod(pod);\n\n    gitConfigProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    assertEquals(volumeMounts.size(), 1);\n\n    VolumeMount mount = volumeMounts.get(0);\n\n    assertEquals(mount.getMountPath(), \"/etc/gitconfig\");\n    assertEquals(mount.getName(), \"gitconfigvolume\");\n    assertFalse(mount.getReadOnly());\n    assertEquals(mount.getSubPath(), \"gitconfig\");\n\n    assertEquals(k8sEnv.getConfigMaps().size(), 1);\n    assertTrue(k8sEnv.getConfigMaps().containsKey(\"gitconfig\"));\n\n    ConfigMap configMap = k8sEnv.getConfigMaps().get(\"gitconfig\");\n\n    assertEquals(configMap.getData().size(), 1);\n    assertTrue(configMap.getData().containsKey(\"gitconfig\"));\n\n    String gitconfig = configMap.getData().get(\"gitconfig\");\n    String expectedGitconfig = \"[user]\\n\\tname = userMockName\\n\\temail = userMockEmail\\n\";\n\n    assertEquals(gitconfig, expectedGitconfig);\n  }\n\n  @Test\n  public void testShouldProvisionConfigForHttpsServer() throws Exception {\n    when(vcsSslCertificateProvisioner.isConfigured()).thenReturn(true);\n    when(vcsSslCertificateProvisioner.getGitServerHost()).thenReturn(\"https://localhost\");\n    when(vcsSslCertificateProvisioner.getCertPath()).thenReturn(\"/some/path\");\n\n    ObjectMeta podMeta = new ObjectMetaBuilder().withName(\"wksp\").build();\n    when(pod.getMetadata()).thenReturn(podMeta);\n    when(pod.getSpec()).thenReturn(podSpec);\n    when(podSpec.getContainers()).thenReturn(singletonList(container));\n\n    User userMock = mock(User.class);\n    when(userMock.getName()).thenReturn(\"userMockName\");\n    when(userMock.getEmail()).thenReturn(\"userMockEmail\");\n    when(userManager.getById(eq(\"id\"))).thenReturn(userMock);\n\n    List<VolumeMount> volumeMounts = new ArrayList<>();\n\n    when(container.getVolumeMounts()).thenReturn(volumeMounts);\n    k8sEnv.addPod(pod);\n\n    gitConfigProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    assertEquals(volumeMounts.size(), 1);\n\n    VolumeMount mount = volumeMounts.get(0);\n\n    assertEquals(mount.getMountPath(), \"/etc/gitconfig\");\n    assertEquals(mount.getName(), \"gitconfigvolume\");\n    assertFalse(mount.getReadOnly());\n    assertEquals(mount.getSubPath(), \"gitconfig\");\n\n    assertEquals(k8sEnv.getConfigMaps().size(), 1);\n    assertTrue(k8sEnv.getConfigMaps().containsKey(\"gitconfig\"));\n\n    ConfigMap configMap = k8sEnv.getConfigMaps().get(\"gitconfig\");\n\n    assertEquals(configMap.getData().size(), 1);\n    assertTrue(configMap.getData().containsKey(\"gitconfig\"));\n\n    String gitconfig = configMap.getData().get(\"gitconfig\");\n    String expectedGitconfig =\n        \"[user]\\n\\tname = userMockName\\n\\temail = userMockEmail\\n[http \\\"https://localhost\\\"]\\n\\tsslCAInfo = /some/path\";\n\n    assertEquals(gitconfig, expectedGitconfig);\n  }\n\n  @Test\n  public void shouldNotProvisionVolumeButShouldMountInInjectablePods() throws Exception {\n    // given\n    Map<String, String> preferences =\n        singletonMap(\n            \"theia-user-preferences\", \"{\\\"git.user.name\\\":\\\"user\\\",\\\"git.user.email\\\":\\\"email\\\"}\");\n    when(preferenceManager.find(eq(\"id\"), eq(\"theia-user-preferences\"))).thenReturn(preferences);\n\n    Pod pod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"wkspc\")\n            .and()\n            .withNewSpec()\n            .withContainers(new ContainerBuilder().withImage(\"image\").build())\n            .and()\n            .build();\n\n    // we want to replace everything in the env that the setup() put there, so let's just re-init.\n    k8sEnv = KubernetesEnvironment.builder().build();\n    k8sEnv.addPod(pod);\n\n    Pod injectedPod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"injected\")\n            .and()\n            .withNewSpec()\n            .withContainers(new ContainerBuilder().withImage(\"image\").build())\n            .and()\n            .build();\n\n    k8sEnv.addInjectablePod(\"r\", \"i\", injectedPod);\n\n    // when\n    gitConfigProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    // then\n    assertEquals(pod.getSpec().getVolumes().size(), 1);\n    assertEquals(injectedPod.getSpec().getVolumes().size(), 0);\n\n    Container podContainer = pod.getSpec().getContainers().get(0);\n    Container injectedPodContainer = injectedPod.getSpec().getContainers().get(0);\n\n    assertEquals(podContainer.getVolumeMounts().size(), 1);\n    assertEquals(injectedPodContainer.getVolumeMounts().size(), 1);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/ImagePullSecretProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.ImagePullSecretProvisioner.SECRET_NAME_SUFFIX;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\nimport com.google.gson.Gson;\nimport io.fabric8.kubernetes.api.model.LocalObjectReference;\nimport io.fabric8.kubernetes.api.model.LocalObjectReferenceBuilder;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport java.util.Base64;\nimport java.util.Collections;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto.DockerAuthConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.dto.DockerAuthConfigs;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.docker.auth.UserSpecificDockerRegistryCredentialsProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link ImagePullSecretProvisioner}.\n *\n * @author David Festal\n */\n@Listeners(MockitoTestNGListener.class)\npublic class ImagePullSecretProvisionerTest {\n\n  private static final String WORKSPACE_ID = \"workspace123\";\n\n  private KubernetesEnvironment k8sEnv;\n  @Mock private RuntimeIdentity runtimeIdentity;\n\n  @Mock private UserSpecificDockerRegistryCredentialsProvider credentialsProvider;\n\n  @Mock private DockerAuthConfigs dockerAuthConfigs;\n\n  @Mock private Pod pod;\n\n  @Mock private PodSpec podSpec;\n\n  private LocalObjectReference existingImagePullSecretRef =\n      new LocalObjectReferenceBuilder().withName(\"existing\").build();\n\n  private LocalObjectReference newImagePullSecretRef =\n      new LocalObjectReferenceBuilder().withName(WORKSPACE_ID + SECRET_NAME_SUFFIX).build();\n\n  private ImagePullSecretProvisioner imagePullSecretProvisioner;\n\n  @BeforeMethod\n  public void setup() {\n    lenient().when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n\n    k8sEnv = KubernetesEnvironment.builder().build();\n    ObjectMeta podMeta = new ObjectMetaBuilder().withName(\"wksp\").build();\n    when(pod.getMetadata()).thenReturn(podMeta);\n    lenient().when(pod.getSpec()).thenReturn(podSpec);\n    lenient()\n        .when(podSpec.getImagePullSecrets())\n        .thenReturn(ImmutableList.of(existingImagePullSecretRef));\n    k8sEnv.addPod(pod);\n\n    when(credentialsProvider.getCredentials()).thenReturn(dockerAuthConfigs);\n    imagePullSecretProvisioner = new ImagePullSecretProvisioner(credentialsProvider);\n  }\n\n  @Test\n  public void doNotDoAnythingIfNoPrivateRegistries() throws Exception {\n    when(dockerAuthConfigs.getConfigs()).thenReturn(Collections.emptyMap());\n\n    imagePullSecretProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    assertTrue(k8sEnv.getSecrets().isEmpty());\n    verifyNoMoreInteractions(podSpec);\n  }\n\n  @Test\n  public void addSecretAndReferenceInPod() throws Exception {\n    when(dockerAuthConfigs.getConfigs())\n        .thenReturn(\n            ImmutableMap.of(\n                \"reg1\",\n                new TestDockerAuthConfig().withUsername(\"username1\").withPassword(\"password1\"),\n                \"reg2\",\n                new TestDockerAuthConfig().withUsername(\"username2\").withPassword(\"password2\")));\n\n    imagePullSecretProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    verify(podSpec)\n        .setImagePullSecrets(ImmutableList.of(newImagePullSecretRef, existingImagePullSecretRef));\n\n    Secret secret = k8sEnv.getSecrets().get(WORKSPACE_ID + SECRET_NAME_SUFFIX);\n    assertNotNull(secret);\n    assertEquals(secret.getType(), \"kubernetes.io/dockercfg\");\n\n    String dockerCfgData = secret.getData().get(\".dockercfg\");\n    assertNotNull(dockerCfgData);\n\n    Gson gson = new Gson();\n    assertEquals(\n        gson.toJson(\n            gson.fromJson(new String(Base64.getDecoder().decode(dockerCfgData)), Map.class)),\n        gson.toJson(\n            gson.fromJson(\n                \"\"\n                    + \"{ \\\"https://reg1\\\": { \\\"username\\\": \\\"username1\\\", \\\"password\\\": \\\"password1\\\", \\\"email\\\": \\\"email@email\\\", \\\"auth\\\": \\\"\"\n                    + buildAuth(\"username1\", \"password1\")\n                    + \"\\\" }\"\n                    + \", \\\"https://reg2\\\": { \\\"username\\\": \\\"username2\\\", \\\"password\\\": \\\"password2\\\", \\\"email\\\": \\\"email@email\\\", \\\"auth\\\": \\\"\"\n                    + buildAuth(\"username2\", \"password2\")\n                    + \"\\\" }\"\n                    + \"}\",\n                Map.class)));\n  }\n\n  private static class TestDockerAuthConfig implements DockerAuthConfig {\n\n    private String username;\n    private String password;\n\n    @Override\n    public String getUsername() {\n      return username;\n    }\n\n    @Override\n    public void setUsername(String username) {\n      this.username = username;\n    }\n\n    @Override\n    public DockerAuthConfig withUsername(String username) {\n      setUsername(username);\n      return this;\n    }\n\n    @Override\n    public String getPassword() {\n      return password;\n    }\n\n    @Override\n    public void setPassword(String password) {\n      this.password = password;\n    }\n\n    @Override\n    public DockerAuthConfig withPassword(String password) {\n      setPassword(password);\n      return this;\n    }\n  }\n\n  private String buildAuth(String username, String password) {\n    return Base64.getEncoder().encodeToString((username + ':' + password).getBytes());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/IngressTlsProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.IngressTlsProvisioner.TLS_SECRET_TYPE;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertNull;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.inject.ConfigurationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerIngressBuilder;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link IngressTlsProvisioner}.\n *\n * @author Ilya Buziuk\n * @author Sergii Leshchenko\n * @author Guy Daich\n */\n@Listeners(MockitoTestNGListener.class)\npublic class IngressTlsProvisionerTest {\n\n  public static final String WORKSPACE_ID = \"workspace123\";\n  @Mock private KubernetesEnvironment k8sEnv;\n  @Mock private RuntimeIdentity runtimeIdentity;\n\n  private final ServerConfigImpl httpServer =\n      new ServerConfigImpl(\"8080/tpc\", \"http\", \"/api\", emptyMap());\n  private final ServerConfigImpl wsServer =\n      new ServerConfigImpl(\"8080/tpc\", \"ws\", \"/ws\", emptyMap());\n  private final Map<String, ServerConfig> servers =\n      ImmutableMap.of(\"http-server\", httpServer, \"ws-server\", wsServer);\n  private final Map<String, String> annotations =\n      singletonMap(\"annotation-key\", \"annotation-value\");\n  private final String machine = \"machine\";\n  private final String name = \"IngressName\";\n  private final String serviceName = \"ServiceName\";\n  private final String servicePortName = \"server-port\";\n  private final Integer servicePort = 7777;\n  private final String host = \"server-host\";\n\n  private final ExternalServerIngressBuilder externalServerIngressBuilder =\n      new ExternalServerIngressBuilder();\n  private final Ingress ingress =\n      externalServerIngressBuilder\n          .withHost(host)\n          .withAnnotations(annotations)\n          .withMachineName(machine)\n          .withName(name)\n          .withServers(servers)\n          .withServiceName(serviceName)\n          .withServicePortName(servicePortName)\n          .withServicePort(servicePort)\n          .build();\n\n  @BeforeMethod\n  public void setUp() {\n    lenient().when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n  }\n\n  @Test\n  public void doNothingWhenTlsDisabled() throws Exception {\n    // given\n    IngressTlsProvisioner ingressTlsProvisioner = new IngressTlsProvisioner(false, \"\", \"\", \"\");\n\n    // when\n    ingressTlsProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    // then\n    verify(k8sEnv, never()).getIngresses();\n  }\n\n  @Test\n  public void provisionTlsForIngressesWhenTlsEnabledAndSecretProvided() throws Exception {\n    // given\n    IngressTlsProvisioner ingressTlsProvisioner =\n        new IngressTlsProvisioner(true, \"secretname\", \"\", \"\");\n\n    Map<String, Ingress> ingresses = new HashMap<>();\n    ingresses.put(\"ingress\", ingress);\n    when(k8sEnv.getIngresses()).thenReturn(ingresses);\n\n    // when\n    ingressTlsProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    // then\n    assertEquals(ingress.getSpec().getTls().size(), 1);\n    assertEquals(ingress.getSpec().getTls().get(0).getHosts().size(), 1);\n    assertEquals(ingress.getSpec().getTls().get(0).getHosts().get(0), host);\n    assertEquals(ingress.getSpec().getTls().get(0).getSecretName(), \"secretname\");\n\n    verifyServersTLS(ingress.getMetadata().getAnnotations());\n  }\n\n  @Test\n  public void provisionTlsForIngressesWhenTlsEnabledAndSecretEmpty() throws Exception {\n    // given\n    IngressTlsProvisioner ingressTlsProvisioner = new IngressTlsProvisioner(true, \"\", \"\", \"\");\n\n    Map<String, Ingress> ingresses = new HashMap<>();\n    ingresses.put(\"ingress\", ingress);\n    when(k8sEnv.getIngresses()).thenReturn(ingresses);\n\n    // when\n    ingressTlsProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    // then\n    assertEquals(ingress.getSpec().getTls().size(), 1);\n    assertEquals(ingress.getSpec().getTls().get(0).getHosts().size(), 1);\n    assertEquals(ingress.getSpec().getTls().get(0).getHosts().get(0), host);\n    assertNull(ingress.getSpec().getTls().get(0).getSecretName());\n\n    verifyServersTLS(ingress.getMetadata().getAnnotations());\n  }\n\n  @Test\n  public void provisionTlsForIngressesWhenTlsEnabledAndSecretNull() throws Exception {\n    // given\n    IngressTlsProvisioner ingressTlsProvisioner = new IngressTlsProvisioner(true, null, \"\", \"\");\n\n    Map<String, Ingress> ingresses = new HashMap<>();\n    ingresses.put(\"ingress\", ingress);\n    when(k8sEnv.getIngresses()).thenReturn(ingresses);\n\n    // when\n    ingressTlsProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    // then\n    assertEquals(ingress.getSpec().getTls().size(), 1);\n    assertEquals(ingress.getSpec().getTls().get(0).getHosts().size(), 1);\n    assertEquals(ingress.getSpec().getTls().get(0).getHosts().get(0), host);\n    assertEquals(ingress.getSpec().getTls().get(0).getSecretName(), null);\n\n    verifyServersTLS(ingress.getMetadata().getAnnotations());\n  }\n\n  @Test\n  public void provisionTlsSecretWhenTlsCertAndKeyAreSpecified() throws Exception {\n    // given\n    IngressTlsProvisioner ingressTlsProvisioner =\n        new IngressTlsProvisioner(true, \"ws-tls-secret\", \"cert\", \"key\");\n\n    Map<String, Secret> secrets = new HashMap<>();\n    when(k8sEnv.getSecrets()).thenReturn(secrets);\n\n    // when\n    ingressTlsProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    // then\n    assertEquals(k8sEnv.getSecrets().size(), 1);\n    Secret tlsSecret = k8sEnv.getSecrets().get(runtimeIdentity.getWorkspaceId() + \"-ws-tls-secret\");\n    assertNotNull(tlsSecret);\n    assertEquals(tlsSecret.getStringData().get(\"tls.crt\"), \"cert\");\n    assertEquals(tlsSecret.getStringData().get(\"tls.key\"), \"key\");\n\n    assertEquals(tlsSecret.getType(), TLS_SECRET_TYPE);\n    verifyServersTLS(ingress.getMetadata().getAnnotations());\n  }\n\n  @Test(\n      expectedExceptions = ConfigurationException.class,\n      expectedExceptionsMessageRegExp =\n          \"None or both of `che.infra.kubernetes.tls_cert` and \"\n              + \"`che.infra.kubernetes.tls_key` must be configured with non-null value\\\\.\")\n  public void shouldThrowAnExceptionIfOnlyOneIfTlsCertOrKeyIsConfigured() {\n    // given\n    new IngressTlsProvisioner(true, \"secret\", \"test\", \"\");\n  }\n\n  private void verifyServersTLS(Map<String, String> annotations) {\n    Map<String, ServerConfigImpl> servers = Annotations.newDeserializer(annotations).servers();\n    assertEquals(servers.get(\"http-server\").getProtocol(), \"https\");\n    assertEquals(servers.get(\"ws-server\").getProtocol(), \"wss\");\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/KubernetesPreviewUrlCommandProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServiceSpec;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressPath;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressRuleValue;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressRule;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressServiceBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressSpec;\nimport io.fabric8.kubernetes.api.model.networking.v1.ServiceBackendPort;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.PreviewUrlImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Warnings;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesIngresses;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesServices;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesPreviewUrlCommandProvisionerTest {\n\n  private KubernetesPreviewUrlCommandProvisioner previewUrlCommandProvisioner;\n  @Mock private KubernetesEnvironment mockEnvironment;\n  @Mock private KubernetesNamespace mockNamespace;\n  @Mock private KubernetesServices mockServices;\n  @Mock private KubernetesIngresses mockIngresses;\n\n  @BeforeMethod\n  public void setUp() {\n    previewUrlCommandProvisioner = new KubernetesPreviewUrlCommandProvisioner();\n  }\n\n  @Test\n  public void shouldDoNothingWhenGetCommandsIsNull() throws InfrastructureException {\n    Mockito.when(mockEnvironment.getCommands()).thenReturn(null);\n\n    previewUrlCommandProvisioner.provision(mockEnvironment, mockNamespace);\n  }\n\n  @Test\n  public void shouldDoNothingWhenNoCommandsDefined() throws InfrastructureException {\n    Mockito.when(mockEnvironment.getCommands()).thenReturn(Collections.emptyList());\n    Mockito.when(mockNamespace.ingresses()).thenReturn(mockIngresses);\n    Mockito.when(mockNamespace.services()).thenReturn(mockServices);\n\n    previewUrlCommandProvisioner.provision(mockEnvironment, mockNamespace);\n  }\n\n  @Test\n  public void shouldDoNothingWhenCommandsWithoutPreviewUrlDefined() throws InfrastructureException {\n    List<CommandImpl> commands =\n        Arrays.asList(new CommandImpl(\"a\", \"a\", \"a\"), new CommandImpl(\"b\", \"b\", \"b\"));\n    KubernetesEnvironment env =\n        KubernetesEnvironment.builder().setCommands(new ArrayList<>(commands)).build();\n\n    Mockito.when(mockNamespace.ingresses()).thenReturn(mockIngresses);\n    Mockito.when(mockNamespace.services()).thenReturn(mockServices);\n\n    previewUrlCommandProvisioner.provision(env, mockNamespace);\n\n    assertTrue(commands.containsAll(env.getCommands()));\n    assertTrue(env.getCommands().containsAll(commands));\n    assertTrue(env.getWarnings().isEmpty());\n  }\n\n  @Test\n  public void shouldDoNothingWhenCantFindServiceForPreviewurl() throws InfrastructureException {\n    List<CommandImpl> commands =\n        Collections.singletonList(\n            new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(8080, null), Collections.emptyMap()));\n    KubernetesEnvironment env =\n        KubernetesEnvironment.builder().setCommands(new ArrayList<>(commands)).build();\n\n    Mockito.when(mockNamespace.ingresses()).thenReturn(mockIngresses);\n    Mockito.when(mockNamespace.services()).thenReturn(mockServices);\n    Mockito.when(mockServices.get()).thenReturn(Collections.emptyList());\n\n    previewUrlCommandProvisioner.provision(env, mockNamespace);\n\n    assertTrue(commands.containsAll(env.getCommands()));\n    assertTrue(env.getCommands().containsAll(commands));\n    assertEquals(\n        env.getWarnings().get(0).getCode(), Warnings.NOT_ABLE_TO_PROVISION_OBJECTS_FOR_PREVIEW_URL);\n  }\n\n  @Test\n  public void shouldDoNothingWhenCantFindIngressForPreviewUrl() throws InfrastructureException {\n    int port = 8080;\n    List<CommandImpl> commands =\n        Collections.singletonList(\n            new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(port, null), Collections.emptyMap()));\n    KubernetesEnvironment env =\n        KubernetesEnvironment.builder().setCommands(new ArrayList<>(commands)).build();\n\n    Mockito.when(mockNamespace.services()).thenReturn(mockServices);\n    Service service = new Service();\n    ServiceSpec spec = new ServiceSpec();\n    spec.setPorts(\n        Collections.singletonList(\n            new ServicePort(null, \"a\", null, port, \"TCP\", new IntOrString(port))));\n    service.setSpec(spec);\n    Mockito.when(mockServices.get()).thenReturn(Collections.singletonList(service));\n\n    Mockito.when(mockNamespace.ingresses()).thenReturn(mockIngresses);\n    Mockito.when(mockIngresses.get()).thenReturn(Collections.emptyList());\n\n    previewUrlCommandProvisioner.provision(env, mockNamespace);\n\n    assertTrue(commands.containsAll(env.getCommands()));\n    assertTrue(env.getCommands().containsAll(commands));\n    assertEquals(\n        env.getWarnings().get(0).getCode(), Warnings.NOT_ABLE_TO_PROVISION_OBJECTS_FOR_PREVIEW_URL);\n  }\n\n  @Test\n  public void shouldUpdateCommandWhenServiceAndIngressFound() throws InfrastructureException {\n    final int PORT = 8080;\n    final String SERVICE_PORT_NAME = \"service-\" + PORT;\n    List<CommandImpl> commands =\n        Collections.singletonList(\n            new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(PORT, null), Collections.emptyMap()));\n    KubernetesEnvironment env =\n        KubernetesEnvironment.builder().setCommands(new ArrayList<>(commands)).build();\n\n    Mockito.when(mockNamespace.services()).thenReturn(mockServices);\n    Service service = new Service();\n    ObjectMeta metadata = new ObjectMeta();\n    metadata.setName(\"servicename\");\n    service.setMetadata(metadata);\n    ServiceSpec spec = new ServiceSpec();\n    spec.setPorts(\n        Collections.singletonList(\n            new ServicePort(null, SERVICE_PORT_NAME, null, PORT, \"TCP\", new IntOrString(PORT))));\n    service.setSpec(spec);\n    Mockito.when(mockServices.get()).thenReturn(Collections.singletonList(service));\n\n    Ingress ingress = new Ingress();\n    IngressSpec ingressSpec = new IngressSpec();\n    IngressRule rule =\n        new IngressRule(\n            \"testhost\",\n            new HTTPIngressRuleValue(\n                Collections.singletonList(\n                    new HTTPIngressPath(\n                        new IngressBackend(\n                            null,\n                            new IngressServiceBackend(\n                                \"servicename\", new ServiceBackendPort(SERVICE_PORT_NAME, PORT))),\n                        null,\n                        null))));\n    ingressSpec.setRules(Collections.singletonList(rule));\n    ingress.setSpec(ingressSpec);\n    Mockito.when(mockNamespace.ingresses()).thenReturn(mockIngresses);\n    Mockito.when(mockIngresses.get()).thenReturn(Collections.singletonList(ingress));\n\n    previewUrlCommandProvisioner.provision(env, mockNamespace);\n\n    assertTrue(env.getCommands().get(0).getAttributes().containsKey(\"previewUrl\"));\n    assertEquals(env.getCommands().get(0).getAttributes().get(\"previewUrl\"), \"testhost\");\n    assertTrue(env.getWarnings().isEmpty());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/SecurityContextProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertNull;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.PodSecurityContext;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Test {@link SecurityContextProvisioner}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class SecurityContextProvisionerTest {\n\n  @Mock private RuntimeIdentity runtimeIdentity;\n\n  private KubernetesEnvironment kubernetesEnvironment;\n  private Pod pod;\n\n  private SecurityContextProvisioner securityContextProvisioner;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    pod = new PodBuilder().withNewSpec().endSpec().build();\n\n    kubernetesEnvironment =\n        KubernetesEnvironment.builder().setPods(ImmutableMap.of(\"pod\", pod)).build();\n  }\n\n  @Test\n  public void shouldNotProvisionSecurityContextIfItIsNotConfigured() throws Exception {\n    // given\n    securityContextProvisioner = new SecurityContextProvisioner(null, null);\n\n    // when\n    securityContextProvisioner.provision(kubernetesEnvironment, runtimeIdentity);\n\n    // then\n    assertNull(pod.getSpec().getSecurityContext());\n  }\n\n  @Test\n  public void shouldProvisionSecurityContextIfItIsConfigured() throws Exception {\n    // given\n    securityContextProvisioner = new SecurityContextProvisioner(\"1\", \"2\");\n\n    // when\n    securityContextProvisioner.provision(kubernetesEnvironment, runtimeIdentity);\n\n    // then\n    PodSecurityContext securityContext = pod.getSpec().getSecurityContext();\n    assertNotNull(securityContext);\n\n    assertEquals(securityContext.getRunAsUser(), new Long(1));\n    assertEquals(securityContext.getFsGroup(), new Long(2));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/SshKeySecretProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableList;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport java.util.ArrayList;\nimport java.util.Base64;\nimport java.util.Collections;\nimport java.util.Map;\nimport java.util.UUID;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.ssh.server.SshManager;\nimport org.eclipse.che.api.ssh.server.model.impl.SshPairImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link SshKeysProvisioner}.\n *\n * @author Vitalii Parfonov\n * @author Vlad Zhukovskyi\n */\n@Listeners(MockitoTestNGListener.class)\npublic class SshKeySecretProvisionerTest {\n\n  private KubernetesEnvironment k8sEnv;\n  @Mock private RuntimeIdentity runtimeIdentity;\n\n  @Mock private SshManager sshManager;\n\n  @Mock private Pod pod;\n\n  @Mock private PodSpec podSpec;\n\n  @Mock private Container container;\n\n  @Mock RuntimeEventsPublisher runtimeEventsPublisher;\n\n  private final String someUser = \"someuser\";\n\n  private SshKeysProvisioner sshKeysProvisioner;\n\n  @BeforeMethod\n  public void setup() {\n    lenient().when(runtimeIdentity.getOwnerId()).thenReturn(someUser);\n    lenient().when(runtimeIdentity.getWorkspaceId()).thenReturn(\"wksp\");\n    k8sEnv = KubernetesEnvironment.builder().build();\n    ObjectMeta podMeta = new ObjectMetaBuilder().withName(\"wksp\").build();\n    lenient().when(pod.getMetadata()).thenReturn(podMeta);\n    lenient().when(pod.getSpec()).thenReturn(podSpec);\n    lenient().when(podSpec.getVolumes()).thenReturn(new ArrayList<>());\n    lenient().when(podSpec.getContainers()).thenReturn(Collections.singletonList(container));\n    lenient().when(container.getVolumeMounts()).thenReturn(new ArrayList<>());\n    k8sEnv.addPod(pod);\n    sshKeysProvisioner = new SshKeysProvisioner(sshManager, runtimeEventsPublisher);\n  }\n\n  @Test\n  public void generateSshKeyIfNoSshKeys() throws Exception {\n    when(sshManager.getPairs(someUser, \"vcs\")).thenReturn(Collections.emptyList());\n    when(sshManager.generatePair(eq(someUser), eq(\"vcs\"), anyString()))\n        .thenReturn(\n            new SshPairImpl(\n                someUser, \"vcs\", \"default-\" + UUID.randomUUID().toString(), \"public\", \"private\"));\n\n    sshKeysProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    assertEquals(k8sEnv.getSecrets().size(), 1);\n  }\n\n  @Test(dataProvider = \"invalidNames\")\n  public void shouldNotMountKeysWithInvalidKeyNames(String invalidName) throws Exception {\n    // given\n    when(sshManager.getPairs(someUser, \"vcs\"))\n        .thenReturn(\n            ImmutableList.of(\n                new SshPairImpl(someUser, \"vcs\", invalidName, \"public\", \"private\"),\n                new SshPairImpl(someUser, \"vcs\", \"gothub.mk\", \"public\", \"private\"),\n                new SshPairImpl(someUser, \"vcs\", \"boombaket.barabaket.com\", \"public\", \"private\")));\n    // when\n    sshKeysProvisioner.provision(k8sEnv, runtimeIdentity);\n    // then\n    Secret secret = k8sEnv.getSecrets().get(\"wksp-sshprivatekeys\");\n    assertNotNull(secret);\n    assertEquals(secret.getData().size(), 2);\n    assertTrue(secret.getData().containsKey(\"gothub.mk\"));\n    assertTrue(secret.getData().containsKey(\"boombaket.barabaket.com\"));\n    assertFalse(secret.getData().containsKey(invalidName));\n    verify(runtimeEventsPublisher, times(1))\n        .sendRuntimeLogEvent(anyString(), anyString(), eq(runtimeIdentity));\n  }\n\n  @Test(dataProvider = \"invalidNames\")\n  public void shouldIgnoreInvalidKeyNames(String invalidName) throws Exception {\n    assertFalse(\n        sshKeysProvisioner.isValidSshKeyPair(\n            new SshPairImpl(someUser, \"vcs\", invalidName, \"public\", \"private\")));\n  }\n\n  @Test(dataProvider = \"validNames\")\n  public void shouldAcceptValidKeyNames(String validName) throws Exception {\n    assertTrue(\n        sshKeysProvisioner.isValidSshKeyPair(\n            new SshPairImpl(someUser, \"vcs\", validName, \"public\", \"private\")));\n  }\n\n  @DataProvider\n  public static Object[][] invalidNames() {\n    return new Object[][] {\n      new Object[] {\"https://foo.bar\"},\n      new Object[] {\"_fef_123-ah_*zz**\"},\n      new Object[] {\"_fef_123-ah_z.z\"},\n      new Object[] {\"a-b#-hello\"},\n      new Object[] {\"--ab--\"}\n    };\n  }\n\n  @DataProvider\n  public static Object[][] validNames() {\n    return new Object[][] {\n      new Object[] {\"foo.bar\"},\n      new Object[] {\"fef-123-ahzz\"},\n      new Object[] {\"fef0123-ahz.z\"},\n      new Object[] {\"a-b.hello\"},\n      new Object[] {\"a--a----------b\"}\n    };\n  }\n\n  @Test\n  public void addSshKeysConfigInPod() throws Exception {\n    String keyName1 = UUID.randomUUID().toString();\n    String keyName2 = \"default-\" + UUID.randomUUID().toString();\n    String keyName3 = \"github.com\";\n    String keyName4 = UUID.randomUUID().toString();\n    lenient()\n        .when(sshManager.getPairs(someUser, \"vcs\"))\n        .thenReturn(\n            ImmutableList.of(\n                new SshPairImpl(someUser, \"vcs\", keyName1, \"public\", \"private\"),\n                new SshPairImpl(someUser, \"vcs\", keyName2, \"public\", \"private\"),\n                new SshPairImpl(someUser, \"vcs\", keyName3, \"public\", \"private\")));\n\n    lenient()\n        .when(sshManager.getPairs(someUser, \"internal\"))\n        .thenReturn(\n            ImmutableList.of(new SshPairImpl(someUser, \"internal\", keyName4, \"public\", \"private\")));\n\n    sshKeysProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    verify(podSpec, times(2)).getVolumes();\n    verify(podSpec, times(2)).getContainers();\n\n    Secret secret = k8sEnv.getSecrets().get(\"wksp-sshprivatekeys\");\n    assertNotNull(secret);\n    assertEquals(secret.getType(), \"opaque\");\n\n    String key1 = secret.getData().get(keyName1);\n    assertNotNull(key1);\n    assertEquals(\"private\", new String(Base64.getDecoder().decode(key1)));\n\n    String key2 = secret.getData().get(keyName2);\n    assertNotNull(key2);\n    assertEquals(\"private\", new String(Base64.getDecoder().decode(key2)));\n\n    String key3 = secret.getData().get(keyName3);\n    assertNotNull(key3);\n    assertEquals(\"private\", new String(Base64.getDecoder().decode(key3)));\n\n    String key4 = secret.getData().get(keyName3);\n    assertNotNull(key3);\n    assertEquals(\"private\", new String(Base64.getDecoder().decode(key4)));\n\n    Map<String, ConfigMap> configMaps = k8sEnv.getConfigMaps();\n    assertNotNull(configMaps);\n    assertTrue(configMaps.containsKey(\"sshconfigmap\"));\n\n    ConfigMap sshConfigMap = configMaps.get(\"sshconfigmap\");\n    assertNotNull(sshConfigMap);\n\n    Map<String, String> mapData = sshConfigMap.getData();\n    assertNotNull(mapData);\n    assertTrue(mapData.containsKey(\"ssh_config\"));\n\n    String sshConfig = mapData.get(\"ssh_config\");\n    assertTrue(sshConfig.contains(\"host \" + keyName1));\n    assertTrue(sshConfig.contains(\"IdentityFile \" + \"/etc/ssh/private/\" + keyName1));\n\n    assertTrue(sshConfig.contains(\"host *\"));\n    assertTrue(sshConfig.contains(\"IdentityFile \" + \"/etc/ssh/private/\" + keyName2));\n\n    assertTrue(sshConfig.contains(\"host github.com\"));\n    assertTrue(sshConfig.contains(\"IdentityFile /etc/ssh/private/github.com\"));\n  }\n\n  @Test\n  public void shouldNotProvisionVolumeButShouldMountInInjectablePods() throws Exception {\n    // given\n    String keyName1 = UUID.randomUUID().toString();\n    String keyName2 = \"default-\" + UUID.randomUUID().toString();\n    String keyName3 = \"github.com\";\n    when(sshManager.getPairs(someUser, \"vcs\"))\n        .thenReturn(\n            ImmutableList.of(\n                new SshPairImpl(someUser, \"vcs\", keyName1, \"public\", \"private\"),\n                new SshPairImpl(someUser, \"vcs\", keyName2, \"public\", \"private\"),\n                new SshPairImpl(someUser, \"vcs\", keyName3, \"public\", \"private\")));\n\n    Pod pod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"wkspc\")\n            .and()\n            .withNewSpec()\n            .withContainers(new ContainerBuilder().withImage(\"image\").build())\n            .and()\n            .build();\n\n    // we want to replace everything in the env that the setup() put there, so let's just re-init.\n    k8sEnv = KubernetesEnvironment.builder().build();\n    k8sEnv.addPod(pod);\n\n    Pod injectedPod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"injected\")\n            .and()\n            .withNewSpec()\n            .withContainers(new ContainerBuilder().withImage(\"image\").build())\n            .and()\n            .build();\n\n    k8sEnv.addInjectablePod(\"r\", \"i\", injectedPod);\n\n    // when\n    sshKeysProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    // then\n    assertEquals(pod.getSpec().getVolumes().size(), 2);\n    assertEquals(injectedPod.getSpec().getVolumes().size(), 0);\n\n    Container podContainer = pod.getSpec().getContainers().get(0);\n    Container injectedPodContainer = injectedPod.getSpec().getContainers().get(0);\n\n    assertEquals(podContainer.getVolumeMounts().size(), 2);\n    assertEquals(injectedPodContainer.getVolumeMounts().size(), 2);\n  }\n\n  @Test\n  public void addInternalSshKeysConfigInPod() throws Exception {\n    String keyName = UUID.randomUUID().toString();\n    lenient()\n        .when(sshManager.getPairs(someUser, \"internal\"))\n        .thenReturn(\n            ImmutableList.of(new SshPairImpl(someUser, \"internal\", keyName, \"public\", \"private\")));\n\n    // should exist at least one 'vcs' key by design\n    when(sshManager.generatePair(eq(someUser), eq(\"vcs\"), anyString()))\n        .thenReturn(\n            new SshPairImpl(\n                someUser, \"vcs\", \"default-\" + UUID.randomUUID().toString(), \"public\", \"private\"));\n\n    sshKeysProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    verify(podSpec, times(2)).getVolumes();\n    verify(podSpec, times(2)).getContainers();\n\n    Secret secret = k8sEnv.getSecrets().get(\"wksp-sshprivatekeys\");\n    assertNotNull(secret);\n    assertEquals(secret.getType(), \"opaque\");\n    String key = secret.getData().get(keyName);\n    assertNotNull(key);\n    assertEquals(\"private\", new String(Base64.getDecoder().decode(key)));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/UniqueNamesProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_ORIGINAL_NAME_LABEL;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotEquals;\n\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.EnvFromSource;\nimport io.fabric8.kubernetes.api.model.EnvFromSourceBuilder;\nimport io.fabric8.kubernetes.api.model.EnvVar;\nimport io.fabric8.kubernetes.api.model.EnvVarBuilder;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.VolumeBuilder;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBuilder;\nimport java.util.HashMap;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link UniqueNamesProvisioner}.\n *\n * @author Anton Korneta\n */\n@Listeners(MockitoTestNGListener.class)\npublic class UniqueNamesProvisionerTest {\n\n  private static final String WORKSPACE_ID = \"workspace37\";\n  private static final String POD_NAME = \"testPod\";\n  private static final String DEPLOYMENT_NAME = \"testDeployment\";\n  private static final String CONFIGMAP_NAME = \"testConfigMap\";\n  private static final String CONFIGMAP_KEY = \"testConfigMapKey\";\n  private static final String CONFIGMAP_VALUE = \"testConfigMapValue\";\n  private static final String INGRESS_NAME = \"testIngress\";\n\n  @Mock private KubernetesEnvironment k8sEnv;\n  @Mock private RuntimeIdentity runtimeIdentity;\n\n  private UniqueNamesProvisioner<KubernetesEnvironment> uniqueNamesProvisioner;\n\n  @BeforeMethod\n  public void setup() {\n    uniqueNamesProvisioner = new UniqueNamesProvisioner<>();\n  }\n\n  @Test\n  public void provideUniquePodsNames() throws Exception {\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n\n    Pod pod = newPod();\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    doReturn(ImmutableMap.of(POD_NAME, podData)).when(k8sEnv).getPodsData();\n\n    uniqueNamesProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    ObjectMeta podMetadata = pod.getMetadata();\n    assertNotEquals(podMetadata.getName(), POD_NAME);\n    assertEquals(podMetadata.getLabels().get(CHE_ORIGINAL_NAME_LABEL), POD_NAME);\n  }\n\n  @Test\n  public void provideUniqueDeploymentsName() throws Exception {\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n\n    Deployment deployment = newDeployment();\n    doReturn(ImmutableMap.of(DEPLOYMENT_NAME, deployment)).when(k8sEnv).getDeploymentsCopy();\n\n    uniqueNamesProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    ObjectMeta deploymentMetadata = deployment.getMetadata();\n    assertNotEquals(deploymentMetadata.getName(), DEPLOYMENT_NAME);\n    assertEquals(deploymentMetadata.getLabels().get(CHE_ORIGINAL_NAME_LABEL), DEPLOYMENT_NAME);\n  }\n\n  @Test\n  public void provideUniqueConfigMapName() throws Exception {\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n\n    ConfigMap configMap = newConfigMap();\n    doReturn(ImmutableMap.of(CONFIGMAP_NAME, configMap)).when(k8sEnv).getConfigMaps();\n\n    uniqueNamesProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    ObjectMeta configMapMetadata = configMap.getMetadata();\n    assertNotEquals(configMapMetadata.getName(), CONFIGMAP_NAME);\n    assertEquals(configMapMetadata.getLabels().get(CHE_ORIGINAL_NAME_LABEL), CONFIGMAP_NAME);\n  }\n\n  @Test\n  public void rewritePodConfigMapEnv() throws Exception {\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n\n    ConfigMap configMap = newConfigMap();\n    doReturn(ImmutableMap.of(CONFIGMAP_NAME, configMap)).when(k8sEnv).getConfigMaps();\n\n    EnvVar envVar =\n        new EnvVarBuilder()\n            .withNewValueFrom()\n            .withNewConfigMapKeyRef()\n            .withName(CONFIGMAP_NAME)\n            .withKey(CONFIGMAP_KEY)\n            .endConfigMapKeyRef()\n            .endValueFrom()\n            .build();\n    Container container = new ContainerBuilder().withEnv(envVar).build();\n    Pod pod = newPod();\n    pod.getSpec().setContainers(ImmutableList.of(container));\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    doReturn(ImmutableMap.of(POD_NAME, podData)).when(k8sEnv).getPodsData();\n\n    uniqueNamesProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    String newConfigMapName = configMap.getMetadata().getName();\n    EnvVar newEnvVar = container.getEnv().iterator().next();\n    assertEquals(newEnvVar.getValueFrom().getConfigMapKeyRef().getName(), newConfigMapName);\n  }\n\n  @Test\n  public void doesNotRewritePodConfigMapEnvWhenNoConfigMap() throws Exception {\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n\n    EnvVar envVar =\n        new EnvVarBuilder()\n            .withNewValueFrom()\n            .withNewConfigMapKeyRef()\n            .withName(CONFIGMAP_NAME)\n            .withKey(CONFIGMAP_KEY)\n            .endConfigMapKeyRef()\n            .endValueFrom()\n            .build();\n    Container container = new ContainerBuilder().withEnv(envVar).build();\n    Pod pod = newPod();\n    pod.getSpec().setContainers(ImmutableList.of(container));\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    doReturn(ImmutableMap.of(POD_NAME, podData)).when(k8sEnv).getPodsData();\n\n    uniqueNamesProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    EnvVar newEnvVar = container.getEnv().iterator().next();\n    assertEquals(newEnvVar.getValueFrom().getConfigMapKeyRef().getName(), CONFIGMAP_NAME);\n  }\n\n  @Test\n  public void rewritePodConfigMapEnvFrom() throws Exception {\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n\n    ConfigMap configMap = newConfigMap();\n    doReturn(ImmutableMap.of(CONFIGMAP_NAME, configMap)).when(k8sEnv).getConfigMaps();\n\n    EnvFromSource envFrom =\n        new EnvFromSourceBuilder()\n            .withNewConfigMapRef()\n            .withName(CONFIGMAP_NAME)\n            .endConfigMapRef()\n            .build();\n    Container container = new ContainerBuilder().withEnvFrom(envFrom).build();\n    Pod pod = newPod();\n    pod.getSpec().setContainers(ImmutableList.of(container));\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    doReturn(ImmutableMap.of(POD_NAME, podData)).when(k8sEnv).getPodsData();\n\n    uniqueNamesProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    String newConfigMapName = configMap.getMetadata().getName();\n    EnvFromSource newEnvFromSource = container.getEnvFrom().iterator().next();\n    assertEquals(newEnvFromSource.getConfigMapRef().getName(), newConfigMapName);\n  }\n\n  @Test\n  public void doesNotRewritePodConfigMapEnvFromWhenNoConfigMap() throws Exception {\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n\n    EnvFromSource envFrom =\n        new EnvFromSourceBuilder()\n            .withNewConfigMapRef()\n            .withName(CONFIGMAP_NAME)\n            .endConfigMapRef()\n            .build();\n    Container container = new ContainerBuilder().withEnvFrom(envFrom).build();\n    Pod pod = newPod();\n    pod.getSpec().setContainers(ImmutableList.of(container));\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    doReturn(ImmutableMap.of(POD_NAME, podData)).when(k8sEnv).getPodsData();\n\n    uniqueNamesProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    EnvFromSource newEnvFromSource = container.getEnvFrom().iterator().next();\n    assertEquals(newEnvFromSource.getConfigMapRef().getName(), CONFIGMAP_NAME);\n  }\n\n  @Test\n  public void rewritePodConfigMapVolumes() throws Exception {\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n\n    ConfigMap configMap = newConfigMap();\n    doReturn(ImmutableMap.of(CONFIGMAP_NAME, configMap)).when(k8sEnv).getConfigMaps();\n\n    Volume volume =\n        new VolumeBuilder().withNewConfigMap().withName(CONFIGMAP_NAME).endConfigMap().build();\n    Pod pod = newPod();\n    pod.getSpec().setVolumes(ImmutableList.of(volume));\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    doReturn(ImmutableMap.of(POD_NAME, podData)).when(k8sEnv).getPodsData();\n\n    uniqueNamesProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    String newConfigMapName = configMap.getMetadata().getName();\n    Volume newVolume = pod.getSpec().getVolumes().iterator().next();\n    assertEquals(newVolume.getConfigMap().getName(), newConfigMapName);\n  }\n\n  @Test\n  public void doesNotRewritePodConfigMapVolumesWhenNoConfigMap() throws Exception {\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n\n    Volume volume =\n        new VolumeBuilder().withNewConfigMap().withName(CONFIGMAP_NAME).endConfigMap().build();\n    Pod pod = newPod();\n    pod.getSpec().setVolumes(ImmutableList.of(volume));\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    doReturn(ImmutableMap.of(POD_NAME, podData)).when(k8sEnv).getPodsData();\n\n    uniqueNamesProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    Volume newVolume = pod.getSpec().getVolumes().iterator().next();\n    assertEquals(newVolume.getConfigMap().getName(), CONFIGMAP_NAME);\n  }\n\n  @Test\n  public void provideUniqueIngressesNames() throws Exception {\n    final HashMap<String, Ingress> ingresses = new HashMap<>();\n    Ingress ingress = newIngress();\n    ingresses.put(POD_NAME, ingress);\n    doReturn(ingresses).when(k8sEnv).getIngresses();\n\n    uniqueNamesProvisioner.provision(k8sEnv, runtimeIdentity);\n\n    final ObjectMeta ingressMetadata = ingress.getMetadata();\n    assertNotEquals(ingressMetadata.getName(), INGRESS_NAME);\n    assertEquals(ingressMetadata.getLabels().get(CHE_ORIGINAL_NAME_LABEL), INGRESS_NAME);\n  }\n\n  private static Pod newPod() {\n    return new PodBuilder()\n        .withMetadata(new ObjectMetaBuilder().withName(POD_NAME).build())\n        .withNewSpec()\n        .endSpec()\n        .build();\n  }\n\n  private static Deployment newDeployment() {\n    return new DeploymentBuilder()\n        .withNewMetadata()\n        .withName(DEPLOYMENT_NAME)\n        .endMetadata()\n        .withNewSpec()\n        .withNewTemplate()\n        .withNewMetadata()\n        .withName(POD_NAME)\n        .endMetadata()\n        .endTemplate()\n        .endSpec()\n        .build();\n  }\n\n  private static ConfigMap newConfigMap() {\n    return new ConfigMapBuilder()\n        .withNewMetadata()\n        .withName(CONFIGMAP_NAME)\n        .endMetadata()\n        .withData(ImmutableMap.of(CONFIGMAP_KEY, CONFIGMAP_VALUE))\n        .build();\n  }\n\n  private static Ingress newIngress() {\n    return new IngressBuilder()\n        .withMetadata(new ObjectMetaBuilder().withName(INGRESS_NAME).build())\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/VcsSslCertificateProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.VcsSslCertificateProvisioner.CA_CERT_FILE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.VcsSslCertificateProvisioner.CERT_MOUNT_PATH;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.VcsSslCertificateProvisioner.CHE_GIT_SELF_SIGNED_CERT_CONFIG_MAP_SUFFIX;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.VcsSslCertificateProvisioner.CHE_GIT_SELF_SIGNED_VOLUME;\nimport static org.mockito.Mockito.lenient;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapVolumeSource;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.UUID;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link VcsSslCertificateProvisioner}.\n *\n * @author Vitalii Parfonov\n */\n@Listeners(MockitoTestNGListener.class)\npublic class VcsSslCertificateProvisionerTest {\n\n  private static final String WORKSPACE_ID = \"workspace123\";\n  private static final String EXPECTED_CERT_NAME =\n      WORKSPACE_ID + CHE_GIT_SELF_SIGNED_CERT_CONFIG_MAP_SUFFIX;\n\n  private static final String CERT_CONTENT =\n      \"-----BEGIN CERTIFICATE-----\\n\"\n          + UUID.randomUUID().toString()\n          + \"\\n-----END CERTIFICATE-----\";\n  @Mock private RuntimeIdentity runtimeId;\n\n  private VcsSslCertificateProvisioner provisioner;\n  private KubernetesEnvironment k8sEnv;\n\n  @BeforeMethod\n  public void setUp() {\n    lenient().when(runtimeId.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n\n    provisioner = new VcsSslCertificateProvisioner(CERT_CONTENT, \"\");\n    k8sEnv = KubernetesEnvironment.builder().build();\n  }\n\n  @Test\n  public void shouldReturnFalseIfCertificateIsNotConfigured() {\n    provisioner = new VcsSslCertificateProvisioner();\n    assertFalse(provisioner.isConfigured());\n  }\n\n  @Test\n  public void shouldReturnTrueIfCertificateIsConfigured() {\n    provisioner = new VcsSslCertificateProvisioner(CERT_CONTENT, \"localhost\");\n    assertTrue(provisioner.isConfigured());\n  }\n\n  @Test\n  public void shouldReturnCertPathFile() {\n    String certPath = provisioner.getCertPath();\n    assertEquals(certPath, \"/etc/che/git/cert/ca.crt\");\n  }\n\n  @Test\n  public void shouldAddConfigMapWithCertificateIntoEnvironment() throws Exception {\n    provisioner.provision(k8sEnv, runtimeId);\n\n    Map<String, ConfigMap> configMaps = k8sEnv.getConfigMaps();\n    assertEquals(configMaps.size(), 1);\n\n    ConfigMap configMap = configMaps.get(EXPECTED_CERT_NAME);\n    assertNotNull(configMap);\n    assertEquals(configMap.getMetadata().getName(), EXPECTED_CERT_NAME);\n    assertEquals(configMap.getData().get(CA_CERT_FILE), CERT_CONTENT);\n  }\n\n  @Test\n  public void shouldAddVolumeAndVolumeMountsToPodsAndContainersInEnvironment() throws Exception {\n    k8sEnv.addPod(createPod(\"pod\"));\n    k8sEnv.addPod(createPod(\"pod2\"));\n\n    provisioner.provision(k8sEnv, runtimeId);\n\n    for (Pod pod : k8sEnv.getPodsCopy().values()) {\n      verifyVolumeIsPresent(pod);\n\n      for (Container container : pod.getSpec().getInitContainers()) {\n        verifyVolumeMountIsPresent(container);\n      }\n\n      for (Container container : pod.getSpec().getContainers()) {\n        verifyVolumeMountIsPresent(container);\n      }\n    }\n  }\n\n  @Test\n  public void\n      shouldNotAddVolumeAndVolumeMountsToPodsAndContainersInEnvironmentIfCertIsNotConfigured()\n          throws Exception {\n    provisioner = new VcsSslCertificateProvisioner(\"\", \"\");\n    k8sEnv.addPod(createPod(\"pod\"));\n    k8sEnv.addPod(createPod(\"pod2\"));\n\n    provisioner.provision(k8sEnv, runtimeId);\n\n    for (Pod pod : k8sEnv.getPodsCopy().values()) {\n      assertTrue(pod.getSpec().getVolumes().isEmpty());\n      for (Container container : pod.getSpec().getContainers()) {\n        assertTrue(container.getVolumeMounts().isEmpty());\n      }\n    }\n  }\n\n  @Test\n  public void shouldNotAddVolumeButAddVolumeMountsToInjectablePods() throws Exception {\n    k8sEnv.addPod(createPod(\"pod\"));\n    k8sEnv.addInjectablePod(\"r\", \"i\", createPod(\"pod2\"));\n\n    provisioner.provision(k8sEnv, runtimeId);\n\n    for (Pod pod : k8sEnv.getPodsCopy().values()) {\n      verifyVolumeIsPresent(pod);\n\n      for (Container container : pod.getSpec().getInitContainers()) {\n        verifyVolumeMountIsPresent(container);\n      }\n\n      for (Container container : pod.getSpec().getContainers()) {\n        verifyVolumeMountIsPresent(container);\n      }\n    }\n\n    for (Pod pod :\n        k8sEnv.getInjectablePodsCopy().values().stream()\n            .flatMap(v -> v.values().stream())\n            .toArray(Pod[]::new)) {\n      assertTrue(pod.getSpec().getVolumes().isEmpty());\n\n      for (Container container : pod.getSpec().getInitContainers()) {\n        verifyVolumeMountIsPresent(container);\n      }\n\n      for (Container container : pod.getSpec().getContainers()) {\n        verifyVolumeMountIsPresent(container);\n      }\n    }\n  }\n\n  private void verifyVolumeIsPresent(Pod pod) {\n    List<Volume> podVolumes = pod.getSpec().getVolumes();\n    assertEquals(podVolumes.size(), 1);\n    Volume certVolume = podVolumes.get(0);\n    assertEquals(certVolume.getName(), CHE_GIT_SELF_SIGNED_VOLUME);\n    ConfigMapVolumeSource volumeConfigMap = certVolume.getConfigMap();\n    assertNotNull(volumeConfigMap);\n    assertEquals(volumeConfigMap.getName(), EXPECTED_CERT_NAME);\n  }\n\n  private void verifyVolumeMountIsPresent(Container container) {\n    List<VolumeMount> volumeMounts = container.getVolumeMounts();\n    assertEquals(volumeMounts.size(), 1);\n    VolumeMount volumeMount = volumeMounts.get(0);\n    assertEquals(volumeMount.getName(), CHE_GIT_SELF_SIGNED_VOLUME);\n    assertTrue(volumeMount.getReadOnly());\n    assertEquals(volumeMount.getMountPath(), CERT_MOUNT_PATH);\n  }\n\n  private Pod createPod(String podName) {\n    return new PodBuilder()\n        .withNewMetadata()\n        .withName(podName)\n        .endMetadata()\n        .withNewSpec()\n        .withInitContainers(new ContainerBuilder().build())\n        .withContainers(new ContainerBuilder().build(), new ContainerBuilder().build())\n        .endSpec()\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/env/EnvVarsConverterTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.env;\n\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.singletonList;\nimport static org.testng.Assert.assertEquals;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.EnvVar;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.RuntimeIdentityImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class EnvVarsConverterTest {\n\n  private static final String PRE_EXISTING_VAR = \"VAR_THAT_EXISTS\";\n  private static final String PRE_EXISTING_VAR_VALUE = \"jmenuju se VAR\";\n  private static final String PRE_EXISTING_VAR_NEW_VALUE = \"my name is VAR\";\n  private static final String A_VAR = \"A\";\n  private static final String A_VAL = \"$(C)\";\n  private static final String B_VAR = \"B\";\n  private static final String B_VAL = \"b\";\n  private static final String C_VAR = \"C\";\n  private static final String C_VAL = \"c\";\n\n  private KubernetesEnvironment environment;\n  private RuntimeIdentity identity;\n  private Container testContainer;\n  private InternalMachineConfig machine;\n\n  @BeforeMethod\n  public void setUp() {\n    testContainer = new Container();\n\n    PodSpec podSpec = new PodSpec();\n    podSpec.setContainers(singletonList(testContainer));\n\n    ObjectMeta podMeta = new ObjectMeta();\n    podMeta.setName(\"pod\");\n\n    Pod pod = new Pod();\n    pod.setSpec(podSpec);\n    pod.setMetadata(podMeta);\n\n    Map<String, Pod> pods = new HashMap<>();\n    pods.put(\"pod\", pod);\n\n    environment = KubernetesEnvironment.builder().setPods(pods).build();\n\n    machine = new InternalMachineConfig();\n\n    environment.setMachines(\n        Collections.singletonMap(Names.machineName(podMeta, testContainer), machine));\n\n    identity = new RuntimeIdentityImpl(\"wsId\", \"blah\", \"bleh\", \"infraNamespace\");\n  }\n\n  @Test\n  public void shouldProvisionEnvironmentVariablesSorted() throws InfrastructureException {\n    // given\n    List<EnvVar> preExistingEnvironment = new ArrayList<>();\n    preExistingEnvironment.add(new EnvVar(PRE_EXISTING_VAR, PRE_EXISTING_VAR_VALUE, null));\n    testContainer.setEnv(preExistingEnvironment);\n\n    machine.getEnv().put(PRE_EXISTING_VAR, PRE_EXISTING_VAR_NEW_VALUE);\n    machine.getEnv().put(A_VAR, A_VAL);\n    machine.getEnv().put(B_VAR, B_VAL);\n    machine.getEnv().put(C_VAR, C_VAL);\n\n    // when\n    EnvVarsConverter converter = new EnvVarsConverter();\n    converter.provision(environment, identity);\n\n    // then\n    EnvVar expectedA = new EnvVar(A_VAR, A_VAL, null);\n    EnvVar expectedB = new EnvVar(B_VAR, B_VAL, null);\n    EnvVar expectedC = new EnvVar(C_VAR, C_VAL, null);\n    EnvVar expectedPreExisting = new EnvVar(PRE_EXISTING_VAR, PRE_EXISTING_VAR_NEW_VALUE, null);\n\n    List<EnvVar> expectedOrder = asList(expectedB, expectedC, expectedA, expectedPreExisting);\n\n    assertEquals(4, testContainer.getEnv().size());\n    assertEquals(expectedOrder, testContainer.getEnv());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/limits/ram/ContainerResourceProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.limits.ram;\n\nimport static com.google.common.collect.ImmutableMap.of;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_REQUEST_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_REQUEST_ATTRIBUTE;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNull;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.Quantity;\nimport io.fabric8.kubernetes.api.model.ResourceRequirements;\nimport io.fabric8.kubernetes.api.model.ResourceRequirementsBuilder;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link ContainerResourceProvisioner}.\n *\n * @author Anton Korneta\n */\n@Listeners(MockitoTestNGListener.class)\npublic class ContainerResourceProvisionerTest {\n\n  private static final String POD_NAME = \"web\";\n  private static final String CONTAINER_NAME = \"app\";\n  private static final String MACHINE_NAME = POD_NAME + '/' + CONTAINER_NAME;\n  private static final String RAM_LIMIT_VALUE = \"2147483648\";\n  private static final String RAM_REQUEST_VALUE = \"1234567890\";\n  private static final String CPU_LIMIT_VALUE = \"0.4\";\n  private static final String CPU_REQUEST_VALUE = \"0.15\";\n\n  @Mock private KubernetesEnvironment k8sEnv;\n  @Mock private RuntimeIdentity identity;\n  @Mock private InternalMachineConfig internalMachineConfig;\n\n  private Container container;\n  private ContainerResourceProvisioner resourceProvisioner;\n\n  @BeforeMethod\n  public void setup() {\n    resourceProvisioner = new ContainerResourceProvisioner(1024, 512, \"500m\", \"100m\");\n    container = new Container();\n    container.setName(CONTAINER_NAME);\n    when(k8sEnv.getMachines()).thenReturn(of(MACHINE_NAME, internalMachineConfig));\n    when(internalMachineConfig.getAttributes())\n        .thenReturn(\n            of(\n                MEMORY_LIMIT_ATTRIBUTE,\n                RAM_LIMIT_VALUE,\n                MEMORY_REQUEST_ATTRIBUTE,\n                RAM_REQUEST_VALUE,\n                CPU_LIMIT_ATTRIBUTE,\n                CPU_LIMIT_VALUE,\n                CPU_REQUEST_ATTRIBUTE,\n                CPU_REQUEST_VALUE));\n    final ObjectMeta podMetadata = mock(ObjectMeta.class);\n    when(podMetadata.getName()).thenReturn(POD_NAME);\n    final PodSpec podSpec = mock(PodSpec.class);\n    when(podSpec.getContainers()).thenReturn(Collections.singletonList(container));\n    when(k8sEnv.getPodsData()).thenReturn(of(POD_NAME, new PodData(podSpec, podMetadata)));\n  }\n\n  @Test\n  public void testProvisionResourcesLimitAndRequestAttributeToContainer() throws Exception {\n    resourceProvisioner.provision(k8sEnv, identity);\n    assertEquals(container.getResources().getLimits().get(\"memory\").getAmount(), RAM_LIMIT_VALUE);\n    assertEquals(container.getResources().getLimits().get(\"cpu\").getAmount(), CPU_LIMIT_VALUE);\n    assertEquals(\n        container.getResources().getRequests().get(\"memory\").getAmount(), RAM_REQUEST_VALUE);\n    assertEquals(container.getResources().getRequests().get(\"cpu\").getAmount(), CPU_REQUEST_VALUE);\n  }\n\n  @Test\n  public void testIgnoreNegativeRAMResourcesLimitAndRequestAttributeToContainer() throws Exception {\n\n    ContainerResourceProvisioner localResourceProvisioner =\n        new ContainerResourceProvisioner(-1, -1, \"-1\", \"-1\");\n    Map<String, String> attributes = new HashMap<>();\n    attributes.put(MEMORY_LIMIT_ATTRIBUTE, \"-1\");\n    attributes.put(MEMORY_REQUEST_ATTRIBUTE, \"-1\");\n    attributes.put(CPU_LIMIT_ATTRIBUTE, CPU_LIMIT_VALUE);\n    attributes.put(CPU_REQUEST_ATTRIBUTE, CPU_REQUEST_VALUE);\n\n    when(internalMachineConfig.getAttributes()).thenReturn(attributes);\n\n    localResourceProvisioner.provision(k8sEnv, identity);\n    assertNull(container.getResources().getLimits().get(\"memory\"));\n    assertEquals(container.getResources().getLimits().get(\"cpu\").getAmount(), CPU_LIMIT_VALUE);\n    assertNull(container.getResources().getRequests().get(\"memory\"));\n    assertEquals(container.getResources().getRequests().get(\"cpu\").getAmount(), CPU_REQUEST_VALUE);\n  }\n\n  @Test\n  public void testIgnoreNegativeCPUResourcesLimitAndRequestAttributeToContainer() throws Exception {\n\n    ContainerResourceProvisioner localResourceProvisioner =\n        new ContainerResourceProvisioner(-1, -1, \"-1\", \"-1\");\n    Map<String, String> attributes = new HashMap<>();\n    attributes.put(MEMORY_LIMIT_ATTRIBUTE, RAM_LIMIT_VALUE);\n    attributes.put(MEMORY_REQUEST_ATTRIBUTE, RAM_REQUEST_VALUE);\n    attributes.put(CPU_LIMIT_ATTRIBUTE, \"-1\");\n    attributes.put(CPU_REQUEST_ATTRIBUTE, \"-1\");\n\n    when(internalMachineConfig.getAttributes()).thenReturn(attributes);\n\n    localResourceProvisioner.provision(k8sEnv, identity);\n    assertEquals(container.getResources().getLimits().get(\"memory\").getAmount(), RAM_LIMIT_VALUE);\n    assertNull(container.getResources().getLimits().get(\"cpu\"));\n    assertEquals(\n        container.getResources().getRequests().get(\"memory\").getAmount(), RAM_REQUEST_VALUE);\n    assertNull(container.getResources().getRequests().get(\"cpu\"));\n  }\n\n  @Test\n  public void testOverridesContainerRamLimitAndRequestFromMachineAttribute() throws Exception {\n    ResourceRequirements resourceRequirements =\n        new ResourceRequirementsBuilder()\n            .addToLimits(of(\"memory\", new Quantity(\"3221225472\"), \"cpu\", new Quantity(\"0.678\")))\n            .addToRequests(of(\"memory\", new Quantity(\"1231231423\"), \"cpu\", new Quantity(\"0.333\")))\n            .build();\n    container.setResources(resourceRequirements);\n\n    resourceProvisioner.provision(k8sEnv, identity);\n\n    assertEquals(container.getResources().getLimits().get(\"memory\").getAmount(), RAM_LIMIT_VALUE);\n    assertEquals(container.getResources().getLimits().get(\"cpu\").getAmount(), CPU_LIMIT_VALUE);\n    assertEquals(\n        container.getResources().getRequests().get(\"memory\").getAmount(), RAM_REQUEST_VALUE);\n    assertEquals(container.getResources().getRequests().get(\"cpu\").getAmount(), CPU_REQUEST_VALUE);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/restartpolicy/RestartPolicyRewriterTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.restartpolicy;\n\nimport static java.lang.String.format;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Warnings.RESTART_POLICY_SET_TO_NEVER_WARNING_CODE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.restartpolicy.RestartPolicyRewriter.DEFAULT_RESTART_POLICY;\nimport static org.mockito.Mockito.atLeastOnce;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.fail;\n\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.PodSpecBuilder;\nimport java.util.Iterator;\nimport java.util.List;\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.WarningImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\n@Listeners(MockitoTestNGListener.class)\npublic class RestartPolicyRewriterTest {\n\n  private static final String TEST_POD_NAME = \"app\";\n  private static final String ALWAYS_RESTART_POLICY = \"Always\";\n\n  @Mock private KubernetesEnvironment k8sEnv;\n  @Mock private RuntimeIdentity runtimeIdentity;\n  @InjectMocks private RestartPolicyRewriter restartPolicyRewriter;\n\n  @Captor private ArgumentCaptor<Warning> warningCaptor;\n\n  @Test\n  public void rewritesRestartPolicyWhenItsDifferentWithDefaultOne() throws Exception {\n    Pod pod = newPod(TEST_POD_NAME, ALWAYS_RESTART_POLICY);\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    when(k8sEnv.getPodsData()).thenReturn(singletonMap(TEST_POD_NAME, podData));\n\n    restartPolicyRewriter.provision(k8sEnv, runtimeIdentity);\n\n    assertEquals(pod.getSpec().getRestartPolicy(), DEFAULT_RESTART_POLICY);\n    verifyWarnings(\n        new WarningImpl(\n            RESTART_POLICY_SET_TO_NEVER_WARNING_CODE,\n            format(\n                \"Restart policy '%s' for pod '%s' is rewritten with %s\",\n                ALWAYS_RESTART_POLICY, TEST_POD_NAME, DEFAULT_RESTART_POLICY)));\n  }\n\n  private static Pod newPod(String podName, String restartPolicy, Container... containers) {\n    final ObjectMeta podMetadata = new ObjectMetaBuilder().withName(podName).build();\n    final PodSpec podSpec =\n        new PodSpecBuilder().withRestartPolicy(restartPolicy).withContainers(containers).build();\n    return new PodBuilder().withMetadata(podMetadata).withSpec(podSpec).build();\n  }\n\n  private void verifyWarnings(Warning... expectedWarnings) {\n    final Iterator<Warning> actualWarnings = captureWarnings().iterator();\n    for (Warning expected : expectedWarnings) {\n      if (!actualWarnings.hasNext()) {\n        fail(\"It is expected to receive environment warning\");\n      }\n      final Warning actual = actualWarnings.next();\n      assertEquals(actual, expected);\n    }\n    if (actualWarnings.hasNext()) {\n      fail(\"No more warnings expected\");\n    }\n  }\n\n  private List<Warning> captureWarnings() {\n    verify(k8sEnv, atLeastOnce()).addWarning(warningCaptor.capture());\n    return warningCaptor.getAllValues();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/secret/EnvironmentVariableSecretApplierTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.DEVFILE_COMPONENT_ALIAS_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_AUTOMOUNT;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_ENV_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_ENV_NAME_TEMPLATE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_AS;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.EnvVar;\nimport io.fabric8.kubernetes.api.model.LabelSelector;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodRole;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesSecrets;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class EnvironmentVariableSecretApplierTest {\n\n  @Mock private KubernetesEnvironment environment;\n\n  @Mock private KubernetesSecrets secrets;\n\n  @Mock private PodData podData;\n\n  @Mock private PodSpec podSpec;\n\n  @Mock private RuntimeIdentity runtimeIdentity;\n\n  EnvironmentVariableSecretApplier secretApplier = new EnvironmentVariableSecretApplier();\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    when(environment.getPodsData()).thenReturn(singletonMap(\"pod1\", podData));\n    when(podData.getRole()).thenReturn(PodRole.DEPLOYMENT);\n    when(podData.getSpec()).thenReturn(podSpec);\n  }\n\n  @Test\n  public void shouldProvisionSingleEnvVariable() throws Exception {\n    Container container_match = new ContainerBuilder().withName(\"maven\").build();\n    Container container_unmatch = spy(new ContainerBuilder().withName(\"other\").build());\n\n    when(podSpec.getContainers()).thenReturn(ImmutableList.of(container_match, container_unmatch));\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(singletonMap(\"foo\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_ENV_NAME,\n                            \"MY_FOO\",\n                            ANNOTATION_MOUNT_AS,\n                            \"env\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    // container has env set\n    assertEquals(container_match.getEnv().size(), 1);\n    EnvVar var = container_match.getEnv().get(0);\n    assertEquals(var.getName(), \"MY_FOO\");\n    assertEquals(var.getValueFrom().getSecretKeyRef().getName(), \"test_secret\");\n    assertEquals(var.getValueFrom().getSecretKeyRef().getKey(), \"foo\");\n  }\n\n  @Test\n  public void shouldProvisionMultiEnvVariable() throws Exception {\n    Container container_match = new ContainerBuilder().withName(\"maven\").build();\n\n    when(podSpec.getContainers()).thenReturn(ImmutableList.of(container_match));\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"foo\", \"random\", \"bar\", \"freedom\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            String.format(ANNOTATION_ENV_NAME_TEMPLATE, \"foo\"),\n                            \"MY_FOO\",\n                            String.format(ANNOTATION_ENV_NAME_TEMPLATE, \"bar\"),\n                            \"MY_BAR\",\n                            ANNOTATION_MOUNT_AS,\n                            \"env\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    // container has env set\n    assertEquals(container_match.getEnv().size(), 2);\n    EnvVar var = container_match.getEnv().get(0);\n    assertEquals(var.getName(), \"MY_FOO\");\n    assertEquals(var.getValueFrom().getSecretKeyRef().getName(), \"test_secret\");\n    assertEquals(var.getValueFrom().getSecretKeyRef().getKey(), \"foo\");\n\n    EnvVar var2 = container_match.getEnv().get(1);\n    assertEquals(var2.getName(), \"MY_BAR\");\n    assertEquals(var2.getValueFrom().getSecretKeyRef().getName(), \"test_secret\");\n    assertEquals(var2.getValueFrom().getSecretKeyRef().getKey(), \"bar\");\n  }\n\n  @Test\n  public void shouldProvisionAllContainersIfAutomountEnabled() throws Exception {\n    Container container_match1 = new ContainerBuilder().withName(\"maven\").build();\n    Container container_match2 = new ContainerBuilder().withName(\"other\").build();\n\n    when(podSpec.getContainers()).thenReturn(ImmutableList.of(container_match1, container_match2));\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(singletonMap(\"foo\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_ENV_NAME, \"MY_FOO\",\n                            ANNOTATION_MOUNT_AS, \"env\",\n                            ANNOTATION_AUTOMOUNT, \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    // both containers has env set\n    assertEquals(container_match1.getEnv().size(), 1);\n    EnvVar var = container_match1.getEnv().get(0);\n    assertEquals(var.getName(), \"MY_FOO\");\n    assertEquals(var.getValueFrom().getSecretKeyRef().getName(), \"test_secret\");\n    assertEquals(var.getValueFrom().getSecretKeyRef().getKey(), \"foo\");\n\n    assertEquals(container_match2.getEnv().size(), 1);\n    EnvVar var2 = container_match2.getEnv().get(0);\n    assertEquals(var2.getName(), \"MY_FOO\");\n    assertEquals(var2.getValueFrom().getSecretKeyRef().getName(), \"test_secret\");\n    assertEquals(var2.getValueFrom().getSecretKeyRef().getKey(), \"foo\");\n  }\n\n  @Test\n  public void shouldProvisionContainersWithAutomountOverrideTrue() throws Exception {\n    Container container_match1 = new ContainerBuilder().withName(\"maven\").build();\n    Container container_match2 = new ContainerBuilder().withName(\"other\").build();\n    DevfileImpl mock_defvile = mock(DevfileImpl.class);\n    ComponentImpl component = new ComponentImpl();\n    component.setAlias(\"maven\");\n    component.setAutomountWorkspaceSecrets(true);\n\n    when(podSpec.getContainers()).thenReturn(ImmutableList.of(container_match1, container_match2));\n    InternalMachineConfig internalMachineConfig = new InternalMachineConfig();\n    internalMachineConfig.getAttributes().put(DEVFILE_COMPONENT_ALIAS_ATTRIBUTE, \"maven\");\n    when(environment.getMachines()).thenReturn(ImmutableMap.of(\"maven\", internalMachineConfig));\n    when(environment.getDevfile()).thenReturn(mock_defvile);\n    when(mock_defvile.getComponents()).thenReturn(singletonList(component));\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(singletonMap(\"foo\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_ENV_NAME, \"MY_FOO\",\n                            ANNOTATION_MOUNT_AS, \"env\",\n                            ANNOTATION_AUTOMOUNT, \"false\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    // only first container has env set\n    assertEquals(container_match1.getEnv().size(), 1);\n    EnvVar var = container_match1.getEnv().get(0);\n    assertEquals(var.getName(), \"MY_FOO\");\n    assertEquals(var.getValueFrom().getSecretKeyRef().getName(), \"test_secret\");\n    assertEquals(var.getValueFrom().getSecretKeyRef().getKey(), \"foo\");\n\n    assertEquals(container_match2.getEnv().size(), 0);\n  }\n\n  @Test\n  public void shouldNotProvisionContainersWithAutomountOverrideFalse() throws Exception {\n    Container container_match1 = new ContainerBuilder().withName(\"maven\").build();\n    Container container_match2 = new ContainerBuilder().withName(\"other\").build();\n    DevfileImpl mock_defvile = mock(DevfileImpl.class);\n    ComponentImpl component = new ComponentImpl();\n    component.setAlias(\"maven\");\n    component.setAutomountWorkspaceSecrets(false);\n\n    when(podSpec.getContainers()).thenReturn(ImmutableList.of(container_match1, container_match2));\n    InternalMachineConfig internalMachineConfig = new InternalMachineConfig();\n    internalMachineConfig.getAttributes().put(DEVFILE_COMPONENT_ALIAS_ATTRIBUTE, \"maven\");\n    when(environment.getMachines()).thenReturn(ImmutableMap.of(\"maven\", internalMachineConfig));\n    when(environment.getDevfile()).thenReturn(mock_defvile);\n    when(mock_defvile.getComponents()).thenReturn(singletonList(component));\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(singletonMap(\"foo\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_ENV_NAME, \"MY_FOO\",\n                            ANNOTATION_MOUNT_AS, \"env\",\n                            ANNOTATION_AUTOMOUNT, \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    // only second container has env set\n    assertEquals(container_match1.getEnv().size(), 0);\n\n    assertEquals(container_match2.getEnv().size(), 1);\n    EnvVar var2 = container_match2.getEnv().get(0);\n    assertEquals(var2.getName(), \"MY_FOO\");\n    assertEquals(var2.getValueFrom().getSecretKeyRef().getName(), \"test_secret\");\n    assertEquals(var2.getValueFrom().getSecretKeyRef().getKey(), \"foo\");\n  }\n\n  @Test\n  public void shouldNotProvisionAllContainersifAutomountDisabled() throws Exception {\n    Container container_match1 = spy(new ContainerBuilder().withName(\"maven\").build());\n    Container container_match2 = spy(new ContainerBuilder().withName(\"other\").build());\n\n    when(podSpec.getContainers()).thenReturn(ImmutableList.of(container_match1, container_match2));\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(singletonMap(\"foo\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_ENV_NAME, \"MY_FOO\",\n                            ANNOTATION_MOUNT_AS, \"env\",\n                            ANNOTATION_AUTOMOUNT, \"false\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    verify(container_match1).getName();\n    verify(container_match2).getName();\n    // both containers no actions\n    verifyNoMoreInteractions(container_match1, container_match2);\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Unable to mount secret 'test_secret': It is configured to be mount as a environment variable, but its name was not specified. Please define the 'che.eclipse.org/env-name' annotation on the secret to specify it.\")\n  public void shouldThrowExceptionWhenNoEnvNameSpecifiedSingleValue() throws Exception {\n    Container container_match = new ContainerBuilder().withName(\"maven\").build();\n\n    when(podSpec.getContainers()).thenReturn(ImmutableList.of(container_match));\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(singletonMap(\"foo\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(ANNOTATION_MOUNT_AS, \"env\", ANNOTATION_AUTOMOUNT, \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    when(secrets.get(any(LabelSelector.class))).thenReturn(singletonList(secret));\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Unable to mount key 'foo'  of secret 'test_secret': It is configured to be mount as a environment variable, but its name was not specified. Please define the 'che.eclipse.org/foo_env-name' annotation on the secret to specify it.\")\n  public void shouldThrowExceptionWhenNoEnvNameSpecifiedMultiValue() throws Exception {\n    Container container_match = new ContainerBuilder().withName(\"maven\").build();\n\n    when(podSpec.getContainers()).thenReturn(ImmutableList.of(container_match));\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"foo\", \"random\", \"bar\", \"test\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(ANNOTATION_MOUNT_AS, \"env\", ANNOTATION_AUTOMOUNT, \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    when(secrets.get(any(LabelSelector.class))).thenReturn(singletonList(secret));\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/secret/FileSecretApplierTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.DEVFILE_COMPONENT_ALIAS_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_AUTOMOUNT;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_AS;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_PATH;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.LabelSelector;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.PodSpecBuilder;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.api.model.Volume;\nimport io.fabric8.kubernetes.api.model.VolumeMount;\nimport io.fabric8.kubernetes.api.model.VolumeMountBuilder;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.VolumeImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodRole;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.K8sVersion;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesSecrets;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class FileSecretApplierTest {\n\n  @Mock private KubernetesEnvironment environment;\n\n  @Mock private KubernetesSecrets secrets;\n\n  @Mock private PodData podData;\n\n  @Mock private PodSpec podSpec;\n\n  @Mock private RuntimeIdentity runtimeIdentity;\n\n  @Mock private K8sVersion kubernetesVersion;\n\n  FileSecretApplier secretApplier;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    lenient().when(kubernetesVersion.newerOrEqualThan(1, 13)).thenReturn(true);\n    lenient().when(kubernetesVersion.olderThan(1, 13)).thenReturn(false);\n    secretApplier = new FileSecretApplier(kubernetesVersion);\n    when(environment.getPodsData()).thenReturn(singletonMap(\"pod1\", podData));\n    when(podData.getRole()).thenReturn(PodRole.DEPLOYMENT);\n    when(podData.getSpec()).thenReturn(podSpec);\n  }\n\n  @Test\n  public void shouldProvisionAsFiles() throws Exception {\n    Container container_match1 = new ContainerBuilder().withName(\"maven\").build();\n    Container container_match2 = new ContainerBuilder().withName(\"other\").build();\n\n    PodSpec localSpec =\n        new PodSpecBuilder()\n            .withContainers(ImmutableList.of(container_match1, container_match2))\n            .build();\n\n    when(podData.getSpec()).thenReturn(localSpec);\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"settings.xml\", \"random\", \"another.xml\", \"freedom\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.m2\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    // pod has volume created\n    assertEquals(environment.getPodsData().get(\"pod1\").getSpec().getVolumes().size(), 1);\n    Volume volume = environment.getPodsData().get(\"pod1\").getSpec().getVolumes().get(0);\n    assertEquals(volume.getName(), \"test_secret\");\n    assertEquals(volume.getSecret().getSecretName(), \"test_secret\");\n\n    // both containers has mounts set\n    assertEquals(\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .size(),\n        2);\n    VolumeMount mount1 =\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .get(0);\n    assertEquals(mount1.getName(), \"test_secret\");\n    assertEquals(mount1.getMountPath(), \"/home/user/.m2/\" + mount1.getSubPath());\n    assertFalse(mount1.getSubPath().isEmpty());\n    assertTrue(mount1.getReadOnly());\n\n    VolumeMount mount2 =\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .get(1);\n    assertEquals(mount2.getName(), \"test_secret\");\n    assertEquals(mount2.getMountPath(), \"/home/user/.m2/\" + mount2.getSubPath());\n    assertFalse(mount2.getSubPath().isEmpty());\n    assertTrue(mount2.getReadOnly());\n\n    assertEquals(\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(1)\n            .getVolumeMounts()\n            .size(),\n        2);\n\n    if (\"settings.xml\".equals(mount1.getSubPath())) {\n      assertEquals(mount1.getSubPath(), \"settings.xml\");\n      assertEquals(mount2.getSubPath(), \"another.xml\");\n    } else {\n      assertEquals(mount1.getSubPath(), \"another.xml\");\n      assertEquals(mount2.getSubPath(), \"settings.xml\");\n    }\n  }\n\n  @Test\n  public void shouldProvisionAsFilesWithPathOverride() throws Exception {\n    Container container = new ContainerBuilder().withName(\"maven\").build();\n\n    DevfileImpl mock_defvile = mock(DevfileImpl.class);\n    ComponentImpl component = new ComponentImpl();\n    component.setAlias(\"maven\");\n    component.getVolumes().add(new VolumeImpl(\"test_secret\", \"/path/to/override\"));\n\n    InternalMachineConfig internalMachineConfig = new InternalMachineConfig();\n    internalMachineConfig.getAttributes().put(DEVFILE_COMPONENT_ALIAS_ATTRIBUTE, \"maven\");\n    when(environment.getMachines()).thenReturn(ImmutableMap.of(\"maven\", internalMachineConfig));\n    when(environment.getDevfile()).thenReturn(mock_defvile);\n    when(mock_defvile.getComponents()).thenReturn(singletonList(component));\n\n    PodSpec localSpec = new PodSpecBuilder().withContainers(ImmutableList.of(container)).build();\n\n    when(podData.getSpec()).thenReturn(localSpec);\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"settings.xml\", \"random\", \"another.xml\", \"freedom\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.m2\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    // pod has volume created\n    assertEquals(environment.getPodsData().get(\"pod1\").getSpec().getVolumes().size(), 1);\n    Volume volume = environment.getPodsData().get(\"pod1\").getSpec().getVolumes().get(0);\n    assertEquals(volume.getName(), \"test_secret\");\n    assertEquals(volume.getSecret().getSecretName(), \"test_secret\");\n\n    // both containers has mounts set\n    assertEquals(\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .size(),\n        2);\n    VolumeMount mount1 =\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .get(0);\n    assertEquals(mount1.getName(), \"test_secret\");\n    assertEquals(mount1.getMountPath(), \"/path/to/override/settings.xml\");\n    assertTrue(mount1.getReadOnly());\n  }\n\n  @Test\n  public void shouldProvisionContainersWithAutomountOverrideTrue() throws Exception {\n    Container container_match1 = new ContainerBuilder().withName(\"maven\").build();\n    Container container_match2 = new ContainerBuilder().withName(\"other\").build();\n    DevfileImpl mock_defvile = mock(DevfileImpl.class);\n    ComponentImpl component = new ComponentImpl();\n    component.setAlias(\"maven\");\n    component.setAutomountWorkspaceSecrets(true);\n\n    InternalMachineConfig internalMachineConfig = new InternalMachineConfig();\n    internalMachineConfig.getAttributes().put(DEVFILE_COMPONENT_ALIAS_ATTRIBUTE, \"maven\");\n    when(environment.getMachines()).thenReturn(ImmutableMap.of(\"maven\", internalMachineConfig));\n    when(environment.getDevfile()).thenReturn(mock_defvile);\n    when(mock_defvile.getComponents()).thenReturn(singletonList(component));\n\n    PodSpec localSpec =\n        new PodSpecBuilder()\n            .withContainers(ImmutableList.of(container_match1, container_match2))\n            .build();\n\n    when(podData.getSpec()).thenReturn(localSpec);\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(singletonMap(\"foo\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.m2\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"false\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    // pod has volume created\n    assertEquals(environment.getPodsData().get(\"pod1\").getSpec().getVolumes().size(), 1);\n    Volume volume = environment.getPodsData().get(\"pod1\").getSpec().getVolumes().get(0);\n    assertEquals(volume.getName(), \"test_secret\");\n    assertEquals(volume.getSecret().getSecretName(), \"test_secret\");\n\n    // first container has mount set\n    assertEquals(\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .size(),\n        1);\n    VolumeMount mount1 =\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .get(0);\n    assertEquals(mount1.getName(), \"test_secret\");\n    assertEquals(mount1.getMountPath(), \"/home/user/.m2/foo\");\n    assertTrue(mount1.getReadOnly());\n\n    // second container has no mounts\n    assertEquals(\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(1)\n            .getVolumeMounts()\n            .size(),\n        0);\n  }\n\n  @Test\n  public void shouldNotProvisionContainersWithAutomountOverrideFalse() throws Exception {\n    Container container_match1 = new ContainerBuilder().withName(\"maven\").build();\n    Container container_match2 = new ContainerBuilder().withName(\"other\").build();\n    DevfileImpl mock_defvile = mock(DevfileImpl.class);\n    ComponentImpl component = new ComponentImpl();\n    component.setAlias(\"maven\");\n    component.setAutomountWorkspaceSecrets(false);\n\n    InternalMachineConfig internalMachineConfig = new InternalMachineConfig();\n    internalMachineConfig.getAttributes().put(DEVFILE_COMPONENT_ALIAS_ATTRIBUTE, \"maven\");\n    when(environment.getMachines()).thenReturn(ImmutableMap.of(\"maven\", internalMachineConfig));\n    when(environment.getDevfile()).thenReturn(mock_defvile);\n    when(mock_defvile.getComponents()).thenReturn(singletonList(component));\n\n    PodSpec localSpec =\n        new PodSpecBuilder()\n            .withContainers(ImmutableList.of(container_match1, container_match2))\n            .build();\n\n    when(podData.getSpec()).thenReturn(localSpec);\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(singletonMap(\"foo\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.m2\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    // only second container has mounts\n    assertEquals(environment.getPodsData().get(\"pod1\").getSpec().getVolumes().size(), 1);\n    Volume volume = environment.getPodsData().get(\"pod1\").getSpec().getVolumes().get(0);\n    assertEquals(volume.getName(), \"test_secret\");\n    assertEquals(volume.getSecret().getSecretName(), \"test_secret\");\n\n    assertEquals(\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .size(),\n        0);\n\n    assertEquals(\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(1)\n            .getVolumeMounts()\n            .size(),\n        1);\n    VolumeMount mount2 =\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(1)\n            .getVolumeMounts()\n            .get(0);\n    assertEquals(mount2.getName(), \"test_secret\");\n    assertEquals(mount2.getMountPath(), \"/home/user/.m2/foo\");\n    assertTrue(mount2.getReadOnly());\n  }\n\n  @Test\n  public void shouldNotProvisionAllContainersifAutomountDisabled() throws Exception {\n    Container container_match1 = spy(new ContainerBuilder().withName(\"maven\").build());\n    Container container_match2 = spy(new ContainerBuilder().withName(\"other\").build());\n\n    when(podSpec.getContainers()).thenReturn(ImmutableList.of(container_match1, container_match2));\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(singletonMap(\"foo\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.m2\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"false\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    verify(container_match1).getName();\n    verify(container_match2).getName();\n    // both containers no actions\n    verifyNoMoreInteractions(container_match1, container_match2);\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Unable to mount secret 'test_secret': It is configured to be mounted as a file but the mount path was not specified. Please define the 'che.eclipse.org/mount-path' annotation on the secret to specify it.\")\n  public void shouldThrowExceptionWhenNoMountPathSpecifiedForFiles() throws Exception {\n    Container container_match = new ContainerBuilder().withName(\"maven\").build();\n\n    PodSpec localSpec =\n        new PodSpecBuilder().withContainers(ImmutableList.of(container_match)).build();\n\n    when(podData.getSpec()).thenReturn(localSpec);\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"settings.xml\", \"random\", \"another.xml\", \"freedom\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(singletonMap(ANNOTATION_MOUNT_AS, \"file\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n    when(secrets.get(any(LabelSelector.class))).thenReturn(singletonList(secret));\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n  }\n\n  @Test\n  public void shouldNotUseSubpathForOlderK8s() throws InfrastructureException {\n    lenient().when(kubernetesVersion.newerOrEqualThan(1, 13)).thenReturn(false);\n    lenient().when(kubernetesVersion.olderThan(1, 13)).thenReturn(true);\n\n    Container container_match1 = new ContainerBuilder().withName(\"maven\").build();\n\n    PodSpec localSpec =\n        new PodSpecBuilder().withContainers(ImmutableList.of(container_match1)).build();\n\n    when(podData.getSpec()).thenReturn(localSpec);\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"settings.xml\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.m2\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    // pod has volume created\n    assertEquals(environment.getPodsData().get(\"pod1\").getSpec().getVolumes().size(), 1);\n    Volume volume = environment.getPodsData().get(\"pod1\").getSpec().getVolumes().get(0);\n    assertEquals(volume.getName(), \"test_secret\");\n    assertEquals(volume.getSecret().getSecretName(), \"test_secret\");\n\n    assertEquals(\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .size(),\n        1);\n    VolumeMount mount1 =\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .get(0);\n    assertEquals(mount1.getName(), \"test_secret\");\n    assertEquals(mount1.getMountPath(), \"/home/user/.m2\");\n    assertNull(mount1.getSubPath());\n  }\n\n  @Test\n  public void shouldNotOverrideExistingVolumeMounts() throws InfrastructureException {\n    Container container_match1 =\n        new ContainerBuilder()\n            .withName(\"maven\")\n            .withVolumeMounts(\n                new VolumeMountBuilder()\n                    .withName(\"existing-volume\")\n                    .withMountPath(\"/home/user/.m2\")\n                    .build())\n            .build();\n\n    PodSpec localSpec =\n        new PodSpecBuilder().withContainers(ImmutableList.of(container_match1)).build();\n\n    when(podData.getSpec()).thenReturn(localSpec);\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"settings.xml\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.m2\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    // pod has volume created\n    assertEquals(environment.getPodsData().get(\"pod1\").getSpec().getVolumes().size(), 1);\n    Volume volume = environment.getPodsData().get(\"pod1\").getSpec().getVolumes().get(0);\n    assertEquals(volume.getName(), \"test_secret\");\n    assertEquals(volume.getSecret().getSecretName(), \"test_secret\");\n\n    assertEquals(\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .size(),\n        2);\n    VolumeMount mount1 =\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .get(0);\n    assertEquals(mount1.getName(), \"existing-volume\");\n    assertEquals(mount1.getMountPath(), \"/home/user/.m2\");\n    assertNull(mount1.getSubPath());\n\n    VolumeMount mount2 =\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .get(1);\n    assertEquals(mount2.getName(), \"test_secret\");\n    assertEquals(mount2.getMountPath(), \"/home/user/.m2/settings.xml\");\n    assertEquals(mount2.getSubPath(), \"settings.xml\");\n  }\n\n  @Test\n  public void shouldOverrideExistingVolumeMountsOnOlderK8s() throws InfrastructureException {\n    lenient().when(kubernetesVersion.newerOrEqualThan(1, 13)).thenReturn(false);\n    lenient().when(kubernetesVersion.olderThan(1, 13)).thenReturn(true);\n\n    Container container_match1 =\n        new ContainerBuilder()\n            .withName(\"maven\")\n            .withVolumeMounts(\n                new VolumeMountBuilder()\n                    .withName(\"existing-volume\")\n                    .withMountPath(\"/home/user/.m2\")\n                    .build())\n            .build();\n\n    PodSpec localSpec =\n        new PodSpecBuilder().withContainers(ImmutableList.of(container_match1)).build();\n\n    when(podData.getSpec()).thenReturn(localSpec);\n\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"settings.xml\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.m2\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n\n    // pod has volume created\n    assertEquals(environment.getPodsData().get(\"pod1\").getSpec().getVolumes().size(), 1);\n    Volume volume = environment.getPodsData().get(\"pod1\").getSpec().getVolumes().get(0);\n    assertEquals(volume.getName(), \"test_secret\");\n    assertEquals(volume.getSecret().getSecretName(), \"test_secret\");\n\n    assertEquals(\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .size(),\n        1);\n    VolumeMount secretMount =\n        environment\n            .getPodsData()\n            .get(\"pod1\")\n            .getSpec()\n            .getContainers()\n            .get(0)\n            .getVolumeMounts()\n            .get(0);\n    assertEquals(secretMount.getName(), \"test_secret\");\n    assertEquals(secretMount.getMountPath(), \"/home/user/.m2\");\n    assertNull(secretMount.getSubPath());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/secret/GitCredentialStorageFileSecretApplierTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.GitConfigProvisioner.GIT_CONFIG_MAP_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_AUTOMOUNT;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_GIT_CREDENTIALS;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_AS;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_PATH;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_USER_NAME;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.K8sVersion;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.GitConfigProvisioner;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GitCredentialStorageFileSecretApplierTest {\n\n  @Mock private KubernetesEnvironment environment;\n\n  @Mock private KubernetesEnvironment.PodData podData;\n\n  @Mock private PodSpec podSpec;\n\n  @Mock private RuntimeIdentity runtimeIdentity;\n\n  @Mock private K8sVersion kubernetesVersion;\n\n  GitCredentialStorageFileSecretApplier secretApplier;\n\n  public static final String GIT_CONFIG_CONTENT =\n      \"[user]\\n\\tname = Michelangelo Merisi da Caravaggio\\n\\tmail = mcaravag@email.not.exists.com\";\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    lenient().when(kubernetesVersion.newerOrEqualThan(1, 13)).thenReturn(true);\n    lenient().when(kubernetesVersion.olderThan(1, 13)).thenReturn(false);\n    secretApplier = new GitCredentialStorageFileSecretApplier(kubernetesVersion);\n    when(environment.getPodsData()).thenReturn(singletonMap(\"pod1\", podData));\n    when(podData.getRole()).thenReturn(KubernetesEnvironment.PodRole.DEPLOYMENT);\n    when(podData.getSpec()).thenReturn(podSpec);\n    lenient().when(runtimeIdentity.getWorkspaceId()).thenReturn(\"ws-1234598\");\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Invalid git credential secret data. It should contain only 1 data item but it have 2\")\n  public void shouldThrowInfrastructureExceptionIfSecretsHasMoreOrLessWhen1Data()\n      throws InfrastructureException {\n    // given\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"credentials\", \"random\", \"credentials2\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.git\",\n                            ANNOTATION_GIT_CREDENTIALS,\n                            \"true\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n    // when\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n  }\n\n  @Test\n  public void shouldBeAbleToAdjustGiConfigConfigMap() throws InfrastructureException {\n    // given\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"credentials\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.git\",\n                            ANNOTATION_GIT_CREDENTIALS,\n                            \"true\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    ConfigMap configMap =\n        new ConfigMapBuilder()\n            .withData(ImmutableMap.of(GitConfigProvisioner.GIT_CONFIG, GIT_CONFIG_CONTENT))\n            .build();\n    when(environment.getConfigMaps()).thenReturn(ImmutableMap.of(GIT_CONFIG_MAP_NAME, configMap));\n    // when\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n    // then\n    String data = configMap.getData().get(GitConfigProvisioner.GIT_CONFIG);\n    assertTrue(\n        data.endsWith(\"[credential]\\n\\thelper = store --file /home/user/.git/credentials\\n\"));\n    assertTrue(data.startsWith(GIT_CONFIG_CONTENT));\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Multiple git credential secrets for user user5 found in namespace test-ns. That may be caused by reinstalling product without user namespaces cleanup or using multiple instances of product with the same namespace namings template.\")\n  public void shouldThrowInfrastructureExceptionIfGitConfigAlreadyContainsSecretConfig()\n      throws InfrastructureException {\n    // given\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"credentials\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.git\",\n                            ANNOTATION_GIT_CREDENTIALS,\n                            \"true\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\",\n                            ANNOTATION_USER_NAME,\n                            \"user5\"))\n                    .withLabels(emptyMap())\n                    .withNamespace(\"test-ns\")\n                    .build())\n            .build();\n\n    ConfigMap configMap =\n        new ConfigMapBuilder()\n            .withData(\n                ImmutableMap.of(\n                    GitConfigProvisioner.GIT_CONFIG,\n                    GIT_CONFIG_CONTENT\n                        + \"[credential]\\n\\thelper = store --file /home/user/.git/credentials\\n\"))\n            .build();\n    when(environment.getConfigMaps()).thenReturn(ImmutableMap.of(GIT_CONFIG_MAP_NAME, configMap));\n    // when\n    secretApplier.applySecret(environment, runtimeIdentity, secret);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/secret/SecretAsContainerResourceProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_AUTOMOUNT;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_ENV_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_GIT_CREDENTIALS;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_AS;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_PATH;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\nimport static org.mockito.Mockito.when;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.LabelSelector;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesSecrets;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class SecretAsContainerResourceProvisionerTest {\n\n  @Mock EnvironmentVariableSecretApplier environmentVariableSecretApplier;\n  @Mock GitCredentialStorageFileSecretApplier gitCredentialStorageFileSecretApplier;\n  @Mock FileSecretApplier fileSecretApplier;\n\n  private SecretAsContainerResourceProvisioner<KubernetesEnvironment> provisioner;\n\n  @Mock private KubernetesEnvironment environment;\n\n  @Mock private KubernetesNamespace namespace;\n\n  @Mock private KubernetesSecrets secrets;\n\n  @Mock private RuntimeIdentity runtimeIdentity;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    when(namespace.secrets()).thenReturn(secrets);\n    provisioner =\n        new SecretAsContainerResourceProvisioner<>(\n            fileSecretApplier,\n            environmentVariableSecretApplier,\n            gitCredentialStorageFileSecretApplier,\n            new String[] {\"app:che\"});\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Unable to mount secret 'test_secret': it has missing or unknown type of the mount. Please make sure that 'che.eclipse.org/mount-as' annotation has value either 'env' or 'file'.\")\n  public void shouldThrowExceptionWhenNoMountTypeSpecified() throws Exception {\n    // given\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"settings.xml\", \"random\", \"another.xml\", \"freedom\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(emptyMap())\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n    when(secrets.get(any(LabelSelector.class))).thenReturn(singletonList(secret));\n    // when\n    provisioner.provision(environment, runtimeIdentity, namespace);\n  }\n\n  @Test\n  public void shouldCallEnvironmentVariableSecretApplier() throws InfrastructureException {\n    // given\n    Secret secret =\n        new SecretBuilder()\n            .withData(singletonMap(\"foo\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_ENV_NAME,\n                            \"MY_FOO\",\n                            ANNOTATION_MOUNT_AS,\n                            \"env\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    when(secrets.get(any(LabelSelector.class))).thenReturn(singletonList(secret));\n    // when\n    provisioner.provision(environment, runtimeIdentity, namespace);\n    // then\n    verify(environmentVariableSecretApplier)\n        .applySecret(eq(environment), eq(runtimeIdentity), eq(secret));\n    verifyNoMoreInteractions(fileSecretApplier);\n    verifyNoMoreInteractions(gitCredentialStorageFileSecretApplier);\n  }\n\n  @Test\n  public void shouldCallFileSecretApplier() throws InfrastructureException {\n    // given\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"settings.xml\", \"random\", \"another.xml\", \"freedom\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.m2\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    when(secrets.get(any(LabelSelector.class))).thenReturn(singletonList(secret));\n    // when\n    provisioner.provision(environment, runtimeIdentity, namespace);\n    // then\n    verify(fileSecretApplier).applySecret(eq(environment), eq(runtimeIdentity), eq(secret));\n    verifyNoMoreInteractions(environmentVariableSecretApplier);\n    verifyNoMoreInteractions(gitCredentialStorageFileSecretApplier);\n  }\n\n  @Test\n  public void shouldCallGitCredentialStorageFileSecretApplier() throws InfrastructureException {\n    // given\n    Secret secret =\n        new SecretBuilder()\n            .withData(ImmutableMap.of(\"credentials\", \"random\"))\n            .withMetadata(\n                new ObjectMetaBuilder()\n                    .withName(\"test_secret\")\n                    .withAnnotations(\n                        ImmutableMap.of(\n                            ANNOTATION_MOUNT_AS,\n                            \"file\",\n                            ANNOTATION_MOUNT_PATH,\n                            \"/home/user/.git\",\n                            ANNOTATION_GIT_CREDENTIALS,\n                            \"true\",\n                            ANNOTATION_AUTOMOUNT,\n                            \"true\"))\n                    .withLabels(emptyMap())\n                    .build())\n            .build();\n\n    when(secrets.get(any(LabelSelector.class))).thenReturn(singletonList(secret));\n    // when\n    provisioner.provision(environment, runtimeIdentity, namespace);\n    // then\n    verify(gitCredentialStorageFileSecretApplier)\n        .applySecret(eq(environment), eq(runtimeIdentity), eq(secret));\n    verifyNoMoreInteractions(environmentVariableSecretApplier);\n    verifyNoMoreInteractions(fileSecretApplier);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/IngressServerResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server;\n\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServiceBuilder;\nimport io.fabric8.kubernetes.api.model.ServicePortBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressPath;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressRuleValue;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressLoadBalancerStatusBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressRule;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressServiceBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.ServiceBackendPort;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.runtime.ServerStatus;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerImpl;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations.Serializer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServiceExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.IngressPathTransformInverter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver.IngressServerResolver;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver.ServerResolver;\nimport org.mockito.Mockito;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\n/**\n * Test for {@link IngressServerResolver}.\n *\n * @author Sergii Leshchenko\n */\npublic class IngressServerResolverTest {\n\n  private static final Map<String, String> ATTRIBUTES_MAP = singletonMap(\"key\", \"value\");\n  private static final int CONTAINER_PORT = 3054;\n  private static final String INGRESS_IP = \"127.0.0.1\";\n  private static final String INGRESS_RULE_PATH_PREFIX = \"/server-8080\";\n  private static final String INGRESS_PATH_PREFIX = \"server-8080\";\n\n  private ExternalServiceExposureStrategy externalServiceExposureStrategy;\n\n  @BeforeMethod\n  public void setupMocks() {\n    externalServiceExposureStrategy = Mockito.mock(ExternalServiceExposureStrategy.class);\n  }\n\n  @Test\n  public void\n      testResolvingServersWhenThereIsNoTheCorrespondingServiceAndIngressForTheSpecifiedMachine() {\n    // given\n    Service nonMatchedByPodService =\n        createService(\"nonMatched\", \"foreignMachine\", CONTAINER_PORT, null);\n    Ingress ingress =\n        createIngress(\n            \"nonMatched\",\n            \"foreignMachine\",\n            Pair.of(\"http-server\", new ServerConfigImpl(\"3054\", \"http\", \"/api\", ATTRIBUTES_MAP)));\n\n    ServerResolver serverResolver =\n        new IngressServerResolver(\n            new NoopPathTransformInverter(),\n            singletonList(nonMatchedByPodService),\n            singletonList(ingress));\n\n    // when\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    // then\n    assertTrue(resolved.isEmpty());\n  }\n\n  @Test\n  public void testResolvingServersWhenThereIsMatchedIngressForTheSpecifiedMachine() {\n    Ingress ingress =\n        createIngress(\n            \"matched\",\n            \"machine\",\n            Pair.of(\"http-server\", new ServerConfigImpl(\"3054\", \"http\", \"/api/\", ATTRIBUTES_MAP)));\n\n    ServerResolver serverResolver =\n        new IngressServerResolver(\n            new NoopPathTransformInverter(), emptyList(), singletonList(ingress));\n\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    assertEquals(resolved.size(), 1);\n    assertEquals(\n        resolved.get(\"http-server\"),\n        new ServerImpl()\n            .withUrl(\"http://\" + INGRESS_IP + INGRESS_RULE_PATH_PREFIX + \"/api/\")\n            .withStatus(ServerStatus.UNKNOWN)\n            .withAttributes(\n                defaultAttributeAnd(\n                    Constants.SERVER_PORT_ATTRIBUTE,\n                    \"3054\",\n                    ServerConfig.ENDPOINT_ORIGIN,\n                    INGRESS_PATH_PREFIX + \"/\")));\n  }\n\n  @Test\n  public void testResolvingServersWhenThereIsMatchedIngressForMachineAndServerPathIsNull() {\n    Ingress ingress =\n        createIngress(\n            \"matched\",\n            \"machine\",\n            Pair.of(\"http-server\", new ServerConfigImpl(\"3054\", \"http\", null, ATTRIBUTES_MAP)));\n\n    ServerResolver serverResolver =\n        new IngressServerResolver(\n            new NoopPathTransformInverter(), emptyList(), singletonList(ingress));\n\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    assertEquals(resolved.size(), 1);\n    assertEquals(\n        resolved.get(\"http-server\"),\n        new ServerImpl()\n            .withUrl(\"http://\" + INGRESS_IP + INGRESS_RULE_PATH_PREFIX + \"/\")\n            .withStatus(ServerStatus.UNKNOWN)\n            .withAttributes(\n                defaultAttributeAnd(\n                    Constants.SERVER_PORT_ATTRIBUTE,\n                    \"3054\",\n                    ServerConfig.ENDPOINT_ORIGIN,\n                    INGRESS_PATH_PREFIX + \"/\")));\n  }\n\n  @Test\n  public void testResolvingServersWhenThereIsMatchedIngressForMachineAndServerPathIsEmpty() {\n    Ingress ingress =\n        createIngress(\n            \"matched\",\n            \"machine\",\n            Pair.of(\"http-server\", new ServerConfigImpl(\"3054\", \"http\", \"\", ATTRIBUTES_MAP)));\n\n    ServerResolver serverResolver =\n        new IngressServerResolver(\n            new NoopPathTransformInverter(), emptyList(), singletonList(ingress));\n\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    assertEquals(resolved.size(), 1);\n    assertEquals(\n        resolved.get(\"http-server\"),\n        new ServerImpl()\n            .withUrl(\"http://\" + INGRESS_IP + INGRESS_RULE_PATH_PREFIX + \"/\")\n            .withStatus(ServerStatus.UNKNOWN)\n            .withAttributes(\n                defaultAttributeAnd(\n                    Constants.SERVER_PORT_ATTRIBUTE,\n                    \"3054\",\n                    ServerConfig.ENDPOINT_ORIGIN,\n                    INGRESS_PATH_PREFIX + \"/\")));\n  }\n\n  @Test\n  public void testResolvingServersWhenThereIsMatchedIngressForMachineAndServerPathIsRelative() {\n    Ingress ingress =\n        createIngress(\n            \"matched\",\n            \"machine\",\n            Pair.of(\"http-server\", new ServerConfigImpl(\"3054\", \"http\", \"api\", ATTRIBUTES_MAP)));\n\n    ServerResolver serverResolver =\n        new IngressServerResolver(\n            new NoopPathTransformInverter(), emptyList(), singletonList(ingress));\n\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    assertEquals(resolved.size(), 1);\n    assertEquals(\n        resolved.get(\"http-server\"),\n        new ServerImpl()\n            .withUrl(\"http://\" + INGRESS_IP + INGRESS_RULE_PATH_PREFIX + \"/api/\")\n            .withStatus(ServerStatus.UNKNOWN)\n            .withAttributes(\n                defaultAttributeAnd(\n                    Constants.SERVER_PORT_ATTRIBUTE,\n                    \"3054\",\n                    ServerConfig.ENDPOINT_ORIGIN,\n                    INGRESS_PATH_PREFIX + \"/\")));\n  }\n\n  @Test\n  public void testResolvingInternalServers() {\n    Service service =\n        createService(\n            \"service11\",\n            \"machine\",\n            CONTAINER_PORT,\n            singletonMap(\n                \"http-server\", new ServerConfigImpl(\"3054\", \"http\", \"api\", ATTRIBUTES_MAP)));\n\n    ServerResolver serverResolver =\n        new IngressServerResolver(\n            new NoopPathTransformInverter(), singletonList(service), emptyList());\n\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    assertEquals(resolved.size(), 1);\n    assertEquals(\n        resolved.get(\"http-server\"),\n        new ServerImpl()\n            .withUrl(\"http://service11:3054/api\")\n            .withStatus(ServerStatus.UNKNOWN)\n            .withAttributes(\n                defaultAttributeAnd(\n                    Constants.SERVER_PORT_ATTRIBUTE, \"3054\", ServerConfig.ENDPOINT_ORIGIN, \"/\")));\n  }\n\n  @Test\n  public void testResolvingInternalServersWithPortWithTransportProtocol() {\n    Service service =\n        createService(\n            \"service11\",\n            \"machine\",\n            CONTAINER_PORT,\n            singletonMap(\n                \"http-server\", new ServerConfigImpl(\"3054/udp\", \"xxx\", \"api\", ATTRIBUTES_MAP)));\n\n    ServerResolver serverResolver =\n        new IngressServerResolver(\n            new NoopPathTransformInverter(), singletonList(service), emptyList());\n\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    assertEquals(resolved.size(), 1);\n    assertEquals(\n        resolved.get(\"http-server\"),\n        new ServerImpl()\n            .withUrl(\"xxx://service11:3054/api\")\n            .withStatus(ServerStatus.UNKNOWN)\n            .withAttributes(\n                defaultAttributeAnd(\n                    Constants.SERVER_PORT_ATTRIBUTE, \"3054\", ServerConfig.ENDPOINT_ORIGIN, \"/\")));\n  }\n\n  private Service createService(\n      String name, String machineName, Integer port, Map<String, ServerConfigImpl> servers) {\n    Serializer serializer = Annotations.newSerializer();\n    serializer.machineName(machineName);\n    if (servers != null) {\n      serializer.servers(servers);\n    }\n\n    return new ServiceBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .withAnnotations(serializer.annotations())\n        .endMetadata()\n        .withNewSpec()\n        .withPorts(\n            new ServicePortBuilder()\n                .withPort(port)\n                .withNewTargetPort()\n                .withValue(port)\n                .endTargetPort()\n                .build())\n        .endSpec()\n        .build();\n  }\n\n  private Ingress createIngress(\n      String name, String machineName, Pair<String, ServerConfig> server) {\n    Serializer serializer = Annotations.newSerializer();\n    serializer.machineName(machineName);\n    serializer.server(server.first, server.second);\n\n    return new IngressBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .withAnnotations(serializer.annotations())\n        .endMetadata()\n        .withNewSpec()\n        .withRules(\n            new IngressRule(\n                null,\n                new HTTPIngressRuleValue(\n                    singletonList(\n                        new HTTPIngressPath(\n                            new IngressBackend(\n                                null,\n                                new IngressServiceBackend(\n                                    name, new ServiceBackendPort(\"8080\", 8080))),\n                            INGRESS_PATH_PREFIX,\n                            null)))))\n        .endSpec()\n        .withNewStatus()\n        .withLoadBalancer(\n            new IngressLoadBalancerStatusBuilder()\n                .addNewIngress()\n                .withIp(\"127.0.0.1\")\n                .endIngress()\n                .build())\n        .endStatus()\n        .build();\n  }\n\n  private Map<String, String> defaultAttributeAnd(String... keyValues) {\n    HashMap<String, String> attributes = new HashMap<>(ATTRIBUTES_MAP);\n    String key = null;\n    for (String v : keyValues) {\n      if (key == null) {\n        key = v;\n      } else {\n        attributes.put(key, v);\n        key = null;\n      }\n    }\n    return attributes;\n  }\n\n  private static final class NoopPathTransformInverter extends IngressPathTransformInverter {\n    NoopPathTransformInverter() {\n      super(\"%s\");\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/KubernetesServerExposerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server;\n\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.DISCOVERABLE_SERVER_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVER_NAME_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer.SERVER_PREFIX;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer.SERVER_UNIQUE_PART_SIZE;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.ArgumentMatchers.isNull;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.ContainerPortBuilder;\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServicePortBuilder;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Optional;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.IngressServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposer;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Test for {@link KubernetesServerExposer}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesServerExposerTest {\n\n  @Mock private IngressServerExposer externalServerExposer;\n  @Mock private SecureServerExposer<KubernetesEnvironment> secureServerExposer;\n\n  private static final Map<String, String> ATTRIBUTES_MAP = singletonMap(\"key\", \"value\");\n  private static final Map<String, String> INTERNAL_SERVER_ATTRIBUTE_MAP =\n      singletonMap(ServerConfig.INTERNAL_SERVER_ATTRIBUTE, Boolean.TRUE.toString());\n\n  private static final Map<String, String> SECURE_SERVER_ATTRIBUTE_MAP =\n      singletonMap(ServerConfig.SECURE_SERVER_ATTRIBUTE, Boolean.TRUE.toString());\n\n  private static final Pattern SERVER_PREFIX_REGEX =\n      Pattern.compile('^' + SERVER_PREFIX + \"[A-z0-9]{\" + SERVER_UNIQUE_PART_SIZE + \"}-pod-main$\");\n  private static final String MACHINE_NAME = \"pod/main\";\n  private static final Map<String, String> UNIQUE_SERVER_ATTRIBUTES =\n      ImmutableMap.of(\"key\", \"value\", ServerConfig.UNIQUE_SERVER_ATTRIBUTE, \"true\");\n  private static final String SERVICE_NAME = SERVER_PREFIX + \"12345678\" + \"-\" + MACHINE_NAME;\n\n  private KubernetesServerExposer<KubernetesEnvironment> serverExposer;\n  private KubernetesEnvironment kubernetesEnvironment;\n  private Container container;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    container = new ContainerBuilder().withName(\"main\").build();\n    Pod pod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"pod\")\n            .endMetadata()\n            .withNewSpec()\n            .withContainers(container)\n            .endSpec()\n            .build();\n\n    kubernetesEnvironment =\n        KubernetesEnvironment.builder().setPods(ImmutableMap.of(\"pod\", pod)).build();\n\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    this.serverExposer =\n        new KubernetesServerExposer<>(\n            externalServerExposer,\n            secureServerExposer,\n            MACHINE_NAME,\n            podData,\n            container,\n            kubernetesEnvironment);\n  }\n\n  @Test\n  public void shouldExposeContainerPortAndCreateServiceForServer() throws Exception {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", ATTRIBUTES_MAP);\n    Map<String, ServerConfigImpl> serversToExpose =\n        ImmutableMap.of(\"http-server\", httpServerConfig);\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    // then\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME,\n        \"tcp\",\n        8080,\n        \"http-server\",\n        new ServerConfigImpl(httpServerConfig).withAttributes(ATTRIBUTES_MAP));\n  }\n\n  @Test\n  public void shouldExposeContainerPortAndCreateServiceAndForServerWhenTwoServersHasTheSamePort()\n      throws Exception {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", ATTRIBUTES_MAP);\n    ServerConfigImpl wsServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"ws\", \"/connect\", ATTRIBUTES_MAP);\n    Map<String, ServerConfigImpl> serversToExpose =\n        ImmutableMap.of(\n            \"http-server\", httpServerConfig,\n            \"ws-server\", wsServerConfig);\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    // then\n    assertEquals(kubernetesEnvironment.getServices().size(), 1);\n\n    assertThatExternalServersAreExposed(\n        MACHINE_NAME,\n        \"tcp\",\n        8080,\n        ImmutableMap.of(\n            \"http-server\",\n            new ServerConfigImpl(httpServerConfig).withAttributes(ATTRIBUTES_MAP),\n            \"ws-server\",\n            new ServerConfigImpl(wsServerConfig).withAttributes(ATTRIBUTES_MAP)));\n  }\n\n  @Test\n  public void shouldExposeContainerPortsAndCreateServiceForServerWhenTwoServersHasDifferentPorts()\n      throws Exception {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", ATTRIBUTES_MAP);\n    ServerConfigImpl wsServerConfig =\n        new ServerConfigImpl(\"8081/tcp\", \"ws\", \"/connect\", ATTRIBUTES_MAP);\n    Map<String, ServerConfigImpl> serversToExpose =\n        ImmutableMap.of(\n            \"http-server\", httpServerConfig,\n            \"ws-server\", wsServerConfig);\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    // then\n    assertEquals(kubernetesEnvironment.getServices().size(), 1);\n\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME,\n        \"tcp\",\n        8080,\n        \"http-server\",\n        new ServerConfigImpl(httpServerConfig).withAttributes(ATTRIBUTES_MAP));\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME,\n        \"tcp\",\n        8081,\n        \"ws-server\",\n        new ServerConfigImpl(wsServerConfig).withAttributes(ATTRIBUTES_MAP));\n  }\n\n  @Test\n  public void shouldExposeTcpContainerPortsAndCreateServiceAndForServerWhenProtocolIsMissedInPort()\n      throws Exception {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\"8080\", \"http\", \"/api\", ATTRIBUTES_MAP);\n    Map<String, ServerConfigImpl> serversToExpose =\n        ImmutableMap.of(\"http-server\", httpServerConfig);\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    // then\n    assertEquals(kubernetesEnvironment.getServices().size(), 1);\n\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME,\n        \"TCP\",\n        8080,\n        \"http-server\",\n        new ServerConfigImpl(httpServerConfig).withAttributes(ATTRIBUTES_MAP));\n  }\n\n  @Test\n  public void shouldNotAddAdditionalContainerPortWhenItIsAlreadyExposed() throws Exception {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", ATTRIBUTES_MAP);\n    Map<String, ServerConfigImpl> serversToExpose =\n        ImmutableMap.of(\"http-server\", httpServerConfig);\n    container.setPorts(\n        singletonList(\n            new ContainerPortBuilder()\n                .withName(\"port-8080\")\n                .withContainerPort(8080)\n                .withProtocol(\"TCP\")\n                .build()));\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    // then\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME,\n        \"tcp\",\n        8080,\n        \"http-server\",\n        new ServerConfigImpl(httpServerConfig).withAttributes(ATTRIBUTES_MAP));\n  }\n\n  @Test\n  public void shouldAddAdditionalContainerPortWhenThereIsTheSameButWithDifferentProtocol()\n      throws Exception {\n    // given\n    ServerConfigImpl udpServerConfig =\n        new ServerConfigImpl(\"8080/udp\", \"udp\", \"/api\", ATTRIBUTES_MAP);\n    Map<String, ServerConfigImpl> serversToExpose = ImmutableMap.of(\"server\", udpServerConfig);\n    container.setPorts(\n        new ArrayList<>(\n            singletonList(\n                new ContainerPortBuilder()\n                    .withName(\"port-8080\")\n                    .withContainerPort(8080)\n                    .withProtocol(\"TCP\")\n                    .build())));\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    // then\n    assertEquals(container.getPorts().size(), 2);\n    assertEquals(container.getPorts().get(1).getContainerPort(), new Integer(8080));\n    assertEquals(container.getPorts().get(1).getProtocol(), \"UDP\");\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME,\n        \"udp\",\n        8080,\n        \"server\",\n        new ServerConfigImpl(udpServerConfig).withAttributes(ATTRIBUTES_MAP));\n  }\n\n  @Test\n  public void shouldExposeContainerPortAndCreateServiceForInternalServer() throws Exception {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", INTERNAL_SERVER_ATTRIBUTE_MAP);\n    Map<String, ServerConfigImpl> serversToExpose =\n        ImmutableMap.of(\"http-server\", httpServerConfig);\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    // then\n    assertThatInternalServerIsExposed(\n        MACHINE_NAME,\n        \"http-server\",\n        \"tcp\",\n        8080,\n        new ServerConfigImpl(httpServerConfig).withAttributes(INTERNAL_SERVER_ATTRIBUTE_MAP));\n  }\n\n  @Test\n  public void shouldExposeInternalAndExternalAndSecureServers() throws Exception {\n    // given\n    ServerConfigImpl secureServerConfig =\n        new ServerConfigImpl(\"8282/tcp\", \"http\", \"/api\", SECURE_SERVER_ATTRIBUTE_MAP);\n    ServerConfigImpl internalServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", INTERNAL_SERVER_ATTRIBUTE_MAP);\n    ServerConfigImpl externalServerConfig =\n        new ServerConfigImpl(\"9090/tcp\", \"http\", \"/api\", ATTRIBUTES_MAP);\n    Map<String, ServerConfigImpl> serversToExpose =\n        ImmutableMap.of(\n            \"int-server\",\n            internalServerConfig,\n            \"ext-server\",\n            externalServerConfig,\n            \"secure-server\",\n            secureServerConfig);\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    // then\n    assertThatInternalServerIsExposed(\n        MACHINE_NAME, \"int-server\", \"tcp\", 8080, new ServerConfigImpl(internalServerConfig));\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME, \"tcp\", 9090, \"ext-server\", new ServerConfigImpl(externalServerConfig));\n    assertThatSecureServerIsExposed(\n        MACHINE_NAME, \"tcp\", 8282, \"secure-server\", new ServerConfigImpl(secureServerConfig));\n  }\n\n  @Test\n  public void shouldCreateIngressPerUniqueServerWithTheSamePort() throws Exception {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", UNIQUE_SERVER_ATTRIBUTES);\n    ServerConfigImpl wsServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"ws\", \"/connect\", UNIQUE_SERVER_ATTRIBUTES);\n    ServicePort servicePort =\n        new ServicePortBuilder()\n            .withName(\"server-8080\")\n            .withPort(8080)\n            .withProtocol(\"TCP\")\n            .withTargetPort(new IntOrString(8080))\n            .build();\n\n    Map<String, ServerConfig> serversToExpose =\n        ImmutableMap.of(\n            \"http-server\", httpServerConfig,\n            \"ws-server\", wsServerConfig);\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    // then\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME,\n        \"tcp\",\n        8080,\n        \"http-server\",\n        new ServerConfigImpl(httpServerConfig).withAttributes(UNIQUE_SERVER_ATTRIBUTES));\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME,\n        \"tcp\",\n        8080,\n        \"ws-server\",\n        new ServerConfigImpl(wsServerConfig).withAttributes(UNIQUE_SERVER_ATTRIBUTES));\n  }\n\n  @Test\n  public void shouldCreateIngressForServerWhenTwoServersHasTheSamePort()\n      throws InfrastructureException {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", ATTRIBUTES_MAP);\n    ServerConfigImpl wsServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"ws\", \"/connect\", ATTRIBUTES_MAP);\n    IntOrString targetPort = new IntOrString(8080);\n\n    ServicePort servicePort =\n        new ServicePortBuilder()\n            .withName(\"server-8080\")\n            .withPort(8080)\n            .withProtocol(\"TCP\")\n            .withTargetPort(targetPort)\n            .build();\n\n    Map<String, ServerConfig> serversToExpose =\n        ImmutableMap.of(\n            \"http-server\", httpServerConfig,\n            \"ws-server\", wsServerConfig);\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    // then\n    assertThatExternalServersAreExposed(\n        MACHINE_NAME,\n        \"tcp\",\n        8080,\n        ImmutableMap.of(\n            \"http-server\", new ServerConfigImpl(httpServerConfig).withAttributes(ATTRIBUTES_MAP),\n            \"ws-server\", new ServerConfigImpl(wsServerConfig).withAttributes(ATTRIBUTES_MAP)));\n  }\n\n  @Test\n  public void testCreateExtraServiceForDiscoverableServerConfig() throws InfrastructureException {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\n            \"8080/tcp\",\n            \"http\",\n            \"/api\",\n            ImmutableMap.of(SERVER_NAME_ATTRIBUTE, \"hello\", DISCOVERABLE_SERVER_ATTRIBUTE, \"true\"));\n    Map<String, ServerConfigImpl> serversToExpose =\n        ImmutableMap.of(\"http-server\", httpServerConfig);\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    assertEquals(kubernetesEnvironment.getServices().size(), 2);\n    assertTrue(kubernetesEnvironment.getServices().containsKey(\"hello\"));\n    assertEquals(kubernetesEnvironment.getServices().get(\"hello\").getMetadata().getName(), \"hello\");\n  }\n\n  @Test\n  public void testDiscoverableServerConfigWithoutNameAttributeIsNotProvisioned()\n      throws InfrastructureException {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\n            \"8080/tcp\", \"http\", \"/api\", ImmutableMap.of(DISCOVERABLE_SERVER_ATTRIBUTE, \"true\"));\n    Map<String, ServerConfigImpl> serversToExpose =\n        ImmutableMap.of(\"http-server\", httpServerConfig);\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    assertEquals(kubernetesEnvironment.getServices().size(), 1);\n    assertFalse(kubernetesEnvironment.getServices().containsKey(\"hello\"));\n  }\n\n  @Test\n  public void testExposeUniqueSecureServersWithOnlyMatchingServers()\n      throws InfrastructureException {\n    // https://github.com/eclipse/che/issues/16330\n    // given 2 servers which one of them is unique\n    ServerConfigImpl theiaSC =\n        new ServerConfigImpl(\n            \"3100/tcp\",\n            \"https\",\n            null,\n            ImmutableMap.of(\n                \"internal\", \"false\", \"discoverable\", \"false\", \"secure\", \"true\", \"type\", \"ide\"));\n\n    ServerConfigImpl webviewsSC =\n        new ServerConfigImpl(\n            \"3100/tcp\",\n            \"https\",\n            null,\n            ImmutableMap.of(\n                \"internal\",\n                \"false\",\n                \"discoverable\",\n                \"false\",\n                \"unique\",\n                \"true\",\n                \"secure\",\n                \"true\",\n                \"type\",\n                \"webview\"));\n    Map<String, ServerConfigImpl> serversToExpose =\n        ImmutableMap.of(\"theia\", theiaSC, \"webviews\", webviewsSC);\n\n    // when\n    serverExposer.expose(serversToExpose);\n\n    // then expose is called twice with only one server each\n    ArgumentCaptor<Map<String, ServerConfig>> serversCaptor = ArgumentCaptor.forClass(Map.class);\n    verify(secureServerExposer, times(2))\n        .expose(any(), any(), any(), any(), any(), any(), serversCaptor.capture());\n    for (Map<String, ServerConfig> captures : serversCaptor.getAllValues()) {\n      assertEquals(captures.size(), 1);\n    }\n  }\n\n  @SuppressWarnings(\"SameParameterValue\")\n  private void assertThatExternalServerIsExposed(\n      String machineName,\n      String portProtocol,\n      Integer port,\n      String serverName,\n      ServerConfig expectedServer) {\n    assertThatExternalServersAreExposed(\n        machineName, portProtocol, port, ImmutableMap.of(serverName, expectedServer));\n  }\n\n  @SuppressWarnings(\"SameParameterValue\")\n  private void assertThatExternalServersAreExposed(\n      String machineName,\n      String portProtocol,\n      Integer port,\n      Map<String, ServerConfig> expectedServers) {\n    // then\n    assertThatContainerPortIsExposed(portProtocol, port);\n    // ensure that service is created\n\n    Service service = findContainerRelatedService();\n    assertNotNull(service);\n\n    // ensure that required service port is exposed\n    ServicePort servicePort = assertThatServicePortIsExposed(port, service);\n\n    Annotations.Deserializer serviceAnnotations =\n        Annotations.newDeserializer(service.getMetadata().getAnnotations());\n    assertEquals(serviceAnnotations.machineName(), machineName);\n    // check that we did not create servers for public endpoints\n    assertFalse(\n        serviceAnnotations.servers().keySet().stream()\n            .anyMatch(key -> expectedServers.containsKey(key)));\n\n    verify(externalServerExposer)\n        .expose(\n            eq(kubernetesEnvironment),\n            eq(machineName),\n            eq(service.getMetadata().getName()),\n            any(),\n            eq(servicePort),\n            eq(expectedServers));\n  }\n\n  @SuppressWarnings(\"SameParameterValue\")\n  private void assertThatSecureServerIsExposed(\n      String machineName,\n      String portProtocol,\n      Integer port,\n      String serverName,\n      ServerConfig serverConfig)\n      throws Exception {\n    // then\n    assertThatContainerPortIsExposed(portProtocol, port);\n    // ensure that service is created\n\n    Service service = findContainerRelatedService();\n    assertNotNull(service);\n\n    // ensure that no service port is exposed\n    assertTrue(\n        service.getSpec().getPorts().stream()\n            .noneMatch(p -> p.getTargetPort().getIntVal().equals(port)));\n\n    ServicePort servicePort =\n        new ServicePortBuilder()\n            .withName(\"server-\" + port)\n            .withPort(port)\n            .withProtocol(portProtocol.toUpperCase())\n            .withNewTargetPort(port)\n            .build();\n\n    verify(secureServerExposer)\n        .expose(\n            eq(kubernetesEnvironment),\n            any(),\n            eq(machineName),\n            isNull(), // no service exists for the backed server\n            isNull(), // a non-unique server\n            eq(servicePort),\n            eq(ImmutableMap.of(serverName, serverConfig)));\n  }\n\n  @SuppressWarnings(\"SameParameterValue\")\n  private void assertThatInternalServerIsExposed(\n      String machineName,\n      String serverNameRegex,\n      String portProtocol,\n      Integer port,\n      ServerConfigImpl expected) {\n    assertThatContainerPortIsExposed(portProtocol, port);\n\n    // ensure that service is created\n\n    Service service = findContainerRelatedService();\n    assertNotNull(service);\n\n    // ensure that required service port is exposed\n    assertThatServicePortIsExposed(port, service);\n\n    Annotations.Deserializer serviceAnnotations =\n        Annotations.newDeserializer(service.getMetadata().getAnnotations());\n    assertEquals(serviceAnnotations.machineName(), machineName);\n\n    Map<String, ServerConfigImpl> servers = serviceAnnotations.servers();\n    ServerConfig serverConfig = servers.get(serverNameRegex);\n    assertEquals(serverConfig, expected);\n  }\n\n  private void assertThatContainerPortIsExposed(String portProtocol, Integer port) {\n    assertTrue(\n        container.getPorts().stream()\n            .anyMatch(\n                p ->\n                    p.getContainerPort().equals(port)\n                        && p.getProtocol().equals(portProtocol.toUpperCase())));\n  }\n\n  private Service findContainerRelatedService() {\n    Service service = null;\n    for (Entry<String, Service> entry : kubernetesEnvironment.getServices().entrySet()) {\n      if (SERVER_PREFIX_REGEX.matcher(entry.getKey()).matches()) {\n        service = entry.getValue();\n        break;\n      }\n    }\n    return service;\n  }\n\n  private ServicePort assertThatServicePortIsExposed(Integer port, Service service) {\n    Optional<ServicePort> servicePortOpt =\n        service.getSpec().getPorts().stream()\n            .filter(p -> p.getTargetPort().getIntVal().equals(port))\n            .findAny();\n    assertTrue(servicePortOpt.isPresent());\n    ServicePort servicePort = servicePortOpt.get();\n    assertEquals(servicePort.getTargetPort().getIntVal(), port);\n    assertEquals(servicePort.getPort(), port);\n    assertEquals(servicePort.getName(), SERVER_PREFIX + \"-\" + port);\n    return servicePort;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/PreviewUrlExposerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server;\n\nimport static java.util.Collections.singletonList;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServiceSpec;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressPath;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressRuleValue;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressRule;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressServiceBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressSpec;\nimport io.fabric8.kubernetes.api.model.networking.v1.ServiceBackendPort;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.PreviewUrlImpl;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServiceExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.IngressServerExposer;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class PreviewUrlExposerTest {\n\n  private PreviewUrlExposer previewUrlExposer;\n\n  @Mock private ExternalServiceExposureStrategy externalServiceExposureStrategy;\n\n  @BeforeMethod\n  public void setUp() {\n    IngressServerExposer externalServerExposer =\n        new IngressServerExposer(\n            externalServiceExposureStrategy, Collections.emptyMap(), null, null);\n    previewUrlExposer = new PreviewUrlExposer<>(externalServerExposer);\n  }\n\n  @Test\n  public void shouldDoNothingWhenNoCommandsDefined() throws InternalInfrastructureException {\n    KubernetesEnvironment env = KubernetesEnvironment.builder().build();\n\n    previewUrlExposer.expose(env);\n\n    assertTrue(env.getCommands().isEmpty());\n    assertTrue(env.getServices().isEmpty());\n    assertTrue(env.getIngresses().isEmpty());\n  }\n\n  @Test\n  public void shouldDoNothingWhenNoCommandWithPreviewUrlDefined()\n      throws InternalInfrastructureException {\n    CommandImpl command = new CommandImpl(\"a\", \"a\", \"a\");\n    KubernetesEnvironment env =\n        KubernetesEnvironment.builder()\n            .setCommands(singletonList(new CommandImpl(command)))\n            .build();\n\n    previewUrlExposer.expose(env);\n\n    assertEquals(env.getCommands().get(0), command);\n    assertTrue(env.getServices().isEmpty());\n    assertTrue(env.getIngresses().isEmpty());\n  }\n\n  @Test\n  public void shouldNotProvisionWhenServiceAndIngressFound()\n      throws InternalInfrastructureException {\n    final int PORT = 8080;\n    final String SERVER_PORT_NAME = \"server-\" + PORT;\n\n    CommandImpl command =\n        new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(PORT, null), Collections.emptyMap());\n\n    Service service = new Service();\n    ObjectMeta serviceMeta = new ObjectMeta();\n    serviceMeta.setName(\"servicename\");\n    service.setMetadata(serviceMeta);\n    ServiceSpec serviceSpec = new ServiceSpec();\n    serviceSpec.setPorts(\n        singletonList(\n            new ServicePort(null, SERVER_PORT_NAME, null, PORT, \"TCP\", new IntOrString(PORT))));\n    service.setSpec(serviceSpec);\n\n    Ingress ingress = new Ingress();\n    ObjectMeta ingressMeta = new ObjectMeta();\n    ingressMeta.setName(\"ingressname\");\n    ingress.setMetadata(ingressMeta);\n    IngressSpec ingressSpec = new IngressSpec();\n    IngressRule ingressRule = new IngressRule();\n    ingressRule.setHost(\"ingresshost\");\n    IngressBackend ingressBackend =\n        new IngressBackend(\n            null,\n            new IngressServiceBackend(\n                \"servicename\", new ServiceBackendPort(SERVER_PORT_NAME, PORT)));\n    ingressRule.setHttp(\n        new HTTPIngressRuleValue(singletonList(new HTTPIngressPath(ingressBackend, null, null))));\n    ingressSpec.setRules(singletonList(ingressRule));\n    ingress.setSpec(ingressSpec);\n\n    Map<String, Service> services = new HashMap<>();\n    services.put(\"servicename\", service);\n    Map<String, Ingress> ingresses = new HashMap<>();\n    ingresses.put(\"ingressname\", ingress);\n\n    KubernetesEnvironment env =\n        KubernetesEnvironment.builder()\n            .setCommands(singletonList(new CommandImpl(command)))\n            .setServices(services)\n            .setIngresses(ingresses)\n            .build();\n\n    assertEquals(env.getIngresses().size(), 1);\n    previewUrlExposer.expose(env);\n    assertEquals(env.getIngresses().size(), 1);\n  }\n\n  @Test\n  public void shouldProvisionIngressWhenNotFound() throws InternalInfrastructureException {\n    Mockito.when(\n            externalServiceExposureStrategy.getExternalPath(Mockito.anyString(), Mockito.any()))\n        .thenReturn(\"some-server-path\");\n\n    final int PORT = 8080;\n    final String SERVER_PORT_NAME = \"server-\" + PORT;\n    final String SERVICE_NAME = \"servicename\";\n\n    CommandImpl command =\n        new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(PORT, null), Collections.emptyMap());\n\n    Service service = new Service();\n    ObjectMeta serviceMeta = new ObjectMeta();\n    serviceMeta.setName(SERVICE_NAME);\n    service.setMetadata(serviceMeta);\n    ServiceSpec serviceSpec = new ServiceSpec();\n    serviceSpec.setPorts(\n        singletonList(\n            new ServicePort(null, SERVER_PORT_NAME, null, PORT, \"TCP\", new IntOrString(PORT))));\n    service.setSpec(serviceSpec);\n\n    Map<String, Service> services = new HashMap<>();\n    services.put(SERVICE_NAME, service);\n\n    KubernetesEnvironment env =\n        KubernetesEnvironment.builder()\n            .setCommands(singletonList(new CommandImpl(command)))\n            .setServices(services)\n            .setIngresses(new HashMap<>())\n            .build();\n\n    previewUrlExposer.expose(env);\n    assertEquals(env.getIngresses().size(), 1);\n    Ingress provisionedIngress = env.getIngresses().values().iterator().next();\n    IngressBackend provisionedIngressBackend =\n        provisionedIngress.getSpec().getRules().get(0).getHttp().getPaths().get(0).getBackend();\n    assertEquals(provisionedIngressBackend.getService().getPort().getName(), SERVER_PORT_NAME);\n    assertEquals(provisionedIngressBackend.getService().getName(), SERVICE_NAME);\n  }\n\n  @Test\n  public void shouldProvisionServiceAndIngressWhenNotFound()\n      throws InternalInfrastructureException {\n    Mockito.when(\n            externalServiceExposureStrategy.getExternalPath(Mockito.anyString(), Mockito.any()))\n        .thenReturn(\"some-server-path\");\n\n    final int PORT = 8080;\n    final String SERVER_PORT_NAME = \"server-\" + PORT;\n\n    CommandImpl command =\n        new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(PORT, null), Collections.emptyMap());\n\n    KubernetesEnvironment env =\n        KubernetesEnvironment.builder()\n            .setCommands(singletonList(new CommandImpl(command)))\n            .setIngresses(new HashMap<>())\n            .setServices(new HashMap<>())\n            .build();\n\n    previewUrlExposer.expose(env);\n\n    assertEquals(env.getIngresses().size(), 1);\n    assertEquals(env.getServices().size(), 1);\n\n    Service provisionedService = env.getServices().values().iterator().next();\n    ServicePort provisionedServicePort = provisionedService.getSpec().getPorts().get(0);\n    assertEquals(provisionedServicePort.getName(), SERVER_PORT_NAME);\n    assertEquals(provisionedServicePort.getPort().intValue(), PORT);\n\n    Ingress provisionedIngress = env.getIngresses().values().iterator().next();\n    IngressBackend provisionedIngressBackend =\n        provisionedIngress.getSpec().getRules().get(0).getHttp().getPaths().get(0).getBackend();\n    assertEquals(provisionedIngressBackend.getService().getPort().getName(), SERVER_PORT_NAME);\n    assertEquals(\n        provisionedIngressBackend.getService().getName(),\n        provisionedService.getMetadata().getName());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/CombinedSingleHostServerExposerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.REQUIRE_SUBDOMAIN;\nimport static org.mockito.Mockito.verify;\n\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class CombinedSingleHostServerExposerTest {\n\n  @Mock private KubernetesEnvironment env;\n\n  private final String MACHINE = \"machine\";\n  private final String SERVICE = \"service\";\n  private final String SERVER = \"server\";\n  private final ServicePort PORT = new ServicePort();\n\n  @Mock private ExternalServerExposer<KubernetesEnvironment> subdomainExposer;\n  @Mock private ExternalServerExposer<KubernetesEnvironment> subpathExposer;\n\n  @Test\n  public void shouldExposeDevfileServersOnSubdomans() {\n    // given\n    ServerConfig s1 = new ServerConfigImpl(\"1\", \"http\", \"/\", emptyMap());\n    ServerConfig s2 =\n        new ServerConfigImpl(\"2\", \"http\", \"/\", singletonMap(REQUIRE_SUBDOMAIN, \"false\"));\n    ServerConfig s3 =\n        new ServerConfigImpl(\"3\", \"http\", \"/\", singletonMap(REQUIRE_SUBDOMAIN, \"true\"));\n\n    CombinedSingleHostServerExposer<KubernetesEnvironment> serverExposer =\n        new CombinedSingleHostServerExposer<>(subdomainExposer, subpathExposer);\n\n    // when\n    serverExposer.expose(env, MACHINE, SERVICE, SERVER, PORT, Map.of(\"s1\", s1, \"s2\", s2, \"s3\", s3));\n\n    // then\n    verify(subdomainExposer).expose(env, MACHINE, SERVICE, SERVER, PORT, Map.of(\"s3\", s3));\n    verify(subpathExposer).expose(env, MACHINE, SERVICE, SERVER, PORT, Map.of(\"s1\", s1, \"s2\", s2));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/DefaultHostExternalServiceExposureStrategyTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer.SERVER_PREFIX;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServicePortBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressRule;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\n/**\n * @author Guy Daich\n */\npublic class DefaultHostExternalServiceExposureStrategyTest {\n\n  private static final Map<String, String> ATTRIBUTES_MAP = singletonMap(\"key\", \"value\");\n\n  private static final String MACHINE_NAME = \"pod/main\";\n  private static final String SERVICE_NAME = SERVER_PREFIX + \"12345678\" + \"-\" + MACHINE_NAME;\n  private static final String LABELS = \"foo=bar\";\n\n  private IngressServerExposer externalServerExposer;\n  private KubernetesEnvironment kubernetesEnvironment;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    Container container = new ContainerBuilder().withName(\"main\").build();\n    Pod pod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"pod\")\n            .endMetadata()\n            .withNewSpec()\n            .withContainers(container)\n            .endSpec()\n            .build();\n\n    kubernetesEnvironment =\n        KubernetesEnvironment.builder().setPods(ImmutableMap.of(\"pod\", pod)).build();\n    externalServerExposer =\n        new IngressServerExposer(\n            new DefaultHostExternalServiceExposureStrategy(), emptyMap(), LABELS, \"%s\");\n  }\n\n  @Test\n  public void shouldCreateIngressForServer() {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", ATTRIBUTES_MAP);\n    ServicePort servicePort =\n        new ServicePortBuilder()\n            .withName(\"server-8080\")\n            .withPort(8080)\n            .withProtocol(\"TCP\")\n            .withTargetPort(new IntOrString(8080))\n            .build();\n    Map<String, ServerConfig> serversToExpose = ImmutableMap.of(\"http-server\", httpServerConfig);\n\n    // when\n    externalServerExposer.expose(\n        kubernetesEnvironment, MACHINE_NAME, SERVICE_NAME, null, servicePort, serversToExpose);\n\n    // then\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME,\n        SERVICE_NAME,\n        \"http-server\",\n        servicePort,\n        new ServerConfigImpl(httpServerConfig).withAttributes(ATTRIBUTES_MAP));\n  }\n\n  @Test\n  public void shouldCreateSingleIngressForTwoNonUniqueServersWithTheSamePort() {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", ATTRIBUTES_MAP);\n    ServerConfigImpl wsServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"ws\", \"/connect\", ATTRIBUTES_MAP);\n    ServicePort servicePort =\n        new ServicePortBuilder()\n            .withName(\"server-8080\")\n            .withPort(8080)\n            .withProtocol(\"TCP\")\n            .withTargetPort(new IntOrString(8080))\n            .build();\n\n    Map<String, ServerConfig> serversToExpose =\n        ImmutableMap.of(\n            \"http-server\", httpServerConfig,\n            \"ws-server\", wsServerConfig);\n\n    // when\n    externalServerExposer.expose(\n        kubernetesEnvironment, MACHINE_NAME, SERVICE_NAME, null, servicePort, serversToExpose);\n\n    // then\n    assertEquals(kubernetesEnvironment.getIngresses().size(), 1);\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME,\n        SERVICE_NAME,\n        \"http-server\",\n        servicePort,\n        new ServerConfigImpl(httpServerConfig).withAttributes(ATTRIBUTES_MAP));\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME,\n        SERVICE_NAME,\n        \"ws-server\",\n        servicePort,\n        new ServerConfigImpl(wsServerConfig).withAttributes(ATTRIBUTES_MAP));\n  }\n\n  @SuppressWarnings(\"SameParameterValue\")\n  private void assertThatExternalServerIsExposed(\n      String machineName,\n      String serviceName,\n      String serverNameRegex,\n      ServicePort servicePort,\n      ServerConfigImpl expected) {\n\n    // ensure that required ingress is created\n    for (Ingress ingress : kubernetesEnvironment.getIngresses().values()) {\n      IngressRule ingressRule = ingress.getSpec().getRules().get(0);\n      IngressBackend backend = ingressRule.getHttp().getPaths().get(0).getBackend();\n      if (serviceName.equals(backend.getService().getName())) {\n        assertEquals(backend.getService().getPort().getName(), servicePort.getName());\n\n        Annotations.Deserializer ingressAnnotations =\n            Annotations.newDeserializer(ingress.getMetadata().getAnnotations());\n        Map<String, ServerConfigImpl> servers = ingressAnnotations.servers();\n        ServerConfig serverConfig = servers.get(serverNameRegex);\n\n        if (serverConfig == null) {\n          // ok, this ingress is not for this particular server\n          continue;\n        }\n\n        assertEquals(serverConfig, expected);\n\n        assertEquals(ingressAnnotations.machineName(), machineName);\n        return;\n      }\n    }\n\n    Assert.fail(\n        format(\n            \"Could not find an ingress for machine '%s' and service '%s'\",\n            machineName, serviceName));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/ExternalServerIngressBuilderTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerIngressBuilder.INGRESS_PATH_TYPE;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressPath;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\n/**\n * @author Guy Daich\n */\npublic class ExternalServerIngressBuilderTest {\n\n  private static final Map<String, String> ATTRIBUTES_MAP = singletonMap(\"key\", \"value\");\n  private static final ServerConfig SERVER_CONFIG =\n      new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", ATTRIBUTES_MAP);\n  private final Map<String, ServerConfig> SERVERS = ImmutableMap.of(\"http-server\", SERVER_CONFIG);\n  private static final Map<String, String> ANNOTATIONS =\n      singletonMap(\"annotation-key\", \"annotation-value\");\n  private static final String MACHINE_NAME = \"machine\";\n  private static final String NAME = \"IngressName\";\n  private static final String SERVICE_NAME = \"ServiceName\";\n  private static final String SERVICE_PORT_NAME = \"server-port\";\n  private static final Integer SERVICE_PORT = 7777;\n\n  private ExternalServerIngressBuilder externalServerIngressBuilder;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    this.externalServerIngressBuilder = new ExternalServerIngressBuilder();\n  }\n\n  @Test\n  public void shouldCreateIngress() {\n    // given\n    final String path = \"/path/to/server\";\n    final String host = \"host-to-server\";\n\n    // when\n    Ingress ingress =\n        externalServerIngressBuilder\n            .withPath(path)\n            .withHost(host)\n            .withAnnotations(ANNOTATIONS)\n            .withMachineName(MACHINE_NAME)\n            .withName(NAME)\n            .withServers(SERVERS)\n            .withServiceName(SERVICE_NAME)\n            .withServicePortName(SERVICE_PORT_NAME)\n            .withServicePort(SERVICE_PORT)\n            .build();\n\n    // then\n    assertIngressSpec(path, host, ingress);\n  }\n\n  @Test\n  public void shouldCreateIngressWithNoPath() {\n    // given\n    final String host = \"host-to-server\";\n\n    // when\n    Ingress ingress =\n        externalServerIngressBuilder\n            .withHost(host)\n            .withAnnotations(ANNOTATIONS)\n            .withMachineName(MACHINE_NAME)\n            .withName(NAME)\n            .withServers(SERVERS)\n            .withServiceName(SERVICE_NAME)\n            .withServicePortName(SERVICE_PORT_NAME)\n            .withServicePort(SERVICE_PORT)\n            .build();\n\n    // then\n    assertIngressSpec(null, host, ingress);\n  }\n\n  @Test\n  public void shouldCreateIngressWithNoHost() {\n    // given\n    final String path = \"/path/to/server\";\n\n    // when\n    Ingress ingress =\n        externalServerIngressBuilder\n            .withPath(path)\n            .withAnnotations(ANNOTATIONS)\n            .withMachineName(MACHINE_NAME)\n            .withName(NAME)\n            .withServers(SERVERS)\n            .withServiceName(SERVICE_NAME)\n            .withServicePortName(SERVICE_PORT_NAME)\n            .withServicePort(SERVICE_PORT)\n            .build();\n\n    // then\n    assertIngressSpec(path, null, ingress);\n  }\n\n  private void assertIngressSpec(String path, String host, Ingress ingress) {\n    assertEquals(ingress.getSpec().getRules().get(0).getHost(), host);\n    HTTPIngressPath httpIngressPath =\n        ingress.getSpec().getRules().get(0).getHttp().getPaths().get(0);\n    assertEquals(httpIngressPath.getPath(), path);\n    assertEquals(httpIngressPath.getPathType(), INGRESS_PATH_TYPE);\n    assertEquals(httpIngressPath.getBackend().getService().getName(), SERVICE_NAME);\n    assertEquals(httpIngressPath.getBackend().getService().getPort().getName(), SERVICE_PORT_NAME);\n\n    assertEquals(ingress.getMetadata().getName(), NAME);\n    assertTrue(ingress.getMetadata().getAnnotations().containsKey(\"annotation-key\"));\n    assertEquals(ingress.getMetadata().getAnnotations().get(\"annotation-key\"), \"annotation-value\");\n\n    Annotations.Deserializer ingressAnnotations =\n        Annotations.newDeserializer(ingress.getMetadata().getAnnotations());\n    Map<String, ServerConfigImpl> servers = ingressAnnotations.servers();\n    ServerConfig serverConfig = servers.get(\"http-server\");\n    assertEquals(serverConfig, SERVER_CONFIG);\n\n    assertEquals(ingressAnnotations.machineName(), MACHINE_NAME);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/GatewayServerExposerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.Collections;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.GatewayConfigmapLabels;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GatewayServerExposerTest {\n  private static final Map<String, String> GATEWAY_CONFIGMAP_LABELS =\n      ImmutableMap.<String, String>builder()\n          .put(\"app\", \"che\")\n          .put(\"role\", \"gateway-config\")\n          .build();\n\n  @Mock private GatewayConfigmapLabels gatewayConfigmapLabels;\n\n  private final String machineName = \"machine\";\n  private final String serviceName = \"service\";\n  private final String serverId = \"server\";\n  private final ServicePort servicePort =\n      new ServicePort(null, \"portName\", 1, 1, \"http\", new IntOrString(1234));\n\n  private final Map<String, String> s1attrs = Collections.singletonMap(\"s1attr\", \"s1val\");\n\n  private final Map<String, ServerConfig> servers =\n      Collections.singletonMap(\"serverOne\", new ServerConfigImpl(\"1111\", \"ws\", null, s1attrs));\n\n  private ExternalServerExposer<KubernetesEnvironment> serverExposer;\n\n  @BeforeMethod\n  public void setUp() {\n    when(gatewayConfigmapLabels.getLabels()).thenReturn(GATEWAY_CONFIGMAP_LABELS);\n    serverExposer =\n        new GatewayServerExposer<>(\n            new SingleHostExternalServiceExposureStrategy(\"che-host\"), gatewayConfigmapLabels);\n  }\n\n  @Test\n  public void testExposeServiceWithGatewayConfigmap() {\n    // given\n    KubernetesEnvironment k8sEnv = KubernetesEnvironment.builder().build();\n\n    // when\n    serverExposer.expose(k8sEnv, machineName, serviceName, serverId, servicePort, servers);\n\n    // then\n    Map<String, ConfigMap> configMaps = k8sEnv.getConfigMaps();\n    assertTrue(configMaps.containsKey(serviceName + \"-\" + serverId));\n    ConfigMap serverConfigMap = configMaps.get(\"service-server\");\n\n    // data should be empty at this point\n    assertTrue(serverConfigMap.getData() == null || serverConfigMap.getData().isEmpty());\n\n    assertEquals(serverConfigMap.getMetadata().getLabels(), GATEWAY_CONFIGMAP_LABELS);\n\n    Map<String, String> annotations = serverConfigMap.getMetadata().getAnnotations();\n    Annotations.Deserializer deserializer = Annotations.newDeserializer(annotations);\n    assertEquals(deserializer.machineName(), machineName);\n\n    Map<String, ServerConfigImpl> exposedServers = deserializer.servers();\n    assertTrue(exposedServers.containsKey(\"serverOne\"));\n\n    ServerConfig s1 = exposedServers.get(\"serverOne\");\n    assertEquals(\n        s1.getAttributes().get(s1attrs.keySet().iterator().next()),\n        s1attrs.values().iterator().next());\n    assertEquals(s1.getAttributes().get(ServerConfigImpl.SERVICE_NAME_ATTRIBUTE), \"service\");\n    assertEquals(s1.getAttributes().get(ServerConfigImpl.SERVICE_PORT_ATTRIBUTE), \"1234\");\n    assertEquals(s1.getPort(), \"1111\");\n    assertEquals(s1.getProtocol(), \"ws\");\n    assertNull(s1.getPath());\n    assertEquals(s1.getEndpointOrigin(), \"/service/server/\");\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/IngressPathTransformInverterTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static org.testng.Assert.assertEquals;\n\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class IngressPathTransformInverterTest {\n\n  @Test(dataProvider = \"transformationTestCases\")\n  public void testUndoPathTransformationWithBasicTransform(\n      String format, String transformedPath, String originalPath) {\n    IngressPathTransformInverter inverter = new IngressPathTransformInverter(format);\n    assertEquals(inverter.undoPathTransformation(transformedPath), originalPath);\n  }\n\n  @DataProvider\n  public static Object[][] transformationTestCases() {\n    return new Object[][] {\n      {\"%s\", \"path\", \"path\"},\n      {\"invalid\", \"path\", \"path\"},\n      {\"%ssuffix\", \"pathsuffix\", \"path\"},\n      {\"prefix%s\", \"prefixpath\", \"path\"},\n      {\"prefix%ssuffix\", \"prefixpathsuffix\", \"path\"},\n      {\"prefix%s\", \"non-matching\", \"non-matching\"},\n      {null, \"some path\", \"some path\"}\n    };\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/IngressServerExposerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static java.util.Collections.emptyMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.IngressServerExposer.SERVICE_NAME_PLACEHOLDER;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Serhii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class IngressServerExposerTest {\n  @Mock private ExternalServiceExposureStrategy serviceExposureStrategy;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    when(serviceExposureStrategy.getExternalHost(any(), any())).thenReturn(\"host\");\n    when(serviceExposureStrategy.getExternalPath(any(), any())).thenReturn(\"path\");\n  }\n\n  @Test\n  public void shouldReplaceServerNamePlaceholders() {\n    // given\n    Map<String, String> annotations = new HashMap<>();\n    annotations.put(\"ssl\", \"true\");\n    annotations.put(\"websocket-service\", SERVICE_NAME_PLACEHOLDER);\n\n    IngressServerExposer<KubernetesEnvironment> exposer =\n        new IngressServerExposer<>(serviceExposureStrategy, annotations, null, \"\");\n\n    KubernetesEnvironment env = KubernetesEnvironment.builder().build();\n\n    Map<String, ServerConfig> externalServers = new HashMap<>();\n    externalServers.put(\"ide\", new ServerConfigImpl(\"6543\", \"http\", \"/\", emptyMap()));\n\n    // when\n    exposer.expose(env, \"editor\", \"ide\", \"server123\", new ServicePort(), externalServers);\n\n    // then\n    Collection<Ingress> ingresses = env.getIngresses().values();\n    assertEquals(ingresses.size(), 1);\n    Ingress ingress = ingresses.iterator().next();\n    assertEquals(ingress.getMetadata().getAnnotations().get(\"ssl\"), \"true\");\n    assertEquals(ingress.getMetadata().getAnnotations().get(\"websocket-service\"), \"ide\");\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/MultiHostExternalServiceExposureStrategyTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer.SERVER_PREFIX;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServicePortBuilder;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressRule;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\n/**\n * @author Guy Daich\n */\npublic class MultiHostExternalServiceExposureStrategyTest {\n\n  private static final Map<String, String> ATTRIBUTES_MAP = singletonMap(\"key\", \"value\");\n  private static final Map<String, String> UNIQUE_SERVER_ATTRIBUTES =\n      ImmutableMap.of(\"key\", \"value\", ServerConfig.UNIQUE_SERVER_ATTRIBUTE, \"true\");\n  private static final String MACHINE_NAME = \"pod/main\";\n  private static final String SERVICE_NAME = SERVER_PREFIX + \"12345678\" + \"-\" + MACHINE_NAME;\n  private static final String DOMAIN = \"che.com\";\n  private static final String LABELS = \"foo=bar\";\n\n  private IngressServerExposer externalServerExposer;\n  private KubernetesEnvironment kubernetesEnvironment;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    Container container = new ContainerBuilder().withName(\"main\").build();\n    Pod pod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"pod\")\n            .endMetadata()\n            .withNewSpec()\n            .withContainers(container)\n            .endSpec()\n            .build();\n\n    kubernetesEnvironment =\n        KubernetesEnvironment.builder().setPods(ImmutableMap.of(\"pod\", pod)).build();\n    externalServerExposer =\n        new IngressServerExposer(\n            new MultiHostExternalServiceExposureStrategy(DOMAIN, MULTI_HOST_STRATEGY),\n            emptyMap(),\n            LABELS,\n            \"%s\");\n  }\n\n  @Test\n  public void shouldCreateIngressForServer() {\n    // given\n    ServerConfigImpl httpServerConfig =\n        new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", ATTRIBUTES_MAP);\n    IntOrString targetPort = new IntOrString(8080);\n    ServicePort servicePort =\n        new ServicePortBuilder()\n            .withName(\"server-8080\")\n            .withPort(8080)\n            .withProtocol(\"TCP\")\n            .withTargetPort(targetPort)\n            .build();\n    Map<String, ServerConfig> serversToExpose = ImmutableMap.of(\"http-server\", httpServerConfig);\n\n    // when\n    externalServerExposer.expose(\n        kubernetesEnvironment, MACHINE_NAME, SERVICE_NAME, null, servicePort, serversToExpose);\n\n    // then\n    assertThatExternalServerIsExposed(\n        MACHINE_NAME,\n        SERVICE_NAME,\n        \"http-server\",\n        \"tcp\",\n        8080,\n        servicePort,\n        new ServerConfigImpl(httpServerConfig).withAttributes(ATTRIBUTES_MAP));\n  }\n\n  private void assertThatExternalServerIsExposed(\n      String machineName,\n      String serviceName,\n      String serverNameRegex,\n      String portProtocol,\n      Integer port,\n      ServicePort servicePort,\n      ServerConfigImpl expected) {\n\n    // ensure that required ingress is created\n    String ingressName =\n        serviceName + \"-\" + (expected.isUnique() ? serverNameRegex : servicePort.getName());\n    Ingress ingress = kubernetesEnvironment.getIngresses().get(ingressName);\n    IngressRule ingressRule = ingress.getSpec().getRules().get(0);\n    assertEquals(ingressRule.getHost(), ingressName + \".\" + DOMAIN);\n    assertEquals(ingressRule.getHttp().getPaths().get(0).getPath(), \"/\");\n    IngressBackend backend = ingressRule.getHttp().getPaths().get(0).getBackend();\n    assertEquals(backend.getService().getName(), serviceName);\n    assertEquals(backend.getService().getPort().getName(), servicePort.getName());\n\n    Annotations.Deserializer ingressAnnotations =\n        Annotations.newDeserializer(ingress.getMetadata().getAnnotations());\n    Map<String, ServerConfigImpl> servers = ingressAnnotations.servers();\n    ServerConfig serverConfig = servers.get(serverNameRegex);\n    assertEquals(serverConfig, expected);\n\n    assertEquals(ingressAnnotations.machineName(), machineName);\n    assertEquals(ingress.getMetadata().getLabels().get(\"foo\"), \"bar\");\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/external/TraefikGatewayRouteConfigGeneratorTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.external;\n\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVICE_NAME_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVICE_PORT_ATTRIBUTE;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class TraefikGatewayRouteConfigGeneratorTest {\n\n  private GatewayRouteConfigGenerator gatewayConfigGenerator;\n  private GatewayRouteConfigGenerator gatewayConfigGeneratorNonDefaultDomain;\n\n  @BeforeMethod\n  public void setUp() {\n    gatewayConfigGenerator = new TraefikGatewayRouteConfigGenerator(null);\n    gatewayConfigGeneratorNonDefaultDomain =\n        new TraefikGatewayRouteConfigGenerator(\"myorg.internal\");\n  }\n\n  @Test\n  public void testGenerateGatewayConfig() throws InfrastructureException {\n    String expectedConfig =\n        \"http:\\n\"\n            + \"  routers:\\n\"\n            + \"    external-server-1:\\n\"\n            + \"      rule: \\\"PathPrefix(`/blabol-cesta`)\\\"\\n\"\n            + \"      service: \\\"external-server-1\\\"\\n\"\n            + \"      middlewares:\\n\"\n            + \"      - \\\"external-server-1\\\"\\n\"\n            + \"      priority: 100\\n\"\n            + \"  services:\\n\"\n            + \"    external-server-1:\\n\"\n            + \"      loadBalancer:\\n\"\n            + \"        servers:\\n\"\n            + \"        - url: \\\"http://service-url.che-namespace.svc:1234\\\"\\n\"\n            + \"  middlewares:\\n\"\n            + \"    external-server-1:\\n\"\n            + \"      stripPrefix:\\n\"\n            + \"        prefixes:\\n\"\n            + \"        - \\\"/blabol-cesta\\\"\";\n\n    ServerConfigImpl serverConfig =\n        new ServerConfigImpl(\n            \"123\",\n            \"https\",\n            \"/\",\n            ImmutableMap.of(\n                SERVICE_NAME_ATTRIBUTE,\n                \"service-url\",\n                SERVICE_PORT_ATTRIBUTE,\n                \"1234\",\n                ServerConfig.ENDPOINT_ORIGIN,\n                \"/blabol-cesta\"));\n    Map<String, String> annotations =\n        new Annotations.Serializer().server(\"s1\", serverConfig).annotations();\n    ConfigMap routeConfig =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(\"route\")\n            .withAnnotations(annotations)\n            .endMetadata()\n            .build();\n\n    gatewayConfigGenerator.addRouteConfig(\"external-server-1\", routeConfig);\n    Map<String, String> generatedConfig = gatewayConfigGenerator.generate(\"che-namespace\");\n\n    assertTrue(generatedConfig.containsKey(\"external-server-1.yml\"));\n    assertEquals(generatedConfig.get(\"external-server-1.yml\"), expectedConfig);\n  }\n\n  @Test\n  public void testGenerateGatewayConfigWithNonDefaultDomain() throws InfrastructureException {\n    String expectedConfig =\n        \"http:\\n\"\n            + \"  routers:\\n\"\n            + \"    external-server-1:\\n\"\n            + \"      rule: \\\"PathPrefix(`/blabol-cesta`)\\\"\\n\"\n            + \"      service: \\\"external-server-1\\\"\\n\"\n            + \"      middlewares:\\n\"\n            + \"      - \\\"external-server-1\\\"\\n\"\n            + \"      priority: 100\\n\"\n            + \"  services:\\n\"\n            + \"    external-server-1:\\n\"\n            + \"      loadBalancer:\\n\"\n            + \"        servers:\\n\"\n            + \"        - url: \\\"http://service-url.che-namespace.svc.myorg.internal:1234\\\"\\n\"\n            + \"  middlewares:\\n\"\n            + \"    external-server-1:\\n\"\n            + \"      stripPrefix:\\n\"\n            + \"        prefixes:\\n\"\n            + \"        - \\\"/blabol-cesta\\\"\";\n\n    ServerConfigImpl serverConfig =\n        new ServerConfigImpl(\n            \"123\",\n            \"https\",\n            \"/\",\n            ImmutableMap.of(\n                SERVICE_NAME_ATTRIBUTE,\n                \"service-url\",\n                SERVICE_PORT_ATTRIBUTE,\n                \"1234\",\n                ServerConfig.ENDPOINT_ORIGIN,\n                \"/blabol-cesta\"));\n    Map<String, String> annotations =\n        new Annotations.Serializer().server(\"s1\", serverConfig).annotations();\n    ConfigMap routeConfig =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(\"route\")\n            .withAnnotations(annotations)\n            .endMetadata()\n            .build();\n\n    gatewayConfigGeneratorNonDefaultDomain.addRouteConfig(\"external-server-1\", routeConfig);\n    Map<String, String> generatedConfig =\n        gatewayConfigGeneratorNonDefaultDomain.generate(\"che-namespace\");\n\n    assertTrue(generatedConfig.containsKey(\"external-server-1.yml\"));\n    assertEquals(generatedConfig.get(\"external-server-1.yml\"), expectedConfig);\n  }\n\n  @Test\n  public void testMultipleRouteConfigsAreGeneratedAsMultipleMapEntries()\n      throws InfrastructureException {\n    ServerConfigImpl serverConfig =\n        new ServerConfigImpl(\n            \"123\",\n            \"https\",\n            \"/\",\n            ImmutableMap.of(\n                SERVICE_NAME_ATTRIBUTE,\n                \"service-url\",\n                SERVICE_PORT_ATTRIBUTE,\n                \"1234\",\n                ServerConfig.ENDPOINT_ORIGIN,\n                \"/blabol-cesta\"));\n    Map<String, String> annotations =\n        new Annotations.Serializer().server(\"s1\", serverConfig).annotations();\n    ConfigMap routeConfig =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(\"route\")\n            .withAnnotations(annotations)\n            .endMetadata()\n            .build();\n    gatewayConfigGenerator.addRouteConfig(\"c1\", routeConfig);\n    gatewayConfigGenerator.addRouteConfig(\"c2\", routeConfig);\n    Map<String, String> generatedConfig = gatewayConfigGenerator.generate(\"che-namespace\");\n\n    assertTrue(generatedConfig.containsKey(\"c1.yml\"));\n    assertTrue(generatedConfig.containsKey(\"c2.yml\"));\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void failWhenMultipleServersInConfigmapAnnotations() throws InfrastructureException {\n    ServerConfigImpl serverConfig =\n        new ServerConfigImpl(\n            \"123\",\n            \"https\",\n            \"/\",\n            ImmutableMap.of(\n                SERVICE_NAME_ATTRIBUTE,\n                \"service-url\",\n                SERVICE_PORT_ATTRIBUTE,\n                \"1234\",\n                ServerConfig.ENDPOINT_ORIGIN,\n                \"/blabol-cesta\"));\n    Map<String, String> annotations =\n        new Annotations.Serializer()\n            .server(\"s1\", serverConfig)\n            .server(\"s2\", serverConfig)\n            .annotations();\n    ConfigMap routeConfig =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .withName(\"route\")\n            .withAnnotations(annotations)\n            .endMetadata()\n            .build();\n    gatewayConfigGenerator.addRouteConfig(\"c1\", routeConfig);\n\n    gatewayConfigGenerator.generate(\"che-namespace\");\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/resolver/AbstractServerResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver;\n\nimport static org.testng.Assert.assertEquals;\n\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class AbstractServerResolverTest {\n\n  @Test(dataProvider = \"buildPathFragments\")\n  public void testBuildPath(String fragment1, @Nullable String fragment2, String expectedResult) {\n    assertEquals(AbstractServerResolver.buildPath(fragment1, fragment2), expectedResult);\n  }\n\n  @DataProvider\n  public static Object[][] buildPathFragments() {\n    return new Object[][] {\n      new Object[] {\"/\", null, \"/\"},\n      new Object[] {\"/a\", null, \"/a/\"},\n      new Object[] {\"/a/\", null, \"/a/\"},\n      new Object[] {\"/a\", \"\", \"/a/\"},\n      new Object[] {\"/a\", \"\", \"/a/\"},\n      new Object[] {\"/a\", \"/\", \"/a/\"},\n      new Object[] {\"/a\", \"b\", \"/a/b/\"},\n      new Object[] {\"/a\", \"/b\", \"/a/b/\"},\n      new Object[] {\"/a\", \"b/\", \"/a/b/\"},\n      new Object[] {\"/a\", \"/b/\", \"/a/b/\"},\n    };\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/resolver/ConfigMapServerResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver;\n\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.runtime.ServerStatus;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class ConfigMapServerResolverTest {\n  @Mock private ServerResolver nativeServerResolver;\n\n  @Test\n  public void shouldIncludeServersFromNativeResolver() {\n    // given\n    ServerImpl server = new ServerImpl(\"server\", ServerStatus.UNKNOWN, emptyMap());\n    when(nativeServerResolver.resolveExternalServers(\"test\"))\n        .thenReturn(singletonMap(\"s1\", server));\n\n    ConfigMapServerResolver serverResolver =\n        new ConfigMapServerResolver(emptyList(), emptyList(), \"che.host\", nativeServerResolver);\n\n    // when\n    Map<String, ServerImpl> resolvedServers = serverResolver.resolve(\"test\");\n\n    // then\n    assertTrue(resolvedServers.containsKey(\"s1\"));\n    assertEquals(resolvedServers.get(\"s1\"), server);\n  }\n\n  @Test\n  public void shouldSetEndpointOrigin() {\n    // given\n    ConfigMap serverConfigMap =\n        new ConfigMapBuilder()\n            .withNewMetadata()\n            .addToAnnotations(\n                Annotations.newSerializer()\n                    .machineName(\"m1\")\n                    .server(\n                        \"svr\",\n                        new ServerConfigImpl()\n                            .withPort(\"8080\")\n                            .withProtocol(\"http\")\n                            .withPath(\"/kachny\")\n                            .withAttributes(\n                                ImmutableMap.of(ServerConfig.ENDPOINT_ORIGIN, \"/kachny\")))\n                    .annotations())\n            .endMetadata()\n            .build();\n\n    ConfigMapServerResolver serverResolver =\n        new ConfigMapServerResolver(\n            emptyList(), singletonList(serverConfigMap), \"che.host\", nativeServerResolver);\n\n    // when\n    Map<String, ServerImpl> resolvedServers = serverResolver.resolve(\"m1\");\n\n    // then\n    ServerImpl svr = resolvedServers.get(\"svr\");\n    assertNotNull(svr);\n\n    assertEquals(\"/kachny\", ServerConfig.getEndpointOrigin(svr.getAttributes()));\n    assertEquals(\"http://che.host/kachny/kachny/\", svr.getUrl());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/SecureServerExposerFactoryProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Warnings.UNKNOWN_SECURE_SERVER_EXPOSER_CONFIGURED_IN_WS_WARNING_CODE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposerFactoryProvider.SECURE_EXPOSER_IMPL_PROPERTY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposerFactoryProvider.UNKNOWN_EXPOSER_ERROR_TEMPLATE;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertSame;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.workspace.server.model.impl.WarningImpl;\nimport org.eclipse.che.inject.ConfigurationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class SecureServerExposerFactoryProviderTest {\n  private static final String EXPOSER1 = \"exposer1\";\n  private static final String EXPOSER2 = \"exposer2\";\n  private static final String NON_EXISTING_EXPOSER = \"non-existing\";\n\n  @Mock private SecureServerExposerFactory<KubernetesEnvironment> secureServerExposer1;\n  @Mock private SecureServerExposerFactory<KubernetesEnvironment> secureServerExposer2;\n\n  private Map<String, SecureServerExposerFactory<KubernetesEnvironment>> factories;\n  private KubernetesEnvironment kubernetesEnvironment;\n\n  @BeforeMethod\n  public void setUp() {\n    factories = new HashMap<>();\n    factories.put(EXPOSER1, secureServerExposer1);\n    factories.put(EXPOSER2, secureServerExposer2);\n    kubernetesEnvironment = KubernetesEnvironment.builder().build();\n  }\n\n  @Test\n  public void shouldReturnConfiguredSecureServerExposer() {\n    // given\n    SecureServerExposerFactoryProvider<KubernetesEnvironment> factoryProvider =\n        new SecureServerExposerFactoryProvider<>(EXPOSER1, factories);\n\n    // when\n    SecureServerExposerFactory<KubernetesEnvironment> factory =\n        factoryProvider.get(kubernetesEnvironment);\n\n    // then\n    assertSame(factory, secureServerExposer1);\n  }\n\n  @Test(\n      expectedExceptions = ConfigurationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Unknown secure servers exposer 'non-existing' is configured. Currently supported: exposer1, exposer2.\")\n  public void shouldThrowAnExceptionIfConfiguredSecureServerWasNotFound() {\n    // given\n    new SecureServerExposerFactoryProvider<>(NON_EXISTING_EXPOSER, factories);\n  }\n\n  @Test\n  public void shouldAddWarningIfSecureServerConfiguredInEnvironmentWasNotFound() {\n    // given\n    SecureServerExposerFactoryProvider<KubernetesEnvironment> factoryProvider =\n        new SecureServerExposerFactoryProvider<>(EXPOSER1, factories);\n    kubernetesEnvironment.setAttributes(\n        ImmutableMap.of(SECURE_EXPOSER_IMPL_PROPERTY, NON_EXISTING_EXPOSER));\n    WarningImpl expectedWarning =\n        new WarningImpl(\n            UNKNOWN_SECURE_SERVER_EXPOSER_CONFIGURED_IN_WS_WARNING_CODE,\n            format(\n                UNKNOWN_EXPOSER_ERROR_TEMPLATE,\n                NON_EXISTING_EXPOSER,\n                String.join(\", \", factories.keySet())));\n\n    SecureServerExposerFactory<KubernetesEnvironment> factory =\n        factoryProvider.get(kubernetesEnvironment);\n\n    // then\n    assertSame(factory, secureServerExposer1);\n    assertEquals(kubernetesEnvironment.getWarnings().size(), 1);\n    assertEquals(kubernetesEnvironment.getWarnings().get(0), expectedWarning);\n  }\n\n  @Test\n  public void shouldReturnSecureServerExposerConfiguredInEnvironment() {\n    // given\n    SecureServerExposerFactoryProvider<KubernetesEnvironment> factoryProvider =\n        new SecureServerExposerFactoryProvider<>(EXPOSER1, factories);\n    kubernetesEnvironment.setAttributes(ImmutableMap.of(SECURE_EXPOSER_IMPL_PROPERTY, EXPOSER2));\n\n    SecureServerExposerFactory<KubernetesEnvironment> factory =\n        factoryProvider.get(kubernetesEnvironment);\n\n    // then\n    assertSame(factory, secureServerExposer2);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/JwtProxyConfigBuilderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy;\n\nimport static org.testng.Assert.assertEquals;\n\nimport java.net.URI;\nimport java.util.HashSet;\nimport java.util.Set;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\nimport org.testng.reporters.Files;\n\n/**\n * Tests {@link JwtProxyConfigBuilder}.\n *\n * @author Sergii Leshchenko\n */\npublic class JwtProxyConfigBuilderTest {\n\n  private JwtProxyConfigBuilder jwtProxyConfigBuilder;\n\n  @BeforeMethod\n  public void setUp() {\n    jwtProxyConfigBuilder =\n        new JwtProxyConfigBuilder(\n            URI.create(\"http://che-host.com\"),\n            \"wsmaster\",\n            \"1m\",\n            \"/app/loader.html\",\n            \"workspace123\");\n  }\n\n  @Test\n  public void shouldBuildJwtProxyConfigInYamlFormat() throws Exception {\n    // given\n    Set<String> excludes = new HashSet<>();\n    jwtProxyConfigBuilder.addVerifierProxy(\n        8080, \"http://tomcat:8080\", new HashSet<>(excludes), false, \"\", \"/there\");\n    excludes.add(\"/api/liveness\");\n    excludes.add(\"/other/exclude\");\n    jwtProxyConfigBuilder.addVerifierProxy(\n        4101, \"ws://terminal:4101\", new HashSet<>(excludes), true, \"/cookies\", \"/here\");\n\n    // when\n    String jwtProxyConfigYaml = jwtProxyConfigBuilder.build();\n    // then\n    assertEquals(\n        jwtProxyConfigYaml,\n        Files.readFile(getClass().getClassLoader().getResourceAsStream(\"jwtproxy-confg.yaml\")));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/JwtProxyProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.emptySet;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SECURE_SERVER_COOKIES_AUTH_ENABLED_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer.SERVER_PREFIX;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.KubernetesServerExposer.SERVER_UNIQUE_PART_SIZE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.JwtProxyProvisioner.JWT_PROXY_CONFIG_FILE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.JwtProxyProvisioner.JWT_PROXY_CONFIG_FOLDER;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.JwtProxyProvisioner.JWT_PROXY_PUBLIC_KEY_FILE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.JwtProxyProvisioner.PUBLIC_KEY_FOOTER;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.JwtProxyProvisioner.PUBLIC_KEY_HEADER;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.ArgumentMatchers.isNull;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.EnvVar;\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.net.URI;\nimport java.security.KeyPair;\nimport java.security.PublicKey;\nimport java.util.Base64;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.RuntimeIdentityImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignatureKeyManager;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServiceExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ServiceExposureStrategyProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory.JwtProxyConfigBuilderFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link JwtProxyProvisioner}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class JwtProxyProvisionerTest {\n\n  private static final String WORKSPACE_ID = \"workspace123\";\n  private static final Pattern JWTPROXY_SERVICE_NAME_PATTERN =\n      Pattern.compile(SERVER_PREFIX + \"\\\\w{\" + SERVER_UNIQUE_PART_SIZE + \"}-jwtproxy\");\n  private final RuntimeIdentity runtimeId =\n      new RuntimeIdentityImpl(WORKSPACE_ID, \"env123\", \"owner123\", \"infraNamespace\");\n\n  @Mock private SignatureKeyManager signatureKeyManager;\n  @Mock private PublicKey publicKey;\n  @Mock private JwtProxyConfigBuilderFactory configBuilderFactory;\n  @Mock private ServiceExposureStrategyProvider serviceExposureStrategyProvider;\n  @Mock private ExternalServiceExposureStrategy externalServiceExposureStrategy;\n  @Mock private ExternalServiceExposureStrategy multiHostExternalServiceExposureStrategy;\n  private CookiePathStrategy cookiePathStrategy = spy(new CookiePathStrategy(MULTI_HOST_STRATEGY));\n  private MultiHostCookiePathStrategy multiHostCookiePathStrategy =\n      spy(new MultiHostCookiePathStrategy());\n\n  private JwtProxyProvisioner jwtProxyProvisioner;\n  private KubernetesEnvironment k8sEnv;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    when(signatureKeyManager.getOrCreateKeyPair(anyString()))\n        .thenReturn(new KeyPair(publicKey, null));\n    lenient().when(publicKey.getEncoded()).thenReturn(\"publickey\".getBytes());\n\n    when(configBuilderFactory.create(any()))\n        .thenReturn(\n            new JwtProxyConfigBuilder(\n                URI.create(\"http://che.api\"), \"iss\", \"1h\", \"\", runtimeId.getWorkspaceId()));\n\n    when(serviceExposureStrategyProvider.get()).thenReturn(externalServiceExposureStrategy);\n    when(serviceExposureStrategyProvider.getMultiHostStrategy())\n        .thenReturn(multiHostExternalServiceExposureStrategy);\n\n    jwtProxyProvisioner =\n        new JwtProxyProvisioner(\n            signatureKeyManager,\n            configBuilderFactory,\n            serviceExposureStrategyProvider,\n            cookiePathStrategy,\n            multiHostCookiePathStrategy,\n            \"eclipse/che-jwtproxy\",\n            \"10m\",\n            \"128mb\",\n            \"0.02\",\n            \"0.5\",\n            runtimeId);\n    k8sEnv = KubernetesEnvironment.builder().build();\n  }\n\n  @Test\n  public void shouldReturnGeneratedJwtProxyServiceName() {\n    // when\n    String jwtProxyServiceName = jwtProxyProvisioner.getServiceName();\n\n    // then\n    assertTrue(JWTPROXY_SERVICE_NAME_PATTERN.matcher(jwtProxyServiceName).matches());\n  }\n\n  @Test\n  public void shouldProvisionJwtProxyRelatedObjectsIntoKubernetesEnvironment() throws Exception {\n    // given\n    ServerConfigImpl secureServer = new ServerConfigImpl(\"4401/tcp\", \"ws\", \"/\", emptyMap());\n\n    ServicePort port = new ServicePort();\n    port.setTargetPort(new IntOrString(4401));\n\n    // when\n    jwtProxyProvisioner.expose(\n        k8sEnv,\n        podWithName(),\n        \"machine\",\n        \"terminal\",\n        port,\n        \"TCP\",\n        false,\n        ImmutableMap.of(\"server\", secureServer));\n\n    // then\n    InternalMachineConfig jwtProxyMachine =\n        k8sEnv.getMachines().get(JwtProxyProvisioner.JWT_PROXY_MACHINE_NAME);\n    assertNotNull(jwtProxyMachine);\n\n    ConfigMap configMap = k8sEnv.getConfigMaps().get(jwtProxyProvisioner.getConfigMapName());\n    assertNotNull(configMap);\n    assertEquals(\n        configMap.getData().get(JWT_PROXY_PUBLIC_KEY_FILE),\n        PUBLIC_KEY_HEADER\n            + Base64.getEncoder().encodeToString(\"publickey\".getBytes())\n            + PUBLIC_KEY_FOOTER);\n    assertNotNull(configMap.getData().get(JWT_PROXY_CONFIG_FILE));\n\n    Pod jwtProxyPod =\n        k8sEnv.getInjectablePodsCopy().getOrDefault(\"machine\", emptyMap()).get(\"che-jwtproxy\");\n    assertNotNull(jwtProxyPod);\n\n    assertEquals(1, jwtProxyPod.getSpec().getContainers().size());\n    Container jwtProxyContainer = jwtProxyPod.getSpec().getContainers().get(0);\n\n    assertEquals(jwtProxyContainer.getArgs().size(), 2);\n    assertEquals(jwtProxyContainer.getArgs().get(0), \"-config\");\n    assertEquals(\n        jwtProxyContainer.getArgs().get(1), JWT_PROXY_CONFIG_FOLDER + \"/\" + JWT_PROXY_CONFIG_FILE);\n\n    assertEquals(jwtProxyContainer.getEnv().size(), 1);\n    EnvVar xdgHome = jwtProxyContainer.getEnv().get(0);\n    assertEquals(xdgHome.getName(), \"XDG_CONFIG_HOME\");\n    assertEquals(xdgHome.getValue(), JWT_PROXY_CONFIG_FOLDER);\n\n    Service jwtProxyService = k8sEnv.getServices().get(jwtProxyProvisioner.getServiceName());\n    assertNotNull(jwtProxyService);\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Secure servers which expose the same port should have \"\n              + \"the same `cookiesAuthEnabled` value\\\\.\")\n  public void shouldThrowAnExceptionIfServersHaveDifferentValueForCookiesAuthEnabled()\n      throws Exception {\n    // given\n    ServerConfigImpl server1 =\n        new ServerConfigImpl(\n            \"4401/tcp\",\n            \"ws\",\n            \"/\",\n            ImmutableMap.of(SECURE_SERVER_COOKIES_AUTH_ENABLED_ATTRIBUTE, \"true\"));\n    ServerConfigImpl server2 =\n        new ServerConfigImpl(\n            \"4401/tcp\",\n            \"http\",\n            \"/\",\n            ImmutableMap.of(SECURE_SERVER_COOKIES_AUTH_ENABLED_ATTRIBUTE, \"false\"));\n    ServerConfigImpl server3 = new ServerConfigImpl(\"4401/tcp\", \"ws\", \"/\", emptyMap());\n\n    ServicePort port = new ServicePort();\n    port.setTargetPort(new IntOrString(4401));\n\n    // when\n    jwtProxyProvisioner.expose(\n        k8sEnv,\n        podWithName(),\n        \"machine\",\n        \"terminal\",\n        port,\n        \"TCP\",\n        false,\n        ImmutableMap.of(\"server1\", server1, \"server2\", server2, \"server3\", server3));\n  }\n\n  @Test\n  public void shouldUseCookiesAuthEnabledFromServersConfigs() throws Exception {\n    // given\n    JwtProxyConfigBuilder configBuilder = mock(JwtProxyConfigBuilder.class);\n    when(configBuilderFactory.create(any())).thenReturn(configBuilder);\n\n    jwtProxyProvisioner =\n        new JwtProxyProvisioner(\n            signatureKeyManager,\n            configBuilderFactory,\n            serviceExposureStrategyProvider,\n            cookiePathStrategy,\n            multiHostCookiePathStrategy,\n            \"eclipse/che-jwtproxy\",\n            \"10m\",\n            \"128mb\",\n            \"0.02\",\n            \"500m\",\n            runtimeId);\n\n    ServerConfigImpl server1 =\n        new ServerConfigImpl(\n            \"4401/tcp\",\n            \"http\",\n            \"/\",\n            ImmutableMap.of(SECURE_SERVER_COOKIES_AUTH_ENABLED_ATTRIBUTE, \"true\"));\n    ServerConfigImpl server2 =\n        new ServerConfigImpl(\n            \"4401/tcp\",\n            \"ws\",\n            \"/\",\n            ImmutableMap.of(SECURE_SERVER_COOKIES_AUTH_ENABLED_ATTRIBUTE, \"true\"));\n\n    ServicePort port = new ServicePort();\n    port.setTargetPort(new IntOrString(4401));\n\n    // when\n    jwtProxyProvisioner.expose(\n        k8sEnv,\n        podWithName(),\n        \"machine\",\n        \"terminal\",\n        port,\n        \"TCP\",\n        false,\n        ImmutableMap.of(\"server1\", server1));\n\n    // then\n    verify(configBuilder).addVerifierProxy(any(), any(), any(), eq(true), any(), any());\n  }\n\n  @Test\n  public void shouldFalseValueAsDefaultForCookiesAuthEnabledAttribute() throws Exception {\n    // given\n    JwtProxyConfigBuilder configBuilder = mock(JwtProxyConfigBuilder.class);\n    when(configBuilderFactory.create(any())).thenReturn(configBuilder);\n\n    jwtProxyProvisioner =\n        new JwtProxyProvisioner(\n            signatureKeyManager,\n            configBuilderFactory,\n            serviceExposureStrategyProvider,\n            cookiePathStrategy,\n            multiHostCookiePathStrategy,\n            \"eclipse/che-jwtproxy\",\n            \"10m\",\n            \"128mb\",\n            \"0.02\",\n            \"0.5\",\n            runtimeId);\n\n    ServerConfigImpl server1 = new ServerConfigImpl(\"4401/tcp\", \"http\", \"/\", emptyMap());\n\n    ServicePort port = new ServicePort();\n    port.setTargetPort(new IntOrString(4401));\n\n    // when\n    jwtProxyProvisioner.expose(\n        k8sEnv,\n        podWithName(),\n        \"machine\",\n        \"terminal\",\n        port,\n        \"TCP\",\n        false,\n        ImmutableMap.of(\"server1\", server1));\n\n    // then\n    verify(configBuilder)\n        .addVerifierProxy(\n            eq(4400), eq(\"http://terminal:4401\"), eq(emptySet()), eq(false), eq(\"/\"), isNull());\n  }\n\n  @Test\n  public void shouldBindToLocalhostWhenNoServiceForServerExists() throws Exception {\n    // given\n    JwtProxyConfigBuilder configBuilder = mock(JwtProxyConfigBuilder.class);\n    when(configBuilderFactory.create(any())).thenReturn(configBuilder);\n\n    jwtProxyProvisioner =\n        new JwtProxyProvisioner(\n            signatureKeyManager,\n            configBuilderFactory,\n            serviceExposureStrategyProvider,\n            cookiePathStrategy,\n            multiHostCookiePathStrategy,\n            \"eclipse/che-jwtproxy\",\n            \"10m\",\n            \"128mb\",\n            \"0.02\",\n            \"0.5\",\n            runtimeId);\n\n    ServerConfigImpl server1 = new ServerConfigImpl(\"4401/tcp\", \"http\", \"/\", emptyMap());\n\n    ServicePort port = new ServicePort();\n    port.setTargetPort(new IntOrString(4401));\n\n    // when\n    jwtProxyProvisioner.expose(\n        k8sEnv,\n        podWithName(),\n        \"machine\",\n        null,\n        port,\n        \"TCP\",\n        false,\n        ImmutableMap.of(\"server1\", server1));\n\n    // then\n    verify(configBuilder)\n        .addVerifierProxy(\n            eq(4400), eq(\"http://127.0.0.1:4401\"), eq(emptySet()), eq(false), eq(\"/\"), isNull());\n  }\n\n  @Test\n  public void multiHostStrategiesUsedForServerRequiringSubdomain() throws Exception {\n    // given\n    JwtProxyConfigBuilder configBuilder = mock(JwtProxyConfigBuilder.class);\n    when(configBuilderFactory.create(any())).thenReturn(configBuilder);\n\n    jwtProxyProvisioner =\n        new JwtProxyProvisioner(\n            signatureKeyManager,\n            configBuilderFactory,\n            serviceExposureStrategyProvider,\n            cookiePathStrategy,\n            multiHostCookiePathStrategy,\n            \"eclipse/che-jwtproxy\",\n            \"10m\",\n            \"128mb\",\n            \"0.02\",\n            \"0.5\",\n            runtimeId);\n\n    ServerConfigImpl server1 = new ServerConfigImpl(\"4401/tcp\", \"http\", \"/\", emptyMap());\n\n    ServicePort port = new ServicePort();\n    port.setTargetPort(new IntOrString(4401));\n\n    // when\n    jwtProxyProvisioner.expose(\n        k8sEnv,\n        podWithName(),\n        \"machine\",\n        null,\n        port,\n        \"TCP\",\n        true,\n        ImmutableMap.of(\"server1\", server1));\n\n    // then\n    verify(configBuilder)\n        .addVerifierProxy(\n            eq(4400), eq(\"http://127.0.0.1:4401\"), eq(emptySet()), eq(false), eq(\"/\"), isNull());\n    verify(externalServiceExposureStrategy, never()).getExternalPath(any(), any());\n    verify(cookiePathStrategy, never()).get(any(), any());\n    verify(multiHostExternalServiceExposureStrategy).getExternalPath(any(), any());\n    verify(multiHostCookiePathStrategy).get(any(), any());\n  }\n\n  private static PodData podWithName() {\n    ObjectMeta meta = new ObjectMeta();\n    meta.setName(\"a-pod-name\");\n    return new PodData(null, meta);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/JwtProxySecureServerExposerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyBoolean;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.ArgumentMatchers.isNull;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.Collections;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.IngressServerExposer;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link JwtProxySecureServerExposer}\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class JwtProxySecureServerExposerTest {\n\n  private static final String MACHINE_SERVICE_NAME = \"service123\";\n  private static final String MACHINE_NAME = \"machine123\";\n  public static final String JWT_PROXY_SERVICE_NAME = \"jwtProxyServiceName\";\n\n  @Mock private KubernetesEnvironment k8sEnv;\n  @Mock private JwtProxyProvisioner jwtProxyProvisioner;\n  @Mock private IngressServerExposer externalServerExposer;\n\n  private JwtProxySecureServerExposer<KubernetesEnvironment> secureServerExposer;\n\n  @BeforeMethod\n  public void setUp() {\n    secureServerExposer =\n        new JwtProxySecureServerExposer<>(jwtProxyProvisioner, externalServerExposer);\n  }\n\n  @Test\n  public void shouldExposeSecureServersWithNewJwtProxyServicePort() throws Exception {\n    // given\n    ServicePort machineServicePort = new ServicePort();\n    machineServicePort.setTargetPort(new IntOrString(8080));\n    machineServicePort.setProtocol(\"TCP\");\n    Map<String, ServerConfig> servers =\n        ImmutableMap.of(\n            \"server1\",\n            new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", ImmutableMap.of(\"secure\", \"true\")),\n            \"server2\",\n            new ServerConfigImpl(\"8080/tcp\", \"ws\", \"/connect\", ImmutableMap.of(\"secure\", \"true\")));\n\n    ServicePort jwtProxyServicePort = new ServicePort();\n    doReturn(jwtProxyServicePort)\n        .when(jwtProxyProvisioner)\n        .expose(any(), any(), anyString(), anyString(), any(), anyString(), anyBoolean(), any());\n\n    when(jwtProxyProvisioner.getServiceName()).thenReturn(JWT_PROXY_SERVICE_NAME);\n\n    when(externalServerExposer.getStrategyConformingServers(eq(servers))).thenReturn(servers);\n\n    // when\n    secureServerExposer.expose(\n        k8sEnv, null, MACHINE_NAME, MACHINE_SERVICE_NAME, null, machineServicePort, servers);\n\n    // then\n    verify(jwtProxyProvisioner)\n        .expose(\n            eq(k8sEnv),\n            any(),\n            anyString(),\n            eq(MACHINE_SERVICE_NAME),\n            eq(machineServicePort),\n            eq(\"TCP\"),\n            eq(false),\n            any());\n    verify(externalServerExposer)\n        .expose(\n            eq(k8sEnv),\n            eq(MACHINE_NAME),\n            eq(JWT_PROXY_SERVICE_NAME),\n            isNull(),\n            eq(jwtProxyServicePort),\n            eq(servers));\n  }\n\n  @Test\n  public void shouldUseMultiHostStrategyForSubdomainRequiringServers() throws Exception {\n    // given\n    ServicePort machineServicePort = new ServicePort();\n    machineServicePort.setTargetPort(new IntOrString(8080));\n    machineServicePort.setProtocol(\"TCP\");\n    Map<String, ServerConfig> servers =\n        ImmutableMap.of(\n            \"server1\",\n            new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", ImmutableMap.of(\"secure\", \"true\")),\n            \"server2\",\n            new ServerConfigImpl(\"8080/tcp\", \"ws\", \"/connect\", ImmutableMap.of(\"secure\", \"true\")));\n\n    Map<String, ServerConfig> conformingServers =\n        Collections.singletonMap(\"server1\", servers.get(\"server1\"));\n    Map<String, ServerConfig> subdomainServers =\n        Collections.singletonMap(\"server2\", servers.get(\"server2\"));\n\n    ServicePort jwtProxyServicePort = new ServicePort();\n    doReturn(jwtProxyServicePort)\n        .when(jwtProxyProvisioner)\n        .expose(any(), any(), anyString(), anyString(), any(), anyString(), anyBoolean(), any());\n\n    when(jwtProxyProvisioner.getServiceName()).thenReturn(JWT_PROXY_SERVICE_NAME);\n\n    when(externalServerExposer.getStrategyConformingServers(eq(servers)))\n        .thenReturn(conformingServers);\n    when(externalServerExposer.getServersRequiringSubdomain(eq(servers)))\n        .thenReturn(subdomainServers);\n\n    // when\n    secureServerExposer.expose(\n        k8sEnv, null, MACHINE_NAME, MACHINE_SERVICE_NAME, null, machineServicePort, servers);\n\n    // then\n    verify(jwtProxyProvisioner)\n        .expose(\n            eq(k8sEnv),\n            any(),\n            anyString(),\n            eq(MACHINE_SERVICE_NAME),\n            eq(machineServicePort),\n            eq(\"TCP\"),\n            eq(false),\n            any());\n    verify(jwtProxyProvisioner)\n        .expose(\n            eq(k8sEnv),\n            any(),\n            anyString(),\n            eq(MACHINE_SERVICE_NAME),\n            eq(machineServicePort),\n            eq(\"TCP\"),\n            eq(true),\n            any());\n    verify(externalServerExposer)\n        .expose(\n            eq(k8sEnv),\n            eq(MACHINE_NAME),\n            eq(JWT_PROXY_SERVICE_NAME),\n            isNull(),\n            eq(jwtProxyServicePort),\n            eq(conformingServers));\n    verify(externalServerExposer)\n        .expose(\n            eq(k8sEnv),\n            eq(MACHINE_NAME),\n            eq(JWT_PROXY_SERVICE_NAME),\n            isNull(),\n            eq(jwtProxyServicePort),\n            eq(subdomainServers));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/server/secure/jwtproxy/PassThroughProxyProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy;\n\nimport static java.util.Collections.singleton;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.ArgumentMatchers.isNull;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.RuntimeIdentityImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServiceExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ServiceExposureStrategyProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.factory.JwtProxyConfigBuilderFactory;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class PassThroughProxyProvisionerTest {\n\n  private static final String WORKSPACE_ID = \"workspace123\";\n  private final RuntimeIdentity runtimeId =\n      new RuntimeIdentityImpl(WORKSPACE_ID, \"env123\", \"owner123\", \"infraNamespace\");\n\n  // PassThroughProxyProvisioner shares much of the codebase with the JwtProxyProvisioner. We only\n  // test the different behavior here, while the majority of the tests are present in the\n  // JwtProxyProvisionerTest\n\n  @Test\n  public void shouldConfigureProxyWithExcludes() throws Exception {\n    // given\n    KubernetesEnvironment k8sEnv = KubernetesEnvironment.builder().build();\n    JwtProxyConfigBuilderFactory configBuilderFactory = mock(JwtProxyConfigBuilderFactory.class);\n    JwtProxyConfigBuilder configBuilder = mock(JwtProxyConfigBuilder.class);\n    when(configBuilderFactory.create(any())).thenReturn(configBuilder);\n\n    ServiceExposureStrategyProvider exposureStrategyProvider =\n        mock(ServiceExposureStrategyProvider.class);\n    when(exposureStrategyProvider.get()).thenReturn(mock(ExternalServiceExposureStrategy.class));\n    when(exposureStrategyProvider.getMultiHostStrategy())\n        .thenReturn(mock(ExternalServiceExposureStrategy.class));\n\n    PassThroughProxyProvisioner passThroughProxyProvisioner =\n        new PassThroughProxyProvisioner(\n            configBuilderFactory,\n            exposureStrategyProvider,\n            new CookiePathStrategy(MULTI_HOST_STRATEGY),\n            new MultiHostCookiePathStrategy(),\n            \"eclipse/che-jwtproxy\",\n            \"10m\",\n            \"128mb\",\n            \"0.02\",\n            \"0.5\",\n            runtimeId);\n\n    Map<String, String> attrs = new HashMap<>();\n    ServerConfig.setCookiesAuthEnabled(attrs, true);\n    ServerConfig.setSecure(attrs, true);\n    ServerConfigImpl server1 = new ServerConfigImpl(\"4401/tcp\", \"http\", \"/\", attrs);\n\n    ServicePort port = new ServicePort();\n    port.setTargetPort(new IntOrString(8080));\n\n    // when\n    passThroughProxyProvisioner.expose(\n        k8sEnv,\n        podWithName(),\n        \"machine\",\n        \"terminal\",\n        port,\n        \"TCP\",\n        false,\n        ImmutableMap.of(\"server1\", server1));\n\n    // then\n    verify(configBuilder)\n        .addVerifierProxy(\n            eq(4400), eq(\"http://terminal:8080\"), eq(singleton(\"/\")), eq(false), eq(\"/\"), isNull());\n  }\n\n  private static PodData podWithName() {\n    ObjectMeta meta = new ObjectMeta();\n    meta.setName(\"a-pod-name\");\n    return new PodData(null, meta);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/ContainersTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.Quantity;\nimport io.fabric8.kubernetes.api.model.ResourceRequirements;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link Containers}.\n *\n * @author Anton Korneta\n */\n@Listeners(MockitoTestNGListener.class)\npublic class ContainersTest {\n\n  private static final long RAM_LIMIT = 2147483648L;\n  private static final long RAM_REQUEST = 1474836480L;\n  private static final float CPU_LIMIT = 1.782f;\n  private static final float CPU_REQUEST = 0.223f;\n\n  @Mock private Container container;\n  @Mock private ResourceRequirements resource;\n\n  @Captor private ArgumentCaptor<ResourceRequirements> resourceCaptor;\n\n  private final Map<String, Quantity> limits = new HashMap<>();\n\n  @BeforeMethod\n  public void setup() {\n    when(container.getResources()).thenReturn(resource);\n\n    limits.put(\"memory\", new Quantity(String.valueOf(RAM_LIMIT)));\n    limits.put(\"cpu\", new Quantity(\"1.5\"));\n    lenient()\n        .when(resource.getLimits())\n        .thenReturn(\n            ImmutableMap.of(\n                \"memory\", new Quantity(String.valueOf(RAM_LIMIT)),\n                \"cpu\", new Quantity(String.valueOf(CPU_LIMIT))));\n    lenient()\n        .when(resource.getRequests())\n        .thenReturn(\n            ImmutableMap.of(\n                \"memory\", new Quantity(String.valueOf(RAM_REQUEST)),\n                \"cpu\", new Quantity(String.valueOf(CPU_REQUEST))));\n  }\n\n  @Test\n  public void testReturnContainerRamLimitAndRequest() {\n    long limit = Containers.getRamLimit(container);\n    long request = Containers.getRamRequest(container);\n\n    assertEquals(limit, RAM_LIMIT);\n    assertEquals(request, RAM_REQUEST);\n  }\n\n  @Test\n  public void testReturnContainerCPULimitAndRequest() {\n    float limit = Containers.getCpuLimit(container);\n    float request = Containers.getCpuRequest(container);\n\n    assertEquals(limit, CPU_LIMIT);\n    assertEquals(request, CPU_REQUEST);\n  }\n\n  @Test\n  public void testReturnsZeroWhenContainerResourcesIsNull() {\n    when(container.getResources()).thenReturn(null);\n\n    assertEquals(Containers.getRamLimit(container), 0);\n    assertEquals(Containers.getRamRequest(container), 0);\n    assertEquals(Containers.getCpuLimit(container), 0, 0.0);\n    assertEquals(Containers.getCpuRequest(container), 0, 0.0);\n  }\n\n  @Test\n  public void testReturnsZeroResourceWhenResourcesDoesNotContainIt() {\n    when(resource.getLimits()).thenReturn(Collections.emptyMap());\n    when(resource.getRequests()).thenReturn(Collections.emptyMap());\n\n    assertEquals(Containers.getRamLimit(container), 0);\n    assertEquals(Containers.getRamRequest(container), 0);\n    assertEquals(Containers.getCpuLimit(container), 0, 0.0);\n    assertEquals(Containers.getCpuRequest(container), 0, 0.0);\n  }\n\n  @Test\n  public void testReturnsZeroContainerLimitWhenActualValueIsNull() {\n    when(resource.getLimits())\n        .thenReturn(ImmutableMap.of(\"memory\", new Quantity(), \"cpu\", new Quantity()));\n\n    assertEquals(Containers.getRamLimit(container), 0);\n    assertEquals(Containers.getCpuLimit(container), 0, 0.0);\n  }\n\n  @Test\n  public void testReturnsZeroContainerRequestWhenActualValueIsNull() {\n    when(resource.getRequests())\n        .thenReturn(ImmutableMap.of(\"memory\", new Quantity(), \"cpu\", new Quantity()));\n\n    assertEquals(Containers.getRamRequest(container), 0);\n    assertEquals(Containers.getCpuRequest(container), 0, 0.0);\n  }\n\n  @Test\n  public void testAddContainerRamLimitWhenResourceIsNull() {\n    when(container.getResources()).thenReturn(null);\n\n    Containers.addRamLimit(container, RAM_LIMIT);\n\n    verify(container).setResources(resourceCaptor.capture());\n    final ResourceRequirements captured = resourceCaptor.getValue();\n    assertEquals(captured.getLimits().get(\"memory\").getAmount(), String.valueOf(RAM_LIMIT));\n  }\n\n  @Test\n  public void testAddContainerCPULimitWhenResourceIsNull() {\n    when(container.getResources()).thenReturn(null);\n\n    Containers.addCpuLimit(container, CPU_LIMIT);\n\n    verify(container).setResources(resourceCaptor.capture());\n    final ResourceRequirements captured = resourceCaptor.getValue();\n    assertEquals(captured.getLimits().get(\"cpu\").getAmount(), String.valueOf(CPU_LIMIT));\n  }\n\n  @Test\n  public void testAddContainerRamRequestWhenResourceIsNull() {\n    when(container.getResources()).thenReturn(null);\n\n    Containers.addRamRequest(container, RAM_REQUEST);\n\n    verify(container).setResources(resourceCaptor.capture());\n    final ResourceRequirements captured = resourceCaptor.getValue();\n    assertEquals(captured.getRequests().get(\"memory\").getAmount(), String.valueOf(RAM_REQUEST));\n  }\n\n  @Test\n  public void testAddContainerCPURequestWhenResourceIsNull() {\n    when(container.getResources()).thenReturn(null);\n\n    Containers.addCpuRequest(container, CPU_REQUEST);\n\n    verify(container).setResources(resourceCaptor.capture());\n    final ResourceRequirements captured = resourceCaptor.getValue();\n    assertEquals(captured.getRequests().get(\"cpu\").getAmount(), String.valueOf(CPU_REQUEST));\n  }\n\n  @Test\n  public void testAddContainerRamLimitWhenResourceDoesNotContainAnyLimits() {\n    when(resource.getLimits()).thenReturn(null);\n\n    Containers.addRamLimit(container, RAM_LIMIT);\n\n    verify(container).setResources(resourceCaptor.capture());\n    final ResourceRequirements captured = resourceCaptor.getValue();\n    assertEquals(captured.getLimits().get(\"memory\").getAmount(), String.valueOf(RAM_LIMIT));\n  }\n\n  @Test\n  public void testAddContainerCPULimitWhenResourceDoesNotContainAnyLimits() {\n    when(resource.getLimits()).thenReturn(null);\n\n    Containers.addCpuLimit(container, CPU_LIMIT);\n\n    verify(container).setResources(resourceCaptor.capture());\n    final ResourceRequirements captured = resourceCaptor.getValue();\n    assertEquals(captured.getLimits().get(\"cpu\").getAmount(), String.valueOf(CPU_LIMIT));\n  }\n\n  @Test\n  public void testAddContainerRamRequestWhenResourceDoesNotContainAnyLimits() {\n    when(resource.getLimits()).thenReturn(null);\n\n    Containers.addRamRequest(container, RAM_REQUEST);\n\n    verify(container).setResources(resourceCaptor.capture());\n    final ResourceRequirements captured = resourceCaptor.getValue();\n    assertEquals(captured.getRequests().get(\"memory\").getAmount(), String.valueOf(RAM_REQUEST));\n  }\n\n  @Test\n  public void testAddContainerCPURequestWhenResourceDoesNotContainAnyLimits() {\n    when(resource.getLimits()).thenReturn(null);\n\n    Containers.addCpuRequest(container, CPU_REQUEST);\n\n    verify(container).setResources(resourceCaptor.capture());\n    final ResourceRequirements captured = resourceCaptor.getValue();\n    assertEquals(captured.getRequests().get(\"cpu\").getAmount(), String.valueOf(CPU_REQUEST));\n  }\n\n  @Test(dataProvider = \"k8sNotionRamLimitProvider\")\n  public void testAddContainerRamLimitInK8sNotion(\n      String ramLimit, String amount, String format, ResourceRequirements resources) {\n    when(container.getResources()).thenReturn(resources);\n\n    Containers.addRamLimit(container, ramLimit);\n\n    verify(container).setResources(resourceCaptor.capture());\n    ResourceRequirements captured = resourceCaptor.getValue();\n    assertEquals(captured.getLimits().get(\"memory\").getAmount(), amount);\n    assertEquals(captured.getLimits().get(\"memory\").getFormat(), format);\n  }\n\n  @Test(dataProvider = \"k8sNotionRamLimitProvider\")\n  public void testAddContainerRamRequestInK8sNotion(\n      String ramRequest, String amount, String format, ResourceRequirements resources) {\n    when(container.getResources()).thenReturn(resources);\n\n    Containers.addRamRequest(container, ramRequest);\n\n    verify(container).setResources(resourceCaptor.capture());\n    ResourceRequirements captured = resourceCaptor.getValue();\n    assertEquals(captured.getRequests().get(\"memory\").getAmount(), amount);\n    assertEquals(captured.getRequests().get(\"memory\").getFormat(), format);\n  }\n\n  @DataProvider\n  public static Object[][] k8sNotionRamLimitProvider() {\n    return new Object[][] {\n      {\"123456789\", \"123456789\", \"\", new ResourceRequirements()},\n      {\"1M\", \"1\", \"M\", new ResourceRequirements()},\n      {\"10Ki\", \"10\", \"Ki\", null},\n      {\"10G\", \"10\", \"G\", null},\n    };\n  }\n\n  @Test(dataProvider = \"k8sNotionCpuLimitProvider\")\n  public void testAddContainerCPULimitInK8sNotion(\n      String cpuLimit, String amount, String format, ResourceRequirements resources) {\n    when(container.getResources()).thenReturn(resources);\n\n    Containers.addCpuLimit(container, cpuLimit);\n\n    verify(container).setResources(resourceCaptor.capture());\n    ResourceRequirements captured = resourceCaptor.getValue();\n    assertEquals(captured.getLimits().get(\"cpu\").getAmount(), amount);\n    assertEquals(captured.getLimits().get(\"cpu\").getFormat(), format);\n  }\n\n  @Test(dataProvider = \"k8sNotionCpuLimitProvider\")\n  public void testAddContainerCpuRequestInK8sNotion(\n      String cpuRequest, String amount, String format, ResourceRequirements resources) {\n    when(container.getResources()).thenReturn(resources);\n\n    Containers.addCpuRequest(container, cpuRequest);\n\n    verify(container).setResources(resourceCaptor.capture());\n    ResourceRequirements captured = resourceCaptor.getValue();\n    assertEquals(captured.getRequests().get(\"cpu\").getAmount(), amount);\n    assertEquals(captured.getRequests().get(\"cpu\").getFormat(), format);\n  }\n\n  @DataProvider\n  public static Object[][] k8sNotionCpuLimitProvider() {\n    return new Object[][] {\n      {\"100m\", \"100\", \"m\", new ResourceRequirements()},\n      {\"1000m\", \"1000\", \"m\", new ResourceRequirements()},\n      {\"112m\", \"112\", \"m\", null},\n      {\"155m\", \"155\", \"m\", null},\n    };\n  }\n\n  @Test\n  public void testReturnContainerCPULimitAndRequestConvertedToFullCores() {\n    when(resource.getLimits()).thenReturn(ImmutableMap.of(\"cpu\", new Quantity(\"1000\", \"m\")));\n    when(resource.getRequests()).thenReturn(ImmutableMap.of(\"cpu\", new Quantity(\"30\", \"m\")));\n\n    assertEquals(Containers.getCpuLimit(container), 1);\n    assertEquals(Containers.getCpuRequest(container), 0.03, 0.000000001);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/EnvVarsTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport static java.util.Collections.emptySet;\nimport static java.util.Collections.singleton;\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.util.EnvVars.extractReferencedVariables;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.ContainerBuilder;\nimport io.fabric8.kubernetes.api.model.EnvVar;\nimport io.fabric8.kubernetes.api.model.EnvVarSource;\nimport io.fabric8.kubernetes.api.model.EnvVarSourceBuilder;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.SecretKeySelectorBuilder;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EnvImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class EnvVarsTest {\n\n  private EnvVars envVars = new EnvVars();\n\n  @Test(dataProvider = \"detectReferencesTestValues\")\n  public void shouldDetectReferences(String value, Set<EnvVar> expected, String caseName) {\n    assertEquals(\n        extractReferencedVariables(var(\"name\", value)), expected, caseName + \": just value\");\n    assertEquals(\n        extractReferencedVariables(var(\"name\", \"v\" + value)),\n        expected,\n        caseName + \": value with prefix\");\n    assertEquals(\n        extractReferencedVariables(var(\"name\", \"v\" + value + \"v\")),\n        expected,\n        caseName + \": value with prefix and postfix\");\n    assertEquals(\n        extractReferencedVariables(var(\"name\", value + \"v\")),\n        expected,\n        caseName + \": value with postfix\");\n  }\n\n  @DataProvider\n  public static Object[][] detectReferencesTestValues() {\n    return new Object[][] {\n      new Object[] {\"value\", emptySet(), \"no refs\"},\n      new Object[] {\"$(NO_REF\", emptySet(), \"unclosed ref\"},\n      new Object[] {\"$$(NO_REF)\", emptySet(), \"escaped ref\"},\n      new Object[] {\"$NO_REF)\", emptySet(), \"invalid start ref\"},\n      new Object[] {\"$(NO REF)\", emptySet(), \"invalid name ref\"},\n      new Object[] {\"$(REF)\", singleton(\"REF\"), \"valid ref\"}\n    };\n  }\n\n  @Test\n  public void shouldDetectMultipleReferences() throws Exception {\n    // given\n    EnvVar envVar = var(\"a\", \"$(b) $(c) $$(d)\");\n\n    // when\n    Set<String> refs = extractReferencedVariables(envVar);\n\n    // then\n    assertEquals(refs, new HashSet<>(Arrays.asList(\"b\", \"c\")));\n  }\n\n  @Test\n  public void shouldReturnEmptySetOnEnvContainingValueFrom() throws Exception {\n    // given\n    EnvVar envVar = var(\"a\", null);\n    envVar.setValueFrom(\n        new EnvVarSourceBuilder()\n            .withSecretKeyRef(\n                new SecretKeySelectorBuilder()\n                    .withName(\"secret_name\")\n                    .withKey(\"secret_key\")\n                    .build())\n            .build());\n\n    // when\n    Set<String> refs = extractReferencedVariables(envVar);\n\n    // then\n    assertTrue(refs.isEmpty());\n  }\n\n  @Test\n  public void shouldProvisionEnvIfContainersDoeNotHaveEnvAtAll() throws Exception {\n    // given\n    PodData pod =\n        new PodData(\n            new PodBuilder()\n                .withNewMetadata()\n                .withName(\"pod\")\n                .endMetadata()\n                .withNewSpec()\n                .withInitContainers(new ContainerBuilder().withName(\"initContainer\").build())\n                .withContainers(new ContainerBuilder().withName(\"container\").build())\n                .endSpec()\n                .build());\n\n    // when\n    envVars.apply(pod, singletonList(new EnvImpl(\"TEST_ENV\", \"anyValue\")));\n\n    // then\n    List<EnvVar> initCEnv = pod.getSpec().getInitContainers().get(0).getEnv();\n    assertEquals(initCEnv.size(), 1);\n    assertEquals(initCEnv.get(0), new EnvVar(\"TEST_ENV\", \"anyValue\", null));\n\n    List<EnvVar> containerEnv = pod.getSpec().getContainers().get(0).getEnv();\n    assertEquals(containerEnv.size(), 1);\n    assertEquals(containerEnv.get(0), new EnvVar(\"TEST_ENV\", \"anyValue\", null));\n  }\n\n  @Test\n  public void shouldOverrideEnvOnApplyingEnvVarIfContainersAlreadyHaveSomeEnvVars()\n      throws Exception {\n    // given\n    EnvVar existingInitCEnvVar = new EnvVar(\"TEST_ENV\", \"value\", null);\n    EnvVar existingCEnvVar = new EnvVar(\"TEST_ENV\", null, new EnvVarSource());\n    PodData pod =\n        new PodData(\n            new PodBuilder()\n                .withNewMetadata()\n                .withName(\"pod\")\n                .endMetadata()\n                .withNewSpec()\n                .withInitContainers(\n                    new ContainerBuilder()\n                        .withName(\"initContainer\")\n                        .withEnv(copy(existingInitCEnvVar))\n                        .build())\n                .withContainers(\n                    new ContainerBuilder()\n                        .withName(\"container\")\n                        .withEnv(copy(existingCEnvVar))\n                        .build())\n                .endSpec()\n                .build());\n\n    // when\n    envVars.apply(pod, singletonList(new EnvImpl(\"TEST_ENV\", \"anyValue\")));\n\n    // then\n    List<EnvVar> initCEnv = pod.getSpec().getInitContainers().get(0).getEnv();\n    assertEquals(initCEnv.size(), 1);\n    assertEquals(initCEnv.get(0), new EnvVar(\"TEST_ENV\", \"anyValue\", null));\n\n    List<EnvVar> containerEnv = pod.getSpec().getContainers().get(0).getEnv();\n    assertEquals(containerEnv.size(), 1);\n    assertEquals(containerEnv.get(0), new EnvVar(\"TEST_ENV\", \"anyValue\", null));\n  }\n\n  @Test\n  public void shouldProvisionEnvIntoK8SListIfContainerAlreadyHasSomeEnvVars() throws Exception {\n\n    // given\n    EnvVar existingInitCEnvVar = new EnvVar(\"ENV\", \"value\", null);\n    EnvVar existingCEnvVar = new EnvVar(\"ENV\", null, new EnvVarSource());\n    PodData pod =\n        new PodData(\n            new PodBuilder()\n                .withNewMetadata()\n                .withName(\"pod\")\n                .endMetadata()\n                .withNewSpec()\n                .withInitContainers(\n                    new ContainerBuilder()\n                        .withName(\"initContainer\")\n                        .withEnv(copy(existingInitCEnvVar))\n                        .build())\n                .withContainers(\n                    new ContainerBuilder()\n                        .withName(\"container\")\n                        .withEnv(copy(existingCEnvVar))\n                        .build())\n                .endSpec()\n                .build());\n\n    // when\n    envVars.apply(pod, singletonList(new EnvImpl(\"TEST_ENV\", \"anyValue\")));\n\n    // then\n    List<EnvVar> initCEnv = pod.getSpec().getInitContainers().get(0).getEnv();\n    assertEquals(initCEnv.size(), 2);\n    assertEquals(initCEnv.get(0), existingInitCEnvVar);\n    assertEquals(initCEnv.get(1), new EnvVar(\"TEST_ENV\", \"anyValue\", null));\n\n    List<EnvVar> containerEnv = pod.getSpec().getContainers().get(0).getEnv();\n    assertEquals(containerEnv.size(), 2);\n    assertEquals(containerEnv.get(0), existingCEnvVar);\n    assertEquals(containerEnv.get(1), new EnvVar(\"TEST_ENV\", \"anyValue\", null));\n  }\n\n  private static EnvVar var(String name, String value) {\n    return new EnvVar(name, value, null);\n  }\n\n  private EnvVar copy(EnvVar envVar) {\n    return new EnvVar(envVar.getName(), envVar.getValue(), envVar.getValueFrom());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/GatewayConfigmapLabelsTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport java.util.Map;\nimport org.eclipse.che.inject.ConfigurationException;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class GatewayConfigmapLabelsTest {\n\n  @Test(dataProvider = \"isGatewayConfigData\")\n  public void testIsGatewayConfig(\n      String labelsProperty, Map<String, String> labels, boolean isGatewayConfigExpected) {\n    GatewayConfigmapLabels gatewayConfigmapLabels = new GatewayConfigmapLabels(labelsProperty);\n    ConfigMap cm =\n        new ConfigMapBuilder().withNewMetadata().withLabels(labels).endMetadata().build();\n    assertEquals(gatewayConfigmapLabels.isGatewayConfig(cm), isGatewayConfigExpected);\n  }\n\n  @Test(expectedExceptions = ConfigurationException.class)\n  public void failsToConstructWhenLabelsAreNull() {\n    new GatewayConfigmapLabels(null);\n  }\n\n  @Test(expectedExceptions = ConfigurationException.class)\n  public void failsToConstructWhenLabelsAreEmpty() {\n    new GatewayConfigmapLabels(\"\");\n  }\n\n  @Test(expectedExceptions = ConfigurationException.class)\n  public void failsToConstructWhenLabelsAreNotValid() {\n    new GatewayConfigmapLabels(\"badvalue\");\n  }\n\n  @DataProvider\n  public Object[][] isGatewayConfigData() {\n    return new Object[][] {\n      {\n        \"app=che,component=che-gateway-config\",\n        ImmutableMap.of(\"app\", \"che\", \"component\", \"che-gateway-config\"),\n        true\n      },\n      {\n        \"app=che, component=che-gateway-config\",\n        ImmutableMap.of(\"app\", \"che\", \"component\", \"che-gateway-config\"),\n        true\n      },\n      {\"app=che\", ImmutableMap.of(\"app\", \"che\", \"component\", \"che-gateway-config\"), true},\n      {\n        \"app=che,component=che-gateway-config\",\n        ImmutableMap.of(\"app\", \"cheche\", \"component\", \"che-gateway-config\"),\n        false\n      },\n      {\"app=che,component=che-gateway-config\", ImmutableMap.of(\"app\", \"cheche\"), false},\n      {\n        \"app=che,component=che-gateway-config\",\n        ImmutableMap.of(\"component\", \"che-gateway-config\"),\n        false\n      },\n    };\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/IngressesTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport static java.util.Collections.singletonList;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServiceSpec;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressPath;\nimport io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressRuleValue;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressRule;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressServiceBackend;\nimport io.fabric8.kubernetes.api.model.networking.v1.IngressSpec;\nimport io.fabric8.kubernetes.api.model.networking.v1.ServiceBackendPort;\nimport java.util.Optional;\nimport org.testng.annotations.Test;\n\npublic class IngressesTest {\n\n  @Test\n  public void findHostWhenPortDefinedByString() {\n    final String SERVER_PORT_NAME = \"server-8080\";\n    final int PORT = 8080;\n\n    Service service = createService(SERVER_PORT_NAME, PORT);\n    Ingress ingress =\n        createIngress(\n            new IngressBackend(\n                null,\n                new IngressServiceBackend(\n                    \"servicename\", new ServiceBackendPort(SERVER_PORT_NAME, PORT))));\n\n    Optional<IngressRule> foundRule =\n        Ingresses.findIngressRuleForServicePort(singletonList(ingress), service, PORT);\n    assertTrue(foundRule.isPresent());\n    assertEquals(foundRule.get().getHost(), \"ingresshost\");\n  }\n\n  @Test\n  public void findHostWhenPortDefinedByInt() {\n    final String SERVER_PORT_NAME = \"server-8080\";\n    final int PORT = 8080;\n\n    Service service = createService(SERVER_PORT_NAME, PORT);\n    Ingress ingress =\n        createIngress(\n            new IngressBackend(\n                null,\n                new IngressServiceBackend(\n                    \"servicename\", new ServiceBackendPort(SERVER_PORT_NAME, PORT))));\n\n    Optional<IngressRule> foundRule =\n        Ingresses.findIngressRuleForServicePort(singletonList(ingress), service, PORT);\n    assertTrue(foundRule.isPresent());\n    assertEquals(foundRule.get().getHost(), \"ingresshost\");\n  }\n\n  @Test\n  public void emptyWhenPortByStringAndNotFound() {\n    final String SERVER_PORT_NAME = \"server-8080\";\n    final int PORT = 8080;\n\n    Service service = createService(SERVER_PORT_NAME, PORT);\n    Ingress ingress =\n        createIngress(\n            new IngressBackend(\n                null,\n                new IngressServiceBackend(\n                    \"servicename\", new ServiceBackendPort(\"does not exist\", null))));\n\n    Optional<IngressRule> foundRule =\n        Ingresses.findIngressRuleForServicePort(singletonList(ingress), service, PORT);\n    assertFalse(foundRule.isPresent());\n  }\n\n  @Test\n  public void emptyWhenPortByIntAndNotFound() {\n    final String SERVER_PORT_NAME = \"server-8080\";\n    final int PORT = 8080;\n\n    Service service = createService(SERVER_PORT_NAME, PORT);\n    Ingress ingress =\n        createIngress(\n            new IngressBackend(\n                null, new IngressServiceBackend(\"servicename\", new ServiceBackendPort(null, 666))));\n\n    Optional<IngressRule> foundRule =\n        Ingresses.findIngressRuleForServicePort(singletonList(ingress), service, PORT);\n    assertFalse(foundRule.isPresent());\n  }\n\n  private Service createService(String serverPortName, int port) {\n    Service service = new Service();\n    ObjectMeta serviceMeta = new ObjectMeta();\n    serviceMeta.setName(\"servicename\");\n    service.setMetadata(serviceMeta);\n    ServiceSpec serviceSpec = new ServiceSpec();\n    serviceSpec.setPorts(\n        singletonList(\n            new ServicePort(null, serverPortName, null, port, \"TCP\", new IntOrString(port))));\n    service.setSpec(serviceSpec);\n    return service;\n  }\n\n  private Ingress createIngress(IngressBackend backend) {\n    Ingress ingress = new Ingress();\n    ObjectMeta ingressMeta = new ObjectMeta();\n    ingressMeta.setName(\"ingressname\");\n    ingress.setMetadata(ingressMeta);\n    IngressSpec ingressSpec = new IngressSpec();\n    IngressRule ingressRule = new IngressRule();\n    ingressRule.setHost(\"ingresshost\");\n    ingressRule.setHttp(\n        new HTTPIngressRuleValue(singletonList(new HTTPIngressPath(backend, null, null))));\n    ingressSpec.setRules(singletonList(ingressRule));\n    ingress.setSpec(ingressSpec);\n    return ingress;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/KubernetesSizeTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport static org.testng.Assert.assertEquals;\n\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link KubernetesSize}.\n *\n * @author Anton Korneta\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesSizeTest {\n\n  @Test(dataProvider = \"validSizes\")\n  public void testParseKubernetesMemoryFormatsToBytes(String kubeSize, long expectedBytes)\n      throws Exception {\n    assertEquals(KubernetesSize.toBytes(kubeSize), expectedBytes);\n  }\n\n  @Test(dataProvider = \"validCpuLimits\")\n  public void testParseKubernetesCpuFormatsToCores(String kubeSize, float expectedCores)\n      throws Exception {\n    assertEquals(KubernetesSize.toCores(kubeSize), expectedCores);\n  }\n\n  @DataProvider(name = \"validSizes\")\n  public Object[][] correctKubernetesMemoryFormats() {\n    return new Object[][] {\n      {\"123Mi\", 128974848}, {\"129M\", 129000000}, {\"129e6\", 129000000}, {\"129e+6\", 129000000}\n    };\n  }\n\n  @DataProvider(name = \"validCpuLimits\")\n  public Object[][] correctKubernetesCpuLimits() {\n    return new Object[][] {{\"0.1\", 0.1f}, {\"1250m\", 1.250f}, {\"-1\", -1f}, {\"60m\", 0.06f}};\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/PodEventsTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport java.text.ParseException;\nimport java.util.Date;\nimport org.testng.Assert;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link PodEvents}.\n *\n * @author Ilya Buziuk\n */\npublic class PodEventsTest {\n\n  @Test\n  public void eventDateShouldBeBeforeCurrentDate() throws ParseException {\n    String eventTime = \"2018-05-15T16:17:54Z\";\n    Date eventDate = PodEvents.convertEventTimestampToDate(eventTime);\n    Assert.assertTrue(eventDate.before(new Date()));\n  }\n\n  @Test(expectedExceptions = ParseException.class)\n  public void throwsParseExceptionWhenDateFormatIsInvalid() throws ParseException {\n    String eventTime = \"2018-05-15T16:143435Z\";\n    PodEvents.convertEventTimestampToDate(eventTime);\n  }\n\n  @Test(expectedExceptions = ParseException.class)\n  public void throwsIllegalArgumentExceptionWhenDateIs12DotSring() throws ParseException {\n    String eventTime = \"12.\";\n    PodEvents.convertEventTimestampToDate(eventTime);\n  }\n\n  @Test(expectedExceptions = IllegalArgumentException.class)\n  public void throwsIllegalArgumentExceptionWhenDateIsNull() throws ParseException {\n    String eventTime = null;\n    PodEvents.convertEventTimestampToDate(eventTime);\n  }\n\n  @Test(expectedExceptions = IllegalArgumentException.class)\n  public void throwsIllegalArgumentExceptionWhenDateIsEmptyString() throws ParseException {\n    String eventTime = \"\";\n    PodEvents.convertEventTimestampToDate(eventTime);\n  }\n\n  @Test\n  public void getEventTimestampFromDate() throws ParseException {\n    String timestamp = \"2018-05-15T16:17:54Z\";\n    Date date = PodEvents.convertEventTimestampToDate(timestamp);\n    String timestampFromDate = PodEvents.convertDateToEventTimestamp(date);\n    Date dateAfterParsingTimestamp = PodEvents.convertEventTimestampToDate(timestampFromDate);\n    Assert.assertEquals(date, dateAfterParsingTimestamp);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/ServicesTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport static org.testng.Assert.assertEquals;\n\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServiceSpec;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Optional;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class ServicesTest {\n\n  @Test(dataProvider = \"nullService\")\n  public void testFindPortShouldReturnEmptyWhenSomethingIsNull(Service service) {\n    assertEquals(Services.findPort(service, 1), Optional.empty());\n  }\n\n  @Test\n  public void testFindPortWhenExists() {\n    final int PORT = 1234;\n\n    Service service = new Service();\n    ServiceSpec spec = new ServiceSpec();\n    ServicePort port = new ServicePort();\n    port.setPort(PORT);\n    spec.setPorts(Arrays.asList(port, new ServicePort()));\n    service.setSpec(spec);\n\n    assertEquals(Services.findPort(service, PORT).get(), port);\n  }\n\n  @Test(dataProvider = \"nullServices\")\n  public void testFindServiceWithPortShouldReturnEmptyWhenSomethingIsNull(\n      Collection<Service> services) {\n    assertEquals(Services.findServiceWithPort(services, 1), Optional.empty());\n  }\n\n  @Test\n  public void testFindServiceWhenExists() {\n    final int PORT = 1234;\n\n    Service service = new Service();\n    ServiceSpec spec = new ServiceSpec();\n    ServicePort port = new ServicePort();\n    port.setPort(PORT);\n    spec.setPorts(Collections.singletonList(port));\n    service.setSpec(spec);\n\n    assertEquals(\n        Services.findServiceWithPort(Arrays.asList(service, new Service()), PORT).get(), service);\n  }\n\n  @DataProvider\n  public Object[][] nullService() {\n    List<Service> nullServices = createNullServices();\n    Object[][] returnObjects = new Object[nullServices.size()][1];\n    for (int i = 0; i < nullServices.size(); i++) {\n      returnObjects[i][0] = nullServices.get(i);\n    }\n\n    return returnObjects;\n  }\n\n  @DataProvider\n  public Object[][] nullServices() {\n    List<Service> nullServices = createNullServices();\n\n    Object[][] returnObjects = new Object[nullServices.size() + 1][1];\n    for (int i = 0; i < nullServices.size(); i++) {\n      returnObjects[i][0] = Collections.singletonList(nullServices.get(i));\n    }\n    returnObjects[returnObjects.length - 1][0] = null;\n\n    return returnObjects;\n  }\n\n  private List<Service> createNullServices() {\n    List<Service> nullServices = new ArrayList<>();\n\n    nullServices.add(null);\n\n    Service service = new Service();\n    service.setSpec(null);\n    nullServices.add(service);\n\n    service = new Service();\n    ServiceSpec spec = new ServiceSpec();\n    spec.setPorts(null);\n    service.setSpec(spec);\n    nullServices.add(service);\n\n    service = new Service();\n    spec = new ServiceSpec();\n    ServicePort port = new ServicePort();\n    port.setPort(null);\n    spec.setPorts(Collections.singletonList(port));\n    service.setSpec(spec);\n    nullServices.add(service);\n\n    return nullServices;\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/util/UnrecoverablePodEventListenerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.util;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport com.google.common.collect.ImmutableSet;\nimport java.util.Date;\nimport java.util.Set;\nimport java.util.function.Consumer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.event.PodEvent;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link UnrecoverablePodEventListener}.\n *\n * @author Sergii Leshchenko\n * @author Ilya Buziuk\n */\n@Listeners(MockitoTestNGListener.class)\npublic class UnrecoverablePodEventListenerTest {\n\n  private static final String WORKSPACE_POD_NAME = \"app\";\n  private static final String CONTAINER_NAME_1 = \"test1\";\n  private static final String EVENT_CREATION_TIMESTAMP = \"2018-05-15T16:17:54Z\";\n\n  /* Pods created by a deployment are created with a random suffix, so Pod names won't match\n  exactly. */\n  private static final String POD_NAME_RANDOM_SUFFIX = \"-12345\";\n\n  private static final Set<String> UNRECOVERABLE_EVENTS =\n      ImmutableSet.of(\"Failed Mount\", \"Failed Scheduling\", \"Failed to pull image\");\n\n  @Mock private Consumer<PodEvent> unrecoverableEventConsumer;\n\n  private UnrecoverablePodEventListener unrecoverableEventListener;\n\n  @BeforeMethod\n  public void setUp() {\n    unrecoverableEventListener =\n        new UnrecoverablePodEventListener(\n            UNRECOVERABLE_EVENTS, ImmutableSet.of(WORKSPACE_POD_NAME), unrecoverableEventConsumer);\n  }\n\n  @Test\n  public void testHandleUnrecoverableEventByReason() throws Exception {\n    // given\n    String unrecoverableEventReason = \"Failed Mount\";\n    PodEvent unrecoverableEvent =\n        mockContainerEvent(\n            WORKSPACE_POD_NAME,\n            unrecoverableEventReason,\n            \"Failed to mount volume 'claim-che-workspace'\",\n            EVENT_CREATION_TIMESTAMP,\n            getCurrentTimestampWithOneHourShiftAhead());\n\n    // when\n    unrecoverableEventListener.handle(unrecoverableEvent);\n\n    // then\n    verify(unrecoverableEventConsumer).accept(unrecoverableEvent);\n  }\n\n  @Test\n  public void testHandleUnrecoverableEventByMessage() throws Exception {\n    // given\n    String unrecoverableEventMessage = \"Failed to pull image eclipse/che-server:nightly-centos\";\n    PodEvent unrecoverableEvent =\n        mockContainerEvent(\n            WORKSPACE_POD_NAME,\n            \"Pulling\",\n            unrecoverableEventMessage,\n            EVENT_CREATION_TIMESTAMP,\n            getCurrentTimestampWithOneHourShiftAhead());\n\n    // when\n    unrecoverableEventListener.handle(unrecoverableEvent);\n\n    // then\n    verify(unrecoverableEventConsumer).accept(unrecoverableEvent);\n  }\n\n  @Test\n  public void testDoNotHandleUnrecoverableEventFromNonWorkspacePod() throws Exception {\n    // given\n    final String unrecoverableEventMessage =\n        \"Failed to pull image eclipse/che-server:nightly-centos\";\n    final PodEvent unrecoverableEvent =\n        mockContainerEvent(\n            \"NonWorkspacePod\",\n            \"Pulling\",\n            unrecoverableEventMessage,\n            EVENT_CREATION_TIMESTAMP,\n            getCurrentTimestampWithOneHourShiftAhead());\n\n    // when\n    unrecoverableEventListener.handle(unrecoverableEvent);\n\n    // then\n    verify(unrecoverableEventConsumer, never()).accept(any());\n  }\n\n  @Test\n  public void testHandleRegularEvent() throws Exception {\n    // given\n    final PodEvent regularEvent =\n        mockContainerEvent(\n            WORKSPACE_POD_NAME,\n            \"Pulling\",\n            \"pulling image\",\n            EVENT_CREATION_TIMESTAMP,\n            getCurrentTimestampWithOneHourShiftAhead());\n\n    // when\n    unrecoverableEventListener.handle(regularEvent);\n\n    // then\n    verify(unrecoverableEventConsumer, never()).accept(any());\n  }\n\n  @Test\n  public void testFailedContainersInWorkspacePodAlwaysHandled() {\n    // given\n    PodEvent ev =\n        mockContainerEvent(\n            WORKSPACE_POD_NAME,\n            \"Failed\",\n            \"bah\",\n            EVENT_CREATION_TIMESTAMP,\n            getCurrentTimestampWithOneHourShiftAhead());\n\n    // when\n    unrecoverableEventListener.handle(ev);\n\n    // then\n    verify(unrecoverableEventConsumer).accept(any());\n  }\n\n  /**\n   * Mock a container event, as though it was triggered by the OpenShift API. As workspace Pods are\n   * created indirectly through deployments, they are given generated names with the provided name\n   * as a root. <br>\n   * Use this method in a test to ensure that tested code manages this fact correctly. For example,\n   * code such as unrecoverable events handling cannot directly look at an event's pod name and\n   * compare it to the internal representation, and so must confirm the event is relevant in some\n   * other way.\n   */\n  private static PodEvent mockContainerEvent(\n      String podName,\n      String reason,\n      String message,\n      String creationTimestamp,\n      String lastTimestamp) {\n    final PodEvent event = mock(PodEvent.class);\n    when(event.getPodName()).thenReturn(podName + POD_NAME_RANDOM_SUFFIX);\n    lenient().when(event.getContainerName()).thenReturn(CONTAINER_NAME_1);\n    lenient().when(event.getReason()).thenReturn(reason);\n    lenient().when(event.getMessage()).thenReturn(message);\n    lenient().when(event.getCreationTimeStamp()).thenReturn(creationTimestamp);\n    lenient().when(event.getLastTimestamp()).thenReturn(lastTimestamp);\n    return event;\n  }\n\n  private String getCurrentTimestampWithOneHourShiftAhead() {\n    Date currentTimestampWithOneHourShiftAhead = new Date(new Date().getTime() + 3600 * 1000);\n    return PodEvents.convertDateToEventTimestamp(currentTimestampWithOneHourShiftAhead);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/BrokersResultTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.singletonList;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.fail;\n\nimport java.util.List;\nimport java.util.concurrent.Callable;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\npublic class BrokersResultTest {\n\n  private ExecutorService executor;\n  private BrokersResult brokersResult;\n\n  @BeforeMethod\n  public void setUp() {\n    brokersResult = new BrokersResult();\n    executor = Executors.newSingleThreadExecutor();\n  }\n\n  @AfterMethod\n  public void tearDown() {\n    executor.shutdown();\n    executor.shutdownNow();\n  }\n\n  @Test(\n      expectedExceptions = IllegalStateException.class,\n      expectedExceptionsMessageRegExp =\n          \"Submitting a broker error is not allowed before calling BrokerResult#get\")\n  public void shouldThrowExceptionOnCallingErrorBeforeCallGet() {\n    brokersResult.error(new Exception());\n  }\n\n  @Test(\n      expectedExceptions = IllegalStateException.class,\n      expectedExceptionsMessageRegExp =\n          \"Submitting a broker result is not allowed before calling BrokerResult#get\")\n  public void shouldThrowExceptionOnCallingAddResultBeforeCallGet() throws Exception {\n    brokersResult.setResult(emptyList());\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Plugins brokering result is unexpectedly submitted more than one time. This indicates unexpected behavior of the system\")\n  public void shouldThrowExceptionIfResultIsSubmittedSecondTime() throws Exception {\n    // given\n    executeBrokerGet();\n    waitBrokerGetCalled();\n\n    // when\n    brokersResult.setResult(singletonList(new ChePlugin()));\n\n    // then\n    brokersResult.setResult(singletonList(new ChePlugin()));\n  }\n\n  @Test\n  public void shouldReturnResultOfBroker() throws Exception {\n    // given\n    ChePlugin chePlugin = new ChePlugin();\n    executeWhenResultIsStarted(\n        () -> {\n          brokersResult.setResult(singletonList(chePlugin));\n          return null;\n        });\n\n    // when\n    List<ChePlugin> chePlugins = brokersResult.get(2, TimeUnit.SECONDS);\n\n    // then\n    assertEquals(chePlugins, singletonList(chePlugin));\n  }\n\n  @Test(\n      expectedExceptions = IllegalStateException.class,\n      expectedExceptionsMessageRegExp = \"BrokerResult#get doesn't support multiple calls\")\n  public void shouldThrowExceptionIfGetCalledTwice() throws Exception {\n    executeBrokerGet();\n\n    waitBrokerGetCalled();\n    brokersResult.get(100, TimeUnit.MILLISECONDS);\n  }\n\n  @Test(expectedExceptions = TimeoutException.class)\n  public void shouldThrowTimeoutExceptionIfResultIsNotSubmitted() throws Exception {\n    brokersResult.get(1, TimeUnit.MILLISECONDS);\n  }\n\n  @Test\n  public void shouldThrowExceptionIfErrorIsSubmitted() throws Exception {\n    executeWhenResultIsStarted(\n        () -> {\n          // when\n          brokersResult.error(new InfrastructureException(\"test\"));\n          return null;\n        });\n    // given\n    try {\n      brokersResult.get(3, TimeUnit.SECONDS);\n    } catch (ExecutionException e) {\n      // then\n      assertEquals(e.getCause().getClass(), InfrastructureException.class);\n      assertEquals(e.getCause().getMessage(), \"test\");\n      return;\n    }\n    fail();\n  }\n\n  private void executeBrokerGet() {\n    executor.submit(() -> brokersResult.get(2, TimeUnit.SECONDS));\n  }\n\n  private void waitBrokerGetCalled() throws InterruptedException {\n    while (!brokersResult.isStarted()) {\n      Thread.sleep(100);\n    }\n  }\n\n  private void executeWhenResultIsStarted(Callable<Void> c) {\n    executor.submit(\n        () -> {\n          while (!brokersResult.isStarted()) {\n            Thread.sleep(100);\n          }\n          c.call();\n          return null;\n        });\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/K8sContainerResolverBuilderTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport static java.util.Arrays.asList;\nimport static org.testng.Assert.assertEqualsNoOrder;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainer;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainerPort;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePluginEndpoint;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\npublic class K8sContainerResolverBuilderTest {\n  @Test(dataProvider = \"allFieldsSetProvider\", expectedExceptions = IllegalStateException.class)\n  public void shouldCheckThatAllFieldsAreSet(K8sContainerResolverBuilder builder) {\n    builder.build();\n  }\n\n  @DataProvider\n  public static Object[][] allFieldsSetProvider() {\n    return new Object[][] {\n      {new K8sContainerResolverBuilder()},\n      {new K8sContainerResolverBuilder().setContainer(new CheContainer())},\n      {new K8sContainerResolverBuilder().setPluginEndpoints(new ArrayList<>())},\n    };\n  }\n\n  @Test\n  public void shouldPassOnlyParticularContainerEndpoints() {\n    // given\n    K8sContainerResolverBuilder builder = new K8sContainerResolverBuilder();\n    builder.setContainer(\n        new CheContainer()\n            .ports(\n                asList(\n                    new CheContainerPort().exposedPort(9014),\n                    new CheContainerPort().exposedPort(4040))));\n    builder.setPluginEndpoints(\n        asList(\n            new ChePluginEndpoint().targetPort(9014),\n            new ChePluginEndpoint().targetPort(9013),\n            new ChePluginEndpoint().targetPort(8080),\n            new ChePluginEndpoint().targetPort(4040)));\n    K8sContainerResolver resolver = builder.build();\n    ArrayList<ChePluginEndpoint> expected = new ArrayList<>();\n    expected.add(new ChePluginEndpoint().targetPort(9014));\n    expected.add(new ChePluginEndpoint().targetPort(4040));\n\n    // when\n    List<ChePluginEndpoint> actualEndpoints = resolver.getEndpoints();\n\n    // then\n    assertEqualsNoOrder(actualEndpoints.toArray(), expected.toArray());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/K8sContainerResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Names.MAX_CONTAINER_NAME_LENGTH;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertEqualsNoOrder;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerPort;\nimport io.fabric8.kubernetes.api.model.Quantity;\nimport io.fabric8.kubernetes.api.model.ResourceRequirements;\nimport io.fabric8.kubernetes.api.model.ResourceRequirementsBuilder;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainer;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePluginEndpoint;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.EnvVar;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\npublic class K8sContainerResolverTest {\n  private static final String IMAGE = \"testImage:tag\";\n\n  private CheContainer cheContainer;\n  private K8sContainerResolver resolver;\n  private List<ChePluginEndpoint> endpoints;\n\n  @BeforeMethod\n  public void setUp() {\n    cheContainer = new CheContainer();\n    endpoints = new ArrayList<>();\n    resolver = new K8sContainerResolver(\"Always\", cheContainer, endpoints);\n  }\n\n  @Test\n  public void shouldSetImageFromSidecar() throws Exception {\n    cheContainer.setImage(IMAGE);\n\n    Container container = resolver.resolve();\n\n    assertEquals(container.getImage(), IMAGE);\n  }\n\n  @Test\n  public void shouldSetName() throws Exception {\n\n    cheContainer.setName(\"cheContainerName\");\n\n    Container container = resolver.resolve();\n\n    assertTrue(container.getName().startsWith((cheContainer.getName()).toLowerCase()));\n  }\n\n  @Test\n  public void shouldLimitNameByMaxAllowedLength() throws Exception {\n\n    cheContainer.setName(\"cheContainerNameWhichIsGreatlySucceedsMaxAllowedLengthByKubernetes\");\n\n    Container container = resolver.resolve();\n\n    assertEquals(container.getName().length(), MAX_CONTAINER_NAME_LENGTH);\n  }\n\n  @Test\n  public void shouldSetEnvVarsFromSidecar() throws Exception {\n    Map<String, String> env = ImmutableMap.of(\"name1\", \"value1\", \"name2\", \"value2\");\n    cheContainer.setEnv(toSidecarEnvVars(env));\n\n    Container container = resolver.resolve();\n\n    assertEqualsNoOrder(container.getEnv().toArray(), toK8sEnvVars(env).toArray());\n  }\n\n  @Test\n  public void shouldSetPortsFromContainerEndpoints() throws Exception {\n    Integer[] ports = new Integer[] {3030, 10000};\n    endpoints.addAll(toEndpoints(ports));\n\n    Container container = resolver.resolve();\n\n    assertEqualsNoOrder(container.getPorts().toArray(), toK8sPorts(ports).toArray());\n  }\n\n  @Test(dataProvider = \"memLimitResourcesProvider\")\n  public void shouldProvisionSidecarMemoryLimitAndRequest(\n      String sidecarMemLimit, ResourceRequirements resources) throws Exception {\n    cheContainer.setMemoryLimit(sidecarMemLimit);\n    cheContainer.setMemoryRequest(sidecarMemLimit);\n\n    Container container = resolver.resolve();\n\n    assertEquals(container.getResources(), resources);\n  }\n\n  @Test(dataProvider = \"cpuLimitResourcesProvider\")\n  public void shouldProvisionSidecarCPULimitAndRequest(\n      String sidecarCpuLimit, ResourceRequirements resources) throws Exception {\n    cheContainer.setCpuLimit(sidecarCpuLimit);\n    cheContainer.setCpuRequest(sidecarCpuLimit);\n\n    Container container = resolver.resolve();\n\n    assertEquals(container.getResources(), resources);\n  }\n\n  @DataProvider\n  public static Object[][] memLimitResourcesProvider() {\n    return new Object[][] {\n      {\"\", null},\n      {null, null},\n      {\"123456789\", toK8sMemoryLimitRequestResources(\"123456789\")},\n      {\"1Ki\", toK8sMemoryLimitRequestResources(\"1Ki\")},\n      {\"100M\", toK8sMemoryLimitRequestResources(\"100M\")},\n    };\n  }\n\n  @DataProvider\n  public static Object[][] cpuLimitResourcesProvider() {\n    return new Object[][] {\n      {\"\", null},\n      {null, null},\n      {\"0.156\", toK8sCPULimitRequestResources(\"0.156\")},\n      {\"1\", toK8sCPULimitRequestResources(\"1\")},\n      {\"100m\", toK8sCPULimitRequestResources(\"100m\")},\n    };\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp = \"Sidecar memory limit field contains illegal value .*\")\n  public void shouldThrowExceptionIfMemoryLimitIsInIllegalFormat() throws Exception {\n    cheContainer.setMemoryLimit(\"IllegalValue\");\n\n    resolver.resolve();\n  }\n\n  private static ResourceRequirements toK8sMemoryLimitRequestResources(String memLimit) {\n    return new ResourceRequirementsBuilder()\n        .addToLimits(\"memory\", new Quantity(memLimit))\n        .addToRequests(\"memory\", new Quantity(memLimit))\n        .build();\n  }\n\n  private static ResourceRequirements toK8sCPULimitRequestResources(String cpuLimit) {\n    return new ResourceRequirementsBuilder()\n        .addToLimits(\"cpu\", new Quantity(cpuLimit))\n        .addToRequests(\"cpu\", new Quantity(cpuLimit))\n        .build();\n  }\n\n  private List<EnvVar> toSidecarEnvVars(Map<String, String> envVars) {\n    return envVars.entrySet().stream()\n        .map(entry -> new EnvVar().name(entry.getKey()).value(entry.getValue()))\n        .collect(Collectors.toList());\n  }\n\n  private List<io.fabric8.kubernetes.api.model.EnvVar> toK8sEnvVars(Map<String, String> envVars) {\n    return envVars.entrySet().stream()\n        .map(\n            entry ->\n                new io.fabric8.kubernetes.api.model.EnvVar(entry.getKey(), entry.getValue(), null))\n        .collect(Collectors.toList());\n  }\n\n  private List<ContainerPort> toK8sPorts(Integer[] ports) {\n    return Arrays.stream(ports).map(this::k8sPort).collect(Collectors.toList());\n  }\n\n  private ContainerPort k8sPort(Integer port) {\n    ContainerPort containerPort = new ContainerPort();\n    containerPort.setContainerPort(port);\n    containerPort.setProtocol(\"TCP\");\n    return containerPort;\n  }\n\n  private List<ChePluginEndpoint> toEndpoints(Integer[] ports) {\n    return Arrays.stream(ports)\n        .map(p -> new ChePluginEndpoint().targetPort(p))\n        .collect(Collectors.toList());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/KubernetesPluginsToolingApplierTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport static com.google.common.collect.ImmutableMap.of;\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.core.model.workspace.config.Command.MACHINE_NAME_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.Command.WORKING_DIRECTORY_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.CONTAINER_SOURCE_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.PLUGIN_MACHINE_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.TOOL_CONTAINER_SOURCE;\nimport static org.eclipse.che.commons.lang.NameGenerator.generate;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_ORIGINAL_NAME_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposerFactoryProvider.SECURE_EXPOSER_IMPL_PROPERTY;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.ContainerPort;\nimport io.fabric8.kubernetes.api.model.ContainerPortBuilder;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServicePortBuilder;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EnvImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironment;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainer;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainerPort;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePluginEndpoint;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.Command;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.EnvVar;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.Volume;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Warnings;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.EnvVars;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\n@Listeners(MockitoTestNGListener.class)\npublic class KubernetesPluginsToolingApplierTest {\n\n  private static final String TEST_IMAGE = \"testImage/test/test\";\n  private static final String ENV_VAR = \"PLUGINS_ENV_VAR\";\n  private static final String ENV_VAR_VALUE = \"PLUGINS_ENV_VAR_VALUE\";\n  private static final String POD_NAME = \"pod12\";\n  private static final String VOLUME_NAME = \"test_volume_name\";\n  private static final String VOLUME_MOUNT_PATH = \"/path/test\";\n  private static final String USER_MACHINE_NAME = POD_NAME + \"/userContainer\";\n  private static final int MEMORY_LIMIT_MB = 200;\n  private static final int MEMORY_REQUEST_MB = 100;\n  private static final String CPU_LIMIT = \"200m\";\n  private static final String CPU_REQUEST = \"100m\";\n  private static final String CHE_PLUGIN_ENDPOINT_NAME = \"test-endpoint-1\";\n\n  @Mock private Pod pod;\n  @Mock private PodSpec podSpec;\n  @Mock private ObjectMeta meta;\n  @Mock private Container userContainer;\n  @Mock private InternalMachineConfig userMachineConfig;\n  @Mock private RuntimeIdentity runtimeIdentity;\n  @Mock private ChePluginsVolumeApplier chePluginsVolumeApplier;\n  @Mock private EnvVars envVars;\n\n  private KubernetesEnvironment internalEnvironment;\n  private KubernetesPluginsToolingApplier applier;\n\n  @BeforeMethod\n  public void setUp() {\n    internalEnvironment = spy(KubernetesEnvironment.builder().build());\n    internalEnvironment.setDevfile(new DevfileImpl());\n    applier =\n        new KubernetesPluginsToolingApplier(\n            MEMORY_LIMIT_MB,\n            MEMORY_REQUEST_MB,\n            CPU_LIMIT,\n            CPU_REQUEST,\n            false,\n            chePluginsVolumeApplier,\n            envVars);\n\n    Map<String, InternalMachineConfig> machines = new HashMap<>();\n    List<Container> containers = new ArrayList<>();\n    containers.add(userContainer);\n    machines.put(USER_MACHINE_NAME, userMachineConfig);\n\n    when(pod.getSpec()).thenReturn(podSpec);\n    lenient().when(podSpec.getContainers()).thenReturn(containers);\n    lenient().when(pod.getMetadata()).thenReturn(meta);\n    lenient().when(meta.getName()).thenReturn(POD_NAME);\n    internalEnvironment.addPod(pod);\n    internalEnvironment.getMachines().putAll(machines);\n  }\n\n  @Test\n  public void shouldProvisionPluginsCommandsToEnvironment() throws Exception {\n    // given\n    Command pluginCommand =\n        new Command()\n            .name(\"test-command\")\n            .workingDir(\"~\")\n            .command(Arrays.asList(\"./build.sh\", \"--no-pull\"));\n\n    // when\n    applier.apply(\n        runtimeIdentity,\n        internalEnvironment,\n        singletonList(createChePlugin(createContainer(\"container\", pluginCommand))));\n\n    // then\n    List<CommandImpl> envCommands = internalEnvironment.getCommands();\n    assertEquals(envCommands.size(), 1);\n    CommandImpl envCommand = envCommands.get(0);\n    assertEquals(envCommand.getName(), pluginCommand.getName());\n    assertEquals(envCommand.getCommandLine(), String.join(\" \", pluginCommand.getCommand()));\n    assertEquals(envCommand.getType(), \"custom\");\n    assertEquals(\n        envCommand.getAttributes().get(WORKING_DIRECTORY_ATTRIBUTE), pluginCommand.getWorkingDir());\n    validateContainerNameName(envCommand.getAttributes().get(MACHINE_NAME_ATTRIBUTE), \"container\");\n  }\n\n  @Test\n  public void shouldProvisionApplyEnvironmentVariableToContainersAndInitContainersOfPlugin()\n      throws Exception {\n    // given\n    CheContainer container = new CheContainer();\n    container.setName(\"container\");\n    CheContainer initContainer = new CheContainer();\n    initContainer.setName(\"initContainer\");\n\n    ChePlugin chePlugin =\n        createChePlugin(\n            \"publisher/id/1.0.0\", singletonList(container), singletonList(initContainer));\n    ComponentImpl component = internalEnvironment.getDevfile().getComponents().get(0);\n    component.getEnv().add(new EnvImpl(\"TEST\", \"VALUE\"));\n    ArgumentCaptor<Container> containerArgumentCaptor = ArgumentCaptor.forClass(Container.class);\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    verify(envVars, times(2)).apply(containerArgumentCaptor.capture(), eq(component.getEnv()));\n    List<Container> containers = containerArgumentCaptor.getAllValues();\n    // containers names are suffixed to provide uniqueness and converted to be k8s API compatible\n    assertTrue(containers.get(0).getName().startsWith(\"initcontainer\"));\n    assertTrue(containers.get(1).getName().startsWith(\"container\"));\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"The downloaded plugin 'publisher/id/version' configuration does \"\n              + \"not have the corresponding component in devfile. Devfile contains the following \"\n              + \"cheEditor/chePlugins: \\\\[publisher/editor/1, publisher/plugin/1\\\\]\")\n  public void shouldThrowExceptionWhenDownloadedPluginIsNotMatchedWitComponent() throws Exception {\n    // given\n    ChePlugin chePlugin = createChePlugin(\"publisher/id/version\");\n\n    internalEnvironment.getDevfile().getComponents().clear();\n    internalEnvironment\n        .getDevfile()\n        .getComponents()\n        .add(new ComponentImpl(\"cheEditor\", \"publisher/editor/1\"));\n    internalEnvironment\n        .getDevfile()\n        .getComponents()\n        .add(new ComponentImpl(\"chePlugin\", \"publisher/plugin/1\"));\n    internalEnvironment.getDevfile().getComponents().add(new ComponentImpl(\"k8s\", null));\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n  }\n\n  @Test\n  public void shouldResolveMachineNameForCommandsInEnvironment() throws Exception {\n    // given\n    ChePlugin chePlugin = createChePlugin(createContainer(\"container\"));\n    String pluginRef = chePlugin.getId();\n\n    CommandImpl pluginCommand = new CommandImpl(\"test-command\", \"echo Hello World!\", \"custom\");\n    pluginCommand.getAttributes().put(\"plugin\", pluginRef);\n    internalEnvironment.getCommands().add(pluginCommand);\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    List<CommandImpl> envCommands = internalEnvironment.getCommands();\n    assertEquals(envCommands.size(), 1);\n    CommandImpl envCommand = envCommands.get(0);\n    assertEquals(envCommand.getName(), pluginCommand.getName());\n    assertEquals(envCommand.getType(), pluginCommand.getType());\n    assertEquals(envCommand.getCommandLine(), pluginCommand.getCommandLine());\n    assertEquals(envCommand.getAttributes().get(\"plugin\"), pluginRef);\n    validateContainerNameName(envCommand.getAttributes().get(MACHINE_NAME_ATTRIBUTE), \"container\");\n  }\n\n  @Test\n  public void shouldFillInWarningIfChePluginDoesNotHaveAnyContainersButThereAreRelatedCommands()\n      throws Exception {\n    // given\n    ChePlugin chePlugin = createChePlugin(\"somePublisher/custom-name/0.0.3\");\n    String pluginRef = chePlugin.getId();\n\n    CommandImpl pluginCommand = new CommandImpl(\"test-command\", \"echo Hello World!\", \"custom\");\n    pluginCommand.getAttributes().put(\"plugin\", pluginRef);\n    internalEnvironment.getCommands().add(pluginCommand);\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    List<Warning> envWarnings = internalEnvironment.getWarnings();\n    assertEquals(envWarnings.size(), 1);\n    Warning warning = envWarnings.get(0);\n    assertEquals(\n        warning.getCode(),\n        Warnings.COMMAND_IS_CONFIGURED_IN_PLUGIN_WITHOUT_CONTAINERS_WARNING_CODE);\n    assertEquals(\n        warning.getMessage(),\n        \"There are configured commands for plugin 'somePublisher/custom-name/0.0.3' that doesn't have any containers\");\n  }\n\n  @Test\n  public void\n      shouldNotFillInWarningIfChePluginDoesNotHaveAnyContainersAndThereAreNotRelatedCommands()\n          throws Exception {\n    // given\n    ChePlugin chePlugin = createChePlugin();\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    assertTrue(internalEnvironment.getWarnings().isEmpty());\n  }\n\n  @Test\n  public void shouldFillInWarningIfChePluginHasMultiplyContainersButThereAreRelatedCommands()\n      throws Exception {\n    // given\n    ChePlugin chePlugin = createChePlugin(createContainer(), createContainer());\n    String pluginRef = chePlugin.getId();\n\n    CommandImpl pluginCommand = new CommandImpl(\"test-command\", \"echo Hello World!\", \"custom\");\n    pluginCommand.getAttributes().put(\"plugin\", pluginRef);\n    internalEnvironment.getCommands().add(pluginCommand);\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    List<Warning> envWarnings = internalEnvironment.getWarnings();\n    assertEquals(envWarnings.size(), 1);\n    Warning warning = envWarnings.get(0);\n    assertEquals(\n        warning.getCode(),\n        Warnings.COMMAND_IS_CONFIGURED_IN_PLUGIN_WITH_MULTIPLY_CONTAINERS_WARNING_CODE);\n    assertEquals(\n        warning.getMessage(),\n        \"There are configured commands for plugin '\"\n            + pluginRef\n            + \"' that has multiply containers. Commands will be configured to be run in first container\");\n  }\n\n  @Test\n  public void shouldNotFillInWarningIfChePluginHasMultiplyContainersAndThereAreNotRelatedCommands()\n      throws Exception {\n    // given\n    ChePlugin chePlugin = createChePlugin(createContainer(), createContainer());\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    assertTrue(internalEnvironment.getWarnings().isEmpty());\n  }\n\n  @Test\n  public void shouldUseContainerNameForMachinesName() throws Exception {\n    // given\n    internalEnvironment.getMachines().clear();\n\n    ChePlugin chePlugin = createChePlugin(\"publisher/plugin1/0.2.1\", createContainer(\"container1\"));\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    Map<String, InternalMachineConfig> machines = internalEnvironment.getMachines();\n    assertEquals(machines.size(), 1);\n    validateContainerNameName(machines.keySet().iterator().next(), \"container1\");\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Che plugins tooling configuration can be applied to a workspace with one pod only\")\n  public void throwsExceptionWhenTheNumberOfPodsIsNot1() throws Exception {\n    PodData podData = new PodData(podSpec, meta);\n    when(internalEnvironment.getPodsData()).thenReturn(of(\"pod1\", podData, \"pod2\", podData));\n\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(createChePlugin()));\n  }\n\n  @Test\n  public void addToolingContainerToAPod() throws Exception {\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(createChePlugin()));\n\n    verifyPodAndContainersNumber(2);\n    Container toolingContainer = getOneAndOnlyNonUserContainer(internalEnvironment);\n    verifyContainer(toolingContainer);\n  }\n\n  @Test\n  public void addToolingInitContainerToAPod() throws Exception {\n    lenient().when(podSpec.getInitContainers()).thenReturn(new ArrayList<>());\n    ChePlugin chePlugin = createChePlugin();\n    chePlugin.setInitContainers(singletonList(createContainer()));\n\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    verifyPodAndInitContainersNumber(1);\n    Container toolingInitContainer = getOnlyOneInitContainerFromPod(internalEnvironment);\n    verifyContainer(toolingInitContainer);\n  }\n\n  @Test\n  public void addToolingInitContainerWithCommand() throws InfrastructureException {\n    List<String> command = Arrays.asList(\"cp\", \"-rf\", \"test-file\", \"/some-volume/test\");\n    lenient().when(podSpec.getInitContainers()).thenReturn(new ArrayList<>());\n    ChePlugin chePlugin = createChePlugin();\n    List<CheContainer> initContainers = singletonList(createContainer(command, null));\n    chePlugin.setInitContainers(initContainers);\n\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    verifyPodAndInitContainersNumber(1);\n    Container toolingInitContainer = getOnlyOneInitContainerFromPod(internalEnvironment);\n    verifyContainer(toolingInitContainer);\n    assertEquals(toolingInitContainer.getCommand(), command);\n  }\n\n  @Test\n  public void addToolingInitContainerWithArgs() throws InfrastructureException {\n    List<String> args = Arrays.asList(\"cp\", \"-rf\", \"test-file\", \"/some-volume/test\");\n    lenient().when(podSpec.getInitContainers()).thenReturn(new ArrayList<>());\n    ChePlugin chePlugin = createChePlugin();\n    List<CheContainer> initContainers = singletonList(createContainer(null, args));\n    chePlugin.setInitContainers(initContainers);\n\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    verifyPodAndInitContainersNumber(1);\n    Container toolingInitContainer = getOnlyOneInitContainerFromPod(internalEnvironment);\n    verifyContainer(toolingInitContainer);\n    assertEquals(toolingInitContainer.getArgs(), args);\n  }\n\n  @Test\n  public void addToolingInitContainerWithCommandAndArgs() throws InfrastructureException {\n    List<String> command = singletonList(\"cp\");\n    List<String> args = Arrays.asList(\"-rf\", \"test-file\", \"/some-volume/test\");\n    lenient().when(podSpec.getInitContainers()).thenReturn(new ArrayList<>());\n    ChePlugin chePlugin = createChePlugin();\n    List<CheContainer> initContainers = singletonList(createContainer(command, args));\n    chePlugin.setInitContainers(initContainers);\n\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    verifyPodAndInitContainersNumber(1);\n    Container toolingInitContainer = getOnlyOneInitContainerFromPod(internalEnvironment);\n    verifyContainer(toolingInitContainer);\n    assertEquals(toolingInitContainer.getCommand(), command);\n    assertEquals(toolingInitContainer.getArgs(), args);\n  }\n\n  @Test\n  public void addToolingContainerWithCommand() throws InfrastructureException {\n    List<String> command = Arrays.asList(\"tail\", \"-f\", \"/dev/null\");\n    lenient().when(podSpec.getContainers()).thenReturn(new ArrayList<>());\n    ChePlugin chePlugin = createChePlugin();\n    List<CheContainer> containers = singletonList(createContainer(command, null));\n    chePlugin.setContainers(containers);\n\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    verifyPodAndContainersNumber(1);\n    Container toolingContainer = getOneAndOnlyNonUserContainer(internalEnvironment);\n    verifyContainer(toolingContainer);\n    assertEquals(toolingContainer.getCommand(), command);\n  }\n\n  @Test\n  public void addToolingContainerWithArgs() throws InfrastructureException {\n    List<String> args = Arrays.asList(\"tail\", \"-f\", \"/dev/null\");\n    lenient().when(podSpec.getContainers()).thenReturn(new ArrayList<>());\n    ChePlugin chePlugin = createChePlugin();\n    List<CheContainer> containers = singletonList(createContainer(null, args));\n    chePlugin.setContainers(containers);\n\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    verifyPodAndContainersNumber(1);\n    Container toolingContainer = getOneAndOnlyNonUserContainer(internalEnvironment);\n    verifyContainer(toolingContainer);\n    assertEquals(toolingContainer.getArgs(), args);\n  }\n\n  @Test\n  public void addToolingContainerWithCommandAndArgs() throws InfrastructureException {\n    List<String> command = singletonList(\"tail\");\n    List<String> args = Arrays.asList(\"-f\", \"/dev/null\");\n    lenient().when(podSpec.getContainers()).thenReturn(new ArrayList<>());\n    ChePlugin chePlugin = createChePlugin();\n    List<CheContainer> containers = singletonList(createContainer(command, args));\n    chePlugin.setContainers(containers);\n\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    verifyPodAndContainersNumber(1);\n    Container toolingContainer = getOneAndOnlyNonUserContainer(internalEnvironment);\n    verifyContainer(toolingContainer);\n    assertEquals(toolingContainer.getCommand(), command);\n    assertEquals(toolingContainer.getArgs(), args);\n  }\n\n  @Test\n  public void createsPodAndAddToolingIfNoPodIsPresent() throws Exception {\n    internalEnvironment = spy(KubernetesEnvironment.builder().build());\n    internalEnvironment.setDevfile(new DevfileImpl());\n    Map<String, InternalMachineConfig> machines = new HashMap<>();\n    machines.put(USER_MACHINE_NAME, userMachineConfig);\n    internalEnvironment.getMachines().putAll(machines);\n\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(createChePlugin()));\n\n    verifyPodAndContainersNumber(1);\n    Container toolingContainer = getOneAndOnlyNonUserContainer(internalEnvironment);\n    verifyContainer(toolingContainer);\n  }\n\n  @Test\n  public void canAddMultipleToolingContainersToAPodFromOnePlugin() throws Exception {\n    applier.apply(\n        runtimeIdentity,\n        internalEnvironment,\n        singletonList(createChePlugin(createContainer(), createContainer())));\n\n    verifyPodAndContainersNumber(3);\n    List<Container> nonUserContainers = getNonUserContainers(internalEnvironment);\n    verifyContainers(nonUserContainers);\n  }\n\n  @Test\n  public void canAddMultipleToolingContainersToAPodFromSeveralPlugins() throws Exception {\n    applier.apply(\n        runtimeIdentity,\n        internalEnvironment,\n        ImmutableList.of(createChePlugin(), createChePlugin()));\n\n    verifyPodAndContainersNumber(3);\n    List<Container> nonUserContainers = getNonUserContainers(internalEnvironment);\n    verifyContainers(nonUserContainers);\n  }\n\n  @Test\n  public void addsMachineWithVolumeFromChePlugin() throws Exception {\n    // given\n    ChePlugin chePluginWithNoVolume = createChePlugin();\n    chePluginWithNoVolume.getContainers().get(0).setVolumes(emptyList());\n\n    // when\n    applier.apply(\n        runtimeIdentity, internalEnvironment, asList(createChePlugin(), chePluginWithNoVolume));\n\n    // then\n    Collection<InternalMachineConfig> machineConfigs = getNonUserMachines(internalEnvironment);\n    assertEquals(machineConfigs.size(), 2);\n    verifyNumberOfMachinesWithSpecificNumberOfVolumes(machineConfigs, 2, 0);\n  }\n\n  @Test\n  public void addsMachineWithServersForContainer() throws Exception {\n    // given\n    ChePlugin chePlugin = createChePlugin();\n    addPortToSingleContainerPlugin(chePlugin, 80, \"test-port\", emptyMap(), true);\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    InternalMachineConfig machineConfig = getOneAndOnlyNonUserMachine(internalEnvironment);\n    assertEquals(\n        machineConfig.getServers(), expectedSingleServer(80, \"test-port\", emptyMap(), true));\n  }\n\n  @Test\n  public void addsTwoServersForContainers() throws Exception {\n    // given\n    ChePlugin chePlugin = createChePlugin();\n    addPortToSingleContainerPlugin(chePlugin, 80, \"test-port\", emptyMap(), true);\n    addPortToSingleContainerPlugin(chePlugin, 8090, \"another-test-port\", emptyMap(), false);\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    InternalMachineConfig machineConfig = getOneAndOnlyNonUserMachine(internalEnvironment);\n    assertEquals(\n        machineConfig.getServers(),\n        expectedTwoServers(\n            80, \"test-port\", emptyMap(), true, 8090, \"another-test-port\", emptyMap(), false));\n  }\n\n  @Test\n  public void addsMachineWithServersThatUseSamePortButDifferentNames() throws Exception {\n    // given\n    ChePlugin chePlugin = createChePlugin();\n    addPortToSingleContainerPlugin(chePlugin, 80, \"test-port/http\", emptyMap(), true);\n    addPortToSingleContainerPlugin(chePlugin, 80, \"test-port/ws\", emptyMap(), true);\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    InternalMachineConfig machineConfig = getOneAndOnlyNonUserMachine(internalEnvironment);\n    assertEquals(\n        machineConfig.getServers(),\n        expectedTwoServers(\n            80, \"test-port/http\", emptyMap(), true, 80, \"test-port/ws\", emptyMap(), true));\n  }\n\n  @Test\n  public void addsMachineWithServersThatSetProtocolAndPath() throws Exception {\n    // given\n    ChePlugin chePlugin = createChePlugin();\n    addPortToSingleContainerPlugin(\n        chePlugin,\n        443,\n        \"test-port\",\n        ImmutableMap.of(\"path\", \"/path/1\", \"protocol\", \"https\", \"attr1\", \"value1\"),\n        true);\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    InternalMachineConfig machineConfig = getOneAndOnlyNonUserMachine(internalEnvironment);\n    assertEquals(\n        machineConfig.getServers(),\n        expectedSingleServer(\n            443, \"test-port\", singletonMap(\"attr1\", \"value1\"), true, \"https\", \"/path/1\"));\n  }\n\n  @Test\n  public void setsSourceAndPluginAttributeForMachineAssociatedWithSidecar() throws Exception {\n    ChePlugin chePlugin = createChePlugin();\n\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    InternalMachineConfig machineConfig = getOneAndOnlyNonUserMachine(internalEnvironment);\n    Map<String, String> attributes = machineConfig.getAttributes();\n    assertEquals(attributes.get(CONTAINER_SOURCE_ATTRIBUTE), TOOL_CONTAINER_SOURCE);\n    assertEquals(attributes.get(PLUGIN_MACHINE_ATTRIBUTE), chePlugin.getId());\n  }\n\n  @Test\n  public void setsDefaultMemoryLimitForMachineAssociatedWithContainer() throws Exception {\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(createChePlugin()));\n\n    InternalMachineConfig machineConfig = getOneAndOnlyNonUserMachine(internalEnvironment);\n    String memoryLimitAttribute = machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE);\n    assertEquals(memoryLimitAttribute, Integer.toString(MEMORY_LIMIT_MB * 1024 * 1024));\n  }\n\n  @Test\n  public void shouldExposeChePluginEndpointsPortsInToolingContainer() throws Exception {\n    // given\n    ChePluginEndpoint endpoint1 =\n        new ChePluginEndpoint().name(CHE_PLUGIN_ENDPOINT_NAME).targetPort(101010).setPublic(true);\n    ChePluginEndpoint endpoint2 =\n        new ChePluginEndpoint().name(\"test-endpoint-2\").targetPort(2020).setPublic(false);\n    CheContainerPort cheContainerPort1 = new CheContainerPort().exposedPort(101010);\n    CheContainerPort cheContainerPort2 = new CheContainerPort().exposedPort(2020);\n    ChePlugin chePlugin = createChePlugin();\n    chePlugin.setEndpoints(asList(endpoint1, endpoint2));\n    chePlugin.getContainers().get(0).setPorts(asList(cheContainerPort1, cheContainerPort2));\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    Container container = getOneAndOnlyNonUserContainer(internalEnvironment);\n    verifyPortsExposed(container, 101010, 2020);\n  }\n\n  @Test\n  public void shouldNotExposeChePluginPortIfThereIsNoEndpoint() throws Exception {\n    // given\n    ChePluginEndpoint endpoint1 =\n        new ChePluginEndpoint().name(CHE_PLUGIN_ENDPOINT_NAME).targetPort(101010).setPublic(true);\n    CheContainerPort cheContainerPort1 = new CheContainerPort().exposedPort(101010);\n    CheContainerPort cheContainerPort2 = new CheContainerPort().exposedPort(2020);\n    ChePlugin chePlugin = createChePlugin();\n    chePlugin.setEndpoints(singletonList(endpoint1));\n    chePlugin.getContainers().get(0).setPorts(asList(cheContainerPort1, cheContainerPort2));\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    Container container = getOneAndOnlyNonUserContainer(internalEnvironment);\n    verifyPortsExposed(container, 101010);\n  }\n\n  @Test\n  public void shouldAddK8sServicesForChePluginEndpoints() throws Exception {\n    // given\n    ChePluginEndpoint endpoint1 =\n        new ChePluginEndpoint().name(CHE_PLUGIN_ENDPOINT_NAME).targetPort(101010).setPublic(true);\n    ChePluginEndpoint endpoint2 =\n        new ChePluginEndpoint().name(\"test-endpoint-2\").targetPort(2020).setPublic(false);\n    CheContainerPort cheContainerPort1 = new CheContainerPort().exposedPort(101010);\n    CheContainerPort cheContainerPort2 = new CheContainerPort().exposedPort(2020);\n    ChePlugin chePlugin = createChePlugin();\n    chePlugin.setEndpoints(asList(endpoint1, endpoint2));\n    chePlugin.getContainers().get(0).setPorts(asList(cheContainerPort1, cheContainerPort2));\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n\n    // then\n    verifyK8sServices(internalEnvironment, endpoint1, endpoint2);\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Applying of sidecar tooling failed. Kubernetes service with name '\"\n              + CHE_PLUGIN_ENDPOINT_NAME\n              + \"' already exists in the workspace environment.\")\n  public void throwsExceptionOnAddingChePluginEndpointServiceIfServiceExists() throws Exception {\n    // given\n    ChePluginEndpoint endpoint1 =\n        new ChePluginEndpoint().name(CHE_PLUGIN_ENDPOINT_NAME).targetPort(101010).setPublic(true);\n    CheContainerPort cheContainerPort1 = new CheContainerPort().exposedPort(101010);\n    ChePlugin chePlugin = createChePlugin();\n    chePlugin.setEndpoints(singletonList(endpoint1));\n    chePlugin.getContainers().get(0).setPorts(singletonList(cheContainerPort1));\n\n    // make collision of service names\n    internalEnvironment.getServices().put(CHE_PLUGIN_ENDPOINT_NAME, new Service());\n\n    // when\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(chePlugin));\n  }\n\n  @Test\n  public void shouldNotSetJWTServerExposerAttributeIfAuthEnabledButAttributeIsPresent()\n      throws Exception {\n    applier =\n        new KubernetesPluginsToolingApplier(\n            MEMORY_LIMIT_MB,\n            MEMORY_REQUEST_MB,\n            CPU_LIMIT,\n            CPU_REQUEST,\n            true,\n            chePluginsVolumeApplier,\n            envVars);\n    internalEnvironment.getAttributes().put(SECURE_EXPOSER_IMPL_PROPERTY, \"somethingElse\");\n\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(createChePlugin()));\n\n    assertEquals(\n        internalEnvironment.getAttributes().get(SECURE_EXPOSER_IMPL_PROPERTY), \"somethingElse\");\n  }\n\n  @Test\n  public void shouldSetNullImagePullPolicyIfValueIsNotStandard() throws Exception {\n    applier =\n        new KubernetesPluginsToolingApplier(\n            MEMORY_LIMIT_MB,\n            MEMORY_REQUEST_MB,\n            CPU_LIMIT,\n            CPU_REQUEST,\n            true,\n            chePluginsVolumeApplier,\n            envVars);\n\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(createChePlugin()));\n\n    assertNull(\n        internalEnvironment\n            .getPodsCopy()\n            .values()\n            .iterator()\n            .next()\n            .getSpec()\n            .getContainers()\n            .get(1)\n            .getImagePullPolicy());\n  }\n\n  @Test\n  public void shouldNotSetJWTServerExposerAttributeIfAuthDisabled() throws Exception {\n    applier.apply(runtimeIdentity, internalEnvironment, singletonList(createChePlugin()));\n\n    assertNull(internalEnvironment.getAttributes().get(SECURE_EXPOSER_IMPL_PROPERTY));\n  }\n\n  private ChePlugin createChePlugin() {\n    return createChePlugin(createContainer());\n  }\n\n  private ChePlugin createChePlugin(CheContainer... containers) {\n    return createChePlugin(\n        \"publisher/\" + NameGenerator.generate(\"name\", 3) + \"/0.0.1\",\n        Arrays.asList(containers),\n        emptyList());\n  }\n\n  private ChePlugin createChePlugin(String id, CheContainer... containers) {\n    return createChePlugin(id, Arrays.asList(containers), emptyList());\n  }\n\n  private ChePlugin createChePlugin(\n      String id, List<CheContainer> containers, List<CheContainer> initContainers) {\n    String[] splittedId = id.split(\"/\");\n    ChePlugin plugin = new ChePlugin();\n    plugin.setPublisher(splittedId[0]);\n    plugin.setName(splittedId[1]);\n    plugin.setVersion(splittedId[2]);\n    plugin.setId(id);\n    plugin.setContainers(containers);\n    plugin.setInitContainers(initContainers);\n\n    internalEnvironment.getDevfile().getComponents().add(new ComponentImpl(\"chePlugin\", id));\n    return plugin;\n  }\n\n  private CheContainer createContainer(List<String> command, List<String> args) {\n    CheContainer container = createContainer();\n    container.setCommand(command);\n    container.setArgs(args);\n\n    return container;\n  }\n\n  private CheContainer createContainer(Command... commands) {\n    return createContainer(generate(\"container\", 5), commands);\n  }\n\n  private CheContainer createContainer(String name, Command... commands) {\n    CheContainer cheContainer = new CheContainer();\n    cheContainer.setImage(TEST_IMAGE);\n    cheContainer.setName(name);\n    cheContainer.setEnv(singletonList(new EnvVar().name(ENV_VAR).value(ENV_VAR_VALUE)));\n    cheContainer.setVolumes(\n        singletonList(new Volume().name(VOLUME_NAME).mountPath(VOLUME_MOUNT_PATH)));\n    cheContainer.setCommands(Arrays.asList(commands));\n    return cheContainer;\n  }\n\n  private ServicePort createServicePort(int port) {\n    return new ServicePortBuilder()\n        .withPort(port)\n        .withProtocol(\"TCP\")\n        .withNewTargetPort(port)\n        .build();\n  }\n\n  private void verifyPodAndContainersNumber(int containersNumber) {\n    assertEquals(internalEnvironment.getPodsCopy().size(), 1);\n    Pod pod = internalEnvironment.getPodsCopy().values().iterator().next();\n    assertEquals(pod.getSpec().getContainers().size(), containersNumber);\n  }\n\n  private void verifyPodAndInitContainersNumber(int containersNumber) {\n    assertEquals(internalEnvironment.getPodsCopy().size(), 1);\n    Pod pod = internalEnvironment.getPodsCopy().values().iterator().next();\n    assertEquals(pod.getSpec().getInitContainers().size(), containersNumber);\n  }\n\n  private void verifyContainer(Container toolingContainer) {\n    assertEquals(toolingContainer.getImage(), TEST_IMAGE);\n    assertEquals(\n        toolingContainer.getEnv(),\n        singletonList(new io.fabric8.kubernetes.api.model.EnvVar(ENV_VAR, ENV_VAR_VALUE, null)));\n  }\n\n  private void verifyContainers(List<Container> containers) {\n    for (Container container : containers) {\n      verifyContainer(container);\n    }\n  }\n\n  @SuppressWarnings(\"SameParameterValue\")\n  private void verifyNumberOfMachinesWithSpecificNumberOfVolumes(\n      Collection<InternalMachineConfig> machineConfigs, int numberOfMachines, int numberOfVolumes) {\n\n    long numberOfMatchingMachines =\n        machineConfigs.stream()\n            .filter(machineConfig -> machineConfig.getVolumes().size() == numberOfVolumes)\n            .count();\n    assertEquals(numberOfMatchingMachines, numberOfMachines);\n  }\n\n  private void verifyPortsExposed(Container container, int... ports) {\n    List<ContainerPort> actualPorts = container.getPorts();\n    List<ContainerPort> expectedPorts = new ArrayList<>();\n    for (int port : ports) {\n      expectedPorts.add(\n          new ContainerPortBuilder().withContainerPort(port).withProtocol(\"TCP\").build());\n    }\n    assertEquals(actualPorts, expectedPorts);\n  }\n\n  private void verifyK8sServices(\n      KubernetesEnvironment internalEnvironment, ChePluginEndpoint... endpoints) {\n    Map<String, Service> services = internalEnvironment.getServices();\n    for (ChePluginEndpoint endpoint : endpoints) {\n      assertTrue(services.containsKey(endpoint.getName()));\n      Service service = services.get(endpoint.getName());\n      assertEquals(service.getMetadata().getName(), endpoint.getName());\n      assertEquals(\n          service.getSpec().getSelector(), singletonMap(CHE_ORIGINAL_NAME_LABEL, POD_NAME));\n\n      assertEquals(\n          service.getSpec().getPorts(), singletonList(createServicePort(endpoint.getTargetPort())));\n    }\n  }\n\n  private Collection<InternalMachineConfig> getNonUserMachines(\n      InternalEnvironment internalEnvironment) {\n    Map<String, InternalMachineConfig> machines = internalEnvironment.getMachines();\n    Map<String, InternalMachineConfig> nonUserMachines =\n        machines.entrySet().stream()\n            .filter(entry -> !USER_MACHINE_NAME.equals(entry.getKey()))\n            .collect(Collectors.toMap(Entry::getKey, Entry::getValue));\n    return nonUserMachines.values();\n  }\n\n  private InternalMachineConfig getOneAndOnlyNonUserMachine(\n      InternalEnvironment internalEnvironment) {\n    Collection<InternalMachineConfig> nonUserMachines = getNonUserMachines(internalEnvironment);\n    assertEquals(nonUserMachines.size(), 1);\n    return nonUserMachines.iterator().next();\n  }\n\n  private List<Container> getNonUserContainers(KubernetesEnvironment kubernetesEnvironment) {\n    Pod pod = kubernetesEnvironment.getPodsCopy().values().iterator().next();\n    return pod.getSpec().getContainers().stream()\n        .filter(container -> userContainer != container)\n        .collect(Collectors.toList());\n  }\n\n  private Container getOneAndOnlyNonUserContainer(KubernetesEnvironment kubernetesEnvironment) {\n    List<Container> nonUserContainers = getNonUserContainers(kubernetesEnvironment);\n    assertEquals(nonUserContainers.size(), 1);\n    return nonUserContainers.get(0);\n  }\n\n  private Container getOnlyOneInitContainerFromPod(KubernetesEnvironment kubernetesEnvironment) {\n    Pod pod = kubernetesEnvironment.getPodsCopy().values().iterator().next();\n\n    List<Container> initContainer = pod.getSpec().getInitContainers();\n    assertEquals(initContainer.size(), 1);\n    return initContainer.get(0);\n  }\n\n  private void addPortToSingleContainerPlugin(\n      ChePlugin plugin,\n      int port,\n      String portName,\n      Map<String, String> attributes,\n      boolean isPublic) {\n\n    assertEquals(plugin.getContainers().size(), 1);\n\n    ChePluginEndpoint endpoint =\n        new ChePluginEndpoint()\n            .attributes(attributes)\n            .name(portName)\n            .setPublic(isPublic)\n            .targetPort(port);\n    plugin.getEndpoints().add(endpoint);\n    List<CheContainerPort> ports = plugin.getContainers().get(0).getPorts();\n    if (ports.stream()\n        .map(CheContainerPort::getExposedPort)\n        .noneMatch(integer -> integer == port)) {\n      ports.add(new CheContainerPort().exposedPort(port));\n    }\n  }\n\n  @SuppressWarnings(\"SameParameterValue\")\n  private Map<String, ServerConfig> expectedSingleServer(\n      int port, String portName, Map<String, String> attributes, boolean isExternal) {\n    Map<String, ServerConfig> servers = new HashMap<>();\n    addExpectedServer(servers, port, portName, attributes, isExternal, null, null);\n    return servers;\n  }\n\n  @SuppressWarnings(\"SameParameterValue\")\n  private Map<String, ServerConfig> expectedSingleServer(\n      int port,\n      String portName,\n      Map<String, String> attributes,\n      boolean isExternal,\n      String protocol,\n      String path) {\n    Map<String, ServerConfig> servers = new HashMap<>();\n    addExpectedServer(servers, port, portName, attributes, isExternal, protocol, path);\n    return servers;\n  }\n\n  @SuppressWarnings(\"SameParameterValue\")\n  private Map<String, ServerConfig> expectedTwoServers(\n      int port,\n      String portName,\n      Map<String, String> attributes,\n      boolean isExternal,\n      int port2,\n      String portName2,\n      Map<String, String> attributes2,\n      boolean isExternal2) {\n    Map<String, ServerConfig> servers = new HashMap<>();\n    addExpectedServer(servers, port, portName, attributes, isExternal, null, null);\n    addExpectedServer(servers, port2, portName2, attributes2, isExternal2, null, null);\n    return servers;\n  }\n\n  private void addExpectedServer(\n      Map<String, ServerConfig> servers,\n      int port,\n      String portName,\n      Map<String, String> attributes,\n      boolean isExternal,\n      String protocol,\n      String path) {\n    Map<String, String> serverAttributes = new HashMap<>(attributes);\n    serverAttributes.put(\"internal\", Boolean.toString(!isExternal));\n    servers.put(portName, new ServerConfigImpl(port + \"/tcp\", protocol, path, serverAttributes));\n  }\n\n  private void validateContainerNameName(String actual, String prefixExpected) {\n    Pattern pattern = Pattern.compile(prefixExpected + \"\\\\w{3}\");\n    assertTrue(pattern.matcher(actual).matches());\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/MachineResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport static com.google.common.collect.ImmutableMap.of;\nimport static java.util.Arrays.asList;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_REQUEST_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_REQUEST_ATTRIBUTE;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNull;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.VolumeImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EndpointImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.CheContainer;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePluginEndpoint;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.Volume;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.Containers;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.KubernetesSize;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Oleksandr Garagatyi\n */\n@Listeners(MockitoTestNGListener.class)\npublic class MachineResolverTest {\n\n  private static final String DEFAULT_MEM_LIMIT = \"100001\";\n  private static final String DEFAULT_MEM_REQUEST = \"5001\";\n  private static final String DEFAULT_CPU_LIMIT = \"2\";\n  private static final String DEFAULT_CPU_REQUEST = \"1\";\n  private static final String PLUGIN_NAME = \"testplugin\";\n  private static final String PLUGIN_PUBLISHER = \"testpublisher\";\n  private static final String PLUGIN_PUBLISHER_NAME = PLUGIN_PUBLISHER + \"/\" + PLUGIN_NAME;\n  private static final String PLUGIN_ID = PLUGIN_PUBLISHER_NAME + \"/\" + \"latest\";\n  private static final String PROJECTS_ENV_VAR = \"env_with_with_location_of_projects\";\n  private static final String PROJECTS_MOUNT_PATH = \"/wherever/i/may/roam\";\n\n  private List<ChePluginEndpoint> endpoints;\n  private CheContainer cheContainer;\n  private Container container;\n  private MachineResolver resolver;\n  private ComponentImpl component;\n\n  @BeforeMethod\n  public void setUp() {\n    endpoints = new ArrayList<>();\n    cheContainer = new CheContainer();\n    container = new Container();\n    component = new ComponentImpl(\"chePlugin\", PLUGIN_ID);\n    resolver =\n        new MachineResolver(\n            container,\n            cheContainer,\n            DEFAULT_MEM_LIMIT,\n            DEFAULT_MEM_REQUEST,\n            DEFAULT_CPU_LIMIT,\n            DEFAULT_CPU_REQUEST,\n            endpoints,\n            component);\n  }\n\n  @Test(dataProvider = \"serverProvider\")\n  public void shouldSetServersInMachineConfig(\n      List<ChePluginEndpoint> containerEndpoints, Map<String, ServerConfig> expected)\n      throws InfrastructureException {\n    endpoints.addAll(containerEndpoints);\n\n    InternalMachineConfig machineConfig = resolver.resolve();\n\n    assertEquals(machineConfig.getServers(), expected);\n  }\n\n  @DataProvider\n  public static Object[][] serverProvider() {\n    return new Object[][] {\n      // default minimal case\n      {\n        asList(endpt(\"endp1\", 8080), endpt(\"endp2\", 10000)),\n        of(\"endp1\", server(8080), \"endp2\", server(10000))\n      },\n      // case with publicity setting\n      {\n        asList(endpt(\"endp1\", 8080, false), endpt(\"endp2\", 10000, true)),\n        of(\"endp1\", server(8080, false), \"endp2\", server(10000, true))\n      },\n      // case with protocol attribute\n      {\n        asList(endptPrtc(\"endp1\", 8080, \"http\"), endptPrtc(\"endp2\", 10000, \"ws\")),\n        of(\"endp1\", serverPrtc(8080, \"http\"), \"endp2\", serverPrtc(10000, \"ws\"))\n      },\n      // case with path attribute\n      {\n        asList(endptPath(\"endp1\", 8080, \"/\"), endptPath(\"endp2\", 10000, \"/some/thing\")),\n        of(\"endp1\", serverPath(8080, \"/\"), \"endp2\", serverPath(10000, \"/some/thing\"))\n      },\n      // case with other attributes\n      {\n        asList(\n            endpt(\"endp1\", 8080, of(\"a1\", \"v1\")),\n            endpt(\"endp2\", 10000, of(\"a2\", \"v1\", \"a3\", \"v3\"))),\n        of(\n            \"endp1\",\n            server(8080, of(\"a1\", \"v1\")),\n            \"endp2\",\n            server(10000, of(\"a2\", \"v1\", \"a3\", \"v3\")))\n      },\n    };\n  }\n\n  @Test\n  public void shouldSetDefaultMemLimitAndRequestIfSidecarDoesNotHaveOne()\n      throws InfrastructureException {\n    InternalMachineConfig machineConfig = resolver.resolve();\n\n    assertEquals(machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE), DEFAULT_MEM_LIMIT);\n    assertEquals(machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE), DEFAULT_MEM_REQUEST);\n  }\n\n  @Test\n  public void shouldSetDefaultCPULimitAndRequestIfSidecarDoesNotHaveOne()\n      throws InfrastructureException {\n    InternalMachineConfig machineConfig = resolver.resolve();\n\n    assertEquals(machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE), DEFAULT_CPU_LIMIT);\n    assertEquals(machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE), DEFAULT_CPU_REQUEST);\n  }\n\n  @Test(dataProvider = \"memoryLimitAttributeProvider\")\n  public void shouldSetMemoryLimitOfASidecarIfCorrespondingComponentFieldIsSet(\n      String memoryLimit, String expectedMemLimit) throws InfrastructureException {\n    component.setMemoryLimit(memoryLimit);\n\n    InternalMachineConfig machineConfig = resolver.resolve();\n\n    assertEquals(machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE), expectedMemLimit);\n  }\n\n  @Test(dataProvider = \"memoryRequestAttributeProvider\")\n  public void shouldSetMemoryRequestOfASidecarIfCorrespondingComponentFieldIsSet(\n      String memoryRequest, String expectedMemRequest) throws InfrastructureException {\n    component.setMemoryRequest(memoryRequest);\n\n    InternalMachineConfig machineConfig = resolver.resolve();\n\n    assertEquals(machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE), expectedMemRequest);\n  }\n\n  @DataProvider\n  public static Object[][] memoryLimitAttributeProvider() {\n    return new Object[][] {\n      {\"\", DEFAULT_MEM_LIMIT},\n      {null, DEFAULT_MEM_LIMIT},\n      {\"100Ki\", toBytesString(\"100Ki\")},\n      {\"1M\", toBytesString(\"1M\")},\n      {\"10Gi\", toBytesString(\"10Gi\")},\n    };\n  }\n\n  @DataProvider\n  public static Object[][] memoryRequestAttributeProvider() {\n    return new Object[][] {\n      {\"\", DEFAULT_MEM_REQUEST},\n      {null, DEFAULT_MEM_REQUEST},\n      {\"100Ki\", toBytesString(\"100Ki\")},\n      {\"1M\", toBytesString(\"1M\")},\n      {\"10Gi\", toBytesString(\"10Gi\")},\n    };\n  }\n\n  @Test(dataProvider = \"cpuAttributeLimitProvider\")\n  public void shouldSetCPULimitOfASidecarIfCorrespondingComponentFieldIsSet(\n      String cpuLimit, String expectedCpuLimit) throws InfrastructureException {\n    component.setCpuLimit(cpuLimit);\n\n    InternalMachineConfig machineConfig = resolver.resolve();\n\n    assertEquals(machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE), expectedCpuLimit);\n  }\n\n  @Test(dataProvider = \"cpuAttributeRequestProvider\")\n  public void shouldSetCPURequestOfASidecarIfCorrespondingComponentFieldIsSet(\n      String cpuRequest, String expectedCpuRequest) throws InfrastructureException {\n    component.setCpuRequest(cpuRequest);\n\n    InternalMachineConfig machineConfig = resolver.resolve();\n\n    assertEquals(machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE), expectedCpuRequest);\n  }\n\n  @DataProvider\n  public static Object[][] cpuAttributeLimitProvider() {\n    return new Object[][] {\n      {\"\", DEFAULT_CPU_LIMIT},\n      {null, DEFAULT_CPU_LIMIT},\n      {\"100m\", \"0.1\"},\n      {\"1\", \"1.0\"},\n      {\"1578m\", \"1.578\"},\n    };\n  }\n\n  @DataProvider\n  public static Object[][] cpuAttributeRequestProvider() {\n    return new Object[][] {\n      {\"\", DEFAULT_CPU_REQUEST},\n      {null, DEFAULT_CPU_REQUEST},\n      {\"100m\", \"0.1\"},\n      {\"1\", \"1.0\"},\n      {\"1578m\", \"1.578\"},\n    };\n  }\n\n  @Test\n  public void shouldOverrideMemoryLimitOfASidecarIfCorrespondingWSConfigAttributeIsSet()\n      throws InfrastructureException {\n    String memoryLimit = \"300Mi\";\n    String expectedMemLimit = toBytesString(memoryLimit);\n    Containers.addRamLimit(container, 123456789);\n    component.setMemoryLimit(memoryLimit);\n\n    InternalMachineConfig machineConfig = resolver.resolve();\n\n    assertEquals(machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE), expectedMemLimit);\n  }\n\n  @Test\n  public void shouldNotSetMemLimitAttributeIfLimitIsInContainer() throws InfrastructureException {\n    Containers.addRamLimit(container, 123456789);\n\n    InternalMachineConfig machineConfig = resolver.resolve();\n\n    assertNull(machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE));\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void shouldRefuseToMountProjectsManually() throws InfrastructureException {\n    cheContainer.setMountSources(false);\n    Volume volume = new Volume();\n    volume.setName(Constants.PROJECTS_VOLUME_NAME);\n    volume.setMountPath(\"anything, like\");\n    cheContainer.getVolumes().add(volume);\n\n    resolver.resolve();\n  }\n\n  @Test\n  public void shouldAddVolumesFromDevfileComponent() throws InfrastructureException {\n\n    component.setVolumes(\n        asList(\n            new org.eclipse.che.api.workspace.server.model.impl.devfile.VolumeImpl(\"foo\", \"/bar\"),\n            new org.eclipse.che.api.workspace.server.model.impl.devfile.VolumeImpl(\n                \"test\", \"/foo/test\")));\n\n    InternalMachineConfig config = resolver.resolve();\n\n    assertEquals(2, config.getVolumes().size());\n    assertEquals(\"/bar\", config.getVolumes().get(\"foo\").getPath());\n    assertEquals(\"/foo/test\", config.getVolumes().get(\"test\").getPath());\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void shouldFailWhenEndpointNameAlreadyExist() throws InfrastructureException {\n    // given\n    ChePluginEndpoint pluginEndpoint = new ChePluginEndpoint();\n    pluginEndpoint.setName(\"test-endpoint\");\n    endpoints.add(pluginEndpoint);\n    component.setEndpoints(\n        Collections.singletonList(new EndpointImpl(\"test-endpoint\", 8080, Collections.emptyMap())));\n\n    // when -> then exception\n    resolver.resolve();\n  }\n\n  @Test\n  public void shouldAddEndpointsFromDevfileComponent() throws InfrastructureException {\n    component.setEndpoints(\n        asList(\n            new EndpointImpl(\"endpoint8080\", 8080, Collections.emptyMap()),\n            new EndpointImpl(\"endpoint9999\", 9999, ImmutableMap.of(\"secure\", \"true\"))));\n\n    InternalMachineConfig config = resolver.resolve();\n\n    assertEquals(config.getServers().size(), 2);\n    assertEquals(config.getServers().get(\"endpoint8080\").getPort(), \"8080\");\n    assertEquals(config.getServers().get(\"endpoint9999\").getPort(), \"9999\");\n    assertEquals(config.getServers().get(\"endpoint9999\").getAttributes().get(\"secure\"), \"true\");\n  }\n\n  private static String toBytesString(String k8sMemorySize) {\n    return Long.toString(KubernetesSize.toBytes(k8sMemorySize));\n  }\n\n  private static ChePluginEndpoint endptPath(String name, int port, String path) {\n    return new ChePluginEndpoint().name(name).targetPort(port).attributes(of(\"path\", path));\n  }\n\n  private static ChePluginEndpoint endptPrtc(String name, int port, String protocol) {\n    return new ChePluginEndpoint().name(name).targetPort(port).attributes(of(\"protocol\", protocol));\n  }\n\n  private static ChePluginEndpoint endpt(String name, int port, boolean isPublic) {\n    return new ChePluginEndpoint().name(name).targetPort(port).setPublic(isPublic);\n  }\n\n  private static ChePluginEndpoint endpt(String name, int port, Map<String, String> attributes) {\n    return new ChePluginEndpoint().name(name).targetPort(port).attributes(attributes);\n  }\n\n  private static ChePluginEndpoint endpt(String name, int port) {\n    return new ChePluginEndpoint().name(name).targetPort(port);\n  }\n\n  private static ServerConfigImpl server(int port) {\n    return server(port, false);\n  }\n\n  private static ServerConfig server(int port, Map<String, String> attributes) {\n    ServerConfigImpl server = server(port);\n    server.getAttributes().putAll(attributes);\n    return server;\n  }\n\n  private static ServerConfigImpl serverPath(int port, String path) {\n    return server(port).withPath(path);\n  }\n\n  private static ServerConfigImpl serverPrtc(int port, String protocol) {\n    return server(port).withProtocol(protocol);\n  }\n\n  private static ServerConfigImpl server(int port, boolean external) {\n    return new ServerConfigImpl()\n        .withPort(port + \"/tcp\")\n        .withAttributes(of(\"internal\", Boolean.toString(!external)));\n  }\n\n  private org.eclipse.che.api.core.model.workspace.config.Volume volume(String mountPath) {\n    return new VolumeImpl().withPath(mountPath);\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/SidecarServicesProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins;\n\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static java.util.stream.Collectors.toMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_ORIGINAL_NAME_LABEL;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServiceBuilder;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServicePortBuilder;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.Function;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePluginEndpoint;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\n/**\n * @author Oleksandr Garagatyi\n */\npublic class SidecarServicesProvisionerTest {\n  private static final String POD_NAME = \"testPod\";\n  private static final String CONFLICTING_SERVICE_NAME = \"testService\";\n\n  private SidecarServicesProvisioner provisioner;\n  private List<ChePluginEndpoint> endpoints;\n\n  @BeforeMethod\n  public void setUp() {\n    endpoints = new ArrayList<>();\n    provisioner = new SidecarServicesProvisioner(endpoints, POD_NAME);\n  }\n\n  @Test\n  public void shouldAddServiceForEachEndpoint() throws Exception {\n    List<ChePluginEndpoint> actualEndpoints =\n        asList(\n            new ChePluginEndpoint().name(\"testE1\").targetPort(8080),\n            new ChePluginEndpoint().name(\"testE2\").targetPort(10000));\n    endpoints.addAll(actualEndpoints);\n    KubernetesEnvironment kubernetesEnvironment = KubernetesEnvironment.builder().build();\n\n    provisioner.provision(kubernetesEnvironment);\n\n    assertEquals(kubernetesEnvironment.getServices(), toK8sServices(actualEndpoints));\n  }\n\n  @Test\n  public void shouldNotAddServiceForNotdDiscoverableEndpoint() throws Exception {\n    List<ChePluginEndpoint> actualEndpoints =\n        asList(\n            new ChePluginEndpoint().name(\"testE1\").targetPort(8080),\n            new ChePluginEndpoint()\n                .name(\"testE2\")\n                .targetPort(10000)\n                .attributes(ImmutableMap.of(\"discoverable\", \"false\")));\n    endpoints.addAll(actualEndpoints);\n    KubernetesEnvironment kubernetesEnvironment = KubernetesEnvironment.builder().build();\n\n    provisioner.provision(kubernetesEnvironment);\n\n    assertEquals(\n        kubernetesEnvironment.getServices(),\n        toK8sServices(ImmutableList.of(new ChePluginEndpoint().name(\"testE1\").targetPort(8080))));\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Applying of sidecar tooling failed. Kubernetes service with name '\"\n              + CONFLICTING_SERVICE_NAME\n              + \"' already exists in the workspace environment.\")\n  public void shouldNotDuplicateServicesWhenThereAreConflictingEndpoints() throws Exception {\n    List<ChePluginEndpoint> actualEndpoints =\n        asList(\n            new ChePluginEndpoint().name(CONFLICTING_SERVICE_NAME).targetPort(8080),\n            new ChePluginEndpoint().name(CONFLICTING_SERVICE_NAME).targetPort(10000));\n    endpoints.addAll(actualEndpoints);\n    KubernetesEnvironment kubernetesEnvironment = KubernetesEnvironment.builder().build();\n\n    provisioner.provision(kubernetesEnvironment);\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Applying of sidecar tooling failed. Kubernetes service with name '\"\n              + CONFLICTING_SERVICE_NAME\n              + \"' already exists in the workspace environment.\")\n  public void shouldNotDuplicateServicesWhenThereIsConflictingServiceInK8sEnv() throws Exception {\n    List<ChePluginEndpoint> actualEndpoints =\n        singletonList(new ChePluginEndpoint().name(CONFLICTING_SERVICE_NAME).targetPort(8080));\n    endpoints.addAll(actualEndpoints);\n    KubernetesEnvironment kubernetesEnvironment =\n        KubernetesEnvironment.builder()\n            .setServices(singletonMap(CONFLICTING_SERVICE_NAME, new Service()))\n            .build();\n\n    provisioner.provision(kubernetesEnvironment);\n  }\n\n  private Map<String, Service> toK8sServices(List<ChePluginEndpoint> endpoints) {\n    return endpoints.stream()\n        .map(this::createService)\n        .collect(toMap(s -> s.getMetadata().getName(), Function.identity()));\n  }\n\n  private Service createService(ChePluginEndpoint endpoint) {\n    ServicePort servicePort =\n        new ServicePortBuilder()\n            .withPort(endpoint.getTargetPort())\n            .withProtocol(\"TCP\")\n            .withNewTargetPort(endpoint.getTargetPort())\n            .build();\n    return new ServiceBuilder()\n        .withNewMetadata()\n        .withName(endpoint.getName())\n        .endMetadata()\n        .withNewSpec()\n        .withSelector(singletonMap(CHE_ORIGINAL_NAME_LABEL, POD_NAME))\n        .withPorts(singletonList(servicePort))\n        .endSpec()\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/brokerphases/BrokerEnvironmentFactoryTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases;\n\nimport static java.util.Collections.singletonList;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableList;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.Quantity;\nimport java.net.URI;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.AgentAuthEnableEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.MachineTokenEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.PluginFQN;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.CertificateProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.BrokerEnvironmentFactory.BrokersConfigs;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\n@Listeners(MockitoTestNGListener.class)\npublic class BrokerEnvironmentFactoryTest {\n\n  private static final String ARTIFACTS_BROKER_IMAGE = \"artifacts:image\";\n  private static final String METADATA_BROKER_IMAGE = \"metadata:image\";\n  private static final String DEFAULT_REGISTRY = \"default.registry\";\n  private static final String IMAGE_PULL_POLICY = \"Never\";\n  private static final String PUSH_ENDPOINT = \"http://localhost:8080\";\n  private static final String PLUGINS_VOLUME_NAME = \"plugins\";\n  private static final String CA_CERTIFICATES_MOUNT_PATH = \"/public-certs\";\n  @Mock private CertificateProvisioner certProvisioner;\n  @Mock private AgentAuthEnableEnvVarProvider authEnableEnvVarProvider;\n  @Mock private MachineTokenEnvVarProvider machineTokenEnvVarProvider;\n  @Mock private RuntimeIdentity runtimeId;\n\n  private BrokerEnvironmentFactory<KubernetesEnvironment> factory;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    factory =\n        spy(\n            new BrokerEnvironmentFactory<KubernetesEnvironment>(\n                PUSH_ENDPOINT,\n                null,\n                IMAGE_PULL_POLICY,\n                authEnableEnvVarProvider,\n                machineTokenEnvVarProvider,\n                ARTIFACTS_BROKER_IMAGE,\n                METADATA_BROKER_IMAGE,\n                DEFAULT_REGISTRY,\n                \"\",\n                CA_CERTIFICATES_MOUNT_PATH,\n                certProvisioner) {\n              @Override\n              protected KubernetesEnvironment doCreate(BrokersConfigs brokersConfigs) {\n                return null;\n              }\n            });\n\n    lenient()\n        .when(authEnableEnvVarProvider.get(any(RuntimeIdentity.class)))\n        .thenReturn(new Pair<>(\"test1\", \"value1\"));\n    lenient()\n        .when(machineTokenEnvVarProvider.get(any(RuntimeIdentity.class)))\n        .thenReturn(new Pair<>(\"test2\", \"value2\"));\n    lenient().when(runtimeId.getEnvName()).thenReturn(\"env\");\n    lenient().when(runtimeId.getOwnerId()).thenReturn(\"owner\");\n    lenient().when(runtimeId.getWorkspaceId()).thenReturn(\"wsid\");\n    lenient().when(certProvisioner.isConfigured()).thenReturn(false);\n  }\n\n  @Test\n  public void testMetadataBrokerSelfSignedCertificate() throws Exception {\n    when(certProvisioner.isConfigured()).thenReturn(true);\n    when(certProvisioner.getCertPath()).thenReturn(\"/tmp/che/cacert\");\n    // given\n    Collection<PluginFQN> pluginFQNs = singletonList(new PluginFQN(null, \"id\"));\n    ArgumentCaptor<BrokersConfigs> captor = ArgumentCaptor.forClass(BrokersConfigs.class);\n\n    // when\n    factory.createForMetadataBroker(pluginFQNs, runtimeId, false);\n\n    // then\n    verify(factory).doCreate(captor.capture());\n    BrokersConfigs brokersConfigs = captor.getValue();\n\n    List<Container> containers =\n        brokersConfigs.pods.values().stream()\n            .flatMap(p -> p.getSpec().getContainers().stream())\n            .collect(Collectors.toList());\n    assertEquals(containers.size(), 1);\n    Container container = containers.get(0);\n    assertEquals(\n        container.getArgs().toArray(),\n        new String[] {\n          \"--push-endpoint\",\n          PUSH_ENDPOINT,\n          \"--runtime-id\",\n          String.format(\n              \"%s:%s:%s\",\n              runtimeId.getWorkspaceId(), runtimeId.getEnvName(), runtimeId.getOwnerId()),\n          \"--cacert\",\n          \"/tmp/che/cacert\",\n          \"--registry-address\",\n          DEFAULT_REGISTRY,\n          \"--metas\",\n          \"/broker-config/config.json\",\n        });\n  }\n\n  @Test\n  public void testArtifactsBrokerSelfSignedCertificate() throws Exception {\n    when(certProvisioner.isConfigured()).thenReturn(true);\n    when(certProvisioner.getCertPath()).thenReturn(\"/tmp/che/cacert\");\n    // given\n    Collection<PluginFQN> pluginFQNs = singletonList(new PluginFQN(null, \"id\"));\n    ArgumentCaptor<BrokersConfigs> captor = ArgumentCaptor.forClass(BrokersConfigs.class);\n\n    // when\n    factory.createForArtifactsBroker(pluginFQNs, runtimeId, false);\n\n    // then\n    verify(factory).doCreate(captor.capture());\n    BrokersConfigs brokersConfigs = captor.getValue();\n\n    List<Container> containers =\n        brokersConfigs.pods.values().stream()\n            .flatMap(p -> p.getSpec().getContainers().stream())\n            .collect(Collectors.toList());\n    assertEquals(containers.size(), 1);\n    Container container = containers.get(0);\n    assertEquals(\n        container.getArgs().toArray(),\n        new String[] {\n          \"--push-endpoint\",\n          PUSH_ENDPOINT,\n          \"--runtime-id\",\n          String.format(\n              \"%s:%s:%s\",\n              runtimeId.getWorkspaceId(), runtimeId.getEnvName(), runtimeId.getOwnerId()),\n          \"--cacert\",\n          \"/tmp/che/cacert\",\n          \"--registry-address\",\n          DEFAULT_REGISTRY,\n          \"--metas\",\n          \"/broker-config/config.json\",\n        });\n  }\n\n  @Test\n  public void testAddsMergeArgToArtifactsBroker() throws Exception {\n    // given\n    Collection<PluginFQN> pluginFQNs = singletonList(new PluginFQN(null, \"id\"));\n    ArgumentCaptor<BrokersConfigs> captor = ArgumentCaptor.forClass(BrokersConfigs.class);\n\n    // when\n    factory.createForArtifactsBroker(pluginFQNs, runtimeId, true);\n\n    // then\n    verify(factory).doCreate(captor.capture());\n    BrokersConfigs brokersConfigs = captor.getValue();\n\n    List<Container> containers =\n        brokersConfigs.pods.values().stream()\n            .flatMap(p -> p.getSpec().getContainers().stream())\n            .collect(Collectors.toList());\n    assertEquals(containers.size(), 1);\n    Container container = containers.get(0);\n    assertTrue(container.getArgs().stream().anyMatch(e -> \"--merge-plugins\".equals(e)));\n  }\n\n  @Test\n  public void testAddsMergeArgToMetadataBroker() throws Exception {\n    // given\n    Collection<PluginFQN> pluginFQNs = singletonList(new PluginFQN(null, \"id\"));\n    ArgumentCaptor<BrokersConfigs> captor = ArgumentCaptor.forClass(BrokersConfigs.class);\n\n    // when\n    factory.createForMetadataBroker(pluginFQNs, runtimeId, true);\n\n    // then\n    verify(factory).doCreate(captor.capture());\n    BrokersConfigs brokersConfigs = captor.getValue();\n\n    List<Container> containers =\n        brokersConfigs.pods.values().stream()\n            .flatMap(p -> p.getSpec().getContainers().stream())\n            .collect(Collectors.toList());\n    assertEquals(containers.size(), 1);\n    Container container = containers.get(0);\n    assertTrue(container.getArgs().stream().anyMatch(e -> \"--merge-plugins\".equals(e)));\n  }\n\n  @Test\n  public void shouldNameContainersAfterMetadataPluginBrokerImage() throws Exception {\n    // given\n    Collection<PluginFQN> pluginFQNs = singletonList(new PluginFQN(null, \"id\"));\n    ArgumentCaptor<BrokersConfigs> captor = ArgumentCaptor.forClass(BrokersConfigs.class);\n\n    // when\n    factory.createForMetadataBroker(pluginFQNs, runtimeId, false);\n\n    // then\n    verify(factory).doCreate(captor.capture());\n    BrokersConfigs brokersConfigs = captor.getValue();\n    PodSpec brokerPodSpec = brokersConfigs.pods.values().iterator().next().getSpec();\n\n    List<Container> containers = brokerPodSpec.getContainers();\n    assertEquals(containers.size(), 1);\n    assertEquals(containers.get(0).getName(), \"metadata-image\");\n  }\n\n  @Test\n  public void shouldNameContainersAfterArtifactsPluginBrokerImage() throws Exception {\n    // given\n    Collection<PluginFQN> pluginFQNs = singletonList(new PluginFQN(null, \"id\"));\n    ArgumentCaptor<BrokersConfigs> captor = ArgumentCaptor.forClass(BrokersConfigs.class);\n\n    // when\n    factory.createForArtifactsBroker(pluginFQNs, runtimeId, false);\n\n    // then\n    verify(factory).doCreate(captor.capture());\n    BrokersConfigs brokersConfigs = captor.getValue();\n    PodSpec brokerPodSpec = brokersConfigs.pods.values().iterator().next().getSpec();\n\n    List<Container> containers = brokerPodSpec.getContainers();\n    assertEquals(containers.size(), 1);\n    assertEquals(containers.get(0).getName(), \"artifacts-image\");\n  }\n\n  @Test\n  public void shouldCreateConfigMapWithPluginFQNsWithMetadataBroker() throws Exception {\n    // given\n    Collection<PluginFQN> pluginFQNs =\n        ImmutableList.of(\n            new PluginFQN(null, \"testPublisher/testPlugin1/testver1\"),\n            new PluginFQN(new URI(\"testregistry\"), \"testPublisher/testPlugin2/testver2\"));\n    ArgumentCaptor<BrokersConfigs> captor = ArgumentCaptor.forClass(BrokersConfigs.class);\n\n    // when\n    factory.createForMetadataBroker(pluginFQNs, runtimeId, false);\n\n    // then\n    verify(factory).doCreate(captor.capture());\n    BrokersConfigs brokersConfigs = captor.getValue();\n    ConfigMap brokerConfigMap = brokersConfigs.configMaps.values().iterator().next();\n    String config = brokerConfigMap.getData().get(BrokerEnvironmentFactory.CONFIG_FILE);\n\n    assertFalse(config.contains(\"\\\"registry\\\":null\"), \"Should not serialize null registry\");\n    List<String> expected =\n        ImmutableList.of(\n            \"\\\"id\\\":\\\"testPublisher/testPlugin1/testver1\\\"\",\n            \"\\\"registry\\\":\\\"testregistry\\\"\",\n            \"\\\"id\\\":\\\"testPublisher/testPlugin2/testver2\\\"\");\n    for (String expect : expected) {\n      assertTrue(\n          config.contains(expect),\n          String.format(\n              \"Missing field from serialized config: expected '%s' in '%s'\", expect, config));\n    }\n  }\n\n  @Test\n  public void shouldCreateConfigMapWithPluginFQNsWithArtifactsBroker() throws Exception {\n    // given\n    Collection<PluginFQN> pluginFQNs =\n        ImmutableList.of(\n            new PluginFQN(null, \"testPublisher/testPlugin1/testver1\"),\n            new PluginFQN(new URI(\"testregistry\"), \"testPublisher/testPlugin2/testver2\"));\n    ArgumentCaptor<BrokersConfigs> captor = ArgumentCaptor.forClass(BrokersConfigs.class);\n\n    // when\n    factory.createForArtifactsBroker(pluginFQNs, runtimeId, false);\n\n    // then\n    verify(factory).doCreate(captor.capture());\n    BrokersConfigs brokersConfigs = captor.getValue();\n    ConfigMap brokerConfigMap = brokersConfigs.configMaps.values().iterator().next();\n    String config = brokerConfigMap.getData().get(BrokerEnvironmentFactory.CONFIG_FILE);\n\n    assertFalse(config.contains(\"\\\"registry\\\":null\"), \"Should not serialize null registry\");\n    List<String> expected =\n        ImmutableList.of(\n            \"\\\"id\\\":\\\"testPublisher/testPlugin1/testver1\\\"\",\n            \"\\\"registry\\\":\\\"testregistry\\\"\",\n            \"\\\"id\\\":\\\"testPublisher/testPlugin2/testver2\\\"\");\n    for (String expect : expected) {\n      assertTrue(\n          config.contains(expect),\n          String.format(\n              \"Missing field from serialized config: expected '%s' in '%s'\", expect, config));\n    }\n  }\n\n  @Test\n  public void shouldIncludePluginsVolumeInArtifactsBroker() throws Exception {\n    // given\n    Collection<PluginFQN> pluginFQNs = singletonList(new PluginFQN(null, \"id\"));\n    ArgumentCaptor<BrokersConfigs> captor = ArgumentCaptor.forClass(BrokersConfigs.class);\n\n    // when\n    factory.createForArtifactsBroker(pluginFQNs, runtimeId, false);\n\n    // then\n    verify(factory).doCreate(captor.capture());\n    BrokersConfigs brokersConfigs = captor.getValue();\n    InternalMachineConfig machine = brokersConfigs.machines.values().iterator().next();\n    assertTrue(machine.getVolumes().containsKey(PLUGINS_VOLUME_NAME));\n    assertEquals(machine.getVolumes().get(PLUGINS_VOLUME_NAME).getPath(), \"/plugins\");\n  }\n\n  @Test\n  public void shouldNotIncludePluginsVolumeInMetadataBroker() throws Exception {\n    // given\n    Collection<PluginFQN> pluginFQNs = singletonList(new PluginFQN(null, \"id\"));\n    ArgumentCaptor<BrokersConfigs> captor = ArgumentCaptor.forClass(BrokersConfigs.class);\n\n    // when\n    factory.createForMetadataBroker(pluginFQNs, runtimeId, false);\n\n    // then\n    verify(factory).doCreate(captor.capture());\n    BrokersConfigs brokersConfigs = captor.getValue();\n    InternalMachineConfig machine = brokersConfigs.machines.values().iterator().next();\n    assertFalse(machine.getVolumes().containsKey(PLUGINS_VOLUME_NAME));\n  }\n\n  @Test(dataProvider = \"imageRefs\")\n  public void testImageToContainerNameConversion(Object image, Object expected) {\n    String actual = factory.generateContainerNameFromImageRef((String) image);\n    assertEquals(\n        actual,\n        expected,\n        String.format(\"Should generate name '%s' from image '%s'.\", expected, image));\n  }\n\n  @Test\n  public void testQuotasBroker() throws Exception {\n    // given\n    Collection<PluginFQN> pluginFQNs = singletonList(new PluginFQN(null, \"id\"));\n    ArgumentCaptor<BrokersConfigs> captor = ArgumentCaptor.forClass(BrokersConfigs.class);\n\n    // when\n    factory.createForMetadataBroker(pluginFQNs, runtimeId, false);\n\n    // then\n    verify(factory).doCreate(captor.capture());\n    BrokersConfigs brokersConfigs = captor.getValue();\n\n    List<Container> containers =\n        brokersConfigs.pods.values().stream()\n            .flatMap(p -> p.getSpec().getContainers().stream())\n            .collect(Collectors.toList());\n    assertEquals(containers.size(), 1);\n    Container container = containers.get(0);\n    assertEquals(container.getResources().getRequests().get(\"memory\"), new Quantity(\"250Mi\"));\n    assertEquals(container.getResources().getLimits().get(\"memory\"), new Quantity(\"250Mi\"));\n    assertEquals(container.getResources().getRequests().get(\"cpu\"), new Quantity(\"300m\"));\n    assertEquals(container.getResources().getLimits().get(\"cpu\"), new Quantity(\"300m\"));\n  }\n\n  @DataProvider(name = \"imageRefs\")\n  public Object[][] imageRefs() {\n    return new Object[][] {\n      {\"quay.io/eclipse/che-unified-plugin-broker:v0.20\", \"che-unified-plugin-broker-v0-20\"},\n      {\"very-long-registry-hostname-url.service/eclipse/image:tag\", \"image-tag\"},\n      {\"eclipse/che-unified-plugin-broker:v0.20\", \"che-unified-plugin-broker-v0-20\"},\n      {\"very-long-organization.name-eclipse-che/image:tag\", \"image-tag\"},\n      {\"very-long-registry-hostname-url.service/very-long-organization/image:tag\", \"image-tag\"},\n      {\n        \"image-with-digest@sha256:7b868470f7b63d9da10a788d26abf4c076f90dc4c7de24d1298a8160c9a3dcc9\",\n        \"image-with-digest-7b868470f7\"\n      },\n      {\"image-with-short-digest@sha256:abcd\", \"image-with-short-digest-abcd\"},\n      {\"no-exception-when-no-colon@sha256abcd\", \"no-exception-when-no-colon-sha256abcd\"},\n      {\n        \"image-and-tag-longer-than-63-chars:really-long-tag-for-some-reason\",\n        \"image-and-tag-longer-than-63-chars-really-long-tag-for-some-rea\"\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/brokerphases/DeployBrokerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases;\n\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.workspace.shared.Constants.DEBUG_WORKSPACE_START;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertSame;\n\nimport com.google.common.collect.ImmutableMap;\nimport com.google.common.collect.ImmutableSet;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.opentracing.Tracer;\nimport java.util.List;\nimport java.util.Set;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.RuntimeIdentityImpl;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.RuntimeLogsPublisher;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesConfigsMaps;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesDeployments;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesSecrets;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.LogWatchTimeouts;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.LogWatcher;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.PodLogHandler;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.UnrecoverablePodEventListener;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.UnrecoverablePodEventListenerFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.BrokersResult;\nimport org.mockito.Answers;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link DeployBroker}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class DeployBrokerTest {\n\n  private static final String PLUGIN_BROKER_POD_NAME = \"pluginBrokerPodName\";\n  private static final RuntimeIdentity RUNTIME_ID =\n      new RuntimeIdentityImpl(\"workspaceId\", \"env\", \"userId\", \"infraNamespace\");\n  @Mock private BrokerPhase nextBrokerPhase;\n\n  @Mock private KubernetesNamespace k8sNamespace;\n  @Mock private KubernetesDeployments k8sDeployments;\n  @Mock private KubernetesConfigsMaps k8sConfigMaps;\n  @Mock private KubernetesSecrets k8sSecrets;\n\n  @Mock private KubernetesEnvironment k8sEnvironment;\n  @Mock private ConfigMap configMap;\n  @Mock private Secret tlsSecret;\n  private Pod pod;\n\n  @Mock private BrokersResult brokersResult;\n  @Mock private UnrecoverablePodEventListenerFactory unrecoverableEventListenerFactory;\n  @Mock private RuntimeEventsPublisher runtimeEventPublisher;\n\n  @Mock(answer = Answers.RETURNS_MOCKS)\n  private Tracer tracer;\n\n  private List<ChePlugin> plugins = emptyList();\n\n  private DeployBroker deployBrokerPhase;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    deployBrokerPhase =\n        new DeployBroker(\n            RUNTIME_ID,\n            k8sNamespace,\n            k8sEnvironment,\n            brokersResult,\n            unrecoverableEventListenerFactory,\n            runtimeEventPublisher,\n            tracer,\n            emptyMap());\n    deployBrokerPhase.then(nextBrokerPhase);\n\n    when(nextBrokerPhase.execute()).thenReturn(plugins);\n\n    when(k8sNamespace.configMaps()).thenReturn(k8sConfigMaps);\n    when(k8sNamespace.deployments()).thenReturn(k8sDeployments);\n    when(k8sNamespace.secrets()).thenReturn(k8sSecrets);\n\n    pod = new PodBuilder().withNewMetadata().withName(PLUGIN_BROKER_POD_NAME).endMetadata().build();\n    when(k8sEnvironment.getPodsCopy()).thenReturn(ImmutableMap.of(PLUGIN_BROKER_POD_NAME, pod));\n    when(k8sEnvironment.getConfigMaps()).thenReturn(ImmutableMap.of(\"configMap\", configMap));\n    when(k8sEnvironment.getSecrets()).thenReturn(ImmutableMap.of(\"secret\", tlsSecret));\n\n    when(k8sDeployments.create(any())).thenReturn(pod);\n  }\n\n  @Test\n  public void shouldDeployPluginBrokerEnvironment() throws Exception {\n    // when\n    List<ChePlugin> result = deployBrokerPhase.execute();\n\n    // then\n    assertSame(result, plugins);\n    verify(k8sConfigMaps).create(configMap);\n    verify(k8sDeployments).create(pod);\n    verify(k8sSecrets).create(tlsSecret);\n\n    verify(k8sDeployments).stopWatch();\n    verify(k8sDeployments).delete();\n    verify(k8sConfigMaps).delete();\n    verify(k8sSecrets).delete();\n  }\n\n  @Test\n  public void shouldListenToUnrecoverableEventsIfFactoryIsConfigured() throws Exception {\n    // given\n    when(unrecoverableEventListenerFactory.isConfigured()).thenReturn(true);\n    UnrecoverablePodEventListener listener = mock(UnrecoverablePodEventListener.class);\n    when(unrecoverableEventListenerFactory.create(any(Set.class), any())).thenReturn(listener);\n\n    // when\n    deployBrokerPhase.execute();\n\n    // then\n    verify(unrecoverableEventListenerFactory).isConfigured();\n    verify(unrecoverableEventListenerFactory)\n        .create(eq(ImmutableSet.of(PLUGIN_BROKER_POD_NAME)), any());\n    verify(k8sDeployments).watchEvents(listener);\n    verify(k8sDeployments).stopWatch();\n  }\n\n  @Test\n  public void shouldListenToPodEventsToPropagateThemAsLogs() throws Exception {\n    // given\n    // when\n    deployBrokerPhase.execute();\n\n    // then\n    verify(k8sDeployments).watchEvents(any(RuntimeLogsPublisher.class));\n    verify(k8sDeployments).stopWatch();\n  }\n\n  @Test\n  public void shouldWatchTheLogsWhenSetInStartOptions() throws Exception {\n    // given\n    deployBrokerPhase =\n        new DeployBroker(\n            RUNTIME_ID,\n            k8sNamespace,\n            k8sEnvironment,\n            brokersResult,\n            unrecoverableEventListenerFactory,\n            runtimeEventPublisher,\n            tracer,\n            singletonMap(DEBUG_WORKSPACE_START, Boolean.TRUE.toString()));\n    deployBrokerPhase.then(nextBrokerPhase);\n    when(nextBrokerPhase.execute()).thenReturn(plugins);\n\n    // when\n    deployBrokerPhase.execute();\n\n    // then\n    verify(k8sDeployments)\n        .watchLogs(\n            any(PodLogHandler.class),\n            any(RuntimeEventsPublisher.class),\n            any(LogWatchTimeouts.class),\n            any(),\n            eq(LogWatcher.DEFAULT_LOG_LIMIT_BYTES));\n    verify(k8sDeployments).stopWatch();\n  }\n\n  @Test\n  public void shouldWatchTheLogsWithProperBytesLimitWhenSet() throws Exception {\n    // given\n    deployBrokerPhase =\n        new DeployBroker(\n            RUNTIME_ID,\n            k8sNamespace,\n            k8sEnvironment,\n            brokersResult,\n            unrecoverableEventListenerFactory,\n            runtimeEventPublisher,\n            tracer,\n            ImmutableMap.of(\n                DEBUG_WORKSPACE_START,\n                Boolean.TRUE.toString(),\n                Constants.DEBUG_WORKSPACE_START_LOG_LIMIT_BYTES,\n                \"123\"));\n    deployBrokerPhase.then(nextBrokerPhase);\n    when(nextBrokerPhase.execute()).thenReturn(plugins);\n\n    // when\n    deployBrokerPhase.execute();\n\n    // then\n    verify(k8sDeployments)\n        .watchLogs(\n            any(PodLogHandler.class),\n            any(RuntimeEventsPublisher.class),\n            any(LogWatchTimeouts.class),\n            any(),\n            eq(123L));\n    verify(k8sDeployments).stopWatch();\n  }\n\n  @Test\n  public void shouldNotWatchTheLogsWhenSetFalseInStartOptions() throws Exception {\n    // given\n    deployBrokerPhase =\n        new DeployBroker(\n            RUNTIME_ID,\n            k8sNamespace,\n            k8sEnvironment,\n            brokersResult,\n            unrecoverableEventListenerFactory,\n            runtimeEventPublisher,\n            tracer,\n            singletonMap(DEBUG_WORKSPACE_START, Boolean.FALSE.toString()));\n    deployBrokerPhase.then(nextBrokerPhase);\n    when(nextBrokerPhase.execute()).thenReturn(plugins);\n\n    // when\n    deployBrokerPhase.execute();\n\n    // then\n    verify(k8sDeployments, never())\n        .watchLogs(\n            any(PodLogHandler.class),\n            any(RuntimeEventsPublisher.class),\n            any(LogWatchTimeouts.class),\n            any(),\n            eq(LogWatcher.DEFAULT_LOG_LIMIT_BYTES));\n    verify(k8sDeployments).stopWatch();\n  }\n\n  @Test\n  public void shouldNotWatchTheLogsWhenEmptyStartOptions() throws Exception {\n    // given\n    // when\n    deployBrokerPhase.execute();\n\n    // then\n    verify(k8sDeployments, never())\n        .watchLogs(\n            any(PodLogHandler.class),\n            any(RuntimeEventsPublisher.class),\n            any(LogWatchTimeouts.class),\n            any(),\n            eq(LogWatcher.DEFAULT_LOG_LIMIT_BYTES));\n    verify(k8sDeployments).stopWatch();\n  }\n\n  @Test\n  public void shouldNotWatchTheLogsWhenNullStartOptions() throws Exception {\n    // given\n    deployBrokerPhase =\n        new DeployBroker(\n            RUNTIME_ID,\n            k8sNamespace,\n            k8sEnvironment,\n            brokersResult,\n            unrecoverableEventListenerFactory,\n            runtimeEventPublisher,\n            tracer,\n            null);\n    deployBrokerPhase.then(nextBrokerPhase);\n    when(nextBrokerPhase.execute()).thenReturn(plugins);\n\n    // when\n    deployBrokerPhase.execute();\n\n    // then\n    verify(k8sDeployments, never())\n        .watchLogs(\n            any(PodLogHandler.class),\n            any(RuntimeEventsPublisher.class),\n            any(LogWatchTimeouts.class),\n            any(),\n            eq(LogWatcher.DEFAULT_LOG_LIMIT_BYTES));\n    verify(k8sDeployments).stopWatch();\n  }\n\n  @Test\n  public void shouldDoNotListenToUnrecoverableEventsIfFactoryIsConfigured() throws Exception {\n    // given\n    when(unrecoverableEventListenerFactory.isConfigured()).thenReturn(false);\n\n    // when\n    deployBrokerPhase.execute();\n\n    // then\n    verify(unrecoverableEventListenerFactory).isConfigured();\n    verify(unrecoverableEventListenerFactory, never())\n        .create(eq(ImmutableSet.of(PLUGIN_BROKER_POD_NAME)), any());\n    verify(k8sDeployments, never()).watchEvents(any(UnrecoverablePodEventListener.class));\n    verify(k8sDeployments).stopWatch();\n  }\n\n  @Test(\n      expectedExceptions = InternalInfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Plugin broker environment must have only one pod\\\\. Workspace `workspaceId` contains `0` pods\\\\.\")\n  public void shouldThrowExceptionIfThereIsNoAnyPodsInEnvironment() throws Exception {\n    // given\n    when(k8sEnvironment.getPodsCopy()).thenReturn(emptyMap());\n\n    // when\n    deployBrokerPhase.execute();\n  }\n\n  @Test(\n      expectedExceptions = InternalInfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Plugin broker environment must have only one pod\\\\. Workspace `workspaceId` contains `2` pods\\\\.\")\n  public void shouldThrowExceptionIfThereAreMoreThanOnePodsInEnvironment() throws Exception {\n    // given\n    when(k8sEnvironment.getPodsCopy()).thenReturn(ImmutableMap.of(\"pod1\", pod, \"pod2\", pod));\n\n    // when\n    deployBrokerPhase.execute();\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/wsplugins/events/BrokerStatusListenerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events;\n\nimport static java.util.Collections.emptyList;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyList;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\n\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.workspace.server.model.impl.RuntimeIdentityImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.api.workspace.shared.dto.BrokerStatus;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.BrokersResult;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.KubernetesPluginsToolingValidator;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link BrokerStatusListener}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class BrokerStatusListenerTest {\n\n  public static final String WORKSPACE_ID = \"workspace123\";\n  @Mock BrokersResult brokersResult;\n  @Mock KubernetesPluginsToolingValidator validator;\n\n  private BrokerStatusListener brokerStatusListener;\n\n  @BeforeMethod\n  public void setUp() {\n    brokerStatusListener = new BrokerStatusListener(WORKSPACE_ID, validator, brokersResult);\n  }\n\n  @Test\n  public void shouldDoNothingIfEventWithForeignWorkspaceIdIsReceived() {\n    // given\n    BrokerEvent event =\n        new BrokerEvent()\n            .withRuntimeId(new RuntimeIdentityImpl(\"foreignWorkspace\", null, null, null));\n\n    // when\n    brokerStatusListener.onEvent(event);\n\n    // then\n    verifyNoMoreInteractions(brokersResult);\n  }\n\n  @Test\n  public void shouldDoNothingIfEventWithoutRuntimeIdentityIsReceived() {\n    // given\n    BrokerEvent event = new BrokerEvent().withRuntimeId(null);\n\n    // when\n    brokerStatusListener.onEvent(event);\n\n    // then\n    verifyNoMoreInteractions(brokersResult);\n  }\n\n  @Test\n  public void shouldAddResultWhenDoneEventIsReceivedAndToolingIsNotNull() throws Exception {\n    // given\n    BrokerEvent event =\n        new BrokerEvent()\n            .withRuntimeId(new RuntimeIdentityImpl(WORKSPACE_ID, null, null, null))\n            .withStatus(BrokerStatus.DONE)\n            .withTooling(emptyList());\n\n    // when\n    brokerStatusListener.onEvent(event);\n\n    // then\n    verify(brokersResult).setResult(emptyList());\n  }\n\n  @Test\n  public void shouldSubmitErrorWhenDoneEventIsReceivedButToolingIsValidationFails()\n      throws Exception {\n    // given\n    doThrow(new ValidationException(\"test\")).when(validator).validatePluginNames(anyList());\n    BrokerEvent event =\n        new BrokerEvent()\n            .withRuntimeId(new RuntimeIdentityImpl(WORKSPACE_ID, null, null, null))\n            .withStatus(BrokerStatus.DONE)\n            .withTooling(emptyList());\n\n    // when\n    brokerStatusListener.onEvent(event);\n\n    // then\n    verify(brokersResult).error(any(ValidationException.class));\n  }\n\n  @Test\n  public void shouldNotCallAddResultWhenValidationFails() throws Exception {\n    // given\n    doThrow(new ValidationException(\"test\")).when(validator).validatePluginNames(anyList());\n    BrokerEvent event =\n        new BrokerEvent()\n            .withRuntimeId(new RuntimeIdentityImpl(WORKSPACE_ID, null, null, null))\n            .withStatus(BrokerStatus.DONE)\n            .withTooling(emptyList());\n\n    // when\n    brokerStatusListener.onEvent(event);\n\n    // then\n    verify(brokersResult, never()).setResult(anyList());\n  }\n\n  @Test\n  public void shouldSubmitErrorWhenDoneEventIsReceivedButToolingIsNull() {\n    // given\n    BrokerEvent event =\n        new BrokerEvent()\n            .withRuntimeId(new RuntimeIdentityImpl(WORKSPACE_ID, null, null, null))\n            .withStatus(BrokerStatus.DONE)\n            .withTooling(null);\n\n    // when\n    brokerStatusListener.onEvent(event);\n\n    // then\n    verify(brokersResult).error(any(InternalInfrastructureException.class));\n  }\n\n  @Test\n  public void shouldSubmitErrorWhenFailedEventIsReceived() {\n    // given\n    BrokerEvent event =\n        new BrokerEvent()\n            .withRuntimeId(new RuntimeIdentityImpl(WORKSPACE_ID, null, null, null))\n            .withStatus(BrokerStatus.FAILED)\n            .withError(\"error\");\n\n    // when\n    brokerStatusListener.onEvent(event);\n\n    // then\n    verify(brokersResult).error(any(InfrastructureException.class));\n  }\n}\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/resources/META-INF/services/org.eclipse.che.commons.test.tck.TckModule",
    "content": "org.eclipse.che.workspace.infrastructure.kubernetes.cache.jpa.JpaTckModule\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/resources/devfile/petclinic.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: v1\nkind: List\nitems:\n- apiVersion: v1\n  kind: Pod\n  metadata:\n    name: petclinic\n    labels:\n      app.kubernetes.io/name: petclinic\n      app.kubernetes.io/component: webapp\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    initContainers:\n    - command:\n          - \"echo foo:bar\"\n      image: \"openjdk:11-jre-openjdk9\"\n      name: \"init\"\n    containers:\n    - name: server\n      image: mariolet/petclinic\n      ports:\n      - containerPort: 8080\n        protocol: TCP\n      resources:\n        limits:\n          memory: 512Mi\n- apiVersion: v1\n  kind: Pod\n  metadata:\n    name: mysql\n    labels:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    containers:\n    - name: mysql\n      image: centos/mysql-57-centos7\n      env:\n      - name: MYSQL_USER\n        value: petclinic\n      - name: MYSQL_PASSWORD\n        value: petclinic\n      - name: MYSQL_ROOT_PASSWORD\n        value: petclinic\n      - name: MYSQL_DATABASE\n        value: petclinic\n      ports:\n      - containerPort: 3306\n        protocol: TCP\n      resources:\n        limits:\n          memory: 512Mi\n- apiVersion: v1\n  kind: Pod\n  metadata:\n    name: withoutLabels\n  spec:\n      containers:\n      - name: server\n        imagePullPolicy: Always\n        image: test/petclinic\n        ports:\n        - containerPort: 8080\n          protocol: TCP\n        resources:\n          limits:\n            memory: 512Mi\n        volumeMounts:\n          - name: foo_volume\n            mountPath: /foo/bar\n- kind: Service\n  apiVersion: v1\n  metadata:\n    name: mysql\n    labels:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    ports:\n      - name: mysql\n        port: 3306\n        targetPort: 3360\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n- kind: Service\n  apiVersion: v1\n  metadata:\n    name: petclinic\n    labels:\n      app.kubernetes.io/name: petclinic\n      app.kubernetes.io/component: webapp\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    ports:\n      - name: web\n        port: 8080\n        targetPort: 8080\n    selector:\n      app: petclinic\n      component: webapp\n- kind: Route\n  apiVersion: v1\n  metadata:\n    name: petclinic\n    labels:\n      app.kubernetes.io/name: petclinic\n      app.kubernetes.io/component: webapp\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    to:\n      kind: Service\n      name: petclinic\n    port:\n      targetPort: web\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/resources/devfile/petclinicPods.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: v1\nkind: List\nitems:\n  - apiVersion: v1\n    kind: Pod\n    metadata:\n      name: petclinic\n      labels:\n        app.kubernetes.io/name: petclinic\n        app.kubernetes.io/component: webapp\n        app.kubernetes.io/part-of: petclinic\n    spec:\n      containers:\n        - name: server\n          image: mariolet/petclinic\n          ports:\n            - containerPort: 8080\n              protocol: TCP\n          resources:\n            limits:\n              memory: 512Mi\n  - apiVersion: v1\n    kind: Pod\n    metadata:\n      name: mysql\n      labels:\n        app.kubernetes.io/name: mysql\n        app.kubernetes.io/component: database\n        app.kubernetes.io/part-of: petclinic\n    spec:\n      containers:\n        - name: mysql\n          image: centos/mysql-57-centos7\n          env:\n            - name: MYSQL_USER\n              value: petclinic\n            - name: MYSQL_PASSWORD\n              value: petclinic\n            - name: MYSQL_ROOT_PASSWORD\n              value: petclinic\n            - name: MYSQL_DATABASE\n              value: petclinic\n          ports:\n            - containerPort: 3306\n              protocol: TCP\n          resources:\n            limits:\n              memory: 512Mi\n  - apiVersion: v1\n    kind: Pod\n    metadata:\n      name: withoutLabels\n    spec:\n      containers:\n        - name: server\n          imagePullPolicy: Always\n          image: test/petclinic\n          ports:\n            - containerPort: 8080\n              protocol: TCP\n          resources:\n            limits:\n              memory: 512Mi\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/resources/jwtproxy-confg.yaml",
    "content": "---\njwtproxy:\n  signer_proxy:\n    enabled: false\n  verifier_proxies:\n  - listen_addr: \":8080\"\n    verifier:\n      audience: \"workspace123\"\n      auth_cookies_enabled: false\n      claims_verifiers:\n      - options:\n          iss: \"wsmaster\"\n        type: \"static\"\n      cookie_path: \"/\"\n      key_server:\n        options:\n          issuer: \"wsmaster\"\n          key_id: \"workspace123\"\n          public_key_path: \"/che-jwtproxy-config/mykey.pub\"\n        type: \"preshared\"\n      max_skew: \"1m\"\n      max_ttl: \"1m\"\n      nonce_storage:\n        type: \"void\"\n      public_base_path: \"/there\"\n      upstream: \"http://tomcat:8080\"\n  - listen_addr: \":4101\"\n    verifier:\n      audience: \"workspace123\"\n      auth_cookies_enabled: true\n      auth_redirect_url: \"http://che-host.com/app/loader.html\"\n      claims_verifiers:\n      - options:\n          iss: \"wsmaster\"\n        type: \"static\"\n      cookie_path: \"/cookies\"\n      excludes:\n      - \"/api/liveness\"\n      - \"/other/exclude\"\n      key_server:\n        options:\n          issuer: \"wsmaster\"\n          key_id: \"workspace123\"\n          public_key_path: \"/che-jwtproxy-config/mykey.pub\"\n        type: \"preshared\"\n      max_skew: \"1m\"\n      max_ttl: \"1m\"\n      nonce_storage:\n        type: \"void\"\n      public_base_path: \"/here\"\n      upstream: \"ws://terminal:4101\"\n\n"
  },
  {
    "path": "infrastructures/kubernetes/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <appender name=\"file\" class=\"ch.qos.logback.core.FileAppender\">\n        <File>target/log/log.log</File>\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n        <appender-ref ref=\"file\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "infrastructures/openshift/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-infrastructures-parent</artifactId>\n        <groupId>org.eclipse.che.infrastructure</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>infrastructure-openshift</artifactId>\n    <name>Infrastructure :: OpenShift</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-assistedinject</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-client-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-model-apps</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-model-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-model-networking</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>openshift-client</artifactId>\n            <exclusions>\n                <exclusion>\n                    <artifactId>netty-handler</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <!-- Fix CVE-2026-1002 -->\n                <exclusion>\n                    <artifactId>vertx-core</artifactId>\n                    <groupId>io.vertx</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>openshift-client-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>openshift-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-system</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-user</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-tracing</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.infrastructure</groupId>\n            <artifactId>infrastructure-kubernetes</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-authentication-commons</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-authorization</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-inject</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.netty</groupId>\n            <artifactId>netty-codec-http</artifactId>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.netty</groupId>\n            <artifactId>netty-handler</artifactId>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.vertx</groupId>\n            <artifactId>vertx-core</artifactId>\n            <scope>runtime</scope>\n            <exclusions>\n                <exclusion>\n                    <artifactId>netty-resolver</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-resolver-dns</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-buffer</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-transport</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-common</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-codec-http</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-server-mock</artifactId>\n            <scope>test</scope>\n            <exclusions>\n                <exclusion>\n                    <artifactId>junit-jupiter-api</artifactId>\n                    <groupId>org.junit.jupiter</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>mockwebserver</artifactId>\n            <scope>test</scope>\n            <!-- Fix CVE-2025-24970 -->\n            <exclusions>\n                <exclusion>\n                    <artifactId>netty-handler</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-handler-proxy</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-codec-http</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <!-- Fix CVE-2026-1002 -->\n                <exclusion>\n                    <artifactId>vertx-core</artifactId>\n                    <groupId>io.vertx</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-resolver</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-buffer</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-transport</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-codec</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>netty-common</artifactId>\n                    <groupId>io.netty</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>io.netty</groupId>\n            <artifactId>netty-handler-proxy</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/CheServerOpenshiftClientFactory.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift;\n\nimport io.fabric8.kubernetes.client.Config;\nimport io.fabric8.openshift.client.OpenShiftClient;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientConfigFactory;\n\n/**\n * This {@link OpenShiftClientFactory} ensures that we use `che` ServiceAccount and not related to\n * any workspace. It always provides client with default {@link Config}. It's useful for operations\n * that needs permissions of `che` SA, such as operations inside `che` namespace (like projects) or\n * some cluster-wide actions (like labeling the namespaces).\n *\n * <p>See also {@link\n * org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory}\n */\npublic class CheServerOpenshiftClientFactory extends OpenShiftClientFactory {\n  @Inject\n  public CheServerOpenshiftClientFactory(KubernetesClientConfigFactory configBuilder) {\n    super(configBuilder);\n  }\n\n  @Override\n  protected Config buildConfig(Config config, String workspaceId) throws InfrastructureException {\n    return config;\n  }\n\n  @Override\n  public OpenShiftClient createOC(String workspaceId) throws InfrastructureException {\n    return super.createOC();\n  }\n\n  @Override\n  public OpenShiftClient createOC() throws InfrastructureException {\n    return super.createOC();\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/Constants.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift;\n\n/**\n * Constants for OpenShift implementation of spi.\n *\n * @author Sergii Leshchenko\n */\npublic final class Constants {\n  private Constants() {}\n\n  /**\n   * Attribute name of {@link\n   * org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta} that\n   * stores project display name.\n   */\n  public static final String PROJECT_DISPLAY_NAME_ATTRIBUTE = \"displayName\";\n\n  /**\n   * Attribute name of {@link\n   * org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta} that\n   * stores project description.\n   */\n  public static final String PROJECT_DESCRIPTION_ATTRIBUTE = \"description\";\n\n  /**\n   * Annotation name of {@link io.fabric8.openshift.api.model.Project} that stores project display\n   * name.\n   */\n  public static final String PROJECT_DISPLAY_NAME_ANNOTATION = \"openshift.io/display-name\";\n\n  /**\n   * Annotation name of {@link io.fabric8.openshift.api.model.Project} that stores project\n   * description.\n   */\n  public static final String PROJECT_DESCRIPTION_ANNOTATION = \"openshift.io/description\";\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/OpenShiftClientFactory.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift;\n\nimport io.fabric8.kubernetes.client.Config;\nimport io.fabric8.kubernetes.client.DefaultKubernetesClient;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.http.HttpClient;\nimport io.fabric8.kubernetes.client.utils.TokenRefreshInterceptor;\nimport io.fabric8.openshift.client.DefaultOpenShiftClient;\nimport io.fabric8.openshift.client.OpenShiftClient;\nimport io.fabric8.openshift.client.OpenShiftConfig;\nimport io.fabric8.openshift.client.internal.OpenShiftOAuthInterceptor;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientConfigFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\n\n/**\n * @author Sergii Leshchenko\n * @author Anton Korneta\n */\n@Singleton\npublic class OpenShiftClientFactory extends KubernetesClientFactory {\n  @Inject\n  public OpenShiftClientFactory(KubernetesClientConfigFactory configBuilder) {\n    super(configBuilder);\n  }\n\n  /**\n   * Creates an instance of {@link OpenShiftClient} that can be used to perform any operation\n   * related to a given workspace. </br> <strong>Important note: </strong> However, in some\n   * use-cases involving web sockets, the Openshift client may introduce connection leaks. That's\n   * why this method should only be used for API calls that are specific to Openshift and thus not\n   * available in the {@link KubernetesClient} class: mainly route-related calls and project-related\n   * calls. For all other Kubernetes standard calls, prefer the {@code create(String workspaceId)}\n   * method that returns a Kubernetes client.\n   *\n   * @param workspaceId Identifier of the workspace on which Openshift operations will be performed\n   * @throws InfrastructureException if any error occurs on client instance creation.\n   */\n  public OpenShiftClient createOC(String workspaceId) throws InfrastructureException {\n    Config configForWorkspace = buildConfig(getDefaultConfig(), workspaceId);\n    return create(configForWorkspace);\n  }\n\n  /**\n   * Creates an instance of {@link OpenShiftClient} that can be used to perform any operation\n   * <strong>that is not related to a given workspace</strong>. </br> For operations performed in\n   * the context of a given workspace (workspace start, workspace stop, etc ...), the {@code\n   * createOC(String workspaceId)} method should be used to retrieve an Openshift client. </br>\n   * <strong>Important note: </strong> However in some use-cases involving web sockets, the\n   * Openshift client may introduce connection leaks. That's why this method should only be used for\n   * API calls that are specific to Openshift and thus not available in the {@link KubernetesClient}\n   * class: mainly route-related calls and project-related calls. For all other Kubernetes standard\n   * calls, just use the {@code create()} or {@code create(String workspaceId)} methods that return\n   * a Kubernetes client.\n   *\n   * @throws InfrastructureException if any error occurs on client instance creation.\n   */\n  public OpenShiftClient createOC() throws InfrastructureException {\n    return create(buildConfig(getDefaultConfig(), null));\n  }\n\n  public OpenShiftClient createAuthenticatedClient(String token) {\n    Config config = getDefaultConfig();\n    config.setOauthToken(token);\n    return create(config);\n  }\n\n  protected DefaultOpenShiftClient create(Config config) {\n    OpenShiftConfig openshiftConfig = new OpenShiftConfig(config);\n    return new UnclosableOpenShiftClient(clientForConfig(openshiftConfig), openshiftConfig);\n  }\n\n  private HttpClient clientForConfig(OpenShiftConfig config) {\n    HttpClient.DerivedClientBuilder builder = httpClient.newBuilder().authenticatorNone();\n    builder.addOrReplaceInterceptor(\"HEADER\", null);\n    return builder\n        .addOrReplaceInterceptor(\n            TokenRefreshInterceptor.NAME, new OpenShiftOAuthInterceptor(httpClient, config))\n        .build();\n  }\n\n  /**\n   * Decorates the {@link DefaultKubernetesClient} so that it can not be closed from the outside.\n   */\n  private static class UnclosableOpenShiftClient extends DefaultOpenShiftClient {\n\n    public UnclosableOpenShiftClient(HttpClient httpClient, OpenShiftConfig config) {\n      super(httpClient, config);\n    }\n\n    @Override\n    public void close() {}\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/OpenShiftEnvironmentProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesEnvironmentProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.CertificateProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.GatewayRouterProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.GitConfigProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ImagePullSecretProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.PodTerminationGracePeriodProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ServiceAccountProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.SshKeysProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisionerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.UniqueNamesProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.VcsSslCertificateProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.env.EnvVarsConverter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.limits.ram.ContainerResourceProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.restartpolicy.RestartPolicyRewriter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.server.ServersConverter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.PreviewUrlExposer;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.eclipse.che.workspace.infrastructure.openshift.provision.OpenShiftUniqueNamesProvisioner;\nimport org.eclipse.che.workspace.infrastructure.openshift.server.OpenShiftPreviewUrlExposer;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Applies the set of configurations to the OpenShift environment and environment configuration with\n * the desired order, which corresponds to the needs of the OpenShift infrastructure.\n *\n * @author Anton Korneta\n * @author Alexander Garagatyi\n */\n@Singleton\npublic class OpenShiftEnvironmentProvisioner\n    implements KubernetesEnvironmentProvisioner<OpenShiftEnvironment> {\n\n  private static final Logger LOG = LoggerFactory.getLogger(OpenShiftEnvironmentProvisioner.class);\n\n  private final UniqueNamesProvisioner<OpenShiftEnvironment> uniqueNamesProvisioner;\n  private final TlsProvisioner<OpenShiftEnvironment> routeTlsProvisioner;\n  private final ServersConverter<OpenShiftEnvironment> serversConverter;\n  private final EnvVarsConverter envVarsConverter;\n  private final RestartPolicyRewriter restartPolicyRewriter;\n  private final ContainerResourceProvisioner resourceLimitRequestProvisioner;\n  private final PodTerminationGracePeriodProvisioner podTerminationGracePeriodProvisioner;\n  private final ImagePullSecretProvisioner imagePullSecretProvisioner;\n  private final ServiceAccountProvisioner serviceAccountProvisioner;\n  private final CertificateProvisioner certificateProvisioner;\n  private final SshKeysProvisioner sshKeysProvisioner;\n  private final GitConfigProvisioner gitConfigProvisioner;\n  private final PreviewUrlExposer<OpenShiftEnvironment> previewUrlExposer;\n  private final VcsSslCertificateProvisioner vcsSslCertificateProvisioner;\n  private final GatewayRouterProvisioner gatewayRouterProvisioner;\n\n  @Inject\n  public OpenShiftEnvironmentProvisioner(\n      OpenShiftUniqueNamesProvisioner uniqueNamesProvisioner,\n      TlsProvisionerProvider<OpenShiftEnvironment> routeTlsProvisionerProvider,\n      ServersConverter<OpenShiftEnvironment> serversConverter,\n      EnvVarsConverter envVarsConverter,\n      RestartPolicyRewriter restartPolicyRewriter,\n      ContainerResourceProvisioner resourceLimitRequestProvisioner,\n      PodTerminationGracePeriodProvisioner podTerminationGracePeriodProvisioner,\n      ImagePullSecretProvisioner imagePullSecretProvisioner,\n      ServiceAccountProvisioner serviceAccountProvisioner,\n      CertificateProvisioner certificateProvisioner,\n      SshKeysProvisioner sshKeysProvisioner,\n      GitConfigProvisioner gitConfigProvisioner,\n      OpenShiftPreviewUrlExposer previewUrlEndpointsProvisioner,\n      VcsSslCertificateProvisioner vcsSslCertificateProvisioner,\n      GatewayRouterProvisioner gatewayRouterProvisioner) {\n    this.uniqueNamesProvisioner = uniqueNamesProvisioner;\n    this.routeTlsProvisioner = routeTlsProvisionerProvider.get();\n    this.serversConverter = serversConverter;\n    this.envVarsConverter = envVarsConverter;\n    this.restartPolicyRewriter = restartPolicyRewriter;\n    this.resourceLimitRequestProvisioner = resourceLimitRequestProvisioner;\n    this.podTerminationGracePeriodProvisioner = podTerminationGracePeriodProvisioner;\n    this.imagePullSecretProvisioner = imagePullSecretProvisioner;\n    this.serviceAccountProvisioner = serviceAccountProvisioner;\n    this.certificateProvisioner = certificateProvisioner;\n    this.sshKeysProvisioner = sshKeysProvisioner;\n    this.gitConfigProvisioner = gitConfigProvisioner;\n    this.previewUrlExposer = previewUrlEndpointsProvisioner;\n    this.vcsSslCertificateProvisioner = vcsSslCertificateProvisioner;\n    this.gatewayRouterProvisioner = gatewayRouterProvisioner;\n  }\n\n  @Override\n  @Traced\n  public void provision(OpenShiftEnvironment osEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n    TracingTags.WORKSPACE_ID.set(identity::getWorkspaceId);\n\n    LOG.debug(\n        \"Start provisioning OpenShift environment for workspace '{}'\", identity.getWorkspaceId());\n\n    // 1st stage - converting Che model env to OpenShift env\n    serversConverter.provision(osEnv, identity);\n    previewUrlExposer.expose(osEnv);\n    envVarsConverter.provision(osEnv, identity);\n\n    // 2nd stage - add OpenShift env items\n    restartPolicyRewriter.provision(osEnv, identity);\n    routeTlsProvisioner.provision(osEnv, identity);\n    resourceLimitRequestProvisioner.provision(osEnv, identity);\n    podTerminationGracePeriodProvisioner.provision(osEnv, identity);\n    imagePullSecretProvisioner.provision(osEnv, identity);\n    serviceAccountProvisioner.provision(osEnv, identity);\n    certificateProvisioner.provision(osEnv, identity);\n    sshKeysProvisioner.provision(osEnv, identity);\n    vcsSslCertificateProvisioner.provision(osEnv, identity);\n    gitConfigProvisioner.provision(osEnv, identity);\n    gatewayRouterProvisioner.provision(osEnv, identity);\n    uniqueNamesProvisioner.provision(osEnv, identity);\n    LOG.debug(\n        \"Provisioning OpenShift environment done for workspace '{}'\", identity.getWorkspaceId());\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/OpenShiftInfraModule.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift;\n\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.DOCKERIMAGE_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.OPENSHIFT_COMPONENT_TYPE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.SingleHostExternalServiceExposureStrategy.SINGLE_HOST_STRATEGY;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.TypeLiteral;\nimport com.google.inject.assistedinject.FactoryModuleBuilder;\nimport com.google.inject.multibindings.MapBinder;\nimport com.google.inject.multibindings.Multibinder;\nimport org.eclipse.che.api.system.server.ServiceTermination;\nimport org.eclipse.che.api.workspace.server.NoEnvironmentFactory;\nimport org.eclipse.che.api.workspace.server.WorkspaceAttributeValidator;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileBindings;\nimport org.eclipse.che.api.workspace.server.devfile.validator.ComponentIntegrityValidator.NoopComponentIntegrityValidator;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironmentFactory;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.CheApiExternalEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.CheApiInternalEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.wsplugins.ChePluginsApplier;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.K8sInfraNamespaceWsAttributeValidator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientTermination;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesEnvironmentProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.StartSynchronizerFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.server.KubernetesNamespaceService;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.PermissionsCleaner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.cache.jpa.JpaKubernetesRuntimeCacheModule;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.devfile.DockerimageComponentToWorkspaceApplier;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesComponentToWorkspaceApplier;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesComponentValidator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesDevfileBindings;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironmentFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.CredentialsSecretConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.GitconfigConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.NamespaceConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.OAuthTokenSecretsConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.PreferencesConfigMapConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.SshConfigConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.UserPermissionConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.UserPreferencesConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.UserProfileConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.GatewayTlsProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.KubernetesCheApiExternalEnvVarProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.KubernetesCheApiInternalEnvVarProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.PreviewUrlCommandProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.server.ServersConverter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.PreviewUrlExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.WorkspaceExposureType;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServiceExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.GatewayServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ServiceExposureStrategyProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.SingleHostExternalServiceExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.SecureServerExposerFactoryProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.CookiePathStrategy;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.NonTlsDistributedClusterModeNotifier;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.KubernetesPluginsToolingApplier;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.PluginBrokerManager;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.BrokerEnvironmentFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events.BrokerService;\nimport org.eclipse.che.workspace.infrastructure.openshift.devfile.OpenshiftComponentToWorkspaceApplier;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironmentFactory;\nimport org.eclipse.che.workspace.infrastructure.openshift.project.OpenShiftProjectFactory;\nimport org.eclipse.che.workspace.infrastructure.openshift.project.configurator.OpenShiftWorkspaceServiceAccountConfigurator;\nimport org.eclipse.che.workspace.infrastructure.openshift.provision.OpenShiftPreviewUrlCommandProvisioner;\nimport org.eclipse.che.workspace.infrastructure.openshift.provision.RouteTlsProvisioner;\nimport org.eclipse.che.workspace.infrastructure.openshift.server.OpenShiftCookiePathStrategy;\nimport org.eclipse.che.workspace.infrastructure.openshift.server.OpenShiftPreviewUrlExposer;\nimport org.eclipse.che.workspace.infrastructure.openshift.server.OpenShiftServerExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.openshift.server.RouteServerExposer;\nimport org.eclipse.che.workspace.infrastructure.openshift.server.external.OpenShiftExternalServerExposerProvider;\nimport org.eclipse.che.workspace.infrastructure.openshift.wsplugins.brokerphases.OpenshiftBrokerEnvironmentFactory;\n\n/**\n * @author Sergii Leshchenko\n */\npublic class OpenShiftInfraModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    Multibinder<WorkspaceAttributeValidator> workspaceAttributeValidators =\n        Multibinder.newSetBinder(binder(), WorkspaceAttributeValidator.class);\n    workspaceAttributeValidators.addBinding().to(K8sInfraNamespaceWsAttributeValidator.class);\n\n    Multibinder<NamespaceConfigurator> namespaceConfigurators =\n        Multibinder.newSetBinder(binder(), NamespaceConfigurator.class);\n    namespaceConfigurators.addBinding().to(UserPermissionConfigurator.class);\n    namespaceConfigurators.addBinding().to(UserProfileConfigurator.class);\n    namespaceConfigurators.addBinding().to(UserPreferencesConfigurator.class);\n    namespaceConfigurators.addBinding().to(CredentialsSecretConfigurator.class);\n    namespaceConfigurators.addBinding().to(OAuthTokenSecretsConfigurator.class);\n    namespaceConfigurators.addBinding().to(PreferencesConfigMapConfigurator.class);\n    namespaceConfigurators.addBinding().to(OpenShiftWorkspaceServiceAccountConfigurator.class);\n    namespaceConfigurators.addBinding().to(SshConfigConfigurator.class);\n    namespaceConfigurators.addBinding().to(GitconfigConfigurator.class);\n\n    bind(PermissionsCleaner.class).asEagerSingleton();\n\n    bind(KubernetesNamespaceService.class);\n\n    MapBinder<String, InternalEnvironmentFactory> factories =\n        MapBinder.newMapBinder(binder(), String.class, InternalEnvironmentFactory.class);\n\n    factories.addBinding(OpenShiftEnvironment.TYPE).to(OpenShiftEnvironmentFactory.class);\n    factories.addBinding(KubernetesEnvironment.TYPE).to(KubernetesEnvironmentFactory.class);\n    factories.addBinding(Constants.NO_ENVIRONMENT_RECIPE_TYPE).to(NoEnvironmentFactory.class);\n\n    String kubernetesNamespacesCreation =\n        System.getenv(\"CHE_INFRA_OPENSHIFT__KUBERNETES_NAMESPACES_CREATION\");\n    if (!\"true\".equalsIgnoreCase(kubernetesNamespacesCreation)) {\n      bind(KubernetesNamespaceFactory.class).to(OpenShiftProjectFactory.class);\n    }\n    bind(KubernetesClientFactory.class).to(OpenShiftClientFactory.class);\n    bind(CheServerOpenshiftClientFactory.class);\n\n    install(new FactoryModuleBuilder().build(StartSynchronizerFactory.class));\n\n    bind(CheApiInternalEnvVarProvider.class).to(KubernetesCheApiInternalEnvVarProvider.class);\n    bind(CheApiExternalEnvVarProvider.class).to(KubernetesCheApiExternalEnvVarProvider.class);\n\n    MapBinder<WorkspaceExposureType, ExternalServerExposer<OpenShiftEnvironment>>\n        exposureStrategies =\n            MapBinder.newMapBinder(binder(), new TypeLiteral<>() {}, new TypeLiteral<>() {});\n    exposureStrategies.addBinding(WorkspaceExposureType.NATIVE).to(RouteServerExposer.class);\n    exposureStrategies\n        .addBinding(WorkspaceExposureType.GATEWAY)\n        .to(new TypeLiteral<GatewayServerExposer<OpenShiftEnvironment>>() {});\n\n    bind(new TypeLiteral<ExternalServerExposer<OpenShiftEnvironment>>() {})\n        .annotatedWith(com.google.inject.name.Names.named(\"multihost-exposer\"))\n        .to(RouteServerExposer.class);\n\n    bind(new TypeLiteral<ExternalServerExposerProvider<OpenShiftEnvironment>>() {})\n        .to(OpenShiftExternalServerExposerProvider.class);\n\n    bind(ServersConverter.class).to(new TypeLiteral<ServersConverter<OpenShiftEnvironment>>() {});\n    bind(PreviewUrlExposer.class).to(new TypeLiteral<OpenShiftPreviewUrlExposer>() {});\n    bind(PreviewUrlCommandProvisioner.class)\n        .to(new TypeLiteral<OpenShiftPreviewUrlCommandProvisioner>() {});\n\n    install(new JpaKubernetesRuntimeCacheModule());\n\n    Multibinder.newSetBinder(binder(), ServiceTermination.class)\n        .addBinding()\n        .to(KubernetesClientTermination.class);\n\n    MapBinder<String, ChePluginsApplier> pluginsAppliers =\n        MapBinder.newMapBinder(binder(), String.class, ChePluginsApplier.class);\n    pluginsAppliers.addBinding(OpenShiftEnvironment.TYPE).to(KubernetesPluginsToolingApplier.class);\n\n    bind(SecureServerExposerFactoryProvider.class)\n        .to(new TypeLiteral<SecureServerExposerFactoryProvider<OpenShiftEnvironment>>() {});\n\n    bind(BrokerService.class);\n\n    bind(new TypeLiteral<BrokerEnvironmentFactory<OpenShiftEnvironment>>() {})\n        .to(OpenshiftBrokerEnvironmentFactory.class);\n\n    bind(PluginBrokerManager.class)\n        .to(new TypeLiteral<PluginBrokerManager<OpenShiftEnvironment>>() {});\n\n    MapBinder<WorkspaceExposureType, TlsProvisioner<OpenShiftEnvironment>> tlsProvisioners =\n        MapBinder.newMapBinder(\n            binder(),\n            new TypeLiteral<WorkspaceExposureType>() {},\n            new TypeLiteral<TlsProvisioner<OpenShiftEnvironment>>() {});\n    tlsProvisioners\n        .addBinding(WorkspaceExposureType.GATEWAY)\n        .to(new TypeLiteral<GatewayTlsProvisioner<OpenShiftEnvironment>>() {});\n    tlsProvisioners.addBinding(WorkspaceExposureType.NATIVE).to(RouteTlsProvisioner.class);\n\n    bind(new TypeLiteral<KubernetesEnvironmentProvisioner<OpenShiftEnvironment>>() {})\n        .to(OpenShiftEnvironmentProvisioner.class);\n\n    DevfileBindings.onComponentIntegrityValidatorBinder(\n        binder(),\n        binder -> {\n          binder.addBinding(KUBERNETES_COMPONENT_TYPE).to(KubernetesComponentValidator.class);\n          binder.addBinding(OPENSHIFT_COMPONENT_TYPE).to(KubernetesComponentValidator.class);\n          binder.addBinding(DOCKERIMAGE_COMPONENT_TYPE).to(NoopComponentIntegrityValidator.class);\n        });\n\n    DevfileBindings.onWorkspaceApplierBinder(\n        binder(),\n        binder -> {\n          binder\n              .addBinding(KUBERNETES_COMPONENT_TYPE)\n              .to(KubernetesComponentToWorkspaceApplier.class);\n          binder\n              .addBinding(DOCKERIMAGE_COMPONENT_TYPE)\n              .to(DockerimageComponentToWorkspaceApplier.class);\n          binder\n              .addBinding(OPENSHIFT_COMPONENT_TYPE)\n              .to(OpenshiftComponentToWorkspaceApplier.class);\n        });\n\n    KubernetesDevfileBindings.addKubernetesBasedEnvironmentTypeBindings(\n        binder(), KubernetesEnvironment.TYPE, OpenShiftEnvironment.TYPE);\n\n    KubernetesDevfileBindings.addKubernetesBasedComponentTypeBindings(\n        binder(), KUBERNETES_COMPONENT_TYPE, OPENSHIFT_COMPONENT_TYPE);\n\n    KubernetesDevfileBindings.addAllowedEnvironmentTypeUpgradeBindings(\n        binder(), OpenShiftEnvironment.TYPE, KubernetesEnvironment.TYPE);\n\n    MapBinder<String, ExternalServiceExposureStrategy> ingressStrategies =\n        MapBinder.newMapBinder(binder(), String.class, ExternalServiceExposureStrategy.class);\n    ingressStrategies.addBinding(MULTI_HOST_STRATEGY).to(OpenShiftServerExposureStrategy.class);\n    ingressStrategies\n        .addBinding(SINGLE_HOST_STRATEGY)\n        .to(SingleHostExternalServiceExposureStrategy.class);\n    bind(ExternalServiceExposureStrategy.class).toProvider(ServiceExposureStrategyProvider.class);\n    bind(CookiePathStrategy.class).to(OpenShiftCookiePathStrategy.class);\n    bind(NonTlsDistributedClusterModeNotifier.class);\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/OpenShiftInfrastructure.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift;\n\nimport javax.inject.Singleton;\n\n/**\n * @author Sergii Leshchenko\n */\n@Singleton\npublic class OpenShiftInfrastructure {\n  public static final String NAME = \"openshift\";\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/authorization/OpenShiftAuthorizationCheckerImpl.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.authorization;\n\nimport static org.eclipse.che.commons.lang.StringUtils.strToSet;\n\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.openshift.api.model.Group;\nimport java.util.List;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.AuthorizationChecker;\n\n/** This {@link OpenShiftAuthorizationCheckerImpl} checks if user is allowed to use Che. */\n@Singleton\npublic class OpenShiftAuthorizationCheckerImpl implements AuthorizationChecker {\n\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n\n  private final Set<String> allowUsers;\n  private final Set<String> allowGroups;\n  private final Set<String> denyUsers;\n  private final Set<String> denyGroups;\n\n  @Inject\n  public OpenShiftAuthorizationCheckerImpl(\n      @Nullable @Named(\"che.infra.kubernetes.advanced_authorization.allow_users\") String allowUsers,\n      @Nullable @Named(\"che.infra.kubernetes.advanced_authorization.allow_groups\")\n          String allowGroups,\n      @Nullable @Named(\"che.infra.kubernetes.advanced_authorization.deny_users\") String denyUsers,\n      @Nullable @Named(\"che.infra.kubernetes.advanced_authorization.deny_groups\") String denyGroups,\n      @Named(\"che.infra.kubernetes.advanced_authorization.delimiter\") String delimiter,\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory) {\n    this.allowUsers = strToSet(allowUsers, delimiter);\n    this.allowGroups = strToSet(allowGroups, delimiter);\n    this.denyUsers = strToSet(denyUsers, delimiter);\n    this.denyGroups = strToSet(denyGroups, delimiter);\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n  }\n\n  public boolean isAuthorized(Subject subject) throws InfrastructureException {\n    String username = subject.getUserName();\n    return isAllowedUser(cheServerKubernetesClientFactory.create(), username)\n        && !isDeniedUser(cheServerKubernetesClientFactory.create(), username);\n  }\n\n  private boolean isAllowedUser(KubernetesClient client, String username) {\n    // All users from all groups are allowed by default\n    if (allowUsers.isEmpty() && allowGroups.isEmpty()) {\n      return true;\n    }\n\n    if (allowUsers.contains(username)) {\n      return true;\n    }\n\n    for (String groupName : allowGroups) {\n      Group group = client.resources(Group.class).withName(groupName).get();\n      if (group != null) {\n        List<String> users = group.getUsers();\n        if (users != null && users.contains(username)) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  private boolean isDeniedUser(KubernetesClient client, String username) {\n    // All users from all groups are allowed by default\n    if (denyUsers.isEmpty() && denyGroups.isEmpty()) {\n      return false;\n    }\n\n    if (denyUsers.contains(username)) {\n      return true;\n    }\n\n    for (String groupName : denyGroups) {\n      Group group = client.resources(Group.class).withName(groupName).get();\n      if (group != null) {\n        List<String> users = group.getUsers();\n        if (users != null && users.contains(username)) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/devfile/OpenshiftComponentToWorkspaceApplier.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.devfile;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesDevfileBindings.KUBERNETES_BASED_COMPONENTS_KEY_NAME;\n\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesComponentToWorkspaceApplier;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesEnvironmentProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.EnvVars;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\n\npublic class OpenshiftComponentToWorkspaceApplier extends KubernetesComponentToWorkspaceApplier {\n  @Inject\n  public OpenshiftComponentToWorkspaceApplier(\n      KubernetesRecipeParser objectsParser,\n      KubernetesEnvironmentProvisioner k8sEnvProvisioner,\n      EnvVars envVars,\n      @Named(\"che.infra.kubernetes.singlehost.workspace.devfile_endpoint_exposure\")\n          String devfileEndpointsExposure,\n      @Named(KUBERNETES_BASED_COMPONENTS_KEY_NAME) Set<String> kubernetesBasedComponentTypes) {\n    super(\n        objectsParser,\n        k8sEnvProvisioner,\n        envVars,\n        OpenShiftEnvironment.TYPE,\n        devfileEndpointsExposure,\n        kubernetesBasedComponentTypes);\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/environment/OpenShiftEnvironment.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.environment;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaim;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.networking.v1.Ingress;\nimport io.fabric8.openshift.api.model.Route;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironment;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalRecipe;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\n\n/**\n * Holds objects of OpenShift environment.\n *\n * @author Sergii Leshchenko\n */\npublic class OpenShiftEnvironment extends KubernetesEnvironment {\n\n  public static final String TYPE = \"openshift\";\n\n  private final Map<String, Route> routes;\n\n  /** Returns builder for creating environment from blank {@link KubernetesEnvironment}. */\n  public static Builder builder() {\n    return new Builder();\n  }\n\n  /**\n   * Returns builder for creating environment based on specified {@link InternalEnvironment}.\n   *\n   * <p>It means that {@link InternalEnvironment} specific fields like machines, warnings will be\n   * preconfigured in Builder.\n   */\n  public static Builder builder(InternalEnvironment internalEnvironment) {\n    return new Builder(internalEnvironment);\n  }\n\n  public OpenShiftEnvironment(KubernetesEnvironment k8sEnv) {\n    super(k8sEnv);\n    setType(TYPE);\n    this.routes = new HashMap<>();\n  }\n\n  public OpenShiftEnvironment(\n      InternalEnvironment internalEnvironment,\n      Map<String, Pod> pods,\n      Map<String, Deployment> deployments,\n      Map<String, Service> services,\n      Map<String, Ingress> ingresses,\n      Map<String, PersistentVolumeClaim> pvcs,\n      Map<String, Secret> secrets,\n      Map<String, ConfigMap> configMaps,\n      Map<String, Route> routes) {\n    super(internalEnvironment, pods, deployments, services, ingresses, pvcs, secrets, configMaps);\n    setType(TYPE);\n    this.routes = routes;\n  }\n\n  public OpenShiftEnvironment(\n      InternalRecipe internalRecipe,\n      Map<String, InternalMachineConfig> machines,\n      List<Warning> warnings,\n      Map<String, Pod> pods,\n      Map<String, Deployment> deployments,\n      Map<String, Service> services,\n      Map<String, Ingress> ingresses,\n      Map<String, PersistentVolumeClaim> pvcs,\n      Map<String, Secret> secrets,\n      Map<String, ConfigMap> configMaps,\n      Map<String, Route> routes) {\n    super(\n        internalRecipe,\n        machines,\n        warnings,\n        pods,\n        deployments,\n        services,\n        ingresses,\n        pvcs,\n        secrets,\n        configMaps);\n    setType(TYPE);\n    this.routes = routes;\n  }\n\n  @Override\n  public OpenShiftEnvironment setType(String type) {\n    return (OpenShiftEnvironment) super.setType(type);\n  }\n\n  /** Returns services that should be created when environment starts. */\n  public Map<String, Route> getRoutes() {\n    return routes;\n  }\n\n  public static class Builder extends KubernetesEnvironment.Builder {\n    private final Map<String, Route> routes = new HashMap<>();\n\n    private Builder() {}\n\n    private Builder(InternalEnvironment internalEnvironment) {\n      super(internalEnvironment);\n    }\n\n    @Override\n    public Builder setInternalRecipe(InternalRecipe internalRecipe) {\n      super.setInternalRecipe(internalRecipe);\n      return this;\n    }\n\n    @Override\n    public Builder setMachines(Map<String, InternalMachineConfig> machines) {\n      super.setMachines(machines);\n      return this;\n    }\n\n    @Override\n    public Builder setWarnings(List<Warning> warnings) {\n      super.setWarnings(warnings);\n      return this;\n    }\n\n    @Override\n    public Builder setCommands(List<? extends Command> commands) {\n      super.setCommands(new ArrayList<>(commands));\n      return this;\n    }\n\n    @Override\n    public Builder setPods(Map<String, Pod> pods) {\n      this.pods.putAll(pods);\n      return this;\n    }\n\n    @Override\n    public Builder setDeployments(Map<String, Deployment> deployments) {\n      this.deployments.putAll(deployments);\n      return this;\n    }\n\n    @Override\n    public Builder setServices(Map<String, Service> services) {\n      this.services.putAll(services);\n      return this;\n    }\n\n    @Override\n    public Builder setIngresses(Map<String, Ingress> ingresses) {\n      this.ingresses.putAll(ingresses);\n      return this;\n    }\n\n    @Override\n    public Builder setPersistentVolumeClaims(Map<String, PersistentVolumeClaim> pvcs) {\n      this.pvcs.putAll(pvcs);\n      return this;\n    }\n\n    @Override\n    public Builder setSecrets(Map<String, Secret> secrets) {\n      this.secrets.putAll(secrets);\n      return this;\n    }\n\n    @Override\n    public Builder setConfigMaps(Map<String, ConfigMap> configMaps) {\n      this.configMaps.putAll(configMaps);\n      return this;\n    }\n\n    @Override\n    public Builder setAttributes(Map<String, String> attributes) {\n      this.attributes.putAll(attributes);\n      return this;\n    }\n\n    public Builder setRoutes(Map<String, Route> route) {\n      this.routes.putAll(route);\n      return this;\n    }\n\n    public OpenShiftEnvironment build() {\n      return new OpenShiftEnvironment(\n          internalEnvironment,\n          pods,\n          deployments,\n          services,\n          ingresses,\n          pvcs,\n          secrets,\n          configMaps,\n          routes);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/environment/OpenShiftEnvironmentFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.environment;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.environment.PodMerger.DEPLOYMENT_NAME_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putLabel;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.setSelector;\n\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaim;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.openshift.api.model.DeploymentConfig;\nimport io.fabric8.openshift.api.model.Route;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironment;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironmentFactory;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalRecipe;\nimport org.eclipse.che.api.workspace.server.spi.environment.MachineConfigsValidator;\nimport org.eclipse.che.api.workspace.server.spi.environment.RecipeRetriever;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.PodMerger;\n\n/**\n * Parses {@link InternalEnvironment} into {@link OpenShiftEnvironment}.\n *\n * @author Sergii Leshchenko\n */\npublic class OpenShiftEnvironmentFactory extends InternalEnvironmentFactory<OpenShiftEnvironment> {\n\n  private final OpenShiftEnvironmentValidator envValidator;\n  private final KubernetesRecipeParser k8sObjectsParser;\n  private final PodMerger podMerger;\n\n  @Inject\n  public OpenShiftEnvironmentFactory(\n      RecipeRetriever recipeRetriever,\n      MachineConfigsValidator machinesValidator,\n      OpenShiftEnvironmentValidator envValidator,\n      KubernetesRecipeParser k8sObjectsParser,\n      PodMerger podMerger) {\n    super(recipeRetriever, machinesValidator);\n    this.envValidator = envValidator;\n    this.k8sObjectsParser = k8sObjectsParser;\n    this.podMerger = podMerger;\n  }\n\n  @Override\n  protected OpenShiftEnvironment doCreate(\n      @Nullable InternalRecipe recipe,\n      Map<String, InternalMachineConfig> machines,\n      List<Warning> sourceWarnings)\n      throws InfrastructureException, ValidationException {\n    checkNotNull(recipe, \"Null recipe is not supported by openshift environment factory\");\n    List<Warning> warnings = new ArrayList<>();\n    if (sourceWarnings != null) {\n      warnings.addAll(sourceWarnings);\n    }\n\n    final List<HasMetadata> list = k8sObjectsParser.parse(recipe);\n\n    Map<String, Pod> pods = new HashMap<>();\n    Map<String, Deployment> deployments = new HashMap<>();\n    Map<String, Service> services = new HashMap<>();\n    Map<String, ConfigMap> configMaps = new HashMap<>();\n    Map<String, PersistentVolumeClaim> pvcs = new HashMap<>();\n    Map<String, Route> routes = new HashMap<>();\n    Map<String, Secret> secrets = new HashMap<>();\n    for (HasMetadata object : list) {\n      checkNotNull(object.getKind(), \"Environment contains object without specified kind field\");\n      checkNotNull(object.getMetadata(), \"%s metadata must not be null\", object.getKind());\n      checkNotNull(object.getMetadata().getName(), \"%s name must not be null\", object.getKind());\n\n      if (object instanceof DeploymentConfig) {\n        throw new ValidationException(\"Supporting of deployment configs is not implemented yet.\");\n      } else if (object instanceof Pod) {\n        putInto(pods, object.getMetadata().getName(), (Pod) object);\n      } else if (object instanceof Deployment) {\n        putInto(deployments, object.getMetadata().getName(), (Deployment) object);\n      } else if (object instanceof Service) {\n        putInto(services, object.getMetadata().getName(), (Service) object);\n      } else if (object instanceof Route) {\n        putInto(routes, object.getMetadata().getName(), (Route) object);\n      } else if (object instanceof PersistentVolumeClaim) {\n        putInto(pvcs, object.getMetadata().getName(), (PersistentVolumeClaim) object);\n      } else if (object instanceof Secret) {\n        putInto(secrets, object.getMetadata().getName(), (Secret) object);\n      } else if (object instanceof ConfigMap) {\n        putInto(configMaps, object.getMetadata().getName(), (ConfigMap) object);\n      } else {\n        throw new ValidationException(\n            format(\n                \"Found unknown object type in recipe -- name: '%s', kind: '%s'\",\n                object.getMetadata().getName(), object.getKind()));\n      }\n    }\n\n    if (deployments.size() + pods.size() > 1) {\n      mergePods(pods, deployments, services);\n    }\n\n    OpenShiftEnvironment osEnv =\n        OpenShiftEnvironment.builder()\n            .setInternalRecipe(recipe)\n            .setMachines(machines)\n            .setWarnings(warnings)\n            .setPods(pods)\n            .setDeployments(deployments)\n            .setServices(services)\n            .setPersistentVolumeClaims(pvcs)\n            .setSecrets(secrets)\n            .setConfigMaps(configMaps)\n            .setRoutes(routes)\n            .build();\n\n    envValidator.validate(osEnv);\n\n    return osEnv;\n  }\n\n  /**\n   * Merges the specified pods and deployments to a single Deployment.\n   *\n   * <p>Note that method will modify the specified collections and put work result there.\n   *\n   * @param pods pods to merge\n   * @param deployments deployments to merge\n   * @param services services to reconfigure to point new deployment\n   * @throws ValidationException if the specified lists has pods with conflicting configuration\n   */\n  private void mergePods(\n      Map<String, Pod> pods, Map<String, Deployment> deployments, Map<String, Service> services)\n      throws ValidationException {\n    List<PodData> podsData =\n        Stream.concat(\n                pods.values().stream().map(PodData::new),\n                deployments.values().stream().map(PodData::new))\n            .collect(Collectors.toList());\n\n    Deployment deployment = podMerger.merge(podsData);\n    String deploymentName = deployment.getMetadata().getName();\n\n    // provision merged deployment instead of recipe pods/deployments\n    pods.clear();\n    deployments.clear();\n    deployments.put(deploymentName, deployment);\n\n    // multiple pods/deployments are merged to one deployment\n    // to avoid issues because of overriding labels\n    // provision const label and selector to match all services to merged Deployment\n    putLabel(\n        deployment.getSpec().getTemplate().getMetadata(), DEPLOYMENT_NAME_LABEL, deploymentName);\n    services.values().forEach(s -> setSelector(s, DEPLOYMENT_NAME_LABEL, deploymentName));\n  }\n\n  /**\n   * Puts the specified key/value pair into the specified map or throw an exception if map already\n   * contains such key.\n   *\n   * @param map the map to put key/value pair\n   * @param key key that should be put\n   * @param value value that should be put\n   * @param <T> type of object to put\n   * @throws ValidationException if the specified map already contains the specified key\n   */\n  private <T extends HasMetadata> void putInto(Map<String, T> map, String key, T value)\n      throws ValidationException {\n    if (map.put(key, value) != null) {\n      String kind = value.getKind();\n      String name = value.getMetadata().getName();\n      throw new ValidationException(\n          format(\n              \"Environment can not contain two '%s' objects with the same name '%s'\", kind, name));\n    }\n  }\n\n  private void checkNotNull(Object object, String errorMessage) throws ValidationException {\n    if (object == null) {\n      throw new ValidationException(errorMessage);\n    }\n  }\n\n  private void checkNotNull(Object object, String messageFmt, Object... messageArguments)\n      throws ValidationException {\n    if (object == null) {\n      throw new ValidationException(format(messageFmt, messageArguments));\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/environment/OpenShiftEnvironmentValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.environment;\n\nimport io.fabric8.openshift.api.model.Route;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironmentPodsValidator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironmentValidator;\n\n/**\n * Adds additional OpenShift-specific validation to {@link KubernetesEnvironmentValidator}\n *\n * @author Angel Misevski\n */\npublic class OpenShiftEnvironmentValidator extends KubernetesEnvironmentValidator {\n\n  private static final String SERVICE_KIND = \"Service\";\n\n  @Inject\n  public OpenShiftEnvironmentValidator(KubernetesEnvironmentPodsValidator podsValidator) {\n    super(podsValidator);\n  }\n\n  public void validate(OpenShiftEnvironment env) throws ValidationException {\n    super.validate(env);\n    validateRoutesMatchServices(env);\n  }\n\n  private void validateRoutesMatchServices(OpenShiftEnvironment env) throws ValidationException {\n    Set<String> recipeServices =\n        env.getServices().values().stream()\n            .map(s -> s.getMetadata().getName())\n            .collect(Collectors.toSet());\n    for (Route route : env.getRoutes().values()) {\n      if (route.getSpec() == null\n          || route.getSpec().getTo() == null\n          || !route.getSpec().getTo().getKind().equals(SERVICE_KIND)) {\n        continue;\n      }\n      String serviceName = route.getSpec().getTo().getName();\n      if (!recipeServices.contains(serviceName)) {\n        throw new ValidationException(\n            String.format(\n                \"Route '%s' refers to Service '%s'. Routes must refer to Services included in recipe\",\n                route.getMetadata().getName(), serviceName));\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/multiuser/oauth/OpenshiftTokenInitializationFilter.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.multiuser.oauth;\n\nimport static com.google.common.base.MoreObjects.firstNonNull;\n\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.openshift.client.OpenShiftClient;\nimport java.util.Collections;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.user.server.UserManager;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.multiuser.api.authentication.commons.SessionStore;\nimport org.eclipse.che.multiuser.api.authentication.commons.filter.MultiUserEnvironmentInitializationFilter;\nimport org.eclipse.che.multiuser.api.authentication.commons.token.RequestTokenExtractor;\nimport org.eclipse.che.multiuser.api.permission.server.AuthorizedSubject;\nimport org.eclipse.che.multiuser.api.permission.server.PermissionChecker;\nimport org.eclipse.che.workspace.infrastructure.openshift.OpenShiftClientFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * This filter uses given token directly. It's used for native OpenShift user authentication.\n * Requests without token or with invalid token are rejected.\n */\n@Singleton\npublic class OpenshiftTokenInitializationFilter\n    extends MultiUserEnvironmentInitializationFilter<io.fabric8.openshift.api.model.User> {\n\n  private static final Logger LOG =\n      LoggerFactory.getLogger(OpenshiftTokenInitializationFilter.class);\n\n  private final PermissionChecker permissionChecker;\n  private final OpenShiftClientFactory clientFactory;\n\n  private final UserManager userManager;\n\n  @Inject\n  public OpenshiftTokenInitializationFilter(\n      SessionStore sessionStore,\n      RequestTokenExtractor tokenExtractor,\n      OpenShiftClientFactory clientFactory,\n      UserManager userManager,\n      PermissionChecker permissionChecker) {\n    super(sessionStore, tokenExtractor);\n    this.clientFactory = clientFactory;\n    this.userManager = userManager;\n    this.permissionChecker = permissionChecker;\n  }\n\n  @Override\n  protected Optional<io.fabric8.openshift.api.model.User> processToken(String token) {\n    // We're effectively creating new client for each request. It might be a good idea to somehow\n    // cache the client or user object. However, it may require non-trivial refactoring which may\n    // be unnecessary. Keeping it as is for now to avoid premature optimization.\n    try {\n      OpenShiftClient client = clientFactory.createAuthenticatedClient(token);\n      return Optional.ofNullable(client.currentUser());\n    } catch (KubernetesClientException e) {\n      if (e.getCode() == 401) {\n        LOG.error(\n            \"Unauthorized when getting current user. Invalid OpenShift token, probably expired. Re-login? Re-request the token?\");\n        return Optional.empty();\n      }\n\n      throw e;\n    }\n  }\n\n  @Override\n  protected String getUserId(io.fabric8.openshift.api.model.User user) {\n    return firstNonNull(user.getMetadata().getUid(), user.getMetadata().getName());\n  }\n\n  @Override\n  protected Subject extractSubject(String token, io.fabric8.openshift.api.model.User osu) {\n    try {\n      ObjectMeta userMeta = osu.getMetadata();\n      User user = userManager.getOrCreateUser(getUserId(osu), userMeta.getName());\n      return new AuthorizedSubject(\n          new SubjectImpl(user.getName(), Collections.emptyList(), user.getId(), token, false),\n          permissionChecker);\n    } catch (ServerException | ConflictException e) {\n      throw new RuntimeException(e);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/project/OpenShiftProject.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.project;\n\nimport static java.lang.String.format;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.openshift.api.model.Project;\nimport io.fabric8.openshift.api.model.ProjectRequestBuilder;\nimport io.fabric8.openshift.api.model.Route;\nimport io.fabric8.openshift.client.OpenShiftClient;\nimport java.util.Map;\nimport java.util.concurrent.Executor;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesConfigsMaps;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesDeployments;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesIngresses;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesPersistentVolumeClaims;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesSecrets;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesServices;\nimport org.eclipse.che.workspace.infrastructure.openshift.CheServerOpenshiftClientFactory;\nimport org.eclipse.che.workspace.infrastructure.openshift.OpenShiftClientFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Defines an internal API for managing subset of objects inside {@link Project} instance.\n *\n * @author Sergii Leshchenko\n */\npublic class OpenShiftProject extends KubernetesNamespace {\n\n  private static final Logger LOG = LoggerFactory.getLogger(OpenShiftProject.class);\n\n  private final OpenShiftRoutes routes;\n  private final OpenShiftClientFactory openShiftClientFactory;\n  private final CheServerOpenshiftClientFactory cheServerOpenshiftClientFactory;\n\n  @VisibleForTesting\n  OpenShiftProject(\n      OpenShiftClientFactory openShiftClientFactory,\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory,\n      CheServerOpenshiftClientFactory cheServerOpenshiftClientFactory,\n      String workspaceId,\n      String name,\n      KubernetesDeployments deployments,\n      KubernetesServices services,\n      OpenShiftRoutes routes,\n      KubernetesPersistentVolumeClaims pvcs,\n      KubernetesIngresses ingresses,\n      KubernetesSecrets secrets,\n      KubernetesConfigsMaps configMaps) {\n    super(\n        cheServerKubernetesClientFactory,\n        workspaceId,\n        name,\n        deployments,\n        services,\n        pvcs,\n        ingresses,\n        secrets,\n        configMaps);\n    this.routes = routes;\n    this.openShiftClientFactory = openShiftClientFactory;\n    this.cheServerOpenshiftClientFactory = cheServerOpenshiftClientFactory;\n  }\n\n  public OpenShiftProject(\n      OpenShiftClientFactory openShiftClientFactory,\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory,\n      CheServerOpenshiftClientFactory cheServerOpenshiftClientFactory,\n      Executor executor,\n      String name,\n      String workspaceId) {\n    super(cheServerKubernetesClientFactory, executor, name, workspaceId);\n    this.routes = new OpenShiftRoutes(name, workspaceId, cheServerOpenshiftClientFactory);\n    this.openShiftClientFactory = openShiftClientFactory;\n    this.cheServerOpenshiftClientFactory = cheServerOpenshiftClientFactory;\n  }\n\n  /**\n   * Prepare a project for using.\n   *\n   * <p>Preparing includes creating if needed and waiting for default service account.\n   *\n   * @param canCreate defines what to do when the project is not found. The project is created when\n   *     {@code true}, otherwise an exception is thrown.\n   * @param initWithCheServerSa defines condition whether the project should be created with Che\n   *     Server SA.\n   * @throws InfrastructureException if any exception occurs during project preparation or if the\n   *     project doesn't exist and {@code canCreate} is {@code false}.\n   */\n  void prepare(\n      boolean canCreate,\n      boolean initWithCheServerSa,\n      Map<String, String> labels,\n      Map<String, String> annotations)\n      throws InfrastructureException {\n    String workspaceId = getWorkspaceId();\n    String projectName = getName();\n\n    OpenShiftClient osClient = cheServerOpenshiftClientFactory.createOC();\n    Project project = get(projectName, osClient);\n\n    if (project == null) {\n      if (!canCreate) {\n        throw new InfrastructureException(\n            format(\n                \"Creating the namespace '%s' is not allowed, yet\" + \" it was not found.\",\n                projectName));\n      }\n\n      if (initWithCheServerSa) {\n        create(projectName, osClient);\n        waitDefaultServiceAccount(projectName, osClient);\n      } else {\n        create(projectName, openShiftClientFactory.createOC(workspaceId));\n        waitDefaultServiceAccount(projectName, openShiftClientFactory.create(workspaceId));\n      }\n    }\n    label(osClient.namespaces().withName(projectName).get(), labels);\n    annotate(osClient.namespaces().withName(projectName).get(), annotations);\n  }\n\n  /**\n   * Deletes the project. Deleting a non-existent projects is not an error as is not an attempt to\n   * delete a project that is already being deleted.\n   *\n   * @throws InfrastructureException if any unexpected exception occurs during project deletion\n   */\n  void delete() throws InfrastructureException {\n    String workspaceId = getWorkspaceId();\n    String projectName = getName();\n\n    OpenShiftClient osClient = cheServerOpenshiftClientFactory.createOC(workspaceId);\n\n    try {\n      delete(projectName, osClient);\n    } catch (KubernetesClientException e) {\n      if (e.getCode() == 403) {\n        throw new InfrastructureException(\n            format(\n                \"Could not access the project %s when deleting it for workspace %s\",\n                projectName, workspaceId),\n            e);\n      }\n\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /** Returns object for managing {@link Route} instances inside project. */\n  public OpenShiftRoutes routes() {\n    return routes;\n  }\n\n  /** Removes all object except persistent volume claims inside project. */\n  public void cleanUp() throws InfrastructureException {\n    doRemove(\n        routes::delete,\n        services()::delete,\n        deployments()::delete,\n        secrets()::delete,\n        configMaps()::delete);\n  }\n\n  private void create(String projectName, OpenShiftClient osClient) throws InfrastructureException {\n    try {\n      osClient\n          .projectrequests()\n          .create(\n              new ProjectRequestBuilder()\n                  .withNewMetadata()\n                  .withName(projectName)\n                  .endMetadata()\n                  .build());\n    } catch (KubernetesClientException e) {\n      if (e.getCode() == 403) {\n        LOG.error(\n            \"Unable to create new OpenShift project due to lack of permissions.\"\n                + \"HINT: When using workspace project name placeholders, os-oauth or service account with more lenient permissions (cluster-admin) must be used.\");\n      }\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  private void update(Project project, OpenShiftClient client) throws InfrastructureException {\n    try {\n      client.projects().createOrReplace(project);\n    } catch (KubernetesClientException e) {\n      if (e.getCode() == 403) {\n        LOG.error(\n            \"Unable to update new Kubernetes project due to lack of permissions.\"\n                + \"When using workspace namespace placeholders, service account with lenient permissions (cluster-admin) must be used.\");\n      }\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  private void delete(String projectName, OpenShiftClient osClient) throws InfrastructureException {\n    try {\n      osClient.projects().withName(projectName).delete();\n    } catch (KubernetesClientException e) {\n      if (e.getCode() == 404) {\n        LOG.warn(\n            format(\n                \"Tried to delete project '%s' but it doesn't exist in the cluster.\", projectName),\n            e);\n      } else if (e.getCode() == 409) {\n        LOG.info(format(\"The project '%s' is currently being deleted.\", projectName), e);\n      } else {\n        throw new KubernetesInfrastructureException(e);\n      }\n    }\n  }\n\n  private Project get(String projectName, OpenShiftClient client) throws InfrastructureException {\n    try {\n      return client.projects().withName(projectName).get();\n    } catch (KubernetesClientException e) {\n      if (e.getCode() == 403) {\n        // project is foreign or doesn't exist\n        LOG.warn(\n            \"Trying to get namespace '{}', but failed because the lack of permissions.\",\n            projectName);\n        return null;\n      } else {\n        throw new KubernetesInfrastructureException(e);\n      }\n    }\n  }\n\n  private boolean isProjectManaged(OpenShiftClient client) throws InfrastructureException {\n    try {\n      Project namespace = client.projects().withName(getName()).get();\n      return namespace.getMetadata().getLabels() != null\n          && \"true\".equals(namespace.getMetadata().getLabels().get(MANAGED_NAMESPACE_LABEL));\n    } catch (KubernetesClientException e) {\n      if (e.getCode() == 403) {\n        throw new InfrastructureException(\n            format(\n                \"Could not access the project %s when trying to determine if it is managed \"\n                    + \"for workspace %s\",\n                getName(), getWorkspaceId()),\n            e);\n      } else if (e.getCode() == 404) {\n        // we don't want to block whatever work the caller is doing on the namespace. The caller\n        // will fail anyway if the project doesn't exist.\n        return true;\n      }\n\n      throw new InternalInfrastructureException(\n          format(\n              \"Failed to determine whether the project\"\n                  + \" %s is managed. OpenShift client said: %s\",\n              getName(), e.getMessage()),\n          e);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/project/OpenShiftProjectFactory.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.project;\n\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.emptyMap;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta.PHASE_ATTRIBUTE;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.openshift.api.model.Project;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.Workspace;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.user.server.PreferenceManager;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.server.impls.KubernetesNamespaceMetaImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.AuthorizationChecker;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.PermissionsCleaner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.NamespaceConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.KubernetesSharedPool;\nimport org.eclipse.che.workspace.infrastructure.openshift.CheServerOpenshiftClientFactory;\nimport org.eclipse.che.workspace.infrastructure.openshift.Constants;\nimport org.eclipse.che.workspace.infrastructure.openshift.OpenShiftClientFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Helps to create {@link OpenShiftProject} instances.\n *\n * @author Anton Korneta\n */\n@Singleton\npublic class OpenShiftProjectFactory extends KubernetesNamespaceFactory {\n  private static final Logger LOG = LoggerFactory.getLogger(OpenShiftProjectFactory.class);\n\n  private final boolean initWithCheServerSa;\n  private final OpenShiftClientFactory openShiftClientFactory;\n  private final CheServerOpenshiftClientFactory cheServerOpenshiftClientFactory;\n\n  private final CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n\n  @Inject\n  public OpenShiftProjectFactory(\n      @Nullable @Named(\"che.infra.kubernetes.namespace.default\") String defaultNamespaceName,\n      @Named(\"che.infra.kubernetes.namespace.creation_allowed\") boolean namespaceCreationAllowed,\n      @Named(\"che.infra.kubernetes.namespace.label\") boolean labelProjects,\n      @Named(\"che.infra.kubernetes.namespace.annotate\") boolean annotateProjects,\n      @Named(\"che.infra.kubernetes.namespace.labels\") String projectLabels,\n      @Named(\"che.infra.kubernetes.namespace.annotations\") String projectAnnotations,\n      @Named(\"che.infra.openshift.project.init_with_server_sa\") boolean initWithCheServerSa,\n      Set<NamespaceConfigurator> namespaceConfigurators,\n      OpenShiftClientFactory openShiftClientFactory,\n      CheServerKubernetesClientFactory cheServerKubernetesClientFactory,\n      CheServerOpenshiftClientFactory cheServerOpenshiftClientFactory,\n      PreferenceManager preferenceManager,\n      KubernetesSharedPool sharedPool,\n      AuthorizationChecker authorizationChecker,\n      PermissionsCleaner permissionsCleaner) {\n    super(\n        defaultNamespaceName,\n        namespaceCreationAllowed,\n        labelProjects,\n        annotateProjects,\n        projectLabels,\n        projectAnnotations,\n        namespaceConfigurators,\n        cheServerKubernetesClientFactory,\n        preferenceManager,\n        sharedPool,\n        authorizationChecker,\n        permissionsCleaner);\n    this.initWithCheServerSa = initWithCheServerSa;\n    this.cheServerKubernetesClientFactory = cheServerKubernetesClientFactory;\n    this.cheServerOpenshiftClientFactory = cheServerOpenshiftClientFactory;\n    this.openShiftClientFactory = openShiftClientFactory;\n  }\n\n  public OpenShiftProject getOrCreate(RuntimeIdentity identity) throws InfrastructureException {\n    OpenShiftProject osProject = get(identity);\n    var subject = EnvironmentContext.getCurrent().getSubject();\n    var userName = subject.getUserName();\n\n    validateAuthorization(osProject.getName(), subject);\n\n    NamespaceResolutionContext resolutionCtx =\n        new NamespaceResolutionContext(identity.getWorkspaceId(), subject.getUserId(), userName);\n    Map<String, String> namespaceAnnotationsEvaluated =\n        evaluateAnnotationPlaceholders(resolutionCtx);\n\n    osProject.prepare(\n        canCreateNamespace(),\n        initWithCheServerSa,\n        labelNamespaces ? namespaceLabels : emptyMap(),\n        annotateNamespaces ? namespaceAnnotationsEvaluated : emptyMap());\n\n    configureNamespace(resolutionCtx, osProject.getName());\n\n    return osProject;\n  }\n\n  @Override\n  public OpenShiftProject get(Workspace workspace) throws InfrastructureException {\n    return doCreateProjectAccess(workspace.getId(), getNamespaceName(workspace));\n  }\n\n  public OpenShiftProject get(RuntimeIdentity identity) throws InfrastructureException {\n    return doCreateProjectAccess(identity.getWorkspaceId(), identity.getInfrastructureNamespace());\n  }\n\n  @Override\n  public void deleteIfManaged(Workspace workspace) throws InfrastructureException {\n    OpenShiftProject osProject = get(workspace);\n    if (isWorkspaceNamespaceManaged(osProject.getName(), workspace)) {\n      osProject.delete();\n    }\n  }\n\n  /**\n   * Creates a kubernetes namespace for the specified workspace.\n   *\n   * <p>Project won't be prepared. This method should be used only in case workspace recovering.\n   *\n   * @param workspaceId identifier of the workspace\n   * @return created namespace\n   */\n  public OpenShiftProject access(String workspaceId, String projectName) {\n    return doCreateProjectAccess(workspaceId, projectName);\n  }\n\n  @VisibleForTesting\n  OpenShiftProject doCreateProjectAccess(String workspaceId, String name) {\n    return new OpenShiftProject(\n        openShiftClientFactory,\n        cheServerKubernetesClientFactory,\n        cheServerOpenshiftClientFactory,\n        sharedPool.getExecutor(),\n        name,\n        workspaceId);\n  }\n\n  @Override\n  public Optional<KubernetesNamespaceMeta> fetchNamespace(String name)\n      throws InfrastructureException {\n    return fetchNamespaceObject(name).map(this::asNamespaceMeta);\n  }\n\n  private Optional<Project> fetchNamespaceObject(String name) throws InfrastructureException {\n    try {\n      Project project = cheServerOpenshiftClientFactory.createOC().projects().withName(name).get();\n      return Optional.ofNullable(project);\n    } catch (KubernetesClientException e) {\n      if (e.getCode() == 403) {\n        // 403 means that the project does not exist\n        // or a user really is not permitted to access it which is Che Server misconfiguration\n        return Optional.empty();\n      } else {\n        throw new InfrastructureException(\n            format(\"Error while trying to fetch the project '%s'. Cause: %s\", name, e.getMessage()),\n            e);\n      }\n    }\n  }\n\n  protected List<KubernetesNamespaceMeta> findPreparedNamespaces(\n      NamespaceResolutionContext namespaceCtx) throws InfrastructureException {\n    try {\n      List<Project> workspaceProjects =\n          cheServerOpenshiftClientFactory\n              .createOC()\n              .projects()\n              .withLabels(namespaceLabels)\n              .list()\n              .getItems();\n      if (!workspaceProjects.isEmpty()) {\n        Map<String, String> evaluatedAnnotations = evaluateAnnotationPlaceholders(namespaceCtx);\n        return workspaceProjects.stream()\n            .filter(p -> matchesAnnotations(p, evaluatedAnnotations))\n            .map(this::asNamespaceMeta)\n            .collect(Collectors.toList());\n      } else {\n        return emptyList();\n      }\n    } catch (KubernetesClientException kce) {\n      if (kce.getCode() == 403) {\n        LOG.warn(\n            \"Trying to fetch projects with labels '{}', but failed for lack of permissions. Cause: '{}'\",\n            namespaceLabels,\n            kce.getMessage());\n        return emptyList();\n      } else {\n        throw new InfrastructureException(\n            \"Error occurred when tried to list all available projects. Cause: \" + kce.getMessage(),\n            kce);\n      }\n    }\n  }\n\n  private KubernetesNamespaceMeta asNamespaceMeta(io.fabric8.openshift.api.model.Project project) {\n    Map<String, String> attributes = new HashMap<>(4);\n    ObjectMeta metadata = project.getMetadata();\n    Map<String, String> annotations = metadata.getAnnotations();\n    String displayName = annotations.get(Constants.PROJECT_DISPLAY_NAME_ANNOTATION);\n    if (displayName != null) {\n      attributes.put(Constants.PROJECT_DISPLAY_NAME_ATTRIBUTE, displayName);\n    }\n    String description = annotations.get(Constants.PROJECT_DESCRIPTION_ANNOTATION);\n    if (description != null) {\n      attributes.put(Constants.PROJECT_DESCRIPTION_ATTRIBUTE, description);\n    }\n\n    if (project.getStatus() != null && project.getStatus().getPhase() != null) {\n      attributes.put(PHASE_ATTRIBUTE, project.getStatus().getPhase());\n    }\n    return new KubernetesNamespaceMetaImpl(metadata.getName(), attributes);\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/project/OpenShiftRoutes.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.project;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_WORKSPACE_ID_LABEL;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putLabel;\n\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.openshift.api.model.Route;\nimport java.util.List;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.openshift.OpenShiftClientFactory;\n\n/**\n * Defines an internal API for managing {@link Route} instances in {@link OpenShiftRoutes#namespace\n * predefined namespace}.\n *\n * @author Sergii Leshchenko\n */\npublic class OpenShiftRoutes {\n  private final String namespace;\n  private final String workspaceId;\n  private final OpenShiftClientFactory clientFactory;\n\n  OpenShiftRoutes(String namespace, String workspaceId, OpenShiftClientFactory clientFactory) {\n    this.namespace = namespace;\n    this.workspaceId = workspaceId;\n    this.clientFactory = clientFactory;\n  }\n\n  /**\n   * Creates specified route.\n   *\n   * @param route route to create\n   * @return created route\n   * @throws InfrastructureException when any exception occurs\n   */\n  public Route create(Route route) throws InfrastructureException {\n    putLabel(route, CHE_WORKSPACE_ID_LABEL, workspaceId);\n    try {\n      return clientFactory.createOC(workspaceId).routes().inNamespace(namespace).create(route);\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Returns all existing routes.\n   *\n   * @throws InfrastructureException when any exception occurs\n   */\n  public List<Route> get() throws InfrastructureException {\n    try {\n      return clientFactory\n          .createOC(workspaceId)\n          .routes()\n          .inNamespace(namespace)\n          .withLabel(CHE_WORKSPACE_ID_LABEL, workspaceId)\n          .list()\n          .getItems();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n\n  /**\n   * Deletes all existing routes.\n   *\n   * @throws InfrastructureException when any exception occurs\n   */\n  public void delete() throws InfrastructureException {\n    try {\n      clientFactory\n          .createOC(workspaceId)\n          .routes()\n          .inNamespace(namespace)\n          .withLabel(CHE_WORKSPACE_ID_LABEL, workspaceId)\n          .delete();\n    } catch (KubernetesClientException e) {\n      throw new KubernetesInfrastructureException(e);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/project/OpenShiftWorkspaceServiceAccount.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.project;\n\nimport io.fabric8.kubernetes.api.model.ObjectReferenceBuilder;\nimport io.fabric8.openshift.api.model.PolicyRuleBuilder;\nimport io.fabric8.openshift.api.model.Role;\nimport io.fabric8.openshift.api.model.RoleBinding;\nimport io.fabric8.openshift.api.model.RoleBindingBuilder;\nimport io.fabric8.openshift.api.model.RoleBindingFluent;\nimport io.fabric8.openshift.api.model.RoleBuilder;\nimport io.fabric8.openshift.client.OpenShiftClient;\nimport java.util.List;\nimport java.util.Set;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount;\nimport org.eclipse.che.workspace.infrastructure.openshift.OpenShiftClientFactory;\n\n/**\n * Holds logic for preparing workspace service account.\n *\n * <p>It checks that required service account, roles and role bindings exist and creates if needed.\n *\n * @author Sergii Leshchenko\n * @see\n *     org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesWorkspaceServiceAccount\n */\npublic class OpenShiftWorkspaceServiceAccount\n    extends AbstractWorkspaceServiceAccount<OpenShiftClient, Role, RoleBinding> {\n\n  public OpenShiftWorkspaceServiceAccount(\n      String workspaceId,\n      String projectName,\n      String serviceAccountName,\n      Set<String> clusterRoleNames,\n      OpenShiftClientFactory clientFactory) {\n\n    super(\n        workspaceId,\n        projectName,\n        serviceAccountName,\n        clusterRoleNames,\n        clientFactory::createOC,\n        OpenShiftClient::roles,\n        OpenShiftClient::roleBindings);\n  }\n\n  @Override\n  protected Role buildRole(\n      String name,\n      List<String> resources,\n      List<String> resourceNames,\n      List<String> apiGroups,\n      List<String> verbs) {\n    return new RoleBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .endMetadata()\n        .withRules(\n            new PolicyRuleBuilder()\n                .withResources(resources)\n                .withResourceNames(resourceNames)\n                .withApiGroups(apiGroups)\n                .withVerbs(verbs)\n                .build())\n        .build();\n  }\n\n  @Override\n  protected RoleBinding createRoleBinding(\n      String roleName, String bindingName, boolean clusterRole) {\n    RoleBindingFluent<RoleBindingBuilder>.RoleRefNested<RoleBindingBuilder> bld =\n        new RoleBindingBuilder()\n            .withNewMetadata()\n            .withName(bindingName)\n            .withNamespace(namespace)\n            .endMetadata()\n            .withNewRoleRef()\n            .withName(roleName);\n    if (!clusterRole) {\n      bld.withNamespace(namespace);\n    }\n\n    return bld.endRoleRef()\n        .withSubjects(\n            new ObjectReferenceBuilder()\n                .withKind(\"ServiceAccount\")\n                .withName(serviceAccountName)\n                .build())\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/project/configurator/OpenShiftWorkspaceServiceAccountConfigurator.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.project.configurator;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.common.base.Splitter;\nimport com.google.common.collect.Sets;\nimport java.util.Collections;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.NamespaceConfigurator;\nimport org.eclipse.che.workspace.infrastructure.openshift.CheServerOpenshiftClientFactory;\nimport org.eclipse.che.workspace.infrastructure.openshift.project.OpenShiftWorkspaceServiceAccount;\n\n/**\n * This {@link NamespaceConfigurator} ensures that workspace ServiceAccount with proper ClusterRole\n * is set in Workspace project.\n */\n@Singleton\npublic class OpenShiftWorkspaceServiceAccountConfigurator implements NamespaceConfigurator {\n\n  private final CheServerOpenshiftClientFactory cheServerOpenshiftClientFactory;\n\n  private final String serviceAccountName;\n  private final Set<String> clusterRoleNames;\n\n  @Inject\n  public OpenShiftWorkspaceServiceAccountConfigurator(\n      @Nullable @Named(\"che.infra.kubernetes.service_account_name\") String serviceAccountName,\n      @Nullable @Named(\"che.infra.kubernetes.workspace_sa_cluster_roles\") String clusterRoleNames,\n      CheServerOpenshiftClientFactory cheServerOpenshiftClientFactory) {\n    this.cheServerOpenshiftClientFactory = cheServerOpenshiftClientFactory;\n    this.serviceAccountName = serviceAccountName;\n    if (!isNullOrEmpty(clusterRoleNames)) {\n      this.clusterRoleNames =\n          Sets.newHashSet(\n              Splitter.on(\",\").trimResults().omitEmptyStrings().split(clusterRoleNames));\n    } else {\n      this.clusterRoleNames = Collections.emptySet();\n    }\n  }\n\n  @Override\n  public void configure(NamespaceResolutionContext namespaceResolutionContext, String namespaceName)\n      throws InfrastructureException {\n    if (!isNullOrEmpty(serviceAccountName)) {\n      OpenShiftWorkspaceServiceAccount osWorkspaceServiceAccount =\n          createServiceAccount(namespaceResolutionContext.getWorkspaceId(), namespaceName);\n      osWorkspaceServiceAccount.prepare();\n    }\n  }\n\n  @VisibleForTesting\n  public OpenShiftWorkspaceServiceAccount createServiceAccount(String wsId, String namespaceName) {\n    return new OpenShiftWorkspaceServiceAccount(\n        wsId, namespaceName, serviceAccountName, clusterRoleNames, cheServerOpenshiftClientFactory);\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/provision/OpenShiftPreviewUrlCommandProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.provision;\n\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.openshift.api.model.Route;\nimport java.util.List;\nimport java.util.Optional;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.PreviewUrlCommandProvisioner;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.eclipse.che.workspace.infrastructure.openshift.project.OpenShiftProject;\nimport org.eclipse.che.workspace.infrastructure.openshift.util.Routes;\n\n/**\n * Extends {@link PreviewUrlCommandProvisioner} where needed. For OpenShift, we work with {@link\n * Route}s and {@link OpenShiftProject}. Other than that, logic is the same as for k8s.\n */\n@Singleton\npublic class OpenShiftPreviewUrlCommandProvisioner\n    extends PreviewUrlCommandProvisioner<OpenShiftEnvironment, Route> {\n\n  @Override\n  protected List<Route> loadExposureObjects(KubernetesNamespace namespace)\n      throws InfrastructureException {\n    if (!(namespace instanceof OpenShiftProject)) {\n      throw new InternalInfrastructureException(\n          String.format(\n              \"OpenShiftProject instance expected, but got '%s'. Please report a bug!\",\n              namespace.getClass().getCanonicalName()));\n    }\n    OpenShiftProject project = (OpenShiftProject) namespace;\n\n    return project.routes().get();\n  }\n\n  @Override\n  protected Optional<String> findHostForServicePort(List<Route> routes, Service service, int port) {\n    return Routes.findRouteForServicePort(routes, service, port).map(r -> r.getSpec().getHost());\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/provision/OpenShiftUniqueNamesProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.provision;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putLabel;\n\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.openshift.api.model.Route;\nimport java.util.HashSet;\nimport java.util.Set;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Constants;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.UniqueNamesProvisioner;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\n\n/**\n * @author Sergii Leshchenko\n */\npublic class OpenShiftUniqueNamesProvisioner extends UniqueNamesProvisioner<OpenShiftEnvironment> {\n\n  @Override\n  public void provision(OpenShiftEnvironment osEnv, RuntimeIdentity identity)\n      throws InfrastructureException {\n    super.provision(osEnv, identity);\n\n    final Set<Route> routes = new HashSet<>(osEnv.getRoutes().values());\n    osEnv.getRoutes().clear();\n    for (Route route : routes) {\n      final ObjectMeta routeMeta = route.getMetadata();\n      putLabel(route, Constants.CHE_ORIGINAL_NAME_LABEL, routeMeta.getName());\n      final String routeName = Names.generateName(\"route\");\n      routeMeta.setName(routeName);\n      osEnv.getRoutes().put(routeName, route);\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/provision/RouteTlsProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.provision;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesObjectUtil.putAnnotations;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisioner.getSecureProtocol;\n\nimport io.fabric8.openshift.api.model.Route;\nimport io.fabric8.openshift.api.model.RouteSpec;\nimport io.fabric8.openshift.api.model.TLSConfig;\nimport java.util.HashSet;\nimport java.util.Map;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.commons.annotation.Traced;\nimport org.eclipse.che.commons.tracing.TracingTags;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ConfigurationProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisioner;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\n\n/**\n * Enables Transport Layer Security (TLS) for workspace routes and changes protocol to secure (wss /\n * https) in servers' configuration\n *\n * @author Ilya Buziuk\n */\n@Singleton\npublic class RouteTlsProvisioner\n    implements TlsProvisioner<OpenShiftEnvironment>,\n        ConfigurationProvisioner<OpenShiftEnvironment> {\n\n  static final String TERMINATION_EDGE = \"edge\";\n  static final String TERMINATION_POLICY_REDIRECT = \"Redirect\";\n  private final boolean isTlsEnabled;\n\n  @Inject\n  public RouteTlsProvisioner(@Named(\"che.infra.kubernetes.tls_enabled\") boolean isTlsEnabled) {\n    this.isTlsEnabled = isTlsEnabled;\n  }\n\n  @Override\n  @Traced\n  public void provision(OpenShiftEnvironment osEnv, RuntimeIdentity identity) {\n    TracingTags.WORKSPACE_ID.set(identity::getWorkspaceId);\n\n    if (!isTlsEnabled) {\n      return;\n    }\n    final Set<Route> routes = new HashSet<>(osEnv.getRoutes().values());\n    for (Route route : routes) {\n      useSecureProtocolForServers(route);\n      enableTls(route);\n    }\n  }\n\n  private void useSecureProtocolForServers(final Route route) {\n    Map<String, ServerConfigImpl> servers =\n        Annotations.newDeserializer(route.getMetadata().getAnnotations()).servers();\n\n    servers.values().forEach(s -> s.setProtocol(getSecureProtocol(s.getProtocol())));\n\n    Map<String, String> annotations = Annotations.newSerializer().servers(servers).annotations();\n    putAnnotations(route.getMetadata(), annotations);\n  }\n\n  private void enableTls(final Route route) {\n    RouteSpec spec = route.getSpec();\n    spec.setTls(getTLSConfig());\n  }\n\n  private TLSConfig getTLSConfig() {\n    TLSConfig config = new TLSConfig();\n    config.setTermination(TERMINATION_EDGE);\n    config.setInsecureEdgeTerminationPolicy(TERMINATION_POLICY_REDIRECT);\n    return config;\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/server/OpenShiftCookiePathStrategy.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.server;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY;\n\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.secure.jwtproxy.CookiePathStrategy;\n\n/**\n * On OpenShift we always use the equivalent of the multi-host strategy and therefore use the\n * appropriate cookie path strategy for the secured endpoints.\n */\npublic class OpenShiftCookiePathStrategy extends CookiePathStrategy {\n\n  public OpenShiftCookiePathStrategy() {\n    super(MULTI_HOST_STRATEGY);\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/server/OpenShiftPreviewUrlExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.server;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.openshift.api.model.Route;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.PreviewUrlExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposerProvider;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.eclipse.che.workspace.infrastructure.openshift.util.Routes;\n\n/**\n * Extends {@link PreviewUrlExposer} with OpenShift capabilities. We work with {@link Route} and\n * {@link OpenShiftEnvironment}.\n */\n@Singleton\npublic class OpenShiftPreviewUrlExposer extends PreviewUrlExposer<OpenShiftEnvironment> {\n\n  @Inject\n  public OpenShiftPreviewUrlExposer(\n      ExternalServerExposerProvider<OpenShiftEnvironment> externalServerExposer) {\n    super(externalServerExposer);\n  }\n\n  @VisibleForTesting\n  protected OpenShiftPreviewUrlExposer(\n      ExternalServerExposer<OpenShiftEnvironment> externalServerExposer) {\n    super(externalServerExposer);\n  }\n\n  @Override\n  protected boolean hasMatchingEndpoint(OpenShiftEnvironment env, Service service, int port) {\n    return Routes.findRouteForServicePort(env.getRoutes().values(), service, port).isPresent();\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/server/OpenShiftServerExposureStrategy.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.server;\n\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServiceExposureStrategy;\n\n/**\n * Even though we don't use ingresses to expose the services on OpenShift, we still need to provide\n * an implementation of this strategy that gives the rest of the system the idea of the paths on\n * which the services are exposed.\n */\npublic class OpenShiftServerExposureStrategy implements ExternalServiceExposureStrategy {\n  @Override\n  public String getExternalHost(String serviceName, String serverName) {\n    return null;\n  }\n\n  @Override\n  public String getExternalPath(String serviceName, String serverName) {\n    return \"/\";\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/server/OpenShiftServerResolverFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.server;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.WorkspaceExposureType.GATEWAY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.WorkspaceExposureType.NATIVE;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.openshift.api.model.Route;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver.AbstractServerResolverFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver.ConfigMapServerResolver;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver.ServerResolver;\n\n/**\n * Factory that decides by configuration, which {@link ServerResolver} implementation to use in\n * OpenShift environment.\n */\npublic class OpenShiftServerResolverFactory extends AbstractServerResolverFactory<Route> {\n\n  @Inject\n  public OpenShiftServerResolverFactory(\n      @Named(\"che.host\") String cheHost,\n      @Named(\"che.infra.kubernetes.server_strategy\") String exposureStrategy,\n      @Named(\"che.infra.kubernetes.singlehost.workspace.exposure\") String wsExposureType) {\n    super(\n        exposureStrategy,\n        wsExposureType,\n        ImmutableMap.of(\n            GATEWAY,\n                (ss, rs, cs) ->\n                    new ConfigMapServerResolver(ss, cs, cheHost, new RouteServerResolver(ss, rs)),\n            NATIVE, (ss, rs, cs) -> new RouteServerResolver(ss, rs)),\n        \"Failed to initialize OpenShiftServerResolverFactory for workspace exposure type '%s'.\");\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/server/RouteServerExposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.server;\n\nimport static java.util.Collections.emptyMap;\n\nimport com.google.common.base.Splitter;\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.openshift.api.model.Route;\nimport java.util.HashMap;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposer;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\n\n/**\n * Helps to modify {@link OpenShiftEnvironment} to make servers that are configured by {@link\n * ServerConfig} publicly or workspace-wide accessible.\n *\n * <p>To make server accessible it is needed to make sure that container port is declared, create\n * {@link Service}. To make it also publicly accessible it is needed to create corresponding {@link\n * Route} for exposing this port.\n *\n * <p>Created services and routes will have serialized servers which are exposed by the\n * corresponding object and machine name to which these servers belongs to.\n *\n * <p>Container, service and route are linked in the following way:\n *\n * <pre>\n * Pod\n * metadata:\n *   labels:\n *     type: web-app\n * spec:\n *   containers:\n *   ...\n *   - ports:\n *     - containerPort: 8080\n *       name: web-app\n *       protocol: TCP\n *   ...\n * </pre>\n *\n * Then services expose containers ports in the following way:\n *\n * <pre>\n * Service\n * metadata:\n *   name: service123\n * spec:\n *   selector:                        ---->> Pod.metadata.labels\n *     type: web-app\n *   ports:\n *     - name: web-app\n *       port: 8080\n *       targetPort: [8080|web-app]   ---->> Pod.spec.ports[0].[containerPort|name]\n *       protocol: TCP                ---->> Pod.spec.ports[0].protocol\n * </pre>\n *\n * Then corresponding route expose one of the service's port:\n *\n * <pre>\n * Route\n * ...\n * spec:\n *   to:\n *     name: dev-machine              ---->> Service.metadata.name\n *   port:\n *     targetPort: [8080|web-app]     ---->> Service.spec.ports[0].[port|name]\n * </pre>\n *\n * <p>For accessing publicly accessible server user will use route host. For accessing\n * workspace-wide accessible server user will use service name. Information about servers that are\n * exposed by route and/or service are stored in annotations of a route or service.\n *\n * @author Sergii Leshchenko\n * @author Alexander Garagatyi\n * @see Annotations\n */\n@Singleton\npublic class RouteServerExposer implements ExternalServerExposer<OpenShiftEnvironment> {\n\n  private final Map<String, String> labels;\n  private final String domainSuffix;\n\n  @Inject\n  public RouteServerExposer(\n      @Nullable @Named(\"che.infra.openshift.route.labels\") String labelsProperty,\n      @Nullable @Named(\"che.infra.openshift.route.host.domain_suffix\") String domainSuffix) {\n    this.labels =\n        labelsProperty != null\n            ? Splitter.on(\",\").withKeyValueSeparator(\"=\").split(labelsProperty)\n            : emptyMap();\n    this.domainSuffix = domainSuffix;\n  }\n\n  @Override\n  public void expose(\n      OpenShiftEnvironment env,\n      String machineName,\n      String serviceName,\n      String serverId,\n      ServicePort servicePort,\n      Map<String, ServerConfig> externalServers) {\n    Route commonRoute =\n        new RouteBuilder()\n            .withName(Names.generateName(\"route\"))\n            .withMachineName(machineName)\n            .withTargetPort(servicePort.getName())\n            .withServers(externalServers)\n            .withLabels(labels)\n            .withHost(\n                domainSuffix != null\n                    ? NameGenerator.generate(\"route\", \".\" + domainSuffix, 6)\n                    : null)\n            .withTo(serviceName)\n            .build();\n    env.getRoutes().put(commonRoute.getMetadata().getName(), commonRoute);\n  }\n\n  private static class RouteBuilder {\n\n    private String name;\n    private String host;\n    private String serviceName;\n    private IntOrString targetPort;\n    private Map<String, ServerConfig> servers;\n    private Map<String, String> labels;\n    private String machineName;\n\n    private RouteBuilder withName(String name) {\n      this.name = name;\n      return this;\n    }\n\n    private RouteBuilder withTo(String serviceName) {\n      this.serviceName = serviceName;\n      return this;\n    }\n\n    private RouteBuilder withHost(String host) {\n      this.host = host;\n      return this;\n    }\n\n    private RouteBuilder withTargetPort(String targetPortName) {\n      this.targetPort = new IntOrString(targetPortName);\n      return this;\n    }\n\n    private RouteBuilder withServer(String serverName, ServerConfig serverConfig) {\n      return withServers(ImmutableMap.of(serverName, serverConfig));\n    }\n\n    private RouteBuilder withServers(Map<String, ServerConfig> servers) {\n      if (this.servers == null) {\n        this.servers = new HashMap<>();\n      }\n\n      this.servers.putAll(servers);\n\n      return this;\n    }\n\n    private RouteBuilder withLabels(Map<String, String> labels) {\n      this.labels = labels;\n      return this;\n    }\n\n    public RouteBuilder withMachineName(String machineName) {\n      this.machineName = machineName;\n      return this;\n    }\n\n    private Route build() {\n      io.fabric8.openshift.api.model.RouteBuilder builder =\n          new io.fabric8.openshift.api.model.RouteBuilder();\n\n      return builder\n          .withNewMetadata()\n          .withName(name.replace(\"/\", \"-\"))\n          .withAnnotations(\n              Annotations.newSerializer().servers(servers).machineName(machineName).annotations())\n          .withLabels(labels)\n          .endMetadata()\n          .withNewSpec()\n          .withHost(host)\n          .withNewTo()\n          .withName(serviceName)\n          .endTo()\n          .withNewPort()\n          .withTargetPort(targetPort)\n          .endPort()\n          .endSpec()\n          .build();\n    }\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/server/RouteServerResolver.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.server;\n\nimport com.google.common.collect.ArrayListMultimap;\nimport com.google.common.collect.Multimap;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.openshift.api.model.Route;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.RuntimeServerBuilder;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.resolver.AbstractServerResolver;\n\n/**\n * Helps to resolve {@link ServerImpl servers} by machine name according to specified {@link Route\n * routes} and {@link Service services}.\n *\n * <p>Objects annotations are used to check if {@link Service service} or {@link Route route}\n * exposes the specified machine servers.\n *\n * @author Sergii Leshchenko\n * @author Alexander Garagatyi\n * @see Annotations\n */\npublic class RouteServerResolver extends AbstractServerResolver {\n\n  private final Multimap<String, Route> routes;\n\n  public RouteServerResolver(List<Service> services, List<Route> routes) {\n    super(services);\n\n    this.routes = ArrayListMultimap.create();\n    for (Route route : routes) {\n      String machineName =\n          Annotations.newDeserializer(route.getMetadata().getAnnotations()).machineName();\n      this.routes.put(machineName, route);\n    }\n  }\n\n  @Override\n  public Map<String, ServerImpl> resolveExternalServers(String machineName) {\n    return routes.get(machineName).stream()\n        .map(r -> resolveRouteServers(machineName, r))\n        .flatMap(m -> m.entrySet().stream())\n        .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (v1, v2) -> v2));\n  }\n\n  private Map<String, ServerImpl> resolveRouteServers(String serviceName, Route route) {\n    return Annotations.newDeserializer(route.getMetadata().getAnnotations())\n        .servers()\n        .entrySet()\n        .stream()\n        .collect(\n            Collectors.toMap(\n                Entry::getKey,\n                e ->\n                    new RuntimeServerBuilder()\n                        .protocol(e.getValue().getProtocol())\n                        .host(route.getSpec().getHost())\n                        .path(e.getValue().getPath())\n                        .endpointOrigin(\n                            \"/\") // routes are always multihost, so we don't need to think here...\n                        .attributes(e.getValue().getAttributes())\n                        .targetPort(e.getValue().getPort())\n                        .build(),\n                (s1, s2) -> s2));\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/server/external/OpenShiftExternalServerExposerProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.server.external;\n\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.WorkspaceExposureType;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.CombinedSingleHostServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServerExposerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.KubernetesExternalServerExposerProvider;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.eclipse.che.workspace.infrastructure.openshift.server.RouteServerExposer;\n\n/**\n * Provides {@link ExternalServerExposer} based on `che.infra.kubernetes.server_strategy` and\n * `che.infra.kubernetes.singlehost.workspace.exposure` properties.\n *\n * <p>Based on server strategy, it can create a {@link CombinedSingleHostServerExposer} with\n * OpenShift specific {@link RouteServerExposer} for exposing servers on subdomains.\n */\npublic class OpenShiftExternalServerExposerProvider\n    extends KubernetesExternalServerExposerProvider<OpenShiftEnvironment>\n    implements ExternalServerExposerProvider<OpenShiftEnvironment> {\n\n  @Inject\n  public OpenShiftExternalServerExposerProvider(\n      @Named(\"che.infra.kubernetes.server_strategy\") String exposureStrategy,\n      @Named(\"che.infra.kubernetes.singlehost.workspace.exposure\") String exposureType,\n      @Named(\"che.infra.kubernetes.singlehost.workspace.devfile_endpoint_exposure\")\n          String devfileEndpointExposure,\n      @Named(\"multihost-exposer\") ExternalServerExposer<OpenShiftEnvironment> multihostExposer,\n      Map<WorkspaceExposureType, ExternalServerExposer<OpenShiftEnvironment>> exposers) {\n    super(exposureStrategy, exposureType, devfileEndpointExposure, multihostExposer, exposers);\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/util/Routes.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.util;\n\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.openshift.api.model.Route;\nimport io.fabric8.openshift.api.model.RouteSpec;\nimport java.util.Collection;\nimport java.util.Optional;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.Services;\n\n/** Util class that helps working with OpenShift Routes */\npublic class Routes {\n\n  /**\n   * In given {@code routes} finds route that for given {@code service} and {@code port}\n   *\n   * @return found {@link Route} or {@link Optional#empty()}\n   */\n  public static Optional<Route> findRouteForServicePort(\n      Collection<Route> routes, Service service, int port) {\n    Optional<ServicePort> foundPort = Services.findPort(service, port);\n    if (!foundPort.isPresent()) {\n      return Optional.empty();\n    }\n\n    for (Route route : routes) {\n      RouteSpec spec = route.getSpec();\n      if (spec.getTo().getName().equals(service.getMetadata().getName())\n          && matchesPort(foundPort.get(), spec.getPort().getTargetPort())) {\n        return Optional.of(route);\n      }\n    }\n    return Optional.empty();\n  }\n\n  private static boolean matchesPort(ServicePort servicePort, IntOrString routePort) {\n    if (routePort.getStrVal() != null && routePort.getStrVal().equals(servicePort.getName())) {\n      return true;\n    }\n\n    if (routePort.getIntVal() != null && routePort.getIntVal().equals(servicePort.getPort())) {\n      return true;\n    }\n\n    return false;\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/wsplugins/brokerphases/OpenshiftBrokerEnvironmentFactory.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.wsplugins.brokerphases;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.AgentAuthEnableEnvVarProvider;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.MachineTokenEnvVarProvider;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.CertificateProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.BrokerEnvironmentFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.KubernetesBrokerEnvironmentFactory;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\n\n/**\n * Extends {@link KubernetesBrokerEnvironmentFactory} to be used in the openshift infrastructure.\n *\n * @author Oleksandr Garagatyi\n */\npublic class OpenshiftBrokerEnvironmentFactory\n    extends BrokerEnvironmentFactory<OpenShiftEnvironment> {\n\n  @Inject\n  public OpenshiftBrokerEnvironmentFactory(\n      @Named(\"che.websocket.endpoint\") String cheWebsocketEndpoint,\n      @Nullable @Named(\"che.websocket.internal.endpoint\") String cheWebsocketInternalEndpoint,\n      @Named(\"che.workspace.plugin_broker.pull_policy\") String brokerPullPolicy,\n      AgentAuthEnableEnvVarProvider authEnableEnvVarProvider,\n      MachineTokenEnvVarProvider machineTokenEnvVarProvider,\n      @Named(\"che.workspace.plugin_broker.artifacts.image\") String artifactsBrokerImage,\n      @Named(\"che.workspace.plugin_broker.metadata.image\") String metadataBrokerImage,\n      @Nullable @Named(\"che.workspace.plugin_registry_url\") String pluginRegistryUrl,\n      @Nullable @Named(\"che.workspace.plugin_registry_internal_url\")\n          String pluginRegistryInternalUrl,\n      @Named(\"che.infra.openshift.trusted_ca_bundles_mount_path\") String caCertificatesMountPath,\n      CertificateProvisioner certProvisioner) {\n    super(\n        cheWebsocketEndpoint,\n        cheWebsocketInternalEndpoint,\n        brokerPullPolicy,\n        authEnableEnvVarProvider,\n        machineTokenEnvVarProvider,\n        artifactsBrokerImage,\n        metadataBrokerImage,\n        pluginRegistryUrl,\n        pluginRegistryInternalUrl,\n        caCertificatesMountPath,\n        certProvisioner);\n  }\n\n  @Override\n  protected OpenShiftEnvironment doCreate(BrokersConfigs brokersConfigs) {\n    return OpenShiftEnvironment.builder()\n        .setConfigMaps(brokersConfigs.configMaps)\n        .setMachines(brokersConfigs.machines)\n        .setPods(brokersConfigs.pods)\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/OpenShiftEnvironmentProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift;\n\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.inOrder;\nimport static org.mockito.Mockito.when;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.CertificateProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.GatewayRouterProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.GitConfigProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ImagePullSecretProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.PodTerminationGracePeriodProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.ServiceAccountProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.SshKeysProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.TlsProvisionerProvider;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.VcsSslCertificateProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.env.EnvVarsConverter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.limits.ram.ContainerResourceProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.restartpolicy.RestartPolicyRewriter;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.provision.server.ServersConverter;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.eclipse.che.workspace.infrastructure.openshift.provision.OpenShiftUniqueNamesProvisioner;\nimport org.eclipse.che.workspace.infrastructure.openshift.provision.RouteTlsProvisioner;\nimport org.eclipse.che.workspace.infrastructure.openshift.server.OpenShiftPreviewUrlExposer;\nimport org.mockito.InOrder;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link OpenShiftEnvironmentProvisioner}.\n *\n * @author Anton Korneta\n */\n@Listeners(MockitoTestNGListener.class)\npublic class OpenShiftEnvironmentProvisionerTest {\n\n  @Mock private OpenShiftUniqueNamesProvisioner uniqueNamesProvisioner;\n  @Mock private OpenShiftEnvironment osEnv;\n  @Mock private RuntimeIdentity runtimeIdentity;\n  @Mock private RouteTlsProvisioner tlsRouteProvisioner;\n  @Mock private TlsProvisionerProvider<OpenShiftEnvironment> tlsRouteProvisionerProvider;\n  @Mock private EnvVarsConverter envVarsProvisioner;\n  @Mock private ServersConverter<OpenShiftEnvironment> serversProvisioner;\n  @Mock private RestartPolicyRewriter restartPolicyRewriter;\n  @Mock private ContainerResourceProvisioner ramLimitProvisioner;\n  @Mock private PodTerminationGracePeriodProvisioner podTerminationGracePeriodProvisioner;\n  @Mock private ImagePullSecretProvisioner imagePullSecretProvisioner;\n  @Mock private ServiceAccountProvisioner serviceAccountProvisioner;\n  @Mock private CertificateProvisioner certificateProvisioner;\n  @Mock private SshKeysProvisioner sshKeysProvisioner;\n  @Mock private GitConfigProvisioner gitConfigProvisioner;\n  @Mock private OpenShiftPreviewUrlExposer previewUrlEndpointsProvisioner;\n  @Mock private VcsSslCertificateProvisioner vcsSslCertificateProvisioner;\n  @Mock private GatewayRouterProvisioner gatewayRouterProvisioner;\n\n  private OpenShiftEnvironmentProvisioner osInfraProvisioner;\n\n  private InOrder provisionOrder;\n\n  @BeforeMethod\n  public void setUp() {\n    when(tlsRouteProvisionerProvider.get()).thenReturn(tlsRouteProvisioner);\n    osInfraProvisioner =\n        new OpenShiftEnvironmentProvisioner(\n            uniqueNamesProvisioner,\n            tlsRouteProvisionerProvider,\n            serversProvisioner,\n            envVarsProvisioner,\n            restartPolicyRewriter,\n            ramLimitProvisioner,\n            podTerminationGracePeriodProvisioner,\n            imagePullSecretProvisioner,\n            serviceAccountProvisioner,\n            certificateProvisioner,\n            sshKeysProvisioner,\n            gitConfigProvisioner,\n            previewUrlEndpointsProvisioner,\n            vcsSslCertificateProvisioner,\n            gatewayRouterProvisioner);\n    provisionOrder =\n        inOrder(\n            serversProvisioner,\n            envVarsProvisioner,\n            uniqueNamesProvisioner,\n            tlsRouteProvisioner,\n            restartPolicyRewriter,\n            ramLimitProvisioner,\n            podTerminationGracePeriodProvisioner,\n            imagePullSecretProvisioner,\n            serviceAccountProvisioner,\n            certificateProvisioner,\n            sshKeysProvisioner,\n            vcsSslCertificateProvisioner,\n            gitConfigProvisioner,\n            previewUrlEndpointsProvisioner,\n            gatewayRouterProvisioner);\n  }\n\n  @Test\n  public void performsOrderedProvisioning() throws Exception {\n    osInfraProvisioner.provision(osEnv, runtimeIdentity);\n\n    provisionOrder.verify(serversProvisioner).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verify(envVarsProvisioner).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verify(restartPolicyRewriter).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verify(tlsRouteProvisioner).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verify(ramLimitProvisioner).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder\n        .verify(podTerminationGracePeriodProvisioner)\n        .provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verify(imagePullSecretProvisioner).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verify(serviceAccountProvisioner).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verify(certificateProvisioner).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verify(sshKeysProvisioner).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verify(vcsSslCertificateProvisioner).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verify(gitConfigProvisioner).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verify(gatewayRouterProvisioner).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verify(uniqueNamesProvisioner).provision(eq(osEnv), eq(runtimeIdentity));\n    provisionOrder.verifyNoMoreInteractions();\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/RouteServerResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift;\n\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.core.model.workspace.runtime.ServerStatus.UNKNOWN;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServiceBuilder;\nimport io.fabric8.kubernetes.api.model.ServicePortBuilder;\nimport io.fabric8.openshift.api.model.Route;\nimport io.fabric8.openshift.api.model.RouteBuilder;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerImpl;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations.Serializer;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.server.external.ExternalServiceExposureStrategy;\nimport org.eclipse.che.workspace.infrastructure.openshift.server.RouteServerResolver;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Test for {@link RouteServerResolver}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class RouteServerResolverTest {\n\n  private static final Map<String, String> ATTRIBUTES_MAP = singletonMap(\"key\", \"value\");\n  private static final int CONTAINER_PORT = 3054;\n  private static final String ROUTE_HOST = \"localhost\";\n\n  @Mock private ExternalServiceExposureStrategy externalServiceExposureStrategy;\n\n  @Test\n  public void\n      testResolvingServersWhenThereIsNoTheCorrespondingServiceAndRouteForTheSpecifiedMachine() {\n    // given\n    Service nonMatchedByPodService =\n        createService(\"nonMatched\", \"foreignMachine\", CONTAINER_PORT, null);\n    Route route =\n        createRoute(\n            \"nonMatched\",\n            \"foreignMachine\",\n            ImmutableMap.of(\n                \"http-server\", new ServerConfigImpl(\"3054\", \"http\", \"/api\", ATTRIBUTES_MAP)));\n\n    RouteServerResolver serverResolver =\n        new RouteServerResolver(singletonList(nonMatchedByPodService), singletonList(route));\n\n    // when\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    // then\n    assertTrue(resolved.isEmpty());\n  }\n\n  @Test\n  public void testResolvingServersWhenThereIsMatchedRouteForTheSpecifiedMachine() {\n    Route route =\n        createRoute(\n            \"matched\",\n            \"machine\",\n            ImmutableMap.of(\n                \"http-server\", new ServerConfigImpl(\"3054\", \"http\", \"/api\", ATTRIBUTES_MAP)));\n\n    RouteServerResolver serverResolver = new RouteServerResolver(emptyList(), singletonList(route));\n\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    assertEquals(resolved.size(), 1);\n    assertEquals(\n        resolved.get(\"http-server\"),\n        new ServerImpl()\n            .withUrl(\"http://localhost/api\")\n            .withStatus(UNKNOWN)\n            .withAttributes(\n                defaultAttributeAnd(\n                    Constants.SERVER_PORT_ATTRIBUTE, \"3054\", ServerConfig.ENDPOINT_ORIGIN, \"/\")));\n  }\n\n  @Test\n  public void testResolvingServersWhenThereIsMatchedRouteForMachineAndServerPathIsNull() {\n    Route route =\n        createRoute(\n            \"matched\",\n            \"machine\",\n            singletonMap(\n                \"http-server\", new ServerConfigImpl(\"3054\", \"http\", null, ATTRIBUTES_MAP)));\n\n    RouteServerResolver serverResolver = new RouteServerResolver(emptyList(), singletonList(route));\n\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    assertEquals(resolved.size(), 1);\n    assertEquals(\n        resolved.get(\"http-server\"),\n        new ServerImpl()\n            .withUrl(\"http://localhost\")\n            .withStatus(UNKNOWN)\n            .withAttributes(\n                defaultAttributeAnd(\n                    Constants.SERVER_PORT_ATTRIBUTE, \"3054\", ServerConfig.ENDPOINT_ORIGIN, \"/\")));\n  }\n\n  @Test\n  public void testResolvingServersWhenThereIsMatchedRouteForMachineAndServerPathIsEmpty() {\n    Route route =\n        createRoute(\n            \"matched\",\n            \"machine\",\n            singletonMap(\"http-server\", new ServerConfigImpl(\"3054\", \"http\", \"\", ATTRIBUTES_MAP)));\n\n    RouteServerResolver serverResolver = new RouteServerResolver(emptyList(), singletonList(route));\n\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    assertEquals(resolved.size(), 1);\n    assertEquals(\n        resolved.get(\"http-server\"),\n        new ServerImpl()\n            .withUrl(\"http://localhost\")\n            .withStatus(UNKNOWN)\n            .withAttributes(\n                defaultAttributeAnd(\n                    Constants.SERVER_PORT_ATTRIBUTE, \"3054\", ServerConfig.ENDPOINT_ORIGIN, \"/\")));\n  }\n\n  @Test\n  public void testResolvingServersWhenThereIsMatchedRouteForMachineAndServerPathIsRelative() {\n    Route route =\n        createRoute(\n            \"matched\",\n            \"machine\",\n            singletonMap(\n                \"http-server\", new ServerConfigImpl(\"3054\", \"http\", \"api\", ATTRIBUTES_MAP)));\n\n    RouteServerResolver serverResolver = new RouteServerResolver(emptyList(), singletonList(route));\n\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    assertEquals(resolved.size(), 1);\n    assertEquals(\n        resolved.get(\"http-server\"),\n        new ServerImpl()\n            .withUrl(\"http://localhost/api\")\n            .withStatus(UNKNOWN)\n            .withAttributes(\n                defaultAttributeAnd(\n                    Constants.SERVER_PORT_ATTRIBUTE, \"3054\", ServerConfig.ENDPOINT_ORIGIN, \"/\")));\n  }\n\n  @Test\n  public void testResolvingInternalServers() {\n    Service service =\n        createService(\n            \"service11\",\n            \"machine\",\n            CONTAINER_PORT,\n            singletonMap(\n                \"http-server\", new ServerConfigImpl(\"3054\", \"http\", \"api\", ATTRIBUTES_MAP)));\n    Route route = createRoute(\"matched\", \"machine\", null);\n\n    RouteServerResolver serverResolver =\n        new RouteServerResolver(singletonList(service), singletonList(route));\n\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    assertEquals(resolved.size(), 1);\n    assertEquals(\n        resolved.get(\"http-server\"),\n        new ServerImpl()\n            .withUrl(\"http://service11:3054/api\")\n            .withStatus(UNKNOWN)\n            .withAttributes(\n                defaultAttributeAnd(\n                    Constants.SERVER_PORT_ATTRIBUTE, \"3054\", ServerConfig.ENDPOINT_ORIGIN, \"/\")));\n  }\n\n  @Test\n  public void testResolvingInternalServersWithPortWithTransportProtocol() {\n    Service service =\n        createService(\n            \"service11\",\n            \"machine\",\n            CONTAINER_PORT,\n            singletonMap(\n                \"http-server\", new ServerConfigImpl(\"3054/udp\", \"xxx\", \"api\", ATTRIBUTES_MAP)));\n    Route route = createRoute(\"matched\", \"machine\", null);\n\n    RouteServerResolver serverResolver =\n        new RouteServerResolver(singletonList(service), singletonList(route));\n\n    Map<String, ServerImpl> resolved = serverResolver.resolve(\"machine\");\n\n    assertEquals(resolved.size(), 1);\n    assertEquals(\n        resolved.get(\"http-server\"),\n        new ServerImpl()\n            .withUrl(\"xxx://service11:3054/api\")\n            .withStatus(UNKNOWN)\n            .withAttributes(\n                defaultAttributeAnd(\n                    Constants.SERVER_PORT_ATTRIBUTE, \"3054\", ServerConfig.ENDPOINT_ORIGIN, \"/\")));\n  }\n\n  @Test\n  public void shouldSetEndpointOrigin() {\n    // given\n    Route route =\n        new RouteBuilder()\n            .withNewMetadata()\n            .addToAnnotations(\n                Annotations.newSerializer()\n                    .machineName(\"m1\")\n                    .server(\n                        \"svr\",\n                        new ServerConfigImpl()\n                            .withPort(\"8080\")\n                            .withProtocol(\"http\")\n                            .withPath(\"/kachny\"))\n                    .annotations())\n            .endMetadata()\n            .withNewSpec()\n            .withHost(\"che.host\")\n            .endSpec()\n            .build();\n\n    RouteServerResolver serverResolver = new RouteServerResolver(emptyList(), singletonList(route));\n\n    // when\n    Map<String, ServerImpl> resolvedServers = serverResolver.resolve(\"m1\");\n\n    // then\n    ServerImpl svr = resolvedServers.get(\"svr\");\n    assertNotNull(svr);\n\n    assertEquals(\"/\", ServerConfig.getEndpointOrigin(svr.getAttributes()));\n    assertEquals(\"http://che.host/kachny\", svr.getUrl());\n  }\n\n  private Service createService(\n      String name, String machineName, Integer port, Map<String, ServerConfigImpl> servers) {\n    Serializer serializer = Annotations.newSerializer();\n    serializer.machineName(machineName);\n    if (servers != null) {\n      serializer.servers(servers);\n    }\n\n    return new ServiceBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .withAnnotations(serializer.annotations())\n        .endMetadata()\n        .withNewSpec()\n        .withPorts(\n            new ServicePortBuilder()\n                .withPort(port)\n                .withNewTargetPort()\n                .withValue(port)\n                .endTargetPort()\n                .build())\n        .endSpec()\n        .build();\n  }\n\n  private Route createRoute(\n      String name, String machineName, Map<String, ServerConfigImpl> servers) {\n    Serializer serializer = Annotations.newSerializer();\n    serializer.machineName(machineName);\n    if (servers != null) {\n      serializer.servers(servers);\n    }\n    return new RouteBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .withAnnotations(serializer.annotations())\n        .endMetadata()\n        .withNewSpec()\n        .withHost(ROUTE_HOST)\n        .withNewTo()\n        .withName(name)\n        .endTo()\n        .endSpec()\n        .build();\n  }\n\n  private Map<String, String> defaultAttributeAnd(String... keyValues) {\n    HashMap<String, String> attributes = new HashMap<>(ATTRIBUTES_MAP);\n    String key = null;\n    for (String v : keyValues) {\n      if (key == null) {\n        key = v;\n      } else {\n        attributes.put(key, v);\n        key = null;\n      }\n    }\n    return attributes;\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/authorization/OpenShiftAuthorizationCheckerTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.authorization;\n\nimport static org.mockito.Mockito.*;\n\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMixedDispatcher;\nimport io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;\nimport io.fabric8.mockwebserver.Context;\nimport io.fabric8.mockwebserver.MockWebServer;\nimport io.fabric8.mockwebserver.ServerRequest;\nimport io.fabric8.mockwebserver.ServerResponse;\nimport io.fabric8.openshift.api.model.Group;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Queue;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.Assert;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class OpenShiftAuthorizationCheckerTest {\n\n  @Mock private CheServerKubernetesClientFactory clientFactory;\n  private KubernetesClient client;\n  private KubernetesMockServer kubernetesMockServer;\n  private static Subject user1 =\n      new SubjectImpl(\"user1\", Collections.emptyList(), \"id\", \"token\", false);\n  private static Subject user2 =\n      new SubjectImpl(\"user2\", Collections.emptyList(), \"id\", \"token\", false);\n\n  @BeforeMethod\n  public void setUp() throws InfrastructureException {\n    final Map<ServerRequest, Queue<ServerResponse>> responses = new HashMap<>();\n    kubernetesMockServer =\n        new KubernetesMockServer(\n            new Context(),\n            new MockWebServer(),\n            responses,\n            new KubernetesMixedDispatcher(responses),\n            true);\n    kubernetesMockServer.init();\n    client = spy(kubernetesMockServer.createClient());\n    lenient().when(clientFactory.create()).thenReturn(client);\n  }\n\n  @AfterMethod\n  public void tearDown() {\n    kubernetesMockServer.destroy();\n  }\n\n  @Test(dataProvider = \"advancedAuthorizationData\")\n  public void advancedAuthorization(\n      Subject subject,\n      List<Group> groups,\n      String allowedUsers,\n      String allowedGroups,\n      String deniedUsers,\n      String deniedGroups,\n      boolean expectedIsAuthorized)\n      throws InfrastructureException {\n    // give\n    OpenShiftAuthorizationCheckerImpl authorizationChecker =\n        new OpenShiftAuthorizationCheckerImpl(\n            allowedUsers, allowedGroups, deniedUsers, deniedGroups, \",\", clientFactory);\n    groups.forEach(group -> client.resources(Group.class).create(group));\n\n    // when\n    boolean isAuthorized = authorizationChecker.isAuthorized(subject);\n\n    // then\n    Assert.assertEquals(isAuthorized, expectedIsAuthorized);\n  }\n\n  @DataProvider\n  public static Object[][] advancedAuthorizationData() {\n    Group groupWithUser1 =\n        new Group(\n            \"v1\",\n            \"Group\",\n            new ObjectMetaBuilder().withName(\"groupWithUser1\").build(),\n            List.of(\"user1\"));\n    Group groupWithUser2 =\n        new Group(\n            \"v1\",\n            \"Group\",\n            new ObjectMetaBuilder().withName(\"groupWithUser2\").build(),\n            List.of(\"user2\"));\n\n    return new Object[][] {\n      {user1, Collections.emptyList(), \"\", \"\", \"\", \"\", true},\n      {user1, Collections.emptyList(), \"user1\", \"\", \"\", \"\", true},\n      {user1, Collections.emptyList(), \"user1\", \"\", \"user2\", \"\", true},\n      {user1, List.of(groupWithUser2), \"user1\", \"\", \"\", \"groupWithUser2\", true},\n      {user1, List.of(groupWithUser1), \"\", \"groupWithUser1\", \"\", \"\", true},\n      {user2, List.of(groupWithUser1), \"user2\", \"groupWithUser1\", \"\", \"\", true},\n      {\n        user1,\n        List.of(groupWithUser1, groupWithUser2),\n        \"\",\n        \"groupWithUser1\",\n        \"\",\n        \"groupWithUser2\",\n        true\n      },\n      {user1, Collections.emptyList(), \"user1\", \"\", \"user1\", \"\", false},\n      {user2, Collections.emptyList(), \"user1\", \"\", \"\", \"\", false},\n      {user2, Collections.emptyList(), \"user1\", \"\", \"user2\", \"\", false},\n      {user2, List.of(groupWithUser1), \"\", \"groupWithUser1\", \"\", \"\", false},\n      {user1, Collections.emptyList(), \"\", \"\", \"user1\", \"\", false},\n      {user1, List.of(groupWithUser1), \"\", \"\", \"\", \"groupWithUser1\", false},\n      {user1, List.of(groupWithUser1), \"\", \"groupWithUser1\", \"\", \"groupWithUser1\", false},\n      {\n        user2,\n        List.of(groupWithUser1, groupWithUser2),\n        \"\",\n        \"groupWithUser1\",\n        \"\",\n        \"groupWithUser2\",\n        false\n      },\n    };\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/devfile/OpenshiftComponentToWorkspaceApplierTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.devfile;\n\nimport static io.fabric8.kubernetes.client.utils.Serialization.unmarshal;\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.emptyMap;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.OPENSHIFT_COMPONENT_TYPE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.MultiHostExternalServiceExposureStrategy.MULTI_HOST_STRATEGY;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.server.external.SingleHostExternalServiceExposureStrategy.SINGLE_HOST_STRATEGY;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.KubernetesList;\nimport java.io.IOException;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EndpointImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesComponentToWorkspaceApplier;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesEnvironmentProvisioner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.EnvVars;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\nimport org.testng.reporters.Files;\n\n@Listeners(MockitoTestNGListener.class)\npublic class OpenshiftComponentToWorkspaceApplierTest {\n  public static final String REFERENCE_FILENAME = \"reference.yaml\";\n  public static final String COMPONENT_NAME = \"foo\";\n\n  private WorkspaceConfigImpl workspaceConfig;\n\n  private KubernetesComponentToWorkspaceApplier applier;\n  @Mock private KubernetesEnvironmentProvisioner k8sEnvProvisioner;\n  @Mock private KubernetesRecipeParser k8sRecipeParser;\n  @Mock private FileContentProvider contentProvider;\n  @Mock private EnvVars envVars;\n\n  @BeforeMethod\n  public void setUp() {\n    Set<String> k8sBasedComponents = new HashSet<>();\n    k8sBasedComponents.add(KUBERNETES_COMPONENT_TYPE);\n    applier =\n        new OpenshiftComponentToWorkspaceApplier(\n            k8sRecipeParser, k8sEnvProvisioner, envVars, MULTI_HOST_STRATEGY, k8sBasedComponents);\n\n    workspaceConfig = new WorkspaceConfigImpl();\n  }\n\n  @Test\n  public void shouldProvisionEnvironmentWithCorrectRecipeTypeAndContentFromOSList()\n      throws Exception {\n    // given\n    doReturn(emptyList()).when(k8sRecipeParser).parse(anyString());\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    when(contentProvider.fetchContent(anyString())).thenReturn(\"content\");\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    verify(k8sEnvProvisioner)\n        .provision(workspaceConfig, OpenShiftEnvironment.TYPE, emptyList(), emptyMap());\n  }\n\n  @Test\n  public void serverCantHaveRequireSubdomainWhenSinglehostDevfileExpose()\n      throws DevfileException, IOException, ValidationException, InfrastructureException {\n    Set<String> openshiftBasedComponents = new HashSet<>();\n    openshiftBasedComponents.add(OPENSHIFT_COMPONENT_TYPE);\n    applier =\n        new OpenshiftComponentToWorkspaceApplier(\n            k8sRecipeParser,\n            k8sEnvProvisioner,\n            envVars,\n            SINGLE_HOST_STRATEGY,\n            openshiftBasedComponents);\n\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());\n\n    // given\n    ComponentImpl component = new ComponentImpl();\n    component.setType(OPENSHIFT_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    component.setEndpoints(\n        Arrays.asList(\n            new EndpointImpl(\"e1\", 1111, emptyMap()), new EndpointImpl(\"e2\", 2222, emptyMap())));\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    @SuppressWarnings(\"unchecked\")\n    ArgumentCaptor<Map<String, MachineConfigImpl>> objectsCaptor =\n        ArgumentCaptor.forClass(Map.class);\n    verify(k8sEnvProvisioner).provision(any(), any(), any(), objectsCaptor.capture());\n    Map<String, MachineConfigImpl> machineConfigs = objectsCaptor.getValue();\n    assertEquals(machineConfigs.size(), 4);\n    machineConfigs\n        .values()\n        .forEach(\n            machineConfig -> {\n              assertEquals(machineConfig.getServers().size(), 2);\n              assertFalse(\n                  ServerConfig.isRequireSubdomain(\n                      machineConfig.getServers().get(\"e1\").getAttributes()));\n              assertFalse(\n                  ServerConfig.isRequireSubdomain(\n                      machineConfig.getServers().get(\"e2\").getAttributes()));\n            });\n  }\n\n  @Test\n  public void serverMustHaveRequireSubdomainWhenNonSinglehostDevfileExpose()\n      throws DevfileException, IOException, ValidationException, InfrastructureException {\n    Set<String> openshiftBasedComponents = new HashSet<>();\n    openshiftBasedComponents.add(OPENSHIFT_COMPONENT_TYPE);\n    applier =\n        new OpenshiftComponentToWorkspaceApplier(\n            k8sRecipeParser,\n            k8sEnvProvisioner,\n            envVars,\n            MULTI_HOST_STRATEGY,\n            openshiftBasedComponents);\n\n    String yamlRecipeContent = getResource(\"devfile/petclinic.yaml\");\n    when(contentProvider.fetchContent(anyString())).thenReturn(yamlRecipeContent);\n    doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());\n\n    // given\n    ComponentImpl component = new ComponentImpl();\n    component.setType(OPENSHIFT_COMPONENT_TYPE);\n    component.setReference(REFERENCE_FILENAME);\n    component.setAlias(COMPONENT_NAME);\n    component.setEndpoints(\n        Arrays.asList(\n            new EndpointImpl(\"e1\", 1111, emptyMap()), new EndpointImpl(\"e2\", 2222, emptyMap())));\n\n    // when\n    applier.apply(workspaceConfig, component, contentProvider);\n\n    // then\n    @SuppressWarnings(\"unchecked\")\n    ArgumentCaptor<Map<String, MachineConfigImpl>> objectsCaptor =\n        ArgumentCaptor.forClass(Map.class);\n    verify(k8sEnvProvisioner).provision(any(), any(), any(), objectsCaptor.capture());\n    Map<String, MachineConfigImpl> machineConfigs = objectsCaptor.getValue();\n    assertEquals(machineConfigs.size(), 4);\n    machineConfigs\n        .values()\n        .forEach(\n            machineConfig -> {\n              assertEquals(machineConfig.getServers().size(), 2);\n              assertTrue(\n                  ServerConfig.isRequireSubdomain(\n                      machineConfig.getServers().get(\"e1\").getAttributes()));\n              assertTrue(\n                  ServerConfig.isRequireSubdomain(\n                      machineConfig.getServers().get(\"e2\").getAttributes()));\n            });\n  }\n\n  private KubernetesList toK8SList(String content) {\n    return unmarshal(content, KubernetesList.class);\n  }\n\n  private String getResource(String resourceName) throws IOException {\n    return Files.readFile(getClass().getClassLoader().getResourceAsStream(resourceName));\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/environment/OpenShiftEnvironmentFactoryTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.environment;\n\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.environment.PodMerger.DEPLOYMENT_NAME_LABEL;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ConfigMapBuilder;\nimport io.fabric8.kubernetes.api.model.Container;\nimport io.fabric8.kubernetes.api.model.HasMetadata;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaim;\nimport io.fabric8.kubernetes.api.model.PersistentVolumeClaimBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.PodTemplateSpec;\nimport io.fabric8.kubernetes.api.model.PodTemplateSpecBuilder;\nimport io.fabric8.kubernetes.api.model.Quantity;\nimport io.fabric8.kubernetes.api.model.ResourceRequirements;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.SecretBuilder;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServiceBuilder;\nimport io.fabric8.kubernetes.api.model.apps.Deployment;\nimport io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;\nimport io.fabric8.openshift.api.model.Route;\nimport io.fabric8.openshift.api.model.RouteBuilder;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalRecipe;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Names;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.PodMerger;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link OpenShiftEnvironmentFactory}.\n *\n * @author Anton Korneta\n */\n@Listeners(MockitoTestNGListener.class)\npublic class OpenShiftEnvironmentFactoryTest {\n\n  private static final String MACHINE_NAME_1 = \"machine1\";\n  private static final String MACHINE_NAME_2 = \"machine2\";\n\n  private OpenShiftEnvironmentFactory osEnvFactory;\n\n  @Mock private OpenShiftEnvironmentValidator openShiftEnvValidator;\n  @Mock private InternalRecipe internalRecipe;\n  @Mock private InternalMachineConfig machineConfig1;\n  @Mock private InternalMachineConfig machineConfig2;\n  @Mock private KubernetesRecipeParser k8sRecipeParser;\n  @Mock private PodMerger podMerger;\n\n  private Map<String, InternalMachineConfig> machines;\n\n  @BeforeMethod\n  public void setup() throws Exception {\n    osEnvFactory =\n        new OpenShiftEnvironmentFactory(\n            null, null, openShiftEnvValidator, k8sRecipeParser, podMerger);\n    machines = ImmutableMap.of(MACHINE_NAME_1, machineConfig1, MACHINE_NAME_2, machineConfig2);\n  }\n\n  @Test\n  public void shouldCreateOpenShiftEnvironmentWithServicesFromRecipe() throws Exception {\n    // given\n    Service service1 =\n        new ServiceBuilder().withNewMetadata().withName(\"service1\").endMetadata().build();\n    Service service2 =\n        new ServiceBuilder().withNewMetadata().withName(\"service2\").endMetadata().build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(asList(service1, service2));\n\n    // when\n    KubernetesEnvironment osEnv = osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    assertEquals(osEnv.getServices().size(), 2);\n    assertEquals(osEnv.getServices().get(\"service1\"), service1);\n    assertEquals(osEnv.getServices().get(\"service2\"), service2);\n  }\n\n  @Test\n  public void shouldCreateOpenShiftEnvironmentWithPVCsFromRecipe() throws Exception {\n    // given\n    PersistentVolumeClaim pvc1 =\n        new PersistentVolumeClaimBuilder().withNewMetadata().withName(\"pvc1\").endMetadata().build();\n    PersistentVolumeClaim pvc2 =\n        new PersistentVolumeClaimBuilder().withNewMetadata().withName(\"pvc2\").endMetadata().build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(asList(pvc1, pvc2));\n\n    // when\n    OpenShiftEnvironment osEnv = osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    assertEquals(osEnv.getPersistentVolumeClaims().size(), 2);\n    assertEquals(osEnv.getPersistentVolumeClaims().get(\"pvc1\"), pvc1);\n    assertEquals(osEnv.getPersistentVolumeClaims().get(\"pvc2\"), pvc2);\n  }\n\n  @Test\n  public void addRoutesWhenRecipeContainsThem() throws Exception {\n    Route route = new RouteBuilder().withNewMetadata().withName(\"test-route\").endMetadata().build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(route));\n\n    final OpenShiftEnvironment parsed =\n        osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    assertEquals(parsed.getRoutes().size(), 1);\n    assertEquals(\n        parsed.getRoutes().get(\"test-route\").getMetadata().getName(),\n        route.getMetadata().getName());\n  }\n\n  @Test\n  public void addSecretsWhenRecipeContainsThem() throws Exception {\n    Secret secret =\n        new SecretBuilder().withNewMetadata().withName(\"test-secret\").endMetadata().build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(secret));\n\n    final OpenShiftEnvironment parsed =\n        osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    assertEquals(parsed.getSecrets().size(), 1);\n    assertEquals(\n        parsed.getSecrets().get(\"test-secret\").getMetadata().getName(),\n        secret.getMetadata().getName());\n  }\n\n  @Test\n  public void addConfigMapsWhenRecipeContainsThem() throws Exception {\n    ConfigMap configMap =\n        new ConfigMapBuilder().withNewMetadata().withName(\"test-configmap\").endMetadata().build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(configMap));\n\n    final KubernetesEnvironment parsed =\n        osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    assertEquals(parsed.getConfigMaps().size(), 1);\n    assertEquals(\n        parsed.getConfigMaps().values().iterator().next().getMetadata().getName(),\n        configMap.getMetadata().getName());\n  }\n\n  @Test\n  public void addPodsWhenRecipeContainsThem() throws Exception {\n    // given\n    Pod pod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"pod\")\n            .endMetadata()\n            .withSpec(new PodSpec())\n            .build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(pod));\n\n    // when\n    KubernetesEnvironment osEnv = osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    assertEquals(osEnv.getPodsCopy().size(), 1);\n    assertEquals(osEnv.getPodsCopy().get(\"pod\"), pod);\n\n    assertEquals(osEnv.getPodsData().size(), 1);\n    assertEquals(osEnv.getPodsData().get(\"pod\").getMetadata(), pod.getMetadata());\n    assertEquals(osEnv.getPodsData().get(\"pod\").getSpec(), pod.getSpec());\n  }\n\n  @Test\n  public void addDeploymentsWhenRecipeContainsThem() throws Exception {\n    // given\n    PodTemplateSpec podTemplate =\n        new PodTemplateSpecBuilder()\n            .withNewMetadata()\n            .withName(\"deployment-pod\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    Deployment deployment =\n        new DeploymentBuilder()\n            .withNewMetadata()\n            .withName(\"deployment-test\")\n            .endMetadata()\n            .withNewSpec()\n            .withTemplate(podTemplate)\n            .endSpec()\n            .build();\n\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(deployment));\n\n    // when\n    final KubernetesEnvironment osEnv =\n        osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    assertEquals(osEnv.getDeploymentsCopy().size(), 1);\n    assertEquals(osEnv.getDeploymentsCopy().get(\"deployment-test\"), deployment);\n\n    assertEquals(osEnv.getPodsData().size(), 1);\n    assertEquals(\n        osEnv.getPodsData().get(\"deployment-test\").getMetadata(), podTemplate.getMetadata());\n    assertEquals(osEnv.getPodsData().get(\"deployment-test\").getSpec(), podTemplate.getSpec());\n  }\n\n  @Test\n  public void shouldUseDeploymentNameAsPodTemplateNameIfItIsMissing() throws Exception {\n    // given\n    PodTemplateSpec podTemplate = new PodTemplateSpecBuilder().withNewSpec().endSpec().build();\n    Deployment deployment =\n        new DeploymentBuilder()\n            .withNewMetadata()\n            .withName(\"deployment-test\")\n            .endMetadata()\n            .withNewSpec()\n            .withTemplate(podTemplate)\n            .endSpec()\n            .build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(asList(deployment));\n\n    // when\n    final KubernetesEnvironment k8sEnv =\n        osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    Deployment deploymentTest = k8sEnv.getDeploymentsCopy().get(\"deployment-test\");\n    assertNotNull(deploymentTest);\n    PodTemplateSpec resultPodTemplate = deploymentTest.getSpec().getTemplate();\n    assertEquals(resultPodTemplate.getMetadata().getName(), \"deployment-test\");\n  }\n\n  @Test\n  public void shouldMergeDeploymentAndPodIntoOneDeployment() throws Exception {\n    // given\n    PodTemplateSpec podTemplate =\n        new PodTemplateSpecBuilder()\n            .withNewMetadata()\n            .withName(\"deployment-pod\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    Deployment deployment =\n        new DeploymentBuilder()\n            .withNewMetadata()\n            .withName(\"deployment-test\")\n            .endMetadata()\n            .withNewSpec()\n            .withTemplate(podTemplate)\n            .endSpec()\n            .build();\n    Pod pod =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"bare-pod\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(asList(deployment, pod));\n    Deployment merged = createEmptyDeployment(\"merged\");\n    when(podMerger.merge(any())).thenReturn(merged);\n\n    // when\n    final KubernetesEnvironment k8sEnv =\n        osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    verify(podMerger).merge(asList(new PodData(pod), new PodData(deployment)));\n    assertEquals(k8sEnv.getPodsData().size(), 1);\n\n    assertTrue(k8sEnv.getPodsCopy().isEmpty());\n\n    assertEquals(k8sEnv.getDeploymentsCopy().size(), 1);\n    assertEquals(k8sEnv.getDeploymentsCopy().get(\"merged\"), merged);\n  }\n\n  @Test\n  public void shouldReconfigureServiceToMatchMergedDeployment() throws Exception {\n    // given\n    Pod pod1 =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"bare-pod1\")\n            .withLabels(ImmutableMap.of(\"name\", \"pod1\"))\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    Pod pod2 =\n        new PodBuilder()\n            .withNewMetadata()\n            .withName(\"bare-pod2\")\n            .withLabels(ImmutableMap.of(\"name\", \"pod2\"))\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    Service service1 =\n        new ServiceBuilder()\n            .withNewMetadata()\n            .withName(\"pod1-service\")\n            .endMetadata()\n            .withNewSpec()\n            .withSelector(ImmutableMap.of(\"name\", \"pod1\"))\n            .endSpec()\n            .build();\n    Service service2 =\n        new ServiceBuilder()\n            .withNewMetadata()\n            .withName(\"pod2-service\")\n            .endMetadata()\n            .withNewSpec()\n            .withSelector(ImmutableMap.of(\"name\", \"pod2\"))\n            .endSpec()\n            .build();\n    when(k8sRecipeParser.parse(any(InternalRecipe.class)))\n        .thenReturn(asList(pod1, pod2, service1, service2));\n    Deployment merged = createEmptyDeployment(\"merged\");\n    when(podMerger.merge(any())).thenReturn(merged);\n\n    // when\n    final KubernetesEnvironment k8sEnv =\n        osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n\n    // then\n    verify(podMerger).merge(asList(new PodData(pod1), new PodData(pod2)));\n    PodData mergedPodData = k8sEnv.getPodsData().get(\"merged\");\n    assertEquals(mergedPodData.getMetadata().getLabels().get(DEPLOYMENT_NAME_LABEL), \"merged\");\n    assertTrue(\n        k8sEnv.getServices().values().stream()\n            .allMatch(\n                s ->\n                    ImmutableMap.of(DEPLOYMENT_NAME_LABEL, \"merged\")\n                        .equals(s.getSpec().getSelector())));\n  }\n\n  @Test(expectedExceptions = ValidationException.class)\n  public void exceptionOnRecipeLoadError() throws Exception {\n    when(k8sRecipeParser.parse(any(InternalRecipe.class)))\n        .thenThrow(new ValidationException(\"Could not parse recipe\"));\n\n    osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Environment can not contain two 'Service' objects with the same name 'db'\")\n  public void exceptionOnObjectsWithTheSameNameAndKind() throws Exception {\n    HasMetadata object1 =\n        new ServiceBuilder().withNewMetadata().withName(\"db\").endMetadata().build();\n    HasMetadata object2 =\n        new ServiceBuilder().withNewMetadata().withName(\"db\").endMetadata().build();\n\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(asList(object1, object2));\n\n    osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Environment contains object without specified kind field\")\n  public void exceptionOnObjectWithNoKindSpecified() throws Exception {\n    HasMetadata object = mock(HasMetadata.class);\n    when(object.getKind()).thenReturn(null);\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(object));\n\n    osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"MyObject metadata must not be null\")\n  public void exceptionOnObjectWithNoMetadataSpecified() throws Exception {\n    HasMetadata object = mock(HasMetadata.class);\n    when(object.getKind()).thenReturn(\"MyObject\");\n    when(object.getMetadata()).thenReturn(null);\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(object));\n\n    osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"MyObject name must not be null\")\n  public void exceptionOnObjectWithNoNameSpecified() throws Exception {\n    HasMetadata object = mock(HasMetadata.class);\n    when(object.getKind()).thenReturn(\"MyObject\");\n    when(object.getMetadata()).thenReturn(new ObjectMetaBuilder().withName(null).build());\n    when(k8sRecipeParser.parse(any(InternalRecipe.class))).thenReturn(singletonList(object));\n\n    osEnvFactory.doCreate(internalRecipe, emptyMap(), emptyList());\n  }\n\n  /** If provided {@code ramLimit} is {@code null} ram limit won't be set in POD */\n  private static PodData createPodData(String machineName, Long ramLimit, Long ramRequest) {\n    final String containerName = \"container_\" + machineName;\n    final Container containerMock = mock(Container.class);\n    final Pod podMock = mock(Pod.class);\n    final PodSpec specMock = mock(PodSpec.class);\n    final ObjectMeta metadataMock = mock(ObjectMeta.class);\n    when(podMock.getSpec()).thenReturn(specMock);\n    when(podMock.getMetadata()).thenReturn(metadataMock);\n    final ResourceRequirements resourcesMock = mock(ResourceRequirements.class);\n    when(containerMock.getResources()).thenReturn(resourcesMock);\n    if (ramLimit != null) {\n      final Quantity limitQuantityMock = mock(Quantity.class);\n      when(limitQuantityMock.getAmount()).thenReturn(String.valueOf(ramLimit));\n      when(resourcesMock.getLimits()).thenReturn(ImmutableMap.of(\"memory\", limitQuantityMock));\n    }\n    if (ramRequest != null) {\n      final Quantity requestQuantityMock = mock(Quantity.class);\n      when(requestQuantityMock.getAmount()).thenReturn(String.valueOf(ramRequest));\n      when(resourcesMock.getRequests()).thenReturn(ImmutableMap.of(\"memory\", requestQuantityMock));\n    }\n    when(containerMock.getName()).thenReturn(containerName);\n    when(metadataMock.getAnnotations())\n        .thenReturn(Names.createMachineNameAnnotations(containerName, machineName));\n    when(specMock.getContainers()).thenReturn(ImmutableList.of(containerMock));\n    return new PodData(specMock, metadataMock);\n  }\n\n  private Deployment createEmptyDeployment(String name) {\n    return new DeploymentBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .endMetadata()\n        .withNewSpec()\n        .withNewTemplate()\n        .withNewMetadata()\n        .endMetadata()\n        .withNewSpec()\n        .endSpec()\n        .endTemplate()\n        .endSpec()\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/environment/OpenShiftEnvironmentValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.environment;\n\nimport static org.mockito.Mockito.when;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServiceBuilder;\nimport io.fabric8.openshift.api.model.Route;\nimport io.fabric8.openshift.api.model.RouteBuilder;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironmentPodsValidator;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link OpenShiftEnvironmentValidator}.\n *\n * @author Angel Misevski\n */\n@Listeners(MockitoTestNGListener.class)\npublic class OpenShiftEnvironmentValidatorTest {\n  @Mock private KubernetesEnvironmentPodsValidator podsValidator;\n\n  @Mock private OpenShiftEnvironment environment;\n\n  @InjectMocks private OpenShiftEnvironmentValidator envValidator;\n\n  @Test\n  public void shouldDoNothingWhenRoutesMatchServices() throws Exception {\n    // Given\n    Map<String, Service> services = ImmutableMap.of(\"service1\", makeService(\"service1\"));\n    Map<String, Route> routes = ImmutableMap.of(\"route1\", makeRoute(\"route1\", \"service1\"));\n    when(environment.getRoutes()).thenReturn(routes);\n    when(environment.getServices()).thenReturn(services);\n\n    // When\n    envValidator.validate(environment);\n\n    // Then (nothing)\n  }\n\n  @Test\n  public void shouldDoNothingWhenRoutesDoNotHaveToField() throws Exception {\n    // Given\n    Map<String, Route> routes = ImmutableMap.of(\"route1\", makeRoute(\"route1\", null));\n    when(environment.getRoutes()).thenReturn(routes);\n\n    // When\n    envValidator.validate(environment);\n\n    // Then (nothing)\n  }\n\n  @Test(expectedExceptions = ValidationException.class)\n  public void shouldThrowExceptionWhenRouteRefersToMissingService() throws Exception {\n    // Given\n    Map<String, Service> services = ImmutableMap.of(\"service1\", makeService(\"service1\"));\n    Map<String, Route> routes = ImmutableMap.of(\"route1\", makeRoute(\"route1\", \"notservice1\"));\n    when(environment.getRoutes()).thenReturn(routes);\n    when(environment.getServices()).thenReturn(services);\n\n    // When\n    envValidator.validate(environment);\n\n    // Then (ValidationException)\n  }\n\n  private Service makeService(String serviceName) {\n    return new ServiceBuilder()\n        .withNewMetadata()\n        .withName(serviceName)\n        .endMetadata()\n        .withNewSpec()\n        .endSpec()\n        .build();\n  }\n\n  /**\n   * Make route for use in tests. If serviceName is null, return a route that does not refer to a\n   * service.\n   */\n  private Route makeRoute(String routeName, String serviceName) {\n    RouteBuilder routeBuilder =\n        new RouteBuilder().withNewMetadata().withName(routeName).endMetadata();\n    if (serviceName != null) {\n      routeBuilder\n          .withNewSpec()\n          .withNewTo()\n          .withKind(\"Service\")\n          .withName(serviceName)\n          .endTo()\n          .endSpec();\n    } else {\n      routeBuilder.withNewSpec().endSpec();\n    }\n    return routeBuilder.build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/multiuser/oauth/OpenshiftTokenInitializationFilterTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.multiuser.oauth;\n\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.*;\n\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.openshift.api.model.User;\nimport io.fabric8.openshift.client.OpenShiftClient;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.user.server.UserManager;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.multiuser.api.authentication.commons.SessionStore;\nimport org.eclipse.che.multiuser.api.authentication.commons.token.RequestTokenExtractor;\nimport org.eclipse.che.multiuser.api.permission.server.PermissionChecker;\nimport org.eclipse.che.workspace.infrastructure.openshift.OpenShiftClientFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class OpenshiftTokenInitializationFilterTest {\n  @Mock private SessionStore sessionStore;\n  @Mock private RequestTokenExtractor tokenExtractor;\n  @Mock private UserManager userManager;\n  @Mock private PermissionChecker permissionChecker;\n\n  @Mock private OpenShiftClientFactory openShiftClientFactory;\n  @Mock private OpenShiftClient openShiftClient;\n  @Mock private User openshiftUser;\n  @Mock private ObjectMeta openshiftUserMeta;\n\n  private static final String TOKEN = \"touken\";\n  private static final String USER_UID = \"almost-certainly-unique-id\";\n  private static final String USERNAME = \"test_username\";\n\n  private OpenshiftTokenInitializationFilter openshiftTokenInitializationFilter;\n\n  @BeforeMethod\n  public void setUp() throws InfrastructureException {\n    openshiftTokenInitializationFilter =\n        new OpenshiftTokenInitializationFilter(\n            sessionStore, tokenExtractor, openShiftClientFactory, userManager, permissionChecker);\n  }\n\n  @Test\n  public void getUserIdGetsCurrentUserWithAuthenticatedOCClient() {\n    when(openShiftClientFactory.createAuthenticatedClient(TOKEN)).thenReturn(openShiftClient);\n    when(openShiftClient.currentUser()).thenReturn(openshiftUser);\n    when(openshiftUser.getMetadata()).thenReturn(openshiftUserMeta);\n    when(openshiftUserMeta.getUid()).thenReturn(USER_UID);\n\n    User u = openshiftTokenInitializationFilter.processToken(TOKEN).get();\n    String userId = openshiftTokenInitializationFilter.getUserId(u);\n\n    assertEquals(u, openshiftUser);\n    assertEquals(userId, USER_UID);\n    verify(openShiftClientFactory).createAuthenticatedClient(TOKEN);\n    verify(openShiftClient).currentUser();\n  }\n\n  @Test\n  public void shouldBeAbleToHandleKubeAdminUserWithoutUid()\n      throws ServerException, ConflictException {\n    String KUBE_ADMIN_USERNAME = \"kube:admin\";\n    when(openShiftClientFactory.createAuthenticatedClient(TOKEN)).thenReturn(openShiftClient);\n    when(openShiftClient.currentUser()).thenReturn(openshiftUser);\n    when(openshiftUser.getMetadata()).thenReturn(openshiftUserMeta);\n    when(openshiftUserMeta.getUid()).thenReturn(null);\n    when(openshiftUserMeta.getName()).thenReturn(KUBE_ADMIN_USERNAME);\n    when(userManager.getOrCreateUser(KUBE_ADMIN_USERNAME, KUBE_ADMIN_USERNAME))\n        .thenReturn(\n            new UserImpl(KUBE_ADMIN_USERNAME, KUBE_ADMIN_USERNAME + \"@che\", KUBE_ADMIN_USERNAME));\n\n    User u = openshiftTokenInitializationFilter.processToken(TOKEN).get();\n    Subject subject = openshiftTokenInitializationFilter.extractSubject(TOKEN, u);\n\n    assertEquals(subject.getUserId(), KUBE_ADMIN_USERNAME);\n    assertEquals(subject.getUserName(), KUBE_ADMIN_USERNAME);\n  }\n\n  @Test\n  public void extractSubjectCreatesSubjectWithCurrentlyAuthenticatedUser()\n      throws ServerException, ConflictException {\n    when(openShiftClientFactory.createAuthenticatedClient(TOKEN)).thenReturn(openShiftClient);\n    when(openShiftClient.currentUser()).thenReturn(openshiftUser);\n    when(openshiftUser.getMetadata()).thenReturn(openshiftUserMeta);\n    when(openshiftUserMeta.getUid()).thenReturn(USER_UID);\n    when(openshiftUserMeta.getName()).thenReturn(USERNAME);\n    when(userManager.getOrCreateUser(USER_UID, USERNAME))\n        .thenReturn(new UserImpl(USER_UID, USERNAME + \"@che\", USERNAME));\n\n    User u = openshiftTokenInitializationFilter.processToken(TOKEN).get();\n    Subject subject = openshiftTokenInitializationFilter.extractSubject(TOKEN, u);\n\n    assertEquals(u, openshiftUser);\n    assertEquals(subject.getUserId(), USER_UID);\n    assertEquals(subject.getUserName(), USERNAME);\n  }\n\n  @Test\n  public void invalidTokenShouldBeHandledAsMissing() throws Exception {\n    when(openShiftClientFactory.createAuthenticatedClient(TOKEN)).thenReturn(openShiftClient);\n    when(openShiftClient.currentUser())\n        .thenThrow(new KubernetesClientException(\"failah\", 401, null));\n\n    Optional<User> u = openshiftTokenInitializationFilter.processToken(TOKEN);\n    assertTrue(u.isEmpty());\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/project/OpenShiftProjectFactoryTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.project;\n\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.emptySet;\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta.DEFAULT_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta.PHASE_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.CREDENTIALS_SECRET_NAME;\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.AbstractWorkspaceServiceAccount.PREFERENCES_CONFIGMAP_NAME;\nimport static org.eclipse.che.workspace.infrastructure.openshift.Constants.PROJECT_DESCRIPTION_ANNOTATION;\nimport static org.eclipse.che.workspace.infrastructure.openshift.Constants.PROJECT_DESCRIPTION_ATTRIBUTE;\nimport static org.eclipse.che.workspace.infrastructure.openshift.Constants.PROJECT_DISPLAY_NAME_ANNOTATION;\nimport static org.eclipse.che.workspace.infrastructure.openshift.Constants.PROJECT_DISPLAY_NAME_ATTRIBUTE;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNull;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ConfigMap;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Secret;\nimport io.fabric8.kubernetes.api.model.Status;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable;\nimport io.fabric8.kubernetes.client.dsl.MixedOperation;\nimport io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport io.fabric8.openshift.api.model.Project;\nimport io.fabric8.openshift.api.model.ProjectBuilder;\nimport io.fabric8.openshift.api.model.ProjectList;\nimport io.fabric8.openshift.client.OpenShiftClient;\nimport io.fabric8.openshift.client.dsl.ProjectOperation;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.user.server.PreferenceManager;\nimport org.eclipse.che.api.workspace.server.model.impl.RuntimeIdentityImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.inject.ConfigurationException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.AuthorizationChecker;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.authorization.PermissionsCleaner;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesConfigsMaps;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesSecrets;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.NamespaceConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.configurator.PreferencesConfigMapConfigurator;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.util.KubernetesSharedPool;\nimport org.eclipse.che.workspace.infrastructure.openshift.CheServerOpenshiftClientFactory;\nimport org.eclipse.che.workspace.infrastructure.openshift.OpenShiftClientFactory;\nimport org.eclipse.che.workspace.infrastructure.openshift.project.configurator.OpenShiftWorkspaceServiceAccountConfigurator;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.Assert;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Ignore;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link OpenShiftProjectFactory}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class OpenShiftProjectFactoryTest {\n\n  private static final String USER_ID = \"2342-2559-234\";\n  private static final String USER_NAME = \"johndoe\";\n  private static final String NAMESPACE_LABEL_NAME = \"component\";\n  private static final String NAMESPACE_LABELS = NAMESPACE_LABEL_NAME + \"=workspace\";\n  private static final String NAMESPACE_ANNOTATION_NAME = \"owner\";\n  private static final String NAMESPACE_ANNOTATIONS = NAMESPACE_ANNOTATION_NAME + \"=<username>\";\n\n  //  @Mock private OpenShiftClientConfigFactory configFactory;\n  @Mock private OpenShiftClientFactory openShiftClientFactory;\n  @Mock private CheServerKubernetesClientFactory cheServerKubernetesClientFactory;\n  @Mock private CheServerOpenshiftClientFactory cheServerOpenshiftClientFactory;\n  @Mock private PreferenceManager preferenceManager;\n  @Mock private KubernetesSharedPool pool;\n  @Mock private AuthorizationChecker authorizationChecker;\n  @Mock private PermissionsCleaner permissionsCleaner;\n\n  @Mock private ProjectOperation projectOperation;\n\n  @Mock private Resource<Project> projectResource;\n\n  @Mock private OpenShiftClient osClient;\n\n  private OpenShiftProjectFactory projectFactory;\n\n  @Mock\n  private FilterWatchListDeletable<Project, ProjectList, Resource<Project>> projectListResource;\n\n  @Mock private ProjectList projectList;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    lenient().when(openShiftClientFactory.createOC()).thenReturn(osClient);\n    lenient().when(cheServerOpenshiftClientFactory.create()).thenReturn(osClient);\n    lenient().when(cheServerOpenshiftClientFactory.createOC()).thenReturn(osClient);\n    lenient().when(cheServerKubernetesClientFactory.create()).thenReturn(osClient);\n    lenient().when(osClient.projects()).thenReturn(projectOperation);\n    lenient().when(authorizationChecker.isAuthorized(any(Subject.class))).thenReturn(true);\n\n    lenient().when(projectOperation.withName(any())).thenReturn(projectResource);\n    lenient().when(projectResource.get()).thenReturn(mock(Project.class));\n\n    lenient().when(projectOperation.withLabels(any())).thenReturn(projectListResource);\n    lenient().when(projectListResource.list()).thenReturn(projectList);\n    lenient().when(projectList.getItems()).thenReturn(emptyList());\n\n    EnvironmentContext.getCurrent()\n        .setSubject(\n            new SubjectImpl(\n                USER_NAME, Collections.emptyList(), USER_ID, \"t-354t53xff34234\", false));\n  }\n\n  @AfterMethod\n  public void cleanup() {\n    EnvironmentContext.reset();\n  }\n\n  @Test\n  public void shouldNotThrowExceptionIfDefaultNamespaceIsSpecifiedOnCheckingIfNamespaceIsAllowed()\n      throws Exception {\n\n    projectFactory =\n        new OpenShiftProjectFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            true,\n            emptySet(),\n            openShiftClientFactory,\n            cheServerKubernetesClientFactory,\n            cheServerOpenshiftClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    projectFactory.checkIfNamespaceIsAllowed(USER_NAME + \"-che\");\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"User defined namespaces are not allowed. Only the default namespace 'johndoe-che' is available.\")\n  public void\n      shouldThrowExceptionIfNonDefaultNamespaceIsSpecifiedAndUserDefinedAreNotAllowedOnCheckingIfNamespaceIsAllowed()\n          throws Exception {\n    System.out.println(\"0--------\");\n    System.out.println(EnvironmentContext.getCurrent().getSubject());\n    System.out.println(\"2--------\");\n    projectFactory =\n        new OpenShiftProjectFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            true,\n            emptySet(),\n            openShiftClientFactory,\n            cheServerKubernetesClientFactory,\n            cheServerOpenshiftClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n    try {\n      projectFactory.checkIfNamespaceIsAllowed(\"any-namespace\");\n    } catch (ValidationException e) {\n      e.printStackTrace();\n      throw e;\n    }\n  }\n\n  @Test(\n      expectedExceptions = ConfigurationException.class,\n      expectedExceptionsMessageRegExp = \"che.infra.kubernetes.namespace.default must be configured\")\n  public void\n      shouldThrowExceptionIfNoDefaultNamespaceIsConfiguredAndUserDefinedNamespacesAreNotAllowed()\n          throws Exception {\n    projectFactory =\n        new OpenShiftProjectFactory(\n            null,\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            true,\n            emptySet(),\n            openShiftClientFactory,\n            cheServerKubernetesClientFactory,\n            cheServerOpenshiftClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n  }\n\n  @Test\n  public void shouldReturnPreparedNamespacesWhenFound() throws InfrastructureException {\n    // given\n    List<Project> projects =\n        Arrays.asList(\n            createProject(\n                \"ns1\", \"project1\", \"desc1\", \"Active\", Map.of(NAMESPACE_ANNOTATION_NAME, \"jondoe\")),\n            createProject(\n                \"ns3\",\n                \"project3\",\n                \"desc3\",\n                \"Active\",\n                Map.of(NAMESPACE_ANNOTATION_NAME, \"some_other_user\")),\n            createProject(\n                \"ns2\", \"project2\", \"desc2\", \"Active\", Map.of(NAMESPACE_ANNOTATION_NAME, \"jondoe\")));\n    doReturn(projects).when(projectList).getItems();\n\n    projectFactory =\n        new OpenShiftProjectFactory(\n            \"<userid>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            true,\n            emptySet(),\n            openShiftClientFactory,\n            cheServerKubernetesClientFactory,\n            cheServerOpenshiftClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"jondoe\", Collections.emptyList(), \"123\", null, false));\n\n    // when\n    List<KubernetesNamespaceMeta> availableNamespaces = projectFactory.list();\n\n    // then\n    assertEquals(availableNamespaces.size(), 2);\n    assertEquals(availableNamespaces.get(0).getName(), \"ns1\");\n    assertEquals(availableNamespaces.get(1).getName(), \"ns2\");\n  }\n\n  @Test\n  public void shouldNotThrowAnExceptionWhenNotAllowedToListNamespaces() throws Exception {\n    // given\n    Project p = createProject(\"ns1\", \"project1\", \"desc1\", \"Active\");\n    doThrow(new KubernetesClientException(\"Not allowed.\", 403, new Status()))\n        .when(projectList)\n        .getItems();\n    prepareNamespaceToBeFoundByName(\"u123-che\", p);\n\n    projectFactory =\n        new OpenShiftProjectFactory(\n            \"<userid>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            true,\n            emptySet(),\n            openShiftClientFactory,\n            cheServerKubernetesClientFactory,\n            cheServerOpenshiftClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"jondoe\", Collections.emptyList(), \"u123\", null, false));\n\n    // when\n    List<KubernetesNamespaceMeta> availableNamespaces = projectFactory.list();\n\n    // then\n    assertEquals(availableNamespaces.get(0).getName(), \"ns1\");\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void throwAnExceptionWhenErrorListingNamespaces() throws Exception {\n    // given\n    doThrow(new KubernetesClientException(\"Not allowed.\", 500, new Status()))\n        .when(projectList)\n        .getItems();\n\n    projectFactory =\n        new OpenShiftProjectFactory(\n            \"<userid>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            true,\n            emptySet(),\n            openShiftClientFactory,\n            cheServerKubernetesClientFactory,\n            cheServerOpenshiftClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    // when\n    projectFactory.list();\n\n    // then throw\n  }\n\n  @Test\n  public void shouldReturnDefaultProjectWhenItExistsAndUserDefinedIsNotAllowed() throws Exception {\n    prepareNamespaceToBeFoundByName(\n        USER_NAME + \"-che\",\n        new ProjectBuilder()\n            .withNewMetadata()\n            .withName(USER_NAME + \"-che\")\n            .withAnnotations(\n                ImmutableMap.of(\n                    PROJECT_DISPLAY_NAME_ANNOTATION,\n                    \"Default Che Project\",\n                    PROJECT_DESCRIPTION_ANNOTATION,\n                    \"some description\"))\n            .endMetadata()\n            .withNewStatus()\n            .withPhase(\"Active\")\n            .endStatus()\n            .build());\n\n    projectFactory =\n        new OpenShiftProjectFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            true,\n            emptySet(),\n            openShiftClientFactory,\n            cheServerKubernetesClientFactory,\n            cheServerOpenshiftClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    List<KubernetesNamespaceMeta> availableNamespaces = projectFactory.list();\n    assertEquals(availableNamespaces.size(), 1);\n    KubernetesNamespaceMeta defaultNamespace = availableNamespaces.get(0);\n    assertEquals(defaultNamespace.getName(), USER_NAME + \"-che\");\n    assertEquals(defaultNamespace.getAttributes().get(DEFAULT_ATTRIBUTE), \"true\");\n    assertEquals(\n        defaultNamespace.getAttributes().get(PROJECT_DISPLAY_NAME_ATTRIBUTE),\n        \"Default Che Project\");\n    assertEquals(\n        defaultNamespace.getAttributes().get(PROJECT_DESCRIPTION_ATTRIBUTE), \"some description\");\n    assertEquals(defaultNamespace.getAttributes().get(PHASE_ATTRIBUTE), \"Active\");\n  }\n\n  @Test\n  public void shouldReturnDefaultProjectWhenItDoesNotExistAndUserDefinedIsNotAllowed()\n      throws Exception {\n    throwOnTryToGetProjectByName(\n        USER_NAME + \"-che\", new KubernetesClientException(\"forbidden\", 403, null));\n\n    projectFactory =\n        new OpenShiftProjectFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            true,\n            emptySet(),\n            openShiftClientFactory,\n            cheServerKubernetesClientFactory,\n            cheServerOpenshiftClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    List<KubernetesNamespaceMeta> availableNamespaces = projectFactory.list();\n    assertEquals(availableNamespaces.size(), 1);\n    KubernetesNamespaceMeta defaultNamespace = availableNamespaces.get(0);\n    assertEquals(defaultNamespace.getName(), USER_NAME + \"-che\");\n    assertEquals(defaultNamespace.getAttributes().get(DEFAULT_ATTRIBUTE), \"true\");\n    assertNull(\n        defaultNamespace\n            .getAttributes()\n            .get(PHASE_ATTRIBUTE)); // no phase - means such project does not exist\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Error while trying to fetch the project 'johndoe-che'. Cause: connection refused\")\n  public void shouldThrowExceptionWhenFailedToGetInfoAboutDefaultNamespace() throws Exception {\n    throwOnTryToGetProjectByName(\n        USER_NAME + \"-che\", new KubernetesClientException(\"connection refused\"));\n\n    projectFactory =\n        new OpenShiftProjectFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            true,\n            emptySet(),\n            openShiftClientFactory,\n            cheServerKubernetesClientFactory,\n            cheServerOpenshiftClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    projectFactory.list();\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Error occurred when tried to list all available projects. Cause: connection refused\")\n  public void shouldThrowExceptionWhenFailedToGetNamespaces() throws Exception {\n    throwOnTryToGetProjectsList(new KubernetesClientException(\"connection refused\"));\n    projectFactory =\n        new OpenShiftProjectFactory(\n            \"<username>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            true,\n            emptySet(),\n            openShiftClientFactory,\n            cheServerKubernetesClientFactory,\n            cheServerOpenshiftClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    projectFactory.list();\n  }\n\n  @Test\n  public void shouldRequireNamespacePriorExistenceIfDifferentFromDefaultAndUserDefinedIsNotAllowed()\n      throws Exception {\n    // There is only one scenario where this can happen. The workspace was created and started in\n    // some default namespace. Then server was reconfigured to use a different default namespace\n    // AND the namespace of the workspace was MANUALLY deleted in the cluster. In this case, we\n    // should NOT try to re-create the namespace because it would be created in a namespace that\n    // is not configured. We DO allow it to start if the namespace still exists though.\n\n    // given\n    projectFactory =\n        spy(\n            new OpenShiftProjectFactory(\n                \"<userid>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                true,\n                emptySet(),\n                openShiftClientFactory,\n                cheServerKubernetesClientFactory,\n                cheServerOpenshiftClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    OpenShiftProject toReturnProject = mock(OpenShiftProject.class);\n    prepareProject(toReturnProject);\n    doReturn(toReturnProject).when(projectFactory).doCreateProjectAccess(any(), any());\n\n    // when\n    RuntimeIdentity identity =\n        new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"old-default\");\n    OpenShiftProject project = projectFactory.getOrCreate(identity);\n\n    // then\n    assertEquals(toReturnProject, project);\n    verify(toReturnProject).prepare(eq(true), eq(true), any(), any());\n  }\n\n  @Test\n  public void shouldCreatePreferencesConfigmapIfNotExists() throws Exception {\n    // given\n    projectFactory =\n        spy(\n            new OpenShiftProjectFactory(\n                \"<userid>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                true,\n                Set.of(new PreferencesConfigMapConfigurator(cheServerKubernetesClientFactory)),\n                openShiftClientFactory,\n                cheServerKubernetesClientFactory,\n                cheServerOpenshiftClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    OpenShiftProject toReturnProject = mock(OpenShiftProject.class);\n    doReturn(toReturnProject).when(projectFactory).doCreateProjectAccess(any(), any());\n    when(toReturnProject.getName()).thenReturn(\"namespace123\");\n    NonNamespaceOperation namespaceOperation = mock(NonNamespaceOperation.class);\n    MixedOperation mixedOperation = mock(MixedOperation.class);\n    when(osClient.configMaps()).thenReturn(mixedOperation);\n    when(mixedOperation.inNamespace(anyString())).thenReturn(namespaceOperation);\n    Resource<ConfigMap> nullCm = mock(Resource.class);\n    when(namespaceOperation.withName(PREFERENCES_CONFIGMAP_NAME)).thenReturn(nullCm);\n\n    // when\n    RuntimeIdentity identity =\n        new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"workspace123\");\n    projectFactory.getOrCreate(identity);\n\n    // then\n    ArgumentCaptor<ConfigMap> configMapCaptor = ArgumentCaptor.forClass(ConfigMap.class);\n    verify(namespaceOperation).create(configMapCaptor.capture());\n    ConfigMap configmap = configMapCaptor.getValue();\n    Assert.assertEquals(configmap.getMetadata().getName(), PREFERENCES_CONFIGMAP_NAME);\n  }\n\n  @Test\n  public void shouldNotCreatePreferencesConfigmapIfExist() throws Exception {\n    // given\n    projectFactory =\n        spy(\n            new OpenShiftProjectFactory(\n                \"<userid>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                true,\n                Set.of(new PreferencesConfigMapConfigurator(cheServerKubernetesClientFactory)),\n                openShiftClientFactory,\n                cheServerKubernetesClientFactory,\n                cheServerOpenshiftClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    OpenShiftProject toReturnProject = mock(OpenShiftProject.class);\n    prepareProject(toReturnProject);\n    doReturn(toReturnProject).when(projectFactory).doCreateProjectAccess(any(), any());\n    when(toReturnProject.getName()).thenReturn(\"namespace123\");\n    NonNamespaceOperation namespaceOperation = mock(NonNamespaceOperation.class);\n    MixedOperation mixedOperation = mock(MixedOperation.class);\n    when(osClient.configMaps()).thenReturn(mixedOperation);\n    when(mixedOperation.inNamespace(anyString())).thenReturn(namespaceOperation);\n    Resource<ConfigMap> cmResource = mock(Resource.class);\n    when(namespaceOperation.withName(PREFERENCES_CONFIGMAP_NAME)).thenReturn(cmResource);\n    when(cmResource.get()).thenReturn(mock(ConfigMap.class));\n\n    // when\n    RuntimeIdentity identity =\n        new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"workspace123\");\n    projectFactory.getOrCreate(identity);\n\n    // then\n    verify(namespaceOperation, never()).create(any());\n  }\n\n  @Test\n  public void shouldCallStopWorkspaceRoleProvisionWhenIdentityProviderIsDefined() throws Exception {\n    var saConf =\n        spy(\n            new OpenShiftWorkspaceServiceAccountConfigurator(\n                \"serviceAccount\", \"\", cheServerOpenshiftClientFactory));\n    projectFactory =\n        spy(\n            new OpenShiftProjectFactory(\n                \"<userid>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                NAMESPACE_ANNOTATIONS,\n                true,\n                Set.of(saConf),\n                openShiftClientFactory,\n                cheServerKubernetesClientFactory,\n                cheServerOpenshiftClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    OpenShiftProject toReturnProject = mock(OpenShiftProject.class);\n    when(toReturnProject.getName()).thenReturn(\"workspace123\");\n    prepareProject(toReturnProject);\n    doReturn(toReturnProject).when(projectFactory).doCreateProjectAccess(any(), any());\n\n    OpenShiftWorkspaceServiceAccount serviceAccount = mock(OpenShiftWorkspaceServiceAccount.class);\n    doReturn(serviceAccount).when(saConf).createServiceAccount(\"workspace123\", \"workspace123\");\n\n    // when\n    RuntimeIdentity identity =\n        new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"workspace123\");\n    projectFactory.getOrCreate(identity);\n\n    // then\n    verify(serviceAccount).prepare();\n  }\n\n  @Ignore\n  @Test\n  public void testEvalNamespaceNameWhenPreparedNamespacesFound() throws InfrastructureException {\n    List<Project> projects =\n        Arrays.asList(\n            createProject(\n                \"ns1\", \"project1\", \"desc1\", \"Active\", Map.of(NAMESPACE_ANNOTATION_NAME, \"jondoe\")),\n            createProject(\n                \"ns3\",\n                \"project3\",\n                \"desc3\",\n                \"Active\",\n                Map.of(NAMESPACE_ANNOTATION_NAME, \"some_other_user\")),\n            createProject(\n                \"ns2\", \"project2\", \"desc2\", \"Active\", Map.of(NAMESPACE_ANNOTATION_NAME, \"jondoe\")));\n    doReturn(projects).when(projectList).getItems();\n\n    projectFactory =\n        new OpenShiftProjectFactory(\n            \"<userid>-che\",\n            true,\n            true,\n            true,\n            NAMESPACE_LABELS,\n            NAMESPACE_ANNOTATIONS,\n            true,\n            emptySet(),\n            openShiftClientFactory,\n            cheServerKubernetesClientFactory,\n            cheServerOpenshiftClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n\n    String namespace =\n        projectFactory.evaluateNamespaceName(\n            new NamespaceResolutionContext(\"workspace123\", \"user123\", \"jondoe\"));\n\n    assertEquals(namespace, \"ns1\");\n  }\n\n  @Test\n  public void testUsernamePlaceholderInLabelsIsNotEvaluated() throws InfrastructureException {\n    List<Project> projects =\n        singletonList(\n            createProject(\n                \"ns1\", \"project1\", \"desc1\", \"Active\", Map.of(NAMESPACE_ANNOTATION_NAME, \"jondoe\")));\n    doReturn(projects).when(projectList).getItems();\n\n    projectFactory =\n        new OpenShiftProjectFactory(\n            \"<userid>-che\",\n            true,\n            true,\n            true,\n            \"try_placeholder_here=<username>\",\n            NAMESPACE_ANNOTATIONS,\n            true,\n            emptySet(),\n            openShiftClientFactory,\n            cheServerKubernetesClientFactory,\n            cheServerOpenshiftClientFactory,\n            preferenceManager,\n            pool,\n            authorizationChecker,\n            permissionsCleaner);\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"jondoe\", Collections.emptyList(), \"123\", null, false));\n    projectFactory.list();\n\n    verify(projectOperation).withLabels(Map.of(\"try_placeholder_here\", \"<username>\"));\n  }\n\n  @Test\n  public void testUsernamePlaceholderInAnnotationsIsEvaluated() throws InfrastructureException {\n    // given\n    projectFactory =\n        spy(\n            new OpenShiftProjectFactory(\n                \"<userid>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                \"try_placeholder_here=<username>\",\n                true,\n                emptySet(),\n                openShiftClientFactory,\n                cheServerKubernetesClientFactory,\n                cheServerOpenshiftClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"jondoe\", Collections.emptyList(), \"123\", null, false));\n    OpenShiftProject toReturnProject = mock(OpenShiftProject.class);\n    prepareProject(toReturnProject);\n    doReturn(toReturnProject).when(projectFactory).doCreateProjectAccess(any(), any());\n\n    // when\n    RuntimeIdentity identity = new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"old-che\");\n    OpenShiftProject project = projectFactory.getOrCreate(identity);\n\n    // then\n    assertEquals(toReturnProject, project);\n    verify(toReturnProject)\n        .prepare(eq(true), eq(true), any(), eq(Map.of(\"try_placeholder_here\", \"jondoe\")));\n  }\n\n  @Test\n  public void testAllConfiguratorsAreCalledWhenCreatingProject() throws InfrastructureException {\n    // given\n    String projectName = \"testprojectname\";\n    NamespaceConfigurator configurator1 = Mockito.mock(NamespaceConfigurator.class);\n    NamespaceConfigurator configurator2 = Mockito.mock(NamespaceConfigurator.class);\n    Set<NamespaceConfigurator> namespaceConfigurators = Set.of(configurator1, configurator2);\n\n    projectFactory =\n        spy(\n            new OpenShiftProjectFactory(\n                \"<username>-che\",\n                true,\n                true,\n                true,\n                NAMESPACE_LABELS,\n                \"try_placeholder_here=<username>\",\n                true,\n                namespaceConfigurators,\n                openShiftClientFactory,\n                cheServerKubernetesClientFactory,\n                cheServerOpenshiftClientFactory,\n                preferenceManager,\n                pool,\n                authorizationChecker,\n                permissionsCleaner));\n    EnvironmentContext.getCurrent()\n        .setSubject(new SubjectImpl(\"jondoe\", Collections.emptyList(), \"123\", null, false));\n\n    OpenShiftProject toReturnProject = mock(OpenShiftProject.class);\n    when(toReturnProject.getName()).thenReturn(projectName);\n\n    RuntimeIdentity identity = new RuntimeIdentityImpl(\"workspace123\", null, USER_ID, \"old-che\");\n    doReturn(toReturnProject).when(projectFactory).get(identity);\n\n    // when\n    OpenShiftProject project = projectFactory.getOrCreate(identity);\n\n    // then\n    NamespaceResolutionContext resolutionCtx =\n        new NamespaceResolutionContext(\"workspace123\", \"123\", \"jondoe\");\n    verify(configurator1).configure(resolutionCtx, projectName);\n    verify(configurator2).configure(resolutionCtx, projectName);\n    assertEquals(project, toReturnProject);\n  }\n\n  private void prepareNamespaceToBeFoundByName(String name, Project project) throws Exception {\n    @SuppressWarnings(\"unchecked\")\n    Resource<Project> getProjectByNameOperation = mock(Resource.class);\n    when(projectOperation.withName(name)).thenReturn(getProjectByNameOperation);\n\n    when(getProjectByNameOperation.get()).thenReturn(project);\n  }\n\n  private void throwOnTryToGetProjectByName(String name, KubernetesClientException e)\n      throws Exception {\n    @SuppressWarnings(\"unchecked\")\n    Resource<Project> getProjectByNameOperation = mock(Resource.class);\n    when(projectOperation.withName(name)).thenReturn(getProjectByNameOperation);\n\n    when(getProjectByNameOperation.get()).thenThrow(e);\n  }\n\n  private void prepareListedProjects(List<Project> projects) throws Exception {\n    @SuppressWarnings(\"unchecked\")\n    ProjectList projectList = mock(ProjectList.class);\n    when(projectOperation.list()).thenReturn(projectList);\n\n    when(projectList.getItems()).thenReturn(projects);\n  }\n\n  private void prepareProject(OpenShiftProject project) throws InfrastructureException {\n    KubernetesSecrets secrets = mock(KubernetesSecrets.class);\n    lenient().when(project.secrets()).thenReturn(secrets);\n    KubernetesConfigsMaps configsMaps = mock(KubernetesConfigsMaps.class);\n    Secret secretMock = mock(Secret.class);\n    ObjectMeta objectMeta = mock(ObjectMeta.class);\n    lenient().when(objectMeta.getName()).thenReturn(CREDENTIALS_SECRET_NAME);\n    lenient().when(secretMock.getMetadata()).thenReturn(objectMeta);\n    lenient().when(secrets.get()).thenReturn(Collections.singletonList(secretMock));\n  }\n\n  private void throwOnTryToGetProjectsList(Throwable e) throws Exception {\n    when(projectListResource.list()).thenThrow(e);\n  }\n\n  private Project createProject(String name, String displayName, String description, String phase) {\n    return createProject(name, displayName, description, phase, emptyMap());\n  }\n\n  private Project createProject(\n      String name,\n      String displayName,\n      String description,\n      String phase,\n      Map<String, String> extraAnnotations) {\n    Map<String, String> annotations = new HashMap<>();\n    if (displayName != null) {\n      annotations.put(PROJECT_DISPLAY_NAME_ANNOTATION, displayName);\n    }\n    if (description != null) {\n      annotations.put(PROJECT_DESCRIPTION_ANNOTATION, description);\n    }\n    if (extraAnnotations != null) {\n      annotations.putAll(extraAnnotations);\n    }\n\n    return new ProjectBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .withAnnotations(annotations)\n        .endMetadata()\n        .withNewStatus()\n        .withPhase(phase)\n        .endStatus()\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/project/OpenShiftProjectTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.project;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.doAnswer;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.Namespace;\nimport io.fabric8.kubernetes.api.model.NamespaceBuilder;\nimport io.fabric8.kubernetes.api.model.ServiceAccount;\nimport io.fabric8.kubernetes.api.model.Status;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.fabric8.kubernetes.client.KubernetesClientException;\nimport io.fabric8.kubernetes.client.dsl.MixedOperation;\nimport io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;\nimport io.fabric8.kubernetes.client.dsl.Resource;\nimport io.fabric8.openshift.api.model.Project;\nimport io.fabric8.openshift.api.model.ProjectBuilder;\nimport io.fabric8.openshift.api.model.ProjectRequest;\nimport io.fabric8.openshift.api.model.ProjectRequestFluent.MetadataNested;\nimport io.fabric8.openshift.api.model.RoleBinding;\nimport io.fabric8.openshift.api.model.RoleBindingList;\nimport io.fabric8.openshift.client.OpenShiftClient;\nimport io.fabric8.openshift.client.dsl.ProjectOperation;\nimport io.fabric8.openshift.client.dsl.ProjectRequestOperation;\nimport java.util.Map;\nimport java.util.concurrent.Executor;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.CheServerKubernetesClientFactory;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesConfigsMaps;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesDeployments;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesIngresses;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesPersistentVolumeClaims;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesSecrets;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesServices;\nimport org.eclipse.che.workspace.infrastructure.openshift.CheServerOpenshiftClientFactory;\nimport org.eclipse.che.workspace.infrastructure.openshift.OpenShiftClientFactory;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link OpenShiftProject}\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class OpenShiftProjectTest {\n\n  public static final String PROJECT_NAME = \"testProject\";\n  public static final String WORKSPACE_ID = \"workspace123\";\n\n  @Mock private KubernetesDeployments deployments;\n  @Mock private KubernetesServices services;\n  @Mock private OpenShiftRoutes routes;\n  @Mock private KubernetesPersistentVolumeClaims pvcs;\n  @Mock private KubernetesIngresses ingresses;\n  @Mock private KubernetesSecrets secrets;\n  @Mock private KubernetesConfigsMaps configsMaps;\n  @Mock private OpenShiftClientFactory clientFactory;\n  @Mock private CheServerKubernetesClientFactory cheClientFactory;\n  @Mock private CheServerOpenshiftClientFactory cheServerOpenshiftClientFactory;\n  @Mock private Executor executor;\n  @Mock private OpenShiftClient openShiftClient;\n  @Mock private OpenShiftClient openShiftCheServerClient;\n  @Mock private KubernetesClient kubernetesClient;\n  @Mock private Resource<ServiceAccount> serviceAccountResource;\n  @Mock private ProjectRequestOperation projectRequestOperation;\n  @Mock private MetadataNested metadataNested;\n\n  @Mock\n  private MixedOperation<RoleBinding, RoleBindingList, Resource<RoleBinding>>\n      mixedRoleBindingOperation;\n\n  @Mock\n  private NonNamespaceOperation<RoleBinding, RoleBindingList, Resource<RoleBinding>>\n      nonNamespaceRoleBindingOperation;\n\n  private OpenShiftProject openShiftProject;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    lenient().when(clientFactory.create(anyString())).thenReturn(kubernetesClient);\n    lenient().when(clientFactory.createOC()).thenReturn(openShiftClient);\n    lenient().when(clientFactory.createOC(anyString())).thenReturn(openShiftClient);\n\n    lenient().when(cheServerOpenshiftClientFactory.createOC()).thenReturn(openShiftCheServerClient);\n    lenient()\n        .when(cheServerOpenshiftClientFactory.createOC(anyString()))\n        .thenReturn(openShiftCheServerClient);\n\n    lenient().when(openShiftClient.adapt(OpenShiftClient.class)).thenReturn(openShiftClient);\n\n    final MixedOperation mixedOperation = mock(MixedOperation.class);\n    final NonNamespaceOperation namespaceOperation = mock(NonNamespaceOperation.class);\n    lenient().doReturn(mixedOperation).when(kubernetesClient).serviceAccounts();\n    lenient().when(mixedOperation.inNamespace(anyString())).thenReturn(namespaceOperation);\n    lenient().when(namespaceOperation.withName(anyString())).thenReturn(serviceAccountResource);\n    lenient().when(serviceAccountResource.get()).thenReturn(mock(ServiceAccount.class));\n    lenient().doReturn(projectRequestOperation).when(openShiftClient).projectrequests();\n    lenient().doReturn(metadataNested).when(metadataNested).withName(anyString());\n\n    openShiftProject =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            WORKSPACE_ID,\n            PROJECT_NAME,\n            deployments,\n            services,\n            routes,\n            pvcs,\n            ingresses,\n            secrets,\n            configsMaps);\n  }\n\n  @Test\n  public void testOpenShiftProjectPreparingWhenProjectExists() throws Exception {\n    // given\n    prepareNamespaceGet(PROJECT_NAME);\n\n    prepareProject(PROJECT_NAME);\n    OpenShiftProject project =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            executor,\n            PROJECT_NAME,\n            WORKSPACE_ID);\n\n    // when\n    project.prepare(true, true, Map.of(), Map.of());\n\n    // then\n    verify(metadataNested, never()).withName(PROJECT_NAME);\n  }\n\n  @Test\n  public void testOpenShiftProjectPreparingWhenProjectDoesNotExist() throws Exception {\n    // given\n    prepareNamespaceGet(PROJECT_NAME);\n\n    Resource resource = prepareProjectResource(PROJECT_NAME);\n    doThrow(new KubernetesClientException(\"error\", 403, null)).when(resource).get();\n    OpenShiftProject project =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            executor,\n            PROJECT_NAME,\n            WORKSPACE_ID);\n\n    // when\n    openShiftProject.prepare(true, false, Map.of(), Map.of());\n\n    // then\n    ArgumentCaptor<ProjectRequest> captor = ArgumentCaptor.forClass(ProjectRequest.class);\n    verify(projectRequestOperation).create(captor.capture());\n    Assert.assertEquals(captor.getValue().getMetadata().getName(), PROJECT_NAME);\n  }\n\n  @Test\n  public void testOpenShiftProjectPreparingWhenProjectDoesNotExistWithCheServerSA()\n      throws Exception {\n    // given\n    prepareNamespaceGet(PROJECT_NAME);\n\n    Resource resource = prepareProjectResource(PROJECT_NAME);\n    doThrow(new KubernetesClientException(\"error\", 403, null)).when(resource).get();\n    final MixedOperation mixedOperation = mock(MixedOperation.class);\n    final NonNamespaceOperation namespaceOperation = mock(NonNamespaceOperation.class);\n    doReturn(mixedOperation).when(openShiftCheServerClient).serviceAccounts();\n    when(mixedOperation.inNamespace(anyString())).thenReturn(namespaceOperation);\n    when(namespaceOperation.withName(anyString())).thenReturn(serviceAccountResource);\n    when(serviceAccountResource.get()).thenReturn(mock(ServiceAccount.class));\n    doReturn(projectRequestOperation).when(openShiftCheServerClient).projectrequests();\n    // when\n    openShiftProject.prepare(true, true, Map.of(), Map.of());\n\n    // then\n    ArgumentCaptor<ProjectRequest> captor = ArgumentCaptor.forClass(ProjectRequest.class);\n    verify(projectRequestOperation).create(captor.capture());\n    Assert.assertEquals(captor.getValue().getMetadata().getName(), PROJECT_NAME);\n    verifyNoMoreInteractions(openShiftCheServerClient);\n    verifyNoMoreInteractions(kubernetesClient);\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void throwsExceptionIfNamespaceDoesntExistAndNotAllowedToCreateIt() throws Exception {\n    // given\n    Resource resource = prepareProjectResource(PROJECT_NAME);\n    doThrow(new KubernetesClientException(\"error\", 403, null)).when(resource).get();\n    OpenShiftProject project =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            executor,\n            PROJECT_NAME,\n            WORKSPACE_ID);\n\n    // when\n    project.prepare(false, true, Map.of(), Map.of());\n\n    // then\n    // exception is thrown\n  }\n\n  @Test\n  public void testOpenShiftProjectCleaningUp() throws Exception {\n    // when\n    openShiftProject.cleanUp();\n\n    verify(routes).delete();\n    verify(services).delete();\n    verify(deployments).delete();\n    verify(secrets).delete();\n    verify(configsMaps).delete();\n  }\n\n  @Test\n  public void testOpenShiftProjectCleaningUpIfExceptionsOccurs() throws Exception {\n    doThrow(new InfrastructureException(\"err1.\")).when(services).delete();\n    doThrow(new InfrastructureException(\"err2.\")).when(deployments).delete();\n\n    InfrastructureException error = null;\n    // when\n    try {\n      openShiftProject.cleanUp();\n\n    } catch (InfrastructureException e) {\n      error = e;\n    }\n\n    // then\n    assertNotNull(error);\n    String message = error.getMessage();\n    assertEquals(message, \"Error(s) occurs while cleaning up the namespace. err1. err2.\");\n    verify(routes).delete();\n  }\n\n  @Test\n  public void testDeletesExistingProject() throws Exception {\n    // given\n    OpenShiftProject project =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            executor,\n            PROJECT_NAME,\n            WORKSPACE_ID);\n    Resource resource = prepareProjectResource(PROJECT_NAME);\n\n    // when\n    project.delete();\n\n    // then\n    verify(resource).delete();\n  }\n\n  @Test\n  public void testDoesntFailIfDeletedProjectDoesntExist() throws Exception {\n    // given\n    OpenShiftProject project =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            executor,\n            PROJECT_NAME,\n            WORKSPACE_ID);\n    Resource resource = prepareProjectResource(PROJECT_NAME);\n    when(resource.delete()).thenThrow(new KubernetesClientException(\"err\", 404, null));\n\n    // when\n    project.delete();\n\n    // then\n    verify(resource).delete();\n    // and no exception is thrown\n  }\n\n  @Test\n  public void testDoesntFailIfDeletedProjectIsBeingDeleted() throws Exception {\n    // given\n    OpenShiftProject project =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            executor,\n            PROJECT_NAME,\n            WORKSPACE_ID);\n    Resource resource = prepareProjectResource(PROJECT_NAME);\n    when(resource.delete()).thenThrow(new KubernetesClientException(\"err\", 409, null));\n\n    // when\n    project.delete();\n\n    // then\n    verify(resource).delete();\n    // and no exception is thrown\n  }\n\n  @Test\n  public void testLabelNamespace() throws InfrastructureException {\n    // given\n    prepareProject(PROJECT_NAME);\n    prepareNamespaceGet(PROJECT_NAME);\n    OpenShiftProject openShiftProject =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            executor,\n            PROJECT_NAME,\n            WORKSPACE_ID);\n\n    KubernetesClient cheKubeClient = mock(KubernetesClient.class);\n    doReturn(cheKubeClient).when(cheClientFactory).create();\n\n    NonNamespaceOperation nonNamespaceOperation = mock(NonNamespaceOperation.class);\n    doReturn(nonNamespaceOperation).when(cheKubeClient).namespaces();\n\n    ArgumentCaptor<Namespace> namespaceArgumentCaptor = ArgumentCaptor.forClass(Namespace.class);\n    doAnswer(a -> a.getArgument(0))\n        .when(nonNamespaceOperation)\n        .createOrReplace(namespaceArgumentCaptor.capture());\n\n    Map<String, String> labels = Map.of(\"label.with.this\", \"yes\", \"and.this\", \"of courese\");\n\n    // when\n    openShiftProject.prepare(true, true, labels, Map.of());\n\n    // then\n    Namespace updatedNamespace = namespaceArgumentCaptor.getValue();\n    assertTrue(\n        updatedNamespace.getMetadata().getLabels().entrySet().containsAll(labels.entrySet()));\n    assertEquals(updatedNamespace.getMetadata().getName(), PROJECT_NAME);\n  }\n\n  @Test\n  public void testDontTryToLabelNamespaceIfAlreadyLabeled() throws InfrastructureException {\n    // given\n    Map<String, String> labels = Map.of(\"label.with.this\", \"yes\", \"and.this\", \"of courese\");\n\n    prepareProject(PROJECT_NAME);\n    Namespace namespace = prepareNamespaceGet(PROJECT_NAME);\n    namespace.getMetadata().setLabels(labels);\n    OpenShiftProject openShiftProject =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            executor,\n            PROJECT_NAME,\n            WORKSPACE_ID);\n\n    KubernetesClient cheKubeClient = mock(KubernetesClient.class);\n    lenient().doReturn(cheKubeClient).when(cheClientFactory).create();\n\n    NonNamespaceOperation nonNamespaceOperation = mock(NonNamespaceOperation.class);\n    lenient().doReturn(nonNamespaceOperation).when(cheKubeClient).namespaces();\n\n    lenient()\n        .doAnswer(a -> a.getArgument(0))\n        .when(nonNamespaceOperation)\n        .createOrReplace(any(Namespace.class));\n\n    // when\n    openShiftProject.prepare(true, true, labels, Map.of());\n\n    // then\n    assertTrue(namespace.getMetadata().getLabels().entrySet().containsAll(labels.entrySet()));\n    verify(nonNamespaceOperation, never()).createOrReplace(any());\n  }\n\n  @Test\n  public void testAnnotateNamespace() throws InfrastructureException {\n    // given\n    prepareProject(PROJECT_NAME);\n    prepareNamespaceGet(PROJECT_NAME);\n    OpenShiftProject openShiftProject =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            executor,\n            PROJECT_NAME,\n            WORKSPACE_ID);\n\n    KubernetesClient cheKubeClient = mock(KubernetesClient.class);\n    doReturn(cheKubeClient).when(cheClientFactory).create();\n\n    NonNamespaceOperation nonNamespaceOperation = mock(NonNamespaceOperation.class);\n    doReturn(nonNamespaceOperation).when(cheKubeClient).namespaces();\n\n    ArgumentCaptor<Namespace> namespaceArgumentCaptor = ArgumentCaptor.forClass(Namespace.class);\n    doAnswer(a -> a.getArgument(0))\n        .when(nonNamespaceOperation)\n        .createOrReplace(namespaceArgumentCaptor.capture());\n\n    Map<String, String> annotations =\n        Map.of(\"annotation.with.this\", \"yes\", \"and.this\", \"of courese\");\n\n    // when\n    openShiftProject.prepare(true, true, Map.of(), annotations);\n\n    // then\n    Namespace updatedNamespace = namespaceArgumentCaptor.getValue();\n    assertTrue(\n        updatedNamespace\n            .getMetadata()\n            .getAnnotations()\n            .entrySet()\n            .containsAll(annotations.entrySet()));\n    assertEquals(updatedNamespace.getMetadata().getName(), PROJECT_NAME);\n  }\n\n  @Test\n  public void testDontTryToAnnotateNamespaceIfAlreadyAnnotated() throws InfrastructureException {\n    // given\n    Map<String, String> annotations =\n        Map.of(\"annotation.with.this\", \"yes\", \"and.this\", \"of courese\");\n\n    prepareProject(PROJECT_NAME);\n    Namespace namespace = prepareNamespaceGet(PROJECT_NAME);\n    namespace.getMetadata().setAnnotations(annotations);\n    OpenShiftProject openShiftProject =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            executor,\n            PROJECT_NAME,\n            WORKSPACE_ID);\n\n    // when\n    openShiftProject.prepare(true, true, Map.of(), annotations);\n\n    // then\n    assertTrue(\n        namespace.getMetadata().getAnnotations().entrySet().containsAll(annotations.entrySet()));\n  }\n\n  @Test\n  public void testDoNotFailWhenNoPermissionsToUpdateNamespace() throws InfrastructureException {\n    // given\n    Map<String, String> labels = Map.of(\"label.with.this\", \"yes\", \"and.this\", \"of courese\");\n\n    prepareProject(PROJECT_NAME);\n    prepareNamespaceGet(PROJECT_NAME);\n    OpenShiftProject openShiftProject =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            executor,\n            PROJECT_NAME,\n            WORKSPACE_ID);\n\n    KubernetesClient cheKubeClient = mock(KubernetesClient.class);\n    lenient().doReturn(cheKubeClient).when(cheClientFactory).create();\n\n    NonNamespaceOperation nonNamespaceOperation = mock(NonNamespaceOperation.class);\n    lenient().doReturn(nonNamespaceOperation).when(cheKubeClient).namespaces();\n\n    ArgumentCaptor<Namespace> namespaceArgumentCaptor = ArgumentCaptor.forClass(Namespace.class);\n    lenient()\n        .doThrow(new KubernetesClientException(\"No permissions.\", 403, new Status()))\n        .when(nonNamespaceOperation)\n        .createOrReplace(namespaceArgumentCaptor.capture());\n\n    // when\n    openShiftProject.prepare(true, true, labels, Map.of());\n\n    // then\n    Namespace updatedNamespace = namespaceArgumentCaptor.getValue();\n    assertTrue(\n        updatedNamespace.getMetadata().getLabels().entrySet().containsAll(labels.entrySet()));\n    assertEquals(updatedNamespace.getMetadata().getName(), PROJECT_NAME);\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void testFailWhenFailToUpdateNamespace() throws InfrastructureException {\n    // given\n    Map<String, String> labels = Map.of(\"label.with.this\", \"yes\", \"and.this\", \"of courese\");\n\n    prepareProject(PROJECT_NAME);\n    Namespace namespace = prepareNamespaceGet(PROJECT_NAME);\n    OpenShiftProject openShiftProject =\n        new OpenShiftProject(\n            clientFactory,\n            cheClientFactory,\n            cheServerOpenshiftClientFactory,\n            executor,\n            PROJECT_NAME,\n            WORKSPACE_ID);\n\n    KubernetesClient cheKubeClient = mock(KubernetesClient.class);\n    lenient().doReturn(cheKubeClient).when(cheClientFactory).create();\n\n    NonNamespaceOperation nonNamespaceOperation = mock(NonNamespaceOperation.class);\n    lenient().doReturn(nonNamespaceOperation).when(cheKubeClient).namespaces();\n\n    lenient()\n        .doThrow(new KubernetesClientException(\"Some other error\", 500, new Status()))\n        .when(nonNamespaceOperation)\n        .createOrReplace(any(Namespace.class));\n\n    // when\n    openShiftProject.prepare(true, true, labels, Map.of());\n\n    // then\n    verify(nonNamespaceOperation).createOrReplace(namespace);\n  }\n\n  private Resource prepareProjectResource(String projectName) {\n    Resource projectResource = mock(Resource.class);\n\n    ProjectOperation projectOperation = mock(ProjectOperation.class);\n    doReturn(projectResource).when(projectOperation).withName(projectName);\n    doReturn(projectOperation).when(openShiftCheServerClient).projects();\n\n    when(projectResource.get())\n        .thenReturn(\n            new ProjectBuilder().withNewMetadata().withName(projectName).endMetadata().build());\n\n    openShiftCheServerClient.projects().withName(projectName).get();\n    return projectResource;\n  }\n\n  private Namespace prepareNamespaceGet(String namespaceName) {\n    Namespace namespace =\n        new NamespaceBuilder().withNewMetadata().withName(namespaceName).endMetadata().build();\n\n    NonNamespaceOperation nsOperation = mock(NonNamespaceOperation.class);\n    doReturn(nsOperation).when(openShiftCheServerClient).namespaces();\n\n    Resource nsResource = mock(Resource.class);\n    doReturn(nsResource).when(nsOperation).withName(namespaceName);\n\n    doReturn(namespace).when(nsResource).get();\n\n    return namespace;\n  }\n\n  private Project prepareProject(String projectName) {\n    Project project =\n        new ProjectBuilder().withNewMetadata().withName(projectName).endMetadata().build();\n    Resource projectResource = prepareProjectResource(projectName);\n    doReturn(project).when(projectResource).get();\n    return project;\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/project/configurator/OpenShiftWorkspaceServiceAccountConfiguratorTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.project.configurator;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\n\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.NamespaceResolutionContext;\nimport org.eclipse.che.workspace.infrastructure.openshift.CheServerOpenshiftClientFactory;\nimport org.eclipse.che.workspace.infrastructure.openshift.project.OpenShiftWorkspaceServiceAccount;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class OpenShiftWorkspaceServiceAccountConfiguratorTest {\n  private final String SA_NAME = \"test-serviceaccout\";\n  private final String CLUSTER_ROLES = \"role1, role2\";\n\n  private final String WS_ID = \"ws123\";\n  private final String USER_ID = \"user123\";\n  private final String USERNAME = \"user-che\";\n\n  private final String NS_NAME = \"namespace-che\";\n\n  private NamespaceResolutionContext nsContext;\n\n  @Mock private CheServerOpenshiftClientFactory cheServerOpenshiftClientFactory;\n\n  private OpenShiftWorkspaceServiceAccountConfigurator saConfigurator;\n\n  @BeforeMethod\n  public void setUp() {\n    nsContext = new NamespaceResolutionContext(WS_ID, USER_ID, USERNAME);\n  }\n\n  @Test\n  public void testPreparesServiceAccount() throws InfrastructureException {\n    saConfigurator =\n        spy(\n            new OpenShiftWorkspaceServiceAccountConfigurator(\n                SA_NAME, CLUSTER_ROLES, cheServerOpenshiftClientFactory));\n    OpenShiftWorkspaceServiceAccount serviceAccount = mock(OpenShiftWorkspaceServiceAccount.class);\n    doReturn(serviceAccount).when(saConfigurator).createServiceAccount(WS_ID, NS_NAME);\n\n    saConfigurator.configure(nsContext, NS_NAME);\n\n    verify(serviceAccount).prepare();\n  }\n\n  @Test\n  public void testDoNothingWhenServiceAccountNotSet() throws InfrastructureException {\n    saConfigurator =\n        spy(\n            new OpenShiftWorkspaceServiceAccountConfigurator(\n                null, CLUSTER_ROLES, cheServerOpenshiftClientFactory));\n\n    saConfigurator.configure(nsContext, NS_NAME);\n\n    verify(saConfigurator, times(0)).createServiceAccount(any(), any());\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/provision/OpenShiftPreviewUrlCommandProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.provision;\n\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServiceSpec;\nimport io.fabric8.openshift.api.model.Route;\nimport io.fabric8.openshift.api.model.RoutePort;\nimport io.fabric8.openshift.api.model.RouteSpec;\nimport io.fabric8.openshift.api.model.RouteTargetReference;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.PreviewUrlImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Warnings;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesServices;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.eclipse.che.workspace.infrastructure.openshift.project.OpenShiftProject;\nimport org.eclipse.che.workspace.infrastructure.openshift.project.OpenShiftRoutes;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class OpenShiftPreviewUrlCommandProvisionerTest {\n\n  private OpenShiftPreviewUrlCommandProvisioner previewUrlCommandProvisioner;\n  @Mock private OpenShiftEnvironment mockEnvironment;\n  @Mock private OpenShiftProject mockProject;\n  @Mock private KubernetesServices mockServices;\n  @Mock private OpenShiftRoutes mockRoutes;\n\n  @BeforeMethod\n  public void setUp() {\n    previewUrlCommandProvisioner = new OpenShiftPreviewUrlCommandProvisioner();\n  }\n\n  @Test\n  public void shouldDoNothingWhenGetCommandsIsNull() throws InfrastructureException {\n    Mockito.when(mockEnvironment.getCommands()).thenReturn(null);\n\n    previewUrlCommandProvisioner.provision(mockEnvironment, mockProject);\n  }\n\n  @Test(expectedExceptions = InternalInfrastructureException.class)\n  public void throwsInfrastructureExceptionWhenK8sNamespaces() throws InfrastructureException {\n    KubernetesNamespace namespace = Mockito.mock(KubernetesNamespace.class);\n    previewUrlCommandProvisioner.provision(mockEnvironment, namespace);\n  }\n\n  @Test\n  public void shouldDoNothingWhenNoCommandsDefined() throws InfrastructureException {\n    Mockito.when(mockEnvironment.getCommands()).thenReturn(Collections.emptyList());\n    Mockito.when(mockProject.routes()).thenReturn(mockRoutes);\n    Mockito.when(mockProject.services()).thenReturn(mockServices);\n\n    previewUrlCommandProvisioner.provision(mockEnvironment, mockProject);\n  }\n\n  @Test\n  public void shouldDoNothingWhenCommandsWithoutPreviewUrlDefined() throws InfrastructureException {\n    List<CommandImpl> commands =\n        Arrays.asList(new CommandImpl(\"a\", \"a\", \"a\"), new CommandImpl(\"b\", \"b\", \"b\"));\n    OpenShiftEnvironment env =\n        OpenShiftEnvironment.builder().setCommands(new ArrayList<>(commands)).build();\n\n    Mockito.when(mockProject.routes()).thenReturn(mockRoutes);\n    Mockito.when(mockProject.services()).thenReturn(mockServices);\n\n    previewUrlCommandProvisioner.provision(env, mockProject);\n\n    assertTrue(commands.containsAll(env.getCommands()));\n    assertTrue(env.getCommands().containsAll(commands));\n    assertTrue(env.getWarnings().isEmpty());\n  }\n\n  @Test\n  public void shouldDoNothingWhenCantFindServiceForPreviewurl() throws InfrastructureException {\n    List<CommandImpl> commands =\n        Collections.singletonList(\n            new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(8080, null), Collections.emptyMap()));\n    OpenShiftEnvironment env =\n        OpenShiftEnvironment.builder().setCommands(new ArrayList<>(commands)).build();\n\n    Mockito.when(mockProject.routes()).thenReturn(mockRoutes);\n    Mockito.when(mockProject.services()).thenReturn(mockServices);\n    Mockito.when(mockServices.get()).thenReturn(Collections.emptyList());\n\n    previewUrlCommandProvisioner.provision(env, mockProject);\n\n    assertTrue(commands.containsAll(env.getCommands()));\n    assertTrue(env.getCommands().containsAll(commands));\n    assertEquals(\n        env.getWarnings().get(0).getCode(), Warnings.NOT_ABLE_TO_PROVISION_OBJECTS_FOR_PREVIEW_URL);\n  }\n\n  @Test\n  public void shouldDoNothingWhenCantFindRouteForPreviewUrl() throws InfrastructureException {\n    int port = 8080;\n    List<CommandImpl> commands =\n        Collections.singletonList(\n            new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(port, null), Collections.emptyMap()));\n    OpenShiftEnvironment env =\n        OpenShiftEnvironment.builder().setCommands(new ArrayList<>(commands)).build();\n\n    Mockito.when(mockProject.services()).thenReturn(mockServices);\n    Service service = new Service();\n    ServiceSpec spec = new ServiceSpec();\n    spec.setPorts(\n        Collections.singletonList(\n            new ServicePort(null, \"a\", null, port, \"TCP\", new IntOrString(port))));\n    service.setSpec(spec);\n    Mockito.when(mockServices.get()).thenReturn(Collections.singletonList(service));\n\n    Mockito.when(mockProject.routes()).thenReturn(mockRoutes);\n    Mockito.when(mockRoutes.get()).thenReturn(Collections.emptyList());\n\n    previewUrlCommandProvisioner.provision(env, mockProject);\n\n    assertTrue(commands.containsAll(env.getCommands()));\n    assertTrue(env.getCommands().containsAll(commands));\n    assertEquals(\n        env.getWarnings().get(0).getCode(), Warnings.NOT_ABLE_TO_PROVISION_OBJECTS_FOR_PREVIEW_URL);\n  }\n\n  @Test\n  public void shouldUpdateCommandWhenServiceAndIngressFound() throws InfrastructureException {\n    int port = 8080;\n    List<CommandImpl> commands =\n        Collections.singletonList(\n            new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(port, null), Collections.emptyMap()));\n    OpenShiftEnvironment env =\n        OpenShiftEnvironment.builder().setCommands(new ArrayList<>(commands)).build();\n\n    Mockito.when(mockProject.services()).thenReturn(mockServices);\n    Service service = new Service();\n    ObjectMeta metadata = new ObjectMeta();\n    metadata.setName(\"servicename\");\n    service.setMetadata(metadata);\n    ServiceSpec spec = new ServiceSpec();\n    spec.setPorts(\n        Collections.singletonList(\n            new ServicePort(null, \"8080\", null, port, \"TCP\", new IntOrString(port))));\n    service.setSpec(spec);\n    Mockito.when(mockServices.get()).thenReturn(Collections.singletonList(service));\n\n    Route route = new Route();\n    RouteSpec routeSpec = new RouteSpec();\n    routeSpec.setPort(new RoutePort(new IntOrString(\"8080\")));\n    routeSpec.setTo(new RouteTargetReference(\"a\", \"servicename\", 1));\n    routeSpec.setHost(\"testhost\");\n    route.setSpec(routeSpec);\n\n    Mockito.when(mockProject.routes()).thenReturn(mockRoutes);\n    Mockito.when(mockRoutes.get()).thenReturn(Collections.singletonList(route));\n\n    previewUrlCommandProvisioner.provision(env, mockProject);\n\n    assertTrue(env.getCommands().get(0).getAttributes().containsKey(\"previewUrl\"));\n    assertEquals(env.getCommands().get(0).getAttributes().get(\"previewUrl\"), \"testhost\");\n    assertTrue(env.getWarnings().isEmpty());\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/provision/OpenShiftUniqueNamesProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.provision;\n\nimport static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.CHE_ORIGINAL_NAME_LABEL;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotEquals;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.ObjectMetaBuilder;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodBuilder;\nimport io.fabric8.openshift.api.model.Route;\nimport io.fabric8.openshift.api.model.RouteBuilder;\nimport java.util.HashMap;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link OpenShiftUniqueNamesProvisioner}.\n *\n * @author Anton Korneta\n */\n@Listeners(MockitoTestNGListener.class)\npublic class OpenShiftUniqueNamesProvisionerTest {\n\n  private static final String WORKSPACE_ID = \"workspace37\";\n  private static final String POD_NAME = \"testPod\";\n  private static final String ROUTE_NAME = \"testRoute\";\n\n  @Mock private OpenShiftEnvironment osEnv;\n  @Mock private RuntimeIdentity runtimeIdentity;\n\n  private OpenShiftUniqueNamesProvisioner uniqueNamesProvisioner;\n\n  @BeforeMethod\n  public void setup() {\n    uniqueNamesProvisioner = new OpenShiftUniqueNamesProvisioner();\n  }\n\n  @Test\n  public void provideUniquePodsNames() throws Exception {\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n    Pod pod = newPod();\n    PodData podData = new PodData(pod.getSpec(), pod.getMetadata());\n    doReturn(ImmutableMap.of(POD_NAME, podData)).when(osEnv).getPodsData();\n\n    uniqueNamesProvisioner.provision(osEnv, runtimeIdentity);\n\n    ObjectMeta podMetadata = pod.getMetadata();\n    assertNotEquals(podMetadata.getName(), POD_NAME);\n    assertEquals(podMetadata.getLabels().get(CHE_ORIGINAL_NAME_LABEL), POD_NAME);\n  }\n\n  @Test\n  public void provideUniqueRoutesNames() throws Exception {\n    final HashMap<String, Route> routes = new HashMap<>();\n    Route route = newRoute();\n    routes.put(POD_NAME, route);\n    doReturn(routes).when(osEnv).getRoutes();\n\n    uniqueNamesProvisioner.provision(osEnv, runtimeIdentity);\n\n    final ObjectMeta routeData = route.getMetadata();\n    assertNotEquals(routeData.getName(), ROUTE_NAME);\n    assertEquals(routeData.getLabels().get(CHE_ORIGINAL_NAME_LABEL), ROUTE_NAME);\n  }\n\n  private static Pod newPod() {\n    return new PodBuilder()\n        .withMetadata(new ObjectMetaBuilder().withName(POD_NAME).build())\n        .build();\n  }\n\n  private static Route newRoute() {\n    return new RouteBuilder()\n        .withMetadata(new ObjectMetaBuilder().withName(ROUTE_NAME).build())\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/provision/RouteTlsProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.provision;\n\nimport static java.util.Collections.emptyMap;\nimport static org.eclipse.che.workspace.infrastructure.openshift.provision.RouteTlsProvisioner.TERMINATION_EDGE;\nimport static org.eclipse.che.workspace.infrastructure.openshift.provision.RouteTlsProvisioner.TERMINATION_POLICY_REDIRECT;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.fabric8.openshift.api.model.Route;\nimport io.fabric8.openshift.api.model.RouteBuilder;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link RouteTlsProvisioner}.\n *\n * @author Ilya Buziuk\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class RouteTlsProvisionerTest {\n\n  @Mock private OpenShiftEnvironment osEnv;\n  @Mock private RuntimeIdentity runtimeIdentity;\n\n  @Test\n  public void doNothingWhenTlsDisabled() throws Exception {\n    // given\n    RouteTlsProvisioner tlsProvisioner = new RouteTlsProvisioner(false);\n\n    // when\n    tlsProvisioner.provision(osEnv, runtimeIdentity);\n\n    // then\n    verify(osEnv, never()).getRoutes();\n  }\n\n  @Test\n  public void provisionTlsForRoutes() throws Exception {\n    // given\n    RouteTlsProvisioner tlsProvisioner = new RouteTlsProvisioner(true);\n    ServerConfigImpl httpServer = new ServerConfigImpl(\"8080/tpc\", \"http\", \"/api\", emptyMap());\n    ServerConfigImpl wsServer = new ServerConfigImpl(\"8080/tpc\", \"ws\", \"/ws\", emptyMap());\n\n    final Map<String, Route> routes = new HashMap<>();\n    Route route =\n        createRoute(\"route\", ImmutableMap.of(\"http-server\", httpServer, \"ws-server\", wsServer));\n    routes.put(\"route\", route);\n    when(osEnv.getRoutes()).thenReturn(routes);\n\n    // when\n    tlsProvisioner.provision(osEnv, runtimeIdentity);\n\n    // then\n    assertEquals(route.getSpec().getTls().getTermination(), TERMINATION_EDGE);\n    assertEquals(\n        route.getSpec().getTls().getInsecureEdgeTerminationPolicy(), TERMINATION_POLICY_REDIRECT);\n\n    Map<String, ServerConfigImpl> servers =\n        Annotations.newDeserializer(route.getMetadata().getAnnotations()).servers();\n    assertEquals(servers.get(\"http-server\").getProtocol(), \"https\");\n    assertEquals(servers.get(\"ws-server\").getProtocol(), \"wss\");\n  }\n\n  @Test\n  public void shouldNotThrowNPE() throws Exception {\n    // given\n    RouteTlsProvisioner tlsProvisioner = new RouteTlsProvisioner(true);\n\n    final Map<String, Route> routes = new HashMap<>();\n    Route route =\n        new RouteBuilder()\n            .withNewMetadata()\n            .withName(\"name\")\n            .endMetadata()\n            .withNewSpec()\n            .endSpec()\n            .build();\n    routes.put(\"route\", route);\n    when(osEnv.getRoutes()).thenReturn(routes);\n\n    // when\n    tlsProvisioner.provision(osEnv, runtimeIdentity);\n  }\n\n  private Route createRoute(String name, Map<String, ServerConfigImpl> servers) {\n    return new RouteBuilder()\n        .withNewMetadata()\n        .withName(name)\n        .withAnnotations(Annotations.newSerializer().servers(servers).annotations())\n        .endMetadata()\n        .withNewSpec()\n        .endSpec()\n        .build();\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/server/OpenShiftExternalServerExposerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.server;\n\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertNull;\nimport static org.testng.Assert.assertTrue;\n\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.openshift.api.model.Route;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations;\nimport org.eclipse.che.workspace.infrastructure.kubernetes.Annotations.Deserializer;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link RouteServerExposer}.\n *\n * @author Sergii Leshchenko\n */\npublic class OpenShiftExternalServerExposerTest {\n\n  private static final String LABELS = \"foo=bar\";\n  private RouteServerExposer osExternalServerExposer = new RouteServerExposer(LABELS, null);\n\n  @Test\n  public void shouldAddRouteToEnvForExposingSpecifiedServer() {\n    // given\n    OpenShiftEnvironment osEnv = OpenShiftEnvironment.builder().build();\n    Map<String, ServerConfig> servers = new HashMap<>();\n    servers.put(\"server\", new ServerConfigImpl());\n\n    // when\n    osExternalServerExposer.expose(\n        osEnv,\n        \"machine123\",\n        \"service123\",\n        null,\n        new ServicePort(null, \"servicePort\", null, null, \"TCP\", null),\n        servers);\n\n    // then\n    assertEquals(1, osEnv.getRoutes().size());\n    Route route = osEnv.getRoutes().values().iterator().next();\n    assertNotNull(route);\n\n    assertEquals(route.getSpec().getTo().getName(), \"service123\");\n    assertEquals(route.getSpec().getPort().getTargetPort().getStrVal(), \"servicePort\");\n\n    Deserializer annotations = Annotations.newDeserializer(route.getMetadata().getAnnotations());\n    assertEquals(annotations.machineName(), \"machine123\");\n    assertEquals(annotations.servers(), servers);\n    assertEquals(route.getMetadata().getLabels().get(\"foo\"), \"bar\");\n    assertNull(route.getSpec().getHost());\n  }\n\n  @Test\n  public void shouldAddRouteToEnvForExposingSpecifiedServerWithSpecificHost() {\n    // given\n    RouteServerExposer osExternalServerExposer = new RouteServerExposer(LABELS, \"open.che.org\");\n    OpenShiftEnvironment osEnv = OpenShiftEnvironment.builder().build();\n    Map<String, ServerConfig> servers = new HashMap<>();\n    servers.put(\"server\", new ServerConfigImpl());\n\n    // when\n    osExternalServerExposer.expose(\n        osEnv,\n        \"machine123\",\n        \"service123\",\n        null,\n        new ServicePort(null, \"servicePort\", null, null, \"TCP\", null),\n        servers);\n\n    // then\n    assertEquals(1, osEnv.getRoutes().size());\n    Route route = osEnv.getRoutes().values().iterator().next();\n    assertNotNull(route);\n\n    assertEquals(route.getSpec().getTo().getName(), \"service123\");\n    assertEquals(route.getSpec().getPort().getTargetPort().getStrVal(), \"servicePort\");\n    assertTrue(route.getSpec().getHost().endsWith(\".open.che.org\"));\n    assertTrue(route.getSpec().getHost().startsWith(\"route\"));\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/server/OpenShiftPreviewUrlExposerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.server;\n\nimport static java.util.Collections.singletonList;\nimport static org.testng.Assert.*;\n\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServiceSpec;\nimport io.fabric8.openshift.api.model.Route;\nimport io.fabric8.openshift.api.model.RoutePort;\nimport io.fabric8.openshift.api.model.RouteSpec;\nimport io.fabric8.openshift.api.model.RouteTargetReference;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.PreviewUrlImpl;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class OpenShiftPreviewUrlExposerTest {\n\n  private OpenShiftPreviewUrlExposer previewUrlEndpointsProvisioner;\n\n  @BeforeMethod\n  public void setUp() {\n    RouteServerExposer externalServerExposer = new RouteServerExposer(\"a=b\", null);\n    previewUrlEndpointsProvisioner = new OpenShiftPreviewUrlExposer(externalServerExposer);\n  }\n\n  @Test\n  public void shouldDoNothingWhenNoCommandsDefined() throws InternalInfrastructureException {\n    OpenShiftEnvironment env = OpenShiftEnvironment.builder().build();\n\n    previewUrlEndpointsProvisioner.expose(env);\n\n    assertTrue(env.getCommands().isEmpty());\n    assertTrue(env.getServices().isEmpty());\n    assertTrue(env.getRoutes().isEmpty());\n  }\n\n  @Test\n  public void shouldDoNothingWhenNoCommandWithPreviewUrlDefined()\n      throws InternalInfrastructureException {\n    CommandImpl command = new CommandImpl(\"a\", \"a\", \"a\");\n    OpenShiftEnvironment env =\n        OpenShiftEnvironment.builder().setCommands(singletonList(new CommandImpl(command))).build();\n\n    previewUrlEndpointsProvisioner.expose(env);\n\n    assertEquals(env.getCommands().get(0), command);\n    assertTrue(env.getServices().isEmpty());\n    assertTrue(env.getRoutes().isEmpty());\n  }\n\n  @Test\n  public void shouldNotProvisionWhenServiceAndRouteFound() throws InternalInfrastructureException {\n    final int PORT = 8080;\n    final String SERVER_PORT_NAME = \"server-\" + PORT;\n\n    CommandImpl command =\n        new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(PORT, null), Collections.emptyMap());\n\n    Service service = new Service();\n    ObjectMeta serviceMeta = new ObjectMeta();\n    serviceMeta.setName(\"servicename\");\n    service.setMetadata(serviceMeta);\n    ServiceSpec serviceSpec = new ServiceSpec();\n    serviceSpec.setPorts(\n        singletonList(\n            new ServicePort(null, SERVER_PORT_NAME, null, PORT, \"TCP\", new IntOrString(PORT))));\n    service.setSpec(serviceSpec);\n\n    Route route = new Route();\n    RouteSpec routeSpec = new RouteSpec();\n    routeSpec.setPort(new RoutePort(new IntOrString(SERVER_PORT_NAME)));\n    routeSpec.setTo(new RouteTargetReference(\"routekind\", \"servicename\", 1));\n    route.setSpec(routeSpec);\n\n    Map<String, Service> services = new HashMap<>();\n    services.put(\"servicename\", service);\n    Map<String, Route> routes = new HashMap<>();\n    routes.put(\"routename\", route);\n\n    OpenShiftEnvironment env =\n        OpenShiftEnvironment.builder()\n            .setCommands(singletonList(new CommandImpl(command)))\n            .setServices(services)\n            .setRoutes(routes)\n            .build();\n\n    assertEquals(env.getRoutes().size(), 1);\n    previewUrlEndpointsProvisioner.expose(env);\n    assertEquals(env.getRoutes().size(), 1);\n  }\n\n  @Test\n  public void shouldProvisionRouteWhenNotFound() throws InternalInfrastructureException {\n    final int PORT = 8080;\n    final String SERVER_PORT_NAME = \"server-\" + PORT;\n    final String SERVICE_NAME = \"servicename\";\n\n    CommandImpl command =\n        new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(PORT, null), Collections.emptyMap());\n\n    Service service = new Service();\n    ObjectMeta serviceMeta = new ObjectMeta();\n    serviceMeta.setName(SERVICE_NAME);\n    service.setMetadata(serviceMeta);\n    ServiceSpec serviceSpec = new ServiceSpec();\n    serviceSpec.setPorts(\n        singletonList(\n            new ServicePort(null, SERVER_PORT_NAME, null, PORT, \"TCP\", new IntOrString(PORT))));\n    service.setSpec(serviceSpec);\n\n    Map<String, Service> services = new HashMap<>();\n    services.put(SERVICE_NAME, service);\n\n    OpenShiftEnvironment env =\n        OpenShiftEnvironment.builder()\n            .setCommands(singletonList(new CommandImpl(command)))\n            .setServices(services)\n            .setRoutes(new HashMap<>())\n            .build();\n\n    previewUrlEndpointsProvisioner.expose(env);\n    assertEquals(env.getRoutes().size(), 1);\n    Route provisionedRoute = env.getRoutes().values().iterator().next();\n    assertEquals(provisionedRoute.getSpec().getTo().getName(), SERVICE_NAME);\n    assertEquals(\n        provisionedRoute.getSpec().getPort().getTargetPort().getStrVal(), SERVER_PORT_NAME);\n  }\n\n  @Test\n  public void shouldProvisionServiceAndRouteWhenNotFound() throws InternalInfrastructureException {\n    final int PORT = 8080;\n    final String SERVER_PORT_NAME = \"server-\" + PORT;\n\n    CommandImpl command =\n        new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(PORT, null), Collections.emptyMap());\n\n    OpenShiftEnvironment env =\n        OpenShiftEnvironment.builder()\n            .setCommands(singletonList(new CommandImpl(command)))\n            .setRoutes(new HashMap<>())\n            .setServices(new HashMap<>())\n            .build();\n\n    previewUrlEndpointsProvisioner.expose(env);\n\n    assertEquals(env.getRoutes().size(), 1);\n    assertEquals(env.getServices().size(), 1);\n\n    Service provisionedService = env.getServices().values().iterator().next();\n    ServicePort provisionedServicePort = provisionedService.getSpec().getPorts().get(0);\n    assertEquals(provisionedServicePort.getName(), SERVER_PORT_NAME);\n    assertEquals(provisionedServicePort.getPort().intValue(), PORT);\n\n    Route provisionedRoute = env.getRoutes().values().iterator().next();\n    assertEquals(\n        provisionedRoute.getSpec().getTo().getName(), provisionedService.getMetadata().getName());\n    assertEquals(\n        provisionedRoute.getSpec().getPort().getTargetPort().getStrVal(), SERVER_PORT_NAME);\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/util/RoutesTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.workspace.infrastructure.openshift.util;\n\nimport static org.testng.Assert.*;\n\nimport io.fabric8.kubernetes.api.model.IntOrString;\nimport io.fabric8.kubernetes.api.model.ObjectMeta;\nimport io.fabric8.kubernetes.api.model.Service;\nimport io.fabric8.kubernetes.api.model.ServicePort;\nimport io.fabric8.kubernetes.api.model.ServiceSpec;\nimport io.fabric8.openshift.api.model.Route;\nimport io.fabric8.openshift.api.model.RoutePort;\nimport io.fabric8.openshift.api.model.RouteSpec;\nimport io.fabric8.openshift.api.model.RouteTargetReference;\nimport java.util.Collections;\nimport java.util.Optional;\nimport org.testng.annotations.Test;\n\npublic class RoutesTest {\n\n  @Test\n  public void shouldFindRouteWhenPortDefinedByString() {\n    int portInt = 8080;\n    String portString = \"8080\";\n\n    Service service = createService(portString, portInt);\n    Route route = createRoute(new IntOrString(portString));\n\n    Optional<Route> foundRoute =\n        Routes.findRouteForServicePort(Collections.singletonList(route), service, portInt);\n    assertTrue(foundRoute.isPresent());\n    assertEquals(foundRoute.get().getSpec().getHost(), \"testhost\");\n  }\n\n  @Test\n  public void shouldFindRouteWhenPortDefinedByInt() {\n    int portInt = 8080;\n    String portString = \"8080\";\n\n    Service service = createService(portString, portInt);\n    Route route = createRoute(new IntOrString(portInt));\n\n    Optional<Route> foundRoute =\n        Routes.findRouteForServicePort(Collections.singletonList(route), service, portInt);\n    assertTrue(foundRoute.isPresent());\n    assertEquals(foundRoute.get().getSpec().getHost(), \"testhost\");\n  }\n\n  @Test\n  public void shouldReturnEmptyWhenNotFoundByInt() {\n    int portInt = 8080;\n    String portString = \"8080\";\n\n    Service service = createService(portString, portInt);\n    Route route = createRoute(new IntOrString(666));\n\n    Optional<Route> foundRoute =\n        Routes.findRouteForServicePort(Collections.singletonList(route), service, portInt);\n    assertFalse(foundRoute.isPresent());\n  }\n\n  @Test\n  public void shouldReturnEmptyWhenNotFoundByString() {\n    int portInt = 8080;\n    String portString = \"8080\";\n\n    Service service = createService(portString, portInt);\n    Route route = createRoute(new IntOrString(\"666\"));\n\n    Optional<Route> foundRoute =\n        Routes.findRouteForServicePort(Collections.singletonList(route), service, portInt);\n    assertFalse(foundRoute.isPresent());\n  }\n\n  private Route createRoute(IntOrString port) {\n    Route route = new Route();\n    RouteSpec routeSpec = new RouteSpec();\n    routeSpec.setPort(new RoutePort(port));\n    routeSpec.setTo(new RouteTargetReference(\"a\", \"servicename\", 1));\n    routeSpec.setHost(\"testhost\");\n    route.setSpec(routeSpec);\n    return route;\n  }\n\n  private Service createService(String portString, int portInt) {\n    Service service = new Service();\n    ObjectMeta metadata = new ObjectMeta();\n    metadata.setName(\"servicename\");\n    service.setMetadata(metadata);\n    ServiceSpec spec = new ServiceSpec();\n    spec.setPorts(\n        Collections.singletonList(new ServicePort(null, portString, null, portInt, \"TCP\", null)));\n    service.setSpec(spec);\n    return service;\n  }\n}\n"
  },
  {
    "path": "infrastructures/openshift/src/test/resources/devfile/petclinic.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: v1\nkind: List\nitems:\n- apiVersion: v1\n  kind: Pod\n  metadata:\n    name: petclinic\n    labels:\n      app.kubernetes.io/name: petclinic\n      app.kubernetes.io/component: webapp\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    initContainers:\n    - command:\n          - \"echo foo:bar\"\n      image: \"openjdk:11-jre-openjdk9\"\n      name: \"init\"\n    containers:\n    - name: server\n      image: mariolet/petclinic\n      ports:\n      - containerPort: 8080\n        protocol: TCP\n      resources:\n        limits:\n          memory: 512Mi\n- apiVersion: v1\n  kind: Pod\n  metadata:\n    name: mysql\n    labels:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    containers:\n    - name: mysql\n      image: centos/mysql-57-centos7\n      env:\n      - name: MYSQL_USER\n        value: petclinic\n      - name: MYSQL_PASSWORD\n        value: petclinic\n      - name: MYSQL_ROOT_PASSWORD\n        value: petclinic\n      - name: MYSQL_DATABASE\n        value: petclinic\n      ports:\n      - containerPort: 3306\n        protocol: TCP\n      resources:\n        limits:\n          memory: 512Mi\n- apiVersion: v1\n  kind: Pod\n  metadata:\n    name: withoutLabels\n  spec:\n      containers:\n      - name: server\n        imagePullPolicy: Always\n        image: test/petclinic\n        ports:\n        - containerPort: 8080\n          protocol: TCP\n        resources:\n          limits:\n            memory: 512Mi\n        volumeMounts:\n          - name: foo_volume\n            mountPath: /foo/bar\n- kind: Service\n  apiVersion: v1\n  metadata:\n    name: mysql\n    labels:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    ports:\n      - name: mysql\n        port: 3306\n        targetPort: 3360\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n- kind: Service\n  apiVersion: v1\n  metadata:\n    name: petclinic\n    labels:\n      app.kubernetes.io/name: petclinic\n      app.kubernetes.io/component: webapp\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    ports:\n      - name: web\n        port: 8080\n        targetPort: 8080\n    selector:\n      app: petclinic\n      component: webapp\n- kind: Route\n  apiVersion: v1\n  metadata:\n    name: petclinic\n    labels:\n      app.kubernetes.io/name: petclinic\n      app.kubernetes.io/component: webapp\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    to:\n      kind: Service\n      name: petclinic\n    port:\n      targetPort: web\n"
  },
  {
    "path": "infrastructures/openshift/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <appender name=\"file\" class=\"ch.qos.logback.core.FileAppender\">\n        <File>target/log/log.log</File>\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n        <appender-ref ref=\"file\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "infrastructures/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-server</artifactId>\n        <groupId>org.eclipse.che</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n        <relativePath>../pom.xml</relativePath>\n    </parent>\n    <groupId>org.eclipse.che.infrastructure</groupId>\n    <artifactId>che-infrastructures-parent</artifactId>\n    <packaging>pom</packaging>\n    <name>Infrastructure :: Infrastructures Parent</name>\n    <modules>\n        <module>openshift</module>\n        <module>kubernetes</module>\n        <module>infrastructure-metrics</module>\n        <module>infrastructure-distributed</module>\n        <module>infrastructure-permission</module>\n        <module>infrastructure-factory</module>\n    </modules>\n</project>\n"
  },
  {
    "path": "make-release.sh",
    "content": "#!/bin/bash\n# Release process automation script. \n# Used to create branch/tag, update versions in pom.xml\n# build and push maven artifacts and docker images to Quay.io\n\nREGISTRY=\"quay.io\"\nORGANIZATION=\"eclipse\"\n\nIMAGE=\"quay.io/eclipse/che-server\"\nBUILD_PLATFORMS=\"linux/amd64,linux/ppc64le,linux/arm64,linux/s390x\"\n\nsed_in_place() {\n    SHORT_UNAME=$(uname -s)\n  if [ \"$(uname)\" == \"Darwin\" ]; then\n    sed -i '' \"$@\"\n  elif [ \"${SHORT_UNAME:0:5}\" == \"Linux\" ]; then\n    sed -i \"$@\"\n  fi\n}\n\nloadMvnSettingsGpgKey() {\n    set +x\n    mkdir $HOME/.m2\n    #prepare settings.xml for maven and sonatype (central maven repository)\n    echo $CHE_MAVEN_SETTINGS | base64 -d > $HOME/.m2/settings.xml \n    #load GPG key for sign artifacts\n    echo $CHE_OSS_SONATYPE_GPG_KEY | base64 -d > $HOME/.m2/gpg.key\n    #load SSH key for release process\n    echo ${#CHE_OSS_SONATYPE_GPG_KEY}\n    mkdir $HOME/.ssh/\n    echo $CHE_GITHUB_SSH_KEY | base64 -d > $HOME/.ssh/id_rsa\n    chmod 0400 $HOME/.ssh/id_rsa\n    ssh-keyscan github.com >> ~/.ssh/known_hosts\n    set -x\n    export GPG_TTY=$(tty)\n    gpg --import $HOME/.m2/gpg.key\n    # gpg --import --batch $HOME/.m2/gpg.key\n    gpg --version\n}\n\nevaluateCheVariables() {\n    echo \"Che version: ${CHE_VERSION}\"\n    # derive branch from version\n    BRANCH=${CHE_VERSION%.*}.x\n    echo \"Branch: ${BRANCH}\"\n\n    if [[ ${CHE_VERSION} == *\".0\" ]]; then\n        BASEBRANCH=\"main\"\n    else\n        BASEBRANCH=\"${BRANCH}\"\n    fi\n    echo \"Basebranch: ${BASEBRANCH}\" \n}\n\ncheckoutProjects() {\n    checkoutProject git@github.com:eclipse-che/che-server\n}\n\ncheckoutProject() {\n    PROJECT=\"${1##*/}\"\n    echo \"checking out project $PROJECT with ${BRANCH} branch\"\n\n    if [[ ! -d ${PROJECT} ]]; then\n        echo \"project not found in ${PROJECT} directory, performing 'git clone'\"\n        git clone $1\n    fi\n\n    cd $PROJECT\n    git checkout ${BASEBRANCH}\n\n    set -x\n    set +e\n    if [[ \"${BASEBRANCH}\" != \"${BRANCH}\" ]]; then\n        git branch \"${BRANCH}\" || git checkout \"${BRANCH}\" && git pull origin \"${BRANCH}\"\n        git push origin \"${BRANCH}\"\n        git fetch origin \"${BRANCH}:${BRANCH}\"\n        git checkout \"${BRANCH}\"\n    fi\n    set -e\n    set +x\n    cd ..\n}\n\ncheckoutTags() {\n    cd che-server\n    git checkout ${CHE_VERSION}\n    cd ..\n}\n\n# check for build errors, since we're using set +e above to NOT fail the build for network errors\ncheckLogForErrors () {\n    tmplog=\"$1\"\n    errors_in_log=\"$(grep -E \"FAILURE \\[|BUILD FAILURE|Failed to execute goal\" $tmplog || true)\"\n    if [[ ${errors_in_log} ]]; then\n        echo \"${errors_in_log}\"\n        exit 1\n    fi\n}\n\n# TODO change it to someone else?\nsetupGitconfig() {\n  git config --global user.name \"Mykhailo Kuznietsov\"\n  git config --global user.email mkuznets@redhat.com\n\n  # hub CLI configuration\n  git config --global pull.rebase true \n  git config --global push.default matching\n  # replace default GITHUB_TOKEN, that is used by GitHub \n  export GITHUB_TOKEN=\"${CHE_BOT_GITHUB_TOKEN}\"\n}\n\ncommitChangeOrCreatePR() {\n    set +e\n    aVERSION=\"$1\"\n    aBRANCH=\"$2\"\n    PR_BRANCH=\"$3\"\n\n    COMMIT_MSG=\"chore: Bump to ${aVERSION} in ${aBRANCH}\"\n\n    # commit change into branch\n    git commit -asm \"${COMMIT_MSG}\"\n    git pull origin \"${aBRANCH}\"\n\n    PUSH_TRY=\"$(git push origin \"${aBRANCH}\")\"\n    # shellcheck disable=SC2181\n    if [[ $? -gt 0 ]] || [[ $PUSH_TRY == *\"protected branch hook declined\"* ]]; then\n        # create pull request for main branch, as branch is restricted\n        git branch \"${PR_BRANCH}\"\n        git checkout \"${PR_BRANCH}\"\n        git pull origin \"${PR_BRANCH}\" || true\n        git push origin \"${PR_BRANCH}\"\n        gh pr create -f -B \"${aBRANCH}\" -H \"${PR_BRANCH}\"\n    fi\n    set -e\n}\n\ncreateTags() {\n    tagAndCommit che-server\n}\n\ntagAndCommit() {\n    cd $1\n    # this branch isn't meant to be pushed\n    git checkout -b release-${CHE_VERSION}\n    git commit -asm \"chore: Release version ${CHE_VERSION}\"\n    if [ $(git tag -l \"$CHE_VERSION\") ]; then\n        echo \"tag ${CHE_VERSION} already exists! recreating ...\"\n        git tag -d ${CHE_VERSION}\n        git push origin :${CHE_VERSION}\n        git tag \"${CHE_VERSION}\"\n    else\n        echo \"[INFO] creating new tag ${CHE_VERSION}\"\n        git tag \"${CHE_VERSION}\"\n    fi\n    git push --tags\n    echo \"[INFO] tag created and pushed for $1\"\n    cd ..\n}\n\nprepareRelease() {\n    pushd che-server >/dev/null\n        mvn versions:set -DgenerateBackupPoms=false -DallowSnapshots=false -DnewVersion=${CHE_VERSION}\n        echo \"[INFO] Che Server version has been updated to ${CHE_VERSION} \"\n\n        # Replace dependencies in che-server parent\n        sed -i -e \"s#<che.version>.*<\\/che.version>#<che.version>${CHE_VERSION}<\\/che.version>#\" pom.xml\n        echo \"[INFO] Dependencies updated in che-server parent\"\n\n        # TODO pull parent pom version from VERSION file, instead of being hardcoded\n        pushd typescript-dto >/dev/null\n            sed -i -e \"s#<che.version>.*<\\/che.version>#<che.version>${CHE_VERSION}<\\/che.version>#\" dto-pom.xml\n            echo \"[INFO] Dependencies updated in che typescript DTO (che server = ${CHE_VERSION})\"\n        popd >/dev/null\n\n        # run mvn license format, in case some files that have old license headers have been updated\n        mvn license:format\n    popd >/dev/null\n}\n\nreleaseCheServer() {\n    set -x\n    tmpmvnlog=/tmp/mvn.log.txt\n\n    pushd che-server >/dev/null\n    rm -f $tmpmvnlog || true\n    set +e\n    mvn clean install -U -Pcodenvy-release -Dgpg.passphrase=$CHE_OSS_SONATYPE_PASSPHRASE | tee $tmpmvnlog\n    EXIT_CODE=$?\n    set -e\n    # try maven build again if we receive a server error\n    if grep -q -E \"502 - Bad Gateway\" $tmpmvnlog; then\n        rm -f $tmpmvnlog || true\n        mvn clean install -U -Pcodenvy-release -Dgpg.passphrase=$CHE_OSS_SONATYPE_PASSPHRASE | tee $tmpmvnlog\n        EXIT_CODE=$?\n    fi\n\n    # check log for errors if build successful; if failed, no need to check (already failed)\n    if [ $EXIT_CODE -eq 0 ]; then\n        checkLogForErrors $tmpmvnlog\n        echo 'Build of che-server: Success!'\n    else\n        echo '[ERROR] 2. Build of che-server: Failed!'\n        exit $EXIT_CODE\n    fi\n    set +x\n    popd >/dev/null\n}\n\nreleaseTypescriptDto() {\n    pushd che-server/typescript-dto >/dev/null\n    ./build.sh\n    popd >/dev/null\n}\n\nbuildAndPushImages() {\n    echo \"Going to build docker images\"\n    set -e\n    set -o pipefail\n    TAG=$1\n  \n    # stop / rm all containers\n    if [[ $(podman ps -aq) != \"\" ]];then\n        podman rm -f \"$(podman ps -aq)\"\n    fi\n\n    # BUILD AND PUSH IMAGES\n    bash \"$(pwd)/che-server/build/build.sh\" --tag:${TAG} --latest-tag --build-platforms:${BUILD_PLATFORMS} --builder:podman --push-image\n    if [[ $? -ne 0 ]]; then\n       echo \"ERROR:\"\n       echo \"build of che-server image $TAG is failed!\"\n       exit 1\n    fi\n}\n\nbumpVersions() {\n    # infer project version + commit change into ${BASEBRANCH} branch\n    echo \"${BASEBRANCH} ${BRANCH}\"\n    if [[ \"${BASEBRANCH}\" != \"${BRANCH}\" ]]; then\n        # bump the y digit\n        [[ ${BRANCH} =~ ^([0-9]+)\\.([0-9]+)\\.x ]] && BASE=${BASH_REMATCH[1]}; NEXT=${BASH_REMATCH[2]}; (( NEXT=NEXT+1 )) # for BRANCH=7.10.x, get BASE=7, NEXT=11\n        NEXTVERSION_Y=\"${BASE}.${NEXT}.0-SNAPSHOT\"\n        bumpVersion ${NEXTVERSION_Y} ${BASEBRANCH}\n    fi\n    # bump the z digit\n    [[ ${CHE_VERSION} =~ ^([0-9]+)\\.([0-9]+)\\.([0-9]+) ]] && BASE=\"${BASH_REMATCH[1]}.${BASH_REMATCH[2]}\"; NEXT=\"${BASH_REMATCH[3]}\"; (( NEXT=NEXT+1 )) # for VERSION=7.7.1, get BASE=7.7, NEXT=2\n    NEXTVERSION_Z=\"${BASE}.${NEXT}-SNAPSHOT\"\n    bumpVersion ${NEXTVERSION_Z} ${BRANCH}\n}\n\nbumpVersion() {\n    set -x\n    echo \"[info]bumping to version $1 in branch $2\"\n\n    pushd che-server >/dev/null\n        git checkout $2\n        # compute current version of root pom\n        current_root_pom_version=$(grep \"<che.version>\" pom.xml | sed -r -e \"s#.+<che.version>([^<>]+)</che.version>.*#\\1#\")\n\n        mvn versions:set -DgenerateBackupPoms=false -DallowSnapshots=true -DnewVersion=$1\n        sed -i -e \"s#<che.version>.*<\\/che.version>#<che.version>$1<\\/che.version>#\" pom.xml\n        pushd typescript-dto >/dev/null\n            sed -i -e \"s#<che.version>.*<\\/che.version>#<che.version>${1}<\\/che.version>#\" dto-pom.xml\n        popd >/dev/null\n\n        # update integration tests to new root pom version\n        find . -name \"pom.xml\" -exec sed -i {} -r -e \"s@<version>${current_root_pom_version}</version>@<version>$1</version>@g\" \\;\n\n        # run mvn license format, in case some files that have old license headers have been updated\n        mvn license:format\n        commitChangeOrCreatePR $1 $2 \"pr-${2}-to-${1}\"\n    popd >/dev/null\n    set +x\n}\n\nupdateImageTagsInCheServer() {\n    pushd che-server >/dev/null\n        git checkout ${BRANCH}\n        plugin_version=\"latest\"\n        sed_in_place -r -e \"s#che.factory.default_editor=eclipse/che-theia/.*#che.factory.default_editor=eclipse/che-theia/$plugin_version#g\" assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties\n        sed_in_place -r -e \"s#che.workspace.devfile.default_editor=eclipse/che-theia/.*#che.workspace.devfile.default_editor=eclipse/che-theia/$plugin_version#g\" assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties\n\n        if [[ $(git diff --stat) != '' ]]; then\n            git commit -asm \"chore: Set ${CHE_VERSION} release image tags\"\n            git pull origin \"${BRANCH}\" || true\n            git push origin \"${BRANCH}\"\n        fi\n    popd >/dev/null\n}\n\nloadMvnSettingsGpgKey\n\nset -x\nsetupGitconfig\n\nevaluateCheVariables\n\ncheckoutProjects\n\nif [[ \"${BUMP_NEXT_VERSION}\" = \"true\" ]]; then\n    bumpVersions\n    updateImageTagsInCheServer\n    # checkout back to branches to make release from\n    checkoutProjects\nfi\n\nif [[ \"${REBUILD_FROM_EXISTING_TAGS}\" = \"true\" ]]; then\n    echo \"[INFO] Checking out from existing ${CHE_VERSION} tag\"\n    checkoutTags\nelse\n    echo \"[INFO] Creating a new ${CHE_VERSION} tag\"\n    prepareRelease\n    createTags\nfi\nreleaseCheServer\nreleaseTypescriptDto\n\nif [[ \"${BUILD_AND_PUSH_IMAGES}\" = \"true\" ]]; then\n    buildAndPushImages  ${CHE_VERSION}\nfi\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-multiuser-api</artifactId>\n        <groupId>org.eclipse.che.multiuser</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-multiuser-api-authentication-commons</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Multiuser :: API :: Authentication Commons</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/main/java/org/eclipse/che/multiuser/api/authentication/commons/Constants.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons;\n\n/** Auth-related constants. */\npublic class Constants {\n\n  /** Name of the subject attribute in the Http session */\n  public static final String CHE_SUBJECT_ATTRIBUTE = \"che_subject\";\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/main/java/org/eclipse/che/multiuser/api/authentication/commons/DestroySessionListener.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons;\n\nimport static org.eclipse.che.multiuser.api.authentication.commons.Constants.CHE_SUBJECT_ATTRIBUTE;\n\nimport com.google.inject.Injector;\nimport jakarta.servlet.ServletContext;\nimport jakarta.servlet.http.HttpSessionEvent;\nimport jakarta.servlet.http.HttpSessionListener;\nimport java.util.Optional;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Purges deleted sessions from sessions cache store. */\npublic class DestroySessionListener implements HttpSessionListener {\n\n  private static final Logger LOG = LoggerFactory.getLogger(DestroySessionListener.class);\n\n  @Override\n  public final void sessionCreated(HttpSessionEvent sessionEvent) {}\n\n  @Override\n  public void sessionDestroyed(HttpSessionEvent sessionEvent) {\n\n    ServletContext servletContext = sessionEvent.getSession().getServletContext();\n\n    Optional<SessionStore> sessionStoreOptional = getSessionStoreInstance(servletContext);\n    if (!sessionStoreOptional.isPresent()) {\n      LOG.error(\n          \"Unable to remove session from store. Session store is not configured in servlet context.\");\n      return;\n    }\n    SessionStore sessionStore = sessionStoreOptional.get();\n    Subject subject = (Subject) sessionEvent.getSession().getAttribute(CHE_SUBJECT_ATTRIBUTE);\n    if (subject != null) {\n      sessionStore.remove(subject.getUserId());\n    }\n  }\n\n  /** Searches session store component in servlet context when with help of guice injector. */\n  private Optional<SessionStore> getSessionStoreInstance(ServletContext servletContext) {\n    String attributeName = SessionStore.class.getName();\n    SessionStore result = (SessionStore) servletContext.getAttribute(attributeName);\n    if (result == null) {\n      Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName());\n      if (injector != null) {\n        result = injector.getInstance(SessionStore.class);\n        if (result != null) {\n          servletContext.setAttribute(attributeName, result);\n        }\n      }\n    }\n    return Optional.ofNullable(result);\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/main/java/org/eclipse/che/multiuser/api/authentication/commons/SessionStore.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons;\n\nimport jakarta.servlet.http.HttpSession;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.function.Function;\nimport javax.inject.Singleton;\n\n/**\n * Thread safe {@link HttpSession} storage based on {@link ConcurrentHashMap}. Sessions are stored\n * per user Id, and should be externally aligned with catalina session manager using {@link\n * jakarta.servlet.http.HttpSessionListener} etc.\n */\n@Singleton\npublic class SessionStore {\n\n  private final ConcurrentHashMap<String, HttpSession> userIdToSession;\n\n  public SessionStore() {\n    this.userIdToSession = new ConcurrentHashMap<>();\n  }\n\n  /** Fetches stored session if present or creates new using provided function */\n  public HttpSession getSession(\n      String userId, Function<? super String, ? extends HttpSession> createSessionFunction) {\n    return userIdToSession.computeIfAbsent(userId, createSessionFunction);\n  }\n\n  /** Fetches stored session if present or returns {@code null} otherwise */\n  public HttpSession getSession(String userId) {\n    return userIdToSession.get(userId);\n  }\n\n  /** Removes stored session */\n  public void remove(String userId) {\n    userIdToSession.remove(userId);\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/main/java/org/eclipse/che/multiuser/api/authentication/commons/SubjectHttpRequestWrapper.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletRequestWrapper;\nimport java.security.Principal;\nimport org.eclipse.che.commons.subject.Subject;\n\n/**\n * Wraps {@link HttpServletRequest} and overrides {@link HttpServletRequest#getRemoteUser} and\n * {@link HttpServletRequest#getUserPrincipal} to return an values based on current {@link Subject}\n * which is calculated during request authentication process.\n */\npublic class SubjectHttpRequestWrapper extends HttpServletRequestWrapper {\n\n  private final Principal principal;\n\n  public SubjectHttpRequestWrapper(HttpServletRequest request, Subject subject) {\n    super(request);\n    this.subject = subject;\n    this.principal = subject::getUserName;\n  }\n\n  private final Subject subject;\n\n  @Override\n  public String getRemoteUser() {\n    return subject.getUserName();\n  }\n\n  @Override\n  public Principal getUserPrincipal() {\n    return principal;\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/main/java/org/eclipse/che/multiuser/api/authentication/commons/filter/MultiUserEnvironmentInitializationFilter.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons.filter;\n\nimport static org.eclipse.che.multiuser.api.authentication.commons.Constants.CHE_SUBJECT_ATTRIBUTE;\n\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletRequestWrapper;\nimport jakarta.servlet.http.HttpServletResponse;\nimport jakarta.servlet.http.HttpSession;\nimport java.io.IOException;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Optional;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.multiuser.api.authentication.commons.SessionStore;\nimport org.eclipse.che.multiuser.api.authentication.commons.SubjectHttpRequestWrapper;\nimport org.eclipse.che.multiuser.api.authentication.commons.token.RequestTokenExtractor;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Performs basic environment initialization actions as follows:\n *\n * <ul>\n *   <li>Extracts token from request\n *   <li>Checks token for validity and fetch user Id (implementation specific)\n *   <li>Fetch cached {@link HttpSession} or requests to create new one\n *   <li>Gets {@link Subject} stored in session or construct new (implementation specific))\n *   <li>Set subject for current request into {@link EnvironmentContext}\n * </ul>\n *\n * <p>{@link MultiUserEnvironmentInitializationFilter#UNAUTHORIZED_ENDPOINT_PATHS} is list of\n * unauthenticated paths, that are allowed without token.\n *\n * @param <T> the type of intermediary type used for conversion from a string token to a Subject\n * @author Max Shaposhnyk (mshaposh@redhat.com)\n */\npublic abstract class MultiUserEnvironmentInitializationFilter<T> implements Filter {\n\n  private static final Logger LOG =\n      LoggerFactory.getLogger(MultiUserEnvironmentInitializationFilter.class);\n\n  private static final List<String> UNAUTHORIZED_ENDPOINT_PATHS =\n      Collections.singletonList(\"/system/state\");\n\n  private final SessionStore sessionStore;\n  private final RequestTokenExtractor tokenExtractor;\n\n  public MultiUserEnvironmentInitializationFilter(\n      SessionStore sessionStore, RequestTokenExtractor tokenExtractor) {\n    this.sessionStore = sessionStore;\n    this.tokenExtractor = tokenExtractor;\n  }\n\n  /**\n   * Wraps {@link HttpServletRequest} to handle HTTP session creation requests and return cached one\n   * if possible, so the same user will always have single session despite the fact he is using\n   * different kind of tokens or several tokens of the same kind (for example logged in in different\n   * browsers)\n   */\n  protected class SessionCachedHttpRequest extends HttpServletRequestWrapper {\n\n    private final String userId;\n\n    /**\n     * Constructs a request object wrapping the given request.\n     *\n     * @throws IllegalArgumentException if the request is null\n     */\n    public SessionCachedHttpRequest(ServletRequest request, String userId) {\n      super((HttpServletRequest) request);\n      this.userId = userId;\n    }\n\n    @Override\n    public HttpSession getSession() {\n      return getOrCreateSession(true);\n    }\n\n    @Override\n    public HttpSession getSession(boolean create) {\n      return getOrCreateSession(create);\n    }\n\n    /* Finds cached session or creates new if allowed */\n    private HttpSession getOrCreateSession(boolean createNew) {\n      HttpSession session = super.getSession(false);\n      if (session != null) {\n        return session;\n      }\n      if (!createNew) {\n        return sessionStore.getSession(userId);\n      } else {\n        return sessionStore.getSession(\n            userId, s -> SessionCachedHttpRequest.super.getSession(true));\n      }\n    }\n  }\n\n  @Override\n  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n      throws IOException, ServletException {\n\n    Subject sessionSubject;\n    HttpServletRequest httpRequest = (HttpServletRequest) request;\n    final String token = tokenExtractor.getToken(httpRequest);\n    if (token == null) {\n      handleMissingToken(request, response, chain);\n      return;\n    }\n    Optional<T> maybeProcessedToken = processToken(token);\n    if (maybeProcessedToken.isEmpty()) {\n      handleMissingToken(request, response, chain);\n      return;\n    }\n\n    T processedToken = maybeProcessedToken.get();\n\n    String userId = getUserId(processedToken);\n\n    // retrieve cached session if any or create new\n    httpRequest = new SessionCachedHttpRequest(request, userId);\n    HttpSession session = httpRequest.getSession(true);\n    // retrieve and check / create new subject\n    sessionSubject = (Subject) session.getAttribute(CHE_SUBJECT_ATTRIBUTE);\n    if (sessionSubject == null) {\n      sessionSubject = extractSubject(token, processedToken);\n      session.setAttribute(CHE_SUBJECT_ATTRIBUTE, sessionSubject);\n    } else if (!sessionSubject.getUserId().equals(userId)) {\n      LOG.debug(\n          \"Invalidating session with mismatched user IDs: old was '{}', new is '{}'.\",\n          sessionSubject.getUserId(),\n          userId);\n      session.invalidate();\n      HttpSession new_session = httpRequest.getSession(true);\n      sessionSubject = extractSubject(token, processedToken);\n      new_session.setAttribute(CHE_SUBJECT_ATTRIBUTE, sessionSubject);\n    } else if (!sessionSubject.getToken().equals(token)) {\n      sessionSubject = extractSubject(token, processedToken);\n      session.setAttribute(CHE_SUBJECT_ATTRIBUTE, sessionSubject);\n    }\n    // set current subject\n    try {\n      EnvironmentContext.getCurrent().setSubject(sessionSubject);\n      chain.doFilter(new SubjectHttpRequestWrapper(httpRequest, sessionSubject), response);\n    } finally {\n      EnvironmentContext.reset();\n    }\n  }\n\n  /**\n   * Processes the token and creates implementation-specific intermediary type using which the\n   * subclasses can extract different kinds of information like user ID or subject.\n   *\n   * <p>This <b>may</b> also imply verification of token signature or encryption for\n   * encrypted/signed tokens (like JWT etc).\n   *\n   * @param token the token to process\n   * @return a processed token or null if the token could not be processed for valid reasons (like\n   *     expiry or not matching any user).\n   */\n  protected abstract Optional<T> processToken(String token);\n\n  /**\n   * Retrieves the id of the user from given authentication token.\n   *\n   * @param processedToken the processed authentication string\n   * @return user id given token belongs to\n   */\n  protected abstract String getUserId(T processedToken);\n\n  /**\n   * Calculates user {@link Subject} from given authentication token.\n   *\n   * @param token the original authentication token string\n   * @param processedToken the processed authentication string\n   * @return constructed subject\n   */\n  protected abstract Subject extractSubject(String token, T processedToken) throws ServletException;\n\n  /**\n   * Describes behavior when the token is missed. In case if performing authentication by given\n   * implementing filter isn't required, it may be invocation of {@link FilterChain#doFilter} or\n   * throwing of appropriate exception otherwise.\n   *\n   * @param request http request\n   * @param response http response\n   * @param chain filter chain\n   * @throws IOException inherited from {@link FilterChain#doFilter}\n   * @throws ServletException inherited from {@link FilterChain#doFilter}\n   */\n  protected void handleMissingToken(\n      ServletRequest request, ServletResponse response, FilterChain chain)\n      throws IOException, ServletException {\n    // if request path is in unauthorized endpoints, continue\n    if (request instanceof HttpServletRequest) {\n      HttpServletRequest httpRequest = (HttpServletRequest) request;\n      String path = httpRequest.getServletPath();\n      if (UNAUTHORIZED_ENDPOINT_PATHS.contains(path)) {\n        LOG.debug(\"Allowing request to '{}' without authorization header.\", path);\n        chain.doFilter(request, response);\n        return;\n      }\n    }\n\n    LOG.error(\"Rejecting the request due to missing/expired token in Authorization header.\");\n    sendError(response, 401, \"Authorization token is missing or expired\");\n  }\n\n  /**\n   * Sends appropriate error status code and message into response.\n   *\n   * @param res response to send error message\n   * @param errorCode status code to send\n   * @param message sessage to send\n   * @throws IOException inherited from {@link HttpServletResponse#sendError}\n   */\n  protected void sendError(ServletResponse res, int errorCode, String message) throws IOException {\n    HttpServletResponse response = (HttpServletResponse) res;\n    response.sendError(errorCode, message);\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/main/java/org/eclipse/che/multiuser/api/authentication/commons/token/ChainedTokenExtractor.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons.token;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\n/**\n * Try to extract token from request in 3 steps. 1. From query parameter. 2. From header. 3. From\n * cookie.\n *\n * @author Sergii Kabashniuk\n */\npublic class ChainedTokenExtractor implements RequestTokenExtractor {\n\n  private final HeaderRequestTokenExtractor headerRequestTokenExtractor;\n\n  private final QueryRequestTokenExtractor queryRequestTokenExtractor;\n\n  public ChainedTokenExtractor() {\n    headerRequestTokenExtractor = new HeaderRequestTokenExtractor();\n    queryRequestTokenExtractor = new QueryRequestTokenExtractor();\n  }\n\n  @Override\n  public String getToken(HttpServletRequest req) {\n    String token;\n    if ((token = queryRequestTokenExtractor.getToken(req)) == null) {\n      token = headerRequestTokenExtractor.getToken(req);\n    }\n    return token;\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/main/java/org/eclipse/che/multiuser/api/authentication/commons/token/HeaderRequestTokenExtractor.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons.token;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.ws.rs.BadRequestException;\nimport jakarta.ws.rs.core.HttpHeaders;\n\n/** Extract sso token from request headers. */\npublic class HeaderRequestTokenExtractor implements RequestTokenExtractor {\n\n  @Override\n  public String getToken(HttpServletRequest req) {\n    if (req.getHeader(HttpHeaders.AUTHORIZATION) == null) {\n      return null;\n    }\n    if (req.getHeader(HttpHeaders.AUTHORIZATION).toLowerCase().startsWith(\"bearer\")) {\n      String[] parts = req.getHeader(HttpHeaders.AUTHORIZATION).split(\" \");\n      if (parts.length != 2) {\n        throw new BadRequestException(\"Invalid authorization header format.\");\n      }\n      return parts[1];\n    } else {\n      return req.getHeader(HttpHeaders.AUTHORIZATION);\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/main/java/org/eclipse/che/multiuser/api/authentication/commons/token/QueryRequestTokenExtractor.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons.token;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\n/**\n * @author Max Shaposhnik (mshaposh@redhat.com)\n */\npublic class QueryRequestTokenExtractor implements RequestTokenExtractor {\n  @Override\n  public String getToken(HttpServletRequest req) {\n    String query = req.getQueryString();\n    if (query != null) {\n      int start = query.indexOf(\"&token=\");\n      if (start != -1 || query.startsWith(\"token=\")) {\n        int end = query.indexOf('&', start + 7);\n        if (end == -1) {\n          end = query.length();\n        }\n        if (end != start + 7) {\n          return query.substring(start + 7, end);\n        }\n      }\n    }\n    return null;\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/main/java/org/eclipse/che/multiuser/api/authentication/commons/token/RequestTokenExtractor.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons.token;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\n/** Allows to extract sso token from request. */\npublic interface RequestTokenExtractor {\n  /**\n   * Extract token from request.\n   *\n   * @param req - request object.\n   * @return - token if it was found, null otherwise.\n   */\n  String getToken(HttpServletRequest req);\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/test/java/org/eclipse/che/multiuser/api/authentication/commons/SessionStoreTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons;\n\nimport static org.mockito.Mockito.mock;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNull;\n\nimport jakarta.servlet.http.HttpSession;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class SessionStoreTest {\n\n  private final String userId = \"userId\";\n\n  private SessionStore sessionStore;\n\n  @BeforeMethod\n  public void setUp() {\n    this.sessionStore = new SessionStore();\n  }\n\n  @Test\n  public void shouldCreateSessionOnlyIfAbsent() {\n    HttpSession sessionMock = mock(HttpSession.class);\n    HttpSession result1 = sessionStore.getSession(userId, s -> sessionMock);\n    assertEquals(result1, sessionMock);\n    HttpSession result2 = sessionStore.getSession(userId, s -> null);\n    assertEquals(result2, sessionMock);\n  }\n\n  @Test\n  public void shouldGetSessionById() {\n    HttpSession sessionMock = mock(HttpSession.class);\n    sessionStore.getSession(userId, s -> sessionMock);\n    HttpSession result = sessionStore.getSession(userId);\n    assertEquals(result, sessionMock);\n  }\n\n  @Test\n  public void shouldRemoveSessionById() {\n    HttpSession sessionMock = mock(HttpSession.class);\n    sessionStore.getSession(userId, s -> sessionMock);\n    sessionStore.remove(userId);\n    HttpSession result = sessionStore.getSession(userId);\n    assertNull(result);\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/test/java/org/eclipse/che/multiuser/api/authentication/commons/SubjectHttpRequestWrapperTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons;\n\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.security.Principal;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(value = MockitoTestNGListener.class)\npublic class SubjectHttpRequestWrapperTest {\n\n  private final String userName = \"userName\";\n  @Mock private Subject subject;\n\n  @Mock private HttpServletRequest servletRequest;\n\n  private SubjectHttpRequestWrapper subjectHttpRequestWrapper;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    when(subject.getUserName()).thenReturn(userName);\n    this.subjectHttpRequestWrapper = new SubjectHttpRequestWrapper(servletRequest, subject);\n  }\n\n  @Test\n  public void shouldReturnRemoteUserFromSubject() {\n    String user = subjectHttpRequestWrapper.getRemoteUser();\n    verify(subject).getUserName();\n    verifyNoMoreInteractions(subject);\n    assertEquals(user, userName);\n  }\n\n  @Test\n  public void shouldConstructPrincipalFromSubject() {\n    Principal principal = subjectHttpRequestWrapper.getUserPrincipal();\n    assertEquals(principal.getName(), userName);\n    verify(subject).getUserName();\n    verifyNoMoreInteractions(subject);\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/test/java/org/eclipse/che/multiuser/api/authentication/commons/filter/MultiUserEnvironmentInitializationFilterTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons.filter;\n\nimport static org.eclipse.che.multiuser.api.authentication.commons.Constants.CHE_SUBJECT_ATTRIBUTE;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\nimport static org.mockito.Mockito.when;\nimport static org.mockito.Mockito.withSettings;\n\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport jakarta.servlet.http.HttpSession;\nimport java.io.IOException;\nimport java.util.Collections;\nimport java.util.Optional;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.multiuser.api.authentication.commons.SessionStore;\nimport org.eclipse.che.multiuser.api.authentication.commons.token.RequestTokenExtractor;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(value = MockitoTestNGListener.class)\npublic class MultiUserEnvironmentInitializationFilterTest {\n\n  @Mock private SessionStore sessionStore;\n  @Mock private RequestTokenExtractor tokenExtractor;\n  @Mock private HttpServletRequest request;\n  @Mock private HttpServletResponse response;\n  @Mock private HttpSession session;\n  @Mock private FilterChain chain;\n\n  private final String userId = \"user-abc-123\";\n  private final String token = \"token-abc123\";\n  private final Subject subject =\n      new SubjectImpl(\"user\", Collections.emptyList(), userId, token, false);\n\n  private MultiUserEnvironmentInitializationFilter<Object> filter;\n\n  @BeforeMethod\n  @SuppressWarnings(\"unchecked\")\n  public void setUp() throws Exception {\n    filter =\n        mock(\n            MultiUserEnvironmentInitializationFilter.class,\n            withSettings()\n                .defaultAnswer(Mockito.CALLS_REAL_METHODS)\n                .useConstructor(sessionStore, tokenExtractor));\n    lenient().when(filter.getUserId(any())).thenReturn(userId);\n    lenient().when(filter.extractSubject(anyString(), any())).thenReturn(subject);\n    // pretend like we successfully processed the token unless defined otherwise in the tests\n    lenient().when(filter.processToken(anyString())).thenReturn(Optional.of(new Object()));\n  }\n\n  @Test\n  public void shouldCallHandleMissingTokenIfTokenIsNull() throws Exception {\n    // given\n    when(tokenExtractor.getToken(any(HttpServletRequest.class))).thenReturn(null);\n\n    // when\n    filter.doFilter(request, response, chain);\n\n    // then\n    verify(tokenExtractor).getToken(eq(request));\n    verify(filter).handleMissingToken(eq(request), eq(response), eq(chain));\n    verify(request).getServletPath();\n    verifyNoMoreInteractions(request);\n    verify(filter, never()).getUserId(any());\n    verify(filter, never()).extractSubject(anyString(), any());\n  }\n\n  @Test\n  public void shouldCallHandleMissingTokenIfTokenCannotBeProcessed() throws Exception {\n    // given\n    when(tokenExtractor.getToken(any(HttpServletRequest.class))).thenReturn(\"abc\");\n    when(filter.processToken(anyString())).thenReturn(Optional.empty());\n\n    // when\n    filter.doFilter(request, response, chain);\n\n    // then\n    verify(tokenExtractor).getToken(eq(request));\n    verify(filter).handleMissingToken(eq(request), eq(response), eq(chain));\n    verify(request).getServletPath();\n    verifyNoMoreInteractions(request);\n    verify(filter, never()).getUserId(any());\n    verify(filter, never()).extractSubject(anyString(), any());\n  }\n\n  @Test\n  public void shouldGetSessionFromStoreWithCorrectUserId() throws Exception {\n    when(tokenExtractor.getToken(any(HttpServletRequest.class))).thenReturn(token);\n    when(sessionStore.getSession(eq(userId), any())).thenReturn(session);\n\n    // when\n    filter.doFilter(request, response, chain);\n    // then\n    verify(request).getSession(eq(false));\n    verify(tokenExtractor).getToken(eq(request));\n    verify(filter).getUserId(any());\n    verify(sessionStore).getSession(eq(userId), any());\n  }\n\n  @Test\n  public void shouldCreateSubjectIfSessionDidNotContainOne() throws Exception {\n    when(tokenExtractor.getToken(any(HttpServletRequest.class))).thenReturn(token);\n    when(sessionStore.getSession(eq(userId), any())).thenReturn(session);\n    when(session.getAttribute(eq(CHE_SUBJECT_ATTRIBUTE))).thenReturn(null);\n    // when\n    filter.doFilter(request, response, chain);\n    // then\n    verify(filter).extractSubject(eq(token), any());\n  }\n\n  @Test\n  public void shouldReCreateSubjectIfTokensDidNotMatch() throws Exception {\n    Subject otherSubject =\n        new SubjectImpl(\n            subject.getUserId(), Collections.emptyList(), subject.getUserName(), \"token111\", false);\n    when(tokenExtractor.getToken(any(HttpServletRequest.class))).thenReturn(token);\n    when(sessionStore.getSession(eq(userId), any())).thenReturn(session);\n    when(session.getAttribute(eq(CHE_SUBJECT_ATTRIBUTE))).thenReturn(otherSubject);\n    // when\n    filter.doFilter(request, response, chain);\n    // then\n    verify(filter).extractSubject(eq(token), any());\n  }\n\n  @Test\n  public void shouldInvalidateSessionIfUserChanged() throws Exception {\n    Subject otherSubject =\n        new SubjectImpl(\"another_user\", Collections.emptyList(), \"user987\", \"token111\", false);\n    when(tokenExtractor.getToken(any(HttpServletRequest.class))).thenReturn(token);\n    when(sessionStore.getSession(eq(userId), any())).thenReturn(session);\n    when(session.getAttribute(eq(CHE_SUBJECT_ATTRIBUTE))).thenReturn(otherSubject);\n    // when\n    filter.doFilter(request, response, chain);\n    // then\n    verify(session).invalidate();\n    verify(filter).extractSubject(eq(token), any());\n  }\n\n  @Test\n  public void shouldSetSubjectIntoEnvironmentContext() throws Exception {\n    EnvironmentContext context = spy(EnvironmentContext.getCurrent());\n    EnvironmentContext.setCurrent(context);\n    when(tokenExtractor.getToken(any(HttpServletRequest.class))).thenReturn(token);\n    when(sessionStore.getSession(eq(userId), any())).thenReturn(session);\n    when(session.getAttribute(eq(CHE_SUBJECT_ATTRIBUTE))).thenReturn(subject);\n    // when\n    filter.doFilter(request, response, chain);\n    // then\n    verify(context).setSubject(eq(subject));\n  }\n\n  @Test\n  public void handleMissingTokenShouldAllowUnauthorizedEndpoint()\n      throws ServletException, IOException {\n    when(request.getServletPath()).thenReturn(\"/system/state\");\n\n    filter.handleMissingToken(request, response, chain);\n\n    verify(chain).doFilter(request, response);\n  }\n\n  @Test\n  public void handleMissingTokenShouldRejectRequest() throws ServletException, IOException {\n    when(request.getServletPath()).thenReturn(\"blabol\");\n\n    filter.handleMissingToken(request, response, chain);\n\n    verify(response).sendError(eq(401), anyString());\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authentication-commons/src/test/java/org/eclipse/che/multiuser/api/authentication/commons/token/HeaderRequestTokenExtractorTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.authentication.commons.token;\n\nimport static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.ws.rs.BadRequestException;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class HeaderRequestTokenExtractorTest {\n\n  private HeaderRequestTokenExtractor tokenExtractor = new HeaderRequestTokenExtractor();\n\n  @Mock HttpServletRequest servletRequest;\n\n  @Test(dataProvider = \"validHeadersProvider\")\n  public void shouldExtractTokensFromValidHeaders(String headerValue, String expectedToken) {\n\n    when(servletRequest.getHeader(eq(AUTHORIZATION))).thenReturn(headerValue);\n\n    // when\n    String token = tokenExtractor.getToken(servletRequest);\n\n    // then\n    assertEquals(token, expectedToken);\n  }\n\n  @Test(\n      dataProvider = \"invalidHeadersProvider\",\n      expectedExceptions = BadRequestException.class,\n      expectedExceptionsMessageRegExp = \"Invalid authorization header format.\")\n  public void shouldThrowExceptionOnInvalidToken(String headerValue) {\n\n    when(servletRequest.getHeader(eq(AUTHORIZATION))).thenReturn(headerValue);\n\n    // when\n    tokenExtractor.getToken(servletRequest);\n  }\n\n  @DataProvider\n  private Object[][] validHeadersProvider() {\n    return new Object[][] {\n      {\"token123\", \"token123\"},\n      {\"bearer token123\", \"token123\"},\n      {\"Bearer token123\", \"token123\"},\n    };\n  }\n\n  @DataProvider\n  private Object[][] invalidHeadersProvider() {\n    return new Object[][] {{\"bearertoken123\"}, {\"bearer   token123\"}, {\"bearer token 123\"}};\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authorization/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-multiuser-api</artifactId>\n        <groupId>org.eclipse.che.multiuser</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-multiuser-api-authorization</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Multiuser :: API :: Authorization</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-permission-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-permission</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <resources>\n            <resource>\n                <directory>src/main/java</directory>\n            </resource>\n            <resource>\n                <directory>src/main/resources</directory>\n            </resource>\n            <resource>\n                <directory>${dto-generator-out-directory}</directory>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.multiuser</groupId>\n                        <artifactId>che-multiuser-api-permission-shared</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n                <configuration>\n                    <dtoPackages>\n                        <package>org.eclipse.che.api.permission.shared.dto</package>\n                    </dtoPackages>\n                    <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                    <genClassName>org.eclipse.che.multiuser.api.permission.server.dto.DtoServerImpls</genClassName>\n                    <impl>server</impl>\n                </configuration>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-domain</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authorization/src/main/java/org/eclipse/che/multiuser/api/permission/server/AuthorizedSubject.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server;\n\nimport static java.lang.String.format;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Sets up implementation of {@link Subject} that can check permissions.\n *\n * @author Sergii Leschenko\n */\npublic class AuthorizedSubject implements Subject {\n\n  private static final Logger LOG = LoggerFactory.getLogger(AuthorizedSubject.class);\n\n  private final Subject baseSubject;\n  private final PermissionChecker permissionChecker;\n\n  public AuthorizedSubject(Subject baseSubject, PermissionChecker permissionChecker) {\n    this.baseSubject = baseSubject;\n    this.permissionChecker = permissionChecker;\n  }\n\n  @Override\n  public String getUserName() {\n    return baseSubject.getUserName();\n  }\n\n  @Override\n  public List<String> getGroups() {\n    return baseSubject.getGroups();\n  }\n\n  @Override\n  public boolean hasPermission(String domain, String instance, String action) {\n    try {\n      return permissionChecker.hasPermission(getUserId(), domain, instance, action);\n    } catch (NotFoundException nfe) {\n      return false;\n    } catch (ServerException | ConflictException e) {\n      LOG.error(\n          format(\n              \"Can't check permissions for user '%s' and instance '%s' of domain '%s'\",\n              getUserId(), domain, instance),\n          e);\n      throw new RuntimeException(\"Can't check user's permissions\", e);\n    }\n  }\n\n  @Override\n  public void checkPermission(String domain, String instance, String action)\n      throws ForbiddenException {\n    if (!hasPermission(domain, instance, action)) {\n      String message = \"User is not authorized to perform \" + action + \" of \" + domain;\n      if (instance != null) {\n        message += \" with id '\" + instance + \"'\";\n      }\n      throw new ForbiddenException(message);\n    }\n  }\n\n  @Override\n  public String getToken() {\n    return baseSubject.getToken();\n  }\n\n  @Override\n  public String getUserId() {\n    return baseSubject.getUserId();\n  }\n\n  @Override\n  public boolean isTemporary() {\n    return baseSubject.isTemporary();\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authorization/src/main/java/org/eclipse/che/multiuser/api/permission/server/HttpPermissionCheckerImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server;\n\nimport com.google.common.cache.CacheBuilder;\nimport com.google.common.cache.CacheLoader;\nimport com.google.common.cache.LoadingCache;\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.util.HashSet;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.concurrent.TimeUnit;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.rest.HttpJsonRequestFactory;\nimport org.eclipse.che.multiuser.api.permission.shared.dto.PermissionsDto;\n\n/**\n * Implementation of {@link PermissionChecker} that load permissions by http requests to {@link\n * PermissionsService}\n *\n * <p>It also caches permissions to avoid frequently requests to workspace master.\n *\n * @author Sergii Leschenko\n */\n@Singleton\npublic class HttpPermissionCheckerImpl implements PermissionChecker {\n  private final LoadingCache<Key, Set<String>> permissionsCache;\n\n  @Inject\n  public HttpPermissionCheckerImpl(\n      @Named(\"che.api\") String apiEndpoint, HttpJsonRequestFactory requestFactory) {\n    // TODO mb make configurable size of cache and expiration time\n    this.permissionsCache =\n        CacheBuilder.newBuilder()\n            .maximumSize(1000)\n            .expireAfterWrite(1, TimeUnit.MINUTES)\n            .build(\n                new CacheLoader<Key, Set<String>>() {\n                  @Override\n                  public Set<String> load(Key key) throws Exception {\n                    UriBuilder currentUsersPermissions =\n                        UriBuilder.fromUri(apiEndpoint).path(\"permissions/\" + key.domain);\n                    if (key.instance != null) {\n                      currentUsersPermissions.queryParam(\"instance\", key.instance);\n                    }\n                    String userPermissionsUrl = currentUsersPermissions.build().toString();\n                    try {\n                      PermissionsDto usersPermissions =\n                          requestFactory\n                              .fromUrl(userPermissionsUrl)\n                              .useGetMethod()\n                              .request()\n                              .asDto(PermissionsDto.class);\n                      return new HashSet<>(usersPermissions.getActions());\n                    } catch (NotFoundException e) {\n                      // user doesn't have permissions\n                      return new HashSet<>();\n                    }\n                  }\n                });\n  }\n\n  @Override\n  public boolean hasPermission(String user, String domain, String instance, String action)\n      throws ServerException {\n    try {\n      return permissionsCache.get(new Key(user, domain, instance)).contains(action);\n    } catch (Exception e) {\n      throw new ServerException(e.getMessage(), e);\n    }\n  }\n\n  private static final class Key {\n    private final String user;\n    private final String domain;\n    private final String instance;\n\n    private Key(String user, String domain, String instance) {\n      this.user = user;\n      this.domain = domain;\n      this.instance = instance;\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) {\n        return true;\n      }\n      if (!(obj instanceof Key)) {\n        return false;\n      }\n      final Key other = (Key) obj;\n      return Objects.equals(user, other.user)\n          && Objects.equals(domain, other.domain)\n          && Objects.equals(instance, other.instance);\n    }\n\n    @Override\n    public int hashCode() {\n      int hash = 7;\n      hash = hash * 31 + Objects.hashCode(user);\n      hash = hash * 31 + Objects.hashCode(domain);\n      hash = hash * 31 + Objects.hashCode(instance);\n      return hash;\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authorization/src/main/java/org/eclipse/che/multiuser/api/permission/server/PermissionChecker.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server;\n\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\n\n/**\n * Checks user's permission to perform some action with particular instance of given domain.\n *\n * @author Sergii Leschenko\n */\npublic interface PermissionChecker {\n  /**\n   * Checks user's permission to perform some action with particular instance.\n   *\n   * @param user user id\n   * @param domain domain id\n   * @param instance instance id\n   * @param action action name\n   * @return true if the user has given permission\n   * @throws NotFoundException when given domain is unsupported\n   * @throws ConflictException when given domain requires non nullable value for instance but it is\n   *     null\n   * @throws ServerException when any other error occurs during permission existence checking\n   */\n  boolean hasPermission(String user, String domain, String instance, String action)\n      throws ServerException, NotFoundException, ConflictException;\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authorization-impl/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-multiuser-api</artifactId>\n        <groupId>org.eclipse.che.multiuser</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-multiuser-api-authorization-impl</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Multiuser :: API :: Authorization Impl</name>\n    <dependencies>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-authorization</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-permission</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-permission-shared</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authorization-impl/src/main/java/org/eclipse/che/multiuser/api/permission/server/PermissionCheckerImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\n\n/**\n * Implementation of {@link PermissionChecker} that use {@link PermissionsManager} for checking.\n *\n * @author Sergii Leschenko\n */\npublic class PermissionCheckerImpl implements PermissionChecker {\n  private final PermissionsManager permissionsManager;\n\n  @Inject\n  public PermissionCheckerImpl(PermissionsManager permissionsManager) {\n    this.permissionsManager = permissionsManager;\n  }\n\n  @Override\n  public boolean hasPermission(String user, String domain, String instance, String action)\n      throws ServerException, NotFoundException, ConflictException {\n    return permissionsManager.exists(user, domain, instance, action)\n        || permissionsManager.exists(\"*\", domain, instance, action);\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authorization-impl/src/test/java/org/eclipse/che/multiuser/api/permission/server/PermissionCheckerImplTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class PermissionCheckerImplTest {\n  @Mock private PermissionsManager permissionsManager;\n\n  @InjectMocks private PermissionCheckerImpl permissionChecker;\n\n  @Test\n  public void shouldCheckExistingDirectUsersPermissions() throws Exception {\n    when(permissionsManager.exists(anyString(), anyString(), anyString(), anyString()))\n        .thenReturn(true);\n\n    boolean hasPermission =\n        permissionChecker.hasPermission(\"user123\", \"domain123\", \"instance123\", \"test\");\n\n    assertEquals(hasPermission, true);\n    verify(permissionsManager).exists(\"user123\", \"domain123\", \"instance123\", \"test\");\n  }\n\n  @Test\n  public void shouldCheckExistingPublicPermissionsIfThereIsNoDirectUsersPermissions()\n      throws Exception {\n    doReturn(false)\n        .when(permissionsManager)\n        .exists(eq(\"user123\"), anyString(), anyString(), anyString());\n    doReturn(true).when(permissionsManager).exists(eq(\"*\"), anyString(), anyString(), anyString());\n\n    boolean hasPermission =\n        permissionChecker.hasPermission(\"user123\", \"domain123\", \"instance123\", \"test\");\n\n    assertEquals(hasPermission, true);\n    verify(permissionsManager).exists(\"user123\", \"domain123\", \"instance123\", \"test\");\n    verify(permissionsManager).exists(\"*\", \"domain123\", \"instance123\", \"test\");\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-authorization-impl/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2025 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <appender name=\"file\" class=\"ch.qos.logback.core.FileAppender\">\n        <File>target/log/authorization-impl.log</File>\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n        <appender-ref ref=\"file\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-multiuser-api</artifactId>\n        <groupId>org.eclipse.che.multiuser</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-multiuser-api-permission</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Multiuser :: Permissions API</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-user</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-permission-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-persist</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>jakarta.persistence</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-account</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.jpa</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.flywaydb</groupId>\n            <artifactId>flyway-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.multiuser</groupId>\n                        <artifactId>che-multiuser-api-permission-shared</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n                <configuration>\n                    <dtoPackages>\n                        <package>org.eclipse.che.multiuser.api.permission.shared.dto</package>\n                    </dtoPackages>\n                    <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                    <genClassName>org.eclipse.che.api.multiuser.permission.server.dto.DtoServerImpls</genClassName>\n                    <impl>server</impl>\n                </configuration>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-domain</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <!-- Create the test jar -->\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>test-jar</goal>\n                        </goals>\n                        <configuration>\n                            <includes>\n                                <include>**/spi/tck/*.*</include>\n                            </includes>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-dependency-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>resource-dependencies</id>\n                        <phase>process-test-resources</phase>\n                        <goals>\n                            <goal>unpack-dependencies</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/AbstractPermissionsDomain.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server;\n\nimport com.google.common.collect.ImmutableList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Set;\nimport org.eclipse.che.multiuser.api.permission.server.model.impl.AbstractPermissions;\nimport org.eclipse.che.multiuser.api.permission.shared.model.PermissionsDomain;\n\n/**\n * Abstract implementation for {@link PermissionsDomain}\n *\n * <p>Note: It supports \"setPermission\" by default\n *\n * @author Sergii Leschenko\n */\npublic abstract class AbstractPermissionsDomain<T extends AbstractPermissions>\n    implements PermissionsDomain {\n  public static final String SET_PERMISSIONS = \"setPermissions\";\n\n  private final String id;\n  private final List<String> allowedActions;\n  private final boolean requiresInstance;\n\n  protected AbstractPermissionsDomain(String id, List<String> allowedActions) {\n    this(id, allowedActions, true);\n  }\n\n  protected AbstractPermissionsDomain(\n      String id, List<String> allowedActions, boolean requiresInstance) {\n    this.id = id;\n    Set<String> resultActions = new HashSet<>(allowedActions);\n    resultActions.add(SET_PERMISSIONS);\n    this.allowedActions = ImmutableList.copyOf(resultActions);\n    this.requiresInstance = requiresInstance;\n  }\n\n  @Override\n  public String getId() {\n    return id;\n  }\n\n  @Override\n  public List<String> getAllowedActions() {\n    return allowedActions;\n  }\n\n  @Override\n  public Boolean isInstanceRequired() {\n    return requiresInstance;\n  }\n\n  /**\n   * Creates new instance of the entity related to this domain.\n   *\n   * @return new entity instance related to this domain\n   * @throws IllegalArgumentException when instance id is null when it's required\n   */\n  public T newInstance(String userId, String instanceId, List<String> allowedActions) {\n    if (isInstanceRequired() && instanceId == null) {\n      throw new IllegalArgumentException(\"Given domain requires non nullable value for instanceId\");\n    }\n    return doCreateInstance(userId, instanceId, allowedActions);\n  }\n\n  protected abstract T doCreateInstance(\n      String userId, String instanceId, List<String> allowedActions);\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof AbstractPermissionsDomain)) return false;\n    final AbstractPermissionsDomain other = (AbstractPermissionsDomain) obj;\n    return Objects.equals(id, other.id) && Objects.equals(allowedActions, other.allowedActions);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + Objects.hashCode(allowedActions);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"PermissionsDomain{\" + \"id='\" + id + '\\'' + \", allowedActions=\" + allowedActions + \"}\";\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/InstanceParameterValidator.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Validates that provided instance parameter is valid\n *\n * @author Sergii Leschenko\n */\n@Singleton\npublic class InstanceParameterValidator {\n  private final PermissionsManager permissionsManager;\n\n  @Inject\n  public InstanceParameterValidator(PermissionsManager permissionsManager) {\n    this.permissionsManager = permissionsManager;\n  }\n\n  /**\n   * Validates that provided instance parameter is valid for specified domain\n   *\n   * @param domain the domain of specified {@code instance}\n   * @param instance the instance to check\n   * @throws BadRequestException if specified {@code domain} is null\n   * @throws BadRequestException if specified {@code instance} is not valid\n   * @throws NotFoundException if specified {@code domain} is unsupported\n   */\n  public void validate(String domain, @Nullable String instance)\n      throws BadRequestException, NotFoundException {\n    checkArgument(domain != null, \"Domain id required\");\n    if (permissionsManager.getDomain(domain).isInstanceRequired() && instance == null) {\n      throw new BadRequestException(\"Specified domain requires non nullable value for instance\");\n    }\n  }\n\n  private void checkArgument(boolean expression, String message) throws BadRequestException {\n    if (!expression) {\n      throw new BadRequestException(message);\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/PermissionsManager.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server;\n\nimport static com.google.common.base.MoreObjects.firstNonNull;\nimport static org.eclipse.che.multiuser.api.permission.server.AbstractPermissionsDomain.SET_PERMISSIONS;\n\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.Pages;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.concurrent.StripedLocks;\nimport org.eclipse.che.commons.lang.concurrent.Unlocker;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.multiuser.api.permission.server.event.PermissionsCreatedEvent;\nimport org.eclipse.che.multiuser.api.permission.server.event.PermissionsRemovedEvent;\nimport org.eclipse.che.multiuser.api.permission.server.model.impl.AbstractPermissions;\nimport org.eclipse.che.multiuser.api.permission.server.spi.PermissionsDao;\nimport org.eclipse.che.multiuser.api.permission.shared.model.Permissions;\n\n/**\n * Facade for Permissions related operations.\n *\n * @author gazarenkov\n * @author Sergii Leschenko\n * @author Anton Korneta\n */\n@Singleton\npublic class PermissionsManager {\n\n  private final EventService eventService;\n\n  private final List<AbstractPermissionsDomain<? extends AbstractPermissions>> domains;\n  private final Map<String, PermissionsDao<? extends AbstractPermissions>> domainToDao;\n  private final StripedLocks updateLocks;\n\n  @Inject\n  public PermissionsManager(EventService eventService) throws ServerException {\n    this.eventService = eventService;\n    final Map<String, PermissionsDao<? extends AbstractPermissions>> domainToDao = new HashMap<>();\n    final List<AbstractPermissionsDomain<? extends AbstractPermissions>> domains =\n        new ArrayList<>();\n    this.domains = ImmutableList.copyOf(domains);\n    this.domainToDao = ImmutableMap.copyOf(domainToDao);\n    this.updateLocks = new StripedLocks(16);\n  }\n\n  /**\n   * Stores (adds or updates) permissions.\n   *\n   * @param permissions permission to store\n   * @throws NotFoundException when permissions have unsupported domain\n   * @throws ConflictException when new permissions remove last 'setPermissions' of given instance\n   * @throws ServerException when any other error occurs during permissions storing\n   */\n  public void storePermission(Permissions permissions)\n      throws ServerException, ConflictException, NotFoundException {\n    final String domainId = permissions.getDomainId();\n    final String instanceId = permissions.getInstanceId();\n    final String userId = permissions.getUserId();\n\n    try (@SuppressWarnings(\"unused\")\n        Unlocker unlocker = updateLocks.writeLock(firstNonNull(instanceId, domainId))) {\n      final PermissionsDao<? extends AbstractPermissions> permissionsDao =\n          getPermissionsDao(domainId);\n      if (!permissions.getActions().contains(SET_PERMISSIONS)\n          && userHasLastSetPermissions(permissionsDao, userId, instanceId)) {\n        throw new ConflictException(\n            \"Can't edit permissions because there is not any another user \"\n                + \"with permission 'setPermissions'\");\n      }\n      store(permissionsDao, userId, instanceId, permissions);\n    }\n  }\n\n  /**\n   * Returns user's permissions for specified instance\n   *\n   * @param userId user id\n   * @param domainId domain id\n   * @param instanceId instance id\n   * @return userId's permissions for specified instanceId\n   * @throws NotFoundException when given domainId is unsupported\n   * @throws NotFoundException when permissions with given userId and domainId and instanceId was\n   *     not found\n   * @throws ServerException when any other error occurs during permissions fetching\n   */\n  public AbstractPermissions get(String userId, String domainId, String instanceId)\n      throws ServerException, NotFoundException, ConflictException {\n    return getPermissionsDao(domainId).get(userId, instanceId);\n  }\n\n  /**\n   * Returns users' permissions for specified instance\n   *\n   * @param domainId domain id\n   * @param instanceId instance id\n   * @param maxItems the maximum number of permissions to return\n   * @param skipCount the number of permissions to skip\n   * @return set of permissions\n   * @throws NotFoundException when given domainId is unsupported\n   * @throws ServerException when any other error occurs during permissions fetching\n   */\n  @SuppressWarnings(\"unchecked\")\n  public Page<AbstractPermissions> getByInstance(\n      String domainId, String instanceId, int maxItems, long skipCount)\n      throws ServerException, NotFoundException {\n    return (Page<AbstractPermissions>)\n        getPermissionsDao(domainId).getByInstance(instanceId, maxItems, skipCount);\n  }\n\n  /**\n   * Removes permissions of userId related to the particular instanceId of specified domainId\n   *\n   * @param userId user id\n   * @param domainId domain id\n   * @param instanceId instance id\n   * @throws NotFoundException when given domainId is unsupported\n   * @throws ConflictException when removes last 'setPermissions' of given instanceId\n   * @throws ServerException when any other error occurs during permissions removing\n   */\n  public void remove(String userId, String domainId, String instanceId)\n      throws ConflictException, ServerException, NotFoundException {\n    final PermissionsDao<? extends AbstractPermissions> permissionsDao =\n        getPermissionsDao(domainId);\n    Permissions permissions;\n    try (@SuppressWarnings(\"unused\")\n        Unlocker unlocker = updateLocks.writeLock(firstNonNull(instanceId, domainId))) {\n      if (userHasLastSetPermissions(permissionsDao, userId, instanceId)) {\n        throw new ConflictException(\n            \"Can't remove permissions because there is not any another user \"\n                + \"with permission 'setPermissions'\");\n      }\n      permissions = permissionsDao.get(userId, instanceId);\n      permissionsDao.remove(userId, instanceId);\n    }\n    final String initiator = EnvironmentContext.getCurrent().getSubject().getUserName();\n    eventService.publish(new PermissionsRemovedEvent(initiator, permissions));\n  }\n\n  /**\n   * Checks existence of user's permission for specified instance\n   *\n   * @param userId user id\n   * @param domainId domain id\n   * @param instanceId instance id\n   * @param action action name\n   * @return true if the permission exists\n   * @throws NotFoundException when given domain is unsupported\n   * @throws ServerException when any other error occurs during permission existence checking\n   */\n  public boolean exists(String userId, String domainId, String instanceId, String action)\n      throws ServerException, NotFoundException, ConflictException {\n    return getDomain(domainId).getAllowedActions().contains(action)\n        && getPermissionsDao(domainId).exists(userId, instanceId, action);\n  }\n\n  /**\n   * Checks supporting all specified actions by domain with specified id.\n   *\n   * @param domainId domain id to check supporting\n   * @param actions actions to check\n   * @throws NotFoundException when domain with specified id is unsupported\n   * @throws ConflictException when actions contain unsupported value\n   */\n  public void checkActionsSupporting(String domainId, List<String> actions)\n      throws NotFoundException, ConflictException {\n    checkActionsSupporting(getDomain(domainId), actions);\n  }\n\n  /** Returns supported domains */\n  public List<AbstractPermissionsDomain> getDomains() {\n    return new ArrayList<>(domains);\n  }\n\n  /**\n   * Returns supported domain\n   *\n   * @throws NotFoundException when given domain is unsupported\n   */\n  public AbstractPermissionsDomain<? extends AbstractPermissions> getDomain(String domain)\n      throws NotFoundException {\n    return getPermissionsDao(domain).getDomain();\n  }\n\n  private <T extends AbstractPermissions> void store(\n      PermissionsDao<T> dao, String userId, String instanceId, Permissions permissions)\n      throws ConflictException, ServerException {\n    final AbstractPermissionsDomain<T> permissionsDomain = dao.getDomain();\n    final T permission =\n        permissionsDomain.newInstance(userId, instanceId, permissions.getActions());\n    checkActionsSupporting(permissionsDomain, permission.getActions());\n    final Optional<T> existing = dao.store(permission);\n    if (!existing.isPresent()) {\n      Subject subject = EnvironmentContext.getCurrent().getSubject();\n      final String initiator = subject.isAnonymous() ? null : subject.getUserName();\n      eventService.publish(new PermissionsCreatedEvent(initiator, permissions));\n    }\n  }\n\n  private void checkActionsSupporting(AbstractPermissionsDomain<?> domain, List<String> actions)\n      throws ConflictException {\n    final Set<String> allowedActions = new HashSet<>(domain.getAllowedActions());\n    final Set<String> unsupportedActions =\n        actions.stream()\n            .filter(action -> !allowedActions.contains(action))\n            .collect(Collectors.toSet());\n    if (!unsupportedActions.isEmpty()) {\n      throw new ConflictException(\n          \"Domain with id '\"\n              + domain.getId()\n              + \"' doesn't support following action(s): \"\n              + unsupportedActions.stream().collect(Collectors.joining(\", \")));\n    }\n  }\n\n  private PermissionsDao<? extends AbstractPermissions> getPermissionsDao(String domain)\n      throws NotFoundException {\n    final PermissionsDao<? extends AbstractPermissions> permissionsStorage =\n        domainToDao.get(domain);\n    if (permissionsStorage == null) {\n      throw new NotFoundException(\"Requested unsupported domain '\" + domain + \"'\");\n    }\n    return permissionsStorage;\n  }\n\n  private boolean userHasLastSetPermissions(\n      PermissionsDao<? extends AbstractPermissions> storage, String userId, String instanceId)\n      throws ServerException, ConflictException, NotFoundException {\n    if (!storage.exists(userId, instanceId, SET_PERMISSIONS)) {\n      return false;\n    }\n\n    for (AbstractPermissions permissions :\n        Pages.iterateLazily(\n            (maxItems, skipCount) -> storage.getByInstance(instanceId, maxItems, skipCount))) {\n      if (!permissions.getUserId().equals(userId)\n          && permissions.getActions().contains(SET_PERMISSIONS)) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/PermissionsModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.MapBinder;\nimport com.google.inject.multibindings.Multibinder;\nimport com.google.inject.name.Names;\nimport org.eclipse.che.multiuser.api.permission.server.account.AccountPermissionsChecker;\nimport org.eclipse.che.multiuser.api.permission.server.filter.GetPermissionsFilter;\nimport org.eclipse.che.multiuser.api.permission.server.filter.RemovePermissionsFilter;\nimport org.eclipse.che.multiuser.api.permission.server.filter.SetPermissionsFilter;\nimport org.eclipse.che.multiuser.api.permission.server.filter.check.RemovePermissionsChecker;\nimport org.eclipse.che.multiuser.api.permission.server.filter.check.SetPermissionsChecker;\nimport org.eclipse.che.multiuser.api.permission.server.jsonrpc.RemoteSubscriptionPermissionManager;\n\n/**\n * @author Sergii Leschenko\n */\npublic class PermissionsModule extends AbstractModule {\n  @Override\n  protected void configure() {\n\n    bind(SetPermissionsFilter.class);\n    bind(RemovePermissionsFilter.class);\n    bind(GetPermissionsFilter.class);\n    bind(RemoteSubscriptionPermissionManager.class).asEagerSingleton();\n\n    // Creates empty multibinder to avoid error during container starting\n    Multibinder.newSetBinder(\n        binder(), String.class, Names.named(SystemDomain.SYSTEM_DOMAIN_ACTIONS));\n\n    // initialize empty set binder\n    Multibinder.newSetBinder(binder(), AccountPermissionsChecker.class);\n    MapBinder.newMapBinder(binder(), String.class, SetPermissionsChecker.class);\n    MapBinder.newMapBinder(binder(), String.class, RemovePermissionsChecker.class);\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/SuperPrivilegesChecker.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server;\n\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.multiuser.api.permission.shared.model.PermissionsDomain;\n\n/**\n * Checks that current subject has privileges to perform some operation without required\n * permissions.\n *\n * <p>Super privileges is designed to give some extra abilities for users who have permission to\n * perform {@link SystemDomain#MANAGE_SYSTEM_ACTION manage system}.<br>\n * Super privileges are optional, they can be disabled by configuration.\n *\n * <p>User has super privileges if he has {@link SystemDomain#MANAGE_SYSTEM_ACTION manage system}\n * permission and system configuration property {@link #SYSTEM_SUPER_PRIVILEGED_MODE} is true.\n *\n * <p>It is required to perform {@link #hasSuperPrivileges()} checks manually before permissions\n * checking if user should be able to perform some operation.\n *\n * <pre>\n * public class ExamplePermissionsFilter extends CheMethodInvokerFilter {\n *     &#064;Inject\n *     private SuperPrivilegesChecker superPrivilegesChecker;\n *\n *     &#064;Override\n *     protected void filter(GenericResourceMethod genericMethodResource, Object[] arguments) throws ApiException {\n *         if (superPrivilegesChecker.hasSuperPrivileges()) {\n *             return;\n *         }\n *         EnvironmentContext.getCurrent().getSubject().checkPermissions(\"domain\", \"domain123\", \"action\");\n *     }\n * }\n * </pre>\n *\n * If user should be able to manage permissions for some permission domain then this domain should\n * be present in multibinder named with {@link #SUPER_PRIVILEGED_DOMAINS}.<br>\n * Binding example:\n *\n * <pre>\n * public class ExampleModule extends AbstractModule {\n *     &#064;Override\n *     protected void configure() {\n *         Multibinder.newSetBinder(binder(), PermissionsDomain.class, Names.named(SuperPrivilegesChecker.SUPER_PRIVILEGED_DOMAINS))\n *                    .addBinding().to(ExampleDomain.class);\n *     }\n * }\n * </pre>\n *\n * @author Sergii Leschenko\n */\npublic class SuperPrivilegesChecker {\n  /**\n   * Configuration parameter that indicates extended abilities for users who have {@link\n   * SystemDomain#MANAGE_SYSTEM_ACTION manageSytem} permission.\n   */\n  public static final String SYSTEM_SUPER_PRIVILEGED_MODE = \"che.system.super_privileged_mode\";\n\n  /** Permissions of these domains can be managed by any user who has super privileges. */\n  public static final String SUPER_PRIVILEGED_DOMAINS = \"system.super_privileged_domains\";\n\n  private final boolean superPrivilegedMode;\n  private final Set<String> privilegesDomainsIds;\n\n  @Inject\n  public SuperPrivilegesChecker(\n      @Named(SYSTEM_SUPER_PRIVILEGED_MODE) boolean superPrivilegedMode,\n      @Named(SUPER_PRIVILEGED_DOMAINS) Set<PermissionsDomain> domains) {\n    this.superPrivilegedMode = superPrivilegedMode;\n    this.privilegesDomainsIds =\n        domains.stream().map(PermissionsDomain::getId).collect(Collectors.toSet());\n  }\n\n  /**\n   * Checks that current subject has super privileges.\n   *\n   * @return true if current subject has super privileges, false otherwise\n   */\n  public boolean hasSuperPrivileges() {\n    return superPrivilegedMode\n        && EnvironmentContext.getCurrent()\n            .getSubject()\n            .hasPermission(SystemDomain.DOMAIN_ID, null, SystemDomain.MANAGE_SYSTEM_ACTION);\n  }\n\n  /**\n   * Checks that current subject is privileged to manage permissions of specified domain.\n   *\n   * @return true if current subject is privileged to manage permissions of specified domain, false\n   *     otherwise\n   */\n  public boolean isPrivilegedToManagePermissions(String domainId) {\n    return superPrivilegedMode\n        && privilegesDomainsIds.contains(domainId)\n        && EnvironmentContext.getCurrent()\n            .getSubject()\n            .hasPermission(SystemDomain.DOMAIN_ID, null, SystemDomain.MANAGE_SYSTEM_ACTION);\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/SystemDomain.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server;\n\nimport static java.util.stream.Collectors.toList;\n\nimport java.util.List;\nimport java.util.Set;\nimport java.util.stream.Stream;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.multiuser.api.permission.server.model.impl.SystemPermissionsImpl;\n\n/**\n * Domain for storing actions that are used for managing system e.g. user management, configuration properties management.\n *\n * <p>The list of supported actions by system domain can be configured by following lines\n * <pre>\n *   Multibinder<String> binder = Multibinder.newSetBinder(binder(), String.class, Names.named(SystemDomain.SYSTEM_DOMAIN_ACTIONS));\n *   binder.addBinding().toInstance(\"customAction\");\n * <pre/>\n *\n * @author Sergii Leschenko\n */\npublic class SystemDomain extends AbstractPermissionsDomain<SystemPermissionsImpl> {\n  public static final String SYSTEM_DOMAIN_ACTIONS = \"system.domain.actions\";\n  public static final String DOMAIN_ID = \"system\";\n  public static final String MANAGE_SYSTEM_ACTION = \"manageSystem\";\n  public static final String MONITOR_SYSTEM_ACTION = \"monitorSystem\";\n\n  @Inject\n  public SystemDomain(@Named(SYSTEM_DOMAIN_ACTIONS) Set<String> allowedActions) {\n    super(\n        DOMAIN_ID,\n        Stream.concat(\n                allowedActions.stream(), Stream.of(MANAGE_SYSTEM_ACTION, MONITOR_SYSTEM_ACTION))\n            .collect(toList()),\n        false);\n  }\n\n  @Override\n  public SystemPermissionsImpl doCreateInstance(\n      String userId, String instanceId, List<String> allowedActions) {\n    return new SystemPermissionsImpl(userId, allowedActions);\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/account/AccountOperation.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.account;\n\n/**\n * Actions that can be performed by users in accounts.\n *\n * @author Sergii Leshchenko\n */\npublic enum AccountOperation {\n  /** When user creates workspace that will belong to account. */\n  CREATE_WORKSPACE,\n\n  /** When user does any operation with existing workspace. */\n  MANAGE_WORKSPACES,\n\n  /** When user retrieves information about account resources(like available, total, etc). */\n  SEE_RESOURCE_INFORMATION\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/account/AccountPermissionsChecker.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.account;\n\nimport org.eclipse.che.api.core.ForbiddenException;\n\n/**\n * Defines permissions checking for accounts with some type.\n *\n * @author Sergii Leshchenko\n */\npublic interface AccountPermissionsChecker {\n  /**\n   * Checks that current subject is authorized to perform given operation with specified account\n   *\n   * @param accountId account to check\n   * @param operation operation that is going to be performed\n   * @throws ForbiddenException when user doesn't have permissions to perform specified operation\n   */\n  void checkPermissions(String accountId, AccountOperation operation) throws ForbiddenException;\n\n  /** Returns account type for which this class tracks check resources permissions. */\n  String getAccountType();\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/event/PermissionsCreatedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.event;\n\nimport static org.eclipse.che.multiuser.api.permission.shared.event.EventType.PERMISSIONS_ADDED;\n\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.multiuser.api.permission.shared.event.EventType;\nimport org.eclipse.che.multiuser.api.permission.shared.event.PermissionsEvent;\nimport org.eclipse.che.multiuser.api.permission.shared.model.Permissions;\n\n/**\n * Defines permissions added events.\n *\n * @author Anton Korneta\n */\npublic class PermissionsCreatedEvent implements PermissionsEvent {\n\n  private final String initiator;\n  private final Permissions permissions;\n\n  public PermissionsCreatedEvent(String initiator, Permissions permissions) {\n    this.initiator = initiator;\n    this.permissions = permissions;\n  }\n\n  @Override\n  public EventType getType() {\n    return PERMISSIONS_ADDED;\n  }\n\n  @Override\n  public Permissions getPermissions() {\n    return permissions;\n  }\n\n  @Nullable\n  @Override\n  public String getInitiator() {\n    return initiator;\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/event/PermissionsRemovedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.event;\n\nimport static org.eclipse.che.multiuser.api.permission.shared.event.EventType.PERMISSIONS_REMOVED;\n\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.multiuser.api.permission.shared.event.EventType;\nimport org.eclipse.che.multiuser.api.permission.shared.event.PermissionsEvent;\nimport org.eclipse.che.multiuser.api.permission.shared.model.Permissions;\n\n/**\n * Defines permissions added events.\n *\n * @author Anton Korneta\n */\npublic class PermissionsRemovedEvent implements PermissionsEvent {\n\n  private final String initiator;\n  private final Permissions permissions;\n\n  public PermissionsRemovedEvent(String initiator, Permissions permissions) {\n    this.initiator = initiator;\n    this.permissions = permissions;\n  }\n\n  @Override\n  public EventType getType() {\n    return PERMISSIONS_REMOVED;\n  }\n\n  @Override\n  public Permissions getPermissions() {\n    return permissions;\n  }\n\n  @Nullable\n  @Override\n  public String getInitiator() {\n    return initiator;\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/filter/GetPermissionsFilter.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.filter;\n\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.PathParam;\nimport jakarta.ws.rs.QueryParam;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.everrest.CheMethodInvokerFilter;\nimport org.eclipse.che.multiuser.api.permission.server.InstanceParameterValidator;\nimport org.eclipse.che.multiuser.api.permission.server.PermissionsManager;\nimport org.eclipse.che.multiuser.api.permission.server.SuperPrivilegesChecker;\nimport org.everrest.core.Filter;\nimport org.everrest.core.resource.GenericResourceMethod;\n\n/**\n * Restricts access to reading permissions of instance by users' readPermissions permission\n *\n * @author Sergii Leschenko\n */\n@Filter\n@Path(\"/permissions/{domain}/all\")\npublic class GetPermissionsFilter extends CheMethodInvokerFilter {\n  @PathParam(\"domain\")\n  private String domain;\n\n  @QueryParam(\"instance\")\n  private String instance;\n\n  @Inject private PermissionsManager permissionsManager;\n\n  @Inject private SuperPrivilegesChecker superPrivilegesChecker;\n\n  @Inject private InstanceParameterValidator instanceValidator;\n\n  @Override\n  public void filter(GenericResourceMethod genericResourceMethod, Object[] arguments)\n      throws BadRequestException,\n          NotFoundException,\n          ConflictException,\n          ForbiddenException,\n          ServerException {\n\n    final String methodName = genericResourceMethod.getMethod().getName();\n    if (methodName.equals(\"getUsersPermissions\")) {\n      instanceValidator.validate(domain, instance);\n      if (superPrivilegesChecker.isPrivilegedToManagePermissions(domain)) {\n        return;\n      }\n      final String userId = EnvironmentContext.getCurrent().getSubject().getUserId();\n      try {\n        permissionsManager.get(userId, domain, instance);\n        // user should have ability to see another users' permissions if he has any permission there\n      } catch (NotFoundException e) {\n        throw new ForbiddenException(\"User is not authorized to perform this operation\");\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/filter/RemovePermissionsFilter.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.filter;\n\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.PathParam;\nimport jakarta.ws.rs.QueryParam;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.everrest.CheMethodInvokerFilter;\nimport org.eclipse.che.multiuser.api.permission.server.InstanceParameterValidator;\nimport org.eclipse.che.multiuser.api.permission.server.SuperPrivilegesChecker;\nimport org.eclipse.che.multiuser.api.permission.server.filter.check.DomainsPermissionsCheckers;\nimport org.everrest.core.Filter;\nimport org.everrest.core.resource.GenericResourceMethod;\n\n/**\n * Restricts access to removing permissions of instance by users' setPermissions permission\n *\n * @author Sergii Leschenko\n */\n@Filter\n@Path(\"/permissions/{domain}\")\npublic class RemovePermissionsFilter extends CheMethodInvokerFilter {\n  @PathParam(\"domain\")\n  private String domain;\n\n  @QueryParam(\"instance\")\n  private String instance;\n\n  @QueryParam(\"user\")\n  private String user;\n\n  @Inject private SuperPrivilegesChecker superPrivilegesChecker;\n\n  @Inject private InstanceParameterValidator instanceValidator;\n\n  @Inject private DomainsPermissionsCheckers domainsPermissionsCheckers;\n\n  @Override\n  public void filter(GenericResourceMethod genericResourceMethod, Object[] args)\n      throws BadRequestException, ForbiddenException, NotFoundException, ServerException {\n    if (genericResourceMethod.getMethod().getName().equals(\"removePermissions\")) {\n      instanceValidator.validate(domain, instance);\n      final Subject currentSubject = EnvironmentContext.getCurrent().getSubject();\n      if (currentSubject.getUserId().equals(user)\n          || superPrivilegesChecker.isPrivilegedToManagePermissions(domain)) {\n        return;\n      }\n      domainsPermissionsCheckers.getRemoveChecker(domain).check(user, domain, instance);\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/filter/SetPermissionsFilter.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.filter;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport jakarta.ws.rs.Path;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.everrest.CheMethodInvokerFilter;\nimport org.eclipse.che.multiuser.api.permission.server.InstanceParameterValidator;\nimport org.eclipse.che.multiuser.api.permission.server.SuperPrivilegesChecker;\nimport org.eclipse.che.multiuser.api.permission.server.filter.check.DomainsPermissionsCheckers;\nimport org.eclipse.che.multiuser.api.permission.shared.dto.PermissionsDto;\nimport org.everrest.core.Filter;\nimport org.everrest.core.resource.GenericResourceMethod;\n\n/**\n * Restricts access to setting permissions of instance by users' setPermissions permission\n *\n * @author Sergii Leschenko\n */\n@Filter\n@Path(\"/permissions/\")\npublic class SetPermissionsFilter extends CheMethodInvokerFilter {\n  @Inject private SuperPrivilegesChecker superPrivilegesChecker;\n\n  @Inject private InstanceParameterValidator instanceValidator;\n\n  @Inject private DomainsPermissionsCheckers domainsPermissionsChecker;\n\n  @Override\n  public void filter(GenericResourceMethod genericResourceMethod, Object[] args)\n      throws BadRequestException, ForbiddenException, NotFoundException, ServerException {\n    if (genericResourceMethod.getMethod().getName().equals(\"storePermissions\")) {\n      final PermissionsDto permissions = (PermissionsDto) args[0];\n      checkArgument(permissions != null, \"Permissions descriptor required\");\n      final String domain = permissions.getDomainId();\n      checkArgument(!isNullOrEmpty(domain), \"Domain required\");\n      instanceValidator.validate(domain, permissions.getInstanceId());\n      if (superPrivilegesChecker.isPrivilegedToManagePermissions(permissions.getDomainId())) {\n        return;\n      }\n      domainsPermissionsChecker.getSetChecker(domain).check(permissions);\n    }\n  }\n\n  private void checkArgument(boolean expression, String message) throws BadRequestException {\n    if (!expression) {\n      throw new BadRequestException(message);\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/filter/check/DefaultRemovePermissionsChecker.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.filter.check;\n\nimport static org.eclipse.che.multiuser.api.permission.server.AbstractPermissionsDomain.SET_PERMISSIONS;\n\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\n\n/**\n * Common checks while removing permissions.\n *\n * @author Anton Korneta\n */\n@Singleton\npublic class DefaultRemovePermissionsChecker implements RemovePermissionsChecker {\n\n  @Override\n  public void check(String user, String domainId, String instance) throws ForbiddenException {\n    if (!EnvironmentContext.getCurrent()\n        .getSubject()\n        .hasPermission(domainId, instance, SET_PERMISSIONS)) {\n      throw new ForbiddenException(\"User can't edit permissions for this instance\");\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/filter/check/DefaultSetPermissionsChecker.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.filter.check;\n\nimport static org.eclipse.che.multiuser.api.permission.server.AbstractPermissionsDomain.SET_PERMISSIONS;\n\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.multiuser.api.permission.shared.model.Permissions;\n\n/**\n * Common checks while setting permissions.\n *\n * @author Anton Korneta\n */\n@Singleton\npublic class DefaultSetPermissionsChecker implements SetPermissionsChecker {\n\n  @Override\n  public void check(Permissions permissions) throws ForbiddenException {\n    if (!EnvironmentContext.getCurrent()\n        .getSubject()\n        .hasPermission(permissions.getDomainId(), permissions.getInstanceId(), SET_PERMISSIONS)) {\n      throw new ForbiddenException(\"User can't edit permissions for this instance\");\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/filter/check/DomainsPermissionsCheckers.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.filter.check;\n\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\n\n/**\n * Represents a set of domain-specific permissions checkers.\n *\n * @author Anton Korneta\n */\n@Singleton\npublic class DomainsPermissionsCheckers {\n\n  private final Map<String, SetPermissionsChecker> domain2setPermissionsChecker;\n  private final DefaultSetPermissionsChecker defaultSetPermissionsChecker;\n  private final Map<String, RemovePermissionsChecker> domain2removePermissionsChecker;\n  private final DefaultRemovePermissionsChecker defaultRemovePermissionsChecker;\n\n  @Inject\n  public DomainsPermissionsCheckers(\n      Map<String, SetPermissionsChecker> domain2setPermissionsChecker,\n      DefaultSetPermissionsChecker defaultPermissionsChecker,\n      Map<String, RemovePermissionsChecker> domain2removePermissionsChecker,\n      DefaultRemovePermissionsChecker defaultRemovePermissionsChecker) {\n    this.domain2setPermissionsChecker = domain2setPermissionsChecker;\n    this.defaultSetPermissionsChecker = defaultPermissionsChecker;\n    this.domain2removePermissionsChecker = domain2removePermissionsChecker;\n    this.defaultRemovePermissionsChecker = defaultRemovePermissionsChecker;\n  }\n\n  public SetPermissionsChecker getSetChecker(String domain) {\n    if (domain2setPermissionsChecker.containsKey(domain)) {\n      return domain2setPermissionsChecker.get(domain);\n    }\n    return defaultSetPermissionsChecker;\n  }\n\n  public RemovePermissionsChecker getRemoveChecker(String domain) {\n    if (domain2removePermissionsChecker.containsKey(domain)) {\n      return domain2removePermissionsChecker.get(domain);\n    }\n    return defaultRemovePermissionsChecker;\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/filter/check/RemovePermissionsChecker.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.filter.check;\n\nimport org.eclipse.che.api.core.ForbiddenException;\n\n/**\n * Defines contract for domain specific checks, before remove permissions.\n *\n * @author Anton Korneta\n */\npublic interface RemovePermissionsChecker {\n\n  /**\n   * Checks if the current user is allowed to remove permissions.\n   *\n   * @param user user identifier\n   * @param domainId permissions domain\n   * @param instance instance associated with the permissions to be removed\n   * @throws ForbiddenException when it is not allowed to remove permissions\n   */\n  void check(String user, String domainId, String instance) throws ForbiddenException;\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/filter/check/SetPermissionsChecker.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.filter.check;\n\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.multiuser.api.permission.shared.model.Permissions;\n\n/**\n * Defines contract for domain specific checks, before set permissions.\n *\n * @author Anton Korneta\n */\npublic interface SetPermissionsChecker {\n\n  /**\n   * Checks if the current user is allowed to set permissions.\n   *\n   * @param permissions permission to set\n   * @throws ForbiddenException when it is not allowed to set {@code permissions}\n   */\n  void check(Permissions permissions) throws ForbiddenException;\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/jsonrpc/JsonRpcPermissionsFilterAdapter.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.jsonrpc;\n\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcException;\nimport org.eclipse.che.api.core.jsonrpc.commons.JsonRpcMethodInvokerFilter;\n\n/**\n * <b>Purpose</b>: Provides an implementation of JsonRpcMethodInvokerFilter that allow to throw\n * {@link ForbiddenException} that will be wrapped into {@link JsonRpcException}.\n *\n * @author Sergii Leshchenko\n */\npublic abstract class JsonRpcPermissionsFilterAdapter implements JsonRpcMethodInvokerFilter {\n\n  @Override\n  public void accept(String method, Object... params) throws JsonRpcException {\n    try {\n      doAccept(method, params);\n    } catch (ForbiddenException e) {\n      throw new JsonRpcException(403, e.getMessage());\n    }\n  }\n\n  protected abstract void doAccept(String method, Object... params) throws ForbiddenException;\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/jsonrpc/RemoteSubscriptionPermissionCheck.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.jsonrpc;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.ForbiddenException;\n\n/**\n * Check that should be performed before remote subscribing.\n *\n * @author Sergii Leshchenko\n * @see org.eclipse.che.api.core.notification.RemoteSubscriptionManager\n */\npublic interface RemoteSubscriptionPermissionCheck {\n\n  /**\n   * Check that the current subject is allowed to listen to the specified method events\n   *\n   * @param methodName method name to subscribe\n   * @param scope scope of subscription\n   * @throws ForbiddenException if the current subject does not have needed permissions\n   * @throws ForbiddenException if any other exception occurred during permissions check\n   */\n  void check(String methodName, Map<String, String> scope) throws ForbiddenException;\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/jsonrpc/RemoteSubscriptionPermissionManager.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.jsonrpc;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.core.notification.RemoteSubscriptionManager.SUBSCRIBE_JSON_RPC_METHOD;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerManager;\nimport org.eclipse.che.api.core.notification.dto.EventSubscription;\n\n/**\n * Filters invocation of {@link\n * org.eclipse.che.api.core.notification.RemoteSubscriptionManager#SUBSCRIBE_JSON_RPC_METHOD} and\n * performs the corresponding {@link RemoteSubscriptionPermissionCheck} to make sure that user is\n * authorized to listen to requested events.\n *\n * @author Sergii Leshchenko\n */\n@Singleton\npublic class RemoteSubscriptionPermissionManager {\n\n  private final Map<String, RemoteSubscriptionPermissionCheck> methodToCheck;\n\n  public RemoteSubscriptionPermissionManager() {\n    this.methodToCheck = new HashMap<>();\n  }\n\n  @Inject\n  void register(RequestHandlerManager requestHandlerManager) {\n    requestHandlerManager.registerMethodInvokerFilter(\n        new RemoteSubscriptionFilter(), SUBSCRIBE_JSON_RPC_METHOD);\n  }\n\n  /**\n   * Registers permissions check for the specified methods\n   *\n   * @param permissionCheck permissions check that should be invoked before subscription\n   * @param methods methods to filter\n   * @throws IllegalStateException if any of specified methods already has registered check\n   */\n  public synchronized void registerCheck(\n      RemoteSubscriptionPermissionCheck permissionCheck, String... methods) {\n    for (String method : methods) {\n      if (methodToCheck.containsKey(method)) {\n        throw new IllegalStateException(\n            format(\"Permissions check is already registered for method '%s'\", method));\n      }\n\n      methodToCheck.put(method, permissionCheck);\n    }\n  }\n\n  private class RemoteSubscriptionFilter extends JsonRpcPermissionsFilterAdapter {\n    @Override\n    protected void doAccept(String method, Object... params) throws ForbiddenException {\n      EventSubscription param = (EventSubscription) params[0];\n\n      RemoteSubscriptionPermissionCheck permissionCheck = methodToCheck.get(param.getMethod());\n      if (permissionCheck != null) {\n        permissionCheck.check(param.getMethod(), param.getScope());\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/model/impl/AbstractPermissions.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.model.impl;\n\nimport java.util.List;\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MappedSuperclass;\nimport javax.persistence.OneToOne;\nimport javax.persistence.PostLoad;\nimport javax.persistence.PrePersist;\nimport javax.persistence.PreUpdate;\nimport javax.persistence.Transient;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\nimport org.eclipse.che.multiuser.api.permission.shared.model.Permissions;\n\n/**\n * Represents user's permissions to access to some resources\n *\n * @author Sergii Leschenko\n */\n@MappedSuperclass\npublic abstract class AbstractPermissions implements Permissions {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  protected String id;\n\n  @Column(name = \"user_id\")\n  protected String userId;\n\n  @OneToOne\n  @JoinColumn(name = \"user_id\", insertable = false, updatable = false)\n  private UserImpl user;\n\n  @Transient private String userIdHolder;\n\n  public AbstractPermissions() {}\n\n  public AbstractPermissions(Permissions permissions) {\n    this(permissions.getUserId());\n  }\n\n  public AbstractPermissions(String userId) {\n    this.userIdHolder = userId;\n    this.userId = userId;\n  }\n\n  /** Returns used id */\n  @Override\n  public String getUserId() {\n    return userIdHolder;\n  }\n\n  public void setUserId(String userId) {\n    this.userIdHolder = userId;\n  }\n\n  /** Returns instance id */\n  @Override\n  public abstract String getInstanceId();\n\n  /** Returns domain id */\n  @Override\n  public abstract String getDomainId();\n\n  /** List of actions which user can perform for particular instance */\n  @Override\n  public abstract List<String> getActions();\n\n  @PreUpdate\n  @PrePersist\n  private void prePersist() {\n    if (\"*\".equals(userIdHolder)) {\n      userId = null;\n    } else {\n      userId = userIdHolder;\n    }\n  }\n\n  @PostLoad\n  private void postLoad() {\n    if (userId == null) {\n      userIdHolder = \"*\";\n    } else {\n      userIdHolder = userId;\n    }\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof AbstractPermissions)) return false;\n    final AbstractPermissions other = (AbstractPermissions) obj;\n    return Objects.equals(id, other.id)\n        && Objects.equals(getUserId(), other.getUserId())\n        && Objects.equals(getInstanceId(), other.getInstanceId())\n        && Objects.equals(getDomainId(), other.getDomainId())\n        && Objects.equals(getActions(), other.getActions());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + Objects.hashCode(getUserId());\n    hash = 31 * hash + Objects.hashCode(getInstanceId());\n    hash = 31 * hash + Objects.hashCode(getDomainId());\n    hash = 31 * hash + Objects.hashCode(getActions());\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"AbstractPermissions{\" + \"id='\" + id + '\\'' + \", user=\" + user + '}';\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/model/impl/SystemPermissionsImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.model.impl;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.NamedQueries;\nimport javax.persistence.NamedQuery;\nimport javax.persistence.Table;\nimport org.eclipse.che.multiuser.api.permission.server.SystemDomain;\n\n/**\n * System permissions data object.\n *\n * @author Max Shaposhnik\n */\n@Entity(name = \"SystemPermissions\")\n@NamedQueries({\n  @NamedQuery(\n      name = \"SystemPermissions.getByUserId\",\n      query =\n          \"SELECT permissions \"\n              + \"FROM SystemPermissions permissions \"\n              + \"WHERE permissions.userId = :userId \"),\n  @NamedQuery(\n      name = \"SystemPermissions.getAll\",\n      query = \"SELECT permissions \" + \"FROM SystemPermissions permissions \"),\n  @NamedQuery(\n      name = \"SystemPermissions.getTotalCount\",\n      query = \"SELECT COUNT(permissions) \" + \"FROM SystemPermissions permissions \")\n})\n@Table(name = \"che_system_permissions\")\npublic class SystemPermissionsImpl extends AbstractPermissions {\n\n  public SystemPermissionsImpl() {}\n\n  public SystemPermissionsImpl(String userId, List<String> actions) {\n    super(userId);\n    if (actions != null) {\n      this.actions = new ArrayList<>(actions);\n    }\n  }\n\n  public SystemPermissionsImpl(SystemPermissionsImpl permissions) {\n    this(permissions.getUserId(), permissions.getActions());\n  }\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @Column(name = \"actions\")\n  @CollectionTable(\n      name = \"che_system_permissions_actions\",\n      joinColumns = @JoinColumn(name = \"system_permissions_id\"))\n  protected List<String> actions;\n\n  @Override\n  public String getInstanceId() {\n    return null;\n  }\n\n  @Override\n  public String getDomainId() {\n    return SystemDomain.DOMAIN_ID;\n  }\n\n  @Override\n  public List<String> getActions() {\n    return actions;\n  }\n\n  @Override\n  public String toString() {\n    return \"SystemPermissions{\" + \"user='\" + getUserId() + '\\'' + \", actions=\" + actions + '}';\n  }\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission/src/main/java/org/eclipse/che/multiuser/api/permission/server/spi/PermissionsDao.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.server.spi;\n\nimport java.util.List;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.multiuser.api.permission.server.AbstractPermissionsDomain;\nimport org.eclipse.che.multiuser.api.permission.server.model.impl.AbstractPermissions;\n\n/**\n * General contract of storage for permissions. Single Storage may maintain one or more Domains (it\n * is responsibility of system on top to make the choice consistent) It actually defines CRUD\n * methods with some specific such as: - processing list of permissions - checking for existence but\n * not returning fully qualified stored permission\n *\n * @author gazarenkov\n * @author Sergii Leschenko\n */\npublic interface PermissionsDao<T extends AbstractPermissions> {\n\n  /**\n   * @return store of domains this storage is able to maintain\n   */\n  AbstractPermissionsDomain<T> getDomain();\n\n  /**\n   * Stores (adds or updates) permissions.\n   *\n   * @param permissions permission to store\n   * @return optional with updated permissions, other way empty optional must be returned\n   * @throws ServerException when any other error occurs during permissions storing\n   */\n  Optional<T> store(T permissions) throws ServerException;\n\n  /**\n   * @param userId user id\n   * @param instanceId instance id\n   * @return user's permissions for specified instance\n   * @throws NullPointerException when instance id is null and domain requires it\n   * @throws NullPointerException when user id is null\n   * @throws NotFoundException when permissions with given user and domain and instance was not\n   *     found\n   * @throws ServerException when any other error occurs during permissions fetching\n   */\n  T get(String userId, String instanceId) throws ServerException, NotFoundException;\n\n  /**\n   * @param instanceId instance id\n   * @param maxItems the maximum number of permissions to return\n   * @param skipCount the number of permissions to skip\n   * @return set of permissions\n   * @throws NotFoundException when given instance was not found\n   * @throws ServerException when any other error occurs during permissions fetching\n   */\n  Page<T> getByInstance(String instanceId, int maxItems, long skipCount)\n      throws ServerException, NotFoundException;\n\n  /**\n   * @param userId user id\n   * @return set of permissions\n   * @throws NotFoundException when given instance was not found\n   * @throws ServerException when any other error occurs during permissions fetching\n   */\n  List<T> getByUser(String userId) throws ServerException, NotFoundException;\n\n  /**\n   * @param userId user id\n   * @param instanceId instance id\n   * @param action action name\n   * @return true if the permission exists\n   * @throws ServerException when any other error occurs during permission existence checking\n   */\n  boolean exists(String userId, String instanceId, String action) throws ServerException;\n\n  /**\n   * Removes permissions of user related to the particular instance of specified domain\n   *\n   * @param userId user id\n   * @param instanceId instance id\n   * @throws NotFoundException when permissions with given user and domain and instance was not\n   *     found\n   * @throws ServerException when any other error occurs during permissions removing\n   */\n  void remove(String userId, String instanceId) throws ServerException, NotFoundException;\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission-shared/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-multiuser-api</artifactId>\n        <groupId>org.eclipse.che.multiuser</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-multiuser-api-permission-shared</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Multiuser :: Permissions :: Shared</name>\n    <dependencies>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission-shared/src/main/java/org/eclipse/che/multiuser/api/permission/shared/dto/DomainDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.shared.dto;\n\nimport java.util.List;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.multiuser.api.permission.shared.model.PermissionsDomain;\n\n/**\n * @author Sergii Leschenko\n */\n@DTO\npublic interface DomainDto extends PermissionsDomain {\n  @Override\n  String getId();\n\n  void setId(String id);\n\n  DomainDto withId(String id);\n\n  @Override\n  List<String> getAllowedActions();\n\n  void setAllowedActions(List<String> allowedActions);\n\n  DomainDto withAllowedActions(List<String> allowedActions);\n\n  @Override\n  Boolean isInstanceRequired();\n\n  void setInstanceRequired(Boolean isInstanceRequired);\n\n  DomainDto withInstanceRequired(Boolean isInstanceRequired);\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission-shared/src/main/java/org/eclipse/che/multiuser/api/permission/shared/dto/PermissionsDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.shared.dto;\n\nimport java.util.List;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.multiuser.api.permission.shared.model.Permissions;\n\n/**\n * @author Sergii Leschenko\n */\n@DTO\npublic interface PermissionsDto extends Permissions {\n  @Override\n  String getUserId();\n\n  void setUserId(String userId);\n\n  PermissionsDto withUserId(String userId);\n\n  @Override\n  String getDomainId();\n\n  void setDomainId(String domainId);\n\n  PermissionsDto withDomainId(String domainId);\n\n  @Override\n  String getInstanceId();\n\n  void setInstanceId(String instanceId);\n\n  PermissionsDto withInstanceId(String instanceId);\n\n  @Override\n  List<String> getActions();\n\n  void setActions(List<String> actions);\n\n  PermissionsDto withActions(List<String> actions);\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission-shared/src/main/java/org/eclipse/che/multiuser/api/permission/shared/event/EventType.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.shared.event;\n\n/**\n * Defines list of event types related to permissions.\n *\n * @author Anton Korneta\n */\npublic enum EventType {\n  PERMISSIONS_ADDED,\n\n  PERMISSIONS_REMOVED\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission-shared/src/main/java/org/eclipse/che/multiuser/api/permission/shared/event/PermissionsEvent.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.shared.event;\n\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.multiuser.api.permission.shared.model.Permissions;\n\n/**\n * The base interface for all events related to permissions.\n *\n * @author Anton Korneta\n */\npublic interface PermissionsEvent {\n\n  /** Returns the permissions related to this event. */\n  Permissions getPermissions();\n\n  /** Returns concrete event type, see {@link EventType}. */\n  EventType getType();\n\n  /** Returns name of user who acted with permission or null if user is undefined. */\n  @Nullable\n  String getInitiator();\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission-shared/src/main/java/org/eclipse/che/multiuser/api/permission/shared/model/Permissions.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.shared.model;\n\nimport java.util.List;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Represents users' permissions to access to some resources\n *\n * @author Sergii Leschenko\n */\npublic interface Permissions {\n  /**\n   * Returns user id\n   *\n   * <p>Note: also supported '*' for marking all users\n   */\n  String getUserId();\n\n  /** Returns domain id */\n  String getDomainId();\n\n  /**\n   * Returns instance id. It is optional and can be null if domain supports it\n   *\n   * @see PermissionsDomain#isInstanceRequired()\n   */\n  @Nullable\n  String getInstanceId();\n\n  /** List of actions which user can perform for particular instance */\n  List<String> getActions();\n}\n"
  },
  {
    "path": "multiuser/api/che-multiuser-api-permission-shared/src/main/java/org/eclipse/che/multiuser/api/permission/shared/model/PermissionsDomain.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.api.permission.shared.model;\n\nimport java.util.List;\n\n/**\n * Describes permissions domain\n *\n * @author Sergii Leschenko\n * @author gazarenkov\n */\npublic interface PermissionsDomain {\n  /**\n   * @return id of permissions domain\n   */\n  String getId();\n\n  /**\n   * @return true if domain requires non nullable value for instance field or false otherwise\n   */\n  Boolean isInstanceRequired();\n\n  /**\n   * @return list actions which are allowed for domain\n   */\n  List<String> getAllowedActions();\n}\n"
  },
  {
    "path": "multiuser/api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-multiuser-parent</artifactId>\n        <groupId>org.eclipse.che.multiuser</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n        <relativePath>../pom.xml</relativePath>\n    </parent>\n    <artifactId>che-multiuser-api</artifactId>\n    <packaging>pom</packaging>\n    <name>Che Multiuser :: API Parent</name>\n    <modules>\n        <module>che-multiuser-api-authentication-commons</module>\n        <module>che-multiuser-api-permission-shared</module>\n        <module>che-multiuser-api-permission</module>\n        <module>che-multiuser-api-authorization</module>\n        <module>che-multiuser-api-authorization-impl</module>\n    </modules>\n</project>\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-multiuser-machine-auth</artifactId>\n        <groupId>org.eclipse.che.multiuser</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-multiuser-machine-authentication</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Multiuser :: Machine Authentication</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-persist</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.jsonwebtoken</groupId>\n            <artifactId>jjwt-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.annotation</groupId>\n            <artifactId>jakarta.annotation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-user</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-authentication-commons</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-authorization</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-permission</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-machine-authentication-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>jakarta.persistence</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.jsonwebtoken</groupId>\n            <artifactId>jjwt-impl</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.jsonwebtoken</groupId>\n            <artifactId>jjwt-jackson</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-account</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-sql-schema</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.jpa</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-dependency-plugin</artifactId>\n                <executions>\n                    <!-- compiler inlines constants, so it is impossible to find reference on dependency -->\n                    <execution>\n                        <id>analyze</id>\n                        <configuration>\n                            <ignoredDependencies>\n                                <ignoreDependency>org.eclipse.che.multiuser:che-multiuser-api-permission</ignoreDependency>\n                            </ignoredDependencies>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-resource</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <id>server</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                        <configuration>\n                            <dtoPackages>\n                                <package>org.eclipse.che.multiuser.machine.authentication.shared.dto</package>\n                            </dtoPackages>\n                            <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                            <genClassName>org.eclipse.che.multiuser.machine.authentication.server.DtoServerImpls</genClassName>\n                            <impl>server</impl>\n                        </configuration>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.multiuser</groupId>\n                        <artifactId>che-multiuser-machine-authentication-shared</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n            </plugin>\n            <!-- Create the test jar -->\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>test-jar</goal>\n                        </goals>\n                        <configuration>\n                            <includes>\n                                <include>**/spi/tck/*.*</include>\n                            </includes>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/MachineAuthModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\nimport com.google.inject.name.Names;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.EnvVarProvider;\nimport org.eclipse.che.api.workspace.server.token.MachineTokenProvider;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignatureAlgorithmEnvProvider;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignatureKeyManager;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignaturePublicKeyEnvProvider;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.jpa.JpaSignatureKeyDao;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.spi.SignatureKeyDao;\n\n/**\n * Machine auth module.\n *\n * @author Max Shaposhnik\n * @author Sergii Leshchenko\n */\npublic class MachineAuthModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    bind(MachineSessionInvalidator.class).asEagerSingleton();\n\n    bind(MachineTokenProvider.class).to(MachineTokenProviderImpl.class);\n\n    bind(MachineTokenAccessFilter.class);\n\n    bind(SignatureKeyManager.class);\n    bind(SignatureKeyDao.class).to(JpaSignatureKeyDao.class);\n    final Multibinder<EnvVarProvider> envVarProviders =\n        Multibinder.newSetBinder(binder(), EnvVarProvider.class);\n    envVarProviders.addBinding().to(SignaturePublicKeyEnvProvider.class);\n    envVarProviders.addBinding().to(SignatureAlgorithmEnvProvider.class);\n\n    final Multibinder<MachineAuthenticatedResource> machineAuthenticatedResources =\n        Multibinder.newSetBinder(binder(), MachineAuthenticatedResource.class);\n    machineAuthenticatedResources\n        .addBinding()\n        .toInstance(\n            new MachineAuthenticatedResource(\n                \"/workspace\", \"getByKey\", \"getSettings\", \"update\", \"stop\"));\n    machineAuthenticatedResources\n        .addBinding()\n        .toInstance(\n            new MachineAuthenticatedResource(\n                \"/ssh\", \"getPair\", \"generatePair\", \"createPair\", \"getPairs\", \"removePair\"));\n    machineAuthenticatedResources\n        .addBinding()\n        .toInstance(new MachineAuthenticatedResource(\"/factory\", \"resolveFactory\"));\n    machineAuthenticatedResources\n        .addBinding()\n        .toInstance(\n            new MachineAuthenticatedResource(\n                \"/preferences\", \"find\", \"save\", \"update\", \"removePreferences\"));\n    machineAuthenticatedResources\n        .addBinding()\n        .toInstance(new MachineAuthenticatedResource(\"/activity\", \"active\"));\n\n    machineAuthenticatedResources\n        .addBinding()\n        .toInstance(new MachineAuthenticatedResource(\"project-template\", \"getProjectTemplates\"));\n    machineAuthenticatedResources\n        .addBinding()\n        .toInstance(new MachineAuthenticatedResource(\"/installer\", \"getInstallers\"));\n\n    bindConstant().annotatedWith(Names.named(\"che.auth.signature_key_size\")).to(2048);\n    bindConstant().annotatedWith(Names.named(\"che.auth.signature_key_algorithm\")).to(\"RSA\");\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/MachineAuthenticatedResource.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server;\n\nimport static java.util.Arrays.asList;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\n/**\n * Describes resource which can be accessible using machine token. Consists of rest service path\n * with preliminary slash and set of method names.\n *\n * @author Max Shaposhnyk\n */\npublic class MachineAuthenticatedResource {\n\n  private final String servicePath;\n\n  private final Set<String> methodNames;\n\n  public MachineAuthenticatedResource(String servicePath, String... methodNames) {\n    this.servicePath = servicePath;\n    this.methodNames = new HashSet(asList(methodNames));\n  }\n\n  public String getServicePath() {\n    return servicePath;\n  }\n\n  public Set<String> getMethodNames() {\n    return methodNames;\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/MachineLoginFilter.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server;\n\nimport static jakarta.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;\nimport static java.lang.String.format;\nimport static org.eclipse.che.multiuser.machine.authentication.shared.Constants.USER_ID_CLAIM;\nimport static org.eclipse.che.multiuser.machine.authentication.shared.Constants.WORKSPACE_ID_CLAIM;\n\nimport io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.JwtException;\nimport io.jsonwebtoken.JwtParser;\nimport io.jsonwebtoken.Jwts;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport java.io.IOException;\nimport java.util.Collections;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.user.server.UserManager;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.multiuser.api.authentication.commons.SessionStore;\nimport org.eclipse.che.multiuser.api.authentication.commons.filter.MultiUserEnvironmentInitializationFilter;\nimport org.eclipse.che.multiuser.api.authentication.commons.token.RequestTokenExtractor;\nimport org.eclipse.che.multiuser.api.permission.server.PermissionChecker;\n\n/**\n * Handles requests that comes from machines with specific machine token.\n *\n * @author Max Shaposhnik (mshaposhnik@codenvy.com)\n * @author Anton Korneta\n */\n@Singleton\npublic class MachineLoginFilter extends MultiUserEnvironmentInitializationFilter<Claims> {\n\n  private final UserManager userManager;\n  private final JwtParser jwtParser;\n  private final PermissionChecker permissionChecker;\n\n  @Inject\n  public MachineLoginFilter(\n      SessionStore sessionStore,\n      RequestTokenExtractor tokenExtractor,\n      UserManager userManager,\n      MachineSigningKeyResolver machineKeyResolver,\n      PermissionChecker permissionChecker) {\n    super(sessionStore, tokenExtractor);\n    this.userManager = userManager;\n    this.jwtParser = Jwts.parser().setSigningKeyResolver(machineKeyResolver).build();\n    this.permissionChecker = permissionChecker;\n  }\n\n  @Override\n  public void init(FilterConfig filterConfig) {}\n\n  @Override\n  public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)\n      throws IOException, ServletException {\n    try {\n      super.doFilter(request, response, filterChain);\n    } catch (NotMachineTokenJwtException mte) {\n      filterChain.doFilter(request, response);\n    } catch (JwtException e) {\n      sendError(\n          response,\n          SC_UNAUTHORIZED,\n          format(\"Machine token authentication failed: %s\", e.getMessage()));\n      return;\n    }\n  }\n\n  @Override\n  protected Optional<Claims> processToken(String token) {\n    return Optional.ofNullable(jwtParser.parseClaimsJws(token).getBody());\n  }\n\n  @Override\n  public Subject extractSubject(String token, Claims claims) {\n    try {\n      final String userId = claims.get(USER_ID_CLAIM, String.class);\n      // check if user with such id exists\n      final String userName = userManager.getById(userId).getName();\n      final String workspaceId = claims.get(WORKSPACE_ID_CLAIM, String.class);\n      return new MachineTokenAuthorizedSubject(\n          new SubjectImpl(userName, Collections.emptyList(), userId, token, false),\n          permissionChecker,\n          workspaceId);\n    } catch (NotFoundException e) {\n      throw new JwtException(\"Corresponding user doesn't exist.\");\n    } catch (ServerException | JwtException e) {\n      throw new JwtException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  protected String getUserId(Claims claims) {\n    return claims.get(USER_ID_CLAIM, String.class);\n  }\n\n  @Override\n  protected void handleMissingToken(\n      ServletRequest request, ServletResponse response, FilterChain chain)\n      throws IOException, ServletException {\n    chain.doFilter(request, response);\n  }\n\n  @Override\n  public void destroy() {}\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/MachineSessionInvalidator.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.core.notification.EventSubscriber;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\n\n/**\n * Clears all machine tokens associated with stopped workspace.\n *\n * @author Max Shaposhnyk\n */\n@Singleton\npublic class MachineSessionInvalidator implements EventSubscriber<WorkspaceStatusEvent> {\n\n  private final MachineTokenRegistry tokenRegistry;\n\n  @Inject\n  public MachineSessionInvalidator(MachineTokenRegistry tokenRegistry) {\n    this.tokenRegistry = tokenRegistry;\n  }\n\n  @Override\n  public void onEvent(WorkspaceStatusEvent event) {\n    if (WorkspaceStatus.STOPPED.equals(event.getStatus())) {\n      tokenRegistry.removeTokens(event.getWorkspaceId());\n    }\n  }\n\n  @Inject\n  private void subscribe(EventService eventService) {\n    eventService.subscribe(this);\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/MachineSigningKeyResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server;\n\nimport static org.eclipse.che.multiuser.machine.authentication.shared.Constants.MACHINE_TOKEN_KIND;\nimport static org.eclipse.che.multiuser.machine.authentication.shared.Constants.WORKSPACE_ID_CLAIM;\n\nimport io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.JwsHeader;\nimport io.jsonwebtoken.JwtException;\nimport io.jsonwebtoken.SigningKeyResolverAdapter;\nimport java.security.Key;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignatureKeyManager;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignatureKeyManagerException;\n\n/** Resolves signing key pair based on workspace Id claim of token. */\n@Singleton\npublic class MachineSigningKeyResolver extends SigningKeyResolverAdapter {\n\n  private final SignatureKeyManager keyManager;\n\n  @Inject\n  public MachineSigningKeyResolver(SignatureKeyManager keyManager) {\n    this.keyManager = keyManager;\n  }\n\n  @Override\n  public Key resolveSigningKey(JwsHeader header, Claims claims) {\n    if (!MACHINE_TOKEN_KIND.equals(header.get(\"kind\"))) {\n      throw new NotMachineTokenJwtException();\n    }\n    String wsId = claims.get(WORKSPACE_ID_CLAIM, String.class);\n    if (wsId == null) {\n      throw new JwtException(\n          \"Unable to fetch signature key pair: no workspace id present in token\");\n    }\n    try {\n      return keyManager.getOrCreateKeyPair(wsId).getPublic();\n    } catch (SignatureKeyManagerException e) {\n      throw new JwtException(\"Unable to fetch signature key pair:\" + e.getMessage(), e);\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/MachineTokenAccessFilter.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server;\n\nimport com.google.common.collect.HashMultimap;\nimport com.google.common.collect.SetMultimap;\nimport jakarta.ws.rs.Path;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.everrest.CheMethodInvokerFilter;\nimport org.everrest.core.Filter;\nimport org.everrest.core.resource.GenericResourceMethod;\n\n/**\n * Limits set of methods which can be invoked using machine token signed requests.\n *\n * @author Max Shaposhnik (mshaposh@redhat.com)\n */\n@Filter\n@Path(\"/{path:.*}\")\npublic class MachineTokenAccessFilter extends CheMethodInvokerFilter {\n\n  private final SetMultimap<String, String> allowedMethodsByPath = HashMultimap.create();\n\n  @Inject\n  public MachineTokenAccessFilter(Set<MachineAuthenticatedResource> resources) {\n    for (MachineAuthenticatedResource resource : resources) {\n      allowedMethodsByPath.putAll(resource.getServicePath(), resource.getMethodNames());\n    }\n  }\n\n  @Override\n  protected void filter(GenericResourceMethod genericMethodResource, Object[] arguments)\n      throws ForbiddenException {\n    if (!(EnvironmentContext.getCurrent().getSubject() instanceof MachineTokenAuthorizedSubject)) {\n      return;\n    }\n    if (!allowedMethodsByPath\n        .get(genericMethodResource.getParentResource().getPathValue().getPath())\n        .contains(genericMethodResource.getMethod().getName())) {\n      throw new ForbiddenException(\"This operation cannot be performed using machine token.\");\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/MachineTokenAuthorizedSubject.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server;\n\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.multiuser.api.permission.server.AuthorizedSubject;\nimport org.eclipse.che.multiuser.api.permission.server.PermissionChecker;\n\n/**\n * An implementation of {@link Subject} which should be used when request was signed by machine\n * token. This implementation limits all workspace related permissions to the single workspace for\n * which the machine token was issued.\n *\n * @author Max Shaposhnik (mshaposh@redhat.com)\n */\npublic class MachineTokenAuthorizedSubject extends AuthorizedSubject {\n\n  private final String claimsWorkspaceId;\n\n  public MachineTokenAuthorizedSubject(\n      Subject baseSubject, PermissionChecker permissionChecker, String claimsWorkspaceId) {\n    super(baseSubject, permissionChecker);\n    this.claimsWorkspaceId = claimsWorkspaceId;\n  }\n\n  @Override\n  public boolean hasPermission(String domain, String instance, String action) {\n    if (domain.equals(\"workspace\") && !instance.equals(claimsWorkspaceId)) {\n      return false;\n    }\n    return super.hasPermission(domain, instance, action);\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/MachineTokenProviderImpl.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server;\n\nimport static java.lang.String.format;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.token.MachineTokenException;\nimport org.eclipse.che.api.workspace.server.token.MachineTokenProvider;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.multiuser.api.permission.server.PermissionChecker;\n\n/**\n * Provides machine token from {@link MachineTokenRegistry}.\n *\n * <p>Note that {@link MachineTokenRegistry} provides different tokens for different users. Token of\n * current user will be provided for agents.\n *\n * @author Sergii Leshchenko\n */\n@Singleton\npublic class MachineTokenProviderImpl implements MachineTokenProvider {\n\n  private final PermissionChecker permissionChecker;\n  private final MachineTokenRegistry tokenRegistry;\n\n  @Inject\n  public MachineTokenProviderImpl(\n      PermissionChecker permissionChecker, MachineTokenRegistry tokenRegistry) {\n    this.permissionChecker = permissionChecker;\n    this.tokenRegistry = tokenRegistry;\n  }\n\n  @Override\n  public String getToken(String workspaceId) throws MachineTokenException {\n    final Subject subject = EnvironmentContext.getCurrent().getSubject();\n    if (subject.isAnonymous()) {\n      throw new IllegalStateException(\n          format(\n              \"Unable to get machine token of the workspace '%s' \"\n                  + \"because it does not exist for an anonymous user.\",\n              workspaceId));\n    }\n    return getToken(subject.getUserId(), workspaceId);\n  }\n\n  @Override\n  public String getToken(String userId, String workspaceId) throws MachineTokenException {\n    //    try {\n    //      if (!permissionChecker.hasPermission(userId, DOMAIN_ID, workspaceId, USE)) {\n    //        throw new MachineAccessForbidden(\n    //            format(\n    //                \"The user `%s` doesn't have the required `use` permission for workspace `%s`\",\n    //                userId, workspaceId));\n    //      }\n    //    } catch (ServerException | NotFoundException | ConflictException e) {\n    //      throw new MachineTokenException(e.getMessage(), e);\n    //    }\n\n    return tokenRegistry.getOrCreateToken(userId, workspaceId);\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/MachineTokenRegistry.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server;\n\nimport static io.jsonwebtoken.SignatureAlgorithm.RS256;\nimport static java.lang.String.format;\nimport static java.time.temporal.ChronoUnit.DAYS;\nimport static org.eclipse.che.multiuser.machine.authentication.shared.Constants.MACHINE_TOKEN_KIND;\n\nimport com.google.common.collect.HashBasedTable;\nimport com.google.common.collect.Table;\nimport io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.Jwts;\nimport java.security.PrivateKey;\nimport java.time.Instant;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.UUID;\nimport java.util.concurrent.locks.ReadWriteLock;\nimport java.util.concurrent.locks.ReentrantReadWriteLock;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.user.server.UserManager;\nimport org.eclipse.che.api.workspace.server.token.MachineTokenException;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignatureKeyManager;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignatureKeyManagerException;\nimport org.eclipse.che.multiuser.machine.authentication.shared.Constants;\n\n/**\n * Table-based storage of machine security tokens. Table rows is workspace id's, columns - user\n * id's. Table is synchronized externally as required by its javadoc.\n *\n * @author Max Shaposhnik (mshaposhnik@codenvy.com)\n * @see HashBasedTable\n */\n@Singleton\npublic class MachineTokenRegistry {\n\n  private final SignatureKeyManager signatureKeyManager;\n  private final UserManager userManager;\n  private final Table<String, String, String> tokens;\n  private final ReadWriteLock lock;\n\n  @Inject\n  public MachineTokenRegistry(SignatureKeyManager signatureKeyManager, UserManager userManager) {\n    this.signatureKeyManager = signatureKeyManager;\n    this.userManager = userManager;\n    this.tokens = HashBasedTable.create();\n    this.lock = new ReentrantReadWriteLock();\n  }\n\n  /**\n   * Gets or creates machine security token for user and workspace. For running workspace, there is\n   * always at least one token for user who performed start.\n   *\n   * @param userId id of user to get token\n   * @param workspaceId id of workspace to get token\n   * @return machine security token for for given user and workspace\n   * @throws MachineTokenException when user with given id not found or any errors occurs\n   */\n  public String getOrCreateToken(String userId, String workspaceId) throws MachineTokenException {\n    lock.writeLock().lock();\n    try {\n      final Map<String, String> wsRow = tokens.row(workspaceId);\n      String token = wsRow.get(userId);\n      if (token == null) {\n        token = createToken(userId, workspaceId);\n      }\n      return token;\n    } finally {\n      lock.writeLock().unlock();\n    }\n  }\n\n  /** Creates new token with given data. */\n  private String createToken(String userId, String workspaceId) throws MachineTokenException {\n    try {\n      final PrivateKey privateKey =\n          signatureKeyManager.getOrCreateKeyPair(workspaceId).getPrivate();\n      final User user = userManager.getById(userId);\n      final Map<String, Object> header = new HashMap<>(2);\n      header.put(\"kind\", MACHINE_TOKEN_KIND);\n      header.put(\"kid\", workspaceId);\n      final Map<String, Object> claims = new HashMap<>();\n      // to ensure that each token is unique\n      claims.put(Claims.ID, UUID.randomUUID().toString());\n      claims.put(Constants.USER_ID_CLAIM, userId);\n      claims.put(Constants.USER_NAME_CLAIM, user.getName());\n      claims.put(Constants.WORKSPACE_ID_CLAIM, workspaceId);\n      // jwtproxy required claims\n      claims.put(Claims.ISSUER, \"wsmaster\");\n      claims.put(Claims.AUDIENCE, workspaceId);\n      claims.put(Claims.EXPIRATION, Instant.now().plus(365, DAYS).getEpochSecond());\n      claims.put(Claims.NOT_BEFORE, -1); // always\n      claims.put(Claims.ISSUED_AT, Instant.now().getEpochSecond());\n      final String token =\n          Jwts.builder().setClaims(claims).setHeader(header).signWith(RS256, privateKey).compact();\n      tokens.put(workspaceId, userId, token);\n      return token;\n    } catch (SignatureKeyManagerException | NotFoundException | ServerException ex) {\n      throw new MachineTokenException(\n          format(\n              \"Failed to generate machine token for user '%s' and workspace '%s'. Cause: '%s'\",\n              userId, workspaceId, ex.getMessage()),\n          ex);\n    }\n  }\n\n  /**\n   * Invalidates machine security tokens for all users of given workspace.\n   *\n   * @param workspaceId workspace to invalidate tokens\n   * @return the copy of the tokens row, where row is a map where key is user id and value is token\n   */\n  public Map<String, String> removeTokens(String workspaceId) {\n    lock.writeLock().lock();\n    try {\n      final Map<String, String> rowCopy = new HashMap<>(tokens.row(workspaceId));\n      tokens.row(workspaceId).clear();\n      return rowCopy;\n    } finally {\n      lock.writeLock().unlock();\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/NotMachineTokenJwtException.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server;\n\nimport io.jsonwebtoken.JwtException;\n\npublic class NotMachineTokenJwtException extends JwtException {\n\n  public NotMachineTokenJwtException() {\n    super(\"This is not a machine token\");\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/signature/SignatureAlgorithmEnvProvider.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server.signature;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.EnvVarProvider;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.multiuser.machine.authentication.shared.Constants;\n\n/**\n * Provides signature algorithm into machine environment.\n *\n * @author Anton Korneta\n */\npublic class SignatureAlgorithmEnvProvider implements EnvVarProvider {\n\n  private final String algorithm;\n\n  @Inject\n  public SignatureAlgorithmEnvProvider(\n      @Named(\"che.auth.signature_key_algorithm\") String algorithm) {\n    this.algorithm = algorithm;\n  }\n\n  @Override\n  public Pair<String, String> get(RuntimeIdentity runtimeIdentity) {\n    return Pair.of(Constants.SIGNATURE_ALGORITHM_ENV, algorithm);\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/signature/SignatureKey.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server.signature;\n\nimport com.google.common.annotations.Beta;\n\n/**\n * Defines signature key interface.\n *\n * @author Anton Korneta\n */\n@Beta\npublic interface SignatureKey {\n\n  /** Returns algorithm of this signature key. */\n  String getAlgorithm();\n\n  /** Returns encoding format of this signature key. */\n  String getFormat();\n\n  /** Returns encoded value of this signature key. */\n  byte[] getEncoded();\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/signature/SignatureKeyManager.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server.signature;\n\nimport static org.eclipse.che.api.core.model.workspace.WorkspaceStatus.STOPPED;\n\nimport com.google.common.annotations.Beta;\nimport com.google.common.annotations.VisibleForTesting;\nimport jakarta.annotation.PostConstruct;\nimport java.security.KeyFactory;\nimport java.security.KeyPair;\nimport java.security.KeyPairGenerator;\nimport java.security.NoSuchAlgorithmException;\nimport java.security.PrivateKey;\nimport java.security.PublicKey;\nimport java.security.spec.EncodedKeySpec;\nimport java.security.spec.InvalidKeySpecException;\nimport java.security.spec.PKCS8EncodedKeySpec;\nimport java.security.spec.X509EncodedKeySpec;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.core.notification.EventSubscriber;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.model.impl.SignatureKeyPairImpl;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.spi.SignatureKeyDao;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Manages signature keys.\n *\n * @author Anton Korneta\n */\n@Beta\n@Singleton\npublic class SignatureKeyManager {\n\n  public static final String PKCS_8 = \"PKCS#8\";\n  public static final String X_509 = \"X.509\";\n\n  private static final Logger LOG = LoggerFactory.getLogger(SignatureKeyManager.class);\n\n  private final int keySize;\n\n  private final String algorithm;\n  private final SignatureKeyDao signatureKeyDao;\n  private final EventService eventService;\n  private final EventSubscriber<?> workspaceEventsSubscriber;\n\n  @Inject\n  public SignatureKeyManager(\n      @Named(\"che.auth.signature_key_size\") int keySize,\n      @Named(\"che.auth.signature_key_algorithm\") String algorithm,\n      EventService eventService,\n      SignatureKeyDao signatureKeyDao) {\n    this.keySize = keySize;\n    this.algorithm = algorithm;\n    this.eventService = eventService;\n    this.signatureKeyDao = signatureKeyDao;\n    this.workspaceEventsSubscriber =\n        new EventSubscriber<WorkspaceStatusEvent>() {\n          @Override\n          public void onEvent(WorkspaceStatusEvent event) {\n            if (event.getStatus() == STOPPED) {\n              removeKeyPair(event.getWorkspaceId());\n            }\n          }\n        };\n  }\n\n  /**\n   * Returns instance of {@link KeyPair} for given workspace.\n   *\n   * @throws SignatureKeyManagerException when stored keypair is incorrect (e.g. has bad algorithm\n   *     or keyspec) or other error\n   */\n  public KeyPair getOrCreateKeyPair(String workspaceId) throws SignatureKeyManagerException {\n    SignatureKeyPair keyPair;\n    try {\n      try {\n        keyPair = signatureKeyDao.get(workspaceId);\n      } catch (NotFoundException e) {\n        keyPair = generateKeyPair(workspaceId);\n      }\n    } catch (NoSuchAlgorithmException | ServerException | ConflictException ex) {\n      LOG.error(\n          \"Failed to load signature keys for ws  {}. Cause: {}\", workspaceId, ex.getMessage());\n      throw new SignatureKeyManagerException(ex.getMessage(), ex);\n    }\n    return toJavaKeyPair(keyPair);\n  }\n\n  /** Removes key pair from cache and DB. */\n  @VisibleForTesting\n  void removeKeyPair(String workspaceId) {\n    try {\n      signatureKeyDao.remove(workspaceId);\n      LOG.debug(\"Removed signature key pair for ws id {}.\", workspaceId);\n    } catch (ServerException e) {\n      LOG.error(\n          \"Unable to cleanup machine token signature keypairs for ws {}. Cause: {}\",\n          workspaceId,\n          e.getMessage());\n    }\n  }\n\n  @VisibleForTesting\n  SignatureKeyPair generateKeyPair(String workspaceId)\n      throws NoSuchAlgorithmException, ServerException, ConflictException {\n    try {\n      KeyPairGenerator kpg = KeyPairGenerator.getInstance(algorithm);\n      kpg.initialize(keySize);\n      final KeyPair pair = kpg.generateKeyPair();\n      final SignatureKeyPairImpl kp =\n          new SignatureKeyPairImpl(workspaceId, pair.getPublic(), pair.getPrivate());\n      LOG.debug(\n          \"Generated signature key pair with ws id {} and algorithm {}.\",\n          kp.getWorkspaceId(),\n          algorithm);\n      return signatureKeyDao.create(kp);\n    } catch (NoSuchAlgorithmException | ConflictException | ServerException ex) {\n      LOG.error(\n          \"Unable to generate signature keypair for ws {}. Cause: {}\",\n          workspaceId,\n          ex.getMessage());\n      throw ex;\n    }\n  }\n\n  /** Returns key spec by key format and encoded data. */\n  private EncodedKeySpec getKeySpec(SignatureKey key) {\n    switch (key.getFormat()) {\n      case PKCS_8:\n        return new PKCS8EncodedKeySpec(key.getEncoded());\n      case X_509:\n        return new X509EncodedKeySpec(key.getEncoded());\n      default:\n        throw new IllegalArgumentException(\n            String.format(\"Unsupported key spec '%s' for signature keys\", key.getFormat()));\n    }\n  }\n\n  private KeyPair toJavaKeyPair(SignatureKeyPair keyPair) throws SignatureKeyManagerException {\n    try {\n      final PrivateKey privateKey =\n          KeyFactory.getInstance(keyPair.getPrivateKey().getAlgorithm())\n              .generatePrivate(getKeySpec(keyPair.getPrivateKey()));\n      final PublicKey publicKey =\n          KeyFactory.getInstance(keyPair.getPublicKey().getAlgorithm())\n              .generatePublic(getKeySpec(keyPair.getPublicKey()));\n      return new KeyPair(publicKey, privateKey);\n    } catch (NoSuchAlgorithmException | InvalidKeySpecException ex) {\n      LOG.error(\"Failed to convert signature key pair to Java keys. Cause: {}\", ex.getMessage());\n      throw new SignatureKeyManagerException(\"Failed to convert signature key pair to Java keys.\");\n    }\n  }\n\n  @VisibleForTesting\n  @PostConstruct\n  void subscribe() {\n    eventService.subscribe(workspaceEventsSubscriber);\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/signature/SignatureKeyManagerException.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server.signature;\n\npublic class SignatureKeyManagerException extends Exception {\n  public SignatureKeyManagerException(String message) {\n    super(message);\n  }\n\n  public SignatureKeyManagerException(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/signature/SignatureKeyPair.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server.signature;\n\nimport com.google.common.annotations.Beta;\n\n/**\n * Represents signature key pair with public and private part.\n *\n * @see SignatureKey\n * @author Anton Korneta\n */\n@Beta\npublic interface SignatureKeyPair {\n\n  /** Returns workspace identifier for this sign key pair. */\n  String getWorkspaceId();\n\n  /** Returns public part for this sign key pair. */\n  SignatureKey getPublicKey();\n\n  /** Returns private part for this sign key pair. */\n  SignatureKey getPrivateKey();\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/signature/SignaturePublicKeyEnvProvider.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server.signature;\n\nimport static org.eclipse.che.multiuser.machine.authentication.shared.Constants.SIGNATURE_PUBLIC_KEY_ENV;\n\nimport java.util.Base64;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.provision.env.EnvVarProvider;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * Provides a public part of a signature key into machine environment.\n *\n * @author Anton Korneta\n */\npublic class SignaturePublicKeyEnvProvider implements EnvVarProvider {\n\n  private final SignatureKeyManager keyManager;\n\n  @Inject\n  public SignaturePublicKeyEnvProvider(SignatureKeyManager keyManager) {\n    this.keyManager = keyManager;\n  }\n\n  @Override\n  public Pair<String, String> get(RuntimeIdentity runtimeIdentity) throws InfrastructureException {\n    try {\n      return Pair.of(\n          SIGNATURE_PUBLIC_KEY_ENV,\n          new String(\n              Base64.getEncoder()\n                  .encode(\n                      keyManager\n                          .getOrCreateKeyPair(runtimeIdentity.getWorkspaceId())\n                          .getPublic()\n                          .getEncoded())));\n    } catch (SignatureKeyManagerException e) {\n      throw new InfrastructureException(\n          \"Signature key pair for machine authentication cannot be retrieved. Reason: \"\n              + e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/signature/jpa/JpaSignatureKeyDao.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server.signature.jpa;\n\nimport static java.lang.String.format;\nimport static java.util.Objects.requireNonNull;\n\nimport com.google.inject.persist.Transactional;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport javax.persistence.EntityManager;\nimport javax.persistence.NoResultException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.model.impl.SignatureKeyPairImpl;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.spi.SignatureKeyDao;\n\n/**\n * JPA based implementation of {@link SignatureKeyDao}.\n *\n * @author Anton Korneta\n */\n@Singleton\npublic class JpaSignatureKeyDao implements SignatureKeyDao {\n\n  private final Provider<EntityManager> managerProvider;\n\n  @Inject\n  public JpaSignatureKeyDao(Provider<EntityManager> managerProvider) {\n    this.managerProvider = managerProvider;\n  }\n\n  @Override\n  public SignatureKeyPairImpl create(SignatureKeyPairImpl keyPair)\n      throws ConflictException, ServerException {\n    requireNonNull(keyPair, \"Required non-null key pair\");\n    try {\n      doCreate(keyPair);\n    } catch (RuntimeException ex) {\n      throw new ServerException(ex.getMessage(), ex);\n    }\n    return new SignatureKeyPairImpl(keyPair);\n  }\n\n  @Transactional\n  protected void doCreate(SignatureKeyPairImpl key) {\n    final EntityManager manager = managerProvider.get();\n    manager.persist(key);\n    manager.flush();\n  }\n\n  @Override\n  public void remove(String workspaceId) throws ServerException {\n    requireNonNull(workspaceId, \"Required non-null workspace Id\");\n    try {\n      doRemove(workspaceId);\n    } catch (RuntimeException ex) {\n      throw new ServerException(ex.getMessage(), ex);\n    }\n  }\n\n  @Transactional\n  protected void doRemove(String workspaceId) {\n    final EntityManager manager = managerProvider.get();\n    final SignatureKeyPairImpl keyPair = manager.find(SignatureKeyPairImpl.class, workspaceId);\n    if (keyPair != null) {\n      manager.remove(keyPair);\n      manager.flush();\n    }\n  }\n\n  @Override\n  @Transactional\n  public SignatureKeyPairImpl get(String workspaceId) throws NotFoundException, ServerException {\n    final EntityManager manager = managerProvider.get();\n    try {\n      return new SignatureKeyPairImpl(\n          manager\n              .createNamedQuery(\"SignKeyPair.getAll\", SignatureKeyPairImpl.class)\n              .setParameter(\"workspaceId\", workspaceId)\n              .getSingleResult());\n    } catch (NoResultException x) {\n      throw new NotFoundException(\n          format(\"Signature key pair for workspace '%s' doesn't exist\", workspaceId));\n    } catch (RuntimeException ex) {\n      throw new ServerException(ex.getMessage(), ex);\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/signature/model/impl/SignatureKeyImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server.signature.model.impl;\n\nimport java.security.Key;\nimport java.util.Arrays;\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignatureKey;\n\n/**\n * @author Anton Korneta\n */\n@Entity(name = \"SignKey\")\n@Table(name = \"che_sign_key\")\npublic class SignatureKeyImpl implements SignatureKey {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"algorithm\")\n  private String algorithm;\n\n  @Column(name = \"encoding_format\")\n  private String format;\n\n  @Column(name = \"encoded_value\")\n  private byte[] encoded;\n\n  public SignatureKeyImpl() {}\n\n  public SignatureKeyImpl(Key publicKey) {\n    this(publicKey.getEncoded(), publicKey.getAlgorithm(), publicKey.getFormat());\n  }\n\n  public SignatureKeyImpl(byte[] encoded, String algorithm, String format) {\n    this.encoded = encoded;\n    this.algorithm = algorithm;\n    this.format = format;\n  }\n\n  @Override\n  public String getAlgorithm() {\n    return algorithm;\n  }\n\n  @Override\n  public String getFormat() {\n    return format;\n  }\n\n  @Override\n  public byte[] getEncoded() {\n    return encoded;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof SignatureKeyImpl)) {\n      return false;\n    }\n    final SignatureKeyImpl that = (SignatureKeyImpl) obj;\n    return Objects.equals(id, that.id)\n        && Objects.equals(algorithm, that.algorithm)\n        && Objects.equals(format, that.format)\n        && Arrays.equals(encoded, that.encoded);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + Objects.hashCode(algorithm);\n    hash = 31 * hash + Objects.hashCode(format);\n    hash = 31 * hash + Arrays.hashCode(encoded);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"SignatureKeyImpl{\"\n        + \"id=\"\n        + id\n        + \", algorithm='\"\n        + algorithm\n        + '\\''\n        + \", format='\"\n        + format\n        + '\\''\n        + \", encoded=\"\n        + Arrays.toString(encoded)\n        + '}';\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/signature/model/impl/SignatureKeyPairImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server.signature.model.impl;\n\nimport java.security.PrivateKey;\nimport java.security.PublicKey;\nimport java.util.Objects;\nimport javax.persistence.CascadeType;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.NamedQueries;\nimport javax.persistence.NamedQuery;\nimport javax.persistence.OneToOne;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignatureKeyPair;\n\n/**\n * @author Anton Korneta\n */\n@Entity(name = \"SignKeyPair\")\n@Table(name = \"che_sign_key_pair\")\n@NamedQueries({\n  @NamedQuery(\n      name = \"SignKeyPair.getAll\",\n      query = \"SELECT kp FROM SignKeyPair kp WHERE kp.workspaceId = :workspaceId\"),\n})\npublic class SignatureKeyPairImpl implements SignatureKeyPair {\n\n  @Id\n  @Column(name = \"workspace_id\")\n  private String workspaceId;\n\n  @OneToOne\n  @JoinColumn(name = \"workspace_id\", insertable = false, updatable = false)\n  private WorkspaceImpl workspace;\n\n  @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)\n  @JoinColumn(name = \"public_key\")\n  private SignatureKeyImpl publicKey;\n\n  @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)\n  @JoinColumn(name = \"private_key\")\n  private SignatureKeyImpl privateKey;\n\n  public SignatureKeyPairImpl() {}\n\n  public SignatureKeyPairImpl(SignatureKeyPairImpl keyPair) {\n    this(keyPair.getWorkspaceId(), keyPair.getPublicKey(), keyPair.getPrivateKey());\n  }\n\n  public SignatureKeyPairImpl(String workspaceId, PublicKey publicKey, PrivateKey privateKey) {\n    this(workspaceId, new SignatureKeyImpl(publicKey), new SignatureKeyImpl(privateKey));\n  }\n\n  public SignatureKeyPairImpl(\n      String workspaceId, SignatureKeyImpl publicKey, SignatureKeyImpl privateKey) {\n    this.workspaceId = workspaceId;\n    this.publicKey = publicKey;\n    this.privateKey = privateKey;\n  }\n\n  @Override\n  public String getWorkspaceId() {\n    return workspaceId;\n  }\n\n  public void setWorkspaceId(String workspaceId) {\n    this.workspaceId = workspaceId;\n  }\n\n  @Override\n  public SignatureKeyImpl getPublicKey() {\n    return publicKey;\n  }\n\n  public void setPublicKey(SignatureKeyImpl publicKey) {\n    this.publicKey = publicKey;\n  }\n\n  @Override\n  public SignatureKeyImpl getPrivateKey() {\n    return privateKey;\n  }\n\n  public void setPrivateKey(SignatureKeyImpl privateKey) {\n    this.privateKey = privateKey;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof SignatureKeyPairImpl)) {\n      return false;\n    }\n    final SignatureKeyPairImpl that = (SignatureKeyPairImpl) obj;\n    return Objects.equals(workspaceId, that.workspaceId)\n        && Objects.equals(publicKey, that.publicKey)\n        && Objects.equals(privateKey, that.privateKey);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(workspaceId);\n    hash = 31 * hash + Objects.hashCode(publicKey);\n    hash = 31 * hash + Objects.hashCode(privateKey);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"SignatureKeyPairImpl{\"\n        + \"workspaceId='\"\n        + workspaceId\n        + '\\''\n        + \", publicKey=\"\n        + publicKey\n        + \", privateKey=\"\n        + privateKey\n        + '}';\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/main/java/org/eclipse/che/multiuser/machine/authentication/server/signature/spi/SignatureKeyDao.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server.signature.spi;\n\nimport com.google.common.annotations.Beta;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.model.impl.SignatureKeyPairImpl;\n\n/**\n * Defines data access object for {@link SignatureKeyPairImpl}.\n *\n * @author Anton Korneta\n */\n@Beta\npublic interface SignatureKeyDao {\n\n  /**\n   * Creates signature key pair.\n   *\n   * @param keyPair signature key pair to create\n   * @throws ConflictException when signature key pair with given id already exists\n   * @throws ServerException when any errors occur while creating signature key pair\n   */\n  SignatureKeyPairImpl create(SignatureKeyPairImpl keyPair)\n      throws ConflictException, ServerException;\n\n  /**\n   * Removes signature key pair with given workspace id.\n   *\n   * @param workspaceId workspace identifier to remove keypair from\n   * @throws ServerException when any errors occur while removing signature key pair\n   */\n  void remove(String workspaceId) throws ServerException;\n\n  /**\n   * Returns signature key pair for given workspace id.\n   *\n   * @param workspaceId identifier of workspace which key pair belongs to\n   * @return signature key pair for the given workspace\n   * @throws NotFoundException when any errors occur while fetching the key pairs\n   */\n  SignatureKeyPairImpl get(String workspaceId) throws NotFoundException, ServerException;\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/test/java/org/eclipse/che/multiuser/machine/authentication/server/MachineLoginFilterTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server;\n\nimport static io.jsonwebtoken.SignatureAlgorithm.RS512;\nimport static org.eclipse.che.multiuser.machine.authentication.shared.Constants.MACHINE_TOKEN_KIND;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.argThat;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.atLeastOnce;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.verifyNoMoreInteractions;\nimport static org.mockito.Mockito.when;\n\nimport io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.ClaimsBuilder;\nimport io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.impl.DefaultClaims;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport jakarta.servlet.http.HttpSession;\nimport java.security.KeyPair;\nimport java.security.KeyPairGenerator;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.user.server.UserManager;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.multiuser.api.authentication.commons.SessionStore;\nimport org.eclipse.che.multiuser.api.authentication.commons.token.RequestTokenExtractor;\nimport org.eclipse.che.multiuser.api.permission.server.PermissionChecker;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.SignatureKeyManager;\nimport org.eclipse.che.multiuser.machine.authentication.shared.Constants;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link MachineLoginFilter}.\n *\n * @author Anton Korneta\n */\n@Listeners(MockitoTestNGListener.class)\npublic class MachineLoginFilterTest {\n\n  private static final int KEY_SIZE = 2048;\n\n  private static final String REQUEST_SCHEME = \"https\";\n  private static final String SIGNATURE_ALGORITHM = \"RSA\";\n  private static final String WORKSPACE_ID = \"workspace31\";\n\n  private static final Subject SUBJECT =\n      new SubjectImpl(\"test_user\", Collections.emptyList(), \"test_user31\", \"userToken\", false);\n\n  private static final Map<String, Object> HEADER = new HashMap<>();\n  private static final ClaimsBuilder CLAIMS_BUILDER = Jwts.claims();\n\n  static {\n    HEADER.put(\"kind\", MACHINE_TOKEN_KIND);\n    CLAIMS_BUILDER.add(Constants.WORKSPACE_ID_CLAIM, WORKSPACE_ID);\n    CLAIMS_BUILDER.add(Constants.USER_ID_CLAIM, SUBJECT.getUserId());\n    CLAIMS_BUILDER.add(Constants.USER_NAME_CLAIM, SUBJECT.getUserName());\n    CLAIMS_BUILDER.add(Claims.ID, \"84123-132-fn31\");\n  }\n\n  @Mock private UserManager userManagerMock;\n  @Mock private RequestTokenExtractor tokenExtractorMock;\n  @Mock private SignatureKeyManager keyManagerMock;\n  @Mock private PermissionChecker permissionCheckerMock;\n  @Mock private FilterChain chainMock;\n  @Mock private HttpSession sessionMock;\n  @Mock private HttpServletResponse responseMock;\n\n  private MachineLoginFilter machineLoginFilter;\n\n  @BeforeMethod\n  private void setUp() throws Exception {\n    final User userMock = mock(User.class);\n    final KeyPairGenerator kpg = KeyPairGenerator.getInstance(SIGNATURE_ALGORITHM);\n    kpg.initialize(KEY_SIZE);\n    final KeyPair keyPair = kpg.generateKeyPair();\n    final String token =\n        Jwts.builder()\n            .setClaims(CLAIMS_BUILDER.build())\n            .setHeader(HEADER)\n            .signWith(RS512, keyPair.getPrivate())\n            .compact();\n    machineLoginFilter =\n        new MachineLoginFilter(\n            new SessionStore(),\n            tokenExtractorMock,\n            userManagerMock,\n            new MachineSigningKeyResolver(keyManagerMock),\n            permissionCheckerMock);\n\n    lenient().when(tokenExtractorMock.getToken(any(HttpServletRequest.class))).thenReturn(token);\n    lenient().when(keyManagerMock.getOrCreateKeyPair(eq(WORKSPACE_ID))).thenReturn(keyPair);\n\n    lenient().when(userMock.getName()).thenReturn(SUBJECT.getUserName());\n    lenient().when(userManagerMock.getById(SUBJECT.getUserId())).thenReturn(userMock);\n  }\n\n  @Test\n  public void testProcessRequestWithValidToken() throws Exception {\n    machineLoginFilter.doFilter(getRequestMock(), responseMock, chainMock);\n\n    verify(keyManagerMock, atLeastOnce()).getOrCreateKeyPair(eq(WORKSPACE_ID));\n    verify(userManagerMock).getById(anyString());\n    verifyNoMoreInteractions(responseMock);\n  }\n\n  @Test\n  public void testNotProceedRequestWhenSignatureCheckIsFailed() throws Exception {\n    final HttpServletRequest requestMock = getRequestMock();\n    final KeyPairGenerator kpg = KeyPairGenerator.getInstance(SIGNATURE_ALGORITHM);\n    kpg.initialize(KEY_SIZE);\n    final KeyPair pair = kpg.generateKeyPair();\n    when(keyManagerMock.getOrCreateKeyPair(eq(WORKSPACE_ID))).thenReturn(pair);\n\n    machineLoginFilter.doFilter(requestMock, responseMock, chainMock);\n\n    verify(tokenExtractorMock, atLeastOnce()).getToken(any(HttpServletRequest.class));\n    verify(responseMock)\n        .sendError(\n            401,\n            \"Machine token authentication failed: JWT signature does not match locally computed signature.\"\n                + \" JWT validity cannot be asserted and should not be trusted.\");\n  }\n\n  @Test\n  public void testNotProceedRequestWhenNoWorkspaceIdClaim() throws Exception {\n    final HttpServletRequest requestMock = getRequestMock();\n    final KeyPairGenerator kpg = KeyPairGenerator.getInstance(SIGNATURE_ALGORITHM);\n    kpg.initialize(KEY_SIZE);\n    final KeyPair pair = kpg.generateKeyPair();\n    final Claims badClaims =\n        new DefaultClaims(\n            Map.of(Constants.USER_ID_CLAIM, SUBJECT.getUserId(), Claims.ID, \"84123-132-fn31\"));\n    final String token =\n        Jwts.builder()\n            .setClaims(badClaims)\n            .setHeader(HEADER)\n            .signWith(RS512, pair.getPrivate())\n            .compact();\n    when(tokenExtractorMock.getToken(any(HttpServletRequest.class))).thenReturn(token);\n\n    machineLoginFilter.doFilter(requestMock, responseMock, chainMock);\n\n    verify(tokenExtractorMock, atLeastOnce()).getToken(any(HttpServletRequest.class));\n    verify(responseMock)\n        .sendError(\n            401,\n            \"Machine token authentication failed: Unable to fetch signature key pair: no workspace id present in token\");\n  }\n\n  @Test\n  public void testProceedRequestWhenEmptyTokenProvided() throws Exception {\n    final HttpServletRequest requestMock = getRequestMock();\n    when(tokenExtractorMock.getToken(any(HttpServletRequest.class))).thenReturn(null);\n\n    machineLoginFilter.doFilter(requestMock, responseMock, chainMock);\n\n    verify(tokenExtractorMock, atLeastOnce()).getToken(any(HttpServletRequest.class));\n    verify(chainMock).doFilter(requestMock, responseMock);\n    verifyNoMoreInteractions(keyManagerMock);\n    verifyNoMoreInteractions(userManagerMock);\n    verifyNoMoreInteractions(responseMock);\n  }\n\n  @Test\n  public void testSetErrorInResponseWhenNoUserFoundForProvidedToken() throws Exception {\n    when(userManagerMock.getById(anyString())).thenThrow(new NotFoundException(\"User not found\"));\n\n    machineLoginFilter.doFilter(getRequestMock(), responseMock, chainMock);\n\n    verify(keyManagerMock, atLeastOnce()).getOrCreateKeyPair(eq(WORKSPACE_ID));\n    verify(userManagerMock).getById(anyString());\n    verify(responseMock)\n        .sendError(401, \"Machine token authentication failed: Corresponding user doesn't exist.\");\n  }\n\n  @Test\n  public void testSetErrorInResponseWhenUnableToGetUserForProvidedToken() throws Exception {\n    when(userManagerMock.getById(anyString())).thenThrow(new ServerException(\"err\"));\n\n    machineLoginFilter.doFilter(getRequestMock(), responseMock, chainMock);\n\n    verify(keyManagerMock, atLeastOnce()).getOrCreateKeyPair(eq(WORKSPACE_ID));\n    verify(userManagerMock).getById(anyString());\n    verify(responseMock)\n        .sendError(eq(401), argThat(s -> s.startsWith(\"Machine token authentication failed:\")));\n  }\n\n  private HttpServletRequest getRequestMock() {\n    final HttpServletRequest request = mock(HttpServletRequest.class);\n    lenient().when(request.getSession(true)).thenReturn(sessionMock);\n    lenient().when(request.getScheme()).thenReturn(REQUEST_SCHEME);\n    return request;\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/test/java/org/eclipse/che/multiuser/machine/authentication/server/signature/SignatureKeyManagerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.server.signature;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\n\nimport java.security.Key;\nimport java.security.KeyPair;\nimport java.security.KeyPairGenerator;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.core.notification.EventSubscriber;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.model.impl.SignatureKeyImpl;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.model.impl.SignatureKeyPairImpl;\nimport org.eclipse.che.multiuser.machine.authentication.server.signature.spi.SignatureKeyDao;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link SignatureKeyManager}.\n *\n * @author Anton Korneta\n */\n@Listeners(MockitoTestNGListener.class)\npublic class SignatureKeyManagerTest {\n\n  private static final int KEY_SIZE = 512;\n  private static final String ALGORITHM = \"RSA\";\n\n  @Mock SignatureKeyDao signatureKeyDao;\n  @Mock EventService eventService;\n\n  @Captor private ArgumentCaptor<EventSubscriber<WorkspaceStatusEvent>> captor;\n\n  private KeyPairGenerator kpg;\n  private SignatureKeyManager signatureKeyManager;\n\n  @BeforeMethod\n  public void createEntities() throws Exception {\n    kpg = KeyPairGenerator.getInstance(ALGORITHM);\n    kpg.initialize(KEY_SIZE);\n    signatureKeyManager =\n        new SignatureKeyManager(KEY_SIZE, ALGORITHM, eventService, signatureKeyDao);\n  }\n\n  @Test\n  public void shouldRemoveKeyPairOnWorkspaceStop() throws Exception {\n    final String wsId = \"ws123\";\n    signatureKeyManager.subscribe();\n    verify(eventService).subscribe(captor.capture());\n    final EventSubscriber<WorkspaceStatusEvent> subscriber = captor.getValue();\n\n    subscriber.onEvent(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withStatus(WorkspaceStatus.STOPPED)\n            .withWorkspaceId(wsId));\n\n    verify(signatureKeyDao, times(1)).remove(eq(wsId));\n  }\n\n  @Test(expectedExceptions = SignatureKeyManagerException.class)\n  public void shouldThrowsExceptionWhenAlgorithmIsNotSupported() throws Exception {\n    final SignatureKeyImpl publicKey = new SignatureKeyImpl(new byte[] {}, \"ECDH\", \"PKCS#15\");\n    final SignatureKeyImpl privateKey = new SignatureKeyImpl(new byte[] {}, \"ECDH\", \"PKCS#3\");\n    final SignatureKeyPairImpl kp = new SignatureKeyPairImpl(\"id_\" + 1, publicKey, privateKey);\n    doReturn(kp).when(signatureKeyDao).get(anyString());\n\n    signatureKeyManager.getOrCreateKeyPair(\"ws1\");\n\n    verify(signatureKeyDao).get(anyString());\n  }\n\n  @Test\n  public void shouldReturnSignatureKeys() throws Exception {\n    String wsId = \"WS_id_1\";\n    final SignatureKeyPairImpl kp = newKeyPair(wsId);\n    when(signatureKeyDao.get(anyString())).thenReturn(kp);\n\n    final KeyPair cachedPair = signatureKeyManager.getOrCreateKeyPair(wsId);\n\n    assertNotNull(cachedPair);\n    assertKeys(cachedPair.getPublic(), kp.getPublicKey());\n    assertKeys(cachedPair.getPrivate(), kp.getPrivateKey());\n  }\n\n  private SignatureKeyPairImpl newKeyPair(String id) {\n    final KeyPair pair = kpg.generateKeyPair();\n    return new SignatureKeyPairImpl(id, pair.getPublic(), pair.getPrivate());\n  }\n\n  private static void assertKeys(Key key, SignatureKey signatureKey) {\n    assertEquals(key.getAlgorithm(), signatureKey.getAlgorithm());\n    assertEquals(key.getEncoded(), signatureKey.getEncoded());\n    assertEquals(key.getFormat(), signatureKey.getFormat());\n  }\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/test/resources/META-INF/services/org.eclipse.che.commons.test.tck.TckModule",
    "content": "org.eclipse.che.multiuser.machine.authentication.server.signature.jpa.SignatureKeyTckModule\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2025 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication-shared/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-multiuser-machine-auth</artifactId>\n        <groupId>org.eclipse.che.multiuser</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-multiuser-machine-authentication-shared</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Multiuser :: Machine Authentication Shared</name>\n    <dependencies>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication-shared/src/main/java/org/eclipse/che/multiuser/machine/authentication/shared/Constants.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.shared;\n\n/**\n * @author Anton Korneta\n */\npublic class Constants {\n\n  public static final String USER_ID_CLAIM = \"uid\";\n  public static final String USER_NAME_CLAIM = \"uname\";\n  public static final String WORKSPACE_ID_CLAIM = \"wsid\";\n\n  public static final String MACHINE_TOKEN_KIND = \"machine_token\";\n\n  public static final String SIGNATURE_ALGORITHM_ENV = \"CHE_MACHINE_AUTH_SIGNATURE__ALGORITHM\";\n  public static final String SIGNATURE_PUBLIC_KEY_ENV = \"CHE_MACHINE_AUTH_SIGNATURE__PUBLIC__KEY\";\n\n  private Constants() {}\n}\n"
  },
  {
    "path": "multiuser/machine-auth/che-multiuser-machine-authentication-shared/src/main/java/org/eclipse/che/multiuser/machine/authentication/shared/dto/MachineTokenDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.machine.authentication.shared.dto;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Representation of machine token, that needed for communication between workspace master and\n * workspace agents.\n *\n * @author Max Shaposhnik (mshaposhnik@codenvy.com)\n */\n@DTO\npublic interface MachineTokenDto {\n\n  String getUserId();\n\n  void setUserId(String userId);\n\n  MachineTokenDto withUserId(String userId);\n\n  String getWorkspaceId();\n\n  void setWorkspaceId(String workspaceId);\n\n  MachineTokenDto withWorkspaceId(String workspaceId);\n\n  String getMachineToken();\n\n  void setMachineToken(String machineToken);\n\n  MachineTokenDto withMachineToken(String machineToken);\n}\n"
  },
  {
    "path": "multiuser/machine-auth/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-multiuser-parent</artifactId>\n        <groupId>org.eclipse.che.multiuser</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n        <relativePath>../pom.xml</relativePath>\n    </parent>\n    <artifactId>che-multiuser-machine-auth</artifactId>\n    <packaging>pom</packaging>\n    <name>Che Multiuser :: Machine Auth Parent</name>\n    <modules>\n        <module>che-multiuser-machine-authentication-shared</module>\n        <module>che-multiuser-machine-authentication</module>\n    </modules>\n</project>\n"
  },
  {
    "path": "multiuser/oidc/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-multiuser-parent</artifactId>\n        <groupId>org.eclipse.che.multiuser</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-multiuser-oidc</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Multiuser :: OIDC</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.auth0</groupId>\n            <artifactId>jwks-rsa</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.jsonwebtoken</groupId>\n            <artifactId>jjwt-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-inject</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-authentication-commons</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.multiuser</groupId>\n            <artifactId>che-multiuser-api-authorization</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "multiuser/oidc/src/main/java/org/eclipse/che/multiuser/oidc/OIDCInfo.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.oidc;\n\nimport java.util.Optional;\nimport java.util.StringJoiner;\n\n/** OIDCInfo - POJO object to store information about OIDC api. */\npublic class OIDCInfo {\n\n  private final String tokenPublicEndpoint;\n  private final String endSessionPublicEndpoint;\n  private final String userInfoPublicEndpoint;\n  private final String userInfoInternalEndpoint;\n  private final String jwksPublicUri;\n  private final String jwksInternalUri;\n  private final String authServerURL;\n  private final String authServerPublicURL;\n\n  public OIDCInfo(\n      String tokenPublicEndpoint,\n      String endSessionPublicEndpoint,\n      String userInfoPublicEndpoint,\n      String userInfoInternalEndpoint,\n      String jwksPublicUri,\n      String jwksInternalUri,\n      String authServerURL,\n      String authServerPublicURL) {\n    this.tokenPublicEndpoint = tokenPublicEndpoint;\n    this.endSessionPublicEndpoint = endSessionPublicEndpoint;\n    this.userInfoPublicEndpoint = userInfoPublicEndpoint;\n    this.userInfoInternalEndpoint = userInfoInternalEndpoint;\n    this.jwksPublicUri = jwksPublicUri;\n    this.jwksInternalUri = jwksInternalUri;\n    this.authServerURL = authServerURL;\n    this.authServerPublicURL = authServerPublicURL;\n  }\n\n  /**\n   * @return public url to retrieve token\n   */\n  public String getTokenPublicEndpoint() {\n    return tokenPublicEndpoint;\n  }\n\n  /**\n   * @return public url to get user profile information.\n   */\n  public String getUserInfoPublicEndpoint() {\n    return userInfoPublicEndpoint;\n  }\n\n  /**\n   * @return internal network url to get user profile information.\n   */\n  public String getUserInfoInternalEndpoint() {\n    return userInfoInternalEndpoint;\n  }\n\n  /**\n   * @return public url to retrieve JWK public key for token validation.\n   */\n  public String getJwksPublicUri() {\n    return jwksPublicUri;\n  }\n\n  /**\n   * @return internal network url to retrieve JWK public key for token validation.\n   */\n  public String getJwksInternalUri() {\n    return jwksInternalUri;\n  }\n\n  /**\n   * @return OIDC auth endpoint url. Url will be internal if internal network enabled, otherwise url\n   *     will be public.\n   */\n  public String getAuthServerURL() {\n    return authServerURL;\n  }\n\n  /**\n   * @return public OIDC auth endpoint url.\n   */\n  public String getAuthServerPublicURL() {\n    return authServerPublicURL;\n  }\n\n  @Override\n  public String toString() {\n    return new StringJoiner(\", \", OIDCInfo.class.getSimpleName() + \"[\", \"]\")\n        .add(\"tokenPublicEndpoint='\" + tokenPublicEndpoint + \"'\")\n        .add(\"userInfoPublicEndpoint='\" + userInfoPublicEndpoint + \"'\")\n        .add(\"userInfoInternalEndpoint='\" + userInfoInternalEndpoint + \"'\")\n        .add(\"jwksPublicUri='\" + jwksPublicUri + \"'\")\n        .add(\"jwksInternalUri='\" + jwksInternalUri + \"'\")\n        .add(\"authServerURL='\" + authServerURL + \"'\")\n        .add(\"authServerPublicURL='\" + authServerPublicURL + \"'\")\n        .toString();\n  }\n\n  public Optional<String> getEndSessionPublicEndpoint() {\n    return Optional.ofNullable(endSessionPublicEndpoint);\n  }\n}\n"
  },
  {
    "path": "multiuser/oidc/src/main/java/org/eclipse/che/multiuser/oidc/OIDCInfoProvider.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.oidc;\n\nimport static com.google.common.base.MoreObjects.firstNonNull;\n\nimport com.fasterxml.jackson.core.JsonFactory;\nimport com.fasterxml.jackson.core.JsonParser;\nimport com.fasterxml.jackson.core.type.TypeReference;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URL;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Provider;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.proxy.ProxyAuthenticator;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * OIDCInfoProvider retrieves OpenID Connect (OIDC) configuration for well-known endpoint. This\n * information is useful to provide access to the OIDC api.\n */\npublic class OIDCInfoProvider implements Provider<OIDCInfo> {\n  private static final Logger LOG = LoggerFactory.getLogger(OIDCInfoProvider.class);\n\n  private static final String OIDC_SETTING_PREFIX = \"che.oidc.\";\n\n  public static final String AUTH_SERVER_URL_SETTING = OIDC_SETTING_PREFIX + \"auth_server_url\";\n  public static final String AUTH_SERVER_URL_INTERNAL_SETTING =\n      OIDC_SETTING_PREFIX + \"auth_internal_server_url\";\n  public static final String OIDC_PROVIDER_SETTING = OIDC_SETTING_PREFIX + \"oidc_provider\";\n  public static final String OIDC_USERNAME_CLAIM_SETTING = OIDC_SETTING_PREFIX + \"username_claim\";\n  public static final String OIDC_USERNAME_PREFIX_SETTING = OIDC_SETTING_PREFIX + \"username_prefix\";\n  public static final String OIDC_EMAIL_CLAIM_SETTING = OIDC_SETTING_PREFIX + \"email_claim\";\n  public static final String OIDC_GROUPS_CLAIM_SETTING = OIDC_SETTING_PREFIX + \"groups_claim\";\n  public static final String OIDC_GROUP_PREFIX_SETTING = OIDC_SETTING_PREFIX + \"group_prefix\";\n  public static final String OIDC_ALLOWED_CLOCK_SKEW_SEC =\n      OIDC_SETTING_PREFIX + \"allowed_clock_skew_sec\";\n\n  protected String serverURL;\n  protected String serverInternalURL;\n  protected String oidcProviderUrl;\n\n  @Inject\n  public OIDCInfoProvider(\n      @Nullable @Named(AUTH_SERVER_URL_SETTING) String serverURL,\n      @Nullable @Named(AUTH_SERVER_URL_INTERNAL_SETTING) String serverInternalURL,\n      @Nullable @Named(OIDC_PROVIDER_SETTING) String oidcProviderUrl) {\n    this.serverURL = serverURL;\n    this.serverInternalURL = serverInternalURL;\n    this.oidcProviderUrl = oidcProviderUrl;\n  }\n\n  /**\n   * @return OIDCInfo with OIDC settings information.\n   */\n  @Override\n  public OIDCInfo get() {\n    this.validate();\n\n    String serverAuthUrl = (serverInternalURL != null) ? serverInternalURL : serverURL;\n    String wellKnownEndpoint = this.getWellKnownEndpoint(serverAuthUrl);\n\n    LOG.info(\"Retrieving OpenId configuration from endpoint: {}\", wellKnownEndpoint);\n    ProxyAuthenticator.initAuthenticator(wellKnownEndpoint);\n    try (InputStream inputStream = new URL(wellKnownEndpoint).openStream()) {\n      final JsonParser parser = new JsonFactory().createParser(inputStream);\n      final TypeReference<Map<String, Object>> typeReference = new TypeReference<>() {};\n\n      Map<String, Object> openIdConfiguration =\n          new ObjectMapper().reader().readValue(parser, typeReference);\n\n      LOG.info(\"openid configuration = {}\", openIdConfiguration);\n\n      String tokenPublicEndPoint = setPublicUrl((String) openIdConfiguration.get(\"token_endpoint\"));\n      String userInfoPublicEndpoint =\n          setPublicUrl((String) openIdConfiguration.get(\"userinfo_endpoint\"));\n      String endSessionPublicEndpoint =\n          openIdConfiguration.containsKey(\"end_session_endpoint\")\n              ? setPublicUrl((String) openIdConfiguration.get(\"end_session_endpoint\"))\n              : null;\n      String jwksPublicUri = setPublicUrl((String) openIdConfiguration.get(\"jwks_uri\"));\n      String jwksInternalUri = setInternalUrl(jwksPublicUri);\n      String userInfoInternalEndpoint = setInternalUrl(userInfoPublicEndpoint);\n\n      return new OIDCInfo(\n          tokenPublicEndPoint,\n          endSessionPublicEndpoint,\n          userInfoPublicEndpoint,\n          userInfoInternalEndpoint,\n          jwksPublicUri,\n          jwksInternalUri,\n          serverAuthUrl,\n          serverURL);\n    } catch (IOException e) {\n      throw new RuntimeException(\n          \"Exception while retrieving OpenId configuration from endpoint: \" + wellKnownEndpoint, e);\n    } finally {\n      ProxyAuthenticator.resetAuthenticator();\n    }\n  }\n\n  private String getWellKnownEndpoint(String serverAuthUrl) {\n    String wellKnownEndpoint = firstNonNull(oidcProviderUrl, constructServerAuthUrl(serverAuthUrl));\n    if (!wellKnownEndpoint.endsWith(\"/\")) {\n      wellKnownEndpoint = wellKnownEndpoint + \"/\";\n    }\n    wellKnownEndpoint += \".well-known/openid-configuration\";\n    return wellKnownEndpoint;\n  }\n\n  protected String constructServerAuthUrl(String serverAuthUrl) {\n    return serverAuthUrl;\n  }\n\n  protected void validate() {\n    if (serverURL == null && serverInternalURL == null && oidcProviderUrl == null) {\n      throw new RuntimeException(\n          \"Either the '\"\n              + AUTH_SERVER_URL_SETTING\n              + \"' or '\"\n              + AUTH_SERVER_URL_INTERNAL_SETTING\n              + \"' or '\"\n              + OIDC_PROVIDER_SETTING\n              + \"' property should be set\");\n    }\n  }\n\n  private String setInternalUrl(String endpointUrl) {\n    if (serverURL != null && serverInternalURL != null) {\n      return endpointUrl.replace(serverURL, serverInternalURL);\n    }\n    return null;\n  }\n\n  private String setPublicUrl(String endpointUrl) {\n    if (serverURL != null && serverInternalURL != null) {\n      return endpointUrl.replace(serverInternalURL, serverURL);\n    }\n    return endpointUrl;\n  }\n}\n"
  },
  {
    "path": "multiuser/oidc/src/main/java/org/eclipse/che/multiuser/oidc/OIDCJwkProvider.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.oidc;\n\nimport com.auth0.jwk.GuavaCachedJwkProvider;\nimport com.auth0.jwk.JwkProvider;\nimport com.auth0.jwk.UrlJwkProvider;\nimport com.google.common.base.Strings;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport org.eclipse.che.inject.ConfigurationException;\n\n/** Constructs {@link UrlJwkProvider} based on Jwk endpoint from keycloak settings */\npublic class OIDCJwkProvider implements Provider<JwkProvider> {\n\n  private final JwkProvider jwkProvider;\n\n  @Inject\n  public OIDCJwkProvider(OIDCInfo oidcInfo) throws MalformedURLException {\n    final String jwksUrl =\n        Strings.isNullOrEmpty(oidcInfo.getJwksInternalUri())\n            ? oidcInfo.getJwksPublicUri()\n            : oidcInfo.getJwksInternalUri();\n\n    if (jwksUrl == null) {\n      throw new ConfigurationException(\"Jwks endpoint url not found in keycloak settings\");\n    }\n    this.jwkProvider = new GuavaCachedJwkProvider(new UrlJwkProvider(new URL(jwksUrl)));\n  }\n\n  @Override\n  public JwkProvider get() {\n    return jwkProvider;\n  }\n}\n"
  },
  {
    "path": "multiuser/oidc/src/main/java/org/eclipse/che/multiuser/oidc/OIDCJwtParserProvider.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.oidc;\n\nimport static org.eclipse.che.multiuser.oidc.OIDCInfoProvider.OIDC_ALLOWED_CLOCK_SKEW_SEC;\n\nimport io.jsonwebtoken.JwtParser;\nimport io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.SigningKeyResolver;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\n\n/** Provides instance of {@link JwtParser} */\n@Singleton\npublic class OIDCJwtParserProvider implements Provider<JwtParser> {\n  private final JwtParser jwtParser;\n\n  @Inject\n  public OIDCJwtParserProvider(\n      @Named(OIDC_ALLOWED_CLOCK_SKEW_SEC) long allowedClockSkewSec,\n      SigningKeyResolver signingKeyResolver) {\n    this.jwtParser =\n        Jwts.parser()\n            .setSigningKeyResolver(signingKeyResolver)\n            .setAllowedClockSkewSeconds(allowedClockSkewSec)\n            .build();\n  }\n\n  @Override\n  public JwtParser get() {\n    return jwtParser;\n  }\n}\n"
  },
  {
    "path": "multiuser/oidc/src/main/java/org/eclipse/che/multiuser/oidc/OIDCSigningKeyResolver.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.oidc;\n\nimport com.auth0.jwk.JwkException;\nimport com.auth0.jwk.JwkProvider;\nimport io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.JwsHeader;\nimport io.jsonwebtoken.JwtException;\nimport io.jsonwebtoken.SigningKeyResolverAdapter;\nimport java.security.Key;\nimport java.security.PublicKey;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Resolves signing key based on id from JWT header */\n@Singleton\npublic class OIDCSigningKeyResolver extends SigningKeyResolverAdapter {\n\n  private final JwkProvider jwkProvider;\n\n  private static final Logger LOG = LoggerFactory.getLogger(OIDCSigningKeyResolver.class);\n\n  @Inject\n  protected OIDCSigningKeyResolver(JwkProvider jwkProvider) {\n    this.jwkProvider = jwkProvider;\n  }\n\n  @Override\n  public Key resolveSigningKey(JwsHeader header, byte[] content) {\n    return getJwtPublicKey(header);\n  }\n\n  @Override\n  public Key resolveSigningKey(JwsHeader header, Claims claims) {\n    return getJwtPublicKey(header);\n  }\n\n  protected synchronized PublicKey getJwtPublicKey(JwsHeader header) {\n    String kid = header.getKeyId();\n    if (kid == null) {\n      LOG.warn(\n          \"'kid' is missing in the JWT token header. This is not possible to validate the token with OIDC provider keys\");\n      throw new JwtException(\"'kid' is missing in the JWT token header.\");\n    }\n    try {\n      return jwkProvider.get(kid).getPublicKey();\n    } catch (JwkException e) {\n      throw new JwtException(\n          \"Error during the retrieval of the public key during JWT token validation\", e);\n    }\n  }\n}\n"
  },
  {
    "path": "multiuser/oidc/src/main/java/org/eclipse/che/multiuser/oidc/filter/OidcTokenInitializationFilter.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.oidc.filter;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.multiuser.oidc.OIDCInfoProvider.OIDC_EMAIL_CLAIM_SETTING;\nimport static org.eclipse.che.multiuser.oidc.OIDCInfoProvider.OIDC_GROUPS_CLAIM_SETTING;\nimport static org.eclipse.che.multiuser.oidc.OIDCInfoProvider.OIDC_GROUP_PREFIX_SETTING;\nimport static org.eclipse.che.multiuser.oidc.OIDCInfoProvider.OIDC_USERNAME_CLAIM_SETTING;\nimport static org.eclipse.che.multiuser.oidc.OIDCInfoProvider.OIDC_USERNAME_PREFIX_SETTING;\n\nimport io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.Jws;\nimport io.jsonwebtoken.JwtParser;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.multiuser.api.authentication.commons.SessionStore;\nimport org.eclipse.che.multiuser.api.authentication.commons.filter.MultiUserEnvironmentInitializationFilter;\nimport org.eclipse.che.multiuser.api.authentication.commons.token.RequestTokenExtractor;\nimport org.eclipse.che.multiuser.api.permission.server.AuthorizedSubject;\nimport org.eclipse.che.multiuser.api.permission.server.PermissionChecker;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * This filter uses given token directly. It's used for native Kubernetes user authentication.\n * Requests without token or with invalid token are rejected.\n *\n * <p>It also makes sure that User is present in Che database. If not, it will create the User from\n * JWT token claims. The username claim is configured with {@link\n * org.eclipse.che.multiuser.oidc.OIDCInfoProvider#OIDC_USERNAME_CLAIM_SETTING}. The email claim is\n * configured with {@link org.eclipse.che.multiuser.oidc.OIDCInfoProvider#OIDC_EMAIL_CLAIM_SETTING}.\n */\n@Singleton\npublic class OidcTokenInitializationFilter\n    extends MultiUserEnvironmentInitializationFilter<Jws<Claims>> {\n  private static final Logger LOG = LoggerFactory.getLogger(OidcTokenInitializationFilter.class);\n\n  private static final String EMAIL_CLAIM = \"email\";\n  private static final String NAME_CLAIM = \"name\";\n  private static final String GROUPS_CLAIM = \"groups\";\n  protected static final String DEFAULT_USERNAME_CLAIM = NAME_CLAIM;\n  protected static final String DEFAULT_EMAIL_CLAIM = EMAIL_CLAIM;\n  protected static final String DEFAULT_GROUPS_CLAIM = GROUPS_CLAIM;\n\n  private final JwtParser jwtParser;\n  private final PermissionChecker permissionChecker;\n  private final String usernameClaim;\n  private final String usernamePrefix;\n  private final String groupsClaim;\n  private final String groupPrefix;\n  private final String emailClaim;\n\n  @Inject\n  public OidcTokenInitializationFilter(\n      PermissionChecker permissionChecker,\n      JwtParser jwtParser,\n      SessionStore sessionStore,\n      RequestTokenExtractor tokenExtractor,\n      @Nullable @Named(OIDC_USERNAME_CLAIM_SETTING) String usernameClaim,\n      @Nullable @Named(OIDC_USERNAME_PREFIX_SETTING) String usernamePrefix,\n      @Nullable @Named(OIDC_GROUPS_CLAIM_SETTING) String groupsClaim,\n      @Nullable @Named(OIDC_GROUP_PREFIX_SETTING) String groupPrefix,\n      @Nullable @Named(OIDC_EMAIL_CLAIM_SETTING) String emailClaim) {\n    super(sessionStore, tokenExtractor);\n    this.permissionChecker = permissionChecker;\n    this.jwtParser = jwtParser;\n    this.emailClaim = isNullOrEmpty(emailClaim) ? DEFAULT_EMAIL_CLAIM : emailClaim;\n    this.usernameClaim = isNullOrEmpty(usernameClaim) ? DEFAULT_USERNAME_CLAIM : usernameClaim;\n    this.usernamePrefix = isNullOrEmpty(usernamePrefix) ? \"\" : usernamePrefix;\n    this.groupsClaim = isNullOrEmpty(groupsClaim) ? DEFAULT_GROUPS_CLAIM : groupsClaim;\n    this.groupPrefix = isNullOrEmpty(groupPrefix) ? \"\" : groupPrefix;\n  }\n\n  @Override\n  protected Optional<Jws<Claims>> processToken(String token) {\n    return Optional.ofNullable(jwtParser.parseClaimsJws(token));\n  }\n\n  @Override\n  protected String getUserId(Jws<Claims> processedToken) {\n    return processedToken.getBody().getSubject();\n  }\n\n  @Override\n  protected Subject extractSubject(String token, Jws<Claims> processedToken) {\n    Claims claims = processedToken.getBody();\n    String email = claims.get(emailClaim, String.class);\n    String username = usernamePrefix + claims.get(usernameClaim, String.class);\n\n    List<String> groups = new ArrayList<>();\n    Object groupClaim = claims.get(this.groupsClaim);\n    if (groupClaim != null) {\n      if (groupClaim instanceof Iterable) {\n        for (Object group : ((Iterable<?>) groupClaim)) {\n          groups.add(groupPrefix + group);\n        }\n      } else if (groupClaim instanceof String) {\n        groups.add(groupPrefix + groupClaim);\n      } else {\n        LOG.warn(\n            \"Groups claim '{}' is not a String or Iterable, skipping groups\", this.groupsClaim);\n      }\n    }\n\n    return new AuthorizedSubject(\n        new SubjectImpl(username, groups, claims.getSubject(), token, false), permissionChecker);\n  }\n}\n"
  },
  {
    "path": "multiuser/oidc/src/test/java/org/eclipse/che/multiuser/oidc/filter/OidcTokenInitializationFilterTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.multiuser.oidc.filter;\n\nimport static org.eclipse.che.multiuser.oidc.filter.OidcTokenInitializationFilter.DEFAULT_EMAIL_CLAIM;\nimport static org.eclipse.che.multiuser.oidc.filter.OidcTokenInitializationFilter.DEFAULT_GROUPS_CLAIM;\nimport static org.eclipse.che.multiuser.oidc.filter.OidcTokenInitializationFilter.DEFAULT_USERNAME_CLAIM;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.Jws;\nimport io.jsonwebtoken.JwtParser;\nimport java.util.Arrays;\nimport java.util.List;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.multiuser.api.authentication.commons.SessionStore;\nimport org.eclipse.che.multiuser.api.authentication.commons.token.RequestTokenExtractor;\nimport org.eclipse.che.multiuser.api.permission.server.PermissionChecker;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class OidcTokenInitializationFilterTest {\n\n  @Mock private PermissionChecker permissionsChecker;\n  @Mock private JwtParser jwtParser;\n  @Mock private SessionStore sessionStore;\n  @Mock private RequestTokenExtractor tokenExtractor;\n  private final String usernameClaim = \"userClaim\";\n  private final String usernamePrefix = \"oidc-user:\";\n  private final String groupsClaim = \"groupClaim\";\n  private final String groupPrefix = \"oidc-group:\";\n  private final String emailClaim = \"emailClaim\";\n  private final String TEST_USERNAME = \"jondoe\";\n  private final String TEST_USER_EMAIL = \"jon@doe\";\n  private final String TEST_USERID = \"jon1337\";\n  private final List<String> TEST_GROUPS = Arrays.asList(\"group1\", \"group2\");\n  private final String TEST_TOKEN = \"abcToken\";\n\n  @Mock private Jws<Claims> jwsClaims;\n  @Mock private Claims claims;\n\n  OidcTokenInitializationFilter tokenInitializationFilter;\n\n  @BeforeMethod\n  public void setUp() {\n    tokenInitializationFilter =\n        new OidcTokenInitializationFilter(\n            permissionsChecker,\n            jwtParser,\n            sessionStore,\n            tokenExtractor,\n            usernameClaim,\n            usernamePrefix,\n            groupsClaim,\n            groupPrefix,\n            emailClaim);\n\n    lenient().when(jwsClaims.getBody()).thenReturn(claims);\n    lenient().when(claims.getSubject()).thenReturn(TEST_USERID);\n    lenient().when(claims.get(emailClaim, String.class)).thenReturn(TEST_USER_EMAIL);\n    lenient().when(claims.get(usernameClaim, String.class)).thenReturn(TEST_USERNAME);\n    lenient().when(claims.get(groupsClaim)).thenReturn(TEST_GROUPS);\n  }\n\n  @Test\n  public void testProcessToken() {\n    when(jwtParser.parseClaimsJws(TEST_TOKEN)).thenReturn(jwsClaims);\n\n    var returnedClaims = tokenInitializationFilter.processToken(TEST_TOKEN).get();\n\n    assertEquals(returnedClaims, jwsClaims);\n    verify(jwtParser).parseClaimsJws(TEST_TOKEN);\n  }\n\n  @Test\n  public void testProcessEmptyToken() {\n    var returnedClaims = tokenInitializationFilter.processToken(\"\");\n\n    assertTrue(returnedClaims.isEmpty());\n  }\n\n  @Test\n  public void testGetUserId() {\n    var userId = tokenInitializationFilter.getUserId(jwsClaims);\n\n    assertEquals(userId, TEST_USERID);\n  }\n\n  @Test\n  public void testExtractSubject() throws ServerException, ConflictException {\n    var subject = tokenInitializationFilter.extractSubject(TEST_TOKEN, jwsClaims);\n\n    assertEquals(subject.getUserId(), TEST_USERID);\n    assertEquals(subject.getUserName(), usernamePrefix + TEST_USERNAME);\n    assertEquals(subject.getGroups(), Arrays.asList(\"oidc-group:group1\", \"oidc-group:group2\"));\n    assertEquals(subject.getToken(), TEST_TOKEN);\n  }\n\n  @Test(dataProvider = \"usernameClaims\")\n  public void testDefaultUsernameClaimWhenEmpty(String customUsernameClaim)\n      throws ServerException, ConflictException {\n    tokenInitializationFilter =\n        new OidcTokenInitializationFilter(\n            permissionsChecker,\n            jwtParser,\n            sessionStore,\n            tokenExtractor,\n            customUsernameClaim,\n            usernamePrefix,\n            groupsClaim,\n            groupPrefix,\n            emailClaim);\n    when(claims.get(DEFAULT_USERNAME_CLAIM, String.class)).thenReturn(TEST_USERNAME);\n\n    var subject = tokenInitializationFilter.extractSubject(TEST_TOKEN, jwsClaims);\n\n    assertEquals(subject.getUserId(), TEST_USERID);\n    assertEquals(subject.getUserName(), usernamePrefix + TEST_USERNAME);\n    assertEquals(subject.getGroups(), Arrays.asList(\"oidc-group:group1\", \"oidc-group:group2\"));\n    assertEquals(subject.getToken(), TEST_TOKEN);\n    verify(claims).get(DEFAULT_USERNAME_CLAIM, String.class);\n    verify(claims, never()).get(usernameClaim, String.class);\n  }\n\n  @Test(dataProvider = \"emailClaims\")\n  public void testDefaultEmailClaimWhenEmpty(String customEmailClaim)\n      throws ServerException, ConflictException {\n    tokenInitializationFilter =\n        new OidcTokenInitializationFilter(\n            permissionsChecker,\n            jwtParser,\n            sessionStore,\n            tokenExtractor,\n            usernameClaim,\n            usernamePrefix,\n            groupsClaim,\n            groupPrefix,\n            customEmailClaim);\n    when(claims.get(DEFAULT_EMAIL_CLAIM, String.class)).thenReturn(TEST_USER_EMAIL);\n\n    var subject = tokenInitializationFilter.extractSubject(TEST_TOKEN, jwsClaims);\n\n    assertEquals(subject.getUserId(), TEST_USERID);\n    assertEquals(subject.getUserName(), usernamePrefix + TEST_USERNAME);\n    assertEquals(subject.getToken(), TEST_TOKEN);\n    assertEquals(subject.getGroups(), Arrays.asList(\"oidc-group:group1\", \"oidc-group:group2\"));\n    verify(claims).get(DEFAULT_EMAIL_CLAIM, String.class);\n    verify(claims, never()).get(emailClaim, String.class);\n  }\n\n  @Test(dataProvider = \"groupsClaims\")\n  public void testDefaultGroupClaimWhenEmpty(String customGroupsClaim)\n      throws ServerException, ConflictException {\n    tokenInitializationFilter =\n        new OidcTokenInitializationFilter(\n            permissionsChecker,\n            jwtParser,\n            sessionStore,\n            tokenExtractor,\n            usernameClaim,\n            usernamePrefix,\n            customGroupsClaim,\n            groupPrefix,\n            emailClaim);\n    when(claims.get(DEFAULT_GROUPS_CLAIM)).thenReturn(TEST_GROUPS);\n\n    var subject = tokenInitializationFilter.extractSubject(TEST_TOKEN, jwsClaims);\n\n    assertEquals(subject.getUserId(), TEST_USERID);\n    assertEquals(subject.getUserName(), usernamePrefix + TEST_USERNAME);\n    assertEquals(subject.getGroups(), Arrays.asList(\"oidc-group:group1\", \"oidc-group:group2\"));\n    assertEquals(subject.getToken(), TEST_TOKEN);\n    verify(claims).get(DEFAULT_GROUPS_CLAIM);\n    verify(claims, never()).get(groupsClaim);\n  }\n\n  @DataProvider\n  public static Object[][] usernameClaims() {\n    return new Object[][] {{\"\"}, {null}};\n  }\n\n  @DataProvider\n  public static Object[][] groupsClaims() {\n    return new Object[][] {{\"\"}, {null}};\n  }\n\n  @DataProvider\n  public static Object[][] emailClaims() {\n    return new Object[][] {{\"\"}, {null}};\n  }\n}\n"
  },
  {
    "path": "multiuser/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-server</artifactId>\n        <groupId>org.eclipse.che</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n        <relativePath>../pom.xml</relativePath>\n    </parent>\n    <groupId>org.eclipse.che.multiuser</groupId>\n    <artifactId>che-multiuser-parent</artifactId>\n    <packaging>pom</packaging>\n    <name>Che Multiuser :: Parent</name>\n    <modules>\n        <module>api</module>\n        <module>machine-auth</module>\n        <module>oidc</module>\n    </modules>\n</project>\n"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.eclipse.che</groupId>\n    <artifactId>che-server</artifactId>\n    <version>7.118.0-SNAPSHOT</version>\n    <packaging>pom</packaging>\n    <name>Che Server</name>\n    <description>Eclipse Che Server</description>\n    <inceptionYear>2012</inceptionYear>\n    <organization>\n        <name>Red Hat, Inc.</name>\n        <url>http://www.redhat.com</url>\n    </organization>\n    <licenses>\n        <license>\n            <name>Eclipse Public License 2.0</name>\n            <url>https://www.eclipse.org/legal/epl-2.0/</url>\n            <distribution>repo</distribution>\n        </license>\n    </licenses>\n    <modules>\n        <module>core</module>\n        <module>wsmaster</module>\n        <module>multiuser</module>\n        <module>infrastructures</module>\n        <module>assembly</module>\n    </modules>\n    <scm>\n        <connection>scm:git:git@github.com:eclipse/che.git</connection>\n        <developerConnection>scm:git:git@github.com:eclipse/che.git</developerConnection>\n        <tag>HEAD</tag>\n        <url>https://github.com/eclipse/che</url>\n    </scm>\n    <properties>\n        <aopalliance.version>1.0</aopalliance.version>\n        <ch.qos.logback.version>1.5.28</ch.qos.logback.version>\n        <com.auth0.jwks-rsa.version>0.22.1</com.auth0.jwks-rsa.version>\n        <com.fasterxml.jackson.version>2.21.0</com.fasterxml.jackson.version>\n        <com.github.kirviq.dumbster.version>1.7.1</com.github.kirviq.dumbster.version>\n        <com.google.code.guice.version>5.0.1</com.google.code.guice.version>\n        <com.google.errorprone>2.42.0</com.google.errorprone>\n        <com.google.guava.version>32.1.2-jre</com.google.guava.version>\n        <com.google.http-client.version>2.1.0</com.google.http-client.version>\n        <com.google.oauth-client.version>1.34.1</com.google.oauth-client.version>\n        <com.googlecode.gson.version>2.13.2</com.googlecode.gson.version>\n        <com.jcraft.jsch.version>0.1.55</com.jcraft.jsch.version>\n        <com.squareup.okio.version>3.16.4</com.squareup.okio.version>\n        <commons-fileupload.version>1.6.0</commons-fileupload.version>\n        <commons-io.version>2.14.0</commons-io.version>\n        <commons-lang.version>2.6</commons-lang.version>\n        <enforcer.skip>false</enforcer.skip>\n        <grpc-api.version>1.78.0</grpc-api.version>\n        <integration.mysql.db.image>quay.io/eclipse/che--centos--mysql-57-centos7:latest-e08ee4d43b7356607685b69bde6335e27cf20c020f345b6c6c59400183882764</integration.mysql.db.image>\n        <integration.postgresql.db.image>quay.io/eclipse/che--centos--postgresql-13-centos7:1-71b24684d64da46f960682cc4216222a7e4ed8b1a31dd5a865b3e71afdea20d2</integration.postgresql.db.image>\n        <io.fabric8.kubernetes-client.version>7.6.1</io.fabric8.kubernetes-client.version>\n        <io.github.mweirauch.micrometer-jvm-extras.version>0.2.2</io.github.mweirauch.micrometer-jvm-extras.version>\n        <io.jaegertracing.micrometer.version>1.8.1</io.jaegertracing.micrometer.version>\n        <io.jaegertracing.version>1.8.1</io.jaegertracing.version>\n        <io.jsonwebtoken.jjwt.version>0.13.0</io.jsonwebtoken.jjwt.version>\n        <io.micrometer.version>1.11.5</io.micrometer.version>\n        <io.netty.version>4.2.12.Final</io.netty.version>\n        <io.opentracing.api.extensions.version>0.6.0</io.opentracing.api.extensions.version>\n        <io.opentracing.concurrent.version>0.4.0</io.opentracing.concurrent.version>\n        <io.opentracing.contrib.metrics.version>0.3.0</io.opentracing.contrib.metrics.version>\n        <io.opentracing.jdbc.version>0.2.15</io.opentracing.jdbc.version>\n        <io.opentracing.tracerresolver.version>0.1.8</io.opentracing.tracerresolver.version>\n        <io.opentracing.version>0.33.0</io.opentracing.version>\n        <io.opentracing.web-servlet-filter.version>0.4.1</io.opentracing.web-servlet-filter.version>\n        <io.prometheus.simpleclient.version>0.16.0</io.prometheus.simpleclient.version>\n        <io.rest-assured.version>6.0.0</io.rest-assured.version>\n        <io.swagger.version>2.2.16</io.swagger.version>\n        <io.vertx.version>4.5.24</io.vertx.version>\n        <jakarta.activation.version>2.1.4</jakarta.activation.version>\n        <jakarta.annotation.version>3.0.0</jakarta.annotation.version>\n        <jakarta.inject.version>1.0.5</jakarta.inject.version>\n        <jakarta.json.version>2.0.1</jakarta.json.version>\n        <jakarta.mail.version>2.0.2</jakarta.mail.version>\n        <jakarta.servlet.version>6.1.0</jakarta.servlet.version>\n        <jakarta.validatio-api.version>3.0.2</jakarta.validatio-api.version>\n        <jakarta.websocket.version>2.0.0</jakarta.websocket.version>\n        <jakarta.ws.rs.version>4.0.0</jakarta.ws.rs.version>\n        <java.target.version>11</java.target.version>\n        <jdk.min.version>${java.target.version}</jdk.min.version>\n        <junit.junit.version>4.13.2</junit.junit.version>\n        <license_contributor>Red Hat, Inc. - initial API and implementation</license_contributor>\n        <?SORTPOM IGNORE?>\n        <build.info>${project.version}</build.info>\n        <che.version>7.118.0-SNAPSHOT</che.version>\n        <specification.version>1.0-beta2</specification.version>\n        <?SORTPOM RESUME?>\n        <license_copyrightOwner>Red Hat, Inc.</license_copyrightOwner>\n        <logstash.logback.encoder.version>7.4</logstash.logback.encoder.version>\n        <maven.antrun.plugin.version>3.2.0</maven.antrun.plugin.version>\n        <maven.assembly.plugin.version>3.8.0</maven.assembly.plugin.version>\n        <maven.buildhelper.plugin.version>3.6.1</maven.buildhelper.plugin.version>\n        <maven.buildnumber.plugin.version>3.3.0</maven.buildnumber.plugin.version>\n        <maven.clean.plugin.version>3.5.0</maven.clean.plugin.version>\n        <maven.compiler.plugin.version>3.15.0</maven.compiler.plugin.version>\n        <maven.dependency.plugin.version>3.9.0</maven.dependency.plugin.version>\n        <maven.enforcer.plugin.version>3.0.0</maven.enforcer.plugin.version>\n        <maven.exec.plugin.version>3.6.3</maven.exec.plugin.version>\n        <maven.fabric8io.docker.plugin.version>0.48.1</maven.fabric8io.docker.plugin.version>\n        <maven.failsafe.plugin.version>3.5.4</maven.failsafe.plugin.version>\n        <maven.fmt.plugin.version>2.29</maven.fmt.plugin.version>\n        <maven.google-java-format.version>1.27.0</maven.google-java-format.version>\n        <maven.install.plugin.version>3.1.4</maven.install.plugin.version>\n        <maven.jacoco.plugin.version>0.8.14</maven.jacoco.plugin.version>\n        <maven.jar.plugin.version>3.5.0</maven.jar.plugin.version>\n        <maven.mycila.license.plugin.version>5.0.0</maven.mycila.license.plugin.version>\n        <maven.plugin.plugin.version>3.15.2</maven.plugin.plugin.version>\n        <maven.resources.plugin.version>3.5.0</maven.resources.plugin.version>\n        <maven.sortpom.plugin.version>2.3.1</maven.sortpom.plugin.version>\n        <maven.source.plugin.version>3.4.0</maven.source.plugin.version>\n        <maven.supported-versions>[3.6.2,)</maven.supported-versions>\n        <maven.surefire.plugin.version>3.5.5</maven.surefire.plugin.version>\n        <maven.war.plugin.version>3.5.1</maven.war.plugin.version>\n        <mysql.connector.version>8.0.33</mysql.connector.version>\n        <net.java.dev.jna.version>4.1.0</net.java.dev.jna.version>\n        <org.antlr.st4.version>4.3.4</org.antlr.st4.version>\n        <org.apache.commons.lang3.version>3.20.0</org.apache.commons.lang3.version>\n        <org.apache.httpcomponents.httpclient.version>4.5.14</org.apache.httpcomponents.httpclient.version>\n        <org.apache.httpcomponents.httpcore.version>4.4.16</org.apache.httpcomponents.httpcore.version>\n        <org.apache.maven.plugin-testing.maven-plugin-testing-harness.version>3.5.0</org.apache.maven.plugin-testing.maven-plugin-testing-harness.version>\n        <org.apache.maven.plugin-tools.plugin-annotations.version>3.15.2</org.apache.maven.plugin-tools.plugin-annotations.version>\n        <org.apache.maven.version>3.9.12</org.apache.maven.version>\n        <org.apache.tomcat.version>11.0.20</org.apache.tomcat.version>\n        <org.codehaus.plexus.utils.version>4.0.2</org.codehaus.plexus.utils.version>\n        <org.eclipse.jetty.version>11.0.26</org.eclipse.jetty.version>\n        <org.eclipse.persistence.eclipselink.version>4.0.8</org.eclipse.persistence.eclipselink.version>\n        <org.eclipse.persistence.version>2.2.3</org.eclipse.persistence.version>\n        <org.eclipse.sisu.version>0.9.0.M2</org.eclipse.sisu.version>\n        <org.everrest.version>1.15.0</org.everrest.version>\n        <org.flyway.version>11.20.2</org.flyway.version>\n        <org.hamcrest.version>3.0</org.hamcrest.version>\n        <org.javassist.version>3.30.2-GA</org.javassist.version>\n        <org.jgroups.kubernetes.version>1.0.13.Final</org.jgroups.kubernetes.version>\n        <org.jgroups.version>4.1.9.Final</org.jgroups.version>\n        <org.leadpony.justify.version>3.1.0</org.leadpony.justify.version>\n        <org.mockito.mockito-testng.version>0.5.4</org.mockito.mockito-testng.version>\n        <org.mockito.version>3.11.2</org.mockito.version>\n        <org.postgresql.version>42.7.9</org.postgresql.version>\n        <org.reflections.version>0.9.9</org.reflections.version>\n        <org.slf4j.version>2.0.17</org.slf4j.version>\n        <org.testng.version>7.12.0</org.testng.version>\n        <org.wiremock.version>3.0.1</org.wiremock.version>\n    </properties>\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>aopalliance</groupId>\n                <artifactId>aopalliance</artifactId>\n                <version>${aopalliance.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>ch.qos.logback</groupId>\n                <artifactId>logback-classic</artifactId>\n                <version>${ch.qos.logback.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>ch.qos.logback</groupId>\n                <artifactId>logback-core</artifactId>\n                <version>${ch.qos.logback.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.auth0</groupId>\n                <artifactId>jwks-rsa</artifactId>\n                <version>${com.auth0.jwks-rsa.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.fasterxml.jackson.dataformat</groupId>\n                <artifactId>jackson-dataformat-yaml</artifactId>\n                <version>${com.fasterxml.jackson.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.github.tomakehurst</groupId>\n                <artifactId>wiremock-jre8-standalone</artifactId>\n                <version>${org.wiremock.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.google.code.gson</groupId>\n                <artifactId>gson</artifactId>\n                <version>${com.googlecode.gson.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.google.guava</groupId>\n                <artifactId>guava</artifactId>\n                <version>${com.google.guava.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>jsr305</artifactId>\n                        <groupId>com.google.code.findbugs</groupId>\n                    </exclusion>\n                    <exclusion>\n                        <artifactId>error_prone_annotations</artifactId>\n                        <groupId>com.google.errorprone</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>com.google.http-client</groupId>\n                <artifactId>google-http-client</artifactId>\n                <version>${com.google.http-client.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>httpclient</artifactId>\n                        <groupId>org.apache.httpcomponents</groupId>\n                    </exclusion>\n                    <exclusion>\n                        <artifactId>jsr305</artifactId>\n                        <groupId>com.google.code.findbugs</groupId>\n                    </exclusion>\n                    <exclusion>\n                        <artifactId>j2objc-annotations</artifactId>\n                        <groupId>com.google.j2objc</groupId>\n                    </exclusion>\n                    <exclusion>\n                        <artifactId>grpc-context</artifactId>\n                        <groupId>io.grpc</groupId>\n                    </exclusion>\n                    <exclusion>\n                        <artifactId>error_prone_annotations</artifactId>\n                        <groupId>com.google.errorprone</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>com.google.http-client</groupId>\n                <artifactId>google-http-client-jackson2</artifactId>\n                <version>${com.google.http-client.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.google.inject</groupId>\n                <artifactId>guice</artifactId>\n                <version>${com.google.code.guice.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>javax.inject</artifactId>\n                        <groupId>javax.inject</groupId>\n                    </exclusion>\n                    <exclusion>\n                        <artifactId>guava</artifactId>\n                        <groupId>com.google.guava</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>com.google.inject.extensions</groupId>\n                <artifactId>guice-assistedinject</artifactId>\n                <version>${com.google.code.guice.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.google.inject.extensions</groupId>\n                <artifactId>guice-persist</artifactId>\n                <version>${com.google.code.guice.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.google.oauth-client</groupId>\n                <artifactId>google-oauth-client</artifactId>\n                <version>${com.google.oauth-client.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>jsr305</artifactId>\n                        <groupId>com.google.code.findbugs</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>com.jcraft</groupId>\n                <artifactId>jsch</artifactId>\n                <version>${com.jcraft.jsch.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.squareup.okio</groupId>\n                <artifactId>okio</artifactId>\n                <version>${com.squareup.okio.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.sun.mail</groupId>\n                <artifactId>jakarta.mail</artifactId>\n                <version>${jakarta.mail.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>jakarta.activation</artifactId>\n                        <groupId>com.sun.activation</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>commons-fileupload</groupId>\n                <artifactId>commons-fileupload</artifactId>\n                <version>${commons-fileupload.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>servlet-api</artifactId>\n                        <groupId>javax.servlet</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>commons-io</groupId>\n                <artifactId>commons-io</artifactId>\n                <version>${commons-io.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>commons-lang</groupId>\n                <artifactId>commons-lang</artifactId>\n                <version>${commons-lang.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.github.mweirauch</groupId>\n                <artifactId>micrometer-jvm-extras</artifactId>\n                <version>${io.github.mweirauch.micrometer-jvm-extras.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.grpc</groupId>\n                <artifactId>grpc-api</artifactId>\n                <version>${grpc-api.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.jaegertracing</groupId>\n                <artifactId>jaeger-client</artifactId>\n                <version>${io.jaegertracing.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>*</artifactId>\n                        <groupId>org.apache.httpcomponents</groupId>\n                    </exclusion>\n                    <exclusion>\n                        <artifactId>jaeger-thrift</artifactId>\n                        <groupId>io.jaegertracing</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>io.jaegertracing</groupId>\n                <artifactId>jaeger-core</artifactId>\n                <version>${io.jaegertracing.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.jaegertracing</groupId>\n                <artifactId>jaeger-micrometer</artifactId>\n                <version>${io.jaegertracing.micrometer.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.jaegertracing</groupId>\n                <artifactId>jaeger-tracerresolver</artifactId>\n                <version>${io.jaegertracing.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.jsonwebtoken</groupId>\n                <artifactId>jjwt-api</artifactId>\n                <version>${io.jsonwebtoken.jjwt.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.jsonwebtoken</groupId>\n                <artifactId>jjwt-impl</artifactId>\n                <version>${io.jsonwebtoken.jjwt.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.jsonwebtoken</groupId>\n                <artifactId>jjwt-jackson</artifactId>\n                <version>${io.jsonwebtoken.jjwt.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.micrometer</groupId>\n                <artifactId>micrometer-core</artifactId>\n                <version>${io.micrometer.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.micrometer</groupId>\n                <artifactId>micrometer-registry-prometheus</artifactId>\n                <version>${io.micrometer.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.netty</groupId>\n                <artifactId>netty-codec-dns</artifactId>\n                <version>${io.netty.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.netty</groupId>\n                <artifactId>netty-codec-http</artifactId>\n                <version>${io.netty.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.netty</groupId>\n                <artifactId>netty-codec-http2</artifactId>\n                <version>${io.netty.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.netty</groupId>\n                <artifactId>netty-handler</artifactId>\n                <version>${io.netty.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.netty</groupId>\n                <artifactId>netty-handler-proxy</artifactId>\n                <version>${io.netty.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.opentracing</groupId>\n                <artifactId>opentracing-api</artifactId>\n                <version>${io.opentracing.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.opentracing</groupId>\n                <artifactId>opentracing-noop</artifactId>\n                <version>${io.opentracing.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.opentracing</groupId>\n                <artifactId>opentracing-util</artifactId>\n                <version>${io.opentracing.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.opentracing.contrib</groupId>\n                <artifactId>opentracing-api-extensions</artifactId>\n                <version>${io.opentracing.api.extensions.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.opentracing.contrib</groupId>\n                <artifactId>opentracing-api-extensions-tracer</artifactId>\n                <version>${io.opentracing.api.extensions.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>opentracing-noop</artifactId>\n                        <groupId>io.opentracing</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>io.opentracing.contrib</groupId>\n                <artifactId>opentracing-concurrent</artifactId>\n                <version>${io.opentracing.concurrent.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.opentracing.contrib</groupId>\n                <artifactId>opentracing-jdbc</artifactId>\n                <version>${io.opentracing.jdbc.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.opentracing.contrib</groupId>\n                <artifactId>opentracing-metrics</artifactId>\n                <version>${io.opentracing.contrib.metrics.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.opentracing.contrib</groupId>\n                <artifactId>opentracing-metrics-micrometer</artifactId>\n                <version>${io.opentracing.contrib.metrics.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.opentracing.contrib</groupId>\n                <artifactId>opentracing-tracerresolver</artifactId>\n                <version>${io.opentracing.tracerresolver.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.opentracing.contrib</groupId>\n                <artifactId>opentracing-web-servlet-filter</artifactId>\n                <version>${io.opentracing.web-servlet-filter.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.prometheus</groupId>\n                <artifactId>simpleclient</artifactId>\n                <version>${io.prometheus.simpleclient.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.prometheus</groupId>\n                <artifactId>simpleclient_httpserver</artifactId>\n                <version>${io.prometheus.simpleclient.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.rest-assured</groupId>\n                <artifactId>rest-assured</artifactId>\n                <version>${io.rest-assured.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.swagger.core.v3</groupId>\n                <artifactId>swagger-annotations-jakarta</artifactId>\n                <version>${io.swagger.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>io.swagger.core.v3</groupId>\n                <artifactId>swagger-jaxrs2-jakarta</artifactId>\n                <version>${io.swagger.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>jackson-jaxrs-json-provider</artifactId>\n                        <groupId>com.fasterxml.jackson.jaxrs</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>io.vertx</groupId>\n                <artifactId>vertx-core</artifactId>\n                <version>${io.vertx.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>jakarta.activation</groupId>\n                <artifactId>jakarta.activation-api</artifactId>\n                <version>${jakarta.activation.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>jakarta.annotation</groupId>\n                <artifactId>jakarta.annotation-api</artifactId>\n                <version>${jakarta.annotation.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>jakarta.inject</groupId>\n                <artifactId>jakarta.inject-api</artifactId>\n                <version>${jakarta.inject.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>jakarta.servlet</groupId>\n                <artifactId>jakarta.servlet-api</artifactId>\n                <version>${jakarta.servlet.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>jakarta.validation</groupId>\n                <artifactId>jakarta.validation-api</artifactId>\n                <version>${jakarta.validatio-api.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>jakarta.websocket</groupId>\n                <artifactId>jakarta.websocket-api</artifactId>\n                <version>${jakarta.websocket.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>jakarta.ws.rs</groupId>\n                <artifactId>jakarta.ws.rs-api</artifactId>\n                <version>${jakarta.ws.rs.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>mysql</groupId>\n                <artifactId>mysql-connector-java</artifactId>\n                <version>${mysql.connector.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>net.logstash.logback</groupId>\n                <artifactId>logstash-logback-encoder</artifactId>\n                <version>${logstash.logback.encoder.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.antlr</groupId>\n                <artifactId>ST4</artifactId>\n                <version>${org.antlr.st4.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.commons</groupId>\n                <artifactId>commons-lang3</artifactId>\n                <version>${org.apache.commons.lang3.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.httpcomponents</groupId>\n                <artifactId>httpclient</artifactId>\n                <version>${org.apache.httpcomponents.httpclient.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.httpcomponents</groupId>\n                <artifactId>httpcore</artifactId>\n                <version>${org.apache.httpcomponents.httpcore.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.maven</groupId>\n                <artifactId>maven-artifact</artifactId>\n                <version>${org.apache.maven.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.maven</groupId>\n                <artifactId>maven-compat</artifactId>\n                <version>${org.apache.maven.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.maven</groupId>\n                <artifactId>maven-core</artifactId>\n                <version>${org.apache.maven.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.maven</groupId>\n                <artifactId>maven-model</artifactId>\n                <version>${org.apache.maven.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.maven</groupId>\n                <artifactId>maven-plugin-api</artifactId>\n                <version>${org.apache.maven.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>jsr250-api</artifactId>\n                        <groupId>jakarta.annotation</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.maven.plugin-tools</groupId>\n                <artifactId>maven-plugin-annotations</artifactId>\n                <version>${org.apache.maven.plugin-tools.plugin-annotations.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.tomcat</groupId>\n                <artifactId>tomcat-catalina</artifactId>\n                <version>${org.apache.tomcat.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.tomcat</groupId>\n                <artifactId>tomcat-coyote</artifactId>\n                <version>${org.apache.tomcat.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.tomcat</groupId>\n                <artifactId>tomcat-dbcp</artifactId>\n                <version>${org.apache.tomcat.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.tomcat</groupId>\n                <artifactId>tomcat-servlet-api</artifactId>\n                <version>${org.apache.tomcat.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.codehaus.plexus</groupId>\n                <artifactId>plexus-utils</artifactId>\n                <version>${org.codehaus.plexus.utils.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.codehaus.plexus</groupId>\n                <artifactId>plexus-xml</artifactId>\n                <version>${org.codehaus.plexus.utils.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che</groupId>\n                <artifactId>assembly-che-tomcat</artifactId>\n                <version>${che.version}</version>\n                <type>zip</type>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che</groupId>\n                <artifactId>assembly-dashboard-war</artifactId>\n                <version>${che.version}</version>\n                <type>war</type>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che</groupId>\n                <artifactId>assembly-main</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che</groupId>\n                <artifactId>assembly-root-war</artifactId>\n                <version>${che.version}</version>\n                <type>war</type>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che</groupId>\n                <artifactId>assembly-swagger-war</artifactId>\n                <version>${che.version}</version>\n                <type>war</type>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che</groupId>\n                <artifactId>assembly-wsmaster-war</artifactId>\n                <version>${che.version}</version>\n                <type>war</type>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che</groupId>\n                <artifactId>che-multiuser-keycloak-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-account</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-account</artifactId>\n                <version>${che.version}</version>\n                <classifier>tests</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-auth</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-auth-azure-devops</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-auth-bitbucket</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-auth-github</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-auth-github-common</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-auth-gitlab</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-auth-gitlab-common</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-auth-openshift</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-auth-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-core</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-devfile</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-devfile</artifactId>\n                <version>${che.version}</version>\n                <classifier>tests</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-devfile-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-factory</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-factory</artifactId>\n                <version>${che.version}</version>\n                <classifier>tests</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-factory-azure-devops</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-factory-bitbucket</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-factory-bitbucket-server</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-factory-git-ssh</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-factory-github</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-factory-github-common</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-factory-gitlab</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-factory-gitlab-common</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-factory-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-git</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-git</artifactId>\n                <version>${che.version}</version>\n                <classifier>tests</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-git-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-infrastructure-local</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-installer-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-logger</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-logger-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-metrics</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-model</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-oauth</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-ssh</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-ssh</artifactId>\n                <version>${che.version}</version>\n                <classifier>tests</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-ssh-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-system</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-system-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-testing</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-testing-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-user</artifactId>\n                <version>${che.version}</version>\n                <classifier>tests</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-user</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-user-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-workspace</artifactId>\n                <version>${che.version}</version>\n                <classifier>tests</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-workspace</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n           <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-workspace-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-commons-annotations</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-commons-inject</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-commons-j2ee</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-commons-json</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-commons-lang</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-commons-observability</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-commons-schedule</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-commons-tracing</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-db</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-db-vendor-h2</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-db-vendor-mysql</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-db-vendor-postgresql</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-logback</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-metrics-core</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-sql-schema</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-tracing-core</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-tracing-metrics</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-tracing-web</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-workspace-activity-server</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>wsmaster-local</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.dashboard</groupId>\n                <artifactId>che-dashboard-war</artifactId>\n                <version>${che.dashboard.version}</version>\n                <type>war</type>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.infrastructure</groupId>\n                <artifactId>infrastructure-distributed</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.infrastructure</groupId>\n                <artifactId>infrastructure-factory</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.infrastructure</groupId>\n                <artifactId>infrastructure-kubernetes</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.infrastructure</groupId>\n                <artifactId>infrastructure-kubernetes</artifactId>\n                <version>${che.version}</version>\n                <classifier>tests</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.infrastructure</groupId>\n                <artifactId>infrastructure-metrics</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.infrastructure</groupId>\n                <artifactId>infrastructure-openshift</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.infrastructure</groupId>\n                <artifactId>infrastructure-permission</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-api-authentication-commons</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-api-authorization</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-api-authorization-impl</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-api-organization</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-api-organization</artifactId>\n                <version>${che.version}</version>\n                <classifier>tests</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-api-organization-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-api-permission</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-api-permission</artifactId>\n                <version>${che.version}</version>\n                <classifier>tests</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-api-permission-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-api-resource</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-api-resource</artifactId>\n                <version>${che.version}</version>\n                <classifier>tests</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-api-resource-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-keycloak-server</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-keycloak-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-keycloak-user-remover</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-machine-authentication</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-machine-authentication</artifactId>\n                <version>${che.version}</version>\n                <classifier>tests</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-machine-authentication-shared</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-oidc</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>che-multiuser-permission-devfile</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.multiuser</groupId>\n                <artifactId>multiuser-infrastructure-openshift</artifactId>\n                <version>${che.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.persistence</groupId>\n                <artifactId>jakarta.persistence</artifactId>\n                <version>${org.eclipse.persistence.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.persistence</groupId>\n                <artifactId>org.eclipse.persistence.core</artifactId>\n                <version>${org.eclipse.persistence.eclipselink.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.persistence</groupId>\n                <artifactId>org.eclipse.persistence.extension</artifactId>\n                <version>${org.eclipse.persistence.eclipselink.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.persistence</groupId>\n                <artifactId>org.eclipse.persistence.jpa</artifactId>\n                <version>${org.eclipse.persistence.eclipselink.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.sisu</groupId>\n                <artifactId>org.eclipse.sisu.plexus</artifactId>\n                <version>${org.eclipse.sisu.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.everrest</groupId>\n                <artifactId>everrest-assured</artifactId>\n                <version>${org.everrest.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.everrest</groupId>\n                <artifactId>everrest-core</artifactId>\n                <version>${org.everrest.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>everrest-commons-fileupload</artifactId>\n                        <groupId>org.everrest</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>org.everrest</groupId>\n                <artifactId>everrest-guice-servlet</artifactId>\n                <version>${org.everrest.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.everrest</groupId>\n                <artifactId>everrest-integration-guice</artifactId>\n                <version>${org.everrest.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.everrest</groupId>\n                <artifactId>everrest-test</artifactId>\n                <version>${org.everrest.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.flywaydb</groupId>\n                <artifactId>flyway-core</artifactId>\n                <version>${org.flyway.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.glassfish</groupId>\n                <artifactId>jakarta.json</artifactId>\n                <version>${jakarta.json.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.hamcrest</groupId>\n                <artifactId>hamcrest</artifactId>\n                <version>${org.hamcrest.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.hamcrest</groupId>\n                <artifactId>hamcrest-core</artifactId>\n                <version>${org.hamcrest.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.hamcrest</groupId>\n                <artifactId>hamcrest-library</artifactId>\n                <version>${org.hamcrest.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.javassist</groupId>\n                <artifactId>javassist</artifactId>\n                <version>${org.javassist.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.jgroups</groupId>\n                <artifactId>jgroups</artifactId>\n                <version>${org.jgroups.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.jgroups.kubernetes</groupId>\n                <artifactId>jgroups-kubernetes</artifactId>\n                <version>${org.jgroups.kubernetes.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.leadpony.justify</groupId>\n                <artifactId>justify</artifactId>\n                <version>${org.leadpony.justify.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.mockito</groupId>\n                <artifactId>mockito-core</artifactId>\n                <version>${org.mockito.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>hamcrest-core</artifactId>\n                        <groupId>org.hamcrest</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>org.mockito</groupId>\n                <artifactId>mockito-testng</artifactId>\n                <version>${org.mockito.mockito-testng.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>mockito-core</artifactId>\n                        <groupId>org.mockito</groupId>\n                    </exclusion>\n                    <exclusion>\n                        <artifactId>testng</artifactId>\n                        <groupId>org.testng</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>org.postgresql</groupId>\n                <artifactId>postgresql</artifactId>\n                <version>${org.postgresql.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>checker-qual</artifactId>\n                        <groupId>org.checkerframework</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>org.reflections</groupId>\n                <artifactId>reflections</artifactId>\n                <version>${org.reflections.version}</version>\n                <exclusions>\n                    <exclusion>\n                        <artifactId>dom4j</artifactId>\n                        <groupId>dom4j</groupId>\n                    </exclusion>\n                    <exclusion>\n                        <artifactId>annotations</artifactId>\n                        <groupId>com.google.code.findbugs</groupId>\n                    </exclusion>\n                    <exclusion>\n                        <artifactId>javassist</artifactId>\n                        <groupId>org.javassist</groupId>\n                    </exclusion>\n                </exclusions>\n            </dependency>\n            <dependency>\n                <groupId>org.slf4j</groupId>\n                <artifactId>jcl-over-slf4j</artifactId>\n                <version>${org.slf4j.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.slf4j</groupId>\n                <artifactId>jul-to-slf4j</artifactId>\n                <version>${org.slf4j.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.slf4j</groupId>\n                <artifactId>log4j-over-slf4j</artifactId>\n                <version>${org.slf4j.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.slf4j</groupId>\n                <artifactId>slf4j-api</artifactId>\n                <version>${org.slf4j.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.slf4j</groupId>\n                <artifactId>slf4j-simple</artifactId>\n                <version>${org.slf4j.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.testng</groupId>\n                <artifactId>testng</artifactId>\n                <version>${org.testng.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.wiremock</groupId>\n                <artifactId>wiremock-standalone</artifactId>\n                <version>${org.wiremock.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.fasterxml.jackson</groupId>\n                <artifactId>jackson-bom</artifactId>\n                <version>${com.fasterxml.jackson.version}</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n            <dependency>\n                <groupId>io.fabric8</groupId>\n                <artifactId>kubernetes-client-api</artifactId>\n                <version>${io.fabric8.kubernetes-client.version}</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n            <dependency>\n                <groupId>com.github.kirviq</groupId>\n                <artifactId>dumbster</artifactId>\n                <version>${com.github.kirviq.dumbster.version}</version>\n                <scope>test</scope>\n            </dependency>\n            <dependency>\n                <groupId>junit</groupId>\n                <artifactId>junit</artifactId>\n                <version>${junit.junit.version}</version>\n                <scope>test</scope>\n            </dependency>\n            <dependency>\n                <groupId>org.apache.maven.plugin-testing</groupId>\n                <artifactId>maven-plugin-testing-harness</artifactId>\n                <version>${org.apache.maven.plugin-testing.maven-plugin-testing-harness.version}</version>\n                <scope>test</scope>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-commons-test</artifactId>\n                <version>${che.version}</version>\n                <scope>test</scope>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.jetty</groupId>\n                <artifactId>jetty-security</artifactId>\n                <version>${org.eclipse.jetty.version}</version>\n                <scope>test</scope>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.jetty</groupId>\n                <artifactId>jetty-servlet</artifactId>\n                <version>${org.eclipse.jetty.version}</version>\n                <scope>test</scope>\n            </dependency>\n            <dependency>\n                <groupId>org.eclipse.jetty</groupId>\n                <artifactId>jetty-util</artifactId>\n                <version>${org.eclipse.jetty.version}</version>\n                <scope>test</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n    <repositories>\n        <repository>\n            <snapshots>\n                <enabled>true</enabled>\n                <checksumPolicy>fail</checksumPolicy>\n            </snapshots>\n            <id>ossrh</id>\n            <name>central public snapshots</name>\n            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>\n        </repository>\n    </repositories>\n    <pluginRepositories>\n        <pluginRepository>\n            <id>ossrh</id>\n            <name>central public snapshots</name>\n            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>\n        </pluginRepository>\n    </pluginRepositories>\n    <build>\n        <pluginManagement>\n            <plugins>\n                <plugin>\n                    <groupId>io.fabric8</groupId>\n                    <artifactId>docker-maven-plugin</artifactId>\n                    <version>${maven.fabric8io.docker.plugin.version}</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-failsafe-plugin</artifactId>\n                    <version>${maven.failsafe.plugin.version}</version>\n                    <configuration>\n                        <argLine>--illegal-access=permit</argLine>\n                        <systemPropertyVariables>\n                            <!-- To avoid conflicts on CI server - PAR-192 -->\n                            <!-- There is an incompatibility with Byteman - used in social -->\n                            <!-- <java.io.tmpdir>${project.build.directory}</java.io.tmpdir> -->\n                        </systemPropertyVariables>\n                    </configuration>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-antrun-plugin</artifactId>\n                    <version>${maven.antrun.plugin.version}</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-clean-plugin</artifactId>\n                    <version>${maven.clean.plugin.version}</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.codehaus.mojo</groupId>\n                    <artifactId>build-helper-maven-plugin</artifactId>\n                    <version>${maven.buildhelper.plugin.version}</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.codehaus.mojo</groupId>\n                    <artifactId>exec-maven-plugin</artifactId>\n                    <version>${maven.exec.plugin.version}</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-plugin-plugin</artifactId>\n                    <version>${maven.plugin.plugin.version}</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.eclipse.che.core</groupId>\n                    <artifactId>che-core-dynamodule-maven-plugin</artifactId>\n                    <version>${che.version}</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.codehaus.mojo</groupId>\n                    <artifactId>buildnumber-maven-plugin</artifactId>\n                    <version>${maven.buildnumber.plugin.version}</version>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-compiler-plugin</artifactId>\n                    <version>${maven.compiler.plugin.version}</version>\n                    <configuration>\n                        <release>${java.target.version}</release>\n                        <showDeprecation>true</showDeprecation>\n                        <showWarnings>true</showWarnings>\n                    </configuration>\n                </plugin>\n                <plugin>\n                    <groupId>com.google.code.sortpom</groupId>\n                    <artifactId>maven-sortpom-plugin</artifactId>\n                    <version>${maven.sortpom.plugin.version}</version>\n                    <configuration>\n                        <expandEmptyElements>false</expandEmptyElements>\n                        <nrOfIndentSpace>4</nrOfIndentSpace>\n                        <createBackupFile>false</createBackupFile>\n                        <sortProperties>true</sortProperties>\n                        <sortDependencies>scope,groupId,artifactId</sortDependencies>\n                        <verifyFail>Stop</verifyFail>\n                    </configuration>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-dependency-plugin</artifactId>\n                    <version>${maven.dependency.plugin.version}</version>\n                    <configuration>\n                        <!-- Perfs improvements - PAR-191 -->\n                        <useJvmChmod>true</useJvmChmod>\n                    </configuration>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-assembly-plugin</artifactId>\n                    <version>${maven.assembly.plugin.version}</version>\n                    <configuration>\n                        <!-- Use GNU Tar -->\n                        <tarLongFileMode>gnu</tarLongFileMode>\n                        <!-- Perfs improvements - PAR-191 -->\n                        <useJvmChmod>true</useJvmChmod>\n                        <!-- Allow to activate/deactivate the recompression of zip files -->\n                        <recompressZippedFiles>${maven.assembly.recompressZippedFiles}</recompressZippedFiles>\n                    </configuration>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-jar-plugin</artifactId>\n                    <version>${maven.jar.plugin.version}</version>\n                    <configuration>\n                        <archive>\n                            <manifest>\n                                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>\n                                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>\n                            </manifest>\n                            <manifestEntries>\n                                <Date>${maven.build.timestamp}</Date>\n                                <Implementation-URL>${project.url}</Implementation-URL>\n                                <SCM-URL>${project.scm.connection}</SCM-URL>\n                                <SCM-Revision>${buildNumber}</SCM-Revision>\n                                <Specification-Title>${product.name}</Specification-Title>\n                                <Specification-Version>${specification.version}</Specification-Version>\n                                <Specification-Vendor>${project.organization.name}</Specification-Vendor>\n                                <Implementation-Title>${project.name}</Implementation-Title>\n                                <Implementation-Version>${project.version}</Implementation-Version>\n                                <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>\n                            </manifestEntries>\n                        </archive>\n                    </configuration>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-javadoc-plugin</artifactId>\n                    <version>${maven.javadoc.plugin.version}</version>\n                </plugin>\n                <plugin>\n                    <groupId>com.mycila</groupId>\n                    <artifactId>license-maven-plugin</artifactId>\n                    <version>${maven.mycila.license.plugin.version}</version>\n                    <!-- Add a dependency since this is where the maven-license-plugin plugin will find the license-header.txt file -->\n                    <dependencies>\n                        <dependency>\n                            <groupId>com.mycila</groupId>\n                            <artifactId>license-maven-plugin-git</artifactId>\n                            <version>${maven.mycila.license.plugin.version}</version>\n                        </dependency>\n                        <dependency>\n                            <groupId>org.eclipse.che.dev</groupId>\n                            <artifactId>che-eclipse-license-resource-bundle</artifactId>\n                            <version>20</version>\n                        </dependency>\n                    </dependencies>\n                    <configuration>\n                        <header>license-header.txt</header>\n                        <properties>\n                            <!-- Values to be substituted in template -->\n                            <h_inceptionYear>${project.inceptionYear}</h_inceptionYear>\n                            <h_currentYear>${currentYear}</h_currentYear>\n                            <h_copyrightOwner>${license_copyrightOwner}</h_copyrightOwner>\n                            <h_license_years>${license_years}</h_license_years>\n                            <h_contributor>${license_contributor}</h_contributor>\n                            <h_contributor2>${license_contributor2}</h_contributor2>\n                        </properties>\n                        <failIfMissing>true</failIfMissing>\n                        <strictCheck>true</strictCheck>\n                        <!-- We're only interested in checking our sources and our POMs -->\n                        <includes>\n                            <include>src/**</include>\n                            <include>pom.xml</include>\n                        </includes>\n                        <!-- Default excludes are excluding POMs -->\n                        <useDefaultExcludes>false</useDefaultExcludes>\n                        <excludes>\n                            <exclude>**/*~</exclude>\n                            <exclude>**/#*#</exclude>\n                            <exclude>**/.#*</exclude>\n                            <exclude>**/%*%</exclude>\n                            <exclude>**/._*</exclude>\n                            <exclude>**/.repository/**</exclude>\n                            <exclude>**/CVS</exclude>\n                            <exclude>**/CVS/**</exclude>\n                            <exclude>**/.cvsignore</exclude>\n                            <exclude>**/RCS</exclude>\n                            <exclude>**/RCS/**</exclude>\n                            <exclude>**/SCCS</exclude>\n                            <exclude>**/SCCS/**</exclude>\n                            <exclude>**/vssver.scc</exclude>\n                            <exclude>**/.svn</exclude>\n                            <exclude>**/.svn/**</exclude>\n                            <exclude>**/.arch-ids</exclude>\n                            <exclude>**/.arch-ids/**</exclude>\n                            <exclude>**/.bzr</exclude>\n                            <exclude>**/.bzr/**</exclude>\n                            <exclude>**/.MySCMServerInfo</exclude>\n                            <exclude>**/.DS_Store</exclude>\n                            <exclude>**/.metadata</exclude>\n                            <exclude>**/.metadata/**</exclude>\n                            <exclude>**/.hg</exclude>\n                            <exclude>**/.hg/**</exclude>\n                            <exclude>**/.git</exclude>\n                            <exclude>**/.git/**</exclude>\n                            <exclude>**/.gitignore</exclude>\n                            <exclude>**/BitKeeper</exclude>\n                            <exclude>**/BitKeeper/**</exclude>\n                            <exclude>**/ChangeSet</exclude>\n                            <exclude>**/ChangeSet/**</exclude>\n                            <exclude>**/_darcs</exclude>\n                            <exclude>**/_darcs/**</exclude>\n                            <exclude>**/.darcsrepo</exclude>\n                            <exclude>**/.darcsrepo/**</exclude>\n                            <exclude>**/-darcs-backup*</exclude>\n                            <exclude>**/.darcs-temp-mail</exclude>\n                            <exclude>**/target/**</exclude>\n                            <exclude>**/test-output/**</exclude>\n                            <exclude>**/release.properties</exclude>\n                            <exclude>**/dependency-reduced-pom.xml</exclude>\n                            <exclude>**/cobertura.ser</exclude>\n                            <exclude>**/.clover/**</exclude>\n                            <exclude>**/.classpath</exclude>\n                            <exclude>**/.project</exclude>\n                            <exclude>**/.settings/**</exclude>\n                            <exclude>**/*.iml</exclude>\n                            <exclude>**/*.ipr</exclude>\n                            <exclude>**/*.iws</exclude>\n                            <exclude>**/.idea/**</exclude>\n                            <exclude>**/MANIFEST.MF</exclude>\n                            <exclude>**/*.jpg</exclude>\n                            <exclude>**/*.png</exclude>\n                            <exclude>**/*.gif</exclude>\n                            <exclude>**/*.ico</exclude>\n                            <exclude>**/*.bmp</exclude>\n                            <exclude>**/*.tiff</exclude>\n                            <exclude>**/*.tif</exclude>\n                            <exclude>**/*.cr2</exclude>\n                            <exclude>**/*.xcf</exclude>\n                            <exclude>**/*.class</exclude>\n                            <exclude>**/*.exe</exclude>\n                            <exclude>**/*.md5</exclude>\n                            <exclude>**/*.sha1</exclude>\n                            <exclude>**/*.jar</exclude>\n                            <exclude>**/*.zip</exclude>\n                            <exclude>**/*.rar</exclude>\n                            <exclude>**/*.tar</exclude>\n                            <exclude>**/*.tar.gz</exclude>\n                            <exclude>**/*.tar.bz2</exclude>\n                            <exclude>**/*.gz</exclude>\n                            <exclude>**/*.xls</exclude>\n                            <exclude>**/META-INF/services/**</exclude>\n                            <exclude>**/*.pem</exclude>\n                            <exclude>**/*.txt</exclude>\n                            <exclude>**/*.log</exclude>\n                            <exclude>**/README</exclude>\n                            <exclude>**/server.xml</exclude>\n                            <exclude>**/*.json</exclude>\n                            <exclude>**/catalina.properties</exclude>\n                            <exclude>**/logging.properties</exclude>\n                            <exclude>**/jaas.conf</exclude>\n                            <exclude>**/jmxremote.access</exclude>\n                            <exclude>**/jmxremote.password</exclude>\n                            <exclude>**/tomcat-users.xml</exclude>\n                            <exclude>**/rewrite.config</exclude>\n                        </excludes>\n                        <mapping>\n                            <svg>XML_STYLE</svg>\n                            <ts>SLASHSTAR_STYLE</ts>\n                            <go>DOUBLESLASH_STYLE</go>\n                            <java>SLASHSTAR_STYLE</java>\n                        </mapping>\n                    </configuration>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-source-plugin</artifactId>\n                    <version>${maven.source.plugin.version}</version>\n                    <configuration>\n                        <archive>\n                            <manifest>\n                                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>\n                                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>\n                            </manifest>\n                            <manifestEntries>\n                                <Date>${maven.build.timestamp}</Date>\n                                <Implementation-URL>${project.url}</Implementation-URL>\n                                <SCM-URL>${project.scm.connection}</SCM-URL>\n                                <SCM-Revision>${buildNumber}</SCM-Revision>\n                                <Specification-Title>${product.name}</Specification-Title>\n                                <Specification-Version>${parsedVersion.majorVersion}.0</Specification-Version>\n                                <Specification-Vendor>${project.organization.name}</Specification-Vendor>\n                                <Implementation-Title>${project.name}</Implementation-Title>\n                                <Implementation-Version>${project.version}</Implementation-Version>\n                                <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>\n                            </manifestEntries>\n                        </archive>\n                    </configuration>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-war-plugin</artifactId>\n                    <version>${maven.war.plugin.version}</version>\n                    <configuration>\n                        <archive>\n                            <manifest>\n                                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>\n                                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>\n                            </manifest>\n                            <manifestEntries>\n                                <Date>${maven.build.timestamp}</Date>\n                                <Implementation-URL>${project.url}</Implementation-URL>\n                                <SCM-URL>${project.scm.connection}</SCM-URL>\n                                <SCM-Revision>${buildNumber}</SCM-Revision>\n                                <Specification-Title>${product.name}</Specification-Title>\n                                <Specification-Version>${parsedVersion.majorVersion}.0</Specification-Version>\n                                <Specification-Vendor>${project.organization.name}</Specification-Vendor>\n                                <Implementation-Title>${project.name}</Implementation-Title>\n                                <Implementation-Version>${project.version}</Implementation-Version>\n                                <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>\n                            </manifestEntries>\n                        </archive>\n                        <!-- PAR-145 : Be sure that all product package all their classes in JAR (No stand alone classes in WEB-INF/classes) -->\n                        <archiveClasses>${archiveClasses}</archiveClasses>\n                        <attachClasses>${maven.war.attachClasses}</attachClasses>\n                        <useCache>${useCache}</useCache>\n                        <!-- Allow to activate/deactivate the recompression of zip files -->\n                        <recompressZippedFiles>${maven.war.recompressZippedFiles}</recompressZippedFiles>\n                    </configuration>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-surefire-plugin</artifactId>\n                    <version>${maven.surefire.plugin.version}</version>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-resources-plugin</artifactId>\n                    <version>${maven.resources.plugin.version}</version>\n                </plugin>\n                <plugin>\n                    <artifactId>maven-install-plugin</artifactId>\n                    <version>${maven.install.plugin.version}</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.jacoco</groupId>\n                    <artifactId>jacoco-maven-plugin</artifactId>\n                    <version>${maven.jacoco.plugin.version}</version>\n                </plugin>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-enforcer-plugin</artifactId>\n                    <version>${maven.enforcer.plugin.version}</version>\n                    <dependencies>\n                        <dependency>\n                            <groupId>com.ceilfors.maven.plugin</groupId>\n                            <artifactId>enforcer-rules</artifactId>\n                            <version>1.2.0</version>\n                        </dependency>\n                    </dependencies>\n                </plugin>\n            </plugins>\n        </pluginManagement>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>parse-version</id>\n                        <goals>\n                            <goal>parse-version</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>buildnumber-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <phase>validate</phase>\n                        <goals>\n                            <goal>create</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <configuration>\n                    <buildNumberPropertyName>buildNumber</buildNumberPropertyName>\n                    <revisionOnScmFailure>no_revision</revisionOnScmFailure>\n                    <getRevisionOnlyOnce>true</getRevisionOnlyOnce>\n                    <timestampFormat>yyyyMMdd</timestampFormat>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-enforcer-plugin</artifactId>\n                <version>${maven.enforcer.plugin.version}</version>\n                <executions>\n                    <execution>\n                        <id>enforce</id>\n                        <goals>\n                            <goal>enforce</goal>\n                        </goals>\n                        <configuration>\n                            <rules>\n                                <requireDepMgt>\n                                    <message>You are trying to use artifacts that are not in the list of allowed artifacts included in\n                                        dependencyManagement in root pom or have different version.</message>\n                                    <checkVersion>true</checkVersion>\n                                    <ignoreScopes>\n                                        <ignoreScope>runtime</ignoreScope>\n                                    </ignoreScopes>\n                                </requireDepMgt>\n                                <dependencyConvergence />\n                                <requireJavaVersion>\n                                    <version>[${java.target.version},)</version>\n                                </requireJavaVersion>\n                                <requireMavenVersion>\n                                    <version>${maven.supported-versions}</version>\n                                </requireMavenVersion>\n                                <bannedDependencies>\n                                    <excludes>\n                                        <!-- Exclude javax dependencies in favor of Jakarta -->\n                                        <exclude>javax.activation:activation</exclude>\n                                        <exclude>javax.activation:javax.activation-api</exclude>\n                                        <!-- Uncomment when the dependency is removed from io.fabric8.kubernetes-client -->\n                                        <!-- <exclude>javax.annotation:javax.annotation-api</exclude>-->\n                                        <exclude>javax.enterprise:cdi-api</exclude>\n                                        <exclude>javax.inject:javax.inject</exclude>\n                                        <exclude>javax.json:javax.json-api</exclude>\n                                        <exclude>javax.json.bind:javax.json.bind-api</exclude>\n                                        <exclude>org.glassfish:javax.json</exclude>\n                                        <exclude>org.glassfish:javax.el</exclude>\n                                        <exclude>javax.persistence:javax.persistence-api</exclude>\n                                        <exclude>javax.persistence:persistence-api</exclude>\n                                        <exclude>javax.security.enterprise:javax.security.enterprise-api</exclude>\n                                        <exclude>javax.servlet:servlet-api</exclude>\n                                        <exclude>javax.servlet:javax.servlet-api</exclude>\n                                        <exclude>javax.transaction:jta</exclude>\n                                        <exclude>javax.transaction:javax.transaction-api</exclude>\n                                        <exclude>javax.validation:validation-api</exclude>\n                                        <exclude>javax.xml.bind:jaxb-api</exclude>\n                                        <exclude>javax.websocket:javax.websocket-api</exclude>\n                                        <exclude>javax.ws.rs:javax.ws.rs-api</exclude>\n                                        <exclude>com.sun.activation:jakarta.activation</exclude>\n                                        <exclude>commons-logging:commons-logging-api</exclude>\n                                        <exclude>concurrent:concurrent</exclude>\n                                        <exclude>com.google.code.findbugs:annotations</exclude>\n                                        <exclude>com.google.code.findbugs:jsr305</exclude>\n                                        <exclude>jboss:jboss-logging-spi</exclude>\n                                        <exclude>org.apache.xalan:serializer</exclude>\n                                        <exclude>org.apache.xalan:xalan</exclude>\n                                        <exclude>org.slf4j:slf4j-nop</exclude>\n                                        <exclude>org.slf4j:slf4j-jdk14</exclude>\n                                        <exclude>org.slf4j:slf4j-log4j12</exclude>\n                                        <exclude>org.slf4j:slf4j-log4j13</exclude>\n                                        <exclude>stax:stax-api</exclude>\n                                        <exclude>sun-jaxb:jaxb-api</exclude>\n                                        <exclude>trove:trove</exclude>\n                                        <exclude>woodstox:wstx-lgpl</exclude>\n                                        <exclude>xml-apis:xml-apis</exclude>\n                                        <exclude>com.google.inject.extensions:guice-servlet</exclude>\n                                        <exclude>com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider</exclude>\n                                        <exclude>org.apache.logging.log4j:log4j</exclude>\n                                        <exclude>log4j:log4j</exclude>\n                                    </excludes>\n                                </bannedDependencies>\n                            </rules>\n                            <skip>${enforcer.skip}</skip>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n    <profiles>\n        <!-- Profile for building Che faster by skipping unit tests, license checks and other enforcement features -->\n        <profile>\n            <id>fast</id>\n            <properties>\n                <findbugs.skip>true</findbugs.skip>\n                <fmt.skip>true</fmt.skip>\n                <license.skip>true</license.skip>\n                <mdep.analyze.skip>true</mdep.analyze.skip>\n                <skipTests>true</skipTests>\n            </properties>\n        </profile>\n        <profile>\n            <id>validate-sources</id>\n            <activation>\n                <property>\n                    <name>!skip-validate-sources</name>\n                </property>\n            </activation>\n            <build>\n                <plugins>\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-compiler-plugin</artifactId>\n                        <version>${maven.compiler.plugin.version}</version>\n                        <configuration>\n                            <release>${java.target.version}</release>\n                            <compilerArgs>\n                                <arg>-XDcompilePolicy=simple</arg>\n                                <arg>--should-stop=ifError=FLOW</arg>\n                                <arg>-Xplugin:ErrorProne</arg>\n                            </compilerArgs>\n                            <annotationProcessorPaths>\n                                <path>\n                                    <groupId>com.google.errorprone</groupId>\n                                    <artifactId>error_prone_core</artifactId>\n                                    <version>${com.google.errorprone}</version>\n                                </path>\n                            </annotationProcessorPaths>\n                        </configuration>\n                    </plugin>\n                    <plugin>\n                        <groupId>com.google.code.sortpom</groupId>\n                        <artifactId>maven-sortpom-plugin</artifactId>\n                        <executions>\n                            <execution>\n                                <phase>validate</phase>\n                                <goals>\n                                    <goal>verify</goal>\n                                </goals>\n                            </execution>\n                        </executions>\n                    </plugin>\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-dependency-plugin</artifactId>\n                        <executions>\n                            <execution>\n                                <id>analyze</id>\n                                <goals>\n                                    <goal>analyze-only</goal>\n                                </goals>\n                                <configuration>\n                                    <failOnWarning>true</failOnWarning>\n                                    <ignoreNonCompile>true</ignoreNonCompile>\n                                    <outputXML>true</outputXML>\n                                </configuration>\n                            </execution>\n                        </executions>\n                    </plugin>\n                    <plugin>\n                        <groupId>com.spotify.fmt</groupId>\n                        <artifactId>fmt-maven-plugin</artifactId>\n                        <version>${maven.fmt.plugin.version}</version>\n                        <executions>\n                            <execution>\n                                <goals>\n                                    <goal>check</goal>\n                                </goals>\n                            </execution>\n                        </executions>\n                        <dependencies>\n                            <dependency>\n                                <groupId>com.google.googlejavaformat</groupId>\n                                <artifactId>google-java-format</artifactId>\n                                <version>${maven.google-java-format.version}</version>\n                            </dependency>\n                        </dependencies>\n                    </plugin>\n                    <!-- Adding header to file -->\n                    <plugin>\n                        <groupId>com.mycila</groupId>\n                        <artifactId>license-maven-plugin</artifactId>\n                        <executions>\n                            <execution>\n                                <id>check-headers</id>\n                                <phase>validate</phase>\n                                <goals>\n                                    <goal>check</goal>\n                                </goals>\n                            </execution>\n                        </executions>\n                    </plugin>\n                </plugins>\n            </build>\n        </profile>\n    </profiles>\n</project>\n"
  },
  {
    "path": "typescript-dto/.gitignore",
    "content": "index.d.ts\ntarget/\n"
  },
  {
    "path": "typescript-dto/.yarn/releases/yarn-4.12.0.cjs",
    "content": "#!/usr/bin/env node\n/* eslint-disable */\n//prettier-ignore\n(()=>{var xGe=Object.create;var mU=Object.defineProperty;var kGe=Object.getOwnPropertyDescriptor;var QGe=Object.getOwnPropertyNames;var TGe=Object.getPrototypeOf,RGe=Object.prototype.hasOwnProperty;var Ie=(t=>typeof require<\"u\"?require:typeof Proxy<\"u\"?new Proxy(t,{get:(e,r)=>(typeof require<\"u\"?require:e)[r]}):t)(function(t){if(typeof require<\"u\")return require.apply(this,arguments);throw Error('Dynamic require of \"'+t+'\" is not supported')});var Xe=(t,e)=>()=>(t&&(e=t(t=0)),e);var _=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Vt=(t,e)=>{for(var r in e)mU(t,r,{get:e[r],enumerable:!0})},FGe=(t,e,r,s)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let a of QGe(e))!RGe.call(t,a)&&a!==r&&mU(t,a,{get:()=>e[a],enumerable:!(s=kGe(e,a))||s.enumerable});return t};var ut=(t,e,r)=>(r=t!=null?xGe(TGe(t)):{},FGe(e||!t||!t.__esModule?mU(r,\"default\",{value:t,enumerable:!0}):r,t));var fi={};Vt(fi,{SAFE_TIME:()=>WZ,S_IFDIR:()=>JP,S_IFLNK:()=>KP,S_IFMT:()=>Mf,S_IFREG:()=>N2});var Mf,JP,N2,KP,WZ,YZ=Xe(()=>{Mf=61440,JP=16384,N2=32768,KP=40960,WZ=456789e3});var or={};Vt(or,{EBADF:()=>Mo,EBUSY:()=>NGe,EEXIST:()=>HGe,EINVAL:()=>LGe,EISDIR:()=>_Ge,ENOENT:()=>MGe,ENOSYS:()=>OGe,ENOTDIR:()=>UGe,ENOTEMPTY:()=>GGe,EOPNOTSUPP:()=>qGe,EROFS:()=>jGe,ERR_DIR_CLOSED:()=>yU});function Cc(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function NGe(t){return Cc(\"EBUSY\",t)}function OGe(t,e){return Cc(\"ENOSYS\",`${t}, ${e}`)}function LGe(t){return Cc(\"EINVAL\",`invalid argument, ${t}`)}function Mo(t){return Cc(\"EBADF\",`bad file descriptor, ${t}`)}function MGe(t){return Cc(\"ENOENT\",`no such file or directory, ${t}`)}function UGe(t){return Cc(\"ENOTDIR\",`not a directory, ${t}`)}function _Ge(t){return Cc(\"EISDIR\",`illegal operation on a directory, ${t}`)}function HGe(t){return Cc(\"EEXIST\",`file already exists, ${t}`)}function jGe(t){return Cc(\"EROFS\",`read-only filesystem, ${t}`)}function GGe(t){return Cc(\"ENOTEMPTY\",`directory not empty, ${t}`)}function qGe(t){return Cc(\"EOPNOTSUPP\",`operation not supported, ${t}`)}function yU(){return Cc(\"ERR_DIR_CLOSED\",\"Directory handle was closed\")}var zP=Xe(()=>{});var $a={};Vt($a,{BigIntStatsEntry:()=>iE,DEFAULT_MODE:()=>CU,DirEntry:()=>EU,StatEntry:()=>nE,areStatsEqual:()=>wU,clearStats:()=>XP,convertToBigIntStats:()=>YGe,makeDefaultStats:()=>VZ,makeEmptyStats:()=>WGe});function VZ(){return new nE}function WGe(){return XP(VZ())}function XP(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r==\"number\"?t[e]=0:typeof r==\"bigint\"?t[e]=BigInt(0):IU.types.isDate(r)&&(t[e]=new Date(0))}return t}function YGe(t){let e=new iE;for(let r in t)if(Object.hasOwn(t,r)){let s=t[r];typeof s==\"number\"?e[r]=BigInt(s):IU.types.isDate(s)&&(e[r]=new Date(s))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function wU(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,s=e;return!(r.atimeNs!==s.atimeNs||r.mtimeNs!==s.mtimeNs||r.ctimeNs!==s.ctimeNs||r.birthtimeNs!==s.birthtimeNs)}var IU,CU,EU,nE,iE,BU=Xe(()=>{IU=ut(Ie(\"util\")),CU=33188,EU=class{constructor(){this.name=\"\";this.path=\"\";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},nE=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=CU;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},iE=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(CU);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}}});function XGe(t){let e,r;if(e=t.match(KGe))t=e[1];else if(r=t.match(zGe))t=`\\\\\\\\${r[1]?\".\\\\\":\"\"}${r[2]}`;else return t;return t.replace(/\\//g,\"\\\\\")}function ZGe(t){t=t.replace(/\\\\/g,\"/\");let e,r;return(e=t.match(VGe))?t=`/${e[1]}`:(r=t.match(JGe))&&(t=`/unc/${r[1]?\".dot/\":\"\"}${r[2]}`),t}function ZP(t,e){return t===fe?KZ(e):vU(e)}var O2,vt,Er,fe,J,JZ,VGe,JGe,KGe,zGe,vU,KZ,el=Xe(()=>{O2=ut(Ie(\"path\")),vt={root:\"/\",dot:\".\",parent:\"..\"},Er={home:\"~\",nodeModules:\"node_modules\",manifest:\"package.json\",lockfile:\"yarn.lock\",virtual:\"__virtual__\",pnpJs:\".pnp.js\",pnpCjs:\".pnp.cjs\",pnpData:\".pnp.data.json\",pnpEsmLoader:\".pnp.loader.mjs\",rc:\".yarnrc.yml\",env:\".env\"},fe=Object.create(O2.default),J=Object.create(O2.default.posix);fe.cwd=()=>process.cwd();J.cwd=process.platform===\"win32\"?()=>vU(process.cwd()):process.cwd;process.platform===\"win32\"&&(J.resolve=(...t)=>t.length>0&&J.isAbsolute(t[0])?O2.default.posix.resolve(...t):O2.default.posix.resolve(J.cwd(),...t));JZ=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?\".\":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};fe.contains=(t,e)=>JZ(fe,t,e);J.contains=(t,e)=>JZ(J,t,e);VGe=/^([a-zA-Z]:.*)$/,JGe=/^\\/\\/(\\.\\/)?(.*)$/,KGe=/^\\/([a-zA-Z]:.*)$/,zGe=/^\\/unc\\/(\\.dot\\/)?(.*)$/;vU=process.platform===\"win32\"?ZGe:t=>t,KZ=process.platform===\"win32\"?XGe:t=>t;fe.fromPortablePath=KZ;fe.toPortablePath=vU});async function $P(t,e){let r=\"0123456789abcdef\";await t.mkdirPromise(e.indexPath,{recursive:!0});let s=[];for(let a of r)for(let n of r)s.push(t.mkdirPromise(t.pathUtils.join(e.indexPath,`${a}${n}`),{recursive:!0}));return await Promise.all(s),e.indexPath}async function zZ(t,e,r,s,a){let n=t.pathUtils.normalize(e),c=r.pathUtils.normalize(s),f=[],p=[],{atime:h,mtime:E}=a.stableTime?{atime:dd,mtime:dd}:await r.lstatPromise(c);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[h,E]}),await SU(f,p,t,n,r,c,{...a,didParentExist:!0});for(let C of f)await C();await Promise.all(p.map(C=>C()))}async function SU(t,e,r,s,a,n,c){let f=c.didParentExist?await XZ(r,s):null,p=await a.lstatPromise(n),{atime:h,mtime:E}=c.stableTime?{atime:dd,mtime:dd}:p,C;switch(!0){case p.isDirectory():C=await e5e(t,e,r,s,f,a,n,p,c);break;case p.isFile():C=await n5e(t,e,r,s,f,a,n,p,c);break;case p.isSymbolicLink():C=await i5e(t,e,r,s,f,a,n,p,c);break;default:throw new Error(`Unsupported file type (${p.mode})`)}return(c.linkStrategy?.type!==\"HardlinkFromIndex\"||!p.isFile())&&((C||f?.mtime?.getTime()!==E.getTime()||f?.atime?.getTime()!==h.getTime())&&(e.push(()=>r.lutimesPromise(s,h,E)),C=!0),(f===null||(f.mode&511)!==(p.mode&511))&&(e.push(()=>r.chmodPromise(s,p.mode&511)),C=!0)),C}async function XZ(t,e){try{return await t.lstatPromise(e)}catch{return null}}async function e5e(t,e,r,s,a,n,c,f,p){if(a!==null&&!a.isDirectory())if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1;let h=!1;a===null&&(t.push(async()=>{try{await r.mkdirPromise(s,{mode:f.mode})}catch(S){if(S.code!==\"EEXIST\")throw S}}),h=!0);let E=await n.readdirPromise(c),C=p.didParentExist&&!a?{...p,didParentExist:!1}:p;if(p.stableSort)for(let S of E.sort())await SU(t,e,r,r.pathUtils.join(s,S),n,n.pathUtils.join(c,S),C)&&(h=!0);else(await Promise.all(E.map(async P=>{await SU(t,e,r,r.pathUtils.join(s,P),n,n.pathUtils.join(c,P),C)}))).some(P=>P)&&(h=!0);return h}async function t5e(t,e,r,s,a,n,c,f,p,h){let E=await n.checksumFilePromise(c,{algorithm:\"sha1\"}),C=420,S=f.mode&511,P=`${E}${S!==C?S.toString(8):\"\"}`,I=r.pathUtils.join(h.indexPath,E.slice(0,2),`${P}.dat`),R;(le=>(le[le.Lock=0]=\"Lock\",le[le.Rename=1]=\"Rename\"))(R||={});let N=1,U=await XZ(r,I);if(a){let ie=U&&a.dev===U.dev&&a.ino===U.ino,ue=U?.mtimeMs!==$Ge;if(ie&&ue&&h.autoRepair&&(N=0,U=null),!ie)if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1}let W=!U&&N===1?`${I}.${Math.floor(Math.random()*4294967296).toString(16).padStart(8,\"0\")}`:null,ee=!1;return t.push(async()=>{if(!U&&(N===0&&await r.lockPromise(I,async()=>{let ie=await n.readFilePromise(c);await r.writeFilePromise(I,ie)}),N===1&&W)){let ie=await n.readFilePromise(c);await r.writeFilePromise(W,ie);try{await r.linkPromise(W,I)}catch(ue){if(ue.code===\"EEXIST\")ee=!0,await r.unlinkPromise(W);else throw ue}}a||await r.linkPromise(I,s)}),e.push(async()=>{U||(await r.lutimesPromise(I,dd,dd),S!==C&&await r.chmodPromise(I,S)),W&&!ee&&await r.unlinkPromise(W)}),!1}async function r5e(t,e,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1;return t.push(async()=>{let h=await n.readFilePromise(c);await r.writeFilePromise(s,h)}),!0}async function n5e(t,e,r,s,a,n,c,f,p){return p.linkStrategy?.type===\"HardlinkFromIndex\"?t5e(t,e,r,s,a,n,c,f,p,p.linkStrategy):r5e(t,e,r,s,a,n,c,f,p)}async function i5e(t,e,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1;return t.push(async()=>{await r.symlinkPromise(ZP(r.pathUtils,await n.readlinkPromise(c)),s)}),!0}var dd,$Ge,DU=Xe(()=>{el();dd=new Date(456789e3*1e3),$Ge=dd.getTime()});function ex(t,e,r,s){let a=()=>{let n=r.shift();if(typeof n>\"u\")return null;let c=t.pathUtils.join(e,n);return Object.assign(t.statSync(c),{name:n,path:void 0})};return new L2(e,a,s)}var L2,ZZ=Xe(()=>{zP();L2=class{constructor(e,r,s={}){this.path=e;this.nextDirent=r;this.opts=s;this.closed=!1}throwIfClosed(){if(this.closed)throw yU()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e<\"u\"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<\"u\"?e(null):Promise.resolve()}closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}}});function $Z(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var e$,tx,t$=Xe(()=>{e$=Ie(\"events\");BU();tx=class t extends e$.EventEmitter{constructor(r,s,{bigint:a=!1}={}){super();this.status=\"ready\";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=r,this.path=s,this.bigint=a,this.lastStats=this.stat()}static create(r,s,a){let n=new t(r,s,a);return n.start(),n}start(){$Z(this.status,\"ready\"),this.status=\"running\",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(\"change\",this.lastStats,this.lastStats)},3)}stop(){$Z(this.status,\"running\"),this.status=\"stopped\",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(\"stop\")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let r=this.bigint?new iE:new nE;return XP(r)}}makeInterval(r){let s=setInterval(()=>{let a=this.stat(),n=this.lastStats;wU(a,n)||(this.lastStats=a,this.emit(\"change\",a,n))},r.interval);return r.persistent?s:s.unref()}registerChangeListener(r,s){this.addListener(\"change\",r),this.changeListeners.set(r,this.makeInterval(s))}unregisterChangeListener(r){this.removeListener(\"change\",r);let s=this.changeListeners.get(r);typeof s<\"u\"&&clearInterval(s),this.changeListeners.delete(r)}unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())this.unregisterChangeListener(r)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let r of this.changeListeners.values())r.ref();return this}unref(){for(let r of this.changeListeners.values())r.unref();return this}}});function sE(t,e,r,s){let a,n,c,f;switch(typeof r){case\"function\":a=!1,n=!0,c=5007,f=r;break;default:({bigint:a=!1,persistent:n=!0,interval:c=5007}=r),f=s;break}let p=rx.get(t);typeof p>\"u\"&&rx.set(t,p=new Map);let h=p.get(e);return typeof h>\"u\"&&(h=tx.create(t,e,{bigint:a}),p.set(e,h)),h.registerChangeListener(f,{persistent:n,interval:c}),h}function md(t,e,r){let s=rx.get(t);if(typeof s>\"u\")return;let a=s.get(e);typeof a>\"u\"||(typeof r>\"u\"?a.unregisterAllChangeListeners():a.unregisterChangeListener(r),a.hasChangeListeners()||(a.stop(),s.delete(e)))}function yd(t){let e=rx.get(t);if(!(typeof e>\"u\"))for(let r of e.keys())md(t,r)}var rx,bU=Xe(()=>{t$();rx=new WeakMap});function s5e(t){let e=t.match(/\\r?\\n/g);if(e===null)return n$.EOL;let r=e.filter(a=>a===`\\r\n`).length,s=e.length-r;return r>s?`\\r\n`:`\n`}function Ed(t,e){return e.replace(/\\r?\\n/g,s5e(t))}var r$,n$,mp,Uf,Id=Xe(()=>{r$=Ie(\"crypto\"),n$=Ie(\"os\");DU();el();mp=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let s=[e];for(;s.length>0;){let a=s.shift();if((await this.lstatPromise(a)).isDirectory()){let c=await this.readdirPromise(a);if(r)for(let f of c.sort())s.push(this.pathUtils.join(a,f));else throw new Error(\"Not supported\")}else yield a}}async checksumFilePromise(e,{algorithm:r=\"sha512\"}={}){let s=await this.openPromise(e,\"r\");try{let n=Buffer.allocUnsafeSlow(65536),c=(0,r$.createHash)(r),f=0;for(;(f=await this.readPromise(s,n,0,65536))!==0;)c.update(f===65536?n:n.slice(0,f));return c.digest(\"hex\")}finally{await this.closePromise(s)}}async removePromise(e,{recursive:r=!0,maxRetries:s=5}={}){let a;try{a=await this.lstatPromise(e)}catch(n){if(n.code===\"ENOENT\")return;throw n}if(a.isDirectory()){if(r){let n=await this.readdirPromise(e);await Promise.all(n.map(c=>this.removePromise(this.pathUtils.resolve(e,c))))}for(let n=0;n<=s;n++)try{await this.rmdirPromise(e);break}catch(c){if(c.code!==\"EBUSY\"&&c.code!==\"ENOTEMPTY\")throw c;n<s&&await new Promise(f=>setTimeout(f,n*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:r=!0}={}){let s;try{s=this.lstatSync(e)}catch(a){if(a.code===\"ENOENT\")return;throw a}if(s.isDirectory()){if(r)for(let a of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,a));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:r,utimes:s}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let c=2;c<=a.length;++c){let f=a.slice(0,c).join(this.pathUtils.sep);if(!this.existsSync(f)){try{await this.mkdirPromise(f)}catch(p){if(p.code===\"EEXIST\")continue;throw p}if(n??=f,r!=null&&await this.chmodPromise(f,r),s!=null)await this.utimesPromise(f,s[0],s[1]);else{let p=await this.statPromise(this.pathUtils.dirname(f));await this.utimesPromise(f,p.atime,p.mtime)}}}return n}mkdirpSync(e,{chmod:r,utimes:s}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let c=2;c<=a.length;++c){let f=a.slice(0,c).join(this.pathUtils.sep);if(!this.existsSync(f)){try{this.mkdirSync(f)}catch(p){if(p.code===\"EEXIST\")continue;throw p}if(n??=f,r!=null&&this.chmodSync(f,r),s!=null)this.utimesSync(f,s[0],s[1]);else{let p=this.statSync(this.pathUtils.dirname(f));this.utimesSync(f,p.atime,p.mtime)}}}return n}async copyPromise(e,r,{baseFs:s=this,overwrite:a=!0,stableSort:n=!1,stableTime:c=!1,linkStrategy:f=null}={}){return await zZ(this,e,s,r,{overwrite:a,stableSort:n,stableTime:c,linkStrategy:f})}copySync(e,r,{baseFs:s=this,overwrite:a=!0}={}){let n=s.lstatSync(r),c=this.existsSync(e);if(n.isDirectory()){this.mkdirpSync(e);let p=s.readdirSync(r);for(let h of p)this.copySync(this.pathUtils.join(e,h),s.pathUtils.join(r,h),{baseFs:s,overwrite:a})}else if(n.isFile()){if(!c||a){c&&this.removeSync(e);let p=s.readFileSync(r);this.writeFileSync(e,p)}}else if(n.isSymbolicLink()){if(!c||a){c&&this.removeSync(e);let p=s.readlinkSync(r);this.symlinkSync(ZP(this.pathUtils,p),e)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${n.mode.toString(8).padStart(6,\"0\")})`);let f=n.mode&511;this.chmodSync(e,f)}async changeFilePromise(e,r,s={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(e,r,s):this.changeFileTextPromise(e,r,s)}async changeFileBufferPromise(e,r,{mode:s}={}){let a=Buffer.alloc(0);try{a=await this.readFilePromise(e)}catch{}Buffer.compare(a,r)!==0&&await this.writeFilePromise(e,r,{mode:s})}async changeFileTextPromise(e,r,{automaticNewlines:s,mode:a}={}){let n=\"\";try{n=await this.readFilePromise(e,\"utf8\")}catch{}let c=s?Ed(n,r):r;n!==c&&await this.writeFilePromise(e,c,{mode:a})}changeFileSync(e,r,s={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(e,r,s):this.changeFileTextSync(e,r,s)}changeFileBufferSync(e,r,{mode:s}={}){let a=Buffer.alloc(0);try{a=this.readFileSync(e)}catch{}Buffer.compare(a,r)!==0&&this.writeFileSync(e,r,{mode:s})}changeFileTextSync(e,r,{automaticNewlines:s=!1,mode:a}={}){let n=\"\";try{n=this.readFileSync(e,\"utf8\")}catch{}let c=s?Ed(n,r):r;n!==c&&this.writeFileSync(e,c,{mode:a})}async movePromise(e,r){try{await this.renamePromise(e,r)}catch(s){if(s.code===\"EXDEV\")await this.copyPromise(r,e),await this.removePromise(e);else throw s}}moveSync(e,r){try{this.renameSync(e,r)}catch(s){if(s.code===\"EXDEV\")this.copySync(r,e),this.removeSync(e);else throw s}}async lockPromise(e,r){let s=`${e}.flock`,a=1e3/60,n=Date.now(),c=null,f=async()=>{let p;try{[p]=await this.readJsonPromise(s)}catch{return Date.now()-n<500}try{return process.kill(p,0),!0}catch{return!1}};for(;c===null;)try{c=await this.openPromise(s,\"wx\")}catch(p){if(p.code===\"EEXIST\"){if(!await f())try{await this.unlinkPromise(s);continue}catch{}if(Date.now()-n<60*1e3)await new Promise(h=>setTimeout(h,a));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${s})`)}else throw p}await this.writePromise(c,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(c),await this.unlinkPromise(s)}catch{}}}async readJsonPromise(e){let r=await this.readFilePromise(e,\"utf8\");try{return JSON.parse(r)}catch(s){throw s.message+=` (in ${e})`,s}}readJsonSync(e){let r=this.readFileSync(e,\"utf8\");try{return JSON.parse(r)}catch(s){throw s.message+=` (in ${e})`,s}}async writeJsonPromise(e,r,{compact:s=!1}={}){let a=s?0:2;return await this.writeFilePromise(e,`${JSON.stringify(r,null,a)}\n`)}writeJsonSync(e,r,{compact:s=!1}={}){let a=s?0:2;return this.writeFileSync(e,`${JSON.stringify(r,null,a)}\n`)}async preserveTimePromise(e,r){let s=await this.lstatPromise(e),a=await r();typeof a<\"u\"&&(e=a),await this.lutimesPromise(e,s.atime,s.mtime)}async preserveTimeSync(e,r){let s=this.lstatSync(e),a=r();typeof a<\"u\"&&(e=a),this.lutimesSync(e,s.atime,s.mtime)}},Uf=class extends mp{constructor(){super(J)}}});var _s,yp=Xe(()=>{Id();_s=class extends mp{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,s){return this.baseFs.openPromise(this.mapToBase(e),r,s)}openSync(e,r,s){return this.baseFs.openSync(this.mapToBase(e),r,s)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,s,a,n){return await this.baseFs.readPromise(e,r,s,a,n)}readSync(e,r,s,a,n){return this.baseFs.readSync(e,r,s,a,n)}async writePromise(e,r,s,a,n){return typeof r==\"string\"?await this.baseFs.writePromise(e,r,s):await this.baseFs.writePromise(e,r,s,a,n)}writeSync(e,r,s,a,n){return typeof r==\"string\"?this.baseFs.writeSync(e,r,s):this.baseFs.writeSync(e,r,s,a,n)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async fchownPromise(e,r,s){return this.baseFs.fchownPromise(e,r,s)}fchownSync(e,r,s){return this.baseFs.fchownSync(e,r,s)}async chownPromise(e,r,s){return this.baseFs.chownPromise(this.mapToBase(e),r,s)}chownSync(e,r,s){return this.baseFs.chownSync(this.mapToBase(e),r,s)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,s=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),s)}copyFileSync(e,r,s=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),s)}async appendFilePromise(e,r,s){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,s)}appendFileSync(e,r,s){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,s)}async writeFilePromise(e,r,s){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,s)}writeFileSync(e,r,s){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,s)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,s){return this.baseFs.utimesPromise(this.mapToBase(e),r,s)}utimesSync(e,r,s){return this.baseFs.utimesSync(this.mapToBase(e),r,s)}async lutimesPromise(e,r,s){return this.baseFs.lutimesPromise(this.mapToBase(e),r,s)}lutimesSync(e,r,s){return this.baseFs.lutimesSync(this.mapToBase(e),r,s)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async rmPromise(e,r){return this.baseFs.rmPromise(this.mapToBase(e),r)}rmSync(e,r){return this.baseFs.rmSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,s){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),a,s);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),c=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkPromise(c,a,s)}symlinkSync(e,r,s){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),a,s);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),c=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkSync(c,a,s)}async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}watch(e,r,s){return this.baseFs.watch(this.mapToBase(e),r,s)}watchFile(e,r,s){return this.baseFs.watchFile(this.mapToBase(e),r,s)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e==\"number\"?e:this.mapToBase(e)}}});var _f,i$=Xe(()=>{yp();_f=class extends _s{constructor(e,{baseFs:r,pathUtils:s}){super(s),this.target=e,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}}});function s$(t){let e=t;return typeof t.path==\"string\"&&(e.path=fe.toPortablePath(t.path)),e}var o$,Yn,Cd=Xe(()=>{o$=ut(Ie(\"fs\"));Id();el();Yn=class extends Uf{constructor(e=o$.default){super(),this.realFs=e}getExtractHint(){return!1}getRealPath(){return vt.root}resolve(e){return J.resolve(e)}async openPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.open(fe.fromPortablePath(e),r,s,this.makeCallback(a,n))})}openSync(e,r,s){return this.realFs.openSync(fe.fromPortablePath(e),r,s)}async opendirPromise(e,r){return await new Promise((s,a)=>{typeof r<\"u\"?this.realFs.opendir(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.opendir(fe.fromPortablePath(e),this.makeCallback(s,a))}).then(s=>{let a=s;return Object.defineProperty(a,\"path\",{value:e,configurable:!0,writable:!0}),a})}opendirSync(e,r){let a=typeof r<\"u\"?this.realFs.opendirSync(fe.fromPortablePath(e),r):this.realFs.opendirSync(fe.fromPortablePath(e));return Object.defineProperty(a,\"path\",{value:e,configurable:!0,writable:!0}),a}async readPromise(e,r,s=0,a=0,n=-1){return await new Promise((c,f)=>{this.realFs.read(e,r,s,a,n,(p,h)=>{p?f(p):c(h)})})}readSync(e,r,s,a,n){return this.realFs.readSync(e,r,s,a,n)}async writePromise(e,r,s,a,n){return await new Promise((c,f)=>typeof r==\"string\"?this.realFs.write(e,r,s,this.makeCallback(c,f)):this.realFs.write(e,r,s,a,n,this.makeCallback(c,f)))}writeSync(e,r,s,a,n){return typeof r==\"string\"?this.realFs.writeSync(e,r,s):this.realFs.writeSync(e,r,s,a,n)}async closePromise(e){await new Promise((r,s)=>{this.realFs.close(e,this.makeCallback(r,s))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,r){let s=e!==null?fe.fromPortablePath(e):e;return this.realFs.createReadStream(s,r)}createWriteStream(e,r){let s=e!==null?fe.fromPortablePath(e):e;return this.realFs.createWriteStream(s,r)}async realpathPromise(e){return await new Promise((r,s)=>{this.realFs.realpath(fe.fromPortablePath(e),{},this.makeCallback(r,s))}).then(r=>fe.toPortablePath(r))}realpathSync(e){return fe.toPortablePath(this.realFs.realpathSync(fe.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(r=>{this.realFs.exists(fe.fromPortablePath(e),r)})}accessSync(e,r){return this.realFs.accessSync(fe.fromPortablePath(e),r)}async accessPromise(e,r){return await new Promise((s,a)=>{this.realFs.access(fe.fromPortablePath(e),r,this.makeCallback(s,a))})}existsSync(e){return this.realFs.existsSync(fe.fromPortablePath(e))}async statPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.stat(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.stat(fe.fromPortablePath(e),this.makeCallback(s,a))})}statSync(e,r){return r?this.realFs.statSync(fe.fromPortablePath(e),r):this.realFs.statSync(fe.fromPortablePath(e))}async fstatPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.fstat(e,r,this.makeCallback(s,a)):this.realFs.fstat(e,this.makeCallback(s,a))})}fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync(e)}async lstatPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.lstat(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.lstat(fe.fromPortablePath(e),this.makeCallback(s,a))})}lstatSync(e,r){return r?this.realFs.lstatSync(fe.fromPortablePath(e),r):this.realFs.lstatSync(fe.fromPortablePath(e))}async fchmodPromise(e,r){return await new Promise((s,a)=>{this.realFs.fchmod(e,r,this.makeCallback(s,a))})}fchmodSync(e,r){return this.realFs.fchmodSync(e,r)}async chmodPromise(e,r){return await new Promise((s,a)=>{this.realFs.chmod(fe.fromPortablePath(e),r,this.makeCallback(s,a))})}chmodSync(e,r){return this.realFs.chmodSync(fe.fromPortablePath(e),r)}async fchownPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.fchown(e,r,s,this.makeCallback(a,n))})}fchownSync(e,r,s){return this.realFs.fchownSync(e,r,s)}async chownPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.chown(fe.fromPortablePath(e),r,s,this.makeCallback(a,n))})}chownSync(e,r,s){return this.realFs.chownSync(fe.fromPortablePath(e),r,s)}async renamePromise(e,r){return await new Promise((s,a)=>{this.realFs.rename(fe.fromPortablePath(e),fe.fromPortablePath(r),this.makeCallback(s,a))})}renameSync(e,r){return this.realFs.renameSync(fe.fromPortablePath(e),fe.fromPortablePath(r))}async copyFilePromise(e,r,s=0){return await new Promise((a,n)=>{this.realFs.copyFile(fe.fromPortablePath(e),fe.fromPortablePath(r),s,this.makeCallback(a,n))})}copyFileSync(e,r,s=0){return this.realFs.copyFileSync(fe.fromPortablePath(e),fe.fromPortablePath(r),s)}async appendFilePromise(e,r,s){return await new Promise((a,n)=>{let c=typeof e==\"string\"?fe.fromPortablePath(e):e;s?this.realFs.appendFile(c,r,s,this.makeCallback(a,n)):this.realFs.appendFile(c,r,this.makeCallback(a,n))})}appendFileSync(e,r,s){let a=typeof e==\"string\"?fe.fromPortablePath(e):e;s?this.realFs.appendFileSync(a,r,s):this.realFs.appendFileSync(a,r)}async writeFilePromise(e,r,s){return await new Promise((a,n)=>{let c=typeof e==\"string\"?fe.fromPortablePath(e):e;s?this.realFs.writeFile(c,r,s,this.makeCallback(a,n)):this.realFs.writeFile(c,r,this.makeCallback(a,n))})}writeFileSync(e,r,s){let a=typeof e==\"string\"?fe.fromPortablePath(e):e;s?this.realFs.writeFileSync(a,r,s):this.realFs.writeFileSync(a,r)}async unlinkPromise(e){return await new Promise((r,s)=>{this.realFs.unlink(fe.fromPortablePath(e),this.makeCallback(r,s))})}unlinkSync(e){return this.realFs.unlinkSync(fe.fromPortablePath(e))}async utimesPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.utimes(fe.fromPortablePath(e),r,s,this.makeCallback(a,n))})}utimesSync(e,r,s){this.realFs.utimesSync(fe.fromPortablePath(e),r,s)}async lutimesPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.lutimes(fe.fromPortablePath(e),r,s,this.makeCallback(a,n))})}lutimesSync(e,r,s){this.realFs.lutimesSync(fe.fromPortablePath(e),r,s)}async mkdirPromise(e,r){return await new Promise((s,a)=>{this.realFs.mkdir(fe.fromPortablePath(e),r,this.makeCallback(s,a))})}mkdirSync(e,r){return this.realFs.mkdirSync(fe.fromPortablePath(e),r)}async rmdirPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.rmdir(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.rmdir(fe.fromPortablePath(e),this.makeCallback(s,a))})}rmdirSync(e,r){return this.realFs.rmdirSync(fe.fromPortablePath(e),r)}async rmPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.rm(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.rm(fe.fromPortablePath(e),this.makeCallback(s,a))})}rmSync(e,r){return this.realFs.rmSync(fe.fromPortablePath(e),r)}async linkPromise(e,r){return await new Promise((s,a)=>{this.realFs.link(fe.fromPortablePath(e),fe.fromPortablePath(r),this.makeCallback(s,a))})}linkSync(e,r){return this.realFs.linkSync(fe.fromPortablePath(e),fe.fromPortablePath(r))}async symlinkPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.symlink(fe.fromPortablePath(e.replace(/\\/+$/,\"\")),fe.fromPortablePath(r),s,this.makeCallback(a,n))})}symlinkSync(e,r,s){return this.realFs.symlinkSync(fe.fromPortablePath(e.replace(/\\/+$/,\"\")),fe.fromPortablePath(r),s)}async readFilePromise(e,r){return await new Promise((s,a)=>{let n=typeof e==\"string\"?fe.fromPortablePath(e):e;this.realFs.readFile(n,r,this.makeCallback(s,a))})}readFileSync(e,r){let s=typeof e==\"string\"?fe.fromPortablePath(e):e;return this.realFs.readFileSync(s,r)}async readdirPromise(e,r){return await new Promise((s,a)=>{r?r.recursive&&process.platform===\"win32\"?r.withFileTypes?this.realFs.readdir(fe.fromPortablePath(e),r,this.makeCallback(n=>s(n.map(s$)),a)):this.realFs.readdir(fe.fromPortablePath(e),r,this.makeCallback(n=>s(n.map(fe.toPortablePath)),a)):this.realFs.readdir(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.readdir(fe.fromPortablePath(e),this.makeCallback(s,a))})}readdirSync(e,r){return r?r.recursive&&process.platform===\"win32\"?r.withFileTypes?this.realFs.readdirSync(fe.fromPortablePath(e),r).map(s$):this.realFs.readdirSync(fe.fromPortablePath(e),r).map(fe.toPortablePath):this.realFs.readdirSync(fe.fromPortablePath(e),r):this.realFs.readdirSync(fe.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((r,s)=>{this.realFs.readlink(fe.fromPortablePath(e),this.makeCallback(r,s))}).then(r=>fe.toPortablePath(r))}readlinkSync(e){return fe.toPortablePath(this.realFs.readlinkSync(fe.fromPortablePath(e)))}async truncatePromise(e,r){return await new Promise((s,a)=>{this.realFs.truncate(fe.fromPortablePath(e),r,this.makeCallback(s,a))})}truncateSync(e,r){return this.realFs.truncateSync(fe.fromPortablePath(e),r)}async ftruncatePromise(e,r){return await new Promise((s,a)=>{this.realFs.ftruncate(e,r,this.makeCallback(s,a))})}ftruncateSync(e,r){return this.realFs.ftruncateSync(e,r)}watch(e,r,s){return this.realFs.watch(fe.fromPortablePath(e),r,s)}watchFile(e,r,s){return this.realFs.watchFile(fe.fromPortablePath(e),r,s)}unwatchFile(e,r){return this.realFs.unwatchFile(fe.fromPortablePath(e),r)}makeCallback(e,r){return(s,a)=>{s?r(s):e(a)}}}});var Sn,a$=Xe(()=>{Cd();yp();el();Sn=class extends _s{constructor(e,{baseFs:r=new Yn}={}){super(J),this.target=this.pathUtils.normalize(e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?J.normalize(e):this.baseFs.resolve(J.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}}});var l$,Hf,c$=Xe(()=>{Cd();yp();el();l$=vt.root,Hf=class extends _s{constructor(e,{baseFs:r=new Yn}={}){super(J),this.target=this.pathUtils.resolve(vt.root,e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(vt.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(l$,e));if(r.match(/^\\.\\.\\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(l$,this.pathUtils.relative(this.target,e))}}});var oE,u$=Xe(()=>{yp();oE=class extends _s{constructor(r,s){super(s);this.instance=null;this.factory=r}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(r){this.instance=r}mapFromBase(r){return r}mapToBase(r){return r}}});var wd,tl,e0,f$=Xe(()=>{wd=Ie(\"fs\");Id();Cd();bU();zP();el();tl=4278190080,e0=class extends Uf{constructor({baseFs:r=new Yn,filter:s=null,magicByte:a=42,maxOpenFiles:n=1/0,useCache:c=!0,maxAge:f=5e3,typeCheck:p=wd.constants.S_IFREG,getMountPoint:h,factoryPromise:E,factorySync:C}){if(Math.floor(a)!==a||!(a>1&&a<=127))throw new Error(\"The magic byte must be set to a round value between 1 and 127 included\");super();this.fdMap=new Map;this.nextFd=3;this.isMount=new Set;this.notMount=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.baseFs=r,this.mountInstances=c?new Map:null,this.factoryPromise=E,this.factorySync=C,this.filter=s,this.getMountPoint=h,this.magic=a<<24,this.maxAge=f,this.maxOpenFiles=n,this.typeCheck=p}getExtractHint(r){return this.baseFs.getExtractHint(r)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(yd(this),this.mountInstances)for(let[r,{childFs:s}]of this.mountInstances.entries())s.saveAndClose?.(),this.mountInstances.delete(r)}discardAndClose(){if(yd(this),this.mountInstances)for(let[r,{childFs:s}]of this.mountInstances.entries())s.discardAndClose?.(),this.mountInstances.delete(r)}resolve(r){return this.baseFs.resolve(r)}remapFd(r,s){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,s]),a}async openPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.openPromise(r,s,a),async(n,{subPath:c})=>this.remapFd(n,await n.openPromise(c,s,a)))}openSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,s,a),(n,{subPath:c})=>this.remapFd(n,n.openSync(c,s,a)))}async opendirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.opendirPromise(r,s),async(a,{subPath:n})=>await a.opendirPromise(n,s),{requireSubpath:!1})}opendirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.opendirSync(r,s),(a,{subPath:n})=>a.opendirSync(n,s),{requireSubpath:!1})}async readPromise(r,s,a,n,c){if((r&tl)!==this.magic)return await this.baseFs.readPromise(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>\"u\")throw Mo(\"read\");let[p,h]=f;return await p.readPromise(h,s,a,n,c)}readSync(r,s,a,n,c){if((r&tl)!==this.magic)return this.baseFs.readSync(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>\"u\")throw Mo(\"readSync\");let[p,h]=f;return p.readSync(h,s,a,n,c)}async writePromise(r,s,a,n,c){if((r&tl)!==this.magic)return typeof s==\"string\"?await this.baseFs.writePromise(r,s,a):await this.baseFs.writePromise(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>\"u\")throw Mo(\"write\");let[p,h]=f;return typeof s==\"string\"?await p.writePromise(h,s,a):await p.writePromise(h,s,a,n,c)}writeSync(r,s,a,n,c){if((r&tl)!==this.magic)return typeof s==\"string\"?this.baseFs.writeSync(r,s,a):this.baseFs.writeSync(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>\"u\")throw Mo(\"writeSync\");let[p,h]=f;return typeof s==\"string\"?p.writeSync(h,s,a):p.writeSync(h,s,a,n,c)}async closePromise(r){if((r&tl)!==this.magic)return await this.baseFs.closePromise(r);let s=this.fdMap.get(r);if(typeof s>\"u\")throw Mo(\"close\");this.fdMap.delete(r);let[a,n]=s;return await a.closePromise(n)}closeSync(r){if((r&tl)!==this.magic)return this.baseFs.closeSync(r);let s=this.fdMap.get(r);if(typeof s>\"u\")throw Mo(\"closeSync\");this.fdMap.delete(r);let[a,n]=s;return a.closeSync(n)}createReadStream(r,s){return r===null?this.baseFs.createReadStream(r,s):this.makeCallSync(r,()=>this.baseFs.createReadStream(r,s),(a,{archivePath:n,subPath:c})=>{let f=a.createReadStream(c,s);return f.path=fe.fromPortablePath(this.pathUtils.join(n,c)),f})}createWriteStream(r,s){return r===null?this.baseFs.createWriteStream(r,s):this.makeCallSync(r,()=>this.baseFs.createWriteStream(r,s),(a,{subPath:n})=>a.createWriteStream(n,s))}async realpathPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.realpathPromise(r),async(s,{archivePath:a,subPath:n})=>{let c=this.realPaths.get(a);return typeof c>\"u\"&&(c=await this.baseFs.realpathPromise(a),this.realPaths.set(a,c)),this.pathUtils.join(c,this.pathUtils.relative(vt.root,await s.realpathPromise(n)))})}realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(r),(s,{archivePath:a,subPath:n})=>{let c=this.realPaths.get(a);return typeof c>\"u\"&&(c=this.baseFs.realpathSync(a),this.realPaths.set(a,c)),this.pathUtils.join(c,this.pathUtils.relative(vt.root,s.realpathSync(n)))})}async existsPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.existsPromise(r),async(s,{subPath:a})=>await s.existsPromise(a))}existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(s,{subPath:a})=>s.existsSync(a))}async accessPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.accessPromise(r,s),async(a,{subPath:n})=>await a.accessPromise(n,s))}accessSync(r,s){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,s),(a,{subPath:n})=>a.accessSync(n,s))}async statPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.statPromise(r,s),async(a,{subPath:n})=>await a.statPromise(n,s))}statSync(r,s){return this.makeCallSync(r,()=>this.baseFs.statSync(r,s),(a,{subPath:n})=>a.statSync(n,s))}async fstatPromise(r,s){if((r&tl)!==this.magic)return this.baseFs.fstatPromise(r,s);let a=this.fdMap.get(r);if(typeof a>\"u\")throw Mo(\"fstat\");let[n,c]=a;return n.fstatPromise(c,s)}fstatSync(r,s){if((r&tl)!==this.magic)return this.baseFs.fstatSync(r,s);let a=this.fdMap.get(r);if(typeof a>\"u\")throw Mo(\"fstatSync\");let[n,c]=a;return n.fstatSync(c,s)}async lstatPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.lstatPromise(r,s),async(a,{subPath:n})=>await a.lstatPromise(n,s))}lstatSync(r,s){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,s),(a,{subPath:n})=>a.lstatSync(n,s))}async fchmodPromise(r,s){if((r&tl)!==this.magic)return this.baseFs.fchmodPromise(r,s);let a=this.fdMap.get(r);if(typeof a>\"u\")throw Mo(\"fchmod\");let[n,c]=a;return n.fchmodPromise(c,s)}fchmodSync(r,s){if((r&tl)!==this.magic)return this.baseFs.fchmodSync(r,s);let a=this.fdMap.get(r);if(typeof a>\"u\")throw Mo(\"fchmodSync\");let[n,c]=a;return n.fchmodSync(c,s)}async chmodPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.chmodPromise(r,s),async(a,{subPath:n})=>await a.chmodPromise(n,s))}chmodSync(r,s){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,s),(a,{subPath:n})=>a.chmodSync(n,s))}async fchownPromise(r,s,a){if((r&tl)!==this.magic)return this.baseFs.fchownPromise(r,s,a);let n=this.fdMap.get(r);if(typeof n>\"u\")throw Mo(\"fchown\");let[c,f]=n;return c.fchownPromise(f,s,a)}fchownSync(r,s,a){if((r&tl)!==this.magic)return this.baseFs.fchownSync(r,s,a);let n=this.fdMap.get(r);if(typeof n>\"u\")throw Mo(\"fchownSync\");let[c,f]=n;return c.fchownSync(f,s,a)}async chownPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.chownPromise(r,s,a),async(n,{subPath:c})=>await n.chownPromise(c,s,a))}chownSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,s,a),(n,{subPath:c})=>n.chownSync(c,s,a))}async renamePromise(r,s){return await this.makeCallPromise(r,async()=>await this.makeCallPromise(s,async()=>await this.baseFs.renamePromise(r,s),async()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})}),async(a,{subPath:n})=>await this.makeCallPromise(s,async()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})},async(c,{subPath:f})=>{if(a!==c)throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"});return await a.renamePromise(n,f)}))}renameSync(r,s){return this.makeCallSync(r,()=>this.makeCallSync(s,()=>this.baseFs.renameSync(r,s),()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})}),(a,{subPath:n})=>this.makeCallSync(s,()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})},(c,{subPath:f})=>{if(a!==c)throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"});return a.renameSync(n,f)}))}async copyFilePromise(r,s,a=0){let n=async(c,f,p,h)=>{if(a&wd.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${f}' -> ${h}'`),{code:\"EXDEV\"});if(a&wd.constants.COPYFILE_EXCL&&await this.existsPromise(f))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${f}' -> '${h}'`),{code:\"EEXIST\"});let E;try{E=await c.readFilePromise(f)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${f}' -> '${h}'`),{code:\"EINVAL\"})}await p.writeFilePromise(h,E)};return await this.makeCallPromise(r,async()=>await this.makeCallPromise(s,async()=>await this.baseFs.copyFilePromise(r,s,a),async(c,{subPath:f})=>await n(this.baseFs,r,c,f)),async(c,{subPath:f})=>await this.makeCallPromise(s,async()=>await n(c,f,this.baseFs,s),async(p,{subPath:h})=>c!==p?await n(c,f,p,h):await c.copyFilePromise(f,h,a)))}copyFileSync(r,s,a=0){let n=(c,f,p,h)=>{if(a&wd.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${f}' -> ${h}'`),{code:\"EXDEV\"});if(a&wd.constants.COPYFILE_EXCL&&this.existsSync(f))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${f}' -> '${h}'`),{code:\"EEXIST\"});let E;try{E=c.readFileSync(f)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${f}' -> '${h}'`),{code:\"EINVAL\"})}p.writeFileSync(h,E)};return this.makeCallSync(r,()=>this.makeCallSync(s,()=>this.baseFs.copyFileSync(r,s,a),(c,{subPath:f})=>n(this.baseFs,r,c,f)),(c,{subPath:f})=>this.makeCallSync(s,()=>n(c,f,this.baseFs,s),(p,{subPath:h})=>c!==p?n(c,f,p,h):c.copyFileSync(f,h,a)))}async appendFilePromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.appendFilePromise(r,s,a),async(n,{subPath:c})=>await n.appendFilePromise(c,s,a))}appendFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.appendFileSync(r,s,a),(n,{subPath:c})=>n.appendFileSync(c,s,a))}async writeFilePromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.writeFilePromise(r,s,a),async(n,{subPath:c})=>await n.writeFilePromise(c,s,a))}writeFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.writeFileSync(r,s,a),(n,{subPath:c})=>n.writeFileSync(c,s,a))}async unlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.unlinkPromise(r),async(s,{subPath:a})=>await s.unlinkPromise(a))}unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(s,{subPath:a})=>s.unlinkSync(a))}async utimesPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.utimesPromise(r,s,a),async(n,{subPath:c})=>await n.utimesPromise(c,s,a))}utimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(r,s,a),(n,{subPath:c})=>n.utimesSync(c,s,a))}async lutimesPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.lutimesPromise(r,s,a),async(n,{subPath:c})=>await n.lutimesPromise(c,s,a))}lutimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSync(r,s,a),(n,{subPath:c})=>n.lutimesSync(c,s,a))}async mkdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.mkdirPromise(r,s),async(a,{subPath:n})=>await a.mkdirPromise(n,s))}mkdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,s),(a,{subPath:n})=>a.mkdirSync(n,s))}async rmdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.rmdirPromise(r,s),async(a,{subPath:n})=>await a.rmdirPromise(n,s))}rmdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,s),(a,{subPath:n})=>a.rmdirSync(n,s))}async rmPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.rmPromise(r,s),async(a,{subPath:n})=>await a.rmPromise(n,s))}rmSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmSync(r,s),(a,{subPath:n})=>a.rmSync(n,s))}async linkPromise(r,s){return await this.makeCallPromise(s,async()=>await this.baseFs.linkPromise(r,s),async(a,{subPath:n})=>await a.linkPromise(r,n))}linkSync(r,s){return this.makeCallSync(s,()=>this.baseFs.linkSync(r,s),(a,{subPath:n})=>a.linkSync(r,n))}async symlinkPromise(r,s,a){return await this.makeCallPromise(s,async()=>await this.baseFs.symlinkPromise(r,s,a),async(n,{subPath:c})=>await n.symlinkPromise(r,c))}symlinkSync(r,s,a){return this.makeCallSync(s,()=>this.baseFs.symlinkSync(r,s,a),(n,{subPath:c})=>n.symlinkSync(r,c))}async readFilePromise(r,s){return this.makeCallPromise(r,async()=>await this.baseFs.readFilePromise(r,s),async(a,{subPath:n})=>await a.readFilePromise(n,s))}readFileSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readFileSync(r,s),(a,{subPath:n})=>a.readFileSync(n,s))}async readdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.readdirPromise(r,s),async(a,{subPath:n})=>await a.readdirPromise(n,s),{requireSubpath:!1})}readdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readdirSync(r,s),(a,{subPath:n})=>a.readdirSync(n,s),{requireSubpath:!1})}async readlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.readlinkPromise(r),async(s,{subPath:a})=>await s.readlinkPromise(a))}readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(r),(s,{subPath:a})=>s.readlinkSync(a))}async truncatePromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.truncatePromise(r,s),async(a,{subPath:n})=>await a.truncatePromise(n,s))}truncateSync(r,s){return this.makeCallSync(r,()=>this.baseFs.truncateSync(r,s),(a,{subPath:n})=>a.truncateSync(n,s))}async ftruncatePromise(r,s){if((r&tl)!==this.magic)return this.baseFs.ftruncatePromise(r,s);let a=this.fdMap.get(r);if(typeof a>\"u\")throw Mo(\"ftruncate\");let[n,c]=a;return n.ftruncatePromise(c,s)}ftruncateSync(r,s){if((r&tl)!==this.magic)return this.baseFs.ftruncateSync(r,s);let a=this.fdMap.get(r);if(typeof a>\"u\")throw Mo(\"ftruncateSync\");let[n,c]=a;return n.ftruncateSync(c,s)}watch(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,s,a),(n,{subPath:c})=>n.watch(c,s,a))}watchFile(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,s,a),()=>sE(this,r,s,a))}unwatchFile(r,s){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(r,s),()=>md(this,r,s))}async makeCallPromise(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!=\"string\")return await s();let c=this.resolve(r),f=this.findMount(c);return f?n&&f.subPath===\"/\"?await s():await this.getMountPromise(f.archivePath,async p=>await a(p,f)):await s()}makeCallSync(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!=\"string\")return s();let c=this.resolve(r),f=this.findMount(c);return!f||n&&f.subPath===\"/\"?s():this.getMountSync(f.archivePath,p=>a(p,f))}findMount(r){if(this.filter&&!this.filter.test(r))return null;let s=\"\";for(;;){let a=r.substring(s.length),n=this.getMountPoint(a,s);if(!n)return null;if(s=this.pathUtils.join(s,n),!this.isMount.has(s)){if(this.notMount.has(s))continue;try{if(this.typeCheck!==null&&(this.baseFs.statSync(s).mode&wd.constants.S_IFMT)!==this.typeCheck){this.notMount.add(s);continue}}catch{return null}this.isMount.add(s)}return{archivePath:s,subPath:this.pathUtils.join(vt.root,r.substring(s.length))}}}limitOpenFiles(r){if(this.mountInstances===null)return;let s=Date.now(),a=s+this.maxAge,n=r===null?0:this.mountInstances.size-r;for(let[c,{childFs:f,expiresAt:p,refCount:h}]of this.mountInstances.entries())if(!(h!==0||f.hasOpenFileHandles?.())){if(s>=p){f.saveAndClose?.(),this.mountInstances.delete(c),n-=1;continue}else if(r===null||n<=0){a=p;break}f.saveAndClose?.(),this.mountInstances.delete(c),n-=1}this.limitOpenFilesTimeout===null&&(r===null&&this.mountInstances.size>0||r!==null)&&isFinite(a)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},a-s).unref())}async getMountPromise(r,s){if(this.mountInstances){let a=this.mountInstances.get(r);if(!a){let n=await this.factoryPromise(this.baseFs,r);a=this.mountInstances.get(r),a||(a={childFs:n(),expiresAt:0,refCount:0})}this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,a.refCount+=1;try{return await s(a.childFs)}finally{a.refCount-=1}}else{let a=(await this.factoryPromise(this.baseFs,r))();try{return await s(a)}finally{a.saveAndClose?.()}}}getMountSync(r,s){if(this.mountInstances){let a=this.mountInstances.get(r);return a||(a={childFs:this.factorySync(this.baseFs,r),expiresAt:0,refCount:0}),this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,s(a.childFs)}else{let a=this.factorySync(this.baseFs,r);try{return s(a)}finally{a.saveAndClose?.()}}}}});var er,nx,A$=Xe(()=>{Id();el();er=()=>Object.assign(new Error(\"ENOSYS: unsupported filesystem access\"),{code:\"ENOSYS\"}),nx=class t extends mp{static{this.instance=new t}constructor(){super(J)}getExtractHint(){throw er()}getRealPath(){throw er()}resolve(){throw er()}async openPromise(){throw er()}openSync(){throw er()}async opendirPromise(){throw er()}opendirSync(){throw er()}async readPromise(){throw er()}readSync(){throw er()}async writePromise(){throw er()}writeSync(){throw er()}async closePromise(){throw er()}closeSync(){throw er()}createWriteStream(){throw er()}createReadStream(){throw er()}async realpathPromise(){throw er()}realpathSync(){throw er()}async readdirPromise(){throw er()}readdirSync(){throw er()}async existsPromise(e){throw er()}existsSync(e){throw er()}async accessPromise(){throw er()}accessSync(){throw er()}async statPromise(){throw er()}statSync(){throw er()}async fstatPromise(e){throw er()}fstatSync(e){throw er()}async lstatPromise(e){throw er()}lstatSync(e){throw er()}async fchmodPromise(){throw er()}fchmodSync(){throw er()}async chmodPromise(){throw er()}chmodSync(){throw er()}async fchownPromise(){throw er()}fchownSync(){throw er()}async chownPromise(){throw er()}chownSync(){throw er()}async mkdirPromise(){throw er()}mkdirSync(){throw er()}async rmdirPromise(){throw er()}rmdirSync(){throw er()}async rmPromise(){throw er()}rmSync(){throw er()}async linkPromise(){throw er()}linkSync(){throw er()}async symlinkPromise(){throw er()}symlinkSync(){throw er()}async renamePromise(){throw er()}renameSync(){throw er()}async copyFilePromise(){throw er()}copyFileSync(){throw er()}async appendFilePromise(){throw er()}appendFileSync(){throw er()}async writeFilePromise(){throw er()}writeFileSync(){throw er()}async unlinkPromise(){throw er()}unlinkSync(){throw er()}async utimesPromise(){throw er()}utimesSync(){throw er()}async lutimesPromise(){throw er()}lutimesSync(){throw er()}async readFilePromise(){throw er()}readFileSync(){throw er()}async readlinkPromise(){throw er()}readlinkSync(){throw er()}async truncatePromise(){throw er()}truncateSync(){throw er()}async ftruncatePromise(e,r){throw er()}ftruncateSync(e,r){throw er()}watch(){throw er()}watchFile(){throw er()}unwatchFile(){throw er()}}});var t0,p$=Xe(()=>{yp();el();t0=class extends _s{constructor(e){super(fe),this.baseFs=e}mapFromBase(e){return fe.fromPortablePath(e)}mapToBase(e){return fe.toPortablePath(e)}}});var o5e,PU,a5e,uo,h$=Xe(()=>{Cd();yp();el();o5e=/^[0-9]+$/,PU=/^(\\/(?:[^/]+\\/)*?(?:\\$\\$virtual|__virtual__))((?:\\/((?:[^/]+-)?[a-f0-9]+)(?:\\/([^/]+))?)?((?:\\/.*)?))$/,a5e=/^([^/]+-)?[a-f0-9]+$/,uo=class t extends _s{static makeVirtualPath(e,r,s){if(J.basename(e)!==\"__virtual__\")throw new Error('Assertion failed: Virtual folders must be named \"__virtual__\"');if(!J.basename(r).match(a5e))throw new Error(\"Assertion failed: Virtual components must be ended by an hexadecimal hash\");let n=J.relative(J.dirname(e),s).split(\"/\"),c=0;for(;c<n.length&&n[c]===\"..\";)c+=1;let f=n.slice(c);return J.join(e,r,String(c),...f)}static resolveVirtual(e){let r=e.match(PU);if(!r||!r[3]&&r[5])return e;let s=J.dirname(r[1]);if(!r[3]||!r[4])return s;if(!o5e.test(r[4]))return e;let n=Number(r[4]),c=\"../\".repeat(n),f=r[5]||\".\";return t.resolveVirtual(J.join(s,c,f))}constructor({baseFs:e=new Yn}={}){super(J),this.baseFs=e}getExtractHint(e){return this.baseFs.getExtractHint(e)}getRealPath(){return this.baseFs.getRealPath()}realpathSync(e){let r=e.match(PU);if(!r)return this.baseFs.realpathSync(e);if(!r[5])return e;let s=this.baseFs.realpathSync(this.mapToBase(e));return t.makeVirtualPath(r[1],r[3],s)}async realpathPromise(e){let r=e.match(PU);if(!r)return await this.baseFs.realpathPromise(e);if(!r[5])return e;let s=await this.baseFs.realpathPromise(this.mapToBase(e));return t.makeVirtualPath(r[1],r[3],s)}mapToBase(e){if(e===\"\")return e;if(this.pathUtils.isAbsolute(e))return t.resolveVirtual(e);let r=t.resolveVirtual(this.baseFs.resolve(vt.dot)),s=t.resolveVirtual(this.baseFs.resolve(e));return J.relative(r,s)||vt.dot}mapFromBase(e){return e}}});function l5e(t,e){return typeof xU.default.isUtf8<\"u\"?xU.default.isUtf8(t):Buffer.byteLength(e)===t.byteLength}var xU,g$,d$,ix,m$=Xe(()=>{xU=ut(Ie(\"buffer\")),g$=Ie(\"url\"),d$=Ie(\"util\");yp();el();ix=class extends _s{constructor(e){super(fe),this.baseFs=e}mapFromBase(e){return e}mapToBase(e){if(typeof e==\"string\")return e;if(e instanceof URL)return(0,g$.fileURLToPath)(e);if(Buffer.isBuffer(e)){let r=e.toString();if(!l5e(e,r))throw new Error(\"Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942\");return r}throw new Error(`Unsupported path type: ${(0,d$.inspect)(e)}`)}}});var w$,Uo,Ep,r0,sx,ox,aE,Ru,Fu,y$,E$,I$,C$,M2,B$=Xe(()=>{w$=Ie(\"readline\"),Uo=Symbol(\"kBaseFs\"),Ep=Symbol(\"kFd\"),r0=Symbol(\"kClosePromise\"),sx=Symbol(\"kCloseResolve\"),ox=Symbol(\"kCloseReject\"),aE=Symbol(\"kRefs\"),Ru=Symbol(\"kRef\"),Fu=Symbol(\"kUnref\"),M2=class{constructor(e,r){this[C$]=1;this[I$]=void 0;this[E$]=void 0;this[y$]=void 0;this[Uo]=r,this[Ep]=e}get fd(){return this[Ep]}async appendFile(e,r){try{this[Ru](this.appendFile);let s=(typeof r==\"string\"?r:r?.encoding)??void 0;return await this[Uo].appendFilePromise(this.fd,e,s?{encoding:s}:void 0)}finally{this[Fu]()}}async chown(e,r){try{return this[Ru](this.chown),await this[Uo].fchownPromise(this.fd,e,r)}finally{this[Fu]()}}async chmod(e){try{return this[Ru](this.chmod),await this[Uo].fchmodPromise(this.fd,e)}finally{this[Fu]()}}createReadStream(e){return this[Uo].createReadStream(null,{...e,fd:this.fd})}createWriteStream(e){return this[Uo].createWriteStream(null,{...e,fd:this.fd})}datasync(){throw new Error(\"Method not implemented.\")}sync(){throw new Error(\"Method not implemented.\")}async read(e,r,s,a){try{this[Ru](this.read);let n,c;return ArrayBuffer.isView(e)?typeof r==\"object\"&&r!==null?(n=e,c=r?.offset??0,s=r?.length??n.byteLength-c,a=r?.position??null):(n=e,c=r??0,s??=0):(n=e?.buffer??Buffer.alloc(16384),c=e?.offset??0,s=e?.length??n.byteLength-c,a=e?.position??null),s===0?{bytesRead:s,buffer:n}:{bytesRead:await this[Uo].readPromise(this.fd,Buffer.isBuffer(n)?n:Buffer.from(n.buffer,n.byteOffset,n.byteLength),c,s,a),buffer:n}}finally{this[Fu]()}}async readFile(e){try{this[Ru](this.readFile);let r=(typeof e==\"string\"?e:e?.encoding)??void 0;return await this[Uo].readFilePromise(this.fd,r)}finally{this[Fu]()}}readLines(e){return(0,w$.createInterface)({input:this.createReadStream(e),crlfDelay:1/0})}async stat(e){try{return this[Ru](this.stat),await this[Uo].fstatPromise(this.fd,e)}finally{this[Fu]()}}async truncate(e){try{return this[Ru](this.truncate),await this[Uo].ftruncatePromise(this.fd,e)}finally{this[Fu]()}}utimes(e,r){throw new Error(\"Method not implemented.\")}async writeFile(e,r){try{this[Ru](this.writeFile);let s=(typeof r==\"string\"?r:r?.encoding)??void 0;await this[Uo].writeFilePromise(this.fd,e,s)}finally{this[Fu]()}}async write(...e){try{if(this[Ru](this.write),ArrayBuffer.isView(e[0])){let[r,s,a,n]=e;return{bytesWritten:await this[Uo].writePromise(this.fd,r,s??void 0,a??void 0,n??void 0),buffer:r}}else{let[r,s,a]=e;return{bytesWritten:await this[Uo].writePromise(this.fd,r,s,a),buffer:r}}}finally{this[Fu]()}}async writev(e,r){try{this[Ru](this.writev);let s=0;if(typeof r<\"u\")for(let a of e){let n=await this.write(a,void 0,void 0,r);s+=n.bytesWritten,r+=n.bytesWritten}else for(let a of e){let n=await this.write(a);s+=n.bytesWritten}return{buffers:e,bytesWritten:s}}finally{this[Fu]()}}readv(e,r){throw new Error(\"Method not implemented.\")}close(){if(this[Ep]===-1)return Promise.resolve();if(this[r0])return this[r0];if(this[aE]--,this[aE]===0){let e=this[Ep];this[Ep]=-1,this[r0]=this[Uo].closePromise(e).finally(()=>{this[r0]=void 0})}else this[r0]=new Promise((e,r)=>{this[sx]=e,this[ox]=r}).finally(()=>{this[r0]=void 0,this[ox]=void 0,this[sx]=void 0});return this[r0]}[(Uo,Ep,C$=aE,I$=r0,E$=sx,y$=ox,Ru)](e){if(this[Ep]===-1){let r=new Error(\"file closed\");throw r.code=\"EBADF\",r.syscall=e.name,r}this[aE]++}[Fu](){if(this[aE]--,this[aE]===0){let e=this[Ep];this[Ep]=-1,this[Uo].closePromise(e).then(this[sx],this[ox])}}}});function U2(t,e){e=new ix(e);let r=(s,a,n)=>{let c=s[a];s[a]=n,typeof c?.[lE.promisify.custom]<\"u\"&&(n[lE.promisify.custom]=c[lE.promisify.custom])};{r(t,\"exists\",(s,...a)=>{let c=typeof a[a.length-1]==\"function\"?a.pop():()=>{};process.nextTick(()=>{e.existsPromise(s).then(f=>{c(f)},()=>{c(!1)})})}),r(t,\"read\",(...s)=>{let[a,n,c,f,p,h]=s;if(s.length<=3){let E={};s.length<3?h=s[1]:(E=s[1],h=s[2]),{buffer:n=Buffer.alloc(16384),offset:c=0,length:f=n.byteLength,position:p}=E}if(c==null&&(c=0),f|=0,f===0){process.nextTick(()=>{h(null,0,n)});return}p==null&&(p=-1),process.nextTick(()=>{e.readPromise(a,n,c,f,p).then(E=>{h(null,E,n)},E=>{h(E,0,n)})})});for(let s of v$){let a=s.replace(/Promise$/,\"\");if(typeof t[a]>\"u\")continue;let n=e[s];if(typeof n>\"u\")continue;r(t,a,(...f)=>{let h=typeof f[f.length-1]==\"function\"?f.pop():()=>{};process.nextTick(()=>{n.apply(e,f).then(E=>{h(null,E)},E=>{h(E)})})})}t.realpath.native=t.realpath}{r(t,\"existsSync\",s=>{try{return e.existsSync(s)}catch{return!1}}),r(t,\"readSync\",(...s)=>{let[a,n,c,f,p]=s;return s.length<=3&&({offset:c=0,length:f=n.byteLength,position:p}=s[2]||{}),c==null&&(c=0),f|=0,f===0?0:(p==null&&(p=-1),e.readSync(a,n,c,f,p))});for(let s of c5e){let a=s;if(typeof t[a]>\"u\")continue;let n=e[s];typeof n>\"u\"||r(t,a,n.bind(e))}t.realpathSync.native=t.realpathSync}{let s=t.promises;for(let a of v$){let n=a.replace(/Promise$/,\"\");if(typeof s[n]>\"u\")continue;let c=e[a];typeof c>\"u\"||a!==\"open\"&&r(s,n,(f,...p)=>f instanceof M2?f[n].apply(f,p):c.call(e,f,...p))}r(s,\"open\",async(...a)=>{let n=await e.openPromise(...a);return new M2(n,e)})}t.read[lE.promisify.custom]=async(s,a,...n)=>({bytesRead:await e.readPromise(s,a,...n),buffer:a}),t.write[lE.promisify.custom]=async(s,a,...n)=>({bytesWritten:await e.writePromise(s,a,...n),buffer:a})}function ax(t,e){let r=Object.create(t);return U2(r,e),r}var lE,c5e,v$,S$=Xe(()=>{lE=Ie(\"util\");m$();B$();c5e=new Set([\"accessSync\",\"appendFileSync\",\"createReadStream\",\"createWriteStream\",\"chmodSync\",\"fchmodSync\",\"chownSync\",\"fchownSync\",\"closeSync\",\"copyFileSync\",\"linkSync\",\"lstatSync\",\"fstatSync\",\"lutimesSync\",\"mkdirSync\",\"openSync\",\"opendirSync\",\"readlinkSync\",\"readFileSync\",\"readdirSync\",\"readlinkSync\",\"realpathSync\",\"renameSync\",\"rmdirSync\",\"rmSync\",\"statSync\",\"symlinkSync\",\"truncateSync\",\"ftruncateSync\",\"unlinkSync\",\"unwatchFile\",\"utimesSync\",\"watch\",\"watchFile\",\"writeFileSync\",\"writeSync\"]),v$=new Set([\"accessPromise\",\"appendFilePromise\",\"fchmodPromise\",\"chmodPromise\",\"fchownPromise\",\"chownPromise\",\"closePromise\",\"copyFilePromise\",\"linkPromise\",\"fstatPromise\",\"lstatPromise\",\"lutimesPromise\",\"mkdirPromise\",\"openPromise\",\"opendirPromise\",\"readdirPromise\",\"realpathPromise\",\"readFilePromise\",\"readdirPromise\",\"readlinkPromise\",\"renamePromise\",\"rmdirPromise\",\"rmPromise\",\"statPromise\",\"symlinkPromise\",\"truncatePromise\",\"ftruncatePromise\",\"unlinkPromise\",\"utimesPromise\",\"writeFilePromise\",\"writeSync\"])});function D$(t){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,\"0\");return`${t}${e}`}function b$(){if(kU)return kU;let t=fe.toPortablePath(P$.default.tmpdir()),e=ce.realpathSync(t);return process.once(\"exit\",()=>{ce.rmtempSync()}),kU={tmpdir:t,realTmpdir:e}}var P$,Nu,kU,ce,x$=Xe(()=>{P$=ut(Ie(\"os\"));Cd();el();Nu=new Set,kU=null;ce=Object.assign(new Yn,{detachTemp(t){Nu.delete(t)},mktempSync(t){let{tmpdir:e,realTmpdir:r}=b$();for(;;){let s=D$(\"xfs-\");try{this.mkdirSync(J.join(e,s))}catch(n){if(n.code===\"EEXIST\")continue;throw n}let a=J.join(r,s);if(Nu.add(a),typeof t>\"u\")return a;try{return t(a)}finally{if(Nu.has(a)){Nu.delete(a);try{this.removeSync(a)}catch{}}}}},async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=b$();for(;;){let s=D$(\"xfs-\");try{await this.mkdirPromise(J.join(e,s))}catch(n){if(n.code===\"EEXIST\")continue;throw n}let a=J.join(r,s);if(Nu.add(a),typeof t>\"u\")return a;try{return await t(a)}finally{if(Nu.has(a)){Nu.delete(a);try{await this.removePromise(a)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(Nu.values()).map(async t=>{try{await ce.removePromise(t,{maxRetries:0}),Nu.delete(t)}catch{}}))},rmtempSync(){for(let t of Nu)try{ce.removeSync(t),Nu.delete(t)}catch{}}})});var _2={};Vt(_2,{AliasFS:()=>_f,BasePortableFakeFS:()=>Uf,CustomDir:()=>L2,CwdFS:()=>Sn,FakeFS:()=>mp,Filename:()=>Er,JailFS:()=>Hf,LazyFS:()=>oE,MountFS:()=>e0,NoFS:()=>nx,NodeFS:()=>Yn,PortablePath:()=>vt,PosixFS:()=>t0,ProxiedFS:()=>_s,VirtualFS:()=>uo,constants:()=>fi,errors:()=>or,extendFs:()=>ax,normalizeLineEndings:()=>Ed,npath:()=>fe,opendir:()=>ex,patchFs:()=>U2,ppath:()=>J,setupCopyIndex:()=>$P,statUtils:()=>$a,unwatchAllFiles:()=>yd,unwatchFile:()=>md,watchFile:()=>sE,xfs:()=>ce});var Dt=Xe(()=>{YZ();zP();BU();DU();ZZ();bU();Id();el();el();i$();Id();a$();c$();u$();f$();A$();Cd();p$();yp();h$();S$();x$()});var F$=_((Dkt,R$)=>{R$.exports=T$;T$.sync=f5e;var k$=Ie(\"fs\");function u5e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(\";\"),r.indexOf(\"\")!==-1))return!0;for(var s=0;s<r.length;s++){var a=r[s].toLowerCase();if(a&&t.substr(-a.length).toLowerCase()===a)return!0}return!1}function Q$(t,e,r){return!t.isSymbolicLink()&&!t.isFile()?!1:u5e(e,r)}function T$(t,e,r){k$.stat(t,function(s,a){r(s,s?!1:Q$(a,t,e))})}function f5e(t,e){return Q$(k$.statSync(t),t,e)}});var U$=_((bkt,M$)=>{M$.exports=O$;O$.sync=A5e;var N$=Ie(\"fs\");function O$(t,e,r){N$.stat(t,function(s,a){r(s,s?!1:L$(a,e))})}function A5e(t,e){return L$(N$.statSync(t),e)}function L$(t,e){return t.isFile()&&p5e(t,e)}function p5e(t,e){var r=t.mode,s=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),c=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),f=parseInt(\"100\",8),p=parseInt(\"010\",8),h=parseInt(\"001\",8),E=f|p,C=r&h||r&p&&a===c||r&f&&s===n||r&E&&n===0;return C}});var H$=_((xkt,_$)=>{var Pkt=Ie(\"fs\"),lx;process.platform===\"win32\"||global.TESTING_WINDOWS?lx=F$():lx=U$();_$.exports=QU;QU.sync=h5e;function QU(t,e,r){if(typeof e==\"function\"&&(r=e,e={}),!r){if(typeof Promise!=\"function\")throw new TypeError(\"callback not provided\");return new Promise(function(s,a){QU(t,e||{},function(n,c){n?a(n):s(c)})})}lx(t,e||{},function(s,a){s&&(s.code===\"EACCES\"||e&&e.ignoreErrors)&&(s=null,a=!1),r(s,a)})}function h5e(t,e){try{return lx.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code===\"EACCES\")return!1;throw r}}});var J$=_((kkt,V$)=>{var cE=process.platform===\"win32\"||process.env.OSTYPE===\"cygwin\"||process.env.OSTYPE===\"msys\",j$=Ie(\"path\"),g5e=cE?\";\":\":\",G$=H$(),q$=t=>Object.assign(new Error(`not found: ${t}`),{code:\"ENOENT\"}),W$=(t,e)=>{let r=e.colon||g5e,s=t.match(/\\//)||cE&&t.match(/\\\\/)?[\"\"]:[...cE?[process.cwd()]:[],...(e.path||process.env.PATH||\"\").split(r)],a=cE?e.pathExt||process.env.PATHEXT||\".EXE;.CMD;.BAT;.COM\":\"\",n=cE?a.split(r):[\"\"];return cE&&t.indexOf(\".\")!==-1&&n[0]!==\"\"&&n.unshift(\"\"),{pathEnv:s,pathExt:n,pathExtExe:a}},Y$=(t,e,r)=>{typeof e==\"function\"&&(r=e,e={}),e||(e={});let{pathEnv:s,pathExt:a,pathExtExe:n}=W$(t,e),c=[],f=h=>new Promise((E,C)=>{if(h===s.length)return e.all&&c.length?E(c):C(q$(t));let S=s[h],P=/^\".*\"$/.test(S)?S.slice(1,-1):S,I=j$.join(P,t),R=!P&&/^\\.[\\\\\\/]/.test(t)?t.slice(0,2)+I:I;E(p(R,h,0))}),p=(h,E,C)=>new Promise((S,P)=>{if(C===a.length)return S(f(E+1));let I=a[C];G$(h+I,{pathExt:n},(R,N)=>{if(!R&&N)if(e.all)c.push(h+I);else return S(h+I);return S(p(h,E,C+1))})});return r?f(0).then(h=>r(null,h),r):f(0)},d5e=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:s,pathExtExe:a}=W$(t,e),n=[];for(let c=0;c<r.length;c++){let f=r[c],p=/^\".*\"$/.test(f)?f.slice(1,-1):f,h=j$.join(p,t),E=!p&&/^\\.[\\\\\\/]/.test(t)?t.slice(0,2)+h:h;for(let C=0;C<s.length;C++){let S=E+s[C];try{if(G$.sync(S,{pathExt:a}))if(e.all)n.push(S);else return S}catch{}}}if(e.all&&n.length)return n;if(e.nothrow)return null;throw q$(t)};V$.exports=Y$;Y$.sync=d5e});var z$=_((Qkt,TU)=>{\"use strict\";var K$=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!==\"win32\"?\"PATH\":Object.keys(e).reverse().find(s=>s.toUpperCase()===\"PATH\")||\"Path\"};TU.exports=K$;TU.exports.default=K$});var eee=_((Tkt,$$)=>{\"use strict\";var X$=Ie(\"path\"),m5e=J$(),y5e=z$();function Z$(t,e){let r=t.options.env||process.env,s=process.cwd(),a=t.options.cwd!=null,n=a&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(t.options.cwd)}catch{}let c;try{c=m5e.sync(t.command,{path:r[y5e({env:r})],pathExt:e?X$.delimiter:void 0})}catch{}finally{n&&process.chdir(s)}return c&&(c=X$.resolve(a?t.options.cwd:\"\",c)),c}function E5e(t){return Z$(t)||Z$(t,!0)}$$.exports=E5e});var tee=_((Rkt,FU)=>{\"use strict\";var RU=/([()\\][%!^\"`<>&|;, *?])/g;function I5e(t){return t=t.replace(RU,\"^$1\"),t}function C5e(t,e){return t=`${t}`,t=t.replace(/(?=(\\\\+?)?)\\1\"/g,'$1$1\\\\\"'),t=t.replace(/(?=(\\\\+?)?)\\1$/,\"$1$1\"),t=`\"${t}\"`,t=t.replace(RU,\"^$1\"),e&&(t=t.replace(RU,\"^$1\")),t}FU.exports.command=I5e;FU.exports.argument=C5e});var nee=_((Fkt,ree)=>{\"use strict\";ree.exports=/^#!(.*)/});var see=_((Nkt,iee)=>{\"use strict\";var w5e=nee();iee.exports=(t=\"\")=>{let e=t.match(w5e);if(!e)return null;let[r,s]=e[0].replace(/#! ?/,\"\").split(\" \"),a=r.split(\"/\").pop();return a===\"env\"?s:s?`${a} ${s}`:a}});var aee=_((Okt,oee)=>{\"use strict\";var NU=Ie(\"fs\"),B5e=see();function v5e(t){let r=Buffer.alloc(150),s;try{s=NU.openSync(t,\"r\"),NU.readSync(s,r,0,150,0),NU.closeSync(s)}catch{}return B5e(r.toString())}oee.exports=v5e});var fee=_((Lkt,uee)=>{\"use strict\";var S5e=Ie(\"path\"),lee=eee(),cee=tee(),D5e=aee(),b5e=process.platform===\"win32\",P5e=/\\.(?:com|exe)$/i,x5e=/node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;function k5e(t){t.file=lee(t);let e=t.file&&D5e(t.file);return e?(t.args.unshift(t.file),t.command=e,lee(t)):t.file}function Q5e(t){if(!b5e)return t;let e=k5e(t),r=!P5e.test(e);if(t.options.forceShell||r){let s=x5e.test(e);t.command=S5e.normalize(t.command),t.command=cee.command(t.command),t.args=t.args.map(n=>cee.argument(n,s));let a=[t.command].concat(t.args).join(\" \");t.args=[\"/d\",\"/s\",\"/c\",`\"${a}\"`],t.command=process.env.comspec||\"cmd.exe\",t.options.windowsVerbatimArguments=!0}return t}function T5e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let s={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?s:Q5e(s)}uee.exports=T5e});var hee=_((Mkt,pee)=>{\"use strict\";var OU=process.platform===\"win32\";function LU(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:\"ENOENT\",errno:\"ENOENT\",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function R5e(t,e){if(!OU)return;let r=t.emit;t.emit=function(s,a){if(s===\"exit\"){let n=Aee(a,e);if(n)return r.call(t,\"error\",n)}return r.apply(t,arguments)}}function Aee(t,e){return OU&&t===1&&!e.file?LU(e.original,\"spawn\"):null}function F5e(t,e){return OU&&t===1&&!e.file?LU(e.original,\"spawnSync\"):null}pee.exports={hookChildProcess:R5e,verifyENOENT:Aee,verifyENOENTSync:F5e,notFoundError:LU}});var _U=_((Ukt,uE)=>{\"use strict\";var gee=Ie(\"child_process\"),MU=fee(),UU=hee();function dee(t,e,r){let s=MU(t,e,r),a=gee.spawn(s.command,s.args,s.options);return UU.hookChildProcess(a,s),a}function N5e(t,e,r){let s=MU(t,e,r),a=gee.spawnSync(s.command,s.args,s.options);return a.error=a.error||UU.verifyENOENTSync(a.status,s),a}uE.exports=dee;uE.exports.spawn=dee;uE.exports.sync=N5e;uE.exports._parse=MU;uE.exports._enoent=UU});var yee=_((_kt,mee)=>{\"use strict\";function O5e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Bd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,Bd)}O5e(Bd,Error);Bd.buildMessage=function(t,e){var r={literal:function(h){return'\"'+a(h.text)+'\"'},class:function(h){var E=\"\",C;for(C=0;C<h.parts.length;C++)E+=h.parts[C]instanceof Array?n(h.parts[C][0])+\"-\"+n(h.parts[C][1]):n(h.parts[C]);return\"[\"+(h.inverted?\"^\":\"\")+E+\"]\"},any:function(h){return\"any character\"},end:function(h){return\"end of input\"},other:function(h){return h.description}};function s(h){return h.charCodeAt(0).toString(16).toUpperCase()}function a(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+s(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+s(E)})}function n(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+s(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+s(E)})}function c(h){return r[h.type](h)}function f(h){var E=new Array(h.length),C,S;for(C=0;C<h.length;C++)E[C]=c(h[C]);if(E.sort(),E.length>0){for(C=1,S=1;C<E.length;C++)E[C-1]!==E[C]&&(E[S]=E[C],S++);E.length=S}switch(E.length){case 1:return E[0];case 2:return E[0]+\" or \"+E[1];default:return E.slice(0,-1).join(\", \")+\", or \"+E[E.length-1]}}function p(h){return h?'\"'+a(h)+'\"':\"end of input\"}return\"Expected \"+f(t)+\" but \"+p(e)+\" found.\"};function L5e(t,e){e=e!==void 0?e:{};var r={},s={Start:Wa},a=Wa,n=function(O){return O||[]},c=function(O,K,re){return[{command:O,type:K}].concat(re||[])},f=function(O,K){return[{command:O,type:K||\";\"}]},p=function(O){return O},h=\";\",E=ur(\";\",!1),C=\"&\",S=ur(\"&\",!1),P=function(O,K){return K?{chain:O,then:K}:{chain:O}},I=function(O,K){return{type:O,line:K}},R=\"&&\",N=ur(\"&&\",!1),U=\"||\",W=ur(\"||\",!1),ee=function(O,K){return K?{...O,then:K}:O},ie=function(O,K){return{type:O,chain:K}},ue=\"|&\",le=ur(\"|&\",!1),me=\"|\",pe=ur(\"|\",!1),Be=\"=\",Ce=ur(\"=\",!1),g=function(O,K){return{name:O,args:[K]}},we=function(O){return{name:O,args:[]}},ye=\"(\",Ae=ur(\"(\",!1),se=\")\",Z=ur(\")\",!1),De=function(O,K){return{type:\"subshell\",subshell:O,args:K}},Re=\"{\",mt=ur(\"{\",!1),j=\"}\",rt=ur(\"}\",!1),Fe=function(O,K){return{type:\"group\",group:O,args:K}},Ne=function(O,K){return{type:\"command\",args:K,envs:O}},Pe=function(O){return{type:\"envs\",envs:O}},Ve=function(O){return O},ke=function(O){return O},it=/^[0-9]/,Ue=zi([[\"0\",\"9\"]],!1,!1),x=function(O,K,re){return{type:\"redirection\",subtype:K,fd:O!==null?parseInt(O):null,args:[re]}},w=\">>\",b=ur(\">>\",!1),y=\">&\",F=ur(\">&\",!1),z=\">\",X=ur(\">\",!1),$=\"<<<\",oe=ur(\"<<<\",!1),xe=\"<&\",Te=ur(\"<&\",!1),lt=\"<\",Ct=ur(\"<\",!1),qt=function(O){return{type:\"argument\",segments:[].concat(...O)}},ir=function(O){return O},Pt=\"$'\",gn=ur(\"$'\",!1),Pr=\"'\",Ir=ur(\"'\",!1),Or=function(O){return[{type:\"text\",text:O}]},on='\"\"',ai=ur('\"\"',!1),Io=function(){return{type:\"text\",text:\"\"}},rs='\"',$s=ur('\"',!1),Co=function(O){return O},ji=function(O){return{type:\"arithmetic\",arithmetic:O,quoted:!0}},eo=function(O){return{type:\"shell\",shell:O,quoted:!0}},wo=function(O){return{type:\"variable\",...O,quoted:!0}},QA=function(O){return{type:\"text\",text:O}},Af=function(O){return{type:\"arithmetic\",arithmetic:O,quoted:!1}},dh=function(O){return{type:\"shell\",shell:O,quoted:!1}},mh=function(O){return{type:\"variable\",...O,quoted:!1}},to=function(O){return{type:\"glob\",pattern:O}},jn=/^[^']/,Ts=zi([\"'\"],!0,!1),ro=function(O){return O.join(\"\")},ou=/^[^$\"]/,au=zi([\"$\",'\"'],!0,!1),lu=`\\\\\n`,TA=ur(`\\\\\n`,!1),RA=function(){return\"\"},oa=\"\\\\\",aa=ur(\"\\\\\",!1),FA=/^[\\\\$\"`]/,gr=zi([\"\\\\\",\"$\",'\"',\"`\"],!1,!1),Bo=function(O){return O},Me=\"\\\\a\",cu=ur(\"\\\\a\",!1),Cr=function(){return\"a\"},pf=\"\\\\b\",NA=ur(\"\\\\b\",!1),OA=function(){return\"\\b\"},uu=/^[Ee]/,fu=zi([\"E\",\"e\"],!1,!1),oc=function(){return\"\\x1B\"},ve=\"\\\\f\",Nt=ur(\"\\\\f\",!1),ac=function(){return\"\\f\"},Oi=\"\\\\n\",no=ur(\"\\\\n\",!1),Rt=function(){return`\n`},xn=\"\\\\r\",la=ur(\"\\\\r\",!1),Gi=function(){return\"\\r\"},Li=\"\\\\t\",Na=ur(\"\\\\t\",!1),dn=function(){return\"\t\"},Kn=\"\\\\v\",Au=ur(\"\\\\v\",!1),yh=function(){return\"\\v\"},Oa=/^[\\\\'\"?]/,La=zi([\"\\\\\",\"'\",'\"',\"?\"],!1,!1),Ma=function(O){return String.fromCharCode(parseInt(O,16))},$e=\"\\\\x\",Ua=ur(\"\\\\x\",!1),hf=\"\\\\u\",lc=ur(\"\\\\u\",!1),wn=\"\\\\U\",ca=ur(\"\\\\U\",!1),LA=function(O){return String.fromCodePoint(parseInt(O,16))},MA=/^[0-7]/,ua=zi([[\"0\",\"7\"]],!1,!1),Bl=/^[0-9a-fA-f]/,Mt=zi([[\"0\",\"9\"],[\"a\",\"f\"],[\"A\",\"f\"]],!1,!1),kn=yf(),fa=\"{}\",Ha=ur(\"{}\",!1),ns=function(){return\"{}\"},cc=\"-\",pu=ur(\"-\",!1),uc=\"+\",ja=ur(\"+\",!1),Mi=\".\",Is=ur(\".\",!1),vl=function(O,K,re){return{type:\"number\",value:(O===\"-\"?-1:1)*parseFloat(K.join(\"\")+\".\"+re.join(\"\"))}},gf=function(O,K){return{type:\"number\",value:(O===\"-\"?-1:1)*parseInt(K.join(\"\"))}},fc=function(O){return{type:\"variable\",...O}},wi=function(O){return{type:\"variable\",name:O}},Qn=function(O){return O},Ac=\"*\",Ke=ur(\"*\",!1),st=\"/\",St=ur(\"/\",!1),lr=function(O,K,re){return{type:K===\"*\"?\"multiplication\":\"division\",right:re}},te=function(O,K){return K.reduce((re,de)=>({left:re,...de}),O)},Ee=function(O,K,re){return{type:K===\"+\"?\"addition\":\"subtraction\",right:re}},Oe=\"$((\",dt=ur(\"$((\",!1),Et=\"))\",bt=ur(\"))\",!1),tr=function(O){return O},An=\"$(\",li=ur(\"$(\",!1),qi=function(O){return O},Tn=\"${\",Ga=ur(\"${\",!1),my=\":-\",Z1=ur(\":-\",!1),vo=function(O,K){return{name:O,defaultValue:K}},yy=\":-}\",Eh=ur(\":-}\",!1),$1=function(O){return{name:O,defaultValue:[]}},So=\":+\",Ih=ur(\":+\",!1),Ch=function(O,K){return{name:O,alternativeValue:K}},hu=\":+}\",wh=ur(\":+}\",!1),Fg=function(O){return{name:O,alternativeValue:[]}},Ng=function(O){return{name:O}},Og=\"$\",Ey=ur(\"$\",!1),df=function(O){return e.isGlobPattern(O)},Do=function(O){return O},Sl=/^[a-zA-Z0-9_]/,Bh=zi([[\"a\",\"z\"],[\"A\",\"Z\"],[\"0\",\"9\"],\"_\"],!1,!1),Lg=function(){return By()},Dl=/^[$@*?#a-zA-Z0-9_\\-]/,bl=zi([\"$\",\"@\",\"*\",\"?\",\"#\",[\"a\",\"z\"],[\"A\",\"Z\"],[\"0\",\"9\"],\"_\",\"-\"],!1,!1),Iy=/^[()}<>$|&; \\t\"']/,UA=zi([\"(\",\")\",\"}\",\"<\",\">\",\"$\",\"|\",\"&\",\";\",\" \",\"\t\",'\"',\"'\"],!1,!1),Cy=/^[<>&; \\t\"']/,wy=zi([\"<\",\">\",\"&\",\";\",\" \",\"\t\",'\"',\"'\"],!1,!1),_A=/^[ \\t]/,HA=zi([\" \",\"\t\"],!1,!1),Y=0,xt=0,jA=[{line:1,column:1}],bo=0,mf=[],yt=0,gu;if(\"startRule\"in e){if(!(e.startRule in s))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');a=s[e.startRule]}function By(){return t.substring(xt,Y)}function Mg(){return Ef(xt,Y)}function e2(O,K){throw K=K!==void 0?K:Ef(xt,Y),GA([Ug(O)],t.substring(xt,Y),K)}function vh(O,K){throw K=K!==void 0?K:Ef(xt,Y),di(O,K)}function ur(O,K){return{type:\"literal\",text:O,ignoreCase:K}}function zi(O,K,re){return{type:\"class\",parts:O,inverted:K,ignoreCase:re}}function yf(){return{type:\"any\"}}function qa(){return{type:\"end\"}}function Ug(O){return{type:\"other\",description:O}}function du(O){var K=jA[O],re;if(K)return K;for(re=O-1;!jA[re];)re--;for(K=jA[re],K={line:K.line,column:K.column};re<O;)t.charCodeAt(re)===10?(K.line++,K.column=1):K.column++,re++;return jA[O]=K,K}function Ef(O,K){var re=du(O),de=du(K);return{start:{offset:O,line:re.line,column:re.column},end:{offset:K,line:de.line,column:de.column}}}function wt(O){Y<bo||(Y>bo&&(bo=Y,mf=[]),mf.push(O))}function di(O,K){return new Bd(O,null,null,K)}function GA(O,K,re){return new Bd(Bd.buildMessage(O,K),O,K,re)}function Wa(){var O,K,re;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();return K!==r?(re=Aa(),re===r&&(re=null),re!==r?(xt=O,K=n(re),O=K):(Y=O,O=r)):(Y=O,O=r),O}function Aa(){var O,K,re,de,Je;if(O=Y,K=Sh(),K!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();re!==r?(de=_g(),de!==r?(Je=Ya(),Je===r&&(Je=null),Je!==r?(xt=O,K=c(K,de,Je),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;if(O===r)if(O=Y,K=Sh(),K!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();re!==r?(de=_g(),de===r&&(de=null),de!==r?(xt=O,K=f(K,de),O=K):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;return O}function Ya(){var O,K,re,de,Je;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(re=Aa(),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();de!==r?(xt=O,K=p(re),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r;return O}function _g(){var O;return t.charCodeAt(Y)===59?(O=h,Y++):(O=r,yt===0&&wt(E)),O===r&&(t.charCodeAt(Y)===38?(O=C,Y++):(O=r,yt===0&&wt(S))),O}function Sh(){var O,K,re;return O=Y,K=qA(),K!==r?(re=Hg(),re===r&&(re=null),re!==r?(xt=O,K=P(K,re),O=K):(Y=O,O=r)):(Y=O,O=r),O}function Hg(){var O,K,re,de,Je,At,dr;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(re=vy(),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r)if(Je=Sh(),Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();At!==r?(xt=O,K=I(re,Je),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;return O}function vy(){var O;return t.substr(Y,2)===R?(O=R,Y+=2):(O=r,yt===0&&wt(N)),O===r&&(t.substr(Y,2)===U?(O=U,Y+=2):(O=r,yt===0&&wt(W))),O}function qA(){var O,K,re;return O=Y,K=If(),K!==r?(re=jg(),re===r&&(re=null),re!==r?(xt=O,K=ee(K,re),O=K):(Y=O,O=r)):(Y=O,O=r),O}function jg(){var O,K,re,de,Je,At,dr;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(re=mu(),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r)if(Je=qA(),Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();At!==r?(xt=O,K=ie(re,Je),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;return O}function mu(){var O;return t.substr(Y,2)===ue?(O=ue,Y+=2):(O=r,yt===0&&wt(le)),O===r&&(t.charCodeAt(Y)===124?(O=me,Y++):(O=r,yt===0&&wt(pe))),O}function yu(){var O,K,re,de,Je,At;if(O=Y,K=Ph(),K!==r)if(t.charCodeAt(Y)===61?(re=Be,Y++):(re=r,yt===0&&wt(Ce)),re!==r)if(de=WA(),de!==r){for(Je=[],At=kt();At!==r;)Je.push(At),At=kt();Je!==r?(xt=O,K=g(K,de),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r;else Y=O,O=r;if(O===r)if(O=Y,K=Ph(),K!==r)if(t.charCodeAt(Y)===61?(re=Be,Y++):(re=r,yt===0&&wt(Ce)),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();de!==r?(xt=O,K=we(K),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r;return O}function If(){var O,K,re,de,Je,At,dr,vr,Un,mi,Cs;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(t.charCodeAt(Y)===40?(re=ye,Y++):(re=r,yt===0&&wt(Ae)),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r)if(Je=Aa(),Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();if(At!==r)if(t.charCodeAt(Y)===41?(dr=se,Y++):(dr=r,yt===0&&wt(Z)),dr!==r){for(vr=[],Un=kt();Un!==r;)vr.push(Un),Un=kt();if(vr!==r){for(Un=[],mi=Gn();mi!==r;)Un.push(mi),mi=Gn();if(Un!==r){for(mi=[],Cs=kt();Cs!==r;)mi.push(Cs),Cs=kt();mi!==r?(xt=O,K=De(Je,Un),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;if(O===r){for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(t.charCodeAt(Y)===123?(re=Re,Y++):(re=r,yt===0&&wt(mt)),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r)if(Je=Aa(),Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();if(At!==r)if(t.charCodeAt(Y)===125?(dr=j,Y++):(dr=r,yt===0&&wt(rt)),dr!==r){for(vr=[],Un=kt();Un!==r;)vr.push(Un),Un=kt();if(vr!==r){for(Un=[],mi=Gn();mi!==r;)Un.push(mi),mi=Gn();if(Un!==r){for(mi=[],Cs=kt();Cs!==r;)mi.push(Cs),Cs=kt();mi!==r?(xt=O,K=Fe(Je,Un),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;if(O===r){for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r){for(re=[],de=yu();de!==r;)re.push(de),de=yu();if(re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r){if(Je=[],At=Eu(),At!==r)for(;At!==r;)Je.push(At),At=Eu();else Je=r;if(Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();At!==r?(xt=O,K=Ne(re,Je),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r;if(O===r){for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r){if(re=[],de=yu(),de!==r)for(;de!==r;)re.push(de),de=yu();else re=r;if(re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();de!==r?(xt=O,K=Pe(re),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}}}return O}function Rs(){var O,K,re,de,Je;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r){if(re=[],de=Pi(),de!==r)for(;de!==r;)re.push(de),de=Pi();else re=r;if(re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();de!==r?(xt=O,K=Ve(re),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r;return O}function Eu(){var O,K,re;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r?(re=Gn(),re!==r?(xt=O,K=ke(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r){for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();K!==r?(re=Pi(),re!==r?(xt=O,K=ke(re),O=K):(Y=O,O=r)):(Y=O,O=r)}return O}function Gn(){var O,K,re,de,Je;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();return K!==r?(it.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Ue)),re===r&&(re=null),re!==r?(de=is(),de!==r?(Je=Pi(),Je!==r?(xt=O,K=x(re,de,Je),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function is(){var O;return t.substr(Y,2)===w?(O=w,Y+=2):(O=r,yt===0&&wt(b)),O===r&&(t.substr(Y,2)===y?(O=y,Y+=2):(O=r,yt===0&&wt(F)),O===r&&(t.charCodeAt(Y)===62?(O=z,Y++):(O=r,yt===0&&wt(X)),O===r&&(t.substr(Y,3)===$?(O=$,Y+=3):(O=r,yt===0&&wt(oe)),O===r&&(t.substr(Y,2)===xe?(O=xe,Y+=2):(O=r,yt===0&&wt(Te)),O===r&&(t.charCodeAt(Y)===60?(O=lt,Y++):(O=r,yt===0&&wt(Ct))))))),O}function Pi(){var O,K,re;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();return K!==r?(re=WA(),re!==r?(xt=O,K=ke(re),O=K):(Y=O,O=r)):(Y=O,O=r),O}function WA(){var O,K,re;if(O=Y,K=[],re=Cf(),re!==r)for(;re!==r;)K.push(re),re=Cf();else K=r;return K!==r&&(xt=O,K=qt(K)),O=K,O}function Cf(){var O,K;return O=Y,K=mn(),K!==r&&(xt=O,K=ir(K)),O=K,O===r&&(O=Y,K=Gg(),K!==r&&(xt=O,K=ir(K)),O=K,O===r&&(O=Y,K=qg(),K!==r&&(xt=O,K=ir(K)),O=K,O===r&&(O=Y,K=ss(),K!==r&&(xt=O,K=ir(K)),O=K))),O}function mn(){var O,K,re,de;return O=Y,t.substr(Y,2)===Pt?(K=Pt,Y+=2):(K=r,yt===0&&wt(gn)),K!==r?(re=yn(),re!==r?(t.charCodeAt(Y)===39?(de=Pr,Y++):(de=r,yt===0&&wt(Ir)),de!==r?(xt=O,K=Or(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function Gg(){var O,K,re,de;return O=Y,t.charCodeAt(Y)===39?(K=Pr,Y++):(K=r,yt===0&&wt(Ir)),K!==r?(re=wf(),re!==r?(t.charCodeAt(Y)===39?(de=Pr,Y++):(de=r,yt===0&&wt(Ir)),de!==r?(xt=O,K=Or(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function qg(){var O,K,re,de;if(O=Y,t.substr(Y,2)===on?(K=on,Y+=2):(K=r,yt===0&&wt(ai)),K!==r&&(xt=O,K=Io()),O=K,O===r)if(O=Y,t.charCodeAt(Y)===34?(K=rs,Y++):(K=r,yt===0&&wt($s)),K!==r){for(re=[],de=Pl();de!==r;)re.push(de),de=Pl();re!==r?(t.charCodeAt(Y)===34?(de=rs,Y++):(de=r,yt===0&&wt($s)),de!==r?(xt=O,K=Co(re),O=K):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;return O}function ss(){var O,K,re;if(O=Y,K=[],re=Po(),re!==r)for(;re!==r;)K.push(re),re=Po();else K=r;return K!==r&&(xt=O,K=Co(K)),O=K,O}function Pl(){var O,K;return O=Y,K=Zr(),K!==r&&(xt=O,K=ji(K)),O=K,O===r&&(O=Y,K=bh(),K!==r&&(xt=O,K=eo(K)),O=K,O===r&&(O=Y,K=VA(),K!==r&&(xt=O,K=wo(K)),O=K,O===r&&(O=Y,K=Bf(),K!==r&&(xt=O,K=QA(K)),O=K))),O}function Po(){var O,K;return O=Y,K=Zr(),K!==r&&(xt=O,K=Af(K)),O=K,O===r&&(O=Y,K=bh(),K!==r&&(xt=O,K=dh(K)),O=K,O===r&&(O=Y,K=VA(),K!==r&&(xt=O,K=mh(K)),O=K,O===r&&(O=Y,K=Sy(),K!==r&&(xt=O,K=to(K)),O=K,O===r&&(O=Y,K=Dh(),K!==r&&(xt=O,K=QA(K)),O=K)))),O}function wf(){var O,K,re;for(O=Y,K=[],jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Ts));re!==r;)K.push(re),jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Ts));return K!==r&&(xt=O,K=ro(K)),O=K,O}function Bf(){var O,K,re;if(O=Y,K=[],re=xl(),re===r&&(ou.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(au))),re!==r)for(;re!==r;)K.push(re),re=xl(),re===r&&(ou.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(au)));else K=r;return K!==r&&(xt=O,K=ro(K)),O=K,O}function xl(){var O,K,re;return O=Y,t.substr(Y,2)===lu?(K=lu,Y+=2):(K=r,yt===0&&wt(TA)),K!==r&&(xt=O,K=RA()),O=K,O===r&&(O=Y,t.charCodeAt(Y)===92?(K=oa,Y++):(K=r,yt===0&&wt(aa)),K!==r?(FA.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(gr)),re!==r?(xt=O,K=Bo(re),O=K):(Y=O,O=r)):(Y=O,O=r)),O}function yn(){var O,K,re;for(O=Y,K=[],re=xo(),re===r&&(jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Ts)));re!==r;)K.push(re),re=xo(),re===r&&(jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Ts)));return K!==r&&(xt=O,K=ro(K)),O=K,O}function xo(){var O,K,re;return O=Y,t.substr(Y,2)===Me?(K=Me,Y+=2):(K=r,yt===0&&wt(cu)),K!==r&&(xt=O,K=Cr()),O=K,O===r&&(O=Y,t.substr(Y,2)===pf?(K=pf,Y+=2):(K=r,yt===0&&wt(NA)),K!==r&&(xt=O,K=OA()),O=K,O===r&&(O=Y,t.charCodeAt(Y)===92?(K=oa,Y++):(K=r,yt===0&&wt(aa)),K!==r?(uu.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(fu)),re!==r?(xt=O,K=oc(),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===ve?(K=ve,Y+=2):(K=r,yt===0&&wt(Nt)),K!==r&&(xt=O,K=ac()),O=K,O===r&&(O=Y,t.substr(Y,2)===Oi?(K=Oi,Y+=2):(K=r,yt===0&&wt(no)),K!==r&&(xt=O,K=Rt()),O=K,O===r&&(O=Y,t.substr(Y,2)===xn?(K=xn,Y+=2):(K=r,yt===0&&wt(la)),K!==r&&(xt=O,K=Gi()),O=K,O===r&&(O=Y,t.substr(Y,2)===Li?(K=Li,Y+=2):(K=r,yt===0&&wt(Na)),K!==r&&(xt=O,K=dn()),O=K,O===r&&(O=Y,t.substr(Y,2)===Kn?(K=Kn,Y+=2):(K=r,yt===0&&wt(Au)),K!==r&&(xt=O,K=yh()),O=K,O===r&&(O=Y,t.charCodeAt(Y)===92?(K=oa,Y++):(K=r,yt===0&&wt(aa)),K!==r?(Oa.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(La)),re!==r?(xt=O,K=Bo(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Iu()))))))))),O}function Iu(){var O,K,re,de,Je,At,dr,vr,Un,mi,Cs,JA;return O=Y,t.charCodeAt(Y)===92?(K=oa,Y++):(K=r,yt===0&&wt(aa)),K!==r?(re=pa(),re!==r?(xt=O,K=Ma(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===$e?(K=$e,Y+=2):(K=r,yt===0&&wt(Ua)),K!==r?(re=Y,de=Y,Je=pa(),Je!==r?(At=Fs(),At!==r?(Je=[Je,At],de=Je):(Y=de,de=r)):(Y=de,de=r),de===r&&(de=pa()),de!==r?re=t.substring(re,Y):re=de,re!==r?(xt=O,K=Ma(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===hf?(K=hf,Y+=2):(K=r,yt===0&&wt(lc)),K!==r?(re=Y,de=Y,Je=Fs(),Je!==r?(At=Fs(),At!==r?(dr=Fs(),dr!==r?(vr=Fs(),vr!==r?(Je=[Je,At,dr,vr],de=Je):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r),de!==r?re=t.substring(re,Y):re=de,re!==r?(xt=O,K=Ma(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===wn?(K=wn,Y+=2):(K=r,yt===0&&wt(ca)),K!==r?(re=Y,de=Y,Je=Fs(),Je!==r?(At=Fs(),At!==r?(dr=Fs(),dr!==r?(vr=Fs(),vr!==r?(Un=Fs(),Un!==r?(mi=Fs(),mi!==r?(Cs=Fs(),Cs!==r?(JA=Fs(),JA!==r?(Je=[Je,At,dr,vr,Un,mi,Cs,JA],de=Je):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r),de!==r?re=t.substring(re,Y):re=de,re!==r?(xt=O,K=LA(re),O=K):(Y=O,O=r)):(Y=O,O=r)))),O}function pa(){var O;return MA.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,yt===0&&wt(ua)),O}function Fs(){var O;return Bl.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,yt===0&&wt(Mt)),O}function Dh(){var O,K,re,de,Je;if(O=Y,K=[],re=Y,t.charCodeAt(Y)===92?(de=oa,Y++):(de=r,yt===0&&wt(aa)),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r),re===r&&(re=Y,t.substr(Y,2)===fa?(de=fa,Y+=2):(de=r,yt===0&&wt(Ha)),de!==r&&(xt=re,de=ns()),re=de,re===r&&(re=Y,de=Y,yt++,Je=Dy(),yt--,Je===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r))),re!==r)for(;re!==r;)K.push(re),re=Y,t.charCodeAt(Y)===92?(de=oa,Y++):(de=r,yt===0&&wt(aa)),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r),re===r&&(re=Y,t.substr(Y,2)===fa?(de=fa,Y+=2):(de=r,yt===0&&wt(Ha)),de!==r&&(xt=re,de=ns()),re=de,re===r&&(re=Y,de=Y,yt++,Je=Dy(),yt--,Je===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r)));else K=r;return K!==r&&(xt=O,K=ro(K)),O=K,O}function YA(){var O,K,re,de,Je,At;if(O=Y,t.charCodeAt(Y)===45?(K=cc,Y++):(K=r,yt===0&&wt(pu)),K===r&&(t.charCodeAt(Y)===43?(K=uc,Y++):(K=r,yt===0&&wt(ja))),K===r&&(K=null),K!==r){if(re=[],it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,yt===0&&wt(Ue)),de!==r)for(;de!==r;)re.push(de),it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,yt===0&&wt(Ue));else re=r;if(re!==r)if(t.charCodeAt(Y)===46?(de=Mi,Y++):(de=r,yt===0&&wt(Is)),de!==r){if(Je=[],it.test(t.charAt(Y))?(At=t.charAt(Y),Y++):(At=r,yt===0&&wt(Ue)),At!==r)for(;At!==r;)Je.push(At),it.test(t.charAt(Y))?(At=t.charAt(Y),Y++):(At=r,yt===0&&wt(Ue));else Je=r;Je!==r?(xt=O,K=vl(K,re,Je),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;if(O===r){if(O=Y,t.charCodeAt(Y)===45?(K=cc,Y++):(K=r,yt===0&&wt(pu)),K===r&&(t.charCodeAt(Y)===43?(K=uc,Y++):(K=r,yt===0&&wt(ja))),K===r&&(K=null),K!==r){if(re=[],it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,yt===0&&wt(Ue)),de!==r)for(;de!==r;)re.push(de),it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,yt===0&&wt(Ue));else re=r;re!==r?(xt=O,K=gf(K,re),O=K):(Y=O,O=r)}else Y=O,O=r;if(O===r&&(O=Y,K=VA(),K!==r&&(xt=O,K=fc(K)),O=K,O===r&&(O=Y,K=pc(),K!==r&&(xt=O,K=wi(K)),O=K,O===r)))if(O=Y,t.charCodeAt(Y)===40?(K=ye,Y++):(K=r,yt===0&&wt(Ae)),K!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();if(re!==r)if(de=io(),de!==r){for(Je=[],At=kt();At!==r;)Je.push(At),At=kt();Je!==r?(t.charCodeAt(Y)===41?(At=se,Y++):(At=r,yt===0&&wt(Z)),At!==r?(xt=O,K=Qn(de),O=K):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r}return O}function vf(){var O,K,re,de,Je,At,dr,vr;if(O=Y,K=YA(),K!==r){for(re=[],de=Y,Je=[],At=kt();At!==r;)Je.push(At),At=kt();if(Je!==r)if(t.charCodeAt(Y)===42?(At=Ac,Y++):(At=r,yt===0&&wt(Ke)),At===r&&(t.charCodeAt(Y)===47?(At=st,Y++):(At=r,yt===0&&wt(St))),At!==r){for(dr=[],vr=kt();vr!==r;)dr.push(vr),vr=kt();dr!==r?(vr=YA(),vr!==r?(xt=de,Je=lr(K,At,vr),de=Je):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r;for(;de!==r;){for(re.push(de),de=Y,Je=[],At=kt();At!==r;)Je.push(At),At=kt();if(Je!==r)if(t.charCodeAt(Y)===42?(At=Ac,Y++):(At=r,yt===0&&wt(Ke)),At===r&&(t.charCodeAt(Y)===47?(At=st,Y++):(At=r,yt===0&&wt(St))),At!==r){for(dr=[],vr=kt();vr!==r;)dr.push(vr),vr=kt();dr!==r?(vr=YA(),vr!==r?(xt=de,Je=lr(K,At,vr),de=Je):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r}re!==r?(xt=O,K=te(K,re),O=K):(Y=O,O=r)}else Y=O,O=r;return O}function io(){var O,K,re,de,Je,At,dr,vr;if(O=Y,K=vf(),K!==r){for(re=[],de=Y,Je=[],At=kt();At!==r;)Je.push(At),At=kt();if(Je!==r)if(t.charCodeAt(Y)===43?(At=uc,Y++):(At=r,yt===0&&wt(ja)),At===r&&(t.charCodeAt(Y)===45?(At=cc,Y++):(At=r,yt===0&&wt(pu))),At!==r){for(dr=[],vr=kt();vr!==r;)dr.push(vr),vr=kt();dr!==r?(vr=vf(),vr!==r?(xt=de,Je=Ee(K,At,vr),de=Je):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r;for(;de!==r;){for(re.push(de),de=Y,Je=[],At=kt();At!==r;)Je.push(At),At=kt();if(Je!==r)if(t.charCodeAt(Y)===43?(At=uc,Y++):(At=r,yt===0&&wt(ja)),At===r&&(t.charCodeAt(Y)===45?(At=cc,Y++):(At=r,yt===0&&wt(pu))),At!==r){for(dr=[],vr=kt();vr!==r;)dr.push(vr),vr=kt();dr!==r?(vr=vf(),vr!==r?(xt=de,Je=Ee(K,At,vr),de=Je):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r}re!==r?(xt=O,K=te(K,re),O=K):(Y=O,O=r)}else Y=O,O=r;return O}function Zr(){var O,K,re,de,Je,At;if(O=Y,t.substr(Y,3)===Oe?(K=Oe,Y+=3):(K=r,yt===0&&wt(dt)),K!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();if(re!==r)if(de=io(),de!==r){for(Je=[],At=kt();At!==r;)Je.push(At),At=kt();Je!==r?(t.substr(Y,2)===Et?(At=Et,Y+=2):(At=r,yt===0&&wt(bt)),At!==r?(xt=O,K=tr(de),O=K):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;return O}function bh(){var O,K,re,de;return O=Y,t.substr(Y,2)===An?(K=An,Y+=2):(K=r,yt===0&&wt(li)),K!==r?(re=Aa(),re!==r?(t.charCodeAt(Y)===41?(de=se,Y++):(de=r,yt===0&&wt(Z)),de!==r?(xt=O,K=qi(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function VA(){var O,K,re,de,Je,At;return O=Y,t.substr(Y,2)===Tn?(K=Tn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.substr(Y,2)===my?(de=my,Y+=2):(de=r,yt===0&&wt(Z1)),de!==r?(Je=Rs(),Je!==r?(t.charCodeAt(Y)===125?(At=j,Y++):(At=r,yt===0&&wt(rt)),At!==r?(xt=O,K=vo(re,Je),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Tn?(K=Tn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.substr(Y,3)===yy?(de=yy,Y+=3):(de=r,yt===0&&wt(Eh)),de!==r?(xt=O,K=$1(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Tn?(K=Tn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.substr(Y,2)===So?(de=So,Y+=2):(de=r,yt===0&&wt(Ih)),de!==r?(Je=Rs(),Je!==r?(t.charCodeAt(Y)===125?(At=j,Y++):(At=r,yt===0&&wt(rt)),At!==r?(xt=O,K=Ch(re,Je),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Tn?(K=Tn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.substr(Y,3)===hu?(de=hu,Y+=3):(de=r,yt===0&&wt(wh)),de!==r?(xt=O,K=Fg(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Tn?(K=Tn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.charCodeAt(Y)===125?(de=j,Y++):(de=r,yt===0&&wt(rt)),de!==r?(xt=O,K=Ng(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.charCodeAt(Y)===36?(K=Og,Y++):(K=r,yt===0&&wt(Ey)),K!==r?(re=pc(),re!==r?(xt=O,K=Ng(re),O=K):(Y=O,O=r)):(Y=O,O=r)))))),O}function Sy(){var O,K,re;return O=Y,K=Wg(),K!==r?(xt=Y,re=df(K),re?re=void 0:re=r,re!==r?(xt=O,K=Do(K),O=K):(Y=O,O=r)):(Y=O,O=r),O}function Wg(){var O,K,re,de,Je;if(O=Y,K=[],re=Y,de=Y,yt++,Je=xh(),yt--,Je===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r),re!==r)for(;re!==r;)K.push(re),re=Y,de=Y,yt++,Je=xh(),yt--,Je===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r);else K=r;return K!==r&&(xt=O,K=ro(K)),O=K,O}function Ph(){var O,K,re;if(O=Y,K=[],Sl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Bh)),re!==r)for(;re!==r;)K.push(re),Sl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Bh));else K=r;return K!==r&&(xt=O,K=Lg()),O=K,O}function pc(){var O,K,re;if(O=Y,K=[],Dl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(bl)),re!==r)for(;re!==r;)K.push(re),Dl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(bl));else K=r;return K!==r&&(xt=O,K=Lg()),O=K,O}function Dy(){var O;return Iy.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,yt===0&&wt(UA)),O}function xh(){var O;return Cy.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,yt===0&&wt(wy)),O}function kt(){var O,K;if(O=[],_A.test(t.charAt(Y))?(K=t.charAt(Y),Y++):(K=r,yt===0&&wt(HA)),K!==r)for(;K!==r;)O.push(K),_A.test(t.charAt(Y))?(K=t.charAt(Y),Y++):(K=r,yt===0&&wt(HA));else O=r;return O}if(gu=a(),gu!==r&&Y===t.length)return gu;throw gu!==r&&Y<t.length&&wt(qa()),GA(mf,bo<t.length?t.charAt(bo):null,bo<t.length?Ef(bo,bo+1):Ef(bo,bo))}mee.exports={SyntaxError:Bd,parse:L5e}});function ux(t,e={isGlobPattern:()=>!1}){try{return(0,Eee.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function fE(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:s},a)=>`${fx(r)}${s===\";\"?a!==t.length-1||e?\";\":\"\":\" &\"}`).join(\" \")}function fx(t){return`${AE(t.chain)}${t.then?` ${HU(t.then)}`:\"\"}`}function HU(t){return`${t.type} ${fx(t.line)}`}function AE(t){return`${GU(t)}${t.then?` ${jU(t.then)}`:\"\"}`}function jU(t){return`${t.type} ${AE(t.chain)}`}function GU(t){switch(t.type){case\"command\":return`${t.envs.length>0?`${t.envs.map(e=>cx(e)).join(\" \")} `:\"\"}${t.args.map(e=>qU(e)).join(\" \")}`;case\"subshell\":return`(${fE(t.subshell)})${t.args.length>0?` ${t.args.map(e=>H2(e)).join(\" \")}`:\"\"}`;case\"group\":return`{ ${fE(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>H2(e)).join(\" \")}`:\"\"}`;case\"envs\":return t.envs.map(e=>cx(e)).join(\" \");default:throw new Error(`Unsupported command type:  \"${t.type}\"`)}}function cx(t){return`${t.name}=${t.args[0]?vd(t.args[0]):\"\"}`}function qU(t){switch(t.type){case\"redirection\":return H2(t);case\"argument\":return vd(t);default:throw new Error(`Unsupported argument type: \"${t.type}\"`)}}function H2(t){return`${t.subtype} ${t.args.map(e=>vd(e)).join(\" \")}`}function vd(t){return t.segments.map(e=>WU(e)).join(\"\")}function WU(t){let e=(s,a)=>a?`\"${s}\"`:s,r=s=>s===\"\"?\"''\":s.match(/[()}<>$|&;\"'\\n\\t ]/)?s.match(/['\\t\\p{C}]/u)?s.match(/'/)?`\"${s.replace(/[\"$\\t\\p{C}]/u,U5e)}\"`:`$'${s.replace(/[\\t\\p{C}]/u,Cee)}'`:`'${s}'`:s;switch(t.type){case\"text\":return r(t.text);case\"glob\":return t.pattern;case\"shell\":return e(`$(${fE(t.shell)})`,t.quoted);case\"variable\":return e(typeof t.defaultValue>\"u\"?typeof t.alternativeValue>\"u\"?`\\${${t.name}}`:t.alternativeValue.length===0?`\\${${t.name}:+}`:`\\${${t.name}:+${t.alternativeValue.map(s=>vd(s)).join(\" \")}}`:t.defaultValue.length===0?`\\${${t.name}:-}`:`\\${${t.name}:-${t.defaultValue.map(s=>vd(s)).join(\" \")}}`,t.quoted);case\"arithmetic\":return`$(( ${Ax(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: \"${t.type}\"`)}}function Ax(t){let e=a=>{switch(a){case\"addition\":return\"+\";case\"subtraction\":return\"-\";case\"multiplication\":return\"*\";case\"division\":return\"/\";default:throw new Error(`Can't extract operator from arithmetic expression of type \"${a}\"`)}},r=(a,n)=>n?`( ${a} )`:a,s=a=>r(Ax(a),![\"number\",\"variable\"].includes(a.type));switch(t.type){case\"number\":return String(t.value);case\"variable\":return t.name;default:return`${s(t.left)} ${e(t.type)} ${s(t.right)}`}}var Eee,Iee,M5e,Cee,U5e,wee=Xe(()=>{Eee=ut(yee());Iee=new Map([[\"\\f\",\"\\\\f\"],[`\n`,\"\\\\n\"],[\"\\r\",\"\\\\r\"],[\"\t\",\"\\\\t\"],[\"\\v\",\"\\\\v\"],[\"\\0\",\"\\\\0\"]]),M5e=new Map([[\"\\\\\",\"\\\\\\\\\"],[\"$\",\"\\\\$\"],['\"','\\\\\"'],...Array.from(Iee,([t,e])=>[t,`\"$'${e}'\"`])]),Cee=t=>Iee.get(t)??`\\\\x${t.charCodeAt(0).toString(16).padStart(2,\"0\")}`,U5e=t=>M5e.get(t)??`\"$'${Cee(t)}'\"`});var vee=_((eQt,Bee)=>{\"use strict\";function _5e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Sd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,Sd)}_5e(Sd,Error);Sd.buildMessage=function(t,e){var r={literal:function(h){return'\"'+a(h.text)+'\"'},class:function(h){var E=\"\",C;for(C=0;C<h.parts.length;C++)E+=h.parts[C]instanceof Array?n(h.parts[C][0])+\"-\"+n(h.parts[C][1]):n(h.parts[C]);return\"[\"+(h.inverted?\"^\":\"\")+E+\"]\"},any:function(h){return\"any character\"},end:function(h){return\"end of input\"},other:function(h){return h.description}};function s(h){return h.charCodeAt(0).toString(16).toUpperCase()}function a(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+s(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+s(E)})}function n(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+s(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+s(E)})}function c(h){return r[h.type](h)}function f(h){var E=new Array(h.length),C,S;for(C=0;C<h.length;C++)E[C]=c(h[C]);if(E.sort(),E.length>0){for(C=1,S=1;C<E.length;C++)E[C-1]!==E[C]&&(E[S]=E[C],S++);E.length=S}switch(E.length){case 1:return E[0];case 2:return E[0]+\" or \"+E[1];default:return E.slice(0,-1).join(\", \")+\", or \"+E[E.length-1]}}function p(h){return h?'\"'+a(h)+'\"':\"end of input\"}return\"Expected \"+f(t)+\" but \"+p(e)+\" found.\"};function H5e(t,e){e=e!==void 0?e:{};var r={},s={resolution:Ne},a=Ne,n=\"/\",c=ye(\"/\",!1),f=function(Ue,x){return{from:Ue,descriptor:x}},p=function(Ue){return{descriptor:Ue}},h=\"@\",E=ye(\"@\",!1),C=function(Ue,x){return{fullName:Ue,description:x}},S=function(Ue){return{fullName:Ue}},P=function(){return Be()},I=/^[^\\/@]/,R=Ae([\"/\",\"@\"],!0,!1),N=/^[^\\/]/,U=Ae([\"/\"],!0,!1),W=0,ee=0,ie=[{line:1,column:1}],ue=0,le=[],me=0,pe;if(\"startRule\"in e){if(!(e.startRule in s))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');a=s[e.startRule]}function Be(){return t.substring(ee,W)}function Ce(){return mt(ee,W)}function g(Ue,x){throw x=x!==void 0?x:mt(ee,W),Fe([De(Ue)],t.substring(ee,W),x)}function we(Ue,x){throw x=x!==void 0?x:mt(ee,W),rt(Ue,x)}function ye(Ue,x){return{type:\"literal\",text:Ue,ignoreCase:x}}function Ae(Ue,x,w){return{type:\"class\",parts:Ue,inverted:x,ignoreCase:w}}function se(){return{type:\"any\"}}function Z(){return{type:\"end\"}}function De(Ue){return{type:\"other\",description:Ue}}function Re(Ue){var x=ie[Ue],w;if(x)return x;for(w=Ue-1;!ie[w];)w--;for(x=ie[w],x={line:x.line,column:x.column};w<Ue;)t.charCodeAt(w)===10?(x.line++,x.column=1):x.column++,w++;return ie[Ue]=x,x}function mt(Ue,x){var w=Re(Ue),b=Re(x);return{start:{offset:Ue,line:w.line,column:w.column},end:{offset:x,line:b.line,column:b.column}}}function j(Ue){W<ue||(W>ue&&(ue=W,le=[]),le.push(Ue))}function rt(Ue,x){return new Sd(Ue,null,null,x)}function Fe(Ue,x,w){return new Sd(Sd.buildMessage(Ue,x),Ue,x,w)}function Ne(){var Ue,x,w,b;return Ue=W,x=Pe(),x!==r?(t.charCodeAt(W)===47?(w=n,W++):(w=r,me===0&&j(c)),w!==r?(b=Pe(),b!==r?(ee=Ue,x=f(x,b),Ue=x):(W=Ue,Ue=r)):(W=Ue,Ue=r)):(W=Ue,Ue=r),Ue===r&&(Ue=W,x=Pe(),x!==r&&(ee=Ue,x=p(x)),Ue=x),Ue}function Pe(){var Ue,x,w,b;return Ue=W,x=Ve(),x!==r?(t.charCodeAt(W)===64?(w=h,W++):(w=r,me===0&&j(E)),w!==r?(b=it(),b!==r?(ee=Ue,x=C(x,b),Ue=x):(W=Ue,Ue=r)):(W=Ue,Ue=r)):(W=Ue,Ue=r),Ue===r&&(Ue=W,x=Ve(),x!==r&&(ee=Ue,x=S(x)),Ue=x),Ue}function Ve(){var Ue,x,w,b,y;return Ue=W,t.charCodeAt(W)===64?(x=h,W++):(x=r,me===0&&j(E)),x!==r?(w=ke(),w!==r?(t.charCodeAt(W)===47?(b=n,W++):(b=r,me===0&&j(c)),b!==r?(y=ke(),y!==r?(ee=Ue,x=P(),Ue=x):(W=Ue,Ue=r)):(W=Ue,Ue=r)):(W=Ue,Ue=r)):(W=Ue,Ue=r),Ue===r&&(Ue=W,x=ke(),x!==r&&(ee=Ue,x=P()),Ue=x),Ue}function ke(){var Ue,x,w;if(Ue=W,x=[],I.test(t.charAt(W))?(w=t.charAt(W),W++):(w=r,me===0&&j(R)),w!==r)for(;w!==r;)x.push(w),I.test(t.charAt(W))?(w=t.charAt(W),W++):(w=r,me===0&&j(R));else x=r;return x!==r&&(ee=Ue,x=P()),Ue=x,Ue}function it(){var Ue,x,w;if(Ue=W,x=[],N.test(t.charAt(W))?(w=t.charAt(W),W++):(w=r,me===0&&j(U)),w!==r)for(;w!==r;)x.push(w),N.test(t.charAt(W))?(w=t.charAt(W),W++):(w=r,me===0&&j(U));else x=r;return x!==r&&(ee=Ue,x=P()),Ue=x,Ue}if(pe=a(),pe!==r&&W===t.length)return pe;throw pe!==r&&W<t.length&&j(Z()),Fe(le,ue<t.length?t.charAt(ue):null,ue<t.length?mt(ue,ue+1):mt(ue,ue))}Bee.exports={SyntaxError:Sd,parse:H5e}});function px(t){let e=t.match(/^\\*{1,2}\\/(.*)/);if(e)throw new Error(`The override for '${t}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,See.parse)(t)}catch(r){throw r.location&&(r.message=r.message.replace(/(\\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function hx(t){let e=\"\";return t.from&&(e+=t.from.fullName,t.from.description&&(e+=`@${t.from.description}`),e+=\"/\"),e+=t.descriptor.fullName,t.descriptor.description&&(e+=`@${t.descriptor.description}`),e}var See,Dee=Xe(()=>{See=ut(vee())});var bd=_((rQt,Dd)=>{\"use strict\";function bee(t){return typeof t>\"u\"||t===null}function j5e(t){return typeof t==\"object\"&&t!==null}function G5e(t){return Array.isArray(t)?t:bee(t)?[]:[t]}function q5e(t,e){var r,s,a,n;if(e)for(n=Object.keys(e),r=0,s=n.length;r<s;r+=1)a=n[r],t[a]=e[a];return t}function W5e(t,e){var r=\"\",s;for(s=0;s<e;s+=1)r+=t;return r}function Y5e(t){return t===0&&Number.NEGATIVE_INFINITY===1/t}Dd.exports.isNothing=bee;Dd.exports.isObject=j5e;Dd.exports.toArray=G5e;Dd.exports.repeat=W5e;Dd.exports.isNegativeZero=Y5e;Dd.exports.extend=q5e});var pE=_((nQt,Pee)=>{\"use strict\";function j2(t,e){Error.call(this),this.name=\"YAMLException\",this.reason=t,this.mark=e,this.message=(this.reason||\"(unknown reason)\")+(this.mark?\" \"+this.mark.toString():\"\"),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||\"\"}j2.prototype=Object.create(Error.prototype);j2.prototype.constructor=j2;j2.prototype.toString=function(e){var r=this.name+\": \";return r+=this.reason||\"(unknown reason)\",!e&&this.mark&&(r+=\" \"+this.mark.toString()),r};Pee.exports=j2});var Qee=_((iQt,kee)=>{\"use strict\";var xee=bd();function YU(t,e,r,s,a){this.name=t,this.buffer=e,this.position=r,this.line=s,this.column=a}YU.prototype.getSnippet=function(e,r){var s,a,n,c,f;if(!this.buffer)return null;for(e=e||4,r=r||75,s=\"\",a=this.position;a>0&&`\\0\\r\n\\x85\\u2028\\u2029`.indexOf(this.buffer.charAt(a-1))===-1;)if(a-=1,this.position-a>r/2-1){s=\" ... \",a+=5;break}for(n=\"\",c=this.position;c<this.buffer.length&&`\\0\\r\n\\x85\\u2028\\u2029`.indexOf(this.buffer.charAt(c))===-1;)if(c+=1,c-this.position>r/2-1){n=\" ... \",c-=5;break}return f=this.buffer.slice(a,c),xee.repeat(\" \",e)+s+f+n+`\n`+xee.repeat(\" \",e+this.position-a+s.length)+\"^\"};YU.prototype.toString=function(e){var r,s=\"\";return this.name&&(s+='in \"'+this.name+'\" '),s+=\"at line \"+(this.line+1)+\", column \"+(this.column+1),e||(r=this.getSnippet(),r&&(s+=`:\n`+r)),s};kee.exports=YU});var Ss=_((sQt,Ree)=>{\"use strict\";var Tee=pE(),V5e=[\"kind\",\"resolve\",\"construct\",\"instanceOf\",\"predicate\",\"represent\",\"defaultStyle\",\"styleAliases\"],J5e=[\"scalar\",\"sequence\",\"mapping\"];function K5e(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(s){e[String(s)]=r})}),e}function z5e(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(V5e.indexOf(r)===-1)throw new Tee('Unknown option \"'+r+'\" is met in definition of \"'+t+'\" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=K5e(e.styleAliases||null),J5e.indexOf(this.kind)===-1)throw new Tee('Unknown kind \"'+this.kind+'\" is specified for \"'+t+'\" YAML type.')}Ree.exports=z5e});var Pd=_((oQt,Nee)=>{\"use strict\";var Fee=bd(),gx=pE(),X5e=Ss();function VU(t,e,r){var s=[];return t.include.forEach(function(a){r=VU(a,e,r)}),t[e].forEach(function(a){r.forEach(function(n,c){n.tag===a.tag&&n.kind===a.kind&&s.push(c)}),r.push(a)}),r.filter(function(a,n){return s.indexOf(n)===-1})}function Z5e(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function s(a){t[a.kind][a.tag]=t.fallback[a.tag]=a}for(e=0,r=arguments.length;e<r;e+=1)arguments[e].forEach(s);return t}function hE(t){this.include=t.include||[],this.implicit=t.implicit||[],this.explicit=t.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&e.loadKind!==\"scalar\")throw new gx(\"There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.\")}),this.compiledImplicit=VU(this,\"implicit\",[]),this.compiledExplicit=VU(this,\"explicit\",[]),this.compiledTypeMap=Z5e(this.compiledImplicit,this.compiledExplicit)}hE.DEFAULT=null;hE.create=function(){var e,r;switch(arguments.length){case 1:e=hE.DEFAULT,r=arguments[0];break;case 2:e=arguments[0],r=arguments[1];break;default:throw new gx(\"Wrong number of arguments for Schema.create function\")}if(e=Fee.toArray(e),r=Fee.toArray(r),!e.every(function(s){return s instanceof hE}))throw new gx(\"Specified list of super schemas (or a single Schema object) contains a non-Schema object.\");if(!r.every(function(s){return s instanceof X5e}))throw new gx(\"Specified list of YAML types (or a single Type object) contains a non-Type object.\");return new hE({include:e,explicit:r})};Nee.exports=hE});var Lee=_((aQt,Oee)=>{\"use strict\";var $5e=Ss();Oee.exports=new $5e(\"tag:yaml.org,2002:str\",{kind:\"scalar\",construct:function(t){return t!==null?t:\"\"}})});var Uee=_((lQt,Mee)=>{\"use strict\";var eqe=Ss();Mee.exports=new eqe(\"tag:yaml.org,2002:seq\",{kind:\"sequence\",construct:function(t){return t!==null?t:[]}})});var Hee=_((cQt,_ee)=>{\"use strict\";var tqe=Ss();_ee.exports=new tqe(\"tag:yaml.org,2002:map\",{kind:\"mapping\",construct:function(t){return t!==null?t:{}}})});var dx=_((uQt,jee)=>{\"use strict\";var rqe=Pd();jee.exports=new rqe({explicit:[Lee(),Uee(),Hee()]})});var qee=_((fQt,Gee)=>{\"use strict\";var nqe=Ss();function iqe(t){if(t===null)return!0;var e=t.length;return e===1&&t===\"~\"||e===4&&(t===\"null\"||t===\"Null\"||t===\"NULL\")}function sqe(){return null}function oqe(t){return t===null}Gee.exports=new nqe(\"tag:yaml.org,2002:null\",{kind:\"scalar\",resolve:iqe,construct:sqe,predicate:oqe,represent:{canonical:function(){return\"~\"},lowercase:function(){return\"null\"},uppercase:function(){return\"NULL\"},camelcase:function(){return\"Null\"}},defaultStyle:\"lowercase\"})});var Yee=_((AQt,Wee)=>{\"use strict\";var aqe=Ss();function lqe(t){if(t===null)return!1;var e=t.length;return e===4&&(t===\"true\"||t===\"True\"||t===\"TRUE\")||e===5&&(t===\"false\"||t===\"False\"||t===\"FALSE\")}function cqe(t){return t===\"true\"||t===\"True\"||t===\"TRUE\"}function uqe(t){return Object.prototype.toString.call(t)===\"[object Boolean]\"}Wee.exports=new aqe(\"tag:yaml.org,2002:bool\",{kind:\"scalar\",resolve:lqe,construct:cqe,predicate:uqe,represent:{lowercase:function(t){return t?\"true\":\"false\"},uppercase:function(t){return t?\"TRUE\":\"FALSE\"},camelcase:function(t){return t?\"True\":\"False\"}},defaultStyle:\"lowercase\"})});var Jee=_((pQt,Vee)=>{\"use strict\";var fqe=bd(),Aqe=Ss();function pqe(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function hqe(t){return 48<=t&&t<=55}function gqe(t){return 48<=t&&t<=57}function dqe(t){if(t===null)return!1;var e=t.length,r=0,s=!1,a;if(!e)return!1;if(a=t[r],(a===\"-\"||a===\"+\")&&(a=t[++r]),a===\"0\"){if(r+1===e)return!0;if(a=t[++r],a===\"b\"){for(r++;r<e;r++)if(a=t[r],a!==\"_\"){if(a!==\"0\"&&a!==\"1\")return!1;s=!0}return s&&a!==\"_\"}if(a===\"x\"){for(r++;r<e;r++)if(a=t[r],a!==\"_\"){if(!pqe(t.charCodeAt(r)))return!1;s=!0}return s&&a!==\"_\"}for(;r<e;r++)if(a=t[r],a!==\"_\"){if(!hqe(t.charCodeAt(r)))return!1;s=!0}return s&&a!==\"_\"}if(a===\"_\")return!1;for(;r<e;r++)if(a=t[r],a!==\"_\"){if(a===\":\")break;if(!gqe(t.charCodeAt(r)))return!1;s=!0}return!s||a===\"_\"?!1:a!==\":\"?!0:/^(:[0-5]?[0-9])+$/.test(t.slice(r))}function mqe(t){var e=t,r=1,s,a,n=[];return e.indexOf(\"_\")!==-1&&(e=e.replace(/_/g,\"\")),s=e[0],(s===\"-\"||s===\"+\")&&(s===\"-\"&&(r=-1),e=e.slice(1),s=e[0]),e===\"0\"?0:s===\"0\"?e[1]===\"b\"?r*parseInt(e.slice(2),2):e[1]===\"x\"?r*parseInt(e,16):r*parseInt(e,8):e.indexOf(\":\")!==-1?(e.split(\":\").forEach(function(c){n.unshift(parseInt(c,10))}),e=0,a=1,n.forEach(function(c){e+=c*a,a*=60}),r*e):r*parseInt(e,10)}function yqe(t){return Object.prototype.toString.call(t)===\"[object Number]\"&&t%1===0&&!fqe.isNegativeZero(t)}Vee.exports=new Aqe(\"tag:yaml.org,2002:int\",{kind:\"scalar\",resolve:dqe,construct:mqe,predicate:yqe,represent:{binary:function(t){return t>=0?\"0b\"+t.toString(2):\"-0b\"+t.toString(2).slice(1)},octal:function(t){return t>=0?\"0\"+t.toString(8):\"-0\"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?\"0x\"+t.toString(16).toUpperCase():\"-0x\"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:\"decimal\",styleAliases:{binary:[2,\"bin\"],octal:[8,\"oct\"],decimal:[10,\"dec\"],hexadecimal:[16,\"hex\"]}})});var Xee=_((hQt,zee)=>{\"use strict\";var Kee=bd(),Eqe=Ss(),Iqe=new RegExp(\"^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");function Cqe(t){return!(t===null||!Iqe.test(t)||t[t.length-1]===\"_\")}function wqe(t){var e,r,s,a;return e=t.replace(/_/g,\"\").toLowerCase(),r=e[0]===\"-\"?-1:1,a=[],\"+-\".indexOf(e[0])>=0&&(e=e.slice(1)),e===\".inf\"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===\".nan\"?NaN:e.indexOf(\":\")>=0?(e.split(\":\").forEach(function(n){a.unshift(parseFloat(n,10))}),e=0,s=1,a.forEach(function(n){e+=n*s,s*=60}),r*e):r*parseFloat(e,10)}var Bqe=/^[-+]?[0-9]+e/;function vqe(t,e){var r;if(isNaN(t))switch(e){case\"lowercase\":return\".nan\";case\"uppercase\":return\".NAN\";case\"camelcase\":return\".NaN\"}else if(Number.POSITIVE_INFINITY===t)switch(e){case\"lowercase\":return\".inf\";case\"uppercase\":return\".INF\";case\"camelcase\":return\".Inf\"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case\"lowercase\":return\"-.inf\";case\"uppercase\":return\"-.INF\";case\"camelcase\":return\"-.Inf\"}else if(Kee.isNegativeZero(t))return\"-0.0\";return r=t.toString(10),Bqe.test(r)?r.replace(\"e\",\".e\"):r}function Sqe(t){return Object.prototype.toString.call(t)===\"[object Number]\"&&(t%1!==0||Kee.isNegativeZero(t))}zee.exports=new Eqe(\"tag:yaml.org,2002:float\",{kind:\"scalar\",resolve:Cqe,construct:wqe,predicate:Sqe,represent:vqe,defaultStyle:\"lowercase\"})});var JU=_((gQt,Zee)=>{\"use strict\";var Dqe=Pd();Zee.exports=new Dqe({include:[dx()],implicit:[qee(),Yee(),Jee(),Xee()]})});var KU=_((dQt,$ee)=>{\"use strict\";var bqe=Pd();$ee.exports=new bqe({include:[JU()]})});var nte=_((mQt,rte)=>{\"use strict\";var Pqe=Ss(),ete=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\"),tte=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");function xqe(t){return t===null?!1:ete.exec(t)!==null||tte.exec(t)!==null}function kqe(t){var e,r,s,a,n,c,f,p=0,h=null,E,C,S;if(e=ete.exec(t),e===null&&(e=tte.exec(t)),e===null)throw new Error(\"Date resolve error\");if(r=+e[1],s=+e[2]-1,a=+e[3],!e[4])return new Date(Date.UTC(r,s,a));if(n=+e[4],c=+e[5],f=+e[6],e[7]){for(p=e[7].slice(0,3);p.length<3;)p+=\"0\";p=+p}return e[9]&&(E=+e[10],C=+(e[11]||0),h=(E*60+C)*6e4,e[9]===\"-\"&&(h=-h)),S=new Date(Date.UTC(r,s,a,n,c,f,p)),h&&S.setTime(S.getTime()-h),S}function Qqe(t){return t.toISOString()}rte.exports=new Pqe(\"tag:yaml.org,2002:timestamp\",{kind:\"scalar\",resolve:xqe,construct:kqe,instanceOf:Date,represent:Qqe})});var ste=_((yQt,ite)=>{\"use strict\";var Tqe=Ss();function Rqe(t){return t===\"<<\"||t===null}ite.exports=new Tqe(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:Rqe})});var lte=_((EQt,ate)=>{\"use strict\";var xd;try{ote=Ie,xd=ote(\"buffer\").Buffer}catch{}var ote,Fqe=Ss(),zU=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\\r`;function Nqe(t){if(t===null)return!1;var e,r,s=0,a=t.length,n=zU;for(r=0;r<a;r++)if(e=n.indexOf(t.charAt(r)),!(e>64)){if(e<0)return!1;s+=6}return s%8===0}function Oqe(t){var e,r,s=t.replace(/[\\r\\n=]/g,\"\"),a=s.length,n=zU,c=0,f=[];for(e=0;e<a;e++)e%4===0&&e&&(f.push(c>>16&255),f.push(c>>8&255),f.push(c&255)),c=c<<6|n.indexOf(s.charAt(e));return r=a%4*6,r===0?(f.push(c>>16&255),f.push(c>>8&255),f.push(c&255)):r===18?(f.push(c>>10&255),f.push(c>>2&255)):r===12&&f.push(c>>4&255),xd?xd.from?xd.from(f):new xd(f):f}function Lqe(t){var e=\"\",r=0,s,a,n=t.length,c=zU;for(s=0;s<n;s++)s%3===0&&s&&(e+=c[r>>18&63],e+=c[r>>12&63],e+=c[r>>6&63],e+=c[r&63]),r=(r<<8)+t[s];return a=n%3,a===0?(e+=c[r>>18&63],e+=c[r>>12&63],e+=c[r>>6&63],e+=c[r&63]):a===2?(e+=c[r>>10&63],e+=c[r>>4&63],e+=c[r<<2&63],e+=c[64]):a===1&&(e+=c[r>>2&63],e+=c[r<<4&63],e+=c[64],e+=c[64]),e}function Mqe(t){return xd&&xd.isBuffer(t)}ate.exports=new Fqe(\"tag:yaml.org,2002:binary\",{kind:\"scalar\",resolve:Nqe,construct:Oqe,predicate:Mqe,represent:Lqe})});var ute=_((CQt,cte)=>{\"use strict\";var Uqe=Ss(),_qe=Object.prototype.hasOwnProperty,Hqe=Object.prototype.toString;function jqe(t){if(t===null)return!0;var e=[],r,s,a,n,c,f=t;for(r=0,s=f.length;r<s;r+=1){if(a=f[r],c=!1,Hqe.call(a)!==\"[object Object]\")return!1;for(n in a)if(_qe.call(a,n))if(!c)c=!0;else return!1;if(!c)return!1;if(e.indexOf(n)===-1)e.push(n);else return!1}return!0}function Gqe(t){return t!==null?t:[]}cte.exports=new Uqe(\"tag:yaml.org,2002:omap\",{kind:\"sequence\",resolve:jqe,construct:Gqe})});var Ate=_((wQt,fte)=>{\"use strict\";var qqe=Ss(),Wqe=Object.prototype.toString;function Yqe(t){if(t===null)return!0;var e,r,s,a,n,c=t;for(n=new Array(c.length),e=0,r=c.length;e<r;e+=1){if(s=c[e],Wqe.call(s)!==\"[object Object]\"||(a=Object.keys(s),a.length!==1))return!1;n[e]=[a[0],s[a[0]]]}return!0}function Vqe(t){if(t===null)return[];var e,r,s,a,n,c=t;for(n=new Array(c.length),e=0,r=c.length;e<r;e+=1)s=c[e],a=Object.keys(s),n[e]=[a[0],s[a[0]]];return n}fte.exports=new qqe(\"tag:yaml.org,2002:pairs\",{kind:\"sequence\",resolve:Yqe,construct:Vqe})});var hte=_((BQt,pte)=>{\"use strict\";var Jqe=Ss(),Kqe=Object.prototype.hasOwnProperty;function zqe(t){if(t===null)return!0;var e,r=t;for(e in r)if(Kqe.call(r,e)&&r[e]!==null)return!1;return!0}function Xqe(t){return t!==null?t:{}}pte.exports=new Jqe(\"tag:yaml.org,2002:set\",{kind:\"mapping\",resolve:zqe,construct:Xqe})});var gE=_((vQt,gte)=>{\"use strict\";var Zqe=Pd();gte.exports=new Zqe({include:[KU()],implicit:[nte(),ste()],explicit:[lte(),ute(),Ate(),hte()]})});var mte=_((SQt,dte)=>{\"use strict\";var $qe=Ss();function e9e(){return!0}function t9e(){}function r9e(){return\"\"}function n9e(t){return typeof t>\"u\"}dte.exports=new $qe(\"tag:yaml.org,2002:js/undefined\",{kind:\"scalar\",resolve:e9e,construct:t9e,predicate:n9e,represent:r9e})});var Ete=_((DQt,yte)=>{\"use strict\";var i9e=Ss();function s9e(t){if(t===null||t.length===0)return!1;var e=t,r=/\\/([gim]*)$/.exec(t),s=\"\";return!(e[0]===\"/\"&&(r&&(s=r[1]),s.length>3||e[e.length-s.length-1]!==\"/\"))}function o9e(t){var e=t,r=/\\/([gim]*)$/.exec(t),s=\"\";return e[0]===\"/\"&&(r&&(s=r[1]),e=e.slice(1,e.length-s.length-1)),new RegExp(e,s)}function a9e(t){var e=\"/\"+t.source+\"/\";return t.global&&(e+=\"g\"),t.multiline&&(e+=\"m\"),t.ignoreCase&&(e+=\"i\"),e}function l9e(t){return Object.prototype.toString.call(t)===\"[object RegExp]\"}yte.exports=new i9e(\"tag:yaml.org,2002:js/regexp\",{kind:\"scalar\",resolve:s9e,construct:o9e,predicate:l9e,represent:a9e})});var wte=_((bQt,Cte)=>{\"use strict\";var mx;try{Ite=Ie,mx=Ite(\"esprima\")}catch{typeof window<\"u\"&&(mx=window.esprima)}var Ite,c9e=Ss();function u9e(t){if(t===null)return!1;try{var e=\"(\"+t+\")\",r=mx.parse(e,{range:!0});return!(r.type!==\"Program\"||r.body.length!==1||r.body[0].type!==\"ExpressionStatement\"||r.body[0].expression.type!==\"ArrowFunctionExpression\"&&r.body[0].expression.type!==\"FunctionExpression\")}catch{return!1}}function f9e(t){var e=\"(\"+t+\")\",r=mx.parse(e,{range:!0}),s=[],a;if(r.type!==\"Program\"||r.body.length!==1||r.body[0].type!==\"ExpressionStatement\"||r.body[0].expression.type!==\"ArrowFunctionExpression\"&&r.body[0].expression.type!==\"FunctionExpression\")throw new Error(\"Failed to resolve function\");return r.body[0].expression.params.forEach(function(n){s.push(n.name)}),a=r.body[0].expression.body.range,r.body[0].expression.body.type===\"BlockStatement\"?new Function(s,e.slice(a[0]+1,a[1]-1)):new Function(s,\"return \"+e.slice(a[0],a[1]))}function A9e(t){return t.toString()}function p9e(t){return Object.prototype.toString.call(t)===\"[object Function]\"}Cte.exports=new c9e(\"tag:yaml.org,2002:js/function\",{kind:\"scalar\",resolve:u9e,construct:f9e,predicate:p9e,represent:A9e})});var G2=_((xQt,vte)=>{\"use strict\";var Bte=Pd();vte.exports=Bte.DEFAULT=new Bte({include:[gE()],explicit:[mte(),Ete(),wte()]})});var Gte=_((kQt,q2)=>{\"use strict\";var Ip=bd(),Qte=pE(),h9e=Qee(),Tte=gE(),g9e=G2(),i0=Object.prototype.hasOwnProperty,yx=1,Rte=2,Fte=3,Ex=4,XU=1,d9e=2,Ste=3,m9e=/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,y9e=/[\\x85\\u2028\\u2029]/,E9e=/[,\\[\\]\\{\\}]/,Nte=/^(?:!|!!|![a-z\\-]+!)$/i,Ote=/^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;function Dte(t){return Object.prototype.toString.call(t)}function jf(t){return t===10||t===13}function Qd(t){return t===9||t===32}function rl(t){return t===9||t===32||t===10||t===13}function dE(t){return t===44||t===91||t===93||t===123||t===125}function I9e(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function C9e(t){return t===120?2:t===117?4:t===85?8:0}function w9e(t){return 48<=t&&t<=57?t-48:-1}function bte(t){return t===48?\"\\0\":t===97?\"\\x07\":t===98?\"\\b\":t===116||t===9?\"\t\":t===110?`\n`:t===118?\"\\v\":t===102?\"\\f\":t===114?\"\\r\":t===101?\"\\x1B\":t===32?\" \":t===34?'\"':t===47?\"/\":t===92?\"\\\\\":t===78?\"\\x85\":t===95?\"\\xA0\":t===76?\"\\u2028\":t===80?\"\\u2029\":\"\"}function B9e(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var Lte=new Array(256),Mte=new Array(256);for(kd=0;kd<256;kd++)Lte[kd]=bte(kd)?1:0,Mte[kd]=bte(kd);var kd;function v9e(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||g9e,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function Ute(t,e){return new Qte(e,new h9e(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function Rr(t,e){throw Ute(t,e)}function Ix(t,e){t.onWarning&&t.onWarning.call(null,Ute(t,e))}var Pte={YAML:function(e,r,s){var a,n,c;e.version!==null&&Rr(e,\"duplication of %YAML directive\"),s.length!==1&&Rr(e,\"YAML directive accepts exactly one argument\"),a=/^([0-9]+)\\.([0-9]+)$/.exec(s[0]),a===null&&Rr(e,\"ill-formed argument of the YAML directive\"),n=parseInt(a[1],10),c=parseInt(a[2],10),n!==1&&Rr(e,\"unacceptable YAML version of the document\"),e.version=s[0],e.checkLineBreaks=c<2,c!==1&&c!==2&&Ix(e,\"unsupported YAML version of the document\")},TAG:function(e,r,s){var a,n;s.length!==2&&Rr(e,\"TAG directive accepts exactly two arguments\"),a=s[0],n=s[1],Nte.test(a)||Rr(e,\"ill-formed tag handle (first argument) of the TAG directive\"),i0.call(e.tagMap,a)&&Rr(e,'there is a previously declared suffix for \"'+a+'\" tag handle'),Ote.test(n)||Rr(e,\"ill-formed tag prefix (second argument) of the TAG directive\"),e.tagMap[a]=n}};function n0(t,e,r,s){var a,n,c,f;if(e<r){if(f=t.input.slice(e,r),s)for(a=0,n=f.length;a<n;a+=1)c=f.charCodeAt(a),c===9||32<=c&&c<=1114111||Rr(t,\"expected valid JSON character\");else m9e.test(f)&&Rr(t,\"the stream contains non-printable characters\");t.result+=f}}function xte(t,e,r,s){var a,n,c,f;for(Ip.isObject(r)||Rr(t,\"cannot merge mappings; the provided source object is unacceptable\"),a=Object.keys(r),c=0,f=a.length;c<f;c+=1)n=a[c],i0.call(e,n)||(e[n]=r[n],s[n]=!0)}function mE(t,e,r,s,a,n,c,f){var p,h;if(Array.isArray(a))for(a=Array.prototype.slice.call(a),p=0,h=a.length;p<h;p+=1)Array.isArray(a[p])&&Rr(t,\"nested arrays are not supported inside keys\"),typeof a==\"object\"&&Dte(a[p])===\"[object Object]\"&&(a[p]=\"[object Object]\");if(typeof a==\"object\"&&Dte(a)===\"[object Object]\"&&(a=\"[object Object]\"),a=String(a),e===null&&(e={}),s===\"tag:yaml.org,2002:merge\")if(Array.isArray(n))for(p=0,h=n.length;p<h;p+=1)xte(t,e,n[p],r);else xte(t,e,n,r);else!t.json&&!i0.call(r,a)&&i0.call(e,a)&&(t.line=c||t.line,t.position=f||t.position,Rr(t,\"duplicated mapping key\")),e[a]=n,delete r[a];return e}function ZU(t){var e;e=t.input.charCodeAt(t.position),e===10?t.position++:e===13?(t.position++,t.input.charCodeAt(t.position)===10&&t.position++):Rr(t,\"a line break is expected\"),t.line+=1,t.lineStart=t.position}function as(t,e,r){for(var s=0,a=t.input.charCodeAt(t.position);a!==0;){for(;Qd(a);)a=t.input.charCodeAt(++t.position);if(e&&a===35)do a=t.input.charCodeAt(++t.position);while(a!==10&&a!==13&&a!==0);if(jf(a))for(ZU(t),a=t.input.charCodeAt(t.position),s++,t.lineIndent=0;a===32;)t.lineIndent++,a=t.input.charCodeAt(++t.position);else break}return r!==-1&&s!==0&&t.lineIndent<r&&Ix(t,\"deficient indentation\"),s}function Cx(t){var e=t.position,r;return r=t.input.charCodeAt(e),!!((r===45||r===46)&&r===t.input.charCodeAt(e+1)&&r===t.input.charCodeAt(e+2)&&(e+=3,r=t.input.charCodeAt(e),r===0||rl(r)))}function $U(t,e){e===1?t.result+=\" \":e>1&&(t.result+=Ip.repeat(`\n`,e-1))}function S9e(t,e,r){var s,a,n,c,f,p,h,E,C=t.kind,S=t.result,P;if(P=t.input.charCodeAt(t.position),rl(P)||dE(P)||P===35||P===38||P===42||P===33||P===124||P===62||P===39||P===34||P===37||P===64||P===96||(P===63||P===45)&&(a=t.input.charCodeAt(t.position+1),rl(a)||r&&dE(a)))return!1;for(t.kind=\"scalar\",t.result=\"\",n=c=t.position,f=!1;P!==0;){if(P===58){if(a=t.input.charCodeAt(t.position+1),rl(a)||r&&dE(a))break}else if(P===35){if(s=t.input.charCodeAt(t.position-1),rl(s))break}else{if(t.position===t.lineStart&&Cx(t)||r&&dE(P))break;if(jf(P))if(p=t.line,h=t.lineStart,E=t.lineIndent,as(t,!1,-1),t.lineIndent>=e){f=!0,P=t.input.charCodeAt(t.position);continue}else{t.position=c,t.line=p,t.lineStart=h,t.lineIndent=E;break}}f&&(n0(t,n,c,!1),$U(t,t.line-p),n=c=t.position,f=!1),Qd(P)||(c=t.position+1),P=t.input.charCodeAt(++t.position)}return n0(t,n,c,!1),t.result?!0:(t.kind=C,t.result=S,!1)}function D9e(t,e){var r,s,a;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind=\"scalar\",t.result=\"\",t.position++,s=a=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(n0(t,s,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)s=t.position,t.position++,a=t.position;else return!0;else jf(r)?(n0(t,s,a,!0),$U(t,as(t,!1,e)),s=a=t.position):t.position===t.lineStart&&Cx(t)?Rr(t,\"unexpected end of the document within a single quoted scalar\"):(t.position++,a=t.position);Rr(t,\"unexpected end of the stream within a single quoted scalar\")}function b9e(t,e){var r,s,a,n,c,f;if(f=t.input.charCodeAt(t.position),f!==34)return!1;for(t.kind=\"scalar\",t.result=\"\",t.position++,r=s=t.position;(f=t.input.charCodeAt(t.position))!==0;){if(f===34)return n0(t,r,t.position,!0),t.position++,!0;if(f===92){if(n0(t,r,t.position,!0),f=t.input.charCodeAt(++t.position),jf(f))as(t,!1,e);else if(f<256&&Lte[f])t.result+=Mte[f],t.position++;else if((c=C9e(f))>0){for(a=c,n=0;a>0;a--)f=t.input.charCodeAt(++t.position),(c=I9e(f))>=0?n=(n<<4)+c:Rr(t,\"expected hexadecimal character\");t.result+=B9e(n),t.position++}else Rr(t,\"unknown escape sequence\");r=s=t.position}else jf(f)?(n0(t,r,s,!0),$U(t,as(t,!1,e)),r=s=t.position):t.position===t.lineStart&&Cx(t)?Rr(t,\"unexpected end of the document within a double quoted scalar\"):(t.position++,s=t.position)}Rr(t,\"unexpected end of the stream within a double quoted scalar\")}function P9e(t,e){var r=!0,s,a=t.tag,n,c=t.anchor,f,p,h,E,C,S={},P,I,R,N;if(N=t.input.charCodeAt(t.position),N===91)p=93,C=!1,n=[];else if(N===123)p=125,C=!0,n={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=n),N=t.input.charCodeAt(++t.position);N!==0;){if(as(t,!0,e),N=t.input.charCodeAt(t.position),N===p)return t.position++,t.tag=a,t.anchor=c,t.kind=C?\"mapping\":\"sequence\",t.result=n,!0;r||Rr(t,\"missed comma between flow collection entries\"),I=P=R=null,h=E=!1,N===63&&(f=t.input.charCodeAt(t.position+1),rl(f)&&(h=E=!0,t.position++,as(t,!0,e))),s=t.line,yE(t,e,yx,!1,!0),I=t.tag,P=t.result,as(t,!0,e),N=t.input.charCodeAt(t.position),(E||t.line===s)&&N===58&&(h=!0,N=t.input.charCodeAt(++t.position),as(t,!0,e),yE(t,e,yx,!1,!0),R=t.result),C?mE(t,n,S,I,P,R):h?n.push(mE(t,null,S,I,P,R)):n.push(P),as(t,!0,e),N=t.input.charCodeAt(t.position),N===44?(r=!0,N=t.input.charCodeAt(++t.position)):r=!1}Rr(t,\"unexpected end of the stream within a flow collection\")}function x9e(t,e){var r,s,a=XU,n=!1,c=!1,f=e,p=0,h=!1,E,C;if(C=t.input.charCodeAt(t.position),C===124)s=!1;else if(C===62)s=!0;else return!1;for(t.kind=\"scalar\",t.result=\"\";C!==0;)if(C=t.input.charCodeAt(++t.position),C===43||C===45)XU===a?a=C===43?Ste:d9e:Rr(t,\"repeat of a chomping mode identifier\");else if((E=w9e(C))>=0)E===0?Rr(t,\"bad explicit indentation width of a block scalar; it cannot be less than one\"):c?Rr(t,\"repeat of an indentation width identifier\"):(f=e+E-1,c=!0);else break;if(Qd(C)){do C=t.input.charCodeAt(++t.position);while(Qd(C));if(C===35)do C=t.input.charCodeAt(++t.position);while(!jf(C)&&C!==0)}for(;C!==0;){for(ZU(t),t.lineIndent=0,C=t.input.charCodeAt(t.position);(!c||t.lineIndent<f)&&C===32;)t.lineIndent++,C=t.input.charCodeAt(++t.position);if(!c&&t.lineIndent>f&&(f=t.lineIndent),jf(C)){p++;continue}if(t.lineIndent<f){a===Ste?t.result+=Ip.repeat(`\n`,n?1+p:p):a===XU&&n&&(t.result+=`\n`);break}for(s?Qd(C)?(h=!0,t.result+=Ip.repeat(`\n`,n?1+p:p)):h?(h=!1,t.result+=Ip.repeat(`\n`,p+1)):p===0?n&&(t.result+=\" \"):t.result+=Ip.repeat(`\n`,p):t.result+=Ip.repeat(`\n`,n?1+p:p),n=!0,c=!0,p=0,r=t.position;!jf(C)&&C!==0;)C=t.input.charCodeAt(++t.position);n0(t,r,t.position,!1)}return!0}function kte(t,e){var r,s=t.tag,a=t.anchor,n=[],c,f=!1,p;for(t.anchor!==null&&(t.anchorMap[t.anchor]=n),p=t.input.charCodeAt(t.position);p!==0&&!(p!==45||(c=t.input.charCodeAt(t.position+1),!rl(c)));){if(f=!0,t.position++,as(t,!0,-1)&&t.lineIndent<=e){n.push(null),p=t.input.charCodeAt(t.position);continue}if(r=t.line,yE(t,e,Fte,!1,!0),n.push(t.result),as(t,!0,-1),p=t.input.charCodeAt(t.position),(t.line===r||t.lineIndent>e)&&p!==0)Rr(t,\"bad indentation of a sequence entry\");else if(t.lineIndent<e)break}return f?(t.tag=s,t.anchor=a,t.kind=\"sequence\",t.result=n,!0):!1}function k9e(t,e,r){var s,a,n,c,f=t.tag,p=t.anchor,h={},E={},C=null,S=null,P=null,I=!1,R=!1,N;for(t.anchor!==null&&(t.anchorMap[t.anchor]=h),N=t.input.charCodeAt(t.position);N!==0;){if(s=t.input.charCodeAt(t.position+1),n=t.line,c=t.position,(N===63||N===58)&&rl(s))N===63?(I&&(mE(t,h,E,C,S,null),C=S=P=null),R=!0,I=!0,a=!0):I?(I=!1,a=!0):Rr(t,\"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line\"),t.position+=1,N=s;else if(yE(t,r,Rte,!1,!0))if(t.line===n){for(N=t.input.charCodeAt(t.position);Qd(N);)N=t.input.charCodeAt(++t.position);if(N===58)N=t.input.charCodeAt(++t.position),rl(N)||Rr(t,\"a whitespace character is expected after the key-value separator within a block mapping\"),I&&(mE(t,h,E,C,S,null),C=S=P=null),R=!0,I=!1,a=!1,C=t.tag,S=t.result;else if(R)Rr(t,\"can not read an implicit mapping pair; a colon is missed\");else return t.tag=f,t.anchor=p,!0}else if(R)Rr(t,\"can not read a block mapping entry; a multiline key may not be an implicit key\");else return t.tag=f,t.anchor=p,!0;else break;if((t.line===n||t.lineIndent>e)&&(yE(t,e,Ex,!0,a)&&(I?S=t.result:P=t.result),I||(mE(t,h,E,C,S,P,n,c),C=S=P=null),as(t,!0,-1),N=t.input.charCodeAt(t.position)),t.lineIndent>e&&N!==0)Rr(t,\"bad indentation of a mapping entry\");else if(t.lineIndent<e)break}return I&&mE(t,h,E,C,S,null),R&&(t.tag=f,t.anchor=p,t.kind=\"mapping\",t.result=h),R}function Q9e(t){var e,r=!1,s=!1,a,n,c;if(c=t.input.charCodeAt(t.position),c!==33)return!1;if(t.tag!==null&&Rr(t,\"duplication of a tag property\"),c=t.input.charCodeAt(++t.position),c===60?(r=!0,c=t.input.charCodeAt(++t.position)):c===33?(s=!0,a=\"!!\",c=t.input.charCodeAt(++t.position)):a=\"!\",e=t.position,r){do c=t.input.charCodeAt(++t.position);while(c!==0&&c!==62);t.position<t.length?(n=t.input.slice(e,t.position),c=t.input.charCodeAt(++t.position)):Rr(t,\"unexpected end of the stream within a verbatim tag\")}else{for(;c!==0&&!rl(c);)c===33&&(s?Rr(t,\"tag suffix cannot contain exclamation marks\"):(a=t.input.slice(e-1,t.position+1),Nte.test(a)||Rr(t,\"named tag handle cannot contain such characters\"),s=!0,e=t.position+1)),c=t.input.charCodeAt(++t.position);n=t.input.slice(e,t.position),E9e.test(n)&&Rr(t,\"tag suffix cannot contain flow indicator characters\")}return n&&!Ote.test(n)&&Rr(t,\"tag name cannot contain such characters: \"+n),r?t.tag=n:i0.call(t.tagMap,a)?t.tag=t.tagMap[a]+n:a===\"!\"?t.tag=\"!\"+n:a===\"!!\"?t.tag=\"tag:yaml.org,2002:\"+n:Rr(t,'undeclared tag handle \"'+a+'\"'),!0}function T9e(t){var e,r;if(r=t.input.charCodeAt(t.position),r!==38)return!1;for(t.anchor!==null&&Rr(t,\"duplication of an anchor property\"),r=t.input.charCodeAt(++t.position),e=t.position;r!==0&&!rl(r)&&!dE(r);)r=t.input.charCodeAt(++t.position);return t.position===e&&Rr(t,\"name of an anchor node must contain at least one character\"),t.anchor=t.input.slice(e,t.position),!0}function R9e(t){var e,r,s;if(s=t.input.charCodeAt(t.position),s!==42)return!1;for(s=t.input.charCodeAt(++t.position),e=t.position;s!==0&&!rl(s)&&!dE(s);)s=t.input.charCodeAt(++t.position);return t.position===e&&Rr(t,\"name of an alias node must contain at least one character\"),r=t.input.slice(e,t.position),i0.call(t.anchorMap,r)||Rr(t,'unidentified alias \"'+r+'\"'),t.result=t.anchorMap[r],as(t,!0,-1),!0}function yE(t,e,r,s,a){var n,c,f,p=1,h=!1,E=!1,C,S,P,I,R;if(t.listener!==null&&t.listener(\"open\",t),t.tag=null,t.anchor=null,t.kind=null,t.result=null,n=c=f=Ex===r||Fte===r,s&&as(t,!0,-1)&&(h=!0,t.lineIndent>e?p=1:t.lineIndent===e?p=0:t.lineIndent<e&&(p=-1)),p===1)for(;Q9e(t)||T9e(t);)as(t,!0,-1)?(h=!0,f=n,t.lineIndent>e?p=1:t.lineIndent===e?p=0:t.lineIndent<e&&(p=-1)):f=!1;if(f&&(f=h||a),(p===1||Ex===r)&&(yx===r||Rte===r?I=e:I=e+1,R=t.position-t.lineStart,p===1?f&&(kte(t,R)||k9e(t,R,I))||P9e(t,I)?E=!0:(c&&x9e(t,I)||D9e(t,I)||b9e(t,I)?E=!0:R9e(t)?(E=!0,(t.tag!==null||t.anchor!==null)&&Rr(t,\"alias node should not have any properties\")):S9e(t,I,yx===r)&&(E=!0,t.tag===null&&(t.tag=\"?\")),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):p===0&&(E=f&&kte(t,R))),t.tag!==null&&t.tag!==\"!\")if(t.tag===\"?\"){for(t.result!==null&&t.kind!==\"scalar\"&&Rr(t,'unacceptable node kind for !<?> tag; it should be \"scalar\", not \"'+t.kind+'\"'),C=0,S=t.implicitTypes.length;C<S;C+=1)if(P=t.implicitTypes[C],P.resolve(t.result)){t.result=P.construct(t.result),t.tag=P.tag,t.anchor!==null&&(t.anchorMap[t.anchor]=t.result);break}}else i0.call(t.typeMap[t.kind||\"fallback\"],t.tag)?(P=t.typeMap[t.kind||\"fallback\"][t.tag],t.result!==null&&P.kind!==t.kind&&Rr(t,\"unacceptable node kind for !<\"+t.tag+'> tag; it should be \"'+P.kind+'\", not \"'+t.kind+'\"'),P.resolve(t.result)?(t.result=P.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Rr(t,\"cannot resolve a node with !<\"+t.tag+\"> explicit tag\")):Rr(t,\"unknown tag !<\"+t.tag+\">\");return t.listener!==null&&t.listener(\"close\",t),t.tag!==null||t.anchor!==null||E}function F9e(t){var e=t.position,r,s,a,n=!1,c;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(c=t.input.charCodeAt(t.position))!==0&&(as(t,!0,-1),c=t.input.charCodeAt(t.position),!(t.lineIndent>0||c!==37));){for(n=!0,c=t.input.charCodeAt(++t.position),r=t.position;c!==0&&!rl(c);)c=t.input.charCodeAt(++t.position);for(s=t.input.slice(r,t.position),a=[],s.length<1&&Rr(t,\"directive name must not be less than one character in length\");c!==0;){for(;Qd(c);)c=t.input.charCodeAt(++t.position);if(c===35){do c=t.input.charCodeAt(++t.position);while(c!==0&&!jf(c));break}if(jf(c))break;for(r=t.position;c!==0&&!rl(c);)c=t.input.charCodeAt(++t.position);a.push(t.input.slice(r,t.position))}c!==0&&ZU(t),i0.call(Pte,s)?Pte[s](t,s,a):Ix(t,'unknown document directive \"'+s+'\"')}if(as(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,as(t,!0,-1)):n&&Rr(t,\"directives end mark is expected\"),yE(t,t.lineIndent-1,Ex,!1,!0),as(t,!0,-1),t.checkLineBreaks&&y9e.test(t.input.slice(e,t.position))&&Ix(t,\"non-ASCII line breaks are interpreted as content\"),t.documents.push(t.result),t.position===t.lineStart&&Cx(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,as(t,!0,-1));return}if(t.position<t.length-1)Rr(t,\"end of the stream or a document separator is expected\");else return}function _te(t,e){t=String(t),e=e||{},t.length!==0&&(t.charCodeAt(t.length-1)!==10&&t.charCodeAt(t.length-1)!==13&&(t+=`\n`),t.charCodeAt(0)===65279&&(t=t.slice(1)));var r=new v9e(t,e),s=t.indexOf(\"\\0\");for(s!==-1&&(r.position=s,Rr(r,\"null byte is not allowed in input\")),r.input+=\"\\0\";r.input.charCodeAt(r.position)===32;)r.lineIndent+=1,r.position+=1;for(;r.position<r.length-1;)F9e(r);return r.documents}function Hte(t,e,r){e!==null&&typeof e==\"object\"&&typeof r>\"u\"&&(r=e,e=null);var s=_te(t,r);if(typeof e!=\"function\")return s;for(var a=0,n=s.length;a<n;a+=1)e(s[a])}function jte(t,e){var r=_te(t,e);if(r.length!==0){if(r.length===1)return r[0];throw new Qte(\"expected a single document in the stream, but found more\")}}function N9e(t,e,r){return typeof e==\"object\"&&e!==null&&typeof r>\"u\"&&(r=e,e=null),Hte(t,e,Ip.extend({schema:Tte},r))}function O9e(t,e){return jte(t,Ip.extend({schema:Tte},e))}q2.exports.loadAll=Hte;q2.exports.load=jte;q2.exports.safeLoadAll=N9e;q2.exports.safeLoad=O9e});var Are=_((QQt,n_)=>{\"use strict\";var Y2=bd(),V2=pE(),L9e=G2(),M9e=gE(),Xte=Object.prototype.toString,Zte=Object.prototype.hasOwnProperty,U9e=9,W2=10,_9e=13,H9e=32,j9e=33,G9e=34,$te=35,q9e=37,W9e=38,Y9e=39,V9e=42,ere=44,J9e=45,tre=58,K9e=61,z9e=62,X9e=63,Z9e=64,rre=91,nre=93,$9e=96,ire=123,eWe=124,sre=125,_o={};_o[0]=\"\\\\0\";_o[7]=\"\\\\a\";_o[8]=\"\\\\b\";_o[9]=\"\\\\t\";_o[10]=\"\\\\n\";_o[11]=\"\\\\v\";_o[12]=\"\\\\f\";_o[13]=\"\\\\r\";_o[27]=\"\\\\e\";_o[34]='\\\\\"';_o[92]=\"\\\\\\\\\";_o[133]=\"\\\\N\";_o[160]=\"\\\\_\";_o[8232]=\"\\\\L\";_o[8233]=\"\\\\P\";var tWe=[\"y\",\"Y\",\"yes\",\"Yes\",\"YES\",\"on\",\"On\",\"ON\",\"n\",\"N\",\"no\",\"No\",\"NO\",\"off\",\"Off\",\"OFF\"];function rWe(t,e){var r,s,a,n,c,f,p;if(e===null)return{};for(r={},s=Object.keys(e),a=0,n=s.length;a<n;a+=1)c=s[a],f=String(e[c]),c.slice(0,2)===\"!!\"&&(c=\"tag:yaml.org,2002:\"+c.slice(2)),p=t.compiledTypeMap.fallback[c],p&&Zte.call(p.styleAliases,f)&&(f=p.styleAliases[f]),r[c]=f;return r}function qte(t){var e,r,s;if(e=t.toString(16).toUpperCase(),t<=255)r=\"x\",s=2;else if(t<=65535)r=\"u\",s=4;else if(t<=4294967295)r=\"U\",s=8;else throw new V2(\"code point within a string may not be greater than 0xFFFFFFFF\");return\"\\\\\"+r+Y2.repeat(\"0\",s-e.length)+e}function nWe(t){this.schema=t.schema||L9e,this.indent=Math.max(1,t.indent||2),this.noArrayIndent=t.noArrayIndent||!1,this.skipInvalid=t.skipInvalid||!1,this.flowLevel=Y2.isNothing(t.flowLevel)?-1:t.flowLevel,this.styleMap=rWe(this.schema,t.styles||null),this.sortKeys=t.sortKeys||!1,this.lineWidth=t.lineWidth||80,this.noRefs=t.noRefs||!1,this.noCompatMode=t.noCompatMode||!1,this.condenseFlow=t.condenseFlow||!1,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result=\"\",this.duplicates=[],this.usedDuplicates=null}function Wte(t,e){for(var r=Y2.repeat(\" \",e),s=0,a=-1,n=\"\",c,f=t.length;s<f;)a=t.indexOf(`\n`,s),a===-1?(c=t.slice(s),s=f):(c=t.slice(s,a+1),s=a+1),c.length&&c!==`\n`&&(n+=r),n+=c;return n}function e_(t,e){return`\n`+Y2.repeat(\" \",t.indent*e)}function iWe(t,e){var r,s,a;for(r=0,s=t.implicitTypes.length;r<s;r+=1)if(a=t.implicitTypes[r],a.resolve(e))return!0;return!1}function r_(t){return t===H9e||t===U9e}function EE(t){return 32<=t&&t<=126||161<=t&&t<=55295&&t!==8232&&t!==8233||57344<=t&&t<=65533&&t!==65279||65536<=t&&t<=1114111}function sWe(t){return EE(t)&&!r_(t)&&t!==65279&&t!==_9e&&t!==W2}function Yte(t,e){return EE(t)&&t!==65279&&t!==ere&&t!==rre&&t!==nre&&t!==ire&&t!==sre&&t!==tre&&(t!==$te||e&&sWe(e))}function oWe(t){return EE(t)&&t!==65279&&!r_(t)&&t!==J9e&&t!==X9e&&t!==tre&&t!==ere&&t!==rre&&t!==nre&&t!==ire&&t!==sre&&t!==$te&&t!==W9e&&t!==V9e&&t!==j9e&&t!==eWe&&t!==K9e&&t!==z9e&&t!==Y9e&&t!==G9e&&t!==q9e&&t!==Z9e&&t!==$9e}function ore(t){var e=/^\\n* /;return e.test(t)}var are=1,lre=2,cre=3,ure=4,wx=5;function aWe(t,e,r,s,a){var n,c,f,p=!1,h=!1,E=s!==-1,C=-1,S=oWe(t.charCodeAt(0))&&!r_(t.charCodeAt(t.length-1));if(e)for(n=0;n<t.length;n++){if(c=t.charCodeAt(n),!EE(c))return wx;f=n>0?t.charCodeAt(n-1):null,S=S&&Yte(c,f)}else{for(n=0;n<t.length;n++){if(c=t.charCodeAt(n),c===W2)p=!0,E&&(h=h||n-C-1>s&&t[C+1]!==\" \",C=n);else if(!EE(c))return wx;f=n>0?t.charCodeAt(n-1):null,S=S&&Yte(c,f)}h=h||E&&n-C-1>s&&t[C+1]!==\" \"}return!p&&!h?S&&!a(t)?are:lre:r>9&&ore(t)?wx:h?ure:cre}function lWe(t,e,r,s){t.dump=function(){if(e.length===0)return\"''\";if(!t.noCompatMode&&tWe.indexOf(e)!==-1)return\"'\"+e+\"'\";var a=t.indent*Math.max(1,r),n=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),c=s||t.flowLevel>-1&&r>=t.flowLevel;function f(p){return iWe(t,p)}switch(aWe(e,c,t.indent,n,f)){case are:return e;case lre:return\"'\"+e.replace(/'/g,\"''\")+\"'\";case cre:return\"|\"+Vte(e,t.indent)+Jte(Wte(e,a));case ure:return\">\"+Vte(e,t.indent)+Jte(Wte(cWe(e,n),a));case wx:return'\"'+uWe(e,n)+'\"';default:throw new V2(\"impossible error: invalid scalar style\")}}()}function Vte(t,e){var r=ore(t)?String(e):\"\",s=t[t.length-1]===`\n`,a=s&&(t[t.length-2]===`\n`||t===`\n`),n=a?\"+\":s?\"\":\"-\";return r+n+`\n`}function Jte(t){return t[t.length-1]===`\n`?t.slice(0,-1):t}function cWe(t,e){for(var r=/(\\n+)([^\\n]*)/g,s=function(){var h=t.indexOf(`\n`);return h=h!==-1?h:t.length,r.lastIndex=h,Kte(t.slice(0,h),e)}(),a=t[0]===`\n`||t[0]===\" \",n,c;c=r.exec(t);){var f=c[1],p=c[2];n=p[0]===\" \",s+=f+(!a&&!n&&p!==\"\"?`\n`:\"\")+Kte(p,e),a=n}return s}function Kte(t,e){if(t===\"\"||t[0]===\" \")return t;for(var r=/ [^ ]/g,s,a=0,n,c=0,f=0,p=\"\";s=r.exec(t);)f=s.index,f-a>e&&(n=c>a?c:f,p+=`\n`+t.slice(a,n),a=n+1),c=f;return p+=`\n`,t.length-a>e&&c>a?p+=t.slice(a,c)+`\n`+t.slice(c+1):p+=t.slice(a),p.slice(1)}function uWe(t){for(var e=\"\",r,s,a,n=0;n<t.length;n++){if(r=t.charCodeAt(n),r>=55296&&r<=56319&&(s=t.charCodeAt(n+1),s>=56320&&s<=57343)){e+=qte((r-55296)*1024+s-56320+65536),n++;continue}a=_o[r],e+=!a&&EE(r)?t[n]:a||qte(r)}return e}function fWe(t,e,r){var s=\"\",a=t.tag,n,c;for(n=0,c=r.length;n<c;n+=1)Td(t,e,r[n],!1,!1)&&(n!==0&&(s+=\",\"+(t.condenseFlow?\"\":\" \")),s+=t.dump);t.tag=a,t.dump=\"[\"+s+\"]\"}function AWe(t,e,r,s){var a=\"\",n=t.tag,c,f;for(c=0,f=r.length;c<f;c+=1)Td(t,e+1,r[c],!0,!0)&&((!s||c!==0)&&(a+=e_(t,e)),t.dump&&W2===t.dump.charCodeAt(0)?a+=\"-\":a+=\"- \",a+=t.dump);t.tag=n,t.dump=a||\"[]\"}function pWe(t,e,r){var s=\"\",a=t.tag,n=Object.keys(r),c,f,p,h,E;for(c=0,f=n.length;c<f;c+=1)E=\"\",c!==0&&(E+=\", \"),t.condenseFlow&&(E+='\"'),p=n[c],h=r[p],Td(t,e,p,!1,!1)&&(t.dump.length>1024&&(E+=\"? \"),E+=t.dump+(t.condenseFlow?'\"':\"\")+\":\"+(t.condenseFlow?\"\":\" \"),Td(t,e,h,!1,!1)&&(E+=t.dump,s+=E));t.tag=a,t.dump=\"{\"+s+\"}\"}function hWe(t,e,r,s){var a=\"\",n=t.tag,c=Object.keys(r),f,p,h,E,C,S;if(t.sortKeys===!0)c.sort();else if(typeof t.sortKeys==\"function\")c.sort(t.sortKeys);else if(t.sortKeys)throw new V2(\"sortKeys must be a boolean or a function\");for(f=0,p=c.length;f<p;f+=1)S=\"\",(!s||f!==0)&&(S+=e_(t,e)),h=c[f],E=r[h],Td(t,e+1,h,!0,!0,!0)&&(C=t.tag!==null&&t.tag!==\"?\"||t.dump&&t.dump.length>1024,C&&(t.dump&&W2===t.dump.charCodeAt(0)?S+=\"?\":S+=\"? \"),S+=t.dump,C&&(S+=e_(t,e)),Td(t,e+1,E,!0,C)&&(t.dump&&W2===t.dump.charCodeAt(0)?S+=\":\":S+=\": \",S+=t.dump,a+=S));t.tag=n,t.dump=a||\"{}\"}function zte(t,e,r){var s,a,n,c,f,p;for(a=r?t.explicitTypes:t.implicitTypes,n=0,c=a.length;n<c;n+=1)if(f=a[n],(f.instanceOf||f.predicate)&&(!f.instanceOf||typeof e==\"object\"&&e instanceof f.instanceOf)&&(!f.predicate||f.predicate(e))){if(t.tag=r?f.tag:\"?\",f.represent){if(p=t.styleMap[f.tag]||f.defaultStyle,Xte.call(f.represent)===\"[object Function]\")s=f.represent(e,p);else if(Zte.call(f.represent,p))s=f.represent[p](e,p);else throw new V2(\"!<\"+f.tag+'> tag resolver accepts not \"'+p+'\" style');t.dump=s}return!0}return!1}function Td(t,e,r,s,a,n){t.tag=null,t.dump=r,zte(t,r,!1)||zte(t,r,!0);var c=Xte.call(t.dump);s&&(s=t.flowLevel<0||t.flowLevel>e);var f=c===\"[object Object]\"||c===\"[object Array]\",p,h;if(f&&(p=t.duplicates.indexOf(r),h=p!==-1),(t.tag!==null&&t.tag!==\"?\"||h||t.indent!==2&&e>0)&&(a=!1),h&&t.usedDuplicates[p])t.dump=\"*ref_\"+p;else{if(f&&h&&!t.usedDuplicates[p]&&(t.usedDuplicates[p]=!0),c===\"[object Object]\")s&&Object.keys(t.dump).length!==0?(hWe(t,e,t.dump,a),h&&(t.dump=\"&ref_\"+p+t.dump)):(pWe(t,e,t.dump),h&&(t.dump=\"&ref_\"+p+\" \"+t.dump));else if(c===\"[object Array]\"){var E=t.noArrayIndent&&e>0?e-1:e;s&&t.dump.length!==0?(AWe(t,E,t.dump,a),h&&(t.dump=\"&ref_\"+p+t.dump)):(fWe(t,E,t.dump),h&&(t.dump=\"&ref_\"+p+\" \"+t.dump))}else if(c===\"[object String]\")t.tag!==\"?\"&&lWe(t,t.dump,e,n);else{if(t.skipInvalid)return!1;throw new V2(\"unacceptable kind of an object to dump \"+c)}t.tag!==null&&t.tag!==\"?\"&&(t.dump=\"!<\"+t.tag+\"> \"+t.dump)}return!0}function gWe(t,e){var r=[],s=[],a,n;for(t_(t,r,s),a=0,n=s.length;a<n;a+=1)e.duplicates.push(r[s[a]]);e.usedDuplicates=new Array(n)}function t_(t,e,r){var s,a,n;if(t!==null&&typeof t==\"object\")if(a=e.indexOf(t),a!==-1)r.indexOf(a)===-1&&r.push(a);else if(e.push(t),Array.isArray(t))for(a=0,n=t.length;a<n;a+=1)t_(t[a],e,r);else for(s=Object.keys(t),a=0,n=s.length;a<n;a+=1)t_(t[s[a]],e,r)}function fre(t,e){e=e||{};var r=new nWe(e);return r.noRefs||gWe(t,r),Td(r,0,t,!0,!0)?r.dump+`\n`:\"\"}function dWe(t,e){return fre(t,Y2.extend({schema:M9e},e))}n_.exports.dump=fre;n_.exports.safeDump=dWe});var hre=_((TQt,Wi)=>{\"use strict\";var Bx=Gte(),pre=Are();function vx(t){return function(){throw new Error(\"Function \"+t+\" is deprecated and cannot be used.\")}}Wi.exports.Type=Ss();Wi.exports.Schema=Pd();Wi.exports.FAILSAFE_SCHEMA=dx();Wi.exports.JSON_SCHEMA=JU();Wi.exports.CORE_SCHEMA=KU();Wi.exports.DEFAULT_SAFE_SCHEMA=gE();Wi.exports.DEFAULT_FULL_SCHEMA=G2();Wi.exports.load=Bx.load;Wi.exports.loadAll=Bx.loadAll;Wi.exports.safeLoad=Bx.safeLoad;Wi.exports.safeLoadAll=Bx.safeLoadAll;Wi.exports.dump=pre.dump;Wi.exports.safeDump=pre.safeDump;Wi.exports.YAMLException=pE();Wi.exports.MINIMAL_SCHEMA=dx();Wi.exports.SAFE_SCHEMA=gE();Wi.exports.DEFAULT_SCHEMA=G2();Wi.exports.scan=vx(\"scan\");Wi.exports.parse=vx(\"parse\");Wi.exports.compose=vx(\"compose\");Wi.exports.addConstructor=vx(\"addConstructor\")});var dre=_((RQt,gre)=>{\"use strict\";var mWe=hre();gre.exports=mWe});var yre=_((FQt,mre)=>{\"use strict\";function yWe(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Rd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,Rd)}yWe(Rd,Error);Rd.buildMessage=function(t,e){var r={literal:function(h){return'\"'+a(h.text)+'\"'},class:function(h){var E=\"\",C;for(C=0;C<h.parts.length;C++)E+=h.parts[C]instanceof Array?n(h.parts[C][0])+\"-\"+n(h.parts[C][1]):n(h.parts[C]);return\"[\"+(h.inverted?\"^\":\"\")+E+\"]\"},any:function(h){return\"any character\"},end:function(h){return\"end of input\"},other:function(h){return h.description}};function s(h){return h.charCodeAt(0).toString(16).toUpperCase()}function a(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+s(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+s(E)})}function n(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+s(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+s(E)})}function c(h){return r[h.type](h)}function f(h){var E=new Array(h.length),C,S;for(C=0;C<h.length;C++)E[C]=c(h[C]);if(E.sort(),E.length>0){for(C=1,S=1;C<E.length;C++)E[C-1]!==E[C]&&(E[S]=E[C],S++);E.length=S}switch(E.length){case 1:return E[0];case 2:return E[0]+\" or \"+E[1];default:return E.slice(0,-1).join(\", \")+\", or \"+E[E.length-1]}}function p(h){return h?'\"'+a(h)+'\"':\"end of input\"}return\"Expected \"+f(t)+\" but \"+p(e)+\" found.\"};function EWe(t,e){e=e!==void 0?e:{};var r={},s={Start:lc},a=lc,n=function(te){return[].concat(...te)},c=\"-\",f=dn(\"-\",!1),p=function(te){return te},h=function(te){return Object.assign({},...te)},E=\"#\",C=dn(\"#\",!1),S=Au(),P=function(){return{}},I=\":\",R=dn(\":\",!1),N=function(te,Ee){return{[te]:Ee}},U=\",\",W=dn(\",\",!1),ee=function(te,Ee){return Ee},ie=function(te,Ee,Oe){return Object.assign({},...[te].concat(Ee).map(dt=>({[dt]:Oe})))},ue=function(te){return te},le=function(te){return te},me=Oa(\"correct indentation\"),pe=\" \",Be=dn(\" \",!1),Ce=function(te){return te.length===lr*St},g=function(te){return te.length===(lr+1)*St},we=function(){return lr++,!0},ye=function(){return lr--,!0},Ae=function(){return la()},se=Oa(\"pseudostring\"),Z=/^[^\\r\\n\\t ?:,\\][{}#&*!|>'\"%@`\\-]/,De=Kn([\"\\r\",`\n`,\"\t\",\" \",\"?\",\":\",\",\",\"]\",\"[\",\"{\",\"}\",\"#\",\"&\",\"*\",\"!\",\"|\",\">\",\"'\",'\"',\"%\",\"@\",\"`\",\"-\"],!0,!1),Re=/^[^\\r\\n\\t ,\\][{}:#\"']/,mt=Kn([\"\\r\",`\n`,\"\t\",\" \",\",\",\"]\",\"[\",\"{\",\"}\",\":\",\"#\",'\"',\"'\"],!0,!1),j=function(){return la().replace(/^ *| *$/g,\"\")},rt=\"--\",Fe=dn(\"--\",!1),Ne=/^[a-zA-Z\\/0-9]/,Pe=Kn([[\"a\",\"z\"],[\"A\",\"Z\"],\"/\",[\"0\",\"9\"]],!1,!1),Ve=/^[^\\r\\n\\t :,]/,ke=Kn([\"\\r\",`\n`,\"\t\",\" \",\":\",\",\"],!0,!1),it=\"null\",Ue=dn(\"null\",!1),x=function(){return null},w=\"true\",b=dn(\"true\",!1),y=function(){return!0},F=\"false\",z=dn(\"false\",!1),X=function(){return!1},$=Oa(\"string\"),oe='\"',xe=dn('\"',!1),Te=function(){return\"\"},lt=function(te){return te},Ct=function(te){return te.join(\"\")},qt=/^[^\"\\\\\\0-\\x1F\\x7F]/,ir=Kn(['\"',\"\\\\\",[\"\\0\",\"\u001f\"],\"\\x7F\"],!0,!1),Pt='\\\\\"',gn=dn('\\\\\"',!1),Pr=function(){return'\"'},Ir=\"\\\\\\\\\",Or=dn(\"\\\\\\\\\",!1),on=function(){return\"\\\\\"},ai=\"\\\\/\",Io=dn(\"\\\\/\",!1),rs=function(){return\"/\"},$s=\"\\\\b\",Co=dn(\"\\\\b\",!1),ji=function(){return\"\\b\"},eo=\"\\\\f\",wo=dn(\"\\\\f\",!1),QA=function(){return\"\\f\"},Af=\"\\\\n\",dh=dn(\"\\\\n\",!1),mh=function(){return`\n`},to=\"\\\\r\",jn=dn(\"\\\\r\",!1),Ts=function(){return\"\\r\"},ro=\"\\\\t\",ou=dn(\"\\\\t\",!1),au=function(){return\"\t\"},lu=\"\\\\u\",TA=dn(\"\\\\u\",!1),RA=function(te,Ee,Oe,dt){return String.fromCharCode(parseInt(`0x${te}${Ee}${Oe}${dt}`))},oa=/^[0-9a-fA-F]/,aa=Kn([[\"0\",\"9\"],[\"a\",\"f\"],[\"A\",\"F\"]],!1,!1),FA=Oa(\"blank space\"),gr=/^[ \\t]/,Bo=Kn([\" \",\"\t\"],!1,!1),Me=Oa(\"white space\"),cu=/^[ \\t\\n\\r]/,Cr=Kn([\" \",\"\t\",`\n`,\"\\r\"],!1,!1),pf=`\\r\n`,NA=dn(`\\r\n`,!1),OA=`\n`,uu=dn(`\n`,!1),fu=\"\\r\",oc=dn(\"\\r\",!1),ve=0,Nt=0,ac=[{line:1,column:1}],Oi=0,no=[],Rt=0,xn;if(\"startRule\"in e){if(!(e.startRule in s))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');a=s[e.startRule]}function la(){return t.substring(Nt,ve)}function Gi(){return Ma(Nt,ve)}function Li(te,Ee){throw Ee=Ee!==void 0?Ee:Ma(Nt,ve),hf([Oa(te)],t.substring(Nt,ve),Ee)}function Na(te,Ee){throw Ee=Ee!==void 0?Ee:Ma(Nt,ve),Ua(te,Ee)}function dn(te,Ee){return{type:\"literal\",text:te,ignoreCase:Ee}}function Kn(te,Ee,Oe){return{type:\"class\",parts:te,inverted:Ee,ignoreCase:Oe}}function Au(){return{type:\"any\"}}function yh(){return{type:\"end\"}}function Oa(te){return{type:\"other\",description:te}}function La(te){var Ee=ac[te],Oe;if(Ee)return Ee;for(Oe=te-1;!ac[Oe];)Oe--;for(Ee=ac[Oe],Ee={line:Ee.line,column:Ee.column};Oe<te;)t.charCodeAt(Oe)===10?(Ee.line++,Ee.column=1):Ee.column++,Oe++;return ac[te]=Ee,Ee}function Ma(te,Ee){var Oe=La(te),dt=La(Ee);return{start:{offset:te,line:Oe.line,column:Oe.column},end:{offset:Ee,line:dt.line,column:dt.column}}}function $e(te){ve<Oi||(ve>Oi&&(Oi=ve,no=[]),no.push(te))}function Ua(te,Ee){return new Rd(te,null,null,Ee)}function hf(te,Ee,Oe){return new Rd(Rd.buildMessage(te,Ee),te,Ee,Oe)}function lc(){var te;return te=LA(),te}function wn(){var te,Ee,Oe;for(te=ve,Ee=[],Oe=ca();Oe!==r;)Ee.push(Oe),Oe=ca();return Ee!==r&&(Nt=te,Ee=n(Ee)),te=Ee,te}function ca(){var te,Ee,Oe,dt,Et;return te=ve,Ee=Bl(),Ee!==r?(t.charCodeAt(ve)===45?(Oe=c,ve++):(Oe=r,Rt===0&&$e(f)),Oe!==r?(dt=Qn(),dt!==r?(Et=ua(),Et!==r?(Nt=te,Ee=p(Et),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te}function LA(){var te,Ee,Oe;for(te=ve,Ee=[],Oe=MA();Oe!==r;)Ee.push(Oe),Oe=MA();return Ee!==r&&(Nt=te,Ee=h(Ee)),te=Ee,te}function MA(){var te,Ee,Oe,dt,Et,bt,tr,An,li;if(te=ve,Ee=Qn(),Ee===r&&(Ee=null),Ee!==r){if(Oe=ve,t.charCodeAt(ve)===35?(dt=E,ve++):(dt=r,Rt===0&&$e(C)),dt!==r){if(Et=[],bt=ve,tr=ve,Rt++,An=st(),Rt--,An===r?tr=void 0:(ve=tr,tr=r),tr!==r?(t.length>ve?(An=t.charAt(ve),ve++):(An=r,Rt===0&&$e(S)),An!==r?(tr=[tr,An],bt=tr):(ve=bt,bt=r)):(ve=bt,bt=r),bt!==r)for(;bt!==r;)Et.push(bt),bt=ve,tr=ve,Rt++,An=st(),Rt--,An===r?tr=void 0:(ve=tr,tr=r),tr!==r?(t.length>ve?(An=t.charAt(ve),ve++):(An=r,Rt===0&&$e(S)),An!==r?(tr=[tr,An],bt=tr):(ve=bt,bt=r)):(ve=bt,bt=r);else Et=r;Et!==r?(dt=[dt,Et],Oe=dt):(ve=Oe,Oe=r)}else ve=Oe,Oe=r;if(Oe===r&&(Oe=null),Oe!==r){if(dt=[],Et=Ke(),Et!==r)for(;Et!==r;)dt.push(Et),Et=Ke();else dt=r;dt!==r?(Nt=te,Ee=P(),te=Ee):(ve=te,te=r)}else ve=te,te=r}else ve=te,te=r;if(te===r&&(te=ve,Ee=Bl(),Ee!==r?(Oe=Ha(),Oe!==r?(dt=Qn(),dt===r&&(dt=null),dt!==r?(t.charCodeAt(ve)===58?(Et=I,ve++):(Et=r,Rt===0&&$e(R)),Et!==r?(bt=Qn(),bt===r&&(bt=null),bt!==r?(tr=ua(),tr!==r?(Nt=te,Ee=N(Oe,tr),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te===r&&(te=ve,Ee=Bl(),Ee!==r?(Oe=ns(),Oe!==r?(dt=Qn(),dt===r&&(dt=null),dt!==r?(t.charCodeAt(ve)===58?(Et=I,ve++):(Et=r,Rt===0&&$e(R)),Et!==r?(bt=Qn(),bt===r&&(bt=null),bt!==r?(tr=ua(),tr!==r?(Nt=te,Ee=N(Oe,tr),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te===r))){if(te=ve,Ee=Bl(),Ee!==r)if(Oe=ns(),Oe!==r)if(dt=Qn(),dt!==r)if(Et=pu(),Et!==r){if(bt=[],tr=Ke(),tr!==r)for(;tr!==r;)bt.push(tr),tr=Ke();else bt=r;bt!==r?(Nt=te,Ee=N(Oe,Et),te=Ee):(ve=te,te=r)}else ve=te,te=r;else ve=te,te=r;else ve=te,te=r;else ve=te,te=r;if(te===r)if(te=ve,Ee=Bl(),Ee!==r)if(Oe=ns(),Oe!==r){if(dt=[],Et=ve,bt=Qn(),bt===r&&(bt=null),bt!==r?(t.charCodeAt(ve)===44?(tr=U,ve++):(tr=r,Rt===0&&$e(W)),tr!==r?(An=Qn(),An===r&&(An=null),An!==r?(li=ns(),li!==r?(Nt=Et,bt=ee(Oe,li),Et=bt):(ve=Et,Et=r)):(ve=Et,Et=r)):(ve=Et,Et=r)):(ve=Et,Et=r),Et!==r)for(;Et!==r;)dt.push(Et),Et=ve,bt=Qn(),bt===r&&(bt=null),bt!==r?(t.charCodeAt(ve)===44?(tr=U,ve++):(tr=r,Rt===0&&$e(W)),tr!==r?(An=Qn(),An===r&&(An=null),An!==r?(li=ns(),li!==r?(Nt=Et,bt=ee(Oe,li),Et=bt):(ve=Et,Et=r)):(ve=Et,Et=r)):(ve=Et,Et=r)):(ve=Et,Et=r);else dt=r;dt!==r?(Et=Qn(),Et===r&&(Et=null),Et!==r?(t.charCodeAt(ve)===58?(bt=I,ve++):(bt=r,Rt===0&&$e(R)),bt!==r?(tr=Qn(),tr===r&&(tr=null),tr!==r?(An=ua(),An!==r?(Nt=te,Ee=ie(Oe,dt,An),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)}else ve=te,te=r;else ve=te,te=r}return te}function ua(){var te,Ee,Oe,dt,Et,bt,tr;if(te=ve,Ee=ve,Rt++,Oe=ve,dt=st(),dt!==r?(Et=Mt(),Et!==r?(t.charCodeAt(ve)===45?(bt=c,ve++):(bt=r,Rt===0&&$e(f)),bt!==r?(tr=Qn(),tr!==r?(dt=[dt,Et,bt,tr],Oe=dt):(ve=Oe,Oe=r)):(ve=Oe,Oe=r)):(ve=Oe,Oe=r)):(ve=Oe,Oe=r),Rt--,Oe!==r?(ve=Ee,Ee=void 0):Ee=r,Ee!==r?(Oe=Ke(),Oe!==r?(dt=kn(),dt!==r?(Et=wn(),Et!==r?(bt=fa(),bt!==r?(Nt=te,Ee=ue(Et),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te===r&&(te=ve,Ee=st(),Ee!==r?(Oe=kn(),Oe!==r?(dt=LA(),dt!==r?(Et=fa(),Et!==r?(Nt=te,Ee=ue(dt),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te===r))if(te=ve,Ee=cc(),Ee!==r){if(Oe=[],dt=Ke(),dt!==r)for(;dt!==r;)Oe.push(dt),dt=Ke();else Oe=r;Oe!==r?(Nt=te,Ee=le(Ee),te=Ee):(ve=te,te=r)}else ve=te,te=r;return te}function Bl(){var te,Ee,Oe;for(Rt++,te=ve,Ee=[],t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Rt===0&&$e(Be));Oe!==r;)Ee.push(Oe),t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Rt===0&&$e(Be));return Ee!==r?(Nt=ve,Oe=Ce(Ee),Oe?Oe=void 0:Oe=r,Oe!==r?(Ee=[Ee,Oe],te=Ee):(ve=te,te=r)):(ve=te,te=r),Rt--,te===r&&(Ee=r,Rt===0&&$e(me)),te}function Mt(){var te,Ee,Oe;for(te=ve,Ee=[],t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Rt===0&&$e(Be));Oe!==r;)Ee.push(Oe),t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Rt===0&&$e(Be));return Ee!==r?(Nt=ve,Oe=g(Ee),Oe?Oe=void 0:Oe=r,Oe!==r?(Ee=[Ee,Oe],te=Ee):(ve=te,te=r)):(ve=te,te=r),te}function kn(){var te;return Nt=ve,te=we(),te?te=void 0:te=r,te}function fa(){var te;return Nt=ve,te=ye(),te?te=void 0:te=r,te}function Ha(){var te;return te=vl(),te===r&&(te=uc()),te}function ns(){var te,Ee,Oe;if(te=vl(),te===r){if(te=ve,Ee=[],Oe=ja(),Oe!==r)for(;Oe!==r;)Ee.push(Oe),Oe=ja();else Ee=r;Ee!==r&&(Nt=te,Ee=Ae()),te=Ee}return te}function cc(){var te;return te=Mi(),te===r&&(te=Is(),te===r&&(te=vl(),te===r&&(te=uc()))),te}function pu(){var te;return te=Mi(),te===r&&(te=vl(),te===r&&(te=ja())),te}function uc(){var te,Ee,Oe,dt,Et,bt;if(Rt++,te=ve,Z.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Rt===0&&$e(De)),Ee!==r){for(Oe=[],dt=ve,Et=Qn(),Et===r&&(Et=null),Et!==r?(Re.test(t.charAt(ve))?(bt=t.charAt(ve),ve++):(bt=r,Rt===0&&$e(mt)),bt!==r?(Et=[Et,bt],dt=Et):(ve=dt,dt=r)):(ve=dt,dt=r);dt!==r;)Oe.push(dt),dt=ve,Et=Qn(),Et===r&&(Et=null),Et!==r?(Re.test(t.charAt(ve))?(bt=t.charAt(ve),ve++):(bt=r,Rt===0&&$e(mt)),bt!==r?(Et=[Et,bt],dt=Et):(ve=dt,dt=r)):(ve=dt,dt=r);Oe!==r?(Nt=te,Ee=j(),te=Ee):(ve=te,te=r)}else ve=te,te=r;return Rt--,te===r&&(Ee=r,Rt===0&&$e(se)),te}function ja(){var te,Ee,Oe,dt,Et;if(te=ve,t.substr(ve,2)===rt?(Ee=rt,ve+=2):(Ee=r,Rt===0&&$e(Fe)),Ee===r&&(Ee=null),Ee!==r)if(Ne.test(t.charAt(ve))?(Oe=t.charAt(ve),ve++):(Oe=r,Rt===0&&$e(Pe)),Oe!==r){for(dt=[],Ve.test(t.charAt(ve))?(Et=t.charAt(ve),ve++):(Et=r,Rt===0&&$e(ke));Et!==r;)dt.push(Et),Ve.test(t.charAt(ve))?(Et=t.charAt(ve),ve++):(Et=r,Rt===0&&$e(ke));dt!==r?(Nt=te,Ee=j(),te=Ee):(ve=te,te=r)}else ve=te,te=r;else ve=te,te=r;return te}function Mi(){var te,Ee;return te=ve,t.substr(ve,4)===it?(Ee=it,ve+=4):(Ee=r,Rt===0&&$e(Ue)),Ee!==r&&(Nt=te,Ee=x()),te=Ee,te}function Is(){var te,Ee;return te=ve,t.substr(ve,4)===w?(Ee=w,ve+=4):(Ee=r,Rt===0&&$e(b)),Ee!==r&&(Nt=te,Ee=y()),te=Ee,te===r&&(te=ve,t.substr(ve,5)===F?(Ee=F,ve+=5):(Ee=r,Rt===0&&$e(z)),Ee!==r&&(Nt=te,Ee=X()),te=Ee),te}function vl(){var te,Ee,Oe,dt;return Rt++,te=ve,t.charCodeAt(ve)===34?(Ee=oe,ve++):(Ee=r,Rt===0&&$e(xe)),Ee!==r?(t.charCodeAt(ve)===34?(Oe=oe,ve++):(Oe=r,Rt===0&&$e(xe)),Oe!==r?(Nt=te,Ee=Te(),te=Ee):(ve=te,te=r)):(ve=te,te=r),te===r&&(te=ve,t.charCodeAt(ve)===34?(Ee=oe,ve++):(Ee=r,Rt===0&&$e(xe)),Ee!==r?(Oe=gf(),Oe!==r?(t.charCodeAt(ve)===34?(dt=oe,ve++):(dt=r,Rt===0&&$e(xe)),dt!==r?(Nt=te,Ee=lt(Oe),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)),Rt--,te===r&&(Ee=r,Rt===0&&$e($)),te}function gf(){var te,Ee,Oe;if(te=ve,Ee=[],Oe=fc(),Oe!==r)for(;Oe!==r;)Ee.push(Oe),Oe=fc();else Ee=r;return Ee!==r&&(Nt=te,Ee=Ct(Ee)),te=Ee,te}function fc(){var te,Ee,Oe,dt,Et,bt;return qt.test(t.charAt(ve))?(te=t.charAt(ve),ve++):(te=r,Rt===0&&$e(ir)),te===r&&(te=ve,t.substr(ve,2)===Pt?(Ee=Pt,ve+=2):(Ee=r,Rt===0&&$e(gn)),Ee!==r&&(Nt=te,Ee=Pr()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===Ir?(Ee=Ir,ve+=2):(Ee=r,Rt===0&&$e(Or)),Ee!==r&&(Nt=te,Ee=on()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===ai?(Ee=ai,ve+=2):(Ee=r,Rt===0&&$e(Io)),Ee!==r&&(Nt=te,Ee=rs()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===$s?(Ee=$s,ve+=2):(Ee=r,Rt===0&&$e(Co)),Ee!==r&&(Nt=te,Ee=ji()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===eo?(Ee=eo,ve+=2):(Ee=r,Rt===0&&$e(wo)),Ee!==r&&(Nt=te,Ee=QA()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===Af?(Ee=Af,ve+=2):(Ee=r,Rt===0&&$e(dh)),Ee!==r&&(Nt=te,Ee=mh()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===to?(Ee=to,ve+=2):(Ee=r,Rt===0&&$e(jn)),Ee!==r&&(Nt=te,Ee=Ts()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===ro?(Ee=ro,ve+=2):(Ee=r,Rt===0&&$e(ou)),Ee!==r&&(Nt=te,Ee=au()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===lu?(Ee=lu,ve+=2):(Ee=r,Rt===0&&$e(TA)),Ee!==r?(Oe=wi(),Oe!==r?(dt=wi(),dt!==r?(Et=wi(),Et!==r?(bt=wi(),bt!==r?(Nt=te,Ee=RA(Oe,dt,Et,bt),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)))))))))),te}function wi(){var te;return oa.test(t.charAt(ve))?(te=t.charAt(ve),ve++):(te=r,Rt===0&&$e(aa)),te}function Qn(){var te,Ee;if(Rt++,te=[],gr.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Rt===0&&$e(Bo)),Ee!==r)for(;Ee!==r;)te.push(Ee),gr.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Rt===0&&$e(Bo));else te=r;return Rt--,te===r&&(Ee=r,Rt===0&&$e(FA)),te}function Ac(){var te,Ee;if(Rt++,te=[],cu.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Rt===0&&$e(Cr)),Ee!==r)for(;Ee!==r;)te.push(Ee),cu.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Rt===0&&$e(Cr));else te=r;return Rt--,te===r&&(Ee=r,Rt===0&&$e(Me)),te}function Ke(){var te,Ee,Oe,dt,Et,bt;if(te=ve,Ee=st(),Ee!==r){for(Oe=[],dt=ve,Et=Qn(),Et===r&&(Et=null),Et!==r?(bt=st(),bt!==r?(Et=[Et,bt],dt=Et):(ve=dt,dt=r)):(ve=dt,dt=r);dt!==r;)Oe.push(dt),dt=ve,Et=Qn(),Et===r&&(Et=null),Et!==r?(bt=st(),bt!==r?(Et=[Et,bt],dt=Et):(ve=dt,dt=r)):(ve=dt,dt=r);Oe!==r?(Ee=[Ee,Oe],te=Ee):(ve=te,te=r)}else ve=te,te=r;return te}function st(){var te;return t.substr(ve,2)===pf?(te=pf,ve+=2):(te=r,Rt===0&&$e(NA)),te===r&&(t.charCodeAt(ve)===10?(te=OA,ve++):(te=r,Rt===0&&$e(uu)),te===r&&(t.charCodeAt(ve)===13?(te=fu,ve++):(te=r,Rt===0&&$e(oc)))),te}let St=2,lr=0;if(xn=a(),xn!==r&&ve===t.length)return xn;throw xn!==r&&ve<t.length&&$e(yh()),hf(no,Oi<t.length?t.charAt(Oi):null,Oi<t.length?Ma(Oi,Oi+1):Ma(Oi,Oi))}mre.exports={SyntaxError:Rd,parse:EWe}});function Ire(t){return t.match(IWe)?t:JSON.stringify(t)}function wre(t){return typeof t>\"u\"?!0:typeof t==\"object\"&&t!==null&&!Array.isArray(t)?Object.keys(t).every(e=>wre(t[e])):!1}function i_(t,e,r){if(t===null)return`null\n`;if(typeof t==\"number\"||typeof t==\"boolean\")return`${t.toString()}\n`;if(typeof t==\"string\")return`${Ire(t)}\n`;if(Array.isArray(t)){if(t.length===0)return`[]\n`;let s=\"  \".repeat(e);return`\n${t.map(n=>`${s}- ${i_(n,e+1,!1)}`).join(\"\")}`}if(typeof t==\"object\"&&t){let[s,a]=t instanceof Sx?[t.data,!1]:[t,!0],n=\"  \".repeat(e),c=Object.keys(s);a&&c.sort((p,h)=>{let E=Ere.indexOf(p),C=Ere.indexOf(h);return E===-1&&C===-1?p<h?-1:p>h?1:0:E!==-1&&C===-1?-1:E===-1&&C!==-1?1:E-C});let f=c.filter(p=>!wre(s[p])).map((p,h)=>{let E=s[p],C=Ire(p),S=i_(E,e+1,!0),P=h>0||r?n:\"\",I=C.length>1024?`? ${C}\n${P}:`:`${C}:`,R=S.startsWith(`\n`)?S:` ${S}`;return`${P}${I}${R}`}).join(e===0?`\n`:\"\")||`\n`;return r?`\n${f}`:`${f}`}throw new Error(`Unsupported value type (${t})`)}function nl(t){try{let e=i_(t,0,!1);return e!==`\n`?e:\"\"}catch(e){throw e.location&&(e.message=e.message.replace(/(\\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}function CWe(t){return t.endsWith(`\n`)||(t+=`\n`),(0,Cre.parse)(t)}function BWe(t){if(wWe.test(t))return CWe(t);let e=(0,Dx.safeLoad)(t,{schema:Dx.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!=\"object\")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error(\"Expected an indexed object, got an array instead. Does your file follow Yaml's rules?\");return e}function ls(t){return BWe(t)}var Dx,Cre,IWe,Ere,Sx,wWe,Bre=Xe(()=>{Dx=ut(dre()),Cre=ut(yre()),IWe=/^(?![-?:,\\][{}#&*!|>'\"%@` \\t\\r\\n]).([ \\t]*(?![,\\][{}:# \\t\\r\\n]).)*$/,Ere=[\"__metadata\",\"version\",\"resolution\",\"dependencies\",\"peerDependencies\",\"dependenciesMeta\",\"peerDependenciesMeta\",\"binaries\"],Sx=class{constructor(e){this.data=e}};nl.PreserveOrdering=Sx;wWe=/^(#.*(\\r?\\n))*?#\\s+yarn\\s+lockfile\\s+v1\\r?\\n/i});var J2={};Vt(J2,{parseResolution:()=>px,parseShell:()=>ux,parseSyml:()=>ls,stringifyArgument:()=>qU,stringifyArgumentSegment:()=>WU,stringifyArithmeticExpression:()=>Ax,stringifyCommand:()=>GU,stringifyCommandChain:()=>AE,stringifyCommandChainThen:()=>jU,stringifyCommandLine:()=>fx,stringifyCommandLineThen:()=>HU,stringifyEnvSegment:()=>cx,stringifyRedirectArgument:()=>H2,stringifyResolution:()=>hx,stringifyShell:()=>fE,stringifyShellLine:()=>fE,stringifySyml:()=>nl,stringifyValueArgument:()=>vd});var wc=Xe(()=>{wee();Dee();Bre()});var Sre=_((UQt,s_)=>{\"use strict\";var vWe=t=>{let e=!1,r=!1,s=!1;for(let a=0;a<t.length;a++){let n=t[a];e&&/[a-zA-Z]/.test(n)&&n.toUpperCase()===n?(t=t.slice(0,a)+\"-\"+t.slice(a),e=!1,s=r,r=!0,a++):r&&s&&/[a-zA-Z]/.test(n)&&n.toLowerCase()===n?(t=t.slice(0,a-1)+\"-\"+t.slice(a-1),s=r,r=!1,e=!0):(e=n.toLowerCase()===n&&n.toUpperCase()!==n,s=r,r=n.toUpperCase()===n&&n.toLowerCase()!==n)}return t},vre=(t,e)=>{if(!(typeof t==\"string\"||Array.isArray(t)))throw new TypeError(\"Expected the input to be `string | string[]`\");e=Object.assign({pascalCase:!1},e);let r=a=>e.pascalCase?a.charAt(0).toUpperCase()+a.slice(1):a;return Array.isArray(t)?t=t.map(a=>a.trim()).filter(a=>a.length).join(\"-\"):t=t.trim(),t.length===0?\"\":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=vWe(t)),t=t.replace(/^[_.\\- ]+/,\"\").toLowerCase().replace(/[_.\\- ]+(\\w|$)/g,(a,n)=>n.toUpperCase()).replace(/\\d+(\\w|$)/g,a=>a.toUpperCase()),r(t))};s_.exports=vre;s_.exports.default=vre});var Dre=_((_Qt,SWe)=>{SWe.exports=[{name:\"Agola CI\",constant:\"AGOLA\",env:\"AGOLA_GIT_REF\",pr:\"AGOLA_PULL_REQUEST_ID\"},{name:\"Appcircle\",constant:\"APPCIRCLE\",env:\"AC_APPCIRCLE\"},{name:\"AppVeyor\",constant:\"APPVEYOR\",env:\"APPVEYOR\",pr:\"APPVEYOR_PULL_REQUEST_NUMBER\"},{name:\"AWS CodeBuild\",constant:\"CODEBUILD\",env:\"CODEBUILD_BUILD_ARN\"},{name:\"Azure Pipelines\",constant:\"AZURE_PIPELINES\",env:\"TF_BUILD\",pr:{BUILD_REASON:\"PullRequest\"}},{name:\"Bamboo\",constant:\"BAMBOO\",env:\"bamboo_planKey\"},{name:\"Bitbucket Pipelines\",constant:\"BITBUCKET\",env:\"BITBUCKET_COMMIT\",pr:\"BITBUCKET_PR_ID\"},{name:\"Bitrise\",constant:\"BITRISE\",env:\"BITRISE_IO\",pr:\"BITRISE_PULL_REQUEST\"},{name:\"Buddy\",constant:\"BUDDY\",env:\"BUDDY_WORKSPACE_ID\",pr:\"BUDDY_EXECUTION_PULL_REQUEST_ID\"},{name:\"Buildkite\",constant:\"BUILDKITE\",env:\"BUILDKITE\",pr:{env:\"BUILDKITE_PULL_REQUEST\",ne:\"false\"}},{name:\"CircleCI\",constant:\"CIRCLE\",env:\"CIRCLECI\",pr:\"CIRCLE_PULL_REQUEST\"},{name:\"Cirrus CI\",constant:\"CIRRUS\",env:\"CIRRUS_CI\",pr:\"CIRRUS_PR\"},{name:\"Codefresh\",constant:\"CODEFRESH\",env:\"CF_BUILD_ID\",pr:{any:[\"CF_PULL_REQUEST_NUMBER\",\"CF_PULL_REQUEST_ID\"]}},{name:\"Codemagic\",constant:\"CODEMAGIC\",env:\"CM_BUILD_ID\",pr:\"CM_PULL_REQUEST\"},{name:\"Codeship\",constant:\"CODESHIP\",env:{CI_NAME:\"codeship\"}},{name:\"Drone\",constant:\"DRONE\",env:\"DRONE\",pr:{DRONE_BUILD_EVENT:\"pull_request\"}},{name:\"dsari\",constant:\"DSARI\",env:\"DSARI\"},{name:\"Earthly\",constant:\"EARTHLY\",env:\"EARTHLY_CI\"},{name:\"Expo Application Services\",constant:\"EAS\",env:\"EAS_BUILD\"},{name:\"Gerrit\",constant:\"GERRIT\",env:\"GERRIT_PROJECT\"},{name:\"Gitea Actions\",constant:\"GITEA_ACTIONS\",env:\"GITEA_ACTIONS\"},{name:\"GitHub Actions\",constant:\"GITHUB_ACTIONS\",env:\"GITHUB_ACTIONS\",pr:{GITHUB_EVENT_NAME:\"pull_request\"}},{name:\"GitLab CI\",constant:\"GITLAB\",env:\"GITLAB_CI\",pr:\"CI_MERGE_REQUEST_ID\"},{name:\"GoCD\",constant:\"GOCD\",env:\"GO_PIPELINE_LABEL\"},{name:\"Google Cloud Build\",constant:\"GOOGLE_CLOUD_BUILD\",env:\"BUILDER_OUTPUT\"},{name:\"Harness CI\",constant:\"HARNESS\",env:\"HARNESS_BUILD_ID\"},{name:\"Heroku\",constant:\"HEROKU\",env:{env:\"NODE\",includes:\"/app/.heroku/node/bin/node\"}},{name:\"Hudson\",constant:\"HUDSON\",env:\"HUDSON_URL\"},{name:\"Jenkins\",constant:\"JENKINS\",env:[\"JENKINS_URL\",\"BUILD_ID\"],pr:{any:[\"ghprbPullId\",\"CHANGE_ID\"]}},{name:\"LayerCI\",constant:\"LAYERCI\",env:\"LAYERCI\",pr:\"LAYERCI_PULL_REQUEST\"},{name:\"Magnum CI\",constant:\"MAGNUM\",env:\"MAGNUM\"},{name:\"Netlify CI\",constant:\"NETLIFY\",env:\"NETLIFY\",pr:{env:\"PULL_REQUEST\",ne:\"false\"}},{name:\"Nevercode\",constant:\"NEVERCODE\",env:\"NEVERCODE\",pr:{env:\"NEVERCODE_PULL_REQUEST\",ne:\"false\"}},{name:\"Prow\",constant:\"PROW\",env:\"PROW_JOB_ID\"},{name:\"ReleaseHub\",constant:\"RELEASEHUB\",env:\"RELEASE_BUILD_ID\"},{name:\"Render\",constant:\"RENDER\",env:\"RENDER\",pr:{IS_PULL_REQUEST:\"true\"}},{name:\"Sail CI\",constant:\"SAIL\",env:\"SAILCI\",pr:\"SAIL_PULL_REQUEST_NUMBER\"},{name:\"Screwdriver\",constant:\"SCREWDRIVER\",env:\"SCREWDRIVER\",pr:{env:\"SD_PULL_REQUEST\",ne:\"false\"}},{name:\"Semaphore\",constant:\"SEMAPHORE\",env:\"SEMAPHORE\",pr:\"PULL_REQUEST_NUMBER\"},{name:\"Sourcehut\",constant:\"SOURCEHUT\",env:{CI_NAME:\"sourcehut\"}},{name:\"Strider CD\",constant:\"STRIDER\",env:\"STRIDER\"},{name:\"TaskCluster\",constant:\"TASKCLUSTER\",env:[\"TASK_ID\",\"RUN_ID\"]},{name:\"TeamCity\",constant:\"TEAMCITY\",env:\"TEAMCITY_VERSION\"},{name:\"Travis CI\",constant:\"TRAVIS\",env:\"TRAVIS\",pr:{env:\"TRAVIS_PULL_REQUEST\",ne:\"false\"}},{name:\"Vela\",constant:\"VELA\",env:\"VELA\",pr:{VELA_PULL_REQUEST:\"1\"}},{name:\"Vercel\",constant:\"VERCEL\",env:{any:[\"NOW_BUILDER\",\"VERCEL\"]},pr:\"VERCEL_GIT_PULL_REQUEST_ID\"},{name:\"Visual Studio App Center\",constant:\"APPCENTER\",env:\"APPCENTER_BUILD_ID\"},{name:\"Woodpecker\",constant:\"WOODPECKER\",env:{CI:\"woodpecker\"},pr:{CI_BUILD_EVENT:\"pull_request\"}},{name:\"Xcode Cloud\",constant:\"XCODE_CLOUD\",env:\"CI_XCODE_PROJECT\",pr:\"CI_PULL_REQUEST_NUMBER\"},{name:\"Xcode Server\",constant:\"XCODE_SERVER\",env:\"XCS\"}]});var Fd=_(Ml=>{\"use strict\";var Pre=Dre(),Ds=process.env;Object.defineProperty(Ml,\"_vendors\",{value:Pre.map(function(t){return t.constant})});Ml.name=null;Ml.isPR=null;Pre.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(s){return bre(s)});if(Ml[t.constant]=r,!!r)switch(Ml.name=t.name,typeof t.pr){case\"string\":Ml.isPR=!!Ds[t.pr];break;case\"object\":\"env\"in t.pr?Ml.isPR=t.pr.env in Ds&&Ds[t.pr.env]!==t.pr.ne:\"any\"in t.pr?Ml.isPR=t.pr.any.some(function(s){return!!Ds[s]}):Ml.isPR=bre(t.pr);break;default:Ml.isPR=null}});Ml.isCI=!!(Ds.CI!==\"false\"&&(Ds.BUILD_ID||Ds.BUILD_NUMBER||Ds.CI||Ds.CI_APP_ID||Ds.CI_BUILD_ID||Ds.CI_BUILD_NUMBER||Ds.CI_NAME||Ds.CONTINUOUS_INTEGRATION||Ds.RUN_ID||Ml.name));function bre(t){return typeof t==\"string\"?!!Ds[t]:\"env\"in t?Ds[t.env]&&Ds[t.env].includes(t.includes):\"any\"in t?t.any.some(function(e){return!!Ds[e]}):Object.keys(t).every(function(e){return Ds[e]===t[e]})}});var ei,En,Nd,o_,bx,xre,a_,l_,Px=Xe(()=>{(function(t){t.StartOfInput=\"\\0\",t.EndOfInput=\"\u0001\",t.EndOfPartialInput=\"\u0002\"})(ei||(ei={}));(function(t){t[t.InitialNode=0]=\"InitialNode\",t[t.SuccessNode=1]=\"SuccessNode\",t[t.ErrorNode=2]=\"ErrorNode\",t[t.CustomNode=3]=\"CustomNode\"})(En||(En={}));Nd=-1,o_=/^(-h|--help)(?:=([0-9]+))?$/,bx=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,xre=/^-[a-zA-Z]{2,}$/,a_=/^([^=]+)=([\\s\\S]*)$/,l_=process.env.DEBUG_CLI===\"1\"});var nt,IE,xx,c_,kx=Xe(()=>{Px();nt=class extends Error{constructor(e){super(e),this.clipanion={type:\"usage\"},this.name=\"UsageError\"}},IE=class extends Error{constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanion={type:\"none\"},this.name=\"UnknownSyntaxError\",this.candidates.length===0)this.message=\"Command not found, but we're not sure what's the alternative.\";else if(this.candidates.every(s=>s.reason!==null&&s.reason===r[0].reason)){let[{reason:s}]=this.candidates;this.message=`${s}\n\n${this.candidates.map(({usage:a})=>`$ ${a}`).join(`\n`)}`}else if(this.candidates.length===1){let[{usage:s}]=this.candidates;this.message=`Command not found; did you mean:\n\n$ ${s}\n${c_(e)}`}else this.message=`Command not found; did you mean one of:\n\n${this.candidates.map(({usage:s},a)=>`${`${a}.`.padStart(4)} ${s}`).join(`\n`)}\n\n${c_(e)}`}},xx=class extends Error{constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type:\"none\"},this.name=\"AmbiguousSyntaxError\",this.message=`Cannot find which to pick amongst the following alternatives:\n\n${this.usages.map((s,a)=>`${`${a}.`.padStart(4)} ${s}`).join(`\n`)}\n\n${c_(e)}`}},c_=t=>`While running ${t.filter(e=>e!==ei.EndOfInput&&e!==ei.EndOfPartialInput).map(e=>{let r=JSON.stringify(e);return e.match(/\\s/)||e.length===0||r!==`\"${e}\"`?r:e}).join(\" \")}`});function DWe(t){let e=t.split(`\n`),r=e.filter(a=>a.match(/\\S/)),s=r.length>0?r.reduce((a,n)=>Math.min(a,n.length-n.trimStart().length),Number.MAX_VALUE):0;return e.map(a=>a.slice(s).trimRight()).join(`\n`)}function Ho(t,{format:e,paragraphs:r}){return t=t.replace(/\\r\\n?/g,`\n`),t=DWe(t),t=t.replace(/^\\n+|\\n+$/g,\"\"),t=t.replace(/^(\\s*)-([^\\n]*?)\\n+/gm,`$1-$2\n\n`),t=t.replace(/\\n(\\n)?\\n*/g,(s,a)=>a||\" \"),r&&(t=t.split(/\\n/).map(s=>{let a=s.match(/^\\s*[*-][\\t ]+(.*)/);if(!a)return s.match(/(.{1,80})(?: |$)/g).join(`\n`);let n=s.length-s.trimStart().length;return a[1].match(new RegExp(`(.{1,${78-n}})(?: |$)`,\"g\")).map((c,f)=>\" \".repeat(n)+(f===0?\"- \":\"  \")+c).join(`\n`)}).join(`\n\n`)),t=t.replace(/(`+)((?:.|[\\n])*?)\\1/g,(s,a,n)=>e.code(a+n+a)),t=t.replace(/(\\*\\*)((?:.|[\\n])*?)\\1/g,(s,a,n)=>e.bold(a+n+a)),t?`${t}\n`:\"\"}var u_,kre,Qre,f_=Xe(()=>{u_=Array(80).fill(\"\\u2501\");for(let t=0;t<=24;++t)u_[u_.length-t]=`\\x1B[38;5;${232+t}m\\u2501`;kre={header:t=>`\\x1B[1m\\u2501\\u2501\\u2501 ${t}${t.length<75?` ${u_.slice(t.length+5).join(\"\")}`:\":\"}\\x1B[0m`,bold:t=>`\\x1B[1m${t}\\x1B[22m`,error:t=>`\\x1B[31m\\x1B[1m${t}\\x1B[22m\\x1B[39m`,code:t=>`\\x1B[36m${t}\\x1B[39m`},Qre={header:t=>t,bold:t=>t,error:t=>t,code:t=>t}});function ya(t){return{...t,[K2]:!0}}function Gf(t,e){return typeof t>\"u\"?[t,e]:typeof t==\"object\"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function Qx(t,{mergeName:e=!1}={}){let r=t.match(/^([^:]+): (.*)$/m);if(!r)return\"validation failed\";let[,s,a]=r;return e&&(a=a[0].toLowerCase()+a.slice(1)),a=s!==\".\"||!e?`${s.replace(/^\\.(\\[|$)/,\"$1\")}: ${a}`:`: ${a}`,a}function z2(t,e){return e.length===1?new nt(`${t}${Qx(e[0],{mergeName:!0})}`):new nt(`${t}:\n${e.map(r=>`\n- ${Qx(r)}`).join(\"\")}`)}function Od(t,e,r){if(typeof r>\"u\")return e;let s=[],a=[],n=f=>{let p=e;return e=f,n.bind(null,p)};if(!r(e,{errors:s,coercions:a,coercion:n}))throw z2(`Invalid value for ${t}`,s);for(let[,f]of a)f();return e}var K2,Cp=Xe(()=>{kx();K2=Symbol(\"clipanion/isOption\")});var Ea={};Vt(Ea,{KeyRelationship:()=>qf,TypeAssertionError:()=>o0,applyCascade:()=>$2,as:()=>WWe,assert:()=>jWe,assertWithErrors:()=>GWe,cascade:()=>Nx,fn:()=>YWe,hasAtLeastOneKey:()=>y_,hasExactLength:()=>Ore,hasForbiddenKeys:()=>fYe,hasKeyRelationship:()=>tB,hasMaxLength:()=>JWe,hasMinLength:()=>VWe,hasMutuallyExclusiveKeys:()=>AYe,hasRequiredKeys:()=>uYe,hasUniqueItems:()=>KWe,isArray:()=>Tx,isAtLeast:()=>d_,isAtMost:()=>ZWe,isBase64:()=>oYe,isBoolean:()=>FWe,isDate:()=>OWe,isDict:()=>UWe,isEnum:()=>fo,isHexColor:()=>sYe,isISO8601:()=>iYe,isInExclusiveRange:()=>eYe,isInInclusiveRange:()=>$We,isInstanceOf:()=>HWe,isInteger:()=>m_,isJSON:()=>aYe,isLiteral:()=>Rre,isLowerCase:()=>tYe,isMap:()=>MWe,isNegative:()=>zWe,isNullable:()=>cYe,isNumber:()=>h_,isObject:()=>Fre,isOneOf:()=>g_,isOptional:()=>lYe,isPartial:()=>_We,isPayload:()=>NWe,isPositive:()=>XWe,isRecord:()=>Fx,isSet:()=>LWe,isString:()=>wE,isTuple:()=>Rx,isUUID4:()=>nYe,isUnknown:()=>p_,isUpperCase:()=>rYe,makeTrait:()=>Nre,makeValidator:()=>Wr,matchesRegExp:()=>Z2,softAssert:()=>qWe});function ti(t){return t===null?\"null\":t===void 0?\"undefined\":t===\"\"?\"an empty string\":typeof t==\"symbol\"?`<${t.toString()}>`:Array.isArray(t)?\"an array\":JSON.stringify(t)}function CE(t,e){if(t.length===0)return\"nothing\";if(t.length===1)return ti(t[0]);let r=t.slice(0,-1),s=t[t.length-1],a=t.length>2?`, ${e} `:` ${e} `;return`${r.map(n=>ti(n)).join(\", \")}${a}${ti(s)}`}function s0(t,e){var r,s,a;return typeof e==\"number\"?`${(r=t?.p)!==null&&r!==void 0?r:\".\"}[${e}]`:bWe.test(e)?`${(s=t?.p)!==null&&s!==void 0?s:\"\"}.${e}`:`${(a=t?.p)!==null&&a!==void 0?a:\".\"}[${JSON.stringify(e)}]`}function A_(t,e,r){return t===1?e:r}function mr({errors:t,p:e}={},r){return t?.push(`${e??\".\"}: ${r}`),!1}function TWe(t,e){return r=>{t[e]=r}}function Wf(t,e){return r=>{let s=t[e];return t[e]=r,Wf(t,e).bind(null,s)}}function X2(t,e,r){let s=()=>(t(r()),a),a=()=>(t(e),s);return s}function p_(){return Wr({test:(t,e)=>!0})}function Rre(t){return Wr({test:(e,r)=>e!==t?mr(r,`Expected ${ti(t)} (got ${ti(e)})`):!0})}function wE(){return Wr({test:(t,e)=>typeof t!=\"string\"?mr(e,`Expected a string (got ${ti(t)})`):!0})}function fo(t){let e=Array.isArray(t)?t:Object.values(t),r=e.every(a=>typeof a==\"string\"||typeof a==\"number\"),s=new Set(e);return s.size===1?Rre([...s][0]):Wr({test:(a,n)=>s.has(a)?!0:r?mr(n,`Expected one of ${CE(e,\"or\")} (got ${ti(a)})`):mr(n,`Expected a valid enumeration value (got ${ti(a)})`)})}function FWe(){return Wr({test:(t,e)=>{var r;if(typeof t!=\"boolean\"){if(typeof e?.coercions<\"u\"){if(typeof e?.coercion>\"u\")return mr(e,\"Unbound coercion result\");let s=RWe.get(t);if(typeof s<\"u\")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:\".\",e.coercion.bind(null,s)]),!0}return mr(e,`Expected a boolean (got ${ti(t)})`)}return!0}})}function h_(){return Wr({test:(t,e)=>{var r;if(typeof t!=\"number\"){if(typeof e?.coercions<\"u\"){if(typeof e?.coercion>\"u\")return mr(e,\"Unbound coercion result\");let s;if(typeof t==\"string\"){let a;try{a=JSON.parse(t)}catch{}if(typeof a==\"number\")if(JSON.stringify(a)===t)s=a;else return mr(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof s<\"u\")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:\".\",e.coercion.bind(null,s)]),!0}return mr(e,`Expected a number (got ${ti(t)})`)}return!0}})}function NWe(t){return Wr({test:(e,r)=>{var s;if(typeof r?.coercions>\"u\")return mr(r,\"The isPayload predicate can only be used with coercion enabled\");if(typeof r.coercion>\"u\")return mr(r,\"Unbound coercion result\");if(typeof e!=\"string\")return mr(r,`Expected a string (got ${ti(e)})`);let a;try{a=JSON.parse(e)}catch{return mr(r,`Expected a JSON string (got ${ti(e)})`)}let n={value:a};return t(a,Object.assign(Object.assign({},r),{coercion:Wf(n,\"value\")}))?(r.coercions.push([(s=r.p)!==null&&s!==void 0?s:\".\",r.coercion.bind(null,n.value)]),!0):!1}})}function OWe(){return Wr({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof e?.coercions<\"u\"){if(typeof e?.coercion>\"u\")return mr(e,\"Unbound coercion result\");let s;if(typeof t==\"string\"&&Tre.test(t))s=new Date(t);else{let a;if(typeof t==\"string\"){let n;try{n=JSON.parse(t)}catch{}typeof n==\"number\"&&(a=n)}else typeof t==\"number\"&&(a=t);if(typeof a<\"u\")if(Number.isSafeInteger(a)||!Number.isSafeInteger(a*1e3))s=new Date(a*1e3);else return mr(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof s<\"u\")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:\".\",e.coercion.bind(null,s)]),!0}return mr(e,`Expected a date (got ${ti(t)})`)}return!0}})}function Tx(t,{delimiter:e}={}){return Wr({test:(r,s)=>{var a;let n=r;if(typeof r==\"string\"&&typeof e<\"u\"&&typeof s?.coercions<\"u\"){if(typeof s?.coercion>\"u\")return mr(s,\"Unbound coercion result\");r=r.split(e)}if(!Array.isArray(r))return mr(s,`Expected an array (got ${ti(r)})`);let c=!0;for(let f=0,p=r.length;f<p&&(c=t(r[f],Object.assign(Object.assign({},s),{p:s0(s,f),coercion:Wf(r,f)}))&&c,!(!c&&s?.errors==null));++f);return r!==n&&s.coercions.push([(a=s.p)!==null&&a!==void 0?a:\".\",s.coercion.bind(null,r)]),c}})}function LWe(t,{delimiter:e}={}){let r=Tx(t,{delimiter:e});return Wr({test:(s,a)=>{var n,c;if(Object.getPrototypeOf(s).toString()===\"[object Set]\")if(typeof a?.coercions<\"u\"){if(typeof a?.coercion>\"u\")return mr(a,\"Unbound coercion result\");let f=[...s],p=[...s];if(!r(p,Object.assign(Object.assign({},a),{coercion:void 0})))return!1;let h=()=>p.some((E,C)=>E!==f[C])?new Set(p):s;return a.coercions.push([(n=a.p)!==null&&n!==void 0?n:\".\",X2(a.coercion,s,h)]),!0}else{let f=!0;for(let p of s)if(f=t(p,Object.assign({},a))&&f,!f&&a?.errors==null)break;return f}if(typeof a?.coercions<\"u\"){if(typeof a?.coercion>\"u\")return mr(a,\"Unbound coercion result\");let f={value:s};return r(s,Object.assign(Object.assign({},a),{coercion:Wf(f,\"value\")}))?(a.coercions.push([(c=a.p)!==null&&c!==void 0?c:\".\",X2(a.coercion,s,()=>new Set(f.value))]),!0):!1}return mr(a,`Expected a set (got ${ti(s)})`)}})}function MWe(t,e){let r=Tx(Rx([t,e])),s=Fx(e,{keys:t});return Wr({test:(a,n)=>{var c,f,p;if(Object.getPrototypeOf(a).toString()===\"[object Map]\")if(typeof n?.coercions<\"u\"){if(typeof n?.coercion>\"u\")return mr(n,\"Unbound coercion result\");let h=[...a],E=[...a];if(!r(E,Object.assign(Object.assign({},n),{coercion:void 0})))return!1;let C=()=>E.some((S,P)=>S[0]!==h[P][0]||S[1]!==h[P][1])?new Map(E):a;return n.coercions.push([(c=n.p)!==null&&c!==void 0?c:\".\",X2(n.coercion,a,C)]),!0}else{let h=!0;for(let[E,C]of a)if(h=t(E,Object.assign({},n))&&h,!h&&n?.errors==null||(h=e(C,Object.assign(Object.assign({},n),{p:s0(n,E)}))&&h,!h&&n?.errors==null))break;return h}if(typeof n?.coercions<\"u\"){if(typeof n?.coercion>\"u\")return mr(n,\"Unbound coercion result\");let h={value:a};return Array.isArray(a)?r(a,Object.assign(Object.assign({},n),{coercion:void 0}))?(n.coercions.push([(f=n.p)!==null&&f!==void 0?f:\".\",X2(n.coercion,a,()=>new Map(h.value))]),!0):!1:s(a,Object.assign(Object.assign({},n),{coercion:Wf(h,\"value\")}))?(n.coercions.push([(p=n.p)!==null&&p!==void 0?p:\".\",X2(n.coercion,a,()=>new Map(Object.entries(h.value)))]),!0):!1}return mr(n,`Expected a map (got ${ti(a)})`)}})}function Rx(t,{delimiter:e}={}){let r=Ore(t.length);return Wr({test:(s,a)=>{var n;if(typeof s==\"string\"&&typeof e<\"u\"&&typeof a?.coercions<\"u\"){if(typeof a?.coercion>\"u\")return mr(a,\"Unbound coercion result\");s=s.split(e),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:\".\",a.coercion.bind(null,s)])}if(!Array.isArray(s))return mr(a,`Expected a tuple (got ${ti(s)})`);let c=r(s,Object.assign({},a));for(let f=0,p=s.length;f<p&&f<t.length&&(c=t[f](s[f],Object.assign(Object.assign({},a),{p:s0(a,f),coercion:Wf(s,f)}))&&c,!(!c&&a?.errors==null));++f);return c}})}function Fx(t,{keys:e=null}={}){let r=Tx(Rx([e??wE(),t]));return Wr({test:(s,a)=>{var n;if(Array.isArray(s)&&typeof a?.coercions<\"u\")return typeof a?.coercion>\"u\"?mr(a,\"Unbound coercion result\"):r(s,Object.assign(Object.assign({},a),{coercion:void 0}))?(s=Object.fromEntries(s),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:\".\",a.coercion.bind(null,s)]),!0):!1;if(typeof s!=\"object\"||s===null)return mr(a,`Expected an object (got ${ti(s)})`);let c=Object.keys(s),f=!0;for(let p=0,h=c.length;p<h&&(f||a?.errors!=null);++p){let E=c[p],C=s[E];if(E===\"__proto__\"||E===\"constructor\"){f=mr(Object.assign(Object.assign({},a),{p:s0(a,E)}),\"Unsafe property name\");continue}if(e!==null&&!e(E,a)){f=!1;continue}if(!t(C,Object.assign(Object.assign({},a),{p:s0(a,E),coercion:Wf(s,E)}))){f=!1;continue}}return f}})}function UWe(t,e={}){return Fx(t,e)}function Fre(t,{extra:e=null}={}){let r=Object.keys(t),s=Wr({test:(a,n)=>{if(typeof a!=\"object\"||a===null)return mr(n,`Expected an object (got ${ti(a)})`);let c=new Set([...r,...Object.keys(a)]),f={},p=!0;for(let h of c){if(h===\"constructor\"||h===\"__proto__\")p=mr(Object.assign(Object.assign({},n),{p:s0(n,h)}),\"Unsafe property name\");else{let E=Object.prototype.hasOwnProperty.call(t,h)?t[h]:void 0,C=Object.prototype.hasOwnProperty.call(a,h)?a[h]:void 0;typeof E<\"u\"?p=E(C,Object.assign(Object.assign({},n),{p:s0(n,h),coercion:Wf(a,h)}))&&p:e===null?p=mr(Object.assign(Object.assign({},n),{p:s0(n,h)}),`Extraneous property (got ${ti(C)})`):Object.defineProperty(f,h,{enumerable:!0,get:()=>C,set:TWe(a,h)})}if(!p&&n?.errors==null)break}return e!==null&&(p||n?.errors!=null)&&(p=e(f,n)&&p),p}});return Object.assign(s,{properties:t})}function _We(t){return Fre(t,{extra:Fx(p_())})}function Nre(t){return()=>t}function Wr({test:t}){return Nre(t)()}function jWe(t,e){if(!e(t))throw new o0}function GWe(t,e){let r=[];if(!e(t,{errors:r}))throw new o0({errors:r})}function qWe(t,e){}function WWe(t,e,{coerce:r=!1,errors:s,throw:a}={}){let n=s?[]:void 0;if(!r){if(e(t,{errors:n}))return a?t:{value:t,errors:void 0};if(a)throw new o0({errors:n});return{value:void 0,errors:n??!0}}let c={value:t},f=Wf(c,\"value\"),p=[];if(!e(t,{errors:n,coercion:f,coercions:p})){if(a)throw new o0({errors:n});return{value:void 0,errors:n??!0}}for(let[,h]of p)h();return a?c.value:{value:c.value,errors:void 0}}function YWe(t,e){let r=Rx(t);return(...s)=>{if(!r(s))throw new o0;return e(...s)}}function VWe(t){return Wr({test:(e,r)=>e.length>=t?!0:mr(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)})}function JWe(t){return Wr({test:(e,r)=>e.length<=t?!0:mr(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)})}function Ore(t){return Wr({test:(e,r)=>e.length!==t?mr(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0})}function KWe({map:t}={}){return Wr({test:(e,r)=>{let s=new Set,a=new Set;for(let n=0,c=e.length;n<c;++n){let f=e[n],p=typeof t<\"u\"?t(f):f;if(s.has(p)){if(a.has(p))continue;mr(r,`Expected to contain unique elements; got a duplicate with ${ti(e)}`),a.add(p)}else s.add(p)}return a.size===0}})}function zWe(){return Wr({test:(t,e)=>t<=0?!0:mr(e,`Expected to be negative (got ${t})`)})}function XWe(){return Wr({test:(t,e)=>t>=0?!0:mr(e,`Expected to be positive (got ${t})`)})}function d_(t){return Wr({test:(e,r)=>e>=t?!0:mr(r,`Expected to be at least ${t} (got ${e})`)})}function ZWe(t){return Wr({test:(e,r)=>e<=t?!0:mr(r,`Expected to be at most ${t} (got ${e})`)})}function $We(t,e){return Wr({test:(r,s)=>r>=t&&r<=e?!0:mr(s,`Expected to be in the [${t}; ${e}] range (got ${r})`)})}function eYe(t,e){return Wr({test:(r,s)=>r>=t&&r<e?!0:mr(s,`Expected to be in the [${t}; ${e}[ range (got ${r})`)})}function m_({unsafe:t=!1}={}){return Wr({test:(e,r)=>e!==Math.round(e)?mr(r,`Expected to be an integer (got ${e})`):!t&&!Number.isSafeInteger(e)?mr(r,`Expected to be a safe integer (got ${e})`):!0})}function Z2(t){return Wr({test:(e,r)=>t.test(e)?!0:mr(r,`Expected to match the pattern ${t.toString()} (got ${ti(e)})`)})}function tYe(){return Wr({test:(t,e)=>t!==t.toLowerCase()?mr(e,`Expected to be all-lowercase (got ${t})`):!0})}function rYe(){return Wr({test:(t,e)=>t!==t.toUpperCase()?mr(e,`Expected to be all-uppercase (got ${t})`):!0})}function nYe(){return Wr({test:(t,e)=>QWe.test(t)?!0:mr(e,`Expected to be a valid UUID v4 (got ${ti(t)})`)})}function iYe(){return Wr({test:(t,e)=>Tre.test(t)?!0:mr(e,`Expected to be a valid ISO 8601 date string (got ${ti(t)})`)})}function sYe({alpha:t=!1}){return Wr({test:(e,r)=>(t?PWe.test(e):xWe.test(e))?!0:mr(r,`Expected to be a valid hexadecimal color string (got ${ti(e)})`)})}function oYe(){return Wr({test:(t,e)=>kWe.test(t)?!0:mr(e,`Expected to be a valid base 64 string (got ${ti(t)})`)})}function aYe(t=p_()){return Wr({test:(e,r)=>{let s;try{s=JSON.parse(e)}catch{return mr(r,`Expected to be a valid JSON string (got ${ti(e)})`)}return t(s,r)}})}function Nx(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Wr({test:(s,a)=>{var n,c;let f={value:s},p=typeof a?.coercions<\"u\"?Wf(f,\"value\"):void 0,h=typeof a?.coercions<\"u\"?[]:void 0;if(!t(s,Object.assign(Object.assign({},a),{coercion:p,coercions:h})))return!1;let E=[];if(typeof h<\"u\")for(let[,C]of h)E.push(C());try{if(typeof a?.coercions<\"u\"){if(f.value!==s){if(typeof a?.coercion>\"u\")return mr(a,\"Unbound coercion result\");a.coercions.push([(n=a.p)!==null&&n!==void 0?n:\".\",a.coercion.bind(null,f.value)])}(c=a?.coercions)===null||c===void 0||c.push(...h)}return r.every(C=>C(f.value,a))}finally{for(let C of E)C()}}})}function $2(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Nx(t,r)}function lYe(t){return Wr({test:(e,r)=>typeof e>\"u\"?!0:t(e,r)})}function cYe(t){return Wr({test:(e,r)=>e===null?!0:t(e,r)})}function uYe(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!==void 0?r:\"missing\"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)||p.push(h);return p.length>0?mr(c,`Missing required ${A_(p.length,\"property\",\"properties\")} ${CE(p,\"and\")}`):!0}})}function y_(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!==void 0?r:\"missing\"];return Wr({test:(n,c)=>Object.keys(n).some(h=>a(s,h,n))?!0:mr(c,`Missing at least one property from ${CE(Array.from(s),\"or\")}`)})}function fYe(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!==void 0?r:\"missing\"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)&&p.push(h);return p.length>0?mr(c,`Forbidden ${A_(p.length,\"property\",\"properties\")} ${CE(p,\"and\")}`):!0}})}function AYe(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!==void 0?r:\"missing\"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)&&p.push(h);return p.length>1?mr(c,`Mutually exclusive properties ${CE(p,\"and\")}`):!0}})}function tB(t,e,r,s){var a,n;let c=new Set((a=s?.ignore)!==null&&a!==void 0?a:[]),f=eB[(n=s?.missingIf)!==null&&n!==void 0?n:\"missing\"],p=new Set(r),h=pYe[e],E=e===qf.Forbids?\"or\":\"and\";return Wr({test:(C,S)=>{let P=new Set(Object.keys(C));if(!f(P,t,C)||c.has(C[t]))return!0;let I=[];for(let R of p)(f(P,R,C)&&!c.has(C[R]))!==h.expect&&I.push(R);return I.length>=1?mr(S,`Property \"${t}\" ${h.message} ${A_(I.length,\"property\",\"properties\")} ${CE(I,E)}`):!0}})}var bWe,PWe,xWe,kWe,QWe,Tre,RWe,HWe,g_,o0,eB,qf,pYe,Ul=Xe(()=>{bWe=/^[a-zA-Z_][a-zA-Z0-9_]*$/;PWe=/^#[0-9a-f]{6}$/i,xWe=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,kWe=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,QWe=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,Tre=/^(?:[1-9]\\d{3}(-?)(?:(?:0[1-9]|1[0-2])\\1(?:0[1-9]|1\\d|2[0-8])|(?:0[13-9]|1[0-2])\\1(?:29|30)|(?:0[13578]|1[02])(?:\\1)31|00[1-9]|0[1-9]\\d|[12]\\d{2}|3(?:[0-5]\\d|6[0-5]))|(?:[1-9]\\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\\2)29|-?366))T(?:[01]\\d|2[0-3])(:?)[0-5]\\d(?:\\3[0-5]\\d)?(?:Z|[+-][01]\\d(?:\\3[0-5]\\d)?)$/;RWe=new Map([[\"true\",!0],[\"True\",!0],[\"1\",!0],[1,!0],[\"false\",!1],[\"False\",!1],[\"0\",!1],[0,!1]]);HWe=t=>Wr({test:(e,r)=>e instanceof t?!0:mr(r,`Expected an instance of ${t.name} (got ${ti(e)})`)}),g_=(t,{exclusive:e=!1}={})=>Wr({test:(r,s)=>{var a,n,c;let f=[],p=typeof s?.errors<\"u\"?[]:void 0;for(let h=0,E=t.length;h<E;++h){let C=typeof s?.errors<\"u\"?[]:void 0,S=typeof s?.coercions<\"u\"?[]:void 0;if(t[h](r,Object.assign(Object.assign({},s),{errors:C,coercions:S,p:`${(a=s?.p)!==null&&a!==void 0?a:\".\"}#${h+1}`}))){if(f.push([`#${h+1}`,S]),!e)break}else p?.push(C[0])}if(f.length===1){let[,h]=f[0];return typeof h<\"u\"&&((n=s?.coercions)===null||n===void 0||n.push(...h)),!0}return f.length>1?mr(s,`Expected to match exactly a single predicate (matched ${f.join(\", \")})`):(c=s?.errors)===null||c===void 0||c.push(...p),!1}});o0=class extends Error{constructor({errors:e}={}){let r=\"Type mismatch\";if(e&&e.length>0){r+=`\n`;for(let s of e)r+=`\n- ${s}`}super(r)}};eB={missing:(t,e)=>t.has(e),undefined:(t,e,r)=>t.has(e)&&typeof r[e]<\"u\",nil:(t,e,r)=>t.has(e)&&r[e]!=null,falsy:(t,e,r)=>t.has(e)&&!!r[e]};(function(t){t.Forbids=\"Forbids\",t.Requires=\"Requires\"})(qf||(qf={}));pYe={[qf.Forbids]:{expect:!1,message:\"forbids using\"},[qf.Requires]:{expect:!0,message:\"requires using\"}}});var ot,a0=Xe(()=>{Cp();ot=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(Array.isArray(r)){let{isDict:a,isUnknown:n,applyCascade:c}=await Promise.resolve().then(()=>(Ul(),Ea)),f=c(a(n()),r),p=[],h=[];if(!f(this,{errors:p,coercions:h}))throw z2(\"Invalid option schema\",p);for(let[,C]of h)C()}else if(r!=null)throw new Error(\"Invalid command schema\");let s=await this.execute();return typeof s<\"u\"?s:0}};ot.isOption=K2;ot.Default=[]});function il(t){l_&&console.log(t)}function Mre(){let t={nodes:[]};for(let e=0;e<En.CustomNode;++e)t.nodes.push(_l());return t}function hYe(t){let e=Mre(),r=[],s=e.nodes.length;for(let a of t){r.push(s);for(let n=0;n<a.nodes.length;++n)_re(n)||e.nodes.push(wYe(a.nodes[n],s));s+=a.nodes.length-En.CustomNode+1}for(let a of r)BE(e,En.InitialNode,a);return e}function Ou(t,e){return t.nodes.push(e),t.nodes.length-1}function gYe(t){let e=new Set,r=s=>{if(e.has(s))return;e.add(s);let a=t.nodes[s];for(let c of Object.values(a.statics))for(let{to:f}of c)r(f);for(let[,{to:c}]of a.dynamics)r(c);for(let{to:c}of a.shortcuts)r(c);let n=new Set(a.shortcuts.map(({to:c})=>c));for(;a.shortcuts.length>0;){let{to:c}=a.shortcuts.shift(),f=t.nodes[c];for(let[p,h]of Object.entries(f.statics)){let E=Object.prototype.hasOwnProperty.call(a.statics,p)?a.statics[p]:a.statics[p]=[];for(let C of h)E.some(({to:S})=>C.to===S)||E.push(C)}for(let[p,h]of f.dynamics)a.dynamics.some(([E,{to:C}])=>p===E&&h.to===C)||a.dynamics.push([p,h]);for(let p of f.shortcuts)n.has(p.to)||(a.shortcuts.push(p),n.add(p.to))}};r(En.InitialNode)}function dYe(t,{prefix:e=\"\"}={}){if(l_){il(`${e}Nodes are:`);for(let r=0;r<t.nodes.length;++r)il(`${e}  ${r}: ${JSON.stringify(t.nodes[r])}`)}}function mYe(t,e,r=!1){il(`Running a vm on ${JSON.stringify(e)}`);let s=[{node:En.InitialNode,state:{candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,options:[],path:[],positionals:[],remainder:null,selectedIndex:null,partial:!1,tokens:[]}}];dYe(t,{prefix:\"  \"});let a=[ei.StartOfInput,...e];for(let n=0;n<a.length;++n){let c=a[n],f=c===ei.EndOfInput||c===ei.EndOfPartialInput,p=n-1;il(`  Processing ${JSON.stringify(c)}`);let h=[];for(let{node:E,state:C}of s){il(`    Current node is ${E}`);let S=t.nodes[E];if(E===En.ErrorNode){h.push({node:E,state:C});continue}console.assert(S.shortcuts.length===0,\"Shortcuts should have been eliminated by now\");let P=Object.prototype.hasOwnProperty.call(S.statics,c);if(!r||n<a.length-1||P)if(P){let I=S.statics[c];for(let{to:R,reducer:N}of I)h.push({node:R,state:typeof N<\"u\"?Ox(I_,N,C,c,p):C}),il(`      Static transition to ${R} found`)}else il(\"      No static transition found\");else{let I=!1;for(let R of Object.keys(S.statics))if(R.startsWith(c)){if(c===R)for(let{to:N,reducer:U}of S.statics[R])h.push({node:N,state:typeof U<\"u\"?Ox(I_,U,C,c,p):C}),il(`      Static transition to ${N} found`);else for(let{to:N}of S.statics[R])h.push({node:N,state:{...C,remainder:R.slice(c.length)}}),il(`      Static transition to ${N} found (partial match)`);I=!0}I||il(\"      No partial static transition found\")}if(!f)for(let[I,{to:R,reducer:N}]of S.dynamics)Ox(BYe,I,C,c,p)&&(h.push({node:R,state:typeof N<\"u\"?Ox(I_,N,C,c,p):C}),il(`      Dynamic transition to ${R} found (via ${I})`))}if(h.length===0&&f&&e.length===1)return[{node:En.InitialNode,state:Lre}];if(h.length===0)throw new IE(e,s.filter(({node:E})=>E!==En.ErrorNode).map(({state:E})=>({usage:E.candidateUsage,reason:null})));if(h.every(({node:E})=>E===En.ErrorNode))throw new IE(e,h.map(({state:E})=>({usage:E.candidateUsage,reason:E.errorMessage})));s=EYe(h)}if(s.length>0){il(\"  Results:\");for(let n of s)il(`    - ${n.node} -> ${JSON.stringify(n.state)}`)}else il(\"  No results\");return s}function yYe(t,e,{endToken:r=ei.EndOfInput}={}){let s=mYe(t,[...e,r]);return IYe(e,s.map(({state:a})=>a))}function EYe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function IYe(t,e){let r=e.filter(S=>S.selectedIndex!==null),s=r.filter(S=>!S.partial);if(s.length>0&&(r=s),r.length===0)throw new Error;let a=r.filter(S=>S.selectedIndex===Nd||S.requiredOptions.every(P=>P.some(I=>S.options.find(R=>R.name===I))));if(a.length===0)throw new IE(t,r.map(S=>({usage:S.candidateUsage,reason:null})));let n=0;for(let S of a)S.path.length>n&&(n=S.path.length);let c=a.filter(S=>S.path.length===n),f=S=>S.positionals.filter(({extra:P})=>!P).length+S.options.length,p=c.map(S=>({state:S,positionalCount:f(S)})),h=0;for(let{positionalCount:S}of p)S>h&&(h=S);let E=p.filter(({positionalCount:S})=>S===h).map(({state:S})=>S),C=CYe(E);if(C.length>1)throw new xx(t,C.map(S=>S.candidateUsage));return C[0]}function CYe(t){let e=[],r=[];for(let s of t)s.selectedIndex===Nd?r.push(s):e.push(s);return r.length>0&&e.push({...Lre,path:Ure(...r.map(s=>s.path)),options:r.reduce((s,a)=>s.concat(a.options),[])}),e}function Ure(t,e,...r){return e===void 0?Array.from(t):Ure(t.filter((s,a)=>s===e[a]),...r)}function _l(){return{dynamics:[],shortcuts:[],statics:{}}}function _re(t){return t===En.SuccessNode||t===En.ErrorNode}function E_(t,e=0){return{to:_re(t.to)?t.to:t.to>=En.CustomNode?t.to+e-En.CustomNode+1:t.to+e,reducer:t.reducer}}function wYe(t,e=0){let r=_l();for(let[s,a]of t.dynamics)r.dynamics.push([s,E_(a,e)]);for(let s of t.shortcuts)r.shortcuts.push(E_(s,e));for(let[s,a]of Object.entries(t.statics))r.statics[s]=a.map(n=>E_(n,e));return r}function Hs(t,e,r,s,a){t.nodes[e].dynamics.push([r,{to:s,reducer:a}])}function BE(t,e,r,s){t.nodes[e].shortcuts.push({to:r,reducer:s})}function Ia(t,e,r,s,a){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:s,reducer:a})}function Ox(t,e,r,s,a){if(Array.isArray(e)){let[n,...c]=e;return t[n](r,s,a,...c)}else return t[e](r,s,a)}var Lre,BYe,I_,Hl,C_,Lx,Mx=Xe(()=>{Px();kx();Lre={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:Nd,partial:!1,tokens:[]};BYe={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!==\"-\"&&e.startsWith(\"-\"),isNotOptionLike:(t,e)=>t.ignoreOptions||e===\"-\"||!e.startsWith(\"-\"),isOption:(t,e,r,s)=>!t.ignoreOptions&&e===s,isBatchOption:(t,e,r,s)=>!t.ignoreOptions&&xre.test(e)&&[...e.slice(1)].every(a=>s.has(`-${a}`)),isBoundOption:(t,e,r,s,a)=>{let n=e.match(a_);return!t.ignoreOptions&&!!n&&bx.test(n[1])&&s.has(n[1])&&a.filter(c=>c.nameSet.includes(n[1])).every(c=>c.allowBinding)},isNegatedOption:(t,e,r,s)=>!t.ignoreOptions&&e===`--no-${s.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&o_.test(e),isUnsupportedOption:(t,e,r,s)=>!t.ignoreOptions&&e.startsWith(\"-\")&&bx.test(e)&&!s.has(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith(\"-\")&&!bx.test(e)},I_={setCandidateState:(t,e,r,s)=>({...t,...s}),setSelectedIndex:(t,e,r,s)=>({...t,selectedIndex:s}),setPartialIndex:(t,e,r,s)=>({...t,selectedIndex:s,partial:!0}),pushBatch:(t,e,r,s)=>{let a=t.options.slice(),n=t.tokens.slice();for(let c=1;c<e.length;++c){let f=s.get(`-${e[c]}`),p=c===1?[0,2]:[c,c+1];a.push({name:f,value:!0}),n.push({segmentIndex:r,type:\"option\",option:f,slice:p})}return{...t,options:a,tokens:n}},pushBound:(t,e,r)=>{let[,s,a]=e.match(a_),n=t.options.concat({name:s,value:a}),c=t.tokens.concat([{segmentIndex:r,type:\"option\",slice:[0,s.length],option:s},{segmentIndex:r,type:\"assign\",slice:[s.length,s.length+1]},{segmentIndex:r,type:\"value\",slice:[s.length+1,s.length+a.length+1]}]);return{...t,options:n,tokens:c}},pushPath:(t,e,r)=>{let s=t.path.concat(e),a=t.tokens.concat({segmentIndex:r,type:\"path\"});return{...t,path:s,tokens:a}},pushPositional:(t,e,r)=>{let s=t.positionals.concat({value:e,extra:!1}),a=t.tokens.concat({segmentIndex:r,type:\"positional\"});return{...t,positionals:s,tokens:a}},pushExtra:(t,e,r)=>{let s=t.positionals.concat({value:e,extra:!0}),a=t.tokens.concat({segmentIndex:r,type:\"positional\"});return{...t,positionals:s,tokens:a}},pushExtraNoLimits:(t,e,r)=>{let s=t.positionals.concat({value:e,extra:Hl}),a=t.tokens.concat({segmentIndex:r,type:\"positional\"});return{...t,positionals:s,tokens:a}},pushTrue:(t,e,r,s)=>{let a=t.options.concat({name:s,value:!0}),n=t.tokens.concat({segmentIndex:r,type:\"option\",option:s});return{...t,options:a,tokens:n}},pushFalse:(t,e,r,s)=>{let a=t.options.concat({name:s,value:!1}),n=t.tokens.concat({segmentIndex:r,type:\"option\",option:s});return{...t,options:a,tokens:n}},pushUndefined:(t,e,r,s)=>{let a=t.options.concat({name:e,value:void 0}),n=t.tokens.concat({segmentIndex:r,type:\"option\",option:e});return{...t,options:a,tokens:n}},pushStringValue:(t,e,r)=>{var s;let a=t.options[t.options.length-1],n=t.options.slice(),c=t.tokens.concat({segmentIndex:r,type:\"value\"});return a.value=((s=a.value)!==null&&s!==void 0?s:[]).concat([e]),{...t,options:n,tokens:c}},setStringValue:(t,e,r)=>{let s=t.options[t.options.length-1],a=t.options.slice(),n=t.tokens.concat({segmentIndex:r,type:\"value\"});return s.value=e,{...t,options:a,tokens:n}},inhibateOptions:t=>({...t,ignoreOptions:!0}),useHelp:(t,e,r,s)=>{let[,,a]=e.match(o_);return typeof a<\"u\"?{...t,options:[{name:\"-c\",value:String(s)},{name:\"-i\",value:a}]}:{...t,options:[{name:\"-c\",value:String(s)}]}},setError:(t,e,r,s)=>e===ei.EndOfInput||e===ei.EndOfPartialInput?{...t,errorMessage:`${s}.`}:{...t,errorMessage:`${s} (\"${e}\").`},setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return{...t,errorMessage:`Not enough arguments to option ${r.name}.`}}},Hl=Symbol(),C_=class{constructor(e,r){this.allOptionNames=new Map,this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:s=this.arity.extra,proxy:a=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:s,proxy:a})}addPositional({name:e=\"arg\",required:r=!0}={}){if(!r&&this.arity.extra===Hl)throw new Error(\"Optional parameters cannot be declared when using .rest() or .proxy()\");if(!r&&this.arity.trailing.length>0)throw new Error(\"Optional parameters cannot be declared after the required trailing positional arguments\");!r&&this.arity.extra!==Hl?this.arity.extra.push(e):this.arity.extra!==Hl&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e=\"arg\",required:r=0}={}){if(this.arity.extra===Hl)throw new Error(\"Infinite lists cannot be declared multiple times in the same command\");if(this.arity.trailing.length>0)throw new Error(\"Infinite lists cannot be declared after the required trailing positional arguments\");for(let s=0;s<r;++s)this.addPositional({name:e});this.arity.extra=Hl}addProxy({required:e=0}={}){this.addRest({required:e}),this.arity.proxy=!0}addOption({names:e,description:r,arity:s=0,hidden:a=!1,required:n=!1,allowBinding:c=!0}){if(!c&&s>1)throw new Error(\"The arity cannot be higher than 1 when the option only supports the --arg=value syntax\");if(!Number.isInteger(s))throw new Error(`The arity must be an integer, got ${s}`);if(s<0)throw new Error(`The arity must be positive, got ${s}`);let f=e.reduce((p,h)=>h.length>p.length?h:p,\"\");for(let p of e)this.allOptionNames.set(p,f);this.options.push({preferredName:f,nameSet:e,description:r,arity:s,hidden:a,required:n,allowBinding:c})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let s=[this.cliOpts.binaryName],a=[];if(this.paths.length>0&&s.push(...this.paths[0]),e){for(let{preferredName:c,nameSet:f,arity:p,hidden:h,description:E,required:C}of this.options){if(h)continue;let S=[];for(let I=0;I<p;++I)S.push(` #${I}`);let P=`${f.join(\",\")}${S.join(\"\")}`;!r&&E?a.push({preferredName:c,nameSet:f,definition:P,description:E,required:C}):s.push(C?`<${P}>`:`[${P}]`)}s.push(...this.arity.leading.map(c=>`<${c}>`)),this.arity.extra===Hl?s.push(\"...\"):s.push(...this.arity.extra.map(c=>`[${c}]`)),s.push(...this.arity.trailing.map(c=>`<${c}>`))}return{usage:s.join(\" \"),options:a}}compile(){if(typeof this.context>\"u\")throw new Error(\"Assertion failed: No context attached\");let e=Mre(),r=En.InitialNode,s=this.usage().usage,a=this.options.filter(f=>f.required).map(f=>f.nameSet);r=Ou(e,_l()),Ia(e,En.InitialNode,ei.StartOfInput,r,[\"setCandidateState\",{candidateUsage:s,requiredOptions:a}]);let n=this.arity.proxy?\"always\":\"isNotOptionLike\",c=this.paths.length>0?this.paths:[[]];for(let f of c){let p=r;if(f.length>0){let S=Ou(e,_l());BE(e,p,S),this.registerOptions(e,S),p=S}for(let S=0;S<f.length;++S){let P=Ou(e,_l());Ia(e,p,f[S],P,\"pushPath\"),p=P}if(this.arity.leading.length>0||!this.arity.proxy){let S=Ou(e,_l());Hs(e,p,\"isHelp\",S,[\"useHelp\",this.cliIndex]),Hs(e,S,\"always\",S,\"pushExtra\"),Ia(e,S,ei.EndOfInput,En.SuccessNode,[\"setSelectedIndex\",Nd]),this.registerOptions(e,p)}this.arity.leading.length>0&&(Ia(e,p,ei.EndOfInput,En.ErrorNode,[\"setError\",\"Not enough positional arguments\"]),Ia(e,p,ei.EndOfPartialInput,En.SuccessNode,[\"setPartialIndex\",this.cliIndex]));let h=p;for(let S=0;S<this.arity.leading.length;++S){let P=Ou(e,_l());(!this.arity.proxy||S+1!==this.arity.leading.length)&&this.registerOptions(e,P),(this.arity.trailing.length>0||S+1!==this.arity.leading.length)&&(Ia(e,P,ei.EndOfInput,En.ErrorNode,[\"setError\",\"Not enough positional arguments\"]),Ia(e,P,ei.EndOfPartialInput,En.SuccessNode,[\"setPartialIndex\",this.cliIndex])),Hs(e,h,\"isNotOptionLike\",P,\"pushPositional\"),h=P}let E=h;if(this.arity.extra===Hl||this.arity.extra.length>0){let S=Ou(e,_l());if(BE(e,h,S),this.arity.extra===Hl){let P=Ou(e,_l());this.arity.proxy||this.registerOptions(e,P),Hs(e,h,n,P,\"pushExtraNoLimits\"),Hs(e,P,n,P,\"pushExtraNoLimits\"),BE(e,P,S)}else for(let P=0;P<this.arity.extra.length;++P){let I=Ou(e,_l());(!this.arity.proxy||P>0)&&this.registerOptions(e,I),Hs(e,E,n,I,\"pushExtra\"),BE(e,I,S),E=I}E=S}this.arity.trailing.length>0&&(Ia(e,E,ei.EndOfInput,En.ErrorNode,[\"setError\",\"Not enough positional arguments\"]),Ia(e,E,ei.EndOfPartialInput,En.SuccessNode,[\"setPartialIndex\",this.cliIndex]));let C=E;for(let S=0;S<this.arity.trailing.length;++S){let P=Ou(e,_l());this.arity.proxy||this.registerOptions(e,P),S+1<this.arity.trailing.length&&(Ia(e,P,ei.EndOfInput,En.ErrorNode,[\"setError\",\"Not enough positional arguments\"]),Ia(e,P,ei.EndOfPartialInput,En.SuccessNode,[\"setPartialIndex\",this.cliIndex])),Hs(e,C,\"isNotOptionLike\",P,\"pushPositional\"),C=P}Hs(e,C,n,En.ErrorNode,[\"setError\",\"Extraneous positional argument\"]),Ia(e,C,ei.EndOfInput,En.SuccessNode,[\"setSelectedIndex\",this.cliIndex]),Ia(e,C,ei.EndOfPartialInput,En.SuccessNode,[\"setSelectedIndex\",this.cliIndex])}return{machine:e,context:this.context}}registerOptions(e,r){Hs(e,r,[\"isOption\",\"--\"],r,\"inhibateOptions\"),Hs(e,r,[\"isBatchOption\",this.allOptionNames],r,[\"pushBatch\",this.allOptionNames]),Hs(e,r,[\"isBoundOption\",this.allOptionNames,this.options],r,\"pushBound\"),Hs(e,r,[\"isUnsupportedOption\",this.allOptionNames],En.ErrorNode,[\"setError\",\"Unsupported option name\"]),Hs(e,r,[\"isInvalidOption\"],En.ErrorNode,[\"setError\",\"Invalid option name\"]);for(let s of this.options)if(s.arity===0)for(let a of s.nameSet)Hs(e,r,[\"isOption\",a],r,[\"pushTrue\",s.preferredName]),a.startsWith(\"--\")&&!a.startsWith(\"--no-\")&&Hs(e,r,[\"isNegatedOption\",a],r,[\"pushFalse\",s.preferredName]);else{let a=Ou(e,_l());for(let n of s.nameSet)Hs(e,r,[\"isOption\",n],a,[\"pushUndefined\",s.preferredName]);for(let n=0;n<s.arity;++n){let c=Ou(e,_l());Ia(e,a,ei.EndOfInput,En.ErrorNode,\"setOptionArityError\"),Ia(e,a,ei.EndOfPartialInput,En.ErrorNode,\"setOptionArityError\"),Hs(e,a,\"isOptionLike\",En.ErrorNode,\"setOptionArityError\");let f=s.arity===1?\"setStringValue\":\"pushStringValue\";Hs(e,a,\"isNotOptionLike\",c,f),a=c}BE(e,a,r)}}},Lx=class t{constructor({binaryName:e=\"...\"}={}){this.builders=[],this.opts={binaryName:e}}static build(e,r={}){return new t(r).commands(e).compile()}getBuilderByIndex(e){if(!(e>=0&&e<this.builders.length))throw new Error(`Assertion failed: Out-of-bound command index (${e})`);return this.builders[e]}commands(e){for(let r of e)r(this.command());return this}command(){let e=new C_(this.builders.length,this.opts);return this.builders.push(e),e}compile(){let e=[],r=[];for(let a of this.builders){let{machine:n,context:c}=a.compile();e.push(n),r.push(c)}let s=hYe(e);return gYe(s),{machine:s,contexts:r,process:(a,{partial:n}={})=>{let c=n?ei.EndOfPartialInput:ei.EndOfInput;return yYe(s,a,{endToken:c})}}}}});function jre(){return Ux.default&&\"getColorDepth\"in Ux.default.WriteStream.prototype?Ux.default.WriteStream.prototype.getColorDepth():process.env.FORCE_COLOR===\"0\"?1:process.env.FORCE_COLOR===\"1\"||typeof process.stdout<\"u\"&&process.stdout.isTTY?8:1}function Gre(t){let e=Hre;if(typeof e>\"u\"){if(t.stdout===process.stdout&&t.stderr===process.stderr)return null;let{AsyncLocalStorage:r}=Ie(\"async_hooks\");e=Hre=new r;let s=process.stdout._write;process.stdout._write=function(n,c,f){let p=e.getStore();return typeof p>\"u\"?s.call(this,n,c,f):p.stdout.write(n,c,f)};let a=process.stderr._write;process.stderr._write=function(n,c,f){let p=e.getStore();return typeof p>\"u\"?a.call(this,n,c,f):p.stderr.write(n,c,f)}}return r=>e.run(t,r)}var Ux,Hre,qre=Xe(()=>{Ux=ut(Ie(\"tty\"),1)});var _x,Wre=Xe(()=>{a0();_x=class t extends ot{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,r){let s=new t(r);s.path=e.path;for(let a of e.options)switch(a.name){case\"-c\":s.commands.push(Number(a.value));break;case\"-i\":s.index=Number(a.value);break}return s}async execute(){let e=this.commands;if(typeof this.index<\"u\"&&this.index>=0&&this.index<e.length&&(e=[e[this.index]]),e.length===0)this.context.stdout.write(this.cli.usage());else if(e.length===1)this.context.stdout.write(this.cli.usage(this.contexts[e[0]].commandClass,{detailed:!0}));else if(e.length>1){this.context.stdout.write(`Multiple commands match your selection:\n`),this.context.stdout.write(`\n`);let r=0;for(let s of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[s].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(`\n`),this.context.stdout.write(`Run again with -h=<index> to see the longer details of any of those commands.\n`)}}}});async function Jre(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}=zre(t);return Ca.from(r,e).runExit(s,a)}async function Kre(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}=zre(t);return Ca.from(r,e).run(s,a)}function zre(t){let e,r,s,a;switch(typeof process<\"u\"&&typeof process.argv<\"u\"&&(s=process.argv.slice(2)),t.length){case 1:r=t[0];break;case 2:t[0]&&t[0].prototype instanceof ot||Array.isArray(t[0])?(r=t[0],Array.isArray(t[1])?s=t[1]:a=t[1]):(e=t[0],r=t[1]);break;case 3:Array.isArray(t[2])?(e=t[0],r=t[1],s=t[2]):t[0]&&t[0].prototype instanceof ot||Array.isArray(t[0])?(r=t[0],s=t[1],a=t[2]):(e=t[0],r=t[1],a=t[2]);break;default:e=t[0],r=t[1],s=t[2],a=t[3];break}if(typeof s>\"u\")throw new Error(\"The argv parameter must be provided when running Clipanion outside of a Node context\");return{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}}function Vre(t){return t()}var Yre,Ca,Xre=Xe(()=>{Px();Mx();f_();qre();a0();Wre();Yre=Symbol(\"clipanion/errorCommand\");Ca=class t{constructor({binaryLabel:e,binaryName:r=\"...\",binaryVersion:s,enableCapture:a=!1,enableColors:n}={}){this.registrations=new Map,this.builder=new Lx({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=s,this.enableCapture=a,this.enableColors=n}static from(e,r={}){let s=new t(r),a=Array.isArray(e)?e:[e];for(let n of a)s.register(n);return s}register(e){var r;let s=new Map,a=new e;for(let p in a){let h=a[p];typeof h==\"object\"&&h!==null&&h[ot.isOption]&&s.set(p,h)}let n=this.builder.command(),c=n.cliIndex,f=(r=e.paths)!==null&&r!==void 0?r:a.paths;if(typeof f<\"u\")for(let p of f)n.addPath(p);this.registrations.set(e,{specs:s,builder:n,index:c});for(let[p,{definition:h}]of s.entries())h(n,p);n.setContext({commandClass:e})}process(e,r){let{input:s,context:a,partial:n}=typeof e==\"object\"&&Array.isArray(e)?{input:e,context:r}:e,{contexts:c,process:f}=this.builder.compile(),p=f(s,{partial:n}),h={...t.defaultContext,...a};switch(p.selectedIndex){case Nd:{let E=_x.from(p,c);return E.context=h,E.tokens=p.tokens,E}default:{let{commandClass:E}=c[p.selectedIndex],C=this.registrations.get(E);if(typeof C>\"u\")throw new Error(\"Assertion failed: Expected the command class to have been registered.\");let S=new E;S.context=h,S.tokens=p.tokens,S.path=p.path;try{for(let[P,{transformer:I}]of C.specs.entries())S[P]=I(C.builder,P,p,h);return S}catch(P){throw P[Yre]=S,P}}break}}async run(e,r){var s,a;let n,c={...t.defaultContext,...r},f=(s=this.enableColors)!==null&&s!==void 0?s:c.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e,c)}catch(E){return c.stdout.write(this.error(E,{colored:f})),1}if(n.help)return c.stdout.write(this.usage(n,{colored:f,detailed:!0})),0;n.context=c,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),definition:E=>this.definition(E),error:(E,C)=>this.error(E,C),format:E=>this.format(E),process:(E,C)=>this.process(E,{...c,...C}),run:(E,C)=>this.run(E,{...c,...C}),usage:(E,C)=>this.usage(E,C)};let p=this.enableCapture&&(a=Gre(c))!==null&&a!==void 0?a:Vre,h;try{h=await p(()=>n.validateAndExecute().catch(E=>n.catch(E).then(()=>0)))}catch(E){return c.stdout.write(this.error(E,{colored:f,command:n})),1}return h}async runExit(e,r){process.exitCode=await this.run(e,r)}definition(e,{colored:r=!1}={}){if(!e.usage)return null;let{usage:s}=this.getUsageByRegistration(e,{detailed:!1}),{usage:a,options:n}=this.getUsageByRegistration(e,{detailed:!0,inlineOptions:!1}),c=typeof e.usage.category<\"u\"?Ho(e.usage.category,{format:this.format(r),paragraphs:!1}):void 0,f=typeof e.usage.description<\"u\"?Ho(e.usage.description,{format:this.format(r),paragraphs:!1}):void 0,p=typeof e.usage.details<\"u\"?Ho(e.usage.details,{format:this.format(r),paragraphs:!0}):void 0,h=typeof e.usage.examples<\"u\"?e.usage.examples.map(([E,C])=>[Ho(E,{format:this.format(r),paragraphs:!1}),C.replace(/\\$0/g,this.binaryName)]):void 0;return{path:s,usage:a,category:c,description:f,details:p,examples:h,options:n}}definitions({colored:e=!1}={}){let r=[];for(let s of this.registrations.keys()){let a=this.definition(s,{colored:e});a&&r.push(a)}return r}usage(e=null,{colored:r,detailed:s=!1,prefix:a=\"$ \"}={}){var n;if(e===null){for(let p of this.registrations.keys()){let h=p.paths,E=typeof p.usage<\"u\";if(!h||h.length===0||h.length===1&&h[0].length===0||((n=h?.some(P=>P.length===0))!==null&&n!==void 0?n:!1))if(e){e=null;break}else e=p;else if(E){e=null;continue}}e&&(s=!0)}let c=e!==null&&e instanceof ot?e.constructor:e,f=\"\";if(c)if(s){let{description:p=\"\",details:h=\"\",examples:E=[]}=c.usage||{};p!==\"\"&&(f+=Ho(p,{format:this.format(r),paragraphs:!1}).replace(/^./,P=>P.toUpperCase()),f+=`\n`),(h!==\"\"||E.length>0)&&(f+=`${this.format(r).header(\"Usage\")}\n`,f+=`\n`);let{usage:C,options:S}=this.getUsageByRegistration(c,{inlineOptions:!1});if(f+=`${this.format(r).bold(a)}${C}\n`,S.length>0){f+=`\n`,f+=`${this.format(r).header(\"Options\")}\n`;let P=S.reduce((I,R)=>Math.max(I,R.definition.length),0);f+=`\n`;for(let{definition:I,description:R}of S)f+=`  ${this.format(r).bold(I.padEnd(P))}    ${Ho(R,{format:this.format(r),paragraphs:!1})}`}if(h!==\"\"&&(f+=`\n`,f+=`${this.format(r).header(\"Details\")}\n`,f+=`\n`,f+=Ho(h,{format:this.format(r),paragraphs:!0})),E.length>0){f+=`\n`,f+=`${this.format(r).header(\"Examples\")}\n`;for(let[P,I]of E)f+=`\n`,f+=Ho(P,{format:this.format(r),paragraphs:!1}),f+=`${I.replace(/^/m,`  ${this.format(r).bold(a)}`).replace(/\\$0/g,this.binaryName)}\n`}}else{let{usage:p}=this.getUsageByRegistration(c);f+=`${this.format(r).bold(a)}${p}\n`}else{let p=new Map;for(let[S,{index:P}]of this.registrations.entries()){if(typeof S.usage>\"u\")continue;let I=typeof S.usage.category<\"u\"?Ho(S.usage.category,{format:this.format(r),paragraphs:!1}):null,R=p.get(I);typeof R>\"u\"&&p.set(I,R=[]);let{usage:N}=this.getUsageByIndex(P);R.push({commandClass:S,usage:N})}let h=Array.from(p.keys()).sort((S,P)=>S===null?-1:P===null?1:S.localeCompare(P,\"en\",{usage:\"sort\",caseFirst:\"upper\"})),E=typeof this.binaryLabel<\"u\",C=typeof this.binaryVersion<\"u\";E||C?(E&&C?f+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)}\n\n`:E?f+=`${this.format(r).header(`${this.binaryLabel}`)}\n`:f+=`${this.format(r).header(`${this.binaryVersion}`)}\n`,f+=`  ${this.format(r).bold(a)}${this.binaryName} <command>\n`):f+=`${this.format(r).bold(a)}${this.binaryName} <command>\n`;for(let S of h){let P=p.get(S).slice().sort((R,N)=>R.usage.localeCompare(N.usage,\"en\",{usage:\"sort\",caseFirst:\"upper\"})),I=S!==null?S.trim():\"General commands\";f+=`\n`,f+=`${this.format(r).header(`${I}`)}\n`;for(let{commandClass:R,usage:N}of P){let U=R.usage.description||\"undocumented\";f+=`\n`,f+=`  ${this.format(r).bold(N)}\n`,f+=`    ${Ho(U,{format:this.format(r),paragraphs:!1})}`}}f+=`\n`,f+=Ho(\"You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.\",{format:this.format(r),paragraphs:!0})}return f}error(e,r){var s,{colored:a,command:n=(s=e[Yre])!==null&&s!==void 0?s:null}=r===void 0?{}:r;(!e||typeof e!=\"object\"||!(\"stack\"in e))&&(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let c=\"\",f=e.name.replace(/([a-z])([A-Z])/g,\"$1 $2\");f===\"Error\"&&(f=\"Internal Error\"),c+=`${this.format(a).error(f)}: ${e.message}\n`;let p=e.clipanion;return typeof p<\"u\"?p.type===\"usage\"&&(c+=`\n`,c+=this.usage(n)):e.stack&&(c+=`${e.stack.replace(/^.*\\n/,\"\")}\n`),c}format(e){var r;return((r=e??this.enableColors)!==null&&r!==void 0?r:t.defaultContext.colorDepth>1)?kre:Qre}getUsageByRegistration(e,r){let s=this.registrations.get(e);if(typeof s>\"u\")throw new Error(\"Assertion failed: Unregistered command\");return this.getUsageByIndex(s.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}};Ca.defaultContext={env:process.env,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:jre()}});var rB,Zre=Xe(()=>{a0();rB=class extends ot{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)}\n`)}};rB.paths=[[\"--clipanion=definitions\"]]});var nB,$re=Xe(()=>{a0();nB=class extends ot{async execute(){this.context.stdout.write(this.cli.usage())}};nB.paths=[[\"-h\"],[\"--help\"]]});function Hx(t={}){return ya({definition(e,r){var s;e.addProxy({name:(s=t.name)!==null&&s!==void 0?s:r,required:t.required})},transformer(e,r,s){return s.positionals.map(({value:a})=>a)}})}var w_=Xe(()=>{Cp()});var iB,ene=Xe(()=>{a0();w_();iB=class extends ot{constructor(){super(...arguments),this.args=Hx()}async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.process(this.args).tokens,null,2)}\n`)}};iB.paths=[[\"--clipanion=tokens\"]]});var sB,tne=Xe(()=>{a0();sB=class extends ot{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:\"<unknown>\"}\n`)}};sB.paths=[[\"-v\"],[\"--version\"]]});var B_={};Vt(B_,{DefinitionsCommand:()=>rB,HelpCommand:()=>nB,TokensCommand:()=>iB,VersionCommand:()=>sB});var rne=Xe(()=>{Zre();$re();ene();tne()});function nne(t,e,r){let[s,a]=Gf(e,r??{}),{arity:n=1}=a,c=t.split(\",\"),f=new Set(c);return ya({definition(p){p.addOption({names:c,arity:n,hidden:a?.hidden,description:a?.description,required:a.required})},transformer(p,h,E){let C,S=typeof s<\"u\"?[...s]:void 0;for(let{name:P,value:I}of E.options)f.has(P)&&(C=P,S=S??[],S.push(I));return typeof S<\"u\"?Od(C??h,S,a.validator):S}})}var ine=Xe(()=>{Cp()});function sne(t,e,r){let[s,a]=Gf(e,r??{}),n=t.split(\",\"),c=new Set(n);return ya({definition(f){f.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(f,p,h){let E=s;for(let{name:C,value:S}of h.options)c.has(C)&&(E=S);return E}})}var one=Xe(()=>{Cp()});function ane(t,e,r){let[s,a]=Gf(e,r??{}),n=t.split(\",\"),c=new Set(n);return ya({definition(f){f.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(f,p,h){let E=s;for(let{name:C,value:S}of h.options)c.has(C)&&(E??(E=0),S?E+=1:E=0);return E}})}var lne=Xe(()=>{Cp()});function cne(t={}){return ya({definition(e,r){var s;e.addRest({name:(s=t.name)!==null&&s!==void 0?s:r,required:t.required})},transformer(e,r,s){let a=c=>{let f=s.positionals[c];return f.extra===Hl||f.extra===!1&&c<e.arity.leading.length},n=0;for(;n<s.positionals.length&&a(n);)n+=1;return s.positionals.splice(0,n).map(({value:c})=>c)}})}var une=Xe(()=>{Mx();Cp()});function vYe(t,e,r){let[s,a]=Gf(e,r??{}),{arity:n=1}=a,c=t.split(\",\"),f=new Set(c);return ya({definition(p){p.addOption({names:c,arity:a.tolerateBoolean?0:n,hidden:a.hidden,description:a.description,required:a.required})},transformer(p,h,E,C){let S,P=s;typeof a.env<\"u\"&&C.env[a.env]&&(S=a.env,P=C.env[a.env]);for(let{name:I,value:R}of E.options)f.has(I)&&(S=I,P=R);return typeof P==\"string\"?Od(S??h,P,a.validator):P}})}function SYe(t={}){let{required:e=!0}=t;return ya({definition(r,s){var a;r.addPositional({name:(a=t.name)!==null&&a!==void 0?a:s,required:t.required})},transformer(r,s,a){var n;for(let c=0;c<a.positionals.length;++c){if(a.positionals[c].extra===Hl||e&&a.positionals[c].extra===!0||!e&&a.positionals[c].extra===!1)continue;let[f]=a.positionals.splice(c,1);return Od((n=t.name)!==null&&n!==void 0?n:s,f.value,t.validator)}}})}function fne(t,...e){return typeof t==\"string\"?vYe(t,...e):SYe(t)}var Ane=Xe(()=>{Mx();Cp()});var ge={};Vt(ge,{Array:()=>nne,Boolean:()=>sne,Counter:()=>ane,Proxy:()=>Hx,Rest:()=>cne,String:()=>fne,applyValidator:()=>Od,cleanValidationError:()=>Qx,formatError:()=>z2,isOptionSymbol:()=>K2,makeCommandOption:()=>ya,rerouteArguments:()=>Gf});var pne=Xe(()=>{Cp();w_();ine();one();lne();une();Ane()});var oB={};Vt(oB,{Builtins:()=>B_,Cli:()=>Ca,Command:()=>ot,Option:()=>ge,UsageError:()=>nt,formatMarkdownish:()=>Ho,run:()=>Kre,runExit:()=>Jre});var Yt=Xe(()=>{kx();f_();a0();Xre();rne();pne()});var hne=_((VTt,DYe)=>{DYe.exports={name:\"dotenv\",version:\"16.3.1\",description:\"Loads environment variables from .env file\",main:\"lib/main.js\",types:\"lib/main.d.ts\",exports:{\".\":{types:\"./lib/main.d.ts\",require:\"./lib/main.js\",default:\"./lib/main.js\"},\"./config\":\"./config.js\",\"./config.js\":\"./config.js\",\"./lib/env-options\":\"./lib/env-options.js\",\"./lib/env-options.js\":\"./lib/env-options.js\",\"./lib/cli-options\":\"./lib/cli-options.js\",\"./lib/cli-options.js\":\"./lib/cli-options.js\",\"./package.json\":\"./package.json\"},scripts:{\"dts-check\":\"tsc --project tests/types/tsconfig.json\",lint:\"standard\",\"lint-readme\":\"standard-markdown\",pretest:\"npm run lint && npm run dts-check\",test:\"tap tests/*.js --100 -Rspec\",prerelease:\"npm test\",release:\"standard-version\"},repository:{type:\"git\",url:\"git://github.com/motdotla/dotenv.git\"},funding:\"https://github.com/motdotla/dotenv?sponsor=1\",keywords:[\"dotenv\",\"env\",\".env\",\"environment\",\"variables\",\"config\",\"settings\"],readmeFilename:\"README.md\",license:\"BSD-2-Clause\",devDependencies:{\"@definitelytyped/dtslint\":\"^0.0.133\",\"@types/node\":\"^18.11.3\",decache:\"^4.6.1\",sinon:\"^14.0.1\",standard:\"^17.0.0\",\"standard-markdown\":\"^7.1.0\",\"standard-version\":\"^9.5.0\",tap:\"^16.3.0\",tar:\"^6.1.11\",typescript:\"^4.8.4\"},engines:{node:\">=12\"},browser:{fs:!1}}});var yne=_((JTt,wp)=>{var gne=Ie(\"fs\"),S_=Ie(\"path\"),bYe=Ie(\"os\"),PYe=Ie(\"crypto\"),xYe=hne(),D_=xYe.version,kYe=/(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg;function QYe(t){let e={},r=t.toString();r=r.replace(/\\r\\n?/mg,`\n`);let s;for(;(s=kYe.exec(r))!=null;){let a=s[1],n=s[2]||\"\";n=n.trim();let c=n[0];n=n.replace(/^(['\"`])([\\s\\S]*)\\1$/mg,\"$2\"),c==='\"'&&(n=n.replace(/\\\\n/g,`\n`),n=n.replace(/\\\\r/g,\"\\r\")),e[a]=n}return e}function TYe(t){let e=mne(t),r=js.configDotenv({path:e});if(!r.parsed)throw new Error(`MISSING_DATA: Cannot parse ${e} for an unknown reason`);let s=dne(t).split(\",\"),a=s.length,n;for(let c=0;c<a;c++)try{let f=s[c].trim(),p=NYe(r,f);n=js.decrypt(p.ciphertext,p.key);break}catch(f){if(c+1>=a)throw f}return js.parse(n)}function RYe(t){console.log(`[dotenv@${D_}][INFO] ${t}`)}function FYe(t){console.log(`[dotenv@${D_}][WARN] ${t}`)}function v_(t){console.log(`[dotenv@${D_}][DEBUG] ${t}`)}function dne(t){return t&&t.DOTENV_KEY&&t.DOTENV_KEY.length>0?t.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:\"\"}function NYe(t,e){let r;try{r=new URL(e)}catch(f){throw f.code===\"ERR_INVALID_URL\"?new Error(\"INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenv.org/vault/.env.vault?environment=development\"):f}let s=r.password;if(!s)throw new Error(\"INVALID_DOTENV_KEY: Missing key part\");let a=r.searchParams.get(\"environment\");if(!a)throw new Error(\"INVALID_DOTENV_KEY: Missing environment part\");let n=`DOTENV_VAULT_${a.toUpperCase()}`,c=t.parsed[n];if(!c)throw new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${n} in your .env.vault file.`);return{ciphertext:c,key:s}}function mne(t){let e=S_.resolve(process.cwd(),\".env\");return t&&t.path&&t.path.length>0&&(e=t.path),e.endsWith(\".vault\")?e:`${e}.vault`}function OYe(t){return t[0]===\"~\"?S_.join(bYe.homedir(),t.slice(1)):t}function LYe(t){RYe(\"Loading env from encrypted .env.vault\");let e=js._parseVault(t),r=process.env;return t&&t.processEnv!=null&&(r=t.processEnv),js.populate(r,e,t),{parsed:e}}function MYe(t){let e=S_.resolve(process.cwd(),\".env\"),r=\"utf8\",s=!!(t&&t.debug);t&&(t.path!=null&&(e=OYe(t.path)),t.encoding!=null&&(r=t.encoding));try{let a=js.parse(gne.readFileSync(e,{encoding:r})),n=process.env;return t&&t.processEnv!=null&&(n=t.processEnv),js.populate(n,a,t),{parsed:a}}catch(a){return s&&v_(`Failed to load ${e} ${a.message}`),{error:a}}}function UYe(t){let e=mne(t);return dne(t).length===0?js.configDotenv(t):gne.existsSync(e)?js._configVault(t):(FYe(`You set DOTENV_KEY but you are missing a .env.vault file at ${e}. Did you forget to build it?`),js.configDotenv(t))}function _Ye(t,e){let r=Buffer.from(e.slice(-64),\"hex\"),s=Buffer.from(t,\"base64\"),a=s.slice(0,12),n=s.slice(-16);s=s.slice(12,-16);try{let c=PYe.createDecipheriv(\"aes-256-gcm\",r,a);return c.setAuthTag(n),`${c.update(s)}${c.final()}`}catch(c){let f=c instanceof RangeError,p=c.message===\"Invalid key length\",h=c.message===\"Unsupported state or unable to authenticate data\";if(f||p){let E=\"INVALID_DOTENV_KEY: It must be 64 characters long (or more)\";throw new Error(E)}else if(h){let E=\"DECRYPTION_FAILED: Please check your DOTENV_KEY\";throw new Error(E)}else throw console.error(\"Error: \",c.code),console.error(\"Error: \",c.message),c}}function HYe(t,e,r={}){let s=!!(r&&r.debug),a=!!(r&&r.override);if(typeof e!=\"object\")throw new Error(\"OBJECT_REQUIRED: Please check the processEnv argument being passed to populate\");for(let n of Object.keys(e))Object.prototype.hasOwnProperty.call(t,n)?(a===!0&&(t[n]=e[n]),s&&v_(a===!0?`\"${n}\" is already defined and WAS overwritten`:`\"${n}\" is already defined and was NOT overwritten`)):t[n]=e[n]}var js={configDotenv:MYe,_configVault:LYe,_parseVault:TYe,config:UYe,decrypt:_Ye,parse:QYe,populate:HYe};wp.exports.configDotenv=js.configDotenv;wp.exports._configVault=js._configVault;wp.exports._parseVault=js._parseVault;wp.exports.config=js.config;wp.exports.decrypt=js.decrypt;wp.exports.parse=js.parse;wp.exports.populate=js.populate;wp.exports=js});var Ine=_((KTt,Ene)=>{\"use strict\";Ene.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var Ld=_((zTt,b_)=>{\"use strict\";var jYe=Ine(),Cne=t=>{if(t<1)throw new TypeError(\"Expected `concurrency` to be a number from 1 and up\");let e=[],r=0,s=()=>{r--,e.length>0&&e.shift()()},a=(f,p,...h)=>{r++;let E=jYe(f,...h);p(E),E.then(s,s)},n=(f,p,...h)=>{r<t?a(f,p,...h):e.push(a.bind(null,f,p,...h))},c=(f,...p)=>new Promise(h=>n(f,h,...p));return Object.defineProperties(c,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),c};b_.exports=Cne;b_.exports.default=Cne});function Yf(t){return`YN${t.toString(10).padStart(4,\"0\")}`}function jx(t){let e=Number(t.slice(2));if(typeof Br[e]>\"u\")throw new Error(`Unknown message name: \"${t}\"`);return e}var Br,Gx=Xe(()=>{Br=(Me=>(Me[Me.UNNAMED=0]=\"UNNAMED\",Me[Me.EXCEPTION=1]=\"EXCEPTION\",Me[Me.MISSING_PEER_DEPENDENCY=2]=\"MISSING_PEER_DEPENDENCY\",Me[Me.CYCLIC_DEPENDENCIES=3]=\"CYCLIC_DEPENDENCIES\",Me[Me.DISABLED_BUILD_SCRIPTS=4]=\"DISABLED_BUILD_SCRIPTS\",Me[Me.BUILD_DISABLED=5]=\"BUILD_DISABLED\",Me[Me.SOFT_LINK_BUILD=6]=\"SOFT_LINK_BUILD\",Me[Me.MUST_BUILD=7]=\"MUST_BUILD\",Me[Me.MUST_REBUILD=8]=\"MUST_REBUILD\",Me[Me.BUILD_FAILED=9]=\"BUILD_FAILED\",Me[Me.RESOLVER_NOT_FOUND=10]=\"RESOLVER_NOT_FOUND\",Me[Me.FETCHER_NOT_FOUND=11]=\"FETCHER_NOT_FOUND\",Me[Me.LINKER_NOT_FOUND=12]=\"LINKER_NOT_FOUND\",Me[Me.FETCH_NOT_CACHED=13]=\"FETCH_NOT_CACHED\",Me[Me.YARN_IMPORT_FAILED=14]=\"YARN_IMPORT_FAILED\",Me[Me.REMOTE_INVALID=15]=\"REMOTE_INVALID\",Me[Me.REMOTE_NOT_FOUND=16]=\"REMOTE_NOT_FOUND\",Me[Me.RESOLUTION_PACK=17]=\"RESOLUTION_PACK\",Me[Me.CACHE_CHECKSUM_MISMATCH=18]=\"CACHE_CHECKSUM_MISMATCH\",Me[Me.UNUSED_CACHE_ENTRY=19]=\"UNUSED_CACHE_ENTRY\",Me[Me.MISSING_LOCKFILE_ENTRY=20]=\"MISSING_LOCKFILE_ENTRY\",Me[Me.WORKSPACE_NOT_FOUND=21]=\"WORKSPACE_NOT_FOUND\",Me[Me.TOO_MANY_MATCHING_WORKSPACES=22]=\"TOO_MANY_MATCHING_WORKSPACES\",Me[Me.CONSTRAINTS_MISSING_DEPENDENCY=23]=\"CONSTRAINTS_MISSING_DEPENDENCY\",Me[Me.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]=\"CONSTRAINTS_INCOMPATIBLE_DEPENDENCY\",Me[Me.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]=\"CONSTRAINTS_EXTRANEOUS_DEPENDENCY\",Me[Me.CONSTRAINTS_INVALID_DEPENDENCY=26]=\"CONSTRAINTS_INVALID_DEPENDENCY\",Me[Me.CANT_SUGGEST_RESOLUTIONS=27]=\"CANT_SUGGEST_RESOLUTIONS\",Me[Me.FROZEN_LOCKFILE_EXCEPTION=28]=\"FROZEN_LOCKFILE_EXCEPTION\",Me[Me.CROSS_DRIVE_VIRTUAL_LOCAL=29]=\"CROSS_DRIVE_VIRTUAL_LOCAL\",Me[Me.FETCH_FAILED=30]=\"FETCH_FAILED\",Me[Me.DANGEROUS_NODE_MODULES=31]=\"DANGEROUS_NODE_MODULES\",Me[Me.NODE_GYP_INJECTED=32]=\"NODE_GYP_INJECTED\",Me[Me.AUTHENTICATION_NOT_FOUND=33]=\"AUTHENTICATION_NOT_FOUND\",Me[Me.INVALID_CONFIGURATION_KEY=34]=\"INVALID_CONFIGURATION_KEY\",Me[Me.NETWORK_ERROR=35]=\"NETWORK_ERROR\",Me[Me.LIFECYCLE_SCRIPT=36]=\"LIFECYCLE_SCRIPT\",Me[Me.CONSTRAINTS_MISSING_FIELD=37]=\"CONSTRAINTS_MISSING_FIELD\",Me[Me.CONSTRAINTS_INCOMPATIBLE_FIELD=38]=\"CONSTRAINTS_INCOMPATIBLE_FIELD\",Me[Me.CONSTRAINTS_EXTRANEOUS_FIELD=39]=\"CONSTRAINTS_EXTRANEOUS_FIELD\",Me[Me.CONSTRAINTS_INVALID_FIELD=40]=\"CONSTRAINTS_INVALID_FIELD\",Me[Me.AUTHENTICATION_INVALID=41]=\"AUTHENTICATION_INVALID\",Me[Me.PROLOG_UNKNOWN_ERROR=42]=\"PROLOG_UNKNOWN_ERROR\",Me[Me.PROLOG_SYNTAX_ERROR=43]=\"PROLOG_SYNTAX_ERROR\",Me[Me.PROLOG_EXISTENCE_ERROR=44]=\"PROLOG_EXISTENCE_ERROR\",Me[Me.STACK_OVERFLOW_RESOLUTION=45]=\"STACK_OVERFLOW_RESOLUTION\",Me[Me.AUTOMERGE_FAILED_TO_PARSE=46]=\"AUTOMERGE_FAILED_TO_PARSE\",Me[Me.AUTOMERGE_IMMUTABLE=47]=\"AUTOMERGE_IMMUTABLE\",Me[Me.AUTOMERGE_SUCCESS=48]=\"AUTOMERGE_SUCCESS\",Me[Me.AUTOMERGE_REQUIRED=49]=\"AUTOMERGE_REQUIRED\",Me[Me.DEPRECATED_CLI_SETTINGS=50]=\"DEPRECATED_CLI_SETTINGS\",Me[Me.PLUGIN_NAME_NOT_FOUND=51]=\"PLUGIN_NAME_NOT_FOUND\",Me[Me.INVALID_PLUGIN_REFERENCE=52]=\"INVALID_PLUGIN_REFERENCE\",Me[Me.CONSTRAINTS_AMBIGUITY=53]=\"CONSTRAINTS_AMBIGUITY\",Me[Me.CACHE_OUTSIDE_PROJECT=54]=\"CACHE_OUTSIDE_PROJECT\",Me[Me.IMMUTABLE_INSTALL=55]=\"IMMUTABLE_INSTALL\",Me[Me.IMMUTABLE_CACHE=56]=\"IMMUTABLE_CACHE\",Me[Me.INVALID_MANIFEST=57]=\"INVALID_MANIFEST\",Me[Me.PACKAGE_PREPARATION_FAILED=58]=\"PACKAGE_PREPARATION_FAILED\",Me[Me.INVALID_RANGE_PEER_DEPENDENCY=59]=\"INVALID_RANGE_PEER_DEPENDENCY\",Me[Me.INCOMPATIBLE_PEER_DEPENDENCY=60]=\"INCOMPATIBLE_PEER_DEPENDENCY\",Me[Me.DEPRECATED_PACKAGE=61]=\"DEPRECATED_PACKAGE\",Me[Me.INCOMPATIBLE_OS=62]=\"INCOMPATIBLE_OS\",Me[Me.INCOMPATIBLE_CPU=63]=\"INCOMPATIBLE_CPU\",Me[Me.FROZEN_ARTIFACT_EXCEPTION=64]=\"FROZEN_ARTIFACT_EXCEPTION\",Me[Me.TELEMETRY_NOTICE=65]=\"TELEMETRY_NOTICE\",Me[Me.PATCH_HUNK_FAILED=66]=\"PATCH_HUNK_FAILED\",Me[Me.INVALID_CONFIGURATION_VALUE=67]=\"INVALID_CONFIGURATION_VALUE\",Me[Me.UNUSED_PACKAGE_EXTENSION=68]=\"UNUSED_PACKAGE_EXTENSION\",Me[Me.REDUNDANT_PACKAGE_EXTENSION=69]=\"REDUNDANT_PACKAGE_EXTENSION\",Me[Me.AUTO_NM_SUCCESS=70]=\"AUTO_NM_SUCCESS\",Me[Me.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]=\"NM_CANT_INSTALL_EXTERNAL_SOFT_LINK\",Me[Me.NM_PRESERVE_SYMLINKS_REQUIRED=72]=\"NM_PRESERVE_SYMLINKS_REQUIRED\",Me[Me.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]=\"UPDATE_LOCKFILE_ONLY_SKIP_LINK\",Me[Me.NM_HARDLINKS_MODE_DOWNGRADED=74]=\"NM_HARDLINKS_MODE_DOWNGRADED\",Me[Me.PROLOG_INSTANTIATION_ERROR=75]=\"PROLOG_INSTANTIATION_ERROR\",Me[Me.INCOMPATIBLE_ARCHITECTURE=76]=\"INCOMPATIBLE_ARCHITECTURE\",Me[Me.GHOST_ARCHITECTURE=77]=\"GHOST_ARCHITECTURE\",Me[Me.RESOLUTION_MISMATCH=78]=\"RESOLUTION_MISMATCH\",Me[Me.PROLOG_LIMIT_EXCEEDED=79]=\"PROLOG_LIMIT_EXCEEDED\",Me[Me.NETWORK_DISABLED=80]=\"NETWORK_DISABLED\",Me[Me.NETWORK_UNSAFE_HTTP=81]=\"NETWORK_UNSAFE_HTTP\",Me[Me.RESOLUTION_FAILED=82]=\"RESOLUTION_FAILED\",Me[Me.AUTOMERGE_GIT_ERROR=83]=\"AUTOMERGE_GIT_ERROR\",Me[Me.CONSTRAINTS_CHECK_FAILED=84]=\"CONSTRAINTS_CHECK_FAILED\",Me[Me.UPDATED_RESOLUTION_RECORD=85]=\"UPDATED_RESOLUTION_RECORD\",Me[Me.EXPLAIN_PEER_DEPENDENCIES_CTA=86]=\"EXPLAIN_PEER_DEPENDENCIES_CTA\",Me[Me.MIGRATION_SUCCESS=87]=\"MIGRATION_SUCCESS\",Me[Me.VERSION_NOTICE=88]=\"VERSION_NOTICE\",Me[Me.TIPS_NOTICE=89]=\"TIPS_NOTICE\",Me[Me.OFFLINE_MODE_ENABLED=90]=\"OFFLINE_MODE_ENABLED\",Me[Me.INVALID_PROVENANCE_ENVIRONMENT=91]=\"INVALID_PROVENANCE_ENVIRONMENT\",Me))(Br||{})});var aB=_((ZTt,wne)=>{var GYe=\"2.0.0\",qYe=Number.MAX_SAFE_INTEGER||9007199254740991,WYe=16,YYe=250,VYe=[\"major\",\"premajor\",\"minor\",\"preminor\",\"patch\",\"prepatch\",\"prerelease\"];wne.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:WYe,MAX_SAFE_BUILD_LENGTH:YYe,MAX_SAFE_INTEGER:qYe,RELEASE_TYPES:VYe,SEMVER_SPEC_VERSION:GYe,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var lB=_(($Tt,Bne)=>{var JYe=typeof process==\"object\"&&process.env&&process.env.NODE_DEBUG&&/\\bsemver\\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error(\"SEMVER\",...t):()=>{};Bne.exports=JYe});var vE=_((Bp,vne)=>{var{MAX_SAFE_COMPONENT_LENGTH:P_,MAX_SAFE_BUILD_LENGTH:KYe,MAX_LENGTH:zYe}=aB(),XYe=lB();Bp=vne.exports={};var ZYe=Bp.re=[],$Ye=Bp.safeRe=[],rr=Bp.src=[],nr=Bp.t={},eVe=0,x_=\"[a-zA-Z0-9-]\",tVe=[[\"\\\\s\",1],[\"\\\\d\",zYe],[x_,KYe]],rVe=t=>{for(let[e,r]of tVe)t=t.split(`${e}*`).join(`${e}{0,${r}}`).split(`${e}+`).join(`${e}{1,${r}}`);return t},Jr=(t,e,r)=>{let s=rVe(e),a=eVe++;XYe(t,a,e),nr[t]=a,rr[a]=e,ZYe[a]=new RegExp(e,r?\"g\":void 0),$Ye[a]=new RegExp(s,r?\"g\":void 0)};Jr(\"NUMERICIDENTIFIER\",\"0|[1-9]\\\\d*\");Jr(\"NUMERICIDENTIFIERLOOSE\",\"\\\\d+\");Jr(\"NONNUMERICIDENTIFIER\",`\\\\d*[a-zA-Z-]${x_}*`);Jr(\"MAINVERSION\",`(${rr[nr.NUMERICIDENTIFIER]})\\\\.(${rr[nr.NUMERICIDENTIFIER]})\\\\.(${rr[nr.NUMERICIDENTIFIER]})`);Jr(\"MAINVERSIONLOOSE\",`(${rr[nr.NUMERICIDENTIFIERLOOSE]})\\\\.(${rr[nr.NUMERICIDENTIFIERLOOSE]})\\\\.(${rr[nr.NUMERICIDENTIFIERLOOSE]})`);Jr(\"PRERELEASEIDENTIFIER\",`(?:${rr[nr.NUMERICIDENTIFIER]}|${rr[nr.NONNUMERICIDENTIFIER]})`);Jr(\"PRERELEASEIDENTIFIERLOOSE\",`(?:${rr[nr.NUMERICIDENTIFIERLOOSE]}|${rr[nr.NONNUMERICIDENTIFIER]})`);Jr(\"PRERELEASE\",`(?:-(${rr[nr.PRERELEASEIDENTIFIER]}(?:\\\\.${rr[nr.PRERELEASEIDENTIFIER]})*))`);Jr(\"PRERELEASELOOSE\",`(?:-?(${rr[nr.PRERELEASEIDENTIFIERLOOSE]}(?:\\\\.${rr[nr.PRERELEASEIDENTIFIERLOOSE]})*))`);Jr(\"BUILDIDENTIFIER\",`${x_}+`);Jr(\"BUILD\",`(?:\\\\+(${rr[nr.BUILDIDENTIFIER]}(?:\\\\.${rr[nr.BUILDIDENTIFIER]})*))`);Jr(\"FULLPLAIN\",`v?${rr[nr.MAINVERSION]}${rr[nr.PRERELEASE]}?${rr[nr.BUILD]}?`);Jr(\"FULL\",`^${rr[nr.FULLPLAIN]}$`);Jr(\"LOOSEPLAIN\",`[v=\\\\s]*${rr[nr.MAINVERSIONLOOSE]}${rr[nr.PRERELEASELOOSE]}?${rr[nr.BUILD]}?`);Jr(\"LOOSE\",`^${rr[nr.LOOSEPLAIN]}$`);Jr(\"GTLT\",\"((?:<|>)?=?)\");Jr(\"XRANGEIDENTIFIERLOOSE\",`${rr[nr.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`);Jr(\"XRANGEIDENTIFIER\",`${rr[nr.NUMERICIDENTIFIER]}|x|X|\\\\*`);Jr(\"XRANGEPLAIN\",`[v=\\\\s]*(${rr[nr.XRANGEIDENTIFIER]})(?:\\\\.(${rr[nr.XRANGEIDENTIFIER]})(?:\\\\.(${rr[nr.XRANGEIDENTIFIER]})(?:${rr[nr.PRERELEASE]})?${rr[nr.BUILD]}?)?)?`);Jr(\"XRANGEPLAINLOOSE\",`[v=\\\\s]*(${rr[nr.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${rr[nr.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${rr[nr.XRANGEIDENTIFIERLOOSE]})(?:${rr[nr.PRERELEASELOOSE]})?${rr[nr.BUILD]}?)?)?`);Jr(\"XRANGE\",`^${rr[nr.GTLT]}\\\\s*${rr[nr.XRANGEPLAIN]}$`);Jr(\"XRANGELOOSE\",`^${rr[nr.GTLT]}\\\\s*${rr[nr.XRANGEPLAINLOOSE]}$`);Jr(\"COERCEPLAIN\",`(^|[^\\\\d])(\\\\d{1,${P_}})(?:\\\\.(\\\\d{1,${P_}}))?(?:\\\\.(\\\\d{1,${P_}}))?`);Jr(\"COERCE\",`${rr[nr.COERCEPLAIN]}(?:$|[^\\\\d])`);Jr(\"COERCEFULL\",rr[nr.COERCEPLAIN]+`(?:${rr[nr.PRERELEASE]})?(?:${rr[nr.BUILD]})?(?:$|[^\\\\d])`);Jr(\"COERCERTL\",rr[nr.COERCE],!0);Jr(\"COERCERTLFULL\",rr[nr.COERCEFULL],!0);Jr(\"LONETILDE\",\"(?:~>?)\");Jr(\"TILDETRIM\",`(\\\\s*)${rr[nr.LONETILDE]}\\\\s+`,!0);Bp.tildeTrimReplace=\"$1~\";Jr(\"TILDE\",`^${rr[nr.LONETILDE]}${rr[nr.XRANGEPLAIN]}$`);Jr(\"TILDELOOSE\",`^${rr[nr.LONETILDE]}${rr[nr.XRANGEPLAINLOOSE]}$`);Jr(\"LONECARET\",\"(?:\\\\^)\");Jr(\"CARETTRIM\",`(\\\\s*)${rr[nr.LONECARET]}\\\\s+`,!0);Bp.caretTrimReplace=\"$1^\";Jr(\"CARET\",`^${rr[nr.LONECARET]}${rr[nr.XRANGEPLAIN]}$`);Jr(\"CARETLOOSE\",`^${rr[nr.LONECARET]}${rr[nr.XRANGEPLAINLOOSE]}$`);Jr(\"COMPARATORLOOSE\",`^${rr[nr.GTLT]}\\\\s*(${rr[nr.LOOSEPLAIN]})$|^$`);Jr(\"COMPARATOR\",`^${rr[nr.GTLT]}\\\\s*(${rr[nr.FULLPLAIN]})$|^$`);Jr(\"COMPARATORTRIM\",`(\\\\s*)${rr[nr.GTLT]}\\\\s*(${rr[nr.LOOSEPLAIN]}|${rr[nr.XRANGEPLAIN]})`,!0);Bp.comparatorTrimReplace=\"$1$2$3\";Jr(\"HYPHENRANGE\",`^\\\\s*(${rr[nr.XRANGEPLAIN]})\\\\s+-\\\\s+(${rr[nr.XRANGEPLAIN]})\\\\s*$`);Jr(\"HYPHENRANGELOOSE\",`^\\\\s*(${rr[nr.XRANGEPLAINLOOSE]})\\\\s+-\\\\s+(${rr[nr.XRANGEPLAINLOOSE]})\\\\s*$`);Jr(\"STAR\",\"(<|>)?=?\\\\s*\\\\*\");Jr(\"GTE0\",\"^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$\");Jr(\"GTE0PRE\",\"^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$\")});var qx=_((eRt,Sne)=>{var nVe=Object.freeze({loose:!0}),iVe=Object.freeze({}),sVe=t=>t?typeof t!=\"object\"?nVe:t:iVe;Sne.exports=sVe});var k_=_((tRt,Pne)=>{var Dne=/^[0-9]+$/,bne=(t,e)=>{let r=Dne.test(t),s=Dne.test(e);return r&&s&&(t=+t,e=+e),t===e?0:r&&!s?-1:s&&!r?1:t<e?-1:1},oVe=(t,e)=>bne(e,t);Pne.exports={compareIdentifiers:bne,rcompareIdentifiers:oVe}});var jo=_((rRt,Tne)=>{var Wx=lB(),{MAX_LENGTH:xne,MAX_SAFE_INTEGER:Yx}=aB(),{safeRe:kne,t:Qne}=vE(),aVe=qx(),{compareIdentifiers:SE}=k_(),Q_=class t{constructor(e,r){if(r=aVe(r),e instanceof t){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!=\"string\")throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof e}\".`);if(e.length>xne)throw new TypeError(`version is longer than ${xne} characters`);Wx(\"SemVer\",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let s=e.trim().match(r.loose?kne[Qne.LOOSE]:kne[Qne.FULL]);if(!s)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+s[1],this.minor=+s[2],this.patch=+s[3],this.major>Yx||this.major<0)throw new TypeError(\"Invalid major version\");if(this.minor>Yx||this.minor<0)throw new TypeError(\"Invalid minor version\");if(this.patch>Yx||this.patch<0)throw new TypeError(\"Invalid patch version\");s[4]?this.prerelease=s[4].split(\".\").map(a=>{if(/^[0-9]+$/.test(a)){let n=+a;if(n>=0&&n<Yx)return n}return a}):this.prerelease=[],this.build=s[5]?s[5].split(\".\"):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(\".\")}`),this.version}toString(){return this.version}compare(e){if(Wx(\"SemVer.compare\",this.version,this.options,e),!(e instanceof t)){if(typeof e==\"string\"&&e===this.version)return 0;e=new t(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof t||(e=new t(e,this.options)),SE(this.major,e.major)||SE(this.minor,e.minor)||SE(this.patch,e.patch)}comparePre(e){if(e instanceof t||(e=new t(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let r=0;do{let s=this.prerelease[r],a=e.prerelease[r];if(Wx(\"prerelease compare\",r,s,a),s===void 0&&a===void 0)return 0;if(a===void 0)return 1;if(s===void 0)return-1;if(s===a)continue;return SE(s,a)}while(++r)}compareBuild(e){e instanceof t||(e=new t(e,this.options));let r=0;do{let s=this.build[r],a=e.build[r];if(Wx(\"prerelease compare\",r,s,a),s===void 0&&a===void 0)return 0;if(a===void 0)return 1;if(s===void 0)return-1;if(s===a)continue;return SE(s,a)}while(++r)}inc(e,r,s){switch(e){case\"premajor\":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc(\"pre\",r,s);break;case\"preminor\":this.prerelease.length=0,this.patch=0,this.minor++,this.inc(\"pre\",r,s);break;case\"prepatch\":this.prerelease.length=0,this.inc(\"patch\",r,s),this.inc(\"pre\",r,s);break;case\"prerelease\":this.prerelease.length===0&&this.inc(\"patch\",r,s),this.inc(\"pre\",r,s);break;case\"major\":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case\"minor\":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case\"patch\":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case\"pre\":{let a=Number(s)?1:0;if(!r&&s===!1)throw new Error(\"invalid increment argument: identifier is empty\");if(this.prerelease.length===0)this.prerelease=[a];else{let n=this.prerelease.length;for(;--n>=0;)typeof this.prerelease[n]==\"number\"&&(this.prerelease[n]++,n=-2);if(n===-1){if(r===this.prerelease.join(\".\")&&s===!1)throw new Error(\"invalid increment argument: identifier already exists\");this.prerelease.push(a)}}if(r){let n=[r,a];s===!1&&(n=[r]),SE(this.prerelease[0],r)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(\".\")}`),this}};Tne.exports=Q_});var Md=_((nRt,Fne)=>{var Rne=jo(),lVe=(t,e,r=!1)=>{if(t instanceof Rne)return t;try{return new Rne(t,e)}catch(s){if(!r)return null;throw s}};Fne.exports=lVe});var One=_((iRt,Nne)=>{var cVe=Md(),uVe=(t,e)=>{let r=cVe(t,e);return r?r.version:null};Nne.exports=uVe});var Mne=_((sRt,Lne)=>{var fVe=Md(),AVe=(t,e)=>{let r=fVe(t.trim().replace(/^[=v]+/,\"\"),e);return r?r.version:null};Lne.exports=AVe});var Hne=_((oRt,_ne)=>{var Une=jo(),pVe=(t,e,r,s,a)=>{typeof r==\"string\"&&(a=s,s=r,r=void 0);try{return new Une(t instanceof Une?t.version:t,r).inc(e,s,a).version}catch{return null}};_ne.exports=pVe});var qne=_((aRt,Gne)=>{var jne=Md(),hVe=(t,e)=>{let r=jne(t,null,!0),s=jne(e,null,!0),a=r.compare(s);if(a===0)return null;let n=a>0,c=n?r:s,f=n?s:r,p=!!c.prerelease.length;if(!!f.prerelease.length&&!p)return!f.patch&&!f.minor?\"major\":c.patch?\"patch\":c.minor?\"minor\":\"major\";let E=p?\"pre\":\"\";return r.major!==s.major?E+\"major\":r.minor!==s.minor?E+\"minor\":r.patch!==s.patch?E+\"patch\":\"prerelease\"};Gne.exports=hVe});var Yne=_((lRt,Wne)=>{var gVe=jo(),dVe=(t,e)=>new gVe(t,e).major;Wne.exports=dVe});var Jne=_((cRt,Vne)=>{var mVe=jo(),yVe=(t,e)=>new mVe(t,e).minor;Vne.exports=yVe});var zne=_((uRt,Kne)=>{var EVe=jo(),IVe=(t,e)=>new EVe(t,e).patch;Kne.exports=IVe});var Zne=_((fRt,Xne)=>{var CVe=Md(),wVe=(t,e)=>{let r=CVe(t,e);return r&&r.prerelease.length?r.prerelease:null};Xne.exports=wVe});var Bc=_((ARt,eie)=>{var $ne=jo(),BVe=(t,e,r)=>new $ne(t,r).compare(new $ne(e,r));eie.exports=BVe});var rie=_((pRt,tie)=>{var vVe=Bc(),SVe=(t,e,r)=>vVe(e,t,r);tie.exports=SVe});var iie=_((hRt,nie)=>{var DVe=Bc(),bVe=(t,e)=>DVe(t,e,!0);nie.exports=bVe});var Vx=_((gRt,oie)=>{var sie=jo(),PVe=(t,e,r)=>{let s=new sie(t,r),a=new sie(e,r);return s.compare(a)||s.compareBuild(a)};oie.exports=PVe});var lie=_((dRt,aie)=>{var xVe=Vx(),kVe=(t,e)=>t.sort((r,s)=>xVe(r,s,e));aie.exports=kVe});var uie=_((mRt,cie)=>{var QVe=Vx(),TVe=(t,e)=>t.sort((r,s)=>QVe(s,r,e));cie.exports=TVe});var cB=_((yRt,fie)=>{var RVe=Bc(),FVe=(t,e,r)=>RVe(t,e,r)>0;fie.exports=FVe});var Jx=_((ERt,Aie)=>{var NVe=Bc(),OVe=(t,e,r)=>NVe(t,e,r)<0;Aie.exports=OVe});var T_=_((IRt,pie)=>{var LVe=Bc(),MVe=(t,e,r)=>LVe(t,e,r)===0;pie.exports=MVe});var R_=_((CRt,hie)=>{var UVe=Bc(),_Ve=(t,e,r)=>UVe(t,e,r)!==0;hie.exports=_Ve});var Kx=_((wRt,gie)=>{var HVe=Bc(),jVe=(t,e,r)=>HVe(t,e,r)>=0;gie.exports=jVe});var zx=_((BRt,die)=>{var GVe=Bc(),qVe=(t,e,r)=>GVe(t,e,r)<=0;die.exports=qVe});var F_=_((vRt,mie)=>{var WVe=T_(),YVe=R_(),VVe=cB(),JVe=Kx(),KVe=Jx(),zVe=zx(),XVe=(t,e,r,s)=>{switch(e){case\"===\":return typeof t==\"object\"&&(t=t.version),typeof r==\"object\"&&(r=r.version),t===r;case\"!==\":return typeof t==\"object\"&&(t=t.version),typeof r==\"object\"&&(r=r.version),t!==r;case\"\":case\"=\":case\"==\":return WVe(t,r,s);case\"!=\":return YVe(t,r,s);case\">\":return VVe(t,r,s);case\">=\":return JVe(t,r,s);case\"<\":return KVe(t,r,s);case\"<=\":return zVe(t,r,s);default:throw new TypeError(`Invalid operator: ${e}`)}};mie.exports=XVe});var Eie=_((SRt,yie)=>{var ZVe=jo(),$Ve=Md(),{safeRe:Xx,t:Zx}=vE(),e7e=(t,e)=>{if(t instanceof ZVe)return t;if(typeof t==\"number\"&&(t=String(t)),typeof t!=\"string\")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(e.includePrerelease?Xx[Zx.COERCEFULL]:Xx[Zx.COERCE]);else{let p=e.includePrerelease?Xx[Zx.COERCERTLFULL]:Xx[Zx.COERCERTL],h;for(;(h=p.exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||h.index+h[0].length!==r.index+r[0].length)&&(r=h),p.lastIndex=h.index+h[1].length+h[2].length;p.lastIndex=-1}if(r===null)return null;let s=r[2],a=r[3]||\"0\",n=r[4]||\"0\",c=e.includePrerelease&&r[5]?`-${r[5]}`:\"\",f=e.includePrerelease&&r[6]?`+${r[6]}`:\"\";return $Ve(`${s}.${a}.${n}${c}${f}`,e)};yie.exports=e7e});var Cie=_((DRt,Iie)=>{\"use strict\";Iie.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var $x=_((bRt,wie)=>{\"use strict\";wie.exports=Fn;Fn.Node=Ud;Fn.create=Fn;function Fn(t){var e=this;if(e instanceof Fn||(e=new Fn),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach==\"function\")t.forEach(function(a){e.push(a)});else if(arguments.length>0)for(var r=0,s=arguments.length;r<s;r++)e.push(arguments[r]);return e}Fn.prototype.removeNode=function(t){if(t.list!==this)throw new Error(\"removing node which does not belong to this list\");var e=t.next,r=t.prev;return e&&(e.prev=r),r&&(r.next=e),t===this.head&&(this.head=e),t===this.tail&&(this.tail=r),t.list.length--,t.next=null,t.prev=null,t.list=null,e};Fn.prototype.unshiftNode=function(t){if(t!==this.head){t.list&&t.list.removeNode(t);var e=this.head;t.list=this,t.next=e,e&&(e.prev=t),this.head=t,this.tail||(this.tail=t),this.length++}};Fn.prototype.pushNode=function(t){if(t!==this.tail){t.list&&t.list.removeNode(t);var e=this.tail;t.list=this,t.prev=e,e&&(e.next=t),this.tail=t,this.head||(this.head=t),this.length++}};Fn.prototype.push=function(){for(var t=0,e=arguments.length;t<e;t++)r7e(this,arguments[t]);return this.length};Fn.prototype.unshift=function(){for(var t=0,e=arguments.length;t<e;t++)n7e(this,arguments[t]);return this.length};Fn.prototype.pop=function(){if(this.tail){var t=this.tail.value;return this.tail=this.tail.prev,this.tail?this.tail.next=null:this.head=null,this.length--,t}};Fn.prototype.shift=function(){if(this.head){var t=this.head.value;return this.head=this.head.next,this.head?this.head.prev=null:this.tail=null,this.length--,t}};Fn.prototype.forEach=function(t,e){e=e||this;for(var r=this.head,s=0;r!==null;s++)t.call(e,r.value,s,this),r=r.next};Fn.prototype.forEachReverse=function(t,e){e=e||this;for(var r=this.tail,s=this.length-1;r!==null;s--)t.call(e,r.value,s,this),r=r.prev};Fn.prototype.get=function(t){for(var e=0,r=this.head;r!==null&&e<t;e++)r=r.next;if(e===t&&r!==null)return r.value};Fn.prototype.getReverse=function(t){for(var e=0,r=this.tail;r!==null&&e<t;e++)r=r.prev;if(e===t&&r!==null)return r.value};Fn.prototype.map=function(t,e){e=e||this;for(var r=new Fn,s=this.head;s!==null;)r.push(t.call(e,s.value,this)),s=s.next;return r};Fn.prototype.mapReverse=function(t,e){e=e||this;for(var r=new Fn,s=this.tail;s!==null;)r.push(t.call(e,s.value,this)),s=s.prev;return r};Fn.prototype.reduce=function(t,e){var r,s=this.head;if(arguments.length>1)r=e;else if(this.head)s=this.head.next,r=this.head.value;else throw new TypeError(\"Reduce of empty list with no initial value\");for(var a=0;s!==null;a++)r=t(r,s.value,a),s=s.next;return r};Fn.prototype.reduceReverse=function(t,e){var r,s=this.tail;if(arguments.length>1)r=e;else if(this.tail)s=this.tail.prev,r=this.tail.value;else throw new TypeError(\"Reduce of empty list with no initial value\");for(var a=this.length-1;s!==null;a--)r=t(r,s.value,a),s=s.prev;return r};Fn.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};Fn.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};Fn.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Fn;if(e<t||e<0)return r;t<0&&(t=0),e>this.length&&(e=this.length);for(var s=0,a=this.head;a!==null&&s<t;s++)a=a.next;for(;a!==null&&s<e;s++,a=a.next)r.push(a.value);return r};Fn.prototype.sliceReverse=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Fn;if(e<t||e<0)return r;t<0&&(t=0),e>this.length&&(e=this.length);for(var s=this.length,a=this.tail;a!==null&&s>e;s--)a=a.prev;for(;a!==null&&s>t;s--,a=a.prev)r.push(a.value);return r};Fn.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var s=0,a=this.head;a!==null&&s<t;s++)a=a.next;for(var n=[],s=0;a&&s<e;s++)n.push(a.value),a=this.removeNode(a);a===null&&(a=this.tail),a!==this.head&&a!==this.tail&&(a=a.prev);for(var s=0;s<r.length;s++)a=t7e(this,a,r[s]);return n};Fn.prototype.reverse=function(){for(var t=this.head,e=this.tail,r=t;r!==null;r=r.prev){var s=r.prev;r.prev=r.next,r.next=s}return this.head=e,this.tail=t,this};function t7e(t,e,r){var s=e===t.head?new Ud(r,null,e,t):new Ud(r,e,e.next,t);return s.next===null&&(t.tail=s),s.prev===null&&(t.head=s),t.length++,s}function r7e(t,e){t.tail=new Ud(e,t.tail,null,t),t.head||(t.head=t.tail),t.length++}function n7e(t,e){t.head=new Ud(e,null,t.head,t),t.tail||(t.tail=t.head),t.length++}function Ud(t,e,r,s){if(!(this instanceof Ud))return new Ud(t,e,r,s);this.list=s,this.value=t,e?(e.next=this,this.prev=e):this.prev=null,r?(r.prev=this,this.next=r):this.next=null}try{Cie()(Fn)}catch{}});var bie=_((PRt,Die)=>{\"use strict\";var i7e=$x(),_d=Symbol(\"max\"),Sp=Symbol(\"length\"),DE=Symbol(\"lengthCalculator\"),fB=Symbol(\"allowStale\"),Hd=Symbol(\"maxAge\"),vp=Symbol(\"dispose\"),Bie=Symbol(\"noDisposeOnSet\"),Gs=Symbol(\"lruList\"),Lu=Symbol(\"cache\"),Sie=Symbol(\"updateAgeOnGet\"),N_=()=>1,L_=class{constructor(e){if(typeof e==\"number\"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!=\"number\"||e.max<0))throw new TypeError(\"max must be a non-negative number\");let r=this[_d]=e.max||1/0,s=e.length||N_;if(this[DE]=typeof s!=\"function\"?N_:s,this[fB]=e.stale||!1,e.maxAge&&typeof e.maxAge!=\"number\")throw new TypeError(\"maxAge must be a number\");this[Hd]=e.maxAge||0,this[vp]=e.dispose,this[Bie]=e.noDisposeOnSet||!1,this[Sie]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!=\"number\"||e<0)throw new TypeError(\"max must be a non-negative number\");this[_d]=e||1/0,uB(this)}get max(){return this[_d]}set allowStale(e){this[fB]=!!e}get allowStale(){return this[fB]}set maxAge(e){if(typeof e!=\"number\")throw new TypeError(\"maxAge must be a non-negative number\");this[Hd]=e,uB(this)}get maxAge(){return this[Hd]}set lengthCalculator(e){typeof e!=\"function\"&&(e=N_),e!==this[DE]&&(this[DE]=e,this[Sp]=0,this[Gs].forEach(r=>{r.length=this[DE](r.value,r.key),this[Sp]+=r.length})),uB(this)}get lengthCalculator(){return this[DE]}get length(){return this[Sp]}get itemCount(){return this[Gs].length}rforEach(e,r){r=r||this;for(let s=this[Gs].tail;s!==null;){let a=s.prev;vie(this,e,s,r),s=a}}forEach(e,r){r=r||this;for(let s=this[Gs].head;s!==null;){let a=s.next;vie(this,e,s,r),s=a}}keys(){return this[Gs].toArray().map(e=>e.key)}values(){return this[Gs].toArray().map(e=>e.value)}reset(){this[vp]&&this[Gs]&&this[Gs].length&&this[Gs].forEach(e=>this[vp](e.key,e.value)),this[Lu]=new Map,this[Gs]=new i7e,this[Sp]=0}dump(){return this[Gs].map(e=>ek(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[Gs]}set(e,r,s){if(s=s||this[Hd],s&&typeof s!=\"number\")throw new TypeError(\"maxAge must be a number\");let a=s?Date.now():0,n=this[DE](r,e);if(this[Lu].has(e)){if(n>this[_d])return bE(this,this[Lu].get(e)),!1;let p=this[Lu].get(e).value;return this[vp]&&(this[Bie]||this[vp](e,p.value)),p.now=a,p.maxAge=s,p.value=r,this[Sp]+=n-p.length,p.length=n,this.get(e),uB(this),!0}let c=new M_(e,r,n,a,s);return c.length>this[_d]?(this[vp]&&this[vp](e,r),!1):(this[Sp]+=c.length,this[Gs].unshift(c),this[Lu].set(e,this[Gs].head),uB(this),!0)}has(e){if(!this[Lu].has(e))return!1;let r=this[Lu].get(e).value;return!ek(this,r)}get(e){return O_(this,e,!0)}peek(e){return O_(this,e,!1)}pop(){let e=this[Gs].tail;return e?(bE(this,e),e.value):null}del(e){bE(this,this[Lu].get(e))}load(e){this.reset();let r=Date.now();for(let s=e.length-1;s>=0;s--){let a=e[s],n=a.e||0;if(n===0)this.set(a.k,a.v);else{let c=n-r;c>0&&this.set(a.k,a.v,c)}}}prune(){this[Lu].forEach((e,r)=>O_(this,r,!1))}},O_=(t,e,r)=>{let s=t[Lu].get(e);if(s){let a=s.value;if(ek(t,a)){if(bE(t,s),!t[fB])return}else r&&(t[Sie]&&(s.value.now=Date.now()),t[Gs].unshiftNode(s));return a.value}},ek=(t,e)=>{if(!e||!e.maxAge&&!t[Hd])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[Hd]&&r>t[Hd]},uB=t=>{if(t[Sp]>t[_d])for(let e=t[Gs].tail;t[Sp]>t[_d]&&e!==null;){let r=e.prev;bE(t,e),e=r}},bE=(t,e)=>{if(e){let r=e.value;t[vp]&&t[vp](r.key,r.value),t[Sp]-=r.length,t[Lu].delete(r.key),t[Gs].removeNode(e)}},M_=class{constructor(e,r,s,a,n){this.key=e,this.value=r,this.length=s,this.now=a,this.maxAge=n||0}},vie=(t,e,r,s)=>{let a=r.value;ek(t,a)&&(bE(t,r),t[fB]||(a=void 0)),a&&e.call(s,a.value,a.key,t)};Die.exports=L_});var vc=_((xRt,Qie)=>{var U_=class t{constructor(e,r){if(r=o7e(r),e instanceof t)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new t(e.raw,r);if(e instanceof __)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e.trim().split(/\\s+/).join(\" \"),this.set=this.raw.split(\"||\").map(s=>this.parseRange(s.trim())).filter(s=>s.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let s=this.set[0];if(this.set=this.set.filter(a=>!xie(a[0])),this.set.length===0)this.set=[s];else if(this.set.length>1){for(let a of this.set)if(a.length===1&&p7e(a[0])){this.set=[a];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(\" \").trim()).join(\"||\").trim(),this.range}toString(){return this.range}parseRange(e){let s=((this.options.includePrerelease&&f7e)|(this.options.loose&&A7e))+\":\"+e,a=Pie.get(s);if(a)return a;let n=this.options.loose,c=n?sl[wa.HYPHENRANGELOOSE]:sl[wa.HYPHENRANGE];e=e.replace(c,B7e(this.options.includePrerelease)),vi(\"hyphen replace\",e),e=e.replace(sl[wa.COMPARATORTRIM],l7e),vi(\"comparator trim\",e),e=e.replace(sl[wa.TILDETRIM],c7e),vi(\"tilde trim\",e),e=e.replace(sl[wa.CARETTRIM],u7e),vi(\"caret trim\",e);let f=e.split(\" \").map(C=>h7e(C,this.options)).join(\" \").split(/\\s+/).map(C=>w7e(C,this.options));n&&(f=f.filter(C=>(vi(\"loose invalid filter\",C,this.options),!!C.match(sl[wa.COMPARATORLOOSE])))),vi(\"range list\",f);let p=new Map,h=f.map(C=>new __(C,this.options));for(let C of h){if(xie(C))return[C];p.set(C.value,C)}p.size>1&&p.has(\"\")&&p.delete(\"\");let E=[...p.values()];return Pie.set(s,E),E}intersects(e,r){if(!(e instanceof t))throw new TypeError(\"a Range is required\");return this.set.some(s=>kie(s,r)&&e.set.some(a=>kie(a,r)&&s.every(n=>a.every(c=>n.intersects(c,r)))))}test(e){if(!e)return!1;if(typeof e==\"string\")try{e=new a7e(e,this.options)}catch{return!1}for(let r=0;r<this.set.length;r++)if(v7e(this.set[r],e,this.options))return!0;return!1}};Qie.exports=U_;var s7e=bie(),Pie=new s7e({max:1e3}),o7e=qx(),__=AB(),vi=lB(),a7e=jo(),{safeRe:sl,t:wa,comparatorTrimReplace:l7e,tildeTrimReplace:c7e,caretTrimReplace:u7e}=vE(),{FLAG_INCLUDE_PRERELEASE:f7e,FLAG_LOOSE:A7e}=aB(),xie=t=>t.value===\"<0.0.0-0\",p7e=t=>t.value===\"\",kie=(t,e)=>{let r=!0,s=t.slice(),a=s.pop();for(;r&&s.length;)r=s.every(n=>a.intersects(n,e)),a=s.pop();return r},h7e=(t,e)=>(vi(\"comp\",t,e),t=m7e(t,e),vi(\"caret\",t),t=g7e(t,e),vi(\"tildes\",t),t=E7e(t,e),vi(\"xrange\",t),t=C7e(t,e),vi(\"stars\",t),t),Ba=t=>!t||t.toLowerCase()===\"x\"||t===\"*\",g7e=(t,e)=>t.trim().split(/\\s+/).map(r=>d7e(r,e)).join(\" \"),d7e=(t,e)=>{let r=e.loose?sl[wa.TILDELOOSE]:sl[wa.TILDE];return t.replace(r,(s,a,n,c,f)=>{vi(\"tilde\",t,s,a,n,c,f);let p;return Ba(a)?p=\"\":Ba(n)?p=`>=${a}.0.0 <${+a+1}.0.0-0`:Ba(c)?p=`>=${a}.${n}.0 <${a}.${+n+1}.0-0`:f?(vi(\"replaceTilde pr\",f),p=`>=${a}.${n}.${c}-${f} <${a}.${+n+1}.0-0`):p=`>=${a}.${n}.${c} <${a}.${+n+1}.0-0`,vi(\"tilde return\",p),p})},m7e=(t,e)=>t.trim().split(/\\s+/).map(r=>y7e(r,e)).join(\" \"),y7e=(t,e)=>{vi(\"caret\",t,e);let r=e.loose?sl[wa.CARETLOOSE]:sl[wa.CARET],s=e.includePrerelease?\"-0\":\"\";return t.replace(r,(a,n,c,f,p)=>{vi(\"caret\",t,a,n,c,f,p);let h;return Ba(n)?h=\"\":Ba(c)?h=`>=${n}.0.0${s} <${+n+1}.0.0-0`:Ba(f)?n===\"0\"?h=`>=${n}.${c}.0${s} <${n}.${+c+1}.0-0`:h=`>=${n}.${c}.0${s} <${+n+1}.0.0-0`:p?(vi(\"replaceCaret pr\",p),n===\"0\"?c===\"0\"?h=`>=${n}.${c}.${f}-${p} <${n}.${c}.${+f+1}-0`:h=`>=${n}.${c}.${f}-${p} <${n}.${+c+1}.0-0`:h=`>=${n}.${c}.${f}-${p} <${+n+1}.0.0-0`):(vi(\"no pr\"),n===\"0\"?c===\"0\"?h=`>=${n}.${c}.${f}${s} <${n}.${c}.${+f+1}-0`:h=`>=${n}.${c}.${f}${s} <${n}.${+c+1}.0-0`:h=`>=${n}.${c}.${f} <${+n+1}.0.0-0`),vi(\"caret return\",h),h})},E7e=(t,e)=>(vi(\"replaceXRanges\",t,e),t.split(/\\s+/).map(r=>I7e(r,e)).join(\" \")),I7e=(t,e)=>{t=t.trim();let r=e.loose?sl[wa.XRANGELOOSE]:sl[wa.XRANGE];return t.replace(r,(s,a,n,c,f,p)=>{vi(\"xRange\",t,s,a,n,c,f,p);let h=Ba(n),E=h||Ba(c),C=E||Ba(f),S=C;return a===\"=\"&&S&&(a=\"\"),p=e.includePrerelease?\"-0\":\"\",h?a===\">\"||a===\"<\"?s=\"<0.0.0-0\":s=\"*\":a&&S?(E&&(c=0),f=0,a===\">\"?(a=\">=\",E?(n=+n+1,c=0,f=0):(c=+c+1,f=0)):a===\"<=\"&&(a=\"<\",E?n=+n+1:c=+c+1),a===\"<\"&&(p=\"-0\"),s=`${a+n}.${c}.${f}${p}`):E?s=`>=${n}.0.0${p} <${+n+1}.0.0-0`:C&&(s=`>=${n}.${c}.0${p} <${n}.${+c+1}.0-0`),vi(\"xRange return\",s),s})},C7e=(t,e)=>(vi(\"replaceStars\",t,e),t.trim().replace(sl[wa.STAR],\"\")),w7e=(t,e)=>(vi(\"replaceGTE0\",t,e),t.trim().replace(sl[e.includePrerelease?wa.GTE0PRE:wa.GTE0],\"\")),B7e=t=>(e,r,s,a,n,c,f,p,h,E,C,S,P)=>(Ba(s)?r=\"\":Ba(a)?r=`>=${s}.0.0${t?\"-0\":\"\"}`:Ba(n)?r=`>=${s}.${a}.0${t?\"-0\":\"\"}`:c?r=`>=${r}`:r=`>=${r}${t?\"-0\":\"\"}`,Ba(h)?p=\"\":Ba(E)?p=`<${+h+1}.0.0-0`:Ba(C)?p=`<${h}.${+E+1}.0-0`:S?p=`<=${h}.${E}.${C}-${S}`:t?p=`<${h}.${E}.${+C+1}-0`:p=`<=${p}`,`${r} ${p}`.trim()),v7e=(t,e,r)=>{for(let s=0;s<t.length;s++)if(!t[s].test(e))return!1;if(e.prerelease.length&&!r.includePrerelease){for(let s=0;s<t.length;s++)if(vi(t[s].semver),t[s].semver!==__.ANY&&t[s].semver.prerelease.length>0){let a=t[s].semver;if(a.major===e.major&&a.minor===e.minor&&a.patch===e.patch)return!0}return!1}return!0}});var AB=_((kRt,Lie)=>{var pB=Symbol(\"SemVer ANY\"),G_=class t{static get ANY(){return pB}constructor(e,r){if(r=Tie(r),e instanceof t){if(e.loose===!!r.loose)return e;e=e.value}e=e.trim().split(/\\s+/).join(\" \"),j_(\"comparator\",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===pB?this.value=\"\":this.value=this.operator+this.semver.version,j_(\"comp\",this)}parse(e){let r=this.options.loose?Rie[Fie.COMPARATORLOOSE]:Rie[Fie.COMPARATOR],s=e.match(r);if(!s)throw new TypeError(`Invalid comparator: ${e}`);this.operator=s[1]!==void 0?s[1]:\"\",this.operator===\"=\"&&(this.operator=\"\"),s[2]?this.semver=new Nie(s[2],this.options.loose):this.semver=pB}toString(){return this.value}test(e){if(j_(\"Comparator.test\",e,this.options.loose),this.semver===pB||e===pB)return!0;if(typeof e==\"string\")try{e=new Nie(e,this.options)}catch{return!1}return H_(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof t))throw new TypeError(\"a Comparator is required\");return this.operator===\"\"?this.value===\"\"?!0:new Oie(e.value,r).test(this.value):e.operator===\"\"?e.value===\"\"?!0:new Oie(this.value,r).test(e.semver):(r=Tie(r),r.includePrerelease&&(this.value===\"<0.0.0-0\"||e.value===\"<0.0.0-0\")||!r.includePrerelease&&(this.value.startsWith(\"<0.0.0\")||e.value.startsWith(\"<0.0.0\"))?!1:!!(this.operator.startsWith(\">\")&&e.operator.startsWith(\">\")||this.operator.startsWith(\"<\")&&e.operator.startsWith(\"<\")||this.semver.version===e.semver.version&&this.operator.includes(\"=\")&&e.operator.includes(\"=\")||H_(this.semver,\"<\",e.semver,r)&&this.operator.startsWith(\">\")&&e.operator.startsWith(\"<\")||H_(this.semver,\">\",e.semver,r)&&this.operator.startsWith(\"<\")&&e.operator.startsWith(\">\")))}};Lie.exports=G_;var Tie=qx(),{safeRe:Rie,t:Fie}=vE(),H_=F_(),j_=lB(),Nie=jo(),Oie=vc()});var hB=_((QRt,Mie)=>{var S7e=vc(),D7e=(t,e,r)=>{try{e=new S7e(e,r)}catch{return!1}return e.test(t)};Mie.exports=D7e});var _ie=_((TRt,Uie)=>{var b7e=vc(),P7e=(t,e)=>new b7e(t,e).set.map(r=>r.map(s=>s.value).join(\" \").trim().split(\" \"));Uie.exports=P7e});var jie=_((RRt,Hie)=>{var x7e=jo(),k7e=vc(),Q7e=(t,e,r)=>{let s=null,a=null,n=null;try{n=new k7e(e,r)}catch{return null}return t.forEach(c=>{n.test(c)&&(!s||a.compare(c)===-1)&&(s=c,a=new x7e(s,r))}),s};Hie.exports=Q7e});var qie=_((FRt,Gie)=>{var T7e=jo(),R7e=vc(),F7e=(t,e,r)=>{let s=null,a=null,n=null;try{n=new R7e(e,r)}catch{return null}return t.forEach(c=>{n.test(c)&&(!s||a.compare(c)===1)&&(s=c,a=new T7e(s,r))}),s};Gie.exports=F7e});var Vie=_((NRt,Yie)=>{var q_=jo(),N7e=vc(),Wie=cB(),O7e=(t,e)=>{t=new N7e(t,e);let r=new q_(\"0.0.0\");if(t.test(r)||(r=new q_(\"0.0.0-0\"),t.test(r)))return r;r=null;for(let s=0;s<t.set.length;++s){let a=t.set[s],n=null;a.forEach(c=>{let f=new q_(c.semver.version);switch(c.operator){case\">\":f.prerelease.length===0?f.patch++:f.prerelease.push(0),f.raw=f.format();case\"\":case\">=\":(!n||Wie(f,n))&&(n=f);break;case\"<\":case\"<=\":break;default:throw new Error(`Unexpected operation: ${c.operator}`)}}),n&&(!r||Wie(r,n))&&(r=n)}return r&&t.test(r)?r:null};Yie.exports=O7e});var Kie=_((ORt,Jie)=>{var L7e=vc(),M7e=(t,e)=>{try{return new L7e(t,e).range||\"*\"}catch{return null}};Jie.exports=M7e});var tk=_((LRt,$ie)=>{var U7e=jo(),Zie=AB(),{ANY:_7e}=Zie,H7e=vc(),j7e=hB(),zie=cB(),Xie=Jx(),G7e=zx(),q7e=Kx(),W7e=(t,e,r,s)=>{t=new U7e(t,s),e=new H7e(e,s);let a,n,c,f,p;switch(r){case\">\":a=zie,n=G7e,c=Xie,f=\">\",p=\">=\";break;case\"<\":a=Xie,n=q7e,c=zie,f=\"<\",p=\"<=\";break;default:throw new TypeError('Must provide a hilo val of \"<\" or \">\"')}if(j7e(t,e,s))return!1;for(let h=0;h<e.set.length;++h){let E=e.set[h],C=null,S=null;if(E.forEach(P=>{P.semver===_7e&&(P=new Zie(\">=0.0.0\")),C=C||P,S=S||P,a(P.semver,C.semver,s)?C=P:c(P.semver,S.semver,s)&&(S=P)}),C.operator===f||C.operator===p||(!S.operator||S.operator===f)&&n(t,S.semver))return!1;if(S.operator===p&&c(t,S.semver))return!1}return!0};$ie.exports=W7e});var tse=_((MRt,ese)=>{var Y7e=tk(),V7e=(t,e,r)=>Y7e(t,e,\">\",r);ese.exports=V7e});var nse=_((URt,rse)=>{var J7e=tk(),K7e=(t,e,r)=>J7e(t,e,\"<\",r);rse.exports=K7e});var ose=_((_Rt,sse)=>{var ise=vc(),z7e=(t,e,r)=>(t=new ise(t,r),e=new ise(e,r),t.intersects(e,r));sse.exports=z7e});var lse=_((HRt,ase)=>{var X7e=hB(),Z7e=Bc();ase.exports=(t,e,r)=>{let s=[],a=null,n=null,c=t.sort((E,C)=>Z7e(E,C,r));for(let E of c)X7e(E,e,r)?(n=E,a||(a=E)):(n&&s.push([a,n]),n=null,a=null);a&&s.push([a,null]);let f=[];for(let[E,C]of s)E===C?f.push(E):!C&&E===c[0]?f.push(\"*\"):C?E===c[0]?f.push(`<=${C}`):f.push(`${E} - ${C}`):f.push(`>=${E}`);let p=f.join(\" || \"),h=typeof e.raw==\"string\"?e.raw:String(e);return p.length<h.length?p:e}});var hse=_((jRt,pse)=>{var cse=vc(),Y_=AB(),{ANY:W_}=Y_,gB=hB(),V_=Bc(),$7e=(t,e,r={})=>{if(t===e)return!0;t=new cse(t,r),e=new cse(e,r);let s=!1;e:for(let a of t.set){for(let n of e.set){let c=tJe(a,n,r);if(s=s||c!==null,c)continue e}if(s)return!1}return!0},eJe=[new Y_(\">=0.0.0-0\")],use=[new Y_(\">=0.0.0\")],tJe=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===W_){if(e.length===1&&e[0].semver===W_)return!0;r.includePrerelease?t=eJe:t=use}if(e.length===1&&e[0].semver===W_){if(r.includePrerelease)return!0;e=use}let s=new Set,a,n;for(let P of t)P.operator===\">\"||P.operator===\">=\"?a=fse(a,P,r):P.operator===\"<\"||P.operator===\"<=\"?n=Ase(n,P,r):s.add(P.semver);if(s.size>1)return null;let c;if(a&&n){if(c=V_(a.semver,n.semver,r),c>0)return null;if(c===0&&(a.operator!==\">=\"||n.operator!==\"<=\"))return null}for(let P of s){if(a&&!gB(P,String(a),r)||n&&!gB(P,String(n),r))return null;for(let I of e)if(!gB(P,String(I),r))return!1;return!0}let f,p,h,E,C=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1,S=a&&!r.includePrerelease&&a.semver.prerelease.length?a.semver:!1;C&&C.prerelease.length===1&&n.operator===\"<\"&&C.prerelease[0]===0&&(C=!1);for(let P of e){if(E=E||P.operator===\">\"||P.operator===\">=\",h=h||P.operator===\"<\"||P.operator===\"<=\",a){if(S&&P.semver.prerelease&&P.semver.prerelease.length&&P.semver.major===S.major&&P.semver.minor===S.minor&&P.semver.patch===S.patch&&(S=!1),P.operator===\">\"||P.operator===\">=\"){if(f=fse(a,P,r),f===P&&f!==a)return!1}else if(a.operator===\">=\"&&!gB(a.semver,String(P),r))return!1}if(n){if(C&&P.semver.prerelease&&P.semver.prerelease.length&&P.semver.major===C.major&&P.semver.minor===C.minor&&P.semver.patch===C.patch&&(C=!1),P.operator===\"<\"||P.operator===\"<=\"){if(p=Ase(n,P,r),p===P&&p!==n)return!1}else if(n.operator===\"<=\"&&!gB(n.semver,String(P),r))return!1}if(!P.operator&&(n||a)&&c!==0)return!1}return!(a&&h&&!n&&c!==0||n&&E&&!a&&c!==0||S||C)},fse=(t,e,r)=>{if(!t)return e;let s=V_(t.semver,e.semver,r);return s>0?t:s<0||e.operator===\">\"&&t.operator===\">=\"?e:t},Ase=(t,e,r)=>{if(!t)return e;let s=V_(t.semver,e.semver,r);return s<0?t:s>0||e.operator===\"<\"&&t.operator===\"<=\"?e:t};pse.exports=$7e});var Ai=_((GRt,mse)=>{var J_=vE(),gse=aB(),rJe=jo(),dse=k_(),nJe=Md(),iJe=One(),sJe=Mne(),oJe=Hne(),aJe=qne(),lJe=Yne(),cJe=Jne(),uJe=zne(),fJe=Zne(),AJe=Bc(),pJe=rie(),hJe=iie(),gJe=Vx(),dJe=lie(),mJe=uie(),yJe=cB(),EJe=Jx(),IJe=T_(),CJe=R_(),wJe=Kx(),BJe=zx(),vJe=F_(),SJe=Eie(),DJe=AB(),bJe=vc(),PJe=hB(),xJe=_ie(),kJe=jie(),QJe=qie(),TJe=Vie(),RJe=Kie(),FJe=tk(),NJe=tse(),OJe=nse(),LJe=ose(),MJe=lse(),UJe=hse();mse.exports={parse:nJe,valid:iJe,clean:sJe,inc:oJe,diff:aJe,major:lJe,minor:cJe,patch:uJe,prerelease:fJe,compare:AJe,rcompare:pJe,compareLoose:hJe,compareBuild:gJe,sort:dJe,rsort:mJe,gt:yJe,lt:EJe,eq:IJe,neq:CJe,gte:wJe,lte:BJe,cmp:vJe,coerce:SJe,Comparator:DJe,Range:bJe,satisfies:PJe,toComparators:xJe,maxSatisfying:kJe,minSatisfying:QJe,minVersion:TJe,validRange:RJe,outside:FJe,gtr:NJe,ltr:OJe,intersects:LJe,simplifyRange:MJe,subset:UJe,SemVer:rJe,re:J_.re,src:J_.src,tokens:J_.t,SEMVER_SPEC_VERSION:gse.SEMVER_SPEC_VERSION,RELEASE_TYPES:gse.RELEASE_TYPES,compareIdentifiers:dse.compareIdentifiers,rcompareIdentifiers:dse.rcompareIdentifiers}});var Ese=_((qRt,yse)=>{\"use strict\";function _Je(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function jd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,jd)}_Je(jd,Error);jd.buildMessage=function(t,e){var r={literal:function(h){return'\"'+a(h.text)+'\"'},class:function(h){var E=\"\",C;for(C=0;C<h.parts.length;C++)E+=h.parts[C]instanceof Array?n(h.parts[C][0])+\"-\"+n(h.parts[C][1]):n(h.parts[C]);return\"[\"+(h.inverted?\"^\":\"\")+E+\"]\"},any:function(h){return\"any character\"},end:function(h){return\"end of input\"},other:function(h){return h.description}};function s(h){return h.charCodeAt(0).toString(16).toUpperCase()}function a(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+s(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+s(E)})}function n(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+s(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+s(E)})}function c(h){return r[h.type](h)}function f(h){var E=new Array(h.length),C,S;for(C=0;C<h.length;C++)E[C]=c(h[C]);if(E.sort(),E.length>0){for(C=1,S=1;C<E.length;C++)E[C-1]!==E[C]&&(E[S]=E[C],S++);E.length=S}switch(E.length){case 1:return E[0];case 2:return E[0]+\" or \"+E[1];default:return E.slice(0,-1).join(\", \")+\", or \"+E[E.length-1]}}function p(h){return h?'\"'+a(h)+'\"':\"end of input\"}return\"Expected \"+f(t)+\" but \"+p(e)+\" found.\"};function HJe(t,e){e=e!==void 0?e:{};var r={},s={Expression:y},a=y,n=\"|\",c=Fe(\"|\",!1),f=\"&\",p=Fe(\"&\",!1),h=\"^\",E=Fe(\"^\",!1),C=function($,oe){return!!oe.reduce((xe,Te)=>{switch(Te[1]){case\"|\":return xe|Te[3];case\"&\":return xe&Te[3];case\"^\":return xe^Te[3]}},$)},S=\"!\",P=Fe(\"!\",!1),I=function($){return!$},R=\"(\",N=Fe(\"(\",!1),U=\")\",W=Fe(\")\",!1),ee=function($){return $},ie=/^[^ \\t\\n\\r()!|&\\^]/,ue=Ne([\" \",\"\t\",`\n`,\"\\r\",\"(\",\")\",\"!\",\"|\",\"&\",\"^\"],!0,!1),le=function($){return e.queryPattern.test($)},me=function($){return e.checkFn($)},pe=ke(\"whitespace\"),Be=/^[ \\t\\n\\r]/,Ce=Ne([\" \",\"\t\",`\n`,\"\\r\"],!1,!1),g=0,we=0,ye=[{line:1,column:1}],Ae=0,se=[],Z=0,De;if(\"startRule\"in e){if(!(e.startRule in s))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');a=s[e.startRule]}function Re(){return t.substring(we,g)}function mt(){return Ue(we,g)}function j($,oe){throw oe=oe!==void 0?oe:Ue(we,g),b([ke($)],t.substring(we,g),oe)}function rt($,oe){throw oe=oe!==void 0?oe:Ue(we,g),w($,oe)}function Fe($,oe){return{type:\"literal\",text:$,ignoreCase:oe}}function Ne($,oe,xe){return{type:\"class\",parts:$,inverted:oe,ignoreCase:xe}}function Pe(){return{type:\"any\"}}function Ve(){return{type:\"end\"}}function ke($){return{type:\"other\",description:$}}function it($){var oe=ye[$],xe;if(oe)return oe;for(xe=$-1;!ye[xe];)xe--;for(oe=ye[xe],oe={line:oe.line,column:oe.column};xe<$;)t.charCodeAt(xe)===10?(oe.line++,oe.column=1):oe.column++,xe++;return ye[$]=oe,oe}function Ue($,oe){var xe=it($),Te=it(oe);return{start:{offset:$,line:xe.line,column:xe.column},end:{offset:oe,line:Te.line,column:Te.column}}}function x($){g<Ae||(g>Ae&&(Ae=g,se=[]),se.push($))}function w($,oe){return new jd($,null,null,oe)}function b($,oe,xe){return new jd(jd.buildMessage($,oe),$,oe,xe)}function y(){var $,oe,xe,Te,lt,Ct,qt,ir;if($=g,oe=F(),oe!==r){for(xe=[],Te=g,lt=X(),lt!==r?(t.charCodeAt(g)===124?(Ct=n,g++):(Ct=r,Z===0&&x(c)),Ct===r&&(t.charCodeAt(g)===38?(Ct=f,g++):(Ct=r,Z===0&&x(p)),Ct===r&&(t.charCodeAt(g)===94?(Ct=h,g++):(Ct=r,Z===0&&x(E)))),Ct!==r?(qt=X(),qt!==r?(ir=F(),ir!==r?(lt=[lt,Ct,qt,ir],Te=lt):(g=Te,Te=r)):(g=Te,Te=r)):(g=Te,Te=r)):(g=Te,Te=r);Te!==r;)xe.push(Te),Te=g,lt=X(),lt!==r?(t.charCodeAt(g)===124?(Ct=n,g++):(Ct=r,Z===0&&x(c)),Ct===r&&(t.charCodeAt(g)===38?(Ct=f,g++):(Ct=r,Z===0&&x(p)),Ct===r&&(t.charCodeAt(g)===94?(Ct=h,g++):(Ct=r,Z===0&&x(E)))),Ct!==r?(qt=X(),qt!==r?(ir=F(),ir!==r?(lt=[lt,Ct,qt,ir],Te=lt):(g=Te,Te=r)):(g=Te,Te=r)):(g=Te,Te=r)):(g=Te,Te=r);xe!==r?(we=$,oe=C(oe,xe),$=oe):(g=$,$=r)}else g=$,$=r;return $}function F(){var $,oe,xe,Te,lt,Ct;return $=g,t.charCodeAt(g)===33?(oe=S,g++):(oe=r,Z===0&&x(P)),oe!==r?(xe=F(),xe!==r?(we=$,oe=I(xe),$=oe):(g=$,$=r)):(g=$,$=r),$===r&&($=g,t.charCodeAt(g)===40?(oe=R,g++):(oe=r,Z===0&&x(N)),oe!==r?(xe=X(),xe!==r?(Te=y(),Te!==r?(lt=X(),lt!==r?(t.charCodeAt(g)===41?(Ct=U,g++):(Ct=r,Z===0&&x(W)),Ct!==r?(we=$,oe=ee(Te),$=oe):(g=$,$=r)):(g=$,$=r)):(g=$,$=r)):(g=$,$=r)):(g=$,$=r),$===r&&($=z())),$}function z(){var $,oe,xe,Te,lt;if($=g,oe=X(),oe!==r){if(xe=g,Te=[],ie.test(t.charAt(g))?(lt=t.charAt(g),g++):(lt=r,Z===0&&x(ue)),lt!==r)for(;lt!==r;)Te.push(lt),ie.test(t.charAt(g))?(lt=t.charAt(g),g++):(lt=r,Z===0&&x(ue));else Te=r;Te!==r?xe=t.substring(xe,g):xe=Te,xe!==r?(we=g,Te=le(xe),Te?Te=void 0:Te=r,Te!==r?(we=$,oe=me(xe),$=oe):(g=$,$=r)):(g=$,$=r)}else g=$,$=r;return $}function X(){var $,oe;for(Z++,$=[],Be.test(t.charAt(g))?(oe=t.charAt(g),g++):(oe=r,Z===0&&x(Ce));oe!==r;)$.push(oe),Be.test(t.charAt(g))?(oe=t.charAt(g),g++):(oe=r,Z===0&&x(Ce));return Z--,$===r&&(oe=r,Z===0&&x(pe)),$}if(De=a(),De!==r&&g===t.length)return De;throw De!==r&&g<t.length&&x(Ve()),b(se,Ae<t.length?t.charAt(Ae):null,Ae<t.length?Ue(Ae,Ae+1):Ue(Ae,Ae))}yse.exports={SyntaxError:jd,parse:HJe}});var Ise=_(rk=>{var{parse:jJe}=Ese();rk.makeParser=(t=/[a-z]+/)=>(e,r)=>jJe(e,{queryPattern:t,checkFn:r});rk.parse=rk.makeParser()});var wse=_((YRt,Cse)=>{\"use strict\";Cse.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var K_=_((VRt,vse)=>{var dB=wse(),Bse={};for(let t of Object.keys(dB))Bse[dB[t]]=t;var hr={rgb:{channels:3,labels:\"rgb\"},hsl:{channels:3,labels:\"hsl\"},hsv:{channels:3,labels:\"hsv\"},hwb:{channels:3,labels:\"hwb\"},cmyk:{channels:4,labels:\"cmyk\"},xyz:{channels:3,labels:\"xyz\"},lab:{channels:3,labels:\"lab\"},lch:{channels:3,labels:\"lch\"},hex:{channels:1,labels:[\"hex\"]},keyword:{channels:1,labels:[\"keyword\"]},ansi16:{channels:1,labels:[\"ansi16\"]},ansi256:{channels:1,labels:[\"ansi256\"]},hcg:{channels:3,labels:[\"h\",\"c\",\"g\"]},apple:{channels:3,labels:[\"r16\",\"g16\",\"b16\"]},gray:{channels:1,labels:[\"gray\"]}};vse.exports=hr;for(let t of Object.keys(hr)){if(!(\"channels\"in hr[t]))throw new Error(\"missing channels property: \"+t);if(!(\"labels\"in hr[t]))throw new Error(\"missing channel labels property: \"+t);if(hr[t].labels.length!==hr[t].channels)throw new Error(\"channel and label counts mismatch: \"+t);let{channels:e,labels:r}=hr[t];delete hr[t].channels,delete hr[t].labels,Object.defineProperty(hr[t],\"channels\",{value:e}),Object.defineProperty(hr[t],\"labels\",{value:r})}hr.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,s=t[2]/255,a=Math.min(e,r,s),n=Math.max(e,r,s),c=n-a,f,p;n===a?f=0:e===n?f=(r-s)/c:r===n?f=2+(s-e)/c:s===n&&(f=4+(e-r)/c),f=Math.min(f*60,360),f<0&&(f+=360);let h=(a+n)/2;return n===a?p=0:h<=.5?p=c/(n+a):p=c/(2-n-a),[f,p*100,h*100]};hr.rgb.hsv=function(t){let e,r,s,a,n,c=t[0]/255,f=t[1]/255,p=t[2]/255,h=Math.max(c,f,p),E=h-Math.min(c,f,p),C=function(S){return(h-S)/6/E+1/2};return E===0?(a=0,n=0):(n=E/h,e=C(c),r=C(f),s=C(p),c===h?a=s-r:f===h?a=1/3+e-s:p===h&&(a=2/3+r-e),a<0?a+=1:a>1&&(a-=1)),[a*360,n*100,h*100]};hr.rgb.hwb=function(t){let e=t[0],r=t[1],s=t[2],a=hr.rgb.hsl(t)[0],n=1/255*Math.min(e,Math.min(r,s));return s=1-1/255*Math.max(e,Math.max(r,s)),[a,n*100,s*100]};hr.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,s=t[2]/255,a=Math.min(1-e,1-r,1-s),n=(1-e-a)/(1-a)||0,c=(1-r-a)/(1-a)||0,f=(1-s-a)/(1-a)||0;return[n*100,c*100,f*100,a*100]};function GJe(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}hr.rgb.keyword=function(t){let e=Bse[t];if(e)return e;let r=1/0,s;for(let a of Object.keys(dB)){let n=dB[a],c=GJe(t,n);c<r&&(r=c,s=a)}return s};hr.keyword.rgb=function(t){return dB[t]};hr.rgb.xyz=function(t){let e=t[0]/255,r=t[1]/255,s=t[2]/255;e=e>.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,s=s>.04045?((s+.055)/1.055)**2.4:s/12.92;let a=e*.4124+r*.3576+s*.1805,n=e*.2126+r*.7152+s*.0722,c=e*.0193+r*.1192+s*.9505;return[a*100,n*100,c*100]};hr.rgb.lab=function(t){let e=hr.rgb.xyz(t),r=e[0],s=e[1],a=e[2];r/=95.047,s/=100,a/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,s=s>.008856?s**(1/3):7.787*s+16/116,a=a>.008856?a**(1/3):7.787*a+16/116;let n=116*s-16,c=500*(r-s),f=200*(s-a);return[n,c,f]};hr.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,s=t[2]/100,a,n,c;if(r===0)return c=s*255,[c,c,c];s<.5?a=s*(1+r):a=s+r-s*r;let f=2*s-a,p=[0,0,0];for(let h=0;h<3;h++)n=e+1/3*-(h-1),n<0&&n++,n>1&&n--,6*n<1?c=f+(a-f)*6*n:2*n<1?c=a:3*n<2?c=f+(a-f)*(2/3-n)*6:c=f,p[h]=c*255;return p};hr.hsl.hsv=function(t){let e=t[0],r=t[1]/100,s=t[2]/100,a=r,n=Math.max(s,.01);s*=2,r*=s<=1?s:2-s,a*=n<=1?n:2-n;let c=(s+r)/2,f=s===0?2*a/(n+a):2*r/(s+r);return[e,f*100,c*100]};hr.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,s=t[2]/100,a=Math.floor(e)%6,n=e-Math.floor(e),c=255*s*(1-r),f=255*s*(1-r*n),p=255*s*(1-r*(1-n));switch(s*=255,a){case 0:return[s,p,c];case 1:return[f,s,c];case 2:return[c,s,p];case 3:return[c,f,s];case 4:return[p,c,s];case 5:return[s,c,f]}};hr.hsv.hsl=function(t){let e=t[0],r=t[1]/100,s=t[2]/100,a=Math.max(s,.01),n,c;c=(2-r)*s;let f=(2-r)*a;return n=r*a,n/=f<=1?f:2-f,n=n||0,c/=2,[e,n*100,c*100]};hr.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,s=t[2]/100,a=r+s,n;a>1&&(r/=a,s/=a);let c=Math.floor(6*e),f=1-s;n=6*e-c,c&1&&(n=1-n);let p=r+n*(f-r),h,E,C;switch(c){default:case 6:case 0:h=f,E=p,C=r;break;case 1:h=p,E=f,C=r;break;case 2:h=r,E=f,C=p;break;case 3:h=r,E=p,C=f;break;case 4:h=p,E=r,C=f;break;case 5:h=f,E=r,C=p;break}return[h*255,E*255,C*255]};hr.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,s=t[2]/100,a=t[3]/100,n=1-Math.min(1,e*(1-a)+a),c=1-Math.min(1,r*(1-a)+a),f=1-Math.min(1,s*(1-a)+a);return[n*255,c*255,f*255]};hr.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,s=t[2]/100,a,n,c;return a=e*3.2406+r*-1.5372+s*-.4986,n=e*-.9689+r*1.8758+s*.0415,c=e*.0557+r*-.204+s*1.057,a=a>.0031308?1.055*a**(1/2.4)-.055:a*12.92,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,c=c>.0031308?1.055*c**(1/2.4)-.055:c*12.92,a=Math.min(Math.max(0,a),1),n=Math.min(Math.max(0,n),1),c=Math.min(Math.max(0,c),1),[a*255,n*255,c*255]};hr.xyz.lab=function(t){let e=t[0],r=t[1],s=t[2];e/=95.047,r/=100,s/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,s=s>.008856?s**(1/3):7.787*s+16/116;let a=116*r-16,n=500*(e-r),c=200*(r-s);return[a,n,c]};hr.lab.xyz=function(t){let e=t[0],r=t[1],s=t[2],a,n,c;n=(e+16)/116,a=r/500+n,c=n-s/200;let f=n**3,p=a**3,h=c**3;return n=f>.008856?f:(n-16/116)/7.787,a=p>.008856?p:(a-16/116)/7.787,c=h>.008856?h:(c-16/116)/7.787,a*=95.047,n*=100,c*=108.883,[a,n,c]};hr.lab.lch=function(t){let e=t[0],r=t[1],s=t[2],a;a=Math.atan2(s,r)*360/2/Math.PI,a<0&&(a+=360);let c=Math.sqrt(r*r+s*s);return[e,c,a]};hr.lch.lab=function(t){let e=t[0],r=t[1],a=t[2]/360*2*Math.PI,n=r*Math.cos(a),c=r*Math.sin(a);return[e,n,c]};hr.rgb.ansi16=function(t,e=null){let[r,s,a]=t,n=e===null?hr.rgb.hsv(t)[2]:e;if(n=Math.round(n/50),n===0)return 30;let c=30+(Math.round(a/255)<<2|Math.round(s/255)<<1|Math.round(r/255));return n===2&&(c+=60),c};hr.hsv.ansi16=function(t){return hr.rgb.ansi16(hr.hsv.rgb(t),t[2])};hr.rgb.ansi256=function(t){let e=t[0],r=t[1],s=t[2];return e===r&&r===s?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(s/255*5)};hr.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,s=(e&1)*r*255,a=(e>>1&1)*r*255,n=(e>>2&1)*r*255;return[s,a,n]};hr.ansi256.rgb=function(t){if(t>=232){let n=(t-232)*10+8;return[n,n,n]}t-=16;let e,r=Math.floor(t/36)/5*255,s=Math.floor((e=t%36)/6)/5*255,a=e%6/5*255;return[r,s,a]};hr.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return\"000000\".substring(r.length)+r};hr.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split(\"\").map(f=>f+f).join(\"\"));let s=parseInt(r,16),a=s>>16&255,n=s>>8&255,c=s&255;return[a,n,c]};hr.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,s=t[2]/255,a=Math.max(Math.max(e,r),s),n=Math.min(Math.min(e,r),s),c=a-n,f,p;return c<1?f=n/(1-c):f=0,c<=0?p=0:a===e?p=(r-s)/c%6:a===r?p=2+(s-e)/c:p=4+(e-r)/c,p/=6,p%=1,[p*360,c*100,f*100]};hr.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,s=r<.5?2*e*r:2*e*(1-r),a=0;return s<1&&(a=(r-.5*s)/(1-s)),[t[0],s*100,a*100]};hr.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,s=e*r,a=0;return s<1&&(a=(r-s)/(1-s)),[t[0],s*100,a*100]};hr.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,s=t[2]/100;if(r===0)return[s*255,s*255,s*255];let a=[0,0,0],n=e%1*6,c=n%1,f=1-c,p=0;switch(Math.floor(n)){case 0:a[0]=1,a[1]=c,a[2]=0;break;case 1:a[0]=f,a[1]=1,a[2]=0;break;case 2:a[0]=0,a[1]=1,a[2]=c;break;case 3:a[0]=0,a[1]=f,a[2]=1;break;case 4:a[0]=c,a[1]=0,a[2]=1;break;default:a[0]=1,a[1]=0,a[2]=f}return p=(1-r)*s,[(r*a[0]+p)*255,(r*a[1]+p)*255,(r*a[2]+p)*255]};hr.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,s=e+r*(1-e),a=0;return s>0&&(a=e/s),[t[0],a*100,s*100]};hr.hcg.hsl=function(t){let e=t[1]/100,s=t[2]/100*(1-e)+.5*e,a=0;return s>0&&s<.5?a=e/(2*s):s>=.5&&s<1&&(a=e/(2*(1-s))),[t[0],a*100,s*100]};hr.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,s=e+r*(1-e);return[t[0],(s-e)*100,(1-s)*100]};hr.hwb.hcg=function(t){let e=t[1]/100,s=1-t[2]/100,a=s-e,n=0;return a<1&&(n=(s-a)/(1-a)),[t[0],a*100,n*100]};hr.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};hr.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};hr.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};hr.gray.hsl=function(t){return[0,0,t[0]]};hr.gray.hsv=hr.gray.hsl;hr.gray.hwb=function(t){return[0,100,t[0]]};hr.gray.cmyk=function(t){return[0,0,0,t[0]]};hr.gray.lab=function(t){return[t[0],0,0]};hr.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,s=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return\"000000\".substring(s.length)+s};hr.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var Dse=_((JRt,Sse)=>{var nk=K_();function qJe(){let t={},e=Object.keys(nk);for(let r=e.length,s=0;s<r;s++)t[e[s]]={distance:-1,parent:null};return t}function WJe(t){let e=qJe(),r=[t];for(e[t].distance=0;r.length;){let s=r.pop(),a=Object.keys(nk[s]);for(let n=a.length,c=0;c<n;c++){let f=a[c],p=e[f];p.distance===-1&&(p.distance=e[s].distance+1,p.parent=s,r.unshift(f))}}return e}function YJe(t,e){return function(r){return e(t(r))}}function VJe(t,e){let r=[e[t].parent,t],s=nk[e[t].parent][t],a=e[t].parent;for(;e[a].parent;)r.unshift(e[a].parent),s=YJe(nk[e[a].parent][a],s),a=e[a].parent;return s.conversion=r,s}Sse.exports=function(t){let e=WJe(t),r={},s=Object.keys(e);for(let a=s.length,n=0;n<a;n++){let c=s[n];e[c].parent!==null&&(r[c]=VJe(c,e))}return r}});var Pse=_((KRt,bse)=>{var z_=K_(),JJe=Dse(),PE={},KJe=Object.keys(z_);function zJe(t){let e=function(...r){let s=r[0];return s==null?s:(s.length>1&&(r=s),t(r))};return\"conversion\"in t&&(e.conversion=t.conversion),e}function XJe(t){let e=function(...r){let s=r[0];if(s==null)return s;s.length>1&&(r=s);let a=t(r);if(typeof a==\"object\")for(let n=a.length,c=0;c<n;c++)a[c]=Math.round(a[c]);return a};return\"conversion\"in t&&(e.conversion=t.conversion),e}KJe.forEach(t=>{PE[t]={},Object.defineProperty(PE[t],\"channels\",{value:z_[t].channels}),Object.defineProperty(PE[t],\"labels\",{value:z_[t].labels});let e=JJe(t);Object.keys(e).forEach(s=>{let a=e[s];PE[t][s]=XJe(a),PE[t][s].raw=zJe(a)})});bse.exports=PE});var sk=_((zRt,Rse)=>{\"use strict\";var xse=(t,e)=>(...r)=>`\\x1B[${t(...r)+e}m`,kse=(t,e)=>(...r)=>{let s=t(...r);return`\\x1B[${38+e};5;${s}m`},Qse=(t,e)=>(...r)=>{let s=t(...r);return`\\x1B[${38+e};2;${s[0]};${s[1]};${s[2]}m`},ik=t=>t,Tse=(t,e,r)=>[t,e,r],xE=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let s=r();return Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0}),s},enumerable:!0,configurable:!0})},X_,kE=(t,e,r,s)=>{X_===void 0&&(X_=Pse());let a=s?10:0,n={};for(let[c,f]of Object.entries(X_)){let p=c===\"ansi16\"?\"ansi\":c;c===e?n[p]=t(r,a):typeof f==\"object\"&&(n[p]=t(f[e],a))}return n};function ZJe(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,s]of Object.entries(e)){for(let[a,n]of Object.entries(s))e[a]={open:`\\x1B[${n[0]}m`,close:`\\x1B[${n[1]}m`},s[a]=e[a],t.set(n[0],n[1]);Object.defineProperty(e,r,{value:s,enumerable:!1})}return Object.defineProperty(e,\"codes\",{value:t,enumerable:!1}),e.color.close=\"\\x1B[39m\",e.bgColor.close=\"\\x1B[49m\",xE(e.color,\"ansi\",()=>kE(xse,\"ansi16\",ik,!1)),xE(e.color,\"ansi256\",()=>kE(kse,\"ansi256\",ik,!1)),xE(e.color,\"ansi16m\",()=>kE(Qse,\"rgb\",Tse,!1)),xE(e.bgColor,\"ansi\",()=>kE(xse,\"ansi16\",ik,!0)),xE(e.bgColor,\"ansi256\",()=>kE(kse,\"ansi256\",ik,!0)),xE(e.bgColor,\"ansi16m\",()=>kE(Qse,\"rgb\",Tse,!0)),e}Object.defineProperty(Rse,\"exports\",{enumerable:!0,get:ZJe})});var Nse=_((XRt,Fse)=>{\"use strict\";Fse.exports=(t,e=process.argv)=>{let r=t.startsWith(\"-\")?\"\":t.length===1?\"-\":\"--\",s=e.indexOf(r+t),a=e.indexOf(\"--\");return s!==-1&&(a===-1||s<a)}});var Mse=_((ZRt,Lse)=>{\"use strict\";var $Je=Ie(\"os\"),Ose=Ie(\"tty\"),Sc=Nse(),{env:bs}=process,l0;Sc(\"no-color\")||Sc(\"no-colors\")||Sc(\"color=false\")||Sc(\"color=never\")?l0=0:(Sc(\"color\")||Sc(\"colors\")||Sc(\"color=true\")||Sc(\"color=always\"))&&(l0=1);\"FORCE_COLOR\"in bs&&(bs.FORCE_COLOR===\"true\"?l0=1:bs.FORCE_COLOR===\"false\"?l0=0:l0=bs.FORCE_COLOR.length===0?1:Math.min(parseInt(bs.FORCE_COLOR,10),3));function Z_(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function $_(t,e){if(l0===0)return 0;if(Sc(\"color=16m\")||Sc(\"color=full\")||Sc(\"color=truecolor\"))return 3;if(Sc(\"color=256\"))return 2;if(t&&!e&&l0===void 0)return 0;let r=l0||0;if(bs.TERM===\"dumb\")return r;if(process.platform===\"win32\"){let s=$Je.release().split(\".\");return Number(s[0])>=10&&Number(s[2])>=10586?Number(s[2])>=14931?3:2:1}if(\"CI\"in bs)return[\"TRAVIS\",\"CIRCLECI\",\"APPVEYOR\",\"GITLAB_CI\"].some(s=>s in bs)||bs.CI_NAME===\"codeship\"?1:r;if(\"TEAMCITY_VERSION\"in bs)return/^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(bs.TEAMCITY_VERSION)?1:0;if(\"GITHUB_ACTIONS\"in bs)return 1;if(bs.COLORTERM===\"truecolor\")return 3;if(\"TERM_PROGRAM\"in bs){let s=parseInt((bs.TERM_PROGRAM_VERSION||\"\").split(\".\")[0],10);switch(bs.TERM_PROGRAM){case\"iTerm.app\":return s>=3?3:2;case\"Apple_Terminal\":return 2}}return/-256(color)?$/i.test(bs.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(bs.TERM)||\"COLORTERM\"in bs?1:r}function eKe(t){let e=$_(t,t&&t.isTTY);return Z_(e)}Lse.exports={supportsColor:eKe,stdout:Z_($_(!0,Ose.isatty(1))),stderr:Z_($_(!0,Ose.isatty(2)))}});var _se=_(($Rt,Use)=>{\"use strict\";var tKe=(t,e,r)=>{let s=t.indexOf(e);if(s===-1)return t;let a=e.length,n=0,c=\"\";do c+=t.substr(n,s-n)+e+r,n=s+a,s=t.indexOf(e,n);while(s!==-1);return c+=t.substr(n),c},rKe=(t,e,r,s)=>{let a=0,n=\"\";do{let c=t[s-1]===\"\\r\";n+=t.substr(a,(c?s-1:s)-a)+e+(c?`\\r\n`:`\n`)+r,a=s+1,s=t.indexOf(`\n`,a)}while(s!==-1);return n+=t.substr(a),n};Use.exports={stringReplaceAll:tKe,stringEncaseCRLFWithFirstIndex:rKe}});var Wse=_((eFt,qse)=>{\"use strict\";var nKe=/(?:\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi,Hse=/(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g,iKe=/^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/,sKe=/\\\\(u(?:[a-f\\d]{4}|{[a-f\\d]{1,6}})|x[a-f\\d]{2}|.)|([^\\\\])/gi,oKe=new Map([[\"n\",`\n`],[\"r\",\"\\r\"],[\"t\",\"\t\"],[\"b\",\"\\b\"],[\"f\",\"\\f\"],[\"v\",\"\\v\"],[\"0\",\"\\0\"],[\"\\\\\",\"\\\\\"],[\"e\",\"\\x1B\"],[\"a\",\"\\x07\"]]);function Gse(t){let e=t[0]===\"u\",r=t[1]===\"{\";return e&&!r&&t.length===5||t[0]===\"x\"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):oKe.get(t)||t}function aKe(t,e){let r=[],s=e.trim().split(/\\s*,\\s*/g),a;for(let n of s){let c=Number(n);if(!Number.isNaN(c))r.push(c);else if(a=n.match(iKe))r.push(a[2].replace(sKe,(f,p,h)=>p?Gse(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function lKe(t){Hse.lastIndex=0;let e=[],r;for(;(r=Hse.exec(t))!==null;){let s=r[1];if(r[2]){let a=aKe(s,r[2]);e.push([s].concat(a))}else e.push([s])}return e}function jse(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let s=t;for(let[a,n]of Object.entries(r))if(Array.isArray(n)){if(!(a in s))throw new Error(`Unknown Chalk style: ${a}`);s=n.length>0?s[a](...n):s[a]}return s}qse.exports=(t,e)=>{let r=[],s=[],a=[];if(e.replace(nKe,(n,c,f,p,h,E)=>{if(c)a.push(Gse(c));else if(p){let C=a.join(\"\");a=[],s.push(r.length===0?C:jse(t,r)(C)),r.push({inverse:f,styles:lKe(p)})}else if(h){if(r.length===0)throw new Error(\"Found extraneous } in Chalk template literal\");s.push(jse(t,r)(a.join(\"\"))),a=[],r.pop()}else a.push(E)}),s.push(a.join(\"\")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?\"\":\"s\"} (\\`}\\`)`;throw new Error(n)}return s.join(\"\")}});var TE=_((tFt,Xse)=>{\"use strict\";var mB=sk(),{stdout:t4,stderr:r4}=Mse(),{stringReplaceAll:cKe,stringEncaseCRLFWithFirstIndex:uKe}=_se(),{isArray:ok}=Array,Vse=[\"ansi\",\"ansi\",\"ansi256\",\"ansi16m\"],QE=Object.create(null),fKe=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error(\"The `level` option should be an integer from 0 to 3\");let r=t4?t4.level:0;t.level=e.level===void 0?r:e.level},n4=class{constructor(e){return Jse(e)}},Jse=t=>{let e={};return fKe(e,t),e.template=(...r)=>zse(e.template,...r),Object.setPrototypeOf(e,ak.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error(\"`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.\")},e.template.Instance=n4,e.template};function ak(t){return Jse(t)}for(let[t,e]of Object.entries(mB))QE[t]={get(){let r=lk(this,i4(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};QE.visible={get(){let t=lk(this,this._styler,!0);return Object.defineProperty(this,\"visible\",{value:t}),t}};var Kse=[\"rgb\",\"hex\",\"keyword\",\"hsl\",\"hsv\",\"hwb\",\"ansi\",\"ansi256\"];for(let t of Kse)QE[t]={get(){let{level:e}=this;return function(...r){let s=i4(mB.color[Vse[e]][t](...r),mB.color.close,this._styler);return lk(this,s,this._isEmpty)}}};for(let t of Kse){let e=\"bg\"+t[0].toUpperCase()+t.slice(1);QE[e]={get(){let{level:r}=this;return function(...s){let a=i4(mB.bgColor[Vse[r]][t](...s),mB.bgColor.close,this._styler);return lk(this,a,this._isEmpty)}}}}var AKe=Object.defineProperties(()=>{},{...QE,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),i4=(t,e,r)=>{let s,a;return r===void 0?(s=t,a=e):(s=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:s,closeAll:a,parent:r}},lk=(t,e,r)=>{let s=(...a)=>ok(a[0])&&ok(a[0].raw)?Yse(s,zse(s,...a)):Yse(s,a.length===1?\"\"+a[0]:a.join(\" \"));return Object.setPrototypeOf(s,AKe),s._generator=t,s._styler=e,s._isEmpty=r,s},Yse=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?\"\":e;let r=t._styler;if(r===void 0)return e;let{openAll:s,closeAll:a}=r;if(e.indexOf(\"\\x1B\")!==-1)for(;r!==void 0;)e=cKe(e,r.close,r.open),r=r.parent;let n=e.indexOf(`\n`);return n!==-1&&(e=uKe(e,a,s,n)),s+e+a},e4,zse=(t,...e)=>{let[r]=e;if(!ok(r)||!ok(r.raw))return e.join(\" \");let s=e.slice(1),a=[r.raw[0]];for(let n=1;n<r.length;n++)a.push(String(s[n-1]).replace(/[{}\\\\]/g,\"\\\\$&\"),String(r.raw[n]));return e4===void 0&&(e4=Wse()),e4(t,a.join(\"\"))};Object.defineProperties(ak.prototype,QE);var ck=ak();ck.supportsColor=t4;ck.stderr=ak({level:r4?r4.level:0});ck.stderr.supportsColor=r4;Xse.exports=ck});var uk=_(Dc=>{\"use strict\";Dc.isInteger=t=>typeof t==\"number\"?Number.isInteger(t):typeof t==\"string\"&&t.trim()!==\"\"?Number.isInteger(Number(t)):!1;Dc.find=(t,e)=>t.nodes.find(r=>r.type===e);Dc.exceedsLimit=(t,e,r=1,s)=>s===!1||!Dc.isInteger(t)||!Dc.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=s;Dc.escapeNode=(t,e=0,r)=>{let s=t.nodes[e];s&&(r&&s.type===r||s.type===\"open\"||s.type===\"close\")&&s.escaped!==!0&&(s.value=\"\\\\\"+s.value,s.escaped=!0)};Dc.encloseBrace=t=>t.type!==\"brace\"||t.commas>>0+t.ranges>>0?!1:(t.invalid=!0,!0);Dc.isInvalidBrace=t=>t.type!==\"brace\"?!1:t.invalid===!0||t.dollar?!0:!(t.commas>>0+t.ranges>>0)||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;Dc.isOpenOrClose=t=>t.type===\"open\"||t.type===\"close\"?!0:t.open===!0||t.close===!0;Dc.reduce=t=>t.reduce((e,r)=>(r.type===\"text\"&&e.push(r.value),r.type===\"range\"&&(r.type=\"text\"),e),[]);Dc.flatten=(...t)=>{let e=[],r=s=>{for(let a=0;a<s.length;a++){let n=s[a];Array.isArray(n)?r(n,e):n!==void 0&&e.push(n)}return e};return r(t),e}});var fk=_((nFt,$se)=>{\"use strict\";var Zse=uk();$se.exports=(t,e={})=>{let r=(s,a={})=>{let n=e.escapeInvalid&&Zse.isInvalidBrace(a),c=s.invalid===!0&&e.escapeInvalid===!0,f=\"\";if(s.value)return(n||c)&&Zse.isOpenOrClose(s)?\"\\\\\"+s.value:s.value;if(s.value)return s.value;if(s.nodes)for(let p of s.nodes)f+=r(p);return f};return r(t)}});var toe=_((iFt,eoe)=>{\"use strict\";eoe.exports=function(t){return typeof t==\"number\"?t-t===0:typeof t==\"string\"&&t.trim()!==\"\"?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var uoe=_((sFt,coe)=>{\"use strict\";var roe=toe(),Gd=(t,e,r)=>{if(roe(t)===!1)throw new TypeError(\"toRegexRange: expected the first argument to be a number\");if(e===void 0||t===e)return String(t);if(roe(e)===!1)throw new TypeError(\"toRegexRange: expected the second argument to be a number.\");let s={relaxZeros:!0,...r};typeof s.strictZeros==\"boolean\"&&(s.relaxZeros=s.strictZeros===!1);let a=String(s.relaxZeros),n=String(s.shorthand),c=String(s.capture),f=String(s.wrap),p=t+\":\"+e+\"=\"+a+n+c+f;if(Gd.cache.hasOwnProperty(p))return Gd.cache[p].result;let h=Math.min(t,e),E=Math.max(t,e);if(Math.abs(h-E)===1){let R=t+\"|\"+e;return s.capture?`(${R})`:s.wrap===!1?R:`(?:${R})`}let C=loe(t)||loe(e),S={min:t,max:e,a:h,b:E},P=[],I=[];if(C&&(S.isPadded=C,S.maxLen=String(S.max).length),h<0){let R=E<0?Math.abs(E):1;I=noe(R,Math.abs(h),S,s),h=S.a=0}return E>=0&&(P=noe(h,E,S,s)),S.negatives=I,S.positives=P,S.result=pKe(I,P,s),s.capture===!0?S.result=`(${S.result})`:s.wrap!==!1&&P.length+I.length>1&&(S.result=`(?:${S.result})`),Gd.cache[p]=S,S.result};function pKe(t,e,r){let s=s4(t,e,\"-\",!1,r)||[],a=s4(e,t,\"\",!1,r)||[],n=s4(t,e,\"-?\",!0,r)||[];return s.concat(n).concat(a).join(\"|\")}function hKe(t,e){let r=1,s=1,a=soe(t,r),n=new Set([e]);for(;t<=a&&a<=e;)n.add(a),r+=1,a=soe(t,r);for(a=ooe(e+1,s)-1;t<a&&a<=e;)n.add(a),s+=1,a=ooe(e+1,s)-1;return n=[...n],n.sort(mKe),n}function gKe(t,e,r){if(t===e)return{pattern:t,count:[],digits:0};let s=dKe(t,e),a=s.length,n=\"\",c=0;for(let f=0;f<a;f++){let[p,h]=s[f];p===h?n+=p:p!==\"0\"||h!==\"9\"?n+=yKe(p,h,r):c++}return c&&(n+=r.shorthand===!0?\"\\\\d\":\"[0-9]\"),{pattern:n,count:[c],digits:a}}function noe(t,e,r,s){let a=hKe(t,e),n=[],c=t,f;for(let p=0;p<a.length;p++){let h=a[p],E=gKe(String(c),String(h),s),C=\"\";if(!r.isPadded&&f&&f.pattern===E.pattern){f.count.length>1&&f.count.pop(),f.count.push(E.count[0]),f.string=f.pattern+aoe(f.count),c=h+1;continue}r.isPadded&&(C=EKe(h,r,s)),E.string=C+E.pattern+aoe(E.count),n.push(E),c=h+1,f=E}return n}function s4(t,e,r,s,a){let n=[];for(let c of t){let{string:f}=c;!s&&!ioe(e,\"string\",f)&&n.push(r+f),s&&ioe(e,\"string\",f)&&n.push(r+f)}return n}function dKe(t,e){let r=[];for(let s=0;s<t.length;s++)r.push([t[s],e[s]]);return r}function mKe(t,e){return t>e?1:e>t?-1:0}function ioe(t,e,r){return t.some(s=>s[e]===r)}function soe(t,e){return Number(String(t).slice(0,-e)+\"9\".repeat(e))}function ooe(t,e){return t-t%Math.pow(10,e)}function aoe(t){let[e=0,r=\"\"]=t;return r||e>1?`{${e+(r?\",\"+r:\"\")}}`:\"\"}function yKe(t,e,r){return`[${t}${e-t===1?\"\":\"-\"}${e}]`}function loe(t){return/^-?(0+)\\d/.test(t)}function EKe(t,e,r){if(!e.isPadded)return t;let s=Math.abs(e.maxLen-String(t).length),a=r.relaxZeros!==!1;switch(s){case 0:return\"\";case 1:return a?\"0?\":\"0\";case 2:return a?\"0{0,2}\":\"00\";default:return a?`0{0,${s}}`:`0{${s}}`}}Gd.cache={};Gd.clearCache=()=>Gd.cache={};coe.exports=Gd});var l4=_((oFt,yoe)=>{\"use strict\";var IKe=Ie(\"util\"),poe=uoe(),foe=t=>t!==null&&typeof t==\"object\"&&!Array.isArray(t),CKe=t=>e=>t===!0?Number(e):String(e),o4=t=>typeof t==\"number\"||typeof t==\"string\"&&t!==\"\",yB=t=>Number.isInteger(+t),a4=t=>{let e=`${t}`,r=-1;if(e[0]===\"-\"&&(e=e.slice(1)),e===\"0\")return!1;for(;e[++r]===\"0\";);return r>0},wKe=(t,e,r)=>typeof t==\"string\"||typeof e==\"string\"?!0:r.stringify===!0,BKe=(t,e,r)=>{if(e>0){let s=t[0]===\"-\"?\"-\":\"\";s&&(t=t.slice(1)),t=s+t.padStart(s?e-1:e,\"0\")}return r===!1?String(t):t},Aoe=(t,e)=>{let r=t[0]===\"-\"?\"-\":\"\";for(r&&(t=t.slice(1),e--);t.length<e;)t=\"0\"+t;return r?\"-\"+t:t},vKe=(t,e)=>{t.negatives.sort((c,f)=>c<f?-1:c>f?1:0),t.positives.sort((c,f)=>c<f?-1:c>f?1:0);let r=e.capture?\"\":\"?:\",s=\"\",a=\"\",n;return t.positives.length&&(s=t.positives.join(\"|\")),t.negatives.length&&(a=`-(${r}${t.negatives.join(\"|\")})`),s&&a?n=`${s}|${a}`:n=s||a,e.wrap?`(${r}${n})`:n},hoe=(t,e,r,s)=>{if(r)return poe(t,e,{wrap:!1,...s});let a=String.fromCharCode(t);if(t===e)return a;let n=String.fromCharCode(e);return`[${a}-${n}]`},goe=(t,e,r)=>{if(Array.isArray(t)){let s=r.wrap===!0,a=r.capture?\"\":\"?:\";return s?`(${a}${t.join(\"|\")})`:t.join(\"|\")}return poe(t,e,r)},doe=(...t)=>new RangeError(\"Invalid range arguments: \"+IKe.inspect(...t)),moe=(t,e,r)=>{if(r.strictRanges===!0)throw doe([t,e]);return[]},SKe=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step \"${t}\" to be a number`);return[]},DKe=(t,e,r=1,s={})=>{let a=Number(t),n=Number(e);if(!Number.isInteger(a)||!Number.isInteger(n)){if(s.strictRanges===!0)throw doe([t,e]);return[]}a===0&&(a=0),n===0&&(n=0);let c=a>n,f=String(t),p=String(e),h=String(r);r=Math.max(Math.abs(r),1);let E=a4(f)||a4(p)||a4(h),C=E?Math.max(f.length,p.length,h.length):0,S=E===!1&&wKe(t,e,s)===!1,P=s.transform||CKe(S);if(s.toRegex&&r===1)return hoe(Aoe(t,C),Aoe(e,C),!0,s);let I={negatives:[],positives:[]},R=W=>I[W<0?\"negatives\":\"positives\"].push(Math.abs(W)),N=[],U=0;for(;c?a>=n:a<=n;)s.toRegex===!0&&r>1?R(a):N.push(BKe(P(a,U),C,S)),a=c?a-r:a+r,U++;return s.toRegex===!0?r>1?vKe(I,s):goe(N,null,{wrap:!1,...s}):N},bKe=(t,e,r=1,s={})=>{if(!yB(t)&&t.length>1||!yB(e)&&e.length>1)return moe(t,e,s);let a=s.transform||(S=>String.fromCharCode(S)),n=`${t}`.charCodeAt(0),c=`${e}`.charCodeAt(0),f=n>c,p=Math.min(n,c),h=Math.max(n,c);if(s.toRegex&&r===1)return hoe(p,h,!1,s);let E=[],C=0;for(;f?n>=c:n<=c;)E.push(a(n,C)),n=f?n-r:n+r,C++;return s.toRegex===!0?goe(E,null,{wrap:!1,options:s}):E},Ak=(t,e,r,s={})=>{if(e==null&&o4(t))return[t];if(!o4(t)||!o4(e))return moe(t,e,s);if(typeof r==\"function\")return Ak(t,e,1,{transform:r});if(foe(r))return Ak(t,e,0,r);let a={...s};return a.capture===!0&&(a.wrap=!0),r=r||a.step||1,yB(r)?yB(t)&&yB(e)?DKe(t,e,r,a):bKe(t,e,Math.max(Math.abs(r),1),a):r!=null&&!foe(r)?SKe(r,a):Ak(t,e,1,r)};yoe.exports=Ak});var Coe=_((aFt,Ioe)=>{\"use strict\";var PKe=l4(),Eoe=uk(),xKe=(t,e={})=>{let r=(s,a={})=>{let n=Eoe.isInvalidBrace(a),c=s.invalid===!0&&e.escapeInvalid===!0,f=n===!0||c===!0,p=e.escapeInvalid===!0?\"\\\\\":\"\",h=\"\";if(s.isOpen===!0||s.isClose===!0)return p+s.value;if(s.type===\"open\")return f?p+s.value:\"(\";if(s.type===\"close\")return f?p+s.value:\")\";if(s.type===\"comma\")return s.prev.type===\"comma\"?\"\":f?s.value:\"|\";if(s.value)return s.value;if(s.nodes&&s.ranges>0){let E=Eoe.reduce(s.nodes),C=PKe(...E,{...e,wrap:!1,toRegex:!0});if(C.length!==0)return E.length>1&&C.length>1?`(${C})`:C}if(s.nodes)for(let E of s.nodes)h+=r(E,s);return h};return r(t)};Ioe.exports=xKe});var voe=_((lFt,Boe)=>{\"use strict\";var kKe=l4(),woe=fk(),RE=uk(),qd=(t=\"\",e=\"\",r=!1)=>{let s=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?RE.flatten(e).map(a=>`{${a}}`):e;for(let a of t)if(Array.isArray(a))for(let n of a)s.push(qd(n,e,r));else for(let n of e)r===!0&&typeof n==\"string\"&&(n=`{${n}}`),s.push(Array.isArray(n)?qd(a,n,r):a+n);return RE.flatten(s)},QKe=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,s=(a,n={})=>{a.queue=[];let c=n,f=n.queue;for(;c.type!==\"brace\"&&c.type!==\"root\"&&c.parent;)c=c.parent,f=c.queue;if(a.invalid||a.dollar){f.push(qd(f.pop(),woe(a,e)));return}if(a.type===\"brace\"&&a.invalid!==!0&&a.nodes.length===2){f.push(qd(f.pop(),[\"{}\"]));return}if(a.nodes&&a.ranges>0){let C=RE.reduce(a.nodes);if(RE.exceedsLimit(...C,e.step,r))throw new RangeError(\"expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.\");let S=kKe(...C,e);S.length===0&&(S=woe(a,e)),f.push(qd(f.pop(),S)),a.nodes=[];return}let p=RE.encloseBrace(a),h=a.queue,E=a;for(;E.type!==\"brace\"&&E.type!==\"root\"&&E.parent;)E=E.parent,h=E.queue;for(let C=0;C<a.nodes.length;C++){let S=a.nodes[C];if(S.type===\"comma\"&&a.type===\"brace\"){C===1&&h.push(\"\"),h.push(\"\");continue}if(S.type===\"close\"){f.push(qd(f.pop(),h,p));continue}if(S.value&&S.type!==\"open\"){h.push(qd(h.pop(),S.value));continue}S.nodes&&s(S,a)}return h};return RE.flatten(s(t))};Boe.exports=QKe});var Doe=_((cFt,Soe)=>{\"use strict\";Soe.exports={MAX_LENGTH:1024*64,CHAR_0:\"0\",CHAR_9:\"9\",CHAR_UPPERCASE_A:\"A\",CHAR_LOWERCASE_A:\"a\",CHAR_UPPERCASE_Z:\"Z\",CHAR_LOWERCASE_Z:\"z\",CHAR_LEFT_PARENTHESES:\"(\",CHAR_RIGHT_PARENTHESES:\")\",CHAR_ASTERISK:\"*\",CHAR_AMPERSAND:\"&\",CHAR_AT:\"@\",CHAR_BACKSLASH:\"\\\\\",CHAR_BACKTICK:\"`\",CHAR_CARRIAGE_RETURN:\"\\r\",CHAR_CIRCUMFLEX_ACCENT:\"^\",CHAR_COLON:\":\",CHAR_COMMA:\",\",CHAR_DOLLAR:\"$\",CHAR_DOT:\".\",CHAR_DOUBLE_QUOTE:'\"',CHAR_EQUAL:\"=\",CHAR_EXCLAMATION_MARK:\"!\",CHAR_FORM_FEED:\"\\f\",CHAR_FORWARD_SLASH:\"/\",CHAR_HASH:\"#\",CHAR_HYPHEN_MINUS:\"-\",CHAR_LEFT_ANGLE_BRACKET:\"<\",CHAR_LEFT_CURLY_BRACE:\"{\",CHAR_LEFT_SQUARE_BRACKET:\"[\",CHAR_LINE_FEED:`\n`,CHAR_NO_BREAK_SPACE:\"\\xA0\",CHAR_PERCENT:\"%\",CHAR_PLUS:\"+\",CHAR_QUESTION_MARK:\"?\",CHAR_RIGHT_ANGLE_BRACKET:\">\",CHAR_RIGHT_CURLY_BRACE:\"}\",CHAR_RIGHT_SQUARE_BRACKET:\"]\",CHAR_SEMICOLON:\";\",CHAR_SINGLE_QUOTE:\"'\",CHAR_SPACE:\" \",CHAR_TAB:\"\t\",CHAR_UNDERSCORE:\"_\",CHAR_VERTICAL_LINE:\"|\",CHAR_ZERO_WIDTH_NOBREAK_SPACE:\"\\uFEFF\"}});var Qoe=_((uFt,koe)=>{\"use strict\";var TKe=fk(),{MAX_LENGTH:boe,CHAR_BACKSLASH:c4,CHAR_BACKTICK:RKe,CHAR_COMMA:FKe,CHAR_DOT:NKe,CHAR_LEFT_PARENTHESES:OKe,CHAR_RIGHT_PARENTHESES:LKe,CHAR_LEFT_CURLY_BRACE:MKe,CHAR_RIGHT_CURLY_BRACE:UKe,CHAR_LEFT_SQUARE_BRACKET:Poe,CHAR_RIGHT_SQUARE_BRACKET:xoe,CHAR_DOUBLE_QUOTE:_Ke,CHAR_SINGLE_QUOTE:HKe,CHAR_NO_BREAK_SPACE:jKe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:GKe}=Doe(),qKe=(t,e={})=>{if(typeof t!=\"string\")throw new TypeError(\"Expected a string\");let r=e||{},s=typeof r.maxLength==\"number\"?Math.min(boe,r.maxLength):boe;if(t.length>s)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${s})`);let a={type:\"root\",input:t,nodes:[]},n=[a],c=a,f=a,p=0,h=t.length,E=0,C=0,S,P={},I=()=>t[E++],R=N=>{if(N.type===\"text\"&&f.type===\"dot\"&&(f.type=\"text\"),f&&f.type===\"text\"&&N.type===\"text\"){f.value+=N.value;return}return c.nodes.push(N),N.parent=c,N.prev=f,f=N,N};for(R({type:\"bos\"});E<h;)if(c=n[n.length-1],S=I(),!(S===GKe||S===jKe)){if(S===c4){R({type:\"text\",value:(e.keepEscaping?S:\"\")+I()});continue}if(S===xoe){R({type:\"text\",value:\"\\\\\"+S});continue}if(S===Poe){p++;let N=!0,U;for(;E<h&&(U=I());){if(S+=U,U===Poe){p++;continue}if(U===c4){S+=I();continue}if(U===xoe&&(p--,p===0))break}R({type:\"text\",value:S});continue}if(S===OKe){c=R({type:\"paren\",nodes:[]}),n.push(c),R({type:\"text\",value:S});continue}if(S===LKe){if(c.type!==\"paren\"){R({type:\"text\",value:S});continue}c=n.pop(),R({type:\"text\",value:S}),c=n[n.length-1];continue}if(S===_Ke||S===HKe||S===RKe){let N=S,U;for(e.keepQuotes!==!0&&(S=\"\");E<h&&(U=I());){if(U===c4){S+=U+I();continue}if(U===N){e.keepQuotes===!0&&(S+=U);break}S+=U}R({type:\"text\",value:S});continue}if(S===MKe){C++;let U={type:\"brace\",open:!0,close:!1,dollar:f.value&&f.value.slice(-1)===\"$\"||c.dollar===!0,depth:C,commas:0,ranges:0,nodes:[]};c=R(U),n.push(c),R({type:\"open\",value:S});continue}if(S===UKe){if(c.type!==\"brace\"){R({type:\"text\",value:S});continue}let N=\"close\";c=n.pop(),c.close=!0,R({type:N,value:S}),C--,c=n[n.length-1];continue}if(S===FKe&&C>0){if(c.ranges>0){c.ranges=0;let N=c.nodes.shift();c.nodes=[N,{type:\"text\",value:TKe(c)}]}R({type:\"comma\",value:S}),c.commas++;continue}if(S===NKe&&C>0&&c.commas===0){let N=c.nodes;if(C===0||N.length===0){R({type:\"text\",value:S});continue}if(f.type===\"dot\"){if(c.range=[],f.value+=S,f.type=\"range\",c.nodes.length!==3&&c.nodes.length!==5){c.invalid=!0,c.ranges=0,f.type=\"text\";continue}c.ranges++,c.args=[];continue}if(f.type===\"range\"){N.pop();let U=N[N.length-1];U.value+=f.value+S,f=U,c.ranges--;continue}R({type:\"dot\",value:S});continue}R({type:\"text\",value:S})}do if(c=n.pop(),c.type!==\"root\"){c.nodes.forEach(W=>{W.nodes||(W.type===\"open\"&&(W.isOpen=!0),W.type===\"close\"&&(W.isClose=!0),W.nodes||(W.type=\"text\"),W.invalid=!0)});let N=n[n.length-1],U=N.nodes.indexOf(c);N.nodes.splice(U,1,...c.nodes)}while(n.length>0);return R({type:\"eos\"}),a};koe.exports=qKe});var Foe=_((fFt,Roe)=>{\"use strict\";var Toe=fk(),WKe=Coe(),YKe=voe(),VKe=Qoe(),jl=(t,e={})=>{let r=[];if(Array.isArray(t))for(let s of t){let a=jl.create(s,e);Array.isArray(a)?r.push(...a):r.push(a)}else r=[].concat(jl.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};jl.parse=(t,e={})=>VKe(t,e);jl.stringify=(t,e={})=>Toe(typeof t==\"string\"?jl.parse(t,e):t,e);jl.compile=(t,e={})=>(typeof t==\"string\"&&(t=jl.parse(t,e)),WKe(t,e));jl.expand=(t,e={})=>{typeof t==\"string\"&&(t=jl.parse(t,e));let r=YKe(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};jl.create=(t,e={})=>t===\"\"||t.length<3?[t]:e.expand!==!0?jl.compile(t,e):jl.expand(t,e);Roe.exports=jl});var EB=_((AFt,Uoe)=>{\"use strict\";var JKe=Ie(\"path\"),Vf=\"\\\\\\\\/\",Noe=`[^${Vf}]`,Dp=\"\\\\.\",KKe=\"\\\\+\",zKe=\"\\\\?\",pk=\"\\\\/\",XKe=\"(?=.)\",Ooe=\"[^/]\",u4=`(?:${pk}|$)`,Loe=`(?:^|${pk})`,f4=`${Dp}{1,2}${u4}`,ZKe=`(?!${Dp})`,$Ke=`(?!${Loe}${f4})`,eze=`(?!${Dp}{0,1}${u4})`,tze=`(?!${f4})`,rze=`[^.${pk}]`,nze=`${Ooe}*?`,Moe={DOT_LITERAL:Dp,PLUS_LITERAL:KKe,QMARK_LITERAL:zKe,SLASH_LITERAL:pk,ONE_CHAR:XKe,QMARK:Ooe,END_ANCHOR:u4,DOTS_SLASH:f4,NO_DOT:ZKe,NO_DOTS:$Ke,NO_DOT_SLASH:eze,NO_DOTS_SLASH:tze,QMARK_NO_DOT:rze,STAR:nze,START_ANCHOR:Loe},ize={...Moe,SLASH_LITERAL:`[${Vf}]`,QMARK:Noe,STAR:`${Noe}*?`,DOTS_SLASH:`${Dp}{1,2}(?:[${Vf}]|$)`,NO_DOT:`(?!${Dp})`,NO_DOTS:`(?!(?:^|[${Vf}])${Dp}{1,2}(?:[${Vf}]|$))`,NO_DOT_SLASH:`(?!${Dp}{0,1}(?:[${Vf}]|$))`,NO_DOTS_SLASH:`(?!${Dp}{1,2}(?:[${Vf}]|$))`,QMARK_NO_DOT:`[^.${Vf}]`,START_ANCHOR:`(?:^|[${Vf}])`,END_ANCHOR:`(?:[${Vf}]|$)`},sze={alnum:\"a-zA-Z0-9\",alpha:\"a-zA-Z\",ascii:\"\\\\x00-\\\\x7F\",blank:\" \\\\t\",cntrl:\"\\\\x00-\\\\x1F\\\\x7F\",digit:\"0-9\",graph:\"\\\\x21-\\\\x7E\",lower:\"a-z\",print:\"\\\\x20-\\\\x7E \",punct:\"\\\\-!\\\"#$%&'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~\",space:\" \\\\t\\\\r\\\\n\\\\v\\\\f\",upper:\"A-Z\",word:\"A-Za-z0-9_\",xdigit:\"A-Fa-f0-9\"};Uoe.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:sze,REGEX_BACKSLASH:/\\\\(?![*+?^${}(|)[\\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\\].,$*+?^{}()|\\\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\\\?)((\\W)(\\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,REPLACEMENTS:{\"***\":\"*\",\"**/**\":\"**\",\"**/**/**\":\"**\"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:JKe.sep,extglobChars(t){return{\"!\":{type:\"negate\",open:\"(?:(?!(?:\",close:`))${t.STAR})`},\"?\":{type:\"qmark\",open:\"(?:\",close:\")?\"},\"+\":{type:\"plus\",open:\"(?:\",close:\")+\"},\"*\":{type:\"star\",open:\"(?:\",close:\")*\"},\"@\":{type:\"at\",open:\"(?:\",close:\")\"}}},globChars(t){return t===!0?ize:Moe}}});var IB=_(ol=>{\"use strict\";var oze=Ie(\"path\"),aze=process.platform===\"win32\",{REGEX_BACKSLASH:lze,REGEX_REMOVE_BACKSLASH:cze,REGEX_SPECIAL_CHARS:uze,REGEX_SPECIAL_CHARS_GLOBAL:fze}=EB();ol.isObject=t=>t!==null&&typeof t==\"object\"&&!Array.isArray(t);ol.hasRegexChars=t=>uze.test(t);ol.isRegexChar=t=>t.length===1&&ol.hasRegexChars(t);ol.escapeRegex=t=>t.replace(fze,\"\\\\$1\");ol.toPosixSlashes=t=>t.replace(lze,\"/\");ol.removeBackslashes=t=>t.replace(cze,e=>e===\"\\\\\"?\"\":e);ol.supportsLookbehinds=()=>{let t=process.version.slice(1).split(\".\").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};ol.isWindows=t=>t&&typeof t.windows==\"boolean\"?t.windows:aze===!0||oze.sep===\"\\\\\";ol.escapeLast=(t,e,r)=>{let s=t.lastIndexOf(e,r);return s===-1?t:t[s-1]===\"\\\\\"?ol.escapeLast(t,e,s-1):`${t.slice(0,s)}\\\\${t.slice(s)}`};ol.removePrefix=(t,e={})=>{let r=t;return r.startsWith(\"./\")&&(r=r.slice(2),e.prefix=\"./\"),r};ol.wrapOutput=(t,e={},r={})=>{let s=r.contains?\"\":\"^\",a=r.contains?\"\":\"$\",n=`${s}(?:${t})${a}`;return e.negated===!0&&(n=`(?:^(?!${n}).*$)`),n}});var Voe=_((hFt,Yoe)=>{\"use strict\";var _oe=IB(),{CHAR_ASTERISK:A4,CHAR_AT:Aze,CHAR_BACKWARD_SLASH:CB,CHAR_COMMA:pze,CHAR_DOT:p4,CHAR_EXCLAMATION_MARK:h4,CHAR_FORWARD_SLASH:Woe,CHAR_LEFT_CURLY_BRACE:g4,CHAR_LEFT_PARENTHESES:d4,CHAR_LEFT_SQUARE_BRACKET:hze,CHAR_PLUS:gze,CHAR_QUESTION_MARK:Hoe,CHAR_RIGHT_CURLY_BRACE:dze,CHAR_RIGHT_PARENTHESES:joe,CHAR_RIGHT_SQUARE_BRACKET:mze}=EB(),Goe=t=>t===Woe||t===CB,qoe=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?1/0:1)},yze=(t,e)=>{let r=e||{},s=t.length-1,a=r.parts===!0||r.scanToEnd===!0,n=[],c=[],f=[],p=t,h=-1,E=0,C=0,S=!1,P=!1,I=!1,R=!1,N=!1,U=!1,W=!1,ee=!1,ie=!1,ue=!1,le=0,me,pe,Be={value:\"\",depth:0,isGlob:!1},Ce=()=>h>=s,g=()=>p.charCodeAt(h+1),we=()=>(me=pe,p.charCodeAt(++h));for(;h<s;){pe=we();let De;if(pe===CB){W=Be.backslashes=!0,pe=we(),pe===g4&&(U=!0);continue}if(U===!0||pe===g4){for(le++;Ce()!==!0&&(pe=we());){if(pe===CB){W=Be.backslashes=!0,we();continue}if(pe===g4){le++;continue}if(U!==!0&&pe===p4&&(pe=we())===p4){if(S=Be.isBrace=!0,I=Be.isGlob=!0,ue=!0,a===!0)continue;break}if(U!==!0&&pe===pze){if(S=Be.isBrace=!0,I=Be.isGlob=!0,ue=!0,a===!0)continue;break}if(pe===dze&&(le--,le===0)){U=!1,S=Be.isBrace=!0,ue=!0;break}}if(a===!0)continue;break}if(pe===Woe){if(n.push(h),c.push(Be),Be={value:\"\",depth:0,isGlob:!1},ue===!0)continue;if(me===p4&&h===E+1){E+=2;continue}C=h+1;continue}if(r.noext!==!0&&(pe===gze||pe===Aze||pe===A4||pe===Hoe||pe===h4)===!0&&g()===d4){if(I=Be.isGlob=!0,R=Be.isExtglob=!0,ue=!0,pe===h4&&h===E&&(ie=!0),a===!0){for(;Ce()!==!0&&(pe=we());){if(pe===CB){W=Be.backslashes=!0,pe=we();continue}if(pe===joe){I=Be.isGlob=!0,ue=!0;break}}continue}break}if(pe===A4){if(me===A4&&(N=Be.isGlobstar=!0),I=Be.isGlob=!0,ue=!0,a===!0)continue;break}if(pe===Hoe){if(I=Be.isGlob=!0,ue=!0,a===!0)continue;break}if(pe===hze){for(;Ce()!==!0&&(De=we());){if(De===CB){W=Be.backslashes=!0,we();continue}if(De===mze){P=Be.isBracket=!0,I=Be.isGlob=!0,ue=!0;break}}if(a===!0)continue;break}if(r.nonegate!==!0&&pe===h4&&h===E){ee=Be.negated=!0,E++;continue}if(r.noparen!==!0&&pe===d4){if(I=Be.isGlob=!0,a===!0){for(;Ce()!==!0&&(pe=we());){if(pe===d4){W=Be.backslashes=!0,pe=we();continue}if(pe===joe){ue=!0;break}}continue}break}if(I===!0){if(ue=!0,a===!0)continue;break}}r.noext===!0&&(R=!1,I=!1);let ye=p,Ae=\"\",se=\"\";E>0&&(Ae=p.slice(0,E),p=p.slice(E),C-=E),ye&&I===!0&&C>0?(ye=p.slice(0,C),se=p.slice(C)):I===!0?(ye=\"\",se=p):ye=p,ye&&ye!==\"\"&&ye!==\"/\"&&ye!==p&&Goe(ye.charCodeAt(ye.length-1))&&(ye=ye.slice(0,-1)),r.unescape===!0&&(se&&(se=_oe.removeBackslashes(se)),ye&&W===!0&&(ye=_oe.removeBackslashes(ye)));let Z={prefix:Ae,input:t,start:E,base:ye,glob:se,isBrace:S,isBracket:P,isGlob:I,isExtglob:R,isGlobstar:N,negated:ee,negatedExtglob:ie};if(r.tokens===!0&&(Z.maxDepth=0,Goe(pe)||c.push(Be),Z.tokens=c),r.parts===!0||r.tokens===!0){let De;for(let Re=0;Re<n.length;Re++){let mt=De?De+1:E,j=n[Re],rt=t.slice(mt,j);r.tokens&&(Re===0&&E!==0?(c[Re].isPrefix=!0,c[Re].value=Ae):c[Re].value=rt,qoe(c[Re]),Z.maxDepth+=c[Re].depth),(Re!==0||rt!==\"\")&&f.push(rt),De=j}if(De&&De+1<t.length){let Re=t.slice(De+1);f.push(Re),r.tokens&&(c[c.length-1].value=Re,qoe(c[c.length-1]),Z.maxDepth+=c[c.length-1].depth)}Z.slashes=n,Z.parts=f}return Z};Yoe.exports=yze});var zoe=_((gFt,Koe)=>{\"use strict\";var hk=EB(),Gl=IB(),{MAX_LENGTH:gk,POSIX_REGEX_SOURCE:Eze,REGEX_NON_SPECIAL_CHARS:Ize,REGEX_SPECIAL_CHARS_BACKREF:Cze,REPLACEMENTS:Joe}=hk,wze=(t,e)=>{if(typeof e.expandRange==\"function\")return e.expandRange(...t,e);t.sort();let r=`[${t.join(\"-\")}]`;try{new RegExp(r)}catch{return t.map(a=>Gl.escapeRegex(a)).join(\"..\")}return r},FE=(t,e)=>`Missing ${t}: \"${e}\" - use \"\\\\\\\\${e}\" to match literal characters`,m4=(t,e)=>{if(typeof t!=\"string\")throw new TypeError(\"Expected a string\");t=Joe[t]||t;let r={...e},s=typeof r.maxLength==\"number\"?Math.min(gk,r.maxLength):gk,a=t.length;if(a>s)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${s}`);let n={type:\"bos\",value:\"\",output:r.prepend||\"\"},c=[n],f=r.capture?\"\":\"?:\",p=Gl.isWindows(e),h=hk.globChars(p),E=hk.extglobChars(h),{DOT_LITERAL:C,PLUS_LITERAL:S,SLASH_LITERAL:P,ONE_CHAR:I,DOTS_SLASH:R,NO_DOT:N,NO_DOT_SLASH:U,NO_DOTS_SLASH:W,QMARK:ee,QMARK_NO_DOT:ie,STAR:ue,START_ANCHOR:le}=h,me=x=>`(${f}(?:(?!${le}${x.dot?R:C}).)*?)`,pe=r.dot?\"\":N,Be=r.dot?ee:ie,Ce=r.bash===!0?me(r):ue;r.capture&&(Ce=`(${Ce})`),typeof r.noext==\"boolean\"&&(r.noextglob=r.noext);let g={input:t,index:-1,start:0,dot:r.dot===!0,consumed:\"\",output:\"\",prefix:\"\",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:c};t=Gl.removePrefix(t,g),a=t.length;let we=[],ye=[],Ae=[],se=n,Z,De=()=>g.index===a-1,Re=g.peek=(x=1)=>t[g.index+x],mt=g.advance=()=>t[++g.index]||\"\",j=()=>t.slice(g.index+1),rt=(x=\"\",w=0)=>{g.consumed+=x,g.index+=w},Fe=x=>{g.output+=x.output!=null?x.output:x.value,rt(x.value)},Ne=()=>{let x=1;for(;Re()===\"!\"&&(Re(2)!==\"(\"||Re(3)===\"?\");)mt(),g.start++,x++;return x%2===0?!1:(g.negated=!0,g.start++,!0)},Pe=x=>{g[x]++,Ae.push(x)},Ve=x=>{g[x]--,Ae.pop()},ke=x=>{if(se.type===\"globstar\"){let w=g.braces>0&&(x.type===\"comma\"||x.type===\"brace\"),b=x.extglob===!0||we.length&&(x.type===\"pipe\"||x.type===\"paren\");x.type!==\"slash\"&&x.type!==\"paren\"&&!w&&!b&&(g.output=g.output.slice(0,-se.output.length),se.type=\"star\",se.value=\"*\",se.output=Ce,g.output+=se.output)}if(we.length&&x.type!==\"paren\"&&(we[we.length-1].inner+=x.value),(x.value||x.output)&&Fe(x),se&&se.type===\"text\"&&x.type===\"text\"){se.value+=x.value,se.output=(se.output||\"\")+x.value;return}x.prev=se,c.push(x),se=x},it=(x,w)=>{let b={...E[w],conditions:1,inner:\"\"};b.prev=se,b.parens=g.parens,b.output=g.output;let y=(r.capture?\"(\":\"\")+b.open;Pe(\"parens\"),ke({type:x,value:w,output:g.output?\"\":I}),ke({type:\"paren\",extglob:!0,value:mt(),output:y}),we.push(b)},Ue=x=>{let w=x.close+(r.capture?\")\":\"\"),b;if(x.type===\"negate\"){let y=Ce;if(x.inner&&x.inner.length>1&&x.inner.includes(\"/\")&&(y=me(r)),(y!==Ce||De()||/^\\)+$/.test(j()))&&(w=x.close=`)$))${y}`),x.inner.includes(\"*\")&&(b=j())&&/^\\.[^\\\\/.]+$/.test(b)){let F=m4(b,{...e,fastpaths:!1}).output;w=x.close=`)${F})${y})`}x.prev.type===\"bos\"&&(g.negatedExtglob=!0)}ke({type:\"paren\",extglob:!0,value:Z,output:w}),Ve(\"parens\")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\\]{}\"])/.test(t)){let x=!1,w=t.replace(Cze,(b,y,F,z,X,$)=>z===\"\\\\\"?(x=!0,b):z===\"?\"?y?y+z+(X?ee.repeat(X.length):\"\"):$===0?Be+(X?ee.repeat(X.length):\"\"):ee.repeat(F.length):z===\".\"?C.repeat(F.length):z===\"*\"?y?y+z+(X?Ce:\"\"):Ce:y?b:`\\\\${b}`);return x===!0&&(r.unescape===!0?w=w.replace(/\\\\/g,\"\"):w=w.replace(/\\\\+/g,b=>b.length%2===0?\"\\\\\\\\\":b?\"\\\\\":\"\")),w===t&&r.contains===!0?(g.output=t,g):(g.output=Gl.wrapOutput(w,g,e),g)}for(;!De();){if(Z=mt(),Z===\"\\0\")continue;if(Z===\"\\\\\"){let b=Re();if(b===\"/\"&&r.bash!==!0||b===\".\"||b===\";\")continue;if(!b){Z+=\"\\\\\",ke({type:\"text\",value:Z});continue}let y=/^\\\\+/.exec(j()),F=0;if(y&&y[0].length>2&&(F=y[0].length,g.index+=F,F%2!==0&&(Z+=\"\\\\\")),r.unescape===!0?Z=mt():Z+=mt(),g.brackets===0){ke({type:\"text\",value:Z});continue}}if(g.brackets>0&&(Z!==\"]\"||se.value===\"[\"||se.value===\"[^\")){if(r.posix!==!1&&Z===\":\"){let b=se.value.slice(1);if(b.includes(\"[\")&&(se.posix=!0,b.includes(\":\"))){let y=se.value.lastIndexOf(\"[\"),F=se.value.slice(0,y),z=se.value.slice(y+2),X=Eze[z];if(X){se.value=F+X,g.backtrack=!0,mt(),!n.output&&c.indexOf(se)===1&&(n.output=I);continue}}}(Z===\"[\"&&Re()!==\":\"||Z===\"-\"&&Re()===\"]\")&&(Z=`\\\\${Z}`),Z===\"]\"&&(se.value===\"[\"||se.value===\"[^\")&&(Z=`\\\\${Z}`),r.posix===!0&&Z===\"!\"&&se.value===\"[\"&&(Z=\"^\"),se.value+=Z,Fe({value:Z});continue}if(g.quotes===1&&Z!=='\"'){Z=Gl.escapeRegex(Z),se.value+=Z,Fe({value:Z});continue}if(Z==='\"'){g.quotes=g.quotes===1?0:1,r.keepQuotes===!0&&ke({type:\"text\",value:Z});continue}if(Z===\"(\"){Pe(\"parens\"),ke({type:\"paren\",value:Z});continue}if(Z===\")\"){if(g.parens===0&&r.strictBrackets===!0)throw new SyntaxError(FE(\"opening\",\"(\"));let b=we[we.length-1];if(b&&g.parens===b.parens+1){Ue(we.pop());continue}ke({type:\"paren\",value:Z,output:g.parens?\")\":\"\\\\)\"}),Ve(\"parens\");continue}if(Z===\"[\"){if(r.nobracket===!0||!j().includes(\"]\")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(FE(\"closing\",\"]\"));Z=`\\\\${Z}`}else Pe(\"brackets\");ke({type:\"bracket\",value:Z});continue}if(Z===\"]\"){if(r.nobracket===!0||se&&se.type===\"bracket\"&&se.value.length===1){ke({type:\"text\",value:Z,output:`\\\\${Z}`});continue}if(g.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(FE(\"opening\",\"[\"));ke({type:\"text\",value:Z,output:`\\\\${Z}`});continue}Ve(\"brackets\");let b=se.value.slice(1);if(se.posix!==!0&&b[0]===\"^\"&&!b.includes(\"/\")&&(Z=`/${Z}`),se.value+=Z,Fe({value:Z}),r.literalBrackets===!1||Gl.hasRegexChars(b))continue;let y=Gl.escapeRegex(se.value);if(g.output=g.output.slice(0,-se.value.length),r.literalBrackets===!0){g.output+=y,se.value=y;continue}se.value=`(${f}${y}|${se.value})`,g.output+=se.value;continue}if(Z===\"{\"&&r.nobrace!==!0){Pe(\"braces\");let b={type:\"brace\",value:Z,output:\"(\",outputIndex:g.output.length,tokensIndex:g.tokens.length};ye.push(b),ke(b);continue}if(Z===\"}\"){let b=ye[ye.length-1];if(r.nobrace===!0||!b){ke({type:\"text\",value:Z,output:Z});continue}let y=\")\";if(b.dots===!0){let F=c.slice(),z=[];for(let X=F.length-1;X>=0&&(c.pop(),F[X].type!==\"brace\");X--)F[X].type!==\"dots\"&&z.unshift(F[X].value);y=wze(z,r),g.backtrack=!0}if(b.comma!==!0&&b.dots!==!0){let F=g.output.slice(0,b.outputIndex),z=g.tokens.slice(b.tokensIndex);b.value=b.output=\"\\\\{\",Z=y=\"\\\\}\",g.output=F;for(let X of z)g.output+=X.output||X.value}ke({type:\"brace\",value:Z,output:y}),Ve(\"braces\"),ye.pop();continue}if(Z===\"|\"){we.length>0&&we[we.length-1].conditions++,ke({type:\"text\",value:Z});continue}if(Z===\",\"){let b=Z,y=ye[ye.length-1];y&&Ae[Ae.length-1]===\"braces\"&&(y.comma=!0,b=\"|\"),ke({type:\"comma\",value:Z,output:b});continue}if(Z===\"/\"){if(se.type===\"dot\"&&g.index===g.start+1){g.start=g.index+1,g.consumed=\"\",g.output=\"\",c.pop(),se=n;continue}ke({type:\"slash\",value:Z,output:P});continue}if(Z===\".\"){if(g.braces>0&&se.type===\"dot\"){se.value===\".\"&&(se.output=C);let b=ye[ye.length-1];se.type=\"dots\",se.output+=Z,se.value+=Z,b.dots=!0;continue}if(g.braces+g.parens===0&&se.type!==\"bos\"&&se.type!==\"slash\"){ke({type:\"text\",value:Z,output:C});continue}ke({type:\"dot\",value:Z,output:C});continue}if(Z===\"?\"){if(!(se&&se.value===\"(\")&&r.noextglob!==!0&&Re()===\"(\"&&Re(2)!==\"?\"){it(\"qmark\",Z);continue}if(se&&se.type===\"paren\"){let y=Re(),F=Z;if(y===\"<\"&&!Gl.supportsLookbehinds())throw new Error(\"Node.js v10 or higher is required for regex lookbehinds\");(se.value===\"(\"&&!/[!=<:]/.test(y)||y===\"<\"&&!/<([!=]|\\w+>)/.test(j()))&&(F=`\\\\${Z}`),ke({type:\"text\",value:Z,output:F});continue}if(r.dot!==!0&&(se.type===\"slash\"||se.type===\"bos\")){ke({type:\"qmark\",value:Z,output:ie});continue}ke({type:\"qmark\",value:Z,output:ee});continue}if(Z===\"!\"){if(r.noextglob!==!0&&Re()===\"(\"&&(Re(2)!==\"?\"||!/[!=<:]/.test(Re(3)))){it(\"negate\",Z);continue}if(r.nonegate!==!0&&g.index===0){Ne();continue}}if(Z===\"+\"){if(r.noextglob!==!0&&Re()===\"(\"&&Re(2)!==\"?\"){it(\"plus\",Z);continue}if(se&&se.value===\"(\"||r.regex===!1){ke({type:\"plus\",value:Z,output:S});continue}if(se&&(se.type===\"bracket\"||se.type===\"paren\"||se.type===\"brace\")||g.parens>0){ke({type:\"plus\",value:Z});continue}ke({type:\"plus\",value:S});continue}if(Z===\"@\"){if(r.noextglob!==!0&&Re()===\"(\"&&Re(2)!==\"?\"){ke({type:\"at\",extglob:!0,value:Z,output:\"\"});continue}ke({type:\"text\",value:Z});continue}if(Z!==\"*\"){(Z===\"$\"||Z===\"^\")&&(Z=`\\\\${Z}`);let b=Ize.exec(j());b&&(Z+=b[0],g.index+=b[0].length),ke({type:\"text\",value:Z});continue}if(se&&(se.type===\"globstar\"||se.star===!0)){se.type=\"star\",se.star=!0,se.value+=Z,se.output=Ce,g.backtrack=!0,g.globstar=!0,rt(Z);continue}let x=j();if(r.noextglob!==!0&&/^\\([^?]/.test(x)){it(\"star\",Z);continue}if(se.type===\"star\"){if(r.noglobstar===!0){rt(Z);continue}let b=se.prev,y=b.prev,F=b.type===\"slash\"||b.type===\"bos\",z=y&&(y.type===\"star\"||y.type===\"globstar\");if(r.bash===!0&&(!F||x[0]&&x[0]!==\"/\")){ke({type:\"star\",value:Z,output:\"\"});continue}let X=g.braces>0&&(b.type===\"comma\"||b.type===\"brace\"),$=we.length&&(b.type===\"pipe\"||b.type===\"paren\");if(!F&&b.type!==\"paren\"&&!X&&!$){ke({type:\"star\",value:Z,output:\"\"});continue}for(;x.slice(0,3)===\"/**\";){let oe=t[g.index+4];if(oe&&oe!==\"/\")break;x=x.slice(3),rt(\"/**\",3)}if(b.type===\"bos\"&&De()){se.type=\"globstar\",se.value+=Z,se.output=me(r),g.output=se.output,g.globstar=!0,rt(Z);continue}if(b.type===\"slash\"&&b.prev.type!==\"bos\"&&!z&&De()){g.output=g.output.slice(0,-(b.output+se.output).length),b.output=`(?:${b.output}`,se.type=\"globstar\",se.output=me(r)+(r.strictSlashes?\")\":\"|$)\"),se.value+=Z,g.globstar=!0,g.output+=b.output+se.output,rt(Z);continue}if(b.type===\"slash\"&&b.prev.type!==\"bos\"&&x[0]===\"/\"){let oe=x[1]!==void 0?\"|$\":\"\";g.output=g.output.slice(0,-(b.output+se.output).length),b.output=`(?:${b.output}`,se.type=\"globstar\",se.output=`${me(r)}${P}|${P}${oe})`,se.value+=Z,g.output+=b.output+se.output,g.globstar=!0,rt(Z+mt()),ke({type:\"slash\",value:\"/\",output:\"\"});continue}if(b.type===\"bos\"&&x[0]===\"/\"){se.type=\"globstar\",se.value+=Z,se.output=`(?:^|${P}|${me(r)}${P})`,g.output=se.output,g.globstar=!0,rt(Z+mt()),ke({type:\"slash\",value:\"/\",output:\"\"});continue}g.output=g.output.slice(0,-se.output.length),se.type=\"globstar\",se.output=me(r),se.value+=Z,g.output+=se.output,g.globstar=!0,rt(Z);continue}let w={type:\"star\",value:Z,output:Ce};if(r.bash===!0){w.output=\".*?\",(se.type===\"bos\"||se.type===\"slash\")&&(w.output=pe+w.output),ke(w);continue}if(se&&(se.type===\"bracket\"||se.type===\"paren\")&&r.regex===!0){w.output=Z,ke(w);continue}(g.index===g.start||se.type===\"slash\"||se.type===\"dot\")&&(se.type===\"dot\"?(g.output+=U,se.output+=U):r.dot===!0?(g.output+=W,se.output+=W):(g.output+=pe,se.output+=pe),Re()!==\"*\"&&(g.output+=I,se.output+=I)),ke(w)}for(;g.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(FE(\"closing\",\"]\"));g.output=Gl.escapeLast(g.output,\"[\"),Ve(\"brackets\")}for(;g.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(FE(\"closing\",\")\"));g.output=Gl.escapeLast(g.output,\"(\"),Ve(\"parens\")}for(;g.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(FE(\"closing\",\"}\"));g.output=Gl.escapeLast(g.output,\"{\"),Ve(\"braces\")}if(r.strictSlashes!==!0&&(se.type===\"star\"||se.type===\"bracket\")&&ke({type:\"maybe_slash\",value:\"\",output:`${P}?`}),g.backtrack===!0){g.output=\"\";for(let x of g.tokens)g.output+=x.output!=null?x.output:x.value,x.suffix&&(g.output+=x.suffix)}return g};m4.fastpaths=(t,e)=>{let r={...e},s=typeof r.maxLength==\"number\"?Math.min(gk,r.maxLength):gk,a=t.length;if(a>s)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${s}`);t=Joe[t]||t;let n=Gl.isWindows(e),{DOT_LITERAL:c,SLASH_LITERAL:f,ONE_CHAR:p,DOTS_SLASH:h,NO_DOT:E,NO_DOTS:C,NO_DOTS_SLASH:S,STAR:P,START_ANCHOR:I}=hk.globChars(n),R=r.dot?C:E,N=r.dot?S:E,U=r.capture?\"\":\"?:\",W={negated:!1,prefix:\"\"},ee=r.bash===!0?\".*?\":P;r.capture&&(ee=`(${ee})`);let ie=pe=>pe.noglobstar===!0?ee:`(${U}(?:(?!${I}${pe.dot?h:c}).)*?)`,ue=pe=>{switch(pe){case\"*\":return`${R}${p}${ee}`;case\".*\":return`${c}${p}${ee}`;case\"*.*\":return`${R}${ee}${c}${p}${ee}`;case\"*/*\":return`${R}${ee}${f}${p}${N}${ee}`;case\"**\":return R+ie(r);case\"**/*\":return`(?:${R}${ie(r)}${f})?${N}${p}${ee}`;case\"**/*.*\":return`(?:${R}${ie(r)}${f})?${N}${ee}${c}${p}${ee}`;case\"**/.*\":return`(?:${R}${ie(r)}${f})?${c}${p}${ee}`;default:{let Be=/^(.*?)\\.(\\w+)$/.exec(pe);if(!Be)return;let Ce=ue(Be[1]);return Ce?Ce+c+Be[2]:void 0}}},le=Gl.removePrefix(t,W),me=ue(le);return me&&r.strictSlashes!==!0&&(me+=`${f}?`),me};Koe.exports=m4});var Zoe=_((dFt,Xoe)=>{\"use strict\";var Bze=Ie(\"path\"),vze=Voe(),y4=zoe(),E4=IB(),Sze=EB(),Dze=t=>t&&typeof t==\"object\"&&!Array.isArray(t),Zi=(t,e,r=!1)=>{if(Array.isArray(t)){let E=t.map(S=>Zi(S,e,r));return S=>{for(let P of E){let I=P(S);if(I)return I}return!1}}let s=Dze(t)&&t.tokens&&t.input;if(t===\"\"||typeof t!=\"string\"&&!s)throw new TypeError(\"Expected pattern to be a non-empty string\");let a=e||{},n=E4.isWindows(e),c=s?Zi.compileRe(t,e):Zi.makeRe(t,e,!1,!0),f=c.state;delete c.state;let p=()=>!1;if(a.ignore){let E={...e,ignore:null,onMatch:null,onResult:null};p=Zi(a.ignore,E,r)}let h=(E,C=!1)=>{let{isMatch:S,match:P,output:I}=Zi.test(E,c,e,{glob:t,posix:n}),R={glob:t,state:f,regex:c,posix:n,input:E,output:I,match:P,isMatch:S};return typeof a.onResult==\"function\"&&a.onResult(R),S===!1?(R.isMatch=!1,C?R:!1):p(E)?(typeof a.onIgnore==\"function\"&&a.onIgnore(R),R.isMatch=!1,C?R:!1):(typeof a.onMatch==\"function\"&&a.onMatch(R),C?R:!0)};return r&&(h.state=f),h};Zi.test=(t,e,r,{glob:s,posix:a}={})=>{if(typeof t!=\"string\")throw new TypeError(\"Expected input to be a string\");if(t===\"\")return{isMatch:!1,output:\"\"};let n=r||{},c=n.format||(a?E4.toPosixSlashes:null),f=t===s,p=f&&c?c(t):t;return f===!1&&(p=c?c(t):t,f=p===s),(f===!1||n.capture===!0)&&(n.matchBase===!0||n.basename===!0?f=Zi.matchBase(t,e,r,a):f=e.exec(p)),{isMatch:!!f,match:f,output:p}};Zi.matchBase=(t,e,r,s=E4.isWindows(r))=>(e instanceof RegExp?e:Zi.makeRe(e,r)).test(Bze.basename(t));Zi.isMatch=(t,e,r)=>Zi(e,r)(t);Zi.parse=(t,e)=>Array.isArray(t)?t.map(r=>Zi.parse(r,e)):y4(t,{...e,fastpaths:!1});Zi.scan=(t,e)=>vze(t,e);Zi.compileRe=(t,e,r=!1,s=!1)=>{if(r===!0)return t.output;let a=e||{},n=a.contains?\"\":\"^\",c=a.contains?\"\":\"$\",f=`${n}(?:${t.output})${c}`;t&&t.negated===!0&&(f=`^(?!${f}).*$`);let p=Zi.toRegex(f,e);return s===!0&&(p.state=t),p};Zi.makeRe=(t,e={},r=!1,s=!1)=>{if(!t||typeof t!=\"string\")throw new TypeError(\"Expected a non-empty string\");let a={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(t[0]===\".\"||t[0]===\"*\")&&(a.output=y4.fastpaths(t,e)),a.output||(a=y4(t,e)),Zi.compileRe(a,e,r,s)};Zi.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?\"i\":\"\"))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};Zi.constants=Sze;Xoe.exports=Zi});var eae=_((mFt,$oe)=>{\"use strict\";$oe.exports=Zoe()});var Go=_((yFt,iae)=>{\"use strict\";var rae=Ie(\"util\"),nae=Foe(),Jf=eae(),I4=IB(),tae=t=>t===\"\"||t===\"./\",xi=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let s=new Set,a=new Set,n=new Set,c=0,f=E=>{n.add(E.output),r&&r.onResult&&r.onResult(E)};for(let E=0;E<e.length;E++){let C=Jf(String(e[E]),{...r,onResult:f},!0),S=C.state.negated||C.state.negatedExtglob;S&&c++;for(let P of t){let I=C(P,!0);(S?!I.isMatch:I.isMatch)&&(S?s.add(I.output):(s.delete(I.output),a.add(I.output)))}}let h=(c===e.length?[...n]:[...a]).filter(E=>!s.has(E));if(r&&h.length===0){if(r.failglob===!0)throw new Error(`No matches found for \"${e.join(\", \")}\"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(E=>E.replace(/\\\\/g,\"\")):e}return h};xi.match=xi;xi.matcher=(t,e)=>Jf(t,e);xi.isMatch=(t,e,r)=>Jf(e,r)(t);xi.any=xi.isMatch;xi.not=(t,e,r={})=>{e=[].concat(e).map(String);let s=new Set,a=[],n=f=>{r.onResult&&r.onResult(f),a.push(f.output)},c=new Set(xi(t,e,{...r,onResult:n}));for(let f of a)c.has(f)||s.add(f);return[...s]};xi.contains=(t,e,r)=>{if(typeof t!=\"string\")throw new TypeError(`Expected a string: \"${rae.inspect(t)}\"`);if(Array.isArray(e))return e.some(s=>xi.contains(t,s,r));if(typeof e==\"string\"){if(tae(t)||tae(e))return!1;if(t.includes(e)||t.startsWith(\"./\")&&t.slice(2).includes(e))return!0}return xi.isMatch(t,e,{...r,contains:!0})};xi.matchKeys=(t,e,r)=>{if(!I4.isObject(t))throw new TypeError(\"Expected the first argument to be an object\");let s=xi(Object.keys(t),e,r),a={};for(let n of s)a[n]=t[n];return a};xi.some=(t,e,r)=>{let s=[].concat(t);for(let a of[].concat(e)){let n=Jf(String(a),r);if(s.some(c=>n(c)))return!0}return!1};xi.every=(t,e,r)=>{let s=[].concat(t);for(let a of[].concat(e)){let n=Jf(String(a),r);if(!s.every(c=>n(c)))return!1}return!0};xi.all=(t,e,r)=>{if(typeof t!=\"string\")throw new TypeError(`Expected a string: \"${rae.inspect(t)}\"`);return[].concat(e).every(s=>Jf(s,r)(t))};xi.capture=(t,e,r)=>{let s=I4.isWindows(r),n=Jf.makeRe(String(t),{...r,capture:!0}).exec(s?I4.toPosixSlashes(e):e);if(n)return n.slice(1).map(c=>c===void 0?\"\":c)};xi.makeRe=(...t)=>Jf.makeRe(...t);xi.scan=(...t)=>Jf.scan(...t);xi.parse=(t,e)=>{let r=[];for(let s of[].concat(t||[]))for(let a of nae(String(s),e))r.push(Jf.parse(a,e));return r};xi.braces=(t,e)=>{if(typeof t!=\"string\")throw new TypeError(\"Expected a string\");return e&&e.nobrace===!0||!/\\{.*\\}/.test(t)?[t]:nae(t,e)};xi.braceExpand=(t,e)=>{if(typeof t!=\"string\")throw new TypeError(\"Expected a string\");return xi.braces(t,{...e,expand:!0})};iae.exports=xi});var oae=_((EFt,sae)=>{\"use strict\";sae.exports=({onlyFirst:t=!1}={})=>{let e=[\"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)\",\"(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))\"].join(\"|\");return new RegExp(e,t?void 0:\"g\")}});var dk=_((IFt,aae)=>{\"use strict\";var bze=oae();aae.exports=t=>typeof t==\"string\"?t.replace(bze(),\"\"):t});function lae(t){return Number.isSafeInteger(t)&&t>=0}var cae=Xe(()=>{});function uae(t){return t!=null&&typeof t!=\"function\"&&lae(t.length)}var fae=Xe(()=>{cae()});function bc(t){return t===\"__proto__\"}var wB=Xe(()=>{});function NE(t){switch(typeof t){case\"number\":case\"symbol\":return!1;case\"string\":return t.includes(\".\")||t.includes(\"[\")||t.includes(\"]\")}}var mk=Xe(()=>{});function OE(t){return typeof t==\"string\"||typeof t==\"symbol\"?t:Object.is(t?.valueOf?.(),-0)?\"-0\":String(t)}var yk=Xe(()=>{});function Mu(t){let e=[],r=t.length;if(r===0)return e;let s=0,a=\"\",n=\"\",c=!1;for(t.charCodeAt(0)===46&&(e.push(\"\"),s++);s<r;){let f=t[s];n?f===\"\\\\\"&&s+1<r?(s++,a+=t[s]):f===n?n=\"\":a+=f:c?f==='\"'||f===\"'\"?n=f:f===\"]\"?(c=!1,e.push(a),a=\"\"):a+=f:f===\"[\"?(c=!0,a&&(e.push(a),a=\"\")):f===\".\"?a&&(e.push(a),a=\"\"):a+=f,s++}return a&&e.push(a),e}var LE=Xe(()=>{});function va(t,e,r){if(t==null)return r;switch(typeof e){case\"string\":{if(bc(e))return r;let s=t[e];return s===void 0?NE(e)?va(t,Mu(e),r):r:s}case\"number\":case\"symbol\":{typeof e==\"number\"&&(e=OE(e));let s=t[e];return s===void 0?r:s}default:{if(Array.isArray(e))return Pze(t,e,r);if(Object.is(e?.valueOf(),-0)?e=\"-0\":e=String(e),bc(e))return r;let s=t[e];return s===void 0?r:s}}}function Pze(t,e,r){if(e.length===0)return r;let s=t;for(let a=0;a<e.length;a++){if(s==null||bc(e[a]))return r;s=s[e[a]]}return s===void 0?r:s}var Ek=Xe(()=>{wB();mk();yk();LE()});function C4(t){return t!==null&&(typeof t==\"object\"||typeof t==\"function\")}var Aae=Xe(()=>{});function ME(t){return t==null||typeof t!=\"object\"&&typeof t!=\"function\"}var Ik=Xe(()=>{});function Ck(t,e){return t===e||Number.isNaN(t)&&Number.isNaN(e)}var w4=Xe(()=>{});function Wd(t){return Object.getOwnPropertySymbols(t).filter(e=>Object.prototype.propertyIsEnumerable.call(t,e))}var wk=Xe(()=>{});function Yd(t){return t==null?t===void 0?\"[object Undefined]\":\"[object Null]\":Object.prototype.toString.call(t)}var Bk=Xe(()=>{});var vk,UE,_E,HE,Vd,Sk,Dk,bk,Pk,xk,pae,kk,jE,hae,Qk,Tk,Rk,Fk,Nk,gae,Ok,Lk,Mk,dae,Uk,_k,Hk=Xe(()=>{vk=\"[object RegExp]\",UE=\"[object String]\",_E=\"[object Number]\",HE=\"[object Boolean]\",Vd=\"[object Arguments]\",Sk=\"[object Symbol]\",Dk=\"[object Date]\",bk=\"[object Map]\",Pk=\"[object Set]\",xk=\"[object Array]\",pae=\"[object Function]\",kk=\"[object ArrayBuffer]\",jE=\"[object Object]\",hae=\"[object Error]\",Qk=\"[object DataView]\",Tk=\"[object Uint8Array]\",Rk=\"[object Uint8ClampedArray]\",Fk=\"[object Uint16Array]\",Nk=\"[object Uint32Array]\",gae=\"[object BigUint64Array]\",Ok=\"[object Int8Array]\",Lk=\"[object Int16Array]\",Mk=\"[object Int32Array]\",dae=\"[object BigInt64Array]\",Uk=\"[object Float32Array]\",_k=\"[object Float64Array]\"});function GE(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}var jk=Xe(()=>{});function mae(t,e){return u0(t,void 0,t,new Map,e)}function u0(t,e,r,s=new Map,a=void 0){let n=a?.(t,e,r,s);if(n!=null)return n;if(ME(t))return t;if(s.has(t))return s.get(t);if(Array.isArray(t)){let c=new Array(t.length);s.set(t,c);for(let f=0;f<t.length;f++)c[f]=u0(t[f],f,r,s,a);return Object.hasOwn(t,\"index\")&&(c.index=t.index),Object.hasOwn(t,\"input\")&&(c.input=t.input),c}if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp){let c=new RegExp(t.source,t.flags);return c.lastIndex=t.lastIndex,c}if(t instanceof Map){let c=new Map;s.set(t,c);for(let[f,p]of t)c.set(f,u0(p,f,r,s,a));return c}if(t instanceof Set){let c=new Set;s.set(t,c);for(let f of t)c.add(u0(f,void 0,r,s,a));return c}if(typeof Buffer<\"u\"&&Buffer.isBuffer(t))return t.subarray();if(GE(t)){let c=new(Object.getPrototypeOf(t)).constructor(t.length);s.set(t,c);for(let f=0;f<t.length;f++)c[f]=u0(t[f],f,r,s,a);return c}if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<\"u\"&&t instanceof SharedArrayBuffer)return t.slice(0);if(t instanceof DataView){let c=new DataView(t.buffer.slice(0),t.byteOffset,t.byteLength);return s.set(t,c),c0(c,t,r,s,a),c}if(typeof File<\"u\"&&t instanceof File){let c=new File([t],t.name,{type:t.type});return s.set(t,c),c0(c,t,r,s,a),c}if(t instanceof Blob){let c=new Blob([t],{type:t.type});return s.set(t,c),c0(c,t,r,s,a),c}if(t instanceof Error){let c=new t.constructor;return s.set(t,c),c.message=t.message,c.name=t.name,c.stack=t.stack,c.cause=t.cause,c0(c,t,r,s,a),c}if(typeof t==\"object\"&&xze(t)){let c=Object.create(Object.getPrototypeOf(t));return s.set(t,c),c0(c,t,r,s,a),c}return t}function c0(t,e,r=t,s,a){let n=[...Object.keys(e),...Wd(e)];for(let c=0;c<n.length;c++){let f=n[c],p=Object.getOwnPropertyDescriptor(t,f);(p==null||p.writable)&&(t[f]=u0(e[f],f,r,s,a))}}function xze(t){switch(Yd(t)){case Vd:case xk:case kk:case Qk:case HE:case Dk:case Uk:case _k:case Ok:case Lk:case Mk:case bk:case _E:case jE:case vk:case Pk:case UE:case Sk:case Tk:case Rk:case Fk:case Nk:return!0;default:return!1}}var B4=Xe(()=>{wk();Bk();Hk();Ik();jk()});function yae(t){return u0(t,void 0,t,new Map,void 0)}var Eae=Xe(()=>{B4()});function Iae(t,e){return mae(t,(r,s,a,n)=>{let c=e?.(r,s,a,n);if(c!=null)return c;if(typeof t==\"object\")switch(Object.prototype.toString.call(t)){case _E:case UE:case HE:{let f=new t.constructor(t?.valueOf());return c0(f,t),f}case Vd:{let f={};return c0(f,t),f.length=t.length,f[Symbol.iterator]=t[Symbol.iterator],f}default:return}})}var Cae=Xe(()=>{B4();Hk()});function f0(t){return Iae(t)}var v4=Xe(()=>{Cae()});function Gk(t,e=Number.MAX_SAFE_INTEGER){switch(typeof t){case\"number\":return Number.isInteger(t)&&t>=0&&t<e;case\"symbol\":return!1;case\"string\":return kze.test(t)}}var kze,S4=Xe(()=>{kze=/^(?:0|[1-9]\\d*)$/});function BB(t){return t!==null&&typeof t==\"object\"&&Yd(t)===\"[object Arguments]\"}var D4=Xe(()=>{Bk()});function vB(t,e){let r;if(Array.isArray(e)?r=e:typeof e==\"string\"&&NE(e)&&t?.[e]==null?r=Mu(e):r=[e],r.length===0)return!1;let s=t;for(let a=0;a<r.length;a++){let n=r[a];if((s==null||!Object.hasOwn(s,n))&&!((Array.isArray(s)||BB(s))&&Gk(n)&&n<s.length))return!1;s=s[n]}return!0}var b4=Xe(()=>{mk();S4();D4();LE()});function P4(t){return typeof t==\"object\"&&t!==null}var wae=Xe(()=>{});function Bae(t){return typeof t==\"symbol\"||t instanceof Symbol}var vae=Xe(()=>{});function Sae(t,e){return Array.isArray(t)?!1:typeof t==\"number\"||typeof t==\"boolean\"||t==null||Bae(t)?!0:typeof t==\"string\"&&(Tze.test(t)||!Qze.test(t))||e!=null&&Object.hasOwn(e,t)}var Qze,Tze,Dae=Xe(()=>{vae();Qze=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,Tze=/^\\w*$/});function A0(t,e){if(t==null)return!0;switch(typeof e){case\"symbol\":case\"number\":case\"object\":{if(Array.isArray(e))return bae(t,e);if(typeof e==\"number\"?e=OE(e):typeof e==\"object\"&&(Object.is(e?.valueOf(),-0)?e=\"-0\":e=String(e)),bc(e))return!1;if(t?.[e]===void 0)return!0;try{return delete t[e],!0}catch{return!1}}case\"string\":{if(t?.[e]===void 0&&NE(e))return bae(t,Mu(e));if(bc(e))return!1;try{return delete t[e],!0}catch{return!1}}}}function bae(t,e){let r=va(t,e.slice(0,-1),t),s=e[e.length-1];if(r?.[s]===void 0)return!0;if(bc(s))return!1;try{return delete r[s],!0}catch{return!1}}var x4=Xe(()=>{Ek();wB();mk();yk();LE()});function Pae(t){return t==null}var xae=Xe(()=>{});var kae,Qae=Xe(()=>{w4();kae=(t,e,r)=>{let s=t[e];(!(Object.hasOwn(t,e)&&Ck(s,r))||r===void 0&&!(e in t))&&(t[e]=r)}});function Tae(t,e,r,s){if(t==null&&!C4(t))return t;let a=Sae(e,t)?[e]:Array.isArray(e)?e:typeof e==\"string\"?Mu(e):[e],n=t;for(let c=0;c<a.length&&n!=null;c++){let f=OE(a[c]);if(bc(f))continue;let p;if(c===a.length-1)p=r(n[f]);else{let h=n[f],E=s?.(h,f,t);p=E!==void 0?E:C4(h)?h:Gk(a[c+1])?[]:{}}kae(n,f,p),n=n[f]}return t}var Rae=Xe(()=>{wB();Qae();S4();Dae();yk();Aae();LE()});function Jd(t,e,r){return Tae(t,e,()=>r,()=>{})}var k4=Xe(()=>{Rae()});function Fae(t,e=0,r={}){typeof r!=\"object\"&&(r={});let s=null,a=null,n=null,c=0,f=null,p,{leading:h=!1,trailing:E=!0,maxWait:C}=r,S=\"maxWait\"in r,P=S?Math.max(Number(C)||0,e):0,I=ue=>(s!==null&&(p=t.apply(a,s)),s=a=null,c=ue,p),R=ue=>(c=ue,f=setTimeout(ee,e),h&&s!==null?I(ue):p),N=ue=>(f=null,E&&s!==null?I(ue):p),U=ue=>{if(n===null)return!0;let le=ue-n,me=le>=e||le<0,pe=S&&ue-c>=P;return me||pe},W=ue=>{let le=n===null?0:ue-n,me=e-le,pe=P-(ue-c);return S?Math.min(me,pe):me},ee=()=>{let ue=Date.now();if(U(ue))return N(ue);f=setTimeout(ee,W(ue))},ie=function(...ue){let le=Date.now(),me=U(le);if(s=ue,a=this,n=le,me){if(f===null)return R(le);if(S)return clearTimeout(f),f=setTimeout(ee,e),I(le)}return f===null&&(f=setTimeout(ee,e)),p};return ie.cancel=()=>{f!==null&&clearTimeout(f),c=0,n=s=a=f=null},ie.flush=()=>f===null?p:N(Date.now()),ie}var Nae=Xe(()=>{});function Q4(t,e=0,r={}){let{leading:s=!0,trailing:a=!0}=r;return Fae(t,e,{leading:s,maxWait:e,trailing:a})}var Oae=Xe(()=>{Nae()});function T4(t){if(t==null)return\"\";if(typeof t==\"string\")return t;if(Array.isArray(t))return t.map(T4).join(\",\");let e=String(t);return e===\"0\"&&Object.is(Number(t),-0)?\"-0\":e}var Lae=Xe(()=>{});function R4(t){if(!t||typeof t!=\"object\")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.prototype||Object.getPrototypeOf(e)===null?Object.prototype.toString.call(t)===\"[object Object]\":!1}var Mae=Xe(()=>{});function Uae(t,e,r){return SB(t,e,void 0,void 0,void 0,void 0,r)}function SB(t,e,r,s,a,n,c){let f=c(t,e,r,s,a,n);if(f!==void 0)return f;if(typeof t==typeof e)switch(typeof t){case\"bigint\":case\"string\":case\"boolean\":case\"symbol\":case\"undefined\":return t===e;case\"number\":return t===e||Object.is(t,e);case\"function\":return t===e;case\"object\":return DB(t,e,n,c)}return DB(t,e,n,c)}function DB(t,e,r,s){if(Object.is(t,e))return!0;let a=Yd(t),n=Yd(e);if(a===Vd&&(a=jE),n===Vd&&(n=jE),a!==n)return!1;switch(a){case UE:return t.toString()===e.toString();case _E:{let p=t.valueOf(),h=e.valueOf();return Ck(p,h)}case HE:case Dk:case Sk:return Object.is(t.valueOf(),e.valueOf());case vk:return t.source===e.source&&t.flags===e.flags;case pae:return t===e}r=r??new Map;let c=r.get(t),f=r.get(e);if(c!=null&&f!=null)return c===e;r.set(t,e),r.set(e,t);try{switch(a){case bk:{if(t.size!==e.size)return!1;for(let[p,h]of t.entries())if(!e.has(p)||!SB(h,e.get(p),p,t,e,r,s))return!1;return!0}case Pk:{if(t.size!==e.size)return!1;let p=Array.from(t.values()),h=Array.from(e.values());for(let E=0;E<p.length;E++){let C=p[E],S=h.findIndex(P=>SB(C,P,void 0,t,e,r,s));if(S===-1)return!1;h.splice(S,1)}return!0}case xk:case Tk:case Rk:case Fk:case Nk:case gae:case Ok:case Lk:case Mk:case dae:case Uk:case _k:{if(typeof Buffer<\"u\"&&Buffer.isBuffer(t)!==Buffer.isBuffer(e)||t.length!==e.length)return!1;for(let p=0;p<t.length;p++)if(!SB(t[p],e[p],p,t,e,r,s))return!1;return!0}case kk:return t.byteLength!==e.byteLength?!1:DB(new Uint8Array(t),new Uint8Array(e),r,s);case Qk:return t.byteLength!==e.byteLength||t.byteOffset!==e.byteOffset?!1:DB(new Uint8Array(t),new Uint8Array(e),r,s);case hae:return t.name===e.name&&t.message===e.message;case jE:{if(!(DB(t.constructor,e.constructor,r,s)||R4(t)&&R4(e)))return!1;let h=[...Object.keys(t),...Wd(t)],E=[...Object.keys(e),...Wd(e)];if(h.length!==E.length)return!1;for(let C=0;C<h.length;C++){let S=h[C],P=t[S];if(!Object.hasOwn(e,S))return!1;let I=e[S];if(!SB(P,I,S,t,e,r,s))return!1}return!0}default:return!1}}finally{r.delete(t),r.delete(e)}}var _ae=Xe(()=>{Mae();wk();Bk();Hk();w4()});function Hae(){}var jae=Xe(()=>{});function F4(t,e){return Uae(t,e,Hae)}var Gae=Xe(()=>{_ae();jae()});function qae(t){return GE(t)}var Wae=Xe(()=>{jk()});function Yae(t){if(typeof t!=\"object\"||t==null)return!1;if(Object.getPrototypeOf(t)===null)return!0;if(Object.prototype.toString.call(t)!==\"[object Object]\"){let r=t[Symbol.toStringTag];return r==null||!Object.getOwnPropertyDescriptor(t,Symbol.toStringTag)?.writable?!1:t.toString()===`[object ${r}]`}let e=t;for(;Object.getPrototypeOf(e)!==null;)e=Object.getPrototypeOf(e);return Object.getPrototypeOf(t)===e}var Vae=Xe(()=>{});function Jae(t){if(ME(t))return t;if(Array.isArray(t)||GE(t)||t instanceof ArrayBuffer||typeof SharedArrayBuffer<\"u\"&&t instanceof SharedArrayBuffer)return t.slice(0);let e=Object.getPrototypeOf(t),r=e.constructor;if(t instanceof Date||t instanceof Map||t instanceof Set)return new r(t);if(t instanceof RegExp){let s=new r(t);return s.lastIndex=t.lastIndex,s}if(t instanceof DataView)return new r(t.buffer.slice(0));if(t instanceof Error){let s=new r(t.message);return s.stack=t.stack,s.name=t.name,s.cause=t.cause,s}if(typeof File<\"u\"&&t instanceof File)return new r([t],t.name,{type:t.type,lastModified:t.lastModified});if(typeof t==\"object\"){let s=Object.create(e);return Object.assign(s,t)}return t}var Kae=Xe(()=>{Ik();jk()});function N4(t,...e){let r=e.slice(0,-1),s=e[e.length-1],a=t;for(let n=0;n<r.length;n++){let c=r[n];a=qk(a,c,s,new Map)}return a}function qk(t,e,r,s){if(ME(t)&&(t=Object(t)),e==null||typeof e!=\"object\")return t;if(s.has(e))return Jae(s.get(e));if(s.set(e,t),Array.isArray(e)){e=e.slice();for(let n=0;n<e.length;n++)e[n]=e[n]??void 0}let a=[...Object.keys(e),...Wd(e)];for(let n=0;n<a.length;n++){let c=a[n];if(bc(c))continue;let f=e[c],p=t[c];if(BB(f)&&(f={...f}),BB(p)&&(p={...p}),typeof Buffer<\"u\"&&Buffer.isBuffer(f)&&(f=f0(f)),Array.isArray(f))if(typeof p==\"object\"&&p!=null){let E=[],C=Reflect.ownKeys(p);for(let S=0;S<C.length;S++){let P=C[S];E[P]=p[P]}p=E}else p=[];let h=r(p,f,c,t,e,s);h!=null?t[c]=h:Array.isArray(f)||P4(p)&&P4(f)?t[c]=qk(p,f,r,s):p==null&&Yae(f)?t[c]=qk({},f,r,s):p==null&&qae(f)?t[c]=f0(f):(p===void 0||f!==void 0)&&(t[c]=f)}return t}var zae=Xe(()=>{v4();wB();Kae();Ik();wk();D4();wae();Vae();Wae()});function O4(t,...e){if(t==null)return{};let r=yae(t);for(let s=0;s<e.length;s++){let a=e[s];switch(typeof a){case\"object\":{Array.isArray(a)||(a=Array.from(a));for(let n=0;n<a.length;n++){let c=a[n];A0(r,c)}break}case\"string\":case\"symbol\":case\"number\":{A0(r,a);break}}}return r}var Xae=Xe(()=>{x4();Eae()});function Kd(t,...e){if(Pae(t))return{};let r={};for(let s=0;s<e.length;s++){let a=e[s];switch(typeof a){case\"object\":{Array.isArray(a)||(uae(a)?a=Array.from(a):a=[a]);break}case\"string\":case\"symbol\":case\"number\":{a=[a];break}}for(let n of a){let c=va(t,n);c===void 0&&!vB(t,n)||(typeof n==\"string\"&&Object.hasOwn(t,n)?r[n]=c:Jd(r,n,c))}}return r}var Zae=Xe(()=>{Ek();b4();k4();fae();xae()});function $ae(t){return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}var ele=Xe(()=>{});function bB(t){return $ae(T4(t))}var tle=Xe(()=>{ele();Lae()});var ql=Xe(()=>{Oae();Gae();v4();Ek();b4();zae();Xae();Zae();k4();x4();tle();LE()});var je={};Vt(je,{AsyncActions:()=>U4,BufferStream:()=>M4,CachingStrategy:()=>fle,DefaultStream:()=>_4,allSettledSafe:()=>Uu,assertNever:()=>G4,bufferStream:()=>WE,buildIgnorePattern:()=>Uze,convertMapsToIndexableObjects:()=>Yk,dynamicRequire:()=>Pp,escapeRegExp:()=>Fze,getArrayWithDefault:()=>xB,getFactoryWithDefault:()=>Yl,getMapWithDefault:()=>q4,getSetWithDefault:()=>bp,groupBy:()=>jze,isIndexableObject:()=>L4,isPathLike:()=>_ze,isTaggedYarnVersion:()=>Rze,makeDeferred:()=>lle,mapAndFilter:()=>Wl,mapAndFind:()=>p0,mergeIntoTarget:()=>ple,overrideType:()=>Nze,parseBoolean:()=>kB,parseDuration:()=>Jk,parseInt:()=>YE,parseOptionalBoolean:()=>Ale,plural:()=>Wk,prettifyAsyncErrors:()=>qE,prettifySyncErrors:()=>W4,releaseAfterUseAsync:()=>Lze,replaceEnvVariables:()=>Vk,sortMap:()=>qs,toMerged:()=>Hze,tryParseOptionalBoolean:()=>Y4,validateEnum:()=>Oze});function Rze(t){return!!(sle.default.valid(t)&&t.match(/^[^-]+(-rc\\.[0-9]+)?$/))}function Wk(t,{one:e,more:r,zero:s=r}){return t===0?s:t===1?e:r}function Fze(t){return t.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function Nze(t){}function G4(t){throw new Error(`Assertion failed: Unexpected object '${t}'`)}function Oze(t,e){let r=Object.values(t);if(!r.includes(e))throw new nt(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${r.map(s=>JSON.stringify(s)).join(\", \")})`);return e}function Wl(t,e){let r=[];for(let s of t){let a=e(s);a!==ole&&r.push(a)}return r}function p0(t,e){for(let r of t){let s=e(r);if(s!==ale)return s}}function L4(t){return typeof t==\"object\"&&t!==null}async function Uu(t){let e=await Promise.allSettled(t),r=[];for(let s of e){if(s.status===\"rejected\")throw s.reason;r.push(s.value)}return r}function Yk(t){if(t instanceof Map&&(t=Object.fromEntries(t)),L4(t))for(let e of Object.keys(t)){let r=t[e];L4(r)&&(t[e]=Yk(r))}return t}function Yl(t,e,r){let s=t.get(e);return typeof s>\"u\"&&t.set(e,s=r()),s}function xB(t,e){let r=t.get(e);return typeof r>\"u\"&&t.set(e,r=[]),r}function bp(t,e){let r=t.get(e);return typeof r>\"u\"&&t.set(e,r=new Set),r}function q4(t,e){let r=t.get(e);return typeof r>\"u\"&&t.set(e,r=new Map),r}async function Lze(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function qE(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function W4(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function WE(t){return await new Promise((e,r)=>{let s=[];t.on(\"error\",a=>{r(a)}),t.on(\"data\",a=>{s.push(a)}),t.on(\"end\",()=>{e(Buffer.concat(s))})})}function lle(){let t,e;return{promise:new Promise((s,a)=>{t=s,e=a}),resolve:t,reject:e}}function cle(t){return PB(fe.fromPortablePath(t))}function ule(path){let physicalPath=fe.fromPortablePath(path),currentCacheEntry=PB.cache[physicalPath];delete PB.cache[physicalPath];let result;try{result=cle(physicalPath);let freshCacheEntry=PB.cache[physicalPath],dynamicModule=eval(\"module\"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{PB.cache[physicalPath]=currentCacheEntry}return result}function Mze(t){let e=rle.get(t),r=ce.statSync(t);if(e?.mtime===r.mtimeMs)return e.instance;let s=ule(t);return rle.set(t,{mtime:r.mtimeMs,instance:s}),s}function Pp(t,{cachingStrategy:e=2}={}){switch(e){case 0:return ule(t);case 1:return Mze(t);case 2:return cle(t);default:throw new Error(\"Unsupported caching strategy\")}}function qs(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let s=[];for(let n of e)s.push(r.map(c=>n(c)));let a=r.map((n,c)=>c);return a.sort((n,c)=>{for(let f of s){let p=f[n]<f[c]?-1:f[n]>f[c]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function Uze(t){return t.length===0?null:t.map(e=>`(${nle.default.makeRe(e,{windows:!1,dot:!0}).source})`).join(\"|\")}function Vk(t,{env:e}){let r=/\\\\?\\${(?<variableName>[\\d\\w_]+)(?<colon>:)?(?:-(?<fallback>[^}]*))?}/g;return t.replace(r,(s,...a)=>{if(s.startsWith(\"\\\\\"))return s.slice(1);let{variableName:n,colon:c,fallback:f}=a[a.length-1],p=Object.hasOwn(e,n),h=e[n];if(h||p&&!c)return h;if(f!=null)return f;throw new nt(`Environment variable not found (${n})`)})}function kB(t){switch(t){case\"true\":case\"1\":case 1:case!0:return!0;case\"false\":case\"0\":case 0:case!1:return!1;default:throw new Error(`Couldn't parse \"${t}\" as a boolean`)}}function Ale(t){return typeof t>\"u\"?t:kB(t)}function Y4(t){try{return Ale(t)}catch{return null}}function _ze(t){return!!(fe.isAbsolute(t)||t.match(/^(\\.{1,2}|~)\\//))}function ple(t,...e){let r=c=>({value:c}),s=r(t),a=e.map(c=>r(c)),{value:n}=N4(s,...a,(c,f)=>{if(Array.isArray(c)&&Array.isArray(f)){for(let p of f)c.find(h=>F4(h,p))||c.push(p);return c}});return n}function Hze(...t){return ple({},...t)}function jze(t,e){let r=Object.create(null);for(let s of t){let a=s[e];r[a]??=[],r[a].push(s)}return r}function YE(t){return typeof t==\"string\"?Number.parseInt(t,10):t}function Jk(t,e){let r=Gze.exec(t)?.groups;if(!r)throw new Error(`Couldn't parse \"${t}\" as a duration`);if(r.unit===void 0)return parseFloat(r.num);let s=H4[r.unit];if(!s)throw new Error(`Invalid duration unit \"${r.unit}\"`);return parseFloat(r.num)*s/H4[e]}var nle,ile,sle,j4,ole,ale,M4,U4,_4,PB,rle,fle,H4,Gze,Pc=Xe(()=>{Dt();Yt();ql();nle=ut(Go()),ile=ut(Ld()),sle=ut(Ai()),j4=Ie(\"stream\");ole=Symbol();Wl.skip=ole;ale=Symbol();p0.skip=ale;M4=class extends j4.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(r,s,a){if(s!==\"buffer\"||!Buffer.isBuffer(r))throw new Error(\"Assertion failed: BufferStream only accept buffers\");this.chunks.push(r),a(null,null)}_flush(r){r(null,Buffer.concat(this.chunks))}};U4=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,ile.default)(e)}set(e,r){let s=this.deferred.get(e);typeof s>\"u\"&&this.deferred.set(e,s=lle());let a=this.limit(()=>r());return this.promises.set(e,a),a.then(()=>{this.promises.get(e)===a&&s.resolve()},n=>{this.promises.get(e)===a&&s.reject(n)}),s.promise}reduce(e,r){let s=this.promises.get(e)??Promise.resolve();this.set(e,()=>r(s))}async wait(){await Promise.all(this.promises.values())}},_4=class extends j4.Transform{constructor(r=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=r}_transform(r,s,a){if(s!==\"buffer\"||!Buffer.isBuffer(r))throw new Error(\"Assertion failed: DefaultStream only accept buffers\");this.active=!1,a(null,r)}_flush(r){this.active&&this.ifEmpty.length>0?r(null,this.ifEmpty):r(null)}},PB=eval(\"require\");rle=new Map;fle=(s=>(s[s.NoCache=0]=\"NoCache\",s[s.FsTime=1]=\"FsTime\",s[s.Node=2]=\"Node\",s))(fle||{});H4={ms:1,s:1e3,m:60*1e3,h:60*60*1e3,d:24*60*60*1e3,w:7*24*60*60*1e3},Gze=new RegExp(`^(?<num>\\\\d*\\\\.?\\\\d+)(?<unit>${Object.keys(H4).join(\"|\")})?$`)});var VE,V4,J4,hle=Xe(()=>{VE=(r=>(r.HARD=\"HARD\",r.SOFT=\"SOFT\",r))(VE||{}),V4=(s=>(s.Dependency=\"Dependency\",s.PeerDependency=\"PeerDependency\",s.PeerDependencyMeta=\"PeerDependencyMeta\",s))(V4||{}),J4=(s=>(s.Inactive=\"inactive\",s.Redundant=\"redundant\",s.Active=\"active\",s))(J4||{})});var he={};Vt(he,{LogLevel:()=>eQ,Style:()=>Xk,Type:()=>ht,addLogFilterSupport:()=>RB,applyColor:()=>ri,applyHyperlink:()=>KE,applyStyle:()=>zd,json:()=>Xd,jsonOrPretty:()=>Yze,mark:()=>$4,pretty:()=>Ht,prettyField:()=>Kf,prettyList:()=>Z4,prettyTruncatedLocatorList:()=>$k,stripAnsi:()=>JE.default,supportsColor:()=>Zk,supportsHyperlinks:()=>X4,tuple:()=>_u});function gle(t){let e=[\"KiB\",\"MiB\",\"GiB\",\"TiB\"],r=e.length;for(;r>1&&t<1024**r;)r-=1;let s=1024**r;return`${Math.floor(t*100/s)/100} ${e[r-1]}`}function Kk(t,e){if(Array.isArray(e))return e.length===0?ri(t,\"[]\",ht.CODE):ri(t,\"[ \",ht.CODE)+e.map(r=>Kk(t,r)).join(\", \")+ri(t,\" ]\",ht.CODE);if(typeof e==\"string\")return ri(t,JSON.stringify(e),ht.STRING);if(typeof e==\"number\")return ri(t,JSON.stringify(e),ht.NUMBER);if(typeof e==\"boolean\")return ri(t,JSON.stringify(e),ht.BOOLEAN);if(e===null)return ri(t,\"null\",ht.NULL);if(typeof e==\"object\"&&Object.getPrototypeOf(e)===Object.prototype){let r=Object.entries(e);return r.length===0?ri(t,\"{}\",ht.CODE):ri(t,\"{ \",ht.CODE)+r.map(([s,a])=>`${Kk(t,s)}: ${Kk(t,a)}`).join(\", \")+ri(t,\" }\",ht.CODE)}if(typeof e>\"u\")return ri(t,\"undefined\",ht.NULL);throw new Error(\"Assertion failed: The value doesn't seem to be a valid JSON object\")}function _u(t,e){return[e,t]}function zd(t,e,r){return t.get(\"enableColors\")&&r&2&&(e=TB.default.bold(e)),e}function ri(t,e,r){if(!t.get(\"enableColors\"))return e;let s=qze.get(r);if(s===null)return e;let a=typeof s>\"u\"?r:z4.level>=3?s[0]:s[1],n=typeof a==\"number\"?K4.ansi256(a):a.startsWith(\"#\")?K4.hex(a):K4[a];if(typeof n!=\"function\")throw new Error(`Invalid format type ${a}`);return n(e)}function KE(t,e,r){return t.get(\"enableHyperlinks\")?Wze?`\\x1B]8;;${r}\\x1B\\\\${e}\\x1B]8;;\\x1B\\\\`:`\\x1B]8;;${r}\\x07${e}\\x1B]8;;\\x07`:e}function Ht(t,e,r){if(e===null)return ri(t,\"null\",ht.NULL);if(Object.hasOwn(zk,r))return zk[r].pretty(t,e);if(typeof e!=\"string\")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return ri(t,e,r)}function Z4(t,e,r,{separator:s=\", \"}={}){return[...e].map(a=>Ht(t,a,r)).join(s)}function Xd(t,e){if(t===null)return null;if(Object.hasOwn(zk,e))return zk[e].json(t);if(typeof t!=\"string\")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function Yze(t,e,[r,s]){return t?Xd(r,s):Ht(e,r,s)}function $4(t){return{Check:ri(t,\"\\u2713\",\"green\"),Cross:ri(t,\"\\u2718\",\"red\"),Question:ri(t,\"?\",\"cyan\")}}function Kf(t,{label:e,value:[r,s]}){return`${Ht(t,e,ht.CODE)}: ${Ht(t,r,s)}`}function $k(t,e,r){let s=[],a=[...e],n=r;for(;a.length>0;){let h=a[0],E=`${Yr(t,h)}, `,C=e3(h).length+2;if(s.length>0&&n<C)break;s.push([E,C]),n-=C,a.shift()}if(a.length===0)return s.map(([h])=>h).join(\"\").slice(0,-2);let c=\"X\".repeat(a.length.toString().length),f=`and ${c} more.`,p=a.length;for(;s.length>1&&n<f.length;)n+=s[s.length-1][1],p+=1,s.pop();return[s.map(([h])=>h).join(\"\"),f.replace(c,Ht(t,p,ht.NUMBER))].join(\"\")}function RB(t,{configuration:e}){let r=e.get(\"logFilters\"),s=new Map,a=new Map,n=[];for(let C of r){let S=C.get(\"level\");if(typeof S>\"u\")continue;let P=C.get(\"code\");typeof P<\"u\"&&s.set(P,S);let I=C.get(\"text\");typeof I<\"u\"&&a.set(I,S);let R=C.get(\"pattern\");typeof R<\"u\"&&n.push([dle.default.matcher(R,{contains:!0}),S])}n.reverse();let c=(C,S,P)=>{if(C===null||C===0)return P;let I=a.size>0||n.length>0?(0,JE.default)(S):S;if(a.size>0){let R=a.get(I);if(typeof R<\"u\")return R??P}if(n.length>0){for(let[R,N]of n)if(R(I))return N??P}if(s.size>0){let R=s.get(Yf(C));if(typeof R<\"u\")return R??P}return P},f=t.reportInfo,p=t.reportWarning,h=t.reportError,E=function(C,S,P,I){switch(c(S,P,I)){case\"info\":f.call(C,S,P);break;case\"warning\":p.call(C,S??0,P);break;case\"error\":h.call(C,S??0,P);break}};t.reportInfo=function(...C){return E(this,...C,\"info\")},t.reportWarning=function(...C){return E(this,...C,\"warning\")},t.reportError=function(...C){return E(this,...C,\"error\")}}var TB,QB,dle,JE,ht,Xk,z4,Zk,X4,K4,qze,qo,zk,Wze,eQ,xc=Xe(()=>{Dt();TB=ut(TE()),QB=ut(Fd());Yt();dle=ut(Go()),JE=ut(dk());Gx();Wo();ht={NO_HINT:\"NO_HINT\",ID:\"ID\",NULL:\"NULL\",SCOPE:\"SCOPE\",NAME:\"NAME\",RANGE:\"RANGE\",REFERENCE:\"REFERENCE\",NUMBER:\"NUMBER\",STRING:\"STRING\",BOOLEAN:\"BOOLEAN\",PATH:\"PATH\",URL:\"URL\",ADDED:\"ADDED\",REMOVED:\"REMOVED\",CODE:\"CODE\",INSPECT:\"INSPECT\",DURATION:\"DURATION\",SIZE:\"SIZE\",SIZE_DIFF:\"SIZE_DIFF\",IDENT:\"IDENT\",DESCRIPTOR:\"DESCRIPTOR\",LOCATOR:\"LOCATOR\",RESOLUTION:\"RESOLUTION\",DEPENDENT:\"DEPENDENT\",PACKAGE_EXTENSION:\"PACKAGE_EXTENSION\",SETTING:\"SETTING\",MARKDOWN:\"MARKDOWN\",MARKDOWN_INLINE:\"MARKDOWN_INLINE\"},Xk=(e=>(e[e.BOLD=2]=\"BOLD\",e))(Xk||{}),z4=QB.default.GITHUB_ACTIONS?{level:2}:TB.default.supportsColor?{level:TB.default.supportsColor.level}:{level:0},Zk=z4.level!==0,X4=Zk&&!QB.default.GITHUB_ACTIONS&&!QB.default.CIRCLE&&!QB.default.GITLAB,K4=new TB.default.Instance(z4),qze=new Map([[ht.NO_HINT,null],[ht.NULL,[\"#a853b5\",129]],[ht.SCOPE,[\"#d75f00\",166]],[ht.NAME,[\"#d7875f\",173]],[ht.RANGE,[\"#00afaf\",37]],[ht.REFERENCE,[\"#87afff\",111]],[ht.NUMBER,[\"#ffd700\",220]],[ht.STRING,[\"#b4bd68\",32]],[ht.BOOLEAN,[\"#faa023\",209]],[ht.PATH,[\"#d75fd7\",170]],[ht.URL,[\"#d75fd7\",170]],[ht.ADDED,[\"#5faf00\",70]],[ht.REMOVED,[\"#ff3131\",160]],[ht.CODE,[\"#87afff\",111]],[ht.SIZE,[\"#ffd700\",220]]]),qo=t=>t;zk={[ht.ID]:qo({pretty:(t,e)=>typeof e==\"number\"?ri(t,`${e}`,ht.NUMBER):ri(t,e,ht.CODE),json:t=>t}),[ht.INSPECT]:qo({pretty:(t,e)=>Kk(t,e),json:t=>t}),[ht.NUMBER]:qo({pretty:(t,e)=>ri(t,`${e}`,ht.NUMBER),json:t=>t}),[ht.IDENT]:qo({pretty:(t,e)=>$i(t,e),json:t=>un(t)}),[ht.LOCATOR]:qo({pretty:(t,e)=>Yr(t,e),json:t=>ll(t)}),[ht.DESCRIPTOR]:qo({pretty:(t,e)=>ni(t,e),json:t=>al(t)}),[ht.RESOLUTION]:qo({pretty:(t,{descriptor:e,locator:r})=>FB(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:al(t),locator:e!==null?ll(e):null})}),[ht.DEPENDENT]:qo({pretty:(t,{locator:e,descriptor:r})=>t3(t,e,r),json:({locator:t,descriptor:e})=>({locator:ll(t),descriptor:al(e)})}),[ht.PACKAGE_EXTENSION]:qo({pretty:(t,e)=>{switch(e.type){case\"Dependency\":return`${$i(t,e.parentDescriptor)} \\u27A4 ${ri(t,\"dependencies\",ht.CODE)} \\u27A4 ${$i(t,e.descriptor)}`;case\"PeerDependency\":return`${$i(t,e.parentDescriptor)} \\u27A4 ${ri(t,\"peerDependencies\",ht.CODE)} \\u27A4 ${$i(t,e.descriptor)}`;case\"PeerDependencyMeta\":return`${$i(t,e.parentDescriptor)} \\u27A4 ${ri(t,\"peerDependenciesMeta\",ht.CODE)} \\u27A4 ${$i(t,Sa(e.selector))} \\u27A4 ${ri(t,e.key,ht.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case\"Dependency\":return`${un(t.parentDescriptor)} > ${un(t.descriptor)}`;case\"PeerDependency\":return`${un(t.parentDescriptor)} >> ${un(t.descriptor)}`;case\"PeerDependencyMeta\":return`${un(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[ht.SETTING]:qo({pretty:(t,e)=>(t.get(e),KE(t,ri(t,e,ht.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[ht.DURATION]:qo({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),s=Math.ceil((e-r*60*1e3)/1e3);return s===0?`${r}m`:`${r}m ${s}s`}else{let r=Math.floor(e/1e3),s=e-r*1e3;return s===0?`${r}s`:`${r}s ${s}ms`}},json:t=>t}),[ht.SIZE]:qo({pretty:(t,e)=>ri(t,gle(e),ht.NUMBER),json:t=>t}),[ht.SIZE_DIFF]:qo({pretty:(t,e)=>{let r=e>=0?\"+\":\"-\",s=r===\"+\"?ht.REMOVED:ht.ADDED;return ri(t,`${r} ${gle(Math.max(Math.abs(e),1))}`,s)},json:t=>t}),[ht.PATH]:qo({pretty:(t,e)=>ri(t,fe.fromPortablePath(e),ht.PATH),json:t=>fe.fromPortablePath(t)}),[ht.MARKDOWN]:qo({pretty:(t,{text:e,format:r,paragraphs:s})=>Ho(e,{format:r,paragraphs:s}),json:({text:t})=>t}),[ht.MARKDOWN_INLINE]:qo({pretty:(t,e)=>(e=e.replace(/(`+)((?:.|[\\n])*?)\\1/g,(r,s,a)=>Ht(t,s+a+s,ht.CODE)),e=e.replace(/(\\*\\*)((?:.|[\\n])*?)\\1/g,(r,s,a)=>zd(t,a,2)),e),json:t=>t})};Wze=!!process.env.KONSOLE_VERSION;eQ=(a=>(a.Error=\"error\",a.Warning=\"warning\",a.Info=\"info\",a.Discard=\"discard\",a))(eQ||{})});var mle=_(zE=>{\"use strict\";Object.defineProperty(zE,\"__esModule\",{value:!0});zE.splitWhen=zE.flatten=void 0;function Vze(t){return t.reduce((e,r)=>[].concat(e,r),[])}zE.flatten=Vze;function Jze(t,e){let r=[[]],s=0;for(let a of t)e(a)?(s++,r[s]=[]):r[s].push(a);return r}zE.splitWhen=Jze});var yle=_(tQ=>{\"use strict\";Object.defineProperty(tQ,\"__esModule\",{value:!0});tQ.isEnoentCodeError=void 0;function Kze(t){return t.code===\"ENOENT\"}tQ.isEnoentCodeError=Kze});var Ele=_(rQ=>{\"use strict\";Object.defineProperty(rQ,\"__esModule\",{value:!0});rQ.createDirentFromStats=void 0;var r3=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function zze(t,e){return new r3(t,e)}rQ.createDirentFromStats=zze});var Ble=_(cs=>{\"use strict\";Object.defineProperty(cs,\"__esModule\",{value:!0});cs.convertPosixPathToPattern=cs.convertWindowsPathToPattern=cs.convertPathToPattern=cs.escapePosixPath=cs.escapeWindowsPath=cs.escape=cs.removeLeadingDotSegment=cs.makeAbsolute=cs.unixify=void 0;var Xze=Ie(\"os\"),Zze=Ie(\"path\"),Ile=Xze.platform()===\"win32\",$ze=2,eXe=/(\\\\?)([()*?[\\]{|}]|^!|[!+@](?=\\()|\\\\(?![!()*+?@[\\]{|}]))/g,tXe=/(\\\\?)([()[\\]{}]|^!|[!+@](?=\\())/g,rXe=/^\\\\\\\\([.?])/,nXe=/\\\\(?![!()+@[\\]{}])/g;function iXe(t){return t.replace(/\\\\/g,\"/\")}cs.unixify=iXe;function sXe(t,e){return Zze.resolve(t,e)}cs.makeAbsolute=sXe;function oXe(t){if(t.charAt(0)===\".\"){let e=t.charAt(1);if(e===\"/\"||e===\"\\\\\")return t.slice($ze)}return t}cs.removeLeadingDotSegment=oXe;cs.escape=Ile?n3:i3;function n3(t){return t.replace(tXe,\"\\\\$2\")}cs.escapeWindowsPath=n3;function i3(t){return t.replace(eXe,\"\\\\$2\")}cs.escapePosixPath=i3;cs.convertPathToPattern=Ile?Cle:wle;function Cle(t){return n3(t).replace(rXe,\"//$1\").replace(nXe,\"/\")}cs.convertWindowsPathToPattern=Cle;function wle(t){return i3(t)}cs.convertPosixPathToPattern=wle});var Sle=_((JOt,vle)=>{vle.exports=function(e){if(typeof e!=\"string\"||e===\"\")return!1;for(var r;r=/(\\\\).|([@?!+*]\\(.*\\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var Ple=_((KOt,ble)=>{var aXe=Sle(),Dle={\"{\":\"}\",\"(\":\")\",\"[\":\"]\"},lXe=function(t){if(t[0]===\"!\")return!0;for(var e=0,r=-2,s=-2,a=-2,n=-2,c=-2;e<t.length;){if(t[e]===\"*\"||t[e+1]===\"?\"&&/[\\].+)]/.test(t[e])||s!==-1&&t[e]===\"[\"&&t[e+1]!==\"]\"&&(s<e&&(s=t.indexOf(\"]\",e)),s>e&&(c===-1||c>s||(c=t.indexOf(\"\\\\\",e),c===-1||c>s)))||a!==-1&&t[e]===\"{\"&&t[e+1]!==\"}\"&&(a=t.indexOf(\"}\",e),a>e&&(c=t.indexOf(\"\\\\\",e),c===-1||c>a))||n!==-1&&t[e]===\"(\"&&t[e+1]===\"?\"&&/[:!=]/.test(t[e+2])&&t[e+3]!==\")\"&&(n=t.indexOf(\")\",e),n>e&&(c=t.indexOf(\"\\\\\",e),c===-1||c>n))||r!==-1&&t[e]===\"(\"&&t[e+1]!==\"|\"&&(r<e&&(r=t.indexOf(\"|\",e)),r!==-1&&t[r+1]!==\")\"&&(n=t.indexOf(\")\",r),n>r&&(c=t.indexOf(\"\\\\\",r),c===-1||c>n))))return!0;if(t[e]===\"\\\\\"){var f=t[e+1];e+=2;var p=Dle[f];if(p){var h=t.indexOf(p,e);h!==-1&&(e=h+1)}if(t[e]===\"!\")return!0}else e++}return!1},cXe=function(t){if(t[0]===\"!\")return!0;for(var e=0;e<t.length;){if(/[*?{}()[\\]]/.test(t[e]))return!0;if(t[e]===\"\\\\\"){var r=t[e+1];e+=2;var s=Dle[r];if(s){var a=t.indexOf(s,e);a!==-1&&(e=a+1)}if(t[e]===\"!\")return!0}else e++}return!1};ble.exports=function(e,r){if(typeof e!=\"string\"||e===\"\")return!1;if(aXe(e))return!0;var s=lXe;return r&&r.strict===!1&&(s=cXe),s(e)}});var kle=_((zOt,xle)=>{\"use strict\";var uXe=Ple(),fXe=Ie(\"path\").posix.dirname,AXe=Ie(\"os\").platform()===\"win32\",s3=\"/\",pXe=/\\\\/g,hXe=/[\\{\\[].*[\\}\\]]$/,gXe=/(^|[^\\\\])([\\{\\[]|\\([^\\)]+$)/,dXe=/\\\\([\\!\\*\\?\\|\\[\\]\\(\\)\\{\\}])/g;xle.exports=function(e,r){var s=Object.assign({flipBackslashes:!0},r);s.flipBackslashes&&AXe&&e.indexOf(s3)<0&&(e=e.replace(pXe,s3)),hXe.test(e)&&(e+=s3),e+=\"a\";do e=fXe(e);while(uXe(e)||gXe.test(e));return e.replace(dXe,\"$1\")}});var Mle=_(jr=>{\"use strict\";Object.defineProperty(jr,\"__esModule\",{value:!0});jr.removeDuplicateSlashes=jr.matchAny=jr.convertPatternsToRe=jr.makeRe=jr.getPatternParts=jr.expandBraceExpansion=jr.expandPatternsWithBraceExpansion=jr.isAffectDepthOfReadingPattern=jr.endsWithSlashGlobStar=jr.hasGlobStar=jr.getBaseDirectory=jr.isPatternRelatedToParentDirectory=jr.getPatternsOutsideCurrentDirectory=jr.getPatternsInsideCurrentDirectory=jr.getPositivePatterns=jr.getNegativePatterns=jr.isPositivePattern=jr.isNegativePattern=jr.convertToNegativePattern=jr.convertToPositivePattern=jr.isDynamicPattern=jr.isStaticPattern=void 0;var mXe=Ie(\"path\"),yXe=kle(),o3=Go(),Qle=\"**\",EXe=\"\\\\\",IXe=/[*?]|^!/,CXe=/\\[[^[]*]/,wXe=/(?:^|[^!*+?@])\\([^(]*\\|[^|]*\\)/,BXe=/[!*+?@]\\([^(]*\\)/,vXe=/,|\\.\\./,SXe=/(?!^)\\/{2,}/g;function Tle(t,e={}){return!Rle(t,e)}jr.isStaticPattern=Tle;function Rle(t,e={}){return t===\"\"?!1:!!(e.caseSensitiveMatch===!1||t.includes(EXe)||IXe.test(t)||CXe.test(t)||wXe.test(t)||e.extglob!==!1&&BXe.test(t)||e.braceExpansion!==!1&&DXe(t))}jr.isDynamicPattern=Rle;function DXe(t){let e=t.indexOf(\"{\");if(e===-1)return!1;let r=t.indexOf(\"}\",e+1);if(r===-1)return!1;let s=t.slice(e,r);return vXe.test(s)}function bXe(t){return nQ(t)?t.slice(1):t}jr.convertToPositivePattern=bXe;function PXe(t){return\"!\"+t}jr.convertToNegativePattern=PXe;function nQ(t){return t.startsWith(\"!\")&&t[1]!==\"(\"}jr.isNegativePattern=nQ;function Fle(t){return!nQ(t)}jr.isPositivePattern=Fle;function xXe(t){return t.filter(nQ)}jr.getNegativePatterns=xXe;function kXe(t){return t.filter(Fle)}jr.getPositivePatterns=kXe;function QXe(t){return t.filter(e=>!a3(e))}jr.getPatternsInsideCurrentDirectory=QXe;function TXe(t){return t.filter(a3)}jr.getPatternsOutsideCurrentDirectory=TXe;function a3(t){return t.startsWith(\"..\")||t.startsWith(\"./..\")}jr.isPatternRelatedToParentDirectory=a3;function RXe(t){return yXe(t,{flipBackslashes:!1})}jr.getBaseDirectory=RXe;function FXe(t){return t.includes(Qle)}jr.hasGlobStar=FXe;function Nle(t){return t.endsWith(\"/\"+Qle)}jr.endsWithSlashGlobStar=Nle;function NXe(t){let e=mXe.basename(t);return Nle(t)||Tle(e)}jr.isAffectDepthOfReadingPattern=NXe;function OXe(t){return t.reduce((e,r)=>e.concat(Ole(r)),[])}jr.expandPatternsWithBraceExpansion=OXe;function Ole(t){let e=o3.braces(t,{expand:!0,nodupes:!0,keepEscaping:!0});return e.sort((r,s)=>r.length-s.length),e.filter(r=>r!==\"\")}jr.expandBraceExpansion=Ole;function LXe(t,e){let{parts:r}=o3.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.length===0&&(r=[t]),r[0].startsWith(\"/\")&&(r[0]=r[0].slice(1),r.unshift(\"\")),r}jr.getPatternParts=LXe;function Lle(t,e){return o3.makeRe(t,e)}jr.makeRe=Lle;function MXe(t,e){return t.map(r=>Lle(r,e))}jr.convertPatternsToRe=MXe;function UXe(t,e){return e.some(r=>r.test(t))}jr.matchAny=UXe;function _Xe(t){return t.replace(SXe,\"/\")}jr.removeDuplicateSlashes=_Xe});var jle=_((ZOt,Hle)=>{\"use strict\";var HXe=Ie(\"stream\"),Ule=HXe.PassThrough,jXe=Array.prototype.slice;Hle.exports=GXe;function GXe(){let t=[],e=jXe.call(arguments),r=!1,s=e[e.length-1];s&&!Array.isArray(s)&&s.pipe==null?e.pop():s={};let a=s.end!==!1,n=s.pipeError===!0;s.objectMode==null&&(s.objectMode=!0),s.highWaterMark==null&&(s.highWaterMark=64*1024);let c=Ule(s);function f(){for(let E=0,C=arguments.length;E<C;E++)t.push(_le(arguments[E],s));return p(),this}function p(){if(r)return;r=!0;let E=t.shift();if(!E){process.nextTick(h);return}Array.isArray(E)||(E=[E]);let C=E.length+1;function S(){--C>0||(r=!1,p())}function P(I){function R(){I.removeListener(\"merge2UnpipeEnd\",R),I.removeListener(\"end\",R),n&&I.removeListener(\"error\",N),S()}function N(U){c.emit(\"error\",U)}if(I._readableState.endEmitted)return S();I.on(\"merge2UnpipeEnd\",R),I.on(\"end\",R),n&&I.on(\"error\",N),I.pipe(c,{end:!1}),I.resume()}for(let I=0;I<E.length;I++)P(E[I]);S()}function h(){r=!1,c.emit(\"queueDrain\"),a&&c.end()}return c.setMaxListeners(0),c.add=f,c.on(\"unpipe\",function(E){E.emit(\"merge2UnpipeEnd\")}),e.length&&f.apply(null,e),c}function _le(t,e){if(Array.isArray(t))for(let r=0,s=t.length;r<s;r++)t[r]=_le(t[r],e);else{if(!t._readableState&&t.pipe&&(t=t.pipe(Ule(e))),!t._readableState||!t.pause||!t.pipe)throw new Error(\"Only readable stream can be merged.\");t.pause()}return t}});var qle=_(iQ=>{\"use strict\";Object.defineProperty(iQ,\"__esModule\",{value:!0});iQ.merge=void 0;var qXe=jle();function WXe(t){let e=qXe(t);return t.forEach(r=>{r.once(\"error\",s=>e.emit(\"error\",s))}),e.once(\"close\",()=>Gle(t)),e.once(\"end\",()=>Gle(t)),e}iQ.merge=WXe;function Gle(t){t.forEach(e=>e.emit(\"close\"))}});var Wle=_(XE=>{\"use strict\";Object.defineProperty(XE,\"__esModule\",{value:!0});XE.isEmpty=XE.isString=void 0;function YXe(t){return typeof t==\"string\"}XE.isString=YXe;function VXe(t){return t===\"\"}XE.isEmpty=VXe});var xp=_(Yo=>{\"use strict\";Object.defineProperty(Yo,\"__esModule\",{value:!0});Yo.string=Yo.stream=Yo.pattern=Yo.path=Yo.fs=Yo.errno=Yo.array=void 0;var JXe=mle();Yo.array=JXe;var KXe=yle();Yo.errno=KXe;var zXe=Ele();Yo.fs=zXe;var XXe=Ble();Yo.path=XXe;var ZXe=Mle();Yo.pattern=ZXe;var $Xe=qle();Yo.stream=$Xe;var eZe=Wle();Yo.string=eZe});var Kle=_(Vo=>{\"use strict\";Object.defineProperty(Vo,\"__esModule\",{value:!0});Vo.convertPatternGroupToTask=Vo.convertPatternGroupsToTasks=Vo.groupPatternsByBaseDirectory=Vo.getNegativePatternsAsPositive=Vo.getPositivePatterns=Vo.convertPatternsToTasks=Vo.generate=void 0;var Hu=xp();function tZe(t,e){let r=Yle(t,e),s=Yle(e.ignore,e),a=Vle(r),n=Jle(r,s),c=a.filter(E=>Hu.pattern.isStaticPattern(E,e)),f=a.filter(E=>Hu.pattern.isDynamicPattern(E,e)),p=l3(c,n,!1),h=l3(f,n,!0);return p.concat(h)}Vo.generate=tZe;function Yle(t,e){let r=t;return e.braceExpansion&&(r=Hu.pattern.expandPatternsWithBraceExpansion(r)),e.baseNameMatch&&(r=r.map(s=>s.includes(\"/\")?s:`**/${s}`)),r.map(s=>Hu.pattern.removeDuplicateSlashes(s))}function l3(t,e,r){let s=[],a=Hu.pattern.getPatternsOutsideCurrentDirectory(t),n=Hu.pattern.getPatternsInsideCurrentDirectory(t),c=c3(a),f=c3(n);return s.push(...u3(c,e,r)),\".\"in f?s.push(f3(\".\",n,e,r)):s.push(...u3(f,e,r)),s}Vo.convertPatternsToTasks=l3;function Vle(t){return Hu.pattern.getPositivePatterns(t)}Vo.getPositivePatterns=Vle;function Jle(t,e){return Hu.pattern.getNegativePatterns(t).concat(e).map(Hu.pattern.convertToPositivePattern)}Vo.getNegativePatternsAsPositive=Jle;function c3(t){let e={};return t.reduce((r,s)=>{let a=Hu.pattern.getBaseDirectory(s);return a in r?r[a].push(s):r[a]=[s],r},e)}Vo.groupPatternsByBaseDirectory=c3;function u3(t,e,r){return Object.keys(t).map(s=>f3(s,t[s],e,r))}Vo.convertPatternGroupsToTasks=u3;function f3(t,e,r,s){return{dynamic:s,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(Hu.pattern.convertToNegativePattern))}}Vo.convertPatternGroupToTask=f3});var Xle=_(sQ=>{\"use strict\";Object.defineProperty(sQ,\"__esModule\",{value:!0});sQ.read=void 0;function rZe(t,e,r){e.fs.lstat(t,(s,a)=>{if(s!==null){zle(r,s);return}if(!a.isSymbolicLink()||!e.followSymbolicLink){A3(r,a);return}e.fs.stat(t,(n,c)=>{if(n!==null){if(e.throwErrorOnBrokenSymbolicLink){zle(r,n);return}A3(r,a);return}e.markSymbolicLink&&(c.isSymbolicLink=()=>!0),A3(r,c)})})}sQ.read=rZe;function zle(t,e){t(e)}function A3(t,e){t(null,e)}});var Zle=_(oQ=>{\"use strict\";Object.defineProperty(oQ,\"__esModule\",{value:!0});oQ.read=void 0;function nZe(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let s=e.fs.statSync(t);return e.markSymbolicLink&&(s.isSymbolicLink=()=>!0),s}catch(s){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw s}}oQ.read=nZe});var $le=_(h0=>{\"use strict\";Object.defineProperty(h0,\"__esModule\",{value:!0});h0.createFileSystemAdapter=h0.FILE_SYSTEM_ADAPTER=void 0;var aQ=Ie(\"fs\");h0.FILE_SYSTEM_ADAPTER={lstat:aQ.lstat,stat:aQ.stat,lstatSync:aQ.lstatSync,statSync:aQ.statSync};function iZe(t){return t===void 0?h0.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},h0.FILE_SYSTEM_ADAPTER),t)}h0.createFileSystemAdapter=iZe});var ece=_(h3=>{\"use strict\";Object.defineProperty(h3,\"__esModule\",{value:!0});var sZe=$le(),p3=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=sZe.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e??r}};h3.default=p3});var Zd=_(g0=>{\"use strict\";Object.defineProperty(g0,\"__esModule\",{value:!0});g0.statSync=g0.stat=g0.Settings=void 0;var tce=Xle(),oZe=Zle(),g3=ece();g0.Settings=g3.default;function aZe(t,e,r){if(typeof e==\"function\"){tce.read(t,d3(),e);return}tce.read(t,d3(e),r)}g0.stat=aZe;function lZe(t,e){let r=d3(e);return oZe.read(t,r)}g0.statSync=lZe;function d3(t={}){return t instanceof g3.default?t:new g3.default(t)}});var ice=_((lLt,nce)=>{var rce;nce.exports=typeof queueMicrotask==\"function\"?queueMicrotask.bind(typeof window<\"u\"?window:global):t=>(rce||(rce=Promise.resolve())).then(t).catch(e=>setTimeout(()=>{throw e},0))});var oce=_((cLt,sce)=>{sce.exports=uZe;var cZe=ice();function uZe(t,e){let r,s,a,n=!0;Array.isArray(t)?(r=[],s=t.length):(a=Object.keys(t),r={},s=a.length);function c(p){function h(){e&&e(p,r),e=null}n?cZe(h):h()}function f(p,h,E){r[p]=E,(--s===0||h)&&c(h)}s?a?a.forEach(function(p){t[p](function(h,E){f(p,h,E)})}):t.forEach(function(p,h){p(function(E,C){f(h,E,C)})}):c(null),n=!1}});var m3=_(cQ=>{\"use strict\";Object.defineProperty(cQ,\"__esModule\",{value:!0});cQ.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var lQ=process.versions.node.split(\".\");if(lQ[0]===void 0||lQ[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var ace=Number.parseInt(lQ[0],10),fZe=Number.parseInt(lQ[1],10),lce=10,AZe=10,pZe=ace>lce,hZe=ace===lce&&fZe>=AZe;cQ.IS_SUPPORT_READDIR_WITH_FILE_TYPES=pZe||hZe});var cce=_(uQ=>{\"use strict\";Object.defineProperty(uQ,\"__esModule\",{value:!0});uQ.createDirentFromStats=void 0;var y3=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function gZe(t,e){return new y3(t,e)}uQ.createDirentFromStats=gZe});var E3=_(fQ=>{\"use strict\";Object.defineProperty(fQ,\"__esModule\",{value:!0});fQ.fs=void 0;var dZe=cce();fQ.fs=dZe});var I3=_(AQ=>{\"use strict\";Object.defineProperty(AQ,\"__esModule\",{value:!0});AQ.joinPathSegments=void 0;function mZe(t,e,r){return t.endsWith(r)?t+e:t+r+e}AQ.joinPathSegments=mZe});var gce=_(d0=>{\"use strict\";Object.defineProperty(d0,\"__esModule\",{value:!0});d0.readdir=d0.readdirWithFileTypes=d0.read=void 0;var yZe=Zd(),uce=oce(),EZe=m3(),fce=E3(),Ace=I3();function IZe(t,e,r){if(!e.stats&&EZe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){pce(t,e,r);return}hce(t,e,r)}d0.read=IZe;function pce(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(s,a)=>{if(s!==null){pQ(r,s);return}let n=a.map(f=>({dirent:f,name:f.name,path:Ace.joinPathSegments(t,f.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){C3(r,n);return}let c=n.map(f=>CZe(f,e));uce(c,(f,p)=>{if(f!==null){pQ(r,f);return}C3(r,p)})})}d0.readdirWithFileTypes=pce;function CZe(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(s,a)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){r(s);return}r(null,t);return}t.dirent=fce.fs.createDirentFromStats(t.name,a),r(null,t)})}}function hce(t,e,r){e.fs.readdir(t,(s,a)=>{if(s!==null){pQ(r,s);return}let n=a.map(c=>{let f=Ace.joinPathSegments(t,c,e.pathSegmentSeparator);return p=>{yZe.stat(f,e.fsStatSettings,(h,E)=>{if(h!==null){p(h);return}let C={name:c,path:f,dirent:fce.fs.createDirentFromStats(c,E)};e.stats&&(C.stats=E),p(null,C)})}});uce(n,(c,f)=>{if(c!==null){pQ(r,c);return}C3(r,f)})})}d0.readdir=hce;function pQ(t,e){t(e)}function C3(t,e){t(null,e)}});var Ice=_(m0=>{\"use strict\";Object.defineProperty(m0,\"__esModule\",{value:!0});m0.readdir=m0.readdirWithFileTypes=m0.read=void 0;var wZe=Zd(),BZe=m3(),dce=E3(),mce=I3();function vZe(t,e){return!e.stats&&BZe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?yce(t,e):Ece(t,e)}m0.read=vZe;function yce(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(s=>{let a={dirent:s,name:s.name,path:mce.joinPathSegments(t,s.name,e.pathSegmentSeparator)};if(a.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let n=e.fs.statSync(a.path);a.dirent=dce.fs.createDirentFromStats(a.name,n)}catch(n){if(e.throwErrorOnBrokenSymbolicLink)throw n}return a})}m0.readdirWithFileTypes=yce;function Ece(t,e){return e.fs.readdirSync(t).map(s=>{let a=mce.joinPathSegments(t,s,e.pathSegmentSeparator),n=wZe.statSync(a,e.fsStatSettings),c={name:s,path:a,dirent:dce.fs.createDirentFromStats(s,n)};return e.stats&&(c.stats=n),c})}m0.readdir=Ece});var Cce=_(y0=>{\"use strict\";Object.defineProperty(y0,\"__esModule\",{value:!0});y0.createFileSystemAdapter=y0.FILE_SYSTEM_ADAPTER=void 0;var ZE=Ie(\"fs\");y0.FILE_SYSTEM_ADAPTER={lstat:ZE.lstat,stat:ZE.stat,lstatSync:ZE.lstatSync,statSync:ZE.statSync,readdir:ZE.readdir,readdirSync:ZE.readdirSync};function SZe(t){return t===void 0?y0.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},y0.FILE_SYSTEM_ADAPTER),t)}y0.createFileSystemAdapter=SZe});var wce=_(B3=>{\"use strict\";Object.defineProperty(B3,\"__esModule\",{value:!0});var DZe=Ie(\"path\"),bZe=Zd(),PZe=Cce(),w3=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=PZe.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,DZe.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new bZe.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};B3.default=w3});var hQ=_(E0=>{\"use strict\";Object.defineProperty(E0,\"__esModule\",{value:!0});E0.Settings=E0.scandirSync=E0.scandir=void 0;var Bce=gce(),xZe=Ice(),v3=wce();E0.Settings=v3.default;function kZe(t,e,r){if(typeof e==\"function\"){Bce.read(t,S3(),e);return}Bce.read(t,S3(e),r)}E0.scandir=kZe;function QZe(t,e){let r=S3(e);return xZe.read(t,r)}E0.scandirSync=QZe;function S3(t={}){return t instanceof v3.default?t:new v3.default(t)}});var Sce=_((ELt,vce)=>{\"use strict\";function TZe(t){var e=new t,r=e;function s(){var n=e;return n.next?e=n.next:(e=new t,r=e),n.next=null,n}function a(n){r.next=n,r=n}return{get:s,release:a}}vce.exports=TZe});var bce=_((ILt,D3)=>{\"use strict\";var RZe=Sce();function Dce(t,e,r){if(typeof t==\"function\"&&(r=e,e=t,t=null),!(r>=1))throw new Error(\"fastqueue concurrency must be equal to or greater than 1\");var s=RZe(FZe),a=null,n=null,c=0,f=null,p={push:R,drain:kc,saturated:kc,pause:E,paused:!1,get concurrency(){return r},set concurrency(ue){if(!(ue>=1))throw new Error(\"fastqueue concurrency must be equal to or greater than 1\");if(r=ue,!p.paused)for(;a&&c<r;)c++,U()},running:h,resume:P,idle:I,length:C,getQueue:S,unshift:N,empty:kc,kill:W,killAndDrain:ee,error:ie};return p;function h(){return c}function E(){p.paused=!0}function C(){for(var ue=a,le=0;ue;)ue=ue.next,le++;return le}function S(){for(var ue=a,le=[];ue;)le.push(ue.value),ue=ue.next;return le}function P(){if(p.paused){if(p.paused=!1,a===null){c++,U();return}for(;a&&c<r;)c++,U()}}function I(){return c===0&&p.length()===0}function R(ue,le){var me=s.get();me.context=t,me.release=U,me.value=ue,me.callback=le||kc,me.errorHandler=f,c>=r||p.paused?n?(n.next=me,n=me):(a=me,n=me,p.saturated()):(c++,e.call(t,me.value,me.worked))}function N(ue,le){var me=s.get();me.context=t,me.release=U,me.value=ue,me.callback=le||kc,me.errorHandler=f,c>=r||p.paused?a?(me.next=a,a=me):(a=me,n=me,p.saturated()):(c++,e.call(t,me.value,me.worked))}function U(ue){ue&&s.release(ue);var le=a;le&&c<=r?p.paused?c--:(n===a&&(n=null),a=le.next,le.next=null,e.call(t,le.value,le.worked),n===null&&p.empty()):--c===0&&p.drain()}function W(){a=null,n=null,p.drain=kc}function ee(){a=null,n=null,p.drain(),p.drain=kc}function ie(ue){f=ue}}function kc(){}function FZe(){this.value=null,this.callback=kc,this.next=null,this.release=kc,this.context=null,this.errorHandler=null;var t=this;this.worked=function(r,s){var a=t.callback,n=t.errorHandler,c=t.value;t.value=null,t.callback=kc,t.errorHandler&&n(r,c),a.call(t.context,r,s),t.release(t)}}function NZe(t,e,r){typeof t==\"function\"&&(r=e,e=t,t=null);function s(E,C){e.call(this,E).then(function(S){C(null,S)},C)}var a=Dce(t,s,r),n=a.push,c=a.unshift;return a.push=f,a.unshift=p,a.drained=h,a;function f(E){var C=new Promise(function(S,P){n(E,function(I,R){if(I){P(I);return}S(R)})});return C.catch(kc),C}function p(E){var C=new Promise(function(S,P){c(E,function(I,R){if(I){P(I);return}S(R)})});return C.catch(kc),C}function h(){if(a.idle())return new Promise(function(S){S()});var E=a.drain,C=new Promise(function(S){a.drain=function(){E(),S()}});return C}}D3.exports=Dce;D3.exports.promise=NZe});var gQ=_(zf=>{\"use strict\";Object.defineProperty(zf,\"__esModule\",{value:!0});zf.joinPathSegments=zf.replacePathSegmentSeparator=zf.isAppliedFilter=zf.isFatalError=void 0;function OZe(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}zf.isFatalError=OZe;function LZe(t,e){return t===null||t(e)}zf.isAppliedFilter=LZe;function MZe(t,e){return t.split(/[/\\\\]/).join(e)}zf.replacePathSegmentSeparator=MZe;function UZe(t,e,r){return t===\"\"?e:t.endsWith(r)?t+e:t+r+e}zf.joinPathSegments=UZe});var x3=_(P3=>{\"use strict\";Object.defineProperty(P3,\"__esModule\",{value:!0});var _Ze=gQ(),b3=class{constructor(e,r){this._root=e,this._settings=r,this._root=_Ze.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};P3.default=b3});var T3=_(Q3=>{\"use strict\";Object.defineProperty(Q3,\"__esModule\",{value:!0});var HZe=Ie(\"events\"),jZe=hQ(),GZe=bce(),dQ=gQ(),qZe=x3(),k3=class extends qZe.default{constructor(e,r){super(e,r),this._settings=r,this._scandir=jZe.scandir,this._emitter=new HZe.EventEmitter,this._queue=GZe(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit(\"end\")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error(\"The reader is already destroyed\");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on(\"entry\",e)}onError(e){this._emitter.once(\"error\",e)}onEnd(e){this._emitter.once(\"end\",e)}_pushToQueue(e,r){let s={directory:e,base:r};this._queue.push(s,a=>{a!==null&&this._handleError(a)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(s,a)=>{if(s!==null){r(s,void 0);return}for(let n of a)this._handleEntry(n,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!dQ.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit(\"error\",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let s=e.path;r!==void 0&&(e.path=dQ.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),dQ.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&dQ.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(s,r===void 0?void 0:e.path)}_emitEntry(e){this._emitter.emit(\"entry\",e)}};Q3.default=k3});var Pce=_(F3=>{\"use strict\";Object.defineProperty(F3,\"__esModule\",{value:!0});var WZe=T3(),R3=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new WZe.default(this._root,this._settings),this._storage=[]}read(e){this._reader.onError(r=>{YZe(e,r)}),this._reader.onEntry(r=>{this._storage.push(r)}),this._reader.onEnd(()=>{VZe(e,this._storage)}),this._reader.read()}};F3.default=R3;function YZe(t,e){t(e)}function VZe(t,e){t(null,e)}});var xce=_(O3=>{\"use strict\";Object.defineProperty(O3,\"__esModule\",{value:!0});var JZe=Ie(\"stream\"),KZe=T3(),N3=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new KZe.default(this._root,this._settings),this._stream=new JZe.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit(\"error\",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};O3.default=N3});var kce=_(M3=>{\"use strict\";Object.defineProperty(M3,\"__esModule\",{value:!0});var zZe=hQ(),mQ=gQ(),XZe=x3(),L3=class extends XZe.default{constructor(){super(...arguments),this._scandir=zZe.scandirSync,this._storage=[],this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),this._storage}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let s=this._scandir(e,this._settings.fsScandirSettings);for(let a of s)this._handleEntry(a,r)}catch(s){this._handleError(s)}}_handleError(e){if(mQ.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let s=e.path;r!==void 0&&(e.path=mQ.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),mQ.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&mQ.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(s,r===void 0?void 0:e.path)}_pushToStorage(e){this._storage.push(e)}};M3.default=L3});var Qce=_(_3=>{\"use strict\";Object.defineProperty(_3,\"__esModule\",{value:!0});var ZZe=kce(),U3=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new ZZe.default(this._root,this._settings)}read(){return this._reader.read()}};_3.default=U3});var Tce=_(j3=>{\"use strict\";Object.defineProperty(j3,\"__esModule\",{value:!0});var $Ze=Ie(\"path\"),e$e=hQ(),H3=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,$Ze.sep),this.fsScandirSettings=new e$e.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};j3.default=H3});var EQ=_(Xf=>{\"use strict\";Object.defineProperty(Xf,\"__esModule\",{value:!0});Xf.Settings=Xf.walkStream=Xf.walkSync=Xf.walk=void 0;var Rce=Pce(),t$e=xce(),r$e=Qce(),G3=Tce();Xf.Settings=G3.default;function n$e(t,e,r){if(typeof e==\"function\"){new Rce.default(t,yQ()).read(e);return}new Rce.default(t,yQ(e)).read(r)}Xf.walk=n$e;function i$e(t,e){let r=yQ(e);return new r$e.default(t,r).read()}Xf.walkSync=i$e;function s$e(t,e){let r=yQ(e);return new t$e.default(t,r).read()}Xf.walkStream=s$e;function yQ(t={}){return t instanceof G3.default?t:new G3.default(t)}});var IQ=_(W3=>{\"use strict\";Object.defineProperty(W3,\"__esModule\",{value:!0});var o$e=Ie(\"path\"),a$e=Zd(),Fce=xp(),q3=class{constructor(e){this._settings=e,this._fsStatSettings=new a$e.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return o$e.resolve(this._settings.cwd,e)}_makeEntry(e,r){let s={name:r,path:r,dirent:Fce.fs.createDirentFromStats(r,e)};return this._settings.stats&&(s.stats=e),s}_isFatalError(e){return!Fce.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};W3.default=q3});var J3=_(V3=>{\"use strict\";Object.defineProperty(V3,\"__esModule\",{value:!0});var l$e=Ie(\"stream\"),c$e=Zd(),u$e=EQ(),f$e=IQ(),Y3=class extends f$e.default{constructor(){super(...arguments),this._walkStream=u$e.walkStream,this._stat=c$e.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let s=e.map(this._getFullEntryPath,this),a=new l$e.PassThrough({objectMode:!0});a._write=(n,c,f)=>this._getEntry(s[n],e[n],r).then(p=>{p!==null&&r.entryFilter(p)&&a.push(p),n===s.length-1&&a.end(),f()}).catch(f);for(let n=0;n<s.length;n++)a.write(n);return a}_getEntry(e,r,s){return this._getStat(e).then(a=>this._makeEntry(a,r)).catch(a=>{if(s.errorFilter(a))return null;throw a})}_getStat(e){return new Promise((r,s)=>{this._stat(e,this._fsStatSettings,(a,n)=>a===null?r(n):s(a))})}};V3.default=Y3});var Nce=_(z3=>{\"use strict\";Object.defineProperty(z3,\"__esModule\",{value:!0});var A$e=EQ(),p$e=IQ(),h$e=J3(),K3=class extends p$e.default{constructor(){super(...arguments),this._walkAsync=A$e.walk,this._readerStream=new h$e.default(this._settings)}dynamic(e,r){return new Promise((s,a)=>{this._walkAsync(e,r,(n,c)=>{n===null?s(c):a(n)})})}async static(e,r){let s=[],a=this._readerStream.static(e,r);return new Promise((n,c)=>{a.once(\"error\",c),a.on(\"data\",f=>s.push(f)),a.once(\"end\",()=>n(s))})}};z3.default=K3});var Oce=_(Z3=>{\"use strict\";Object.defineProperty(Z3,\"__esModule\",{value:!0});var NB=xp(),X3=class{constructor(e,r,s){this._patterns=e,this._settings=r,this._micromatchOptions=s,this._storage=[],this._fillStorage()}_fillStorage(){for(let e of this._patterns){let r=this._getPatternSegments(e),s=this._splitSegmentsIntoSections(r);this._storage.push({complete:s.length<=1,pattern:e,segments:r,sections:s})}}_getPatternSegments(e){return NB.pattern.getPatternParts(e,this._micromatchOptions).map(s=>NB.pattern.isDynamicPattern(s,this._settings)?{dynamic:!0,pattern:s,patternRe:NB.pattern.makeRe(s,this._micromatchOptions)}:{dynamic:!1,pattern:s})}_splitSegmentsIntoSections(e){return NB.array.splitWhen(e,r=>r.dynamic&&NB.pattern.hasGlobStar(r.pattern))}};Z3.default=X3});var Lce=_(e8=>{\"use strict\";Object.defineProperty(e8,\"__esModule\",{value:!0});var g$e=Oce(),$3=class extends g$e.default{match(e){let r=e.split(\"/\"),s=r.length,a=this._storage.filter(n=>!n.complete||n.segments.length>s);for(let n of a){let c=n.sections[0];if(!n.complete&&s>c.length||r.every((p,h)=>{let E=n.segments[h];return!!(E.dynamic&&E.patternRe.test(p)||!E.dynamic&&E.pattern===p)}))return!0}return!1}};e8.default=$3});var Mce=_(r8=>{\"use strict\";Object.defineProperty(r8,\"__esModule\",{value:!0});var CQ=xp(),d$e=Lce(),t8=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,s){let a=this._getMatcher(r),n=this._getNegativePatternsRe(s);return c=>this._filter(e,c,a,n)}_getMatcher(e){return new d$e.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(CQ.pattern.isAffectDepthOfReadingPattern);return CQ.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,s,a){if(this._isSkippedByDeep(e,r.path)||this._isSkippedSymbolicLink(r))return!1;let n=CQ.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(n,s)?!1:this._isSkippedByNegativePatterns(n,a)}_isSkippedByDeep(e,r){return this._settings.deep===1/0?!1:this._getEntryLevel(e,r)>=this._settings.deep}_getEntryLevel(e,r){let s=r.split(\"/\").length;if(e===\"\")return s;let a=e.split(\"/\").length;return s-a}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!CQ.pattern.matchAny(e,r)}};r8.default=t8});var Uce=_(i8=>{\"use strict\";Object.defineProperty(i8,\"__esModule\",{value:!0});var $d=xp(),n8=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let s=$d.pattern.convertPatternsToRe(e,this._micromatchOptions),a=$d.pattern.convertPatternsToRe(r,Object.assign(Object.assign({},this._micromatchOptions),{dot:!0}));return n=>this._filter(n,s,a)}_filter(e,r,s){let a=$d.path.removeLeadingDotSegment(e.path);if(this._settings.unique&&this._isDuplicateEntry(a)||this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(a,s))return!1;let n=e.dirent.isDirectory(),c=this._isMatchToPatterns(a,r,n)&&!this._isMatchToPatterns(a,s,n);return this._settings.unique&&c&&this._createIndexRecord(a),c}_isDuplicateEntry(e){return this.index.has(e)}_createIndexRecord(e){this.index.set(e,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)return!1;let s=$d.path.makeAbsolute(this._settings.cwd,e);return $d.pattern.matchAny(s,r)}_isMatchToPatterns(e,r,s){let a=$d.pattern.matchAny(e,r);return!a&&s?$d.pattern.matchAny(e+\"/\",r):a}};i8.default=n8});var _ce=_(o8=>{\"use strict\";Object.defineProperty(o8,\"__esModule\",{value:!0});var m$e=xp(),s8=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return m$e.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};o8.default=s8});var jce=_(l8=>{\"use strict\";Object.defineProperty(l8,\"__esModule\",{value:!0});var Hce=xp(),a8=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=Hce.path.makeAbsolute(this._settings.cwd,r),r=Hce.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+=\"/\"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};l8.default=a8});var wQ=_(u8=>{\"use strict\";Object.defineProperty(u8,\"__esModule\",{value:!0});var y$e=Ie(\"path\"),E$e=Mce(),I$e=Uce(),C$e=_ce(),w$e=jce(),c8=class{constructor(e){this._settings=e,this.errorFilter=new C$e.default(this._settings),this.entryFilter=new I$e.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new E$e.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new w$e.default(this._settings)}_getRootDirectory(e){return y$e.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base===\".\"?\"\":e.base;return{basePath:r,pathSegmentSeparator:\"/\",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};u8.default=c8});var Gce=_(A8=>{\"use strict\";Object.defineProperty(A8,\"__esModule\",{value:!0});var B$e=Nce(),v$e=wQ(),f8=class extends v$e.default{constructor(){super(...arguments),this._reader=new B$e.default(this._settings)}async read(e){let r=this._getRootDirectory(e),s=this._getReaderOptions(e);return(await this.api(r,e,s)).map(n=>s.transform(n))}api(e,r,s){return r.dynamic?this._reader.dynamic(e,s):this._reader.static(r.patterns,s)}};A8.default=f8});var qce=_(h8=>{\"use strict\";Object.defineProperty(h8,\"__esModule\",{value:!0});var S$e=Ie(\"stream\"),D$e=J3(),b$e=wQ(),p8=class extends b$e.default{constructor(){super(...arguments),this._reader=new D$e.default(this._settings)}read(e){let r=this._getRootDirectory(e),s=this._getReaderOptions(e),a=this.api(r,e,s),n=new S$e.Readable({objectMode:!0,read:()=>{}});return a.once(\"error\",c=>n.emit(\"error\",c)).on(\"data\",c=>n.emit(\"data\",s.transform(c))).once(\"end\",()=>n.emit(\"end\")),n.once(\"close\",()=>a.destroy()),n}api(e,r,s){return r.dynamic?this._reader.dynamic(e,s):this._reader.static(r.patterns,s)}};h8.default=p8});var Wce=_(d8=>{\"use strict\";Object.defineProperty(d8,\"__esModule\",{value:!0});var P$e=Zd(),x$e=EQ(),k$e=IQ(),g8=class extends k$e.default{constructor(){super(...arguments),this._walkSync=x$e.walkSync,this._statSync=P$e.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let s=[];for(let a of e){let n=this._getFullEntryPath(a),c=this._getEntry(n,a,r);c===null||!r.entryFilter(c)||s.push(c)}return s}_getEntry(e,r,s){try{let a=this._getStat(e);return this._makeEntry(a,r)}catch(a){if(s.errorFilter(a))return null;throw a}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};d8.default=g8});var Yce=_(y8=>{\"use strict\";Object.defineProperty(y8,\"__esModule\",{value:!0});var Q$e=Wce(),T$e=wQ(),m8=class extends T$e.default{constructor(){super(...arguments),this._reader=new Q$e.default(this._settings)}read(e){let r=this._getRootDirectory(e),s=this._getReaderOptions(e);return this.api(r,e,s).map(s.transform)}api(e,r,s){return r.dynamic?this._reader.dynamic(e,s):this._reader.static(r.patterns,s)}};y8.default=m8});var Vce=_(eI=>{\"use strict\";Object.defineProperty(eI,\"__esModule\",{value:!0});eI.DEFAULT_FILE_SYSTEM_ADAPTER=void 0;var $E=Ie(\"fs\"),R$e=Ie(\"os\"),F$e=Math.max(R$e.cpus().length,1);eI.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:$E.lstat,lstatSync:$E.lstatSync,stat:$E.stat,statSync:$E.statSync,readdir:$E.readdir,readdirSync:$E.readdirSync};var E8=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,F$e),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,1/0),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0),this.ignore=[].concat(this.ignore)}_getValue(e,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},eI.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};eI.default=E8});var BQ=_((WLt,Kce)=>{\"use strict\";var Jce=Kle(),N$e=Gce(),O$e=qce(),L$e=Yce(),I8=Vce(),Qc=xp();async function C8(t,e){ju(t);let r=w8(t,N$e.default,e),s=await Promise.all(r);return Qc.array.flatten(s)}(function(t){t.glob=t,t.globSync=e,t.globStream=r,t.async=t;function e(h,E){ju(h);let C=w8(h,L$e.default,E);return Qc.array.flatten(C)}t.sync=e;function r(h,E){ju(h);let C=w8(h,O$e.default,E);return Qc.stream.merge(C)}t.stream=r;function s(h,E){ju(h);let C=[].concat(h),S=new I8.default(E);return Jce.generate(C,S)}t.generateTasks=s;function a(h,E){ju(h);let C=new I8.default(E);return Qc.pattern.isDynamicPattern(h,C)}t.isDynamicPattern=a;function n(h){return ju(h),Qc.path.escape(h)}t.escapePath=n;function c(h){return ju(h),Qc.path.convertPathToPattern(h)}t.convertPathToPattern=c;let f;(function(h){function E(S){return ju(S),Qc.path.escapePosixPath(S)}h.escapePath=E;function C(S){return ju(S),Qc.path.convertPosixPathToPattern(S)}h.convertPathToPattern=C})(f=t.posix||(t.posix={}));let p;(function(h){function E(S){return ju(S),Qc.path.escapeWindowsPath(S)}h.escapePath=E;function C(S){return ju(S),Qc.path.convertWindowsPathToPattern(S)}h.convertPathToPattern=C})(p=t.win32||(t.win32={}))})(C8||(C8={}));function w8(t,e,r){let s=[].concat(t),a=new I8.default(r),n=Jce.generate(s,a),c=new e(a);return n.map(c.read,c)}function ju(t){if(![].concat(t).every(s=>Qc.string.isString(s)&&!Qc.string.isEmpty(s)))throw new TypeError(\"Patterns must be a string (non empty) or an array of strings\")}Kce.exports=C8});var Nn={};Vt(Nn,{checksumFile:()=>SQ,checksumPattern:()=>DQ,makeHash:()=>us});function us(...t){let e=(0,vQ.createHash)(\"sha512\"),r=\"\";for(let s of t)typeof s==\"string\"?r+=s:s&&(r&&(e.update(r),r=\"\"),e.update(s));return r&&e.update(r),e.digest(\"hex\")}async function SQ(t,{baseFs:e,algorithm:r}={baseFs:ce,algorithm:\"sha512\"}){let s=await e.openPromise(t,\"r\");try{let n=Buffer.allocUnsafeSlow(65536),c=(0,vQ.createHash)(r),f=0;for(;(f=await e.readPromise(s,n,0,65536))!==0;)c.update(f===65536?n:n.slice(0,f));return c.digest(\"hex\")}finally{await e.closePromise(s)}}async function DQ(t,{cwd:e}){let s=(await(0,B8.default)(t,{cwd:fe.fromPortablePath(e),onlyDirectories:!0})).map(f=>`${f}/**/*`),a=await(0,B8.default)([t,...s],{cwd:fe.fromPortablePath(e),onlyFiles:!1});a.sort();let n=await Promise.all(a.map(async f=>{let p=[Buffer.from(f)],h=J.join(e,fe.toPortablePath(f)),E=await ce.lstatPromise(h);return E.isSymbolicLink()?p.push(Buffer.from(await ce.readlinkPromise(h))):E.isFile()&&p.push(await ce.readFilePromise(h)),p.join(\"\\0\")})),c=(0,vQ.createHash)(\"sha512\");for(let f of n)c.update(f);return c.digest(\"hex\")}var vQ,B8,I0=Xe(()=>{Dt();vQ=Ie(\"crypto\"),B8=ut(BQ())});var G={};Vt(G,{allPeerRequests:()=>qB,areDescriptorsEqual:()=>eue,areIdentsEqual:()=>UB,areLocatorsEqual:()=>_B,areVirtualPackagesEquivalent:()=>Y$e,bindDescriptor:()=>q$e,bindLocator:()=>W$e,convertDescriptorToLocator:()=>bQ,convertLocatorToDescriptor:()=>S8,convertPackageToLocator:()=>H$e,convertToIdent:()=>_$e,convertToManifestRange:()=>ret,copyPackage:()=>LB,devirtualizeDescriptor:()=>MB,devirtualizeLocator:()=>rI,ensureDevirtualizedDescriptor:()=>j$e,ensureDevirtualizedLocator:()=>G$e,getIdentVendorPath:()=>x8,isPackageCompatible:()=>TQ,isVirtualDescriptor:()=>kp,isVirtualLocator:()=>Gu,makeDescriptor:()=>On,makeIdent:()=>Da,makeLocator:()=>Ws,makeRange:()=>kQ,parseDescriptor:()=>C0,parseFileStyleRange:()=>eet,parseIdent:()=>Sa,parseLocator:()=>Qp,parseRange:()=>em,prettyDependent:()=>t3,prettyDescriptor:()=>ni,prettyIdent:()=>$i,prettyLocator:()=>Yr,prettyLocatorNoColors:()=>e3,prettyRange:()=>iI,prettyReference:()=>jB,prettyResolution:()=>FB,prettyWorkspace:()=>GB,renamePackage:()=>D8,slugifyIdent:()=>v8,slugifyLocator:()=>nI,sortDescriptors:()=>sI,stringifyDescriptor:()=>al,stringifyIdent:()=>un,stringifyLocator:()=>ll,tryParseDescriptor:()=>HB,tryParseIdent:()=>tue,tryParseLocator:()=>xQ,tryParseRange:()=>$$e,unwrapIdentFromScope:()=>iet,virtualizeDescriptor:()=>b8,virtualizePackage:()=>P8,wrapIdentIntoScope:()=>net});function Da(t,e){if(t?.startsWith(\"@\"))throw new Error(\"Invalid scope: don't prefix it with '@'\");return{identHash:us(t,e),scope:t,name:e}}function On(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:us(t.identHash,e),range:e}}function Ws(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:us(t.identHash,e),reference:e}}function _$e(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function bQ(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function S8(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function H$e(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function D8(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,conditions:t.conditions,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function LB(t){return D8(t,t)}function b8(t,e){if(e.includes(\"#\"))throw new Error(\"Invalid entropy\");return On(t,`virtual:${e}#${t.range}`)}function P8(t,e){if(e.includes(\"#\"))throw new Error(\"Invalid entropy\");return D8(t,Ws(t,`virtual:${e}#${t.reference}`))}function kp(t){return t.range.startsWith(OB)}function Gu(t){return t.reference.startsWith(OB)}function MB(t){if(!kp(t))throw new Error(\"Not a virtual descriptor\");return On(t,t.range.replace(PQ,\"\"))}function rI(t){if(!Gu(t))throw new Error(\"Not a virtual descriptor\");return Ws(t,t.reference.replace(PQ,\"\"))}function j$e(t){return kp(t)?On(t,t.range.replace(PQ,\"\")):t}function G$e(t){return Gu(t)?Ws(t,t.reference.replace(PQ,\"\")):t}function q$e(t,e){return t.range.includes(\"::\")?t:On(t,`${t.range}::${tI.default.stringify(e)}`)}function W$e(t,e){return t.reference.includes(\"::\")?t:Ws(t,`${t.reference}::${tI.default.stringify(e)}`)}function UB(t,e){return t.identHash===e.identHash}function eue(t,e){return t.descriptorHash===e.descriptorHash}function _B(t,e){return t.locatorHash===e.locatorHash}function Y$e(t,e){if(!Gu(t))throw new Error(\"Invalid package type\");if(!Gu(e))throw new Error(\"Invalid package type\");if(!UB(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let s=e.dependencies.get(r.identHash);if(!s||!eue(r,s))return!1}return!0}function Sa(t){let e=tue(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function tue(t){let e=t.match(V$e);if(!e)return null;let[,r,s]=e;return Da(typeof r<\"u\"?r:null,s)}function C0(t,e=!1){let r=HB(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function HB(t,e=!1){let r=e?t.match(J$e):t.match(K$e);if(!r)return null;let[,s,a,n]=r;if(n===\"unknown\")throw new Error(`Invalid range (${t})`);let c=typeof s<\"u\"?s:null,f=typeof n<\"u\"?n:\"unknown\";return On(Da(c,a),f)}function Qp(t,e=!1){let r=xQ(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function xQ(t,e=!1){let r=e?t.match(z$e):t.match(X$e);if(!r)return null;let[,s,a,n]=r;if(n===\"unknown\")throw new Error(`Invalid reference (${t})`);let c=typeof s<\"u\"?s:null,f=typeof n<\"u\"?n:\"unknown\";return Ws(Da(c,a),f)}function em(t,e){let r=t.match(Z$e);if(r===null)throw new Error(`Invalid range (${t})`);let s=typeof r[1]<\"u\"?r[1]:null;if(typeof e?.requireProtocol==\"string\"&&s!==e.requireProtocol)throw new Error(`Invalid protocol (${s})`);if(e?.requireProtocol&&s===null)throw new Error(`Missing protocol (${s})`);let a=typeof r[3]<\"u\"?decodeURIComponent(r[2]):null;if(e?.requireSource&&a===null)throw new Error(`Missing source (${t})`);let n=typeof r[3]<\"u\"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),c=e?.parseSelector?tI.default.parse(n):n,f=typeof r[4]<\"u\"?tI.default.parse(r[4]):null;return{protocol:s,source:a,selector:c,params:f}}function $$e(t,e){try{return em(t,e)}catch{return null}}function eet(t,{protocol:e}){let{selector:r,params:s}=em(t,{requireProtocol:e,requireBindings:!0});if(typeof s.locator!=\"string\")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:Qp(s.locator,!0),path:r}}function zce(t){return t=t.replaceAll(\"%\",\"%25\"),t=t.replaceAll(\":\",\"%3A\"),t=t.replaceAll(\"#\",\"%23\"),t}function tet(t){return t===null?!1:Object.entries(t).length>0}function kQ({protocol:t,source:e,selector:r,params:s}){let a=\"\";return t!==null&&(a+=`${t}`),e!==null&&(a+=`${zce(e)}#`),a+=zce(r),tet(s)&&(a+=`::${tI.default.stringify(s)}`),a}function ret(t){let{params:e,protocol:r,source:s,selector:a}=em(t);for(let n in e)n.startsWith(\"__\")&&delete e[n];return kQ({protocol:r,source:s,params:e,selector:a})}function un(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function net(t,e){return t.scope?Da(e,`${t.scope}__${t.name}`):Da(e,t.name)}function iet(t,e){if(t.scope!==e)return t;let r=t.name.indexOf(\"__\");if(r===-1)return Da(null,t.name);let s=t.name.slice(0,r),a=t.name.slice(r+2);return Da(s,a)}function al(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function ll(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function v8(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function nI(t){let{protocol:e,selector:r}=em(t.reference),s=e!==null?e.replace(set,\"\"):\"exotic\",a=Xce.default.valid(r),n=a!==null?`${s}-${a}`:`${s}`,c=10;return t.scope?`${v8(t)}-${n}-${t.locatorHash.slice(0,c)}`:`${v8(t)}-${n}-${t.locatorHash.slice(0,c)}`}function $i(t,e){return e.scope?`${Ht(t,`@${e.scope}/`,ht.SCOPE)}${Ht(t,e.name,ht.NAME)}`:`${Ht(t,e.name,ht.NAME)}`}function QQ(t){if(t.startsWith(OB)){let e=QQ(t.substring(t.indexOf(\"#\")+1)),r=t.substring(OB.length,OB.length+M$e);return`${e} [${r}]`}else return t.replace(oet,\"?[...]\")}function iI(t,e){return`${Ht(t,QQ(e),ht.RANGE)}`}function ni(t,e){return`${$i(t,e)}${Ht(t,\"@\",ht.RANGE)}${iI(t,e.range)}`}function jB(t,e){return`${Ht(t,QQ(e),ht.REFERENCE)}`}function Yr(t,e){return`${$i(t,e)}${Ht(t,\"@\",ht.REFERENCE)}${jB(t,e.reference)}`}function e3(t){return`${un(t)}@${QQ(t.reference)}`}function sI(t){return qs(t,[e=>un(e),e=>e.range])}function GB(t,e){return $i(t,e.anchoredLocator)}function FB(t,e,r){let s=kp(e)?MB(e):e;return r===null?`${ni(t,s)} \\u2192 ${$4(t).Cross}`:s.identHash===r.identHash?`${ni(t,s)} \\u2192 ${jB(t,r.reference)}`:`${ni(t,s)} \\u2192 ${Yr(t,r)}`}function t3(t,e,r){return r===null?`${Yr(t,e)}`:`${Yr(t,e)} (via ${iI(t,r.range)})`}function x8(t){return`node_modules/${un(t)}`}function TQ(t,e){return t.conditions?U$e(t.conditions,r=>{let[,s,a]=r.match($ce),n=e[s];return n?n.includes(a):!0}):!0}function qB(t){let e=new Set;if(\"children\"in t)e.add(t);else for(let r of t.requests.values())e.add(r);for(let r of e)for(let s of r.children.values())e.add(s);return e}var tI,Xce,Zce,OB,M$e,$ce,U$e,PQ,V$e,J$e,K$e,z$e,X$e,Z$e,set,oet,Wo=Xe(()=>{tI=ut(Ie(\"querystring\")),Xce=ut(Ai()),Zce=ut(Ise());xc();I0();Pc();Wo();OB=\"virtual:\",M$e=5,$ce=/(os|cpu|libc)=([a-z0-9_-]+)/,U$e=(0,Zce.makeParser)($ce);PQ=/^[^#]*#/;V$e=/^(?:@([^/]+?)\\/)?([^@/]+)$/;J$e=/^(?:@([^/]+?)\\/)?([^@/]+?)(?:@(.+))$/,K$e=/^(?:@([^/]+?)\\/)?([^@/]+?)(?:@(.+))?$/;z$e=/^(?:@([^/]+?)\\/)?([^@/]+?)(?:@(.+))$/,X$e=/^(?:@([^/]+?)\\/)?([^@/]+?)(?:@(.+))?$/;Z$e=/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/;set=/:$/;oet=/\\?.*/});var rue,nue=Xe(()=>{Wo();rue={hooks:{reduceDependency:(t,e,r,s,{resolver:a,resolveOptions:n})=>{for(let{pattern:c,reference:f}of e.topLevelWorkspace.manifest.resolutions){if(c.from&&(c.from.fullName!==un(r)||e.configuration.normalizeLocator(Ws(Sa(c.from.fullName),c.from.description??r.reference)).locatorHash!==r.locatorHash)||c.descriptor.fullName!==un(t)||e.configuration.normalizeDependency(On(Qp(c.descriptor.fullName),c.descriptor.description??t.range)).descriptorHash!==t.descriptorHash)continue;return a.bindDescriptor(e.configuration.normalizeDependency(On(t,f)),e.topLevelWorkspace.anchoredLocator,n)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let s=GB(t.configuration,r);await t.configuration.triggerHook(a=>a.validateWorkspace,r,{reportWarning:(a,n)=>e.reportWarning(a,`${s}: ${n}`),reportError:(a,n)=>e.reportError(a,`${s}: ${n}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error(\"Resolutions field will be ignored\"));for(let s of r.errors)e.reportWarning(57,s.message)}}}});var Ei,tm=Xe(()=>{Ei=class t{static{this.protocol=\"workspace:\"}supportsDescriptor(e,r){return!!(e.range.startsWith(t.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith(t.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){return[s.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let s=r.project.getWorkspaceByCwd(e.reference.slice(t.protocol.length));return{...e,version:s.manifest.version||\"0.0.0\",languageName:\"unknown\",linkType:\"SOFT\",conditions:null,dependencies:r.project.configuration.normalizeDependencyMap(new Map([...s.manifest.dependencies,...s.manifest.devDependencies])),peerDependencies:new Map([...s.manifest.peerDependencies]),dependenciesMeta:s.manifest.dependenciesMeta,peerDependenciesMeta:s.manifest.peerDependenciesMeta,bin:s.manifest.bin}}}});var Fr={};Vt(Fr,{SemVer:()=>lue.SemVer,clean:()=>cet,getComparator:()=>oue,mergeComparators:()=>k8,satisfiesWithPrereleases:()=>Zf,simplifyRanges:()=>Q8,stringifyComparator:()=>aue,validRange:()=>cl});function Zf(t,e,r=!1){if(!t)return!1;let s=`${e}${r}`,a=iue.get(s);if(typeof a>\"u\")try{a=new Tp.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{iue.set(s,a||null)}else if(a===null)return!1;let n;try{n=new Tp.default.SemVer(t,a)}catch{return!1}return a.test(n)?!0:(n.prerelease&&(n.prerelease=[]),a.set.some(c=>{for(let f of c)f.semver.prerelease&&(f.semver.prerelease=[]);return c.every(f=>f.test(n))}))}function cl(t){if(t.indexOf(\":\")!==-1)return null;let e=sue.get(t);if(typeof e<\"u\")return e;try{e=new Tp.default.Range(t)}catch{e=null}return sue.set(t,e),e}function cet(t){let e=aet.exec(t);return e?e[1]:null}function oue(t){if(t.semver===Tp.default.Comparator.ANY)return{gt:null,lt:null};switch(t.operator){case\"\":return{gt:[\">=\",t.semver],lt:[\"<=\",t.semver]};case\">\":case\">=\":return{gt:[t.operator,t.semver],lt:null};case\"<\":case\"<=\":return{gt:null,lt:[t.operator,t.semver]};default:throw new Error(`Assertion failed: Unexpected comparator operator (${t.operator})`)}}function k8(t){if(t.length===0)return null;let e=null,r=null;for(let s of t){if(s.gt){let a=e!==null?Tp.default.compare(s.gt[1],e[1]):null;(a===null||a>0||a===0&&s.gt[0]===\">\")&&(e=s.gt)}if(s.lt){let a=r!==null?Tp.default.compare(s.lt[1],r[1]):null;(a===null||a<0||a===0&&s.lt[0]===\"<\")&&(r=s.lt)}}if(e&&r){let s=Tp.default.compare(e[1],r[1]);if(s===0&&(e[0]===\">\"||r[0]===\"<\")||s>0)return null}return{gt:e,lt:r}}function aue(t){if(t.gt&&t.lt){if(t.gt[0]===\">=\"&&t.lt[0]===\"<=\"&&t.gt[1].version===t.lt[1].version)return t.gt[1].version;if(t.gt[0]===\">=\"&&t.lt[0]===\"<\"){if(t.lt[1].version===`${t.gt[1].major+1}.0.0-0`)return`^${t.gt[1].version}`;if(t.lt[1].version===`${t.gt[1].major}.${t.gt[1].minor+1}.0-0`)return`~${t.gt[1].version}`}}let e=[];return t.gt&&e.push(t.gt[0]+t.gt[1].version),t.lt&&e.push(t.lt[0]+t.lt[1].version),e.length?e.join(\" \"):\"*\"}function Q8(t){let e=t.map(uet).map(s=>cl(s).set.map(a=>a.map(n=>oue(n)))),r=e.shift().map(s=>k8(s)).filter(s=>s!==null);for(let s of e){let a=[];for(let n of r)for(let c of s){let f=k8([n,...c]);f!==null&&a.push(f)}r=a}return r.length===0?null:r.map(s=>aue(s)).join(\" || \")}function uet(t){let e=t.split(\"||\");if(e.length>1){let r=new Set;for(let s of e)e.some(a=>a!==s&&Tp.default.subset(s,a))||r.add(s);if(r.size<e.length)return[...r].join(\" || \")}return t}var Tp,lue,iue,sue,aet,Rp=Xe(()=>{Tp=ut(Ai()),lue=ut(Ai()),iue=new Map;sue=new Map;aet=/^(?:[\\sv=]*?)((0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)(?:\\s*)$/});function cue(t){let e=t.match(/^[ \\t]+/m);return e?e[0]:\"  \"}function uue(t){return t.charCodeAt(0)===65279?t.slice(1):t}function ba(t){return t.replace(/\\\\/g,\"/\")}function RQ(t,{yamlCompatibilityMode:e}){return e?Y4(t):typeof t>\"u\"||typeof t==\"boolean\"?t:null}function fue(t,e){let r=e.search(/[^!]/);if(r===-1)return\"invalid\";let s=r%2===0?\"\":\"!\",a=e.slice(r);return`${s}${t}=${a}`}function T8(t,e){return e.length===1?fue(t,e[0]):`(${e.map(r=>fue(t,r)).join(\" | \")})`}var Aue,Ut,oI=Xe(()=>{Dt();wc();Aue=ut(Ai());tm();Pc();Rp();Wo();Ut=class t{constructor(){this.indent=\"  \";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static{this.fileName=\"package.json\"}static{this.allDependencies=[\"dependencies\",\"devDependencies\",\"peerDependencies\"]}static{this.hardDependencies=[\"dependencies\",\"devDependencies\"]}static async tryFind(e,{baseFs:r=new Yn}={}){let s=J.join(e,\"package.json\");try{return await t.fromFile(s,{baseFs:r})}catch(a){if(a.code===\"ENOENT\")return null;throw a}}static async find(e,{baseFs:r}={}){let s=await t.tryFind(e,{baseFs:r});if(s===null)throw new Error(\"Manifest not found\");return s}static async fromFile(e,{baseFs:r=new Yn}={}){let s=new t;return await s.loadFile(e,{baseFs:r}),s}static fromText(e){let r=new t;return r.loadFromText(e),r}loadFromText(e){let r;try{r=JSON.parse(uue(e)||\"{}\")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(r),this.indent=cue(e)}async loadFile(e,{baseFs:r=new Yn}){let s=await r.readFilePromise(e,\"utf8\"),a;try{a=JSON.parse(uue(s)||\"{}\")}catch(n){throw n.message+=` (when parsing ${e})`,n}this.load(a),this.indent=cue(s)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!=\"object\"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let s=[];if(this.name=null,typeof e.name==\"string\")try{this.name=Sa(e.name)}catch{s.push(new Error(\"Parsing failed for the 'name' field\"))}if(typeof e.version==\"string\"?this.version=e.version:this.version=null,Array.isArray(e.os)){let n=[];this.os=n;for(let c of e.os)typeof c!=\"string\"?s.push(new Error(\"Parsing failed for the 'os' field\")):n.push(c)}else this.os=null;if(Array.isArray(e.cpu)){let n=[];this.cpu=n;for(let c of e.cpu)typeof c!=\"string\"?s.push(new Error(\"Parsing failed for the 'cpu' field\")):n.push(c)}else this.cpu=null;if(Array.isArray(e.libc)){let n=[];this.libc=n;for(let c of e.libc)typeof c!=\"string\"?s.push(new Error(\"Parsing failed for the 'libc' field\")):n.push(c)}else this.libc=null;if(typeof e.type==\"string\"?this.type=e.type:this.type=null,typeof e.packageManager==\"string\"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private==\"boolean\"?this.private=e.private:this.private=!1,typeof e.license==\"string\"?this.license=e.license:this.license=null,typeof e.languageName==\"string\"?this.languageName=e.languageName:this.languageName=null,typeof e.main==\"string\"?this.main=ba(e.main):this.main=null,typeof e.module==\"string\"?this.module=ba(e.module):this.module=null,e.browser!=null)if(typeof e.browser==\"string\")this.browser=ba(e.browser);else{this.browser=new Map;for(let[n,c]of Object.entries(e.browser))this.browser.set(ba(n),typeof c==\"string\"?ba(c):c)}else this.browser=null;if(this.bin=new Map,typeof e.bin==\"string\")e.bin.trim()===\"\"?s.push(new Error(\"Invalid bin field\")):this.name!==null?this.bin.set(this.name.name,ba(e.bin)):s.push(new Error(\"String bin field, but no attached package name\"));else if(typeof e.bin==\"object\"&&e.bin!==null)for(let[n,c]of Object.entries(e.bin)){if(typeof c!=\"string\"||c.trim()===\"\"){s.push(new Error(`Invalid bin definition for '${n}'`));continue}let f=Sa(n);this.bin.set(f.name,ba(c))}if(this.scripts=new Map,typeof e.scripts==\"object\"&&e.scripts!==null)for(let[n,c]of Object.entries(e.scripts)){if(typeof c!=\"string\"){s.push(new Error(`Invalid script definition for '${n}'`));continue}this.scripts.set(n,c)}if(this.dependencies=new Map,typeof e.dependencies==\"object\"&&e.dependencies!==null)for(let[n,c]of Object.entries(e.dependencies)){if(typeof c!=\"string\"){s.push(new Error(`Invalid dependency range for '${n}'`));continue}let f;try{f=Sa(n)}catch{s.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=On(f,c);this.dependencies.set(p.identHash,p)}if(this.devDependencies=new Map,typeof e.devDependencies==\"object\"&&e.devDependencies!==null)for(let[n,c]of Object.entries(e.devDependencies)){if(typeof c!=\"string\"){s.push(new Error(`Invalid dependency range for '${n}'`));continue}let f;try{f=Sa(n)}catch{s.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=On(f,c);this.devDependencies.set(p.identHash,p)}if(this.peerDependencies=new Map,typeof e.peerDependencies==\"object\"&&e.peerDependencies!==null)for(let[n,c]of Object.entries(e.peerDependencies)){let f;try{f=Sa(n)}catch{s.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}(typeof c!=\"string\"||!c.startsWith(Ei.protocol)&&!cl(c))&&(s.push(new Error(`Invalid dependency range for '${n}'`)),c=\"*\");let p=On(f,c);this.peerDependencies.set(p.identHash,p)}typeof e.workspaces==\"object\"&&e.workspaces!==null&&e.workspaces.nohoist&&s.push(new Error(\"'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead\"));let a=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces==\"object\"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let n of a){if(typeof n!=\"string\"){s.push(new Error(`Invalid workspace definition for '${n}'`));continue}this.workspaceDefinitions.push({pattern:n})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta==\"object\"&&e.dependenciesMeta!==null)for(let[n,c]of Object.entries(e.dependenciesMeta)){if(typeof c!=\"object\"||c===null){s.push(new Error(`Invalid meta field for '${n}`));continue}let f=C0(n),p=this.ensureDependencyMeta(f),h=RQ(c.built,{yamlCompatibilityMode:r});if(h===null){s.push(new Error(`Invalid built meta field for '${n}'`));continue}let E=RQ(c.optional,{yamlCompatibilityMode:r});if(E===null){s.push(new Error(`Invalid optional meta field for '${n}'`));continue}let C=RQ(c.unplugged,{yamlCompatibilityMode:r});if(C===null){s.push(new Error(`Invalid unplugged meta field for '${n}'`));continue}Object.assign(p,{built:h,optional:E,unplugged:C})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta==\"object\"&&e.peerDependenciesMeta!==null)for(let[n,c]of Object.entries(e.peerDependenciesMeta)){if(typeof c!=\"object\"||c===null){s.push(new Error(`Invalid meta field for '${n}'`));continue}let f=C0(n),p=this.ensurePeerDependencyMeta(f),h=RQ(c.optional,{yamlCompatibilityMode:r});if(h===null){s.push(new Error(`Invalid optional meta field for '${n}'`));continue}Object.assign(p,{optional:h})}if(this.resolutions=[],typeof e.resolutions==\"object\"&&e.resolutions!==null)for(let[n,c]of Object.entries(e.resolutions)){if(typeof c!=\"string\"){s.push(new Error(`Invalid resolution entry for '${n}'`));continue}try{this.resolutions.push({pattern:px(n),reference:c})}catch(f){s.push(f);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let n of e.files){if(typeof n!=\"string\"){s.push(new Error(`Invalid files entry for '${n}'`));continue}this.files.add(n)}}else this.files=null;if(typeof e.publishConfig==\"object\"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access==\"string\"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main==\"string\"&&(this.publishConfig.main=ba(e.publishConfig.main)),typeof e.publishConfig.module==\"string\"&&(this.publishConfig.module=ba(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser==\"string\")this.publishConfig.browser=ba(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[n,c]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(ba(n),typeof c==\"string\"?ba(c):c)}if(typeof e.publishConfig.registry==\"string\"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.provenance==\"boolean\"&&(this.publishConfig.provenance=e.publishConfig.provenance),typeof e.publishConfig.bin==\"string\")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,ba(e.publishConfig.bin)]]):s.push(new Error(\"String bin field, but no attached package name\"));else if(typeof e.publishConfig.bin==\"object\"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[n,c]of Object.entries(e.publishConfig.bin)){if(typeof c!=\"string\"){s.push(new Error(`Invalid bin definition for '${n}'`));continue}this.publishConfig.bin.set(n,ba(c))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let n of e.publishConfig.executableFiles){if(typeof n!=\"string\"){s.push(new Error(\"Invalid executable file definition\"));continue}this.publishConfig.executableFiles.add(ba(n))}}}else this.publishConfig=null;if(typeof e.installConfig==\"object\"&&e.installConfig!==null){this.installConfig={};for(let n of Object.keys(e.installConfig))n===\"hoistingLimits\"?typeof e.installConfig.hoistingLimits==\"string\"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:s.push(new Error(\"Invalid hoisting limits definition\")):n==\"selfReferences\"?typeof e.installConfig.selfReferences==\"boolean\"?this.installConfig.selfReferences=e.installConfig.selfReferences:s.push(new Error(\"Invalid selfReferences definition, must be a boolean value\")):s.push(new Error(`Unrecognized installConfig key: ${n}`))}else this.installConfig=null;if(typeof e.optionalDependencies==\"object\"&&e.optionalDependencies!==null)for(let[n,c]of Object.entries(e.optionalDependencies)){if(typeof c!=\"string\"){s.push(new Error(`Invalid dependency range for '${n}'`));continue}let f;try{f=Sa(n)}catch{s.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=On(f,c);this.dependencies.set(p.identHash,p);let h=On(f,\"unknown\"),E=this.ensureDependencyMeta(h);Object.assign(E,{optional:!0})}typeof e.preferUnplugged==\"boolean\"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=s}getForScope(e){switch(e){case\"dependencies\":return this.dependencies;case\"devDependencies\":return this.devDependencies;case\"peerDependencies\":return this.peerDependencies;default:throw new Error(`Unsupported value (\"${e}\")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(T8(\"os\",this.os)),this.cpu&&this.cpu.length>0&&e.push(T8(\"cpu\",this.cpu)),this.libc&&this.libc.length>0&&e.push(T8(\"libc\",this.libc)),e.length>0?e.join(\" & \"):null}ensureDependencyMeta(e){if(e.range!==\"unknown\"&&!Aue.default.valid(e.range))throw new Error(`Invalid meta field range for '${al(e)}'`);let r=un(e),s=e.range!==\"unknown\"?e.range:null,a=this.dependenciesMeta.get(r);a||this.dependenciesMeta.set(r,a=new Map);let n=a.get(s);return n||a.set(s,n={}),n}ensurePeerDependencyMeta(e){if(e.range!==\"unknown\")throw new Error(`Invalid meta field range for '${al(e)}'`);let r=un(e),s=this.peerDependenciesMeta.get(r);return s||this.peerDependenciesMeta.set(r,s={}),s}setRawField(e,r,{after:s=[]}={}){let a=new Set(s.filter(n=>Object.hasOwn(this.raw,n)));if(a.size===0||Object.hasOwn(this.raw,e))this.raw[e]=r;else{let n=this.raw,c=this.raw={},f=!1;for(let p of Object.keys(n))c[p]=n[p],f||(a.delete(p),a.size===0&&(c[e]=r,f=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){if(Object.assign(e,this.raw),this.name!==null?e.name=un(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let n=this.browser;typeof n==\"string\"?e.browser=n:n instanceof Map&&(e.browser=Object.assign({},...Array.from(n.keys()).sort().map(c=>({[c]:n.get(c)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(n=>({[n]:this.bin.get(n)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces={...this.raw.workspaces,packages:this.workspaceDefinitions.map(({pattern:n})=>n)}:e.workspaces=this.workspaceDefinitions.map(({pattern:n})=>n):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let s=[],a=[];for(let n of this.dependencies.values()){let c=this.dependenciesMeta.get(un(n)),f=!1;if(r&&c){let p=c.get(null);p&&p.optional&&(f=!0)}f?a.push(n):s.push(n)}s.length>0?e.dependencies=Object.assign({},...sI(s).map(n=>({[un(n)]:n.range}))):delete e.dependencies,a.length>0?e.optionalDependencies=Object.assign({},...sI(a).map(n=>({[un(n)]:n.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...sI(this.devDependencies.values()).map(n=>({[un(n)]:n.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...sI(this.peerDependencies.values()).map(n=>({[un(n)]:n.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[n,c]of qs(this.dependenciesMeta.entries(),([f,p])=>f))for(let[f,p]of qs(c.entries(),([h,E])=>h!==null?`0${h}`:\"1\")){let h=f!==null?al(On(Sa(n),f)):n,E={...p};r&&f===null&&delete E.optional,Object.keys(E).length!==0&&(e.dependenciesMeta[h]=E)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...qs(this.peerDependenciesMeta.entries(),([n,c])=>n).map(([n,c])=>({[n]:c}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:n,reference:c})=>({[hx(n)]:c}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){e.scripts??={};for(let n of Object.keys(e.scripts))this.scripts.has(n)||delete e.scripts[n];for(let[n,c]of this.scripts.entries())e.scripts[n]=c}else delete e.scripts;return e}}});function Aet(t){return typeof t.reportCode<\"u\"}var pue,hue,fet,jt,Ao,Tc=Xe(()=>{ql();pue=Ie(\"stream\"),hue=Ie(\"string_decoder\"),fet=15,jt=class extends Error{constructor(r,s,a){super(s);this.reportExtra=a;this.reportCode=r}};Ao=class{constructor(){this.cacheHits=new Set;this.cacheMisses=new Set;this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}getRecommendedLength(){return 180}reportCacheHit(e){this.cacheHits.add(e.locatorHash)}reportCacheMiss(e,r){this.cacheMisses.add(e.locatorHash)}static progressViaCounter(e){let r=0,s,a=new Promise(p=>{s=p}),n=p=>{let h=s;a=new Promise(E=>{s=E}),r=p,h()},c=(p=0)=>{n(r+1)},f=async function*(){for(;r<e;)await a,yield{progress:r/e}}();return{[Symbol.asyncIterator](){return f},hasProgress:!0,hasTitle:!1,set:n,tick:c}}static progressViaTitle(){let e,r,s=new Promise(c=>{r=c}),a=Q4(c=>{let f=r;s=new Promise(p=>{r=p}),e=c,f()},1e3/fet),n=async function*(){for(;;)await s,yield{title:e}}();return{[Symbol.asyncIterator](){return n},hasProgress:!1,hasTitle:!0,setTitle:a}}async startProgressPromise(e,r){let s=this.reportProgress(e);try{return await r(e)}finally{s.stop()}}startProgressSync(e,r){let s=this.reportProgress(e);try{return r(e)}finally{s.stop()}}reportInfoOnce(e,r,s){let a=s&&s.key?s.key:r;this.reportedInfos.has(a)||(this.reportedInfos.add(a),this.reportInfo(e,r),s?.reportExtra?.(this))}reportWarningOnce(e,r,s){let a=s&&s.key?s.key:r;this.reportedWarnings.has(a)||(this.reportedWarnings.add(a),this.reportWarning(e,r),s?.reportExtra?.(this))}reportErrorOnce(e,r,s){let a=s&&s.key?s.key:r;this.reportedErrors.has(a)||(this.reportedErrors.add(a),this.reportError(e,r),s?.reportExtra?.(this))}reportExceptionOnce(e){Aet(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(1,e.stack||e.message,{key:e})}createStreamReporter(e=null){let r=new pue.PassThrough,s=new hue.StringDecoder,a=\"\";return r.on(\"data\",n=>{let c=s.write(n),f;do if(f=c.indexOf(`\n`),f!==-1){let p=a+c.substring(0,f);c=c.substring(f+1),a=\"\",e!==null?this.reportInfo(null,`${e} ${p}`):this.reportInfo(null,p)}while(f!==-1);a+=c}),r.on(\"end\",()=>{let n=s.end();n!==\"\"&&(e!==null?this.reportInfo(null,`${e} ${n}`):this.reportInfo(null,n))}),r}}});var aI,R8=Xe(()=>{Tc();Wo();aI=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let s=this.fetchers.find(a=>a.supports(e,r));return s||null}getFetcher(e,r){let s=this.fetchers.find(a=>a.supports(e,r));if(!s)throw new jt(11,`${Yr(r.project.configuration,e)} isn't supported by any available fetcher`);return s}}});var rm,F8=Xe(()=>{Wo();rm=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,s){return this.getResolverByDescriptor(e,s).bindDescriptor(e,r,s)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,s){return await this.getResolverByDescriptor(e,s).getCandidates(e,r,s)}async getSatisfying(e,r,s,a){return this.getResolverByDescriptor(e,a).getSatisfying(e,r,s,a)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let s=this.resolvers.find(a=>a.supportsDescriptor(e,r));return s||null}getResolverByDescriptor(e,r){let s=this.resolvers.find(a=>a.supportsDescriptor(e,r));if(!s)throw new Error(`${ni(r.project.configuration,e)} isn't supported by any available resolver`);return s}tryResolverByLocator(e,r){let s=this.resolvers.find(a=>a.supportsLocator(e,r));return s||null}getResolverByLocator(e,r){let s=this.resolvers.find(a=>a.supportsLocator(e,r));if(!s)throw new Error(`${Yr(r.project.configuration,e)} isn't supported by any available resolver`);return s}}});var lI,N8=Xe(()=>{Dt();Wo();lI=class{supports(e){return!!e.reference.startsWith(\"virtual:\")}getLocalPath(e,r){let s=e.reference.indexOf(\"#\");if(s===-1)throw new Error(\"Invalid virtual package reference\");let a=e.reference.slice(s+1),n=Ws(e,a);return r.fetcher.getLocalPath(n,r)}async fetch(e,r){let s=e.reference.indexOf(\"#\");if(s===-1)throw new Error(\"Invalid virtual package reference\");let a=e.reference.slice(s+1),n=Ws(e,a),c=await r.fetcher.fetch(n,r);return await this.ensureVirtualLink(e,c,r)}getLocatorFilename(e){return nI(e)}async ensureVirtualLink(e,r,s){let a=r.packageFs.getRealPath(),n=s.project.configuration.get(\"virtualFolder\"),c=this.getLocatorFilename(e),f=uo.makeVirtualPath(n,c,a),p=new _f(f,{baseFs:r.packageFs,pathUtils:J});return{...r,packageFs:p}}}});var FQ,gue=Xe(()=>{FQ=class t{static{this.protocol=\"virtual:\"}static isVirtualDescriptor(e){return!!e.range.startsWith(t.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(t.protocol)}supportsDescriptor(e,r){return t.isVirtualDescriptor(e)}supportsLocator(e,r){return t.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){throw new Error('Assertion failed: calling \"bindDescriptor\" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling \"getResolutionDependencies\" on a virtual descriptor is unsupported')}async getCandidates(e,r,s){throw new Error('Assertion failed: calling \"getCandidates\" on a virtual descriptor is unsupported')}async getSatisfying(e,r,s,a){throw new Error('Assertion failed: calling \"getSatisfying\" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling \"resolve\" on a virtual locator is unsupported')}}});var cI,O8=Xe(()=>{Dt();tm();cI=class{supports(e){return!!e.reference.startsWith(Ei.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let s=this.getWorkspace(e,r).cwd;return{packageFs:new Sn(s),prefixPath:vt.dot,localPath:s}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(Ei.protocol.length))}}});function WB(t){return typeof t==\"object\"&&t!==null&&!Array.isArray(t)}function due(t){return typeof t>\"u\"?3:WB(t)?0:Array.isArray(t)?1:2}function U8(t,e){return Object.hasOwn(t,e)}function het(t){return WB(t)&&U8(t,\"onConflict\")&&typeof t.onConflict==\"string\"}function get(t){if(typeof t>\"u\")return{onConflict:\"default\",value:t};if(!het(t))return{onConflict:\"default\",value:t};if(U8(t,\"value\"))return t;let{onConflict:e,...r}=t;return{onConflict:e,value:r}}function mue(t,e){let r=WB(t)&&U8(t,e)?t[e]:void 0;return get(r)}function uI(t,e){return[t,e,yue]}function _8(t){return Array.isArray(t)?t[2]===yue:!1}function L8(t,e){if(WB(t)){let r={};for(let s of Object.keys(t))r[s]=L8(t[s],e);return uI(e,r)}return Array.isArray(t)?uI(e,t.map(r=>L8(r,e))):uI(e,t)}function M8(t,e,r,s,a){let n,c=[],f=a,p=0;for(let E=a-1;E>=s;--E){let[C,S]=t[E],{onConflict:P,value:I}=mue(S,r),R=due(I);if(R!==3){if(n??=R,R!==n||P===\"hardReset\"){p=f;break}if(R===2)return uI(C,I);if(c.unshift([C,I]),P===\"reset\"){p=E;break}P===\"extend\"&&E===s&&(s=0),f=E}}if(typeof n>\"u\")return null;let h=c.map(([E])=>E).join(\", \");switch(n){case 1:return uI(h,new Array().concat(...c.map(([E,C])=>C.map(S=>L8(S,E)))));case 0:{let E=Object.assign({},...c.map(([,R])=>R)),C=Object.keys(E),S={},P=t.map(([R,N])=>[R,mue(N,r).value]),I=pet(P,([R,N])=>{let U=due(N);return U!==0&&U!==3});if(I!==-1){let R=P.slice(I+1);for(let N of C)S[N]=M8(R,e,N,0,R.length)}else for(let R of C)S[R]=M8(P,e,R,p,P.length);return uI(h,S)}default:throw new Error(\"Assertion failed: Non-extendable value type\")}}function Eue(t){return M8(t.map(([e,r])=>[e,{\".\":r}]),[],\".\",0,t.length)}function YB(t){return _8(t)?t[1]:t}function NQ(t){let e=_8(t)?t[1]:t;if(Array.isArray(e))return e.map(r=>NQ(r));if(WB(e)){let r={};for(let[s,a]of Object.entries(e))r[s]=NQ(a);return r}return e}function H8(t){return _8(t)?t[0]:null}var pet,yue,Iue=Xe(()=>{pet=(t,e,r)=>{let s=[...t];return s.reverse(),s.findIndex(e,r)};yue=Symbol()});var OQ={};Vt(OQ,{getDefaultGlobalFolder:()=>G8,getHomeFolder:()=>fI,isFolderInside:()=>q8});function G8(){if(process.platform===\"win32\"){let t=fe.toPortablePath(process.env.LOCALAPPDATA||fe.join((0,j8.homedir)(),\"AppData\",\"Local\"));return J.resolve(t,\"Yarn/Berry\")}if(process.env.XDG_DATA_HOME){let t=fe.toPortablePath(process.env.XDG_DATA_HOME);return J.resolve(t,\"yarn/berry\")}return J.resolve(fI(),\".yarn/berry\")}function fI(){return fe.toPortablePath((0,j8.homedir)()||\"/usr/local/share\")}function q8(t,e){let r=J.relative(e,t);return r&&!r.startsWith(\"..\")&&!J.isAbsolute(r)}var j8,LQ=Xe(()=>{Dt();j8=Ie(\"os\")});var Bue=_((EMt,wue)=>{\"use strict\";var W8=Ie(\"https\"),Y8=Ie(\"http\"),{URL:Cue}=Ie(\"url\"),V8=class extends Y8.Agent{constructor(e){let{proxy:r,proxyRequestOptions:s,...a}=e;super(a),this.proxy=typeof r==\"string\"?new Cue(r):r,this.proxyRequestOptions=s||{}}createConnection(e,r){let s={...this.proxyRequestOptions,method:\"CONNECT\",host:this.proxy.hostname,port:this.proxy.port,path:`${e.host}:${e.port}`,setHost:!1,headers:{...this.proxyRequestOptions.headers,connection:this.keepAlive?\"keep-alive\":\"close\",host:`${e.host}:${e.port}`},agent:!1,timeout:e.timeout||0};if(this.proxy.username||this.proxy.password){let n=Buffer.from(`${decodeURIComponent(this.proxy.username||\"\")}:${decodeURIComponent(this.proxy.password||\"\")}`).toString(\"base64\");s.headers[\"proxy-authorization\"]=`Basic ${n}`}this.proxy.protocol===\"https:\"&&(s.servername=this.proxy.hostname);let a=(this.proxy.protocol===\"http:\"?Y8:W8).request(s);a.once(\"connect\",(n,c,f)=>{a.removeAllListeners(),c.removeAllListeners(),n.statusCode===200?r(null,c):(c.destroy(),r(new Error(`Bad response: ${n.statusCode}`),null))}),a.once(\"timeout\",()=>{a.destroy(new Error(\"Proxy timeout\"))}),a.once(\"error\",n=>{a.removeAllListeners(),r(n,null)}),a.end()}},J8=class extends W8.Agent{constructor(e){let{proxy:r,proxyRequestOptions:s,...a}=e;super(a),this.proxy=typeof r==\"string\"?new Cue(r):r,this.proxyRequestOptions=s||{}}createConnection(e,r){let s={...this.proxyRequestOptions,method:\"CONNECT\",host:this.proxy.hostname,port:this.proxy.port,path:`${e.host}:${e.port}`,setHost:!1,headers:{...this.proxyRequestOptions.headers,connection:this.keepAlive?\"keep-alive\":\"close\",host:`${e.host}:${e.port}`},agent:!1,timeout:e.timeout||0};if(this.proxy.username||this.proxy.password){let n=Buffer.from(`${decodeURIComponent(this.proxy.username||\"\")}:${decodeURIComponent(this.proxy.password||\"\")}`).toString(\"base64\");s.headers[\"proxy-authorization\"]=`Basic ${n}`}this.proxy.protocol===\"https:\"&&(s.servername=this.proxy.hostname);let a=(this.proxy.protocol===\"http:\"?Y8:W8).request(s);a.once(\"connect\",(n,c,f)=>{if(a.removeAllListeners(),c.removeAllListeners(),n.statusCode===200){let p=super.createConnection({...e,socket:c});r(null,p)}else c.destroy(),r(new Error(`Bad response: ${n.statusCode}`),null)}),a.once(\"timeout\",()=>{a.destroy(new Error(\"Proxy timeout\"))}),a.once(\"error\",n=>{a.removeAllListeners(),r(n,null)}),a.end()}};wue.exports={HttpProxyAgent:V8,HttpsProxyAgent:J8}});var K8,vue,Sue,Due=Xe(()=>{K8=ut(Bue(),1),vue=K8.default.HttpProxyAgent,Sue=K8.default.HttpsProxyAgent});var Np=_((Fp,MQ)=>{\"use strict\";Object.defineProperty(Fp,\"__esModule\",{value:!0});var bue=[\"Int8Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"Int16Array\",\"Uint16Array\",\"Int32Array\",\"Uint32Array\",\"Float32Array\",\"Float64Array\",\"BigInt64Array\",\"BigUint64Array\"];function met(t){return bue.includes(t)}var yet=[\"Function\",\"Generator\",\"AsyncGenerator\",\"GeneratorFunction\",\"AsyncGeneratorFunction\",\"AsyncFunction\",\"Observable\",\"Array\",\"Buffer\",\"Blob\",\"Object\",\"RegExp\",\"Date\",\"Error\",\"Map\",\"Set\",\"WeakMap\",\"WeakSet\",\"ArrayBuffer\",\"SharedArrayBuffer\",\"DataView\",\"Promise\",\"URL\",\"FormData\",\"URLSearchParams\",\"HTMLElement\",...bue];function Eet(t){return yet.includes(t)}var Iet=[\"null\",\"undefined\",\"string\",\"number\",\"bigint\",\"boolean\",\"symbol\"];function Cet(t){return Iet.includes(t)}function AI(t){return e=>typeof e===t}var{toString:Pue}=Object.prototype,VB=t=>{let e=Pue.call(t).slice(8,-1);if(/HTML\\w+Element/.test(e)&&be.domElement(t))return\"HTMLElement\";if(Eet(e))return e},pi=t=>e=>VB(e)===t;function be(t){if(t===null)return\"null\";switch(typeof t){case\"undefined\":return\"undefined\";case\"string\":return\"string\";case\"number\":return\"number\";case\"boolean\":return\"boolean\";case\"function\":return\"Function\";case\"bigint\":return\"bigint\";case\"symbol\":return\"symbol\";default:}if(be.observable(t))return\"Observable\";if(be.array(t))return\"Array\";if(be.buffer(t))return\"Buffer\";let e=VB(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError(\"Please don't use object wrappers for primitive types\");return\"Object\"}be.undefined=AI(\"undefined\");be.string=AI(\"string\");var wet=AI(\"number\");be.number=t=>wet(t)&&!be.nan(t);be.bigint=AI(\"bigint\");be.function_=AI(\"function\");be.null_=t=>t===null;be.class_=t=>be.function_(t)&&t.toString().startsWith(\"class \");be.boolean=t=>t===!0||t===!1;be.symbol=AI(\"symbol\");be.numericString=t=>be.string(t)&&!be.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));be.array=(t,e)=>Array.isArray(t)?be.function_(e)?t.every(e):!0:!1;be.buffer=t=>{var e,r,s,a;return(a=(s=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||s===void 0?void 0:s.call(r,t))!==null&&a!==void 0?a:!1};be.blob=t=>pi(\"Blob\")(t);be.nullOrUndefined=t=>be.null_(t)||be.undefined(t);be.object=t=>!be.null_(t)&&(typeof t==\"object\"||be.function_(t));be.iterable=t=>{var e;return be.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};be.asyncIterable=t=>{var e;return be.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};be.generator=t=>{var e,r;return be.iterable(t)&&be.function_((e=t)===null||e===void 0?void 0:e.next)&&be.function_((r=t)===null||r===void 0?void 0:r.throw)};be.asyncGenerator=t=>be.asyncIterable(t)&&be.function_(t.next)&&be.function_(t.throw);be.nativePromise=t=>pi(\"Promise\")(t);var Bet=t=>{var e,r;return be.function_((e=t)===null||e===void 0?void 0:e.then)&&be.function_((r=t)===null||r===void 0?void 0:r.catch)};be.promise=t=>be.nativePromise(t)||Bet(t);be.generatorFunction=pi(\"GeneratorFunction\");be.asyncGeneratorFunction=t=>VB(t)===\"AsyncGeneratorFunction\";be.asyncFunction=t=>VB(t)===\"AsyncFunction\";be.boundFunction=t=>be.function_(t)&&!t.hasOwnProperty(\"prototype\");be.regExp=pi(\"RegExp\");be.date=pi(\"Date\");be.error=pi(\"Error\");be.map=t=>pi(\"Map\")(t);be.set=t=>pi(\"Set\")(t);be.weakMap=t=>pi(\"WeakMap\")(t);be.weakSet=t=>pi(\"WeakSet\")(t);be.int8Array=pi(\"Int8Array\");be.uint8Array=pi(\"Uint8Array\");be.uint8ClampedArray=pi(\"Uint8ClampedArray\");be.int16Array=pi(\"Int16Array\");be.uint16Array=pi(\"Uint16Array\");be.int32Array=pi(\"Int32Array\");be.uint32Array=pi(\"Uint32Array\");be.float32Array=pi(\"Float32Array\");be.float64Array=pi(\"Float64Array\");be.bigInt64Array=pi(\"BigInt64Array\");be.bigUint64Array=pi(\"BigUint64Array\");be.arrayBuffer=pi(\"ArrayBuffer\");be.sharedArrayBuffer=pi(\"SharedArrayBuffer\");be.dataView=pi(\"DataView\");be.enumCase=(t,e)=>Object.values(e).includes(t);be.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;be.urlInstance=t=>pi(\"URL\")(t);be.urlString=t=>{if(!be.string(t))return!1;try{return new URL(t),!0}catch{return!1}};be.truthy=t=>!!t;be.falsy=t=>!t;be.nan=t=>Number.isNaN(t);be.primitive=t=>be.null_(t)||Cet(typeof t);be.integer=t=>Number.isInteger(t);be.safeInteger=t=>Number.isSafeInteger(t);be.plainObject=t=>{if(Pue.call(t)!==\"[object Object]\")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};be.typedArray=t=>met(VB(t));var vet=t=>be.safeInteger(t)&&t>=0;be.arrayLike=t=>!be.nullOrUndefined(t)&&!be.function_(t)&&vet(t.length);be.inRange=(t,e)=>{if(be.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(be.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var Det=1,bet=[\"innerHTML\",\"ownerDocument\",\"style\",\"attributes\",\"nodeValue\"];be.domElement=t=>be.object(t)&&t.nodeType===Det&&be.string(t.nodeName)&&!be.plainObject(t)&&bet.every(e=>e in t);be.observable=t=>{var e,r,s,a;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((a=(s=t)[\"@@observable\"])===null||a===void 0?void 0:a.call(s)):!1};be.nodeStream=t=>be.object(t)&&be.function_(t.pipe)&&!be.observable(t);be.infinite=t=>t===1/0||t===-1/0;var xue=t=>e=>be.integer(e)&&Math.abs(e%2)===t;be.evenInteger=xue(0);be.oddInteger=xue(1);be.emptyArray=t=>be.array(t)&&t.length===0;be.nonEmptyArray=t=>be.array(t)&&t.length>0;be.emptyString=t=>be.string(t)&&t.length===0;var Pet=t=>be.string(t)&&!/\\S/.test(t);be.emptyStringOrWhitespace=t=>be.emptyString(t)||Pet(t);be.nonEmptyString=t=>be.string(t)&&t.length>0;be.nonEmptyStringAndNotWhitespace=t=>be.string(t)&&!be.emptyStringOrWhitespace(t);be.emptyObject=t=>be.object(t)&&!be.map(t)&&!be.set(t)&&Object.keys(t).length===0;be.nonEmptyObject=t=>be.object(t)&&!be.map(t)&&!be.set(t)&&Object.keys(t).length>0;be.emptySet=t=>be.set(t)&&t.size===0;be.nonEmptySet=t=>be.set(t)&&t.size>0;be.emptyMap=t=>be.map(t)&&t.size===0;be.nonEmptyMap=t=>be.map(t)&&t.size>0;be.propertyKey=t=>be.any([be.string,be.number,be.symbol],t);be.formData=t=>pi(\"FormData\")(t);be.urlSearchParams=t=>pi(\"URLSearchParams\")(t);var kue=(t,e,r)=>{if(!be.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError(\"Invalid number of values\");return t.call(r,e)};be.any=(t,...e)=>(be.array(t)?t:[t]).some(s=>kue(Array.prototype.some,s,e));be.all=(t,...e)=>kue(Array.prototype.every,t,e);var _t=(t,e,r,s={})=>{if(!t){let{multipleValues:a}=s,n=a?`received values of types ${[...new Set(r.map(c=>`\\`${be(c)}\\``))].join(\", \")}`:`received value of type \\`${be(r)}\\``;throw new TypeError(`Expected value which is \\`${e}\\`, ${n}.`)}};Fp.assert={undefined:t=>_t(be.undefined(t),\"undefined\",t),string:t=>_t(be.string(t),\"string\",t),number:t=>_t(be.number(t),\"number\",t),bigint:t=>_t(be.bigint(t),\"bigint\",t),function_:t=>_t(be.function_(t),\"Function\",t),null_:t=>_t(be.null_(t),\"null\",t),class_:t=>_t(be.class_(t),\"Class\",t),boolean:t=>_t(be.boolean(t),\"boolean\",t),symbol:t=>_t(be.symbol(t),\"symbol\",t),numericString:t=>_t(be.numericString(t),\"string with a number\",t),array:(t,e)=>{_t(be.array(t),\"Array\",t),e&&t.forEach(e)},buffer:t=>_t(be.buffer(t),\"Buffer\",t),blob:t=>_t(be.blob(t),\"Blob\",t),nullOrUndefined:t=>_t(be.nullOrUndefined(t),\"null or undefined\",t),object:t=>_t(be.object(t),\"Object\",t),iterable:t=>_t(be.iterable(t),\"Iterable\",t),asyncIterable:t=>_t(be.asyncIterable(t),\"AsyncIterable\",t),generator:t=>_t(be.generator(t),\"Generator\",t),asyncGenerator:t=>_t(be.asyncGenerator(t),\"AsyncGenerator\",t),nativePromise:t=>_t(be.nativePromise(t),\"native Promise\",t),promise:t=>_t(be.promise(t),\"Promise\",t),generatorFunction:t=>_t(be.generatorFunction(t),\"GeneratorFunction\",t),asyncGeneratorFunction:t=>_t(be.asyncGeneratorFunction(t),\"AsyncGeneratorFunction\",t),asyncFunction:t=>_t(be.asyncFunction(t),\"AsyncFunction\",t),boundFunction:t=>_t(be.boundFunction(t),\"Function\",t),regExp:t=>_t(be.regExp(t),\"RegExp\",t),date:t=>_t(be.date(t),\"Date\",t),error:t=>_t(be.error(t),\"Error\",t),map:t=>_t(be.map(t),\"Map\",t),set:t=>_t(be.set(t),\"Set\",t),weakMap:t=>_t(be.weakMap(t),\"WeakMap\",t),weakSet:t=>_t(be.weakSet(t),\"WeakSet\",t),int8Array:t=>_t(be.int8Array(t),\"Int8Array\",t),uint8Array:t=>_t(be.uint8Array(t),\"Uint8Array\",t),uint8ClampedArray:t=>_t(be.uint8ClampedArray(t),\"Uint8ClampedArray\",t),int16Array:t=>_t(be.int16Array(t),\"Int16Array\",t),uint16Array:t=>_t(be.uint16Array(t),\"Uint16Array\",t),int32Array:t=>_t(be.int32Array(t),\"Int32Array\",t),uint32Array:t=>_t(be.uint32Array(t),\"Uint32Array\",t),float32Array:t=>_t(be.float32Array(t),\"Float32Array\",t),float64Array:t=>_t(be.float64Array(t),\"Float64Array\",t),bigInt64Array:t=>_t(be.bigInt64Array(t),\"BigInt64Array\",t),bigUint64Array:t=>_t(be.bigUint64Array(t),\"BigUint64Array\",t),arrayBuffer:t=>_t(be.arrayBuffer(t),\"ArrayBuffer\",t),sharedArrayBuffer:t=>_t(be.sharedArrayBuffer(t),\"SharedArrayBuffer\",t),dataView:t=>_t(be.dataView(t),\"DataView\",t),enumCase:(t,e)=>_t(be.enumCase(t,e),\"EnumCase\",t),urlInstance:t=>_t(be.urlInstance(t),\"URL\",t),urlString:t=>_t(be.urlString(t),\"string with a URL\",t),truthy:t=>_t(be.truthy(t),\"truthy\",t),falsy:t=>_t(be.falsy(t),\"falsy\",t),nan:t=>_t(be.nan(t),\"NaN\",t),primitive:t=>_t(be.primitive(t),\"primitive\",t),integer:t=>_t(be.integer(t),\"integer\",t),safeInteger:t=>_t(be.safeInteger(t),\"integer\",t),plainObject:t=>_t(be.plainObject(t),\"plain object\",t),typedArray:t=>_t(be.typedArray(t),\"TypedArray\",t),arrayLike:t=>_t(be.arrayLike(t),\"array-like\",t),domElement:t=>_t(be.domElement(t),\"HTMLElement\",t),observable:t=>_t(be.observable(t),\"Observable\",t),nodeStream:t=>_t(be.nodeStream(t),\"Node.js Stream\",t),infinite:t=>_t(be.infinite(t),\"infinite number\",t),emptyArray:t=>_t(be.emptyArray(t),\"empty array\",t),nonEmptyArray:t=>_t(be.nonEmptyArray(t),\"non-empty array\",t),emptyString:t=>_t(be.emptyString(t),\"empty string\",t),emptyStringOrWhitespace:t=>_t(be.emptyStringOrWhitespace(t),\"empty string or whitespace\",t),nonEmptyString:t=>_t(be.nonEmptyString(t),\"non-empty string\",t),nonEmptyStringAndNotWhitespace:t=>_t(be.nonEmptyStringAndNotWhitespace(t),\"non-empty string and not whitespace\",t),emptyObject:t=>_t(be.emptyObject(t),\"empty object\",t),nonEmptyObject:t=>_t(be.nonEmptyObject(t),\"non-empty object\",t),emptySet:t=>_t(be.emptySet(t),\"empty set\",t),nonEmptySet:t=>_t(be.nonEmptySet(t),\"non-empty set\",t),emptyMap:t=>_t(be.emptyMap(t),\"empty map\",t),nonEmptyMap:t=>_t(be.nonEmptyMap(t),\"non-empty map\",t),propertyKey:t=>_t(be.propertyKey(t),\"PropertyKey\",t),formData:t=>_t(be.formData(t),\"FormData\",t),urlSearchParams:t=>_t(be.urlSearchParams(t),\"URLSearchParams\",t),evenInteger:t=>_t(be.evenInteger(t),\"even integer\",t),oddInteger:t=>_t(be.oddInteger(t),\"odd integer\",t),directInstanceOf:(t,e)=>_t(be.directInstanceOf(t,e),\"T\",t),inRange:(t,e)=>_t(be.inRange(t,e),\"in range\",t),any:(t,...e)=>_t(be.any(t,...e),\"predicate returns truthy for any value\",e,{multipleValues:!0}),all:(t,...e)=>_t(be.all(t,...e),\"predicate returns truthy for all values\",e,{multipleValues:!0})};Object.defineProperties(be,{class:{value:be.class_},function:{value:be.function_},null:{value:be.null_}});Object.defineProperties(Fp.assert,{class:{value:Fp.assert.class_},function:{value:Fp.assert.function_},null:{value:Fp.assert.null_}});Fp.default=be;MQ.exports=be;MQ.exports.default=be;MQ.exports.assert=Fp.assert});var Que=_((CMt,z8)=>{\"use strict\";var UQ=class extends Error{constructor(e){super(e||\"Promise was canceled\"),this.name=\"CancelError\"}get isCanceled(){return!0}},_Q=class t{static fn(e){return(...r)=>new t((s,a,n)=>{r.push(n),e(...r).then(s,a)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,s)=>{this._reject=s;let a=f=>{this._isPending=!1,r(f)},n=f=>{this._isPending=!1,s(f)},c=f=>{if(!this._isPending)throw new Error(\"The `onCancel` handler was attached after the promise settled.\");this._cancelHandlers.push(f)};return Object.defineProperties(c,{shouldReject:{get:()=>this._rejectOnCancel,set:f=>{this._rejectOnCancel=f}}}),e(a,n,c)})}then(e,r){return this._promise.then(e,r)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new UQ(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(_Q.prototype,Promise.prototype);z8.exports=_Q;z8.exports.CancelError=UQ});var Tue=_((Z8,$8)=>{\"use strict\";Object.defineProperty(Z8,\"__esModule\",{value:!0});function xet(t){return t.encrypted}var X8=(t,e)=>{let r;typeof e==\"function\"?r={connect:e}:r=e;let s=typeof r.connect==\"function\",a=typeof r.secureConnect==\"function\",n=typeof r.close==\"function\",c=()=>{s&&r.connect(),xet(t)&&a&&(t.authorized?r.secureConnect():t.authorizationError||t.once(\"secureConnect\",r.secureConnect)),n&&t.once(\"close\",r.close)};t.writable&&!t.connecting?c():t.connecting?t.once(\"connect\",c):t.destroyed&&n&&r.close(t._hadError)};Z8.default=X8;$8.exports=X8;$8.exports.default=X8});var Rue=_((tH,rH)=>{\"use strict\";Object.defineProperty(tH,\"__esModule\",{value:!0});var ket=Tue(),Qet=Number(process.versions.node.split(\".\")[0]),eH=t=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};t.timings=e;let r=c=>{let f=c.emit.bind(c);c.emit=(p,...h)=>(p===\"error\"&&(e.error=Date.now(),e.phases.total=e.error-e.start,c.emit=f),f(p,...h))};r(t),t.prependOnceListener(\"abort\",()=>{e.abort=Date.now(),(!e.response||Qet>=13)&&(e.phases.total=Date.now()-e.start)});let s=c=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let f=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};c.prependOnceListener(\"lookup\",f),ket.default(c,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(c.removeListener(\"lookup\",f),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?s(t.socket):t.prependOnceListener(\"socket\",s);let a=()=>{var c;e.upload=Date.now(),e.phases.request=e.upload-(c=e.secureConnect,c??e.connect)};return(typeof t.writableFinished==\"boolean\"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))?a():t.prependOnceListener(\"finish\",a),t.prependOnceListener(\"response\",c=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,c.timings=e,r(c),c.prependOnceListener(\"end\",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};tH.default=eH;rH.exports=eH;rH.exports.default=eH});var _ue=_((wMt,sH)=>{\"use strict\";var{V4MAPPED:Tet,ADDRCONFIG:Ret,ALL:Uue,promises:{Resolver:Fue},lookup:Fet}=Ie(\"dns\"),{promisify:nH}=Ie(\"util\"),Net=Ie(\"os\"),pI=Symbol(\"cacheableLookupCreateConnection\"),iH=Symbol(\"cacheableLookupInstance\"),Nue=Symbol(\"expires\"),Oet=typeof Uue==\"number\",Oue=t=>{if(!(t&&typeof t.createConnection==\"function\"))throw new Error(\"Expected an Agent instance as the first argument\")},Let=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},Lue=()=>{let t=!1,e=!1;for(let r of Object.values(Net.networkInterfaces()))for(let s of r)if(!s.internal&&(s.family===\"IPv6\"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},Met=t=>Symbol.iterator in t,Mue={ttl:!0},Uet={all:!0},HQ=class{constructor({cache:e=new Map,maxTtl:r=1/0,fallbackDuration:s=3600,errorTtl:a=.15,resolver:n=new Fue,lookup:c=Fet}={}){if(this.maxTtl=r,this.errorTtl=a,this._cache=e,this._resolver=n,this._dnsLookup=nH(c),this._resolver instanceof Fue?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=nH(this._resolver.resolve4.bind(this._resolver)),this._resolve6=nH(this._resolver.resolve6.bind(this._resolver))),this._iface=Lue(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,s<1)this._fallback=!1;else{this._fallback=!0;let f=setInterval(()=>{this._hostnamesToFallback.clear()},s*1e3);f.unref&&f.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,r,s){if(typeof r==\"function\"?(s=r,r={}):typeof r==\"number\"&&(r={family:r}),!s)throw new Error(\"Callback must be a function.\");this.lookupAsync(e,r).then(a=>{r.all?s(null,a):s(null,a.address,a.family,a.expires,a.ttl)},s)}async lookupAsync(e,r={}){typeof r==\"number\"&&(r={family:r});let s=await this.query(e);if(r.family===6){let a=s.filter(n=>n.family===6);r.hints&Tet&&(Oet&&r.hints&Uue||a.length===0)?Let(s):s=a}else r.family===4&&(s=s.filter(a=>a.family===4));if(r.hints&Ret){let{_iface:a}=this;s=s.filter(n=>n.family===6?a.has6:a.has4)}if(s.length===0){let a=new Error(`cacheableLookup ENOTFOUND ${e}`);throw a.code=\"ENOTFOUND\",a.hostname=e,a}return r.all?s:s[0]}async query(e){let r=await this._cache.get(e);if(!r){let s=this._pending[e];if(s)r=await s;else{let a=this.queryAndCache(e);this._pending[e]=a,r=await a}}return r=r.map(s=>({...s})),r}async _resolve(e){let r=async h=>{try{return await h}catch(E){if(E.code===\"ENODATA\"||E.code===\"ENOTFOUND\")return[];throw E}},[s,a]=await Promise.all([this._resolve4(e,Mue),this._resolve6(e,Mue)].map(h=>r(h))),n=0,c=0,f=0,p=Date.now();for(let h of s)h.family=4,h.expires=p+h.ttl*1e3,n=Math.max(n,h.ttl);for(let h of a)h.family=6,h.expires=p+h.ttl*1e3,c=Math.max(c,h.ttl);return s.length>0?a.length>0?f=Math.min(n,c):f=n:f=c,{entries:[...s,...a],cacheTtl:f}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch{return{entries:[],cacheTtl:0}}}async _set(e,r,s){if(this.maxTtl>0&&s>0){s=Math.min(s,this.maxTtl)*1e3,r[Nue]=Date.now()+s;try{await this._cache.set(e,r,s)}catch(a){this.lookupAsync=async()=>{let n=new Error(\"Cache Error. Please recreate the CacheableLookup instance.\");throw n.cause=a,n}}Met(this._cache)&&this._tick(s)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Uet);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let s=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,s),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e<r)&&(clearTimeout(this._removalTimeout),this._nextRemovalTime=e,this._removalTimeout=setTimeout(()=>{this._nextRemovalTime=!1;let s=1/0,a=Date.now();for(let[n,c]of this._cache){let f=c[Nue];a>=f?this._cache.delete(n):f<s&&(s=f)}s!==1/0&&this._tick(s-a)},e),this._removalTimeout.unref&&this._removalTimeout.unref())}install(e){if(Oue(e),pI in e)throw new Error(\"CacheableLookup has been already installed\");e[pI]=e.createConnection,e[iH]=this,e.createConnection=(r,s)=>(\"lookup\"in r||(r.lookup=this.lookup),e[pI](r,s))}uninstall(e){if(Oue(e),e[pI]){if(e[iH]!==this)throw new Error(\"The agent is not owned by this CacheableLookup instance\");e.createConnection=e[pI],delete e[pI],delete e[iH]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=Lue(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};sH.exports=HQ;sH.exports.default=HQ});var Gue=_((BMt,oH)=>{\"use strict\";var _et=typeof URL>\"u\"?Ie(\"url\").URL:URL,Het=\"text/plain\",jet=\"us-ascii\",Hue=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),Get=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let s=r[1].split(\";\"),a=r[2],n=e?\"\":r[3],c=!1;s[s.length-1]===\"base64\"&&(s.pop(),c=!0);let f=(s.shift()||\"\").toLowerCase(),h=[...s.map(E=>{let[C,S=\"\"]=E.split(\"=\").map(P=>P.trim());return C===\"charset\"&&(S=S.toLowerCase(),S===jet)?\"\":`${C}${S?`=${S}`:\"\"}`}).filter(Boolean)];return c&&h.push(\"base64\"),(h.length!==0||f&&f!==Het)&&h.unshift(f),`data:${h.join(\";\")},${c?a.trim():a}${n?`#${n}`:\"\"}`},jue=(t,e)=>{if(e={defaultProtocol:\"http:\",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},Reflect.has(e,\"normalizeHttps\"))throw new Error(\"options.normalizeHttps is renamed to options.forceHttp\");if(Reflect.has(e,\"normalizeHttp\"))throw new Error(\"options.normalizeHttp is renamed to options.forceHttps\");if(Reflect.has(e,\"stripFragment\"))throw new Error(\"options.stripFragment is renamed to options.stripHash\");if(t=t.trim(),/^data:/i.test(t))return Get(t,e);let r=t.startsWith(\"//\");!r&&/^\\.*\\//.test(t)||(t=t.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//,e.defaultProtocol));let a=new _et(t);if(e.forceHttp&&e.forceHttps)throw new Error(\"The `forceHttp` and `forceHttps` options cannot be used together\");if(e.forceHttp&&a.protocol===\"https:\"&&(a.protocol=\"http:\"),e.forceHttps&&a.protocol===\"http:\"&&(a.protocol=\"https:\"),e.stripAuthentication&&(a.username=\"\",a.password=\"\"),e.stripHash&&(a.hash=\"\"),a.pathname&&(a.pathname=a.pathname.replace(/((?!:).|^)\\/{2,}/g,(n,c)=>/^(?!\\/)/g.test(c)?`${c}/`:\"/\")),a.pathname&&(a.pathname=decodeURI(a.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let n=a.pathname.split(\"/\"),c=n[n.length-1];Hue(c,e.removeDirectoryIndex)&&(n=n.slice(0,n.length-1),a.pathname=n.slice(1).join(\"/\")+\"/\")}if(a.hostname&&(a.hostname=a.hostname.replace(/\\.$/,\"\"),e.stripWWW&&/^www\\.([a-z\\-\\d]{2,63})\\.([a-z.]{2,5})$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\\./,\"\"))),Array.isArray(e.removeQueryParameters))for(let n of[...a.searchParams.keys()])Hue(n,e.removeQueryParameters)&&a.searchParams.delete(n);return e.sortQueryParameters&&a.searchParams.sort(),e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\\/$/,\"\")),t=a.toString(),(e.removeTrailingSlash||a.pathname===\"/\")&&a.hash===\"\"&&(t=t.replace(/\\/$/,\"\")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\\/\\//,\"//\")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\\/\\//,\"\")),t};oH.exports=jue;oH.exports.default=jue});var Yue=_((vMt,Wue)=>{Wue.exports=que;function que(t,e){if(t&&e)return que(t)(e);if(typeof t!=\"function\")throw new TypeError(\"need wrapper function\");return Object.keys(t).forEach(function(s){r[s]=t[s]}),r;function r(){for(var s=new Array(arguments.length),a=0;a<s.length;a++)s[a]=arguments[a];var n=t.apply(this,s),c=s[s.length-1];return typeof n==\"function\"&&n!==c&&Object.keys(c).forEach(function(f){n[f]=c[f]}),n}}});var lH=_((SMt,aH)=>{var Vue=Yue();aH.exports=Vue(jQ);aH.exports.strict=Vue(Jue);jQ.proto=jQ(function(){Object.defineProperty(Function.prototype,\"once\",{value:function(){return jQ(this)},configurable:!0}),Object.defineProperty(Function.prototype,\"onceStrict\",{value:function(){return Jue(this)},configurable:!0})});function jQ(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function Jue(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||\"Function wrapped with `once`\";return e.onceError=r+\" shouldn't be called more than once\",e.called=!1,e}});var cH=_((DMt,zue)=>{var qet=lH(),Wet=function(){},Yet=function(t){return t.setHeader&&typeof t.abort==\"function\"},Vet=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},Kue=function(t,e,r){if(typeof e==\"function\")return Kue(t,null,e);e||(e={}),r=qet(r||Wet);var s=t._writableState,a=t._readableState,n=e.readable||e.readable!==!1&&t.readable,c=e.writable||e.writable!==!1&&t.writable,f=function(){t.writable||p()},p=function(){c=!1,n||r.call(t)},h=function(){n=!1,c||r.call(t)},E=function(I){r.call(t,I?new Error(\"exited with error code: \"+I):null)},C=function(I){r.call(t,I)},S=function(){if(n&&!(a&&a.ended))return r.call(t,new Error(\"premature close\"));if(c&&!(s&&s.ended))return r.call(t,new Error(\"premature close\"))},P=function(){t.req.on(\"finish\",p)};return Yet(t)?(t.on(\"complete\",p),t.on(\"abort\",S),t.req?P():t.on(\"request\",P)):c&&!s&&(t.on(\"end\",f),t.on(\"close\",f)),Vet(t)&&t.on(\"exit\",E),t.on(\"end\",h),t.on(\"finish\",p),e.error!==!1&&t.on(\"error\",C),t.on(\"close\",S),function(){t.removeListener(\"complete\",p),t.removeListener(\"abort\",S),t.removeListener(\"request\",P),t.req&&t.req.removeListener(\"finish\",p),t.removeListener(\"end\",f),t.removeListener(\"close\",f),t.removeListener(\"finish\",p),t.removeListener(\"exit\",E),t.removeListener(\"end\",h),t.removeListener(\"error\",C),t.removeListener(\"close\",S)}};zue.exports=Kue});var $ue=_((bMt,Zue)=>{var Jet=lH(),Ket=cH(),uH=Ie(\"fs\"),JB=function(){},zet=/^v?\\.0/.test(process.version),GQ=function(t){return typeof t==\"function\"},Xet=function(t){return!zet||!uH?!1:(t instanceof(uH.ReadStream||JB)||t instanceof(uH.WriteStream||JB))&&GQ(t.close)},Zet=function(t){return t.setHeader&&GQ(t.abort)},$et=function(t,e,r,s){s=Jet(s);var a=!1;t.on(\"close\",function(){a=!0}),Ket(t,{readable:e,writable:r},function(c){if(c)return s(c);a=!0,s()});var n=!1;return function(c){if(!a&&!n){if(n=!0,Xet(t))return t.close(JB);if(Zet(t))return t.abort();if(GQ(t.destroy))return t.destroy();s(c||new Error(\"stream was destroyed\"))}}},Xue=function(t){t()},ett=function(t,e){return t.pipe(e)},ttt=function(){var t=Array.prototype.slice.call(arguments),e=GQ(t[t.length-1]||JB)&&t.pop()||JB;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error(\"pump requires two streams per minimum\");var r,s=t.map(function(a,n){var c=n<t.length-1,f=n>0;return $et(a,c,f,function(p){r||(r=p),p&&s.forEach(Xue),!c&&(s.forEach(Xue),e(r))})});return t.reduce(ett)};Zue.exports=ttt});var tfe=_((PMt,efe)=>{\"use strict\";var{PassThrough:rtt}=Ie(\"stream\");efe.exports=t=>{t={...t};let{array:e}=t,{encoding:r}=t,s=r===\"buffer\",a=!1;e?a=!(r||s):r=r||\"utf8\",s&&(r=null);let n=new rtt({objectMode:a});r&&n.setEncoding(r);let c=0,f=[];return n.on(\"data\",p=>{f.push(p),a?c=f.length:c+=p.length}),n.getBufferedValue=()=>e?f:s?Buffer.concat(f,c):f.join(\"\"),n.getBufferedLength=()=>c,n}});var rfe=_((xMt,hI)=>{\"use strict\";var ntt=$ue(),itt=tfe(),qQ=class extends Error{constructor(){super(\"maxBuffer exceeded\"),this.name=\"MaxBufferError\"}};async function WQ(t,e){if(!t)return Promise.reject(new Error(\"Expected a stream\"));e={maxBuffer:1/0,...e};let{maxBuffer:r}=e,s;return await new Promise((a,n)=>{let c=f=>{f&&(f.bufferedData=s.getBufferedValue()),n(f)};s=ntt(t,itt(e),f=>{if(f){c(f);return}a()}),s.on(\"data\",()=>{s.getBufferedLength()>r&&c(new qQ)})}),s.getBufferedValue()}hI.exports=WQ;hI.exports.default=WQ;hI.exports.buffer=(t,e)=>WQ(t,{...e,encoding:\"buffer\"});hI.exports.array=(t,e)=>WQ(t,{...e,array:!0});hI.exports.MaxBufferError=qQ});var ife=_((QMt,nfe)=>{\"use strict\";var stt=new Set([200,203,204,206,300,301,308,404,405,410,414,501]),ott=new Set([200,203,204,300,301,302,303,307,308,404,405,410,414,501]),att=new Set([500,502,503,504]),ltt={date:!0,connection:!0,\"keep-alive\":!0,\"proxy-authenticate\":!0,\"proxy-authorization\":!0,te:!0,trailer:!0,\"transfer-encoding\":!0,upgrade:!0},ctt={\"content-length\":!0,\"content-encoding\":!0,\"transfer-encoding\":!0,\"content-range\":!0};function nm(t){let e=parseInt(t,10);return isFinite(e)?e:0}function utt(t){return t?att.has(t.status):!0}function fH(t){let e={};if(!t)return e;let r=t.trim().split(/,/);for(let s of r){let[a,n]=s.split(/=/,2);e[a.trim()]=n===void 0?!0:n.trim().replace(/^\"|\"$/g,\"\")}return e}function ftt(t){let e=[];for(let r in t){let s=t[r];e.push(s===!0?r:r+\"=\"+s)}if(e.length)return e.join(\", \")}nfe.exports=class{constructor(e,r,{shared:s,cacheHeuristic:a,immutableMinTimeToLive:n,ignoreCargoCult:c,_fromObject:f}={}){if(f){this._fromObject(f);return}if(!r||!r.headers)throw Error(\"Response headers missing\");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=s!==!1,this._cacheHeuristic=a!==void 0?a:.1,this._immutableMinTtl=n!==void 0?n:24*3600*1e3,this._status=\"status\"in r?r.status:200,this._resHeaders=r.headers,this._rescc=fH(r.headers[\"cache-control\"]),this._method=\"method\"in e?e.method:\"GET\",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=r.headers.vary?e.headers:null,this._reqcc=fH(e.headers[\"cache-control\"]),c&&\"pre-check\"in this._rescc&&\"post-check\"in this._rescc&&(delete this._rescc[\"pre-check\"],delete this._rescc[\"post-check\"],delete this._rescc[\"no-cache\"],delete this._rescc[\"no-store\"],delete this._rescc[\"must-revalidate\"],this._resHeaders=Object.assign({},this._resHeaders,{\"cache-control\":ftt(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),r.headers[\"cache-control\"]==null&&/no-cache/.test(r.headers.pragma)&&(this._rescc[\"no-cache\"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc[\"no-store\"]&&(this._method===\"GET\"||this._method===\"HEAD\"||this._method===\"POST\"&&this._hasExplicitExpiration())&&ott.has(this._status)&&!this._rescc[\"no-store\"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc[\"max-age\"]||this._isShared&&this._rescc[\"s-maxage\"]||this._rescc.public||stt.has(this._status)))}_hasExplicitExpiration(){return this._isShared&&this._rescc[\"s-maxage\"]||this._rescc[\"max-age\"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error(\"Request headers missing\")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=fH(e.headers[\"cache-control\"]);return r[\"no-cache\"]||/no-cache/.test(e.headers.pragma)||r[\"max-age\"]&&this.age()>r[\"max-age\"]||r[\"min-fresh\"]&&this.timeToLive()<1e3*r[\"min-fresh\"]||this.stale()&&!(r[\"max-stale\"]&&!this._rescc[\"must-revalidate\"]&&(r[\"max-stale\"]===!0||r[\"max-stale\"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method===\"HEAD\")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc[\"must-revalidate\"]||this._rescc.public||this._rescc[\"s-maxage\"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary===\"*\")return!1;let r=this._resHeaders.vary.trim().toLowerCase().split(/\\s*,\\s*/);for(let s of r)if(e.headers[s]!==this._reqHeaders[s])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let s in e)ltt[s]||(r[s]=e[s]);if(e.connection){let s=e.connection.trim().split(/\\s*,\\s*/);for(let a of s)delete r[a]}if(r.warning){let s=r.warning.split(/,/).filter(a=>!/^\\s*1[0-9][0-9]/.test(a));s.length?r.warning=s.join(\",\").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:\"\")+'113 - \"rfc7234 5.5.4\"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this._responseTime}age(){let e=this._ageValue(),r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){return nm(this._resHeaders.age)}maxAge(){if(!this.storable()||this._rescc[\"no-cache\"]||this._isShared&&this._resHeaders[\"set-cookie\"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary===\"*\")return 0;if(this._isShared){if(this._rescc[\"proxy-revalidate\"])return 0;if(this._rescc[\"s-maxage\"])return nm(this._rescc[\"s-maxage\"])}if(this._rescc[\"max-age\"])return nm(this._rescc[\"max-age\"]);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this.date();if(this._resHeaders.expires){let s=Date.parse(this._resHeaders.expires);return Number.isNaN(s)||s<r?0:Math.max(e,(s-r)/1e3)}if(this._resHeaders[\"last-modified\"]){let s=Date.parse(this._resHeaders[\"last-modified\"]);if(isFinite(s)&&r>s)return Math.max(e,(r-s)/1e3*this._cacheHeuristic)}return e}timeToLive(){let e=this.maxAge()-this.age(),r=e+nm(this._rescc[\"stale-if-error\"]),s=e+nm(this._rescc[\"stale-while-revalidate\"]);return Math.max(0,e,r,s)*1e3}stale(){return this.maxAge()<=this.age()}_useStaleIfError(){return this.maxAge()+nm(this._rescc[\"stale-if-error\"])>this.age()}useStaleWhileRevalidate(){return this.maxAge()+nm(this._rescc[\"stale-while-revalidate\"])>this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error(\"Reinitialized\");if(!e||e.v!==1)throw Error(\"Invalid serialization\");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r[\"if-range\"],!this._requestMatches(e,!0)||!this.storable())return delete r[\"if-none-match\"],delete r[\"if-modified-since\"],r;if(this._resHeaders.etag&&(r[\"if-none-match\"]=r[\"if-none-match\"]?`${r[\"if-none-match\"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r[\"accept-ranges\"]||r[\"if-match\"]||r[\"if-unmodified-since\"]||this._method&&this._method!=\"GET\"){if(delete r[\"if-modified-since\"],r[\"if-none-match\"]){let a=r[\"if-none-match\"].split(/,/).filter(n=>!/^\\s*W\\//.test(n));a.length?r[\"if-none-match\"]=a.join(\",\").trim():delete r[\"if-none-match\"]}}else this._resHeaders[\"last-modified\"]&&!r[\"if-modified-since\"]&&(r[\"if-modified-since\"]=this._resHeaders[\"last-modified\"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),this._useStaleIfError()&&utt(r))return{modified:!1,matches:!1,policy:this};if(!r||!r.headers)throw Error(\"Response headers missing\");let s=!1;if(r.status!==void 0&&r.status!=304?s=!1:r.headers.etag&&!/^\\s*W\\//.test(r.headers.etag)?s=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\\s*W\\//,\"\")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?s=this._resHeaders.etag.replace(/^\\s*W\\//,\"\")===r.headers.etag.replace(/^\\s*W\\//,\"\"):this._resHeaders[\"last-modified\"]?s=this._resHeaders[\"last-modified\"]===r.headers[\"last-modified\"]:!this._resHeaders.etag&&!this._resHeaders[\"last-modified\"]&&!r.headers.etag&&!r.headers[\"last-modified\"]&&(s=!0),!s)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let a={};for(let c in this._resHeaders)a[c]=c in r.headers&&!ctt[c]?r.headers[c]:this._resHeaders[c];let n=Object.assign({},r,{status:this._status,method:this._method,headers:a});return{policy:new this.constructor(e,n,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl}),modified:!1,matches:!0}}}});var YQ=_((TMt,sfe)=>{\"use strict\";sfe.exports=t=>{let e={};for(let[r,s]of Object.entries(t))e[r.toLowerCase()]=s;return e}});var afe=_((RMt,ofe)=>{\"use strict\";var Att=Ie(\"stream\").Readable,ptt=YQ(),AH=class extends Att{constructor(e,r,s,a){if(typeof e!=\"number\")throw new TypeError(\"Argument `statusCode` should be a number\");if(typeof r!=\"object\")throw new TypeError(\"Argument `headers` should be an object\");if(!(s instanceof Buffer))throw new TypeError(\"Argument `body` should be a buffer\");if(typeof a!=\"string\")throw new TypeError(\"Argument `url` should be a string\");super(),this.statusCode=e,this.headers=ptt(r),this.body=s,this.url=a}_read(){this.push(this.body),this.push(null)}};ofe.exports=AH});var cfe=_((FMt,lfe)=>{\"use strict\";var htt=[\"destroy\",\"setTimeout\",\"socket\",\"headers\",\"trailers\",\"rawHeaders\",\"statusCode\",\"httpVersion\",\"httpVersionMinor\",\"httpVersionMajor\",\"rawTrailers\",\"statusMessage\"];lfe.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(htt));for(let s of r)s in e||(e[s]=typeof t[s]==\"function\"?t[s].bind(t):t[s])}});var ffe=_((NMt,ufe)=>{\"use strict\";var gtt=Ie(\"stream\").PassThrough,dtt=cfe(),mtt=t=>{if(!(t&&t.pipe))throw new TypeError(\"Parameter `response` must be a response stream.\");let e=new gtt;return dtt(t,e),t.pipe(e)};ufe.exports=mtt});var Afe=_(pH=>{pH.stringify=function t(e){if(typeof e>\"u\")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(\":base64:\"+e.toString(\"base64\"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e==\"object\"){var r=\"\",s=Array.isArray(e);r=s?\"[\":\"{\";var a=!0;for(var n in e){var c=typeof e[n]==\"function\"||!s&&typeof e[n]>\"u\";Object.hasOwnProperty.call(e,n)&&!c&&(a||(r+=\",\"),a=!1,s?e[n]==null?r+=\"null\":r+=t(e[n]):e[n]!==void 0&&(r+=t(n)+\":\"+t(e[n])))}return r+=s?\"]\":\"}\",r}else return typeof e==\"string\"?JSON.stringify(/^:/.test(e)?\":\"+e:e):typeof e>\"u\"?\"null\":JSON.stringify(e)};pH.parse=function(t){return JSON.parse(t,function(e,r){return typeof r==\"string\"?/^:base64:/.test(r)?Buffer.from(r.substring(8),\"base64\"):/^:/.test(r)?r.substring(1):r:r})}});var dfe=_((LMt,gfe)=>{\"use strict\";var ytt=Ie(\"events\"),pfe=Afe(),Ett=t=>{let e={redis:\"@keyv/redis\",rediss:\"@keyv/redis\",mongodb:\"@keyv/mongo\",mongo:\"@keyv/mongo\",sqlite:\"@keyv/sqlite\",postgresql:\"@keyv/postgres\",postgres:\"@keyv/postgres\",mysql:\"@keyv/mysql\",etcd:\"@keyv/etcd\",offline:\"@keyv/offline\",tiered:\"@keyv/tiered\"};if(t.adapter||t.uri){let r=t.adapter||/^[^:+]*/.exec(t.uri)[0];return new(Ie(e[r]))(t)}return new Map},hfe=[\"sqlite\",\"postgres\",\"mysql\",\"mongo\",\"redis\",\"tiered\"],hH=class extends ytt{constructor(e,{emitErrors:r=!0,...s}={}){if(super(),this.opts={namespace:\"keyv\",serialize:pfe.stringify,deserialize:pfe.parse,...typeof e==\"string\"?{uri:e}:e,...s},!this.opts.store){let n={...this.opts};this.opts.store=Ett(n)}if(this.opts.compression){let n=this.opts.compression;this.opts.serialize=n.serialize.bind(n),this.opts.deserialize=n.deserialize.bind(n)}typeof this.opts.store.on==\"function\"&&r&&this.opts.store.on(\"error\",n=>this.emit(\"error\",n)),this.opts.store.namespace=this.opts.namespace;let a=n=>async function*(){for await(let[c,f]of typeof n==\"function\"?n(this.opts.store.namespace):n){let p=await this.opts.deserialize(f);if(!(this.opts.store.namespace&&!c.includes(this.opts.store.namespace))){if(typeof p.expires==\"number\"&&Date.now()>p.expires){this.delete(c);continue}yield[this._getKeyUnprefix(c),p.value]}}};typeof this.opts.store[Symbol.iterator]==\"function\"&&this.opts.store instanceof Map?this.iterator=a(this.opts.store):typeof this.opts.store.iterator==\"function\"&&this.opts.store.opts&&this._checkIterableAdaptar()&&(this.iterator=a(this.opts.store.iterator.bind(this.opts.store)))}_checkIterableAdaptar(){return hfe.includes(this.opts.store.opts.dialect)||hfe.findIndex(e=>this.opts.store.opts.url.includes(e))>=0}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}_getKeyPrefixArray(e){return e.map(r=>`${this.opts.namespace}:${r}`)}_getKeyUnprefix(e){return e.split(\":\").splice(1).join(\":\")}get(e,r){let{store:s}=this.opts,a=Array.isArray(e),n=a?this._getKeyPrefixArray(e):this._getKeyPrefix(e);if(a&&s.getMany===void 0){let c=[];for(let f of n)c.push(Promise.resolve().then(()=>s.get(f)).then(p=>typeof p==\"string\"?this.opts.deserialize(p):this.opts.compression?this.opts.deserialize(p):p).then(p=>{if(p!=null)return typeof p.expires==\"number\"&&Date.now()>p.expires?this.delete(f).then(()=>{}):r&&r.raw?p:p.value}));return Promise.allSettled(c).then(f=>{let p=[];for(let h of f)p.push(h.value);return p})}return Promise.resolve().then(()=>a?s.getMany(n):s.get(n)).then(c=>typeof c==\"string\"?this.opts.deserialize(c):this.opts.compression?this.opts.deserialize(c):c).then(c=>{if(c!=null)return a?c.map((f,p)=>{if(typeof f==\"string\"&&(f=this.opts.deserialize(f)),f!=null){if(typeof f.expires==\"number\"&&Date.now()>f.expires){this.delete(e[p]).then(()=>{});return}return r&&r.raw?f:f.value}}):typeof c.expires==\"number\"&&Date.now()>c.expires?this.delete(e).then(()=>{}):r&&r.raw?c:c.value})}set(e,r,s){let a=this._getKeyPrefix(e);typeof s>\"u\"&&(s=this.opts.ttl),s===0&&(s=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let c=typeof s==\"number\"?Date.now()+s:null;return typeof r==\"symbol\"&&this.emit(\"error\",\"symbol cannot be serialized\"),r={value:r,expires:c},this.opts.serialize(r)}).then(c=>n.set(a,c,s)).then(()=>!0)}delete(e){let{store:r}=this.opts;if(Array.isArray(e)){let a=this._getKeyPrefixArray(e);if(r.deleteMany===void 0){let n=[];for(let c of a)n.push(r.delete(c));return Promise.allSettled(n).then(c=>c.every(f=>f.value===!0))}return Promise.resolve().then(()=>r.deleteMany(a))}let s=this._getKeyPrefix(e);return Promise.resolve().then(()=>r.delete(s))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}has(e){let r=this._getKeyPrefix(e),{store:s}=this.opts;return Promise.resolve().then(async()=>typeof s.has==\"function\"?s.has(r):await s.get(r)!==void 0)}disconnect(){let{store:e}=this.opts;if(typeof e.disconnect==\"function\")return e.disconnect()}};gfe.exports=hH});var Efe=_((UMt,yfe)=>{\"use strict\";var Itt=Ie(\"events\"),VQ=Ie(\"url\"),Ctt=Gue(),wtt=rfe(),gH=ife(),mfe=afe(),Btt=YQ(),vtt=ffe(),Stt=dfe(),KB=class t{constructor(e,r){if(typeof e!=\"function\")throw new TypeError(\"Parameter `request` must be a function\");return this.cache=new Stt({uri:typeof r==\"string\"&&r,store:typeof r!=\"string\"&&r,namespace:\"cacheable-request\"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,s)=>{let a;if(typeof r==\"string\")a=dH(VQ.parse(r)),r={};else if(r instanceof VQ.URL)a=dH(VQ.parse(r.toString())),r={};else{let[C,...S]=(r.path||\"\").split(\"?\"),P=S.length>0?`?${S.join(\"?\")}`:\"\";a=dH({...r,pathname:C,search:P})}r={headers:{},method:\"GET\",cache:!0,strictTtl:!1,automaticFailover:!1,...r,...Dtt(a)},r.headers=Btt(r.headers);let n=new Itt,c=Ctt(VQ.format(a),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),f=`${r.method}:${c}`,p=!1,h=!1,E=C=>{h=!0;let S=!1,P,I=new Promise(N=>{P=()=>{S||(S=!0,N())}}),R=N=>{if(p&&!C.forceRefresh){N.status=N.statusCode;let W=gH.fromObject(p.cachePolicy).revalidatedPolicy(C,N);if(!W.modified){let ee=W.policy.responseHeaders();N=new mfe(p.statusCode,ee,p.body,p.url),N.cachePolicy=W.policy,N.fromCache=!0}}N.fromCache||(N.cachePolicy=new gH(C,N,C),N.fromCache=!1);let U;C.cache&&N.cachePolicy.storable()?(U=vtt(N),(async()=>{try{let W=wtt.buffer(N);if(await Promise.race([I,new Promise(le=>N.once(\"end\",le))]),S)return;let ee=await W,ie={cachePolicy:N.cachePolicy.toObject(),url:N.url,statusCode:N.fromCache?p.statusCode:N.statusCode,body:ee},ue=C.strictTtl?N.cachePolicy.timeToLive():void 0;C.maxTtl&&(ue=ue?Math.min(ue,C.maxTtl):C.maxTtl),await this.cache.set(f,ie,ue)}catch(W){n.emit(\"error\",new t.CacheError(W))}})()):C.cache&&p&&(async()=>{try{await this.cache.delete(f)}catch(W){n.emit(\"error\",new t.CacheError(W))}})(),n.emit(\"response\",U||N),typeof s==\"function\"&&s(U||N)};try{let N=e(C,R);N.once(\"error\",P),N.once(\"abort\",P),n.emit(\"request\",N)}catch(N){n.emit(\"error\",new t.RequestError(N))}};return(async()=>{let C=async P=>{await Promise.resolve();let I=P.cache?await this.cache.get(f):void 0;if(typeof I>\"u\")return E(P);let R=gH.fromObject(I.cachePolicy);if(R.satisfiesWithoutRevalidation(P)&&!P.forceRefresh){let N=R.responseHeaders(),U=new mfe(I.statusCode,N,I.body,I.url);U.cachePolicy=R,U.fromCache=!0,n.emit(\"response\",U),typeof s==\"function\"&&s(U)}else p=I,P.headers=R.revalidationHeaders(P),E(P)},S=P=>n.emit(\"error\",new t.CacheError(P));this.cache.once(\"error\",S),n.on(\"response\",()=>this.cache.removeListener(\"error\",S));try{await C(r)}catch(P){r.automaticFailover&&!h&&E(r),n.emit(\"error\",new t.CacheError(P))}})(),n}}};function Dtt(t){let e={...t};return e.path=`${t.pathname||\"/\"}${t.search||\"\"}`,delete e.pathname,delete e.search,e}function dH(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||\"localhost\",port:t.port,pathname:t.pathname,search:t.search}}KB.RequestError=class extends Error{constructor(t){super(t.message),this.name=\"RequestError\",Object.assign(this,t)}};KB.CacheError=class extends Error{constructor(t){super(t.message),this.name=\"CacheError\",Object.assign(this,t)}};yfe.exports=KB});var Cfe=_((jMt,Ife)=>{\"use strict\";var btt=[\"aborted\",\"complete\",\"headers\",\"httpVersion\",\"httpVersionMinor\",\"httpVersionMajor\",\"method\",\"rawHeaders\",\"rawTrailers\",\"setTimeout\",\"socket\",\"statusCode\",\"statusMessage\",\"trailers\",\"url\"];Ife.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error(\"The second stream must have the `autoDestroy` option set to `false`\");let r=new Set(Object.keys(t).concat(btt)),s={};for(let a of r)a in e||(s[a]={get(){let n=t[a];return typeof n==\"function\"?n.bind(t):n},set(n){t[a]=n},enumerable:!0,configurable:!1});return Object.defineProperties(e,s),t.once(\"aborted\",()=>{e.destroy(),e.emit(\"aborted\")}),t.once(\"close\",()=>{t.complete&&e.readable?e.once(\"end\",()=>{e.emit(\"close\")}):e.emit(\"close\")}),e}});var Bfe=_((GMt,wfe)=>{\"use strict\";var{Transform:Ptt,PassThrough:xtt}=Ie(\"stream\"),mH=Ie(\"zlib\"),ktt=Cfe();wfe.exports=t=>{let e=(t.headers[\"content-encoding\"]||\"\").toLowerCase();if(![\"gzip\",\"deflate\",\"br\"].includes(e))return t;let r=e===\"br\";if(r&&typeof mH.createBrotliDecompress!=\"function\")return t.destroy(new Error(\"Brotli is not supported on Node.js < 12\")),t;let s=!0,a=new Ptt({transform(f,p,h){s=!1,h(null,f)},flush(f){f()}}),n=new xtt({autoDestroy:!1,destroy(f,p){t.destroy(),p(f)}}),c=r?mH.createBrotliDecompress():mH.createUnzip();return c.once(\"error\",f=>{if(s&&!t.readable){n.end();return}n.destroy(f)}),ktt(t,n),t.pipe(a).pipe(c).pipe(n),n}});var EH=_((qMt,vfe)=>{\"use strict\";var yH=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError(\"`maxSize` must be a number greater than 0\");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction==\"function\")for(let[s,a]of this.oldCache.entries())this.onEviction(s,a);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};vfe.exports=yH});var CH=_((WMt,Pfe)=>{\"use strict\";var Qtt=Ie(\"events\"),Ttt=Ie(\"tls\"),Rtt=Ie(\"http2\"),Ftt=EH(),Pa=Symbol(\"currentStreamsCount\"),Sfe=Symbol(\"request\"),Rc=Symbol(\"cachedOriginSet\"),gI=Symbol(\"gracefullyClosing\"),Ntt=[\"maxDeflateDynamicTableSize\",\"maxSessionMemory\",\"maxHeaderListPairs\",\"maxOutstandingPings\",\"maxReservedRemoteStreams\",\"maxSendHeaderBlockLength\",\"paddingStrategy\",\"localAddress\",\"path\",\"rejectUnauthorized\",\"minDHSize\",\"ca\",\"cert\",\"clientCertEngine\",\"ciphers\",\"key\",\"pfx\",\"servername\",\"minVersion\",\"maxVersion\",\"secureProtocol\",\"crl\",\"honorCipherOrder\",\"ecdhCurve\",\"dhparam\",\"secureOptions\",\"sessionIdContext\"],Ott=(t,e,r)=>{let s=0,a=t.length;for(;s<a;){let n=s+a>>>1;r(t[n],e)?s=n+1:a=n}return s},Ltt=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,IH=(t,e)=>{for(let r of t)r[Rc].length<e[Rc].length&&r[Rc].every(s=>e[Rc].includes(s))&&r[Pa]+e[Pa]<=e.remoteSettings.maxConcurrentStreams&&bfe(r)},Mtt=(t,e)=>{for(let r of t)e[Rc].length<r[Rc].length&&e[Rc].every(s=>r[Rc].includes(s))&&e[Pa]+r[Pa]<=r.remoteSettings.maxConcurrentStreams&&bfe(e)},Dfe=({agent:t,isFree:e})=>{let r={};for(let s in t.sessions){let n=t.sessions[s].filter(c=>{let f=c[im.kCurrentStreamsCount]<c.remoteSettings.maxConcurrentStreams;return e?f:!f});n.length!==0&&(r[s]=n)}return r},bfe=t=>{t[gI]=!0,t[Pa]===0&&t.close()},im=class t extends Qtt{constructor({timeout:e=6e4,maxSessions:r=1/0,maxFreeSessions:s=10,maxCachedTlsSessions:a=100}={}){super(),this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=s,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new Ftt({maxSize:a})}static normalizeOrigin(e,r){return typeof e==\"string\"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r=\"\";if(e)for(let s of Ntt)e[s]&&(r+=`:${e[s]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let s=this.queue[e][r];this._sessionsCount<this.maxSessions&&!s.completed&&(s.completed=!0,s())}getSession(e,r,s){return new Promise((a,n)=>{Array.isArray(s)?(s=[...s],a()):s=[{resolve:a,reject:n}];let c=this.normalizeOptions(r),f=t.normalizeOrigin(e,r&&r.servername);if(f===void 0){for(let{reject:E}of s)E(new TypeError(\"The `origin` argument needs to be a string or an URL object\"));return}if(c in this.sessions){let E=this.sessions[c],C=-1,S=-1,P;for(let I of E){let R=I.remoteSettings.maxConcurrentStreams;if(R<C)break;if(I[Rc].includes(f)){let N=I[Pa];if(N>=R||I[gI]||I.destroyed)continue;P||(C=R),N>S&&(P=I,S=N)}}if(P){if(s.length!==1){for(let{reject:I}of s){let R=new Error(`Expected the length of listeners to be 1, got ${s.length}.\nPlease report this to https://github.com/szmarczak/http2-wrapper/`);I(R)}return}s[0].resolve(P);return}}if(c in this.queue){if(f in this.queue[c]){this.queue[c][f].listeners.push(...s),this._tryToCreateNewSession(c,f);return}}else this.queue[c]={};let p=()=>{c in this.queue&&this.queue[c][f]===h&&(delete this.queue[c][f],Object.keys(this.queue[c]).length===0&&delete this.queue[c])},h=()=>{let E=`${f}:${c}`,C=!1;try{let S=Rtt.connect(e,{createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(E),...r});S[Pa]=0,S[gI]=!1;let P=()=>S[Pa]<S.remoteSettings.maxConcurrentStreams,I=!0;S.socket.once(\"session\",N=>{this.tlsSessionCache.set(E,N)}),S.once(\"error\",N=>{for(let{reject:U}of s)U(N);this.tlsSessionCache.delete(E)}),S.setTimeout(this.timeout,()=>{S.destroy()}),S.once(\"close\",()=>{if(C){I&&this._freeSessionsCount--,this._sessionsCount--;let N=this.sessions[c];N.splice(N.indexOf(S),1),N.length===0&&delete this.sessions[c]}else{let N=new Error(\"Session closed without receiving a SETTINGS frame\");N.code=\"HTTP2WRAPPER_NOSETTINGS\";for(let{reject:U}of s)U(N);p()}this._tryToCreateNewSession(c,f)});let R=()=>{if(!(!(c in this.queue)||!P())){for(let N of S[Rc])if(N in this.queue[c]){let{listeners:U}=this.queue[c][N];for(;U.length!==0&&P();)U.shift().resolve(S);let W=this.queue[c];if(W[N].listeners.length===0&&(delete W[N],Object.keys(W).length===0)){delete this.queue[c];break}if(!P())break}}};S.on(\"origin\",()=>{S[Rc]=S.originSet,P()&&(R(),IH(this.sessions[c],S))}),S.once(\"remoteSettings\",()=>{if(S.ref(),S.unref(),this._sessionsCount++,h.destroyed){let N=new Error(\"Agent has been destroyed\");for(let U of s)U.reject(N);S.destroy();return}S[Rc]=S.originSet;{let N=this.sessions;if(c in N){let U=N[c];U.splice(Ott(U,S,Ltt),0,S)}else N[c]=[S]}this._freeSessionsCount+=1,C=!0,this.emit(\"session\",S),R(),p(),S[Pa]===0&&this._freeSessionsCount>this.maxFreeSessions&&S.close(),s.length!==0&&(this.getSession(f,r,s),s.length=0),S.on(\"remoteSettings\",()=>{R(),IH(this.sessions[c],S)})}),S[Sfe]=S.request,S.request=(N,U)=>{if(S[gI])throw new Error(\"The session is gracefully closing. No new streams are allowed.\");let W=S[Sfe](N,U);return S.ref(),++S[Pa],S[Pa]===S.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,W.once(\"close\",()=>{if(I=P(),--S[Pa],!S.destroyed&&!S.closed&&(Mtt(this.sessions[c],S),P()&&!S.closed)){I||(this._freeSessionsCount++,I=!0);let ee=S[Pa]===0;ee&&S.unref(),ee&&(this._freeSessionsCount>this.maxFreeSessions||S[gI])?S.close():(IH(this.sessions[c],S),R())}}),W}}catch(S){for(let P of s)P.reject(S);p()}};h.listeners=s,h.completed=!1,h.destroyed=!1,this.queue[c][f]=h,this._tryToCreateNewSession(c,f)})}request(e,r,s,a){return new Promise((n,c)=>{this.getSession(e,r,[{reject:c,resolve:f=>{try{n(f.request(s,a))}catch(p){c(p)}}}])})}createConnection(e,r){return t.connect(e,r)}static connect(e,r){r.ALPNProtocols=[\"h2\"];let s=e.port||443,a=e.hostname||e.host;return typeof r.servername>\"u\"&&(r.servername=a),Ttt.connect(s,a,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[Pa]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let s of r)s.destroy(e);for(let r of Object.values(this.queue))for(let s of Object.values(r))s.destroyed=!0;this.queue={}}get freeSessions(){return Dfe({agent:this,isFree:!0})}get busySessions(){return Dfe({agent:this,isFree:!1})}};im.kCurrentStreamsCount=Pa;im.kGracefullyClosing=gI;Pfe.exports={Agent:im,globalAgent:new im}});var BH=_((YMt,xfe)=>{\"use strict\";var{Readable:Utt}=Ie(\"stream\"),wH=class extends Utt{constructor(e,r){super({highWaterMark:r,autoDestroy:!1}),this.statusCode=null,this.statusMessage=\"\",this.httpVersion=\"2.0\",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners(\"data\"),this.resume())}_read(){this.req&&this.req._request.resume()}};xfe.exports=wH});var vH=_((VMt,kfe)=>{\"use strict\";kfe.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname==\"string\"&&t.hostname.startsWith(\"[\")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||\"\"}${t.search||\"\"}`};return typeof t.port==\"string\"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||\"\"}:${t.password||\"\"}`),e}});var Tfe=_((JMt,Qfe)=>{\"use strict\";Qfe.exports=(t,e,r)=>{for(let s of r)t.on(s,(...a)=>e.emit(s,...a))}});var Ffe=_((KMt,Rfe)=>{\"use strict\";Rfe.exports=t=>{switch(t){case\":method\":case\":scheme\":case\":authority\":case\":path\":return!0;default:return!1}}});var Ofe=_((XMt,Nfe)=>{\"use strict\";var dI=(t,e,r)=>{Nfe.exports[e]=class extends t{constructor(...a){super(typeof r==\"string\"?r:r(a)),this.name=`${super.name} [${e}]`,this.code=e}}};dI(TypeError,\"ERR_INVALID_ARG_TYPE\",t=>{let e=t[0].includes(\".\")?\"property\":\"argument\",r=t[1],s=Array.isArray(r);return s&&(r=`${r.slice(0,-1).join(\", \")} or ${r.slice(-1)}`),`The \"${t[0]}\" ${e} must be ${s?\"one of\":\"of\"} type ${r}. Received ${typeof t[2]}`});dI(TypeError,\"ERR_INVALID_PROTOCOL\",t=>`Protocol \"${t[0]}\" not supported. Expected \"${t[1]}\"`);dI(Error,\"ERR_HTTP_HEADERS_SENT\",t=>`Cannot ${t[0]} headers after they are sent to the client`);dI(TypeError,\"ERR_INVALID_HTTP_TOKEN\",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);dI(TypeError,\"ERR_HTTP_INVALID_HEADER_VALUE\",t=>`Invalid value \"${t[0]} for header \"${t[1]}\"`);dI(TypeError,\"ERR_INVALID_CHAR\",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var xH=_((ZMt,Gfe)=>{\"use strict\";var _tt=Ie(\"http2\"),{Writable:Htt}=Ie(\"stream\"),{Agent:Lfe,globalAgent:jtt}=CH(),Gtt=BH(),qtt=vH(),Wtt=Tfe(),Ytt=Ffe(),{ERR_INVALID_ARG_TYPE:SH,ERR_INVALID_PROTOCOL:Vtt,ERR_HTTP_HEADERS_SENT:Mfe,ERR_INVALID_HTTP_TOKEN:Jtt,ERR_HTTP_INVALID_HEADER_VALUE:Ktt,ERR_INVALID_CHAR:ztt}=Ofe(),{HTTP2_HEADER_STATUS:Ufe,HTTP2_HEADER_METHOD:_fe,HTTP2_HEADER_PATH:Hfe,HTTP2_METHOD_CONNECT:Xtt}=_tt.constants,Jo=Symbol(\"headers\"),DH=Symbol(\"origin\"),bH=Symbol(\"session\"),jfe=Symbol(\"options\"),JQ=Symbol(\"flushedHeaders\"),zB=Symbol(\"jobs\"),Ztt=/^[\\^`\\-\\w!#$%&*+.|~]+$/,$tt=/[^\\t\\u0020-\\u007E\\u0080-\\u00FF]/,PH=class extends Htt{constructor(e,r,s){super({autoDestroy:!1});let a=typeof e==\"string\"||e instanceof URL;if(a&&(e=qtt(e instanceof URL?e:new URL(e))),typeof r==\"function\"||r===void 0?(s=r,r=a?e:{...e}):r={...e,...r},r.h2session)this[bH]=r.h2session;else if(r.agent===!1)this.agent=new Lfe({maxFreeSessions:0});else if(typeof r.agent>\"u\"||r.agent===null)typeof r.createConnection==\"function\"?(this.agent=new Lfe({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=jtt;else if(typeof r.agent.request==\"function\")this.agent=r.agent;else throw new SH(\"options.agent\",[\"Agent-like Object\",\"undefined\",\"false\"],r.agent);if(r.protocol&&r.protocol!==\"https:\")throw new Vtt(r.protocol,\"https:\");let n=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,c=r.hostname||r.host||\"localhost\";delete r.hostname,delete r.host,delete r.port;let{timeout:f}=r;if(r.timeout=void 0,this[Jo]=Object.create(null),this[zB]=[],this.socket=null,this.connection=null,this.method=r.method||\"GET\",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[p,h]of Object.entries(r.headers))this.setHeader(p,h);r.auth&&!(\"authorization\"in this[Jo])&&(this[Jo].authorization=\"Basic \"+Buffer.from(r.auth).toString(\"base64\")),r.session=r.tlsSession,r.path=r.socketPath,this[jfe]=r,n===443?(this[DH]=`https://${c}`,\":authority\"in this[Jo]||(this[Jo][\":authority\"]=c)):(this[DH]=`https://${c}:${n}`,\":authority\"in this[Jo]||(this[Jo][\":authority\"]=`${c}:${n}`)),f&&this.setTimeout(f),s&&this.once(\"response\",s),this[JQ]=!1}get method(){return this[Jo][_fe]}set method(e){e&&(this[Jo][_fe]=e.toUpperCase())}get path(){return this[Jo][Hfe]}set path(e){e&&(this[Jo][Hfe]=e)}get _mustNotHaveABody(){return this.method===\"GET\"||this.method===\"HEAD\"||this.method===\"DELETE\"}_write(e,r,s){if(this._mustNotHaveABody){s(new Error(\"The GET, HEAD and DELETE methods must NOT have a body\"));return}this.flushHeaders();let a=()=>this._request.write(e,r,s);this._request?a():this[zB].push(a)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[zB].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit(\"abort\")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[JQ]||this.destroyed)return;this[JQ]=!0;let e=this.method===Xtt,r=s=>{if(this._request=s,this.destroyed){s.destroy();return}e||Wtt(s,this,[\"timeout\",\"continue\",\"close\",\"error\"]);let a=c=>(...f)=>{!this.writable&&!this.destroyed?c(...f):this.once(\"finish\",()=>{c(...f)})};s.once(\"response\",a((c,f,p)=>{let h=new Gtt(this.socket,s.readableHighWaterMark);this.res=h,h.req=this,h.statusCode=c[Ufe],h.headers=c,h.rawHeaders=p,h.once(\"end\",()=>{this.aborted?(h.aborted=!0,h.emit(\"aborted\")):(h.complete=!0,h.socket=null,h.connection=null)}),e?(h.upgrade=!0,this.emit(\"connect\",h,s,Buffer.alloc(0))?this.emit(\"close\"):s.destroy()):(s.on(\"data\",E=>{!h._dumped&&!h.push(E)&&s.pause()}),s.once(\"end\",()=>{h.push(null)}),this.emit(\"response\",h)||h._dump())})),s.once(\"headers\",a(c=>this.emit(\"information\",{statusCode:c[Ufe]}))),s.once(\"trailers\",a((c,f,p)=>{let{res:h}=this;h.trailers=c,h.rawTrailers=p}));let{socket:n}=s.session;this.socket=n,this.connection=n;for(let c of this[zB])c();this.emit(\"socket\",this.socket)};if(this[bH])try{r(this[bH].request(this[Jo]))}catch(s){this.emit(\"error\",s)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[DH],this[jfe],this[Jo]))}catch(s){this.emit(\"error\",s)}}}getHeader(e){if(typeof e!=\"string\")throw new SH(\"name\",\"string\",e);return this[Jo][e.toLowerCase()]}get headersSent(){return this[JQ]}removeHeader(e){if(typeof e!=\"string\")throw new SH(\"name\",\"string\",e);if(this.headersSent)throw new Mfe(\"remove\");delete this[Jo][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new Mfe(\"set\");if(typeof e!=\"string\"||!Ztt.test(e)&&!Ytt(e))throw new Jtt(\"Header name\",e);if(typeof r>\"u\")throw new Ktt(r,e);if($tt.test(r))throw new ztt(\"header content\",e);this[Jo][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let s=()=>this._request.setTimeout(e,r);return this._request?s():this[zB].push(s),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};Gfe.exports=PH});var Wfe=_(($Mt,qfe)=>{\"use strict\";var ert=Ie(\"tls\");qfe.exports=(t={},e=ert.connect)=>new Promise((r,s)=>{let a=!1,n,c=async()=>{await p,n.off(\"timeout\",f),n.off(\"error\",s),t.resolveSocket?(r({alpnProtocol:n.alpnProtocol,socket:n,timeout:a}),a&&(await Promise.resolve(),n.emit(\"timeout\"))):(n.destroy(),r({alpnProtocol:n.alpnProtocol,timeout:a}))},f=async()=>{a=!0,c()},p=(async()=>{try{n=await e(t,c),n.on(\"error\",s),n.once(\"timeout\",f)}catch(h){s(h)}})()})});var Vfe=_((eUt,Yfe)=>{\"use strict\";var trt=Ie(\"net\");Yfe.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith(\"[\")?r.indexOf(\"]\")===-1?e=r:e=r.slice(1,-1):e=r.split(\":\",1)[0]),trt.isIP(e)?\"\":e}});var zfe=_((tUt,QH)=>{\"use strict\";var Jfe=Ie(\"http\"),kH=Ie(\"https\"),rrt=Wfe(),nrt=EH(),irt=xH(),srt=Vfe(),ort=vH(),KQ=new nrt({maxSize:100}),XB=new Map,Kfe=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let s=()=>{t.emit(\"free\",e,r)};e.on(\"free\",s);let a=()=>{t.removeSocket(e,r)};e.on(\"close\",a);let n=()=>{t.removeSocket(e,r),e.off(\"close\",a),e.off(\"free\",s),e.off(\"agentRemove\",n)};e.on(\"agentRemove\",n),t.emit(\"free\",e,r)},art=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!KQ.has(e)){if(XB.has(e))return(await XB.get(e)).alpnProtocol;let{path:r,agent:s}=t;t.path=t.socketPath;let a=rrt(t);XB.set(e,a);try{let{socket:n,alpnProtocol:c}=await a;if(KQ.set(e,c),t.path=r,c===\"h2\")n.destroy();else{let{globalAgent:f}=kH,p=kH.Agent.prototype.createConnection;s?s.createConnection===p?Kfe(s,n,t):n.destroy():f.createConnection===p?Kfe(f,n,t):n.destroy()}return XB.delete(e),c}catch(n){throw XB.delete(e),n}}return KQ.get(e)};QH.exports=async(t,e,r)=>{if((typeof t==\"string\"||t instanceof URL)&&(t=ort(new URL(t))),typeof e==\"function\"&&(r=e,e=void 0),e={ALPNProtocols:[\"h2\",\"http/1.1\"],...t,...e,resolveSocket:!0},!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error(\"The `ALPNProtocols` option must be an Array with at least one entry\");e.protocol=e.protocol||\"https:\";let s=e.protocol===\"https:\";e.host=e.hostname||e.host||\"localhost\",e.session=e.tlsSession,e.servername=e.servername||srt(e),e.port=e.port||(s?443:80),e._defaultAgent=s?kH.globalAgent:Jfe.globalAgent;let a=e.agent;if(a){if(a.addRequest)throw new Error(\"The `options.agent` object can contain only `http`, `https` or `http2` properties\");e.agent=a[s?\"https\":\"http\"]}return s&&await art(e)===\"h2\"?(a&&(e.agent=a.http2),new irt(e,r)):Jfe.request(e,r)};QH.exports.protocolCache=KQ});var Zfe=_((rUt,Xfe)=>{\"use strict\";var lrt=Ie(\"http2\"),crt=CH(),TH=xH(),urt=BH(),frt=zfe(),Art=(t,e,r)=>new TH(t,e,r),prt=(t,e,r)=>{let s=new TH(t,e,r);return s.end(),s};Xfe.exports={...lrt,ClientRequest:TH,IncomingMessage:urt,...crt,request:Art,get:prt,auto:frt}});var FH=_(RH=>{\"use strict\";Object.defineProperty(RH,\"__esModule\",{value:!0});var $fe=Np();RH.default=t=>$fe.default.nodeStream(t)&&$fe.default.function_(t.getBoundary)});var nAe=_(NH=>{\"use strict\";Object.defineProperty(NH,\"__esModule\",{value:!0});var tAe=Ie(\"fs\"),rAe=Ie(\"util\"),eAe=Np(),hrt=FH(),grt=rAe.promisify(tAe.stat);NH.default=async(t,e)=>{if(e&&\"content-length\"in e)return Number(e[\"content-length\"]);if(!t)return 0;if(eAe.default.string(t))return Buffer.byteLength(t);if(eAe.default.buffer(t))return t.length;if(hrt.default(t))return rAe.promisify(t.getLength.bind(t))();if(t instanceof tAe.ReadStream){let{size:r}=await grt(t.path);return r===0?void 0:r}}});var LH=_(OH=>{\"use strict\";Object.defineProperty(OH,\"__esModule\",{value:!0});function drt(t,e,r){let s={};for(let a of r)s[a]=(...n)=>{e.emit(a,...n)},t.on(a,s[a]);return()=>{for(let a of r)t.off(a,s[a])}}OH.default=drt});var iAe=_(MH=>{\"use strict\";Object.defineProperty(MH,\"__esModule\",{value:!0});MH.default=()=>{let t=[];return{once(e,r,s){e.once(r,s),t.push({origin:e,event:r,fn:s})},unhandleAll(){for(let e of t){let{origin:r,event:s,fn:a}=e;r.removeListener(s,a)}t.length=0}}}});var oAe=_(ZB=>{\"use strict\";Object.defineProperty(ZB,\"__esModule\",{value:!0});ZB.TimeoutError=void 0;var mrt=Ie(\"net\"),yrt=iAe(),sAe=Symbol(\"reentry\"),Ert=()=>{},zQ=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`),this.event=r,this.name=\"TimeoutError\",this.code=\"ETIMEDOUT\"}};ZB.TimeoutError=zQ;ZB.default=(t,e,r)=>{if(sAe in t)return Ert;t[sAe]=!0;let s=[],{once:a,unhandleAll:n}=yrt.default(),c=(C,S,P)=>{var I;let R=setTimeout(S,C,C,P);(I=R.unref)===null||I===void 0||I.call(R);let N=()=>{clearTimeout(R)};return s.push(N),N},{host:f,hostname:p}=r,h=(C,S)=>{t.destroy(new zQ(C,S))},E=()=>{for(let C of s)C();n()};if(t.once(\"error\",C=>{if(E(),t.listenerCount(\"error\")===0)throw C}),t.once(\"close\",E),a(t,\"response\",C=>{a(C,\"end\",E)}),typeof e.request<\"u\"&&c(e.request,h,\"request\"),typeof e.socket<\"u\"){let C=()=>{h(e.socket,\"socket\")};t.setTimeout(e.socket,C),s.push(()=>{t.removeListener(\"timeout\",C)})}return a(t,\"socket\",C=>{var S;let{socketPath:P}=t;if(C.connecting){let I=!!(P??mrt.isIP((S=p??f)!==null&&S!==void 0?S:\"\")!==0);if(typeof e.lookup<\"u\"&&!I&&typeof C.address().address>\"u\"){let R=c(e.lookup,h,\"lookup\");a(C,\"lookup\",R)}if(typeof e.connect<\"u\"){let R=()=>c(e.connect,h,\"connect\");I?a(C,\"connect\",R()):a(C,\"lookup\",N=>{N===null&&a(C,\"connect\",R())})}typeof e.secureConnect<\"u\"&&r.protocol===\"https:\"&&a(C,\"connect\",()=>{let R=c(e.secureConnect,h,\"secureConnect\");a(C,\"secureConnect\",R)})}if(typeof e.send<\"u\"){let I=()=>c(e.send,h,\"send\");C.connecting?a(C,\"connect\",()=>{a(t,\"upload-complete\",I())}):a(t,\"upload-complete\",I())}}),typeof e.response<\"u\"&&a(t,\"upload-complete\",()=>{let C=c(e.response,h,\"response\");a(t,\"response\",C)}),E}});var lAe=_(UH=>{\"use strict\";Object.defineProperty(UH,\"__esModule\",{value:!0});var aAe=Np();UH.default=t=>{t=t;let e={protocol:t.protocol,hostname:aAe.default.string(t.hostname)&&t.hostname.startsWith(\"[\")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||\"\"}${t.search||\"\"}`};return aAe.default.string(t.port)&&t.port.length>0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||\"\"}:${t.password||\"\"}`),e}});var cAe=_(_H=>{\"use strict\";Object.defineProperty(_H,\"__esModule\",{value:!0});var Irt=Ie(\"url\"),Crt=[\"protocol\",\"host\",\"hostname\",\"port\",\"pathname\",\"search\"];_H.default=(t,e)=>{var r,s;if(e.path){if(e.pathname)throw new TypeError(\"Parameters `path` and `pathname` are mutually exclusive.\");if(e.search)throw new TypeError(\"Parameters `path` and `search` are mutually exclusive.\");if(e.searchParams)throw new TypeError(\"Parameters `path` and `searchParams` are mutually exclusive.\")}if(e.search&&e.searchParams)throw new TypeError(\"Parameters `search` and `searchParams` are mutually exclusive.\");if(!t){if(!e.protocol)throw new TypeError(\"No URL protocol specified\");t=`${e.protocol}//${(s=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&s!==void 0?s:\"\"}`}let a=new Irt.URL(t);if(e.path){let n=e.path.indexOf(\"?\");n===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,n),e.search=e.path.slice(n+1)),delete e.path}for(let n of Crt)e[n]&&(a[n]=e[n].toString());return a}});var uAe=_(jH=>{\"use strict\";Object.defineProperty(jH,\"__esModule\",{value:!0});var HH=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e==\"object\"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e==\"object\"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e==\"object\"?this.weakMap.has(e):this.map.has(e)}};jH.default=HH});var qH=_(GH=>{\"use strict\";Object.defineProperty(GH,\"__esModule\",{value:!0});var wrt=async t=>{let e=[],r=0;for await(let s of t)e.push(s),r+=Buffer.byteLength(s);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(\"\"))};GH.default=wrt});var AAe=_(sm=>{\"use strict\";Object.defineProperty(sm,\"__esModule\",{value:!0});sm.dnsLookupIpVersionToFamily=sm.isDnsLookupIpVersion=void 0;var fAe={auto:0,ipv4:4,ipv6:6};sm.isDnsLookupIpVersion=t=>t in fAe;sm.dnsLookupIpVersionToFamily=t=>{if(sm.isDnsLookupIpVersion(t))return fAe[t];throw new Error(\"Invalid DNS lookup IP version\")}});var WH=_(XQ=>{\"use strict\";Object.defineProperty(XQ,\"__esModule\",{value:!0});XQ.isResponseOk=void 0;XQ.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var hAe=_(YH=>{\"use strict\";Object.defineProperty(YH,\"__esModule\",{value:!0});var pAe=new Set;YH.default=t=>{pAe.has(t)||(pAe.add(t),process.emitWarning(`Got: ${t}`,{type:\"DeprecationWarning\"}))}});var gAe=_(VH=>{\"use strict\";Object.defineProperty(VH,\"__esModule\",{value:!0});var Si=Np(),Brt=(t,e)=>{if(Si.default.null_(t.encoding))throw new TypeError(\"To get a Buffer, set `options.responseType` to `buffer` instead\");Si.assert.any([Si.default.string,Si.default.undefined],t.encoding),Si.assert.any([Si.default.boolean,Si.default.undefined],t.resolveBodyOnly),Si.assert.any([Si.default.boolean,Si.default.undefined],t.methodRewriting),Si.assert.any([Si.default.boolean,Si.default.undefined],t.isStream),Si.assert.any([Si.default.string,Si.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType=\"text\");let{retry:r}=t;if(e?t.retry={...e.retry}:t.retry={calculateDelay:s=>s.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},Si.default.object(r)?(t.retry={...t.retry,...r},t.retry.methods=[...new Set(t.retry.methods.map(s=>s.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):Si.default.number(r)&&(t.retry.limit=r),Si.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(Si.default.number))),Si.default.object(t.pagination)){e&&(t.pagination={...e.pagination,...t.pagination});let{pagination:s}=t;if(!Si.default.function_(s.transform))throw new Error(\"`options.pagination.transform` must be implemented\");if(!Si.default.function_(s.shouldContinue))throw new Error(\"`options.pagination.shouldContinue` must be implemented\");if(!Si.default.function_(s.filter))throw new TypeError(\"`options.pagination.filter` must be implemented\");if(!Si.default.function_(s.paginate))throw new Error(\"`options.pagination.paginate` must be implemented\")}return t.responseType===\"json\"&&t.headers.accept===void 0&&(t.headers.accept=\"application/json\"),t};VH.default=Brt});var dAe=_($B=>{\"use strict\";Object.defineProperty($B,\"__esModule\",{value:!0});$B.retryAfterStatusCodes=void 0;$B.retryAfterStatusCodes=new Set([413,429,503]);var vrt=({attemptCount:t,retryOptions:e,error:r,retryAfter:s})=>{if(t>e.limit)return 0;let a=e.methods.includes(r.options.method),n=e.errorCodes.includes(r.code),c=r.response&&e.statusCodes.includes(r.response.statusCode);if(!a||!n&&!c)return 0;if(r.response){if(s)return e.maxRetryAfter===void 0||s>e.maxRetryAfter?0:s;if(r.response.statusCode===413)return 0}let f=Math.random()*100;return 2**(t-1)*1e3+f};$B.default=vrt});var rv=_(Ln=>{\"use strict\";Object.defineProperty(Ln,\"__esModule\",{value:!0});Ln.UnsupportedProtocolError=Ln.ReadError=Ln.TimeoutError=Ln.UploadError=Ln.CacheError=Ln.HTTPError=Ln.MaxRedirectsError=Ln.RequestError=Ln.setNonEnumerableProperties=Ln.knownHookEvents=Ln.withoutBody=Ln.kIsNormalizedAlready=void 0;var mAe=Ie(\"util\"),yAe=Ie(\"stream\"),Srt=Ie(\"fs\"),w0=Ie(\"url\"),EAe=Ie(\"http\"),JH=Ie(\"http\"),Drt=Ie(\"https\"),brt=Rue(),Prt=_ue(),IAe=Efe(),xrt=Bfe(),krt=Zfe(),Qrt=YQ(),at=Np(),Trt=nAe(),CAe=FH(),Rrt=LH(),wAe=oAe(),Frt=lAe(),BAe=cAe(),Nrt=uAe(),Ort=qH(),vAe=AAe(),Lrt=WH(),B0=hAe(),Mrt=gAe(),Urt=dAe(),KH,po=Symbol(\"request\"),eT=Symbol(\"response\"),mI=Symbol(\"responseSize\"),yI=Symbol(\"downloadedSize\"),EI=Symbol(\"bodySize\"),II=Symbol(\"uploadedSize\"),ZQ=Symbol(\"serverResponsesPiped\"),SAe=Symbol(\"unproxyEvents\"),DAe=Symbol(\"isFromCache\"),zH=Symbol(\"cancelTimeouts\"),bAe=Symbol(\"startedReading\"),CI=Symbol(\"stopReading\"),$Q=Symbol(\"triggerRead\"),v0=Symbol(\"body\"),ev=Symbol(\"jobs\"),PAe=Symbol(\"originalResponse\"),xAe=Symbol(\"retryTimeout\");Ln.kIsNormalizedAlready=Symbol(\"isNormalizedAlready\");var _rt=at.default.string(process.versions.brotli);Ln.withoutBody=new Set([\"GET\",\"HEAD\"]);Ln.knownHookEvents=[\"init\",\"beforeRequest\",\"beforeRedirect\",\"beforeError\",\"beforeRetry\",\"afterResponse\"];function Hrt(t){for(let e in t){let r=t[e];if(!at.default.string(r)&&!at.default.number(r)&&!at.default.boolean(r)&&!at.default.null_(r)&&!at.default.undefined(r))throw new TypeError(`The \\`searchParams\\` value '${String(r)}' must be a string, number, boolean or null`)}}function jrt(t){return at.default.object(t)&&!(\"statusCode\"in t)}var XH=new Nrt.default,Grt=async t=>new Promise((e,r)=>{let s=a=>{r(a)};t.pending||e(),t.once(\"error\",s),t.once(\"ready\",()=>{t.off(\"error\",s),e()})}),qrt=new Set([300,301,302,303,304,307,308]),Wrt=[\"context\",\"body\",\"json\",\"form\"];Ln.setNonEnumerableProperties=(t,e)=>{let r={};for(let s of t)if(s)for(let a of Wrt)a in s&&(r[a]={writable:!0,configurable:!0,enumerable:!1,value:s[a]});Object.defineProperties(e,r)};var fs=class extends Error{constructor(e,r,s){var a;if(super(e),Error.captureStackTrace(this,this.constructor),this.name=\"RequestError\",this.code=r.code,s instanceof aT?(Object.defineProperty(this,\"request\",{enumerable:!1,value:s}),Object.defineProperty(this,\"response\",{enumerable:!1,value:s[eT]}),Object.defineProperty(this,\"options\",{enumerable:!1,value:s.options})):Object.defineProperty(this,\"options\",{enumerable:!1,value:s}),this.timings=(a=this.request)===null||a===void 0?void 0:a.timings,at.default.string(r.stack)&&at.default.string(this.stack)){let n=this.stack.indexOf(this.message)+this.message.length,c=this.stack.slice(n).split(`\n`).reverse(),f=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(`\n`).reverse();for(;f.length!==0&&f[0]===c[0];)c.shift();this.stack=`${this.stack.slice(0,n)}${c.reverse().join(`\n`)}${f.reverse().join(`\n`)}`}}};Ln.RequestError=fs;var tT=class extends fs{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e),this.name=\"MaxRedirectsError\"}};Ln.MaxRedirectsError=tT;var rT=class extends fs{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request),this.name=\"HTTPError\"}};Ln.HTTPError=rT;var nT=class extends fs{constructor(e,r){super(e.message,e,r),this.name=\"CacheError\"}};Ln.CacheError=nT;var iT=class extends fs{constructor(e,r){super(e.message,e,r),this.name=\"UploadError\"}};Ln.UploadError=iT;var sT=class extends fs{constructor(e,r,s){super(e.message,e,s),this.name=\"TimeoutError\",this.event=e.event,this.timings=r}};Ln.TimeoutError=sT;var tv=class extends fs{constructor(e,r){super(e.message,e,r),this.name=\"ReadError\"}};Ln.ReadError=tv;var oT=class extends fs{constructor(e){super(`Unsupported protocol \"${e.url.protocol}\"`,{},e),this.name=\"UnsupportedProtocolError\"}};Ln.UnsupportedProtocolError=oT;var Yrt=[\"socket\",\"connect\",\"continue\",\"information\",\"upgrade\",\"timeout\"],aT=class extends yAe.Duplex{constructor(e,r={},s){super({autoDestroy:!1,highWaterMark:0}),this[yI]=0,this[II]=0,this.requestInitialized=!1,this[ZQ]=new Set,this.redirects=[],this[CI]=!1,this[$Q]=!1,this[ev]=[],this.retryCount=0,this._progressCallbacks=[];let a=()=>this._unlockWrite(),n=()=>this._lockWrite();this.on(\"pipe\",h=>{h.prependListener(\"data\",a),h.on(\"data\",n),h.prependListener(\"end\",a),h.on(\"end\",n)}),this.on(\"unpipe\",h=>{h.off(\"data\",a),h.off(\"data\",n),h.off(\"end\",a),h.off(\"end\",n)}),this.on(\"pipe\",h=>{h instanceof JH.IncomingMessage&&(this.options.headers={...h.headers,...this.options.headers})});let{json:c,body:f,form:p}=r;if((c||f||p)&&this._lockWrite(),Ln.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,s)}catch(h){at.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(h);return}(async()=>{var h;try{this.options.body instanceof Srt.ReadStream&&await Grt(this.options.body);let{url:E}=this.options;if(!E)throw new TypeError(\"Missing `url` property\");if(this.requestUrl=E.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(h=this[po])===null||h===void 0||h.destroy();return}for(let C of this[ev])C();this[ev].length=0,this.requestInitialized=!0}catch(E){if(E instanceof fs){this._beforeError(E);return}this.destroyed||this.destroy(E)}})()}static normalizeArguments(e,r,s){var a,n,c,f,p;let h=r;if(at.default.object(e)&&!at.default.urlInstance(e))r={...s,...e,...r};else{if(e&&r&&r.url!==void 0)throw new TypeError(\"The `url` option is mutually exclusive with the `input` argument\");r={...s,...r},e!==void 0&&(r.url=e),at.default.urlInstance(r.url)&&(r.url=new w0.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),at.assert.any([at.default.string,at.default.undefined],r.method),at.assert.any([at.default.object,at.default.undefined],r.headers),at.assert.any([at.default.string,at.default.urlInstance,at.default.undefined],r.prefixUrl),at.assert.any([at.default.object,at.default.undefined],r.cookieJar),at.assert.any([at.default.object,at.default.string,at.default.undefined],r.searchParams),at.assert.any([at.default.object,at.default.string,at.default.undefined],r.cache),at.assert.any([at.default.object,at.default.number,at.default.undefined],r.timeout),at.assert.any([at.default.object,at.default.undefined],r.context),at.assert.any([at.default.object,at.default.undefined],r.hooks),at.assert.any([at.default.boolean,at.default.undefined],r.decompress),at.assert.any([at.default.boolean,at.default.undefined],r.ignoreInvalidCookies),at.assert.any([at.default.boolean,at.default.undefined],r.followRedirect),at.assert.any([at.default.number,at.default.undefined],r.maxRedirects),at.assert.any([at.default.boolean,at.default.undefined],r.throwHttpErrors),at.assert.any([at.default.boolean,at.default.undefined],r.http2),at.assert.any([at.default.boolean,at.default.undefined],r.allowGetBody),at.assert.any([at.default.string,at.default.undefined],r.localAddress),at.assert.any([vAe.isDnsLookupIpVersion,at.default.undefined],r.dnsLookupIpVersion),at.assert.any([at.default.object,at.default.undefined],r.https),at.assert.any([at.default.boolean,at.default.undefined],r.rejectUnauthorized),r.https&&(at.assert.any([at.default.boolean,at.default.undefined],r.https.rejectUnauthorized),at.assert.any([at.default.function_,at.default.undefined],r.https.checkServerIdentity),at.assert.any([at.default.string,at.default.object,at.default.array,at.default.undefined],r.https.certificateAuthority),at.assert.any([at.default.string,at.default.object,at.default.array,at.default.undefined],r.https.key),at.assert.any([at.default.string,at.default.object,at.default.array,at.default.undefined],r.https.certificate),at.assert.any([at.default.string,at.default.undefined],r.https.passphrase),at.assert.any([at.default.string,at.default.buffer,at.default.array,at.default.undefined],r.https.pfx)),at.assert.any([at.default.object,at.default.undefined],r.cacheOptions),at.default.string(r.method)?r.method=r.method.toUpperCase():r.method=\"GET\",r.headers===s?.headers?r.headers={...r.headers}:r.headers=Qrt({...s?.headers,...r.headers}),\"slashes\"in r)throw new TypeError(\"The legacy `url.Url` has been deprecated. Use `URL` instead.\");if(\"auth\"in r)throw new TypeError(\"Parameter `auth` is deprecated. Use `username` / `password` instead.\");if(\"searchParams\"in r&&r.searchParams&&r.searchParams!==s?.searchParams){let P;if(at.default.string(r.searchParams)||r.searchParams instanceof w0.URLSearchParams)P=new w0.URLSearchParams(r.searchParams);else{Hrt(r.searchParams),P=new w0.URLSearchParams;for(let I in r.searchParams){let R=r.searchParams[I];R===null?P.append(I,\"\"):R!==void 0&&P.append(I,R)}}(a=s?.searchParams)===null||a===void 0||a.forEach((I,R)=>{P.has(R)||P.append(R,I)}),r.searchParams=P}if(r.username=(n=r.username)!==null&&n!==void 0?n:\"\",r.password=(c=r.password)!==null&&c!==void 0?c:\"\",at.default.undefined(r.prefixUrl)?r.prefixUrl=(f=s?.prefixUrl)!==null&&f!==void 0?f:\"\":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==\"\"&&!r.prefixUrl.endsWith(\"/\")&&(r.prefixUrl+=\"/\")),at.default.string(r.url)){if(r.url.startsWith(\"/\"))throw new Error(\"`input` must not start with a slash when using `prefixUrl`\");r.url=BAe.default(r.prefixUrl+r.url,r)}else(at.default.undefined(r.url)&&r.prefixUrl!==\"\"||r.protocol)&&(r.url=BAe.default(r.prefixUrl,r));if(r.url){\"port\"in r&&delete r.port;let{prefixUrl:P}=r;Object.defineProperty(r,\"prefixUrl\",{set:R=>{let N=r.url;if(!N.href.startsWith(R))throw new Error(`Cannot change \\`prefixUrl\\` from ${P} to ${R}: ${N.href}`);r.url=new w0.URL(R+N.href.slice(P.length)),P=R},get:()=>P});let{protocol:I}=r.url;if(I===\"unix:\"&&(I=\"http:\",r.url=new w0.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),I!==\"http:\"&&I!==\"https:\")throw new oT(r);r.username===\"\"?r.username=r.url.username:r.url.username=r.username,r.password===\"\"?r.password=r.url.password:r.url.password=r.password}let{cookieJar:E}=r;if(E){let{setCookie:P,getCookieString:I}=E;at.assert.function_(P),at.assert.function_(I),P.length===4&&I.length===0&&(P=mAe.promisify(P.bind(r.cookieJar)),I=mAe.promisify(I.bind(r.cookieJar)),r.cookieJar={setCookie:P,getCookieString:I})}let{cache:C}=r;if(C&&(XH.has(C)||XH.set(C,new IAe((P,I)=>{let R=P[po](P,I);return at.default.promise(R)&&(R.once=(N,U)=>{if(N===\"error\")R.catch(U);else if(N===\"abort\")(async()=>{try{(await R).once(\"abort\",U)}catch{}})();else throw new Error(`Unknown HTTP2 promise event: ${N}`);return R}),R},C))),r.cacheOptions={...r.cacheOptions},r.dnsCache===!0)KH||(KH=new Prt.default),r.dnsCache=KH;else if(!at.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \\`dnsCache\\` must be a CacheableLookup instance or a boolean, got ${at.default(r.dnsCache)}`);at.default.number(r.timeout)?r.timeout={request:r.timeout}:s&&r.timeout!==s.timeout?r.timeout={...s.timeout,...r.timeout}:r.timeout={...r.timeout},r.context||(r.context={});let S=r.hooks===s?.hooks;r.hooks={...r.hooks};for(let P of Ln.knownHookEvents)if(P in r.hooks)if(at.default.array(r.hooks[P]))r.hooks[P]=[...r.hooks[P]];else throw new TypeError(`Parameter \\`${P}\\` must be an Array, got ${at.default(r.hooks[P])}`);else r.hooks[P]=[];if(s&&!S)for(let P of Ln.knownHookEvents)s.hooks[P].length>0&&(r.hooks[P]=[...s.hooks[P],...r.hooks[P]]);if(\"family\"in r&&B0.default('\"options.family\" was never documented, please use \"options.dnsLookupIpVersion\"'),s?.https&&(r.https={...s.https,...r.https}),\"rejectUnauthorized\"in r&&B0.default('\"options.rejectUnauthorized\" is now deprecated, please use \"options.https.rejectUnauthorized\"'),\"checkServerIdentity\"in r&&B0.default('\"options.checkServerIdentity\" was never documented, please use \"options.https.checkServerIdentity\"'),\"ca\"in r&&B0.default('\"options.ca\" was never documented, please use \"options.https.certificateAuthority\"'),\"key\"in r&&B0.default('\"options.key\" was never documented, please use \"options.https.key\"'),\"cert\"in r&&B0.default('\"options.cert\" was never documented, please use \"options.https.certificate\"'),\"passphrase\"in r&&B0.default('\"options.passphrase\" was never documented, please use \"options.https.passphrase\"'),\"pfx\"in r&&B0.default('\"options.pfx\" was never documented, please use \"options.https.pfx\"'),\"followRedirects\"in r)throw new TypeError(\"The `followRedirects` option does not exist. Use `followRedirect` instead.\");if(r.agent){for(let P in r.agent)if(P!==\"http\"&&P!==\"https\"&&P!==\"http2\")throw new TypeError(`Expected the \\`options.agent\\` properties to be \\`http\\`, \\`https\\` or \\`http2\\`, got \\`${P}\\``)}return r.maxRedirects=(p=r.maxRedirects)!==null&&p!==void 0?p:0,Ln.setNonEnumerableProperties([s,h],r),Mrt.default(r,s)}_lockWrite(){let e=()=>{throw new TypeError(\"The payload has been already provided\")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:r}=e,s=!at.default.undefined(e.form),a=!at.default.undefined(e.json),n=!at.default.undefined(e.body),c=s||a||n,f=Ln.withoutBody.has(e.method)&&!(e.method===\"GET\"&&e.allowGetBody);if(this._cannotHaveBody=f,c){if(f)throw new TypeError(`The \\`${e.method}\\` method cannot be used with a body`);if([n,s,a].filter(p=>p).length>1)throw new TypeError(\"The `body`, `json` and `form` options are mutually exclusive\");if(n&&!(e.body instanceof yAe.Readable)&&!at.default.string(e.body)&&!at.default.buffer(e.body)&&!CAe.default(e.body))throw new TypeError(\"The `body` option must be a stream.Readable, string or Buffer\");if(s&&!at.default.object(e.form))throw new TypeError(\"The `form` option must be an Object\");{let p=!at.default.string(r[\"content-type\"]);n?(CAe.default(e.body)&&p&&(r[\"content-type\"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[v0]=e.body):s?(p&&(r[\"content-type\"]=\"application/x-www-form-urlencoded\"),this[v0]=new w0.URLSearchParams(e.form).toString()):(p&&(r[\"content-type\"]=\"application/json\"),this[v0]=e.stringifyJson(e.json));let h=await Trt.default(this[v0],e.headers);at.default.undefined(r[\"content-length\"])&&at.default.undefined(r[\"transfer-encoding\"])&&!f&&!at.default.undefined(h)&&(r[\"content-length\"]=String(h))}}else f?this._lockWrite():this._unlockWrite();this[EI]=Number(r[\"content-length\"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:s}=r;this[PAe]=e,r.decompress&&(e=xrt(e));let a=e.statusCode,n=e;n.statusMessage=n.statusMessage?n.statusMessage:EAe.STATUS_CODES[a],n.url=r.url.toString(),n.requestUrl=this.requestUrl,n.redirectUrls=this.redirects,n.request=this,n.isFromCache=e.fromCache||!1,n.ip=this.ip,n.retryCount=this.retryCount,this[DAe]=n.isFromCache,this[mI]=Number(e.headers[\"content-length\"])||void 0,this[eT]=e,e.once(\"end\",()=>{this[mI]=this[yI],this.emit(\"downloadProgress\",this.downloadProgress)}),e.once(\"error\",f=>{e.destroy(),this._beforeError(new tv(f,this))}),e.once(\"aborted\",()=>{this._beforeError(new tv({name:\"Error\",message:\"The server aborted pending request\",code:\"ECONNRESET\"},this))}),this.emit(\"downloadProgress\",this.downloadProgress);let c=e.headers[\"set-cookie\"];if(at.default.object(r.cookieJar)&&c){let f=c.map(async p=>r.cookieJar.setCookie(p,s.toString()));r.ignoreInvalidCookies&&(f=f.map(async p=>p.catch(()=>{})));try{await Promise.all(f)}catch(p){this._beforeError(p);return}}if(r.followRedirect&&e.headers.location&&qrt.has(a)){if(e.resume(),this[po]&&(this[zH](),delete this[po],this[SAe]()),(a===303&&r.method!==\"GET\"&&r.method!==\"HEAD\"||!r.methodRewriting)&&(r.method=\"GET\",\"body\"in r&&delete r.body,\"json\"in r&&delete r.json,\"form\"in r&&delete r.form,this[v0]=void 0,delete r.headers[\"content-length\"]),this.redirects.length>=r.maxRedirects){this._beforeError(new tT(this));return}try{let p=Buffer.from(e.headers.location,\"binary\").toString(),h=new w0.URL(p,s),E=h.toString();decodeURI(E),h.hostname!==s.hostname||h.port!==s.port?(\"host\"in r.headers&&delete r.headers.host,\"cookie\"in r.headers&&delete r.headers.cookie,\"authorization\"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username=\"\",r.password=\"\")):(h.username=r.username,h.password=r.password),this.redirects.push(E),r.url=h;for(let C of r.hooks.beforeRedirect)await C(r,n);this.emit(\"redirect\",n,r),await this._makeRequest()}catch(p){this._beforeError(p);return}return}if(r.isStream&&r.throwHttpErrors&&!Lrt.isResponseOk(n)){this._beforeError(new rT(n));return}e.on(\"readable\",()=>{this[$Q]&&this._read()}),this.on(\"resume\",()=>{e.resume()}),this.on(\"pause\",()=>{e.pause()}),e.once(\"end\",()=>{this.push(null)}),this.emit(\"response\",e);for(let f of this[ZQ])if(!f.headersSent){for(let p in e.headers){let h=r.decompress?p!==\"content-encoding\":!0,E=e.headers[p];h&&f.setHeader(p,E)}f.statusCode=a}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:s,url:a}=r;brt.default(e),this[zH]=wAe.default(e,s,a);let n=r.cache?\"cacheableResponse\":\"response\";e.once(n,p=>{this._onResponse(p)}),e.once(\"error\",p=>{var h;e.destroy(),(h=e.res)===null||h===void 0||h.removeAllListeners(\"end\"),p=p instanceof wAe.TimeoutError?new sT(p,this.timings,this):new fs(p.message,p,this),this._beforeError(p)}),this[SAe]=Rrt.default(e,this,Yrt),this[po]=e,this.emit(\"uploadProgress\",this.uploadProgress);let c=this[v0],f=this.redirects.length===0?this:e;at.default.nodeStream(c)?(c.pipe(f),c.once(\"error\",p=>{this._beforeError(new iT(p,this))})):(this._unlockWrite(),at.default.undefined(c)?(this._cannotHaveBody||this._noPipe)&&(f.end(),this._lockWrite()):(this._writeRequest(c,void 0,()=>{}),f.end(),this._lockWrite())),this.emit(\"request\",e)}async _createCacheableRequest(e,r){return new Promise((s,a)=>{Object.assign(r,Frt.default(e)),delete r.url;let n,c=XH.get(r.cache)(r,async f=>{f._readableState.autoDestroy=!1,n&&(await n).emit(\"cacheableResponse\",f),s(f)});r.url=e,c.once(\"error\",a),c.once(\"request\",async f=>{n=f,s(n)})})}async _makeRequest(){var e,r,s,a,n;let{options:c}=this,{headers:f}=c;for(let U in f)if(at.default.undefined(f[U]))delete f[U];else if(at.default.null_(f[U]))throw new TypeError(`Use \\`undefined\\` instead of \\`null\\` to delete the \\`${U}\\` header`);if(c.decompress&&at.default.undefined(f[\"accept-encoding\"])&&(f[\"accept-encoding\"]=_rt?\"gzip, deflate, br\":\"gzip, deflate\"),c.cookieJar){let U=await c.cookieJar.getCookieString(c.url.toString());at.default.nonEmptyString(U)&&(c.headers.cookie=U)}for(let U of c.hooks.beforeRequest){let W=await U(c);if(!at.default.undefined(W)){c.request=()=>W;break}}c.body&&this[v0]!==c.body&&(this[v0]=c.body);let{agent:p,request:h,timeout:E,url:C}=c;if(c.dnsCache&&!(\"lookup\"in c)&&(c.lookup=c.dnsCache.lookup),C.hostname===\"unix\"){let U=/(?<socketPath>.+?):(?<path>.+)/.exec(`${C.pathname}${C.search}`);if(U?.groups){let{socketPath:W,path:ee}=U.groups;Object.assign(c,{socketPath:W,path:ee,host:\"\"})}}let S=C.protocol===\"https:\",P;c.http2?P=krt.auto:P=S?Drt.request:EAe.request;let I=(e=c.request)!==null&&e!==void 0?e:P,R=c.cache?this._createCacheableRequest:I;p&&!c.http2&&(c.agent=p[S?\"https\":\"http\"]),c[po]=I,delete c.request,delete c.timeout;let N=c;if(N.shared=(r=c.cacheOptions)===null||r===void 0?void 0:r.shared,N.cacheHeuristic=(s=c.cacheOptions)===null||s===void 0?void 0:s.cacheHeuristic,N.immutableMinTimeToLive=(a=c.cacheOptions)===null||a===void 0?void 0:a.immutableMinTimeToLive,N.ignoreCargoCult=(n=c.cacheOptions)===null||n===void 0?void 0:n.ignoreCargoCult,c.dnsLookupIpVersion!==void 0)try{N.family=vAe.dnsLookupIpVersionToFamily(c.dnsLookupIpVersion)}catch{throw new Error(\"Invalid `dnsLookupIpVersion` option value\")}c.https&&(\"rejectUnauthorized\"in c.https&&(N.rejectUnauthorized=c.https.rejectUnauthorized),c.https.checkServerIdentity&&(N.checkServerIdentity=c.https.checkServerIdentity),c.https.certificateAuthority&&(N.ca=c.https.certificateAuthority),c.https.certificate&&(N.cert=c.https.certificate),c.https.key&&(N.key=c.https.key),c.https.passphrase&&(N.passphrase=c.https.passphrase),c.https.pfx&&(N.pfx=c.https.pfx));try{let U=await R(C,N);at.default.undefined(U)&&(U=P(C,N)),c.request=h,c.timeout=E,c.agent=p,c.https&&(\"rejectUnauthorized\"in c.https&&delete N.rejectUnauthorized,c.https.checkServerIdentity&&delete N.checkServerIdentity,c.https.certificateAuthority&&delete N.ca,c.https.certificate&&delete N.cert,c.https.key&&delete N.key,c.https.passphrase&&delete N.passphrase,c.https.pfx&&delete N.pfx),jrt(U)?this._onRequest(U):this.writable?(this.once(\"finish\",()=>{this._onResponse(U)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(U)}catch(U){throw U instanceof IAe.CacheError?new nT(U,this):new fs(U.message,U,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new fs(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[CI])return;let{options:r}=this,s=this.retryCount+1;this[CI]=!0,e instanceof fs||(e=new fs(e.message,e,this));let a=e,{response:n}=a;(async()=>{if(n&&!n.body){n.setEncoding(this._readableState.encoding);try{n.rawBody=await Ort.default(n),n.body=n.rawBody.toString()}catch{}}if(this.listenerCount(\"retry\")!==0){let c;try{let f;n&&\"retry-after\"in n.headers&&(f=Number(n.headers[\"retry-after\"]),Number.isNaN(f)?(f=Date.parse(n.headers[\"retry-after\"])-Date.now(),f<=0&&(f=1)):f*=1e3),c=await r.retry.calculateDelay({attemptCount:s,retryOptions:r.retry,error:a,retryAfter:f,computedValue:Urt.default({attemptCount:s,retryOptions:r.retry,error:a,retryAfter:f,computedValue:0})})}catch(f){this._error(new fs(f.message,f,this));return}if(c){let f=async()=>{try{for(let p of this.options.hooks.beforeRetry)await p(this.options,a,s)}catch(p){this._error(new fs(p.message,e,this));return}this.destroyed||(this.destroy(),this.emit(\"retry\",s,e))};this[xAe]=setTimeout(f,c);return}}this._error(a)})()}_read(){this[$Q]=!0;let e=this[eT];if(e&&!this[CI]){e.readableLength&&(this[$Q]=!1);let r;for(;(r=e.read())!==null;){this[yI]+=r.length,this[bAe]=!0;let s=this.downloadProgress;s.percent<1&&this.emit(\"downloadProgress\",s),this.push(r)}}}_write(e,r,s){let a=()=>{this._writeRequest(e,r,s)};this.requestInitialized?a():this[ev].push(a)}_writeRequest(e,r,s){this[po].destroyed||(this._progressCallbacks.push(()=>{this[II]+=Buffer.byteLength(e,r);let a=this.uploadProgress;a.percent<1&&this.emit(\"uploadProgress\",a)}),this[po].write(e,r,a=>{!a&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),s(a)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(po in this)){e();return}if(this[po].destroyed){e();return}this[po].end(s=>{s||(this[EI]=this[II],this.emit(\"uploadProgress\",this.uploadProgress),this[po].emit(\"upload-complete\")),e(s)})};this.requestInitialized?r():this[ev].push(r)}_destroy(e,r){var s;this[CI]=!0,clearTimeout(this[xAe]),po in this&&(this[zH](),!((s=this[eT])===null||s===void 0)&&s.complete||this[po].destroy()),e!==null&&!at.default.undefined(e)&&!(e instanceof fs)&&(e=new fs(e.message,e,this)),r(e)}get _isAboutToError(){return this[CI]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,r,s;return((r=(e=this[po])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!(!((s=this[PAe])===null||s===void 0)&&s.complete)}get socket(){var e,r;return(r=(e=this[po])===null||e===void 0?void 0:e.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let e;return this[mI]?e=this[yI]/this[mI]:this[mI]===this[yI]?e=1:e=0,{percent:e,transferred:this[yI],total:this[mI]}}get uploadProgress(){let e;return this[EI]?e=this[II]/this[EI]:this[EI]===this[II]?e=1:e=0,{percent:e,transferred:this[II],total:this[EI]}}get timings(){var e;return(e=this[po])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[DAe]}pipe(e,r){if(this[bAe])throw new Error(\"Failed to pipe. The response has been emitted already.\");return e instanceof JH.ServerResponse&&this[ZQ].add(e),super.pipe(e,r)}unpipe(e){return e instanceof JH.ServerResponse&&this[ZQ].delete(e),super.unpipe(e),this}};Ln.default=aT});var nv=_(qu=>{\"use strict\";var Vrt=qu&&qu.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),Jrt=qu&&qu.__exportStar||function(t,e){for(var r in t)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,r)&&Vrt(e,t,r)};Object.defineProperty(qu,\"__esModule\",{value:!0});qu.CancelError=qu.ParseError=void 0;var kAe=rv(),ZH=class extends kAe.RequestError{constructor(e,r){let{options:s}=r.request;super(`${e.message} in \"${s.url.toString()}\"`,e,r.request),this.name=\"ParseError\"}};qu.ParseError=ZH;var $H=class extends kAe.RequestError{constructor(e){super(\"Promise was canceled\",{},e),this.name=\"CancelError\"}get isCanceled(){return!0}};qu.CancelError=$H;Jrt(rv(),qu)});var TAe=_(ej=>{\"use strict\";Object.defineProperty(ej,\"__esModule\",{value:!0});var QAe=nv(),Krt=(t,e,r,s)=>{let{rawBody:a}=t;try{if(e===\"text\")return a.toString(s);if(e===\"json\")return a.length===0?\"\":r(a.toString());if(e===\"buffer\")return a;throw new QAe.ParseError({message:`Unknown body type '${e}'`,name:\"Error\"},t)}catch(n){throw new QAe.ParseError(n,t)}};ej.default=Krt});var tj=_(S0=>{\"use strict\";var zrt=S0&&S0.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),Xrt=S0&&S0.__exportStar||function(t,e){for(var r in t)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,r)&&zrt(e,t,r)};Object.defineProperty(S0,\"__esModule\",{value:!0});var Zrt=Ie(\"events\"),$rt=Np(),ent=Que(),lT=nv(),RAe=TAe(),FAe=rv(),tnt=LH(),rnt=qH(),NAe=WH(),nnt=[\"request\",\"response\",\"redirect\",\"uploadProgress\",\"downloadProgress\"];function OAe(t){let e,r,s=new Zrt.EventEmitter,a=new ent((c,f,p)=>{let h=E=>{let C=new FAe.default(void 0,t);C.retryCount=E,C._noPipe=!0,p(()=>C.destroy()),p.shouldReject=!1,p(()=>f(new lT.CancelError(C))),e=C,C.once(\"response\",async I=>{var R;if(I.retryCount=E,I.request.aborted)return;let N;try{N=await rnt.default(C),I.rawBody=N}catch{return}if(C._isAboutToError)return;let U=((R=I.headers[\"content-encoding\"])!==null&&R!==void 0?R:\"\").toLowerCase(),W=[\"gzip\",\"deflate\",\"br\"].includes(U),{options:ee}=C;if(W&&!ee.decompress)I.body=N;else try{I.body=RAe.default(I,ee.responseType,ee.parseJson,ee.encoding)}catch(ie){if(I.body=N.toString(),NAe.isResponseOk(I)){C._beforeError(ie);return}}try{for(let[ie,ue]of ee.hooks.afterResponse.entries())I=await ue(I,async le=>{let me=FAe.default.normalizeArguments(void 0,{...le,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},ee);me.hooks.afterResponse=me.hooks.afterResponse.slice(0,ie);for(let Be of me.hooks.beforeRetry)await Be(me);let pe=OAe(me);return p(()=>{pe.catch(()=>{}),pe.cancel()}),pe})}catch(ie){C._beforeError(new lT.RequestError(ie.message,ie,C));return}if(!NAe.isResponseOk(I)){C._beforeError(new lT.HTTPError(I));return}r=I,c(C.options.resolveBodyOnly?I.body:I)});let S=I=>{if(a.isCanceled)return;let{options:R}=C;if(I instanceof lT.HTTPError&&!R.throwHttpErrors){let{response:N}=I;c(C.options.resolveBodyOnly?N.body:N);return}f(I)};C.once(\"error\",S);let P=C.options.body;C.once(\"retry\",(I,R)=>{var N,U;if(P===((N=R.request)===null||N===void 0?void 0:N.options.body)&&$rt.default.nodeStream((U=R.request)===null||U===void 0?void 0:U.options.body)){S(R);return}h(I)}),tnt.default(C,s,nnt)};h(0)});a.on=(c,f)=>(s.on(c,f),a);let n=c=>{let f=(async()=>{await a;let{options:p}=r.request;return RAe.default(r,c,p.parseJson,p.encoding)})();return Object.defineProperties(f,Object.getOwnPropertyDescriptors(a)),f};return a.json=()=>{let{headers:c}=e.options;return!e.writableFinished&&c.accept===void 0&&(c.accept=\"application/json\"),n(\"json\")},a.buffer=()=>n(\"buffer\"),a.text=()=>n(\"text\"),a}S0.default=OAe;Xrt(nv(),S0)});var LAe=_(rj=>{\"use strict\";Object.defineProperty(rj,\"__esModule\",{value:!0});var int=nv();function snt(t,...e){let r=(async()=>{if(t instanceof int.RequestError)try{for(let a of e)if(a)for(let n of a)t=await n(t)}catch(a){t=a}throw t})(),s=()=>r;return r.json=s,r.text=s,r.buffer=s,r.on=s,r}rj.default=snt});var _Ae=_(nj=>{\"use strict\";Object.defineProperty(nj,\"__esModule\",{value:!0});var MAe=Np();function UAe(t){for(let e of Object.values(t))(MAe.default.plainObject(e)||MAe.default.array(e))&&UAe(e);return Object.freeze(t)}nj.default=UAe});var jAe=_(HAe=>{\"use strict\";Object.defineProperty(HAe,\"__esModule\",{value:!0})});var ij=_(Nc=>{\"use strict\";var ont=Nc&&Nc.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),ant=Nc&&Nc.__exportStar||function(t,e){for(var r in t)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,r)&&ont(e,t,r)};Object.defineProperty(Nc,\"__esModule\",{value:!0});Nc.defaultHandler=void 0;var GAe=Np(),Fc=tj(),lnt=LAe(),uT=rv(),cnt=_Ae(),unt={RequestError:Fc.RequestError,CacheError:Fc.CacheError,ReadError:Fc.ReadError,HTTPError:Fc.HTTPError,MaxRedirectsError:Fc.MaxRedirectsError,TimeoutError:Fc.TimeoutError,ParseError:Fc.ParseError,CancelError:Fc.CancelError,UnsupportedProtocolError:Fc.UnsupportedProtocolError,UploadError:Fc.UploadError},fnt=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:cT}=uT.default,qAe=(...t)=>{let e;for(let r of t)e=cT(void 0,r,e);return e},Ant=t=>t.isStream?new uT.default(void 0,t):Fc.default(t),pnt=t=>\"defaults\"in t&&\"options\"in t.defaults,hnt=[\"get\",\"post\",\"put\",\"patch\",\"head\",\"delete\"];Nc.defaultHandler=(t,e)=>e(t);var WAe=(t,e)=>{if(t)for(let r of t)r(e)},YAe=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(s=>(a,n)=>{let c,f=s(a,p=>(c=n(p),c));if(f!==c&&!a.isStream&&c){let p=f,{then:h,catch:E,finally:C}=p;Object.setPrototypeOf(p,Object.getPrototypeOf(c)),Object.defineProperties(p,Object.getOwnPropertyDescriptors(c)),p.then=h,p.catch=E,p.finally=C}return f});let e=(s,a={},n)=>{var c,f;let p=0,h=E=>t.handlers[p++](E,p===t.handlers.length?Ant:h);if(GAe.default.plainObject(s)){let E={...s,...a};uT.setNonEnumerableProperties([s,a],E),a=E,s=void 0}try{let E;try{WAe(t.options.hooks.init,a),WAe((c=a.hooks)===null||c===void 0?void 0:c.init,a)}catch(S){E=S}let C=cT(s,a,n??t.options);if(C[uT.kIsNormalizedAlready]=!0,E)throw new Fc.RequestError(E.message,E,C);return h(C)}catch(E){if(a.isStream)throw E;return lnt.default(E,t.options.hooks.beforeError,(f=a.hooks)===null||f===void 0?void 0:f.beforeError)}};e.extend=(...s)=>{let a=[t.options],n=[...t._rawHandlers],c;for(let f of s)pnt(f)?(a.push(f.defaults.options),n.push(...f.defaults._rawHandlers),c=f.defaults.mutableDefaults):(a.push(f),\"handlers\"in f&&n.push(...f.handlers),c=f.mutableDefaults);return n=n.filter(f=>f!==Nc.defaultHandler),n.length===0&&n.push(Nc.defaultHandler),YAe({options:qAe(...a),handlers:n,mutableDefaults:!!c})};let r=async function*(s,a){let n=cT(s,a,t.options);n.resolveBodyOnly=!1;let c=n.pagination;if(!GAe.default.object(c))throw new TypeError(\"`options.pagination` must be implemented\");let f=[],{countLimit:p}=c,h=0;for(;h<c.requestLimit;){h!==0&&await fnt(c.backoff);let E=await e(void 0,void 0,n),C=await c.transform(E),S=[];for(let I of C)if(c.filter(I,f,S)&&(!c.shouldContinue(I,f,S)||(yield I,c.stackAllItems&&f.push(I),S.push(I),--p<=0)))return;let P=c.paginate(E,f,S);if(P===!1)return;P===E.request.options?n=E.request.options:P!==void 0&&(n=cT(void 0,P,n)),h++}};e.paginate=r,e.paginate.all=async(s,a)=>{let n=[];for await(let c of r(s,a))n.push(c);return n},e.paginate.each=r,e.stream=(s,a)=>e(s,{...a,isStream:!0});for(let s of hnt)e[s]=(a,n)=>e(a,{...n,method:s}),e.stream[s]=(a,n)=>e(a,{...n,method:s,isStream:!0});return Object.assign(e,unt),Object.defineProperty(e,\"defaults\",{value:t.mutableDefaults?t:cnt.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=qAe,e};Nc.default=YAe;ant(jAe(),Nc)});var KAe=_((Op,fT)=>{\"use strict\";var gnt=Op&&Op.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),VAe=Op&&Op.__exportStar||function(t,e){for(var r in t)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,r)&&gnt(e,t,r)};Object.defineProperty(Op,\"__esModule\",{value:!0});var dnt=Ie(\"url\"),JAe=ij(),mnt={options:{method:\"GET\",retry:{limit:2,methods:[\"GET\",\"PUT\",\"HEAD\",\"DELETE\",\"OPTIONS\",\"TRACE\"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:[\"ETIMEDOUT\",\"ECONNRESET\",\"EADDRINUSE\",\"ECONNREFUSED\",\"EPIPE\",\"ENOTFOUND\",\"ENETUNREACH\",\"EAI_AGAIN\"],maxRetryAfter:void 0,calculateDelay:({computedValue:t})=>t},timeout:{},headers:{\"user-agent\":\"got (https://github.com/sindresorhus/got)\"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:\"text\",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:\"\",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:t=>t.request.options.responseType===\"json\"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,\"link\"))return!1;let e=t.headers.link.split(\",\"),r;for(let s of e){let a=s.split(\";\");if(a[1].includes(\"next\")){r=a[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new dnt.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[JAe.defaultHandler],mutableDefaults:!1},sj=JAe.default(mnt);Op.default=sj;fT.exports=sj;fT.exports.default=sj;fT.exports.__esModule=!0;VAe(ij(),Op);VAe(tj(),Op)});var nn={};Vt(nn,{Method:()=>tpe,del:()=>wnt,get:()=>lj,getNetworkSettings:()=>epe,post:()=>cj,put:()=>Cnt,request:()=>iv});async function oj(t){return Yl(XAe,t,()=>ce.readFilePromise(t).then(e=>(XAe.set(t,e),e)))}function Int({statusCode:t,statusMessage:e},r){let s=Ht(r,t,ht.NUMBER),a=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return KE(r,`${s}${e?` (${e})`:\"\"}`,a)}async function AT(t,{configuration:e,customErrorMessage:r}){try{return await t}catch(s){if(s.name!==\"HTTPError\")throw s;let a=r?.(s,e)??s.response.body?.error;a==null&&(s.message.startsWith(\"Response code\")?a=\"The remote server failed to provide the requested resource\":a=s.message),s.code===\"ETIMEDOUT\"&&s.event===\"socket\"&&(a+=`(can be increased via ${Ht(e,\"httpTimeout\",ht.SETTING)})`);let n=new jt(35,a,c=>{s.response&&c.reportError(35,`  ${Kf(e,{label:\"Response Code\",value:_u(ht.NO_HINT,Int(s.response,e))})}`),s.request&&(c.reportError(35,`  ${Kf(e,{label:\"Request Method\",value:_u(ht.NO_HINT,s.request.options.method)})}`),c.reportError(35,`  ${Kf(e,{label:\"Request URL\",value:_u(ht.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&c.reportError(35,`  ${Kf(e,{label:\"Request Redirects\",value:_u(ht.NO_HINT,Z4(e,s.request.redirects,ht.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&c.reportError(35,`  ${Kf(e,{label:\"Request Retry Count\",value:_u(ht.NO_HINT,`${Ht(e,s.request.retryCount,ht.NUMBER)} (can be increased via ${Ht(e,\"httpRetry\",ht.SETTING)})`)})}`)});throw n.originalError=s,n}}function epe(t,e){let r=[...e.configuration.get(\"networkSettings\")].sort(([c],[f])=>f.length-c.length),s={enableNetwork:void 0,httpsCaFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},a=Object.keys(s),n=typeof t==\"string\"?new URL(t):t;for(let[c,f]of r)if(aj.default.isMatch(n.hostname,c))for(let p of a){let h=f.get(p);h!==null&&typeof s[p]>\"u\"&&(s[p]=h)}for(let c of a)typeof s[c]>\"u\"&&(s[c]=e.configuration.get(c));return s}async function iv(t,e,{configuration:r,headers:s,jsonRequest:a,jsonResponse:n,method:c=\"GET\",wrapNetworkRequest:f}){let p={target:t,body:e,configuration:r,headers:s,jsonRequest:a,jsonResponse:n,method:c},h=async()=>await Bnt(t,e,p),E=typeof f<\"u\"?await f(h,p):h;return await(await r.reduceHook(S=>S.wrapNetworkRequest,E,p))()}async function lj(t,{configuration:e,jsonResponse:r,customErrorMessage:s,wrapNetworkRequest:a,...n}){let c=()=>AT(iv(t,null,{configuration:e,wrapNetworkRequest:a,...n}),{configuration:e,customErrorMessage:s}).then(p=>p.body),f=await(typeof a<\"u\"?c():Yl(zAe,t,()=>c().then(p=>(zAe.set(t,p),p))));return r?JSON.parse(f.toString()):f}async function Cnt(t,e,{customErrorMessage:r,...s}){return(await AT(iv(t,e,{...s,method:\"PUT\"}),{customErrorMessage:r,configuration:s.configuration})).body}async function cj(t,e,{customErrorMessage:r,...s}){return(await AT(iv(t,e,{...s,method:\"POST\"}),{customErrorMessage:r,configuration:s.configuration})).body}async function wnt(t,{customErrorMessage:e,...r}){return(await AT(iv(t,null,{...r,method:\"DELETE\"}),{customErrorMessage:e,configuration:r.configuration})).body}async function Bnt(t,e,{configuration:r,headers:s,jsonRequest:a,jsonResponse:n,method:c=\"GET\"}){let f=typeof t==\"string\"?new URL(t):t,p=epe(f,{configuration:r});if(p.enableNetwork===!1)throw new jt(80,`Request to '${f.href}' has been blocked because of your configuration settings`);if(f.protocol===\"http:\"&&!aj.default.isMatch(f.hostname,r.get(\"unsafeHttpWhitelist\")))throw new jt(81,`Unsafe http requests must be explicitly whitelisted in your configuration (${f.hostname})`);let h={headers:s,method:c};h.responseType=n?\"json\":\"buffer\",e!==null&&(Buffer.isBuffer(e)||!a&&typeof e==\"string\"?h.body=e:h.json=e);let E=r.get(\"httpTimeout\"),C=r.get(\"httpRetry\"),S=r.get(\"enableStrictSsl\"),P=p.httpsCaFilePath,I=p.httpsCertFilePath,R=p.httpsKeyFilePath,{default:N}=await Promise.resolve().then(()=>ut(KAe())),U=P?await oj(P):void 0,W=I?await oj(I):void 0,ee=R?await oj(R):void 0,ie={rejectUnauthorized:S,ca:U,cert:W,key:ee},ue={http:p.httpProxy?new vue({proxy:p.httpProxy,proxyRequestOptions:ie}):ynt,https:p.httpsProxy?new Sue({proxy:p.httpsProxy,proxyRequestOptions:ie}):Ent},le=N.extend({timeout:{socket:E},retry:C,agent:ue,https:{rejectUnauthorized:S,certificateAuthority:U,certificate:W,key:ee},...h});return r.getLimit(\"networkConcurrency\")(()=>le(f))}var ZAe,$Ae,aj,zAe,XAe,ynt,Ent,tpe,pT=Xe(()=>{Dt();Due();ZAe=Ie(\"https\"),$Ae=Ie(\"http\"),aj=ut(Go());Tc();xc();Pc();zAe=new Map,XAe=new Map,ynt=new $Ae.Agent({keepAlive:!0}),Ent=new ZAe.Agent({keepAlive:!0});tpe=(a=>(a.GET=\"GET\",a.PUT=\"PUT\",a.POST=\"POST\",a.DELETE=\"DELETE\",a))(tpe||{})});var Ui={};Vt(Ui,{availableParallelism:()=>fj,getArchitecture:()=>sv,getArchitectureName:()=>Pnt,getArchitectureSet:()=>uj,getCaller:()=>Tnt,major:()=>vnt,openUrl:()=>Snt});function bnt(){if(process.platform!==\"linux\")return null;let t;try{t=ce.readFileSync(Dnt)}catch{}if(typeof t<\"u\"){if(t&&(t.includes(\"GLIBC\")||t.includes(\"GNU libc\")||t.includes(\"GNU C Library\")))return\"glibc\";if(t&&t.includes(\"musl\"))return\"musl\"}let r=(process.report?.getReport()??{}).sharedObjects??[],s=/\\/(?:(ld-linux-|[^/]+-linux-gnu\\/)|(libc.musl-|ld-musl-))/;return p0(r,a=>{let n=a.match(s);if(!n)return p0.skip;if(n[1])return\"glibc\";if(n[2])return\"musl\";throw new Error(\"Assertion failed: Expected the libc variant to have been detected\")})??null}function sv(){return npe=npe??{os:(process.env.YARN_IS_TEST_ENV?process.env.YARN_OS_OVERRIDE:void 0)??process.platform,cpu:(process.env.YARN_IS_TEST_ENV?process.env.YARN_CPU_OVERRIDE:void 0)??process.arch,libc:(process.env.YARN_IS_TEST_ENV?process.env.YARN_LIBC_OVERRIDE:void 0)??bnt()}}function Pnt(t=sv()){return t.libc?`${t.os}-${t.cpu}-${t.libc}`:`${t.os}-${t.cpu}`}function uj(){let t=sv();return ipe=ipe??{os:[t.os],cpu:[t.cpu],libc:t.libc?[t.libc]:[]}}function Qnt(t){let e=xnt.exec(t);if(!e)return null;let r=e[2]&&e[2].indexOf(\"native\")===0,s=e[2]&&e[2].indexOf(\"eval\")===0,a=knt.exec(e[2]);return s&&a!=null&&(e[2]=a[1],e[3]=a[2],e[4]=a[3]),{file:r?null:e[2],methodName:e[1]||\"<unknown>\",arguments:r?[e[2]]:[],line:e[3]?+e[3]:null,column:e[4]?+e[4]:null}}function Tnt(){let e=new Error().stack.split(`\n`)[3];return Qnt(e)}function fj(){return typeof hT.default.availableParallelism<\"u\"?hT.default.availableParallelism():Math.max(1,hT.default.cpus().length)}var hT,vnt,rpe,Snt,Dnt,npe,ipe,xnt,knt,gT=Xe(()=>{Dt();hT=ut(Ie(\"os\"));dT();Pc();vnt=Number(process.versions.node.split(\".\")[0]),rpe=new Map([[\"darwin\",\"open\"],[\"linux\",\"xdg-open\"],[\"win32\",\"explorer.exe\"]]).get(process.platform),Snt=typeof rpe<\"u\"?async t=>{try{return await Aj(rpe,[t],{cwd:J.cwd()}),!0}catch{return!1}}:void 0,Dnt=\"/usr/bin/ldd\";xnt=/^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\\/|[a-z]:\\\\|\\\\\\\\).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,knt=/\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/});function yj(t,e,r,s,a){let n=YB(r);if(s.isArray||s.type===\"ANY\"&&Array.isArray(n))return Array.isArray(n)?n.map((c,f)=>pj(t,`${e}[${f}]`,c,s,a)):String(n).split(/,/).map(c=>pj(t,e,c,s,a));if(Array.isArray(n))throw new Error(`Non-array configuration settings \"${e}\" cannot be an array`);return pj(t,e,r,s,a)}function pj(t,e,r,s,a){let n=YB(r);switch(s.type){case\"ANY\":return NQ(n);case\"SHAPE\":return Ont(t,e,r,s,a);case\"MAP\":return Lnt(t,e,r,s,a)}if(n===null&&!s.isNullable&&s.default!==null)throw new Error(`Non-nullable configuration settings \"${e}\" cannot be set to null`);if(\"values\"in s&&s.values?.includes(n))return n;let f=(()=>{if(s.type===\"BOOLEAN\"&&typeof n!=\"string\")return kB(n);if(typeof n!=\"string\")throw new Error(`Expected configuration setting \"${e}\" to be a string, got ${typeof n}`);let p=Vk(n,{env:t.env});switch(s.type){case\"ABSOLUTE_PATH\":{let h=a,E=H8(r);return E&&E[0]!==\"<\"&&(h=J.dirname(E)),J.resolve(h,fe.toPortablePath(p))}case\"LOCATOR_LOOSE\":return Qp(p,!1);case\"NUMBER\":return parseInt(p);case\"LOCATOR\":return Qp(p);case\"BOOLEAN\":return kB(p);case\"DURATION\":return Jk(p,s.unit);default:return p}})();if(\"values\"in s&&s.values&&!s.values.includes(f))throw new Error(`Invalid value, expected one of ${s.values.join(\", \")}`);return f}function Ont(t,e,r,s,a){let n=YB(r);if(typeof n!=\"object\"||Array.isArray(n))throw new nt(`Object configuration settings \"${e}\" must be an object`);let c=Ej(t,s,{ignoreArrays:!0});if(n===null)return c;for(let[f,p]of Object.entries(n)){let h=`${e}.${f}`;if(!s.properties[f])throw new nt(`Unrecognized configuration settings found: ${e}.${f} - run \"yarn config\" to see the list of settings supported in Yarn`);c.set(f,yj(t,h,p,s.properties[f],a))}return c}function Lnt(t,e,r,s,a){let n=YB(r),c=new Map;if(typeof n!=\"object\"||Array.isArray(n))throw new nt(`Map configuration settings \"${e}\" must be an object`);if(n===null)return c;for(let[f,p]of Object.entries(n)){let h=s.normalizeKeys?s.normalizeKeys(f):f,E=`${e}['${h}']`,C=s.valueDefinition;c.set(h,yj(t,E,p,C,a))}return c}function Ej(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case\"SHAPE\":{if(e.isArray&&!r)return[];let s=new Map;for(let[a,n]of Object.entries(e.properties))s.set(a,Ej(t,n));return s}case\"MAP\":return e.isArray&&!r?[]:new Map;case\"ABSOLUTE_PATH\":return e.default===null?null:t.projectCwd===null?Array.isArray(e.default)?e.default.map(s=>J.normalize(s)):J.isAbsolute(e.default)?J.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(s=>J.resolve(t.projectCwd,s)):J.resolve(t.projectCwd,e.default);case\"DURATION\":return Jk(e.default,e.unit);default:return e.default}}function yT(t,e,r){if(e.type===\"SECRET\"&&typeof t==\"string\"&&r.hideSecrets)return Nnt;if(e.type===\"ABSOLUTE_PATH\"&&typeof t==\"string\"&&r.getNativePaths)return fe.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let s=[];for(let a of t)s.push(yT(a,e,r));return s}if(e.type===\"MAP\"&&t instanceof Map){if(t.size===0)return;let s=new Map;for(let[a,n]of t.entries()){let c=yT(n,e.valueDefinition,r);typeof c<\"u\"&&s.set(a,c)}return s}if(e.type===\"SHAPE\"&&t instanceof Map){if(t.size===0)return;let s=new Map;for(let[a,n]of t.entries()){let c=e.properties[a],f=yT(n,c,r);typeof f<\"u\"&&s.set(a,f)}return s}return t}function Mnt(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),e.startsWith(ET)&&(e=(0,ope.default)(e.slice(ET.length)),t[e]=r);return t}function gj(){let t=`${ET}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r==\"string\")return r;return dj}async function spe(t){try{return await ce.readFilePromise(t)}catch{return Buffer.of()}}async function Unt(t,e){return Buffer.compare(...await Promise.all([spe(t),spe(e)]))===0}async function _nt(t,e){let[r,s]=await Promise.all([ce.statPromise(t),ce.statPromise(e)]);return r.dev===s.dev&&r.ino===s.ino}async function jnt({configuration:t,selfPath:e}){let r=t.get(\"yarnPath\");return t.get(\"ignorePath\")||r===null||r===e||await Hnt(r,e)?null:r}var ope,Lp,ape,lpe,cpe,hj,Rnt,ov,Fnt,Mp,ET,dj,Nnt,wI,upe,mj,IT,mT,Hnt,ze,av=Xe(()=>{Dt();wc();ope=ut(Sre()),Lp=ut(Fd());Yt();ape=ut(yne()),lpe=Ie(\"module\"),cpe=ut(Ld()),hj=Ie(\"stream\");nue();oI();R8();F8();N8();gue();O8();tm();Iue();LQ();xc();I0();pT();Pc();gT();Rp();Wo();Rnt=function(){if(!Lp.GITHUB_ACTIONS||!process.env.GITHUB_EVENT_PATH)return!1;let t=fe.toPortablePath(process.env.GITHUB_EVENT_PATH),e;try{e=ce.readJsonSync(t)}catch{return!1}return!(!(\"repository\"in e)||!e.repository||(e.repository.private??!0))}(),ov=new Set([\"@yarnpkg/plugin-constraints\",\"@yarnpkg/plugin-exec\",\"@yarnpkg/plugin-interactive-tools\",\"@yarnpkg/plugin-stage\",\"@yarnpkg/plugin-typescript\",\"@yarnpkg/plugin-version\",\"@yarnpkg/plugin-workspace-tools\"]),Fnt=new Set([\"isTestEnv\",\"injectNpmUser\",\"injectNpmPassword\",\"injectNpm2FaToken\",\"zipDataEpilogue\",\"cacheCheckpointOverride\",\"cacheVersionOverride\",\"lockfileVersionOverride\",\"osOverride\",\"cpuOverride\",\"libcOverride\",\"binFolder\",\"version\",\"flags\",\"profile\",\"gpg\",\"ignoreNode\",\"wrapOutput\",\"home\",\"confDir\",\"registry\",\"ignoreCwd\"]),Mp=/^(?!v)[a-z0-9._-]+$/i,ET=\"yarn_\",dj=\".yarnrc.yml\",Nnt=\"********\",wI=(C=>(C.ANY=\"ANY\",C.BOOLEAN=\"BOOLEAN\",C.ABSOLUTE_PATH=\"ABSOLUTE_PATH\",C.LOCATOR=\"LOCATOR\",C.LOCATOR_LOOSE=\"LOCATOR_LOOSE\",C.NUMBER=\"NUMBER\",C.STRING=\"STRING\",C.DURATION=\"DURATION\",C.SECRET=\"SECRET\",C.SHAPE=\"SHAPE\",C.MAP=\"MAP\",C))(wI||{}),upe=ht,mj=(c=>(c.MILLISECONDS=\"ms\",c.SECONDS=\"s\",c.MINUTES=\"m\",c.HOURS=\"h\",c.DAYS=\"d\",c.WEEKS=\"w\",c))(mj||{}),IT=(r=>(r.JUNCTIONS=\"junctions\",r.SYMLINKS=\"symlinks\",r))(IT||{}),mT={lastUpdateCheck:{description:\"Last timestamp we checked whether new Yarn versions were available\",type:\"STRING\",default:null},yarnPath:{description:\"Path to the local executable that must be used over the global one\",type:\"ABSOLUTE_PATH\",default:null},ignorePath:{description:\"If true, the local executable will be ignored when using the global one\",type:\"BOOLEAN\",default:!1},globalFolder:{description:\"Folder where all system-global files are stored\",type:\"ABSOLUTE_PATH\",default:G8()},cacheFolder:{description:\"Folder where the cache files must be written\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/cache\"},compressionLevel:{description:\"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)\",type:\"NUMBER\",values:[\"mixed\",0,1,2,3,4,5,6,7,8,9],default:0},virtualFolder:{description:\"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/__virtual__\"},installStatePath:{description:\"Path of the file where the install state will be persisted\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/install-state.gz\"},immutablePatterns:{description:\"Array of glob patterns; files matching them won't be allowed to change during immutable installs\",type:\"STRING\",default:[],isArray:!0},rcFilename:{description:\"Name of the files where the configuration can be found\",type:\"STRING\",default:gj()},enableGlobalCache:{description:\"If true, the system-wide cache folder will be used regardless of `cache-folder`\",type:\"BOOLEAN\",default:!0},cacheMigrationMode:{description:\"Defines the conditions under which Yarn upgrades should cause the cache archives to be regenerated.\",type:\"STRING\",values:[\"always\",\"match-spec\",\"required-only\"],default:\"always\"},enableColors:{description:\"If true, the CLI is allowed to use colors in its output\",type:\"BOOLEAN\",default:Zk,defaultText:\"<dynamic>\"},enableHyperlinks:{description:\"If true, the CLI is allowed to use hyperlinks in its output\",type:\"BOOLEAN\",default:X4,defaultText:\"<dynamic>\"},enableInlineBuilds:{description:\"If true, the CLI will print the build output on the command line\",type:\"BOOLEAN\",default:Lp.isCI,defaultText:\"<dynamic>\"},enableMessageNames:{description:\"If true, the CLI will prefix most messages with codes suitable for search engines\",type:\"BOOLEAN\",default:!0},enableProgressBars:{description:\"If true, the CLI is allowed to show a progress bar for long-running events\",type:\"BOOLEAN\",default:!Lp.isCI,defaultText:\"<dynamic>\"},enableTimers:{description:\"If true, the CLI is allowed to print the time spent executing commands\",type:\"BOOLEAN\",default:!0},enableTips:{description:\"If true, installs will print a helpful message every day of the week\",type:\"BOOLEAN\",default:!Lp.isCI,defaultText:\"<dynamic>\"},preferInteractive:{description:\"If true, the CLI will automatically use the interactive mode when called from a TTY\",type:\"BOOLEAN\",default:!1},preferTruncatedLines:{description:\"If true, the CLI will truncate lines that would go beyond the size of the terminal\",type:\"BOOLEAN\",default:!1},progressBarStyle:{description:\"Which style of progress bar should be used (only when progress bars are enabled)\",type:\"STRING\",default:void 0,defaultText:\"<dynamic>\"},defaultLanguageName:{description:\"Default language mode that should be used when a package doesn't offer any insight\",type:\"STRING\",default:\"node\"},defaultProtocol:{description:\"Default resolution protocol used when resolving pure semver and tag ranges\",type:\"STRING\",default:\"npm:\"},enableTransparentWorkspaces:{description:\"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol\",type:\"BOOLEAN\",default:!0},supportedArchitectures:{description:\"Architectures that Yarn will fetch and inject into the resolver\",type:\"SHAPE\",properties:{os:{description:\"Array of supported process.platform strings, or null to target them all\",type:\"STRING\",isArray:!0,isNullable:!0,default:[\"current\"]},cpu:{description:\"Array of supported process.arch strings, or null to target them all\",type:\"STRING\",isArray:!0,isNullable:!0,default:[\"current\"]},libc:{description:\"Array of supported libc libraries, or null to target them all\",type:\"STRING\",isArray:!0,isNullable:!0,default:[\"current\"]}}},enableMirror:{description:\"If true, the downloaded packages will be retrieved and stored in both the local and global folders\",type:\"BOOLEAN\",default:!0},enableNetwork:{description:\"If false, Yarn will refuse to use the network if required to\",type:\"BOOLEAN\",default:!0},enableOfflineMode:{description:\"If true, Yarn will attempt to retrieve files and metadata from the global cache rather than the network\",type:\"BOOLEAN\",default:!1},httpProxy:{description:\"URL of the http proxy that must be used for outgoing http requests\",type:\"STRING\",default:null},httpsProxy:{description:\"URL of the http proxy that must be used for outgoing https requests\",type:\"STRING\",default:null},unsafeHttpWhitelist:{description:\"List of the hostnames for which http queries are allowed (glob patterns are supported)\",type:\"STRING\",default:[],isArray:!0},httpTimeout:{description:\"Timeout of each http request\",type:\"DURATION\",unit:\"ms\",default:\"1m\"},httpRetry:{description:\"Retry times on http failure\",type:\"NUMBER\",default:3},networkConcurrency:{description:\"Maximal number of concurrent requests\",type:\"NUMBER\",default:50},taskPoolConcurrency:{description:\"Maximal amount of concurrent heavy task processing\",type:\"NUMBER\",default:fj()},taskPoolMode:{description:\"Execution strategy for heavy tasks\",type:\"STRING\",values:[\"async\",\"workers\"],default:\"workers\"},networkSettings:{description:\"Network settings per hostname (glob patterns are supported)\",type:\"MAP\",valueDefinition:{description:\"\",type:\"SHAPE\",properties:{httpsCaFilePath:{description:\"Path to file containing one or multiple Certificate Authority signing certificates\",type:\"ABSOLUTE_PATH\",default:null},enableNetwork:{description:\"If false, the package manager will refuse to use the network if required to\",type:\"BOOLEAN\",default:null},httpProxy:{description:\"URL of the http proxy that must be used for outgoing http requests\",type:\"STRING\",default:null},httpsProxy:{description:\"URL of the http proxy that must be used for outgoing https requests\",type:\"STRING\",default:null},httpsKeyFilePath:{description:\"Path to file containing private key in PEM format\",type:\"ABSOLUTE_PATH\",default:null},httpsCertFilePath:{description:\"Path to file containing certificate chain in PEM format\",type:\"ABSOLUTE_PATH\",default:null}}}},httpsCaFilePath:{description:\"A path to a file containing one or multiple Certificate Authority signing certificates\",type:\"ABSOLUTE_PATH\",default:null},httpsKeyFilePath:{description:\"Path to file containing private key in PEM format\",type:\"ABSOLUTE_PATH\",default:null},httpsCertFilePath:{description:\"Path to file containing certificate chain in PEM format\",type:\"ABSOLUTE_PATH\",default:null},enableStrictSsl:{description:\"If false, SSL certificate errors will be ignored\",type:\"BOOLEAN\",default:!0},logFilters:{description:\"Overrides for log levels\",type:\"SHAPE\",isArray:!0,concatenateValues:!0,properties:{code:{description:\"Code of the messages covered by this override\",type:\"STRING\",default:void 0},text:{description:\"Code of the texts covered by this override\",type:\"STRING\",default:void 0},pattern:{description:\"Code of the patterns covered by this override\",type:\"STRING\",default:void 0},level:{description:\"Log level override, set to null to remove override\",type:\"STRING\",values:Object.values(eQ),isNullable:!0,default:void 0}}},enableTelemetry:{description:\"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry\",type:\"BOOLEAN\",default:!0},telemetryInterval:{description:\"Minimal amount of time between two telemetry uploads\",type:\"DURATION\",unit:\"d\",default:\"7d\"},telemetryUserId:{description:\"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.\",type:\"STRING\",default:null},enableHardenedMode:{description:\"If true, automatically enable --check-resolutions --refresh-lockfile on installs\",type:\"BOOLEAN\",default:Lp.isPR&&Rnt,defaultText:\"<true on public PRs>\"},enableScripts:{description:\"If true, packages are allowed to have install scripts by default\",type:\"BOOLEAN\",default:!0},enableStrictSettings:{description:\"If true, unknown settings will cause Yarn to abort\",type:\"BOOLEAN\",default:!0},enableImmutableCache:{description:\"If true, the cache is reputed immutable and actions that would modify it will throw\",type:\"BOOLEAN\",default:!1},enableCacheClean:{description:\"If false, disallows the `cache clean` command\",type:\"BOOLEAN\",default:!0},checksumBehavior:{description:\"Enumeration defining what to do when a checksum doesn't match expectations\",type:\"STRING\",default:\"throw\"},injectEnvironmentFiles:{description:\"List of all the environment files that Yarn should inject inside the process when it starts\",type:\"ABSOLUTE_PATH\",default:[\".env.yarn?\"],isArray:!0},packageExtensions:{description:\"Map of package corrections to apply on the dependency tree\",type:\"MAP\",valueDefinition:{description:\"The extension that will be applied to any package whose version matches the specified range\",type:\"SHAPE\",properties:{dependencies:{description:\"The set of dependencies that must be made available to the current package in order for it to work properly\",type:\"MAP\",valueDefinition:{description:\"A range\",type:\"STRING\"}},peerDependencies:{description:\"Inherited dependencies - the consumer of the package will be tasked to provide them\",type:\"MAP\",valueDefinition:{description:\"A semver range\",type:\"STRING\"}},peerDependenciesMeta:{description:\"Extra information related to the dependencies listed in the peerDependencies field\",type:\"MAP\",valueDefinition:{description:\"The peerDependency meta\",type:\"SHAPE\",properties:{optional:{description:\"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error\",type:\"BOOLEAN\",default:!1}}}}}}}};Hnt=process.platform===\"win32\"?Unt:_nt;ze=class t{constructor(e){this.isCI=Lp.isCI;this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.env={};this.limits=new Map;this.packageExtensions=null;this.startingCwd=e}static{this.deleteProperty=Symbol()}static{this.telemetry=null}static create(e,r,s){let a=new t(e);typeof r<\"u\"&&!(r instanceof Map)&&(a.projectCwd=r),a.importSettings(mT);let n=typeof s<\"u\"?s:r instanceof Map?r:new Map;for(let[c,f]of n)a.activatePlugin(c,f);return a}static async find(e,r,{strict:s=!0,usePathCheck:a=null,useRc:n=!0}={}){let c=Mnt();delete c.rcFilename;let f=new t(e),p=await t.findRcFiles(e),h=await t.findFolderRcFile(fI());h&&(p.find(me=>me.path===h.path)||p.unshift(h));let E=Eue(p.map(le=>[le.path,le.data])),C=vt.dot,S=new Set(Object.keys(mT)),P=({yarnPath:le,ignorePath:me,injectEnvironmentFiles:pe})=>({yarnPath:le,ignorePath:me,injectEnvironmentFiles:pe}),I=({yarnPath:le,ignorePath:me,injectEnvironmentFiles:pe,...Be})=>{let Ce={};for(let[g,we]of Object.entries(Be))S.has(g)&&(Ce[g]=we);return Ce},R=({yarnPath:le,ignorePath:me,...pe})=>{let Be={};for(let[Ce,g]of Object.entries(pe))S.has(Ce)||(Be[Ce]=g);return Be};if(f.importSettings(P(mT)),f.useWithSource(\"<environment>\",P(c),e,{strict:!1}),E){let[le,me]=E;f.useWithSource(le,P(me),C,{strict:!1})}if(a){if(await jnt({configuration:f,selfPath:a})!==null)return f;f.useWithSource(\"<override>\",{ignorePath:!0},e,{strict:!1,overwrite:!0})}let N=await t.findProjectCwd(e);f.startingCwd=e,f.projectCwd=N;let U=Object.assign(Object.create(null),process.env);f.env=U;let W=await Promise.all(f.get(\"injectEnvironmentFiles\").map(async le=>{let me=le.endsWith(\"?\")?await ce.readFilePromise(le.slice(0,-1),\"utf8\").catch(()=>\"\"):await ce.readFilePromise(le,\"utf8\");return(0,ape.parse)(me)}));for(let le of W)for(let[me,pe]of Object.entries(le))f.env[me]=Vk(pe,{env:U});if(f.importSettings(I(mT)),f.useWithSource(\"<environment>\",I(c),e,{strict:s}),E){let[le,me]=E;f.useWithSource(le,I(me),C,{strict:s})}let ee=le=>\"default\"in le?le.default:le,ie=new Map([[\"@@core\",rue]]);if(r!==null)for(let le of r.plugins.keys())ie.set(le,ee(r.modules.get(le)));for(let[le,me]of ie)f.activatePlugin(le,me);let ue=new Map([]);if(r!==null){let le=new Map;for(let[Be,Ce]of r.modules)le.set(Be,()=>Ce);let me=new Set,pe=async(Be,Ce)=>{let{factory:g,name:we}=Pp(Be);if(!g||me.has(we))return;let ye=new Map(le),Ae=Z=>{if((0,lpe.isBuiltin)(Z))return Pp(Z);if(ye.has(Z))return ye.get(Z)();throw new nt(`This plugin cannot access the package referenced via ${Z} which is neither a builtin, nor an exposed entry`)},se=await qE(async()=>ee(await g(Ae)),Z=>`${Z} (when initializing ${we}, defined in ${Ce})`);le.set(we,()=>se),me.add(we),ue.set(we,se)};if(c.plugins)for(let Be of c.plugins.split(\";\")){let Ce=J.resolve(e,fe.toPortablePath(Be));await pe(Ce,\"<environment>\")}for(let{path:Be,cwd:Ce,data:g}of p)if(n&&Array.isArray(g.plugins))for(let we of g.plugins){let ye=typeof we!=\"string\"?we.path:we,Ae=we?.spec??\"\",se=we?.checksum??\"\";if(ov.has(Ae))continue;let Z=J.resolve(Ce,fe.toPortablePath(ye));if(!await ce.existsPromise(Z)){if(!Ae){let mt=Ht(f,J.basename(Z,\".cjs\"),ht.NAME),j=Ht(f,\".gitignore\",ht.NAME),rt=Ht(f,f.values.get(\"rcFilename\"),ht.NAME),Fe=Ht(f,\"https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored\",ht.URL);throw new nt(`Missing source for the ${mt} plugin - please try to remove the plugin from ${rt} then reinstall it manually. This error usually occurs because ${j} is incorrect, check ${Fe} to make sure your plugin folder isn't gitignored.`)}if(!Ae.match(/^https?:/)){let mt=Ht(f,J.basename(Z,\".cjs\"),ht.NAME),j=Ht(f,f.values.get(\"rcFilename\"),ht.NAME);throw new nt(`Failed to recognize the source for the ${mt} plugin - please try to delete the plugin from ${j} then reinstall it manually.`)}let De=await lj(Ae,{configuration:f}),Re=us(De);if(se&&se!==Re){let mt=Ht(f,J.basename(Z,\".cjs\"),ht.NAME),j=Ht(f,f.values.get(\"rcFilename\"),ht.NAME),rt=Ht(f,`yarn plugin import ${Ae}`,ht.CODE);throw new nt(`Failed to fetch the ${mt} plugin from its remote location: its checksum seems to have changed. If this is expected, please remove the plugin from ${j} then run ${rt} to reimport it.`)}await ce.mkdirPromise(J.dirname(Z),{recursive:!0}),await ce.writeFilePromise(Z,De)}await pe(Z,Be)}}for(let[le,me]of ue)f.activatePlugin(le,me);if(f.useWithSource(\"<environment>\",R(c),e,{strict:s}),E){let[le,me]=E;f.useWithSource(le,R(me),C,{strict:s})}return f.get(\"enableGlobalCache\")&&(f.values.set(\"cacheFolder\",`${f.get(\"globalFolder\")}/cache`),f.sources.set(\"cacheFolder\",\"<internal>\")),f}static async findRcFiles(e){let r=gj(),s=[],a=e,n=null;for(;a!==n;){n=a;let c=J.join(n,r);if(ce.existsSync(c)){let f,p;try{p=await ce.readFilePromise(c,\"utf8\"),f=ls(p)}catch{let h=\"\";throw p?.match(/^\\s+(?!-)[^:]+\\s+\\S+/m)&&(h=\" (in particular, make sure you list the colons after each key name)\"),new nt(`Parse error when loading ${c}; please check it's proper Yaml${h}`)}s.unshift({path:c,cwd:n,data:f})}a=J.dirname(n)}return s}static async findFolderRcFile(e){let r=J.join(e,Er.rc),s;try{s=await ce.readFilePromise(r,\"utf8\")}catch(n){if(n.code===\"ENOENT\")return null;throw n}let a=ls(s);return{path:r,cwd:e,data:a}}static async findProjectCwd(e){let r=null,s=e,a=null;for(;s!==a;){if(a=s,ce.existsSync(J.join(a,Er.lockfile)))return a;ce.existsSync(J.join(a,Er.manifest))&&(r=a),s=J.dirname(a)}return r}static async updateConfiguration(e,r,s={}){let a=gj(),n=J.join(e,a),c=ce.existsSync(n)?ls(await ce.readFilePromise(n,\"utf8\")):{},f=!1,p;if(typeof r==\"function\"){try{p=r(c)}catch{p=r({})}if(p===c)return!1}else{p=c;for(let h of Object.keys(r)){let E=c[h],C=r[h],S;if(typeof C==\"function\")try{S=C(E)}catch{S=C(void 0)}else S=C;E!==S&&(S===t.deleteProperty?delete p[h]:p[h]=S,f=!0)}if(!f)return!1}return await ce.changeFilePromise(n,nl(p),{automaticNewlines:!0}),!0}static async addPlugin(e,r){r.length!==0&&await t.updateConfiguration(e,s=>{let a=s.plugins??[];if(a.length===0)return{...s,plugins:r};let n=[],c=[...r];for(let f of a){let p=typeof f!=\"string\"?f.path:f,h=c.find(E=>E.path===p);h?(n.push(h),c=c.filter(E=>E!==h)):n.push(f)}return n.push(...c),{...s,plugins:n}})}static async updateHomeConfiguration(e){let r=fI();return await t.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration<\"u\"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,s]of Object.entries(e))if(s!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings \"${r}\"`);this.settings.set(r,s),this.values.set(r,Ej(this,s))}}useWithSource(e,r,s,a){try{this.use(e,r,s,a)}catch(n){throw n.message+=` (in ${Ht(this,e,ht.PATH)})`,n}}use(e,r,s,{strict:a=!0,overwrite:n=!1}={}){a=a&&this.get(\"enableStrictSettings\");for(let c of[\"enableStrictSettings\",...Object.keys(r)]){let f=r[c],p=H8(f);if(p&&(e=p),typeof f>\"u\"||c===\"plugins\"||e===\"<environment>\"&&Fnt.has(c))continue;if(c===\"rcFilename\")throw new nt(`The rcFilename settings can only be set via ${`${ET}RC_FILENAME`.toUpperCase()}, not via a rc file`);let h=this.settings.get(c);if(!h){let C=fI(),S=e[0]!==\"<\"?J.dirname(e):null;if(a&&!(S!==null?C===S:!1))throw new nt(`Unrecognized or legacy configuration settings found: ${c} - run \"yarn config\" to see the list of settings supported in Yarn`);this.invalid.set(c,e);continue}if(this.sources.has(c)&&!(n||h.type===\"MAP\"||h.isArray&&h.concatenateValues))continue;let E;try{E=yj(this,c,f,h,s)}catch(C){throw C.message+=` in ${Ht(this,e,ht.PATH)}`,C}if(c===\"enableStrictSettings\"&&e!==\"<environment>\"){a=E;continue}if(h.type===\"MAP\"){let C=this.values.get(c);this.values.set(c,new Map(n?[...C,...E]:[...E,...C])),this.sources.set(c,`${this.sources.get(c)}, ${e}`)}else if(h.isArray&&h.concatenateValues){let C=this.values.get(c);this.values.set(c,n?[...C,...E]:[...E,...C]),this.sources.set(c,`${this.sources.get(c)}, ${e}`)}else this.values.set(c,E),this.sources.set(c,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key \"${e}\"`);return this.values.get(e)}getSpecial(e,{hideSecrets:r=!1,getNativePaths:s=!1}){let a=this.get(e),n=this.settings.get(e);if(typeof n>\"u\")throw new nt(`Couldn't find a configuration settings named \"${e}\"`);return yT(a,n,{hideSecrets:r,getNativePaths:s})}getSubprocessStreams(e,{header:r,prefix:s,report:a}){let n,c,f=ce.createWriteStream(e);if(this.get(\"enableInlineBuilds\")){let p=a.createStreamReporter(`${s} ${Ht(this,\"STDOUT\",\"green\")}`),h=a.createStreamReporter(`${s} ${Ht(this,\"STDERR\",\"red\")}`);n=new hj.PassThrough,n.pipe(p),n.pipe(f),c=new hj.PassThrough,c.pipe(h),c.pipe(f)}else n=f,c=f,typeof r<\"u\"&&n.write(`${r}\n`);return{stdout:n,stderr:c}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let s of r.resolvers||[])e.push(new s);return new rm([new FQ,new Ei,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let s of r.fetchers||[])e.push(new s);return new aI([new lI,new cI,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let s of r.linkers||[])e.push(new s);return e}getSupportedArchitectures(){let e=sv(),r=this.get(\"supportedArchitectures\"),s=r.get(\"os\");s!==null&&(s=s.map(c=>c===\"current\"?e.os:c));let a=r.get(\"cpu\");a!==null&&(a=a.map(c=>c===\"current\"?e.cpu:c));let n=r.get(\"libc\");return n!==null&&(n=Wl(n,c=>c===\"current\"?e.libc??Wl.skip:c)),{os:s,cpu:a,libc:n}}isInteractive({interactive:e,stdout:r}){return r.isTTY?e??this.get(\"preferInteractive\"):!1}async getPackageExtensions(){if(this.packageExtensions!==null)return this.packageExtensions;this.packageExtensions=new Map;let e=this.packageExtensions,r=(s,a,{userProvided:n=!1}={})=>{if(!cl(s.range))throw new Error(\"Only semver ranges are allowed as keys for the packageExtensions setting\");let c=new Ut;c.load(a,{yamlCompatibilityMode:!0});let f=xB(e,s.identHash),p=[];f.push([s.range,p]);let h={status:\"inactive\",userProvided:n,parentDescriptor:s};for(let E of c.dependencies.values())p.push({...h,type:\"Dependency\",descriptor:E});for(let E of c.peerDependencies.values())p.push({...h,type:\"PeerDependency\",descriptor:E});for(let[E,C]of c.peerDependenciesMeta)for(let[S,P]of Object.entries(C))p.push({...h,type:\"PeerDependencyMeta\",selector:E,key:S,value:P})};await this.triggerHook(s=>s.registerPackageExtensions,this,r);for(let[s,a]of this.get(\"packageExtensions\"))r(C0(s,!0),Yk(a),{userProvided:!0});return e}normalizeLocator(e){return cl(e.reference)?Ws(e,`${this.get(\"defaultProtocol\")}${e.reference}`):Mp.test(e.reference)?Ws(e,`${this.get(\"defaultProtocol\")}${e.reference}`):e}normalizeDependency(e){return cl(e.range)?On(e,`${this.get(\"defaultProtocol\")}${e.range}`):Mp.test(e.range)?On(e,`${this.get(\"defaultProtocol\")}${e.range}`):e}normalizeDependencyMap(e){return new Map([...e].map(([r,s])=>[r,this.normalizeDependency(s)]))}normalizePackage(e,{packageExtensions:r}){let s=LB(e),a=r.get(e.identHash);if(typeof a<\"u\"){let c=e.version;if(c!==null){for(let[f,p]of a)if(Zf(c,f))for(let h of p)switch(h.status===\"inactive\"&&(h.status=\"redundant\"),h.type){case\"Dependency\":typeof s.dependencies.get(h.descriptor.identHash)>\"u\"&&(h.status=\"active\",s.dependencies.set(h.descriptor.identHash,this.normalizeDependency(h.descriptor)));break;case\"PeerDependency\":typeof s.peerDependencies.get(h.descriptor.identHash)>\"u\"&&(h.status=\"active\",s.peerDependencies.set(h.descriptor.identHash,h.descriptor));break;case\"PeerDependencyMeta\":{let E=s.peerDependenciesMeta.get(h.selector);(typeof E>\"u\"||!Object.hasOwn(E,h.key)||E[h.key]!==h.value)&&(h.status=\"active\",Yl(s.peerDependenciesMeta,h.selector,()=>({}))[h.key]=h.value)}break;default:G4(h)}}}let n=c=>c.scope?`${c.scope}__${c.name}`:`${c.name}`;for(let c of s.peerDependenciesMeta.keys()){let f=Sa(c);s.peerDependencies.has(f.identHash)||s.peerDependencies.set(f.identHash,On(f,\"*\"))}for(let c of s.peerDependencies.values()){if(c.scope===\"types\")continue;let f=n(c),p=Da(\"types\",f),h=un(p);s.peerDependencies.has(p.identHash)||s.peerDependenciesMeta.has(h)||s.dependencies.has(p.identHash)||(s.peerDependencies.set(p.identHash,On(p,\"*\")),s.peerDependenciesMeta.set(h,{optional:!0}))}return s.dependencies=new Map(qs(s.dependencies,([,c])=>al(c))),s.peerDependencies=new Map(qs(s.peerDependencies,([,c])=>al(c))),s}getLimit(e){return Yl(this.limits,e,()=>(0,cpe.default)(this.get(e)))}async triggerHook(e,...r){for(let s of this.plugins.values()){let a=s.hooks;if(!a)continue;let n=e(a);n&&await n(...r)}}async triggerMultipleHooks(e,r){for(let s of r)await this.triggerHook(e,...s)}async reduceHook(e,r,...s){let a=r;for(let n of this.plugins.values()){let c=n.hooks;if(!c)continue;let f=e(c);f&&(a=await f(a,...s))}return a}async firstHook(e,...r){for(let s of this.plugins.values()){let a=s.hooks;if(!a)continue;let n=e(a);if(!n)continue;let c=await n(...r);if(typeof c<\"u\")return c}return null}}});var qr={};Vt(qr,{EndStrategy:()=>Bj,ExecError:()=>CT,PipeError:()=>lv,execvp:()=>Aj,pipevp:()=>Wu});function om(t){return t!==null&&typeof t.fd==\"number\"}function Ij(){}function Cj(){for(let t of am)t.kill()}async function Wu(t,e,{cwd:r,env:s=process.env,strict:a=!1,stdin:n=null,stdout:c,stderr:f,end:p=2}){let h=[\"pipe\",\"pipe\",\"pipe\"];n===null?h[0]=\"ignore\":om(n)&&(h[0]=n),om(c)&&(h[1]=c),om(f)&&(h[2]=f);let E=(0,wj.default)(t,e,{cwd:fe.fromPortablePath(r),env:{...s,PWD:fe.fromPortablePath(r)},stdio:h});am.add(E),am.size===1&&(process.on(\"SIGINT\",Ij),process.on(\"SIGTERM\",Cj)),!om(n)&&n!==null&&n.pipe(E.stdin),om(c)||E.stdout.pipe(c,{end:!1}),om(f)||E.stderr.pipe(f,{end:!1});let C=()=>{for(let S of new Set([c,f]))om(S)||S.end()};return new Promise((S,P)=>{E.on(\"error\",I=>{am.delete(E),am.size===0&&(process.off(\"SIGINT\",Ij),process.off(\"SIGTERM\",Cj)),(p===2||p===1)&&C(),P(I)}),E.on(\"close\",(I,R)=>{am.delete(E),am.size===0&&(process.off(\"SIGINT\",Ij),process.off(\"SIGTERM\",Cj)),(p===2||p===1&&I!==0)&&C(),I===0||!a?S({code:vj(I,R)}):P(new lv({fileName:t,code:I,signal:R}))})})}async function Aj(t,e,{cwd:r,env:s=process.env,encoding:a=\"utf8\",strict:n=!1}){let c=[\"ignore\",\"pipe\",\"pipe\"],f=[],p=[],h=fe.fromPortablePath(r);typeof s.PWD<\"u\"&&(s={...s,PWD:h});let E=(0,wj.default)(t,e,{cwd:h,env:s,stdio:c});return E.stdout.on(\"data\",C=>{f.push(C)}),E.stderr.on(\"data\",C=>{p.push(C)}),await new Promise((C,S)=>{E.on(\"error\",P=>{let I=ze.create(r),R=Ht(I,t,ht.PATH);S(new jt(1,`Process ${R} failed to spawn`,N=>{N.reportError(1,`  ${Kf(I,{label:\"Thrown Error\",value:_u(ht.NO_HINT,P.message)})}`)}))}),E.on(\"close\",(P,I)=>{let R=a===\"buffer\"?Buffer.concat(f):Buffer.concat(f).toString(a),N=a===\"buffer\"?Buffer.concat(p):Buffer.concat(p).toString(a);P===0||!n?C({code:vj(P,I),stdout:R,stderr:N}):S(new CT({fileName:t,code:P,signal:I,stdout:R,stderr:N}))})})}function vj(t,e){let r=Gnt.get(e);return typeof r<\"u\"?128+r:t??1}function qnt(t,e,{configuration:r,report:s}){s.reportError(1,`  ${Kf(r,t!==null?{label:\"Exit Code\",value:_u(ht.NUMBER,t)}:{label:\"Exit Signal\",value:_u(ht.CODE,e)})}`)}var wj,Bj,lv,CT,am,Gnt,dT=Xe(()=>{Dt();wj=ut(_U());av();Tc();xc();Bj=(s=>(s[s.Never=0]=\"Never\",s[s.ErrorCode=1]=\"ErrorCode\",s[s.Always=2]=\"Always\",s))(Bj||{}),lv=class extends jt{constructor({fileName:e,code:r,signal:s}){let a=ze.create(J.cwd()),n=Ht(a,e,ht.PATH);super(1,`Child ${n} reported an error`,c=>{qnt(r,s,{configuration:a,report:c})}),this.code=vj(r,s)}},CT=class extends lv{constructor({fileName:e,code:r,signal:s,stdout:a,stderr:n}){super({fileName:e,code:r,signal:s}),this.stdout=a,this.stderr=n}};am=new Set;Gnt=new Map([[\"SIGINT\",2],[\"SIGQUIT\",3],[\"SIGKILL\",9],[\"SIGTERM\",15]])});function Ape(t){fpe=t}function cv(){return typeof Sj>\"u\"&&(Sj=fpe()),Sj}var Sj,fpe,Dj=Xe(()=>{fpe=()=>{throw new Error(\"Assertion failed: No libzip instance is available, and no factory was configured\")}});var ppe=_((wT,Pj)=>{var Wnt=Object.assign({},Ie(\"fs\")),bj=function(){var t=typeof document<\"u\"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename<\"u\"&&(t=t||__filename),function(e){e=e||{};var r=typeof e<\"u\"?e:{},s,a;r.ready=new Promise(function(Ke,st){s=Ke,a=st});var n={},c;for(c in r)r.hasOwnProperty(c)&&(n[c]=r[c]);var f=[],p=\"./this.program\",h=function(Ke,st){throw st},E=!1,C=!0,S=\"\";function P(Ke){return r.locateFile?r.locateFile(Ke,S):S+Ke}var I,R,N,U;C&&(E?S=Ie(\"path\").dirname(S)+\"/\":S=__dirname+\"/\",I=function(st,St){var lr=Me(st);return lr?St?lr:lr.toString():(N||(N=Wnt),U||(U=Ie(\"path\")),st=U.normalize(st),N.readFileSync(st,St?null:\"utf8\"))},R=function(st){var St=I(st,!0);return St.buffer||(St=new Uint8Array(St)),we(St.buffer),St},process.argv.length>1&&(p=process.argv[1].replace(/\\\\/g,\"/\")),f=process.argv.slice(2),h=function(Ke){process.exit(Ke)},r.inspect=function(){return\"[Emscripten Module object]\"});var W=r.print||console.log.bind(console),ee=r.printErr||console.warn.bind(console);for(c in n)n.hasOwnProperty(c)&&(r[c]=n[c]);n=null,r.arguments&&(f=r.arguments),r.thisProgram&&(p=r.thisProgram),r.quit&&(h=r.quit);var ie=0,ue=function(Ke){ie=Ke},le;r.wasmBinary&&(le=r.wasmBinary);var me=r.noExitRuntime||!0;typeof WebAssembly!=\"object\"&&rs(\"no native wasm support detected\");function pe(Ke,st,St){switch(st=st||\"i8\",st.charAt(st.length-1)===\"*\"&&(st=\"i32\"),st){case\"i1\":return Ve[Ke>>0];case\"i8\":return Ve[Ke>>0];case\"i16\":return mh((Ke>>1)*2);case\"i32\":return to((Ke>>2)*4);case\"i64\":return to((Ke>>2)*4);case\"float\":return Af((Ke>>2)*4);case\"double\":return dh((Ke>>3)*8);default:rs(\"invalid type for getValue: \"+st)}return null}var Be,Ce=!1,g;function we(Ke,st){Ke||rs(\"Assertion failed: \"+st)}function ye(Ke){var st=r[\"_\"+Ke];return we(st,\"Cannot call unknown function \"+Ke+\", make sure it is exported\"),st}function Ae(Ke,st,St,lr,te){var Ee={string:function(qi){var Tn=0;if(qi!=null&&qi!==0){var Ga=(qi.length<<2)+1;Tn=wi(Ga),mt(qi,Tn,Ga)}return Tn},array:function(qi){var Tn=wi(qi.length);return Fe(qi,Tn),Tn}};function Oe(qi){return st===\"string\"?De(qi):st===\"boolean\"?!!qi:qi}var dt=ye(Ke),Et=[],bt=0;if(lr)for(var tr=0;tr<lr.length;tr++){var An=Ee[St[tr]];An?(bt===0&&(bt=gf()),Et[tr]=An(lr[tr])):Et[tr]=lr[tr]}var li=dt.apply(null,Et);return li=Oe(li),bt!==0&&fc(bt),li}function se(Ke,st,St,lr){St=St||[];var te=St.every(function(Oe){return Oe===\"number\"}),Ee=st!==\"string\";return Ee&&te&&!lr?ye(Ke):function(){return Ae(Ke,st,St,arguments,lr)}}var Z=new TextDecoder(\"utf8\");function De(Ke,st){if(!Ke)return\"\";for(var St=Ke+st,lr=Ke;!(lr>=St)&&ke[lr];)++lr;return Z.decode(ke.subarray(Ke,lr))}function Re(Ke,st,St,lr){if(!(lr>0))return 0;for(var te=St,Ee=St+lr-1,Oe=0;Oe<Ke.length;++Oe){var dt=Ke.charCodeAt(Oe);if(dt>=55296&&dt<=57343){var Et=Ke.charCodeAt(++Oe);dt=65536+((dt&1023)<<10)|Et&1023}if(dt<=127){if(St>=Ee)break;st[St++]=dt}else if(dt<=2047){if(St+1>=Ee)break;st[St++]=192|dt>>6,st[St++]=128|dt&63}else if(dt<=65535){if(St+2>=Ee)break;st[St++]=224|dt>>12,st[St++]=128|dt>>6&63,st[St++]=128|dt&63}else{if(St+3>=Ee)break;st[St++]=240|dt>>18,st[St++]=128|dt>>12&63,st[St++]=128|dt>>6&63,st[St++]=128|dt&63}}return st[St]=0,St-te}function mt(Ke,st,St){return Re(Ke,ke,st,St)}function j(Ke){for(var st=0,St=0;St<Ke.length;++St){var lr=Ke.charCodeAt(St);lr>=55296&&lr<=57343&&(lr=65536+((lr&1023)<<10)|Ke.charCodeAt(++St)&1023),lr<=127?++st:lr<=2047?st+=2:lr<=65535?st+=3:st+=4}return st}function rt(Ke){var st=j(Ke)+1,St=La(st);return St&&Re(Ke,Ve,St,st),St}function Fe(Ke,st){Ve.set(Ke,st)}function Ne(Ke,st){return Ke%st>0&&(Ke+=st-Ke%st),Ke}var Pe,Ve,ke,it,Ue,x,w,b,y,F;function z(Ke){Pe=Ke,r.HEAP_DATA_VIEW=F=new DataView(Ke),r.HEAP8=Ve=new Int8Array(Ke),r.HEAP16=it=new Int16Array(Ke),r.HEAP32=x=new Int32Array(Ke),r.HEAPU8=ke=new Uint8Array(Ke),r.HEAPU16=Ue=new Uint16Array(Ke),r.HEAPU32=w=new Uint32Array(Ke),r.HEAPF32=b=new Float32Array(Ke),r.HEAPF64=y=new Float64Array(Ke)}var X=r.INITIAL_MEMORY||16777216,$,oe=[],xe=[],Te=[],lt=!1;function Ct(){if(r.preRun)for(typeof r.preRun==\"function\"&&(r.preRun=[r.preRun]);r.preRun.length;)Pt(r.preRun.shift());Ts(oe)}function qt(){lt=!0,Ts(xe)}function ir(){if(r.postRun)for(typeof r.postRun==\"function\"&&(r.postRun=[r.postRun]);r.postRun.length;)Pr(r.postRun.shift());Ts(Te)}function Pt(Ke){oe.unshift(Ke)}function gn(Ke){xe.unshift(Ke)}function Pr(Ke){Te.unshift(Ke)}var Ir=0,Or=null,on=null;function ai(Ke){Ir++,r.monitorRunDependencies&&r.monitorRunDependencies(Ir)}function Io(Ke){if(Ir--,r.monitorRunDependencies&&r.monitorRunDependencies(Ir),Ir==0&&(Or!==null&&(clearInterval(Or),Or=null),on)){var st=on;on=null,st()}}r.preloadedImages={},r.preloadedAudios={};function rs(Ke){r.onAbort&&r.onAbort(Ke),Ke+=\"\",ee(Ke),Ce=!0,g=1,Ke=\"abort(\"+Ke+\"). Build with -s ASSERTIONS=1 for more info.\";var st=new WebAssembly.RuntimeError(Ke);throw a(st),st}var $s=\"data:application/octet-stream;base64,\";function Co(Ke){return Ke.startsWith($s)}var ji=\"data:application/octet-stream;base64,AGFzbQEAAAAB/wEkYAN/f38Bf2ABfwF/YAJ/fwF/YAF/AGAEf39/fwF/YAN/f38AYAV/f39/fwF/YAJ/fwBgBH9/f38AYAABf2AFf39/fn8BfmAEf35/fwF/YAR/f35/AX5gAn9+AX9gA398fwBgA39/fgF/YAF/AX5gBn9/f39/fwF/YAN/fn8Bf2AEf39/fwF+YAV/f35/fwF/YAR/f35/AX9gA39/fgF+YAJ/fgBgAn9/AX5gBX9/f39/AGADf35/AX5gBX5+f35/AX5gA39/fwF+YAZ/fH9/f38Bf2AAAGAHf35/f39+fwF/YAV/fn9/fwF/YAV/f39/fwF+YAJ+fwF/YAJ/fAACJQYBYQFhAAMBYQFiAAEBYQFjAAABYQFkAAEBYQFlAAIBYQFmAAED5wHlAQMAAwEDAwEHDAgDFgcNEgEDDRcFAQ8DEAUQAwIBAhgECxkEAQMBBQsFAwMDARACBAMAAggLBwEAAwADGgQDGwYGABwBBgMTFBEHBwcVCx4ABAgHBAICAgAfAQICAgIGFSAAIQAiAAIBBgIHAg0LEw0FAQUCACMDAQAUAAAGBQECBQUDCwsSAgEDBQIHAQEICAACCQQEAQABCAEBCQoBAwkBAQEBBgEGBgYABAIEBAQGEQQEAAARAAEDCQEJAQAJCQkBAQECCgoAAAMPAQEBAwACAgICBQIABwAKBgwHAAADAgICBQEEBQFwAT8/BQcBAYACgIACBgkBfwFBgInBAgsH+gEzAWcCAAFoAFQBaQDqAQFqALsBAWsAwQEBbACpAQFtAKgBAW4ApwEBbwClAQFwAKMBAXEAoAEBcgCbAQFzAMABAXQAugEBdQC5AQF2AEsBdwDiAQF4AMgBAXkAxwEBegDCAQFBAMkBAUIAuAEBQwAGAUQACQFFAKYBAUYAtwEBRwC2AQFIALUBAUkAtAEBSgCzAQFLALIBAUwAsQEBTQCwAQFOAK8BAU8AvAEBUACuAQFRAK0BAVIArAEBUwAaAVQACwFVAKQBAVYAMgFXAQABWACrAQFZAKoBAVoAxgEBXwDFAQEkAMQBAmFhAL8BAmJhAL4BAmNhAL0BCXgBAEEBCz6iAeMBjgGQAVpbjwFYnwGdAVeeAV1coQFZVlWcAZoBmQGYAZcBlgGVAZQBkwGSAZEB6QHoAecB5gHlAeQB4QHfAeAB3gHdAdwB2gHbAYUB2QHYAdcB1gHVAdQB0wHSAdEB0AHPAc4BzQHMAcsBygE4wwEK1N8G5QHMDAEHfwJAIABFDQAgAEEIayIDIABBBGsoAgAiAUF4cSIAaiEFAkAgAUEBcQ0AIAFBA3FFDQEgAyADKAIAIgFrIgNBxIQBKAIASQ0BIAAgAWohACADQciEASgCAEcEQCABQf8BTQRAIAMoAggiAiABQQN2IgRBA3RB3IQBakYaIAIgAygCDCIBRgRAQbSEAUG0hAEoAgBBfiAEd3E2AgAMAwsgAiABNgIMIAEgAjYCCAwCCyADKAIYIQYCQCADIAMoAgwiAUcEQCADKAIIIgIgATYCDCABIAI2AggMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEBDAELA0AgAiEHIAQiAUEUaiICKAIAIgQNACABQRBqIQIgASgCECIEDQALIAdBADYCAAsgBkUNAQJAIAMgAygCHCICQQJ0QeSGAWoiBCgCAEYEQCAEIAE2AgAgAQ0BQbiEAUG4hAEoAgBBfiACd3E2AgAMAwsgBkEQQRQgBigCECADRhtqIAE2AgAgAUUNAgsgASAGNgIYIAMoAhAiAgRAIAEgAjYCECACIAE2AhgLIAMoAhQiAkUNASABIAI2AhQgAiABNgIYDAELIAUoAgQiAUEDcUEDRw0AQbyEASAANgIAIAUgAUF+cTYCBCADIABBAXI2AgQgACADaiAANgIADwsgAyAFTw0AIAUoAgQiAUEBcUUNAAJAIAFBAnFFBEAgBUHMhAEoAgBGBEBBzIQBIAM2AgBBwIQBQcCEASgCACAAaiIANgIAIAMgAEEBcjYCBCADQciEASgCAEcNA0G8hAFBADYCAEHIhAFBADYCAA8LIAVByIQBKAIARgRAQciEASADNgIAQbyEAUG8hAEoAgAgAGoiADYCACADIABBAXI2AgQgACADaiAANgIADwsgAUF4cSAAaiEAAkAgAUH/AU0EQCAFKAIIIgIgAUEDdiIEQQN0QdyEAWpGGiACIAUoAgwiAUYEQEG0hAFBtIQBKAIAQX4gBHdxNgIADAILIAIgATYCDCABIAI2AggMAQsgBSgCGCEGAkAgBSAFKAIMIgFHBEAgBSgCCCICQcSEASgCAEkaIAIgATYCDCABIAI2AggMAQsCQCAFQRRqIgIoAgAiBA0AIAVBEGoiAigCACIEDQBBACEBDAELA0AgAiEHIAQiAUEUaiICKAIAIgQNACABQRBqIQIgASgCECIEDQALIAdBADYCAAsgBkUNAAJAIAUgBSgCHCICQQJ0QeSGAWoiBCgCAEYEQCAEIAE2AgAgAQ0BQbiEAUG4hAEoAgBBfiACd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAE2AgAgAUUNAQsgASAGNgIYIAUoAhAiAgRAIAEgAjYCECACIAE2AhgLIAUoAhQiAkUNACABIAI2AhQgAiABNgIYCyADIABBAXI2AgQgACADaiAANgIAIANByIQBKAIARw0BQbyEASAANgIADwsgBSABQX5xNgIEIAMgAEEBcjYCBCAAIANqIAA2AgALIABB/wFNBEAgAEEDdiIBQQN0QdyEAWohAAJ/QbSEASgCACICQQEgAXQiAXFFBEBBtIQBIAEgAnI2AgAgAAwBCyAAKAIICyECIAAgAzYCCCACIAM2AgwgAyAANgIMIAMgAjYCCA8LQR8hAiADQgA3AhAgAEH///8HTQRAIABBCHYiASABQYD+P2pBEHZBCHEiAXQiAiACQYDgH2pBEHZBBHEiAnQiBCAEQYCAD2pBEHZBAnEiBHRBD3YgASACciAEcmsiAUEBdCAAIAFBFWp2QQFxckEcaiECCyADIAI2AhwgAkECdEHkhgFqIQECQAJAAkBBuIQBKAIAIgRBASACdCIHcUUEQEG4hAEgBCAHcjYCACABIAM2AgAgAyABNgIYDAELIABBAEEZIAJBAXZrIAJBH0YbdCECIAEoAgAhAQNAIAEiBCgCBEF4cSAARg0CIAJBHXYhASACQQF0IQIgBCABQQRxaiIHQRBqKAIAIgENAAsgByADNgIQIAMgBDYCGAsgAyADNgIMIAMgAzYCCAwBCyAEKAIIIgAgAzYCDCAEIAM2AgggA0EANgIYIAMgBDYCDCADIAA2AggLQdSEAUHUhAEoAgBBAWsiAEF/IAAbNgIACwuDBAEDfyACQYAETwRAIAAgASACEAIaIAAPCyAAIAJqIQMCQCAAIAFzQQNxRQRAAkAgAEEDcUUEQCAAIQIMAQsgAkEBSARAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAkEDcUUNASACIANJDQALCwJAIANBfHEiBEHAAEkNACACIARBQGoiBUsNAANAIAIgASgCADYCACACIAEoAgQ2AgQgAiABKAIINgIIIAIgASgCDDYCDCACIAEoAhA2AhAgAiABKAIUNgIUIAIgASgCGDYCGCACIAEoAhw2AhwgAiABKAIgNgIgIAIgASgCJDYCJCACIAEoAig2AiggAiABKAIsNgIsIAIgASgCMDYCMCACIAEoAjQ2AjQgAiABKAI4NgI4IAIgASgCPDYCPCABQUBrIQEgAkFAayICIAVNDQALCyACIARPDQEDQCACIAEoAgA2AgAgAUEEaiEBIAJBBGoiAiAESQ0ACwwBCyADQQRJBEAgACECDAELIAAgA0EEayIESwRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAiABLQABOgABIAIgAS0AAjoAAiACIAEtAAM6AAMgAUEEaiEBIAJBBGoiAiAETQ0ACwsgAiADSQRAA0AgAiABLQAAOgAAIAFBAWohASACQQFqIgIgA0cNAAsLIAALGgAgAARAIAAtAAEEQCAAKAIEEAYLIAAQBgsLoi4BDH8jAEEQayIMJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEH0AU0EQEG0hAEoAgAiBUEQIABBC2pBeHEgAEELSRsiCEEDdiICdiIBQQNxBEAgAUF/c0EBcSACaiIDQQN0IgFB5IQBaigCACIEQQhqIQACQCAEKAIIIgIgAUHchAFqIgFGBEBBtIQBIAVBfiADd3E2AgAMAQsgAiABNgIMIAEgAjYCCAsgBCADQQN0IgFBA3I2AgQgASAEaiIBIAEoAgRBAXI2AgQMDQsgCEG8hAEoAgAiCk0NASABBEACQEECIAJ0IgBBACAAa3IgASACdHEiAEEAIABrcUEBayIAIABBDHZBEHEiAnYiAUEFdkEIcSIAIAJyIAEgAHYiAUECdkEEcSIAciABIAB2IgFBAXZBAnEiAHIgASAAdiIBQQF2QQFxIgByIAEgAHZqIgNBA3QiAEHkhAFqKAIAIgQoAggiASAAQdyEAWoiAEYEQEG0hAEgBUF+IAN3cSIFNgIADAELIAEgADYCDCAAIAE2AggLIARBCGohACAEIAhBA3I2AgQgBCAIaiICIANBA3QiASAIayIDQQFyNgIEIAEgBGogAzYCACAKBEAgCkEDdiIBQQN0QdyEAWohB0HIhAEoAgAhBAJ/IAVBASABdCIBcUUEQEG0hAEgASAFcjYCACAHDAELIAcoAggLIQEgByAENgIIIAEgBDYCDCAEIAc2AgwgBCABNgIIC0HIhAEgAjYCAEG8hAEgAzYCAAwNC0G4hAEoAgAiBkUNASAGQQAgBmtxQQFrIgAgAEEMdkEQcSICdiIBQQV2QQhxIgAgAnIgASAAdiIBQQJ2QQRxIgByIAEgAHYiAUEBdkECcSIAciABIAB2IgFBAXZBAXEiAHIgASAAdmpBAnRB5IYBaigCACIBKAIEQXhxIAhrIQMgASECA0ACQCACKAIQIgBFBEAgAigCFCIARQ0BCyAAKAIEQXhxIAhrIgIgAyACIANJIgIbIQMgACABIAIbIQEgACECDAELCyABIAhqIgkgAU0NAiABKAIYIQsgASABKAIMIgRHBEAgASgCCCIAQcSEASgCAEkaIAAgBDYCDCAEIAA2AggMDAsgAUEUaiICKAIAIgBFBEAgASgCECIARQ0EIAFBEGohAgsDQCACIQcgACIEQRRqIgIoAgAiAA0AIARBEGohAiAEKAIQIgANAAsgB0EANgIADAsLQX8hCCAAQb9/Sw0AIABBC2oiAEF4cSEIQbiEASgCACIJRQ0AQQAgCGshAwJAAkACQAJ/QQAgCEGAAkkNABpBHyAIQf///wdLDQAaIABBCHYiACAAQYD+P2pBEHZBCHEiAnQiACAAQYDgH2pBEHZBBHEiAXQiACAAQYCAD2pBEHZBAnEiAHRBD3YgASACciAAcmsiAEEBdCAIIABBFWp2QQFxckEcagsiBUECdEHkhgFqKAIAIgJFBEBBACEADAELQQAhACAIQQBBGSAFQQF2ayAFQR9GG3QhAQNAAkAgAigCBEF4cSAIayIHIANPDQAgAiEEIAciAw0AQQAhAyACIQAMAwsgACACKAIUIgcgByACIAFBHXZBBHFqKAIQIgJGGyAAIAcbIQAgAUEBdCEBIAINAAsLIAAgBHJFBEBBAiAFdCIAQQAgAGtyIAlxIgBFDQMgAEEAIABrcUEBayIAIABBDHZBEHEiAnYiAUEFdkEIcSIAIAJyIAEgAHYiAUECdkEEcSIAciABIAB2IgFBAXZBAnEiAHIgASAAdiIBQQF2QQFxIgByIAEgAHZqQQJ0QeSGAWooAgAhAAsgAEUNAQsDQCAAKAIEQXhxIAhrIgEgA0khAiABIAMgAhshAyAAIAQgAhshBCAAKAIQIgEEfyABBSAAKAIUCyIADQALCyAERQ0AIANBvIQBKAIAIAhrTw0AIAQgCGoiBiAETQ0BIAQoAhghBSAEIAQoAgwiAUcEQCAEKAIIIgBBxIQBKAIASRogACABNgIMIAEgADYCCAwKCyAEQRRqIgIoAgAiAEUEQCAEKAIQIgBFDQQgBEEQaiECCwNAIAIhByAAIgFBFGoiAigCACIADQAgAUEQaiECIAEoAhAiAA0ACyAHQQA2AgAMCQsgCEG8hAEoAgAiAk0EQEHIhAEoAgAhAwJAIAIgCGsiAUEQTwRAQbyEASABNgIAQciEASADIAhqIgA2AgAgACABQQFyNgIEIAIgA2ogATYCACADIAhBA3I2AgQMAQtByIQBQQA2AgBBvIQBQQA2AgAgAyACQQNyNgIEIAIgA2oiACAAKAIEQQFyNgIECyADQQhqIQAMCwsgCEHAhAEoAgAiBkkEQEHAhAEgBiAIayIBNgIAQcyEAUHMhAEoAgAiAiAIaiIANgIAIAAgAUEBcjYCBCACIAhBA3I2AgQgAkEIaiEADAsLQQAhACAIQS9qIgkCf0GMiAEoAgAEQEGUiAEoAgAMAQtBmIgBQn83AgBBkIgBQoCggICAgAQ3AgBBjIgBIAxBDGpBcHFB2KrVqgVzNgIAQaCIAUEANgIAQfCHAUEANgIAQYAgCyIBaiIFQQAgAWsiB3EiAiAITQ0KQeyHASgCACIEBEBB5IcBKAIAIgMgAmoiASADTQ0LIAEgBEsNCwtB8IcBLQAAQQRxDQUCQAJAQcyEASgCACIDBEBB9IcBIQADQCADIAAoAgAiAU8EQCABIAAoAgRqIANLDQMLIAAoAggiAA0ACwtBABApIgFBf0YNBiACIQVBkIgBKAIAIgNBAWsiACABcQRAIAIgAWsgACABakEAIANrcWohBQsgBSAITQ0GIAVB/v///wdLDQZB7IcBKAIAIgQEQEHkhwEoAgAiAyAFaiIAIANNDQcgACAESw0HCyAFECkiACABRw0BDAgLIAUgBmsgB3EiBUH+////B0sNBSAFECkiASAAKAIAIAAoAgRqRg0EIAEhAAsCQCAAQX9GDQAgCEEwaiAFTQ0AQZSIASgCACIBIAkgBWtqQQAgAWtxIgFB/v///wdLBEAgACEBDAgLIAEQKUF/RwRAIAEgBWohBSAAIQEMCAtBACAFaxApGgwFCyAAIgFBf0cNBgwECwALQQAhBAwHC0EAIQEMBQsgAUF/Rw0CC0HwhwFB8IcBKAIAQQRyNgIACyACQf7///8HSw0BIAIQKSEBQQAQKSEAIAFBf0YNASAAQX9GDQEgACABTQ0BIAAgAWsiBSAIQShqTQ0BC0HkhwFB5IcBKAIAIAVqIgA2AgBB6IcBKAIAIABJBEBB6IcBIAA2AgALAkACQAJAQcyEASgCACIHBEBB9IcBIQADQCABIAAoAgAiAyAAKAIEIgJqRg0CIAAoAggiAA0ACwwCC0HEhAEoAgAiAEEAIAAgAU0bRQRAQcSEASABNgIAC0EAIQBB+IcBIAU2AgBB9IcBIAE2AgBB1IQBQX82AgBB2IQBQYyIASgCADYCAEGAiAFBADYCAANAIABBA3QiA0HkhAFqIANB3IQBaiICNgIAIANB6IQBaiACNgIAIABBAWoiAEEgRw0AC0HAhAEgBUEoayIDQXggAWtBB3FBACABQQhqQQdxGyIAayICNgIAQcyEASAAIAFqIgA2AgAgACACQQFyNgIEIAEgA2pBKDYCBEHQhAFBnIgBKAIANgIADAILIAAtAAxBCHENACADIAdLDQAgASAHTQ0AIAAgAiAFajYCBEHMhAEgB0F4IAdrQQdxQQAgB0EIakEHcRsiAGoiAjYCAEHAhAFBwIQBKAIAIAVqIgEgAGsiADYCACACIABBAXI2AgQgASAHakEoNgIEQdCEAUGciAEoAgA2AgAMAQtBxIQBKAIAIAFLBEBBxIQBIAE2AgALIAEgBWohAkH0hwEhAAJAAkACQAJAAkACQANAIAIgACgCAEcEQCAAKAIIIgANAQwCCwsgAC0ADEEIcUUNAQtB9IcBIQADQCAHIAAoAgAiAk8EQCACIAAoAgRqIgQgB0sNAwsgACgCCCEADAALAAsgACABNgIAIAAgACgCBCAFajYCBCABQXggAWtBB3FBACABQQhqQQdxG2oiCSAIQQNyNgIEIAJBeCACa0EHcUEAIAJBCGpBB3EbaiIFIAggCWoiBmshAiAFIAdGBEBBzIQBIAY2AgBBwIQBQcCEASgCACACaiIANgIAIAYgAEEBcjYCBAwDCyAFQciEASgCAEYEQEHIhAEgBjYCAEG8hAFBvIQBKAIAIAJqIgA2AgAgBiAAQQFyNgIEIAAgBmogADYCAAwDCyAFKAIEIgBBA3FBAUYEQCAAQXhxIQcCQCAAQf8BTQRAIAUoAggiAyAAQQN2IgBBA3RB3IQBakYaIAMgBSgCDCIBRgRAQbSEAUG0hAEoAgBBfiAAd3E2AgAMAgsgAyABNgIMIAEgAzYCCAwBCyAFKAIYIQgCQCAFIAUoAgwiAUcEQCAFKAIIIgAgATYCDCABIAA2AggMAQsCQCAFQRRqIgAoAgAiAw0AIAVBEGoiACgCACIDDQBBACEBDAELA0AgACEEIAMiAUEUaiIAKAIAIgMNACABQRBqIQAgASgCECIDDQALIARBADYCAAsgCEUNAAJAIAUgBSgCHCIDQQJ0QeSGAWoiACgCAEYEQCAAIAE2AgAgAQ0BQbiEAUG4hAEoAgBBfiADd3E2AgAMAgsgCEEQQRQgCCgCECAFRhtqIAE2AgAgAUUNAQsgASAINgIYIAUoAhAiAARAIAEgADYCECAAIAE2AhgLIAUoAhQiAEUNACABIAA2AhQgACABNgIYCyAFIAdqIQUgAiAHaiECCyAFIAUoAgRBfnE2AgQgBiACQQFyNgIEIAIgBmogAjYCACACQf8BTQRAIAJBA3YiAEEDdEHchAFqIQICf0G0hAEoAgAiAUEBIAB0IgBxRQRAQbSEASAAIAFyNgIAIAIMAQsgAigCCAshACACIAY2AgggACAGNgIMIAYgAjYCDCAGIAA2AggMAwtBHyEAIAJB////B00EQCACQQh2IgAgAEGA/j9qQRB2QQhxIgN0IgAgAEGA4B9qQRB2QQRxIgF0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAEgA3IgAHJrIgBBAXQgAiAAQRVqdkEBcXJBHGohAAsgBiAANgIcIAZCADcCECAAQQJ0QeSGAWohBAJAQbiEASgCACIDQQEgAHQiAXFFBEBBuIQBIAEgA3I2AgAgBCAGNgIAIAYgBDYCGAwBCyACQQBBGSAAQQF2ayAAQR9GG3QhACAEKAIAIQEDQCABIgMoAgRBeHEgAkYNAyAAQR12IQEgAEEBdCEAIAMgAUEEcWoiBCgCECIBDQALIAQgBjYCECAGIAM2AhgLIAYgBjYCDCAGIAY2AggMAgtBwIQBIAVBKGsiA0F4IAFrQQdxQQAgAUEIakEHcRsiAGsiAjYCAEHMhAEgACABaiIANgIAIAAgAkEBcjYCBCABIANqQSg2AgRB0IQBQZyIASgCADYCACAHIARBJyAEa0EHcUEAIARBJ2tBB3EbakEvayIAIAAgB0EQakkbIgJBGzYCBCACQfyHASkCADcCECACQfSHASkCADcCCEH8hwEgAkEIajYCAEH4hwEgBTYCAEH0hwEgATYCAEGAiAFBADYCACACQRhqIQADQCAAQQc2AgQgAEEIaiEBIABBBGohACABIARJDQALIAIgB0YNAyACIAIoAgRBfnE2AgQgByACIAdrIgRBAXI2AgQgAiAENgIAIARB/wFNBEAgBEEDdiIAQQN0QdyEAWohAgJ/QbSEASgCACIBQQEgAHQiAHFFBEBBtIQBIAAgAXI2AgAgAgwBCyACKAIICyEAIAIgBzYCCCAAIAc2AgwgByACNgIMIAcgADYCCAwEC0EfIQAgB0IANwIQIARB////B00EQCAEQQh2IgAgAEGA/j9qQRB2QQhxIgJ0IgAgAEGA4B9qQRB2QQRxIgF0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAEgAnIgAHJrIgBBAXQgBCAAQRVqdkEBcXJBHGohAAsgByAANgIcIABBAnRB5IYBaiEDAkBBuIQBKAIAIgJBASAAdCIBcUUEQEG4hAEgASACcjYCACADIAc2AgAgByADNgIYDAELIARBAEEZIABBAXZrIABBH0YbdCEAIAMoAgAhAQNAIAEiAigCBEF4cSAERg0EIABBHXYhASAAQQF0IQAgAiABQQRxaiIDKAIQIgENAAsgAyAHNgIQIAcgAjYCGAsgByAHNgIMIAcgBzYCCAwDCyADKAIIIgAgBjYCDCADIAY2AgggBkEANgIYIAYgAzYCDCAGIAA2AggLIAlBCGohAAwFCyACKAIIIgAgBzYCDCACIAc2AgggB0EANgIYIAcgAjYCDCAHIAA2AggLQcCEASgCACIAIAhNDQBBwIQBIAAgCGsiATYCAEHMhAFBzIQBKAIAIgIgCGoiADYCACAAIAFBAXI2AgQgAiAIQQNyNgIEIAJBCGohAAwDC0GEhAFBMDYCAEEAIQAMAgsCQCAFRQ0AAkAgBCgCHCICQQJ0QeSGAWoiACgCACAERgRAIAAgATYCACABDQFBuIQBIAlBfiACd3EiCTYCAAwCCyAFQRBBFCAFKAIQIARGG2ogATYCACABRQ0BCyABIAU2AhggBCgCECIABEAgASAANgIQIAAgATYCGAsgBCgCFCIARQ0AIAEgADYCFCAAIAE2AhgLAkAgA0EPTQRAIAQgAyAIaiIAQQNyNgIEIAAgBGoiACAAKAIEQQFyNgIEDAELIAQgCEEDcjYCBCAGIANBAXI2AgQgAyAGaiADNgIAIANB/wFNBEAgA0EDdiIAQQN0QdyEAWohAgJ/QbSEASgCACIBQQEgAHQiAHFFBEBBtIQBIAAgAXI2AgAgAgwBCyACKAIICyEAIAIgBjYCCCAAIAY2AgwgBiACNgIMIAYgADYCCAwBC0EfIQAgA0H///8HTQRAIANBCHYiACAAQYD+P2pBEHZBCHEiAnQiACAAQYDgH2pBEHZBBHEiAXQiACAAQYCAD2pBEHZBAnEiAHRBD3YgASACciAAcmsiAEEBdCADIABBFWp2QQFxckEcaiEACyAGIAA2AhwgBkIANwIQIABBAnRB5IYBaiECAkACQCAJQQEgAHQiAXFFBEBBuIQBIAEgCXI2AgAgAiAGNgIAIAYgAjYCGAwBCyADQQBBGSAAQQF2ayAAQR9GG3QhACACKAIAIQgDQCAIIgEoAgRBeHEgA0YNAiAAQR12IQIgAEEBdCEAIAEgAkEEcWoiAigCECIIDQALIAIgBjYCECAGIAE2AhgLIAYgBjYCDCAGIAY2AggMAQsgASgCCCIAIAY2AgwgASAGNgIIIAZBADYCGCAGIAE2AgwgBiAANgIICyAEQQhqIQAMAQsCQCALRQ0AAkAgASgCHCICQQJ0QeSGAWoiACgCACABRgRAIAAgBDYCACAEDQFBuIQBIAZBfiACd3E2AgAMAgsgC0EQQRQgCygCECABRhtqIAQ2AgAgBEUNAQsgBCALNgIYIAEoAhAiAARAIAQgADYCECAAIAQ2AhgLIAEoAhQiAEUNACAEIAA2AhQgACAENgIYCwJAIANBD00EQCABIAMgCGoiAEEDcjYCBCAAIAFqIgAgACgCBEEBcjYCBAwBCyABIAhBA3I2AgQgCSADQQFyNgIEIAMgCWogAzYCACAKBEAgCkEDdiIAQQN0QdyEAWohBEHIhAEoAgAhAgJ/QQEgAHQiACAFcUUEQEG0hAEgACAFcjYCACAEDAELIAQoAggLIQAgBCACNgIIIAAgAjYCDCACIAQ2AgwgAiAANgIIC0HIhAEgCTYCAEG8hAEgAzYCAAsgAUEIaiEACyAMQRBqJAAgAAuJAQEDfyAAKAIcIgEQMAJAIAAoAhAiAiABKAIQIgMgAiADSRsiAkUNACAAKAIMIAEoAgggAhAHGiAAIAAoAgwgAmo2AgwgASABKAIIIAJqNgIIIAAgACgCFCACajYCFCAAIAAoAhAgAms2AhAgASABKAIQIAJrIgA2AhAgAA0AIAEgASgCBDYCCAsLzgEBBX8CQCAARQ0AIAAoAjAiAQRAIAAgAUEBayIBNgIwIAENAQsgACgCIARAIABBATYCICAAEBoaCyAAKAIkQQFGBEAgABBDCwJAIAAoAiwiAUUNACAALQAoDQACQCABKAJEIgNFDQAgASgCTCEEA0AgACAEIAJBAnRqIgUoAgBHBEAgAyACQQFqIgJHDQEMAgsLIAUgBCADQQFrIgJBAnRqKAIANgIAIAEgAjYCRAsLIABBAEIAQQUQDhogACgCACIBBEAgARALCyAAEAYLC1oCAn4BfwJ/AkACQCAALQAARQ0AIAApAxAiAUJ9Vg0AIAFCAnwiAiAAKQMIWA0BCyAAQQA6AABBAAwBC0EAIAAoAgQiA0UNABogACACNwMQIAMgAadqLwAACwthAgJ+AX8CQAJAIAAtAABFDQAgACkDECICQn1WDQAgAkICfCIDIAApAwhYDQELIABBADoAAA8LIAAoAgQiBEUEQA8LIAAgAzcDECAEIAKnaiIAIAFBCHY6AAEgACABOgAAC8wCAQJ/IwBBEGsiBCQAAkAgACkDGCADrYinQQFxRQRAIABBDGoiAARAIABBADYCBCAAQRw2AgALQn8hAgwBCwJ+IAAoAgAiBUUEQCAAKAIIIAEgAiADIAAoAgQRDAAMAQsgBSAAKAIIIAEgAiADIAAoAgQRCgALIgJCf1UNAAJAIANBBGsOCwEAAAAAAAAAAAABAAsCQAJAIAAtABhBEHFFBEAgAEEMaiIBBEAgAUEANgIEIAFBHDYCAAsMAQsCfiAAKAIAIgFFBEAgACgCCCAEQQhqQghBBCAAKAIEEQwADAELIAEgACgCCCAEQQhqQghBBCAAKAIEEQoAC0J/VQ0BCyAAQQxqIgAEQCAAQQA2AgQgAEEUNgIACwwBCyAEKAIIIQEgBCgCDCEDIABBDGoiAARAIAAgAzYCBCAAIAE2AgALCyAEQRBqJAAgAguTFQIOfwN+AkACQAJAAkACQAJAAkACQAJAAkACQCAAKALwLQRAIAAoAogBQQFIDQEgACgCACIEKAIsQQJHDQQgAC8B5AENAyAALwHoAQ0DIAAvAewBDQMgAC8B8AENAyAALwH0AQ0DIAAvAfgBDQMgAC8B/AENAyAALwGcAg0DIAAvAaACDQMgAC8BpAINAyAALwGoAg0DIAAvAawCDQMgAC8BsAINAyAALwG0Ag0DIAAvAbgCDQMgAC8BvAINAyAALwHAAg0DIAAvAcQCDQMgAC8ByAINAyAALwHUAg0DIAAvAdgCDQMgAC8B3AINAyAALwHgAg0DIAAvAYgCDQIgAC8BjAINAiAALwGYAg0CQSAhBgNAIAAgBkECdCIFai8B5AENAyAAIAVBBHJqLwHkAQ0DIAAgBUEIcmovAeQBDQMgACAFQQxyai8B5AENAyAGQQRqIgZBgAJHDQALDAMLIABBBzYC/C0gAkF8Rw0FIAFFDQUMBgsgAkEFaiIEIQcMAwtBASEHCyAEIAc2AiwLIAAgAEHoFmoQUSAAIABB9BZqEFEgAC8B5gEhBCAAIABB7BZqKAIAIgxBAnRqQf//AzsB6gEgAEGQFmohECAAQZQWaiERIABBjBZqIQdBACEGIAxBAE4EQEEHQYoBIAQbIQ1BBEEDIAQbIQpBfyEJA0AgBCEIIAAgCyIOQQFqIgtBAnRqLwHmASEEAkACQCAGQQFqIgVB//8DcSIPIA1B//8DcU8NACAEIAhHDQAgBSEGDAELAn8gACAIQQJ0akHMFWogCkH//wNxIA9LDQAaIAgEQEEBIQUgByAIIAlGDQEaIAAgCEECdGpBzBVqIgYgBi8BAEEBajsBACAHDAELQQEhBSAQIBEgBkH//wNxQQpJGwsiBiAGLwEAIAVqOwEAQQAhBgJ/IARFBEBBAyEKQYoBDAELQQNBBCAEIAhGIgUbIQpBBkEHIAUbCyENIAghCQsgDCAORw0ACwsgAEHaE2ovAQAhBCAAIABB+BZqKAIAIgxBAnRqQd4TakH//wM7AQBBACEGIAxBAE4EQEEHQYoBIAQbIQ1BBEEDIAQbIQpBfyEJQQAhCwNAIAQhCCAAIAsiDkEBaiILQQJ0akHaE2ovAQAhBAJAAkAgBkEBaiIFQf//A3EiDyANQf//A3FPDQAgBCAIRw0AIAUhBgwBCwJ/IAAgCEECdGpBzBVqIApB//8DcSAPSw0AGiAIBEBBASEFIAcgCCAJRg0BGiAAIAhBAnRqQcwVaiIGIAYvAQBBAWo7AQAgBwwBC0EBIQUgECARIAZB//8DcUEKSRsLIgYgBi8BACAFajsBAEEAIQYCfyAERQRAQQMhCkGKAQwBC0EDQQQgBCAIRiIFGyEKQQZBByAFGwshDSAIIQkLIAwgDkcNAAsLIAAgAEGAF2oQUSAAIAAoAvgtAn9BEiAAQYoWai8BAA0AGkERIABB0hVqLwEADQAaQRAgAEGGFmovAQANABpBDyAAQdYVai8BAA0AGkEOIABBghZqLwEADQAaQQ0gAEHaFWovAQANABpBDCAAQf4Vai8BAA0AGkELIABB3hVqLwEADQAaQQogAEH6FWovAQANABpBCSAAQeIVai8BAA0AGkEIIABB9hVqLwEADQAaQQcgAEHmFWovAQANABpBBiAAQfIVai8BAA0AGkEFIABB6hVqLwEADQAaQQQgAEHuFWovAQANABpBA0ECIABBzhVqLwEAGwsiBkEDbGoiBEERajYC+C0gACgC/C1BCmpBA3YiByAEQRtqQQN2IgRNBEAgByEEDAELIAAoAowBQQRHDQAgByEECyAEIAJBBGpPQQAgARsNASAEIAdHDQQLIANBAmqtIRIgACkDmC4hFCAAKAKgLiIBQQNqIgdBP0sNASASIAGthiAUhCESDAILIAAgASACIAMQOQwDCyABQcAARgRAIAAoAgQgACgCEGogFDcAACAAIAAoAhBBCGo2AhBBAyEHDAELIAAoAgQgACgCEGogEiABrYYgFIQ3AAAgACAAKAIQQQhqNgIQIAFBPWshByASQcAAIAFrrYghEgsgACASNwOYLiAAIAc2AqAuIABBgMEAQYDKABCHAQwBCyADQQRqrSESIAApA5guIRQCQCAAKAKgLiIBQQNqIgRBP00EQCASIAGthiAUhCESDAELIAFBwABGBEAgACgCBCAAKAIQaiAUNwAAIAAgACgCEEEIajYCEEEDIQQMAQsgACgCBCAAKAIQaiASIAGthiAUhDcAACAAIAAoAhBBCGo2AhAgAUE9ayEEIBJBwAAgAWutiCESCyAAIBI3A5guIAAgBDYCoC4gAEHsFmooAgAiC6xCgAJ9IRMgAEH4FmooAgAhCQJAAkACfwJ+AkACfwJ/IARBOk0EQCATIASthiAShCETIARBBWoMAQsgBEHAAEYEQCAAKAIEIAAoAhBqIBI3AAAgACAAKAIQQQhqNgIQIAmsIRJCBSEUQQoMAgsgACgCBCAAKAIQaiATIASthiAShDcAACAAIAAoAhBBCGo2AhAgE0HAACAEa62IIRMgBEE7awshBSAJrCESIAVBOksNASAFrSEUIAVBBWoLIQcgEiAUhiAThAwBCyAFQcAARgRAIAAoAgQgACgCEGogEzcAACAAIAAoAhBBCGo2AhAgBq1CA30hE0IFIRRBCQwCCyAAKAIEIAAoAhBqIBIgBa2GIBOENwAAIAAgACgCEEEIajYCECAFQTtrIQcgEkHAACAFa62ICyESIAatQgN9IRMgB0E7Sw0BIAetIRQgB0EEagshBCATIBSGIBKEIRMMAQsgB0HAAEYEQCAAKAIEIAAoAhBqIBI3AAAgACAAKAIQQQhqNgIQQQQhBAwBCyAAKAIEIAAoAhBqIBMgB62GIBKENwAAIAAgACgCEEEIajYCECAHQTxrIQQgE0HAACAHa62IIRMLQQAhBQNAIAAgBSIBQZDWAGotAABBAnRqQc4VajMBACEUAn8gBEE8TQRAIBQgBK2GIBOEIRMgBEEDagwBCyAEQcAARgRAIAAoAgQgACgCEGogEzcAACAAIAAoAhBBCGo2AhAgFCETQQMMAQsgACgCBCAAKAIQaiAUIASthiAThDcAACAAIAAoAhBBCGo2AhAgFEHAACAEa62IIRMgBEE9awshBCABQQFqIQUgASAGRw0ACyAAIAQ2AqAuIAAgEzcDmC4gACAAQeQBaiICIAsQhgEgACAAQdgTaiIBIAkQhgEgACACIAEQhwELIAAQiAEgAwRAAkAgACgCoC4iBEE5TgRAIAAoAgQgACgCEGogACkDmC43AAAgACAAKAIQQQhqNgIQDAELIARBGU4EQCAAKAIEIAAoAhBqIAApA5guPgAAIAAgAEGcLmo1AgA3A5guIAAgACgCEEEEajYCECAAIAAoAqAuQSBrIgQ2AqAuCyAEQQlOBH8gACgCBCAAKAIQaiAAKQOYLj0AACAAIAAoAhBBAmo2AhAgACAAKQOYLkIQiDcDmC4gACgCoC5BEGsFIAQLQQFIDQAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAAKQOYLjwAAAsgAEEANgKgLiAAQgA3A5guCwsZACAABEAgACgCABAGIAAoAgwQBiAAEAYLC6wBAQJ+Qn8hAwJAIAAtACgNAAJAAkAgACgCIEUNACACQgBTDQAgAlANASABDQELIABBDGoiAARAIABBADYCBCAAQRI2AgALQn8PCyAALQA1DQBCACEDIAAtADQNACACUA0AA0AgACABIAOnaiACIAN9QQEQDiIEQn9XBEAgAEEBOgA1Qn8gAyADUBsPCyAEUEUEQCADIAR8IgMgAloNAgwBCwsgAEEBOgA0CyADC3UCAn4BfwJAAkAgAC0AAEUNACAAKQMQIgJCe1YNACACQgR8IgMgACkDCFgNAQsgAEEAOgAADwsgACgCBCIERQRADwsgACADNwMQIAQgAqdqIgAgAUEYdjoAAyAAIAFBEHY6AAIgACABQQh2OgABIAAgAToAAAtUAgF+AX8CQAJAIAAtAABFDQAgASAAKQMQIgF8IgIgAVQNACACIAApAwhYDQELIABBADoAAEEADwsgACgCBCIDRQRAQQAPCyAAIAI3AxAgAyABp2oLdwECfyMAQRBrIgMkAEF/IQQCQCAALQAoDQAgACgCIEEAIAJBA0kbRQRAIABBDGoiAARAIABBADYCBCAAQRI2AgALDAELIAMgAjYCCCADIAE3AwAgACADQhBBBhAOQgBTDQBBACEEIABBADoANAsgA0EQaiQAIAQLVwICfgF/AkACQCAALQAARQ0AIAApAxAiAUJ7Vg0AIAFCBHwiAiAAKQMIWA0BCyAAQQA6AABBAA8LIAAoAgQiA0UEQEEADwsgACACNwMQIAMgAadqKAAAC1UCAX4BfyAABEACQCAAKQMIUA0AQgEhAQNAIAAoAgAgAkEEdGoQPiABIAApAwhaDQEgAachAiABQgF8IQEMAAsACyAAKAIAEAYgACgCKBAQIAAQBgsLZAECfwJAAkACQCAARQRAIAGnEAkiA0UNAkEYEAkiAkUNAQwDCyAAIQNBGBAJIgINAkEADwsgAxAGC0EADwsgAkIANwMQIAIgATcDCCACIAM2AgQgAkEBOgAAIAIgAEU6AAEgAgudAQICfgF/AkACQCAALQAARQ0AIAApAxAiAkJ3Vg0AIAJCCHwiAyAAKQMIWA0BCyAAQQA6AAAPCyAAKAIEIgRFBEAPCyAAIAM3AxAgBCACp2oiACABQjiIPAAHIAAgAUIwiDwABiAAIAFCKIg8AAUgACABQiCIPAAEIAAgAUIYiDwAAyAAIAFCEIg8AAIgACABQgiIPAABIAAgATwAAAvwAgICfwF+AkAgAkUNACAAIAJqIgNBAWsgAToAACAAIAE6AAAgAkEDSQ0AIANBAmsgAToAACAAIAE6AAEgA0EDayABOgAAIAAgAToAAiACQQdJDQAgA0EEayABOgAAIAAgAToAAyACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiADYCACADIAIgBGtBfHEiAmoiAUEEayAANgIAIAJBCUkNACADIAA2AgggAyAANgIEIAFBCGsgADYCACABQQxrIAA2AgAgAkEZSQ0AIAMgADYCGCADIAA2AhQgAyAANgIQIAMgADYCDCABQRBrIAA2AgAgAUEUayAANgIAIAFBGGsgADYCACABQRxrIAA2AgAgAiADQQRxQRhyIgFrIgJBIEkNACAArUKBgICAEH4hBSABIANqIQEDQCABIAU3AxggASAFNwMQIAEgBTcDCCABIAU3AwAgAUEgaiEBIAJBIGsiAkEfSw0ACwsLbwEDfyAAQQxqIQICQAJ/IAAoAiAiAUUEQEF/IQFBEgwBCyAAIAFBAWsiAzYCIEEAIQEgAw0BIABBAEIAQQIQDhogACgCACIARQ0BIAAQGkF/Sg0BQRQLIQAgAgRAIAJBADYCBCACIAA2AgALCyABC58BAgF/AX4CfwJAAn4gACgCACIDKAIkQQFGQQAgAkJ/VRtFBEAgA0EMaiIBBEAgAUEANgIEIAFBEjYCAAtCfwwBCyADIAEgAkELEA4LIgRCf1cEQCAAKAIAIQEgAEEIaiIABEAgACABKAIMNgIAIAAgASgCEDYCBAsMAQtBACACIARRDQEaIABBCGoEQCAAQRs2AgwgAEEGNgIICwtBfwsLJAEBfyAABEADQCAAKAIAIQEgACgCDBAGIAAQBiABIgANAAsLC5gBAgJ+AX8CQAJAIAAtAABFDQAgACkDECIBQndWDQAgAUIIfCICIAApAwhYDQELIABBADoAAEIADwsgACgCBCIDRQRAQgAPCyAAIAI3AxAgAyABp2oiADEABkIwhiAAMQAHQjiGhCAAMQAFQiiGhCAAMQAEQiCGhCAAMQADQhiGhCAAMQACQhCGhCAAMQABQgiGhCAAMQAAfAsjACAAQShGBEAgAhAGDwsgAgRAIAEgAkEEaygCACAAEQcACwsyACAAKAIkQQFHBEAgAEEMaiIABEAgAEEANgIEIABBEjYCAAtCfw8LIABBAEIAQQ0QDgsPACAABEAgABA2IAAQBgsLgAEBAX8gAC0AKAR/QX8FIAFFBEAgAEEMagRAIABBADYCECAAQRI2AgwLQX8PCyABECoCQCAAKAIAIgJFDQAgAiABECFBf0oNACAAKAIAIQEgAEEMaiIABEAgACABKAIMNgIAIAAgASgCEDYCBAtBfw8LIAAgAUI4QQMQDkI/h6cLC38BA38gACEBAkAgAEEDcQRAA0AgAS0AAEUNAiABQQFqIgFBA3ENAAsLA0AgASICQQRqIQEgAigCACIDQX9zIANBgYKECGtxQYCBgoR4cUUNAAsgA0H/AXFFBEAgAiAAaw8LA0AgAi0AASEDIAJBAWoiASECIAMNAAsLIAEgAGsL3wIBCH8gAEUEQEEBDwsCQCAAKAIIIgINAEEBIQQgAC8BBCIHRQRAQQEhAgwBCyAAKAIAIQgDQAJAIAMgCGoiBS0AACICQSBPBEAgAkEYdEEYdUF/Sg0BCyACQQ1NQQBBASACdEGAzABxGw0AAn8CfyACQeABcUHAAUYEQEEBIQYgA0EBagwBCyACQfABcUHgAUYEQCADQQJqIQNBACEGQQEMAgsgAkH4AXFB8AFHBEBBBCECDAULQQAhBiADQQNqCyEDQQALIQlBBCECIAMgB08NAiAFLQABQcABcUGAAUcNAkEDIQQgBg0AIAUtAAJBwAFxQYABRw0CIAkNACAFLQADQcABcUGAAUcNAgsgBCECIANBAWoiAyAHSQ0ACwsgACACNgIIAn8CQCABRQ0AAkAgAUECRw0AIAJBA0cNAEECIQIgAEECNgIICyABIAJGDQBBBSACQQFHDQEaCyACCwtIAgJ+An8jAEEQayIEIAE2AgxCASAArYYhAgNAIAQgAUEEaiIANgIMIAIiA0IBIAEoAgAiBa2GhCECIAAhASAFQX9KDQALIAMLhwUBB38CQAJAIABFBEBBxRQhAiABRQ0BIAFBADYCAEHFFA8LIAJBwABxDQEgACgCCEUEQCAAQQAQIxoLIAAoAgghBAJAIAJBgAFxBEAgBEEBa0ECTw0BDAMLIARBBEcNAgsCQCAAKAIMIgINACAAAn8gACgCACEIIABBEGohCUEAIQICQAJAAkACQCAALwEEIgUEQEEBIQQgBUEBcSEHIAVBAUcNAQwCCyAJRQ0CIAlBADYCAEEADAQLIAVBfnEhBgNAIARBAUECQQMgAiAIai0AAEEBdEHQFGovAQAiCkGAEEkbIApBgAFJG2pBAUECQQMgCCACQQFyai0AAEEBdEHQFGovAQAiBEGAEEkbIARBgAFJG2ohBCACQQJqIQIgBkECayIGDQALCwJ/IAcEQCAEQQFBAkEDIAIgCGotAABBAXRB0BRqLwEAIgJBgBBJGyACQYABSRtqIQQLIAQLEAkiB0UNASAFQQEgBUEBSxshCkEAIQVBACEGA0AgBSAHaiEDAn8gBiAIai0AAEEBdEHQFGovAQAiAkH/AE0EQCADIAI6AAAgBUEBagwBCyACQf8PTQRAIAMgAkE/cUGAAXI6AAEgAyACQQZ2QcABcjoAACAFQQJqDAELIAMgAkE/cUGAAXI6AAIgAyACQQx2QeABcjoAACADIAJBBnZBP3FBgAFyOgABIAVBA2oLIQUgBkEBaiIGIApHDQALIAcgBEEBayICakEAOgAAIAlFDQAgCSACNgIACyAHDAELIAMEQCADQQA2AgQgA0EONgIAC0EACyICNgIMIAINAEEADwsgAUUNACABIAAoAhA2AgALIAIPCyABBEAgASAALwEENgIACyAAKAIAC4MBAQR/QRIhBQJAAkAgACkDMCABWA0AIAGnIQYgACgCQCEEIAJBCHEiB0UEQCAEIAZBBHRqKAIEIgINAgsgBCAGQQR0aiIEKAIAIgJFDQAgBC0ADEUNAUEXIQUgBw0BC0EAIQIgAyAAQQhqIAMbIgAEQCAAQQA2AgQgACAFNgIACwsgAgtuAQF/IwBBgAJrIgUkAAJAIARBgMAEcQ0AIAIgA0wNACAFIAFB/wFxIAIgA2siAkGAAiACQYACSSIBGxAZIAFFBEADQCAAIAVBgAIQLiACQYACayICQf8BSw0ACwsgACAFIAIQLgsgBUGAAmokAAuBAQEBfyMAQRBrIgQkACACIANsIQICQCAAQSdGBEAgBEEMaiACEIwBIQBBACAEKAIMIAAbIQAMAQsgAUEBIAJBxABqIAARAAAiAUUEQEEAIQAMAQtBwAAgAUE/cWsiACABakHAAEEAIABBBEkbaiIAQQRrIAE2AAALIARBEGokACAAC1IBAn9BhIEBKAIAIgEgAEEDakF8cSICaiEAAkAgAkEAIAAgAU0bDQAgAD8AQRB0SwRAIAAQA0UNAQtBhIEBIAA2AgAgAQ8LQYSEAUEwNgIAQX8LNwAgAEJ/NwMQIABBADYCCCAAQgA3AwAgAEEANgIwIABC/////w83AyggAEIANwMYIABCADcDIAulAQEBf0HYABAJIgFFBEBBAA8LAkAgAARAIAEgAEHYABAHGgwBCyABQgA3AyAgAUEANgIYIAFC/////w83AxAgAUEAOwEMIAFBv4YoNgIIIAFBAToABiABQQA6AAQgAUIANwNIIAFBgIDYjXg2AkQgAUIANwMoIAFCADcDMCABQgA3AzggAUFAa0EAOwEAIAFCADcDUAsgAUEBOgAFIAFBADYCACABC1gCAn4BfwJAAkAgAC0AAEUNACAAKQMQIgMgAq18IgQgA1QNACAEIAApAwhYDQELIABBADoAAA8LIAAoAgQiBUUEQA8LIAAgBDcDECAFIAOnaiABIAIQBxoLlgEBAn8CQAJAIAJFBEAgAacQCSIFRQ0BQRgQCSIEDQIgBRAGDAELIAIhBUEYEAkiBA0BCyADBEAgA0EANgIEIANBDjYCAAtBAA8LIARCADcDECAEIAE3AwggBCAFNgIEIARBAToAACAEIAJFOgABIAAgBSABIAMQZUEASAR/IAQtAAEEQCAEKAIEEAYLIAQQBkEABSAECwubAgEDfyAALQAAQSBxRQRAAkAgASEDAkAgAiAAIgEoAhAiAAR/IAAFAn8gASABLQBKIgBBAWsgAHI6AEogASgCACIAQQhxBEAgASAAQSByNgIAQX8MAQsgAUIANwIEIAEgASgCLCIANgIcIAEgADYCFCABIAAgASgCMGo2AhBBAAsNASABKAIQCyABKAIUIgVrSwRAIAEgAyACIAEoAiQRAAAaDAILAn8gASwAS0F/SgRAIAIhAANAIAIgACIERQ0CGiADIARBAWsiAGotAABBCkcNAAsgASADIAQgASgCJBEAACAESQ0CIAMgBGohAyABKAIUIQUgAiAEawwBCyACCyEAIAUgAyAAEAcaIAEgASgCFCAAajYCFAsLCwvNBQEGfyAAKAIwIgNBhgJrIQYgACgCPCECIAMhAQNAIAAoAkQgAiAAKAJoIgRqayECIAEgBmogBE0EQCAAKAJIIgEgASADaiADEAcaAkAgAyAAKAJsIgFNBEAgACABIANrNgJsDAELIABCADcCbAsgACAAKAJoIANrIgE2AmggACAAKAJYIANrNgJYIAEgACgChC5JBEAgACABNgKELgsgAEH8gAEoAgARAwAgAiADaiECCwJAIAAoAgAiASgCBCIERQ0AIAAoAjwhBSAAIAIgBCACIARJGyICBH8gACgCSCAAKAJoaiAFaiEFIAEgBCACazYCBAJAAkACQAJAIAEoAhwiBCgCFEEBaw4CAQACCyAEQaABaiAFIAEoAgAgAkHcgAEoAgARCAAMAgsgASABKAIwIAUgASgCACACQcSAASgCABEEADYCMAwBCyAFIAEoAgAgAhAHGgsgASABKAIAIAJqNgIAIAEgASgCCCACajYCCCAAKAI8BSAFCyACaiICNgI8AkAgACgChC4iASACakEDSQ0AIAAoAmggAWshAQJAIAAoAnRBgQhPBEAgACAAIAAoAkggAWoiAi0AACACLQABIAAoAnwRAAA2AlQMAQsgAUUNACAAIAFBAWsgACgChAERAgAaCyAAKAKELiAAKAI8IgJBAUZrIgRFDQAgACABIAQgACgCgAERBQAgACAAKAKELiAEazYChC4gACgCPCECCyACQYUCSw0AIAAoAgAoAgRFDQAgACgCMCEBDAELCwJAIAAoAkQiAiAAKAJAIgNNDQAgAAJ/IAAoAjwgACgCaGoiASADSwRAIAAoAkggAWpBACACIAFrIgNBggIgA0GCAkkbIgMQGSABIANqDAELIAFBggJqIgEgA00NASAAKAJIIANqQQAgAiADayICIAEgA2siAyACIANJGyIDEBkgACgCQCADags2AkALC50CAQF/AkAgAAJ/IAAoAqAuIgFBwABGBEAgACgCBCAAKAIQaiAAKQOYLjcAACAAQgA3A5guIAAgACgCEEEIajYCEEEADAELIAFBIE4EQCAAKAIEIAAoAhBqIAApA5guPgAAIAAgAEGcLmo1AgA3A5guIAAgACgCEEEEajYCECAAIAAoAqAuQSBrIgE2AqAuCyABQRBOBEAgACgCBCAAKAIQaiAAKQOYLj0AACAAIAAoAhBBAmo2AhAgACAAKQOYLkIQiDcDmC4gACAAKAKgLkEQayIBNgKgLgsgAUEISA0BIAAgACgCECIBQQFqNgIQIAEgACgCBGogACkDmC48AAAgACAAKQOYLkIIiDcDmC4gACgCoC5BCGsLNgKgLgsLEAAgACgCCBAGIABBADYCCAvwAQECf0F/IQECQCAALQAoDQAgACgCJEEDRgRAIABBDGoEQCAAQQA2AhAgAEEXNgIMC0F/DwsCQCAAKAIgBEAgACkDGELAAINCAFINASAAQQxqBEAgAEEANgIQIABBHTYCDAtBfw8LAkAgACgCACICRQ0AIAIQMkF/Sg0AIAAoAgAhASAAQQxqIgAEQCAAIAEoAgw2AgAgACABKAIQNgIEC0F/DwsgAEEAQgBBABAOQn9VDQAgACgCACIARQ0BIAAQGhpBfw8LQQAhASAAQQA7ATQgAEEMagRAIABCADcCDAsgACAAKAIgQQFqNgIgCyABCzsAIAAtACgEfkJ/BSAAKAIgRQRAIABBDGoiAARAIABBADYCBCAAQRI2AgALQn8PCyAAQQBCAEEHEA4LC5oIAQt/IABFBEAgARAJDwsgAUFATwRAQYSEAUEwNgIAQQAPCwJ/QRAgAUELakF4cSABQQtJGyEGIABBCGsiBSgCBCIJQXhxIQQCQCAJQQNxRQRAQQAgBkGAAkkNAhogBkEEaiAETQRAIAUhAiAEIAZrQZSIASgCAEEBdE0NAgtBAAwCCyAEIAVqIQcCQCAEIAZPBEAgBCAGayIDQRBJDQEgBSAJQQFxIAZyQQJyNgIEIAUgBmoiAiADQQNyNgIEIAcgBygCBEEBcjYCBCACIAMQOwwBCyAHQcyEASgCAEYEQEHAhAEoAgAgBGoiBCAGTQ0CIAUgCUEBcSAGckECcjYCBCAFIAZqIgMgBCAGayICQQFyNgIEQcCEASACNgIAQcyEASADNgIADAELIAdByIQBKAIARgRAQbyEASgCACAEaiIDIAZJDQICQCADIAZrIgJBEE8EQCAFIAlBAXEgBnJBAnI2AgQgBSAGaiIEIAJBAXI2AgQgAyAFaiIDIAI2AgAgAyADKAIEQX5xNgIEDAELIAUgCUEBcSADckECcjYCBCADIAVqIgIgAigCBEEBcjYCBEEAIQJBACEEC0HIhAEgBDYCAEG8hAEgAjYCAAwBCyAHKAIEIgNBAnENASADQXhxIARqIgogBkkNASAKIAZrIQwCQCADQf8BTQRAIAcoAggiBCADQQN2IgJBA3RB3IQBakYaIAQgBygCDCIDRgRAQbSEAUG0hAEoAgBBfiACd3E2AgAMAgsgBCADNgIMIAMgBDYCCAwBCyAHKAIYIQsCQCAHIAcoAgwiCEcEQCAHKAIIIgJBxIQBKAIASRogAiAINgIMIAggAjYCCAwBCwJAIAdBFGoiBCgCACICDQAgB0EQaiIEKAIAIgINAEEAIQgMAQsDQCAEIQMgAiIIQRRqIgQoAgAiAg0AIAhBEGohBCAIKAIQIgINAAsgA0EANgIACyALRQ0AAkAgByAHKAIcIgNBAnRB5IYBaiICKAIARgRAIAIgCDYCACAIDQFBuIQBQbiEASgCAEF+IAN3cTYCAAwCCyALQRBBFCALKAIQIAdGG2ogCDYCACAIRQ0BCyAIIAs2AhggBygCECICBEAgCCACNgIQIAIgCDYCGAsgBygCFCICRQ0AIAggAjYCFCACIAg2AhgLIAxBD00EQCAFIAlBAXEgCnJBAnI2AgQgBSAKaiICIAIoAgRBAXI2AgQMAQsgBSAJQQFxIAZyQQJyNgIEIAUgBmoiAyAMQQNyNgIEIAUgCmoiAiACKAIEQQFyNgIEIAMgDBA7CyAFIQILIAILIgIEQCACQQhqDwsgARAJIgVFBEBBAA8LIAUgAEF8QXggAEEEaygCACICQQNxGyACQXhxaiICIAEgASACSxsQBxogABAGIAUL6QEBA38CQCABRQ0AIAJBgDBxIgIEfwJ/IAJBgCBHBEBBAiACQYAQRg0BGiADBEAgA0EANgIEIANBEjYCAAtBAA8LQQQLIQJBAAVBAQshBkEUEAkiBEUEQCADBEAgA0EANgIEIANBDjYCAAtBAA8LIAQgAUEBahAJIgU2AgAgBUUEQCAEEAZBAA8LIAUgACABEAcgAWpBADoAACAEQQA2AhAgBEIANwMIIAQgATsBBCAGDQAgBCACECNBBUcNACAEKAIAEAYgBCgCDBAGIAQQBkEAIQQgAwRAIANBADYCBCADQRI2AgALCyAEC7UBAQJ/AkACQAJAAkACQAJAAkAgAC0ABQRAIAAtAABBAnFFDQELIAAoAjAQECAAQQA2AjAgAC0ABUUNAQsgAC0AAEEIcUUNAQsgACgCNBAcIABBADYCNCAALQAFRQ0BCyAALQAAQQRxRQ0BCyAAKAI4EBAgAEEANgI4IAAtAAVFDQELIAAtAABBgAFxRQ0BCyAAKAJUIgEEfyABQQAgARAiEBkgACgCVAVBAAsQBiAAQQA2AlQLC9wMAgl/AX4jAEFAaiIGJAACQAJAAkACQAJAIAEoAjBBABAjIgVBAkZBACABKAI4QQAQIyIEQQFGGw0AIAVBAUZBACAEQQJGGw0AIAVBAkciAw0BIARBAkcNAQsgASABLwEMQYAQcjsBDEEAIQMMAQsgASABLwEMQf/vA3E7AQxBACEFIANFBEBB9eABIAEoAjAgAEEIahBpIgVFDQILIAJBgAJxBEAgBSEDDAELIARBAkcEQCAFIQMMAQtB9cYBIAEoAjggAEEIahBpIgNFBEAgBRAcDAILIAMgBTYCAAsgASABLwEMQf7/A3EgAS8BUiIFQQBHcjsBDAJAAkACQAJAAn8CQAJAIAEpAyhC/v///w9WDQAgASkDIEL+////D1YNACACQYAEcUUNASABKQNIQv////8PVA0BCyAFQYECa0H//wNxQQNJIQdBAQwBCyAFQYECa0H//wNxIQQgAkGACnFBgApHDQEgBEEDSSEHQQALIQkgBkIcEBciBEUEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIACyADEBwMBQsgAkGACHEhBQJAAkAgAkGAAnEEQAJAIAUNACABKQMgQv////8PVg0AIAEpAyhCgICAgBBUDQMLIAQgASkDKBAYIAEpAyAhDAwBCwJAAkACQCAFDQAgASkDIEL/////D1YNACABKQMoIgxC/////w9WDQEgASkDSEKAgICAEFQNBAsgASkDKCIMQv////8PVA0BCyAEIAwQGAsgASkDICIMQv////8PWgRAIAQgDBAYCyABKQNIIgxC/////w9UDQELIAQgDBAYCyAELQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAQQCCADEBwMBQtBASEKQQEgBC0AAAR+IAQpAxAFQgALp0H//wNxIAYQRyEFIAQQCCAFIAM2AgAgBw0BDAILIAMhBSAEQQJLDQELIAZCBxAXIgRFBEAgAEEIaiIABEAgAEEANgIEIABBDjYCAAsgBRAcDAMLIARBAhANIARBhxJBAhAsIAQgAS0AUhBwIAQgAS8BEBANIAQtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAsgBBAIDAILQYGyAkEHIAYQRyEDIAQQCCADIAU2AgBBASELIAMhBQsgBkIuEBciA0UEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIACyAFEBwMAgsgA0GjEkGoEiACQYACcSIHG0EEECwgB0UEQCADIAkEf0EtBSABLwEIC0H//wNxEA0LIAMgCQR/QS0FIAEvAQoLQf//A3EQDSADIAEvAQwQDSADIAsEf0HjAAUgASgCEAtB//8DcRANIAYgASgCFDYCPAJ/IAZBPGoQjQEiCEUEQEEAIQlBIQwBCwJ/IAgoAhQiBEHQAE4EQCAEQQl0DAELIAhB0AA2AhRBgMACCyEEIAgoAgRBBXQgCCgCCEELdGogCCgCAEEBdmohCSAIKAIMIAQgCCgCEEEFdGpqQaDAAWoLIQQgAyAJQf//A3EQDSADIARB//8DcRANIAMCfyALBEBBACABKQMoQhRUDQEaCyABKAIYCxASIAEpAyAhDCADAn8gAwJ/AkAgBwRAIAxC/v///w9YBEAgASkDKEL/////D1QNAgsgA0F/EBJBfwwDC0F/IAxC/v///w9WDQEaCyAMpwsQEiABKQMoIgxC/////w8gDEL/////D1QbpwsQEiADIAEoAjAiBAR/IAQvAQQFQQALQf//A3EQDSADIAEoAjQgAhBsIAVBgAYQbGpB//8DcRANIAdFBEAgAyABKAI4IgQEfyAELwEEBUEAC0H//wNxEA0gAyABLwE8EA0gAyABLwFAEA0gAyABKAJEEBIgAyABKQNIIgxC/////w8gDEL/////D1QbpxASCyADLQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAMQCCAFEBwMAgsgACAGIAMtAAAEfiADKQMQBUIACxAbIQQgAxAIIARBf0wNACABKAIwIgMEQCAAIAMQYUF/TA0BCyAFBEAgACAFQYAGEGtBf0wNAQsgBRAcIAEoAjQiBQRAIAAgBSACEGtBAEgNAgsgBw0CIAEoAjgiAUUNAiAAIAEQYUEATg0CDAELIAUQHAtBfyEKCyAGQUBrJAAgCgtNAQJ/IAEtAAAhAgJAIAAtAAAiA0UNACACIANHDQADQCABLQABIQIgAC0AASIDRQ0BIAFBAWohASAAQQFqIQAgAiADRg0ACwsgAyACawvcAwICfgF/IAOtIQQgACkDmC4hBQJAIAACfyAAAn4gACgCoC4iBkEDaiIDQT9NBEAgBCAGrYYgBYQMAQsgBkHAAEYEQCAAKAIEIAAoAhBqIAU3AAAgACgCEEEIagwCCyAAKAIEIAAoAhBqIAQgBq2GIAWENwAAIAAgACgCEEEIajYCECAGQT1rIQMgBEHAACAGa62ICyIENwOYLiAAIAM2AqAuIANBOU4EQCAAKAIEIAAoAhBqIAQ3AAAgACAAKAIQQQhqNgIQDAILIANBGU4EQCAAKAIEIAAoAhBqIAQ+AAAgACAAKAIQQQRqNgIQIAAgACkDmC5CIIgiBDcDmC4gACAAKAKgLkEgayIDNgKgLgsgA0EJTgR/IAAoAgQgACgCEGogBD0AACAAIAAoAhBBAmo2AhAgACkDmC5CEIghBCAAKAKgLkEQawUgAwtBAUgNASAAKAIQCyIDQQFqNgIQIAAoAgQgA2ogBDwAAAsgAEEANgKgLiAAQgA3A5guIAAoAgQgACgCEGogAjsAACAAIAAoAhBBAmoiAzYCECAAKAIEIANqIAJBf3M7AAAgACAAKAIQQQJqIgM2AhAgAgRAIAAoAgQgA2ogASACEAcaIAAgACgCECACajYCEAsLrAQCAX8BfgJAIAANACABUA0AIAMEQCADQQA2AgQgA0ESNgIAC0EADwsCQAJAIAAgASACIAMQiQEiBEUNAEEYEAkiAkUEQCADBEAgA0EANgIEIANBDjYCAAsCQCAEKAIoIgBFBEAgBCkDGCEBDAELIABBADYCKCAEKAIoQgA3AyAgBCAEKQMYIgUgBCkDICIBIAEgBVQbIgE3AxgLIAQpAwggAVYEQANAIAQoAgAgAadBBHRqKAIAEAYgAUIBfCIBIAQpAwhUDQALCyAEKAIAEAYgBCgCBBAGIAQQBgwBCyACQQA2AhQgAiAENgIQIAJBABABNgIMIAJBADYCCCACQgA3AgACf0E4EAkiAEUEQCADBEAgA0EANgIEIANBDjYCAAtBAAwBCyAAQQA2AgggAEIANwMAIABCADcDICAAQoCAgIAQNwIsIABBADoAKCAAQQA2AhQgAEIANwIMIABBADsBNCAAIAI2AgggAEEkNgIEIABCPyACQQBCAEEOQSQRDAAiASABQgBTGzcDGCAACyIADQEgAigCECIDBEACQCADKAIoIgBFBEAgAykDGCEBDAELIABBADYCKCADKAIoQgA3AyAgAyADKQMYIgUgAykDICIBIAEgBVQbIgE3AxgLIAMpAwggAVYEQANAIAMoAgAgAadBBHRqKAIAEAYgAUIBfCIBIAMpAwhUDQALCyADKAIAEAYgAygCBBAGIAMQBgsgAhAGC0EAIQALIAALiwwBBn8gACABaiEFAkACQCAAKAIEIgJBAXENACACQQNxRQ0BIAAoAgAiAiABaiEBAkAgACACayIAQciEASgCAEcEQCACQf8BTQRAIAAoAggiBCACQQN2IgJBA3RB3IQBakYaIAAoAgwiAyAERw0CQbSEAUG0hAEoAgBBfiACd3E2AgAMAwsgACgCGCEGAkAgACAAKAIMIgNHBEAgACgCCCICQcSEASgCAEkaIAIgAzYCDCADIAI2AggMAQsCQCAAQRRqIgIoAgAiBA0AIABBEGoiAigCACIEDQBBACEDDAELA0AgAiEHIAQiA0EUaiICKAIAIgQNACADQRBqIQIgAygCECIEDQALIAdBADYCAAsgBkUNAgJAIAAgACgCHCIEQQJ0QeSGAWoiAigCAEYEQCACIAM2AgAgAw0BQbiEAUG4hAEoAgBBfiAEd3E2AgAMBAsgBkEQQRQgBigCECAARhtqIAM2AgAgA0UNAwsgAyAGNgIYIAAoAhAiAgRAIAMgAjYCECACIAM2AhgLIAAoAhQiAkUNAiADIAI2AhQgAiADNgIYDAILIAUoAgQiAkEDcUEDRw0BQbyEASABNgIAIAUgAkF+cTYCBCAAIAFBAXI2AgQgBSABNgIADwsgBCADNgIMIAMgBDYCCAsCQCAFKAIEIgJBAnFFBEAgBUHMhAEoAgBGBEBBzIQBIAA2AgBBwIQBQcCEASgCACABaiIBNgIAIAAgAUEBcjYCBCAAQciEASgCAEcNA0G8hAFBADYCAEHIhAFBADYCAA8LIAVByIQBKAIARgRAQciEASAANgIAQbyEAUG8hAEoAgAgAWoiATYCACAAIAFBAXI2AgQgACABaiABNgIADwsgAkF4cSABaiEBAkAgAkH/AU0EQCAFKAIIIgQgAkEDdiICQQN0QdyEAWpGGiAEIAUoAgwiA0YEQEG0hAFBtIQBKAIAQX4gAndxNgIADAILIAQgAzYCDCADIAQ2AggMAQsgBSgCGCEGAkAgBSAFKAIMIgNHBEAgBSgCCCICQcSEASgCAEkaIAIgAzYCDCADIAI2AggMAQsCQCAFQRRqIgQoAgAiAg0AIAVBEGoiBCgCACICDQBBACEDDAELA0AgBCEHIAIiA0EUaiIEKAIAIgINACADQRBqIQQgAygCECICDQALIAdBADYCAAsgBkUNAAJAIAUgBSgCHCIEQQJ0QeSGAWoiAigCAEYEQCACIAM2AgAgAw0BQbiEAUG4hAEoAgBBfiAEd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAM2AgAgA0UNAQsgAyAGNgIYIAUoAhAiAgRAIAMgAjYCECACIAM2AhgLIAUoAhQiAkUNACADIAI2AhQgAiADNgIYCyAAIAFBAXI2AgQgACABaiABNgIAIABByIQBKAIARw0BQbyEASABNgIADwsgBSACQX5xNgIEIAAgAUEBcjYCBCAAIAFqIAE2AgALIAFB/wFNBEAgAUEDdiICQQN0QdyEAWohAQJ/QbSEASgCACIDQQEgAnQiAnFFBEBBtIQBIAIgA3I2AgAgAQwBCyABKAIICyECIAEgADYCCCACIAA2AgwgACABNgIMIAAgAjYCCA8LQR8hAiAAQgA3AhAgAUH///8HTQRAIAFBCHYiAiACQYD+P2pBEHZBCHEiBHQiAiACQYDgH2pBEHZBBHEiA3QiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAEciACcmsiAkEBdCABIAJBFWp2QQFxckEcaiECCyAAIAI2AhwgAkECdEHkhgFqIQcCQAJAQbiEASgCACIEQQEgAnQiA3FFBEBBuIQBIAMgBHI2AgAgByAANgIAIAAgBzYCGAwBCyABQQBBGSACQQF2ayACQR9GG3QhAiAHKAIAIQMDQCADIgQoAgRBeHEgAUYNAiACQR12IQMgAkEBdCECIAQgA0EEcWoiB0EQaigCACIDDQALIAcgADYCECAAIAQ2AhgLIAAgADYCDCAAIAA2AggPCyAEKAIIIgEgADYCDCAEIAA2AgggAEEANgIYIAAgBDYCDCAAIAE2AggLC1gCAX8BfgJAAn9BACAARQ0AGiAArUIChiICpyIBIABBBHJBgIAESQ0AGkF/IAEgAkIgiKcbCyIBEAkiAEUNACAAQQRrLQAAQQNxRQ0AIABBACABEBkLIAALQwEDfwJAIAJFDQADQCAALQAAIgQgAS0AACIFRgRAIAFBAWohASAAQQFqIQAgAkEBayICDQEMAgsLIAQgBWshAwsgAwsUACAAEEAgACgCABAgIAAoAgQQIAutBAIBfgV/IwBBEGsiBCQAIAAgAWshBgJAAkAgAUEBRgRAIAAgBi0AACACEBkMAQsgAUEJTwRAIAAgBikAADcAACAAIAJBAWtBB3FBAWoiBWohACACIAVrIgFFDQIgBSAGaiECA0AgACACKQAANwAAIAJBCGohAiAAQQhqIQAgAUEIayIBDQALDAILAkACQAJAAkAgAUEEaw4FAAICAgECCyAEIAYoAAAiATYCBCAEIAE2AgAMAgsgBCAGKQAANwMADAELQQghByAEQQhqIQgDQCAIIAYgByABIAEgB0sbIgUQByAFaiEIIAcgBWsiBw0ACyAEIAQpAwg3AwALAkAgBQ0AIAJBEEkNACAEKQMAIQMgAkEQayIGQQR2QQFqQQdxIgEEQANAIAAgAzcACCAAIAM3AAAgAkEQayECIABBEGohACABQQFrIgENAAsLIAZB8ABJDQADQCAAIAM3AHggACADNwBwIAAgAzcAaCAAIAM3AGAgACADNwBYIAAgAzcAUCAAIAM3AEggACADNwBAIAAgAzcAOCAAIAM3ADAgACADNwAoIAAgAzcAICAAIAM3ABggACADNwAQIAAgAzcACCAAIAM3AAAgAEGAAWohACACQYABayICQQ9LDQALCyACQQhPBEBBCCAFayEBA0AgACAEKQMANwAAIAAgAWohACACIAFrIgJBB0sNAAsLIAJFDQEgACAEIAIQBxoLIAAgAmohAAsgBEEQaiQAIAALXwECfyAAKAIIIgEEQCABEAsgAEEANgIICwJAIAAoAgQiAUUNACABKAIAIgJBAXFFDQAgASgCEEF+Rw0AIAEgAkF+cSICNgIAIAINACABECAgAEEANgIECyAAQQA6AAwL1wICBH8BfgJAAkAgACgCQCABp0EEdGooAgAiA0UEQCACBEAgAkEANgIEIAJBFDYCAAsMAQsgACgCACADKQNIIgdBABAUIQMgACgCACEAIANBf0wEQCACBEAgAiAAKAIMNgIAIAIgACgCEDYCBAsMAQtCACEBIwBBEGsiBiQAQX8hAwJAIABCGkEBEBRBf0wEQCACBEAgAiAAKAIMNgIAIAIgACgCEDYCBAsMAQsgAEIEIAZBCmogAhAtIgRFDQBBHiEAQQEhBQNAIAQQDCAAaiEAIAVBAkcEQCAFQQFqIQUMAQsLIAQtAAAEfyAEKQMQIAQpAwhRBUEAC0UEQCACBEAgAkEANgIEIAJBFDYCAAsgBBAIDAELIAQQCCAAIQMLIAZBEGokACADIgBBAEgNASAHIACtfCIBQn9VDQEgAgRAIAJBFjYCBCACQQQ2AgALC0IAIQELIAELYAIBfgF/AkAgAEUNACAAQQhqEF8iAEUNACABIAEoAjBBAWo2AjAgACADNgIIIAAgAjYCBCAAIAE2AgAgAEI/IAEgA0EAQgBBDiACEQoAIgQgBEIAUxs3AxggACEFCyAFCyIAIAAoAiRBAWtBAU0EQCAAQQBCAEEKEA4aIABBADYCJAsLbgACQAJAAkAgA0IQVA0AIAJFDQECfgJAAkACQCACKAIIDgMCAAEECyACKQMAIAB8DAILIAIpAwAgAXwMAQsgAikDAAsiA0IAUw0AIAEgA1oNAgsgBARAIARBADYCBCAEQRI2AgALC0J/IQMLIAMLggICAX8CfgJAQQEgAiADGwRAIAIgA2oQCSIFRQRAIAQEQCAEQQA2AgQgBEEONgIAC0EADwsgAq0hBgJAAkAgAARAIAAgBhATIgBFBEAgBARAIARBADYCBCAEQQ42AgALDAULIAUgACACEAcaIAMNAQwCCyABIAUgBhARIgdCf1cEQCAEBEAgBCABKAIMNgIAIAQgASgCEDYCBAsMBAsgBiAHVQRAIAQEQCAEQQA2AgQgBEERNgIACwwECyADRQ0BCyACIAVqIgBBADoAACACQQFIDQAgBSECA0AgAi0AAEUEQCACQSA6AAALIAJBAWoiAiAASQ0ACwsLIAUPCyAFEAZBAAuBAQEBfwJAIAAEQCADQYAGcSEFQQAhAwNAAkAgAC8BCCACRw0AIAUgACgCBHFFDQAgA0EATg0DIANBAWohAwsgACgCACIADQALCyAEBEAgBEEANgIEIARBCTYCAAtBAA8LIAEEQCABIAAvAQo7AQALIAAvAQpFBEBBwBQPCyAAKAIMC1cBAX9BEBAJIgNFBEBBAA8LIAMgATsBCiADIAA7AQggA0GABjYCBCADQQA2AgACQCABBEAgAyACIAEQYyIANgIMIAANASADEAZBAA8LIANBADYCDAsgAwvuBQIEfwV+IwBB4ABrIgQkACAEQQhqIgNCADcDICADQQA2AhggA0L/////DzcDECADQQA7AQwgA0G/hig2AgggA0EBOgAGIANBADsBBCADQQA2AgAgA0IANwNIIANBgIDYjXg2AkQgA0IANwMoIANCADcDMCADQgA3AzggA0FAa0EAOwEAIANCADcDUCABKQMIUCIDRQRAIAEoAgAoAgApA0ghBwsCfgJAIAMEQCAHIQkMAQsgByEJA0AgCqdBBHQiBSABKAIAaigCACIDKQNIIgggCSAIIAlUGyIJIAEpAyBWBEAgAgRAIAJBADYCBCACQRM2AgALQn8MAwsgAygCMCIGBH8gBi8BBAVBAAtB//8Dca0gCCADKQMgfHxCHnwiCCAHIAcgCFQbIgcgASkDIFYEQCACBEAgAkEANgIEIAJBEzYCAAtCfwwDCyAAKAIAIAEoAgAgBWooAgApA0hBABAUIQYgACgCACEDIAZBf0wEQCACBEAgAiADKAIMNgIAIAIgAygCEDYCBAtCfwwDCyAEQQhqIANBAEEBIAIQaEJ/UQRAIARBCGoQNkJ/DAMLAkACQCABKAIAIAVqKAIAIgMvAQogBC8BEkkNACADKAIQIAQoAhhHDQAgAygCFCAEKAIcRw0AIAMoAjAgBCgCOBBiRQ0AAkAgBCgCICIGIAMoAhhHBEAgBCkDKCEIDAELIAMpAyAiCyAEKQMoIghSDQAgCyEIIAMpAyggBCkDMFENAgsgBC0AFEEIcUUNACAGDQAgCEIAUg0AIAQpAzBQDQELIAIEQCACQQA2AgQgAkEVNgIACyAEQQhqEDZCfwwDCyABKAIAIAVqKAIAKAI0IAQoAjwQbyEDIAEoAgAgBWooAgAiBUEBOgAEIAUgAzYCNCAEQQA2AjwgBEEIahA2IApCAXwiCiABKQMIVA0ACwsgByAJfSIHQv///////////wAgB0L///////////8AVBsLIQcgBEHgAGokACAHC8YBAQJ/QdgAEAkiAUUEQCAABEAgAEEANgIEIABBDjYCAAtBAA8LIAECf0EYEAkiAkUEQCAABEAgAEEANgIEIABBDjYCAAtBAAwBCyACQQA2AhAgAkIANwMIIAJBADYCACACCyIANgJQIABFBEAgARAGQQAPCyABQgA3AwAgAUEANgIQIAFCADcCCCABQgA3AhQgAUEANgJUIAFCADcCHCABQgA3ACEgAUIANwMwIAFCADcDOCABQUBrQgA3AwAgAUIANwNIIAELgBMCD38CfiMAQdAAayIFJAAgBSABNgJMIAVBN2ohEyAFQThqIRBBACEBA0ACQCAOQQBIDQBB/////wcgDmsgAUgEQEGEhAFBPTYCAEF/IQ4MAQsgASAOaiEOCyAFKAJMIgchAQJAAkACQAJAAkACQAJAAkAgBQJ/AkAgBy0AACIGBEADQAJAAkAgBkH/AXEiBkUEQCABIQYMAQsgBkElRw0BIAEhBgNAIAEtAAFBJUcNASAFIAFBAmoiCDYCTCAGQQFqIQYgAS0AAiEMIAghASAMQSVGDQALCyAGIAdrIQEgAARAIAAgByABEC4LIAENDSAFKAJMIQEgBSgCTCwAAUEwa0EKTw0DIAEtAAJBJEcNAyABLAABQTBrIQ9BASERIAFBA2oMBAsgBSABQQFqIgg2AkwgAS0AASEGIAghAQwACwALIA4hDSAADQggEUUNAkEBIQEDQCAEIAFBAnRqKAIAIgAEQCADIAFBA3RqIAAgAhB4QQEhDSABQQFqIgFBCkcNAQwKCwtBASENIAFBCk8NCANAIAQgAUECdGooAgANCCABQQFqIgFBCkcNAAsMCAtBfyEPIAFBAWoLIgE2AkxBACEIAkAgASwAACIKQSBrIgZBH0sNAEEBIAZ0IgZBidEEcUUNAANAAkAgBSABQQFqIgg2AkwgASwAASIKQSBrIgFBIE8NAEEBIAF0IgFBidEEcUUNACABIAZyIQYgCCEBDAELCyAIIQEgBiEICwJAIApBKkYEQCAFAn8CQCABLAABQTBrQQpPDQAgBSgCTCIBLQACQSRHDQAgASwAAUECdCAEakHAAWtBCjYCACABLAABQQN0IANqQYADaygCACELQQEhESABQQNqDAELIBENCEEAIRFBACELIAAEQCACIAIoAgAiAUEEajYCACABKAIAIQsLIAUoAkxBAWoLIgE2AkwgC0F/Sg0BQQAgC2shCyAIQYDAAHIhCAwBCyAFQcwAahB3IgtBAEgNBiAFKAJMIQELQX8hCQJAIAEtAABBLkcNACABLQABQSpGBEACQCABLAACQTBrQQpPDQAgBSgCTCIBLQADQSRHDQAgASwAAkECdCAEakHAAWtBCjYCACABLAACQQN0IANqQYADaygCACEJIAUgAUEEaiIBNgJMDAILIBENByAABH8gAiACKAIAIgFBBGo2AgAgASgCAAVBAAshCSAFIAUoAkxBAmoiATYCTAwBCyAFIAFBAWo2AkwgBUHMAGoQdyEJIAUoAkwhAQtBACEGA0AgBiESQX8hDSABLAAAQcEAa0E5Sw0HIAUgAUEBaiIKNgJMIAEsAAAhBiAKIQEgBiASQTpsakGf7ABqLQAAIgZBAWtBCEkNAAsgBkETRg0CIAZFDQYgD0EATgRAIAQgD0ECdGogBjYCACAFIAMgD0EDdGopAwA3A0AMBAsgAA0BC0EAIQ0MBQsgBUFAayAGIAIQeCAFKAJMIQoMAgsgD0F/Sg0DC0EAIQEgAEUNBAsgCEH//3txIgwgCCAIQYDAAHEbIQZBACENQaQIIQ8gECEIAkACQAJAAn8CQAJAAkACQAJ/AkACQAJAAkACQAJAAkAgCkEBaywAACIBQV9xIAEgAUEPcUEDRhsgASASGyIBQdgAaw4hBBISEhISEhISDhIPBg4ODhIGEhISEgIFAxISCRIBEhIEAAsCQCABQcEAaw4HDhILEg4ODgALIAFB0wBGDQkMEQsgBSkDQCEUQaQIDAULQQAhAQJAAkACQAJAAkACQAJAIBJB/wFxDggAAQIDBBcFBhcLIAUoAkAgDjYCAAwWCyAFKAJAIA42AgAMFQsgBSgCQCAOrDcDAAwUCyAFKAJAIA47AQAMEwsgBSgCQCAOOgAADBILIAUoAkAgDjYCAAwRCyAFKAJAIA6sNwMADBALIAlBCCAJQQhLGyEJIAZBCHIhBkH4ACEBCyAQIQcgAUEgcSEMIAUpA0AiFFBFBEADQCAHQQFrIgcgFKdBD3FBsPAAai0AACAMcjoAACAUQg9WIQogFEIEiCEUIAoNAAsLIAUpA0BQDQMgBkEIcUUNAyABQQR2QaQIaiEPQQIhDQwDCyAQIQEgBSkDQCIUUEUEQANAIAFBAWsiASAUp0EHcUEwcjoAACAUQgdWIQcgFEIDiCEUIAcNAAsLIAEhByAGQQhxRQ0CIAkgECAHayIBQQFqIAEgCUgbIQkMAgsgBSkDQCIUQn9XBEAgBUIAIBR9IhQ3A0BBASENQaQIDAELIAZBgBBxBEBBASENQaUIDAELQaYIQaQIIAZBAXEiDRsLIQ8gECEBAkAgFEKAgICAEFQEQCAUIRUMAQsDQCABQQFrIgEgFCAUQgqAIhVCCn59p0EwcjoAACAUQv////+fAVYhByAVIRQgBw0ACwsgFaciBwRAA0AgAUEBayIBIAcgB0EKbiIMQQpsa0EwcjoAACAHQQlLIQogDCEHIAoNAAsLIAEhBwsgBkH//3txIAYgCUF/ShshBgJAIAUpA0AiFEIAUg0AIAkNAEEAIQkgECEHDAoLIAkgFFAgECAHa2oiASABIAlIGyEJDAkLIAUoAkAiAUGKEiABGyIHQQAgCRB6IgEgByAJaiABGyEIIAwhBiABIAdrIAkgARshCQwICyAJBEAgBSgCQAwCC0EAIQEgAEEgIAtBACAGECcMAgsgBUEANgIMIAUgBSkDQD4CCCAFIAVBCGo2AkBBfyEJIAVBCGoLIQhBACEBAkADQCAIKAIAIgdFDQECQCAFQQRqIAcQeSIHQQBIIgwNACAHIAkgAWtLDQAgCEEEaiEIIAkgASAHaiIBSw0BDAILC0F/IQ0gDA0FCyAAQSAgCyABIAYQJyABRQRAQQAhAQwBC0EAIQggBSgCQCEKA0AgCigCACIHRQ0BIAVBBGogBxB5IgcgCGoiCCABSg0BIAAgBUEEaiAHEC4gCkEEaiEKIAEgCEsNAAsLIABBICALIAEgBkGAwABzECcgCyABIAEgC0gbIQEMBQsgACAFKwNAIAsgCSAGIAFBABEdACEBDAQLIAUgBSkDQDwAN0EBIQkgEyEHIAwhBgwCC0F/IQ0LIAVB0ABqJAAgDQ8LIABBICANIAggB2siDCAJIAkgDEgbIgpqIgggCyAIIAtKGyIBIAggBhAnIAAgDyANEC4gAEEwIAEgCCAGQYCABHMQJyAAQTAgCiAMQQAQJyAAIAcgDBAuIABBICABIAggBkGAwABzECcMAAsAC54DAgR/AX4gAARAIAAoAgAiAQRAIAEQGhogACgCABALCyAAKAIcEAYgACgCIBAQIAAoAiQQECAAKAJQIgMEQCADKAIQIgIEQCADKAIAIgEEfwNAIAIgBEECdGooAgAiAgRAA0AgAigCGCEBIAIQBiABIgINAAsgAygCACEBCyABIARBAWoiBEsEQCADKAIQIQIMAQsLIAMoAhAFIAILEAYLIAMQBgsgACgCQCIBBEAgACkDMFAEfyABBSABED5CAiEFAkAgACkDMEICVA0AQQEhAgNAIAAoAkAgAkEEdGoQPiAFIAApAzBaDQEgBachAiAFQgF8IQUMAAsACyAAKAJACxAGCwJAIAAoAkRFDQBBACECQgEhBQNAIAAoAkwgAkECdGooAgAiAUEBOgAoIAFBDGoiASgCAEUEQCABBEAgAUEANgIEIAFBCDYCAAsLIAUgADUCRFoNASAFpyECIAVCAXwhBQwACwALIAAoAkwQBiAAKAJUIgIEQCACKAIIIgEEQCACKAIMIAERAwALIAIQBgsgAEEIahAxIAAQBgsL6gMCAX4EfwJAIAAEfiABRQRAIAMEQCADQQA2AgQgA0ESNgIAC0J/DwsgAkGDIHEEQAJAIAApAzBQDQBBPEE9IAJBAXEbIQcgAkECcUUEQANAIAAgBCACIAMQUyIFBEAgASAFIAcRAgBFDQYLIARCAXwiBCAAKQMwVA0ADAILAAsDQCAAIAQgAiADEFMiBQRAIAECfyAFECJBAWohBgNAQQAgBkUNARogBSAGQQFrIgZqIggtAABBL0cNAAsgCAsiBkEBaiAFIAYbIAcRAgBFDQULIARCAXwiBCAAKQMwVA0ACwsgAwRAIANBADYCBCADQQk2AgALQn8PC0ESIQYCQAJAIAAoAlAiBUUNACABRQ0AQQkhBiAFKQMIUA0AIAUoAhAgAS0AACIHBH9CpesKIQQgASEAA0AgBCAHrUL/AYN8IQQgAC0AASIHBEAgAEEBaiEAIARC/////w+DQiF+IQQMAQsLIASnBUGFKgsgBSgCAHBBAnRqKAIAIgBFDQADQCABIAAoAgAQOEUEQCACQQhxBEAgACkDCCIEQn9RDQMMBAsgACkDECIEQn9RDQIMAwsgACgCGCIADQALCyADBEAgA0EANgIEIAMgBjYCAAtCfyEECyAEBUJ/Cw8LIAMEQCADQgA3AgALIAQL3AQCB38BfgJAAkAgAEUNACABRQ0AIAJCf1UNAQsgBARAIARBADYCBCAEQRI2AgALQQAPCwJAIAAoAgAiB0UEQEGAAiEHQYACEDwiBkUNASAAKAIQEAYgAEGAAjYCACAAIAY2AhALAkACQCAAKAIQIAEtAAAiBQR/QqXrCiEMIAEhBgNAIAwgBa1C/wGDfCEMIAYtAAEiBQRAIAZBAWohBiAMQv////8Pg0IhfiEMDAELCyAMpwVBhSoLIgYgB3BBAnRqIggoAgAiBQRAA0ACQCAFKAIcIAZHDQAgASAFKAIAEDgNAAJAIANBCHEEQCAFKQMIQn9SDQELIAUpAxBCf1ENBAsgBARAIARBADYCBCAEQQo2AgALQQAPCyAFKAIYIgUNAAsLQSAQCSIFRQ0CIAUgATYCACAFIAgoAgA2AhggCCAFNgIAIAVCfzcDCCAFIAY2AhwgACAAKQMIQgF8Igw3AwggDLogB7hEAAAAAAAA6D+iZEUNACAHQQBIDQAgByAHQQF0IghGDQAgCBA8IgpFDQECQCAMQgAgBxtQBEAgACgCECEJDAELIAAoAhAhCUEAIQQDQCAJIARBAnRqKAIAIgYEQANAIAYoAhghASAGIAogBigCHCAIcEECdGoiCygCADYCGCALIAY2AgAgASIGDQALCyAEQQFqIgQgB0cNAAsLIAkQBiAAIAg2AgAgACAKNgIQCyADQQhxBEAgBSACNwMICyAFIAI3AxBBAQ8LIAQEQCAEQQA2AgQgBEEONgIAC0EADwsgBARAIARBADYCBCAEQQ42AgALQQAL3Q8BF38jAEFAaiIHQgA3AzAgB0IANwM4IAdCADcDICAHQgA3AygCQAJAAkACQAJAIAIEQCACQQNxIQggAkEBa0EDTwRAIAJBfHEhBgNAIAdBIGogASAJQQF0IgxqLwEAQQF0aiIKIAovAQBBAWo7AQAgB0EgaiABIAxBAnJqLwEAQQF0aiIKIAovAQBBAWo7AQAgB0EgaiABIAxBBHJqLwEAQQF0aiIKIAovAQBBAWo7AQAgB0EgaiABIAxBBnJqLwEAQQF0aiIKIAovAQBBAWo7AQAgCUEEaiEJIAZBBGsiBg0ACwsgCARAA0AgB0EgaiABIAlBAXRqLwEAQQF0aiIGIAYvAQBBAWo7AQAgCUEBaiEJIAhBAWsiCA0ACwsgBCgCACEJQQ8hCyAHLwE+IhENAgwBCyAEKAIAIQkLQQ4hC0EAIREgBy8BPA0AQQ0hCyAHLwE6DQBBDCELIAcvATgNAEELIQsgBy8BNg0AQQohCyAHLwE0DQBBCSELIAcvATINAEEIIQsgBy8BMA0AQQchCyAHLwEuDQBBBiELIAcvASwNAEEFIQsgBy8BKg0AQQQhCyAHLwEoDQBBAyELIAcvASYNAEECIQsgBy8BJA0AIAcvASJFBEAgAyADKAIAIgBBBGo2AgAgAEHAAjYBACADIAMoAgAiAEEEajYCACAAQcACNgEAQQEhDQwDCyAJQQBHIRtBASELQQEhCQwBCyALIAkgCSALSxshG0EBIQ5BASEJA0AgB0EgaiAJQQF0ai8BAA0BIAlBAWoiCSALRw0ACyALIQkLQX8hCCAHLwEiIg9BAksNAUEEIAcvASQiECAPQQF0amsiBkEASA0BIAZBAXQgBy8BJiISayIGQQBIDQEgBkEBdCAHLwEoIhNrIgZBAEgNASAGQQF0IAcvASoiFGsiBkEASA0BIAZBAXQgBy8BLCIVayIGQQBIDQEgBkEBdCAHLwEuIhZrIgZBAEgNASAGQQF0IAcvATAiF2siBkEASA0BIAZBAXQgBy8BMiIZayIGQQBIDQEgBkEBdCAHLwE0IhxrIgZBAEgNASAGQQF0IAcvATYiDWsiBkEASA0BIAZBAXQgBy8BOCIYayIGQQBIDQEgBkEBdCAHLwE6IgxrIgZBAEgNASAGQQF0IAcvATwiCmsiBkEASA0BIAZBAXQgEWsiBkEASA0BIAZBACAARSAOchsNASAJIBtLIRpBACEIIAdBADsBAiAHIA87AQQgByAPIBBqIgY7AQYgByAGIBJqIgY7AQggByAGIBNqIgY7AQogByAGIBRqIgY7AQwgByAGIBVqIgY7AQ4gByAGIBZqIgY7ARAgByAGIBdqIgY7ARIgByAGIBlqIgY7ARQgByAGIBxqIgY7ARYgByAGIA1qIgY7ARggByAGIBhqIgY7ARogByAGIAxqIgY7ARwgByAGIApqOwEeAkAgAkUNACACQQFHBEAgAkF+cSEGA0AgASAIQQF0ai8BACIKBEAgByAKQQF0aiIKIAovAQAiCkEBajsBACAFIApBAXRqIAg7AQALIAEgCEEBciIMQQF0ai8BACIKBEAgByAKQQF0aiIKIAovAQAiCkEBajsBACAFIApBAXRqIAw7AQALIAhBAmohCCAGQQJrIgYNAAsLIAJBAXFFDQAgASAIQQF0ai8BACICRQ0AIAcgAkEBdGoiAiACLwEAIgJBAWo7AQAgBSACQQF0aiAIOwEACyAJIBsgGhshDUEUIRBBACEWIAUiCiEYQQAhEgJAAkACQCAADgICAAELQQEhCCANQQpLDQNBgQIhEEHw2QAhGEGw2QAhCkEBIRIMAQsgAEECRiEWQQAhEEHw2gAhGEGw2gAhCiAAQQJHBEAMAQtBASEIIA1BCUsNAgtBASANdCITQQFrIRwgAygCACEUQQAhFSANIQZBACEPQQAhDkF/IQIDQEEBIAZ0IRoCQANAIAkgD2shFwJAIAUgFUEBdGovAQAiCCAQTwRAIAogCCAQa0EBdCIAai8BACERIAAgGGotAAAhAAwBC0EAQeAAIAhBAWogEEkiBhshACAIQQAgBhshEQsgDiAPdiEMQX8gF3QhBiAaIQgDQCAUIAYgCGoiCCAMakECdGoiGSAROwECIBkgFzoAASAZIAA6AAAgCA0AC0EBIAlBAWt0IQYDQCAGIgBBAXYhBiAAIA5xDQALIAdBIGogCUEBdGoiBiAGLwEAQQFrIgY7AQAgAEEBayAOcSAAakEAIAAbIQ4gFUEBaiEVIAZB//8DcUUEQCAJIAtGDQIgASAFIBVBAXRqLwEAQQF0ai8BACEJCyAJIA1NDQAgDiAccSIAIAJGDQALQQEgCSAPIA0gDxsiD2siBnQhAiAJIAtJBEAgCyAPayEMIAkhCAJAA0AgAiAHQSBqIAhBAXRqLwEAayICQQFIDQEgAkEBdCECIAZBAWoiBiAPaiIIIAtJDQALIAwhBgtBASAGdCECC0EBIQggEiACIBNqIhNBtApLcQ0DIBYgE0HQBEtxDQMgAygCACICIABBAnRqIgggDToAASAIIAY6AAAgCCAUIBpBAnRqIhQgAmtBAnY7AQIgACECDAELCyAOBEAgFCAOQQJ0aiIAQQA7AQIgACAXOgABIABBwAA6AAALIAMgAygCACATQQJ0ajYCAAsgBCANNgIAQQAhCAsgCAusAQICfgF/IAFBAmqtIQIgACkDmC4hAwJAIAAoAqAuIgFBA2oiBEE/TQRAIAIgAa2GIAOEIQIMAQsgAUHAAEYEQCAAKAIEIAAoAhBqIAM3AAAgACAAKAIQQQhqNgIQQQMhBAwBCyAAKAIEIAAoAhBqIAIgAa2GIAOENwAAIAAgACgCEEEIajYCECABQT1rIQQgAkHAACABa62IIQILIAAgAjcDmC4gACAENgKgLguXAwICfgN/QYDJADMBACECIAApA5guIQMCQCAAKAKgLiIFQYLJAC8BACIGaiIEQT9NBEAgAiAFrYYgA4QhAgwBCyAFQcAARgRAIAAoAgQgACgCEGogAzcAACAAIAAoAhBBCGo2AhAgBiEEDAELIAAoAgQgACgCEGogAiAFrYYgA4Q3AAAgACAAKAIQQQhqNgIQIARBQGohBCACQcAAIAVrrYghAgsgACACNwOYLiAAIAQ2AqAuIAEEQAJAIARBOU4EQCAAKAIEIAAoAhBqIAI3AAAgACAAKAIQQQhqNgIQDAELIARBGU4EQCAAKAIEIAAoAhBqIAI+AAAgACAAKAIQQQRqNgIQIAAgACkDmC5CIIgiAjcDmC4gACAAKAKgLkEgayIENgKgLgsgBEEJTgR/IAAoAgQgACgCEGogAj0AACAAIAAoAhBBAmo2AhAgACkDmC5CEIghAiAAKAKgLkEQawUgBAtBAUgNACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAI8AAALIABBADYCoC4gAEIANwOYLgsL8hQBEn8gASgCCCICKAIAIQUgAigCDCEHIAEoAgAhCCAAQoCAgIDQxwA3A6ApQQAhAgJAAkAgB0EASgRAQX8hDANAAkAgCCACQQJ0aiIDLwEABEAgACAAKAKgKUEBaiIDNgKgKSAAIANBAnRqQawXaiACNgIAIAAgAmpBqClqQQA6AAAgAiEMDAELIANBADsBAgsgAkEBaiICIAdHDQALIABB/C1qIQ8gAEH4LWohESAAKAKgKSIEQQFKDQIMAQsgAEH8LWohDyAAQfgtaiERQX8hDAsDQCAAIARBAWoiAjYCoCkgACACQQJ0akGsF2ogDEEBaiIDQQAgDEECSCIGGyICNgIAIAggAkECdCIEakEBOwEAIAAgAmpBqClqQQA6AAAgACAAKAL4LUEBazYC+C0gBQRAIA8gDygCACAEIAVqLwECazYCAAsgAyAMIAYbIQwgACgCoCkiBEECSA0ACwsgASAMNgIEIARBAXYhBgNAIAAgBkECdGpBrBdqKAIAIQkCQCAGIgJBAXQiAyAESg0AIAggCUECdGohCiAAIAlqQagpaiENIAYhBQNAAkAgAyAETgRAIAMhAgwBCyAIIABBrBdqIgIgA0EBciIEQQJ0aigCACILQQJ0ai8BACIOIAggAiADQQJ0aigCACIQQQJ0ai8BACICTwRAIAIgDkcEQCADIQIMAgsgAyECIABBqClqIgMgC2otAAAgAyAQai0AAEsNAQsgBCECCyAKLwEAIgQgCCAAIAJBAnRqQawXaigCACIDQQJ0ai8BACILSQRAIAUhAgwCCwJAIAQgC0cNACANLQAAIAAgA2pBqClqLQAASw0AIAUhAgwCCyAAIAVBAnRqQawXaiADNgIAIAIhBSACQQF0IgMgACgCoCkiBEwNAAsLIAAgAkECdGpBrBdqIAk2AgAgBkECTgRAIAZBAWshBiAAKAKgKSEEDAELCyAAKAKgKSEDA0AgByEGIAAgA0EBayIENgKgKSAAKAKwFyEKIAAgACADQQJ0akGsF2ooAgAiCTYCsBdBASECAkAgA0EDSA0AIAggCUECdGohDSAAIAlqQagpaiELQQIhA0EBIQUDQAJAIAMgBE4EQCADIQIMAQsgCCAAQawXaiICIANBAXIiB0ECdGooAgAiBEECdGovAQAiDiAIIAIgA0ECdGooAgAiEEECdGovAQAiAk8EQCACIA5HBEAgAyECDAILIAMhAiAAQagpaiIDIARqLQAAIAMgEGotAABLDQELIAchAgsgDS8BACIHIAggACACQQJ0akGsF2ooAgAiA0ECdGovAQAiBEkEQCAFIQIMAgsCQCAEIAdHDQAgCy0AACAAIANqQagpai0AAEsNACAFIQIMAgsgACAFQQJ0akGsF2ogAzYCACACIQUgAkEBdCIDIAAoAqApIgRMDQALC0ECIQMgAEGsF2oiByACQQJ0aiAJNgIAIAAgACgCpClBAWsiBTYCpCkgACgCsBchAiAHIAVBAnRqIAo2AgAgACAAKAKkKUEBayIFNgKkKSAHIAVBAnRqIAI2AgAgCCAGQQJ0aiINIAggAkECdGoiBS8BACAIIApBAnRqIgQvAQBqOwEAIABBqClqIgkgBmoiCyACIAlqLQAAIgIgCSAKai0AACIKIAIgCksbQQFqOgAAIAUgBjsBAiAEIAY7AQIgACAGNgKwF0EBIQVBASECAkAgACgCoCkiBEECSA0AA0AgDS8BACIKIAggAAJ/IAMgAyAETg0AGiAIIAcgA0EBciICQQJ0aigCACIEQQJ0ai8BACIOIAggByADQQJ0aigCACIQQQJ0ai8BACISTwRAIAMgDiASRw0BGiADIAQgCWotAAAgCSAQai0AAEsNARoLIAILIgJBAnRqQawXaigCACIDQQJ0ai8BACIESQRAIAUhAgwCCwJAIAQgCkcNACALLQAAIAAgA2pBqClqLQAASw0AIAUhAgwCCyAAIAVBAnRqQawXaiADNgIAIAIhBSACQQF0IgMgACgCoCkiBEwNAAsLIAZBAWohByAAIAJBAnRqQawXaiAGNgIAIAAoAqApIgNBAUoNAAsgACAAKAKkKUEBayICNgKkKSAAQawXaiIDIAJBAnRqIAAoArAXNgIAIAEoAgQhCSABKAIIIgIoAhAhBiACKAIIIQogAigCBCEQIAIoAgAhDSABKAIAIQcgAEGkF2pCADcBACAAQZwXakIANwEAIABBlBdqQgA3AQAgAEGMF2oiAUIANwEAQQAhBSAHIAMgACgCpClBAnRqKAIAQQJ0akEAOwECAkAgACgCpCkiAkG7BEoNACACQQFqIQIDQCAHIAAgAkECdGpBrBdqKAIAIgRBAnQiEmoiCyAHIAsvAQJBAnRqLwECIgNBAWogBiADIAZJGyIOOwECIAMgBk8hEwJAIAQgCUoNACAAIA5BAXRqQYwXaiIDIAMvAQBBAWo7AQBBACEDIAQgCk4EQCAQIAQgCmtBAnRqKAIAIQMLIBEgESgCACALLwEAIgQgAyAOamxqNgIAIA1FDQAgDyAPKAIAIAMgDSASai8BAmogBGxqNgIACyAFIBNqIQUgAkEBaiICQb0ERw0ACyAFRQ0AIAAgBkEBdGpBjBdqIQQDQCAGIQIDQCAAIAIiA0EBayICQQF0akGMF2oiDy8BACIKRQ0ACyAPIApBAWs7AQAgACADQQF0akGMF2oiAiACLwEAQQJqOwEAIAQgBC8BAEEBayIDOwEAIAVBAkohAiAFQQJrIQUgAg0ACyAGRQ0AQb0EIQIDQCADQf//A3EiBQRAA0AgACACQQFrIgJBAnRqQawXaigCACIDIAlKDQAgByADQQJ0aiIDLwECIAZHBEAgESARKAIAIAYgAy8BAGxqIgQ2AgAgESAEIAMvAQAgAy8BAmxrNgIAIAMgBjsBAgsgBUEBayIFDQALCyAGQQFrIgZFDQEgACAGQQF0akGMF2ovAQAhAwwACwALIwBBIGsiAiABIgAvAQBBAXQiATsBAiACIAEgAC8BAmpBAXQiATsBBCACIAEgAC8BBGpBAXQiATsBBiACIAEgAC8BBmpBAXQiATsBCCACIAEgAC8BCGpBAXQiATsBCiACIAEgAC8BCmpBAXQiATsBDCACIAEgAC8BDGpBAXQiATsBDiACIAEgAC8BDmpBAXQiATsBECACIAEgAC8BEGpBAXQiATsBEiACIAEgAC8BEmpBAXQiATsBFCACIAEgAC8BFGpBAXQiATsBFiACIAEgAC8BFmpBAXQiATsBGCACIAEgAC8BGGpBAXQiATsBGiACIAEgAC8BGmpBAXQiATsBHCACIAAvARwgAWpBAXQ7AR5BACEAIAxBAE4EQANAIAggAEECdGoiAy8BAiIBBEAgAiABQQF0aiIFIAUvAQAiBUEBajsBACADIAWtQoD+A4NCCIhCgpCAgQh+QpDCiKKIAYNCgYKEiBB+QiCIp0H/AXEgBUH/AXGtQoKQgIEIfkKQwoiiiAGDQoGChIgQfkIYiKdBgP4DcXJBECABa3Y7AQALIAAgDEchASAAQQFqIQAgAQ0ACwsLcgEBfyMAQRBrIgQkAAJ/QQAgAEUNABogAEEIaiEAIAFFBEAgAlBFBEAgAARAIABBADYCBCAAQRI2AgALQQAMAgtBAEIAIAMgABA6DAELIAQgAjcDCCAEIAE2AgAgBEIBIAMgABA6CyEAIARBEGokACAACyIAIAAgASACIAMQJiIARQRAQQAPCyAAKAIwQQAgAiADECULAwABC8gFAQR/IABB//8DcSEDIABBEHYhBEEBIQAgAkEBRgRAIAMgAS0AAGpB8f8DcCIAIARqQfH/A3BBEHQgAHIPCwJAIAEEfyACQRBJDQECQCACQa8rSwRAA0AgAkGwK2shAkG1BSEFIAEhAANAIAMgAC0AAGoiAyAEaiADIAAtAAFqIgNqIAMgAC0AAmoiA2ogAyAALQADaiIDaiADIAAtAARqIgNqIAMgAC0ABWoiA2ogAyAALQAGaiIDaiADIAAtAAdqIgNqIQQgBQRAIABBCGohACAFQQFrIQUMAQsLIARB8f8DcCEEIANB8f8DcCEDIAFBsCtqIQEgAkGvK0sNAAsgAkEISQ0BCwNAIAMgAS0AAGoiACAEaiAAIAEtAAFqIgBqIAAgAS0AAmoiAGogACABLQADaiIAaiAAIAEtAARqIgBqIAAgAS0ABWoiAGogACABLQAGaiIAaiAAIAEtAAdqIgNqIQQgAUEIaiEBIAJBCGsiAkEHSw0ACwsCQCACRQ0AIAJBAWshBiACQQNxIgUEQCABIQADQCACQQFrIQIgAyAALQAAaiIDIARqIQQgAEEBaiIBIQAgBUEBayIFDQALCyAGQQNJDQADQCADIAEtAABqIgAgAS0AAWoiBSABLQACaiIGIAEtAANqIgMgBiAFIAAgBGpqamohBCABQQRqIQEgAkEEayICDQALCyADQfH/A3AgBEHx/wNwQRB0cgVBAQsPCwJAIAJFDQAgAkEBayEGIAJBA3EiBQRAIAEhAANAIAJBAWshAiADIAAtAABqIgMgBGohBCAAQQFqIgEhACAFQQFrIgUNAAsLIAZBA0kNAANAIAMgAS0AAGoiACABLQABaiIFIAEtAAJqIgYgAS0AA2oiAyAGIAUgACAEampqaiEEIAFBBGohASACQQRrIgINAAsLIANB8f8DcCAEQfH/A3BBEHRyCx8AIAAgAiADQcCAASgCABEAACEAIAEgAiADEAcaIAALIwAgACAAKAJAIAIgA0HUgAEoAgARAAA2AkAgASACIAMQBxoLzSoCGH8HfiAAKAIMIgIgACgCECIDaiEQIAMgAWshASAAKAIAIgUgACgCBGohA0F/IAAoAhwiBygCpAF0IQRBfyAHKAKgAXQhCyAHKAI4IQwCf0EAIAcoAiwiEUUNABpBACACIAxJDQAaIAJBhAJqIAwgEWpNCyEWIBBBgwJrIRMgASACaiEXIANBDmshFCAEQX9zIRggC0F/cyESIAcoApwBIRUgBygCmAEhDSAHKAKIASEIIAc1AoQBIR0gBygCNCEOIAcoAjAhGSAQQQFqIQ8DQCAIQThyIQYgBSAIQQN2QQdxayELAn8gAiANIAUpAAAgCK2GIB2EIh2nIBJxQQJ0IgFqIgMtAAAiBA0AGiACIAEgDWoiAS0AAjoAACAGIAEtAAEiAWshBiACQQFqIA0gHSABrYgiHacgEnFBAnQiAWoiAy0AACIEDQAaIAIgASANaiIDLQACOgABIAYgAy0AASIDayEGIA0gHSADrYgiHacgEnFBAnRqIgMtAAAhBCACQQJqCyEBIAtBB2ohBSAGIAMtAAEiAmshCCAdIAKtiCEdAkACQAJAIARB/wFxRQ0AAkACQAJAAkACQANAIARBEHEEQCAVIB0gBK1CD4OIIhqnIBhxQQJ0aiECAn8gCCAEQQ9xIgZrIgRBG0sEQCAEIQggBQwBCyAEQThyIQggBSkAACAErYYgGoQhGiAFIARBA3ZrQQdqCyELIAMzAQIhGyAIIAItAAEiA2shCCAaIAOtiCEaIAItAAAiBEEQcQ0CA0AgBEHAAHFFBEAgCCAVIAIvAQJBAnRqIBqnQX8gBHRBf3NxQQJ0aiICLQABIgNrIQggGiADrYghGiACLQAAIgRBEHFFDQEMBAsLIAdB0f4ANgIEIABB7A42AhggGiEdDAMLIARB/wFxIgJBwABxRQRAIAggDSADLwECQQJ0aiAdp0F/IAJ0QX9zcUECdGoiAy0AASICayEIIB0gAq2IIR0gAy0AACIERQ0HDAELCyAEQSBxBEAgB0G//gA2AgQgASECDAgLIAdB0f4ANgIEIABB0A42AhggASECDAcLIB1BfyAGdEF/c62DIBt8IhunIQUgCCAEQQ9xIgNrIQggGiAErUIPg4ghHSABIBdrIgYgAjMBAiAaQX8gA3RBf3Otg3ynIgRPDQIgBCAGayIGIBlNDQEgBygCjEdFDQEgB0HR/gA2AgQgAEG5DDYCGAsgASECIAshBQwFCwJAIA5FBEAgDCARIAZraiEDDAELIAYgDk0EQCAMIA4gBmtqIQMMAQsgDCARIAYgDmsiBmtqIQMgBSAGTQ0AIAUgBmshBQJAAkAgASADTSABIA8gAWusIhogBq0iGyAaIBtUGyIapyIGaiICIANLcQ0AIAMgBmogAUsgASADT3ENACABIAMgBhAHGiACIQEMAQsgASADIAMgAWsiASABQR91IgFqIAFzIgIQByACaiEBIBogAq0iHn0iHFANACACIANqIQIDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgASACKQAANwAAIAEgAikAGDcAGCABIAIpABA3ABAgASACKQAINwAIIBpCIH0hGiACQSBqIQIgAUEgaiEBIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAEgAikAADcAACABIAIpABg3ABggASACKQAQNwAQIAEgAikACDcACCABIAIpADg3ADggASACKQAwNwAwIAEgAikAKDcAKCABIAIpACA3ACAgASACKQBYNwBYIAEgAikAUDcAUCABIAIpAEg3AEggASACKQBANwBAIAEgAikAYDcAYCABIAIpAGg3AGggASACKQBwNwBwIAEgAikAeDcAeCACQYABaiECIAFBgAFqIQEgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAEgAikAADcAACABIAIpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCABIAIpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCABIAIoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCABIAIvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCABIAItAAA6AAAgAkEBaiECIAFBAWohAQsgHEIAUg0ACwsgDiEGIAwhAwsgBSAGSwRAAkACQCABIANNIAEgDyABa6wiGiAGrSIbIBogG1QbIhqnIglqIgIgA0txDQAgAyAJaiABSyABIANPcQ0AIAEgAyAJEAcaDAELIAEgAyADIAFrIgEgAUEfdSIBaiABcyIBEAcgAWohAiAaIAGtIh59IhxQDQAgASADaiEBA0ACQCAcIB4gHCAeVBsiG0IgVARAIBshGgwBCyAbIhpCIH0iIEIFiEIBfEIDgyIfUEUEQANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCAaQiB9IRogAUEgaiEBIAJBIGohAiAfQgF9Ih9CAFINAAsLICBC4ABUDQADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggAiABKQA4NwA4IAIgASkAMDcAMCACIAEpACg3ACggAiABKQAgNwAgIAIgASkAWDcAWCACIAEpAFA3AFAgAiABKQBINwBIIAIgASkAQDcAQCACIAEpAGA3AGAgAiABKQBoNwBoIAIgASkAcDcAcCACIAEpAHg3AHggAUGAAWohASACQYABaiECIBpCgAF9IhpCH1YNAAsLIBpCEFoEQCACIAEpAAA3AAAgAiABKQAINwAIIBpCEH0hGiACQRBqIQIgAUEQaiEBCyAaQghaBEAgAiABKQAANwAAIBpCCH0hGiACQQhqIQIgAUEIaiEBCyAaQgRaBEAgAiABKAAANgAAIBpCBH0hGiACQQRqIQIgAUEEaiEBCyAaQgJaBEAgAiABLwAAOwAAIBpCAn0hGiACQQJqIQIgAUECaiEBCyAcIBt9IRwgGlBFBEAgAiABLQAAOgAAIAJBAWohAiABQQFqIQELIBxCAFINAAsLIAUgBmshAUEAIARrIQUCQCAEQQdLBEAgBCEDDAELIAEgBE0EQCAEIQMMAQsgAiAEayEFA0ACQCACIAUpAAA3AAAgBEEBdCEDIAEgBGshASACIARqIQIgBEEDSw0AIAMhBCABIANLDQELC0EAIANrIQULIAIgBWohBAJAIAUgDyACa6wiGiABrSIbIBogG1QbIhqnIgFIIAVBf0pxDQAgBUEBSCABIARqIAJLcQ0AIAIgBCABEAcgAWohAgwDCyACIAQgAyADQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANAiABIARqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAILAkAgASADTSABIA8gAWusIhogBa0iGyAaIBtUGyIapyIEaiICIANLcQ0AIAMgBGogAUsgASADT3ENACABIAMgBBAHGgwCCyABIAMgAyABayIBIAFBH3UiAWogAXMiARAHIAFqIQIgGiABrSIefSIcUA0BIAEgA2ohAQNAAkAgHCAeIBwgHlQbIhtCIFQEQCAbIRoMAQsgGyIaQiB9IiBCBYhCAXxCA4MiH1BFBEADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggGkIgfSEaIAFBIGohASACQSBqIQIgH0IBfSIfQgBSDQALCyAgQuAAVA0AA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIAIgASkAODcAOCACIAEpADA3ADAgAiABKQAoNwAoIAIgASkAIDcAICACIAEpAFg3AFggAiABKQBQNwBQIAIgASkASDcASCACIAEpAEA3AEAgAiABKQBgNwBgIAIgASkAaDcAaCACIAEpAHA3AHAgAiABKQB4NwB4IAFBgAFqIQEgAkGAAWohAiAaQoABfSIaQh9WDQALCyAaQhBaBEAgAiABKQAANwAAIAIgASkACDcACCAaQhB9IRogAkEQaiECIAFBEGohAQsgGkIIWgRAIAIgASkAADcAACAaQgh9IRogAkEIaiECIAFBCGohAQsgGkIEWgRAIAIgASgAADYAACAaQgR9IRogAkEEaiECIAFBBGohAQsgGkICWgRAIAIgAS8AADsAACAaQgJ9IRogAkECaiECIAFBAmohAQsgHCAbfSEcIBpQRQRAIAIgAS0AADoAACACQQFqIQIgAUEBaiEBCyAcUEUNAAsMAQsCQAJAIBYEQAJAIAQgBUkEQCAHKAKYRyAESw0BCyABIARrIQMCQEEAIARrIgVBf0ogDyABa6wiGiAbIBogG1QbIhqnIgIgBUpxDQAgBUEBSCACIANqIAFLcQ0AIAEgAyACEAcgAmohAgwFCyABIAMgBCAEQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANBCABIANqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAQLIBAgAWsiCUEBaiIGIAUgBSAGSxshAyABIARrIQIgAUEHcUUNAiADRQ0CIAEgAi0AADoAACACQQFqIQIgAUEBaiIGQQdxQQAgA0EBayIFGw0BIAYhASAFIQMgCSEGDAILAkAgBCAFSQRAIAcoAphHIARLDQELIAEgASAEayIGKQAANwAAIAEgBUEBa0EHcUEBaiIDaiECIAUgA2siBEUNAyADIAZqIQEDQCACIAEpAAA3AAAgAUEIaiEBIAJBCGohAiAEQQhrIgQNAAsMAwsgASAEIAUQPyECDAILIAEgAi0AADoAASAJQQFrIQYgA0ECayEFIAJBAWohAgJAIAFBAmoiCkEHcUUNACAFRQ0AIAEgAi0AADoAAiAJQQJrIQYgA0EDayEFIAJBAWohAgJAIAFBA2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAAyAJQQNrIQYgA0EEayEFIAJBAWohAgJAIAFBBGoiCkEHcUUNACAFRQ0AIAEgAi0AADoABCAJQQRrIQYgA0EFayEFIAJBAWohAgJAIAFBBWoiCkEHcUUNACAFRQ0AIAEgAi0AADoABSAJQQVrIQYgA0EGayEFIAJBAWohAgJAIAFBBmoiCkEHcUUNACAFRQ0AIAEgAi0AADoABiAJQQZrIQYgA0EHayEFIAJBAWohAgJAIAFBB2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAByAJQQdrIQYgA0EIayEDIAFBCGohASACQQFqIQIMBgsgCiEBIAUhAwwFCyAKIQEgBSEDDAQLIAohASAFIQMMAwsgCiEBIAUhAwwCCyAKIQEgBSEDDAELIAohASAFIQMLAkACQCAGQRdNBEAgA0UNASADQQFrIQUgA0EHcSIEBEADQCABIAItAAA6AAAgA0EBayEDIAFBAWohASACQQFqIQIgBEEBayIEDQALCyAFQQdJDQEDQCABIAItAAA6AAAgASACLQABOgABIAEgAi0AAjoAAiABIAItAAM6AAMgASACLQAEOgAEIAEgAi0ABToABSABIAItAAY6AAYgASACLQAHOgAHIAFBCGohASACQQhqIQIgA0EIayIDDQALDAELIAMNAQsgASECDAELIAEgBCADED8hAgsgCyEFDAELIAEgAy0AAjoAACABQQFqIQILIAUgFE8NACACIBNJDQELCyAAIAI2AgwgACAFIAhBA3ZrIgE2AgAgACATIAJrQYMCajYCECAAIBQgAWtBDmo2AgQgByAIQQdxIgA2AogBIAcgHUJ/IACthkJ/hYM+AoQBC+cFAQR/IAMgAiACIANLGyEEIAAgAWshAgJAIABBB3FFDQAgBEUNACAAIAItAAA6AAAgA0EBayEGIAJBAWohAiAAQQFqIgdBB3FBACAEQQFrIgUbRQRAIAchACAFIQQgBiEDDAELIAAgAi0AADoAASADQQJrIQYgBEECayEFIAJBAWohAgJAIABBAmoiB0EHcUUNACAFRQ0AIAAgAi0AADoAAiADQQNrIQYgBEEDayEFIAJBAWohAgJAIABBA2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAAyADQQRrIQYgBEEEayEFIAJBAWohAgJAIABBBGoiB0EHcUUNACAFRQ0AIAAgAi0AADoABCADQQVrIQYgBEEFayEFIAJBAWohAgJAIABBBWoiB0EHcUUNACAFRQ0AIAAgAi0AADoABSADQQZrIQYgBEEGayEFIAJBAWohAgJAIABBBmoiB0EHcUUNACAFRQ0AIAAgAi0AADoABiADQQdrIQYgBEEHayEFIAJBAWohAgJAIABBB2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAByADQQhrIQMgBEEIayEEIABBCGohACACQQFqIQIMBgsgByEAIAUhBCAGIQMMBQsgByEAIAUhBCAGIQMMBAsgByEAIAUhBCAGIQMMAwsgByEAIAUhBCAGIQMMAgsgByEAIAUhBCAGIQMMAQsgByEAIAUhBCAGIQMLAkAgA0EXTQRAIARFDQEgBEEBayEBIARBB3EiAwRAA0AgACACLQAAOgAAIARBAWshBCAAQQFqIQAgAkEBaiECIANBAWsiAw0ACwsgAUEHSQ0BA0AgACACLQAAOgAAIAAgAi0AAToAASAAIAItAAI6AAIgACACLQADOgADIAAgAi0ABDoABCAAIAItAAU6AAUgACACLQAGOgAGIAAgAi0ABzoAByAAQQhqIQAgAkEIaiECIARBCGsiBA0ACwwBCyAERQ0AIAAgASAEED8hAAsgAAvyCAEXfyAAKAJoIgwgACgCMEGGAmsiBWtBACAFIAxJGyENIAAoAnQhAiAAKAKQASEPIAAoAkgiDiAMaiIJIAAoAnAiBUECIAUbIgVBAWsiBmoiAy0AASESIAMtAAAhEyAGIA5qIQZBAyEDIAAoApQBIRYgACgCPCEUIAAoAkwhECAAKAI4IRECQAJ/IAVBA0kEQCANIQggDgwBCyAAIABBACAJLQABIAAoAnwRAAAgCS0AAiAAKAJ8EQAAIQoDQCAAIAogAyAJai0AACAAKAJ8EQAAIQogACgCUCAKQQF0ai8BACIIIAEgCCABQf//A3FJIggbIQEgA0ECayAHIAgbIQcgA0EBaiIDIAVNDQALIAFB//8DcSAHIA1qIghB//8DcU0NASAGIAdB//8DcSIDayEGIA4gA2sLIQMCQAJAIAwgAUH//wNxTQ0AIAIgAkECdiAFIA9JGyEKIA1B//8DcSEVIAlBAmohDyAJQQRrIRcDQAJAAkAgBiABQf//A3EiC2otAAAgE0cNACAGIAtBAWoiAWotAAAgEkcNACADIAtqIgItAAAgCS0AAEcNACABIANqLQAAIAktAAFGDQELIApBAWsiCkUNAiAQIAsgEXFBAXRqLwEAIgEgCEH//wNxSw0BDAILIAJBAmohAUEAIQQgDyECAkADQCACLQAAIAEtAABHDQEgAi0AASABLQABRwRAIARBAXIhBAwCCyACLQACIAEtAAJHBEAgBEECciEEDAILIAItAAMgAS0AA0cEQCAEQQNyIQQMAgsgAi0ABCABLQAERwRAIARBBHIhBAwCCyACLQAFIAEtAAVHBEAgBEEFciEEDAILIAItAAYgAS0ABkcEQCAEQQZyIQQMAgsgAi0AByABLQAHRwRAIARBB3IhBAwCCyABQQhqIQEgAkEIaiECIARB+AFJIRggBEEIaiEEIBgNAAtBgAIhBAsCQAJAIAUgBEECaiICSQRAIAAgCyAHQf//A3FrIgY2AmwgAiAUSwRAIBQPCyACIBZPBEAgAg8LIAkgBEEBaiIFaiIBLQABIRIgAS0AACETAkAgAkEESQ0AIAIgBmogDE8NACAGQf//A3EhCCAEQQFrIQtBACEDQQAhBwNAIBAgAyAIaiARcUEBdGovAQAiASAGQf//A3FJBEAgAyAVaiABTw0IIAMhByABIQYLIANBAWoiAyALTQ0ACyAAIAAgAEEAIAIgF2oiAS0AACAAKAJ8EQAAIAEtAAEgACgCfBEAACABLQACIAAoAnwRAAAhASAAKAJQIAFBAXRqLwEAIgEgBkH//wNxTwRAIAdB//8DcSEDIAYhAQwDCyAEQQJrIgdB//8DcSIDIBVqIAFPDQYMAgsgAyAFaiEGIAIhBQsgCkEBayIKRQ0DIBAgCyARcUEBdGovAQAiASAIQf//A3FNDQMMAQsgByANaiEIIA4gA2siAyAFaiEGIAIhBQsgDCABQf//A3FLDQALCyAFDwsgAiEFCyAFIAAoAjwiACAAIAVLGwuGBQETfyAAKAJ0IgMgA0ECdiAAKAJwIgNBAiADGyIDIAAoApABSRshByAAKAJoIgogACgCMEGGAmsiBWtB//8DcUEAIAUgCkkbIQwgACgCSCIIIApqIgkgA0EBayICaiIFLQABIQ0gBS0AACEOIAlBAmohBSACIAhqIQsgACgClAEhEiAAKAI8IQ8gACgCTCEQIAAoAjghESAAKAKIAUEFSCETA0ACQCAKIAFB//8DcU0NAANAAkACQCALIAFB//8DcSIGai0AACAORw0AIAsgBkEBaiIBai0AACANRw0AIAYgCGoiAi0AACAJLQAARw0AIAEgCGotAAAgCS0AAUYNAQsgB0EBayIHRQ0CIAwgECAGIBFxQQF0ai8BACIBSQ0BDAILCyACQQJqIQRBACECIAUhAQJAA0AgAS0AACAELQAARw0BIAEtAAEgBC0AAUcEQCACQQFyIQIMAgsgAS0AAiAELQACRwRAIAJBAnIhAgwCCyABLQADIAQtAANHBEAgAkEDciECDAILIAEtAAQgBC0ABEcEQCACQQRyIQIMAgsgAS0ABSAELQAFRwRAIAJBBXIhAgwCCyABLQAGIAQtAAZHBEAgAkEGciECDAILIAEtAAcgBC0AB0cEQCACQQdyIQIMAgsgBEEIaiEEIAFBCGohASACQfgBSSEUIAJBCGohAiAUDQALQYACIQILAkAgAyACQQJqIgFJBEAgACAGNgJsIAEgD0sEQCAPDwsgASASTwRAIAEPCyAIIAJBAWoiA2ohCyADIAlqIgMtAAEhDSADLQAAIQ4gASEDDAELIBMNAQsgB0EBayIHRQ0AIAwgECAGIBFxQQF0ai8BACIBSQ0BCwsgAwvLAQECfwJAA0AgAC0AACABLQAARw0BIAAtAAEgAS0AAUcEQCACQQFyDwsgAC0AAiABLQACRwRAIAJBAnIPCyAALQADIAEtAANHBEAgAkEDcg8LIAAtAAQgAS0ABEcEQCACQQRyDwsgAC0ABSABLQAFRwRAIAJBBXIPCyAALQAGIAEtAAZHBEAgAkEGcg8LIAAtAAcgAS0AB0cEQCACQQdyDwsgAUEIaiEBIABBCGohACACQfgBSSEDIAJBCGohAiADDQALQYACIQILIAIL5wwBB38gAEF/cyEAIAJBF08EQAJAIAFBA3FFDQAgAS0AACAAQf8BcXNBAnRB0BhqKAIAIABBCHZzIQAgAkEBayIEQQAgAUEBaiIDQQNxG0UEQCAEIQIgAyEBDAELIAEtAAEgAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBAmohAwJAIAJBAmsiBEUNACADQQNxRQ0AIAEtAAIgAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBA2ohAwJAIAJBA2siBEUNACADQQNxRQ0AIAEtAAMgAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBBGohASACQQRrIQIMAgsgBCECIAMhAQwBCyAEIQIgAyEBCyACQRRuIgNBbGwhCQJAIANBAWsiCEUEQEEAIQQMAQsgA0EUbCABakEUayEDQQAhBANAIAEoAhAgB3MiB0EWdkH8B3FB0DhqKAIAIAdBDnZB/AdxQdAwaigCACAHQQZ2QfwHcUHQKGooAgAgB0H/AXFBAnRB0CBqKAIAc3NzIQcgASgCDCAGcyIGQRZ2QfwHcUHQOGooAgAgBkEOdkH8B3FB0DBqKAIAIAZBBnZB/AdxQdAoaigCACAGQf8BcUECdEHQIGooAgBzc3MhBiABKAIIIAVzIgVBFnZB/AdxQdA4aigCACAFQQ52QfwHcUHQMGooAgAgBUEGdkH8B3FB0ChqKAIAIAVB/wFxQQJ0QdAgaigCAHNzcyEFIAEoAgQgBHMiBEEWdkH8B3FB0DhqKAIAIARBDnZB/AdxQdAwaigCACAEQQZ2QfwHcUHQKGooAgAgBEH/AXFBAnRB0CBqKAIAc3NzIQQgASgCACAAcyIAQRZ2QfwHcUHQOGooAgAgAEEOdkH8B3FB0DBqKAIAIABBBnZB/AdxQdAoaigCACAAQf8BcUECdEHQIGooAgBzc3MhACABQRRqIQEgCEEBayIIDQALIAMhAQsgAiAJaiECIAEoAhAgASgCDCABKAIIIAEoAgQgASgCACAAcyIAQQh2IABB/wFxQQJ0QdAYaigCAHMiAEEIdiAAQf8BcUECdEHQGGooAgBzIgBBCHYgAEH/AXFBAnRB0BhqKAIAcyIAQf8BcUECdEHQGGooAgAgBHNzIABBCHZzIgBBCHYgAEH/AXFBAnRB0BhqKAIAcyIAQQh2IABB/wFxQQJ0QdAYaigCAHMiAEEIdiAAQf8BcUECdEHQGGooAgBzIgBB/wFxQQJ0QdAYaigCACAFc3MgAEEIdnMiAEEIdiAAQf8BcUECdEHQGGooAgBzIgBBCHYgAEH/AXFBAnRB0BhqKAIAcyIAQQh2IABB/wFxQQJ0QdAYaigCAHMiAEH/AXFBAnRB0BhqKAIAIAZzcyAAQQh2cyIAQQh2IABB/wFxQQJ0QdAYaigCAHMiAEEIdiAAQf8BcUECdEHQGGooAgBzIgBBCHYgAEH/AXFBAnRB0BhqKAIAcyIAQf8BcUECdEHQGGooAgAgB3NzIABBCHZzIgBBCHYgAEH/AXFBAnRB0BhqKAIAcyIAQQh2IABB/wFxQQJ0QdAYaigCAHMiAEEIdiAAQf8BcUECdEHQGGooAgBzIgBBCHYgAEH/AXFBAnRB0BhqKAIAcyEAIAFBFGohAQsgAkEHSwRAA0AgAS0AByABLQAGIAEtAAUgAS0ABCABLQADIAEtAAIgAS0AASABLQAAIABB/wFxc0ECdEHQGGooAgAgAEEIdnMiAEH/AXFzQQJ0QdAYaigCACAAQQh2cyIAQf8BcXNBAnRB0BhqKAIAIABBCHZzIgBB/wFxc0ECdEHQGGooAgAgAEEIdnMiAEH/AXFzQQJ0QdAYaigCACAAQQh2cyIAQf8BcXNBAnRB0BhqKAIAIABBCHZzIgBB/wFxc0ECdEHQGGooAgAgAEEIdnMiAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBCGohASACQQhrIgJBB0sNAAsLAkAgAkUNACACQQFxBH8gAS0AACAAQf8BcXNBAnRB0BhqKAIAIABBCHZzIQAgAUEBaiEBIAJBAWsFIAILIQMgAkEBRg0AA0AgAS0AASABLQAAIABB/wFxc0ECdEHQGGooAgAgAEEIdnMiAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBAmohASADQQJrIgMNAAsLIABBf3MLwgIBA38jAEEQayIIJAACfwJAIAAEQCAEDQEgBVANAQsgBgRAIAZBADYCBCAGQRI2AgALQQAMAQtBgAEQCSIHRQRAIAYEQCAGQQA2AgQgBkEONgIAC0EADAELIAcgATcDCCAHQgA3AwAgB0EoaiIJECogByAFNwMYIAcgBDYCECAHIAM6AGAgB0EANgJsIAdCADcCZCAAKQMYIQEgCEF/NgIIIAhCjoCAgPAANwMAIAdBECAIECQgAUL/gQGDhCIBNwNwIAcgAadBBnZBAXE6AHgCQCACRQ0AIAkgAhBgQX9KDQAgBxAGQQAMAQsgBhBfIgIEQCAAIAAoAjBBAWo2AjAgAiAHNgIIIAJBATYCBCACIAA2AgAgAkI/IAAgB0EAQgBBDkEBEQoAIgEgAUIAUxs3AxgLIAILIQAgCEEQaiQAIAALYgEBf0E4EAkiAUUEQCAABEAgAEEANgIEIABBDjYCAAtBAA8LIAFBADYCCCABQgA3AwAgAUIANwMgIAFCgICAgBA3AiwgAUEAOgAoIAFBADYCFCABQgA3AgwgAUEAOwE0IAELuwEBAX4gASkDACICQgKDUEUEQCAAIAEpAxA3AxALIAJCBINQRQRAIAAgASkDGDcDGAsgAkIIg1BFBEAgACABKQMgNwMgCyACQhCDUEUEQCAAIAEoAig2AigLIAJCIINQRQRAIAAgASgCLDYCLAsgAkLAAINQRQRAIAAgAS8BMDsBMAsgAkKAAYNQRQRAIAAgAS8BMjsBMgsgAkKAAoNQRQRAIAAgASgCNDYCNAsgACAAKQMAIAKENwMAQQALGQAgAUUEQEEADwsgACABKAIAIAEzAQQQGws3AQJ/IABBACABG0UEQCAAIAFGDwsgAC8BBCIDIAEvAQRGBH8gACgCACABKAIAIAMQPQVBAQtFCyIBAX8gAUUEQEEADwsgARAJIgJFBEBBAA8LIAIgACABEAcLKQAgACABIAIgAyAEEEUiAEUEQEEADwsgACACQQAgBBA1IQEgABAGIAELcQEBfgJ/AkAgAkJ/VwRAIAMEQCADQQA2AgQgA0EUNgIACwwBCyAAIAEgAhARIgRCf1cEQCADBEAgAyAAKAIMNgIAIAMgACgCEDYCBAsMAQtBACACIARXDQEaIAMEQCADQQA2AgQgA0ERNgIACwtBfwsLNQAgACABIAJBABAmIgBFBEBBfw8LIAMEQCADIAAtAAk6AAALIAQEQCAEIAAoAkQ2AgALQQAL/AECAn8BfiMAQRBrIgMkAAJAIAAgA0EOaiABQYAGQQAQRiIARQRAIAIhAAwBCyADLwEOIgFBBUkEQCACIQAMAQsgAC0AAEEBRwRAIAIhAAwBCyAAIAGtQv//A4MQFyIBRQRAIAIhAAwBCyABEH0aAkAgARAVIAIEfwJ/IAIvAQQhAEEAIAIoAgAiBEUNABpBACAEIABB1IABKAIAEQAACwVBAAtHBEAgAiEADAELIAEgAS0AAAR+IAEpAwggASkDEH0FQgALIgVC//8DgxATIAWnQf//A3FBgBBBABA1IgBFBEAgAiEADAELIAIQEAsgARAICyADQRBqJAAgAAvmDwIIfwJ+IwBB4ABrIgckAEEeQS4gAxshCwJAAkAgAgRAIAIiBSIGLQAABH4gBikDCCAGKQMQfQVCAAsgC61aDQEgBARAIARBADYCBCAEQRM2AgALQn8hDQwCCyABIAutIAcgBBAtIgUNAEJ/IQ0MAQsgBUIEEBMoAABBoxJBqBIgAxsoAABHBEAgBARAIARBADYCBCAEQRM2AgALQn8hDSACDQEgBRAIDAELIABCADcDICAAQQA2AhggAEL/////DzcDECAAQQA7AQwgAEG/hig2AgggAEEBOgAGIABBADsBBCAAQQA2AgAgAEIANwNIIABBgIDYjXg2AkQgAEIANwMoIABCADcDMCAAQgA3AzggAEFAa0EAOwEAIABCADcDUCAAIAMEf0EABSAFEAwLOwEIIAAgBRAMOwEKIAAgBRAMOwEMIAAgBRAMNgIQIAUQDCEGIAUQDCEJIAdBADYCWCAHQgA3A1AgB0IANwNIIAcgCUEfcTYCPCAHIAZBC3Y2AjggByAGQQV2QT9xNgI0IAcgBkEBdEE+cTYCMCAHIAlBCXZB0ABqNgJEIAcgCUEFdkEPcUEBazYCQCAAIAdBMGoQBTYCFCAAIAUQFTYCGCAAIAUQFa03AyAgACAFEBWtNwMoIAUQDCEIIAUQDCEGIAACfiADBEBBACEJIABBADYCRCAAQQA7AUAgAEEANgI8QgAMAQsgBRAMIQkgACAFEAw2AjwgACAFEAw7AUAgACAFEBU2AkQgBRAVrQs3A0ggBS0AAEUEQCAEBEAgBEEANgIEIARBFDYCAAtCfyENIAINASAFEAgMAQsCQCAALwEMIgpBAXEEQCAKQcAAcQRAIABB//8DOwFSDAILIABBATsBUgwBCyAAQQA7AVILIABBADYCOCAAQgA3AzAgBiAIaiAJaiEKAkAgAgRAIAUtAAAEfiAFKQMIIAUpAxB9BUIACyAKrVoNASAEBEAgBEEANgIEIARBFTYCAAtCfyENDAILIAUQCCABIAqtQQAgBBAtIgUNAEJ/IQ0MAQsCQCAIRQ0AIAAgBSABIAhBASAEEGQiCDYCMCAIRQRAIAQoAgBBEUYEQCAEBEAgBEEANgIEIARBFTYCAAsLQn8hDSACDQIgBRAIDAILIAAtAA1BCHFFDQAgCEECECNBBUcNACAEBEAgBEEANgIEIARBFTYCAAtCfyENIAINASAFEAgMAQsgAEE0aiEIAkAgBkUNACAFIAEgBkEAIAQQRSIMRQRAQn8hDSACDQIgBRAIDAILIAwgBkGAAkGABCADGyAIIAQQbiEGIAwQBiAGRQRAQn8hDSACDQIgBRAIDAILIANFDQAgAEEBOgAECwJAIAlFDQAgACAFIAEgCUEAIAQQZCIBNgI4IAFFBEBCfyENIAINAiAFEAgMAgsgAC0ADUEIcUUNACABQQIQI0EFRw0AIAQEQCAEQQA2AgQgBEEVNgIAC0J/IQ0gAg0BIAUQCAwBCyAAIAAoAjRB9eABIAAoAjAQZzYCMCAAIAAoAjRB9cYBIAAoAjgQZzYCOAJAAkAgACkDKEL/////D1ENACAAKQMgQv////8PUQ0AIAApA0hC/////w9SDQELAkACQAJAIAgoAgAgB0EwakEBQYACQYAEIAMbIAQQRiIBRQRAIAJFDQEMAgsgASAHMwEwEBciAUUEQCAEBEAgBEEANgIEIARBDjYCAAsgAkUNAQwCCwJAIAApAyhC/////w9RBEAgACABEB03AygMAQsgA0UNAEEAIQYCQCABKQMQIg5CCHwiDSAOVA0AIAEpAwggDVQNACABIA03AxBBASEGCyABIAY6AAALIAApAyBC/////w9RBEAgACABEB03AyALAkAgAw0AIAApA0hC/////w9RBEAgACABEB03A0gLIAAoAjxB//8DRw0AIAAgARAVNgI8CyABLQAABH8gASkDECABKQMIUQVBAAsNAiAEBEAgBEEANgIEIARBFTYCAAsgARAIIAINAQsgBRAIC0J/IQ0MAgsgARAICyAFLQAARQRAIAQEQCAEQQA2AgQgBEEUNgIAC0J/IQ0gAg0BIAUQCAwBCyACRQRAIAUQCAtCfyENIAApA0hCf1cEQCAEBEAgBEEWNgIEIARBBDYCAAsMAQsjAEEQayIDJABBASEBAkAgACgCEEHjAEcNAEEAIQECQCAAKAI0IANBDmpBgbICQYAGQQAQRiICBEAgAy8BDiIFQQZLDQELIAQEQCAEQQA2AgQgBEEVNgIACwwBCyACIAWtQv//A4MQFyICRQRAIAQEQCAEQQA2AgQgBEEUNgIACwwBC0EBIQECQAJAAkAgAhAMQQFrDgICAQALQQAhASAEBEAgBEEANgIEIARBGDYCAAsgAhAIDAILIAApAyhCE1YhAQsgAkICEBMvAABBwYoBRwRAQQAhASAEBEAgBEEANgIEIARBGDYCAAsgAhAIDAELIAIQfUEBayIFQf8BcUEDTwRAQQAhASAEBEAgBEEANgIEIARBGDYCAAsgAhAIDAELIAMvAQ5BB0cEQEEAIQEgBARAIARBADYCBCAEQRU2AgALIAIQCAwBCyAAIAE6AAYgACAFQf8BcUGBAmo7AVIgACACEAw2AhAgAhAIQQEhAQsgA0EQaiQAIAFFDQAgCCAIKAIAEG02AgAgCiALaq0hDQsgB0HgAGokACANC4ECAQR/IwBBEGsiBCQAAkAgASAEQQxqQcAAQQAQJSIGRQ0AIAQoAgxBBWoiA0GAgARPBEAgAgRAIAJBADYCBCACQRI2AgALDAELQQAgA60QFyIDRQRAIAIEQCACQQA2AgQgAkEONgIACwwBCyADQQEQcCADIAEEfwJ/IAEvAQQhBUEAIAEoAgAiAUUNABpBACABIAVB1IABKAIAEQAACwVBAAsQEiADIAYgBCgCDBAsAn8gAy0AAEUEQCACBEAgAkEANgIEIAJBFDYCAAtBAAwBCyAAIAMtAAAEfiADKQMQBUIAC6dB//8DcSADKAIEEEcLIQUgAxAICyAEQRBqJAAgBQvgAQICfwF+QTAQCSICRQRAIAEEQCABQQA2AgQgAUEONgIAC0EADwsgAkIANwMIIAJBADYCACACQgA3AxAgAkIANwMYIAJCADcDICACQgA3ACUgAFAEQCACDwsCQCAAQv////8AVg0AIACnQQR0EAkiA0UNACACIAM2AgBBACEBQgEhBANAIAMgAUEEdGoiAUIANwIAIAFCADcABSAAIARSBEAgBKchASAEQgF8IQQMAQsLIAIgADcDCCACIAA3AxAgAg8LIAEEQCABQQA2AgQgAUEONgIAC0EAEBAgAhAGQQAL7gECA38BfiMAQRBrIgQkAAJAIARBDGpCBBAXIgNFBEBBfyECDAELAkAgAQRAIAJBgAZxIQUDQAJAIAUgASgCBHFFDQACQCADKQMIQgBUBEAgA0EAOgAADAELIANCADcDECADQQE6AAALIAMgAS8BCBANIAMgAS8BChANIAMtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAtBfyECDAQLQX8hAiAAIARBDGpCBBAbQQBIDQMgATMBCiIGUA0AIAAgASgCDCAGEBtBAEgNAwsgASgCACIBDQALC0EAIQILIAMQCAsgBEEQaiQAIAILPAEBfyAABEAgAUGABnEhAQNAIAEgACgCBHEEQCACIAAvAQpqQQRqIQILIAAoAgAiAA0ACwsgAkH//wNxC5wBAQN/IABFBEBBAA8LIAAhAwNAAn8CQAJAIAAvAQgiAUH04AFNBEAgAUEBRg0BIAFB9cYBRg0BDAILIAFBgbICRg0AIAFB9eABRw0BCyAAKAIAIQEgAEEANgIAIAAoAgwQBiAAEAYgASADIAAgA0YbIQMCQCACRQRAQQAhAgwBCyACIAE2AgALIAEMAQsgACICKAIACyIADQALIAMLsgQCBX8BfgJAAkACQCAAIAGtEBciAQRAIAEtAAANAUEAIQAMAgsgBARAIARBADYCBCAEQQ42AgALQQAPC0EAIQADQCABLQAABH4gASkDCCABKQMQfQVCAAtCBFQNASABEAwhByABIAEQDCIGrRATIghFBEBBACECIAQEQCAEQQA2AgQgBEEVNgIACyABEAggAEUNAwNAIAAoAgAhASAAKAIMEAYgABAGIAEiAA0ACwwDCwJAAkBBEBAJIgUEQCAFIAY7AQogBSAHOwEIIAUgAjYCBCAFQQA2AgAgBkUNASAFIAggBhBjIgY2AgwgBg0CIAUQBgtBACECIAQEQCAEQQA2AgQgBEEONgIACyABEAggAEUNBANAIAAoAgAhASAAKAIMEAYgABAGIAEiAA0ACwwECyAFQQA2AgwLAkAgAEUEQCAFIQAMAQsgCSAFNgIACyAFIQkgAS0AAA0ACwsCQCABLQAABH8gASkDECABKQMIUQVBAAsNACABIAEtAAAEfiABKQMIIAEpAxB9BUIACyIKQv////8PgxATIQICQCAKpyIFQQNLDQAgAkUNACACQcEUIAUQPUUNAQtBACECIAQEQCAEQQA2AgQgBEEVNgIACyABEAggAEUNAQNAIAAoAgAhASAAKAIMEAYgABAGIAEiAA0ACwwBCyABEAggAwRAIAMgADYCAEEBDwtBASECIABFDQADQCAAKAIAIQEgACgCDBAGIAAQBiABIgANAAsLIAILvgEBBX8gAAR/IAAhAgNAIAIiBCgCACICDQALIAEEQANAIAEiAy8BCCEGIAMoAgAhASAAIQICQAJAA0ACQCACLwEIIAZHDQAgAi8BCiIFIAMvAQpHDQAgBUUNAiACKAIMIAMoAgwgBRA9RQ0CCyACKAIAIgINAAsgA0EANgIAIAQgAzYCACADIQQMAQsgAiACKAIEIAMoAgRBgAZxcjYCBCADQQA2AgAgAygCDBAGIAMQBgsgAQ0ACwsgAAUgAQsLVQICfgF/AkACQCAALQAARQ0AIAApAxAiAkIBfCIDIAJUDQAgAyAAKQMIWA0BCyAAQQA6AAAPCyAAKAIEIgRFBEAPCyAAIAM3AxAgBCACp2ogAToAAAt9AQN/IwBBEGsiAiQAIAIgATYCDEF/IQMCQCAALQAoDQACQCAAKAIAIgRFDQAgBCABEHFBf0oNACAAKAIAIQEgAEEMaiIABEAgACABKAIMNgIAIAAgASgCEDYCBAsMAQsgACACQQxqQgRBExAOQj+HpyEDCyACQRBqJAAgAwvdAQEDfyABIAApAzBaBEAgAEEIagRAIABBADYCDCAAQRI2AggLQX8PCyAAQQhqIQIgAC0AGEECcQRAIAIEQCACQQA2AgQgAkEZNgIAC0F/DwtBfyEDAkAgACABQQAgAhBTIgRFDQAgACgCUCAEIAIQfkUNAAJ/IAEgACkDMFoEQCAAQQhqBEAgAEEANgIMIABBEjYCCAtBfwwBCyABp0EEdCICIAAoAkBqKAIEECAgACgCQCACaiICQQA2AgQgAhBAQQALDQAgACgCQCABp0EEdGpBAToADEEAIQMLIAMLpgIBBX9BfyEFAkAgACABQQBBABAmRQ0AIAAtABhBAnEEQCAAQQhqIgAEQCAAQQA2AgQgAEEZNgIAC0F/DwsCfyAAKAJAIgQgAaciBkEEdGooAgAiBUUEQCADQYCA2I14RyEHQQMMAQsgBSgCRCADRyEHIAUtAAkLIQggBCAGQQR0aiIEIQYgBCgCBCEEQQAgAiAIRiAHG0UEQAJAIAQNACAGIAUQKyIENgIEIAQNACAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0F/DwsgBCADNgJEIAQgAjoACSAEIAQoAgBBEHI2AgBBAA8LQQAhBSAERQ0AIAQgBCgCAEFvcSIANgIAIABFBEAgBBAgIAZBADYCBEEADwsgBCADNgJEIAQgCDoACQsgBQvjCAIFfwR+IAAtABhBAnEEQCAAQQhqBEAgAEEANgIMIABBGTYCCAtCfw8LIAApAzAhCwJAIANBgMAAcQRAIAAgASADQQAQTCIJQn9SDQELAn4CQAJAIAApAzAiCUIBfCIMIAApAzgiClQEQCAAKAJAIQQMAQsgCkIBhiIJQoAIIAlCgAhUGyIJQhAgCUIQVhsgCnwiCadBBHQiBK0gCkIEhkLw////D4NUDQEgACgCQCAEEDQiBEUNASAAIAk3AzggACAENgJAIAApAzAiCUIBfCEMCyAAIAw3AzAgBCAJp0EEdGoiBEIANwIAIARCADcABSAJDAELIABBCGoEQCAAQQA2AgwgAEEONgIIC0J/CyIJQgBZDQBCfw8LAkAgAUUNAAJ/QQAhBCAJIAApAzBaBEAgAEEIagRAIABBADYCDCAAQRI2AggLQX8MAQsgAC0AGEECcQRAIABBCGoEQCAAQQA2AgwgAEEZNgIIC0F/DAELAkAgAUUNACABLQAARQ0AQX8gASABECJB//8DcSADIABBCGoQNSIERQ0BGiADQYAwcQ0AIARBABAjQQNHDQAgBEECNgIICwJAIAAgAUEAQQAQTCIKQgBTIgENACAJIApRDQAgBBAQIABBCGoEQCAAQQA2AgwgAEEKNgIIC0F/DAELAkAgAUEBIAkgClEbRQ0AAkACfwJAIAAoAkAiASAJpyIFQQR0aiIGKAIAIgMEQCADKAIwIAQQYg0BCyAEIAYoAgQNARogBiAGKAIAECsiAzYCBCAEIAMNARogAEEIagRAIABBADYCDCAAQQ42AggLDAILQQEhByAGKAIAKAIwC0EAQQAgAEEIaiIDECUiCEUNAAJAAkAgASAFQQR0aiIFKAIEIgENACAGKAIAIgENAEEAIQEMAQsgASgCMCIBRQRAQQAhAQwBCyABQQBBACADECUiAUUNAQsgACgCUCAIIAlBACADEE1FDQAgAQRAIAAoAlAgAUEAEH4aCyAFKAIEIQMgBwRAIANFDQIgAy0AAEECcUUNAiADKAIwEBAgBSgCBCIBIAEoAgBBfXEiAzYCACADRQRAIAEQICAFQQA2AgQgBBAQQQAMBAsgASAGKAIAKAIwNgIwIAQQEEEADAMLIAMoAgAiAUECcQRAIAMoAjAQECAFKAIEIgMoAgAhAQsgAyAENgIwIAMgAUECcjYCAEEADAILIAQQEEF/DAELIAQQEEEAC0UNACALIAApAzBRBEBCfw8LIAAoAkAgCadBBHRqED4gACALNwMwQn8PCyAJpyIGQQR0IgEgACgCQGoQQAJAAkAgACgCQCIEIAFqIgMoAgAiBUUNAAJAIAMoAgQiAwRAIAMoAgAiAEEBcUUNAQwCCyAFECshAyAAKAJAIgQgBkEEdGogAzYCBCADRQ0CIAMoAgAhAAsgA0F+NgIQIAMgAEEBcjYCAAsgASAEaiACNgIIIAkPCyAAQQhqBEAgAEEANgIMIABBDjYCCAtCfwteAQF/IwBBEGsiAiQAAn8gACgCJEEBRwRAIABBDGoiAARAIABBADYCBCAAQRI2AgALQX8MAQsgAkEANgIIIAIgATcDACAAIAJCEEEMEA5CP4enCyEAIAJBEGokACAAC9oDAQZ/IwBBEGsiBSQAIAUgAjYCDCMAQaABayIEJAAgBEEIakHA8ABBkAEQBxogBCAANgI0IAQgADYCHCAEQX4gAGsiA0H/////ByADQf////8HSRsiBjYCOCAEIAAgBmoiADYCJCAEIAA2AhggBEEIaiEAIwBB0AFrIgMkACADIAI2AswBIANBoAFqQQBBKBAZIAMgAygCzAE2AsgBAkBBACABIANByAFqIANB0ABqIANBoAFqEEpBAEgNACAAKAJMQQBOIQcgACgCACECIAAsAEpBAEwEQCAAIAJBX3E2AgALIAJBIHEhCAJ/IAAoAjAEQCAAIAEgA0HIAWogA0HQAGogA0GgAWoQSgwBCyAAQdAANgIwIAAgA0HQAGo2AhAgACADNgIcIAAgAzYCFCAAKAIsIQIgACADNgIsIAAgASADQcgBaiADQdAAaiADQaABahBKIAJFDQAaIABBAEEAIAAoAiQRAAAaIABBADYCMCAAIAI2AiwgAEEANgIcIABBADYCECAAKAIUGiAAQQA2AhRBAAsaIAAgACgCACAIcjYCACAHRQ0ACyADQdABaiQAIAYEQCAEKAIcIgAgACAEKAIYRmtBADoAAAsgBEGgAWokACAFQRBqJAALUwEDfwJAIAAoAgAsAABBMGtBCk8NAANAIAAoAgAiAiwAACEDIAAgAkEBajYCACABIANqQTBrIQEgAiwAAUEwa0EKTw0BIAFBCmwhAQwACwALIAELuwIAAkAgAUEUSw0AAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4KAAECAwQFBgcICQoLIAIgAigCACIBQQRqNgIAIAAgASgCADYCAA8LIAIgAigCACIBQQRqNgIAIAAgATQCADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATUCADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASkDADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASsDADkDAA8LIAAgAkEAEQcACwubAgAgAEUEQEEADwsCfwJAIAAEfyABQf8ATQ0BAkBB9IIBKAIAKAIARQRAIAFBgH9xQYC/A0YNAwwBCyABQf8PTQRAIAAgAUE/cUGAAXI6AAEgACABQQZ2QcABcjoAAEECDAQLIAFBgLADT0EAIAFBgEBxQYDAA0cbRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMMBAsgAUGAgARrQf//P00EQCAAIAFBP3FBgAFyOgADIAAgAUESdkHwAXI6AAAgACABQQZ2QT9xQYABcjoAAiAAIAFBDHZBP3FBgAFyOgABQQQMBAsLQYSEAUEZNgIAQX8FQQELDAELIAAgAToAAEEBCwvjAQECfyACQQBHIQMCQAJAAkAgAEEDcUUNACACRQ0AIAFB/wFxIQQDQCAALQAAIARGDQIgAkEBayICQQBHIQMgAEEBaiIAQQNxRQ0BIAINAAsLIANFDQELAkAgAC0AACABQf8BcUYNACACQQRJDQAgAUH/AXFBgYKECGwhAwNAIAAoAgAgA3MiBEF/cyAEQYGChAhrcUGAgYKEeHENASAAQQRqIQAgAkEEayICQQNLDQALCyACRQ0AIAFB/wFxIQEDQCABIAAtAABGBEAgAA8LIABBAWohACACQQFrIgINAAsLQQALeQEBfAJAIABFDQAgACsDECAAKwMgIgIgAUQAAAAAAAAAACABRAAAAAAAAAAAZBsiAUQAAAAAAADwPyABRAAAAAAAAPA/YxsgACsDKCACoaKgIgEgACsDGKFjRQ0AIAAoAgAgASAAKAIMIAAoAgQRDgAgACABOQMYCwtIAQF8AkAgAEUNACAAKwMQIAArAyAiASAAKwMoIAGhoCIBIAArAxihY0UNACAAKAIAIAEgACgCDCAAKAIEEQ4AIAAgATkDGAsLWgICfgF/An8CQAJAIAAtAABFDQAgACkDECIBQgF8IgIgAVQNACACIAApAwhYDQELIABBADoAAEEADAELQQAgACgCBCIDRQ0AGiAAIAI3AxAgAyABp2otAAALC4IEAgZ/AX4gAEEAIAEbRQRAIAIEQCACQQA2AgQgAkESNgIAC0EADwsCQAJAIAApAwhQDQAgACgCECABLQAAIgQEf0Kl6wohCSABIQMDQCAJIAStQv8Bg3whCSADLQABIgQEQCADQQFqIQMgCUL/////D4NCIX4hCQwBCwsgCacFQYUqCyIEIAAoAgBwQQJ0aiIGKAIAIgNFDQADQAJAIAMoAhwgBEcNACABIAMoAgAQOA0AAkAgAykDCEJ/UQRAIAMoAhghAQJAIAUEQCAFIAE2AhgMAQsgBiABNgIACyADEAYgACAAKQMIQgF9Igk3AwggCbogACgCACIBuER7FK5H4XqEP6JjRQ0BIAFBgQJJDQECf0EAIQMgACgCACIGIAFBAXYiBUcEQCAFEDwiB0UEQCACBEAgAkEANgIEIAJBDjYCAAtBAAwCCwJAIAApAwhCACAGG1AEQCAAKAIQIQQMAQsgACgCECEEA0AgBCADQQJ0aigCACIBBEADQCABKAIYIQIgASAHIAEoAhwgBXBBAnRqIggoAgA2AhggCCABNgIAIAIiAQ0ACwsgA0EBaiIDIAZHDQALCyAEEAYgACAFNgIAIAAgBzYCEAtBAQsNAQwFCyADQn83AxALQQEPCyADIgUoAhgiAw0ACwsgAgRAIAJBADYCBCACQQk2AgALC0EAC6UGAgl/AX4jAEHwAGsiBSQAAkACQCAARQ0AAkAgAQRAIAEpAzAgAlYNAQtBACEDIABBCGoEQCAAQQA2AgwgAEESNgIICwwCCwJAIANBCHENACABKAJAIAKnQQR0aiIGKAIIRQRAIAYtAAxFDQELQQAhAyAAQQhqBEAgAEEANgIMIABBDzYCCAsMAgsgASACIANBCHIgBUE4ahCKAUF/TARAQQAhAyAAQQhqBEAgAEEANgIMIABBFDYCCAsMAgsgA0EDdkEEcSADciIGQQRxIQcgBSkDUCEOIAUvAWghCQJAIANBIHFFIAUvAWpBAEdxIgtFDQAgBA0AIAAoAhwiBA0AQQAhAyAAQQhqBEAgAEEANgIMIABBGjYCCAsMAgsgBSkDWFAEQCAAQQBCAEEAEFIhAwwCCwJAIAdFIgwgCUEAR3EiDUEBckUEQEEAIQMgBUEAOwEwIAUgDjcDICAFIA43AxggBSAFKAJgNgIoIAVC3AA3AwAgASgCACAOIAVBACABIAIgAEEIahBeIgYNAQwDC0EAIQMgASACIAYgAEEIaiIGECYiB0UNAiABKAIAIAUpA1ggBUE4aiAHLwEMQQF2QQNxIAEgAiAGEF4iBkUNAgsCfyAGIAE2AiwCQCABKAJEIghBAWoiCiABKAJIIgdJBEAgASgCTCEHDAELIAEoAkwgB0EKaiIIQQJ0EDQiB0UEQCABQQhqBEAgAUEANgIMIAFBDjYCCAtBfwwCCyABIAc2AkwgASAINgJIIAEoAkQiCEEBaiEKCyABIAo2AkQgByAIQQJ0aiAGNgIAQQALQX9MBEAgBhALDAELAkAgC0UEQCAGIQEMAQtBJkEAIAUvAWpBAUYbIgFFBEAgAEEIagRAIABBADYCDCAAQRg2AggLDAMLIAAgBiAFLwFqQQAgBCABEQYAIQEgBhALIAFFDQILAkAgDUUEQCABIQMMAQsgACABIAUvAWgQgQEhAyABEAsgA0UNAQsCQCAJRSAMckUEQCADIQEMAQsgACADQQEQgAEhASADEAsgAUUNAQsgASEDDAELQQAhAwsgBUHwAGokACADC4UBAQF/IAFFBEAgAEEIaiIABEAgAEEANgIEIABBEjYCAAtBAA8LQTgQCSIDRQRAIABBCGoiAARAIABBADYCBCAAQQ42AgALQQAPCyADQQA2AhAgA0IANwIIIANCADcDKCADQQA2AgQgAyACNgIAIANCADcDGCADQQA2AjAgACABQTsgAxBCCw8AIAAgASACQQBBABCCAQusAgECfyABRQRAIABBCGoiAARAIABBADYCBCAAQRI2AgALQQAPCwJAIAJBfUsNACACQf//A3FBCEYNACAAQQhqIgAEQCAAQQA2AgQgAEEQNgIAC0EADwsCQEGwwAAQCSIFBEAgBUEANgIIIAVCADcCACAFQYiBAUGogQEgAxs2AqhAIAUgAjYCFCAFIAM6ABAgBUEAOgAPIAVBADsBDCAFIAMgAkF9SyIGcToADiAFQQggAiAGG0H//wNxIAQgBUGIgQFBqIEBIAMbKAIAEQAAIgI2AqxAIAINASAFEDEgBRAGCyAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0EADwsgACABQTogBRBCIgAEfyAABSAFKAKsQCAFKAKoQCgCBBEDACAFEDEgBRAGQQALC6ABAQF/IAIgACgCBCIDIAIgA0kbIgIEQCAAIAMgAms2AgQCQAJAAkACQCAAKAIcIgMoAhRBAWsOAgEAAgsgA0GgAWogASAAKAIAIAJB3IABKAIAEQgADAILIAAgACgCMCABIAAoAgAgAkHEgAEoAgARBAA2AjAMAQsgASAAKAIAIAIQBxoLIAAgACgCACACajYCACAAIAAoAgggAmo2AggLC7cCAQR/QX4hAgJAIABFDQAgACgCIEUNACAAKAIkIgRFDQAgACgCHCIBRQ0AIAEoAgAgAEcNAAJAAkAgASgCICIDQTlrDjkBAgICAgICAgICAgIBAgICAQICAgICAgICAgICAgICAgICAQICAgICAgICAgICAQICAgICAgICAgEACyADQZoFRg0AIANBKkcNAQsCfwJ/An8gASgCBCICBEAgBCAAKAIoIAIQHiAAKAIcIQELIAEoAlAiAgsEQCAAKAIkIAAoAiggAhAeIAAoAhwhAQsgASgCTCICCwRAIAAoAiQgACgCKCACEB4gACgCHCEBCyABKAJIIgILBEAgACgCJCAAKAIoIAIQHiAAKAIcIQELIAAoAiQgACgCKCABEB4gAEEANgIcQX1BACADQfEARhshAgsgAgvrCQEIfyAAKAIwIgMgACgCDEEFayICIAIgA0sbIQggACgCACIEKAIEIQkgAUEERiEHAkADQCAEKAIQIgMgACgCoC5BKmpBA3UiAkkEQEEBIQYMAgsgCCADIAJrIgMgACgCaCAAKAJYayICIAQoAgRqIgVB//8DIAVB//8DSRsiBiADIAZJGyIDSwRAQQEhBiADQQBHIAdyRQ0CIAFFDQIgAyAFRw0CCyAAQQBBACAHIAMgBUZxIgUQOSAAIAAoAhBBBGsiBDYCECAAKAIEIARqIAM7AAAgACAAKAIQQQJqIgQ2AhAgACgCBCAEaiADQX9zOwAAIAAgACgCEEECajYCECAAKAIAEAoCfyACBEAgACgCACgCDCAAKAJIIAAoAlhqIAMgAiACIANLGyICEAcaIAAoAgAiBCAEKAIMIAJqNgIMIAQgBCgCECACazYCECAEIAQoAhQgAmo2AhQgACAAKAJYIAJqNgJYIAMgAmshAwsgAwsEQCAAKAIAIgIgAigCDCADEIMBIAAoAgAiAiACKAIMIANqNgIMIAIgAigCECADazYCECACIAIoAhQgA2o2AhQLIAAoAgAhBCAFRQ0AC0EAIQYLAkAgCSAEKAIEayICRQRAIAAoAmghAwwBCwJAIAAoAjAiAyACTQRAIABBAjYCgC4gACgCSCAEKAIAIANrIAMQBxogACAAKAIwIgM2AoQuIAAgAzYCaAwBCyACIAAoAkQgACgCaCIFa08EQCAAIAUgA2siBDYCaCAAKAJIIgUgAyAFaiAEEAcaIAAoAoAuIgNBAU0EQCAAIANBAWo2AoAuCyAAIAAoAmgiBSAAKAKELiIDIAMgBUsbNgKELiAAKAIAIQQLIAAoAkggBWogBCgCACACayACEAcaIAAgACgCaCACaiIDNgJoIAAgACgCMCAAKAKELiIEayIFIAIgAiAFSxsgBGo2AoQuCyAAIAM2AlgLIAAgAyAAKAJAIgIgAiADSRs2AkBBAyECAkAgBkUNACAAKAIAIgUoAgQhAgJAAkAgAUF7cUUNACACDQBBASECIAMgACgCWEYNAiAAKAJEIANrIQRBACECDAELIAIgACgCRCADayIETQ0AIAAoAlgiByAAKAIwIgZIDQAgACADIAZrIgM2AmggACAHIAZrNgJYIAAoAkgiAiACIAZqIAMQBxogACgCgC4iA0EBTQRAIAAgA0EBajYCgC4LIAAgACgCaCIDIAAoAoQuIgIgAiADSxs2AoQuIAAoAjAgBGohBCAAKAIAIgUoAgQhAgsCQCACIAQgAiAESRsiAkUEQCAAKAIwIQUMAQsgBSAAKAJIIANqIAIQgwEgACAAKAJoIAJqIgM2AmggACAAKAIwIgUgACgChC4iBGsiBiACIAIgBksbIARqNgKELgsgACADIAAoAkAiAiACIANJGzYCQCADIAAoAlgiBmsiAyAFIAAoAgwgACgCoC5BKmpBA3VrIgJB//8DIAJB//8DSRsiBCAEIAVLG0kEQEEAIQIgAUEERiADQQBHckUNASABRQ0BIAAoAgAoAgQNASADIARLDQELQQAhAiABQQRGBEAgACgCACgCBEUgAyAETXEhAgsgACAAKAJIIAZqIAQgAyADIARLGyIBIAIQOSAAIAAoAlggAWo2AlggACgCABAKQQJBACACGw8LIAIL/woCCn8DfiAAKQOYLiENIAAoAqAuIQQgAkEATgRAQQRBAyABLwECIggbIQlBB0GKASAIGyEFQX8hCgNAIAghByABIAsiDEEBaiILQQJ0ai8BAiEIAkACQCAGQQFqIgMgBU4NACAHIAhHDQAgAyEGDAELAkAgAyAJSARAIAAgB0ECdGoiBkHOFWohCSAGQcwVaiEKA0AgCjMBACEPAn8gBCAJLwEAIgZqIgVBP00EQCAPIASthiANhCENIAUMAQsgBEHAAEYEQCAAKAIEIAAoAhBqIA03AAAgACAAKAIQQQhqNgIQIA8hDSAGDAELIAAoAgQgACgCEGogDyAErYYgDYQ3AAAgACAAKAIQQQhqNgIQIA9BwAAgBGutiCENIAVBQGoLIQQgA0EBayIDDQALDAELIAcEQAJAIAcgCkYEQCANIQ8gBCEFIAMhBgwBCyAAIAdBAnRqIgNBzBVqMwEAIQ8gBCADQc4Vai8BACIDaiIFQT9NBEAgDyAErYYgDYQhDwwBCyAEQcAARgRAIAAoAgQgACgCEGogDTcAACAAIAAoAhBBCGo2AhAgAyEFDAELIAAoAgQgACgCEGogDyAErYYgDYQ3AAAgACAAKAIQQQhqNgIQIAVBQGohBSAPQcAAIARrrYghDwsgADMBjBYhDgJAIAUgAC8BjhYiBGoiA0E/TQRAIA4gBa2GIA+EIQ4MAQsgBUHAAEYEQCAAKAIEIAAoAhBqIA83AAAgACAAKAIQQQhqNgIQIAQhAwwBCyAAKAIEIAAoAhBqIA4gBa2GIA+ENwAAIAAgACgCEEEIajYCECADQUBqIQMgDkHAACAFa62IIQ4LIAasQgN9IQ0gA0E9TQRAIANBAmohBCANIAOthiAOhCENDAILIANBwABGBEAgACgCBCAAKAIQaiAONwAAIAAgACgCEEEIajYCEEECIQQMAgsgACgCBCAAKAIQaiANIAOthiAOhDcAACAAIAAoAhBBCGo2AhAgA0E+ayEEIA1BwAAgA2utiCENDAELIAZBCUwEQCAAMwGQFiEOAkAgBCAALwGSFiIFaiIDQT9NBEAgDiAErYYgDYQhDgwBCyAEQcAARgRAIAAoAgQgACgCEGogDTcAACAAIAAoAhBBCGo2AhAgBSEDDAELIAAoAgQgACgCEGogDiAErYYgDYQ3AAAgACAAKAIQQQhqNgIQIANBQGohAyAOQcAAIARrrYghDgsgBqxCAn0hDSADQTxNBEAgA0EDaiEEIA0gA62GIA6EIQ0MAgsgA0HAAEYEQCAAKAIEIAAoAhBqIA43AAAgACAAKAIQQQhqNgIQQQMhBAwCCyAAKAIEIAAoAhBqIA0gA62GIA6ENwAAIAAgACgCEEEIajYCECADQT1rIQQgDUHAACADa62IIQ0MAQsgADMBlBYhDgJAIAQgAC8BlhYiBWoiA0E/TQRAIA4gBK2GIA2EIQ4MAQsgBEHAAEYEQCAAKAIEIAAoAhBqIA03AAAgACAAKAIQQQhqNgIQIAUhAwwBCyAAKAIEIAAoAhBqIA4gBK2GIA2ENwAAIAAgACgCEEEIajYCECADQUBqIQMgDkHAACAEa62IIQ4LIAatQgp9IQ0gA0E4TQRAIANBB2ohBCANIAOthiAOhCENDAELIANBwABGBEAgACgCBCAAKAIQaiAONwAAIAAgACgCEEEIajYCEEEHIQQMAQsgACgCBCAAKAIQaiANIAOthiAOhDcAACAAIAAoAhBBCGo2AhAgA0E5ayEEIA1BwAAgA2utiCENC0EAIQYCfyAIRQRAQYoBIQVBAwwBC0EGQQcgByAIRiIDGyEFQQNBBCADGwshCSAHIQoLIAIgDEcNAAsLIAAgBDYCoC4gACANNwOYLgv5BQIIfwJ+AkAgACgC8C1FBEAgACkDmC4hCyAAKAKgLiEDDAELA0AgCSIDQQNqIQkgAyAAKALsLWoiAy0AAiEFIAApA5guIQwgACgCoC4hBAJAIAMvAAAiB0UEQCABIAVBAnRqIgMzAQAhCyAEIAMvAQIiBWoiA0E/TQRAIAsgBK2GIAyEIQsMAgsgBEHAAEYEQCAAKAIEIAAoAhBqIAw3AAAgACAAKAIQQQhqNgIQIAUhAwwCCyAAKAIEIAAoAhBqIAsgBK2GIAyENwAAIAAgACgCEEEIajYCECADQUBqIQMgC0HAACAEa62IIQsMAQsgBUGAzwBqLQAAIghBAnQiBiABaiIDQYQIajMBACELIANBhghqLwEAIQMgCEEIa0ETTQRAIAUgBkGA0QBqKAIAa60gA62GIAuEIQsgBkHA0wBqKAIAIANqIQMLIAMgAiAHQQFrIgcgB0EHdkGAAmogB0GAAkkbQYDLAGotAAAiBUECdCIIaiIKLwECaiEGIAozAQAgA62GIAuEIQsgBCAFQQRJBH8gBgUgByAIQYDSAGooAgBrrSAGrYYgC4QhCyAIQcDUAGooAgAgBmoLIgVqIgNBP00EQCALIASthiAMhCELDAELIARBwABGBEAgACgCBCAAKAIQaiAMNwAAIAAgACgCEEEIajYCECAFIQMMAQsgACgCBCAAKAIQaiALIASthiAMhDcAACAAIAAoAhBBCGo2AhAgA0FAaiEDIAtBwAAgBGutiCELCyAAIAs3A5guIAAgAzYCoC4gCSAAKALwLUkNAAsLIAFBgAhqMwEAIQwCQCADIAFBgghqLwEAIgJqIgFBP00EQCAMIAOthiALhCEMDAELIANBwABGBEAgACgCBCAAKAIQaiALNwAAIAAgACgCEEEIajYCECACIQEMAQsgACgCBCAAKAIQaiAMIAOthiALhDcAACAAIAAoAhBBCGo2AhAgAUFAaiEBIAxBwAAgA2utiCEMCyAAIAw3A5guIAAgATYCoC4L8AQBA38gAEHkAWohAgNAIAIgAUECdCIDakEAOwEAIAIgA0EEcmpBADsBACABQQJqIgFBngJHDQALIABBADsBzBUgAEEAOwHYEyAAQZQWakEAOwEAIABBkBZqQQA7AQAgAEGMFmpBADsBACAAQYgWakEAOwEAIABBhBZqQQA7AQAgAEGAFmpBADsBACAAQfwVakEAOwEAIABB+BVqQQA7AQAgAEH0FWpBADsBACAAQfAVakEAOwEAIABB7BVqQQA7AQAgAEHoFWpBADsBACAAQeQVakEAOwEAIABB4BVqQQA7AQAgAEHcFWpBADsBACAAQdgVakEAOwEAIABB1BVqQQA7AQAgAEHQFWpBADsBACAAQcwUakEAOwEAIABByBRqQQA7AQAgAEHEFGpBADsBACAAQcAUakEAOwEAIABBvBRqQQA7AQAgAEG4FGpBADsBACAAQbQUakEAOwEAIABBsBRqQQA7AQAgAEGsFGpBADsBACAAQagUakEAOwEAIABBpBRqQQA7AQAgAEGgFGpBADsBACAAQZwUakEAOwEAIABBmBRqQQA7AQAgAEGUFGpBADsBACAAQZAUakEAOwEAIABBjBRqQQA7AQAgAEGIFGpBADsBACAAQYQUakEAOwEAIABBgBRqQQA7AQAgAEH8E2pBADsBACAAQfgTakEAOwEAIABB9BNqQQA7AQAgAEHwE2pBADsBACAAQewTakEAOwEAIABB6BNqQQA7AQAgAEHkE2pBADsBACAAQeATakEAOwEAIABB3BNqQQA7AQAgAEIANwL8LSAAQeQJakEBOwEAIABBADYC+C0gAEEANgLwLQuKAwIGfwR+QcgAEAkiBEUEQEEADwsgBEIANwMAIARCADcDMCAEQQA2AiggBEIANwMgIARCADcDGCAEQgA3AxAgBEIANwMIIARCADcDOCABUARAIARBCBAJIgA2AgQgAEUEQCAEEAYgAwRAIANBADYCBCADQQ42AgALQQAPCyAAQgA3AwAgBA8LAkAgAaciBUEEdBAJIgZFDQAgBCAGNgIAIAVBA3RBCGoQCSIFRQ0AIAQgATcDECAEIAU2AgQDQCAAIAynIghBBHRqIgcpAwgiDVBFBEAgBygCACIHRQRAIAMEQCADQQA2AgQgA0ESNgIACyAGEAYgBRAGIAQQBkEADwsgBiAKp0EEdGoiCSANNwMIIAkgBzYCACAFIAhBA3RqIAs3AwAgCyANfCELIApCAXwhCgsgDEIBfCIMIAFSDQALIAQgCjcDCCAEQgAgCiACGzcDGCAFIAqnQQN0aiALNwMAIAQgCzcDMCAEDwsgAwRAIANBADYCBCADQQ42AgALIAYQBiAEEAZBAAvlAQIDfwF+QX8hBQJAIAAgASACQQAQJiIERQ0AIAAgASACEIsBIgZFDQACfgJAIAJBCHENACAAKAJAIAGnQQR0aigCCCICRQ0AIAIgAxAhQQBOBEAgAykDAAwCCyAAQQhqIgAEQCAAQQA2AgQgAEEPNgIAC0F/DwsgAxAqIAMgBCgCGDYCLCADIAQpAyg3AxggAyAEKAIUNgIoIAMgBCkDIDcDICADIAQoAhA7ATAgAyAELwFSOwEyQvwBQtwBIAQtAAYbCyEHIAMgBjYCCCADIAE3AxAgAyAHQgOENwMAQQAhBQsgBQspAQF/IAAgASACIABBCGoiABAmIgNFBEBBAA8LIAMoAjBBACACIAAQJQuAAwEGfwJ/An9BMCABQYB/Sw0BGgJ/IAFBgH9PBEBBhIQBQTA2AgBBAAwBC0EAQRAgAUELakF4cSABQQtJGyIFQcwAahAJIgFFDQAaIAFBCGshAgJAIAFBP3FFBEAgAiEBDAELIAFBBGsiBigCACIHQXhxIAFBP2pBQHFBCGsiASABQUBrIAEgAmtBD0sbIgEgAmsiA2shBCAHQQNxRQRAIAIoAgAhAiABIAQ2AgQgASACIANqNgIADAELIAEgBCABKAIEQQFxckECcjYCBCABIARqIgQgBCgCBEEBcjYCBCAGIAMgBigCAEEBcXJBAnI2AgAgAiADaiIEIAQoAgRBAXI2AgQgAiADEDsLAkAgASgCBCICQQNxRQ0AIAJBeHEiAyAFQRBqTQ0AIAEgBSACQQFxckECcjYCBCABIAVqIgIgAyAFayIFQQNyNgIEIAEgA2oiAyADKAIEQQFyNgIEIAIgBRA7CyABQQhqCyIBRQsEQEEwDwsgACABNgIAQQALCwoAIABBiIQBEAQL6AIBBX8gACgCUCEBIAAvATAhBEEEIQUDQCABQQAgAS8BACICIARrIgMgAiADSRs7AQAgAUEAIAEvAQIiAiAEayIDIAIgA0kbOwECIAFBACABLwEEIgIgBGsiAyACIANJGzsBBCABQQAgAS8BBiICIARrIgMgAiADSRs7AQYgBUGAgARGRQRAIAFBCGohASAFQQRqIQUMAQsLAkAgBEUNACAEQQNxIQUgACgCTCEBIARBAWtBA08EQCAEIAVrIQADQCABQQAgAS8BACICIARrIgMgAiADSRs7AQAgAUEAIAEvAQIiAiAEayIDIAIgA0kbOwECIAFBACABLwEEIgIgBGsiAyACIANJGzsBBCABQQAgAS8BBiICIARrIgMgAiADSRs7AQYgAUEIaiEBIABBBGsiAA0ACwsgBUUNAANAIAFBACABLwEAIgAgBGsiAiAAIAJJGzsBACABQQJqIQEgBUEBayIFDQALCwuDAQEEfyACQQFOBEAgAiAAKAJIIAFqIgJqIQMgACgCUCEEA0AgBCACKAAAQbHz3fF5bEEPdkH+/wdxaiIFLwEAIgYgAUH//wNxRwRAIAAoAkwgASAAKAI4cUH//wNxQQF0aiAGOwEAIAUgATsBAAsgAUEBaiEBIAJBAWoiAiADSQ0ACwsLUAECfyABIAAoAlAgACgCSCABaigAAEGx893xeWxBD3ZB/v8HcWoiAy8BACICRwRAIAAoAkwgACgCOCABcUEBdGogAjsBACADIAE7AQALIAILugEBAX8jAEEQayICJAAgAkEAOgAIQYCBAUECNgIAQfyAAUEDNgIAQfiAAUEENgIAQfSAAUEFNgIAQfCAAUEGNgIAQeyAAUEHNgIAQeiAAUEINgIAQeSAAUEJNgIAQeCAAUEKNgIAQdyAAUELNgIAQdiAAUEMNgIAQdSAAUENNgIAQdCAAUEONgIAQcyAAUEPNgIAQciAAUEQNgIAQcSAAUERNgIAQcCAAUESNgIAIAAgARBYIAJBEGokAAu9AQEBfyMAQRBrIgEkACABQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgAEEANgJAIAFBEGokAEEAC70BAQF/IwBBEGsiASQAIAFBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAKAJAIQAgAUEQaiQAIAALvgEBAX8jAEEQayIEJAAgBEEAOgAIQYCBAUECNgIAQfyAAUEDNgIAQfiAAUEENgIAQfSAAUEFNgIAQfCAAUEGNgIAQeyAAUEHNgIAQeiAAUEINgIAQeSAAUEJNgIAQeCAAUEKNgIAQdyAAUELNgIAQdiAAUEMNgIAQdSAAUENNgIAQdCAAUEONgIAQcyAAUEPNgIAQciAAUEQNgIAQcSAAUERNgIAQcCAAUESNgIAIAAgASACIAMQVyAEQRBqJAALygEAIwBBEGsiAyQAIANBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAIAAoAkAgASACQdSAASgCABEAADYCQCADQRBqJAALwAEBAX8jAEEQayIDJAAgA0EAOgAIQYCBAUECNgIAQfyAAUEDNgIAQfiAAUEENgIAQfSAAUEFNgIAQfCAAUEGNgIAQeyAAUEHNgIAQeiAAUEINgIAQeSAAUEJNgIAQeCAAUEKNgIAQdyAAUELNgIAQdiAAUEMNgIAQdSAAUENNgIAQdCAAUEONgIAQcyAAUEPNgIAQciAAUEQNgIAQcSAAUERNgIAQcCAAUESNgIAIAAgASACEF0hACADQRBqJAAgAAu+AQEBfyMAQRBrIgIkACACQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgACABEFwhACACQRBqJAAgAAu2AQEBfyMAQRBrIgAkACAAQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgAEEQaiQAQQgLwgEBAX8jAEEQayIEJAAgBEEAOgAIQYCBAUECNgIAQfyAAUEDNgIAQfiAAUEENgIAQfSAAUEFNgIAQfCAAUEGNgIAQeyAAUEHNgIAQeiAAUEINgIAQeSAAUEJNgIAQeCAAUEKNgIAQdyAAUELNgIAQdiAAUEMNgIAQdSAAUENNgIAQdCAAUEONgIAQcyAAUEPNgIAQciAAUEQNgIAQcSAAUERNgIAQcCAAUESNgIAIAAgASACIAMQWSEAIARBEGokACAAC8IBAQF/IwBBEGsiBCQAIARBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAIAEgAiADEFYhACAEQRBqJAAgAAsHACAALwEwC8ABAQF/IwBBEGsiAyQAIANBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAIAEgAhBVIQAgA0EQaiQAIAALBwAgACgCQAsaACAAIAAoAkAgASACQdSAASgCABEAADYCQAsLACAAQQA2AkBBAAsHACAAKAIgCwQAQQgLzgUCA34BfyMAQYBAaiIIJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEDhECAwwFAAEECAkJCQkJCQcJBgkLIANCCFoEfiACIAEoAmQ2AgAgAiABKAJoNgIEQggFQn8LIQYMCwsgARAGDAoLIAEoAhAiAgRAIAIgASkDGCABQeQAaiICEEEiA1ANCCABKQMIIgVCf4UgA1QEQCACBEAgAkEANgIEIAJBFTYCAAsMCQsgAUEANgIQIAEgAyAFfDcDCCABIAEpAwAgA3w3AwALIAEtAHgEQCABKQMAIQUMCQtCACEDIAEpAwAiBVAEQCABQgA3AyAMCgsDQCAAIAggBSADfSIFQoDAACAFQoDAAFQbEBEiB0J/VwRAIAFB5ABqIgEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwJCyAHUEUEQCABKQMAIgUgAyAHfCIDWA0KDAELCyABQeQAagRAIAFBADYCaCABQRE2AmQLDAcLIAEpAwggASkDICIFfSIHIAMgAyAHVhsiA1ANCAJAIAEtAHhFDQAgACAFQQAQFEF/Sg0AIAFB5ABqIgEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwHCyAAIAIgAxARIgZCf1cEQCABQeQAagRAIAFBADYCaCABQRE2AmQLDAcLIAEgASkDICAGfCIDNwMgIAZCAFINCEIAIQYgAyABKQMIWg0IIAFB5ABqBEAgAUEANgJoIAFBETYCZAsMBgsgASkDICABKQMAIgV9IAEpAwggBX0gAiADIAFB5ABqEEQiA0IAUw0FIAEgASkDACADfDcDIAwHCyACIAFBKGoQYEEfdawhBgwGCyABMABgIQYMBQsgASkDcCEGDAQLIAEpAyAgASkDAH0hBgwDCyABQeQAagRAIAFBADYCaCABQRw2AmQLC0J/IQYMAQsgASAFNwMgCyAIQYBAayQAIAYLBwAgACgCAAsPACAAIAAoAjBBAWo2AjALGABB+IMBQgA3AgBBgIQBQQA2AgBB+IMBCwcAIABBDGoLBwAgACgCLAsHACAAKAIoCwcAIAAoAhgLFQAgACABrSACrUIghoQgAyAEEIoBCxMBAX4gABAzIgFCIIinEAAgAacLbwEBfiABrSACrUIghoQhBSMAQRBrIgEkAAJ/IABFBEAgBVBFBEAgBARAIARBADYCBCAEQRI2AgALQQAMAgtBAEIAIAMgBBA6DAELIAEgBTcDCCABIAA2AgAgAUIBIAMgBBA6CyEAIAFBEGokACAACxQAIAAgASACrSADrUIghoQgBBBSC9oCAgJ/AX4CfyABrSACrUIghoQiByAAKQMwVEEAIARBCkkbRQRAIABBCGoEQCAAQQA2AgwgAEESNgIIC0F/DAELIAAtABhBAnEEQCAAQQhqBEAgAEEANgIMIABBGTYCCAtBfwwBCyADBH8gA0H//wNxQQhGIANBfUtyBUEBC0UEQCAAQQhqBEAgAEEANgIMIABBEDYCCAtBfwwBCyAAKAJAIgEgB6ciBUEEdGooAgAiAgR/IAIoAhAgA0YFIANBf0YLIQYgASAFQQR0aiIBIQUgASgCBCEBAkAgBgRAIAFFDQEgAUEAOwFQIAEgASgCAEF+cSIANgIAIAANASABECAgBUEANgIEQQAMAgsCQCABDQAgBSACECsiATYCBCABDQAgAEEIagRAIABBADYCDCAAQQ42AggLQX8MAgsgASAEOwFQIAEgAzYCECABIAEoAgBBAXI2AgALQQALCxwBAX4gACABIAIgAEEIahBMIgNCIIinEAAgA6cLHwEBfiAAIAEgAq0gA61CIIaEEBEiBEIgiKcQACAEpwteAQF+An5CfyAARQ0AGiAAKQMwIgIgAUEIcUUNABpCACACUA0AGiAAKAJAIQADQCACIAKnQQR0IABqQRBrKAIADQEaIAJCAX0iAkIAUg0AC0IACyICQiCIpxAAIAKnCxMAIAAgAa0gAq1CIIaEIAMQiwELnwEBAn4CfiACrSADrUIghoQhBUJ/IQQCQCAARQ0AIAAoAgQNACAAQQRqIQIgBUJ/VwRAIAIEQCACQQA2AgQgAkESNgIAC0J/DAILQgAhBCAALQAQDQAgBVANACAAKAIUIAEgBRARIgRCf1UNACAAKAIUIQAgAgRAIAIgACgCDDYCACACIAAoAhA2AgQLQn8hBAsgBAsiBEIgiKcQACAEpwueAQEBfwJ/IAAgACABrSACrUIghoQgAyAAKAIcEH8iAQRAIAEQMkF/TARAIABBCGoEQCAAIAEoAgw2AgggACABKAIQNgIMCyABEAtBAAwCC0EYEAkiBEUEQCAAQQhqBEAgAEEANgIMIABBDjYCCAsgARALQQAMAgsgBCAANgIAIARBADYCDCAEQgA3AgQgBCABNgIUIARBADoAEAsgBAsLsQICAX8BfgJ/QX8hBAJAIAAgAa0gAq1CIIaEIgZBAEEAECZFDQAgAC0AGEECcQRAIABBCGoEQCAAQQA2AgwgAEEZNgIIC0F/DAILIAAoAkAiASAGpyICQQR0aiIEKAIIIgUEQEEAIQQgBSADEHFBf0oNASAAQQhqBEAgAEEANgIMIABBDzYCCAtBfwwCCwJAIAQoAgAiBQRAIAUoAhQgA0YNAQsCQCABIAJBBHRqIgEoAgQiBA0AIAEgBRArIgQ2AgQgBA0AIABBCGoEQCAAQQA2AgwgAEEONgIIC0F/DAMLIAQgAzYCFCAEIAQoAgBBIHI2AgBBAAwCC0EAIQQgASACQQR0aiIBKAIEIgBFDQAgACAAKAIAQV9xIgI2AgAgAg0AIAAQICABQQA2AgQLIAQLCxQAIAAgAa0gAq1CIIaEIAQgBRBzCxIAIAAgAa0gAq1CIIaEIAMQFAtBAQF+An4gAUEAIAIbRQRAIABBCGoEQCAAQQA2AgwgAEESNgIIC0J/DAELIAAgASACIAMQdAsiBEIgiKcQACAEpwvGAwIFfwF+An4CQAJAIAAiBC0AGEECcQRAIARBCGoEQCAEQQA2AgwgBEEZNgIICwwBCyABRQRAIARBCGoEQCAEQQA2AgwgBEESNgIICwwBCyABECIiByABakEBay0AAEEvRwRAIAdBAmoQCSIARQRAIARBCGoEQCAEQQA2AgwgBEEONgIICwwCCwJAAkAgACIGIAEiBXNBA3ENACAFQQNxBEADQCAGIAUtAAAiAzoAACADRQ0DIAZBAWohBiAFQQFqIgVBA3ENAAsLIAUoAgAiA0F/cyADQYGChAhrcUGAgYKEeHENAANAIAYgAzYCACAFKAIEIQMgBkEEaiEGIAVBBGohBSADQYGChAhrIANBf3NxQYCBgoR4cUUNAAsLIAYgBS0AACIDOgAAIANFDQADQCAGIAUtAAEiAzoAASAGQQFqIQYgBUEBaiEFIAMNAAsLIAcgACIDakEvOwAACyAEQQBCAEEAEFIiAEUEQCADEAYMAQsgBCADIAEgAxsgACACEHQhCCADEAYgCEJ/VwRAIAAQCyAIDAMLIAQgCEEDQYCA/I8EEHNBf0oNASAEIAgQchoLQn8hCAsgCAsiCEIgiKcQACAIpwsQACAAIAGtIAKtQiCGhBByCxYAIAAgAa0gAq1CIIaEIAMgBCAFEGYL3iMDD38IfgF8IwBB8ABrIgkkAAJAIAFBAE5BACAAG0UEQCACBEAgAkEANgIEIAJBEjYCAAsMAQsgACkDGCISAn5BsIMBKQMAIhNCf1EEQCAJQoOAgIBwNwMwIAlChoCAgPAANwMoIAlCgYCAgCA3AyBBsIMBQQAgCUEgahAkNwMAIAlCj4CAgHA3AxAgCUKJgICAoAE3AwAgCUKMgICA0AE3AwhBuIMBQQggCRAkNwMAQbCDASkDACETCyATC4MgE1IEQCACBEAgAkEANgIEIAJBHDYCAAsMAQsgASABQRByQbiDASkDACITIBKDIBNRGyIKQRhxQRhGBEAgAgRAIAJBADYCBCACQRk2AgALDAELIAlBOGoQKgJAIAAgCUE4ahAhBEACQCAAKAIMQQVGBEAgACgCEEEsRg0BCyACBEAgAiAAKAIMNgIAIAIgACgCEDYCBAsMAgsgCkEBcUUEQCACBEAgAkEANgIEIAJBCTYCAAsMAwsgAhBJIgVFDQEgBSAKNgIEIAUgADYCACAKQRBxRQ0CIAUgBSgCFEECcjYCFCAFIAUoAhhBAnI2AhgMAgsgCkECcQRAIAIEQCACQQA2AgQgAkEKNgIACwwCCyAAEDJBf0wEQCACBEAgAiAAKAIMNgIAIAIgACgCEDYCBAsMAQsCfyAKQQhxBEACQCACEEkiAUUNACABIAo2AgQgASAANgIAIApBEHFFDQAgASABKAIUQQJyNgIUIAEgASgCGEECcjYCGAsgAQwBCyMAQUBqIg4kACAOQQhqECoCQCAAIA5BCGoQIUF/TARAIAIEQCACIAAoAgw2AgAgAiAAKAIQNgIECwwBCyAOLQAIQQRxRQRAIAIEQCACQYoBNgIEIAJBBDYCAAsMAQsgDikDICETIAIQSSIFRQRAQQAhBQwBCyAFIAo2AgQgBSAANgIAIApBEHEEQCAFIAUoAhRBAnI2AhQgBSAFKAIYQQJyNgIYCwJAAkACQCATUARAAn8gACEBAkADQCABKQMYQoCAEINCAFINASABKAIAIgENAAtBAQwBCyABQQBCAEESEA6nCw0EIAVBCGoEQCAFQQA2AgwgBUETNgIICwwBCyMAQdAAayIBJAACQCATQhVYBEAgBUEIagRAIAVBADYCDCAFQRM2AggLDAELAkACQCAFKAIAQgAgE0KqgAQgE0KqgARUGyISfUECEBRBf0oNACAFKAIAIgMoAgxBBEYEQCADKAIQQRZGDQELIAVBCGoEQCAFIAMoAgw2AgggBSADKAIQNgIMCwwBCyAFKAIAEDMiE0J/VwRAIAUoAgAhAyAFQQhqIggEQCAIIAMoAgw2AgAgCCADKAIQNgIECwwBCyAFKAIAIBJBACAFQQhqIg8QLSIERQ0BIBJCqoAEWgRAAkAgBCkDCEIUVARAIARBADoAAAwBCyAEQhQ3AxAgBEEBOgAACwsgAQRAIAFBADYCBCABQRM2AgALIARCABATIQwCQCAELQAABH4gBCkDCCAEKQMQfQVCAAunIgdBEmtBA0sEQEJ/IRcDQCAMQQFrIQMgByAMakEVayEGAkADQCADQQFqIgNB0AAgBiADaxB6IgNFDQEgA0EBaiIMQZ8SQQMQPQ0ACwJAIAMgBCgCBGusIhIgBCkDCFYEQCAEQQA6AAAMAQsgBCASNwMQIARBAToAAAsgBC0AAAR+IAQpAxAFQgALIRICQCAELQAABH4gBCkDCCAEKQMQfQVCAAtCFVgEQCABBEAgAUEANgIEIAFBEzYCAAsMAQsgBEIEEBMoAABB0JaVMEcEQCABBEAgAUEANgIEIAFBEzYCAAsMAQsCQAJAAkAgEkIUVA0AIAQoAgQgEqdqQRRrKAAAQdCWmThHDQACQCASQhR9IhQgBCIDKQMIVgRAIANBADoAAAwBCyADIBQ3AxAgA0EBOgAACyAFKAIUIRAgBSgCACEGIAMtAAAEfiAEKQMQBUIACyEWIARCBBATGiAEEAwhCyAEEAwhDSAEEB0iFEJ/VwRAIAEEQCABQRY2AgQgAUEENgIACwwECyAUQjh8IhUgEyAWfCIWVgRAIAEEQCABQQA2AgQgAUEVNgIACwwECwJAAkAgEyAUVg0AIBUgEyAEKQMIfFYNAAJAIBQgE30iFSAEKQMIVgRAIANBADoAAAwBCyADIBU3AxAgA0EBOgAAC0EAIQcMAQsgBiAUQQAQFEF/TARAIAEEQCABIAYoAgw2AgAgASAGKAIQNgIECwwFC0EBIQcgBkI4IAFBEGogARAtIgNFDQQLIANCBBATKAAAQdCWmTBHBEAgAQRAIAFBADYCBCABQRU2AgALIAdFDQQgAxAIDAQLIAMQHSEVAkAgEEEEcSIGRQ0AIBQgFXxCDHwgFlENACABBEAgAUEANgIEIAFBFTYCAAsgB0UNBCADEAgMBAsgA0IEEBMaIAMQFSIQIAsgC0H//wNGGyELIAMQFSIRIA0gDUH//wNGGyENAkAgBkUNACANIBFGQQAgCyAQRhsNACABBEAgAUEANgIEIAFBFTYCAAsgB0UNBCADEAgMBAsgCyANcgRAIAEEQCABQQA2AgQgAUEBNgIACyAHRQ0EIAMQCAwECyADEB0iGCADEB1SBEAgAQRAIAFBADYCBCABQQE2AgALIAdFDQQgAxAIDAQLIAMQHSEVIAMQHSEWIAMtAABFBEAgAQRAIAFBADYCBCABQRQ2AgALIAdFDQQgAxAIDAQLIAcEQCADEAgLAkAgFkIAWQRAIBUgFnwiGSAWWg0BCyABBEAgAUEWNgIEIAFBBDYCAAsMBAsgEyAUfCIUIBlUBEAgAQRAIAFBADYCBCABQRU2AgALDAQLAkAgBkUNACAUIBlRDQAgAQRAIAFBADYCBCABQRU2AgALDAQLIBggFUIugFgNASABBEAgAUEANgIEIAFBFTYCAAsMAwsCQCASIAQpAwhWBEAgBEEAOgAADAELIAQgEjcDECAEQQE6AAALIAUoAhQhAyAELQAABH4gBCkDCCAEKQMQfQVCAAtCFVgEQCABBEAgAUEANgIEIAFBFTYCAAsMAwsgBC0AAAR+IAQpAxAFQgALIRQgBEIEEBMaIAQQFQRAIAEEQCABQQA2AgQgAUEBNgIACwwDCyAEEAwgBBAMIgZHBEAgAQRAIAFBADYCBCABQRM2AgALDAMLIAQQFSEHIAQQFa0iFiAHrSIVfCIYIBMgFHwiFFYEQCABBEAgAUEANgIEIAFBFTYCAAsMAwsCQCADQQRxRQ0AIBQgGFENACABBEAgAUEANgIEIAFBFTYCAAsMAwsgBq0gARBqIgNFDQIgAyAWNwMgIAMgFTcDGCADQQA6ACwMAQsgGCABEGoiA0UNASADIBY3AyAgAyAVNwMYIANBAToALAsCQCASQhR8IhQgBCkDCFYEQCAEQQA6AAAMAQsgBCAUNwMQIARBAToAAAsgBBAMIQYCQCADKQMYIAMpAyB8IBIgE3xWDQACQCAGRQRAIAUtAARBBHFFDQELAkAgEkIWfCISIAQpAwhWBEAgBEEAOgAADAELIAQgEjcDECAEQQE6AAALIAQtAAAEfiAEKQMIIAQpAxB9BUIACyIUIAatIhJUDQEgBS0ABEEEcUEAIBIgFFIbDQEgBkUNACADIAQgEhATIAZBACABEDUiBjYCKCAGDQAgAxAWDAILAkAgEyADKQMgIhJYBEACQCASIBN9IhIgBCkDCFYEQCAEQQA6AAAMAQsgBCASNwMQIARBAToAAAsgBCADKQMYEBMiBkUNAiAGIAMpAxgQFyIHDQEgAQRAIAFBADYCBCABQQ42AgALIAMQFgwDCyAFKAIAIBJBABAUIQcgBSgCACEGIAdBf0wEQCABBEAgASAGKAIMNgIAIAEgBigCEDYCBAsgAxAWDAMLQQAhByAGEDMgAykDIFENACABBEAgAUEANgIEIAFBEzYCAAsgAxAWDAILQgAhFAJAAkAgAykDGCIWUEUEQANAIBQgAykDCFIiC0UEQCADLQAsDQMgFkIuVA0DAn8CQCADKQMQIhVCgIAEfCISIBVaQQAgEkKAgICAAVQbRQ0AIAMoAgAgEqdBBHQQNCIGRQ0AIAMgBjYCAAJAIAMpAwgiFSASWg0AIAYgFadBBHRqIgZCADcCACAGQgA3AAUgFUIBfCIVIBJRDQADQCADKAIAIBWnQQR0aiIGQgA3AgAgBkIANwAFIBVCAXwiFSASUg0ACwsgAyASNwMIIAMgEjcDEEEBDAELIAEEQCABQQA2AgQgAUEONgIAC0EAC0UNBAtB2AAQCSIGBH8gBkIANwMgIAZBADYCGCAGQv////8PNwMQIAZBADsBDCAGQb+GKDYCCCAGQQE6AAYgBkEAOwEEIAZBADYCACAGQgA3A0ggBkGAgNiNeDYCRCAGQgA3AyggBkIANwMwIAZCADcDOCAGQUBrQQA7AQAgBkIANwNQIAYFQQALIQYgAygCACAUp0EEdGogBjYCAAJAIAYEQCAGIAUoAgAgB0EAIAEQaCISQn9VDQELIAsNBCABKAIAQRNHDQQgAQRAIAFBADYCBCABQRU2AgALDAQLIBRCAXwhFCAWIBJ9IhZCAFINAAsLIBQgAykDCFINAAJAIAUtAARBBHFFDQAgBwRAIActAAAEfyAHKQMQIAcpAwhRBUEAC0UNAgwBCyAFKAIAEDMiEkJ/VwRAIAUoAgAhBiABBEAgASAGKAIMNgIAIAEgBigCEDYCBAsgAxAWDAULIBIgAykDGCADKQMgfFINAQsgBxAIAn4gCARAAn8gF0IAVwRAIAUgCCABEEghFwsgBSADIAEQSCISIBdVCwRAIAgQFiASDAILIAMQFgwFC0IAIAUtAARBBHFFDQAaIAUgAyABEEgLIRcgAyEIDAMLIAEEQCABQQA2AgQgAUEVNgIACyAHEAggAxAWDAILIAMQFiAHEAgMAQsgAQRAIAFBADYCBCABQRU2AgALIAMQFgsCQCAMIAQoAgRrrCISIAQpAwhWBEAgBEEAOgAADAELIAQgEjcDECAEQQE6AAALIAQtAAAEfiAEKQMIIAQpAxB9BUIAC6ciB0ESa0EDSw0BCwsgBBAIIBdCf1UNAwwBCyAEEAgLIA8iAwRAIAMgASgCADYCACADIAEoAgQ2AgQLIAgQFgtBACEICyABQdAAaiQAIAgNAQsgAgRAIAIgBSgCCDYCACACIAUoAgw2AgQLDAELIAUgCCgCADYCQCAFIAgpAwg3AzAgBSAIKQMQNwM4IAUgCCgCKDYCICAIEAYgBSgCUCEIIAVBCGoiBCEBQQAhBwJAIAUpAzAiE1ANAEGAgICAeCEGAn8gE7pEAAAAAAAA6D+jRAAA4P///+9BpCIaRAAAAAAAAPBBYyAaRAAAAAAAAAAAZnEEQCAaqwwBC0EACyIDQYCAgIB4TQRAIANBAWsiA0EBdiADciIDQQJ2IANyIgNBBHYgA3IiA0EIdiADciIDQRB2IANyQQFqIQYLIAYgCCgCACIMTQ0AIAYQPCILRQRAIAEEQCABQQA2AgQgAUEONgIACwwBCwJAIAgpAwhCACAMG1AEQCAIKAIQIQ8MAQsgCCgCECEPA0AgDyAHQQJ0aigCACIBBEADQCABKAIYIQMgASALIAEoAhwgBnBBAnRqIg0oAgA2AhggDSABNgIAIAMiAQ0ACwsgB0EBaiIHIAxHDQALCyAPEAYgCCAGNgIAIAggCzYCEAsCQCAFKQMwUA0AQgAhEwJAIApBBHFFBEADQCAFKAJAIBOnQQR0aigCACgCMEEAQQAgAhAlIgFFDQQgBSgCUCABIBNBCCAEEE1FBEAgBCgCAEEKRw0DCyATQgF8IhMgBSkDMFQNAAwDCwALA0AgBSgCQCATp0EEdGooAgAoAjBBAEEAIAIQJSIBRQ0DIAUoAlAgASATQQggBBBNRQ0BIBNCAXwiEyAFKQMwVA0ACwwBCyACBEAgAiAEKAIANgIAIAIgBCgCBDYCBAsMAQsgBSAFKAIUNgIYDAELIAAgACgCMEEBajYCMCAFEEtBACEFCyAOQUBrJAAgBQsiBQ0BIAAQGhoLQQAhBQsgCUHwAGokACAFCxAAIwAgAGtBcHEiACQAIAALBgAgACQACwQAIwAL4CoDEX8IfgN8IwBBwMAAayIHJABBfyECAkAgAEUNAAJ/IAAtAChFBEBBACAAKAIYIAAoAhRGDQEaC0EBCyEBAkACQCAAKQMwIhRQRQRAIAAoAkAhCgNAIAogEqdBBHRqIgMtAAwhCwJAAkAgAygCCA0AIAsNACADKAIEIgNFDQEgAygCAEUNAQtBASEBCyAXIAtBAXOtQv8Bg3whFyASQgF8IhIgFFINAAsgF0IAUg0BCyAAKAIEQQhxIAFyRQ0BAn8gACgCACIDKAIkIgFBA0cEQCADKAIgBH9BfyADEBpBAEgNAhogAygCJAUgAQsEQCADEEMLQX8gA0EAQgBBDxAOQgBTDQEaIANBAzYCJAtBAAtBf0oNASAAKAIAKAIMQRZGBEAgACgCACgCEEEsRg0CCyAAKAIAIQEgAEEIagRAIAAgASgCDDYCCCAAIAEoAhA2AgwLDAILIAFFDQAgFCAXVARAIABBCGoEQCAAQQA2AgwgAEEUNgIICwwCCyAXp0EDdBAJIgtFDQFCfyEWQgAhEgNAAkAgCiASp0EEdGoiBigCACIDRQ0AAkAgBigCCA0AIAYtAAwNACAGKAIEIgFFDQEgASgCAEUNAQsgFiADKQNIIhMgEyAWVhshFgsgBi0ADEUEQCAXIBlYBEAgCxAGIABBCGoEQCAAQQA2AgwgAEEUNgIICwwECyALIBmnQQN0aiASNwMAIBlCAXwhGQsgEkIBfCISIBRSDQALIBcgGVYEQCALEAYgAEEIagRAIABBADYCDCAAQRQ2AggLDAILAkACQCAAKAIAKQMYQoCACINQDQACQAJAIBZCf1INACAAKQMwIhNQDQIgE0IBgyEVIAAoAkAhAwJAIBNCAVEEQEJ/IRRCACESQgAhFgwBCyATQn6DIRlCfyEUQgAhEkIAIRYDQCADIBKnQQR0aigCACIBBEAgFiABKQNIIhMgEyAWVCIBGyEWIBQgEiABGyEUCyADIBJCAYQiGKdBBHRqKAIAIgEEQCAWIAEpA0giEyATIBZUIgEbIRYgFCAYIAEbIRQLIBJCAnwhEiAZQgJ9IhlQRQ0ACwsCQCAVUA0AIAMgEqdBBHRqKAIAIgFFDQAgFiABKQNIIhMgEyAWVCIBGyEWIBQgEiABGyEUCyAUQn9RDQBCACETIwBBEGsiBiQAAkAgACAUIABBCGoiCBBBIhVQDQAgFSAAKAJAIBSnQQR0aigCACIKKQMgIhh8IhQgGFpBACAUQn9VG0UEQCAIBEAgCEEWNgIEIAhBBDYCAAsMAQsgCi0ADEEIcUUEQCAUIRMMAQsgACgCACAUQQAQFCEBIAAoAgAhAyABQX9MBEAgCARAIAggAygCDDYCACAIIAMoAhA2AgQLDAELIAMgBkEMakIEEBFCBFIEQCAAKAIAIQEgCARAIAggASgCDDYCACAIIAEoAhA2AgQLDAELIBRCBHwgFCAGKAAMQdCWncAARhtCFEIMAn9BASEBAkAgCikDKEL+////D1YNACAKKQMgQv7///8PVg0AQQAhAQsgAQsbfCIUQn9XBEAgCARAIAhBFjYCBCAIQQQ2AgALDAELIBQhEwsgBkEQaiQAIBMiFkIAUg0BIAsQBgwFCyAWUA0BCwJ/IAAoAgAiASgCJEEBRgRAIAFBDGoEQCABQQA2AhAgAUESNgIMC0F/DAELQX8gAUEAIBZBERAOQgBTDQAaIAFBATYCJEEAC0F/Sg0BC0IAIRYCfyAAKAIAIgEoAiRBAUYEQCABQQxqBEAgAUEANgIQIAFBEjYCDAtBfwwBC0F/IAFBAEIAQQgQDkIAUw0AGiABQQE2AiRBAAtBf0oNACAAKAIAIQEgAEEIagRAIAAgASgCDDYCCCAAIAEoAhA2AgwLIAsQBgwCCyAAKAJUIgIEQCACQgA3AxggAigCAEQAAAAAAAAAACACKAIMIAIoAgQRDgALIABBCGohBCAXuiEcQgAhFAJAAkACQANAIBcgFCITUgRAIBO6IByjIRsgE0IBfCIUuiAcoyEaAkAgACgCVCICRQ0AIAIgGjkDKCACIBs5AyAgAisDECAaIBuhRAAAAAAAAAAAoiAboCIaIAIrAxihY0UNACACKAIAIBogAigCDCACKAIEEQ4AIAIgGjkDGAsCfwJAIAAoAkAgCyATp0EDdGopAwAiE6dBBHRqIg0oAgAiAQRAIAEpA0ggFlQNAQsgDSgCBCEFAkACfwJAIA0oAggiAkUEQCAFRQ0BQQEgBSgCACICQQFxDQIaIAJBwABxQQZ2DAILQQEgBQ0BGgsgDSABECsiBTYCBCAFRQ0BIAJBAEcLIQZBACEJIwBBEGsiDCQAAkAgEyAAKQMwWgRAIABBCGoEQCAAQQA2AgwgAEESNgIIC0F/IQkMAQsgACgCQCIKIBOnIgNBBHRqIg8oAgAiAkUNACACLQAEDQACQCACKQNIQhp8IhhCf1cEQCAAQQhqBEAgAEEWNgIMIABBBDYCCAsMAQtBfyEJIAAoAgAgGEEAEBRBf0wEQCAAKAIAIQIgAEEIagRAIAAgAigCDDYCCCAAIAIoAhA2AgwLDAILIAAoAgBCBCAMQQxqIABBCGoiDhAtIhBFDQEgEBAMIQEgEBAMIQggEC0AAAR/IBApAxAgECkDCFEFQQALIQIgEBAIIAJFBEAgDgRAIA5BADYCBCAOQRQ2AgALDAILAkAgCEUNACAAKAIAIAGtQQEQFEF/TARAQYSEASgCACECIA4EQCAOIAI2AgQgDkEENgIACwwDC0EAIAAoAgAgCEEAIA4QRSIBRQ0BIAEgCEGAAiAMQQhqIA4QbiECIAEQBiACRQ0BIAwoAggiAkUNACAMIAIQbSICNgIIIA8oAgAoAjQgAhBvIQIgDygCACACNgI0CyAPKAIAIgJBAToABEEAIQkgCiADQQR0aigCBCIBRQ0BIAEtAAQNASACKAI0IQIgAUEBOgAEIAEgAjYCNAwBC0F/IQkLIAxBEGokACAJQQBIDQUgACgCABAfIhhCAFMNBSAFIBg3A0ggBgRAQQAhDCANKAIIIg0hASANRQRAIAAgACATQQhBABB/IgwhASAMRQ0HCwJAAkAgASAHQQhqECFBf0wEQCAEBEAgBCABKAIMNgIAIAQgASgCEDYCBAsMAQsgBykDCCISQsAAg1AEQCAHQQA7ATggByASQsAAhCISNwMICwJAAkAgBSgCECICQX5PBEAgBy8BOCIDRQ0BIAUgAzYCECADIQIMAgsgAg0AIBJCBINQDQAgByAHKQMgNwMoIAcgEkIIhCISNwMIQQAhAgwBCyAHIBJC9////w+DIhI3AwgLIBJCgAGDUARAIAdBADsBOiAHIBJCgAGEIhI3AwgLAn8gEkIEg1AEQEJ/IRVBgAoMAQsgBSAHKQMgIhU3AyggEkIIg1AEQAJAAkACQAJAQQggAiACQX1LG0H//wNxDg0CAwMDAwMDAwEDAwMAAwtBgApBgAIgFUKUwuTzD1YbDAQLQYAKQYACIBVCg4Ow/w9WGwwDC0GACkGAAiAVQv////8PVhsMAgtBgApBgAIgFUIAUhsMAQsgBSAHKQMoNwMgQYACCyEPIAAoAgAQHyITQn9XBEAgACgCACECIAQEQCAEIAIoAgw2AgAgBCACKAIQNgIECwwBCyAFIAUvAQxB9/8DcTsBDCAAIAUgDxA3IgpBAEgNACAHLwE4IghBCCAFKAIQIgMgA0F9SxtB//8DcSICRyEGAkACQAJAAkACQAJAAkAgAiAIRwRAIANBAEchAwwBC0EAIQMgBS0AAEGAAXFFDQELIAUvAVIhCSAHLwE6IQIMAQsgBS8BUiIJIAcvAToiAkYNAQsgASABKAIwQQFqNgIwIAJB//8DcQ0BIAEhAgwCCyABIAEoAjBBAWo2AjBBACEJDAILQSZBACAHLwE6QQFGGyICRQRAIAQEQCAEQQA2AgQgBEEYNgIACyABEAsMAwsgACABIAcvATpBACAAKAIcIAIRBgAhAiABEAsgAkUNAgsgCUEARyEJIAhBAEcgBnFFBEAgAiEBDAELIAAgAiAHLwE4EIEBIQEgAhALIAFFDQELAkAgCEUgBnJFBEAgASECDAELIAAgAUEAEIABIQIgARALIAJFDQELAkAgA0UEQCACIQMMAQsgACACIAUoAhBBASAFLwFQEIIBIQMgAhALIANFDQELAkAgCUUEQCADIQEMAQsgBSgCVCIBRQRAIAAoAhwhAQsCfyAFLwFSGkEBCwRAIAQEQCAEQQA2AgQgBEEYNgIACyADEAsMAgsgACADIAUvAVJBASABQQARBgAhASADEAsgAUUNAQsgACgCABAfIhhCf1cEQCAAKAIAIQIgBARAIAQgAigCDDYCACAEIAIoAhA2AgQLDAELAkAgARAyQQBOBEACfwJAAkAgASAHQUBrQoDAABARIhJCAVMNAEIAIRkgFUIAVQRAIBW5IRoDQCAAIAdBQGsgEhAbQQBIDQMCQCASQoDAAFINACAAKAJUIgJFDQAgAiAZQoBAfSIZuSAaoxB7CyABIAdBQGtCgMAAEBEiEkIAVQ0ACwwBCwNAIAAgB0FAayASEBtBAEgNAiABIAdBQGtCgMAAEBEiEkIAVQ0ACwtBACASQn9VDQEaIAQEQCAEIAEoAgw2AgAgBCABKAIQNgIECwtBfwshAiABEBoaDAELIAQEQCAEIAEoAgw2AgAgBCABKAIQNgIEC0F/IQILIAEgB0EIahAhQX9MBEAgBARAIAQgASgCDDYCACAEIAEoAhA2AgQLQX8hAgsCf0EAIQkCQCABIgNFDQADQCADLQAaQQFxBEBB/wEhCSADQQBCAEEQEA4iFUIAUw0CIBVCBFkEQCADQQxqBEAgA0EANgIQIANBFDYCDAsMAwsgFachCQwCCyADKAIAIgMNAAsLIAlBGHRBGHUiA0F/TAsEQCAEBEAgBCABKAIMNgIAIAQgASgCEDYCBAsgARALDAELIAEQCyACQQBIDQAgACgCABAfIRUgACgCACECIBVCf1cEQCAEBEAgBCACKAIMNgIAIAQgAigCEDYCBAsMAQsgAiATEHVBf0wEQCAAKAIAIQIgBARAIAQgAigCDDYCACAEIAIoAhA2AgQLDAELIAcpAwgiE0LkAINC5ABSBEAgBARAIARBADYCBCAEQRQ2AgALDAELAkAgBS0AAEEgcQ0AIBNCEINQRQRAIAUgBygCMDYCFAwBCyAFQRRqEAEaCyAFIAcvATg2AhAgBSAHKAI0NgIYIAcpAyAhEyAFIBUgGH03AyAgBSATNwMoIAUgBS8BDEH5/wNxIANB/wFxQQF0cjsBDCAPQQp2IQNBPyEBAkACQAJAAkAgBSgCECICQQxrDgMAAQIBCyAFQS47AQoMAgtBLSEBIAMNACAFKQMoQv7///8PVg0AIAUpAyBC/v///w9WDQBBFCEBIAJBCEYNACAFLwFSQQFGDQAgBSgCMCICBH8gAi8BBAVBAAtB//8DcSICBEAgAiAFKAIwKAIAakEBay0AAEEvRg0BC0EKIQELIAUgATsBCgsgACAFIA8QNyICQQBIDQAgAiAKRwRAIAQEQCAEQQA2AgQgBEEUNgIACwwBCyAAKAIAIBUQdUF/Sg0BIAAoAgAhAiAEBEAgBCACKAIMNgIAIAQgAigCEDYCBAsLIA0NByAMEAsMBwsgDQ0CIAwQCwwCCyAFIAUvAQxB9/8DcTsBDCAAIAVBgAIQN0EASA0FIAAgEyAEEEEiE1ANBSAAKAIAIBNBABAUQX9MBEAgACgCACECIAQEQCAEIAIoAgw2AgAgBCACKAIQNgIECwwGCyAFKQMgIRIjAEGAQGoiAyQAAkAgElBFBEAgAEEIaiECIBK6IRoDQEF/IQEgACgCACADIBJCgMAAIBJCgMAAVBsiEyACEGVBAEgNAiAAIAMgExAbQQBIDQIgACgCVCAaIBIgE30iErqhIBqjEHsgEkIAUg0ACwtBACEBCyADQYBAayQAIAFBf0oNAUEBIREgAUEcdkEIcUEIRgwCCyAEBEAgBEEANgIEIARBDjYCAAsMBAtBAAtFDQELCyARDQBBfyECAkAgACgCABAfQgBTDQAgFyEUQQAhCkIAIRcjAEHwAGsiESQAAkAgACgCABAfIhVCAFkEQCAUUEUEQANAIAAgACgCQCALIBenQQN0aigCAEEEdGoiAygCBCIBBH8gAQUgAygCAAtBgAQQNyIBQQBIBEBCfyEXDAQLIAFBAEcgCnIhCiAXQgF8IhcgFFINAAsLQn8hFyAAKAIAEB8iGEJ/VwRAIAAoAgAhASAAQQhqBEAgACABKAIMNgIIIAAgASgCEDYCDAsMAgsgEULiABAXIgZFBEAgAEEIagRAIABBADYCDCAAQQ42AggLDAILIBggFX0hEyAVQv////8PViAUQv//A1ZyIApyQQFxBEAgBkGZEkEEECwgBkIsEBggBkEtEA0gBkEtEA0gBkEAEBIgBkEAEBIgBiAUEBggBiAUEBggBiATEBggBiAVEBggBkGUEkEEECwgBkEAEBIgBiAYEBggBkEBEBILIAZBnhJBBBAsIAZBABASIAYgFEL//wMgFEL//wNUG6dB//8DcSIBEA0gBiABEA0gBkF/IBOnIBNC/v///w9WGxASIAZBfyAVpyAVQv7///8PVhsQEiAGIABBJEEgIAAtACgbaigCACIDBH8gAy8BBAVBAAtB//8DcRANIAYtAABFBEAgAEEIagRAIABBADYCDCAAQRQ2AggLIAYQCAwCCyAAIAYoAgQgBi0AAAR+IAYpAxAFQgALEBshASAGEAggAUEASA0BIAMEQCAAIAMoAgAgAzMBBBAbQQBIDQILIBMhFwwBCyAAKAIAIQEgAEEIagRAIAAgASgCDDYCCCAAIAEoAhA2AgwLQn8hFwsgEUHwAGokACAXQgBTDQAgACgCABAfQj+HpyECCyALEAYgAkEASA0BAn8gACgCACIBKAIkQQFHBEAgAUEMagRAIAFBADYCECABQRI2AgwLQX8MAQsgASgCICICQQJPBEAgAUEMagRAIAFBADYCECABQR02AgwLQX8MAQsCQCACQQFHDQAgARAaQQBODQBBfwwBCyABQQBCAEEJEA5Cf1cEQCABQQI2AiRBfwwBCyABQQA2AiRBAAtFDQIgACgCACECIAQEQCAEIAIoAgw2AgAgBCACKAIQNgIECwwBCyALEAYLIAAoAlQQfCAAKAIAEENBfyECDAILIAAoAlQQfAsgABBLQQAhAgsgB0HAwABqJAAgAgtFAEHwgwFCADcDAEHogwFCADcDAEHggwFCADcDAEHYgwFCADcDAEHQgwFCADcDAEHIgwFCADcDAEHAgwFCADcDAEHAgwELoQMBCH8jAEGgAWsiAiQAIAAQMQJAAn8CQCAAKAIAIgFBAE4EQCABQbATKAIASA0BCyACIAE2AhAgAkEgakH2ESACQRBqEHZBASEGIAJBIGohBCACQSBqECIhA0EADAELIAFBAnQiAUGwEmooAgAhBQJ/AkACQCABQcATaigCAEEBaw4CAAEECyAAKAIEIQNB9IIBKAIAIQdBACEBAkACQANAIAMgAUHQ8QBqLQAARwRAQdcAIQQgAUEBaiIBQdcARw0BDAILCyABIgQNAEGw8gAhAwwBC0Gw8gAhAQNAIAEtAAAhCCABQQFqIgMhASAIDQAgAyEBIARBAWsiBA0ACwsgBygCFBogAwwBC0EAIAAoAgRrQQJ0QdjAAGooAgALIgRFDQEgBBAiIQMgBUUEQEEAIQVBASEGQQAMAQsgBRAiQQJqCyEBIAEgA2pBAWoQCSIBRQRAQegSKAIAIQUMAQsgAiAENgIIIAJBrBJBkRIgBhs2AgQgAkGsEiAFIAYbNgIAIAFBqwogAhB2IAAgATYCCCABIQULIAJBoAFqJAAgBQszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQBxogACAAKAIUIAFqNgIUIAILBgBBsIgBCwYAQayIAQsGAEGkiAELBwAgAEEEagsHACAAQQhqCyYBAX8gACgCFCIBBEAgARALCyAAKAIEIQEgAEEEahAxIAAQBiABC6kBAQN/AkAgAC0AACICRQ0AA0AgAS0AACIERQRAIAIhAwwCCwJAIAIgBEYNACACQSByIAIgAkHBAGtBGkkbIAEtAAAiAkEgciACIAJBwQBrQRpJG0YNACAALQAAIQMMAgsgAUEBaiEBIAAtAAEhAiAAQQFqIQAgAg0ACwsgA0H/AXEiAEEgciAAIABBwQBrQRpJGyABLQAAIgBBIHIgACAAQcEAa0EaSRtrC8sGAgJ+An8jAEHgAGsiByQAAkACQAJAAkACQAJAAkACQAJAAkACQCAEDg8AAQoCAwQGBwgICAgICAUICyABQgA3AyAMCQsgACACIAMQESIFQn9XBEAgAUEIaiIBBEAgASAAKAIMNgIAIAEgACgCEDYCBAsMCAsCQCAFUARAIAEpAygiAyABKQMgUg0BIAEgAzcDGCABQQE2AgQgASgCAEUNASAAIAdBKGoQIUF/TARAIAFBCGoiAQRAIAEgACgCDDYCACABIAAoAhA2AgQLDAoLAkAgBykDKCIDQiCDUA0AIAcoAlQgASgCMEYNACABQQhqBEAgAUEANgIMIAFBBzYCCAsMCgsgA0IEg1ANASAHKQNAIAEpAxhRDQEgAUEIagRAIAFBADYCDCABQRU2AggLDAkLIAEoAgQNACABKQMoIgMgASkDICIGVA0AIAUgAyAGfSIDWA0AIAEoAjAhBANAIAECfyAFIAN9IgZC/////w8gBkL/////D1QbIganIQBBACACIAOnaiIIRQ0AGiAEIAggAEHUgAEoAgARAAALIgQ2AjAgASABKQMoIAZ8NwMoIAUgAyAGfCIDVg0ACwsgASABKQMgIAV8NwMgDAgLIAEoAgRFDQcgAiABKQMYIgM3AxggASgCMCEAIAJBADYCMCACIAM3AyAgAiAANgIsIAIgAikDAELsAYQ3AwAMBwsgA0IIWgR+IAIgASgCCDYCACACIAEoAgw2AgRCCAVCfwshBQwGCyABEAYMBQtCfyEFIAApAxgiA0J/VwRAIAFBCGoiAQRAIAEgACgCDDYCACABIAAoAhA2AgQLDAULIAdBfzYCGCAHQo+AgICAAjcDECAHQoyAgIDQATcDCCAHQomAgICgATcDACADQQggBxAkQn+FgyEFDAQLIANCD1gEQCABQQhqBEAgAUEANgIMIAFBEjYCCAsMAwsgAkUNAgJAIAAgAikDACACKAIIEBRBAE4EQCAAEDMiA0J/VQ0BCyABQQhqIgEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwDCyABIAM3AyAMAwsgASkDICEFDAILIAFBCGoEQCABQQA2AgwgAUEcNgIICwtCfyEFCyAHQeAAaiQAIAULjAcCAn4CfyMAQRBrIgckAAJAAkACQAJAAkACQAJAAkACQAJAIAQOEQABAgMFBggICAgICAgIBwgECAsgAUJ/NwMgIAFBADoADyABQQA7AQwgAUIANwMYIAEoAqxAIAEoAqhAKAIMEQEArUIBfSEFDAgLQn8hBSABKAIADQdCACEFIANQDQcgAS0ADQ0HIAFBKGohBAJAA0ACQCAHIAMgBX03AwggASgCrEAgAiAFp2ogB0EIaiABKAKoQCgCHBEAACEIQgAgBykDCCAIQQJGGyAFfCEFAkACQAJAIAhBAWsOAwADAQILIAFBAToADSABKQMgIgNCf1cEQCABBEAgAUEANgIEIAFBFDYCAAsMBQsgAS0ADkUNBCADIAVWDQQgASADNwMYIAFBAToADyACIAQgA6cQBxogASkDGCEFDAwLIAEtAAwNAyAAIARCgMAAEBEiBkJ/VwRAIAEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwECyAGUARAIAFBAToADCABKAKsQCABKAKoQCgCGBEDACABKQMgQn9VDQEgAUIANwMgDAELAkAgASkDIEIAWQRAIAFBADoADgwBCyABIAY3AyALIAEoAqxAIAQgBiABKAKoQCgCFBEPABoLIAMgBVYNAQwCCwsgASgCAA0AIAEEQCABQQA2AgQgAUEUNgIACwsgBVBFBEAgAUEAOgAOIAEgASkDGCAFfDcDGAwIC0J/QgAgASgCABshBQwHCyABKAKsQCABKAKoQCgCEBEBAK1CAX0hBQwGCyABLQAQBEAgAS0ADQRAIAIgAS0ADwR/QQAFQQggASgCFCIAIABBfUsbCzsBMCACIAEpAxg3AyAgAiACKQMAQsgAhDcDAAwHCyACIAIpAwBCt////w+DNwMADAYLIAJBADsBMCACKQMAIQMgAS0ADQRAIAEpAxghBSACIANCxACENwMAIAIgBTcDGEIAIQUMBgsgAiADQrv///8Pg0LAAIQ3AwAMBQsgAS0ADw0EIAEoAqxAIAEoAqhAKAIIEQEArCEFDAQLIANCCFoEfiACIAEoAgA2AgAgAiABKAIENgIEQggFQn8LIQUMAwsgAUUNAiABKAKsQCABKAKoQCgCBBEDACABEDEgARAGDAILIAdBfzYCAEEQIAcQJEI/hCEFDAELIAEEQCABQQA2AgQgAUEUNgIAC0J/IQULIAdBEGokACAFC2MAQcgAEAkiAEUEQEGEhAEoAgAhASACBEAgAiABNgIEIAJBATYCAAsgAA8LIABBADoADCAAQQA6AAQgACACNgIAIABBADYCOCAAQgA3AzAgACABQQkgAUEBa0EJSRs2AgggAAu3fAIefwZ+IAIpAwAhIiAAIAE2AhwgACAiQv////8PICJC/////w9UGz4CICAAQRBqIQECfyAALQAEBEACfyAALQAMQQJ0IQpBfiEEAkACQAJAIAEiBUUNACAFKAIgRQ0AIAUoAiRFDQAgBSgCHCIDRQ0AIAMoAgAgBUcNAAJAAkAgAygCICIGQTlrDjkBAgICAgICAgICAgIBAgICAQICAgICAgICAgICAgICAgICAQICAgICAgICAgICAQICAgICAgICAgEACyAGQZoFRg0AIAZBKkcNAQsgCkEFSw0AAkACQCAFKAIMRQ0AIAUoAgQiAQRAIAUoAgBFDQELIAZBmgVHDQEgCkEERg0BCyAFQeDAACgCADYCGEF+DAQLIAUoAhBFDQEgAygCJCEEIAMgCjYCJAJAIAMoAhAEQCADEDACQCAFKAIQIgYgAygCECIIIAYgCEkbIgFFDQAgBSgCDCADKAIIIAEQBxogBSAFKAIMIAFqNgIMIAMgAygCCCABajYCCCAFIAUoAhQgAWo2AhQgBSAFKAIQIAFrIgY2AhAgAyADKAIQIAFrIgg2AhAgCA0AIAMgAygCBDYCCEEAIQgLIAYEQCADKAIgIQYMAgsMBAsgAQ0AIApBAXRBd0EAIApBBEsbaiAEQQF0QXdBACAEQQRKG2pKDQAgCkEERg0ADAILAkACQAJAAkACQCAGQSpHBEAgBkGaBUcNASAFKAIERQ0DDAcLIAMoAhRFBEAgA0HxADYCIAwCCyADKAI0QQx0QYDwAWshBAJAIAMoAowBQQJODQAgAygCiAEiAUEBTA0AIAFBBUwEQCAEQcAAciEEDAELQYABQcABIAFBBkYbIARyIQQLIAMoAgQgCGogBEEgciAEIAMoAmgbIgFBH3AgAXJBH3NBCHQgAUGA/gNxQQh2cjsAACADIAMoAhBBAmoiATYCECADKAJoBEAgAygCBCABaiAFKAIwIgFBGHQgAUEIdEGAgPwHcXIgAUEIdkGA/gNxIAFBGHZycjYAACADIAMoAhBBBGo2AhALIAVBATYCMCADQfEANgIgIAUQCiADKAIQDQcgAygCICEGCwJAAkACQAJAIAZBOUYEfyADQaABakHkgAEoAgARAQAaIAMgAygCECIBQQFqNgIQIAEgAygCBGpBHzoAACADIAMoAhAiAUEBajYCECABIAMoAgRqQYsBOgAAIAMgAygCECIBQQFqNgIQIAEgAygCBGpBCDoAAAJAIAMoAhwiAUUEQCADKAIEIAMoAhBqQQA2AAAgAyADKAIQIgFBBWo2AhAgASADKAIEakEAOgAEQQIhBCADKAKIASIBQQlHBEBBBCABQQJIQQJ0IAMoAowBQQFKGyEECyADIAMoAhAiAUEBajYCECABIAMoAgRqIAQ6AAAgAyADKAIQIgFBAWo2AhAgASADKAIEakEDOgAAIANB8QA2AiAgBRAKIAMoAhBFDQEMDQsgASgCJCELIAEoAhwhCSABKAIQIQggASgCLCENIAEoAgAhBiADIAMoAhAiAUEBajYCEEECIQQgASADKAIEaiANQQBHQQF0IAZBAEdyIAhBAEdBAnRyIAlBAEdBA3RyIAtBAEdBBHRyOgAAIAMoAgQgAygCEGogAygCHCgCBDYAACADIAMoAhAiDUEEaiIGNgIQIAMoAogBIgFBCUcEQEEEIAFBAkhBAnQgAygCjAFBAUobIQQLIAMgDUEFajYCECADKAIEIAZqIAQ6AAAgAygCHCgCDCEEIAMgAygCECIBQQFqNgIQIAEgAygCBGogBDoAACADKAIcIgEoAhAEfyADKAIEIAMoAhBqIAEoAhQ7AAAgAyADKAIQQQJqNgIQIAMoAhwFIAELKAIsBEAgBQJ/IAUoAjAhBiADKAIQIQRBACADKAIEIgFFDQAaIAYgASAEQdSAASgCABEAAAs2AjALIANBxQA2AiAgA0EANgIYDAILIAMoAiAFIAYLQcUAaw4jAAQEBAEEBAQEBAQEBAQEBAQEBAQEBAIEBAQEBAQEBAQEBAMECyADKAIcIgEoAhAiBgRAIAMoAgwiCCADKAIQIgQgAS8BFCADKAIYIg1rIglqSQRAA0AgAygCBCAEaiAGIA1qIAggBGsiCBAHGiADIAMoAgwiDTYCEAJAIAMoAhwoAixFDQAgBCANTw0AIAUCfyAFKAIwIQZBACADKAIEIARqIgFFDQAaIAYgASANIARrQdSAASgCABEAAAs2AjALIAMgAygCGCAIajYCGCAFKAIcIgYQMAJAIAUoAhAiBCAGKAIQIgEgASAESxsiAUUNACAFKAIMIAYoAgggARAHGiAFIAUoAgwgAWo2AgwgBiAGKAIIIAFqNgIIIAUgBSgCFCABajYCFCAFIAUoAhAgAWs2AhAgBiAGKAIQIAFrIgE2AhAgAQ0AIAYgBigCBDYCCAsgAygCEA0MIAMoAhghDSADKAIcKAIQIQZBACEEIAkgCGsiCSADKAIMIghLDQALCyADKAIEIARqIAYgDWogCRAHGiADIAMoAhAgCWoiDTYCEAJAIAMoAhwoAixFDQAgBCANTw0AIAUCfyAFKAIwIQZBACADKAIEIARqIgFFDQAaIAYgASANIARrQdSAASgCABEAAAs2AjALIANBADYCGAsgA0HJADYCIAsgAygCHCgCHARAIAMoAhAiBCEJA0ACQCAEIAMoAgxHDQACQCADKAIcKAIsRQ0AIAQgCU0NACAFAn8gBSgCMCEGQQAgAygCBCAJaiIBRQ0AGiAGIAEgBCAJa0HUgAEoAgARAAALNgIwCyAFKAIcIgYQMAJAIAUoAhAiBCAGKAIQIgEgASAESxsiAUUNACAFKAIMIAYoAgggARAHGiAFIAUoAgwgAWo2AgwgBiAGKAIIIAFqNgIIIAUgBSgCFCABajYCFCAFIAUoAhAgAWs2AhAgBiAGKAIQIAFrIgE2AhAgAQ0AIAYgBigCBDYCCAtBACEEQQAhCSADKAIQRQ0ADAsLIAMoAhwoAhwhBiADIAMoAhgiAUEBajYCGCABIAZqLQAAIQEgAyAEQQFqNgIQIAMoAgQgBGogAToAACABBEAgAygCECEEDAELCwJAIAMoAhwoAixFDQAgAygCECIGIAlNDQAgBQJ/IAUoAjAhBEEAIAMoAgQgCWoiAUUNABogBCABIAYgCWtB1IABKAIAEQAACzYCMAsgA0EANgIYCyADQdsANgIgCwJAIAMoAhwoAiRFDQAgAygCECIEIQkDQAJAIAQgAygCDEcNAAJAIAMoAhwoAixFDQAgBCAJTQ0AIAUCfyAFKAIwIQZBACADKAIEIAlqIgFFDQAaIAYgASAEIAlrQdSAASgCABEAAAs2AjALIAUoAhwiBhAwAkAgBSgCECIEIAYoAhAiASABIARLGyIBRQ0AIAUoAgwgBigCCCABEAcaIAUgBSgCDCABajYCDCAGIAYoAgggAWo2AgggBSAFKAIUIAFqNgIUIAUgBSgCECABazYCECAGIAYoAhAgAWsiATYCECABDQAgBiAGKAIENgIIC0EAIQRBACEJIAMoAhBFDQAMCgsgAygCHCgCJCEGIAMgAygCGCIBQQFqNgIYIAEgBmotAAAhASADIARBAWo2AhAgAygCBCAEaiABOgAAIAEEQCADKAIQIQQMAQsLIAMoAhwoAixFDQAgAygCECIGIAlNDQAgBQJ/IAUoAjAhBEEAIAMoAgQgCWoiAUUNABogBCABIAYgCWtB1IABKAIAEQAACzYCMAsgA0HnADYCIAsCQCADKAIcKAIsBEAgAygCDCADKAIQIgFBAmpJBH8gBRAKIAMoAhANAkEABSABCyADKAIEaiAFKAIwOwAAIAMgAygCEEECajYCECADQaABakHkgAEoAgARAQAaCyADQfEANgIgIAUQCiADKAIQRQ0BDAcLDAYLIAUoAgQNAQsgAygCPA0AIApFDQEgAygCIEGaBUYNAQsCfyADKAKIASIBRQRAIAMgChCFAQwBCwJAAkACQCADKAKMAUECaw4CAAECCwJ/AkADQAJAAkAgAygCPA0AIAMQLyADKAI8DQAgCg0BQQAMBAsgAygCSCADKAJoai0AACEEIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qQQA6AAAgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtaiAEOgAAIAMgBEECdGoiASABLwHkAUEBajsB5AEgAyADKAI8QQFrNgI8IAMgAygCaEEBaiIBNgJoIAMoAvAtIAMoAvQtRw0BQQAhBCADIAMoAlgiBkEATgR/IAMoAkggBmoFQQALIAEgBmtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEA0BDAILCyADQQA2AoQuIApBBEYEQCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBARAPIAMgAygCaDYCWCADKAIAEApBA0ECIAMoAgAoAhAbDAILIAMoAvAtBEBBACEEIAMgAygCWCIBQQBOBH8gAygCSCABagVBAAsgAygCaCABa0EAEA8gAyADKAJoNgJYIAMoAgAQCiADKAIAKAIQRQ0BC0EBIQQLIAQLDAILAn8CQANAAkACQAJAAkACQCADKAI8Ig1BggJLDQAgAxAvAkAgAygCPCINQYICSw0AIAoNAEEADAgLIA1FDQQgDUECSw0AIAMoAmghCAwBCyADKAJoIghFBEBBACEIDAELIAMoAkggCGoiAUEBayIELQAAIgYgAS0AAEcNACAGIAQtAAJHDQAgBEEDaiEEQQAhCQJAA0AgBiAELQAARw0BIAQtAAEgBkcEQCAJQQFyIQkMAgsgBC0AAiAGRwRAIAlBAnIhCQwCCyAELQADIAZHBEAgCUEDciEJDAILIAQtAAQgBkcEQCAJQQRyIQkMAgsgBC0ABSAGRwRAIAlBBXIhCQwCCyAELQAGIAZHBEAgCUEGciEJDAILIAQtAAcgBkcEQCAJQQdyIQkMAgsgBEEIaiEEIAlB+AFJIQEgCUEIaiEJIAENAAtBgAIhCQtBggIhBCANIAlBAmoiASABIA1LGyIBQYECSw0BIAEiBEECSw0BCyADKAJIIAhqLQAAIQQgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtakEAOgAAIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qIAQ6AAAgAyAEQQJ0aiIBIAEvAeQBQQFqOwHkASADIAMoAjxBAWs2AjwgAyADKAJoQQFqIgQ2AmgMAQsgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtakEBOgAAIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qIARBA2s6AAAgAyADKAKALkEBajYCgC4gBEH9zgBqLQAAQQJ0IANqQegJaiIBIAEvAQBBAWo7AQAgA0GAywAtAABBAnRqQdgTaiIBIAEvAQBBAWo7AQAgAyADKAI8IARrNgI8IAMgAygCaCAEaiIENgJoCyADKALwLSADKAL0LUcNAUEAIQggAyADKAJYIgFBAE4EfyADKAJIIAFqBUEACyAEIAFrQQAQDyADIAMoAmg2AlggAygCABAKIAMoAgAoAhANAQwCCwsgA0EANgKELiAKQQRGBEAgAyADKAJYIgFBAE4EfyADKAJIIAFqBUEACyADKAJoIAFrQQEQDyADIAMoAmg2AlggAygCABAKQQNBAiADKAIAKAIQGwwCCyADKALwLQRAQQAhCCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEEUNAQtBASEICyAICwwBCyADIAogAUEMbEG42ABqKAIAEQIACyIBQX5xQQJGBEAgA0GaBTYCIAsgAUF9cUUEQEEAIQQgBSgCEA0CDAQLIAFBAUcNAAJAAkACQCAKQQFrDgUAAQEBAgELIAMpA5guISICfwJ+IAMoAqAuIgFBA2oiCUE/TQRAQgIgAa2GICKEDAELIAFBwABGBEAgAygCBCADKAIQaiAiNwAAIAMgAygCEEEIajYCEEICISJBCgwCCyADKAIEIAMoAhBqQgIgAa2GICKENwAAIAMgAygCEEEIajYCECABQT1rIQlCAkHAACABa62ICyEiIAlBB2ogCUE5SQ0AGiADKAIEIAMoAhBqICI3AAAgAyADKAIQQQhqNgIQQgAhIiAJQTlrCyEBIAMgIjcDmC4gAyABNgKgLiADEDAMAQsgA0EAQQBBABA5IApBA0cNACADKAJQQQBBgIAIEBkgAygCPA0AIANBADYChC4gA0EANgJYIANBADYCaAsgBRAKIAUoAhANAAwDC0EAIQQgCkEERw0AAkACfwJAAkAgAygCFEEBaw4CAQADCyAFIANBoAFqQeCAASgCABEBACIBNgIwIAMoAgQgAygCEGogATYAACADIAMoAhBBBGoiATYCECADKAIEIAFqIQQgBSgCCAwBCyADKAIEIAMoAhBqIQQgBSgCMCIBQRh0IAFBCHRBgID8B3FyIAFBCHZBgP4DcSABQRh2cnILIQEgBCABNgAAIAMgAygCEEEEajYCEAsgBRAKIAMoAhQiAUEBTgRAIANBACABazYCFAsgAygCEEUhBAsgBAwCCyAFQezAACgCADYCGEF7DAELIANBfzYCJEEACwwBCyMAQRBrIhQkAEF+IRcCQCABIgxFDQAgDCgCIEUNACAMKAIkRQ0AIAwoAhwiB0UNACAHKAIAIAxHDQAgBygCBCIIQbT+AGtBH0sNACAMKAIMIhBFDQAgDCgCACIBRQRAIAwoAgQNAQsgCEG//gBGBEAgB0HA/gA2AgRBwP4AIQgLIAdBpAFqIR8gB0G8BmohGSAHQbwBaiEcIAdBoAFqIR0gB0G4AWohGiAHQfwKaiEYIAdBQGshHiAHKAKIASEFIAwoAgQiICEGIAcoAoQBIQogDCgCECIPIRYCfwJAAkACQANAAkBBfSEEQQEhCQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAhBtP4Aaw4fBwYICQolJicoBSwtLQsZGgQMAjIzATUANw0OAzlISUwLIAcoApQBIQMgASEEIAYhCAw1CyAHKAKUASEDIAEhBCAGIQgMMgsgBygCtAEhCAwuCyAHKAIMIQgMQQsgBUEOTw0pIAZFDUEgBUEIaiEIIAFBAWohBCAGQQFrIQkgAS0AACAFdCAKaiEKIAVBBkkNDCAEIQEgCSEGIAghBQwpCyAFQSBPDSUgBkUNQCABQQFqIQQgBkEBayEIIAEtAAAgBXQgCmohCiAFQRhJDQ0gBCEBIAghBgwlCyAFQRBPDRUgBkUNPyAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEISQ0NIAQhASAJIQYgCCEFDBULIAcoAgwiC0UNByAFQRBPDSIgBkUNPiAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEISQ0NIAQhASAJIQYgCCEFDCILIAVBH0sNFQwUCyAFQQ9LDRYMFQsgBygCFCIEQYAIcUUEQCAFIQgMFwsgCiEIIAVBD0sNGAwXCyAKIAVBB3F2IQogBUF4cSIFQR9LDQwgBkUNOiAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEYSQ0GIAQhASAJIQYgCCEFDAwLIAcoArQBIgggBygCqAEiC08NIwwiCyAPRQ0qIBAgBygCjAE6AAAgB0HI/gA2AgQgD0EBayEPIBBBAWohECAHKAIEIQgMOQsgBygCDCIDRQRAQQAhCAwJCyAFQR9LDQcgBkUNNyAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEYSQ0BIAQhASAJIQYgCCEFDAcLIAdBwP4ANgIEDCoLIAlFBEAgBCEBQQAhBiAIIQUgDSEEDDgLIAVBEGohCSABQQJqIQQgBkECayELIAEtAAEgCHQgCmohCiAFQQ9LBEAgBCEBIAshBiAJIQUMBgsgC0UEQCAEIQFBACEGIAkhBSANIQQMOAsgBUEYaiEIIAFBA2ohBCAGQQNrIQsgAS0AAiAJdCAKaiEKIAVBB0sEQCAEIQEgCyEGIAghBQwGCyALRQRAIAQhAUEAIQYgCCEFIA0hBAw4CyAFQSBqIQUgBkEEayEGIAEtAAMgCHQgCmohCiABQQRqIQEMBQsgCUUEQCAEIQFBACEGIAghBSANIQQMNwsgBUEQaiEFIAZBAmshBiABLQABIAh0IApqIQogAUECaiEBDBwLIAlFBEAgBCEBQQAhBiAIIQUgDSEEDDYLIAVBEGohCSABQQJqIQQgBkECayELIAEtAAEgCHQgCmohCiAFQQ9LBEAgBCEBIAshBiAJIQUMBgsgC0UEQCAEIQFBACEGIAkhBSANIQQMNgsgBUEYaiEIIAFBA2ohBCAGQQNrIQsgAS0AAiAJdCAKaiEKIAUEQCAEIQEgCyEGIAghBQwGCyALRQRAIAQhAUEAIQYgCCEFIA0hBAw2CyAFQSBqIQUgBkEEayEGIAEtAAMgCHQgCmohCiABQQRqIQEMBQsgBUEIaiEJIAhFBEAgBCEBQQAhBiAJIQUgDSEEDDULIAFBAmohBCAGQQJrIQggAS0AASAJdCAKaiEKIAVBD0sEQCAEIQEgCCEGDBgLIAVBEGohCSAIRQRAIAQhAUEAIQYgCSEFIA0hBAw1CyABQQNqIQQgBkEDayEIIAEtAAIgCXQgCmohCiAFQQdLBEAgBCEBIAghBgwYCyAFQRhqIQUgCEUEQCAEIQFBACEGIA0hBAw1CyAGQQRrIQYgAS0AAyAFdCAKaiEKIAFBBGohAQwXCyAJDQYgBCEBQQAhBiAIIQUgDSEEDDMLIAlFBEAgBCEBQQAhBiAIIQUgDSEEDDMLIAVBEGohBSAGQQJrIQYgAS0AASAIdCAKaiEKIAFBAmohAQwUCyAMIBYgD2siCSAMKAIUajYCFCAHIAcoAiAgCWo2AiACQCADQQRxRQ0AIAkEQAJAIBAgCWshBCAMKAIcIggoAhQEQCAIQUBrIAQgCUEAQdiAASgCABEIAAwBCyAIIAgoAhwgBCAJQcCAASgCABEAACIENgIcIAwgBDYCMAsLIAcoAhRFDQAgByAeQeCAASgCABEBACIENgIcIAwgBDYCMAsCQCAHKAIMIghBBHFFDQAgBygCHCAKIApBCHRBgID8B3EgCkEYdHIgCkEIdkGA/gNxIApBGHZyciAHKAIUG0YNACAHQdH+ADYCBCAMQaQMNgIYIA8hFiAHKAIEIQgMMQtBACEKQQAhBSAPIRYLIAdBz/4ANgIEDC0LIApB//8DcSIEIApBf3NBEHZHBEAgB0HR/gA2AgQgDEGOCjYCGCAHKAIEIQgMLwsgB0HC/gA2AgQgByAENgKMAUEAIQpBACEFCyAHQcP+ADYCBAsgBygCjAEiBARAIA8gBiAEIAQgBksbIgQgBCAPSxsiCEUNHiAQIAEgCBAHIQQgByAHKAKMASAIazYCjAEgBCAIaiEQIA8gCGshDyABIAhqIQEgBiAIayEGIAcoAgQhCAwtCyAHQb/+ADYCBCAHKAIEIQgMLAsgBUEQaiEFIAZBAmshBiABLQABIAh0IApqIQogAUECaiEBCyAHIAo2AhQgCkH/AXFBCEcEQCAHQdH+ADYCBCAMQYIPNgIYIAcoAgQhCAwrCyAKQYDAA3EEQCAHQdH+ADYCBCAMQY0JNgIYIAcoAgQhCAwrCyAHKAIkIgQEQCAEIApBCHZBAXE2AgALAkAgCkGABHFFDQAgBy0ADEEEcUUNACAUIAo7AAwgBwJ/IAcoAhwhBUEAIBRBDGoiBEUNABogBSAEQQJB1IABKAIAEQAACzYCHAsgB0G2/gA2AgRBACEFQQAhCgsgBkUNKCABQQFqIQQgBkEBayEIIAEtAAAgBXQgCmohCiAFQRhPBEAgBCEBIAghBgwBCyAFQQhqIQkgCEUEQCAEIQFBACEGIAkhBSANIQQMKwsgAUECaiEEIAZBAmshCCABLQABIAl0IApqIQogBUEPSwRAIAQhASAIIQYMAQsgBUEQaiEJIAhFBEAgBCEBQQAhBiAJIQUgDSEEDCsLIAFBA2ohBCAGQQNrIQggAS0AAiAJdCAKaiEKIAVBB0sEQCAEIQEgCCEGDAELIAVBGGohBSAIRQRAIAQhAUEAIQYgDSEEDCsLIAZBBGshBiABLQADIAV0IApqIQogAUEEaiEBCyAHKAIkIgQEQCAEIAo2AgQLAkAgBy0AFUECcUUNACAHLQAMQQRxRQ0AIBQgCjYADCAHAn8gBygCHCEFQQAgFEEMaiIERQ0AGiAFIARBBEHUgAEoAgARAAALNgIcCyAHQbf+ADYCBEEAIQVBACEKCyAGRQ0mIAFBAWohBCAGQQFrIQggAS0AACAFdCAKaiEKIAVBCE8EQCAEIQEgCCEGDAELIAVBCGohBSAIRQRAIAQhAUEAIQYgDSEEDCkLIAZBAmshBiABLQABIAV0IApqIQogAUECaiEBCyAHKAIkIgQEQCAEIApBCHY2AgwgBCAKQf8BcTYCCAsCQCAHLQAVQQJxRQ0AIActAAxBBHFFDQAgFCAKOwAMIAcCfyAHKAIcIQVBACAUQQxqIgRFDQAaIAUgBEECQdSAASgCABEAAAs2AhwLIAdBuP4ANgIEQQAhCEEAIQVBACEKIAcoAhQiBEGACHENAQsgBygCJCIEBEAgBEEANgIQCyAIIQUMAgsgBkUEQEEAIQYgCCEKIA0hBAwmCyABQQFqIQkgBkEBayELIAEtAAAgBXQgCGohCiAFQQhPBEAgCSEBIAshBgwBCyAFQQhqIQUgC0UEQCAJIQFBACEGIA0hBAwmCyAGQQJrIQYgAS0AASAFdCAKaiEKIAFBAmohAQsgByAKQf//A3EiCDYCjAEgBygCJCIFBEAgBSAINgIUC0EAIQUCQCAEQYAEcUUNACAHLQAMQQRxRQ0AIBQgCjsADCAHAn8gBygCHCEIQQAgFEEMaiIERQ0AGiAIIARBAkHUgAEoAgARAAALNgIcC0EAIQoLIAdBuf4ANgIECyAHKAIUIglBgAhxBEAgBiAHKAKMASIIIAYgCEkbIg4EQAJAIAcoAiQiA0UNACADKAIQIgRFDQAgAygCGCILIAMoAhQgCGsiCE0NACAEIAhqIAEgCyAIayAOIAggDmogC0sbEAcaIAcoAhQhCQsCQCAJQYAEcUUNACAHLQAMQQRxRQ0AIAcCfyAHKAIcIQRBACABRQ0AGiAEIAEgDkHUgAEoAgARAAALNgIcCyAHIAcoAowBIA5rIgg2AowBIAYgDmshBiABIA5qIQELIAgNEwsgB0G6/gA2AgQgB0EANgKMAQsCQCAHLQAVQQhxBEBBACEIIAZFDQQDQCABIAhqLQAAIQMCQCAHKAIkIgtFDQAgCygCHCIERQ0AIAcoAowBIgkgCygCIE8NACAHIAlBAWo2AowBIAQgCWogAzoAAAsgA0EAIAYgCEEBaiIISxsNAAsCQCAHLQAVQQJxRQ0AIActAAxBBHFFDQAgBwJ/IAcoAhwhBEEAIAFFDQAaIAQgASAIQdSAASgCABEAAAs2AhwLIAEgCGohASAGIAhrIQYgA0UNAQwTCyAHKAIkIgRFDQAgBEEANgIcCyAHQbv+ADYCBCAHQQA2AowBCwJAIActABVBEHEEQEEAIQggBkUNAwNAIAEgCGotAAAhAwJAIAcoAiQiC0UNACALKAIkIgRFDQAgBygCjAEiCSALKAIoTw0AIAcgCUEBajYCjAEgBCAJaiADOgAACyADQQAgBiAIQQFqIghLGw0ACwJAIActABVBAnFFDQAgBy0ADEEEcUUNACAHAn8gBygCHCEEQQAgAUUNABogBCABIAhB1IABKAIAEQAACzYCHAsgASAIaiEBIAYgCGshBiADRQ0BDBILIAcoAiQiBEUNACAEQQA2AiQLIAdBvP4ANgIECyAHKAIUIgtBgARxBEACQCAFQQ9LDQAgBkUNHyAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEITwRAIAQhASAJIQYgCCEFDAELIAlFBEAgBCEBQQAhBiAIIQUgDSEEDCILIAVBEGohBSAGQQJrIQYgAS0AASAIdCAKaiEKIAFBAmohAQsCQCAHLQAMQQRxRQ0AIAogBy8BHEYNACAHQdH+ADYCBCAMQdcMNgIYIAcoAgQhCAwgC0EAIQpBACEFCyAHKAIkIgQEQCAEQQE2AjAgBCALQQl2QQFxNgIsCwJAIActAAxBBHFFDQAgC0UNACAHIB5B5IABKAIAEQEAIgQ2AhwgDCAENgIwCyAHQb/+ADYCBCAHKAIEIQgMHgtBACEGDA4LAkAgC0ECcUUNACAKQZ+WAkcNACAHKAIoRQRAIAdBDzYCKAtBACEKIAdBADYCHCAUQZ+WAjsADCAHIBRBDGoiBAR/QQAgBEECQdSAASgCABEAAAVBAAs2AhwgB0G1/gA2AgRBACEFIAcoAgQhCAwdCyAHKAIkIgQEQCAEQX82AjALAkAgC0EBcQRAIApBCHRBgP4DcSAKQQh2akEfcEUNAQsgB0HR/gA2AgQgDEH2CzYCGCAHKAIEIQgMHQsgCkEPcUEIRwRAIAdB0f4ANgIEIAxBgg82AhggBygCBCEIDB0LIApBBHYiBEEPcSIJQQhqIQsgCUEHTUEAIAcoAigiCAR/IAgFIAcgCzYCKCALCyALTxtFBEAgBUEEayEFIAdB0f4ANgIEIAxB+gw2AhggBCEKIAcoAgQhCAwdCyAHQQE2AhxBACEFIAdBADYCFCAHQYACIAl0NgIYIAxBATYCMCAHQb3+AEG//gAgCkGAwABxGzYCBEEAIQogBygCBCEIDBwLIAcgCkEIdEGAgPwHcSAKQRh0ciAKQQh2QYD+A3EgCkEYdnJyIgQ2AhwgDCAENgIwIAdBvv4ANgIEQQAhCkEAIQULIAcoAhBFBEAgDCAPNgIQIAwgEDYCDCAMIAY2AgQgDCABNgIAIAcgBTYCiAEgByAKNgKEAUECIRcMIAsgB0EBNgIcIAxBATYCMCAHQb/+ADYCBAsCfwJAIAcoAghFBEAgBUEDSQ0BIAUMAgsgB0HO/gA2AgQgCiAFQQdxdiEKIAVBeHEhBSAHKAIEIQgMGwsgBkUNGSAGQQFrIQYgAS0AACAFdCAKaiEKIAFBAWohASAFQQhqCyEEIAcgCkEBcTYCCAJAAkACQAJAAkAgCkEBdkEDcUEBaw4DAQIDAAsgB0HB/gA2AgQMAwsgB0Gw2wA2ApgBIAdCiYCAgNAANwOgASAHQbDrADYCnAEgB0HH/gA2AgQMAgsgB0HE/gA2AgQMAQsgB0HR/gA2AgQgDEHXDTYCGAsgBEEDayEFIApBA3YhCiAHKAIEIQgMGQsgByAKQR9xIghBgQJqNgKsASAHIApBBXZBH3EiBEEBajYCsAEgByAKQQp2QQ9xQQRqIgs2AqgBIAVBDmshBSAKQQ52IQogCEEdTUEAIARBHkkbRQRAIAdB0f4ANgIEIAxB6gk2AhggBygCBCEIDBkLIAdBxf4ANgIEQQAhCCAHQQA2ArQBCyAIIQQDQCAFQQJNBEAgBkUNGCAGQQFrIQYgAS0AACAFdCAKaiEKIAVBCGohBSABQQFqIQELIAcgBEEBaiIINgK0ASAHIARBAXRBsOwAai8BAEEBdGogCkEHcTsBvAEgBUEDayEFIApBA3YhCiALIAgiBEsNAAsLIAhBEk0EQEESIAhrIQ1BAyAIa0EDcSIEBEADQCAHIAhBAXRBsOwAai8BAEEBdGpBADsBvAEgCEEBaiEIIARBAWsiBA0ACwsgDUEDTwRAA0AgB0G8AWoiDSAIQQF0IgRBsOwAai8BAEEBdGpBADsBACANIARBsuwAai8BAEEBdGpBADsBACANIARBtOwAai8BAEEBdGpBADsBACANIARBtuwAai8BAEEBdGpBADsBACAIQQRqIghBE0cNAAsLIAdBEzYCtAELIAdBBzYCoAEgByAYNgKYASAHIBg2ArgBQQAhCEEAIBxBEyAaIB0gGRBOIg0EQCAHQdH+ADYCBCAMQfQINgIYIAcoAgQhCAwXCyAHQcb+ADYCBCAHQQA2ArQBQQAhDQsgBygCrAEiFSAHKAKwAWoiESAISwRAQX8gBygCoAF0QX9zIRIgBygCmAEhGwNAIAYhCSABIQsCQCAFIgMgGyAKIBJxIhNBAnRqLQABIg5PBEAgBSEEDAELA0AgCUUNDSALLQAAIAN0IQ4gC0EBaiELIAlBAWshCSADQQhqIgQhAyAEIBsgCiAOaiIKIBJxIhNBAnRqLQABIg5JDQALIAshASAJIQYLAkAgGyATQQJ0ai8BAiIFQQ9NBEAgByAIQQFqIgk2ArQBIAcgCEEBdGogBTsBvAEgBCAOayEFIAogDnYhCiAJIQgMAQsCfwJ/AkACQAJAIAVBEGsOAgABAgsgDkECaiIFIARLBEADQCAGRQ0bIAZBAWshBiABLQAAIAR0IApqIQogAUEBaiEBIARBCGoiBCAFSQ0ACwsgBCAOayEFIAogDnYhBCAIRQRAIAdB0f4ANgIEIAxBvAk2AhggBCEKIAcoAgQhCAwdCyAFQQJrIQUgBEECdiEKIARBA3FBA2ohCSAIQQF0IAdqLwG6AQwDCyAOQQNqIgUgBEsEQANAIAZFDRogBkEBayEGIAEtAAAgBHQgCmohCiABQQFqIQEgBEEIaiIEIAVJDQALCyAEIA5rQQNrIQUgCiAOdiIEQQN2IQogBEEHcUEDagwBCyAOQQdqIgUgBEsEQANAIAZFDRkgBkEBayEGIAEtAAAgBHQgCmohCiABQQFqIQEgBEEIaiIEIAVJDQALCyAEIA5rQQdrIQUgCiAOdiIEQQd2IQogBEH/AHFBC2oLIQlBAAshAyAIIAlqIBFLDRMgCUEBayEEIAlBA3EiCwRAA0AgByAIQQF0aiADOwG8ASAIQQFqIQggCUEBayEJIAtBAWsiCw0ACwsgBEEDTwRAA0AgByAIQQF0aiIEIAM7Ab4BIAQgAzsBvAEgBCADOwHAASAEIAM7AcIBIAhBBGohCCAJQQRrIgkNAAsLIAcgCDYCtAELIAggEUkNAAsLIAcvAbwFRQRAIAdB0f4ANgIEIAxB0Qs2AhggBygCBCEIDBYLIAdBCjYCoAEgByAYNgKYASAHIBg2ArgBQQEgHCAVIBogHSAZEE4iDQRAIAdB0f4ANgIEIAxB2Ag2AhggBygCBCEIDBYLIAdBCTYCpAEgByAHKAK4ATYCnAFBAiAHIAcoAqwBQQF0akG8AWogBygCsAEgGiAfIBkQTiINBEAgB0HR/gA2AgQgDEGmCTYCGCAHKAIEIQgMFgsgB0HH/gA2AgRBACENCyAHQcj+ADYCBAsCQCAGQQ9JDQAgD0GEAkkNACAMIA82AhAgDCAQNgIMIAwgBjYCBCAMIAE2AgAgByAFNgKIASAHIAo2AoQBIAwgFkHogAEoAgARBwAgBygCiAEhBSAHKAKEASEKIAwoAgQhBiAMKAIAIQEgDCgCECEPIAwoAgwhECAHKAIEQb/+AEcNByAHQX82ApBHIAcoAgQhCAwUCyAHQQA2ApBHIAUhCSAGIQggASEEAkAgBygCmAEiEiAKQX8gBygCoAF0QX9zIhVxIg5BAnRqLQABIgsgBU0EQCAFIQMMAQsDQCAIRQ0PIAQtAAAgCXQhCyAEQQFqIQQgCEEBayEIIAlBCGoiAyEJIAMgEiAKIAtqIgogFXEiDkECdGotAAEiC0kNAAsLIBIgDkECdGoiAS8BAiETAkBBACABLQAAIhEgEUHwAXEbRQRAIAshBgwBCyAIIQYgBCEBAkAgAyIFIAsgEiAKQX8gCyARanRBf3MiFXEgC3YgE2oiEUECdGotAAEiDmpPBEAgAyEJDAELA0AgBkUNDyABLQAAIAV0IQ4gAUEBaiEBIAZBAWshBiAFQQhqIgkhBSALIBIgCiAOaiIKIBVxIAt2IBNqIhFBAnRqLQABIg5qIAlLDQALIAEhBCAGIQgLIBIgEUECdGoiAS0AACERIAEvAQIhEyAHIAs2ApBHIAsgDmohBiAJIAtrIQMgCiALdiEKIA4hCwsgByAGNgKQRyAHIBNB//8DcTYCjAEgAyALayEFIAogC3YhCiARRQRAIAdBzf4ANgIEDBALIBFBIHEEQCAHQb/+ADYCBCAHQX82ApBHDBALIBFBwABxBEAgB0HR/gA2AgQgDEHQDjYCGAwQCyAHQcn+ADYCBCAHIBFBD3EiAzYClAELAkAgA0UEQCAHKAKMASELIAQhASAIIQYMAQsgBSEJIAghBiAEIQsCQCADIAVNBEAgBCEBDAELA0AgBkUNDSAGQQFrIQYgCy0AACAJdCAKaiEKIAtBAWoiASELIAlBCGoiCSADSQ0ACwsgByAHKAKQRyADajYCkEcgByAHKAKMASAKQX8gA3RBf3NxaiILNgKMASAJIANrIQUgCiADdiEKCyAHQcr+ADYCBCAHIAs2ApRHCyAFIQkgBiEIIAEhBAJAIAcoApwBIhIgCkF/IAcoAqQBdEF/cyIVcSIOQQJ0ai0AASIDIAVNBEAgBSELDAELA0AgCEUNCiAELQAAIAl0IQMgBEEBaiEEIAhBAWshCCAJQQhqIgshCSALIBIgAyAKaiIKIBVxIg5BAnRqLQABIgNJDQALCyASIA5BAnRqIgEvAQIhEwJAIAEtAAAiEUHwAXEEQCAHKAKQRyEGIAMhCQwBCyAIIQYgBCEBAkAgCyIFIAMgEiAKQX8gAyARanRBf3MiFXEgA3YgE2oiEUECdGotAAEiCWpPBEAgCyEODAELA0AgBkUNCiABLQAAIAV0IQkgAUEBaiEBIAZBAWshBiAFQQhqIg4hBSADIBIgCSAKaiIKIBVxIAN2IBNqIhFBAnRqLQABIglqIA5LDQALIAEhBCAGIQgLIBIgEUECdGoiAS0AACERIAEvAQIhEyAHIAcoApBHIANqIgY2ApBHIA4gA2shCyAKIAN2IQoLIAcgBiAJajYCkEcgCyAJayEFIAogCXYhCiARQcAAcQRAIAdB0f4ANgIEIAxB7A42AhggBCEBIAghBiAHKAIEIQgMEgsgB0HL/gA2AgQgByARQQ9xIgM2ApQBIAcgE0H//wNxNgKQAQsCQCADRQRAIAQhASAIIQYMAQsgBSEJIAghBiAEIQsCQCADIAVNBEAgBCEBDAELA0AgBkUNCCAGQQFrIQYgCy0AACAJdCAKaiEKIAtBAWoiASELIAlBCGoiCSADSQ0ACwsgByAHKAKQRyADajYCkEcgByAHKAKQASAKQX8gA3RBf3NxajYCkAEgCSADayEFIAogA3YhCgsgB0HM/gA2AgQLIA9FDQACfyAHKAKQASIIIBYgD2siBEsEQAJAIAggBGsiCCAHKAIwTQ0AIAcoAoxHRQ0AIAdB0f4ANgIEIAxBuQw2AhggBygCBCEIDBILAn8CQAJ/IAcoAjQiBCAISQRAIAcoAjggBygCLCAIIARrIghragwBCyAHKAI4IAQgCGtqCyILIBAgDyAQaiAQa0EBaqwiISAPIAcoAowBIgQgCCAEIAhJGyIEIAQgD0sbIgitIiIgISAiVBsiIqciCWoiBEkgCyAQT3ENACALIBBNIAkgC2ogEEtxDQAgECALIAkQBxogBAwBCyAQIAsgCyAQayIEIARBH3UiBGogBHMiCRAHIAlqIQQgIiAJrSIkfSIjUEUEQCAJIAtqIQkDQAJAICMgJCAjICRUGyIiQiBUBEAgIiEhDAELICIiIUIgfSImQgWIQgF8QgODIiVQRQRAA0AgBCAJKQAANwAAIAQgCSkAGDcAGCAEIAkpABA3ABAgBCAJKQAINwAIICFCIH0hISAJQSBqIQkgBEEgaiEEICVCAX0iJUIAUg0ACwsgJkLgAFQNAANAIAQgCSkAADcAACAEIAkpABg3ABggBCAJKQAQNwAQIAQgCSkACDcACCAEIAkpADg3ADggBCAJKQAwNwAwIAQgCSkAKDcAKCAEIAkpACA3ACAgBCAJKQBYNwBYIAQgCSkAUDcAUCAEIAkpAEg3AEggBCAJKQBANwBAIAQgCSkAYDcAYCAEIAkpAGg3AGggBCAJKQBwNwBwIAQgCSkAeDcAeCAJQYABaiEJIARBgAFqIQQgIUKAAX0iIUIfVg0ACwsgIUIQWgRAIAQgCSkAADcAACAEIAkpAAg3AAggIUIQfSEhIAlBEGohCSAEQRBqIQQLICFCCFoEQCAEIAkpAAA3AAAgIUIIfSEhIAlBCGohCSAEQQhqIQQLICFCBFoEQCAEIAkoAAA2AAAgIUIEfSEhIAlBBGohCSAEQQRqIQQLICFCAloEQCAEIAkvAAA7AAAgIUICfSEhIAlBAmohCSAEQQJqIQQLICMgIn0hIyAhUEUEQCAEIAktAAA6AAAgCUEBaiEJIARBAWohBAsgI0IAUg0ACwsgBAsMAQsgECAIIA8gBygCjAEiBCAEIA9LGyIIIA9ByIABKAIAEQQACyEQIAcgBygCjAEgCGsiBDYCjAEgDyAIayEPIAQNAiAHQcj+ADYCBCAHKAIEIQgMDwsgDSEJCyAJIQQMDgsgBygCBCEIDAwLIAEgBmohASAFIAZBA3RqIQUMCgsgBCAIaiEBIAUgCEEDdGohBQwJCyAEIAhqIQEgCyAIQQN0aiEFDAgLIAEgBmohASAFIAZBA3RqIQUMBwsgBCAIaiEBIAUgCEEDdGohBQwGCyAEIAhqIQEgAyAIQQN0aiEFDAULIAEgBmohASAFIAZBA3RqIQUMBAsgB0HR/gA2AgQgDEG8CTYCGCAHKAIEIQgMBAsgBCEBIAghBiAHKAIEIQgMAwtBACEGIAQhBSANIQQMAwsCQAJAIAhFBEAgCiEJDAELIAcoAhRFBEAgCiEJDAELAkAgBUEfSw0AIAZFDQMgBUEIaiEJIAFBAWohBCAGQQFrIQsgAS0AACAFdCAKaiEKIAVBGE8EQCAEIQEgCyEGIAkhBQwBCyALRQRAIAQhAUEAIQYgCSEFIA0hBAwGCyAFQRBqIQsgAUECaiEEIAZBAmshAyABLQABIAl0IApqIQogBUEPSwRAIAQhASADIQYgCyEFDAELIANFBEAgBCEBQQAhBiALIQUgDSEEDAYLIAVBGGohCSABQQNqIQQgBkEDayEDIAEtAAIgC3QgCmohCiAFQQdLBEAgBCEBIAMhBiAJIQUMAQsgA0UEQCAEIQFBACEGIAkhBSANIQQMBgsgBUEgaiEFIAZBBGshBiABLQADIAl0IApqIQogAUEEaiEBC0EAIQkgCEEEcQRAIAogBygCIEcNAgtBACEFCyAHQdD+ADYCBEEBIQQgCSEKDAMLIAdB0f4ANgIEIAxBjQw2AhggBygCBCEIDAELC0EAIQYgDSEECyAMIA82AhAgDCAQNgIMIAwgBjYCBCAMIAE2AgAgByAFNgKIASAHIAo2AoQBAkAgBygCLA0AIA8gFkYNAiAHKAIEIgFB0P4ASw0CIAFBzv4ASQ0ACwJ/IBYgD2shCiAHKAIMQQRxIQkCQAJAAkAgDCgCHCIDKAI4Ig1FBEBBASEIIAMgAygCACIBKAIgIAEoAiggAygCmEdBASADKAIodGpBARAoIg02AjggDUUNAQsgAygCLCIGRQRAIANCADcDMCADQQEgAygCKHQiBjYCLAsgBiAKTQRAAkAgCQRAAkAgBiAKTw0AIAogBmshBSAQIAprIQEgDCgCHCIGKAIUBEAgBkFAayABIAVBAEHYgAEoAgARCAAMAQsgBiAGKAIcIAEgBUHAgAEoAgARAAAiATYCHCAMIAE2AjALIAMoAiwiDUUNASAQIA1rIQUgAygCOCEBIAwoAhwiBigCFARAIAZBQGsgASAFIA1B3IABKAIAEQgADAILIAYgBigCHCABIAUgDUHEgAEoAgARBAAiATYCHCAMIAE2AjAMAQsgDSAQIAZrIAYQBxoLIANBADYCNCADIAMoAiw2AjBBAAwECyAKIAYgAygCNCIFayIBIAEgCksbIQsgECAKayEGIAUgDWohBQJAIAkEQAJAIAtFDQAgDCgCHCIBKAIUBEAgAUFAayAFIAYgC0HcgAEoAgARCAAMAQsgASABKAIcIAUgBiALQcSAASgCABEEACIBNgIcIAwgATYCMAsgCiALayIFRQ0BIBAgBWshBiADKAI4IQEgDCgCHCINKAIUBEAgDUFAayABIAYgBUHcgAEoAgARCAAMBQsgDSANKAIcIAEgBiAFQcSAASgCABEEACIBNgIcIAwgATYCMAwECyAFIAYgCxAHGiAKIAtrIgUNAgtBACEIIANBACADKAI0IAtqIgUgBSADKAIsIgFGGzYCNCABIAMoAjAiAU0NACADIAEgC2o2AjALIAgMAgsgAygCOCAQIAVrIAUQBxoLIAMgBTYCNCADIAMoAiw2AjBBAAtFBEAgDCgCECEPIAwoAgQhFyAHKAKIAQwDCyAHQdL+ADYCBAtBfCEXDAILIAYhFyAFCyEFIAwgICAXayIBIAwoAghqNgIIIAwgFiAPayIGIAwoAhRqNgIUIAcgBygCICAGajYCICAMIAcoAghBAEdBBnQgBWogBygCBCIFQb/+AEZBB3RqQYACIAVBwv4ARkEIdCAFQcf+AEYbajYCLCAEIARBeyAEGyABIAZyGyEXCyAUQRBqJAAgFwshASACIAIpAwAgADUCIH03AwACQAJAAkACQCABQQVqDgcBAgICAgMAAgtBAQ8LIAAoAhQNAEEDDwsgACgCACIABEAgACABNgIEIABBDTYCAAtBAiEBCyABCwkAIABBAToADAtEAAJAIAJC/////w9YBEAgACgCFEUNAQsgACgCACIABEAgAEEANgIEIABBEjYCAAtBAA8LIAAgATYCECAAIAI+AhRBAQu5AQEEfyAAQRBqIQECfyAALQAEBEAgARCEAQwBC0F+IQMCQCABRQ0AIAEoAiBFDQAgASgCJCIERQ0AIAEoAhwiAkUNACACKAIAIAFHDQAgAigCBEG0/gBrQR9LDQAgAigCOCIDBEAgBCABKAIoIAMQHiABKAIkIQQgASgCHCECCyAEIAEoAiggAhAeQQAhAyABQQA2AhwLIAMLIgEEQCAAKAIAIgAEQCAAIAE2AgQgAEENNgIACwsgAUUL0gwBBn8gAEIANwIQIABCADcCHCAAQRBqIQICfyAALQAEBEAgACgCCCEBQesMLQAAQTFGBH8Cf0F+IQMCQCACRQ0AIAJBADYCGCACKAIgIgRFBEAgAkEANgIoIAJBJzYCIEEnIQQLIAIoAiRFBEAgAkEoNgIkC0EGIAEgAUF/RhsiBUEASA0AIAVBCUoNAEF8IQMgBCACKAIoQQFB0C4QKCIBRQ0AIAIgATYCHCABIAI2AgAgAUEPNgI0IAFCgICAgKAFNwIcIAFBADYCFCABQYCAAjYCMCABQf//ATYCOCABIAIoAiAgAigCKEGAgAJBAhAoNgJIIAEgAigCICACKAIoIAEoAjBBAhAoIgM2AkwgA0EAIAEoAjBBAXQQGSACKAIgIAIoAihBgIAEQQIQKCEDIAFBgIACNgLoLSABQQA2AkAgASADNgJQIAEgAigCICACKAIoQYCAAkEEECgiAzYCBCABIAEoAugtIgRBAnQ2AgwCQAJAIAEoAkhFDQAgASgCTEUNACABKAJQRQ0AIAMNAQsgAUGaBTYCICACQejAACgCADYCGCACEIQBGkF8DAILIAFBADYCjAEgASAFNgKIASABQgA3AyggASADIARqNgLsLSABIARBA2xBA2s2AvQtQX4hAwJAIAJFDQAgAigCIEUNACACKAIkRQ0AIAIoAhwiAUUNACABKAIAIAJHDQACQAJAIAEoAiAiBEE5aw45AQICAgICAgICAgICAQICAgECAgICAgICAgICAgICAgICAgECAgICAgICAgICAgECAgICAgICAgIBAAsgBEGaBUYNACAEQSpHDQELIAJBAjYCLCACQQA2AgggAkIANwIUIAFBADYCECABIAEoAgQ2AgggASgCFCIDQX9MBEAgAUEAIANrIgM2AhQLIAFBOUEqIANBAkYbNgIgIAIgA0ECRgR/IAFBoAFqQeSAASgCABEBAAVBAQs2AjAgAUF+NgIkIAFBADYCoC4gAUIANwOYLiABQYgXakGg0wA2AgAgASABQcwVajYCgBcgAUH8FmpBjNMANgIAIAEgAUHYE2o2AvQWIAFB8BZqQfjSADYCACABIAFB5AFqNgLoFiABEIgBQQAhAwsgAw0AIAIoAhwiAiACKAIwQQF0NgJEQQAhAyACKAJQQQBBgIAIEBkgAiACKAKIASIEQQxsIgFBtNgAai8BADYClAEgAiABQbDYAGovAQA2ApABIAIgAUGy2ABqLwEANgJ4IAIgAUG22ABqLwEANgJ0QfiAASgCACEFQeyAASgCACEGQYCBASgCACEBIAJCADcCbCACQgA3AmQgAkEANgI8IAJBADYChC4gAkIANwJUIAJBKSABIARBCUYiARs2AnwgAkEqIAYgARs2AoABIAJBKyAFIAEbNgKEAQsgAwsFQXoLDAELAn9BekHrDC0AAEExRw0AGkF+IAJFDQAaIAJBADYCGCACKAIgIgNFBEAgAkEANgIoIAJBJzYCIEEnIQMLIAIoAiRFBEAgAkEoNgIkC0F8IAMgAigCKEEBQaDHABAoIgRFDQAaIAIgBDYCHCAEQQA2AjggBCACNgIAIARBtP4ANgIEIARBzIABKAIAEQkANgKYR0F+IQMCQCACRQ0AIAIoAiBFDQAgAigCJCIFRQ0AIAIoAhwiAUUNACABKAIAIAJHDQAgASgCBEG0/gBrQR9LDQACQAJAIAEoAjgiBgRAIAEoAihBD0cNAQsgAUEPNgIoIAFBADYCDAwBCyAFIAIoAiggBhAeIAFBADYCOCACKAIgIQUgAUEPNgIoIAFBADYCDCAFRQ0BCyACKAIkRQ0AIAIoAhwiAUUNACABKAIAIAJHDQAgASgCBEG0/gBrQR9LDQBBACEDIAFBADYCNCABQgA3AiwgAUEANgIgIAJBADYCCCACQgA3AhQgASgCDCIFBEAgAiAFQQFxNgIwCyABQrT+ADcCBCABQgA3AoQBIAFBADYCJCABQoCAgoAQNwMYIAFCgICAgHA3AxAgAUKBgICAcDcCjEcgASABQfwKaiIFNgK4ASABIAU2ApwBIAEgBTYCmAELQQAgA0UNABogAigCJCACKAIoIAQQHiACQQA2AhwgAwsLIgIEQCAAKAIAIgAEQCAAIAI2AgQgAEENNgIACwsgAkULKQEBfyAALQAERQRAQQAPC0ECIQEgACgCCCIAQQNOBH8gAEEHSgVBAgsLBgAgABAGC2MAQcgAEAkiAEUEQEGEhAEoAgAhASACBEAgAiABNgIEIAJBATYCAAsgAA8LIABBADoADCAAQQE6AAQgACACNgIAIABBADYCOCAAQgA3AzAgACABQQkgAUEBa0EJSRs2AgggAAukCgIIfwF+QfCAAUH0gAEgACgCdEGBCEkbIQYCQANAAkACfwJAIAAoAjxBhQJLDQAgABAvAkAgACgCPCICQYUCSw0AIAENAEEADwsgAkUNAiACQQRPDQBBAAwBCyAAIAAoAmggACgChAERAgALIQMgACAAKAJsOwFgQQIhAgJAIAA1AmggA619IgpCAVMNACAKIAAoAjBBhgJrrVUNACAAKAJwIAAoAnhPDQAgA0UNACAAIAMgBigCABECACICQQVLDQBBAiACIAAoAowBQQFGGyECCwJAIAAoAnAiA0EDSQ0AIAIgA0sNACAAIAAoAvAtIgJBAWo2AvAtIAAoAjwhBCACIAAoAuwtaiAAKAJoIgcgAC8BYEF/c2oiAjoAACAAIAAoAvAtIgVBAWo2AvAtIAUgACgC7C1qIAJBCHY6AAAgACAAKALwLSIFQQFqNgLwLSAFIAAoAuwtaiADQQNrOgAAIAAgACgCgC5BAWo2AoAuIANB/c4Aai0AAEECdCAAakHoCWoiAyADLwEAQQFqOwEAIAAgAkEBayICIAJBB3ZBgAJqIAJBgAJJG0GAywBqLQAAQQJ0akHYE2oiAiACLwEAQQFqOwEAIAAgACgCcCIFQQFrIgM2AnAgACAAKAI8IANrNgI8IAAoAvQtIQggACgC8C0hCSAEIAdqQQNrIgQgACgCaCICSwRAIAAgAkEBaiAEIAJrIgIgBUECayIEIAIgBEkbIAAoAoABEQUAIAAoAmghAgsgAEEANgJkIABBADYCcCAAIAIgA2oiBDYCaCAIIAlHDQJBACECIAAgACgCWCIDQQBOBH8gACgCSCADagVBAAsgBCADa0EAEA8gACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQDQIMAwsgACgCZARAIAAoAmggACgCSGpBAWstAAAhAyAAIAAoAvAtIgRBAWo2AvAtIAQgACgC7C1qQQA6AAAgACAAKALwLSIEQQFqNgLwLSAEIAAoAuwtakEAOgAAIAAgACgC8C0iBEEBajYC8C0gBCAAKALsLWogAzoAACAAIANBAnRqIgMgAy8B5AFBAWo7AeQBIAAoAvAtIAAoAvQtRgRAIAAgACgCWCIDQQBOBH8gACgCSCADagVBAAsgACgCaCADa0EAEA8gACAAKAJoNgJYIAAoAgAQCgsgACACNgJwIAAgACgCaEEBajYCaCAAIAAoAjxBAWs2AjwgACgCACgCEA0CQQAPBSAAQQE2AmQgACACNgJwIAAgACgCaEEBajYCaCAAIAAoAjxBAWs2AjwMAgsACwsgACgCZARAIAAoAmggACgCSGpBAWstAAAhAiAAIAAoAvAtIgNBAWo2AvAtIAMgACgC7C1qQQA6AAAgACAAKALwLSIDQQFqNgLwLSADIAAoAuwtakEAOgAAIAAgACgC8C0iA0EBajYC8C0gAyAAKALsLWogAjoAACAAIAJBAnRqIgIgAi8B5AFBAWo7AeQBIAAoAvAtIAAoAvQtRhogAEEANgJkCyAAIAAoAmgiA0ECIANBAkkbNgKELiABQQRGBEAgACAAKAJYIgFBAE4EfyAAKAJIIAFqBUEACyADIAFrQQEQDyAAIAAoAmg2AlggACgCABAKQQNBAiAAKAIAKAIQGw8LIAAoAvAtBEBBACECIAAgACgCWCIBQQBOBH8gACgCSCABagVBAAsgAyABa0EAEA8gACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQRQ0BC0EBIQILIAIL2BACEH8BfiAAKAKIAUEFSCEOA0ACQAJ/AkACQAJAAn8CQAJAIAAoAjxBhQJNBEAgABAvIAAoAjwiA0GFAksNASABDQFBAA8LIA4NASAIIQMgBSEHIAohDSAGQf//A3FFDQEMAwsgA0UNA0EAIANBBEkNARoLIAAgACgCaEH4gAEoAgARAgALIQZBASECQQAhDSAAKAJoIgOtIAatfSISQgFTDQIgEiAAKAIwQYYCa61VDQIgBkUNAiAAIAZB8IABKAIAEQIAIgZBASAGQfz/A3EbQQEgACgCbCINQf//A3EgA0H//wNxSRshBiADIQcLAkAgACgCPCIEIAZB//8DcSICQQRqTQ0AIAZB//8DcUEDTQRAQQEgBkEBa0H//wNxIglFDQQaIANB//8DcSIEIAdBAWpB//8DcSIDSw0BIAAgAyAJIAQgA2tBAWogAyAJaiAESxtB7IABKAIAEQUADAELAkAgACgCeEEEdCACSQ0AIARBBEkNACAGQQFrQf//A3EiDCAHQQFqQf//A3EiBGohCSAEIANB//8DcSIDTwRAQeyAASgCACELIAMgCUkEQCAAIAQgDCALEQUADAMLIAAgBCADIARrQQFqIAsRBQAMAgsgAyAJTw0BIAAgAyAJIANrQeyAASgCABEFAAwBCyAGIAdqQf//A3EiA0UNACAAIANBAWtB+IABKAIAEQIAGgsgBgwCCyAAIAAoAmgiBUECIAVBAkkbNgKELiABQQRGBEBBACEDIAAgACgCWCIBQQBOBH8gACgCSCABagVBAAsgBSABa0EBEA8gACAAKAJoNgJYIAAoAgAQCkEDQQIgACgCACgCEBsPCyAAKALwLQRAQQAhAkEAIQMgACAAKAJYIgFBAE4EfyAAKAJIIAFqBUEACyAFIAFrQQAQDyAAIAAoAmg2AlggACgCABAKIAAoAgAoAhBFDQMLQQEhAgwCCyADIQdBAQshBEEAIQYCQCAODQAgACgCPEGHAkkNACACIAdB//8DcSIQaiIDIAAoAkRBhgJrTw0AIAAgAzYCaEEAIQogACADQfiAASgCABECACEFAn8CQCAAKAJoIgitIAWtfSISQgFTDQAgEiAAKAIwQYYCa61VDQAgBUUNACAAIAVB8IABKAIAEQIAIQYgAC8BbCIKIAhB//8DcSIFTw0AIAZB//8DcSIDQQRJDQAgCCAEQf//A3FBAkkNARogCCACIApBAWpLDQEaIAggAiAFQQFqSw0BGiAIIAAoAkgiCSACa0EBaiICIApqLQAAIAIgBWotAABHDQEaIAggCUEBayICIApqIgwtAAAgAiAFaiIPLQAARw0BGiAIIAUgCCAAKAIwQYYCayICa0H//wNxQQAgAiAFSRsiEU0NARogCCADQf8BSw0BGiAGIQUgCCECIAQhAyAIIAoiCUECSQ0BGgNAAkAgA0EBayEDIAVBAWohCyAJQQFrIQkgAkEBayECIAxBAWsiDC0AACAPQQFrIg8tAABHDQAgA0H//wNxRQ0AIBEgAkH//wNxTw0AIAVB//8DcUH+AUsNACALIQUgCUH//wNxQQFLDQELCyAIIANB//8DcUEBSw0BGiAIIAtB//8DcUECRg0BGiAIQQFqIQggAyEEIAshBiAJIQogAgwBC0EBIQYgCAshBSAAIBA2AmgLAn8gBEH//wNxIgNBA00EQCAEQf//A3EiA0UNAyAAKAJIIAdB//8DcWotAAAhBCAAIAAoAvAtIgJBAWo2AvAtIAIgACgC7C1qQQA6AAAgACAAKALwLSICQQFqNgLwLSACIAAoAuwtakEAOgAAIAAgACgC8C0iAkEBajYC8C0gAiAAKALsLWogBDoAACAAIARBAnRqIgRB5AFqIAQvAeQBQQFqOwEAIAAgACgCPEEBazYCPCAAKALwLSICIAAoAvQtRiIEIANBAUYNARogACgCSCAHQQFqQf//A3FqLQAAIQkgACACQQFqNgLwLSAAKALsLSACakEAOgAAIAAgACgC8C0iAkEBajYC8C0gAiAAKALsLWpBADoAACAAIAAoAvAtIgJBAWo2AvAtIAIgACgC7C1qIAk6AAAgACAJQQJ0aiICQeQBaiACLwHkAUEBajsBACAAIAAoAjxBAWs2AjwgBCAAKALwLSICIAAoAvQtRmoiBCADQQJGDQEaIAAoAkggB0ECakH//wNxai0AACEHIAAgAkEBajYC8C0gACgC7C0gAmpBADoAACAAIAAoAvAtIgJBAWo2AvAtIAIgACgC7C1qQQA6AAAgACAAKALwLSICQQFqNgLwLSACIAAoAuwtaiAHOgAAIAAgB0ECdGoiB0HkAWogBy8B5AFBAWo7AQAgACAAKAI8QQFrNgI8IAQgACgC8C0gACgC9C1GagwBCyAAIAAoAvAtIgJBAWo2AvAtIAIgACgC7C1qIAdB//8DcSANQf//A3FrIgc6AAAgACAAKALwLSICQQFqNgLwLSACIAAoAuwtaiAHQQh2OgAAIAAgACgC8C0iAkEBajYC8C0gAiAAKALsLWogBEEDazoAACAAIAAoAoAuQQFqNgKALiADQf3OAGotAABBAnQgAGpB6AlqIgQgBC8BAEEBajsBACAAIAdBAWsiBCAEQQd2QYACaiAEQYACSRtBgMsAai0AAEECdGpB2BNqIgQgBC8BAEEBajsBACAAIAAoAjwgA2s2AjwgACgC8C0gACgC9C1GCyEEIAAgACgCaCADaiIHNgJoIARFDQFBACECQQAhBCAAIAAoAlgiA0EATgR/IAAoAkggA2oFQQALIAcgA2tBABAPIAAgACgCaDYCWCAAKAIAEAogACgCACgCEA0BCwsgAgu0BwIEfwF+AkADQAJAAkACQAJAIAAoAjxBhQJNBEAgABAvAkAgACgCPCICQYUCSw0AIAENAEEADwsgAkUNBCACQQRJDQELIAAgACgCaEH4gAEoAgARAgAhAiAANQJoIAKtfSIGQgFTDQAgBiAAKAIwQYYCa61VDQAgAkUNACAAIAJB8IABKAIAEQIAIgJBBEkNACAAIAAoAvAtIgNBAWo2AvAtIAMgACgC7C1qIAAoAmggACgCbGsiAzoAACAAIAAoAvAtIgRBAWo2AvAtIAQgACgC7C1qIANBCHY6AAAgACAAKALwLSIEQQFqNgLwLSAEIAAoAuwtaiACQQNrOgAAIAAgACgCgC5BAWo2AoAuIAJB/c4Aai0AAEECdCAAakHoCWoiBCAELwEAQQFqOwEAIAAgA0EBayIDIANBB3ZBgAJqIANBgAJJG0GAywBqLQAAQQJ0akHYE2oiAyADLwEAQQFqOwEAIAAgACgCPCACayIFNgI8IAAoAvQtIQMgACgC8C0hBCAAKAJ4IAJPQQAgBUEDSxsNASAAIAAoAmggAmoiAjYCaCAAIAJBAWtB+IABKAIAEQIAGiADIARHDQQMAgsgACgCSCAAKAJoai0AACECIAAgACgC8C0iA0EBajYC8C0gAyAAKALsLWpBADoAACAAIAAoAvAtIgNBAWo2AvAtIAMgACgC7C1qQQA6AAAgACAAKALwLSIDQQFqNgLwLSADIAAoAuwtaiACOgAAIAAgAkECdGoiAkHkAWogAi8B5AFBAWo7AQAgACAAKAI8QQFrNgI8IAAgACgCaEEBajYCaCAAKALwLSAAKAL0LUcNAwwBCyAAIAAoAmhBAWoiBTYCaCAAIAUgAkEBayICQeyAASgCABEFACAAIAAoAmggAmo2AmggAyAERw0CC0EAIQNBACECIAAgACgCWCIEQQBOBH8gACgCSCAEagVBAAsgACgCaCAEa0EAEA8gACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQDQEMAgsLIAAgACgCaCIEQQIgBEECSRs2AoQuIAFBBEYEQEEAIQIgACAAKAJYIgFBAE4EfyAAKAJIIAFqBUEACyAEIAFrQQEQDyAAIAAoAmg2AlggACgCABAKQQNBAiAAKAIAKAIQGw8LIAAoAvAtBEBBACEDQQAhAiAAIAAoAlgiAUEATgR/IAAoAkggAWoFQQALIAQgAWtBABAPIAAgACgCaDYCWCAAKAIAEAogACgCACgCEEUNAQtBASEDCyADC80JAgl/An4gAUEERiEGIAAoAiwhAgJAAkACQCABQQRGBEAgAkECRg0CIAIEQCAAQQAQUCAAQQA2AiwgACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQRQ0ECyAAIAYQTyAAQQI2AiwMAQsgAg0BIAAoAjxFDQEgACAGEE8gAEEBNgIsCyAAIAAoAmg2AlgLQQJBASABQQRGGyEKA0ACQCAAKAIMIAAoAhBBCGpLDQAgACgCABAKIAAoAgAiAigCEA0AQQAhAyABQQRHDQIgAigCBA0CIAAoAqAuDQIgACgCLEVBAXQPCwJAAkAgACgCPEGFAk0EQCAAEC8CQCAAKAI8IgNBhQJLDQAgAQ0AQQAPCyADRQ0CIAAoAiwEfyADBSAAIAYQTyAAIAo2AiwgACAAKAJoNgJYIAAoAjwLQQRJDQELIAAgACgCaEH4gAEoAgARAgAhBCAAKAJoIgKtIAStfSILQgFTDQAgCyAAKAIwQYYCa61VDQAgAiAAKAJIIgJqIgMvAAAgAiAEaiICLwAARw0AIANBAmogAkECakHQgAEoAgARAgBBAmoiA0EESQ0AIAAoAjwiAiADIAIgA0kbIgJBggIgAkGCAkkbIgdB/c4Aai0AACICQQJ0IgRBhMkAajMBACEMIARBhskAai8BACEDIAJBCGtBE00EQCAHQQNrIARBgNEAaigCAGutIAOthiAMhCEMIARBsNYAaigCACADaiEDCyAAKAKgLiEFIAMgC6dBAWsiCCAIQQd2QYACaiAIQYACSRtBgMsAai0AACICQQJ0IglBgsoAai8BAGohBCAJQYDKAGozAQAgA62GIAyEIQsgACkDmC4hDAJAIAUgAkEESQR/IAQFIAggCUGA0gBqKAIAa60gBK2GIAuEIQsgCUGw1wBqKAIAIARqCyICaiIDQT9NBEAgCyAFrYYgDIQhCwwBCyAFQcAARgRAIAAoAgQgACgCEGogDDcAACAAIAAoAhBBCGo2AhAgAiEDDAELIAAoAgQgACgCEGogCyAFrYYgDIQ3AAAgACAAKAIQQQhqNgIQIANBQGohAyALQcAAIAVrrYghCwsgACALNwOYLiAAIAM2AqAuIAAgACgCPCAHazYCPCAAIAAoAmggB2o2AmgMAgsgACgCSCAAKAJoai0AAEECdCICQYDBAGozAQAhCyAAKQOYLiEMAkAgACgCoC4iBCACQYLBAGovAQAiAmoiA0E/TQRAIAsgBK2GIAyEIQsMAQsgBEHAAEYEQCAAKAIEIAAoAhBqIAw3AAAgACAAKAIQQQhqNgIQIAIhAwwBCyAAKAIEIAAoAhBqIAsgBK2GIAyENwAAIAAgACgCEEEIajYCECADQUBqIQMgC0HAACAEa62IIQsLIAAgCzcDmC4gACADNgKgLiAAIAAoAmhBAWo2AmggACAAKAI8QQFrNgI8DAELCyAAIAAoAmgiAkECIAJBAkkbNgKELiAAKAIsIQIgAUEERgRAAkAgAkUNACAAQQEQUCAAQQA2AiwgACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQDQBBAg8LQQMPCyACBEBBACEDIABBABBQIABBADYCLCAAIAAoAmg2AlggACgCABAKIAAoAgAoAhBFDQELQQEhAwsgAwucAQEFfyACQQFOBEAgAiAAKAJIIAFqIgNqQQJqIQQgA0ECaiECIAAoAlQhAyAAKAJQIQUDQCAAIAItAAAgA0EFdEHg/wFxcyIDNgJUIAUgA0EBdGoiBi8BACIHIAFB//8DcUcEQCAAKAJMIAEgACgCOHFB//8DcUEBdGogBzsBACAGIAE7AQALIAFBAWohASACQQFqIgIgBEkNAAsLC1sBAn8gACAAKAJIIAFqLQACIAAoAlRBBXRB4P8BcXMiAjYCVCABIAAoAlAgAkEBdGoiAy8BACICRwRAIAAoAkwgACgCOCABcUEBdGogAjsBACADIAE7AQALIAILEwAgAUEFdEHg/wFxIAJB/wFxcwsGACABEAYLLwAjAEEQayIAJAAgAEEMaiABIAJsEIwBIQEgACgCDCECIABBEGokAEEAIAIgARsLjAoCAX4CfyMAQfAAayIGJAACQAJAAkACQAJAAkACQAJAIAQODwABBwIEBQYGBgYGBgYGAwYLQn8hBQJAIAAgBkHkAGpCDBARIgNCf1cEQCABBEAgASAAKAIMNgIAIAEgACgCEDYCBAsMAQsCQCADQgxSBEAgAQRAIAFBADYCBCABQRE2AgALDAELIAEoAhQhBEEAIQJCASEFA0AgBkHkAGogAmoiAiACLQAAIARB/f8DcSICQQJyIAJBA3NsQQh2cyICOgAAIAYgAjoAKCABAn8gASgCDEF/cyECQQAgBkEoaiIERQ0AGiACIARBAUHUgAEoAgARAAALQX9zIgI2AgwgASABKAIQIAJB/wFxakGFiKLAAGxBAWoiAjYCECAGIAJBGHY6ACggAQJ/IAEoAhRBf3MhAkEAIAZBKGoiBEUNABogAiAEQQFB1IABKAIAEQAAC0F/cyIENgIUIAVCDFIEQCAFpyECIAVCAXwhBQwBCwtCACEFIAAgBkEoahAhQQBIDQEgBigCUCEAIwBBEGsiAiQAIAIgADYCDCAGAn8gAkEMahCNASIARQRAIAZBITsBJEEADAELAn8gACgCFCIEQdAATgRAIARBCXQMAQsgAEHQADYCFEGAwAILIQQgBiAAKAIMIAQgACgCEEEFdGpqQaDAAWo7ASQgACgCBEEFdCAAKAIIQQt0aiAAKAIAQQF2ags7ASYgAkEQaiQAIAYtAG8iACAGLQBXRg0BIAYtACcgAEYNASABBEAgAUEANgIEIAFBGzYCAAsLQn8hBQsgBkHwAGokACAFDwtCfyEFIAAgAiADEBEiA0J/VwRAIAEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwGCyMAQRBrIgAkAAJAIANQDQAgASgCFCEEIAJFBEBCASEFA0AgACACIAdqLQAAIARB/f8DcSIEQQJyIARBA3NsQQh2czoADyABAn8gASgCDEF/cyEEQQAgAEEPaiIHRQ0AGiAEIAdBAUHUgAEoAgARAAALQX9zIgQ2AgwgASABKAIQIARB/wFxakGFiKLAAGxBAWoiBDYCECAAIARBGHY6AA8gAQJ/IAEoAhRBf3MhBEEAIABBD2oiB0UNABogBCAHQQFB1IABKAIAEQAAC0F/cyIENgIUIAMgBVENAiAFpyEHIAVCAXwhBQwACwALQgEhBQNAIAAgAiAHai0AACAEQf3/A3EiBEECciAEQQNzbEEIdnMiBDoADyACIAdqIAQ6AAAgAQJ/IAEoAgxBf3MhBEEAIABBD2oiB0UNABogBCAHQQFB1IABKAIAEQAAC0F/cyIENgIMIAEgASgCECAEQf8BcWpBhYiiwABsQQFqIgQ2AhAgACAEQRh2OgAPIAECfyABKAIUQX9zIQRBACAAQQ9qIgdFDQAaIAQgB0EBQdSAASgCABEAAAtBf3MiBDYCFCADIAVRDQEgBachByAFQgF8IQUMAAsACyAAQRBqJAAgAyEFDAULIAJBADsBMiACIAIpAwAiA0KAAYQ3AwAgA0IIg1ANBCACIAIpAyBCDH03AyAMBAsgBkKFgICAcDcDECAGQoOAgIDAADcDCCAGQoGAgIAgNwMAQQAgBhAkIQUMAwsgA0IIWgR+IAIgASgCADYCACACIAEoAgQ2AgRCCAVCfwshBQwCCyABEAYMAQsgAQRAIAFBADYCBCABQRI2AgALQn8hBQsgBkHwAGokACAFC60DAgJ/An4jAEEQayIGJAACQAJAAkAgBEUNACABRQ0AIAJBAUYNAQtBACEDIABBCGoiAARAIABBADYCBCAAQRI2AgALDAELIANBAXEEQEEAIQMgAEEIaiIABEAgAEEANgIEIABBGDYCAAsMAQtBGBAJIgVFBEBBACEDIABBCGoiAARAIABBADYCBCAAQQ42AgALDAELIAVBADYCCCAFQgA3AgAgBUGQ8dmiAzYCFCAFQvis0ZGR8dmiIzcCDAJAIAQQIiICRQ0AIAKtIQhBACEDQYfTru5+IQJCASEHA0AgBiADIARqLQAAOgAPIAUgBkEPaiIDBH8gAiADQQFB1IABKAIAEQAABUEAC0F/cyICNgIMIAUgBSgCECACQf8BcWpBhYiiwABsQQFqIgI2AhAgBiACQRh2OgAPIAUCfyAFKAIUQX9zIQJBACAGQQ9qIgNFDQAaIAIgA0EBQdSAASgCABEAAAtBf3M2AhQgByAIUQ0BIAUoAgxBf3MhAiAHpyEDIAdCAXwhBwwACwALIAAgAUElIAUQQiIDDQAgBRAGQQAhAwsgBkEQaiQAIAMLnRoCBn4FfyMAQdAAayILJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADDhQFBhULAwQJDgACCBAKDw0HEQERDBELAkBByAAQCSIBBEAgAUIANwMAIAFCADcDMCABQQA2AiggAUIANwMgIAFCADcDGCABQgA3AxAgAUIANwMIIAFCADcDOCABQQgQCSIDNgIEIAMNASABEAYgAARAIABBADYCBCAAQQ42AgALCyAAQQA2AhQMFAsgA0IANwMAIAAgATYCFCABQUBrQgA3AwAgAUIANwM4DBQLAkACQCACUARAQcgAEAkiA0UNFCADQgA3AwAgA0IANwMwIANBADYCKCADQgA3AyAgA0IANwMYIANCADcDECADQgA3AwggA0IANwM4IANBCBAJIgE2AgQgAQ0BIAMQBiAABEAgAEEANgIEIABBDjYCAAsMFAsgAiAAKAIQIgEpAzBWBEAgAARAIABBADYCBCAAQRI2AgALDBQLIAEoAigEQCAABEAgAEEANgIEIABBHTYCAAsMFAsgASgCBCEDAkAgASkDCCIGQgF9IgdQDQADQAJAIAIgAyAHIAR9QgGIIAR8IgWnQQN0aikDAFQEQCAFQgF9IQcMAQsgBSAGUQRAIAYhBQwDCyADIAVCAXwiBKdBA3RqKQMAIAJWDQILIAQhBSAEIAdUDQALCwJAIAIgAyAFpyIKQQN0aikDAH0iBFBFBEAgASgCACIDIApBBHRqKQMIIQcMAQsgASgCACIDIAVCAX0iBadBBHRqKQMIIgchBAsgAiAHIAR9VARAIAAEQCAAQQA2AgQgAEEcNgIACwwUCyADIAVCAXwiBUEAIAAQiQEiA0UNEyADKAIAIAMoAggiCkEEdGpBCGsgBDcDACADKAIEIApBA3RqIAI3AwAgAyACNwMwIAMgASkDGCIGIAMpAwgiBEIBfSIHIAYgB1QbNwMYIAEgAzYCKCADIAE2AiggASAENwMgIAMgBTcDIAwBCyABQgA3AwALIAAgAzYCFCADIAQ3A0AgAyACNwM4QgAhBAwTCyAAKAIQIgEEQAJAIAEoAigiA0UEQCABKQMYIQIMAQsgA0EANgIoIAEoAihCADcDICABIAEpAxgiAiABKQMgIgUgAiAFVhsiAjcDGAsgASkDCCACVgRAA0AgASgCACACp0EEdGooAgAQBiACQgF8IgIgASkDCFQNAAsLIAEoAgAQBiABKAIEEAYgARAGCyAAKAIUIQEgAEEANgIUIAAgATYCEAwSCyACQghaBH4gASAAKAIANgIAIAEgACgCBDYCBEIIBUJ/CyEEDBELIAAoAhAiAQRAAkAgASgCKCIDRQRAIAEpAxghAgwBCyADQQA2AiggASgCKEIANwMgIAEgASkDGCICIAEpAyAiBSACIAVWGyICNwMYCyABKQMIIAJWBEADQCABKAIAIAKnQQR0aigCABAGIAJCAXwiAiABKQMIVA0ACwsgASgCABAGIAEoAgQQBiABEAYLIAAoAhQiAQRAAkAgASgCKCIDRQRAIAEpAxghAgwBCyADQQA2AiggASgCKEIANwMgIAEgASkDGCICIAEpAyAiBSACIAVWGyICNwMYCyABKQMIIAJWBEADQCABKAIAIAKnQQR0aigCABAGIAJCAXwiAiABKQMIVA0ACwsgASgCABAGIAEoAgQQBiABEAYLIAAQBgwQCyAAKAIQIgBCADcDOCAAQUBrQgA3AwAMDwsgAkJ/VwRAIAAEQCAAQQA2AgQgAEESNgIACwwOCyACIAAoAhAiAykDMCADKQM4IgZ9IgUgAiAFVBsiBVANDiABIAMpA0AiB6ciAEEEdCIBIAMoAgBqIgooAgAgBiADKAIEIABBA3RqKQMAfSICp2ogBSAKKQMIIAJ9IgYgBSAGVBsiBKcQByEKIAcgBCADKAIAIgAgAWopAwggAn1RrXwhAiAFIAZWBEADQCAKIASnaiAAIAKnQQR0IgFqIgAoAgAgBSAEfSIGIAApAwgiByAGIAdUGyIGpxAHGiACIAYgAygCACIAIAFqKQMIUa18IQIgBSAEIAZ8IgRWDQALCyADIAI3A0AgAyADKQM4IAR8NwM4DA4LQn8hBEHIABAJIgNFDQ0gA0IANwMAIANCADcDMCADQQA2AiggA0IANwMgIANCADcDGCADQgA3AxAgA0IANwMIIANCADcDOCADQQgQCSIBNgIEIAFFBEAgAxAGIAAEQCAAQQA2AgQgAEEONgIACwwOCyABQgA3AwAgACgCECIBBEACQCABKAIoIgpFBEAgASkDGCEEDAELIApBADYCKCABKAIoQgA3AyAgASABKQMYIgIgASkDICIFIAIgBVYbIgQ3AxgLIAEpAwggBFYEQANAIAEoAgAgBKdBBHRqKAIAEAYgBEIBfCIEIAEpAwhUDQALCyABKAIAEAYgASgCBBAGIAEQBgsgACADNgIQQgAhBAwNCyAAKAIUIgEEQAJAIAEoAigiA0UEQCABKQMYIQIMAQsgA0EANgIoIAEoAihCADcDICABIAEpAxgiAiABKQMgIgUgAiAFVhsiAjcDGAsgASkDCCACVgRAA0AgASgCACACp0EEdGooAgAQBiACQgF8IgIgASkDCFQNAAsLIAEoAgAQBiABKAIEEAYgARAGCyAAQQA2AhQMDAsgACgCECIDKQM4IAMpAzAgASACIAAQRCIHQgBTDQogAyAHNwM4AkAgAykDCCIGQgF9IgJQDQAgAygCBCEAA0ACQCAHIAAgAiAEfUIBiCAEfCIFp0EDdGopAwBUBEAgBUIBfSECDAELIAUgBlEEQCAGIQUMAwsgACAFQgF8IgSnQQN0aikDACAHVg0CCyAEIQUgAiAEVg0ACwsgAyAFNwNAQgAhBAwLCyAAKAIUIgMpAzggAykDMCABIAIgABBEIgdCAFMNCSADIAc3AzgCQCADKQMIIgZCAX0iAlANACADKAIEIQADQAJAIAcgACACIAR9QgGIIAR8IgWnQQN0aikDAFQEQCAFQgF9IQIMAQsgBSAGUQRAIAYhBQwDCyAAIAVCAXwiBKdBA3RqKQMAIAdWDQILIAQhBSACIARWDQALCyADIAU3A0BCACEEDAoLIAJCN1gEQCAABEAgAEEANgIEIABBEjYCAAsMCQsgARAqIAEgACgCDDYCKCAAKAIQKQMwIQIgAUEANgIwIAEgAjcDICABIAI3AxggAULcATcDAEI4IQQMCQsgACABKAIANgIMDAgLIAtBQGtBfzYCACALQouAgICwAjcDOCALQoyAgIDQATcDMCALQo+AgICgATcDKCALQpGAgICQATcDICALQoeAgICAATcDGCALQoWAgIDgADcDECALQoOAgIDAADcDCCALQoGAgIAgNwMAQQAgCxAkIQQMBwsgACgCECkDOCIEQn9VDQYgAARAIABBPTYCBCAAQR42AgALDAULIAAoAhQpAzgiBEJ/VQ0FIAAEQCAAQT02AgQgAEEeNgIACwwEC0J/IQQgAkJ/VwRAIAAEQCAAQQA2AgQgAEESNgIACwwFCyACIAAoAhQiAykDOCACfCIFQv//A3wiBFYEQCAABEAgAEEANgIEIABBEjYCAAsMBAsCQCAFIAMoAgQiCiADKQMIIganQQN0aikDACIHWA0AAkAgBCAHfUIQiCAGfCIIIAMpAxAiCVgNAEIQIAkgCVAbIQUDQCAFIgRCAYYhBSAEIAhUDQALIAQgCVQNACADKAIAIASnIgpBBHQQNCIMRQ0DIAMgDDYCACADKAIEIApBA3RBCGoQNCIKRQ0DIAMgBDcDECADIAo2AgQgAykDCCEGCyAGIAhaDQAgAygCACEMA0AgDCAGp0EEdGoiDUGAgAQQCSIONgIAIA5FBEAgAARAIABBADYCBCAAQQ42AgALDAYLIA1CgIAENwMIIAMgBkIBfCIFNwMIIAogBadBA3RqIAdCgIAEfCIHNwMAIAMpAwgiBiAIVA0ACwsgAykDQCEFIAMpAzghBwJAIAJQBEBCACEEDAELIAWnIgBBBHQiDCADKAIAaiINKAIAIAcgCiAAQQN0aikDAH0iBqdqIAEgAiANKQMIIAZ9IgcgAiAHVBsiBKcQBxogBSAEIAMoAgAiACAMaikDCCAGfVGtfCEFIAIgB1YEQANAIAAgBadBBHQiCmoiACgCACABIASnaiACIAR9IgYgACkDCCIHIAYgB1QbIganEAcaIAUgBiADKAIAIgAgCmopAwhRrXwhBSAEIAZ8IgQgAlQNAAsLIAMpAzghBwsgAyAFNwNAIAMgBCAHfCICNwM4IAIgAykDMFgNBCADIAI3AzAMBAsgAARAIABBADYCBCAAQRw2AgALDAILIAAEQCAAQQA2AgQgAEEONgIACyAABEAgAEEANgIEIABBDjYCAAsMAQsgAEEANgIUC0J/IQQLIAtB0ABqJAAgBAtIAQF/IABCADcCBCAAIAE2AgACQCABQQBIDQBBsBMoAgAgAUwNACABQQJ0QcATaigCAEEBRw0AQYSEASgCACECCyAAIAI2AgQLDgAgAkGx893xeWxBEHYLvgEAIwBBEGsiACQAIABBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAQRBqJAAgAkGx893xeWxBEHYLuQEBAX8jAEEQayIBJAAgAUEAOgAIQYCBAUECNgIAQfyAAUEDNgIAQfiAAUEENgIAQfSAAUEFNgIAQfCAAUEGNgIAQeyAAUEHNgIAQeiAAUEINgIAQeSAAUEJNgIAQeCAAUEKNgIAQdyAAUELNgIAQdiAAUEMNgIAQdSAAUENNgIAQdCAAUEONgIAQcyAAUEPNgIAQciAAUEQNgIAQcSAAUERNgIAQcCAAUESNgIAIAAQjgEgAUEQaiQAC78BAQF/IwBBEGsiAiQAIAJBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAIAEQkAEhACACQRBqJAAgAAu+AQEBfyMAQRBrIgIkACACQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgACABEFohACACQRBqJAAgAAu+AQEBfyMAQRBrIgIkACACQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgACABEFshACACQRBqJAAgAAu9AQEBfyMAQRBrIgMkACADQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgACABIAIQjwEgA0EQaiQAC4UBAgR/AX4jAEEQayIBJAACQCAAKQMwUARADAELA0ACQCAAIAVBACABQQ9qIAFBCGoQZiIEQX9GDQAgAS0AD0EDRw0AIAIgASgCCEGAgICAf3FBgICAgHpGaiECC0F/IQMgBEF/Rg0BIAIhAyAFQgF8IgUgACkDMFQNAAsLIAFBEGokACADCwuMdSUAQYAIC7ELaW5zdWZmaWNpZW50IG1lbW9yeQBuZWVkIGRpY3Rpb25hcnkALSsgICAwWDB4AFppcCBhcmNoaXZlIGluY29uc2lzdGVudABJbnZhbGlkIGFyZ3VtZW50AGludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldABpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQAdW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0AGludmFsaWQgZGlzdGFuY2VzIHNldABpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0AEZpbGUgYWxyZWFkeSBleGlzdHMAdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMAaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocwAlcyVzJXMAYnVmZmVyIGVycm9yAE5vIGVycm9yAHN0cmVhbSBlcnJvcgBUZWxsIGVycm9yAEludGVybmFsIGVycm9yAFNlZWsgZXJyb3IAV3JpdGUgZXJyb3IAZmlsZSBlcnJvcgBSZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoADEuMi4xMy56bGliLW5nAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRlZABPcGVyYXRpb24gbm90IHN1cHBvcnRlZABFbmNyeXB0aW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkAENvbXByZXNzaW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkAEVudHJ5IGhhcyBiZWVuIGRlbGV0ZWQAQ29udGFpbmluZyB6aXAgYXJjaGl2ZSB3YXMgY2xvc2VkAENsb3NpbmcgemlwIGFyY2hpdmUgZmFpbGVkAFJlbmFtaW5nIHRlbXBvcmFyeSBmaWxlIGZhaWxlZABFbnRyeSBoYXMgYmVlbiBjaGFuZ2VkAE5vIHBhc3N3b3JkIHByb3ZpZGVkAFdyb25nIHBhc3N3b3JkIHByb3ZpZGVkAFVua25vd24gZXJyb3IgJWQAQUUAKG51bGwpADogAFBLBgcAUEsGBgBQSwUGAFBLAwQAUEsBAgAAAAA/BQAAwAcAAJMIAAB4CAAAbwUAAJEFAAB6BQAAsgUAAFYIAAAbBwAA1gQAAAsHAADqBgAAnAUAAMgGAACyCAAAHggAACgHAABHBAAAoAYAAGAFAAAuBAAAPgcAAD8IAAD+BwAAjgYAAMkIAADeCAAA5gcAALIGAABVBQAAqAcAACAAQcgTCxEBAAAAAQAAAAEAAAABAAAAAQBB7BMLCQEAAAABAAAAAgBBmBQLAQEAQbgUCwEBAEHSFAukLDomOyZlJmYmYyZgJiIg2CXLJdklQiZAJmomayY8JrolxCWVITwgtgCnAKwlqCGRIZMhkiGQIR8ilCGyJbwlIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AAIjxwD8AOkA4gDkAOAA5QDnAOoA6wDoAO8A7gDsAMQAxQDJAOYAxgD0APYA8gD7APkA/wDWANwAogCjAKUApyCSAeEA7QDzAPoA8QDRAKoAugC/ABAjrAC9ALwAoQCrALsAkSWSJZMlAiUkJWElYiVWJVUlYyVRJVclXSVcJVslECUUJTQlLCUcJQAlPCVeJV8lWiVUJWklZiVgJVAlbCVnJWglZCVlJVklWCVSJVMlayVqJRglDCWIJYQljCWQJYAlsQPfAJMDwAOjA8MDtQDEA6YDmAOpA7QDHiLGA7UDKSJhIrEAZSJkIiAjISP3AEgisAAZIrcAGiJ/ILIAoCWgAAAAAACWMAd3LGEO7rpRCZkZxG0Hj/RqcDWlY+mjlWSeMojbDqS43Hke6dXgiNnSlytMtgm9fLF+By2455Edv5BkELcd8iCwakhxufPeQb6EfdTaGuvk3W1RtdT0x4XTg1aYbBPAqGtkevli/ezJZYpPXAEU2WwGY2M9D/r1DQiNyCBuO14QaUzkQWDVcnFnotHkAzxH1ARL/YUN0mu1CqX6qLU1bJiyQtbJu9tA+bys42zYMnVc30XPDdbcWT3Rq6ww2SY6AN5RgFHXyBZh0L+19LQhI8SzVpmVus8Ppb24nrgCKAiIBV+y2QzGJOkLsYd8by8RTGhYqx1hwT0tZraQQdx2BnHbAbwg0pgqENXviYWxcR+1tgal5L+fM9S46KLJB3g0+QAPjqgJlhiYDuG7DWp/LT1tCJdsZJEBXGPm9FFra2JhbBzYMGWFTgBi8u2VBmx7pQEbwfQIglfED/XG2bBlUOm3Euq4vot8iLn83x3dYkkt2hXzfNOMZUzU+1hhsk3OUbU6dAC8o+Iwu9RBpd9K15XYPW3E0aT79NbTaulpQ/zZbjRGiGet0Lhg2nMtBETlHQMzX0wKqsl8Dd08cQVQqkECJxAQC76GIAzJJbVoV7OFbyAJ1Ga5n+Rhzg753l6YydkpIpjQsLSo18cXPbNZgQ20LjtcvbetbLrAIIO47bazv5oM4rYDmtKxdDlH1eqvd9KdFSbbBIMW3HMSC2PjhDtklD5qbQ2oWmp6C88O5J3/CZMnrgAKsZ4HfUSTD/DSowiHaPIBHv7CBmldV2L3y2dlgHE2bBnnBmtudhvU/uAr04laetoQzErdZ2/fufn5776OQ763F9WOsGDoo9bWfpPRocTC2DhS8t9P8We70WdXvKbdBrU/SzaySNorDdhMGwqv9koDNmB6BEHD72DfVd9nqO+ObjF5vmlGjLNhyxqDZryg0m8lNuJoUpV3DMwDRwu7uRYCIi8mBVW+O7rFKAu9spJatCsEarNcp//XwjHP0LWLntksHa7eW7DCZJsm8mPsnKNqdQqTbQKpBgmcPzYO64VnB3ITVwAFgkq/lRR6uOKuK7F7OBu2DJuO0pINvtXlt+/cfCHf2wvU0tOGQuLU8fiz3Whug9ofzRa+gVsmufbhd7Bvd0e3GOZaCIhwag//yjsGZlwLARH/nmWPaa5i+NP/a2FFz2wWeOIKoO7SDddUgwROwrMDOWEmZ6f3FmDQTUdpSdt3bj5KatGu3FrW2WYL30DwO9g3U668qcWeu95/z7JH6f+1MBzyvb2KwrrKMJOzU6ajtCQFNtC6kwbXzSlX3lS/Z9kjLnpms7hKYcQCG2hdlCtvKje+C7ShjgzDG98FWo3vAi0AAAAARjtnZYx2zsrKTamvWevtTh/QiivVnSOEk6ZE4bLW25307bz4PqAVV3ibcjLrPTbTrQZRtmdL+BkhcJ98JavG4GOQoYWp3Qgq7+ZvT3xAK646e0zL8DblZLYNggGXfR190UZ6GBsL07ddMLTSzpbwM4itl1ZC4D75BNtZnAtQ/BpNa5t/hyYy0MEdVbVSuxFUFIB2Md7N356Y9rj7uYYnh/+9QOI18OlNc8uOKOBtysmmVq2sbBsEAyogY2Yu+zr6aMBdn6KN9DDktpNVdxDXtDErsNH7Zhl+vV1+G5wt4WfaFoYCEFsvrVZgSMjFxgwpg/1rTEmwwuMPi6WGFqD4NVCbn1Ca1jb/3O1Rmk9LFXsJcHIewz3bsYUGvNSkdiOo4k1EzSgA7WJuO4oH/Z3O5rumqYNx6wAsN9BnSTMLPtV1MFmwv33wH/lGl3pq4NObLNu0/uaWHVGgrXo0gd3lSMfmgi0NqyuCS5BM59g2CAaeDW9jVEDGzBJ7oakd8AQvW8tjSpGGyuXXva2ARBvpYQIgjgTIbSerjlZAzq8m37LpHbjXI1AReGVrdh32zTL8sPZVmXq7/DY8gJtTOFvCz35gpaq0LQwF8hZrYGGwL4Eni0jk7cbhS6v9hi6KjRlSzLZ+Nwb715hAwLD902b0HJVdk3lfEDrWGStdsyxA8Wtqe5YOoDY/oeYNWMR1qxwlM5B7QPnd0u+/5rWKnpYq9titTZMS4OQ8VNuDWcd9x7iBRqDdSwsJcg0wbhcJ6zeLT9BQ7oWd+UHDpp4kUADaxRY7vaDcdhQPmk1zars97Bb9BotzN0si3HFwRbni1gFYpO1mPW6gz5Iom6j3JxANcWErahSrZsO77V2k3n774D84wIda8o0u9bS2SZCVxtbs0/2xiRmwGCZfi39DzC07oooWXMdAW/VoBmCSDQK7y5FEgKz0js0FW8j2Yj5bUCbfHWtButcm6BWRHY9wsG0QDPZWd2k8G97GeiC5o+mG/UKvvZonZfAziCPLVO064AlefNtuO7aWx5TwraDxYwvkECUwg3XvfSraqUZNv4g20sPODbWmBEAcCUJ7e2zR3T+Nl+ZY6F2r8UcbkJYiH0vPvllwqNuTPQF01QZmEUagIvAAm0WVytbsOozti1+tnRQj66ZzRiHr2uln0L2M9Hb5bbJNngh4ADenPjtQwjGw9UR3i5IhvcY7jvv9XOtoWxgKLmB/b+Qt1sCiFrGlg2Yu2cVdSbwPEOATSSuHdtqNw5ectqTyVvsNXRDAajgUGzOkUiBUwZht/W7eVpoLTfDe6gvLuY/BhhAgh713RabN6Dng9o9cKrsm82yAQZb/JgV3uR1iEnNQy701a6zYAAAAAFiA4tfxBrR0qYZWo+INaOm6jYo+EwvcnUuLPkqFHaEJ3Z1D3nQbFX0sm/eqZxDJ4D+QKzeWFn2UzpafQwo7QhNSu6DE+z32Z6O9FLDoNir6sLbILRkwno5BsHxZjybjGtemAc1+IFduJqC1uW0ri/M1q2kknC0/h8St3VAUdoQmTPZm8eVwMFK98NKF9nvsz677DhgHfVi7X/26bJFrJS/J68f4YG2RWzjtc4xzZk3GK+avEYJg+bLa4BtlHk3GNUbNJOLvS3JBt8uQlvxArtykwEwLDUYaqFXG+H+bUGc8w9CF62pW00gy1jGfeV0P1SHd7QKIW7uh0NtZdijsCE1wbOqa2eq8OYFqXu7K4WCkkmGCczvn1NBjZzYHrfGpRPVxS5Nc9x0wBHf/50/8wa0XfCN6vvp12eZ6lw4i10peeleoidPR/iqLURz9wNoit5hawGAx3JbDaVx0FKfK61f/SgmAVsxfIw5MvfRFx4O+HUdhabTBN8rsQdUdPJqMa2QabrzNnDgflRzayN6X5IKGFwZVL5FQ9ncRsiG5hy1i4QfPtUiBmRYQAXvBW4pFiwMKp1yqjPH/8gwTKDahznhuISyvx6d6DJ8nmNvUrKaRjCxERiWqEuV9KvAys7xvces8jaZCutsFGjo50lGxB5gJMeVPoLez7Pg3UTtQ2BGaCFjzTaHepe75Xkc5stV5c+pVm6RD080HG1Mv0NXFsJONRVJEJMME53xD5jA3yNh6b0g6rcbObA6eTo7ZWuNTiQJjsV6r5ef982UFKrjuO2Dgbtm3SeiPFBFobcPf/vKAh34QVy74RvR2eKQjPfOaaWVzeL7M9S4dlHXMykSulbwcLndrtaghyO0owx+mo/1V/iMfglelSSEPJav2wbM0tZkz1mIwtYDBaDViFiO+XFx7Pr6L0rjoKIo4Cv9OldevFhU1eL+TY9vnE4EMrJi/RvQYXZFdngsyBR7p5cuIdqaTCJRxOo7C0mIOIAUphR5PcQX8mNiDqjuAA0jseDQZ1yC0+wCJMq2j0bJPdJo5cT7CuZPpaz/FSjO/J539KbjepalaCQwvDKpUr+59HyTQN0ekMuDuImRDtqKGlHIPW8Qqj7kTgwnvsNuJDWeQAjMtyILR+mEEh1k5hGWO9xL6za+SGBoGFE65XpSsbhUfkiRNn3Dz5BkmULyZxIdsQp3xNMJ/Jp1EKYXFxMtSjk/1GNbPF89/SUFsJ8mju+lfPPix394vGFmIjEDZalsLUlQRU9K2xvpU4GWi1AKyZnnf4j75PTWXf2uWz/+JQYR0twvc9FXcdXIDfy3y4ajjZH7ru+ScPBJiyp9K4ihIAWkWAlnp9NXwb6J2qO9AoQAAAADhtlLvg2vUBWLdhuoG16gL52H65IW8fA5kCi7hDK5RF+0YA/iPxYUSbnPX/Qp5+Rzrz6vziRItGWikf/YYXKMu+erxwZs3dyt6gSXEHosLJf89Wcqd4N8gfFaNzxTy8jn1RKDWl5kmPHYvdNMSJVoy85MI3ZFOjjdw+NzYMLhGXdEOFLKz05JYUmXAtzZv7lbX2by5tQQ6U1SyaLw8FhdK3aBFpb99w09ey5GgOsG/Qdt37a65qmtEWBw5qyjk5XPJUrecq48xdko5Y5kuM014z4Ufl61YmX1M7suSJEq0ZMX85ounIWBhRpcyjiKdHG/DK06AofbIakBAmoVgcI26gcbfVeMbWb8CrQtQZqclsYcRd17lzPG0BHqjW2ze3K2NaI5C77UIqA4DWkdqCXSmi78mSelioKMI1PJMeCwulJmafHv7R/qRGvGofn77hp+fTdRw/ZBSmhwmAHV0gn+DlTQtbPfpq4YWX/lpclXXiJPjhWfxPgONEIhRYlDIy+exfpkI06Mf4jIVTQ1WH2Pst6kxA9V0t+k0wuUGXGaa8L3QyB/fDU71PrscGlqxMvu7B2AU2drm/jhstBFIlGjJqSI6Jsv/vMwqSe4jTkPAwq/1ki3NKBTHLJ5GKEQ6Od6ljGsxx1Ht2ybnvzRC7ZHVo1vDOsGGRdAgMBc/geZrrmBQOUECjb+r4zvtRIcxw6Vmh5FKBFoXoOXsRU+NSDq5bP5oVg4j7rzvlbxTi5+SsmopwF0I9Ea36UIUWJm6yIB4DJpvGtEchftnTmqfbWCLftsyZBwGtI79sOZhlRSZl3Siy3gWf02S98kffZPDMZxydWNzEKjlmfEet3axXi3zUOh/HDI1+fbTg6sZt4mF+FY/1xc04lH91VQDEr3wfORcRi4LPpuo4d8t+g67J9TvWpGGADhMAOrZ+lIFqQKO3Ui03DIqaVrYy98IN6/VJtZOY3Q5LL7y080IoDylrN/KRBqNJSbHC8/HcVkgo3t3wULNJS4gEKPEwabxK+GW5hQAILT7Yv0yEYNLYP7nQU4fBvcc8GQqmhqFnMj17Ti3AwyO5exuU2MGj+Ux6evvHwgKWU3naITLDYkymeL5ykU6GHwX1XqhkT+bF8PQ/x3tMR6rv958djk0ncBr2/VkFC0U0kbCdg/AKJe5ksfzs7wmEgXuyXDYaCORbjrM0S6gSTCY8qZSRXRMs/Mmo9f5CEI2T1qtVJLcR7UkjqjdgPFePDajsV7rJVu/XXe021dZVTrhC7pYPI1QuYrfv8lyA2coxFGIShnXYquvhY3PpatsLhP5g0zOf2mteC2GxdxScCRqAJ9Gt4Z1pwHUmsML+nsivaiUQGAufqHWfJEAAAAAQ8umh8eQPNSEW5pTzycIc4zsrvQItzSnS3ySIJ5PEObdhLZhWd8sMhoUirVRaBiVEqO+Epb4JEHVM4LGfZlRFz5S95C6CW3D+cLLRLK+WWTxdf/jdS5lsDblwzfj1kHxoB3ndiRGfSVnjduiLPFJgm867wXrYXVWqKrT0foyoy65+QWpPaKf+n5pOX01Fatddt4N2vKFl4mxTjEOZH2zyCe2FU+j7Y8c4CYpm6tau7vokR08bMqHby8BIeiHq/I5xGBUvkA7zu0D8GhqSIz6SgtHXM2PHMaezNdgGRnk4t9aL0RY3nTeC52/eIzWw+qslQhMKxFT1nhSmHD/9GVGXbeu4Noz9XqJcD7cDjtCTi54ieip/NJy+r8Z1H1qKla7KeHwPK26am/ucczopQ1eyObG+E9inWIcIVbEm4n8F0rKN7HNTmwrng2njRlG2x85BRC5voFLI+3CgIVqF7MHrFR4oSvQIzt4k+id/9iUD9+bX6lYHwQzC1zPlYwOV+VzTZxD9MnH2aeKDH8gwXDtAIK7S4cG4NHURSt3U5AY9ZXT01MSV4jJQRRDb8ZfP/3mHPRbYZivwTLbZGe1c860ZDAFEuO0Xoiw95UuN7zpvBf/IhqQe3mAwziyJkTtgaSCrkoCBSoRmFZp2j7RIqas8WFtCnblNpAlpv02oujLjLqrACo9L1uwbmyQFukn7ITJZCciTuB8uB2jtx6adoScXDVPOtuxFKCI8t8GD7mjlC/6aDKofjOo+z34DnyVUt2t1pl7KlLC4XkRCUf+WnXV3hm+c1md5ekK3i5PjQsdzUtI1mvMzI3xn49GVxjEOsU4h/FjvwOq+exAYV9rEvkvlFEyiRPVaRNAlqK1x93eJ+eeFYFgGk4bM1mFvbSMtj9yz32Z9UsmA6YI7aUhQ5E3AQBakYaEAQvVx8qtUm9gfoMsq9gEqPBCV+s75NCgR3bw44zQd2fXSiQkHOyj8S9uZbLkyOI2v1KxdXT0Nj4IZhZ9w8CR+ZhawrpT/EUcrsrnX2VsYNs+9jOY9VC004nClJBCZBMUGf5AV9JYx4Lh2gHBKnyGRXHm1Qa6QFJNxtJyDg109YpW7qbJnUghYTeb8CL8PXemp6ck5WwBo64Qk4Pt2zUEaYCvVypLCdD/eIsWvLMtkTjot8J7IxFFMF+DZXOUJeL3z7+xtAQZNuacacmlV89OIQxVHWLH85opu2G6anDHPe4rXW6t4PvpeNN5LzsY36i/Q0X7/IjjfLf0cVz0P9fbcGRNiDOv6w+bBTje2M6eWVyVBAofXqKNVCIwrRfpliqTsgx50Hmq/gVKKDhGgY6/wtoU7IERsmvKbSBLiaaGzA39HJ9ONroYFAQAAJ0HAAAsCQAAhgUAAEgFAACnBQAAAAQAADIFAAC8BQAALAkAQYDBAAv3CQwACACMAAgATAAIAMwACAAsAAgArAAIAGwACADsAAgAHAAIAJwACABcAAgA3AAIADwACAC8AAgAfAAIAPwACAACAAgAggAIAEIACADCAAgAIgAIAKIACABiAAgA4gAIABIACACSAAgAUgAIANIACAAyAAgAsgAIAHIACADyAAgACgAIAIoACABKAAgAygAIACoACACqAAgAagAIAOoACAAaAAgAmgAIAFoACADaAAgAOgAIALoACAB6AAgA+gAIAAYACACGAAgARgAIAMYACAAmAAgApgAIAGYACADmAAgAFgAIAJYACABWAAgA1gAIADYACAC2AAgAdgAIAPYACAAOAAgAjgAIAE4ACADOAAgALgAIAK4ACABuAAgA7gAIAB4ACACeAAgAXgAIAN4ACAA+AAgAvgAIAH4ACAD+AAgAAQAIAIEACABBAAgAwQAIACEACAChAAgAYQAIAOEACAARAAgAkQAIAFEACADRAAgAMQAIALEACABxAAgA8QAIAAkACACJAAgASQAIAMkACAApAAgAqQAIAGkACADpAAgAGQAIAJkACABZAAgA2QAIADkACAC5AAgAeQAIAPkACAAFAAgAhQAIAEUACADFAAgAJQAIAKUACABlAAgA5QAIABUACACVAAgAVQAIANUACAA1AAgAtQAIAHUACAD1AAgADQAIAI0ACABNAAgAzQAIAC0ACACtAAgAbQAIAO0ACAAdAAgAnQAIAF0ACADdAAgAPQAIAL0ACAB9AAgA/QAIABMACQATAQkAkwAJAJMBCQBTAAkAUwEJANMACQDTAQkAMwAJADMBCQCzAAkAswEJAHMACQBzAQkA8wAJAPMBCQALAAkACwEJAIsACQCLAQkASwAJAEsBCQDLAAkAywEJACsACQArAQkAqwAJAKsBCQBrAAkAawEJAOsACQDrAQkAGwAJABsBCQCbAAkAmwEJAFsACQBbAQkA2wAJANsBCQA7AAkAOwEJALsACQC7AQkAewAJAHsBCQD7AAkA+wEJAAcACQAHAQkAhwAJAIcBCQBHAAkARwEJAMcACQDHAQkAJwAJACcBCQCnAAkApwEJAGcACQBnAQkA5wAJAOcBCQAXAAkAFwEJAJcACQCXAQkAVwAJAFcBCQDXAAkA1wEJADcACQA3AQkAtwAJALcBCQB3AAkAdwEJAPcACQD3AQkADwAJAA8BCQCPAAkAjwEJAE8ACQBPAQkAzwAJAM8BCQAvAAkALwEJAK8ACQCvAQkAbwAJAG8BCQDvAAkA7wEJAB8ACQAfAQkAnwAJAJ8BCQBfAAkAXwEJAN8ACQDfAQkAPwAJAD8BCQC/AAkAvwEJAH8ACQB/AQkA/wAJAP8BCQAAAAcAQAAHACAABwBgAAcAEAAHAFAABwAwAAcAcAAHAAgABwBIAAcAKAAHAGgABwAYAAcAWAAHADgABwB4AAcABAAHAEQABwAkAAcAZAAHABQABwBUAAcANAAHAHQABwADAAgAgwAIAEMACADDAAgAIwAIAKMACABjAAgA4wAIAAAABQAQAAUACAAFABgABQAEAAUAFAAFAAwABQAcAAUAAgAFABIABQAKAAUAGgAFAAYABQAWAAUADgAFAB4ABQABAAUAEQAFAAkABQAZAAUABQAFABUABQANAAUAHQAFAAMABQATAAUACwAFABsABQAHAAUAFwAFAEGBywAL7AYBAgMEBAUFBgYGBgcHBwcICAgICAgICAkJCQkJCQkJCgoKCgoKCgoKCgoKCgoKCgsLCwsLCwsLCwsLCwsLCwsMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8AABAREhITExQUFBQVFRUVFhYWFhYWFhYXFxcXFxcXFxgYGBgYGBgYGBgYGBgYGBgZGRkZGRkZGRkZGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhobGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAAECAwQFBgcICAkJCgoLCwwMDAwNDQ0NDg4ODg8PDw8QEBAQEBAQEBEREREREREREhISEhISEhITExMTExMTExQUFBQUFBQUFBQUFBQUFBQVFRUVFRUVFRUVFRUVFRUVFhYWFhYWFhYWFhYWFhYWFhcXFxcXFxcXFxcXFxcXFxcYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhobGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbHAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAQYTSAAutAQEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAgCAAAMApAAABAQAAHgEAAA8AAAAAJQAAQCoAAAAAAAAeAAAADwAAAAAAAADAKgAAAAAAABMAAAAHAEHg0wALTQEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAAQAAAAEAAAABAAAAAQAAAAFAAAABQAAAAUAAAAFAEHQ1AALZQEAAAABAAAAAgAAAAIAAAADAAAAAwAAAAQAAAAEAAAABQAAAAUAAAAGAAAABgAAAAcAAAAHAAAACAAAAAgAAAAJAAAACQAAAAoAAAAKAAAACwAAAAsAAAAMAAAADAAAAA0AAAANAEGA1gALIwIAAAADAAAABwAAAAAAAAAQERIACAcJBgoFCwQMAw0CDgEPAEHQ1gALTQEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAAQAAAAEAAAABAAAAAQAAAAFAAAABQAAAAUAAAAFAEHA1wALZQEAAAABAAAAAgAAAAIAAAADAAAAAwAAAAQAAAAEAAAABQAAAAUAAAAGAAAABgAAAAcAAAAHAAAACAAAAAgAAAAJAAAACQAAAAoAAAAKAAAACwAAAAsAAAAMAAAADAAAAA0AAAANAEG42AALASwAQcTYAAthLQAAAAQABAAIAAQALgAAAAQABgAQAAYALwAAAAQADAAgABgALwAAAAgAEAAgACAALwAAAAgAEACAAIAALwAAAAgAIACAAAABMAAAACAAgAACAQAEMAAAACAAAgECAQAQMABBsNkAC6UTAwAEAAUABgAHAAgACQAKAAsADQAPABEAEwAXABsAHwAjACsAMwA7AEMAUwBjAHMAgwCjAMMA4wACAQAAAAAAABAAEAAQABAAEAAQABAAEAARABEAEQARABIAEgASABIAEwATABMAEwAUABQAFAAUABUAFQAVABUAEABNAMoAAAABAAIAAwAEAAUABwAJAA0AEQAZACEAMQBBAGEAgQDBAAEBgQEBAgEDAQQBBgEIAQwBEAEYASABMAFAAWAAAAAAEAAQABAAEAARABEAEgASABMAEwAUABQAFQAVABYAFgAXABcAGAAYABkAGQAaABoAGwAbABwAHAAdAB0AQABAAGAHAAAACFAAAAgQABQIcwASBx8AAAhwAAAIMAAACcAAEAcKAAAIYAAACCAAAAmgAAAIAAAACIAAAAhAAAAJ4AAQBwYAAAhYAAAIGAAACZAAEwc7AAAIeAAACDgAAAnQABEHEQAACGgAAAgoAAAJsAAACAgAAAiIAAAISAAACfAAEAcEAAAIVAAACBQAFQjjABMHKwAACHQAAAg0AAAJyAARBw0AAAhkAAAIJAAACagAAAgEAAAIhAAACEQAAAnoABAHCAAACFwAAAgcAAAJmAAUB1MAAAh8AAAIPAAACdgAEgcXAAAIbAAACCwAAAm4AAAIDAAACIwAAAhMAAAJ+AAQBwMAAAhSAAAIEgAVCKMAEwcjAAAIcgAACDIAAAnEABEHCwAACGIAAAgiAAAJpAAACAIAAAiCAAAIQgAACeQAEAcHAAAIWgAACBoAAAmUABQHQwAACHoAAAg6AAAJ1AASBxMAAAhqAAAIKgAACbQAAAgKAAAIigAACEoAAAn0ABAHBQAACFYAAAgWAEAIAAATBzMAAAh2AAAINgAACcwAEQcPAAAIZgAACCYAAAmsAAAIBgAACIYAAAhGAAAJ7AAQBwkAAAheAAAIHgAACZwAFAdjAAAIfgAACD4AAAncABIHGwAACG4AAAguAAAJvAAACA4AAAiOAAAITgAACfwAYAcAAAAIUQAACBEAFQiDABIHHwAACHEAAAgxAAAJwgAQBwoAAAhhAAAIIQAACaIAAAgBAAAIgQAACEEAAAniABAHBgAACFkAAAgZAAAJkgATBzsAAAh5AAAIOQAACdIAEQcRAAAIaQAACCkAAAmyAAAICQAACIkAAAhJAAAJ8gAQBwQAAAhVAAAIFQAQCAIBEwcrAAAIdQAACDUAAAnKABEHDQAACGUAAAglAAAJqgAACAUAAAiFAAAIRQAACeoAEAcIAAAIXQAACB0AAAmaABQHUwAACH0AAAg9AAAJ2gASBxcAAAhtAAAILQAACboAAAgNAAAIjQAACE0AAAn6ABAHAwAACFMAAAgTABUIwwATByMAAAhzAAAIMwAACcYAEQcLAAAIYwAACCMAAAmmAAAIAwAACIMAAAhDAAAJ5gAQBwcAAAhbAAAIGwAACZYAFAdDAAAIewAACDsAAAnWABIHEwAACGsAAAgrAAAJtgAACAsAAAiLAAAISwAACfYAEAcFAAAIVwAACBcAQAgAABMHMwAACHcAAAg3AAAJzgARBw8AAAhnAAAIJwAACa4AAAgHAAAIhwAACEcAAAnuABAHCQAACF8AAAgfAAAJngAUB2MAAAh/AAAIPwAACd4AEgcbAAAIbwAACC8AAAm+AAAIDwAACI8AAAhPAAAJ/gBgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnBABAHCgAACGAAAAggAAAJoQAACAAAAAiAAAAIQAAACeEAEAcGAAAIWAAACBgAAAmRABMHOwAACHgAAAg4AAAJ0QARBxEAAAhoAAAIKAAACbEAAAgIAAAIiAAACEgAAAnxABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACckAEQcNAAAIZAAACCQAAAmpAAAIBAAACIQAAAhEAAAJ6QAQBwgAAAhcAAAIHAAACZkAFAdTAAAIfAAACDwAAAnZABIHFwAACGwAAAgsAAAJuQAACAwAAAiMAAAITAAACfkAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxQARBwsAAAhiAAAIIgAACaUAAAgCAAAIggAACEIAAAnlABAHBwAACFoAAAgaAAAJlQAUB0MAAAh6AAAIOgAACdUAEgcTAAAIagAACCoAAAm1AAAICgAACIoAAAhKAAAJ9QAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnNABEHDwAACGYAAAgmAAAJrQAACAYAAAiGAAAIRgAACe0AEAcJAAAIXgAACB4AAAmdABQHYwAACH4AAAg+AAAJ3QASBxsAAAhuAAAILgAACb0AAAgOAAAIjgAACE4AAAn9AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcMAEAcKAAAIYQAACCEAAAmjAAAIAQAACIEAAAhBAAAJ4wAQBwYAAAhZAAAIGQAACZMAEwc7AAAIeQAACDkAAAnTABEHEQAACGkAAAgpAAAJswAACAkAAAiJAAAISQAACfMAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJywARBw0AAAhlAAAIJQAACasAAAgFAAAIhQAACEUAAAnrABAHCAAACF0AAAgdAAAJmwAUB1MAAAh9AAAIPQAACdsAEgcXAAAIbQAACC0AAAm7AAAIDQAACI0AAAhNAAAJ+wAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnHABEHCwAACGMAAAgjAAAJpwAACAMAAAiDAAAIQwAACecAEAcHAAAIWwAACBsAAAmXABQHQwAACHsAAAg7AAAJ1wASBxMAAAhrAAAIKwAACbcAAAgLAAAIiwAACEsAAAn3ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc8AEQcPAAAIZwAACCcAAAmvAAAIBwAACIcAAAhHAAAJ7wAQBwkAAAhfAAAIHwAACZ8AFAdjAAAIfwAACD8AAAnfABIHGwAACG8AAAgvAAAJvwAACA8AAAiPAAAITwAACf8AEAUBABcFAQETBREAGwUBEBEFBQAZBQEEFQVBAB0FAUAQBQMAGAUBAhQFIQAcBQEgEgUJABoFAQgWBYEAQAUAABAFAgAXBYEBEwUZABsFARgRBQcAGQUBBhUFYQAdBQFgEAUEABgFAQMUBTEAHAUBMBIFDQAaBQEMFgXBAEAFAAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEHg7AALQREACgAREREAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAEQAPChEREQMKBwABAAkLCwAACQYLAAALAAYRAAAAERERAEGx7QALIQsAAAAAAAAAABEACgoREREACgAAAgAJCwAAAAkACwAACwBB6+0ACwEMAEH37QALFQwAAAAADAAAAAAJDAAAAAAADAAADABBpe4ACwEOAEGx7gALFQ0AAAAEDQAAAAAJDgAAAAAADgAADgBB3+4ACwEQAEHr7gALHg8AAAAADwAAAAAJEAAAAAAAEAAAEAAAEgAAABISEgBBou8ACw4SAAAAEhISAAAAAAAACQBB0+8ACwELAEHf7wALFQoAAAAACgAAAAAJCwAAAAAACwAACwBBjfAACwEMAEGZ8AALJwwAAAAADAAAAAAJDAAAAAAADAAADAAAMDEyMzQ1Njc4OUFCQ0RFRgBB5PAACwE+AEGL8QALBf//////AEHQ8QALVxkSRDsCPyxHFD0zMAobBkZLRTcPSQ6OFwNAHTxpKzYfSi0cASAlKSEIDBUWIi4QOD4LNDEYZHR1di9BCX85ESNDMkKJiosFBCYoJw0qHjWMBxpIkxOUlQBBsPIAC4oOSWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AQcCAAQuFARMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAgERQADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAQfSCAQsCXEQAQbCDAQsQ/////////////////////w==\";Co(ji)||(ji=P(ji));function eo(Ke){try{if(Ke==ji&&le)return new Uint8Array(le);var st=Me(Ke);if(st)return st;if(R)return R(Ke);throw\"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)\"}catch(St){rs(St)}}function wo(Ke,st){var St,lr,te;try{te=eo(Ke),lr=new WebAssembly.Module(te),St=new WebAssembly.Instance(lr,st)}catch(Oe){var Ee=Oe.toString();throw ee(\"failed to compile wasm module: \"+Ee),(Ee.includes(\"imported Memory\")||Ee.includes(\"memory import\"))&&ee(\"Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time).\"),Oe}return[St,lr]}function QA(){var Ke={a:cu};function st(te,Ee){var Oe=te.exports;r.asm=Oe,Be=r.asm.g,z(Be.buffer),$=r.asm.W,gn(r.asm.h),Io(\"wasm-instantiate\")}if(ai(\"wasm-instantiate\"),r.instantiateWasm)try{var St=r.instantiateWasm(Ke,st);return St}catch(te){return ee(\"Module.instantiateWasm callback failed with error: \"+te),!1}var lr=wo(ji,Ke);return st(lr[0]),r.asm}function Af(Ke){return F.getFloat32(Ke,!0)}function dh(Ke){return F.getFloat64(Ke,!0)}function mh(Ke){return F.getInt16(Ke,!0)}function to(Ke){return F.getInt32(Ke,!0)}function jn(Ke,st){F.setInt32(Ke,st,!0)}function Ts(Ke){for(;Ke.length>0;){var st=Ke.shift();if(typeof st==\"function\"){st(r);continue}var St=st.func;typeof St==\"number\"?st.arg===void 0?$.get(St)():$.get(St)(st.arg):St(st.arg===void 0?null:st.arg)}}function ro(Ke,st){var St=new Date(to((Ke>>2)*4)*1e3);jn((st>>2)*4,St.getUTCSeconds()),jn((st+4>>2)*4,St.getUTCMinutes()),jn((st+8>>2)*4,St.getUTCHours()),jn((st+12>>2)*4,St.getUTCDate()),jn((st+16>>2)*4,St.getUTCMonth()),jn((st+20>>2)*4,St.getUTCFullYear()-1900),jn((st+24>>2)*4,St.getUTCDay()),jn((st+36>>2)*4,0),jn((st+32>>2)*4,0);var lr=Date.UTC(St.getUTCFullYear(),0,1,0,0,0,0),te=(St.getTime()-lr)/(1e3*60*60*24)|0;return jn((st+28>>2)*4,te),ro.GMTString||(ro.GMTString=rt(\"GMT\")),jn((st+40>>2)*4,ro.GMTString),st}function ou(Ke,st){return ro(Ke,st)}function au(Ke,st,St){ke.copyWithin(Ke,st,st+St)}function lu(Ke){try{return Be.grow(Ke-Pe.byteLength+65535>>>16),z(Be.buffer),1}catch{}}function TA(Ke){var st=ke.length;Ke=Ke>>>0;var St=2147483648;if(Ke>St)return!1;for(var lr=1;lr<=4;lr*=2){var te=st*(1+.2/lr);te=Math.min(te,Ke+100663296);var Ee=Math.min(St,Ne(Math.max(Ke,te),65536)),Oe=lu(Ee);if(Oe)return!0}return!1}function RA(Ke){ue(Ke)}function oa(Ke){var st=Date.now()/1e3|0;return Ke&&jn((Ke>>2)*4,st),st}function aa(){if(aa.called)return;aa.called=!0;var Ke=new Date().getFullYear(),st=new Date(Ke,0,1),St=new Date(Ke,6,1),lr=st.getTimezoneOffset(),te=St.getTimezoneOffset(),Ee=Math.max(lr,te);jn((vl()>>2)*4,Ee*60),jn((Is()>>2)*4,+(lr!=te));function Oe(An){var li=An.toTimeString().match(/\\(([A-Za-z ]+)\\)$/);return li?li[1]:\"GMT\"}var dt=Oe(st),Et=Oe(St),bt=rt(dt),tr=rt(Et);te<lr?(jn((Mi()>>2)*4,bt),jn((Mi()+4>>2)*4,tr)):(jn((Mi()>>2)*4,tr),jn((Mi()+4>>2)*4,bt))}function FA(Ke){aa();var st=Date.UTC(to((Ke+20>>2)*4)+1900,to((Ke+16>>2)*4),to((Ke+12>>2)*4),to((Ke+8>>2)*4),to((Ke+4>>2)*4),to((Ke>>2)*4),0),St=new Date(st);jn((Ke+24>>2)*4,St.getUTCDay());var lr=Date.UTC(St.getUTCFullYear(),0,1,0,0,0,0),te=(St.getTime()-lr)/(1e3*60*60*24)|0;return jn((Ke+28>>2)*4,te),St.getTime()/1e3|0}var gr=typeof atob==\"function\"?atob:function(Ke){var st=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",St=\"\",lr,te,Ee,Oe,dt,Et,bt,tr=0;Ke=Ke.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");do Oe=st.indexOf(Ke.charAt(tr++)),dt=st.indexOf(Ke.charAt(tr++)),Et=st.indexOf(Ke.charAt(tr++)),bt=st.indexOf(Ke.charAt(tr++)),lr=Oe<<2|dt>>4,te=(dt&15)<<4|Et>>2,Ee=(Et&3)<<6|bt,St=St+String.fromCharCode(lr),Et!==64&&(St=St+String.fromCharCode(te)),bt!==64&&(St=St+String.fromCharCode(Ee));while(tr<Ke.length);return St};function Bo(Ke){if(typeof C==\"boolean\"&&C){var st;try{st=Buffer.from(Ke,\"base64\")}catch{st=new Buffer(Ke,\"base64\")}return new Uint8Array(st.buffer,st.byteOffset,st.byteLength)}try{for(var St=gr(Ke),lr=new Uint8Array(St.length),te=0;te<St.length;++te)lr[te]=St.charCodeAt(te);return lr}catch{throw new Error(\"Converting base64 string to bytes failed.\")}}function Me(Ke){if(Co(Ke))return Bo(Ke.slice($s.length))}var cu={e:ou,c:au,d:TA,a:RA,b:oa,f:FA},Cr=QA(),pf=r.___wasm_call_ctors=Cr.h,NA=r._zip_ext_count_symlinks=Cr.i,OA=r._zip_file_get_external_attributes=Cr.j,uu=r._zipstruct_statS=Cr.k,fu=r._zipstruct_stat_size=Cr.l,oc=r._zipstruct_stat_mtime=Cr.m,ve=r._zipstruct_stat_crc=Cr.n,Nt=r._zipstruct_errorS=Cr.o,ac=r._zipstruct_error_code_zip=Cr.p,Oi=r._zipstruct_stat_comp_size=Cr.q,no=r._zipstruct_stat_comp_method=Cr.r,Rt=r._zip_close=Cr.s,xn=r._zip_delete=Cr.t,la=r._zip_dir_add=Cr.u,Gi=r._zip_discard=Cr.v,Li=r._zip_error_init_with_code=Cr.w,Na=r._zip_get_error=Cr.x,dn=r._zip_file_get_error=Cr.y,Kn=r._zip_error_strerror=Cr.z,Au=r._zip_fclose=Cr.A,yh=r._zip_file_add=Cr.B,Oa=r._free=Cr.C,La=r._malloc=Cr.D,Ma=r._zip_source_error=Cr.E,$e=r._zip_source_seek=Cr.F,Ua=r._zip_file_set_external_attributes=Cr.G,hf=r._zip_file_set_mtime=Cr.H,lc=r._zip_fopen_index=Cr.I,wn=r._zip_fread=Cr.J,ca=r._zip_get_name=Cr.K,LA=r._zip_get_num_entries=Cr.L,MA=r._zip_source_read=Cr.M,ua=r._zip_name_locate=Cr.N,Bl=r._zip_open_from_source=Cr.O,Mt=r._zip_set_file_compression=Cr.P,kn=r._zip_source_buffer=Cr.Q,fa=r._zip_source_buffer_create=Cr.R,Ha=r._zip_source_close=Cr.S,ns=r._zip_source_free=Cr.T,cc=r._zip_source_keep=Cr.U,pu=r._zip_source_open=Cr.V,uc=r._zip_source_tell=Cr.X,ja=r._zip_stat_index=Cr.Y,Mi=r.__get_tzname=Cr.Z,Is=r.__get_daylight=Cr._,vl=r.__get_timezone=Cr.$,gf=r.stackSave=Cr.aa,fc=r.stackRestore=Cr.ba,wi=r.stackAlloc=Cr.ca;r.cwrap=se,r.getValue=pe;var Qn;on=function Ke(){Qn||Ac(),Qn||(on=Ke)};function Ac(Ke){if(Ke=Ke||f,Ir>0||(Ct(),Ir>0))return;function st(){Qn||(Qn=!0,r.calledRun=!0,!Ce&&(qt(),s(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),ir()))}r.setStatus?(r.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){r.setStatus(\"\")},1),st()},1)):st()}if(r.run=Ac,r.preInit)for(typeof r.preInit==\"function\"&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return Ac(),e}}();typeof wT==\"object\"&&typeof Pj==\"object\"?Pj.exports=bj:typeof define==\"function\"&&define.amd?define([],function(){return bj}):typeof wT==\"object\"&&(wT.createModule=bj)});var Up,hpe,gpe,dpe=Xe(()=>{Up=[\"number\",\"number\"],hpe=(Z=>(Z[Z.ZIP_ER_OK=0]=\"ZIP_ER_OK\",Z[Z.ZIP_ER_MULTIDISK=1]=\"ZIP_ER_MULTIDISK\",Z[Z.ZIP_ER_RENAME=2]=\"ZIP_ER_RENAME\",Z[Z.ZIP_ER_CLOSE=3]=\"ZIP_ER_CLOSE\",Z[Z.ZIP_ER_SEEK=4]=\"ZIP_ER_SEEK\",Z[Z.ZIP_ER_READ=5]=\"ZIP_ER_READ\",Z[Z.ZIP_ER_WRITE=6]=\"ZIP_ER_WRITE\",Z[Z.ZIP_ER_CRC=7]=\"ZIP_ER_CRC\",Z[Z.ZIP_ER_ZIPCLOSED=8]=\"ZIP_ER_ZIPCLOSED\",Z[Z.ZIP_ER_NOENT=9]=\"ZIP_ER_NOENT\",Z[Z.ZIP_ER_EXISTS=10]=\"ZIP_ER_EXISTS\",Z[Z.ZIP_ER_OPEN=11]=\"ZIP_ER_OPEN\",Z[Z.ZIP_ER_TMPOPEN=12]=\"ZIP_ER_TMPOPEN\",Z[Z.ZIP_ER_ZLIB=13]=\"ZIP_ER_ZLIB\",Z[Z.ZIP_ER_MEMORY=14]=\"ZIP_ER_MEMORY\",Z[Z.ZIP_ER_CHANGED=15]=\"ZIP_ER_CHANGED\",Z[Z.ZIP_ER_COMPNOTSUPP=16]=\"ZIP_ER_COMPNOTSUPP\",Z[Z.ZIP_ER_EOF=17]=\"ZIP_ER_EOF\",Z[Z.ZIP_ER_INVAL=18]=\"ZIP_ER_INVAL\",Z[Z.ZIP_ER_NOZIP=19]=\"ZIP_ER_NOZIP\",Z[Z.ZIP_ER_INTERNAL=20]=\"ZIP_ER_INTERNAL\",Z[Z.ZIP_ER_INCONS=21]=\"ZIP_ER_INCONS\",Z[Z.ZIP_ER_REMOVE=22]=\"ZIP_ER_REMOVE\",Z[Z.ZIP_ER_DELETED=23]=\"ZIP_ER_DELETED\",Z[Z.ZIP_ER_ENCRNOTSUPP=24]=\"ZIP_ER_ENCRNOTSUPP\",Z[Z.ZIP_ER_RDONLY=25]=\"ZIP_ER_RDONLY\",Z[Z.ZIP_ER_NOPASSWD=26]=\"ZIP_ER_NOPASSWD\",Z[Z.ZIP_ER_WRONGPASSWD=27]=\"ZIP_ER_WRONGPASSWD\",Z[Z.ZIP_ER_OPNOTSUPP=28]=\"ZIP_ER_OPNOTSUPP\",Z[Z.ZIP_ER_INUSE=29]=\"ZIP_ER_INUSE\",Z[Z.ZIP_ER_TELL=30]=\"ZIP_ER_TELL\",Z[Z.ZIP_ER_COMPRESSED_DATA=31]=\"ZIP_ER_COMPRESSED_DATA\",Z))(hpe||{}),gpe=t=>({get HEAPU8(){return t.HEAPU8},errors:hpe,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_EXCL:2,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:t._malloc(1),uint32S:t._malloc(4),malloc:t._malloc,free:t._free,getValue:t.getValue,openFromSource:t.cwrap(\"zip_open_from_source\",\"number\",[\"number\",\"number\",\"number\"]),close:t.cwrap(\"zip_close\",\"number\",[\"number\"]),discard:t.cwrap(\"zip_discard\",null,[\"number\"]),getError:t.cwrap(\"zip_get_error\",\"number\",[\"number\"]),getName:t.cwrap(\"zip_get_name\",\"string\",[\"number\",\"number\",\"number\"]),getNumEntries:t.cwrap(\"zip_get_num_entries\",\"number\",[\"number\",\"number\"]),delete:t.cwrap(\"zip_delete\",\"number\",[\"number\",\"number\"]),statIndex:t.cwrap(\"zip_stat_index\",\"number\",[\"number\",...Up,\"number\",\"number\"]),fopenIndex:t.cwrap(\"zip_fopen_index\",\"number\",[\"number\",...Up,\"number\"]),fread:t.cwrap(\"zip_fread\",\"number\",[\"number\",\"number\",\"number\",\"number\"]),fclose:t.cwrap(\"zip_fclose\",\"number\",[\"number\"]),dir:{add:t.cwrap(\"zip_dir_add\",\"number\",[\"number\",\"string\"])},file:{add:t.cwrap(\"zip_file_add\",\"number\",[\"number\",\"string\",\"number\",\"number\"]),getError:t.cwrap(\"zip_file_get_error\",\"number\",[\"number\"]),getExternalAttributes:t.cwrap(\"zip_file_get_external_attributes\",\"number\",[\"number\",...Up,\"number\",\"number\",\"number\"]),setExternalAttributes:t.cwrap(\"zip_file_set_external_attributes\",\"number\",[\"number\",...Up,\"number\",\"number\",\"number\"]),setMtime:t.cwrap(\"zip_file_set_mtime\",\"number\",[\"number\",...Up,\"number\",\"number\"]),setCompression:t.cwrap(\"zip_set_file_compression\",\"number\",[\"number\",...Up,\"number\",\"number\"])},ext:{countSymlinks:t.cwrap(\"zip_ext_count_symlinks\",\"number\",[\"number\"])},error:{initWithCode:t.cwrap(\"zip_error_init_with_code\",null,[\"number\",\"number\"]),strerror:t.cwrap(\"zip_error_strerror\",\"string\",[\"number\"])},name:{locate:t.cwrap(\"zip_name_locate\",\"number\",[\"number\",\"string\",\"number\"])},source:{fromUnattachedBuffer:t.cwrap(\"zip_source_buffer_create\",\"number\",[\"number\",...Up,\"number\",\"number\"]),fromBuffer:t.cwrap(\"zip_source_buffer\",\"number\",[\"number\",\"number\",...Up,\"number\"]),free:t.cwrap(\"zip_source_free\",null,[\"number\"]),keep:t.cwrap(\"zip_source_keep\",null,[\"number\"]),open:t.cwrap(\"zip_source_open\",\"number\",[\"number\"]),close:t.cwrap(\"zip_source_close\",\"number\",[\"number\"]),seek:t.cwrap(\"zip_source_seek\",\"number\",[\"number\",...Up,\"number\"]),tell:t.cwrap(\"zip_source_tell\",\"number\",[\"number\"]),read:t.cwrap(\"zip_source_read\",\"number\",[\"number\",\"number\",\"number\"]),error:t.cwrap(\"zip_source_error\",\"number\",[\"number\"])},struct:{statS:t.cwrap(\"zipstruct_statS\",\"number\",[]),statSize:t.cwrap(\"zipstruct_stat_size\",\"number\",[\"number\"]),statCompSize:t.cwrap(\"zipstruct_stat_comp_size\",\"number\",[\"number\"]),statCompMethod:t.cwrap(\"zipstruct_stat_comp_method\",\"number\",[\"number\"]),statMtime:t.cwrap(\"zipstruct_stat_mtime\",\"number\",[\"number\"]),statCrc:t.cwrap(\"zipstruct_stat_crc\",\"number\",[\"number\"]),errorS:t.cwrap(\"zipstruct_errorS\",\"number\",[]),errorCodeZip:t.cwrap(\"zipstruct_error_code_zip\",\"number\",[\"number\"])}})});function xj(t,e){let r=t.indexOf(e);if(r<=0)return null;let s=r;for(;r>=0&&(s=r+e.length,t[s]!==J.sep);){if(t[r-1]===J.sep)return null;r=t.indexOf(e,s)}return t.length>s&&t[s]!==J.sep?null:t.slice(0,s)}var $f,mpe=Xe(()=>{Dt();Dt();eA();$f=class t extends e0{static async openPromise(e,r){let s=new t(r);try{return await e(s)}finally{s.saveAndClose()}}constructor(e={}){let r=e.fileExtensions,s=e.readOnlyArchives,a=typeof r>\"u\"?f=>xj(f,\".zip\"):f=>{for(let p of r){let h=xj(f,p);if(h)return h}return null},n=(f,p)=>new As(p,{baseFs:f,readOnly:s,stats:f.statSync(p),customZipImplementation:e.customZipImplementation}),c=async(f,p)=>{let h={baseFs:f,readOnly:s,stats:await f.statPromise(p),customZipImplementation:e.customZipImplementation};return()=>new As(p,h)};super({...e,factorySync:n,factoryPromise:c,getMountPoint:a})}}});var kj,BI,Qj=Xe(()=>{Dj();kj=class extends Error{constructor(e,r){super(e),this.name=\"Libzip Error\",this.code=r}},BI=class{constructor(e){this.filesShouldBeCached=!0;let r=\"buffer\"in e?e.buffer:e.baseFs.readFileSync(e.path);this.libzip=cv();let s=this.libzip.malloc(4);try{let c=0;e.readOnly&&(c|=this.libzip.ZIP_RDONLY);let f=this.allocateUnattachedSource(r);try{this.zip=this.libzip.openFromSource(f,c,s),this.lzSource=f}catch(p){throw this.libzip.source.free(f),p}if(this.zip===0){let p=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(p,this.libzip.getValue(s,\"i32\")),this.makeLibzipError(p)}}finally{this.libzip.free(s)}let a=this.libzip.getNumEntries(this.zip,0),n=new Array(a);for(let c=0;c<a;++c)n[c]=this.libzip.getName(this.zip,c,0);if(this.listings=n,this.symlinkCount=this.libzip.ext.countSymlinks(this.zip),this.symlinkCount===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}getSymlinkCount(){return this.symlinkCount}getListings(){return this.listings}stat(e){let r=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,e,0,0,r)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.libzip.struct.statSize(r)>>>0,n=this.libzip.struct.statMtime(r)>>>0,c=this.libzip.struct.statCrc(r)>>>0;return{size:a,mtime:n,crc:c}}makeLibzipError(e){let r=this.libzip.struct.errorCodeZip(e),s=this.libzip.error.strerror(e),a=new kj(s,this.libzip.errors[r]);if(r===this.libzip.errors.ZIP_ER_CHANGED)throw new Error(`Assertion failed: Unexpected libzip error: ${a.message}`);return a}setFileSource(e,r,s){let a=this.allocateSource(s);try{let n=this.libzip.file.add(this.zip,e,a,this.libzip.ZIP_FL_OVERWRITE);if(n===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(r!==null&&this.libzip.file.setCompression(this.zip,n,0,r[0],r[1])===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return n}catch(n){throw this.libzip.source.free(a),n}}setMtime(e,r){if(this.libzip.file.setMtime(this.zip,e,0,r,0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}getExternalAttributes(e){if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let s=this.libzip.getValue(this.libzip.uint08S,\"i8\")>>>0,a=this.libzip.getValue(this.libzip.uint32S,\"i32\")>>>0;return[s,a]}setExternalAttributes(e,r,s){if(this.libzip.file.setExternalAttributes(this.zip,e,0,0,r,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}locate(e){return this.libzip.name.locate(this.zip,e,0)}getFileSource(e){let r=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,e,0,0,r)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.libzip.struct.statCompSize(r),n=this.libzip.struct.statCompMethod(r),c=this.libzip.malloc(a);try{let f=this.libzip.fopenIndex(this.zip,e,0,this.libzip.ZIP_FL_COMPRESSED);if(f===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let p=this.libzip.fread(f,c,a,0);if(p===-1)throw this.makeLibzipError(this.libzip.file.getError(f));if(p<a)throw new Error(\"Incomplete read\");if(p>a)throw new Error(\"Overread\");let h=this.libzip.HEAPU8.subarray(c,c+a);return{data:Buffer.from(h),compressionMethod:n}}finally{this.libzip.fclose(f)}}finally{this.libzip.free(c)}}deleteEntry(e){if(this.libzip.delete(this.zip,e)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}addDirectory(e){let r=this.libzip.dir.add(this.zip,e);if(r===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return r}getBufferAndClose(){try{if(this.libzip.source.keep(this.lzSource),this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.libzip.source.open(this.lzSource)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(this.libzip.source.seek(this.lzSource,0,0,this.libzip.SEEK_END)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));let e=this.libzip.source.tell(this.lzSource);if(e===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(this.libzip.source.seek(this.lzSource,0,0,this.libzip.SEEK_SET)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));let r=this.libzip.malloc(e);if(!r)throw new Error(\"Couldn't allocate enough memory\");try{let s=this.libzip.source.read(this.lzSource,r,e);if(s===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(s<e)throw new Error(\"Incomplete read\");if(s>e)throw new Error(\"Overread\");let a=Buffer.from(this.libzip.HEAPU8.subarray(r,r+e));return process.env.YARN_IS_TEST_ENV&&process.env.YARN_ZIP_DATA_EPILOGUE&&(a=Buffer.concat([a,Buffer.from(process.env.YARN_ZIP_DATA_EPILOGUE)])),a}finally{this.libzip.free(r)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource)}}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));let r=this.libzip.malloc(e.byteLength);if(!r)throw new Error(\"Couldn't allocate enough memory\");return new Uint8Array(this.libzip.HEAPU8.buffer,r,e.byteLength).set(e),{buffer:r,byteLength:e.byteLength}}allocateUnattachedSource(e){let r=this.libzip.struct.errorS(),{buffer:s,byteLength:a}=this.allocateBuffer(e),n=this.libzip.source.fromUnattachedBuffer(s,a,0,1,r);if(n===0)throw this.libzip.free(r),this.makeLibzipError(r);return n}allocateSource(e){let{buffer:r,byteLength:s}=this.allocateBuffer(e),a=this.libzip.source.fromBuffer(this.zip,r,s,0,1);if(a===0)throw this.libzip.free(r),this.makeLibzipError(this.libzip.getError(this.zip));return a}discard(){this.libzip.discard(this.zip)}}});function Ynt(t){if(typeof t==\"string\"&&String(+t)===t)return+t;if(typeof t==\"number\"&&Number.isFinite(t))return t<0?Date.now()/1e3:t;if(ype.types.isDate(t))return t.getTime()/1e3;throw new Error(\"Invalid time\")}function BT(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var xa,Tj,ype,Rj,lm,Fj,Nj,Epe,As,vT=Xe(()=>{Dt();Dt();Dt();Dt();Dt();Dt();xa=Ie(\"fs\"),Tj=Ie(\"stream\"),ype=Ie(\"util\"),Rj=ut(Ie(\"zlib\"));Qj();lm=3,Fj=0,Nj=8,Epe=\"mixed\";As=class extends Uf{constructor(r,s={}){super();this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;s.readOnly&&(this.readOnly=!0);let a=s;this.level=typeof a.level<\"u\"?a.level:Epe;let n=s.customZipImplementation??BI;if(typeof r==\"string\"){let{baseFs:f=new Yn}=a;this.baseFs=f,this.path=r}else this.path=null,this.baseFs=null;if(s.stats)this.stats=s.stats;else if(typeof r==\"string\")try{this.stats=this.baseFs.statSync(r)}catch(f){if(f.code===\"ENOENT\"&&a.create)this.stats=$a.makeDefaultStats();else throw f}else this.stats=$a.makeDefaultStats();typeof r==\"string\"?s.create?this.zipImpl=new n({buffer:BT(),readOnly:this.readOnly}):this.zipImpl=new n({path:r,baseFs:this.baseFs,readOnly:this.readOnly,size:this.stats.size}):this.zipImpl=new n({buffer:r??BT(),readOnly:this.readOnly}),this.listings.set(vt.root,new Set);let c=this.zipImpl.getListings();for(let f=0;f<c.length;f++){let p=c[f];if(J.isAbsolute(p))continue;let h=J.resolve(vt.root,p);this.registerEntry(h,f),p.endsWith(\"/\")&&this.registerListing(h)}this.symlinkCount=this.zipImpl.getSymlinkCount(),this.ready=!0}getExtractHint(r){for(let s of this.entries.keys()){let a=this.pathUtils.extname(s);if(r.relevantExtensions.has(a))return!0}return!1}getAllFiles(){return Array.from(this.entries.keys())}getRealPath(){if(!this.path)throw new Error(\"ZipFS don't have real paths when loaded from a buffer\");return this.path}prepareClose(){if(!this.ready)throw or.EBUSY(\"archive closed, close\");yd(this)}getBufferAndClose(){if(this.prepareClose(),this.entries.size===0)return this.discardAndClose(),BT();try{return this.zipImpl.getBufferAndClose()}finally{this.ready=!1}}discardAndClose(){this.prepareClose(),this.zipImpl.discard(),this.ready=!1}saveAndClose(){if(!this.path||!this.baseFs)throw new Error(\"ZipFS cannot be saved and must be discarded when loaded from a buffer\");if(this.readOnly){this.discardAndClose();return}let r=this.baseFs.existsSync(this.path)||this.stats.mode===$a.DEFAULT_MODE?void 0:this.stats.mode;this.baseFs.writeFileSync(this.path,this.getBufferAndClose(),{mode:r}),this.ready=!1}resolve(r){return J.resolve(vt.root,r)}async openPromise(r,s,a){return this.openSync(r,s,a)}openSync(r,s,a){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:r}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(r,s){return this.opendirSync(r,s)}opendirSync(r,s={}){let a=this.resolveFilename(`opendir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw or.ENOENT(`opendir '${r}'`);let n=this.listings.get(a);if(!n)throw or.ENOTDIR(`opendir '${r}'`);let c=[...n],f=this.openSync(a,\"r\");return ex(this,a,c,{onClose:()=>{this.closeSync(f)}})}async readPromise(r,s,a,n,c){return this.readSync(r,s,a,n,c)}readSync(r,s,a=0,n=s.byteLength,c=-1){let f=this.fds.get(r);if(typeof f>\"u\")throw or.EBADF(\"read\");let p=c===-1||c===null?f.cursor:c,h=this.readFileSync(f.p);h.copy(s,a,p,p+n);let E=Math.max(0,Math.min(h.length-p,n));return(c===-1||c===null)&&(f.cursor+=E),E}async writePromise(r,s,a,n,c){return typeof s==\"string\"?this.writeSync(r,s,c):this.writeSync(r,s,a,n,c)}writeSync(r,s,a,n,c){throw typeof this.fds.get(r)>\"u\"?or.EBADF(\"read\"):new Error(\"Unimplemented\")}async closePromise(r){return this.closeSync(r)}closeSync(r){if(typeof this.fds.get(r)>\"u\")throw or.EBADF(\"read\");this.fds.delete(r)}createReadStream(r,{encoding:s}={}){if(r===null)throw new Error(\"Unimplemented\");let a=this.openSync(r,\"r\"),n=Object.assign(new Tj.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(f,p)=>{clearImmediate(c),this.closeSync(a),p(f)}}),{close(){n.destroy()},bytesRead:0,path:r,pending:!1}),c=setImmediate(async()=>{try{let f=await this.readFilePromise(r,s);n.bytesRead=f.length,n.end(f)}catch(f){n.destroy(f)}});return n}createWriteStream(r,{encoding:s}={}){if(this.readOnly)throw or.EROFS(`open '${r}'`);if(r===null)throw new Error(\"Unimplemented\");let a=[],n=this.openSync(r,\"w\"),c=Object.assign(new Tj.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(f,p)=>{try{f?p(f):(this.writeFileSync(r,Buffer.concat(a),s),p(null))}catch(h){p(h)}finally{this.closeSync(n)}}}),{close(){c.destroy()},bytesWritten:0,path:r,pending:!1});return c.on(\"data\",f=>{let p=Buffer.from(f);c.bytesWritten+=p.length,a.push(p)}),c}async realpathPromise(r){return this.realpathSync(r)}realpathSync(r){let s=this.resolveFilename(`lstat '${r}'`,r);if(!this.entries.has(s)&&!this.listings.has(s))throw or.ENOENT(`lstat '${r}'`);return s}async existsPromise(r){return this.existsSync(r)}existsSync(r){if(!this.ready)throw or.EBUSY(`archive closed, existsSync '${r}'`);if(this.symlinkCount===0){let a=J.resolve(vt.root,r);return this.entries.has(a)||this.listings.has(a)}let s;try{s=this.resolveFilename(`stat '${r}'`,r,void 0,!1)}catch{return!1}return s===void 0?!1:this.entries.has(s)||this.listings.has(s)}async accessPromise(r,s){return this.accessSync(r,s)}accessSync(r,s=xa.constants.F_OK){let a=this.resolveFilename(`access '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw or.ENOENT(`access '${r}'`);if(this.readOnly&&s&xa.constants.W_OK)throw or.EROFS(`access '${r}'`)}async statPromise(r,s={bigint:!1}){return s.bigint?this.statSync(r,{bigint:!0}):this.statSync(r)}statSync(r,s={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`stat '${r}'`,r,void 0,s.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(s.throwIfNoEntry===!1)return;throw or.ENOENT(`stat '${r}'`)}if(r[r.length-1]===\"/\"&&!this.listings.has(a))throw or.ENOTDIR(`stat '${r}'`);return this.statImpl(`stat '${r}'`,a,s)}}async fstatPromise(r,s){return this.fstatSync(r,s)}fstatSync(r,s){let a=this.fds.get(r);if(typeof a>\"u\")throw or.EBADF(\"fstatSync\");let{p:n}=a,c=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(c)&&!this.listings.has(c))throw or.ENOENT(`stat '${n}'`);if(n[n.length-1]===\"/\"&&!this.listings.has(c))throw or.ENOTDIR(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,c,s)}async lstatPromise(r,s={bigint:!1}){return s.bigint?this.lstatSync(r,{bigint:!0}):this.lstatSync(r)}lstatSync(r,s={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`lstat '${r}'`,r,!1,s.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(s.throwIfNoEntry===!1)return;throw or.ENOENT(`lstat '${r}'`)}if(r[r.length-1]===\"/\"&&!this.listings.has(a))throw or.ENOTDIR(`lstat '${r}'`);return this.statImpl(`lstat '${r}'`,a,s)}}statImpl(r,s,a={}){let n=this.entries.get(s);if(typeof n<\"u\"){let c=this.zipImpl.stat(n),f=c.crc,p=c.size,h=c.mtime*1e3,E=this.stats.uid,C=this.stats.gid,S=512,P=Math.ceil(c.size/S),I=h,R=h,N=h,U=new Date(I),W=new Date(R),ee=new Date(N),ie=new Date(h),ue=this.listings.has(s)?xa.constants.S_IFDIR:this.isSymbolicLink(n)?xa.constants.S_IFLNK:xa.constants.S_IFREG,le=ue===xa.constants.S_IFDIR?493:420,me=ue|this.getUnixMode(n,le)&511,pe=Object.assign(new $a.StatEntry,{uid:E,gid:C,size:p,blksize:S,blocks:P,atime:U,birthtime:W,ctime:ee,mtime:ie,atimeMs:I,birthtimeMs:R,ctimeMs:N,mtimeMs:h,mode:me,crc:f});return a.bigint===!0?$a.convertToBigIntStats(pe):pe}if(this.listings.has(s)){let c=this.stats.uid,f=this.stats.gid,p=0,h=512,E=0,C=this.stats.mtimeMs,S=this.stats.mtimeMs,P=this.stats.mtimeMs,I=this.stats.mtimeMs,R=new Date(C),N=new Date(S),U=new Date(P),W=new Date(I),ee=xa.constants.S_IFDIR|493,ue=Object.assign(new $a.StatEntry,{uid:c,gid:f,size:p,blksize:h,blocks:E,atime:R,birthtime:N,ctime:U,mtime:W,atimeMs:C,birthtimeMs:S,ctimeMs:P,mtimeMs:I,mode:ee,crc:0});return a.bigint===!0?$a.convertToBigIntStats(ue):ue}throw new Error(\"Unreachable\")}getUnixMode(r,s){let[a,n]=this.zipImpl.getExternalAttributes(r);return a!==lm?s:n>>>16}registerListing(r){let s=this.listings.get(r);if(s)return s;this.registerListing(J.dirname(r)).add(J.basename(r));let n=new Set;return this.listings.set(r,n),n}registerEntry(r,s){this.registerListing(J.dirname(r)).add(J.basename(r)),this.entries.set(r,s)}unregisterListing(r){this.listings.delete(r),this.listings.get(J.dirname(r))?.delete(J.basename(r))}unregisterEntry(r){this.unregisterListing(r);let s=this.entries.get(r);this.entries.delete(r),!(typeof s>\"u\")&&(this.fileSources.delete(s),this.isSymbolicLink(s)&&this.symlinkCount--)}deleteEntry(r,s){this.unregisterEntry(r),this.zipImpl.deleteEntry(s)}resolveFilename(r,s,a=!0,n=!0){if(!this.ready)throw or.EBUSY(`archive closed, ${r}`);let c=J.resolve(vt.root,s);if(c===\"/\")return vt.root;let f=this.entries.get(c);if(a&&f!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(f)){let p=this.getFileSource(f).toString();return this.resolveFilename(r,J.resolve(J.dirname(c),p),!0,n)}else return c;for(;;){let p=this.resolveFilename(r,J.dirname(c),!0,n);if(p===void 0)return p;let h=this.listings.has(p),E=this.entries.has(p);if(!h&&!E){if(n===!1)return;throw or.ENOENT(r)}if(!h)throw or.ENOTDIR(r);if(c=J.resolve(p,J.basename(c)),!a||this.symlinkCount===0)break;let C=this.zipImpl.locate(c.slice(1));if(C===-1)break;if(this.isSymbolicLink(C)){let S=this.getFileSource(C).toString();c=J.resolve(J.dirname(c),S)}else break}return c}setFileSource(r,s){let a=Buffer.isBuffer(s)?s:Buffer.from(s),n=J.relative(vt.root,r),c=null;this.level!==\"mixed\"&&(c=[this.level===0?Fj:Nj,this.level]);let f=this.zipImpl.setFileSource(n,c,a);return this.fileSources.set(f,a),f}isSymbolicLink(r){if(this.symlinkCount===0)return!1;let[s,a]=this.zipImpl.getExternalAttributes(r);return s!==lm?!1:(a>>>16&xa.constants.S_IFMT)===xa.constants.S_IFLNK}getFileSource(r,s={asyncDecompress:!1}){let a=this.fileSources.get(r);if(typeof a<\"u\")return a;let{data:n,compressionMethod:c}=this.zipImpl.getFileSource(r);if(c===Fj)return this.zipImpl.filesShouldBeCached&&this.fileSources.set(r,n),n;if(c===Nj){if(s.asyncDecompress)return new Promise((f,p)=>{Rj.default.inflateRaw(n,(h,E)=>{h?p(h):(this.zipImpl.filesShouldBeCached&&this.fileSources.set(r,E),f(E))})});{let f=Rj.default.inflateRawSync(n);return this.zipImpl.filesShouldBeCached&&this.fileSources.set(r,f),f}}else throw new Error(`Unsupported compression method: ${c}`)}async fchmodPromise(r,s){return this.chmodPromise(this.fdToPath(r,\"fchmod\"),s)}fchmodSync(r,s){return this.chmodSync(this.fdToPath(r,\"fchmodSync\"),s)}async chmodPromise(r,s){return this.chmodSync(r,s)}chmodSync(r,s){if(this.readOnly)throw or.EROFS(`chmod '${r}'`);s&=493;let a=this.resolveFilename(`chmod '${r}'`,r,!1),n=this.entries.get(a);if(typeof n>\"u\")throw new Error(`Assertion failed: The entry should have been registered (${a})`);let f=this.getUnixMode(n,xa.constants.S_IFREG|0)&-512|s;this.zipImpl.setExternalAttributes(n,lm,f<<16)}async fchownPromise(r,s,a){return this.chownPromise(this.fdToPath(r,\"fchown\"),s,a)}fchownSync(r,s,a){return this.chownSync(this.fdToPath(r,\"fchownSync\"),s,a)}async chownPromise(r,s,a){return this.chownSync(r,s,a)}chownSync(r,s,a){throw new Error(\"Unimplemented\")}async renamePromise(r,s){return this.renameSync(r,s)}renameSync(r,s){throw new Error(\"Unimplemented\")}async copyFilePromise(r,s,a){let{indexSource:n,indexDest:c,resolvedDestP:f}=this.prepareCopyFile(r,s,a),p=await this.getFileSource(n,{asyncDecompress:!0}),h=this.setFileSource(f,p);h!==c&&this.registerEntry(f,h)}copyFileSync(r,s,a=0){let{indexSource:n,indexDest:c,resolvedDestP:f}=this.prepareCopyFile(r,s,a),p=this.getFileSource(n),h=this.setFileSource(f,p);h!==c&&this.registerEntry(f,h)}prepareCopyFile(r,s,a=0){if(this.readOnly)throw or.EROFS(`copyfile '${r} -> '${s}'`);if(a&xa.constants.COPYFILE_FICLONE_FORCE)throw or.ENOSYS(\"unsupported clone operation\",`copyfile '${r}' -> ${s}'`);let n=this.resolveFilename(`copyfile '${r} -> ${s}'`,r),c=this.entries.get(n);if(typeof c>\"u\")throw or.EINVAL(`copyfile '${r}' -> '${s}'`);let f=this.resolveFilename(`copyfile '${r}' -> ${s}'`,s),p=this.entries.get(f);if(a&(xa.constants.COPYFILE_EXCL|xa.constants.COPYFILE_FICLONE_FORCE)&&typeof p<\"u\")throw or.EEXIST(`copyfile '${r}' -> '${s}'`);return{indexSource:c,resolvedDestP:f,indexDest:p}}async appendFilePromise(r,s,a){if(this.readOnly)throw or.EROFS(`open '${r}'`);return typeof a>\"u\"?a={flag:\"a\"}:typeof a==\"string\"?a={flag:\"a\",encoding:a}:typeof a.flag>\"u\"&&(a={flag:\"a\",...a}),this.writeFilePromise(r,s,a)}appendFileSync(r,s,a={}){if(this.readOnly)throw or.EROFS(`open '${r}'`);return typeof a>\"u\"?a={flag:\"a\"}:typeof a==\"string\"?a={flag:\"a\",encoding:a}:typeof a.flag>\"u\"&&(a={flag:\"a\",...a}),this.writeFileSync(r,s,a)}fdToPath(r,s){let a=this.fds.get(r)?.p;if(typeof a>\"u\")throw or.EBADF(s);return a}async writeFilePromise(r,s,a){let{encoding:n,mode:c,index:f,resolvedP:p}=this.prepareWriteFile(r,a);f!==void 0&&typeof a==\"object\"&&a.flag&&a.flag.includes(\"a\")&&(s=Buffer.concat([await this.getFileSource(f,{asyncDecompress:!0}),Buffer.from(s)])),n!==null&&(s=s.toString(n));let h=this.setFileSource(p,s);h!==f&&this.registerEntry(p,h),c!==null&&await this.chmodPromise(p,c)}writeFileSync(r,s,a){let{encoding:n,mode:c,index:f,resolvedP:p}=this.prepareWriteFile(r,a);f!==void 0&&typeof a==\"object\"&&a.flag&&a.flag.includes(\"a\")&&(s=Buffer.concat([this.getFileSource(f),Buffer.from(s)])),n!==null&&(s=s.toString(n));let h=this.setFileSource(p,s);h!==f&&this.registerEntry(p,h),c!==null&&this.chmodSync(p,c)}prepareWriteFile(r,s){if(typeof r==\"number\"&&(r=this.fdToPath(r,\"read\")),this.readOnly)throw or.EROFS(`open '${r}'`);let a=this.resolveFilename(`open '${r}'`,r);if(this.listings.has(a))throw or.EISDIR(`open '${r}'`);let n=null,c=null;typeof s==\"string\"?n=s:typeof s==\"object\"&&({encoding:n=null,mode:c=null}=s);let f=this.entries.get(a);return{encoding:n,mode:c,resolvedP:a,index:f}}async unlinkPromise(r){return this.unlinkSync(r)}unlinkSync(r){if(this.readOnly)throw or.EROFS(`unlink '${r}'`);let s=this.resolveFilename(`unlink '${r}'`,r);if(this.listings.has(s))throw or.EISDIR(`unlink '${r}'`);let a=this.entries.get(s);if(typeof a>\"u\")throw or.EINVAL(`unlink '${r}'`);this.deleteEntry(s,a)}async utimesPromise(r,s,a){return this.utimesSync(r,s,a)}utimesSync(r,s,a){if(this.readOnly)throw or.EROFS(`utimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r);this.utimesImpl(n,a)}async lutimesPromise(r,s,a){return this.lutimesSync(r,s,a)}lutimesSync(r,s,a){if(this.readOnly)throw or.EROFS(`lutimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r,!1);this.utimesImpl(n,a)}utimesImpl(r,s){this.listings.has(r)&&(this.entries.has(r)||this.hydrateDirectory(r));let a=this.entries.get(r);if(a===void 0)throw new Error(\"Unreachable\");this.zipImpl.setMtime(a,Ynt(s))}async mkdirPromise(r,s){return this.mkdirSync(r,s)}mkdirSync(r,{mode:s=493,recursive:a=!1}={}){if(a)return this.mkdirpSync(r,{chmod:s});if(this.readOnly)throw or.EROFS(`mkdir '${r}'`);let n=this.resolveFilename(`mkdir '${r}'`,r);if(this.entries.has(n)||this.listings.has(n))throw or.EEXIST(`mkdir '${r}'`);this.hydrateDirectory(n),this.chmodSync(n,s)}async rmdirPromise(r,s){return this.rmdirSync(r,s)}rmdirSync(r,{recursive:s=!1}={}){if(this.readOnly)throw or.EROFS(`rmdir '${r}'`);if(s){this.removeSync(r);return}let a=this.resolveFilename(`rmdir '${r}'`,r),n=this.listings.get(a);if(!n)throw or.ENOTDIR(`rmdir '${r}'`);if(n.size>0)throw or.ENOTEMPTY(`rmdir '${r}'`);let c=this.entries.get(a);if(typeof c>\"u\")throw or.EINVAL(`rmdir '${r}'`);this.deleteEntry(r,c)}async rmPromise(r,s){return this.rmSync(r,s)}rmSync(r,{recursive:s=!1}={}){if(this.readOnly)throw or.EROFS(`rm '${r}'`);if(s){this.removeSync(r);return}let a=this.resolveFilename(`rm '${r}'`,r),n=this.listings.get(a);if(!n)throw or.ENOTDIR(`rm '${r}'`);if(n.size>0)throw or.ENOTEMPTY(`rm '${r}'`);let c=this.entries.get(a);if(typeof c>\"u\")throw or.EINVAL(`rm '${r}'`);this.deleteEntry(r,c)}hydrateDirectory(r){let s=this.zipImpl.addDirectory(J.relative(vt.root,r));return this.registerListing(r),this.registerEntry(r,s),s}async linkPromise(r,s){return this.linkSync(r,s)}linkSync(r,s){throw or.EOPNOTSUPP(`link '${r}' -> '${s}'`)}async symlinkPromise(r,s){return this.symlinkSync(r,s)}symlinkSync(r,s){if(this.readOnly)throw or.EROFS(`symlink '${r}' -> '${s}'`);let a=this.resolveFilename(`symlink '${r}' -> '${s}'`,s);if(this.listings.has(a))throw or.EISDIR(`symlink '${r}' -> '${s}'`);if(this.entries.has(a))throw or.EEXIST(`symlink '${r}' -> '${s}'`);let n=this.setFileSource(a,r);this.registerEntry(a,n),this.zipImpl.setExternalAttributes(n,lm,(xa.constants.S_IFLNK|511)<<16),this.symlinkCount+=1}async readFilePromise(r,s){typeof s==\"object\"&&(s=s?s.encoding:void 0);let a=await this.readFileBuffer(r,{asyncDecompress:!0});return s?a.toString(s):a}readFileSync(r,s){typeof s==\"object\"&&(s=s?s.encoding:void 0);let a=this.readFileBuffer(r);return s?a.toString(s):a}readFileBuffer(r,s={asyncDecompress:!1}){typeof r==\"number\"&&(r=this.fdToPath(r,\"read\"));let a=this.resolveFilename(`open '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw or.ENOENT(`open '${r}'`);if(r[r.length-1]===\"/\"&&!this.listings.has(a))throw or.ENOTDIR(`open '${r}'`);if(this.listings.has(a))throw or.EISDIR(\"read\");let n=this.entries.get(a);if(n===void 0)throw new Error(\"Unreachable\");return this.getFileSource(n,s)}async readdirPromise(r,s){return this.readdirSync(r,s)}readdirSync(r,s){let a=this.resolveFilename(`scandir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw or.ENOENT(`scandir '${r}'`);let n=this.listings.get(a);if(!n)throw or.ENOTDIR(`scandir '${r}'`);if(s?.recursive)if(s?.withFileTypes){let c=Array.from(n,f=>Object.assign(this.statImpl(\"lstat\",J.join(r,f)),{name:f,path:vt.dot,parentPath:vt.dot}));for(let f of c){if(!f.isDirectory())continue;let p=J.join(f.path,f.name),h=this.listings.get(J.join(a,p));for(let E of h)c.push(Object.assign(this.statImpl(\"lstat\",J.join(r,p,E)),{name:E,path:p,parentPath:p}))}return c}else{let c=[...n];for(let f of c){let p=this.listings.get(J.join(a,f));if(!(typeof p>\"u\"))for(let h of p)c.push(J.join(f,h))}return c}else return s?.withFileTypes?Array.from(n,c=>Object.assign(this.statImpl(\"lstat\",J.join(r,c)),{name:c,path:void 0,parentPath:void 0})):[...n]}async readlinkPromise(r){let s=this.prepareReadlink(r);return(await this.getFileSource(s,{asyncDecompress:!0})).toString()}readlinkSync(r){let s=this.prepareReadlink(r);return this.getFileSource(s).toString()}prepareReadlink(r){let s=this.resolveFilename(`readlink '${r}'`,r,!1);if(!this.entries.has(s)&&!this.listings.has(s))throw or.ENOENT(`readlink '${r}'`);if(r[r.length-1]===\"/\"&&!this.listings.has(s))throw or.ENOTDIR(`open '${r}'`);if(this.listings.has(s))throw or.EINVAL(`readlink '${r}'`);let a=this.entries.get(s);if(a===void 0)throw new Error(\"Unreachable\");if(!this.isSymbolicLink(a))throw or.EINVAL(`readlink '${r}'`);return a}async truncatePromise(r,s=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>\"u\")throw or.EINVAL(`open '${r}'`);let c=await this.getFileSource(n,{asyncDecompress:!0}),f=Buffer.alloc(s,0);return c.copy(f),await this.writeFilePromise(r,f)}truncateSync(r,s=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>\"u\")throw or.EINVAL(`open '${r}'`);let c=this.getFileSource(n),f=Buffer.alloc(s,0);return c.copy(f),this.writeFileSync(r,f)}async ftruncatePromise(r,s){return this.truncatePromise(this.fdToPath(r,\"ftruncate\"),s)}ftruncateSync(r,s){return this.truncateSync(this.fdToPath(r,\"ftruncateSync\"),s)}watch(r,s,a){let n;switch(typeof s){case\"function\":case\"string\":case\"undefined\":n=!0;break;default:({persistent:n=!0}=s);break}if(!n)return{on:()=>{},close:()=>{}};let c=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(c)}}}watchFile(r,s,a){let n=J.resolve(vt.root,r);return sE(this,n,s,a)}unwatchFile(r,s){let a=J.resolve(vt.root,r);return md(this,a,s)}}});function Cpe(t,e,r=Buffer.alloc(0),s){let a=new As(r),n=C=>C===e||C.startsWith(`${e}/`)?C.slice(0,e.length):null,c=async(C,S)=>()=>a,f=(C,S)=>a,p={...t},h=new Yn(p),E=new e0({baseFs:h,getMountPoint:n,factoryPromise:c,factorySync:f,magicByte:21,maxAge:1/0,typeCheck:s?.typeCheck});return U2(Ipe.default,new t0(E)),a}var Ipe,wpe=Xe(()=>{Dt();Ipe=ut(Ie(\"fs\"));vT()});var Bpe=Xe(()=>{mpe();vT();wpe()});var Oj,uv,ST,vpe=Xe(()=>{Dt();vT();Oj={CENTRAL_DIRECTORY:33639248,END_OF_CENTRAL_DIRECTORY:101010256},uv=22,ST=class t{constructor(e){this.filesShouldBeCached=!1;if(\"buffer\"in e)throw new Error(\"Buffer based zip archives are not supported\");if(!e.readOnly)throw new Error(\"Writable zip archives are not supported\");this.baseFs=e.baseFs,this.fd=this.baseFs.openSync(e.path,\"r\");try{this.entries=t.readZipSync(this.fd,this.baseFs,e.size)}catch(r){throw this.baseFs.closeSync(this.fd),this.fd=\"closed\",r}}static readZipSync(e,r,s){if(s<uv)throw new Error(\"Invalid ZIP file: EOCD not found\");let a=-1,n=Buffer.alloc(uv);if(r.readSync(e,n,0,uv,s-uv),n.readUInt32LE(0)===Oj.END_OF_CENTRAL_DIRECTORY)a=0;else{let R=Math.min(65557,s);n=Buffer.alloc(R),r.readSync(e,n,0,R,Math.max(0,s-R));for(let N=n.length-4;N>=0;N--)if(n.readUInt32LE(N)===Oj.END_OF_CENTRAL_DIRECTORY){a=N;break}if(a===-1)throw new Error(\"Not a zip archive\")}let c=n.readUInt16LE(a+10),f=n.readUInt32LE(a+12),p=n.readUInt32LE(a+16),h=n.readUInt16LE(a+20);if(a+h+uv>n.length)throw new Error(\"Zip archive inconsistent\");if(c==65535||f==4294967295||p==4294967295)throw new Error(\"Zip 64 is not supported\");if(f>s)throw new Error(\"Zip archive inconsistent\");if(c>f/46)throw new Error(\"Zip archive inconsistent\");let E=Buffer.alloc(f);if(r.readSync(e,E,0,E.length,p)!==E.length)throw new Error(\"Zip archive inconsistent\");let C=[],S=0,P=0,I=0;for(;P<c;){if(S+46>E.length)throw new Error(\"Zip archive inconsistent\");if(E.readUInt32LE(S)!==Oj.CENTRAL_DIRECTORY)throw new Error(\"Zip archive inconsistent\");let N=E.readUInt16LE(S+4)>>>8;if(E.readUInt16LE(S+8)&1)throw new Error(\"Encrypted zip files are not supported\");let W=E.readUInt16LE(S+10),ee=E.readUInt32LE(S+16),ie=E.readUInt16LE(S+28),ue=E.readUInt16LE(S+30),le=E.readUInt16LE(S+32),me=E.readUInt32LE(S+42),pe=E.toString(\"utf8\",S+46,S+46+ie).replaceAll(\"\\0\",\" \");if(pe.includes(\"\\0\"))throw new Error(\"Invalid ZIP file\");let Be=E.readUInt32LE(S+20),Ce=E.readUInt32LE(S+38);C.push({name:pe,os:N,mtime:fi.SAFE_TIME,crc:ee,compressionMethod:W,isSymbolicLink:N===lm&&(Ce>>>16&fi.S_IFMT)===fi.S_IFLNK,size:E.readUInt32LE(S+24),compressedSize:Be,externalAttributes:Ce,localHeaderOffset:me}),I+=Be,P+=1,S+=46+ie+ue+le}if(I>s)throw new Error(\"Zip archive inconsistent\");if(S!==E.length)throw new Error(\"Zip archive inconsistent\");return C}getExternalAttributes(e){let r=this.entries[e];return[r.os,r.externalAttributes]}getListings(){return this.entries.map(e=>e.name)}getSymlinkCount(){let e=0;for(let r of this.entries)r.isSymbolicLink&&(e+=1);return e}stat(e){let r=this.entries[e];return{crc:r.crc,mtime:r.mtime,size:r.size}}locate(e){for(let r=0;r<this.entries.length;r++)if(this.entries[r].name===e)return r;return-1}getFileSource(e){if(this.fd===\"closed\")throw new Error(\"ZIP file is closed\");let r=this.entries[e],s=Buffer.alloc(30);this.baseFs.readSync(this.fd,s,0,s.length,r.localHeaderOffset);let a=s.readUInt16LE(26),n=s.readUInt16LE(28),c=Buffer.alloc(r.compressedSize);if(this.baseFs.readSync(this.fd,c,0,r.compressedSize,r.localHeaderOffset+30+a+n)!==r.compressedSize)throw new Error(\"Invalid ZIP file\");return{data:c,compressionMethod:r.compressionMethod}}discard(){this.fd!==\"closed\"&&(this.baseFs.closeSync(this.fd),this.fd=\"closed\")}addDirectory(e){throw new Error(\"Not implemented\")}deleteEntry(e){throw new Error(\"Not implemented\")}setMtime(e,r){throw new Error(\"Not implemented\")}getBufferAndClose(){throw new Error(\"Not implemented\")}setFileSource(e,r,s){throw new Error(\"Not implemented\")}setExternalAttributes(e,r,s){throw new Error(\"Not implemented\")}}});var fv={};Vt(fv,{DEFAULT_COMPRESSION_LEVEL:()=>Epe,DEFLATE:()=>Nj,JsZipImpl:()=>ST,LibZipImpl:()=>BI,STORE:()=>Fj,ZIP_UNIX:()=>lm,ZipFS:()=>As,ZipOpenFS:()=>$f,getArchivePart:()=>xj,getLibzipPromise:()=>Jnt,getLibzipSync:()=>Vnt,makeEmptyArchive:()=>BT,mountMemoryDrive:()=>Cpe});function Vnt(){return cv()}async function Jnt(){return cv()}var Spe,eA=Xe(()=>{Dj();Spe=ut(ppe());dpe();Bpe();vpe();Qj();Ape(()=>{let t=(0,Spe.default)();return gpe(t)})});var Av,Dpe=Xe(()=>{Dt();Yt();pv();Av=class extends ot{constructor(){super(...arguments);this.cwd=ge.String(\"--cwd\",process.cwd(),{description:\"The directory to run the command in\"});this.commandName=ge.String();this.args=ge.Proxy()}static{this.usage={description:\"run a command using yarn's portable shell\",details:`\n      This command will run a command using Yarn's portable shell.\n\n      Make sure to escape glob patterns, redirections, and other features that might be expanded by your own shell.\n\n      Note: To escape something from Yarn's shell, you might have to escape it twice, the first time from your own shell.\n\n      Note: Don't use this command in Yarn scripts, as Yarn's shell is automatically used.\n\n      For a list of features, visit: https://github.com/yarnpkg/berry/blob/master/packages/yarnpkg-shell/README.md.\n    `,examples:[[\"Run a simple command\",\"$0 echo Hello\"],[\"Run a command with a glob pattern\",\"$0 echo '*.js'\"],[\"Run a command with a redirection\",\"$0 echo Hello World '>' hello.txt\"],[\"Run a command with an escaped glob pattern (The double escape is needed in Unix shells)\",`$0 echo '\"*.js\"'`],[\"Run a command with a variable (Double quotes are needed in Unix shells, to prevent them from expanding the variable)\",'$0 \"GREETING=Hello echo $GREETING World\"']]}}async execute(){let r=this.args.length>0?`${this.commandName} ${this.args.join(\" \")}`:this.commandName;return await vI(r,[],{cwd:fe.toPortablePath(this.cwd),stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}}});var Vl,bpe=Xe(()=>{Vl=class extends Error{constructor(e){super(e),this.name=\"ShellError\"}}});var PT={};Vt(PT,{fastGlobOptions:()=>kpe,isBraceExpansion:()=>Lj,isGlobPattern:()=>Knt,match:()=>znt,micromatchOptions:()=>bT});function Knt(t){if(!DT.default.scan(t,bT).isGlob)return!1;try{DT.default.parse(t,bT)}catch{return!1}return!0}function znt(t,{cwd:e,baseFs:r}){return(0,Ppe.default)(t,{...kpe,cwd:fe.fromPortablePath(e),fs:ax(xpe.default,new t0(r))})}function Lj(t){return DT.default.scan(t,bT).isBrace}var Ppe,xpe,DT,bT,kpe,Qpe=Xe(()=>{Dt();Ppe=ut(BQ()),xpe=ut(Ie(\"fs\")),DT=ut(Go()),bT={strictBrackets:!0},kpe={onlyDirectories:!1,onlyFiles:!1}});function Mj(){}function Uj(){for(let t of cm)t.kill()}function Npe(t,e,r,s){return a=>{let n=a[0]instanceof tA.Transform?\"pipe\":a[0],c=a[1]instanceof tA.Transform?\"pipe\":a[1],f=a[2]instanceof tA.Transform?\"pipe\":a[2],p=(0,Rpe.default)(t,e,{...s,stdio:[n,c,f]});return cm.add(p),cm.size===1&&(process.on(\"SIGINT\",Mj),process.on(\"SIGTERM\",Uj)),a[0]instanceof tA.Transform&&a[0].pipe(p.stdin),a[1]instanceof tA.Transform&&p.stdout.pipe(a[1],{end:!1}),a[2]instanceof tA.Transform&&p.stderr.pipe(a[2],{end:!1}),{stdin:p.stdin,promise:new Promise(h=>{p.on(\"error\",E=>{switch(cm.delete(p),cm.size===0&&(process.off(\"SIGINT\",Mj),process.off(\"SIGTERM\",Uj)),E.code){case\"ENOENT\":a[2].write(`command not found: ${t}\n`),h(127);break;case\"EACCES\":a[2].write(`permission denied: ${t}\n`),h(128);break;default:a[2].write(`uncaught error: ${E.message}\n`),h(1);break}}),p.on(\"close\",E=>{cm.delete(p),cm.size===0&&(process.off(\"SIGINT\",Mj),process.off(\"SIGTERM\",Uj)),h(E!==null?E:129)})})}}}function Ope(t){return e=>{let r=e[0]===\"pipe\"?new tA.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}function xT(t,e){return Hj.start(t,e)}function Tpe(t,e=null){let r=new tA.PassThrough,s=new Fpe.StringDecoder,a=\"\";return r.on(\"data\",n=>{let c=s.write(n),f;do if(f=c.indexOf(`\n`),f!==-1){let p=a+c.substring(0,f);c=c.substring(f+1),a=\"\",t(e!==null?`${e} ${p}`:p)}while(f!==-1);a+=c}),r.on(\"end\",()=>{let n=s.end();n!==\"\"&&t(e!==null?`${e} ${n}`:n)}),r}function Lpe(t,{prefix:e}){return{stdout:Tpe(r=>t.stdout.write(`${r}\n`),t.stdout.isTTY?e:null),stderr:Tpe(r=>t.stderr.write(`${r}\n`),t.stderr.isTTY?e:null)}}var Rpe,tA,Fpe,cm,Oc,_j,Hj,jj=Xe(()=>{Rpe=ut(_U()),tA=Ie(\"stream\"),Fpe=Ie(\"string_decoder\"),cm=new Set;Oc=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},_j=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error(\"Assertion failed: No stream attached\");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error(\"Assertion failed: No stream attached\");return this.stream}},Hj=class t{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:s,stderr:a}){let n=new t(null,e);return n.stdin=r,n.stdout=s,n.stderr=a,n}pipeTo(e,r=1){let s=new t(this,e),a=new _j;return s.pipe=a,s.stdout=this.stdout,s.stderr=this.stderr,(r&1)===1?this.stdout=a:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)===2?this.stderr=a:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),s}async exec(){let e=[\"ignore\",\"ignore\",\"ignore\"];if(this.pipe)e[0]=\"pipe\";else{if(this.stdin===null)throw new Error(\"Assertion failed: No input stream registered\");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error(\"Assertion failed: No output stream registered\");r=this.stdout,e[1]=r.get();let s;if(this.stderr===null)throw new Error(\"Assertion failed: No error stream registered\");s=this.stderr,e[2]=s.get();let a=this.implementation(e);return this.pipe&&this.pipe.attach(a.stdin),await a.promise.then(n=>(r.close(),s.close(),n))}async run(){let e=[];for(let s=this;s;s=s.ancestor)e.push(s.exec());return(await Promise.all(e))[0]}}});var mv={};Vt(mv,{EntryCommand:()=>Av,ShellError:()=>Vl,execute:()=>vI,globUtils:()=>PT});function Mpe(t,e,r){let s=new Jl.PassThrough({autoDestroy:!0});switch(t){case 0:(e&1)===1&&r.stdin.pipe(s,{end:!1}),(e&2)===2&&r.stdin instanceof Jl.Writable&&s.pipe(r.stdin,{end:!1});break;case 1:(e&1)===1&&r.stdout.pipe(s,{end:!1}),(e&2)===2&&s.pipe(r.stdout,{end:!1});break;case 2:(e&1)===1&&r.stderr.pipe(s,{end:!1}),(e&2)===2&&s.pipe(r.stderr,{end:!1});break;default:throw new Vl(`Bad file descriptor: \"${t}\"`)}return s}function QT(t,e={}){let r={...t,...e};return r.environment={...t.environment,...e.environment},r.variables={...t.variables,...e.variables},r}async function Znt(t,e,r){let s=[],a=new Jl.PassThrough;return a.on(\"data\",n=>s.push(n)),await TT(t,e,QT(r,{stdout:a})),Buffer.concat(s).toString().replace(/[\\r\\n]+$/,\"\")}async function Upe(t,e,r){let s=t.map(async n=>{let c=await um(n.args,e,r);return{name:n.name,value:c.join(\" \")}});return(await Promise.all(s)).reduce((n,c)=>(n[c.name]=c.value,n),{})}function kT(t){return t.match(/[^ \\r\\n\\t]+/g)||[]}async function Wpe(t,e,r,s,a=s){switch(t.name){case\"$\":s(String(process.pid));break;case\"#\":s(String(e.args.length));break;case\"@\":if(t.quoted)for(let n of e.args)a(n);else for(let n of e.args){let c=kT(n);for(let f=0;f<c.length-1;++f)a(c[f]);s(c[c.length-1])}break;case\"*\":{let n=e.args.join(\" \");if(t.quoted)s(n);else for(let c of kT(n))a(c)}break;case\"PPID\":s(String(process.ppid));break;case\"RANDOM\":s(String(Math.floor(Math.random()*32768)));break;default:{let n=parseInt(t.name,10),c,f=Number.isFinite(n);if(f?n>=0&&n<e.args.length&&(c=e.args[n]):Object.hasOwn(r.variables,t.name)?c=r.variables[t.name]:Object.hasOwn(r.environment,t.name)&&(c=r.environment[t.name]),typeof c<\"u\"&&t.alternativeValue?c=(await um(t.alternativeValue,e,r)).join(\" \"):typeof c>\"u\"&&(t.defaultValue?c=(await um(t.defaultValue,e,r)).join(\" \"):t.alternativeValue&&(c=\"\")),typeof c>\"u\")throw f?new Vl(`Unbound argument #${n}`):new Vl(`Unbound variable \"${t.name}\"`);if(t.quoted)s(c);else{let p=kT(c);for(let E=0;E<p.length-1;++E)a(p[E]);let h=p[p.length-1];typeof h<\"u\"&&s(h)}}break}}async function hv(t,e,r){if(t.type===\"number\"){if(Number.isInteger(t.value))return t.value;throw new Error(`Invalid number: \"${t.value}\", only integers are allowed`)}else if(t.type===\"variable\"){let s=[];await Wpe({...t,quoted:!0},e,r,n=>s.push(n));let a=Number(s.join(\" \"));return Number.isNaN(a)?hv({type:\"variable\",name:s.join(\" \")},e,r):hv({type:\"number\",value:a},e,r)}else return $nt[t.type](await hv(t.left,e,r),await hv(t.right,e,r))}async function um(t,e,r){let s=new Map,a=[],n=[],c=E=>{n.push(E)},f=()=>{n.length>0&&a.push(n.join(\"\")),n=[]},p=E=>{c(E),f()},h=(E,C,S)=>{let P=JSON.stringify({type:E,fd:C}),I=s.get(P);typeof I>\"u\"&&s.set(P,I=[]),I.push(S)};for(let E of t){let C=!1;switch(E.type){case\"redirection\":{let S=await um(E.args,e,r);for(let P of S)h(E.subtype,E.fd,P)}break;case\"argument\":for(let S of E.segments)switch(S.type){case\"text\":c(S.text);break;case\"glob\":c(S.pattern),C=!0;break;case\"shell\":{let P=await Znt(S.shell,e,r);if(S.quoted)c(P);else{let I=kT(P);for(let R=0;R<I.length-1;++R)p(I[R]);c(I[I.length-1])}}break;case\"variable\":await Wpe(S,e,r,c,p);break;case\"arithmetic\":c(String(await hv(S.arithmetic,e,r)));break}break}if(f(),C){let S=a.pop();if(typeof S>\"u\")throw new Error(\"Assertion failed: Expected a glob pattern to have been set\");let P=await e.glob.match(S,{cwd:r.cwd,baseFs:e.baseFs});if(P.length===0){let I=Lj(S)?\". Note: Brace expansion of arbitrary strings isn't currently supported. For more details, please read this issue: https://github.com/yarnpkg/berry/issues/22\":\"\";throw new Vl(`No matches found: \"${S}\"${I}`)}for(let I of P.sort())p(I)}}if(s.size>0){let E=[];for(let[C,S]of s.entries())E.splice(E.length,0,C,String(S.length),...S);a.splice(0,0,\"__ysh_set_redirects\",...E,\"--\")}return a}function gv(t,e,r){e.builtins.has(t[0])||(t=[\"command\",...t]);let s=fe.fromPortablePath(r.cwd),a=r.environment;typeof a.PWD<\"u\"&&(a={...a,PWD:s});let[n,...c]=t;if(n===\"command\")return Npe(c[0],c.slice(1),e,{cwd:s,env:a});let f=e.builtins.get(n);if(typeof f>\"u\")throw new Error(`Assertion failed: A builtin should exist for \"${n}\"`);return Ope(async({stdin:p,stdout:h,stderr:E})=>{let{stdin:C,stdout:S,stderr:P}=r;r.stdin=p,r.stdout=h,r.stderr=E;try{return await f(c,e,r)}finally{r.stdin=C,r.stdout=S,r.stderr=P}})}function eit(t,e,r){return s=>{let a=new Jl.PassThrough,n=TT(t,e,QT(r,{stdin:a}));return{stdin:a,promise:n}}}function tit(t,e,r){return s=>{let a=new Jl.PassThrough,n=TT(t,e,r);return{stdin:a,promise:n}}}function _pe(t,e,r,s){if(e.length===0)return t;{let a;do a=String(Math.random());while(Object.hasOwn(s.procedures,a));return s.procedures={...s.procedures},s.procedures[a]=t,gv([...e,\"__ysh_run_procedure\",a],r,s)}}async function Hpe(t,e,r){let s=t,a=null,n=null;for(;s;){let c=s.then?{...r}:r,f;switch(s.type){case\"command\":{let p=await um(s.args,e,r),h=await Upe(s.envs,e,r);f=s.envs.length?gv(p,e,QT(c,{environment:h})):gv(p,e,c)}break;case\"subshell\":{let p=await um(s.args,e,r),h=eit(s.subshell,e,c);f=_pe(h,p,e,c)}break;case\"group\":{let p=await um(s.args,e,r),h=tit(s.group,e,c);f=_pe(h,p,e,c)}break;case\"envs\":{let p=await Upe(s.envs,e,r);c.environment={...c.environment,...p},f=gv([\"true\"],e,c)}break}if(typeof f>\"u\")throw new Error(\"Assertion failed: An action should have been generated\");if(a===null)n=xT(f,{stdin:new Oc(c.stdin),stdout:new Oc(c.stdout),stderr:new Oc(c.stderr)});else{if(n===null)throw new Error(\"Assertion failed: The execution pipeline should have been setup\");switch(a){case\"|\":n=n.pipeTo(f,1);break;case\"|&\":n=n.pipeTo(f,3);break}}s.then?(a=s.then.type,s=s.then.chain):s=null}if(n===null)throw new Error(\"Assertion failed: The execution pipeline should have been setup\");return await n.run()}async function rit(t,e,r,{background:s=!1}={}){function a(n){let c=[\"#2E86AB\",\"#A23B72\",\"#F18F01\",\"#C73E1D\",\"#CCE2A3\"],f=c[n%c.length];return jpe.default.hex(f)}if(s){let n=r.nextBackgroundJobIndex++,c=a(n),f=`[${n}]`,p=c(f),{stdout:h,stderr:E}=Lpe(r,{prefix:p});return r.backgroundJobs.push(Hpe(t,e,QT(r,{stdout:h,stderr:E})).catch(C=>E.write(`${C.message}\n`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${p}, '${c(AE(t))}' has ended\n`)})),0}return await Hpe(t,e,r)}async function nit(t,e,r,{background:s=!1}={}){let a,n=f=>{a=f,r.variables[\"?\"]=String(f)},c=async f=>{try{return await rit(f.chain,e,r,{background:s&&typeof f.then>\"u\"})}catch(p){if(!(p instanceof Vl))throw p;return r.stderr.write(`${p.message}\n`),1}};for(n(await c(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case\"&&\":a===0&&n(await c(t.then.line));break;case\"||\":a!==0&&n(await c(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: \"${t.then.type}\"`)}t=t.then.line}return a}async function TT(t,e,r){let s=r.backgroundJobs;r.backgroundJobs=[];let a=0;for(let{command:n,type:c}of t){if(a=await nit(n,e,r,{background:c===\"&\"}),r.exitCode!==null)return r.exitCode;r.variables[\"?\"]=String(a)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=s,a}function Ype(t){switch(t.type){case\"variable\":return t.name===\"@\"||t.name===\"#\"||t.name===\"*\"||Number.isFinite(parseInt(t.name,10))||\"defaultValue\"in t&&!!t.defaultValue&&t.defaultValue.some(e=>dv(e))||\"alternativeValue\"in t&&!!t.alternativeValue&&t.alternativeValue.some(e=>dv(e));case\"arithmetic\":return Gj(t.arithmetic);case\"shell\":return qj(t.shell);default:return!1}}function dv(t){switch(t.type){case\"redirection\":return t.args.some(e=>dv(e));case\"argument\":return t.segments.some(e=>Ype(e));default:throw new Error(`Assertion failed: Unsupported argument type: \"${t.type}\"`)}}function Gj(t){switch(t.type){case\"variable\":return Ype(t);case\"number\":return!1;default:return Gj(t.left)||Gj(t.right)}}function qj(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let s;switch(r.type){case\"subshell\":s=qj(r.subshell);break;case\"command\":s=r.envs.some(a=>a.args.some(n=>dv(n)))||r.args.some(a=>dv(a));break}if(s)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function vI(t,e=[],{baseFs:r=new Yn,builtins:s={},cwd:a=fe.toPortablePath(process.cwd()),env:n=process.env,stdin:c=process.stdin,stdout:f=process.stdout,stderr:p=process.stderr,variables:h={},glob:E=PT}={}){let C={};for(let[I,R]of Object.entries(n))typeof R<\"u\"&&(C[I]=R);let S=new Map(Xnt);for(let[I,R]of Object.entries(s))S.set(I,R);c===null&&(c=new Jl.PassThrough,c.end());let P=ux(t,E);if(!qj(P)&&P.length>0&&e.length>0){let{command:I}=P[P.length-1];for(;I.then;)I=I.then.line;let R=I.chain;for(;R.then;)R=R.then.chain;R.type===\"command\"&&(R.args=R.args.concat(e.map(N=>({type:\"argument\",segments:[{type:\"text\",text:N}]}))))}return await TT(P,{args:e,baseFs:r,builtins:S,initialStdin:c,initialStdout:f,initialStderr:p,glob:E},{cwd:a,environment:C,exitCode:null,procedures:{},stdin:c,stdout:f,stderr:p,variables:Object.assign({},h,{\"?\":0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var jpe,Gpe,Jl,qpe,Xnt,$nt,pv=Xe(()=>{Dt();wc();jpe=ut(TE()),Gpe=Ie(\"os\"),Jl=Ie(\"stream\"),qpe=Ie(\"timers/promises\");Dpe();bpe();Qpe();jj();jj();Xnt=new Map([[\"cd\",async([t=(0,Gpe.homedir)(),...e],r,s)=>{let a=J.resolve(s.cwd,fe.toPortablePath(t));if(!(await r.baseFs.statPromise(a).catch(c=>{throw c.code===\"ENOENT\"?new Vl(`cd: no such file or directory: ${t}`):c})).isDirectory())throw new Vl(`cd: not a directory: ${t}`);return s.cwd=a,0}],[\"pwd\",async(t,e,r)=>(r.stdout.write(`${fe.fromPortablePath(r.cwd)}\n`),0)],[\":\",async(t,e,r)=>0],[\"true\",async(t,e,r)=>0],[\"false\",async(t,e,r)=>1],[\"exit\",async([t,...e],r,s)=>s.exitCode=parseInt(t??s.variables[\"?\"],10)],[\"echo\",async(t,e,r)=>(r.stdout.write(`${t.join(\" \")}\n`),0)],[\"sleep\",async([t],e,r)=>{if(typeof t>\"u\")throw new Vl(\"sleep: missing operand\");let s=Number(t);if(Number.isNaN(s))throw new Vl(`sleep: invalid time interval '${t}'`);return await(0,qpe.setTimeout)(1e3*s,0)}],[\"unset\",async(t,e,r)=>{for(let s of t)delete r.environment[s],delete r.variables[s];return 0}],[\"__ysh_run_procedure\",async(t,e,r)=>{let s=r.procedures[t[0]];return await xT(s,{stdin:new Oc(r.stdin),stdout:new Oc(r.stdout),stderr:new Oc(r.stderr)}).run()}],[\"__ysh_set_redirects\",async(t,e,r)=>{let s=r.stdin,a=r.stdout,n=r.stderr,c=[],f=[],p=[],h=0;for(;t[h]!==\"--\";){let C=t[h++],{type:S,fd:P}=JSON.parse(C),I=W=>{switch(P){case null:case 0:c.push(W);break;default:throw new Error(`Unsupported file descriptor: \"${P}\"`)}},R=W=>{switch(P){case null:case 1:f.push(W);break;case 2:p.push(W);break;default:throw new Error(`Unsupported file descriptor: \"${P}\"`)}},N=Number(t[h++]),U=h+N;for(let W=h;W<U;++h,++W)switch(S){case\"<\":I(()=>e.baseFs.createReadStream(J.resolve(r.cwd,fe.toPortablePath(t[W]))));break;case\"<<<\":I(()=>{let ee=new Jl.PassThrough;return process.nextTick(()=>{ee.write(`${t[W]}\n`),ee.end()}),ee});break;case\"<&\":I(()=>Mpe(Number(t[W]),1,r));break;case\">\":case\">>\":{let ee=J.resolve(r.cwd,fe.toPortablePath(t[W]));R(ee===\"/dev/null\"?new Jl.Writable({autoDestroy:!0,emitClose:!0,write(ie,ue,le){setImmediate(le)}}):e.baseFs.createWriteStream(ee,S===\">>\"?{flags:\"a\"}:void 0))}break;case\">&\":R(Mpe(Number(t[W]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: \"${S}\"`)}}if(c.length>0){let C=new Jl.PassThrough;s=C;let S=P=>{if(P===c.length)C.end();else{let I=c[P]();I.pipe(C,{end:!1}),I.on(\"end\",()=>{S(P+1)})}};S(0)}if(f.length>0){let C=new Jl.PassThrough;a=C;for(let S of f)C.pipe(S)}if(p.length>0){let C=new Jl.PassThrough;n=C;for(let S of p)C.pipe(S)}let E=await xT(gv(t.slice(h+1),e,r),{stdin:new Oc(s),stdout:new Oc(a),stderr:new Oc(n)}).run();return await Promise.all(f.map(C=>new Promise((S,P)=>{C.on(\"error\",I=>{P(I)}),C.on(\"close\",()=>{S()}),C.end()}))),await Promise.all(p.map(C=>new Promise((S,P)=>{C.on(\"error\",I=>{P(I)}),C.on(\"close\",()=>{S()}),C.end()}))),E}]]);$nt={addition:(t,e)=>t+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)}});var Vpe=_((S4t,RT)=>{function iit(){var t=0,e=1,r=2,s=3,a=4,n=5,c=6,f=7,p=8,h=9,E=10,C=11,S=12,P=13,I=14,R=15,N=16,U=17,W=0,ee=1,ie=2,ue=3,le=4;function me(g,we){return 55296<=g.charCodeAt(we)&&g.charCodeAt(we)<=56319&&56320<=g.charCodeAt(we+1)&&g.charCodeAt(we+1)<=57343}function pe(g,we){we===void 0&&(we=0);var ye=g.charCodeAt(we);if(55296<=ye&&ye<=56319&&we<g.length-1){var Ae=ye,se=g.charCodeAt(we+1);return 56320<=se&&se<=57343?(Ae-55296)*1024+(se-56320)+65536:Ae}if(56320<=ye&&ye<=57343&&we>=1){var Ae=g.charCodeAt(we-1),se=ye;return 55296<=Ae&&Ae<=56319?(Ae-55296)*1024+(se-56320)+65536:se}return ye}function Be(g,we,ye){var Ae=[g].concat(we).concat([ye]),se=Ae[Ae.length-2],Z=ye,De=Ae.lastIndexOf(I);if(De>1&&Ae.slice(1,De).every(function(j){return j==s})&&[s,P,U].indexOf(g)==-1)return ie;var Re=Ae.lastIndexOf(a);if(Re>0&&Ae.slice(1,Re).every(function(j){return j==a})&&[S,a].indexOf(se)==-1)return Ae.filter(function(j){return j==a}).length%2==1?ue:le;if(se==t&&Z==e)return W;if(se==r||se==t||se==e)return Z==I&&we.every(function(j){return j==s})?ie:ee;if(Z==r||Z==t||Z==e)return ee;if(se==c&&(Z==c||Z==f||Z==h||Z==E))return W;if((se==h||se==f)&&(Z==f||Z==p))return W;if((se==E||se==p)&&Z==p)return W;if(Z==s||Z==R)return W;if(Z==n)return W;if(se==S)return W;var mt=Ae.indexOf(s)!=-1?Ae.lastIndexOf(s)-1:Ae.length-2;return[P,U].indexOf(Ae[mt])!=-1&&Ae.slice(mt+1,-1).every(function(j){return j==s})&&Z==I||se==R&&[N,U].indexOf(Z)!=-1?W:we.indexOf(a)!=-1?ie:se==a&&Z==a?W:ee}this.nextBreak=function(g,we){if(we===void 0&&(we=0),we<0)return 0;if(we>=g.length-1)return g.length;for(var ye=Ce(pe(g,we)),Ae=[],se=we+1;se<g.length;se++)if(!me(g,se-1)){var Z=Ce(pe(g,se));if(Be(ye,Ae,Z))return se;Ae.push(Z)}return g.length},this.splitGraphemes=function(g){for(var we=[],ye=0,Ae;(Ae=this.nextBreak(g,ye))<g.length;)we.push(g.slice(ye,Ae)),ye=Ae;return ye<g.length&&we.push(g.slice(ye)),we},this.iterateGraphemes=function(g){var we=0,ye={next:function(){var Ae,se;return(se=this.nextBreak(g,we))<g.length?(Ae=g.slice(we,se),we=se,{value:Ae,done:!1}):we<g.length?(Ae=g.slice(we),we=g.length,{value:Ae,done:!1}):{value:void 0,done:!0}}.bind(this)};return typeof Symbol<\"u\"&&Symbol.iterator&&(ye[Symbol.iterator]=function(){return ye}),ye},this.countGraphemes=function(g){for(var we=0,ye=0,Ae;(Ae=this.nextBreak(g,ye))<g.length;)ye=Ae,we++;return ye<g.length&&we++,we};function Ce(g){return 1536<=g&&g<=1541||g==1757||g==1807||g==2274||g==3406||g==69821||70082<=g&&g<=70083||g==72250||72326<=g&&g<=72329||g==73030?S:g==13?t:g==10?e:0<=g&&g<=9||11<=g&&g<=12||14<=g&&g<=31||127<=g&&g<=159||g==173||g==1564||g==6158||g==8203||8206<=g&&g<=8207||g==8232||g==8233||8234<=g&&g<=8238||8288<=g&&g<=8292||g==8293||8294<=g&&g<=8303||55296<=g&&g<=57343||g==65279||65520<=g&&g<=65528||65529<=g&&g<=65531||113824<=g&&g<=113827||119155<=g&&g<=119162||g==917504||g==917505||917506<=g&&g<=917535||917632<=g&&g<=917759||918e3<=g&&g<=921599?r:768<=g&&g<=879||1155<=g&&g<=1159||1160<=g&&g<=1161||1425<=g&&g<=1469||g==1471||1473<=g&&g<=1474||1476<=g&&g<=1477||g==1479||1552<=g&&g<=1562||1611<=g&&g<=1631||g==1648||1750<=g&&g<=1756||1759<=g&&g<=1764||1767<=g&&g<=1768||1770<=g&&g<=1773||g==1809||1840<=g&&g<=1866||1958<=g&&g<=1968||2027<=g&&g<=2035||2070<=g&&g<=2073||2075<=g&&g<=2083||2085<=g&&g<=2087||2089<=g&&g<=2093||2137<=g&&g<=2139||2260<=g&&g<=2273||2275<=g&&g<=2306||g==2362||g==2364||2369<=g&&g<=2376||g==2381||2385<=g&&g<=2391||2402<=g&&g<=2403||g==2433||g==2492||g==2494||2497<=g&&g<=2500||g==2509||g==2519||2530<=g&&g<=2531||2561<=g&&g<=2562||g==2620||2625<=g&&g<=2626||2631<=g&&g<=2632||2635<=g&&g<=2637||g==2641||2672<=g&&g<=2673||g==2677||2689<=g&&g<=2690||g==2748||2753<=g&&g<=2757||2759<=g&&g<=2760||g==2765||2786<=g&&g<=2787||2810<=g&&g<=2815||g==2817||g==2876||g==2878||g==2879||2881<=g&&g<=2884||g==2893||g==2902||g==2903||2914<=g&&g<=2915||g==2946||g==3006||g==3008||g==3021||g==3031||g==3072||3134<=g&&g<=3136||3142<=g&&g<=3144||3146<=g&&g<=3149||3157<=g&&g<=3158||3170<=g&&g<=3171||g==3201||g==3260||g==3263||g==3266||g==3270||3276<=g&&g<=3277||3285<=g&&g<=3286||3298<=g&&g<=3299||3328<=g&&g<=3329||3387<=g&&g<=3388||g==3390||3393<=g&&g<=3396||g==3405||g==3415||3426<=g&&g<=3427||g==3530||g==3535||3538<=g&&g<=3540||g==3542||g==3551||g==3633||3636<=g&&g<=3642||3655<=g&&g<=3662||g==3761||3764<=g&&g<=3769||3771<=g&&g<=3772||3784<=g&&g<=3789||3864<=g&&g<=3865||g==3893||g==3895||g==3897||3953<=g&&g<=3966||3968<=g&&g<=3972||3974<=g&&g<=3975||3981<=g&&g<=3991||3993<=g&&g<=4028||g==4038||4141<=g&&g<=4144||4146<=g&&g<=4151||4153<=g&&g<=4154||4157<=g&&g<=4158||4184<=g&&g<=4185||4190<=g&&g<=4192||4209<=g&&g<=4212||g==4226||4229<=g&&g<=4230||g==4237||g==4253||4957<=g&&g<=4959||5906<=g&&g<=5908||5938<=g&&g<=5940||5970<=g&&g<=5971||6002<=g&&g<=6003||6068<=g&&g<=6069||6071<=g&&g<=6077||g==6086||6089<=g&&g<=6099||g==6109||6155<=g&&g<=6157||6277<=g&&g<=6278||g==6313||6432<=g&&g<=6434||6439<=g&&g<=6440||g==6450||6457<=g&&g<=6459||6679<=g&&g<=6680||g==6683||g==6742||6744<=g&&g<=6750||g==6752||g==6754||6757<=g&&g<=6764||6771<=g&&g<=6780||g==6783||6832<=g&&g<=6845||g==6846||6912<=g&&g<=6915||g==6964||6966<=g&&g<=6970||g==6972||g==6978||7019<=g&&g<=7027||7040<=g&&g<=7041||7074<=g&&g<=7077||7080<=g&&g<=7081||7083<=g&&g<=7085||g==7142||7144<=g&&g<=7145||g==7149||7151<=g&&g<=7153||7212<=g&&g<=7219||7222<=g&&g<=7223||7376<=g&&g<=7378||7380<=g&&g<=7392||7394<=g&&g<=7400||g==7405||g==7412||7416<=g&&g<=7417||7616<=g&&g<=7673||7675<=g&&g<=7679||g==8204||8400<=g&&g<=8412||8413<=g&&g<=8416||g==8417||8418<=g&&g<=8420||8421<=g&&g<=8432||11503<=g&&g<=11505||g==11647||11744<=g&&g<=11775||12330<=g&&g<=12333||12334<=g&&g<=12335||12441<=g&&g<=12442||g==42607||42608<=g&&g<=42610||42612<=g&&g<=42621||42654<=g&&g<=42655||42736<=g&&g<=42737||g==43010||g==43014||g==43019||43045<=g&&g<=43046||43204<=g&&g<=43205||43232<=g&&g<=43249||43302<=g&&g<=43309||43335<=g&&g<=43345||43392<=g&&g<=43394||g==43443||43446<=g&&g<=43449||g==43452||g==43493||43561<=g&&g<=43566||43569<=g&&g<=43570||43573<=g&&g<=43574||g==43587||g==43596||g==43644||g==43696||43698<=g&&g<=43700||43703<=g&&g<=43704||43710<=g&&g<=43711||g==43713||43756<=g&&g<=43757||g==43766||g==44005||g==44008||g==44013||g==64286||65024<=g&&g<=65039||65056<=g&&g<=65071||65438<=g&&g<=65439||g==66045||g==66272||66422<=g&&g<=66426||68097<=g&&g<=68099||68101<=g&&g<=68102||68108<=g&&g<=68111||68152<=g&&g<=68154||g==68159||68325<=g&&g<=68326||g==69633||69688<=g&&g<=69702||69759<=g&&g<=69761||69811<=g&&g<=69814||69817<=g&&g<=69818||69888<=g&&g<=69890||69927<=g&&g<=69931||69933<=g&&g<=69940||g==70003||70016<=g&&g<=70017||70070<=g&&g<=70078||70090<=g&&g<=70092||70191<=g&&g<=70193||g==70196||70198<=g&&g<=70199||g==70206||g==70367||70371<=g&&g<=70378||70400<=g&&g<=70401||g==70460||g==70462||g==70464||g==70487||70502<=g&&g<=70508||70512<=g&&g<=70516||70712<=g&&g<=70719||70722<=g&&g<=70724||g==70726||g==70832||70835<=g&&g<=70840||g==70842||g==70845||70847<=g&&g<=70848||70850<=g&&g<=70851||g==71087||71090<=g&&g<=71093||71100<=g&&g<=71101||71103<=g&&g<=71104||71132<=g&&g<=71133||71219<=g&&g<=71226||g==71229||71231<=g&&g<=71232||g==71339||g==71341||71344<=g&&g<=71349||g==71351||71453<=g&&g<=71455||71458<=g&&g<=71461||71463<=g&&g<=71467||72193<=g&&g<=72198||72201<=g&&g<=72202||72243<=g&&g<=72248||72251<=g&&g<=72254||g==72263||72273<=g&&g<=72278||72281<=g&&g<=72283||72330<=g&&g<=72342||72344<=g&&g<=72345||72752<=g&&g<=72758||72760<=g&&g<=72765||g==72767||72850<=g&&g<=72871||72874<=g&&g<=72880||72882<=g&&g<=72883||72885<=g&&g<=72886||73009<=g&&g<=73014||g==73018||73020<=g&&g<=73021||73023<=g&&g<=73029||g==73031||92912<=g&&g<=92916||92976<=g&&g<=92982||94095<=g&&g<=94098||113821<=g&&g<=113822||g==119141||119143<=g&&g<=119145||119150<=g&&g<=119154||119163<=g&&g<=119170||119173<=g&&g<=119179||119210<=g&&g<=119213||119362<=g&&g<=119364||121344<=g&&g<=121398||121403<=g&&g<=121452||g==121461||g==121476||121499<=g&&g<=121503||121505<=g&&g<=121519||122880<=g&&g<=122886||122888<=g&&g<=122904||122907<=g&&g<=122913||122915<=g&&g<=122916||122918<=g&&g<=122922||125136<=g&&g<=125142||125252<=g&&g<=125258||917536<=g&&g<=917631||917760<=g&&g<=917999?s:127462<=g&&g<=127487?a:g==2307||g==2363||2366<=g&&g<=2368||2377<=g&&g<=2380||2382<=g&&g<=2383||2434<=g&&g<=2435||2495<=g&&g<=2496||2503<=g&&g<=2504||2507<=g&&g<=2508||g==2563||2622<=g&&g<=2624||g==2691||2750<=g&&g<=2752||g==2761||2763<=g&&g<=2764||2818<=g&&g<=2819||g==2880||2887<=g&&g<=2888||2891<=g&&g<=2892||g==3007||3009<=g&&g<=3010||3014<=g&&g<=3016||3018<=g&&g<=3020||3073<=g&&g<=3075||3137<=g&&g<=3140||3202<=g&&g<=3203||g==3262||3264<=g&&g<=3265||3267<=g&&g<=3268||3271<=g&&g<=3272||3274<=g&&g<=3275||3330<=g&&g<=3331||3391<=g&&g<=3392||3398<=g&&g<=3400||3402<=g&&g<=3404||3458<=g&&g<=3459||3536<=g&&g<=3537||3544<=g&&g<=3550||3570<=g&&g<=3571||g==3635||g==3763||3902<=g&&g<=3903||g==3967||g==4145||4155<=g&&g<=4156||4182<=g&&g<=4183||g==4228||g==6070||6078<=g&&g<=6085||6087<=g&&g<=6088||6435<=g&&g<=6438||6441<=g&&g<=6443||6448<=g&&g<=6449||6451<=g&&g<=6456||6681<=g&&g<=6682||g==6741||g==6743||6765<=g&&g<=6770||g==6916||g==6965||g==6971||6973<=g&&g<=6977||6979<=g&&g<=6980||g==7042||g==7073||7078<=g&&g<=7079||g==7082||g==7143||7146<=g&&g<=7148||g==7150||7154<=g&&g<=7155||7204<=g&&g<=7211||7220<=g&&g<=7221||g==7393||7410<=g&&g<=7411||g==7415||43043<=g&&g<=43044||g==43047||43136<=g&&g<=43137||43188<=g&&g<=43203||43346<=g&&g<=43347||g==43395||43444<=g&&g<=43445||43450<=g&&g<=43451||43453<=g&&g<=43456||43567<=g&&g<=43568||43571<=g&&g<=43572||g==43597||g==43755||43758<=g&&g<=43759||g==43765||44003<=g&&g<=44004||44006<=g&&g<=44007||44009<=g&&g<=44010||g==44012||g==69632||g==69634||g==69762||69808<=g&&g<=69810||69815<=g&&g<=69816||g==69932||g==70018||70067<=g&&g<=70069||70079<=g&&g<=70080||70188<=g&&g<=70190||70194<=g&&g<=70195||g==70197||70368<=g&&g<=70370||70402<=g&&g<=70403||g==70463||70465<=g&&g<=70468||70471<=g&&g<=70472||70475<=g&&g<=70477||70498<=g&&g<=70499||70709<=g&&g<=70711||70720<=g&&g<=70721||g==70725||70833<=g&&g<=70834||g==70841||70843<=g&&g<=70844||g==70846||g==70849||71088<=g&&g<=71089||71096<=g&&g<=71099||g==71102||71216<=g&&g<=71218||71227<=g&&g<=71228||g==71230||g==71340||71342<=g&&g<=71343||g==71350||71456<=g&&g<=71457||g==71462||72199<=g&&g<=72200||g==72249||72279<=g&&g<=72280||g==72343||g==72751||g==72766||g==72873||g==72881||g==72884||94033<=g&&g<=94078||g==119142||g==119149?n:4352<=g&&g<=4447||43360<=g&&g<=43388?c:4448<=g&&g<=4519||55216<=g&&g<=55238?f:4520<=g&&g<=4607||55243<=g&&g<=55291?p:g==44032||g==44060||g==44088||g==44116||g==44144||g==44172||g==44200||g==44228||g==44256||g==44284||g==44312||g==44340||g==44368||g==44396||g==44424||g==44452||g==44480||g==44508||g==44536||g==44564||g==44592||g==44620||g==44648||g==44676||g==44704||g==44732||g==44760||g==44788||g==44816||g==44844||g==44872||g==44900||g==44928||g==44956||g==44984||g==45012||g==45040||g==45068||g==45096||g==45124||g==45152||g==45180||g==45208||g==45236||g==45264||g==45292||g==45320||g==45348||g==45376||g==45404||g==45432||g==45460||g==45488||g==45516||g==45544||g==45572||g==45600||g==45628||g==45656||g==45684||g==45712||g==45740||g==45768||g==45796||g==45824||g==45852||g==45880||g==45908||g==45936||g==45964||g==45992||g==46020||g==46048||g==46076||g==46104||g==46132||g==46160||g==46188||g==46216||g==46244||g==46272||g==46300||g==46328||g==46356||g==46384||g==46412||g==46440||g==46468||g==46496||g==46524||g==46552||g==46580||g==46608||g==46636||g==46664||g==46692||g==46720||g==46748||g==46776||g==46804||g==46832||g==46860||g==46888||g==46916||g==46944||g==46972||g==47e3||g==47028||g==47056||g==47084||g==47112||g==47140||g==47168||g==47196||g==47224||g==47252||g==47280||g==47308||g==47336||g==47364||g==47392||g==47420||g==47448||g==47476||g==47504||g==47532||g==47560||g==47588||g==47616||g==47644||g==47672||g==47700||g==47728||g==47756||g==47784||g==47812||g==47840||g==47868||g==47896||g==47924||g==47952||g==47980||g==48008||g==48036||g==48064||g==48092||g==48120||g==48148||g==48176||g==48204||g==48232||g==48260||g==48288||g==48316||g==48344||g==48372||g==48400||g==48428||g==48456||g==48484||g==48512||g==48540||g==48568||g==48596||g==48624||g==48652||g==48680||g==48708||g==48736||g==48764||g==48792||g==48820||g==48848||g==48876||g==48904||g==48932||g==48960||g==48988||g==49016||g==49044||g==49072||g==49100||g==49128||g==49156||g==49184||g==49212||g==49240||g==49268||g==49296||g==49324||g==49352||g==49380||g==49408||g==49436||g==49464||g==49492||g==49520||g==49548||g==49576||g==49604||g==49632||g==49660||g==49688||g==49716||g==49744||g==49772||g==49800||g==49828||g==49856||g==49884||g==49912||g==49940||g==49968||g==49996||g==50024||g==50052||g==50080||g==50108||g==50136||g==50164||g==50192||g==50220||g==50248||g==50276||g==50304||g==50332||g==50360||g==50388||g==50416||g==50444||g==50472||g==50500||g==50528||g==50556||g==50584||g==50612||g==50640||g==50668||g==50696||g==50724||g==50752||g==50780||g==50808||g==50836||g==50864||g==50892||g==50920||g==50948||g==50976||g==51004||g==51032||g==51060||g==51088||g==51116||g==51144||g==51172||g==51200||g==51228||g==51256||g==51284||g==51312||g==51340||g==51368||g==51396||g==51424||g==51452||g==51480||g==51508||g==51536||g==51564||g==51592||g==51620||g==51648||g==51676||g==51704||g==51732||g==51760||g==51788||g==51816||g==51844||g==51872||g==51900||g==51928||g==51956||g==51984||g==52012||g==52040||g==52068||g==52096||g==52124||g==52152||g==52180||g==52208||g==52236||g==52264||g==52292||g==52320||g==52348||g==52376||g==52404||g==52432||g==52460||g==52488||g==52516||g==52544||g==52572||g==52600||g==52628||g==52656||g==52684||g==52712||g==52740||g==52768||g==52796||g==52824||g==52852||g==52880||g==52908||g==52936||g==52964||g==52992||g==53020||g==53048||g==53076||g==53104||g==53132||g==53160||g==53188||g==53216||g==53244||g==53272||g==53300||g==53328||g==53356||g==53384||g==53412||g==53440||g==53468||g==53496||g==53524||g==53552||g==53580||g==53608||g==53636||g==53664||g==53692||g==53720||g==53748||g==53776||g==53804||g==53832||g==53860||g==53888||g==53916||g==53944||g==53972||g==54e3||g==54028||g==54056||g==54084||g==54112||g==54140||g==54168||g==54196||g==54224||g==54252||g==54280||g==54308||g==54336||g==54364||g==54392||g==54420||g==54448||g==54476||g==54504||g==54532||g==54560||g==54588||g==54616||g==54644||g==54672||g==54700||g==54728||g==54756||g==54784||g==54812||g==54840||g==54868||g==54896||g==54924||g==54952||g==54980||g==55008||g==55036||g==55064||g==55092||g==55120||g==55148||g==55176?h:44033<=g&&g<=44059||44061<=g&&g<=44087||44089<=g&&g<=44115||44117<=g&&g<=44143||44145<=g&&g<=44171||44173<=g&&g<=44199||44201<=g&&g<=44227||44229<=g&&g<=44255||44257<=g&&g<=44283||44285<=g&&g<=44311||44313<=g&&g<=44339||44341<=g&&g<=44367||44369<=g&&g<=44395||44397<=g&&g<=44423||44425<=g&&g<=44451||44453<=g&&g<=44479||44481<=g&&g<=44507||44509<=g&&g<=44535||44537<=g&&g<=44563||44565<=g&&g<=44591||44593<=g&&g<=44619||44621<=g&&g<=44647||44649<=g&&g<=44675||44677<=g&&g<=44703||44705<=g&&g<=44731||44733<=g&&g<=44759||44761<=g&&g<=44787||44789<=g&&g<=44815||44817<=g&&g<=44843||44845<=g&&g<=44871||44873<=g&&g<=44899||44901<=g&&g<=44927||44929<=g&&g<=44955||44957<=g&&g<=44983||44985<=g&&g<=45011||45013<=g&&g<=45039||45041<=g&&g<=45067||45069<=g&&g<=45095||45097<=g&&g<=45123||45125<=g&&g<=45151||45153<=g&&g<=45179||45181<=g&&g<=45207||45209<=g&&g<=45235||45237<=g&&g<=45263||45265<=g&&g<=45291||45293<=g&&g<=45319||45321<=g&&g<=45347||45349<=g&&g<=45375||45377<=g&&g<=45403||45405<=g&&g<=45431||45433<=g&&g<=45459||45461<=g&&g<=45487||45489<=g&&g<=45515||45517<=g&&g<=45543||45545<=g&&g<=45571||45573<=g&&g<=45599||45601<=g&&g<=45627||45629<=g&&g<=45655||45657<=g&&g<=45683||45685<=g&&g<=45711||45713<=g&&g<=45739||45741<=g&&g<=45767||45769<=g&&g<=45795||45797<=g&&g<=45823||45825<=g&&g<=45851||45853<=g&&g<=45879||45881<=g&&g<=45907||45909<=g&&g<=45935||45937<=g&&g<=45963||45965<=g&&g<=45991||45993<=g&&g<=46019||46021<=g&&g<=46047||46049<=g&&g<=46075||46077<=g&&g<=46103||46105<=g&&g<=46131||46133<=g&&g<=46159||46161<=g&&g<=46187||46189<=g&&g<=46215||46217<=g&&g<=46243||46245<=g&&g<=46271||46273<=g&&g<=46299||46301<=g&&g<=46327||46329<=g&&g<=46355||46357<=g&&g<=46383||46385<=g&&g<=46411||46413<=g&&g<=46439||46441<=g&&g<=46467||46469<=g&&g<=46495||46497<=g&&g<=46523||46525<=g&&g<=46551||46553<=g&&g<=46579||46581<=g&&g<=46607||46609<=g&&g<=46635||46637<=g&&g<=46663||46665<=g&&g<=46691||46693<=g&&g<=46719||46721<=g&&g<=46747||46749<=g&&g<=46775||46777<=g&&g<=46803||46805<=g&&g<=46831||46833<=g&&g<=46859||46861<=g&&g<=46887||46889<=g&&g<=46915||46917<=g&&g<=46943||46945<=g&&g<=46971||46973<=g&&g<=46999||47001<=g&&g<=47027||47029<=g&&g<=47055||47057<=g&&g<=47083||47085<=g&&g<=47111||47113<=g&&g<=47139||47141<=g&&g<=47167||47169<=g&&g<=47195||47197<=g&&g<=47223||47225<=g&&g<=47251||47253<=g&&g<=47279||47281<=g&&g<=47307||47309<=g&&g<=47335||47337<=g&&g<=47363||47365<=g&&g<=47391||47393<=g&&g<=47419||47421<=g&&g<=47447||47449<=g&&g<=47475||47477<=g&&g<=47503||47505<=g&&g<=47531||47533<=g&&g<=47559||47561<=g&&g<=47587||47589<=g&&g<=47615||47617<=g&&g<=47643||47645<=g&&g<=47671||47673<=g&&g<=47699||47701<=g&&g<=47727||47729<=g&&g<=47755||47757<=g&&g<=47783||47785<=g&&g<=47811||47813<=g&&g<=47839||47841<=g&&g<=47867||47869<=g&&g<=47895||47897<=g&&g<=47923||47925<=g&&g<=47951||47953<=g&&g<=47979||47981<=g&&g<=48007||48009<=g&&g<=48035||48037<=g&&g<=48063||48065<=g&&g<=48091||48093<=g&&g<=48119||48121<=g&&g<=48147||48149<=g&&g<=48175||48177<=g&&g<=48203||48205<=g&&g<=48231||48233<=g&&g<=48259||48261<=g&&g<=48287||48289<=g&&g<=48315||48317<=g&&g<=48343||48345<=g&&g<=48371||48373<=g&&g<=48399||48401<=g&&g<=48427||48429<=g&&g<=48455||48457<=g&&g<=48483||48485<=g&&g<=48511||48513<=g&&g<=48539||48541<=g&&g<=48567||48569<=g&&g<=48595||48597<=g&&g<=48623||48625<=g&&g<=48651||48653<=g&&g<=48679||48681<=g&&g<=48707||48709<=g&&g<=48735||48737<=g&&g<=48763||48765<=g&&g<=48791||48793<=g&&g<=48819||48821<=g&&g<=48847||48849<=g&&g<=48875||48877<=g&&g<=48903||48905<=g&&g<=48931||48933<=g&&g<=48959||48961<=g&&g<=48987||48989<=g&&g<=49015||49017<=g&&g<=49043||49045<=g&&g<=49071||49073<=g&&g<=49099||49101<=g&&g<=49127||49129<=g&&g<=49155||49157<=g&&g<=49183||49185<=g&&g<=49211||49213<=g&&g<=49239||49241<=g&&g<=49267||49269<=g&&g<=49295||49297<=g&&g<=49323||49325<=g&&g<=49351||49353<=g&&g<=49379||49381<=g&&g<=49407||49409<=g&&g<=49435||49437<=g&&g<=49463||49465<=g&&g<=49491||49493<=g&&g<=49519||49521<=g&&g<=49547||49549<=g&&g<=49575||49577<=g&&g<=49603||49605<=g&&g<=49631||49633<=g&&g<=49659||49661<=g&&g<=49687||49689<=g&&g<=49715||49717<=g&&g<=49743||49745<=g&&g<=49771||49773<=g&&g<=49799||49801<=g&&g<=49827||49829<=g&&g<=49855||49857<=g&&g<=49883||49885<=g&&g<=49911||49913<=g&&g<=49939||49941<=g&&g<=49967||49969<=g&&g<=49995||49997<=g&&g<=50023||50025<=g&&g<=50051||50053<=g&&g<=50079||50081<=g&&g<=50107||50109<=g&&g<=50135||50137<=g&&g<=50163||50165<=g&&g<=50191||50193<=g&&g<=50219||50221<=g&&g<=50247||50249<=g&&g<=50275||50277<=g&&g<=50303||50305<=g&&g<=50331||50333<=g&&g<=50359||50361<=g&&g<=50387||50389<=g&&g<=50415||50417<=g&&g<=50443||50445<=g&&g<=50471||50473<=g&&g<=50499||50501<=g&&g<=50527||50529<=g&&g<=50555||50557<=g&&g<=50583||50585<=g&&g<=50611||50613<=g&&g<=50639||50641<=g&&g<=50667||50669<=g&&g<=50695||50697<=g&&g<=50723||50725<=g&&g<=50751||50753<=g&&g<=50779||50781<=g&&g<=50807||50809<=g&&g<=50835||50837<=g&&g<=50863||50865<=g&&g<=50891||50893<=g&&g<=50919||50921<=g&&g<=50947||50949<=g&&g<=50975||50977<=g&&g<=51003||51005<=g&&g<=51031||51033<=g&&g<=51059||51061<=g&&g<=51087||51089<=g&&g<=51115||51117<=g&&g<=51143||51145<=g&&g<=51171||51173<=g&&g<=51199||51201<=g&&g<=51227||51229<=g&&g<=51255||51257<=g&&g<=51283||51285<=g&&g<=51311||51313<=g&&g<=51339||51341<=g&&g<=51367||51369<=g&&g<=51395||51397<=g&&g<=51423||51425<=g&&g<=51451||51453<=g&&g<=51479||51481<=g&&g<=51507||51509<=g&&g<=51535||51537<=g&&g<=51563||51565<=g&&g<=51591||51593<=g&&g<=51619||51621<=g&&g<=51647||51649<=g&&g<=51675||51677<=g&&g<=51703||51705<=g&&g<=51731||51733<=g&&g<=51759||51761<=g&&g<=51787||51789<=g&&g<=51815||51817<=g&&g<=51843||51845<=g&&g<=51871||51873<=g&&g<=51899||51901<=g&&g<=51927||51929<=g&&g<=51955||51957<=g&&g<=51983||51985<=g&&g<=52011||52013<=g&&g<=52039||52041<=g&&g<=52067||52069<=g&&g<=52095||52097<=g&&g<=52123||52125<=g&&g<=52151||52153<=g&&g<=52179||52181<=g&&g<=52207||52209<=g&&g<=52235||52237<=g&&g<=52263||52265<=g&&g<=52291||52293<=g&&g<=52319||52321<=g&&g<=52347||52349<=g&&g<=52375||52377<=g&&g<=52403||52405<=g&&g<=52431||52433<=g&&g<=52459||52461<=g&&g<=52487||52489<=g&&g<=52515||52517<=g&&g<=52543||52545<=g&&g<=52571||52573<=g&&g<=52599||52601<=g&&g<=52627||52629<=g&&g<=52655||52657<=g&&g<=52683||52685<=g&&g<=52711||52713<=g&&g<=52739||52741<=g&&g<=52767||52769<=g&&g<=52795||52797<=g&&g<=52823||52825<=g&&g<=52851||52853<=g&&g<=52879||52881<=g&&g<=52907||52909<=g&&g<=52935||52937<=g&&g<=52963||52965<=g&&g<=52991||52993<=g&&g<=53019||53021<=g&&g<=53047||53049<=g&&g<=53075||53077<=g&&g<=53103||53105<=g&&g<=53131||53133<=g&&g<=53159||53161<=g&&g<=53187||53189<=g&&g<=53215||53217<=g&&g<=53243||53245<=g&&g<=53271||53273<=g&&g<=53299||53301<=g&&g<=53327||53329<=g&&g<=53355||53357<=g&&g<=53383||53385<=g&&g<=53411||53413<=g&&g<=53439||53441<=g&&g<=53467||53469<=g&&g<=53495||53497<=g&&g<=53523||53525<=g&&g<=53551||53553<=g&&g<=53579||53581<=g&&g<=53607||53609<=g&&g<=53635||53637<=g&&g<=53663||53665<=g&&g<=53691||53693<=g&&g<=53719||53721<=g&&g<=53747||53749<=g&&g<=53775||53777<=g&&g<=53803||53805<=g&&g<=53831||53833<=g&&g<=53859||53861<=g&&g<=53887||53889<=g&&g<=53915||53917<=g&&g<=53943||53945<=g&&g<=53971||53973<=g&&g<=53999||54001<=g&&g<=54027||54029<=g&&g<=54055||54057<=g&&g<=54083||54085<=g&&g<=54111||54113<=g&&g<=54139||54141<=g&&g<=54167||54169<=g&&g<=54195||54197<=g&&g<=54223||54225<=g&&g<=54251||54253<=g&&g<=54279||54281<=g&&g<=54307||54309<=g&&g<=54335||54337<=g&&g<=54363||54365<=g&&g<=54391||54393<=g&&g<=54419||54421<=g&&g<=54447||54449<=g&&g<=54475||54477<=g&&g<=54503||54505<=g&&g<=54531||54533<=g&&g<=54559||54561<=g&&g<=54587||54589<=g&&g<=54615||54617<=g&&g<=54643||54645<=g&&g<=54671||54673<=g&&g<=54699||54701<=g&&g<=54727||54729<=g&&g<=54755||54757<=g&&g<=54783||54785<=g&&g<=54811||54813<=g&&g<=54839||54841<=g&&g<=54867||54869<=g&&g<=54895||54897<=g&&g<=54923||54925<=g&&g<=54951||54953<=g&&g<=54979||54981<=g&&g<=55007||55009<=g&&g<=55035||55037<=g&&g<=55063||55065<=g&&g<=55091||55093<=g&&g<=55119||55121<=g&&g<=55147||55149<=g&&g<=55175||55177<=g&&g<=55203?E:g==9757||g==9977||9994<=g&&g<=9997||g==127877||127938<=g&&g<=127940||g==127943||127946<=g&&g<=127948||128066<=g&&g<=128067||128070<=g&&g<=128080||g==128110||128112<=g&&g<=128120||g==128124||128129<=g&&g<=128131||128133<=g&&g<=128135||g==128170||128372<=g&&g<=128373||g==128378||g==128400||128405<=g&&g<=128406||128581<=g&&g<=128583||128587<=g&&g<=128591||g==128675||128692<=g&&g<=128694||g==128704||g==128716||129304<=g&&g<=129308||129310<=g&&g<=129311||g==129318||129328<=g&&g<=129337||129341<=g&&g<=129342||129489<=g&&g<=129501?P:127995<=g&&g<=127999?I:g==8205?R:g==9792||g==9794||9877<=g&&g<=9878||g==9992||g==10084||g==127752||g==127806||g==127859||g==127891||g==127908||g==127912||g==127979||g==127981||g==128139||128187<=g&&g<=128188||g==128295||g==128300||g==128488||g==128640||g==128658?N:128102<=g&&g<=128105?U:C}return this}typeof RT<\"u\"&&RT.exports&&(RT.exports=iit)});var Kpe=_((D4t,Jpe)=>{var sit=/^(.*?)(\\x1b\\[[^m]+m|\\x1b\\]8;;.*?(\\x1b\\\\|\\u0007))/,FT;function oit(){if(FT)return FT;if(typeof Intl.Segmenter<\"u\"){let t=new Intl.Segmenter(\"en\",{granularity:\"grapheme\"});return FT=e=>Array.from(t.segment(e),({segment:r})=>r)}else{let t=Vpe(),e=new t;return FT=r=>e.splitGraphemes(r)}}Jpe.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError(\"Negative indices aren't supported by this implementation\");let s=r-e,a=\"\",n=0,c=0;for(;t.length>0;){let f=t.match(sit)||[t,t,void 0],p=oit()(f[1]),h=Math.min(e-n,p.length);p=p.slice(h);let E=Math.min(s-c,p.length);a+=p.slice(0,E).join(\"\"),n+=h,c+=E,typeof f[2]<\"u\"&&(a+=f[2]),t=t.slice(f[0].length)}return a}});var fn,yv=Xe(()=>{fn=process.env.YARN_IS_TEST_ENV?\"0.0.0\":\"4.12.0\"});function the(t,{configuration:e,json:r}){if(!e.get(\"enableMessageNames\"))return\"\";let a=Yf(t===null?0:t);return!r&&t===null?Ht(e,a,\"grey\"):a}function Wj(t,{configuration:e,json:r}){let s=the(t,{configuration:e,json:r});if(!s||t===null||t===0)return s;let a=Br[t],n=`https://yarnpkg.com/advanced/error-codes#${s}---${a}`.toLowerCase();return KE(e,s,n)}async function SI({configuration:t,stdout:e,forceError:r},s){let a=await Ot.start({configuration:t,stdout:e,includeFooter:!1},async n=>{let c=!1,f=!1;for(let p of s)typeof p.option<\"u\"&&(p.error||r?(f=!0,n.reportError(50,p.message)):(c=!0,n.reportWarning(50,p.message)),p.callback?.());c&&!f&&n.reportSeparator()});return a.hasErrors()?a.exitCode():null}var $pe,NT,ait,zpe,Xpe,D0,ehe,Zpe,lit,cit,OT,uit,Ot,Ev=Xe(()=>{$pe=ut(Kpe()),NT=ut(Fd());Gx();Tc();yv();xc();ait=\"\\xB7\",zpe=[\"\\u280B\",\"\\u2819\",\"\\u2839\",\"\\u2838\",\"\\u283C\",\"\\u2834\",\"\\u2826\",\"\\u2827\",\"\\u2807\",\"\\u280F\"],Xpe=80,D0=NT.default.GITHUB_ACTIONS?{start:t=>`::group::${t}\n`,end:t=>`::endgroup::\n`}:NT.default.TRAVIS?{start:t=>`travis_fold:start:${t}\n`,end:t=>`travis_fold:end:${t}\n`}:NT.default.GITLAB?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\\W+/g,\"_\")}[collapsed=true]\\r\\x1B[0K${t}\n`,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\\W+/g,\"_\")}\\r\\x1B[0K`}:null,ehe=D0!==null,Zpe=new Date,lit=[\"iTerm.app\",\"Apple_Terminal\",\"WarpTerminal\",\"vscode\"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,cit=t=>t,OT=cit({patrick:{date:[17,3],chars:[\"\\u{1F340}\",\"\\u{1F331}\"],size:40},simba:{date:[19,7],chars:[\"\\u{1F981}\",\"\\u{1F334}\"],size:40},jack:{date:[31,10],chars:[\"\\u{1F383}\",\"\\u{1F987}\"],size:40},hogsfather:{date:[31,12],chars:[\"\\u{1F389}\",\"\\u{1F384}\"],size:40},default:{chars:[\"=\",\"-\"],size:80}}),uit=lit&&Object.keys(OT).find(t=>{let e=OT[t];return!(e.date&&(e.date[0]!==Zpe.getDate()||e.date[1]!==Zpe.getMonth()+1))})||\"default\";Ot=class extends Ao{constructor({configuration:r,stdout:s,json:a=!1,forceSectionAlignment:n=!1,includeNames:c=!0,includePrefix:f=!0,includeFooter:p=!0,includeLogs:h=!a,includeInfos:E=h,includeWarnings:C=h}){super();this.uncommitted=new Set;this.warningCount=0;this.errorCount=0;this.timerFooter=[];this.startTime=Date.now();this.indent=0;this.level=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;if(RB(this,{configuration:r}),this.configuration=r,this.forceSectionAlignment=n,this.includeNames=c,this.includePrefix=f,this.includeFooter=p,this.includeInfos=E,this.includeWarnings=C,this.json=a,this.stdout=s,r.get(\"enableProgressBars\")&&!a&&s.isTTY&&s.columns>22){let S=r.get(\"progressBarStyle\")||uit;if(!Object.hasOwn(OT,S))throw new Error(\"Assertion failed: Invalid progress bar style\");this.progressStyle=OT[S];let P=Math.min(this.getRecommendedLength(),80);this.progressMaxScaledSize=Math.floor(this.progressStyle.size*P/80)}}static async start(r,s){let a=new this(r),n=process.emitWarning;process.emitWarning=(c,f)=>{if(typeof c!=\"string\"){let h=c;c=h.message,f=f??h.name}let p=typeof f<\"u\"?`${f}: ${c}`:c;a.reportWarning(0,p)},r.includeVersion&&a.reportInfo(0,zd(r.configuration,`Yarn ${fn}`,2));try{await s(a)}catch(c){a.reportExceptionOnce(c)}finally{await a.finalize(),process.emitWarning=n}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}getRecommendedLength(){let s=this.progressStyle!==null?this.stdout.columns-1:super.getRecommendedLength();return Math.max(40,s-12-this.indent*2)}startSectionSync({reportHeader:r,reportFooter:s,skipIfEmpty:a},n){let c={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(c):(c.action(),c.committed=!0);let f=Date.now();try{return n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(c),c.committed&&s?.(p-f)}}async startSectionPromise({reportHeader:r,reportFooter:s,skipIfEmpty:a},n){let c={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(c):(c.action(),c.committed=!0);let f=Date.now();try{return await n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(c),c.committed&&s?.(p-f)}}startTimerImpl(r,s,a){return{cb:typeof s==\"function\"?s:a,reportHeader:()=>{this.level+=1,this.reportInfo(null,`\\u250C ${r}`),this.indent+=1,D0!==null&&!this.json&&this.includeInfos&&this.stdout.write(D0.start(r))},reportFooter:f=>{if(this.indent-=1,D0!==null&&!this.json&&this.includeInfos){this.stdout.write(D0.end(r));for(let p of this.timerFooter)p()}this.configuration.get(\"enableTimers\")&&f>200?this.reportInfo(null,`\\u2514 Completed in ${Ht(this.configuration,f,ht.DURATION)}`):this.reportInfo(null,\"\\u2514 Completed\"),this.level-=1},skipIfEmpty:(typeof s==\"function\"?{}:s).skipIfEmpty}}startTimerSync(r,s,a){let{cb:n,...c}=this.startTimerImpl(r,s,a);return this.startSectionSync(c,n)}async startTimerPromise(r,s,a){let{cb:n,...c}=this.startTimerImpl(r,s,a);return this.startSectionPromise(c,n)}reportSeparator(){this.indent===0?this.writeLine(\"\"):this.reportInfo(null,\"\")}reportInfo(r,s){if(!this.includeInfos)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:\"\",c=`${this.formatPrefix(n,\"blueBright\")}${s}`;this.json?this.reportJson({type:\"info\",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:s}):this.writeLine(c)}reportWarning(r,s){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:\"\";this.json?this.reportJson({type:\"warning\",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:s}):this.writeLine(`${this.formatPrefix(n,\"yellowBright\")}${s}`)}reportError(r,s){this.errorCount+=1,this.timerFooter.push(()=>this.reportErrorImpl(r,s)),this.reportErrorImpl(r,s)}reportErrorImpl(r,s){this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:\"\";this.json?this.reportJson({type:\"error\",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:s}):this.writeLine(`${this.formatPrefix(n,\"redBright\")}${s}`,{truncate:!1})}reportFold(r,s){if(!D0)return;let a=`${D0.start(r)}${s}${D0.end(r)}`;this.timerFooter.push(()=>this.stdout.write(a))}reportProgress(r){if(this.progressStyle===null)return{...Promise.resolve(),stop:()=>{}};if(r.hasProgress&&r.hasTitle)throw new Error(\"Unimplemented: Progress bars can't have both progress and titles.\");let s=!1,a=Promise.resolve().then(async()=>{let c={progress:r.hasProgress?0:void 0,title:r.hasTitle?\"\":void 0};this.progress.set(r,{definition:c,lastScaledSize:r.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:f,title:p}of r)s||c.progress===f&&c.title===p||(c.progress=f,c.title=p,this.refreshProgress());n()}),n=()=>{s||(s=!0,this.progress.delete(r),this.refreshProgress({delta:1}))};return{...a,stop:n}}reportJson(r){this.json&&this.writeLine(`${JSON.stringify(r)}`)}async finalize(){if(!this.includeFooter)return;let r=\"\";this.errorCount>0?r=\"Failed with errors\":this.warningCount>0?r=\"Done with warnings\":r=\"Done\";let s=Ht(this.configuration,Date.now()-this.startTime,ht.DURATION),a=this.configuration.get(\"enableTimers\")?`${r} in ${s}`:r;this.errorCount>0?this.reportError(0,a):this.warningCount>0?this.reportWarning(0,a):this.reportInfo(0,a)}writeLine(r,{truncate:s}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(r,{truncate:s})}\n`),this.writeProgress()}writeLines(r,{truncate:s}={}){this.clearProgress({delta:r.length});for(let a of r)this.stdout.write(`${this.truncate(a,{truncate:s})}\n`);this.writeProgress()}commit(){let r=this.uncommitted;this.uncommitted=new Set;for(let s of r)s.committed=!0,s.action()}clearProgress({delta:r=0,clear:s=!1}){this.progressStyle!==null&&this.progress.size+r>0&&(this.stdout.write(`\\x1B[${this.progress.size+r}A`),(r>0||s)&&this.stdout.write(\"\\x1B[0J\"))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let r=Date.now();r-this.progressTime>Xpe&&(this.progressFrame=(this.progressFrame+1)%zpe.length,this.progressTime=r);let s=zpe[this.progressFrame];for(let a of this.progress.values()){let n=\"\";if(typeof a.lastScaledSize<\"u\"){let h=this.progressStyle.chars[0].repeat(a.lastScaledSize),E=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-a.lastScaledSize);n=` ${h}${E}`}let c=this.formatName(null),f=c?`${c}: `:\"\",p=a.definition.title?` ${a.definition.title}`:\"\";this.stdout.write(`${Ht(this.configuration,\"\\u27A4\",\"blueBright\")} ${f}${s}${n}${p}\n`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},Xpe)}refreshProgress({delta:r=0,force:s=!1}={}){let a=!1,n=!1;if(s||this.progress.size===0)a=!0;else for(let c of this.progress.values()){let f=typeof c.definition.progress<\"u\"?Math.trunc(this.progressMaxScaledSize*c.definition.progress):void 0,p=c.lastScaledSize;c.lastScaledSize=f;let h=c.lastTitle;if(c.lastTitle=c.definition.title,f!==p||(n=h!==c.definition.title)){a=!0;break}}a&&(this.clearProgress({delta:r,clear:n}),this.writeProgress())}truncate(r,{truncate:s}={}){return this.progressStyle===null&&(s=!1),typeof s>\"u\"&&(s=this.configuration.get(\"preferTruncatedLines\")),s&&(r=(0,$pe.default)(r,0,this.stdout.columns-1)),r}formatName(r){return this.includeNames?the(r,{configuration:this.configuration,json:this.json}):\"\"}formatPrefix(r,s){return this.includePrefix?`${Ht(this.configuration,\"\\u27A4\",s)} ${r}${this.formatIndent()}`:\"\"}formatNameWithHyperlink(r){return this.includeNames?Wj(r,{configuration:this.configuration,json:this.json}):\"\"}formatIndent(){return this.level>0||!this.forceSectionAlignment?\"\\u2502 \".repeat(this.indent):`${ait} `}}});var In={};Vt(In,{PackageManager:()=>nhe,detectPackageManager:()=>ihe,executePackageAccessibleBinary:()=>che,executePackageScript:()=>LT,executePackageShellcode:()=>Yj,executeWorkspaceAccessibleBinary:()=>mit,executeWorkspaceLifecycleScript:()=>ahe,executeWorkspaceScript:()=>ohe,getPackageAccessibleBinaries:()=>MT,getWorkspaceAccessibleBinaries:()=>lhe,hasPackageScript:()=>hit,hasWorkspaceScript:()=>Vj,isNodeScript:()=>Jj,makeScriptEnv:()=>Iv,maybeExecuteWorkspaceLifecycleScript:()=>dit,prepareExternalProject:()=>pit});async function b0(t,e,r,s=[]){if(process.platform===\"win32\"){let a=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @\"${r}\" ${s.map(n=>`\"${n.replace('\"','\"\"')}\"`).join(\" \")} %*`;await ce.writeFilePromise(J.format({dir:t,name:e,ext:\".cmd\"}),a)}await ce.writeFilePromise(J.join(t,e),`#!/bin/sh\nexec \"${r}\" ${s.map(a=>`'${a.replace(/'/g,`'\"'\"'`)}'`).join(\" \")} \"$@\"\n`,{mode:493})}async function ihe(t){let e=await Ut.tryFind(t);if(e?.packageManager){let s=xQ(e.packageManager);if(s?.name){let a=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[n]=s.reference.split(\".\");switch(s.name){case\"yarn\":return{packageManagerField:!0,packageManager:Number(n)===1?\"Yarn Classic\":\"Yarn\",reason:a};case\"npm\":return{packageManagerField:!0,packageManager:\"npm\",reason:a};case\"pnpm\":return{packageManagerField:!0,packageManager:\"pnpm\",reason:a}}}}let r;try{r=await ce.readFilePromise(J.join(t,Er.lockfile),\"utf8\")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:\"Yarn\",reason:'\"__metadata\" key found in yarn.lock'}:{packageManager:\"Yarn Classic\",reason:'\"__metadata\" key not found in yarn.lock, must be a Yarn classic lockfile'}:ce.existsSync(J.join(t,\"package-lock.json\"))?{packageManager:\"npm\",reason:`found npm's \"package-lock.json\" lockfile`}:ce.existsSync(J.join(t,\"pnpm-lock.yaml\"))?{packageManager:\"pnpm\",reason:`found pnpm's \"pnpm-lock.yaml\" lockfile`}:null}async function Iv({project:t,locator:e,binFolder:r,ignoreCorepack:s,lifecycleScript:a,baseEnv:n=t?.configuration.env??process.env}){let c={};for(let[E,C]of Object.entries(n))typeof C<\"u\"&&(c[E.toLowerCase()!==\"path\"?E:\"PATH\"]=C);let f=fe.fromPortablePath(r);c.BERRY_BIN_FOLDER=fe.fromPortablePath(f);let p=process.env.COREPACK_ROOT&&!s?fe.join(process.env.COREPACK_ROOT,\"dist/yarn.js\"):process.argv[1];if(await Promise.all([b0(r,\"node\",process.execPath),...fn!==null?[b0(r,\"run\",process.execPath,[p,\"run\"]),b0(r,\"yarn\",process.execPath,[p]),b0(r,\"yarnpkg\",process.execPath,[p]),b0(r,\"node-gyp\",process.execPath,[p,\"run\",\"--top-level\",\"node-gyp\"])]:[]]),t&&(c.INIT_CWD=fe.fromPortablePath(t.configuration.startingCwd),c.PROJECT_CWD=fe.fromPortablePath(t.cwd)),c.PATH=c.PATH?`${f}${fe.delimiter}${c.PATH}`:`${f}`,c.npm_execpath=`${f}${fe.sep}yarn`,c.npm_node_execpath=`${f}${fe.sep}node`,e){if(!t)throw new Error(\"Assertion failed: Missing project\");let E=t.tryWorkspaceByLocator(e),C=E?E.manifest.version??\"\":t.storedPackages.get(e.locatorHash).version??\"\";c.npm_package_name=un(e),c.npm_package_version=C;let S;if(E)S=E.cwd;else{let P=t.storedPackages.get(e.locatorHash);if(!P)throw new Error(`Package for ${Yr(t.configuration,e)} not found in the project`);let I=t.configuration.getLinkers(),R={project:t,report:new Ot({stdout:new P0.PassThrough,configuration:t.configuration})},N=I.find(U=>U.supportsPackage(P,R));if(!N)throw new Error(`The package ${Yr(t.configuration,P)} isn't supported by any of the available linkers`);S=await N.findPackageLocation(P,R)}c.npm_package_json=fe.fromPortablePath(J.join(S,Er.manifest))}let h=fn!==null?`yarn/${fn}`:`yarn/${Pp(\"@yarnpkg/core\").version}-core`;return c.npm_config_user_agent=`${h} npm/? node/${process.version} ${process.platform} ${process.arch}`,a&&(c.npm_lifecycle_event=a),t&&await t.configuration.triggerHook(E=>E.setupScriptEnvironment,t,c,async(E,C,S)=>await b0(r,E,C,S)),c}async function pit(t,e,{configuration:r,report:s,workspace:a=null,locator:n=null}){await Ait(async()=>{await ce.mktempPromise(async c=>{let f=J.join(c,\"pack.log\"),p=null,{stdout:h,stderr:E}=r.getSubprocessStreams(f,{prefix:fe.fromPortablePath(t),report:s}),C=n&&Gu(n)?rI(n):n,S=C?ll(C):\"an external project\";h.write(`Packing ${S} from sources\n`);let P=await ihe(t),I;P!==null?(h.write(`Using ${P.packageManager} for bootstrap. Reason: ${P.reason}\n\n`),I=P.packageManager):(h.write(`No package manager configuration detected; defaulting to Yarn\n\n`),I=\"Yarn\");let R=I===\"Yarn\"&&!P?.packageManagerField;await ce.mktempPromise(async N=>{let U=await Iv({binFolder:N,ignoreCorepack:R,baseEnv:{...process.env,COREPACK_ENABLE_AUTO_PIN:\"0\"}}),ee=new Map([[\"Yarn Classic\",async()=>{let ue=a!==null?[\"workspace\",a]:[],le=J.join(t,Er.manifest),me=await ce.readFilePromise(le),pe=await Wu(process.execPath,[process.argv[1],\"set\",\"version\",\"classic\",\"--only-if-needed\",\"--yarn-path\"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(pe.code!==0)return pe.code;await ce.writeFilePromise(le,me),await ce.appendFilePromise(J.join(t,\".npmignore\"),`/.yarn\n`),h.write(`\n`),delete U.NODE_ENV;let Be=await Wu(\"yarn\",[\"install\"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(Be.code!==0)return Be.code;h.write(`\n`);let Ce=await Wu(\"yarn\",[...ue,\"pack\",\"--filename\",fe.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return Ce.code!==0?Ce.code:0}],[\"Yarn\",async()=>{let ue=a!==null?[\"workspace\",a]:[];U.YARN_ENABLE_INLINE_BUILDS=\"1\";let le=J.join(t,Er.lockfile);await ce.existsPromise(le)||await ce.writeFilePromise(le,\"\");let me=await Wu(\"yarn\",[...ue,\"pack\",\"--install-if-needed\",\"--filename\",fe.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return me.code!==0?me.code:0}],[\"npm\",async()=>{if(a!==null){let we=new P0.PassThrough,ye=WE(we);we.pipe(h,{end:!1});let Ae=await Wu(\"npm\",[\"--version\"],{cwd:t,env:U,stdin:p,stdout:we,stderr:E,end:0});if(we.end(),Ae.code!==0)return h.end(),E.end(),Ae.code;let se=(await ye).toString().trim();if(!Zf(se,\">=7.x\")){let Z=Da(null,\"npm\"),De=On(Z,se),Re=On(Z,\">=7.x\");throw new Error(`Workspaces aren't supported by ${ni(r,De)}; please upgrade to ${ni(r,Re)} (npm has been detected as the primary package manager for ${Ht(r,t,ht.PATH)})`)}}let ue=a!==null?[\"--workspace\",a]:[];delete U.npm_config_user_agent,delete U.npm_config_production,delete U.NPM_CONFIG_PRODUCTION,delete U.NODE_ENV;let le=await Wu(\"npm\",[\"install\",\"--legacy-peer-deps\"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(le.code!==0)return le.code;let me=new P0.PassThrough,pe=WE(me);me.pipe(h);let Be=await Wu(\"npm\",[\"pack\",\"--silent\",...ue],{cwd:t,env:U,stdin:p,stdout:me,stderr:E});if(Be.code!==0)return Be.code;let Ce=(await pe).toString().trim().replace(/^.*\\n/s,\"\"),g=J.resolve(t,fe.toPortablePath(Ce));return await ce.renamePromise(g,e),0}]]).get(I);if(typeof ee>\"u\")throw new Error(\"Assertion failed: Unsupported workflow\");let ie=await ee();if(!(ie===0||typeof ie>\"u\"))throw ce.detachTemp(c),new jt(58,`Packing the package failed (exit code ${ie}, logs can be found here: ${Ht(r,f,ht.PATH)})`)})})})}async function hit(t,e,{project:r}){let s=r.tryWorkspaceByLocator(t);if(s!==null)return Vj(s,e);let a=r.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${Yr(r.configuration,t)} not found in the project`);return await $f.openPromise(async n=>{let c=r.configuration,f=r.configuration.getLinkers(),p={project:r,report:new Ot({stdout:new P0.PassThrough,configuration:c})},h=f.find(P=>P.supportsPackage(a,p));if(!h)throw new Error(`The package ${Yr(r.configuration,a)} isn't supported by any of the available linkers`);let E=await h.findPackageLocation(a,p),C=new Sn(E,{baseFs:n});return(await Ut.find(vt.dot,{baseFs:C})).scripts.has(e)})}async function LT(t,e,r,{cwd:s,project:a,stdin:n,stdout:c,stderr:f}){return await ce.mktempPromise(async p=>{let{manifest:h,env:E,cwd:C}=await she(t,{project:a,binFolder:p,cwd:s,lifecycleScript:e}),S=h.scripts.get(e);if(typeof S>\"u\")return 1;let P=async()=>await vI(S,r,{cwd:C,env:E,stdin:n,stdout:c,stderr:f});return await(await a.configuration.reduceHook(R=>R.wrapScriptExecution,P,a,t,e,{script:S,args:r,cwd:C,env:E,stdin:n,stdout:c,stderr:f}))()})}async function Yj(t,e,r,{cwd:s,project:a,stdin:n,stdout:c,stderr:f}){return await ce.mktempPromise(async p=>{let{env:h,cwd:E}=await she(t,{project:a,binFolder:p,cwd:s});return await vI(e,r,{cwd:E,env:h,stdin:n,stdout:c,stderr:f})})}async function git(t,{binFolder:e,cwd:r,lifecycleScript:s}){let a=await Iv({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:s});return await Kj(e,await lhe(t)),typeof r>\"u\"&&(r=J.dirname(await ce.realpathPromise(J.join(t.cwd,\"package.json\")))),{manifest:t.manifest,binFolder:e,env:a,cwd:r}}async function she(t,{project:e,binFolder:r,cwd:s,lifecycleScript:a}){let n=e.tryWorkspaceByLocator(t);if(n!==null)return git(n,{binFolder:r,cwd:s,lifecycleScript:a});let c=e.storedPackages.get(t.locatorHash);if(!c)throw new Error(`Package for ${Yr(e.configuration,t)} not found in the project`);return await $f.openPromise(async f=>{let p=e.configuration,h=e.configuration.getLinkers(),E={project:e,report:new Ot({stdout:new P0.PassThrough,configuration:p})},C=h.find(N=>N.supportsPackage(c,E));if(!C)throw new Error(`The package ${Yr(e.configuration,c)} isn't supported by any of the available linkers`);let S=await Iv({project:e,locator:t,binFolder:r,lifecycleScript:a});await Kj(r,await MT(t,{project:e}));let P=await C.findPackageLocation(c,E),I=new Sn(P,{baseFs:f}),R=await Ut.find(vt.dot,{baseFs:I});return typeof s>\"u\"&&(s=P),{manifest:R,binFolder:r,env:S,cwd:s}})}async function ohe(t,e,r,{cwd:s,stdin:a,stdout:n,stderr:c}){return await LT(t.anchoredLocator,e,r,{cwd:s,project:t.project,stdin:a,stdout:n,stderr:c})}function Vj(t,e){return t.manifest.scripts.has(e)}async function ahe(t,e,{cwd:r,report:s}){let{configuration:a}=t.project,n=null;await ce.mktempPromise(async c=>{let f=J.join(c,`${e}.log`),p=`# This file contains the result of Yarn calling the \"${e}\" lifecycle script inside a workspace (\"${fe.fromPortablePath(t.cwd)}\")\n`,{stdout:h,stderr:E}=a.getSubprocessStreams(f,{report:s,prefix:Yr(a,t.anchoredLocator),header:p});s.reportInfo(36,`Calling the \"${e}\" lifecycle script`);let C=await ohe(t,e,[],{cwd:r,stdin:n,stdout:h,stderr:E});if(h.end(),E.end(),C!==0)throw ce.detachTemp(c),new jt(36,`${bB(e)} script failed (exit code ${Ht(a,C,ht.NUMBER)}, logs can be found here: ${Ht(a,f,ht.PATH)}); run ${Ht(a,`yarn ${e}`,ht.CODE)} to investigate`)})}async function dit(t,e,r){Vj(t,e)&&await ahe(t,e,r)}function Jj(t){let e=J.extname(t);if(e.match(/\\.[cm]?[jt]sx?$/))return!0;if(e===\".exe\"||e===\".bin\")return!1;let r=Buffer.alloc(4),s;try{s=ce.openSync(t,\"r\")}catch{return!0}try{ce.readSync(s,r,0,r.length,0)}finally{ce.closeSync(s)}let a=r.readUint32BE();return!(a===3405691582||a===3489328638||a===2135247942||(a&4294901760)===1297743872)}async function MT(t,{project:e}){let r=e.configuration,s=new Map,a=e.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${Yr(r,t)} not found in the project`);let n=new P0.Writable,c=r.getLinkers(),f={project:e,report:new Ot({configuration:r,stdout:n})},p=new Set([t.locatorHash]);for(let E of a.dependencies.values()){let C=e.storedResolutions.get(E.descriptorHash);if(!C)throw new Error(`Assertion failed: The resolution (${ni(r,E)}) should have been registered`);p.add(C)}let h=await Promise.all(Array.from(p,async E=>{let C=e.storedPackages.get(E);if(!C)throw new Error(`Assertion failed: The package (${E}) should have been registered`);if(C.bin.size===0)return Wl.skip;let S=c.find(I=>I.supportsPackage(C,f));if(!S)return Wl.skip;let P=null;try{P=await S.findPackageLocation(C,f)}catch(I){if(I.code===\"LOCATOR_NOT_INSTALLED\")return Wl.skip;throw I}return{dependency:C,packageLocation:P}}));for(let E of h){if(E===Wl.skip)continue;let{dependency:C,packageLocation:S}=E;for(let[P,I]of C.bin){let R=J.resolve(S,I);s.set(P,[C,fe.fromPortablePath(R),Jj(R)])}}return s}async function lhe(t){return await MT(t.anchoredLocator,{project:t.project})}async function Kj(t,e){await Promise.all(Array.from(e,([r,[,s,a]])=>a?b0(t,r,process.execPath,[s]):b0(t,r,s,[])))}async function che(t,e,r,{cwd:s,project:a,stdin:n,stdout:c,stderr:f,nodeArgs:p=[],packageAccessibleBinaries:h}){h??=await MT(t,{project:a});let E=h.get(e);if(!E)throw new Error(`Binary not found (${e}) for ${Yr(a.configuration,t)}`);return await ce.mktempPromise(async C=>{let[,S]=E,P=await Iv({project:a,locator:t,binFolder:C});await Kj(P.BERRY_BIN_FOLDER,h);let I=Jj(fe.toPortablePath(S))?Wu(process.execPath,[...p,S,...r],{cwd:s,env:P,stdin:n,stdout:c,stderr:f}):Wu(S,r,{cwd:s,env:P,stdin:n,stdout:c,stderr:f}),R;try{R=await I}finally{await ce.removePromise(P.BERRY_BIN_FOLDER)}return R.code})}async function mit(t,e,r,{cwd:s,stdin:a,stdout:n,stderr:c,packageAccessibleBinaries:f}){return await che(t.anchoredLocator,e,r,{project:t.project,cwd:s,stdin:a,stdout:n,stderr:c,packageAccessibleBinaries:f})}var rhe,P0,nhe,fit,Ait,zj=Xe(()=>{Dt();Dt();eA();pv();ql();rhe=ut(Ld()),P0=Ie(\"stream\");oI();Tc();Ev();yv();dT();xc();Pc();Rp();Wo();nhe=(a=>(a.Yarn1=\"Yarn Classic\",a.Yarn2=\"Yarn\",a.Npm=\"npm\",a.Pnpm=\"pnpm\",a))(nhe||{});fit=2,Ait=(0,rhe.default)(fit)});var DI=_((J4t,fhe)=>{\"use strict\";var uhe=new Map([[\"C\",\"cwd\"],[\"f\",\"file\"],[\"z\",\"gzip\"],[\"P\",\"preservePaths\"],[\"U\",\"unlink\"],[\"strip-components\",\"strip\"],[\"stripComponents\",\"strip\"],[\"keep-newer\",\"newer\"],[\"keepNewer\",\"newer\"],[\"keep-newer-files\",\"newer\"],[\"keepNewerFiles\",\"newer\"],[\"k\",\"keep\"],[\"keep-existing\",\"keep\"],[\"keepExisting\",\"keep\"],[\"m\",\"noMtime\"],[\"no-mtime\",\"noMtime\"],[\"p\",\"preserveOwner\"],[\"L\",\"follow\"],[\"h\",\"follow\"]]);fhe.exports=t=>t?Object.keys(t).map(e=>[uhe.has(e)?uhe.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var PI=_((K4t,Ihe)=>{\"use strict\";var Ahe=typeof process==\"object\"&&process?process:{stdout:null,stderr:null},yit=Ie(\"events\"),phe=Ie(\"stream\"),hhe=Ie(\"string_decoder\").StringDecoder,_p=Symbol(\"EOF\"),Hp=Symbol(\"maybeEmitEnd\"),x0=Symbol(\"emittedEnd\"),UT=Symbol(\"emittingEnd\"),Cv=Symbol(\"emittedError\"),_T=Symbol(\"closed\"),ghe=Symbol(\"read\"),HT=Symbol(\"flush\"),dhe=Symbol(\"flushChunk\"),ul=Symbol(\"encoding\"),jp=Symbol(\"decoder\"),jT=Symbol(\"flowing\"),wv=Symbol(\"paused\"),bI=Symbol(\"resume\"),Ys=Symbol(\"bufferLength\"),Xj=Symbol(\"bufferPush\"),Zj=Symbol(\"bufferShift\"),Ko=Symbol(\"objectMode\"),zo=Symbol(\"destroyed\"),$j=Symbol(\"emitData\"),mhe=Symbol(\"emitEnd\"),e6=Symbol(\"emitEnd2\"),Gp=Symbol(\"async\"),Bv=t=>Promise.resolve().then(t),yhe=global._MP_NO_ITERATOR_SYMBOLS_!==\"1\",Eit=yhe&&Symbol.asyncIterator||Symbol(\"asyncIterator not implemented\"),Iit=yhe&&Symbol.iterator||Symbol(\"iterator not implemented\"),Cit=t=>t===\"end\"||t===\"finish\"||t===\"prefinish\",wit=t=>t instanceof ArrayBuffer||typeof t==\"object\"&&t.constructor&&t.constructor.name===\"ArrayBuffer\"&&t.byteLength>=0,Bit=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t),GT=class{constructor(e,r,s){this.src=e,this.dest=r,this.opts=s,this.ondrain=()=>e[bI](),r.on(\"drain\",this.ondrain)}unpipe(){this.dest.removeListener(\"drain\",this.ondrain)}proxyErrors(){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},t6=class extends GT{unpipe(){this.src.removeListener(\"error\",this.proxyErrors),super.unpipe()}constructor(e,r,s){super(e,r,s),this.proxyErrors=a=>r.emit(\"error\",a),e.on(\"error\",this.proxyErrors)}};Ihe.exports=class Ehe extends phe{constructor(e){super(),this[jT]=!1,this[wv]=!1,this.pipes=[],this.buffer=[],this[Ko]=e&&e.objectMode||!1,this[Ko]?this[ul]=null:this[ul]=e&&e.encoding||null,this[ul]===\"buffer\"&&(this[ul]=null),this[Gp]=e&&!!e.async||!1,this[jp]=this[ul]?new hhe(this[ul]):null,this[_p]=!1,this[x0]=!1,this[UT]=!1,this[_T]=!1,this[Cv]=null,this.writable=!0,this.readable=!0,this[Ys]=0,this[zo]=!1}get bufferLength(){return this[Ys]}get encoding(){return this[ul]}set encoding(e){if(this[Ko])throw new Error(\"cannot set encoding in objectMode\");if(this[ul]&&e!==this[ul]&&(this[jp]&&this[jp].lastNeed||this[Ys]))throw new Error(\"cannot change encoding\");this[ul]!==e&&(this[jp]=e?new hhe(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[jp].write(r)))),this[ul]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[Ko]}set objectMode(e){this[Ko]=this[Ko]||!!e}get async(){return this[Gp]}set async(e){this[Gp]=this[Gp]||!!e}write(e,r,s){if(this[_p])throw new Error(\"write after end\");if(this[zo])return this.emit(\"error\",Object.assign(new Error(\"Cannot call write after a stream was destroyed\"),{code:\"ERR_STREAM_DESTROYED\"})),!0;typeof r==\"function\"&&(s=r,r=\"utf8\"),r||(r=\"utf8\");let a=this[Gp]?Bv:n=>n();return!this[Ko]&&!Buffer.isBuffer(e)&&(Bit(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):wit(e)?e=Buffer.from(e):typeof e!=\"string\"&&(this.objectMode=!0)),this[Ko]?(this.flowing&&this[Ys]!==0&&this[HT](!0),this.flowing?this.emit(\"data\",e):this[Xj](e),this[Ys]!==0&&this.emit(\"readable\"),s&&a(s),this.flowing):e.length?(typeof e==\"string\"&&!(r===this[ul]&&!this[jp].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[ul]&&(e=this[jp].write(e)),this.flowing&&this[Ys]!==0&&this[HT](!0),this.flowing?this.emit(\"data\",e):this[Xj](e),this[Ys]!==0&&this.emit(\"readable\"),s&&a(s),this.flowing):(this[Ys]!==0&&this.emit(\"readable\"),s&&a(s),this.flowing)}read(e){if(this[zo])return null;if(this[Ys]===0||e===0||e>this[Ys])return this[Hp](),null;this[Ko]&&(e=null),this.buffer.length>1&&!this[Ko]&&(this.encoding?this.buffer=[this.buffer.join(\"\")]:this.buffer=[Buffer.concat(this.buffer,this[Ys])]);let r=this[ghe](e||null,this.buffer[0]);return this[Hp](),r}[ghe](e,r){return e===r.length||e===null?this[Zj]():(this.buffer[0]=r.slice(e),r=r.slice(0,e),this[Ys]-=e),this.emit(\"data\",r),!this.buffer.length&&!this[_p]&&this.emit(\"drain\"),r}end(e,r,s){return typeof e==\"function\"&&(s=e,e=null),typeof r==\"function\"&&(s=r,r=\"utf8\"),e&&this.write(e,r),s&&this.once(\"end\",s),this[_p]=!0,this.writable=!1,(this.flowing||!this[wv])&&this[Hp](),this}[bI](){this[zo]||(this[wv]=!1,this[jT]=!0,this.emit(\"resume\"),this.buffer.length?this[HT]():this[_p]?this[Hp]():this.emit(\"drain\"))}resume(){return this[bI]()}pause(){this[jT]=!1,this[wv]=!0}get destroyed(){return this[zo]}get flowing(){return this[jT]}get paused(){return this[wv]}[Xj](e){this[Ko]?this[Ys]+=1:this[Ys]+=e.length,this.buffer.push(e)}[Zj](){return this.buffer.length&&(this[Ko]?this[Ys]-=1:this[Ys]-=this.buffer[0].length),this.buffer.shift()}[HT](e){do;while(this[dhe](this[Zj]()));!e&&!this.buffer.length&&!this[_p]&&this.emit(\"drain\")}[dhe](e){return e?(this.emit(\"data\",e),this.flowing):!1}pipe(e,r){if(this[zo])return;let s=this[x0];return r=r||{},e===Ahe.stdout||e===Ahe.stderr?r.end=!1:r.end=r.end!==!1,r.proxyErrors=!!r.proxyErrors,s?r.end&&e.end():(this.pipes.push(r.proxyErrors?new t6(this,e,r):new GT(this,e,r)),this[Gp]?Bv(()=>this[bI]()):this[bI]()),e}unpipe(e){let r=this.pipes.find(s=>s.dest===e);r&&(this.pipes.splice(this.pipes.indexOf(r),1),r.unpipe())}addListener(e,r){return this.on(e,r)}on(e,r){let s=super.on(e,r);return e===\"data\"&&!this.pipes.length&&!this.flowing?this[bI]():e===\"readable\"&&this[Ys]!==0?super.emit(\"readable\"):Cit(e)&&this[x0]?(super.emit(e),this.removeAllListeners(e)):e===\"error\"&&this[Cv]&&(this[Gp]?Bv(()=>r.call(this,this[Cv])):r.call(this,this[Cv])),s}get emittedEnd(){return this[x0]}[Hp](){!this[UT]&&!this[x0]&&!this[zo]&&this.buffer.length===0&&this[_p]&&(this[UT]=!0,this.emit(\"end\"),this.emit(\"prefinish\"),this.emit(\"finish\"),this[_T]&&this.emit(\"close\"),this[UT]=!1)}emit(e,r,...s){if(e!==\"error\"&&e!==\"close\"&&e!==zo&&this[zo])return;if(e===\"data\")return r?this[Gp]?Bv(()=>this[$j](r)):this[$j](r):!1;if(e===\"end\")return this[mhe]();if(e===\"close\"){if(this[_T]=!0,!this[x0]&&!this[zo])return;let n=super.emit(\"close\");return this.removeAllListeners(\"close\"),n}else if(e===\"error\"){this[Cv]=r;let n=super.emit(\"error\",r);return this[Hp](),n}else if(e===\"resume\"){let n=super.emit(\"resume\");return this[Hp](),n}else if(e===\"finish\"||e===\"prefinish\"){let n=super.emit(e);return this.removeAllListeners(e),n}let a=super.emit(e,r,...s);return this[Hp](),a}[$j](e){for(let s of this.pipes)s.dest.write(e)===!1&&this.pause();let r=super.emit(\"data\",e);return this[Hp](),r}[mhe](){this[x0]||(this[x0]=!0,this.readable=!1,this[Gp]?Bv(()=>this[e6]()):this[e6]())}[e6](){if(this[jp]){let r=this[jp].end();if(r){for(let s of this.pipes)s.dest.write(r);super.emit(\"data\",r)}}for(let r of this.pipes)r.end();let e=super.emit(\"end\");return this.removeAllListeners(\"end\"),e}collect(){let e=[];this[Ko]||(e.dataLength=0);let r=this.promise();return this.on(\"data\",s=>{e.push(s),this[Ko]||(e.dataLength+=s.length)}),r.then(()=>e)}concat(){return this[Ko]?Promise.reject(new Error(\"cannot concat in objectMode\")):this.collect().then(e=>this[Ko]?Promise.reject(new Error(\"cannot concat in objectMode\")):this[ul]?e.join(\"\"):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(zo,()=>r(new Error(\"stream destroyed\"))),this.on(\"error\",s=>r(s)),this.on(\"end\",()=>e())})}[Eit](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[_p])return Promise.resolve({done:!0});let s=null,a=null,n=h=>{this.removeListener(\"data\",c),this.removeListener(\"end\",f),a(h)},c=h=>{this.removeListener(\"error\",n),this.removeListener(\"end\",f),this.pause(),s({value:h,done:!!this[_p]})},f=()=>{this.removeListener(\"error\",n),this.removeListener(\"data\",c),s({done:!0})},p=()=>n(new Error(\"stream destroyed\"));return new Promise((h,E)=>{a=E,s=h,this.once(zo,p),this.once(\"error\",n),this.once(\"end\",f),this.once(\"data\",c)})}}}[Iit](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[zo]?(e?this.emit(\"error\",e):this.emit(zo),this):(this[zo]=!0,this.buffer.length=0,this[Ys]=0,typeof this.close==\"function\"&&!this[_T]&&this.close(),e?this.emit(\"error\",e):this.emit(zo),this)}static isStream(e){return!!e&&(e instanceof Ehe||e instanceof phe||e instanceof yit&&(typeof e.pipe==\"function\"||typeof e.write==\"function\"&&typeof e.end==\"function\"))}}});var whe=_((z4t,Che)=>{var vit=Ie(\"zlib\").constants||{ZLIB_VERNUM:4736};Che.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},vit))});var m6=_(Kl=>{\"use strict\";var o6=Ie(\"assert\"),k0=Ie(\"buffer\").Buffer,She=Ie(\"zlib\"),fm=Kl.constants=whe(),Sit=PI(),Bhe=k0.concat,Am=Symbol(\"_superWrite\"),kI=class extends Error{constructor(e){super(\"zlib: \"+e.message),this.code=e.code,this.errno=e.errno,this.code||(this.code=\"ZLIB_ERROR\"),this.message=\"zlib: \"+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return\"ZlibError\"}},Dit=Symbol(\"opts\"),vv=Symbol(\"flushFlag\"),vhe=Symbol(\"finishFlushFlag\"),d6=Symbol(\"fullFlushFlag\"),Ii=Symbol(\"handle\"),qT=Symbol(\"onError\"),xI=Symbol(\"sawError\"),r6=Symbol(\"level\"),n6=Symbol(\"strategy\"),i6=Symbol(\"ended\"),X4t=Symbol(\"_defaultFullFlush\"),WT=class extends Sit{constructor(e,r){if(!e||typeof e!=\"object\")throw new TypeError(\"invalid options for ZlibBase constructor\");super(e),this[xI]=!1,this[i6]=!1,this[Dit]=e,this[vv]=e.flush,this[vhe]=e.finishFlush;try{this[Ii]=new She[r](e)}catch(s){throw new kI(s)}this[qT]=s=>{this[xI]||(this[xI]=!0,this.close(),this.emit(\"error\",s))},this[Ii].on(\"error\",s=>this[qT](new kI(s))),this.once(\"end\",()=>this.close)}close(){this[Ii]&&(this[Ii].close(),this[Ii]=null,this.emit(\"close\"))}reset(){if(!this[xI])return o6(this[Ii],\"zlib binding closed\"),this[Ii].reset()}flush(e){this.ended||(typeof e!=\"number\"&&(e=this[d6]),this.write(Object.assign(k0.alloc(0),{[vv]:e})))}end(e,r,s){return e&&this.write(e,r),this.flush(this[vhe]),this[i6]=!0,super.end(null,null,s)}get ended(){return this[i6]}write(e,r,s){if(typeof r==\"function\"&&(s=r,r=\"utf8\"),typeof e==\"string\"&&(e=k0.from(e,r)),this[xI])return;o6(this[Ii],\"zlib binding closed\");let a=this[Ii]._handle,n=a.close;a.close=()=>{};let c=this[Ii].close;this[Ii].close=()=>{},k0.concat=h=>h;let f;try{let h=typeof e[vv]==\"number\"?e[vv]:this[vv];f=this[Ii]._processChunk(e,h),k0.concat=Bhe}catch(h){k0.concat=Bhe,this[qT](new kI(h))}finally{this[Ii]&&(this[Ii]._handle=a,a.close=n,this[Ii].close=c,this[Ii].removeAllListeners(\"error\"))}this[Ii]&&this[Ii].on(\"error\",h=>this[qT](new kI(h)));let p;if(f)if(Array.isArray(f)&&f.length>0){p=this[Am](k0.from(f[0]));for(let h=1;h<f.length;h++)p=this[Am](f[h])}else p=this[Am](k0.from(f));return s&&s(),p}[Am](e){return super.write(e)}},qp=class extends WT{constructor(e,r){e=e||{},e.flush=e.flush||fm.Z_NO_FLUSH,e.finishFlush=e.finishFlush||fm.Z_FINISH,super(e,r),this[d6]=fm.Z_FULL_FLUSH,this[r6]=e.level,this[n6]=e.strategy}params(e,r){if(!this[xI]){if(!this[Ii])throw new Error(\"cannot switch params when binding is closed\");if(!this[Ii].params)throw new Error(\"not supported in this implementation\");if(this[r6]!==e||this[n6]!==r){this.flush(fm.Z_SYNC_FLUSH),o6(this[Ii],\"zlib binding closed\");let s=this[Ii].flush;this[Ii].flush=(a,n)=>{this.flush(a),n()};try{this[Ii].params(e,r)}finally{this[Ii].flush=s}this[Ii]&&(this[r6]=e,this[n6]=r)}}}},a6=class extends qp{constructor(e){super(e,\"Deflate\")}},l6=class extends qp{constructor(e){super(e,\"Inflate\")}},s6=Symbol(\"_portable\"),c6=class extends qp{constructor(e){super(e,\"Gzip\"),this[s6]=e&&!!e.portable}[Am](e){return this[s6]?(this[s6]=!1,e[9]=255,super[Am](e)):super[Am](e)}},u6=class extends qp{constructor(e){super(e,\"Gunzip\")}},f6=class extends qp{constructor(e){super(e,\"DeflateRaw\")}},A6=class extends qp{constructor(e){super(e,\"InflateRaw\")}},p6=class extends qp{constructor(e){super(e,\"Unzip\")}},YT=class extends WT{constructor(e,r){e=e||{},e.flush=e.flush||fm.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||fm.BROTLI_OPERATION_FINISH,super(e,r),this[d6]=fm.BROTLI_OPERATION_FLUSH}},h6=class extends YT{constructor(e){super(e,\"BrotliCompress\")}},g6=class extends YT{constructor(e){super(e,\"BrotliDecompress\")}};Kl.Deflate=a6;Kl.Inflate=l6;Kl.Gzip=c6;Kl.Gunzip=u6;Kl.DeflateRaw=f6;Kl.InflateRaw=A6;Kl.Unzip=p6;typeof She.BrotliCompress==\"function\"?(Kl.BrotliCompress=h6,Kl.BrotliDecompress=g6):Kl.BrotliCompress=Kl.BrotliDecompress=class{constructor(){throw new Error(\"Brotli is not supported in this version of Node.js\")}}});var QI=_((e3t,Dhe)=>{var bit=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;Dhe.exports=bit!==\"win32\"?t=>t:t=>t&&t.replace(/\\\\/g,\"/\")});var VT=_((r3t,bhe)=>{\"use strict\";var Pit=PI(),y6=QI(),E6=Symbol(\"slurp\");bhe.exports=class extends Pit{constructor(e,r,s){switch(super(),this.pause(),this.extended=r,this.globalExtended=s,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case\"File\":case\"OldFile\":case\"Link\":case\"SymbolicLink\":case\"CharacterDevice\":case\"BlockDevice\":case\"Directory\":case\"FIFO\":case\"ContiguousFile\":case\"GNUDumpDir\":break;case\"NextFileHasLongLinkpath\":case\"NextFileHasLongPath\":case\"OldGnuLongPath\":case\"GlobalExtendedHeader\":case\"ExtendedHeader\":case\"OldExtendedHeader\":this.meta=!0;break;default:this.ignore=!0}this.path=y6(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=y6(e.linkpath),this.uname=e.uname,this.gname=e.gname,r&&this[E6](r),s&&this[E6](s,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error(\"writing more to entry than is appropriate\");let s=this.remain,a=this.blockRemain;return this.remain=Math.max(0,s-r),this.blockRemain=Math.max(0,a-r),this.ignore?!0:s>=r?super.write(e):super.write(e.slice(0,s))}[E6](e,r){for(let s in e)e[s]!==null&&e[s]!==void 0&&!(r&&s===\"path\")&&(this[s]=s===\"path\"||s===\"linkpath\"?y6(e[s]):e[s])}}});var I6=_(JT=>{\"use strict\";JT.name=new Map([[\"0\",\"File\"],[\"\",\"OldFile\"],[\"1\",\"Link\"],[\"2\",\"SymbolicLink\"],[\"3\",\"CharacterDevice\"],[\"4\",\"BlockDevice\"],[\"5\",\"Directory\"],[\"6\",\"FIFO\"],[\"7\",\"ContiguousFile\"],[\"g\",\"GlobalExtendedHeader\"],[\"x\",\"ExtendedHeader\"],[\"A\",\"SolarisACL\"],[\"D\",\"GNUDumpDir\"],[\"I\",\"Inode\"],[\"K\",\"NextFileHasLongLinkpath\"],[\"L\",\"NextFileHasLongPath\"],[\"M\",\"ContinuationFile\"],[\"N\",\"OldGnuLongPath\"],[\"S\",\"SparseFile\"],[\"V\",\"TapeVolumeHeader\"],[\"X\",\"OldExtendedHeader\"]]);JT.code=new Map(Array.from(JT.name).map(t=>[t[1],t[0]]))});var Qhe=_((i3t,khe)=>{\"use strict\";var xit=(t,e)=>{if(Number.isSafeInteger(t))t<0?Qit(t,e):kit(t,e);else throw Error(\"cannot encode number outside of javascript safe integer range\");return e},kit=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},Qit=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var s=e.length;s>1;s--){var a=t&255;t=Math.floor(t/256),r?e[s-1]=Phe(a):a===0?e[s-1]=0:(r=!0,e[s-1]=xhe(a))}},Tit=t=>{let e=t[0],r=e===128?Fit(t.slice(1,t.length)):e===255?Rit(t):null;if(r===null)throw Error(\"invalid base256 encoding\");if(!Number.isSafeInteger(r))throw Error(\"parsed number outside of javascript safe integer range\");return r},Rit=t=>{for(var e=t.length,r=0,s=!1,a=e-1;a>-1;a--){var n=t[a],c;s?c=Phe(n):n===0?c=n:(s=!0,c=xhe(n)),c!==0&&(r-=c*Math.pow(256,e-a-1))}return r},Fit=t=>{for(var e=t.length,r=0,s=e-1;s>-1;s--){var a=t[s];a!==0&&(r+=a*Math.pow(256,e-s-1))}return r},Phe=t=>(255^t)&255,xhe=t=>(255^t)+1&255;khe.exports={encode:xit,parse:Tit}});var RI=_((s3t,Rhe)=>{\"use strict\";var C6=I6(),TI=Ie(\"path\").posix,The=Qhe(),w6=Symbol(\"slurp\"),zl=Symbol(\"type\"),S6=class{constructor(e,r,s,a){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[zl]=\"0\",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,s,a):e&&this.set(e)}decode(e,r,s,a){if(r||(r=0),!e||!(e.length>=r+512))throw new Error(\"need 512 bytes for header\");if(this.path=pm(e,r,100),this.mode=Q0(e,r+100,8),this.uid=Q0(e,r+108,8),this.gid=Q0(e,r+116,8),this.size=Q0(e,r+124,12),this.mtime=B6(e,r+136,12),this.cksum=Q0(e,r+148,12),this[w6](s),this[w6](a,!0),this[zl]=pm(e,r+156,1),this[zl]===\"\"&&(this[zl]=\"0\"),this[zl]===\"0\"&&this.path.substr(-1)===\"/\"&&(this[zl]=\"5\"),this[zl]===\"5\"&&(this.size=0),this.linkpath=pm(e,r+157,100),e.slice(r+257,r+265).toString()===\"ustar\\x0000\")if(this.uname=pm(e,r+265,32),this.gname=pm(e,r+297,32),this.devmaj=Q0(e,r+329,8),this.devmin=Q0(e,r+337,8),e[r+475]!==0){let c=pm(e,r+345,155);this.path=c+\"/\"+this.path}else{let c=pm(e,r+345,130);c&&(this.path=c+\"/\"+this.path),this.atime=B6(e,r+476,12),this.ctime=B6(e,r+488,12)}let n=8*32;for(let c=r;c<r+148;c++)n+=e[c];for(let c=r+156;c<r+512;c++)n+=e[c];this.cksumValid=n===this.cksum,this.cksum===null&&n===8*32&&(this.nullBlock=!0)}[w6](e,r){for(let s in e)e[s]!==null&&e[s]!==void 0&&!(r&&s===\"path\")&&(this[s]=e[s])}encode(e,r){if(e||(e=this.block=Buffer.alloc(512),r=0),r||(r=0),!(e.length>=r+512))throw new Error(\"need 512 bytes for header\");let s=this.ctime||this.atime?130:155,a=Nit(this.path||\"\",s),n=a[0],c=a[1];this.needPax=a[2],this.needPax=hm(e,r,100,n)||this.needPax,this.needPax=T0(e,r+100,8,this.mode)||this.needPax,this.needPax=T0(e,r+108,8,this.uid)||this.needPax,this.needPax=T0(e,r+116,8,this.gid)||this.needPax,this.needPax=T0(e,r+124,12,this.size)||this.needPax,this.needPax=v6(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[zl].charCodeAt(0),this.needPax=hm(e,r+157,100,this.linkpath)||this.needPax,e.write(\"ustar\\x0000\",r+257,8),this.needPax=hm(e,r+265,32,this.uname)||this.needPax,this.needPax=hm(e,r+297,32,this.gname)||this.needPax,this.needPax=T0(e,r+329,8,this.devmaj)||this.needPax,this.needPax=T0(e,r+337,8,this.devmin)||this.needPax,this.needPax=hm(e,r+345,s,c)||this.needPax,e[r+475]!==0?this.needPax=hm(e,r+345,155,c)||this.needPax:(this.needPax=hm(e,r+345,130,c)||this.needPax,this.needPax=v6(e,r+476,12,this.atime)||this.needPax,this.needPax=v6(e,r+488,12,this.ctime)||this.needPax);let f=8*32;for(let p=r;p<r+148;p++)f+=e[p];for(let p=r+156;p<r+512;p++)f+=e[p];return this.cksum=f,T0(e,r+148,8,this.cksum),this.cksumValid=!0,this.needPax}set(e){for(let r in e)e[r]!==null&&e[r]!==void 0&&(this[r]=e[r])}get type(){return C6.name.get(this[zl])||this[zl]}get typeKey(){return this[zl]}set type(e){C6.code.has(e)?this[zl]=C6.code.get(e):this[zl]=e}},Nit=(t,e)=>{let s=t,a=\"\",n,c=TI.parse(t).root||\".\";if(Buffer.byteLength(s)<100)n=[s,a,!1];else{a=TI.dirname(s),s=TI.basename(s);do Buffer.byteLength(s)<=100&&Buffer.byteLength(a)<=e?n=[s,a,!1]:Buffer.byteLength(s)>100&&Buffer.byteLength(a)<=e?n=[s.substr(0,99),a,!0]:(s=TI.join(TI.basename(a),s),a=TI.dirname(a));while(a!==c&&!n);n||(n=[t.substr(0,99),\"\",!0])}return n},pm=(t,e,r)=>t.slice(e,e+r).toString(\"utf8\").replace(/\\0.*/,\"\"),B6=(t,e,r)=>Oit(Q0(t,e,r)),Oit=t=>t===null?null:new Date(t*1e3),Q0=(t,e,r)=>t[e]&128?The.parse(t.slice(e,e+r)):Mit(t,e,r),Lit=t=>isNaN(t)?null:t,Mit=(t,e,r)=>Lit(parseInt(t.slice(e,e+r).toString(\"utf8\").replace(/\\0.*$/,\"\").trim(),8)),Uit={12:8589934591,8:2097151},T0=(t,e,r,s)=>s===null?!1:s>Uit[r]||s<0?(The.encode(s,t.slice(e,e+r)),!0):(_it(t,e,r,s),!1),_it=(t,e,r,s)=>t.write(Hit(s,r),e,r,\"ascii\"),Hit=(t,e)=>jit(Math.floor(t).toString(8),e),jit=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join(\"0\")+t+\" \")+\"\\0\",v6=(t,e,r,s)=>s===null?!1:T0(t,e,r,s.getTime()/1e3),Git=new Array(156).join(\"\\0\"),hm=(t,e,r,s)=>s===null?!1:(t.write(s+Git,e,r,\"utf8\"),s.length!==Buffer.byteLength(s)||s.length>r);Rhe.exports=S6});var KT=_((o3t,Fhe)=>{\"use strict\";var qit=RI(),Wit=Ie(\"path\"),Sv=class{constructor(e,r){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=r||!1}encode(){let e=this.encodeBody();if(e===\"\")return null;let r=Buffer.byteLength(e),s=512*Math.ceil(1+r/512),a=Buffer.allocUnsafe(s);for(let n=0;n<512;n++)a[n]=0;new qit({path:(\"PaxHeader/\"+Wit.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,mtime:this.mtime||null,type:this.global?\"GlobalExtendedHeader\":\"ExtendedHeader\",linkpath:\"\",uname:this.uname||\"\",gname:this.gname||\"\",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(a),a.write(e,512,r,\"utf8\");for(let n=r+512;n<a.length;n++)a[n]=0;return a}encodeBody(){return this.encodeField(\"path\")+this.encodeField(\"ctime\")+this.encodeField(\"atime\")+this.encodeField(\"dev\")+this.encodeField(\"ino\")+this.encodeField(\"nlink\")+this.encodeField(\"charset\")+this.encodeField(\"comment\")+this.encodeField(\"gid\")+this.encodeField(\"gname\")+this.encodeField(\"linkpath\")+this.encodeField(\"mtime\")+this.encodeField(\"size\")+this.encodeField(\"uid\")+this.encodeField(\"uname\")}encodeField(e){if(this[e]===null||this[e]===void 0)return\"\";let r=this[e]instanceof Date?this[e].getTime()/1e3:this[e],s=\" \"+(e===\"dev\"||e===\"ino\"||e===\"nlink\"?\"SCHILY.\":\"\")+e+\"=\"+r+`\n`,a=Buffer.byteLength(s),n=Math.floor(Math.log(a)/Math.log(10))+1;return a+n>=Math.pow(10,n)&&(n+=1),n+a+s}};Sv.parse=(t,e,r)=>new Sv(Yit(Vit(t),e),r);var Yit=(t,e)=>e?Object.keys(t).reduce((r,s)=>(r[s]=t[s],r),e):t,Vit=t=>t.replace(/\\n$/,\"\").split(`\n`).reduce(Jit,Object.create(null)),Jit=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+\" \").length);let s=e.split(\"=\"),a=s.shift().replace(/^SCHILY\\.(dev|ino|nlink)/,\"$1\");if(!a)return t;let n=s.join(\"=\");return t[a]=/^([A-Z]+\\.)?([mac]|birth|creation)time$/.test(a)?new Date(n*1e3):/^[0-9]+$/.test(n)?+n:n,t};Fhe.exports=Sv});var FI=_((a3t,Nhe)=>{Nhe.exports=t=>{let e=t.length-1,r=-1;for(;e>-1&&t.charAt(e)===\"/\";)r=e,e--;return r===-1?t:t.slice(0,r)}});var zT=_((l3t,Ohe)=>{\"use strict\";Ohe.exports=t=>class extends t{warn(e,r,s={}){this.file&&(s.file=this.file),this.cwd&&(s.cwd=this.cwd),s.code=r instanceof Error&&r.code||e,s.tarCode=e,!this.strict&&s.recoverable!==!1?(r instanceof Error&&(s=Object.assign(r,s),r=r.message),this.emit(\"warn\",s.tarCode,r,s)):r instanceof Error?this.emit(\"error\",Object.assign(r,s)):this.emit(\"error\",Object.assign(new Error(`${e}: ${r}`),s))}}});var b6=_((u3t,Lhe)=>{\"use strict\";var XT=[\"|\",\"<\",\">\",\"?\",\":\"],D6=XT.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),Kit=new Map(XT.map((t,e)=>[t,D6[e]])),zit=new Map(D6.map((t,e)=>[t,XT[e]]));Lhe.exports={encode:t=>XT.reduce((e,r)=>e.split(r).join(Kit.get(r)),t),decode:t=>D6.reduce((e,r)=>e.split(r).join(zit.get(r)),t)}});var P6=_((f3t,Uhe)=>{var{isAbsolute:Xit,parse:Mhe}=Ie(\"path\").win32;Uhe.exports=t=>{let e=\"\",r=Mhe(t);for(;Xit(t)||r.root;){let s=t.charAt(0)===\"/\"&&t.slice(0,4)!==\"//?/\"?\"/\":r.root;t=t.substr(s.length),e+=s,r=Mhe(t)}return[e,t]}});var Hhe=_((A3t,_he)=>{\"use strict\";_he.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&-19),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var M6=_((g3t,t0e)=>{\"use strict\";var Jhe=PI(),Khe=KT(),zhe=RI(),nA=Ie(\"fs\"),jhe=Ie(\"path\"),rA=QI(),Zit=FI(),Xhe=(t,e)=>e?(t=rA(t).replace(/^\\.(\\/|$)/,\"\"),Zit(e)+\"/\"+t):rA(t),$it=16*1024*1024,Ghe=Symbol(\"process\"),qhe=Symbol(\"file\"),Whe=Symbol(\"directory\"),k6=Symbol(\"symlink\"),Yhe=Symbol(\"hardlink\"),Dv=Symbol(\"header\"),ZT=Symbol(\"read\"),Q6=Symbol(\"lstat\"),$T=Symbol(\"onlstat\"),T6=Symbol(\"onread\"),R6=Symbol(\"onreadlink\"),F6=Symbol(\"openfile\"),N6=Symbol(\"onopenfile\"),R0=Symbol(\"close\"),eR=Symbol(\"mode\"),O6=Symbol(\"awaitDrain\"),x6=Symbol(\"ondrain\"),iA=Symbol(\"prefix\"),Vhe=Symbol(\"hadError\"),Zhe=zT(),est=b6(),$he=P6(),e0e=Hhe(),tR=Zhe(class extends Jhe{constructor(e,r){if(r=r||{},super(r),typeof e!=\"string\")throw new TypeError(\"path is required\");this.path=rA(e),this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid()||0,this.myuser=process.env.USER||\"\",this.maxReadSize=r.maxReadSize||$it,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=rA(r.cwd||process.cwd()),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,this.prefix=r.prefix?rA(r.prefix):null,this.fd=null,this.blockLen=null,this.blockRemain=null,this.buf=null,this.offset=null,this.length=null,this.pos=null,this.remain=null,typeof r.onwarn==\"function\"&&this.on(\"warn\",r.onwarn);let s=!1;if(!this.preservePaths){let[a,n]=$he(this.path);a&&(this.path=n,s=a)}this.win32=!!r.win32||process.platform===\"win32\",this.win32&&(this.path=est.decode(this.path.replace(/\\\\/g,\"/\")),e=e.replace(/\\\\/g,\"/\")),this.absolute=rA(r.absolute||jhe.resolve(this.cwd,e)),this.path===\"\"&&(this.path=\"./\"),s&&this.warn(\"TAR_ENTRY_INFO\",`stripping ${s} from absolute path`,{entry:this,path:s+this.path}),this.statCache.has(this.absolute)?this[$T](this.statCache.get(this.absolute)):this[Q6]()}emit(e,...r){return e===\"error\"&&(this[Vhe]=!0),super.emit(e,...r)}[Q6](){nA.lstat(this.absolute,(e,r)=>{if(e)return this.emit(\"error\",e);this[$T](r)})}[$T](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=rst(e),this.emit(\"stat\",e),this[Ghe]()}[Ghe](){switch(this.type){case\"File\":return this[qhe]();case\"Directory\":return this[Whe]();case\"SymbolicLink\":return this[k6]();default:return this.end()}}[eR](e){return e0e(e,this.type===\"Directory\",this.portable)}[iA](e){return Xhe(e,this.prefix)}[Dv](){this.type===\"Directory\"&&this.portable&&(this.noMtime=!0),this.header=new zhe({path:this[iA](this.path),linkpath:this.type===\"Link\"?this[iA](this.linkpath):this.linkpath,mode:this[eR](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:\"\",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new Khe({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this[iA](this.path),linkpath:this.type===\"Link\"?this[iA](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),super.write(this.header.block)}[Whe](){this.path.substr(-1)!==\"/\"&&(this.path+=\"/\"),this.stat.size=0,this[Dv](),this.end()}[k6](){nA.readlink(this.absolute,(e,r)=>{if(e)return this.emit(\"error\",e);this[R6](r)})}[R6](e){this.linkpath=rA(e),this[Dv](),this.end()}[Yhe](e){this.type=\"Link\",this.linkpath=rA(jhe.relative(this.cwd,e)),this.stat.size=0,this[Dv](),this.end()}[qhe](){if(this.stat.nlink>1){let e=this.stat.dev+\":\"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[Yhe](r)}this.linkCache.set(e,this.absolute)}if(this[Dv](),this.stat.size===0)return this.end();this[F6]()}[F6](){nA.open(this.absolute,\"r\",(e,r)=>{if(e)return this.emit(\"error\",e);this[N6](r)})}[N6](e){if(this.fd=e,this[Vhe])return this[R0]();this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let r=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(r),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[ZT]()}[ZT](){let{fd:e,buf:r,offset:s,length:a,pos:n}=this;nA.read(e,r,s,a,n,(c,f)=>{if(c)return this[R0](()=>this.emit(\"error\",c));this[T6](f)})}[R0](e){nA.close(this.fd,e)}[T6](e){if(e<=0&&this.remain>0){let a=new Error(\"encountered unexpected EOF\");return a.path=this.absolute,a.syscall=\"read\",a.code=\"EOF\",this[R0](()=>this.emit(\"error\",a))}if(e>this.remain){let a=new Error(\"did not encounter expected EOF\");return a.path=this.absolute,a.syscall=\"read\",a.code=\"EOF\",this[R0](()=>this.emit(\"error\",a))}if(e===this.remain)for(let a=e;a<this.length&&e<this.blockRemain;a++)this.buf[a+this.offset]=0,e++,this.remain++;let r=this.offset===0&&e===this.buf.length?this.buf:this.buf.slice(this.offset,this.offset+e);this.write(r)?this[x6]():this[O6](()=>this[x6]())}[O6](e){this.once(\"drain\",e)}write(e){if(this.blockRemain<e.length){let r=new Error(\"writing more data than expected\");return r.path=this.absolute,this.emit(\"error\",r)}return this.remain-=e.length,this.blockRemain-=e.length,this.pos+=e.length,this.offset+=e.length,super.write(e)}[x6](){if(!this.remain)return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),this[R0](e=>e?this.emit(\"error\",e):this.end());this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[ZT]()}}),L6=class extends tR{[Q6](){this[$T](nA.lstatSync(this.absolute))}[k6](){this[R6](nA.readlinkSync(this.absolute))}[F6](){this[N6](nA.openSync(this.absolute,\"r\"))}[ZT](){let e=!0;try{let{fd:r,buf:s,offset:a,length:n,pos:c}=this,f=nA.readSync(r,s,a,n,c);this[T6](f),e=!1}finally{if(e)try{this[R0](()=>{})}catch{}}}[O6](e){e()}[R0](e){nA.closeSync(this.fd),e()}},tst=Zhe(class extends Jhe{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type===\"Directory\"&&this.portable&&(this.noMtime=!0),this.prefix=r.prefix||null,this.path=rA(e.path),this.mode=this[eR](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=rA(e.linkpath),typeof r.onwarn==\"function\"&&this.on(\"warn\",r.onwarn);let s=!1;if(!this.preservePaths){let[a,n]=$he(this.path);a&&(this.path=n,s=a)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new zhe({path:this[iA](this.path),linkpath:this.type===\"Link\"?this[iA](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),s&&this.warn(\"TAR_ENTRY_INFO\",`stripping ${s} from absolute path`,{entry:this,path:s+this.path}),this.header.encode()&&!this.noPax&&super.write(new Khe({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this[iA](this.path),linkpath:this.type===\"Link\"?this[iA](this.linkpath):this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[iA](e){return Xhe(e,this.prefix)}[eR](e){return e0e(e,this.type===\"Directory\",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error(\"writing more to entry than is appropriate\");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),super.end()}});tR.Sync=L6;tR.Tar=tst;var rst=t=>t.isFile()?\"File\":t.isDirectory()?\"Directory\":t.isSymbolicLink()?\"SymbolicLink\":\"Unsupported\";t0e.exports=tR});var uR=_((m3t,l0e)=>{\"use strict\";var lR=class{constructor(e,r){this.path=e||\"./\",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},nst=PI(),ist=m6(),sst=VT(),V6=M6(),ost=V6.Sync,ast=V6.Tar,lst=$x(),r0e=Buffer.alloc(1024),iR=Symbol(\"onStat\"),rR=Symbol(\"ended\"),sA=Symbol(\"queue\"),NI=Symbol(\"current\"),gm=Symbol(\"process\"),nR=Symbol(\"processing\"),n0e=Symbol(\"processJob\"),oA=Symbol(\"jobs\"),U6=Symbol(\"jobDone\"),sR=Symbol(\"addFSEntry\"),i0e=Symbol(\"addTarEntry\"),G6=Symbol(\"stat\"),q6=Symbol(\"readdir\"),oR=Symbol(\"onreaddir\"),aR=Symbol(\"pipe\"),s0e=Symbol(\"entry\"),_6=Symbol(\"entryOpt\"),W6=Symbol(\"writeEntryClass\"),a0e=Symbol(\"write\"),H6=Symbol(\"ondrain\"),cR=Ie(\"fs\"),o0e=Ie(\"path\"),cst=zT(),j6=QI(),J6=cst(class extends nst{constructor(e){super(e),e=e||Object.create(null),this.opt=e,this.file=e.file||\"\",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=j6(e.prefix||\"\"),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[W6]=V6,typeof e.onwarn==\"function\"&&this.on(\"warn\",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!=\"object\"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new ist.Gzip(e.gzip),this.zip.on(\"data\",r=>super.write(r)),this.zip.on(\"end\",r=>super.end()),this.zip.on(\"drain\",r=>this[H6]()),this.on(\"resume\",r=>this.zip.resume())):this.on(\"drain\",this[H6]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter==\"function\"?e.filter:r=>!0,this[sA]=new lst,this[oA]=0,this.jobs=+e.jobs||4,this[nR]=!1,this[rR]=!1}[a0e](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[rR]=!0,this[gm](),this}write(e){if(this[rR])throw new Error(\"write after end\");return e instanceof sst?this[i0e](e):this[sR](e),this.flowing}[i0e](e){let r=j6(o0e.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let s=new lR(e.path,r,!1);s.entry=new ast(e,this[_6](s)),s.entry.on(\"end\",a=>this[U6](s)),this[oA]+=1,this[sA].push(s)}this[gm]()}[sR](e){let r=j6(o0e.resolve(this.cwd,e));this[sA].push(new lR(e,r)),this[gm]()}[G6](e){e.pending=!0,this[oA]+=1;let r=this.follow?\"stat\":\"lstat\";cR[r](e.absolute,(s,a)=>{e.pending=!1,this[oA]-=1,s?this.emit(\"error\",s):this[iR](e,a)})}[iR](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[gm]()}[q6](e){e.pending=!0,this[oA]+=1,cR.readdir(e.absolute,(r,s)=>{if(e.pending=!1,this[oA]-=1,r)return this.emit(\"error\",r);this[oR](e,s)})}[oR](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[gm]()}[gm](){if(!this[nR]){this[nR]=!0;for(let e=this[sA].head;e!==null&&this[oA]<this.jobs;e=e.next)if(this[n0e](e.value),e.value.ignore){let r=e.next;this[sA].removeNode(e),e.next=r}this[nR]=!1,this[rR]&&!this[sA].length&&this[oA]===0&&(this.zip?this.zip.end(r0e):(super.write(r0e),super.end()))}}get[NI](){return this[sA]&&this[sA].head&&this[sA].head.value}[U6](e){this[sA].shift(),this[oA]-=1,this[gm]()}[n0e](e){if(!e.pending){if(e.entry){e===this[NI]&&!e.piped&&this[aR](e);return}if(e.stat||(this.statCache.has(e.absolute)?this[iR](e,this.statCache.get(e.absolute)):this[G6](e)),!!e.stat&&!e.ignore&&!(!this.noDirRecurse&&e.stat.isDirectory()&&!e.readdir&&(this.readdirCache.has(e.absolute)?this[oR](e,this.readdirCache.get(e.absolute)):this[q6](e),!e.readdir))){if(e.entry=this[s0e](e),!e.entry){e.ignore=!0;return}e===this[NI]&&!e.piped&&this[aR](e)}}}[_6](e){return{onwarn:(r,s,a)=>this.warn(r,s,a),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix}}[s0e](e){this[oA]+=1;try{return new this[W6](e.path,this[_6](e)).on(\"end\",()=>this[U6](e)).on(\"error\",r=>this.emit(\"error\",r))}catch(r){this.emit(\"error\",r)}}[H6](){this[NI]&&this[NI].entry&&this[NI].entry.resume()}[aR](e){e.piped=!0,e.readdir&&e.readdir.forEach(a=>{let n=e.path,c=n===\"./\"?\"\":n.replace(/\\/*$/,\"/\");this[sR](c+a)});let r=e.entry,s=this.zip;s?r.on(\"data\",a=>{s.write(a)||r.pause()}):r.on(\"data\",a=>{super.write(a)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),Y6=class extends J6{constructor(e){super(e),this[W6]=ost}pause(){}resume(){}[G6](e){let r=this.follow?\"statSync\":\"lstatSync\";this[iR](e,cR[r](e.absolute))}[q6](e,r){this[oR](e,cR.readdirSync(e.absolute))}[aR](e){let r=e.entry,s=this.zip;e.readdir&&e.readdir.forEach(a=>{let n=e.path,c=n===\"./\"?\"\":n.replace(/\\/*$/,\"/\");this[sR](c+a)}),s?r.on(\"data\",a=>{s.write(a)}):r.on(\"data\",a=>{super[a0e](a)})}};J6.Sync=Y6;l0e.exports=J6});var GI=_(Pv=>{\"use strict\";var ust=PI(),fst=Ie(\"events\").EventEmitter,fl=Ie(\"fs\"),X6=fl.writev;if(!X6){let t=process.binding(\"fs\"),e=t.FSReqWrap||t.FSReqCallback;X6=(r,s,a,n)=>{let c=(p,h)=>n(p,h,s),f=new e;f.oncomplete=c,t.writeBuffers(r,s,a,f)}}var HI=Symbol(\"_autoClose\"),Yu=Symbol(\"_close\"),bv=Symbol(\"_ended\"),ii=Symbol(\"_fd\"),c0e=Symbol(\"_finished\"),N0=Symbol(\"_flags\"),K6=Symbol(\"_flush\"),Z6=Symbol(\"_handleChunk\"),$6=Symbol(\"_makeBuf\"),gR=Symbol(\"_mode\"),fR=Symbol(\"_needDrain\"),UI=Symbol(\"_onerror\"),jI=Symbol(\"_onopen\"),z6=Symbol(\"_onread\"),LI=Symbol(\"_onwrite\"),O0=Symbol(\"_open\"),Wp=Symbol(\"_path\"),dm=Symbol(\"_pos\"),aA=Symbol(\"_queue\"),MI=Symbol(\"_read\"),u0e=Symbol(\"_readSize\"),F0=Symbol(\"_reading\"),AR=Symbol(\"_remain\"),f0e=Symbol(\"_size\"),pR=Symbol(\"_write\"),OI=Symbol(\"_writing\"),hR=Symbol(\"_defaultFlag\"),_I=Symbol(\"_errored\"),dR=class extends ust{constructor(e,r){if(r=r||{},super(r),this.readable=!0,this.writable=!1,typeof e!=\"string\")throw new TypeError(\"path must be a string\");this[_I]=!1,this[ii]=typeof r.fd==\"number\"?r.fd:null,this[Wp]=e,this[u0e]=r.readSize||16*1024*1024,this[F0]=!1,this[f0e]=typeof r.size==\"number\"?r.size:1/0,this[AR]=this[f0e],this[HI]=typeof r.autoClose==\"boolean\"?r.autoClose:!0,typeof this[ii]==\"number\"?this[MI]():this[O0]()}get fd(){return this[ii]}get path(){return this[Wp]}write(){throw new TypeError(\"this is a readable stream\")}end(){throw new TypeError(\"this is a readable stream\")}[O0](){fl.open(this[Wp],\"r\",(e,r)=>this[jI](e,r))}[jI](e,r){e?this[UI](e):(this[ii]=r,this.emit(\"open\",r),this[MI]())}[$6](){return Buffer.allocUnsafe(Math.min(this[u0e],this[AR]))}[MI](){if(!this[F0]){this[F0]=!0;let e=this[$6]();if(e.length===0)return process.nextTick(()=>this[z6](null,0,e));fl.read(this[ii],e,0,e.length,null,(r,s,a)=>this[z6](r,s,a))}}[z6](e,r,s){this[F0]=!1,e?this[UI](e):this[Z6](r,s)&&this[MI]()}[Yu](){if(this[HI]&&typeof this[ii]==\"number\"){let e=this[ii];this[ii]=null,fl.close(e,r=>r?this.emit(\"error\",r):this.emit(\"close\"))}}[UI](e){this[F0]=!0,this[Yu](),this.emit(\"error\",e)}[Z6](e,r){let s=!1;return this[AR]-=e,e>0&&(s=super.write(e<r.length?r.slice(0,e):r)),(e===0||this[AR]<=0)&&(s=!1,this[Yu](),super.end()),s}emit(e,r){switch(e){case\"prefinish\":case\"finish\":break;case\"drain\":typeof this[ii]==\"number\"&&this[MI]();break;case\"error\":return this[_I]?void 0:(this[_I]=!0,super.emit(e,r));default:return super.emit(e,r)}}},eG=class extends dR{[O0](){let e=!0;try{this[jI](null,fl.openSync(this[Wp],\"r\")),e=!1}finally{e&&this[Yu]()}}[MI](){let e=!0;try{if(!this[F0]){this[F0]=!0;do{let r=this[$6](),s=r.length===0?0:fl.readSync(this[ii],r,0,r.length,null);if(!this[Z6](s,r))break}while(!0);this[F0]=!1}e=!1}finally{e&&this[Yu]()}}[Yu](){if(this[HI]&&typeof this[ii]==\"number\"){let e=this[ii];this[ii]=null,fl.closeSync(e),this.emit(\"close\")}}},mR=class extends fst{constructor(e,r){r=r||{},super(r),this.readable=!1,this.writable=!0,this[_I]=!1,this[OI]=!1,this[bv]=!1,this[fR]=!1,this[aA]=[],this[Wp]=e,this[ii]=typeof r.fd==\"number\"?r.fd:null,this[gR]=r.mode===void 0?438:r.mode,this[dm]=typeof r.start==\"number\"?r.start:null,this[HI]=typeof r.autoClose==\"boolean\"?r.autoClose:!0;let s=this[dm]!==null?\"r+\":\"w\";this[hR]=r.flags===void 0,this[N0]=this[hR]?s:r.flags,this[ii]===null&&this[O0]()}emit(e,r){if(e===\"error\"){if(this[_I])return;this[_I]=!0}return super.emit(e,r)}get fd(){return this[ii]}get path(){return this[Wp]}[UI](e){this[Yu](),this[OI]=!0,this.emit(\"error\",e)}[O0](){fl.open(this[Wp],this[N0],this[gR],(e,r)=>this[jI](e,r))}[jI](e,r){this[hR]&&this[N0]===\"r+\"&&e&&e.code===\"ENOENT\"?(this[N0]=\"w\",this[O0]()):e?this[UI](e):(this[ii]=r,this.emit(\"open\",r),this[K6]())}end(e,r){return e&&this.write(e,r),this[bv]=!0,!this[OI]&&!this[aA].length&&typeof this[ii]==\"number\"&&this[LI](null,0),this}write(e,r){return typeof e==\"string\"&&(e=Buffer.from(e,r)),this[bv]?(this.emit(\"error\",new Error(\"write() after end()\")),!1):this[ii]===null||this[OI]||this[aA].length?(this[aA].push(e),this[fR]=!0,!1):(this[OI]=!0,this[pR](e),!0)}[pR](e){fl.write(this[ii],e,0,e.length,this[dm],(r,s)=>this[LI](r,s))}[LI](e,r){e?this[UI](e):(this[dm]!==null&&(this[dm]+=r),this[aA].length?this[K6]():(this[OI]=!1,this[bv]&&!this[c0e]?(this[c0e]=!0,this[Yu](),this.emit(\"finish\")):this[fR]&&(this[fR]=!1,this.emit(\"drain\"))))}[K6](){if(this[aA].length===0)this[bv]&&this[LI](null,0);else if(this[aA].length===1)this[pR](this[aA].pop());else{let e=this[aA];this[aA]=[],X6(this[ii],e,this[dm],(r,s)=>this[LI](r,s))}}[Yu](){if(this[HI]&&typeof this[ii]==\"number\"){let e=this[ii];this[ii]=null,fl.close(e,r=>r?this.emit(\"error\",r):this.emit(\"close\"))}}},tG=class extends mR{[O0](){let e;if(this[hR]&&this[N0]===\"r+\")try{e=fl.openSync(this[Wp],this[N0],this[gR])}catch(r){if(r.code===\"ENOENT\")return this[N0]=\"w\",this[O0]();throw r}else e=fl.openSync(this[Wp],this[N0],this[gR]);this[jI](null,e)}[Yu](){if(this[HI]&&typeof this[ii]==\"number\"){let e=this[ii];this[ii]=null,fl.closeSync(e),this.emit(\"close\")}}[pR](e){let r=!0;try{this[LI](null,fl.writeSync(this[ii],e,0,e.length,this[dm])),r=!1}finally{if(r)try{this[Yu]()}catch{}}}};Pv.ReadStream=dR;Pv.ReadStreamSync=eG;Pv.WriteStream=mR;Pv.WriteStreamSync=tG});var vR=_((I3t,y0e)=>{\"use strict\";var Ast=zT(),pst=RI(),hst=Ie(\"events\"),gst=$x(),dst=1024*1024,mst=VT(),A0e=KT(),yst=m6(),rG=Buffer.from([31,139]),Lc=Symbol(\"state\"),mm=Symbol(\"writeEntry\"),Yp=Symbol(\"readEntry\"),nG=Symbol(\"nextEntry\"),p0e=Symbol(\"processEntry\"),Mc=Symbol(\"extendedHeader\"),xv=Symbol(\"globalExtendedHeader\"),L0=Symbol(\"meta\"),h0e=Symbol(\"emitMeta\"),Di=Symbol(\"buffer\"),Vp=Symbol(\"queue\"),ym=Symbol(\"ended\"),g0e=Symbol(\"emittedEnd\"),Em=Symbol(\"emit\"),Al=Symbol(\"unzip\"),yR=Symbol(\"consumeChunk\"),ER=Symbol(\"consumeChunkSub\"),iG=Symbol(\"consumeBody\"),d0e=Symbol(\"consumeMeta\"),m0e=Symbol(\"consumeHeader\"),IR=Symbol(\"consuming\"),sG=Symbol(\"bufferConcat\"),oG=Symbol(\"maybeEnd\"),kv=Symbol(\"writing\"),M0=Symbol(\"aborted\"),CR=Symbol(\"onDone\"),Im=Symbol(\"sawValidEntry\"),wR=Symbol(\"sawNullBlock\"),BR=Symbol(\"sawEOF\"),Est=t=>!0;y0e.exports=Ast(class extends hst{constructor(e){e=e||{},super(e),this.file=e.file||\"\",this[Im]=null,this.on(CR,r=>{(this[Lc]===\"begin\"||this[Im]===!1)&&this.warn(\"TAR_BAD_ARCHIVE\",\"Unrecognized archive format\")}),e.ondone?this.on(CR,e.ondone):this.on(CR,r=>{this.emit(\"prefinish\"),this.emit(\"finish\"),this.emit(\"end\"),this.emit(\"close\")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||dst,this.filter=typeof e.filter==\"function\"?e.filter:Est,this.writable=!0,this.readable=!1,this[Vp]=new gst,this[Di]=null,this[Yp]=null,this[mm]=null,this[Lc]=\"begin\",this[L0]=\"\",this[Mc]=null,this[xv]=null,this[ym]=!1,this[Al]=null,this[M0]=!1,this[wR]=!1,this[BR]=!1,typeof e.onwarn==\"function\"&&this.on(\"warn\",e.onwarn),typeof e.onentry==\"function\"&&this.on(\"entry\",e.onentry)}[m0e](e,r){this[Im]===null&&(this[Im]=!1);let s;try{s=new pst(e,r,this[Mc],this[xv])}catch(a){return this.warn(\"TAR_ENTRY_INVALID\",a)}if(s.nullBlock)this[wR]?(this[BR]=!0,this[Lc]===\"begin\"&&(this[Lc]=\"header\"),this[Em](\"eof\")):(this[wR]=!0,this[Em](\"nullBlock\"));else if(this[wR]=!1,!s.cksumValid)this.warn(\"TAR_ENTRY_INVALID\",\"checksum failure\",{header:s});else if(!s.path)this.warn(\"TAR_ENTRY_INVALID\",\"path is required\",{header:s});else{let a=s.type;if(/^(Symbolic)?Link$/.test(a)&&!s.linkpath)this.warn(\"TAR_ENTRY_INVALID\",\"linkpath required\",{header:s});else if(!/^(Symbolic)?Link$/.test(a)&&s.linkpath)this.warn(\"TAR_ENTRY_INVALID\",\"linkpath forbidden\",{header:s});else{let n=this[mm]=new mst(s,this[Mc],this[xv]);if(!this[Im])if(n.remain){let c=()=>{n.invalid||(this[Im]=!0)};n.on(\"end\",c)}else this[Im]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[Em](\"ignoredEntry\",n),this[Lc]=\"ignore\",n.resume()):n.size>0&&(this[L0]=\"\",n.on(\"data\",c=>this[L0]+=c),this[Lc]=\"meta\"):(this[Mc]=null,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[Em](\"ignoredEntry\",n),this[Lc]=n.remain?\"ignore\":\"header\",n.resume()):(n.remain?this[Lc]=\"body\":(this[Lc]=\"header\",n.end()),this[Yp]?this[Vp].push(n):(this[Vp].push(n),this[nG]())))}}}[p0e](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[Yp]=e,this.emit(\"entry\",e),e.emittedEnd||(e.on(\"end\",s=>this[nG]()),r=!1)):(this[Yp]=null,r=!1),r}[nG](){do;while(this[p0e](this[Vp].shift()));if(!this[Vp].length){let e=this[Yp];!e||e.flowing||e.size===e.remain?this[kv]||this.emit(\"drain\"):e.once(\"drain\",s=>this.emit(\"drain\"))}}[iG](e,r){let s=this[mm],a=s.blockRemain,n=a>=e.length&&r===0?e:e.slice(r,r+a);return s.write(n),s.blockRemain||(this[Lc]=\"header\",this[mm]=null,s.end()),n.length}[d0e](e,r){let s=this[mm],a=this[iG](e,r);return this[mm]||this[h0e](s),a}[Em](e,r,s){!this[Vp].length&&!this[Yp]?this.emit(e,r,s):this[Vp].push([e,r,s])}[h0e](e){switch(this[Em](\"meta\",this[L0]),e.type){case\"ExtendedHeader\":case\"OldExtendedHeader\":this[Mc]=A0e.parse(this[L0],this[Mc],!1);break;case\"GlobalExtendedHeader\":this[xv]=A0e.parse(this[L0],this[xv],!0);break;case\"NextFileHasLongPath\":case\"OldGnuLongPath\":this[Mc]=this[Mc]||Object.create(null),this[Mc].path=this[L0].replace(/\\0.*/,\"\");break;case\"NextFileHasLongLinkpath\":this[Mc]=this[Mc]||Object.create(null),this[Mc].linkpath=this[L0].replace(/\\0.*/,\"\");break;default:throw new Error(\"unknown meta: \"+e.type)}}abort(e){this[M0]=!0,this.emit(\"abort\",e),this.warn(\"TAR_ABORT\",e,{recoverable:!1})}write(e){if(this[M0])return;if(this[Al]===null&&e){if(this[Di]&&(e=Buffer.concat([this[Di],e]),this[Di]=null),e.length<rG.length)return this[Di]=e,!0;for(let s=0;this[Al]===null&&s<rG.length;s++)e[s]!==rG[s]&&(this[Al]=!1);if(this[Al]===null){let s=this[ym];this[ym]=!1,this[Al]=new yst.Unzip,this[Al].on(\"data\",n=>this[yR](n)),this[Al].on(\"error\",n=>this.abort(n)),this[Al].on(\"end\",n=>{this[ym]=!0,this[yR]()}),this[kv]=!0;let a=this[Al][s?\"end\":\"write\"](e);return this[kv]=!1,a}}this[kv]=!0,this[Al]?this[Al].write(e):this[yR](e),this[kv]=!1;let r=this[Vp].length?!1:this[Yp]?this[Yp].flowing:!0;return!r&&!this[Vp].length&&this[Yp].once(\"drain\",s=>this.emit(\"drain\")),r}[sG](e){e&&!this[M0]&&(this[Di]=this[Di]?Buffer.concat([this[Di],e]):e)}[oG](){if(this[ym]&&!this[g0e]&&!this[M0]&&!this[IR]){this[g0e]=!0;let e=this[mm];if(e&&e.blockRemain){let r=this[Di]?this[Di].length:0;this.warn(\"TAR_BAD_ARCHIVE\",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[Di]&&e.write(this[Di]),e.end()}this[Em](CR)}}[yR](e){if(this[IR])this[sG](e);else if(!e&&!this[Di])this[oG]();else{if(this[IR]=!0,this[Di]){this[sG](e);let r=this[Di];this[Di]=null,this[ER](r)}else this[ER](e);for(;this[Di]&&this[Di].length>=512&&!this[M0]&&!this[BR];){let r=this[Di];this[Di]=null,this[ER](r)}this[IR]=!1}(!this[Di]||this[ym])&&this[oG]()}[ER](e){let r=0,s=e.length;for(;r+512<=s&&!this[M0]&&!this[BR];)switch(this[Lc]){case\"begin\":case\"header\":this[m0e](e,r),r+=512;break;case\"ignore\":case\"body\":r+=this[iG](e,r);break;case\"meta\":r+=this[d0e](e,r);break;default:throw new Error(\"invalid state: \"+this[Lc])}r<s&&(this[Di]?this[Di]=Buffer.concat([e.slice(r),this[Di]]):this[Di]=e.slice(r))}end(e){this[M0]||(this[Al]?this[Al].end(e):(this[ym]=!0,this.write(e)))}})});var SR=_((C3t,w0e)=>{\"use strict\";var Ist=DI(),I0e=vR(),qI=Ie(\"fs\"),Cst=GI(),E0e=Ie(\"path\"),aG=FI();w0e.exports=(t,e,r)=>{typeof t==\"function\"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e==\"function\"&&(r=e,e=null),e?e=Array.from(e):e=[];let s=Ist(t);if(s.sync&&typeof r==\"function\")throw new TypeError(\"callback not supported for sync tar functions\");if(!s.file&&typeof r==\"function\")throw new TypeError(\"callback only supported with file option\");return e.length&&Bst(s,e),s.noResume||wst(s),s.file&&s.sync?vst(s):s.file?Sst(s,r):C0e(s)};var wst=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},Bst=(t,e)=>{let r=new Map(e.map(n=>[aG(n),!0])),s=t.filter,a=(n,c)=>{let f=c||E0e.parse(n).root||\".\",p=n===f?!1:r.has(n)?r.get(n):a(E0e.dirname(n),f);return r.set(n,p),p};t.filter=s?(n,c)=>s(n,c)&&a(aG(n)):n=>a(aG(n))},vst=t=>{let e=C0e(t),r=t.file,s=!0,a;try{let n=qI.statSync(r),c=t.maxReadSize||16*1024*1024;if(n.size<c)e.end(qI.readFileSync(r));else{let f=0,p=Buffer.allocUnsafe(c);for(a=qI.openSync(r,\"r\");f<n.size;){let h=qI.readSync(a,p,0,c,f);f+=h,e.write(p.slice(0,h))}e.end()}s=!1}finally{if(s&&a)try{qI.closeSync(a)}catch{}}},Sst=(t,e)=>{let r=new I0e(t),s=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((c,f)=>{r.on(\"error\",f),r.on(\"end\",c),qI.stat(a,(p,h)=>{if(p)f(p);else{let E=new Cst.ReadStream(a,{readSize:s,size:h.size});E.on(\"error\",f),E.pipe(r)}})});return e?n.then(e,e):n},C0e=t=>new I0e(t)});var P0e=_((w3t,b0e)=>{\"use strict\";var Dst=DI(),DR=uR(),B0e=GI(),v0e=SR(),S0e=Ie(\"path\");b0e.exports=(t,e,r)=>{if(typeof e==\"function\"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError(\"no files or directories specified\");e=Array.from(e);let s=Dst(t);if(s.sync&&typeof r==\"function\")throw new TypeError(\"callback not supported for sync tar functions\");if(!s.file&&typeof r==\"function\")throw new TypeError(\"callback only supported with file option\");return s.file&&s.sync?bst(s,e):s.file?Pst(s,e,r):s.sync?xst(s,e):kst(s,e)};var bst=(t,e)=>{let r=new DR.Sync(t),s=new B0e.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(s),D0e(r,e)},Pst=(t,e,r)=>{let s=new DR(t),a=new B0e.WriteStream(t.file,{mode:t.mode||438});s.pipe(a);let n=new Promise((c,f)=>{a.on(\"error\",f),a.on(\"close\",c),s.on(\"error\",f)});return lG(s,e),r?n.then(r,r):n},D0e=(t,e)=>{e.forEach(r=>{r.charAt(0)===\"@\"?v0e({file:S0e.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:s=>t.add(s)}):t.add(r)}),t.end()},lG=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)===\"@\")return v0e({file:S0e.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:s=>t.add(s)}).then(s=>lG(t,e));t.add(r)}t.end()},xst=(t,e)=>{let r=new DR.Sync(t);return D0e(r,e),r},kst=(t,e)=>{let r=new DR(t);return lG(r,e),r}});var cG=_((B3t,N0e)=>{\"use strict\";var Qst=DI(),x0e=uR(),Xl=Ie(\"fs\"),k0e=GI(),Q0e=SR(),T0e=Ie(\"path\"),R0e=RI();N0e.exports=(t,e,r)=>{let s=Qst(t);if(!s.file)throw new TypeError(\"file is required\");if(s.gzip)throw new TypeError(\"cannot append to compressed archives\");if(!e||!Array.isArray(e)||!e.length)throw new TypeError(\"no files or directories specified\");return e=Array.from(e),s.sync?Tst(s,e):Fst(s,e,r)};var Tst=(t,e)=>{let r=new x0e.Sync(t),s=!0,a,n;try{try{a=Xl.openSync(t.file,\"r+\")}catch(p){if(p.code===\"ENOENT\")a=Xl.openSync(t.file,\"w+\");else throw p}let c=Xl.fstatSync(a),f=Buffer.alloc(512);e:for(n=0;n<c.size;n+=512){for(let E=0,C=0;E<512;E+=C){if(C=Xl.readSync(a,f,E,f.length-E,n+E),n===0&&f[0]===31&&f[1]===139)throw new Error(\"cannot append to compressed archives\");if(!C)break e}let p=new R0e(f);if(!p.cksumValid)break;let h=512*Math.ceil(p.size/512);if(n+h+512>c.size)break;n+=h,t.mtimeCache&&t.mtimeCache.set(p.path,p.mtime)}s=!1,Rst(t,r,n,a,e)}finally{if(s)try{Xl.closeSync(a)}catch{}}},Rst=(t,e,r,s,a)=>{let n=new k0e.WriteStreamSync(t.file,{fd:s,start:r});e.pipe(n),Nst(e,a)},Fst=(t,e,r)=>{e=Array.from(e);let s=new x0e(t),a=(c,f,p)=>{let h=(I,R)=>{I?Xl.close(c,N=>p(I)):p(null,R)},E=0;if(f===0)return h(null,0);let C=0,S=Buffer.alloc(512),P=(I,R)=>{if(I)return h(I);if(C+=R,C<512&&R)return Xl.read(c,S,C,S.length-C,E+C,P);if(E===0&&S[0]===31&&S[1]===139)return h(new Error(\"cannot append to compressed archives\"));if(C<512)return h(null,E);let N=new R0e(S);if(!N.cksumValid)return h(null,E);let U=512*Math.ceil(N.size/512);if(E+U+512>f||(E+=U+512,E>=f))return h(null,E);t.mtimeCache&&t.mtimeCache.set(N.path,N.mtime),C=0,Xl.read(c,S,0,512,E,P)};Xl.read(c,S,0,512,E,P)},n=new Promise((c,f)=>{s.on(\"error\",f);let p=\"r+\",h=(E,C)=>{if(E&&E.code===\"ENOENT\"&&p===\"r+\")return p=\"w+\",Xl.open(t.file,p,h);if(E)return f(E);Xl.fstat(C,(S,P)=>{if(S)return Xl.close(C,()=>f(S));a(C,P.size,(I,R)=>{if(I)return f(I);let N=new k0e.WriteStream(t.file,{fd:C,start:R});s.pipe(N),N.on(\"error\",f),N.on(\"close\",c),F0e(s,e)})})};Xl.open(t.file,p,h)});return r?n.then(r,r):n},Nst=(t,e)=>{e.forEach(r=>{r.charAt(0)===\"@\"?Q0e({file:T0e.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:s=>t.add(s)}):t.add(r)}),t.end()},F0e=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)===\"@\")return Q0e({file:T0e.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:s=>t.add(s)}).then(s=>F0e(t,e));t.add(r)}t.end()}});var L0e=_((v3t,O0e)=>{\"use strict\";var Ost=DI(),Lst=cG();O0e.exports=(t,e,r)=>{let s=Ost(t);if(!s.file)throw new TypeError(\"file is required\");if(s.gzip)throw new TypeError(\"cannot append to compressed archives\");if(!e||!Array.isArray(e)||!e.length)throw new TypeError(\"no files or directories specified\");return e=Array.from(e),Mst(s),Lst(s,e,r)};var Mst=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,s)=>e(r,s)&&!(t.mtimeCache.get(r)>s.mtime):(r,s)=>!(t.mtimeCache.get(r)>s.mtime)}});var _0e=_((S3t,U0e)=>{var{promisify:M0e}=Ie(\"util\"),U0=Ie(\"fs\"),Ust=t=>{if(!t)t={mode:511,fs:U0};else if(typeof t==\"object\")t={mode:511,fs:U0,...t};else if(typeof t==\"number\")t={mode:t,fs:U0};else if(typeof t==\"string\")t={mode:parseInt(t,8),fs:U0};else throw new TypeError(\"invalid options argument\");return t.mkdir=t.mkdir||t.fs.mkdir||U0.mkdir,t.mkdirAsync=M0e(t.mkdir),t.stat=t.stat||t.fs.stat||U0.stat,t.statAsync=M0e(t.stat),t.statSync=t.statSync||t.fs.statSync||U0.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||U0.mkdirSync,t};U0e.exports=Ust});var j0e=_((D3t,H0e)=>{var _st=process.platform,{resolve:Hst,parse:jst}=Ie(\"path\"),Gst=t=>{if(/\\0/.test(t))throw Object.assign(new TypeError(\"path must be a string without null bytes\"),{path:t,code:\"ERR_INVALID_ARG_VALUE\"});if(t=Hst(t),_st===\"win32\"){let e=/[*|\"<>?:]/,{root:r}=jst(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error(\"Illegal characters in path.\"),{path:t,code:\"EINVAL\"})}return t};H0e.exports=Gst});var V0e=_((b3t,Y0e)=>{var{dirname:G0e}=Ie(\"path\"),q0e=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(s=>s.isDirectory()?r:void 0,s=>s.code===\"ENOENT\"?q0e(t,G0e(e),e):void 0),W0e=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(s){return s.code===\"ENOENT\"?W0e(t,G0e(e),e):void 0}};Y0e.exports={findMade:q0e,findMadeSync:W0e}});var AG=_((P3t,K0e)=>{var{dirname:J0e}=Ie(\"path\"),uG=(t,e,r)=>{e.recursive=!1;let s=J0e(t);return s===t?e.mkdirAsync(t,e).catch(a=>{if(a.code!==\"EISDIR\")throw a}):e.mkdirAsync(t,e).then(()=>r||t,a=>{if(a.code===\"ENOENT\")return uG(s,e).then(n=>uG(t,e,n));if(a.code!==\"EEXIST\"&&a.code!==\"EROFS\")throw a;return e.statAsync(t).then(n=>{if(n.isDirectory())return r;throw a},()=>{throw a})})},fG=(t,e,r)=>{let s=J0e(t);if(e.recursive=!1,s===t)try{return e.mkdirSync(t,e)}catch(a){if(a.code!==\"EISDIR\")throw a;return}try{return e.mkdirSync(t,e),r||t}catch(a){if(a.code===\"ENOENT\")return fG(t,e,fG(s,e,r));if(a.code!==\"EEXIST\"&&a.code!==\"EROFS\")throw a;try{if(!e.statSync(t).isDirectory())throw a}catch{throw a}}};K0e.exports={mkdirpManual:uG,mkdirpManualSync:fG}});var Z0e=_((x3t,X0e)=>{var{dirname:z0e}=Ie(\"path\"),{findMade:qst,findMadeSync:Wst}=V0e(),{mkdirpManual:Yst,mkdirpManualSync:Vst}=AG(),Jst=(t,e)=>(e.recursive=!0,z0e(t)===t?e.mkdirAsync(t,e):qst(e,t).then(s=>e.mkdirAsync(t,e).then(()=>s).catch(a=>{if(a.code===\"ENOENT\")return Yst(t,e);throw a}))),Kst=(t,e)=>{if(e.recursive=!0,z0e(t)===t)return e.mkdirSync(t,e);let s=Wst(e,t);try{return e.mkdirSync(t,e),s}catch(a){if(a.code===\"ENOENT\")return Vst(t,e);throw a}};X0e.exports={mkdirpNative:Jst,mkdirpNativeSync:Kst}});var rge=_((k3t,tge)=>{var $0e=Ie(\"fs\"),zst=process.version,pG=zst.replace(/^v/,\"\").split(\".\"),ege=+pG[0]>10||+pG[0]==10&&+pG[1]>=12,Xst=ege?t=>t.mkdir===$0e.mkdir:()=>!1,Zst=ege?t=>t.mkdirSync===$0e.mkdirSync:()=>!1;tge.exports={useNative:Xst,useNativeSync:Zst}});var lge=_((Q3t,age)=>{var WI=_0e(),YI=j0e(),{mkdirpNative:nge,mkdirpNativeSync:ige}=Z0e(),{mkdirpManual:sge,mkdirpManualSync:oge}=AG(),{useNative:$st,useNativeSync:eot}=rge(),VI=(t,e)=>(t=YI(t),e=WI(e),$st(e)?nge(t,e):sge(t,e)),tot=(t,e)=>(t=YI(t),e=WI(e),eot(e)?ige(t,e):oge(t,e));VI.sync=tot;VI.native=(t,e)=>nge(YI(t),WI(e));VI.manual=(t,e)=>sge(YI(t),WI(e));VI.nativeSync=(t,e)=>ige(YI(t),WI(e));VI.manualSync=(t,e)=>oge(YI(t),WI(e));age.exports=VI});var gge=_((T3t,hge)=>{\"use strict\";var Uc=Ie(\"fs\"),Cm=Ie(\"path\"),rot=Uc.lchown?\"lchown\":\"chown\",not=Uc.lchownSync?\"lchownSync\":\"chownSync\",uge=Uc.lchown&&!process.version.match(/v1[1-9]+\\./)&&!process.version.match(/v10\\.[6-9]/),cge=(t,e,r)=>{try{return Uc[not](t,e,r)}catch(s){if(s.code!==\"ENOENT\")throw s}},iot=(t,e,r)=>{try{return Uc.chownSync(t,e,r)}catch(s){if(s.code!==\"ENOENT\")throw s}},sot=uge?(t,e,r,s)=>a=>{!a||a.code!==\"EISDIR\"?s(a):Uc.chown(t,e,r,s)}:(t,e,r,s)=>s,hG=uge?(t,e,r)=>{try{return cge(t,e,r)}catch(s){if(s.code!==\"EISDIR\")throw s;iot(t,e,r)}}:(t,e,r)=>cge(t,e,r),oot=process.version,fge=(t,e,r)=>Uc.readdir(t,e,r),aot=(t,e)=>Uc.readdirSync(t,e);/^v4\\./.test(oot)&&(fge=(t,e,r)=>Uc.readdir(t,r));var bR=(t,e,r,s)=>{Uc[rot](t,e,r,sot(t,e,r,a=>{s(a&&a.code!==\"ENOENT\"?a:null)}))},Age=(t,e,r,s,a)=>{if(typeof e==\"string\")return Uc.lstat(Cm.resolve(t,e),(n,c)=>{if(n)return a(n.code!==\"ENOENT\"?n:null);c.name=e,Age(t,c,r,s,a)});if(e.isDirectory())gG(Cm.resolve(t,e.name),r,s,n=>{if(n)return a(n);let c=Cm.resolve(t,e.name);bR(c,r,s,a)});else{let n=Cm.resolve(t,e.name);bR(n,r,s,a)}},gG=(t,e,r,s)=>{fge(t,{withFileTypes:!0},(a,n)=>{if(a){if(a.code===\"ENOENT\")return s();if(a.code!==\"ENOTDIR\"&&a.code!==\"ENOTSUP\")return s(a)}if(a||!n.length)return bR(t,e,r,s);let c=n.length,f=null,p=h=>{if(!f){if(h)return s(f=h);if(--c===0)return bR(t,e,r,s)}};n.forEach(h=>Age(t,h,e,r,p))})},lot=(t,e,r,s)=>{if(typeof e==\"string\")try{let a=Uc.lstatSync(Cm.resolve(t,e));a.name=e,e=a}catch(a){if(a.code===\"ENOENT\")return;throw a}e.isDirectory()&&pge(Cm.resolve(t,e.name),r,s),hG(Cm.resolve(t,e.name),r,s)},pge=(t,e,r)=>{let s;try{s=aot(t,{withFileTypes:!0})}catch(a){if(a.code===\"ENOENT\")return;if(a.code===\"ENOTDIR\"||a.code===\"ENOTSUP\")return hG(t,e,r);throw a}return s&&s.length&&s.forEach(a=>lot(t,a,e,r)),hG(t,e,r)};hge.exports=gG;gG.sync=pge});var Ege=_((R3t,dG)=>{\"use strict\";var dge=lge(),_c=Ie(\"fs\"),PR=Ie(\"path\"),mge=gge(),Vu=QI(),xR=class extends Error{constructor(e,r){super(\"Cannot extract through symbolic link\"),this.path=r,this.symlink=e}get name(){return\"SylinkError\"}},kR=class extends Error{constructor(e,r){super(r+\": Cannot cd into '\"+e+\"'\"),this.path=e,this.code=r}get name(){return\"CwdError\"}},QR=(t,e)=>t.get(Vu(e)),Qv=(t,e,r)=>t.set(Vu(e),r),cot=(t,e)=>{_c.stat(t,(r,s)=>{(r||!s.isDirectory())&&(r=new kR(t,r&&r.code||\"ENOTDIR\")),e(r)})};dG.exports=(t,e,r)=>{t=Vu(t);let s=e.umask,a=e.mode|448,n=(a&s)!==0,c=e.uid,f=e.gid,p=typeof c==\"number\"&&typeof f==\"number\"&&(c!==e.processUid||f!==e.processGid),h=e.preserve,E=e.unlink,C=e.cache,S=Vu(e.cwd),P=(N,U)=>{N?r(N):(Qv(C,t,!0),U&&p?mge(U,c,f,W=>P(W)):n?_c.chmod(t,a,r):r())};if(C&&QR(C,t)===!0)return P();if(t===S)return cot(t,P);if(h)return dge(t,{mode:a}).then(N=>P(null,N),P);let R=Vu(PR.relative(S,t)).split(\"/\");TR(S,R,a,C,E,S,null,P)};var TR=(t,e,r,s,a,n,c,f)=>{if(!e.length)return f(null,c);let p=e.shift(),h=Vu(PR.resolve(t+\"/\"+p));if(QR(s,h))return TR(h,e,r,s,a,n,c,f);_c.mkdir(h,r,yge(h,e,r,s,a,n,c,f))},yge=(t,e,r,s,a,n,c,f)=>p=>{p?_c.lstat(t,(h,E)=>{if(h)h.path=h.path&&Vu(h.path),f(h);else if(E.isDirectory())TR(t,e,r,s,a,n,c,f);else if(a)_c.unlink(t,C=>{if(C)return f(C);_c.mkdir(t,r,yge(t,e,r,s,a,n,c,f))});else{if(E.isSymbolicLink())return f(new xR(t,t+\"/\"+e.join(\"/\")));f(p)}}):(c=c||t,TR(t,e,r,s,a,n,c,f))},uot=t=>{let e=!1,r=\"ENOTDIR\";try{e=_c.statSync(t).isDirectory()}catch(s){r=s.code}finally{if(!e)throw new kR(t,r)}};dG.exports.sync=(t,e)=>{t=Vu(t);let r=e.umask,s=e.mode|448,a=(s&r)!==0,n=e.uid,c=e.gid,f=typeof n==\"number\"&&typeof c==\"number\"&&(n!==e.processUid||c!==e.processGid),p=e.preserve,h=e.unlink,E=e.cache,C=Vu(e.cwd),S=N=>{Qv(E,t,!0),N&&f&&mge.sync(N,n,c),a&&_c.chmodSync(t,s)};if(E&&QR(E,t)===!0)return S();if(t===C)return uot(C),S();if(p)return S(dge.sync(t,s));let I=Vu(PR.relative(C,t)).split(\"/\"),R=null;for(let N=I.shift(),U=C;N&&(U+=\"/\"+N);N=I.shift())if(U=Vu(PR.resolve(U)),!QR(E,U))try{_c.mkdirSync(U,s),R=R||U,Qv(E,U,!0)}catch{let ee=_c.lstatSync(U);if(ee.isDirectory()){Qv(E,U,!0);continue}else if(h){_c.unlinkSync(U),_c.mkdirSync(U,s),R=R||U,Qv(E,U,!0);continue}else if(ee.isSymbolicLink())return new xR(U,U+\"/\"+I.join(\"/\"))}return S(R)}});var yG=_((F3t,Ige)=>{var mG=Object.create(null),{hasOwnProperty:fot}=Object.prototype;Ige.exports=t=>(fot.call(mG,t)||(mG[t]=t.normalize(\"NFKD\")),mG[t])});var vge=_((N3t,Bge)=>{var Cge=Ie(\"assert\"),Aot=yG(),pot=FI(),{join:wge}=Ie(\"path\"),hot=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,got=hot===\"win32\";Bge.exports=()=>{let t=new Map,e=new Map,r=h=>h.split(\"/\").slice(0,-1).reduce((C,S)=>(C.length&&(S=wge(C[C.length-1],S)),C.push(S||\"/\"),C),[]),s=new Set,a=h=>{let E=e.get(h);if(!E)throw new Error(\"function does not have any path reservations\");return{paths:E.paths.map(C=>t.get(C)),dirs:[...E.dirs].map(C=>t.get(C))}},n=h=>{let{paths:E,dirs:C}=a(h);return E.every(S=>S[0]===h)&&C.every(S=>S[0]instanceof Set&&S[0].has(h))},c=h=>s.has(h)||!n(h)?!1:(s.add(h),h(()=>f(h)),!0),f=h=>{if(!s.has(h))return!1;let{paths:E,dirs:C}=e.get(h),S=new Set;return E.forEach(P=>{let I=t.get(P);Cge.equal(I[0],h),I.length===1?t.delete(P):(I.shift(),typeof I[0]==\"function\"?S.add(I[0]):I[0].forEach(R=>S.add(R)))}),C.forEach(P=>{let I=t.get(P);Cge(I[0]instanceof Set),I[0].size===1&&I.length===1?t.delete(P):I[0].size===1?(I.shift(),S.add(I[0])):I[0].delete(h)}),s.delete(h),S.forEach(P=>c(P)),!0};return{check:n,reserve:(h,E)=>{h=got?[\"win32 parallelization disabled\"]:h.map(S=>Aot(pot(wge(S))).toLowerCase());let C=new Set(h.map(S=>r(S)).reduce((S,P)=>S.concat(P)));return e.set(E,{dirs:C,paths:h}),h.forEach(S=>{let P=t.get(S);P?P.push(E):t.set(S,[E])}),C.forEach(S=>{let P=t.get(S);P?P[P.length-1]instanceof Set?P[P.length-1].add(E):P.push(new Set([E])):t.set(S,[new Set([E])])}),c(E)}}}});var bge=_((O3t,Dge)=>{var dot=process.platform,mot=dot===\"win32\",yot=global.__FAKE_TESTING_FS__||Ie(\"fs\"),{O_CREAT:Eot,O_TRUNC:Iot,O_WRONLY:Cot,UV_FS_O_FILEMAP:Sge=0}=yot.constants,wot=mot&&!!Sge,Bot=512*1024,vot=Sge|Iot|Eot|Cot;Dge.exports=wot?t=>t<Bot?vot:\"w\":()=>\"w\"});var bG=_((L3t,Hge)=>{\"use strict\";var Sot=Ie(\"assert\"),Dot=vR(),Mn=Ie(\"fs\"),bot=GI(),Jp=Ie(\"path\"),Mge=Ege(),Pge=b6(),Pot=vge(),xot=P6(),Zl=QI(),kot=FI(),Qot=yG(),xge=Symbol(\"onEntry\"),CG=Symbol(\"checkFs\"),kge=Symbol(\"checkFs2\"),NR=Symbol(\"pruneCache\"),wG=Symbol(\"isReusable\"),Hc=Symbol(\"makeFs\"),BG=Symbol(\"file\"),vG=Symbol(\"directory\"),OR=Symbol(\"link\"),Qge=Symbol(\"symlink\"),Tge=Symbol(\"hardlink\"),Rge=Symbol(\"unsupported\"),Fge=Symbol(\"checkPath\"),_0=Symbol(\"mkdir\"),Xo=Symbol(\"onError\"),RR=Symbol(\"pending\"),Nge=Symbol(\"pend\"),JI=Symbol(\"unpend\"),EG=Symbol(\"ended\"),IG=Symbol(\"maybeClose\"),SG=Symbol(\"skip\"),Tv=Symbol(\"doChown\"),Rv=Symbol(\"uid\"),Fv=Symbol(\"gid\"),Nv=Symbol(\"checkedCwd\"),Uge=Ie(\"crypto\"),_ge=bge(),Tot=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Ov=Tot===\"win32\",Rot=(t,e)=>{if(!Ov)return Mn.unlink(t,e);let r=t+\".DELETE.\"+Uge.randomBytes(16).toString(\"hex\");Mn.rename(t,r,s=>{if(s)return e(s);Mn.unlink(r,e)})},Fot=t=>{if(!Ov)return Mn.unlinkSync(t);let e=t+\".DELETE.\"+Uge.randomBytes(16).toString(\"hex\");Mn.renameSync(t,e),Mn.unlinkSync(e)},Oge=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,Lge=t=>Qot(kot(Zl(t))).toLowerCase(),Not=(t,e)=>{e=Lge(e);for(let r of t.keys()){let s=Lge(r);(s===e||s.indexOf(e+\"/\")===0)&&t.delete(r)}},Oot=t=>{for(let e of t.keys())t.delete(e)},Lv=class extends Dot{constructor(e){if(e||(e={}),e.ondone=r=>{this[EG]=!0,this[IG]()},super(e),this[Nv]=!1,this.reservations=Pot(),this.transform=typeof e.transform==\"function\"?e.transform:null,this.writable=!0,this.readable=!1,this[RR]=0,this[EG]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid==\"number\"||typeof e.gid==\"number\"){if(typeof e.uid!=\"number\"||typeof e.gid!=\"number\")throw new TypeError(\"cannot set owner without number uid and gid\");if(e.preserveOwner)throw new TypeError(\"cannot preserve owner in archive and also set owner explicitly\");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!=\"number\"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||Ov,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=Zl(Jp.resolve(e.cwd||process.cwd())),this.strip=+e.strip||0,this.processUmask=e.noChmod?0:process.umask(),this.umask=typeof e.umask==\"number\"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on(\"entry\",r=>this[xge](r))}warn(e,r,s={}){return(e===\"TAR_BAD_ARCHIVE\"||e===\"TAR_ABORT\")&&(s.recoverable=!1),super.warn(e,r,s)}[IG](){this[EG]&&this[RR]===0&&(this.emit(\"prefinish\"),this.emit(\"finish\"),this.emit(\"end\"),this.emit(\"close\"))}[Fge](e){if(this.strip){let r=Zl(e.path).split(\"/\");if(r.length<this.strip)return!1;if(e.path=r.slice(this.strip).join(\"/\"),e.type===\"Link\"){let s=Zl(e.linkpath).split(\"/\");if(s.length>=this.strip)e.linkpath=s.slice(this.strip).join(\"/\");else return!1}}if(!this.preservePaths){let r=Zl(e.path),s=r.split(\"/\");if(s.includes(\"..\")||Ov&&/^[a-z]:\\.\\.$/i.test(s[0]))return this.warn(\"TAR_ENTRY_ERROR\",\"path contains '..'\",{entry:e,path:r}),!1;let[a,n]=xot(r);a&&(e.path=n,this.warn(\"TAR_ENTRY_INFO\",`stripping ${a} from absolute path`,{entry:e,path:r}))}if(Jp.isAbsolute(e.path)?e.absolute=Zl(Jp.resolve(e.path)):e.absolute=Zl(Jp.resolve(this.cwd,e.path)),!this.preservePaths&&e.absolute.indexOf(this.cwd+\"/\")!==0&&e.absolute!==this.cwd)return this.warn(\"TAR_ENTRY_ERROR\",\"path escaped extraction target\",{entry:e,path:Zl(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!==\"Directory\"&&e.type!==\"GNUDumpDir\")return!1;if(this.win32){let{root:r}=Jp.win32.parse(e.absolute);e.absolute=r+Pge.encode(e.absolute.substr(r.length));let{root:s}=Jp.win32.parse(e.path);e.path=s+Pge.encode(e.path.substr(s.length))}return!0}[xge](e){if(!this[Fge](e))return e.resume();switch(Sot.equal(typeof e.absolute,\"string\"),e.type){case\"Directory\":case\"GNUDumpDir\":e.mode&&(e.mode=e.mode|448);case\"File\":case\"OldFile\":case\"ContiguousFile\":case\"Link\":case\"SymbolicLink\":return this[CG](e);case\"CharacterDevice\":case\"BlockDevice\":case\"FIFO\":default:return this[Rge](e)}}[Xo](e,r){e.name===\"CwdError\"?this.emit(\"error\",e):(this.warn(\"TAR_ENTRY_ERROR\",e,{entry:r}),this[JI](),r.resume())}[_0](e,r,s){Mge(Zl(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r,noChmod:this.noChmod},s)}[Tv](e){return this.forceChown||this.preserveOwner&&(typeof e.uid==\"number\"&&e.uid!==this.processUid||typeof e.gid==\"number\"&&e.gid!==this.processGid)||typeof this.uid==\"number\"&&this.uid!==this.processUid||typeof this.gid==\"number\"&&this.gid!==this.processGid}[Rv](e){return Oge(this.uid,e.uid,this.processUid)}[Fv](e){return Oge(this.gid,e.gid,this.processGid)}[BG](e,r){let s=e.mode&4095||this.fmode,a=new bot.WriteStream(e.absolute,{flags:_ge(e.size),mode:s,autoClose:!1});a.on(\"error\",p=>{a.fd&&Mn.close(a.fd,()=>{}),a.write=()=>!0,this[Xo](p,e),r()});let n=1,c=p=>{if(p){a.fd&&Mn.close(a.fd,()=>{}),this[Xo](p,e),r();return}--n===0&&Mn.close(a.fd,h=>{h?this[Xo](h,e):this[JI](),r()})};a.on(\"finish\",p=>{let h=e.absolute,E=a.fd;if(e.mtime&&!this.noMtime){n++;let C=e.atime||new Date,S=e.mtime;Mn.futimes(E,C,S,P=>P?Mn.utimes(h,C,S,I=>c(I&&P)):c())}if(this[Tv](e)){n++;let C=this[Rv](e),S=this[Fv](e);Mn.fchown(E,C,S,P=>P?Mn.chown(h,C,S,I=>c(I&&P)):c())}c()});let f=this.transform&&this.transform(e)||e;f!==e&&(f.on(\"error\",p=>{this[Xo](p,e),r()}),e.pipe(f)),f.pipe(a)}[vG](e,r){let s=e.mode&4095||this.dmode;this[_0](e.absolute,s,a=>{if(a){this[Xo](a,e),r();return}let n=1,c=f=>{--n===0&&(r(),this[JI](),e.resume())};e.mtime&&!this.noMtime&&(n++,Mn.utimes(e.absolute,e.atime||new Date,e.mtime,c)),this[Tv](e)&&(n++,Mn.chown(e.absolute,this[Rv](e),this[Fv](e),c)),c()})}[Rge](e){e.unsupported=!0,this.warn(\"TAR_ENTRY_UNSUPPORTED\",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[Qge](e,r){this[OR](e,e.linkpath,\"symlink\",r)}[Tge](e,r){let s=Zl(Jp.resolve(this.cwd,e.linkpath));this[OR](e,s,\"link\",r)}[Nge](){this[RR]++}[JI](){this[RR]--,this[IG]()}[SG](e){this[JI](),e.resume()}[wG](e,r){return e.type===\"File\"&&!this.unlink&&r.isFile()&&r.nlink<=1&&!Ov}[CG](e){this[Nge]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,s=>this[kge](e,s))}[NR](e){e.type===\"SymbolicLink\"?Oot(this.dirCache):e.type!==\"Directory\"&&Not(this.dirCache,e.absolute)}[kge](e,r){this[NR](e);let s=f=>{this[NR](e),r(f)},a=()=>{this[_0](this.cwd,this.dmode,f=>{if(f){this[Xo](f,e),s();return}this[Nv]=!0,n()})},n=()=>{if(e.absolute!==this.cwd){let f=Zl(Jp.dirname(e.absolute));if(f!==this.cwd)return this[_0](f,this.dmode,p=>{if(p){this[Xo](p,e),s();return}c()})}c()},c=()=>{Mn.lstat(e.absolute,(f,p)=>{if(p&&(this.keep||this.newer&&p.mtime>e.mtime)){this[SG](e),s();return}if(f||this[wG](e,p))return this[Hc](null,e,s);if(p.isDirectory()){if(e.type===\"Directory\"){let h=!this.noChmod&&e.mode&&(p.mode&4095)!==e.mode,E=C=>this[Hc](C,e,s);return h?Mn.chmod(e.absolute,e.mode,E):E()}if(e.absolute!==this.cwd)return Mn.rmdir(e.absolute,h=>this[Hc](h,e,s))}if(e.absolute===this.cwd)return this[Hc](null,e,s);Rot(e.absolute,h=>this[Hc](h,e,s))})};this[Nv]?n():a()}[Hc](e,r,s){if(e){this[Xo](e,r),s();return}switch(r.type){case\"File\":case\"OldFile\":case\"ContiguousFile\":return this[BG](r,s);case\"Link\":return this[Tge](r,s);case\"SymbolicLink\":return this[Qge](r,s);case\"Directory\":case\"GNUDumpDir\":return this[vG](r,s)}}[OR](e,r,s,a){Mn[s](r,e.absolute,n=>{n?this[Xo](n,e):(this[JI](),e.resume()),a()})}},FR=t=>{try{return[null,t()]}catch(e){return[e,null]}},DG=class extends Lv{[Hc](e,r){return super[Hc](e,r,()=>{})}[CG](e){if(this[NR](e),!this[Nv]){let n=this[_0](this.cwd,this.dmode);if(n)return this[Xo](n,e);this[Nv]=!0}if(e.absolute!==this.cwd){let n=Zl(Jp.dirname(e.absolute));if(n!==this.cwd){let c=this[_0](n,this.dmode);if(c)return this[Xo](c,e)}}let[r,s]=FR(()=>Mn.lstatSync(e.absolute));if(s&&(this.keep||this.newer&&s.mtime>e.mtime))return this[SG](e);if(r||this[wG](e,s))return this[Hc](null,e);if(s.isDirectory()){if(e.type===\"Directory\"){let c=!this.noChmod&&e.mode&&(s.mode&4095)!==e.mode,[f]=c?FR(()=>{Mn.chmodSync(e.absolute,e.mode)}):[];return this[Hc](f,e)}let[n]=FR(()=>Mn.rmdirSync(e.absolute));this[Hc](n,e)}let[a]=e.absolute===this.cwd?[]:FR(()=>Fot(e.absolute));this[Hc](a,e)}[BG](e,r){let s=e.mode&4095||this.fmode,a=f=>{let p;try{Mn.closeSync(n)}catch(h){p=h}(f||p)&&this[Xo](f||p,e),r()},n;try{n=Mn.openSync(e.absolute,_ge(e.size),s)}catch(f){return a(f)}let c=this.transform&&this.transform(e)||e;c!==e&&(c.on(\"error\",f=>this[Xo](f,e)),e.pipe(c)),c.on(\"data\",f=>{try{Mn.writeSync(n,f,0,f.length)}catch(p){a(p)}}),c.on(\"end\",f=>{let p=null;if(e.mtime&&!this.noMtime){let h=e.atime||new Date,E=e.mtime;try{Mn.futimesSync(n,h,E)}catch(C){try{Mn.utimesSync(e.absolute,h,E)}catch{p=C}}}if(this[Tv](e)){let h=this[Rv](e),E=this[Fv](e);try{Mn.fchownSync(n,h,E)}catch(C){try{Mn.chownSync(e.absolute,h,E)}catch{p=p||C}}}a(p)})}[vG](e,r){let s=e.mode&4095||this.dmode,a=this[_0](e.absolute,s);if(a){this[Xo](a,e),r();return}if(e.mtime&&!this.noMtime)try{Mn.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch{}if(this[Tv](e))try{Mn.chownSync(e.absolute,this[Rv](e),this[Fv](e))}catch{}r(),e.resume()}[_0](e,r){try{return Mge.sync(Zl(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r})}catch(s){return s}}[OR](e,r,s,a){try{Mn[s+\"Sync\"](r,e.absolute),a(),e.resume()}catch(n){return this[Xo](n,e)}}};Lv.Sync=DG;Hge.exports=Lv});var Yge=_((M3t,Wge)=>{\"use strict\";var Lot=DI(),LR=bG(),Gge=Ie(\"fs\"),qge=GI(),jge=Ie(\"path\"),PG=FI();Wge.exports=(t,e,r)=>{typeof t==\"function\"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e==\"function\"&&(r=e,e=null),e?e=Array.from(e):e=[];let s=Lot(t);if(s.sync&&typeof r==\"function\")throw new TypeError(\"callback not supported for sync tar functions\");if(!s.file&&typeof r==\"function\")throw new TypeError(\"callback only supported with file option\");return e.length&&Mot(s,e),s.file&&s.sync?Uot(s):s.file?_ot(s,r):s.sync?Hot(s):jot(s)};var Mot=(t,e)=>{let r=new Map(e.map(n=>[PG(n),!0])),s=t.filter,a=(n,c)=>{let f=c||jge.parse(n).root||\".\",p=n===f?!1:r.has(n)?r.get(n):a(jge.dirname(n),f);return r.set(n,p),p};t.filter=s?(n,c)=>s(n,c)&&a(PG(n)):n=>a(PG(n))},Uot=t=>{let e=new LR.Sync(t),r=t.file,s=Gge.statSync(r),a=t.maxReadSize||16*1024*1024;new qge.ReadStreamSync(r,{readSize:a,size:s.size}).pipe(e)},_ot=(t,e)=>{let r=new LR(t),s=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((c,f)=>{r.on(\"error\",f),r.on(\"close\",c),Gge.stat(a,(p,h)=>{if(p)f(p);else{let E=new qge.ReadStream(a,{readSize:s,size:h.size});E.on(\"error\",f),E.pipe(r)}})});return e?n.then(e,e):n},Hot=t=>new LR.Sync(t),jot=t=>new LR(t)});var Vge=_(Ps=>{\"use strict\";Ps.c=Ps.create=P0e();Ps.r=Ps.replace=cG();Ps.t=Ps.list=SR();Ps.u=Ps.update=L0e();Ps.x=Ps.extract=Yge();Ps.Pack=uR();Ps.Unpack=bG();Ps.Parse=vR();Ps.ReadEntry=VT();Ps.WriteEntry=M6();Ps.Header=RI();Ps.Pax=KT();Ps.types=I6()});var xG,Jge,H0,Mv,Uv,Kge=Xe(()=>{xG=ut(Ld()),Jge=Ie(\"worker_threads\"),H0=Symbol(\"kTaskInfo\"),Mv=class{constructor(e,r){this.fn=e;this.limit=(0,xG.default)(r.poolSize)}run(e){return this.limit(()=>this.fn(e))}},Uv=class{constructor(e,r){this.source=e;this.workers=[];this.limit=(0,xG.default)(r.poolSize),this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let s=this.workers.pop();s?s.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new Jge.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,\"--unhandled-rejections=strict\"]});return e.on(\"message\",r=>{if(!e[H0])throw new Error(\"Assertion failed: Worker sent a result without having a task assigned\");e[H0].resolve(r),e[H0]=null,e.unref(),this.workers.push(e)}),e.on(\"error\",r=>{e[H0]?.reject(r),e[H0]=null}),e.on(\"exit\",r=>{r!==0&&e[H0]?.reject(new Error(`Worker exited with code ${r}`)),e[H0]=null}),e}run(e){return this.limit(()=>{let r=this.workers.pop()??this.createWorker();return r.ref(),new Promise((s,a)=>{r[H0]={resolve:s,reject:a},r.postMessage(e)})})}}});var Xge=_((j3t,zge)=>{var kG;zge.exports.getContent=()=>(typeof kG>\"u\"&&(kG=Ie(\"zlib\").brotliDecompressSync(Buffer.from(\"W2xFdgBPZrjSneDvVbLecg9fIhuy4cX6GuF9CJQpmu4RdNt2tSIi3YZAPJzO1Ju/O0dV1bTkYsgCLThVdbatry9HdhTU1geV2ROjsMltUFBZJKzSZoSLXaDMA7MJtfXUZJlq3aQXKbUKncLmJdo5ByJUTvhIXveNwEBNvBd2oxvnpn4bPkVdGHlvHIlNFxsdCpFJELoRwnbMYlM4po2Z06KXwCi1p2pjs9id3NE2aovZB2yHbSj773jMlfchfy8YwvdDUZ/vn38/MrcgKXdhPVyCRIJINOTc+nvG10A05G5fDWBJlRYRLcZ2SJ9KXzV9P+t4bZ/4ta/XzPq/ny+h1gFHGaDHLBUStJHA1I6ePGRc71wTQyYfc9XD5lW9lkNwtRR9fQNnHnpZTidToeBJ1Jm1RF0pyQsV2LW+fcW218zX0zX/IxA45ZhdTxJH79h9EQSUiPkborYYSHZWctm7f//rd+ZPtVfMU6BpdkJgCVQmfvqm+fVbEgYxqmR7xsfeTPDsKih7u8clJ/eEIKB1UIl7ilvT1LKqXzCI9eUZcoOKhSFnla7zhX1BzrDkzGO57PXtznEtQ5DI6RoVcQbKVsRC1v/6verXL2YYcm90hZP2vehoS2TLcW3ZHklOOlVVgmElU0lA2ZUfMcB//6lpq63QR6LxhEs0eyZXsfAPJnM1aQnRmWpTsunAngg8P3/llEf/LfOOuZqsQdCgcRCUxFQtq9rYCAxxd6DQ1POB53uacqH73VQR/fjG1vHQQUpr8fjmM+CgUANS0Y0wBrINE3e/ZGGx+Xz4MEVr7XN2s8kFODQXAtIf2roXIqLa9ogq2qqyBS5z7CeYnNVZchZhFsDSTev96F0FZpBgFPCIpvrj8NtZ6eMDCElwZ9JHVxBmuu6Hpnl4+nDr+/x4u6vOw5XfU7e701UkJJXQQvzDoBWIBB0ce3RguzkawgT8AMPzlHgdDw5idYnj+5NJM9XBL7HSG0M/wsbK7v5iUUOt5+PuLthWduVnVU8PNAbsQUGJ/JPlTUOUBMvIGWn96Efznz4/dnfvRE2e+TxVXd0UA2iBjTJ/E+ZaENTxhknQ/K5h3/EKWn6Wo8yMRhKZla5AvalupPqw5Kso3q/5ebzuH7bEI/DiYAraB7m1PH5xtjTj/2+m9u366oab8TLrfeSCpGGktTbc8Adh1zXvEuWaaAeyuwEMAYLUgJQ4BCGNce++V01VVUOaBsDZA0DaORiOMSZa+fUuC5wNNwyMTcL9/3vTrLb3/R8IBAgmBTJZEqgsk1WebctvO2CkSqmMPX3Uzq16sRHevfe/k/+990OK/yPQiv8j0EJEAEeIAHkKEQCrCYD5fwBkBUBmDpiZVYOkpDqUqTOUqTkse7KqfRKkZpSZ0jmVmVKbVHvVGONSY6xdOXf2bfxYs+r97Gaz7/VidrNczmo5i+X4/79WaRtnVo6UQAk7u1v/33o7HGQdPSpQj/7rqqYgCstG5MTLOF+dsIv//2aWtasTQFXXSGVKy0Ch0FwtLAv5xL+sjMzIJeSZkqQ+090j9RMRiYjIRDMBVHEBdLMPuzhK9ArtKWmta6w91npmkeMIbXl7nz+t0qqu7mqNZH8NgWcOML8gqf5fsvkoWoqCW/Uv9a31Jb231iAdAFq2b0f2AXJIgEFCSX5xeJctKHDjpJQ3m3Urk0iC5/t7U/875277i6mGdxYoptsKpVKptp46HgxpRCOeWYxBRAIkEfH8P2f4vnxABfSq3okFhW7Sh7EOU6Zknm9b/2dQZl1CfrShJVuQKkmDUKRlwEAYpohyd7/uuRO4vjhiW92oa7DifsWphJQsLIonVqN9+X6G95E9gJv1/aVCu6Vysu/NbAvVQJAIkgSLIIEgCcE1iBZvi3Talbv/B95N+2tvY1Qof7OKQVArLUEjJSQhhBgSgWJaCGz+exJ5As24WxMMguChXfbB3r3z09qdsMUgWww4SIpBUgwSMGCKKVKkSDFoiimmuGKFLRY8P+/j/1z/z8vcC0/38z9ixBEjRoTHiLRERESEEhFKHk1poFts2iWWWCLiyP783Pr/f3p9jjDzv+KKLbZo0QLRAoEgGQSZIMgEgSCZEogSJUqUWJmUwG/uv3/60+facZ/fES1atGixxRZhCENEGEpElAhMifCIiMh7RNRARD0osUTmQzS53d7gIWweY/AMx+gtFBHZ+QKBsEAgEAiEnXyTePKGdLaKJm1heyFaU3uzbTmJnADDv5s+/2iBsQLt8213mBZIEC+iwULwYIFUkDqt7977a5EjE/PA5Kn3lAZJ2jN6FtU6hpJswxeRU8EDzmheRavGU+8SAXcv9hs2VHFHpGFd2uSqhHfl+2vjalI8eXtMfadrWGGNgIrP+vNSPghBQhnaYRowg/SWg6qitd+w5dduV3M/w+v7ZmNa2EHT7PCw7b26WSDoIaI+BqiP5p2zrxStV+M2GSTNwLZe7+NuQ2yBmwrOzjTUkFHwTV/eBa16T3gA4/213h/1KeX+30V2dZfwJfquaEB6xymhDz3/VMrY5GD9qnZSnAOdHwOrSiaW52B2t2N16zP70evD5mkQyIw0SkzGfUSC0v6MnmPjA/zDgnWuNgwjo7uqtquP5iVWyxtfYeRFHYCX8Ri+J5QLlWqdxq/rU5NcBfWU0gwJLQozOPn8AKW8O8tlag5jTBhcLinjQ3x+ROz+sC1XeAEFjsiL/RBz5ZaHIRt1Zbw7BI/oqy9GqIvPir/AVOOYmyvYsW4S+OjA6lAao99TaXVi1/zOSY7OsRX/YRjJGmdyzupZMt8/DVsorPED2dvEHJaq3K/NE3bKc+Ilrb/azbMvPOIR2+6+xdd8ma/RzeYh23z26tLr9RU6lUdspWd2NAZvk1KsuWtCCp0djmdRFF8HywmTO5KH5Q7JmWezwwKTluDzWDDEEErDdtCCr0a3/GLiI1+HFJKGSB6KtqRHbbS4nsotDPyRz6MFVsQZEL/84gHTA3INdbmG+IoQeUnuY9jGbwRzWSQPASvKFzPQ8sMX+Ty0xAooDSUYEg2rB2Asi8sg++mGqyPPdcZaQiV7O4lZKh/GtbLxz6f2bTsRiLCS7YyUlJjXyQfUAqv97xnph6+1be14kuOkiiW9yBJa3qGJc/jQpCNb/vnTbiO8xEL8sWjHbz2Bnbw/6u0defDAf0FGLaQbLe/+iCD19fZdW4gLDjOLrMbQ2T9vzdtlMqbVl3aCRT/5cB8G8CCpn5B9Lf3jpPZHybpehwzVihnKVbsZkH26pXEqhZl3TmBX61DuBRGWyjOcuBvMT14I2t2ppPMw9ZDpZixooFP9mAgeVVq/i0VyO1POaBTOdukyymNgYmnefdg99y0VvJTipQXLHiIB+GYJk6iLBUtXC5Eut2DpuKRTvuBkW3pv6b3l9xr3/tvyL7GOfiZJ5G+M1aBLJ8TSrpD/ib7xQ9H4b9AfOQ/uEcDmZB6cL2xC41vkwfpiTmh85keSHMtuqSwHp3CQjy0hCN4mosrShflH0n4J1MoTLAROsfy6R7DbEVIUplDwMc4bwsJzphym5GmaVt3+FVff00PZlpU7E5+eHCn5OBo5v0P3QHYrsHNk0PZ7klsowDlcZtJdJgvEbmwvROEM44XY0SuLhahpubgq3SzjsieuutCgAA3qM4rw/MfmzN6HiA++fyU4Rojl44Jb3lXXiQdVSyENix+uraEeD7BibuDCZyFx7aSSW3MA55ymmgAwipqWKus8ykE9HSnJ7CAcn4q4rnO13Ll54POTEjqOxF+FpSAggq+iW01ABNH0JIpBemwUz1pq6GW5MeY0mCE5NtDFSzPrukTra4iNQgyYuZRHSsz72UwNvCA042mO1PKJUG7b896RNyXM88mIr7W1lyhCT8uigfq1LwQ1zXpPQsUrUocxVC+No06fCYUsGWWUjl0/D4tExtJmp4w1SYeaLpnQJ7CNbVODe+nUys2PIKLyxnBq0kHPfRWcq+THl5c2JS2fQeZBVxYtIn74wmnVXuTeFKjE4apGeJAQWnr5Jum5VD/KXuOoyZRPRtrgkZfqvDIhmlbcO6TcjEIhK7mkfR/ad7WeqFjihp7L40OITvp037LNCGX/L6y51MCmkxcpjKCpzBA0noqXTJW2WtDBHUAiBTBi4eBW4rLSC2L+o208CmJ/sxGolgvDgv6hwNsfmxveCnGodx1iKVgEsUO1vE1JKVnT4SgRTO2dgh9K+H599CAmLZE8YvfNp3nhge3MhwAfna99yEZihxv/XwtnAneD0/eEOhyhBTIjd37wBrwuGTKcNBm0/Mx8mIj73As7n47h25bDP3X6UH6TyhtoUa+4M/rKf5ClWLs9Y21CYGxQE809XrP2Jk3orKEJ6hOiL28/33rVJeS5dVpluNegSJcPZfWrG3wDPe1BG6B5cHPnHbNBlhNozcJdZMyFTFG7UPzgl+oUCXRn+ISQ1WnXACLe4kbKtvvthKJhtUPPc2w70asPUj6hAjfITl0GnlA+vRox2VZA9LnskDs68Tk16hXuKd1zfFgC7b6qnLKaoEVXr+2g/BhWXIgw+GVBoqgnDnVuAp2qiUC6qOG4x6GNRVF5WUi7Odw/iUrK/gQUFTBttWGE+ceQumw2t+2dqUrzOrsHSaolipYpBpeLVPvA+1LureB631Tl56A1Wd0ryu96SzibapY3Nz1TXxbMfhInq7WkbUrgGfVaH2vd/tsicD5w5CYV+eISjPH/omyb0wzec5XMokuSw+38AZ2b9rNMawsYSIHvehmbPWUWUuFHVW7var3Am1LM8YFd+G9VDZuKFOvxqm68LDL8bNbjxFevGsFlTyXE1FAbwNZcd6k29dl6ub5BZ6V/O5cTFBmJtgRrraPr7PoqJUnMj6QIpMIodZLDE57k2i6TROku8ZdH3m6Y1vYJFSWTeioWMDaeNqyKHeN8tlp4nDWkSQxHMqbaON4f71KnQF1IwiOkHHPCMrVw/D5W089eWX3/j60UkkuvoRPJTsumkpFd6wW09GwYBwLMgvEZcBgHED3tGu6bESdiXTBcD8W+EIsfaJeutJZ5THXopIx6YVJDbcsMGmYsZtIXb8bsVjewXzc88FcTZ5lYYoFhIrBcO6ljLt5+dp5HmzXv1Kg2MwCJDrRr7qVlXdraGTP828XfilNRkEJ1GwtTE3I1t/aITjVWiTHgXNljdnMXh5wdZpZcKzszsONMKEJhMh0NK+bDGn+rAJDC3mgiOZxq1OUUXNsxkQWhYW1GFtRiWFZNcNDeLLlIQll0jLYPjE2ynxKXI4lcBwCNsxFW85dwAN0PW2KmOMcI6cTvka8d0LYiqm5TNUQfQJPIoralnyMJ4bt6oiIaYBwZu+k4MkkXTQfL1e90rIWXSgjgUBMgCXkoTn9Rr9HCuegYSj1NaIXnzEQUfbtnz7/FkaUwrNSQpHIL+Jj0VvXs5zg6Gn4hCOMevrvMmTvdBdt6DOzxoF88Zp3bG+juT/Zl9hHsXlZY/IeRVTezaepfT0+FNz8u+rCFX+1LykI9/PPmJIfH8/IRAejJVADY7rGj+r8PWPt4mhxDEd6+n9rB/NPcTe2dTs3pXtOjtNyFndrtwLPSz6s+d+vOkWnztCqcbmMfyfd0LcFRcVF8kjkoWIncdj9IKIfZhh+PP+DeY7TVAGAK++IgvZUF6PTLIJT9EhxpprSPCoWuxThGwP8vmEbDs6kDehX0zWXz47U9+/Hqajad+simdjof8lRabLnIvfxoaVOQL907ZBofU7FPER91ifRhlz9nXfSHyGA+c9sQnfOh/SDUqx+vRyM4oJLJXEyfaISzIFoC6MDWR2JB9vBLhhchIiznCQbr7n4zxaEcvphNcZfivwbIKk4C7kb+IcPA8u66nd2Gb/vUiilkp7G6ydQXj82jFjlebJ0yyezuSSbikTcg/iPlGxcWL0JnPmnSbXtHfKBGopIcI3lir17wt8hz8Tw0UHbloVh1oDnNdFBZVkteweiH42CzircC5ZTif9eeYhieGEnmUuVH7ai/JO7HRhjYEPIibvKkVqM3z0jfZE3TOv0ECUC8NkRhCWEHvAOZQ2Di9cpB1UFmdoTca81BmGHQHV52E9WYKITgpIkjtau2nj2g+/51uj2O1NqXpe7/et2u+ywiRJcxClnpB8zPWr8KpuDNG1On7P5XzL7w4LaThoWCyw51tg67gUiQxAvac5QMfVAg7A9hcPddIYKqXNqHKVTRL1cI18UOJxu71LHOStvahBLKaojwKBgRA37Txbt+RZS2SV8fnhjPK3JtIrQYXS/KbLS+FL65SGQrNoZCPoQ3jPPJ5oGmhVQ7p1HPtUJWZUSK9u52UhHSn7Fz4LaB7f232yKKRJk07LL/FidQB0163aXVWAUV+9Uo0KWhJRPowfH1uqYdJztTXYWif3SQ2veJvBWruwtw9FsVjhQC7panWsvhWmb/auexdM60b7dpZ6YWOyOJa0qT+G9zC+cUTlJul16NOjStrdI5+HmW42OyTZigq9e6wSExmEs9irgKnyuV2XcQjptcAhXGxzo0uId2qEuEZLPpPSpkxKQDdnY2nESOYlFBYmNWyWgXWU1cgMEOrISgwBaXV58jMLxLhTFsomEXb26Cnyiq2J2giU9Fm2absgPt4Rbymjjkcd7KgXAtHaXNVLic47oHHBk8ARny/M5iBziv+H09TI7cjX/4l1dt0YkbjOG67cwvyDnwimukP5zYBXBFF7hxXAov2L5b2RfPdccCG3yiboYvK/mEAdstGcwwoUpM2weBoiRPCYEpRZxbEcXZdI3lGC5+PAl0a9AOvplhycISXApYj/Cb6zYy1K01G+osg1+ehGE0m/zhJpyLJ7Z57DmuoP90ZNkReZoycA3m5rCOFZTV8N6IbLjf5BqGMUl4znKQZT8ehgTTt5IvwXbnJLz/7W2WXCWlXpiwfXydTi/zOvfh/iZZU5gT/fCx3nc4PpiXjU8MdqGAs84cdBbTDHTs/YbHBvUVFzcLVURv20/zNCLGxwIchrqFeEBiuug3jSpTTTU7nE2FRDhL0LYczn6cZASeq3qNqi1zQVYub8kofKMm6437UYd5b3/SO7CKivw4FWFPLCLc4Z8CBcULyQE9K8kclUkMZwxwWqSVYIrnqhl3jFaMYj9xzk4XxZQBOZeTHSYKTGcyN0fb56s9a6UvmqOL8RLP5maDP0skmaEs2VciXWCWkS8gbAyh6gHDIsnXCmDhDERh10JM1UdBGKpt3XYeJrw/+Ox5PFGyCLErC+uRMXw76JlFhorQtT6lEItxakSkm2joAbmHfVOulpr1LyuY5qrCVm7ZV8y6SBu2UYc1R9GKlgLZ0FCB7GyxzUfoiunzAJUkS4CwDLnKYZlJE5rs6JF008a55Dco1ZmpojV5KSQyO3RGmuIu6MJqCkKcv/VWPC5Cmzr77J8L2amlHANFA8v4MLWPFTxCuY9+llLIkHb9KqC6drvO76U/HhzYd4TCrtX3hIMtbCl4wpA/crGvRH0eb0k3lkNxfNADxb3kdLBtYQIKSVtpVDXnukN6/Jdmoy9bYx2lx/ziK38opmSgnSmwC8vM2i8fKZ8MSMatN+ll9Va3rQptqQeOiUWdB5P8j67+kp4MWQFGUJgq/jA2SU0WLYbL3FznrYOcZUA2pFzq8l+c26QbiCbAl8Ch0La9zRiLDPy2srfCpXRVcMOatjv3XJEqv6lQBhL4ygI3GKN8DSMNoacSezvDfw84MD+EGYUFiyxXhVwAcjhmct3ea/nmTEyFPJL03efr5cMR1jXApiV6KATnd6csvUBQIDUUE/gF87lpIhcASzc3FNkongQzQBhyilusxM5JCHhq1vsAHUSGlgfPu3T1LMf8fUvu+nWo1UBLM6eduqghd2CF8y4g+jxwScriC7to9zCH1oCqa+AO4eXSC2V6Ayu3vW127r3ABmlmG7suJd51EhqnAydEaetoL5Z+Ih9DtWAiYG1DSpjkcYPAD5smccfdVDpabrJdAdk1Bwhk2f/0XFt+gZ89z9cWBxBadW17CYPkcnfxboTMe+1Gm9uLOdI72/ZEW8/y0dSUqGtJdXZHqbBgpaZqxg9gdyvqrqrbu6pWaCOvqGZ9bS2aNQDDcttEfa7PXefhfw+AEl08ngtUlua0VZbiX43A5T84leaUEbC5JWu0ClotsUtMv9U9Ma8XonMcneCouY74ROyoXJb2qJ3JxdQ0t2Q4GJsnrM6NKuEQsucEeknJx9Kow/RNlZAi5gmhVfd9kZGBWxrcGjGGclP8Dlyf/begmrKtRtKZ5yBT8yKmq5BbFMBNJ3ipr7VHfJAIAEVxbHyfCVVxhN4Ea+KJOX1kmZaTU/zPKeIuHT9RFhcximF6rOEch4CCeVy0QojIiYrbkxQjbaoz5+dTT2lV8Rvem+gxY85I+O944aZIxHzaH3mJ0YT77dfahgwJEN+Ecac7wiCCIbmkaWV98mdvPxjT8bb5DRzhJR3z2dolyrlyaNktNUvWxPOjxcke/OgOG/FwhyIXgS9DOAEITNdNLXNtuKDHc8plFH43V4UF92UVd917U4OC+UYmM9htdQeQb5I/FQp+3cw6YsWkTBNupvHaX4FOeZk90YqUGUsSz1gWzC1geFSSiYQeEdS0CY6LXPM4KVsvR61UCB4pu70JHkvpAE4e0B7PIba/7aQvUbAr9ZlScVQ3ZXzHatAGkBg+fO4eawSGac8km+CpXbCs+fb7FJ8xW/0Fy3TDoZwOwb6pW+BIv8uCG5EDbNrUSRJ/WUcQn4nnt35rFYyt6GLoroOfLw+6Gcj0pO2fsa+AtutLPb9/jmtx+rXd6t3Ls22SglWOFNbJHGG8r7Q9xIThX+tITsfORZ/N/tf/jGqe2ikQDYq2celmNH7OnXLzSvuO9YNSrDOoTSTs3LlGKochkEZlMW/XAAMt7Yp/jbjIlVq2TSg8sewqPiwvBC23Zm/dTcmPDerVVzsUQcHhB+nzht1kaCTCdTNhdvoWKwvYZ4oSsaqOGGcbb5Fl+rid+q6arHmMR20GI6+uWKihVOIb707/PrT1cPyirhOh3NZKdbTbl0cuJuRSqmEV3BOkAGkr3zd0DUr+L5QTewxGAetWpDipU3AdliEJHg0sdyYLdHyNYQueZGb6g0jlOWQQ5J5v3aM199JVy3Uf/1Ge3bkUt13caf0uBvT8mPeOg705fTxlxlV8YqKpH3Ky0eqPaZDkVLcckyXL+x/Se8g56COoCA+vP5ov6o+Gq0F+INLDEJbG6H7QTc1uS8BzgI5xdRrVjdzNfNl7xrtUcdNhwEyTmciqsCw9t2xIe+RMCZTaG6rH0HSa8IzUrSafJqsbmtZwLNfIT+ipGbS6EDg/AOjP2S0Q7NpnkskF6On9uZfJBNMc/vRuPPO+CgdQfjClqSgsCSMKIdCVJSvc5lo7XijOtAu1+cAnisoJqanxLtNhMiZquTYxAg0RznpnCrQ1N8m5SKv/9Ka54quCMo1bPbNcYTa/iO3IWD+FCky5gplE7yvElfoQPOiy3GB0tsPgZH0HbIeEcx5cI6QO00aSWe8+aiLcg8lMxFwL5rRyH2XFwnT+ZpIDbUYiKNB/G0P3n75pLoHkRmfle8JmO5BO2juC2oc1qe6HJ/TC45AjhJ6czzOtLg0Q99Zri3cs+gIfZMwKN+ZARqPe540Aj0bGZso2NHB1O1t5/RkeDdikWUxkEFPKEMbII7WtZuIc1sFeyNo0fo+No1AljZ40n68sAS64VLmvZ4P5++PAqbMkRjyKYh3PXfxynQI1lAg/kz1Ky+RNG2hK0Lu+tIqLD7o9+gSk4ACGxLoKeLU1+YaI1HXJtoNRuw1pMGcuWfZTpIvUyIatl1l45Elm6xNdbDS02RGC7HxTMmZULCwdGyYXsYp4/RJgdqBWINVf7FKIaio4QYm6H5aZIpV+2XsVIn2ATFIBBq739vS8O10e1CI9Zros+/6UQ2nmCDXg6z3adf3sV9bEp8t+e7piPl0Vn6K+O0ZwZDjsWLVv1mgXeNI1bBh6kk8iojUn7nRitqTJ7o+xfs6NZTQfilDoypCeK/kaNg0+yScxuUa3HXBSpNCIkv8gbspwrErL08UpBDJieyBraCuOA1hAPfmkPFJZ9wWq4uR4fB3I6YYRqJERQ5cGX7At+5Np41bUzSNyjseRMm+HeG/Y4AOTh4sFQ6eZrtDMr6g0N5x4Qj/WEqGJ53g3lPIgwX/BjbkvAN63C4acLsxgdIE6mJCCXUZhvDTnr7Nxa6EAYH4AlflhCVNGE6TM10ypmFEoUVr30VFr5dMlvj1dIZ+iXWpUQpswhGTZ0rUdIE1uAB2ho3IZCUkoAETlgWTYTpeHTq+R59HnIeee8yLnEKghPA6gPynJCqv9EmBxl5DHixNZwGIC+ISIP596tmySz1lKWOfJSzCNvSCsphu1WSjnZ5BhOFZrKuj4Q5BJTEAqjd5FcdDoy7EPgtGmeNT6dAtdPT5oKKNBnrUNt1bmp3X8dGpblRXKqVL6+ReHnjdSY3QaLY1HU/FmqVXaPTFvxYHJxUlqTNMfb/OJaIMHrSXQ6d5QHmVpnSy8xGXfAcd6FdokA1MKAzBqB+j85xb7scozV4FTownJXNbX9hsG6i8VjLYfYfFVwvqdoWg8d49fazKaITx5BOo3bIcHKBdMaTC3DrBju3cwmjGERPEz67R4I+AEDzJIO3z0q/ZjUo9uI6WejbnyrEJp+V/2TkToGvLmdDxPqLdErgttfHueQZ4wRk42tDr1WI8ZUpkTvHvSi0wss9WMPTuTccFYOp7Vc+65+JKgOZUryMKe4H6cmOM0m3GsQxeaOPGNKY9TnaotMkhqAptsqyevZ4uGBuo0ZWacIsUxWpCQz+DT7IwKbQRnd1CSfDDOh1mmV0VZj9xygoOSlrf3TxLf8QylmirPfJRzz0bzs5Rn15+jMml2WhWeddU8AM4eATCKiVf/80RzQzE/HS7HcZBCA7w7y8fl0m+8fuf2BIEPdXRYvXUac2yxwkuOKA77mLoxfFbWKQndw7U8GDJShjJxBIgNBGN+UU14ox0YgJ+IM7vYX5ObmNF8NKUC4CN00gHk+OEuqpI3rCNei6d1kR6KzxyHsQ2bruIRx1VHoFq+zW9Ig0WemXUnkWLSlgPd0Dm+ARifyFS0uujurMDt1a8HpqbYz911nQb4TwHyRqdLsFgm3PLoUmOnDL4udj7Z/97w1eaPfyMtBP0ewBq4l/Xnypqpl4el6OnUYFt4SecDUJjh5B0Hg3uQayutsdsj6iRMwO2hMuVSyPagTWUEh5No3x8CE/QRkQHzxmWErQwksxqj7aIQyRA0obK2FRuX67Fs04IxIWOrytjmMZpyMlZdOQowSjQ2jstNQt9dyGFTjTwsdzQsyj4OQ1SOojVrNBLDUtOyjB36Q88MyXlKDihQT1mhoAElDZhpRAJ1KJkLj2EwzWYaI+3SN/5dVpV5LZftFyzcztT2sLCjuGuAKPgaNxY7Nc2bn2UgA3xIlzlUPE0x5wMiNMa7b4KpKq1kS2RcZXz1l0RJajkZzj5iiSqvqYNE0wvIytCMEQBK8fuOzqNBwV/CBCcfhfuwuq64o6mT4miwYCeoAblNBALa6rhaPPQTiijH4KaYg2bD9IUkWwtoDFhpw2/q+paPxEU3jCQGs/LnZKbNxJoqZecAyVC18y6st4me59Qnfco59MewM7GFrp8eZChAKRvXk1tLx+HFdBacQZHR0oXoXdscR+45nbBRMdY0Jt1QH04iAHUwDO7Iku+pHtupJ/XuNcuDeCgbKlpbAd1u91zwSjAOoE80NFnZX8q1YRnYpbffDudICa6eWt5NSVcKLfl+cbdk+sUIOibTNqBNJjyYHkBbLOfADZHkSI8CCggwbr9goMPQZcvj6cKiR+uOQ4/HK/GAOIzNcVLj8a5bVHwJIbNgV+IosU8kQnt/O6JN4z08ORoYvyN5iOfg4xJgMRceOc3anQf65YOrZTSP0Zq+Rcsyms8Itz+PxKCKxZkYMeVFOKfGYbISW3i7P5Iax0nQH+BW/QAjDik9AJDdDqTFQb1zfgQv2wJ/FO2jTAh2jL6lLnM2dnbL/7BygCU0AWKvBHJbwu+CED04ZVad3yNuNpb93gn+XsopRH5LteJEwkqG+Ekrqy7OJlRyn5UJ4BnpxLRCksfT+YhG57Ay0Ivh6rmqT+9J7yZXr58Eus52M4TYBYndTj3HkRS7OBJ7dUkfcRDKiLrgSRcxZxD1MikpUfnjLYoBgonb3gcE2R/otu25r2+sl8+C/eTRvq4+dTSetKZnL4qG/6D/Im0MDe3VQRr+lkROZBeXPhUhu7hVT5NL512dVCWx71GZo3MherjBXD2vePP+q3poRAc6+bB6IvVW+xcbAVAujruIz8OE3RbaOl1Ugqs/uDJjqJRpZPQ0SlQ9Ivo1WkaqU6R68Mvrt3lPeOvET1iGUQXgTMyshouibO3A/wuZoOjc2hD3B/OdIjSXYkhPII7JCPu3QKMV80nSyM/n4VKY7pdIb6qZhR2JvplYrasbD6F/cIKnNGHvZkbINmSUNy0sdlwHbCEExifPCp+l5HM/2kKUEJzMZluCjiXCNENLG7iyYGLvnhldiknwSxYHZN3NzDk9D8kbcCT2woGofSJem943nDYcmMtyZCpzEMdwsO/loCxz+grJ4MZitO6rDKDHIacWBxibAWoc9BWWwTyoy/kNdOVEloQkyII9AVU18e871tLqGS3CaI3folUwms9IXwEaXE/cqv9yRW4ESOkBgOxmgJYM/6tyrZOHVK8w4pDSA+DB6ZW0ZOhTtGRUjoZEfVEetd9rNOYClETrOvfURb1BWPYd9e9lMmN9edm6qA3CfC/S4BpRLTvrhQw5kfcdLVg/ig29gUiTiPdeo+VHCmwWnCxcl0ZNLYmYOGTBPoLkfUd5/fRqQQVr2ToqcEtoKAc1mT1AXDno0x4vt+vn5WzkXyHLXjI38zzj4ty/MLhuiLqYb0FXHHmQRABZsAOpKkB3CYy8rp6YggkRGyElTkgUR4gqkhCxE57jta3ILH4Gn+nru/dQmojvt1k+R06Ba4lIkp9IDHJ5VWdBdyIFINaQgHe9u1B7PKcdQhGKWcg4sJTW6K90F0JTZChHDNkce5itjJb5yr8O89zqdb632zyIPe0df+TBW2qNtJQt+7585WbdQ2dOlTAnHsQSz002FRKZvcPR8/Qc/fK4lhzqXcgkRtdPoTN7kXOMGRXItT0fr4Zi1GSJvOeB9SzIa1APrT+tTPeDxfHZpd1itV1vgdSXkiUlzxzTS+hJfUoD2UoZphAnfXB5uXoUI8EF2hcXj820hev769o1gsGYtEa1tFPgATELWqPyeV2ZYIzyAl7J+Qo4F/a1N3LqV/OjrnJGpoZo0uI4Y1DW1jf3DRqEzWv7RRdVv5yG4Lnyh7agT/tf+tktBzkd0sPdHFLfP3ZBpI74T8AdJc1Tf2g4TN06i6ziXBnwpqSoypI3u7D/aPNAz/D6tI4YyGUT+cOzJ71ReWL1AerHHOeqeO7CeqEBneqw3DHPhYutpNg4VQ+NMwDTWTzmnjE/97qTUKzdmxox9WPjwyr8/58Bdi4dU5JylYkp9ubriWgYgJYJBF9Qw//H4tSwBgDEJRALURops49OS5z6RZtluLDJ0x9lA799/c34tDHsfWLhDLX8IklPe7Wtp/V4NO89nFMo7i9+6RC8gWUx0FyZIMGGOR/WjiMQ9paDOkxFdRTBSfaVVDA2Gsr0lxDsbwrR863VdxY6i6KQQBLJJV2nGQjU/Mjtwp7+AekN3fW3A/7Dexq8poXDXB3kGW19YXa47n+n9gMpu//ZPwFzWR62lY6J/Tm8pVlB305Smnkl6In+9yEVNsbk1wRrxY7077fU9sjDB6ntBtBpgd2hEdKrv+kraxOWGwjTjOhRX6IQXE17xq3LixEEvQkMM+Ye0BFpOg5jWMCwStz5yGye48bVSa3WvB19O1p7nRv6tXlp9IpT58bvHtjrXsWLLe4QSmL14mnfcL2GmS7BYK/vjDkt4lm8AN3zWxix275LeB7nitYSH3boqqh84JEUlRdUCSqMLxf5cfwC+0KEBfU01o0U2ddbRNFuQICKoT+p8MeYhwZi35FzW5c3BatsW/X09ZfOw2K/XY8NNZ7bW3hPd09j+DhJoFopL2Td1KTEJV199pnPzC1Mv7csySdSqxt52wPq1/vxEY94I+PF/p4w7nn2/maWKq4ij//uPUbPPtz7Iet8uu9+34heqvtT6XaMBcCQA5dmE6YdznFrpM1jhceli/E/VkZsWyo9dL+wWwvPYJeLud2MkvsCQBaTjuwjPqTReNJIMrJAKcvsIuCR1x45zt00mwAMdDhr0uwmz5o/E672l6mxa5uSvi7g6dVUyiyjl+Ki4M8PdC8vnIdK695dhKM/IU1YflL554i+KIFsmpa+vhg1dPxi4pPRf47NVb4nh/b+1BZZyXt8m1BEkHM6OzTEEb7jhtlIZMb1tOgRe12nWf0kp1iu7Y3Zjwtxxi9cscph6+Wpdek9k2NZe6t15LBAOMAA9bM02pYzOjsovPhIrf7cfs7Pa1Or4UaRtUAbKlhl5F/unfqvPMiBnAOil/djhSc4rS0c3Ji1evkgvKI4lyivNmGl70MPpN63Gk1Mix9dtf7pivhKe1Ib1LmcwTNoFNQS2XxhhNIA1gDKgwua/CzrXHScGUBOTb361NcszobHMitEj7TzDDB2266FC1hc0XliJvE0ltDflTsPLq32TMqeA0njyEngPyfkyRXqv39HpwJQZsRBHPrD0Fx2UhF7UTSH675ZD1i9ETygY3cFWcZM6IUJ+J3v5jc0jwzjp0Yr1DTOT4vezCVrqO3TJVoEswD42nl73LYLP03itFGb20YFwZ7zi3SiVmeqwt45dMeut02k0c0o0Lot9LMq64I1WzlSzuXGc45veEqE3SHDeM2WZ1kQRmnpGBpUi9bv+8NbQo7Th+8W2d63Fw42nFzatdTjhWEak2mQF8tkhmhwJYuzf2v33iN68SJPVkzcqiR3znKD1ZXD/ydzLbUdwLltd1Mfbc9w/P9S+4qyDsQ20e/3mfbvRAtCzNLQRm4cN4p2KGwDTxGdnkbSnUOI7uM1LiKXvqWXrOoKc+rxbDC09VyntHsFxIEmCUlRhHU/YTOyP74+KouFO1OF1LfmUzwkF/i1U4/8yTtIqbJKPRltRFFLn7Ld4PjOGFYGNAmd+EGG2P5pFEtTglQu9qPaQg8ZtHIFXQAukCgCpPde4xQoIzaxP+yPQxTA5riD/0FwJ4hED9uhk0W6/Wchrrgw82nl/xaCX8uKIUgLKoacHY+ZmBtbX4JSrV/vUalha6YBUOAH1tMAG7W4VAmCoWNQDLkBMzH49fMDlIO/b6jYig6JCXyhfTiyFGjymkPiyM3p5hvXg0mpQTJsYPtjTjqu1mbeYSWrYh80f90OJHOHOHJahZCL1EEuhUSUR9FiUXNaRpX89llNu8DXdA4xj7doINu8Q6kXN3lvp3fost3vHV7KMdYhtGIpvpx1pVimIu2Gm39hPpK/m6KMKVvhT91EOxJSgQ1TxNtzmt8WV+IfeiutIrRxznlCMrRB9aYamZ0sdMVm2pbCCBeLeArNOWnRQ8r44uYvXqV0MMHl6r8fCp/XFpGYVC6/gNOBclOa1pZkwbmU87FR0wh3DFIvsMqzO8g86q92AVgXKlCDBtZOfX+3SW0vXa/92dBx5L3PMRjFFkbhJRAXzIDOLgv3CZuOiQqD10pHQb7FoqtUS4xfsVCxKgAnW+72X+7PkgNFjPE8WgUgh8eX6W1gvY/UcjnbfPzAd5vjl6DB/TISaX1DFWUWFEkzvM3jer1BwAtKx0B2AOPYGL2DtxvhiW/TuwocAXO/UKtnTvGLWPJCWbwN0f5yTlkUIGNIo707TNY/KbbRWsvKVjYTm2CO/BAtV0XWnW15YA7T+B92yN5IUvGvXl94bN5x49vD5JKuS4yjdcrx+g6JyTxZL1NTFHTkOfIfWUseh69la1YBzdgi7a9WXyzxQrEVDzC1YWqh8rN39vtEbeIBDVEHgH56nsgYq/fauFgbD6u+q1RzO6zaA6D2RAxNGAePqVW0nDzqiZtPCGp8P/GPmID82P9wS/UHKxXbJxfAWsYCENQGbsfydLYzy8vhkTksn3XgNShDELREsxG2VjPi6AJZOwyV8xOO+EqHDmtt/jw/hCIg3XsVvgXPPsTybLbfbbzS0EZ/2+b9zj+1PA87FNYgYrlvvx/V3lMqQ8Hz+s8bnDiSUu2vIL00oMn81NaO1WxIIixPWxlo9WvX8dsw7aNR7kDgCsJppKHso1VBGmvmHqAhiana1+i3yYFETyE1vtPpc6J1QXLUwboWe5/R7cJkOisw6fCPiJBghYzyKL6zc9nahDl+l/xFNCfSJimbUCCP7wp+vDzeCuQ7S4VAPoD9S1dwJHZp3fng8+GCfP7vBIMn7GbdIQRpHv05T2a9+2kp84hZ1Nn6Tc18ueBdXfHcV0C9lPxtPc08HucFChZoyXjCIAsErejHgtEusvRrFk3HA7jXY6EZEL/S29ZFrZ6Km/CGs+fj3M8qkWzMJFb5HyWNCtfBCryU7wQnVm3bIYK3jqBPkkt9nF3sY+f1wTYtgvRA58uqvY1pf8TLanzsaDA3IEhQM12NiVlqFuNwizzh7/6bwIxnzOza9VAeILoQDrVZzVG0+IDA8jNTJ9fKJuwx99dq9p37ZhlqHJeZeMXo8yFEfdE2jZCaou76IAWa9H4dhts7MWKZZ74O0z/f7BoanEpX/aIq/EEKHvPDlKHLSXo145vg7QBkxFSvXmpf+lO/M09T9aPbfIgziu7rnKrRj+4d6kb1zorI6B0nJ8qhMc7+7M7zSh3XSAuQLtWWUSsLXGoSkGMWK3VgT3BOy3F02Gg/9wMw1p9wa6SwkrafkmrpfgN7L2GJbR72nAClVbtye8V8a4DPyQIu0EhmSgo1Oltrp4RVWpS0Xx/UqzodyprcKVDqpERN9RliKi608b1uKy1UyO8G54ZoWIoP3OTJzFh5aCU3ZceHeqFTMzja5JbLsh51q1IIq4MQFyaT1Hq9aojBzuMDlvwwJD6TKp6+rWlSfKUNWYVIQmBkGlgo+CFyfygBgmKKuzxTIxSJdsZf1+FqPFugGUHKZjm8ZP72tG55AIUZpcWdiQ/iE8lKqIKrajmMvGXyzTO3bjaQCZ3rMJaJaap54V9QPftcmAkl2lZfLmS9tbn5mBnkCIRY8tvSowaesopFhUnUOclWirztsmmtqu93W0fRf41ucwSLGiMtgStPNm3WNxtMSHLsMeq8jaFSHZ9kOvZJ6wuT7FEyLD8Yv+uzisUw68n3H5TQQsaL/tjUTwYIkkBML99VKpPdISLwCENHAOANUmcwqI0g+IMUjpy+Nn9Fx1Yr2b0mvqZSEdEm4lBwNgdeuPyhlGru8p5SvbNUDA6YP2MF/TB7xkwIeDIEzqYH5UKymipf76wlfWXxhDxYSjrdnuAGg30N6qzifM8DvBdcRryjmrU+CDMJtLhGuoKZVMBSscgJk9Y/l5ZctkwNwPmKJtRcd4lIq5g1qIu+sefQmeuUmleU0WG3YXalHaQqxdlY80WdMzsp0FtN2Q2UlDsLV1i6fhnTUre7pq0kcQ7hmtpU8VJUsxEMOngMNVuEibhaNZLMr8x11LZoeJ0dpEIvtywIwo4YvPktiRepoD8PLoi0IDzu7ubGEvms6twDJy3JnenAR24eKHclGnNwXEbn8uyxfgTABY3pz+GPQbaWgDyWTY++zP/jg3fRHy7Kxrh6TxvZsC2K0T071qArULYam2hKmhnOCoWJGXXxi9VPOadzx5lj43GN/7fYAFRFNDubI4Eh9vxm01VOZFEI0fHJzHHmuHl9bVjDr6rk/P8cb9c4JhW6vBtXLFJDy/GMplr8MaHAyknKnf2/1CFf6Jo1kW9+iFXItI6Dcw0u8hKZqJWt6QiY6riwjCKlNbBwDI6uYwtYdJTCRt5GE/PO/XBaI6fZHr2+NuiZDiFbkXMCWUwsVe3gDJeyZ66raXNpnzff0JBDH+dQnV5JpeTYqz7nQFDpUdkP9YAM6ZCby+tO3fZDHLobrKhJqsaj5tvBnDDiRXEsLzX6IK2djp9wKKH3vbjd5OZ5wxTRYFWmnCmAHmN8+2zO7mWQANUwBvDpxx44kS2x2d461wJgzA+hnt+VYujuO9J8ab1bz7g08J+XxtrdHMU2Q11sWGtb1ajdvRX7Ycf13NOJlfWdUBpxoN4kfMEmgC4l/4py7Xm9nnkuaWf2o9CJOVLNTWS/X/aOtXoph3sNY27ym0FqAug2/kj7jZJ28dOPYrD5RrnfdXjbU+pSi3VZyj8LJLzZCqYtRB1bOo1Sue/XF3F3pc2dVBq+FHZuod0Rivt3zsE98h99arUCUaYEBPvjmCZqeXtTGQiT0Yeh0iLEnGAfH0dUht9WKOViaxVrqsh+izP6oFdT0ouFvQjVQDFcl+mpeEcUdOpFoHg0JJy3c11gAvurWC8gzBPdtiSewge+BiFZA4AJUlAyZdkO7YFtBxiLmN4l6oTbCAJdv3OspEXBV8vYxoFEjJyMWACi5XM8QmQIoC3oqf+IkHD8SdUhWI1jcxhqk27jbLYY4yox5OIp8XavBwDYAr2Rb6Wc884TqFDh3qYjC3El2lk/AqyCRRnh7siTEuH3VB7Kaqyt8GQ/lzeN5SViIgrDCtM8hvbhCmFPpSH99dE1IS62QU3eflbvuA1SEeClfhqvC/i7YQgOFc7GRfmRyzsgTUAXLPcD8ND34Km5UzfowwTQMWAiu5h1CZ7aN6DhlIDy4iqkSoPlppfyXq5UWgl/baz8ATbywzL5mEAJ6JnGJ6xaCFwnFNkAnDzFnQZqIAPICL9OKyHzSsOEUrYHGHjQelWQEjGojkIZ8ji9sIB7w7xlMd3APfhNODKB51feEbINNvfm7b9oUONTI1dybZxzm9n2kmJgvcw5sF8kJhN3kemSjhZibMxV27jV75hATdrH15J6CroCWB+DOkVH+EOiCdyb6yMTbufK9guzqSbeuJK4hLOmnKIwcTQspZUClg2K7Mf0JtGTeQ/HqZpC7PNYxCzeU0mt5tbrlti1J0MdOQZ33QVJf/n7PbOsAbCO2d06CNQbtAyAdSQrNMXC0NWpnPmSCRoUFFlRJaeZ+Z4SOR6gQAqo/U4DoE5Sbb3AZx4vgZhyrFy6PbzhlkTxWCgrhcDezEZKldMgzVOrPSAsbAHowadGZDEuniZpVvfnPdGL+KZ00NGg1Vs1N40WVs1va07fSuDovh6mAjuCGmXjqCIULnVPsStWPWUq456n6IMmHXOn9vTIb0AV+ERrADpOHYglvFGNj3JJ8hVKSynUPqAclHrQNnkCyX6WtXTJ/GdiBA2HcX4/UA3GpNF70urARZWnYBv1wuaAUqU54MFwvl3KsEPVH8rq9rFPKR0dqm3aLUbZSRhkCUxKCYBicPVYuqQo0V93Aoqo+mkUJzRgqj6RqIVWw+n2kXts59IRMd/wVOYTaEhD1DnfGOmTGNus1E5edrHH/Y+UaerZUTEuEgoFEyTSAAD3IAwNUZ/nm/tKwfIr/2bG1XjYK1a4YhFg+BbjYpXxfvEHngADkXfSAeOQXULQGVY8O4nRqnxFYPZHtdm0DBPlLu/H96SoJ2wT05u1ye8xkVRGQmnwLzNiUdb7UC7sc0oQO1No54IgN2tFG0ZMmOoYlhgmV8+xFl0cL6eCq1lcSntZAd6Q+kZk0ls0fVD08fDVu8Kzem7zfET94w8YcJK41b5/DKVDevEFJPsliIBqUMj+mpnH5Ht6ccyltm8CnB/ZJWECv5StR6y2FqniG7V/26IMzRPd0+UMruS+naD0z7DCdStVfdu+wN7YKxb7YCtilZrWSNJKZG9fjkNx77fRbomr0j7W4w6Z/IVl9Icc8IPfApB+OF2PG66NK731jLUGYWb9HgEazE6l8b5tzCqZ7Z2heyMdgOE8V5pvT99gHP8y++9t0IoYnMJASKHDGM13KGwG8dhLjno6k4A1mXpfQO+N+1oNP1wCZqTLpJ61+jy5jCJb8sGP3NPC5dp2Wc09GKpX/WBq1CWj8906tTk+lB9ytk+A5ZHFhabqGin1lQRN4wmxNEd1CSuiy0k+hg5RORQJF4f8CMXsXxR3E1Dm6F+40ajj8hkCx2ARwO9rw1rnp/kspFw9Y6H71m8FsW9fbNsYt3bCM/g9P+cvNwcSHdwwa3yCAz3t9lUag/6sKdbcBqaqLy9BExuvW8eOcyv7uKMJFlKycAGdjCNCC0h1+mcJqbaf5lrIHJEhTOR5+scW2FzN9kZQZaMsgAbpmEiYy6pej/RnhPesKTP61hCKcR5ERR2f0xWT/JbZev3QBAZ7Z4DjWzlvxIVMVvqTS71FWaobdBnVmW+ZeFXiUUYJ+wJlf2hEGySkL6qtk0yNG8CL/AC9704eCnBepEB9scj9OrJX3kfdaChUHK2UV7F2dOeQuB9I5i9vANRw457YlljMHIeJaDbWe+TiaJ26riL3f1329f3Q2FucOurSIWWQ2jCJ52j6ZSSn/+sYAtocRfTp50EQ8tDUZjFOrVF8OEPWv5xrPf6G4kFNhxzFco+09JikmOpFjTjKWh27NQZiGqlrf5jvkkN+2szHUX8DgE3XbY7OTf5ldJP3zFOGogsH4rsJSstLjxZnSazmsMNQQsm0sjinT+eaNm7PG0j0NSNlGeQ4qPjasFM8y+RnBwGKcbSiNFr2PzsE6I8fFdYJ4IWnjWotZtBZtDqukcucDohIqXMoWhJF4eJcU6Ff9iDCw176pIzLKfh+WyJr7fZm5/tJvyC6nSPyxBT+dgdgUMOnMaz/fH7IZqehJvh2a2T6ZEhnNrqFRny3DkgMal0Z7sGS3Jw58rf1Tf1Uhsk31rItwgsotYpCHuucOO3f4TxC9gMEg9X6GM0AxUBhUa3l+hCXvXDSCSNTOiHxnUH2/MN+rNIWygUiPlmORqhYZ0tvGhJavnaPJTCCxggvqEsul7zhE/JVNAn9C7IVRwkvI/PFAYY7lEAGxpdeDQ+EHWlrM/glBLgb8+VTQmsDrkDsGcKUDFHUpOxbqlg3kJ6ej+y234ABf4gpjGJTr/NtpjBhmC3MarGDlAxpakIsaeoPBZiATv/rhJY6gyIneE80q0E0D3gXlbtZKVcXaYS9rQgRU8B5HIlYFqUfQsbm3oeAkUDBE++iIe0zqrQEPhCA86AsBvWFdEMgzgV0nBnV0bARuDOZhbZa59eN0Ar7ZzsrpNoV8gd9ZJlv5TwyuSu6DMJxAu8nZno/XBFGEm2e+MWiJZYFYfmg4XE/5rMzFLbZ9XiIYp92cBmdYmkwDJN8Pq+TU3T00JmGEbcduvzw+P/a4tY8VM65gdFAIpPNMcLoq6HbY+03j2qA+r+psSEyIUWU3Hv/We8dR3+seisFnkWi0cfgp1NXhh7Aa3QLpIz0wjlGSqdxQIRMioFv7uduNcltFYnu0HLS4MQTTgg2qXkRoc/PQZ5PaZYXQiJlS2H/1EaLUD4oPVGPNTex/ED6/k32yHB+SB6Dwdj80C+uhfT60+lI5NXc8moC9WB7oR5LAfcZRIi1cxTimeIpdJ98kJQF0PjHQhAQ5clWTFamAOqVG8wzCu7RadNvQqM1Mu5rTRqsSgMwVJJnx6RWra+kuT3YIIsALStrOFb9MFInjnh+ZOQGyi8Y7979auPp/EF+x0KKmAaIByCjiQePNoeo4IvljmG6Th6MrmVjtiBgC7RyKnHCNcLKw7x5UeLzcZDhSGcE8NhqXgCfC8DvAZchyih6JxiQLAHp7plvSyAdNQkcJhIm3PLAiHLiqDOuGLpbPaHIGzJfN2k7zgfWBo2R1fX6FHEQSDebBhhMqNVbH8/atmoReisrOgCuVeLgc4ZLesQ5obNElBQbQFBQRpYTFADoNRmwgMF4zGesJb+Skf5bqYg6KOomQZcNLWbnNBpFtrrdwwJKf4tC8133rLcwPbmheDZHfjnJIOz96sr8FKcIR35n5yA++nosoJR2U77fRxwfKlSEtiUxgzh/rhVEk813AY57CS4w/5l4iBxyUQFpWP+ILPgWOHpMiSWTZ5M6rg3WuWIKqG2GBAFIAa81WmDiCRd6g2P/NAAaPEySnz2AffbGZ/PuMlKx+CYQDs/iV3US5w73T8PFVWLcMMWjBY12DM/L2GaGGdxNQXVLmMEhVKi5oyW3eHF1ZzjMlozYk6g7Jk2TEAP5h72HUe+/H4cP+sKY8IJJL2pQT7T/kmIA5UoLZraDBPXY8oFEnRTy01TbC0PYGV++2L0oceQypwwEquHXJSUNPuU+KeChw3qQUIwmbCTULskc+m1FtHQDJxC7Rw5l/Jf/cirjF7/nAHAr91yKyD6ECzge6PiL3fd0aMW+UF0fdMxqd5h5Xyauxv7+rKpEq8oQKlQyouG6u5XKaGg66ZRUgnokQtJKJm8G2/aDkg23ZBXSwV70MAONVIExLPZGWV/d1TW4OatRa4FjL7/F9+2L7GH+N/4NusigrwXcoEqYqCVSTLlxi6LBtvew+9YrLNxfo773YTuhCh1eSGemgpjQVEGN6mq8SvDpffNaNuQHRIMA7oAPuTO/b0v6RgHy6AEG3ZQ2uyF3F/f7B97cPwNLZyFNoOVovg1sUQuM9/uJ2HWiYJsKc6vAyJgo50PFK41+5MXKQYrNCATVspR+lMxyOI6coxpqbLaoRVF4deS3rVy7bTxVxUm7qriOr2jiExdDj3/htp0zKpaQEeTZrIWtJ6p3QBihnzvMMLRbWSHr5CpDNUDeiFJ9kXeSJ7lEo/2R3XBlxSBzv5SoSTKlFAH2MWNofhf4L5qwD+rGgp2FI7/SquPiw2+x9fi8ofZeKbbKjnXuNLejn6mlDlDb4L1VKIea5lxExFFlj2Fo1b4Huozuk1mTiQ9WEYKTNYoE8A+qXFekEXF0Ho300UnSta4RBoO1swiEekYYNJf689Z4eruKWefoYM5mc2OIpqYb1shI+Eb5b82V4h6iDGI+JFb3XooGueQA5Mk9wrjKwSD+k0KbF7aA5L/wejFYxcMvZ3DH1urC+xog3W/1/2oyySIrT6iPRqFMFRtbwhgVc8rAUVkvgQUC6e26yaroEXGhIS5/edUT17dmc2sTePHCnsxLlhfx7KHzu7VXq0zH02j6PVqk5OW172tQJ72Lg4BDXZeKr8mlDAgLIKoGw+RdarEVEYMUqcASNY0vZsJmnXeazGFbJuXSkjEsEf+B5lHhYopRgSFYVD7l2/rmh+sLB+GxSXG8tBobHAjncV5gjGn6o6l4dBe6/85SkRIBBKRQtmCi/kHgh+uzVQczrsAMjd5OVdq2E3r6+cbfA88Oyqp8Q0Qv0Cq9nQptRq4xmfUoy1zr88LmKmH0HFUWdV+HL0aby3yD6BHAanRufB2bz0puq+G56TtfHBiWIVdt/Ggs1oQrLFV5pVJIIheyapbxVMeL6cHg7fGHR7bYJDfaKdZHVuEWasDvkFRR7KY1g4RXDzDOg57exUYPVTnRjk6DvmG3L4Y+ory30leorypJmM4Wf6EUAB7wWOX34s1VcCtB6L6UuDzRSD9hLAWUFdBMUzZywBu3jEuHqVyVXBaov6qr2vfYRN8Xdk91XrcUnOlRqCi6tSA7HLqrAG8izlmvOsogVF8i2kaSTJDAnuo8rVTq8G4K/ZjxwAkYmtw/eYBtI7WjJYzq6921FWhIhV7TUmuOxmgezAAkpGPAWfFofuSTQMgCx/1m2GUaU+WSlbPwP+fLJiVeVrwLaUpzTJWeeekRBvK7JIc5T854+ZEQQP8pr2I1VVkqPHHKX/lDHSD1MCeoWIpoj1gnTqFYwFk6OR85WMSqvGK1uT6ppX7rxo6eZHb2gspPWQ+kIfNGPSnDGNdmC2wYJ8oyhVzNaNOCx1RUxpTteGoGnC50456n3aC7xs+ugeGJpLR5QaofOCf2qjAKzmZYnDnvF/1WWW0nKZMFo1Lf3MT+PeO8zirLRZMzOyu8/VPQ7WYzpzEUrLYHmUvPFBkmrIaHkIQxxR4xJ1oOahd5jLZ9kOoHThbs5z66lR7WUp1ocp8cpPculdPKkRdYgrMRRqaaIVCDp4Cw+JbjbjaEj8yIQEIcjKHN0Tp2muBYroVGXXji14U5Zt8FTzbkqHMp4byJRc0FcF2L+rjRslgumUaNi1PMZ7xVJi3c8IhbyTT2sS9X1NdtwuPjX3EcXeiJhrIZLW3yN6NhyYhVsOch4AuRG6yJMjZlHW46PULXjuPtgYnsjAK5wMzlIU7CIapAZuNGaCWbXgseFqngcRjFa6ZbHnHR4pMgVVyjheGcYeqZ7lv+yjVhKusjsYgGsfEg91ioNKbsFNQCJ7/Pw06iSqz92tvwwxUyr2fECoqDSLUmJgUV/TSeWw00hlsD5hD73UzkL3ACWJ0tsKT0QnhP8WgCmUGVbAUK9wvhN9smcoZwEbCGCkHQzor941LOpfkJdM32c3EuzozmR/lHP4v/MfcO/2lSbN+Vfe0xUMN9JcU0BO32/PCOJ5C2mYgsKKqawVF2UMFgPp8fn6GzMTOtyzIhWeXcJUMXVBLpFaJq6lEI9cYltaBcMtjtgQsO/26ZZOjLdPVjhLYDxvp8YYFofLgAkjmbQhsQcDa38qBcSli22uYA0iTlg+4Pws5FB2vKDFgK3r4Bv2YpwaBwQ5wIk3TxH5JhMw9SPqUAXGpjQ9GG6hC4eGTGR/3Woh4Xwkas4DiLhdHMEQEtUuZo5e4USnZj1k6dFsu8X2cRtbX2aK7Wo7BXpvCN5YdLFAIykmyBw0YiRus7lUx6lR/mafZ1ekJal9iThy7Q0H1SdCIJqthItA4aedoB45I2UJ4NpV2YGOECTc8Iz9CcYZ8g4H62rryPso2tKbEfAxkIZ27Lno2U9jcONseDH+vSz6Y26JbBsIwyYL8KVSg/OefVfOQJVqgWcTyd3su2ZG1quF1SpdWE+eNlMKaN9b9SVQJidb1OS7TSH82J9mf/GNn92SxUnLEkdFJRRPwwGdzRgBa+V4tw7rqmVWXWJdUnyj8vgxkgJ0Xa0Y/jMB72C2aF3LveEPOJpIPQn3bMgqwBGc3CslNoSDEdqgt8n3Y+4ACfZEnZDTrOBEB+8cadmvk8Ci6xW4ek/KrOMHIaQIWyNVMyx7m7RSbIYuokoTetUAtcUpWnTMrNFLntX6FAXlBvJhPls8gi5DgKtmMC5rgECl0X4tyjhC7U9FVkogMpBH1/pEcd+l334uTDgqAGzK13yVFn0gHaXbrGWU+0Shi2K/kx7sTmXEzNjg0usmC9Kvj0nSWuqf+E4HBunQ8wIF0OW/gE9glOykYo3rfStrcYRlcfSs5FRpUap9CcIiCikzNLd4k4LOR69veGmSOds+ZFNz4ShbftUfnw8wvM27bPzeV6H8zE+pIqO1Gz8mzFcqhw6DANr8VL6Lh67tI8lAPMlmNOnI5lOpCUYXpvI/FarqxN2bHMsQdgG6/JjL1Py+D7js6M5WdrrkZ2ovqIHEQvqUlpa6XLumFpayUgXScAr+V5jFa7L4vzEitaOTIO8QR5lKyzNrATn9AsmkC0bRKP1j5YB7a9SP66YtWJL4dbDrdsL+PF57kAZooIyheTMhwOcMBayIGj+bsaNOW87s0DZlzqrslkFa2c7fPaAMtV3ncWpztjTzi97c8Odfa12wtx3UyzMicoZiUxt7DF5tD7bxkfLoyKfdCapQNk4EzvbN0FVO0JGePRaN5/dODIBVJmGhN8qHDlDBRfG2mXefC4eahBFojRskKPUpXa1ArYqHIdaHN5QO4KQ4BDzQwGVk0KmDKAMAYQsTDclQTjfyTIAHhIDWog8s5SUVLHHY0Wo4AzqwTpgyHxABhQP1QAvoNG2+BFjhDhAMxGoXRg9/1WpwEgjvJfjMPYC9gyA9cXzGD1XGtPA0AnONL9jhWI5VlnHYsGdTN2Feq5HXXWZYhQsCslwhLAVDhVU5bdUMXjFUnNjeOpGB530QdqbdDaj6UlPExmeBQkc40IPwlwkg5SKz4HH4qyc8b2nF0qyXuSn5SKVqPxWFFJfkKEqkurmKBsTI2woYiISrv3SGZL4+MU8mZvI6LjzzfBvtjuYXQ67SdRSyU8RnrHS01sKyR2fITg1knC+II82444iVk9UeGDxiTJz1XAfCh8bG0Hw9vcmMJi2MPVs1jq6LqdLPocnn06PYd19D65mB2a7LhTxN6V6eMZwKFoyQm0UY3wXijyjoifO/BlIKxK6GiFqjpVeEfAKAeR/WwkoaZH4ZzeO0SUMEtcxM5gswrFAOIIh9CVDlRaAoaHqWTZLt7g9j5pa6v2w8MfYMUMIAk3v4jSATueDk9U3MLdUH0/qjh1ywHEOLOUohk+FuS9js5qHTsIyRcsODsq7X8kovdbHWzgbBOftCoVdMkxnZN1uied4oK7Brc60QzHQuMlIeq2eazCgCDmSTcx8NGdVO+0+7T1jxQbMkWp5CNjT2PqgaQ0JfQzgeG24P7p/asg0Lp8anDZYjPJ88ddRxe7ExgNs7YI3B34Fhat+fdW2KHjB7SaW81dKXZAhRs3rOaCAlc2jJvuKnTBETKpGW67xwbbnLt09ipyNfzAYlsJ6yGQNnnHgHpvtfx2J7rAaqi/2uMc5XRptsyNFJOhgQb5VebV/SD7io2MejwNLCJRQGBgmc1vNHVAdcBtL6Du13XggvEgZ34I9veqmrgVYWg09zw2hlHuIKbSeGxIZ7Fwz6qjmsx2BiwVJ9rJiopl7cfnE6iFIUBY0dKR6WVaTxUB8QOaLbIu2GINk27++FwOtgVap0bMzCVI8KJK7eTkTBmwL0Jfeby1y1vrpfKF2UeqI0S7ocPrHO4m3kWgtu/YFGYnGIdoOjicp52CNi7P7EzZMjMmG3bjynaGg7xz4MrxKZlQAm5GJRxUlHqE9LFsNQkCByxqxGEG+j2y+aHBnyAI8qQDw4uBJrm4aCWQ33C5no5vsfgzdiYCCsoR7gLwHScxgLAmPxOTJlDSQail9rcC+0n14FIdo0qrSmoyPNBOox7Wv+zIS7qL6DNn9dz5e7Hjn3bjchqBH/sKnNy7dg/WKy40/rrTKywLwjbftwovOqUgClosgqFpHeCAOQlillefGI+/Sf6XUi2CH+ynjHFUf+8ik9q0O93ebMcdkQ9HsU7NEOQ+9xFhvzPRM9E90fvwHPhH2IiTk2BvOvH2ys/qW9z6fwTy06bwMJitnR8HXp3V4pJ2GcbDzmRWuT6J/sgHV98j4v8ATmQ2sLrhCR15j+YCfLhaJIU7YkyRrJn6ZcGF8aZ3oCXTG+IeJiIzCyjFiHOZrDkVLOoc/BiLdUUpskucvq5Fzmlv6qkS6I3HhL6vryG6XViEfsyvqsxA+Mq208JOGGbbk09+0OkFR/YvAeCpChuIC95zYVW+ExMRJLF2Ix0U2W6A2Lun5+Rnf/PMxl82gO8r/y2EyvTXpHLefzU/7wYbCuogUYtisx9L7PoDVapgg/emvB7EOXwXrI2U67GzXF/I27qKEkCF7mCDMsKGap9Rwwxh12yrR1XGlexnIlsHSPYXyOp7jokuht6TNDnijSUVgZykbs4IluMUUnWd7vQlkf3yBCqgTP30Q8cEVQ58PuubMGPjIjaDW23AR4xFs0WiAGByugzWDXx+VTxRIdm5f1B2XEmPUPD0lll6BWeN/4NGWRPZouiP1KBC+oW+a7reSgAqRL9MWWV436LOQh67IXPTTYsSHq1uljwXMkFIB1fUaX5ym0Kc1YUfOtUaCUr6gbvIBcqduJicG89qt1Lm1pzdC5Vl7TAWUAlSOdxtuIAQf5gD+BMm6MES83MeAB8Bl8z6yo1U4vd84IxJaZTXqWTv+aYN9lrBxjyklm0PwML/ulXg7Zv0WWvVwJN9WzqxagM6Kk12OTA+OYJIrXOHYtxOklzBtrqq1AoH4qvokdysJ60/+v/zAMmJGLqWuFn3wgB2G9V/Uh/m32M3XT9Qf7vwx8nZiyJ+WNqcsi8VbsotHVSENJC1DaY4XgL2U8ddj+8H2PGq9v319qaup+9XmUHbblm0paZJ82T+AsJhY4fwjpUtmTmUouTJFm/kl/il2ht9wIFCI7z6EHNX3Gia5/BQK0yRimbJujfZeUDzQusaqDMggRTo5DKIjsZDh3HqK8K5eHwCMK2ee1FdxNnbZxLjbT3/FVj5suDMPhoLGSg+PaeRqmAn6ifao66xcxTxUQG9nCAvmuFTxcL+2dNBwJ6yaBUZPMy0tePe9scNtOIRrj6RquPqJ7W5v+1U76/yQkEF7teG4cDGOj5sWbOdq4OHWlfX2kr+q8dq6T9GquFSFbZbzBBvmArbfp+gn5l6T7Ai/9bOAITxxhn8b1jTQPgdFtvLbKcIhLuIUvkt7pHNFZNLlmrI1j//4iP0TYSomqi/PZ4EIXlvLa99PTKWZ+FkhPFup80IFmpoEybwX0AEfTYho5gmbmIt40QOkxA8fJD+tVl13N4O98sgaH3eZInMJMmI5U+UJ8b0/z5Zo5gtnGpHdl9SQK1xKg5CpBISxYgbnC+02vb4D2VRICQ+rV2l56BFRWQl2jNqYZG/xAH2RYPQmp3F6sM2OO1fnwISvKa1DEhrVfH82JyhEFfAkjLuHVWFjmWba6O7EewTCA35G1Lk+QEsTUmk7hO/9IsYhVSmV9Ri+JwmhAuNVWqaq0YRe+4RoXN9iEuHs0jCWpmm6IM4EO/Mo3So5iM6uGxTDds5WLEEfa76zFyEcr6Iqx4mV9VVO+h568MkU9CXoOLE8YnhF30GY0sdKCoczpvQxCsKTgUQ6qPx8EgWNJIZbFxXizVNcVTTKbqovZFfW0FvdLmniEVM4/5/QrpYXAFbVCEEu0J0pfCGk1vK4jHal8pCM82+shClbWhRbP4ziOiGl66/I4jV3uJJEeu6IK/Df9ygqOtovnmMaSaICNfWeKMgEiKtYKJZ2WZZQZgQVYEdObRP9sEmz1UVBt48Wqv6AJYHqDIvJYk8v1OEXhvJlKo2i+ZfT71l+S4TiDJLNhydJURrLQQlwHNZMKakMwxVi24V61JyvW0p+037zm2yCCPGqJU8NK6NFAKy+enGJpLDC4DHCWAMEEBiApYIRmtgbc7cK8t0LZP10wjlQRqlZrvj+NMJMSUHMwu41YQUAVUX+H4KGj9ZLutUKP9yWk5PIlkc8nRQrOt3jrX5zi6KDcVEv32++o6D0QQwCEsn68NEum5DvwR8kvgHXTlcZdDCkBCwWRPZA5PdXnDG1Y6dT98lu+O+Z4NejVSMWhI54GOCZT7vw3EBjKXl8Q2p7w6g7SX8ZnDMrp8IzRDcQGNxGkzP14FRvxVJnDamGL0a1sEIFsdieRLPQU++q7RwICGpdvYG/fEDWDmeCbCSJGjmmtis6Ma409c+kJGwiCKOLsL12hOX6b3EaU9Z6C32lk8GdFj2YjQuJVKrk3Uam+HDBVous5xZJYhciFGWG/R10+oxfEHerfWDLGFXg2TfPQl9DhYbzpvnyjl4nWxiBMpipIyJackA5h8VPqkiuEJZf0woD/qeFnJ7k6DGDJAhcNwIsy2SSiDOsrHJya8HOZJIYVFNpY15i4yiNMxvqLnFE1ppEEJPAoFfhPnTpmS15GYqqf4Yq47WHhRB3Yi+wfpBTCexINpsDWc9Vwj4E4VN1y3UVz7s9cvrWfSVepMo+hgj/UDHVLTw1qPcE+OUU+1IvUWMNl5bZUE2xGtyLl8ZWxE9hQC8ssihqH0uwUFC7/vTzqBkbfjx6fYrpdfn14cfj3SnnpubC3bNQXsJeot4YUO9urxJdrfQ/CrMaA8Zd+e97v8W6y/DRQlY4FOh3OHumblV29Hm+IZ7pZV7GeXh6fO10N0kIh9e95w/E/9kYKQKRHlCPNvqaBXFTJ3c4TcVyh2EjwTHxmABGNDfkEjrU9lpSUHUYiJP2Nt6fNKvG3X7ppsODhgcQfRW1TmQigS0EgYb+iIG6z/NPL4COclYWIDVRXDFEWpgaYECwggrpC2KgnAdaslISl5KLZa+vdp73X+OV7OFqM+pjueu9XG7fIyh3/XSPidzk1L3r44R6NK7wcJ+XJdmYfr1kvLLQSdNC8XvK79vgAU40yCLy1IFyY9v4qgETv0qlP61A6vIs5yY1ahNFp2wfDFwAlLxntFWt6qCD+RRnNO/fGHnSN32HfVSr4o1Z1dTID4oz+7r5XpgOUYB2T4oWHFUxfZYxc11uRCORyixMI7vKR/UyTM0AIglNvYAzQKb+HQW76Z2yYPnMd4kCowCuxjpQHcfpnmL52IAx95ytVEv5//LlV9OjYMtvXmFOOCmBFisc9xRdAulCODb8T0/z3JgqnnqtHwAaU/7bD0eKoBuQzei1OyXfB81j+4wOi/egyoHoRunYwD6A3jnVaFBOfo0Ds3yph7JwHVP9/bwku0xxwqsXZgRWNogv6r5vKOdS916kmgc6LDQ+mBYuTKuQxAwyHtQz6SAGTtwIk2Qc/tz+qBUxI9Jr/taZPYR4yxNmXGy6YXU2XLh5+68Uw7o0rhKjxfD4V1ROLxL2lC+MbRTCXZ1dEoLiSzllw+ghs2HBSVthh8hNXeCc+3ZEnvuTrtPf5ufwdR+AXnzq3UeOyy03jhcHKsmzWGiP2rONY0VgUNaVEvG/N0bhIvv1bgPiKVQO3Ls0usuYCOtB1WUSsAchHQQTk2I7UoYsuGploBQeKIWmhXG1WJFMc24fONjOn85KxjFlLh80dgtBhv0QiK56iDnJyCdnlcSYGb6UWJImqbQWuGO1W2Z4XZSAkLRtd83wZvfpKYBGUJ3AGJ7spEbwPO2sFnjMqlUhHp9FZMPic7lgJ72/sWbOATLXUb8wVWYJw4XZV5M1DbskjvUdu+qIluO/qdsk+TrbF16zc69gWWf6/hABsERZndhgw6eACxIGTycQS7a9Ew5jOAHGHzQYcuWj+8u9/cjMfqhf46hisR2xqoeLO1CZV1VY+LDSaLojJc5yXwVbvMYMcA8CIscca+CYTmvvXyFvrTX6u7iLjD5VUClfgq8Al8ubHV3ceePWyhiIW2UquAPImGK22ZmHbe7h/iWMHo46hLC2JrXh9kDCH5BRBwS74y8tycMd+zvCVMci16R3kKfF96zzx+9vAIcJiVCPKBCDr7Uc3eDqwHkxgagAz33NAC6hgyCvmjuwJAV8ztii3O5AYZfX/JZoisZ/qF4td8ub+R2zI0kbdIS1GvejepoScGs7V5P1RD1ZJU0JERoi/nrweld1YfaAP8IF/Up3y/v5eGbt9Se/PHuTYOPnthgU5xd46ejr1PYWrLO4VSelbBjVeQxB5vyh9zn8FKO5Gi+0OhDyeSbC3fdsFGPo+ywqW3Ww4kDv3VCom3Y18plV11sZsu0dPuGswyoDQF4nKFm0Cy53tv2+ndXcb/JZ9CINPy04x+uyeGuB+2lVP8OJFsg8h4FRKvYHYHl0hpYD0VFegsd3nYNL7Ulzrc5m8kPrkhVTUE5C/8yQXTuZWBICE6Fbp8g6r4iR0yuB6K9zr5vrwReYOoCaVLWTp86KG4aWOFEdo7hO93sCIfJla7vrIC8wBQRrd5mwFag47us79GwAgrPfTwdmMNFeUfQeH5So1Vgk0M5DAsGoSk0FLhsJ/XF0lcX7447xSN5+Pn00s4PBD/Sl2pbFznqL0Y166wybWbKy1+s7zs1I6+oRvTf0tBxpWZzkn4cGLNezhTnGLJnJ2iogZ1qHA7e3uTf2sMlWwfHh784XJRXsu/jMfEx7tx7ViCeU3GzrjL0AFazslaqRo/Qatkb8IHiPfHu47Ad3wiqvI494lke8TAH0lWkfC9ytdV6PfpnVJJ6ktD9JLsH845XQGX24sUmXyj6gSFc9kwikQ6V+vhfr949YvKgdEKCZZTWAzIjLGZNToY3lnTZJWzmV32SYlP82haTbsU5xSZF1nac+RCmvTwP3qDb6hGOOQrFaQ7cBmFm7FDnGFl2ACmLX0j6QSfWD47WsG0KQubHAt9JvrsJKDag+gPRsQpFYq4QucRAA6mP95Sf9RfTqXA7VrSeBg/cfzEfd/weIl45yeqmVjNVUAY+ENiUyhpbEppm9YbVF6ljKQkSbKOUfdxPCqR0vwG5amMMN9XscvyKb3LRSxE8VN+kjmH62/s/GplOfxCVmpRhFDemyqTuJtkvmhDZmr2QjIV8W8sX/Ci1Jelsr6j9RX6JEihAxROfuG9zm7jgY0YkajA8ANj48JkdZ4QQ/EV//JcdmlsgWCF0fHFU1eHuGSGTw8fxzubYySuRo637fJmpId6imVh4Dul0Xxkw+XRWo5FNLzpbw7TipeuS/iV/iVqzcUJrKcVNHK10tufaJ9do5m5+RvRWfUR0fok5Hha50OBURRedWObHT6qw1BjqnJQIlYu5MhvFQeAY23jMIx4HSzzmgOOgxjWr3ilj8ODrS9D7g6HxgnvJ2hGBteRTbH/7sVYpKnx1EcA+DmwJfe8zzyvlPI8fOLhMvM7fykrCAXXCATmd5cr5zymxK9t3zm0T2LopDGkPI71130tCDoAe018dbCUzpV8m290WI67TwnrfpaBGFUwwFAkyT7H3xG7WEQobVs/lMsbMzz3aoukkFOgemQIVKTqGGOba7EF6fjEHwQoTOU6PvYNc4vxw6lLcdweccmHD/EKxIiPKj8J06UwybFTQ1ltvqx2CqMj06uxuW82a8ViKUfJB31csKMOCq2SjDJ/Z5EHsLs+2bN+k5+pMvn7FedIwOAYoJzXV+/7U/NSwlchc1RiNREtHNOOF3D8uyk+wVKTpvM36vOrq0PUlv/SRmbcy5KIY3/drDL5JUJWvn33LVXbL40mFjIwivr2FaKHDlZFY1apOb+GIMfjmt7tZCoiOCjufSx9uZU/zIbDfe/LO6lLu9d0judEFDsooN2jb0437G6WHd0tCy1hwvnMStPzeWtaHxSCIvgjT40S3/BML47tivCg3anAOFE5WakeID9iCgrGBBlTksuMSm6LTp4icidpU4ZBpnhqYrVzIsLUzua0lBUzzExgDImsy0qKF2oiUuw6MbcOwWnKb+tZh/uKWjqga6EJv59C1DcO04Dauf2MK+lscYbwn1FTqyqDbMAiUqtBChYe7hT2iLwmt3s5hAKwk5OWOy+hvQV1F9/SW8Kejk9+MxQTorcuH3gXI1lmFZJx8Ac4X0u6F6QMhXqnEQekVviAWK3wBaykqAEEdw1SuugAdYuCEHJRqYxbVZPNUE9g8IRekR8z0mlySHqmTSOOwt21ex8D38HBgvH5l84zv2aLnhNY7st55Ch10borHIJZOuuYg1gTnQCPUsUlMQq004Qu2owdInYCvrtnh2GvUJ6zZeDJV9igdXCVh3Bp5A9QbaL1Gnutdgh0VY7S4G1B7EjNyycpOdGqGmbbNPeGVsmxcS8kq1q6BxWukRwBTFiWg+hjgyjX+mB4BTOmTHBummeG6JBWKaMQJHP9xdJQtzLPSMIK2eoFRsxKAH4N+eyT5skyuIMt8AQdbXOcgrA9xugiqLyi8VMlH3ItsZa0rArKdLHi7lEO0g5cq6x7cdiIx+ComcliJA3E4iSzreVhxFtloGDYchPqFVJ3UbXlH8vV3zIJujcFiX7Otw5RWJMMTh9f4+CVbuVWHxIye1lqoqR6muCK0bglwMPhJW03aB6XRNC9Caj961DJt2syzZbIj+RP9+yTX2jsneeA1B7r/UFFd0Nq4qMOiP2QF+t/b+VJWyoZRZV0d8OfiCI/bEMgcgIZAx7G81nq3kt/V53NoO8BhdwVEqLbL92pyforF3ahaX5bh3pv2dFgf25ypJ0dWQKMsM0sfCLq/U13ER21xsdBcLzhtPaBs9P+QNJjfscNTJ8gDo2qQwzbUbLhmwza+cjXQCUlrGIsVII60OtOmbsq1YXrxBFJrotDiJbDJMKBivZFTXHHN+YeL2HSzffjnMccpHJT4whVizD9hIbwagSPzxT4Nyn/IHUMSUQ/sCoo0ieaMNcOH0ulIm5f7eBTgFoG5C3PMgIw7hhy5dkL1n7uBgyRkcW2sBBfcx2z4UeJE/Za+zhz3EiRIrLkID+4hTSHSQYFuHVyDYg3HOjCNjNOI4wzhPdijRkGtFNkoPWcLgqUANyM2OA2Pbjt5co05nA0ATReWW1IC085Dj6+L7i9xzxeUP1yVbhKQhBAn6bOFuHmOXe8cKev+jDY9Bo7byXfHiKwdhC1QXoQ6LqiFjV87Ic/3CljDWoEteGuzPC/6AmbIbQ7KK7ynejfyTokUJjeVKNAL6Uy14lXQKJop7tYdySAu7wML0EdWA7fzGP5mic5TNFTjmrsAGTaOVadL74fdFB1TCUh2y/To5BTJQzuWTvTdFKhJtmCZVhBlpUOjQGs1fZCw4IWBGhmlvKWsUL7yD5wkp9h/clGdYN592+M97VoiZ+H1YOE62Vy7ZEhFM4BJrZjDqjgje29swXPd2VDlejd3CUeCpmNdi8wQNVNcFxjD64ofaTzZVPRh82yyBi53cS+4NLJq7OGpU4ZUixVBzIzAj7VsS+b5cZOn98ftPC71c+Kx9pUqzp/3OMaain4tFxcv+/33qM19LPkMfv/OTBDDO/uDAH9ARZpeJKwReUBxwPYXx3ofbR5NGkAFt976AKs9Wbiy9uRSMnjyEbK2Zynapfke4GVV5RcFsh0Odg8qLv2xXV385xV9Qefhu8DcTnEXmimI1o4ZPvvydergaWdWcW1tzpUeRMlCv01dCEmDiYaxj1tQvYKJCok6IdBctLa5XL10+A+gQr5/OO2KTgvHJ+F3w/JL9Qu0a1njElxJVXgzK1orXSes0rhakFHP8oK2C261nDsTiALuCLo4avykuBkMx4QzpGlgtIjzCFMXhWxI1PBhT/KcaT5LwFz9YqTK9tbnuB2U1FaY/nJ1dg0UThFmfJLUkG3SyxVoUAjrL5RmA4zElppDiDV9Q2Co0OSM6K23ffGYIfhaEGrZa+iTY9KN/xQYGvUq1jKdX7eoblJtBTP2KKFp0o6d2cNJd5fzsvcQdjQV9/GLZ4zCdwuPyaoU32LBWTQhTRZ8+iuGoAzKhVM1tw2MoD5zf4x5ql0E3J6aULhC8NQ/GZooz4R6fA5PpcfsrxByGKc2nVMXUwHUmAvhs0kr7kGU6QT2lRP2r8JNI/pAMJsDw81XNJqQOZRI0V4H5Fjcc4zLTVZtytMfF6bChVg3kILIyJakQr06XrdwYqyfpFBrvTHrsAIDh8ELs6mZTvNNFfxRAvnz+HDqRucTB6YyylRLVYgFDjOt0NMIllIi5UyEEIWP5xW/j7RiH+qZjFNEWvoCiyA2w9lIseiMzisyObBH2ppURL9auW0hmmYFgzinZdiGeNjT4BkmMkywLE0tv0Qu96KQPVqZU7Giir3K8iaVejG/CpZOkGIYNs8hoy4aRT9+c0TDQvmQLzPjMTcy9PtAywWPRCX9lcML3J5uBll6JzvXzZpW+ARXnmFvMg5JLVBqFx+ksEOCS3rEKaWdGUzYc7lzYnqpzb4wD+bsLZPCiMEi9ey1VgfZ7twhZt/aje2NNiRSiWyjy4QBFWktrYr85JFwdPyY4oEWliUDDEknpVn7iAPOAs7+sWUlW3Eu5R+5CirwejT6kiO3cXCGn3agkTHzc1SP25yEp0ZPCJbuDLcFaHE1kzgVLeFDK0AmaSlEsLBHGHEYLOnqYrGd6/B2A5jvkz9GvcmcMOlY5q+bT6YcNj0OBwKrQfB1fHzb/j8RseMumdWe/dsdihuynyzeLJBSAPwMj73b6g3W+uRP6IeXUGAThGvUKWPV9dek/Stzg9jBpoOUu3NR61T4VU09HOCVyPQKwhatlIjGibdAG64yeLdAvNv7KkGzlugUFEelerd5VkX6LzKHEb7WKbykFMLz4v9LAkchdMQkVrQgChs6I4QAJqa3mZGC7CgazReEMF8dKlT601GcMB3ElEKyjJ40Xlf2F46IzW4qiBjTRbPjKIbCaqk9kAxasHslTKnhRVsbwFcgbk0iINOhoVwjlkbEUV6R0DLimAkOEitBcAtMEopViSEXGldzHuf7K4zSYLM3TGJVuIBILtiiOOH9sIZPVx4DWxqqwm3tZ9lOgWJ43fVWnpN//s4mn+wWbD9vHJiQebYDCpSY4Wyaz7js+GRCkE9yWg0EaxxBym+lo1WPRDHv1b943jn0JCMcNeZMdQdtKkEpK8NiZ7yqRKcLlvNbzlCTD++/2bhbwainlm9jHBYT/7oARrT4oHxckgA9hTYKTCYX3L9Vadg1t8LfV6N19vsKDodSgZ8+if579G12SwnMij0CqIjtZQcMKbUSipj7aPYv47+zPf+pNtErza0vs8Z/LQA0gbz7Y0VuJXdrWqrR/7JOb/GW1EfH8vC9bKpZ1Z+MDv9pZ/BniKZviEWxFi7oRvXj6mVHAHmCk6wy9mXasMKKxSVNo6kF87c5VKuBHpby6oBC7iP74aEPjte4fJaqbe2BFhhj7Fs0vL9/FrVX3t0NuHW4fyz73UiiMeWnmqsfy3S+weHtGSX9Ahwx3hPo3obYHtNujr4iMNtOCTRkYXHOvDaDjnPgBgoKEIfnmU6laDHJA91VF1/LHmRQFoIF+z+xu+BwfRjz0eCzHJ2Yq2a+9MlQE9/GWlvH2Pr21+6inbtCMySmwmL+T3Z0GjX9ojoBque9MaEvlUJ7zI0r9PLJMiW5EkuqOLlJGBthHY3YbSL/ZE4T1GhnzLhwA37aPonY4Ek9g7cc8nxTIId+eYUArHKwbZs40512ve4v+btfh6xrqj9tmPTUCLXap/EVVv3O30Z/xHW7dQOsSr72rFVO3EvHqXNtf+M/6TjXqXDFn7ziXreZmtb1LhTH3EM0pt/5W+KFC/zW1OGwb0z28Ik6vONc3UoVWPCBUs+n0s0ZHvS2+x2MN3/I7ffjHYbyx9Ll6IseAir+tpPDm+zWZ8JvUXPmTk1egQLl58RW/pB00e5dMEVH4RhYvp0tKbUDrPcSGqsKk39aW/hEpfytKQVGmGkP9tfqhs/uJ39ZFyhmkED161KVXhT5qbEh3cbV8QTcYl+CT1NcZwhq68Oz3fDF0Yc7kmKcwlq9eSXnWha4v12YXy1jzU6QqZzZbTESuFWYrZCww2Klx2+r34yjowqskqTv8K2DyNYtNTaszvP1ebTgx2h+RSaXvz21xDKv+1OTptqS6OfoezVb12oiDc3FTIACpfjTC9eqKX7kyFYm8eqi1WFl+44ZmQPTU2/zdnYQRQcY1Nn7siFNlUmM3qVlbnRDnbB334QvZdem8y5rIPWoav/L3C8ckxHBafJYBR7vLNJvzov+rhyMV0e81h/8jWe+kQe+kT6wc/DxmQm9lkSZ5ZfLN+9eBDacOtCHktpvsAHvMdXxc93Vl/WjRtRfZeN5hAOW39dOkjdJ4Rt86u8hT/UsScuHa4/jsxJiqODB6ef+mk9qB5ZwtDp+ODBtKhoLYB+KvA2UaMMcpRVzeQeyR8Zcwm8vK88VD7m+4xhpzcf3iFw6NFntNP0KaT+I1PUsHDTomU14ep7aSTz4JAjtvvPjWYgR3Qw6Hrm4knXGl0W8STZn4fOdP3Aap4HgdqLt9l2+8Mt+U52Yy9NIhIoWpWk02ySyq61XXWtwqOqo9rXqavKbrnV/OnUs9tAwpM8+DfHf29GWSdWOzwk+VV1n7Z+q+Q/mzTcy4WYBG9qJ6ex+czepnguyWvy1fhCr1bQpXH2fA29+Dwqc+CBv7Ee+Z/9a323nszyzPtHp38h0hMHB2ETgew0Pxg/5Mp74xWD+HYQY+3uF4LbLPyo4/b0DZ6ez+Iexu6NNzQQPn34ArI9cJGmTulBOSVub8gqfveI1v39ztNk4C2L0UdwUvh5/hX18T5aL3tdHTa2k88+9z+rk7UvMLnzw/2oXmImFbRRXU76hgmnzm1j+FIZvb5tBn56QPtmhnPko/Qi/GrMw6q6nVXza8+eXGuz95pwpwyW/5sf5nMO/GsOH7FmvGM7MzWTvcpRXAu0fkPcLewAk8e9LEgCghee6Q7Polmt2t6Aux8sa5WJfYq+tcYEE8nx3n1B2FQP6Rcr5VSq79dEHSMfMyvea3S/AyGdo5/xR8XrveL3/D17Xjqv79TaGK221mAGma0wDK93imAuMgeBgDdIXaGAFvCIw99BEgpDHdP7+P0gKDAdsg5UPY4hCls1/6qCXeN6uirbMQPlRAE61plrjHqhfMDgCnw7sMYEvR8XfyXCfq/8vnTEDNrXYtIvgwdmhE1cbFW2EhYGRDZsRJle+HhWWEekUsbUWLZhQA+4NeQU22MSSTfzOgzzJ2nVMXJA/bPm6AsErgjIcz4jCcPNxCahhBkpk1sGLhrciwioGZxEMGUAiZSatgvPLBq6WVAoYKwPsVBkGchByOgq2I2FMZOrJdiCoECxhUwbQAhKccglD6fRIGLOzGaB+gjFhA8ONSQXksSDLFYAANyZlIY091uEn0pYYwGZgsiOfcySzV8KX6sL4C9tWgDjilJpqfxDjHywn4nHClITewSfE+IKFEY8rvGel9ywviLHHIiM8Mc4ItS6PiPEvehCeFL9D6ZD4HhbfQVb+zqEQ4xVqI56OOGeljwgMiwn1kciK3wiph0c2sMYx9jUhD7hkpcLLDBYLqoqQF/yFUGnyhRjvUAkhb/hMQnt1HjF+xD4k8i3+QKgC/yPGBfYB0Qt+QajasGejYB832Cuhr1FbfICBXsBnxPgN+1HQj5xd6dUHB+MFvRJe44hlSLzWI5Yr4rUbsQzoXo0QIff718SfM/r0MqI/vfzIcfedy9/YfNyxuT3M1b09f319wq9RjsnXOLR88XKDg9IxlwkHpoe0Gflzw+9eveBPpVXadPgDLb36jd+ZM68esavoLm1qnA785tUGp0RBrhJOSgGKJ4wr/qYuw7iwuV7nrIvbLizv0yaLIEWXaygojhQOET1OswIiSqYZRSHH1WETcExzWKDIQm0yUETCdYwjZUeD3UKhHj9MO7papC0UnQYUwLEdGxhB28nQmUBGjQ6k3Zp7LaCoR9QnCqSa35n3hOuelmbU9N3eoY7mYp1QYT3sfSPIKRghZ5TUTcjpTq/g6LEtjgLlZr1AHIcdO2zCM+wWOojVTh2CoB7RPJFHjQ5hC1V1U6xrFzmQQK/g3sImiQ5Bi+LH1E4oimAHRUOcxqSEgEWCEoGZIkiFHRzFOoENZMnHdN5CoZ5WYJAW9GNRHMlEWCQoKsGJCLUDVmcdVrAUitrQXDonrJoG6eOdx+OYwiaQgc1BFHIFhyIG1PfJkNOKzBT+pFg1aqHGEiKMUPTnE+DZcm7giyMh5WY7QoURDe1BsskMLiSTNxlIEtd2xKpTol/YRXMEWeh/kmYJ7SCh8AXs/arogMYMiuzI8abd7xw5BAERnuQKnhSM0CRozBD84mhwe18ACtTNDVDKCG/biOHMRUbgRXtiol+LJKjv4CRvkbQVCdcxcExHgfoLRKj9kRV1S4ddGY5wfBakkH0bbhtBT7PsKCYWVxBys6aSRy6sQSGLfF7OkzrnIIeVYoFqx7sUJX2xWcJhcjHNg3S4Kh5PpR9gOiIvDmzckbqjC+Ime105u8Ol6kNDK4Hsz+ZMJt5xwgJlqoW6EztiHNezE9Z2Q+j9W/aO3swQ/yTuv3CgM+p3/za9Tx+n2OuSi/IM/CTdLMchRSNb3RfskhJnLRNIX+8Z7ydCy/LijwHYz7YUEC18vCKGQ0TKE6r6Z0C50PcNUryIHQ868NAxTUJhu+jVni8HG3kG9lDlWVkAx9eOnQN3ry87GqDkkfpl3DZahCMKVg1XmKCQYrE4rEcjPEjkNrVIz1ZHN093b5TijdyGZ5y3Fbjus8oheJ0UhnyWQyjg7Q+4dAVFy50hgdsJGX8tE1noIIAiUvxyuk0aXw9HfdqnMQfJBvJLrsoH7Y6jx3eLzIoSWEj/WKCp7tyBDxKKdshiLNKKk1HQB7B+3gOKpsY/4EQQOQhKwtPb2VDSJti9v4qwQM4oRsQcCpmFTYi10GytkPzLfa17JLBqHJiJk0GqxXWf3mlBP3ihrrqhm5L8SL9A+3CSOYieeBFHR2J1PFqRg+CDnzIKguARgoNaEw82PlFUf53F4zQhcSHAj04N7D8KQUJ3BWsNefA9FHAkMEOPDty7GVCUPxYzpw5QxN8U82sfC2CBQiQQlo/QRFU9qEolYLUJ2gCfUdDO9V8AfAOcpdmkEe3O45hUmLQWcG+TRorKedCnsaGuklmkAGTpwGBBS5qMKXntgAYKdSQTlTMvk7azC7SFahCyR0fLUW1ENgEzZ/Q+wcwZnRXnnNZKZHPgyp/Yc1Y7pOxnwhu+xnt4+t1IKzpbZEeNOE5jQZ+T6c0UXuwpUg7aGBHJsrjZMUo2F6TTAOx5HG1Vi5QYDmaW3odIP3pynCadZ4fIX22noEcHXRIAP2cwZ0V99RrFfZhcHAXKBWAHFAD4UQavR9JS/0WSwhw6YG0CUCUGBVoocAFEzAF7qAiGnQBGtjSnfM5oE/6AiDXT+hRgRQksL9ScDmwesL/2oEgWU97cH/1nLw6RqiymSfVsWdH6SvNTynHRBkrtBtykW9U8MI90b0aNVV+RaX+yCFYHcYbFoh3R9ED0Gvd7243aq5o7n1+djKoKrs00kSCRkxBBb6wL+0gnF/GeZtFa+OFfR4nBysKCMjAngYHjM3Mk8KGSGREo6HwYhJppUBBFmzfigmded4Us8XDUMG4CFOVsEEd3EOzI5DhBId2hmif9h3Q1BhR1rPq6KQHP9PZj2hGu04DmAewcNEbqCbDiUiIDt6OdOd4ImuVhE6JPCQFxLcARv9EHuLBBpaWJ3hkyFJjrw4TR1VKNZ3t3xOlHDQN+OHtiuFRTt2kqIb0yEuWC6TZ0oIMEspETfA4Soilww3FGLBvbQQgEIZ72xaizVeTRcBUKYcCX8C7E1nFQrkSmIfC7klThPJ4vKcZnUyhE6sNRY7uRuef5Lml/Oe55ZSTS0YIZC5qZi5/u8euNeOvp3oYuSN192sVe+4thereYGRIzdmB14C3UxOmI4SghzglaDVwmXSyomWaKprg9gtDqci+x3t7uZtCAExzredfpNhrEDw15tNvnMA2GwUBjew+L1V1YIUPKia8qG+MU6aLQH8xaB4u4t4vTQouQ9gZ+QGZ/cQhYm/gajsKAvd9/Kn0BLcVz4h/nRO198sKPVxYawBQufhoxaU4v0t8dScBy7EAndjOCdZ8Wh35orOLodt82A+L122YAHoBpMQ0uXAGdhm6JZZLsc0RU1DhAHLxDFRN2wfRMUiLe8W4/4bRYl8kyOdnPhAWKQt3t7QTNU6TjBQRGPdHRkzjWggRJB7l2cB5WEGnz2hBxhIU+8aDC+ELecuwggVqp7uyQz55xBwn4v5cOf7kaXi6mdJFmptL00CJ/7WB1yDi6YYiuV6BNcxxR1VsbxmVEe217gUxUJlSeY6IyWc08G7wkkVYDjP3v4hJMcaBmJs5GHnBnCmxk9JEJsqeCT06GGKtuLcYAG1BbN3Yesp2qSgYYIz+hRm3j4aTvsDKxAQSH4rELQLaYZSfEfvbyjE4VFt7PGRQ4pMaq13BVX7vnTzDp0zwEBakAQTpCKLZK2UV+D2a93oaDmZo97DIwCUeTLqOhBp+imkOqCVuGk/ehf9Rq55ucKHBK6lEgdpbuMDJcVbCpoXBUUQYwmvewRU+iquxu0Vou1wruk+eizAagtKCtdmw4cTQ99b2+849bc1T13/XrmIrPFxTwQZuc+FQ5uns4b999+4U70WgIBc/XdNK9wBouzahJd6pwbKdJrrTNtgcNHvRjVurcJsRE9zaOxz+wreI4Jwlhr0EjEKesHfszb23kUgHT4hpixYqSFoGcINatYAgxU0DAuTWUHNG/G5pdpNku0S6crHipILybRuqKXU4DLPZMR1M00424Hga1aXjOheMnm6615nxwEIxF2HJjKehp8V/1C2/0Z6slMe3azPhUg+somjyy1V8hkM4XlZvhmI8TDCp8wQjeBGTncXFe6Sy5uFkcHh5KsHRU5kkNAdp+2notVCETsEp0gL2uy0jhIrLtE7fXAPZWCsWtJFic28uJ2/nLxTS24OHCKFvEtlVcFD7q+Gz/chKgxrXDhWDE5hFvpebIM0AWDj2WlT0E7SW2igMtSXIawM2FuKDyY47MTy2gsk8CTdbu7yAyWfqCF6ttSyZVvBIo+FXRNdXMiLTHEp6doFb2pxpdwGEoyldBr4gF0kPaopQ48WLRDbFAvumKUWJ/qqnXPPYR6fzctsRdr4h0fHH30sdw6mwcIlIx0Q2KyFwZQvaf/taM9DV07qJ65oqB9jUJc6GBIc82xvETQzMrNNI5qumHZISIyPm3ifdTAQ60dTLLedHqq8kyQVqSWjf3pxQPl7LZcFZak4Jch6jhIhYy+cZFtJ240B6OvvuXirNH4AJ8kDfcqBodasWRUIhsdCDHrnmA6AxzrYkrw+kdCT38Tkb12LVr+88pPosDavhWR96iCOdU4ac4PZXPTiiarqcHxQ4ijdROEYC1WjrDOnFHTAkH0mDZmZ84amXGrCOGMUeVEs9CFhGqs4J5GfG9HCCwaLS5zi7yjRa6qm+Ua5pUFxqA2IQ97xwqYLU8QONYIUfyXXMgxrebzakJasF/85f0oeBm0aIdBIqSXHIiLfXHPt0J3GU7phyXEQUnOM0RMw5FXDTUsAU9qkkCh+h4IWqQDTsXKpXSvQkLOBvO4xywgFJfayS0DfNAHz0tjq3sap7DsXl/A/J412tj8kD3bSw+Vm4zBjHINkoEsJFQZ7I9cX7YzSxcW8iWYYNv37LI1BAEQTsI7JTI8oVDdSCbDxYLZt4o5faTxcpR6MI3k+/21P3WWLGnqMuoRBQThliQh0uFu2FOsBqaylFcTEUuQFAnMOdZ+e57DAVcgANUXwhjHVVkhvicMJIwMOjDNpL6W2xndnMHyRH84vmFrNrf3kUS/vlcn9JA0aHamcP4DXkrxe2EQ6T/CUmTdH1rEMeVObr0bErCkxoKsOL55/Wo1H6b0yYZG7A6C2jMngwHh9CKMCCIjDXDGNM6TCxFXf5f7sqQgAAHfOyM5aE6glHQOGlBjQ095q3p42Kz7lbI993emrEP5rpAQ6oepzIUP0eJGWesB5KgRhTFIjeA2ykq+luboI1G4xsg5yfIyF2y3j9agT6/+UnJnranwIz0zfZogA0tpTNExZhEd+ct6fp/BKMNwTYdX0xrSn7hNdbOzc2REyajm37mIhyzDg3C9VePkOvdCQSyziEh9aI/2akF09aiiYgGaodM62TUpoRBteHyXlig/cOU6p7TuyUjXygIqWE741mGCJUIu6ADuAdSx4D96gTQCLQ8GMfxz1YO9NkinMbQeIto67rYosxRnfO6HDK3SYqDb8HshGdqREDHkcAQaAQK61pHTICwblJQQJksHgBHucf+wOY7gO1mRscBaLv9oxMDW+2nCxecdYsK9V9lpJ7CSw/jZciQMgtcjRsbGOnABZmUx2CIaXdWSQen4BKs+77g6Jf8IVNZRACK4t7iWh7iSuCgZIiflQoiXUMNdwAZhHqwQMlGnp7PYkhrPXmEQD3SWLfBy+wfz7p2JEc6WhDF/oFiH0iScGIpFtNAqU/u2jQItBHADTCyLnFkVsYujiV+C0bvjdoyQwshKRITcA6OLiTjhJnYoE2RmCaCwEdYbbDzzf0R5gs+2IELD8w3g5n8/+ebMGzD+IYATzjFqrJxbQDH6eB1Km09JQ/zUJo4tGotGwMVioZnKSC2NihWpbYop2yaIRIrXbBAuPdAWz+BKEfEkwLPmBe77j2ourc8JKYGrRA6jHuwM9QskU1RZsiopEhzFogUEp39q8hWN0hQayn1KY34ciiuG2XIbRQk31USJrw7r022IYTUoEmud2fEzbMVZ4D9DB5AzcA20Lb9PCjgjcmaJiarPfD74TNWYwt+H8M4dEEHxrM0ZihBxJMCWcq0E3u1mBZNGlMXtvL9m2aXDBQRqXqcZTtFW8yXP/hn2MRJ36rErjQ2ApYTE4S1zqZILXTaTCakl7uvzZcr0Wso6qDbR+LMAYVYBGWOz83JIELJeh0kmiTCg5C20Hg1B3aWFONEm6tEkfMkCmWY3LpbKc5lcgcqlFzvXDQgW2vHMjgFFkvC21AVg+EcGLQFwlequ0i5hts8uxfiM5W8OMTTfIELXhEdqTCtLOrnAKsbwXqYSp4fgmHnbmfF24pdri9VtoBKCZ18x3kll+utJS83OrzliQL2mskjdnQzYIpvABEUThQKmoTxqf53BJz7Ngpqw/721EwA+/MIrS/AhASqXrA0vhMfg7Cwft98TSarcacDUt807qxywySMLC2psiOSxRK5Urr/ECTaf0dlP1qk8oBR8TIeHeAwCyxdiCdxmiZhBRaEi7xDOO/KdxvYfnU2ESWjJwME8kvtY1ai3+vFSuLrCySAyCS+UOwE47aHCFhU7iJzD2dYitfc3QQFv1ld3/rIXvHtTQSsBJvUU4xM03rUJHOeI7RMixQqZP398jwlUC9RDCOVn0s6kpYtVfNLht3mLhnhoF48qxT+VY9Gxk4eJq++0ouys4ydbNdxoEwcabtfIbKkVPT3Vv1471TunnN3saoxzCCpfNPze545BaPGEpR7IVFqa4o9Q/nb1cAh7yENPoHKVydiEAT4gz+DVrOMCL1pPrtfHC+foAf38METgjj5ISZvmo/u/zcrNJ+SmH1u/nax9Gp2JObTzLvKHcUtoiUmamdquXo8LyE2SQqD2jbapD/NVFUid3Vm0fHX/Ad/KpnbIqper8WaV1Xe4jMZ6HdQRai7LQfGp3nhAkeNt70voiDGkVY12eKo6pp0UWtbbGei48LNy5RoHv1/kVKM2+NccwcoiNZ8+1HHfLuuI/kg/lAH9EWlco3w1xt+F964KiRp/HduyoC96UuTNgiIPvnrx+KBYE6CD0Ju1FgKrUcJsHeLtySWsL/IE5+vOscOTmZVwKXZndb9c62ktnpEYpHVpOPRW1os6q7dhHvBl70y3LqKP9HqOBOnYDn2ti5D/erBfa/6+K4htbpceH42fF9W+I75U09ilbMhKF5Kq3x0wEWED+Ubv7j5Md0py2tChJqHhaugu6vyxAQTYif82VI81d4vkxT8zutc8LIeJ4UpJmp9KWhjYiJ86kLrUUBJTtSiWQYfCH0KdNROkH9I05XAR4mTB8Zd61d6H0GKxmbzH0Swm/am+Xv1pUH78y/7ASM+Epmm+TPWCx+FdSpVqUlfUk0j8FLPMKOdMP1LnUvDag/jE58WQ9v3CNFEK+x/SbuCd85/YHBf+gJpIBAToeMoGF0YZWEFkwEopqZrnvJ2n+7r+v+2+Di+QqVUqgkYTyqjtQdpLpB9WUwN21OMSAM5rl23lrhjAdOsl1ouYKBWUNUWpq4N7hKGf7y+Ec1wiV/GkKBqxyZg81BXkWWUORXvevd34cx/P+P1njwDq8dP+3xNYId07NLvGIzb92ZSBMWxDnBISuK/pOM6COynwg67TdHcPZaNz7ticNui2W7RLehWZvnYy3FrxuBhF5cLPtyEcG3a4O8uGsLOuPDBaPDvGnbKWfcb+3Stqn1fqLiZmkjru/GNCyzVe+lu6f6+hXQtFqxcTm+hKPJFTf0fDSdGodjQAfWI69e/zE9PUeEYpg4dRHGqrOpO0BBeT2cbxMHHcJTrMTKwx96a4qSa/5i+8j4oQneXdBkn8iTSzZHG19LNWh8tNl1C2gKt9S6ILR4paYxoW8DhP5/kkhE1gaoZWHh+LdB5t7MYbAnAsf6R/kER5dMS6ellGtmQtAUU8fy+01F1cTC63D/udkOkjP/DP4E+ciuwOtqC3Aa2Ru78vG+kc8yf8Hf/8EGdUhD9z7dQc0I2RPKgxKMsoV7YJLnxmBPPiIjKVyuI6djOFtLwnWmhz01+3099oZSSBxzbf+uk0rkZUJLrBjyoa6Nei9ea4nFe3D7DzUUU87W12WFklYwSfanV5frihQqP6XFpDA9OJ5L/cIjpZcSnNXxpWEAzrn5H2ZnZP+yviw2po5Kz6XgGJ6DqdrX9DUNNBTDk+PLWtM2MIv/bj2VkQnkW6QQ9PS5Lhw7xvJGs6IlextNgrWshTxPrflbclahfr3790x7K9xvBdTGqsShtQU698Nz+19+535RCj8K/lxF1f3lH0rWNE8s84/cc16Tdz2ZgaN3xln/XcDSWYyzgjnwQKhOhLWubsXg9Gvkdh4pBhcXMeIM/qy0U4grqGluwoCWLjZ74PElI36IXpHEFyF6wWvvQEpiztzQpchv3uqTGBTFmmoQmBsIVZfTDjcwPqlm3IDvdrNaPH0Us9zst5GgOjROSm9AikbXiA0mqc8wR2ceCpF+wptE1PXnwL0D5ZQ5AdNbepA1IZerHp2/dlRZ4oq9f2rOmd2brzQ83TqobGTy9VS71eRdJbXOcj+DQhuI9IlgvW/bVRGfTxhT6PujXI21Cyj8u9vo47D4LwsfxWgFnOkeLQyHGbf3v47sbA2w3zFLNQvG3GF7kERiSKsgXY3WIoDFV14G1mdRpea4CSm6DkEJTPdEQPnofMmHpzXC304AO2ca2x8KEONhhNa7Rwhc4OZMFNhC7MQJ5Qbp0x0rxJSg5MIcnodXQdoUd7A/QS7x72ycsaNZJ2aLBxb7vvy35j0qPjm/pe+1osBVNwZFkaPpgELRhX6t4mc8NRLDc+WbcGm45GB5Odn8AoMXZpuI1fxztknLYV+Vj4Ng6mEADwbdKy2ykU4RgdsDg3Rj96Q6HHzPLMI7E1sVV6fyI7AAK6/FHAJcBHi1QkCJuibfmpthkt/PXdSJfTqia0rGWXuOD2P2Lc7qdT39n5e7awgo6m7YVEhei6tTWcfkEB2Lsjgjtsgqn9jFhxGI6co0NOW3RnkQ97qqECyWQ+P9svcLqMGpNVihs9+yNO482Lv/nG0ibjBkbw3BOA7/GHnD07cB4WrG7AsSPZSjkFszUV2IYOviz5VSe6v1AZYj9XLX2ZkSBtLD1xjWwYmBk4zDXpQXBiFTrF4RrSQ8p5276VizmMF509xKVpuUzQi2nhFCK2wUlWj3Du+A7qYZ0oIfWbWCmkHRthcZ7JNkE/kD04xYx89O1vjpVOjdjm8f9mPq+fL36ufUZMlhnC376z8nvgWJz1m0qE2hoy1dzW/E1kMuDXo6IMxzHp8s5HbPJa5XwhT+5bKyrYOPZvkujzngX20fnpnwDSu3aUgOsgYEXIGDqzUSGBgfin5VDbRXH9OJ8Ol+KHkiqpg3gmZauv8LXmGy3YE48f++o01+4JQJoncPZcN+uJFctHYipbLaym22XTB7UJdXr+xUmzP3S9UWQBJyYUhDf/ej+IQU1suQI8smUpLjQZUn0X9PQX03tfCgStx+/hgWZ/UuRiAmuKIDTg3yND6dYVN/T4qR3vcUInDFOSJq+sOrzZtrQPGa1nXENo1Ab8hAOoVjHNWJiThkhAu7oa9dztzN2TAWdwRSRbRB8KZYc42VpBbXQnRgciruCAPADWNo15O7XRKui11XLq2+rwCB4kzHV9bW+fC4u0TvvbKyP8c/6RZ7pKDvOj7Rk3DTiPXc3MJTSIKixPv7Eq6g8OnyJjAY8uRB/SlPYMJyDGJZYMfmoUMR93ov9mc95aeaQnoTZHp7eYBM7M55pNECE6vNp+N7pOYDs656supWBK9Bi+10Ty6CjTeMEakWhn9NulNehqAMI64mg/QTMcoLUJmV7Fp7x+QOJlf3SjUf4WPPae+fe43QB46f3C9gvV7AnG954CRd5GaaSh9fuCoIFW56mXINwNR6gTcJTOGd692gX+hpaYvVkKEZ6lP3M2GRu54l51AIjrwuZKJCE8zAPqNTrWEcXxv8ycGS9geyTOdpl/3BoeLkmrtcOZuLqHju2aY6ZeWUQo9VaH7oIhS25jGILCFz3uv7X0HTnHS6XtHNk89trAI1zAruV+WIXHMc6bGNZgI4DdZ/TwLY2eCB39lNzlY3cJnTIZBDkZQW63lYQIfEkLXJSTK0SU22FFRoo4cx9SSl93heU9ET8dt0d9G6GTiGs2L3tVElL+Kjq8Rd0LacCeFtLd9H/AbVDB7lExoC6bpSWYszafbuGflRqATo3wUbd6YqjVteDUw5Rx61E5Jgj5OWK/X3n/EeaWlVUYl8XMsVHoVl3mHE7BWn7qODRHDssFud31qgFFPkClOThrmkHKnwhgqUD304JMg6Fm6aIpYauJOns7EO8eWqHWFU6xYWHUlL0ugijD7whcNBfJpESEVv3N70m82k6f7YeKn1zdBZOnv8i6IBfu10P7aAwLm9d41jSGcO4yyhWQ/fRj8CEhKiv6wdYckm96/NAtOy5kGLo39/HHgUaECXkhHE8TWVeVbp6uAZzdoVLJh8zSULjLq/bBnfFjD3ULMp7BiTqZkvEuXpVdesyoz48OmhykbjWJMsPWT/YV3kV9cpjoZKV9W6kEPRUGFkeyVrbInhJ8vmCAPN7kMl+bLIl5JZqZlQtXIByOtppnJjfT2rWWkJkeTG8U+HS5O7tzgoD2fH2hMhI2zc3MrjqWrxcu5nmtQq4tCOwDGOq6hLUxcb0PBUUsLDOW9VrMlKa6Bv/BQiVxeVkUXcC2zGWSczQoENUZWcWKq/LKFWh9kxgTtjBmVA0aRZva2fy9dTqErxbrFpn53XMDbZr3AZ1XPWyLf7TpRUEEb7dtUguyxojJleLK3szonAd/cDeW0vfz/S0jBmaeYUu9oQrMxhUTqfrBe9Vrc1Yt/5p3HTFtNUvQ9GWBGZYtouByZTnvt/o3USgqBi3qdSs1FJG93D21B2tw4SHSbXEEO7Vj8erlmDFQguZGFOkAH2TXrBbTpHFlZVExzCyvOECWTSSKA6hSEGUewgdrB/41MwQapKantwgy1M+yVSQXWG+Gsjrxqjf/f5pRty8OPT8QYxhhTaUEw8VbYY2aSFCXEcdJvdkTRDxoTnzUVg6tQTmWm7nshRKrvg18ElQ55y7hmC7K1l/JAc8i7WHyguZVNbjlbzOHfgtMKb1D0mzddFTL+C8cQ+ao38XmHVjMCI0v1oL8AO4JY48ycMr7FqjBSZ3JLgyF0O/mOWf9guJZKXCGuoS8fKCOMPi3Ml1oKL4MtrR4FsjvN2zN6GCtM6HRzQ93h42gQWwocrlcMqstyGsoEBRiQ07GoVBaq28nBg2WpeMLFunBnsNm9xDIeVihdB8clxkOGiyiansFj97i4c19um4umE3SQ6hGfD7a9b9RVWDUOISMhIY2WMpWi6iIukBTY/Ep5thVxTNx9uZu037Lv1f7UYcdkQkPIzQAC3xRTPkSLp7v4eZrT+/6S2Wt7H2hFErvXs69tebEcflQYCLKKPk6NEr6q2+d8fdulE7ulW836zNk+Jb8vaXBZeK8jitjVYQ6J5qdJ1PX1wJbyMrSh/WZSVxKfGoaWGvrRJUnANSP7V0YjYpRoyFtWuL5/fphqJTBJLWIYIRgzXhThOvKy2ZAV++PZNHi/betb5Vgg7tQmAqTpGAHX1UUAlh/3ENXa3ImA+UJDlBwt+eL0AdcMIiRBz0LQm0U9qKJHWpo5NvkHMAc8kHqEcx2M715sYi3g0EBdaXTgiAAtcBzfqgd5MNrB0ulDUlpSHafrQLx4m1JfnH6MOxQKuoix4pmLjycl4nHQrt6dZAkgEraJc4D7NxPt040TcmOh1BDDCk02COSuzOUZhnRXJcxoaRtc49vSQY90mbzgFwUi7S9f5PR8oJb8K2oaPe64/xgHv5SBk/bI5frgvluNi/7+eFFuqlOej4DqI1usTk8jmWqNs7TIzKiex0zp3Wn/WkzojkkV3iE3mx0VRnePWzre+CHT5bGuV7HbiY24P0fAj5m0v/GcWAzcaQuAC1x0BtstcKfppMtVtQpwk4lyazsdtw01g5bnJNmhPIpd+gtDQyY5ULadSn4lioGSuBgd0MsQZqEicQe1qtnqJGDqiZK9beDLnKPgRFFzViqafJfJ0KQjyburfAsgFKt3wYN4u337JEdDOYNrdvsSDPC68nErgxgAWcwVe304iY3/rXniyNT7lzNcARmKPv6fJOQdf3zD2AK7ykHjZ3lHWip+sgLRyAtrXnaoiJmPXSfDib9i7Symi7E6rprI6H5YeQCVR1tZux5youfVH6/ImwuklPPKkWWO+RAgi71WUd5aIeeBftdwIDNl4ltydzRJqtNh0sLh0IWb2NieHzYEBiXjNqbbQrbIy8iFKsKolqRqYPHn5TxQcs0xHis4UmllssWLr7QmC2WsVFDzmsAGFnL+cclCPbCSQEiPzfORF/mNdJ0oK+uRkMNHRdtbIPXL0wi3bYMRZyFRsDBCOPUy4V1tkH+wY/Cc424ZVGQpeZkGaSNO6FyH5hWvdnlwTzhVCYQ0rN5rMnKESe3tq787RtqTsFIR/NFaCNQ5QGneVN2zMnFjZ7iBx6zW6BhbsuVsvMrWpFMAZ5E556BRGzZ7iEWYmFz+5pRgLhzr7vt8mydjjs3yJUVR+cx//woDbO6/tRW1EvRasxrv4uDrZfn4/1JZVX7N4u37W+ZFNyECkYN427nx12+SSgGLzbUs/VUHEy87emuF/NoRYzM66azvG2kuql9rN6M5xMkwyIKRm8o0GpUBZMK6yyVXmaFyVIBSHy8YSywoKzMEILeZ3p4GeSMl8AJfF6vMbOBeokS9ypoDRSdiaUutI6HOYUU1Li50GOEovFZxiHG0uxDmjRXLip0/YqBiiJhxgZSJj2kyPOLjZkHVJ7VA6CqA8Oh+MpAk7Ubw+Ui6Eg4O1zkpCr71fZQEifFRzSaIXJF/qTDsut2sMHX4gnXn2tCW9K3smEBLKn5GzGhWE1PHU8EPWWoqhUxQGC6G82RckNl9yGlMAsTOahtM6BMqVlvaYjvOkqOdbEh+uSdfCPZ71PFkafMsXj9agn0J0RRsirwai1EgJ+E7Lc2qStusNMUNDYULHFDrV0tb8QwOlQcTh7J7WqIWy4RpMsQmmJASet1b3WRI3YyIPCYJNRMz21kaHnZKUP78N+JEJWMUVvzDnRu5POlYo/vpKFNlBClhh9X0TGdXzTLW1lTilADwh2pWb4mDA4PtSDmmVwOgCTRzHqzYOizjmCe+DtqmUCXoPG72no09mI64oLXPs0N2sGwv/mozbVe6kSNwVBn3rRH1b66FaGNSEx1E4C8Tpl4b5bLBu43hiZKXStvC4L1QSyeUSuHhITrg02GdxaoOtjCQvxFApZeLY81qDz4HVazE1V3TXyTugJNo2smpftr5JkMWeMd/ktrRnIoMl2TIhK3scgxjjzTFi73lgbmg4dwtavJ5JDwt73ZuacqBo7MAQ8BPSCvH7RneCUDJoRy4e/x90M4T8DwdKFDNvkANQZFqAOtxVsRdiqkWeF/XlNIgi+StBxaIIvrQjjkJp8rthY+wCqWFq7XLhRmhzmOoLpn3OcwwZ3Uy0rmY+wcRXzlPU3xa1iTTTEfYaXtHTr3MJ/uuKf6A9IxDHdS7mkFOME2f7TdEtYnmmq6BtnoD8rX0kS2SVEvrhJTNNzshwmzw2tXNqurdDOa1/BTvtjoe0uyDLvL6D79B9X+j/YlWCOgqYprfU/UDTexVhpfDPNBgSdhZgj03ACP8YeoCerF/487EKKPezc7cSAUaipVYk9iDX296ceRwpZqXIhbRJkaqNMUZ+8o40il5m1a+5JxxCkEtOCBn7Va4h6vYa2movddA7rzTOK3ei0Zm4W+hHmKYF5fPPvWPNNtQR/RzKbrhl0tsqSC7e2/eis9qTUNpeN8g5UzL07YoZl8i3pFFzdsAHHUwtvKknl0pTxX5XZvBUZbFFjOKnS7rTl0FoQhos6xjBw7IWGY1b5BT94cHS9iJepy4uJ93jSL1Fzwvp1Iyd1lutEsSV/URz0y4j51tcwUAnpR2IYri7OSaXAPJ7ZubpBYOpcjsil9N7nfEIcAGhvBHbCGU4Ny1OJ6zFoMau7t1GoRxfAtYx7poaZXbR1B0dXPMAnqvNOnt+NzFpv9neLmLD6ba2/1C/zWU5fgDxxOs4KyYTm/b8A9OC+OKoRNOo2rZMZVbtEIzYIalyCjtOU41RL5983HuO4Mfg2U35qLU/mIo5uN6FIAhVh7ww7IggWfS70wgZXAmcdK3YN98Xt3K0MokD+II6nrKhrUYlwtv61ftXnovqEKUoEF+bT06MRDN8yB/1kBu55oKdkrIcks4qXWPpiMI6knb93RQrF4u+K6VfRV/FEg6PQ10izCKJ9nkT0KlD1Mkt1KE8vwFY6/JqbJKgnoSsQiL1vp7QvAMDHmb7PPOFwm8KvfT8qcV7bWnXss8smMXnZXZFaGzK8owFdDpXjGnz03ekdMSxyC0hY2m8tLphS6nIOrNN39uuzH2p/ykuSufGHQg9h9v3K2iGIitjvp/2PqLEqivS++5Ji5Ke/unWn7+VbenOqNyVdvDFPI/r0UnkVqgS1was5a+j2dSLi7C1KFpJMj+wU/8ELkpuvUJeIOl19Ep/+AFwAyPOE3WqmVCn4ikeLajgjKFrqHJ8h22xb47C+1rqKi/24sFncErVG4nS5M9YVnJ0t82fFmcBXExAXfnoqxDi5h/muCrG6EjxYIavvp8o2uPD5qgs3w2tF5xpw0XMHSxcCuQCYoEDLAKCSH6xsIskSLWdkMquSToL9UFsBLtjqVQpzkdK6tsefA1DvhYK7i0WlViHjU1l9RnKM/+OqVvBv7NedCZAUqsLdMriWSj7GkZXdu1oQlQJMvH+D8AhJ3D6QGSWXDpiQqpH6nTf0yA2uxYiCUNHsfDfNjVvUBcjsh/NdRH0SAyh01P5QjZZ76y/pxBPT2kUVDnzdSKsYj0GJcSW7uU3UnMTP0fiBPwvfJUcYGOXbxGFBjGk5E9rj+SGU1N21fw5pkk0b+7D2iMB7Kc5Ij9gBHM1Ymw9Eh6eQXcWxke+rwg5wId/NB68KKN7XHKrMykogMHvXyytYNybgTMPt02iyhfd6xm6vPP/r89SjWS0+3Ogg8YJ8mjb6bqpX+PAmwE6Y3LGp2dBAYSMKxf4WOTA4789KnQT6royDDp5daHnyIIpVFHy6IEslgUTKoPTiLvc6uCv0Jo/LW6H4wEXJvfkonosBGxVusNzbZ0aFEb67b0oyiqCJias2FBpYkWUKAZ/pnmawDf0H76zUIgJmEkiN6+T3ELwDeDYEVIii6H9bKGxptCCcQINdFlpe3U4d1GwzNKxBegGoBFM0dlm6w8gkDi9VppxT6rA0L9jrZG2HAplYlxtBsYIxiRA7YYtQ8ADGrpDLi8gEVgUBbv0btjcB76nNgAHqlgOmr7xQgELKD/nGh1ab8WNwcCBNCrCtiyeWxQkWtkaDGzcJWbta4LFnrLHvEkE3CH119OQrwMc+r95q8Oa1lOdS/ba+P1gIJEsAn+cSxcAtrQFBRPJEFYkot0KimsdeWjAL8DppVX997Gi9S0GbH5TmoQ1hxxzqZFAyVozZAEqtHb71jdn82PAIrJ08fowfemxej/IoJEmCAUHG6EREyiGHkQK+Bq+g7oqiIBC2FvsZlAuPINv4eAu8HOmqq7cNj2le9zQIMVWgwrIFYDsuBw8ln21Xx/Ha2O1vAMB/OXLseX+hMxkEkTDvn2HIqAKDWVO6orI4RbabqXyT2MoymHjaHgRla8HCAJBc5lufvnqjhJQW6ttfIWkAv4bA/eR8uhoJiGiTkhmk0wDpGC8F4qim08nTizSjmVdogGCTTLmT02LuYRDTcYq01KvdTXbKILBC7EfiEH7s5J3Xo6noOKW9gUmMI/v3aaZlAAPCmnP+maco+L0SSp1vNTPee6iP1K8DWcRFxjsNpiNobZR7/w5dUfn5ktR7WaSMjQ3a3p9No4tUnCxuaB1zJAqsSxZabbFqnvZspiAt+z7rOp4nixzHKgLKcHXjnWEEGCggkKzzNOmZbXea6jZSolRqZh8GY8M0HTNLPETyxQUL/phxNAnrt7IuFu+wIVpF6bDkX7EN1olFxf0I7muqRUNxByAx1YlL+lwd7AgogG6qyhSBiCLEFVWC03egEJRWhm8rhRHrKqfQ/B4Sv+d3+XxCPI/83X0BJ3DKhxNkV48p2pKA8ltag/x/dd1sQWpFYhNEbjU2U6kOICPZAhz1ISKZULBkgG3RfOOBVzzsUWsOhEg/iOrVK2/KYu7LDsTr+4AF9BckhTGlOc8/xfpiSyTesBojMy8odz+03h1gNswp6rtta75lY9p0S3UB0orpVNDopR8oTLJl8hRAK2ZLrYQKgAmmbvsrQchq2ZvhzdEDRQ4yZSFwTPAsZ8Q/z6r9UKr2Khv8pkUuOSoxFYEyU610YIv7OwdG/IV524k2g8GUtY+WaeT2qBcUvediMSOuYT1GpvDUFcKL3PRmc/dZsc0PxGXI9mFbGMm3gjht4FEdCgFfvksgpFRiono8/jytqiuBQS00lqruTQZ1quPP9yd14T6CcpCVx9GxXoegqu6hLYdIdDyMQVMvJhpgtpHgSSmK/LFw35fKHN0M52aDAmfKW8LjhXPaw0xiH+zX91tTkGHvy/XG7Bk7tMdwJdWGYVODtX9hFHjG7qqDwm3vbe+YoHjwuwoTPWDDhDHkRkTfZsMqjfAJtCCuSOmRylipd+Y2tI5EpoplO/E9tsAYqMuTMdfAxulNKXJ3k+O9GCqLIWqMWBuJwXHGddWIkP09W7CgZluLJMghMASvVFhLWJZyFptZl+j7UeieY9tWsBRqrfs2DIgCogHgSixKX4n5pZG6P0JLfANQUcx6AQRQJtH3jmkBByIr1Glk656nRmo3ElUxYeo6aCKksyzOEXC0m67TxoTbwA3nzrzuUXt5lIlyae/RktvDiUA2w+I/iNqcqV76NCsbnlE+uEPtbg/E05rMPka7WFCDCcO66RH/g5nDlKD2sIHE6gak3qLFD2aKqIGqFNRgQIGY8GNPfz4kijzn7YV40gq0h2dARTvDxo/86Tm7ECnE4puM5filRT/EprX8Nv7ZwYlRGwpDTKZp8ibfjIYpJteQ56pIJt2Mu+UvN73B+MhpaRWb2qQQm2qWomRZ3g1aXQdB4DyveVCa7pKkx+7gZ5t7s/fBLTHdb2iRQUqyUtB6eyeJNqEaeI7QE3xjZ7+4sPU7wr5XZ+m+86SorObiDnPw208c626f57+cvxTIMFsIIKe34xjmawjTHqbafFPhWAEs8PlESKDW2HxRaYHt3e11dawvI9S73lSbV7z3IyvfG+SQvMw/+dDYZiQKnPjUOINtxvbpGoT8OGSTO6JhdwCCNJd479lwWOR0TX1CQ4lNzrE8bh60pGl4135T72Ome40AEfUwQtLyz8DCAuOafDG6ea2HMvz3V91wPnW1b3ll08tSYAdWPuS/y+9nC4qKsCj5Y9GuBHlHHvuZn0uPDTPDu+DJT1pqHvVwYsDuvNuEAj7wz1oOZSv56NR6msS2LqUwjH2ncOGODEB8cCwyAlw7QYNshzW4K5zFZd1kPEAATSYIbRHQrpcO1hEW6wSIPcI2uolIezHWvd83pRN1zndjzPjQTkcl3G2vp4K97nnpUhl7Fy3X0k1nsANwnOZSwEqW636OnZXfzU1bYd+bYeOKN4633pmSBCUq4OLWw3FxZDdzDvtPI4BySLACUd27Y9rdFtdvgDITP4yIO+YVRiev29o9n4gR3gu1ar3yLGW0Sax2mrG+9EDL49Sb5QJESquRIMeC6MoKaoO9khvFelE/32y9wEck1Fo+J8Om/T7OgchzAuWHbatGIE1UJmkaOyX25/BAlm2/6H7vixABSmD07C8SIN3T2eKa6LgVRMLVPBeCpDfIITA51v0dp08lerDHUnAzhgQENdecGyxKAgxIKSrujE50OMP1RzbAMfI6KU/hkYlcrGX+gQXkWiP4Xl53DpTf8hq50cq52xbWlp24vbcQ+pRo6AW5GaV4fR5g2fON7jNtgkV/qOEQnJLhVsGYwQzZIQfhvYAvjiRyK2JRLDNC/bnMQIhOPCMUUym25prvXBwHxUYZQRWSpHgSd7HETUI7BWupn2IMzCIWCL1dfLyQ2+4FxJoHFCfZISBXko61pmHC80zEjWOBtjFd8BRjrGugE3Eo2TGccfqcp8q2nV2MnrNW4TJbxpSPtDoCCplEo9ySsW+8MgcO8zTUlPa3KzFtxiTR7ohJhG4oTyUxspkNTw2zW2bipVKQdQjsmDiC5tOkGSBz9QJL8v1EybiBr2zEuoC2JMRssMljrDk511BmhY6khjT+g6+Z39ySR8SLNlArlvIIQ4p7d1irOC76deOLKqYgZ3GkQFYAEwuLSj0HSfenZd/L579BP1YufKYMpOEhB2XW+6S9hzjS2sKEZpynTatoW5FgnDyLIBfV2VfYoSYEIPM6gIs+eTF2UlvtQ0tl/dSEaphwo3mFyhBfPrtx6fHPi2l24br805R/WHwjMDfa1KAWujIr+uTTzpBYi2HEdt+Z9Hl9MYgjy73/0n3Xv5gumY304NiP1UiSjqdfQvSOe7LV46j9+fncHD4suUKIJxPvv0ja6v2aKuptyTds9jcHmT7SYysuZ+IYop+TsMKy86DESqkM8HxBHTAJRG2k/tCyCDrele3rMMVQrMKwj59oG7un/RWeArANVxN/wx7CGwqHj0sSXNSH3xbLGBF2sZD/xH3jqyrtf00mCjO/i8zkZkSx1pHFDxupBfkdBvPWkWBgCvv3XAePiwPtMtL0BByNrK3ViheVze6/io0RRWVWyYqzLcPAbdRIM2Odgmjuy8VdppPHtPtEpqDmQbSceShZjTyARgFrJeT3fbyh7bF4ddpcGBl9savCS/MNMrG4topmWv/3QlyyvywVcO+pJ1k+G7NCqVjblK6w43BRBbRYnQ1GulLe3A9Nbb6Euht86KBdhqmpvqADGuHtNjaHrG1FT5RhDTWmekUnhGnL7vvz/VuRlqboysEOmzqd3ki7rEi8gri/mWTqgd02DBrjexrdv0/eq56WfRiW+sq+mmBjBOZCcM4NP9bDjS5gkPKR6a28qoea8HYhNDJfqWKLc3fx6JC33pDUFRK8WP0aEZba/k4WctryDCWzdapwGejBXJUN8+btDhoU28gCzaMClnsN0yjRG8+Ye9SbIjbppETcdqxbibktliYu9CaXnEQrgcKm13TDhbI+n/pOg/VEYWjkaSj0q7UiWwjFCsb05130O5Co5w6MImJ9e2l2ukFCC2cUZ+pOJUhGxPmpaOABu+hmwEq4NJBg0HQGEb32hOi72VrzQ94vaVrOfmFzZGygTcEzv5sfBKs7K4NKKyiAcwQ30TGvXGosvah+ICa7TSS8bXxELbGBfpXbSPJywfjLzrccg38xfAfF6pKQBJFAfAIzRbBdxj0eq0CpFtCwxLpmSY6uPwqwi9IIMYwBDfjfUWbLVBilYPEg/mL6djJ1l4aguDz42UjgzhGvBnhoWDGvHCKbQVwYSWsH2mSazoDt4VLoVWHpDChGD4Tf30BTnBTQNferAO+ZhzfHaT6R9ahaog22CZXblfLE0FzoO1NqZJK/pOLth5yEeS9AR+U5dz/MUyZwvaAtPquEeMdWlT7HIsfMMVSSaT3XvKxP+EMx/KGlPjiBVqoF1CyYB3FbCZd6gI8p9BGHewFGovd1rPyMnZrmKQtZVdV141/MMeeKq9uU4Cs8Zyc7/9OBmdX4jVyxyoPWO5xMZLX1ZGImB8uLBRfx4Gxy2IqLeFxj+uSy1vcOT37kwuFnSaKBAXExgoV6r55aIC1ujOZHxiA4y36TN95ydaXWM3qeGrxLrFioF8hDClYmxMAZQuwjemL5zkTlfNJtHtV2GMEqnMYm1actepyqdx57OF2k9U7QmowzwoDj0VtWsLo6AhJ1jhlSRj8VO2a7i2s2MQUACdvRldIwSUZrfM6LQPaAxgYEixEHhvcoM1U0UoNJ2QE9sug40O4zWxY1ab+gyOqiD3r4xzEInPTLQMTz1M9d0GYtp38OD8HUkBgI5t4ozsNygToPzRRDe7oj0KpB0aLz7TeRDtsLUW3Qlu6bOcVbm16HUNDyxaTZDwNU46Mxb2h/aVfITsZu9pFmc1ueR2VIUJ0y3ANR5unaWJHnfYwLqSoXzq8lL8adqKDddglztPR9Q5JhRbHPdY3mSpiXq95DFvI8nIDZOq3BHPzHWLD7XJMXMqa3lVmdYCkFrIF1WbmnW+jPtw8p1puTl7Y590ey8IntRGrBcAGknuZQy/kCPdpmhU3fJ+uX95b+lLfUb06bMZUrbtIJx4dtYAfYhhvWvCjxtAwJtlXmuzYaV69++77fRMrT9dfvTO5utCHk9iod1eZ76MOwJrGES2KazlgNIsZDs29EKgL09q779xD4wgxYhkVr7NLQs2y0PSzH4I9R8bPut3AzoGCcIrShgnMdgnAsvzYQbs3f5sultRqU53MCm8vCXG6ZVEaIg75WG8rhtvIehtXDB0QAkPQZckEX6Thgq6nNRSw21R6nQCCWy4h1WUjKzwnppYcbChcdJva58ec7mCWiAO6HnEmPjUmYDrt2dDsWll9dUi1TyHi5Zpymcx/e9nOhvQ5OLobeH+fTl56y1ZIRCkPpEQL5impXVbx5Ykjg3ZTF6ItkKF9y+d9AcN5G8o2cLJBbUY9Nff1NRZvX4dvIB5RgLg71aRIeEgoapcKIh+8pDvDTDjnS04KLFAehRblnBeHdGrqd1wvpdSWz5qTn2ERdjTO40PI92ppP2ME0uHvBN0GJIseVYPyDtXUQqcSma5h6bjwak7nSCGs9A7fm3zQN9eQ51rfGak4ZPk3NTLaQgt5YQFMfyxuieSpL0aFA3ifuACUxdf2wFpwbYuCVfNRclTbSXojOAhqBg7i+FiWhki91OcP9+6uhsjiqIu8/yRJxQso72gpB9sqf58GEk8X1vn9ZOmSRND06GOM+SH+bAV102HH1Gk0eD57AEXYTMAI7yqzmYzcpPAjhpyAKfj/G3PrAX5idkx7+zeK5sMYsZr8w2eC/wMzm8gtRD2X7C/PIMnyHbsx/AX7S4776ZDMDbYm7cdTdji6FLk1oTwSzot1Pz0TMdILbv2FqbLgXoh/T3Q9YbWzwQumJiDOXu9EVzrtnt7Jv0y3cwYn7cuqutp7Gl24E27t2gBvnV9/3+Sb/bAL0WeVW/FQa1icjQSv9dJY9ccTJRb+pZJs2Aq9HwXt3XTQ4EHh+cRGh1pLckjC3nZsIXhq9T0cS7e+GLmGuDWOrxFGNCLX88NeAtdvU4U9Ylv9Awt2m4BlzocnLcRlDluzM/otHQZ612E4VkwIbDusRzBjoi98JRqN6aqzmZClMKoW/TZhKSb+VCevSCqraKlwMtlXF5YgLP7IA03RDjBpce4sqvtBVqxTU26E5SHhYENXBL1c/h7ViQmOHpf0DSMS6pBLU21Ta0f8VMCVbFg+zZYwTjx7GnBMVkTBscOXb3jOwZkkkINtebgXwUldYxWT6bdkHGKPtY6gsk4wLkqkM31+yxslD4f4wWa+vocer1LOw5zNF9ihLVDdL9dOSu4T2cVMWOnr8mkGHgwDfALhgBw60a1cuhVkNMgl74NfwS6H4egkR1VwwklKZKjFDbCOvlnjiDlQInRSvycrj0A5tTIpRlhnXvZRWZSleT8+DzVnpsk4hvijl2qHwhGnC2fbRVdkl4V6w83BepqLUzmsaUcKRwj2fNNw3U3vBMgpKevFIOi3pxzC9Zf0SdqSLivDMF7ly36QHKOWRbCNrBCkStkWCxQXurxc/dnTBW/OUTBCqTU2lxJdLiMBIgXnBIog9rIsBzQ2SZ0Snm4vHpDieiTfKewTBheo3HTfoKA30txZ3EZ6UoktEHoyU9z7Ew4OnEKgzGnVXOMlyXvp9QBRsTbQZEvMxcpBjqrzDuJrzkvyzxwt1rrUBEhzvdcpy7etS29SKs7HwrVxAdNtAJeqbVXF4EF0rkVt/5sdnbMadd5daRynC75CthQti9kRHsOtxL0ZdVlcmPoqC+wLgOvVQE15LeG/FxNg4Fr6V60JLqn2q+KLeQrCzLtV5XVrR+A2tJrTXX6+lObAsg7JCHBZBmSbSY0nryqqMgZ0epLcAHH6BCIbHUJHdPWxpbsdE/LYGHGj+Da2in2CDAo9YEuH0+axeM67wDe8pYgLp2ESj6KzH3so7f1sY3FzfKmiBGPmYh+3Vt1v/QwIUjfXv0H58wxMdCcfxje/yckqx0y3og8faGRieBRk2lDJI8ix3e7IYbitWzcvYNL3WSf8TbaP2yowToj12ovNzZEMKJnZMeMsc6EH1Um3t5WeczREkSU0V+zYunaRktgTguJ2L8CGVHjdNxbmcqlaNebK4EoFJbj10WiwK66vPGYZ86J76VaLXAECVCB7pqyfUjCYNXcbGvb584wd/n1aekUEUtVYRlfSPvptQME6NF6F4OaV9vO3TVoKhZyxZFmjzDup+aAYFvSAEIU47EJGOhZjqL3aNvsvpcMHeFJvhiZGoB1Zch94VTnIEZnkH01ZlNq9AJBONAmYlbaR6NYtJlyQVQUXVjd8Wh2pVahgrmpXATTMxDIVoqMTcDJqb0PnigezmmTrnbFWnGSmRU6UNbUbkdDmhgcxiYdW90TgxeVWOWEZSfeiwMutNPYzRIWoY3r3Fx3YXhxmhxs0fKKAi2yb+JjpmPMgNQokqvGFIfUtVmWCRVgaXQ5SbosBawkAWFWdIyMIsZmPA2nqTMikF6GT6ZtQyKCf7FbtQVVYMtVBAtI5bQVuMRDKqy2b1kB6HIwyp6PdaCLzRLGOk3p4SWUysHmkKuGsaLq27bZMLV0890G6XeqEQF20Wq2ZYJYS5AW+LfR/pWn5MOTbIUyOldel1zKFR8Zu8UB158is+Sf0MP7kBBV0NIwPl4O51jyenOaiZW1dBbOrtYNVhOIcxtwKUZ1tZU2hCg3uqifqoGiTGndqxSd1UEvb5/K6z7AXqUpeXFOOfRwUU2XlYiBlRTMBepNwepliv4LmWg7uugR3KFHtWHNu6l8iQ3lCMPVTM08o3jC3XQd0tpMKrB7EXzLZ3Hiqp0o7axN33zMzi1j8pq38U0ceAKaXrVRVXOkI+lwZWJ8eq1YENwuf4Aw8XzgZIHswjdKPbFZaNL7RxYgCBuWrC/SLUWvHh+FLeBKElGLA3/23fDU3dml/8faLCZcMTsmhO3pUxAVjtoG6JoujUROTqVaXE20Zq+YN8phz2Bw+6b9HLCujaekvFqg5dc/2DmAMONBkTZZjXaGoXk9nuKrEfl+p61LJ1/pHjExdaNe0yHaoJLgvlVA/sVm1/q8dzKhKcWsSuGoCgGrr1aLg7frto3vUX8tEMDfdPUmZIWEd5mt/4W+n2uO7mYzWr2vpeKJmUc4o3IxwSB94rbMoNUNF5fIiYmF5QVFpTJUQOVuyS6HFa1YcZ4V4RmLpp2jHa2PoQEuzbJ8ljr50bylh6jh0a7vsaic6xbFBreZuU9aKvem5pW/DysOUM2/nq83z1IDFcoWWQjWzlp3DWTDP4t5ECDa7G6+UdgxzxMFctO5g2GbXvejLjcMpCguoTps082mhyJFsg1gQnm173J7AEyFqCw7eveeTmUyKH9Q+SpZMsnbQyklZGUiRLkSydjKWTsfQykV4m1D0K/mDwju2r/0F7TzADAzFCM+V1Y4vFdq2TFwtEJ8FRbkqG8E97vKRTucCqc04m0TeBp/E/ego8nCwEQ+5st+BZ6EYHDe9FtcArO/PrP5Nc0ukkmok+Hx+inzMTH+m44940PR9tN5z8pj5dh/bbnJhBzbMdBf0M8CCjKK7C2Ft6cqORIjtHEHiL4rKGsCOOXvhnSzr1NQXWawSp+k0QvgmYkUhMMo75SRSluw+XWWEvevPZ9FEflg4OKzMi7IPNgPBRmKsKG8iFHmGD2hKMgkAol3BR9xQhQd4UC4VYhXekE2+/84oEKG74gMpfllbV0Mn+jkpayxp1zVvjUvP6fcP3vchaTg+zZUQtv7HkKJAJaN4IxqrIU+WCGBegf+a79xvxKn2QFLqobkvdo4ftQnrJSfb0IVGNWr5Rg1Arzv02dU1k0PyN0sDuSf7eG7nVjf8PZhn9V64aOg3o/OUSMcAJEuAS+gMMmsB92C6kF5nGrychi1psrXOdhLAU5ip4GfEeHKgo0kDQrq9GydBiIdALWu8yv1M3B7lcz3KHnHQogUAoKb5g429Ek7RKJmub059O+28zBkAUnvG0YvzG2Pp9onBKcf3k8ykNFBx8S7DpiZUQSvMQqk/LQ8a1UxmUUAtDUZCacQccUP09oMMc/KC7YweUjMkE5Zwoze4SV7gPhdnrsPnb22mfJgqOn/HDY8WZ3qi6HYA0bUsxy3kNRZsb2oq5xqB7tXyxnm6pkg1mHzbAzVeVuec8cIWlN1ADsP1rc1K/CatOVgdh1kJ2J7SYVhLT6QbgDnLT0Hsa2HmgbX6DC8wK6nTy6/aGB+31+HDz03l5LhRQUNIJyPQSfdSIllpJPcEXiM11e+p41q0QkeX6w4Ys+tz5D6Q+P/q7jBFtreFgAkiznTW9WPuWGdrKscIjxB6JZGTzecd4g3MFN2iuHN899R8wlgk2ADpkaWPb9+KMITzRvztDUdlPEExcWDE3TcAF1wB3a6fb30bp1YVq5lEsYoka2GFU/dBnD9J8mpGqMrcSI7wA7LxKoPNOp/3+xvU1zmifsmgJi2SGW4luZle/gh8dNLVIoYktoLBpQtDHU5bLi6UpCS6ky5fIy5g6GhzvKYyTYX+ZVE5MCQPo5FJ9J1Bk0hIzSi+uFwqci1uJVo+q0+m3UX+ZimVjkgQdaq4vpmaiRUqCpTgpakacgJEihK05AgwJ4J3yVMeyPy5uCdfP5xQPLWDZW/8iylSSNaOXO4Ojc2eOX0hTeq1NRrDrlQoAO/IFfR66VN5idHJeW8+uoO6uS2DcylTz7gMvLEvOEkseAJICauTDmtp9/kTzfSVF+n/eUvhTMbLfumbKNDI1txKX2XEPCZOa3sb8fmtduQzEjw7DzOLCBU8EpUW835rgXl3arQYV/WqJlcQprTPlYmFAZn5w5ggeMxfwDYxluu33J+UP6hbtw20Quqxt+vhusSoyncnF8msI97byUeam0OG9G9ceWsLMnugxXF30ePG762/TO7cDsZ7Iib7ZWeWWNg/6O/5dMFURuyXpPhgiMOIWwToy+jgE+muREKBdOpz3qYn/gsFCLbbXghvn8XxS0uM93tSPy/QVG5OpxQLCqtToCIaVrT5V3Dq2/w42zsH3Yto17J0ug59t//NqnuKFuzZE1N05kNeA3qU2YNAXQb00ow6M3XD3iqlDWqxvOmUz4q+pRZq78GOS0Bh4L6b9azHtHZS6uMhJ7rnYe1V4MrrHuvNjKpKJ4WXTfSa/WzRNu2r6fRM86ddgFm+TPVqZ7lNh0M7ohj5pcZQOH7XwDiTQdxCuQbdCNwWlk4QiaENFS9VhksVjn1kLntrGkFmtfpPK4HRcnVzfIDzQ2NAG8RaZGa0PuPGEC17UGNOMGtUZd5g518QzcQQDd7xD7xN6nvDP4I/S53waG8tqcBCvlfUBNB62q/a8vdtV1NVvlgUC0Mmd7zYymIqKVjRnh+uLn4Tj0eITwoADu6b2gvDsrlg8+aKJF/zj/sec4dWlj+y9vCrG6knHD5Kf8dJFMqScSh3dh0xeSVVeMRTzgm2E8m6UStBJxUFrTT6wv2sDNS/ztCv48yb8MBqj/Jbex+ek/txZOtM7QMWdtXIOqJ6a2pOvC4yxJeXHBSuQnV4GWZ5fN4GKF9ur2Uxi0l+4d6SLjZ/vbbokqzA2Jin8u4xGK68Y/37sHphX2qKF0jQaWs8/2ticnz25aBwsUKch2NWe80r4+bIWeqV2xCtdoD59Vcda5Ke1I3Ihxn7gc9L48+a9IM7QF2ZyK1A155FTjfQNDrxDGcotOjve8DX23CN7RmfFLW9rDtMRNZKMASNH9D7hyCd84qdRZ9qvflZtTaZm7qaTdGg85E26210nraQZm2aR+o7FF8Z+hJuxrzruRZ4QBsyZ9kJFj7DmiQshvq7t/NTdluGNU8c/5Mnocm+t95JajAPtsew22MXDa1W6o1gB/dkZzxXzzSXeGAjBSNdk2pexLa2qLzjVYQfO1+eKyEITztNPJY0EiaPppFSBjHq2Pm5VJYhutcEoEYaKPD2nyEpwXEBrMRjm14q3KxrYzzvQywsodz9xlqxrek+Z1j4jIXew42wUiVju+3Pw/STy9VgFAvUJmEVvN74sAVNtnW9NB+mP/uilF6hPwCx66aWXXsBe9EIw9AJm0UsvvfRyBOTKlmXTLO7TC3hWBXhWBXhOBLgNueQo1kxubRrn7/OlFV/ay43oVqmS8NMibZbDIP4BgYdsYEAhxWnTX/Hf+00YB+xofh3MePg4wLF9qy8auHCWIDbDDzOuOmYczJ89C1PdC56ugpt22H/ryVsyih36Vqs4vhNpHv/Ayhh1m/CclIl2fQtp+gd67Jqut3jHd2h9wDOfMAzD8KKxoXLExAnFCxor7v0ekS5cbbuewk9CLTGjztUTNB52rOP917u9M0d045lDY0dUjg1OsWEbN7dTynTkIJwQNFdzzyJIMIZu4pp5Cq+/pGL8+L6R0eiUBn3GIKnuusPN9KRBcgNMpEBjYmuO7wvMmBcomvu6mHHngoZGGjLLg+2r+fbMk3nQOM5pbx5GYNE4UdnZ8XKPELm53ycMuXjI/1ika9J2QiiSBRnAYfJ6bV+XEc3khkdFa1gyVsIEuabSBZF72LNi1z4xl/iCgqFHQhTLTBKnYT5HRixtuD1vYxXQTmc2jPoS3NKUBxtPoGd8Z2zCTnbMFkMNLWJzaO2AQczuUFyaEDmfUm8Rb7lOFNmemLRMWhYP7Rkg4/NQUGtkQWuoymzNjMoeRgyxOkM4LQ7tXJlPzgtlBZTUyXFRHNt5MSU/F6d2/pqB34qLdu7MzAfUoR3MYapoBGT2pALX84RpFG4uxNjUiTY41zTWYf19jgQy3OEtR8WBsy/hLFWoi6m++qLdBCFGIEtgupEX4rGLUOnL3KgcuGpnDumU1vnQgPgC5FVvUVhqtM+oxIEHLHbosjS95myaVP6ssWSr6jzzsu5hBA4hp3mTNHXEiuMBc1Jc7EmUW0pcprxlqbIdgJMcpqc9pWGqHOQjHwTlOe0yhw4ISYH2Dft3RnL7Yft0mGKGczBg9CqXCwFfxmN92df9DcZK7qblD5LaAHGT551AsCO5ikBmKZ2FlOtqKHLY0wkXVX0F41vZbRmUFo5jsmVT4w6wB32DC4HSJSlEi4oJAHaQhxSHdq7MJxeFsgJK6uT4uTi282JKfitO7fw1Ax+Ki3buzIy9yVBBKrpy+Cib4hoZSStvjfSzAEthK/J862Kx7VPV7lM9qSfQWkv+GR13Jn7OULWNVhxL5HITQr0vhNngSfDCUgOGICsRxAJqQ1AHeouBbUX10AszZ0ze936zR3Sj2fA8TYszKMEtqSSFxQnSQYAHgT9XaTx1V8wIiRYrPacEs1plexFQ/Y+7D8wKsxEkUaej6Pj+c7L6VDp9kz6/4BVkCwvyD9Mtwx0cd88Wd4ItWytrEX49SZrY94/AmbdE0sJLbNbonBqVN+qNtczq7lPeHbcLGjHzADkDuhGjxHd0XVKA6NvLUA1QG3lOe94V5mAqY4ybM2Mv0lpVQFmCrcapuL6Kp08BnUxES1PM84JqCCJs1RSishk/ksF0qgtzuhQH4N/4W7sJlu33rc2Rjae0cRpld3FT978zgkXwhRODXr8s1kpok+bA0Cpng5KgqrNUYlT+aCXBRQay2y+3iiCnmNLfPLX8ANlGROhbzkBMZqp+L92oZQzi+dX1IZY0+9RVRdJ4yjJFuEgPsmqhKevRDL8QUqANDznxSV0qfA8BCAQhA/iQYxSHcSha7WTyqqEX8EDBDgTVyWeL2icSbtwgx7KQNjZynxNpyOiY80azL3hpB0UQs03uv0GcSmu9KvJisg64UFH0jJR+zgBHzqsBhVnb1RTOK7sZXvNWzl01KeoTFgJVrIWuG8ECESRvhsB8K9KSjQbzg5LLdPXDbdyEeWJTnaqTjDnpSXVg1ddNHZSAcz/M0MrVUnyvSayu2LxpEtr7wjYD0Q5bvUOBjS331HQP0BerRwVgtsFcGS0t7nmmAHwNcy/YCZ4COqCex1lJihg+sZeVoUcXGhHvU61FnYGPW3dNXTbZdMCv6sQ4aUaRD/cDEZCBeYzofB6NmFwKVSz0wb5T6FDoomA3h1H9ZYpJg9EuMKFMsX2X+I8dKT90PgSmFZGoGxG+g6aKymx9fCGoLKaRAzH9zKBerOGC1KOsp1Nf6ndhxuPlpVxYrc+2wBncdZXmbiQmPQWce4FMiqAJLfxsrR1bqsBlx+2CLLF0/LBNwX4odmsFzd6c6eAopL4nTHFBwdAtS19uwxK+5hMHxeDXkVQXRnmQ8Cil6UjAK9xcGUkovo5HnUrVMwbzvjdZEBjXlIlSO1fZysuAV4scwO2DQGQsX9GDOwPbXnqxJtEQq0q2GTICotXRTCuewo3JMuKwaFDJcSG92sSHHG9HDviApDotu6Ru3zlTyZlEyFn7ZKW1tc3Cy89ob5BIFdafLAGxaNF9RCxYavJFd0Ewi8hpgcCE9oWpC2VitnD0YeUt2celrNhZI3TevPFgA2PmMlGJBREWQYqRe1xkHnXweyhxEUjs7R4KXIikgbG8HEoXpbHi0mVHDuwhUSJLQy5MhsA+TaDV/QVaXHLUwntilCQO1vRb+XBy9dmhJWq/gUbigL0AhG8Pb95+bXBLYgqypi3Cg1FnxEKTNl2NgBb8n/61SyYH7EQYnM7mNhbT/WSqMUWYmgErox2GvR60+GpWV69zneWOVXsUSApnr0qN3VIrin8qT97LSY9OK0WBBxSwuGU0//BTqufjHGsAOwJ8IsqrdhCjj4djdctlpCCU8Twn2u9nWuBwSb8xxdYFRm5Ll6unodOt2BorTUIqc1yoOd51vxMZ/WeeBqm9mtfiOf94qOrd+xH6FgeikZNOtSFXsVDl5xJ+He7angXNf7v+13RL8fPI9XJUvf/JZ6/Jku6TXve8J5flam+R/x6u6nIraBLdjDJjO7PMSlwFCMyIrxcyI80KBPgknv+MiJATqHLIggzPfby4SMqas8hExTo/xUD55XY/gWxARE9TnJEkNPVeK7O0xHWCBMdPPwDKLv/ti8YBpxst/v2+jNjetfa4+u/f0/tNfz+oOPz+Fj63Mv9zdHX6v9qTs3jPFXnGIDLnNFM2ZJo/t9ytsKVfjK5GxAsORVIU27yzz2Dj9duShl+koNneQhnp0X6WruzCsfYemdWkiS4m3MPCWInTLiAeclBiEQOFfPp0O8KFO+9GuAZf3hpKgE1yWqhgtMH0YyUFy4BTE5ivP2RK7GdNMQBKSRNaVNkf0YP3BoW5aJFGz8FsC/MYbHBYQD0ae4GhaNYPSLcGExd1oZH80raauqOjuLAubp/kMCv8CYCCl3eiMFRYDblamPqol0C57ybDiAzQ3/aAm7+hMNFs3eIYqYjN2HlORWu0PvJZYf1eoID98XShe6AkPADn4NRXw3n6qPR5qsimqcdhuFhNl2tTwiRcvtkqiBgFl6obDFJCGTwzV2PziATab3rKx9a/JzY1PVL9G0qa9rulYwALqz3YXVlA3gozcYWP9YLSkTRMiMZDx0dt8LJhYsF5pMBBNhILJ9vBXgKVoyheRYKXWOrd9dQG+P7pQ2bRxB4ephvE54jtcw4VKyenaq1AsWeJOqaokhZnkMw49AJb/yKqJn65w4KQ7bmaBEmimDwgiJXBLtUiQeSlgo6u9UmfCXaJPBte1nupEE7FdaAYpflmgaED/fEbRCTPSNy7siqchC9mDHGakKqVp6vhkqG9V/Uq9ayTBe2qaMzM9054EzQA6qszpNd93eGN2zKit7RKtLkkEF5NmXy403DTQju//AVATcxoO6UdDheQtA6zmzDXHlpjs9G7Y0JaNzuyQkBmjKFsi+JS9049EpfEPo4pNNNTqfAPK1Cky+nsGqv2NxP7UWCLuAjgg90BvQA7RaJWRXuCx5ocJReCtIhurSZniQHsI1zWalB6FSRIYB+QcPLWxVIEcJ9F8S0Hn212wVrw+E3KFslIhN0v2cCmGqN2vpJQTh1fFn9+hcnCcG3ThMNFIv/WtHLcf+qhJ7Wm/3esWZKknQK0WTlLD+yQtppplzYOWF1ubvYlsiJdWSfnx2BrDX+vwxATLmJrn5QL0aCX/zUiqwhlIyAaH2v6YXCclxnQhhgv4gSOYQabcAbdoaygU+UwHlJYmDxYcoiFySMQptjS7/hcKKhEZGwNQHguOAfUlgvudSZS2K3LFjlOf4ISoBC8jLHzxYu6ZnTJ8nzbBDxB8eCB3HJnfipl0cO0vF/fbADGjJqQmsr/KbgZvISvb+aRVqe1BKI/ZuW+VZ9RR15yYp+MlfbuNm/LFjufRM0CCelnRKaXS16YYEgT3QncTVhiIiRzKSiKKuWhjG+TtRhzScSOwSE2OyX/xQd6qauSPgYH9Of0eYedO5Opdwcz7nwcmQP0yhKOBaUAHn7F5BPxN+KJxRz22gJjGqA0qD9u0ZmhnwgPE/OWRykavVTJSo81MQDV0hIdWjQvyPAe4ayo9f+R+slKwTMW5+3pHF2Coj1FibLJaR/8v3OKaB4nC3RTBZLXUE8HkaQ2Rp3d2ALhkpAYYLyb98NrI3OifAbFFyJkh0QEVLZz2O6K2OoQ2e3Tgm2SNnyy8Rj9f2islVIj7yKK3RB/uvwfkiTdxPRd7PowEw34Z93E555YFvY1GNeLcVxy680JYcoQ5pBKMjJb9xocqXx+9onJTiOZH6zqz/VYXMehBculYeIZa3u0mIM4vv2Wl/q+77BzvfQIT8sAmkCfwgCy61hlADCM1XI2KRHbOiHbotu+K2mNDUNAbhlmZkGexZxp/N/jKDKvk1I7kduoMFmMg9eSuUQZbUE/Q8tMmuGKNMzQ+I8YnahNFf8Me7+kJNz12GFkTQDnA5mdJaHecTJL4TShl7OhwaIcmjLa+TbZeZO9vvQEFUwzQipNVtLAmnD0PWv0myXoXekwN4QHHi/qRKsVgVaNv+/gu7GzX2uuleYn/KAmckqejSpW/nGI4APeKgWLuQak73qbSNF2LMhhthHrRj10s74YTzrD03TrmtHgTvWNG925HWriAu95nHHXzumVV8sQW/drI/rp9ysFNYah2rFvK0lUAox4cT3r8mVHcO5szJT9B4j87jQ3Lz+MJ5ztFCdMkr63wj6AtFbhPbcPynunCeVWhwXaJUb4wArjte8jhLSXTDUPrZ5ygmA4qXIb4H5nA1wiKVAUbiosm1/FGDYoZXt+sHEr5asUbk4vMUFMr6f0BJjC0lJSocEA6QtH9hsAU8IxPNnOXWGn30XHTSGCa3cwZrt3ylk7YWsVMjzvXTnG7MqryEAz9R4aTAEBwxVuD2p67IhhyCKSdoZ3BQ8bPaEnY5ERNv0eOCN4M/Ux/ndEP4ANuoe5sgWO5Ol6ZPvLzjbsUI0IeN9ix9OarwJXoUMqDzfKw3FKbxfwd4pF4Hyg8DNkq0aTGcDzT6yeSjVgYEhjA8Bt2Ja1DxdtA9Dyo6xTS+qwLggcGTfAXSYOhWoM/sdB9ceVcb0yR5Lfnkk7J0R4wg7ojhk30v0mVm/Z8OuqVEUyq3AGBG6a1EzMzcZAs+kqNM4DCgyxEv3CFNIRmr9ufyVwdPYSU5uR5CkoJDE/bBvyXgORRe6tYCVsWBUmeBlsngceK04BRpBoWazHIa2ewPwoNjfoW90HGaqARVhGJdiTPFyqLIGeAplZlbXyPROWh5g0LWEMAxtwKewRNpGLYAVMTkjFiOk4d+RO3azjsMyFxnfhH8CnMPMBZ7kfHEJYhQGom927fr3EtslAB0e5rtIEYS33Es8GPHt38sQElWGOg2gDTiBq58YLgAbZa3D3NiZzXwix5t46H0cqoqMvQrHm6ECMjUH6GBCLnKRzjwfx0X/62nhU9fzflnRzB7cOGEu0qMEYaBQXGeVAECyREHZAcbI5JUko1m6QYR0mvuU573TgqyMPpg6BWo1g75eRneNOe/eNJzSU5wgmt9pKZCZFy5IQVZsVO1IapTS7jOmmOXOvyw0tuWKp2mJmI9khHOsr3Z+u5lTzXaR7RdxqFlbYgfbKlPa6W4lPrM5lAH1EkX3e8jkQl+/EILVg/nvYWYddswlzj6JSqaNpp0dNo3YkoFTHVYh7dye4FIx0D5dxcnAntYKfhvKSzy0p6C7ZOeB7r4F4Ku4LgKqHkBJQPAGF5ET3Hb/PAbJBR0RkoGI29thvNGRHnJqNc8hZRp2EoKtE302X59myfA/L51SBok5ZQOTBngwtnHZjcPsx8tdJYdbsgHG6fTLaE3/gzj7/szld1boZTCDr059Xt8CALKhq1NJOD6NR3ksQU34DcIDEwu2kc38hbBjH0Nj1wVjRxsh1amaitcxtwlvBworhtTQiIdNDG/QuE77bsDmMwkkkML1GViER4Rcmev2mIoYj9wiIBqFyym9kuWRZgG6B0yLR67pFkdNE1LFO7IP3ruJNQZOZTObkXEXZnxT7m0mstBmXvY8btHa4si+rftZONUN5LQ4OISU69YFLE8yA+RU1cF3dsag/LwntQJcEgxzMXHacbau6j0w+dxd/9E4BzKJaVKWTM1wqKoXgKZoLrJS2show1npI/H/YhNYzNmaC4LnDDVnwZkxsWSenfvCHQOPj9Re571yRsWTPrhtU8ypG18jz1gLjZoWdst72Tkr9pirjbyt+jIqC6Uz9AV59SSBzxT+9EKlG/eRzHQmKF1GMIJSXoD1Ustpzv7i85kn3mJTyIih1ZDo2E/XZsOqqoFzJlkjQDQOnt1lINhpqBkaLpO4k2Ny/SXkqZvwJkXzL1kxk7tJF5zPSC9+hX2j8FSk57LTJ7ZRsZc2V6g7MaEBn7BzBOWDVDkDeNhjU3aiLuyCBmNMVxmH9dVWKtKqZb2mNTU7f2hIIP1PMx+mwCMOVcJfl8mt7NS3FukK68L1/eFcIFneGfShkMWy86KMOsdRZo/tQSChnBTbV+O5Xhu1HbgbT2gpCrCJNJuOwcN8WniZPQxBdf++c/biuEgv1yTMtQNaEYhJ762XVMlezR7O3+r2IwlnJhOMGSoyUuyj0Geu7Qo3FYIQPg+ENMzeDvo2o1QNA/8xLGctSrPZO1JFl0FAkvlaWeyQsR1NubSU4FrtKAndrfJN5TvDiLpjk4zoSTBUQMZTyiTotgYDm2P9MGrzaBjUAmPOhmcTwNyF2WtDkrItBoBhKVfFeGF7htmoRDNQ0rktFBWy4qHblWXmvCuG7sUaOr5j3xQckY40AUjVFFNpRHhQqmBJBwlyVrVNTprQN3tYxTyPGiYfJRvVYSOfkAidNvHHj/SJE2VqxEUHwF/Sde/pE9PkB53+I8XRSXiFmvhFfJk6cu4aJThDclACA5ygdi9SMr/K0+ue7RruovGA9F9hbhIIkbx31Ri6DNTDCSQlw5nfoFW5BdISAnGtk1AbGfxU2WqB9sk1oqv8jHcms1EeX+E4xTXLYoDwncCdLqR+rknN8YMUB4u6usHifyJoZ0NCI+0mRaEs4WNze9gWBzU4sJDBuxSxfEwGIHxOVd8pAQ3ZJpkqPai0ECDjGiruTm0bQBr0uV/aFJUnBkyDuLX4uFoepBI/j65QivbW0qNa0wyUHoC0B7hY2mLBX7hN8mXgCwxrId+lzsNe2zn1iYfKFBdUbF+pnezx1A1CCM4JXG5GNKarzqGPw9G34bSOnYbM+3xOwYj8BgR74QEYGjAEUVGbLCJ47geJveyj+nj0kmqtT8pAsbZzjlapCzPFC3PQJEGXJBRnjQOEpNwyAObhZiyYPuz4NY2/B1QDPR3J/M46G+KOKYbC+H7nzxUkWvwtZymasHgBhbMmRHYx1PA1QTx7UTWXWCKMYd3k3ttZvRBtmqOQ7YvyR+XyPq/8yA7+HQneva/aNBICvTHwxuUcutguxFu4WAfyAHCiogb6e9QLQQcvba1MaMd6Yni+SVT8vaecWCHY5FlLK/QUwXf7WDDJCLzGsr0HYBxo8plSI8M4PL/01olkvGMD0MVBYgM47gn/WI3of0kPm3tpXX9QdjtU0hNj+vi2/y81vNNo4OtPGxWTusBNVeaOg4jD5Djn/53/1SYc7TTeyrDo/pNeAbxSflqmo+MDnoE0iFanEhBhtfgEoUtG9p/GWK3IP7T4Mxo7VUdzp8VUcSWBb8bYCZZhXgViduB7jOxfIb/y7F6eBrBC6E4mW5oKfK41oLwIY14UUvlCtR/FedPUp1I8cFdVHFeowhzpXiekrAnvfqqnNG/7ll2JQgZsONE03bxr8U+u5xz/1dQmExRker060frT8Nv6MzjkwWVPet8Zq8hEfLaudPxssDmEJFO9OUYBfaCikDzj1pH7WQF+r56ntzP08lKSXrIetXTV+2zF4rM3WaNO1fjtoXQnHOrWbKQ8tVMcP/D1yBVC5lQn8Gf0xJvJk5MfONhidyxEg0TsrawtRzJ3i4euvjI22BJF8xlLQXdL/Ne0uH0xQn9vEIepYl92WXC0Wbb+Tp9Uo0ZXvy8n+Jsa6+i8yKelWTimma8h0dNObq8tjdgrhpoZKVLCzJybHwMgwvrfu0UHkmL2riZosFAg4fh0GoAL8dI8H5NHb+GP+s+FP3N5Xq28/ev9Qf+KT+y3N00jZXlC17MEk0bdeD3KQAEIjdoHtS7PFaZYCpvVgpOQWVOGEGpbC7srAjGktIMUNOQe8VhzJSHbBg0E4i3bI0bzOpFQpBaqHDXSBc9oTwZo+Y5dtGgoiNq1+rxnlRVW+T2riAwelrRi8B4/rUcp3Ez8MCSKfFB6TW20yvJ6tXjJ0LCledsT9WsIid7vAZxs0hy0YMmAc3H8vb6uMffMCfPQvLthdrRTnN1iZGcPhdxJnlpt9kwWA1U+6RchD4ygxGg7eKCDgmmteLbYAGZ3l5fP5D7Ym2rWkiONP6ePyxI450+IF7GDdePLYRXhV8omvnrKNgR+8ABJlQn7hKWKY7p0F7VLnkoXao+iXZEaWHaZm9nDYoSej4Kby4VDYI0vr1E6O3i3BzLO81b5T9KskUIg9/DE770BqFuccDJQCvF93yjtyhCA/0TcvQCdUwPRHeEBOFpSW57jCfminreRQfnAebthmxCPo8gGy9FoTu2J7jqwgYc0IIWggnEsDDdruEmWdz0FctECPtbUj0qsP2lgdQpNUFHBiFnfi7CmUqmlgFSybjtp7rFtiOEcsSZORCCaRmAsunB8VFZnIw/uTjI7KuUaEQ8O6c27n43vaH3qshhq/JJZEy9vxkEukbk4YdB1pSZNMaCAG98U847qyKFG3cGlFjWhnb5pBhBp8crOSpBNVqN3rufCcCoTCQBA/ecT9PeuxoPeeRtcc0OXZPTeY4YIePBCM+QCxUEN6qoG977y3P2fpR9hPjjPZ+bWZizaDTc7B/h2g8/LaKdpg1Eq3pG74nITMnb/Ljgdqv9fGfpKTz5II44g9SuL3LYyg0D/+IMhpjCSO83KL/0YK0owdojwkiCQXuBd9MtF+vyBDjT83s/n2ywk74FStjaUEu/8JmDEn8eTox4QE9Tuz8wh1m+G/CzhTHTjydy25OWHxHWc/OQaHUHwlGfRRcz8l/gPj05gQcQC/kD2ruwfUq6STC/8eMscXOcnUDuzXe3Jao7UvHQSVTpc8whXwhXp4sxQLLC0ZJWtkkH15aG573kJ5CQm1wuaoIAU2VUTiODcGIdb93jve8J8D29XQ15VyS21u80Gm7Z5li2t3Tkgmp0gHZaTDiCt85UH3X+/hcCTc+N/pw7Udrmu2yyhJSd7GLR+SNLR1h0A/XgvLuiAGZQqsPzvUNkMJNnb2thcUdNGYDnMRpT7iz1gGI72G9QQ7T3emenOuc2CmVR5LTG4eiHFbAl/bPEI2SJAiTBPp4RaNml1F2y8W/tvpn3eJrI5QNCu11bZFxjWE5bpo/uRaGIj1WaQdrNMZWfHAVy49euuwfG6YqUePP/L6J0e34Hxv9+5P9BKRwcqJOxL8QVqZsrImtvQugjLFdZvgdCXDNpJ6H+tpI+1NiCAefiRjPlxNh/jYGfsJ6bLHgtxFuyPG3UncUKTL6Ge4zyP2AFiFNSE4r3ivuNR6i0rZHR5nPGkIA4O9EzlnFzV2fgr6HdOKm1SFefsMx9Q6/MOZ0pN8YHcwKlhVM4ADzSXWIbDW9DbFTtjmolshfAHn1J3Z5XNlpEKPppSp54JOKSpyZHDZO0r6nkPl5d9o4LOPpPIjkxaYlAOg0pxNcXNSlT03w7n+I7a2YZZZHuOKdUJslnVypY592LJXRMUHrdE8kn94QjfBQFe+yuPm0NCGFI1JkqNU5LZii+tLpwnnbC2fcvVLEFieg30m4F7sCVRwsD71ModjfsYVcRGuvC5OjzNSu/UdXryT1XYS2BkDCDQDlFiSUBVADLlCICwhxz9kqR4p8T7UUn9rej2Hay6CFT/MKOOdPwiyNE0eiMjyi0/SLebZ9Vc5/wSt95dfJFhVygoriEpfVbZvMqCZmCrC+k2qyVCTYxRCeVC9DOCKH1QzNisO/CUjJeOurBxYcFzMbibOg06fq40GNcvaNmdUqVQ9S4N3F/ZMWOjUAqvclM9YwgjpR5A0aSJUlUKW5qjJYi5xUM/qrdhOnVlUxgzRY+mggwFGept707ZHXaVx9LT5kqtFsFulrK3ek/RYQpxN7fErT7/cJirOtyOGEDhtSDs3fnFvkn0ZlDsS9qopgcHJ/ngvrRZ+VP5eh84TqzHYCvRBeA5CGrZNC/KjMKwrfJYvUlBu0UHTrA7hg7yZduYRXd9HhTRHN5gtuNjLHpsbkBy714+jeZqmZF6ihkCy63dqdRdfKJVJzu4MjSP/afc+YZQaNv08bkyZ7b2ndG3VS8tHkT27vyHYoaB01QT0eG1okG9Q2G36Tg84vVf4w82FpIg7oy3Lan/tyO+sji51p6iU7UKOWjulqrQn8qM79/lWOylu5WzGru5o9Ky4Q4pkosZ9mK5ZyTcgrP88QFOXg+mv0wn3bjsWpi02o0/u+oD3o7MEauOunMAFGJVy/41T/B93NTvOfPurKbAekwrf1dUMWhH1NOHKRbEKjwe/8EkLHMH3Yy0MzLaLjeBOPueOpbZdeaVdy53XusvTuwrf3XW/0f9zHF/cWdDgECNXbb7bal/GeLA7dXwfKl+mWOVYsvU5UVnmQO+ciUNbhZrbo+EO9JH5fhG8FS+WEHR/PVqj1MNd2zlu2J7+ppLWlrzOl4Mbk+XKWPhWLgh02wjZhBilstr7LzLzlbc1C7q6Bd312vM1Fn5fXFJg5Te+WZLuZl2omH0r/HraBecMUBjVI5yit12QoKWGFhzkex0CCBQ4glqxTtYHP2E0WJjWn89U2d/jdC68ldtIDDhPVRomJ+VBEEsSV1pcfHjTqKbG/HtoNofR8WaJvbadyfduJZBKBdXw9SKujzrGFuwn1RpZxSdMs/ZZbzOICr+86w3E2KnXlxL+ZkgqjH1vqUhB1ZfUKr7zVKu491G7imGyIln0ISHkbi2xSxqzN8trq/+78VxDlcs4NYkBPmQoiNAeGi0OR8/Rf9sJmhJYji9pF+2QxhXALFn4IEGP6YudV27SvOD8hIh3hLHUKfy5pYMSKRuVUFQlH+8bD5lErhNgNmlD/kZeSJ6iwJHnOTNSiZ4nwzW17Zq5n2DEGTMVvsvry0Qc0+zwZdJ4VoGh1VvQfDWjIukkikpeWrMayTDOlZNeIn6C03QTdT5C7dyJ5aOpu2Tm5QSDZ2QVvrtL57RAez4uU19Fm7vubUIY4RrTUzjCEzAiR1VsQHXQZ49RGX+9UVVAQqrJG99e43zwe80Xs0OK7WrHn4dJqKA+oiN//Wg1GPmhQuf447c26Ynp8vZ+Q8+vIogvhPzh2I8qK7Y9uNxSp83DzByGY0Lwf9Oq70kmTm1CTrS+efkrFSGflNZKexahXk3nX2bNnL4fQx7kSK7lp3D5m9umrMMxP0kKIQLiiMmp/FdyrPl3gs386n9ZW4eHnCcKKL8btw16Eas6x3dehWeR1rvyAe7qVAEsjsKctzV47nJXGwCY2f2oBA0b+9ei2CGyBCJUJHMgT6snXOPIGdsIEOY5wfoZgW0C8iq6HpngmunhZAJMLE/YBmrdNdyzNsM3qHJwpOP8GoWFKNDShCYTvWz+KQuM39sbk22ThlUnUoHDN46iiwcRI6qxPKnHCl7DmHRu2YVnaxT89zvFPOjmsMU9fIleIu0q4w2CQWnwx1vz5yeihHfVMjIcYHQnQkn95OCiPtusK/Nn4HtQsgE5jCRCXNEz6MYzxhTp0c/n/QU22aOG7wUZ+USyHJHPZIMdhI6d0Hwn/0pokD000239GAKcnohyBz/wgJ+XU/mYHjdt6X9mvGQG2AUY3qUpVc8cIEBs0FKn9qhbI+eyJE5vGxflonbHGxFe8fio4GM2aaul+g9s6neYl3DPzIG0pkXpCyZWX7KG6CKxvrdIuof8w2C5nT0vreGrC5ibyOuSTz7SUGb/PI1WjqJIFI/qjs6PMtu5e2PcPNcn0nFuAs3jmdY/Q+56QR8Ag8Ih04PzFFAaAjvXyTJ1H4ZVyZLj4fDVYRJItG+alEyeXtpiyjT45p14FhQFCzLF8CvkoMNUG1dK57ylpI+9zDRWmMiuEUzf4EiiN0bSJWHlqnhGHLNvo8FOqnPw7BBaFGsbJo0s257qMQgvxPmZAKLBIzFs9wAVSknoMOwr0LvGRBGR7z3Bj3BJwAfb8zkxNACkccAFQgbo1OZK4J9mJDBdBLnZlN7X9ebfhfTm66UhqY1cqUkKVypSiKXCl2Iei13KCIYzqIwAQOwJQfsFiLyo9KcFJMyq0zHAw2kyFD39BpDDRAFuCfCMv1nAifwX4T0AY4k07sCgEGaIvpZsVgHFpr083gKw9+rr7nv8/qJyfzhWFws/XPbpLkZpZ5op9Y63Qd62KzeHb4YiOp7wqR98IrAeh4d5MMwmymAqlEhE29XceKEBSLqu7+8u/3w60y6fafE/rNoVTQWm4tCPdAE2aMwHMDpWcDiP0OpfKOFJ9/qvUPjI4S0+/D8Ja0IWPiWsc8Uq/GUKYRMRMdUfMwoylHdRou7rwzUqpqjZRIN4V7fXuGcKYxMtUrqxGumYaklm6PTd403RiQv2q4lqQqry5/5CQMvsrzeqaytDa//Y+qB579GVo0sn7/TeGhi48teQuVvAq6wvMmaKxmM0TP+xCPhPQUGpSiPN68sR5gRPbjsd+THfOsLfv6y6FBm4148emIIYw3EMh4WjDUcdEVVEaERkESHBcDAorH+paURdprS5e/5XX4lQfyRyMYpm6Fnnc76aXVG+0/5LR/MP9yFP6tLBjdrBkjqETK73qIRj/0cKzD+3cAxGZPBBHPj9Vyc69l8++J9fw6BzfDFPs3HwXz7wD2uW/s+WqTVTFz7eSwnOuj60MTwm/F8+2n8Uqqkc6w4USbJWUNG2JrlFJn9kMxB8xSM3E6HIVMjL5+8e1v2Q1LE2fUGMFOfZt4e6TE3r//KBcb3qmFpNWOBf7qmLf4WwOkjolbHlCIgwlpr1WLO2NdmxCWici0d7nmCBnDmmlY6sJ53rttY8xu91s5osOK/h+C/Ow+L1ZlTHv8aB9KMiHsEsMvMNjbv+XiHqW+5Wg+Nb0g2avaoTOO2yomXJV7pwSsf9kPfWVb6DwNt3QWca3/gYs8Y5Sdlw3yyywQ27IzZ6ZyBPFDSODN0mRB0LwPhzadR3JZ7FqOvjSPcYLuUklPIWf00C3uZzfctdJTkSM31bu05CeMHuAZvEOZkIN2AAqW/j17QEJaV164uBJX5chqEXre65X7JNUCKDUq/77VOFxexdfqWii4pJnzzBn3++7Kgcs4zUkggzHI6O0jhWqNWGVoH2oxUWKy2K1OuTt6v/DWtLtgSqDKvbn3nEfAj6xwtpqJg7VBCjAPwgSxiQCvhlR9omY92xPL/ux0jNJc+gDGQW64z0Zf+TSIpg2Y831FAEhWsMhblenoiRMBcVROuEDk3F/isNnQCAp8F2j9oygQ9AdspwddIsCtBXw/mD8kGFDS27wpxvvhLOjN44ffGg8wZ8HoKPc1U0iOhZ+NqaNv6pJ/w1jSw6f1fAsb9pHrNSNz0eHpkW7jxKr/UnwY0b1a4wd3lmDybRuI4jj7Iovuqals4bhERHkah061nh9dEje6/R60UaVt/IWMurmdfYq3amdFdIp6R0W9rq9pSn8j/6+jKgoW74e2UWcsEQ9FAOipltqfJmL0m7JJhL1hkQm138olzstJzR1NRJTPXJnhp1aq/AtWxcGYsxcD/xlH7KQMlYYhnmgNiJZRWK4NKo3RFr/tylcodVR8IXEuQ1cdtKTzOPp8q0KnfN9RwgxEE/1FUVbtyOx/dlvReOmxsRPZoQzyLq08lTAkPeNSqLN/j+LAg7+FE1+KjUSEdtrpA6V7hpoAT6zhMlFw3004XWAxSmEV2CcO6j6kCdqBlfWLsAxUTObX27+8XxHhN9Vj/zocvvrIS3lXRTtZdH5vIQmpTM7enIGPtj8jDtUmgO64XuqGAgCR9/0LrESg9sYjDYVoaGrwWDD7rhk0Bd5BB6UukTon+/NXPxETEpinfsIXasmO9CB4soO8qiqpnZUwCmuOl1kCwLs1vTuMhudTo4WbiTgkVNo3pLRNS7fjoKyuVkRFIuNZ8p+Bzqy50NMLBYQqG3BMLb5hXUex3USosl0ggLAVVWSZwsSol4bZ2gy72iQKjKo4BdK6VGPDGxTYJyTzV6CEUdO1QEftEmRJ87Jym6E3VguhqlwcsJF0e/AC+lIJCDdOf7aDjiWF2cOGcOwUSbLKtKu3HINuzX34wD/crZ2teKcWEv2NU28Wh1GPK1WoH7H+r/Zf6U2MxhuKcTuH6WKuTbvOTJWpJrLG6ndD3MMksziwKtLwCRP71JO8Trjn6tCBu5C8SqQ+J+v8zykBOgQTYeO4ooUzZ/9M18zUB9NRy8Hqw7DgufGUHFAF7UcMxsyUOBVadpzRkBcsC7/QGmABy+x73rjmfxGxCfvdIOjw5NWiZ+ToY6hyvDHQWcrUOS0cEhwX8LXzElhCvX3grDHYv2kNCh5OgHc6G93DRMpKc3wNyM0I5YRFSWG/+RUKXIm7xJFJ6exrlfhQgpUtD6kqBnbhr2lwNlfpikWc67qiNT97vGqd4tpzMbLdf27PHWNlIIOpsejzAD/waRrwQDSdHgsFKpyoG3VTq8feZk/UQvT92nKmR5a6njBdzIu4QdepHRluefkjHd+TLCNAOMeiW8w/cNlRyMHVai8j+O/fvUjHE+M0gmTubu4pH/QsDMENCyd7Er4O95fnAz1m7Vmn6zZA/ZRATJW6U5PU6//ywhD0LbSCgvktkWWvSXNPSl1n/0uFnwwrs01sVegunEzfJIwUEsC6rPbF5HRNZecXi5XozgoVQ93c6J7nN7sYUjTxXg0xbM/i7Ix/HA3pBHETvB+k5RLDXTQJhxr69M/np3Wlt3wYzr95mE1PNReplduGH4XLqJZZkOSjHnN+qMX/uORlSHu9l8SkGQJ631SeoJVv/WsAVHu1ZXRzDubOmdbxMrvvJGJugqVLrsSp5aBDt3lUJPCshk0qhHKWKYqvUxQ+khMD8I1MpSohoyx8ClnMoFFvsd6YPknGuH1MM7Z/z2Q4VWD6hch2Q/b1PrqJADJ4boeNuDF+opP6aDSMf49lumQhX9YIzGQ1kexkd5vwFRhLb2251Ez2sg3z8QtchIWlIOJ3eFGVTNw48j/vGH87CXpG4QZiqUz26MvDVsEHstQsu0eENQpCPXBXV5RHb4yvWeK0o9G+yHR6o7osGxTI4PadDnQYWnyAallMCP9XXa6Vbnqul+ZoBUJIrI0zxnNPfgaVkBxJCoT/wdmZtIFePEfDSUoYGHTZ3wwASXxHzncpG86N/fTV8pr2dit2jkciFFG6Kzx+DA6uY8sLpppvrKmDDgz9FRADgLtnnkjYIoYC3O0b2+hRvVTJ80wLQkrqtMyU1jxuKYWPvHqnBvKE137AqfePLEWE8AeHeklXQf+iLu2ZyBxvkvvRwSY9+PVlA3H3sen5TSrKyVl2d1eYlJ9f31lIbi/ADADrL9+2WsVOVxp71TVkfJElwDA2P2VMmnrdBxGK5QM2uL/n0KmH3mR6U265a7oMVkQC4lgOCfsZDaFEzbmaGMIieKelhcMf+ZnO1zXNs0qDZsOwmPz2ZdKfVP1udRaBCm6VniteQ57vSpf28kNb0qpm2CpJ9a0fwPWg2VzbSSO9ijlFOG4mSiEWld66x2TYk6gQGXqtKZZJhZqiwyNO7QqpGqforWGZ/oX0+tm5L79EsiMhp+/hEhtfhwFbvxHl90hTop85U8zdNPDoHhOj9t6qib9bG+FBOs7tS/6pNZl1/Qft7OQx5eCdJJI3RY0o89aYhFv0T4MKRh1Rbukp7VnUYNKuQWKuXyd5B3TrebDL/hyvyn9GiH2bmE2WgyavxFJq03VsOjFjXcHF/ztEt4fJlNKof8oze+BYKUd/JZQn7SX0MNZG06b1n4he+t4h9BIfOY9XdE7dCVoeYYdgV7x5qvdqyMaee1Zno4AcFRGhvTle7C7Ptd9eySGqWWYNeq9aj7HHrnN4iTUIs/N8rNeOV0NC65+POCm2XaFrrzJvSdhEEos9j5aTsSl5UdHRrlNfAHVDpukFjGwPJAJvPUG2a7SbRqi2s1EQ7TOHsoyVOdwVQNodot3mysUroZLFh6nS9udz100+c6oTb+iWBqr8678NZIXK8uX8eE2cw4XwChoYMteJCktq9kjfbYoLyHKMzusjUrjquNdV4ItQCku9ogwJqMTn4E3AgdXtRHrP1lmsShUjWbrf+n7C5sjcbVLWW/2VjviEdyQii/ovOA82oyZUOUeMZn13f25GbD6QzuJXeFnXrYcphq7HQ63A5ucLpc+hYJ6XPFWeyakA9G62vwHDLffFXJnWcFP4KCmTgv8Fr2Th7RoiHpZ5tjmXeCTyjsFGuImcVq/z5iF/C2rs9mlWnLZpBKrNBzU6Mg5KEXo1fNvue4f0zf26q5GzHln1Up4cUv7Z10L4ZwsVGx3jB9VmDpREZbyB5tD+d6obSATFO+wYtGkO4rjpMi0VEFnPZvStUhCVg2BFPX1gjTvmsjms9Ga+HCma4L7eb05rpWD4H0jEVzlYunJtq3v/8n2ZLjjFoEDUWcQAJUWrNziHuHd+X8T+UL55MdSU/g4CSWePim0MVoiM/GCGqHFJulknQBlYHJlGco3Q6FWKOhc0herQRrx9zXYMW1hkejo4SeZoUxPuJRKF3b9AwSTVeN5lu2a7zzIoLRlTnXTRnnbtCKmqZ+r7C0aTVXQtIG9rm10RQKZxlmrSzadjSGN0e4MIjFxwic9QMxUXaEDlu+u9STG0gRtAfea+TA0vpH2Djalia0raMpndvVJO6Z0TE8vgrXwyd22G5K4Rg4HLYWHf478/He5XIi7BjtmgV+ikrZfhJU6bDpsLpio8CbgFvLQeYg6uKglxmSyUwrGUgOAM+ivRxvFyowjTLkcc3q4BbDL0Ah+q4asrDUElQsdPLiW7EAaapgCG5nZl303RRmgi2xqyJ89do3NJDUeYv/qiRJnqI/3jzK1n4WAG6e/rTG25ylk4SjOvkHJapn7FXLtPFGx19yu7Qj0tm6G8n6DA/rGKXDpCcF+9HTO0Mzm3ZEm9pwZZlRHS+IKTOS6TPCJqaWVn7EB31yUpkvlY4qcB3uoVxtlUIr5v4uhobOZL7iV19kIfnaEjr+MPcgNu1zF8+ayirObcaftmbhp6Dfm0dx2Gdznh4FM0IuRQIDVgEvIlqtw4MgobzrICJ6ADIm/dTIvvBFcDPWavHWplaZjqGPNQe2wB5L7ODXOfTgRk7MBWMI5PVWQRAg65fu2vqgak6inOTofMBusgbnvbcn01oheQjmCYyJ3VA+5TSCJyZdVE/mEFkaJ2JwdwzGecZpkmNzqvOptDYk+s+XEt0V0A0Kf+FTJTPMnTm2omCfMmuXKxmLPMV/twt9S+6gI2Oo0n+TtaJxAZsX5xTg5ATdn7W4RY2Sm5UoHu/oC2MfNWqVCsWRPc8PD1I+tMEN1jYXxg52A4hghTLhN8Yh/yhJ+hEPggvx9KjYbsWGVHpiGscNR+Jg9nOkHS3HmaNUROb4swtMI2F3qHvN2V0xa8MymT/CaY5i5rY8vK2x1EuGlFd5cD1SrsNHR8Mv+ilqBZc9B6MQ7X9V8ZYm/iCDDkMbCiiGsIHbwc1ogKThobH+EYuMp2dslk5mIt99OBUaZFtx9uNr2XrbTqtePQuFZMYyJSvlDh2UsvyBo2SWS7mYT+3JY3GJD6eWMh393C9j1MVZFoTdbOVJ6Gv3+P7IGT6+0KWl0F851k0hfU2cWhmnUeRSRIVk26HWy82sen8qxqD6HdE96jQYgJQDNzRS91e5gFuwBlWXx3uIqzGyq24q38RUoysqPZPWnsKBuZv9NJkuWuv3X0HaL/pu7qsGbWsfgIA03Kq3Jc2p1HRCCfZ+RU0Lu8l07WlSh0GH3eLICmb94PF3SN5hfLKGtdBbpa6PNtQWGYPgKZ1xMnV4+2m08Ett+Wca1CBq+5M2uM38Asu/MjFNdmP0icqeBz98tgYGWbzdpEQk0zaGJwkYiuIykv2y1OMC7yndieAXdrtdOloS6/uUacGlnDTMrq5Oxs1kEknyprcJBKSa1tK2ZXc0HgZ0tKZ+x936M+6bbiIUO4rlFDgVMiVNI4tUOAqM2LQy6oD58b4PQNufxbHWeLs31n8QKT0sTpQxexiB+3f0bPpzmqiN6eW7C61KFExu+nmlGHXt9Yh7nH9dyoZt7diuYE0EmW1tK+yOXFHnRrGVyjEnpqbNsQmisz1jR50K+WdReiNuBSCKhwYLvJVDFzTGO11AgJz1K3l4s+eqHXei4FzkEyRTOvUNTDbCwyuZZB6Y3/b3Y8jdzLmAZN1D2U5u3XSTNX2wzjRQI0ewhH4BO0//0p76I+MM8G96aj2yPFTeQ+nxm9H8w4bJ1Rh1EvLv5GmeuqdCwSYbaT8uD0dLyD8lQtNnfEJRDkEYR6d/bQp/JufkcdZwdKjlw+UCjW7JM4XjlTH6+aq8oZOXcqPYzRQoFd6t3E9Njy9pPEzgFUXkMJkPXHtJ53JVlOmNFtl7KUQ5nrgmL96w2W+tMwZMDFoGLRUd4RBZaEPGxlUuKDvpeGGrzOj38KtyouxD79nl/L3X1k27tO7aMyS3dwqhfD5rc4P1b2ubsApZhiv/GJAdoWIXn10fj/NaiuBIA1XXaWRKGVXFma1VMjnU3fE6eLKM+Ks57OeVUMsfMKLIr10IIVQleZYphy/ZQA8B0yFG8HUNw52rHiEcEs02gWbmI29AaCIiQgeMjjpwR2qAaqibFlsROBMhXcVNKuY80MjB47WZnqw8mndEV9dogO/sVjGMU6glsvfzFSBged5ZMkv/LYo3l8xUjXjvhF7TSku+xEtSsGMF5MXpvQCWo2uO3hWl/OXpwCWRc6WWmoAP7tmUNvyg0pL6z8LEiNm52ImQkSqjPEErMBpOcEMxIqGxUJG73MU9QbQQy0eo54NqjicJBRNh4kpd7jkFYzAZkrY46XQCfJWa4nApxLvgVzxJIH38DtvryIbX+ydieDaakJXJXHDGyQt3R4IeeS6kjDn6TifH6CrvTdp473clu/Z/7ZXJrrD51LnE4KMKLRwbxR1/BXyLNCGuJqlwzq0+k+G05ijCT2/jcIVPx9u0bMN6/3Osr7eN4n9L0EKwtfbfhRZafP6ZirffX8Fj3lfbx/uv8G33HmA7rbHXGiz07Gz1uH3y669J7Zsl+Fjt0ubUnw/olxYeVlPkNBXZHyOpBLbdrPetORc3s63ngDIbKuRQSffXNyGDMWN206ld+fPSLHn7ECR+9Ywr8xVFrpRwfcFIdogq9g0mrjfXMw7xQ3MxqzfsLRVCq76JZNQykgmFgTStBDxtJBhpdSOTJD/LyCQDOqfIzN0swzGPZR6ys8P4RBmYTBmJGsvgwoGnOxD8BkfGL+1B7/D0o10iPtyBLCDeyeqGIgWnhQ1jXVtSrwQMSol8Mc3Y2bX0g8rofFXAyJ2ybqoKTRZlKAm4b+dmrn5NYl7NAtEzcfyhNFp6x1GkrSaCySVPd2aUbZFVSSx7WdTszWYTbL3d2HCVaQC5Lwz6kU/JUcn5/FzrugllT6SEFqkiu4HGFNWZamDVSIbEOzWQgCIRiXOoD/hUHR3kri+R9v/UnApAaGWqGX2WQxTaHj1mRa8FlF7urQWvPuLEmEyuI24CNzEMqUZRLg1XBxA+6y8dBc+bcPj3Dscfj1TSUNAzXkRbQIhnq3VMoyq+0z+j53spISmueX48dyYYW8PQsf1TJE8Mp6KaRjQC/C/niUZNiJGjvxsN46JSRUxJoyIX9mgpqhbqlBeQCY03Mn0Est1NiBaeR0kIHBtYeDN1YbgVPRpTfKylWgl5c6ahOOJ2tuP+ZjxTVNghgNY2v9BvCko2Fcv8bu+xDiU2i7etrrkZXIEhVPTAUPXv49LzORRTuagUYIDWmovn0b6SFadd5x8FPplpjgiNuweVEper3Aru3lDcIL5MuWMUGbnkPNxPE3M/eGzLokKOO7vcstYYfXfs7qhnPNHI19xXpcrLLrjDp31AOGGPtyIu7k05tgHthXFwNhQ6y2483Zrl9EQl98PcOEKv70FbwCSaX368Xo+j2VyWTNw3UevhcTnT3nCw8ZSjiIgO2NIwRB0mDeCdHAA9Hfc28LCI6ibQYuEmtgdkmX2tvv6wr3Kl9zHceRBvuU35bPX5gRQWhQfj2PmnQZUdnKioxqMrFbu4Cdh1NKNXb4G8CchSk4jizhNAneEX5oHnLERcU00Rkc2mSmUsnW/x3AVXbH44JU6wTYP8hCSY2w0vtz0v+JQeY6HtQw8jLsLyKyJm8lfC+yM/GrLRGpjTc28S8QrOna3lGTZw1MK7HW0fp9Ho54d2kysZ4U41jLRRwicLOp0sJK14p8dj81uDaDszdoVKilqiyTYitBeGSGm96hDvEFI/RkVQV0qtPTBn6UFMtow+THv4K+hDuxL6oK2tEAgRLtCANFW7FitP5FZTRDEdYkBU8GDGPRIyurzaKIUHUp8/oNhgY0VXhcJpxy+qKyMzpfoVwihsNAk6mqsB/Ix4flSw/hOzdetDMGqb0GZw8N/C7fNseL+OCh6pVv/Fy4lS/xCqfSqZs+pfxe7Pm0BIJgp5io2sxUZC8zn95O4mqpIW1fxF32NNRFj3JggdmyFvoKp49mchzwnbEwaKExV+4hovScQ85f21mFyRYJ3uis0pfe7vbr8kmUl8O2Xx89uCF3c5LD1ofZY9ekoxfbum7KsBgzpFJMMNGsrCo40ONaaJ/cbEcEf2JPbrh2JZJvDVlqiVfZVQ1se+u2K0jip407S4bmn2qUmqKQwDAeYtwdRY6S1pLznrgWJCzqzCXVbYl8oKAcKHyarp06cpQUOiQ5REIXWOk0GJsrN9KIe+LvVDlT4z9U7jiXjy2Enb4wSoM1p9SbGT4laksfgZ0td+fDqIdk2cMGirG5CUw3NUeJiMijEHw+NPsRXXxVos06BXl2PtyZ0csZQMW7uUNixTkAYOjsPfMblZIX3HOpVslSVPNMH1pNurmXZaH0TSaXScnHAispfGeWWZYBzJ/lntnLxi5gKdBd6DlrjKMH91iJALUsq3yhn0WNNHZZ3UKjRMinc0tKofDnBZAyo7JfODNx2+K4mnFST5taM1808j5kCmSmFc+G33SCyCpnf0TMYZlW2BxmjfITBhISPMyg+o1+tLccPzmDA3dLZKZNfKlNVkY8Ds0sXA+PJRr1zaUtQ+YvNgFaUH4OSEu505p2MfnOOyOqqXn+qp76GYTvzkuTFyphqXTcl5RpdmBzys23+1r3JhK0qJVkm0F0XhdFWlZra94qzoDCC/PK3ISJMp2e9gzTTYVELScULUDF8kIscgnWh9R1CE7nEA1ooEzZ8UREDPALmHo2mS2kDnXj9lrhyJCHhmpzZWp6AiqXqOd7daEdKF/nh8ocCfRW8eJrhD35zonIZT7YOPPmQj2/eMYvIsXACZUmbu3qSPPAPjGbkKKCK2RzO6AF5wMJjF9uO74fIut0sJwyndxbGCtMvT2US2/n/IPbclT/6fTbw5K8+KF9VfrKuVO4mdF2tCA5+qFSO7TvMAlSoVBot680ljUrCBSCGNM8/hh9Igbrr2X1qsy5Ry1RtAMsv6KZREODcu3QDPukEHtUNsa5x5uWP6nHfe27W0zeywNn1m2KAPNHmU+nnsVRB7tIbcyFbCBAtNw9LoaEGrojFpHePnLfbdRmtj0Jkps2HseS4UNGvzZwCwh7C2TfffYSsNQ0NWPOgZjDgyZt3sWpV42pO1KVCCQ9gUOQgIu+h478CcvqUBHgl51Wwd5U2rFm9HOmxwJV51mowcmoIvFHBcyLOWHiDVhJ0usaGnAqA/i3uRncaNyJqeHXoXUCJG9UwPY8hIzeVc1zr7xCLtSpES5mrGrP+dv96h0PEvmDEwIZSJmJNW8eCy+HaMDaDD1GnTGTW9/ie2rSphH17jolvfcnaZ+8wUwBQlQwKxpEJF1eJMtATINl29XBWRCJYywHtEnsQEpYTSszknixECpYpG7sHHfLEnV594EtWGUvPBYbfarH+QCnsUA8FbR/ZPuk54V6lGRMoMVHe6bGeQsWWQbdT65Mz7BX/UI2uei43xawjUbSRGcI0GrzLbQQ8CPKeV0vUpQNCg0hdVG22jvO3Q7kNwh41e+9ExJKfbuW9rJLTvCx1gldUMw00IhamTJ7UOicTYZtrr7WywsKTJ+sgrU6SdaO64wMhFBVIMbo4LpK6gf4lUDyakwlc9R6jw5lCzkrHrxWZkboTNodT2lyWZG18eQUKNZzffrDvQ7nGeXE/xuAv18rPaexF5RtZHKu/AcNVxKTK0zPqwGZMH17oHjdOQ6qY+C4Fq4gmxm37mcrColTxzWrizkhJp0GKPTUmRqOGiJr5AtUNUkEcQ9reCp4BB/TuFESOvtFfPlwu+v1RFJLI+rnMCBVE3fL7I10JHMXEe+0QBpn+w+aOXK+XWen3HRL4McYSjFA07xtIlhkxSIfgy28mvadwVzEWUGvl2x7AcjpO1rZ7/ADK0GkCZrAh8Z77QArpqhHeDtXcPVbwRlVNVDbLsGZyyJZrqHFiNV1I+3xkiJhjTnPWf/v6Oa4eM7SKxPZCpZ+Ouxc6Hy3xilPdSmqKq9fk4HpSdBlKrNKSBAb9eFbafGqHMUfyai5YlQi74Ufj97DvCv/f5+SLfBKPplzzchmDuVRaEUzS8bel3JcKA45VlcM8lIcaPXw8KhPA+NJnwKBAoChMRHhmHwpRd7nGmXHDrhzK77U/G9FXk84fzLlWdOQwFH60jTZWOP5rdniz/tH9920XKVjQQ65x+FGBCv5hwvJEVP7ojzVM/omNR1CaHHadmGAZz1VII0DTx3YdJYVEYfLneXoopBvZUIs/Yx6Tg3HaC3p4nZofJsnBKH3TddtQS1E3gv2AnFAX17PqSYIeLOG/BlohdkZrj8iY3rWbrMQDGQJMOhf48H/H6sk/ENA7S68Fp5dJim9y9PVhFknuAOqX2VOvlqer39J4WDI6LfRM0hrhZT+ytmerKYF4wCG3eJb0WqY68owilztDdY+kjRosL8j8Aoz3Ui4Z2I7WYuLKzfKh1L6DpzRHH3aOhnS1qAK3nkETBNqXluXx0bhO0Wb4ND+l4x47cRg054R9TzUW3B9A3CEW1u4bQLUcRJC9Z8hAhoTq5dLToST38aaqevoUnc7xeNuQ+8G0+/NjdMLT9heoFWSWyUDshAG1lc8N3PdK2jO/ByXnB2nagxzzw89VSaKFXVfYbhiMpg+E0nXbuxO53DrSTq7xbx2k3Lc4v69oYR6pEiGbvEWkl8uR7ihgG2Td5JEKhdgNtHmwVU5nICE6lstZ+Ye/6kEUL8xQ9SbxNEDh2H+e9GuwhwAzwtEdlCpFhbnPAPgbarR6LFBniLUE8r+qKSe1PLh03VhZdA4OpndXU7b5kpUpIGf04EOR0nS3g7u6czr041+6lQBvOh/ZN3YZ/NN2KIpuxKfA34COL6b3oYPBIrho1sogiEpaReLvmH5J6Pl8Xq2MhSwyvsg0Oqaq73w/rWGg5NQbpih1xWJHizC9K9rr0I7M3v5vSu7Ec+6stdKVgBSWC3J65OLRnzpfVJhBqHveKOjjEqg6V3N0rD9wKlw1q6sr+GbXTdsBxrH4AxgQRgv12P316z5p5jtwuon12S3lSJpKgDE38BEP55v0zkXRsj+IPCMNBhPD9lUuUUCQD9qJftJUq49JMedwIs82xTtgt0A760FtKN0L7k9SHbgTtOS3OedE7qBSQmBjR7k4EgKQ8I4wE+qAE6a6UbbQDDeBsttsZFjzFpFq6jQM15YO25adUnaR1RGksD8byTZQ2sGstb6KQcsLPNG89SxSLi9HXpVp8NBtSqUlwJ2zHkBiqcG9RuT/48/C2zcIEXaKf7iCqlGc6tOBMKlw2YCPE2IuGRcUP1s24ruRdB6whHuexi/ZIhLLi1DeBD8Wf91k6p/+LmptN0ujQl/zbppiy963pcsDaZHlwzGwfdZNAGNGeLIpmFcJBj9VyG8c6IKmIhMXm8Z2nhd/8hCQJXjqrvKuL4DISR+ay94/Bh4ft3ou9rHxnCJliHFmG+cu+j96f8nZV1I6h18Fn2iXemezvcLnXaV9AZvNisoHO4RHTJMUItskYSkA2AqolIBkk20uMcU/FiIXIJrKYpJIvDPmRz47Ak+VP/PCkcIEiJcrIpL2iMGgYKoXhJtTOynjT3HHip6pIZxfxiHLBpgYsJ1n2G3oMC2qNq39wU0N8GfnOMsOj+KB1YhW9vm0QK3lKsAIcb0D89CSaTDugntp2ltrH1SbJqqDAaGw6EmyLsKLkw3u0INX8ykHGCww0o1SSyVuXP5jJKA4GiYnvVjNk4fHxYbbFpXJUSt1Kat1F1Ldtqq4FjQDx26Y2Qe42KVlq3ErAEbmzGC5UUwMYyrxp/MdfccUfFqvaD7l17KJvS5VvEmHyySK88d847xOReoY+wDLh6QPsyt74DhEvuB2Lz8Ft2PbehACZglMo+mMz/e2nyNHEwGQ5QWYP+vKpXF10XD0Q9RecCcL9dTJdZyxC94yDUgkDbduqwv4ieFfZqXtvhHwcW3xyju/XhWhvEuY+9yFSWv+x1ov5HhSi3PS2wIYA3SnfLdTEloD1ukxWFoUgQ9mjEQfd8OgNQDBpuUjJywDBOGIPaOGUyzbzG5rXS3VM6T+F65w0WguerjljNSfwBhsANMrySokQWhSHS9vikmE0p4hDCm35FaSizT3lVOU59QSlBWU9NFmf7AgE/WYsfkBk6hsFJcZ0rJFvYMbP83ovXkANiVZKbdKaZCcgO7eWLobFPCoX0qtMOUmO9uBsWQcg8+I59YXGLvnz5gJ5q8QRvE1G44vEdeV+CbXOAdiSWeSHH21RTPLwKLXIp7viDw6OZFqyFYOyTSSQP/hTQ/iPmrDpUny4UKzmf2bCZQ5HRvOq9bjcGH+S0detLeFq4eEcLx3NUjY5pVj/60xatkTLwfqfqONmoWZuB1PiMwM//53/9i9vmZffhqE9qRBHSpoG/rEdNNVogxxYgkE9sSk9E7Eaf5gFNW9jPKcIi7qO6OjGJbmWZldqKKkbhbmMXdieXOY9zpNuzo5vVc0JHFtOfJaYrGh9LIXPl18HKb2B0PnAoOhwPipL/a5+dQv6ERiQcLbDzJIU0wRWTdnIuiV9QI7rw6CFx7opyRRTdeLka0XW6IUBTSY4J8mUIU7Czg3XowYqOa75PrMb85aPJnDbSMgVqKe0LcrSpeQs5Uxfkrm+82cFVPIGX9LkWQsb9R2uSvR10+ay19+LsVz3MG4fqo0X/nweoDlSozaDFqk3EJ7mkuUAfyMLs93WV8M7fjjJkK+HC82gQkeR8lptvZdriqv17rne8CmWuRzA8Mxofx14Q1YlZxnQZRFKznCz9Md1H4gPAxnYqe277m4z3TAbkTI9XKmZFNXrlt4JadEX8IhHFGRmQy7j/GTe0BDKG+S23R5+21KMtxSyubqiUhC1SZ25pw7l5lKPsX6yeWci2mQcmfIEf4ToZmiDlCfwPPIXxrRO4o0U7YLEuRzwYHrl1OybRY1NmxdRWChvIucM+p5q718ukFzYBcvn5VomXi1h6VTaJL4s8ol4KkuLpoKf+2pP/ul6/Kid+MahMIQ/GVOG/Du3MqHQ98x92lPGPTnByRUeRTnZ5Qe7WxgtjFVx+LcxQFi8sW0eZ06VxMaQIEv30taEsaQtkrqN+wj2Xv4w+8e/zBQT/z5d4zhW3zntAuv4tS43syR/buL07C31+GlfWFdofPGIvz8tVVuTErzRGL3Cohj8Em4wVVFBsOK32LK2t3lk7S8km/soa30ci9qb5e7BF2+AY61KnKIFAWsfL0kdK2PvNYx4EDCFxfP1RMdjZx1EjV0Q14DmbcHSoaeorNSMNCBzgQn0wIaJ3wt3PqjJcW5ScFr0tdXAyUzX7tf8UxS5InjSX1ejzf4CASIpiTNQ2AeecWEcY012GnTrrEdCiad2LkZUVbjDqO3zbh0vBYaf82NOdF/GplM/RJrQdbNcZ7GCCC+J1VB++JGRcU6lfiiL6IzH9o2ST5bx7i4aiW6KWqybSH3w1/OjGKYvLYgTH6F70O/6DpnVrDt5MW25LzQ4GcHt/6eBfAOQFxM8Px+4FyKjzPKlob2LP2QPKJCSipojue03fT7PQDHqE9MQOHnMjfplRFX6tucrBLXKQ2IJkTXImXiroZoSLDi3/Dxx6TBb7+IpwRrMpyAlcVGz8eEed15GJjRimj1iDa7Kl78SeW761jPzzw0WjaNNlKhrwwRenQXbBLuR2FblPPVjER1FjY9TXCsHbVPrvAaGH/Xx3AvzHZsCXsdZyALxlHzV35+IfPL/H/XXozW3N3hOfdZvh2y9O05piTlW98SqGxxTazt0xAQR8JtHRPjOGsEnvHkSqeZZoLUBNHjwB2W43fX6+G9RJI90o++9Wcvwhz7hkpd1ZODHMo+0Juf1ycjyGVDT4tqrJlqB18/fC9UWZuMU1v08ekABI5RVGcdvYUYBPcJie1UjlJ6oVT3O6GIIydsVc1DbCW3r+YYdJkFuKABJI/M69/0DoCgiEePhk5tTZ4OJGHly9JSGP8K90wecZvLQltKqYn9+K/aCd3HGyc/i7lCFV3pukXvX0yWbJ/mrhR6qi1Vut9am9r37TbdjLOw3vQWo3dulS89DNp/4+iSC4H015sve93zXERddUgaOAcLJR/5MV0tt6Zdc3tEpc9FDT3ZwUhi2Om2fwlaxVlgyC+Bx+lkQhdmm0daafz+dFVTizcDQ3hRCUQiSL8jeCv1HIEF8Sl3ZIuyc+GkMh8YF8bAzFt6yJuvpc6Dj758ycR5D8FWCIsHcKZJqm+vBVWfzOV3LvQoh3vXCDPiJrvXD1xPUGNQu9rBGyEF/MO/ssFtUagnCUGsm5FiDRZxfQUoC2KexT3IKqbDEtoIywnjGg8cSsWnTlHdNBbNFiTAKiPoYbaVzvyduuXQ0f9y5Qgpbz+kHktEJ4dEX4Op96XtIidAoA+dfNyu4aXA95S37mJbGISKZgeoGYWspuiBM6fOSyZz3gHgBsq5ArITzNcVcUunw5fqvg+BQjNzQoHOiiV4EvmQ9AIzHJx63zVNBct9LDOpv9+AtV/nVWGa2d+74NqHZOzgOLt8M/c6FYPeKmLE3QrZfsGMpJeidlHXWpQ8eHx0Z+8cNvWCU58tmjB0hY5SXej30e6cID7vhlLl6/N8lFiOdHBWuJxWRBJsalnGYZ5beOlZRy6oapVoQY7kZ2cMvr2j549TliM/pMUnTrVC5ZrRUNwbX9bSRIsxj4a9rLIs5lhtPJuj5zIECOOFdrCHUTrvMpE74erDQLTNmkbtnSiC3f1IBTBaUCslMX81KIFAy+BgiNfymZgPgTfUwaUJTll1WS90Ajkkr4O4I93CcQ8zyMtgjAZVRTF93l0SWQKcYouXT+yEealmpz4ER4eusFn/qg4USkd+xFCX2Tir7VeXD/Uaxx4pS7S+jGfYVZGs9RENOkElNsNj1asmNslKBQj++xEFu4zJAGAe0djRTdcZtAzOhIfZHNXTXpUN5s5UmJMAUw7GralnZH5Zh0/REO+beMP+FLV72EpriYumPNNBgi4M6hVpHz8QFl1ZbLT4FW+cqe2jCRFlOh6t7SoxCTS/mPKeqjy7jEcsOlJpJJw/HKDk0Uv0gY+N9gVBPiDchyBbNkQGTiatPAhAiiRbSNS5e25lCg6SKNiairKJ0LeQb/f8kzs5QZ3UdDUPUPdabzunn/+B7fA8gDeWb0gnTmC2sPuvqnmjDQj52OGQl7qkuRoqzFRab8oqxl4xK9QvWtt2pfeaZpZ7puaAQuud9VhHD+rSVPbBfwa5Et9PZmahke2NIrGTikr2+3bxgOfTd5lzT+rQbDFuqNPZ3g43OH5jfSiY11kI71WWlpxLK55TbdFL7v6Zz7DX0wtKxe9yceGCY2Kuu7rs+H7TTA5rLz6e4k99Cp0ac4FgplwE8+YIPqq+552+xBmpK34k29SByGm9CSaoETWYp9lxuCPSHCT2WV5LTbl7ZXu6vZ5tgdlUfdPf0hXlMeUAiSEg0XdLiDCBGqDvpv0Sb/ZjdS/ZwhyMDNYMNG+hafgnd8BgNvEQdqnN/TLRb9MVhSlb+K3kDtNMb/q4baVjy4T/y41RbNeWAoChyBEFMNtdVsVxDUkbKtFuPoOTxgAiGnHm3IgtL27bh8EVBe56iKsKVbhbGqo5Jm9BPslQ1TPVIBXcolcurrNY+9qICRUjkfbOpJqXkzlQrL34T1/wVlTRZPncAjtQHzGMc7iA0JQDBRijqUdEn/W1+Qe/OgJOULwzvgMY/KkagcvhoXfuGlPMbjhnw005FOPka7Q9ida7H44YO91Lie4LnF1e245E6Uy8/fNZjCba+vtFmqbNINcFEH2p6uv1XtmC35utNzAVn2JOIYEn1fZfeEpFTYZKWNuYFgwv4bd34EY5zlTgr0rwqTn4lkudIo0rppjkxMpy1U21EQX0ghSwhrcYeTGzdro2S6XECRzNivIToA50vn/yPMWdgohcsBT4JvuIRE2Up1Fg66ajdEs54eNGALwDF1aZ7rTci3GIT7n2DlsMG17IYOwyGPpbajM/2JMwvasx55uxZflzr5eMsLkYJWBgp8Hv6tH0VXyA/gsxITWeX28Mu5QvJbvHL2Z7+GUBXyif2ToGXAz2qF13Jt9WlYL71TbmXFCF42Ybm1f2AzFvYHN+TEhZ2HhQMv1snXICjUxIIHV3KnB3s7kkB8RzirZYNC6H0aiMqGBnes8p2IbHYSZ7LuYlKcKlOE5it6ixsUlQ8wTFhCU8bf39PKk0uhbtj+h3GUwtW8ZGGlEiltTGsvFs1p0CWRH1MBFnFJAek+DTj7rXnCK8SXLXWLNrjGYmTvN/6GKgVqjLiT9TuSMauIHgRtxMs+TatELHtpk8F0VBrcJD3SYZyYvw/dqxMBfXUoghzvtUSrrudQIrh4//7q1Le+KTDXSH/kSWzatDk+KkWY9Me9dkRwYl5Sidc99nQvEl89XMUzJJPj0UOAgtFi2cS0f2ZDl+Xx+kO7gH9lmGj3cEgd/gisI5oCFP2zRTvoiIzybflptnyPb7UG4J1GNh2eYuOrGq0TzDXFz4d1+kEJXMhdDGXTn6saIXgUSjBYxXozdhoeholAkGBmNfjJn9VLFuW3TW/fMg/eMyRmhuZNFWLWz9p/uTSP5PYK0YvNEaVcGC5mcr178AMDnv3hNx56wqbdd9whLm9wzumoju78cI/Yp8QLwvPRse0HnzVx38bf2U97mx4I9amYWLuRwWrPbC/FmWbB1MylqPqXDovipowpy/w4JIQzE/+O7/GA+SQF/WCzWOtThbmxjdZKCxU6/aMjvfzEwRe9NRsNmxU0WspD9YodTUeO2Io/4ff2RVcDNBZvOhsM0w9JC7FPW5/8NkKC67fZtyeTT+zFEfJ4R1+fmUKbpnwpK10RjCOAum4T4iYFyULUl+urZKABvrniA88F9CwcMWQz3TWSfwlTpLVMazbJDAno0k1dMGDl4Tq7ypBxzjZ8muhmROsvlYahuZ7/8HifzDD9oFdrnamszkth4jL8a2aJLL3GGM9PYPcXvE5xXDjvrGPxxipb3hOcLmFutsTK6p5Mrwsy9IzGfzMoRgLoMKt/V00KXIXZ+uvEY36+RCXbXLpVcTz6GZUkSHeWDkWxYjyEct86UqW0LCsESNCFgyPka9yoDZJTLKrn2nLijzvnRxQO5TwTKHRZ4ItFS33G9swxGbpVnT9FxTa3EE+PlcDhZ9E8r21FclAuASvx8jmlm4m49KKSudi8g5ROq/JAI9ZhMn51uGfctSnYW1oD0zkdzfpxcvcXhZKQZ2BjWwRO//O+VX7zjtOU1StrOIZl6l/MpUaL9kXJzp4mKzapt0EeD0CWFLRX524Koi03IDQKl4eyIwC4k6fLYxyTvPj89CwyJY/6CpTJN69YxobUw0tGheyIeaSw8XTO+klFtOV0Xo6zITjugWZcvcGbpjt0Vm54Vsk7GdqxM/X99fj44yYiFgOBjEw41QKxYYaVKMwJwukNC9i7gG1BztUqIJdUuNgupUaqbfh3dBsBjSlVjvDu9Ba3VaQWrAoEJX+u6lo/91z7mtaxTc1iAO8xMZwRdFHstZS8N3OU12qis4mSB6h9FbUVKnz25de3n+85j44+Rv9q5O4eEsd7tdrh1Q8XHT0RO9bSwe1bYzGd5FlsKp/M8BM/OUkzZZC8NAQmyQ2i1LzK0+ecD8SQKIRRd672RWFmY3mC5lWK66WMH+kafL3w6T4pXJWqCBi13QqIcoXzd3ZHCo4Rb4eIizqEo1gtK0vUfCObhFsCuIL7FwVLxNqJuZiWfg5CKxh6bQW3cyZ1YyfxkYSQUF2YXPMio0PYZk9h6/N+eNtyCgfy0xAeFH3qmpwPGMJ5bGjU46J8vO849ysa9ogPNDIEg2yZaWUUkpFSimlFIKQlJRSSrkS5q6dUbM8z3PD8qYnkoZlmOhlRhIENONYJ0AdYGVuai8oUiyefNHES6SYM7y69Epm9uq4NYwgvHhQpr9s6laBOGDmIKvibQdobfPQLc7Bb/8777ogKL5zdg1NBc9ylXeNPtSKB26GhoBQz8NyzOsj6yB8a6xs+vdofItpgKn+MXB04zwSxDHXnxDFPgzYQ0HWsicmUSDU7GJzkcRy0vR2FfgNIz+lnIpZZsCglTZdSFc7DVwd29nFlwy8ANi4kNGOpEx3BmjZMy4fk//vpcjbljLUuAPYmHkaTRhcHsMyM0eTWzrFDkDnG4cmQvrfYWXfxtuNLscxiARkIJIctbO6KtVYtQCbLXIk/CoO7MzwYoO9r0kRGckPov+G8YCfIVz1EGAN0KSaJNoYHzDK0x5ugVQugDJ/LvG82r2VLH/Ska0/F+tuhTq+GI8UPK3Q+UIEkX7/rDBpKvXl1PB8AbrQBYtHxxEF1tdwBkR+Q2+hI+qjhHTrd4ZxrMfn9lF/Uxmkzz1yT4uza+H7HYTtHpQNIxYMGcBsXr8vLjY6NI92sDS2+8N2jPyRnq0fbGmMeNAE7+8BhxYJq1zzROYxkCb1eOYQGzDWI5gR+6Za4I2HwA4bUXtKGQQ7cwrehS+8l7B8x0zrom4JcYAOaGkyOVuu9sWBJRgQVpFZB0P2XxkcgALrcBsOZQxOpNQq8mfJAWnHKsGmIq+H76WVk6i9doRqwt/HSLwvlXIgpvNbVMkrCgJKdBzZd+D3KqZqH5+NBIL81MLyXJwGC81px7EmL+No2m5ji+BsQkRdKtN8czxkifBGmAVByDWOzN5hShyndUaXdD7wHgwlN7pWw0Bm1wcFg21O32oafYKSbcmPMCooaXRIujKbyUGzIiZFPqCvIGf4C6yNaxqXB/RqSRpjU+gKzAcG5Zr1uPBZ5IksmfWdhmXbpjGe8scruI70w+FMLNy7/tjYB1kEFgMjjZi2MOoRlpRe7e+k7DVb5CT2e30HomX/M17/JHvyf1ZojxpOgqjt9/+Ah3cY7FDWOx8TknK8x2Eumz64GdksMooTdJWCQy/bypWfeodNMbCNVJ9/gh6Uj2GLzKoWHjFw2xVEQgRQ7m2NKOCCkT3ND7eQ80cEkEa2iYuiBEpxGex2bIybJKjLu3Yw8hT1hvc54f/09QT798IweEddJv59jhm2FWlvplkpJ52gnNVGc0P1Mj/mDVJaNLpxDKWfU/DJ6GMVRM/yGqPatUKXG6cWBIvVAzU9EPuSOOSwYxWQxfTq1nonrl4vyoPQM8N2G1Kq1qvAT1MoybGdDNPtpTFV+CzbfxJIPw7tUgHbxwltQunSEax03iLBSjqsvTOmck4mPaDMvOkrlvVMeSdOcRUzytAZvq1+mWSjBMcxBDeMJYYdFd2RZwQuoEBWaesMVFFndkAgjmwcWjJICj/4A2Lu7QlHQf7KoCEAoaNIiHikkJTZyoITvGV9wsmjCl9sCMMbhvgmcW2dqxaM4qX7pJqU6dBleaPqGKRiW8w9+Ytal1tzOk0ZM2LVe82tjjcxNG7cBObkqele/V+ckRPlcjd1qMp8HcltrDl7iVnVulKhbF6834bB+vGw/n0OB2Y1So7xNkAf3E7mkWQoIHMPVhPJMw65z2dpCVcX4mq5xZ/01wfJmXLlaHGY86RSuTlHTpmK9feGQhGRr/ux+qySdXWH316zPqGaJaD+p8aQc6akkU1KAkdLfOyEU6+zvC+TsrxQaudS2OEyGQcMKQmnlGbymAUuXS8bG4EiWupCg2DjAn30HR8iQ4p+nf03oQ5FINCR7A9yX2rf9r3UIkPf7dMnVVBz8Xx8cuQijH/feOh6bDPIdLHmq5mXvwX74Y3+7ecfG6jxyQYTNR0Tp21ZYnU6cx3ElF+9wPufEFRq4de+vOant1Kio0VMr4tppEunUwgd+n6Z6yN9DzugwtSv8L4n0pPTfAvyNIDGXj8X362a1E1sHS9F/Zg/X5y0dmTJZ/yEPFZfE7/ErdIMUOairpe0pfssVw0DQ/ktl1D1h0/xGXqLgqPFDQiL1jctMb6OPfyWt3t+9OojIDTAx1sLVMGFR+YObJ1tN5usEENbs+zLCWlTOlBqhg9K80OGXQdX6up6S5dfci/9CnT5iFl3/6IKhrQm3XKtsdD0mDZljqCxrsHUws3IBgpoZnvptKmhcMG11qWg9xo8pvcEsfoYuDNsmD9XNiwjT/JFyA+RGsQFFXrQkRx22uPkab+BzZ+9TkzPkJ6/QOtda5wr3XBSeefdyZlod9WmDO4ADvWP4UkO+lR4VBj4rmrnuinIV8NRCBFf+9f1kM8bpexUtfnmJpaF44xjWmayGRTq0laZhEKBMDYC5a3AfnYC01yP9f+EiBSlbQm+NGRQEJKS/euMH+yiFqJ4YUzcKgJHhOZv9bR4mIi126dx7l09XDgm/dYIuQw8UuXE2/nAtMPiiazD2OgblTlTamkplnkXXTI9TlFTlENT9Jf3fTc39+Zvu7kJYx8IuN7rj/dtbj5r/xK/jk8hjXkoi/wKsQGAeSZ9YoYD6JRFog63GuNVm3mohTcYX7PQMI3W6owrwxdZN8cQO+JQC1nPmMndnHBQmUvF26XsYJ2TLc8+dWChkyqOEHNgJCcFmHQBm6h8d7zC/dOkXQEFFOHUBaKTQv0Yi5s5EqdOfJAYvbR8JsM8UMcwTxM1VEojFe57vWI9Dr7UYZMnCU2CELzFkRYyjTIKk4BUiebxooP+Wi6vcBpVUu8tw50gBzyZiDlDikXCo01NnfJirrdAbJWfV1UXC/WglgVa7+QBz6Hr3qp4qaymBGaOAdtSUN65nA8+d0939y0YyCOPDPD0U3+hLUKYEogjWoHsaYQU96N2wxRBR7GMitKlAXL8EJHPJgO8tGE/MPabwR3H5B5R+dX4t1IwL7vvb689kuIcLyctD9FWW5HpE4fVzfc+0K+VWJP45UUV91QCwN9rr+mSDCnfY3A2U0pxN+u6OMw6PATzULT8YaQEe13K/DgTn+aurDEs5+bodpb14Xo8QJE2LdJ6NEARpnIRuENRKslssaZS9vE9Bz2yGkkhn7FWdwRzEbKb4InEXRYWngfsTL2dzokVyNE6U8ZYltMkbdzD+DeJUaMAxFI/0AKQEkFQwIYVRHh6LSJeMFYVkZVu1TVyBeJe5CKrAsb18WIe/xqO6/dN6NTiOlJxjX7xlna1a17ebFM2HMN+uBQKrREcegwm/q3rjyQp8GiasCU1Do42Q096s1jbVHtJAIn5yD+aCvCzXJSDJqY8Q+Vrr9T0Z7SqjaPRBpw7EY+nhwkqSHIQQ7bp2VTCQyP05daD0o845ysESLAtf0zkJOB6Nm26PFypQ1MJKT74efKG1HQonJymG5SMTw+Y5EU+WoFR3We3S81dgH8GrzesPSl62Kdivo8035y/68RRfMCXToFSciJVcvjCi+zayRa3QlHFPSZ5+p5L9TqHcabZ0W2OalWFrXTU5R6oDTWWO48640XOzQ58m5XR8kY2ZdBg7EFLh6aR2Bn1u6Bk1jltZqnDjHG1ak26xURHMaRBh136eNXUBiM0aBbCgFH+uXRiKn6cCQCRHZ6mD60Wvo3vEvaCKZyJYVSZguAg3BaGsCMmLJyQqWGYq+jUGBYE3qqinw34bBD88gqaTGNZJUsoZow0iAhXfIGn1/TunGk+42DxWvp9ybaX2ZRMRZZPr9hRig/5GbvE8i4sn8HFwbSf/yHnrU3GUQcp+xoxsUZKg6G5vZz5WWvG8ikUK1pPXULMuH9T0XWsAOzidXiJgR0o6VzfGrobOH7qKljKiYNgC0/OCPz+gFC6weX5NBfmTdhvQlNRGi2NAUXWqNUmh60JUMIVXo1AqhQu1jvCadRZDnBxFMmY3buGiW3jmlU2inn2XFyLygnakVb3/VjDYDrcrOBH94ylMvwUQklIWJy5MfJACzEpw2Yb1+L+8ZEOz4G+jxL4warcy03u1YYlKLE56fTS62Ad+NUgnVdl1PpxTpdgNN3ick46jTKZrD6HApCKQKHkwx6//6DJ/tVJp/z+Jk11xHVBsbd2Las9BwP2QrZ+ym054bvchBWXD6CB7XpsDqHlm9IrQSytFIeekpM/ii7P+fxBTwfuHk9c7U0Kf+LNHoNCvE3nbU6LuZCxhLko1eAmkdftyuJCbT9b9G3LN86YXxpIzQPZMRucJK1AlSulCLkuaeNoamJZJ/8AFDiBcXECs88dHTPAKI+iiMklec3HQm8SgNI6/13J8OV3PePkIL0WllxqUOVGm/p7w+bTTDyBOk1Z8Vr4LrONZZpc/bH8NI++zHbNZ11fgYb9biTcv8yu/PkLQ1wDtriZbbNzj8OZ+TD4Pq5rGc0MpWf9ylA+qa6h9bXtqBaMGnfVnPcvZZWPADy4idwJ3aT2Hh4dt1z1+IOlYb8mYVsfpvLvG4GyY2/ACvNR7Nn6THJfrso6qVLu0bJNYC8nqzd/5KONaLq1b96Qp5P9pFN5jKR/Aj7gSznxOh0NUC0Lr9BzkYgHv87Llvw/p6UTOBxU+5WsMn06PGz6snmX1aWL0LEuLGpH7ur3yvVW+1/LZYyAC0n3IbrK37II9NjLoLK5gvlyewmr9hI13c9FR2jSVNeCrFXQwiHLYKBJ6TEgzUYT1VrHLyL1oQV2Ntgpnzo5FvZFu6IDvVMu23ysMB9F18BOXETxGXjLknvCkz7twKjGBXFcqP1GWTHA7VA3COh4x96fymIlXdTsH6AyiXdBcU7w3TrkpkJKbGniweny1dcjTXk2jXkdtf9bzxhyP++855AZB6qsDcWbvIVpDKSb6oQOFlyWTX2eYL4OvfKejC1wWd/u2wqfQqihrS5HlHQGGUsulHbgFzaRuZPWyboQpH+rQ1+l7y8kU7d7RXk4aNZ1EZdFkdyIDGixTh9UyO5P6jKHIlMJXR5MvCd5Fjqfyq+xEVCyriad9jWyuGnelLBzH8RXcSGP8/7m4bfvP/aw++YD0uAgjMs0OzcL+/WjZK5f1iO3dHvqhp8A1XFcqmZt0YAU38c520UlguiDSPkRbfaHVG6we/sDfdEMvLEjwMNd69Et8vVujrr8ugeWd0jOBDZhEyFTlZjO4NqV3LJdtVOLSwXXQAw/bD3AswCPHTMaB8BX4utGNXtyM7hL20AEIh2JYHe5/ZXDPBn5Efy4QeTo+1Xt3hXKYzD1NDYh8ZAojHqfKZxDme3Eg3YGroVHgdH/yVOFgYFnQG4FKueZS1XLzAKhele8stKBnMWC5OK1438ZifspS51vF4OVVJR6ExH8zj3Ra0Grp5Dtt14W4dnQqwVi/XeTH5jhQ1pUAlIKTOJj5KUEgxjDbufhDyTAsCc4Vzk/adgIuoJyVSIHLWT59mFqDjgpngwPdGe4CX6XdgeF4I8gb0JaJ2S/vQ223VK//fl8+ubt/UksobUfuDxzjHHYhxHULhtT5hH2dnht6kkvSR06jtjdN6O8e2C+gOqi6/KjdMY7rnQTWhjLsh7GJlgE5AhuLAZcjVXBB/WkWnR5mowL+uvUjlAPLLej9r10w8kSSNdVpDrzvVZSMrgKbElMF9FwEYudM26lpxW0x1Cmif0ANTKZHCe9iwwaB549AbRnUwaOtNAwIv3rYhC7P6BZhI0dUipvXtAvyAp+DK/gQPIwcc6CM7t5Q2D1ADyYQ0P1VYHXfQXeK+aEDaES0wZs6hY6+Hi45BW6F4eInaDJpdh/pNPl3xpLFGrPvPGFYLjAhxOMtFN6Lazg8w+bW4cM1tnjyS+TjP6myhjVRnYUHpTyjxkmnjFWDVB69hQuyFRCQNKKWAwAS0Qx9/v7nejNSVFr/jWoGESsI2cgcj/SgczmNF2auR0XC8i1bxy3xyhniKK7nPmFJqMgywdgPT+KO0AVy0M0OH3diQR2ye4doRmuR0zz3xeAs6pYU4rSad9Mhf1m0QtVCiQtAf7Br9l+feO4KzlAU4qxV3oTYkWXZ+6NTvCizoknsaDaPr8+mb7qOH8+NEr+BRWTN/ECOyhO5fh62JRLlGkrPGUMURrm/1+pYB6AQdG+ZJ3foCH3ptXIkUkYnzlWeXDzs24QRvKTeJsFNi6LXQXuBtlxjqiBdjI7mYppU152YYTsyo7FXOseigCvhy3XYLa+Hkd5+MWNCRl9YfeHMMutgSeGStgdEkEpsSVdvtDTIYuXceuhugr6WaEb0cphXdLw9dfkg3Jx1P/ToXhOirTlXwdpIUumMhtrdvYXi/3dbVp3Xz4+XvynGt1ivoDxTmQ2s7Nygoylbliw9DeokgLkWO3kXgM/XHsTFtjJRc5Jc2mk+w6og0wZWg0hqwpVgWMUEHISwYkZ7uRZ+t3zxZBNB7eRAmbgugl2pndCvfvuT0rfqyg/7qFoeaX/+Gl2CFGfHPXDEluaRwZ2hH3ki4qN24i4wkKaAXOl1JDnnJqPeTqBnI95OoE8GiNVoAQi09ZARE9qMPrmSA7N1McoLoXhpc3V4xOD1rXXgXQXeYkrtLNOHPXkT6Q+uCaYVnXB9nX0s7TDUlIf8y6u2Z81p0jBh1UrDRxUSFFK5b+ZxYf9hi9u0cRlG17l7Az3Nr/ZX/bckERglKNIEvrFgdcEjfHS1NHQCdp1sjIo2tD8qyFapwdElTP86PkctBJSBUghlSiCtVXYnGRxWFATeltf+RKpVCtorHUzeFZ6t6VF521x75YimMT919IAmKBpxYuBBOBXvgsB7NW7lh9GpoqxyJ54sLOqOz7V5yE8LiRasKEOvoZ38lx01SetQD4xJ9NxsqnNcPvuCusqwDBJZFIkvGfh/nYRJfCLrcVv6Z0qcmWCrQhUptMJMlkb1wcDjqslduAnN162JXa3F6+T4S03fFFklWTWDoWW0mxGNG+yf4i/8F3QcKUs2brYyaQITA/TAvQSMweIOaLrEvCz9cAuv4NgG+vVSAOM/0EfqrGeVuO9sXTgLJq1cPjhjOIU5KIfydg2PIPVxj04E77fg5bmUMyqh5vUZhWdqbML1AG0dZPFhhZH9exCreUavQuYbYFkCgxSaMBBdE3/kszGPK3zH5Pyp6280wAb3kHguqRuP05ripDeUDJuqjOG8H9aTl+3GFlORAasgWEwG1USjEe3Y2lHOvEYcJ7ytvhcf35l/vyTUKBNskETDVD5agbzJ7vGkEQClbrJd9NfoF6ZS8Sw5vMmsGlRPWGfTHNtvmMg3ugs2kSzrhL/WpgWHVxHPm/P83rTn79NIwpOcEgV/5ejpe99kiwDiRsEqSXI5JoIwAyao8nzNJE/rZQDXnUDmlBE9jXz8Wj9t4us3XAIzfutBQQIM4KTitGG1RjhRlT7pRAQSsEZDqpVrfMVVfyaV+FVzedNvhkJOWKz0Xd2hs84f5dmnTrV1TsdiU4DzL25KSf596l0OoHA3ARRqKhHkisn6Fx5I1yMU0CmyCjlkyuMdmMjk0e6Px3nLyVfEHnZMFGmRiqheUjXCieFbZ8e5ULKRprDjIRArUwtSmw8xc35LHkeAg03PUuIlsmkZzI0qwrYQj/hizoWeI3OcuM84BuRaTGKZxvzQM7sHepdFcBVOmRV1Mhm4MgZXv31ELH6q6EvuMkgGOf/OrBXrP4sJYd4gfW6ki0Yfy4weFYyC0w5AWcYIHJMh7KI8/tRuvxWII/zzzHWpwz4z0zMbkcJtCSvRumk9PSOIEweIIE2kavWQKxP9MZML9YZVNWmV/l0L4zJxZ4J6rsxKh3/R409DO62VWZjvf5p+NdjdbHVT6VRE+rjnQF5/HTYGizJeC+QW9XlvFszciomvO8Y7ljEGivVTO572ueKRoRc0VKYeBIxIStFzp3YByP/GjWAetRaeUXRTXDnczfQaDJe5oldu83TkuGcB2BU1ULr8L4gS1K84ESwfhTdEGzwPDTq4/ESUHRjHURNsLhs8GP82BbFe8ZQS747vU1gsUBL4MN6DdM3Tw1RO6EQ7CCRlgFC5vJ7y8bFu1nMkojTVLs67R8AURc8BMl0fm3JCY5oIXEHcL/usuMQQ/OLmAm4G8hA3sQnOJt98RqGk6OH1FwJkl8tSBGGhWgiJ607LiyVSlxIISuP36akUxlKYq1j+iq5H3R0KaAlRe+vxUwKKzERB31oPepBlk8lgU6qMWqAz1z7tv7yXaQKg2+156MZhjigx/8yDywrwLqVnzIYkmowUiJlMTJUJOiYHPUoQCkpaSXFS9WoRNIMxrRPMgrBcG2Uv6uxdeRExvzt/HZoyDk/Bt3VmaK7bOIFmNc0uJzIKO/spBZxMaNElNfMEXMoJt7JYZWJJpv1vHWe0XsCM8inFr6w307BA9fSMioOVWfnD5Ci3v1373X4v2zQl+qEBydw/b/qHOvQ//hA/lq2T1fv5Bvwn7VXq1P+S0n5Jf+Iv3Ls/SMwx+D/MjcmMO00zRun/S8l4etCgdpnVq9cBL+hI6sy/FM+HjJkk9qYnj1YHhwqyJyxW38NLv8lT9gA0AT/7XmUwST7tbSe7yKpHPTbsYpyRiEddxQXY/SSTmityg4waV6VK3/Tv/UH5z/Ofm8yrIbyH61gtK6SO6l1QcJDE1QiBhKNrWcHtFqs0nsqPYFYPd/k/dyGzc72+s0eWe1XSTMrtp9wLVhhvyb0EMA5ozpSDu8X3hJh2jSPSNX+DCUPZ/jrZK63oHrqr3jRGm6p6fbrron23ChgF/l/d4qAoilEdSCVHx3qhqmzXMlfcpX2Y/WBzheYssAdzz6tJoESlVFofaj88EQJVrlPzRR+ktMw8XJC5yj76T2xKa6v0+JKGxm0ro9jqiy/02DFls83tUUrjcZAfyGWbMEUpK88cLw9VJL8O1b+i937FUXoenJ3/F6Tbdjv7i5/Hcv9xVTZunYOrotWFcVVLDyE/X+yFGiYL5YjAz3/Ciqq8fratk9u+3yIXB//JCMAeht6wyNFKZeU+8Tm2C3ezT58p/8cnLr7Fr8NVLbfpMjRa/m7uX0//y9FqGQm4NON9O6OW2MLerae8LAwR79VCbbRbsVeAiY5Ff/ll2+aum+ab4n4W4K6XRQvc2rP/Z7Y2Zpssi8veIQWqMRPKXK+657ZHKjm2JUn26DnX+BpPWmr88p/1tlaGXgo55Kye2umpHHKZ91/KQDbRPEp18/X9/fN9T3e/unfYfxHkzW4v0oSYO8LmpZG+Mbzmrmz+MKB/P+hxDx6YleZ5zW5R1TiT2m87efojrffFCpqTVGCPyk8h4EeUzoBhZMlXv2qe3sN2+w4yFVYl2QDB1+zoiUH1qwi5gJqL0KtxicFT9svAcwxfD/jY03NglAd1gSk5r89PUwSag7NXNA1k2ERGts0KuLJgNxPhFcPttoheT6XsV6+VoEuuz77fCjzTCRHLeEEemky4xnMCyqqI4CEhMfkCd1lOMQzF48gKdS90yUPUjuQ9U0fem9xI63ZujibjNoSl10hft+FQ/3pPrPihs+BcNWaaiJXqDQCDx8s6HkAZOrfQT8yUrxD45nzfm5jcwx1lR5F/TKJtvdfNYra5D83nkIaE9VSsIGORRhxt+f0zIaTEu0oHeoN7aggoalQq4f+3Xgk5p68ffkhd36y9GWqyZOrTyCONmaXDY981d48hb82HOgvtweR1ZRbHQviOrYxgsWmrd3GweXFcE5/JCuuA15Sq+UHZLJcL0hmJUTaX/PFZJGi9VheHE8RBLtqKOdeYcrly9g7N7P8XRDcv58r+lj3gvzR12LF1L8uk0m99n5x/BSz/lmFaMAbUcwcUHIiLQJ89okSB6QTUbzaxDAkfJYZ70zx2tH9kYYzEytbEl8BoxlhHakTeGGPBQP8I9hYoasT3YE4nmzPakx0TwHvrbBMC6RbUfzggEAtdhP7mIAKejj2tCKnktdBQw/QPv9d6po/66wPNoXHRD9et/wzLrvpff17+231PDwPv7dt9Zjaj7hbrx7Hb/Vxq7xP7/df+8vV5/T2b9zephu3ny3OXPnbj1hs0qf8PD4ua9rWL2+x+Fp99m+ZI5HkmRPRK8aZMK6UH8TMEj+JBUtnpotWxh865Vr5i66w5j3dxHrmkq5iY7whUlUC/YotqaXfs3XJ+hM7kyX9zI3Kpf6SSdowJNMsk6H30eSOwbhVuWeYuSM9Miy4c2kfLgU8TSif/n9/xTuLwj3pg8XEvadXFhWfLf1ixEHTF2PmgXTEOPDg6YJx5IulD4zOV00HkJ/2c3fJ+sSFNSfWvNfmN+sX/t+bF9aXfLDmlZXyr3Yr1nv+te4tm4FLaz6wGXnj5ZZr58Xiiave96/Y8SX6oM03m4lLbTZcTfxj8QaBB6r9znA0oz/M4nA7ox/M4EWemhoj0wWDGglj0oWRGgZj8oWuGhZj7IWFGh6jwAWB6jujzgWF6jCjzYWVGlJj1IWBGg1j2oWNGjJjzoWzGjVjyoWjGg5jxIWeGhpj9oWb6jYjz0WKmjhjz0WOmjDj4dg1oxr8w1g9Qxn86fACQyT8xFgrQzq83OkSQwa85qmtsgtM6qmD0jG94tkoIzTdwTCpsheM1KmgoivMwkUNwzAMw3CRwZSoLgkWua8ulw7pK0FyD7pbwUdjAkz9GHmVsfQ5v3kYKg8VUcZNZ87e+J3G2Ux0rYsA+yEYjgvljbODoBcl1XFPNrTvVduVkxNCXfqZdN0DGsHuWfrQi8V+A2dJztrMJp1DdY8dWP1qmqx2zAgBEj1Sghg0D+4w73Tmx7GXBWNOFvyDE/FhMYvzcsoD878yzLg6mAQmNF0wt8XEpgdwrnafc+bqRZ8MkH8HhvyJMYcFCsU2X+ZF5KPuRjwP4iUEY+JuI8rxx6YtpAMwrTutQnl/uE7hdVD2miPYvDecxnQKGwIf4vySag36kZRU/lGuL7XJ9sLt40NnumeOU74IO8s5kz8NtDabYMZ3l0Rv4QLw2WQjrgO1QXsYoekqizYQ4DB2vzXq2HYJf0kkH62g7sMnp5ZHqgpsLNkTLYp7hqhtzv6JIUWi37AddSEhO73k6gj5UztKM9YCD8YSkrNjYE2ocG3YvZxUp88U+qJlMgwn0sZ/bVpGGvwBALftMaBWkAdEyXDUAijPRbvsWtIajMeJHaEClPkkbeZ+do2rA/5p3rtSJ1UnpLcNMhsnK/ij7Bh/DD3adowUX0JU4YTONgic+jIORxKSwvyqmodLSFpi/jEqLGX4DLjt35A4OhLJVw6rsvbOoXsLTBWxnZtp4yCQ3p/FnVdnru+MolgYmWf/jS8Gtif8dGpvyY8yXG13SWul6OU5qxgRKhseh9h9y5/DyONb7iBLNK0ER1EWrqIglxrz3jDakWJyHXg+D/Le8nRyZiusfJMcO41liOjoh5RjIwtIzs4zO51X2d4BeDE7hI1ZdS7OL+xlioD1Vc84SRKWQxKoSEfWIfHLQudRvdruUvgcwrceddI2FVUkFJXxreUluweg92efZy47X7aG9Gw3PSy8ObEEK8g8ifB1WNLzZgFW3ov4PY1Sr5vt9258un8NNFGjealLsIYobzy8+1zk5Sac0lETG0aARe6ixlz0sarZyR1CtpvFCoLm6WUb0iN9PodDzsgqInkuVY+Jmuxj1sytdDY/d7SVbabC/hOLwMKZRRU/fBixGTZwdF3isrRLI0XSYi+EVy8LWhXzPuPxBMCh5uQaee4AOi3JufSAqrsfjdqroZf6dzOgCY/pqvO2JNm7hCpUstKMU9ona0Aw9oeUjo/OuDI4T5GdZXgHmDaYIaL4I09UWYq2WKTHl2XQPK717AZvRcKUEjUqTrzjB+XqlSea97iWndKFinuERImOQvxj0Q0aEAS1FVF10Tj4k6pM1ABssP9354j27LtmqNYfEFl/co5onhwxPHn8e2OMjh6Y0kOvz+t0kK2WFA4nIW05cuet9RXAkV7bNz8v0ZQYLejNdBDDMAzj9uecJi/yH7vmZ9MdVffpt6DTdXc4e5YwEKmA5XqE4ChE5j9mb0wYol1e9Ppu+7m/O6l7TqUOsENbqDSlZreESZazJNGKOs1GAuntoy+jERhRQb9O8fmY6onZNFJcuzANBSkhsYcOkWVp6L73r/ljYN05wimH8STOmmc6M6cDsquZ4SfYfskHGUIZ5qF3vWIgKixilKSJ4kRC7z15JcncggB1LAWmrNEsqMvSLPb8jmkKN+TI2UNgvqVJkOQC/p3IDLacCc2keX44VzMsXz4+eWE/TJlM2xG4QxiQ8OfEojoTl4QTxOPew7TxjF58m2dtQHj3hel5LsPuiEgSNx4zQy6fYS6D+xxELdidBloX40MtZKV6fjQ/kkC6TW8oO2vBBlj4vYYhI/WysEUGU9TC92vaEvMlHuYwaXb2fEO3zxA2xOm5UfSRwVEa0XXDTCvXzQsCryySQ6nZ4wVqSnT0jHpqOsjcvovzcNbA6QbhmKziI7oPBV76WZVcsqGkGOeOqLP3Vkn6rji+M4Rx2XtNHKXpG1/JvWrvx5T5N2pCSX2V8z5WYMatpHAvWxT5fZ067DSc4o0E+YRq1NO3xJv7UbxZsw3SnUek2nRPJOnRMWHuoH4gi7z1iJtuO0Lr3dH79RQwn5yE8ZZ5dJ6GkByS1bAc0LEW+D2SvLM8vpehonOr8MRa+ARcqsSMDBfe3mc0cJZ07LmELgAke6TNa7LRZ3f6qeFhlkOF5sVHRUm/ZMe6G196z6EWDfTkbaESf6X7NOuQS1QCgcyvKzYEDJ+9bkLeGV+UrWNPA/xn+0GTbE6zy/mb0NGhsvi4+dzBjZisFjzZEdH8uLJMRI+qL2MWkbBnrbenh0WSITKgM0liPIU9SplRC3TRuYd4KRe+Z35AIPJ27vRIXFp3KM3/HEQuyxLFRslEYLiwE+fxjkZ+uCg02g/1ByRGVI8kPZ4HXF7L0cleZzERbOTKCf0cEuTwdhqVyEBJNClVHYcvwCSBgXbf6TKnNfN3nK2HFkRgzFjV5nlZZBa9uP/sGf8mzz0IXPA0aHzX3p5tQWreWINAh23xeTSxAlNwgUpWyO+iPmCOQJoQIrJTQZEPatLJ0G3f4/hs5uXbjgjBTjoJQdYoN8NMUBR+Z35Yy392MHDOrtMTRPq7nbwj1zhDOmLQco7nuWrOTYsxfDXb/ek8vfTQgYt2uNLeRUL2903H1rlEb6PpEwvmgHPCB9eJuzQ2SHIhRVh6+WMLFuN73iWX52Y+eFWcm/+F92HGLs9kfRNIvzUEHRs8aXuCEVmF66L7NV8Rza1fCci2LdO0JIy6WW4S/NzQC11o+zFRyMc4aQ6qTYheLtwJs+l8JARnxJ8wDMMwYsdgZ/2yuwttSRotgGJm1kT0yQIIz13MwaXbwybKmaCiKcyjs5OLMXRMYLWlL69iPOBofxWJMxL8a1Y7z0I6reldBC8AP4qkhEWLOr+Y3U4ceq7o7vDMC84e8pv2X95LZzUxBQwoYnmpGwdfEbR3oAFvyDDMHAS2lHeiIROUizP5djpRVfgYokZTpibS8338BEnybSPXYUfGIELkqrirHqgSVI0lEuJGf38W2PunAyppQHYLidoAuZ5h7DnKAyqZQW6qln57qMqe1OWM98vs5zc8wqPzQZJtYiwBMpAHUkE9NCcSyBpBUPPBvVRXIWTDnlySjqZE5NVC5pmWXX9wAvzk1pYh1UZZibjFF6lhETcMk8QV/z3DJtunfyLvtbS6dvh6uFnQL/Swcg3iEEg9GRTXnEnc9wojVUqMD9bB0FpVY7V0pe2C3aYH7k8/5tKdeJs9EvOias5n4QuJWq0RcA16zcSEx1srD27ctSu+mAXIQdlmuc+a1H44ZVDa6mZkiJPl+2/OfFOP7p99JhHjiiaJTxrquOjQc+EenYS3H9xhTm2fQcdObuIw8c1G2Cp2j6Gt8Lf1tgxSzeNrfNb+c3sp3ne/REnwKjVP5h3sWub23Cu4XbQJV0hrN/Md5HsX1UH1Wcpd5yFK/YJDo/SyeKMaVWgvevWTdoMG/ukgrJRxYv/7mVytFYnHQ4EfZ4gXwBpOhMtDFCRLsHFDZiweqmW6oSqohiHg6MvjPYN+ZkvkUEPsRW7lDFH5C5lGl+l3jtofIbHjVU1TSCBqe39ZCN/k54R6VWeLrLjkhV2Dt8a0KOaEH4m5t4tUmtPbtZVlUfhXOmnQHlaOcmx8g3eN+VPoc7mfWdN+FrQ8LzAtIByCnVE3YzV6nmCr2Y08uQGd6fDDk/KcCc9mfNiJnQXE4kvaO6FDe79oyoJxN22NZXWLbQBXOuAn9D0LmGDsage6t5PEqVjOzfGxLrnixaWUW+ZzqvtaC8lBk2IpTLC2Lm4XTkxNZsdv/cUwUH9UvJPCHwcBD6caG9JDuWqX6oIXPsldqb1mPyh6vQWqOEpreV+t2ZhxznPz2hrsAE7Ln++YUDUYF38pk8ufmyaNsmJHlLP15OA3z3wf5qXyUeUwvXF+iu4CkyC08IC3UmTRr078GeBJ7CKJAoHHq3fkbVAPnWvOKP/j7DAF+pe+Snk4K/qahgqqKyxoSSy+xun1AwhLZm6LFA16gXio1NRfwFjbdveiNHZL4qT0Ap9m46EHo+MGtIa89xpgUtTBjPal81xjPYnbfhTXyBX9IMCdxIXO5y5oMS7KWOHrD/2wrO9TmdwvwCtsVu2+ldawrlWYaIiYcV5pM35yQkU2i2YWh2EYhm/PUb8b5A7YSC/ba5FgotFxRCZwJaJqBh+4jmx5DXdFAEoYsLPfJPDy2Y5BZ8UB999/4v47VzmlqBtqMElizbiAan+f9EDL7yQaLxbk5dDVmqKjYisxk2pqMTP/1/+ofoZdjY9GfJhsOblL0/DUcPko3FDQVLT6vnwA808MvZXiUrBEXfshXE2CKWbOP73JMY+R/MNPxyEC2Psy/aHEttTQjBXXnKYfiK4+XGqsQwKd8kTJjMC36RQi9sG3rx/w2FaDvSo2jHrLYcETfLgMCMZ+LKhHAk6mGDbI4/JUYYNSI6bw5ZqViG3dtfj6TitlCeQ1iGCWOleygWWmJWwKBSGaIq/DysijnOJ253TSrRiPpHBLmBx/W4JYeesj5K9QDTEzBedIMlA2BuOjody42Js6kpq8auwWzVBgWzUq7rlGdcpq+SZdcHOlW1rqmSTbFaj90n3AlPWm9pkYOYSaGeBH3zlzu143LIlicFyLMY471e7bqH7txjIFpXWTkVc+oHrrdVAgwqixXgl9B45kxD5OYngZOoROYICeK5BiKcsoHXU+Fqz5gITt/SikcXuN+yJZhAmQcp/Avj1OVlRGqVc3TyHU4wZv49m8Cuv9wWaeDYSHDjU11pd1FZc0wSGskhh76XhfWD6RL5/v3+XIVA4X+OatQ5LckmkMtgCbKt33iXWsQOD6HNix/z5dpXgfIpxaXNRYcYkXKz7cADA9fsNzG1/CBuvJ/b/H/PU7HPCOaVkfEVJoIUOJQAkidSI+hcV4db2lUyja+pz9aavziNPr8/hS9pFOhaQPK21H10tH1Os+tIlqCPFoaqjr1OaN9P3KyPwFrR+nWqhONHvjDv0DqwVlXoGBOvcb4khPbBIBMQHht4CwUabh0OGFHX1qyy3cDtPt9VqwkjqBhiBV2r+jVZIYvjUYa0+BURE3R7PQoINQXtmycE8+mlJMAgzVM7US1MF1nfwgClIW/ht3E9RcdjNVL5c5CpSLcGgW9ESfQDdVD2sEzRaeLH81QIrw1mEU3SeTG/qExNQTm5ydAKvZuygoydmmdhNno4dJv0OZ57Pw6r0CxJB6IHiJ6r7lp9GiAJ0zxdf5ZPimSse/ISAk+YnheGsHH8hFynbAFz0Nl9hvGqfKfoDmgt0RMBxEDgqgIefKBmQ0tcKHo/4P8pmEJr6+mE8yznLzfjcgj2g8n0uoLfXc2DUO0JgWusY5QUF8eDtDVS9cMhj6rS8bW6xsPuuPkNzV8ALjuIIQuExDf285ck1sBXauZK9vavwYpFheUVK8do6T7brbBLXX7Dz01sYb6LdqZDorDpHe8vUKzt0YlZZOLIXXRw6mw9CB+ejurAscibnqTY5qVWAYhmEc6ppaqnJs0xMifPX/r1AK7D/221HO35s99PMUFbcFKy9bPW2jkjqMdgm6PXQztguFzQKENcdUQQ4NTJfqdHTFH/donCO4COWBQtddXQOiyH/LGuxLDx8PPh+fv+7hQX4XFp3LzpVqL5z78up0W1SbiSLIJ96TOIw2bfehevmWj8ABJ1rtTKuBGV+tGILF7CzLEzORWxNHbHr9XrBSGfk/rkLEAOjJhCowLlkn4swu8l4GF6JyY5Pzj2KVqpM3UMFfiQ3ugSH/C+Ipqd085Se85pRjA7FlI6t+s2wkdx6wk850yE3Q2a84HAEr5Y8eYDtGpzW0V/ThufUmmQdpKZTivLowc/npeFMLniz4/uT8Dse6qltBU/2AnUphGd60MSO1Sn5sDSGyCbyK4l9WB64+K5cAge7mSCmUMBcmbKZEaNdMUjb96dnnBpl7d5SQl8JZl8PvRdQVAOUaJdxE0pB30cUW73aU/8QGoCtBugt4GshjYkzkx/k5+LfH5LFCIPz99OVpY5aRrNJ4mWqemD8ZRSM9rJAwUw5c70QDnEnoNPYh2PBCrFcd1+VzKq1tEJ1k282TtLsfX89TqYILioBSnhGFy4LipXtoPLhM8l9vtgaVdnMqdGKev/vUwT+bzOP2YeFYb3EnMV2RnnSVLTuoSDy5OR/NlRnXG0KWq9d7fdsZbqF1+Hry6XPEa5hJxVdTruj8i6UuFunPl8jKxStiPrSt83pFjVOok5J4cupHDiQyXlvq3lqAH8X4+QuDEznhdSS1UeeweHC5oAaiOQ7RdgIKeCrxatDQDrd75yj/4FTg6TZ+BX1njJbCtxesI8BaUOzvx9qA6mWSkN6Fe7hHUfg61w4z12TGTYNfGq1UoKrERGykAcsNeBLv3DPOnv5+FEnp4JgYIlHILGgdXEAZh82GJBMY5w5fajuDiW7qxTg2uhE2m+VC4CBxk2tcNH8w7HdKpI69zhlk6+spj77SXB8+S0FuWHvL2IfMHlPSNqUfinOBtM2effVBISj2Y59jJDwS8wDo3krokIMgbOZGleVS1gikGmdCWk1eTG+RRma1+ZPcWJ5gJyMcUTXfU/34BoboZI3ILVfnoGkTv8opTqfsuJpWohjw6GEXAnMGzD6RPxCyhLvDb9W5kgcr5Yhu3TgHv19OSiWVVxQNEeDT2ArUSkd/EnhPxknNKyuyYhpDirYU5w3lSJcpfFkvRCKymZftCtvjiDgx+14r08T1/0hQogMdKCZBpe9rvYaK8Idsus4LyTU73rqJB8hZv68Qg6ii8AtZZqnjTTNDTnl2t17HbvOP5sUhedrAJtQ0vpWahACfcwlIRXCP6dZyj9W7LJN+BqVllbbMfUn0KGSgolQdvIaKo030rSV+SwUVXRoQtSiWnKhDI/h1HOoEkdG4QbZyAq9o/I1s4QTdjMaIrDhBKmj8F1nnBFGj8RXZxgkEGs1kfRZ0AY3cyK6SIL2gcWFkKQniGo2pkV0ngd9ovJpsTILuC40wsvxCkM7R+G2ymAjiDxr3Jlu/ELhH49lkw0TQ3aOxbmTLiSCdoPEfI7MniCUaWyNbDQSe0fhussVA0L2jMRhZGQjSLzTeGVk3EMQPNB5MthkIrGk8may/IOguaSyN7GpBkP6h8cHI0oIgntC4M7LrBYH/QOOXycYFQXcADZUs94IkaMwqiyiIZzT2SrbuBbZonFQ2REG3QWOlZMsoSHs0LpXMiSBWaOyUbDUS+I7GD5UtRoLuA42FkpWRIG3R+EvJupEgfqLxRWWbkcCAxlFl/SToWjSKkl31gvSGxnslS70gbtH4qGTXvcA7NH6qbOwF3REanZLltwTpAo0/KouKIP6i8Vll67cEHtA4q2yoCLpHNDZKtqwI0hkab5QsZUK5oY6cXKFkCSo3ODHNsXCdCW1uqCMrp9BlCRq+ceLV+8KYCZVv6silU9hkCcoSJ8JjIb8SGtbUkZ1T6F8ltFnjxG/vCzETyt/UkR+ucDVLqHzixL33hfUroc0ndWThFNIsoeEBJ569LwwzofJAHfnLKVzPEsoHnFjPsbCcCQ2n1JEvrjDOEtqc4sR/3AoOhDJSR46ukA8SKh1ObD0WVoXQpqOOFKcQRULDb5z47n1hUQiV39SR905hfZBQ7nBi8FgohdBwRx356BSGIqHNHU6881joCqH8lzry0xWWRULlGCcevC9sCqHNMXWkcwouJWi4wokn7wv9JaFyRR354wqrWoLyCyeWHgtXNaHhP3Xksyssagna/MeJDx4LqSaUr9SRsyuUWoLKDifuPBaua0KbHXVk4xS6WoKGQzjxy/vCWBMqh+jIG6ewqSUoOFAxEkguDQd6RgYkZ8aBA0Y0kkvmwBVGFkZy9jhwi5HOSC4XOJAw0leSc8KBTxhJSnKZOHCNkVFJTodGc1m/IugaNPJMdpUJ0isaF06GpFRMAgPJSErPZMCAmaQcMNEYSElSrjBZGAP2JOUWk84YSAuSkjDpKwNOJOUTJkkZSL2kXGMyKgNWJOUGk3AG0kxSRkwGZ6BfyJdbnrIXWu4T0yA2LMTKmLw8PiZ9cjV0+Nux6fznPy/Df3GsOuZfHG8vGv3fmC3Wa39m1ZvG1146iW08ppv4r06D6G276T+2z8Pt2ufctfuCNT8QfgHbxWb8ufE83f/ieFj8O2tv9T+Y4M+sx3FbrWU//VeNT9bW4cnInYuwXWpfV8VJ3B7UbzVYuqbKh6WLHKDLPKALYyhd6UGgPSwdu9s6f2j4wOGROxjKg6HVzREd9feAM+rIOPoy35mxMzmL+eTWnCunO+bCqc5wLJlzcLITGsD6TnW4ucY/f9WYwUVZeewXAlVVG0En6w5crlxwrIVTK77jZsk39x67pFD0VA2ToL/YQI7o6lfGBpncvJf0o1Uzy5s7e6pSFPVO25NLpTpiUNkHUg0N3WmmtKftRz3CcutSudiZMcuw36Id9xsL6hZHnRd9RRzf77Xgzlt8d/m3eWcs0+yBm6gkLzhuk+CwSja14bpirqKxuIn9qWNN938cvPO1icUPnoOdU8vNHj+flzUIyc+sytLSvoxRsXeddmcqyeBUo39o8CaBDFn1WzonOimoXuCUFqEemWS+OBEn/Q3zkqeZjDEPXOL8VfdKp2xIUT9zR5oZnSdiZuV8oF8xzfLEmGkeT6wyF05QGcVOP+C43jL6FaAH2UGYmLlxMu8qAdmbGFSy1vfSBavJ8nzmMS6J/bdm/vvJJyJaqQiLqGkn6JNpn2ixo6qIxay69Po9O1JmwC3wkDxTHv3Ljj358oHBuCMVFtiTRhbKPWli4XwmOSMeSBWVhIXv2PbXG9Z0cDvZ1zg68gqioHc4R95DBPBsQ4LEsV0WN1V82C/DYV6oqbY3/Vw+AHwZTvn/QDurFMdYEUuDNkGZIWjwmJB3EDv0DhH5I4Qog76+Srk7d0Sn0CqUL2zFKxxH5AJxb2gR+QgRK5wnEmOAaB1aQXnHlI4yHGvkDcSj6Vu5Q/4MERyeF8gdRJrhmFEOoIpnHK+R+8bHcJ7p5/KEfDCiSThHKY7BEcuE9gLlA4KMx4BcDfGkeocO+dYQMsFzL2mnjugmaCcoR9jJPuP4B/nKEA+Kdo78aER8gXMlMYoi2gHaL72MG/nOOP5AvjZEcX0tV8ifDBEGeJ6RkyHSHo5LlFNU8RHHJ8ijIbbOwMMr8lcjmgWci5TGpSOWC2j/oPyH4AIeL5FvDLFzew4gTxUh0aAvjZTGzhFdRNujuKniExyfkXNF3Cc0QW5KxB7nFxKjGKIdoW1RRnMj3zOOP5HXFfGY9LVskO+VCCM8fyGHItIJjiuU2qjiiuMt8qDUQE5xLn8jPyjR9DifS3FsFLHs0d5Q/hjBhMcWeauIp4neISHfKUIqeL4nadfPiK6Cdobyw9jJvuD4F3mpiIcJ2gXykxLxLZxPJEZmRJuh3Uh9nt2NfGUcv5FXjiiDvpY18t4RIcPzO7IZkVZwbFB+GlW84PiAvHDEdmDgoUH+4kQzw/mXlMY4I5YztE+Uv0bwCo9r5J0jdoPeoUX+6AgpVBpS7rIjugLtGOXbbMVrHH8jF0fcL9A65KMT8QDnfyTGoIi2hrZD+W2m9CPD8RDyxhGPC30rn5E/OxFqeD6A3DkiXcLxCuXQpMkMjorcM0WX6Vv5inyAaMBZJMZgiCVohjIpATyCXCGeot5hiXwLIQbPGyl3lzOiM2gLlErZyj7iOEG+gniIaAn5ESI2OO8lRoFoFVov9fnCuZGvGccK+RqijPpaLpA/QQSF5w/kBJEqHCPKiVLFDceCPEJsRwYebpC/QjQO562UxtYRS4c2o/xTghkeM/INxG7UOzTIU0NIMujLq5S7NCO6hPaFsldb8RnHF8i5Ie57tIDcjIgZ5zeJURzRTtDuobypKVUZjifI64Z47PWt3CDfGxEmeD5CDkOkFzieo5wpVbzH8RfyYCKgn8sf5AcjmgHOF1IcG0csB2jvKJ9KsIfHJfLWEE+V3mGFfGcIWcDzo6Td4IhuAe0AyrGyk/2M4z/IS0M8VGiXyE9GxAs4ny0BiNXmQJ+bezRllOgrlV5puVs0ZZQx3TD6gXNyhaaMHvc+CoEJ0HvUct9QZluUKX1S+dhyz9A0o1Seorz1ouXelDlnnJw6sq84Kxs8FZw53TF72nI/cYprnNd0TOl15zGeapzif5yDXcvd4anGqdOO2v84l17hf2ytNyVSadV4I5to4X2KKQ6ifBKN/aC3QqpaJlU0s2BKHHVIlYPU2GLrC2lqVfuVhqgykRho3MkQU5z7T6S5tbVN0sJC+yTP/TAoD1Jbi6ZeslbNfbqJRqaUJQ2Nci81rlq7S/QGqEv0e7QLAN+wJ4wBrySssKJTAheobOhHO2WpmyiMbdxGF/iG3LsTF+Dwa/SVTXiO21jzuTgJp3U4Qoc1LLHfgH4bt/SL/WllmepMs0j2MY0uNVk3SnCowz+RdHJQCY8r+vHYjK1Wne6cchyir+1I8vG00KPXLv0GONVn9Z2OmDCw8eMDqMfGz6SzWsM4BLG63mFpxttT2sXzk9O/OlzsNMJjOk4XeldEqoPabLGs7U5ntzgTVTVv1Ge97kwutjXf4JX/TrFq4u/8R99dvJaL9TQErTbtxiT9vGIS/5lY1xrL7pD4K/L3BXns/yXf7sfdtpnD5ms/Dk31nb08pNN2ubkpVzs9uRz8wniz/7j6M3y9fqwO7Ph2vou5k/42PS7qZbdYXzRxv+02R48vZync1T/j7qLJ43l5meYhhWFazdWP7unXSvYf+bRfT980yXyVxWK63H260NfW63EUNXs3J8EUIKeAbKEwBFLueaEO64zA/Uf91nqNg9bLoN4cP/QmMoLvlEaSrJ4NPvk37L8sCnUEqRrVCTvWJUIfL2+qSzZRI7hYpDe+1wn8SqYhlagFXd7ml4jhA2TQ8w0KrJzian4D3mMbNRgLGS65S1pLoygDbJfyFU/mKErmsIr+/2QgXDldCyAQbb/+npQhGRPgY2jQi/fTDo0VMlxhja/d3XpU4g+mVvDwIYF0TDYnEKBOkm+U9j4wpOMzTvgnl7ePfyPD/bxOXhq2q+YbanqipRtby0l5kKh2LVR9b6vIHxSCDIQSPKWzFwaPL7pIYxtNS3GcZnnb3+d58iCBQBkygh/ayE5oFT0toq7iUe8jpKvvTnSLKcDv73OfRD2FqyYUNO2HqozXApUI50Z1iBfriR2t7rhJ6gVUYbiiFCu/ImF/+z88w83yrZ9ifBf/xpO6k8SHFrSTt2sYXYtCxgCIfqQbc1XOcThPhKyjVrNfK4/jz7hu/Jrq+IavUI/xGRc8I8fD9VIeY2drDOo8393UwGRoBBS9VpxPfUU2JbZf02zDFF6YEhhUStBLHWHi9+ISkQbJKaQSKchwav3VP+c6B86nZv8DKD/ayDZ+jbrtxX4tGa4lsB9O6nLxywlEDMfQwxyz0S19vXSd3L0WGDGLtz0jjumKT9DFFcog3NWy3oEX5bKcDXcrzR88j0gauZCbt8E+YDi5EQ/Pjic3BIKi8FOTDsXD3OomrqXTRcc+y+dWzVOFaMroVaukJJAQId5cPKRWD/NM7kDxcFIhgUA9diiPnjEIAYq3FqMzRfIjUYNsKGl1rb2W1C3I12WAtCQT+0QXU5LhvZGjlsDnwcPNtnThJVKsgrRHcCfvNKFG3Vyj0CbOoJIGQ+oFZUgqvUunVKESqTNQsuyqSSVqqbsQzrMHzG8rB+jHJFBJm4A0c0mF+isRqLMi72rYO6lZEYouE/Xdt9H8eGHCmh/Lk32W5fx4I1BXiV2VJc5E6JSpWuFEVLoWSVP40ahGVyLIYF6HQgZP6GZCD7Z6p8A9RpEeQTZVQLqL4ti+07HSosdPmIHOAQr1+/BK9S9N0b07rSUVu/JoqqLFoCcnXbcaf3eTr9OSDA+JdCac5Wi5eDxJx6B/CR4gzdgn/qjq9q83Ep1M+Lu4ZwP5oVo4udDdZJL+g0Re0HhFY+zqu78iB7TgMt38rUeRC42SSdSViP5LEnpBKfUpIFPsid3o87exlmxjAE2qsepK3MLibhiFBiqOo3AWvIrA3MersfLehEjRbBdpjaIZMvWxKdrexzVZ0vptZ+52CumYlx05Vgqp2g0nN5OTsbp72yehELdxP+/p1XYgp2yeXsKpPSa0xxPwk9olRrMw0hsByAf98ZYN1R82dV3zeuP+wGFZhmOcnOTaoG3UtLNcf2jnaVMtbpUuwm+wcugUvAPXBl35v/RwXe13F4k/9TX0/oX/VKPuroM6h7tYqQ+ho8765rc2ctFNOBqT7a9pxHp2MSpB0NCyBDnZ9cbXPjh3K0Dv9mgFPyyBt1NBmjeibL5YEKBMfMCFPju7/LGstqRPBPjcFIxtMlu7JA/U9BLL9MMJ1pxTq39AgrP77kxuQ4P9q5i6yH4e8jzK70jiZXBTPerpgnyBa1oMRzcCBbWkjuleTn/y64R/9tXvHm+3j0eopqSmoCVquGMFi6BlGQEfoXWzCDB70nDc9O5dYvMWm5NTfz4R0/2PfWuXRdC6FbMQr//Tv+zMGW0lCXHvCyX8GF/auZNLyZGdXH6WZvkVor8Zi9i0mGC5DB/AOHBneetJcl5BdSW6HSw01Kk1tU4O+91QijXnSoz0t8MOiQamt1aN4eamLWV8TdkaCp0wLVjOX4jsGqH4DcbiLq311fUtpDvIIzDwokRLyW55RygeQUGOjkBMYBL8P62Eyccbp+lqsAr6s7+CMvPIB6DMCForJYS85p8lsPSNxjhe1iixkLp6e4SfttoAXu8E+i7uUf8QjnCpCe+g6GZSZICFXHDzi1+eCg5u/Pir/E5PH4Rp+hlJ+bGkzjZR7cb9if+LK2t6Zjk6mJ84LUqlWFyABH+U6yjECy1RrsUZqeLHdv3+ZCB7HyB35Ha3tx10K2lVrKU4e2a10EtnhY48ZvGEsDjhVVXX6DHc0SdI1zRlz1TKSOzj8fexT3p8keP9y2Liy3F91vaK052T7BpuXcLibpCpq3YqjRfQ4CsNBvnoRBq0p7H/hNLgeADUzUtfLh/8lIl/0wm8ooVhD7PnSfdTByfP5Humb+3zepcCtrsno3h0xh6YApdVhGGiE1Tk9eebKvYPkIEL/ZeXkTH8eWNaDnjXXRK2PIffU+fffc6POGDpn0q2/oob6qpZml5XE+SJm0MQv67o1tXa/FFZaUe1UMLcD5sFqHiRP2RmRaql56BYo5hN58IMoVvmbBAWQRhRu7f+hk969spX76rXy6U0pG7GbAPLwR6f4ScO3uJLjOKaOFIjXvMZyYoBiBB0BBLKNYs7Iy7QeFFSnSjHU0DKuXNECIThIhfaJrtHN3HhtW25Dv5MB8TPlg8vHWKw0MzpX18xJTZa8oYEFo5lAPeHSfzav2pjgOWVTrSHmusR46LxGS/FRCNUqL7KYXUf5gbTooWzTZK9yu6MJdaQYz3G4VT8LqbqaTqZ0gqd+683DI/j0+Ef1V2BH1+lt2F4LkqOSEjrEkZ29fhbYRDmnIO0THxF+i8z2pYr/WNAhd5QYPWzqYwBl906tTcBwwTyWc/OUdbOnfvI685qU7H6ske5f1oIed3auW8fAG140BzltoT+p/QkKEcjXRp8Grc1HL4p1O+ULIrFUn7hWbQhX7nfP1Ku/ck40Z+/A/uJQWLMsF0w8/uKpv79dqhtjV/78/diWhZX+teIbYT7AeLf1J5KshUhjuX0QblxLnG31fMLA8oKwmWBctEvZnDGLBL7X9a8ylnIpipMlZfGhqLv0C+WGXXjl0F+XBkbn8efW/Fc1D8atzuX8UfDb1Nj9NgfX2bOfAU78FnljoPD5TFAmK5LT+LOLIYYaohDexGQrfA8HcA2K5v99BMdGojWlLFfAUDYezbeX18/hUdpcZ30avoe134PPc2Dn0uTtv86FpBJU7vyhQTz9In3ZW/SKbuURmKqU34AgpRzHwkAvnFqPbThYZlFlD4mh8flGLhtAcTl4tXrnrMlBEcAypuUYvbSay1MIIxMyoXCY7Rp0KE+uYl7Y0I+p4B23shmy0yKAM0FcaHslTY9f51xvpKFtYNybuC67s230qVjCk2GgubH3pTbE6rKaSZEXzEXubncWmfrcy7T7HJTEDWyvjR43E2KeHlvWft/LQ2dhsGg91biXEQnMlJzfdWOubZks8PyWjWHW+ZN5XpKmQOtDf2t2pgqtZe+sFvYHOwmq39pa6Q6X1Pu8rZ6435IzZ82JFU7LeaC5naxkDi9kiG/+T1sBTxVUE6InduHhlMXbJaaCXnVQWV01IVq8qGWUBsL+VccpZDFVnUcwxNWdSL88k/ZNEucYidCWOrsl695v5+7wGUvfR5fzofBf/mDH/u0t74f5q0r+VMzvKVXOpkJ+an75vvU9EgL4UefNT8TAtbbMMhvwBfyo5dJ/ypsgraP2Zsmy2/apeslSg5KUfwNwnXrf5vTf9Uw7Hl9MK/iXL2zbv2VvmC+Z9y2Md3m79YWwxi9jCIUV5HOHPRExrFzoTviJyAffGgl3lQoadaxv99aK71i30/rc6nNh/M6n116Cc74V0f+lT5j953kj6ZtUk3Ne9DdeCgFCXBPAgkkkFsLpBRh2a/rX8f40OJTmN06SloyojQX29GHnxO2Dd2qjuSJ0iUBB1DgR1XiboeKGBYchHPcm9Y+6zSQjR9tQ5vdKxlTlMT3gef8q42wBLh6Ap9vHMwH9M5nB4WTSxD4ump85W5hI7z6JZMDlL1kuFBktXC3bPmbXTBUvZAUouG9wQvwvkrlz2X3kDXeXL4+UboNfsPN+LjfFkzTYWa8VtYOhd0j5uYT8fXnV3zMTpQGSuci138VvfZLKSVF9JBLEt+bDVYQTRPK1yVnKcRVgeN73/NLnLkMfi6WglP4zgQlgbzPTJ/D05CxlQJlXQU3ez7H8TGLVR1r7NHngCZtv94rcH63DfBQyLW1JB6J9AdFEkgkt/2jTNRk7hCW4U5hfY7AEA8PzAJmrdDGCl4V9IRYQBKTNpH5fOOXqPtVnXFL1i5LZK4Vw7axXhsLRiD98GakVo70TiKy6R1xkGwdrwSusTpcGp28o8SAjykDIlcR4vuQrpMgUi0ATT22nT2icpa3g8GlT1w6hEzt+F5XJDpasq3etU8UOhQOWL9TwU1c0ejkSPoZXbdJRaqTETGc9x2GWpQ6IRC0Y5ORW6Q60ajlLVinqN2/3ndLvFQzEqmO0FfnpqpbKXWYieq8Seup1Q6xXzJZyzTj9XLHOEbkcol1vUWlI2jf1k1RH1vuGvrw1XMQxa2dhqYfpxz9onElfp8vUlkdSqlDZOcZTahTubWT+AL9UqB1abVjIDbF68C9l1Yxjgb8ulAkXeuplNp5t5QNaz3ThRKNFpFDIU2aertjXCtUGrwwonMO/pVeqa6vLdcRoJLIrtPkiNS5spjo1RElsc1EHf7Y8HQ0yR1yiAld3juFN0GyjTU/3a4vWDwUxFpneRdBPvzn92ISVVgkpw/YsloX4v43+a6AfSQBeBqEtA0Jc2YIPoGNi0/RNE5DQIUGMRkZQ+KB9AwMlhGrTVzMv2jZ6rVaKBVC9e0x84oAP2z/y6fsbSTwleQ0yPO+UzaPuvB/CWyobLVB5vnl1fbPCgwyet6NvFgP0OHuzWgkfRrGf9lvm4YV8mf5TtJiBUTeq6d5Ix45VWrkvzT6omLK1QN68hURG8AjvBpJBTfm1YXKsrE+oKEEyryiu33l8whYYi5dyMxu+GzENbMJF5zI3JE0PhyvnXBcETPuz3yYbxgyvEPfooE4h9vSnGb0VO6MwBYtQQq6mYsfvFiaOVhJlqQPAkYT+VEzmGL0u0fSearp/ocYD/ihwUxC+eHJsWngD45RPkagFwvFqxF3DKWFm1LgA/yLOCh4JRwIDZUME2EQIseGqUNAezNF5C9HLl4ecHFJA5MFnoCImLfyTtPqyaXS+eEm27k/T97VejSXp44XRjLCbLcYLQjygkoQGJsuoBb5vaxKneFe9Qtbta1nFfhnqS9UgA+fZbgvGQGyaaW19o0pFiRb19oCrk3zhNOVk8qXxBZcEzylLSIKvxmX/7g+K2WTjfl6iwwF/lvwd/KHOe9t0UGxLMo8dGrjfM8WShdayhcPdQiMqWeyLeje/4r3J+iJ5Qu+oJ1pJig3Nw1I7V219lEiZrnXCkfTkfALne0aCQhyzzJW1M9cdC84VSXnUn0YOXdz8RRA4bULJg+8Ld1bbsiSZdaT0cJq7oP2MwUx4lxB+1msMRDnHht3oLTonu+R5cIGAVoOzv2j/SZRQN8RKlp3IThENY+1RZfXOTlTsydI21sQ8Beg3IH2yQSdUE4Zn55KQxXfzJAak+CD1n4Jmos1/YBzT031cdsbn05rHpdn1DwBl+25dxRZmuei8NpyDNHDC/6mRpSfqmtS3uctAVSoE1GAPlSnVzk1MVh4paLednMce+HCPBQE0pAFw06kjn/NNwGb+15aOz8+HAlmhDCf/b2xxAmzLD1hH3qHIlmAVXI3XgcJXFaszSGYJ7WQr+TBz2UWExyAvgFA4KDI+lYGfgQe0CvW8jOZy15RCJl3CVIHcJRxbnrEAQ0acM13scEshB+dEEVKy+VdVqS/t+mLdVZm+ykq7A8o7MEVF0xMkPGxQ7EBt9cv7yoWGpDE1PQnUNoAAlHFWUPZAhwFOQYTf6CiRYzXTuKlL7Qg4AAS7+7+LZqbEswEdZ9IF7SlcQmTyhMg0AHjkEeEPTwWCzMr+0mXYDA7c3853ARWVMAA79UgJrK6OusHXgA1jtCtMhDkTchGDyQm2mzHegGO/bXBZtIOyKLHjcO9HO892GQy2PlbbIZk03JnNiCY02GYntKqYhRuFdh3318y/plw/Tt8jr6edbH6jLvOsUBTZCMWvvXhWK6+pAqqZHoJ9ggLGTl26luSH1egvbG3QHYEWeKfxjVMcIKFa9Yktjo8vucEVDGwB9UxcgwBYxF0cgszar7izZgrSzuZVLsXxrdnCxgJ+zyoWoAJRmo3f41ywOAAixMEM8hMHSfQiqyXGM70p9VU5f4lZti5L+olVGalHaU+dgklCe96VEzoiLCpBcxcZKWwMeSRnPMCIbzmRrxv2V5+m8G0iok0FEUv6836f6YIPkxe6Z50bv5B1YEuH5ZsgvQ7OKmGrsQfqWA9/IVBO+nMh7M64llJbzI6spBEzkn/6TRYv3kzfE/JUlN7BrkEIUeFJaVLdLGvGLIfPgSUKOD4XsmcmaMI1dOFa5QIpd3FOeCs/QByGtWYS127EFGo350/MmQleE2e+Jk8yACshFi6tj7ClmY0jYZOXDQRabHtRRPKawQ6gihuHIqniS0GM1gmRlUN3b4lIbF+LNhc2hE6856JULb+PdV7Sd2Gf57bVtOJX5We0Ltkg3uG2iV9EtFFP+PHQ7Dv9UPIznHCrA2G48GqI0vBlFUfwK/CWAz+84MA2JlTJZGG8Y6n11lDbFOha67t9OkYt/1oKQFJOmAkNiYmoK06L7gog8QC/uKEuIO+kC2APKtR8dzQnPuuJap5ZYnBXCnkYzhMbyRDRLUE7DJxEl1QTOAsJP5XhDaIQybEymbHJ7NaMAhiJd15mYBkIYVVFOkfgS4tYJ8DSeKmEqXeXCcUNQC+EMNgkSWNZbEqmaIDsFbA8IS3lMtBmhCPZwtyOQJiFWfZNI0g9s8V/UMe3KUn1FMj9wQ6VAJ52kerxy9BfiHwWY/fRjIH0LBBXaJVzBk6TBlTFsBTLuhzkKLTAqdJ2LEAyxYkdB/0jDYTuQJE5kF8Y1RcWEJ3USTbO+mcCZGZPVNHszTuOU2mmZ1WHYWM1Sbx4T4nUrQPDYFIi4q0zcOl5aBAwWNe57yc0XwJEoMBL1HQglKgMPH/rY/MkFO+L41iGYdVTQGgBag+oiyNAAuk4A6laNB2xYnh5hul9SqJ7Hkp8votIiINBk2ieClQnN9rJlDSEle6PONmby4hcmHe/I1R02UtFvg/nHxa/zrWmqOKcbVGtRnJ6cULJ0c3/puL/jG0cSprp6Wg4G+S+5q4Zy9GqSWZf47TWUKs1ohwkOQyOh+nWIWhZu6yTNeWGYQ4ZEzXk1dvoGMhUbdMFPZONE0xY/QmAxWAsYnxxqtIP6PG4NlNMXBpx44JRY//GrrzfsIxIkSzEb7LYNokgCt0Hh4diSD2I4HTFWMxwgd5yc1sMFSsORkhyvIciUWaj3DbgrMIhxMhicOQzbCs5aHZIUJjh8qqbxI3/Dx72OPhJC5RFybyDokUiwYgvXs7MHJAnD18NwzZ0OHTixcddIoHs2+zK28FrWlmDe314w0Zyqmon2MmpDZaqWVuHpMMps3wLZcrS3jTFAjA5qiRtjKZCvxFrlZc5XU1mMZuGoAKS+PHaNyQvEbkbNtoC4qxtAAuB5/pOayIwNxgoIi7+VHRUCQCa4Y308KVwyOvSqZ9RDC86Mtji6GavZUxA6fJ9/OQkfnfwp+i/J2V1c8EO+WGwpMeVxvWeWX104XqQkQe1CDgi/etLaEfDKoMC+bA4tAeqERCaGu40RBW7ZC3AXkY5m+epTEDXr/fkEquCYg1+IrgoUrEGSw2SnAn62WaQJ9IvaHN7JzCwq4V4XmAEwLPMWo1W4j/UcWJlENYpQ/4A1O//2be2HgtXXMinNF5fHc1HsiRyezmN5wCIHHyALCl32Qg/x4GSPZ3WmzXA6d+x2g96EwzmtjMOFQ9jN3UEARxlrP5H4JpzC6UEDR6NO0tAA2FRtfzEJH5uzmfaNHDYycKYifxNtPqFEka8mLzg7OUnKBOktA9o1l8EX+W7hUq5Y3n951FRYti93tPjJ7T/85m0RmiBScUP2zkQn8IPIldzt37/vDDvwCzHHwl2dkU6+PyjyiqQfvrO5eci66Hp8sSHNn54O84X0XyR0Co5PkwJG6Q8lYXpb2IzJCIBgMzo3hCO90uuCN9gMiZsxDEGRLAd+nZqPlyyI5Xxrun9uX9wh8yqN3wDknK8ufSrSg/4W+z2w2hQQEEyik79bfLRiRUzgHBzZtCiWmLHg3sVVwYVi8wawTbFT+jtfTnb1lACexlOAgJJvOSZwtFQuIn5zF2jDHyswmsNMyEYTbU4pFxNaEUBzMSzS94GPFQOHDY0OBJzwATOwc3iTPOfiBnF1aJLmAIzI4ABUSeFpj/4oNGhqH/QNQZV0A+asyxF9mgf4oFN9OtMsML2fScoSBPGV6AgnyYBOU2xksS+MNODLV7E+Q8RlgLR4+Gb3x7GNWfh1aAm1pFjWIXtqPBT9Yh4/9OtGh3tlv1H5Pg4LBhwS1ndVb1WPWb5FvVUK/6I93I4W+WXnXmXrWsV8EJpJYNHAmbeuBHhMuk1XWOlYtvhVecYWzON6ceK/GEP2ng/2NObzlGv6CWQtyQag0PVxNM/9DtbzRN0wFZ21Mwp31Vl8s91Y+fgRn3LptE/sjGQNaiGByuyXKvrYXT3WUuTMy9UbA03AVrw3Uwn3jUAH+Y1uUxcjJRY3KBxczh5fULSXIEmM5ov8AEYozQ/+bfbVroT4Xxh/oWz/PgxMH6KADu9++T+IL5rRjaE235J3GeYAhI8fw9y3YuhTJ6KZSzlu9GVb6+7L4EGYFpaaQKkbNo/UQ8T9pR97zWp3cgWpRcu9udmZo+kFG86OHLL175Jphh4fCD/+D1nqvf5gEkXVCmg/PDINP2GXFu4N7ClGbkrLhLkSBwBWolCTGicsHxPFGyxbJl2bkwVb6gFhajIDesQSmfqPQHcK9NC6tm/ADnOzGui/ZAgqUXm3M5ucWt/hRWn3ML3c/aHVy3xVx23efSjHRVhAd763LNF1YjpYkEYX35dSymjdyC86qXvHlzPTitThS9R77iJU0A3Q6BGd7AlrLgsshP5zsdA0UKdFUN3z9wyFaE+BluzPuN7xWbbymR6Z8FxhsSZTix4tMKRYtlEN2Cg+yxETsBuu/3dS5S4qcXjT4DsATXIbz3+IzxUQux2yLPsDgmj5PmOUsMQkYaVZ3GCPvxMGIEb47oLmGmi42Txu2IWffGHIt4tv/R4b7ysWGZJOnJxykaKQ4/aWxag2ZJVSSov42hxwK5HiqXiLIlsO0GLIwta2scsUsttnv4zKCBYS6FVHmM6UuY72NvWkLnHXWXSc+nBTwOuDsYu7qW5JtPcUTFlS0FUrZ2ALY4gIYAJKApaQSmGj8BNIwFGZYO6KV79pwame2xONGZecJyTQweAnYfjfGlloYlfhHZWEc2QY6Scw6Y/E3Jawr6ubaTH7Ibpq30cxPirDX6ZjLLhCimaZGPsjjC8CYr97vz85jK9grgUi2bM2SZlehRBO42IlmDA+DDtlkXYi+sndYKkfxeptmGCuxs2mfw0sk/ApuLkTLqnnL+jL033KK2N970inDuikN1X3E2X4ptd0mvSVRk8JkNHU/VqyU7k60ZTbbNjstxgUcpzLNptUjDriSubCe/z0gB1LvVqY2wrqu/twi/DJVhFc66jhWaolCr2TRFVwyUXJSRfYLGT8yO0ojEzcz7xmaGO2m4TWSnuHZPr6iRgUUvYTAV+hyrXU+T9PeGiC1xm4jVPo6/g5udg6H3JkuMTimV6Jdi9gbDyDcFq903LYIuKvLa7NQHbiP8+W0KQrF8maYfoajtvek0F2mDvgSjarG40n/0gcLP5CXU47NwEz3zTNEJhJSSYntQIk2np70Ut4U/58pjhMt5BYqeVnOHuFyX9Etr172ircnErTqi1Dl38e4/aPtP8RIBxGsHyebQd7HSWKozKzLfUsVaWss7oWhrQf+2NZ8wMmy8/ZNW+7x7BGV0Nc859xyOTm5UpuWmroj6i89cCA48wG3V0SfAIeMPNXMYqRCmUg5k6F+1ShuNkTGbXPm/5zm4tAqHL0B8GgWZxhFX4SU/usm08c1Ao9oKy2EyTAPSM1ZHy4SGUQDAjAzZMnxAsM0OoRVCErO2SnNxzZu0WqnCHox2n8OC4hnGxRz4guIy4oLF9thU26tfDn5/hItBQacxg7d3BljGZi2a66Cz+6zz7Sn87ufoF2f9bU6b9s2vwrYp7//+lZotfjhkZt4W8WKEMNykFRMgmJGiW0YeWJPKCXslpjFsrfQrcONotN6+1xy4MXIo6AnM2oXUHP0tVF293fJAdyE7EI1obdVjZWwlk8LkF9796b02nytZ9fMcdQObG58Q1Sa6EePigvfw/ZwVmTdyZlf6vQ1nhsuKlytNaXJOK9FRRDhqxcwUPCrkSA82+UlMKLBQLPFaT0dwBxLArwDGHA4RBz0c4orpnKF6z0aJeWTAWHfQbVPM8sriQl+cdrfuvUM74j1q1/P2zAG7LN7MexHYpc+6ppTvH9tCIW2Dr+JxtbZV/jlqh8yKxW30jCEe5LWwVRMyIn+WlD1aFP+8mzmrTK9EDyKTsEfceeOchVdZrqJohCwVIaxWYJPB58tkuYEDXVLjdUNvty0eP3Y4knRr3Jt1+EjBVBcqp0Y5J8r3b7j7s9LI+qu/cvcWw7u/dBBBDpfc0E/uiX+H2eNt0KMrtJp1H7txv3jFN2sVUYbmMCz8DM01f8zp99dU8t4+qiC+oqGAUV3X/aOEP69le5rfn5s5G7D8kqVZTqxM+VqOR3cyD/3UCKbQ8vqjSNN0E5XgRFgYSiwVnMviy01ePEvHYh6xS1VJyAg1KTAXgRYkFc5WtFlUvmxqcwbj3kUKNUjOqBUDFvdhlt+b0LfS78BGIa0ea89AV8FyJKSYhDv7i9kCAPKioVYcOW1o3CoDxUeo2I2gg8LGhTfmdZSCsx1VS1j1pn6r+qT0KszHmxwZM6ETSS25FNjm/greq39XtJkzoHD0rADl7Izm23WaT8VlYx8m3xsR7vb1c03Qz7Zz8L3AITsx00xnIje1TshB6QBIlUaxKVLwnkuXo0zSp9GVVYS9LkAHD759iEt4U54axMqPuePg80pB876omzqrgKBGktC/5i5MYmBa2pRWdYkJQIeNSRjLxnBP1GJQg7/Qvmlc/ur9cLJaWR+cA17IoPeFnE0Edx2eUE6br4BWNk01TnNqmpdIc0qaxWhOXdNKk9HVfA3BDb60Z4bbnoI2+78puCExWW+2jGGrLMY3xWwMkCQHpobByHDsHEyWTa7cJBP+DBQx8shk3x5Fhq2qsRyTRqN5hW3q+VPQcHTcOPKcrg8E826b+KWam7ydIO4f9odUWDYnpN06wzql+0mdFtY9LCoViIxojBwZ+Txjn8JmGkwjiqjqN7xBGati8sm6fRi0kY0PRk4vjxkZpxStPD6tQobrphfNFzjVbD2BfHluXWE0p3eZjyfWvv5Gt3tY+AUyzyajvFKOe3tkuAEVeHYrMmx3HeQflhfZ7UVA8rQUIOLHGR3DTZtDXg09QNqY/tbeoW5fBCKh4EqJ4FKurTTz+2FgjlQB5qtb9L3yC3x1vXiRbkriNtCgWlR8l8dNK6FNdXudfQU91nD4fLJergct5M2oXbZvFpvUp8b4cCuuWpf4gGBTm+zokshHqDo6k+I+YnS5W5SUrxbP7thrZACjWfkSlvxvNl3kEl0q52mkvyFWbGieeB7mbO7SMOTVaKF3F3Rbej0ObCwo0jxETzo6vuVuByU6foHiFO96ALKLZ+zvc27SDe9JsXj+WXtOSL62+2yRCBRlQ0zewIXfhXTB7bd1+ITlvOI32c54DzhiN3X5GP+p3f3o03GATk4B6m98DmdCmv5FpLQBXje1Bz8cPt47yjeIqHZijtpBHI5z0pQctjAFWLvBS/tFFF+VZSxP98XTZqswkSV/1RkcvqbLdiLpee224HXFbojP3zOsaDx+O21oPCEPnFGD2oWUwWvWw0fxRgjPjEnEY0MWv3hJM8TfiIB0o9XVQ61QGgd2C/JXLjuHDLZEKKLlHrKLq4GCx0g+VIMA4WE5FaklP25a2+0BdnGekfb7NPFJ+ZvCRwWKhzdaThBRK74/sH1fNuKOYYMJo6utlbinMwvSBCvDgWYI+JcTOMHUcnCIiRLuf3tpeHj02bT4SRQTbpTiIRom9hD2uAlT23ABLiy/DPDMOS0nnSujA7m4LnGjfqeqwy8GDptik1cbt2MVfu2aIE8OFcVHE5LUFsBFP0Q/wtFtdrjmQEMeuv3yOoCBVslSjOYKdzLiXmwQpKQPnX+WxKwztC4vPUecNwO+0ySgNq6voBS8Y+mYIF2R6k/wjKPrRX100I0T6sdN237PPXVfpWd7tGCaZyK7dvkdNmghOFr40agJUuhZFFNuymqJYkK4RnaB0pq+/7qQUea7rraCA4T/sLtXI5Vz8V5wc7ZR+JgEjECxdeezrCqoMQ4yCG/Lzg84nggVPaNZnBgYd7vDEWFIvJmbfhBrqdeDxTMdH+1R9VX8ocvR9v2TvsouYjCSWdRm0SGUb1+hAsXRApI5/lE4sYl269HXmQPsif4lGeqvrT0Tw3NpyL+rpR4jqTiu0w1JdDmSuDt361V96q6aGhGT2aVCFMXvip8eErgLqiio5g5mycdEEJJZNAKamlRgsEuuLisAH3yy1yXNlCLWlXvV6g8UgZxZNIjqmohmZyQFpG5E/CIUyFhF6GraLLRtf7i6xyWYiIN0d5NWyyE3ktbh1L6PShIL0dgkqtsROTEUcAI70nmiZB/f9EivsTwUBKspsEOWfn2EjnMpSvt40ihVNYSyHIlF+2AyAmZpH4VJWwagwLsWVGHbPiw7aZRTSLlOh2I9YQTKBU7O4TjrxrhzxtXHAqRbBWIyobtxMsyTW7aEoz5B/o0BrxE9guxthPju+p4DSqiODnQK468Ht6LNygqAQ0ct7NboO3gnPbRvXfd95zQEIZBI50jE/xhYu3KfLG6E8iDp8Qd8/PGyFWRKoCaOtCvjWijBsIc1+6Q7d37iwUGcH4UcsiGOYtc8h8gm6oB5dA+itMxZy87UIPaHyrC6AKYXIqkh7jeNIj2yhXv3+5VNZi1OcI5USbcVlHEAek+zFS0lESQTQ+k8cTCJUtSxQPMglV5NOiumdjCKsqETiXMPHVbNsDD8zhAlfpgrqdINyH1sn0p6aB2BF1lhEBLVk2Omw/4+MgadjImZDixDY79q94cYOgtY5KtcFDxomzyz3XFkMU4HWulPjZkfgCX2mJ3xcJtuKQAuqzPsrXotiDm7diMSDssLuxvE3FEYCHso+R45Rkac890hNh35Qk44EnrLcvJdkBATlUWXKcKSvQwPpe0Kb7zxSpbuS8L4xEs6P8GVlDDB8T8z7BjIkOkBUmHox4WqMkflQOvwALSAemO/QmCIPdmC8E4iz9xhs6Dc754rSYNWIpAVZbPVFaIvIdEbx6SPW3JoOBZTEwo3IhsEWpmQ5kMlijpov4p/cqJu4xJaVVJQ7IERmo/6Z1CLre1+HYxnoI2wosUL2o0LZ7riR6RH5j+A/gsDHZ38xKTMLQHTHfyTrTDEi2xCPecRJXI1FdJ4JUb+VA7yqWos2IbqzHPmpFjyeyTEowLavBztmqC1MJBDLMdenOdQx0Sc6Lfe6UqVN9QlIKUWDwDiUkfrQDuHqMFq4+apw/7on3XmvHZ1Ycu9eq8C4Ve17b9NgCBAonSslY94AzckF+HNWYz4LtEh6W+1FR2QVjBtU3wPC+H7p2O2mPE9C8QsfjslSz/ZrV9AGbOsPYgFTTcNUe6n8kuhFczdhWt2wXScWFsOPKrYUkxgPcDojQT3LDPefDve1+Mra6Ai9Ptun8/hKthQbm2XSboGzht+p6vp++PZY4hlCbB4KrXIhRN2f2Jh7oRE43tY3OmuZse/yOi7aIOtS34+iaMIA9o5MkvS0d7beKrtM/sRE9u/iIF41BkGpYfmBn5RNWvLt3AMlnN7ej9DrUaPx1VaJzVHuZHfoQsCbOUgs4A3CJpm7th0OamslMim00/IemtTYZ9LaLTvZwMdzmUslKSKnm5f1rs4mRVa/JZEURzKwURjC6Rg4gUcctJmxlIxm4Ku2xH0WcAuNU+9DkGIjsMOCCHEIdPI4XWgS6rvZx380K1KL+NyGNJeFDQfJCZnOdsmYnOfWQX1Uon6Qi+vsFT5UJL+6Ka+wd2EhG84fZeNvul/REpU24U21Z4Dd3I1iZGH78HCPoOn5G8XpB4XW+NJXekMFToVjoAQm06jpeS9LTTCT+YVU4TYaXX//HDz44fzwvn+eWPMDiW8y+y3KmglJuBSJbwPnoNEvAyDpSh1ODGmF4uhppyvCercTVIYHgOujT8/L4mDpN6OWF0WW8YwQpV0EQ5V8kWdMR7zzu8iNefCybqM5mbZg4xm2/OLBraNRbL8olZacFIpqq6/N6Gj6vmhkBl5UDIajaaqFlY8VqljEREjOF+L1hsdG8AC15WE9+hR9jFAMX2RqGR8AsnZtCxFMv6k0DPPVLxtXMXlf0DQQ5xZcDQxTOoSd/ZL1sUQyXp4hmnQQ2kBxB1F36iGKYyw++JJozMEHzewgcZxavy4VJ/O2YC/s092CPAX4I5Gy3KrEwJqcB8DkixBZXSJiDAFc4sqdG9Tmzblcp5gT82p8uZEmnMGB648peTIncRa9JQmkzmS0cNNScpQt2HnOkMzdXnqRpt5o0Den6Dnq0Yt5aEtZ2Ti9Tng2FYiwZBHtAlBOGp/0Pg8AsK4i2dDvkzAuor37QIFtoremjpVpE/1Bb2s+K6W0rZj2qkNQ9myJZkK9MWtEnKLYBYxYxgmRbYgurr0beUUGPSBaddGoHRMtQ0FeBvqo6WuNM/AKO+WZjat2SR2grICebUe79u1HnFKOv2ZOMMJkexBJYtKDwghYSpkdgM8a9SfoUcftntY0gZrPPzoLIRhHpikYAJHpxel7GhnYpnaNuRkdtrZycl/qUs4uxJIuNSsUxBkisHRpZcmFH9KYY5J/EDM2s+BmULvX4dcXr7eP+urQJa8R0c7nUcALp7Cx7Q8TCwrhyInRdQJWy9UUvuzSxS1En/h1sxDJm8wme5X/FjIeINIMdmBJryg/JnbTa1kDavGjYoY5Nt4PmbDDQ1ZyHCCGT2SZlh8Dk8q7VsacCLZcN/byr3GXCNCyMqzSOsY5lPoYHNL0uFGNVODK8onowsWaTN5RIFu1bNcKWSVpLqt/EPVkgI5GLYCrlfYIJ5Oh+yADonlGvbO2otGHfr8hCxWji94Al8jPsBnaQQ7Z9DDEgU8SOx1UgYy6JGikeoquECXvcExuS1yLuyGWWIk1u8sdcR25rdbOZJ9zqDMozCKBFxDFE62M5PjIgvaHDVOp9wv7rMu7dxWusBcOrB4vksVgKVJmnbrw9Y/9vi4vNVg+nuZTW7SyrObXyo38H5q8EJ2IDG4P6X0DG6VwPNWAaJDHKeHfKvMBnw6XMuC3Ad4M7HUfipx2LgGYIx8WONm7MlJTdciC081I5h4r0FipxzJ8VmkIUk4bAu9dNuAfTuA8ewdKXDBLY1wm8saYeRmdDWtZ3KBofV7PAjSCBmyMQ0KTsp+OxCMUbQ83RsR0RsUZKLc1db3ZiEUT/oetOHjP+rQY8wo9o5uEOcNTZQhyeVN3MQ/AwzfmxDnfc92cL7kS1i+9rrxhoNXl8+Z3d1WPEN+JINuHWcf2+dDS0tsI7U+jNk7SPAkNjLLW7QBEn63YUx/P7xMI2Op7ZgALkNtQPl4MjmN93fHkjkiHCF5hHLC1zDpAo7lDUOfvbCYzb5o6kuVaOBI0wto+p7Zj9PNxRC2oOBYpzV2mFoZun84U8MKeAxyRGOlmf3k4khosCJs/JZIcEjAAW6CcA8Eh29Ouf5g31iLL8fLhYA/sbUt6qmVnwvM738ZLRJlGbqp5T2iimtABsnIAC6tXEPdXs5FGDaDVjjywZkjbcHRB9LaIythIR3MgPQfDFyR1ySuwzP7icPhMH+xxLJCXL5b5RvZgfyNDVIzSNM/UPYTAcLEXyzyBdpOfkFyTFPUCdTUfjZxlC6tEk70FxUHWRDqGWXC37BclLIY2dLU8YPSm2onRRk20YUd6r2ZzDEmhAiP45vmTxznZ5GS3GapbJm+ticlQU/tZyzn/97o0hdSlGbCy5KIbuQ+CqKF04DTmrQwBwRBceWi7+AcGSgQaMSvLNSKT5rfVzFTaeXZ8UkugMPoykvIkoeVt7SiEW72/aLTzK18qOUz0Bxcep95kjbYPzhCJXglHvpXDgtqxUO6Yqp2MBQrF/+i8UDyPn1YV9uvPA0Ui4e4fNlJapvIdxnUoMnIXH7PzS0OBuHizfAfAgMbvGaU4GHFAPQfjw0OxmF/pVTUE8JKU9Oi1ffqSanafqVNNQylSxriDyf4h6DodAH38QRb9fkwVxtDc+WGm+4FjOmaXD9xxyAFjNVrdcLSiyME12Dof0dqTB46kakd8x/j802xszefa4FWRgmumizF1IibLs0cyIHXxne+w+p4aw6poad4pi81la+3naSE8mtllzet6fJrTFX4fzH8/uGntqoBrXEnHFH1MUkTHikrPStRAl6C4CqJm/6cMrAstx0vFUAHSjCItyDXAl+5iC0RSG3tv0DX5LDKGllEBiTBiHxDB8G1J6xhTC6E+z08dQg76/qt7vu9Wq2gE2hBhBsxIcuDp1uCoVUz0t4wpmeVGIqWnwmCQzaiw4JhjdgrhnTECNVor4RhM19V6HW0cFCqZnAEofHCzQKt4JsBb+yr8BSPEG0QwLWpsqIGuWDWUZSkGGMuZiApgynd8boaDYolChAurClWoH1CzValJeZqoZTz6yuet21lnhRIRy40XtNb3CGTsw+jZcQ/3hZDjpJarsvEMZSPBuEP9vG7RBJ1SecD/nzMcjx8VhRFLq4hqf6WiDZjRSQ0EoOgTZR+lZqCMAfhVeAJ1duXmMzlHcKAOnBh2x7HVdGTMTEvDqaXYoC93fVU41DqUqpeGE+2c2yoRm3C56U+WnKaDaxiq6S2AWwOC9GPGF0qxQzNSHYLCWTASAEB33Ef5rY9wpqp6oWMsENCG5To+y6GHDwoWf3IRm6AgWfxB2l7nj/O5p1BKLe3kwG0i+8jiAHqU5keal+fcgkxs48r9X67NBjk58Ksj6STOnkaIYMwTkRK9w3eae3hTEIIsAZIi3KuH59A5PqlRnYO+a1cuSdUC7voshGfKl77RSqu7+kfX7mqWsvA/PX2z3JRGMbognUPzZPak9TtV2xjKMGwUcZIT/hY9tzWNpo+tE7IL3Qd2T6s9J9vQRmLHePR86PHqD0T2ox/hzUhMqUO3FubecRMe3F/poGeInpPRUQshEiQN61C++UNMmZxLRwL0V3+KDfAsJC9nE97LSLJMaX1Bm4AeZqN5REDmMmBinpcIEBrskexv9PRUxIyWaEDZMlrYFYvxV+XdvTssmd04yq10gSThU5k/ymfwKk7hESyLL7eR2dtqUf5KzEkTFF3LB4Qk9Tvy6NXMYCEGAFoboaC7gcv8tpH3t6gsfIYJDdzv7x8quwWwJdf3lRgKDpvElwyLoNTrl7uR611FOS88CwIlgmr/Mr6ZvNBZHpBowDvBv84LO/P2qU0RENrlyokaK535uVdqkPqiR+11TsxhzEGk4iApT2J4U36rhID96H/D0x77fblzNroqo22i2zOsOB5t8GNJ0F1y9NMotoiaVZrgWFYf+/sWXCMMAWPi0e0l8xwfC7CL9m8CVigNDbBgUmVvlrhmJWYHtjBKZcLVBCwUJ2y8tFsnwqcSxyIGuxEB5pAOIAU4ypsoEGsfyYOuw1ZuN18u2RPBSWGdF9MN3P6WxxWYhXRPhhMLnD3oCIe1dcC09cl018Ko/+M/Z6oXSRHMjhqP74Xl8U7nwOHQMupiE07qEbc6BASvVvq4RzyN53iVaLEjTkYG3drgXLWKBIi/ZaBaZjvKd9cd914JN9oL8e24QTSig6+B6xeu65qG5HL6ujPPZBm4LfYqIEQmhswvxAQ2KnPrW6FIKzlOoDrfgwxjYxLqZ94dsrjLTEU2xjvnxrlqghyLDiquwwExOFU3YgfBqS3VBLJC+/uxGU32iuUHMOEnOqtrOg2Qbpr1dW/flsY0b3c9NDc3Q2mEfY16hHH1RvjdpGqI1RrLERo58ifvz3WRxvy9/zzTQ//x6ZYBJufFQSbqPLKYq/ZdZJtdBgq3JaGE6ogJl03XcjRov/nghNwuVTbaA9+hUfI5mR3L5vndGjfWxQUXQAITgtLuLWbEYY6FBMH3/WUWzrUeuxr9VoA/6fVkU1ewaq+3uoUn9SZmt5BpiBfleTPOpnik5jehm1w22053B87Tims3gyO2oxTTW3c1dzwGZpX8ftGlHnX4Ip4GAJ9MGFranAFOI3HCXpz5TmOhO/1Fn8vPauOOnijqCLB1NE4dS84dnOcWiv3jja11phKxPz5F8zFNtPshwmua2QUCEBOyZAoxkvIsp7tyRKrKGjChDZUccO6X13hfl6LtSxmtlTFrGtFTmQOFP/3wKadEelg76dQb1e47Yy7/ZpQwQeiRaDt+qJlffCR9KAIfhC9WAQ/OvV4FPwkemNe+1n0qAt+IT0YBL+69GgTbP3tBjqovfj2aslrLGrO2tImy8k0OFM0DhS1y+uXt7qIKLjKxejkFmpuPdtns/h3quPEVvTBjd0Jio/aIl5INLw4r30BDGUl9Ou1Tyb5i4gzpaOzOMUk5WnvVEtFzXdsqyHGjmtw/zWoqGlfRbh+0Q4ZDvyhkJcYBlxgtYSsnZuy5h0QAULMcAvKNS3k7NyoaQMA5SRK69PKtyImMga/VzE2SZgbnGA1zwqo4EhiPuTSS0+dLZN3GZnSMOYnYKuIL68oDdPALz8ACpLAnoXHVcoUhCREKfBYupshyvl+6a3IGhYUWU2B+I9qIcVyCVcGthfFCdBOE8an8A5l+GwIYznse/vWGWyyGW9qt9DMsQYR+thYtBjlLhByAt8reut7tXSqMIik5i3FLiVHQNTsdGK/c9pcuE5LwZtLnPkh5R1V8tWWpQJj/CkqKsogOgeYYs56u+vhN+6LG+Gs3dtj2PS/pij2nFWQHMRTalOWz9bVut2uY6vMLng+BzXluXC3KU7Vx43/Qbk+0y5lcD/uheQovpAHJcatrnmxeLdDSHX7E/pqS80mCRAeVK8wuJ1+Qrkjdr2npzrdVVr6g/yoqEYWG5UTBaWqIpkpCtKHFAwCd6vmP6FFRbWDcchKguohPJkkhOoJ2xRgQeGBXySd26WBgW+FqhmSARmAXDGk/qGSTXEHkxnVYu5/2BgDPs67ubdYxtDOmoylPbiDGLbJPnSqRQyNYrJK7/6oftYP1VyQ0icbfWT2r/H56ZD9h179ZWU1CDHAXnb3kVnzZ5a/3c7DzTln1wM4fXEFsjNIDJ/sbEPokCfQuakXDB4Uh5lTMrojLPYcHxm0xeQctkzLpMMwpfDoJud3zeQwrw7Mo3JyIDWJFBvDGi5H37H2Tr0HftGZUYih9qFEzABRrORIXsCbdF8eshRySOLLYxUWcI/1w0R+jyBHFUi9BFKlP3pPkCoBDokp+Io09g1+UMntzJGrit1FL6J3hAhs/rzjzx3KGI0mKmp8NC3FtJ+O02KSn/aKY1QGmL3QBsfPczndCp5OPZnq7vwW90/wRAovdfRFrbjWEBXBI5VWwGgioaMvCoXa2h+KhYOVdAXgUIT4r9OYMKRESaWTEFLC+cCML2I1DuALA2ve5oFofIehpv0FVhIXk6qT99ajkUU34zTBJqkmMrIzHJyGOYVzQ9WM3FG99YqwU51ZDRFzPn/udd8YyiplGbAimlvzFOilUcucRvotnOoSlP+wzN3fGZ35OVyjHf06PU0pdFM+a52X5P9UI3AfUoKqvtqXTjjMDRWQoFkLCruwABrvuz70c/CqBSUMML6It86R8eDAuQp9xAzT0NTW3p0OHW17z9AVxfsI0QGDQbeKctg+m4479n6Apfp3J9NzsgsoB458dhDQxjgUXQjwe1OY4YqXYYD5maFAu7THbaPmd1vfcYfpOtS2e56ZOmbbZi9sI28KujfPmFdrBMCcY/1zqdbjFwVuTVWgxZZJt/WOQyju5eSa1tVr+/0q73AHfhdGJi+s5O1D95J1uZgZRd/NAtwejn5v4+YJnaIWBUykvd7kBg+f80QC26zYSF72Xx6JgeaomSQG8HzlKswfrZvbd4qmEKV+oUiotB3twIFEeBUKRY3z15Zex3BV8XBgLrD/gsQKuJL/9rVmWgSMfaDnJRB3rooEFFZ6I3vfxf8NmY6Ba+0NZwNvll0PzL08U9fs3KtCEXbi5MRJiFwTyw1fYwt6afg+y6Qs48nXerzfiNSIe2005Rr4NNr7jkuW46SKbYFRnAN/gIqC101SClkXLtgj3P3kqzADHgnDLoOCAmBB+dt7muGnbtCzZ70esX8DTjXKWhkyr9/uh2VqzGAf1f7LRZEr+A3IH6Xh/zTapxB+mMA//CT1qB+TNjdGrfHx3lekjN6Sxof+7dyn6uYb6VAg2uYQUqwDTz5E1c8JMUcXl0GTmQpotXFwSdhS8v9GenbbIP0y1dZCTO3EZd9xK2c6je44GFWwT7Y/1ESE2TwWb3XJCx3TXSSOWEZEr7W8pRGBMxR89HHgIy6D8Runr1y2Ty4/y5odVUk09K/64rDU/w//kIpbqx7x6WyWVZcvK1acFq9gK/cx8ncUrzr027B29g+XKpDhMPpA0nR43xv27T9DBelCGmQfMrcogz//Yp9An/616kJ9PKQcHAUhOYWkZsVTMuxAQ2A8MFUFqrUjSg4TFxA8BnS5aDZmEAr6zLU04GiOqWKHqiq4TumZg74+qQxd/8I0BWQr6NvE3DCXMTmnrXHqLlDmU73pBPCAmrqjQ6cepMJWMyeNJ+c5zqAibN9z0qrP6/Gdg56Htkcvpe7aqTLFoJwAtDsE7AOHjiUk5nOKY0ijnb3CR9/Lk1g0CUaRIaZ5q4NM+Y9Q2cE7ljFJUQ1m9Fz+cHju5aRR8UKK2TJQ6WgDH7ouOM8pU5TEd+A2hHtvtOkum/Rw/dFpN0BFQ7FM83wmgiQ0iDdoRzNqD2mrlA/P1+KqLYTaD15B2Q+jmv1Lue8Knv+RoG3urqKV4qFyqwaxSINNcHFLQFrwY2Ob30Fh9Q9U//ELy6qzpmw7dK7vbHMnvQg2EYcySJ52Njkj0XD5IszqHH+vka5wUJcDaiJuTyNj04tbtKLpkuEmJzA/2V321kV+svyty1vNFSE/VBKT2/Q4P3jrbSnucWHltlLiuX21w+MSDOYnqxwTcevY843YgD+trdB2g8vmL2ESEwHkNfR2Gch5aTTMZPpMucr/pvivs5gcOF3fPFGJNq6iyH7by5MAlUz1HUctmPZjoKjBaVIQl4xbw7BpO37+YK5bCjy+fdOBSYOM8PNUL2BCg7SIwx0NdSDkvWew+mZTKWLoHOYKB2923Jt/r00E6F6dGbs3S6OHoQPDR1ReXrElG2ZRqK3+H7k2LEBIGwFCBt5QDemKThycmHIPyBgJkD2Bjg/0b7hVxJFbIBJ+EtqiMtKUPl6QHzuIJj2N9Z09DWPfaYMFEkWk+U+oBqVjNBOt1ig7BCmDHxe8FgOqhXDU5se/UHN++VgZYt1wiRcqQIEICkD85YJoJ2heczgusNH+TcrX2yuHZh1KptbZ4HnQWVMb5p8bEYgf9ImOVsfRCQDf6bygGsR4qhxiIu/pstrK9z7BSKeNuSR9xJnkzgcUQWh+OKl8w9Ghsrvm6Mh+L9D6nxU2xOqTVzO/pbaa0VRWYTk23bWxOrDf50beiQum8Pi5BVPDKWi/KRzApwyG4ZFWHah7CNECalOkejPrKpxJWWSztuBtt2XuxhAQe/4xZ4Ft2RN0YC9IP+wBp2YTwun4IHGKvie2J3A+hSKiu5bbV/ZKpJCpBT+1NFuUTZ6ALRI7+9RZFH1YS+N7TX+YSmt+KxU8sjWD2HTctpFOeJMx4enp0Se4lXRZ4s36lWTNhxDietteEAI8eY/c/9I5jKHpVISfwAqk3tAHEeK6IeoLYNMoROJ6jF86N9yUUw6MGj37DyKmqTATgLDHUWBClYLzsfD2TWb06eoHp52Nxi2wmCxshIYIrpMqsh5GqdfgQEcO2rPCpdcYAe6OArAUV/Ns99RgLy/Pm/qJqZNXn1JzpyqAFpCNap2kAQm51Akwf4r+IwQ49jxnShOaQsS7lYiI3DR/NdQ70g56UuOCREN+/y7lA+ITsfnnkXgiRjcuiafqeMhk55bfBra/yoLefUgvMobOOHv7Am6P4AK3hDTFW3GxthSvQLHcoM0EZ14mmojI/IMHqxc9FVD+o14GEAAopZ1lmVW9ow5j6Khzc2eh8IPQCbIDxXrhjx9yKUXOjGsU7M3OjBH4bfEqUrYldKJhJ9/JBLatwLf0nuju8TX/JBHYH/kVE0L5sA3UoAJkZDX7RwgfmqiWpJD0sY2h+lt3asOGx5O/QOyL3VqSDxIQDkQvB5yoyF4V9Lt1Ul4YJw+zET35xp5RQK+PofRKsvLPUpzGxyj+F5ozcguKLCp+qHN1djd5Co0drD97fzArDuTXqwsaqUmc33hIJg7wgExq67khoIutB0k6yg7o5hIwm8ugDKi07DlaeIXrjBRwTmoNcRW3an4pdxaQzfLA/pw3Acw+kvmVh9AMd9E7aBRip1dSyf3t1UBs9+M7voTWC2Lm49UFoagIekLmfMx1a9qbH+gXuoBmq+LINcKeGq13rjR8F5HG8Ll+HUd14DM4canu8DVU+KcKy0k6Y4yLXO5MqLigc/wddaMeJiW/ic1rUu9gUsoXOdBH94pevjqu0b1UzlzM9HNfJ0rM3cPL6m4LE86Z33AdxBQrov1jY6yRiBN0jAU21vBqrna/qwTzu0Tup43i8dyUMqoqlgXNLhTcHZJyWuMVAieyOtcFZ+d8YkMGDYX17hPCMlD2y5dnXQXMCIwnT1A7AqyvgnWKDKOfHQg64cdoKnxFg9Vh570sbpdbauVjATYPIXIfS0WXAc1vng1M0pVG/At7MLEf2K4DrnLxI01ZbVFvUX+vGA194ikffttt38sVpBb6YCsL3RgYM6DKJi/mfNr0JZ1SoItG7+Nvhtnpizs9LkvxkwWLnvpVFSp6C7xO80HM6K3zPnegk5W1ERXmg+jPSavJeRquQ3cdyKdSw3Rort0ErI+6o60Lsu9dAGHUQgfQP6v8axFXy65QL5QwFcfKSuBZKOfcJYyzajAWyXW8Uq3N3oZyKpF3Cl4HwNGYJW9X1kdOlTV0jsp6rpOFA3DTe5VuXiEwPlT0eBRfU1FeC9V3oRj+8RwBn44TwldRFjWJQp4hnAjEofrmMzf6zEqhb5MAEDeDo6xcl7PMhb1E+yoeznNcMdJqBR/gSvoAQXKNdEhnIgBF9fpWpxtIUGmv0hXIugEW51lpGLzJRdsWTp8g0W6RTAWRcB1dzVGQWByi7YbBMNBzyrVjPuj3eVtE4ax6Bmr0vZmbDlSkgG8XbksQgoWtJbDYGhYTHLOtdb44X2J72VEVMKSRi+2M57SNanM0gWN2SN0dLfJ57PoZiLb6zzFUInZsAchApqtk1Dm0sHEUbuscm3Ay7mEpQpNhvLgzGbRDWIrh/g7nDRHrUpWaKhc1XhHcTtOOFqG14yrsFF4iVDSOt2n+SkCo+QT2ViNo4Y+wzSl3ssBsA+2j7IhKOTR4LEAm1qArHnXoDHEGW+RNRFMAYNVg4y2MYxMtiGBd0bjMokKIQtu0gLHErEL2ySm8IHeGmSJrvmsznngKXABkUYM+gqp3OLWPh8Z/HOCqNzdeLzoDZPkQA5bbJz7Dt3qijmakv9U4cPgDRRe+KZMHiJuwJQWX3jcvss8TrasOt6T6bA1S6ptgJQq9NpdVQLmk9KPulHFy+20NvvL1fSORPlJBr/tKI5geKushVnGxZnqYEcWZZjdmyItn4/NkA4WrXmeAI5b8lDw+EVQppej3Eb+ErAXN2viAjXYYtzUDtkYL617Nf40vg6RpFLHiHw72zv7HISTfyXeGJTnJ+5tAehnL1jEnNLcUo2yL1P7W81IqlR82o9c9NuDNW86FiJghZqJHIfDqih6V76/pNfgajmF8tsrWwOEG2tfJwXKtr83VTZGvW/eu/MwGeETrXAibRSSIzUuNDBEgClzSmTslCMRckNi7Qo3p7yBKPnfwL/fqISAf+U7rpfCod8BBGxhIi3SJR753hpMPfQL9XZCc3uAqQGvt0TJrFmxYqBLRo3qIzgJe2RHEOBMvYKHy+4FN1kpBTSWEBqk/Py4UXpkIMch5mJQhQcwhJtkrEzHuDoEDwlx7uiPkv/wFfE8CtPu6tuHOZ5tFIG4w0gsKIBKfhOxfzLd5bjD3x1P6mEaj5ve+Uft3RYGkb9CB4QXSUBvli8jBIrN+WarerU0Kr7Z1eb1yswLIyDJrmVJVMTbPaJ8+/J8EXcb4DwBHobgKQy8z+ArIzSL7GpagknzB6hdL+0Tz8VLoxkw+czDTTZy0RBZls3ZuicHX5mxpSjs6sSyLdiYt1KKdifO3qK7kpVN0m3uJF6VxfkWrvPiLHpY8J4zu1DNLzB793ZLU8zmXFD69C4s0bbo0juDVLN/wtb1xmZtT2lZcvJacOKRnblEVtZv1uKshUiwX/6CuQrMX06aJ23xSNqd8zdu2RrUFideczknC5rSVlbM9Bjavy7cLdgjEKiA2aXEsxFVh9jvJvOd99cQz6fnXCPOsC1vruNaJPxsEi9sH0ItOMgXvpM1E7eDiHq7oDJu1LqpIp9P2mmIqMae0Q00Z1U2atnPq93xDMnpIIsai/JI67nZ/pvYdxm7s3+8drFEXbmmpsf8E0aYdElcwQNwarUAXLNhk1EBO0pWfuWoExbUNNLClStDZiRwV45CebHjU8AUvE0UhR6nlBHsUmWD0QHOQQyBatg6fjIhsAROUTtT9aLrY5W/BxYXP9vA2fgGHnXoXK6bb18TWrdwN+yDp17WgtWIQso6oLEMdyqHmb/p9Wb7yz9SOTWMykZxfkaTv14X7+eAsiTNfb0KI9e4Hwevgi+mxz4mamxsq+8kSlO39a2ogVXmeBlZAk5FAaUERHPCvHPDm0PEfifYD+znGFpkbytZ+7t9mJ/AcUtg35+iqT5jLBpbYAJur88CFGaKVWGiA4as+7161ZG18dTFgC/zuCux3SJV8bBfPjVptO8B+kXle7jgbVo8tS2njSfpaV7DqYCc5vAwYSJT0hroLDRqJ9wSagvfGNqBRZnLtyOE6JXqQ+129WuwOCqEKiCuJfWiFeN1BgFLBZVd4BXHreSc8+VwazaV0H/XFOqzeIzdpYC1/pL71QcC4a2NaY4qC0ik4m5dmVjfGUfRNNYPavC+XTDJxrLQ5PmNsE5uTfLIFrwnXPRAIIIKQG+RYGE0Xog+tFoR95Ix0vptSAbG7KECieh47kM9he8QdNB5BCY17mKOC3K/1RzGcF5JopS6Bif25BcL3Yykx0OFD1PhwvfPNABuvrorSMbo4NaRt+qqKm744F7PX4z4HKJvjNNoYZxCR9jlppVMzFFXDU3t1nFITpAWWQloith6bj4UWmPrhulfZZKj3BB7ZkR2p6rOebtJAwiximrcqH7ouwC+7UBi4AjDlVseFL2NHnqkpGuan1IC0hNeYipcAy9il1v183BXs3DD4AcX0r2JcX38yBzYNZb7VzrmFg0fawMOwPSiwBpGPFT3VOuA/B/iR0HljMXeqOZJZ9CqfZA3OG36ZtuAyhc0Fvl1G+8vAtv0Rlaho6o4YncG4uJTD6lzs72c3hfUyJbxM2bsOs0RnOaPcVBs7sy6FeqUZQBWvsb1ht/gdIjkAB647uyakoV0dqd2nGedQ6HgiJ5EE1V6XR/165PPaX0hJl6R7fiSpRzH0lFPNVZPhvmGSh2D6gDS/UC7UdwT3Xo82Qdc3na0TbBUfwT+8NGJlJR6giCeJISgfmda+Z/4xTtESeL7cpy5mTbU2WzVbop3+IHzNLp+TyXWYYCUQIUJS77SMpQwgLi145LpHdH5GqoDrsVW3kvo9m0Ur2IobNS2Y+KvOgR2fZ32Bh2FFZc5OBmEFoSqYzdwVFuiO2Y4v6JxdBm0Gez2eBfVYrjRNrK9szto4xcabff5Ek+dqHWTqG3G42Bx3JIzgzFKvGqfTN5Z3rqaRQTarlyu4/02lDYFPXL8pFG0pj9ZV5MQLGQLsr7oxVALgGi4ihMg9Oa+FQQ7EgLUIF3oPV2pBFzsIVW7efF9ntngJBp1AJpflfNbnHls9iQ91SFbeGlHKErIQI3i1O0LOYQPJKm75YA0oLPOX/1DIk8Wjj+AQXBEky2+AMZkbymYr6o1bg8R7DJ9h2Fu84fzU3Kg07kDMQs41X4URlxx9LZuOxNzigXzvIHAcWimeSKjKfVEc1hpGJ2tYH29FVwuhoIbDOch05mHmz54n5yZe+aRuFL/D+7olLSRJGcQHIltoJDpo17Kl0JAwo0aXZduacWbkXbgzPR/Kajdh2QiPJHyFx4Ge36GgoyAAPU1L8HMHmlYGZpoiCZpvsoMRKUmRape81sn+j/IdTp7i9tiQ+qLpcYItLKSG7KsQb/BmCexn6OVirIBlTvHW/hO0TP05d8YKZ5ipfYfCwVOqkUxR9Z9aW+jvn75q1nQuVKgy5Cw2v0uUl8fR3J99xo0BOn8xDB4xe2YmMGV4TGkInlmDOhV9HE0z/DMmXFsuxHm85/69oohhbGaAwiKFzuPeWBvE1E6DiorgE5dsa3+KGNBdgyUsg5Sa4ZJCiZMidQ/ept1lQ00RZsW1WniJRYhDwy/yS6yQN+KC8vpuIzzhyru04KmEyFIqA6A7AnDYgFuEmeuNLCBlRvBYhGU6NfhIiHjcQA9AxAgI3FPA2VAxABeiqoRiKzhFWDi9g6+xhOz3RzNno3mRpwFqR1sgq/ZoJvNjlUNKORwaPjmKMEa0N1O4j5uVW7/Q6wliSieQt8A3fofe0OWykocWl1sk4fcfZzFc39cYdWd9YAkm5SQBJJUIxzGw4+XNXbxLLxdqeBobObRyPklP9RETYyI6JMr3lDVAZZGN7PX4d9rudCZCxXrnQsNiOXyi05yNnqScOsYLITbPdqpCK8uS7zg+fEya5sbHPLx0e+0poa+4a9Z+K+5idYqzFWL/lR5u8jz15HT7oVZmuO2Ci0crQKPESBqBBnX8QFXyCjUOkZkUrBJHKxS36KPpESyABg5Rg4ccA6imp7jGp24ih00NpmCgJ2/wy0lw+wL9N5223rYgk9i5bEz7Ye8MbrpjMmcfONCQK3HTbwU0BKa3iAkJT5esWJQWibyxFKpay6XO7VxR0BuuWTXrQix6xp17Pgx7gavz/CQKFMoGmAHSNn15/Ur4eHg8UXymxACP0KB/dAAG9wvoGOPB66Hp9b0H8UvqnQ81GuZRs9g4NSar0Hp4uudM7x/9pDp8BjKHxDr50AmhYlyqRciEZdGV8OSCX5lPXsKsGAUVlXg3fQuo6ih61AMK9cgi58CusI+khxN5IwC8qtjQQyssuTudN1Llhw0HRAnwhQHIITkbUo/gIopEIXSMM3xkOfEgWWdCQDAzUGK/BvXmqT51cmATnJMEmdUsx94aBnUgJgFntAd++St5MdCpSZkGEtifRwFn1DBKuKEW1h3lmRi8jDJ14Y4orAUMt73O/z0EYCfM4HMWyh99w9taGPvzO9LFN7SF2j+XKC6tNlDp2zrTHxDyqbA6Q7ERMzWxP2i2HcU4e5YWOFbXp4EbSZoMPr9kXe6etDw6xwySniAB0y35C/cA2IwwxSRpuZGe0+HPUtqDChSj1VI+bMdzeTA6eFkcI5aAf3/nSlIyHTGw+SqINS3teR0K8t3p+ZHi+cek4PNEaOYTVfOiucU/m0Oczee28lxit5CxqhqIn7orgm3hy5xS3CWq+e4tIguSKhkYFHzYnb5G3buPUvfAmtAJzwUS3PaRJUrc0P2jZgSs4liWtZCKE5L8ial0stcEVvm4UQ2F6iJBUwkKJ7jctLkQ4yFil3DhZPCIEeSEhzH3sCmRR+cepD5Scu5iC05SAKH6n8luJDmuP+It0I45Eo1v/Js93QAnPkdjY/a8Vh/8UrfOkfyIdom2pMXhYNZ9Iv5zCLEgNPh81bDw7EjMkuJeeiJDT9pXu2pWgTyr2p4KLMA43p7Bq76hVc4YYRaflGXJd/9RB9hJT7pkzLLy7ynWoGqTYNtVb7ScZjSRcBuRAX4KYccKgE5EUWumg8/LxRErFYIrzrFFxS7OMyD4GV1Tlk96t9pesToZqsbsns8h9FKiDO+G5fse12nGyLqqBMcDZf7ThSe7Tk9zGlCUQO6VbkCCdBR3+Fvtj3MVDrR/PZ/7xO6b3scZ5LF2j4YK8AvnHyJ0adSQIwC6f0Pg+EVwQhegHwbmH9vdlQ2CBAJVhEsZuCeRM3soCuBS4GLGEdF0I0qf+AAEBP3O7xXH0uaLyPCy4y3j3QeuYrLxYSBZLoI7brDIi8IA3vWHV/fWtS8/ryxq+5Mo/nXEYaQARhkCyAIsAIABUT1fgh589PqHMuGIX49j1zy24MYEccqcPZLpehyJj5lqPvaF9x7NUrSRxmNo/4nn/RsDR0l2P3qMZ5vMWBAXHxqM8LqEK2oJYYtg/OVU1jeIGJVzjUpUIYsPeV1SyoCENcxGDa8tR+Dlq9SGDQw/GkK2D42kVx6SbB79jMkfpNW1SuS5v5QH+fofC8atOTfsoq28X/iPdslR/0+fQViLGGqArZT+W7b8Efxr7RNBmT3tHshcwuHKBRIYnBMnDIG4ozFkfly4DkP8ws53F9wXmhJCu9kouO6svqe0w4PTRu58lQ87KRTc4JrwnlUSEEnK7ONWRc7lv/QMvORqgWfK/Zx1OWWaAQ0QpB6rIOmFhRf/PkEjrdrjBlyWYK7IX2cvXmFkzImo1WRv5ZUAAkh0j9Khv92Vm/Q8QdDIVgPS5LcUbTJ2l6Nh0QZxfWbN16WctRc1soxYSnmoKnmfUEH4EaeG8/cafTJ1I4Ct0JZgn113KgJomkrN8t+ugzhhl9K/3HCpPK2zinW8XE2TCPe5vTOGXo6amGb6bYsMrJNLM+fyIdtTX1HR4716E+OC31D1Vz2Yz+3kEGmOMRV64OpSCuiBnDqGQ8rNIcx+pDvIgpm3eabOYZgMI581fQAzDppv5GHMiJc61MOXcsxJaE8P9PYoI7eUtl4HIE3qZGyZ8S/TiEm6hxzJivU5gHHyosEDgQv3p2gN3IaEmoGty80kBziX5619mkqh1PrR6sA4/4Tz1mVApIknkxTjOoKAIiugAZ1GPSCx0mD8DXUPBp2khjBBv22QPF7A3J+2DqRod2DVPvT+AAOkJX6+wQldfRVqkRgji9B/LH66VsvTuzqyD4YBRbeGwKHzQGw/+iTOMG2yopqMqLA4uAa723hn9/5JbV5hKHmtco/b8QJXUQImudu9GiN/6LOYo5CBEcmUhc63hn8+sOgWcsA7FXmTFSj6Q3X4mLjRtlGclTYduj4XBv2T3rFyr6W0mlZBxaTXDQQEohaUkUYcUKk0M4saD8Fko9WBXA0fG6mMjt223CWKeagJjiEFSf6Kx+bPdbX3o7uK2jTIrsPsY8ZpjVjIoOX6ngosRb2oPeCAiD7+KpvWVjWhmrrrXCOKb2y0l4V2hpdvq5dv7/ACVd9BgsvHfNowkq6LvyEZ2Sa2Z8n9+Sw8ajAZzaNvZeyf62TaAqiwJ+pMSvjAbggTYjg+PexKY4eoySweZx9jc53bKlL8nTKj0Y4I3W+7Hnw1WgwnO+cJLRp0AQVf6RouXgxWCUHWkKZ1RjKuqBeRd/tusGEzepQmcIn6Ca05dqXzowN9FTd8S2sgf2rDm/nG1OrZsqLSNepdubsp/+NkQTLewXnKxz4IdOTAoIFDazI3OYwQjWzUMGa4Vy9y4uFCC34WMxRQfGNCinFjF3aH6lLabedml0BZAodhMRMsMyrLOpYtIMYxeS41LR5gRqAWRL19Dcv8g5OTyfgQVa6hkinyAb3dhbM0bJpEx0KRssFmS7qEaaSZS0YKuia3MW7R+eKDRkLPLM0BuKPswJQgTe6CZu/bVv2QSx1d/f4VB6tCy5RPW3NZfv6vdbhVv9iPqB9BWmefVq0zJtNgzrNjXYBOhCj5AnvuVi0OvWMKzLIt8E0GMZH1Lhf5IIQBNFdlyBsiTANBWYGrBsGm4F4l5UyRnPlk9E3F1AlWdwuyzF3C1jDGLIMuL9FwPb8WntoR4mzqyCO4ihAlum8qhWS/87LEYaLRYkhgHwbSjjfqZRUCWqUdjBxYXeHXRLqjbE/3G34qFW89gD6XLeeCFilfEGHzWejZXOtT2EgAhxx0Kw4F+xni7iXiUdzDVTaYxqtR2Q/5A7QWgkqp7DE8AlB6xsR8kAgSOVURL5dHSwNBc6g5VLBp/+5iPDvclzmsxIDZU8efSv2pe/QMZYTROES7lDOdjjIPz66TW2dvOVfxE5WE3lWsS3U6UypHrdpX89liJb+v41AI3fLt+ys4aP7dfcQvXtHTfZ/XCTVvB1arZdAdO3zV6+vvqnx/8230VFj5b4gQ/+dZUHD0/SehYeB1/doqdZ0sPCKhEvifVYX8VLVxOz5HAH6CAGhBtcqJhkeiFb0fSp2LgY46l0zDAD88EUihgGSiC84Yc8tDBADusLoFk7g0dpSxcFHAXl0pSMPn8afxD0TOdBo/JqbeD8Ne6fM44YbF2PS0wy1wOcSUXlC8Seqx1C1ykVhQEw0+FajP9nrxMXFhJwXz2IZG2XLGkTmf+Ll2WIO8hiY7pXJDlVji8bVINrsaQoqLgkv4RFmR3Dpn8seDmWzMeGonHfa1ocMm5GDfhROsxhK9CuqCU34UD6Fu5RKdj4wqLtUT+xEYj0mVw8vQGVChpTYHd13NCxoHFf6WaweIYTpNAgabIOL/lsYelUDC+yDbaty+3I58YYeGTj08yGx/sJ395mM5CQZ5IJNzZCvklYu6Uc4dwYrhbYjry1+4lhFRFCMAPQXIpymtx3DH6wtj5pebZ/Jt+5yMi9WWa/IrHbFVwMs/pLCPHrNn8g9cZo+OqHXF4n16D8OzhlAuBAUR00Gtgw7cznKQ7+qWu/R+7IUuCJ3ZdWQqIiIMb2u+Zd9nB/SDTW1Y4KyiPiFqqje/2JwoMD5ymnP8frnCf9UN71ZSdY63/s5C/4iohhSUsZ2Q78zdYlBtnS/rQ67ROeqVIOi8UgrCzb3eEMazMagDp2aEmfob45XtPny/UE0Zz8PrAuuZwE3tYqaiV2U7pCQ1wHc4pXjswhrH4ZZqQ5smVcdOtmk64IBsfblwGF2eapLkfGEL6qjkXxWMKP3I8AFO3T9Mf5hpHqyOvd/yrMv0gFOF1Zi7qoIVuwKg11JTPOiHZSsMCZ2rbV+x9lfDFrmm+GyauEM8DFIpDR3FYmeIxtxvLy+J3xaQ2LV4iO3RMv76bWRGEYJetQ+eAI8CacPz0BbOUaohqvJxsTUNKQvmfGJvGbffg8XyvEFuUPRJ+L1l16Y9F9XCtYCKpv2Jw7FbRNXXgMjRba9I1CqZxKupJ+x5UH4oD5qduewd1fQ6Urz7UtYryK+IvszAo5I59kQualULXKq3mp8VS+Ecj+nvRBsiU8EXrg34lAZEwwgXh7/V5xb18Z+JcTCbzzrbhADhxzuT3wklVvlLta4T/eCejyxWvrGydgdjArNGWAf3jDL1SawYieMqP5EJ/gJ+P26geYB+12PV+jdVYiP381BCO/ffbXLRiCJT+448PHSXfXiOKLtyvVbcr8IU7p1lzvXM2P0D87mtZ/olU8QzZU0deo6ZF086CeUSNFKYzpdXDGcxz2DXrZSTf1JBQjDHUddu3WW2AUVGvc/ROsYZzej14e1Z7zEftk7hL7XlgNNqNttTMLJbllA04coA+6izvfGf3TRPUWvTvmIE99gh1Icos4T7f5x2tZUxWeDb3EJ29DwXDChPJ4Zh+DuyBZdNq4T58wkVGp9hAbniA2NnZ+P6wck5ZRlu9SQQZQVb1mEeR6zY8hy3T0JOZXZ9ROj9szrCrW1UCjvbqBJFVjF/IEUkzsnuKJBKUPp9q6+z1Ch/rfcOgJGs/SU6FRvfa6H7heUn7GlUIRHRYu38luMVPXDt0LJsqqDbd418Di3Yun1Sbw/dv8LYkxfz4/Vo3ddb74bPddQGi29NtybRsl2AKpPFBz1C32cRI66U99+w+kJC0gANCe4AC3k5dmX4dtmotzTK/VzG5Bq42VE49kTqN22hpmXJsbtXw0bGdgdblMVZfkvYH20s99Q91PwBPuk6DSx3JNzjDjgpYuKYoxNz79bk7HdW+IMrrbRzEtMzVBg4CxCJVVUz2TqCwL3JzBWYDOs50seRCq2YXD5Q/1bvSb/F/tF0JSezmOM2czri1osaoD35fUQi3UtZfn49rmE/e7l57RsP2+PzBEnAoC81wToWBeZLjYajJl/P+pFmtbb3n53dIBMVPOteyXlXbmIaW+K2hkU8eE2duUiGoWldlO+VxbHSCkO02VNeknXSQZi5vGOoItmnZzhm6Lv6OCflAsyEJ1kLQmBGchg2WY7EKDkTDgGqLjRFZAqHs1ZzJsZBTIwEUJymGnHuPGJ1QqJg3aOhP0qRCEJcu+/W4/vrHz/kx6vAugF7ZsI6lK2gVDxk8tjqUVS4ZEjdpgDBnVPb0tbDdBWK2k/3fukhQAsW1mVuxNyF3XxoKtu+PmXBbesQidi0GE7Ajwy0w3902f1vsaOP2qtXjw29PD+M/sxQC+AZPVRuGaCRGA29qN7T75qA2VYjGNl54iEw6lKN5RrZdKEAcgpg9vasZaaO2xCJUwkF21wDz/QDdZgLeqeZoUDj2bF3I+mvE6eXF6IkmmcqQEl3SPsYsBUdbfsY4WLK9Y8J3XM5kmJ75tDZiodTj5/MwC/JcROn4Zd9UI25G2F9U3dOe7gULWNRT+cd5U1/JQPK9FUs8l4FZBlcZBu7cMwpsLtSPF7TtepEMNnRtCAmQKurOaIwOC3xIWXsi2BE7wndGL9ZCgPsLAcp//w4aM0kBHLf3uIOPEP3eFuxii4Ao8EKSOlzbY+WQpfeVRTOnVsRw8bgW4BXg1jsaP2WmFObwqxCgovePjQ4XF2IZGHA7g9CqkJouGSsARuSZuhNNAwV9eqqvWETQkaN3LS2Alwe72ZyU4XNIncx0lRHU+1OKOpNEBRhSX3eoZQCncSAikGx85co70QpskU6xPXu0/haX1nCqnDTqwQVAv4yiz4wYhaO1jDl490M0/beILUjN/pMIpHymqfsOQqI4Ujdu4wKPE1Ro6AHbech5PO5pyhxBTurIJajQdBFC1/h6pk2dG/H2H2EXkPMBKAAJAZUOMaB4NX42wQ1WJwlPgLojAtaVPSIFmNi3ny2sqcGsEEfS7SFhJ1EVP89YW1UbDm+S8wBaFbrJCqo9AVPfE1YJY93TkgYotJ3Cc6HScowibq+lLL8vh89LUIHqiV7U6oRgZNrJvliAITVEI4iMUj3IdRRjorsgmwUKlrcnqP8XUq/XDETUR8DtotmGY4VZhtxLhHnCcYDm2LNhgBZh0lhxz0cKbPR1iug4g10jme95j7JNhxf6jrUAmK15XuHOlsgGdsE/rHySriDpwPL5yLdF3zV/RVYVxmwI91VtBKAdUYLAFa7QAi9tggnhKYgGBoCNtt5kkLNNLnGmQ2d4O71e382OZSzOAMPPK9B2KHujr/Gj6TqaPExTi25XdTLuehRYEIPcCnP6JfTw+kWuojjCqbyW6Dsv/+UTt8Q/nrPbCql789dH3DP+yuPFc6wlTN7RyC7Oy9v6Eth6TBEOfVEPys2zL26hfJkCEzxrWEXbF1N1CiVtt9vXakggtXRjoCW9w45g8OI7tU6KTQzK/MrXOV4dYMqs96lixXrLG4as9hcpiE0/S/3OIQ8t8EUxE4whT2uMsUgFUN0OZW+LPED3rt6/wUt6i6s7dRjqpV184DhwZfiqSqYTWya0Hwoq7g8mHTdiIV3utlAd925FMWWvKC9It+JmK/e+Do5SepknyQP8DSgu1HHhnXOLb81zXL9wjvqpDHerlM/HITMJl5UXxbAGWxkxSY8Y+ttLM9UpVtiV4ec4fsGnsn1vuLHxqk+Ek1o97clkqHpyH6CtrV+iW0esqZqrQDNuPdPTbJ6Q+BDI6ddMp9pKlfwbp2/zkunZLnwnOS54x4VVc1PmjZw32jJZc294N3vzEczEk0ea+ktRCO5cOeqoHSg+cTp27kb8t2a6Jl4SgakcfWJMuLeO0hlRuodJcfDnWM723J+D7lkSx0IhuD24Cn8tyt40iSF/DT03F3yCQkXHHcOQBJAfDniRA2kuQhNNkwFjk7z8FcTCtk2XQXTpXokWp+k0OurHidStDO+JrFVyzcKVukrG2fWcs3uKTbVcJJBj3xvKBIL3aDvdnMixNDN2IAHpcD9+mUmmNXhTWYe5oAx6TOfmm2XAdMV3P/nqzz47Lp3an4uXPYd9J16C9i/Pv89BlT/IHEc/XcO6mED2rN9sVr25Z7X+ZIyvlXzszDjv0IJQgzTX2NVOxrdqHlEiqeTsagRoJCXrt8b0JyEadRNCN9OqHgZAuSAgIuDpgmkkwcSkN20Kw8WhhSG2oxqJtMoTXemo3l+8w3rNbM7MW1iXUNYv66LN9/akEAlAfRdyfSg/gQpg1pPqh+JhDWlJopFzyWc6H6UmFIrGlxcYGZMgGRXJuhmia3JMuH3xrK0Oj4hwaI3TyIyQ2V45ydqI+M6LQJG+zgaZMj145Y+idKoX8n33WE6bqFgqCx0YPRbmrzdmS6UTKt7/aWJUn+anO5wq7CzVdKEb4jxSUnFXL8i68GVWQs7uYSH3twUp4go3V8lXfcW3lOnVoKo1uCUQno1tV7jnsZFJllpauvUmkzKKiu1VhcalOe62ybZVVl1UaF0QTiJ2XVyk0B8K5OhUoSB9kvFmV1aNbsjzgjAC0LcCZ62c7favizvvZLop/ILhWeLM9Njs0wYHsnvUz4dTYdyKSR+lcle6SCumkp1fAlLQfR0DPZTnAVuUiwvlGAtF+82YklI0Y6c46Qs32IqCOyCG4yjaDD0ajI4HUhpf+RWDa9HPlFjczDDuROVaywiSt9uRHIYXkphybr89dt2vTaXVKQPoVrFTWeWdjyca7Wi/jE5BQuxSDP2iIZ1zufqMnk5r9WlfelxUWmYF6bllvaqPkiYXc1NAbO22Iaej6mrE1L6PMmppFJC+4umxqlhXWohUzYWRl2h6KP8ChxA9hifPvQpX1pqIar57qAiaVuop6zkNnWI8ScW0eRMW6mEKS1qzpwGb7dp4+GAkCStjMW14rE28na3uTKI65SEqcrjjfqSRNIicmWORapTMW8h2zXDl32hOMlt3OHiWneDj5NsfGo5Clv3Wb9U9qhPkH+O3A4aTjKhp9Q6ehZivOUTQOFQ0WundUlwWNsWlFsckmdXWMm1/V66mR5DqcWt0jU92ScCMSPsnW62X1n+gxvbli0wx2gVk94UnxLO6cw7pBYqaUWTsc36aczZB6KaFyZ1Rk3u/CzaC9EMc55iI2Rp5KiinLtcPLBKnftM9Nm5Nl589UtnFXdvxwtk/stO8HCtXt247hU2ergVW6twjGUEms+4/7J7ZCOkJuFsyVod3assY4lxjN6OZj3EPZTpxdlIwdPgx1lhOma6qVhlGvh19x4v9eqbJZLVJMx09aMAaAesnouGnCU/dqUKkuh1lDPNBfItH1X2W3l9IVqd2pUcBap4vc64zn/RiVXQryMhN/F1IEboDJstO+5QmKYv+wkNQCPP0dm+4tA4Y4TZH72uzIztzaguvNhFcItDSYF7Dj9bKO72arvaE9a5ylaNUw31AzFS7TxSn0KstnjI97jHSrwhzxWDWe4q8x1eHbv79teDVbZJg7JNqCjZTWKLbO7Sc9lJRTkwOSKgvHcDep2Psn1jYL/vyWlvm3iX+bJ3ZDONHBU9FJvdhlZxe5Wu3AE9DNanFArMMbrHSq4NTZ/Og1xI+jNaypqmc+w+dCZ1XoXDNrHlJIx0yRwEjHqd3GuNyjO6/rUlPOYTWqSovY9nYWEJatq3djs5ccXEElUyTb+7MSDntCDfWzXn3xNcnzPMTRUSw8ttYz9Wfos6nx/+5cK8ErZ5/KamXfzBWT8lwv7pyZBJmb/9j6KMm2Mre81Cmr9Dul3I38WULtxMU62MDGDVwoTFvs9WotQqzOOiRspnd7fM7m6r724qlG2HXwdg7dYF3IE9/9aiWltByKi483o8+jt+G1BeRHejnLxa7IzdQ542oyeSazI6vJDDG/YQhHPckXOwVHjbYU29C0BnUga6YF8GnD9OMtQ8/0E3J7HKch66NjVgcM+ufkSlcEMXIguITOkDZ8uUAfH1zarU5+MONa+RzUPNYgn4zF08ksWEVI85lMyaEVidg7QHkPeAdXVTMAVPTmUL+4LArutl8Rei2PoBlyJoLBgCxXirXmDso0RHg1c404Ot7BZcxcxBZf0eO1E4cJzwBS5ECAoyA+BcbfgF7jZ9rcAAfsQWZUZYIM/C4df7aflRlOzv8t6E9rrropsowfNPQcH8Ofz4sPGT8SL5Qh2YNHcPNcj60DMaZpeVoOh9ymAGTqXqdtGUKLIg9NlOxRqNO74n1kfhbfSfIKfDJ4OrVOZmP/kExX2VhjzFECGx7FUaqOQuu0abqMO5kntiO1tn8RaUdTMaaVoBEfNJPlW+6VcW2vOY8GfdsfXg1FJFa0H7oQsj9RYf6RjMtuUTV2G+yblcaatHeR7q0bPKVoeCB+F4MWVBQHfSN2MIn7thmbSOYqq1TxZyXlawNeUq+FPeShGXaq/e4GavG+cEf+JInzZC34h1zta1al7Qh0DucBlZVATZUwQyiwEMmmlAUwgQbwCsFGyaNXDNVtY72ZS049ualMOhMCq6+hxwLVsjotCCUQjzgdfgUItNUoJJUtyEp3MoyRRGGNLZxFzX3V3zd8we1uy+4hZ4m0PMeeSdy993YNwVCi3nl+2rudFFuZp+ogrlCT6jnrHcfDNhnlc5f81xnp1BCDa5NrvlzOigrSNUnia6opwpLYKQY686xiidTAyxSl8SeoEJFUQFMA21l4C0nu/8KgZ58urD2npcPhp8F238DtsdtrxtLfENt0JTbheifcFg/BUg2y9Te5o+B4qcitSHF9k0u3zSBvOm9lhmSWHPgJwlk2WX+to7WArs2S37ow1qnBTM4RGO1KDP9YUfmPTysT51aantlzxJhbJpiYv0TB8PK+M1S5EFocpO1a2L+Ox/k6HudjfvRu1JACB+8bhXYVyBmyTPzULu1PFAsoJPjxkFm4Qp38dsKjS3BFF8MPoCONt3dwVJWT6Lpaavlwfl0VN5KSNjpFmEdYLpko534TsNqO6/DLBt9PtVMhat2Fwiq9Q0hs/BqLDCXuoA8ENHzJsf6+NiGzZ0t+E+q00oZR4YLyKkTurGMpTS70VmU/+HQ1leUX7XD67xn8W1ZgwJVprRGsP74ScSRa1Rtg+J7/pH0GP+yMOCu+IRO+VTBOnEjauu/MzkeJCo+ZQE4gW5S3lHcJcwzVrc1C0k0DqNOJUm+RBUP6+CHROhtYxwlCIhjEwIeOYi4trOKRsXiuKCIkeZwpr0r+GKlm5tXJFfxUlJPTQppKzH/aR/OHLluoLfGKeuhzLhwk5HdtbczFoh51OpuWNpbJd3TEeUwBbFMtgm7F/ndMvH1f9+gQMk5DD0gmFSt920ZDehEw5VRAswvMgnL7ka+irncnFgDeBzOqQ2DFsKEnYndVlao48bEyKj9BGMkGLA57NZGtdYrLCc8LPuLTwH5wyT8ykgg98Yk3ttBtqTy8HurppNiMWTFOKYrAhOAEUlOTI9QTZA4rtymyFmiPWcLand9bYCOfB/ug1SIwwQnjDgnh5lKdtjgky5RIyKo0pCAvI7XWxcNCpilAIjnTiTlJ9EVs7labivqjg+xQq2qYdkZUgVVKjq7/9ag+MmIheVL6WYGlbUV6DHpj2zfOsN/NU1qk6Jpp1xdLGM2SUcZIT29pZB5x3MbfwF/fLd18EvpFZi7kLeVocM7/1c3OXLLdwJty6o1jJA5iPTiC4feTSlSDs85V0wudwYGE7zTDWF6bwQyhS15kTBLL90gx+mSl5YfBi6M6TIDEM+kXAtGBFjVlcTsEpdATLsUXCK+7VWMN0yPEd9G73keW0sS43n6iIVkAyBPRyMEE9cErbfj+u+uLNyEKCSOkSrEgJ1v8oK+9VEkIHvUR26yqtNWhuLTdMZIVHYqV5pBpt15AD8A5VHRUvOPN29FSO+8ew4SA/DNddt8oG7XgP7WYnGYUUAVeKm2i9Q6zFH5Bpyqmdfw6sFQV2OpihI8PPxx5jqiqkN15jWKO7gg8L363Sr9jQB/nZpZdNzzQWycxOVNwbbuNgwrkk8vqMt4/g3SjcT3Z1kO1bI+MILxFrfNmHu3JjEHwUPxVKFD3+Yhwi0HB8bHMgWcTg1DAjp79UVQWEBEVtYqxqPZJhnrSfdeyyRW9FYe/Sp269H4nIJ+85225Qo14yQNJfOl3W47f8AGtry4/D3OiujuxJMUWhx9teW7v5Qgyu/e+l+LiudLN0jnKkJnAAEpovL/3piwoah5ckoBEq/15r/RhbonG/sj0aFLFp1857pQjzEYrVErvCu3XVLFDoBzmZW0q6rF8oygI7D6+z39WCUe5yMgDtE+uZa3N0nxuUZOJoOkNNHProiBAw5QZoF3oaOF+Aj70L7vn8MiZQ5eTOsIN/OxCR8eJXezKkQ56qqLkVKe3CLu+AdboSWaXp/iCWdcYP0Y462m3hbVI1BzIevHzp55ul0/q7D8fzBiwOA3EgCP534E6H1gDzLC1vZbwE0Vl5qcPMtCmQyGEU9BDmlVRtdjrU9CaXJw9RiK1WMVnSqtR8BO1CJg0OhBvttBAVeUbYnwl09NkjokELchjbZZV7atY5KGJxYUfNGS64LNsvBX0nG6UBhHB7Rj6lgc0NIovm5PJYiZHaEAzSFa8LBwoTU+PvJcDnTk1hQRd0Cp62/mwzcNG94e++Om5EJvUKNMPmPsXf/FU58fsvIlDgvnjFaRkRPMfVIdUrweWB88nQFaTe67rzJ9+EK2oSv725Gv309dDz2Pks52Mmqu214fJBrtPcmBxfTwJepCtrA8XNwwnAOub8ZjeSDV4ltSHBzxlRKUfWZbl35KYNNDbmP99onATfE9686N6zidx1sed9Gczy+Q+ZhgTcULUc6K2H3JyDuVCloPac09RPltr6JLSD22UFkR0Aj5bYX6NevIgpD5FsdbGqBooN+nlRrms580rOlFl4Teh+6IF8sQES+UYQ1EfA5tH3TO8zM7rI8lEJ0IyaM1x4BYoLWguVtv9tHTLDcNCk3fNh3eKjgkHYNOfC7PXFZw+2TEhDWGt2gM6mmDSUEraUDmiQcqm0cKikZGWx448Du3GxgokXAcrlBa5mBxIbDFikCUOPjh7n5kUwsXWzTXuKZ24SfbFCF9iTYNy2oLHfbC+h2Anqe4UkutRfWXdD9C3V3cmopBjc5UqZd/UZBbL2kk45hcE6Axw+/wneWAZ+NYobI5SLIAulEo1ICQXlrCUcnKS8iIOqyOnNrqDNjKgbg9DuVo3eC/KQlGHYzXgQSxYagtAF+/hH8BggsoEd5pWFjuABVVrgAoa1oETGHQtHaukBUh4sETwF8WcAUFBDBlwg4ECRNcqp26A4nAmPGwzbcnWknjIWbJ/os7LxbdltSEhmgC5NwAvDSwQjkCp/yF8l6mUH4TQm1LKpUWVGCgAoZMBE+58lHrih//Zv1ML8rxYO4NkE/Fu8Z/31XwU+cyDn2sZJNAp/k4W12bz3O4Nv41HnyAiyNezA76pU/JS/73eBuEPXX18LqPLp1t9weEcW4VmdNkx6b32eZXlX6YsmjT8x3A+yBUb3PpEdL8AVcB5Q77kcHip+GhH7XI7OkccRp+pmPGLEO+rClBNSOQPKAmqk3EnybUKU6B1VM1LLAiRDVdCYIuyWo/PLZObqTL99ogi6f8w/Zt+JAFgZSFW387WeqEM8p9GYlrcIyd82D0RMLeqwesdS7U98qUCoouJPlQdsbny6XsU5z7U7JayX135INNTzZCpTbjWP0QNh0G/3skJvN+cYv34bpM58zg/SZQzI5gnoxf2C4WovXcFlo4byite4FpF0/bz7zESslMfq4NsJ1gEGbwG3/8ay+/Wc4yOtz9x9xwHyQSqsGZY4GPWJ6XBfz/sNdaZR1lcxpjc3Ll2oC3/WJ+Xz6rmHxcdxZHpClKgqiWbmZEYBPnjRhytlL4kos67A6SfIUz6COPvWOS4hrSF8Wl/u19O54W+AkK56NnWmW5pmqY5TbHTgdClLDAg92AslKZcu4X3qsiluFx62lA5XZqgqDRo5YYWsqdyk9Vn0Y+5BFggcC5MZ4D5FEs0V4sEK8EA/wPcpDFlWMyvg8WKeNgWb7EbHbqR1d92dlSn0E8nRsdOo+z3J7tbSAC3f9e3SzDJB5xVXbt+Zq3ayiGJzf4KV4Mfkf\",\"base64\")).toString()),kG)});var ps={};Vt(ps,{convertToZip:()=>Yot,convertToZipWorker:()=>RG,extractArchiveTo:()=>rde,getDefaultTaskPool:()=>ede,getTaskPoolForConfiguration:()=>tde,makeArchiveFromDirectory:()=>Wot});function Got(t,e){switch(t){case\"async\":return new Mv(RG,{poolSize:e});case\"workers\":return new Uv((0,TG.getContent)(),{poolSize:e});default:throw new Error(`Assertion failed: Unknown value ${t} for taskPoolMode`)}}function ede(){return typeof QG>\"u\"&&(QG=Got(\"workers\",Ui.availableParallelism())),QG}function tde(t){return typeof t>\"u\"?ede():Yl(qot,t,()=>{let e=t.get(\"taskPoolMode\"),r=t.get(\"taskPoolConcurrency\");switch(e){case\"async\":return new Mv(RG,{poolSize:r});case\"workers\":return new Uv((0,TG.getContent)(),{poolSize:r});default:throw new Error(`Assertion failed: Unknown value ${e} for taskPoolMode`)}})}async function RG(t){let{tmpFile:e,tgz:r,compressionLevel:s,extractBufferOpts:a}=t,n=new As(e,{create:!0,level:s,stats:$a.makeDefaultStats()}),c=Buffer.from(r.buffer,r.byteOffset,r.byteLength);return await rde(c,n,a),n.saveAndClose(),e}async function Wot(t,{baseFs:e=new Yn,prefixPath:r=vt.root,compressionLevel:s,inMemory:a=!1}={}){let n;if(a)n=new As(null,{level:s});else{let f=await ce.mktempPromise(),p=J.join(f,\"archive.zip\");n=new As(p,{create:!0,level:s})}let c=J.resolve(vt.root,r);return await n.copyPromise(c,t,{baseFs:e,stableTime:!0,stableSort:!0}),n}async function Yot(t,e={}){let r=await ce.mktempPromise(),s=J.join(r,\"archive.zip\"),a=e.compressionLevel??e.configuration?.get(\"compressionLevel\")??\"mixed\",n={prefixPath:e.prefixPath,stripComponents:e.stripComponents};return await(e.taskPool??tde(e.configuration)).run({tmpFile:s,tgz:t,compressionLevel:a,extractBufferOpts:n}),new As(s,{level:e.compressionLevel})}async function*Vot(t){let e=new $ge.default.Parse,r=new Zge.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on(\"entry\",s=>{r.write(s)}),e.on(\"error\",s=>{r.destroy(s)}),e.on(\"close\",()=>{r.destroyed||r.end()}),e.end(t);for await(let s of r){let a=s;yield a,a.resume()}}async function rde(t,e,{stripComponents:r=0,prefixPath:s=vt.dot}={}){function a(n){if(n.path[0]===\"/\")return!0;let c=n.path.split(/\\//g);return!!(c.some(f=>f===\"..\")||c.length<=r)}for await(let n of Vot(t)){if(a(n))continue;let c=J.normalize(fe.toPortablePath(n.path)).replace(/\\/$/,\"\").split(/\\//g);if(c.length<=r)continue;let f=c.slice(r).join(\"/\"),p=J.join(s,f),h=420;switch((n.type===\"Directory\"||(n.mode??0)&73)&&(h|=73),n.type){case\"Directory\":e.mkdirpSync(J.dirname(p),{chmod:493,utimes:[fi.SAFE_TIME,fi.SAFE_TIME]}),e.mkdirSync(p,{mode:h}),e.utimesSync(p,fi.SAFE_TIME,fi.SAFE_TIME);break;case\"OldFile\":case\"File\":e.mkdirpSync(J.dirname(p),{chmod:493,utimes:[fi.SAFE_TIME,fi.SAFE_TIME]}),e.writeFileSync(p,await WE(n),{mode:h}),e.utimesSync(p,fi.SAFE_TIME,fi.SAFE_TIME);break;case\"SymbolicLink\":e.mkdirpSync(J.dirname(p),{chmod:493,utimes:[fi.SAFE_TIME,fi.SAFE_TIME]}),e.symlinkSync(n.linkpath,p),e.lutimesSync(p,fi.SAFE_TIME,fi.SAFE_TIME);break}}return e}var Zge,$ge,TG,QG,qot,nde=Xe(()=>{Ge();Dt();eA();Zge=Ie(\"stream\"),$ge=ut(Vge());Kge();Pc();TG=ut(Xge());qot=new WeakMap});var sde=_((FG,ide)=>{(function(t,e){typeof FG==\"object\"?ide.exports=e():typeof define==\"function\"&&define.amd?define(e):t.treeify=e()})(FG,function(){function t(a,n){var c=n?\"\\u2514\":\"\\u251C\";return a?c+=\"\\u2500 \":c+=\"\\u2500\\u2500\\u2510\",c}function e(a,n){var c=[];for(var f in a)a.hasOwnProperty(f)&&(n&&typeof a[f]==\"function\"||c.push(f));return c}function r(a,n,c,f,p,h,E){var C=\"\",S=0,P,I,R=f.slice(0);if(R.push([n,c])&&f.length>0&&(f.forEach(function(U,W){W>0&&(C+=(U[1]?\" \":\"\\u2502\")+\"  \"),!I&&U[0]===n&&(I=!0)}),C+=t(a,c)+a,p&&(typeof n!=\"object\"||n instanceof Date)&&(C+=\": \"+n),I&&(C+=\" (circular ref.)\"),E(C)),!I&&typeof n==\"object\"){var N=e(n,h);N.forEach(function(U){P=++S===N.length,r(U,n[U],P,R,p,h,E)})}}var s={};return s.asLines=function(a,n,c,f){var p=typeof c!=\"function\"?c:!1;r(\".\",a,!1,[],n,p,f||c)},s.asTree=function(a,n,c){var f=\"\";return r(\".\",a,!1,[],n,c,function(p){f+=p+`\n`}),f},s})});var xs={};Vt(xs,{emitList:()=>Jot,emitTree:()=>cde,treeNodeToJson:()=>lde,treeNodeToTreeify:()=>ade});function ade(t,{configuration:e}){let r={},s=0,a=(n,c)=>{let f=Array.isArray(n)?n.entries():Object.entries(n);for(let[p,h]of f){if(!h)continue;let{label:E,value:C,children:S}=h,P=[];typeof E<\"u\"&&P.push(zd(e,E,2)),typeof C<\"u\"&&P.push(Ht(e,C[0],C[1])),P.length===0&&P.push(zd(e,`${p}`,2));let I=P.join(\": \").trim(),R=`\\0${s++}\\0`,N=c[`${R}${I}`]={};typeof S<\"u\"&&a(S,N)}};if(typeof t.children>\"u\")throw new Error(\"The root node must only contain children\");return a(t.children,r),r}function lde(t){let e=r=>{if(typeof r.children>\"u\"){if(typeof r.value>\"u\")throw new Error(\"Assertion failed: Expected a value to be set if the children are missing\");return Xd(r.value[0],r.value[1])}let s=Array.isArray(r.children)?r.children.entries():Object.entries(r.children??{}),a=Array.isArray(r.children)?[]:{};for(let[n,c]of s)c&&(a[Kot(n)]=e(c));return typeof r.value>\"u\"?a:{value:Xd(r.value[0],r.value[1]),children:a}};return e(t)}function Jot(t,{configuration:e,stdout:r,json:s}){let a=t.map(n=>({value:n}));cde({children:a},{configuration:e,stdout:r,json:s})}function cde(t,{configuration:e,stdout:r,json:s,separators:a=0}){if(s){let c=Array.isArray(t.children)?t.children.values():Object.values(t.children??{});for(let f of c)f&&r.write(`${JSON.stringify(lde(f))}\n`);return}let n=(0,ode.asTree)(ade(t,{configuration:e}),!1,!1);if(n=n.replace(/\\0[0-9]+\\0/g,\"\"),a>=1&&(n=n.replace(/^([├└]─)/gm,`\\u2502\n$1`).replace(/^│\\n/,\"\")),a>=2)for(let c=0;c<2;++c)n=n.replace(/^([│ ].{2}[├│ ].{2}[^\\n]+\\n)(([│ ]).{2}[├└].{2}[^\\n]*\\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3  \\u2502 \n$2`).replace(/^│\\n/,\"\");if(a>=3)throw new Error(\"Only the first two levels are accepted by treeUtils.emitTree\");r.write(n)}function Kot(t){return typeof t==\"string\"?t.replace(/^\\0[0-9]+\\0/,\"\"):t}var ode,ude=Xe(()=>{ode=ut(sde());xc()});var MR,fde=Xe(()=>{MR=class{constructor(e){this.releaseFunction=e;this.map=new Map}addOrCreate(e,r){let s=this.map.get(e);if(typeof s<\"u\"){if(s.refCount<=0)throw new Error(`Race condition in RefCountedMap. While adding a new key the refCount is: ${s.refCount} for ${JSON.stringify(e)}`);return s.refCount++,{value:s.value,release:()=>this.release(e)}}else{let a=r();return this.map.set(e,{refCount:1,value:a}),{value:a,release:()=>this.release(e)}}}release(e){let r=this.map.get(e);if(!r)throw new Error(`Unbalanced calls to release. No known instances of: ${JSON.stringify(e)}`);let s=r.refCount;if(s<=0)throw new Error(`Unbalanced calls to release. Too many release vs alloc refcount would become: ${s-1} of ${JSON.stringify(e)}`);s==1?(this.map.delete(e),this.releaseFunction(r.value)):r.refCount--}}});function _v(t){let e=t.match(zot);if(!e?.groups)throw new Error(\"Assertion failed: Expected the checksum to match the requested pattern\");let r=e.groups.cacheVersion?parseInt(e.groups.cacheVersion):null;return{cacheKey:e.groups.cacheKey??null,cacheVersion:r,cacheSpec:e.groups.cacheSpec??null,hash:e.groups.hash}}var Ade,NG,OG,UR,Kr,zot,LG=Xe(()=>{Ge();Dt();Dt();eA();Ade=Ie(\"crypto\"),NG=ut(Ie(\"fs\"));fde();Tc();I0();Pc();Wo();OG=YE(process.env.YARN_CACHE_CHECKPOINT_OVERRIDE??process.env.YARN_CACHE_VERSION_OVERRIDE??9),UR=YE(process.env.YARN_CACHE_VERSION_OVERRIDE??10),Kr=class t{constructor(e,{configuration:r,immutable:s=r.get(\"enableImmutableCache\"),check:a=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.refCountedZipFsCache=new MR(e=>{e.discardAndClose()});this.cacheId=`-${(0,Ade.randomBytes)(8).toString(\"hex\")}.tmp`;this.configuration=r,this.cwd=e,this.immutable=s,this.check=a;let{cacheSpec:n,cacheKey:c}=t.getCacheKey(r);this.cacheSpec=n,this.cacheKey=c}static async find(e,{immutable:r,check:s}={}){let a=new t(e.get(\"cacheFolder\"),{configuration:e,immutable:r,check:s});return await a.setup(),a}static getCacheKey(e){let r=e.get(\"compressionLevel\"),s=r!==\"mixed\"?`c${r}`:\"\";return{cacheKey:[UR,s].join(\"\"),cacheSpec:s}}get mirrorCwd(){if(!this.configuration.get(\"enableMirror\"))return null;let e=`${this.configuration.get(\"globalFolder\")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${nI(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let a=_v(r).hash.slice(0,10);return`${nI(e)}-${a}.zip`}isChecksumCompatible(e){if(e===null)return!1;let{cacheVersion:r,cacheSpec:s}=_v(e);if(r===null||r<OG)return!1;let a=this.configuration.get(\"cacheMigrationMode\");return!(r<UR&&a===\"always\"||s!==this.cacheSpec&&a!==\"required-only\")}getLocatorPath(e,r){return this.mirrorCwd===null?J.resolve(this.cwd,this.getVersionFilename(e)):r===null?J.resolve(this.cwd,this.getVersionFilename(e)):J.resolve(this.cwd,this.getChecksumFilename(e,r))}getLocatorMirrorPath(e){let r=this.mirrorCwd;return r!==null?J.resolve(r,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get(\"enableGlobalCache\"))if(this.immutable){if(!await ce.existsPromise(this.cwd))throw new jt(56,\"Cache path does not exist.\")}else{await ce.mkdirPromise(this.cwd,{recursive:!0});let e=J.resolve(this.cwd,\".gitignore\");await ce.changeFilePromise(e,`/.gitignore\n*.flock\n*.tmp\n`)}(this.mirrorCwd||!this.immutable)&&await ce.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,r,{onHit:s,onMiss:a,loader:n,...c}){let f=this.getLocatorMirrorPath(e),p=new Yn,h=()=>{let pe=new As,Be=J.join(vt.root,x8(e));return pe.mkdirSync(Be,{recursive:!0}),pe.writeJsonSync(J.join(Be,Er.manifest),{name:un(e),mocked:!0}),pe},E=async(pe,{isColdHit:Be,controlPath:Ce=null})=>{if(Ce===null&&c.unstablePackages?.has(e.locatorHash))return{isValid:!0,hash:null};let g=r&&!Be?_v(r).cacheKey:this.cacheKey,we=!c.skipIntegrityCheck||!r?`${g}/${await SQ(pe)}`:r;if(Ce!==null){let Ae=!c.skipIntegrityCheck||!r?`${this.cacheKey}/${await SQ(Ce)}`:r;if(we!==Ae)throw new jt(18,\"The remote archive doesn't match the local checksum - has the local cache been corrupted?\")}let ye=null;switch(r!==null&&we!==r&&(this.check?ye=\"throw\":_v(r).cacheKey!==_v(we).cacheKey?ye=\"update\":ye=this.configuration.get(\"checksumBehavior\")),ye){case null:case\"update\":return{isValid:!0,hash:we};case\"ignore\":return{isValid:!0,hash:r};case\"reset\":return{isValid:!1,hash:r};default:case\"throw\":throw new jt(18,\"The remote archive doesn't match the expected checksum\")}},C=async pe=>{if(!n)throw new Error(`Cache check required but no loader configured for ${Yr(this.configuration,e)}`);let Be=await n(),Ce=Be.getRealPath();Be.saveAndClose(),await ce.chmodPromise(Ce,420);let g=await E(pe,{controlPath:Ce,isColdHit:!1});if(!g.isValid)throw new Error(\"Assertion failed: Expected a valid checksum\");return g.hash},S=async()=>{if(f===null||!await ce.existsPromise(f)){let pe=await n(),Be=pe.getRealPath();return pe.saveAndClose(),{source:\"loader\",path:Be}}return{source:\"mirror\",path:f}},P=async()=>{if(!n)throw new Error(`Cache entry required but missing for ${Yr(this.configuration,e)}`);if(this.immutable)throw new jt(56,`Cache entry required but missing for ${Yr(this.configuration,e)}`);let{path:pe,source:Be}=await S(),{hash:Ce}=await E(pe,{isColdHit:!0}),g=this.getLocatorPath(e,Ce),we=[];Be!==\"mirror\"&&f!==null&&we.push(async()=>{let Ae=`${f}${this.cacheId}`;await ce.copyFilePromise(pe,Ae,NG.default.constants.COPYFILE_FICLONE),await ce.chmodPromise(Ae,420),await ce.renamePromise(Ae,f)}),(!c.mirrorWriteOnly||f===null)&&we.push(async()=>{let Ae=`${g}${this.cacheId}`;await ce.copyFilePromise(pe,Ae,NG.default.constants.COPYFILE_FICLONE),await ce.chmodPromise(Ae,420),await ce.renamePromise(Ae,g)});let ye=c.mirrorWriteOnly?f??g:g;return await Promise.all(we.map(Ae=>Ae())),[!1,ye,Ce]},I=async()=>{let Be=(async()=>{let Ce=c.unstablePackages?.has(e.locatorHash),g=Ce||!r||this.isChecksumCompatible(r)?this.getLocatorPath(e,r):null,we=g!==null?this.markedFiles.has(g)||await p.existsPromise(g):!1,ye=!!c.mockedPackages?.has(e.locatorHash)&&(!this.check||!we),Ae=ye||we,se=Ae?s:a;if(se&&se(),Ae){let Z=null,De=g;if(!ye)if(this.check)Z=await C(De);else{let Re=await E(De,{isColdHit:!1});if(Re.isValid)Z=Re.hash;else return P()}return[ye,De,Z]}else{if(this.immutable&&Ce)throw new jt(56,`Cache entry required but missing for ${Yr(this.configuration,e)}; consider defining ${he.pretty(this.configuration,\"supportedArchitectures\",he.Type.CODE)} to cache packages for multiple systems`);return P()}})();this.mutexes.set(e.locatorHash,Be);try{return await Be}finally{this.mutexes.delete(e.locatorHash)}};for(let pe;pe=this.mutexes.get(e.locatorHash);)await pe;let[R,N,U]=await I();R||this.markedFiles.add(N);let W=()=>this.refCountedZipFsCache.addOrCreate(N,()=>R?h():new As(N,{baseFs:p,readOnly:!0})),ee,ie=new oE(()=>W4(()=>(ee=W(),ee.value),pe=>`Failed to open the cache entry for ${Yr(this.configuration,e)}: ${pe}`),J),ue=new _f(N,{baseFs:ie,pathUtils:J}),le=()=>{ee?.release()},me=c.unstablePackages?.has(e.locatorHash)?null:U;return[ue,le,me]}},zot=/^(?:(?<cacheKey>(?<cacheVersion>[0-9]+)(?<cacheSpec>.*))\\/)?(?<hash>.*)$/});var _R,pde=Xe(()=>{_R=(r=>(r[r.SCRIPT=0]=\"SCRIPT\",r[r.SHELLCODE=1]=\"SHELLCODE\",r))(_R||{})});var Xot,KI,MG=Xe(()=>{Dt();wc();Rp();Wo();Xot=[[/^(git(?:\\+(?:https|ssh))?:\\/\\/.*(?:\\.git)?)#(.*)$/,(t,e,r,s)=>`${r}#commit=${s}`],[/^https:\\/\\/((?:[^/]+?)@)?codeload\\.github\\.com\\/([^/]+\\/[^/]+)\\/tar\\.gz\\/([0-9a-f]+)$/,(t,e,r=\"\",s,a)=>`https://${r}github.com/${s}.git#commit=${a}`],[/^https:\\/\\/((?:[^/]+?)@)?github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?#([0-9a-f]+)$/,(t,e,r=\"\",s,a)=>`https://${r}github.com/${s}.git#commit=${a}`],[/^https?:\\/\\/[^/]+\\/(?:[^/]+\\/)*(?:@.+(?:\\/|(?:%2f)))?([^/]+)\\/(?:-|download)\\/\\1-[^/]+\\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\\/\\/npm\\.pkg\\.github\\.com\\/download\\/(?:@[^/]+)\\/(?:[^/]+)\\/(?:[^/]+)\\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\\/\\/npm\\.fontawesome\\.com\\/(?:@[^/]+)\\/([^/]+)\\/-\\/([^/]+)\\/\\1-\\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\\/\\/[^/]+\\/.*\\/(@[^/]+)\\/([^/]+)\\/-\\/\\1\\/\\2-(?:[.\\d\\w-]+)\\.tgz(?:#|$)/,(t,e)=>kQ({protocol:\"npm:\",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],KI=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:r}){let s=J.join(e.cwd,Er.lockfile);if(!ce.existsSync(s))return;let a=await ce.readFilePromise(s,\"utf8\"),n=ls(a);if(Object.hasOwn(n,\"__metadata\"))return;let c=this.resolutions=new Map;for(let f of Object.keys(n)){let p=HB(f);if(!p){r.reportWarning(14,`Failed to parse the string \"${f}\" into a proper descriptor`);continue}let h=cl(p.range)?On(p,`npm:${p.range}`):p,{version:E,resolved:C}=n[f];if(!C)continue;let S;for(let[I,R]of Xot){let N=C.match(I);if(N){S=R(E,...N);break}}if(!S){r.reportWarning(14,`${ni(e.configuration,h)}: Only some patterns can be imported from legacy lockfiles (not \"${C}\")`);continue}let P=h;try{let I=em(h.range),R=HB(I.selector,!0);R&&(P=R)}catch{}c.set(h.descriptorHash,Ws(P,S))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error(\"Assertion failed: This resolver doesn't support resolving locators to packages\")}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){if(!this.resolutions)throw new Error(\"Assertion failed: The resolution store should have been setup\");let a=this.resolutions.get(e.descriptorHash);if(!a)throw new Error(\"Assertion failed: The resolution should have been registered\");let n=S8(a),c=s.project.configuration.normalizeDependency(n);return await this.resolver.getCandidates(c,r,s)}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){throw new Error(\"Assertion failed: This resolver doesn't support resolving locators to packages\")}}});var lA,hde=Xe(()=>{Tc();Ev();xc();lA=class extends Ao{constructor({configuration:r,stdout:s,suggestInstall:a=!0}){super();this.errorCount=0;RB(this,{configuration:r}),this.configuration=r,this.stdout=s,this.suggestInstall=a}static async start(r,s){let a=new this(r);try{await s(a)}catch(n){a.reportExceptionOnce(n)}finally{await a.finalize()}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(r){}reportCacheMiss(r){}startSectionSync(r,s){return s()}async startSectionPromise(r,s){return await s()}startTimerSync(r,s,a){return(typeof s==\"function\"?s:a)()}async startTimerPromise(r,s,a){return await(typeof s==\"function\"?s:a)()}reportSeparator(){}reportInfo(r,s){}reportWarning(r,s){}reportError(r,s){this.errorCount+=1,this.stdout.write(`${Ht(this.configuration,\"\\u27A4\",\"redBright\")} ${this.formatNameWithHyperlink(r)}: ${s}\n`)}reportProgress(r){return{...Promise.resolve().then(async()=>{for await(let{}of r);}),stop:()=>{}}}reportJson(r){}reportFold(r,s){}async finalize(){this.errorCount>0&&(this.stdout.write(`\n`),this.stdout.write(`${Ht(this.configuration,\"\\u27A4\",\"redBright\")} Errors happened when preparing the environment required to run this command.\n`),this.suggestInstall&&this.stdout.write(`${Ht(this.configuration,\"\\u27A4\",\"redBright\")} This might be caused by packages being missing from the lockfile, in which case running \"yarn install\" might help.\n`))}formatNameWithHyperlink(r){return Wj(r,{configuration:this.configuration,json:!1})}}});var zI,UG=Xe(()=>{Wo();zI=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(bQ(e).locatorHash))}supportsLocator(e,r){return!!(r.project.originalPackages.has(e.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(e,r){throw new Error(\"The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes\")}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,s){let a=s.project.storedResolutions.get(e.descriptorHash);if(a){let c=s.project.originalPackages.get(a);if(c)return[c]}let n=s.project.originalPackages.get(bQ(e).locatorHash);if(n)return[n];throw new Error(\"Resolution expected from the lockfile data\")}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let s=r.project.originalPackages.get(e.locatorHash);if(!s)throw new Error(\"The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache\");return s}}});function Kp(){}function Zot(t,e,r,s,a){for(var n=0,c=e.length,f=0,p=0;n<c;n++){var h=e[n];if(h.removed){if(h.value=t.join(s.slice(p,p+h.count)),p+=h.count,n&&e[n-1].added){var C=e[n-1];e[n-1]=e[n],e[n]=C}}else{if(!h.added&&a){var E=r.slice(f,f+h.count);E=E.map(function(P,I){var R=s[p+I];return R.length>P.length?R:P}),h.value=t.join(E)}else h.value=t.join(r.slice(f,f+h.count));f+=h.count,h.added||(p+=h.count)}}var S=e[c-1];return c>1&&typeof S.value==\"string\"&&(S.added||S.removed)&&t.equals(\"\",S.value)&&(e[c-2].value+=S.value,e.pop()),e}function $ot(t){return{newPos:t.newPos,components:t.components.slice(0)}}function eat(t,e){if(typeof t==\"function\")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}function mde(t,e,r){return r=eat(r,{ignoreWhitespace:!0}),qG.diff(t,e,r)}function tat(t,e,r){return WG.diff(t,e,r)}function HR(t){\"@babel/helpers - typeof\";return typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?HR=function(e){return typeof e}:HR=function(e){return e&&typeof Symbol==\"function\"&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},HR(t)}function _G(t){return iat(t)||sat(t)||oat(t)||aat()}function iat(t){if(Array.isArray(t))return HG(t)}function sat(t){if(typeof Symbol<\"u\"&&Symbol.iterator in Object(t))return Array.from(t)}function oat(t,e){if(t){if(typeof t==\"string\")return HG(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);if(r===\"Object\"&&t.constructor&&(r=t.constructor.name),r===\"Map\"||r===\"Set\")return Array.from(t);if(r===\"Arguments\"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return HG(t,e)}}function HG(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,s=new Array(e);r<e;r++)s[r]=t[r];return s}function aat(){throw new TypeError(`Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function jG(t,e,r,s,a){e=e||[],r=r||[],s&&(t=s(a,t));var n;for(n=0;n<e.length;n+=1)if(e[n]===t)return r[n];var c;if(lat.call(t)===\"[object Array]\"){for(e.push(t),c=new Array(t.length),r.push(c),n=0;n<t.length;n+=1)c[n]=jG(t[n],e,r,s,a);return e.pop(),r.pop(),c}if(t&&t.toJSON&&(t=t.toJSON()),HR(t)===\"object\"&&t!==null){e.push(t),c={},r.push(c);var f=[],p;for(p in t)t.hasOwnProperty(p)&&f.push(p);for(f.sort(),n=0;n<f.length;n+=1)p=f[n],c[p]=jG(t[p],e,r,s,p);e.pop(),r.pop()}else c=t;return c}function yde(t,e,r,s,a,n,c){c||(c={}),typeof c.context>\"u\"&&(c.context=4);var f=tat(r,s,c);if(!f)return;f.push({value:\"\",lines:[]});function p(U){return U.map(function(W){return\" \"+W})}for(var h=[],E=0,C=0,S=[],P=1,I=1,R=function(W){var ee=f[W],ie=ee.lines||ee.value.replace(/\\n$/,\"\").split(`\n`);if(ee.lines=ie,ee.added||ee.removed){var ue;if(!E){var le=f[W-1];E=P,C=I,le&&(S=c.context>0?p(le.lines.slice(-c.context)):[],E-=S.length,C-=S.length)}(ue=S).push.apply(ue,_G(ie.map(function(Ae){return(ee.added?\"+\":\"-\")+Ae}))),ee.added?I+=ie.length:P+=ie.length}else{if(E)if(ie.length<=c.context*2&&W<f.length-2){var me;(me=S).push.apply(me,_G(p(ie)))}else{var pe,Be=Math.min(ie.length,c.context);(pe=S).push.apply(pe,_G(p(ie.slice(0,Be))));var Ce={oldStart:E,oldLines:P-E+Be,newStart:C,newLines:I-C+Be,lines:S};if(W>=f.length-2&&ie.length<=c.context){var g=/\\n$/.test(r),we=/\\n$/.test(s),ye=ie.length==0&&S.length>Ce.oldLines;!g&&ye&&r.length>0&&S.splice(Ce.oldLines,0,\"\\\\ No newline at end of file\"),(!g&&!ye||!we)&&S.push(\"\\\\ No newline at end of file\")}h.push(Ce),E=0,C=0,S=[]}P+=ie.length,I+=ie.length}},N=0;N<f.length;N++)R(N);return{oldFileName:t,newFileName:e,oldHeader:a,newHeader:n,hunks:h}}var y8t,gde,dde,qG,WG,rat,nat,lat,Hv,GG,YG=Xe(()=>{Kp.prototype={diff:function(e,r){var s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a=s.callback;typeof s==\"function\"&&(a=s,s={}),this.options=s;var n=this;function c(R){return a?(setTimeout(function(){a(void 0,R)},0),!0):R}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var f=r.length,p=e.length,h=1,E=f+p;s.maxEditLength&&(E=Math.min(E,s.maxEditLength));var C=[{newPos:-1,components:[]}],S=this.extractCommon(C[0],r,e,0);if(C[0].newPos+1>=f&&S+1>=p)return c([{value:this.join(r),count:r.length}]);function P(){for(var R=-1*h;R<=h;R+=2){var N=void 0,U=C[R-1],W=C[R+1],ee=(W?W.newPos:0)-R;U&&(C[R-1]=void 0);var ie=U&&U.newPos+1<f,ue=W&&0<=ee&&ee<p;if(!ie&&!ue){C[R]=void 0;continue}if(!ie||ue&&U.newPos<W.newPos?(N=$ot(W),n.pushComponent(N.components,void 0,!0)):(N=U,N.newPos++,n.pushComponent(N.components,!0,void 0)),ee=n.extractCommon(N,r,e,R),N.newPos+1>=f&&ee+1>=p)return c(Zot(n,N.components,r,e,n.useLongestToken));C[R]=N}h++}if(a)(function R(){setTimeout(function(){if(h>E)return a();P()||R()},0)})();else for(;h<=E;){var I=P();if(I)return I}},pushComponent:function(e,r,s){var a=e[e.length-1];a&&a.added===r&&a.removed===s?e[e.length-1]={count:a.count+1,added:r,removed:s}:e.push({count:1,added:r,removed:s})},extractCommon:function(e,r,s,a){for(var n=r.length,c=s.length,f=e.newPos,p=f-a,h=0;f+1<n&&p+1<c&&this.equals(r[f+1],s[p+1]);)f++,p++,h++;return h&&e.components.push({count:h}),e.newPos=f,p},equals:function(e,r){return this.options.comparator?this.options.comparator(e,r):e===r||this.options.ignoreCase&&e.toLowerCase()===r.toLowerCase()},removeEmpty:function(e){for(var r=[],s=0;s<e.length;s++)e[s]&&r.push(e[s]);return r},castInput:function(e){return e},tokenize:function(e){return e.split(\"\")},join:function(e){return e.join(\"\")}};y8t=new Kp;gde=/^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/,dde=/\\S/,qG=new Kp;qG.equals=function(t,e){return this.options.ignoreCase&&(t=t.toLowerCase(),e=e.toLowerCase()),t===e||this.options.ignoreWhitespace&&!dde.test(t)&&!dde.test(e)};qG.tokenize=function(t){for(var e=t.split(/([^\\S\\r\\n]+|[()[\\]{}'\"\\r\\n]|\\b)/),r=0;r<e.length-1;r++)!e[r+1]&&e[r+2]&&gde.test(e[r])&&gde.test(e[r+2])&&(e[r]+=e[r+2],e.splice(r+1,2),r--);return e};WG=new Kp;WG.tokenize=function(t){var e=[],r=t.split(/(\\n|\\r\\n)/);r[r.length-1]||r.pop();for(var s=0;s<r.length;s++){var a=r[s];s%2&&!this.options.newlineIsToken?e[e.length-1]+=a:(this.options.ignoreWhitespace&&(a=a.trim()),e.push(a))}return e};rat=new Kp;rat.tokenize=function(t){return t.split(/(\\S.+?[.!?])(?=\\s+|$)/)};nat=new Kp;nat.tokenize=function(t){return t.split(/([{}:;,]|\\s+)/)};lat=Object.prototype.toString,Hv=new Kp;Hv.useLongestToken=!0;Hv.tokenize=WG.tokenize;Hv.castInput=function(t){var e=this.options,r=e.undefinedReplacement,s=e.stringifyReplacer,a=s===void 0?function(n,c){return typeof c>\"u\"?r:c}:s;return typeof t==\"string\"?t:JSON.stringify(jG(t,null,null,a),a,\"  \")};Hv.equals=function(t,e){return Kp.prototype.equals.call(Hv,t.replace(/,([\\r\\n])/g,\"$1\"),e.replace(/,([\\r\\n])/g,\"$1\"))};GG=new Kp;GG.tokenize=function(t){return t.slice()};GG.join=GG.removeEmpty=function(t){return t}});var jR,Ede=Xe(()=>{Tc();jR=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,s){return this.resolver.bindDescriptor(e,r,s)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,s){throw new jt(20,`This package doesn't seem to be present in your lockfile; run \"yarn install\" to update the lockfile`)}async getSatisfying(e,r,s,a){throw new jt(20,`This package doesn't seem to be present in your lockfile; run \"yarn install\" to update the lockfile`)}async resolve(e,r){throw new jt(20,`This package doesn't seem to be present in your lockfile; run \"yarn install\" to update the lockfile`)}}});var ki,VG=Xe(()=>{Tc();ki=class extends Ao{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,r){return r()}async startSectionPromise(e,r){return await r()}startTimerSync(e,r,s){return(typeof r==\"function\"?r:s)()}async startTimerPromise(e,r,s){return await(typeof r==\"function\"?r:s)()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(let{}of e);}),stop:()=>{}}}reportJson(e){}reportFold(e,r){}async finalize(){}}});var Ide,XI,JG=Xe(()=>{Dt();Ide=ut(BQ());oI();tm();xc();I0();Rp();Wo();XI=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.project=r,this.cwd=e}async setup(){this.manifest=await Ut.tryFind(this.cwd)??new Ut,this.relativeCwd=J.relative(this.project.cwd,this.cwd)||vt.dot;let e=this.manifest.name?this.manifest.name:Da(null,`${this.computeCandidateName()}-${us(this.relativeCwd).substring(0,6)}`);this.anchoredDescriptor=On(e,`${Ei.protocol}${this.relativeCwd}`),this.anchoredLocator=Ws(e,`${Ei.protocol}${this.relativeCwd}`);let r=this.manifest.workspaceDefinitions.map(({pattern:a})=>a);if(r.length===0)return;let s=await(0,Ide.default)(r,{cwd:fe.fromPortablePath(this.cwd),onlyDirectories:!0,ignore:[\"**/node_modules\",\"**/.git\",\"**/.yarn\"]});s.sort(),await s.reduce(async(a,n)=>{let c=J.resolve(this.cwd,fe.toPortablePath(n)),f=await ce.existsPromise(J.join(c,\"package.json\"));await a,f&&this.workspacesCwds.add(c)},Promise.resolve())}get anchoredPackage(){let e=this.project.storedPackages.get(this.anchoredLocator.locatorHash);if(!e)throw new Error(`Assertion failed: Expected workspace ${GB(this.project.configuration,this)} (${Ht(this.project.configuration,J.join(this.cwd,Er.manifest),ht.PATH)}) to have been resolved. Run \"yarn install\" to update the lockfile`);return e}accepts(e){let r=e.indexOf(\":\"),s=r!==-1?e.slice(0,r+1):null,a=r!==-1?e.slice(r+1):e;if(s===Ei.protocol&&J.normalize(a)===this.relativeCwd||s===Ei.protocol&&(a===\"*\"||a===\"^\"||a===\"~\"))return!0;let n=cl(a);return n?s===Ei.protocol?n.test(this.manifest.version??\"0.0.0\"):this.project.configuration.get(\"enableTransparentWorkspaces\")&&this.manifest.version!==null?n.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?\"root-workspace\":`${J.basename(this.cwd)}`||\"unnamed-workspace\"}getRecursiveWorkspaceDependencies({dependencies:e=Ut.hardDependencies}={}){let r=new Set,s=a=>{for(let n of e)for(let c of a.manifest[n].values()){let f=this.project.tryWorkspaceByDescriptor(c);f===null||r.has(f)||(r.add(f),s(f))}};return s(this),r}getRecursiveWorkspaceDependents({dependencies:e=Ut.hardDependencies}={}){let r=new Set,s=a=>{for(let n of this.project.workspaces)e.some(f=>[...n.manifest[f].values()].some(p=>{let h=this.project.tryWorkspaceByDescriptor(p);return h!==null&&_B(h.anchoredLocator,a.anchoredLocator)}))&&!r.has(n)&&(r.add(n),s(n))};return s(this),r}getRecursiveWorkspaceChildren(){let e=new Set([this]);for(let r of e)for(let s of r.workspacesCwds){let a=this.project.workspacesByCwd.get(s);a&&e.add(a)}return e.delete(this),Array.from(e)}async persistManifest(){let e={};this.manifest.exportTo(e);let r=J.join(this.cwd,Ut.fileName),s=`${JSON.stringify(e,null,this.manifest.indent)}\n`;await ce.changeFilePromise(r,s,{automaticNewlines:!0}),this.manifest.raw=e}}});function hat({project:t,allDescriptors:e,allResolutions:r,allPackages:s,accessibleLocators:a=new Set,optionalBuilds:n=new Set,peerRequirements:c=new Map,peerWarnings:f=[],peerRequirementNodes:p=new Map,volatileDescriptors:h=new Set}){let E=new Map,C=[],S=new Map,P=new Map,I=new Map,R=new Map,N=new Map,U=new Map(t.workspaces.map(le=>{let me=le.anchoredLocator.locatorHash,pe=s.get(me);if(typeof pe>\"u\")throw new Error(\"Assertion failed: The workspace should have an associated package\");return[me,LB(pe)]})),W=()=>{let le=ce.mktempSync(),me=J.join(le,\"stacktrace.log\"),pe=String(C.length+1).length,Be=C.map((Ce,g)=>`${`${g+1}.`.padStart(pe,\" \")} ${ll(Ce)}\n`).join(\"\");throw ce.writeFileSync(me,Be),ce.detachTemp(le),new jt(45,`Encountered a stack overflow when resolving peer dependencies; cf ${fe.fromPortablePath(me)}`)},ee=le=>{let me=r.get(le.descriptorHash);if(typeof me>\"u\")throw new Error(\"Assertion failed: The resolution should have been registered\");let pe=s.get(me);if(!pe)throw new Error(\"Assertion failed: The package could not be found\");return pe},ie=(le,me,pe,{top:Be,optional:Ce})=>{C.length>1e3&&W(),C.push(me);let g=ue(le,me,pe,{top:Be,optional:Ce});return C.pop(),g},ue=(le,me,pe,{top:Be,optional:Ce})=>{if(Ce||n.delete(me.locatorHash),a.has(me.locatorHash))return;a.add(me.locatorHash);let g=s.get(me.locatorHash);if(!g)throw new Error(`Assertion failed: The package (${Yr(t.configuration,me)}) should have been registered`);let we=new Set,ye=new Map,Ae=[],se=[],Z=[],De=[];for(let Re of Array.from(g.dependencies.values())){if(g.peerDependencies.has(Re.identHash)&&g.locatorHash!==Be)continue;if(kp(Re))throw new Error(\"Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch\");h.delete(Re.descriptorHash);let mt=Ce;if(!mt){let ke=g.dependenciesMeta.get(un(Re));if(typeof ke<\"u\"){let it=ke.get(null);typeof it<\"u\"&&it.optional&&(mt=!0)}}let j=r.get(Re.descriptorHash);if(!j)throw new Error(`Assertion failed: The resolution (${ni(t.configuration,Re)}) should have been registered`);let rt=U.get(j)||s.get(j);if(!rt)throw new Error(`Assertion failed: The package (${j}, resolved from ${ni(t.configuration,Re)}) should have been registered`);if(rt.peerDependencies.size===0){ie(Re,rt,new Map,{top:Be,optional:mt});continue}let Fe,Ne,Pe=new Set,Ve=new Map;Ae.push(()=>{Fe=b8(Re,me.locatorHash),Ne=P8(rt,me.locatorHash),g.dependencies.set(Re.identHash,Fe),r.set(Fe.descriptorHash,Ne.locatorHash),e.set(Fe.descriptorHash,Fe),s.set(Ne.locatorHash,Ne),bp(R,Ne.locatorHash).add(Fe.descriptorHash),we.add(Ne.locatorHash)}),se.push(()=>{N.set(Ne.locatorHash,Ve);for(let ke of Ne.peerDependencies.values()){let Ue=Yl(ye,ke.identHash,()=>{let x=pe.get(ke.identHash)??null,w=g.dependencies.get(ke.identHash);return!w&&UB(me,ke)&&(le.identHash===me.identHash?w=le:(w=On(me,le.range),e.set(w.descriptorHash,w),r.set(w.descriptorHash,me.locatorHash),h.delete(w.descriptorHash),x=null)),w||(w=On(ke,\"missing:\")),{subject:me,ident:ke,provided:w,root:!x,requests:new Map,hash:`p${us(me.locatorHash,ke.identHash).slice(0,6)}`}}).provided;if(Ue.range===\"missing:\"&&Ne.dependencies.has(ke.identHash)){Ne.peerDependencies.delete(ke.identHash);continue}if(Ve.set(ke.identHash,{requester:Ne,descriptor:ke,meta:Ne.peerDependenciesMeta.get(un(ke)),children:new Map}),Ne.dependencies.set(ke.identHash,Ue),kp(Ue)){let x=r.get(Ue.descriptorHash);bp(I,x).add(Ne.locatorHash)}S.set(Ue.identHash,Ue),Ue.range===\"missing:\"&&Pe.add(Ue.identHash)}Ne.dependencies=new Map(qs(Ne.dependencies,([ke,it])=>un(it)))}),Z.push(()=>{if(!s.has(Ne.locatorHash))return;let ke=E.get(rt.locatorHash);typeof ke==\"number\"&&ke>=2&&W();let it=E.get(rt.locatorHash),Ue=typeof it<\"u\"?it+1:1;E.set(rt.locatorHash,Ue),ie(Fe,Ne,Ve,{top:Be,optional:mt}),E.set(rt.locatorHash,Ue-1)}),De.push(()=>{let ke=r.get(Fe.descriptorHash);if(typeof ke>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");let it=N.get(ke);if(typeof it>\"u\")throw new Error(\"Assertion failed: Expected the peer requests to be registered\");for(let Ue of ye.values()){let x=it.get(Ue.ident.identHash);x&&(Ue.requests.set(Fe.descriptorHash,x),p.set(Ue.hash,Ue),Ue.root||pe.get(Ue.ident.identHash)?.children.set(Fe.descriptorHash,x))}if(s.has(Ne.locatorHash))for(let Ue of Pe)Ne.dependencies.delete(Ue)})}for(let Re of[...Ae,...se])Re();for(let Re of we){we.delete(Re);let mt=s.get(Re),j=us(rI(mt).locatorHash,...Array.from(mt.dependencies.values(),Pe=>{let Ve=Pe.range!==\"missing:\"?r.get(Pe.descriptorHash):\"missing:\";if(typeof Ve>\"u\")throw new Error(`Assertion failed: Expected the resolution for ${ni(t.configuration,Pe)} to have been registered`);return Ve===Be?`${Ve} (top)`:Ve})),rt=P.get(j);if(typeof rt>\"u\"){P.set(j,mt);continue}let Fe=bp(R,rt.locatorHash);for(let Pe of R.get(mt.locatorHash)??[])r.set(Pe,rt.locatorHash),Fe.add(Pe);s.delete(mt.locatorHash),a.delete(mt.locatorHash),we.delete(mt.locatorHash);let Ne=I.get(mt.locatorHash);if(Ne!==void 0){let Pe=bp(I,rt.locatorHash);for(let Ve of Ne)Pe.add(Ve),we.add(Ve)}}for(let Re of[...Z,...De])Re()};for(let le of t.workspaces){let me=le.anchoredLocator;h.delete(le.anchoredDescriptor.descriptorHash),ie(le.anchoredDescriptor,me,new Map,{top:me.locatorHash,optional:!1})}for(let le of p.values()){if(!le.root)continue;let me=s.get(le.subject.locatorHash);if(typeof me>\"u\")continue;for(let Be of le.requests.values()){let Ce=`p${us(le.subject.locatorHash,un(le.ident),Be.requester.locatorHash).slice(0,6)}`;c.set(Ce,{subject:le.subject.locatorHash,requested:le.ident,rootRequester:Be.requester.locatorHash,allRequesters:Array.from(qB(Be),g=>g.requester.locatorHash)})}let pe=[...qB(le)];if(le.provided.range!==\"missing:\"){let Be=ee(le.provided),Ce=Be.version??\"0.0.0\",g=ye=>{if(ye.startsWith(Ei.protocol)){if(!t.tryWorkspaceByLocator(Be))return null;ye=ye.slice(Ei.protocol.length),(ye===\"^\"||ye===\"~\")&&(ye=\"*\")}return ye},we=!0;for(let ye of pe){let Ae=g(ye.descriptor.range);if(Ae===null){we=!1;continue}if(!Zf(Ce,Ae)){we=!1;let se=`p${us(le.subject.locatorHash,un(le.ident),ye.requester.locatorHash).slice(0,6)}`;f.push({type:1,subject:me,requested:le.ident,requester:ye.requester,version:Ce,hash:se,requirementCount:pe.length})}}if(!we){let ye=pe.map(Ae=>g(Ae.descriptor.range));f.push({type:3,node:le,range:ye.includes(null)?null:Q8(ye),hash:le.hash})}}else{let Be=!0;for(let Ce of pe)if(!Ce.meta?.optional){Be=!1;let g=`p${us(le.subject.locatorHash,un(le.ident),Ce.requester.locatorHash).slice(0,6)}`;f.push({type:0,subject:me,requested:le.ident,requester:Ce.requester,hash:g})}Be||f.push({type:2,node:le,hash:le.hash})}}}function*gat(t){let e=new Map;if(\"children\"in t)e.set(t,t);else for(let r of t.requests.values())e.set(r,r);for(let[r,s]of e){yield{request:r,root:s};for(let a of r.children.values())e.has(a)||e.set(a,s)}}function dat(t,e){let r=[],s=[],a=!1;for(let n of t.peerWarnings)if(!(n.type===1||n.type===0)){if(!t.tryWorkspaceByLocator(n.node.subject)){a=!0;continue}if(n.type===3){let c=t.storedResolutions.get(n.node.provided.descriptorHash);if(typeof c>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");let f=t.storedPackages.get(c);if(typeof f>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");let p=p0(gat(n.node),({request:C,root:S})=>Zf(f.version??\"0.0.0\",C.descriptor.range)?p0.skip:C===S?$i(t.configuration,C.requester):`${$i(t.configuration,C.requester)} (via ${$i(t.configuration,S.requester)})`),h=[...qB(n.node)].length>1?\"and other dependencies request\":\"requests\",E=n.range?iI(t.configuration,n.range):Ht(t.configuration,\"but they have non-overlapping ranges!\",\"redBright\");r.push(`${$i(t.configuration,n.node.ident)} is listed by your project with version ${jB(t.configuration,f.version??\"0.0.0\")} (${Ht(t.configuration,n.hash,ht.CODE)}), which doesn't satisfy what ${p} ${h} (${E}).`)}if(n.type===2){let c=n.node.requests.size>1?\" and other dependencies\":\"\";s.push(`${Yr(t.configuration,n.node.subject)} doesn't provide ${$i(t.configuration,n.node.ident)} (${Ht(t.configuration,n.hash,ht.CODE)}), requested by ${$i(t.configuration,n.node.requests.values().next().value.requester)}${c}.`)}}e.startSectionSync({reportFooter:()=>{e.reportWarning(86,`Some peer dependencies are incorrectly met by your project; run ${Ht(t.configuration,\"yarn explain peer-requirements <hash>\",ht.CODE)} for details, where ${Ht(t.configuration,\"<hash>\",ht.CODE)} is the six-letter p-prefixed code.`)},skipIfEmpty:!0},()=>{for(let n of qs(r,c=>JE.default(c)))e.reportWarning(60,n);for(let n of qs(s,c=>JE.default(c)))e.reportWarning(2,n)}),a&&e.reportWarning(86,`Some peer dependencies are incorrectly met by dependencies; run ${Ht(t.configuration,\"yarn explain peer-requirements\",ht.CODE)} for details.`)}var GR,qR,Bde,XG,zG,ZG,WR,cat,uat,Cde,fat,Aat,pat,$l,KG,YR,wde,Tt,vde=Xe(()=>{Dt();Dt();wc();Yt();GR=Ie(\"crypto\");YG();ql();qR=ut(Ld()),Bde=ut(Ai()),XG=Ie(\"util\"),zG=ut(Ie(\"v8\")),ZG=ut(Ie(\"zlib\"));LG();av();MG();UG();oI();F8();Tc();Ede();Ev();VG();tm();JG();LQ();xc();I0();Pc();gT();zj();Rp();Wo();WR=YE(process.env.YARN_LOCKFILE_VERSION_OVERRIDE??8),cat=3,uat=/ *, */g,Cde=/\\/$/,fat=32,Aat=(0,XG.promisify)(ZG.default.gzip),pat=(0,XG.promisify)(ZG.default.gunzip),$l=(r=>(r.UpdateLockfile=\"update-lockfile\",r.SkipBuild=\"skip-build\",r))($l||{}),KG={restoreLinkersCustomData:[\"linkersCustomData\"],restoreResolutions:[\"accessibleLocators\",\"conditionalLocators\",\"disabledLocators\",\"optionalBuilds\",\"storedDescriptors\",\"storedResolutions\",\"storedPackages\",\"lockFileChecksum\"],restoreBuildState:[\"skippedBuilds\",\"storedBuildState\"]},YR=(a=>(a[a.NotProvided=0]=\"NotProvided\",a[a.NotCompatible=1]=\"NotCompatible\",a[a.NodeNotProvided=2]=\"NodeNotProvided\",a[a.NodeNotCompatible=3]=\"NodeNotCompatible\",a))(YR||{}),wde=t=>us(`${cat}`,t),Tt=class t{constructor(e,{configuration:r}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.skippedBuilds=new Set;this.lockfileLastVersion=null;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.peerWarnings=[];this.peerRequirementNodes=new Map;this.linkersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){if(!e.projectCwd)throw new nt(`No project found in ${r}`);let s=e.projectCwd,a=r,n=null;for(;n!==e.projectCwd;){if(n=a,ce.existsSync(J.join(n,Er.manifest))){s=n;break}a=J.dirname(n)}let c=new t(e.projectCwd,{configuration:e});ze.telemetry?.reportProject(c.cwd),await c.setupResolutions(),await c.setupWorkspaces(),ze.telemetry?.reportWorkspaceCount(c.workspaces.length),ze.telemetry?.reportDependencyCount(c.workspaces.reduce((I,R)=>I+R.manifest.dependencies.size+R.manifest.devDependencies.size,0));let f=c.tryWorkspaceByCwd(s);if(f)return{project:c,workspace:f,locator:f.anchoredLocator};let p=await c.findLocatorForLocation(`${s}/`,{strict:!0});if(p)return{project:c,locator:p,workspace:null};let h=Ht(e,c.cwd,ht.PATH),E=Ht(e,J.relative(c.cwd,s),ht.PATH),C=`- If ${h} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,S=`- If ${h} is intended to be a project, it might be that you forgot to list ${E} in its workspace configuration.`,P=`- Finally, if ${h} is fine and you intend ${E} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new nt(`The nearest package directory (${Ht(e,s,ht.PATH)}) doesn't seem to be part of the project declared in ${Ht(e,c.cwd,ht.PATH)}.\n\n${[C,S,P].join(`\n`)}`)}async setupResolutions(){this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=J.join(this.cwd,Er.lockfile),r=this.configuration.get(\"defaultLanguageName\");if(ce.existsSync(e)){let s=await ce.readFilePromise(e,\"utf8\");this.lockFileChecksum=wde(s);let a=ls(s);if(a.__metadata){let n=a.__metadata.version,c=a.__metadata.cacheKey;this.lockfileLastVersion=n,this.lockfileNeedsRefresh=n<WR;for(let f of Object.keys(a)){if(f===\"__metadata\")continue;let p=a[f];if(typeof p.resolution>\"u\")throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${f})`);let h=Qp(p.resolution,!0),E=new Ut;E.load(p,{yamlCompatibilityMode:!0});let C=E.version,S=E.languageName||r,P=p.linkType.toUpperCase(),I=p.conditions??null,R=E.dependencies,N=E.peerDependencies,U=E.dependenciesMeta,W=E.peerDependenciesMeta,ee=E.bin;if(p.checksum!=null){let ue=typeof c<\"u\"&&!p.checksum.includes(\"/\")?`${c}/${p.checksum}`:p.checksum;this.storedChecksums.set(h.locatorHash,ue)}let ie={...h,version:C,languageName:S,linkType:P,conditions:I,dependencies:R,peerDependencies:N,dependenciesMeta:U,peerDependenciesMeta:W,bin:ee};this.originalPackages.set(ie.locatorHash,ie);for(let ue of f.split(uat)){let le=C0(ue);n<=6&&(le=this.configuration.normalizeDependency(le),le=On(le,le.range.replace(/^patch:[^@]+@(?!npm(:|%3A))/,\"$1npm%3A\"))),this.storedDescriptors.set(le.descriptorHash,le),this.storedResolutions.set(le.descriptorHash,h.locatorHash)}}}else s.includes(\"yarn lockfile v1\")&&(this.lockfileLastVersion=-1)}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=new Set,r=(0,qR.default)(4),s=async(a,n)=>{if(e.has(n))return a;e.add(n);let c=new XI(n,{project:this});await r(()=>c.setup());let f=a.then(()=>{this.addWorkspace(c)});return Array.from(c.workspacesCwds).reduce(s,f)};await s(Promise.resolve(),this.cwd)}addWorkspace(e){let r=this.workspacesByIdent.get(e.anchoredLocator.identHash);if(typeof r<\"u\")throw new Error(`Duplicate workspace name ${$i(this.configuration,e.anchoredLocator)}: ${fe.fromPortablePath(e.cwd)} conflicts with ${fe.fromPortablePath(r.cwd)}`);this.workspaces.push(e),this.workspacesByCwd.set(e.cwd,e),this.workspacesByIdent.set(e.anchoredLocator.identHash,e)}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){J.isAbsolute(e)||(e=J.resolve(this.cwd,e)),e=J.normalize(e).replace(/\\/+$/,\"\");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let s of this.workspaces)J.relative(s.cwd,e).startsWith(\"../\")||r&&r.cwd.length>=s.cwd.length||(r=s);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r>\"u\"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${$i(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){if(e.range.startsWith(Ei.protocol)){let s=e.range.slice(Ei.protocol.length);if(s!==\"^\"&&s!==\"~\"&&s!==\"*\"&&!cl(s))return this.tryWorkspaceByCwd(s)}let r=this.tryWorkspaceByIdent(e);return r===null||(kp(e)&&(e=MB(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${ni(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(Gu(e)&&(e=rI(e)),r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${Yr(this.configuration,e)})`);return r}deleteDescriptor(e){this.storedResolutions.delete(e),this.storedDescriptors.delete(e)}deleteLocator(e){this.originalPackages.delete(e),this.storedPackages.delete(e),this.accessibleLocators.delete(e)}forgetResolution(e){if(\"descriptorHash\"in e){let r=this.storedResolutions.get(e.descriptorHash);this.deleteDescriptor(e.descriptorHash);let s=new Set(this.storedResolutions.values());typeof r<\"u\"&&!s.has(r)&&this.deleteLocator(r)}if(\"locatorHash\"in e){this.deleteLocator(e.locatorHash);for(let[r,s]of this.storedResolutions)s===e.locatorHash&&this.deleteDescriptor(r)}}forgetTransientResolutions(){let e=this.configuration.makeResolver(),r=new Map;for(let[s,a]of this.storedResolutions.entries()){let n=r.get(a);n||r.set(a,n=new Set),n.add(s)}for(let s of this.originalPackages.values()){let a;try{a=e.shouldPersistResolution(s,{project:this,resolver:e})}catch{a=!1}if(!a){this.deleteLocator(s.locatorHash);let n=r.get(s.locatorHash);if(n){r.delete(s.locatorHash);for(let c of n)this.deleteDescriptor(c)}}}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,s]of e.dependencies)kp(s)&&e.dependencies.set(r,MB(s))}getDependencyMeta(e,r){let s={},n=this.topLevelWorkspace.manifest.dependenciesMeta.get(un(e));if(!n)return s;let c=n.get(null);if(c&&Object.assign(s,c),r===null||!Bde.default.valid(r))return s;for(let[f,p]of n)f!==null&&f===r&&Object.assign(s,p);return s}async findLocatorForLocation(e,{strict:r=!1}={}){let s=new ki,a=this.configuration.getLinkers(),n={project:this,report:s};for(let c of a){let f=await c.findPackageLocator(e,n);if(f){if(r&&(await c.findPackageLocation(f,n)).replace(Cde,\"\")!==e.replace(Cde,\"\"))continue;return f}}return null}async loadUserConfig(){let e=J.join(this.cwd,\".pnp.cjs\");await ce.existsPromise(e)&&Pp(e).setup();let r=J.join(this.cwd,\"yarn.config.cjs\");return await ce.existsPromise(r)?Pp(r):null}async preparePackage(e,{resolver:r,resolveOptions:s}){let a=await this.configuration.getPackageExtensions(),n=this.configuration.normalizePackage(e,{packageExtensions:a});for(let[c,f]of n.dependencies){let p=await this.configuration.reduceHook(E=>E.reduceDependency,f,this,n,f,{resolver:r,resolveOptions:s});if(!UB(f,p))throw new Error(\"Assertion failed: The descriptor ident cannot be changed through aliases\");let h=r.bindDescriptor(p,n,s);n.dependencies.set(c,h)}return n}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error(\"Workspaces must have been setup before calling this function\");this.forgetVirtualResolutions();let r=new Map(this.originalPackages),s=[];e.lockfileOnly||this.forgetTransientResolutions();let a=e.resolver||this.configuration.makeResolver(),n=new KI(a);await n.setup(this,{report:e.report});let c=e.lockfileOnly?[new jR(a)]:[n,a],f=new rm([new zI(a),...c]),p=new rm([...c]),h=this.configuration.makeFetcher(),E=e.lockfileOnly?{project:this,report:e.report,resolver:f}:{project:this,report:e.report,resolver:f,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:h,cacheOptions:{mirrorWriteOnly:!0}}},C=new Map,S=new Map,P=new Map,I=new Map,R=new Map,N=new Map,U=this.topLevelWorkspace.anchoredLocator,W=new Set,ee=[],ie=uj(),ue=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Ao.progressViaTitle(),async se=>{let Z=async rt=>{let Fe=await qE(async()=>await f.resolve(rt,E),ke=>`${Yr(this.configuration,rt)}: ${ke}`);if(!_B(rt,Fe))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${Yr(this.configuration,rt)} to ${Yr(this.configuration,Fe)})`);I.set(Fe.locatorHash,Fe),!r.delete(Fe.locatorHash)&&!this.tryWorkspaceByLocator(Fe)&&s.push(Fe);let Pe=await this.preparePackage(Fe,{resolver:f,resolveOptions:E}),Ve=Uu([...Pe.dependencies.values()].map(ke=>j(ke)));return ee.push(Ve),Ve.catch(()=>{}),S.set(Pe.locatorHash,Pe),Pe},De=async rt=>{let Fe=R.get(rt.locatorHash);if(typeof Fe<\"u\")return Fe;let Ne=Promise.resolve().then(()=>Z(rt));return R.set(rt.locatorHash,Ne),Ne},Re=async(rt,Fe)=>{let Ne=await j(Fe);return C.set(rt.descriptorHash,rt),P.set(rt.descriptorHash,Ne.locatorHash),Ne},mt=async rt=>{se.setTitle(ni(this.configuration,rt));let Fe=this.resolutionAliases.get(rt.descriptorHash);if(typeof Fe<\"u\")return Re(rt,this.storedDescriptors.get(Fe));let Ne=f.getResolutionDependencies(rt,E),Pe=Object.fromEntries(await Uu(Object.entries(Ne).map(async([it,Ue])=>{let x=f.bindDescriptor(Ue,U,E),w=await j(x);return W.add(w.locatorHash),[it,w]}))),ke=(await qE(async()=>await f.getCandidates(rt,Pe,E),it=>`${ni(this.configuration,rt)}: ${it}`))[0];if(typeof ke>\"u\")throw new jt(82,`${ni(this.configuration,rt)}: No candidates found`);if(e.checkResolutions){let{locators:it}=await p.getSatisfying(rt,Pe,[ke],{...E,resolver:p});if(!it.find(Ue=>Ue.locatorHash===ke.locatorHash))throw new jt(78,`Invalid resolution ${FB(this.configuration,rt,ke)}`)}return C.set(rt.descriptorHash,rt),P.set(rt.descriptorHash,ke.locatorHash),De(ke)},j=rt=>{let Fe=N.get(rt.descriptorHash);if(typeof Fe<\"u\")return Fe;C.set(rt.descriptorHash,rt);let Ne=Promise.resolve().then(()=>mt(rt));return N.set(rt.descriptorHash,Ne),Ne};for(let rt of this.workspaces){let Fe=rt.anchoredDescriptor;ee.push(j(Fe))}for(;ee.length>0;){let rt=[...ee];ee.length=0,await Uu(rt)}});let le=Wl(r.values(),se=>this.tryWorkspaceByLocator(se)?Wl.skip:se);if(s.length>0||le.length>0){let se=new Set(this.workspaces.flatMap(rt=>{let Fe=S.get(rt.anchoredLocator.locatorHash);if(!Fe)throw new Error(\"Assertion failed: The workspace should have been resolved\");return Array.from(Fe.dependencies.values(),Ne=>{let Pe=P.get(Ne.descriptorHash);if(!Pe)throw new Error(\"Assertion failed: The resolution should have been registered\");return Pe})})),Z=rt=>se.has(rt.locatorHash)?\"0\":\"1\",De=rt=>ll(rt),Re=qs(s,[Z,De]),mt=qs(le,[Z,De]),j=e.report.getRecommendedLength();Re.length>0&&e.report.reportInfo(85,`${Ht(this.configuration,\"+\",ht.ADDED)} ${$k(this.configuration,Re,j)}`),mt.length>0&&e.report.reportInfo(85,`${Ht(this.configuration,\"-\",ht.REMOVED)} ${$k(this.configuration,mt,j)}`)}let me=new Set(this.resolutionAliases.values()),pe=new Set(S.keys()),Be=new Set,Ce=new Map,g=[],we=new Map;hat({project:this,accessibleLocators:Be,volatileDescriptors:me,optionalBuilds:pe,peerRequirements:Ce,peerWarnings:g,peerRequirementNodes:we,allDescriptors:C,allResolutions:P,allPackages:S});for(let se of W)pe.delete(se);for(let se of me)C.delete(se),P.delete(se);let ye=new Set,Ae=new Set;for(let se of S.values())se.conditions!=null&&pe.has(se.locatorHash)&&(TQ(se,ue)||(TQ(se,ie)&&e.report.reportWarningOnce(77,`${Yr(this.configuration,se)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${Ht(this.configuration,\"supportedArchitectures\",ht.SETTING)} setting`),Ae.add(se.locatorHash)),ye.add(se.locatorHash));this.storedResolutions=P,this.storedDescriptors=C,this.storedPackages=S,this.accessibleLocators=Be,this.conditionalLocators=ye,this.disabledLocators=Ae,this.originalPackages=I,this.optionalBuilds=pe,this.peerRequirements=Ce,this.peerWarnings=g,this.peerRequirementNodes=we}async fetchEverything({cache:e,report:r,fetcher:s,mode:a,persistProject:n=!0}){let c={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},f=s||this.configuration.makeFetcher(),p={checksums:this.storedChecksums,project:this,cache:e,fetcher:f,report:r,cacheOptions:c},h=Array.from(new Set(qs(this.storedResolutions.values(),[I=>{let R=this.storedPackages.get(I);if(!R)throw new Error(\"Assertion failed: The locator should have been registered\");return ll(R)}])));a===\"update-lockfile\"&&(h=h.filter(I=>!this.storedChecksums.has(I)));let E=!1,C=Ao.progressViaCounter(h.length);await r.reportProgress(C);let S=(0,qR.default)(fat);if(await Uu(h.map(I=>S(async()=>{let R=this.storedPackages.get(I);if(!R)throw new Error(\"Assertion failed: The locator should have been registered\");if(Gu(R))return;let N;try{N=await f.fetch(R,p)}catch(U){U.message=`${Yr(this.configuration,R)}: ${U.message}`,r.reportExceptionOnce(U),E=U;return}N.checksum!=null?this.storedChecksums.set(R.locatorHash,N.checksum):this.storedChecksums.delete(R.locatorHash),N.releaseFs&&N.releaseFs()}).finally(()=>{C.tick()}))),E)throw E;let P=n&&a!==\"update-lockfile\"?await this.cacheCleanup({cache:e,report:r}):null;if(r.cacheMisses.size>0||P){let R=(await Promise.all([...r.cacheMisses].map(async le=>{let me=this.storedPackages.get(le),pe=this.storedChecksums.get(le)??null,Be=e.getLocatorPath(me,pe);return(await ce.statPromise(Be)).size}))).reduce((le,me)=>le+me,0)-(P?.size??0),N=r.cacheMisses.size,U=P?.count??0,W=`${Wk(N,{zero:\"No new packages\",one:\"A package was\",more:`${Ht(this.configuration,N,ht.NUMBER)} packages were`})} added to the project`,ee=`${Wk(U,{zero:\"none were\",one:\"one was\",more:`${Ht(this.configuration,U,ht.NUMBER)} were`})} removed`,ie=R!==0?` (${Ht(this.configuration,R,ht.SIZE_DIFF)})`:\"\",ue=U>0?N>0?`${W}, and ${ee}${ie}.`:`${W}, but ${ee}${ie}.`:`${W}${ie}.`;r.reportInfo(13,ue)}}async linkEverything({cache:e,report:r,fetcher:s,mode:a}){let n={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},c=s||this.configuration.makeFetcher(),f={checksums:this.storedChecksums,project:this,cache:e,fetcher:c,report:r,cacheOptions:n},p=this.configuration.getLinkers(),h={project:this,report:r},E=new Map(p.map(ye=>{let Ae=ye.makeInstaller(h),se=ye.getCustomDataKey(),Z=this.linkersCustomData.get(se);return typeof Z<\"u\"&&Ae.attachCustomData(Z),[ye,Ae]})),C=new Map,S=new Map,P=new Map,I=new Map(await Uu([...this.accessibleLocators].map(async ye=>{let Ae=this.storedPackages.get(ye);if(!Ae)throw new Error(\"Assertion failed: The locator should have been registered\");return[ye,await c.fetch(Ae,f)]}))),R=[],N=new Set,U=[];for(let ye of this.accessibleLocators){let Ae=this.storedPackages.get(ye);if(typeof Ae>\"u\")throw new Error(\"Assertion failed: The locator should have been registered\");let se=I.get(Ae.locatorHash);if(typeof se>\"u\")throw new Error(\"Assertion failed: The fetch result should have been registered\");let Z=[],De=mt=>{Z.push(mt)},Re=this.tryWorkspaceByLocator(Ae);if(Re!==null){let mt=[],{scripts:j}=Re.manifest;for(let Fe of[\"preinstall\",\"install\",\"postinstall\"])j.has(Fe)&&mt.push({type:0,script:Fe});try{for(let[Fe,Ne]of E)if(Fe.supportsPackage(Ae,h)&&(await Ne.installPackage(Ae,se,{holdFetchResult:De})).buildRequest!==null)throw new Error(\"Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core\")}finally{Z.length===0?se.releaseFs?.():R.push(Uu(Z).catch(()=>{}).then(()=>{se.releaseFs?.()}))}let rt=J.join(se.packageFs.getRealPath(),se.prefixPath);S.set(Ae.locatorHash,rt),!Gu(Ae)&&mt.length>0&&P.set(Ae.locatorHash,{buildDirectives:mt,buildLocations:[rt]})}else{let mt=p.find(Fe=>Fe.supportsPackage(Ae,h));if(!mt)throw new jt(12,`${Yr(this.configuration,Ae)} isn't supported by any available linker`);let j=E.get(mt);if(!j)throw new Error(\"Assertion failed: The installer should have been registered\");let rt;try{rt=await j.installPackage(Ae,se,{holdFetchResult:De})}finally{Z.length===0?se.releaseFs?.():R.push(Uu(Z).then(()=>{}).then(()=>{se.releaseFs?.()}))}C.set(Ae.locatorHash,mt),S.set(Ae.locatorHash,rt.packageLocation),rt.buildRequest&&rt.packageLocation&&(rt.buildRequest.skipped?(N.add(Ae.locatorHash),this.skippedBuilds.has(Ae.locatorHash)||U.push([Ae,rt.buildRequest.explain])):P.set(Ae.locatorHash,{buildDirectives:rt.buildRequest.directives,buildLocations:[rt.packageLocation]}))}}let W=new Map;for(let ye of this.accessibleLocators){let Ae=this.storedPackages.get(ye);if(!Ae)throw new Error(\"Assertion failed: The locator should have been registered\");let se=this.tryWorkspaceByLocator(Ae)!==null,Z=async(De,Re)=>{let mt=S.get(Ae.locatorHash);if(typeof mt>\"u\")throw new Error(`Assertion failed: The package (${Yr(this.configuration,Ae)}) should have been registered`);let j=[];for(let rt of Ae.dependencies.values()){let Fe=this.storedResolutions.get(rt.descriptorHash);if(typeof Fe>\"u\")throw new Error(`Assertion failed: The resolution (${ni(this.configuration,rt)}, from ${Yr(this.configuration,Ae)})should have been registered`);let Ne=this.storedPackages.get(Fe);if(typeof Ne>\"u\")throw new Error(`Assertion failed: The package (${Fe}, resolved from ${ni(this.configuration,rt)}) should have been registered`);let Pe=this.tryWorkspaceByLocator(Ne)===null?C.get(Fe):null;if(typeof Pe>\"u\")throw new Error(`Assertion failed: The package (${Fe}, resolved from ${ni(this.configuration,rt)}) should have been registered`);Pe===De||Pe===null?S.get(Ne.locatorHash)!==null&&j.push([rt,Ne]):!se&&mt!==null&&xB(W,Fe).push(mt)}mt!==null&&await Re.attachInternalDependencies(Ae,j)};if(se)for(let[De,Re]of E)De.supportsPackage(Ae,h)&&await Z(De,Re);else{let De=C.get(Ae.locatorHash);if(!De)throw new Error(\"Assertion failed: The linker should have been found\");let Re=E.get(De);if(!Re)throw new Error(\"Assertion failed: The installer should have been registered\");await Z(De,Re)}}for(let[ye,Ae]of W){let se=this.storedPackages.get(ye);if(!se)throw new Error(\"Assertion failed: The package should have been registered\");let Z=C.get(se.locatorHash);if(!Z)throw new Error(\"Assertion failed: The linker should have been found\");let De=E.get(Z);if(!De)throw new Error(\"Assertion failed: The installer should have been registered\");await De.attachExternalDependents(se,Ae)}let ee=new Map;for(let[ye,Ae]of E){let se=await Ae.finalizeInstall();for(let Z of se?.records??[])Z.buildRequest.skipped?(N.add(Z.locator.locatorHash),this.skippedBuilds.has(Z.locator.locatorHash)||U.push([Z.locator,Z.buildRequest.explain])):P.set(Z.locator.locatorHash,{buildDirectives:Z.buildRequest.directives,buildLocations:Z.buildLocations});typeof se?.customData<\"u\"&&ee.set(ye.getCustomDataKey(),se.customData)}if(this.linkersCustomData=ee,await Uu(R),a===\"skip-build\")return;for(let[,ye]of qs(U,([Ae])=>ll(Ae)))ye(r);let ie=new Set(P.keys()),ue=(0,GR.createHash)(\"sha512\");ue.update(process.versions.node),await this.configuration.triggerHook(ye=>ye.globalHashGeneration,this,ye=>{ue.update(\"\\0\"),ue.update(ye)});let le=ue.digest(\"hex\"),me=new Map,pe=ye=>{let Ae=me.get(ye.locatorHash);if(typeof Ae<\"u\")return Ae;let se=this.storedPackages.get(ye.locatorHash);if(typeof se>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");let Z=(0,GR.createHash)(\"sha512\");Z.update(ye.locatorHash),me.set(ye.locatorHash,\"<recursive>\");for(let De of se.dependencies.values()){let Re=this.storedResolutions.get(De.descriptorHash);if(typeof Re>\"u\")throw new Error(`Assertion failed: The resolution (${ni(this.configuration,De)}) should have been registered`);let mt=this.storedPackages.get(Re);if(typeof mt>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");Z.update(pe(mt))}return Ae=Z.digest(\"hex\"),me.set(ye.locatorHash,Ae),Ae},Be=(ye,Ae)=>{let se=(0,GR.createHash)(\"sha512\");se.update(le),se.update(pe(ye));for(let Z of Ae)se.update(Z);return se.digest(\"hex\")},Ce=new Map,g=!1,we=ye=>{let Ae=new Set([ye.locatorHash]);for(let se of Ae){let Z=this.storedPackages.get(se);if(!Z)throw new Error(\"Assertion failed: The package should have been registered\");for(let De of Z.dependencies.values()){let Re=this.storedResolutions.get(De.descriptorHash);if(!Re)throw new Error(`Assertion failed: The resolution (${ni(this.configuration,De)}) should have been registered`);if(Re!==ye.locatorHash&&ie.has(Re))return!1;let mt=this.storedPackages.get(Re);if(!mt)throw new Error(\"Assertion failed: The package should have been registered\");let j=this.tryWorkspaceByLocator(mt);if(j){if(j.anchoredLocator.locatorHash!==ye.locatorHash&&ie.has(j.anchoredLocator.locatorHash))return!1;Ae.add(j.anchoredLocator.locatorHash)}Ae.add(Re)}}return!0};for(;ie.size>0;){let ye=ie.size,Ae=[];for(let se of ie){let Z=this.storedPackages.get(se);if(!Z)throw new Error(\"Assertion failed: The package should have been registered\");if(!we(Z))continue;let De=P.get(Z.locatorHash);if(!De)throw new Error(\"Assertion failed: The build directive should have been registered\");let Re=Be(Z,De.buildLocations);if(this.storedBuildState.get(Z.locatorHash)===Re){Ce.set(Z.locatorHash,Re),ie.delete(se);continue}g||(await this.persistInstallStateFile(),g=!0),this.storedBuildState.has(Z.locatorHash)?r.reportInfo(8,`${Yr(this.configuration,Z)} must be rebuilt because its dependency tree changed`):r.reportInfo(7,`${Yr(this.configuration,Z)} must be built because it never has been before or the last one failed`);let mt=De.buildLocations.map(async j=>{if(!J.isAbsolute(j))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${j})`);for(let rt of De.buildDirectives){let Fe=`# This file contains the result of Yarn building a package (${ll(Z)})\n`;switch(rt.type){case 0:Fe+=`# Script name: ${rt.script}\n`;break;case 1:Fe+=`# Script code: ${rt.script}\n`;break}let Ne=null;if(!await ce.mktempPromise(async Ve=>{let ke=J.join(Ve,\"build.log\"),{stdout:it,stderr:Ue}=this.configuration.getSubprocessStreams(ke,{header:Fe,prefix:Yr(this.configuration,Z),report:r}),x;try{switch(rt.type){case 0:x=await LT(Z,rt.script,[],{cwd:j,project:this,stdin:Ne,stdout:it,stderr:Ue});break;case 1:x=await Yj(Z,rt.script,[],{cwd:j,project:this,stdin:Ne,stdout:it,stderr:Ue});break}}catch(y){Ue.write(y.stack),x=1}if(it.end(),Ue.end(),x===0)return!0;ce.detachTemp(Ve);let w=`${Yr(this.configuration,Z)} couldn't be built successfully (exit code ${Ht(this.configuration,x,ht.NUMBER)}, logs can be found here: ${Ht(this.configuration,ke,ht.PATH)})`,b=this.optionalBuilds.has(Z.locatorHash);return b?r.reportInfo(9,w):r.reportError(9,w),ehe&&r.reportFold(fe.fromPortablePath(ke),ce.readFileSync(ke,\"utf8\")),b}))return!1}return!0});Ae.push(...mt,Promise.allSettled(mt).then(j=>{ie.delete(se),j.every(rt=>rt.status===\"fulfilled\"&&rt.value===!0)&&Ce.set(Z.locatorHash,Re)}))}if(await Uu(Ae),ye===ie.size){let se=Array.from(ie).map(Z=>{let De=this.storedPackages.get(Z);if(!De)throw new Error(\"Assertion failed: The package should have been registered\");return Yr(this.configuration,De)}).join(\", \");r.reportError(3,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${se})`);break}}this.storedBuildState=Ce,this.skippedBuilds=N}async installWithNewReport(e,r){return(await Ot.start({configuration:this.configuration,json:e.json,stdout:e.stdout,forceSectionAlignment:!0,includeLogs:!e.json&&!e.quiet,includeVersion:!0},async a=>{await this.install({...r,report:a})})).exitCode()}async install(e){let r=this.configuration.get(\"nodeLinker\");ze.telemetry?.reportInstall(r);let s=!1;if(await e.report.startTimerPromise(\"Project validation\",{skipIfEmpty:!0},async()=>{this.configuration.get(\"enableOfflineMode\")&&e.report.reportWarning(90,\"Offline work is enabled; Yarn won't fetch packages from the remote registry if it can avoid it\"),await this.configuration.triggerHook(E=>E.validateProject,this,{reportWarning:(E,C)=>{e.report.reportWarning(E,C)},reportError:(E,C)=>{e.report.reportError(E,C),s=!0}})}),s)return;let a=await this.configuration.getPackageExtensions();for(let E of a.values())for(let[,C]of E)for(let S of C)S.status=\"inactive\";let n=J.join(this.cwd,Er.lockfile),c=null;if(e.immutable)try{c=await ce.readFilePromise(n,\"utf8\")}catch(E){throw E.code===\"ENOENT\"?new jt(28,\"The lockfile would have been created by this install, which is explicitly forbidden.\"):E}await e.report.startTimerPromise(\"Resolution step\",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise(\"Post-resolution validation\",{skipIfEmpty:!0},async()=>{dat(this,e.report);for(let[,E]of a)for(let[,C]of E)for(let S of C)if(S.userProvided){let P=Ht(this.configuration,S,ht.PACKAGE_EXTENSION);switch(S.status){case\"inactive\":e.report.reportWarning(68,`${P}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case\"redundant\":e.report.reportWarning(69,`${P}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(c!==null){let E=Ed(c,this.generateLockfile());if(E!==c){let C=yde(n,n,c,E,void 0,void 0,{maxEditLength:100});if(C){e.report.reportSeparator();for(let S of C.hunks){e.report.reportInfo(null,`@@ -${S.oldStart},${S.oldLines} +${S.newStart},${S.newLines} @@`);for(let P of S.lines)P.startsWith(\"+\")?e.report.reportError(28,Ht(this.configuration,P,ht.ADDED)):P.startsWith(\"-\")?e.report.reportError(28,Ht(this.configuration,P,ht.REMOVED)):e.report.reportInfo(null,Ht(this.configuration,P,\"grey\"))}e.report.reportSeparator()}throw new jt(28,\"The lockfile would have been modified by this install, which is explicitly forbidden.\")}}});for(let E of a.values())for(let[,C]of E)for(let S of C)S.userProvided&&S.status===\"active\"&&ze.telemetry?.reportPackageExtension(Xd(S,ht.PACKAGE_EXTENSION));await e.report.startTimerPromise(\"Fetch step\",async()=>{await this.fetchEverything(e)});let f=e.immutable?[...new Set(this.configuration.get(\"immutablePatterns\"))].sort():[],p=await Promise.all(f.map(async E=>DQ(E,{cwd:this.cwd})));(typeof e.persistProject>\"u\"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise(\"Link step\",async()=>{if(e.mode===\"update-lockfile\"){e.report.reportWarning(73,`Skipped due to ${Ht(this.configuration,\"mode=update-lockfile\",ht.CODE)}`);return}await this.linkEverything(e);let E=await Promise.all(f.map(async C=>DQ(C,{cwd:this.cwd})));for(let C=0;C<f.length;++C)p[C]!==E[C]&&e.report.reportError(64,`The checksum for ${f[C]} has been modified by this install, which is explicitly forbidden.`)}),await this.persistInstallStateFile();let h=!1;await e.report.startTimerPromise(\"Post-install validation\",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(E=>E.validateProjectAfterInstall,this,{reportWarning:(E,C)=>{e.report.reportWarning(E,C)},reportError:(E,C)=>{e.report.reportError(E,C),h=!0}})}),!h&&await this.configuration.triggerHook(E=>E.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,c]of this.storedResolutions.entries()){let f=e.get(c);f||e.set(c,f=new Set),f.add(n)}let r={},{cacheKey:s}=Kr.getCacheKey(this.configuration);r.__metadata={version:WR,cacheKey:s};for(let[n,c]of e.entries()){let f=this.originalPackages.get(n);if(!f)continue;let p=[];for(let C of c){let S=this.storedDescriptors.get(C);if(!S)throw new Error(\"Assertion failed: The descriptor should have been registered\");p.push(S)}let h=p.map(C=>al(C)).sort().join(\", \"),E=new Ut;E.version=f.linkType===\"HARD\"?f.version:\"0.0.0-use.local\",E.languageName=f.languageName,E.dependencies=new Map(f.dependencies),E.peerDependencies=new Map(f.peerDependencies),E.dependenciesMeta=new Map(f.dependenciesMeta),E.peerDependenciesMeta=new Map(f.peerDependenciesMeta),E.bin=new Map(f.bin),r[h]={...E.exportTo({},{compatibilityMode:!1}),linkType:f.linkType.toLowerCase(),resolution:ll(f),checksum:this.storedChecksums.get(f.locatorHash),conditions:f.conditions||void 0}}return`${[`# This file is generated by running \"yarn install\" inside your project.\n`,`# Manual changes might be lost - proceed with caution!\n`].join(\"\")}\n`+nl(r)}async persistLockfile(){let e=J.join(this.cwd,Er.lockfile),r=\"\";try{r=await ce.readFilePromise(e,\"utf8\")}catch{}let s=this.generateLockfile(),a=Ed(r,s);a!==r&&(await ce.writeFilePromise(e,a),this.lockFileChecksum=wde(a),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let c of Object.values(KG))e.push(...c);let r=Kd(this,e),s=zG.default.serialize(r),a=us(s);if(this.installStateChecksum===a)return;let n=this.configuration.get(\"installStatePath\");await ce.mkdirPromise(J.dirname(n),{recursive:!0}),await ce.writeFilePromise(n,await Aat(s)),this.installStateChecksum=a}async restoreInstallState({restoreLinkersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:s=!0}={}){let a=this.configuration.get(\"installStatePath\"),n;try{let c=await pat(await ce.readFilePromise(a));n=zG.default.deserialize(c),this.installStateChecksum=us(c)}catch{r&&await this.applyLightResolution();return}e&&typeof n.linkersCustomData<\"u\"&&(this.linkersCustomData=n.linkersCustomData),s&&Object.assign(this,Kd(n,KG.restoreBuildState)),r&&(n.lockFileChecksum===this.lockFileChecksum?Object.assign(this,Kd(n,KG.restoreResolutions)):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new ki}),await this.persistInstallStateFile()}async persist(){let e=(0,qR.default)(4);await Promise.all([this.persistLockfile(),...this.workspaces.map(r=>e(()=>r.persistManifest()))])}async cacheCleanup({cache:e,report:r}){if(this.configuration.get(\"enableGlobalCache\"))return null;let s=new Set([\".gitignore\"]);if(!q8(e.cwd,this.cwd)||!await ce.existsPromise(e.cwd))return null;let a=[];for(let c of await ce.readdirPromise(e.cwd)){if(s.has(c))continue;let f=J.resolve(e.cwd,c);e.markedFiles.has(f)||(e.immutable?r.reportError(56,`${Ht(this.configuration,J.basename(f),\"magenta\")} appears to be unused and would be marked for deletion, but the cache is immutable`):a.push(ce.lstatPromise(f).then(async p=>(await ce.removePromise(f),p.size))))}if(a.length===0)return null;let n=await Promise.all(a);return{count:a.length,size:n.reduce((c,f)=>c+f,0)}}}});function mat(t){let s=Math.floor(t.timeNow/864e5),a=t.updateInterval*864e5,n=t.state.lastUpdate??t.timeNow+a+Math.floor(a*t.randomInitialInterval),c=n+a,f=t.state.lastTips??s*864e5,p=f+864e5+8*36e5-t.timeZone,h=c<=t.timeNow,E=p<=t.timeNow,C=null;return(h||E||!t.state.lastUpdate||!t.state.lastTips)&&(C={},C.lastUpdate=h?t.timeNow:n,C.lastTips=f,C.blocks=h?{}:t.state.blocks,C.displayedTips=t.state.displayedTips),{nextState:C,triggerUpdate:h,triggerTips:E,nextTips:E?s*864e5:f}}var ZI,Sde=Xe(()=>{Dt();yv();I0();pT();Pc();Rp();ZI=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.nextTips=0;this.displayedTips=[];this.shouldCommitTips=!1;this.configuration=e;let s=this.getRegistryPath();this.isNew=!ce.existsSync(s),this.shouldShowTips=!1,this.sendReport(r),this.startBuffer()}commitTips(){this.shouldShowTips&&(this.shouldCommitTips=!0)}selectTip(e){let r=new Set(this.displayedTips),s=f=>f&&fn?Zf(fn,f):!1,a=e.map((f,p)=>p).filter(f=>e[f]&&s(e[f]?.selector));if(a.length===0)return null;let n=a.filter(f=>!r.has(f));if(n.length===0){let f=Math.floor(a.length*.2);this.displayedTips=f>0?this.displayedTips.slice(-f):[],n=a.filter(p=>!r.has(p))}let c=n[Math.floor(Math.random()*n.length)];return this.displayedTips.push(c),this.commitTips(),e[c]}reportVersion(e){this.reportValue(\"version\",e.replace(/-git\\..*/,\"-git\"))}reportCommandName(e){this.reportValue(\"commandName\",e||\"<none>\")}reportPluginName(e){this.reportValue(\"pluginName\",e)}reportProject(e){this.reportEnumerator(\"projectCount\",e)}reportInstall(e){this.reportHit(\"installCount\",e)}reportPackageExtension(e){this.reportValue(\"packageExtension\",e)}reportWorkspaceCount(e){this.reportValue(\"workspaceCount\",String(e))}reportDependencyCount(e){this.reportValue(\"dependencyCount\",String(e))}reportValue(e,r){bp(this.values,e).add(r)}reportEnumerator(e,r){bp(this.enumerators,e).add(us(r))}reportHit(e,r=\"*\"){let s=q4(this.hits,e),a=Yl(s,r,()=>0);s.set(r,a+1)}getRegistryPath(){let e=this.configuration.get(\"globalFolder\");return J.join(e,\"telemetry.json\")}sendReport(e){let r=this.getRegistryPath(),s;try{s=ce.readJsonSync(r)}catch{s={}}let{nextState:a,triggerUpdate:n,triggerTips:c,nextTips:f}=mat({state:s,timeNow:Date.now(),timeZone:new Date().getTimezoneOffset()*60*1e3,randomInitialInterval:Math.random(),updateInterval:this.configuration.get(\"telemetryInterval\")});if(this.nextTips=f,this.displayedTips=s.displayedTips??[],a!==null)try{ce.mkdirSync(J.dirname(r),{recursive:!0}),ce.writeJsonSync(r,a)}catch{return!1}if(c&&this.configuration.get(\"enableTips\")&&(this.shouldShowTips=!0),n){let p=s.blocks??{};if(Object.keys(p).length===0){let h=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,E=C=>cj(h,C,{configuration:this.configuration}).catch(()=>{});for(let[C,S]of Object.entries(s.blocks??{})){if(Object.keys(S).length===0)continue;let P=S;P.userId=C,P.reportType=\"primary\";for(let N of Object.keys(P.enumerators??{}))P.enumerators[N]=P.enumerators[N].length;E(P);let I=new Map,R=20;for(let[N,U]of Object.entries(P.values))U.length>0&&I.set(N,U.slice(0,R));for(;I.size>0;){let N={};N.userId=C,N.reportType=\"secondary\",N.metrics={};for(let[U,W]of I)N.metrics[U]=W.shift(),W.length===0&&I.delete(U);E(N)}}}}return!0}applyChanges(){let e=this.getRegistryPath(),r;try{r=ce.readJsonSync(e)}catch{r={}}let s=this.configuration.get(\"telemetryUserId\")??\"*\",a=r.blocks=r.blocks??{},n=a[s]=a[s]??{};for(let c of this.hits.keys()){let f=n.hits=n.hits??{},p=f[c]=f[c]??{};for(let[h,E]of this.hits.get(c))p[h]=(p[h]??0)+E}for(let c of[\"values\",\"enumerators\"])for(let f of this[c].keys()){let p=n[c]=n[c]??{};p[f]=[...new Set([...p[f]??[],...this[c].get(f)??[]])]}this.shouldCommitTips&&(r.lastTips=this.nextTips,r.displayedTips=this.displayedTips),ce.mkdirSync(J.dirname(e),{recursive:!0}),ce.writeJsonSync(e,r)}startBuffer(){process.on(\"exit\",()=>{try{this.applyChanges()}catch{}})}}});var jv={};Vt(jv,{BuildDirectiveType:()=>_R,CACHE_CHECKPOINT:()=>OG,CACHE_VERSION:()=>UR,Cache:()=>Kr,Configuration:()=>ze,DEFAULT_RC_FILENAME:()=>dj,DurationUnit:()=>mj,FormatType:()=>upe,InstallMode:()=>$l,LEGACY_PLUGINS:()=>ov,LOCKFILE_VERSION:()=>WR,LegacyMigrationResolver:()=>KI,LightReport:()=>lA,LinkType:()=>VE,LockfileResolver:()=>zI,Manifest:()=>Ut,MessageName:()=>Br,MultiFetcher:()=>aI,PackageExtensionStatus:()=>J4,PackageExtensionType:()=>V4,PeerWarningType:()=>YR,Project:()=>Tt,Report:()=>Ao,ReportError:()=>jt,SettingsType:()=>wI,StreamReport:()=>Ot,TAG_REGEXP:()=>Mp,TelemetryManager:()=>ZI,ThrowReport:()=>ki,VirtualFetcher:()=>lI,WindowsLinkType:()=>IT,Workspace:()=>XI,WorkspaceFetcher:()=>cI,WorkspaceResolver:()=>Ei,YarnVersion:()=>fn,execUtils:()=>qr,folderUtils:()=>OQ,formatUtils:()=>he,hashUtils:()=>Nn,httpUtils:()=>nn,miscUtils:()=>je,nodeUtils:()=>Ui,parseMessageName:()=>jx,reportOptionDeprecations:()=>SI,scriptUtils:()=>In,semverUtils:()=>Fr,stringifyMessageName:()=>Yf,structUtils:()=>G,tgzUtils:()=>ps,treeUtils:()=>xs});var Ge=Xe(()=>{dT();LQ();xc();I0();pT();Pc();gT();zj();Rp();Wo();nde();ude();LG();av();av();pde();MG();hde();UG();oI();Gx();R8();vde();Tc();Ev();Sde();VG();N8();O8();tm();JG();yv();hle()});var Qde=_((WHt,qv)=>{\"use strict\";var Eat=process.env.TERM_PROGRAM===\"Hyper\",Iat=process.platform===\"win32\",Pde=process.platform===\"linux\",$G={ballotDisabled:\"\\u2612\",ballotOff:\"\\u2610\",ballotOn:\"\\u2611\",bullet:\"\\u2022\",bulletWhite:\"\\u25E6\",fullBlock:\"\\u2588\",heart:\"\\u2764\",identicalTo:\"\\u2261\",line:\"\\u2500\",mark:\"\\u203B\",middot:\"\\xB7\",minus:\"\\uFF0D\",multiplication:\"\\xD7\",obelus:\"\\xF7\",pencilDownRight:\"\\u270E\",pencilRight:\"\\u270F\",pencilUpRight:\"\\u2710\",percent:\"%\",pilcrow2:\"\\u2761\",pilcrow:\"\\xB6\",plusMinus:\"\\xB1\",section:\"\\xA7\",starsOff:\"\\u2606\",starsOn:\"\\u2605\",upDownArrow:\"\\u2195\"},xde=Object.assign({},$G,{check:\"\\u221A\",cross:\"\\xD7\",ellipsisLarge:\"...\",ellipsis:\"...\",info:\"i\",question:\"?\",questionSmall:\"?\",pointer:\">\",pointerSmall:\"\\xBB\",radioOff:\"( )\",radioOn:\"(*)\",warning:\"\\u203C\"}),kde=Object.assign({},$G,{ballotCross:\"\\u2718\",check:\"\\u2714\",cross:\"\\u2716\",ellipsisLarge:\"\\u22EF\",ellipsis:\"\\u2026\",info:\"\\u2139\",question:\"?\",questionFull:\"\\uFF1F\",questionSmall:\"\\uFE56\",pointer:Pde?\"\\u25B8\":\"\\u276F\",pointerSmall:Pde?\"\\u2023\":\"\\u203A\",radioOff:\"\\u25EF\",radioOn:\"\\u25C9\",warning:\"\\u26A0\"});qv.exports=Iat&&!Eat?xde:kde;Reflect.defineProperty(qv.exports,\"common\",{enumerable:!1,value:$G});Reflect.defineProperty(qv.exports,\"windows\",{enumerable:!1,value:xde});Reflect.defineProperty(qv.exports,\"other\",{enumerable:!1,value:kde})});var Ju=_((YHt,e5)=>{\"use strict\";var Cat=t=>t!==null&&typeof t==\"object\"&&!Array.isArray(t),wat=/[\\u001b\\u009b][[\\]#;?()]*(?:(?:(?:[^\\W_]*;?[^\\W_]*)\\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,Tde=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};\"FORCE_COLOR\"in process.env&&(t.enabled=process.env.FORCE_COLOR!==\"0\");let e=n=>{let c=n.open=`\\x1B[${n.codes[0]}m`,f=n.close=`\\x1B[${n.codes[1]}m`,p=n.regex=new RegExp(`\\\\u001b\\\\[${n.codes[1]}m`,\"g\");return n.wrap=(h,E)=>{h.includes(f)&&(h=h.replace(p,f+c));let C=c+h+f;return E?C.replace(/\\r*\\n/g,`${f}$&${c}`):C},n},r=(n,c,f)=>typeof n==\"function\"?n(c):n.wrap(c,f),s=(n,c)=>{if(n===\"\"||n==null)return\"\";if(t.enabled===!1)return n;if(t.visible===!1)return\"\";let f=\"\"+n,p=f.includes(`\n`),h=c.length;for(h>0&&c.includes(\"unstyle\")&&(c=[...new Set([\"unstyle\",...c])].reverse());h-- >0;)f=r(t.styles[c[h]],f,p);return f},a=(n,c,f)=>{t.styles[n]=e({name:n,codes:c}),(t.keys[f]||(t.keys[f]=[])).push(n),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(h){t.alias(n,h)},get(){let h=E=>s(E,h.stack);return Reflect.setPrototypeOf(h,t),h.stack=this.stack?this.stack.concat(n):[n],h}})};return a(\"reset\",[0,0],\"modifier\"),a(\"bold\",[1,22],\"modifier\"),a(\"dim\",[2,22],\"modifier\"),a(\"italic\",[3,23],\"modifier\"),a(\"underline\",[4,24],\"modifier\"),a(\"inverse\",[7,27],\"modifier\"),a(\"hidden\",[8,28],\"modifier\"),a(\"strikethrough\",[9,29],\"modifier\"),a(\"black\",[30,39],\"color\"),a(\"red\",[31,39],\"color\"),a(\"green\",[32,39],\"color\"),a(\"yellow\",[33,39],\"color\"),a(\"blue\",[34,39],\"color\"),a(\"magenta\",[35,39],\"color\"),a(\"cyan\",[36,39],\"color\"),a(\"white\",[37,39],\"color\"),a(\"gray\",[90,39],\"color\"),a(\"grey\",[90,39],\"color\"),a(\"bgBlack\",[40,49],\"bg\"),a(\"bgRed\",[41,49],\"bg\"),a(\"bgGreen\",[42,49],\"bg\"),a(\"bgYellow\",[43,49],\"bg\"),a(\"bgBlue\",[44,49],\"bg\"),a(\"bgMagenta\",[45,49],\"bg\"),a(\"bgCyan\",[46,49],\"bg\"),a(\"bgWhite\",[47,49],\"bg\"),a(\"blackBright\",[90,39],\"bright\"),a(\"redBright\",[91,39],\"bright\"),a(\"greenBright\",[92,39],\"bright\"),a(\"yellowBright\",[93,39],\"bright\"),a(\"blueBright\",[94,39],\"bright\"),a(\"magentaBright\",[95,39],\"bright\"),a(\"cyanBright\",[96,39],\"bright\"),a(\"whiteBright\",[97,39],\"bright\"),a(\"bgBlackBright\",[100,49],\"bgBright\"),a(\"bgRedBright\",[101,49],\"bgBright\"),a(\"bgGreenBright\",[102,49],\"bgBright\"),a(\"bgYellowBright\",[103,49],\"bgBright\"),a(\"bgBlueBright\",[104,49],\"bgBright\"),a(\"bgMagentaBright\",[105,49],\"bgBright\"),a(\"bgCyanBright\",[106,49],\"bgBright\"),a(\"bgWhiteBright\",[107,49],\"bgBright\"),t.ansiRegex=wat,t.hasColor=t.hasAnsi=n=>(t.ansiRegex.lastIndex=0,typeof n==\"string\"&&n!==\"\"&&t.ansiRegex.test(n)),t.alias=(n,c)=>{let f=typeof c==\"string\"?t[c]:c;if(typeof f!=\"function\")throw new TypeError(\"Expected alias to be the name of an existing color (string) or a function\");f.stack||(Reflect.defineProperty(f,\"name\",{value:n}),t.styles[n]=f,f.stack=[n]),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(p){t.alias(n,p)},get(){let p=h=>s(h,p.stack);return Reflect.setPrototypeOf(p,t),p.stack=this.stack?this.stack.concat(f.stack):f.stack,p}})},t.theme=n=>{if(!Cat(n))throw new TypeError(\"Expected theme to be an object\");for(let c of Object.keys(n))t.alias(c,n[c]);return t},t.alias(\"unstyle\",n=>typeof n==\"string\"&&n!==\"\"?(t.ansiRegex.lastIndex=0,n.replace(t.ansiRegex,\"\")):\"\"),t.alias(\"noop\",n=>n),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=Qde(),t.define=a,t};e5.exports=Tde();e5.exports.create=Tde});var Zo=_(pn=>{\"use strict\";var Bat=Object.prototype.toString,jc=Ju(),Rde=!1,t5=[],Fde={yellow:\"blue\",cyan:\"red\",green:\"magenta\",black:\"white\",blue:\"yellow\",red:\"cyan\",magenta:\"green\",white:\"black\"};pn.longest=(t,e)=>t.reduce((r,s)=>Math.max(r,e?s[e].length:s.length),0);pn.hasColor=t=>!!t&&jc.hasColor(t);var JR=pn.isObject=t=>t!==null&&typeof t==\"object\"&&!Array.isArray(t);pn.nativeType=t=>Bat.call(t).slice(8,-1).toLowerCase().replace(/\\s/g,\"\");pn.isAsyncFn=t=>pn.nativeType(t)===\"asyncfunction\";pn.isPrimitive=t=>t!=null&&typeof t!=\"object\"&&typeof t!=\"function\";pn.resolve=(t,e,...r)=>typeof e==\"function\"?e.call(t,...r):e;pn.scrollDown=(t=[])=>[...t.slice(1),t[0]];pn.scrollUp=(t=[])=>[t.pop(),...t];pn.reorder=(t=[])=>{let e=t.slice();return e.sort((r,s)=>r.index>s.index?1:r.index<s.index?-1:0),e};pn.swap=(t,e,r)=>{let s=t.length,a=r===s?0:r<0?s-1:r,n=t[e];t[e]=t[a],t[a]=n};pn.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize==\"function\"&&(r=t.getWindowSize()[0]),process.platform===\"win32\"?r-1:r};pn.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize==\"function\"&&(r=t.getWindowSize()[1]),r};pn.wordWrap=(t,e={})=>{if(!t)return t;typeof e==\"number\"&&(e={width:e});let{indent:r=\"\",newline:s=`\n`+r,width:a=80}=e,n=(s+r).match(/[^\\S\\n]/g)||[];a-=n.length;let c=`.{1,${a}}([\\\\s\\\\u200B]+|$)|[^\\\\s\\\\u200B]+?([\\\\s\\\\u200B]+|$)`,f=t.trim(),p=new RegExp(c,\"g\"),h=f.match(p)||[];return h=h.map(E=>E.replace(/\\n$/,\"\")),e.padEnd&&(h=h.map(E=>E.padEnd(a,\" \"))),e.padStart&&(h=h.map(E=>E.padStart(a,\" \"))),r+h.join(s)};pn.unmute=t=>{let e=t.stack.find(s=>jc.keys.color.includes(s));return e?jc[e]:t.stack.find(s=>s.slice(2)===\"bg\")?jc[e.slice(2)]:s=>s};pn.pascal=t=>t?t[0].toUpperCase()+t.slice(1):\"\";pn.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(s=>jc.keys.color.includes(s));if(e){let s=jc[\"bg\"+pn.pascal(e)];return s?s.black:t}let r=t.stack.find(s=>s.slice(0,2)===\"bg\");return r?jc[r.slice(2).toLowerCase()]||t:jc.none};pn.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(s=>jc.keys.color.includes(s)),r=t.stack.find(s=>s.slice(0,2)===\"bg\");if(e&&!r)return jc[Fde[e]||e];if(r){let s=r.slice(2).toLowerCase(),a=Fde[s];return a&&jc[\"bg\"+pn.pascal(a)]||t}return jc.none};pn.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),s=e>=12?\"pm\":\"am\";e=e%12;let a=e===0?12:e,n=r<10?\"0\"+r:r;return a+\":\"+n+\" \"+s};pn.set=(t={},e=\"\",r)=>e.split(\".\").reduce((s,a,n,c)=>{let f=c.length-1>n?s[a]||{}:r;return!pn.isObject(f)&&n<c.length-1&&(f={}),s[a]=f},t);pn.get=(t={},e=\"\",r)=>{let s=t[e]==null?e.split(\".\").reduce((a,n)=>a&&a[n],t):t[e];return s??r};pn.mixin=(t,e)=>{if(!JR(t))return e;if(!JR(e))return t;for(let r of Object.keys(e)){let s=Object.getOwnPropertyDescriptor(e,r);if(s.hasOwnProperty(\"value\"))if(t.hasOwnProperty(r)&&JR(s.value)){let a=Object.getOwnPropertyDescriptor(t,r);JR(a.value)?t[r]=pn.merge({},t[r],e[r]):Reflect.defineProperty(t,r,s)}else Reflect.defineProperty(t,r,s);else Reflect.defineProperty(t,r,s)}return t};pn.merge=(...t)=>{let e={};for(let r of t)pn.mixin(e,r);return e};pn.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let s of Object.keys(r)){let a=r[s];typeof a==\"function\"?pn.define(t,s,a.bind(e)):pn.define(t,s,a)}};pn.onExit=t=>{let e=(r,s)=>{Rde||(Rde=!0,t5.forEach(a=>a()),r===!0&&process.exit(128+s))};t5.length===0&&(process.once(\"SIGTERM\",e.bind(null,!0,15)),process.once(\"SIGINT\",e.bind(null,!0,2)),process.once(\"exit\",e)),t5.push(t)};pn.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};pn.defineExport=(t,e,r)=>{let s;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(a){s=a},get(){return s?s():r()}})}});var Nde=_(rC=>{\"use strict\";rC.ctrl={a:\"first\",b:\"backward\",c:\"cancel\",d:\"deleteForward\",e:\"last\",f:\"forward\",g:\"reset\",i:\"tab\",k:\"cutForward\",l:\"reset\",n:\"newItem\",m:\"cancel\",j:\"submit\",p:\"search\",r:\"remove\",s:\"save\",u:\"undo\",w:\"cutLeft\",x:\"toggleCursor\",v:\"paste\"};rC.shift={up:\"shiftUp\",down:\"shiftDown\",left:\"shiftLeft\",right:\"shiftRight\",tab:\"prev\"};rC.fn={up:\"pageUp\",down:\"pageDown\",left:\"pageLeft\",right:\"pageRight\",delete:\"deleteForward\"};rC.option={b:\"backward\",f:\"forward\",d:\"cutRight\",left:\"cutLeft\",up:\"altUp\",down:\"altDown\"};rC.keys={pageup:\"pageUp\",pagedown:\"pageDown\",home:\"home\",end:\"end\",cancel:\"cancel\",delete:\"deleteForward\",backspace:\"delete\",down:\"down\",enter:\"submit\",escape:\"cancel\",left:\"left\",space:\"space\",number:\"number\",return:\"submit\",right:\"right\",tab:\"next\",up:\"up\"}});var Mde=_((KHt,Lde)=>{\"use strict\";var Ode=Ie(\"readline\"),vat=Nde(),Sat=/^(?:\\x1b)([a-zA-Z0-9])$/,Dat=/^(?:\\x1b+)(O|N|\\[|\\[\\[)(?:(\\d+)(?:;(\\d+))?([~^$])|(?:1;)?(\\d+)?([a-zA-Z]))/,bat={OP:\"f1\",OQ:\"f2\",OR:\"f3\",OS:\"f4\",\"[11~\":\"f1\",\"[12~\":\"f2\",\"[13~\":\"f3\",\"[14~\":\"f4\",\"[[A\":\"f1\",\"[[B\":\"f2\",\"[[C\":\"f3\",\"[[D\":\"f4\",\"[[E\":\"f5\",\"[15~\":\"f5\",\"[17~\":\"f6\",\"[18~\":\"f7\",\"[19~\":\"f8\",\"[20~\":\"f9\",\"[21~\":\"f10\",\"[23~\":\"f11\",\"[24~\":\"f12\",\"[A\":\"up\",\"[B\":\"down\",\"[C\":\"right\",\"[D\":\"left\",\"[E\":\"clear\",\"[F\":\"end\",\"[H\":\"home\",OA:\"up\",OB:\"down\",OC:\"right\",OD:\"left\",OE:\"clear\",OF:\"end\",OH:\"home\",\"[1~\":\"home\",\"[2~\":\"insert\",\"[3~\":\"delete\",\"[4~\":\"end\",\"[5~\":\"pageup\",\"[6~\":\"pagedown\",\"[[5~\":\"pageup\",\"[[6~\":\"pagedown\",\"[7~\":\"home\",\"[8~\":\"end\",\"[a\":\"up\",\"[b\":\"down\",\"[c\":\"right\",\"[d\":\"left\",\"[e\":\"clear\",\"[2$\":\"insert\",\"[3$\":\"delete\",\"[5$\":\"pageup\",\"[6$\":\"pagedown\",\"[7$\":\"home\",\"[8$\":\"end\",Oa:\"up\",Ob:\"down\",Oc:\"right\",Od:\"left\",Oe:\"clear\",\"[2^\":\"insert\",\"[3^\":\"delete\",\"[5^\":\"pageup\",\"[6^\":\"pagedown\",\"[7^\":\"home\",\"[8^\":\"end\",\"[Z\":\"tab\"};function Pat(t){return[\"[a\",\"[b\",\"[c\",\"[d\",\"[e\",\"[2$\",\"[3$\",\"[5$\",\"[6$\",\"[7$\",\"[8$\",\"[Z\"].includes(t)}function xat(t){return[\"Oa\",\"Ob\",\"Oc\",\"Od\",\"Oe\",\"[2^\",\"[3^\",\"[5^\",\"[6^\",\"[7^\",\"[8^\"].includes(t)}var KR=(t=\"\",e={})=>{let r,s={name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t,...e};if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t=\"\\x1B\"+String(t)):t=String(t):t!==void 0&&typeof t!=\"string\"?t=String(t):t||(t=s.sequence||\"\"),s.sequence=s.sequence||t||s.name,t===\"\\r\")s.raw=void 0,s.name=\"return\";else if(t===`\n`)s.name=\"enter\";else if(t===\"\t\")s.name=\"tab\";else if(t===\"\\b\"||t===\"\\x7F\"||t===\"\\x1B\\x7F\"||t===\"\\x1B\\b\")s.name=\"backspace\",s.meta=t.charAt(0)===\"\\x1B\";else if(t===\"\\x1B\"||t===\"\\x1B\\x1B\")s.name=\"escape\",s.meta=t.length===2;else if(t===\" \"||t===\"\\x1B \")s.name=\"space\",s.meta=t.length===2;else if(t<=\"\u001a\")s.name=String.fromCharCode(t.charCodeAt(0)+97-1),s.ctrl=!0;else if(t.length===1&&t>=\"0\"&&t<=\"9\")s.name=\"number\";else if(t.length===1&&t>=\"a\"&&t<=\"z\")s.name=t;else if(t.length===1&&t>=\"A\"&&t<=\"Z\")s.name=t.toLowerCase(),s.shift=!0;else if(r=Sat.exec(t))s.meta=!0,s.shift=/^[A-Z]$/.test(r[1]);else if(r=Dat.exec(t)){let a=[...t];a[0]===\"\\x1B\"&&a[1]===\"\\x1B\"&&(s.option=!0);let n=[r[1],r[2],r[4],r[6]].filter(Boolean).join(\"\"),c=(r[3]||r[5]||1)-1;s.ctrl=!!(c&4),s.meta=!!(c&10),s.shift=!!(c&1),s.code=n,s.name=bat[n],s.shift=Pat(n)||s.shift,s.ctrl=xat(n)||s.ctrl}return s};KR.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error(\"Invalid stream passed\");let s=Ode.createInterface({terminal:!0,input:r});Ode.emitKeypressEvents(r,s);let a=(f,p)=>e(f,KR(f,p),s),n=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on(\"keypress\",a),s.resume(),()=>{r.isTTY&&r.setRawMode(n),r.removeListener(\"keypress\",a),s.pause(),s.close()}};KR.action=(t,e,r)=>{let s={...vat,...r};return e.ctrl?(e.action=s.ctrl[e.name],e):e.option&&s.option?(e.action=s.option[e.name],e):e.shift?(e.action=s.shift[e.name],e):(e.action=s.keys[e.name],e)};Lde.exports=KR});var _de=_((zHt,Ude)=>{\"use strict\";Ude.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(e)for(let r of Object.keys(e)){let s=e[r];typeof s==\"number\"&&(s={interval:s}),kat(t,r,s)}};function kat(t,e,r={}){let s=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},a=r.interval||120;s.frames=r.frames||[],s.loading=!0;let n=setInterval(()=>{s.ms=Date.now()-s.start,s.tick++,t.render()},a);return s.stop=()=>{s.loading=!1,clearInterval(n)},Reflect.defineProperty(s,\"interval\",{value:n}),t.once(\"close\",()=>s.stop()),s.stop}});var jde=_((XHt,Hde)=>{\"use strict\";var{define:Qat,width:Tat}=Zo(),r5=class{constructor(e){let r=e.options;Qat(this,\"_prompt\",e),this.type=e.type,this.name=e.name,this.message=\"\",this.header=\"\",this.footer=\"\",this.error=\"\",this.hint=\"\",this.input=\"\",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt=\"\",this.buffer=\"\",this.width=Tat(r.stdout||process.stdout),Object.assign(this,r),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e={...this};return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let r=this._color||e[this.status];return typeof r==\"function\"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading==\"boolean\"?this._loading:this.loadingChoices?\"choices\":!1}get status(){return this.cancelled?\"cancelled\":this.submitted?\"submitted\":\"pending\"}};Hde.exports=r5});var qde=_((ZHt,Gde)=>{\"use strict\";var n5=Zo(),ho=Ju(),i5={default:ho.noop,noop:ho.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||n5.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||n5.complement(this.primary)},primary:ho.cyan,success:ho.green,danger:ho.magenta,strong:ho.bold,warning:ho.yellow,muted:ho.dim,disabled:ho.gray,dark:ho.dim.gray,underline:ho.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};i5.merge=(t={})=>{t.styles&&typeof t.styles.enabled==\"boolean\"&&(ho.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible==\"boolean\"&&(ho.visible=t.styles.visible);let e=n5.merge({},i5,t.styles);delete e.merge;for(let r of Object.keys(ho))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>ho[r]});for(let r of Object.keys(ho.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>ho[r]});return e};Gde.exports=i5});var Yde=_(($Ht,Wde)=>{\"use strict\";var s5=process.platform===\"win32\",zp=Ju(),Rat=Zo(),o5={...zp.symbols,upDownDoubleArrow:\"\\u21D5\",upDownDoubleArrow2:\"\\u2B0D\",upDownArrow:\"\\u2195\",asterisk:\"*\",asterism:\"\\u2042\",bulletWhite:\"\\u25E6\",electricArrow:\"\\u2301\",ellipsisLarge:\"\\u22EF\",ellipsisSmall:\"\\u2026\",fullBlock:\"\\u2588\",identicalTo:\"\\u2261\",indicator:zp.symbols.check,leftAngle:\"\\u2039\",mark:\"\\u203B\",minus:\"\\u2212\",multiplication:\"\\xD7\",obelus:\"\\xF7\",percent:\"%\",pilcrow:\"\\xB6\",pilcrow2:\"\\u2761\",pencilUpRight:\"\\u2710\",pencilDownRight:\"\\u270E\",pencilRight:\"\\u270F\",plus:\"+\",plusMinus:\"\\xB1\",pointRight:\"\\u261E\",rightAngle:\"\\u203A\",section:\"\\xA7\",hexagon:{off:\"\\u2B21\",on:\"\\u2B22\",disabled:\"\\u2B22\"},ballot:{on:\"\\u2611\",off:\"\\u2610\",disabled:\"\\u2612\"},stars:{on:\"\\u2605\",off:\"\\u2606\",disabled:\"\\u2606\"},folder:{on:\"\\u25BC\",off:\"\\u25B6\",disabled:\"\\u25B6\"},prefix:{pending:zp.symbols.question,submitted:zp.symbols.check,cancelled:zp.symbols.cross},separator:{pending:zp.symbols.pointerSmall,submitted:zp.symbols.middot,cancelled:zp.symbols.middot},radio:{off:s5?\"( )\":\"\\u25EF\",on:s5?\"(*)\":\"\\u25C9\",disabled:s5?\"(|)\":\"\\u24BE\"},numbers:[\"\\u24EA\",\"\\u2460\",\"\\u2461\",\"\\u2462\",\"\\u2463\",\"\\u2464\",\"\\u2465\",\"\\u2466\",\"\\u2467\",\"\\u2468\",\"\\u2469\",\"\\u246A\",\"\\u246B\",\"\\u246C\",\"\\u246D\",\"\\u246E\",\"\\u246F\",\"\\u2470\",\"\\u2471\",\"\\u2472\",\"\\u2473\",\"\\u3251\",\"\\u3252\",\"\\u3253\",\"\\u3254\",\"\\u3255\",\"\\u3256\",\"\\u3257\",\"\\u3258\",\"\\u3259\",\"\\u325A\",\"\\u325B\",\"\\u325C\",\"\\u325D\",\"\\u325E\",\"\\u325F\",\"\\u32B1\",\"\\u32B2\",\"\\u32B3\",\"\\u32B4\",\"\\u32B5\",\"\\u32B6\",\"\\u32B7\",\"\\u32B8\",\"\\u32B9\",\"\\u32BA\",\"\\u32BB\",\"\\u32BC\",\"\\u32BD\",\"\\u32BE\",\"\\u32BF\"]};o5.merge=t=>{let e=Rat.merge({},zp.symbols,o5,t.symbols);return delete e.merge,e};Wde.exports=o5});var Jde=_((ejt,Vde)=>{\"use strict\";var Fat=qde(),Nat=Yde(),Oat=Zo();Vde.exports=t=>{t.options=Oat.merge({},t.options.theme,t.options),t.symbols=Nat.merge(t.options),t.styles=Fat.merge(t.options)}});var $de=_((Xde,Zde)=>{\"use strict\";var Kde=process.env.TERM_PROGRAM===\"Apple_Terminal\",Lat=Ju(),a5=Zo(),Ku=Zde.exports=Xde,_i=\"\\x1B[\",zde=\"\\x07\",l5=!1,j0=Ku.code={bell:zde,beep:zde,beginning:`${_i}G`,down:`${_i}J`,esc:_i,getPosition:`${_i}6n`,hide:`${_i}?25l`,line:`${_i}2K`,lineEnd:`${_i}K`,lineStart:`${_i}1K`,restorePosition:_i+(Kde?\"8\":\"u\"),savePosition:_i+(Kde?\"7\":\"s\"),screen:`${_i}2J`,show:`${_i}?25h`,up:`${_i}1J`},wm=Ku.cursor={get hidden(){return l5},hide(){return l5=!0,j0.hide},show(){return l5=!1,j0.show},forward:(t=1)=>`${_i}${t}C`,backward:(t=1)=>`${_i}${t}D`,nextLine:(t=1)=>`${_i}E`.repeat(t),prevLine:(t=1)=>`${_i}F`.repeat(t),up:(t=1)=>t?`${_i}${t}A`:\"\",down:(t=1)=>t?`${_i}${t}B`:\"\",right:(t=1)=>t?`${_i}${t}C`:\"\",left:(t=1)=>t?`${_i}${t}D`:\"\",to(t,e){return e?`${_i}${e+1};${t+1}H`:`${_i}${t+1}G`},move(t=0,e=0){let r=\"\";return r+=t<0?wm.left(-t):t>0?wm.right(t):\"\",r+=e<0?wm.up(-e):e>0?wm.down(e):\"\",r},restore(t={}){let{after:e,cursor:r,initial:s,input:a,prompt:n,size:c,value:f}=t;if(s=a5.isPrimitive(s)?String(s):\"\",a=a5.isPrimitive(a)?String(a):\"\",f=a5.isPrimitive(f)?String(f):\"\",c){let p=Ku.cursor.up(c)+Ku.cursor.to(n.length),h=a.length-r;return h>0&&(p+=Ku.cursor.left(h)),p}if(f||e){let p=!a&&s?-s.length:-a.length+r;return e&&(p-=e.length),a===\"\"&&s&&!n.includes(s)&&(p+=s.length),Ku.cursor.move(p)}}},c5=Ku.erase={screen:j0.screen,up:j0.up,down:j0.down,line:j0.line,lineEnd:j0.lineEnd,lineStart:j0.lineStart,lines(t){let e=\"\";for(let r=0;r<t;r++)e+=Ku.erase.line+(r<t-1?Ku.cursor.up(1):\"\");return t&&(e+=Ku.code.beginning),e}};Ku.clear=(t=\"\",e=process.stdout.columns)=>{if(!e)return c5.line+wm.to(0);let r=n=>[...Lat.unstyle(n)].length,s=t.split(/\\r?\\n/),a=0;for(let n of s)a+=1+Math.floor(Math.max(r(n)-1,0)/e);return(c5.line+wm.prevLine()).repeat(a-1)+c5.line+wm.to(0)}});var nC=_((tjt,tme)=>{\"use strict\";var Mat=Ie(\"events\"),eme=Ju(),u5=Mde(),Uat=_de(),_at=jde(),Hat=Jde(),pl=Zo(),Bm=$de(),f5=class t extends Mat{constructor(e={}){super(),this.name=e.name,this.type=e.type,this.options=e,Hat(this),Uat(this),this.state=new _at(this),this.initial=[e.initial,e.default].find(r=>r!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=Gat(this.options.margin),this.setMaxListeners(0),jat(this)}async keypress(e,r={}){this.keypressed=!0;let s=u5.action(e,u5(e,r),this.options.actions);this.state.keypress=s,this.emit(\"keypress\",e,s),this.emit(\"state\",this.state.clone());let a=this.options[s.action]||this[s.action]||this.dispatch;if(typeof a==\"function\")return await a.call(this,e,s);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit(\"alert\"):this.stdout.write(Bm.code.beep)}cursorHide(){this.stdout.write(Bm.cursor.hide()),pl.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(Bm.cursor.show())}write(e){e&&(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer=\"\",!(!r&&!e||this.options.show===!1)&&this.stdout.write(Bm.cursor.down(e)+Bm.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:s}=this.sections(),{cursor:a,initial:n=\"\",input:c=\"\",value:f=\"\"}=this,p=this.state.size=s.length,h={after:r,cursor:a,initial:n,input:c,prompt:e,size:p,value:f},E=Bm.cursor.restore(h);E&&this.stdout.write(E)}sections(){let{buffer:e,input:r,prompt:s}=this.state;s=eme.unstyle(s);let a=eme.unstyle(e),n=a.indexOf(s),c=a.slice(0,n),p=a.slice(n).split(`\n`),h=p[0],E=p[p.length-1],S=(s+(r?\" \"+r:\"\")).length,P=S<h.length?h.slice(S+1):\"\";return{header:c,prompt:h,after:P,rest:p.slice(1),last:E}}async submit(){this.state.submitted=!0,this.state.validating=!0,this.options.onSubmit&&await this.options.onSubmit.call(this,this.name,this.value,this);let e=this.state.error||await this.validate(this.value,this.state);if(e!==!0){let r=`\n`+this.symbols.pointer+\" \";typeof e==\"string\"?r+=e.trim():r+=\"Invalid input\",this.state.error=`\n`+this.styles.danger(r),this.state.submitted=!1,await this.render(),await this.alert(),this.state.validating=!1,this.state.error=void 0;return}this.state.validating=!1,await this.render(),await this.close(),this.value=await this.result(this.value),this.emit(\"submit\",this.value)}async cancel(e){this.state.cancelled=this.state.submitted=!0,await this.render(),await this.close(),typeof this.options.onCancel==\"function\"&&await this.options.onCancel.call(this,this.name,this.value,this),this.emit(\"cancel\",await this.error(e))}async close(){this.state.closed=!0;try{let e=this.sections(),r=Math.ceil(e.prompt.length/this.width);e.rest&&this.write(Bm.cursor.down(e.rest.length)),this.write(`\n`.repeat(r))}catch{}this.emit(\"close\")}start(){!this.stop&&this.options.show!==!1&&(this.stop=u5.listen(this,this.keypress.bind(this)),this.once(\"close\",this.stop))}async skip(){return this.skipped=this.options.skip===!0,typeof this.options.skip==\"function\"&&(this.skipped=await this.options.skip.call(this,this.name,this.value)),this.skipped}async initialize(){let{format:e,options:r,result:s}=this;if(this.format=()=>e.call(this,this.value),this.result=()=>s.call(this,this.value),typeof r.initial==\"function\"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun==\"function\"&&await r.onRun.call(this,this),typeof r.onSubmit==\"function\"){let a=r.onSubmit.bind(this),n=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await a(this.name,this.value,this),n())}await this.start(),await this.render()}render(){throw new Error(\"expected prompt to have a custom render method\")}run(){return new Promise(async(e,r)=>{if(this.once(\"submit\",e),this.once(\"cancel\",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit(\"run\")})}async element(e,r,s){let{options:a,state:n,symbols:c,timers:f}=this,p=f&&f[e];n.timer=p;let h=a[e]||n[e]||c[e],E=r&&r[e]!=null?r[e]:await h;if(E===\"\")return E;let C=await this.resolve(E,n,r,s);return!C&&r&&r[e]?this.resolve(h,n,r,s):C}async prefix(){let e=await this.element(\"prefix\")||this.symbols,r=this.timers&&this.timers.prefix,s=this.state;return s.timer=r,pl.isObject(e)&&(e=e[s.status]||e.pending),pl.hasColor(e)?e:(this.styles[s.status]||this.styles.pending)(e)}async message(){let e=await this.element(\"message\");return pl.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element(\"separator\")||this.symbols,r=this.timers&&this.timers.separator,s=this.state;s.timer=r;let a=e[s.status]||e.pending||s.separator,n=await this.resolve(a,s);return pl.isObject(n)&&(n=n[s.status]||n.pending),pl.hasColor(n)?n:this.styles.muted(n)}async pointer(e,r){let s=await this.element(\"pointer\",e,r);if(typeof s==\"string\"&&pl.hasColor(s))return s;if(s){let a=this.styles,n=this.index===r,c=n?a.primary:h=>h,f=await this.resolve(s[n?\"on\":\"off\"]||s,this.state),p=pl.hasColor(f)?f:c(f);return n?p:\" \".repeat(f.length)}}async indicator(e,r){let s=await this.element(\"indicator\",e,r);if(typeof s==\"string\"&&pl.hasColor(s))return s;if(s){let a=this.styles,n=e.enabled===!0,c=n?a.success:a.dark,f=s[n?\"on\":\"off\"]||s;return pl.hasColor(f)?f:c(f)}return\"\"}body(){return null}footer(){if(this.state.status===\"pending\")return this.element(\"footer\")}header(){if(this.state.status===\"pending\")return this.element(\"header\")}async hint(){if(this.state.status===\"pending\"&&!this.isValue(this.state.input)){let e=await this.element(\"hint\");return pl.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?\"\":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==\"\"}resolve(e,...r){return pl.resolve(this,e,...r)}get base(){return t.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||pl.height(this.stdout,25)}get width(){return this.options.columns||pl.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:r}=this.state,s=[r,e].find(this.isValue.bind(this));return this.isValue(s)?s:this.initial}static get prompt(){return e=>new this(e).run()}};function jat(t){let e=a=>t[a]===void 0||typeof t[a]==\"function\",r=[\"actions\",\"choices\",\"initial\",\"margin\",\"roles\",\"styles\",\"symbols\",\"theme\",\"timers\",\"value\"],s=[\"body\",\"footer\",\"error\",\"header\",\"hint\",\"indicator\",\"message\",\"prefix\",\"separator\",\"skip\"];for(let a of Object.keys(t.options)){if(r.includes(a)||/^on[A-Z]/.test(a))continue;let n=t.options[a];typeof n==\"function\"&&e(a)?s.includes(a)||(t[a]=n.bind(t)):typeof t[a]!=\"function\"&&(t[a]=n)}}function Gat(t){typeof t==\"number\"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=a=>a%2===0?`\n`:\" \",s=[];for(let a=0;a<4;a++){let n=r(a);e[a]?s.push(n.repeat(e[a])):s.push(\"\")}return s}tme.exports=f5});var ime=_((rjt,nme)=>{\"use strict\";var qat=Zo(),rme={default(t,e){return e},checkbox(t,e){throw new Error(\"checkbox role is not implemented yet\")},editable(t,e){throw new Error(\"editable role is not implemented yet\")},expandable(t,e){throw new Error(\"expandable role is not implemented yet\")},heading(t,e){return e.disabled=\"\",e.indicator=[e.indicator,\" \"].find(r=>r!=null),e.message=e.message||\"\",e},input(t,e){throw new Error(\"input role is not implemented yet\")},option(t,e){return rme.default(t,e)},radio(t,e){throw new Error(\"radio role is not implemented yet\")},separator(t,e){return e.disabled=\"\",e.indicator=[e.indicator,\" \"].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};nme.exports=(t,e={})=>{let r=qat.merge({},rme,e.roles);return r[t]||r.default}});var Wv=_((njt,ame)=>{\"use strict\";var Wat=Ju(),Yat=nC(),Vat=ime(),zR=Zo(),{reorder:A5,scrollUp:Jat,scrollDown:Kat,isObject:sme,swap:zat}=zR,p5=class extends Yat{constructor(e){super(e),this.cursorHide(),this.maxSelected=e.maxSelected||1/0,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=\"\"}async initialize(){typeof this.options.initial==\"function\"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:s,suggest:a}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(n=>n.enabled=!1),typeof a!=\"function\"&&this.selectable.length===0)throw new Error(\"At least one choice must be selectable\");sme(r)&&(r=Object.keys(r)),Array.isArray(r)?(s!=null&&(this.index=this.findIndex(s)),r.forEach(n=>this.enable(this.find(n))),await this.render()):(s!=null&&(r=s),typeof r==\"string\"&&(r=this.findIndex(r)),typeof r==\"number\"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let s=[],a=0,n=async(c,f)=>{typeof c==\"function\"&&(c=await c.call(this)),c instanceof Promise&&(c=await c);for(let p=0;p<c.length;p++){let h=c[p]=await this.toChoice(c[p],a++,f);s.push(h),h.choices&&await n(h.choices,h)}return s};return n(e,r).then(c=>(this.state.loadingChoices=!1,c))}async toChoice(e,r,s){if(typeof e==\"function\"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e==\"string\"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let a=e.value;if(e=Vat(e.role,this.options)(this,e),typeof e.disabled==\"string\"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint=\"(disabled)\"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||\"\",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input=\"\",e.index=r,e.cursor=0,zR.define(e,\"parent\",s),e.level=s?s.level+1:1,e.indent==null&&(e.indent=s?s.indent+\"  \":e.indent||\"\"),e.path=s?s.path+\".\"+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,Wat.unstyle(e.message).length));let c={...e};return e.reset=(f=c.input,p=c.value)=>{for(let h of Object.keys(c))e[h]=c[h];e.input=f,e.value=p},a==null&&typeof e.initial==\"function\"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit(\"choice\",e,r,this),typeof e.onChoice==\"function\"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,s){let a=await this.toChoice(e,r,s);return this.choices.push(a),this.index=this.choices.length-1,this.limit=this.choices.length,a}async newItem(e,r,s){let a={name:\"New choice name?\",editable:!0,newChoice:!0,...e},n=await this.addChoice(a,r,s);return n.updateChoice=()=>{delete n.newChoice,n.name=n.message=n.input,n.input=\"\",n.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?\"  \".repeat(e.level-1):\"\":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!=\"boolean\"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelected<this.choices.length)return this.alert();let e=this.selectable.every(r=>r.enabled);return this.choices.forEach(r=>r.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!=\"boolean\"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(a=>this.toggle(a,r));let s=e.parent;for(;s;){let a=s.choices.filter(n=>this.isDisabled(n));s.enabled=a.every(n=>n.enabled===!0),s=s.parent}return ome(this,this.choices),this.emit(\"toggle\",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let r=s=>{let a=Number(s);if(a>this.choices.length-1)return this.alert();let n=this.focused,c=this.choices.find(f=>a===f.index);if(!c.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(c)===-1){let f=A5(this.choices),p=f.indexOf(c);if(n.index>p){let h=f.slice(p,p+this.limit),E=f.filter(C=>!h.includes(C));this.choices=h.concat(E)}else{let h=p-this.limit+1;this.choices=f.slice(h).concat(f.slice(0,h))}}return this.index=this.choices.indexOf(c),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(s=>{let a=this.choices.length,n=this.num,c=(f=!1,p)=>{clearTimeout(this.numberTimeout),f&&(p=r(n)),this.num=\"\",s(p)};if(n===\"0\"||n.length===1&&+(n+\"0\")>a)return c(!0);if(Number(n)>a)return c(!1,this.alert());this.numberTimeout=setTimeout(()=>c(!0),this.delay)})}home(){return this.choices=A5(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=A5(this.choices);return this.choices=r.slice(e).concat(r.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,r=this.visible.length,s=this.index;return this.options.scroll===!1&&s===0?this.alert():e>r&&s===0?this.scrollUp():(this.index=(s-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,s=this.index;return this.options.scroll===!1&&s===r-1?this.alert():e>r&&s===r-1?this.scrollDown():(this.index=(s+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=Jat(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=Kat(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){zat(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&[\"disabled\",\"collapsed\",\"hidden\",\"completing\",\"readonly\"].some(s=>e[s]===!0)?!0:e&&e.role===\"heading\"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(s=>!this.isDisabled(s));return e.enabled&&r.every(s=>this.isEnabled(s))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r=\"value\"){return[].concat(e||[]).reduce((s,a)=>(s[a]=this.find(a,r),s),{})}filter(e,r){let a=typeof e==\"function\"?e:(f,p)=>[f.name,p].includes(e),c=(this.options.multiple?this.state._choices:this.choices).filter(a);return r?c.map(f=>f[r]):c}find(e,r){if(sme(e))return r?e[r]:e;let a=typeof e==\"function\"?e:(c,f)=>[c.name,f].includes(e),n=this.choices.find(a);if(n)return r?n[r]:n}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(c=>c.newChoice))return this.alert();let{reorder:r,sort:s}=this.options,a=this.multiple===!0,n=this.selected;return n===void 0?this.alert():(Array.isArray(n)&&r!==!1&&s!==!0&&(n=zR.reorder(n)),this.value=a?n.map(c=>c.name):n.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(s=>s.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r==\"string\"||typeof r==\"number\"){let s=this.find(r);s&&(this.initial=s.index,this.focus(s,!0))}}}get choices(){return ome(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:r,choices:s}=this,a=e.limit||this._limit||r.limit||s.length;return Math.min(a,this.height)}set value(e){super.value=e}get value(){return typeof super.value!=\"string\"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function ome(t,e){if(e instanceof Promise)return e;if(typeof e==\"function\"){if(zR.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let s=r.choices.filter(a=>!t.isDisabled(a));r.enabled=s.every(a=>a.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}ame.exports=p5});var G0=_((ijt,lme)=>{\"use strict\";var Xat=Wv(),h5=Zo(),g5=class extends Xat{constructor(e){super(e),this.emptyError=this.options.emptyError||\"No items were selected\"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,r){return!this.multiple||this.options.pointer?super.pointer(e,r):\"\"}indicator(e,r){return this.multiple?super.indicator(e,r):\"\"}choiceMessage(e,r){let s=this.resolve(e.message,this.state,e,r);return e.role===\"heading\"&&!h5.hasColor(s)&&(s=this.styles.strong(s)),this.resolve(s,this.state,e,r)}choiceSeparator(){return\":\"}async renderChoice(e,r){await this.onChoice(e,r);let s=this.index===r,a=await this.pointer(e,r),n=await this.indicator(e,r)+(e.pad||\"\"),c=await this.resolve(e.hint,this.state,e,r);c&&!h5.hasColor(c)&&(c=this.styles.muted(c));let f=this.indent(e),p=await this.choiceMessage(e,r),h=()=>[this.margin[3],f+a+n,p,this.margin[1],c].filter(Boolean).join(\" \");return e.role===\"heading\"?h():e.disabled?(h5.hasColor(p)||(p=this.styles.disabled(p)),h()):(s&&(p=this.styles.em(p)),h())}async renderChoices(){if(this.state.loading===\"choices\")return this.styles.warning(\"Loading choices\");if(this.state.submitted)return\"\";let e=this.visible.map(async(n,c)=>await this.renderChoice(n,c)),r=await Promise.all(e);r.length||r.push(this.styles.danger(\"No matching choices\"));let s=this.margin[0]+r.join(`\n`),a;return this.options.choicesHeader&&(a=await this.resolve(this.options.choicesHeader,this.state)),[a,s].filter(Boolean).join(`\n`)}format(){return!this.state.submitted||this.state.cancelled?\"\":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(\", \"):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:r}=this.state,s=\"\",a=await this.header(),n=await this.prefix(),c=await this.separator(),f=await this.message();this.options.promptLine!==!1&&(s=[n,f,c,\"\"].join(\" \"),this.state.prompt=s);let p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),C=await this.footer();p&&(s+=p),h&&!s.includes(h)&&(s+=\" \"+h),e&&!p&&!E.trim()&&this.multiple&&this.emptyError!=null&&(s+=this.styles.danger(this.emptyError)),this.clear(r),this.write([a,s,E,C].filter(Boolean).join(`\n`)),this.write(this.margin[2]),this.restore()}};lme.exports=g5});var ume=_((sjt,cme)=>{\"use strict\";var Zat=G0(),$at=(t,e)=>{let r=t.toLowerCase();return s=>{let n=s.toLowerCase().indexOf(r),c=e(s.slice(n,n+r.length));return n>=0?s.slice(0,n)+c+s.slice(n+r.length):s}},d5=class extends Zat{constructor(e){super(e),this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:r,input:s}=this.state;return this.input=s.slice(0,r)+e+s.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,r=this.state._choices){if(typeof this.options.suggest==\"function\")return this.options.suggest.call(this,e,r);let s=e.toLowerCase();return r.filter(a=>a.message.toLowerCase().includes(s))}pointer(){return\"\"}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(\", \");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!==\"pending\")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=$at(this.input,e),s=this.choices;this.choices=s.map(a=>({...a,message:r(a.message)})),await super.render(),this.choices=s}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};cme.exports=d5});var y5=_((ojt,fme)=>{\"use strict\";var m5=Zo();fme.exports=(t,e={})=>{t.cursorHide();let{input:r=\"\",initial:s=\"\",pos:a,showCursor:n=!0,color:c}=e,f=c||t.styles.placeholder,p=m5.inverse(t.styles.primary),h=R=>p(t.styles.black(R)),E=r,C=\" \",S=h(C);if(t.blink&&t.blink.off===!0&&(h=R=>R,S=\"\"),n&&a===0&&s===\"\"&&r===\"\")return h(C);if(n&&a===0&&(r===s||r===\"\"))return h(s[0])+f(s.slice(1));s=m5.isPrimitive(s)?`${s}`:\"\",r=m5.isPrimitive(r)?`${r}`:\"\";let P=s&&s.startsWith(r)&&s!==r,I=P?h(s[r.length]):S;if(a!==r.length&&n===!0&&(E=r.slice(0,a)+h(r[a])+r.slice(a+1),I=\"\"),n===!1&&(I=\"\"),P){let R=t.styles.unstyle(E+I);return E+I+f(s.slice(R.length))}return E+I}});var XR=_((ajt,Ame)=>{\"use strict\";var elt=Ju(),tlt=G0(),rlt=y5(),E5=class extends tlt{constructor(e){super({...e,multiple:!0}),this.type=\"form\",this.initial=this.options.initial,this.align=[this.options.align,\"right\"].find(r=>r!=null),this.emptyError=\"\",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:s,input:a}=r;return r.value=r.input=a.slice(0,s)+e+a.slice(s),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:s}=e;return e.value=e.input=s.slice(0,r-1)+s.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:s}=e;if(s[r]===void 0)return this.alert();let a=`${s}`.slice(0,r)+`${s}`.slice(r+1);return e.value=e.input=a,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:s}=e;return r&&r.startsWith(s)&&s!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input=\"\",e.cursor=0,this.render()):this.alert()}separator(){return\"\"}format(e){return this.state.submitted?\"\":super.format(e)}pointer(){return\"\"}indicator(e){return e.input?\"\\u29BF\":\"\\u2299\"}async choiceSeparator(e,r){let s=await this.resolve(e.separator,this.state,e,r)||\":\";return s?\" \"+this.styles.disabled(s):\"\"}async renderChoice(e,r){await this.onChoice(e,r);let{state:s,styles:a}=this,{cursor:n,initial:c=\"\",name:f,hint:p,input:h=\"\"}=e,{muted:E,submitted:C,primary:S,danger:P}=a,I=p,R=this.index===r,N=e.validate||(()=>!0),U=await this.choiceSeparator(e,r),W=e.message;this.align===\"right\"&&(W=W.padStart(this.longest+1,\" \")),this.align===\"left\"&&(W=W.padEnd(this.longest+1,\" \"));let ee=this.values[f]=h||c,ie=h?\"success\":\"dark\";await N.call(e,ee,this.state)!==!0&&(ie=\"danger\");let ue=a[ie],le=ue(await this.indicator(e,r))+(e.pad||\"\"),me=this.indent(e),pe=()=>[me,le,W+U,h,I].filter(Boolean).join(\" \");if(s.submitted)return W=elt.unstyle(W),h=C(h),I=\"\",pe();if(e.format)h=await e.format.call(this,h,e,r);else{let Be=this.styles.muted;h=rlt(this,{input:h,initial:c,pos:n,showCursor:R,color:Be})}return this.isValue(h)||(h=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[f]=await e.result.call(this,ee,e,r)),R&&(W=S(W)),e.error?h+=(h?\" \":\"\")+P(e.error.trim()):e.hint&&(h+=(h?\" \":\"\")+E(e.hint.trim())),pe()}async submit(){return this.value=this.values,super.base.submit.call(this)}};Ame.exports=E5});var I5=_((ljt,hme)=>{\"use strict\";var nlt=XR(),ilt=()=>{throw new Error(\"expected prompt to have a custom authenticate method\")},pme=(t=ilt)=>{class e extends nlt{constructor(s){super(s)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(s){return pme(s)}}return e};hme.exports=pme()});var mme=_((cjt,dme)=>{\"use strict\";var slt=I5();function olt(t,e){return t.username===this.options.username&&t.password===this.options.password}var gme=(t=olt)=>{let e=[{name:\"username\",message:\"username\"},{name:\"password\",message:\"password\",format(s){return this.options.showPassword?s:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(s.length))}}];class r extends slt.create(t){constructor(a){super({...a,choices:e})}static create(a){return gme(a)}}return r};dme.exports=gme()});var ZR=_((ujt,yme)=>{\"use strict\";var alt=nC(),{isPrimitive:llt,hasColor:clt}=Zo(),C5=class extends alt{constructor(e){super(e),this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:r,state:s}=this;return s.submitted?r.success(e):r.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return llt(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status===\"pending\"){let e=await this.element(\"hint\");return clt(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,s=await this.prefix(),a=await this.separator(),n=await this.message(),c=this.styles.muted(this.default),f=[s,n,c,a].filter(Boolean).join(\" \");this.state.prompt=f;let p=await this.header(),h=this.value=this.cast(e),E=await this.format(h),C=await this.error()||await this.hint(),S=await this.footer();C&&!f.includes(C)&&(E+=\" \"+C),f+=\" \"+E,this.clear(r),this.write([p,f,S].filter(Boolean).join(`\n`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};yme.exports=C5});var Ime=_((fjt,Eme)=>{\"use strict\";var ult=ZR(),w5=class extends ult{constructor(e){super(e),this.default=this.options.default||(this.initial?\"(Y/n)\":\"(y/N)\")}};Eme.exports=w5});var wme=_((Ajt,Cme)=>{\"use strict\";var flt=G0(),Alt=XR(),iC=Alt.prototype,B5=class extends flt{constructor(e){super({...e,multiple:!0}),this.align=[this.options.align,\"left\"].find(r=>r!=null),this.emptyError=\"\",this.values={}}dispatch(e,r){let s=this.focused,a=s.parent||{};return!s.editable&&!a.editable&&(e===\"a\"||e===\"i\")?super[e]():iC.dispatch.call(this,e,r)}append(e,r){return iC.append.call(this,e,r)}delete(e,r){return iC.delete.call(this,e,r)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?iC.next.call(this):super.next()}prev(){return this.focused.editable?iC.prev.call(this):super.prev()}async indicator(e,r){let s=e.indicator||\"\",a=e.editable?s:super.indicator(e,r);return await this.resolve(a,this.state,e,r)||\"\"}indent(e){return e.role===\"heading\"?\"\":e.editable?\" \":\"  \"}async renderChoice(e,r){return e.indent=\"\",e.editable?iC.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return\"\"}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!=\"function\"||r.role===\"heading\")continue;let s=r.parent?this.value[r.parent.name]:this.value;if(r.editable?s=r.value===r.name?r.initial||\"\":r.value:this.isDisabled(r)||(s=r.enabled===!0),e=await r.validate(s,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e==\"string\"?e:\"Invalid Input\"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role===\"heading\"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||\"\":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};Cme.exports=B5});var vm=_((pjt,Bme)=>{\"use strict\";var plt=nC(),hlt=y5(),{isPrimitive:glt}=Zo(),v5=class extends plt{constructor(e){super(e),this.initial=glt(this.initial)?String(this.initial):\"\",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let s=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name===\"return\"&&(!s||s.name!==\"return\")?this.append(`\n`,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value=\"\",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:s}=this.state;this.input=`${s}`.slice(0,r)+e+`${s}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let r=this.input.slice(0,e),s=this.input.slice(e),a=r.split(\" \");this.state.clipboard.push(a.pop()),this.input=a.join(\" \"),this.cursor=this.input.length,this.input+=s,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):\"\";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):hlt(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),s=await this.separator(),a=await this.message(),n=[r,a,s].filter(Boolean).join(\" \");this.state.prompt=n;let c=await this.header(),f=await this.format(),p=await this.error()||await this.hint(),h=await this.footer();p&&!f.includes(p)&&(f+=\" \"+p),n+=\" \"+f,this.clear(e),this.write([c,n,h].filter(Boolean).join(`\n`)),this.restore()}};Bme.exports=v5});var Sme=_((hjt,vme)=>{\"use strict\";var dlt=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),$R=t=>dlt(t).filter(Boolean);vme.exports=(t,e={},r=\"\")=>{let{past:s=[],present:a=\"\"}=e,n,c;switch(t){case\"prev\":case\"undo\":return n=s.slice(0,s.length-1),c=s[s.length-1]||\"\",{past:$R([r,...n]),present:c};case\"next\":case\"redo\":return n=s.slice(1),c=s[0]||\"\",{past:$R([...n,r]),present:c};case\"save\":return{past:$R([...s,r]),present:\"\"};case\"remove\":return c=$R(s.filter(f=>f!==r)),a=\"\",c.length&&(a=c.pop()),{past:c,present:a};default:throw new Error(`Invalid action: \"${t}\"`)}}});var D5=_((gjt,bme)=>{\"use strict\";var mlt=vm(),Dme=Sme(),S5=class extends mlt{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let s=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get(\"values\")||{past:[],present:s},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=Dme(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion(\"prev\")}altDown(){return this.completion(\"next\")}prev(){return this.save(),super.prev()}save(){this.store&&(this.data=Dme(\"save\",this.data,this.input),this.store.set(\"values\",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};bme.exports=S5});var xme=_((djt,Pme)=>{\"use strict\";var ylt=vm(),b5=class extends ylt{format(){return\"\"}};Pme.exports=b5});var Qme=_((mjt,kme)=>{\"use strict\";var Elt=vm(),P5=class extends Elt{constructor(e={}){super(e),this.sep=this.options.separator||/, */,this.initial=e.initial||\"\"}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:r=>r;return this.list.map(e).join(\", \")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};kme.exports=P5});var Rme=_((yjt,Tme)=>{\"use strict\";var Ilt=G0(),x5=class extends Ilt{constructor(e){super({...e,multiple:!0})}};Tme.exports=x5});var Q5=_((Ejt,Fme)=>{\"use strict\";var Clt=vm(),k5=class extends Clt{constructor(e={}){super({style:\"number\",...e}),this.min=this.isValue(e.min)?this.toNumber(e.min):-1/0,this.max=this.isValue(e.max)?this.toNumber(e.max):1/0,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:\"\",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e===\".\"&&this.input.includes(\".\")?this.alert(\"invalid number\"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let r=e||this.minor,s=this.toNumber(this.input);return s>this.max+r?this.alert():(this.input=`${s+r}`,this.render())}down(e){let r=e||this.minor,s=this.toNumber(this.input);return s<this.min-r?this.alert():(this.input=`${s-r}`,this.render())}shiftDown(){return this.down(this.major)}shiftUp(){return this.up(this.major)}format(e=this.input){return typeof this.options.format==\"function\"?this.options.format.call(this,e):this.styles.info(e)}toNumber(e=\"\"){return this.float?+e:Math.round(+e)}isValue(e){return/^[-+]?[0-9]+((\\.)|(\\.[0-9]+))?$/.test(e)}submit(){let e=[this.input,this.initial].find(r=>this.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};Fme.exports=k5});var Ome=_((Ijt,Nme)=>{Nme.exports=Q5()});var Mme=_((Cjt,Lme)=>{\"use strict\";var wlt=vm(),T5=class extends wlt{constructor(e){super(e),this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):\"\"}};Lme.exports=T5});var Hme=_((wjt,_me)=>{\"use strict\";var Blt=Ju(),vlt=Wv(),Ume=Zo(),R5=class extends vlt{constructor(e={}){super(e),this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||\"left\"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||`\n   `;let r=e.startNumber||1;typeof this.scale==\"number\"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((s,a)=>({name:a+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let s=0;s<this.scale.length;s++)r.scale.push({index:s})}this.widths[0]=Math.min(this.widths[0],e+3)}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}heading(e,r,s){return this.styles.strong(e)}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIndex>=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return\"\"}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(\", \"):\"\"}pointer(){return\"\"}renderScaleKey(){return this.scaleKey===!1||this.state.submitted?\"\":[\"\",...this.scale.map(s=>`   ${s.name} - ${s.message}`)].map(s=>this.styles.muted(s)).join(`\n`)}renderScaleHeading(e){let r=this.scale.map(p=>p.name);typeof this.options.renderScaleHeading==\"function\"&&(r=this.options.renderScaleHeading.call(this,e));let s=this.scaleLength-r.join(\"\").length,a=Math.round(s/(r.length-1)),c=r.map(p=>this.styles.strong(p)).join(\" \".repeat(a)),f=\" \".repeat(this.widths[0]);return this.margin[3]+f+this.margin[1]+c}scaleIndicator(e,r,s){if(typeof this.options.scaleIndicator==\"function\")return this.options.scaleIndicator.call(this,e,r,s);let a=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):a?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let s=e.scale.map(n=>this.scaleIndicator(e,n,r)),a=this.term===\"Hyper\"?\"\":\" \";return s.join(a+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let s=this.index===r,a=await this.pointer(e,r),n=await e.hint;n&&!Ume.hasColor(n)&&(n=this.styles.muted(n));let c=I=>this.margin[3]+I.replace(/\\s+$/,\"\").padEnd(this.widths[0],\" \"),f=this.newline,p=this.indent(e),h=await this.resolve(e.message,this.state,e,r),E=await this.renderScale(e,r),C=this.margin[1]+this.margin[3];this.scaleLength=Blt.unstyle(E).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-C.length);let P=Ume.wordWrap(h,{width:this.widths[0],newline:f}).split(`\n`).map(I=>c(I)+this.margin[1]);return s&&(E=this.styles.info(E),P=P.map(I=>this.styles.info(I))),P[0]+=E,this.linebreak&&P.push(\"\"),[p+a,P.join(`\n`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return\"\";this.tableize();let e=this.visible.map(async(a,n)=>await this.renderChoice(a,n)),r=await Promise.all(e),s=await this.renderScaleHeading();return this.margin[0]+[s,...r.map(a=>a.join(\" \"))].join(`\n`)}async render(){let{submitted:e,size:r}=this.state,s=await this.prefix(),a=await this.separator(),n=await this.message(),c=\"\";this.options.promptLine!==!1&&(c=[s,n,a,\"\"].join(\" \"),this.state.prompt=c);let f=await this.header(),p=await this.format(),h=await this.renderScaleKey(),E=await this.error()||await this.hint(),C=await this.renderChoices(),S=await this.footer(),P=this.emptyError;p&&(c+=p),E&&!c.includes(E)&&(c+=\" \"+E),e&&!p&&!C.trim()&&this.multiple&&P!=null&&(c+=this.styles.danger(P)),this.clear(r),this.write([f,c,h,C,S].filter(Boolean).join(`\n`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};_me.exports=R5});var qme=_((Bjt,Gme)=>{\"use strict\";var jme=Ju(),Slt=(t=\"\")=>typeof t==\"string\"?t.replace(/^['\"]|['\"]$/g,\"\"):\"\",N5=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=Slt(e.initial||this.field.initial||\"\"),this.message=e.message||this.name,this.cursor=0,this.input=\"\",this.lines=[]}},Dlt=async(t={},e={},r=s=>s)=>{let s=new Set,a=t.fields||[],n=t.template,c=[],f=[],p=[],h=1;typeof n==\"function\"&&(n=await n());let E=-1,C=()=>n[++E],S=()=>n[E+1],P=I=>{I.line=h,c.push(I)};for(P({type:\"bos\",value:\"\"});E<n.length-1;){let I=C();if(/^[^\\S\\n ]$/.test(I)){P({type:\"text\",value:I});continue}if(I===`\n`){P({type:\"newline\",value:I}),h++;continue}if(I===\"\\\\\"){I+=C(),P({type:\"text\",value:I});continue}if((I===\"$\"||I===\"#\"||I===\"{\")&&S()===\"{\"){let N=C();I+=N;let U={type:\"template\",open:I,inner:\"\",close:\"\",value:I},W;for(;W=C();){if(W===\"}\"){S()===\"}\"&&(W+=C()),U.value+=W,U.close=W;break}W===\":\"?(U.initial=\"\",U.key=U.inner):U.initial!==void 0&&(U.initial+=W),U.value+=W,U.inner+=W}U.template=U.open+(U.initial||U.inner)+U.close,U.key=U.key||U.inner,e.hasOwnProperty(U.key)&&(U.initial=e[U.key]),U=r(U),P(U),p.push(U.key),s.add(U.key);let ee=f.find(ie=>ie.name===U.key);U.field=a.find(ie=>ie.name===U.key),ee||(ee=new N5(U),f.push(ee)),ee.lines.push(U.line-1);continue}let R=c[c.length-1];R.type===\"text\"&&R.line===h?R.value+=I:P({type:\"text\",value:I})}return P({type:\"eos\",value:\"\"}),{input:n,tabstops:c,unique:s,keys:p,items:f}};Gme.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),s={...e.values,...e.initial},{tabstops:a,items:n,keys:c}=await Dlt(e,s),f=F5(\"result\",t,e),p=F5(\"format\",t,e),h=F5(\"validate\",t,e,!0),E=t.isValue.bind(t);return async(C={},S=!1)=>{let P=0;C.required=r,C.items=n,C.keys=c,C.output=\"\";let I=async(W,ee,ie,ue)=>{let le=await h(W,ee,ie,ue);return le===!1?\"Invalid field \"+ie.name:le};for(let W of a){let ee=W.value,ie=W.key;if(W.type!==\"template\"){ee&&(C.output+=ee);continue}if(W.type===\"template\"){let ue=n.find(Ce=>Ce.name===ie);e.required===!0&&C.required.add(ue.name);let le=[ue.input,C.values[ue.value],ue.value,ee].find(E),pe=(ue.field||{}).message||W.inner;if(S){let Ce=await I(C.values[ie],C,ue,P);if(Ce&&typeof Ce==\"string\"||Ce===!1){C.invalid.set(ie,Ce);continue}C.invalid.delete(ie);let g=await f(C.values[ie],C,ue,P);C.output+=jme.unstyle(g);continue}ue.placeholder=!1;let Be=ee;ee=await p(ee,C,ue,P),le!==ee?(C.values[ie]=le,ee=t.styles.typing(le),C.missing.delete(pe)):(C.values[ie]=void 0,le=`<${pe}>`,ee=t.styles.primary(le),ue.placeholder=!0,C.required.has(ie)&&C.missing.add(pe)),C.missing.has(pe)&&C.validating&&(ee=t.styles.warning(le)),C.invalid.has(ie)&&C.validating&&(ee=t.styles.danger(le)),P===C.index&&(Be!==ee?ee=t.styles.underline(ee):ee=t.styles.heading(jme.unstyle(ee))),P++}ee&&(C.output+=ee)}let R=C.output.split(`\n`).map(W=>\" \"+W),N=n.length,U=0;for(let W of n)C.invalid.has(W.name)&&W.lines.forEach(ee=>{R[ee][0]===\" \"&&(R[ee]=C.styles.danger(C.symbols.bullet)+R[ee].slice(1))}),t.isValue(C.values[W.name])&&U++;return C.completed=(U/N*100).toFixed(0),C.output=R.join(`\n`),C.output}};function F5(t,e,r,s){return(a,n,c,f)=>typeof c.field[t]==\"function\"?c.field[t].call(e,a,n,c,f):[s,a].find(p=>e.isValue(p))}});var Yme=_((vjt,Wme)=>{\"use strict\";var blt=Ju(),Plt=qme(),xlt=nC(),O5=class extends xlt{constructor(e){super(e),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await Plt(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let s=this.getItem(),a=s.input.slice(0,this.cursor),n=s.input.slice(this.cursor);this.input=s.input=`${a}${e}${n}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),s=e.input.slice(0,this.cursor-1);this.input=e.input=`${s}${r}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:s,size:a}=this.state,n=[this.options.newline,`\n`].find(W=>W!=null),c=await this.prefix(),f=await this.separator(),p=await this.message(),h=[c,p,f].filter(Boolean).join(\" \");this.state.prompt=h;let E=await this.header(),C=await this.error()||\"\",S=await this.hint()||\"\",P=s?\"\":await this.interpolate(this.state),I=this.state.key=r[e]||\"\",R=await this.format(I),N=await this.footer();R&&(h+=\" \"+R),S&&!R&&this.state.completed===0&&(h+=\" \"+S),this.clear(a);let U=[E,h,P,N,C.trim()];this.write(U.filter(Boolean).join(n)),this.restore()}getItem(e){let{items:r,keys:s,index:a}=this.state,n=r.find(c=>c.name===s[a]);return n&&n.input!=null&&(this.input=n.input,this.cursor=n.cursor),n}async submit(){typeof this.interpolate!=\"function\"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:s,values:a}=this.state;if(e.size){let f=\"\";for(let[p,h]of e)f+=`Invalid ${p}: ${h}\n`;return this.state.error=f,super.submit()}if(r.size)return this.state.error=\"Required: \"+[...r.keys()].join(\", \"),super.submit();let c=blt.unstyle(s).split(`\n`).map(f=>f.slice(1)).join(`\n`);return this.value={values:a,result:c},super.submit()}};Wme.exports=O5});var Jme=_((Sjt,Vme)=>{\"use strict\";var klt=\"(Use <shift>+<up/down> to sort)\",Qlt=G0(),L5=class extends Qlt{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,klt].find(this.isValue.bind(this))}indicator(){return\"\"}async renderChoice(e,r){let s=await super.renderChoice(e,r),a=this.symbols.identicalTo+\" \",n=this.index===r&&this.sorting?this.styles.muted(a):\"  \";return this.options.drag===!1&&(n=\"\"),this.options.numbered===!0?n+`${r+1} - `+s:n+s}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};Vme.exports=L5});var zme=_((Djt,Kme)=>{\"use strict\";var Tlt=Wv(),M5=class extends Tlt{constructor(e={}){if(super(e),this.emptyError=e.emptyError||\"No items were selected\",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=[\"\",\"4 - Strongly Agree\",\"3 - Agree\",\"2 - Neutral\",\"1 - Disagree\",\"0 - Strongly Disagree\",\"\"];r=r.map(s=>this.styles.muted(s)),this.state.header=r.join(`\n   `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let s of r)s.scale=Rlt(5,this.options),s.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],s=r.selected;return e.scale.forEach(a=>a.selected=!1),r.selected=!s,this.render()}indicator(){return\"\"}pointer(){return\"\"}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return\"   \"}async renderChoice(e,r){await this.onChoice(e,r);let s=this.index===r,a=this.term===\"Hyper\",n=a?9:8,c=a?\"\":\" \",f=this.symbols.line.repeat(n),p=\" \".repeat(n+(a?0:1)),h=ee=>(ee?this.styles.success(\"\\u25C9\"):\"\\u25EF\")+c,E=r+1+\".\",C=s?this.styles.heading:this.styles.noop,S=await this.resolve(e.message,this.state,e,r),P=this.indent(e),I=P+e.scale.map((ee,ie)=>h(ie===e.scaleIdx)).join(f),R=ee=>ee===e.scaleIdx?C(ee):ee,N=P+e.scale.map((ee,ie)=>R(ie)).join(p),U=()=>[E,S].filter(Boolean).join(\" \"),W=()=>[U(),I,N,\" \"].filter(Boolean).join(`\n`);return s&&(I=this.styles.cyan(I),N=this.styles.cyan(N)),W()}async renderChoices(){if(this.state.submitted)return\"\";let e=this.visible.map(async(s,a)=>await this.renderChoice(s,a)),r=await Promise.all(e);return r.length||r.push(this.styles.danger(\"No matching choices\")),r.join(`\n`)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(\", \"):\"\"}async render(){let{submitted:e,size:r}=this.state,s=await this.prefix(),a=await this.separator(),n=await this.message(),c=[s,n,a].filter(Boolean).join(\" \");this.state.prompt=c;let f=await this.header(),p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),C=await this.footer();(p||!h)&&(c+=\" \"+p),h&&!c.includes(h)&&(c+=\" \"+h),e&&!p&&!E&&this.multiple&&this.type!==\"form\"&&(c+=this.styles.danger(this.emptyError)),this.clear(r),this.write([c,f,E,C].filter(Boolean).join(`\n`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function Rlt(t,e={}){if(Array.isArray(e.scale))return e.scale.map(s=>({...s}));let r=[];for(let s=1;s<t+1;s++)r.push({i:s,selected:!1});return r}Kme.exports=M5});var Zme=_((bjt,Xme)=>{Xme.exports=D5()});var eye=_((Pjt,$me)=>{\"use strict\";var Flt=ZR(),U5=class extends Flt{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||\"no\",this.enabled=this.options.enabled||\"yes\",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e=\"\",r){switch(e.toLowerCase()){case\" \":return this.toggle();case\"1\":case\"y\":case\"t\":return this.enable();case\"0\":case\"n\":case\"f\":return this.disable();default:return this.alert()}}format(){let e=s=>this.styles.primary.underline(s);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(\" / \"))}async render(){let{size:e}=this.state,r=await this.header(),s=await this.prefix(),a=await this.separator(),n=await this.message(),c=await this.format(),f=await this.error()||await this.hint(),p=await this.footer(),h=[s,n,a,c].join(\" \");this.state.prompt=h,f&&!h.includes(f)&&(h+=\" \"+f),this.clear(e),this.write([r,h,p].filter(Boolean).join(`\n`)),this.write(this.margin[2]),this.restore()}};$me.exports=U5});var rye=_((xjt,tye)=>{\"use strict\";var Nlt=G0(),_5=class extends Nlt{constructor(e){if(super(e),typeof this.options.correctChoice!=\"number\"||this.options.correctChoice<0)throw new Error(\"Please specify the index of the correct answer from the list of choices\")}async toChoices(e,r){let s=await super.toChoices(e,r);if(s.length<2)throw new Error(\"Please give at least two choices to the user\");if(this.options.correctChoice>s.length)throw new Error(\"Please specify the index of the correct answer from the list of choices\");return s}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};tye.exports=_5});var iye=_(H5=>{\"use strict\";var nye=Zo(),ks=(t,e)=>{nye.defineExport(H5,t,e),nye.defineExport(H5,t.toLowerCase(),e)};ks(\"AutoComplete\",()=>ume());ks(\"BasicAuth\",()=>mme());ks(\"Confirm\",()=>Ime());ks(\"Editable\",()=>wme());ks(\"Form\",()=>XR());ks(\"Input\",()=>D5());ks(\"Invisible\",()=>xme());ks(\"List\",()=>Qme());ks(\"MultiSelect\",()=>Rme());ks(\"Numeral\",()=>Ome());ks(\"Password\",()=>Mme());ks(\"Scale\",()=>Hme());ks(\"Select\",()=>G0());ks(\"Snippet\",()=>Yme());ks(\"Sort\",()=>Jme());ks(\"Survey\",()=>zme());ks(\"Text\",()=>Zme());ks(\"Toggle\",()=>eye());ks(\"Quiz\",()=>rye())});var oye=_((Qjt,sye)=>{sye.exports={ArrayPrompt:Wv(),AuthPrompt:I5(),BooleanPrompt:ZR(),NumberPrompt:Q5(),StringPrompt:vm()}});var Vv=_((Tjt,lye)=>{\"use strict\";var aye=Ie(\"assert\"),G5=Ie(\"events\"),q0=Zo(),zu=class extends G5{constructor(e,r){super(),this.options=q0.merge({},e),this.answers={...r}}register(e,r){if(q0.isObject(e)){for(let a of Object.keys(e))this.register(a,e[a]);return this}aye.equal(typeof r,\"function\",\"expected a function\");let s=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[s]=r:this.prompts[s]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r==\"function\"&&(r=await r.call(this)),await this.ask(q0.merge({},this.options,r))}catch(s){return Promise.reject(s)}return this.answers}async ask(e){typeof e==\"function\"&&(e=await e.call(this));let r=q0.merge({},this.options,e),{type:s,name:a}=e,{set:n,get:c}=q0;if(typeof s==\"function\"&&(s=await s.call(this,e,this.answers)),!s)return this.answers[a];aye(this.prompts[s],`Prompt \"${s}\" is not registered`);let f=new this.prompts[s](r),p=c(this.answers,a);f.state.answers=this.answers,f.enquirer=this,a&&f.on(\"submit\",E=>{this.emit(\"answer\",a,E,f),n(this.answers,a,E)});let h=f.emit.bind(f);return f.emit=(...E)=>(this.emit.call(this,...E),h(...E)),this.emit(\"prompt\",f,this),r.autofill&&p!=null?(f.value=f.input=p,r.autofill===\"show\"&&await f.submit()):p=f.value=await f.run(),p}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||nC()}static get prompts(){return iye()}static get types(){return oye()}static get prompt(){let e=(r,...s)=>{let a=new this(...s),n=a.emit.bind(a);return a.emit=(...c)=>(e.emit(...c),n(...c)),a.prompt(r)};return q0.mixinEmitter(e,new G5),e}};q0.mixinEmitter(zu,new G5);var j5=zu.prompts;for(let t of Object.keys(j5)){let e=t.toLowerCase(),r=s=>new j5[t](s).run();zu.prompt[e]=r,zu[e]=r,zu[t]||Reflect.defineProperty(zu,t,{get:()=>j5[t]})}var Yv=t=>{q0.defineExport(zu,t,()=>zu.types[t])};Yv(\"ArrayPrompt\");Yv(\"AuthPrompt\");Yv(\"BooleanPrompt\");Yv(\"NumberPrompt\");Yv(\"StringPrompt\");lye.exports=zu});var dye=_((tGt,qlt)=>{qlt.exports={name:\"@yarnpkg/cli\",version:\"4.12.0\",license:\"BSD-2-Clause\",main:\"./sources/index.ts\",exports:{\".\":\"./sources/index.ts\",\"./polyfills\":\"./sources/polyfills.ts\",\"./package.json\":\"./package.json\"},dependencies:{\"@yarnpkg/core\":\"workspace:^\",\"@yarnpkg/fslib\":\"workspace:^\",\"@yarnpkg/libzip\":\"workspace:^\",\"@yarnpkg/parsers\":\"workspace:^\",\"@yarnpkg/plugin-catalog\":\"workspace:^\",\"@yarnpkg/plugin-compat\":\"workspace:^\",\"@yarnpkg/plugin-constraints\":\"workspace:^\",\"@yarnpkg/plugin-dlx\":\"workspace:^\",\"@yarnpkg/plugin-essentials\":\"workspace:^\",\"@yarnpkg/plugin-exec\":\"workspace:^\",\"@yarnpkg/plugin-file\":\"workspace:^\",\"@yarnpkg/plugin-git\":\"workspace:^\",\"@yarnpkg/plugin-github\":\"workspace:^\",\"@yarnpkg/plugin-http\":\"workspace:^\",\"@yarnpkg/plugin-init\":\"workspace:^\",\"@yarnpkg/plugin-interactive-tools\":\"workspace:^\",\"@yarnpkg/plugin-jsr\":\"workspace:^\",\"@yarnpkg/plugin-link\":\"workspace:^\",\"@yarnpkg/plugin-nm\":\"workspace:^\",\"@yarnpkg/plugin-npm\":\"workspace:^\",\"@yarnpkg/plugin-npm-cli\":\"workspace:^\",\"@yarnpkg/plugin-pack\":\"workspace:^\",\"@yarnpkg/plugin-patch\":\"workspace:^\",\"@yarnpkg/plugin-pnp\":\"workspace:^\",\"@yarnpkg/plugin-pnpm\":\"workspace:^\",\"@yarnpkg/plugin-stage\":\"workspace:^\",\"@yarnpkg/plugin-typescript\":\"workspace:^\",\"@yarnpkg/plugin-version\":\"workspace:^\",\"@yarnpkg/plugin-workspace-tools\":\"workspace:^\",\"@yarnpkg/shell\":\"workspace:^\",\"ci-info\":\"^4.0.0\",clipanion:\"^4.0.0-rc.2\",semver:\"^7.1.2\",tslib:\"^2.4.0\",typanion:\"^3.14.0\"},devDependencies:{\"@types/semver\":\"^7.1.0\",\"@yarnpkg/builder\":\"workspace:^\",\"@yarnpkg/monorepo\":\"workspace:^\",\"@yarnpkg/pnpify\":\"workspace:^\"},peerDependencies:{\"@yarnpkg/core\":\"workspace:^\"},scripts:{postpack:\"rm -rf lib\",prepack:'run build:compile \"$(pwd)\"',\"build:cli+hook\":\"run build:pnp:hook && builder build bundle\",\"build:cli\":\"builder build bundle\",\"run:cli\":\"builder run\",\"update-local\":\"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/\"},publishConfig:{main:\"./lib/index.js\",bin:null,exports:{\".\":\"./lib/index.js\",\"./package.json\":\"./package.json\"}},files:[\"/lib/**/*\",\"!/lib/pluginConfiguration.*\",\"!/lib/cli.*\"],\"@yarnpkg/builder\":{bundles:{standard:[\"@yarnpkg/plugin-essentials\",\"@yarnpkg/plugin-catalog\",\"@yarnpkg/plugin-compat\",\"@yarnpkg/plugin-constraints\",\"@yarnpkg/plugin-dlx\",\"@yarnpkg/plugin-exec\",\"@yarnpkg/plugin-file\",\"@yarnpkg/plugin-git\",\"@yarnpkg/plugin-github\",\"@yarnpkg/plugin-http\",\"@yarnpkg/plugin-init\",\"@yarnpkg/plugin-interactive-tools\",\"@yarnpkg/plugin-jsr\",\"@yarnpkg/plugin-link\",\"@yarnpkg/plugin-nm\",\"@yarnpkg/plugin-npm\",\"@yarnpkg/plugin-npm-cli\",\"@yarnpkg/plugin-pack\",\"@yarnpkg/plugin-patch\",\"@yarnpkg/plugin-pnp\",\"@yarnpkg/plugin-pnpm\",\"@yarnpkg/plugin-stage\",\"@yarnpkg/plugin-typescript\",\"@yarnpkg/plugin-version\",\"@yarnpkg/plugin-workspace-tools\"]}},repository:{type:\"git\",url:\"git+https://github.com/yarnpkg/berry.git\",directory:\"packages/yarnpkg-cli\"},engines:{node:\">=18.12.0\"}}});var iq=_((R9t,Pye)=>{\"use strict\";Pye.exports=function(e,r){r===!0&&(r=0);var s=\"\";if(typeof e==\"string\")try{s=new URL(e).protocol}catch{}else e&&e.constructor===URL&&(s=e.protocol);var a=s.split(/\\:|\\+/).filter(Boolean);return typeof r==\"number\"?a[r]:a}});var kye=_((F9t,xye)=>{\"use strict\";var uct=iq();function fct(t){var e={protocols:[],protocol:null,port:null,resource:\"\",host:\"\",user:\"\",password:\"\",pathname:\"\",hash:\"\",search:\"\",href:t,query:{},parse_failed:!1};try{var r=new URL(t);e.protocols=uct(r),e.protocol=e.protocols[0],e.port=r.port,e.resource=r.hostname,e.host=r.host,e.user=r.username||\"\",e.password=r.password||\"\",e.pathname=r.pathname,e.hash=r.hash.slice(1),e.search=r.search.slice(1),e.href=r.href,e.query=Object.fromEntries(r.searchParams)}catch{e.protocols=[\"file\"],e.protocol=e.protocols[0],e.port=\"\",e.resource=\"\",e.user=\"\",e.pathname=\"\",e.hash=\"\",e.search=\"\",e.href=t,e.query={},e.parse_failed=!0}return e}xye.exports=fct});var Rye=_((N9t,Tye)=>{\"use strict\";var Act=kye();function pct(t){return t&&typeof t==\"object\"&&\"default\"in t?t:{default:t}}var hct=pct(Act),gct=\"text/plain\",dct=\"us-ascii\",Qye=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),mct=(t,{stripHash:e})=>{let r=/^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(t);if(!r)throw new Error(`Invalid URL: ${t}`);let{type:s,data:a,hash:n}=r.groups,c=s.split(\";\");n=e?\"\":n;let f=!1;c[c.length-1]===\"base64\"&&(c.pop(),f=!0);let p=(c.shift()||\"\").toLowerCase(),E=[...c.map(C=>{let[S,P=\"\"]=C.split(\"=\").map(I=>I.trim());return S===\"charset\"&&(P=P.toLowerCase(),P===dct)?\"\":`${S}${P?`=${P}`:\"\"}`}).filter(Boolean)];return f&&E.push(\"base64\"),(E.length>0||p&&p!==gct)&&E.unshift(p),`data:${E.join(\";\")},${f?a.trim():a}${n?`#${n}`:\"\"}`};function yct(t,e){if(e={defaultProtocol:\"http:\",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},t=t.trim(),/^data:/i.test(t))return mct(t,e);if(/^view-source:/i.test(t))throw new Error(\"`view-source:` is not supported as it is a non-standard protocol\");let r=t.startsWith(\"//\");!r&&/^\\.*\\//.test(t)||(t=t.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//,e.defaultProtocol));let a=new URL(t);if(e.forceHttp&&e.forceHttps)throw new Error(\"The `forceHttp` and `forceHttps` options cannot be used together\");if(e.forceHttp&&a.protocol===\"https:\"&&(a.protocol=\"http:\"),e.forceHttps&&a.protocol===\"http:\"&&(a.protocol=\"https:\"),e.stripAuthentication&&(a.username=\"\",a.password=\"\"),e.stripHash?a.hash=\"\":e.stripTextFragment&&(a.hash=a.hash.replace(/#?:~:text.*?$/i,\"\")),a.pathname){let c=/\\b[a-z][a-z\\d+\\-.]{1,50}:\\/\\//g,f=0,p=\"\";for(;;){let E=c.exec(a.pathname);if(!E)break;let C=E[0],S=E.index,P=a.pathname.slice(f,S);p+=P.replace(/\\/{2,}/g,\"/\"),p+=C,f=S+C.length}let h=a.pathname.slice(f,a.pathname.length);p+=h.replace(/\\/{2,}/g,\"/\"),a.pathname=p}if(a.pathname)try{a.pathname=decodeURI(a.pathname)}catch{}if(e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let c=a.pathname.split(\"/\"),f=c[c.length-1];Qye(f,e.removeDirectoryIndex)&&(c=c.slice(0,-1),a.pathname=c.slice(1).join(\"/\")+\"/\")}if(a.hostname&&(a.hostname=a.hostname.replace(/\\.$/,\"\"),e.stripWWW&&/^www\\.(?!www\\.)[a-z\\-\\d]{1,63}\\.[a-z.\\-\\d]{2,63}$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\\./,\"\"))),Array.isArray(e.removeQueryParameters))for(let c of[...a.searchParams.keys()])Qye(c,e.removeQueryParameters)&&a.searchParams.delete(c);if(e.removeQueryParameters===!0&&(a.search=\"\"),e.sortQueryParameters){a.searchParams.sort();try{a.search=decodeURIComponent(a.search)}catch{}}e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\\/$/,\"\"));let n=t;return t=a.toString(),!e.removeSingleSlash&&a.pathname===\"/\"&&!n.endsWith(\"/\")&&a.hash===\"\"&&(t=t.replace(/\\/$/,\"\")),(e.removeTrailingSlash||a.pathname===\"/\")&&a.hash===\"\"&&e.removeSingleSlash&&(t=t.replace(/\\/$/,\"\")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\\/\\//,\"//\")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\\/\\//,\"\")),t}var sq=(t,e=!1)=>{let r=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\\/\\/)([\\w\\.\\-@]+)[\\/:]([\\~,\\.\\w,\\-,\\_,\\/]+?(?:\\.git|\\/)?)$/,s=n=>{let c=new Error(n);throw c.subject_url=t,c};(typeof t!=\"string\"||!t.trim())&&s(\"Invalid url.\"),t.length>sq.MAX_INPUT_LENGTH&&s(\"Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH.\"),e&&(typeof e!=\"object\"&&(e={stripHash:!1}),t=yct(t,e));let a=hct.default(t);if(a.parse_failed){let n=a.href.match(r);n?(a.protocols=[\"ssh\"],a.protocol=\"ssh\",a.resource=n[2],a.host=n[2],a.user=n[1],a.pathname=`/${n[3]}`,a.parse_failed=!1):s(\"URL parsing failed.\")}return a};sq.MAX_INPUT_LENGTH=2048;Tye.exports=sq});var Oye=_((O9t,Nye)=>{\"use strict\";var Ect=iq();function Fye(t){if(Array.isArray(t))return t.indexOf(\"ssh\")!==-1||t.indexOf(\"rsync\")!==-1;if(typeof t!=\"string\")return!1;var e=Ect(t);if(t=t.substring(t.indexOf(\"://\")+3),Fye(e))return!0;var r=new RegExp(\".([a-zA-Z\\\\d]+):(\\\\d+)/\");return!t.match(r)&&t.indexOf(\"@\")<t.indexOf(\":\")}Nye.exports=Fye});var Uye=_((L9t,Mye)=>{\"use strict\";var Ict=Rye(),Lye=Oye();function Cct(t){var e=Ict(t);return e.token=\"\",e.password===\"x-oauth-basic\"?e.token=e.user:e.user===\"x-token-auth\"&&(e.token=e.password),Lye(e.protocols)||e.protocols.length===0&&Lye(t)?e.protocol=\"ssh\":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol=\"file\",e.protocols=[\"file\"]),e.href=e.href.replace(/\\/$/,\"\"),e}Mye.exports=Cct});var Hye=_((M9t,_ye)=>{\"use strict\";var wct=Uye();function oq(t){if(typeof t!=\"string\")throw new Error(\"The url must be a string.\");var e=/^([a-z\\d-]{1,39})\\/([-\\.\\w]{1,100})$/i;e.test(t)&&(t=\"https://github.com/\"+t);var r=wct(t),s=r.resource.split(\".\"),a=null;switch(r.toString=function(N){return oq.stringify(this,N)},r.source=s.length>2?s.slice(1-s.length).join(\".\"):r.source=r.resource,r.git_suffix=/\\.git$/.test(r.pathname),r.name=decodeURIComponent((r.pathname||r.href).replace(/(^\\/)|(\\/$)/g,\"\").replace(/\\.git$/,\"\")),r.owner=decodeURIComponent(r.user),r.source){case\"git.cloudforge.com\":r.owner=r.user,r.organization=s[0],r.source=\"cloudforge.com\";break;case\"visualstudio.com\":if(r.resource===\"vs-ssh.visualstudio.com\"){a=r.name.split(\"/\"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3],r.full_name=a[2]+\"/\"+a[3]);break}else{a=r.name.split(\"/\"),a.length===2?(r.owner=a[1],r.name=a[1],r.full_name=\"_git/\"+r.name):a.length===3?(r.name=a[2],a[0]===\"DefaultCollection\"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+\"/_git/\"+r.name):(r.owner=a[0],r.full_name=r.owner+\"/_git/\"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+\"/\"+r.owner+\"/_git/\"+r.name);break}case\"dev.azure.com\":case\"azure.com\":if(r.resource===\"ssh.dev.azure.com\"){a=r.name.split(\"/\"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3]);break}else{a=r.name.split(\"/\"),a.length===5?(r.organization=a[0],r.owner=a[1],r.name=a[4],r.full_name=\"_git/\"+r.name):a.length===3?(r.name=a[2],a[0]===\"DefaultCollection\"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+\"/_git/\"+r.name):(r.owner=a[0],r.full_name=r.owner+\"/_git/\"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+\"/\"+r.owner+\"/_git/\"+r.name),r.query&&r.query.path&&(r.filepath=r.query.path.replace(/^\\/+/g,\"\")),r.query&&r.query.version&&(r.ref=r.query.version.replace(/^GB/,\"\"));break}default:a=r.name.split(\"/\");var n=a.length-1;if(a.length>=2){var c=a.indexOf(\"-\",2),f=a.indexOf(\"blob\",2),p=a.indexOf(\"tree\",2),h=a.indexOf(\"commit\",2),E=a.indexOf(\"src\",2),C=a.indexOf(\"raw\",2),S=a.indexOf(\"edit\",2);n=c>0?c-1:f>0?f-1:p>0?p-1:h>0?h-1:E>0?E-1:C>0?C-1:S>0?S-1:n,r.owner=a.slice(0,n).join(\"/\"),r.name=a[n],h&&(r.commit=a[n+2])}r.ref=\"\",r.filepathtype=\"\",r.filepath=\"\";var P=a.length>n&&a[n+1]===\"-\"?n+1:n;a.length>P+2&&[\"raw\",\"src\",\"blob\",\"tree\",\"edit\"].indexOf(a[P+1])>=0&&(r.filepathtype=a[P+1],r.ref=a[P+2],a.length>P+3&&(r.filepath=a.slice(P+3).join(\"/\"))),r.organization=r.owner;break}r.full_name||(r.full_name=r.owner,r.name&&(r.full_name&&(r.full_name+=\"/\"),r.full_name+=r.name)),r.owner.startsWith(\"scm/\")&&(r.source=\"bitbucket-server\",r.owner=r.owner.replace(\"scm/\",\"\"),r.organization=r.owner,r.full_name=r.owner+\"/\"+r.name);var I=/(projects|users)\\/(.*?)\\/repos\\/(.*?)((\\/.*$)|$)/,R=I.exec(r.pathname);return R!=null&&(r.source=\"bitbucket-server\",R[1]===\"users\"?r.owner=\"~\"+R[2]:r.owner=R[2],r.organization=r.owner,r.name=R[3],a=R[4].split(\"/\"),a.length>1&&([\"raw\",\"browse\"].indexOf(a[1])>=0?(r.filepathtype=a[1],a.length>2&&(r.filepath=a.slice(2).join(\"/\"))):a[1]===\"commits\"&&a.length>2&&(r.commit=a[2])),r.full_name=r.owner+\"/\"+r.name,r.query.at?r.ref=r.query.at:r.ref=\"\"),r}oq.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join(\"+\"):t.protocol);var r=t.port?\":\"+t.port:\"\",s=t.user||\"git\",a=t.git_suffix?\".git\":\"\";switch(e){case\"ssh\":return r?\"ssh://\"+s+\"@\"+t.resource+r+\"/\"+t.full_name+a:s+\"@\"+t.resource+\":\"+t.full_name+a;case\"git+ssh\":case\"ssh+git\":case\"ftp\":case\"ftps\":return e+\"://\"+s+\"@\"+t.resource+r+\"/\"+t.full_name+a;case\"http\":case\"https\":var n=t.token?Bct(t):t.user&&(t.protocols.includes(\"http\")||t.protocols.includes(\"https\"))?t.user+\"@\":\"\";return e+\"://\"+n+t.resource+r+\"/\"+vct(t)+a;default:return t.href}};function Bct(t){switch(t.source){case\"bitbucket.org\":return\"x-token-auth:\"+t.token+\"@\";default:return t.token+\"@\"}}function vct(t){switch(t.source){case\"bitbucket-server\":return\"scm/\"+t.full_name;default:return\"\"+t.full_name}}_ye.exports=oq});function jct(t,e){return e===1&&Hct.has(t[0])}function nS(t){let e=Array.isArray(t)?t:Mu(t);return e.map((s,a)=>Uct.test(s)?`[${s}]`:_ct.test(s)&&!jct(e,a)?`.${s}`:`[${JSON.stringify(s)}]`).join(\"\").replace(/^\\./,\"\")}function Gct(t,e){let r=[];if(e.methodName!==null&&r.push(he.pretty(t,e.methodName,he.Type.CODE)),e.file!==null){let s=[];s.push(he.pretty(t,e.file,he.Type.PATH)),e.line!==null&&(s.push(he.pretty(t,e.line,he.Type.NUMBER)),e.column!==null&&s.push(he.pretty(t,e.column,he.Type.NUMBER))),r.push(`(${s.join(he.pretty(t,\":\",\"grey\"))})`)}return r.join(\" \")}function iF(t,{manifestUpdates:e,reportedErrors:r},{fix:s}={}){let a=new Map,n=new Map,c=[...r.keys()].map(f=>[f,new Map]);for(let[f,p]of[...c,...e]){let h=r.get(f)?.map(P=>({text:P,fixable:!1}))??[],E=!1,C=t.getWorkspaceByCwd(f),S=C.manifest.exportTo({});for(let[P,I]of p){if(I.size>1){let R=[...I].map(([N,U])=>{let W=he.pretty(t.configuration,N,he.Type.INSPECT),ee=U.size>0?Gct(t.configuration,U.values().next().value):null;return ee!==null?`\n${W} at ${ee}`:`\n${W}`}).join(\"\");h.push({text:`Conflict detected in constraint targeting ${he.pretty(t.configuration,P,he.Type.CODE)}; conflicting values are:${R}`,fixable:!1})}else{let[[R]]=I,N=va(S,P);if(JSON.stringify(N)===JSON.stringify(R))continue;if(!s){let U=typeof N>\"u\"?`Missing field ${he.pretty(t.configuration,P,he.Type.CODE)}; expected ${he.pretty(t.configuration,R,he.Type.INSPECT)}`:typeof R>\"u\"?`Extraneous field ${he.pretty(t.configuration,P,he.Type.CODE)} currently set to ${he.pretty(t.configuration,N,he.Type.INSPECT)}`:`Invalid field ${he.pretty(t.configuration,P,he.Type.CODE)}; expected ${he.pretty(t.configuration,R,he.Type.INSPECT)}, found ${he.pretty(t.configuration,N,he.Type.INSPECT)}`;h.push({text:U,fixable:!0});continue}typeof R>\"u\"?A0(S,P):Jd(S,P,R),E=!0}E&&a.set(C,S)}h.length>0&&n.set(C,h)}return{changedWorkspaces:a,remainingErrors:n}}function rEe(t,{configuration:e}){let r={children:[]};for(let[s,a]of t){let n=[];for(let f of a){let p=f.text.split(/\\n/);f.fixable&&(p[0]=`${he.pretty(e,\"\\u2699\",\"gray\")} ${p[0]}`),n.push({value:he.tuple(he.Type.NO_HINT,p[0]),children:p.slice(1).map(h=>({value:he.tuple(he.Type.NO_HINT,h)}))})}let c={value:he.tuple(he.Type.LOCATOR,s.anchoredLocator),children:je.sortMap(n,f=>f.value[1])};r.children.push(c)}return r.children=je.sortMap(r.children,s=>s.value[1]),r}var WC,Uct,_ct,Hct,iS=Xe(()=>{Ge();ql();WC=class{constructor(e){this.indexedFields=e;this.items=[];this.indexes={};this.clear()}clear(){this.items=[];for(let e of this.indexedFields)this.indexes[e]=new Map}insert(e){this.items.push(e);for(let r of this.indexedFields){let s=Object.hasOwn(e,r)?e[r]:void 0;if(typeof s>\"u\")continue;je.getArrayWithDefault(this.indexes[r],s).push(e)}return e}find(e){if(typeof e>\"u\")return this.items;let r=Object.entries(e);if(r.length===0)return this.items;let s=[],a;for(let[c,f]of r){let p=c,h=Object.hasOwn(this.indexes,p)?this.indexes[p]:void 0;if(typeof h>\"u\"){s.push([p,f]);continue}let E=new Set(h.get(f)??[]);if(E.size===0)return[];if(typeof a>\"u\")a=E;else for(let C of a)E.has(C)||a.delete(C);if(a.size===0)break}let n=[...a??[]];return s.length>0&&(n=n.filter(c=>{for(let[f,p]of s)if(!(typeof p<\"u\"?Object.hasOwn(c,f)&&c[f]===p:Object.hasOwn(c,f)===!1))return!1;return!0})),n}},Uct=/^[0-9]+$/,_ct=/^[a-zA-Z0-9_]+$/,Hct=new Set([\"scripts\",...Ut.allDependencies])});var nEe=_((_Yt,vq)=>{var qct;(function(t){var e=function(){return{\"append/2\":[new t.type.Rule(new t.type.Term(\"append\",[new t.type.Var(\"X\"),new t.type.Var(\"L\")]),new t.type.Term(\"foldl\",[new t.type.Term(\"append\",[]),new t.type.Var(\"X\"),new t.type.Term(\"[]\",[]),new t.type.Var(\"L\")]))],\"append/3\":[new t.type.Rule(new t.type.Term(\"append\",[new t.type.Term(\"[]\",[]),new t.type.Var(\"X\"),new t.type.Var(\"X\")]),null),new t.type.Rule(new t.type.Term(\"append\",[new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"T\")]),new t.type.Var(\"X\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"S\")])]),new t.type.Term(\"append\",[new t.type.Var(\"T\"),new t.type.Var(\"X\"),new t.type.Var(\"S\")]))],\"member/2\":[new t.type.Rule(new t.type.Term(\"member\",[new t.type.Var(\"X\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"_\")])]),null),new t.type.Rule(new t.type.Term(\"member\",[new t.type.Var(\"X\"),new t.type.Term(\".\",[new t.type.Var(\"_\"),new t.type.Var(\"Xs\")])]),new t.type.Term(\"member\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]))],\"permutation/2\":[new t.type.Rule(new t.type.Term(\"permutation\",[new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"permutation\",[new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"T\")]),new t.type.Var(\"S\")]),new t.type.Term(\",\",[new t.type.Term(\"permutation\",[new t.type.Var(\"T\"),new t.type.Var(\"P\")]),new t.type.Term(\",\",[new t.type.Term(\"append\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"P\")]),new t.type.Term(\"append\",[new t.type.Var(\"X\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"Y\")]),new t.type.Var(\"S\")])])]))],\"maplist/2\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"X\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"Xs\")])]))],\"maplist/3\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"A\"),new t.type.Var(\"As\")]),new t.type.Term(\".\",[new t.type.Var(\"B\"),new t.type.Var(\"Bs\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"A\"),new t.type.Var(\"B\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"As\"),new t.type.Var(\"Bs\")])]))],\"maplist/4\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"A\"),new t.type.Var(\"As\")]),new t.type.Term(\".\",[new t.type.Var(\"B\"),new t.type.Var(\"Bs\")]),new t.type.Term(\".\",[new t.type.Var(\"C\"),new t.type.Var(\"Cs\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"A\"),new t.type.Var(\"B\"),new t.type.Var(\"C\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"As\"),new t.type.Var(\"Bs\"),new t.type.Var(\"Cs\")])]))],\"maplist/5\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"A\"),new t.type.Var(\"As\")]),new t.type.Term(\".\",[new t.type.Var(\"B\"),new t.type.Var(\"Bs\")]),new t.type.Term(\".\",[new t.type.Var(\"C\"),new t.type.Var(\"Cs\")]),new t.type.Term(\".\",[new t.type.Var(\"D\"),new t.type.Var(\"Ds\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"A\"),new t.type.Var(\"B\"),new t.type.Var(\"C\"),new t.type.Var(\"D\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"As\"),new t.type.Var(\"Bs\"),new t.type.Var(\"Cs\"),new t.type.Var(\"Ds\")])]))],\"maplist/6\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"A\"),new t.type.Var(\"As\")]),new t.type.Term(\".\",[new t.type.Var(\"B\"),new t.type.Var(\"Bs\")]),new t.type.Term(\".\",[new t.type.Var(\"C\"),new t.type.Var(\"Cs\")]),new t.type.Term(\".\",[new t.type.Var(\"D\"),new t.type.Var(\"Ds\")]),new t.type.Term(\".\",[new t.type.Var(\"E\"),new t.type.Var(\"Es\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"A\"),new t.type.Var(\"B\"),new t.type.Var(\"C\"),new t.type.Var(\"D\"),new t.type.Var(\"E\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"As\"),new t.type.Var(\"Bs\"),new t.type.Var(\"Cs\"),new t.type.Var(\"Ds\"),new t.type.Var(\"Es\")])]))],\"maplist/7\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"A\"),new t.type.Var(\"As\")]),new t.type.Term(\".\",[new t.type.Var(\"B\"),new t.type.Var(\"Bs\")]),new t.type.Term(\".\",[new t.type.Var(\"C\"),new t.type.Var(\"Cs\")]),new t.type.Term(\".\",[new t.type.Var(\"D\"),new t.type.Var(\"Ds\")]),new t.type.Term(\".\",[new t.type.Var(\"E\"),new t.type.Var(\"Es\")]),new t.type.Term(\".\",[new t.type.Var(\"F\"),new t.type.Var(\"Fs\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"A\"),new t.type.Var(\"B\"),new t.type.Var(\"C\"),new t.type.Var(\"D\"),new t.type.Var(\"E\"),new t.type.Var(\"F\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"As\"),new t.type.Var(\"Bs\"),new t.type.Var(\"Cs\"),new t.type.Var(\"Ds\"),new t.type.Var(\"Es\"),new t.type.Var(\"Fs\")])]))],\"maplist/8\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"A\"),new t.type.Var(\"As\")]),new t.type.Term(\".\",[new t.type.Var(\"B\"),new t.type.Var(\"Bs\")]),new t.type.Term(\".\",[new t.type.Var(\"C\"),new t.type.Var(\"Cs\")]),new t.type.Term(\".\",[new t.type.Var(\"D\"),new t.type.Var(\"Ds\")]),new t.type.Term(\".\",[new t.type.Var(\"E\"),new t.type.Var(\"Es\")]),new t.type.Term(\".\",[new t.type.Var(\"F\"),new t.type.Var(\"Fs\")]),new t.type.Term(\".\",[new t.type.Var(\"G\"),new t.type.Var(\"Gs\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"A\"),new t.type.Var(\"B\"),new t.type.Var(\"C\"),new t.type.Var(\"D\"),new t.type.Var(\"E\"),new t.type.Var(\"F\"),new t.type.Var(\"G\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"As\"),new t.type.Var(\"Bs\"),new t.type.Var(\"Cs\"),new t.type.Var(\"Ds\"),new t.type.Var(\"Es\"),new t.type.Var(\"Fs\"),new t.type.Var(\"Gs\")])]))],\"include/3\":[new t.type.Rule(new t.type.Term(\"include\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"include\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"T\")]),new t.type.Var(\"L\")]),new t.type.Term(\",\",[new t.type.Term(\"=..\",[new t.type.Var(\"P\"),new t.type.Var(\"A\")]),new t.type.Term(\",\",[new t.type.Term(\"append\",[new t.type.Var(\"A\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Term(\"[]\",[])]),new t.type.Var(\"B\")]),new t.type.Term(\",\",[new t.type.Term(\"=..\",[new t.type.Var(\"F\"),new t.type.Var(\"B\")]),new t.type.Term(\",\",[new t.type.Term(\";\",[new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"F\")]),new t.type.Term(\",\",[new t.type.Term(\"=\",[new t.type.Var(\"L\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"S\")])]),new t.type.Term(\"!\",[])])]),new t.type.Term(\"=\",[new t.type.Var(\"L\"),new t.type.Var(\"S\")])]),new t.type.Term(\"include\",[new t.type.Var(\"P\"),new t.type.Var(\"T\"),new t.type.Var(\"S\")])])])])]))],\"exclude/3\":[new t.type.Rule(new t.type.Term(\"exclude\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"exclude\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"T\")]),new t.type.Var(\"S\")]),new t.type.Term(\",\",[new t.type.Term(\"exclude\",[new t.type.Var(\"P\"),new t.type.Var(\"T\"),new t.type.Var(\"E\")]),new t.type.Term(\",\",[new t.type.Term(\"=..\",[new t.type.Var(\"P\"),new t.type.Var(\"L\")]),new t.type.Term(\",\",[new t.type.Term(\"append\",[new t.type.Var(\"L\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Term(\"[]\",[])]),new t.type.Var(\"Q\")]),new t.type.Term(\",\",[new t.type.Term(\"=..\",[new t.type.Var(\"R\"),new t.type.Var(\"Q\")]),new t.type.Term(\";\",[new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"R\")]),new t.type.Term(\",\",[new t.type.Term(\"!\",[]),new t.type.Term(\"=\",[new t.type.Var(\"S\"),new t.type.Var(\"E\")])])]),new t.type.Term(\"=\",[new t.type.Var(\"S\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"E\")])])])])])])]))],\"foldl/4\":[new t.type.Rule(new t.type.Term(\"foldl\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Var(\"I\"),new t.type.Var(\"I\")]),null),new t.type.Rule(new t.type.Term(\"foldl\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"T\")]),new t.type.Var(\"I\"),new t.type.Var(\"R\")]),new t.type.Term(\",\",[new t.type.Term(\"=..\",[new t.type.Var(\"P\"),new t.type.Var(\"L\")]),new t.type.Term(\",\",[new t.type.Term(\"append\",[new t.type.Var(\"L\"),new t.type.Term(\".\",[new t.type.Var(\"I\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Term(\"[]\",[])])])]),new t.type.Var(\"L2\")]),new t.type.Term(\",\",[new t.type.Term(\"=..\",[new t.type.Var(\"P2\"),new t.type.Var(\"L2\")]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P2\")]),new t.type.Term(\"foldl\",[new t.type.Var(\"P\"),new t.type.Var(\"T\"),new t.type.Var(\"X\"),new t.type.Var(\"R\")])])])])]))],\"select/3\":[new t.type.Rule(new t.type.Term(\"select\",[new t.type.Var(\"E\"),new t.type.Term(\".\",[new t.type.Var(\"E\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"Xs\")]),null),new t.type.Rule(new t.type.Term(\"select\",[new t.type.Var(\"E\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Ys\")])]),new t.type.Term(\"select\",[new t.type.Var(\"E\"),new t.type.Var(\"Xs\"),new t.type.Var(\"Ys\")]))],\"sum_list/2\":[new t.type.Rule(new t.type.Term(\"sum_list\",[new t.type.Term(\"[]\",[]),new t.type.Num(0,!1)]),null),new t.type.Rule(new t.type.Term(\"sum_list\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"S\")]),new t.type.Term(\",\",[new t.type.Term(\"sum_list\",[new t.type.Var(\"Xs\"),new t.type.Var(\"Y\")]),new t.type.Term(\"is\",[new t.type.Var(\"S\"),new t.type.Term(\"+\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\")])])]))],\"max_list/2\":[new t.type.Rule(new t.type.Term(\"max_list\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Term(\"[]\",[])]),new t.type.Var(\"X\")]),null),new t.type.Rule(new t.type.Term(\"max_list\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"S\")]),new t.type.Term(\",\",[new t.type.Term(\"max_list\",[new t.type.Var(\"Xs\"),new t.type.Var(\"Y\")]),new t.type.Term(\";\",[new t.type.Term(\",\",[new t.type.Term(\">=\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\")]),new t.type.Term(\",\",[new t.type.Term(\"=\",[new t.type.Var(\"S\"),new t.type.Var(\"X\")]),new t.type.Term(\"!\",[])])]),new t.type.Term(\"=\",[new t.type.Var(\"S\"),new t.type.Var(\"Y\")])])]))],\"min_list/2\":[new t.type.Rule(new t.type.Term(\"min_list\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Term(\"[]\",[])]),new t.type.Var(\"X\")]),null),new t.type.Rule(new t.type.Term(\"min_list\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"S\")]),new t.type.Term(\",\",[new t.type.Term(\"min_list\",[new t.type.Var(\"Xs\"),new t.type.Var(\"Y\")]),new t.type.Term(\";\",[new t.type.Term(\",\",[new t.type.Term(\"=<\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\")]),new t.type.Term(\",\",[new t.type.Term(\"=\",[new t.type.Var(\"S\"),new t.type.Var(\"X\")]),new t.type.Term(\"!\",[])])]),new t.type.Term(\"=\",[new t.type.Var(\"S\"),new t.type.Var(\"Y\")])])]))],\"prod_list/2\":[new t.type.Rule(new t.type.Term(\"prod_list\",[new t.type.Term(\"[]\",[]),new t.type.Num(1,!1)]),null),new t.type.Rule(new t.type.Term(\"prod_list\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"S\")]),new t.type.Term(\",\",[new t.type.Term(\"prod_list\",[new t.type.Var(\"Xs\"),new t.type.Var(\"Y\")]),new t.type.Term(\"is\",[new t.type.Var(\"S\"),new t.type.Term(\"*\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\")])])]))],\"last/2\":[new t.type.Rule(new t.type.Term(\"last\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Term(\"[]\",[])]),new t.type.Var(\"X\")]),null),new t.type.Rule(new t.type.Term(\"last\",[new t.type.Term(\".\",[new t.type.Var(\"_\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"X\")]),new t.type.Term(\"last\",[new t.type.Var(\"Xs\"),new t.type.Var(\"X\")]))],\"prefix/2\":[new t.type.Rule(new t.type.Term(\"prefix\",[new t.type.Var(\"Part\"),new t.type.Var(\"Whole\")]),new t.type.Term(\"append\",[new t.type.Var(\"Part\"),new t.type.Var(\"_\"),new t.type.Var(\"Whole\")]))],\"nth0/3\":[new t.type.Rule(new t.type.Term(\"nth0\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\")]),new t.type.Term(\";\",[new t.type.Term(\"->\",[new t.type.Term(\"var\",[new t.type.Var(\"X\")]),new t.type.Term(\"nth\",[new t.type.Num(0,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"_\")])]),new t.type.Term(\",\",[new t.type.Term(\">=\",[new t.type.Var(\"X\"),new t.type.Num(0,!1)]),new t.type.Term(\",\",[new t.type.Term(\"nth\",[new t.type.Num(0,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"_\")]),new t.type.Term(\"!\",[])])])]))],\"nth1/3\":[new t.type.Rule(new t.type.Term(\"nth1\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\")]),new t.type.Term(\";\",[new t.type.Term(\"->\",[new t.type.Term(\"var\",[new t.type.Var(\"X\")]),new t.type.Term(\"nth\",[new t.type.Num(1,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"_\")])]),new t.type.Term(\",\",[new t.type.Term(\">\",[new t.type.Var(\"X\"),new t.type.Num(0,!1)]),new t.type.Term(\",\",[new t.type.Term(\"nth\",[new t.type.Num(1,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"_\")]),new t.type.Term(\"!\",[])])])]))],\"nth0/4\":[new t.type.Rule(new t.type.Term(\"nth0\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"W\")]),new t.type.Term(\";\",[new t.type.Term(\"->\",[new t.type.Term(\"var\",[new t.type.Var(\"X\")]),new t.type.Term(\"nth\",[new t.type.Num(0,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"W\")])]),new t.type.Term(\",\",[new t.type.Term(\">=\",[new t.type.Var(\"X\"),new t.type.Num(0,!1)]),new t.type.Term(\",\",[new t.type.Term(\"nth\",[new t.type.Num(0,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"W\")]),new t.type.Term(\"!\",[])])])]))],\"nth1/4\":[new t.type.Rule(new t.type.Term(\"nth1\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"W\")]),new t.type.Term(\";\",[new t.type.Term(\"->\",[new t.type.Term(\"var\",[new t.type.Var(\"X\")]),new t.type.Term(\"nth\",[new t.type.Num(1,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"W\")])]),new t.type.Term(\",\",[new t.type.Term(\">\",[new t.type.Var(\"X\"),new t.type.Num(0,!1)]),new t.type.Term(\",\",[new t.type.Term(\"nth\",[new t.type.Num(1,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"W\")]),new t.type.Term(\"!\",[])])])]))],\"nth/5\":[new t.type.Rule(new t.type.Term(\"nth\",[new t.type.Var(\"N\"),new t.type.Var(\"N\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),null),new t.type.Rule(new t.type.Term(\"nth\",[new t.type.Var(\"N\"),new t.type.Var(\"O\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"Y\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Ys\")])]),new t.type.Term(\",\",[new t.type.Term(\"is\",[new t.type.Var(\"M\"),new t.type.Term(\"+\",[new t.type.Var(\"N\"),new t.type.Num(1,!1)])]),new t.type.Term(\"nth\",[new t.type.Var(\"M\"),new t.type.Var(\"O\"),new t.type.Var(\"Xs\"),new t.type.Var(\"Y\"),new t.type.Var(\"Ys\")])]))],\"length/2\":function(s,a,n){var c=n.args[0],f=n.args[1];if(!t.type.is_variable(f)&&!t.type.is_integer(f))s.throw_error(t.error.type(\"integer\",f,n.indicator));else if(t.type.is_integer(f)&&f.value<0)s.throw_error(t.error.domain(\"not_less_than_zero\",f,n.indicator));else{var p=new t.type.Term(\"length\",[c,new t.type.Num(0,!1),f]);t.type.is_integer(f)&&(p=new t.type.Term(\",\",[p,new t.type.Term(\"!\",[])])),s.prepend([new t.type.State(a.goal.replace(p),a.substitution,a)])}},\"length/3\":[new t.type.Rule(new t.type.Term(\"length\",[new t.type.Term(\"[]\",[]),new t.type.Var(\"N\"),new t.type.Var(\"N\")]),null),new t.type.Rule(new t.type.Term(\"length\",[new t.type.Term(\".\",[new t.type.Var(\"_\"),new t.type.Var(\"X\")]),new t.type.Var(\"A\"),new t.type.Var(\"N\")]),new t.type.Term(\",\",[new t.type.Term(\"succ\",[new t.type.Var(\"A\"),new t.type.Var(\"B\")]),new t.type.Term(\"length\",[new t.type.Var(\"X\"),new t.type.Var(\"B\"),new t.type.Var(\"N\")])]))],\"replicate/3\":function(s,a,n){var c=n.args[0],f=n.args[1],p=n.args[2];if(t.type.is_variable(f))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_integer(f))s.throw_error(t.error.type(\"integer\",f,n.indicator));else if(f.value<0)s.throw_error(t.error.domain(\"not_less_than_zero\",f,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))s.throw_error(t.error.type(\"list\",p,n.indicator));else{for(var h=new t.type.Term(\"[]\"),E=0;E<f.value;E++)h=new t.type.Term(\".\",[c,h]);s.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[h,p])),a.substitution,a)])}},\"sort/2\":function(s,a,n){var c=n.args[0],f=n.args[1];if(t.type.is_variable(c))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(f)&&!t.type.is_fully_list(f))s.throw_error(t.error.type(\"list\",f,n.indicator));else{for(var p=[],h=c;h.indicator===\"./2\";)p.push(h.args[0]),h=h.args[1];if(t.type.is_variable(h))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(h))s.throw_error(t.error.type(\"list\",c,n.indicator));else{for(var E=p.sort(t.compare),C=E.length-1;C>0;C--)E[C].equals(E[C-1])&&E.splice(C,1);for(var S=new t.type.Term(\"[]\"),C=E.length-1;C>=0;C--)S=new t.type.Term(\".\",[E[C],S]);s.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[S,f])),a.substitution,a)])}}},\"msort/2\":function(s,a,n){var c=n.args[0],f=n.args[1];if(t.type.is_variable(c))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(f)&&!t.type.is_fully_list(f))s.throw_error(t.error.type(\"list\",f,n.indicator));else{for(var p=[],h=c;h.indicator===\"./2\";)p.push(h.args[0]),h=h.args[1];if(t.type.is_variable(h))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(h))s.throw_error(t.error.type(\"list\",c,n.indicator));else{for(var E=p.sort(t.compare),C=new t.type.Term(\"[]\"),S=E.length-1;S>=0;S--)C=new t.type.Term(\".\",[E[S],C]);s.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[C,f])),a.substitution,a)])}}},\"keysort/2\":function(s,a,n){var c=n.args[0],f=n.args[1];if(t.type.is_variable(c))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(f)&&!t.type.is_fully_list(f))s.throw_error(t.error.type(\"list\",f,n.indicator));else{for(var p=[],h,E=c;E.indicator===\"./2\";){if(h=E.args[0],t.type.is_variable(h)){s.throw_error(t.error.instantiation(n.indicator));return}else if(!t.type.is_term(h)||h.indicator!==\"-/2\"){s.throw_error(t.error.type(\"pair\",h,n.indicator));return}h.args[0].pair=h.args[1],p.push(h.args[0]),E=E.args[1]}if(t.type.is_variable(E))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(E))s.throw_error(t.error.type(\"list\",c,n.indicator));else{for(var C=p.sort(t.compare),S=new t.type.Term(\"[]\"),P=C.length-1;P>=0;P--)S=new t.type.Term(\".\",[new t.type.Term(\"-\",[C[P],C[P].pair]),S]),delete C[P].pair;s.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[S,f])),a.substitution,a)])}}},\"take/3\":function(s,a,n){var c=n.args[0],f=n.args[1],p=n.args[2];if(t.type.is_variable(f)||t.type.is_variable(c))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(f))s.throw_error(t.error.type(\"list\",f,n.indicator));else if(!t.type.is_integer(c))s.throw_error(t.error.type(\"integer\",c,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))s.throw_error(t.error.type(\"list\",p,n.indicator));else{for(var h=c.value,E=[],C=f;h>0&&C.indicator===\"./2\";)E.push(C.args[0]),C=C.args[1],h--;if(h===0){for(var S=new t.type.Term(\"[]\"),h=E.length-1;h>=0;h--)S=new t.type.Term(\".\",[E[h],S]);s.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[S,p])),a.substitution,a)])}}},\"drop/3\":function(s,a,n){var c=n.args[0],f=n.args[1],p=n.args[2];if(t.type.is_variable(f)||t.type.is_variable(c))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(f))s.throw_error(t.error.type(\"list\",f,n.indicator));else if(!t.type.is_integer(c))s.throw_error(t.error.type(\"integer\",c,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))s.throw_error(t.error.type(\"list\",p,n.indicator));else{for(var h=c.value,E=[],C=f;h>0&&C.indicator===\"./2\";)E.push(C.args[0]),C=C.args[1],h--;h===0&&s.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[C,p])),a.substitution,a)])}},\"reverse/2\":function(s,a,n){var c=n.args[0],f=n.args[1],p=t.type.is_instantiated_list(c),h=t.type.is_instantiated_list(f);if(t.type.is_variable(c)&&t.type.is_variable(f))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(c)&&!t.type.is_fully_list(c))s.throw_error(t.error.type(\"list\",c,n.indicator));else if(!t.type.is_variable(f)&&!t.type.is_fully_list(f))s.throw_error(t.error.type(\"list\",f,n.indicator));else if(!p&&!h)s.throw_error(t.error.instantiation(n.indicator));else{for(var E=p?c:f,C=new t.type.Term(\"[]\",[]);E.indicator===\"./2\";)C=new t.type.Term(\".\",[E.args[0],C]),E=E.args[1];s.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[C,p?f:c])),a.substitution,a)])}},\"list_to_set/2\":function(s,a,n){var c=n.args[0],f=n.args[1];if(t.type.is_variable(c))s.throw_error(t.error.instantiation(n.indicator));else{for(var p=c,h=[];p.indicator===\"./2\";)h.push(p.args[0]),p=p.args[1];if(t.type.is_variable(p))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_term(p)||p.indicator!==\"[]/0\")s.throw_error(t.error.type(\"list\",c,n.indicator));else{for(var E=[],C=new t.type.Term(\"[]\",[]),S,P=0;P<h.length;P++){S=!1;for(var I=0;I<E.length&&!S;I++)S=t.compare(h[P],E[I])===0;S||E.push(h[P])}for(P=E.length-1;P>=0;P--)C=new t.type.Term(\".\",[E[P],C]);s.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[f,C])),a.substitution,a)])}}}}},r=[\"append/2\",\"append/3\",\"member/2\",\"permutation/2\",\"maplist/2\",\"maplist/3\",\"maplist/4\",\"maplist/5\",\"maplist/6\",\"maplist/7\",\"maplist/8\",\"include/3\",\"exclude/3\",\"foldl/4\",\"sum_list/2\",\"max_list/2\",\"min_list/2\",\"prod_list/2\",\"last/2\",\"prefix/2\",\"nth0/3\",\"nth1/3\",\"nth0/4\",\"nth1/4\",\"length/2\",\"replicate/3\",\"select/3\",\"sort/2\",\"msort/2\",\"keysort/2\",\"take/3\",\"drop/3\",\"reverse/2\",\"list_to_set/2\"];typeof vq<\"u\"?vq.exports=function(s){t=s,new t.type.Module(\"lists\",e(),r)}:new t.type.Module(\"lists\",e(),r)})(qct)});var yEe=_($r=>{\"use strict\";var bm=process.platform===\"win32\",Sq=\"aes-256-cbc\",Wct=\"sha256\",oEe=\"The current environment doesn't support interactive reading from TTY.\",si=Ie(\"fs\"),iEe=process.binding(\"tty_wrap\").TTY,bq=Ie(\"child_process\"),V0=Ie(\"path\"),Pq={prompt:\"> \",hideEchoBack:!1,mask:\"*\",limit:[],limitMessage:\"Input another, please.$<( [)limit(])>\",defaultInput:\"\",trueValue:[],falseValue:[],caseSensitive:!1,keepWhitespace:!1,encoding:\"utf8\",bufferSize:1024,print:void 0,history:!0,cd:!1,phContent:void 0,preCheck:void 0},Xp=\"none\",Zu,VC,sEe=!1,Y0,oF,Dq,Yct=0,Rq=\"\",Dm=[],aF,aEe=!1,xq=!1,sS=!1;function lEe(t){function e(r){return r.replace(/[^\\w\\u0080-\\uFFFF]/g,function(s){return\"#\"+s.charCodeAt(0)+\";\"})}return oF.concat(function(r){var s=[];return Object.keys(r).forEach(function(a){r[a]===\"boolean\"?t[a]&&s.push(\"--\"+a):r[a]===\"string\"&&t[a]&&s.push(\"--\"+a,e(t[a]))}),s}({display:\"string\",displayOnly:\"boolean\",keyIn:\"boolean\",hideEchoBack:\"boolean\",mask:\"string\",limit:\"string\",caseSensitive:\"boolean\"}))}function Vct(t,e){function r(U){var W,ee=\"\",ie;for(Dq=Dq||Ie(\"os\").tmpdir();;){W=V0.join(Dq,U+ee);try{ie=si.openSync(W,\"wx\")}catch(ue){if(ue.code===\"EEXIST\"){ee++;continue}else throw ue}si.closeSync(ie);break}return W}var s,a,n,c={},f,p,h=r(\"readline-sync.stdout\"),E=r(\"readline-sync.stderr\"),C=r(\"readline-sync.exit\"),S=r(\"readline-sync.done\"),P=Ie(\"crypto\"),I,R,N;I=P.createHash(Wct),I.update(\"\"+process.pid+Yct+++Math.random()),N=I.digest(\"hex\"),R=P.createDecipher(Sq,N),s=lEe(t),bm?(a=process.env.ComSpec||\"cmd.exe\",process.env.Q='\"',n=[\"/V:ON\",\"/S\",\"/C\",\"(%Q%\"+a+\"%Q% /V:ON /S /C %Q%%Q%\"+Y0+\"%Q%\"+s.map(function(U){return\" %Q%\"+U+\"%Q%\"}).join(\"\")+\" & (echo !ERRORLEVEL!)>%Q%\"+C+\"%Q%%Q%) 2>%Q%\"+E+\"%Q% |%Q%\"+process.execPath+\"%Q% %Q%\"+__dirname+\"\\\\encrypt.js%Q% %Q%\"+Sq+\"%Q% %Q%\"+N+\"%Q% >%Q%\"+h+\"%Q% & (echo 1)>%Q%\"+S+\"%Q%\"]):(a=\"/bin/sh\",n=[\"-c\",'(\"'+Y0+'\"'+s.map(function(U){return\" '\"+U.replace(/'/g,\"'\\\\''\")+\"'\"}).join(\"\")+'; echo $?>\"'+C+'\") 2>\"'+E+'\" |\"'+process.execPath+'\" \"'+__dirname+'/encrypt.js\" \"'+Sq+'\" \"'+N+'\" >\"'+h+'\"; echo 1 >\"'+S+'\"']),sS&&sS(\"_execFileSync\",s);try{bq.spawn(a,n,e)}catch(U){c.error=new Error(U.message),c.error.method=\"_execFileSync - spawn\",c.error.program=a,c.error.args=n}for(;si.readFileSync(S,{encoding:t.encoding}).trim()!==\"1\";);return(f=si.readFileSync(C,{encoding:t.encoding}).trim())===\"0\"?c.input=R.update(si.readFileSync(h,{encoding:\"binary\"}),\"hex\",t.encoding)+R.final(t.encoding):(p=si.readFileSync(E,{encoding:t.encoding}).trim(),c.error=new Error(oEe+(p?`\n`+p:\"\")),c.error.method=\"_execFileSync\",c.error.program=a,c.error.args=n,c.error.extMessage=p,c.error.exitCode=+f),si.unlinkSync(h),si.unlinkSync(E),si.unlinkSync(C),si.unlinkSync(S),c}function Jct(t){var e,r={},s,a={env:process.env,encoding:t.encoding};if(Y0||(bm?process.env.PSModulePath?(Y0=\"powershell.exe\",oF=[\"-ExecutionPolicy\",\"Bypass\",\"-File\",__dirname+\"\\\\read.ps1\"]):(Y0=\"cscript.exe\",oF=[\"//nologo\",__dirname+\"\\\\read.cs.js\"]):(Y0=\"/bin/sh\",oF=[__dirname+\"/read.sh\"])),bm&&!process.env.PSModulePath&&(a.stdio=[process.stdin]),bq.execFileSync){e=lEe(t),sS&&sS(\"execFileSync\",e);try{r.input=bq.execFileSync(Y0,e,a)}catch(n){s=n.stderr?(n.stderr+\"\").trim():\"\",r.error=new Error(oEe+(s?`\n`+s:\"\")),r.error.method=\"execFileSync\",r.error.program=Y0,r.error.args=e,r.error.extMessage=s,r.error.exitCode=n.status,r.error.code=n.code,r.error.signal=n.signal}}else r=Vct(t,a);return r.error||(r.input=r.input.replace(/^\\s*'|'\\s*$/g,\"\"),t.display=\"\"),r}function kq(t){var e=\"\",r=t.display,s=!t.display&&t.keyIn&&t.hideEchoBack&&!t.mask;function a(){var n=Jct(t);if(n.error)throw n.error;return n.input}return xq&&xq(t),function(){var n,c,f;function p(){return n||(n=process.binding(\"fs\"),c=process.binding(\"constants\")),n}if(typeof Xp==\"string\")if(Xp=null,bm){if(f=function(h){var E=h.replace(/^\\D+/,\"\").split(\".\"),C=0;return(E[0]=+E[0])&&(C+=E[0]*1e4),(E[1]=+E[1])&&(C+=E[1]*100),(E[2]=+E[2])&&(C+=E[2]),C}(process.version),!(f>=20302&&f<40204||f>=5e4&&f<50100||f>=50600&&f<60200)&&process.stdin.isTTY)process.stdin.pause(),Xp=process.stdin.fd,VC=process.stdin._handle;else try{Xp=p().open(\"CONIN$\",c.O_RDWR,parseInt(\"0666\",8)),VC=new iEe(Xp,!0)}catch{}if(process.stdout.isTTY)Zu=process.stdout.fd;else{try{Zu=si.openSync(\"\\\\\\\\.\\\\CON\",\"w\")}catch{}if(typeof Zu!=\"number\")try{Zu=p().open(\"CONOUT$\",c.O_RDWR,parseInt(\"0666\",8))}catch{}}}else{if(process.stdin.isTTY){process.stdin.pause();try{Xp=si.openSync(\"/dev/tty\",\"r\"),VC=process.stdin._handle}catch{}}else try{Xp=si.openSync(\"/dev/tty\",\"r\"),VC=new iEe(Xp,!1)}catch{}if(process.stdout.isTTY)Zu=process.stdout.fd;else try{Zu=si.openSync(\"/dev/tty\",\"w\")}catch{}}}(),function(){var n,c,f=!t.hideEchoBack&&!t.keyIn,p,h,E,C,S;aF=\"\";function P(I){return I===sEe?!0:VC.setRawMode(I)!==0?!1:(sEe=I,!0)}if(aEe||!VC||typeof Zu!=\"number\"&&(t.display||!f)){e=a();return}if(t.display&&(si.writeSync(Zu,t.display),t.display=\"\"),!t.displayOnly){if(!P(!f)){e=a();return}for(h=t.keyIn?1:t.bufferSize,p=Buffer.allocUnsafe&&Buffer.alloc?Buffer.alloc(h):new Buffer(h),t.keyIn&&t.limit&&(c=new RegExp(\"[^\"+t.limit+\"]\",\"g\"+(t.caseSensitive?\"\":\"i\")));;){E=0;try{E=si.readSync(Xp,p,0,h)}catch(I){if(I.code!==\"EOF\"){P(!1),e+=a();return}}if(E>0?(C=p.toString(t.encoding,0,E),aF+=C):(C=`\n`,aF+=\"\\0\"),C&&typeof(S=(C.match(/^(.*?)[\\r\\n]/)||[])[1])==\"string\"&&(C=S,n=!0),C&&(C=C.replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/g,\"\")),C&&c&&(C=C.replace(c,\"\")),C&&(f||(t.hideEchoBack?t.mask&&si.writeSync(Zu,new Array(C.length+1).join(t.mask)):si.writeSync(Zu,C)),e+=C),!t.keyIn&&n||t.keyIn&&e.length>=h)break}!f&&!s&&si.writeSync(Zu,`\n`),P(!1)}}(),t.print&&!s&&t.print(r+(t.displayOnly?\"\":(t.hideEchoBack?new Array(e.length+1).join(t.mask):e)+`\n`),t.encoding),t.displayOnly?\"\":Rq=t.keepWhitespace||t.keyIn?e:e.trim()}function Kct(t,e){var r=[];function s(a){a!=null&&(Array.isArray(a)?a.forEach(s):(!e||e(a))&&r.push(a))}return s(t),r}function Fq(t){return t.replace(/[\\x00-\\x7f]/g,function(e){return\"\\\\x\"+(\"00\"+e.charCodeAt().toString(16)).substr(-2)})}function Vs(){var t=Array.prototype.slice.call(arguments),e,r;return t.length&&typeof t[0]==\"boolean\"&&(r=t.shift(),r&&(e=Object.keys(Pq),t.unshift(Pq))),t.reduce(function(s,a){return a==null||(a.hasOwnProperty(\"noEchoBack\")&&!a.hasOwnProperty(\"hideEchoBack\")&&(a.hideEchoBack=a.noEchoBack,delete a.noEchoBack),a.hasOwnProperty(\"noTrim\")&&!a.hasOwnProperty(\"keepWhitespace\")&&(a.keepWhitespace=a.noTrim,delete a.noTrim),r||(e=Object.keys(a)),e.forEach(function(n){var c;if(a.hasOwnProperty(n))switch(c=a[n],n){case\"mask\":case\"limitMessage\":case\"defaultInput\":case\"encoding\":c=c!=null?c+\"\":\"\",c&&n!==\"limitMessage\"&&(c=c.replace(/[\\r\\n]/g,\"\")),s[n]=c;break;case\"bufferSize\":!isNaN(c=parseInt(c,10))&&typeof c==\"number\"&&(s[n]=c);break;case\"displayOnly\":case\"keyIn\":case\"hideEchoBack\":case\"caseSensitive\":case\"keepWhitespace\":case\"history\":case\"cd\":s[n]=!!c;break;case\"limit\":case\"trueValue\":case\"falseValue\":s[n]=Kct(c,function(f){var p=typeof f;return p===\"string\"||p===\"number\"||p===\"function\"||f instanceof RegExp}).map(function(f){return typeof f==\"string\"?f.replace(/[\\r\\n]/g,\"\"):f});break;case\"print\":case\"phContent\":case\"preCheck\":s[n]=typeof c==\"function\"?c:void 0;break;case\"prompt\":case\"display\":s[n]=c??\"\";break}})),s},{})}function Qq(t,e,r){return e.some(function(s){var a=typeof s;return a===\"string\"?r?t===s:t.toLowerCase()===s.toLowerCase():a===\"number\"?parseFloat(t)===s:a===\"function\"?s(t):s instanceof RegExp?s.test(t):!1})}function Nq(t,e){var r=V0.normalize(bm?(process.env.HOMEDRIVE||\"\")+(process.env.HOMEPATH||\"\"):process.env.HOME||\"\").replace(/[\\/\\\\]+$/,\"\");return t=V0.normalize(t),e?t.replace(/^~(?=\\/|\\\\|$)/,r):t.replace(new RegExp(\"^\"+Fq(r)+\"(?=\\\\/|\\\\\\\\|$)\",bm?\"i\":\"\"),\"~\")}function JC(t,e){var r=\"(?:\\\\(([\\\\s\\\\S]*?)\\\\))?(\\\\w+|.-.)(?:\\\\(([\\\\s\\\\S]*?)\\\\))?\",s=new RegExp(\"(\\\\$)?(\\\\$<\"+r+\">)\",\"g\"),a=new RegExp(\"(\\\\$)?(\\\\$\\\\{\"+r+\"\\\\})\",\"g\");function n(c,f,p,h,E,C){var S;return f||typeof(S=e(E))!=\"string\"?p:S?(h||\"\")+S+(C||\"\"):\"\"}return t.replace(s,n).replace(a,n)}function cEe(t,e,r){var s,a=[],n=-1,c=0,f=\"\",p;function h(E,C){return C.length>3?(E.push(C[0]+\"...\"+C[C.length-1]),p=!0):C.length&&(E=E.concat(C)),E}return s=t.reduce(function(E,C){return E.concat((C+\"\").split(\"\"))},[]).reduce(function(E,C){var S,P;return e||(C=C.toLowerCase()),S=/^\\d$/.test(C)?1:/^[A-Z]$/.test(C)?2:/^[a-z]$/.test(C)?3:0,r&&S===0?f+=C:(P=C.charCodeAt(0),S&&S===n&&P===c+1?a.push(C):(E=h(E,a),a=[C],n=S),c=P),E},[]),s=h(s,a),f&&(s.push(f),p=!0),{values:s,suppressed:p}}function uEe(t,e){return t.join(t.length>2?\", \":e?\" / \":\"/\")}function fEe(t,e){var r,s,a={},n;if(e.phContent&&(r=e.phContent(t,e)),typeof r!=\"string\")switch(t){case\"hideEchoBack\":case\"mask\":case\"defaultInput\":case\"caseSensitive\":case\"keepWhitespace\":case\"encoding\":case\"bufferSize\":case\"history\":case\"cd\":r=e.hasOwnProperty(t)?typeof e[t]==\"boolean\"?e[t]?\"on\":\"off\":e[t]+\"\":\"\";break;case\"limit\":case\"trueValue\":case\"falseValue\":s=e[e.hasOwnProperty(t+\"Src\")?t+\"Src\":t],e.keyIn?(a=cEe(s,e.caseSensitive),s=a.values):s=s.filter(function(c){var f=typeof c;return f===\"string\"||f===\"number\"}),r=uEe(s,a.suppressed);break;case\"limitCount\":case\"limitCountNotZero\":r=e[e.hasOwnProperty(\"limitSrc\")?\"limitSrc\":\"limit\"].length,r=r||t!==\"limitCountNotZero\"?r+\"\":\"\";break;case\"lastInput\":r=Rq;break;case\"cwd\":case\"CWD\":case\"cwdHome\":r=process.cwd(),t===\"CWD\"?r=V0.basename(r):t===\"cwdHome\"&&(r=Nq(r));break;case\"date\":case\"time\":case\"localeDate\":case\"localeTime\":r=new Date()[\"to\"+t.replace(/^./,function(c){return c.toUpperCase()})+\"String\"]();break;default:typeof(n=(t.match(/^history_m(\\d+)$/)||[])[1])==\"string\"&&(r=Dm[Dm.length-n]||\"\")}return r}function AEe(t){var e=/^(.)-(.)$/.exec(t),r=\"\",s,a,n,c;if(!e)return null;for(s=e[1].charCodeAt(0),a=e[2].charCodeAt(0),c=s<a?1:-1,n=s;n!==a+c;n+=c)r+=String.fromCharCode(n);return r}function Tq(t){var e=new RegExp(/(\\s*)(?:(\"|')(.*?)(?:\\2|$)|(\\S+))/g),r,s=\"\",a=[],n;for(t=t.trim();r=e.exec(t);)n=r[3]||r[4]||\"\",r[1]&&(a.push(s),s=\"\"),s+=n;return s&&a.push(s),a}function pEe(t,e){return e.trueValue.length&&Qq(t,e.trueValue,e.caseSensitive)?!0:e.falseValue.length&&Qq(t,e.falseValue,e.caseSensitive)?!1:t}function hEe(t){var e,r,s,a,n,c,f;function p(E){return fEe(E,t)}function h(E){t.display+=(/[^\\r\\n]$/.test(t.display)?`\n`:\"\")+E}for(t.limitSrc=t.limit,t.displaySrc=t.display,t.limit=\"\",t.display=JC(t.display+\"\",p);;){if(e=kq(t),r=!1,s=\"\",t.defaultInput&&!e&&(e=t.defaultInput),t.history&&((a=/^\\s*\\!(?:\\!|-1)(:p)?\\s*$/.exec(e))?(n=Dm[0]||\"\",a[1]?r=!0:e=n,h(n+`\n`),r||(t.displayOnly=!0,kq(t),t.displayOnly=!1)):e&&e!==Dm[Dm.length-1]&&(Dm=[e])),!r&&t.cd&&e)switch(c=Tq(e),c[0].toLowerCase()){case\"cd\":if(c[1])try{process.chdir(Nq(c[1],!0))}catch(E){h(E+\"\")}r=!0;break;case\"pwd\":h(process.cwd()),r=!0;break}if(!r&&t.preCheck&&(f=t.preCheck(e,t),e=f.res,f.forceNext&&(r=!0)),!r){if(!t.limitSrc.length||Qq(e,t.limitSrc,t.caseSensitive))break;t.limitMessage&&(s=JC(t.limitMessage,p))}h((s?s+`\n`:\"\")+JC(t.displaySrc+\"\",p))}return pEe(e,t)}$r._DBG_set_useExt=function(t){aEe=t};$r._DBG_set_checkOptions=function(t){xq=t};$r._DBG_set_checkMethod=function(t){sS=t};$r._DBG_clearHistory=function(){Rq=\"\",Dm=[]};$r.setDefaultOptions=function(t){return Pq=Vs(!0,t),Vs(!0)};$r.question=function(t,e){return hEe(Vs(Vs(!0,e),{display:t}))};$r.prompt=function(t){var e=Vs(!0,t);return e.display=e.prompt,hEe(e)};$r.keyIn=function(t,e){var r=Vs(Vs(!0,e),{display:t,keyIn:!0,keepWhitespace:!0});return r.limitSrc=r.limit.filter(function(s){var a=typeof s;return a===\"string\"||a===\"number\"}).map(function(s){return JC(s+\"\",AEe)}),r.limit=Fq(r.limitSrc.join(\"\")),[\"trueValue\",\"falseValue\"].forEach(function(s){r[s]=r[s].reduce(function(a,n){var c=typeof n;return c===\"string\"||c===\"number\"?a=a.concat((n+\"\").split(\"\")):a.push(n),a},[])}),r.display=JC(r.display+\"\",function(s){return fEe(s,r)}),pEe(kq(r),r)};$r.questionEMail=function(t,e){return t==null&&(t=\"Input e-mail address: \"),$r.question(t,Vs({hideEchoBack:!1,limit:/^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,limitMessage:\"Input valid e-mail address, please.\",trueValue:null,falseValue:null},e,{keepWhitespace:!1,cd:!1}))};$r.questionNewPassword=function(t,e){var r,s,a,n=Vs({hideEchoBack:!0,mask:\"*\",limitMessage:`It can include: $<charlist>\nAnd the length must be: $<length>`,trueValue:null,falseValue:null,caseSensitive:!0},e,{history:!1,cd:!1,phContent:function(P){return P===\"charlist\"?r.text:P===\"length\"?s+\"...\"+a:null}}),c,f,p,h,E,C,S;for(e=e||{},c=JC(e.charlist?e.charlist+\"\":\"$<!-~>\",AEe),(isNaN(s=parseInt(e.min,10))||typeof s!=\"number\")&&(s=12),(isNaN(a=parseInt(e.max,10))||typeof a!=\"number\")&&(a=24),h=new RegExp(\"^[\"+Fq(c)+\"]{\"+s+\",\"+a+\"}$\"),r=cEe([c],n.caseSensitive,!0),r.text=uEe(r.values,r.suppressed),f=e.confirmMessage!=null?e.confirmMessage:\"Reinput a same one to confirm it: \",p=e.unmatchMessage!=null?e.unmatchMessage:\"It differs from first one. Hit only the Enter key if you want to retry from first one.\",t==null&&(t=\"Input new password: \"),E=n.limitMessage;!S;)n.limit=h,n.limitMessage=E,C=$r.question(t,n),n.limit=[C,\"\"],n.limitMessage=p,S=$r.question(f,n);return C};function gEe(t,e,r){var s;function a(n){return s=r(n),!isNaN(s)&&typeof s==\"number\"}return $r.question(t,Vs({limitMessage:\"Input valid number, please.\"},e,{limit:a,cd:!1})),s}$r.questionInt=function(t,e){return gEe(t,e,function(r){return parseInt(r,10)})};$r.questionFloat=function(t,e){return gEe(t,e,parseFloat)};$r.questionPath=function(t,e){var r,s=\"\",a=Vs({hideEchoBack:!1,limitMessage:`$<error(\n)>Input valid path, please.$<( Min:)min>$<( Max:)max>`,history:!0,cd:!0},e,{keepWhitespace:!1,limit:function(n){var c,f,p;n=Nq(n,!0),s=\"\";function h(E){E.split(/\\/|\\\\/).reduce(function(C,S){var P=V0.resolve(C+=S+V0.sep);if(!si.existsSync(P))si.mkdirSync(P);else if(!si.statSync(P).isDirectory())throw new Error(\"Non directory already exists: \"+P);return C},\"\")}try{if(c=si.existsSync(n),r=c?si.realpathSync(n):V0.resolve(n),!e.hasOwnProperty(\"exists\")&&!c||typeof e.exists==\"boolean\"&&e.exists!==c)return s=(c?\"Already exists\":\"No such file or directory\")+\": \"+r,!1;if(!c&&e.create&&(e.isDirectory?h(r):(h(V0.dirname(r)),si.closeSync(si.openSync(r,\"w\"))),r=si.realpathSync(r)),c&&(e.min||e.max||e.isFile||e.isDirectory)){if(f=si.statSync(r),e.isFile&&!f.isFile())return s=\"Not file: \"+r,!1;if(e.isDirectory&&!f.isDirectory())return s=\"Not directory: \"+r,!1;if(e.min&&f.size<+e.min||e.max&&f.size>+e.max)return s=\"Size \"+f.size+\" is out of range: \"+r,!1}if(typeof e.validate==\"function\"&&(p=e.validate(r))!==!0)return typeof p==\"string\"&&(s=p),!1}catch(E){return s=E+\"\",!1}return!0},phContent:function(n){return n===\"error\"?s:n!==\"min\"&&n!==\"max\"?null:e.hasOwnProperty(n)?e[n]+\"\":\"\"}});return e=e||{},t==null&&(t='Input path (you can \"cd\" and \"pwd\"): '),$r.question(t,a),r};function dEe(t,e){var r={},s={};return typeof t==\"object\"?(Object.keys(t).forEach(function(a){typeof t[a]==\"function\"&&(s[e.caseSensitive?a:a.toLowerCase()]=t[a])}),r.preCheck=function(a){var n;return r.args=Tq(a),n=r.args[0]||\"\",e.caseSensitive||(n=n.toLowerCase()),r.hRes=n!==\"_\"&&s.hasOwnProperty(n)?s[n].apply(a,r.args.slice(1)):s.hasOwnProperty(\"_\")?s._.apply(a,r.args):null,{res:a,forceNext:!1}},s.hasOwnProperty(\"_\")||(r.limit=function(){var a=r.args[0]||\"\";return e.caseSensitive||(a=a.toLowerCase()),s.hasOwnProperty(a)})):r.preCheck=function(a){return r.args=Tq(a),r.hRes=typeof t==\"function\"?t.apply(a,r.args):!0,{res:a,forceNext:!1}},r}$r.promptCL=function(t,e){var r=Vs({hideEchoBack:!1,limitMessage:\"Requested command is not available.\",caseSensitive:!1,history:!0},e),s=dEe(t,r);return r.limit=s.limit,r.preCheck=s.preCheck,$r.prompt(r),s.args};$r.promptLoop=function(t,e){for(var r=Vs({hideEchoBack:!1,trueValue:null,falseValue:null,caseSensitive:!1,history:!0},e);!t($r.prompt(r)););};$r.promptCLLoop=function(t,e){var r=Vs({hideEchoBack:!1,limitMessage:\"Requested command is not available.\",caseSensitive:!1,history:!0},e),s=dEe(t,r);for(r.limit=s.limit,r.preCheck=s.preCheck;$r.prompt(r),!s.hRes;);};$r.promptSimShell=function(t){return $r.prompt(Vs({hideEchoBack:!1,history:!0},t,{prompt:function(){return bm?\"$<cwd>>\":(process.env.USER||\"\")+(process.env.HOSTNAME?\"@\"+process.env.HOSTNAME.replace(/\\..*$/,\"\"):\"\")+\":$<cwdHome>$ \"}()}))};function mEe(t,e,r){var s;return t==null&&(t=\"Are you sure? \"),(!e||e.guide!==!1)&&(t+=\"\")&&(t=t.replace(/\\s*:?\\s*$/,\"\")+\" [y/n]: \"),s=$r.keyIn(t,Vs(e,{hideEchoBack:!1,limit:r,trueValue:\"y\",falseValue:\"n\",caseSensitive:!1})),typeof s==\"boolean\"?s:\"\"}$r.keyInYN=function(t,e){return mEe(t,e)};$r.keyInYNStrict=function(t,e){return mEe(t,e,\"yn\")};$r.keyInPause=function(t,e){t==null&&(t=\"Continue...\"),(!e||e.guide!==!1)&&(t+=\"\")&&(t=t.replace(/\\s+$/,\"\")+\" (Hit any key)\"),$r.keyIn(t,Vs({limit:null},e,{hideEchoBack:!0,mask:\"\"}))};$r.keyInSelect=function(t,e,r){var s=Vs({hideEchoBack:!1},r,{trueValue:null,falseValue:null,caseSensitive:!1,phContent:function(p){return p===\"itemsCount\"?t.length+\"\":p===\"firstItem\"?(t[0]+\"\").trim():p===\"lastItem\"?(t[t.length-1]+\"\").trim():null}}),a=\"\",n={},c=49,f=`\n`;if(!Array.isArray(t)||!t.length||t.length>35)throw\"`items` must be Array (max length: 35).\";return t.forEach(function(p,h){var E=String.fromCharCode(c);a+=E,n[E]=h,f+=\"[\"+E+\"] \"+(p+\"\").trim()+`\n`,c=c===57?97:c+1}),(!r||r.cancel!==!1)&&(a+=\"0\",n[0]=-1,f+=\"[0] \"+(r&&r.cancel!=null&&typeof r.cancel!=\"boolean\"?(r.cancel+\"\").trim():\"CANCEL\")+`\n`),s.limit=a,f+=`\n`,e==null&&(e=\"Choose one from list: \"),(e+=\"\")&&((!r||r.guide!==!1)&&(e=e.replace(/\\s*:?\\s*$/,\"\")+\" [$<limit>]: \"),f+=e),n[$r.keyIn(f,s).toLowerCase()]};$r.getRawInput=function(){return aF};function oS(t,e){var r;return e.length&&(r={},r[t]=e[0]),$r.setDefaultOptions(r)[t]}$r.setPrint=function(){return oS(\"print\",arguments)};$r.setPrompt=function(){return oS(\"prompt\",arguments)};$r.setEncoding=function(){return oS(\"encoding\",arguments)};$r.setMask=function(){return oS(\"mask\",arguments)};$r.setBufferSize=function(){return oS(\"bufferSize\",arguments)}});var Oq=_((jYt,ec)=>{(function(){var t={major:0,minor:2,patch:66,status:\"beta\"};tau_file_system={files:{},open:function(w,b,y){var F=tau_file_system.files[w];if(!F){if(y===\"read\")return null;F={path:w,text:\"\",type:b,get:function(z,X){return X===this.text.length||X>this.text.length?\"end_of_file\":this.text.substring(X,X+z)},put:function(z,X){return X===\"end_of_file\"?(this.text+=z,!0):X===\"past_end_of_file\"?null:(this.text=this.text.substring(0,X)+z+this.text.substring(X+z.length),!0)},get_byte:function(z){if(z===\"end_of_stream\")return-1;var X=Math.floor(z/2);if(this.text.length<=X)return-1;var $=n(this.text[Math.floor(z/2)],0);return z%2===0?$&255:$/256>>>0},put_byte:function(z,X){var $=X===\"end_of_stream\"?this.text.length:Math.floor(X/2);if(this.text.length<$)return null;var oe=this.text.length===$?-1:n(this.text[Math.floor(X/2)],0);return X%2===0?(oe=oe/256>>>0,oe=(oe&255)<<8|z&255):(oe=oe&255,oe=(z&255)<<8|oe&255),this.text.length===$?this.text+=c(oe):this.text=this.text.substring(0,$)+c(oe)+this.text.substring($+1),!0},flush:function(){return!0},close:function(){var z=tau_file_system.files[this.path];return z?!0:null}},tau_file_system.files[w]=F}return y===\"write\"&&(F.text=\"\"),F}},tau_user_input={buffer:\"\",get:function(w,b){for(var y;tau_user_input.buffer.length<w;)y=window.prompt(),y&&(tau_user_input.buffer+=y);return y=tau_user_input.buffer.substr(0,w),tau_user_input.buffer=tau_user_input.buffer.substr(w),y}},tau_user_output={put:function(w,b){return console.log(w),!0},flush:function(){return!0}},nodejs_file_system={open:function(w,b,y){var F=Ie(\"fs\"),z=F.openSync(w,y[0]);return y===\"read\"&&!F.existsSync(w)?null:{get:function(X,$){var oe=new Buffer(X);return F.readSync(z,oe,0,X,$),oe.toString()},put:function(X,$){var oe=Buffer.from(X);if($===\"end_of_file\")F.writeSync(z,oe);else{if($===\"past_end_of_file\")return null;F.writeSync(z,oe,0,oe.length,$)}return!0},get_byte:function(X){return null},put_byte:function(X,$){return null},flush:function(){return!0},close:function(){return F.closeSync(z),!0}}}},nodejs_user_input={buffer:\"\",get:function(w,b){for(var y,F=yEe();nodejs_user_input.buffer.length<w;)nodejs_user_input.buffer+=F.question();return y=nodejs_user_input.buffer.substr(0,w),nodejs_user_input.buffer=nodejs_user_input.buffer.substr(w),y}},nodejs_user_output={put:function(w,b){return process.stdout.write(w),!0},flush:function(){return!0}};var e;Array.prototype.indexOf?e=function(w,b){return w.indexOf(b)}:e=function(w,b){for(var y=w.length,F=0;F<y;F++)if(b===w[F])return F;return-1};var r=function(w,b){if(w.length!==0){for(var y=w[0],F=w.length,z=1;z<F;z++)y=b(y,w[z]);return y}},s;Array.prototype.map?s=function(w,b){return w.map(b)}:s=function(w,b){for(var y=[],F=w.length,z=0;z<F;z++)y.push(b(w[z]));return y};var a;Array.prototype.filter?a=function(w,b){return w.filter(b)}:a=function(w,b){for(var y=[],F=w.length,z=0;z<F;z++)b(w[z])&&y.push(w[z]);return y};var n;String.prototype.codePointAt?n=function(w,b){return w.codePointAt(b)}:n=function(w,b){return w.charCodeAt(b)};var c;String.fromCodePoint?c=function(){return String.fromCodePoint.apply(null,arguments)}:c=function(){return String.fromCharCode.apply(null,arguments)};var f=0,p=1,h=/(\\\\a)|(\\\\b)|(\\\\f)|(\\\\n)|(\\\\r)|(\\\\t)|(\\\\v)|\\\\x([0-9a-fA-F]+)\\\\|\\\\([0-7]+)\\\\|(\\\\\\\\)|(\\\\')|('')|(\\\\\")|(\\\\`)|(\\\\.)|(.)/g,E={\"\\\\a\":7,\"\\\\b\":8,\"\\\\f\":12,\"\\\\n\":10,\"\\\\r\":13,\"\\\\t\":9,\"\\\\v\":11};function C(w){var b=[],y=!1;return w.replace(h,function(F,z,X,$,oe,xe,Te,lt,Ct,qt,ir,Pt,gn,Pr,Ir,Or,on){switch(!0){case Ct!==void 0:return b.push(parseInt(Ct,16)),\"\";case qt!==void 0:return b.push(parseInt(qt,8)),\"\";case ir!==void 0:case Pt!==void 0:case gn!==void 0:case Pr!==void 0:case Ir!==void 0:return b.push(n(F.substr(1),0)),\"\";case on!==void 0:return b.push(n(on,0)),\"\";case Or!==void 0:y=!0;default:return b.push(E[F]),\"\"}}),y?null:b}function S(w,b){var y=\"\";if(w.length<2)return w;try{w=w.replace(/\\\\([0-7]+)\\\\/g,function($,oe){return c(parseInt(oe,8))}),w=w.replace(/\\\\x([0-9a-fA-F]+)\\\\/g,function($,oe){return c(parseInt(oe,16))})}catch{return null}for(var F=0;F<w.length;F++){var z=w.charAt(F),X=w.charAt(F+1);if(z===b&&X===b)F++,y+=b;else if(z===\"\\\\\")if([\"a\",\"b\",\"f\",\"n\",\"r\",\"t\",\"v\",\"'\",'\"',\"\\\\\",\"a\",\"\\b\",\"\\f\",`\n`,\"\\r\",\"\t\",\"\\v\"].indexOf(X)!==-1)switch(F+=1,X){case\"a\":y+=\"a\";break;case\"b\":y+=\"\\b\";break;case\"f\":y+=\"\\f\";break;case\"n\":y+=`\n`;break;case\"r\":y+=\"\\r\";break;case\"t\":y+=\"\t\";break;case\"v\":y+=\"\\v\";break;case\"'\":y+=\"'\";break;case'\"':y+='\"';break;case\"\\\\\":y+=\"\\\\\";break}else return null;else y+=z}return y}function P(w){for(var b=\"\",y=0;y<w.length;y++)switch(w.charAt(y)){case\"'\":b+=\"\\\\'\";break;case\"\\\\\":b+=\"\\\\\\\\\";break;case\"\\b\":b+=\"\\\\b\";break;case\"\\f\":b+=\"\\\\f\";break;case`\n`:b+=\"\\\\n\";break;case\"\\r\":b+=\"\\\\r\";break;case\"\t\":b+=\"\\\\t\";break;case\"\\v\":b+=\"\\\\v\";break;default:b+=w.charAt(y);break}return b}function I(w){var b=w.substr(2);switch(w.substr(0,2).toLowerCase()){case\"0x\":return parseInt(b,16);case\"0b\":return parseInt(b,2);case\"0o\":return parseInt(b,8);case\"0'\":return C(b)[0];default:return parseFloat(w)}}var R={whitespace:/^\\s*(?:(?:%.*)|(?:\\/\\*(?:\\n|\\r|.)*?\\*\\/)|(?:\\s+))\\s*/,variable:/^(?:[A-Z_][a-zA-Z0-9_]*)/,atom:/^(\\!|,|;|[a-z][0-9a-zA-Z_]*|[#\\$\\&\\*\\+\\-\\.\\/\\:\\<\\=\\>\\?\\@\\^\\~\\\\]+|'(?:[^']*?(?:\\\\(?:x?\\d+)?\\\\)*(?:'')*(?:\\\\')*)*')/,number:/^(?:0o[0-7]+|0x[0-9a-fA-F]+|0b[01]+|0'(?:''|\\\\[abfnrtv\\\\'\"`]|\\\\x?\\d+\\\\|[^\\\\])|\\d+(?:\\.\\d+(?:[eE][+-]?\\d+)?)?)/,string:/^(?:\"([^\"]|\"\"|\\\\\")*\"|`([^`]|``|\\\\`)*`)/,l_brace:/^(?:\\[)/,r_brace:/^(?:\\])/,l_bracket:/^(?:\\{)/,r_bracket:/^(?:\\})/,bar:/^(?:\\|)/,l_paren:/^(?:\\()/,r_paren:/^(?:\\))/};function N(w,b){return w.get_flag(\"char_conversion\").id===\"on\"?b.replace(/./g,function(y){return w.get_char_conversion(y)}):b}function U(w){this.thread=w,this.text=\"\",this.tokens=[]}U.prototype.set_last_tokens=function(w){return this.tokens=w},U.prototype.new_text=function(w){this.text=w,this.tokens=[]},U.prototype.get_tokens=function(w){var b,y=0,F=0,z=0,X=[],$=!1;if(w){var oe=this.tokens[w-1];y=oe.len,b=N(this.thread,this.text.substr(oe.len)),F=oe.line,z=oe.start}else b=this.text;if(/^\\s*$/.test(b))return null;for(;b!==\"\";){var xe=[],Te=!1;if(/^\\n/.exec(b)!==null){F++,z=0,y++,b=b.replace(/\\n/,\"\"),$=!0;continue}for(var lt in R)if(R.hasOwnProperty(lt)){var Ct=R[lt].exec(b);Ct&&xe.push({value:Ct[0],name:lt,matches:Ct})}if(!xe.length)return this.set_last_tokens([{value:b,matches:[],name:\"lexical\",line:F,start:z}]);var oe=r(xe,function(Pr,Ir){return Pr.value.length>=Ir.value.length?Pr:Ir});switch(oe.start=z,oe.line=F,b=b.replace(oe.value,\"\"),z+=oe.value.length,y+=oe.value.length,oe.name){case\"atom\":oe.raw=oe.value,oe.value.charAt(0)===\"'\"&&(oe.value=S(oe.value.substr(1,oe.value.length-2),\"'\"),oe.value===null&&(oe.name=\"lexical\",oe.value=\"unknown escape sequence\"));break;case\"number\":oe.float=oe.value.substring(0,2)!==\"0x\"&&oe.value.match(/[.eE]/)!==null&&oe.value!==\"0'.\",oe.value=I(oe.value),oe.blank=Te;break;case\"string\":var qt=oe.value.charAt(0);oe.value=S(oe.value.substr(1,oe.value.length-2),qt),oe.value===null&&(oe.name=\"lexical\",oe.value=\"unknown escape sequence\");break;case\"whitespace\":var ir=X[X.length-1];ir&&(ir.space=!0),Te=!0;continue;case\"r_bracket\":X.length>0&&X[X.length-1].name===\"l_bracket\"&&(oe=X.pop(),oe.name=\"atom\",oe.value=\"{}\",oe.raw=\"{}\",oe.space=!1);break;case\"r_brace\":X.length>0&&X[X.length-1].name===\"l_brace\"&&(oe=X.pop(),oe.name=\"atom\",oe.value=\"[]\",oe.raw=\"[]\",oe.space=!1);break}oe.len=y,X.push(oe),Te=!1}var Pt=this.set_last_tokens(X);return Pt.length===0?null:Pt};function W(w,b,y,F,z){if(!b[y])return{type:f,value:x.error.syntax(b[y-1],\"expression expected\",!0)};var X;if(F===\"0\"){var $=b[y];switch($.name){case\"number\":return{type:p,len:y+1,value:new x.type.Num($.value,$.float)};case\"variable\":return{type:p,len:y+1,value:new x.type.Var($.value)};case\"string\":var oe;switch(w.get_flag(\"double_quotes\").id){case\"atom\":oe=new j($.value,[]);break;case\"codes\":oe=new j(\"[]\",[]);for(var xe=$.value.length-1;xe>=0;xe--)oe=new j(\".\",[new x.type.Num(n($.value,xe),!1),oe]);break;case\"chars\":oe=new j(\"[]\",[]);for(var xe=$.value.length-1;xe>=0;xe--)oe=new j(\".\",[new x.type.Term($.value.charAt(xe),[]),oe]);break}return{type:p,len:y+1,value:oe};case\"l_paren\":var Pt=W(w,b,y+1,w.__get_max_priority(),!0);return Pt.type!==p?Pt:b[Pt.len]&&b[Pt.len].name===\"r_paren\"?(Pt.len++,Pt):{type:f,derived:!0,value:x.error.syntax(b[Pt.len]?b[Pt.len]:b[Pt.len-1],\") or operator expected\",!b[Pt.len])};case\"l_bracket\":var Pt=W(w,b,y+1,w.__get_max_priority(),!0);return Pt.type!==p?Pt:b[Pt.len]&&b[Pt.len].name===\"r_bracket\"?(Pt.len++,Pt.value=new j(\"{}\",[Pt.value]),Pt):{type:f,derived:!0,value:x.error.syntax(b[Pt.len]?b[Pt.len]:b[Pt.len-1],\"} or operator expected\",!b[Pt.len])}}var Te=ee(w,b,y,z);return Te.type===p||Te.derived||(Te=ie(w,b,y),Te.type===p||Te.derived)?Te:{type:f,derived:!1,value:x.error.syntax(b[y],\"unexpected token\")}}var lt=w.__get_max_priority(),Ct=w.__get_next_priority(F),qt=y;if(b[y].name===\"atom\"&&b[y+1]&&(b[y].space||b[y+1].name!==\"l_paren\")){var $=b[y++],ir=w.__lookup_operator_classes(F,$.value);if(ir&&ir.indexOf(\"fy\")>-1){var Pt=W(w,b,y,F,z);if(Pt.type!==f)return $.value===\"-\"&&!$.space&&x.type.is_number(Pt.value)?{value:new x.type.Num(-Pt.value.value,Pt.value.is_float),len:Pt.len,type:p}:{value:new x.type.Term($.value,[Pt.value]),len:Pt.len,type:p};X=Pt}else if(ir&&ir.indexOf(\"fx\")>-1){var Pt=W(w,b,y,Ct,z);if(Pt.type!==f)return{value:new x.type.Term($.value,[Pt.value]),len:Pt.len,type:p};X=Pt}}y=qt;var Pt=W(w,b,y,Ct,z);if(Pt.type===p){y=Pt.len;var $=b[y];if(b[y]&&(b[y].name===\"atom\"&&w.__lookup_operator_classes(F,$.value)||b[y].name===\"bar\"&&w.__lookup_operator_classes(F,\"|\"))){var gn=Ct,Pr=F,ir=w.__lookup_operator_classes(F,$.value);if(ir.indexOf(\"xf\")>-1)return{value:new x.type.Term($.value,[Pt.value]),len:++Pt.len,type:p};if(ir.indexOf(\"xfx\")>-1){var Ir=W(w,b,y+1,gn,z);return Ir.type===p?{value:new x.type.Term($.value,[Pt.value,Ir.value]),len:Ir.len,type:p}:(Ir.derived=!0,Ir)}else if(ir.indexOf(\"xfy\")>-1){var Ir=W(w,b,y+1,Pr,z);return Ir.type===p?{value:new x.type.Term($.value,[Pt.value,Ir.value]),len:Ir.len,type:p}:(Ir.derived=!0,Ir)}else if(Pt.type!==f)for(;;){y=Pt.len;var $=b[y];if($&&$.name===\"atom\"&&w.__lookup_operator_classes(F,$.value)){var ir=w.__lookup_operator_classes(F,$.value);if(ir.indexOf(\"yf\")>-1)Pt={value:new x.type.Term($.value,[Pt.value]),len:++y,type:p};else if(ir.indexOf(\"yfx\")>-1){var Ir=W(w,b,++y,gn,z);if(Ir.type===f)return Ir.derived=!0,Ir;y=Ir.len,Pt={value:new x.type.Term($.value,[Pt.value,Ir.value]),len:y,type:p}}else break}else break}}else X={type:f,value:x.error.syntax(b[Pt.len-1],\"operator expected\")};return Pt}return Pt}function ee(w,b,y,F){if(!b[y]||b[y].name===\"atom\"&&b[y].raw===\".\"&&!F&&(b[y].space||!b[y+1]||b[y+1].name!==\"l_paren\"))return{type:f,derived:!1,value:x.error.syntax(b[y-1],\"unfounded token\")};var z=b[y],X=[];if(b[y].name===\"atom\"&&b[y].raw!==\",\"){if(y++,b[y-1].space)return{type:p,len:y,value:new x.type.Term(z.value,X)};if(b[y]&&b[y].name===\"l_paren\"){if(b[y+1]&&b[y+1].name===\"r_paren\")return{type:f,derived:!0,value:x.error.syntax(b[y+1],\"argument expected\")};var $=W(w,b,++y,\"999\",!0);if($.type===f)return $.derived?$:{type:f,derived:!0,value:x.error.syntax(b[y]?b[y]:b[y-1],\"argument expected\",!b[y])};for(X.push($.value),y=$.len;b[y]&&b[y].name===\"atom\"&&b[y].value===\",\";){if($=W(w,b,y+1,\"999\",!0),$.type===f)return $.derived?$:{type:f,derived:!0,value:x.error.syntax(b[y+1]?b[y+1]:b[y],\"argument expected\",!b[y+1])};X.push($.value),y=$.len}if(b[y]&&b[y].name===\"r_paren\")y++;else return{type:f,derived:!0,value:x.error.syntax(b[y]?b[y]:b[y-1],\", or ) expected\",!b[y])}}return{type:p,len:y,value:new x.type.Term(z.value,X)}}return{type:f,derived:!1,value:x.error.syntax(b[y],\"term expected\")}}function ie(w,b,y){if(!b[y])return{type:f,derived:!1,value:x.error.syntax(b[y-1],\"[ expected\")};if(b[y]&&b[y].name===\"l_brace\"){var F=W(w,b,++y,\"999\",!0),z=[F.value],X=void 0;if(F.type===f)return b[y]&&b[y].name===\"r_brace\"?{type:p,len:y+1,value:new x.type.Term(\"[]\",[])}:{type:f,derived:!0,value:x.error.syntax(b[y],\"] expected\")};for(y=F.len;b[y]&&b[y].name===\"atom\"&&b[y].value===\",\";){if(F=W(w,b,y+1,\"999\",!0),F.type===f)return F.derived?F:{type:f,derived:!0,value:x.error.syntax(b[y+1]?b[y+1]:b[y],\"argument expected\",!b[y+1])};z.push(F.value),y=F.len}var $=!1;if(b[y]&&b[y].name===\"bar\"){if($=!0,F=W(w,b,y+1,\"999\",!0),F.type===f)return F.derived?F:{type:f,derived:!0,value:x.error.syntax(b[y+1]?b[y+1]:b[y],\"argument expected\",!b[y+1])};X=F.value,y=F.len}return b[y]&&b[y].name===\"r_brace\"?{type:p,len:y+1,value:g(z,X)}:{type:f,derived:!0,value:x.error.syntax(b[y]?b[y]:b[y-1],$?\"] expected\":\", or | or ] expected\",!b[y])}}return{type:f,derived:!1,value:x.error.syntax(b[y],\"list expected\")}}function ue(w,b,y){var F=b[y].line,z=W(w,b,y,w.__get_max_priority(),!1),X=null,$;if(z.type!==f)if(y=z.len,b[y]&&b[y].name===\"atom\"&&b[y].raw===\".\")if(y++,x.type.is_term(z.value)){if(z.value.indicator===\":-/2\"?(X=new x.type.Rule(z.value.args[0],Ce(z.value.args[1])),$={value:X,len:y,type:p}):z.value.indicator===\"-->/2\"?(X=pe(new x.type.Rule(z.value.args[0],z.value.args[1]),w),X.body=Ce(X.body),$={value:X,len:y,type:x.type.is_rule(X)?p:f}):(X=new x.type.Rule(z.value,null),$={value:X,len:y,type:p}),X){var oe=X.singleton_variables();oe.length>0&&w.throw_warning(x.warning.singleton(oe,X.head.indicator,F))}return $}else return{type:f,value:x.error.syntax(b[y],\"callable expected\")};else return{type:f,value:x.error.syntax(b[y]?b[y]:b[y-1],\". or operator expected\")};return z}function le(w,b,y){y=y||{},y.from=y.from?y.from:\"$tau-js\",y.reconsult=y.reconsult!==void 0?y.reconsult:!0;var F=new U(w),z={},X;F.new_text(b);var $=0,oe=F.get_tokens($);do{if(oe===null||!oe[$])break;var xe=ue(w,oe,$);if(xe.type===f)return new j(\"throw\",[xe.value]);if(xe.value.body===null&&xe.value.head.indicator===\"?-/1\"){var Te=new it(w.session);Te.add_goal(xe.value.head.args[0]),Te.answer(function(Ct){x.type.is_error(Ct)?w.throw_warning(Ct.args[0]):(Ct===!1||Ct===null)&&w.throw_warning(x.warning.failed_goal(xe.value.head.args[0],xe.len))}),$=xe.len;var lt=!0}else if(xe.value.body===null&&xe.value.head.indicator===\":-/1\"){var lt=w.run_directive(xe.value.head.args[0]);$=xe.len,xe.value.head.args[0].indicator===\"char_conversion/2\"&&(oe=F.get_tokens($),$=0)}else{X=xe.value.head.indicator,y.reconsult!==!1&&z[X]!==!0&&!w.is_multifile_predicate(X)&&(w.session.rules[X]=a(w.session.rules[X]||[],function(qt){return qt.dynamic}),z[X]=!0);var lt=w.add_rule(xe.value,y);$=xe.len}if(!lt)return lt}while(!0);return!0}function me(w,b){var y=new U(w);y.new_text(b);var F=0;do{var z=y.get_tokens(F);if(z===null)break;var X=W(w,z,0,w.__get_max_priority(),!1);if(X.type!==f){var $=X.len,oe=$;if(z[$]&&z[$].name===\"atom\"&&z[$].raw===\".\")w.add_goal(Ce(X.value));else{var xe=z[$];return new j(\"throw\",[x.error.syntax(xe||z[$-1],\". or operator expected\",!xe)])}F=X.len+1}else return new j(\"throw\",[X.value])}while(!0);return!0}function pe(w,b){w=w.rename(b);var y=b.next_free_variable(),F=Be(w.body,y,b);return F.error?F.value:(w.body=F.value,w.head.args=w.head.args.concat([y,F.variable]),w.head=new j(w.head.id,w.head.args),w)}function Be(w,b,y){var F;if(x.type.is_term(w)&&w.indicator===\"!/0\")return{value:w,variable:b,error:!1};if(x.type.is_term(w)&&w.indicator===\",/2\"){var z=Be(w.args[0],b,y);if(z.error)return z;var X=Be(w.args[1],z.variable,y);return X.error?X:{value:new j(\",\",[z.value,X.value]),variable:X.variable,error:!1}}else{if(x.type.is_term(w)&&w.indicator===\"{}/1\")return{value:w.args[0],variable:b,error:!1};if(x.type.is_empty_list(w))return{value:new j(\"true\",[]),variable:b,error:!1};if(x.type.is_list(w)){F=y.next_free_variable();for(var $=w,oe;$.indicator===\"./2\";)oe=$,$=$.args[1];return x.type.is_variable($)?{value:x.error.instantiation(\"DCG\"),variable:b,error:!0}:x.type.is_empty_list($)?(oe.args[1]=F,{value:new j(\"=\",[b,w]),variable:F,error:!1}):{value:x.error.type(\"list\",w,\"DCG\"),variable:b,error:!0}}else return x.type.is_callable(w)?(F=y.next_free_variable(),w.args=w.args.concat([b,F]),w=new j(w.id,w.args),{value:w,variable:F,error:!1}):{value:x.error.type(\"callable\",w,\"DCG\"),variable:b,error:!0}}}function Ce(w){return x.type.is_variable(w)?new j(\"call\",[w]):x.type.is_term(w)&&[\",/2\",\";/2\",\"->/2\"].indexOf(w.indicator)!==-1?new j(w.id,[Ce(w.args[0]),Ce(w.args[1])]):w}function g(w,b){for(var y=b||new x.type.Term(\"[]\",[]),F=w.length-1;F>=0;F--)y=new x.type.Term(\".\",[w[F],y]);return y}function we(w,b){for(var y=w.length-1;y>=0;y--)w[y]===b&&w.splice(y,1)}function ye(w){for(var b={},y=[],F=0;F<w.length;F++)w[F]in b||(y.push(w[F]),b[w[F]]=!0);return y}function Ae(w,b,y,F){if(w.session.rules[y]!==null){for(var z=0;z<w.session.rules[y].length;z++)if(w.session.rules[y][z]===F){w.session.rules[y].splice(z,1),w.success(b);break}}}function se(w){return function(b,y,F){var z=F.args[0],X=F.args.slice(1,w);if(x.type.is_variable(z))b.throw_error(x.error.instantiation(b.level));else if(!x.type.is_callable(z))b.throw_error(x.error.type(\"callable\",z,b.level));else{var $=new j(z.id,z.args.concat(X));b.prepend([new Pe(y.goal.replace($),y.substitution,y)])}}}function Z(w){for(var b=w.length-1;b>=0;b--)if(w.charAt(b)===\"/\")return new j(\"/\",[new j(w.substring(0,b)),new Re(parseInt(w.substring(b+1)),!1)])}function De(w){this.id=w}function Re(w,b){this.is_float=b!==void 0?b:parseInt(w)!==w,this.value=this.is_float?w:parseInt(w)}var mt=0;function j(w,b,y){this.ref=y||++mt,this.id=w,this.args=b||[],this.indicator=w+\"/\"+this.args.length}var rt=0;function Fe(w,b,y,F,z,X){this.id=rt++,this.stream=w,this.mode=b,this.alias=y,this.type=F!==void 0?F:\"text\",this.reposition=z!==void 0?z:!0,this.eof_action=X!==void 0?X:\"eof_code\",this.position=this.mode===\"append\"?\"end_of_stream\":0,this.output=this.mode===\"write\"||this.mode===\"append\",this.input=this.mode===\"read\"}function Ne(w){w=w||{},this.links=w}function Pe(w,b,y){b=b||new Ne,y=y||null,this.goal=w,this.substitution=b,this.parent=y}function Ve(w,b,y){this.head=w,this.body=b,this.dynamic=y||!1}function ke(w){w=w===void 0||w<=0?1e3:w,this.rules={},this.src_predicates={},this.rename=0,this.modules=[],this.thread=new it(this),this.total_threads=1,this.renamed_variables={},this.public_predicates={},this.multifile_predicates={},this.limit=w,this.streams={user_input:new Fe(typeof ec<\"u\"&&ec.exports?nodejs_user_input:tau_user_input,\"read\",\"user_input\",\"text\",!1,\"reset\"),user_output:new Fe(typeof ec<\"u\"&&ec.exports?nodejs_user_output:tau_user_output,\"write\",\"user_output\",\"text\",!1,\"eof_code\")},this.file_system=typeof ec<\"u\"&&ec.exports?nodejs_file_system:tau_file_system,this.standard_input=this.streams.user_input,this.standard_output=this.streams.user_output,this.current_input=this.streams.user_input,this.current_output=this.streams.user_output,this.format_success=function(b){return b.substitution},this.format_error=function(b){return b.goal},this.flag={bounded:x.flag.bounded.value,max_integer:x.flag.max_integer.value,min_integer:x.flag.min_integer.value,integer_rounding_function:x.flag.integer_rounding_function.value,char_conversion:x.flag.char_conversion.value,debug:x.flag.debug.value,max_arity:x.flag.max_arity.value,unknown:x.flag.unknown.value,double_quotes:x.flag.double_quotes.value,occurs_check:x.flag.occurs_check.value,dialect:x.flag.dialect.value,version_data:x.flag.version_data.value,nodejs:x.flag.nodejs.value},this.__loaded_modules=[],this.__char_conversion={},this.__operators={1200:{\":-\":[\"fx\",\"xfx\"],\"-->\":[\"xfx\"],\"?-\":[\"fx\"]},1100:{\";\":[\"xfy\"]},1050:{\"->\":[\"xfy\"]},1e3:{\",\":[\"xfy\"]},900:{\"\\\\+\":[\"fy\"]},700:{\"=\":[\"xfx\"],\"\\\\=\":[\"xfx\"],\"==\":[\"xfx\"],\"\\\\==\":[\"xfx\"],\"@<\":[\"xfx\"],\"@=<\":[\"xfx\"],\"@>\":[\"xfx\"],\"@>=\":[\"xfx\"],\"=..\":[\"xfx\"],is:[\"xfx\"],\"=:=\":[\"xfx\"],\"=\\\\=\":[\"xfx\"],\"<\":[\"xfx\"],\"=<\":[\"xfx\"],\">\":[\"xfx\"],\">=\":[\"xfx\"]},600:{\":\":[\"xfy\"]},500:{\"+\":[\"yfx\"],\"-\":[\"yfx\"],\"/\\\\\":[\"yfx\"],\"\\\\/\":[\"yfx\"]},400:{\"*\":[\"yfx\"],\"/\":[\"yfx\"],\"//\":[\"yfx\"],rem:[\"yfx\"],mod:[\"yfx\"],\"<<\":[\"yfx\"],\">>\":[\"yfx\"]},200:{\"**\":[\"xfx\"],\"^\":[\"xfy\"],\"-\":[\"fy\"],\"+\":[\"fy\"],\"\\\\\":[\"fy\"]}}}function it(w){this.epoch=Date.now(),this.session=w,this.session.total_threads++,this.total_steps=0,this.cpu_time=0,this.cpu_time_last=0,this.points=[],this.debugger=!1,this.debugger_states=[],this.level=\"top_level/0\",this.__calls=[],this.current_limit=this.session.limit,this.warnings=[]}function Ue(w,b,y){this.id=w,this.rules=b,this.exports=y,x.module[w]=this}Ue.prototype.exports_predicate=function(w){return this.exports.indexOf(w)!==-1},De.prototype.unify=function(w,b){if(b&&e(w.variables(),this.id)!==-1&&!x.type.is_variable(w))return null;var y={};return y[this.id]=w,new Ne(y)},Re.prototype.unify=function(w,b){return x.type.is_number(w)&&this.value===w.value&&this.is_float===w.is_float?new Ne:null},j.prototype.unify=function(w,b){if(x.type.is_term(w)&&this.indicator===w.indicator){for(var y=new Ne,F=0;F<this.args.length;F++){var z=x.unify(this.args[F].apply(y),w.args[F].apply(y),b);if(z===null)return null;for(var X in z.links)y.links[X]=z.links[X];y=y.apply(z)}return y}return null},Fe.prototype.unify=function(w,b){return x.type.is_stream(w)&&this.id===w.id?new Ne:null},De.prototype.toString=function(w){return this.id},Re.prototype.toString=function(w){return this.is_float&&e(this.value.toString(),\".\")===-1?this.value+\".0\":this.value.toString()},j.prototype.toString=function(w,b,y){if(w=w||{},w.quoted=w.quoted===void 0?!0:w.quoted,w.ignore_ops=w.ignore_ops===void 0?!1:w.ignore_ops,w.numbervars=w.numbervars===void 0?!1:w.numbervars,b=b===void 0?1200:b,y=y===void 0?\"\":y,w.numbervars&&this.indicator===\"$VAR/1\"&&x.type.is_integer(this.args[0])&&this.args[0].value>=0){var F=this.args[0].value,z=Math.floor(F/26),X=F%26;return\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"[X]+(z!==0?z:\"\")}switch(this.indicator){case\"[]/0\":case\"{}/0\":case\"!/0\":return this.id;case\"{}/1\":return\"{\"+this.args[0].toString(w)+\"}\";case\"./2\":for(var $=\"[\"+this.args[0].toString(w),oe=this.args[1];oe.indicator===\"./2\";)$+=\", \"+oe.args[0].toString(w),oe=oe.args[1];return oe.indicator!==\"[]/0\"&&($+=\"|\"+oe.toString(w)),$+=\"]\",$;case\",/2\":return\"(\"+this.args[0].toString(w)+\", \"+this.args[1].toString(w)+\")\";default:var xe=this.id,Te=w.session?w.session.lookup_operator(this.id,this.args.length):null;if(w.session===void 0||w.ignore_ops||Te===null)return w.quoted&&!/^(!|,|;|[a-z][0-9a-zA-Z_]*)$/.test(xe)&&xe!==\"{}\"&&xe!==\"[]\"&&(xe=\"'\"+P(xe)+\"'\"),xe+(this.args.length?\"(\"+s(this.args,function(ir){return ir.toString(w)}).join(\", \")+\")\":\"\");var lt=Te.priority>b.priority||Te.priority===b.priority&&(Te.class===\"xfy\"&&this.indicator!==b.indicator||Te.class===\"yfx\"&&this.indicator!==b.indicator||this.indicator===b.indicator&&Te.class===\"yfx\"&&y===\"right\"||this.indicator===b.indicator&&Te.class===\"xfy\"&&y===\"left\");Te.indicator=this.indicator;var Ct=lt?\"(\":\"\",qt=lt?\")\":\"\";return this.args.length===0?\"(\"+this.id+\")\":[\"fy\",\"fx\"].indexOf(Te.class)!==-1?Ct+xe+\" \"+this.args[0].toString(w,Te)+qt:[\"yf\",\"xf\"].indexOf(Te.class)!==-1?Ct+this.args[0].toString(w,Te)+\" \"+xe+qt:Ct+this.args[0].toString(w,Te,\"left\")+\" \"+this.id+\" \"+this.args[1].toString(w,Te,\"right\")+qt}},Fe.prototype.toString=function(w){return\"<stream>(\"+this.id+\")\"},Ne.prototype.toString=function(w){var b=\"{\";for(var y in this.links)this.links.hasOwnProperty(y)&&(b!==\"{\"&&(b+=\", \"),b+=y+\"/\"+this.links[y].toString(w));return b+=\"}\",b},Pe.prototype.toString=function(w){return this.goal===null?\"<\"+this.substitution.toString(w)+\">\":\"<\"+this.goal.toString(w)+\", \"+this.substitution.toString(w)+\">\"},Ve.prototype.toString=function(w){return this.body?this.head.toString(w)+\" :- \"+this.body.toString(w)+\".\":this.head.toString(w)+\".\"},ke.prototype.toString=function(w){for(var b=\"\",y=0;y<this.modules.length;y++)b+=\":- use_module(library(\"+this.modules[y]+`)).\n`;b+=`\n`;for(key in this.rules)for(y=0;y<this.rules[key].length;y++)b+=this.rules[key][y].toString(w),b+=`\n`;return b},De.prototype.clone=function(){return new De(this.id)},Re.prototype.clone=function(){return new Re(this.value,this.is_float)},j.prototype.clone=function(){return new j(this.id,s(this.args,function(w){return w.clone()}))},Fe.prototype.clone=function(){return new Stram(this.stream,this.mode,this.alias,this.type,this.reposition,this.eof_action)},Ne.prototype.clone=function(){var w={};for(var b in this.links)this.links.hasOwnProperty(b)&&(w[b]=this.links[b].clone());return new Ne(w)},Pe.prototype.clone=function(){return new Pe(this.goal.clone(),this.substitution.clone(),this.parent)},Ve.prototype.clone=function(){return new Ve(this.head.clone(),this.body!==null?this.body.clone():null)},De.prototype.equals=function(w){return x.type.is_variable(w)&&this.id===w.id},Re.prototype.equals=function(w){return x.type.is_number(w)&&this.value===w.value&&this.is_float===w.is_float},j.prototype.equals=function(w){if(!x.type.is_term(w)||this.indicator!==w.indicator)return!1;for(var b=0;b<this.args.length;b++)if(!this.args[b].equals(w.args[b]))return!1;return!0},Fe.prototype.equals=function(w){return x.type.is_stream(w)&&this.id===w.id},Ne.prototype.equals=function(w){var b;if(!x.type.is_substitution(w))return!1;for(b in this.links)if(this.links.hasOwnProperty(b)&&(!w.links[b]||!this.links[b].equals(w.links[b])))return!1;for(b in w.links)if(w.links.hasOwnProperty(b)&&!this.links[b])return!1;return!0},Pe.prototype.equals=function(w){return x.type.is_state(w)&&this.goal.equals(w.goal)&&this.substitution.equals(w.substitution)&&this.parent===w.parent},Ve.prototype.equals=function(w){return x.type.is_rule(w)&&this.head.equals(w.head)&&(this.body===null&&w.body===null||this.body!==null&&this.body.equals(w.body))},De.prototype.rename=function(w){return w.get_free_variable(this)},Re.prototype.rename=function(w){return this},j.prototype.rename=function(w){return new j(this.id,s(this.args,function(b){return b.rename(w)}))},Fe.prototype.rename=function(w){return this},Ve.prototype.rename=function(w){return new Ve(this.head.rename(w),this.body!==null?this.body.rename(w):null)},De.prototype.variables=function(){return[this.id]},Re.prototype.variables=function(){return[]},j.prototype.variables=function(){return[].concat.apply([],s(this.args,function(w){return w.variables()}))},Fe.prototype.variables=function(){return[]},Ve.prototype.variables=function(){return this.body===null?this.head.variables():this.head.variables().concat(this.body.variables())},De.prototype.apply=function(w){return w.lookup(this.id)?w.lookup(this.id):this},Re.prototype.apply=function(w){return this},j.prototype.apply=function(w){if(this.indicator===\"./2\"){for(var b=[],y=this;y.indicator===\"./2\";)b.push(y.args[0].apply(w)),y=y.args[1];for(var F=y.apply(w),z=b.length-1;z>=0;z--)F=new j(\".\",[b[z],F]);return F}return new j(this.id,s(this.args,function(X){return X.apply(w)}),this.ref)},Fe.prototype.apply=function(w){return this},Ve.prototype.apply=function(w){return new Ve(this.head.apply(w),this.body!==null?this.body.apply(w):null)},Ne.prototype.apply=function(w){var b,y={};for(b in this.links)this.links.hasOwnProperty(b)&&(y[b]=this.links[b].apply(w));return new Ne(y)},j.prototype.select=function(){for(var w=this;w.indicator===\",/2\";)w=w.args[0];return w},j.prototype.replace=function(w){return this.indicator===\",/2\"?this.args[0].indicator===\",/2\"?new j(\",\",[this.args[0].replace(w),this.args[1]]):w===null?this.args[1]:new j(\",\",[w,this.args[1]]):w},j.prototype.search=function(w){if(x.type.is_term(w)&&w.ref!==void 0&&this.ref===w.ref)return!0;for(var b=0;b<this.args.length;b++)if(x.type.is_term(this.args[b])&&this.args[b].search(w))return!0;return!1},ke.prototype.get_current_input=function(){return this.current_input},it.prototype.get_current_input=function(){return this.session.get_current_input()},ke.prototype.get_current_output=function(){return this.current_output},it.prototype.get_current_output=function(){return this.session.get_current_output()},ke.prototype.set_current_input=function(w){this.current_input=w},it.prototype.set_current_input=function(w){return this.session.set_current_input(w)},ke.prototype.set_current_output=function(w){this.current_input=w},it.prototype.set_current_output=function(w){return this.session.set_current_output(w)},ke.prototype.get_stream_by_alias=function(w){return this.streams[w]},it.prototype.get_stream_by_alias=function(w){return this.session.get_stream_by_alias(w)},ke.prototype.file_system_open=function(w,b,y){return this.file_system.open(w,b,y)},it.prototype.file_system_open=function(w,b,y){return this.session.file_system_open(w,b,y)},ke.prototype.get_char_conversion=function(w){return this.__char_conversion[w]||w},it.prototype.get_char_conversion=function(w){return this.session.get_char_conversion(w)},ke.prototype.parse=function(w){return this.thread.parse(w)},it.prototype.parse=function(w){var b=new U(this);b.new_text(w);var y=b.get_tokens();if(y===null)return!1;var F=W(this,y,0,this.__get_max_priority(),!1);return F.len!==y.length?!1:{value:F.value,expr:F,tokens:y}},ke.prototype.get_flag=function(w){return this.flag[w]},it.prototype.get_flag=function(w){return this.session.get_flag(w)},ke.prototype.add_rule=function(w,b){return b=b||{},b.from=b.from?b.from:\"$tau-js\",this.src_predicates[w.head.indicator]=b.from,this.rules[w.head.indicator]||(this.rules[w.head.indicator]=[]),this.rules[w.head.indicator].push(w),this.public_predicates.hasOwnProperty(w.head.indicator)||(this.public_predicates[w.head.indicator]=!1),!0},it.prototype.add_rule=function(w,b){return this.session.add_rule(w,b)},ke.prototype.run_directive=function(w){this.thread.run_directive(w)},it.prototype.run_directive=function(w){return x.type.is_directive(w)?(x.directive[w.indicator](this,w),!0):!1},ke.prototype.__get_max_priority=function(){return\"1200\"},it.prototype.__get_max_priority=function(){return this.session.__get_max_priority()},ke.prototype.__get_next_priority=function(w){var b=0;w=parseInt(w);for(var y in this.__operators)if(this.__operators.hasOwnProperty(y)){var F=parseInt(y);F>b&&F<w&&(b=F)}return b.toString()},it.prototype.__get_next_priority=function(w){return this.session.__get_next_priority(w)},ke.prototype.__lookup_operator_classes=function(w,b){return this.__operators.hasOwnProperty(w)&&this.__operators[w][b]instanceof Array&&this.__operators[w][b]||!1},it.prototype.__lookup_operator_classes=function(w,b){return this.session.__lookup_operator_classes(w,b)},ke.prototype.lookup_operator=function(w,b){for(var y in this.__operators)if(this.__operators[y][w]){for(var F=0;F<this.__operators[y][w].length;F++)if(b===0||this.__operators[y][w][F].length===b+1)return{priority:y,class:this.__operators[y][w][F]}}return null},it.prototype.lookup_operator=function(w,b){return this.session.lookup_operator(w,b)},ke.prototype.throw_warning=function(w){this.thread.throw_warning(w)},it.prototype.throw_warning=function(w){this.warnings.push(w)},ke.prototype.get_warnings=function(){return this.thread.get_warnings()},it.prototype.get_warnings=function(){return this.warnings},ke.prototype.add_goal=function(w,b){this.thread.add_goal(w,b)},it.prototype.add_goal=function(w,b,y){y=y||null,b===!0&&(this.points=[]);for(var F=w.variables(),z={},X=0;X<F.length;X++)z[F[X]]=new De(F[X]);this.points.push(new Pe(w,new Ne(z),y))},ke.prototype.consult=function(w,b){return this.thread.consult(w,b)},it.prototype.consult=function(w,b){var y=\"\";if(typeof w==\"string\"){y=w;var F=y.length;if(y.substring(F-3,F)===\".pl\"&&document.getElementById(y)){var z=document.getElementById(y),X=z.getAttribute(\"type\");X!==null&&X.replace(/ /g,\"\").toLowerCase()===\"text/prolog\"&&(y=z.text)}}else if(w.nodeName)switch(w.nodeName.toLowerCase()){case\"input\":case\"textarea\":y=w.value;break;default:y=w.innerHTML;break}else return!1;return this.warnings=[],le(this,y,b)},ke.prototype.query=function(w){return this.thread.query(w)},it.prototype.query=function(w){return this.points=[],this.debugger_points=[],me(this,w)},ke.prototype.head_point=function(){return this.thread.head_point()},it.prototype.head_point=function(){return this.points[this.points.length-1]},ke.prototype.get_free_variable=function(w){return this.thread.get_free_variable(w)},it.prototype.get_free_variable=function(w){var b=[];if(w.id===\"_\"||this.session.renamed_variables[w.id]===void 0){for(this.session.rename++,this.points.length>0&&(b=this.head_point().substitution.domain());e(b,x.format_variable(this.session.rename))!==-1;)this.session.rename++;if(w.id===\"_\")return new De(x.format_variable(this.session.rename));this.session.renamed_variables[w.id]=x.format_variable(this.session.rename)}return new De(this.session.renamed_variables[w.id])},ke.prototype.next_free_variable=function(){return this.thread.next_free_variable()},it.prototype.next_free_variable=function(){this.session.rename++;var w=[];for(this.points.length>0&&(w=this.head_point().substitution.domain());e(w,x.format_variable(this.session.rename))!==-1;)this.session.rename++;return new De(x.format_variable(this.session.rename))},ke.prototype.is_public_predicate=function(w){return!this.public_predicates.hasOwnProperty(w)||this.public_predicates[w]===!0},it.prototype.is_public_predicate=function(w){return this.session.is_public_predicate(w)},ke.prototype.is_multifile_predicate=function(w){return this.multifile_predicates.hasOwnProperty(w)&&this.multifile_predicates[w]===!0},it.prototype.is_multifile_predicate=function(w){return this.session.is_multifile_predicate(w)},ke.prototype.prepend=function(w){return this.thread.prepend(w)},it.prototype.prepend=function(w){for(var b=w.length-1;b>=0;b--)this.points.push(w[b])},ke.prototype.success=function(w,b){return this.thread.success(w,b)},it.prototype.success=function(w,y){var y=typeof y>\"u\"?w:y;this.prepend([new Pe(w.goal.replace(null),w.substitution,y)])},ke.prototype.throw_error=function(w){return this.thread.throw_error(w)},it.prototype.throw_error=function(w){this.prepend([new Pe(new j(\"throw\",[w]),new Ne,null,null)])},ke.prototype.step_rule=function(w,b){return this.thread.step_rule(w,b)},it.prototype.step_rule=function(w,b){var y=b.indicator;if(w===\"user\"&&(w=null),w===null&&this.session.rules.hasOwnProperty(y))return this.session.rules[y];for(var F=w===null?this.session.modules:e(this.session.modules,w)===-1?[]:[w],z=0;z<F.length;z++){var X=x.module[F[z]];if(X.rules.hasOwnProperty(y)&&(X.rules.hasOwnProperty(this.level)||X.exports_predicate(y)))return x.module[F[z]].rules[y]}return null},ke.prototype.step=function(){return this.thread.step()},it.prototype.step=function(){if(this.points.length!==0){var w=!1,b=this.points.pop();if(this.debugger&&this.debugger_states.push(b),x.type.is_term(b.goal)){var y=b.goal.select(),F=null,z=[];if(y!==null){this.total_steps++;for(var X=b;X.parent!==null&&X.parent.goal.search(y);)X=X.parent;if(this.level=X.parent===null?\"top_level/0\":X.parent.goal.select().indicator,x.type.is_term(y)&&y.indicator===\":/2\"&&(F=y.args[0].id,y=y.args[1]),F===null&&x.type.is_builtin(y))this.__call_indicator=y.indicator,w=x.predicate[y.indicator](this,b,y);else{var $=this.step_rule(F,y);if($===null)this.session.rules.hasOwnProperty(y.indicator)||(this.get_flag(\"unknown\").id===\"error\"?this.throw_error(x.error.existence(\"procedure\",y.indicator,this.level)):this.get_flag(\"unknown\").id===\"warning\"&&this.throw_warning(\"unknown procedure \"+y.indicator+\" (from \"+this.level+\")\"));else if($ instanceof Function)w=$(this,b,y);else{for(var oe in $)if($.hasOwnProperty(oe)){var xe=$[oe];this.session.renamed_variables={},xe=xe.rename(this);var Te=this.get_flag(\"occurs_check\").indicator===\"true/0\",lt=new Pe,Ct=x.unify(y,xe.head,Te);Ct!==null&&(lt.goal=b.goal.replace(xe.body),lt.goal!==null&&(lt.goal=lt.goal.apply(Ct)),lt.substitution=b.substitution.apply(Ct),lt.parent=b,z.push(lt))}this.prepend(z)}}}}else x.type.is_variable(b.goal)?this.throw_error(x.error.instantiation(this.level)):this.throw_error(x.error.type(\"callable\",b.goal,this.level));return w}},ke.prototype.answer=function(w){return this.thread.answer(w)},it.prototype.answer=function(w){w=w||function(b){},this.__calls.push(w),!(this.__calls.length>1)&&this.again()},ke.prototype.answers=function(w,b,y){return this.thread.answers(w,b,y)},it.prototype.answers=function(w,b,y){var F=b||1e3,z=this;if(b<=0){y&&y();return}this.answer(function(X){w(X),X!==!1?setTimeout(function(){z.answers(w,b-1,y)},1):y&&y()})},ke.prototype.again=function(w){return this.thread.again(w)},it.prototype.again=function(w){for(var b,y=Date.now();this.__calls.length>0;){for(this.warnings=[],w!==!1&&(this.current_limit=this.session.limit);this.current_limit>0&&this.points.length>0&&this.head_point().goal!==null&&!x.type.is_error(this.head_point().goal);)if(this.current_limit--,this.step()===!0)return;var F=Date.now();this.cpu_time_last=F-y,this.cpu_time+=this.cpu_time_last;var z=this.__calls.shift();this.current_limit<=0?z(null):this.points.length===0?z(!1):x.type.is_error(this.head_point().goal)?(b=this.session.format_error(this.points.pop()),this.points=[],z(b)):(this.debugger&&this.debugger_states.push(this.head_point()),b=this.session.format_success(this.points.pop()),z(b))}},ke.prototype.unfold=function(w){if(w.body===null)return!1;var b=w.head,y=w.body,F=y.select(),z=new it(this),X=[];z.add_goal(F),z.step();for(var $=z.points.length-1;$>=0;$--){var oe=z.points[$],xe=b.apply(oe.substitution),Te=y.replace(oe.goal);Te!==null&&(Te=Te.apply(oe.substitution)),X.push(new Ve(xe,Te))}var lt=this.rules[b.indicator],Ct=e(lt,w);return X.length>0&&Ct!==-1?(lt.splice.apply(lt,[Ct,1].concat(X)),!0):!1},it.prototype.unfold=function(w){return this.session.unfold(w)},De.prototype.interpret=function(w){return x.error.instantiation(w.level)},Re.prototype.interpret=function(w){return this},j.prototype.interpret=function(w){return x.type.is_unitary_list(this)?this.args[0].interpret(w):x.operate(w,this)},De.prototype.compare=function(w){return this.id<w.id?-1:this.id>w.id?1:0},Re.prototype.compare=function(w){if(this.value===w.value&&this.is_float===w.is_float)return 0;if(this.value<w.value||this.value===w.value&&this.is_float&&!w.is_float)return-1;if(this.value>w.value)return 1},j.prototype.compare=function(w){if(this.args.length<w.args.length||this.args.length===w.args.length&&this.id<w.id)return-1;if(this.args.length>w.args.length||this.args.length===w.args.length&&this.id>w.id)return 1;for(var b=0;b<this.args.length;b++){var y=x.compare(this.args[b],w.args[b]);if(y!==0)return y}return 0},Ne.prototype.lookup=function(w){return this.links[w]?this.links[w]:null},Ne.prototype.filter=function(w){var b={};for(var y in this.links)if(this.links.hasOwnProperty(y)){var F=this.links[y];w(y,F)&&(b[y]=F)}return new Ne(b)},Ne.prototype.exclude=function(w){var b={};for(var y in this.links)this.links.hasOwnProperty(y)&&e(w,y)===-1&&(b[y]=this.links[y]);return new Ne(b)},Ne.prototype.add=function(w,b){this.links[w]=b},Ne.prototype.domain=function(w){var b=w===!0?function(z){return z}:function(z){return new De(z)},y=[];for(var F in this.links)y.push(b(F));return y},De.prototype.compile=function(){return'new pl.type.Var(\"'+this.id.toString()+'\")'},Re.prototype.compile=function(){return\"new pl.type.Num(\"+this.value.toString()+\", \"+this.is_float.toString()+\")\"},j.prototype.compile=function(){return'new pl.type.Term(\"'+this.id.replace(/\"/g,'\\\\\"')+'\", ['+s(this.args,function(w){return w.compile()})+\"])\"},Ve.prototype.compile=function(){return\"new pl.type.Rule(\"+this.head.compile()+\", \"+(this.body===null?\"null\":this.body.compile())+\")\"},ke.prototype.compile=function(){var w,b=[],y;for(var F in this.rules)if(this.rules.hasOwnProperty(F)){var z=this.rules[F];y=[],w='\"'+F+'\": [';for(var X=0;X<z.length;X++)y.push(z[X].compile());w+=y.join(),w+=\"]\",b.push(w)}return\"{\"+b.join()+\"};\"},De.prototype.toJavaScript=function(){},Re.prototype.toJavaScript=function(){return this.value},j.prototype.toJavaScript=function(){if(this.args.length===0&&this.indicator!==\"[]/0\")return this.id;if(x.type.is_list(this)){for(var w=[],b=this,y;b.indicator===\"./2\";){if(y=b.args[0].toJavaScript(),y===void 0)return;w.push(y),b=b.args[1]}if(b.indicator===\"[]/0\")return w}},Ve.prototype.singleton_variables=function(){var w=this.head.variables(),b={},y=[];this.body!==null&&(w=w.concat(this.body.variables()));for(var F=0;F<w.length;F++)b[w[F]]===void 0&&(b[w[F]]=0),b[w[F]]++;for(var z in b)z!==\"_\"&&b[z]===1&&y.push(z);return y};var x={__env:typeof ec<\"u\"&&ec.exports?global:window,module:{},version:t,parser:{tokenizer:U,expression:W},utils:{str_indicator:Z,codePointAt:n,fromCodePoint:c},statistics:{getCountTerms:function(){return mt}},fromJavaScript:{test:{boolean:function(w){return w===!0||w===!1},number:function(w){return typeof w==\"number\"},string:function(w){return typeof w==\"string\"},list:function(w){return w instanceof Array},variable:function(w){return w===void 0},any:function(w){return!0}},conversion:{boolean:function(w){return new j(w?\"true\":\"false\",[])},number:function(w){return new Re(w,w%1!==0)},string:function(w){return new j(w,[])},list:function(w){for(var b=[],y,F=0;F<w.length;F++){if(y=x.fromJavaScript.apply(w[F]),y===void 0)return;b.push(y)}return g(b)},variable:function(w){return new De(\"_\")},any:function(w){}},apply:function(w){for(var b in x.fromJavaScript.test)if(b!==\"any\"&&x.fromJavaScript.test[b](w))return x.fromJavaScript.conversion[b](w);return x.fromJavaScript.conversion.any(w)}},type:{Var:De,Num:Re,Term:j,Rule:Ve,State:Pe,Stream:Fe,Module:Ue,Thread:it,Session:ke,Substitution:Ne,order:[De,Re,j,Fe],compare:function(w,b){var y=e(x.type.order,w.constructor),F=e(x.type.order,b.constructor);if(y<F)return-1;if(y>F)return 1;if(w.constructor===Re){if(w.is_float&&b.is_float)return 0;if(w.is_float)return-1;if(b.is_float)return 1}return 0},is_substitution:function(w){return w instanceof Ne},is_state:function(w){return w instanceof Pe},is_rule:function(w){return w instanceof Ve},is_variable:function(w){return w instanceof De},is_stream:function(w){return w instanceof Fe},is_anonymous_var:function(w){return w instanceof De&&w.id===\"_\"},is_callable:function(w){return w instanceof j},is_number:function(w){return w instanceof Re},is_integer:function(w){return w instanceof Re&&!w.is_float},is_float:function(w){return w instanceof Re&&w.is_float},is_term:function(w){return w instanceof j},is_atom:function(w){return w instanceof j&&w.args.length===0},is_ground:function(w){if(w instanceof De)return!1;if(w instanceof j){for(var b=0;b<w.args.length;b++)if(!x.type.is_ground(w.args[b]))return!1}return!0},is_atomic:function(w){return w instanceof j&&w.args.length===0||w instanceof Re},is_compound:function(w){return w instanceof j&&w.args.length>0},is_list:function(w){return w instanceof j&&(w.indicator===\"[]/0\"||w.indicator===\"./2\")},is_empty_list:function(w){return w instanceof j&&w.indicator===\"[]/0\"},is_non_empty_list:function(w){return w instanceof j&&w.indicator===\"./2\"},is_fully_list:function(w){for(;w instanceof j&&w.indicator===\"./2\";)w=w.args[1];return w instanceof De||w instanceof j&&w.indicator===\"[]/0\"},is_instantiated_list:function(w){for(;w instanceof j&&w.indicator===\"./2\";)w=w.args[1];return w instanceof j&&w.indicator===\"[]/0\"},is_unitary_list:function(w){return w instanceof j&&w.indicator===\"./2\"&&w.args[1]instanceof j&&w.args[1].indicator===\"[]/0\"},is_character:function(w){return w instanceof j&&(w.id.length===1||w.id.length>0&&w.id.length<=2&&n(w.id,0)>=65536)},is_character_code:function(w){return w instanceof Re&&!w.is_float&&w.value>=0&&w.value<=1114111},is_byte:function(w){return w instanceof Re&&!w.is_float&&w.value>=0&&w.value<=255},is_operator:function(w){return w instanceof j&&x.arithmetic.evaluation[w.indicator]},is_directive:function(w){return w instanceof j&&x.directive[w.indicator]!==void 0},is_builtin:function(w){return w instanceof j&&x.predicate[w.indicator]!==void 0},is_error:function(w){return w instanceof j&&w.indicator===\"throw/1\"},is_predicate_indicator:function(w){return w instanceof j&&w.indicator===\"//2\"&&w.args[0]instanceof j&&w.args[0].args.length===0&&w.args[1]instanceof Re&&w.args[1].is_float===!1},is_flag:function(w){return w instanceof j&&w.args.length===0&&x.flag[w.id]!==void 0},is_value_flag:function(w,b){if(!x.type.is_flag(w))return!1;for(var y in x.flag[w.id].allowed)if(x.flag[w.id].allowed.hasOwnProperty(y)&&x.flag[w.id].allowed[y].equals(b))return!0;return!1},is_io_mode:function(w){return x.type.is_atom(w)&&[\"read\",\"write\",\"append\"].indexOf(w.id)!==-1},is_stream_option:function(w){return x.type.is_term(w)&&(w.indicator===\"alias/1\"&&x.type.is_atom(w.args[0])||w.indicator===\"reposition/1\"&&x.type.is_atom(w.args[0])&&(w.args[0].id===\"true\"||w.args[0].id===\"false\")||w.indicator===\"type/1\"&&x.type.is_atom(w.args[0])&&(w.args[0].id===\"text\"||w.args[0].id===\"binary\")||w.indicator===\"eof_action/1\"&&x.type.is_atom(w.args[0])&&(w.args[0].id===\"error\"||w.args[0].id===\"eof_code\"||w.args[0].id===\"reset\"))},is_stream_position:function(w){return x.type.is_integer(w)&&w.value>=0||x.type.is_atom(w)&&(w.id===\"end_of_stream\"||w.id===\"past_end_of_stream\")},is_stream_property:function(w){return x.type.is_term(w)&&(w.indicator===\"input/0\"||w.indicator===\"output/0\"||w.indicator===\"alias/1\"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0]))||w.indicator===\"file_name/1\"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0]))||w.indicator===\"position/1\"&&(x.type.is_variable(w.args[0])||x.type.is_stream_position(w.args[0]))||w.indicator===\"reposition/1\"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id===\"true\"||w.args[0].id===\"false\"))||w.indicator===\"type/1\"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id===\"text\"||w.args[0].id===\"binary\"))||w.indicator===\"mode/1\"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id===\"read\"||w.args[0].id===\"write\"||w.args[0].id===\"append\"))||w.indicator===\"eof_action/1\"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id===\"error\"||w.args[0].id===\"eof_code\"||w.args[0].id===\"reset\"))||w.indicator===\"end_of_stream/1\"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id===\"at\"||w.args[0].id===\"past\"||w.args[0].id===\"not\")))},is_streamable:function(w){return w.__proto__.stream!==void 0},is_read_option:function(w){return x.type.is_term(w)&&[\"variables/1\",\"variable_names/1\",\"singletons/1\"].indexOf(w.indicator)!==-1},is_write_option:function(w){return x.type.is_term(w)&&(w.indicator===\"quoted/1\"&&x.type.is_atom(w.args[0])&&(w.args[0].id===\"true\"||w.args[0].id===\"false\")||w.indicator===\"ignore_ops/1\"&&x.type.is_atom(w.args[0])&&(w.args[0].id===\"true\"||w.args[0].id===\"false\")||w.indicator===\"numbervars/1\"&&x.type.is_atom(w.args[0])&&(w.args[0].id===\"true\"||w.args[0].id===\"false\"))},is_close_option:function(w){return x.type.is_term(w)&&w.indicator===\"force/1\"&&x.type.is_atom(w.args[0])&&(w.args[0].id===\"true\"||w.args[0].id===\"false\")},is_modifiable_flag:function(w){return x.type.is_flag(w)&&x.flag[w.id].changeable},is_module:function(w){return w instanceof j&&w.indicator===\"library/1\"&&w.args[0]instanceof j&&w.args[0].args.length===0&&x.module[w.args[0].id]!==void 0}},arithmetic:{evaluation:{\"e/0\":{type_args:null,type_result:!0,fn:function(w){return Math.E}},\"pi/0\":{type_args:null,type_result:!0,fn:function(w){return Math.PI}},\"tau/0\":{type_args:null,type_result:!0,fn:function(w){return 2*Math.PI}},\"epsilon/0\":{type_args:null,type_result:!0,fn:function(w){return Number.EPSILON}},\"+/1\":{type_args:null,type_result:null,fn:function(w,b){return w}},\"-/1\":{type_args:null,type_result:null,fn:function(w,b){return-w}},\"\\\\/1\":{type_args:!1,type_result:!1,fn:function(w,b){return~w}},\"abs/1\":{type_args:null,type_result:null,fn:function(w,b){return Math.abs(w)}},\"sign/1\":{type_args:null,type_result:null,fn:function(w,b){return Math.sign(w)}},\"float_integer_part/1\":{type_args:!0,type_result:!1,fn:function(w,b){return parseInt(w)}},\"float_fractional_part/1\":{type_args:!0,type_result:!0,fn:function(w,b){return w-parseInt(w)}},\"float/1\":{type_args:null,type_result:!0,fn:function(w,b){return parseFloat(w)}},\"floor/1\":{type_args:!0,type_result:!1,fn:function(w,b){return Math.floor(w)}},\"truncate/1\":{type_args:!0,type_result:!1,fn:function(w,b){return parseInt(w)}},\"round/1\":{type_args:!0,type_result:!1,fn:function(w,b){return Math.round(w)}},\"ceiling/1\":{type_args:!0,type_result:!1,fn:function(w,b){return Math.ceil(w)}},\"sin/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.sin(w)}},\"cos/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.cos(w)}},\"tan/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.tan(w)}},\"asin/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.asin(w)}},\"acos/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.acos(w)}},\"atan/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.atan(w)}},\"atan2/2\":{type_args:null,type_result:!0,fn:function(w,b,y){return Math.atan2(w,b)}},\"exp/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.exp(w)}},\"sqrt/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.sqrt(w)}},\"log/1\":{type_args:null,type_result:!0,fn:function(w,b){return w>0?Math.log(w):x.error.evaluation(\"undefined\",b.__call_indicator)}},\"+/2\":{type_args:null,type_result:null,fn:function(w,b,y){return w+b}},\"-/2\":{type_args:null,type_result:null,fn:function(w,b,y){return w-b}},\"*/2\":{type_args:null,type_result:null,fn:function(w,b,y){return w*b}},\"//2\":{type_args:null,type_result:!0,fn:function(w,b,y){return b?w/b:x.error.evaluation(\"zero_division\",y.__call_indicator)}},\"///2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return b?parseInt(w/b):x.error.evaluation(\"zero_division\",y.__call_indicator)}},\"**/2\":{type_args:null,type_result:!0,fn:function(w,b,y){return Math.pow(w,b)}},\"^/2\":{type_args:null,type_result:null,fn:function(w,b,y){return Math.pow(w,b)}},\"<</2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return w<<b}},\">>/2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return w>>b}},\"/\\\\/2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return w&b}},\"\\\\//2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return w|b}},\"xor/2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return w^b}},\"rem/2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return b?w%b:x.error.evaluation(\"zero_division\",y.__call_indicator)}},\"mod/2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return b?w-parseInt(w/b)*b:x.error.evaluation(\"zero_division\",y.__call_indicator)}},\"max/2\":{type_args:null,type_result:null,fn:function(w,b,y){return Math.max(w,b)}},\"min/2\":{type_args:null,type_result:null,fn:function(w,b,y){return Math.min(w,b)}}}},directive:{\"dynamic/1\":function(w,b){var y=b.args[0];if(x.type.is_variable(y))w.throw_error(x.error.instantiation(b.indicator));else if(!x.type.is_compound(y)||y.indicator!==\"//2\")w.throw_error(x.error.type(\"predicate_indicator\",y,b.indicator));else if(x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1]))w.throw_error(x.error.instantiation(b.indicator));else if(!x.type.is_atom(y.args[0]))w.throw_error(x.error.type(\"atom\",y.args[0],b.indicator));else if(!x.type.is_integer(y.args[1]))w.throw_error(x.error.type(\"integer\",y.args[1],b.indicator));else{var F=b.args[0].args[0].id+\"/\"+b.args[0].args[1].value;w.session.public_predicates[F]=!0,w.session.rules[F]||(w.session.rules[F]=[])}},\"multifile/1\":function(w,b){var y=b.args[0];x.type.is_variable(y)?w.throw_error(x.error.instantiation(b.indicator)):!x.type.is_compound(y)||y.indicator!==\"//2\"?w.throw_error(x.error.type(\"predicate_indicator\",y,b.indicator)):x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1])?w.throw_error(x.error.instantiation(b.indicator)):x.type.is_atom(y.args[0])?x.type.is_integer(y.args[1])?w.session.multifile_predicates[b.args[0].args[0].id+\"/\"+b.args[0].args[1].value]=!0:w.throw_error(x.error.type(\"integer\",y.args[1],b.indicator)):w.throw_error(x.error.type(\"atom\",y.args[0],b.indicator))},\"set_prolog_flag/2\":function(w,b){var y=b.args[0],F=b.args[1];x.type.is_variable(y)||x.type.is_variable(F)?w.throw_error(x.error.instantiation(b.indicator)):x.type.is_atom(y)?x.type.is_flag(y)?x.type.is_value_flag(y,F)?x.type.is_modifiable_flag(y)?w.session.flag[y.id]=F:w.throw_error(x.error.permission(\"modify\",\"flag\",y)):w.throw_error(x.error.domain(\"flag_value\",new j(\"+\",[y,F]),b.indicator)):w.throw_error(x.error.domain(\"prolog_flag\",y,b.indicator)):w.throw_error(x.error.type(\"atom\",y,b.indicator))},\"use_module/1\":function(w,b){var y=b.args[0];if(x.type.is_variable(y))w.throw_error(x.error.instantiation(b.indicator));else if(!x.type.is_term(y))w.throw_error(x.error.type(\"term\",y,b.indicator));else if(x.type.is_module(y)){var F=y.args[0].id;e(w.session.modules,F)===-1&&w.session.modules.push(F)}},\"char_conversion/2\":function(w,b){var y=b.args[0],F=b.args[1];x.type.is_variable(y)||x.type.is_variable(F)?w.throw_error(x.error.instantiation(b.indicator)):x.type.is_character(y)?x.type.is_character(F)?y.id===F.id?delete w.session.__char_conversion[y.id]:w.session.__char_conversion[y.id]=F.id:w.throw_error(x.error.type(\"character\",F,b.indicator)):w.throw_error(x.error.type(\"character\",y,b.indicator))},\"op/3\":function(w,b){var y=b.args[0],F=b.args[1],z=b.args[2];if(x.type.is_variable(y)||x.type.is_variable(F)||x.type.is_variable(z))w.throw_error(x.error.instantiation(b.indicator));else if(!x.type.is_integer(y))w.throw_error(x.error.type(\"integer\",y,b.indicator));else if(!x.type.is_atom(F))w.throw_error(x.error.type(\"atom\",F,b.indicator));else if(!x.type.is_atom(z))w.throw_error(x.error.type(\"atom\",z,b.indicator));else if(y.value<0||y.value>1200)w.throw_error(x.error.domain(\"operator_priority\",y,b.indicator));else if(z.id===\",\")w.throw_error(x.error.permission(\"modify\",\"operator\",z,b.indicator));else if(z.id===\"|\"&&(y.value<1001||F.id.length!==3))w.throw_error(x.error.permission(\"modify\",\"operator\",z,b.indicator));else if([\"fy\",\"fx\",\"yf\",\"xf\",\"xfx\",\"yfx\",\"xfy\"].indexOf(F.id)===-1)w.throw_error(x.error.domain(\"operator_specifier\",F,b.indicator));else{var X={prefix:null,infix:null,postfix:null};for(var $ in w.session.__operators)if(w.session.__operators.hasOwnProperty($)){var oe=w.session.__operators[$][z.id];oe&&(e(oe,\"fx\")!==-1&&(X.prefix={priority:$,type:\"fx\"}),e(oe,\"fy\")!==-1&&(X.prefix={priority:$,type:\"fy\"}),e(oe,\"xf\")!==-1&&(X.postfix={priority:$,type:\"xf\"}),e(oe,\"yf\")!==-1&&(X.postfix={priority:$,type:\"yf\"}),e(oe,\"xfx\")!==-1&&(X.infix={priority:$,type:\"xfx\"}),e(oe,\"xfy\")!==-1&&(X.infix={priority:$,type:\"xfy\"}),e(oe,\"yfx\")!==-1&&(X.infix={priority:$,type:\"yfx\"}))}var xe;switch(F.id){case\"fy\":case\"fx\":xe=\"prefix\";break;case\"yf\":case\"xf\":xe=\"postfix\";break;default:xe=\"infix\";break}if(((X.prefix&&xe===\"prefix\"||X.postfix&&xe===\"postfix\"||X.infix&&xe===\"infix\")&&X[xe].type!==F.id||X.infix&&xe===\"postfix\"||X.postfix&&xe===\"infix\")&&y.value!==0)w.throw_error(x.error.permission(\"create\",\"operator\",z,b.indicator));else return X[xe]&&(we(w.session.__operators[X[xe].priority][z.id],F.id),w.session.__operators[X[xe].priority][z.id].length===0&&delete w.session.__operators[X[xe].priority][z.id]),y.value>0&&(w.session.__operators[y.value]||(w.session.__operators[y.value.toString()]={}),w.session.__operators[y.value][z.id]||(w.session.__operators[y.value][z.id]=[]),w.session.__operators[y.value][z.id].push(F.id)),!0}}},predicate:{\"op/3\":function(w,b,y){x.directive[\"op/3\"](w,y)&&w.success(b)},\"current_op/3\":function(w,b,y){var F=y.args[0],z=y.args[1],X=y.args[2],$=[];for(var oe in w.session.__operators)for(var xe in w.session.__operators[oe])for(var Te=0;Te<w.session.__operators[oe][xe].length;Te++)$.push(new Pe(b.goal.replace(new j(\",\",[new j(\"=\",[new Re(oe,!1),F]),new j(\",\",[new j(\"=\",[new j(w.session.__operators[oe][xe][Te],[]),z]),new j(\"=\",[new j(xe,[]),X])])])),b.substitution,b));w.prepend($)},\";/2\":function(w,b,y){if(x.type.is_term(y.args[0])&&y.args[0].indicator===\"->/2\"){var F=w.points,z=w.session.format_success,X=w.session.format_error;w.session.format_success=function(Te){return Te.substitution},w.session.format_error=function(Te){return Te.goal},w.points=[new Pe(y.args[0].args[0],b.substitution,b)];var $=function(Te){w.points=F,w.session.format_success=z,w.session.format_error=X,Te===!1?w.prepend([new Pe(b.goal.replace(y.args[1]),b.substitution,b)]):x.type.is_error(Te)?w.throw_error(Te.args[0]):Te===null?(w.prepend([b]),w.__calls.shift()(null)):w.prepend([new Pe(b.goal.replace(y.args[0].args[1]).apply(Te),b.substitution.apply(Te),b)])};w.__calls.unshift($)}else{var oe=new Pe(b.goal.replace(y.args[0]),b.substitution,b),xe=new Pe(b.goal.replace(y.args[1]),b.substitution,b);w.prepend([oe,xe])}},\"!/0\":function(w,b,y){var F,z,X=[];for(F=b,z=null;F.parent!==null&&F.parent.goal.search(y);)if(z=F,F=F.parent,F.goal!==null){var $=F.goal.select();if($&&$.id===\"call\"&&$.search(y)){F=z;break}}for(var oe=w.points.length-1;oe>=0;oe--){for(var xe=w.points[oe],Te=xe.parent;Te!==null&&Te!==F.parent;)Te=Te.parent;Te===null&&Te!==F.parent&&X.push(xe)}w.points=X.reverse(),w.success(b)},\"\\\\+/1\":function(w,b,y){var F=y.args[0];x.type.is_variable(F)?w.throw_error(x.error.instantiation(w.level)):x.type.is_callable(F)?w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\",\",[new j(\"call\",[F]),new j(\"!\",[])]),new j(\"fail\",[])])),b.substitution,b),new Pe(b.goal.replace(null),b.substitution,b)]):w.throw_error(x.error.type(\"callable\",F,w.level))},\"->/2\":function(w,b,y){var F=b.goal.replace(new j(\",\",[y.args[0],new j(\",\",[new j(\"!\"),y.args[1]])]));w.prepend([new Pe(F,b.substitution,b)])},\"fail/0\":function(w,b,y){},\"false/0\":function(w,b,y){},\"true/0\":function(w,b,y){w.success(b)},\"call/1\":se(1),\"call/2\":se(2),\"call/3\":se(3),\"call/4\":se(4),\"call/5\":se(5),\"call/6\":se(6),\"call/7\":se(7),\"call/8\":se(8),\"once/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"call\",[F]),new j(\"!\",[])])),b.substitution,b)])},\"forall/2\":function(w,b,y){var F=y.args[0],z=y.args[1];w.prepend([new Pe(b.goal.replace(new j(\"\\\\+\",[new j(\",\",[new j(\"call\",[F]),new j(\"\\\\+\",[new j(\"call\",[z])])])])),b.substitution,b)])},\"repeat/0\":function(w,b,y){w.prepend([new Pe(b.goal.replace(null),b.substitution,b),b])},\"throw/1\":function(w,b,y){x.type.is_variable(y.args[0])?w.throw_error(x.error.instantiation(w.level)):w.throw_error(y.args[0])},\"catch/3\":function(w,b,y){var F=w.points;w.points=[],w.prepend([new Pe(y.args[0],b.substitution,b)]);var z=w.session.format_success,X=w.session.format_error;w.session.format_success=function(oe){return oe.substitution},w.session.format_error=function(oe){return oe.goal};var $=function(oe){var xe=w.points;if(w.points=F,w.session.format_success=z,w.session.format_error=X,x.type.is_error(oe)){for(var Te=[],lt=w.points.length-1;lt>=0;lt--){for(var ir=w.points[lt],Ct=ir.parent;Ct!==null&&Ct!==b.parent;)Ct=Ct.parent;Ct===null&&Ct!==b.parent&&Te.push(ir)}w.points=Te;var qt=w.get_flag(\"occurs_check\").indicator===\"true/0\",ir=new Pe,Pt=x.unify(oe.args[0],y.args[1],qt);Pt!==null?(ir.substitution=b.substitution.apply(Pt),ir.goal=b.goal.replace(y.args[2]).apply(Pt),ir.parent=b,w.prepend([ir])):w.throw_error(oe.args[0])}else if(oe!==!1){for(var gn=oe===null?[]:[new Pe(b.goal.apply(oe).replace(null),b.substitution.apply(oe),b)],Pr=[],lt=xe.length-1;lt>=0;lt--){Pr.push(xe[lt]);var Ir=xe[lt].goal!==null?xe[lt].goal.select():null;if(x.type.is_term(Ir)&&Ir.indicator===\"!/0\")break}var Or=s(Pr,function(on){return on.goal===null&&(on.goal=new j(\"true\",[])),on=new Pe(b.goal.replace(new j(\"catch\",[on.goal,y.args[1],y.args[2]])),b.substitution.apply(on.substitution),on.parent),on.exclude=y.args[0].variables(),on}).reverse();w.prepend(Or),w.prepend(gn),oe===null&&(this.current_limit=0,w.__calls.shift()(null))}};w.__calls.unshift($)},\"=/2\":function(w,b,y){var F=w.get_flag(\"occurs_check\").indicator===\"true/0\",z=new Pe,X=x.unify(y.args[0],y.args[1],F);X!==null&&(z.goal=b.goal.apply(X).replace(null),z.substitution=b.substitution.apply(X),z.parent=b,w.prepend([z]))},\"unify_with_occurs_check/2\":function(w,b,y){var F=new Pe,z=x.unify(y.args[0],y.args[1],!0);z!==null&&(F.goal=b.goal.apply(z).replace(null),F.substitution=b.substitution.apply(z),F.parent=b,w.prepend([F]))},\"\\\\=/2\":function(w,b,y){var F=w.get_flag(\"occurs_check\").indicator===\"true/0\",z=x.unify(y.args[0],y.args[1],F);z===null&&w.success(b)},\"subsumes_term/2\":function(w,b,y){var F=w.get_flag(\"occurs_check\").indicator===\"true/0\",z=x.unify(y.args[1],y.args[0],F);z!==null&&y.args[1].apply(z).equals(y.args[1])&&w.success(b)},\"findall/3\":function(w,b,y){var F=y.args[0],z=y.args[1],X=y.args[2];if(x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(z))w.throw_error(x.error.type(\"callable\",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))w.throw_error(x.error.type(\"list\",X,y.indicator));else{var $=w.next_free_variable(),oe=new j(\",\",[z,new j(\"=\",[$,F])]),xe=w.points,Te=w.session.limit,lt=w.session.format_success;w.session.format_success=function(ir){return ir.substitution},w.add_goal(oe,!0,b);var Ct=[],qt=function(ir){if(ir!==!1&&ir!==null&&!x.type.is_error(ir))w.__calls.unshift(qt),Ct.push(ir.links[$.id]),w.session.limit=w.current_limit;else if(w.points=xe,w.session.limit=Te,w.session.format_success=lt,x.type.is_error(ir))w.throw_error(ir.args[0]);else if(w.current_limit>0){for(var Pt=new j(\"[]\"),gn=Ct.length-1;gn>=0;gn--)Pt=new j(\".\",[Ct[gn],Pt]);w.prepend([new Pe(b.goal.replace(new j(\"=\",[X,Pt])),b.substitution,b)])}};w.__calls.unshift(qt)}},\"bagof/3\":function(w,b,y){var F,z=y.args[0],X=y.args[1],$=y.args[2];if(x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(X))w.throw_error(x.error.type(\"callable\",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_list($))w.throw_error(x.error.type(\"list\",$,y.indicator));else{var oe=w.next_free_variable(),xe;X.indicator===\"^/2\"?(xe=X.args[0].variables(),X=X.args[1]):xe=[],xe=xe.concat(z.variables());for(var Te=X.variables().filter(function(Or){return e(xe,Or)===-1}),lt=new j(\"[]\"),Ct=Te.length-1;Ct>=0;Ct--)lt=new j(\".\",[new De(Te[Ct]),lt]);var qt=new j(\",\",[X,new j(\"=\",[oe,new j(\",\",[lt,z])])]),ir=w.points,Pt=w.session.limit,gn=w.session.format_success;w.session.format_success=function(Or){return Or.substitution},w.add_goal(qt,!0,b);var Pr=[],Ir=function(Or){if(Or!==!1&&Or!==null&&!x.type.is_error(Or)){w.__calls.unshift(Ir);var on=!1,ai=Or.links[oe.id].args[0],Io=Or.links[oe.id].args[1];for(var rs in Pr)if(Pr.hasOwnProperty(rs)){var $s=Pr[rs];if($s.variables.equals(ai)){$s.answers.push(Io),on=!0;break}}on||Pr.push({variables:ai,answers:[Io]}),w.session.limit=w.current_limit}else if(w.points=ir,w.session.limit=Pt,w.session.format_success=gn,x.type.is_error(Or))w.throw_error(Or.args[0]);else if(w.current_limit>0){for(var Co=[],ji=0;ji<Pr.length;ji++){Or=Pr[ji].answers;for(var eo=new j(\"[]\"),wo=Or.length-1;wo>=0;wo--)eo=new j(\".\",[Or[wo],eo]);Co.push(new Pe(b.goal.replace(new j(\",\",[new j(\"=\",[lt,Pr[ji].variables]),new j(\"=\",[$,eo])])),b.substitution,b))}w.prepend(Co)}};w.__calls.unshift(Ir)}},\"setof/3\":function(w,b,y){var F,z=y.args[0],X=y.args[1],$=y.args[2];if(x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(X))w.throw_error(x.error.type(\"callable\",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_list($))w.throw_error(x.error.type(\"list\",$,y.indicator));else{var oe=w.next_free_variable(),xe;X.indicator===\"^/2\"?(xe=X.args[0].variables(),X=X.args[1]):xe=[],xe=xe.concat(z.variables());for(var Te=X.variables().filter(function(Or){return e(xe,Or)===-1}),lt=new j(\"[]\"),Ct=Te.length-1;Ct>=0;Ct--)lt=new j(\".\",[new De(Te[Ct]),lt]);var qt=new j(\",\",[X,new j(\"=\",[oe,new j(\",\",[lt,z])])]),ir=w.points,Pt=w.session.limit,gn=w.session.format_success;w.session.format_success=function(Or){return Or.substitution},w.add_goal(qt,!0,b);var Pr=[],Ir=function(Or){if(Or!==!1&&Or!==null&&!x.type.is_error(Or)){w.__calls.unshift(Ir);var on=!1,ai=Or.links[oe.id].args[0],Io=Or.links[oe.id].args[1];for(var rs in Pr)if(Pr.hasOwnProperty(rs)){var $s=Pr[rs];if($s.variables.equals(ai)){$s.answers.push(Io),on=!0;break}}on||Pr.push({variables:ai,answers:[Io]}),w.session.limit=w.current_limit}else if(w.points=ir,w.session.limit=Pt,w.session.format_success=gn,x.type.is_error(Or))w.throw_error(Or.args[0]);else if(w.current_limit>0){for(var Co=[],ji=0;ji<Pr.length;ji++){Or=Pr[ji].answers.sort(x.compare);for(var eo=new j(\"[]\"),wo=Or.length-1;wo>=0;wo--)eo=new j(\".\",[Or[wo],eo]);Co.push(new Pe(b.goal.replace(new j(\",\",[new j(\"=\",[lt,Pr[ji].variables]),new j(\"=\",[$,eo])])),b.substitution,b))}w.prepend(Co)}};w.__calls.unshift(Ir)}},\"functor/3\":function(w,b,y){var F,z=y.args[0],X=y.args[1],$=y.args[2];if(x.type.is_variable(z)&&(x.type.is_variable(X)||x.type.is_variable($)))w.throw_error(x.error.instantiation(\"functor/3\"));else if(!x.type.is_variable($)&&!x.type.is_integer($))w.throw_error(x.error.type(\"integer\",y.args[2],\"functor/3\"));else if(!x.type.is_variable(X)&&!x.type.is_atomic(X))w.throw_error(x.error.type(\"atomic\",y.args[1],\"functor/3\"));else if(x.type.is_integer(X)&&x.type.is_integer($)&&$.value!==0)w.throw_error(x.error.type(\"atom\",y.args[1],\"functor/3\"));else if(x.type.is_variable(z)){if(y.args[2].value>=0){for(var oe=[],xe=0;xe<$.value;xe++)oe.push(w.next_free_variable());var Te=x.type.is_integer(X)?X:new j(X.id,oe);w.prepend([new Pe(b.goal.replace(new j(\"=\",[z,Te])),b.substitution,b)])}}else{var lt=x.type.is_integer(z)?z:new j(z.id,[]),Ct=x.type.is_integer(z)?new Re(0,!1):new Re(z.args.length,!1),qt=new j(\",\",[new j(\"=\",[lt,X]),new j(\"=\",[Ct,$])]);w.prepend([new Pe(b.goal.replace(qt),b.substitution,b)])}},\"arg/3\":function(w,b,y){if(x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1]))w.throw_error(x.error.instantiation(y.indicator));else if(y.args[0].value<0)w.throw_error(x.error.domain(\"not_less_than_zero\",y.args[0],y.indicator));else if(!x.type.is_compound(y.args[1]))w.throw_error(x.error.type(\"compound\",y.args[1],y.indicator));else{var F=y.args[0].value;if(F>0&&F<=y.args[1].args.length){var z=new j(\"=\",[y.args[1].args[F-1],y.args[2]]);w.prepend([new Pe(b.goal.replace(z),b.substitution,b)])}}},\"=../2\":function(w,b,y){var F;if(x.type.is_variable(y.args[0])&&(x.type.is_variable(y.args[1])||x.type.is_non_empty_list(y.args[1])&&x.type.is_variable(y.args[1].args[0])))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_fully_list(y.args[1]))w.throw_error(x.error.type(\"list\",y.args[1],y.indicator));else if(x.type.is_variable(y.args[0])){if(!x.type.is_variable(y.args[1])){var X=[];for(F=y.args[1].args[1];F.indicator===\"./2\";)X.push(F.args[0]),F=F.args[1];x.type.is_variable(y.args[0])&&x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):X.length===0&&x.type.is_compound(y.args[1].args[0])?w.throw_error(x.error.type(\"atomic\",y.args[1].args[0],y.indicator)):X.length>0&&(x.type.is_compound(y.args[1].args[0])||x.type.is_number(y.args[1].args[0]))?w.throw_error(x.error.type(\"atom\",y.args[1].args[0],y.indicator)):X.length===0?w.prepend([new Pe(b.goal.replace(new j(\"=\",[y.args[1].args[0],y.args[0]],b)),b.substitution,b)]):w.prepend([new Pe(b.goal.replace(new j(\"=\",[new j(y.args[1].args[0].id,X),y.args[0]])),b.substitution,b)])}}else{if(x.type.is_atomic(y.args[0]))F=new j(\".\",[y.args[0],new j(\"[]\")]);else{F=new j(\"[]\");for(var z=y.args[0].args.length-1;z>=0;z--)F=new j(\".\",[y.args[0].args[z],F]);F=new j(\".\",[new j(y.args[0].id),F])}w.prepend([new Pe(b.goal.replace(new j(\"=\",[F,y.args[1]])),b.substitution,b)])}},\"copy_term/2\":function(w,b,y){var F=y.args[0].rename(w);w.prepend([new Pe(b.goal.replace(new j(\"=\",[F,y.args[1]])),b.substitution,b.parent)])},\"term_variables/2\":function(w,b,y){var F=y.args[0],z=y.args[1];if(!x.type.is_fully_list(z))w.throw_error(x.error.type(\"list\",z,y.indicator));else{var X=g(s(ye(F.variables()),function($){return new De($)}));w.prepend([new Pe(b.goal.replace(new j(\"=\",[z,X])),b.substitution,b)])}},\"clause/2\":function(w,b,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))w.throw_error(x.error.type(\"callable\",y.args[0],y.indicator));else if(!x.type.is_variable(y.args[1])&&!x.type.is_callable(y.args[1]))w.throw_error(x.error.type(\"callable\",y.args[1],y.indicator));else if(w.session.rules[y.args[0].indicator]!==void 0)if(w.is_public_predicate(y.args[0].indicator)){var F=[];for(var z in w.session.rules[y.args[0].indicator])if(w.session.rules[y.args[0].indicator].hasOwnProperty(z)){var X=w.session.rules[y.args[0].indicator][z];w.session.renamed_variables={},X=X.rename(w),X.body===null&&(X.body=new j(\"true\"));var $=new j(\",\",[new j(\"=\",[X.head,y.args[0]]),new j(\"=\",[X.body,y.args[1]])]);F.push(new Pe(b.goal.replace($),b.substitution,b))}w.prepend(F)}else w.throw_error(x.error.permission(\"access\",\"private_procedure\",y.args[0].indicator,y.indicator))},\"current_predicate/1\":function(w,b,y){var F=y.args[0];if(!x.type.is_variable(F)&&(!x.type.is_compound(F)||F.indicator!==\"//2\"))w.throw_error(x.error.type(\"predicate_indicator\",F,y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_variable(F.args[0])&&!x.type.is_atom(F.args[0]))w.throw_error(x.error.type(\"atom\",F.args[0],y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_variable(F.args[1])&&!x.type.is_integer(F.args[1]))w.throw_error(x.error.type(\"integer\",F.args[1],y.indicator));else{var z=[];for(var X in w.session.rules)if(w.session.rules.hasOwnProperty(X)){var $=X.lastIndexOf(\"/\"),oe=X.substr(0,$),xe=parseInt(X.substr($+1,X.length-($+1))),Te=new j(\"/\",[new j(oe),new Re(xe,!1)]),lt=new j(\"=\",[Te,F]);z.push(new Pe(b.goal.replace(lt),b.substitution,b))}w.prepend(z)}},\"asserta/1\":function(w,b,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))w.throw_error(x.error.type(\"callable\",y.args[0],y.indicator));else{var F,z;y.args[0].indicator===\":-/2\"?(F=y.args[0].args[0],z=Ce(y.args[0].args[1])):(F=y.args[0],z=null),x.type.is_callable(F)?z!==null&&!x.type.is_callable(z)?w.throw_error(x.error.type(\"callable\",z,y.indicator)):w.is_public_predicate(F.indicator)?(w.session.rules[F.indicator]===void 0&&(w.session.rules[F.indicator]=[]),w.session.public_predicates[F.indicator]=!0,w.session.rules[F.indicator]=[new Ve(F,z,!0)].concat(w.session.rules[F.indicator]),w.success(b)):w.throw_error(x.error.permission(\"modify\",\"static_procedure\",F.indicator,y.indicator)):w.throw_error(x.error.type(\"callable\",F,y.indicator))}},\"assertz/1\":function(w,b,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))w.throw_error(x.error.type(\"callable\",y.args[0],y.indicator));else{var F,z;y.args[0].indicator===\":-/2\"?(F=y.args[0].args[0],z=Ce(y.args[0].args[1])):(F=y.args[0],z=null),x.type.is_callable(F)?z!==null&&!x.type.is_callable(z)?w.throw_error(x.error.type(\"callable\",z,y.indicator)):w.is_public_predicate(F.indicator)?(w.session.rules[F.indicator]===void 0&&(w.session.rules[F.indicator]=[]),w.session.public_predicates[F.indicator]=!0,w.session.rules[F.indicator].push(new Ve(F,z,!0)),w.success(b)):w.throw_error(x.error.permission(\"modify\",\"static_procedure\",F.indicator,y.indicator)):w.throw_error(x.error.type(\"callable\",F,y.indicator))}},\"retract/1\":function(w,b,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))w.throw_error(x.error.type(\"callable\",y.args[0],y.indicator));else{var F,z;if(y.args[0].indicator===\":-/2\"?(F=y.args[0].args[0],z=y.args[0].args[1]):(F=y.args[0],z=new j(\"true\")),typeof b.retract>\"u\")if(w.is_public_predicate(F.indicator)){if(w.session.rules[F.indicator]!==void 0){for(var X=[],$=0;$<w.session.rules[F.indicator].length;$++){w.session.renamed_variables={};var oe=w.session.rules[F.indicator][$],xe=oe.rename(w);xe.body===null&&(xe.body=new j(\"true\",[]));var Te=w.get_flag(\"occurs_check\").indicator===\"true/0\",lt=x.unify(new j(\",\",[F,z]),new j(\",\",[xe.head,xe.body]),Te);if(lt!==null){var Ct=new Pe(b.goal.replace(new j(\",\",[new j(\"retract\",[new j(\":-\",[F,z])]),new j(\",\",[new j(\"=\",[F,xe.head]),new j(\"=\",[z,xe.body])])])),b.substitution,b);Ct.retract=oe,X.push(Ct)}}w.prepend(X)}}else w.throw_error(x.error.permission(\"modify\",\"static_procedure\",F.indicator,y.indicator));else Ae(w,b,F.indicator,b.retract)}},\"retractall/1\":function(w,b,y){var F=y.args[0];x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_callable(F)?w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"retract\",[new x.type.Term(\":-\",[F,new De(\"_\")])]),new j(\"fail\",[])])),b.substitution,b),new Pe(b.goal.replace(null),b.substitution,b)]):w.throw_error(x.error.type(\"callable\",F,y.indicator))},\"abolish/1\":function(w,b,y){if(x.type.is_variable(y.args[0])||x.type.is_term(y.args[0])&&y.args[0].indicator===\"//2\"&&(x.type.is_variable(y.args[0].args[0])||x.type.is_variable(y.args[0].args[1])))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_term(y.args[0])||y.args[0].indicator!==\"//2\")w.throw_error(x.error.type(\"predicate_indicator\",y.args[0],y.indicator));else if(!x.type.is_atom(y.args[0].args[0]))w.throw_error(x.error.type(\"atom\",y.args[0].args[0],y.indicator));else if(!x.type.is_integer(y.args[0].args[1]))w.throw_error(x.error.type(\"integer\",y.args[0].args[1],y.indicator));else if(y.args[0].args[1].value<0)w.throw_error(x.error.domain(\"not_less_than_zero\",y.args[0].args[1],y.indicator));else if(x.type.is_number(w.get_flag(\"max_arity\"))&&y.args[0].args[1].value>w.get_flag(\"max_arity\").value)w.throw_error(x.error.representation(\"max_arity\",y.indicator));else{var F=y.args[0].args[0].id+\"/\"+y.args[0].args[1].value;w.is_public_predicate(F)?(delete w.session.rules[F],w.success(b)):w.throw_error(x.error.permission(\"modify\",\"static_procedure\",F,y.indicator))}},\"atom_length/2\":function(w,b,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_atom(y.args[0]))w.throw_error(x.error.type(\"atom\",y.args[0],y.indicator));else if(!x.type.is_variable(y.args[1])&&!x.type.is_integer(y.args[1]))w.throw_error(x.error.type(\"integer\",y.args[1],y.indicator));else if(x.type.is_integer(y.args[1])&&y.args[1].value<0)w.throw_error(x.error.domain(\"not_less_than_zero\",y.args[1],y.indicator));else{var F=new Re(y.args[0].id.length,!1);w.prepend([new Pe(b.goal.replace(new j(\"=\",[F,y.args[1]])),b.substitution,b)])}},\"atom_concat/3\":function(w,b,y){var F,z,X=y.args[0],$=y.args[1],oe=y.args[2];if(x.type.is_variable(oe)&&(x.type.is_variable(X)||x.type.is_variable($)))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_atom(X))w.throw_error(x.error.type(\"atom\",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_atom($))w.throw_error(x.error.type(\"atom\",$,y.indicator));else if(!x.type.is_variable(oe)&&!x.type.is_atom(oe))w.throw_error(x.error.type(\"atom\",oe,y.indicator));else{var xe=x.type.is_variable(X),Te=x.type.is_variable($);if(!xe&&!Te)z=new j(\"=\",[oe,new j(X.id+$.id)]),w.prepend([new Pe(b.goal.replace(z),b.substitution,b)]);else if(xe&&!Te)F=oe.id.substr(0,oe.id.length-$.id.length),F+$.id===oe.id&&(z=new j(\"=\",[X,new j(F)]),w.prepend([new Pe(b.goal.replace(z),b.substitution,b)]));else if(Te&&!xe)F=oe.id.substr(X.id.length),X.id+F===oe.id&&(z=new j(\"=\",[$,new j(F)]),w.prepend([new Pe(b.goal.replace(z),b.substitution,b)]));else{for(var lt=[],Ct=0;Ct<=oe.id.length;Ct++){var qt=new j(oe.id.substr(0,Ct)),ir=new j(oe.id.substr(Ct));z=new j(\",\",[new j(\"=\",[qt,X]),new j(\"=\",[ir,$])]),lt.push(new Pe(b.goal.replace(z),b.substitution,b))}w.prepend(lt)}}},\"sub_atom/5\":function(w,b,y){var F,z=y.args[0],X=y.args[1],$=y.args[2],oe=y.args[3],xe=y.args[4];if(x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_integer(X))w.throw_error(x.error.type(\"integer\",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_integer($))w.throw_error(x.error.type(\"integer\",$,y.indicator));else if(!x.type.is_variable(oe)&&!x.type.is_integer(oe))w.throw_error(x.error.type(\"integer\",oe,y.indicator));else if(x.type.is_integer(X)&&X.value<0)w.throw_error(x.error.domain(\"not_less_than_zero\",X,y.indicator));else if(x.type.is_integer($)&&$.value<0)w.throw_error(x.error.domain(\"not_less_than_zero\",$,y.indicator));else if(x.type.is_integer(oe)&&oe.value<0)w.throw_error(x.error.domain(\"not_less_than_zero\",oe,y.indicator));else{var Te=[],lt=[],Ct=[];if(x.type.is_variable(X))for(F=0;F<=z.id.length;F++)Te.push(F);else Te.push(X.value);if(x.type.is_variable($))for(F=0;F<=z.id.length;F++)lt.push(F);else lt.push($.value);if(x.type.is_variable(oe))for(F=0;F<=z.id.length;F++)Ct.push(F);else Ct.push(oe.value);var qt=[];for(var ir in Te)if(Te.hasOwnProperty(ir)){F=Te[ir];for(var Pt in lt)if(lt.hasOwnProperty(Pt)){var gn=lt[Pt],Pr=z.id.length-F-gn;if(e(Ct,Pr)!==-1&&F+gn+Pr===z.id.length){var Ir=z.id.substr(F,gn);if(z.id===z.id.substr(0,F)+Ir+z.id.substr(F+gn,Pr)){var Or=new j(\"=\",[new j(Ir),xe]),on=new j(\"=\",[X,new Re(F)]),ai=new j(\"=\",[$,new Re(gn)]),Io=new j(\"=\",[oe,new Re(Pr)]),rs=new j(\",\",[new j(\",\",[new j(\",\",[on,ai]),Io]),Or]);qt.push(new Pe(b.goal.replace(rs),b.substitution,b))}}}}w.prepend(qt)}},\"atom_chars/2\":function(w,b,y){var F=y.args[0],z=y.args[1];if(x.type.is_variable(F)&&x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_atom(F))w.throw_error(x.error.type(\"atom\",F,y.indicator));else if(x.type.is_variable(F)){for(var oe=z,xe=x.type.is_variable(F),Te=\"\";oe.indicator===\"./2\";){if(x.type.is_character(oe.args[0]))Te+=oe.args[0].id;else if(x.type.is_variable(oe.args[0])&&xe){w.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_variable(oe.args[0])){w.throw_error(x.error.type(\"character\",oe.args[0],y.indicator));return}oe=oe.args[1]}x.type.is_variable(oe)&&xe?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_empty_list(oe)&&!x.type.is_variable(oe)?w.throw_error(x.error.type(\"list\",z,y.indicator)):w.prepend([new Pe(b.goal.replace(new j(\"=\",[new j(Te),F])),b.substitution,b)])}else{for(var X=new j(\"[]\"),$=F.id.length-1;$>=0;$--)X=new j(\".\",[new j(F.id.charAt($)),X]);w.prepend([new Pe(b.goal.replace(new j(\"=\",[z,X])),b.substitution,b)])}},\"atom_codes/2\":function(w,b,y){var F=y.args[0],z=y.args[1];if(x.type.is_variable(F)&&x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_atom(F))w.throw_error(x.error.type(\"atom\",F,y.indicator));else if(x.type.is_variable(F)){for(var oe=z,xe=x.type.is_variable(F),Te=\"\";oe.indicator===\"./2\";){if(x.type.is_character_code(oe.args[0]))Te+=c(oe.args[0].value);else if(x.type.is_variable(oe.args[0])&&xe){w.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_variable(oe.args[0])){w.throw_error(x.error.representation(\"character_code\",y.indicator));return}oe=oe.args[1]}x.type.is_variable(oe)&&xe?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_empty_list(oe)&&!x.type.is_variable(oe)?w.throw_error(x.error.type(\"list\",z,y.indicator)):w.prepend([new Pe(b.goal.replace(new j(\"=\",[new j(Te),F])),b.substitution,b)])}else{for(var X=new j(\"[]\"),$=F.id.length-1;$>=0;$--)X=new j(\".\",[new Re(n(F.id,$),!1),X]);w.prepend([new Pe(b.goal.replace(new j(\"=\",[z,X])),b.substitution,b)])}},\"char_code/2\":function(w,b,y){var F=y.args[0],z=y.args[1];if(x.type.is_variable(F)&&x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_character(F))w.throw_error(x.error.type(\"character\",F,y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_integer(z))w.throw_error(x.error.type(\"integer\",z,y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_character_code(z))w.throw_error(x.error.representation(\"character_code\",y.indicator));else if(x.type.is_variable(z)){var X=new Re(n(F.id,0),!1);w.prepend([new Pe(b.goal.replace(new j(\"=\",[X,z])),b.substitution,b)])}else{var $=new j(c(z.value));w.prepend([new Pe(b.goal.replace(new j(\"=\",[$,F])),b.substitution,b)])}},\"number_chars/2\":function(w,b,y){var F,z=y.args[0],X=y.args[1];if(x.type.is_variable(z)&&x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_number(z))w.throw_error(x.error.type(\"number\",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))w.throw_error(x.error.type(\"list\",X,y.indicator));else{var $=x.type.is_variable(z);if(!x.type.is_variable(X)){var oe=X,xe=!0;for(F=\"\";oe.indicator===\"./2\";){if(x.type.is_character(oe.args[0]))F+=oe.args[0].id;else if(x.type.is_variable(oe.args[0]))xe=!1;else if(!x.type.is_variable(oe.args[0])){w.throw_error(x.error.type(\"character\",oe.args[0],y.indicator));return}oe=oe.args[1]}if(xe=xe&&x.type.is_empty_list(oe),!x.type.is_empty_list(oe)&&!x.type.is_variable(oe)){w.throw_error(x.error.type(\"list\",X,y.indicator));return}if(!xe&&$){w.throw_error(x.error.instantiation(y.indicator));return}else if(xe)if(x.type.is_variable(oe)&&$){w.throw_error(x.error.instantiation(y.indicator));return}else{var Te=w.parse(F),lt=Te.value;!x.type.is_number(lt)||Te.tokens[Te.tokens.length-1].space?w.throw_error(x.error.syntax_by_predicate(\"parseable_number\",y.indicator)):w.prepend([new Pe(b.goal.replace(new j(\"=\",[z,lt])),b.substitution,b)]);return}}if(!$){F=z.toString();for(var Ct=new j(\"[]\"),qt=F.length-1;qt>=0;qt--)Ct=new j(\".\",[new j(F.charAt(qt)),Ct]);w.prepend([new Pe(b.goal.replace(new j(\"=\",[X,Ct])),b.substitution,b)])}}},\"number_codes/2\":function(w,b,y){var F,z=y.args[0],X=y.args[1];if(x.type.is_variable(z)&&x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_number(z))w.throw_error(x.error.type(\"number\",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))w.throw_error(x.error.type(\"list\",X,y.indicator));else{var $=x.type.is_variable(z);if(!x.type.is_variable(X)){var oe=X,xe=!0;for(F=\"\";oe.indicator===\"./2\";){if(x.type.is_character_code(oe.args[0]))F+=c(oe.args[0].value);else if(x.type.is_variable(oe.args[0]))xe=!1;else if(!x.type.is_variable(oe.args[0])){w.throw_error(x.error.type(\"character_code\",oe.args[0],y.indicator));return}oe=oe.args[1]}if(xe=xe&&x.type.is_empty_list(oe),!x.type.is_empty_list(oe)&&!x.type.is_variable(oe)){w.throw_error(x.error.type(\"list\",X,y.indicator));return}if(!xe&&$){w.throw_error(x.error.instantiation(y.indicator));return}else if(xe)if(x.type.is_variable(oe)&&$){w.throw_error(x.error.instantiation(y.indicator));return}else{var Te=w.parse(F),lt=Te.value;!x.type.is_number(lt)||Te.tokens[Te.tokens.length-1].space?w.throw_error(x.error.syntax_by_predicate(\"parseable_number\",y.indicator)):w.prepend([new Pe(b.goal.replace(new j(\"=\",[z,lt])),b.substitution,b)]);return}}if(!$){F=z.toString();for(var Ct=new j(\"[]\"),qt=F.length-1;qt>=0;qt--)Ct=new j(\".\",[new Re(n(F,qt),!1),Ct]);w.prepend([new Pe(b.goal.replace(new j(\"=\",[X,Ct])),b.substitution,b)])}}},\"upcase_atom/2\":function(w,b,y){var F=y.args[0],z=y.args[1];x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(F)?!x.type.is_variable(z)&&!x.type.is_atom(z)?w.throw_error(x.error.type(\"atom\",z,y.indicator)):w.prepend([new Pe(b.goal.replace(new j(\"=\",[z,new j(F.id.toUpperCase(),[])])),b.substitution,b)]):w.throw_error(x.error.type(\"atom\",F,y.indicator))},\"downcase_atom/2\":function(w,b,y){var F=y.args[0],z=y.args[1];x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(F)?!x.type.is_variable(z)&&!x.type.is_atom(z)?w.throw_error(x.error.type(\"atom\",z,y.indicator)):w.prepend([new Pe(b.goal.replace(new j(\"=\",[z,new j(F.id.toLowerCase(),[])])),b.substitution,b)]):w.throw_error(x.error.type(\"atom\",F,y.indicator))},\"atomic_list_concat/2\":function(w,b,y){var F=y.args[0],z=y.args[1];w.prepend([new Pe(b.goal.replace(new j(\"atomic_list_concat\",[F,new j(\"\",[]),z])),b.substitution,b)])},\"atomic_list_concat/3\":function(w,b,y){var F=y.args[0],z=y.args[1],X=y.args[2];if(x.type.is_variable(z)||x.type.is_variable(F)&&x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_list(F))w.throw_error(x.error.type(\"list\",F,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_atom(X))w.throw_error(x.error.type(\"atom\",X,y.indicator));else if(x.type.is_variable(X)){for(var oe=\"\",xe=F;x.type.is_term(xe)&&xe.indicator===\"./2\";){if(!x.type.is_atom(xe.args[0])&&!x.type.is_number(xe.args[0])){w.throw_error(x.error.type(\"atomic\",xe.args[0],y.indicator));return}oe!==\"\"&&(oe+=z.id),x.type.is_atom(xe.args[0])?oe+=xe.args[0].id:oe+=\"\"+xe.args[0].value,xe=xe.args[1]}oe=new j(oe,[]),x.type.is_variable(xe)?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_term(xe)||xe.indicator!==\"[]/0\"?w.throw_error(x.error.type(\"list\",F,y.indicator)):w.prepend([new Pe(b.goal.replace(new j(\"=\",[oe,X])),b.substitution,b)])}else{var $=g(s(X.id.split(z.id),function(Te){return new j(Te,[])}));w.prepend([new Pe(b.goal.replace(new j(\"=\",[$,F])),b.substitution,b)])}},\"@=</2\":function(w,b,y){x.compare(y.args[0],y.args[1])<=0&&w.success(b)},\"==/2\":function(w,b,y){x.compare(y.args[0],y.args[1])===0&&w.success(b)},\"\\\\==/2\":function(w,b,y){x.compare(y.args[0],y.args[1])!==0&&w.success(b)},\"@</2\":function(w,b,y){x.compare(y.args[0],y.args[1])<0&&w.success(b)},\"@>/2\":function(w,b,y){x.compare(y.args[0],y.args[1])>0&&w.success(b)},\"@>=/2\":function(w,b,y){x.compare(y.args[0],y.args[1])>=0&&w.success(b)},\"compare/3\":function(w,b,y){var F=y.args[0],z=y.args[1],X=y.args[2];if(!x.type.is_variable(F)&&!x.type.is_atom(F))w.throw_error(x.error.type(\"atom\",F,y.indicator));else if(x.type.is_atom(F)&&[\"<\",\">\",\"=\"].indexOf(F.id)===-1)w.throw_error(x.type.domain(\"order\",F,y.indicator));else{var $=x.compare(z,X);$=$===0?\"=\":$===-1?\"<\":\">\",w.prepend([new Pe(b.goal.replace(new j(\"=\",[F,new j($,[])])),b.substitution,b)])}},\"is/2\":function(w,b,y){var F=y.args[1].interpret(w);x.type.is_number(F)?w.prepend([new Pe(b.goal.replace(new j(\"=\",[y.args[0],F],w.level)),b.substitution,b)]):w.throw_error(F)},\"between/3\":function(w,b,y){var F=y.args[0],z=y.args[1],X=y.args[2];if(x.type.is_variable(F)||x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_integer(F))w.throw_error(x.error.type(\"integer\",F,y.indicator));else if(!x.type.is_integer(z))w.throw_error(x.error.type(\"integer\",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_integer(X))w.throw_error(x.error.type(\"integer\",X,y.indicator));else if(x.type.is_variable(X)){var $=[new Pe(b.goal.replace(new j(\"=\",[X,F])),b.substitution,b)];F.value<z.value&&$.push(new Pe(b.goal.replace(new j(\"between\",[new Re(F.value+1,!1),z,X])),b.substitution,b)),w.prepend($)}else F.value<=X.value&&z.value>=X.value&&w.success(b)},\"succ/2\":function(w,b,y){var F=y.args[0],z=y.args[1];x.type.is_variable(F)&&x.type.is_variable(z)?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_variable(F)&&!x.type.is_integer(F)?w.throw_error(x.error.type(\"integer\",F,y.indicator)):!x.type.is_variable(z)&&!x.type.is_integer(z)?w.throw_error(x.error.type(\"integer\",z,y.indicator)):!x.type.is_variable(F)&&F.value<0?w.throw_error(x.error.domain(\"not_less_than_zero\",F,y.indicator)):!x.type.is_variable(z)&&z.value<0?w.throw_error(x.error.domain(\"not_less_than_zero\",z,y.indicator)):(x.type.is_variable(z)||z.value>0)&&(x.type.is_variable(F)?w.prepend([new Pe(b.goal.replace(new j(\"=\",[F,new Re(z.value-1,!1)])),b.substitution,b)]):w.prepend([new Pe(b.goal.replace(new j(\"=\",[z,new Re(F.value+1,!1)])),b.substitution,b)]))},\"=:=/2\":function(w,b,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F===0&&w.success(b)},\"=\\\\=/2\":function(w,b,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F!==0&&w.success(b)},\"</2\":function(w,b,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F<0&&w.success(b)},\"=</2\":function(w,b,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F<=0&&w.success(b)},\">/2\":function(w,b,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F>0&&w.success(b)},\">=/2\":function(w,b,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F>=0&&w.success(b)},\"var/1\":function(w,b,y){x.type.is_variable(y.args[0])&&w.success(b)},\"atom/1\":function(w,b,y){x.type.is_atom(y.args[0])&&w.success(b)},\"atomic/1\":function(w,b,y){x.type.is_atomic(y.args[0])&&w.success(b)},\"compound/1\":function(w,b,y){x.type.is_compound(y.args[0])&&w.success(b)},\"integer/1\":function(w,b,y){x.type.is_integer(y.args[0])&&w.success(b)},\"float/1\":function(w,b,y){x.type.is_float(y.args[0])&&w.success(b)},\"number/1\":function(w,b,y){x.type.is_number(y.args[0])&&w.success(b)},\"nonvar/1\":function(w,b,y){x.type.is_variable(y.args[0])||w.success(b)},\"ground/1\":function(w,b,y){y.variables().length===0&&w.success(b)},\"acyclic_term/1\":function(w,b,y){for(var F=b.substitution.apply(b.substitution),z=y.args[0].variables(),X=0;X<z.length;X++)if(b.substitution.links[z[X]]!==void 0&&!b.substitution.links[z[X]].equals(F.links[z[X]]))return;w.success(b)},\"callable/1\":function(w,b,y){x.type.is_callable(y.args[0])&&w.success(b)},\"is_list/1\":function(w,b,y){for(var F=y.args[0];x.type.is_term(F)&&F.indicator===\"./2\";)F=F.args[1];x.type.is_term(F)&&F.indicator===\"[]/0\"&&w.success(b)},\"current_input/1\":function(w,b,y){var F=y.args[0];!x.type.is_variable(F)&&!x.type.is_stream(F)&&!x.type.is_atom(F)?w.throw_error(x.error.domain(\"stream\",F,y.indicator)):(x.type.is_atom(F)&&w.get_stream_by_alias(F.id)&&(F=w.get_stream_by_alias(F.id)),w.prepend([new Pe(b.goal.replace(new j(\"=\",[F,w.get_current_input()])),b.substitution,b)]))},\"current_output/1\":function(w,b,y){var F=y.args[0];!x.type.is_variable(F)&&!x.type.is_stream(F)&&!x.type.is_atom(F)?w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator)):(x.type.is_atom(F)&&w.get_stream_by_alias(F.id)&&(F=w.get_stream_by_alias(F.id)),w.prepend([new Pe(b.goal.replace(new j(\"=\",[F,w.get_current_output()])),b.substitution,b)]))},\"set_input/1\":function(w,b,y){var F=y.args[0],z=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_variable(F)&&!x.type.is_stream(F)&&!x.type.is_atom(F)?w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator)):x.type.is_stream(z)?z.output===!0?w.throw_error(x.error.permission(\"input\",\"stream\",F,y.indicator)):(w.set_current_input(z),w.success(b)):w.throw_error(x.error.existence(\"stream\",F,y.indicator))},\"set_output/1\":function(w,b,y){var F=y.args[0],z=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_variable(F)&&!x.type.is_stream(F)&&!x.type.is_atom(F)?w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator)):x.type.is_stream(z)?z.input===!0?w.throw_error(x.error.permission(\"output\",\"stream\",F,y.indicator)):(w.set_current_output(z),w.success(b)):w.throw_error(x.error.existence(\"stream\",F,y.indicator))},\"open/3\":function(w,b,y){var F=y.args[0],z=y.args[1],X=y.args[2];w.prepend([new Pe(b.goal.replace(new j(\"open\",[F,z,X,new j(\"[]\",[])])),b.substitution,b)])},\"open/4\":function(w,b,y){var F=y.args[0],z=y.args[1],X=y.args[2],$=y.args[3];if(x.type.is_variable(F)||x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_atom(z))w.throw_error(x.error.type(\"atom\",z,y.indicator));else if(!x.type.is_list($))w.throw_error(x.error.type(\"list\",$,y.indicator));else if(!x.type.is_variable(X))w.throw_error(x.error.type(\"variable\",X,y.indicator));else if(!x.type.is_atom(F)&&!x.type.is_streamable(F))w.throw_error(x.error.domain(\"source_sink\",F,y.indicator));else if(!x.type.is_io_mode(z))w.throw_error(x.error.domain(\"io_mode\",z,y.indicator));else{for(var oe={},xe=$,Te;x.type.is_term(xe)&&xe.indicator===\"./2\";){if(Te=xe.args[0],x.type.is_variable(Te)){w.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_stream_option(Te)){w.throw_error(x.error.domain(\"stream_option\",Te,y.indicator));return}oe[Te.id]=Te.args[0].id,xe=xe.args[1]}if(xe.indicator!==\"[]/0\"){x.type.is_variable(xe)?w.throw_error(x.error.instantiation(y.indicator)):w.throw_error(x.error.type(\"list\",$,y.indicator));return}else{var lt=oe.alias;if(lt&&w.get_stream_by_alias(lt)){w.throw_error(x.error.permission(\"open\",\"source_sink\",new j(\"alias\",[new j(lt,[])]),y.indicator));return}oe.type||(oe.type=\"text\");var Ct;if(x.type.is_atom(F)?Ct=w.file_system_open(F.id,oe.type,z.id):Ct=F.stream(oe.type,z.id),Ct===!1){w.throw_error(x.error.permission(\"open\",\"source_sink\",F,y.indicator));return}else if(Ct===null){w.throw_error(x.error.existence(\"source_sink\",F,y.indicator));return}var qt=new Fe(Ct,z.id,oe.alias,oe.type,oe.reposition===\"true\",oe.eof_action);lt?w.session.streams[lt]=qt:w.session.streams[qt.id]=qt,w.prepend([new Pe(b.goal.replace(new j(\"=\",[X,qt])),b.substitution,b)])}}},\"close/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\"close\",[F,new j(\"[]\",[])])),b.substitution,b)])},\"close/2\":function(w,b,y){var F=y.args[0],z=y.args[1],X=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(x.type.is_variable(F)||x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_list(z))w.throw_error(x.error.type(\"list\",z,y.indicator));else if(!x.type.is_stream(F)&&!x.type.is_atom(F))w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator));else if(!x.type.is_stream(X)||X.stream===null)w.throw_error(x.error.existence(\"stream\",F,y.indicator));else{for(var $={},oe=z,xe;x.type.is_term(oe)&&oe.indicator===\"./2\";){if(xe=oe.args[0],x.type.is_variable(xe)){w.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_close_option(xe)){w.throw_error(x.error.domain(\"close_option\",xe,y.indicator));return}$[xe.id]=xe.args[0].id===\"true\",oe=oe.args[1]}if(oe.indicator!==\"[]/0\"){x.type.is_variable(oe)?w.throw_error(x.error.instantiation(y.indicator)):w.throw_error(x.error.type(\"list\",z,y.indicator));return}else{if(X===w.session.standard_input||X===w.session.standard_output){w.success(b);return}else X===w.session.current_input?w.session.current_input=w.session.standard_input:X===w.session.current_output&&(w.session.current_output=w.session.current_output);X.alias!==null?delete w.session.streams[X.alias]:delete w.session.streams[X.id],X.output&&X.stream.flush();var Te=X.stream.close();X.stream=null,($.force===!0||Te===!0)&&w.success(b)}}},\"flush_output/0\":function(w,b,y){w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_output\",[new De(\"S\")]),new j(\"flush_output\",[new De(\"S\")])])),b.substitution,b)])},\"flush_output/1\":function(w,b,y){var F=y.args[0],z=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_stream(F)&&!x.type.is_atom(F)?w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator)):!x.type.is_stream(z)||z.stream===null?w.throw_error(x.error.existence(\"stream\",F,y.indicator)):F.input===!0?w.throw_error(x.error.permission(\"output\",\"stream\",output,y.indicator)):(z.stream.flush(),w.success(b))},\"stream_property/2\":function(w,b,y){var F=y.args[0],z=y.args[1],X=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(!x.type.is_variable(F)&&!x.type.is_stream(F)&&!x.type.is_atom(F))w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator));else if(!x.type.is_variable(F)&&(!x.type.is_stream(X)||X.stream===null))w.throw_error(x.error.existence(\"stream\",F,y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_stream_property(z))w.throw_error(x.error.domain(\"stream_property\",z,y.indicator));else{var $=[],oe=[];if(!x.type.is_variable(F))$.push(X);else for(var xe in w.session.streams)$.push(w.session.streams[xe]);for(var Te=0;Te<$.length;Te++){var lt=[];$[Te].filename&&lt.push(new j(\"file_name\",[new j($[Te].file_name,[])])),lt.push(new j(\"mode\",[new j($[Te].mode,[])])),lt.push(new j($[Te].input?\"input\":\"output\",[])),$[Te].alias&&lt.push(new j(\"alias\",[new j($[Te].alias,[])])),lt.push(new j(\"position\",[typeof $[Te].position==\"number\"?new Re($[Te].position,!1):new j($[Te].position,[])])),lt.push(new j(\"end_of_stream\",[new j($[Te].position===\"end_of_stream\"?\"at\":$[Te].position===\"past_end_of_stream\"?\"past\":\"not\",[])])),lt.push(new j(\"eof_action\",[new j($[Te].eof_action,[])])),lt.push(new j(\"reposition\",[new j($[Te].reposition?\"true\":\"false\",[])])),lt.push(new j(\"type\",[new j($[Te].type,[])]));for(var Ct=0;Ct<lt.length;Ct++)oe.push(new Pe(b.goal.replace(new j(\",\",[new j(\"=\",[x.type.is_variable(F)?F:X,$[Te]]),new j(\"=\",[z,lt[Ct]])])),b.substitution,b))}w.prepend(oe)}},\"at_end_of_stream/0\":function(w,b,y){w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_input\",[new De(\"S\")]),new j(\",\",[new j(\"stream_property\",[new De(\"S\"),new j(\"end_of_stream\",[new De(\"E\")])]),new j(\",\",[new j(\"!\",[]),new j(\";\",[new j(\"=\",[new De(\"E\"),new j(\"at\",[])]),new j(\"=\",[new De(\"E\"),new j(\"past\",[])])])])])])),b.substitution,b)])},\"at_end_of_stream/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"stream_property\",[F,new j(\"end_of_stream\",[new De(\"E\")])]),new j(\",\",[new j(\"!\",[]),new j(\";\",[new j(\"=\",[new De(\"E\"),new j(\"at\",[])]),new j(\"=\",[new De(\"E\"),new j(\"past\",[])])])])])),b.substitution,b)])},\"set_stream_position/2\":function(w,b,y){var F=y.args[0],z=y.args[1],X=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);x.type.is_variable(F)||x.type.is_variable(z)?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_stream(F)&&!x.type.is_atom(F)?w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator)):!x.type.is_stream(X)||X.stream===null?w.throw_error(x.error.existence(\"stream\",F,y.indicator)):x.type.is_stream_position(z)?X.reposition===!1?w.throw_error(x.error.permission(\"reposition\",\"stream\",F,y.indicator)):(x.type.is_integer(z)?X.position=z.value:X.position=z.id,w.success(b)):w.throw_error(x.error.domain(\"stream_position\",z,y.indicator))},\"get_char/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_input\",[new De(\"S\")]),new j(\"get_char\",[new De(\"S\"),F])])),b.substitution,b)])},\"get_char/2\":function(w,b,y){var F=y.args[0],z=y.args[1],X=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(x.type.is_variable(F))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_character(z))w.throw_error(x.error.type(\"in_character\",z,y.indicator));else if(!x.type.is_stream(F)&&!x.type.is_atom(F))w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator));else if(!x.type.is_stream(X)||X.stream===null)w.throw_error(x.error.existence(\"stream\",F,y.indicator));else if(X.output)w.throw_error(x.error.permission(\"input\",\"stream\",F,y.indicator));else if(X.type===\"binary\")w.throw_error(x.error.permission(\"input\",\"binary_stream\",F,y.indicator));else if(X.position===\"past_end_of_stream\"&&X.eof_action===\"error\")w.throw_error(x.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{var $;if(X.position===\"end_of_stream\")$=\"end_of_file\",X.position=\"past_end_of_stream\";else{if($=X.stream.get(1,X.position),$===null){w.throw_error(x.error.representation(\"character\",y.indicator));return}X.position++}w.prepend([new Pe(b.goal.replace(new j(\"=\",[new j($,[]),z])),b.substitution,b)])}},\"get_code/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_input\",[new De(\"S\")]),new j(\"get_code\",[new De(\"S\"),F])])),b.substitution,b)])},\"get_code/2\":function(w,b,y){var F=y.args[0],z=y.args[1],X=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(x.type.is_variable(F))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_integer(z))w.throw_error(x.error.type(\"integer\",char,y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_stream(F)&&!x.type.is_atom(F))w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator));else if(!x.type.is_stream(X)||X.stream===null)w.throw_error(x.error.existence(\"stream\",F,y.indicator));else if(X.output)w.throw_error(x.error.permission(\"input\",\"stream\",F,y.indicator));else if(X.type===\"binary\")w.throw_error(x.error.permission(\"input\",\"binary_stream\",F,y.indicator));else if(X.position===\"past_end_of_stream\"&&X.eof_action===\"error\")w.throw_error(x.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{var $;if(X.position===\"end_of_stream\")$=-1,X.position=\"past_end_of_stream\";else{if($=X.stream.get(1,X.position),$===null){w.throw_error(x.error.representation(\"character\",y.indicator));return}$=n($,0),X.position++}w.prepend([new Pe(b.goal.replace(new j(\"=\",[new Re($,!1),z])),b.substitution,b)])}},\"peek_char/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_input\",[new De(\"S\")]),new j(\"peek_char\",[new De(\"S\"),F])])),b.substitution,b)])},\"peek_char/2\":function(w,b,y){var F=y.args[0],z=y.args[1],X=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(x.type.is_variable(F))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_character(z))w.throw_error(x.error.type(\"in_character\",z,y.indicator));else if(!x.type.is_stream(F)&&!x.type.is_atom(F))w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator));else if(!x.type.is_stream(X)||X.stream===null)w.throw_error(x.error.existence(\"stream\",F,y.indicator));else if(X.output)w.throw_error(x.error.permission(\"input\",\"stream\",F,y.indicator));else if(X.type===\"binary\")w.throw_error(x.error.permission(\"input\",\"binary_stream\",F,y.indicator));else if(X.position===\"past_end_of_stream\"&&X.eof_action===\"error\")w.throw_error(x.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{var $;if(X.position===\"end_of_stream\")$=\"end_of_file\",X.position=\"past_end_of_stream\";else if($=X.stream.get(1,X.position),$===null){w.throw_error(x.error.representation(\"character\",y.indicator));return}w.prepend([new Pe(b.goal.replace(new j(\"=\",[new j($,[]),z])),b.substitution,b)])}},\"peek_code/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_input\",[new De(\"S\")]),new j(\"peek_code\",[new De(\"S\"),F])])),b.substitution,b)])},\"peek_code/2\":function(w,b,y){var F=y.args[0],z=y.args[1],X=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(x.type.is_variable(F))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_integer(z))w.throw_error(x.error.type(\"integer\",char,y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_stream(F)&&!x.type.is_atom(F))w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator));else if(!x.type.is_stream(X)||X.stream===null)w.throw_error(x.error.existence(\"stream\",F,y.indicator));else if(X.output)w.throw_error(x.error.permission(\"input\",\"stream\",F,y.indicator));else if(X.type===\"binary\")w.throw_error(x.error.permission(\"input\",\"binary_stream\",F,y.indicator));else if(X.position===\"past_end_of_stream\"&&X.eof_action===\"error\")w.throw_error(x.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{var $;if(X.position===\"end_of_stream\")$=-1,X.position=\"past_end_of_stream\";else{if($=X.stream.get(1,X.position),$===null){w.throw_error(x.error.representation(\"character\",y.indicator));return}$=n($,0)}w.prepend([new Pe(b.goal.replace(new j(\"=\",[new Re($,!1),z])),b.substitution,b)])}},\"put_char/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_output\",[new De(\"S\")]),new j(\"put_char\",[new De(\"S\"),F])])),b.substitution,b)])},\"put_char/2\":function(w,b,y){var F=y.args[0],z=y.args[1],X=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);x.type.is_variable(F)||x.type.is_variable(z)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_character(z)?!x.type.is_variable(F)&&!x.type.is_stream(F)&&!x.type.is_atom(F)?w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator)):!x.type.is_stream(X)||X.stream===null?w.throw_error(x.error.existence(\"stream\",F,y.indicator)):X.input?w.throw_error(x.error.permission(\"output\",\"stream\",F,y.indicator)):X.type===\"binary\"?w.throw_error(x.error.permission(\"output\",\"binary_stream\",F,y.indicator)):X.stream.put(z.id,X.position)&&(typeof X.position==\"number\"&&X.position++,w.success(b)):w.throw_error(x.error.type(\"character\",z,y.indicator))},\"put_code/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_output\",[new De(\"S\")]),new j(\"put_code\",[new De(\"S\"),F])])),b.substitution,b)])},\"put_code/2\":function(w,b,y){var F=y.args[0],z=y.args[1],X=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);x.type.is_variable(F)||x.type.is_variable(z)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_integer(z)?x.type.is_character_code(z)?!x.type.is_variable(F)&&!x.type.is_stream(F)&&!x.type.is_atom(F)?w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator)):!x.type.is_stream(X)||X.stream===null?w.throw_error(x.error.existence(\"stream\",F,y.indicator)):X.input?w.throw_error(x.error.permission(\"output\",\"stream\",F,y.indicator)):X.type===\"binary\"?w.throw_error(x.error.permission(\"output\",\"binary_stream\",F,y.indicator)):X.stream.put_char(c(z.value),X.position)&&(typeof X.position==\"number\"&&X.position++,w.success(b)):w.throw_error(x.error.representation(\"character_code\",y.indicator)):w.throw_error(x.error.type(\"integer\",z,y.indicator))},\"nl/0\":function(w,b,y){w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_output\",[new De(\"S\")]),new j(\"put_char\",[new De(\"S\"),new j(`\n`,[])])])),b.substitution,b)])},\"nl/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\"put_char\",[F,new j(`\n`,[])])),b.substitution,b)])},\"get_byte/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_input\",[new De(\"S\")]),new j(\"get_byte\",[new De(\"S\"),F])])),b.substitution,b)])},\"get_byte/2\":function(w,b,y){var F=y.args[0],z=y.args[1],X=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(x.type.is_variable(F))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_byte(z))w.throw_error(x.error.type(\"in_byte\",char,y.indicator));else if(!x.type.is_stream(F)&&!x.type.is_atom(F))w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator));else if(!x.type.is_stream(X)||X.stream===null)w.throw_error(x.error.existence(\"stream\",F,y.indicator));else if(X.output)w.throw_error(x.error.permission(\"input\",\"stream\",F,y.indicator));else if(X.type===\"text\")w.throw_error(x.error.permission(\"input\",\"text_stream\",F,y.indicator));else if(X.position===\"past_end_of_stream\"&&X.eof_action===\"error\")w.throw_error(x.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{var $;if(X.position===\"end_of_stream\")$=\"end_of_file\",X.position=\"past_end_of_stream\";else{if($=X.stream.get_byte(X.position),$===null){w.throw_error(x.error.representation(\"byte\",y.indicator));return}X.position++}w.prepend([new Pe(b.goal.replace(new j(\"=\",[new Re($,!1),z])),b.substitution,b)])}},\"peek_byte/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_input\",[new De(\"S\")]),new j(\"peek_byte\",[new De(\"S\"),F])])),b.substitution,b)])},\"peek_byte/2\":function(w,b,y){var F=y.args[0],z=y.args[1],X=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(x.type.is_variable(F))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_byte(z))w.throw_error(x.error.type(\"in_byte\",char,y.indicator));else if(!x.type.is_stream(F)&&!x.type.is_atom(F))w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator));else if(!x.type.is_stream(X)||X.stream===null)w.throw_error(x.error.existence(\"stream\",F,y.indicator));else if(X.output)w.throw_error(x.error.permission(\"input\",\"stream\",F,y.indicator));else if(X.type===\"text\")w.throw_error(x.error.permission(\"input\",\"text_stream\",F,y.indicator));else if(X.position===\"past_end_of_stream\"&&X.eof_action===\"error\")w.throw_error(x.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{var $;if(X.position===\"end_of_stream\")$=\"end_of_file\",X.position=\"past_end_of_stream\";else if($=X.stream.get_byte(X.position),$===null){w.throw_error(x.error.representation(\"byte\",y.indicator));return}w.prepend([new Pe(b.goal.replace(new j(\"=\",[new Re($,!1),z])),b.substitution,b)])}},\"put_byte/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_output\",[new De(\"S\")]),new j(\"put_byte\",[new De(\"S\"),F])])),b.substitution,b)])},\"put_byte/2\":function(w,b,y){var F=y.args[0],z=y.args[1],X=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);x.type.is_variable(F)||x.type.is_variable(z)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_byte(z)?!x.type.is_variable(F)&&!x.type.is_stream(F)&&!x.type.is_atom(F)?w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator)):!x.type.is_stream(X)||X.stream===null?w.throw_error(x.error.existence(\"stream\",F,y.indicator)):X.input?w.throw_error(x.error.permission(\"output\",\"stream\",F,y.indicator)):X.type===\"text\"?w.throw_error(x.error.permission(\"output\",\"text_stream\",F,y.indicator)):X.stream.put_byte(z.value,X.position)&&(typeof X.position==\"number\"&&X.position++,w.success(b)):w.throw_error(x.error.type(\"byte\",z,y.indicator))},\"read/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_input\",[new De(\"S\")]),new j(\"read_term\",[new De(\"S\"),F,new j(\"[]\",[])])])),b.substitution,b)])},\"read/2\":function(w,b,y){var F=y.args[0],z=y.args[1];w.prepend([new Pe(b.goal.replace(new j(\"read_term\",[F,z,new j(\"[]\",[])])),b.substitution,b)])},\"read_term/2\":function(w,b,y){var F=y.args[0],z=y.args[1];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_input\",[new De(\"S\")]),new j(\"read_term\",[new De(\"S\"),F,z])])),b.substitution,b)])},\"read_term/3\":function(w,b,y){var F=y.args[0],z=y.args[1],X=y.args[2],$=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(x.type.is_variable(F)||x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_list(X))w.throw_error(x.error.type(\"list\",X,y.indicator));else if(!x.type.is_stream(F)&&!x.type.is_atom(F))w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator));else if(!x.type.is_stream($)||$.stream===null)w.throw_error(x.error.existence(\"stream\",F,y.indicator));else if($.output)w.throw_error(x.error.permission(\"input\",\"stream\",F,y.indicator));else if($.type===\"binary\")w.throw_error(x.error.permission(\"input\",\"binary_stream\",F,y.indicator));else if($.position===\"past_end_of_stream\"&&$.eof_action===\"error\")w.throw_error(x.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{for(var oe={},xe=X,Te;x.type.is_term(xe)&&xe.indicator===\"./2\";){if(Te=xe.args[0],x.type.is_variable(Te)){w.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_read_option(Te)){w.throw_error(x.error.domain(\"read_option\",Te,y.indicator));return}oe[Te.id]=Te.args[0],xe=xe.args[1]}if(xe.indicator!==\"[]/0\"){x.type.is_variable(xe)?w.throw_error(x.error.instantiation(y.indicator)):w.throw_error(x.error.type(\"list\",X,y.indicator));return}else{for(var lt,Ct,qt,ir=\"\",Pt=[],gn=null;gn===null||gn.name!==\"atom\"||gn.value!==\".\"||qt.type===f&&x.flatten_error(new j(\"throw\",[qt.value])).found===\"token_not_found\";){if(lt=$.stream.get(1,$.position),lt===null){w.throw_error(x.error.representation(\"character\",y.indicator));return}if(lt===\"end_of_file\"||lt===\"past_end_of_file\"){qt?w.throw_error(x.error.syntax(Pt[qt.len-1],\". or expression expected\",!1)):w.throw_error(x.error.syntax(null,\"token not found\",!0));return}$.position++,ir+=lt,Ct=new U(w),Ct.new_text(ir),Pt=Ct.get_tokens(),gn=Pt!==null&&Pt.length>0?Pt[Pt.length-1]:null,Pt!==null&&(qt=W(w,Pt,0,w.__get_max_priority(),!1))}if(qt.type===p&&qt.len===Pt.length-1&&gn.value===\".\"){qt=qt.value.rename(w);var Pr=new j(\"=\",[z,qt]);if(oe.variables){var Ir=g(s(ye(qt.variables()),function(Or){return new De(Or)}));Pr=new j(\",\",[Pr,new j(\"=\",[oe.variables,Ir])])}if(oe.variable_names){var Ir=g(s(ye(qt.variables()),function(on){var ai;for(ai in w.session.renamed_variables)if(w.session.renamed_variables.hasOwnProperty(ai)&&w.session.renamed_variables[ai]===on)break;return new j(\"=\",[new j(ai,[]),new De(on)])}));Pr=new j(\",\",[Pr,new j(\"=\",[oe.variable_names,Ir])])}if(oe.singletons){var Ir=g(s(new Ve(qt,null).singleton_variables(),function(on){var ai;for(ai in w.session.renamed_variables)if(w.session.renamed_variables.hasOwnProperty(ai)&&w.session.renamed_variables[ai]===on)break;return new j(\"=\",[new j(ai,[]),new De(on)])}));Pr=new j(\",\",[Pr,new j(\"=\",[oe.singletons,Ir])])}w.prepend([new Pe(b.goal.replace(Pr),b.substitution,b)])}else qt.type===p?w.throw_error(x.error.syntax(Pt[qt.len],\"unexpected token\",!1)):w.throw_error(qt.value)}}},\"write/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_output\",[new De(\"S\")]),new j(\"write\",[new De(\"S\"),F])])),b.substitution,b)])},\"write/2\":function(w,b,y){var F=y.args[0],z=y.args[1];w.prepend([new Pe(b.goal.replace(new j(\"write_term\",[F,z,new j(\".\",[new j(\"quoted\",[new j(\"false\",[])]),new j(\".\",[new j(\"ignore_ops\",[new j(\"false\")]),new j(\".\",[new j(\"numbervars\",[new j(\"true\")]),new j(\"[]\",[])])])])])),b.substitution,b)])},\"writeq/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_output\",[new De(\"S\")]),new j(\"writeq\",[new De(\"S\"),F])])),b.substitution,b)])},\"writeq/2\":function(w,b,y){var F=y.args[0],z=y.args[1];w.prepend([new Pe(b.goal.replace(new j(\"write_term\",[F,z,new j(\".\",[new j(\"quoted\",[new j(\"true\",[])]),new j(\".\",[new j(\"ignore_ops\",[new j(\"false\")]),new j(\".\",[new j(\"numbervars\",[new j(\"true\")]),new j(\"[]\",[])])])])])),b.substitution,b)])},\"write_canonical/1\":function(w,b,y){var F=y.args[0];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_output\",[new De(\"S\")]),new j(\"write_canonical\",[new De(\"S\"),F])])),b.substitution,b)])},\"write_canonical/2\":function(w,b,y){var F=y.args[0],z=y.args[1];w.prepend([new Pe(b.goal.replace(new j(\"write_term\",[F,z,new j(\".\",[new j(\"quoted\",[new j(\"true\",[])]),new j(\".\",[new j(\"ignore_ops\",[new j(\"true\")]),new j(\".\",[new j(\"numbervars\",[new j(\"false\")]),new j(\"[]\",[])])])])])),b.substitution,b)])},\"write_term/2\":function(w,b,y){var F=y.args[0],z=y.args[1];w.prepend([new Pe(b.goal.replace(new j(\",\",[new j(\"current_output\",[new De(\"S\")]),new j(\"write_term\",[new De(\"S\"),F,z])])),b.substitution,b)])},\"write_term/3\":function(w,b,y){var F=y.args[0],z=y.args[1],X=y.args[2],$=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(x.type.is_variable(F)||x.type.is_variable(X))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_list(X))w.throw_error(x.error.type(\"list\",X,y.indicator));else if(!x.type.is_stream(F)&&!x.type.is_atom(F))w.throw_error(x.error.domain(\"stream_or_alias\",F,y.indicator));else if(!x.type.is_stream($)||$.stream===null)w.throw_error(x.error.existence(\"stream\",F,y.indicator));else if($.input)w.throw_error(x.error.permission(\"output\",\"stream\",F,y.indicator));else if($.type===\"binary\")w.throw_error(x.error.permission(\"output\",\"binary_stream\",F,y.indicator));else if($.position===\"past_end_of_stream\"&&$.eof_action===\"error\")w.throw_error(x.error.permission(\"output\",\"past_end_of_stream\",F,y.indicator));else{for(var oe={},xe=X,Te;x.type.is_term(xe)&&xe.indicator===\"./2\";){if(Te=xe.args[0],x.type.is_variable(Te)){w.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_write_option(Te)){w.throw_error(x.error.domain(\"write_option\",Te,y.indicator));return}oe[Te.id]=Te.args[0].id===\"true\",xe=xe.args[1]}if(xe.indicator!==\"[]/0\"){x.type.is_variable(xe)?w.throw_error(x.error.instantiation(y.indicator)):w.throw_error(x.error.type(\"list\",X,y.indicator));return}else{oe.session=w.session;var lt=z.toString(oe);$.stream.put(lt,$.position),typeof $.position==\"number\"&&($.position+=lt.length),w.success(b)}}},\"halt/0\":function(w,b,y){w.points=[]},\"halt/1\":function(w,b,y){var F=y.args[0];x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_integer(F)?w.points=[]:w.throw_error(x.error.type(\"integer\",F,y.indicator))},\"current_prolog_flag/2\":function(w,b,y){var F=y.args[0],z=y.args[1];if(!x.type.is_variable(F)&&!x.type.is_atom(F))w.throw_error(x.error.type(\"atom\",F,y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_flag(F))w.throw_error(x.error.domain(\"prolog_flag\",F,y.indicator));else{var X=[];for(var $ in x.flag)if(x.flag.hasOwnProperty($)){var oe=new j(\",\",[new j(\"=\",[new j($),F]),new j(\"=\",[w.get_flag($),z])]);X.push(new Pe(b.goal.replace(oe),b.substitution,b))}w.prepend(X)}},\"set_prolog_flag/2\":function(w,b,y){var F=y.args[0],z=y.args[1];x.type.is_variable(F)||x.type.is_variable(z)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(F)?x.type.is_flag(F)?x.type.is_value_flag(F,z)?x.type.is_modifiable_flag(F)?(w.session.flag[F.id]=z,w.success(b)):w.throw_error(x.error.permission(\"modify\",\"flag\",F)):w.throw_error(x.error.domain(\"flag_value\",new j(\"+\",[F,z]),y.indicator)):w.throw_error(x.error.domain(\"prolog_flag\",F,y.indicator)):w.throw_error(x.error.type(\"atom\",F,y.indicator))}},flag:{bounded:{allowed:[new j(\"true\"),new j(\"false\")],value:new j(\"true\"),changeable:!1},max_integer:{allowed:[new Re(Number.MAX_SAFE_INTEGER)],value:new Re(Number.MAX_SAFE_INTEGER),changeable:!1},min_integer:{allowed:[new Re(Number.MIN_SAFE_INTEGER)],value:new Re(Number.MIN_SAFE_INTEGER),changeable:!1},integer_rounding_function:{allowed:[new j(\"down\"),new j(\"toward_zero\")],value:new j(\"toward_zero\"),changeable:!1},char_conversion:{allowed:[new j(\"on\"),new j(\"off\")],value:new j(\"on\"),changeable:!0},debug:{allowed:[new j(\"on\"),new j(\"off\")],value:new j(\"off\"),changeable:!0},max_arity:{allowed:[new j(\"unbounded\")],value:new j(\"unbounded\"),changeable:!1},unknown:{allowed:[new j(\"error\"),new j(\"fail\"),new j(\"warning\")],value:new j(\"error\"),changeable:!0},double_quotes:{allowed:[new j(\"chars\"),new j(\"codes\"),new j(\"atom\")],value:new j(\"codes\"),changeable:!0},occurs_check:{allowed:[new j(\"false\"),new j(\"true\")],value:new j(\"false\"),changeable:!0},dialect:{allowed:[new j(\"tau\")],value:new j(\"tau\"),changeable:!1},version_data:{allowed:[new j(\"tau\",[new Re(t.major,!1),new Re(t.minor,!1),new Re(t.patch,!1),new j(t.status)])],value:new j(\"tau\",[new Re(t.major,!1),new Re(t.minor,!1),new Re(t.patch,!1),new j(t.status)]),changeable:!1},nodejs:{allowed:[new j(\"yes\"),new j(\"no\")],value:new j(typeof ec<\"u\"&&ec.exports?\"yes\":\"no\"),changeable:!1}},unify:function(w,b,y){y=y===void 0?!1:y;for(var F=[{left:w,right:b}],z={};F.length!==0;){var X=F.pop();if(w=X.left,b=X.right,x.type.is_term(w)&&x.type.is_term(b)){if(w.indicator!==b.indicator)return null;for(var $=0;$<w.args.length;$++)F.push({left:w.args[$],right:b.args[$]})}else if(x.type.is_number(w)&&x.type.is_number(b)){if(w.value!==b.value||w.is_float!==b.is_float)return null}else if(x.type.is_variable(w)){if(x.type.is_variable(b)&&w.id===b.id)continue;if(y===!0&&b.variables().indexOf(w.id)!==-1)return null;if(w.id!==\"_\"){var oe=new Ne;oe.add(w.id,b);for(var $=0;$<F.length;$++)F[$].left=F[$].left.apply(oe),F[$].right=F[$].right.apply(oe);for(var $ in z)z[$]=z[$].apply(oe);z[w.id]=b}}else if(x.type.is_variable(b))F.push({left:b,right:w});else if(w.unify!==void 0){if(!w.unify(b))return null}else return null}return new Ne(z)},compare:function(w,b){var y=x.type.compare(w,b);return y!==0?y:w.compare(b)},arithmetic_compare:function(w,b,y){var F=b.interpret(w);if(x.type.is_number(F)){var z=y.interpret(w);return x.type.is_number(z)?F.value<z.value?-1:F.value>z.value?1:0:z}else return F},operate:function(w,b){if(x.type.is_operator(b)){for(var y=x.type.is_operator(b),F=[],z,X=!1,$=0;$<b.args.length;$++){if(z=b.args[$].interpret(w),x.type.is_number(z)){if(y.type_args!==null&&z.is_float!==y.type_args)return x.error.type(y.type_args?\"float\":\"integer\",z,w.__call_indicator);F.push(z.value)}else return z;X=X||z.is_float}return F.push(w),z=x.arithmetic.evaluation[b.indicator].fn.apply(this,F),X=y.type_result===null?X:y.type_result,x.type.is_term(z)?z:z===Number.POSITIVE_INFINITY||z===Number.NEGATIVE_INFINITY?x.error.evaluation(\"overflow\",w.__call_indicator):X===!1&&w.get_flag(\"bounded\").id===\"true\"&&(z>w.get_flag(\"max_integer\").value||z<w.get_flag(\"min_integer\").value)?x.error.evaluation(\"int_overflow\",w.__call_indicator):new Re(z,X)}else return x.error.type(\"evaluable\",b.indicator,w.__call_indicator)},error:{existence:function(w,b,y){return typeof b==\"string\"&&(b=Z(b)),new j(\"error\",[new j(\"existence_error\",[new j(w),b]),Z(y)])},type:function(w,b,y){return new j(\"error\",[new j(\"type_error\",[new j(w),b]),Z(y)])},instantiation:function(w){return new j(\"error\",[new j(\"instantiation_error\"),Z(w)])},domain:function(w,b,y){return new j(\"error\",[new j(\"domain_error\",[new j(w),b]),Z(y)])},representation:function(w,b){return new j(\"error\",[new j(\"representation_error\",[new j(w)]),Z(b)])},permission:function(w,b,y,F){return new j(\"error\",[new j(\"permission_error\",[new j(w),new j(b),y]),Z(F)])},evaluation:function(w,b){return new j(\"error\",[new j(\"evaluation_error\",[new j(w)]),Z(b)])},syntax:function(w,b,y){w=w||{value:\"\",line:0,column:0,matches:[\"\"],start:0};var F=y&&w.matches.length>0?w.start+w.matches[0].length:w.start,z=y?new j(\"token_not_found\"):new j(\"found\",[new j(w.value.toString())]),X=new j(\".\",[new j(\"line\",[new Re(w.line+1)]),new j(\".\",[new j(\"column\",[new Re(F+1)]),new j(\".\",[z,new j(\"[]\",[])])])]);return new j(\"error\",[new j(\"syntax_error\",[new j(b)]),X])},syntax_by_predicate:function(w,b){return new j(\"error\",[new j(\"syntax_error\",[new j(w)]),Z(b)])}},warning:{singleton:function(w,b,y){for(var F=new j(\"[]\"),z=w.length-1;z>=0;z--)F=new j(\".\",[new De(w[z]),F]);return new j(\"warning\",[new j(\"singleton_variables\",[F,Z(b)]),new j(\".\",[new j(\"line\",[new Re(y,!1)]),new j(\"[]\")])])},failed_goal:function(w,b){return new j(\"warning\",[new j(\"failed_goal\",[w]),new j(\".\",[new j(\"line\",[new Re(b,!1)]),new j(\"[]\")])])}},format_variable:function(w){return\"_\"+w},format_answer:function(w,b,F){b instanceof ke&&(b=b.thread);var F=F||{};if(F.session=b?b.session:void 0,x.type.is_error(w))return\"uncaught exception: \"+w.args[0].toString();if(w===!1)return\"false.\";if(w===null)return\"limit exceeded ;\";var z=0,X=\"\";if(x.type.is_substitution(w)){var $=w.domain(!0);w=w.filter(function(Te,lt){return!x.type.is_variable(lt)||$.indexOf(lt.id)!==-1&&Te!==lt.id})}for(var oe in w.links)w.links.hasOwnProperty(oe)&&(z++,X!==\"\"&&(X+=\", \"),X+=oe.toString(F)+\" = \"+w.links[oe].toString(F));var xe=typeof b>\"u\"||b.points.length>0?\" ;\":\".\";return z===0?\"true\"+xe:X+xe},flatten_error:function(w){if(!x.type.is_error(w))return null;w=w.args[0];var b={};return b.type=w.args[0].id,b.thrown=b.type===\"syntax_error\"?null:w.args[1].id,b.expected=null,b.found=null,b.representation=null,b.existence=null,b.existence_type=null,b.line=null,b.column=null,b.permission_operation=null,b.permission_type=null,b.evaluation_type=null,b.type===\"type_error\"||b.type===\"domain_error\"?(b.expected=w.args[0].args[0].id,b.found=w.args[0].args[1].toString()):b.type===\"syntax_error\"?w.args[1].indicator===\"./2\"?(b.expected=w.args[0].args[0].id,b.found=w.args[1].args[1].args[1].args[0],b.found=b.found.id===\"token_not_found\"?b.found.id:b.found.args[0].id,b.line=w.args[1].args[0].args[0].value,b.column=w.args[1].args[1].args[0].args[0].value):b.thrown=w.args[1].id:b.type===\"permission_error\"?(b.found=w.args[0].args[2].toString(),b.permission_operation=w.args[0].args[0].id,b.permission_type=w.args[0].args[1].id):b.type===\"evaluation_error\"?b.evaluation_type=w.args[0].args[0].id:b.type===\"representation_error\"?b.representation=w.args[0].args[0].id:b.type===\"existence_error\"&&(b.existence=w.args[0].args[1].toString(),b.existence_type=w.args[0].args[0].id),b},create:function(w){return new x.type.Session(w)}};typeof ec<\"u\"?ec.exports=x:window.pl=x})()});function EEe(t,e,r){t.prepend(r.map(s=>new hl.default.type.State(e.goal.replace(s),e.substitution,e)))}function Lq(t){let e=CEe.get(t.session);if(e==null)throw new Error(\"Assertion failed: A project should have been registered for the active session\");return e}function wEe(t,e){CEe.set(t,e),t.consult(`:- use_module(library(${Zct.id})).`)}var hl,IEe,J0,zct,Xct,CEe,Zct,BEe=Xe(()=>{Ge();ql();hl=ut(Oq()),IEe=ut(Ie(\"vm\")),{is_atom:J0,is_variable:zct,is_instantiated_list:Xct}=hl.default.type;CEe=new WeakMap;Zct=new hl.default.type.Module(\"constraints\",{\"project_workspaces_by_descriptor/3\":(t,e,r)=>{let[s,a,n]=r.args;if(!J0(s)||!J0(a)){t.throw_error(hl.default.error.instantiation(r.indicator));return}let c=G.parseIdent(s.id),f=G.makeDescriptor(c,a.id),h=Lq(t).tryWorkspaceByDescriptor(f);zct(n)&&h!==null&&EEe(t,e,[new hl.default.type.Term(\"=\",[n,new hl.default.type.Term(String(h.relativeCwd))])]),J0(n)&&h!==null&&h.relativeCwd===n.id&&t.success(e)},\"workspace_field/3\":(t,e,r)=>{let[s,a,n]=r.args;if(!J0(s)||!J0(a)){t.throw_error(hl.default.error.instantiation(r.indicator));return}let f=Lq(t).tryWorkspaceByCwd(s.id);if(f==null)return;let p=va(f.manifest.raw,a.id);typeof p>\"u\"||EEe(t,e,[new hl.default.type.Term(\"=\",[n,new hl.default.type.Term(typeof p==\"object\"?JSON.stringify(p):p)])])},\"workspace_field_test/3\":(t,e,r)=>{let[s,a,n]=r.args;t.prepend([new hl.default.type.State(e.goal.replace(new hl.default.type.Term(\"workspace_field_test\",[s,a,n,new hl.default.type.Term(\"[]\",[])])),e.substitution,e)])},\"workspace_field_test/4\":(t,e,r)=>{let[s,a,n,c]=r.args;if(!J0(s)||!J0(a)||!J0(n)||!Xct(c)){t.throw_error(hl.default.error.instantiation(r.indicator));return}let p=Lq(t).tryWorkspaceByCwd(s.id);if(p==null)return;let h=va(p.manifest.raw,a.id);if(typeof h>\"u\")return;let E={$$:h};for(let[S,P]of c.toJavaScript().entries())E[`$${S}`]=P;IEe.default.runInNewContext(n.id,E)&&t.success(e)}},[\"project_workspaces_by_descriptor/3\",\"workspace_field/3\",\"workspace_field_test/3\",\"workspace_field_test/4\"])});var aS={};Vt(aS,{Constraints:()=>Uq,DependencyType:()=>bEe});function go(t){if(t instanceof KC.default.type.Num)return t.value;if(t instanceof KC.default.type.Term)switch(t.indicator){case\"throw/1\":return go(t.args[0]);case\"error/1\":return go(t.args[0]);case\"error/2\":if(t.args[0]instanceof KC.default.type.Term&&t.args[0].indicator===\"syntax_error/1\")return Object.assign(go(t.args[0]),...go(t.args[1]));{let e=go(t.args[0]);return e.message+=` (in ${go(t.args[1])})`,e}case\"syntax_error/1\":return new jt(43,`Syntax error: ${go(t.args[0])}`);case\"existence_error/2\":return new jt(44,`Existence error: ${go(t.args[0])} ${go(t.args[1])} not found`);case\"instantiation_error/0\":return new jt(75,\"Instantiation error: an argument is variable when an instantiated argument was expected\");case\"line/1\":return{line:go(t.args[0])};case\"column/1\":return{column:go(t.args[0])};case\"found/1\":return{found:go(t.args[0])};case\"./2\":return[go(t.args[0])].concat(go(t.args[1]));case\"//2\":return`${go(t.args[0])}/${go(t.args[1])}`;default:return t.id}throw`couldn't pretty print because of unsupported node ${t}`}function SEe(t){let e;try{e=go(t)}catch(r){throw typeof r==\"string\"?new jt(42,`Unknown error: ${t} (note: ${r})`):r}return typeof e.line<\"u\"&&typeof e.column<\"u\"&&(e.message+=` at line ${e.line}, column ${e.column}`),e}function Pm(t){return t.id===\"null\"?null:`${t.toJavaScript()}`}function $ct(t){if(t.id===\"null\")return null;{let e=t.toJavaScript();if(typeof e!=\"string\")return JSON.stringify(e);try{return JSON.stringify(JSON.parse(e))}catch{return JSON.stringify(e)}}}function K0(t){return typeof t==\"string\"?`'${t}'`:\"[]\"}var DEe,KC,bEe,vEe,Mq,Uq,lS=Xe(()=>{Ge();Ge();Dt();DEe=ut(nEe()),KC=ut(Oq());iS();BEe();(0,DEe.default)(KC.default);bEe=(s=>(s.Dependencies=\"dependencies\",s.DevDependencies=\"devDependencies\",s.PeerDependencies=\"peerDependencies\",s))(bEe||{}),vEe=[\"dependencies\",\"devDependencies\",\"peerDependencies\"];Mq=class{constructor(e,r){let s=1e3*e.workspaces.length;this.session=KC.default.create(s),wEe(this.session,e),this.session.consult(\":- use_module(library(lists)).\"),this.session.consult(r)}fetchNextAnswer(){return new Promise(e=>{this.session.answer(r=>{e(r)})})}async*makeQuery(e){let r=this.session.query(e);if(r!==!0)throw SEe(r);for(;;){let s=await this.fetchNextAnswer();if(s===null)throw new jt(79,\"Resolution limit exceeded\");if(!s)break;if(s.id===\"throw\")throw SEe(s);yield s}}};Uq=class t{constructor(e){this.source=\"\";this.project=e;let r=e.configuration.get(\"constraintsPath\");ce.existsSync(r)&&(this.source=ce.readFileSync(r,\"utf8\"))}static async find(e){return new t(e)}getProjectDatabase(){let e=\"\";for(let r of vEe)e+=`dependency_type(${r}).\n`;for(let r of this.project.workspacesByCwd.values()){let s=r.relativeCwd;e+=`workspace(${K0(s)}).\n`,e+=`workspace_ident(${K0(s)}, ${K0(G.stringifyIdent(r.anchoredLocator))}).\n`,e+=`workspace_version(${K0(s)}, ${K0(r.manifest.version)}).\n`;for(let a of vEe)for(let n of r.manifest[a].values())e+=`workspace_has_dependency(${K0(s)}, ${K0(G.stringifyIdent(n))}, ${K0(n.range)}, ${a}).\n`}return e+=`workspace(_) :- false.\n`,e+=`workspace_ident(_, _) :- false.\n`,e+=`workspace_version(_, _) :- false.\n`,e+=`workspace_has_dependency(_, _, _, _) :- false.\n`,e}getDeclarations(){let e=\"\";return e+=`gen_enforced_dependency(_, _, _, _) :- false.\n`,e+=`gen_enforced_field(_, _, _) :- false.\n`,e}get fullSource(){return`${this.getProjectDatabase()}\n${this.source}\n${this.getDeclarations()}`}createSession(){return new Mq(this.project,this.fullSource)}async processClassic(){let e=this.createSession();return{enforcedDependencies:await this.genEnforcedDependencies(e),enforcedFields:await this.genEnforcedFields(e)}}async process(){let{enforcedDependencies:e,enforcedFields:r}=await this.processClassic(),s=new Map;for(let{workspace:a,dependencyIdent:n,dependencyRange:c,dependencyType:f}of e){let p=nS([f,G.stringifyIdent(n)]),h=je.getMapWithDefault(s,a.cwd);je.getMapWithDefault(h,p).set(c??void 0,new Set)}for(let{workspace:a,fieldPath:n,fieldValue:c}of r){let f=nS(n),p=je.getMapWithDefault(s,a.cwd);je.getMapWithDefault(p,f).set(JSON.parse(c)??void 0,new Set)}return{manifestUpdates:s,reportedErrors:new Map}}async genEnforcedDependencies(e){let r=[];for await(let s of e.makeQuery(\"workspace(WorkspaceCwd), dependency_type(DependencyType), gen_enforced_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType).\")){let a=J.resolve(this.project.cwd,Pm(s.links.WorkspaceCwd)),n=Pm(s.links.DependencyIdent),c=Pm(s.links.DependencyRange),f=Pm(s.links.DependencyType);if(a===null||n===null)throw new Error(\"Invalid rule\");let p=this.project.getWorkspaceByCwd(a),h=G.parseIdent(n);r.push({workspace:p,dependencyIdent:h,dependencyRange:c,dependencyType:f})}return je.sortMap(r,[({dependencyRange:s})=>s!==null?\"0\":\"1\",({workspace:s})=>G.stringifyIdent(s.anchoredLocator),({dependencyIdent:s})=>G.stringifyIdent(s)])}async genEnforcedFields(e){let r=[];for await(let s of e.makeQuery(\"workspace(WorkspaceCwd), gen_enforced_field(WorkspaceCwd, FieldPath, FieldValue).\")){let a=J.resolve(this.project.cwd,Pm(s.links.WorkspaceCwd)),n=Pm(s.links.FieldPath),c=$ct(s.links.FieldValue);if(a===null||n===null)throw new Error(\"Invalid rule\");let f=this.project.getWorkspaceByCwd(a);r.push({workspace:f,fieldPath:n,fieldValue:c})}return je.sortMap(r,[({workspace:s})=>G.stringifyIdent(s.anchoredLocator),({fieldPath:s})=>s])}async*query(e){let r=this.createSession();for await(let s of r.makeQuery(e)){let a={};for(let[n,c]of Object.entries(s.links))n!==\"_\"&&(a[n]=Pm(c));yield a}}}});var OEe=_(fF=>{\"use strict\";Object.defineProperty(fF,\"__esModule\",{value:!0});function BS(t){let e=[...t.caches],r=e.shift();return r===void 0?NEe():{get(s,a,n={miss:()=>Promise.resolve()}){return r.get(s,a,n).catch(()=>BS({caches:e}).get(s,a,n))},set(s,a){return r.set(s,a).catch(()=>BS({caches:e}).set(s,a))},delete(s){return r.delete(s).catch(()=>BS({caches:e}).delete(s))},clear(){return r.clear().catch(()=>BS({caches:e}).clear())}}}function NEe(){return{get(t,e,r={miss:()=>Promise.resolve()}){return e().then(a=>Promise.all([a,r.miss(a)])).then(([a])=>a)},set(t,e){return Promise.resolve(e)},delete(t){return Promise.resolve()},clear(){return Promise.resolve()}}}fF.createFallbackableCache=BS;fF.createNullCache=NEe});var MEe=_((BJt,LEe)=>{LEe.exports=OEe()});var UEe=_($q=>{\"use strict\";Object.defineProperty($q,\"__esModule\",{value:!0});function yut(t={serializable:!0}){let e={};return{get(r,s,a={miss:()=>Promise.resolve()}){let n=JSON.stringify(r);if(n in e)return Promise.resolve(t.serializable?JSON.parse(e[n]):e[n]);let c=s(),f=a&&a.miss||(()=>Promise.resolve());return c.then(p=>f(p)).then(()=>c)},set(r,s){return e[JSON.stringify(r)]=t.serializable?JSON.stringify(s):s,Promise.resolve(s)},delete(r){return delete e[JSON.stringify(r)],Promise.resolve()},clear(){return e={},Promise.resolve()}}}$q.createInMemoryCache=yut});var HEe=_((SJt,_Ee)=>{_Ee.exports=UEe()});var GEe=_($u=>{\"use strict\";Object.defineProperty($u,\"__esModule\",{value:!0});function Eut(t,e,r){let s={\"x-algolia-api-key\":r,\"x-algolia-application-id\":e};return{headers(){return t===e9.WithinHeaders?s:{}},queryParameters(){return t===e9.WithinQueryParameters?s:{}}}}function Iut(t){let e=0,r=()=>(e++,new Promise(s=>{setTimeout(()=>{s(t(r))},Math.min(100*e,1e3))}));return t(r)}function jEe(t,e=(r,s)=>Promise.resolve()){return Object.assign(t,{wait(r){return jEe(t.then(s=>Promise.all([e(s,r),s])).then(s=>s[1]))}})}function Cut(t){let e=t.length-1;for(e;e>0;e--){let r=Math.floor(Math.random()*(e+1)),s=t[e];t[e]=t[r],t[r]=s}return t}function wut(t,e){return e&&Object.keys(e).forEach(r=>{t[r]=e[r](t)}),t}function But(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}var vut=\"4.22.1\",Sut=t=>()=>t.transporter.requester.destroy(),e9={WithinQueryParameters:0,WithinHeaders:1};$u.AuthMode=e9;$u.addMethods=wut;$u.createAuth=Eut;$u.createRetryablePromise=Iut;$u.createWaitablePromise=jEe;$u.destroy=Sut;$u.encode=But;$u.shuffle=Cut;$u.version=vut});var vS=_((bJt,qEe)=>{qEe.exports=GEe()});var WEe=_(t9=>{\"use strict\";Object.defineProperty(t9,\"__esModule\",{value:!0});var Dut={Delete:\"DELETE\",Get:\"GET\",Post:\"POST\",Put:\"PUT\"};t9.MethodEnum=Dut});var SS=_((xJt,YEe)=>{YEe.exports=WEe()});var aIe=_(Yi=>{\"use strict\";Object.defineProperty(Yi,\"__esModule\",{value:!0});var JEe=SS();function r9(t,e){let r=t||{},s=r.data||{};return Object.keys(r).forEach(a=>{[\"timeout\",\"headers\",\"queryParameters\",\"data\",\"cacheable\"].indexOf(a)===-1&&(s[a]=r[a])}),{data:Object.entries(s).length>0?s:void 0,timeout:r.timeout||e,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var DS={Read:1,Write:2,Any:3},sw={Up:1,Down:2,Timeouted:3},KEe=2*60*1e3;function i9(t,e=sw.Up){return{...t,status:e,lastUpdate:Date.now()}}function zEe(t){return t.status===sw.Up||Date.now()-t.lastUpdate>KEe}function XEe(t){return t.status===sw.Timeouted&&Date.now()-t.lastUpdate<=KEe}function s9(t){return typeof t==\"string\"?{protocol:\"https\",url:t,accept:DS.Any}:{protocol:t.protocol||\"https\",url:t.url,accept:t.accept||DS.Any}}function but(t,e){return Promise.all(e.map(r=>t.get(r,()=>Promise.resolve(i9(r))))).then(r=>{let s=r.filter(f=>zEe(f)),a=r.filter(f=>XEe(f)),n=[...s,...a],c=n.length>0?n.map(f=>s9(f)):e;return{getTimeout(f,p){return(a.length===0&&f===0?1:a.length+3+f)*p},statelessHosts:c}})}var Put=({isTimedOut:t,status:e})=>!t&&~~e===0,xut=t=>{let e=t.status;return t.isTimedOut||Put(t)||~~(e/100)!==2&&~~(e/100)!==4},kut=({status:t})=>~~(t/100)===2,Qut=(t,e)=>xut(t)?e.onRetry(t):kut(t)?e.onSuccess(t):e.onFail(t);function VEe(t,e,r,s){let a=[],n=rIe(r,s),c=nIe(t,s),f=r.method,p=r.method!==JEe.MethodEnum.Get?{}:{...r.data,...s.data},h={\"x-algolia-agent\":t.userAgent.value,...t.queryParameters,...p,...s.queryParameters},E=0,C=(S,P)=>{let I=S.pop();if(I===void 0)throw oIe(n9(a));let R={data:n,headers:c,method:f,url:eIe(I,r.path,h),connectTimeout:P(E,t.timeouts.connect),responseTimeout:P(E,s.timeout)},N=W=>{let ee={request:R,response:W,host:I,triesLeft:S.length};return a.push(ee),ee},U={onSuccess:W=>ZEe(W),onRetry(W){let ee=N(W);return W.isTimedOut&&E++,Promise.all([t.logger.info(\"Retryable failure\",o9(ee)),t.hostsCache.set(I,i9(I,W.isTimedOut?sw.Timeouted:sw.Down))]).then(()=>C(S,P))},onFail(W){throw N(W),$Ee(W,n9(a))}};return t.requester.send(R).then(W=>Qut(W,U))};return but(t.hostsCache,e).then(S=>C([...S.statelessHosts].reverse(),S.getTimeout))}function Tut(t){let{hostsCache:e,logger:r,requester:s,requestsCache:a,responsesCache:n,timeouts:c,userAgent:f,hosts:p,queryParameters:h,headers:E}=t,C={hostsCache:e,logger:r,requester:s,requestsCache:a,responsesCache:n,timeouts:c,userAgent:f,headers:E,queryParameters:h,hosts:p.map(S=>s9(S)),read(S,P){let I=r9(P,C.timeouts.read),R=()=>VEe(C,C.hosts.filter(W=>(W.accept&DS.Read)!==0),S,I);if((I.cacheable!==void 0?I.cacheable:S.cacheable)!==!0)return R();let U={request:S,mappedRequestOptions:I,transporter:{queryParameters:C.queryParameters,headers:C.headers}};return C.responsesCache.get(U,()=>C.requestsCache.get(U,()=>C.requestsCache.set(U,R()).then(W=>Promise.all([C.requestsCache.delete(U),W]),W=>Promise.all([C.requestsCache.delete(U),Promise.reject(W)])).then(([W,ee])=>ee)),{miss:W=>C.responsesCache.set(U,W)})},write(S,P){return VEe(C,C.hosts.filter(I=>(I.accept&DS.Write)!==0),S,r9(P,C.timeouts.write))}};return C}function Rut(t){let e={value:`Algolia for JavaScript (${t})`,add(r){let s=`; ${r.segment}${r.version!==void 0?` (${r.version})`:\"\"}`;return e.value.indexOf(s)===-1&&(e.value=`${e.value}${s}`),e}};return e}function ZEe(t){try{return JSON.parse(t.content)}catch(e){throw sIe(e.message,t)}}function $Ee({content:t,status:e},r){let s=t;try{s=JSON.parse(t).message}catch{}return iIe(s,e,r)}function Fut(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}function eIe(t,e,r){let s=tIe(r),a=`${t.protocol}://${t.url}/${e.charAt(0)===\"/\"?e.substr(1):e}`;return s.length&&(a+=`?${s}`),a}function tIe(t){let e=r=>Object.prototype.toString.call(r)===\"[object Object]\"||Object.prototype.toString.call(r)===\"[object Array]\";return Object.keys(t).map(r=>Fut(\"%s=%s\",r,e(t[r])?JSON.stringify(t[r]):t[r])).join(\"&\")}function rIe(t,e){if(t.method===JEe.MethodEnum.Get||t.data===void 0&&e.data===void 0)return;let r=Array.isArray(t.data)?t.data:{...t.data,...e.data};return JSON.stringify(r)}function nIe(t,e){let r={...t.headers,...e.headers},s={};return Object.keys(r).forEach(a=>{let n=r[a];s[a.toLowerCase()]=n}),s}function n9(t){return t.map(e=>o9(e))}function o9(t){let e=t.request.headers[\"x-algolia-api-key\"]?{\"x-algolia-api-key\":\"*****\"}:{};return{...t,request:{...t.request,headers:{...t.request.headers,...e}}}}function iIe(t,e,r){return{name:\"ApiError\",message:t,status:e,transporterStackTrace:r}}function sIe(t,e){return{name:\"DeserializationError\",message:t,response:e}}function oIe(t){return{name:\"RetryError\",message:\"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.\",transporterStackTrace:t}}Yi.CallEnum=DS;Yi.HostStatusEnum=sw;Yi.createApiError=iIe;Yi.createDeserializationError=sIe;Yi.createMappedRequestOptions=r9;Yi.createRetryError=oIe;Yi.createStatefulHost=i9;Yi.createStatelessHost=s9;Yi.createTransporter=Tut;Yi.createUserAgent=Rut;Yi.deserializeFailure=$Ee;Yi.deserializeSuccess=ZEe;Yi.isStatefulHostTimeouted=XEe;Yi.isStatefulHostUp=zEe;Yi.serializeData=rIe;Yi.serializeHeaders=nIe;Yi.serializeQueryParameters=tIe;Yi.serializeUrl=eIe;Yi.stackFrameWithoutCredentials=o9;Yi.stackTraceWithoutCredentials=n9});var bS=_((QJt,lIe)=>{lIe.exports=aIe()});var cIe=_(X0=>{\"use strict\";Object.defineProperty(X0,\"__esModule\",{value:!0});var ow=vS(),Nut=bS(),PS=SS(),Out=t=>{let e=t.region||\"us\",r=ow.createAuth(ow.AuthMode.WithinHeaders,t.appId,t.apiKey),s=Nut.createTransporter({hosts:[{url:`analytics.${e}.algolia.com`}],...t,headers:{...r.headers(),\"content-type\":\"application/json\",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a=t.appId;return ow.addMethods({appId:a,transporter:s},t.methods)},Lut=t=>(e,r)=>t.transporter.write({method:PS.MethodEnum.Post,path:\"2/abtests\",data:e},r),Mut=t=>(e,r)=>t.transporter.write({method:PS.MethodEnum.Delete,path:ow.encode(\"2/abtests/%s\",e)},r),Uut=t=>(e,r)=>t.transporter.read({method:PS.MethodEnum.Get,path:ow.encode(\"2/abtests/%s\",e)},r),_ut=t=>e=>t.transporter.read({method:PS.MethodEnum.Get,path:\"2/abtests\"},e),Hut=t=>(e,r)=>t.transporter.write({method:PS.MethodEnum.Post,path:ow.encode(\"2/abtests/%s/stop\",e)},r);X0.addABTest=Lut;X0.createAnalyticsClient=Out;X0.deleteABTest=Mut;X0.getABTest=Uut;X0.getABTests=_ut;X0.stopABTest=Hut});var fIe=_((RJt,uIe)=>{uIe.exports=cIe()});var pIe=_(xS=>{\"use strict\";Object.defineProperty(xS,\"__esModule\",{value:!0});var a9=vS(),jut=bS(),AIe=SS(),Gut=t=>{let e=t.region||\"us\",r=a9.createAuth(a9.AuthMode.WithinHeaders,t.appId,t.apiKey),s=jut.createTransporter({hosts:[{url:`personalization.${e}.algolia.com`}],...t,headers:{...r.headers(),\"content-type\":\"application/json\",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}});return a9.addMethods({appId:t.appId,transporter:s},t.methods)},qut=t=>e=>t.transporter.read({method:AIe.MethodEnum.Get,path:\"1/strategies/personalization\"},e),Wut=t=>(e,r)=>t.transporter.write({method:AIe.MethodEnum.Post,path:\"1/strategies/personalization\",data:e},r);xS.createPersonalizationClient=Gut;xS.getPersonalizationStrategy=qut;xS.setPersonalizationStrategy=Wut});var gIe=_((NJt,hIe)=>{hIe.exports=pIe()});var xIe=_(Ft=>{\"use strict\";Object.defineProperty(Ft,\"__esModule\",{value:!0});var Jt=vS(),gl=bS(),br=SS(),Yut=Ie(\"crypto\");function AF(t){let e=r=>t.request(r).then(s=>{if(t.batch!==void 0&&t.batch(s.hits),!t.shouldStop(s))return s.cursor?e({cursor:s.cursor}):e({page:(r.page||0)+1})});return e({})}var Vut=t=>{let e=t.appId,r=Jt.createAuth(t.authMode!==void 0?t.authMode:Jt.AuthMode.WithinHeaders,e,t.apiKey),s=gl.createTransporter({hosts:[{url:`${e}-dsn.algolia.net`,accept:gl.CallEnum.Read},{url:`${e}.algolia.net`,accept:gl.CallEnum.Write}].concat(Jt.shuffle([{url:`${e}-1.algolianet.com`},{url:`${e}-2.algolianet.com`},{url:`${e}-3.algolianet.com`}])),...t,headers:{...r.headers(),\"content-type\":\"application/x-www-form-urlencoded\",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a={transporter:s,appId:e,addAlgoliaAgent(n,c){s.userAgent.add({segment:n,version:c})},clearCache(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then(()=>{})}};return Jt.addMethods(a,t.methods)};function dIe(){return{name:\"MissingObjectIDError\",message:\"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option.\"}}function mIe(){return{name:\"ObjectNotFoundError\",message:\"Object not found.\"}}function yIe(){return{name:\"ValidUntilNotFoundError\",message:\"ValidUntil not found in given secured api key.\"}}var Jut=t=>(e,r)=>{let{queryParameters:s,...a}=r||{},n={acl:e,...s!==void 0?{queryParameters:s}:{}},c=(f,p)=>Jt.createRetryablePromise(h=>kS(t)(f.key,p).catch(E=>{if(E.status!==404)throw E;return h()}));return Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:\"1/keys\",data:n},a),c)},Kut=t=>(e,r,s)=>{let a=gl.createMappedRequestOptions(s);return a.queryParameters[\"X-Algolia-User-ID\"]=e,t.transporter.write({method:br.MethodEnum.Post,path:\"1/clusters/mapping\",data:{cluster:r}},a)},zut=t=>(e,r,s)=>t.transporter.write({method:br.MethodEnum.Post,path:\"1/clusters/mapping/batch\",data:{users:e,cluster:r}},s),Xut=t=>(e,r)=>Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"/1/dictionaries/%s/batch\",e),data:{clearExistingDictionaryEntries:!0,requests:{action:\"addEntry\",body:[]}}},r),(s,a)=>aw(t)(s.taskID,a)),pF=t=>(e,r,s)=>{let a=(n,c)=>QS(t)(e,{methods:{waitTask:hs}}).waitTask(n.taskID,c);return Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/operation\",e),data:{operation:\"copy\",destination:r}},s),a)},Zut=t=>(e,r,s)=>pF(t)(e,r,{...s,scope:[gF.Rules]}),$ut=t=>(e,r,s)=>pF(t)(e,r,{...s,scope:[gF.Settings]}),eft=t=>(e,r,s)=>pF(t)(e,r,{...s,scope:[gF.Synonyms]}),tft=t=>(e,r)=>e.method===br.MethodEnum.Get?t.transporter.read(e,r):t.transporter.write(e,r),rft=t=>(e,r)=>{let s=(a,n)=>Jt.createRetryablePromise(c=>kS(t)(e,n).then(c).catch(f=>{if(f.status!==404)throw f}));return Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Delete,path:Jt.encode(\"1/keys/%s\",e)},r),s)},nft=t=>(e,r,s)=>{let a=r.map(n=>({action:\"deleteEntry\",body:{objectID:n}}));return Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"/1/dictionaries/%s/batch\",e),data:{clearExistingDictionaryEntries:!1,requests:a}},s),(n,c)=>aw(t)(n.taskID,c))},ift=()=>(t,e)=>{let r=gl.serializeQueryParameters(e),s=Yut.createHmac(\"sha256\",t).update(r).digest(\"hex\");return Buffer.from(s+r).toString(\"base64\")},kS=t=>(e,r)=>t.transporter.read({method:br.MethodEnum.Get,path:Jt.encode(\"1/keys/%s\",e)},r),EIe=t=>(e,r)=>t.transporter.read({method:br.MethodEnum.Get,path:Jt.encode(\"1/task/%s\",e.toString())},r),sft=t=>e=>t.transporter.read({method:br.MethodEnum.Get,path:\"/1/dictionaries/*/settings\"},e),oft=t=>e=>t.transporter.read({method:br.MethodEnum.Get,path:\"1/logs\"},e),aft=()=>t=>{let e=Buffer.from(t,\"base64\").toString(\"ascii\"),r=/validUntil=(\\d+)/,s=e.match(r);if(s===null)throw yIe();return parseInt(s[1],10)-Math.round(new Date().getTime()/1e3)},lft=t=>e=>t.transporter.read({method:br.MethodEnum.Get,path:\"1/clusters/mapping/top\"},e),cft=t=>(e,r)=>t.transporter.read({method:br.MethodEnum.Get,path:Jt.encode(\"1/clusters/mapping/%s\",e)},r),uft=t=>e=>{let{retrieveMappings:r,...s}=e||{};return r===!0&&(s.getClusters=!0),t.transporter.read({method:br.MethodEnum.Get,path:\"1/clusters/mapping/pending\"},s)},QS=t=>(e,r={})=>{let s={transporter:t.transporter,appId:t.appId,indexName:e};return Jt.addMethods(s,r.methods)},fft=t=>e=>t.transporter.read({method:br.MethodEnum.Get,path:\"1/keys\"},e),Aft=t=>e=>t.transporter.read({method:br.MethodEnum.Get,path:\"1/clusters\"},e),pft=t=>e=>t.transporter.read({method:br.MethodEnum.Get,path:\"1/indexes\"},e),hft=t=>e=>t.transporter.read({method:br.MethodEnum.Get,path:\"1/clusters/mapping\"},e),gft=t=>(e,r,s)=>{let a=(n,c)=>QS(t)(e,{methods:{waitTask:hs}}).waitTask(n.taskID,c);return Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/operation\",e),data:{operation:\"move\",destination:r}},s),a)},dft=t=>(e,r)=>{let s=(a,n)=>Promise.all(Object.keys(a.taskID).map(c=>QS(t)(c,{methods:{waitTask:hs}}).waitTask(a.taskID[c],n)));return Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:\"1/indexes/*/batch\",data:{requests:e}},r),s)},mft=t=>(e,r)=>t.transporter.read({method:br.MethodEnum.Post,path:\"1/indexes/*/objects\",data:{requests:e}},r),yft=t=>(e,r)=>{let s=e.map(a=>({...a,params:gl.serializeQueryParameters(a.params||{})}));return t.transporter.read({method:br.MethodEnum.Post,path:\"1/indexes/*/queries\",data:{requests:s},cacheable:!0},r)},Eft=t=>(e,r)=>Promise.all(e.map(s=>{let{facetName:a,facetQuery:n,...c}=s.params;return QS(t)(s.indexName,{methods:{searchForFacetValues:DIe}}).searchForFacetValues(a,n,{...r,...c})})),Ift=t=>(e,r)=>{let s=gl.createMappedRequestOptions(r);return s.queryParameters[\"X-Algolia-User-ID\"]=e,t.transporter.write({method:br.MethodEnum.Delete,path:\"1/clusters/mapping\"},s)},Cft=t=>(e,r,s)=>{let a=r.map(n=>({action:\"addEntry\",body:n}));return Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"/1/dictionaries/%s/batch\",e),data:{clearExistingDictionaryEntries:!0,requests:a}},s),(n,c)=>aw(t)(n.taskID,c))},wft=t=>(e,r)=>{let s=(a,n)=>Jt.createRetryablePromise(c=>kS(t)(e,n).catch(f=>{if(f.status!==404)throw f;return c()}));return Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"1/keys/%s/restore\",e)},r),s)},Bft=t=>(e,r,s)=>{let a=r.map(n=>({action:\"addEntry\",body:n}));return Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"/1/dictionaries/%s/batch\",e),data:{clearExistingDictionaryEntries:!1,requests:a}},s),(n,c)=>aw(t)(n.taskID,c))},vft=t=>(e,r,s)=>t.transporter.read({method:br.MethodEnum.Post,path:Jt.encode(\"/1/dictionaries/%s/search\",e),data:{query:r},cacheable:!0},s),Sft=t=>(e,r)=>t.transporter.read({method:br.MethodEnum.Post,path:\"1/clusters/mapping/search\",data:{query:e}},r),Dft=t=>(e,r)=>Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Put,path:\"/1/dictionaries/*/settings\",data:e},r),(s,a)=>aw(t)(s.taskID,a)),bft=t=>(e,r)=>{let s=Object.assign({},r),{queryParameters:a,...n}=r||{},c=a?{queryParameters:a}:{},f=[\"acl\",\"indexes\",\"referers\",\"restrictSources\",\"queryParameters\",\"description\",\"maxQueriesPerIPPerHour\",\"maxHitsPerQuery\"],p=E=>Object.keys(s).filter(C=>f.indexOf(C)!==-1).every(C=>{if(Array.isArray(E[C])&&Array.isArray(s[C])){let S=E[C];return S.length===s[C].length&&S.every((P,I)=>P===s[C][I])}else return E[C]===s[C]}),h=(E,C)=>Jt.createRetryablePromise(S=>kS(t)(e,C).then(P=>p(P)?Promise.resolve():S()));return Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Put,path:Jt.encode(\"1/keys/%s\",e),data:c},n),h)},aw=t=>(e,r)=>Jt.createRetryablePromise(s=>EIe(t)(e,r).then(a=>a.status!==\"published\"?s():void 0)),IIe=t=>(e,r)=>{let s=(a,n)=>hs(t)(a.taskID,n);return Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/batch\",t.indexName),data:{requests:e}},r),s)},Pft=t=>e=>AF({shouldStop:r=>r.cursor===void 0,...e,request:r=>t.transporter.read({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/browse\",t.indexName),data:r},e)}),xft=t=>e=>{let r={hitsPerPage:1e3,...e};return AF({shouldStop:s=>s.hits.length<r.hitsPerPage,...r,request(s){return bIe(t)(\"\",{...r,...s}).then(a=>({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},kft=t=>e=>{let r={hitsPerPage:1e3,...e};return AF({shouldStop:s=>s.hits.length<r.hitsPerPage,...r,request(s){return PIe(t)(\"\",{...r,...s}).then(a=>({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},hF=t=>(e,r,s)=>{let{batchSize:a,...n}=s||{},c={taskIDs:[],objectIDs:[]},f=(p=0)=>{let h=[],E;for(E=p;E<e.length&&(h.push(e[E]),h.length!==(a||1e3));E++);return h.length===0?Promise.resolve(c):IIe(t)(h.map(C=>({action:r,body:C})),n).then(C=>(c.objectIDs=c.objectIDs.concat(C.objectIDs),c.taskIDs.push(C.taskID),E++,f(E)))};return Jt.createWaitablePromise(f(),(p,h)=>Promise.all(p.taskIDs.map(E=>hs(t)(E,h))))},Qft=t=>e=>Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/clear\",t.indexName)},e),(r,s)=>hs(t)(r.taskID,s)),Tft=t=>e=>{let{forwardToReplicas:r,...s}=e||{},a=gl.createMappedRequestOptions(s);return r&&(a.queryParameters.forwardToReplicas=1),Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/rules/clear\",t.indexName)},a),(n,c)=>hs(t)(n.taskID,c))},Rft=t=>e=>{let{forwardToReplicas:r,...s}=e||{},a=gl.createMappedRequestOptions(s);return r&&(a.queryParameters.forwardToReplicas=1),Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/synonyms/clear\",t.indexName)},a),(n,c)=>hs(t)(n.taskID,c))},Fft=t=>(e,r)=>Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/deleteByQuery\",t.indexName),data:e},r),(s,a)=>hs(t)(s.taskID,a)),Nft=t=>e=>Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Delete,path:Jt.encode(\"1/indexes/%s\",t.indexName)},e),(r,s)=>hs(t)(r.taskID,s)),Oft=t=>(e,r)=>Jt.createWaitablePromise(CIe(t)([e],r).then(s=>({taskID:s.taskIDs[0]})),(s,a)=>hs(t)(s.taskID,a)),CIe=t=>(e,r)=>{let s=e.map(a=>({objectID:a}));return hF(t)(s,km.DeleteObject,r)},Lft=t=>(e,r)=>{let{forwardToReplicas:s,...a}=r||{},n=gl.createMappedRequestOptions(a);return s&&(n.queryParameters.forwardToReplicas=1),Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Delete,path:Jt.encode(\"1/indexes/%s/rules/%s\",t.indexName,e)},n),(c,f)=>hs(t)(c.taskID,f))},Mft=t=>(e,r)=>{let{forwardToReplicas:s,...a}=r||{},n=gl.createMappedRequestOptions(a);return s&&(n.queryParameters.forwardToReplicas=1),Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Delete,path:Jt.encode(\"1/indexes/%s/synonyms/%s\",t.indexName,e)},n),(c,f)=>hs(t)(c.taskID,f))},Uft=t=>e=>wIe(t)(e).then(()=>!0).catch(r=>{if(r.status!==404)throw r;return!1}),_ft=t=>(e,r,s)=>t.transporter.read({method:br.MethodEnum.Post,path:Jt.encode(\"1/answers/%s/prediction\",t.indexName),data:{query:e,queryLanguages:r},cacheable:!0},s),Hft=t=>(e,r)=>{let{query:s,paginate:a,...n}=r||{},c=0,f=()=>SIe(t)(s||\"\",{...n,page:c}).then(p=>{for(let[h,E]of Object.entries(p.hits))if(e(E))return{object:E,position:parseInt(h,10),page:c};if(c++,a===!1||c>=p.nbPages)throw mIe();return f()});return f()},jft=t=>(e,r)=>t.transporter.read({method:br.MethodEnum.Get,path:Jt.encode(\"1/indexes/%s/%s\",t.indexName,e)},r),Gft=()=>(t,e)=>{for(let[r,s]of Object.entries(t.hits))if(s.objectID===e)return parseInt(r,10);return-1},qft=t=>(e,r)=>{let{attributesToRetrieve:s,...a}=r||{},n=e.map(c=>({indexName:t.indexName,objectID:c,...s?{attributesToRetrieve:s}:{}}));return t.transporter.read({method:br.MethodEnum.Post,path:\"1/indexes/*/objects\",data:{requests:n}},a)},Wft=t=>(e,r)=>t.transporter.read({method:br.MethodEnum.Get,path:Jt.encode(\"1/indexes/%s/rules/%s\",t.indexName,e)},r),wIe=t=>e=>t.transporter.read({method:br.MethodEnum.Get,path:Jt.encode(\"1/indexes/%s/settings\",t.indexName),data:{getVersion:2}},e),Yft=t=>(e,r)=>t.transporter.read({method:br.MethodEnum.Get,path:Jt.encode(\"1/indexes/%s/synonyms/%s\",t.indexName,e)},r),BIe=t=>(e,r)=>t.transporter.read({method:br.MethodEnum.Get,path:Jt.encode(\"1/indexes/%s/task/%s\",t.indexName,e.toString())},r),Vft=t=>(e,r)=>Jt.createWaitablePromise(vIe(t)([e],r).then(s=>({objectID:s.objectIDs[0],taskID:s.taskIDs[0]})),(s,a)=>hs(t)(s.taskID,a)),vIe=t=>(e,r)=>{let{createIfNotExists:s,...a}=r||{},n=s?km.PartialUpdateObject:km.PartialUpdateObjectNoCreate;return hF(t)(e,n,a)},Jft=t=>(e,r)=>{let{safe:s,autoGenerateObjectIDIfNotExist:a,batchSize:n,...c}=r||{},f=(I,R,N,U)=>Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/operation\",I),data:{operation:N,destination:R}},U),(W,ee)=>hs(t)(W.taskID,ee)),p=Math.random().toString(36).substring(7),h=`${t.indexName}_tmp_${p}`,E=l9({appId:t.appId,transporter:t.transporter,indexName:h}),C=[],S=f(t.indexName,h,\"copy\",{...c,scope:[\"settings\",\"synonyms\",\"rules\"]});C.push(S);let P=(s?S.wait(c):S).then(()=>{let I=E(e,{...c,autoGenerateObjectIDIfNotExist:a,batchSize:n});return C.push(I),s?I.wait(c):I}).then(()=>{let I=f(h,t.indexName,\"move\",c);return C.push(I),s?I.wait(c):I}).then(()=>Promise.all(C)).then(([I,R,N])=>({objectIDs:R.objectIDs,taskIDs:[I.taskID,...R.taskIDs,N.taskID]}));return Jt.createWaitablePromise(P,(I,R)=>Promise.all(C.map(N=>N.wait(R))))},Kft=t=>(e,r)=>c9(t)(e,{...r,clearExistingRules:!0}),zft=t=>(e,r)=>u9(t)(e,{...r,clearExistingSynonyms:!0}),Xft=t=>(e,r)=>Jt.createWaitablePromise(l9(t)([e],r).then(s=>({objectID:s.objectIDs[0],taskID:s.taskIDs[0]})),(s,a)=>hs(t)(s.taskID,a)),l9=t=>(e,r)=>{let{autoGenerateObjectIDIfNotExist:s,...a}=r||{},n=s?km.AddObject:km.UpdateObject;if(n===km.UpdateObject){for(let c of e)if(c.objectID===void 0)return Jt.createWaitablePromise(Promise.reject(dIe()))}return hF(t)(e,n,a)},Zft=t=>(e,r)=>c9(t)([e],r),c9=t=>(e,r)=>{let{forwardToReplicas:s,clearExistingRules:a,...n}=r||{},c=gl.createMappedRequestOptions(n);return s&&(c.queryParameters.forwardToReplicas=1),a&&(c.queryParameters.clearExistingRules=1),Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/rules/batch\",t.indexName),data:e},c),(f,p)=>hs(t)(f.taskID,p))},$ft=t=>(e,r)=>u9(t)([e],r),u9=t=>(e,r)=>{let{forwardToReplicas:s,clearExistingSynonyms:a,replaceExistingSynonyms:n,...c}=r||{},f=gl.createMappedRequestOptions(c);return s&&(f.queryParameters.forwardToReplicas=1),(n||a)&&(f.queryParameters.replaceExistingSynonyms=1),Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/synonyms/batch\",t.indexName),data:e},f),(p,h)=>hs(t)(p.taskID,h))},SIe=t=>(e,r)=>t.transporter.read({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/query\",t.indexName),data:{query:e},cacheable:!0},r),DIe=t=>(e,r,s)=>t.transporter.read({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/facets/%s/query\",t.indexName,e),data:{facetQuery:r},cacheable:!0},s),bIe=t=>(e,r)=>t.transporter.read({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/rules/search\",t.indexName),data:{query:e}},r),PIe=t=>(e,r)=>t.transporter.read({method:br.MethodEnum.Post,path:Jt.encode(\"1/indexes/%s/synonyms/search\",t.indexName),data:{query:e}},r),eAt=t=>(e,r)=>{let{forwardToReplicas:s,...a}=r||{},n=gl.createMappedRequestOptions(a);return s&&(n.queryParameters.forwardToReplicas=1),Jt.createWaitablePromise(t.transporter.write({method:br.MethodEnum.Put,path:Jt.encode(\"1/indexes/%s/settings\",t.indexName),data:e},n),(c,f)=>hs(t)(c.taskID,f))},hs=t=>(e,r)=>Jt.createRetryablePromise(s=>BIe(t)(e,r).then(a=>a.status!==\"published\"?s():void 0)),tAt={AddObject:\"addObject\",Analytics:\"analytics\",Browser:\"browse\",DeleteIndex:\"deleteIndex\",DeleteObject:\"deleteObject\",EditSettings:\"editSettings\",Inference:\"inference\",ListIndexes:\"listIndexes\",Logs:\"logs\",Personalization:\"personalization\",Recommendation:\"recommendation\",Search:\"search\",SeeUnretrievableAttributes:\"seeUnretrievableAttributes\",Settings:\"settings\",Usage:\"usage\"},km={AddObject:\"addObject\",UpdateObject:\"updateObject\",PartialUpdateObject:\"partialUpdateObject\",PartialUpdateObjectNoCreate:\"partialUpdateObjectNoCreate\",DeleteObject:\"deleteObject\",DeleteIndex:\"delete\",ClearIndex:\"clear\"},gF={Settings:\"settings\",Synonyms:\"synonyms\",Rules:\"rules\"},rAt={None:\"none\",StopIfEnoughMatches:\"stopIfEnoughMatches\"},nAt={Synonym:\"synonym\",OneWaySynonym:\"oneWaySynonym\",AltCorrection1:\"altCorrection1\",AltCorrection2:\"altCorrection2\",Placeholder:\"placeholder\"};Ft.ApiKeyACLEnum=tAt;Ft.BatchActionEnum=km;Ft.ScopeEnum=gF;Ft.StrategyEnum=rAt;Ft.SynonymEnum=nAt;Ft.addApiKey=Jut;Ft.assignUserID=Kut;Ft.assignUserIDs=zut;Ft.batch=IIe;Ft.browseObjects=Pft;Ft.browseRules=xft;Ft.browseSynonyms=kft;Ft.chunkedBatch=hF;Ft.clearDictionaryEntries=Xut;Ft.clearObjects=Qft;Ft.clearRules=Tft;Ft.clearSynonyms=Rft;Ft.copyIndex=pF;Ft.copyRules=Zut;Ft.copySettings=$ut;Ft.copySynonyms=eft;Ft.createBrowsablePromise=AF;Ft.createMissingObjectIDError=dIe;Ft.createObjectNotFoundError=mIe;Ft.createSearchClient=Vut;Ft.createValidUntilNotFoundError=yIe;Ft.customRequest=tft;Ft.deleteApiKey=rft;Ft.deleteBy=Fft;Ft.deleteDictionaryEntries=nft;Ft.deleteIndex=Nft;Ft.deleteObject=Oft;Ft.deleteObjects=CIe;Ft.deleteRule=Lft;Ft.deleteSynonym=Mft;Ft.exists=Uft;Ft.findAnswers=_ft;Ft.findObject=Hft;Ft.generateSecuredApiKey=ift;Ft.getApiKey=kS;Ft.getAppTask=EIe;Ft.getDictionarySettings=sft;Ft.getLogs=oft;Ft.getObject=jft;Ft.getObjectPosition=Gft;Ft.getObjects=qft;Ft.getRule=Wft;Ft.getSecuredApiKeyRemainingValidity=aft;Ft.getSettings=wIe;Ft.getSynonym=Yft;Ft.getTask=BIe;Ft.getTopUserIDs=lft;Ft.getUserID=cft;Ft.hasPendingMappings=uft;Ft.initIndex=QS;Ft.listApiKeys=fft;Ft.listClusters=Aft;Ft.listIndices=pft;Ft.listUserIDs=hft;Ft.moveIndex=gft;Ft.multipleBatch=dft;Ft.multipleGetObjects=mft;Ft.multipleQueries=yft;Ft.multipleSearchForFacetValues=Eft;Ft.partialUpdateObject=Vft;Ft.partialUpdateObjects=vIe;Ft.removeUserID=Ift;Ft.replaceAllObjects=Jft;Ft.replaceAllRules=Kft;Ft.replaceAllSynonyms=zft;Ft.replaceDictionaryEntries=Cft;Ft.restoreApiKey=wft;Ft.saveDictionaryEntries=Bft;Ft.saveObject=Xft;Ft.saveObjects=l9;Ft.saveRule=Zft;Ft.saveRules=c9;Ft.saveSynonym=$ft;Ft.saveSynonyms=u9;Ft.search=SIe;Ft.searchDictionaryEntries=vft;Ft.searchForFacetValues=DIe;Ft.searchRules=bIe;Ft.searchSynonyms=PIe;Ft.searchUserIDs=Sft;Ft.setDictionarySettings=Dft;Ft.setSettings=eAt;Ft.updateApiKey=bft;Ft.waitAppTask=aw;Ft.waitTask=hs});var QIe=_((LJt,kIe)=>{kIe.exports=xIe()});var TIe=_(dF=>{\"use strict\";Object.defineProperty(dF,\"__esModule\",{value:!0});function iAt(){return{debug(t,e){return Promise.resolve()},info(t,e){return Promise.resolve()},error(t,e){return Promise.resolve()}}}var sAt={Debug:1,Info:2,Error:3};dF.LogLevelEnum=sAt;dF.createNullLogger=iAt});var FIe=_((UJt,RIe)=>{RIe.exports=TIe()});var MIe=_(f9=>{\"use strict\";Object.defineProperty(f9,\"__esModule\",{value:!0});var NIe=Ie(\"http\"),OIe=Ie(\"https\"),oAt=Ie(\"url\"),LIe={keepAlive:!0},aAt=new NIe.Agent(LIe),lAt=new OIe.Agent(LIe);function cAt({agent:t,httpAgent:e,httpsAgent:r,requesterOptions:s={}}={}){let a=e||t||aAt,n=r||t||lAt;return{send(c){return new Promise(f=>{let p=oAt.parse(c.url),h=p.query===null?p.pathname:`${p.pathname}?${p.query}`,E={...s,agent:p.protocol===\"https:\"?n:a,hostname:p.hostname,path:h,method:c.method,headers:{...s&&s.headers?s.headers:{},...c.headers},...p.port!==void 0?{port:p.port||\"\"}:{}},C=(p.protocol===\"https:\"?OIe:NIe).request(E,R=>{let N=[];R.on(\"data\",U=>{N=N.concat(U)}),R.on(\"end\",()=>{clearTimeout(P),clearTimeout(I),f({status:R.statusCode||0,content:Buffer.concat(N).toString(),isTimedOut:!1})})}),S=(R,N)=>setTimeout(()=>{C.abort(),f({status:0,content:N,isTimedOut:!0})},R*1e3),P=S(c.connectTimeout,\"Connection timeout\"),I;C.on(\"error\",R=>{clearTimeout(P),clearTimeout(I),f({status:0,content:R.message,isTimedOut:!1})}),C.once(\"response\",()=>{clearTimeout(P),I=S(c.responseTimeout,\"Socket timeout\")}),c.data!==void 0&&C.write(c.data),C.end()})},destroy(){return a.destroy(),n.destroy(),Promise.resolve()}}}f9.createNodeHttpRequester=cAt});var _Ie=_((HJt,UIe)=>{UIe.exports=MIe()});var qIe=_((jJt,GIe)=>{\"use strict\";var HIe=MEe(),uAt=HEe(),lw=fIe(),p9=vS(),A9=gIe(),Gt=QIe(),fAt=FIe(),AAt=_Ie(),pAt=bS();function jIe(t,e,r){let s={appId:t,apiKey:e,timeouts:{connect:2,read:5,write:30},requester:AAt.createNodeHttpRequester(),logger:fAt.createNullLogger(),responsesCache:HIe.createNullCache(),requestsCache:HIe.createNullCache(),hostsCache:uAt.createInMemoryCache(),userAgent:pAt.createUserAgent(p9.version).add({segment:\"Node.js\",version:process.versions.node})},a={...s,...r},n=()=>c=>A9.createPersonalizationClient({...s,...c,methods:{getPersonalizationStrategy:A9.getPersonalizationStrategy,setPersonalizationStrategy:A9.setPersonalizationStrategy}});return Gt.createSearchClient({...a,methods:{search:Gt.multipleQueries,searchForFacetValues:Gt.multipleSearchForFacetValues,multipleBatch:Gt.multipleBatch,multipleGetObjects:Gt.multipleGetObjects,multipleQueries:Gt.multipleQueries,copyIndex:Gt.copyIndex,copySettings:Gt.copySettings,copyRules:Gt.copyRules,copySynonyms:Gt.copySynonyms,moveIndex:Gt.moveIndex,listIndices:Gt.listIndices,getLogs:Gt.getLogs,listClusters:Gt.listClusters,multipleSearchForFacetValues:Gt.multipleSearchForFacetValues,getApiKey:Gt.getApiKey,addApiKey:Gt.addApiKey,listApiKeys:Gt.listApiKeys,updateApiKey:Gt.updateApiKey,deleteApiKey:Gt.deleteApiKey,restoreApiKey:Gt.restoreApiKey,assignUserID:Gt.assignUserID,assignUserIDs:Gt.assignUserIDs,getUserID:Gt.getUserID,searchUserIDs:Gt.searchUserIDs,listUserIDs:Gt.listUserIDs,getTopUserIDs:Gt.getTopUserIDs,removeUserID:Gt.removeUserID,hasPendingMappings:Gt.hasPendingMappings,generateSecuredApiKey:Gt.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:Gt.getSecuredApiKeyRemainingValidity,destroy:p9.destroy,clearDictionaryEntries:Gt.clearDictionaryEntries,deleteDictionaryEntries:Gt.deleteDictionaryEntries,getDictionarySettings:Gt.getDictionarySettings,getAppTask:Gt.getAppTask,replaceDictionaryEntries:Gt.replaceDictionaryEntries,saveDictionaryEntries:Gt.saveDictionaryEntries,searchDictionaryEntries:Gt.searchDictionaryEntries,setDictionarySettings:Gt.setDictionarySettings,waitAppTask:Gt.waitAppTask,customRequest:Gt.customRequest,initIndex:c=>f=>Gt.initIndex(c)(f,{methods:{batch:Gt.batch,delete:Gt.deleteIndex,findAnswers:Gt.findAnswers,getObject:Gt.getObject,getObjects:Gt.getObjects,saveObject:Gt.saveObject,saveObjects:Gt.saveObjects,search:Gt.search,searchForFacetValues:Gt.searchForFacetValues,waitTask:Gt.waitTask,setSettings:Gt.setSettings,getSettings:Gt.getSettings,partialUpdateObject:Gt.partialUpdateObject,partialUpdateObjects:Gt.partialUpdateObjects,deleteObject:Gt.deleteObject,deleteObjects:Gt.deleteObjects,deleteBy:Gt.deleteBy,clearObjects:Gt.clearObjects,browseObjects:Gt.browseObjects,getObjectPosition:Gt.getObjectPosition,findObject:Gt.findObject,exists:Gt.exists,saveSynonym:Gt.saveSynonym,saveSynonyms:Gt.saveSynonyms,getSynonym:Gt.getSynonym,searchSynonyms:Gt.searchSynonyms,browseSynonyms:Gt.browseSynonyms,deleteSynonym:Gt.deleteSynonym,clearSynonyms:Gt.clearSynonyms,replaceAllObjects:Gt.replaceAllObjects,replaceAllSynonyms:Gt.replaceAllSynonyms,searchRules:Gt.searchRules,getRule:Gt.getRule,deleteRule:Gt.deleteRule,saveRule:Gt.saveRule,saveRules:Gt.saveRules,replaceAllRules:Gt.replaceAllRules,browseRules:Gt.browseRules,clearRules:Gt.clearRules}}),initAnalytics:()=>c=>lw.createAnalyticsClient({...s,...c,methods:{addABTest:lw.addABTest,getABTest:lw.getABTest,getABTests:lw.getABTests,stopABTest:lw.stopABTest,deleteABTest:lw.deleteABTest}}),initPersonalization:n,initRecommendation:()=>c=>(a.logger.info(\"The `initRecommendation` method is deprecated. Use `initPersonalization` instead.\"),n()(c))}})}jIe.version=p9.version;GIe.exports=jIe});var g9=_((GJt,h9)=>{var WIe=qIe();h9.exports=WIe;h9.exports.default=WIe});var y9=_((WJt,JIe)=>{\"use strict\";var VIe=Object.getOwnPropertySymbols,gAt=Object.prototype.hasOwnProperty,dAt=Object.prototype.propertyIsEnumerable;function mAt(t){if(t==null)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(t)}function yAt(){try{if(!Object.assign)return!1;var t=new String(\"abc\");if(t[5]=\"de\",Object.getOwnPropertyNames(t)[0]===\"5\")return!1;for(var e={},r=0;r<10;r++)e[\"_\"+String.fromCharCode(r)]=r;var s=Object.getOwnPropertyNames(e).map(function(n){return e[n]});if(s.join(\"\")!==\"0123456789\")return!1;var a={};return\"abcdefghijklmnopqrst\".split(\"\").forEach(function(n){a[n]=n}),Object.keys(Object.assign({},a)).join(\"\")===\"abcdefghijklmnopqrst\"}catch{return!1}}JIe.exports=yAt()?Object.assign:function(t,e){for(var r,s=mAt(t),a,n=1;n<arguments.length;n++){r=Object(arguments[n]);for(var c in r)gAt.call(r,c)&&(s[c]=r[c]);if(VIe){a=VIe(r);for(var f=0;f<a.length;f++)dAt.call(r,a[f])&&(s[a[f]]=r[a[f]])}}return s}});var uCe=_(Dn=>{\"use strict\";var I9=y9(),cw=60103,XIe=60106;Dn.Fragment=60107;Dn.StrictMode=60108;Dn.Profiler=60114;var ZIe=60109,$Ie=60110,eCe=60112;Dn.Suspense=60113;var tCe=60115,rCe=60116;typeof Symbol==\"function\"&&Symbol.for&&(Gc=Symbol.for,cw=Gc(\"react.element\"),XIe=Gc(\"react.portal\"),Dn.Fragment=Gc(\"react.fragment\"),Dn.StrictMode=Gc(\"react.strict_mode\"),Dn.Profiler=Gc(\"react.profiler\"),ZIe=Gc(\"react.provider\"),$Ie=Gc(\"react.context\"),eCe=Gc(\"react.forward_ref\"),Dn.Suspense=Gc(\"react.suspense\"),tCe=Gc(\"react.memo\"),rCe=Gc(\"react.lazy\"));var Gc,KIe=typeof Symbol==\"function\"&&Symbol.iterator;function EAt(t){return t===null||typeof t!=\"object\"?null:(t=KIe&&t[KIe]||t[\"@@iterator\"],typeof t==\"function\"?t:null)}function TS(t){for(var e=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+t,r=1;r<arguments.length;r++)e+=\"&args[]=\"+encodeURIComponent(arguments[r]);return\"Minified React error #\"+t+\"; visit \"+e+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}var nCe={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},iCe={};function uw(t,e,r){this.props=t,this.context=e,this.refs=iCe,this.updater=r||nCe}uw.prototype.isReactComponent={};uw.prototype.setState=function(t,e){if(typeof t!=\"object\"&&typeof t!=\"function\"&&t!=null)throw Error(TS(85));this.updater.enqueueSetState(this,t,e,\"setState\")};uw.prototype.forceUpdate=function(t){this.updater.enqueueForceUpdate(this,t,\"forceUpdate\")};function sCe(){}sCe.prototype=uw.prototype;function C9(t,e,r){this.props=t,this.context=e,this.refs=iCe,this.updater=r||nCe}var w9=C9.prototype=new sCe;w9.constructor=C9;I9(w9,uw.prototype);w9.isPureReactComponent=!0;var B9={current:null},oCe=Object.prototype.hasOwnProperty,aCe={key:!0,ref:!0,__self:!0,__source:!0};function lCe(t,e,r){var s,a={},n=null,c=null;if(e!=null)for(s in e.ref!==void 0&&(c=e.ref),e.key!==void 0&&(n=\"\"+e.key),e)oCe.call(e,s)&&!aCe.hasOwnProperty(s)&&(a[s]=e[s]);var f=arguments.length-2;if(f===1)a.children=r;else if(1<f){for(var p=Array(f),h=0;h<f;h++)p[h]=arguments[h+2];a.children=p}if(t&&t.defaultProps)for(s in f=t.defaultProps,f)a[s]===void 0&&(a[s]=f[s]);return{$$typeof:cw,type:t,key:n,ref:c,props:a,_owner:B9.current}}function IAt(t,e){return{$$typeof:cw,type:t.type,key:e,ref:t.ref,props:t.props,_owner:t._owner}}function v9(t){return typeof t==\"object\"&&t!==null&&t.$$typeof===cw}function CAt(t){var e={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+t.replace(/[=:]/g,function(r){return e[r]})}var zIe=/\\/+/g;function E9(t,e){return typeof t==\"object\"&&t!==null&&t.key!=null?CAt(\"\"+t.key):e.toString(36)}function yF(t,e,r,s,a){var n=typeof t;(n===\"undefined\"||n===\"boolean\")&&(t=null);var c=!1;if(t===null)c=!0;else switch(n){case\"string\":case\"number\":c=!0;break;case\"object\":switch(t.$$typeof){case cw:case XIe:c=!0}}if(c)return c=t,a=a(c),t=s===\"\"?\".\"+E9(c,0):s,Array.isArray(a)?(r=\"\",t!=null&&(r=t.replace(zIe,\"$&/\")+\"/\"),yF(a,e,r,\"\",function(h){return h})):a!=null&&(v9(a)&&(a=IAt(a,r+(!a.key||c&&c.key===a.key?\"\":(\"\"+a.key).replace(zIe,\"$&/\")+\"/\")+t)),e.push(a)),1;if(c=0,s=s===\"\"?\".\":s+\":\",Array.isArray(t))for(var f=0;f<t.length;f++){n=t[f];var p=s+E9(n,f);c+=yF(n,e,r,p,a)}else if(p=EAt(t),typeof p==\"function\")for(t=p.call(t),f=0;!(n=t.next()).done;)n=n.value,p=s+E9(n,f++),c+=yF(n,e,r,p,a);else if(n===\"object\")throw e=\"\"+t,Error(TS(31,e===\"[object Object]\"?\"object with keys {\"+Object.keys(t).join(\", \")+\"}\":e));return c}function mF(t,e,r){if(t==null)return t;var s=[],a=0;return yF(t,s,\"\",\"\",function(n){return e.call(r,n,a++)}),s}function wAt(t){if(t._status===-1){var e=t._result;e=e(),t._status=0,t._result=e,e.then(function(r){t._status===0&&(r=r.default,t._status=1,t._result=r)},function(r){t._status===0&&(t._status=2,t._result=r)})}if(t._status===1)return t._result;throw t._result}var cCe={current:null};function Zp(){var t=cCe.current;if(t===null)throw Error(TS(321));return t}var BAt={ReactCurrentDispatcher:cCe,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:B9,IsSomeRendererActing:{current:!1},assign:I9};Dn.Children={map:mF,forEach:function(t,e,r){mF(t,function(){e.apply(this,arguments)},r)},count:function(t){var e=0;return mF(t,function(){e++}),e},toArray:function(t){return mF(t,function(e){return e})||[]},only:function(t){if(!v9(t))throw Error(TS(143));return t}};Dn.Component=uw;Dn.PureComponent=C9;Dn.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=BAt;Dn.cloneElement=function(t,e,r){if(t==null)throw Error(TS(267,t));var s=I9({},t.props),a=t.key,n=t.ref,c=t._owner;if(e!=null){if(e.ref!==void 0&&(n=e.ref,c=B9.current),e.key!==void 0&&(a=\"\"+e.key),t.type&&t.type.defaultProps)var f=t.type.defaultProps;for(p in e)oCe.call(e,p)&&!aCe.hasOwnProperty(p)&&(s[p]=e[p]===void 0&&f!==void 0?f[p]:e[p])}var p=arguments.length-2;if(p===1)s.children=r;else if(1<p){f=Array(p);for(var h=0;h<p;h++)f[h]=arguments[h+2];s.children=f}return{$$typeof:cw,type:t.type,key:a,ref:n,props:s,_owner:c}};Dn.createContext=function(t,e){return e===void 0&&(e=null),t={$$typeof:$Ie,_calculateChangedBits:e,_currentValue:t,_currentValue2:t,_threadCount:0,Provider:null,Consumer:null},t.Provider={$$typeof:ZIe,_context:t},t.Consumer=t};Dn.createElement=lCe;Dn.createFactory=function(t){var e=lCe.bind(null,t);return e.type=t,e};Dn.createRef=function(){return{current:null}};Dn.forwardRef=function(t){return{$$typeof:eCe,render:t}};Dn.isValidElement=v9;Dn.lazy=function(t){return{$$typeof:rCe,_payload:{_status:-1,_result:t},_init:wAt}};Dn.memo=function(t,e){return{$$typeof:tCe,type:t,compare:e===void 0?null:e}};Dn.useCallback=function(t,e){return Zp().useCallback(t,e)};Dn.useContext=function(t,e){return Zp().useContext(t,e)};Dn.useDebugValue=function(){};Dn.useEffect=function(t,e){return Zp().useEffect(t,e)};Dn.useImperativeHandle=function(t,e,r){return Zp().useImperativeHandle(t,e,r)};Dn.useLayoutEffect=function(t,e){return Zp().useLayoutEffect(t,e)};Dn.useMemo=function(t,e){return Zp().useMemo(t,e)};Dn.useReducer=function(t,e,r){return Zp().useReducer(t,e,r)};Dn.useRef=function(t){return Zp().useRef(t)};Dn.useState=function(t){return Zp().useState(t)};Dn.version=\"17.0.2\"});var hn=_((VJt,fCe)=>{\"use strict\";fCe.exports=uCe()});var EF=_((JJt,ACe)=>{function vAt(t){var e=typeof t;return t!=null&&(e==\"object\"||e==\"function\")}ACe.exports=vAt});var hCe=_((KJt,pCe)=>{var SAt=typeof global==\"object\"&&global&&global.Object===Object&&global;pCe.exports=SAt});var S9=_((zJt,gCe)=>{var DAt=hCe(),bAt=typeof self==\"object\"&&self&&self.Object===Object&&self,PAt=DAt||bAt||Function(\"return this\")();gCe.exports=PAt});var mCe=_((XJt,dCe)=>{var xAt=S9(),kAt=function(){return xAt.Date.now()};dCe.exports=kAt});var ECe=_((ZJt,yCe)=>{var QAt=/\\s/;function TAt(t){for(var e=t.length;e--&&QAt.test(t.charAt(e)););return e}yCe.exports=TAt});var CCe=_(($Jt,ICe)=>{var RAt=ECe(),FAt=/^\\s+/;function NAt(t){return t&&t.slice(0,RAt(t)+1).replace(FAt,\"\")}ICe.exports=NAt});var D9=_((eKt,wCe)=>{var OAt=S9(),LAt=OAt.Symbol;wCe.exports=LAt});var DCe=_((tKt,SCe)=>{var BCe=D9(),vCe=Object.prototype,MAt=vCe.hasOwnProperty,UAt=vCe.toString,RS=BCe?BCe.toStringTag:void 0;function _At(t){var e=MAt.call(t,RS),r=t[RS];try{t[RS]=void 0;var s=!0}catch{}var a=UAt.call(t);return s&&(e?t[RS]=r:delete t[RS]),a}SCe.exports=_At});var PCe=_((rKt,bCe)=>{var HAt=Object.prototype,jAt=HAt.toString;function GAt(t){return jAt.call(t)}bCe.exports=GAt});var TCe=_((nKt,QCe)=>{var xCe=D9(),qAt=DCe(),WAt=PCe(),YAt=\"[object Null]\",VAt=\"[object Undefined]\",kCe=xCe?xCe.toStringTag:void 0;function JAt(t){return t==null?t===void 0?VAt:YAt:kCe&&kCe in Object(t)?qAt(t):WAt(t)}QCe.exports=JAt});var FCe=_((iKt,RCe)=>{function KAt(t){return t!=null&&typeof t==\"object\"}RCe.exports=KAt});var OCe=_((sKt,NCe)=>{var zAt=TCe(),XAt=FCe(),ZAt=\"[object Symbol]\";function $At(t){return typeof t==\"symbol\"||XAt(t)&&zAt(t)==ZAt}NCe.exports=$At});var _Ce=_((oKt,UCe)=>{var ept=CCe(),LCe=EF(),tpt=OCe(),MCe=NaN,rpt=/^[-+]0x[0-9a-f]+$/i,npt=/^0b[01]+$/i,ipt=/^0o[0-7]+$/i,spt=parseInt;function opt(t){if(typeof t==\"number\")return t;if(tpt(t))return MCe;if(LCe(t)){var e=typeof t.valueOf==\"function\"?t.valueOf():t;t=LCe(e)?e+\"\":e}if(typeof t!=\"string\")return t===0?t:+t;t=ept(t);var r=npt.test(t);return r||ipt.test(t)?spt(t.slice(2),r?2:8):rpt.test(t)?MCe:+t}UCe.exports=opt});var GCe=_((aKt,jCe)=>{var apt=EF(),b9=mCe(),HCe=_Ce(),lpt=\"Expected a function\",cpt=Math.max,upt=Math.min;function fpt(t,e,r){var s,a,n,c,f,p,h=0,E=!1,C=!1,S=!0;if(typeof t!=\"function\")throw new TypeError(lpt);e=HCe(e)||0,apt(r)&&(E=!!r.leading,C=\"maxWait\"in r,n=C?cpt(HCe(r.maxWait)||0,e):n,S=\"trailing\"in r?!!r.trailing:S);function P(le){var me=s,pe=a;return s=a=void 0,h=le,c=t.apply(pe,me),c}function I(le){return h=le,f=setTimeout(U,e),E?P(le):c}function R(le){var me=le-p,pe=le-h,Be=e-me;return C?upt(Be,n-pe):Be}function N(le){var me=le-p,pe=le-h;return p===void 0||me>=e||me<0||C&&pe>=n}function U(){var le=b9();if(N(le))return W(le);f=setTimeout(U,R(le))}function W(le){return f=void 0,S&&s?P(le):(s=a=void 0,c)}function ee(){f!==void 0&&clearTimeout(f),h=0,s=p=a=f=void 0}function ie(){return f===void 0?c:W(b9())}function ue(){var le=b9(),me=N(le);if(s=arguments,a=this,p=le,me){if(f===void 0)return I(p);if(C)return clearTimeout(f),f=setTimeout(U,e),P(p)}return f===void 0&&(f=setTimeout(U,e)),c}return ue.cancel=ee,ue.flush=ie,ue}jCe.exports=fpt});var WCe=_((lKt,qCe)=>{var Apt=GCe(),ppt=EF(),hpt=\"Expected a function\";function gpt(t,e,r){var s=!0,a=!0;if(typeof t!=\"function\")throw new TypeError(hpt);return ppt(r)&&(s=\"leading\"in r?!!r.leading:s,a=\"trailing\"in r?!!r.trailing:a),Apt(t,e,{leading:s,maxWait:e,trailing:a})}qCe.exports=gpt});var x9=_((cKt,P9)=>{\"use strict\";var Cn=P9.exports;P9.exports.default=Cn;var Xn=\"\\x1B[\",NS=\"\\x1B]\",fw=\"\\x07\",IF=\";\",YCe=process.env.TERM_PROGRAM===\"Apple_Terminal\";Cn.cursorTo=(t,e)=>{if(typeof t!=\"number\")throw new TypeError(\"The `x` argument is required\");return typeof e!=\"number\"?Xn+(t+1)+\"G\":Xn+(e+1)+\";\"+(t+1)+\"H\"};Cn.cursorMove=(t,e)=>{if(typeof t!=\"number\")throw new TypeError(\"The `x` argument is required\");let r=\"\";return t<0?r+=Xn+-t+\"D\":t>0&&(r+=Xn+t+\"C\"),e<0?r+=Xn+-e+\"A\":e>0&&(r+=Xn+e+\"B\"),r};Cn.cursorUp=(t=1)=>Xn+t+\"A\";Cn.cursorDown=(t=1)=>Xn+t+\"B\";Cn.cursorForward=(t=1)=>Xn+t+\"C\";Cn.cursorBackward=(t=1)=>Xn+t+\"D\";Cn.cursorLeft=Xn+\"G\";Cn.cursorSavePosition=YCe?\"\\x1B7\":Xn+\"s\";Cn.cursorRestorePosition=YCe?\"\\x1B8\":Xn+\"u\";Cn.cursorGetPosition=Xn+\"6n\";Cn.cursorNextLine=Xn+\"E\";Cn.cursorPrevLine=Xn+\"F\";Cn.cursorHide=Xn+\"?25l\";Cn.cursorShow=Xn+\"?25h\";Cn.eraseLines=t=>{let e=\"\";for(let r=0;r<t;r++)e+=Cn.eraseLine+(r<t-1?Cn.cursorUp():\"\");return t&&(e+=Cn.cursorLeft),e};Cn.eraseEndLine=Xn+\"K\";Cn.eraseStartLine=Xn+\"1K\";Cn.eraseLine=Xn+\"2K\";Cn.eraseDown=Xn+\"J\";Cn.eraseUp=Xn+\"1J\";Cn.eraseScreen=Xn+\"2J\";Cn.scrollUp=Xn+\"S\";Cn.scrollDown=Xn+\"T\";Cn.clearScreen=\"\\x1Bc\";Cn.clearTerminal=process.platform===\"win32\"?`${Cn.eraseScreen}${Xn}0f`:`${Cn.eraseScreen}${Xn}3J${Xn}H`;Cn.beep=fw;Cn.link=(t,e)=>[NS,\"8\",IF,IF,e,fw,t,NS,\"8\",IF,IF,fw].join(\"\");Cn.image=(t,e={})=>{let r=`${NS}1337;File=inline=1`;return e.width&&(r+=`;width=${e.width}`),e.height&&(r+=`;height=${e.height}`),e.preserveAspectRatio===!1&&(r+=\";preserveAspectRatio=0\"),r+\":\"+t.toString(\"base64\")+fw};Cn.iTerm={setCwd:(t=process.cwd())=>`${NS}50;CurrentDir=${t}${fw}`,annotation:(t,e={})=>{let r=`${NS}1337;`,s=typeof e.x<\"u\",a=typeof e.y<\"u\";if((s||a)&&!(s&&a&&typeof e.length<\"u\"))throw new Error(\"`x`, `y` and `length` must be defined when `x` or `y` is defined\");return t=t.replace(/\\|/g,\"\"),r+=e.isHidden?\"AddHiddenAnnotation=\":\"AddAnnotation=\",e.length>0?r+=(s?[t,e.length,e.x,e.y]:[e.length,t]).join(\"|\"):r+=t,r+fw}}});var JCe=_((uKt,k9)=>{\"use strict\";var VCe=(t,e)=>{for(let r of Reflect.ownKeys(e))Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(e,r));return t};k9.exports=VCe;k9.exports.default=VCe});var zCe=_((fKt,wF)=>{\"use strict\";var dpt=JCe(),CF=new WeakMap,KCe=(t,e={})=>{if(typeof t!=\"function\")throw new TypeError(\"Expected a function\");let r,s=0,a=t.displayName||t.name||\"<anonymous>\",n=function(...c){if(CF.set(n,++s),s===1)r=t.apply(this,c),t=null;else if(e.throw===!0)throw new Error(`Function \\`${a}\\` can only be called once`);return r};return dpt(n,t),CF.set(n,s),n};wF.exports=KCe;wF.exports.default=KCe;wF.exports.callCount=t=>{if(!CF.has(t))throw new Error(`The given function \\`${t.name}\\` is not wrapped by the \\`onetime\\` package`);return CF.get(t)}});var XCe=_((AKt,BF)=>{BF.exports=[\"SIGABRT\",\"SIGALRM\",\"SIGHUP\",\"SIGINT\",\"SIGTERM\"];process.platform!==\"win32\"&&BF.exports.push(\"SIGVTALRM\",\"SIGXCPU\",\"SIGXFSZ\",\"SIGUSR2\",\"SIGTRAP\",\"SIGSYS\",\"SIGQUIT\",\"SIGIOT\");process.platform===\"linux\"&&BF.exports.push(\"SIGIO\",\"SIGPOLL\",\"SIGPWR\",\"SIGSTKFLT\",\"SIGUNUSED\")});var R9=_((pKt,hw)=>{var Qi=global.process,Qm=function(t){return t&&typeof t==\"object\"&&typeof t.removeListener==\"function\"&&typeof t.emit==\"function\"&&typeof t.reallyExit==\"function\"&&typeof t.listeners==\"function\"&&typeof t.kill==\"function\"&&typeof t.pid==\"number\"&&typeof t.on==\"function\"};Qm(Qi)?(ZCe=Ie(\"assert\"),Aw=XCe(),$Ce=/^win/i.test(Qi.platform),OS=Ie(\"events\"),typeof OS!=\"function\"&&(OS=OS.EventEmitter),Qi.__signal_exit_emitter__?Js=Qi.__signal_exit_emitter__:(Js=Qi.__signal_exit_emitter__=new OS,Js.count=0,Js.emitted={}),Js.infinite||(Js.setMaxListeners(1/0),Js.infinite=!0),hw.exports=function(t,e){if(!Qm(global.process))return function(){};ZCe.equal(typeof t,\"function\",\"a callback must be provided for exit handler\"),pw===!1&&Q9();var r=\"exit\";e&&e.alwaysLast&&(r=\"afterexit\");var s=function(){Js.removeListener(r,t),Js.listeners(\"exit\").length===0&&Js.listeners(\"afterexit\").length===0&&vF()};return Js.on(r,t),s},vF=function(){!pw||!Qm(global.process)||(pw=!1,Aw.forEach(function(e){try{Qi.removeListener(e,SF[e])}catch{}}),Qi.emit=DF,Qi.reallyExit=T9,Js.count-=1)},hw.exports.unload=vF,Tm=function(e,r,s){Js.emitted[e]||(Js.emitted[e]=!0,Js.emit(e,r,s))},SF={},Aw.forEach(function(t){SF[t]=function(){if(Qm(global.process)){var r=Qi.listeners(t);r.length===Js.count&&(vF(),Tm(\"exit\",null,t),Tm(\"afterexit\",null,t),$Ce&&t===\"SIGHUP\"&&(t=\"SIGINT\"),Qi.kill(Qi.pid,t))}}}),hw.exports.signals=function(){return Aw},pw=!1,Q9=function(){pw||!Qm(global.process)||(pw=!0,Js.count+=1,Aw=Aw.filter(function(e){try{return Qi.on(e,SF[e]),!0}catch{return!1}}),Qi.emit=twe,Qi.reallyExit=ewe)},hw.exports.load=Q9,T9=Qi.reallyExit,ewe=function(e){Qm(global.process)&&(Qi.exitCode=e||0,Tm(\"exit\",Qi.exitCode,null),Tm(\"afterexit\",Qi.exitCode,null),T9.call(Qi,Qi.exitCode))},DF=Qi.emit,twe=function(e,r){if(e===\"exit\"&&Qm(global.process)){r!==void 0&&(Qi.exitCode=r);var s=DF.apply(this,arguments);return Tm(\"exit\",Qi.exitCode,null),Tm(\"afterexit\",Qi.exitCode,null),s}else return DF.apply(this,arguments)}):hw.exports=function(){return function(){}};var ZCe,Aw,$Ce,OS,Js,vF,Tm,SF,pw,Q9,T9,ewe,DF,twe});var nwe=_((hKt,rwe)=>{\"use strict\";var mpt=zCe(),ypt=R9();rwe.exports=mpt(()=>{ypt(()=>{process.stderr.write(\"\\x1B[?25h\")},{alwaysLast:!0})})});var F9=_(gw=>{\"use strict\";var Ept=nwe(),bF=!1;gw.show=(t=process.stderr)=>{t.isTTY&&(bF=!1,t.write(\"\\x1B[?25h\"))};gw.hide=(t=process.stderr)=>{t.isTTY&&(Ept(),bF=!0,t.write(\"\\x1B[?25l\"))};gw.toggle=(t,e)=>{t!==void 0&&(bF=t),bF?gw.show(e):gw.hide(e)}});var awe=_(LS=>{\"use strict\";var owe=LS&&LS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(LS,\"__esModule\",{value:!0});var iwe=owe(x9()),swe=owe(F9()),Ipt=(t,{showCursor:e=!1}={})=>{let r=0,s=\"\",a=!1,n=c=>{!e&&!a&&(swe.default.hide(),a=!0);let f=c+`\n`;f!==s&&(s=f,t.write(iwe.default.eraseLines(r)+f),r=f.split(`\n`).length)};return n.clear=()=>{t.write(iwe.default.eraseLines(r)),s=\"\",r=0},n.done=()=>{s=\"\",r=0,e||(swe.default.show(),a=!1)},n};LS.default={create:Ipt}});var lwe=_((mKt,Cpt)=>{Cpt.exports=[{name:\"AppVeyor\",constant:\"APPVEYOR\",env:\"APPVEYOR\",pr:\"APPVEYOR_PULL_REQUEST_NUMBER\"},{name:\"Azure Pipelines\",constant:\"AZURE_PIPELINES\",env:\"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI\",pr:\"SYSTEM_PULLREQUEST_PULLREQUESTID\"},{name:\"Bamboo\",constant:\"BAMBOO\",env:\"bamboo_planKey\"},{name:\"Bitbucket Pipelines\",constant:\"BITBUCKET\",env:\"BITBUCKET_COMMIT\",pr:\"BITBUCKET_PR_ID\"},{name:\"Bitrise\",constant:\"BITRISE\",env:\"BITRISE_IO\",pr:\"BITRISE_PULL_REQUEST\"},{name:\"Buddy\",constant:\"BUDDY\",env:\"BUDDY_WORKSPACE_ID\",pr:\"BUDDY_EXECUTION_PULL_REQUEST_ID\"},{name:\"Buildkite\",constant:\"BUILDKITE\",env:\"BUILDKITE\",pr:{env:\"BUILDKITE_PULL_REQUEST\",ne:\"false\"}},{name:\"CircleCI\",constant:\"CIRCLE\",env:\"CIRCLECI\",pr:\"CIRCLE_PULL_REQUEST\"},{name:\"Cirrus CI\",constant:\"CIRRUS\",env:\"CIRRUS_CI\",pr:\"CIRRUS_PR\"},{name:\"AWS CodeBuild\",constant:\"CODEBUILD\",env:\"CODEBUILD_BUILD_ARN\"},{name:\"Codeship\",constant:\"CODESHIP\",env:{CI_NAME:\"codeship\"}},{name:\"Drone\",constant:\"DRONE\",env:\"DRONE\",pr:{DRONE_BUILD_EVENT:\"pull_request\"}},{name:\"dsari\",constant:\"DSARI\",env:\"DSARI\"},{name:\"GitLab CI\",constant:\"GITLAB\",env:\"GITLAB_CI\"},{name:\"GoCD\",constant:\"GOCD\",env:\"GO_PIPELINE_LABEL\"},{name:\"Hudson\",constant:\"HUDSON\",env:\"HUDSON_URL\"},{name:\"Jenkins\",constant:\"JENKINS\",env:[\"JENKINS_URL\",\"BUILD_ID\"],pr:{any:[\"ghprbPullId\",\"CHANGE_ID\"]}},{name:\"Magnum CI\",constant:\"MAGNUM\",env:\"MAGNUM\"},{name:\"Netlify CI\",constant:\"NETLIFY\",env:\"NETLIFY_BUILD_BASE\",pr:{env:\"PULL_REQUEST\",ne:\"false\"}},{name:\"Sail CI\",constant:\"SAIL\",env:\"SAILCI\",pr:\"SAIL_PULL_REQUEST_NUMBER\"},{name:\"Semaphore\",constant:\"SEMAPHORE\",env:\"SEMAPHORE\",pr:\"PULL_REQUEST_NUMBER\"},{name:\"Shippable\",constant:\"SHIPPABLE\",env:\"SHIPPABLE\",pr:{IS_PULL_REQUEST:\"true\"}},{name:\"Solano CI\",constant:\"SOLANO\",env:\"TDDIUM\",pr:\"TDDIUM_PR_ID\"},{name:\"Strider CD\",constant:\"STRIDER\",env:\"STRIDER\"},{name:\"TaskCluster\",constant:\"TASKCLUSTER\",env:[\"TASK_ID\",\"RUN_ID\"]},{name:\"TeamCity\",constant:\"TEAMCITY\",env:\"TEAMCITY_VERSION\"},{name:\"Travis CI\",constant:\"TRAVIS\",env:\"TRAVIS\",pr:{env:\"TRAVIS_PULL_REQUEST\",ne:\"false\"}}]});var fwe=_(tc=>{\"use strict\";var uwe=lwe(),uA=process.env;Object.defineProperty(tc,\"_vendors\",{value:uwe.map(function(t){return t.constant})});tc.name=null;tc.isPR=null;uwe.forEach(function(t){var e=Array.isArray(t.env)?t.env:[t.env],r=e.every(function(s){return cwe(s)});if(tc[t.constant]=r,r)switch(tc.name=t.name,typeof t.pr){case\"string\":tc.isPR=!!uA[t.pr];break;case\"object\":\"env\"in t.pr?tc.isPR=t.pr.env in uA&&uA[t.pr.env]!==t.pr.ne:\"any\"in t.pr?tc.isPR=t.pr.any.some(function(s){return!!uA[s]}):tc.isPR=cwe(t.pr);break;default:tc.isPR=null}});tc.isCI=!!(uA.CI||uA.CONTINUOUS_INTEGRATION||uA.BUILD_NUMBER||uA.RUN_ID||tc.name);function cwe(t){return typeof t==\"string\"?!!uA[t]:Object.keys(t).every(function(e){return uA[e]===t[e]})}});var pwe=_((EKt,Awe)=>{\"use strict\";Awe.exports=fwe().isCI});var gwe=_((IKt,hwe)=>{\"use strict\";var wpt=t=>{let e=new Set;do for(let r of Reflect.ownKeys(t))e.add([t,r]);while((t=Reflect.getPrototypeOf(t))&&t!==Object.prototype);return e};hwe.exports=(t,{include:e,exclude:r}={})=>{let s=a=>{let n=c=>typeof c==\"string\"?a===c:c.test(a);return e?e.some(n):r?!r.some(n):!0};for(let[a,n]of wpt(t.constructor.prototype)){if(n===\"constructor\"||!s(n))continue;let c=Reflect.getOwnPropertyDescriptor(a,n);c&&typeof c.value==\"function\"&&(t[n]=t[n].bind(t))}return t}});var Cwe=_(Vn=>{\"use strict\";var mw,_S,QF,H9;typeof performance==\"object\"&&typeof performance.now==\"function\"?(dwe=performance,Vn.unstable_now=function(){return dwe.now()}):(N9=Date,mwe=N9.now(),Vn.unstable_now=function(){return N9.now()-mwe});var dwe,N9,mwe;typeof window>\"u\"||typeof MessageChannel!=\"function\"?(dw=null,O9=null,L9=function(){if(dw!==null)try{var t=Vn.unstable_now();dw(!0,t),dw=null}catch(e){throw setTimeout(L9,0),e}},mw=function(t){dw!==null?setTimeout(mw,0,t):(dw=t,setTimeout(L9,0))},_S=function(t,e){O9=setTimeout(t,e)},QF=function(){clearTimeout(O9)},Vn.unstable_shouldYield=function(){return!1},H9=Vn.unstable_forceFrameRate=function(){}):(ywe=window.setTimeout,Ewe=window.clearTimeout,typeof console<\"u\"&&(Iwe=window.cancelAnimationFrame,typeof window.requestAnimationFrame!=\"function\"&&console.error(\"This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills\"),typeof Iwe!=\"function\"&&console.error(\"This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills\")),MS=!1,US=null,PF=-1,M9=5,U9=0,Vn.unstable_shouldYield=function(){return Vn.unstable_now()>=U9},H9=function(){},Vn.unstable_forceFrameRate=function(t){0>t||125<t?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):M9=0<t?Math.floor(1e3/t):5},_9=new MessageChannel,xF=_9.port2,_9.port1.onmessage=function(){if(US!==null){var t=Vn.unstable_now();U9=t+M9;try{US(!0,t)?xF.postMessage(null):(MS=!1,US=null)}catch(e){throw xF.postMessage(null),e}}else MS=!1},mw=function(t){US=t,MS||(MS=!0,xF.postMessage(null))},_S=function(t,e){PF=ywe(function(){t(Vn.unstable_now())},e)},QF=function(){Ewe(PF),PF=-1});var dw,O9,L9,ywe,Ewe,Iwe,MS,US,PF,M9,U9,_9,xF;function j9(t,e){var r=t.length;t.push(e);e:for(;;){var s=r-1>>>1,a=t[s];if(a!==void 0&&0<kF(a,e))t[s]=e,t[r]=a,r=s;else break e}}function ef(t){return t=t[0],t===void 0?null:t}function TF(t){var e=t[0];if(e!==void 0){var r=t.pop();if(r!==e){t[0]=r;e:for(var s=0,a=t.length;s<a;){var n=2*(s+1)-1,c=t[n],f=n+1,p=t[f];if(c!==void 0&&0>kF(c,r))p!==void 0&&0>kF(p,c)?(t[s]=p,t[f]=r,s=f):(t[s]=c,t[n]=r,s=n);else if(p!==void 0&&0>kF(p,r))t[s]=p,t[f]=r,s=f;else break e}}return e}return null}function kF(t,e){var r=t.sortIndex-e.sortIndex;return r!==0?r:t.id-e.id}var fA=[],Z0=[],Bpt=1,qc=null,$o=3,RF=!1,Rm=!1,HS=!1;function G9(t){for(var e=ef(Z0);e!==null;){if(e.callback===null)TF(Z0);else if(e.startTime<=t)TF(Z0),e.sortIndex=e.expirationTime,j9(fA,e);else break;e=ef(Z0)}}function q9(t){if(HS=!1,G9(t),!Rm)if(ef(fA)!==null)Rm=!0,mw(W9);else{var e=ef(Z0);e!==null&&_S(q9,e.startTime-t)}}function W9(t,e){Rm=!1,HS&&(HS=!1,QF()),RF=!0;var r=$o;try{for(G9(e),qc=ef(fA);qc!==null&&(!(qc.expirationTime>e)||t&&!Vn.unstable_shouldYield());){var s=qc.callback;if(typeof s==\"function\"){qc.callback=null,$o=qc.priorityLevel;var a=s(qc.expirationTime<=e);e=Vn.unstable_now(),typeof a==\"function\"?qc.callback=a:qc===ef(fA)&&TF(fA),G9(e)}else TF(fA);qc=ef(fA)}if(qc!==null)var n=!0;else{var c=ef(Z0);c!==null&&_S(q9,c.startTime-e),n=!1}return n}finally{qc=null,$o=r,RF=!1}}var vpt=H9;Vn.unstable_IdlePriority=5;Vn.unstable_ImmediatePriority=1;Vn.unstable_LowPriority=4;Vn.unstable_NormalPriority=3;Vn.unstable_Profiling=null;Vn.unstable_UserBlockingPriority=2;Vn.unstable_cancelCallback=function(t){t.callback=null};Vn.unstable_continueExecution=function(){Rm||RF||(Rm=!0,mw(W9))};Vn.unstable_getCurrentPriorityLevel=function(){return $o};Vn.unstable_getFirstCallbackNode=function(){return ef(fA)};Vn.unstable_next=function(t){switch($o){case 1:case 2:case 3:var e=3;break;default:e=$o}var r=$o;$o=e;try{return t()}finally{$o=r}};Vn.unstable_pauseExecution=function(){};Vn.unstable_requestPaint=vpt;Vn.unstable_runWithPriority=function(t,e){switch(t){case 1:case 2:case 3:case 4:case 5:break;default:t=3}var r=$o;$o=t;try{return e()}finally{$o=r}};Vn.unstable_scheduleCallback=function(t,e,r){var s=Vn.unstable_now();switch(typeof r==\"object\"&&r!==null?(r=r.delay,r=typeof r==\"number\"&&0<r?s+r:s):r=s,t){case 1:var a=-1;break;case 2:a=250;break;case 5:a=1073741823;break;case 4:a=1e4;break;default:a=5e3}return a=r+a,t={id:Bpt++,callback:e,priorityLevel:t,startTime:r,expirationTime:a,sortIndex:-1},r>s?(t.sortIndex=r,j9(Z0,t),ef(fA)===null&&t===ef(Z0)&&(HS?QF():HS=!0,_S(q9,r-s))):(t.sortIndex=a,j9(fA,t),Rm||RF||(Rm=!0,mw(W9))),t};Vn.unstable_wrapCallback=function(t){var e=$o;return function(){var r=$o;$o=e;try{return t.apply(this,arguments)}finally{$o=r}}}});var Y9=_((wKt,wwe)=>{\"use strict\";wwe.exports=Cwe()});var Bwe=_((BKt,jS)=>{jS.exports=function(e){var r={},s=y9(),a=hn(),n=Y9();function c(v){for(var D=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+v,Q=1;Q<arguments.length;Q++)D+=\"&args[]=\"+encodeURIComponent(arguments[Q]);return\"Minified React error #\"+v+\"; visit \"+D+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}var f=a.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,p=60103,h=60106,E=60107,C=60108,S=60114,P=60109,I=60110,R=60112,N=60113,U=60120,W=60115,ee=60116,ie=60121,ue=60129,le=60130,me=60131;if(typeof Symbol==\"function\"&&Symbol.for){var pe=Symbol.for;p=pe(\"react.element\"),h=pe(\"react.portal\"),E=pe(\"react.fragment\"),C=pe(\"react.strict_mode\"),S=pe(\"react.profiler\"),P=pe(\"react.provider\"),I=pe(\"react.context\"),R=pe(\"react.forward_ref\"),N=pe(\"react.suspense\"),U=pe(\"react.suspense_list\"),W=pe(\"react.memo\"),ee=pe(\"react.lazy\"),ie=pe(\"react.block\"),pe(\"react.scope\"),ue=pe(\"react.debug_trace_mode\"),le=pe(\"react.offscreen\"),me=pe(\"react.legacy_hidden\")}var Be=typeof Symbol==\"function\"&&Symbol.iterator;function Ce(v){return v===null||typeof v!=\"object\"?null:(v=Be&&v[Be]||v[\"@@iterator\"],typeof v==\"function\"?v:null)}function g(v){if(v==null)return null;if(typeof v==\"function\")return v.displayName||v.name||null;if(typeof v==\"string\")return v;switch(v){case E:return\"Fragment\";case h:return\"Portal\";case S:return\"Profiler\";case C:return\"StrictMode\";case N:return\"Suspense\";case U:return\"SuspenseList\"}if(typeof v==\"object\")switch(v.$$typeof){case I:return(v.displayName||\"Context\")+\".Consumer\";case P:return(v._context.displayName||\"Context\")+\".Provider\";case R:var D=v.render;return D=D.displayName||D.name||\"\",v.displayName||(D!==\"\"?\"ForwardRef(\"+D+\")\":\"ForwardRef\");case W:return g(v.type);case ie:return g(v._render);case ee:D=v._payload,v=v._init;try{return g(v(D))}catch{}}return null}function we(v){var D=v,Q=v;if(v.alternate)for(;D.return;)D=D.return;else{v=D;do D=v,D.flags&1026&&(Q=D.return),v=D.return;while(v)}return D.tag===3?Q:null}function ye(v){if(we(v)!==v)throw Error(c(188))}function Ae(v){var D=v.alternate;if(!D){if(D=we(v),D===null)throw Error(c(188));return D!==v?null:v}for(var Q=v,H=D;;){var V=Q.return;if(V===null)break;var ne=V.alternate;if(ne===null){if(H=V.return,H!==null){Q=H;continue}break}if(V.child===ne.child){for(ne=V.child;ne;){if(ne===Q)return ye(V),v;if(ne===H)return ye(V),D;ne=ne.sibling}throw Error(c(188))}if(Q.return!==H.return)Q=V,H=ne;else{for(var Se=!1,_e=V.child;_e;){if(_e===Q){Se=!0,Q=V,H=ne;break}if(_e===H){Se=!0,H=V,Q=ne;break}_e=_e.sibling}if(!Se){for(_e=ne.child;_e;){if(_e===Q){Se=!0,Q=ne,H=V;break}if(_e===H){Se=!0,H=ne,Q=V;break}_e=_e.sibling}if(!Se)throw Error(c(189))}}if(Q.alternate!==H)throw Error(c(190))}if(Q.tag!==3)throw Error(c(188));return Q.stateNode.current===Q?v:D}function se(v){if(v=Ae(v),!v)return null;for(var D=v;;){if(D.tag===5||D.tag===6)return D;if(D.child)D.child.return=D,D=D.child;else{if(D===v)break;for(;!D.sibling;){if(!D.return||D.return===v)return null;D=D.return}D.sibling.return=D.return,D=D.sibling}}return null}function Z(v){if(v=Ae(v),!v)return null;for(var D=v;;){if(D.tag===5||D.tag===6)return D;if(D.child&&D.tag!==4)D.child.return=D,D=D.child;else{if(D===v)break;for(;!D.sibling;){if(!D.return||D.return===v)return null;D=D.return}D.sibling.return=D.return,D=D.sibling}}return null}function De(v,D){for(var Q=v.alternate;D!==null;){if(D===v||D===Q)return!0;D=D.return}return!1}var Re=e.getPublicInstance,mt=e.getRootHostContext,j=e.getChildHostContext,rt=e.prepareForCommit,Fe=e.resetAfterCommit,Ne=e.createInstance,Pe=e.appendInitialChild,Ve=e.finalizeInitialChildren,ke=e.prepareUpdate,it=e.shouldSetTextContent,Ue=e.createTextInstance,x=e.scheduleTimeout,w=e.cancelTimeout,b=e.noTimeout,y=e.isPrimaryRenderer,F=e.supportsMutation,z=e.supportsPersistence,X=e.supportsHydration,$=e.getInstanceFromNode,oe=e.makeOpaqueHydratingObject,xe=e.makeClientId,Te=e.beforeActiveInstanceBlur,lt=e.afterActiveInstanceBlur,Ct=e.preparePortalMount,qt=e.supportsTestSelectors,ir=e.findFiberRoot,Pt=e.getBoundingRect,gn=e.getTextContent,Pr=e.isHiddenSubtree,Ir=e.matchAccessibilityRole,Or=e.setFocusIfFocusable,on=e.setupIntersectionObserver,ai=e.appendChild,Io=e.appendChildToContainer,rs=e.commitTextUpdate,$s=e.commitMount,Co=e.commitUpdate,ji=e.insertBefore,eo=e.insertInContainerBefore,wo=e.removeChild,QA=e.removeChildFromContainer,Af=e.resetTextContent,dh=e.hideInstance,mh=e.hideTextInstance,to=e.unhideInstance,jn=e.unhideTextInstance,Ts=e.clearContainer,ro=e.cloneInstance,ou=e.createContainerChildSet,au=e.appendChildToContainerChildSet,lu=e.finalizeContainerChildren,TA=e.replaceContainerChildren,RA=e.cloneHiddenInstance,oa=e.cloneHiddenTextInstance,aa=e.canHydrateInstance,FA=e.canHydrateTextInstance,gr=e.isSuspenseInstancePending,Bo=e.isSuspenseInstanceFallback,Me=e.getNextHydratableSibling,cu=e.getFirstHydratableChild,Cr=e.hydrateInstance,pf=e.hydrateTextInstance,NA=e.getNextHydratableInstanceAfterSuspenseInstance,OA=e.commitHydratedContainer,uu=e.commitHydratedSuspenseInstance,fu;function oc(v){if(fu===void 0)try{throw Error()}catch(Q){var D=Q.stack.trim().match(/\\n( *(at )?)/);fu=D&&D[1]||\"\"}return`\n`+fu+v}var ve=!1;function Nt(v,D){if(!v||ve)return\"\";ve=!0;var Q=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(D)if(D=function(){throw Error()},Object.defineProperty(D.prototype,\"props\",{set:function(){throw Error()}}),typeof Reflect==\"object\"&&Reflect.construct){try{Reflect.construct(D,[])}catch(pt){var H=pt}Reflect.construct(v,[],D)}else{try{D.call()}catch(pt){H=pt}v.call(D.prototype)}else{try{throw Error()}catch(pt){H=pt}v()}}catch(pt){if(pt&&H&&typeof pt.stack==\"string\"){for(var V=pt.stack.split(`\n`),ne=H.stack.split(`\n`),Se=V.length-1,_e=ne.length-1;1<=Se&&0<=_e&&V[Se]!==ne[_e];)_e--;for(;1<=Se&&0<=_e;Se--,_e--)if(V[Se]!==ne[_e]){if(Se!==1||_e!==1)do if(Se--,_e--,0>_e||V[Se]!==ne[_e])return`\n`+V[Se].replace(\" at new \",\" at \");while(1<=Se&&0<=_e);break}}}finally{ve=!1,Error.prepareStackTrace=Q}return(v=v?v.displayName||v.name:\"\")?oc(v):\"\"}var ac=[],Oi=-1;function no(v){return{current:v}}function Rt(v){0>Oi||(v.current=ac[Oi],ac[Oi]=null,Oi--)}function xn(v,D){Oi++,ac[Oi]=v.current,v.current=D}var la={},Gi=no(la),Li=no(!1),Na=la;function dn(v,D){var Q=v.type.contextTypes;if(!Q)return la;var H=v.stateNode;if(H&&H.__reactInternalMemoizedUnmaskedChildContext===D)return H.__reactInternalMemoizedMaskedChildContext;var V={},ne;for(ne in Q)V[ne]=D[ne];return H&&(v=v.stateNode,v.__reactInternalMemoizedUnmaskedChildContext=D,v.__reactInternalMemoizedMaskedChildContext=V),V}function Kn(v){return v=v.childContextTypes,v!=null}function Au(){Rt(Li),Rt(Gi)}function yh(v,D,Q){if(Gi.current!==la)throw Error(c(168));xn(Gi,D),xn(Li,Q)}function Oa(v,D,Q){var H=v.stateNode;if(v=D.childContextTypes,typeof H.getChildContext!=\"function\")return Q;H=H.getChildContext();for(var V in H)if(!(V in v))throw Error(c(108,g(D)||\"Unknown\",V));return s({},Q,H)}function La(v){return v=(v=v.stateNode)&&v.__reactInternalMemoizedMergedChildContext||la,Na=Gi.current,xn(Gi,v),xn(Li,Li.current),!0}function Ma(v,D,Q){var H=v.stateNode;if(!H)throw Error(c(169));Q?(v=Oa(v,D,Na),H.__reactInternalMemoizedMergedChildContext=v,Rt(Li),Rt(Gi),xn(Gi,v)):Rt(Li),xn(Li,Q)}var $e=null,Ua=null,hf=n.unstable_now;hf();var lc=0,wn=8;function ca(v){if(1&v)return wn=15,1;if(2&v)return wn=14,2;if(4&v)return wn=13,4;var D=24&v;return D!==0?(wn=12,D):v&32?(wn=11,32):(D=192&v,D!==0?(wn=10,D):v&256?(wn=9,256):(D=3584&v,D!==0?(wn=8,D):v&4096?(wn=7,4096):(D=4186112&v,D!==0?(wn=6,D):(D=62914560&v,D!==0?(wn=5,D):v&67108864?(wn=4,67108864):v&134217728?(wn=3,134217728):(D=805306368&v,D!==0?(wn=2,D):1073741824&v?(wn=1,1073741824):(wn=8,v))))))}function LA(v){switch(v){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}function MA(v){switch(v){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(c(358,v))}}function ua(v,D){var Q=v.pendingLanes;if(Q===0)return wn=0;var H=0,V=0,ne=v.expiredLanes,Se=v.suspendedLanes,_e=v.pingedLanes;if(ne!==0)H=ne,V=wn=15;else if(ne=Q&134217727,ne!==0){var pt=ne&~Se;pt!==0?(H=ca(pt),V=wn):(_e&=ne,_e!==0&&(H=ca(_e),V=wn))}else ne=Q&~Se,ne!==0?(H=ca(ne),V=wn):_e!==0&&(H=ca(_e),V=wn);if(H===0)return 0;if(H=31-ns(H),H=Q&((0>H?0:1<<H)<<1)-1,D!==0&&D!==H&&!(D&Se)){if(ca(D),V<=wn)return D;wn=V}if(D=v.entangledLanes,D!==0)for(v=v.entanglements,D&=H;0<D;)Q=31-ns(D),V=1<<Q,H|=v[Q],D&=~V;return H}function Bl(v){return v=v.pendingLanes&-1073741825,v!==0?v:v&1073741824?1073741824:0}function Mt(v,D){switch(v){case 15:return 1;case 14:return 2;case 12:return v=kn(24&~D),v===0?Mt(10,D):v;case 10:return v=kn(192&~D),v===0?Mt(8,D):v;case 8:return v=kn(3584&~D),v===0&&(v=kn(4186112&~D),v===0&&(v=512)),v;case 2:return D=kn(805306368&~D),D===0&&(D=268435456),D}throw Error(c(358,v))}function kn(v){return v&-v}function fa(v){for(var D=[],Q=0;31>Q;Q++)D.push(v);return D}function Ha(v,D,Q){v.pendingLanes|=D;var H=D-1;v.suspendedLanes&=H,v.pingedLanes&=H,v=v.eventTimes,D=31-ns(D),v[D]=Q}var ns=Math.clz32?Math.clz32:uc,cc=Math.log,pu=Math.LN2;function uc(v){return v===0?32:31-(cc(v)/pu|0)|0}var ja=n.unstable_runWithPriority,Mi=n.unstable_scheduleCallback,Is=n.unstable_cancelCallback,vl=n.unstable_shouldYield,gf=n.unstable_requestPaint,fc=n.unstable_now,wi=n.unstable_getCurrentPriorityLevel,Qn=n.unstable_ImmediatePriority,Ac=n.unstable_UserBlockingPriority,Ke=n.unstable_NormalPriority,st=n.unstable_LowPriority,St=n.unstable_IdlePriority,lr={},te=gf!==void 0?gf:function(){},Ee=null,Oe=null,dt=!1,Et=fc(),bt=1e4>Et?fc:function(){return fc()-Et};function tr(){switch(wi()){case Qn:return 99;case Ac:return 98;case Ke:return 97;case st:return 96;case St:return 95;default:throw Error(c(332))}}function An(v){switch(v){case 99:return Qn;case 98:return Ac;case 97:return Ke;case 96:return st;case 95:return St;default:throw Error(c(332))}}function li(v,D){return v=An(v),ja(v,D)}function qi(v,D,Q){return v=An(v),Mi(v,D,Q)}function Tn(){if(Oe!==null){var v=Oe;Oe=null,Is(v)}Ga()}function Ga(){if(!dt&&Ee!==null){dt=!0;var v=0;try{var D=Ee;li(99,function(){for(;v<D.length;v++){var Q=D[v];do Q=Q(!0);while(Q!==null)}}),Ee=null}catch(Q){throw Ee!==null&&(Ee=Ee.slice(v+1)),Mi(Qn,Tn),Q}finally{dt=!1}}}var my=f.ReactCurrentBatchConfig;function Z1(v,D){return v===D&&(v!==0||1/v===1/D)||v!==v&&D!==D}var vo=typeof Object.is==\"function\"?Object.is:Z1,yy=Object.prototype.hasOwnProperty;function Eh(v,D){if(vo(v,D))return!0;if(typeof v!=\"object\"||v===null||typeof D!=\"object\"||D===null)return!1;var Q=Object.keys(v),H=Object.keys(D);if(Q.length!==H.length)return!1;for(H=0;H<Q.length;H++)if(!yy.call(D,Q[H])||!vo(v[Q[H]],D[Q[H]]))return!1;return!0}function $1(v){switch(v.tag){case 5:return oc(v.type);case 16:return oc(\"Lazy\");case 13:return oc(\"Suspense\");case 19:return oc(\"SuspenseList\");case 0:case 2:case 15:return v=Nt(v.type,!1),v;case 11:return v=Nt(v.type.render,!1),v;case 22:return v=Nt(v.type._render,!1),v;case 1:return v=Nt(v.type,!0),v;default:return\"\"}}function So(v,D){if(v&&v.defaultProps){D=s({},D),v=v.defaultProps;for(var Q in v)D[Q]===void 0&&(D[Q]=v[Q]);return D}return D}var Ih=no(null),Ch=null,hu=null,wh=null;function Fg(){wh=hu=Ch=null}function Ng(v,D){v=v.type._context,y?(xn(Ih,v._currentValue),v._currentValue=D):(xn(Ih,v._currentValue2),v._currentValue2=D)}function Og(v){var D=Ih.current;Rt(Ih),v=v.type._context,y?v._currentValue=D:v._currentValue2=D}function Ey(v,D){for(;v!==null;){var Q=v.alternate;if((v.childLanes&D)===D){if(Q===null||(Q.childLanes&D)===D)break;Q.childLanes|=D}else v.childLanes|=D,Q!==null&&(Q.childLanes|=D);v=v.return}}function df(v,D){Ch=v,wh=hu=null,v=v.dependencies,v!==null&&v.firstContext!==null&&(v.lanes&D&&(Je=!0),v.firstContext=null)}function Do(v,D){if(wh!==v&&D!==!1&&D!==0)if((typeof D!=\"number\"||D===1073741823)&&(wh=v,D=1073741823),D={context:v,observedBits:D,next:null},hu===null){if(Ch===null)throw Error(c(308));hu=D,Ch.dependencies={lanes:0,firstContext:D,responders:null}}else hu=hu.next=D;return y?v._currentValue:v._currentValue2}var Sl=!1;function Bh(v){v.updateQueue={baseState:v.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function Lg(v,D){v=v.updateQueue,D.updateQueue===v&&(D.updateQueue={baseState:v.baseState,firstBaseUpdate:v.firstBaseUpdate,lastBaseUpdate:v.lastBaseUpdate,shared:v.shared,effects:v.effects})}function Dl(v,D){return{eventTime:v,lane:D,tag:0,payload:null,callback:null,next:null}}function bl(v,D){if(v=v.updateQueue,v!==null){v=v.shared;var Q=v.pending;Q===null?D.next=D:(D.next=Q.next,Q.next=D),v.pending=D}}function Iy(v,D){var Q=v.updateQueue,H=v.alternate;if(H!==null&&(H=H.updateQueue,Q===H)){var V=null,ne=null;if(Q=Q.firstBaseUpdate,Q!==null){do{var Se={eventTime:Q.eventTime,lane:Q.lane,tag:Q.tag,payload:Q.payload,callback:Q.callback,next:null};ne===null?V=ne=Se:ne=ne.next=Se,Q=Q.next}while(Q!==null);ne===null?V=ne=D:ne=ne.next=D}else V=ne=D;Q={baseState:H.baseState,firstBaseUpdate:V,lastBaseUpdate:ne,shared:H.shared,effects:H.effects},v.updateQueue=Q;return}v=Q.lastBaseUpdate,v===null?Q.firstBaseUpdate=D:v.next=D,Q.lastBaseUpdate=D}function UA(v,D,Q,H){var V=v.updateQueue;Sl=!1;var ne=V.firstBaseUpdate,Se=V.lastBaseUpdate,_e=V.shared.pending;if(_e!==null){V.shared.pending=null;var pt=_e,Wt=pt.next;pt.next=null,Se===null?ne=Wt:Se.next=Wt,Se=pt;var Sr=v.alternate;if(Sr!==null){Sr=Sr.updateQueue;var Lr=Sr.lastBaseUpdate;Lr!==Se&&(Lr===null?Sr.firstBaseUpdate=Wt:Lr.next=Wt,Sr.lastBaseUpdate=pt)}}if(ne!==null){Lr=V.baseState,Se=0,Sr=Wt=pt=null;do{_e=ne.lane;var Zt=ne.eventTime;if((H&_e)===_e){Sr!==null&&(Sr=Sr.next={eventTime:Zt,lane:0,tag:ne.tag,payload:ne.payload,callback:ne.callback,next:null});e:{var zn=v,yi=ne;switch(_e=D,Zt=Q,yi.tag){case 1:if(zn=yi.payload,typeof zn==\"function\"){Lr=zn.call(Zt,Lr,_e);break e}Lr=zn;break e;case 3:zn.flags=zn.flags&-4097|64;case 0:if(zn=yi.payload,_e=typeof zn==\"function\"?zn.call(Zt,Lr,_e):zn,_e==null)break e;Lr=s({},Lr,_e);break e;case 2:Sl=!0}}ne.callback!==null&&(v.flags|=32,_e=V.effects,_e===null?V.effects=[ne]:_e.push(ne))}else Zt={eventTime:Zt,lane:_e,tag:ne.tag,payload:ne.payload,callback:ne.callback,next:null},Sr===null?(Wt=Sr=Zt,pt=Lr):Sr=Sr.next=Zt,Se|=_e;if(ne=ne.next,ne===null){if(_e=V.shared.pending,_e===null)break;ne=_e.next,_e.next=null,V.lastBaseUpdate=_e,V.shared.pending=null}}while(!0);Sr===null&&(pt=Lr),V.baseState=pt,V.firstBaseUpdate=Wt,V.lastBaseUpdate=Sr,Zg|=Se,v.lanes=Se,v.memoizedState=Lr}}function Cy(v,D,Q){if(v=D.effects,D.effects=null,v!==null)for(D=0;D<v.length;D++){var H=v[D],V=H.callback;if(V!==null){if(H.callback=null,H=Q,typeof V!=\"function\")throw Error(c(191,V));V.call(H)}}}var wy=new a.Component().refs;function _A(v,D,Q,H){D=v.memoizedState,Q=Q(H,D),Q=Q==null?D:s({},D,Q),v.memoizedState=Q,v.lanes===0&&(v.updateQueue.baseState=Q)}var HA={isMounted:function(v){return(v=v._reactInternals)?we(v)===v:!1},enqueueSetState:function(v,D,Q){v=v._reactInternals;var H=ko(),V=Bs(v),ne=Dl(H,V);ne.payload=D,Q!=null&&(ne.callback=Q),bl(v,ne),Tl(v,V,H)},enqueueReplaceState:function(v,D,Q){v=v._reactInternals;var H=ko(),V=Bs(v),ne=Dl(H,V);ne.tag=1,ne.payload=D,Q!=null&&(ne.callback=Q),bl(v,ne),Tl(v,V,H)},enqueueForceUpdate:function(v,D){v=v._reactInternals;var Q=ko(),H=Bs(v),V=Dl(Q,H);V.tag=2,D!=null&&(V.callback=D),bl(v,V),Tl(v,H,Q)}};function Y(v,D,Q,H,V,ne,Se){return v=v.stateNode,typeof v.shouldComponentUpdate==\"function\"?v.shouldComponentUpdate(H,ne,Se):D.prototype&&D.prototype.isPureReactComponent?!Eh(Q,H)||!Eh(V,ne):!0}function xt(v,D,Q){var H=!1,V=la,ne=D.contextType;return typeof ne==\"object\"&&ne!==null?ne=Do(ne):(V=Kn(D)?Na:Gi.current,H=D.contextTypes,ne=(H=H!=null)?dn(v,V):la),D=new D(Q,ne),v.memoizedState=D.state!==null&&D.state!==void 0?D.state:null,D.updater=HA,v.stateNode=D,D._reactInternals=v,H&&(v=v.stateNode,v.__reactInternalMemoizedUnmaskedChildContext=V,v.__reactInternalMemoizedMaskedChildContext=ne),D}function jA(v,D,Q,H){v=D.state,typeof D.componentWillReceiveProps==\"function\"&&D.componentWillReceiveProps(Q,H),typeof D.UNSAFE_componentWillReceiveProps==\"function\"&&D.UNSAFE_componentWillReceiveProps(Q,H),D.state!==v&&HA.enqueueReplaceState(D,D.state,null)}function bo(v,D,Q,H){var V=v.stateNode;V.props=Q,V.state=v.memoizedState,V.refs=wy,Bh(v);var ne=D.contextType;typeof ne==\"object\"&&ne!==null?V.context=Do(ne):(ne=Kn(D)?Na:Gi.current,V.context=dn(v,ne)),UA(v,Q,V,H),V.state=v.memoizedState,ne=D.getDerivedStateFromProps,typeof ne==\"function\"&&(_A(v,D,ne,Q),V.state=v.memoizedState),typeof D.getDerivedStateFromProps==\"function\"||typeof V.getSnapshotBeforeUpdate==\"function\"||typeof V.UNSAFE_componentWillMount!=\"function\"&&typeof V.componentWillMount!=\"function\"||(D=V.state,typeof V.componentWillMount==\"function\"&&V.componentWillMount(),typeof V.UNSAFE_componentWillMount==\"function\"&&V.UNSAFE_componentWillMount(),D!==V.state&&HA.enqueueReplaceState(V,V.state,null),UA(v,Q,V,H),V.state=v.memoizedState),typeof V.componentDidMount==\"function\"&&(v.flags|=4)}var mf=Array.isArray;function yt(v,D,Q){if(v=Q.ref,v!==null&&typeof v!=\"function\"&&typeof v!=\"object\"){if(Q._owner){if(Q=Q._owner,Q){if(Q.tag!==1)throw Error(c(309));var H=Q.stateNode}if(!H)throw Error(c(147,v));var V=\"\"+v;return D!==null&&D.ref!==null&&typeof D.ref==\"function\"&&D.ref._stringRef===V?D.ref:(D=function(ne){var Se=H.refs;Se===wy&&(Se=H.refs={}),ne===null?delete Se[V]:Se[V]=ne},D._stringRef=V,D)}if(typeof v!=\"string\")throw Error(c(284));if(!Q._owner)throw Error(c(290,v))}return v}function gu(v,D){if(v.type!==\"textarea\")throw Error(c(31,Object.prototype.toString.call(D)===\"[object Object]\"?\"object with keys {\"+Object.keys(D).join(\", \")+\"}\":D))}function By(v){function D(et,qe){if(v){var gt=et.lastEffect;gt!==null?(gt.nextEffect=qe,et.lastEffect=qe):et.firstEffect=et.lastEffect=qe,qe.nextEffect=null,qe.flags=8}}function Q(et,qe){if(!v)return null;for(;qe!==null;)D(et,qe),qe=qe.sibling;return null}function H(et,qe){for(et=new Map;qe!==null;)qe.key!==null?et.set(qe.key,qe):et.set(qe.index,qe),qe=qe.sibling;return et}function V(et,qe){return et=Su(et,qe),et.index=0,et.sibling=null,et}function ne(et,qe,gt){return et.index=gt,v?(gt=et.alternate,gt!==null?(gt=gt.index,gt<qe?(et.flags=2,qe):gt):(et.flags=2,qe)):qe}function Se(et){return v&&et.alternate===null&&(et.flags=2),et}function _e(et,qe,gt,Xt){return qe===null||qe.tag!==6?(qe=b2(gt,et.mode,Xt),qe.return=et,qe):(qe=V(qe,gt),qe.return=et,qe)}function pt(et,qe,gt,Xt){return qe!==null&&qe.elementType===gt.type?(Xt=V(qe,gt.props),Xt.ref=yt(et,qe,gt),Xt.return=et,Xt):(Xt=sd(gt.type,gt.key,gt.props,null,et.mode,Xt),Xt.ref=yt(et,qe,gt),Xt.return=et,Xt)}function Wt(et,qe,gt,Xt){return qe===null||qe.tag!==4||qe.stateNode.containerInfo!==gt.containerInfo||qe.stateNode.implementation!==gt.implementation?(qe=Qo(gt,et.mode,Xt),qe.return=et,qe):(qe=V(qe,gt.children||[]),qe.return=et,qe)}function Sr(et,qe,gt,Xt,Dr){return qe===null||qe.tag!==7?(qe=kf(gt,et.mode,Xt,Dr),qe.return=et,qe):(qe=V(qe,gt),qe.return=et,qe)}function Lr(et,qe,gt){if(typeof qe==\"string\"||typeof qe==\"number\")return qe=b2(\"\"+qe,et.mode,gt),qe.return=et,qe;if(typeof qe==\"object\"&&qe!==null){switch(qe.$$typeof){case p:return gt=sd(qe.type,qe.key,qe.props,null,et.mode,gt),gt.ref=yt(et,null,qe),gt.return=et,gt;case h:return qe=Qo(qe,et.mode,gt),qe.return=et,qe}if(mf(qe)||Ce(qe))return qe=kf(qe,et.mode,gt,null),qe.return=et,qe;gu(et,qe)}return null}function Zt(et,qe,gt,Xt){var Dr=qe!==null?qe.key:null;if(typeof gt==\"string\"||typeof gt==\"number\")return Dr!==null?null:_e(et,qe,\"\"+gt,Xt);if(typeof gt==\"object\"&&gt!==null){switch(gt.$$typeof){case p:return gt.key===Dr?gt.type===E?Sr(et,qe,gt.props.children,Xt,Dr):pt(et,qe,gt,Xt):null;case h:return gt.key===Dr?Wt(et,qe,gt,Xt):null}if(mf(gt)||Ce(gt))return Dr!==null?null:Sr(et,qe,gt,Xt,null);gu(et,gt)}return null}function zn(et,qe,gt,Xt,Dr){if(typeof Xt==\"string\"||typeof Xt==\"number\")return et=et.get(gt)||null,_e(qe,et,\"\"+Xt,Dr);if(typeof Xt==\"object\"&&Xt!==null){switch(Xt.$$typeof){case p:return et=et.get(Xt.key===null?gt:Xt.key)||null,Xt.type===E?Sr(qe,et,Xt.props.children,Dr,Xt.key):pt(qe,et,Xt,Dr);case h:return et=et.get(Xt.key===null?gt:Xt.key)||null,Wt(qe,et,Xt,Dr)}if(mf(Xt)||Ce(Xt))return et=et.get(gt)||null,Sr(qe,et,Xt,Dr,null);gu(qe,Xt)}return null}function yi(et,qe,gt,Xt){for(var Dr=null,Zn=null,kr=qe,Rn=qe=0,_n=null;kr!==null&&Rn<gt.length;Rn++){kr.index>Rn?(_n=kr,kr=null):_n=kr.sibling;var zr=Zt(et,kr,gt[Rn],Xt);if(zr===null){kr===null&&(kr=_n);break}v&&kr&&zr.alternate===null&&D(et,kr),qe=ne(zr,qe,Rn),Zn===null?Dr=zr:Zn.sibling=zr,Zn=zr,kr=_n}if(Rn===gt.length)return Q(et,kr),Dr;if(kr===null){for(;Rn<gt.length;Rn++)kr=Lr(et,gt[Rn],Xt),kr!==null&&(qe=ne(kr,qe,Rn),Zn===null?Dr=kr:Zn.sibling=kr,Zn=kr);return Dr}for(kr=H(et,kr);Rn<gt.length;Rn++)_n=zn(kr,et,Rn,gt[Rn],Xt),_n!==null&&(v&&_n.alternate!==null&&kr.delete(_n.key===null?Rn:_n.key),qe=ne(_n,qe,Rn),Zn===null?Dr=_n:Zn.sibling=_n,Zn=_n);return v&&kr.forEach(function(ci){return D(et,ci)}),Dr}function za(et,qe,gt,Xt){var Dr=Ce(gt);if(typeof Dr!=\"function\")throw Error(c(150));if(gt=Dr.call(gt),gt==null)throw Error(c(151));for(var Zn=Dr=null,kr=qe,Rn=qe=0,_n=null,zr=gt.next();kr!==null&&!zr.done;Rn++,zr=gt.next()){kr.index>Rn?(_n=kr,kr=null):_n=kr.sibling;var ci=Zt(et,kr,zr.value,Xt);if(ci===null){kr===null&&(kr=_n);break}v&&kr&&ci.alternate===null&&D(et,kr),qe=ne(ci,qe,Rn),Zn===null?Dr=ci:Zn.sibling=ci,Zn=ci,kr=_n}if(zr.done)return Q(et,kr),Dr;if(kr===null){for(;!zr.done;Rn++,zr=gt.next())zr=Lr(et,zr.value,Xt),zr!==null&&(qe=ne(zr,qe,Rn),Zn===null?Dr=zr:Zn.sibling=zr,Zn=zr);return Dr}for(kr=H(et,kr);!zr.done;Rn++,zr=gt.next())zr=zn(kr,et,Rn,zr.value,Xt),zr!==null&&(v&&zr.alternate!==null&&kr.delete(zr.key===null?Rn:zr.key),qe=ne(zr,qe,Rn),Zn===null?Dr=zr:Zn.sibling=zr,Zn=zr);return v&&kr.forEach(function(Du){return D(et,Du)}),Dr}return function(et,qe,gt,Xt){var Dr=typeof gt==\"object\"&&gt!==null&&gt.type===E&&gt.key===null;Dr&&(gt=gt.props.children);var Zn=typeof gt==\"object\"&&gt!==null;if(Zn)switch(gt.$$typeof){case p:e:{for(Zn=gt.key,Dr=qe;Dr!==null;){if(Dr.key===Zn){switch(Dr.tag){case 7:if(gt.type===E){Q(et,Dr.sibling),qe=V(Dr,gt.props.children),qe.return=et,et=qe;break e}break;default:if(Dr.elementType===gt.type){Q(et,Dr.sibling),qe=V(Dr,gt.props),qe.ref=yt(et,Dr,gt),qe.return=et,et=qe;break e}}Q(et,Dr);break}else D(et,Dr);Dr=Dr.sibling}gt.type===E?(qe=kf(gt.props.children,et.mode,Xt,gt.key),qe.return=et,et=qe):(Xt=sd(gt.type,gt.key,gt.props,null,et.mode,Xt),Xt.ref=yt(et,qe,gt),Xt.return=et,et=Xt)}return Se(et);case h:e:{for(Dr=gt.key;qe!==null;){if(qe.key===Dr)if(qe.tag===4&&qe.stateNode.containerInfo===gt.containerInfo&&qe.stateNode.implementation===gt.implementation){Q(et,qe.sibling),qe=V(qe,gt.children||[]),qe.return=et,et=qe;break e}else{Q(et,qe);break}else D(et,qe);qe=qe.sibling}qe=Qo(gt,et.mode,Xt),qe.return=et,et=qe}return Se(et)}if(typeof gt==\"string\"||typeof gt==\"number\")return gt=\"\"+gt,qe!==null&&qe.tag===6?(Q(et,qe.sibling),qe=V(qe,gt),qe.return=et,et=qe):(Q(et,qe),qe=b2(gt,et.mode,Xt),qe.return=et,et=qe),Se(et);if(mf(gt))return yi(et,qe,gt,Xt);if(Ce(gt))return za(et,qe,gt,Xt);if(Zn&&gu(et,gt),typeof gt>\"u\"&&!Dr)switch(et.tag){case 1:case 22:case 0:case 11:case 15:throw Error(c(152,g(et.type)||\"Component\"))}return Q(et,qe)}}var Mg=By(!0),e2=By(!1),vh={},ur=no(vh),zi=no(vh),yf=no(vh);function qa(v){if(v===vh)throw Error(c(174));return v}function Ug(v,D){xn(yf,D),xn(zi,v),xn(ur,vh),v=mt(D),Rt(ur),xn(ur,v)}function du(){Rt(ur),Rt(zi),Rt(yf)}function Ef(v){var D=qa(yf.current),Q=qa(ur.current);D=j(Q,v.type,D),Q!==D&&(xn(zi,v),xn(ur,D))}function wt(v){zi.current===v&&(Rt(ur),Rt(zi))}var di=no(0);function GA(v){for(var D=v;D!==null;){if(D.tag===13){var Q=D.memoizedState;if(Q!==null&&(Q=Q.dehydrated,Q===null||gr(Q)||Bo(Q)))return D}else if(D.tag===19&&D.memoizedProps.revealOrder!==void 0){if(D.flags&64)return D}else if(D.child!==null){D.child.return=D,D=D.child;continue}if(D===v)break;for(;D.sibling===null;){if(D.return===null||D.return===v)return null;D=D.return}D.sibling.return=D.return,D=D.sibling}return null}var Wa=null,Aa=null,Ya=!1;function _g(v,D){var Q=Ka(5,null,null,0);Q.elementType=\"DELETED\",Q.type=\"DELETED\",Q.stateNode=D,Q.return=v,Q.flags=8,v.lastEffect!==null?(v.lastEffect.nextEffect=Q,v.lastEffect=Q):v.firstEffect=v.lastEffect=Q}function Sh(v,D){switch(v.tag){case 5:return D=aa(D,v.type,v.pendingProps),D!==null?(v.stateNode=D,!0):!1;case 6:return D=FA(D,v.pendingProps),D!==null?(v.stateNode=D,!0):!1;case 13:return!1;default:return!1}}function Hg(v){if(Ya){var D=Aa;if(D){var Q=D;if(!Sh(v,D)){if(D=Me(Q),!D||!Sh(v,D)){v.flags=v.flags&-1025|2,Ya=!1,Wa=v;return}_g(Wa,Q)}Wa=v,Aa=cu(D)}else v.flags=v.flags&-1025|2,Ya=!1,Wa=v}}function vy(v){for(v=v.return;v!==null&&v.tag!==5&&v.tag!==3&&v.tag!==13;)v=v.return;Wa=v}function qA(v){if(!X||v!==Wa)return!1;if(!Ya)return vy(v),Ya=!0,!1;var D=v.type;if(v.tag!==5||D!==\"head\"&&D!==\"body\"&&!it(D,v.memoizedProps))for(D=Aa;D;)_g(v,D),D=Me(D);if(vy(v),v.tag===13){if(!X)throw Error(c(316));if(v=v.memoizedState,v=v!==null?v.dehydrated:null,!v)throw Error(c(317));Aa=NA(v)}else Aa=Wa?Me(v.stateNode):null;return!0}function jg(){X&&(Aa=Wa=null,Ya=!1)}var mu=[];function yu(){for(var v=0;v<mu.length;v++){var D=mu[v];y?D._workInProgressVersionPrimary=null:D._workInProgressVersionSecondary=null}mu.length=0}var If=f.ReactCurrentDispatcher,Rs=f.ReactCurrentBatchConfig,Eu=0,Gn=null,is=null,Pi=null,WA=!1,Cf=!1;function mn(){throw Error(c(321))}function Gg(v,D){if(D===null)return!1;for(var Q=0;Q<D.length&&Q<v.length;Q++)if(!vo(v[Q],D[Q]))return!1;return!0}function qg(v,D,Q,H,V,ne){if(Eu=ne,Gn=D,D.memoizedState=null,D.updateQueue=null,D.lanes=0,If.current=v===null||v.memoizedState===null?O:K,v=Q(H,V),Cf){ne=0;do{if(Cf=!1,!(25>ne))throw Error(c(301));ne+=1,Pi=is=null,D.updateQueue=null,If.current=re,v=Q(H,V)}while(Cf)}if(If.current=kt,D=is!==null&&is.next!==null,Eu=0,Pi=is=Gn=null,WA=!1,D)throw Error(c(300));return v}function ss(){var v={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Pi===null?Gn.memoizedState=Pi=v:Pi=Pi.next=v,Pi}function Pl(){if(is===null){var v=Gn.alternate;v=v!==null?v.memoizedState:null}else v=is.next;var D=Pi===null?Gn.memoizedState:Pi.next;if(D!==null)Pi=D,is=v;else{if(v===null)throw Error(c(310));is=v,v={memoizedState:is.memoizedState,baseState:is.baseState,baseQueue:is.baseQueue,queue:is.queue,next:null},Pi===null?Gn.memoizedState=Pi=v:Pi=Pi.next=v}return Pi}function Po(v,D){return typeof D==\"function\"?D(v):D}function wf(v){var D=Pl(),Q=D.queue;if(Q===null)throw Error(c(311));Q.lastRenderedReducer=v;var H=is,V=H.baseQueue,ne=Q.pending;if(ne!==null){if(V!==null){var Se=V.next;V.next=ne.next,ne.next=Se}H.baseQueue=V=ne,Q.pending=null}if(V!==null){V=V.next,H=H.baseState;var _e=Se=ne=null,pt=V;do{var Wt=pt.lane;if((Eu&Wt)===Wt)_e!==null&&(_e=_e.next={lane:0,action:pt.action,eagerReducer:pt.eagerReducer,eagerState:pt.eagerState,next:null}),H=pt.eagerReducer===v?pt.eagerState:v(H,pt.action);else{var Sr={lane:Wt,action:pt.action,eagerReducer:pt.eagerReducer,eagerState:pt.eagerState,next:null};_e===null?(Se=_e=Sr,ne=H):_e=_e.next=Sr,Gn.lanes|=Wt,Zg|=Wt}pt=pt.next}while(pt!==null&&pt!==V);_e===null?ne=H:_e.next=Se,vo(H,D.memoizedState)||(Je=!0),D.memoizedState=H,D.baseState=ne,D.baseQueue=_e,Q.lastRenderedState=H}return[D.memoizedState,Q.dispatch]}function Bf(v){var D=Pl(),Q=D.queue;if(Q===null)throw Error(c(311));Q.lastRenderedReducer=v;var H=Q.dispatch,V=Q.pending,ne=D.memoizedState;if(V!==null){Q.pending=null;var Se=V=V.next;do ne=v(ne,Se.action),Se=Se.next;while(Se!==V);vo(ne,D.memoizedState)||(Je=!0),D.memoizedState=ne,D.baseQueue===null&&(D.baseState=ne),Q.lastRenderedState=ne}return[ne,H]}function xl(v,D,Q){var H=D._getVersion;H=H(D._source);var V=y?D._workInProgressVersionPrimary:D._workInProgressVersionSecondary;if(V!==null?v=V===H:(v=v.mutableReadLanes,(v=(Eu&v)===v)&&(y?D._workInProgressVersionPrimary=H:D._workInProgressVersionSecondary=H,mu.push(D))),v)return Q(D._source);throw mu.push(D),Error(c(350))}function yn(v,D,Q,H){var V=so;if(V===null)throw Error(c(349));var ne=D._getVersion,Se=ne(D._source),_e=If.current,pt=_e.useState(function(){return xl(V,D,Q)}),Wt=pt[1],Sr=pt[0];pt=Pi;var Lr=v.memoizedState,Zt=Lr.refs,zn=Zt.getSnapshot,yi=Lr.source;Lr=Lr.subscribe;var za=Gn;return v.memoizedState={refs:Zt,source:D,subscribe:H},_e.useEffect(function(){Zt.getSnapshot=Q,Zt.setSnapshot=Wt;var et=ne(D._source);if(!vo(Se,et)){et=Q(D._source),vo(Sr,et)||(Wt(et),et=Bs(za),V.mutableReadLanes|=et&V.pendingLanes),et=V.mutableReadLanes,V.entangledLanes|=et;for(var qe=V.entanglements,gt=et;0<gt;){var Xt=31-ns(gt),Dr=1<<Xt;qe[Xt]|=et,gt&=~Dr}}},[Q,D,H]),_e.useEffect(function(){return H(D._source,function(){var et=Zt.getSnapshot,qe=Zt.setSnapshot;try{qe(et(D._source));var gt=Bs(za);V.mutableReadLanes|=gt&V.pendingLanes}catch(Xt){qe(function(){throw Xt})}})},[D,H]),vo(zn,Q)&&vo(yi,D)&&vo(Lr,H)||(v={pending:null,dispatch:null,lastRenderedReducer:Po,lastRenderedState:Sr},v.dispatch=Wt=xh.bind(null,Gn,v),pt.queue=v,pt.baseQueue=null,Sr=xl(V,D,Q),pt.memoizedState=pt.baseState=Sr),Sr}function xo(v,D,Q){var H=Pl();return yn(H,v,D,Q)}function Iu(v){var D=ss();return typeof v==\"function\"&&(v=v()),D.memoizedState=D.baseState=v,v=D.queue={pending:null,dispatch:null,lastRenderedReducer:Po,lastRenderedState:v},v=v.dispatch=xh.bind(null,Gn,v),[D.memoizedState,v]}function pa(v,D,Q,H){return v={tag:v,create:D,destroy:Q,deps:H,next:null},D=Gn.updateQueue,D===null?(D={lastEffect:null},Gn.updateQueue=D,D.lastEffect=v.next=v):(Q=D.lastEffect,Q===null?D.lastEffect=v.next=v:(H=Q.next,Q.next=v,v.next=H,D.lastEffect=v)),v}function Fs(v){var D=ss();return v={current:v},D.memoizedState=v}function Dh(){return Pl().memoizedState}function YA(v,D,Q,H){var V=ss();Gn.flags|=v,V.memoizedState=pa(1|D,Q,void 0,H===void 0?null:H)}function vf(v,D,Q,H){var V=Pl();H=H===void 0?null:H;var ne=void 0;if(is!==null){var Se=is.memoizedState;if(ne=Se.destroy,H!==null&&Gg(H,Se.deps)){pa(D,Q,ne,H);return}}Gn.flags|=v,V.memoizedState=pa(1|D,Q,ne,H)}function io(v,D){return YA(516,4,v,D)}function Zr(v,D){return vf(516,4,v,D)}function bh(v,D){return vf(4,2,v,D)}function VA(v,D){if(typeof D==\"function\")return v=v(),D(v),function(){D(null)};if(D!=null)return v=v(),D.current=v,function(){D.current=null}}function Sy(v,D,Q){return Q=Q!=null?Q.concat([v]):null,vf(4,2,VA.bind(null,D,v),Q)}function Wg(){}function Ph(v,D){var Q=Pl();D=D===void 0?null:D;var H=Q.memoizedState;return H!==null&&D!==null&&Gg(D,H[1])?H[0]:(Q.memoizedState=[v,D],v)}function pc(v,D){var Q=Pl();D=D===void 0?null:D;var H=Q.memoizedState;return H!==null&&D!==null&&Gg(D,H[1])?H[0]:(v=v(),Q.memoizedState=[v,D],v)}function Dy(v,D){var Q=tr();li(98>Q?98:Q,function(){v(!0)}),li(97<Q?97:Q,function(){var H=Rs.transition;Rs.transition=1;try{v(!1),D()}finally{Rs.transition=H}})}function xh(v,D,Q){var H=ko(),V=Bs(v),ne={lane:V,action:Q,eagerReducer:null,eagerState:null,next:null},Se=D.pending;if(Se===null?ne.next=ne:(ne.next=Se.next,Se.next=ne),D.pending=ne,Se=v.alternate,v===Gn||Se!==null&&Se===Gn)Cf=WA=!0;else{if(v.lanes===0&&(Se===null||Se.lanes===0)&&(Se=D.lastRenderedReducer,Se!==null))try{var _e=D.lastRenderedState,pt=Se(_e,Q);if(ne.eagerReducer=Se,ne.eagerState=pt,vo(pt,_e))return}catch{}finally{}Tl(v,V,H)}}var kt={readContext:Do,useCallback:mn,useContext:mn,useEffect:mn,useImperativeHandle:mn,useLayoutEffect:mn,useMemo:mn,useReducer:mn,useRef:mn,useState:mn,useDebugValue:mn,useDeferredValue:mn,useTransition:mn,useMutableSource:mn,useOpaqueIdentifier:mn,unstable_isNewReconciler:!1},O={readContext:Do,useCallback:function(v,D){return ss().memoizedState=[v,D===void 0?null:D],v},useContext:Do,useEffect:io,useImperativeHandle:function(v,D,Q){return Q=Q!=null?Q.concat([v]):null,YA(4,2,VA.bind(null,D,v),Q)},useLayoutEffect:function(v,D){return YA(4,2,v,D)},useMemo:function(v,D){var Q=ss();return D=D===void 0?null:D,v=v(),Q.memoizedState=[v,D],v},useReducer:function(v,D,Q){var H=ss();return D=Q!==void 0?Q(D):D,H.memoizedState=H.baseState=D,v=H.queue={pending:null,dispatch:null,lastRenderedReducer:v,lastRenderedState:D},v=v.dispatch=xh.bind(null,Gn,v),[H.memoizedState,v]},useRef:Fs,useState:Iu,useDebugValue:Wg,useDeferredValue:function(v){var D=Iu(v),Q=D[0],H=D[1];return io(function(){var V=Rs.transition;Rs.transition=1;try{H(v)}finally{Rs.transition=V}},[v]),Q},useTransition:function(){var v=Iu(!1),D=v[0];return v=Dy.bind(null,v[1]),Fs(v),[v,D]},useMutableSource:function(v,D,Q){var H=ss();return H.memoizedState={refs:{getSnapshot:D,setSnapshot:null},source:v,subscribe:Q},yn(H,v,D,Q)},useOpaqueIdentifier:function(){if(Ya){var v=!1,D=oe(function(){throw v||(v=!0,Q(xe())),Error(c(355))}),Q=Iu(D)[1];return!(Gn.mode&2)&&(Gn.flags|=516,pa(5,function(){Q(xe())},void 0,null)),D}return D=xe(),Iu(D),D},unstable_isNewReconciler:!1},K={readContext:Do,useCallback:Ph,useContext:Do,useEffect:Zr,useImperativeHandle:Sy,useLayoutEffect:bh,useMemo:pc,useReducer:wf,useRef:Dh,useState:function(){return wf(Po)},useDebugValue:Wg,useDeferredValue:function(v){var D=wf(Po),Q=D[0],H=D[1];return Zr(function(){var V=Rs.transition;Rs.transition=1;try{H(v)}finally{Rs.transition=V}},[v]),Q},useTransition:function(){var v=wf(Po)[0];return[Dh().current,v]},useMutableSource:xo,useOpaqueIdentifier:function(){return wf(Po)[0]},unstable_isNewReconciler:!1},re={readContext:Do,useCallback:Ph,useContext:Do,useEffect:Zr,useImperativeHandle:Sy,useLayoutEffect:bh,useMemo:pc,useReducer:Bf,useRef:Dh,useState:function(){return Bf(Po)},useDebugValue:Wg,useDeferredValue:function(v){var D=Bf(Po),Q=D[0],H=D[1];return Zr(function(){var V=Rs.transition;Rs.transition=1;try{H(v)}finally{Rs.transition=V}},[v]),Q},useTransition:function(){var v=Bf(Po)[0];return[Dh().current,v]},useMutableSource:xo,useOpaqueIdentifier:function(){return Bf(Po)[0]},unstable_isNewReconciler:!1},de=f.ReactCurrentOwner,Je=!1;function At(v,D,Q,H){D.child=v===null?e2(D,null,Q,H):Mg(D,v.child,Q,H)}function dr(v,D,Q,H,V){Q=Q.render;var ne=D.ref;return df(D,V),H=qg(v,D,Q,H,ne,V),v!==null&&!Je?(D.updateQueue=v.updateQueue,D.flags&=-517,v.lanes&=~V,qn(v,D,V)):(D.flags|=1,At(v,D,H,V),D.child)}function vr(v,D,Q,H,V,ne){if(v===null){var Se=Q.type;return typeof Se==\"function\"&&!S2(Se)&&Se.defaultProps===void 0&&Q.compare===null&&Q.defaultProps===void 0?(D.tag=15,D.type=Se,Un(v,D,Se,H,V,ne)):(v=sd(Q.type,null,H,D,D.mode,ne),v.ref=D.ref,v.return=D,D.child=v)}return Se=v.child,!(V&ne)&&(V=Se.memoizedProps,Q=Q.compare,Q=Q!==null?Q:Eh,Q(V,H)&&v.ref===D.ref)?qn(v,D,ne):(D.flags|=1,v=Su(Se,H),v.ref=D.ref,v.return=D,D.child=v)}function Un(v,D,Q,H,V,ne){if(v!==null&&Eh(v.memoizedProps,H)&&v.ref===D.ref)if(Je=!1,(ne&V)!==0)v.flags&16384&&(Je=!0);else return D.lanes=v.lanes,qn(v,D,ne);return JA(v,D,Q,H,ne)}function mi(v,D,Q){var H=D.pendingProps,V=H.children,ne=v!==null?v.memoizedState:null;if(H.mode===\"hidden\"||H.mode===\"unstable-defer-without-hiding\")if(!(D.mode&4))D.memoizedState={baseLanes:0},qy(D,Q);else if(Q&1073741824)D.memoizedState={baseLanes:0},qy(D,ne!==null?ne.baseLanes:Q);else return v=ne!==null?ne.baseLanes|Q:Q,D.lanes=D.childLanes=1073741824,D.memoizedState={baseLanes:v},qy(D,v),null;else ne!==null?(H=ne.baseLanes|Q,D.memoizedState=null):H=Q,qy(D,H);return At(v,D,V,Q),D.child}function Cs(v,D){var Q=D.ref;(v===null&&Q!==null||v!==null&&v.ref!==Q)&&(D.flags|=128)}function JA(v,D,Q,H,V){var ne=Kn(Q)?Na:Gi.current;return ne=dn(D,ne),df(D,V),Q=qg(v,D,Q,H,ne,V),v!==null&&!Je?(D.updateQueue=v.updateQueue,D.flags&=-517,v.lanes&=~V,qn(v,D,V)):(D.flags|=1,At(v,D,Q,V),D.child)}function lP(v,D,Q,H,V){if(Kn(Q)){var ne=!0;La(D)}else ne=!1;if(df(D,V),D.stateNode===null)v!==null&&(v.alternate=null,D.alternate=null,D.flags|=2),xt(D,Q,H),bo(D,Q,H,V),H=!0;else if(v===null){var Se=D.stateNode,_e=D.memoizedProps;Se.props=_e;var pt=Se.context,Wt=Q.contextType;typeof Wt==\"object\"&&Wt!==null?Wt=Do(Wt):(Wt=Kn(Q)?Na:Gi.current,Wt=dn(D,Wt));var Sr=Q.getDerivedStateFromProps,Lr=typeof Sr==\"function\"||typeof Se.getSnapshotBeforeUpdate==\"function\";Lr||typeof Se.UNSAFE_componentWillReceiveProps!=\"function\"&&typeof Se.componentWillReceiveProps!=\"function\"||(_e!==H||pt!==Wt)&&jA(D,Se,H,Wt),Sl=!1;var Zt=D.memoizedState;Se.state=Zt,UA(D,H,Se,V),pt=D.memoizedState,_e!==H||Zt!==pt||Li.current||Sl?(typeof Sr==\"function\"&&(_A(D,Q,Sr,H),pt=D.memoizedState),(_e=Sl||Y(D,Q,_e,H,Zt,pt,Wt))?(Lr||typeof Se.UNSAFE_componentWillMount!=\"function\"&&typeof Se.componentWillMount!=\"function\"||(typeof Se.componentWillMount==\"function\"&&Se.componentWillMount(),typeof Se.UNSAFE_componentWillMount==\"function\"&&Se.UNSAFE_componentWillMount()),typeof Se.componentDidMount==\"function\"&&(D.flags|=4)):(typeof Se.componentDidMount==\"function\"&&(D.flags|=4),D.memoizedProps=H,D.memoizedState=pt),Se.props=H,Se.state=pt,Se.context=Wt,H=_e):(typeof Se.componentDidMount==\"function\"&&(D.flags|=4),H=!1)}else{Se=D.stateNode,Lg(v,D),_e=D.memoizedProps,Wt=D.type===D.elementType?_e:So(D.type,_e),Se.props=Wt,Lr=D.pendingProps,Zt=Se.context,pt=Q.contextType,typeof pt==\"object\"&&pt!==null?pt=Do(pt):(pt=Kn(Q)?Na:Gi.current,pt=dn(D,pt));var zn=Q.getDerivedStateFromProps;(Sr=typeof zn==\"function\"||typeof Se.getSnapshotBeforeUpdate==\"function\")||typeof Se.UNSAFE_componentWillReceiveProps!=\"function\"&&typeof Se.componentWillReceiveProps!=\"function\"||(_e!==Lr||Zt!==pt)&&jA(D,Se,H,pt),Sl=!1,Zt=D.memoizedState,Se.state=Zt,UA(D,H,Se,V);var yi=D.memoizedState;_e!==Lr||Zt!==yi||Li.current||Sl?(typeof zn==\"function\"&&(_A(D,Q,zn,H),yi=D.memoizedState),(Wt=Sl||Y(D,Q,Wt,H,Zt,yi,pt))?(Sr||typeof Se.UNSAFE_componentWillUpdate!=\"function\"&&typeof Se.componentWillUpdate!=\"function\"||(typeof Se.componentWillUpdate==\"function\"&&Se.componentWillUpdate(H,yi,pt),typeof Se.UNSAFE_componentWillUpdate==\"function\"&&Se.UNSAFE_componentWillUpdate(H,yi,pt)),typeof Se.componentDidUpdate==\"function\"&&(D.flags|=4),typeof Se.getSnapshotBeforeUpdate==\"function\"&&(D.flags|=256)):(typeof Se.componentDidUpdate!=\"function\"||_e===v.memoizedProps&&Zt===v.memoizedState||(D.flags|=4),typeof Se.getSnapshotBeforeUpdate!=\"function\"||_e===v.memoizedProps&&Zt===v.memoizedState||(D.flags|=256),D.memoizedProps=H,D.memoizedState=yi),Se.props=H,Se.state=yi,Se.context=pt,H=Wt):(typeof Se.componentDidUpdate!=\"function\"||_e===v.memoizedProps&&Zt===v.memoizedState||(D.flags|=4),typeof Se.getSnapshotBeforeUpdate!=\"function\"||_e===v.memoizedProps&&Zt===v.memoizedState||(D.flags|=256),H=!1)}return t2(v,D,Q,H,ne,V)}function t2(v,D,Q,H,V,ne){Cs(v,D);var Se=(D.flags&64)!==0;if(!H&&!Se)return V&&Ma(D,Q,!1),qn(v,D,ne);H=D.stateNode,de.current=D;var _e=Se&&typeof Q.getDerivedStateFromError!=\"function\"?null:H.render();return D.flags|=1,v!==null&&Se?(D.child=Mg(D,v.child,null,ne),D.child=Mg(D,null,_e,ne)):At(v,D,_e,ne),D.memoizedState=H.state,V&&Ma(D,Q,!0),D.child}function by(v){var D=v.stateNode;D.pendingContext?yh(v,D.pendingContext,D.pendingContext!==D.context):D.context&&yh(v,D.context,!1),Ug(v,D.containerInfo)}var kh={dehydrated:null,retryLane:0};function r2(v,D,Q){var H=D.pendingProps,V=di.current,ne=!1,Se;return(Se=(D.flags&64)!==0)||(Se=v!==null&&v.memoizedState===null?!1:(V&2)!==0),Se?(ne=!0,D.flags&=-65):v!==null&&v.memoizedState===null||H.fallback===void 0||H.unstable_avoidThisFallback===!0||(V|=1),xn(di,V&1),v===null?(H.fallback!==void 0&&Hg(D),v=H.children,V=H.fallback,ne?(v=Va(D,v,V,Q),D.child.memoizedState={baseLanes:Q},D.memoizedState=kh,v):typeof H.unstable_expectedLoadTime==\"number\"?(v=Va(D,v,V,Q),D.child.memoizedState={baseLanes:Q},D.memoizedState=kh,D.lanes=33554432,v):(Q=D2({mode:\"visible\",children:v},D.mode,Q,null),Q.return=D,D.child=Q)):v.memoizedState!==null?ne?(H=KA(v,D,H.children,H.fallback,Q),ne=D.child,V=v.child.memoizedState,ne.memoizedState=V===null?{baseLanes:Q}:{baseLanes:V.baseLanes|Q},ne.childLanes=v.childLanes&~Q,D.memoizedState=kh,H):(Q=n2(v,D,H.children,Q),D.memoizedState=null,Q):ne?(H=KA(v,D,H.children,H.fallback,Q),ne=D.child,V=v.child.memoizedState,ne.memoizedState=V===null?{baseLanes:Q}:{baseLanes:V.baseLanes|Q},ne.childLanes=v.childLanes&~Q,D.memoizedState=kh,H):(Q=n2(v,D,H.children,Q),D.memoizedState=null,Q)}function Va(v,D,Q,H){var V=v.mode,ne=v.child;return D={mode:\"hidden\",children:D},!(V&2)&&ne!==null?(ne.childLanes=0,ne.pendingProps=D):ne=D2(D,V,0,null),Q=kf(Q,V,H,null),ne.return=v,Q.return=v,ne.sibling=Q,v.child=ne,Q}function n2(v,D,Q,H){var V=v.child;return v=V.sibling,Q=Su(V,{mode:\"visible\",children:Q}),!(D.mode&2)&&(Q.lanes=H),Q.return=D,Q.sibling=null,v!==null&&(v.nextEffect=null,v.flags=8,D.firstEffect=D.lastEffect=v),D.child=Q}function KA(v,D,Q,H,V){var ne=D.mode,Se=v.child;v=Se.sibling;var _e={mode:\"hidden\",children:Q};return!(ne&2)&&D.child!==Se?(Q=D.child,Q.childLanes=0,Q.pendingProps=_e,Se=Q.lastEffect,Se!==null?(D.firstEffect=Q.firstEffect,D.lastEffect=Se,Se.nextEffect=null):D.firstEffect=D.lastEffect=null):Q=Su(Se,_e),v!==null?H=Su(v,H):(H=kf(H,ne,V,null),H.flags|=2),H.return=D,Q.return=D,Q.sibling=H,D.child=Q,H}function Qh(v,D){v.lanes|=D;var Q=v.alternate;Q!==null&&(Q.lanes|=D),Ey(v.return,D)}function Py(v,D,Q,H,V,ne){var Se=v.memoizedState;Se===null?v.memoizedState={isBackwards:D,rendering:null,renderingStartTime:0,last:H,tail:Q,tailMode:V,lastEffect:ne}:(Se.isBackwards=D,Se.rendering=null,Se.renderingStartTime=0,Se.last=H,Se.tail=Q,Se.tailMode=V,Se.lastEffect=ne)}function cP(v,D,Q){var H=D.pendingProps,V=H.revealOrder,ne=H.tail;if(At(v,D,H.children,Q),H=di.current,H&2)H=H&1|2,D.flags|=64;else{if(v!==null&&v.flags&64)e:for(v=D.child;v!==null;){if(v.tag===13)v.memoizedState!==null&&Qh(v,Q);else if(v.tag===19)Qh(v,Q);else if(v.child!==null){v.child.return=v,v=v.child;continue}if(v===D)break e;for(;v.sibling===null;){if(v.return===null||v.return===D)break e;v=v.return}v.sibling.return=v.return,v=v.sibling}H&=1}if(xn(di,H),!(D.mode&2))D.memoizedState=null;else switch(V){case\"forwards\":for(Q=D.child,V=null;Q!==null;)v=Q.alternate,v!==null&&GA(v)===null&&(V=Q),Q=Q.sibling;Q=V,Q===null?(V=D.child,D.child=null):(V=Q.sibling,Q.sibling=null),Py(D,!1,V,Q,ne,D.lastEffect);break;case\"backwards\":for(Q=null,V=D.child,D.child=null;V!==null;){if(v=V.alternate,v!==null&&GA(v)===null){D.child=V;break}v=V.sibling,V.sibling=Q,Q=V,V=v}Py(D,!0,Q,null,ne,D.lastEffect);break;case\"together\":Py(D,!1,null,null,void 0,D.lastEffect);break;default:D.memoizedState=null}return D.child}function qn(v,D,Q){if(v!==null&&(D.dependencies=v.dependencies),Zg|=D.lanes,Q&D.childLanes){if(v!==null&&D.child!==v.child)throw Error(c(153));if(D.child!==null){for(v=D.child,Q=Su(v,v.pendingProps),D.child=Q,Q.return=D;v.sibling!==null;)v=v.sibling,Q=Q.sibling=Su(v,v.pendingProps),Q.return=D;Q.sibling=null}return D.child}return null}function os(v){v.flags|=4}var kl,Ql,Cu,ha;if(F)kl=function(v,D){for(var Q=D.child;Q!==null;){if(Q.tag===5||Q.tag===6)Pe(v,Q.stateNode);else if(Q.tag!==4&&Q.child!==null){Q.child.return=Q,Q=Q.child;continue}if(Q===D)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===D)return;Q=Q.return}Q.sibling.return=Q.return,Q=Q.sibling}},Ql=function(){},Cu=function(v,D,Q,H,V){if(v=v.memoizedProps,v!==H){var ne=D.stateNode,Se=qa(ur.current);Q=ke(ne,Q,v,H,V,Se),(D.updateQueue=Q)&&os(D)}},ha=function(v,D,Q,H){Q!==H&&os(D)};else if(z){kl=function(v,D,Q,H){for(var V=D.child;V!==null;){if(V.tag===5){var ne=V.stateNode;Q&&H&&(ne=RA(ne,V.type,V.memoizedProps,V)),Pe(v,ne)}else if(V.tag===6)ne=V.stateNode,Q&&H&&(ne=oa(ne,V.memoizedProps,V)),Pe(v,ne);else if(V.tag!==4){if(V.tag===13&&V.flags&4&&(ne=V.memoizedState!==null)){var Se=V.child;if(Se!==null&&(Se.child!==null&&(Se.child.return=Se,kl(v,Se,!0,ne)),ne=Se.sibling,ne!==null)){ne.return=V,V=ne;continue}}if(V.child!==null){V.child.return=V,V=V.child;continue}}if(V===D)break;for(;V.sibling===null;){if(V.return===null||V.return===D)return;V=V.return}V.sibling.return=V.return,V=V.sibling}};var zA=function(v,D,Q,H){for(var V=D.child;V!==null;){if(V.tag===5){var ne=V.stateNode;Q&&H&&(ne=RA(ne,V.type,V.memoizedProps,V)),au(v,ne)}else if(V.tag===6)ne=V.stateNode,Q&&H&&(ne=oa(ne,V.memoizedProps,V)),au(v,ne);else if(V.tag!==4){if(V.tag===13&&V.flags&4&&(ne=V.memoizedState!==null)){var Se=V.child;if(Se!==null&&(Se.child!==null&&(Se.child.return=Se,zA(v,Se,!0,ne)),ne=Se.sibling,ne!==null)){ne.return=V,V=ne;continue}}if(V.child!==null){V.child.return=V,V=V.child;continue}}if(V===D)break;for(;V.sibling===null;){if(V.return===null||V.return===D)return;V=V.return}V.sibling.return=V.return,V=V.sibling}};Ql=function(v){var D=v.stateNode;if(v.firstEffect!==null){var Q=D.containerInfo,H=ou(Q);zA(H,v,!1,!1),D.pendingChildren=H,os(v),lu(Q,H)}},Cu=function(v,D,Q,H,V){var ne=v.stateNode,Se=v.memoizedProps;if((v=D.firstEffect===null)&&Se===H)D.stateNode=ne;else{var _e=D.stateNode,pt=qa(ur.current),Wt=null;Se!==H&&(Wt=ke(_e,Q,Se,H,V,pt)),v&&Wt===null?D.stateNode=ne:(ne=ro(ne,Wt,Q,Se,H,D,v,_e),Ve(ne,Q,H,V,pt)&&os(D),D.stateNode=ne,v?os(D):kl(ne,D,!1,!1))}},ha=function(v,D,Q,H){Q!==H?(v=qa(yf.current),Q=qa(ur.current),D.stateNode=Ue(H,v,Q,D),os(D)):D.stateNode=v.stateNode}}else Ql=function(){},Cu=function(){},ha=function(){};function XA(v,D){if(!Ya)switch(v.tailMode){case\"hidden\":D=v.tail;for(var Q=null;D!==null;)D.alternate!==null&&(Q=D),D=D.sibling;Q===null?v.tail=null:Q.sibling=null;break;case\"collapsed\":Q=v.tail;for(var H=null;Q!==null;)Q.alternate!==null&&(H=Q),Q=Q.sibling;H===null?D||v.tail===null?v.tail=null:v.tail.sibling=null:H.sibling=null}}function jL(v,D,Q){var H=D.pendingProps;switch(D.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return Kn(D.type)&&Au(),null;case 3:return du(),Rt(Li),Rt(Gi),yu(),H=D.stateNode,H.pendingContext&&(H.context=H.pendingContext,H.pendingContext=null),(v===null||v.child===null)&&(qA(D)?os(D):H.hydrate||(D.flags|=256)),Ql(D),null;case 5:wt(D);var V=qa(yf.current);if(Q=D.type,v!==null&&D.stateNode!=null)Cu(v,D,Q,H,V),v.ref!==D.ref&&(D.flags|=128);else{if(!H){if(D.stateNode===null)throw Error(c(166));return null}if(v=qa(ur.current),qA(D)){if(!X)throw Error(c(175));v=Cr(D.stateNode,D.type,D.memoizedProps,V,v,D),D.updateQueue=v,v!==null&&os(D)}else{var ne=Ne(Q,H,V,v,D);kl(ne,D,!1,!1),D.stateNode=ne,Ve(ne,Q,H,V,v)&&os(D)}D.ref!==null&&(D.flags|=128)}return null;case 6:if(v&&D.stateNode!=null)ha(v,D,v.memoizedProps,H);else{if(typeof H!=\"string\"&&D.stateNode===null)throw Error(c(166));if(v=qa(yf.current),V=qa(ur.current),qA(D)){if(!X)throw Error(c(176));pf(D.stateNode,D.memoizedProps,D)&&os(D)}else D.stateNode=Ue(H,v,V,D)}return null;case 13:return Rt(di),H=D.memoizedState,D.flags&64?(D.lanes=Q,D):(H=H!==null,V=!1,v===null?D.memoizedProps.fallback!==void 0&&qA(D):V=v.memoizedState!==null,H&&!V&&D.mode&2&&(v===null&&D.memoizedProps.unstable_avoidThisFallback!==!0||di.current&1?ws===0&&(ws=3):((ws===0||ws===3)&&(ws=4),so===null||!(Zg&134217727)&&!(Fh&134217727)||Nh(so,Ns))),z&&H&&(D.flags|=4),F&&(H||V)&&(D.flags|=4),null);case 4:return du(),Ql(D),v===null&&Ct(D.stateNode.containerInfo),null;case 10:return Og(D),null;case 17:return Kn(D.type)&&Au(),null;case 19:if(Rt(di),H=D.memoizedState,H===null)return null;if(V=(D.flags&64)!==0,ne=H.rendering,ne===null)if(V)XA(H,!1);else{if(ws!==0||v!==null&&v.flags&64)for(v=D.child;v!==null;){if(ne=GA(v),ne!==null){for(D.flags|=64,XA(H,!1),v=ne.updateQueue,v!==null&&(D.updateQueue=v,D.flags|=4),H.lastEffect===null&&(D.firstEffect=null),D.lastEffect=H.lastEffect,v=Q,H=D.child;H!==null;)V=H,Q=v,V.flags&=2,V.nextEffect=null,V.firstEffect=null,V.lastEffect=null,ne=V.alternate,ne===null?(V.childLanes=0,V.lanes=Q,V.child=null,V.memoizedProps=null,V.memoizedState=null,V.updateQueue=null,V.dependencies=null,V.stateNode=null):(V.childLanes=ne.childLanes,V.lanes=ne.lanes,V.child=ne.child,V.memoizedProps=ne.memoizedProps,V.memoizedState=ne.memoizedState,V.updateQueue=ne.updateQueue,V.type=ne.type,Q=ne.dependencies,V.dependencies=Q===null?null:{lanes:Q.lanes,firstContext:Q.firstContext}),H=H.sibling;return xn(di,di.current&1|2),D.child}v=v.sibling}H.tail!==null&&bt()>m2&&(D.flags|=64,V=!0,XA(H,!1),D.lanes=33554432)}else{if(!V)if(v=GA(ne),v!==null){if(D.flags|=64,V=!0,v=v.updateQueue,v!==null&&(D.updateQueue=v,D.flags|=4),XA(H,!0),H.tail===null&&H.tailMode===\"hidden\"&&!ne.alternate&&!Ya)return D=D.lastEffect=H.lastEffect,D!==null&&(D.nextEffect=null),null}else 2*bt()-H.renderingStartTime>m2&&Q!==1073741824&&(D.flags|=64,V=!0,XA(H,!1),D.lanes=33554432);H.isBackwards?(ne.sibling=D.child,D.child=ne):(v=H.last,v!==null?v.sibling=ne:D.child=ne,H.last=ne)}return H.tail!==null?(v=H.tail,H.rendering=v,H.tail=v.sibling,H.lastEffect=D.lastEffect,H.renderingStartTime=bt(),v.sibling=null,D=di.current,xn(di,V?D&1|2:D&1),v):null;case 23:case 24:return B2(),v!==null&&v.memoizedState!==null!=(D.memoizedState!==null)&&H.mode!==\"unstable-defer-without-hiding\"&&(D.flags|=4),null}throw Error(c(156,D.tag))}function qL(v){switch(v.tag){case 1:Kn(v.type)&&Au();var D=v.flags;return D&4096?(v.flags=D&-4097|64,v):null;case 3:if(du(),Rt(Li),Rt(Gi),yu(),D=v.flags,D&64)throw Error(c(285));return v.flags=D&-4097|64,v;case 5:return wt(v),null;case 13:return Rt(di),D=v.flags,D&4096?(v.flags=D&-4097|64,v):null;case 19:return Rt(di),null;case 4:return du(),null;case 10:return Og(v),null;case 23:case 24:return B2(),null;default:return null}}function Yg(v,D){try{var Q=\"\",H=D;do Q+=$1(H),H=H.return;while(H);var V=Q}catch(ne){V=`\nError generating stack: `+ne.message+`\n`+ne.stack}return{value:v,source:D,stack:V}}function Vg(v,D){try{console.error(D.value)}catch(Q){setTimeout(function(){throw Q})}}var WL=typeof WeakMap==\"function\"?WeakMap:Map;function i2(v,D,Q){Q=Dl(-1,Q),Q.tag=3,Q.payload={element:null};var H=D.value;return Q.callback=function(){_y||(_y=!0,y2=H),Vg(v,D)},Q}function Jg(v,D,Q){Q=Dl(-1,Q),Q.tag=3;var H=v.type.getDerivedStateFromError;if(typeof H==\"function\"){var V=D.value;Q.payload=function(){return Vg(v,D),H(V)}}var ne=v.stateNode;return ne!==null&&typeof ne.componentDidCatch==\"function\"&&(Q.callback=function(){typeof H!=\"function\"&&(hc===null?hc=new Set([this]):hc.add(this),Vg(v,D));var Se=D.stack;this.componentDidCatch(D.value,{componentStack:Se!==null?Se:\"\"})}),Q}var YL=typeof WeakSet==\"function\"?WeakSet:Set;function s2(v){var D=v.ref;if(D!==null)if(typeof D==\"function\")try{D(null)}catch(Q){xf(v,Q)}else D.current=null}function xy(v,D){switch(D.tag){case 0:case 11:case 15:case 22:return;case 1:if(D.flags&256&&v!==null){var Q=v.memoizedProps,H=v.memoizedState;v=D.stateNode,D=v.getSnapshotBeforeUpdate(D.elementType===D.type?Q:So(D.type,Q),H),v.__reactInternalSnapshotBeforeUpdate=D}return;case 3:F&&D.flags&256&&Ts(D.stateNode.containerInfo);return;case 5:case 6:case 4:case 17:return}throw Error(c(163))}function Th(v,D){if(D=D.updateQueue,D=D!==null?D.lastEffect:null,D!==null){var Q=D=D.next;do{if((Q.tag&v)===v){var H=Q.destroy;Q.destroy=void 0,H!==void 0&&H()}Q=Q.next}while(Q!==D)}}function uP(v,D,Q){switch(Q.tag){case 0:case 11:case 15:case 22:if(D=Q.updateQueue,D=D!==null?D.lastEffect:null,D!==null){v=D=D.next;do{if((v.tag&3)===3){var H=v.create;v.destroy=H()}v=v.next}while(v!==D)}if(D=Q.updateQueue,D=D!==null?D.lastEffect:null,D!==null){v=D=D.next;do{var V=v;H=V.next,V=V.tag,V&4&&V&1&&(vP(Q,v),tM(Q,v)),v=H}while(v!==D)}return;case 1:v=Q.stateNode,Q.flags&4&&(D===null?v.componentDidMount():(H=Q.elementType===Q.type?D.memoizedProps:So(Q.type,D.memoizedProps),v.componentDidUpdate(H,D.memoizedState,v.__reactInternalSnapshotBeforeUpdate))),D=Q.updateQueue,D!==null&&Cy(Q,D,v);return;case 3:if(D=Q.updateQueue,D!==null){if(v=null,Q.child!==null)switch(Q.child.tag){case 5:v=Re(Q.child.stateNode);break;case 1:v=Q.child.stateNode}Cy(Q,D,v)}return;case 5:v=Q.stateNode,D===null&&Q.flags&4&&$s(v,Q.type,Q.memoizedProps,Q);return;case 6:return;case 4:return;case 12:return;case 13:X&&Q.memoizedState===null&&(Q=Q.alternate,Q!==null&&(Q=Q.memoizedState,Q!==null&&(Q=Q.dehydrated,Q!==null&&uu(Q))));return;case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(c(163))}function fP(v,D){if(F)for(var Q=v;;){if(Q.tag===5){var H=Q.stateNode;D?dh(H):to(Q.stateNode,Q.memoizedProps)}else if(Q.tag===6)H=Q.stateNode,D?mh(H):jn(H,Q.memoizedProps);else if((Q.tag!==23&&Q.tag!==24||Q.memoizedState===null||Q===v)&&Q.child!==null){Q.child.return=Q,Q=Q.child;continue}if(Q===v)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===v)return;Q=Q.return}Q.sibling.return=Q.return,Q=Q.sibling}}function ky(v,D){if(Ua&&typeof Ua.onCommitFiberUnmount==\"function\")try{Ua.onCommitFiberUnmount($e,D)}catch{}switch(D.tag){case 0:case 11:case 14:case 15:case 22:if(v=D.updateQueue,v!==null&&(v=v.lastEffect,v!==null)){var Q=v=v.next;do{var H=Q,V=H.destroy;if(H=H.tag,V!==void 0)if(H&4)vP(D,Q);else{H=D;try{V()}catch(ne){xf(H,ne)}}Q=Q.next}while(Q!==v)}break;case 1:if(s2(D),v=D.stateNode,typeof v.componentWillUnmount==\"function\")try{v.props=D.memoizedProps,v.state=D.memoizedState,v.componentWillUnmount()}catch(ne){xf(D,ne)}break;case 5:s2(D);break;case 4:F?gP(v,D):z&&z&&(D=D.stateNode.containerInfo,v=ou(D),TA(D,v))}}function AP(v,D){for(var Q=D;;)if(ky(v,Q),Q.child===null||F&&Q.tag===4){if(Q===D)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===D)return;Q=Q.return}Q.sibling.return=Q.return,Q=Q.sibling}else Q.child.return=Q,Q=Q.child}function Qy(v){v.alternate=null,v.child=null,v.dependencies=null,v.firstEffect=null,v.lastEffect=null,v.memoizedProps=null,v.memoizedState=null,v.pendingProps=null,v.return=null,v.updateQueue=null}function pP(v){return v.tag===5||v.tag===3||v.tag===4}function hP(v){if(F){e:{for(var D=v.return;D!==null;){if(pP(D))break e;D=D.return}throw Error(c(160))}var Q=D;switch(D=Q.stateNode,Q.tag){case 5:var H=!1;break;case 3:D=D.containerInfo,H=!0;break;case 4:D=D.containerInfo,H=!0;break;default:throw Error(c(161))}Q.flags&16&&(Af(D),Q.flags&=-17);e:t:for(Q=v;;){for(;Q.sibling===null;){if(Q.return===null||pP(Q.return)){Q=null;break e}Q=Q.return}for(Q.sibling.return=Q.return,Q=Q.sibling;Q.tag!==5&&Q.tag!==6&&Q.tag!==18;){if(Q.flags&2||Q.child===null||Q.tag===4)continue t;Q.child.return=Q,Q=Q.child}if(!(Q.flags&2)){Q=Q.stateNode;break e}}H?o2(v,Q,D):a2(v,Q,D)}}function o2(v,D,Q){var H=v.tag,V=H===5||H===6;if(V)v=V?v.stateNode:v.stateNode.instance,D?eo(Q,v,D):Io(Q,v);else if(H!==4&&(v=v.child,v!==null))for(o2(v,D,Q),v=v.sibling;v!==null;)o2(v,D,Q),v=v.sibling}function a2(v,D,Q){var H=v.tag,V=H===5||H===6;if(V)v=V?v.stateNode:v.stateNode.instance,D?ji(Q,v,D):ai(Q,v);else if(H!==4&&(v=v.child,v!==null))for(a2(v,D,Q),v=v.sibling;v!==null;)a2(v,D,Q),v=v.sibling}function gP(v,D){for(var Q=D,H=!1,V,ne;;){if(!H){H=Q.return;e:for(;;){if(H===null)throw Error(c(160));switch(V=H.stateNode,H.tag){case 5:ne=!1;break e;case 3:V=V.containerInfo,ne=!0;break e;case 4:V=V.containerInfo,ne=!0;break e}H=H.return}H=!0}if(Q.tag===5||Q.tag===6)AP(v,Q),ne?QA(V,Q.stateNode):wo(V,Q.stateNode);else if(Q.tag===4){if(Q.child!==null){V=Q.stateNode.containerInfo,ne=!0,Q.child.return=Q,Q=Q.child;continue}}else if(ky(v,Q),Q.child!==null){Q.child.return=Q,Q=Q.child;continue}if(Q===D)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===D)return;Q=Q.return,Q.tag===4&&(H=!1)}Q.sibling.return=Q.return,Q=Q.sibling}}function l2(v,D){if(F){switch(D.tag){case 0:case 11:case 14:case 15:case 22:Th(3,D);return;case 1:return;case 5:var Q=D.stateNode;if(Q!=null){var H=D.memoizedProps;v=v!==null?v.memoizedProps:H;var V=D.type,ne=D.updateQueue;D.updateQueue=null,ne!==null&&Co(Q,ne,V,v,H,D)}return;case 6:if(D.stateNode===null)throw Error(c(162));Q=D.memoizedProps,rs(D.stateNode,v!==null?v.memoizedProps:Q,Q);return;case 3:X&&(D=D.stateNode,D.hydrate&&(D.hydrate=!1,OA(D.containerInfo)));return;case 12:return;case 13:dP(D),Kg(D);return;case 19:Kg(D);return;case 17:return;case 23:case 24:fP(D,D.memoizedState!==null);return}throw Error(c(163))}switch(D.tag){case 0:case 11:case 14:case 15:case 22:Th(3,D);return;case 12:return;case 13:dP(D),Kg(D);return;case 19:Kg(D);return;case 3:X&&(Q=D.stateNode,Q.hydrate&&(Q.hydrate=!1,OA(Q.containerInfo)));break;case 23:case 24:return}e:if(z){switch(D.tag){case 1:case 5:case 6:case 20:break e;case 3:case 4:D=D.stateNode,TA(D.containerInfo,D.pendingChildren);break e}throw Error(c(163))}}function dP(v){v.memoizedState!==null&&(d2=bt(),F&&fP(v.child,!0))}function Kg(v){var D=v.updateQueue;if(D!==null){v.updateQueue=null;var Q=v.stateNode;Q===null&&(Q=v.stateNode=new YL),D.forEach(function(H){var V=nM.bind(null,v,H);Q.has(H)||(Q.add(H),H.then(V,V))})}}function VL(v,D){return v!==null&&(v=v.memoizedState,v===null||v.dehydrated!==null)?(D=D.memoizedState,D!==null&&D.dehydrated===null):!1}var Ty=0,Ry=1,Fy=2,zg=3,Ny=4;if(typeof Symbol==\"function\"&&Symbol.for){var Xg=Symbol.for;Ty=Xg(\"selector.component\"),Ry=Xg(\"selector.has_pseudo_class\"),Fy=Xg(\"selector.role\"),zg=Xg(\"selector.test_id\"),Ny=Xg(\"selector.text\")}function Oy(v){var D=$(v);if(D!=null){if(typeof D.memoizedProps[\"data-testname\"]!=\"string\")throw Error(c(364));return D}if(v=ir(v),v===null)throw Error(c(362));return v.stateNode.current}function Sf(v,D){switch(D.$$typeof){case Ty:if(v.type===D.value)return!0;break;case Ry:e:{D=D.value,v=[v,0];for(var Q=0;Q<v.length;){var H=v[Q++],V=v[Q++],ne=D[V];if(H.tag!==5||!Pr(H)){for(;ne!=null&&Sf(H,ne);)V++,ne=D[V];if(V===D.length){D=!0;break e}else for(H=H.child;H!==null;)v.push(H,V),H=H.sibling}}D=!1}return D;case Fy:if(v.tag===5&&Ir(v.stateNode,D.value))return!0;break;case Ny:if((v.tag===5||v.tag===6)&&(v=gn(v),v!==null&&0<=v.indexOf(D.value)))return!0;break;case zg:if(v.tag===5&&(v=v.memoizedProps[\"data-testname\"],typeof v==\"string\"&&v.toLowerCase()===D.value.toLowerCase()))return!0;break;default:throw Error(c(365,D))}return!1}function Df(v){switch(v.$$typeof){case Ty:return\"<\"+(g(v.value)||\"Unknown\")+\">\";case Ry:return\":has(\"+(Df(v)||\"\")+\")\";case Fy:return'[role=\"'+v.value+'\"]';case Ny:return'\"'+v.value+'\"';case zg:return'[data-testname=\"'+v.value+'\"]';default:throw Error(c(365,v))}}function c2(v,D){var Q=[];v=[v,0];for(var H=0;H<v.length;){var V=v[H++],ne=v[H++],Se=D[ne];if(V.tag!==5||!Pr(V)){for(;Se!=null&&Sf(V,Se);)ne++,Se=D[ne];if(ne===D.length)Q.push(V);else for(V=V.child;V!==null;)v.push(V,ne),V=V.sibling}}return Q}function u2(v,D){if(!qt)throw Error(c(363));v=Oy(v),v=c2(v,D),D=[],v=Array.from(v);for(var Q=0;Q<v.length;){var H=v[Q++];if(H.tag===5)Pr(H)||D.push(H.stateNode);else for(H=H.child;H!==null;)v.push(H),H=H.sibling}return D}var Ly=null;function JL(v){if(Ly===null)try{var D=(\"require\"+Math.random()).slice(0,7);Ly=(jS&&jS[D]).call(jS,\"timers\").setImmediate}catch{Ly=function(H){var V=new MessageChannel;V.port1.onmessage=H,V.port2.postMessage(void 0)}}return Ly(v)}var KL=Math.ceil,My=f.ReactCurrentDispatcher,f2=f.ReactCurrentOwner,A2=f.IsSomeRendererActing,xr=0,so=null,Xi=null,Ns=0,ZA=0,p2=no(0),ws=0,Uy=null,Rh=0,Zg=0,Fh=0,h2=0,g2=null,d2=0,m2=1/0;function bf(){m2=bt()+500}var sr=null,_y=!1,y2=null,hc=null,Pf=!1,$g=null,ed=90,E2=[],I2=[],wu=null,td=0,C2=null,Hy=-1,Bu=0,jy=0,rd=null,nd=!1;function ko(){return xr&48?bt():Hy!==-1?Hy:Hy=bt()}function Bs(v){if(v=v.mode,!(v&2))return 1;if(!(v&4))return tr()===99?1:2;if(Bu===0&&(Bu=Rh),my.transition!==0){jy!==0&&(jy=g2!==null?g2.pendingLanes:0),v=Bu;var D=4186112&~jy;return D&=-D,D===0&&(v=4186112&~v,D=v&-v,D===0&&(D=8192)),D}return v=tr(),xr&4&&v===98?v=Mt(12,Bu):(v=LA(v),v=Mt(v,Bu)),v}function Tl(v,D,Q){if(50<td)throw td=0,C2=null,Error(c(185));if(v=Gy(v,D),v===null)return null;Ha(v,D,Q),v===so&&(Fh|=D,ws===4&&Nh(v,Ns));var H=tr();D===1?xr&8&&!(xr&48)?w2(v):(ga(v,Q),xr===0&&(bf(),Tn())):(!(xr&4)||H!==98&&H!==99||(wu===null?wu=new Set([v]):wu.add(v)),ga(v,Q)),g2=v}function Gy(v,D){v.lanes|=D;var Q=v.alternate;for(Q!==null&&(Q.lanes|=D),Q=v,v=v.return;v!==null;)v.childLanes|=D,Q=v.alternate,Q!==null&&(Q.childLanes|=D),Q=v,v=v.return;return Q.tag===3?Q.stateNode:null}function ga(v,D){for(var Q=v.callbackNode,H=v.suspendedLanes,V=v.pingedLanes,ne=v.expirationTimes,Se=v.pendingLanes;0<Se;){var _e=31-ns(Se),pt=1<<_e,Wt=ne[_e];if(Wt===-1){if(!(pt&H)||pt&V){Wt=D,ca(pt);var Sr=wn;ne[_e]=10<=Sr?Wt+250:6<=Sr?Wt+5e3:-1}}else Wt<=D&&(v.expiredLanes|=pt);Se&=~pt}if(H=ua(v,v===so?Ns:0),D=wn,H===0)Q!==null&&(Q!==lr&&Is(Q),v.callbackNode=null,v.callbackPriority=0);else{if(Q!==null){if(v.callbackPriority===D)return;Q!==lr&&Is(Q)}D===15?(Q=w2.bind(null,v),Ee===null?(Ee=[Q],Oe=Mi(Qn,Ga)):Ee.push(Q),Q=lr):D===14?Q=qi(99,w2.bind(null,v)):(Q=MA(D),Q=qi(Q,mP.bind(null,v))),v.callbackPriority=D,v.callbackNode=Q}}function mP(v){if(Hy=-1,jy=Bu=0,xr&48)throw Error(c(327));var D=v.callbackNode;if(vu()&&v.callbackNode!==D)return null;var Q=ua(v,v===so?Ns:0);if(Q===0)return null;var H=Q,V=xr;xr|=16;var ne=CP();(so!==v||Ns!==H)&&(bf(),Oh(v,H));do try{ZL();break}catch(_e){IP(v,_e)}while(!0);if(Fg(),My.current=ne,xr=V,Xi!==null?H=0:(so=null,Ns=0,H=ws),Rh&Fh)Oh(v,0);else if(H!==0){if(H===2&&(xr|=64,v.hydrate&&(v.hydrate=!1,Ts(v.containerInfo)),Q=Bl(v),Q!==0&&(H=id(v,Q))),H===1)throw D=Uy,Oh(v,0),Nh(v,Q),ga(v,bt()),D;switch(v.finishedWork=v.current.alternate,v.finishedLanes=Q,H){case 0:case 1:throw Error(c(345));case 2:$A(v);break;case 3:if(Nh(v,Q),(Q&62914560)===Q&&(H=d2+500-bt(),10<H)){if(ua(v,0)!==0)break;if(V=v.suspendedLanes,(V&Q)!==Q){ko(),v.pingedLanes|=v.suspendedLanes&V;break}v.timeoutHandle=x($A.bind(null,v),H);break}$A(v);break;case 4:if(Nh(v,Q),(Q&4186112)===Q)break;for(H=v.eventTimes,V=-1;0<Q;){var Se=31-ns(Q);ne=1<<Se,Se=H[Se],Se>V&&(V=Se),Q&=~ne}if(Q=V,Q=bt()-Q,Q=(120>Q?120:480>Q?480:1080>Q?1080:1920>Q?1920:3e3>Q?3e3:4320>Q?4320:1960*KL(Q/1960))-Q,10<Q){v.timeoutHandle=x($A.bind(null,v),Q);break}$A(v);break;case 5:$A(v);break;default:throw Error(c(329))}}return ga(v,bt()),v.callbackNode===D?mP.bind(null,v):null}function Nh(v,D){for(D&=~h2,D&=~Fh,v.suspendedLanes|=D,v.pingedLanes&=~D,v=v.expirationTimes;0<D;){var Q=31-ns(D),H=1<<Q;v[Q]=-1,D&=~H}}function w2(v){if(xr&48)throw Error(c(327));if(vu(),v===so&&v.expiredLanes&Ns){var D=Ns,Q=id(v,D);Rh&Fh&&(D=ua(v,D),Q=id(v,D))}else D=ua(v,0),Q=id(v,D);if(v.tag!==0&&Q===2&&(xr|=64,v.hydrate&&(v.hydrate=!1,Ts(v.containerInfo)),D=Bl(v),D!==0&&(Q=id(v,D))),Q===1)throw Q=Uy,Oh(v,0),Nh(v,D),ga(v,bt()),Q;return v.finishedWork=v.current.alternate,v.finishedLanes=D,$A(v),ga(v,bt()),null}function zL(){if(wu!==null){var v=wu;wu=null,v.forEach(function(D){D.expiredLanes|=24&D.pendingLanes,ga(D,bt())})}Tn()}function yP(v,D){var Q=xr;xr|=1;try{return v(D)}finally{xr=Q,xr===0&&(bf(),Tn())}}function EP(v,D){var Q=xr;if(Q&48)return v(D);xr|=1;try{if(v)return li(99,v.bind(null,D))}finally{xr=Q,Tn()}}function qy(v,D){xn(p2,ZA),ZA|=D,Rh|=D}function B2(){ZA=p2.current,Rt(p2)}function Oh(v,D){v.finishedWork=null,v.finishedLanes=0;var Q=v.timeoutHandle;if(Q!==b&&(v.timeoutHandle=b,w(Q)),Xi!==null)for(Q=Xi.return;Q!==null;){var H=Q;switch(H.tag){case 1:H=H.type.childContextTypes,H!=null&&Au();break;case 3:du(),Rt(Li),Rt(Gi),yu();break;case 5:wt(H);break;case 4:du();break;case 13:Rt(di);break;case 19:Rt(di);break;case 10:Og(H);break;case 23:case 24:B2()}Q=Q.return}so=v,Xi=Su(v.current,null),Ns=ZA=Rh=D,ws=0,Uy=null,h2=Fh=Zg=0}function IP(v,D){do{var Q=Xi;try{if(Fg(),If.current=kt,WA){for(var H=Gn.memoizedState;H!==null;){var V=H.queue;V!==null&&(V.pending=null),H=H.next}WA=!1}if(Eu=0,Pi=is=Gn=null,Cf=!1,f2.current=null,Q===null||Q.return===null){ws=1,Uy=D,Xi=null;break}e:{var ne=v,Se=Q.return,_e=Q,pt=D;if(D=Ns,_e.flags|=2048,_e.firstEffect=_e.lastEffect=null,pt!==null&&typeof pt==\"object\"&&typeof pt.then==\"function\"){var Wt=pt;if(!(_e.mode&2)){var Sr=_e.alternate;Sr?(_e.updateQueue=Sr.updateQueue,_e.memoizedState=Sr.memoizedState,_e.lanes=Sr.lanes):(_e.updateQueue=null,_e.memoizedState=null)}var Lr=(di.current&1)!==0,Zt=Se;do{var zn;if(zn=Zt.tag===13){var yi=Zt.memoizedState;if(yi!==null)zn=yi.dehydrated!==null;else{var za=Zt.memoizedProps;zn=za.fallback===void 0?!1:za.unstable_avoidThisFallback!==!0?!0:!Lr}}if(zn){var et=Zt.updateQueue;if(et===null){var qe=new Set;qe.add(Wt),Zt.updateQueue=qe}else et.add(Wt);if(!(Zt.mode&2)){if(Zt.flags|=64,_e.flags|=16384,_e.flags&=-2981,_e.tag===1)if(_e.alternate===null)_e.tag=17;else{var gt=Dl(-1,1);gt.tag=2,bl(_e,gt)}_e.lanes|=1;break e}pt=void 0,_e=D;var Xt=ne.pingCache;if(Xt===null?(Xt=ne.pingCache=new WL,pt=new Set,Xt.set(Wt,pt)):(pt=Xt.get(Wt),pt===void 0&&(pt=new Set,Xt.set(Wt,pt))),!pt.has(_e)){pt.add(_e);var Dr=DP.bind(null,ne,Wt,_e);Wt.then(Dr,Dr)}Zt.flags|=4096,Zt.lanes=D;break e}Zt=Zt.return}while(Zt!==null);pt=Error((g(_e.type)||\"A React component\")+` suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.`)}ws!==5&&(ws=2),pt=Yg(pt,_e),Zt=Se;do{switch(Zt.tag){case 3:ne=pt,Zt.flags|=4096,D&=-D,Zt.lanes|=D;var Zn=i2(Zt,ne,D);Iy(Zt,Zn);break e;case 1:ne=pt;var kr=Zt.type,Rn=Zt.stateNode;if(!(Zt.flags&64)&&(typeof kr.getDerivedStateFromError==\"function\"||Rn!==null&&typeof Rn.componentDidCatch==\"function\"&&(hc===null||!hc.has(Rn)))){Zt.flags|=4096,D&=-D,Zt.lanes|=D;var _n=Jg(Zt,ne,D);Iy(Zt,_n);break e}}Zt=Zt.return}while(Zt!==null)}BP(Q)}catch(zr){D=zr,Xi===Q&&Q!==null&&(Xi=Q=Q.return);continue}break}while(!0)}function CP(){var v=My.current;return My.current=kt,v===null?kt:v}function id(v,D){var Q=xr;xr|=16;var H=CP();so===v&&Ns===D||Oh(v,D);do try{XL();break}catch(V){IP(v,V)}while(!0);if(Fg(),xr=Q,My.current=H,Xi!==null)throw Error(c(261));return so=null,Ns=0,ws}function XL(){for(;Xi!==null;)wP(Xi)}function ZL(){for(;Xi!==null&&!vl();)wP(Xi)}function wP(v){var D=bP(v.alternate,v,ZA);v.memoizedProps=v.pendingProps,D===null?BP(v):Xi=D,f2.current=null}function BP(v){var D=v;do{var Q=D.alternate;if(v=D.return,D.flags&2048){if(Q=qL(D),Q!==null){Q.flags&=2047,Xi=Q;return}v!==null&&(v.firstEffect=v.lastEffect=null,v.flags|=2048)}else{if(Q=jL(Q,D,ZA),Q!==null){Xi=Q;return}if(Q=D,Q.tag!==24&&Q.tag!==23||Q.memoizedState===null||ZA&1073741824||!(Q.mode&4)){for(var H=0,V=Q.child;V!==null;)H|=V.lanes|V.childLanes,V=V.sibling;Q.childLanes=H}v!==null&&!(v.flags&2048)&&(v.firstEffect===null&&(v.firstEffect=D.firstEffect),D.lastEffect!==null&&(v.lastEffect!==null&&(v.lastEffect.nextEffect=D.firstEffect),v.lastEffect=D.lastEffect),1<D.flags&&(v.lastEffect!==null?v.lastEffect.nextEffect=D:v.firstEffect=D,v.lastEffect=D))}if(D=D.sibling,D!==null){Xi=D;return}Xi=D=v}while(D!==null);ws===0&&(ws=5)}function $A(v){var D=tr();return li(99,$L.bind(null,v,D)),null}function $L(v,D){do vu();while($g!==null);if(xr&48)throw Error(c(327));var Q=v.finishedWork;if(Q===null)return null;if(v.finishedWork=null,v.finishedLanes=0,Q===v.current)throw Error(c(177));v.callbackNode=null;var H=Q.lanes|Q.childLanes,V=H,ne=v.pendingLanes&~V;v.pendingLanes=V,v.suspendedLanes=0,v.pingedLanes=0,v.expiredLanes&=V,v.mutableReadLanes&=V,v.entangledLanes&=V,V=v.entanglements;for(var Se=v.eventTimes,_e=v.expirationTimes;0<ne;){var pt=31-ns(ne),Wt=1<<pt;V[pt]=0,Se[pt]=-1,_e[pt]=-1,ne&=~Wt}if(wu!==null&&!(H&24)&&wu.has(v)&&wu.delete(v),v===so&&(Xi=so=null,Ns=0),1<Q.flags?Q.lastEffect!==null?(Q.lastEffect.nextEffect=Q,H=Q.firstEffect):H=Q:H=Q.firstEffect,H!==null){V=xr,xr|=32,f2.current=null,rd=rt(v.containerInfo),nd=!1,sr=H;do try{eM()}catch(qe){if(sr===null)throw Error(c(330));xf(sr,qe),sr=sr.nextEffect}while(sr!==null);rd=null,sr=H;do try{for(Se=v;sr!==null;){var Sr=sr.flags;if(Sr&16&&F&&Af(sr.stateNode),Sr&128){var Lr=sr.alternate;if(Lr!==null){var Zt=Lr.ref;Zt!==null&&(typeof Zt==\"function\"?Zt(null):Zt.current=null)}}switch(Sr&1038){case 2:hP(sr),sr.flags&=-3;break;case 6:hP(sr),sr.flags&=-3,l2(sr.alternate,sr);break;case 1024:sr.flags&=-1025;break;case 1028:sr.flags&=-1025,l2(sr.alternate,sr);break;case 4:l2(sr.alternate,sr);break;case 8:_e=Se,ne=sr,F?gP(_e,ne):AP(_e,ne);var zn=ne.alternate;Qy(ne),zn!==null&&Qy(zn)}sr=sr.nextEffect}}catch(qe){if(sr===null)throw Error(c(330));xf(sr,qe),sr=sr.nextEffect}while(sr!==null);nd&&lt(),Fe(v.containerInfo),v.current=Q,sr=H;do try{for(Sr=v;sr!==null;){var yi=sr.flags;if(yi&36&&uP(Sr,sr.alternate,sr),yi&128){Lr=void 0;var za=sr.ref;if(za!==null){var et=sr.stateNode;switch(sr.tag){case 5:Lr=Re(et);break;default:Lr=et}typeof za==\"function\"?za(Lr):za.current=Lr}}sr=sr.nextEffect}}catch(qe){if(sr===null)throw Error(c(330));xf(sr,qe),sr=sr.nextEffect}while(sr!==null);sr=null,te(),xr=V}else v.current=Q;if(Pf)Pf=!1,$g=v,ed=D;else for(sr=H;sr!==null;)D=sr.nextEffect,sr.nextEffect=null,sr.flags&8&&(yi=sr,yi.sibling=null,yi.stateNode=null),sr=D;if(H=v.pendingLanes,H===0&&(hc=null),H===1?v===C2?td++:(td=0,C2=v):td=0,Q=Q.stateNode,Ua&&typeof Ua.onCommitFiberRoot==\"function\")try{Ua.onCommitFiberRoot($e,Q,void 0,(Q.current.flags&64)===64)}catch{}if(ga(v,bt()),_y)throw _y=!1,v=y2,y2=null,v;return xr&8||Tn(),null}function eM(){for(;sr!==null;){var v=sr.alternate;nd||rd===null||(sr.flags&8?De(sr,rd)&&(nd=!0,Te()):sr.tag===13&&VL(v,sr)&&De(sr,rd)&&(nd=!0,Te()));var D=sr.flags;D&256&&xy(v,sr),!(D&512)||Pf||(Pf=!0,qi(97,function(){return vu(),null})),sr=sr.nextEffect}}function vu(){if(ed!==90){var v=97<ed?97:ed;return ed=90,li(v,rM)}return!1}function tM(v,D){E2.push(D,v),Pf||(Pf=!0,qi(97,function(){return vu(),null}))}function vP(v,D){I2.push(D,v),Pf||(Pf=!0,qi(97,function(){return vu(),null}))}function rM(){if($g===null)return!1;var v=$g;if($g=null,xr&48)throw Error(c(331));var D=xr;xr|=32;var Q=I2;I2=[];for(var H=0;H<Q.length;H+=2){var V=Q[H],ne=Q[H+1],Se=V.destroy;if(V.destroy=void 0,typeof Se==\"function\")try{Se()}catch(pt){if(ne===null)throw Error(c(330));xf(ne,pt)}}for(Q=E2,E2=[],H=0;H<Q.length;H+=2){V=Q[H],ne=Q[H+1];try{var _e=V.create;V.destroy=_e()}catch(pt){if(ne===null)throw Error(c(330));xf(ne,pt)}}for(_e=v.current.firstEffect;_e!==null;)v=_e.nextEffect,_e.nextEffect=null,_e.flags&8&&(_e.sibling=null,_e.stateNode=null),_e=v;return xr=D,Tn(),!0}function SP(v,D,Q){D=Yg(Q,D),D=i2(v,D,1),bl(v,D),D=ko(),v=Gy(v,1),v!==null&&(Ha(v,1,D),ga(v,D))}function xf(v,D){if(v.tag===3)SP(v,v,D);else for(var Q=v.return;Q!==null;){if(Q.tag===3){SP(Q,v,D);break}else if(Q.tag===1){var H=Q.stateNode;if(typeof Q.type.getDerivedStateFromError==\"function\"||typeof H.componentDidCatch==\"function\"&&(hc===null||!hc.has(H))){v=Yg(D,v);var V=Jg(Q,v,1);if(bl(Q,V),V=ko(),Q=Gy(Q,1),Q!==null)Ha(Q,1,V),ga(Q,V);else if(typeof H.componentDidCatch==\"function\"&&(hc===null||!hc.has(H)))try{H.componentDidCatch(D,v)}catch{}break}}Q=Q.return}}function DP(v,D,Q){var H=v.pingCache;H!==null&&H.delete(D),D=ko(),v.pingedLanes|=v.suspendedLanes&Q,so===v&&(Ns&Q)===Q&&(ws===4||ws===3&&(Ns&62914560)===Ns&&500>bt()-d2?Oh(v,0):h2|=Q),ga(v,D)}function nM(v,D){var Q=v.stateNode;Q!==null&&Q.delete(D),D=0,D===0&&(D=v.mode,D&2?D&4?(Bu===0&&(Bu=Rh),D=kn(62914560&~Bu),D===0&&(D=4194304)):D=tr()===99?1:2:D=1),Q=ko(),v=Gy(v,D),v!==null&&(Ha(v,D,Q),ga(v,Q))}var bP;bP=function(v,D,Q){var H=D.lanes;if(v!==null)if(v.memoizedProps!==D.pendingProps||Li.current)Je=!0;else if(Q&H)Je=!!(v.flags&16384);else{switch(Je=!1,D.tag){case 3:by(D),jg();break;case 5:Ef(D);break;case 1:Kn(D.type)&&La(D);break;case 4:Ug(D,D.stateNode.containerInfo);break;case 10:Ng(D,D.memoizedProps.value);break;case 13:if(D.memoizedState!==null)return Q&D.child.childLanes?r2(v,D,Q):(xn(di,di.current&1),D=qn(v,D,Q),D!==null?D.sibling:null);xn(di,di.current&1);break;case 19:if(H=(Q&D.childLanes)!==0,v.flags&64){if(H)return cP(v,D,Q);D.flags|=64}var V=D.memoizedState;if(V!==null&&(V.rendering=null,V.tail=null,V.lastEffect=null),xn(di,di.current),H)break;return null;case 23:case 24:return D.lanes=0,mi(v,D,Q)}return qn(v,D,Q)}else Je=!1;switch(D.lanes=0,D.tag){case 2:if(H=D.type,v!==null&&(v.alternate=null,D.alternate=null,D.flags|=2),v=D.pendingProps,V=dn(D,Gi.current),df(D,Q),V=qg(null,D,H,v,V,Q),D.flags|=1,typeof V==\"object\"&&V!==null&&typeof V.render==\"function\"&&V.$$typeof===void 0){if(D.tag=1,D.memoizedState=null,D.updateQueue=null,Kn(H)){var ne=!0;La(D)}else ne=!1;D.memoizedState=V.state!==null&&V.state!==void 0?V.state:null,Bh(D);var Se=H.getDerivedStateFromProps;typeof Se==\"function\"&&_A(D,H,Se,v),V.updater=HA,D.stateNode=V,V._reactInternals=D,bo(D,H,v,Q),D=t2(null,D,H,!0,ne,Q)}else D.tag=0,At(null,D,V,Q),D=D.child;return D;case 16:V=D.elementType;e:{switch(v!==null&&(v.alternate=null,D.alternate=null,D.flags|=2),v=D.pendingProps,ne=V._init,V=ne(V._payload),D.type=V,ne=D.tag=sM(V),v=So(V,v),ne){case 0:D=JA(null,D,V,v,Q);break e;case 1:D=lP(null,D,V,v,Q);break e;case 11:D=dr(null,D,V,v,Q);break e;case 14:D=vr(null,D,V,So(V.type,v),H,Q);break e}throw Error(c(306,V,\"\"))}return D;case 0:return H=D.type,V=D.pendingProps,V=D.elementType===H?V:So(H,V),JA(v,D,H,V,Q);case 1:return H=D.type,V=D.pendingProps,V=D.elementType===H?V:So(H,V),lP(v,D,H,V,Q);case 3:if(by(D),H=D.updateQueue,v===null||H===null)throw Error(c(282));if(H=D.pendingProps,V=D.memoizedState,V=V!==null?V.element:null,Lg(v,D),UA(D,H,null,Q),H=D.memoizedState.element,H===V)jg(),D=qn(v,D,Q);else{if(V=D.stateNode,(ne=V.hydrate)&&(X?(Aa=cu(D.stateNode.containerInfo),Wa=D,ne=Ya=!0):ne=!1),ne){if(X&&(v=V.mutableSourceEagerHydrationData,v!=null))for(V=0;V<v.length;V+=2)ne=v[V],Se=v[V+1],y?ne._workInProgressVersionPrimary=Se:ne._workInProgressVersionSecondary=Se,mu.push(ne);for(Q=e2(D,null,H,Q),D.child=Q;Q;)Q.flags=Q.flags&-3|1024,Q=Q.sibling}else At(v,D,H,Q),jg();D=D.child}return D;case 5:return Ef(D),v===null&&Hg(D),H=D.type,V=D.pendingProps,ne=v!==null?v.memoizedProps:null,Se=V.children,it(H,V)?Se=null:ne!==null&&it(H,ne)&&(D.flags|=16),Cs(v,D),At(v,D,Se,Q),D.child;case 6:return v===null&&Hg(D),null;case 13:return r2(v,D,Q);case 4:return Ug(D,D.stateNode.containerInfo),H=D.pendingProps,v===null?D.child=Mg(D,null,H,Q):At(v,D,H,Q),D.child;case 11:return H=D.type,V=D.pendingProps,V=D.elementType===H?V:So(H,V),dr(v,D,H,V,Q);case 7:return At(v,D,D.pendingProps,Q),D.child;case 8:return At(v,D,D.pendingProps.children,Q),D.child;case 12:return At(v,D,D.pendingProps.children,Q),D.child;case 10:e:{if(H=D.type._context,V=D.pendingProps,Se=D.memoizedProps,ne=V.value,Ng(D,ne),Se!==null){var _e=Se.value;if(ne=vo(_e,ne)?0:(typeof H._calculateChangedBits==\"function\"?H._calculateChangedBits(_e,ne):1073741823)|0,ne===0){if(Se.children===V.children&&!Li.current){D=qn(v,D,Q);break e}}else for(_e=D.child,_e!==null&&(_e.return=D);_e!==null;){var pt=_e.dependencies;if(pt!==null){Se=_e.child;for(var Wt=pt.firstContext;Wt!==null;){if(Wt.context===H&&Wt.observedBits&ne){_e.tag===1&&(Wt=Dl(-1,Q&-Q),Wt.tag=2,bl(_e,Wt)),_e.lanes|=Q,Wt=_e.alternate,Wt!==null&&(Wt.lanes|=Q),Ey(_e.return,Q),pt.lanes|=Q;break}Wt=Wt.next}}else Se=_e.tag===10&&_e.type===D.type?null:_e.child;if(Se!==null)Se.return=_e;else for(Se=_e;Se!==null;){if(Se===D){Se=null;break}if(_e=Se.sibling,_e!==null){_e.return=Se.return,Se=_e;break}Se=Se.return}_e=Se}}At(v,D,V.children,Q),D=D.child}return D;case 9:return V=D.type,ne=D.pendingProps,H=ne.children,df(D,Q),V=Do(V,ne.unstable_observedBits),H=H(V),D.flags|=1,At(v,D,H,Q),D.child;case 14:return V=D.type,ne=So(V,D.pendingProps),ne=So(V.type,ne),vr(v,D,V,ne,H,Q);case 15:return Un(v,D,D.type,D.pendingProps,H,Q);case 17:return H=D.type,V=D.pendingProps,V=D.elementType===H?V:So(H,V),v!==null&&(v.alternate=null,D.alternate=null,D.flags|=2),D.tag=1,Kn(H)?(v=!0,La(D)):v=!1,df(D,Q),xt(D,H,V),bo(D,H,V,Q),t2(null,D,H,!0,v,Q);case 19:return cP(v,D,Q);case 23:return mi(v,D,Q);case 24:return mi(v,D,Q)}throw Error(c(156,D.tag))};var Wy={current:!1},Os=n.unstable_flushAllWithoutAsserting,PP=typeof Os==\"function\";function v2(){if(Os!==void 0)return Os();for(var v=!1;vu();)v=!0;return v}function da(v){try{v2(),JL(function(){v2()?da(v):v()})}catch(D){v(D)}}var Ja=0,Yy=!1;function iM(v,D,Q,H){this.tag=v,this.key=Q,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=D,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=H,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Ka(v,D,Q,H){return new iM(v,D,Q,H)}function S2(v){return v=v.prototype,!(!v||!v.isReactComponent)}function sM(v){if(typeof v==\"function\")return S2(v)?1:0;if(v!=null){if(v=v.$$typeof,v===R)return 11;if(v===W)return 14}return 2}function Su(v,D){var Q=v.alternate;return Q===null?(Q=Ka(v.tag,D,v.key,v.mode),Q.elementType=v.elementType,Q.type=v.type,Q.stateNode=v.stateNode,Q.alternate=v,v.alternate=Q):(Q.pendingProps=D,Q.type=v.type,Q.flags=0,Q.nextEffect=null,Q.firstEffect=null,Q.lastEffect=null),Q.childLanes=v.childLanes,Q.lanes=v.lanes,Q.child=v.child,Q.memoizedProps=v.memoizedProps,Q.memoizedState=v.memoizedState,Q.updateQueue=v.updateQueue,D=v.dependencies,Q.dependencies=D===null?null:{lanes:D.lanes,firstContext:D.firstContext},Q.sibling=v.sibling,Q.index=v.index,Q.ref=v.ref,Q}function sd(v,D,Q,H,V,ne){var Se=2;if(H=v,typeof v==\"function\")S2(v)&&(Se=1);else if(typeof v==\"string\")Se=5;else e:switch(v){case E:return kf(Q.children,V,ne,D);case ue:Se=8,V|=16;break;case C:Se=8,V|=1;break;case S:return v=Ka(12,Q,D,V|8),v.elementType=S,v.type=S,v.lanes=ne,v;case N:return v=Ka(13,Q,D,V),v.type=N,v.elementType=N,v.lanes=ne,v;case U:return v=Ka(19,Q,D,V),v.elementType=U,v.lanes=ne,v;case le:return D2(Q,V,ne,D);case me:return v=Ka(24,Q,D,V),v.elementType=me,v.lanes=ne,v;default:if(typeof v==\"object\"&&v!==null)switch(v.$$typeof){case P:Se=10;break e;case I:Se=9;break e;case R:Se=11;break e;case W:Se=14;break e;case ee:Se=16,H=null;break e;case ie:Se=22;break e}throw Error(c(130,v==null?v:typeof v,\"\"))}return D=Ka(Se,Q,D,V),D.elementType=v,D.type=H,D.lanes=ne,D}function kf(v,D,Q,H){return v=Ka(7,v,H,D),v.lanes=Q,v}function D2(v,D,Q,H){return v=Ka(23,v,H,D),v.elementType=le,v.lanes=Q,v}function b2(v,D,Q){return v=Ka(6,v,null,D),v.lanes=Q,v}function Qo(v,D,Q){return D=Ka(4,v.children!==null?v.children:[],v.key,D),D.lanes=Q,D.stateNode={containerInfo:v.containerInfo,pendingChildren:null,implementation:v.implementation},D}function oM(v,D,Q){this.tag=D,this.containerInfo=v,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=b,this.pendingContext=this.context=null,this.hydrate=Q,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=fa(0),this.expirationTimes=fa(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=fa(0),X&&(this.mutableSourceEagerHydrationData=null)}function xP(v){var D=v._reactInternals;if(D===void 0)throw typeof v.render==\"function\"?Error(c(188)):Error(c(268,Object.keys(v)));return v=se(D),v===null?null:v.stateNode}function kP(v,D){if(v=v.memoizedState,v!==null&&v.dehydrated!==null){var Q=v.retryLane;v.retryLane=Q!==0&&Q<D?Q:D}}function Vy(v,D){kP(v,D),(v=v.alternate)&&kP(v,D)}function aM(v){return v=se(v),v===null?null:v.stateNode}function lM(){return null}return r.IsThisRendererActing=Wy,r.act=function(v){function D(){Ja--,A2.current=Q,Wy.current=H}Yy===!1&&(Yy=!0,console.error(\"act(...) is not supported in production builds of React, and might not behave as expected.\")),Ja++;var Q=A2.current,H=Wy.current;A2.current=!0,Wy.current=!0;try{var V=yP(v)}catch(ne){throw D(),ne}if(V!==null&&typeof V==\"object\"&&typeof V.then==\"function\")return{then:function(ne,Se){V.then(function(){1<Ja||PP===!0&&Q===!0?(D(),ne()):da(function(_e){D(),_e?Se(_e):ne()})},function(_e){D(),Se(_e)})}};try{Ja!==1||PP!==!1&&Q!==!1||v2(),D()}catch(ne){throw D(),ne}return{then:function(ne){ne()}}},r.attemptContinuousHydration=function(v){if(v.tag===13){var D=ko();Tl(v,67108864,D),Vy(v,67108864)}},r.attemptHydrationAtCurrentPriority=function(v){if(v.tag===13){var D=ko(),Q=Bs(v);Tl(v,Q,D),Vy(v,Q)}},r.attemptSynchronousHydration=function(v){switch(v.tag){case 3:var D=v.stateNode;if(D.hydrate){var Q=ca(D.pendingLanes);D.expiredLanes|=Q&D.pendingLanes,ga(D,bt()),!(xr&48)&&(bf(),Tn())}break;case 13:var H=ko();EP(function(){return Tl(v,1,H)}),Vy(v,4)}},r.attemptUserBlockingHydration=function(v){if(v.tag===13){var D=ko();Tl(v,4,D),Vy(v,4)}},r.batchedEventUpdates=function(v,D){var Q=xr;xr|=2;try{return v(D)}finally{xr=Q,xr===0&&(bf(),Tn())}},r.batchedUpdates=yP,r.createComponentSelector=function(v){return{$$typeof:Ty,value:v}},r.createContainer=function(v,D,Q){return v=new oM(v,D,Q),D=Ka(3,null,null,D===2?7:D===1?3:0),v.current=D,D.stateNode=v,Bh(D),v},r.createHasPsuedoClassSelector=function(v){return{$$typeof:Ry,value:v}},r.createPortal=function(v,D,Q){var H=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:h,key:H==null?null:\"\"+H,children:v,containerInfo:D,implementation:Q}},r.createRoleSelector=function(v){return{$$typeof:Fy,value:v}},r.createTestNameSelector=function(v){return{$$typeof:zg,value:v}},r.createTextSelector=function(v){return{$$typeof:Ny,value:v}},r.deferredUpdates=function(v){return li(97,v)},r.discreteUpdates=function(v,D,Q,H,V){var ne=xr;xr|=4;try{return li(98,v.bind(null,D,Q,H,V))}finally{xr=ne,xr===0&&(bf(),Tn())}},r.findAllNodes=u2,r.findBoundingRects=function(v,D){if(!qt)throw Error(c(363));D=u2(v,D),v=[];for(var Q=0;Q<D.length;Q++)v.push(Pt(D[Q]));for(D=v.length-1;0<D;D--){Q=v[D];for(var H=Q.x,V=H+Q.width,ne=Q.y,Se=ne+Q.height,_e=D-1;0<=_e;_e--)if(D!==_e){var pt=v[_e],Wt=pt.x,Sr=Wt+pt.width,Lr=pt.y,Zt=Lr+pt.height;if(H>=Wt&&ne>=Lr&&V<=Sr&&Se<=Zt){v.splice(D,1);break}else if(H!==Wt||Q.width!==pt.width||Zt<ne||Lr>Se){if(!(ne!==Lr||Q.height!==pt.height||Sr<H||Wt>V)){Wt>H&&(pt.width+=Wt-H,pt.x=H),Sr<V&&(pt.width=V-Wt),v.splice(D,1);break}}else{Lr>ne&&(pt.height+=Lr-ne,pt.y=ne),Zt<Se&&(pt.height=Se-Lr),v.splice(D,1);break}}}return v},r.findHostInstance=xP,r.findHostInstanceWithNoPortals=function(v){return v=Z(v),v===null?null:v.tag===20?v.stateNode.instance:v.stateNode},r.findHostInstanceWithWarning=function(v){return xP(v)},r.flushControlled=function(v){var D=xr;xr|=1;try{li(99,v)}finally{xr=D,xr===0&&(bf(),Tn())}},r.flushDiscreteUpdates=function(){!(xr&49)&&(zL(),vu())},r.flushPassiveEffects=vu,r.flushSync=EP,r.focusWithin=function(v,D){if(!qt)throw Error(c(363));for(v=Oy(v),D=c2(v,D),D=Array.from(D),v=0;v<D.length;){var Q=D[v++];if(!Pr(Q)){if(Q.tag===5&&Or(Q.stateNode))return!0;for(Q=Q.child;Q!==null;)D.push(Q),Q=Q.sibling}}return!1},r.getCurrentUpdateLanePriority=function(){return lc},r.getFindAllNodesFailureDescription=function(v,D){if(!qt)throw Error(c(363));var Q=0,H=[];v=[Oy(v),0];for(var V=0;V<v.length;){var ne=v[V++],Se=v[V++],_e=D[Se];if((ne.tag!==5||!Pr(ne))&&(Sf(ne,_e)&&(H.push(Df(_e)),Se++,Se>Q&&(Q=Se)),Se<D.length))for(ne=ne.child;ne!==null;)v.push(ne,Se),ne=ne.sibling}if(Q<D.length){for(v=[];Q<D.length;Q++)v.push(Df(D[Q]));return`findAllNodes was able to match part of the selector:\n  `+(H.join(\" > \")+`\n\nNo matching component was found for:\n  `)+v.join(\" > \")}return null},r.getPublicRootInstance=function(v){if(v=v.current,!v.child)return null;switch(v.child.tag){case 5:return Re(v.child.stateNode);default:return v.child.stateNode}},r.injectIntoDevTools=function(v){if(v={bundleType:v.bundleType,version:v.version,rendererPackageName:v.rendererPackageName,rendererConfig:v.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:f.ReactCurrentDispatcher,findHostInstanceByFiber:aM,findFiberByHostInstance:v.findFiberByHostInstance||lM,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>\"u\")v=!1;else{var D=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!D.isDisabled&&D.supportsFiber)try{$e=D.inject(v),Ua=D}catch{}v=!0}return v},r.observeVisibleRects=function(v,D,Q,H){if(!qt)throw Error(c(363));v=u2(v,D);var V=on(v,Q,H).disconnect;return{disconnect:function(){V()}}},r.registerMutableSourceForHydration=function(v,D){var Q=D._getVersion;Q=Q(D._source),v.mutableSourceEagerHydrationData==null?v.mutableSourceEagerHydrationData=[D,Q]:v.mutableSourceEagerHydrationData.push(D,Q)},r.runWithPriority=function(v,D){var Q=lc;try{return lc=v,D()}finally{lc=Q}},r.shouldSuspend=function(){return!1},r.unbatchedUpdates=function(v,D){var Q=xr;xr&=-2,xr|=8;try{return v(D)}finally{xr=Q,xr===0&&(bf(),Tn())}},r.updateContainer=function(v,D,Q,H){var V=D.current,ne=ko(),Se=Bs(V);e:if(Q){Q=Q._reactInternals;t:{if(we(Q)!==Q||Q.tag!==1)throw Error(c(170));var _e=Q;do{switch(_e.tag){case 3:_e=_e.stateNode.context;break t;case 1:if(Kn(_e.type)){_e=_e.stateNode.__reactInternalMemoizedMergedChildContext;break t}}_e=_e.return}while(_e!==null);throw Error(c(171))}if(Q.tag===1){var pt=Q.type;if(Kn(pt)){Q=Oa(Q,pt,_e);break e}}Q=_e}else Q=la;return D.context===null?D.context=Q:D.pendingContext=Q,D=Dl(ne,Se),D.payload={element:v},H=H===void 0?null:H,H!==null&&(D.callback=H),bl(V,D),Tl(V,Se,ne),Se},r}});var Swe=_((vKt,vwe)=>{\"use strict\";vwe.exports=Bwe()});var bwe=_((SKt,Dwe)=>{\"use strict\";var Spt={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2};Dwe.exports=Spt});var Qwe=_((DKt,kwe)=>{\"use strict\";var Dpt=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(t[s]=r[s])}return t},FF=function(){function t(e,r){for(var s=0;s<r.length;s++){var a=r[s];a.enumerable=a.enumerable||!1,a.configurable=!0,\"value\"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(e,r,s){return r&&t(e.prototype,r),s&&t(e,s),e}}();function V9(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function J9(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}var tf=bwe(),bpt=function(){function t(e,r,s,a,n,c){J9(this,t),this.left=e,this.right=r,this.top=s,this.bottom=a,this.width=n,this.height=c}return FF(t,[{key:\"fromJS\",value:function(r){r(this.left,this.right,this.top,this.bottom,this.width,this.height)}},{key:\"toString\",value:function(){return\"<Layout#\"+this.left+\":\"+this.right+\";\"+this.top+\":\"+this.bottom+\";\"+this.width+\":\"+this.height+\">\"}}]),t}(),Pwe=function(){FF(t,null,[{key:\"fromJS\",value:function(r){var s=r.width,a=r.height;return new t(s,a)}}]);function t(e,r){J9(this,t),this.width=e,this.height=r}return FF(t,[{key:\"fromJS\",value:function(r){r(this.width,this.height)}},{key:\"toString\",value:function(){return\"<Size#\"+this.width+\"x\"+this.height+\">\"}}]),t}(),xwe=function(){function t(e,r){J9(this,t),this.unit=e,this.value=r}return FF(t,[{key:\"fromJS\",value:function(r){r(this.unit,this.value)}},{key:\"toString\",value:function(){switch(this.unit){case tf.UNIT_POINT:return String(this.value);case tf.UNIT_PERCENT:return this.value+\"%\";case tf.UNIT_AUTO:return\"auto\";default:return this.value+\"?\"}}},{key:\"valueOf\",value:function(){return this.value}}]),t}();kwe.exports=function(t,e){function r(c,f,p){var h=c[f];c[f]=function(){for(var E=arguments.length,C=Array(E),S=0;S<E;S++)C[S]=arguments[S];return p.call.apply(p,[this,h].concat(C))}}for(var s=[\"setPosition\",\"setMargin\",\"setFlexBasis\",\"setWidth\",\"setHeight\",\"setMinWidth\",\"setMinHeight\",\"setMaxWidth\",\"setMaxHeight\",\"setPadding\"],a=function(){var f,p=s[n],h=(f={},V9(f,tf.UNIT_POINT,e.Node.prototype[p]),V9(f,tf.UNIT_PERCENT,e.Node.prototype[p+\"Percent\"]),V9(f,tf.UNIT_AUTO,e.Node.prototype[p+\"Auto\"]),f);r(e.Node.prototype,p,function(E){for(var C=arguments.length,S=Array(C>1?C-1:0),P=1;P<C;P++)S[P-1]=arguments[P];var I=S.pop(),R=void 0,N=void 0;if(I===\"auto\")R=tf.UNIT_AUTO,N=void 0;else if(I instanceof xwe)R=I.unit,N=I.valueOf();else if(R=typeof I==\"string\"&&I.endsWith(\"%\")?tf.UNIT_PERCENT:tf.UNIT_POINT,N=parseFloat(I),!Number.isNaN(I)&&Number.isNaN(N))throw new Error(\"Invalid value \"+I+\" for \"+p);if(!h[R])throw new Error('Failed to execute \"'+p+`\": Unsupported unit '`+I+\"'\");if(N!==void 0){var U;return(U=h[R]).call.apply(U,[this].concat(S,[N]))}else{var W;return(W=h[R]).call.apply(W,[this].concat(S))}})},n=0;n<s.length;n++)a();return r(e.Config.prototype,\"free\",function(){e.Config.destroy(this)}),r(e.Node,\"create\",function(c,f){return f?e.Node.createWithConfig(f):e.Node.createDefault()}),r(e.Node.prototype,\"free\",function(){e.Node.destroy(this)}),r(e.Node.prototype,\"freeRecursive\",function(){for(var c=0,f=this.getChildCount();c<f;++c)this.getChild(0).freeRecursive();this.free()}),r(e.Node.prototype,\"setMeasureFunc\",function(c,f){return f?c.call(this,function(){return Pwe.fromJS(f.apply(void 0,arguments))}):this.unsetMeasureFunc()}),r(e.Node.prototype,\"calculateLayout\",function(c){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:NaN,p=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:tf.DIRECTION_LTR;return c.call(this,f,p,h)}),Dpt({Config:e.Config,Node:e.Node,Layout:t(\"Layout\",bpt),Size:t(\"Size\",Pwe),Value:t(\"Value\",xwe),getInstanceCount:function(){return e.getInstanceCount.apply(e,arguments)}},tf)}});var Twe=_((exports,module)=>{(function(t,e){typeof define==\"function\"&&define.amd?define([],function(){return e}):typeof module==\"object\"&&module.exports?module.exports=e:(t.nbind=t.nbind||{}).init=e})(exports,function(Module,cb){typeof Module==\"function\"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(t,e){return function(){t&&t.apply(this,arguments);try{Module.ccall(\"nbind_init\")}catch(r){e(r);return}e(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module<\"u\"?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT===\"WEB\")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT===\"WORKER\")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT===\"NODE\")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT===\"SHELL\")ENVIRONMENT_IS_SHELL=!0;else throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\");else ENVIRONMENT_IS_WEB=typeof window==\"object\",ENVIRONMENT_IS_WORKER=typeof importScripts==\"function\",ENVIRONMENT_IS_NODE=typeof process==\"object\"&&typeof Ie==\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn);var nodeFS,nodePath;Module.read=function(e,r){nodeFS||(nodeFS={}(\"\")),nodePath||(nodePath={}(\"\")),e=nodePath.normalize(e);var s=nodeFS.readFileSync(e);return r?s:s.toString()},Module.readBinary=function(e){var r=Module.read(e,!0);return r.buffer||(r=new Uint8Array(r)),assert(r.buffer),r},Module.load=function(e){globalEval(read(e))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\\\/g,\"/\"):Module.thisProgram=\"unknown-program\"),Module.arguments=process.argv.slice(2),typeof module<\"u\"&&(module.exports=Module),Module.inspect=function(){return\"[Emscripten Module object]\"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr<\"u\"&&(Module.printErr=printErr),typeof read<\"u\"?Module.read=read:Module.read=function(){throw\"no read() available\"},Module.readBinary=function(e){if(typeof readbuffer==\"function\")return new Uint8Array(readbuffer(e));var r=read(e,\"binary\");return assert(typeof r==\"object\"),r},typeof scriptArgs<\"u\"?Module.arguments=scriptArgs:typeof arguments<\"u\"&&(Module.arguments=arguments),typeof quit==\"function\"&&(Module.quit=function(t,e){quit(t)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(e){var r=new XMLHttpRequest;return r.open(\"GET\",e,!1),r.send(null),r.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(e){var r=new XMLHttpRequest;return r.open(\"GET\",e,!1),r.responseType=\"arraybuffer\",r.send(null),new Uint8Array(r.response)}),Module.readAsync=function(e,r,s){var a=new XMLHttpRequest;a.open(\"GET\",e,!0),a.responseType=\"arraybuffer\",a.onload=function(){a.status==200||a.status==0&&a.response?r(a.response):s()},a.onerror=s,a.send(null)},typeof arguments<\"u\"&&(Module.arguments=arguments),typeof console<\"u\")Module.print||(Module.print=function(e){console.log(e)}),Module.printErr||(Module.printErr=function(e){console.warn(e)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump<\"u\"?function(t){dump(t)}:function(t){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle>\"u\"&&(Module.setWindowTitle=function(t){document.title=t})}else throw\"Unknown runtime environment. Where are we?\";function globalEval(t){eval.call(null,t)}!Module.load&&Module.read&&(Module.load=function(e){globalEval(Module.read(e))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram=\"./this.program\"),Module.quit||(Module.quit=function(t,e){throw e}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(t){return tempRet0=t,t},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(t){STACKTOP=t},getNativeTypeSize:function(t){switch(t){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(t[t.length-1]===\"*\")return Runtime.QUANTUM_SIZE;if(t[0]===\"i\"){var e=parseInt(t.substr(1));return assert(e%8===0),e/8}else return 0}}},getNativeFieldSize:function(t){return Math.max(Runtime.getNativeTypeSize(t),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(t,e){return e===\"double\"||e===\"i64\"?t&7&&(assert((t&7)===4),t+=4):assert((t&3)===0),t},getAlignSize:function(t,e,r){return!r&&(t==\"i64\"||t==\"double\")?8:t?Math.min(e||(t?Runtime.getNativeFieldSize(t):0),Runtime.QUANTUM_SIZE):Math.min(e,8)},dynCall:function(t,e,r){return r&&r.length?Module[\"dynCall_\"+t].apply(null,[e].concat(r)):Module[\"dynCall_\"+t].call(null,e)},functionPointers:[],addFunction:function(t){for(var e=0;e<Runtime.functionPointers.length;e++)if(!Runtime.functionPointers[e])return Runtime.functionPointers[e]=t,2*(1+e);throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"},removeFunction:function(t){Runtime.functionPointers[(t-2)/2]=null},warnOnce:function(t){Runtime.warnOnce.shown||(Runtime.warnOnce.shown={}),Runtime.warnOnce.shown[t]||(Runtime.warnOnce.shown[t]=1,Module.printErr(t))},funcWrappers:{},getFuncWrapper:function(t,e){if(t){assert(e),Runtime.funcWrappers[e]||(Runtime.funcWrappers[e]={});var r=Runtime.funcWrappers[e];return r[t]||(e.length===1?r[t]=function(){return Runtime.dynCall(e,t)}:e.length===2?r[t]=function(a){return Runtime.dynCall(e,t,[a])}:r[t]=function(){return Runtime.dynCall(e,t,Array.prototype.slice.call(arguments))}),r[t]}},getCompilerSetting:function(t){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"},stackAlloc:function(t){var e=STACKTOP;return STACKTOP=STACKTOP+t|0,STACKTOP=STACKTOP+15&-16,e},staticAlloc:function(t){var e=STATICTOP;return STATICTOP=STATICTOP+t|0,STATICTOP=STATICTOP+15&-16,e},dynamicAlloc:function(t){var e=HEAP32[DYNAMICTOP_PTR>>2],r=(e+t+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=r,r>=TOTAL_MEMORY){var s=enlargeMemory();if(!s)return HEAP32[DYNAMICTOP_PTR>>2]=e,0}return e},alignMemory:function(t,e){var r=t=Math.ceil(t/(e||16))*(e||16);return r},makeBigInt:function(t,e,r){var s=r?+(t>>>0)+ +(e>>>0)*4294967296:+(t>>>0)+ +(e|0)*4294967296;return s},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(t,e){t||abort(\"Assertion failed: \"+e)}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func)try{func=eval(\"_\"+ident)}catch(t){}return assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(t){var e=Runtime.stackAlloc(t.length);return writeArrayToMemory(t,e),e},stringToC:function(t){var e=0;if(t!=null&&t!==0){var r=(t.length<<2)+1;e=Runtime.stackAlloc(r),stringToUTF8(t,e,r)}return e}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,r,s,a,n){var c=getCFunc(e),f=[],p=0;if(a)for(var h=0;h<a.length;h++){var E=toC[s[h]];E?(p===0&&(p=Runtime.stackSave()),f[h]=E(a[h])):f[h]=a[h]}var C=c.apply(null,f);if(r===\"string\"&&(C=Pointer_stringify(C)),p!==0){if(n&&n.async){EmterpreterAsync.asyncFinalizers.push(function(){Runtime.stackRestore(p)});return}Runtime.stackRestore(p)}return C};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(t){var e=t.toString().match(sourceRegex).slice(1);return{arguments:e[0],body:e[1],returnValue:e[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var t in JSfuncs)JSfuncs.hasOwnProperty(t)&&(JSsource[t]=parseJSFunc(JSfuncs[t]))}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident),numericArgs=argTypes.every(function(t){return t===\"number\"}),numericRet=returnType!==\"string\";if(numericRet&&numericArgs)return cfunc;var argNames=argTypes.map(function(t,e){return\"$\"+e}),funcstr=\"(function(\"+argNames.join(\",\")+\") {\",nargs=argTypes.length;if(!numericArgs){ensureJSsource(),funcstr+=\"var stack = \"+JSsource.stackSave.body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type!==\"number\"){var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\",funcstr+=convertCode.body+\";\",funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}}var cfuncname=parseJSFunc(function(){return cfunc}).returnValue;if(funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\",!numericRet){var strgfy=parseJSFunc(function(){return Pointer_stringify}).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}return numericArgs||(ensureJSsource(),funcstr+=JSsource.stackRestore.body.replace(\"()\",\"(stack)\")+\";\"),funcstr+=\"return ret})\",eval(funcstr)}})(),Module.ccall=ccall,Module.cwrap=cwrap;function setValue(t,e,r,s){switch(r=r||\"i8\",r.charAt(r.length-1)===\"*\"&&(r=\"i32\"),r){case\"i1\":HEAP8[t>>0]=e;break;case\"i8\":HEAP8[t>>0]=e;break;case\"i16\":HEAP16[t>>1]=e;break;case\"i32\":HEAP32[t>>2]=e;break;case\"i64\":tempI64=[e>>>0,(tempDouble=e,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[t>>2]=tempI64[0],HEAP32[t+4>>2]=tempI64[1];break;case\"float\":HEAPF32[t>>2]=e;break;case\"double\":HEAPF64[t>>3]=e;break;default:abort(\"invalid type for setValue: \"+r)}}Module.setValue=setValue;function getValue(t,e,r){switch(e=e||\"i8\",e.charAt(e.length-1)===\"*\"&&(e=\"i32\"),e){case\"i1\":return HEAP8[t>>0];case\"i8\":return HEAP8[t>>0];case\"i16\":return HEAP16[t>>1];case\"i32\":return HEAP32[t>>2];case\"i64\":return HEAP32[t>>2];case\"float\":return HEAPF32[t>>2];case\"double\":return HEAPF64[t>>3];default:abort(\"invalid type for setValue: \"+e)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE;function allocate(t,e,r,s){var a,n;typeof t==\"number\"?(a=!0,n=t):(a=!1,n=t.length);var c=typeof e==\"string\"?e:null,f;if(r==ALLOC_NONE?f=s:f=[typeof _malloc==\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][r===void 0?ALLOC_STATIC:r](Math.max(n,c?1:e.length)),a){var s=f,p;for(assert((f&3)==0),p=f+(n&-4);s<p;s+=4)HEAP32[s>>2]=0;for(p=f+n;s<p;)HEAP8[s++>>0]=0;return f}if(c===\"i8\")return t.subarray||t.slice?HEAPU8.set(t,f):HEAPU8.set(new Uint8Array(t),f),f;for(var h=0,E,C,S;h<n;){var P=t[h];if(typeof P==\"function\"&&(P=Runtime.getFunctionIndex(P)),E=c||e[h],E===0){h++;continue}E==\"i64\"&&(E=\"i32\"),setValue(f+h,P,E),S!==E&&(C=Runtime.getNativeTypeSize(E),S=E),h+=C}return f}Module.allocate=allocate;function getMemory(t){return staticSealed?runtimeInitialized?_malloc(t):Runtime.dynamicAlloc(t):Runtime.staticAlloc(t)}Module.getMemory=getMemory;function Pointer_stringify(t,e){if(e===0||!t)return\"\";for(var r=0,s,a=0;s=HEAPU8[t+a>>0],r|=s,!(s==0&&!e||(a++,e&&a==e)););e||(e=a);var n=\"\";if(r<128){for(var c=1024,f;e>0;)f=String.fromCharCode.apply(String,HEAPU8.subarray(t,t+Math.min(e,c))),n=n?n+f:f,t+=c,e-=c;return n}return Module.UTF8ToString(t)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(t){for(var e=\"\";;){var r=HEAP8[t++>>0];if(!r)return e;e+=String.fromCharCode(r)}}Module.AsciiToString=AsciiToString;function stringToAscii(t,e){return writeAsciiToMemory(t,e,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder<\"u\"?new TextDecoder(\"utf8\"):void 0;function UTF8ArrayToString(t,e){for(var r=e;t[r];)++r;if(r-e>16&&t.subarray&&UTF8Decoder)return UTF8Decoder.decode(t.subarray(e,r));for(var s,a,n,c,f,p,h=\"\";;){if(s=t[e++],!s)return h;if(!(s&128)){h+=String.fromCharCode(s);continue}if(a=t[e++]&63,(s&224)==192){h+=String.fromCharCode((s&31)<<6|a);continue}if(n=t[e++]&63,(s&240)==224?s=(s&15)<<12|a<<6|n:(c=t[e++]&63,(s&248)==240?s=(s&7)<<18|a<<12|n<<6|c:(f=t[e++]&63,(s&252)==248?s=(s&3)<<24|a<<18|n<<12|c<<6|f:(p=t[e++]&63,s=(s&1)<<30|a<<24|n<<18|c<<12|f<<6|p))),s<65536)h+=String.fromCharCode(s);else{var E=s-65536;h+=String.fromCharCode(55296|E>>10,56320|E&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(t){return UTF8ArrayToString(HEAPU8,t)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(t,e,r,s){if(!(s>0))return 0;for(var a=r,n=r+s-1,c=0;c<t.length;++c){var f=t.charCodeAt(c);if(f>=55296&&f<=57343&&(f=65536+((f&1023)<<10)|t.charCodeAt(++c)&1023),f<=127){if(r>=n)break;e[r++]=f}else if(f<=2047){if(r+1>=n)break;e[r++]=192|f>>6,e[r++]=128|f&63}else if(f<=65535){if(r+2>=n)break;e[r++]=224|f>>12,e[r++]=128|f>>6&63,e[r++]=128|f&63}else if(f<=2097151){if(r+3>=n)break;e[r++]=240|f>>18,e[r++]=128|f>>12&63,e[r++]=128|f>>6&63,e[r++]=128|f&63}else if(f<=67108863){if(r+4>=n)break;e[r++]=248|f>>24,e[r++]=128|f>>18&63,e[r++]=128|f>>12&63,e[r++]=128|f>>6&63,e[r++]=128|f&63}else{if(r+5>=n)break;e[r++]=252|f>>30,e[r++]=128|f>>24&63,e[r++]=128|f>>18&63,e[r++]=128|f>>12&63,e[r++]=128|f>>6&63,e[r++]=128|f&63}}return e[r]=0,r-a}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(t,e,r){return stringToUTF8Array(t,HEAPU8,e,r)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(t){for(var e=0,r=0;r<t.length;++r){var s=t.charCodeAt(r);s>=55296&&s<=57343&&(s=65536+((s&1023)<<10)|t.charCodeAt(++r)&1023),s<=127?++e:s<=2047?e+=2:s<=65535?e+=3:s<=2097151?e+=4:s<=67108863?e+=5:e+=6}return e}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder<\"u\"?new TextDecoder(\"utf-16le\"):void 0;function demangle(t){var e=Module.___cxa_demangle||Module.__cxa_demangle;if(e){try{var r=t.substr(1),s=lengthBytesUTF8(r)+1,a=_malloc(s);stringToUTF8(r,a,s);var n=_malloc(4),c=e(a,0,0,n);if(getValue(n,\"i32\")===0&&c)return Pointer_stringify(c)}catch{}finally{a&&_free(a),n&&_free(n),c&&_free(c)}return t}return Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\"),t}function demangleAll(t){var e=/__Z[\\w\\d_]+/g;return t.replace(e,function(r){var s=demangle(r);return r===s?r:r+\" [\"+s+\"]\"})}function jsStackTrace(){var t=new Error;if(!t.stack){try{throw new Error(0)}catch(e){t=e}if(!t.stack)return\"(no stack trace available)\"}return t.stack.toString()}function stackTrace(){var t=jsStackTrace();return Module.extraStackTrace&&(t+=`\n`+Module.extraStackTrace()),demangleAll(t)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY<TOTAL_STACK&&Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\"),Module.buffer?buffer=Module.buffer:buffer=new ArrayBuffer(TOTAL_MEMORY),updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}if(HEAP32[0]=1668509029,HEAP16[1]=25459,HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module.HEAP=HEAP,Module.buffer=buffer,Module.HEAP8=HEAP8,Module.HEAP16=HEAP16,Module.HEAP32=HEAP32,Module.HEAPU8=HEAPU8,Module.HEAPU16=HEAPU16,Module.HEAPU32=HEAPU32,Module.HEAPF32=HEAPF32,Module.HEAPF64=HEAPF64;function callRuntimeCallbacks(t){for(;t.length>0;){var e=t.shift();if(typeof e==\"function\"){e();continue}var r=e.func;typeof r==\"number\"?e.arg===void 0?Module.dynCall_v(r):Module.dynCall_vi(r,e.arg):r(e.arg===void 0?null:e.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun==\"function\"&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for(typeof Module.postRun==\"function\"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(t){__ATPRERUN__.unshift(t)}Module.addOnPreRun=addOnPreRun;function addOnInit(t){__ATINIT__.unshift(t)}Module.addOnInit=addOnInit;function addOnPreMain(t){__ATMAIN__.unshift(t)}Module.addOnPreMain=addOnPreMain;function addOnExit(t){__ATEXIT__.unshift(t)}Module.addOnExit=addOnExit;function addOnPostRun(t){__ATPOSTRUN__.unshift(t)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(t,e,r){var s=r>0?r:lengthBytesUTF8(t)+1,a=new Array(s),n=stringToUTF8Array(t,a,0,a.length);return e&&(a.length=n),a}Module.intArrayFromString=intArrayFromString;function intArrayToString(t){for(var e=[],r=0;r<t.length;r++){var s=t[r];s>255&&(s&=255),e.push(String.fromCharCode(s))}return e.join(\"\")}Module.intArrayToString=intArrayToString;function writeStringToMemory(t,e,r){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var s,a;r&&(a=e+lengthBytesUTF8(t),s=HEAP8[a]),stringToUTF8(t,e,1/0),r&&(HEAP8[a]=s)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(t,e){HEAP8.set(t,e)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(t,e,r){for(var s=0;s<t.length;++s)HEAP8[e++>>0]=t.charCodeAt(s);r||(HEAP8[e>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function t(e,r){var s=e>>>16,a=e&65535,n=r>>>16,c=r&65535;return a*c+(s*c+a*n<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(t){return froundBuffer[0]=t,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(t){t=t>>>0;for(var e=0;e<32;e++)if(t&1<<31-e)return e;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(t){return t<0?Math.ceil(t):Math.floor(t)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(t){return t}function addRunDependency(t){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(t){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var e=dependenciesFulfilled;dependenciesFulfilled=null,e()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(t,e,r,s,a,n,c,f){return _nbind.callbackSignatureList[t].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(t,e,r,s,a,n,c,f){return ASM_CONSTS[t](e,r,s,a,n,c,f)}function _emscripten_asm_const_iiiii(t,e,r,s,a){return ASM_CONSTS[t](e,r,s,a)}function _emscripten_asm_const_iiidddddd(t,e,r,s,a,n,c,f,p){return ASM_CONSTS[t](e,r,s,a,n,c,f,p)}function _emscripten_asm_const_iiididi(t,e,r,s,a,n,c){return ASM_CONSTS[t](e,r,s,a,n,c)}function _emscripten_asm_const_iiii(t,e,r,s){return ASM_CONSTS[t](e,r,s)}function _emscripten_asm_const_iiiid(t,e,r,s,a){return ASM_CONSTS[t](e,r,s,a)}function _emscripten_asm_const_iiiiii(t,e,r,s,a,n){return ASM_CONSTS[t](e,r,s,a,n)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _atexit(t,e){__ATEXIT__.unshift({func:t,arg:e})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr(\"missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj\"),abort(-1)}function __decorate(t,e,r,s){var a=arguments.length,n=a<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,r):s,c;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")n=Reflect.decorate(t,e,r,s);else for(var f=t.length-1;f>=0;f--)(c=t[f])&&(n=(a<3?c(n):a>3?c(e,r,n):c(e,r))||n);return a>3&&n&&Object.defineProperty(e,r,n),n}function _defineHidden(t){return function(e,r){Object.defineProperty(e,r,{configurable:!1,enumerable:!1,value:t,writable:!0})}}var _nbind={};function __nbind_free_external(t){_nbind.externalList[t].dereference(t)}function __nbind_reference_external(t){_nbind.externalList[t].reference()}function _llvm_stackrestore(t){var e=_llvm_stacksave,r=e.LLVM_SAVEDSTACKS[t];e.LLVM_SAVEDSTACKS.splice(t,1),Runtime.stackRestore(r)}function __nbind_register_pool(t,e,r,s){_nbind.Pool.pageSize=t,_nbind.Pool.usedPtr=e/4,_nbind.Pool.rootPtr=r,_nbind.Pool.pagePtr=s/4,HEAP32[e/4]=16909060,HEAP8[e]==1&&(_nbind.bigEndian=!0),HEAP32[e/4]=0,_nbind.makeTypeKindTbl=(n={},n[1024]=_nbind.PrimitiveType,n[64]=_nbind.Int64Type,n[2048]=_nbind.BindClass,n[3072]=_nbind.BindClassPtr,n[4096]=_nbind.SharedClassPtr,n[5120]=_nbind.ArrayType,n[6144]=_nbind.ArrayType,n[7168]=_nbind.CStringType,n[9216]=_nbind.CallbackType,n[10240]=_nbind.BindType,n),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,\"cbFunction &\":_nbind.CallbackType,\"const cbFunction &\":_nbind.CallbackType,\"const std::string &\":_nbind.StringType,\"std::string\":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var a=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:\"\"});a.proto=Module,_nbind.BindClass.list.push(a);var n}function _emscripten_set_main_loop_timing(t,e){if(Browser.mainLoop.timingMode=t,Browser.mainLoop.timingValue=e,!Browser.mainLoop.func)return 1;if(t==0)Browser.mainLoop.scheduler=function(){var c=Math.max(0,Browser.mainLoop.tickStartTime+e-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,c)},Browser.mainLoop.method=\"timeout\";else if(t==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method=\"rAF\";else if(t==2){if(!window.setImmediate){let n=function(c){c.source===window&&c.data===s&&(c.stopPropagation(),r.shift()())};var a=n,r=[],s=\"setimmediate\";window.addEventListener(\"message\",n,!0),window.setImmediate=function(f){r.push(f),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(f),window.postMessage({target:s})):window.postMessage(s,\"*\")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method=\"immediate\"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(t,e,r,s,a){Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,\"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.\"),Browser.mainLoop.func=t,Browser.mainLoop.arg=s;var n;typeof s<\"u\"?n=function(){Module.dynCall_vi(t,s)}:n=function(){Module.dynCall_v(t)};var c=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var p=Date.now(),h=Browser.mainLoop.queue.shift();if(h.func(h.arg),Browser.mainLoop.remainingBlockers){var E=Browser.mainLoop.remainingBlockers,C=E%1==0?E-1:Math.floor(E);h.counted?Browser.mainLoop.remainingBlockers=C:(C=C+.5,Browser.mainLoop.remainingBlockers=(8*E+C)/9)}if(console.log('main loop blocker \"'+h.name+'\" took '+(Date.now()-p)+\" ms\"),Browser.mainLoop.updateStatus(),c<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(!(c<Browser.mainLoop.currentlyRunningMainloop)){if(Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0,Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method===\"timeout\"&&Module.ctx&&(Module.printErr(\"Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!\"),Browser.mainLoop.method=\"\"),Browser.mainLoop.runIter(n),!(c<Browser.mainLoop.currentlyRunningMainloop)&&(typeof SDL==\"object\"&&SDL.audio&&SDL.audio.queueNewAudioData&&SDL.audio.queueNewAudioData(),Browser.mainLoop.scheduler())}}},a||(e&&e>0?_emscripten_set_main_loop_timing(0,1e3/e):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),r)throw\"SimulateInfiniteLoop\"}var Browser={mainLoop:{scheduler:null,method:\"\",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var t=Browser.mainLoop.timingMode,e=Browser.mainLoop.timingValue,r=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(r,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(t,e),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var t=Module.statusMessage||\"Please wait...\",e=Browser.mainLoop.remainingBlockers,r=Browser.mainLoop.expectedBlockers;e?e<r?Module.setStatus(t+\" (\"+(r-e)+\"/\"+r+\")\"):Module.setStatus(t):Module.setStatus(\"\")}},runIter:function(t){if(!ABORT){if(Module.preMainLoop){var e=Module.preMainLoop();if(e===!1)return}try{t()}catch(r){if(r instanceof ExitStatus)return;throw r&&typeof r==\"object\"&&r.stack&&Module.printErr(\"exception thrown: \"+[r,r.stack]),r}Module.postMainLoop&&Module.postMainLoop()}}},isFullscreen:!1,pointerLock:!1,moduleContextCreatedCallbacks:[],workers:[],init:function(){if(Module.preloadPlugins||(Module.preloadPlugins=[]),Browser.initted)return;Browser.initted=!0;try{new Blob,Browser.hasBlobConstructor=!0}catch{Browser.hasBlobConstructor=!1,console.log(\"warning: no blob constructor, cannot create blobs with mimetypes\")}Browser.BlobBuilder=typeof MozBlobBuilder<\"u\"?MozBlobBuilder:typeof WebKitBlobBuilder<\"u\"?WebKitBlobBuilder:Browser.hasBlobConstructor?null:console.log(\"warning: no BlobBuilder\"),Browser.URLObject=typeof window<\"u\"?window.URL?window.URL:window.webkitURL:void 0,!Module.noImageDecoding&&typeof Browser.URLObject>\"u\"&&(console.log(\"warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.\"),Module.noImageDecoding=!0);var t={};t.canHandle=function(n){return!Module.noImageDecoding&&/\\.(jpg|jpeg|png|bmp)$/i.test(n)},t.handle=function(n,c,f,p){var h=null;if(Browser.hasBlobConstructor)try{h=new Blob([n],{type:Browser.getMimetype(c)}),h.size!==n.length&&(h=new Blob([new Uint8Array(n).buffer],{type:Browser.getMimetype(c)}))}catch(P){Runtime.warnOnce(\"Blob constructor present but fails: \"+P+\"; falling back to blob builder\")}if(!h){var E=new Browser.BlobBuilder;E.append(new Uint8Array(n).buffer),h=E.getBlob()}var C=Browser.URLObject.createObjectURL(h),S=new Image;S.onload=function(){assert(S.complete,\"Image \"+c+\" could not be decoded\");var I=document.createElement(\"canvas\");I.width=S.width,I.height=S.height;var R=I.getContext(\"2d\");R.drawImage(S,0,0),Module.preloadedImages[c]=I,Browser.URLObject.revokeObjectURL(C),f&&f(n)},S.onerror=function(I){console.log(\"Image \"+C+\" could not be decoded\"),p&&p()},S.src=C},Module.preloadPlugins.push(t);var e={};e.canHandle=function(n){return!Module.noAudioDecoding&&n.substr(-4)in{\".ogg\":1,\".wav\":1,\".mp3\":1}},e.handle=function(n,c,f,p){var h=!1;function E(R){h||(h=!0,Module.preloadedAudios[c]=R,f&&f(n))}function C(){h||(h=!0,Module.preloadedAudios[c]=new Audio,p&&p())}if(Browser.hasBlobConstructor){try{var S=new Blob([n],{type:Browser.getMimetype(c)})}catch{return C()}var P=Browser.URLObject.createObjectURL(S),I=new Audio;I.addEventListener(\"canplaythrough\",function(){E(I)},!1),I.onerror=function(N){if(h)return;console.log(\"warning: browser could not fully decode audio \"+c+\", trying slower base64 approach\");function U(W){for(var ee=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",ie=\"=\",ue=\"\",le=0,me=0,pe=0;pe<W.length;pe++)for(le=le<<8|W[pe],me+=8;me>=6;){var Be=le>>me-6&63;me-=6,ue+=ee[Be]}return me==2?(ue+=ee[(le&3)<<4],ue+=ie+ie):me==4&&(ue+=ee[(le&15)<<2],ue+=ie),ue}I.src=\"data:audio/x-\"+c.substr(-3)+\";base64,\"+U(n),E(I)},I.src=P,Browser.safeSetTimeout(function(){E(I)},1e4)}else return C()},Module.preloadPlugins.push(e);function r(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var s=Module.canvas;s&&(s.requestPointerLock=s.requestPointerLock||s.mozRequestPointerLock||s.webkitRequestPointerLock||s.msRequestPointerLock||function(){},s.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},s.exitPointerLock=s.exitPointerLock.bind(document),document.addEventListener(\"pointerlockchange\",r,!1),document.addEventListener(\"mozpointerlockchange\",r,!1),document.addEventListener(\"webkitpointerlockchange\",r,!1),document.addEventListener(\"mspointerlockchange\",r,!1),Module.elementPointerLock&&s.addEventListener(\"click\",function(a){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),a.preventDefault())},!1))},createContext:function(t,e,r,s){if(e&&Module.ctx&&t==Module.canvas)return Module.ctx;var a,n;if(e){var c={antialias:!1,alpha:!1};if(s)for(var f in s)c[f]=s[f];n=GL.createContext(t,c),n&&(a=GL.getContext(n).GLctx)}else a=t.getContext(\"2d\");return a?(r&&(e||assert(typeof GLctx>\"u\",\"cannot set in module if GLctx is used, but we are a non-GL context that would replace it\"),Module.ctx=a,e&&GL.makeContextCurrent(n),Module.useWebGL=e,Browser.moduleContextCreatedCallbacks.forEach(function(p){p()}),Browser.init()),a):null},destroyContext:function(t,e,r){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(t,e,r){Browser.lockPointer=t,Browser.resizeCanvas=e,Browser.vrDevice=r,typeof Browser.lockPointer>\"u\"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas>\"u\"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice>\"u\"&&(Browser.vrDevice=null);var s=Module.canvas;function a(){Browser.isFullscreen=!1;var c=s.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===c?(s.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},s.exitFullscreen=s.exitFullscreen.bind(document),Browser.lockPointer&&s.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(c.parentNode.insertBefore(s,c),c.parentNode.removeChild(c),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(s)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener(\"fullscreenchange\",a,!1),document.addEventListener(\"mozfullscreenchange\",a,!1),document.addEventListener(\"webkitfullscreenchange\",a,!1),document.addEventListener(\"MSFullscreenChange\",a,!1));var n=document.createElement(\"div\");s.parentNode.insertBefore(n,s),n.appendChild(s),n.requestFullscreen=n.requestFullscreen||n.mozRequestFullScreen||n.msRequestFullscreen||(n.webkitRequestFullscreen?function(){n.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(n.webkitRequestFullScreen?function(){n.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),r?n.requestFullscreen({vrDisplay:r}):n.requestFullscreen()},requestFullScreen:function(t,e,r){return Module.printErr(\"Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead.\"),Browser.requestFullScreen=function(s,a,n){return Browser.requestFullscreen(s,a,n)},Browser.requestFullscreen(t,e,r)},nextRAF:0,fakeRequestAnimationFrame:function(t){var e=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=e+1e3/60;else for(;e+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var r=Math.max(Browser.nextRAF-e,0);setTimeout(t,r)},requestAnimationFrame:function t(e){typeof window>\"u\"?Browser.fakeRequestAnimationFrame(e):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(e))},safeCallback:function(t){return function(){if(!ABORT)return t.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var t=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],t.forEach(function(e){e()})}},safeRequestAnimationFrame:function(t){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))})},safeSetTimeout:function(t,e){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))},e)},safeSetInterval:function(t,e){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&t()},e)},getMimetype:function(t){return{jpg:\"image/jpeg\",jpeg:\"image/jpeg\",png:\"image/png\",bmp:\"image/bmp\",ogg:\"audio/ogg\",wav:\"audio/wav\",mp3:\"audio/mpeg\"}[t.substr(t.lastIndexOf(\".\")+1)]},getUserMedia:function(t){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(t)},getMovementX:function(t){return t.movementX||t.mozMovementX||t.webkitMovementX||0},getMovementY:function(t){return t.movementY||t.mozMovementY||t.webkitMovementY||0},getMouseWheelDelta:function(t){var e=0;switch(t.type){case\"DOMMouseScroll\":e=t.detail;break;case\"mousewheel\":e=t.wheelDelta;break;case\"wheel\":e=t.deltaY;break;default:throw\"unrecognized mouse wheel event: \"+t.type}return e},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(t){if(Browser.pointerLock)t.type!=\"mousemove\"&&\"mozMovementX\"in t?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(t),Browser.mouseMovementY=Browser.getMovementY(t)),typeof SDL<\"u\"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var e=Module.canvas.getBoundingClientRect(),r=Module.canvas.width,s=Module.canvas.height,a=typeof window.scrollX<\"u\"?window.scrollX:window.pageXOffset,n=typeof window.scrollY<\"u\"?window.scrollY:window.pageYOffset;if(t.type===\"touchstart\"||t.type===\"touchend\"||t.type===\"touchmove\"){var c=t.touch;if(c===void 0)return;var f=c.pageX-(a+e.left),p=c.pageY-(n+e.top);f=f*(r/e.width),p=p*(s/e.height);var h={x:f,y:p};if(t.type===\"touchstart\")Browser.lastTouches[c.identifier]=h,Browser.touches[c.identifier]=h;else if(t.type===\"touchend\"||t.type===\"touchmove\"){var E=Browser.touches[c.identifier];E||(E=h),Browser.lastTouches[c.identifier]=E,Browser.touches[c.identifier]=h}return}var C=t.pageX-(a+e.left),S=t.pageY-(n+e.top);C=C*(r/e.width),S=S*(s/e.height),Browser.mouseMovementX=C-Browser.mouseX,Browser.mouseMovementY=S-Browser.mouseY,Browser.mouseX=C,Browser.mouseY=S}},asyncLoad:function(t,e,r,s){var a=s?\"\":\"al \"+t;Module.readAsync(t,function(n){assert(n,'Loading data file \"'+t+'\" failed (no arrayBuffer).'),e(new Uint8Array(n)),a&&removeRunDependency(a)},function(n){if(r)r();else throw'Loading data file \"'+t+'\" failed.'}),a&&addRunDependency(a)},resizeListeners:[],updateResizeListeners:function(){var t=Module.canvas;Browser.resizeListeners.forEach(function(e){e(t.width,t.height)})},setCanvasSize:function(t,e,r){var s=Module.canvas;Browser.updateCanvasDimensions(s,t,e),r||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL<\"u\"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL<\"u\"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t&-8388609,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},updateCanvasDimensions:function(t,e,r){e&&r?(t.widthNative=e,t.heightNative=r):(e=t.widthNative,r=t.heightNative);var s=e,a=r;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(s/a<Module.forcedAspectRatio?s=Math.round(a*Module.forcedAspectRatio):a=Math.round(s/Module.forcedAspectRatio)),(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===t.parentNode&&typeof screen<\"u\"){var n=Math.min(screen.width/s,screen.height/a);s=Math.round(s*n),a=Math.round(a*n)}Browser.resizeCanvas?(t.width!=s&&(t.width=s),t.height!=a&&(t.height=a),typeof t.style<\"u\"&&(t.style.removeProperty(\"width\"),t.style.removeProperty(\"height\"))):(t.width!=e&&(t.width=e),t.height!=r&&(t.height=r),typeof t.style<\"u\"&&(s!=e||a!=r?(t.style.setProperty(\"width\",s+\"px\",\"important\"),t.style.setProperty(\"height\",a+\"px\",\"important\")):(t.style.removeProperty(\"width\"),t.style.removeProperty(\"height\"))))},wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle:function(){var t=Browser.nextWgetRequestHandle;return Browser.nextWgetRequestHandle++,t}},SYSCALLS={varargs:0,get:function(t){SYSCALLS.varargs+=4;var e=HEAP32[SYSCALLS.varargs-4>>2];return e},getStr:function(){var t=Pointer_stringify(SYSCALLS.get());return t},get64:function(){var t=SYSCALLS.get(),e=SYSCALLS.get();return t>=0?assert(e===0):assert(e===-1),t},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD();return FS.close(r),0}catch(s){return(typeof FS>\"u\"||!(s instanceof FS.ErrnoError))&&abort(s),-s.errno}}function ___syscall54(t,e){SYSCALLS.varargs=e;try{return 0}catch(r){return(typeof FS>\"u\"||!(r instanceof FS.ErrnoError))&&abort(r),-r.errno}}function _typeModule(t){var e=[[0,1,\"X\"],[1,1,\"const X\"],[128,1,\"X *\"],[256,1,\"X &\"],[384,1,\"X &&\"],[512,1,\"std::shared_ptr<X>\"],[640,1,\"std::unique_ptr<X>\"],[5120,1,\"std::vector<X>\"],[6144,2,\"std::array<X, Y>\"],[9216,-1,\"std::function<X (Y)>\"]];function r(p,h,E,C,S,P){if(h==1){var I=C&896;(I==128||I==256||I==384)&&(p=\"X const\")}var R;return P?R=E.replace(\"X\",p).replace(\"Y\",S):R=p.replace(\"X\",E).replace(\"Y\",S),R.replace(/([*&]) (?=[*&])/g,\"$1\")}function s(p,h,E,C,S){throw new Error(p+\" type \"+E.replace(\"X\",h+\"?\")+(C?\" with flag \"+C:\"\")+\" in \"+S)}function a(p,h,E,C,S,P,I,R){P===void 0&&(P=\"X\"),R===void 0&&(R=1);var N=E(p);if(N)return N;var U=C(p),W=U.placeholderFlag,ee=e[W];I&&ee&&(P=r(I[2],I[0],P,ee[0],\"?\",!0));var ie;W==0&&(ie=\"Unbound\"),W>=10&&(ie=\"Corrupt\"),R>20&&(ie=\"Deeply nested\"),ie&&s(ie,p,P,W,S||\"?\");var ue=U.paramList[0],le=a(ue,h,E,C,S,P,ee,R+1),me,pe={flags:ee[0],id:p,name:\"\",paramList:[le]},Be=[],Ce=\"?\";switch(U.placeholderFlag){case 1:me=le.spec;break;case 2:if((le.flags&15360)==1024&&le.spec.ptrSize==1){pe.flags=7168;break}case 3:case 6:case 5:me=le.spec,le.flags&15360;break;case 8:Ce=\"\"+U.paramList[1],pe.paramList.push(U.paramList[1]);break;case 9:for(var g=0,we=U.paramList[1];g<we.length;g++){var ye=we[g],Ae=a(ye,h,E,C,S,P,ee,R+1);Be.push(Ae.name),pe.paramList.push(Ae)}Ce=Be.join(\", \");break;default:break}if(pe.name=r(ee[2],ee[0],le.name,le.flags,Ce),me){for(var se=0,Z=Object.keys(me);se<Z.length;se++){var De=Z[se];pe[De]=pe[De]||me[De]}pe.flags|=me.flags}return n(h,pe)}function n(p,h){var E=h.flags,C=E&896,S=E&15360;return!h.name&&S==1024&&(h.ptrSize==1?h.name=(E&16?\"\":(E&8?\"un\":\"\")+\"signed \")+\"char\":h.name=(E&8?\"u\":\"\")+(E&32?\"float\":\"int\")+(h.ptrSize*8+\"_t\")),h.ptrSize==8&&!(E&32)&&(S=64),S==2048&&(C==512||C==640?S=4096:C&&(S=3072)),p(S,h)}var c=function(){function p(h){this.id=h.id,this.name=h.name,this.flags=h.flags,this.spec=h}return p.prototype.toString=function(){return this.name},p}(),f={Type:c,getComplexType:a,makeType:n,structureList:e};return t.output=f,t.output||f}function __nbind_register_type(t,e){var r=_nbind.readAsciiString(e),s={flags:10240,id:t,name:r};_nbind.makeType(_nbind.constructType,s)}function __nbind_register_callback_signature(t,e){var r=_nbind.readTypeIdList(t,e),s=_nbind.callbackSignatureList.length;return _nbind.callbackSignatureList[s]=_nbind.makeJSCaller(r),s}function __extends(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);function s(){this.constructor=t}s.prototype=e.prototype,t.prototype=new s}function __nbind_register_class(t,e,r,s,a,n,c){var f=_nbind.readAsciiString(c),p=_nbind.readPolicyList(e),h=HEAPU32.subarray(t/4,t/4+2),E={flags:2048|(p.Value?2:0),id:h[0],name:f},C=_nbind.makeType(_nbind.constructType,E);C.ptrType=_nbind.getComplexType(h[1],_nbind.constructType,_nbind.getType,_nbind.queryType),C.destroy=_nbind.makeMethodCaller(C.ptrType,{boundID:E.id,flags:0,name:\"destroy\",num:0,ptr:n,title:C.name+\".free\",typeList:[\"void\",\"uint32_t\",\"uint32_t\"]}),a&&(C.superIdList=Array.prototype.slice.call(HEAPU32.subarray(r/4,r/4+a)),C.upcastList=Array.prototype.slice.call(HEAPU32.subarray(s/4,s/4+a))),Module[C.name]=C.makeBound(p),_nbind.BindClass.list.push(C)}function _removeAccessorPrefix(t){var e=/^[Gg]et_?([A-Z]?([A-Z]?))/;return t.replace(e,function(r,s,a){return a?s:s.toLowerCase()})}function __nbind_register_function(t,e,r,s,a,n,c,f,p,h){var E=_nbind.getType(t),C=_nbind.readPolicyList(e),S=_nbind.readTypeIdList(r,s),P;if(c==5)P=[{direct:a,name:\"__nbindConstructor\",ptr:0,title:E.name+\" constructor\",typeList:[\"uint32_t\"].concat(S.slice(1))},{direct:n,name:\"__nbindValueConstructor\",ptr:0,title:E.name+\" value constructor\",typeList:[\"void\",\"uint32_t\"].concat(S.slice(1))}];else{var I=_nbind.readAsciiString(f),R=(E.name&&E.name+\".\")+I;(c==3||c==4)&&(I=_removeAccessorPrefix(I)),P=[{boundID:t,direct:n,name:I,ptr:a,title:R,typeList:S}]}for(var N=0,U=P;N<U.length;N++){var W=U[N];W.signatureType=c,W.policyTbl=C,W.num=p,W.flags=h,E.addMethod(W)}}function _nbind_value(t,e){_nbind.typeNameTbl[t]||_nbind.throwError(\"Unknown value type \"+t),Module.NBind.bind_value(t,e),_defineHidden(_nbind.typeNameTbl[t].proto.prototype.__nbindValueConstructor)(e.prototype,\"__nbindValueConstructor\")}Module._nbind_value=_nbind_value;function __nbind_get_value_object(t,e){var r=_nbind.popValue(t);if(!r.fromJS)throw new Error(\"Object \"+r+\" has no fromJS function\");r.fromJS(function(){r.__nbindValueConstructor.apply(this,Array.prototype.concat.apply([e],arguments))})}function _emscripten_memcpy_big(t,e,r){return HEAPU8.set(HEAPU8.subarray(e,e+r),t),t}function __nbind_register_primitive(t,e,r){var s={flags:1024|r,id:t,ptrSize:e};_nbind.makeType(_nbind.constructType,s)}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],\"i8\",ALLOC_STATIC);function ___setErrNo(t){return Module.___errno_location&&(HEAP32[Module.___errno_location()>>2]=t),t}function _llvm_stacksave(){var t=_llvm_stacksave;return t.LLVM_SAVEDSTACKS||(t.LLVM_SAVEDSTACKS=[]),t.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),t.LLVM_SAVEDSTACKS.length-1}function ___syscall140(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD(),s=SYSCALLS.get(),a=SYSCALLS.get(),n=SYSCALLS.get(),c=SYSCALLS.get(),f=a;return FS.llseek(r,f,c),HEAP32[n>>2]=r.position,r.getdents&&f===0&&c===0&&(r.getdents=null),0}catch(p){return(typeof FS>\"u\"||!(p instanceof FS.ErrnoError))&&abort(p),-p.errno}}function ___syscall146(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.get(),s=SYSCALLS.get(),a=SYSCALLS.get(),n=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(E,C){var S=___syscall146.buffers[E];assert(S),C===0||C===10?((E===1?Module.print:Module.printErr)(UTF8ArrayToString(S,0)),S.length=0):S.push(C)});for(var c=0;c<a;c++){for(var f=HEAP32[s+c*8>>2],p=HEAP32[s+(c*8+4)>>2],h=0;h<p;h++)___syscall146.printChar(r,HEAPU8[f+h]);n+=p}return n}catch(E){return(typeof FS>\"u\"||!(E instanceof FS.ErrnoError))&&abort(E),-E.errno}}function __nbind_finish(){for(var t=0,e=_nbind.BindClass.list;t<e.length;t++){var r=e[t];r.finish()}}var ___dso_handle=STATICTOP;STATICTOP+=16,function(_nbind){var typeIdTbl={};_nbind.typeNameTbl={};var Pool=function(){function t(){}return t.lalloc=function(e){e=e+7&-8;var r=HEAPU32[t.usedPtr];if(e>t.pageSize/2||e>t.pageSize-r){var s=_nbind.typeNameTbl.NBind.proto;return s.lalloc(e)}else return HEAPU32[t.usedPtr]=r+e,t.rootPtr+r},t.lreset=function(e,r){var s=HEAPU32[t.pagePtr];if(s){var a=_nbind.typeNameTbl.NBind.proto;a.lreset(e,r)}else HEAPU32[t.usedPtr]=e},t}();_nbind.Pool=Pool;function constructType(t,e){var r=t==10240?_nbind.makeTypeNameTbl[e.name]||_nbind.BindType:_nbind.makeTypeKindTbl[t],s=new r(e);return typeIdTbl[e.id]=s,_nbind.typeNameTbl[e.name]=s,s}_nbind.constructType=constructType;function getType(t){return typeIdTbl[t]}_nbind.getType=getType;function queryType(t){var e=HEAPU8[t],r=_nbind.structureList[e][1];t/=4,r<0&&(++t,r=HEAPU32[t]+1);var s=Array.prototype.slice.call(HEAPU32.subarray(t+1,t+1+r));return e==9&&(s=[s[0],s.slice(1)]),{paramList:s,placeholderFlag:e}}_nbind.queryType=queryType;function getTypes(t,e){return t.map(function(r){return typeof r==\"number\"?_nbind.getComplexType(r,constructType,getType,queryType,e):_nbind.typeNameTbl[r]})}_nbind.getTypes=getTypes;function readTypeIdList(t,e){return Array.prototype.slice.call(HEAPU32,t/4,t/4+e)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(t){for(var e=t;HEAPU8[e++];);return String.fromCharCode.apply(\"\",HEAPU8.subarray(t,e-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(t){var e={};if(t)for(;;){var r=HEAPU32[t/4];if(!r)break;e[readAsciiString(r)]=!0,t+=4}return e}_nbind.readPolicyList=readPolicyList;function getDynCall(t,e){var r={float32_t:\"d\",float64_t:\"d\",int64_t:\"d\",uint64_t:\"d\",void:\"v\"},s=t.map(function(n){return r[n.name]||\"i\"}).join(\"\"),a=Module[\"dynCall_\"+s];if(!a)throw new Error(\"dynCall_\"+s+\" not found for \"+e+\"(\"+t.map(function(n){return n.name}).join(\", \")+\")\");return a}_nbind.getDynCall=getDynCall;function addMethod(t,e,r,s){var a=t[e];t.hasOwnProperty(e)&&a?((a.arity||a.arity===0)&&(a=_nbind.makeOverloader(a,a.arity),t[e]=a),a.addMethod(r,s)):(r.arity=s,t[e]=r)}_nbind.addMethod=addMethod;function throwError(t){throw new Error(t)}_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.heap=HEAPU32,r.ptrSize=4,r}return e.prototype.needsWireRead=function(r){return!!this.wireRead||!!this.makeWireRead},e.prototype.needsWireWrite=function(r){return!!this.wireWrite||!!this.makeWireWrite},e}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(t){__extends(e,t);function e(r){var s=t.call(this,r)||this,a=r.flags&32?{32:HEAPF32,64:HEAPF64}:r.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return s.heap=a[r.ptrSize*8],s.ptrSize=r.ptrSize,s}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireWrite=function(r,s){return s&&s.Strict&&function(a){if(typeof a==\"number\")return a;throw new Error(\"Type mismatch\")}},e}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(t,e){if(t==null){if(e&&e.Nullable)return 0;throw new Error(\"Type mismatch\")}if(e&&e.Strict){if(typeof t!=\"string\")throw new Error(\"Type mismatch\")}else t=t.toString();var r=Module.lengthBytesUTF8(t)+1,s=_nbind.Pool.lalloc(r);return Module.stringToUTF8Array(t,HEAPU8,s,r),s}_nbind.pushCString=pushCString;function popCString(t){return t===0?null:Module.Pointer_stringify(t)}_nbind.popCString=popCString;var CStringType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=popCString,r.wireWrite=pushCString,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return e.prototype.makeWireWrite=function(r,s){return function(a){return pushCString(a,s)}},e}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=function(s){return!!s},r}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireRead=function(r){return\"!!(\"+r+\")\"},e.prototype.makeWireWrite=function(r,s){return s&&s.Strict&&function(a){if(typeof a==\"boolean\")return a;throw new Error(\"Type mismatch\")}||r},e}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function t(){}return t.prototype.persist=function(){this.__nbindState|=1},t}();_nbind.Wrapper=Wrapper;function makeBound(t,e){var r=function(s){__extends(a,s);function a(n,c,f,p){var h=s.call(this)||this;if(!(h instanceof a))return new(Function.prototype.bind.apply(a,Array.prototype.concat.apply([null],arguments)));var E=c,C=f,S=p;if(n!==_nbind.ptrMarker){var P=h.__nbindConstructor.apply(h,arguments);E=4608,S=HEAPU32[P/4],C=HEAPU32[P/4+1]}var I={configurable:!0,enumerable:!1,value:null,writable:!1},R={__nbindFlags:E,__nbindPtr:C};S&&(R.__nbindShared=S,_nbind.mark(h));for(var N=0,U=Object.keys(R);N<U.length;N++){var W=U[N];I.value=R[W],Object.defineProperty(h,W,I)}return _defineHidden(0)(h,\"__nbindState\"),h}return a.prototype.free=function(){e.destroy.call(this,this.__nbindShared,this.__nbindFlags),this.__nbindState|=2,disableMember(this,\"__nbindShared\"),disableMember(this,\"__nbindPtr\")},a}(Wrapper);return __decorate([_defineHidden()],r.prototype,\"__nbindConstructor\",void 0),__decorate([_defineHidden()],r.prototype,\"__nbindValueConstructor\",void 0),__decorate([_defineHidden(t)],r.prototype,\"__nbindPolicies\",void 0),r}_nbind.makeBound=makeBound;function disableMember(t,e){function r(){throw new Error(\"Accessing deleted object\")}Object.defineProperty(t,e,{configurable:!1,enumerable:!1,get:r,set:r})}_nbind.ptrMarker={};var BindClass=function(t){__extends(e,t);function e(r){var s=t.call(this,r)||this;return s.wireRead=function(a){return _nbind.popValue(a,s.ptrType)},s.wireWrite=function(a){return pushPointer(a,s.ptrType,!0)},s.pendingSuperCount=0,s.ready=!1,s.methodTbl={},r.paramList?(s.classType=r.paramList[0].classType,s.proto=s.classType.proto):s.classType=s,s}return e.prototype.makeBound=function(r){var s=_nbind.makeBound(r,this);return this.proto=s,this.ptrType.proto=s,s},e.prototype.addMethod=function(r){var s=this.methodTbl[r.name]||[];s.push(r),this.methodTbl[r.name]=s},e.prototype.registerMethods=function(r,s){for(var a,n=0,c=Object.keys(r.methodTbl);n<c.length;n++)for(var f=c[n],p=r.methodTbl[f],h=0,E=p;h<E.length;h++){var C=E[h],S=void 0,P=void 0;if(S=this.proto.prototype,!(s&&C.signatureType!=1))switch(C.signatureType){case 1:S=this.proto;case 5:P=_nbind.makeCaller(C),_nbind.addMethod(S,C.name,P,C.typeList.length-1);break;case 4:a=_nbind.makeMethodCaller(r.ptrType,C);break;case 3:Object.defineProperty(S,C.name,{configurable:!0,enumerable:!1,get:_nbind.makeMethodCaller(r.ptrType,C),set:a});break;case 2:P=_nbind.makeMethodCaller(r.ptrType,C),_nbind.addMethod(S,C.name,P,C.typeList.length-1);break;default:break}}},e.prototype.registerSuperMethods=function(r,s,a){if(!a[r.name]){a[r.name]=!0;for(var n=0,c,f=0,p=r.superIdList||[];f<p.length;f++){var h=p[f],E=_nbind.getType(h);n++<s||s<0?c=-1:c=0,this.registerSuperMethods(E,c,a)}this.registerMethods(r,s<0)}},e.prototype.finish=function(){if(this.ready)return this;this.ready=!0,this.superList=(this.superIdList||[]).map(function(a){return _nbind.getType(a).finish()});var r=this.proto;if(this.superList.length){var s=function(){this.constructor=r};s.prototype=this.superList[0].proto.prototype,r.prototype=new s}return r!=Module&&(r.prototype.__nbindType=this),this.registerSuperMethods(this,1,{}),this},e.prototype.upcastStep=function(r,s){if(r==this)return s;for(var a=0;a<this.superList.length;++a){var n=this.superList[a].upcastStep(r,_nbind.callUpcast(this.upcastList[a],s));if(n)return n}return 0},e}(_nbind.BindType);BindClass.list=[],_nbind.BindClass=BindClass;function popPointer(t,e){return t?new e.proto(_nbind.ptrMarker,e.flags,t):null}_nbind.popPointer=popPointer;function pushPointer(t,e,r){if(!(t instanceof _nbind.Wrapper)){if(r)return _nbind.pushValue(t);throw new Error(\"Type mismatch\")}var s=t.__nbindPtr,a=t.__nbindType.classType,n=e.classType;if(t instanceof e.proto)for(;a!=n;)s=_nbind.callUpcast(a.upcastList[0],s),a=a.superList[0];else if(s=a.upcastStep(n,s),!s)throw new Error(\"Type mismatch\");return s}_nbind.pushPointer=pushPointer;function pushMutablePointer(t,e){var r=pushPointer(t,e);if(t.__nbindFlags&1)throw new Error(\"Passing a const value as a non-const argument\");return r}var BindClassPtr=function(t){__extends(e,t);function e(r){var s=t.call(this,r)||this;s.classType=r.paramList[0].classType,s.proto=s.classType.proto;var a=r.flags&1,n=(s.flags&896)==256&&r.flags&2,c=a?pushPointer:pushMutablePointer,f=n?_nbind.popValue:popPointer;return s.makeWireWrite=function(p,h){return h.Nullable?function(E){return E?c(E,s):0}:function(E){return c(E,s)}},s.wireRead=function(p){return f(p,s)},s.wireWrite=function(p){return c(p,s)},s}return e}(_nbind.BindType);_nbind.BindClassPtr=BindClassPtr;function popShared(t,e){var r=HEAPU32[t/4],s=HEAPU32[t/4+1];return s?new e.proto(_nbind.ptrMarker,e.flags,s,r):null}_nbind.popShared=popShared;function pushShared(t,e){if(!(t instanceof e.proto))throw new Error(\"Type mismatch\");return t.__nbindShared}function pushMutableShared(t,e){if(!(t instanceof e.proto))throw new Error(\"Type mismatch\");if(t.__nbindFlags&1)throw new Error(\"Passing a const value as a non-const argument\");return t.__nbindShared}var SharedClassPtr=function(t){__extends(e,t);function e(r){var s=t.call(this,r)||this;s.readResources=[_nbind.resources.pool],s.classType=r.paramList[0].classType,s.proto=s.classType.proto;var a=r.flags&1,n=a?pushShared:pushMutableShared;return s.wireRead=function(c){return popShared(c,s)},s.wireWrite=function(c){return n(c,s)},s}return e}(_nbind.BindType);_nbind.SharedClassPtr=SharedClassPtr,_nbind.externalList=[0];var firstFreeExternal=0,External=function(){function t(e){this.refCount=1,this.data=e}return t.prototype.register=function(){var e=firstFreeExternal;return e?firstFreeExternal=_nbind.externalList[e]:e=_nbind.externalList.length,_nbind.externalList[e]=this,e},t.prototype.reference=function(){++this.refCount},t.prototype.dereference=function(e){--this.refCount==0&&(this.free&&this.free(),_nbind.externalList[e]=firstFreeExternal,firstFreeExternal=e)},t}();_nbind.External=External;function popExternal(t){var e=_nbind.externalList[t];return e.dereference(t),e.data}function pushExternal(t){var e=new External(t);return e.reference(),e.register()}var ExternalType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=popExternal,r.wireWrite=pushExternal,r}return e}(_nbind.BindType);_nbind.ExternalType=ExternalType,_nbind.callbackSignatureList=[];var CallbackType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireWrite=function(s){return typeof s!=\"function\"&&_nbind.throwError(\"Type mismatch\"),new _nbind.External(s).register()},r}return e}(_nbind.BindType);_nbind.CallbackType=CallbackType,_nbind.valueList=[0];var firstFreeValue=0;function pushValue(t){var e=firstFreeValue;return e?firstFreeValue=_nbind.valueList[e]:e=_nbind.valueList.length,_nbind.valueList[e]=t,e*2+1}_nbind.pushValue=pushValue;function popValue(t,e){if(t||_nbind.throwError(\"Value type JavaScript class is missing or not registered\"),t&1){t>>=1;var r=_nbind.valueList[t];return _nbind.valueList[t]=firstFreeValue,firstFreeValue=t,r}else{if(e)return _nbind.popShared(t,e);throw new Error(\"Invalid value slot \"+t)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(t){return typeof t==\"number\"?t:pushValue(t)*4096+valueBase}function pop64(t){return t<valueBase?t:popValue((t-valueBase)/4096)}var CreateValueType=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.makeWireWrite=function(r){return\"(_nbind.pushValue(new \"+r+\"))\"},e}(_nbind.BindType);_nbind.CreateValueType=CreateValueType;var Int64Type=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireWrite=push64,r.wireRead=pop64,r}return e}(_nbind.BindType);_nbind.Int64Type=Int64Type;function pushArray(t,e){if(!t)return 0;var r=t.length;if((e.size||e.size===0)&&r<e.size)throw new Error(\"Type mismatch\");var s=e.memberType.ptrSize,a=_nbind.Pool.lalloc(4+r*s);HEAPU32[a/4]=r;var n=e.memberType.heap,c=(a+4)/s,f=e.memberType.wireWrite,p=0;if(f)for(;p<r;)n[c++]=f(t[p++]);else for(;p<r;)n[c++]=t[p++];return a}_nbind.pushArray=pushArray;function popArray(t,e){if(t===0)return null;var r=HEAPU32[t/4],s=new Array(r),a=e.memberType.heap;t=(t+4)/e.memberType.ptrSize;var n=e.memberType.wireRead,c=0;if(n)for(;c<r;)s[c++]=n(a[t++]);else for(;c<r;)s[c++]=a[t++];return s}_nbind.popArray=popArray;var ArrayType=function(t){__extends(e,t);function e(r){var s=t.call(this,r)||this;return s.wireRead=function(a){return popArray(a,s)},s.wireWrite=function(a){return pushArray(a,s)},s.readResources=[_nbind.resources.pool],s.writeResources=[_nbind.resources.pool],s.memberType=r.paramList[0],r.paramList[1]&&(s.size=r.paramList[1]),s}return e}(_nbind.BindType);_nbind.ArrayType=ArrayType;function pushString(t,e){if(t==null)if(e&&e.Nullable)t=\"\";else throw new Error(\"Type mismatch\");if(e&&e.Strict){if(typeof t!=\"string\")throw new Error(\"Type mismatch\")}else t=t.toString();var r=Module.lengthBytesUTF8(t),s=_nbind.Pool.lalloc(4+r+1);return HEAPU32[s/4]=r,Module.stringToUTF8Array(t,HEAPU8,s+4,r+1),s}_nbind.pushString=pushString;function popString(t){if(t===0)return null;var e=HEAPU32[t/4];return Module.Pointer_stringify(t+4,e)}_nbind.popString=popString;var StringType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=popString,r.wireWrite=pushString,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return e.prototype.makeWireWrite=function(r,s){return function(a){return pushString(a,s)}},e}(_nbind.BindType);_nbind.StringType=StringType;function makeArgList(t){return Array.apply(null,Array(t)).map(function(e,r){return\"a\"+(r+1)})}function anyNeedsWireWrite(t,e){return t.reduce(function(r,s){return r||s.needsWireWrite(e)},!1)}function anyNeedsWireRead(t,e){return t.reduce(function(r,s){return r||!!s.needsWireRead(e)},!1)}function makeWireRead(t,e,r,s){var a=t.length;return r.makeWireRead?r.makeWireRead(s,t,a):r.wireRead?(t[a]=r.wireRead,\"(convertParamList[\"+a+\"](\"+s+\"))\"):s}function makeWireWrite(t,e,r,s){var a,n=t.length;return r.makeWireWrite?a=r.makeWireWrite(s,e,t,n):a=r.wireWrite,a?typeof a==\"string\"?a:(t[n]=a,\"(convertParamList[\"+n+\"](\"+s+\"))\"):s}function buildCallerFunction(dynCall,ptrType,ptr,num,policyTbl,needsWireWrite,prefix,returnType,argTypeList,mask,err){var argList=makeArgList(argTypeList.length),convertParamList=[],callExpression=makeWireRead(convertParamList,policyTbl,returnType,\"dynCall(\"+[prefix].concat(argList.map(function(t,e){return makeWireWrite(convertParamList,policyTbl,argTypeList[e],t)})).join(\",\")+\")\"),resourceSet=_nbind.listResources([returnType],argTypeList),sourceCode=\"function(\"+argList.join(\",\")+\"){\"+(mask?\"this.__nbindFlags&mask&&err();\":\"\")+resourceSet.makeOpen()+\"var r=\"+callExpression+\";\"+resourceSet.makeClose()+\"return r;}\";return eval(\"(\"+sourceCode+\")\")}function buildJSCallerFunction(returnType,argTypeList){var argList=makeArgList(argTypeList.length),convertParamList=[],callExpression=makeWireWrite(convertParamList,null,returnType,\"_nbind.externalList[num].data(\"+argList.map(function(t,e){return makeWireRead(convertParamList,null,argTypeList[e],t)}).join(\",\")+\")\"),resourceSet=_nbind.listResources(argTypeList,[returnType]);resourceSet.remove(_nbind.resources.pool);var sourceCode=\"function(\"+[\"dummy\",\"num\"].concat(argList).join(\",\")+\"){\"+resourceSet.makeOpen()+\"var r=\"+callExpression+\";\"+resourceSet.makeClose()+\"return r;}\";return eval(\"(\"+sourceCode+\")\")}_nbind.buildJSCallerFunction=buildJSCallerFunction;function makeJSCaller(t){var e=t.length-1,r=_nbind.getTypes(t,\"callback\"),s=r[0],a=r.slice(1),n=anyNeedsWireRead(a,null),c=s.needsWireWrite(null);if(!c&&!n)switch(e){case 0:return function(f,p){return _nbind.externalList[p].data()};case 1:return function(f,p,h){return _nbind.externalList[p].data(h)};case 2:return function(f,p,h,E){return _nbind.externalList[p].data(h,E)};case 3:return function(f,p,h,E,C){return _nbind.externalList[p].data(h,E,C)};default:break}return buildJSCallerFunction(s,a)}_nbind.makeJSCaller=makeJSCaller;function makeMethodCaller(t,e){var r=e.typeList.length-1,s=e.typeList.slice(0);s.splice(1,0,\"uint32_t\",e.boundID);var a=_nbind.getTypes(s,e.title),n=a[0],c=a.slice(3),f=n.needsWireRead(e.policyTbl),p=anyNeedsWireWrite(c,e.policyTbl),h=e.ptr,E=e.num,C=_nbind.getDynCall(a,e.title),S=~e.flags&1;function P(){throw new Error(\"Calling a non-const method on a const object\")}if(!f&&!p)switch(r){case 0:return function(){return this.__nbindFlags&S?P():C(h,E,_nbind.pushPointer(this,t))};case 1:return function(I){return this.__nbindFlags&S?P():C(h,E,_nbind.pushPointer(this,t),I)};case 2:return function(I,R){return this.__nbindFlags&S?P():C(h,E,_nbind.pushPointer(this,t),I,R)};case 3:return function(I,R,N){return this.__nbindFlags&S?P():C(h,E,_nbind.pushPointer(this,t),I,R,N)};default:break}return buildCallerFunction(C,t,h,E,e.policyTbl,p,\"ptr,num,pushPointer(this,ptrType)\",n,c,S,P)}_nbind.makeMethodCaller=makeMethodCaller;function makeCaller(t){var e=t.typeList.length-1,r=_nbind.getTypes(t.typeList,t.title),s=r[0],a=r.slice(1),n=s.needsWireRead(t.policyTbl),c=anyNeedsWireWrite(a,t.policyTbl),f=t.direct,p=t.ptr;if(t.direct&&!n&&!c){var h=_nbind.getDynCall(r,t.title);switch(e){case 0:return function(){return h(f)};case 1:return function(P){return h(f,P)};case 2:return function(P,I){return h(f,P,I)};case 3:return function(P,I,R){return h(f,P,I,R)};default:break}p=0}var E;if(p){var C=t.typeList.slice(0);C.splice(1,0,\"uint32_t\"),r=_nbind.getTypes(C,t.title),E=\"ptr,num\"}else p=f,E=\"ptr\";var S=_nbind.getDynCall(r,t.title);return buildCallerFunction(S,null,p,t.num,t.policyTbl,c,E,s,a)}_nbind.makeCaller=makeCaller;function makeOverloader(t,e){var r=[];function s(){return r[arguments.length].apply(this,arguments)}return s.addMethod=function(a,n){r[n]=a},s.addMethod(t,e),s}_nbind.makeOverloader=makeOverloader;var Resource=function(){function t(e,r){var s=this;this.makeOpen=function(){return Object.keys(s.openTbl).join(\"\")},this.makeClose=function(){return Object.keys(s.closeTbl).join(\"\")},this.openTbl={},this.closeTbl={},e&&(this.openTbl[e]=!0),r&&(this.closeTbl[r]=!0)}return t.prototype.add=function(e){for(var r=0,s=Object.keys(e.openTbl);r<s.length;r++){var a=s[r];this.openTbl[a]=!0}for(var n=0,c=Object.keys(e.closeTbl);n<c.length;n++){var a=c[n];this.closeTbl[a]=!0}},t.prototype.remove=function(e){for(var r=0,s=Object.keys(e.openTbl);r<s.length;r++){var a=s[r];delete this.openTbl[a]}for(var n=0,c=Object.keys(e.closeTbl);n<c.length;n++){var a=c[n];delete this.closeTbl[a]}},t}();_nbind.Resource=Resource;function listResources(t,e){for(var r=new Resource,s=0,a=t;s<a.length;s++)for(var n=a[s],c=0,f=n.readResources||[];c<f.length;c++){var p=f[c];r.add(p)}for(var h=0,E=e;h<E.length;h++)for(var n=E[h],C=0,S=n.writeResources||[];C<S.length;C++){var p=S[C];r.add(p)}return r}_nbind.listResources=listResources,_nbind.resources={pool:new Resource(\"var used=HEAPU32[_nbind.Pool.usedPtr],page=HEAPU32[_nbind.Pool.pagePtr];\",\"_nbind.Pool.lreset(used,page);\")};var ExternalBuffer=function(t){__extends(e,t);function e(r,s){var a=t.call(this,r)||this;return a.ptr=s,a}return e.prototype.free=function(){_free(this.ptr)},e}(_nbind.External);function getBuffer(t){return t instanceof ArrayBuffer?new Uint8Array(t):t instanceof DataView?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):t}function pushBuffer(t,e){if(t==null&&e&&e.Nullable&&(t=[]),typeof t!=\"object\")throw new Error(\"Type mismatch\");var r=t,s=r.byteLength||r.length;if(!s&&s!==0&&r.byteLength!==0)throw new Error(\"Type mismatch\");var a=_nbind.Pool.lalloc(8),n=_malloc(s),c=a/4;return HEAPU32[c++]=s,HEAPU32[c++]=n,HEAPU32[c++]=new ExternalBuffer(t,n).register(),HEAPU8.set(getBuffer(t),n),a}var BufferType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireWrite=pushBuffer,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return e.prototype.makeWireWrite=function(r,s){return function(a){return pushBuffer(a,s)}},e}(_nbind.BindType);_nbind.BufferType=BufferType;function commitBuffer(t,e,r){var s=_nbind.externalList[t].data,a=Buffer;if(typeof Buffer!=\"function\"&&(a=function(){}),!(s instanceof Array)){var n=HEAPU8.subarray(e,e+r);if(s instanceof a){var c=void 0;typeof Buffer.from==\"function\"&&Buffer.from.length>=3?c=Buffer.from(n):c=new Buffer(n),c.copy(s)}else getBuffer(s).set(n)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var t=0,e=dirtyList;t<e.length;t++){var r=e[t];r.__nbindState&3||r.free()}dirtyList=[],gcTimer=0}_nbind.mark=function(t){};function toggleLightGC(t){t?_nbind.mark=function(e){dirtyList.push(e),gcTimer||(gcTimer=setTimeout(sweep,0))}:_nbind.mark=function(e){}}_nbind.toggleLightGC=toggleLightGC}(_nbind),Module.requestFullScreen=function t(e,r,s){Module.printErr(\"Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead.\"),Module.requestFullScreen=Module.requestFullscreen,Browser.requestFullScreen(e,r,s)},Module.requestFullscreen=function t(e,r,s){Browser.requestFullscreen(e,r,s)},Module.requestAnimationFrame=function t(e){Browser.requestAnimationFrame(e)},Module.setCanvasSize=function t(e,r,s){Browser.setCanvasSize(e,r,s)},Module.pauseMainLoop=function t(){Browser.mainLoop.pause()},Module.resumeMainLoop=function t(){Browser.mainLoop.resume()},Module.getUserMedia=function t(){Browser.getUserMedia()},Module.createContext=function t(e,r,s,a){return Browser.createContext(e,r,s,a)},ENVIRONMENT_IS_NODE?_emscripten_get_now=function(){var e=process.hrtime();return e[0]*1e3+e[1]/1e6}:typeof dateNow<\"u\"?_emscripten_get_now=dateNow:typeof self==\"object\"&&self.performance&&typeof self.performance.now==\"function\"?_emscripten_get_now=function(){return self.performance.now()}:typeof performance==\"object\"&&typeof performance.now==\"function\"?_emscripten_get_now=function(){return performance.now()}:_emscripten_get_now=Date.now,__ATEXIT__.push(function(){var t=Module._fflush;t&&t(0);var e=___syscall146.printChar;if(e){var r=___syscall146.buffers;r[1].length&&e(1,10),r[2].length&&e(2,10)}}),DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC),STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP),STACK_MAX=STACK_BASE+TOTAL_STACK,DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX),HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(t,e,r,s,a,n){try{Module.dynCall_viiiii(t,e,r,s,a,n)}catch(c){if(typeof c!=\"number\"&&c!==\"longjmp\")throw c;Module.setThrew(1,0)}}function invoke_vif(t,e,r){try{Module.dynCall_vif(t,e,r)}catch(s){if(typeof s!=\"number\"&&s!==\"longjmp\")throw s;Module.setThrew(1,0)}}function invoke_vid(t,e,r){try{Module.dynCall_vid(t,e,r)}catch(s){if(typeof s!=\"number\"&&s!==\"longjmp\")throw s;Module.setThrew(1,0)}}function invoke_fiff(t,e,r,s){try{return Module.dynCall_fiff(t,e,r,s)}catch(a){if(typeof a!=\"number\"&&a!==\"longjmp\")throw a;Module.setThrew(1,0)}}function invoke_vi(t,e){try{Module.dynCall_vi(t,e)}catch(r){if(typeof r!=\"number\"&&r!==\"longjmp\")throw r;Module.setThrew(1,0)}}function invoke_vii(t,e,r){try{Module.dynCall_vii(t,e,r)}catch(s){if(typeof s!=\"number\"&&s!==\"longjmp\")throw s;Module.setThrew(1,0)}}function invoke_ii(t,e){try{return Module.dynCall_ii(t,e)}catch(r){if(typeof r!=\"number\"&&r!==\"longjmp\")throw r;Module.setThrew(1,0)}}function invoke_viddi(t,e,r,s,a){try{Module.dynCall_viddi(t,e,r,s,a)}catch(n){if(typeof n!=\"number\"&&n!==\"longjmp\")throw n;Module.setThrew(1,0)}}function invoke_vidd(t,e,r,s){try{Module.dynCall_vidd(t,e,r,s)}catch(a){if(typeof a!=\"number\"&&a!==\"longjmp\")throw a;Module.setThrew(1,0)}}function invoke_iiii(t,e,r,s){try{return Module.dynCall_iiii(t,e,r,s)}catch(a){if(typeof a!=\"number\"&&a!==\"longjmp\")throw a;Module.setThrew(1,0)}}function invoke_diii(t,e,r,s){try{return Module.dynCall_diii(t,e,r,s)}catch(a){if(typeof a!=\"number\"&&a!==\"longjmp\")throw a;Module.setThrew(1,0)}}function invoke_di(t,e){try{return Module.dynCall_di(t,e)}catch(r){if(typeof r!=\"number\"&&r!==\"longjmp\")throw r;Module.setThrew(1,0)}}function invoke_iid(t,e,r){try{return Module.dynCall_iid(t,e,r)}catch(s){if(typeof s!=\"number\"&&s!==\"longjmp\")throw s;Module.setThrew(1,0)}}function invoke_iii(t,e,r){try{return Module.dynCall_iii(t,e,r)}catch(s){if(typeof s!=\"number\"&&s!==\"longjmp\")throw s;Module.setThrew(1,0)}}function invoke_viiddi(t,e,r,s,a,n){try{Module.dynCall_viiddi(t,e,r,s,a,n)}catch(c){if(typeof c!=\"number\"&&c!==\"longjmp\")throw c;Module.setThrew(1,0)}}function invoke_viiiiii(t,e,r,s,a,n,c){try{Module.dynCall_viiiiii(t,e,r,s,a,n,c)}catch(f){if(typeof f!=\"number\"&&f!==\"longjmp\")throw f;Module.setThrew(1,0)}}function invoke_dii(t,e,r){try{return Module.dynCall_dii(t,e,r)}catch(s){if(typeof s!=\"number\"&&s!==\"longjmp\")throw s;Module.setThrew(1,0)}}function invoke_i(t){try{return Module.dynCall_i(t)}catch(e){if(typeof e!=\"number\"&&e!==\"longjmp\")throw e;Module.setThrew(1,0)}}function invoke_iiiiii(t,e,r,s,a,n){try{return Module.dynCall_iiiiii(t,e,r,s,a,n)}catch(c){if(typeof c!=\"number\"&&c!==\"longjmp\")throw c;Module.setThrew(1,0)}}function invoke_viiid(t,e,r,s,a){try{Module.dynCall_viiid(t,e,r,s,a)}catch(n){if(typeof n!=\"number\"&&n!==\"longjmp\")throw n;Module.setThrew(1,0)}}function invoke_viififi(t,e,r,s,a,n,c){try{Module.dynCall_viififi(t,e,r,s,a,n,c)}catch(f){if(typeof f!=\"number\"&&f!==\"longjmp\")throw f;Module.setThrew(1,0)}}function invoke_viii(t,e,r,s){try{Module.dynCall_viii(t,e,r,s)}catch(a){if(typeof a!=\"number\"&&a!==\"longjmp\")throw a;Module.setThrew(1,0)}}function invoke_v(t){try{Module.dynCall_v(t)}catch(e){if(typeof e!=\"number\"&&e!==\"longjmp\")throw e;Module.setThrew(1,0)}}function invoke_viid(t,e,r,s){try{Module.dynCall_viid(t,e,r,s)}catch(a){if(typeof a!=\"number\"&&a!==\"longjmp\")throw a;Module.setThrew(1,0)}}function invoke_idd(t,e,r){try{return Module.dynCall_idd(t,e,r)}catch(s){if(typeof s!=\"number\"&&s!==\"longjmp\")throw s;Module.setThrew(1,0)}}function invoke_viiii(t,e,r,s,a){try{Module.dynCall_viiii(t,e,r,s,a)}catch(n){if(typeof n!=\"number\"&&n!==\"longjmp\")throw n;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:1/0},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(t,e,r){var s=new t.Int8Array(r),a=new t.Int16Array(r),n=new t.Int32Array(r),c=new t.Uint8Array(r),f=new t.Uint16Array(r),p=new t.Uint32Array(r),h=new t.Float32Array(r),E=new t.Float64Array(r),C=e.DYNAMICTOP_PTR|0,S=e.tempDoublePtr|0,P=e.ABORT|0,I=e.STACKTOP|0,R=e.STACK_MAX|0,N=e.cttz_i8|0,U=e.___dso_handle|0,W=0,ee=0,ie=0,ue=0,le=t.NaN,me=t.Infinity,pe=0,Be=0,Ce=0,g=0,we=0,ye=0,Ae=t.Math.floor,se=t.Math.abs,Z=t.Math.sqrt,De=t.Math.pow,Re=t.Math.cos,mt=t.Math.sin,j=t.Math.tan,rt=t.Math.acos,Fe=t.Math.asin,Ne=t.Math.atan,Pe=t.Math.atan2,Ve=t.Math.exp,ke=t.Math.log,it=t.Math.ceil,Ue=t.Math.imul,x=t.Math.min,w=t.Math.max,b=t.Math.clz32,y=t.Math.fround,F=e.abort,z=e.assert,X=e.enlargeMemory,$=e.getTotalMemory,oe=e.abortOnCannotGrowMemory,xe=e.invoke_viiiii,Te=e.invoke_vif,lt=e.invoke_vid,Ct=e.invoke_fiff,qt=e.invoke_vi,ir=e.invoke_vii,Pt=e.invoke_ii,gn=e.invoke_viddi,Pr=e.invoke_vidd,Ir=e.invoke_iiii,Or=e.invoke_diii,on=e.invoke_di,ai=e.invoke_iid,Io=e.invoke_iii,rs=e.invoke_viiddi,$s=e.invoke_viiiiii,Co=e.invoke_dii,ji=e.invoke_i,eo=e.invoke_iiiiii,wo=e.invoke_viiid,QA=e.invoke_viififi,Af=e.invoke_viii,dh=e.invoke_v,mh=e.invoke_viid,to=e.invoke_idd,jn=e.invoke_viiii,Ts=e._emscripten_asm_const_iiiii,ro=e._emscripten_asm_const_iiidddddd,ou=e._emscripten_asm_const_iiiid,au=e.__nbind_reference_external,lu=e._emscripten_asm_const_iiiiiiii,TA=e._removeAccessorPrefix,RA=e._typeModule,oa=e.__nbind_register_pool,aa=e.__decorate,FA=e._llvm_stackrestore,gr=e.___cxa_atexit,Bo=e.__extends,Me=e.__nbind_get_value_object,cu=e.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,Cr=e._emscripten_set_main_loop_timing,pf=e.__nbind_register_primitive,NA=e.__nbind_register_type,OA=e._emscripten_memcpy_big,uu=e.__nbind_register_function,fu=e.___setErrNo,oc=e.__nbind_register_class,ve=e.__nbind_finish,Nt=e._abort,ac=e._nbind_value,Oi=e._llvm_stacksave,no=e.___syscall54,Rt=e._defineHidden,xn=e._emscripten_set_main_loop,la=e._emscripten_get_now,Gi=e.__nbind_register_callback_signature,Li=e._emscripten_asm_const_iiiiii,Na=e.__nbind_free_external,dn=e._emscripten_asm_const_iiii,Kn=e._emscripten_asm_const_iiididi,Au=e.___syscall6,yh=e._atexit,Oa=e.___syscall140,La=e.___syscall146,Ma=y(0);let $e=y(0);function Ua(o){o=o|0;var l=0;return l=I,I=I+o|0,I=I+15&-16,l|0}function hf(){return I|0}function lc(o){o=o|0,I=o}function wn(o,l){o=o|0,l=l|0,I=o,R=l}function ca(o,l){o=o|0,l=l|0,W||(W=o,ee=l)}function LA(o){o=o|0,ye=o}function MA(){return ye|0}function ua(){var o=0,l=0;Qr(8104,8,400)|0,Qr(8504,408,540)|0,o=9044,l=o+44|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));s[9088]=0,s[9089]=1,n[2273]=0,n[2274]=948,n[2275]=948,gr(17,8104,U|0)|0}function Bl(o){o=o|0,dt(o+948|0)}function Mt(o){return o=y(o),((fP(o)|0)&2147483647)>>>0>2139095040|0}function kn(o,l,u){o=o|0,l=l|0,u=u|0;e:do if(n[o+(l<<3)+4>>2]|0)o=o+(l<<3)|0;else{if((l|2|0)==3&&n[o+60>>2]|0){o=o+56|0;break}switch(l|0){case 0:case 2:case 4:case 5:{if(n[o+52>>2]|0){o=o+48|0;break e}break}default:}if(n[o+68>>2]|0){o=o+64|0;break}else{o=(l|1|0)==5?948:u;break}}while(!1);return o|0}function fa(o){o=o|0;var l=0;return l=_P(1e3)|0,Ha(o,(l|0)!=0,2456),n[2276]=(n[2276]|0)+1,Qr(l|0,8104,1e3)|0,s[o+2>>0]|0&&(n[l+4>>2]=2,n[l+12>>2]=4),n[l+976>>2]=o,l|0}function Ha(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;d=I,I=I+16|0,A=d,l||(n[A>>2]=u,Wg(o,5,3197,A)),I=d}function ns(){return fa(956)|0}function cc(o){o=o|0;var l=0;return l=Kt(1e3)|0,pu(l,o),Ha(n[o+976>>2]|0,1,2456),n[2276]=(n[2276]|0)+1,n[l+944>>2]=0,l|0}function pu(o,l){o=o|0,l=l|0;var u=0;Qr(o|0,l|0,948)|0,Dy(o+948|0,l+948|0),u=o+960|0,o=l+960|0,l=u+40|0;do n[u>>2]=n[o>>2],u=u+4|0,o=o+4|0;while((u|0)<(l|0))}function uc(o){o=o|0;var l=0,u=0,A=0,d=0;if(l=o+944|0,u=n[l>>2]|0,u|0&&(ja(u+948|0,o)|0,n[l>>2]=0),u=Mi(o)|0,u|0){l=0;do n[(Is(o,l)|0)+944>>2]=0,l=l+1|0;while((l|0)!=(u|0))}u=o+948|0,A=n[u>>2]|0,d=o+952|0,l=n[d>>2]|0,(l|0)!=(A|0)&&(n[d>>2]=l+(~((l+-4-A|0)>>>2)<<2)),vl(u),HP(o),n[2276]=(n[2276]|0)+-1}function ja(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0;A=n[o>>2]|0,k=o+4|0,u=n[k>>2]|0,m=u;e:do if((A|0)==(u|0))d=A,B=4;else for(o=A;;){if((n[o>>2]|0)==(l|0)){d=o,B=4;break e}if(o=o+4|0,(o|0)==(u|0)){o=0;break}}while(!1);return(B|0)==4&&((d|0)!=(u|0)?(A=d+4|0,o=m-A|0,l=o>>2,l&&(Q2(d|0,A|0,o|0)|0,u=n[k>>2]|0),o=d+(l<<2)|0,(u|0)==(o|0)||(n[k>>2]=u+(~((u+-4-o|0)>>>2)<<2)),o=1):o=0),o|0}function Mi(o){return o=o|0,(n[o+952>>2]|0)-(n[o+948>>2]|0)>>2|0}function Is(o,l){o=o|0,l=l|0;var u=0;return u=n[o+948>>2]|0,(n[o+952>>2]|0)-u>>2>>>0>l>>>0?o=n[u+(l<<2)>>2]|0:o=0,o|0}function vl(o){o=o|0;var l=0,u=0,A=0,d=0;A=I,I=I+32|0,l=A,d=n[o>>2]|0,u=(n[o+4>>2]|0)-d|0,((n[o+8>>2]|0)-d|0)>>>0>u>>>0&&(d=u>>2,ky(l,d,d,o+8|0),AP(o,l),Qy(l)),I=A}function gf(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0;M=Mi(o)|0;do if(M|0){if((n[(Is(o,0)|0)+944>>2]|0)==(o|0)){if(!(ja(o+948|0,l)|0))break;Qr(l+400|0,8504,540)|0,n[l+944>>2]=0,Oe(o);break}B=n[(n[o+976>>2]|0)+12>>2]|0,k=o+948|0,T=(B|0)==0,u=0,m=0;do A=n[(n[k>>2]|0)+(m<<2)>>2]|0,(A|0)==(l|0)?Oe(o):(d=cc(A)|0,n[(n[k>>2]|0)+(u<<2)>>2]=d,n[d+944>>2]=o,T||dU[B&15](A,d,o,u),u=u+1|0),m=m+1|0;while((m|0)!=(M|0));if(u>>>0<M>>>0){T=o+948|0,k=o+952|0,B=u,u=n[k>>2]|0;do m=(n[T>>2]|0)+(B<<2)|0,A=m+4|0,d=u-A|0,l=d>>2,l&&(Q2(m|0,A|0,d|0)|0,u=n[k>>2]|0),d=u,A=m+(l<<2)|0,(d|0)!=(A|0)&&(u=d+(~((d+-4-A|0)>>>2)<<2)|0,n[k>>2]=u),B=B+1|0;while((B|0)!=(M|0))}}while(!1)}function fc(o){o=o|0;var l=0,u=0,A=0,d=0;wi(o,(Mi(o)|0)==0,2491),wi(o,(n[o+944>>2]|0)==0,2545),l=o+948|0,u=n[l>>2]|0,A=o+952|0,d=n[A>>2]|0,(d|0)!=(u|0)&&(n[A>>2]=d+(~((d+-4-u|0)>>>2)<<2)),vl(l),l=o+976|0,u=n[l>>2]|0,Qr(o|0,8104,1e3)|0,s[u+2>>0]|0&&(n[o+4>>2]=2,n[o+12>>2]=4),n[l>>2]=u}function wi(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;d=I,I=I+16|0,A=d,l||(n[A>>2]=u,xo(o,5,3197,A)),I=d}function Qn(){return n[2276]|0}function Ac(){var o=0;return o=_P(20)|0,Ke((o|0)!=0,2592),n[2277]=(n[2277]|0)+1,n[o>>2]=n[239],n[o+4>>2]=n[240],n[o+8>>2]=n[241],n[o+12>>2]=n[242],n[o+16>>2]=n[243],o|0}function Ke(o,l){o=o|0,l=l|0;var u=0,A=0;A=I,I=I+16|0,u=A,o||(n[u>>2]=l,xo(0,5,3197,u)),I=A}function st(o){o=o|0,HP(o),n[2277]=(n[2277]|0)+-1}function St(o,l){o=o|0,l=l|0;var u=0;l?(wi(o,(Mi(o)|0)==0,2629),u=1):(u=0,l=0),n[o+964>>2]=l,n[o+988>>2]=u}function lr(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,m=A+8|0,d=A+4|0,B=A,n[d>>2]=l,wi(o,(n[l+944>>2]|0)==0,2709),wi(o,(n[o+964>>2]|0)==0,2763),te(o),l=o+948|0,n[B>>2]=(n[l>>2]|0)+(u<<2),n[m>>2]=n[B>>2],Ee(l,m,d)|0,n[(n[d>>2]|0)+944>>2]=o,Oe(o),I=A}function te(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0;if(u=Mi(o)|0,u|0&&(n[(Is(o,0)|0)+944>>2]|0)!=(o|0)){A=n[(n[o+976>>2]|0)+12>>2]|0,d=o+948|0,m=(A|0)==0,l=0;do B=n[(n[d>>2]|0)+(l<<2)>>2]|0,k=cc(B)|0,n[(n[d>>2]|0)+(l<<2)>>2]=k,n[k+944>>2]=o,m||dU[A&15](B,k,o,l),l=l+1|0;while((l|0)!=(u|0))}}function Ee(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0,tt=0,Ze=0;tt=I,I=I+64|0,q=tt+52|0,k=tt+48|0,ae=tt+28|0,Ye=tt+24|0,Le=tt+20|0,Qe=tt,A=n[o>>2]|0,m=A,l=A+((n[l>>2]|0)-m>>2<<2)|0,A=o+4|0,d=n[A>>2]|0,B=o+8|0;do if(d>>>0<(n[B>>2]|0)>>>0){if((l|0)==(d|0)){n[l>>2]=n[u>>2],n[A>>2]=(n[A>>2]|0)+4;break}pP(o,l,d,l+4|0),l>>>0<=u>>>0&&(u=(n[A>>2]|0)>>>0>u>>>0?u+4|0:u),n[l>>2]=n[u>>2]}else{A=(d-m>>2)+1|0,d=O(o)|0,d>>>0<A>>>0&&an(o),L=n[o>>2]|0,M=(n[B>>2]|0)-L|0,m=M>>1,ky(Qe,M>>2>>>0<d>>>1>>>0?m>>>0<A>>>0?A:m:d,l-L>>2,o+8|0),L=Qe+8|0,A=n[L>>2]|0,m=Qe+12|0,M=n[m>>2]|0,B=M,T=A;do if((A|0)==(M|0)){if(M=Qe+4|0,A=n[M>>2]|0,Ze=n[Qe>>2]|0,d=Ze,A>>>0<=Ze>>>0){A=B-d>>1,A=A|0?A:1,ky(ae,A,A>>>2,n[Qe+16>>2]|0),n[Ye>>2]=n[M>>2],n[Le>>2]=n[L>>2],n[k>>2]=n[Ye>>2],n[q>>2]=n[Le>>2],o2(ae,k,q),A=n[Qe>>2]|0,n[Qe>>2]=n[ae>>2],n[ae>>2]=A,A=ae+4|0,Ze=n[M>>2]|0,n[M>>2]=n[A>>2],n[A>>2]=Ze,A=ae+8|0,Ze=n[L>>2]|0,n[L>>2]=n[A>>2],n[A>>2]=Ze,A=ae+12|0,Ze=n[m>>2]|0,n[m>>2]=n[A>>2],n[A>>2]=Ze,Qy(ae),A=n[L>>2]|0;break}m=A,B=((m-d>>2)+1|0)/-2|0,k=A+(B<<2)|0,d=T-m|0,m=d>>2,m&&(Q2(k|0,A|0,d|0)|0,A=n[M>>2]|0),Ze=k+(m<<2)|0,n[L>>2]=Ze,n[M>>2]=A+(B<<2),A=Ze}while(!1);n[A>>2]=n[u>>2],n[L>>2]=(n[L>>2]|0)+4,l=hP(o,Qe,l)|0,Qy(Qe)}while(!1);return I=tt,l|0}function Oe(o){o=o|0;var l=0;do{if(l=o+984|0,s[l>>0]|0)break;s[l>>0]=1,h[o+504>>2]=y(le),o=n[o+944>>2]|0}while(o|0)}function dt(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-4-A|0)>>>2)<<2)),It(u))}function Et(o){return o=o|0,n[o+944>>2]|0}function bt(o){o=o|0,wi(o,(n[o+964>>2]|0)!=0,2832),Oe(o)}function tr(o){return o=o|0,(s[o+984>>0]|0)!=0|0}function An(o,l){o=o|0,l=l|0,l6e(o,l,400)|0&&(Qr(o|0,l|0,400)|0,Oe(o))}function li(o){o=o|0;var l=$e;return l=y(h[o+44>>2]),o=Mt(l)|0,y(o?y(0):l)}function qi(o){o=o|0;var l=$e;return l=y(h[o+48>>2]),Mt(l)|0&&(l=s[(n[o+976>>2]|0)+2>>0]|0?y(1):y(0)),y(l)}function Tn(o,l){o=o|0,l=l|0,n[o+980>>2]=l}function Ga(o){return o=o|0,n[o+980>>2]|0}function my(o,l){o=o|0,l=l|0;var u=0;u=o+4|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Z1(o){return o=o|0,n[o+4>>2]|0}function vo(o,l){o=o|0,l=l|0;var u=0;u=o+8|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function yy(o){return o=o|0,n[o+8>>2]|0}function Eh(o,l){o=o|0,l=l|0;var u=0;u=o+12|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function $1(o){return o=o|0,n[o+12>>2]|0}function So(o,l){o=o|0,l=l|0;var u=0;u=o+16|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Ih(o){return o=o|0,n[o+16>>2]|0}function Ch(o,l){o=o|0,l=l|0;var u=0;u=o+20|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function hu(o){return o=o|0,n[o+20>>2]|0}function wh(o,l){o=o|0,l=l|0;var u=0;u=o+24|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Fg(o){return o=o|0,n[o+24>>2]|0}function Ng(o,l){o=o|0,l=l|0;var u=0;u=o+28|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Og(o){return o=o|0,n[o+28>>2]|0}function Ey(o,l){o=o|0,l=l|0;var u=0;u=o+32|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function df(o){return o=o|0,n[o+32>>2]|0}function Do(o,l){o=o|0,l=l|0;var u=0;u=o+36|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Sl(o){return o=o|0,n[o+36>>2]|0}function Bh(o,l){o=o|0,l=y(l);var u=0;u=o+40|0,y(h[u>>2])!=l&&(h[u>>2]=l,Oe(o))}function Lg(o,l){o=o|0,l=y(l);var u=0;u=o+44|0,y(h[u>>2])!=l&&(h[u>>2]=l,Oe(o))}function Dl(o,l){o=o|0,l=y(l);var u=0;u=o+48|0,y(h[u>>2])!=l&&(h[u>>2]=l,Oe(o))}function bl(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+52|0,d=o+56|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function Iy(o,l){o=o|0,l=y(l);var u=0,A=0;A=o+52|0,u=o+56|0,y(h[A>>2])==l&&(n[u>>2]|0)==2||(h[A>>2]=l,A=Mt(l)|0,n[u>>2]=A?3:2,Oe(o))}function UA(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+52|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function Cy(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=(m^1)&1,d=o+132+(l<<3)|0,l=o+132+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function wy(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=m?0:2,d=o+132+(l<<3)|0,l=o+132+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function _A(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=l+132+(u<<3)|0,l=n[A+4>>2]|0,u=o,n[u>>2]=n[A>>2],n[u+4>>2]=l}function HA(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=(m^1)&1,d=o+60+(l<<3)|0,l=o+60+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function Y(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=m?0:2,d=o+60+(l<<3)|0,l=o+60+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function xt(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=l+60+(u<<3)|0,l=n[A+4>>2]|0,u=o,n[u>>2]=n[A>>2],n[u+4>>2]=l}function jA(o,l){o=o|0,l=l|0;var u=0;u=o+60+(l<<3)+4|0,(n[u>>2]|0)!=3&&(h[o+60+(l<<3)>>2]=y(le),n[u>>2]=3,Oe(o))}function bo(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=(m^1)&1,d=o+204+(l<<3)|0,l=o+204+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function mf(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=m?0:2,d=o+204+(l<<3)|0,l=o+204+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function yt(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=l+204+(u<<3)|0,l=n[A+4>>2]|0,u=o,n[u>>2]=n[A>>2],n[u+4>>2]=l}function gu(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=(m^1)&1,d=o+276+(l<<3)|0,l=o+276+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function By(o,l){return o=o|0,l=l|0,y(h[o+276+(l<<3)>>2])}function Mg(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+348|0,d=o+352|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function e2(o,l){o=o|0,l=y(l);var u=0,A=0;A=o+348|0,u=o+352|0,y(h[A>>2])==l&&(n[u>>2]|0)==2||(h[A>>2]=l,A=Mt(l)|0,n[u>>2]=A?3:2,Oe(o))}function vh(o){o=o|0;var l=0;l=o+352|0,(n[l>>2]|0)!=3&&(h[o+348>>2]=y(le),n[l>>2]=3,Oe(o))}function ur(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+348|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function zi(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+356|0,d=o+360|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function yf(o,l){o=o|0,l=y(l);var u=0,A=0;A=o+356|0,u=o+360|0,y(h[A>>2])==l&&(n[u>>2]|0)==2||(h[A>>2]=l,A=Mt(l)|0,n[u>>2]=A?3:2,Oe(o))}function qa(o){o=o|0;var l=0;l=o+360|0,(n[l>>2]|0)!=3&&(h[o+356>>2]=y(le),n[l>>2]=3,Oe(o))}function Ug(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+356|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function du(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+364|0,d=o+368|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function Ef(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=m?0:2,A=o+364|0,d=o+368|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function wt(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+364|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function di(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+372|0,d=o+376|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function GA(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=m?0:2,A=o+372|0,d=o+376|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function Wa(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+372|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function Aa(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+380|0,d=o+384|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function Ya(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=m?0:2,A=o+380|0,d=o+384|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function _g(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+380|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function Sh(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+388|0,d=o+392|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function Hg(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=m?0:2,A=o+388|0,d=o+392|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function vy(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+388|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function qA(o,l){o=o|0,l=y(l);var u=0;u=o+396|0,y(h[u>>2])!=l&&(h[u>>2]=l,Oe(o))}function jg(o){return o=o|0,y(h[o+396>>2])}function mu(o){return o=o|0,y(h[o+400>>2])}function yu(o){return o=o|0,y(h[o+404>>2])}function If(o){return o=o|0,y(h[o+408>>2])}function Rs(o){return o=o|0,y(h[o+412>>2])}function Eu(o){return o=o|0,y(h[o+416>>2])}function Gn(o){return o=o|0,y(h[o+420>>2])}function is(o,l){switch(o=o|0,l=l|0,wi(o,(l|0)<6,2918),l|0){case 0:{l=(n[o+496>>2]|0)==2?5:4;break}case 2:{l=(n[o+496>>2]|0)==2?4:5;break}default:}return y(h[o+424+(l<<2)>>2])}function Pi(o,l){switch(o=o|0,l=l|0,wi(o,(l|0)<6,2918),l|0){case 0:{l=(n[o+496>>2]|0)==2?5:4;break}case 2:{l=(n[o+496>>2]|0)==2?4:5;break}default:}return y(h[o+448+(l<<2)>>2])}function WA(o,l){switch(o=o|0,l=l|0,wi(o,(l|0)<6,2918),l|0){case 0:{l=(n[o+496>>2]|0)==2?5:4;break}case 2:{l=(n[o+496>>2]|0)==2?4:5;break}default:}return y(h[o+472+(l<<2)>>2])}function Cf(o,l){o=o|0,l=l|0;var u=0,A=$e;return u=n[o+4>>2]|0,(u|0)==(n[l+4>>2]|0)?u?(A=y(h[o>>2]),o=y(se(y(A-y(h[l>>2]))))<y(999999974e-13)):o=1:o=0,o|0}function mn(o,l){o=y(o),l=y(l);var u=0;return Mt(o)|0?u=Mt(l)|0:u=y(se(y(o-l)))<y(999999974e-13),u|0}function Gg(o,l){o=o|0,l=l|0,qg(o,l)}function qg(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u+4|0,n[A>>2]=0,n[A+4>>2]=0,n[A+8>>2]=0,cu(A|0,o|0,l|0,0),xo(o,3,(s[A+11>>0]|0)<0?n[A>>2]|0:A,u),Q6e(A),I=u}function ss(o,l,u,A){o=y(o),l=y(l),u=u|0,A=A|0;var d=$e;o=y(o*l),d=y(uU(o,y(1)));do if(mn(d,y(0))|0)o=y(o-d);else{if(o=y(o-d),mn(d,y(1))|0){o=y(o+y(1));break}if(u){o=y(o+y(1));break}A||(d>y(.5)?d=y(1):(A=mn(d,y(.5))|0,d=y(A?1:0)),o=y(o+d))}while(!1);return y(o/l)}function Pl(o,l,u,A,d,m,B,k,T,M,L,q,ae){o=o|0,l=y(l),u=u|0,A=y(A),d=d|0,m=y(m),B=B|0,k=y(k),T=y(T),M=y(M),L=y(L),q=y(q),ae=ae|0;var Ye=0,Le=$e,Qe=$e,tt=$e,Ze=$e,ct=$e,He=$e;return T<y(0)|M<y(0)?ae=0:(ae|0&&(Le=y(h[ae+4>>2]),Le!=y(0))?(tt=y(ss(l,Le,0,0)),Ze=y(ss(A,Le,0,0)),Qe=y(ss(m,Le,0,0)),Le=y(ss(k,Le,0,0))):(Qe=m,tt=l,Le=k,Ze=A),(d|0)==(o|0)?Ye=mn(Qe,tt)|0:Ye=0,(B|0)==(u|0)?ae=mn(Le,Ze)|0:ae=0,!Ye&&(ct=y(l-L),!(Po(o,ct,T)|0))&&!(wf(o,ct,d,T)|0)?Ye=Bf(o,ct,d,m,T)|0:Ye=1,!ae&&(He=y(A-q),!(Po(u,He,M)|0))&&!(wf(u,He,B,M)|0)?ae=Bf(u,He,B,k,M)|0:ae=1,ae=Ye&ae),ae|0}function Po(o,l,u){return o=o|0,l=y(l),u=y(u),(o|0)==1?o=mn(l,u)|0:o=0,o|0}function wf(o,l,u,A){return o=o|0,l=y(l),u=u|0,A=y(A),(o|0)==2&(u|0)==0?l>=A?o=1:o=mn(l,A)|0:o=0,o|0}function Bf(o,l,u,A,d){return o=o|0,l=y(l),u=u|0,A=y(A),d=y(d),(o|0)==2&(u|0)==2&A>l?d<=l?o=1:o=mn(l,d)|0:o=0,o|0}function xl(o,l,u,A,d,m,B,k,T,M,L){o=o|0,l=y(l),u=y(u),A=A|0,d=d|0,m=m|0,B=y(B),k=y(k),T=T|0,M=M|0,L=L|0;var q=0,ae=0,Ye=0,Le=0,Qe=$e,tt=$e,Ze=0,ct=0,He=0,We=0,Lt=0,Gr=0,fr=0,$t=0,Tr=0,Hr=0,cr=0,Hn=$e,To=$e,Ro=$e,Fo=0,Za=0;cr=I,I=I+160|0,$t=cr+152|0,fr=cr+120|0,Gr=cr+104|0,He=cr+72|0,Le=cr+56|0,Lt=cr+8|0,ct=cr,We=(n[2279]|0)+1|0,n[2279]=We,Tr=o+984|0,s[Tr>>0]|0&&(n[o+512>>2]|0)!=(n[2278]|0)?Ze=4:(n[o+516>>2]|0)==(A|0)?Hr=0:Ze=4,(Ze|0)==4&&(n[o+520>>2]=0,n[o+924>>2]=-1,n[o+928>>2]=-1,h[o+932>>2]=y(-1),h[o+936>>2]=y(-1),Hr=1);e:do if(n[o+964>>2]|0)if(Qe=y(yn(o,2,B)),tt=y(yn(o,0,B)),q=o+916|0,Ro=y(h[q>>2]),To=y(h[o+920>>2]),Hn=y(h[o+932>>2]),Pl(d,l,m,u,n[o+924>>2]|0,Ro,n[o+928>>2]|0,To,Hn,y(h[o+936>>2]),Qe,tt,L)|0)Ze=22;else if(Ye=n[o+520>>2]|0,!Ye)Ze=21;else for(ae=0;;){if(q=o+524+(ae*24|0)|0,Hn=y(h[q>>2]),To=y(h[o+524+(ae*24|0)+4>>2]),Ro=y(h[o+524+(ae*24|0)+16>>2]),Pl(d,l,m,u,n[o+524+(ae*24|0)+8>>2]|0,Hn,n[o+524+(ae*24|0)+12>>2]|0,To,Ro,y(h[o+524+(ae*24|0)+20>>2]),Qe,tt,L)|0){Ze=22;break e}if(ae=ae+1|0,ae>>>0>=Ye>>>0){Ze=21;break}}else{if(T){if(q=o+916|0,!(mn(y(h[q>>2]),l)|0)){Ze=21;break}if(!(mn(y(h[o+920>>2]),u)|0)){Ze=21;break}if((n[o+924>>2]|0)!=(d|0)){Ze=21;break}q=(n[o+928>>2]|0)==(m|0)?q:0,Ze=22;break}if(Ye=n[o+520>>2]|0,!Ye)Ze=21;else for(ae=0;;){if(q=o+524+(ae*24|0)|0,mn(y(h[q>>2]),l)|0&&mn(y(h[o+524+(ae*24|0)+4>>2]),u)|0&&(n[o+524+(ae*24|0)+8>>2]|0)==(d|0)&&(n[o+524+(ae*24|0)+12>>2]|0)==(m|0)){Ze=22;break e}if(ae=ae+1|0,ae>>>0>=Ye>>>0){Ze=21;break}}}while(!1);do if((Ze|0)==21)s[11697]|0?(q=0,Ze=28):(q=0,Ze=31);else if((Ze|0)==22){if(ae=(s[11697]|0)!=0,!((q|0)!=0&(Hr^1)))if(ae){Ze=28;break}else{Ze=31;break}Le=q+16|0,n[o+908>>2]=n[Le>>2],Ye=q+20|0,n[o+912>>2]=n[Ye>>2],(s[11698]|0)==0|ae^1||(n[ct>>2]=Iu(We)|0,n[ct+4>>2]=We,xo(o,4,2972,ct),ae=n[o+972>>2]|0,ae|0&&ip[ae&127](o),d=pa(d,T)|0,m=pa(m,T)|0,Za=+y(h[Le>>2]),Fo=+y(h[Ye>>2]),n[Lt>>2]=d,n[Lt+4>>2]=m,E[Lt+8>>3]=+l,E[Lt+16>>3]=+u,E[Lt+24>>3]=Za,E[Lt+32>>3]=Fo,n[Lt+40>>2]=M,xo(o,4,2989,Lt))}while(!1);return(Ze|0)==28&&(ae=Iu(We)|0,n[Le>>2]=ae,n[Le+4>>2]=We,n[Le+8>>2]=Hr?3047:11699,xo(o,4,3038,Le),ae=n[o+972>>2]|0,ae|0&&ip[ae&127](o),Lt=pa(d,T)|0,Ze=pa(m,T)|0,n[He>>2]=Lt,n[He+4>>2]=Ze,E[He+8>>3]=+l,E[He+16>>3]=+u,n[He+24>>2]=M,xo(o,4,3049,He),Ze=31),(Ze|0)==31&&(Fs(o,l,u,A,d,m,B,k,T,L),s[11697]|0&&(ae=n[2279]|0,Lt=Iu(ae)|0,n[Gr>>2]=Lt,n[Gr+4>>2]=ae,n[Gr+8>>2]=Hr?3047:11699,xo(o,4,3083,Gr),ae=n[o+972>>2]|0,ae|0&&ip[ae&127](o),Lt=pa(d,T)|0,Gr=pa(m,T)|0,Fo=+y(h[o+908>>2]),Za=+y(h[o+912>>2]),n[fr>>2]=Lt,n[fr+4>>2]=Gr,E[fr+8>>3]=Fo,E[fr+16>>3]=Za,n[fr+24>>2]=M,xo(o,4,3092,fr)),n[o+516>>2]=A,q||(ae=o+520|0,q=n[ae>>2]|0,(q|0)==16&&(s[11697]|0&&xo(o,4,3124,$t),n[ae>>2]=0,q=0),T?q=o+916|0:(n[ae>>2]=q+1,q=o+524+(q*24|0)|0),h[q>>2]=l,h[q+4>>2]=u,n[q+8>>2]=d,n[q+12>>2]=m,n[q+16>>2]=n[o+908>>2],n[q+20>>2]=n[o+912>>2],q=0)),T&&(n[o+416>>2]=n[o+908>>2],n[o+420>>2]=n[o+912>>2],s[o+985>>0]=1,s[Tr>>0]=0),n[2279]=(n[2279]|0)+-1,n[o+512>>2]=n[2278],I=cr,Hr|(q|0)==0|0}function yn(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return A=y(K(o,l,u)),y(A+y(re(o,l,u)))}function xo(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=I,I=I+16|0,d=m,n[d>>2]=A,o?A=n[o+976>>2]|0:A=0,Ph(A,o,l,u,d),I=m}function Iu(o){return o=o|0,(o>>>0>60?3201:3201+(60-o)|0)|0}function pa(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;return d=I,I=I+32|0,u=d+12|0,A=d,n[u>>2]=n[254],n[u+4>>2]=n[255],n[u+8>>2]=n[256],n[A>>2]=n[257],n[A+4>>2]=n[258],n[A+8>>2]=n[259],(o|0)>2?o=11699:o=n[(l?A:u)+(o<<2)>>2]|0,I=d,o|0}function Fs(o,l,u,A,d,m,B,k,T,M){o=o|0,l=y(l),u=y(u),A=A|0,d=d|0,m=m|0,B=y(B),k=y(k),T=T|0,M=M|0;var L=0,q=0,ae=0,Ye=0,Le=$e,Qe=$e,tt=$e,Ze=$e,ct=$e,He=$e,We=$e,Lt=0,Gr=0,fr=0,$t=$e,Tr=$e,Hr=0,cr=$e,Hn=0,To=0,Ro=0,Fo=0,Za=0,Wh=0,Yh=0,gc=0,Vh=0,Rf=0,Ff=0,Jh=0,Kh=0,zh=0,ln=0,dc=0,Xh=0,Pu=0,Zh=$e,$h=$e,Nf=$e,Of=$e,xu=$e,oo=0,Ll=0,ma=0,mc=0,op=0,ap=$e,Lf=$e,lp=$e,cp=$e,ao=$e,Ms=$e,yc=0,Wn=$e,up=$e,No=$e,ku=$e,Oo=$e,Qu=$e,fp=0,Ap=0,Tu=$e,lo=$e,Ec=0,pp=0,hp=0,gp=0,Nr=$e,ui=0,Us=0,Lo=0,co=0,Mr=0,Ar=0,Ic=0,zt=$e,dp=0,Bi=0;Ic=I,I=I+16|0,oo=Ic+12|0,Ll=Ic+8|0,ma=Ic+4|0,mc=Ic,wi(o,(d|0)==0|(Mt(l)|0)^1,3326),wi(o,(m|0)==0|(Mt(u)|0)^1,3406),Us=At(o,A)|0,n[o+496>>2]=Us,Mr=dr(2,Us)|0,Ar=dr(0,Us)|0,h[o+440>>2]=y(K(o,Mr,B)),h[o+444>>2]=y(re(o,Mr,B)),h[o+428>>2]=y(K(o,Ar,B)),h[o+436>>2]=y(re(o,Ar,B)),h[o+464>>2]=y(vr(o,Mr)),h[o+468>>2]=y(Un(o,Mr)),h[o+452>>2]=y(vr(o,Ar)),h[o+460>>2]=y(Un(o,Ar)),h[o+488>>2]=y(mi(o,Mr,B)),h[o+492>>2]=y(Cs(o,Mr,B)),h[o+476>>2]=y(mi(o,Ar,B)),h[o+484>>2]=y(Cs(o,Ar,B));do if(n[o+964>>2]|0)JA(o,l,u,d,m,B,k);else{if(Lo=o+948|0,co=(n[o+952>>2]|0)-(n[Lo>>2]|0)>>2,!co){lP(o,l,u,d,m,B,k);break}if(!T&&t2(o,l,u,d,m,B,k)|0)break;te(o),dc=o+508|0,s[dc>>0]=0,Mr=dr(n[o+4>>2]|0,Us)|0,Ar=by(Mr,Us)|0,ui=de(Mr)|0,Xh=n[o+8>>2]|0,pp=o+28|0,Pu=(n[pp>>2]|0)!=0,Oo=ui?B:k,Tu=ui?k:B,Zh=y(kh(o,Mr,B)),$h=y(r2(o,Mr,B)),Le=y(kh(o,Ar,B)),Qu=y(Va(o,Mr,B)),lo=y(Va(o,Ar,B)),fr=ui?d:m,Ec=ui?m:d,Nr=ui?Qu:lo,ct=ui?lo:Qu,ku=y(yn(o,2,B)),Ze=y(yn(o,0,B)),Qe=y(y(Zr(o+364|0,B))-Nr),tt=y(y(Zr(o+380|0,B))-Nr),He=y(y(Zr(o+372|0,k))-ct),We=y(y(Zr(o+388|0,k))-ct),Nf=ui?Qe:He,Of=ui?tt:We,ku=y(l-ku),l=y(ku-Nr),Mt(l)|0?Nr=l:Nr=y($n(y(pd(l,tt)),Qe)),up=y(u-Ze),l=y(up-ct),Mt(l)|0?No=l:No=y($n(y(pd(l,We)),He)),Qe=ui?Nr:No,Wn=ui?No:Nr;e:do if((fr|0)==1)for(A=0,q=0;;){if(L=Is(o,q)|0,!A)y(KA(L))>y(0)&&y(Qh(L))>y(0)?A=L:A=0;else if(n2(L)|0){Ye=0;break e}if(q=q+1|0,q>>>0>=co>>>0){Ye=A;break}}else Ye=0;while(!1);Lt=Ye+500|0,Gr=Ye+504|0,A=0,L=0,l=y(0),ae=0;do{if(q=n[(n[Lo>>2]|0)+(ae<<2)>>2]|0,(n[q+36>>2]|0)==1)Py(q),s[q+985>>0]=1,s[q+984>>0]=0;else{vf(q),T&&bh(q,At(q,Us)|0,Qe,Wn,Nr);do if((n[q+24>>2]|0)!=1)if((q|0)==(Ye|0)){n[Lt>>2]=n[2278],h[Gr>>2]=y(0);break}else{cP(o,q,Nr,d,No,Nr,No,m,Us,M);break}else L|0&&(n[L+960>>2]=q),n[q+960>>2]=0,L=q,A=A|0?A:q;while(!1);Ms=y(h[q+504>>2]),l=y(l+y(Ms+y(yn(q,Mr,Nr))))}ae=ae+1|0}while((ae|0)!=(co|0));for(Ro=l>Qe,yc=Pu&((fr|0)==2&Ro)?1:fr,Hn=(Ec|0)==1,Za=Hn&(T^1),Wh=(yc|0)==1,Yh=(yc|0)==2,gc=976+(Mr<<2)|0,Vh=(Ec|2|0)==2,zh=Hn&(Pu^1),Rf=1040+(Ar<<2)|0,Ff=1040+(Mr<<2)|0,Jh=976+(Ar<<2)|0,Kh=(Ec|0)!=1,Ro=Pu&((fr|0)!=0&Ro),To=o+976|0,Hn=Hn^1,l=Qe,Hr=0,Fo=0,Ms=y(0),xu=y(0);;){e:do if(Hr>>>0<co>>>0)for(Gr=n[Lo>>2]|0,ae=0,We=y(0),He=y(0),tt=y(0),Qe=y(0),q=0,L=0,Ye=Hr;;){if(Lt=n[Gr+(Ye<<2)>>2]|0,(n[Lt+36>>2]|0)!=1&&(n[Lt+940>>2]=Fo,(n[Lt+24>>2]|0)!=1)){if(Ze=y(yn(Lt,Mr,Nr)),ln=n[gc>>2]|0,u=y(Zr(Lt+380+(ln<<3)|0,Oo)),ct=y(h[Lt+504>>2]),u=y(pd(u,ct)),u=y($n(y(Zr(Lt+364+(ln<<3)|0,Oo)),u)),Pu&(ae|0)!=0&y(Ze+y(He+u))>l){m=ae,Ze=We,fr=Ye;break e}Ze=y(Ze+u),u=y(He+Ze),Ze=y(We+Ze),n2(Lt)|0&&(tt=y(tt+y(KA(Lt))),Qe=y(Qe-y(ct*y(Qh(Lt))))),L|0&&(n[L+960>>2]=Lt),n[Lt+960>>2]=0,ae=ae+1|0,L=Lt,q=q|0?q:Lt}else Ze=We,u=He;if(Ye=Ye+1|0,Ye>>>0<co>>>0)We=Ze,He=u;else{m=ae,fr=Ye;break}}else m=0,Ze=y(0),tt=y(0),Qe=y(0),q=0,fr=Hr;while(!1);ln=tt>y(0)&tt<y(1),$t=ln?y(1):tt,ln=Qe>y(0)&Qe<y(1),We=ln?y(1):Qe;do if(Wh)ln=51;else if(Ze<Nf&((Mt(Nf)|0)^1))l=Nf,ln=51;else if(Ze>Of&((Mt(Of)|0)^1))l=Of,ln=51;else if(s[(n[To>>2]|0)+3>>0]|0)ln=51;else{if($t!=y(0)&&y(KA(o))!=y(0)){ln=53;break}l=Ze,ln=53}while(!1);if((ln|0)==51&&(ln=0,Mt(l)|0?ln=53:(Tr=y(l-Ze),cr=l)),(ln|0)==53&&(ln=0,Ze<y(0)?(Tr=y(-Ze),cr=l):(Tr=y(0),cr=l)),!Za&&(op=(q|0)==0,!op)){ae=n[gc>>2]|0,Ye=Tr<y(0),ct=y(Tr/We),Lt=Tr>y(0),He=y(Tr/$t),tt=y(0),Ze=y(0),l=y(0),L=q;do u=y(Zr(L+380+(ae<<3)|0,Oo)),Qe=y(Zr(L+364+(ae<<3)|0,Oo)),Qe=y(pd(u,y($n(Qe,y(h[L+504>>2]))))),Ye?(u=y(Qe*y(Qh(L))),u!=y(-0)&&(zt=y(Qe-y(ct*u)),ap=y(qn(L,Mr,zt,cr,Nr)),zt!=ap)&&(tt=y(tt-y(ap-Qe)),l=y(l+u))):Lt&&(Lf=y(KA(L)),Lf!=y(0))&&(zt=y(Qe+y(He*Lf)),lp=y(qn(L,Mr,zt,cr,Nr)),zt!=lp)&&(tt=y(tt-y(lp-Qe)),Ze=y(Ze-Lf)),L=n[L+960>>2]|0;while(L|0);if(l=y(We+l),Qe=y(Tr+tt),op)l=y(0);else{ct=y($t+Ze),Ye=n[gc>>2]|0,Lt=Qe<y(0),Gr=l==y(0),He=y(Qe/l),ae=Qe>y(0),ct=y(Qe/ct),l=y(0);do{zt=y(Zr(q+380+(Ye<<3)|0,Oo)),tt=y(Zr(q+364+(Ye<<3)|0,Oo)),tt=y(pd(zt,y($n(tt,y(h[q+504>>2]))))),Lt?(zt=y(tt*y(Qh(q))),Qe=y(-zt),zt!=y(-0)?(zt=y(He*Qe),Qe=y(qn(q,Mr,y(tt+(Gr?Qe:zt)),cr,Nr))):Qe=tt):ae&&(cp=y(KA(q)),cp!=y(0))?Qe=y(qn(q,Mr,y(tt+y(ct*cp)),cr,Nr)):Qe=tt,l=y(l-y(Qe-tt)),Ze=y(yn(q,Mr,Nr)),u=y(yn(q,Ar,Nr)),Qe=y(Qe+Ze),h[Ll>>2]=Qe,n[mc>>2]=1,tt=y(h[q+396>>2]);e:do if(Mt(tt)|0){L=Mt(Wn)|0;do if(!L){if(Ro|(io(q,Ar,Wn)|0|Hn)||(os(o,q)|0)!=4||(n[(kl(q,Ar)|0)+4>>2]|0)==3||(n[(Ql(q,Ar)|0)+4>>2]|0)==3)break;h[oo>>2]=Wn,n[ma>>2]=1;break e}while(!1);if(io(q,Ar,Wn)|0){L=n[q+992+(n[Jh>>2]<<2)>>2]|0,zt=y(u+y(Zr(L,Wn))),h[oo>>2]=zt,L=Kh&(n[L+4>>2]|0)==2,n[ma>>2]=((Mt(zt)|0|L)^1)&1;break}else{h[oo>>2]=Wn,n[ma>>2]=L?0:2;break}}else zt=y(Qe-Ze),$t=y(zt/tt),zt=y(tt*zt),n[ma>>2]=1,h[oo>>2]=y(u+(ui?$t:zt));while(!1);Cu(q,Mr,cr,Nr,mc,Ll),Cu(q,Ar,Wn,Nr,ma,oo);do if(!(io(q,Ar,Wn)|0)&&(os(o,q)|0)==4){if((n[(kl(q,Ar)|0)+4>>2]|0)==3){L=0;break}L=(n[(Ql(q,Ar)|0)+4>>2]|0)!=3}else L=0;while(!1);zt=y(h[Ll>>2]),$t=y(h[oo>>2]),dp=n[mc>>2]|0,Bi=n[ma>>2]|0,xl(q,ui?zt:$t,ui?$t:zt,Us,ui?dp:Bi,ui?Bi:dp,Nr,No,T&(L^1),3488,M)|0,s[dc>>0]=s[dc>>0]|s[q+508>>0],q=n[q+960>>2]|0}while(q|0)}}else l=y(0);if(l=y(Tr+l),Bi=l<y(0)&1,s[dc>>0]=Bi|c[dc>>0],Yh&l>y(0)?(L=n[gc>>2]|0,n[o+364+(L<<3)+4>>2]|0&&(ao=y(Zr(o+364+(L<<3)|0,Oo)),ao>=y(0))?Qe=y($n(y(0),y(ao-y(cr-l)))):Qe=y(0)):Qe=l,Lt=Hr>>>0<fr>>>0,Lt){Ye=n[Lo>>2]|0,ae=Hr,L=0;do q=n[Ye+(ae<<2)>>2]|0,n[q+24>>2]|0||(L=((n[(kl(q,Mr)|0)+4>>2]|0)==3&1)+L|0,L=L+((n[(Ql(q,Mr)|0)+4>>2]|0)==3&1)|0),ae=ae+1|0;while((ae|0)!=(fr|0));L?(Ze=y(0),u=y(0)):ln=101}else ln=101;e:do if((ln|0)==101)switch(ln=0,Xh|0){case 1:{L=0,Ze=y(Qe*y(.5)),u=y(0);break e}case 2:{L=0,Ze=Qe,u=y(0);break e}case 3:{if(m>>>0<=1){L=0,Ze=y(0),u=y(0);break e}u=y((m+-1|0)>>>0),L=0,Ze=y(0),u=y(y($n(Qe,y(0)))/u);break e}case 5:{u=y(Qe/y((m+1|0)>>>0)),L=0,Ze=u;break e}case 4:{u=y(Qe/y(m>>>0)),L=0,Ze=y(u*y(.5));break e}default:{L=0,Ze=y(0),u=y(0);break e}}while(!1);if(l=y(Zh+Ze),Lt){tt=y(Qe/y(L|0)),ae=n[Lo>>2]|0,q=Hr,Qe=y(0);do{L=n[ae+(q<<2)>>2]|0;e:do if((n[L+36>>2]|0)!=1){switch(n[L+24>>2]|0){case 1:{if(ha(L,Mr)|0){if(!T)break e;zt=y(zA(L,Mr,cr)),zt=y(zt+y(vr(o,Mr))),zt=y(zt+y(K(L,Mr,Nr))),h[L+400+(n[Ff>>2]<<2)>>2]=zt;break e}break}case 0:if(Bi=(n[(kl(L,Mr)|0)+4>>2]|0)==3,zt=y(tt+l),l=Bi?zt:l,T&&(Bi=L+400+(n[Ff>>2]<<2)|0,h[Bi>>2]=y(l+y(h[Bi>>2]))),Bi=(n[(Ql(L,Mr)|0)+4>>2]|0)==3,zt=y(tt+l),l=Bi?zt:l,Za){zt=y(u+y(yn(L,Mr,Nr))),Qe=Wn,l=y(l+y(zt+y(h[L+504>>2])));break e}else{l=y(l+y(u+y(XA(L,Mr,Nr)))),Qe=y($n(Qe,y(XA(L,Ar,Nr))));break e}default:}T&&(zt=y(Ze+y(vr(o,Mr))),Bi=L+400+(n[Ff>>2]<<2)|0,h[Bi>>2]=y(zt+y(h[Bi>>2])))}while(!1);q=q+1|0}while((q|0)!=(fr|0))}else Qe=y(0);if(u=y($h+l),Vh?Ze=y(y(qn(o,Ar,y(lo+Qe),Tu,B))-lo):Ze=Wn,tt=y(y(qn(o,Ar,y(lo+(zh?Wn:Qe)),Tu,B))-lo),Lt&T){q=Hr;do{ae=n[(n[Lo>>2]|0)+(q<<2)>>2]|0;do if((n[ae+36>>2]|0)!=1){if((n[ae+24>>2]|0)==1){if(ha(ae,Ar)|0){if(zt=y(zA(ae,Ar,Wn)),zt=y(zt+y(vr(o,Ar))),zt=y(zt+y(K(ae,Ar,Nr))),L=n[Rf>>2]|0,h[ae+400+(L<<2)>>2]=zt,!(Mt(zt)|0))break}else L=n[Rf>>2]|0;zt=y(vr(o,Ar)),h[ae+400+(L<<2)>>2]=y(zt+y(K(ae,Ar,Nr)));break}L=os(o,ae)|0;do if((L|0)==4){if((n[(kl(ae,Ar)|0)+4>>2]|0)==3){ln=139;break}if((n[(Ql(ae,Ar)|0)+4>>2]|0)==3){ln=139;break}if(io(ae,Ar,Wn)|0){l=Le;break}dp=n[ae+908+(n[gc>>2]<<2)>>2]|0,n[oo>>2]=dp,l=y(h[ae+396>>2]),Bi=Mt(l)|0,Qe=(n[S>>2]=dp,y(h[S>>2])),Bi?l=tt:(Tr=y(yn(ae,Ar,Nr)),zt=y(Qe/l),l=y(l*Qe),l=y(Tr+(ui?zt:l))),h[Ll>>2]=l,h[oo>>2]=y(y(yn(ae,Mr,Nr))+Qe),n[ma>>2]=1,n[mc>>2]=1,Cu(ae,Mr,cr,Nr,ma,oo),Cu(ae,Ar,Wn,Nr,mc,Ll),l=y(h[oo>>2]),Tr=y(h[Ll>>2]),zt=ui?l:Tr,l=ui?Tr:l,Bi=((Mt(zt)|0)^1)&1,xl(ae,zt,l,Us,Bi,((Mt(l)|0)^1)&1,Nr,No,1,3493,M)|0,l=Le}else ln=139;while(!1);e:do if((ln|0)==139){ln=0,l=y(Ze-y(XA(ae,Ar,Nr)));do if((n[(kl(ae,Ar)|0)+4>>2]|0)==3){if((n[(Ql(ae,Ar)|0)+4>>2]|0)!=3)break;l=y(Le+y($n(y(0),y(l*y(.5)))));break e}while(!1);if((n[(Ql(ae,Ar)|0)+4>>2]|0)==3){l=Le;break}if((n[(kl(ae,Ar)|0)+4>>2]|0)==3){l=y(Le+y($n(y(0),l)));break}switch(L|0){case 1:{l=Le;break e}case 2:{l=y(Le+y(l*y(.5)));break e}default:{l=y(Le+l);break e}}}while(!1);zt=y(Ms+l),Bi=ae+400+(n[Rf>>2]<<2)|0,h[Bi>>2]=y(zt+y(h[Bi>>2]))}while(!1);q=q+1|0}while((q|0)!=(fr|0))}if(Ms=y(Ms+tt),xu=y($n(xu,u)),m=Fo+1|0,fr>>>0>=co>>>0)break;l=cr,Hr=fr,Fo=m}do if(T){if(L=m>>>0>1,!L&&!(jL(o)|0))break;if(!(Mt(Wn)|0)){l=y(Wn-Ms);e:do switch(n[o+12>>2]|0){case 3:{Le=y(Le+l),He=y(0);break}case 2:{Le=y(Le+y(l*y(.5))),He=y(0);break}case 4:{Wn>Ms?He=y(l/y(m>>>0)):He=y(0);break}case 7:if(Wn>Ms){Le=y(Le+y(l/y(m<<1>>>0))),He=y(l/y(m>>>0)),He=L?He:y(0);break e}else{Le=y(Le+y(l*y(.5))),He=y(0);break e}case 6:{He=y(l/y(Fo>>>0)),He=Wn>Ms&L?He:y(0);break}default:He=y(0)}while(!1);if(m|0)for(Lt=1040+(Ar<<2)|0,Gr=976+(Ar<<2)|0,Ye=0,q=0;;){e:do if(q>>>0<co>>>0)for(Qe=y(0),tt=y(0),l=y(0),ae=q;;){L=n[(n[Lo>>2]|0)+(ae<<2)>>2]|0;do if((n[L+36>>2]|0)!=1&&!(n[L+24>>2]|0)){if((n[L+940>>2]|0)!=(Ye|0))break e;if(qL(L,Ar)|0&&(zt=y(h[L+908+(n[Gr>>2]<<2)>>2]),l=y($n(l,y(zt+y(yn(L,Ar,Nr)))))),(os(o,L)|0)!=5)break;ao=y(Yg(L)),ao=y(ao+y(K(L,0,Nr))),zt=y(h[L+912>>2]),zt=y(y(zt+y(yn(L,0,Nr)))-ao),ao=y($n(tt,ao)),zt=y($n(Qe,zt)),Qe=zt,tt=ao,l=y($n(l,y(ao+zt)))}while(!1);if(L=ae+1|0,L>>>0<co>>>0)ae=L;else{ae=L;break}}else tt=y(0),l=y(0),ae=q;while(!1);if(ct=y(He+l),u=Le,Le=y(Le+ct),q>>>0<ae>>>0){Ze=y(u+tt),L=q;do{q=n[(n[Lo>>2]|0)+(L<<2)>>2]|0;e:do if((n[q+36>>2]|0)!=1&&!(n[q+24>>2]|0))switch(os(o,q)|0){case 1:{zt=y(u+y(K(q,Ar,Nr))),h[q+400+(n[Lt>>2]<<2)>>2]=zt;break e}case 3:{zt=y(y(Le-y(re(q,Ar,Nr)))-y(h[q+908+(n[Gr>>2]<<2)>>2])),h[q+400+(n[Lt>>2]<<2)>>2]=zt;break e}case 2:{zt=y(u+y(y(ct-y(h[q+908+(n[Gr>>2]<<2)>>2]))*y(.5))),h[q+400+(n[Lt>>2]<<2)>>2]=zt;break e}case 4:{if(zt=y(u+y(K(q,Ar,Nr))),h[q+400+(n[Lt>>2]<<2)>>2]=zt,io(q,Ar,Wn)|0||(ui?(Qe=y(h[q+908>>2]),l=y(Qe+y(yn(q,Mr,Nr))),tt=ct):(tt=y(h[q+912>>2]),tt=y(tt+y(yn(q,Ar,Nr))),l=ct,Qe=y(h[q+908>>2])),mn(l,Qe)|0&&mn(tt,y(h[q+912>>2]))|0))break e;xl(q,l,tt,Us,1,1,Nr,No,1,3501,M)|0;break e}case 5:{h[q+404>>2]=y(y(Ze-y(Yg(q)))+y(zA(q,0,Wn)));break e}default:break e}while(!1);L=L+1|0}while((L|0)!=(ae|0))}if(Ye=Ye+1|0,(Ye|0)==(m|0))break;q=ae}}}while(!1);if(h[o+908>>2]=y(qn(o,2,ku,B,B)),h[o+912>>2]=y(qn(o,0,up,k,B)),yc|0&&(fp=n[o+32>>2]|0,Ap=(yc|0)==2,!(Ap&(fp|0)!=2))?Ap&(fp|0)==2&&(l=y(Qu+cr),l=y($n(y(pd(l,y(Vg(o,Mr,xu,Oo)))),Qu)),ln=198):(l=y(qn(o,Mr,xu,Oo,B)),ln=198),(ln|0)==198&&(h[o+908+(n[976+(Mr<<2)>>2]<<2)>>2]=l),Ec|0&&(hp=n[o+32>>2]|0,gp=(Ec|0)==2,!(gp&(hp|0)!=2))?gp&(hp|0)==2&&(l=y(lo+Wn),l=y($n(y(pd(l,y(Vg(o,Ar,y(lo+Ms),Tu)))),lo)),ln=204):(l=y(qn(o,Ar,y(lo+Ms),Tu,B)),ln=204),(ln|0)==204&&(h[o+908+(n[976+(Ar<<2)>>2]<<2)>>2]=l),T){if((n[pp>>2]|0)==2){q=976+(Ar<<2)|0,ae=1040+(Ar<<2)|0,L=0;do Ye=Is(o,L)|0,n[Ye+24>>2]|0||(dp=n[q>>2]|0,zt=y(h[o+908+(dp<<2)>>2]),Bi=Ye+400+(n[ae>>2]<<2)|0,zt=y(zt-y(h[Bi>>2])),h[Bi>>2]=y(zt-y(h[Ye+908+(dp<<2)>>2]))),L=L+1|0;while((L|0)!=(co|0))}if(A|0){L=ui?yc:d;do WL(o,A,Nr,L,No,Us,M),A=n[A+960>>2]|0;while(A|0)}if(L=(Mr|2|0)==3,q=(Ar|2|0)==3,L|q){A=0;do ae=n[(n[Lo>>2]|0)+(A<<2)>>2]|0,(n[ae+36>>2]|0)!=1&&(L&&i2(o,ae,Mr),q&&i2(o,ae,Ar)),A=A+1|0;while((A|0)!=(co|0))}}}while(!1);I=Ic}function Dh(o,l){o=o|0,l=y(l);var u=0;Ha(o,l>=y(0),3147),u=l==y(0),h[o+4>>2]=u?y(0):l}function YA(o,l,u,A){o=o|0,l=y(l),u=y(u),A=A|0;var d=$e,m=$e,B=0,k=0,T=0;n[2278]=(n[2278]|0)+1,vf(o),io(o,2,l)|0?(d=y(Zr(n[o+992>>2]|0,l)),T=1,d=y(d+y(yn(o,2,l)))):(d=y(Zr(o+380|0,l)),d>=y(0)?T=2:(T=((Mt(l)|0)^1)&1,d=l)),io(o,0,u)|0?(m=y(Zr(n[o+996>>2]|0,u)),k=1,m=y(m+y(yn(o,0,l)))):(m=y(Zr(o+388|0,u)),m>=y(0)?k=2:(k=((Mt(u)|0)^1)&1,m=u)),B=o+976|0,xl(o,d,m,A,T,k,l,u,1,3189,n[B>>2]|0)|0&&(bh(o,n[o+496>>2]|0,l,u,l),VA(o,y(h[(n[B>>2]|0)+4>>2]),y(0),y(0)),s[11696]|0)&&Gg(o,7)}function vf(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0;k=I,I=I+32|0,B=k+24|0,m=k+16|0,A=k+8|0,d=k,u=0;do l=o+380+(u<<3)|0,n[o+380+(u<<3)+4>>2]|0&&(T=l,M=n[T+4>>2]|0,L=A,n[L>>2]=n[T>>2],n[L+4>>2]=M,L=o+364+(u<<3)|0,M=n[L+4>>2]|0,T=d,n[T>>2]=n[L>>2],n[T+4>>2]=M,n[m>>2]=n[A>>2],n[m+4>>2]=n[A+4>>2],n[B>>2]=n[d>>2],n[B+4>>2]=n[d+4>>2],Cf(m,B)|0)||(l=o+348+(u<<3)|0),n[o+992+(u<<2)>>2]=l,u=u+1|0;while((u|0)!=2);I=k}function io(o,l,u){o=o|0,l=l|0,u=y(u);var A=0;switch(o=n[o+992+(n[976+(l<<2)>>2]<<2)>>2]|0,n[o+4>>2]|0){case 0:case 3:{o=0;break}case 1:{y(h[o>>2])<y(0)?o=0:A=5;break}case 2:{y(h[o>>2])<y(0)?o=0:o=(Mt(u)|0)^1;break}default:A=5}return(A|0)==5&&(o=1),o|0}function Zr(o,l){switch(o=o|0,l=y(l),n[o+4>>2]|0){case 2:{l=y(y(y(h[o>>2])*l)/y(100));break}case 1:{l=y(h[o>>2]);break}default:l=y(le)}return y(l)}function bh(o,l,u,A,d){o=o|0,l=l|0,u=y(u),A=y(A),d=y(d);var m=0,B=$e;l=n[o+944>>2]|0?l:1,m=dr(n[o+4>>2]|0,l)|0,l=by(m,l)|0,u=y(uP(o,m,u)),A=y(uP(o,l,A)),B=y(u+y(K(o,m,d))),h[o+400+(n[1040+(m<<2)>>2]<<2)>>2]=B,u=y(u+y(re(o,m,d))),h[o+400+(n[1e3+(m<<2)>>2]<<2)>>2]=u,u=y(A+y(K(o,l,d))),h[o+400+(n[1040+(l<<2)>>2]<<2)>>2]=u,d=y(A+y(re(o,l,d))),h[o+400+(n[1e3+(l<<2)>>2]<<2)>>2]=d}function VA(o,l,u,A){o=o|0,l=y(l),u=y(u),A=y(A);var d=0,m=0,B=$e,k=$e,T=0,M=0,L=$e,q=0,ae=$e,Ye=$e,Le=$e,Qe=$e;if(l!=y(0)&&(d=o+400|0,Qe=y(h[d>>2]),m=o+404|0,Le=y(h[m>>2]),q=o+416|0,Ye=y(h[q>>2]),M=o+420|0,B=y(h[M>>2]),ae=y(Qe+u),L=y(Le+A),A=y(ae+Ye),k=y(L+B),T=(n[o+988>>2]|0)==1,h[d>>2]=y(ss(Qe,l,0,T)),h[m>>2]=y(ss(Le,l,0,T)),u=y(uU(y(Ye*l),y(1))),mn(u,y(0))|0?m=0:m=(mn(u,y(1))|0)^1,u=y(uU(y(B*l),y(1))),mn(u,y(0))|0?d=0:d=(mn(u,y(1))|0)^1,Qe=y(ss(A,l,T&m,T&(m^1))),h[q>>2]=y(Qe-y(ss(ae,l,0,T))),Qe=y(ss(k,l,T&d,T&(d^1))),h[M>>2]=y(Qe-y(ss(L,l,0,T))),m=(n[o+952>>2]|0)-(n[o+948>>2]|0)>>2,m|0)){d=0;do VA(Is(o,d)|0,l,ae,L),d=d+1|0;while((d|0)!=(m|0))}}function Sy(o,l,u,A,d){switch(o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,u|0){case 5:case 0:{o=IZ(n[489]|0,A,d)|0;break}default:o=b6e(A,d)|0}return o|0}function Wg(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;d=I,I=I+16|0,m=d,n[m>>2]=A,Ph(o,0,l,u,m),I=d}function Ph(o,l,u,A,d){if(o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,o=o|0?o:956,HZ[n[o+8>>2]&1](o,l,u,A,d)|0,(u|0)==5)Nt();else return}function pc(o,l,u){o=o|0,l=l|0,u=u|0,s[o+l>>0]=u&1}function Dy(o,l){o=o|0,l=l|0;var u=0,A=0;n[o>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,u=l+4|0,A=(n[u>>2]|0)-(n[l>>2]|0)>>2,A|0&&(xh(o,A),kt(o,n[l>>2]|0,n[u>>2]|0,A))}function xh(o,l){o=o|0,l=l|0;var u=0;if((O(o)|0)>>>0<l>>>0&&an(o),l>>>0>1073741823)Nt();else{u=Kt(l<<2)|0,n[o+4>>2]=u,n[o>>2]=u,n[o+8>>2]=u+(l<<2);return}}function kt(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,A=o+4|0,o=u-l|0,(o|0)>0&&(Qr(n[A>>2]|0,l|0,o|0)|0,n[A>>2]=(n[A>>2]|0)+(o>>>2<<2))}function O(o){return o=o|0,1073741823}function K(o,l,u){return o=o|0,l=l|0,u=y(u),de(l)|0&&n[o+96>>2]|0?o=o+92|0:o=kn(o+60|0,n[1040+(l<<2)>>2]|0,992)|0,y(Je(o,u))}function re(o,l,u){return o=o|0,l=l|0,u=y(u),de(l)|0&&n[o+104>>2]|0?o=o+100|0:o=kn(o+60|0,n[1e3+(l<<2)>>2]|0,992)|0,y(Je(o,u))}function de(o){return o=o|0,(o|1|0)==3|0}function Je(o,l){return o=o|0,l=y(l),(n[o+4>>2]|0)==3?l=y(0):l=y(Zr(o,l)),y(l)}function At(o,l){return o=o|0,l=l|0,o=n[o>>2]|0,(o|0?o:(l|0)>1?l:1)|0}function dr(o,l){o=o|0,l=l|0;var u=0;e:do if((l|0)==2){switch(o|0){case 2:{o=3;break e}case 3:break;default:{u=4;break e}}o=2}else u=4;while(!1);return o|0}function vr(o,l){o=o|0,l=l|0;var u=$e;return de(l)|0&&n[o+312>>2]|0&&(u=y(h[o+308>>2]),u>=y(0))||(u=y($n(y(h[(kn(o+276|0,n[1040+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(u)}function Un(o,l){o=o|0,l=l|0;var u=$e;return de(l)|0&&n[o+320>>2]|0&&(u=y(h[o+316>>2]),u>=y(0))||(u=y($n(y(h[(kn(o+276|0,n[1e3+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(u)}function mi(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return de(l)|0&&n[o+240>>2]|0&&(A=y(Zr(o+236|0,u)),A>=y(0))||(A=y($n(y(Zr(kn(o+204|0,n[1040+(l<<2)>>2]|0,992)|0,u)),y(0)))),y(A)}function Cs(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return de(l)|0&&n[o+248>>2]|0&&(A=y(Zr(o+244|0,u)),A>=y(0))||(A=y($n(y(Zr(kn(o+204|0,n[1e3+(l<<2)>>2]|0,992)|0,u)),y(0)))),y(A)}function JA(o,l,u,A,d,m,B){o=o|0,l=y(l),u=y(u),A=A|0,d=d|0,m=y(m),B=y(B);var k=$e,T=$e,M=$e,L=$e,q=$e,ae=$e,Ye=0,Le=0,Qe=0;Qe=I,I=I+16|0,Ye=Qe,Le=o+964|0,wi(o,(n[Le>>2]|0)!=0,3519),k=y(Va(o,2,l)),T=y(Va(o,0,l)),M=y(yn(o,2,l)),L=y(yn(o,0,l)),Mt(l)|0?q=l:q=y($n(y(0),y(y(l-M)-k))),Mt(u)|0?ae=u:ae=y($n(y(0),y(y(u-L)-T))),(A|0)==1&(d|0)==1?(h[o+908>>2]=y(qn(o,2,y(l-M),m,m)),l=y(qn(o,0,y(u-L),B,m))):(jZ[n[Le>>2]&1](Ye,o,q,A,ae,d),q=y(k+y(h[Ye>>2])),ae=y(l-M),h[o+908>>2]=y(qn(o,2,(A|2|0)==2?q:ae,m,m)),ae=y(T+y(h[Ye+4>>2])),l=y(u-L),l=y(qn(o,0,(d|2|0)==2?ae:l,B,m))),h[o+912>>2]=l,I=Qe}function lP(o,l,u,A,d,m,B){o=o|0,l=y(l),u=y(u),A=A|0,d=d|0,m=y(m),B=y(B);var k=$e,T=$e,M=$e,L=$e;M=y(Va(o,2,m)),k=y(Va(o,0,m)),L=y(yn(o,2,m)),T=y(yn(o,0,m)),l=y(l-L),h[o+908>>2]=y(qn(o,2,(A|2|0)==2?M:l,m,m)),u=y(u-T),h[o+912>>2]=y(qn(o,0,(d|2|0)==2?k:u,B,m))}function t2(o,l,u,A,d,m,B){o=o|0,l=y(l),u=y(u),A=A|0,d=d|0,m=y(m),B=y(B);var k=0,T=$e,M=$e;return k=(A|0)==2,!(l<=y(0)&k)&&!(u<=y(0)&(d|0)==2)&&!((A|0)==1&(d|0)==1)?o=0:(T=y(yn(o,0,m)),M=y(yn(o,2,m)),k=l<y(0)&k|(Mt(l)|0),l=y(l-M),h[o+908>>2]=y(qn(o,2,k?y(0):l,m,m)),l=y(u-T),k=u<y(0)&(d|0)==2|(Mt(u)|0),h[o+912>>2]=y(qn(o,0,k?y(0):l,B,m)),o=1),o|0}function by(o,l){return o=o|0,l=l|0,Jg(o)|0?o=dr(2,l)|0:o=0,o|0}function kh(o,l,u){return o=o|0,l=l|0,u=y(u),u=y(mi(o,l,u)),y(u+y(vr(o,l)))}function r2(o,l,u){return o=o|0,l=l|0,u=y(u),u=y(Cs(o,l,u)),y(u+y(Un(o,l)))}function Va(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return A=y(kh(o,l,u)),y(A+y(r2(o,l,u)))}function n2(o){return o=o|0,n[o+24>>2]|0?o=0:y(KA(o))!=y(0)?o=1:o=y(Qh(o))!=y(0),o|0}function KA(o){o=o|0;var l=$e;if(n[o+944>>2]|0){if(l=y(h[o+44>>2]),Mt(l)|0)return l=y(h[o+40>>2]),o=l>y(0)&((Mt(l)|0)^1),y(o?l:y(0))}else l=y(0);return y(l)}function Qh(o){o=o|0;var l=$e,u=0,A=$e;do if(n[o+944>>2]|0){if(l=y(h[o+48>>2]),Mt(l)|0){if(u=s[(n[o+976>>2]|0)+2>>0]|0,!(u<<24>>24)&&(A=y(h[o+40>>2]),A<y(0)&((Mt(A)|0)^1))){l=y(-A);break}l=u<<24>>24?y(1):y(0)}}else l=y(0);while(!1);return y(l)}function Py(o){o=o|0;var l=0,u=0;if(eE(o+400|0,0,540)|0,s[o+985>>0]=1,te(o),u=Mi(o)|0,u|0){l=o+948|0,o=0;do Py(n[(n[l>>2]|0)+(o<<2)>>2]|0),o=o+1|0;while((o|0)!=(u|0))}}function cP(o,l,u,A,d,m,B,k,T,M){o=o|0,l=l|0,u=y(u),A=A|0,d=y(d),m=y(m),B=y(B),k=k|0,T=T|0,M=M|0;var L=0,q=$e,ae=0,Ye=0,Le=$e,Qe=$e,tt=0,Ze=$e,ct=0,He=$e,We=0,Lt=0,Gr=0,fr=0,$t=0,Tr=0,Hr=0,cr=0,Hn=0,To=0;Hn=I,I=I+16|0,Gr=Hn+12|0,fr=Hn+8|0,$t=Hn+4|0,Tr=Hn,cr=dr(n[o+4>>2]|0,T)|0,We=de(cr)|0,q=y(Zr(YL(l)|0,We?m:B)),Lt=io(l,2,m)|0,Hr=io(l,0,B)|0;do if(!(Mt(q)|0)&&!(Mt(We?u:d)|0)){if(L=l+504|0,!(Mt(y(h[L>>2]))|0)&&(!(s2(n[l+976>>2]|0,0)|0)||(n[l+500>>2]|0)==(n[2278]|0)))break;h[L>>2]=y($n(q,y(Va(l,cr,m))))}else ae=7;while(!1);do if((ae|0)==7){if(ct=We^1,!(ct|Lt^1)){B=y(Zr(n[l+992>>2]|0,m)),h[l+504>>2]=y($n(B,y(Va(l,2,m))));break}if(!(We|Hr^1)){B=y(Zr(n[l+996>>2]|0,B)),h[l+504>>2]=y($n(B,y(Va(l,0,m))));break}h[Gr>>2]=y(le),h[fr>>2]=y(le),n[$t>>2]=0,n[Tr>>2]=0,Ze=y(yn(l,2,m)),He=y(yn(l,0,m)),Lt?(Le=y(Ze+y(Zr(n[l+992>>2]|0,m))),h[Gr>>2]=Le,n[$t>>2]=1,Ye=1):(Ye=0,Le=y(le)),Hr?(q=y(He+y(Zr(n[l+996>>2]|0,B))),h[fr>>2]=q,n[Tr>>2]=1,L=1):(L=0,q=y(le)),ae=n[o+32>>2]|0,We&(ae|0)==2?ae=2:Mt(Le)|0&&!(Mt(u)|0)&&(h[Gr>>2]=u,n[$t>>2]=2,Ye=2,Le=u),!((ae|0)==2&ct)&&Mt(q)|0&&!(Mt(d)|0)&&(h[fr>>2]=d,n[Tr>>2]=2,L=2,q=d),Qe=y(h[l+396>>2]),tt=Mt(Qe)|0;do if(tt)ae=Ye;else{if((Ye|0)==1&ct){h[fr>>2]=y(y(Le-Ze)/Qe),n[Tr>>2]=1,L=1,ae=1;break}We&(L|0)==1?(h[Gr>>2]=y(Qe*y(q-He)),n[$t>>2]=1,L=1,ae=1):ae=Ye}while(!1);To=Mt(u)|0,Ye=(os(o,l)|0)!=4,!(We|Lt|((A|0)!=1|To)|(Ye|(ae|0)==1))&&(h[Gr>>2]=u,n[$t>>2]=1,!tt)&&(h[fr>>2]=y(y(u-Ze)/Qe),n[Tr>>2]=1,L=1),!(Hr|ct|((k|0)!=1|(Mt(d)|0))|(Ye|(L|0)==1))&&(h[fr>>2]=d,n[Tr>>2]=1,!tt)&&(h[Gr>>2]=y(Qe*y(d-He)),n[$t>>2]=1),Cu(l,2,m,m,$t,Gr),Cu(l,0,B,m,Tr,fr),u=y(h[Gr>>2]),d=y(h[fr>>2]),xl(l,u,d,T,n[$t>>2]|0,n[Tr>>2]|0,m,B,0,3565,M)|0,B=y(h[l+908+(n[976+(cr<<2)>>2]<<2)>>2]),h[l+504>>2]=y($n(B,y(Va(l,cr,m))))}while(!1);n[l+500>>2]=n[2278],I=Hn}function qn(o,l,u,A,d){return o=o|0,l=l|0,u=y(u),A=y(A),d=y(d),A=y(Vg(o,l,u,A)),y($n(A,y(Va(o,l,d))))}function os(o,l){return o=o|0,l=l|0,l=l+20|0,l=n[(n[l>>2]|0?l:o+16|0)>>2]|0,(l|0)==5&&Jg(n[o+4>>2]|0)|0&&(l=1),l|0}function kl(o,l){return o=o|0,l=l|0,de(l)|0&&n[o+96>>2]|0?l=4:l=n[1040+(l<<2)>>2]|0,o+60+(l<<3)|0}function Ql(o,l){return o=o|0,l=l|0,de(l)|0&&n[o+104>>2]|0?l=5:l=n[1e3+(l<<2)>>2]|0,o+60+(l<<3)|0}function Cu(o,l,u,A,d,m){switch(o=o|0,l=l|0,u=y(u),A=y(A),d=d|0,m=m|0,u=y(Zr(o+380+(n[976+(l<<2)>>2]<<3)|0,u)),u=y(u+y(yn(o,l,A))),n[d>>2]|0){case 2:case 1:{d=Mt(u)|0,A=y(h[m>>2]),h[m>>2]=d|A<u?A:u;break}case 0:{Mt(u)|0||(n[d>>2]=2,h[m>>2]=u);break}default:}}function ha(o,l){return o=o|0,l=l|0,o=o+132|0,de(l)|0&&n[(kn(o,4,948)|0)+4>>2]|0?o=1:o=(n[(kn(o,n[1040+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,o|0}function zA(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0;return o=o+132|0,de(l)|0&&(A=kn(o,4,948)|0,(n[A+4>>2]|0)!=0)?d=4:(A=kn(o,n[1040+(l<<2)>>2]|0,948)|0,n[A+4>>2]|0?d=4:u=y(0)),(d|0)==4&&(u=y(Zr(A,u))),y(u)}function XA(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return A=y(h[o+908+(n[976+(l<<2)>>2]<<2)>>2]),A=y(A+y(K(o,l,u))),y(A+y(re(o,l,u)))}function jL(o){o=o|0;var l=0,u=0,A=0;e:do if(Jg(n[o+4>>2]|0)|0)l=0;else if((n[o+16>>2]|0)!=5)if(u=Mi(o)|0,!u)l=0;else for(l=0;;){if(A=Is(o,l)|0,!(n[A+24>>2]|0)&&(n[A+20>>2]|0)==5){l=1;break e}if(l=l+1|0,l>>>0>=u>>>0){l=0;break}}else l=1;while(!1);return l|0}function qL(o,l){o=o|0,l=l|0;var u=$e;return u=y(h[o+908+(n[976+(l<<2)>>2]<<2)>>2]),u>=y(0)&((Mt(u)|0)^1)|0}function Yg(o){o=o|0;var l=$e,u=0,A=0,d=0,m=0,B=0,k=0,T=$e;if(u=n[o+968>>2]|0,u)T=y(h[o+908>>2]),l=y(h[o+912>>2]),l=y(LZ[u&0](o,T,l)),wi(o,(Mt(l)|0)^1,3573);else{m=Mi(o)|0;do if(m|0){for(u=0,d=0;;){if(A=Is(o,d)|0,n[A+940>>2]|0){B=8;break}if((n[A+24>>2]|0)!=1)if(k=(os(o,A)|0)==5,k){u=A;break}else u=u|0?u:A;if(d=d+1|0,d>>>0>=m>>>0){B=8;break}}if((B|0)==8&&!u)break;return l=y(Yg(u)),y(l+y(h[u+404>>2]))}while(!1);l=y(h[o+912>>2])}return y(l)}function Vg(o,l,u,A){o=o|0,l=l|0,u=y(u),A=y(A);var d=$e,m=0;return Jg(l)|0?(l=1,m=3):de(l)|0?(l=0,m=3):(A=y(le),d=y(le)),(m|0)==3&&(d=y(Zr(o+364+(l<<3)|0,A)),A=y(Zr(o+380+(l<<3)|0,A))),m=A<u&(A>=y(0)&((Mt(A)|0)^1)),u=m?A:u,m=d>=y(0)&((Mt(d)|0)^1)&u<d,y(m?d:u)}function WL(o,l,u,A,d,m,B){o=o|0,l=l|0,u=y(u),A=A|0,d=y(d),m=m|0,B=B|0;var k=$e,T=$e,M=0,L=0,q=$e,ae=$e,Ye=$e,Le=0,Qe=0,tt=0,Ze=0,ct=$e,He=0;tt=dr(n[o+4>>2]|0,m)|0,Le=by(tt,m)|0,Qe=de(tt)|0,q=y(yn(l,2,u)),ae=y(yn(l,0,u)),io(l,2,u)|0?k=y(q+y(Zr(n[l+992>>2]|0,u))):ha(l,2)|0&&xy(l,2)|0?(k=y(h[o+908>>2]),T=y(vr(o,2)),T=y(k-y(T+y(Un(o,2)))),k=y(zA(l,2,u)),k=y(qn(l,2,y(T-y(k+y(Th(l,2,u)))),u,u))):k=y(le),io(l,0,d)|0?T=y(ae+y(Zr(n[l+996>>2]|0,d))):ha(l,0)|0&&xy(l,0)|0?(T=y(h[o+912>>2]),ct=y(vr(o,0)),ct=y(T-y(ct+y(Un(o,0)))),T=y(zA(l,0,d)),T=y(qn(l,0,y(ct-y(T+y(Th(l,0,d)))),d,u))):T=y(le),M=Mt(k)|0,L=Mt(T)|0;do if(M^L&&(Ye=y(h[l+396>>2]),!(Mt(Ye)|0)))if(M){k=y(q+y(y(T-ae)*Ye));break}else{ct=y(ae+y(y(k-q)/Ye)),T=L?ct:T;break}while(!1);L=Mt(k)|0,M=Mt(T)|0,L|M&&(He=(L^1)&1,A=u>y(0)&((A|0)!=0&L),k=Qe?k:A?u:k,xl(l,k,T,m,Qe?He:A?2:He,L&(M^1)&1,k,T,0,3623,B)|0,k=y(h[l+908>>2]),k=y(k+y(yn(l,2,u))),T=y(h[l+912>>2]),T=y(T+y(yn(l,0,u)))),xl(l,k,T,m,1,1,k,T,1,3635,B)|0,xy(l,tt)|0&&!(ha(l,tt)|0)?(He=n[976+(tt<<2)>>2]|0,ct=y(h[o+908+(He<<2)>>2]),ct=y(ct-y(h[l+908+(He<<2)>>2])),ct=y(ct-y(Un(o,tt))),ct=y(ct-y(re(l,tt,u))),ct=y(ct-y(Th(l,tt,Qe?u:d))),h[l+400+(n[1040+(tt<<2)>>2]<<2)>>2]=ct):Ze=21;do if((Ze|0)==21){if(!(ha(l,tt)|0)&&(n[o+8>>2]|0)==1){He=n[976+(tt<<2)>>2]|0,ct=y(h[o+908+(He<<2)>>2]),ct=y(y(ct-y(h[l+908+(He<<2)>>2]))*y(.5)),h[l+400+(n[1040+(tt<<2)>>2]<<2)>>2]=ct;break}!(ha(l,tt)|0)&&(n[o+8>>2]|0)==2&&(He=n[976+(tt<<2)>>2]|0,ct=y(h[o+908+(He<<2)>>2]),ct=y(ct-y(h[l+908+(He<<2)>>2])),h[l+400+(n[1040+(tt<<2)>>2]<<2)>>2]=ct)}while(!1);xy(l,Le)|0&&!(ha(l,Le)|0)?(He=n[976+(Le<<2)>>2]|0,ct=y(h[o+908+(He<<2)>>2]),ct=y(ct-y(h[l+908+(He<<2)>>2])),ct=y(ct-y(Un(o,Le))),ct=y(ct-y(re(l,Le,u))),ct=y(ct-y(Th(l,Le,Qe?d:u))),h[l+400+(n[1040+(Le<<2)>>2]<<2)>>2]=ct):Ze=30;do if((Ze|0)==30&&!(ha(l,Le)|0)){if((os(o,l)|0)==2){He=n[976+(Le<<2)>>2]|0,ct=y(h[o+908+(He<<2)>>2]),ct=y(y(ct-y(h[l+908+(He<<2)>>2]))*y(.5)),h[l+400+(n[1040+(Le<<2)>>2]<<2)>>2]=ct;break}He=(os(o,l)|0)==3,He^(n[o+28>>2]|0)==2&&(He=n[976+(Le<<2)>>2]|0,ct=y(h[o+908+(He<<2)>>2]),ct=y(ct-y(h[l+908+(He<<2)>>2])),h[l+400+(n[1040+(Le<<2)>>2]<<2)>>2]=ct)}while(!1)}function i2(o,l,u){o=o|0,l=l|0,u=u|0;var A=$e,d=0;d=n[976+(u<<2)>>2]|0,A=y(h[l+908+(d<<2)>>2]),A=y(y(h[o+908+(d<<2)>>2])-A),A=y(A-y(h[l+400+(n[1040+(u<<2)>>2]<<2)>>2])),h[l+400+(n[1e3+(u<<2)>>2]<<2)>>2]=A}function Jg(o){return o=o|0,(o|1|0)==1|0}function YL(o){o=o|0;var l=$e;switch(n[o+56>>2]|0){case 0:case 3:{l=y(h[o+40>>2]),l>y(0)&((Mt(l)|0)^1)?o=s[(n[o+976>>2]|0)+2>>0]|0?1056:992:o=1056;break}default:o=o+52|0}return o|0}function s2(o,l){return o=o|0,l=l|0,(s[o+l>>0]|0)!=0|0}function xy(o,l){return o=o|0,l=l|0,o=o+132|0,de(l)|0&&n[(kn(o,5,948)|0)+4>>2]|0?o=1:o=(n[(kn(o,n[1e3+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,o|0}function Th(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0;return o=o+132|0,de(l)|0&&(A=kn(o,5,948)|0,(n[A+4>>2]|0)!=0)?d=4:(A=kn(o,n[1e3+(l<<2)>>2]|0,948)|0,n[A+4>>2]|0?d=4:u=y(0)),(d|0)==4&&(u=y(Zr(A,u))),y(u)}function uP(o,l,u){return o=o|0,l=l|0,u=y(u),ha(o,l)|0?u=y(zA(o,l,u)):u=y(-y(Th(o,l,u))),y(u)}function fP(o){return o=y(o),h[S>>2]=o,n[S>>2]|0|0}function ky(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>1073741823)Nt();else{d=Kt(l<<2)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<2)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<2)}function AP(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function Qy(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-4-l|0)>>>2)<<2)),o=n[o>>2]|0,o|0&&It(o)}function pP(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;if(B=o+4|0,k=n[B>>2]|0,d=k-A|0,m=d>>2,o=l+(m<<2)|0,o>>>0<u>>>0){A=k;do n[A>>2]=n[o>>2],o=o+4|0,A=(n[B>>2]|0)+4|0,n[B>>2]=A;while(o>>>0<u>>>0)}m|0&&Q2(k+(0-m<<2)|0,l|0,d|0)|0}function hP(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0;return k=l+4|0,T=n[k>>2]|0,d=n[o>>2]|0,B=u,m=B-d|0,A=T+(0-(m>>2)<<2)|0,n[k>>2]=A,(m|0)>0&&Qr(A|0,d|0,m|0)|0,d=o+4|0,m=l+8|0,A=(n[d>>2]|0)-B|0,(A|0)>0&&(Qr(n[m>>2]|0,u|0,A|0)|0,n[m>>2]=(n[m>>2]|0)+(A>>>2<<2)),B=n[o>>2]|0,n[o>>2]=n[k>>2],n[k>>2]=B,B=n[d>>2]|0,n[d>>2]=n[m>>2],n[m>>2]=B,B=o+8|0,u=l+12|0,o=n[B>>2]|0,n[B>>2]=n[u>>2],n[u>>2]=o,n[l>>2]=n[k>>2],T|0}function o2(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;if(B=n[l>>2]|0,m=n[u>>2]|0,(B|0)!=(m|0)){d=o+8|0,u=((m+-4-B|0)>>>2)+1|0,o=B,A=n[d>>2]|0;do n[A>>2]=n[o>>2],A=(n[d>>2]|0)+4|0,n[d>>2]=A,o=o+4|0;while((o|0)!=(m|0));n[l>>2]=B+(u<<2)}}function a2(){ua()}function gP(){var o=0;return o=Kt(4)|0,l2(o),o|0}function l2(o){o=o|0,n[o>>2]=Ac()|0}function dP(o){o=o|0,o|0&&(Kg(o),It(o))}function Kg(o){o=o|0,st(n[o>>2]|0)}function VL(o,l,u){o=o|0,l=l|0,u=u|0,pc(n[o>>2]|0,l,u)}function Ty(o,l){o=o|0,l=y(l),Dh(n[o>>2]|0,l)}function Ry(o,l){return o=o|0,l=l|0,s2(n[o>>2]|0,l)|0}function Fy(){var o=0;return o=Kt(8)|0,zg(o,0),o|0}function zg(o,l){o=o|0,l=l|0,l?l=fa(n[l>>2]|0)|0:l=ns()|0,n[o>>2]=l,n[o+4>>2]=0,Tn(l,o)}function Ny(o){o=o|0;var l=0;return l=Kt(8)|0,zg(l,o),l|0}function Xg(o){o=o|0,o|0&&(Oy(o),It(o))}function Oy(o){o=o|0;var l=0;uc(n[o>>2]|0),l=o+4|0,o=n[l>>2]|0,n[l>>2]=0,o|0&&(Sf(o),It(o))}function Sf(o){o=o|0,Df(o)}function Df(o){o=o|0,o=n[o>>2]|0,o|0&&Na(o|0)}function c2(o){return o=o|0,Ga(o)|0}function u2(o){o=o|0;var l=0,u=0;u=o+4|0,l=n[u>>2]|0,n[u>>2]=0,l|0&&(Sf(l),It(l)),fc(n[o>>2]|0)}function Ly(o,l){o=o|0,l=l|0,An(n[o>>2]|0,n[l>>2]|0)}function JL(o,l){o=o|0,l=l|0,wh(n[o>>2]|0,l)}function KL(o,l,u){o=o|0,l=l|0,u=+u,Cy(n[o>>2]|0,l,y(u))}function My(o,l,u){o=o|0,l=l|0,u=+u,wy(n[o>>2]|0,l,y(u))}function f2(o,l){o=o|0,l=l|0,Eh(n[o>>2]|0,l)}function A2(o,l){o=o|0,l=l|0,So(n[o>>2]|0,l)}function xr(o,l){o=o|0,l=l|0,Ch(n[o>>2]|0,l)}function so(o,l){o=o|0,l=l|0,my(n[o>>2]|0,l)}function Xi(o,l){o=o|0,l=l|0,Ng(n[o>>2]|0,l)}function Ns(o,l){o=o|0,l=l|0,vo(n[o>>2]|0,l)}function ZA(o,l,u){o=o|0,l=l|0,u=+u,HA(n[o>>2]|0,l,y(u))}function p2(o,l,u){o=o|0,l=l|0,u=+u,Y(n[o>>2]|0,l,y(u))}function ws(o,l){o=o|0,l=l|0,jA(n[o>>2]|0,l)}function Uy(o,l){o=o|0,l=l|0,Ey(n[o>>2]|0,l)}function Rh(o,l){o=o|0,l=l|0,Do(n[o>>2]|0,l)}function Zg(o,l){o=o|0,l=+l,Bh(n[o>>2]|0,y(l))}function Fh(o,l){o=o|0,l=+l,bl(n[o>>2]|0,y(l))}function h2(o,l){o=o|0,l=+l,Iy(n[o>>2]|0,y(l))}function g2(o,l){o=o|0,l=+l,Lg(n[o>>2]|0,y(l))}function d2(o,l){o=o|0,l=+l,Dl(n[o>>2]|0,y(l))}function m2(o,l){o=o|0,l=+l,Mg(n[o>>2]|0,y(l))}function bf(o,l){o=o|0,l=+l,e2(n[o>>2]|0,y(l))}function sr(o){o=o|0,vh(n[o>>2]|0)}function _y(o,l){o=o|0,l=+l,zi(n[o>>2]|0,y(l))}function y2(o,l){o=o|0,l=+l,yf(n[o>>2]|0,y(l))}function hc(o){o=o|0,qa(n[o>>2]|0)}function Pf(o,l){o=o|0,l=+l,du(n[o>>2]|0,y(l))}function $g(o,l){o=o|0,l=+l,Ef(n[o>>2]|0,y(l))}function ed(o,l){o=o|0,l=+l,di(n[o>>2]|0,y(l))}function E2(o,l){o=o|0,l=+l,GA(n[o>>2]|0,y(l))}function I2(o,l){o=o|0,l=+l,Aa(n[o>>2]|0,y(l))}function wu(o,l){o=o|0,l=+l,Ya(n[o>>2]|0,y(l))}function td(o,l){o=o|0,l=+l,Sh(n[o>>2]|0,y(l))}function C2(o,l){o=o|0,l=+l,Hg(n[o>>2]|0,y(l))}function Hy(o,l){o=o|0,l=+l,qA(n[o>>2]|0,y(l))}function Bu(o,l,u){o=o|0,l=l|0,u=+u,gu(n[o>>2]|0,l,y(u))}function jy(o,l,u){o=o|0,l=l|0,u=+u,bo(n[o>>2]|0,l,y(u))}function rd(o,l,u){o=o|0,l=l|0,u=+u,mf(n[o>>2]|0,l,y(u))}function nd(o){return o=o|0,Fg(n[o>>2]|0)|0}function ko(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;A=I,I=I+16|0,d=A,_A(d,n[l>>2]|0,u),Bs(o,d),I=A}function Bs(o,l){o=o|0,l=l|0,Tl(o,n[l+4>>2]|0,+y(h[l>>2]))}function Tl(o,l,u){o=o|0,l=l|0,u=+u,n[o>>2]=l,E[o+8>>3]=u}function Gy(o){return o=o|0,$1(n[o>>2]|0)|0}function ga(o){return o=o|0,Ih(n[o>>2]|0)|0}function mP(o){return o=o|0,hu(n[o>>2]|0)|0}function Nh(o){return o=o|0,Z1(n[o>>2]|0)|0}function w2(o){return o=o|0,Og(n[o>>2]|0)|0}function zL(o){return o=o|0,yy(n[o>>2]|0)|0}function yP(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;A=I,I=I+16|0,d=A,xt(d,n[l>>2]|0,u),Bs(o,d),I=A}function EP(o){return o=o|0,df(n[o>>2]|0)|0}function qy(o){return o=o|0,Sl(n[o>>2]|0)|0}function B2(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,UA(A,n[l>>2]|0),Bs(o,A),I=u}function Oh(o){return o=o|0,+ +y(li(n[o>>2]|0))}function IP(o){return o=o|0,+ +y(qi(n[o>>2]|0))}function CP(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,ur(A,n[l>>2]|0),Bs(o,A),I=u}function id(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,Ug(A,n[l>>2]|0),Bs(o,A),I=u}function XL(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,wt(A,n[l>>2]|0),Bs(o,A),I=u}function ZL(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,Wa(A,n[l>>2]|0),Bs(o,A),I=u}function wP(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,_g(A,n[l>>2]|0),Bs(o,A),I=u}function BP(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,vy(A,n[l>>2]|0),Bs(o,A),I=u}function $A(o){return o=o|0,+ +y(jg(n[o>>2]|0))}function $L(o,l){return o=o|0,l=l|0,+ +y(By(n[o>>2]|0,l))}function eM(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;A=I,I=I+16|0,d=A,yt(d,n[l>>2]|0,u),Bs(o,d),I=A}function vu(o,l,u){o=o|0,l=l|0,u=u|0,lr(n[o>>2]|0,n[l>>2]|0,u)}function tM(o,l){o=o|0,l=l|0,gf(n[o>>2]|0,n[l>>2]|0)}function vP(o){return o=o|0,Mi(n[o>>2]|0)|0}function rM(o){return o=o|0,o=Et(n[o>>2]|0)|0,o?o=c2(o)|0:o=0,o|0}function SP(o,l){return o=o|0,l=l|0,o=Is(n[o>>2]|0,l)|0,o?o=c2(o)|0:o=0,o|0}function xf(o,l){o=o|0,l=l|0;var u=0,A=0;A=Kt(4)|0,DP(A,l),u=o+4|0,l=n[u>>2]|0,n[u>>2]=A,l|0&&(Sf(l),It(l)),St(n[o>>2]|0,1)}function DP(o,l){o=o|0,l=l|0,oM(o,l)}function nM(o,l,u,A,d,m){o=o|0,l=l|0,u=y(u),A=A|0,d=y(d),m=m|0;var B=0,k=0;B=I,I=I+16|0,k=B,bP(k,Ga(l)|0,+u,A,+d,m),h[o>>2]=y(+E[k>>3]),h[o+4>>2]=y(+E[k+8>>3]),I=B}function bP(o,l,u,A,d,m){o=o|0,l=l|0,u=+u,A=A|0,d=+d,m=m|0;var B=0,k=0,T=0,M=0,L=0;B=I,I=I+32|0,L=B+8|0,M=B+20|0,T=B,k=B+16|0,E[L>>3]=u,n[M>>2]=A,E[T>>3]=d,n[k>>2]=m,Wy(o,n[l+4>>2]|0,L,M,T,k),I=B}function Wy(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0;var B=0,k=0;B=I,I=I+16|0,k=B,Fl(k),l=Os(l)|0,PP(o,l,+E[u>>3],n[A>>2]|0,+E[d>>3],n[m>>2]|0),Nl(k),I=B}function Os(o){return o=o|0,n[o>>2]|0}function PP(o,l,u,A,d,m){o=o|0,l=l|0,u=+u,A=A|0,d=+d,m=m|0;var B=0;B=da(v2()|0)|0,u=+Ja(u),A=Yy(A)|0,d=+Ja(d),iM(o,Kn(0,B|0,l|0,+u,A|0,+d,Yy(m)|0)|0)}function v2(){var o=0;return s[7608]|0||(D2(9120),o=7608,n[o>>2]=1,n[o+4>>2]=0),9120}function da(o){return o=o|0,n[o+8>>2]|0}function Ja(o){return o=+o,+ +kf(o)}function Yy(o){return o=o|0,sd(o)|0}function iM(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;d=I,I=I+32|0,u=d,A=l,A&1?(Ka(u,0),Me(A|0,u|0)|0,S2(o,u),sM(u)):(n[o>>2]=n[l>>2],n[o+4>>2]=n[l+4>>2],n[o+8>>2]=n[l+8>>2],n[o+12>>2]=n[l+12>>2]),I=d}function Ka(o,l){o=o|0,l=l|0,Su(o,l),n[o+8>>2]=0,s[o+24>>0]=0}function S2(o,l){o=o|0,l=l|0,l=l+8|0,n[o>>2]=n[l>>2],n[o+4>>2]=n[l+4>>2],n[o+8>>2]=n[l+8>>2],n[o+12>>2]=n[l+12>>2]}function sM(o){o=o|0,s[o+24>>0]=0}function Su(o,l){o=o|0,l=l|0,n[o>>2]=l}function sd(o){return o=o|0,o|0}function kf(o){return o=+o,+o}function D2(o){o=o|0,Qo(o,b2()|0,4)}function b2(){return 1064}function Qo(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u,n[o+8>>2]=Gi(l|0,u+1|0)|0}function oM(o,l){o=o|0,l=l|0,l=n[l>>2]|0,n[o>>2]=l,au(l|0)}function xP(o){o=o|0;var l=0,u=0;u=o+4|0,l=n[u>>2]|0,n[u>>2]=0,l|0&&(Sf(l),It(l)),St(n[o>>2]|0,0)}function kP(o){o=o|0,bt(n[o>>2]|0)}function Vy(o){return o=o|0,tr(n[o>>2]|0)|0}function aM(o,l,u,A){o=o|0,l=+l,u=+u,A=A|0,YA(n[o>>2]|0,y(l),y(u),A)}function lM(o){return o=o|0,+ +y(mu(n[o>>2]|0))}function v(o){return o=o|0,+ +y(If(n[o>>2]|0))}function D(o){return o=o|0,+ +y(yu(n[o>>2]|0))}function Q(o){return o=o|0,+ +y(Rs(n[o>>2]|0))}function H(o){return o=o|0,+ +y(Eu(n[o>>2]|0))}function V(o){return o=o|0,+ +y(Gn(n[o>>2]|0))}function ne(o,l){o=o|0,l=l|0,E[o>>3]=+y(mu(n[l>>2]|0)),E[o+8>>3]=+y(If(n[l>>2]|0)),E[o+16>>3]=+y(yu(n[l>>2]|0)),E[o+24>>3]=+y(Rs(n[l>>2]|0)),E[o+32>>3]=+y(Eu(n[l>>2]|0)),E[o+40>>3]=+y(Gn(n[l>>2]|0))}function Se(o,l){return o=o|0,l=l|0,+ +y(is(n[o>>2]|0,l))}function _e(o,l){return o=o|0,l=l|0,+ +y(Pi(n[o>>2]|0,l))}function pt(o,l){return o=o|0,l=l|0,+ +y(WA(n[o>>2]|0,l))}function Wt(){return Qn()|0}function Sr(){Lr(),Zt(),zn(),yi(),za(),et()}function Lr(){p4e(11713,4938,1)}function Zt(){T_e(10448)}function zn(){p_e(10408)}function yi(){OUe(10324)}function za(){qLe(10096)}function et(){qe(9132)}function qe(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0,tt=0,Ze=0,ct=0,He=0,We=0,Lt=0,Gr=0,fr=0,$t=0,Tr=0,Hr=0,cr=0,Hn=0,To=0,Ro=0,Fo=0,Za=0,Wh=0,Yh=0,gc=0,Vh=0,Rf=0,Ff=0,Jh=0,Kh=0,zh=0,ln=0,dc=0,Xh=0,Pu=0,Zh=0,$h=0,Nf=0,Of=0,xu=0,oo=0,Ll=0,ma=0,mc=0,op=0,ap=0,Lf=0,lp=0,cp=0,ao=0,Ms=0,yc=0,Wn=0,up=0,No=0,ku=0,Oo=0,Qu=0,fp=0,Ap=0,Tu=0,lo=0,Ec=0,pp=0,hp=0,gp=0,Nr=0,ui=0,Us=0,Lo=0,co=0,Mr=0,Ar=0,Ic=0;l=I,I=I+672|0,u=l+656|0,Ic=l+648|0,Ar=l+640|0,Mr=l+632|0,co=l+624|0,Lo=l+616|0,Us=l+608|0,ui=l+600|0,Nr=l+592|0,gp=l+584|0,hp=l+576|0,pp=l+568|0,Ec=l+560|0,lo=l+552|0,Tu=l+544|0,Ap=l+536|0,fp=l+528|0,Qu=l+520|0,Oo=l+512|0,ku=l+504|0,No=l+496|0,up=l+488|0,Wn=l+480|0,yc=l+472|0,Ms=l+464|0,ao=l+456|0,cp=l+448|0,lp=l+440|0,Lf=l+432|0,ap=l+424|0,op=l+416|0,mc=l+408|0,ma=l+400|0,Ll=l+392|0,oo=l+384|0,xu=l+376|0,Of=l+368|0,Nf=l+360|0,$h=l+352|0,Zh=l+344|0,Pu=l+336|0,Xh=l+328|0,dc=l+320|0,ln=l+312|0,zh=l+304|0,Kh=l+296|0,Jh=l+288|0,Ff=l+280|0,Rf=l+272|0,Vh=l+264|0,gc=l+256|0,Yh=l+248|0,Wh=l+240|0,Za=l+232|0,Fo=l+224|0,Ro=l+216|0,To=l+208|0,Hn=l+200|0,cr=l+192|0,Hr=l+184|0,Tr=l+176|0,$t=l+168|0,fr=l+160|0,Gr=l+152|0,Lt=l+144|0,We=l+136|0,He=l+128|0,ct=l+120|0,Ze=l+112|0,tt=l+104|0,Qe=l+96|0,Le=l+88|0,Ye=l+80|0,ae=l+72|0,q=l+64|0,L=l+56|0,M=l+48|0,T=l+40|0,k=l+32|0,B=l+24|0,m=l+16|0,d=l+8|0,A=l,gt(o,3646),Xt(o,3651,2)|0,Dr(o,3665,2)|0,Zn(o,3682,18)|0,n[Ic>>2]=19,n[Ic+4>>2]=0,n[u>>2]=n[Ic>>2],n[u+4>>2]=n[Ic+4>>2],kr(o,3690,u)|0,n[Ar>>2]=1,n[Ar+4>>2]=0,n[u>>2]=n[Ar>>2],n[u+4>>2]=n[Ar+4>>2],Rn(o,3696,u)|0,n[Mr>>2]=2,n[Mr+4>>2]=0,n[u>>2]=n[Mr>>2],n[u+4>>2]=n[Mr+4>>2],_n(o,3706,u)|0,n[co>>2]=1,n[co+4>>2]=0,n[u>>2]=n[co>>2],n[u+4>>2]=n[co+4>>2],zr(o,3722,u)|0,n[Lo>>2]=2,n[Lo+4>>2]=0,n[u>>2]=n[Lo>>2],n[u+4>>2]=n[Lo+4>>2],zr(o,3734,u)|0,n[Us>>2]=3,n[Us+4>>2]=0,n[u>>2]=n[Us>>2],n[u+4>>2]=n[Us+4>>2],_n(o,3753,u)|0,n[ui>>2]=4,n[ui+4>>2]=0,n[u>>2]=n[ui>>2],n[u+4>>2]=n[ui+4>>2],_n(o,3769,u)|0,n[Nr>>2]=5,n[Nr+4>>2]=0,n[u>>2]=n[Nr>>2],n[u+4>>2]=n[Nr+4>>2],_n(o,3783,u)|0,n[gp>>2]=6,n[gp+4>>2]=0,n[u>>2]=n[gp>>2],n[u+4>>2]=n[gp+4>>2],_n(o,3796,u)|0,n[hp>>2]=7,n[hp+4>>2]=0,n[u>>2]=n[hp>>2],n[u+4>>2]=n[hp+4>>2],_n(o,3813,u)|0,n[pp>>2]=8,n[pp+4>>2]=0,n[u>>2]=n[pp>>2],n[u+4>>2]=n[pp+4>>2],_n(o,3825,u)|0,n[Ec>>2]=3,n[Ec+4>>2]=0,n[u>>2]=n[Ec>>2],n[u+4>>2]=n[Ec+4>>2],zr(o,3843,u)|0,n[lo>>2]=4,n[lo+4>>2]=0,n[u>>2]=n[lo>>2],n[u+4>>2]=n[lo+4>>2],zr(o,3853,u)|0,n[Tu>>2]=9,n[Tu+4>>2]=0,n[u>>2]=n[Tu>>2],n[u+4>>2]=n[Tu+4>>2],_n(o,3870,u)|0,n[Ap>>2]=10,n[Ap+4>>2]=0,n[u>>2]=n[Ap>>2],n[u+4>>2]=n[Ap+4>>2],_n(o,3884,u)|0,n[fp>>2]=11,n[fp+4>>2]=0,n[u>>2]=n[fp>>2],n[u+4>>2]=n[fp+4>>2],_n(o,3896,u)|0,n[Qu>>2]=1,n[Qu+4>>2]=0,n[u>>2]=n[Qu>>2],n[u+4>>2]=n[Qu+4>>2],ci(o,3907,u)|0,n[Oo>>2]=2,n[Oo+4>>2]=0,n[u>>2]=n[Oo>>2],n[u+4>>2]=n[Oo+4>>2],ci(o,3915,u)|0,n[ku>>2]=3,n[ku+4>>2]=0,n[u>>2]=n[ku>>2],n[u+4>>2]=n[ku+4>>2],ci(o,3928,u)|0,n[No>>2]=4,n[No+4>>2]=0,n[u>>2]=n[No>>2],n[u+4>>2]=n[No+4>>2],ci(o,3948,u)|0,n[up>>2]=5,n[up+4>>2]=0,n[u>>2]=n[up>>2],n[u+4>>2]=n[up+4>>2],ci(o,3960,u)|0,n[Wn>>2]=6,n[Wn+4>>2]=0,n[u>>2]=n[Wn>>2],n[u+4>>2]=n[Wn+4>>2],ci(o,3974,u)|0,n[yc>>2]=7,n[yc+4>>2]=0,n[u>>2]=n[yc>>2],n[u+4>>2]=n[yc+4>>2],ci(o,3983,u)|0,n[Ms>>2]=20,n[Ms+4>>2]=0,n[u>>2]=n[Ms>>2],n[u+4>>2]=n[Ms+4>>2],kr(o,3999,u)|0,n[ao>>2]=8,n[ao+4>>2]=0,n[u>>2]=n[ao>>2],n[u+4>>2]=n[ao+4>>2],ci(o,4012,u)|0,n[cp>>2]=9,n[cp+4>>2]=0,n[u>>2]=n[cp>>2],n[u+4>>2]=n[cp+4>>2],ci(o,4022,u)|0,n[lp>>2]=21,n[lp+4>>2]=0,n[u>>2]=n[lp>>2],n[u+4>>2]=n[lp+4>>2],kr(o,4039,u)|0,n[Lf>>2]=10,n[Lf+4>>2]=0,n[u>>2]=n[Lf>>2],n[u+4>>2]=n[Lf+4>>2],ci(o,4053,u)|0,n[ap>>2]=11,n[ap+4>>2]=0,n[u>>2]=n[ap>>2],n[u+4>>2]=n[ap+4>>2],ci(o,4065,u)|0,n[op>>2]=12,n[op+4>>2]=0,n[u>>2]=n[op>>2],n[u+4>>2]=n[op+4>>2],ci(o,4084,u)|0,n[mc>>2]=13,n[mc+4>>2]=0,n[u>>2]=n[mc>>2],n[u+4>>2]=n[mc+4>>2],ci(o,4097,u)|0,n[ma>>2]=14,n[ma+4>>2]=0,n[u>>2]=n[ma>>2],n[u+4>>2]=n[ma+4>>2],ci(o,4117,u)|0,n[Ll>>2]=15,n[Ll+4>>2]=0,n[u>>2]=n[Ll>>2],n[u+4>>2]=n[Ll+4>>2],ci(o,4129,u)|0,n[oo>>2]=16,n[oo+4>>2]=0,n[u>>2]=n[oo>>2],n[u+4>>2]=n[oo+4>>2],ci(o,4148,u)|0,n[xu>>2]=17,n[xu+4>>2]=0,n[u>>2]=n[xu>>2],n[u+4>>2]=n[xu+4>>2],ci(o,4161,u)|0,n[Of>>2]=18,n[Of+4>>2]=0,n[u>>2]=n[Of>>2],n[u+4>>2]=n[Of+4>>2],ci(o,4181,u)|0,n[Nf>>2]=5,n[Nf+4>>2]=0,n[u>>2]=n[Nf>>2],n[u+4>>2]=n[Nf+4>>2],zr(o,4196,u)|0,n[$h>>2]=6,n[$h+4>>2]=0,n[u>>2]=n[$h>>2],n[u+4>>2]=n[$h+4>>2],zr(o,4206,u)|0,n[Zh>>2]=7,n[Zh+4>>2]=0,n[u>>2]=n[Zh>>2],n[u+4>>2]=n[Zh+4>>2],zr(o,4217,u)|0,n[Pu>>2]=3,n[Pu+4>>2]=0,n[u>>2]=n[Pu>>2],n[u+4>>2]=n[Pu+4>>2],Du(o,4235,u)|0,n[Xh>>2]=1,n[Xh+4>>2]=0,n[u>>2]=n[Xh>>2],n[u+4>>2]=n[Xh+4>>2],cM(o,4251,u)|0,n[dc>>2]=4,n[dc+4>>2]=0,n[u>>2]=n[dc>>2],n[u+4>>2]=n[dc+4>>2],Du(o,4263,u)|0,n[ln>>2]=5,n[ln+4>>2]=0,n[u>>2]=n[ln>>2],n[u+4>>2]=n[ln+4>>2],Du(o,4279,u)|0,n[zh>>2]=6,n[zh+4>>2]=0,n[u>>2]=n[zh>>2],n[u+4>>2]=n[zh+4>>2],Du(o,4293,u)|0,n[Kh>>2]=7,n[Kh+4>>2]=0,n[u>>2]=n[Kh>>2],n[u+4>>2]=n[Kh+4>>2],Du(o,4306,u)|0,n[Jh>>2]=8,n[Jh+4>>2]=0,n[u>>2]=n[Jh>>2],n[u+4>>2]=n[Jh+4>>2],Du(o,4323,u)|0,n[Ff>>2]=9,n[Ff+4>>2]=0,n[u>>2]=n[Ff>>2],n[u+4>>2]=n[Ff+4>>2],Du(o,4335,u)|0,n[Rf>>2]=2,n[Rf+4>>2]=0,n[u>>2]=n[Rf>>2],n[u+4>>2]=n[Rf+4>>2],cM(o,4353,u)|0,n[Vh>>2]=12,n[Vh+4>>2]=0,n[u>>2]=n[Vh>>2],n[u+4>>2]=n[Vh+4>>2],od(o,4363,u)|0,n[gc>>2]=1,n[gc+4>>2]=0,n[u>>2]=n[gc>>2],n[u+4>>2]=n[gc+4>>2],ep(o,4376,u)|0,n[Yh>>2]=2,n[Yh+4>>2]=0,n[u>>2]=n[Yh>>2],n[u+4>>2]=n[Yh+4>>2],ep(o,4388,u)|0,n[Wh>>2]=13,n[Wh+4>>2]=0,n[u>>2]=n[Wh>>2],n[u+4>>2]=n[Wh+4>>2],od(o,4402,u)|0,n[Za>>2]=14,n[Za+4>>2]=0,n[u>>2]=n[Za>>2],n[u+4>>2]=n[Za+4>>2],od(o,4411,u)|0,n[Fo>>2]=15,n[Fo+4>>2]=0,n[u>>2]=n[Fo>>2],n[u+4>>2]=n[Fo+4>>2],od(o,4421,u)|0,n[Ro>>2]=16,n[Ro+4>>2]=0,n[u>>2]=n[Ro>>2],n[u+4>>2]=n[Ro+4>>2],od(o,4433,u)|0,n[To>>2]=17,n[To+4>>2]=0,n[u>>2]=n[To>>2],n[u+4>>2]=n[To+4>>2],od(o,4446,u)|0,n[Hn>>2]=18,n[Hn+4>>2]=0,n[u>>2]=n[Hn>>2],n[u+4>>2]=n[Hn+4>>2],od(o,4458,u)|0,n[cr>>2]=3,n[cr+4>>2]=0,n[u>>2]=n[cr>>2],n[u+4>>2]=n[cr+4>>2],ep(o,4471,u)|0,n[Hr>>2]=1,n[Hr+4>>2]=0,n[u>>2]=n[Hr>>2],n[u+4>>2]=n[Hr+4>>2],QP(o,4486,u)|0,n[Tr>>2]=10,n[Tr+4>>2]=0,n[u>>2]=n[Tr>>2],n[u+4>>2]=n[Tr+4>>2],Du(o,4496,u)|0,n[$t>>2]=11,n[$t+4>>2]=0,n[u>>2]=n[$t>>2],n[u+4>>2]=n[$t+4>>2],Du(o,4508,u)|0,n[fr>>2]=3,n[fr+4>>2]=0,n[u>>2]=n[fr>>2],n[u+4>>2]=n[fr+4>>2],cM(o,4519,u)|0,n[Gr>>2]=4,n[Gr+4>>2]=0,n[u>>2]=n[Gr>>2],n[u+4>>2]=n[Gr+4>>2],Cke(o,4530,u)|0,n[Lt>>2]=19,n[Lt+4>>2]=0,n[u>>2]=n[Lt>>2],n[u+4>>2]=n[Lt+4>>2],wke(o,4542,u)|0,n[We>>2]=12,n[We+4>>2]=0,n[u>>2]=n[We>>2],n[u+4>>2]=n[We+4>>2],Bke(o,4554,u)|0,n[He>>2]=13,n[He+4>>2]=0,n[u>>2]=n[He>>2],n[u+4>>2]=n[He+4>>2],vke(o,4568,u)|0,n[ct>>2]=2,n[ct+4>>2]=0,n[u>>2]=n[ct>>2],n[u+4>>2]=n[ct+4>>2],Ske(o,4578,u)|0,n[Ze>>2]=20,n[Ze+4>>2]=0,n[u>>2]=n[Ze>>2],n[u+4>>2]=n[Ze+4>>2],Dke(o,4587,u)|0,n[tt>>2]=22,n[tt+4>>2]=0,n[u>>2]=n[tt>>2],n[u+4>>2]=n[tt+4>>2],kr(o,4602,u)|0,n[Qe>>2]=23,n[Qe+4>>2]=0,n[u>>2]=n[Qe>>2],n[u+4>>2]=n[Qe+4>>2],kr(o,4619,u)|0,n[Le>>2]=14,n[Le+4>>2]=0,n[u>>2]=n[Le>>2],n[u+4>>2]=n[Le+4>>2],bke(o,4629,u)|0,n[Ye>>2]=1,n[Ye+4>>2]=0,n[u>>2]=n[Ye>>2],n[u+4>>2]=n[Ye+4>>2],Pke(o,4637,u)|0,n[ae>>2]=4,n[ae+4>>2]=0,n[u>>2]=n[ae>>2],n[u+4>>2]=n[ae+4>>2],ep(o,4653,u)|0,n[q>>2]=5,n[q+4>>2]=0,n[u>>2]=n[q>>2],n[u+4>>2]=n[q+4>>2],ep(o,4669,u)|0,n[L>>2]=6,n[L+4>>2]=0,n[u>>2]=n[L>>2],n[u+4>>2]=n[L+4>>2],ep(o,4686,u)|0,n[M>>2]=7,n[M+4>>2]=0,n[u>>2]=n[M>>2],n[u+4>>2]=n[M+4>>2],ep(o,4701,u)|0,n[T>>2]=8,n[T+4>>2]=0,n[u>>2]=n[T>>2],n[u+4>>2]=n[T+4>>2],ep(o,4719,u)|0,n[k>>2]=9,n[k+4>>2]=0,n[u>>2]=n[k>>2],n[u+4>>2]=n[k+4>>2],ep(o,4736,u)|0,n[B>>2]=21,n[B+4>>2]=0,n[u>>2]=n[B>>2],n[u+4>>2]=n[B+4>>2],xke(o,4754,u)|0,n[m>>2]=2,n[m+4>>2]=0,n[u>>2]=n[m>>2],n[u+4>>2]=n[m+4>>2],QP(o,4772,u)|0,n[d>>2]=3,n[d+4>>2]=0,n[u>>2]=n[d>>2],n[u+4>>2]=n[d+4>>2],QP(o,4790,u)|0,n[A>>2]=4,n[A+4>>2]=0,n[u>>2]=n[A>>2],n[u+4>>2]=n[A+4>>2],QP(o,4808,u)|0,I=l}function gt(o,l){o=o|0,l=l|0;var u=0;u=NLe()|0,n[o>>2]=u,OLe(u,l),jh(n[o>>2]|0)}function Xt(o,l,u){return o=o|0,l=l|0,u=u|0,CLe(o,Bn(l)|0,u,0),o|0}function Dr(o,l,u){return o=o|0,l=l|0,u=u|0,sLe(o,Bn(l)|0,u,0),o|0}function Zn(o,l,u){return o=o|0,l=l|0,u=u|0,WOe(o,Bn(l)|0,u,0),o|0}function kr(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xOe(o,l,d),I=A,o|0}function Rn(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],uOe(o,l,d),I=A,o|0}function _n(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],JNe(o,l,d),I=A,o|0}function zr(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],TNe(o,l,d),I=A,o|0}function ci(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],dNe(o,l,d),I=A,o|0}function Du(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],eNe(o,l,d),I=A,o|0}function cM(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],MFe(o,l,d),I=A,o|0}function od(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],uFe(o,l,d),I=A,o|0}function ep(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],JRe(o,l,d),I=A,o|0}function QP(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],TRe(o,l,d),I=A,o|0}function Cke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],dRe(o,l,d),I=A,o|0}function wke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],eRe(o,l,d),I=A,o|0}function Bke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],UTe(o,l,d),I=A,o|0}function vke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],vTe(o,l,d),I=A,o|0}function Ske(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],aTe(o,l,d),I=A,o|0}function Dke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],qQe(o,l,d),I=A,o|0}function bke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],PQe(o,l,d),I=A,o|0}function Pke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],uQe(o,l,d),I=A,o|0}function xke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],kke(o,l,d),I=A,o|0}function kke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Qke(o,u,d,1),I=A}function Bn(o){return o=o|0,o|0}function Qke(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=uM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=Tke(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,Rke(m,A)|0,A),I=d}function uM(){var o=0,l=0;if(s[7616]|0||(mz(9136),gr(24,9136,U|0)|0,l=7616,n[l>>2]=1,n[l+4>>2]=0),!(_r(9136)|0)){o=9136,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));mz(9136)}return 9136}function Tke(o){return o=o|0,0}function Rke(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=uM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],dz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(Oke(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function vn(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0;var B=0,k=0,T=0,M=0,L=0,q=0,ae=0,Ye=0;B=I,I=I+32|0,ae=B+24|0,q=B+20|0,T=B+16|0,L=B+12|0,M=B+8|0,k=B+4|0,Ye=B,n[q>>2]=l,n[T>>2]=u,n[L>>2]=A,n[M>>2]=d,n[k>>2]=m,m=o+28|0,n[Ye>>2]=n[m>>2],n[ae>>2]=n[Ye>>2],Fke(o+24|0,ae,q,L,M,T,k)|0,n[m>>2]=n[n[m>>2]>>2],I=B}function Fke(o,l,u,A,d,m,B){return o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,B=B|0,o=Nke(l)|0,l=Kt(24)|0,gz(l+4|0,n[u>>2]|0,n[A>>2]|0,n[d>>2]|0,n[m>>2]|0,n[B>>2]|0),n[l>>2]=n[o>>2],n[o>>2]=l,l|0}function Nke(o){return o=o|0,n[o>>2]|0}function gz(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,n[o>>2]=l,n[o+4>>2]=u,n[o+8>>2]=A,n[o+12>>2]=d,n[o+16>>2]=m}function yr(o,l){return o=o|0,l=l|0,l|o|0}function dz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function Oke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=Lke(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,Mke(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],dz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,Uke(o,k),_ke(k),I=M;return}}function Lke(o){return o=o|0,357913941}function Mke(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function Uke(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function _ke(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function mz(o){o=o|0,Gke(o)}function Hke(o){o=o|0,jke(o+24|0)}function _r(o){return o=o|0,n[o>>2]|0}function jke(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function Gke(o){o=o|0;var l=0;l=tn()|0,rn(o,2,3,l,qke()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function tn(){return 9228}function qke(){return 1140}function Wke(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;return u=I,I=I+16|0,A=u+8|0,d=u,m=Yke(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],l=Vke(l,A)|0,I=u,l|0}function rn(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,n[o>>2]=l,n[o+4>>2]=u,n[o+8>>2]=A,n[o+12>>2]=d,n[o+16>>2]=m}function Yke(o){return o=o|0,(n[(uM()|0)+24>>2]|0)+(o*12|0)|0}function Vke(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;return d=I,I=I+48|0,A=d,u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),sp[u&31](A,o),A=Jke(A)|0,I=d,A|0}function Jke(o){o=o|0;var l=0,u=0,A=0,d=0;return d=I,I=I+32|0,l=d+12|0,u=d,A=fM(yz()|0)|0,A?(AM(l,A),pM(u,l),Kke(o,u),o=hM(l)|0):o=zke(o)|0,I=d,o|0}function yz(){var o=0;return s[7632]|0||(oQe(9184),gr(25,9184,U|0)|0,o=7632,n[o>>2]=1,n[o+4>>2]=0),9184}function fM(o){return o=o|0,n[o+36>>2]|0}function AM(o,l){o=o|0,l=l|0,n[o>>2]=l,n[o+4>>2]=o,n[o+8>>2]=0}function pM(o,l){o=o|0,l=l|0,n[o>>2]=n[l>>2],n[o+4>>2]=n[l+4>>2],n[o+8>>2]=0}function Kke(o,l){o=o|0,l=l|0,eQe(l,o,o+8|0,o+16|0,o+24|0,o+32|0,o+40|0)|0}function hM(o){return o=o|0,n[(n[o+4>>2]|0)+8>>2]|0}function zke(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0,T=0;T=I,I=I+16|0,u=T+4|0,A=T,d=Rl(8)|0,m=d,B=Kt(48)|0,k=B,l=k+48|0;do n[k>>2]=n[o>>2],k=k+4|0,o=o+4|0;while((k|0)<(l|0));return l=m+4|0,n[l>>2]=B,k=Kt(8)|0,B=n[l>>2]|0,n[A>>2]=0,n[u>>2]=n[A>>2],Ez(k,B,u),n[d>>2]=k,I=T,m|0}function Ez(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Kt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1092,n[u+12>>2]=l,n[o+4>>2]=u}function Xke(o){o=o|0,$y(o),It(o)}function Zke(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function $ke(o){o=o|0,It(o)}function eQe(o,l,u,A,d,m,B){return o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,B=B|0,m=tQe(n[o>>2]|0,l,u,A,d,m,B)|0,B=o+4|0,n[(n[B>>2]|0)+8>>2]=m,n[(n[B>>2]|0)+8>>2]|0}function tQe(o,l,u,A,d,m,B){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,B=B|0;var k=0,T=0;return k=I,I=I+16|0,T=k,Fl(T),o=Os(o)|0,B=rQe(o,+E[l>>3],+E[u>>3],+E[A>>3],+E[d>>3],+E[m>>3],+E[B>>3])|0,Nl(T),I=k,B|0}function rQe(o,l,u,A,d,m,B){o=o|0,l=+l,u=+u,A=+A,d=+d,m=+m,B=+B;var k=0;return k=da(nQe()|0)|0,l=+Ja(l),u=+Ja(u),A=+Ja(A),d=+Ja(d),m=+Ja(m),ro(0,k|0,o|0,+l,+u,+A,+d,+m,+ +Ja(B))|0}function nQe(){var o=0;return s[7624]|0||(iQe(9172),o=7624,n[o>>2]=1,n[o+4>>2]=0),9172}function iQe(o){o=o|0,Qo(o,sQe()|0,6)}function sQe(){return 1112}function oQe(o){o=o|0,Lh(o)}function aQe(o){o=o|0,Iz(o+24|0),Cz(o+16|0)}function Iz(o){o=o|0,cQe(o)}function Cz(o){o=o|0,lQe(o)}function lQe(o){o=o|0;var l=0,u=0;if(l=n[o>>2]|0,l|0)do u=l,l=n[l>>2]|0,It(u);while(l|0);n[o>>2]=0}function cQe(o){o=o|0;var l=0,u=0;if(l=n[o>>2]|0,l|0)do u=l,l=n[l>>2]|0,It(u);while(l|0);n[o>>2]=0}function Lh(o){o=o|0;var l=0;n[o+16>>2]=0,n[o+20>>2]=0,l=o+24|0,n[l>>2]=0,n[o+28>>2]=l,n[o+36>>2]=0,s[o+40>>0]=0,s[o+41>>0]=0}function uQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],fQe(o,u,d,0),I=A}function fQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=gM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=AQe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,pQe(m,A)|0,A),I=d}function gM(){var o=0,l=0;if(s[7640]|0||(Bz(9232),gr(26,9232,U|0)|0,l=7640,n[l>>2]=1,n[l+4>>2]=0),!(_r(9232)|0)){o=9232,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Bz(9232)}return 9232}function AQe(o){return o=o|0,0}function pQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=gM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],wz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(hQe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function wz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function hQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=gQe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,dQe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],wz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,mQe(o,k),yQe(k),I=M;return}}function gQe(o){return o=o|0,357913941}function dQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function mQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function yQe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Bz(o){o=o|0,CQe(o)}function EQe(o){o=o|0,IQe(o+24|0)}function IQe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function CQe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,1,l,wQe()|0,3),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function wQe(){return 1144}function BQe(o,l,u,A,d){o=o|0,l=l|0,u=+u,A=+A,d=d|0;var m=0,B=0,k=0,T=0;m=I,I=I+16|0,B=m+8|0,k=m,T=vQe(o)|0,o=n[T+4>>2]|0,n[k>>2]=n[T>>2],n[k+4>>2]=o,n[B>>2]=n[k>>2],n[B+4>>2]=n[k+4>>2],SQe(l,B,u,A,d),I=m}function vQe(o){return o=o|0,(n[(gM()|0)+24>>2]|0)+(o*12|0)|0}function SQe(o,l,u,A,d){o=o|0,l=l|0,u=+u,A=+A,d=d|0;var m=0,B=0,k=0,T=0,M=0;M=I,I=I+16|0,B=M+2|0,k=M+1|0,T=M,m=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(m=n[(n[o>>2]|0)+m>>2]|0),Qf(B,u),u=+Tf(B,u),Qf(k,A),A=+Tf(k,A),tp(T,d),T=rp(T,d)|0,MZ[m&1](o,u,A,T),I=M}function Qf(o,l){o=o|0,l=+l}function Tf(o,l){return o=o|0,l=+l,+ +bQe(l)}function tp(o,l){o=o|0,l=l|0}function rp(o,l){return o=o|0,l=l|0,DQe(l)|0}function DQe(o){return o=o|0,o|0}function bQe(o){return o=+o,+o}function PQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xQe(o,u,d,1),I=A}function xQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=dM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=kQe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,QQe(m,A)|0,A),I=d}function dM(){var o=0,l=0;if(s[7648]|0||(Sz(9268),gr(27,9268,U|0)|0,l=7648,n[l>>2]=1,n[l+4>>2]=0),!(_r(9268)|0)){o=9268,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Sz(9268)}return 9268}function kQe(o){return o=o|0,0}function QQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=dM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],vz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(TQe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function vz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function TQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=RQe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,FQe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],vz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,NQe(o,k),OQe(k),I=M;return}}function RQe(o){return o=o|0,357913941}function FQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function NQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function OQe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Sz(o){o=o|0,UQe(o)}function LQe(o){o=o|0,MQe(o+24|0)}function MQe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function UQe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,4,l,_Qe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function _Qe(){return 1160}function HQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;return u=I,I=I+16|0,A=u+8|0,d=u,m=jQe(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],l=GQe(l,A)|0,I=u,l|0}function jQe(o){return o=o|0,(n[(dM()|0)+24>>2]|0)+(o*12|0)|0}function GQe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),Dz(gd[u&31](o)|0)|0}function Dz(o){return o=o|0,o&1|0}function qQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],WQe(o,u,d,0),I=A}function WQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=mM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=YQe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,VQe(m,A)|0,A),I=d}function mM(){var o=0,l=0;if(s[7656]|0||(Pz(9304),gr(28,9304,U|0)|0,l=7656,n[l>>2]=1,n[l+4>>2]=0),!(_r(9304)|0)){o=9304,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Pz(9304)}return 9304}function YQe(o){return o=o|0,0}function VQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=mM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],bz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(JQe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function bz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function JQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=KQe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,zQe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],bz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,XQe(o,k),ZQe(k),I=M;return}}function KQe(o){return o=o|0,357913941}function zQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function XQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function ZQe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Pz(o){o=o|0,tTe(o)}function $Qe(o){o=o|0,eTe(o+24|0)}function eTe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function tTe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,5,l,rTe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function rTe(){return 1164}function nTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,d=A+8|0,m=A,B=iTe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],sTe(l,d,u),I=A}function iTe(o){return o=o|0,(n[(mM()|0)+24>>2]|0)+(o*12|0)|0}function sTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),Mh(d,u),u=Uh(d,u)|0,sp[A&31](o,u),_h(d),I=m}function Mh(o,l){o=o|0,l=l|0,oTe(o,l)}function Uh(o,l){return o=o|0,l=l|0,o|0}function _h(o){o=o|0,Sf(o)}function oTe(o,l){o=o|0,l=l|0,yM(o,l)}function yM(o,l){o=o|0,l=l|0,n[o>>2]=l}function aTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],lTe(o,u,d,0),I=A}function lTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=EM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=cTe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,uTe(m,A)|0,A),I=d}function EM(){var o=0,l=0;if(s[7664]|0||(kz(9340),gr(29,9340,U|0)|0,l=7664,n[l>>2]=1,n[l+4>>2]=0),!(_r(9340)|0)){o=9340,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));kz(9340)}return 9340}function cTe(o){return o=o|0,0}function uTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=EM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],xz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(fTe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function xz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function fTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=ATe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,pTe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],xz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,hTe(o,k),gTe(k),I=M;return}}function ATe(o){return o=o|0,357913941}function pTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function hTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function gTe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function kz(o){o=o|0,yTe(o)}function dTe(o){o=o|0,mTe(o+24|0)}function mTe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function yTe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,4,l,ETe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function ETe(){return 1180}function ITe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=CTe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],u=wTe(l,d,u)|0,I=A,u|0}function CTe(o){return o=o|0,(n[(EM()|0)+24>>2]|0)+(o*12|0)|0}function wTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;return m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),ad(d,u),d=ld(d,u)|0,d=TP(gU[A&15](o,d)|0)|0,I=m,d|0}function ad(o,l){o=o|0,l=l|0}function ld(o,l){return o=o|0,l=l|0,BTe(l)|0}function TP(o){return o=o|0,o|0}function BTe(o){return o=o|0,o|0}function vTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],STe(o,u,d,0),I=A}function STe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=IM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=DTe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,bTe(m,A)|0,A),I=d}function IM(){var o=0,l=0;if(s[7672]|0||(Tz(9376),gr(30,9376,U|0)|0,l=7672,n[l>>2]=1,n[l+4>>2]=0),!(_r(9376)|0)){o=9376,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Tz(9376)}return 9376}function DTe(o){return o=o|0,0}function bTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=IM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Qz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(PTe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Qz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function PTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=xTe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,kTe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Qz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,QTe(o,k),TTe(k),I=M;return}}function xTe(o){return o=o|0,357913941}function kTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function QTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function TTe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Tz(o){o=o|0,NTe(o)}function RTe(o){o=o|0,FTe(o+24|0)}function FTe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function NTe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,5,l,Rz()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function Rz(){return 1196}function OTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;return u=I,I=I+16|0,A=u+8|0,d=u,m=LTe(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],l=MTe(l,A)|0,I=u,l|0}function LTe(o){return o=o|0,(n[(IM()|0)+24>>2]|0)+(o*12|0)|0}function MTe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),TP(gd[u&31](o)|0)|0}function UTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],_Te(o,u,d,1),I=A}function _Te(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=CM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=HTe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,jTe(m,A)|0,A),I=d}function CM(){var o=0,l=0;if(s[7680]|0||(Nz(9412),gr(31,9412,U|0)|0,l=7680,n[l>>2]=1,n[l+4>>2]=0),!(_r(9412)|0)){o=9412,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Nz(9412)}return 9412}function HTe(o){return o=o|0,0}function jTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=CM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Fz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(GTe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Fz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function GTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=qTe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,WTe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Fz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,YTe(o,k),VTe(k),I=M;return}}function qTe(o){return o=o|0,357913941}function WTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function YTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function VTe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Nz(o){o=o|0,zTe(o)}function JTe(o){o=o|0,KTe(o+24|0)}function KTe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function zTe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,6,l,Oz()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function Oz(){return 1200}function XTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;return u=I,I=I+16|0,A=u+8|0,d=u,m=ZTe(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],l=$Te(l,A)|0,I=u,l|0}function ZTe(o){return o=o|0,(n[(CM()|0)+24>>2]|0)+(o*12|0)|0}function $Te(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),RP(gd[u&31](o)|0)|0}function RP(o){return o=o|0,o|0}function eRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],tRe(o,u,d,0),I=A}function tRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=wM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=rRe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,nRe(m,A)|0,A),I=d}function wM(){var o=0,l=0;if(s[7688]|0||(Mz(9448),gr(32,9448,U|0)|0,l=7688,n[l>>2]=1,n[l+4>>2]=0),!(_r(9448)|0)){o=9448,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Mz(9448)}return 9448}function rRe(o){return o=o|0,0}function nRe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=wM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Lz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(iRe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Lz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function iRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=sRe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,oRe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Lz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,aRe(o,k),lRe(k),I=M;return}}function sRe(o){return o=o|0,357913941}function oRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function aRe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function lRe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Mz(o){o=o|0,fRe(o)}function cRe(o){o=o|0,uRe(o+24|0)}function uRe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function fRe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,6,l,Uz()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function Uz(){return 1204}function ARe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,d=A+8|0,m=A,B=pRe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],hRe(l,d,u),I=A}function pRe(o){return o=o|0,(n[(wM()|0)+24>>2]|0)+(o*12|0)|0}function hRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),BM(d,u),d=vM(d,u)|0,sp[A&31](o,d),I=m}function BM(o,l){o=o|0,l=l|0}function vM(o,l){return o=o|0,l=l|0,gRe(l)|0}function gRe(o){return o=o|0,o|0}function dRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],mRe(o,u,d,0),I=A}function mRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=SM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=yRe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,ERe(m,A)|0,A),I=d}function SM(){var o=0,l=0;if(s[7696]|0||(Hz(9484),gr(33,9484,U|0)|0,l=7696,n[l>>2]=1,n[l+4>>2]=0),!(_r(9484)|0)){o=9484,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Hz(9484)}return 9484}function yRe(o){return o=o|0,0}function ERe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=SM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],_z(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(IRe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function _z(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function IRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=CRe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,wRe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],_z(m,A,u),n[T>>2]=(n[T>>2]|0)+12,BRe(o,k),vRe(k),I=M;return}}function CRe(o){return o=o|0,357913941}function wRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function BRe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function vRe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Hz(o){o=o|0,bRe(o)}function SRe(o){o=o|0,DRe(o+24|0)}function DRe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function bRe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,1,l,PRe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function PRe(){return 1212}function xRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;d=I,I=I+16|0,m=d+8|0,B=d,k=kRe(o)|0,o=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=o,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],QRe(l,m,u,A),I=d}function kRe(o){return o=o|0,(n[(SM()|0)+24>>2]|0)+(o*12|0)|0}function QRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;k=I,I=I+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(d=n[(n[o>>2]|0)+d>>2]|0),BM(m,u),m=vM(m,u)|0,ad(B,A),B=ld(B,A)|0,F2[d&15](o,m,B),I=k}function TRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],RRe(o,u,d,1),I=A}function RRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=DM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=FRe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,NRe(m,A)|0,A),I=d}function DM(){var o=0,l=0;if(s[7704]|0||(Gz(9520),gr(34,9520,U|0)|0,l=7704,n[l>>2]=1,n[l+4>>2]=0),!(_r(9520)|0)){o=9520,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Gz(9520)}return 9520}function FRe(o){return o=o|0,0}function NRe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=DM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],jz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(ORe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function jz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function ORe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=LRe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,MRe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],jz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,URe(o,k),_Re(k),I=M;return}}function LRe(o){return o=o|0,357913941}function MRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function URe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function _Re(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Gz(o){o=o|0,GRe(o)}function HRe(o){o=o|0,jRe(o+24|0)}function jRe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function GRe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,1,l,qRe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function qRe(){return 1224}function WRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;return d=I,I=I+16|0,m=d+8|0,B=d,k=YRe(o)|0,o=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=o,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],A=+VRe(l,m,u),I=d,+A}function YRe(o){return o=o|0,(n[(DM()|0)+24>>2]|0)+(o*12|0)|0}function VRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),tp(d,u),d=rp(d,u)|0,B=+kf(+_Z[A&7](o,d)),I=m,+B}function JRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],KRe(o,u,d,1),I=A}function KRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=bM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=zRe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,XRe(m,A)|0,A),I=d}function bM(){var o=0,l=0;if(s[7712]|0||(Wz(9556),gr(35,9556,U|0)|0,l=7712,n[l>>2]=1,n[l+4>>2]=0),!(_r(9556)|0)){o=9556,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Wz(9556)}return 9556}function zRe(o){return o=o|0,0}function XRe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=bM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],qz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(ZRe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function qz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function ZRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=$Re(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,eFe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],qz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,tFe(o,k),rFe(k),I=M;return}}function $Re(o){return o=o|0,357913941}function eFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function tFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function rFe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Wz(o){o=o|0,sFe(o)}function nFe(o){o=o|0,iFe(o+24|0)}function iFe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function sFe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,5,l,oFe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function oFe(){return 1232}function aFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=lFe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],u=+cFe(l,d),I=A,+u}function lFe(o){return o=o|0,(n[(bM()|0)+24>>2]|0)+(o*12|0)|0}function cFe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),+ +kf(+UZ[u&15](o))}function uFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],fFe(o,u,d,1),I=A}function fFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=PM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=AFe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,pFe(m,A)|0,A),I=d}function PM(){var o=0,l=0;if(s[7720]|0||(Vz(9592),gr(36,9592,U|0)|0,l=7720,n[l>>2]=1,n[l+4>>2]=0),!(_r(9592)|0)){o=9592,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Vz(9592)}return 9592}function AFe(o){return o=o|0,0}function pFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=PM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Yz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(hFe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Yz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function hFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=gFe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,dFe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Yz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,mFe(o,k),yFe(k),I=M;return}}function gFe(o){return o=o|0,357913941}function dFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function mFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function yFe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Vz(o){o=o|0,CFe(o)}function EFe(o){o=o|0,IFe(o+24|0)}function IFe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function CFe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,7,l,wFe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function wFe(){return 1276}function BFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;return u=I,I=I+16|0,A=u+8|0,d=u,m=vFe(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],l=SFe(l,A)|0,I=u,l|0}function vFe(o){return o=o|0,(n[(PM()|0)+24>>2]|0)+(o*12|0)|0}function SFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;return d=I,I=I+16|0,A=d,u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),sp[u&31](A,o),A=Jz(A)|0,I=d,A|0}function Jz(o){o=o|0;var l=0,u=0,A=0,d=0;return d=I,I=I+32|0,l=d+12|0,u=d,A=fM(Kz()|0)|0,A?(AM(l,A),pM(u,l),DFe(o,u),o=hM(l)|0):o=bFe(o)|0,I=d,o|0}function Kz(){var o=0;return s[7736]|0||(LFe(9640),gr(25,9640,U|0)|0,o=7736,n[o>>2]=1,n[o+4>>2]=0),9640}function DFe(o,l){o=o|0,l=l|0,QFe(l,o,o+8|0)|0}function bFe(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0;return u=I,I=I+16|0,d=u+4|0,B=u,A=Rl(8)|0,l=A,k=Kt(16)|0,n[k>>2]=n[o>>2],n[k+4>>2]=n[o+4>>2],n[k+8>>2]=n[o+8>>2],n[k+12>>2]=n[o+12>>2],m=l+4|0,n[m>>2]=k,o=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],xM(o,m,d),n[A>>2]=o,I=u,l|0}function xM(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Kt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1244,n[u+12>>2]=l,n[o+4>>2]=u}function PFe(o){o=o|0,$y(o),It(o)}function xFe(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function kFe(o){o=o|0,It(o)}function QFe(o,l,u){return o=o|0,l=l|0,u=u|0,l=TFe(n[o>>2]|0,l,u)|0,u=o+4|0,n[(n[u>>2]|0)+8>>2]=l,n[(n[u>>2]|0)+8>>2]|0}function TFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;return A=I,I=I+16|0,d=A,Fl(d),o=Os(o)|0,u=RFe(o,n[l>>2]|0,+E[u>>3])|0,Nl(d),I=A,u|0}function RFe(o,l,u){o=o|0,l=l|0,u=+u;var A=0;return A=da(FFe()|0)|0,l=Yy(l)|0,ou(0,A|0,o|0,l|0,+ +Ja(u))|0}function FFe(){var o=0;return s[7728]|0||(NFe(9628),o=7728,n[o>>2]=1,n[o+4>>2]=0),9628}function NFe(o){o=o|0,Qo(o,OFe()|0,2)}function OFe(){return 1264}function LFe(o){o=o|0,Lh(o)}function MFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],UFe(o,u,d,1),I=A}function UFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=kM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=_Fe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,HFe(m,A)|0,A),I=d}function kM(){var o=0,l=0;if(s[7744]|0||(Xz(9684),gr(37,9684,U|0)|0,l=7744,n[l>>2]=1,n[l+4>>2]=0),!(_r(9684)|0)){o=9684,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Xz(9684)}return 9684}function _Fe(o){return o=o|0,0}function HFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=kM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],zz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(jFe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function zz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function jFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=GFe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,qFe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],zz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,WFe(o,k),YFe(k),I=M;return}}function GFe(o){return o=o|0,357913941}function qFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function WFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function YFe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Xz(o){o=o|0,KFe(o)}function VFe(o){o=o|0,JFe(o+24|0)}function JFe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function KFe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,5,l,zFe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function zFe(){return 1280}function XFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=ZFe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],u=$Fe(l,d,u)|0,I=A,u|0}function ZFe(o){return o=o|0,(n[(kM()|0)+24>>2]|0)+(o*12|0)|0}function $Fe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return B=I,I=I+32|0,d=B,m=B+16|0,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),tp(m,u),m=rp(m,u)|0,F2[A&15](d,o,m),m=Jz(d)|0,I=B,m|0}function eNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],tNe(o,u,d,1),I=A}function tNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=QM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=rNe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,nNe(m,A)|0,A),I=d}function QM(){var o=0,l=0;if(s[7752]|0||($z(9720),gr(38,9720,U|0)|0,l=7752,n[l>>2]=1,n[l+4>>2]=0),!(_r(9720)|0)){o=9720,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));$z(9720)}return 9720}function rNe(o){return o=o|0,0}function nNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=QM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Zz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(iNe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Zz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function iNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=sNe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,oNe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Zz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,aNe(o,k),lNe(k),I=M;return}}function sNe(o){return o=o|0,357913941}function oNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function aNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function lNe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function $z(o){o=o|0,fNe(o)}function cNe(o){o=o|0,uNe(o+24|0)}function uNe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function fNe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,8,l,ANe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function ANe(){return 1288}function pNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;return u=I,I=I+16|0,A=u+8|0,d=u,m=hNe(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],l=gNe(l,A)|0,I=u,l|0}function hNe(o){return o=o|0,(n[(QM()|0)+24>>2]|0)+(o*12|0)|0}function gNe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),sd(gd[u&31](o)|0)|0}function dNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],mNe(o,u,d,0),I=A}function mNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=TM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=yNe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,ENe(m,A)|0,A),I=d}function TM(){var o=0,l=0;if(s[7760]|0||(tX(9756),gr(39,9756,U|0)|0,l=7760,n[l>>2]=1,n[l+4>>2]=0),!(_r(9756)|0)){o=9756,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));tX(9756)}return 9756}function yNe(o){return o=o|0,0}function ENe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=TM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],eX(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(INe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function eX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function INe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=CNe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,wNe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],eX(m,A,u),n[T>>2]=(n[T>>2]|0)+12,BNe(o,k),vNe(k),I=M;return}}function CNe(o){return o=o|0,357913941}function wNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function BNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function vNe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function tX(o){o=o|0,bNe(o)}function SNe(o){o=o|0,DNe(o+24|0)}function DNe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function bNe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,8,l,PNe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function PNe(){return 1292}function xNe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,d=A+8|0,m=A,B=kNe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],QNe(l,d,u),I=A}function kNe(o){return o=o|0,(n[(TM()|0)+24>>2]|0)+(o*12|0)|0}function QNe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,d=0,m=0;m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),Qf(d,u),u=+Tf(d,u),OZ[A&31](o,u),I=m}function TNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],RNe(o,u,d,0),I=A}function RNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=RM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=FNe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,NNe(m,A)|0,A),I=d}function RM(){var o=0,l=0;if(s[7768]|0||(nX(9792),gr(40,9792,U|0)|0,l=7768,n[l>>2]=1,n[l+4>>2]=0),!(_r(9792)|0)){o=9792,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));nX(9792)}return 9792}function FNe(o){return o=o|0,0}function NNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=RM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],rX(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(ONe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function rX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function ONe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=LNe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,MNe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],rX(m,A,u),n[T>>2]=(n[T>>2]|0)+12,UNe(o,k),_Ne(k),I=M;return}}function LNe(o){return o=o|0,357913941}function MNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function UNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function _Ne(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function nX(o){o=o|0,GNe(o)}function HNe(o){o=o|0,jNe(o+24|0)}function jNe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function GNe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,1,l,qNe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function qNe(){return 1300}function WNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=+A;var d=0,m=0,B=0,k=0;d=I,I=I+16|0,m=d+8|0,B=d,k=YNe(o)|0,o=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=o,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],VNe(l,m,u,A),I=d}function YNe(o){return o=o|0,(n[(RM()|0)+24>>2]|0)+(o*12|0)|0}function VNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=+A;var d=0,m=0,B=0,k=0;k=I,I=I+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(d=n[(n[o>>2]|0)+d>>2]|0),tp(m,u),m=rp(m,u)|0,Qf(B,A),A=+Tf(B,A),qZ[d&15](o,m,A),I=k}function JNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],KNe(o,u,d,0),I=A}function KNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=FM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=zNe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,XNe(m,A)|0,A),I=d}function FM(){var o=0,l=0;if(s[7776]|0||(sX(9828),gr(41,9828,U|0)|0,l=7776,n[l>>2]=1,n[l+4>>2]=0),!(_r(9828)|0)){o=9828,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));sX(9828)}return 9828}function zNe(o){return o=o|0,0}function XNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=FM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],iX(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(ZNe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function iX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function ZNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=$Ne(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,eOe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],iX(m,A,u),n[T>>2]=(n[T>>2]|0)+12,tOe(o,k),rOe(k),I=M;return}}function $Ne(o){return o=o|0,357913941}function eOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function tOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function rOe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function sX(o){o=o|0,sOe(o)}function nOe(o){o=o|0,iOe(o+24|0)}function iOe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function sOe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,7,l,oOe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function oOe(){return 1312}function aOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,d=A+8|0,m=A,B=lOe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],cOe(l,d,u),I=A}function lOe(o){return o=o|0,(n[(FM()|0)+24>>2]|0)+(o*12|0)|0}function cOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),tp(d,u),d=rp(d,u)|0,sp[A&31](o,d),I=m}function uOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],fOe(o,u,d,0),I=A}function fOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=NM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=AOe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,pOe(m,A)|0,A),I=d}function NM(){var o=0,l=0;if(s[7784]|0||(aX(9864),gr(42,9864,U|0)|0,l=7784,n[l>>2]=1,n[l+4>>2]=0),!(_r(9864)|0)){o=9864,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));aX(9864)}return 9864}function AOe(o){return o=o|0,0}function pOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=NM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],oX(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(hOe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function oX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function hOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=gOe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,dOe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],oX(m,A,u),n[T>>2]=(n[T>>2]|0)+12,mOe(o,k),yOe(k),I=M;return}}function gOe(o){return o=o|0,357913941}function dOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function mOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function yOe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function aX(o){o=o|0,COe(o)}function EOe(o){o=o|0,IOe(o+24|0)}function IOe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function COe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,8,l,wOe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function wOe(){return 1320}function BOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,d=A+8|0,m=A,B=vOe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],SOe(l,d,u),I=A}function vOe(o){return o=o|0,(n[(NM()|0)+24>>2]|0)+(o*12|0)|0}function SOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),DOe(d,u),d=bOe(d,u)|0,sp[A&31](o,d),I=m}function DOe(o,l){o=o|0,l=l|0}function bOe(o,l){return o=o|0,l=l|0,POe(l)|0}function POe(o){return o=o|0,o|0}function xOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],kOe(o,u,d,0),I=A}function kOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=OM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=QOe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,TOe(m,A)|0,A),I=d}function OM(){var o=0,l=0;if(s[7792]|0||(cX(9900),gr(43,9900,U|0)|0,l=7792,n[l>>2]=1,n[l+4>>2]=0),!(_r(9900)|0)){o=9900,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));cX(9900)}return 9900}function QOe(o){return o=o|0,0}function TOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=OM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],lX(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(ROe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function lX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function ROe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=FOe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,NOe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],lX(m,A,u),n[T>>2]=(n[T>>2]|0)+12,OOe(o,k),LOe(k),I=M;return}}function FOe(o){return o=o|0,357913941}function NOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function OOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function LOe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function cX(o){o=o|0,_Oe(o)}function MOe(o){o=o|0,UOe(o+24|0)}function UOe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function _Oe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,22,l,HOe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function HOe(){return 1344}function jOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;u=I,I=I+16|0,A=u+8|0,d=u,m=GOe(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],qOe(l,A),I=u}function GOe(o){return o=o|0,(n[(OM()|0)+24>>2]|0)+(o*12|0)|0}function qOe(o,l){o=o|0,l=l|0;var u=0;u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),ip[u&127](o)}function WOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=LM()|0,o=YOe(u)|0,vn(m,l,d,o,VOe(u,A)|0,A)}function LM(){var o=0,l=0;if(s[7800]|0||(fX(9936),gr(44,9936,U|0)|0,l=7800,n[l>>2]=1,n[l+4>>2]=0),!(_r(9936)|0)){o=9936,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));fX(9936)}return 9936}function YOe(o){return o=o|0,o|0}function VOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,T=LM()|0,B=T+24|0,l=yr(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(uX(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(JOe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function uX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function JOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=KOe(o)|0,A>>>0<B>>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,zOe(d,L>>3>>>0<A>>>1>>>0?M>>>0<B>>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=d+8|0,uX(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,XOe(o,d),ZOe(d),I=k;return}}function KOe(o){return o=o|0,536870911}function zOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function XOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function ZOe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function fX(o){o=o|0,tLe(o)}function $Oe(o){o=o|0,eLe(o+24|0)}function eLe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function tLe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,23,l,Uz()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function rLe(o,l){o=o|0,l=l|0,iLe(n[(nLe(o)|0)>>2]|0,l)}function nLe(o){return o=o|0,(n[(LM()|0)+24>>2]|0)+(o<<3)|0}function iLe(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,BM(A,l),l=vM(A,l)|0,ip[o&127](l),I=u}function sLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=MM()|0,o=oLe(u)|0,vn(m,l,d,o,aLe(u,A)|0,A)}function MM(){var o=0,l=0;if(s[7808]|0||(pX(9972),gr(45,9972,U|0)|0,l=7808,n[l>>2]=1,n[l+4>>2]=0),!(_r(9972)|0)){o=9972,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));pX(9972)}return 9972}function oLe(o){return o=o|0,o|0}function aLe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,T=MM()|0,B=T+24|0,l=yr(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(AX(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(lLe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function AX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function lLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=cLe(o)|0,A>>>0<B>>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,uLe(d,L>>3>>>0<A>>>1>>>0?M>>>0<B>>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=d+8|0,AX(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,fLe(o,d),ALe(d),I=k;return}}function cLe(o){return o=o|0,536870911}function uLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function fLe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function ALe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function pX(o){o=o|0,gLe(o)}function pLe(o){o=o|0,hLe(o+24|0)}function hLe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function gLe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,9,l,dLe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function dLe(){return 1348}function mLe(o,l){return o=o|0,l=l|0,ELe(n[(yLe(o)|0)>>2]|0,l)|0}function yLe(o){return o=o|0,(n[(MM()|0)+24>>2]|0)+(o<<3)|0}function ELe(o,l){o=o|0,l=l|0;var u=0,A=0;return u=I,I=I+16|0,A=u,hX(A,l),l=gX(A,l)|0,l=TP(gd[o&31](l)|0)|0,I=u,l|0}function hX(o,l){o=o|0,l=l|0}function gX(o,l){return o=o|0,l=l|0,ILe(l)|0}function ILe(o){return o=o|0,o|0}function CLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=UM()|0,o=wLe(u)|0,vn(m,l,d,o,BLe(u,A)|0,A)}function UM(){var o=0,l=0;if(s[7816]|0||(mX(10008),gr(46,10008,U|0)|0,l=7816,n[l>>2]=1,n[l+4>>2]=0),!(_r(10008)|0)){o=10008,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));mX(10008)}return 10008}function wLe(o){return o=o|0,o|0}function BLe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,T=UM()|0,B=T+24|0,l=yr(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(dX(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(vLe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function dX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function vLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=SLe(o)|0,A>>>0<B>>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,DLe(d,L>>3>>>0<A>>>1>>>0?M>>>0<B>>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=d+8|0,dX(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,bLe(o,d),PLe(d),I=k;return}}function SLe(o){return o=o|0,536870911}function DLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function bLe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function PLe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function mX(o){o=o|0,QLe(o)}function xLe(o){o=o|0,kLe(o+24|0)}function kLe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function QLe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,15,l,Rz()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function TLe(o){return o=o|0,FLe(n[(RLe(o)|0)>>2]|0)|0}function RLe(o){return o=o|0,(n[(UM()|0)+24>>2]|0)+(o<<3)|0}function FLe(o){return o=o|0,TP(VP[o&7]()|0)|0}function NLe(){var o=0;return s[7832]|0||(GLe(10052),gr(25,10052,U|0)|0,o=7832,n[o>>2]=1,n[o+4>>2]=0),10052}function OLe(o,l){o=o|0,l=l|0,n[o>>2]=LLe()|0,n[o+4>>2]=MLe()|0,n[o+12>>2]=l,n[o+8>>2]=ULe()|0,n[o+32>>2]=2}function LLe(){return 11709}function MLe(){return 1188}function ULe(){return FP()|0}function _Le(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(HLe(u),It(u)):l|0&&(Oy(l),It(l))}function Hh(o,l){return o=o|0,l=l|0,l&o|0}function HLe(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function FP(){var o=0;return s[7824]|0||(n[2511]=jLe()|0,n[2512]=0,o=7824,n[o>>2]=1,n[o+4>>2]=0),10044}function jLe(){return 0}function GLe(o){o=o|0,Lh(o)}function qLe(o){o=o|0;var l=0,u=0,A=0,d=0,m=0;l=I,I=I+32|0,u=l+24|0,m=l+16|0,d=l+8|0,A=l,WLe(o,4827),YLe(o,4834,3)|0,VLe(o,3682,47)|0,n[m>>2]=9,n[m+4>>2]=0,n[u>>2]=n[m>>2],n[u+4>>2]=n[m+4>>2],JLe(o,4841,u)|0,n[d>>2]=1,n[d+4>>2]=0,n[u>>2]=n[d>>2],n[u+4>>2]=n[d+4>>2],KLe(o,4871,u)|0,n[A>>2]=10,n[A+4>>2]=0,n[u>>2]=n[A>>2],n[u+4>>2]=n[A+4>>2],zLe(o,4891,u)|0,I=l}function WLe(o,l){o=o|0,l=l|0;var u=0;u=PUe()|0,n[o>>2]=u,xUe(u,l),jh(n[o>>2]|0)}function YLe(o,l,u){return o=o|0,l=l|0,u=u|0,AUe(o,Bn(l)|0,u,0),o|0}function VLe(o,l,u){return o=o|0,l=l|0,u=u|0,XMe(o,Bn(l)|0,u,0),o|0}function JLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],TMe(o,l,d),I=A,o|0}function KLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],pMe(o,l,d),I=A,o|0}function zLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],XLe(o,l,d),I=A,o|0}function XLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ZLe(o,u,d,1),I=A}function ZLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=_M()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=$Le(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,eMe(m,A)|0,A),I=d}function _M(){var o=0,l=0;if(s[7840]|0||(EX(10100),gr(48,10100,U|0)|0,l=7840,n[l>>2]=1,n[l+4>>2]=0),!(_r(10100)|0)){o=10100,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));EX(10100)}return 10100}function $Le(o){return o=o|0,0}function eMe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=_M()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],yX(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(tMe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function yX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function tMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=rMe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,nMe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],yX(m,A,u),n[T>>2]=(n[T>>2]|0)+12,iMe(o,k),sMe(k),I=M;return}}function rMe(o){return o=o|0,357913941}function nMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function iMe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function sMe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function EX(o){o=o|0,lMe(o)}function oMe(o){o=o|0,aMe(o+24|0)}function aMe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function lMe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,6,l,cMe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function cMe(){return 1364}function uMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=fMe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],u=AMe(l,d,u)|0,I=A,u|0}function fMe(o){return o=o|0,(n[(_M()|0)+24>>2]|0)+(o*12|0)|0}function AMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;return m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),tp(d,u),d=rp(d,u)|0,d=Dz(gU[A&15](o,d)|0)|0,I=m,d|0}function pMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],hMe(o,u,d,0),I=A}function hMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=HM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=gMe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,dMe(m,A)|0,A),I=d}function HM(){var o=0,l=0;if(s[7848]|0||(CX(10136),gr(49,10136,U|0)|0,l=7848,n[l>>2]=1,n[l+4>>2]=0),!(_r(10136)|0)){o=10136,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));CX(10136)}return 10136}function gMe(o){return o=o|0,0}function dMe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=HM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],IX(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(mMe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function IX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function mMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=yMe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,EMe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],IX(m,A,u),n[T>>2]=(n[T>>2]|0)+12,IMe(o,k),CMe(k),I=M;return}}function yMe(o){return o=o|0,357913941}function EMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function IMe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function CMe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function CX(o){o=o|0,vMe(o)}function wMe(o){o=o|0,BMe(o+24|0)}function BMe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function vMe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,9,l,SMe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function SMe(){return 1372}function DMe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,d=A+8|0,m=A,B=bMe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],PMe(l,d,u),I=A}function bMe(o){return o=o|0,(n[(HM()|0)+24>>2]|0)+(o*12|0)|0}function PMe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,d=0,m=0,B=$e;m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),xMe(d,u),B=y(kMe(d,u)),NZ[A&1](o,B),I=m}function xMe(o,l){o=o|0,l=+l}function kMe(o,l){return o=o|0,l=+l,y(QMe(l))}function QMe(o){return o=+o,y(o)}function TMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],RMe(o,u,d,0),I=A}function RMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,T=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=jM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=FMe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,NMe(m,A)|0,A),I=d}function jM(){var o=0,l=0;if(s[7856]|0||(BX(10172),gr(50,10172,U|0)|0,l=7856,n[l>>2]=1,n[l+4>>2]=0),!(_r(10172)|0)){o=10172,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));BX(10172)}return 10172}function FMe(o){return o=o|0,0}function NMe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=jM()|0,M=q+24|0,o=yr(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],wX(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(OMe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function wX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function OMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,d=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=LMe(o)|0,m>>>0<d>>>0)an(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,MMe(k,ae>>>0<m>>>1>>>0?q>>>0<d>>>0?d:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],wX(m,A,u),n[T>>2]=(n[T>>2]|0)+12,UMe(o,k),_Me(k),I=M;return}}function LMe(o){return o=o|0,357913941}function MMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function UMe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function _Me(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function BX(o){o=o|0,GMe(o)}function HMe(o){o=o|0,jMe(o+24|0)}function jMe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function GMe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,3,l,qMe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function qMe(){return 1380}function WMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;d=I,I=I+16|0,m=d+8|0,B=d,k=YMe(o)|0,o=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=o,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],VMe(l,m,u,A),I=d}function YMe(o){return o=o|0,(n[(jM()|0)+24>>2]|0)+(o*12|0)|0}function VMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;k=I,I=I+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(d=n[(n[o>>2]|0)+d>>2]|0),tp(m,u),m=rp(m,u)|0,JMe(B,A),B=KMe(B,A)|0,F2[d&15](o,m,B),I=k}function JMe(o,l){o=o|0,l=l|0}function KMe(o,l){return o=o|0,l=l|0,zMe(l)|0}function zMe(o){return o=o|0,(o|0)!=0|0}function XMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=GM()|0,o=ZMe(u)|0,vn(m,l,d,o,$Me(u,A)|0,A)}function GM(){var o=0,l=0;if(s[7864]|0||(SX(10208),gr(51,10208,U|0)|0,l=7864,n[l>>2]=1,n[l+4>>2]=0),!(_r(10208)|0)){o=10208,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));SX(10208)}return 10208}function ZMe(o){return o=o|0,o|0}function $Me(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,T=GM()|0,B=T+24|0,l=yr(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(vX(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(eUe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function vX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function eUe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=tUe(o)|0,A>>>0<B>>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,rUe(d,L>>3>>>0<A>>>1>>>0?M>>>0<B>>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=d+8|0,vX(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,nUe(o,d),iUe(d),I=k;return}}function tUe(o){return o=o|0,536870911}function rUe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function nUe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function iUe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function SX(o){o=o|0,aUe(o)}function sUe(o){o=o|0,oUe(o+24|0)}function oUe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function aUe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,24,l,lUe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function lUe(){return 1392}function cUe(o,l){o=o|0,l=l|0,fUe(n[(uUe(o)|0)>>2]|0,l)}function uUe(o){return o=o|0,(n[(GM()|0)+24>>2]|0)+(o<<3)|0}function fUe(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,hX(A,l),l=gX(A,l)|0,ip[o&127](l),I=u}function AUe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=qM()|0,o=pUe(u)|0,vn(m,l,d,o,hUe(u,A)|0,A)}function qM(){var o=0,l=0;if(s[7872]|0||(bX(10244),gr(52,10244,U|0)|0,l=7872,n[l>>2]=1,n[l+4>>2]=0),!(_r(10244)|0)){o=10244,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));bX(10244)}return 10244}function pUe(o){return o=o|0,o|0}function hUe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,T=qM()|0,B=T+24|0,l=yr(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(DX(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(gUe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function DX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function gUe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=dUe(o)|0,A>>>0<B>>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,mUe(d,L>>3>>>0<A>>>1>>>0?M>>>0<B>>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=d+8|0,DX(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,yUe(o,d),EUe(d),I=k;return}}function dUe(o){return o=o|0,536870911}function mUe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function yUe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function EUe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function bX(o){o=o|0,wUe(o)}function IUe(o){o=o|0,CUe(o+24|0)}function CUe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function wUe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,16,l,BUe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function BUe(){return 1400}function vUe(o){return o=o|0,DUe(n[(SUe(o)|0)>>2]|0)|0}function SUe(o){return o=o|0,(n[(qM()|0)+24>>2]|0)+(o<<3)|0}function DUe(o){return o=o|0,bUe(VP[o&7]()|0)|0}function bUe(o){return o=o|0,o|0}function PUe(){var o=0;return s[7880]|0||(NUe(10280),gr(25,10280,U|0)|0,o=7880,n[o>>2]=1,n[o+4>>2]=0),10280}function xUe(o,l){o=o|0,l=l|0,n[o>>2]=kUe()|0,n[o+4>>2]=QUe()|0,n[o+12>>2]=l,n[o+8>>2]=TUe()|0,n[o+32>>2]=4}function kUe(){return 11711}function QUe(){return 1356}function TUe(){return FP()|0}function RUe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(FUe(u),It(u)):l|0&&(Kg(l),It(l))}function FUe(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function NUe(o){o=o|0,Lh(o)}function OUe(o){o=o|0,LUe(o,4920),MUe(o)|0,UUe(o)|0}function LUe(o,l){o=o|0,l=l|0;var u=0;u=Kz()|0,n[o>>2]=u,o_e(u,l),jh(n[o>>2]|0)}function MUe(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,zUe()|0),o|0}function UUe(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,_Ue()|0),o|0}function _Ue(){var o=0;return s[7888]|0||(PX(10328),gr(53,10328,U|0)|0,o=7888,n[o>>2]=1,n[o+4>>2]=0),_r(10328)|0||PX(10328),10328}function cd(o,l){o=o|0,l=l|0,vn(o,0,l,0,0,0)}function PX(o){o=o|0,GUe(o),ud(o,10)}function HUe(o){o=o|0,jUe(o+24|0)}function jUe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function GUe(o){o=o|0;var l=0;l=tn()|0,rn(o,5,1,l,VUe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function qUe(o,l,u){o=o|0,l=l|0,u=+u,WUe(o,l,u)}function ud(o,l){o=o|0,l=l|0,n[o+20>>2]=l}function WUe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,m=A+8|0,k=A+13|0,d=A,B=A+12|0,tp(k,l),n[m>>2]=rp(k,l)|0,Qf(B,u),E[d>>3]=+Tf(B,u),YUe(o,m,d),I=A}function YUe(o,l,u){o=o|0,l=l|0,u=u|0,Tl(o+8|0,n[l>>2]|0,+E[u>>3]),s[o+24>>0]=1}function VUe(){return 1404}function JUe(o,l){return o=o|0,l=+l,KUe(o,l)|0}function KUe(o,l){o=o|0,l=+l;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return A=I,I=I+16|0,m=A+4|0,B=A+8|0,k=A,d=Rl(8)|0,u=d,T=Kt(16)|0,tp(m,o),o=rp(m,o)|0,Qf(B,l),Tl(T,o,+Tf(B,l)),B=u+4|0,n[B>>2]=T,o=Kt(8)|0,B=n[B>>2]|0,n[k>>2]=0,n[m>>2]=n[k>>2],xM(o,B,m),n[d>>2]=o,I=A,u|0}function zUe(){var o=0;return s[7896]|0||(xX(10364),gr(54,10364,U|0)|0,o=7896,n[o>>2]=1,n[o+4>>2]=0),_r(10364)|0||xX(10364),10364}function xX(o){o=o|0,$Ue(o),ud(o,55)}function XUe(o){o=o|0,ZUe(o+24|0)}function ZUe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function $Ue(o){o=o|0;var l=0;l=tn()|0,rn(o,5,4,l,n_e()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function e_e(o){o=o|0,t_e(o)}function t_e(o){o=o|0,r_e(o)}function r_e(o){o=o|0,kX(o+8|0),s[o+24>>0]=1}function kX(o){o=o|0,n[o>>2]=0,E[o+8>>3]=0}function n_e(){return 1424}function i_e(){return s_e()|0}function s_e(){var o=0,l=0,u=0,A=0,d=0,m=0,B=0;return l=I,I=I+16|0,d=l+4|0,B=l,u=Rl(8)|0,o=u,A=Kt(16)|0,kX(A),m=o+4|0,n[m>>2]=A,A=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],xM(A,m,d),n[u>>2]=A,I=l,o|0}function o_e(o,l){o=o|0,l=l|0,n[o>>2]=a_e()|0,n[o+4>>2]=l_e()|0,n[o+12>>2]=l,n[o+8>>2]=c_e()|0,n[o+32>>2]=5}function a_e(){return 11710}function l_e(){return 1416}function c_e(){return NP()|0}function u_e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(f_e(u),It(u)):l|0&&It(l)}function f_e(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function NP(){var o=0;return s[7904]|0||(n[2600]=A_e()|0,n[2601]=0,o=7904,n[o>>2]=1,n[o+4>>2]=0),10400}function A_e(){return n[357]|0}function p_e(o){o=o|0,h_e(o,4926),g_e(o)|0}function h_e(o,l){o=o|0,l=l|0;var u=0;u=yz()|0,n[o>>2]=u,D_e(u,l),jh(n[o>>2]|0)}function g_e(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,d_e()|0),o|0}function d_e(){var o=0;return s[7912]|0||(QX(10412),gr(56,10412,U|0)|0,o=7912,n[o>>2]=1,n[o+4>>2]=0),_r(10412)|0||QX(10412),10412}function QX(o){o=o|0,E_e(o),ud(o,57)}function m_e(o){o=o|0,y_e(o+24|0)}function y_e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function E_e(o){o=o|0;var l=0;l=tn()|0,rn(o,5,5,l,B_e()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function I_e(o){o=o|0,C_e(o)}function C_e(o){o=o|0,w_e(o)}function w_e(o){o=o|0;var l=0,u=0;l=o+8|0,u=l+48|0;do n[l>>2]=0,l=l+4|0;while((l|0)<(u|0));s[o+56>>0]=1}function B_e(){return 1432}function v_e(){return S_e()|0}function S_e(){var o=0,l=0,u=0,A=0,d=0,m=0,B=0,k=0;B=I,I=I+16|0,o=B+4|0,l=B,u=Rl(8)|0,A=u,d=Kt(48)|0,m=d,k=m+48|0;do n[m>>2]=0,m=m+4|0;while((m|0)<(k|0));return m=A+4|0,n[m>>2]=d,k=Kt(8)|0,m=n[m>>2]|0,n[l>>2]=0,n[o>>2]=n[l>>2],Ez(k,m,o),n[u>>2]=k,I=B,A|0}function D_e(o,l){o=o|0,l=l|0,n[o>>2]=b_e()|0,n[o+4>>2]=P_e()|0,n[o+12>>2]=l,n[o+8>>2]=x_e()|0,n[o+32>>2]=6}function b_e(){return 11704}function P_e(){return 1436}function x_e(){return NP()|0}function k_e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(Q_e(u),It(u)):l|0&&It(l)}function Q_e(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function T_e(o){o=o|0,R_e(o,4933),F_e(o)|0,N_e(o)|0}function R_e(o,l){o=o|0,l=l|0;var u=0;u=s4e()|0,n[o>>2]=u,o4e(u,l),jh(n[o>>2]|0)}function F_e(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,K_e()|0),o|0}function N_e(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,O_e()|0),o|0}function O_e(){var o=0;return s[7920]|0||(TX(10452),gr(58,10452,U|0)|0,o=7920,n[o>>2]=1,n[o+4>>2]=0),_r(10452)|0||TX(10452),10452}function TX(o){o=o|0,U_e(o),ud(o,1)}function L_e(o){o=o|0,M_e(o+24|0)}function M_e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function U_e(o){o=o|0;var l=0;l=tn()|0,rn(o,5,1,l,G_e()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function __e(o,l,u){o=o|0,l=+l,u=+u,H_e(o,l,u)}function H_e(o,l,u){o=o|0,l=+l,u=+u;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+32|0,m=A+8|0,k=A+17|0,d=A,B=A+16|0,Qf(k,l),E[m>>3]=+Tf(k,l),Qf(B,u),E[d>>3]=+Tf(B,u),j_e(o,m,d),I=A}function j_e(o,l,u){o=o|0,l=l|0,u=u|0,RX(o+8|0,+E[l>>3],+E[u>>3]),s[o+24>>0]=1}function RX(o,l,u){o=o|0,l=+l,u=+u,E[o>>3]=l,E[o+8>>3]=u}function G_e(){return 1472}function q_e(o,l){return o=+o,l=+l,W_e(o,l)|0}function W_e(o,l){o=+o,l=+l;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return A=I,I=I+16|0,B=A+4|0,k=A+8|0,T=A,d=Rl(8)|0,u=d,m=Kt(16)|0,Qf(B,o),o=+Tf(B,o),Qf(k,l),RX(m,o,+Tf(k,l)),k=u+4|0,n[k>>2]=m,m=Kt(8)|0,k=n[k>>2]|0,n[T>>2]=0,n[B>>2]=n[T>>2],FX(m,k,B),n[d>>2]=m,I=A,u|0}function FX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Kt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1452,n[u+12>>2]=l,n[o+4>>2]=u}function Y_e(o){o=o|0,$y(o),It(o)}function V_e(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function J_e(o){o=o|0,It(o)}function K_e(){var o=0;return s[7928]|0||(NX(10488),gr(59,10488,U|0)|0,o=7928,n[o>>2]=1,n[o+4>>2]=0),_r(10488)|0||NX(10488),10488}function NX(o){o=o|0,Z_e(o),ud(o,60)}function z_e(o){o=o|0,X_e(o+24|0)}function X_e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function Z_e(o){o=o|0;var l=0;l=tn()|0,rn(o,5,6,l,r4e()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function $_e(o){o=o|0,e4e(o)}function e4e(o){o=o|0,t4e(o)}function t4e(o){o=o|0,OX(o+8|0),s[o+24>>0]=1}function OX(o){o=o|0,n[o>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,n[o+12>>2]=0}function r4e(){return 1492}function n4e(){return i4e()|0}function i4e(){var o=0,l=0,u=0,A=0,d=0,m=0,B=0;return l=I,I=I+16|0,d=l+4|0,B=l,u=Rl(8)|0,o=u,A=Kt(16)|0,OX(A),m=o+4|0,n[m>>2]=A,A=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],FX(A,m,d),n[u>>2]=A,I=l,o|0}function s4e(){var o=0;return s[7936]|0||(A4e(10524),gr(25,10524,U|0)|0,o=7936,n[o>>2]=1,n[o+4>>2]=0),10524}function o4e(o,l){o=o|0,l=l|0,n[o>>2]=a4e()|0,n[o+4>>2]=l4e()|0,n[o+12>>2]=l,n[o+8>>2]=c4e()|0,n[o+32>>2]=7}function a4e(){return 11700}function l4e(){return 1484}function c4e(){return NP()|0}function u4e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(f4e(u),It(u)):l|0&&It(l)}function f4e(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function A4e(o){o=o|0,Lh(o)}function p4e(o,l,u){o=o|0,l=l|0,u=u|0,o=Bn(l)|0,l=h4e(u)|0,u=g4e(u,0)|0,W4e(o,l,u,WM()|0,0)}function h4e(o){return o=o|0,o|0}function g4e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,T=WM()|0,B=T+24|0,l=yr(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(MX(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(w4e(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function WM(){var o=0,l=0;if(s[7944]|0||(LX(10568),gr(61,10568,U|0)|0,l=7944,n[l>>2]=1,n[l+4>>2]=0),!(_r(10568)|0)){o=10568,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));LX(10568)}return 10568}function LX(o){o=o|0,y4e(o)}function d4e(o){o=o|0,m4e(o+24|0)}function m4e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function y4e(o){o=o|0;var l=0;l=tn()|0,rn(o,1,17,l,Oz()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function E4e(o){return o=o|0,C4e(n[(I4e(o)|0)>>2]|0)|0}function I4e(o){return o=o|0,(n[(WM()|0)+24>>2]|0)+(o<<3)|0}function C4e(o){return o=o|0,RP(VP[o&7]()|0)|0}function MX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function w4e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=B4e(o)|0,A>>>0<B>>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,v4e(d,L>>3>>>0<A>>>1>>>0?M>>>0<B>>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=d+8|0,MX(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,S4e(o,d),D4e(d),I=k;return}}function B4e(o){return o=o|0,536870911}function v4e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function S4e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function D4e(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function b4e(){P4e()}function P4e(){x4e(10604)}function x4e(o){o=o|0,k4e(o,4955)}function k4e(o,l){o=o|0,l=l|0;var u=0;u=Q4e()|0,n[o>>2]=u,T4e(u,l),jh(n[o>>2]|0)}function Q4e(){var o=0;return s[7952]|0||(H4e(10612),gr(25,10612,U|0)|0,o=7952,n[o>>2]=1,n[o+4>>2]=0),10612}function T4e(o,l){o=o|0,l=l|0,n[o>>2]=O4e()|0,n[o+4>>2]=L4e()|0,n[o+12>>2]=l,n[o+8>>2]=M4e()|0,n[o+32>>2]=8}function jh(o){o=o|0;var l=0,u=0;l=I,I=I+16|0,u=l,Jy()|0,n[u>>2]=o,R4e(10608,u),I=l}function Jy(){return s[11714]|0||(n[2652]=0,gr(62,10608,U|0)|0,s[11714]=1),10608}function R4e(o,l){o=o|0,l=l|0;var u=0;u=Kt(8)|0,n[u+4>>2]=n[l>>2],n[u>>2]=n[o>>2],n[o>>2]=u}function F4e(o){o=o|0,N4e(o)}function N4e(o){o=o|0;var l=0,u=0;if(l=n[o>>2]|0,l|0)do u=l,l=n[l>>2]|0,It(u);while(l|0);n[o>>2]=0}function O4e(){return 11715}function L4e(){return 1496}function M4e(){return FP()|0}function U4e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(_4e(u),It(u)):l|0&&It(l)}function _4e(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function H4e(o){o=o|0,Lh(o)}function j4e(o,l){o=o|0,l=l|0;var u=0,A=0;Jy()|0,u=n[2652]|0;e:do if(u|0){for(;A=n[u+4>>2]|0,!(A|0&&!(EZ(YM(A)|0,o)|0));)if(u=n[u>>2]|0,!u)break e;G4e(A,l)}while(!1)}function YM(o){return o=o|0,n[o+12>>2]|0}function G4e(o,l){o=o|0,l=l|0;var u=0;o=o+36|0,u=n[o>>2]|0,u|0&&(Sf(u),It(u)),u=Kt(4)|0,DP(u,l),n[o>>2]=u}function VM(){return s[11716]|0||(n[2664]=0,gr(63,10656,U|0)|0,s[11716]=1),10656}function UX(){var o=0;return s[11717]|0?o=n[2665]|0:(q4e(),n[2665]=1504,s[11717]=1,o=1504),o|0}function q4e(){s[11740]|0||(s[11718]=yr(yr(8,0)|0,0)|0,s[11719]=yr(yr(0,0)|0,0)|0,s[11720]=yr(yr(0,16)|0,0)|0,s[11721]=yr(yr(8,0)|0,0)|0,s[11722]=yr(yr(0,0)|0,0)|0,s[11723]=yr(yr(8,0)|0,0)|0,s[11724]=yr(yr(0,0)|0,0)|0,s[11725]=yr(yr(8,0)|0,0)|0,s[11726]=yr(yr(0,0)|0,0)|0,s[11727]=yr(yr(8,0)|0,0)|0,s[11728]=yr(yr(0,0)|0,0)|0,s[11729]=yr(yr(0,0)|0,32)|0,s[11730]=yr(yr(0,0)|0,32)|0,s[11740]=1)}function _X(){return 1572}function W4e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,T=0,M=0,L=0;m=I,I=I+32|0,L=m+16|0,M=m+12|0,T=m+8|0,k=m+4|0,B=m,n[L>>2]=o,n[M>>2]=l,n[T>>2]=u,n[k>>2]=A,n[B>>2]=d,VM()|0,Y4e(10656,L,M,T,k,B),I=m}function Y4e(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0;var B=0;B=Kt(24)|0,gz(B+4|0,n[l>>2]|0,n[u>>2]|0,n[A>>2]|0,n[d>>2]|0,n[m>>2]|0),n[B>>2]=n[o>>2],n[o>>2]=B}function HX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0,tt=0,Ze=0,ct=0;if(ct=I,I=I+32|0,Le=ct+20|0,Qe=ct+8|0,tt=ct+4|0,Ze=ct,l=n[l>>2]|0,l|0){Ye=Le+4|0,T=Le+8|0,M=Qe+4|0,L=Qe+8|0,q=Qe+8|0,ae=Le+8|0;do{if(B=l+4|0,k=JM(B)|0,k|0){if(d=P2(k)|0,n[Le>>2]=0,n[Ye>>2]=0,n[T>>2]=0,A=(x2(k)|0)+1|0,V4e(Le,A),A|0)for(;A=A+-1|0,bu(Qe,n[d>>2]|0),m=n[Ye>>2]|0,m>>>0<(n[ae>>2]|0)>>>0?(n[m>>2]=n[Qe>>2],n[Ye>>2]=(n[Ye>>2]|0)+4):KM(Le,Qe),A;)d=d+4|0;A=k2(k)|0,n[Qe>>2]=0,n[M>>2]=0,n[L>>2]=0;e:do if(n[A>>2]|0)for(d=0,m=0;;){if((d|0)==(m|0)?J4e(Qe,A):(n[d>>2]=n[A>>2],n[M>>2]=(n[M>>2]|0)+4),A=A+4|0,!(n[A>>2]|0))break e;d=n[M>>2]|0,m=n[q>>2]|0}while(!1);n[tt>>2]=OP(B)|0,n[Ze>>2]=_r(k)|0,K4e(u,o,tt,Ze,Le,Qe),zM(Qe),np(Le)}l=n[l>>2]|0}while(l|0)}I=ct}function JM(o){return o=o|0,n[o+12>>2]|0}function P2(o){return o=o|0,n[o+12>>2]|0}function x2(o){return o=o|0,n[o+16>>2]|0}function V4e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;d=I,I=I+32|0,u=d,A=n[o>>2]|0,(n[o+8>>2]|0)-A>>2>>>0<l>>>0&&(KX(u,l,(n[o+4>>2]|0)-A>>2,o+8|0),zX(o,u),XX(u)),I=d}function KM(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0;if(B=I,I=I+32|0,u=B,A=o+4|0,d=((n[A>>2]|0)-(n[o>>2]|0)>>2)+1|0,m=JX(o)|0,m>>>0<d>>>0)an(o);else{k=n[o>>2]|0,M=(n[o+8>>2]|0)-k|0,T=M>>1,KX(u,M>>2>>>0<m>>>1>>>0?T>>>0<d>>>0?d:T:m,(n[A>>2]|0)-k>>2,o+8|0),m=u+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,zX(o,u),XX(u),I=B;return}}function k2(o){return o=o|0,n[o+8>>2]|0}function J4e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0;if(B=I,I=I+32|0,u=B,A=o+4|0,d=((n[A>>2]|0)-(n[o>>2]|0)>>2)+1|0,m=VX(o)|0,m>>>0<d>>>0)an(o);else{k=n[o>>2]|0,M=(n[o+8>>2]|0)-k|0,T=M>>1,h3e(u,M>>2>>>0<m>>>1>>>0?T>>>0<d>>>0?d:T:m,(n[A>>2]|0)-k>>2,o+8|0),m=u+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,g3e(o,u),d3e(u),I=B;return}}function OP(o){return o=o|0,n[o>>2]|0}function K4e(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,z4e(o,l,u,A,d,m)}function zM(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-4-A|0)>>>2)<<2)),It(u))}function np(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-4-A|0)>>>2)<<2)),It(u))}function z4e(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0;var B=0,k=0,T=0,M=0,L=0,q=0;B=I,I=I+48|0,L=B+40|0,k=B+32|0,q=B+24|0,T=B+12|0,M=B,Fl(k),o=Os(o)|0,n[q>>2]=n[l>>2],u=n[u>>2]|0,A=n[A>>2]|0,XM(T,d),X4e(M,m),n[L>>2]=n[q>>2],Z4e(o,L,u,A,T,M),zM(M),np(T),Nl(k),I=B}function XM(o,l){o=o|0,l=l|0;var u=0,A=0;n[o>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,u=l+4|0,A=(n[u>>2]|0)-(n[l>>2]|0)>>2,A|0&&(A3e(o,A),p3e(o,n[l>>2]|0,n[u>>2]|0,A))}function X4e(o,l){o=o|0,l=l|0;var u=0,A=0;n[o>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,u=l+4|0,A=(n[u>>2]|0)-(n[l>>2]|0)>>2,A|0&&(u3e(o,A),f3e(o,n[l>>2]|0,n[u>>2]|0,A))}function Z4e(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0;var B=0,k=0,T=0,M=0,L=0,q=0;B=I,I=I+32|0,L=B+28|0,q=B+24|0,k=B+12|0,T=B,M=da($4e()|0)|0,n[q>>2]=n[l>>2],n[L>>2]=n[q>>2],l=fd(L)|0,u=jX(u)|0,A=ZM(A)|0,n[k>>2]=n[d>>2],L=d+4|0,n[k+4>>2]=n[L>>2],q=d+8|0,n[k+8>>2]=n[q>>2],n[q>>2]=0,n[L>>2]=0,n[d>>2]=0,d=$M(k)|0,n[T>>2]=n[m>>2],L=m+4|0,n[T+4>>2]=n[L>>2],q=m+8|0,n[T+8>>2]=n[q>>2],n[q>>2]=0,n[L>>2]=0,n[m>>2]=0,lu(0,M|0,o|0,l|0,u|0,A|0,d|0,e3e(T)|0)|0,zM(T),np(k),I=B}function $4e(){var o=0;return s[7968]|0||(l3e(10708),o=7968,n[o>>2]=1,n[o+4>>2]=0),10708}function fd(o){return o=o|0,qX(o)|0}function jX(o){return o=o|0,GX(o)|0}function ZM(o){return o=o|0,RP(o)|0}function $M(o){return o=o|0,r3e(o)|0}function e3e(o){return o=o|0,t3e(o)|0}function t3e(o){o=o|0;var l=0,u=0,A=0;if(A=(n[o+4>>2]|0)-(n[o>>2]|0)|0,u=A>>2,A=Rl(A+4|0)|0,n[A>>2]=u,u|0){l=0;do n[A+4+(l<<2)>>2]=GX(n[(n[o>>2]|0)+(l<<2)>>2]|0)|0,l=l+1|0;while((l|0)!=(u|0))}return A|0}function GX(o){return o=o|0,o|0}function r3e(o){o=o|0;var l=0,u=0,A=0;if(A=(n[o+4>>2]|0)-(n[o>>2]|0)|0,u=A>>2,A=Rl(A+4|0)|0,n[A>>2]=u,u|0){l=0;do n[A+4+(l<<2)>>2]=qX((n[o>>2]|0)+(l<<2)|0)|0,l=l+1|0;while((l|0)!=(u|0))}return A|0}function qX(o){o=o|0;var l=0,u=0,A=0,d=0;return d=I,I=I+32|0,l=d+12|0,u=d,A=fM(WX()|0)|0,A?(AM(l,A),pM(u,l),Mje(o,u),o=hM(l)|0):o=n3e(o)|0,I=d,o|0}function WX(){var o=0;return s[7960]|0||(a3e(10664),gr(25,10664,U|0)|0,o=7960,n[o>>2]=1,n[o+4>>2]=0),10664}function n3e(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0;return u=I,I=I+16|0,d=u+4|0,B=u,A=Rl(8)|0,l=A,k=Kt(4)|0,n[k>>2]=n[o>>2],m=l+4|0,n[m>>2]=k,o=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],YX(o,m,d),n[A>>2]=o,I=u,l|0}function YX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Kt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1656,n[u+12>>2]=l,n[o+4>>2]=u}function i3e(o){o=o|0,$y(o),It(o)}function s3e(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function o3e(o){o=o|0,It(o)}function a3e(o){o=o|0,Lh(o)}function l3e(o){o=o|0,Qo(o,c3e()|0,5)}function c3e(){return 1676}function u3e(o,l){o=o|0,l=l|0;var u=0;if((VX(o)|0)>>>0<l>>>0&&an(o),l>>>0>1073741823)Nt();else{u=Kt(l<<2)|0,n[o+4>>2]=u,n[o>>2]=u,n[o+8>>2]=u+(l<<2);return}}function f3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,A=o+4|0,o=u-l|0,(o|0)>0&&(Qr(n[A>>2]|0,l|0,o|0)|0,n[A>>2]=(n[A>>2]|0)+(o>>>2<<2))}function VX(o){return o=o|0,1073741823}function A3e(o,l){o=o|0,l=l|0;var u=0;if((JX(o)|0)>>>0<l>>>0&&an(o),l>>>0>1073741823)Nt();else{u=Kt(l<<2)|0,n[o+4>>2]=u,n[o>>2]=u,n[o+8>>2]=u+(l<<2);return}}function p3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,A=o+4|0,o=u-l|0,(o|0)>0&&(Qr(n[A>>2]|0,l|0,o|0)|0,n[A>>2]=(n[A>>2]|0)+(o>>>2<<2))}function JX(o){return o=o|0,1073741823}function h3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>1073741823)Nt();else{d=Kt(l<<2)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<2)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<2)}function g3e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function d3e(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-4-l|0)>>>2)<<2)),o=n[o>>2]|0,o|0&&It(o)}function KX(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>1073741823)Nt();else{d=Kt(l<<2)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<2)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<2)}function zX(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function XX(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-4-l|0)>>>2)<<2)),o=n[o>>2]|0,o|0&&It(o)}function m3e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0;if(Qe=I,I=I+32|0,L=Qe+20|0,q=Qe+12|0,M=Qe+16|0,ae=Qe+4|0,Ye=Qe,Le=Qe+8|0,k=UX()|0,m=n[k>>2]|0,B=n[m>>2]|0,B|0)for(T=n[k+8>>2]|0,k=n[k+4>>2]|0;bu(L,B),y3e(o,L,k,T),m=m+4|0,B=n[m>>2]|0,B;)T=T+1|0,k=k+1|0;if(m=_X()|0,B=n[m>>2]|0,B|0)do bu(L,B),n[q>>2]=n[m+4>>2],E3e(l,L,q),m=m+8|0,B=n[m>>2]|0;while(B|0);if(m=n[(Jy()|0)>>2]|0,m|0)do l=n[m+4>>2]|0,bu(L,n[(Ky(l)|0)>>2]|0),n[q>>2]=YM(l)|0,I3e(u,L,q),m=n[m>>2]|0;while(m|0);if(bu(M,0),m=VM()|0,n[L>>2]=n[M>>2],HX(L,m,d),m=n[(Jy()|0)>>2]|0,m|0){o=L+4|0,l=L+8|0,u=L+8|0;do{if(T=n[m+4>>2]|0,bu(q,n[(Ky(T)|0)>>2]|0),C3e(ae,ZX(T)|0),B=n[ae>>2]|0,B|0){n[L>>2]=0,n[o>>2]=0,n[l>>2]=0;do bu(Ye,n[(Ky(n[B+4>>2]|0)|0)>>2]|0),k=n[o>>2]|0,k>>>0<(n[u>>2]|0)>>>0?(n[k>>2]=n[Ye>>2],n[o>>2]=(n[o>>2]|0)+4):KM(L,Ye),B=n[B>>2]|0;while(B|0);w3e(A,q,L),np(L)}n[Le>>2]=n[q>>2],M=$X(T)|0,n[L>>2]=n[Le>>2],HX(L,M,d),Cz(ae),m=n[m>>2]|0}while(m|0)}I=Qe}function y3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,F3e(o,l,u,A)}function E3e(o,l,u){o=o|0,l=l|0,u=u|0,R3e(o,l,u)}function Ky(o){return o=o|0,o|0}function I3e(o,l,u){o=o|0,l=l|0,u=u|0,x3e(o,l,u)}function ZX(o){return o=o|0,o+16|0}function C3e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;if(m=I,I=I+16|0,d=m+8|0,u=m,n[o>>2]=0,A=n[l>>2]|0,n[d>>2]=A,n[u>>2]=o,u=P3e(u)|0,A|0){if(A=Kt(12)|0,B=(eZ(d)|0)+4|0,o=n[B+4>>2]|0,l=A+4|0,n[l>>2]=n[B>>2],n[l+4>>2]=o,l=n[n[d>>2]>>2]|0,n[d>>2]=l,!l)o=A;else for(l=A;o=Kt(12)|0,T=(eZ(d)|0)+4|0,k=n[T+4>>2]|0,B=o+4|0,n[B>>2]=n[T>>2],n[B+4>>2]=k,n[l>>2]=o,B=n[n[d>>2]>>2]|0,n[d>>2]=B,B;)l=o;n[o>>2]=n[u>>2],n[u>>2]=A}I=m}function w3e(o,l,u){o=o|0,l=l|0,u=u|0,B3e(o,l,u)}function $X(o){return o=o|0,o+24|0}function B3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+32|0,B=A+24|0,d=A+16|0,k=A+12|0,m=A,Fl(d),o=Os(o)|0,n[k>>2]=n[l>>2],XM(m,u),n[B>>2]=n[k>>2],v3e(o,B,m),np(m),Nl(d),I=A}function v3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+32|0,B=A+16|0,k=A+12|0,d=A,m=da(S3e()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=fd(B)|0,n[d>>2]=n[u>>2],B=u+4|0,n[d+4>>2]=n[B>>2],k=u+8|0,n[d+8>>2]=n[k>>2],n[k>>2]=0,n[B>>2]=0,n[u>>2]=0,Ts(0,m|0,o|0,l|0,$M(d)|0)|0,np(d),I=A}function S3e(){var o=0;return s[7976]|0||(D3e(10720),o=7976,n[o>>2]=1,n[o+4>>2]=0),10720}function D3e(o){o=o|0,Qo(o,b3e()|0,2)}function b3e(){return 1732}function P3e(o){return o=o|0,n[o>>2]|0}function eZ(o){return o=o|0,n[o>>2]|0}function x3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+32|0,m=A+16|0,d=A+8|0,B=A,Fl(d),o=Os(o)|0,n[B>>2]=n[l>>2],u=n[u>>2]|0,n[m>>2]=n[B>>2],tZ(o,m,u),Nl(d),I=A}function tZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,m=A+4|0,B=A,d=da(k3e()|0)|0,n[B>>2]=n[l>>2],n[m>>2]=n[B>>2],l=fd(m)|0,Ts(0,d|0,o|0,l|0,jX(u)|0)|0,I=A}function k3e(){var o=0;return s[7984]|0||(Q3e(10732),o=7984,n[o>>2]=1,n[o+4>>2]=0),10732}function Q3e(o){o=o|0,Qo(o,T3e()|0,2)}function T3e(){return 1744}function R3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+32|0,m=A+16|0,d=A+8|0,B=A,Fl(d),o=Os(o)|0,n[B>>2]=n[l>>2],u=n[u>>2]|0,n[m>>2]=n[B>>2],tZ(o,m,u),Nl(d),I=A}function F3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;d=I,I=I+32|0,B=d+16|0,m=d+8|0,k=d,Fl(m),o=Os(o)|0,n[k>>2]=n[l>>2],u=s[u>>0]|0,A=s[A>>0]|0,n[B>>2]=n[k>>2],N3e(o,B,u,A),Nl(m),I=d}function N3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;d=I,I=I+16|0,B=d+4|0,k=d,m=da(O3e()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=fd(B)|0,u=zy(u)|0,Li(0,m|0,o|0,l|0,u|0,zy(A)|0)|0,I=d}function O3e(){var o=0;return s[7992]|0||(M3e(10744),o=7992,n[o>>2]=1,n[o+4>>2]=0),10744}function zy(o){return o=o|0,L3e(o)|0}function L3e(o){return o=o|0,o&255|0}function M3e(o){o=o|0,Qo(o,U3e()|0,3)}function U3e(){return 1756}function _3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;switch(ae=I,I=I+32|0,k=ae+8|0,T=ae+4|0,M=ae+20|0,L=ae,yM(o,0),A=Lje(l)|0,n[k>>2]=0,q=k+4|0,n[q>>2]=0,n[k+8>>2]=0,A<<24>>24){case 0:{s[M>>0]=0,H3e(T,u,M),LP(o,T)|0,Df(T);break}case 8:{q=sU(l)|0,s[M>>0]=8,bu(L,n[q+4>>2]|0),j3e(T,u,M,L,q+8|0),LP(o,T)|0,Df(T);break}case 9:{if(m=sU(l)|0,l=n[m+4>>2]|0,l|0)for(B=k+8|0,d=m+12|0;l=l+-1|0,bu(T,n[d>>2]|0),A=n[q>>2]|0,A>>>0<(n[B>>2]|0)>>>0?(n[A>>2]=n[T>>2],n[q>>2]=(n[q>>2]|0)+4):KM(k,T),l;)d=d+4|0;s[M>>0]=9,bu(L,n[m+8>>2]|0),G3e(T,u,M,L,k),LP(o,T)|0,Df(T);break}default:q=sU(l)|0,s[M>>0]=A,bu(L,n[q+4>>2]|0),q3e(T,u,M,L),LP(o,T)|0,Df(T)}np(k),I=ae}function H3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;A=I,I=I+16|0,d=A,Fl(d),l=Os(l)|0,n8e(o,l,s[u>>0]|0),Nl(d),I=A}function LP(o,l){o=o|0,l=l|0;var u=0;return u=n[o>>2]|0,u|0&&Na(u|0),n[o>>2]=n[l>>2],n[l>>2]=0,o|0}function j3e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,T=0;m=I,I=I+32|0,k=m+16|0,B=m+8|0,T=m,Fl(B),l=Os(l)|0,u=s[u>>0]|0,n[T>>2]=n[A>>2],d=n[d>>2]|0,n[k>>2]=n[T>>2],$3e(o,l,u,k,d),Nl(B),I=m}function G3e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,T=0,M=0;m=I,I=I+32|0,T=m+24|0,B=m+16|0,M=m+12|0,k=m,Fl(B),l=Os(l)|0,u=s[u>>0]|0,n[M>>2]=n[A>>2],XM(k,d),n[T>>2]=n[M>>2],K3e(o,l,u,T,k),np(k),Nl(B),I=m}function q3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;d=I,I=I+32|0,B=d+16|0,m=d+8|0,k=d,Fl(m),l=Os(l)|0,u=s[u>>0]|0,n[k>>2]=n[A>>2],n[B>>2]=n[k>>2],W3e(o,l,u,B),Nl(m),I=d}function W3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;d=I,I=I+16|0,m=d+4|0,k=d,B=da(Y3e()|0)|0,u=zy(u)|0,n[k>>2]=n[A>>2],n[m>>2]=n[k>>2],MP(o,Ts(0,B|0,l|0,u|0,fd(m)|0)|0),I=d}function Y3e(){var o=0;return s[8e3]|0||(V3e(10756),o=8e3,n[o>>2]=1,n[o+4>>2]=0),10756}function MP(o,l){o=o|0,l=l|0,yM(o,l)}function V3e(o){o=o|0,Qo(o,J3e()|0,2)}function J3e(){return 1772}function K3e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,T=0,M=0;m=I,I=I+32|0,T=m+16|0,M=m+12|0,B=m,k=da(z3e()|0)|0,u=zy(u)|0,n[M>>2]=n[A>>2],n[T>>2]=n[M>>2],A=fd(T)|0,n[B>>2]=n[d>>2],T=d+4|0,n[B+4>>2]=n[T>>2],M=d+8|0,n[B+8>>2]=n[M>>2],n[M>>2]=0,n[T>>2]=0,n[d>>2]=0,MP(o,Li(0,k|0,l|0,u|0,A|0,$M(B)|0)|0),np(B),I=m}function z3e(){var o=0;return s[8008]|0||(X3e(10768),o=8008,n[o>>2]=1,n[o+4>>2]=0),10768}function X3e(o){o=o|0,Qo(o,Z3e()|0,3)}function Z3e(){return 1784}function $3e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,T=0;m=I,I=I+16|0,k=m+4|0,T=m,B=da(e8e()|0)|0,u=zy(u)|0,n[T>>2]=n[A>>2],n[k>>2]=n[T>>2],A=fd(k)|0,MP(o,Li(0,B|0,l|0,u|0,A|0,ZM(d)|0)|0),I=m}function e8e(){var o=0;return s[8016]|0||(t8e(10780),o=8016,n[o>>2]=1,n[o+4>>2]=0),10780}function t8e(o){o=o|0,Qo(o,r8e()|0,3)}function r8e(){return 1800}function n8e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=da(i8e()|0)|0,MP(o,dn(0,A|0,l|0,zy(u)|0)|0)}function i8e(){var o=0;return s[8024]|0||(s8e(10792),o=8024,n[o>>2]=1,n[o+4>>2]=0),10792}function s8e(o){o=o|0,Qo(o,o8e()|0,1)}function o8e(){return 1816}function a8e(){l8e(),c8e(),u8e()}function l8e(){n[2702]=xZ(65536)|0}function c8e(){k8e(10856)}function u8e(){f8e(10816)}function f8e(o){o=o|0,A8e(o,5044),p8e(o)|0}function A8e(o,l){o=o|0,l=l|0;var u=0;u=WX()|0,n[o>>2]=u,v8e(u,l),jh(n[o>>2]|0)}function p8e(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,h8e()|0),o|0}function h8e(){var o=0;return s[8032]|0||(rZ(10820),gr(64,10820,U|0)|0,o=8032,n[o>>2]=1,n[o+4>>2]=0),_r(10820)|0||rZ(10820),10820}function rZ(o){o=o|0,m8e(o),ud(o,25)}function g8e(o){o=o|0,d8e(o+24|0)}function d8e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function m8e(o){o=o|0;var l=0;l=tn()|0,rn(o,5,18,l,C8e()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function y8e(o,l){o=o|0,l=l|0,E8e(o,l)}function E8e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;u=I,I=I+16|0,A=u,d=u+4|0,ad(d,l),n[A>>2]=ld(d,l)|0,I8e(o,A),I=u}function I8e(o,l){o=o|0,l=l|0,nZ(o+4|0,n[l>>2]|0),s[o+8>>0]=1}function nZ(o,l){o=o|0,l=l|0,n[o>>2]=l}function C8e(){return 1824}function w8e(o){return o=o|0,B8e(o)|0}function B8e(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0;return u=I,I=I+16|0,d=u+4|0,B=u,A=Rl(8)|0,l=A,k=Kt(4)|0,ad(d,o),nZ(k,ld(d,o)|0),m=l+4|0,n[m>>2]=k,o=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],YX(o,m,d),n[A>>2]=o,I=u,l|0}function Rl(o){o=o|0;var l=0,u=0;return o=o+7&-8,o>>>0<=32768&&(l=n[2701]|0,o>>>0<=(65536-l|0)>>>0)?(u=(n[2702]|0)+l|0,n[2701]=l+o,o=u):(o=xZ(o+8|0)|0,n[o>>2]=n[2703],n[2703]=o,o=o+8|0),o|0}function v8e(o,l){o=o|0,l=l|0,n[o>>2]=S8e()|0,n[o+4>>2]=D8e()|0,n[o+12>>2]=l,n[o+8>>2]=b8e()|0,n[o+32>>2]=9}function S8e(){return 11744}function D8e(){return 1832}function b8e(){return NP()|0}function P8e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(x8e(u),It(u)):l|0&&It(l)}function x8e(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function k8e(o){o=o|0,Q8e(o,5052),T8e(o)|0,R8e(o,5058,26)|0,F8e(o,5069,1)|0,N8e(o,5077,10)|0,O8e(o,5087,19)|0,L8e(o,5094,27)|0}function Q8e(o,l){o=o|0,l=l|0;var u=0;u=xje()|0,n[o>>2]=u,kje(u,l),jh(n[o>>2]|0)}function T8e(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,gje()|0),o|0}function R8e(o,l,u){return o=o|0,l=l|0,u=u|0,XHe(o,Bn(l)|0,u,0),o|0}function F8e(o,l,u){return o=o|0,l=l|0,u=u|0,OHe(o,Bn(l)|0,u,0),o|0}function N8e(o,l,u){return o=o|0,l=l|0,u=u|0,hHe(o,Bn(l)|0,u,0),o|0}function O8e(o,l,u){return o=o|0,l=l|0,u=u|0,$8e(o,Bn(l)|0,u,0),o|0}function iZ(o,l){o=o|0,l=l|0;var u=0,A=0;e:for(;;){for(u=n[2703]|0;;){if((u|0)==(l|0))break e;if(A=n[u>>2]|0,n[2703]=A,!u)u=A;else break}It(u)}n[2701]=o}function L8e(o,l,u){return o=o|0,l=l|0,u=u|0,M8e(o,Bn(l)|0,u,0),o|0}function M8e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=eU()|0,o=U8e(u)|0,vn(m,l,d,o,_8e(u,A)|0,A)}function eU(){var o=0,l=0;if(s[8040]|0||(oZ(10860),gr(65,10860,U|0)|0,l=8040,n[l>>2]=1,n[l+4>>2]=0),!(_r(10860)|0)){o=10860,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));oZ(10860)}return 10860}function U8e(o){return o=o|0,o|0}function _8e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,T=eU()|0,B=T+24|0,l=yr(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(sZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(H8e(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function sZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function H8e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=j8e(o)|0,A>>>0<B>>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,G8e(d,L>>3>>>0<A>>>1>>>0?M>>>0<B>>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=d+8|0,sZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,q8e(o,d),W8e(d),I=k;return}}function j8e(o){return o=o|0,536870911}function G8e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function q8e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function W8e(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function oZ(o){o=o|0,J8e(o)}function Y8e(o){o=o|0,V8e(o+24|0)}function V8e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function J8e(o){o=o|0;var l=0;l=tn()|0,rn(o,1,11,l,K8e()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function K8e(){return 1840}function z8e(o,l,u){o=o|0,l=l|0,u=u|0,Z8e(n[(X8e(o)|0)>>2]|0,l,u)}function X8e(o){return o=o|0,(n[(eU()|0)+24>>2]|0)+(o<<3)|0}function Z8e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;A=I,I=I+16|0,m=A+1|0,d=A,ad(m,l),l=ld(m,l)|0,ad(d,u),u=ld(d,u)|0,sp[o&31](l,u),I=A}function $8e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=tU()|0,o=eHe(u)|0,vn(m,l,d,o,tHe(u,A)|0,A)}function tU(){var o=0,l=0;if(s[8048]|0||(lZ(10896),gr(66,10896,U|0)|0,l=8048,n[l>>2]=1,n[l+4>>2]=0),!(_r(10896)|0)){o=10896,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));lZ(10896)}return 10896}function eHe(o){return o=o|0,o|0}function tHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,T=tU()|0,B=T+24|0,l=yr(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(aZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(rHe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function aZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function rHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=nHe(o)|0,A>>>0<B>>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,iHe(d,L>>3>>>0<A>>>1>>>0?M>>>0<B>>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=d+8|0,aZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,sHe(o,d),oHe(d),I=k;return}}function nHe(o){return o=o|0,536870911}function iHe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function sHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function oHe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function lZ(o){o=o|0,cHe(o)}function aHe(o){o=o|0,lHe(o+24|0)}function lHe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function cHe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,11,l,uHe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function uHe(){return 1852}function fHe(o,l){return o=o|0,l=l|0,pHe(n[(AHe(o)|0)>>2]|0,l)|0}function AHe(o){return o=o|0,(n[(tU()|0)+24>>2]|0)+(o<<3)|0}function pHe(o,l){o=o|0,l=l|0;var u=0,A=0;return u=I,I=I+16|0,A=u,ad(A,l),l=ld(A,l)|0,l=RP(gd[o&31](l)|0)|0,I=u,l|0}function hHe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=rU()|0,o=gHe(u)|0,vn(m,l,d,o,dHe(u,A)|0,A)}function rU(){var o=0,l=0;if(s[8056]|0||(uZ(10932),gr(67,10932,U|0)|0,l=8056,n[l>>2]=1,n[l+4>>2]=0),!(_r(10932)|0)){o=10932,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));uZ(10932)}return 10932}function gHe(o){return o=o|0,o|0}function dHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,T=rU()|0,B=T+24|0,l=yr(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(cZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(mHe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function cZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function mHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=yHe(o)|0,A>>>0<B>>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,EHe(d,L>>3>>>0<A>>>1>>>0?M>>>0<B>>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=d+8|0,cZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,IHe(o,d),CHe(d),I=k;return}}function yHe(o){return o=o|0,536870911}function EHe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function IHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function CHe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function uZ(o){o=o|0,vHe(o)}function wHe(o){o=o|0,BHe(o+24|0)}function BHe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function vHe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,7,l,SHe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function SHe(){return 1860}function DHe(o,l,u){return o=o|0,l=l|0,u=u|0,PHe(n[(bHe(o)|0)>>2]|0,l,u)|0}function bHe(o){return o=o|0,(n[(rU()|0)+24>>2]|0)+(o<<3)|0}function PHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0;return A=I,I=I+32|0,B=A+12|0,m=A+8|0,k=A,T=A+16|0,d=A+4|0,xHe(T,l),kHe(k,T,l),Mh(d,u),u=Uh(d,u)|0,n[B>>2]=n[k>>2],F2[o&15](m,B,u),u=QHe(m)|0,Df(m),_h(d),I=A,u|0}function xHe(o,l){o=o|0,l=l|0}function kHe(o,l,u){o=o|0,l=l|0,u=u|0,THe(o,u)}function QHe(o){return o=o|0,Os(o)|0}function THe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;d=I,I=I+16|0,u=d,A=l,A&1?(RHe(u,0),Me(A|0,u|0)|0,FHe(o,u),NHe(u)):n[o>>2]=n[l>>2],I=d}function RHe(o,l){o=o|0,l=l|0,Su(o,l),n[o+4>>2]=0,s[o+8>>0]=0}function FHe(o,l){o=o|0,l=l|0,n[o>>2]=n[l+4>>2]}function NHe(o){o=o|0,s[o+8>>0]=0}function OHe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=nU()|0,o=LHe(u)|0,vn(m,l,d,o,MHe(u,A)|0,A)}function nU(){var o=0,l=0;if(s[8064]|0||(AZ(10968),gr(68,10968,U|0)|0,l=8064,n[l>>2]=1,n[l+4>>2]=0),!(_r(10968)|0)){o=10968,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));AZ(10968)}return 10968}function LHe(o){return o=o|0,o|0}function MHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,T=nU()|0,B=T+24|0,l=yr(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(fZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(UHe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function fZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function UHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=_He(o)|0,A>>>0<B>>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,HHe(d,L>>3>>>0<A>>>1>>>0?M>>>0<B>>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=d+8|0,fZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,jHe(o,d),GHe(d),I=k;return}}function _He(o){return o=o|0,536870911}function HHe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function jHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function GHe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function AZ(o){o=o|0,YHe(o)}function qHe(o){o=o|0,WHe(o+24|0)}function WHe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function YHe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,1,l,VHe()|0,5),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function VHe(){return 1872}function JHe(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,zHe(n[(KHe(o)|0)>>2]|0,l,u,A,d,m)}function KHe(o){return o=o|0,(n[(nU()|0)+24>>2]|0)+(o<<3)|0}function zHe(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0;var B=0,k=0,T=0,M=0,L=0,q=0;B=I,I=I+32|0,k=B+16|0,T=B+12|0,M=B+8|0,L=B+4|0,q=B,Mh(k,l),l=Uh(k,l)|0,Mh(T,u),u=Uh(T,u)|0,Mh(M,A),A=Uh(M,A)|0,Mh(L,d),d=Uh(L,d)|0,Mh(q,m),m=Uh(q,m)|0,FZ[o&1](l,u,A,d,m),_h(q),_h(L),_h(M),_h(T),_h(k),I=B}function XHe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=iU()|0,o=ZHe(u)|0,vn(m,l,d,o,$He(u,A)|0,A)}function iU(){var o=0,l=0;if(s[8072]|0||(hZ(11004),gr(69,11004,U|0)|0,l=8072,n[l>>2]=1,n[l+4>>2]=0),!(_r(11004)|0)){o=11004,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));hZ(11004)}return 11004}function ZHe(o){return o=o|0,o|0}function $He(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,T=iU()|0,B=T+24|0,l=yr(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(pZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(eje(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function pZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function eje(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=tje(o)|0,A>>>0<B>>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,rje(d,L>>3>>>0<A>>>1>>>0?M>>>0<B>>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=d+8|0,pZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,nje(o,d),ije(d),I=k;return}}function tje(o){return o=o|0,536870911}function rje(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function nje(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function ije(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function hZ(o){o=o|0,aje(o)}function sje(o){o=o|0,oje(o+24|0)}function oje(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function aje(o){o=o|0;var l=0;l=tn()|0,rn(o,1,12,l,lje()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function lje(){return 1896}function cje(o,l,u){o=o|0,l=l|0,u=u|0,fje(n[(uje(o)|0)>>2]|0,l,u)}function uje(o){return o=o|0,(n[(iU()|0)+24>>2]|0)+(o<<3)|0}function fje(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;A=I,I=I+16|0,m=A+4|0,d=A,Aje(m,l),l=pje(m,l)|0,Mh(d,u),u=Uh(d,u)|0,sp[o&31](l,u),_h(d),I=A}function Aje(o,l){o=o|0,l=l|0}function pje(o,l){return o=o|0,l=l|0,hje(l)|0}function hje(o){return o=o|0,o|0}function gje(){var o=0;return s[8080]|0||(gZ(11040),gr(70,11040,U|0)|0,o=8080,n[o>>2]=1,n[o+4>>2]=0),_r(11040)|0||gZ(11040),11040}function gZ(o){o=o|0,yje(o),ud(o,71)}function dje(o){o=o|0,mje(o+24|0)}function mje(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function yje(o){o=o|0;var l=0;l=tn()|0,rn(o,5,7,l,wje()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function Eje(o){o=o|0,Ije(o)}function Ije(o){o=o|0,Cje(o)}function Cje(o){o=o|0,s[o+8>>0]=1}function wje(){return 1936}function Bje(){return vje()|0}function vje(){var o=0,l=0,u=0,A=0,d=0,m=0,B=0;return l=I,I=I+16|0,d=l+4|0,B=l,u=Rl(8)|0,o=u,m=o+4|0,n[m>>2]=Kt(1)|0,A=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],Sje(A,m,d),n[u>>2]=A,I=l,o|0}function Sje(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Kt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1916,n[u+12>>2]=l,n[o+4>>2]=u}function Dje(o){o=o|0,$y(o),It(o)}function bje(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function Pje(o){o=o|0,It(o)}function xje(){var o=0;return s[8088]|0||(Oje(11076),gr(25,11076,U|0)|0,o=8088,n[o>>2]=1,n[o+4>>2]=0),11076}function kje(o,l){o=o|0,l=l|0,n[o>>2]=Qje()|0,n[o+4>>2]=Tje()|0,n[o+12>>2]=l,n[o+8>>2]=Rje()|0,n[o+32>>2]=10}function Qje(){return 11745}function Tje(){return 1940}function Rje(){return FP()|0}function Fje(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(Nje(u),It(u)):l|0&&It(l)}function Nje(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function Oje(o){o=o|0,Lh(o)}function bu(o,l){o=o|0,l=l|0,n[o>>2]=l}function sU(o){return o=o|0,n[o>>2]|0}function Lje(o){return o=o|0,s[n[o>>2]>>0]|0}function Mje(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,n[A>>2]=n[o>>2],Uje(l,A)|0,I=u}function Uje(o,l){o=o|0,l=l|0;var u=0;return u=_je(n[o>>2]|0,l)|0,l=o+4|0,n[(n[l>>2]|0)+8>>2]=u,n[(n[l>>2]|0)+8>>2]|0}function _je(o,l){o=o|0,l=l|0;var u=0,A=0;return u=I,I=I+16|0,A=u,Fl(A),o=Os(o)|0,l=Hje(o,n[l>>2]|0)|0,Nl(A),I=u,l|0}function Fl(o){o=o|0,n[o>>2]=n[2701],n[o+4>>2]=n[2703]}function Hje(o,l){o=o|0,l=l|0;var u=0;return u=da(jje()|0)|0,dn(0,u|0,o|0,ZM(l)|0)|0}function Nl(o){o=o|0,iZ(n[o>>2]|0,n[o+4>>2]|0)}function jje(){var o=0;return s[8096]|0||(Gje(11120),o=8096,n[o>>2]=1,n[o+4>>2]=0),11120}function Gje(o){o=o|0,Qo(o,qje()|0,1)}function qje(){return 1948}function Wje(){Yje()}function Yje(){var o=0,l=0,u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0;if(Le=I,I=I+16|0,L=Le+4|0,q=Le,oa(65536,10804,n[2702]|0,10812),u=UX()|0,l=n[u>>2]|0,o=n[l>>2]|0,o|0)for(A=n[u+8>>2]|0,u=n[u+4>>2]|0;pf(o|0,c[u>>0]|0|0,s[A>>0]|0),l=l+4|0,o=n[l>>2]|0,o;)A=A+1|0,u=u+1|0;if(o=_X()|0,l=n[o>>2]|0,l|0)do NA(l|0,n[o+4>>2]|0),o=o+8|0,l=n[o>>2]|0;while(l|0);NA(Vje()|0,5167),M=Jy()|0,o=n[M>>2]|0;e:do if(o|0){do Jje(n[o+4>>2]|0),o=n[o>>2]|0;while(o|0);if(o=n[M>>2]|0,o|0){T=M;do{for(;d=o,o=n[o>>2]|0,d=n[d+4>>2]|0,!!(Kje(d)|0);)if(n[q>>2]=T,n[L>>2]=n[q>>2],zje(M,L)|0,!o)break e;if(Xje(d),T=n[T>>2]|0,l=dZ(d)|0,m=Oi()|0,B=I,I=I+((1*(l<<2)|0)+15&-16)|0,k=I,I=I+((1*(l<<2)|0)+15&-16)|0,l=n[(ZX(d)|0)>>2]|0,l|0)for(u=B,A=k;n[u>>2]=n[(Ky(n[l+4>>2]|0)|0)>>2],n[A>>2]=n[l+8>>2],l=n[l>>2]|0,l;)u=u+4|0,A=A+4|0;Qe=Ky(d)|0,l=Zje(d)|0,u=dZ(d)|0,A=$je(d)|0,oc(Qe|0,l|0,B|0,k|0,u|0,A|0,YM(d)|0),FA(m|0)}while(o|0)}}while(!1);if(o=n[(VM()|0)>>2]|0,o|0)do Qe=o+4|0,M=JM(Qe)|0,d=k2(M)|0,m=P2(M)|0,B=(x2(M)|0)+1|0,k=UP(M)|0,T=mZ(Qe)|0,M=_r(M)|0,L=OP(Qe)|0,q=oU(Qe)|0,uu(0,d|0,m|0,B|0,k|0,T|0,M|0,L|0,q|0,aU(Qe)|0),o=n[o>>2]|0;while(o|0);o=n[(Jy()|0)>>2]|0;e:do if(o|0){t:for(;;){if(l=n[o+4>>2]|0,l|0&&(ae=n[(Ky(l)|0)>>2]|0,Ye=n[($X(l)|0)>>2]|0,Ye|0)){u=Ye;do{l=u+4|0,A=JM(l)|0;r:do if(A|0)switch(_r(A)|0){case 0:break t;case 4:case 3:case 2:{k=k2(A)|0,T=P2(A)|0,M=(x2(A)|0)+1|0,L=UP(A)|0,q=_r(A)|0,Qe=OP(l)|0,uu(ae|0,k|0,T|0,M|0,L|0,0,q|0,Qe|0,oU(l)|0,aU(l)|0);break r}case 1:{B=k2(A)|0,k=P2(A)|0,T=(x2(A)|0)+1|0,M=UP(A)|0,L=mZ(l)|0,q=_r(A)|0,Qe=OP(l)|0,uu(ae|0,B|0,k|0,T|0,M|0,L|0,q|0,Qe|0,oU(l)|0,aU(l)|0);break r}case 5:{M=k2(A)|0,L=P2(A)|0,q=(x2(A)|0)+1|0,Qe=UP(A)|0,uu(ae|0,M|0,L|0,q|0,Qe|0,e6e(A)|0,_r(A)|0,0,0,0);break r}default:break r}while(!1);u=n[u>>2]|0}while(u|0)}if(o=n[o>>2]|0,!o)break e}Nt()}while(!1);ve(),I=Le}function Vje(){return 11703}function Jje(o){o=o|0,s[o+40>>0]=0}function Kje(o){return o=o|0,(s[o+40>>0]|0)!=0|0}function zje(o,l){return o=o|0,l=l|0,l=t6e(l)|0,o=n[l>>2]|0,n[l>>2]=n[o>>2],It(o),n[l>>2]|0}function Xje(o){o=o|0,s[o+40>>0]=1}function dZ(o){return o=o|0,n[o+20>>2]|0}function Zje(o){return o=o|0,n[o+8>>2]|0}function $je(o){return o=o|0,n[o+32>>2]|0}function UP(o){return o=o|0,n[o+4>>2]|0}function mZ(o){return o=o|0,n[o+4>>2]|0}function oU(o){return o=o|0,n[o+8>>2]|0}function aU(o){return o=o|0,n[o+16>>2]|0}function e6e(o){return o=o|0,n[o+20>>2]|0}function t6e(o){return o=o|0,n[o>>2]|0}function _P(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0,tt=0,Ze=0,ct=0,He=0,We=0,Lt=0;Lt=I,I=I+16|0,ae=Lt;do if(o>>>0<245){if(M=o>>>0<11?16:o+11&-8,o=M>>>3,q=n[2783]|0,u=q>>>o,u&3|0)return l=(u&1^1)+o|0,o=11172+(l<<1<<2)|0,u=o+8|0,A=n[u>>2]|0,d=A+8|0,m=n[d>>2]|0,(o|0)==(m|0)?n[2783]=q&~(1<<l):(n[m+12>>2]=o,n[u>>2]=m),We=l<<3,n[A+4>>2]=We|3,We=A+We+4|0,n[We>>2]=n[We>>2]|1,We=d,I=Lt,We|0;if(L=n[2785]|0,M>>>0>L>>>0){if(u|0)return l=2<<o,l=u<<o&(l|0-l),l=(l&0-l)+-1|0,B=l>>>12&16,l=l>>>B,u=l>>>5&8,l=l>>>u,d=l>>>2&4,l=l>>>d,o=l>>>1&2,l=l>>>o,A=l>>>1&1,A=(u|B|d|o|A)+(l>>>A)|0,l=11172+(A<<1<<2)|0,o=l+8|0,d=n[o>>2]|0,B=d+8|0,u=n[B>>2]|0,(l|0)==(u|0)?(o=q&~(1<<A),n[2783]=o):(n[u+12>>2]=l,n[o>>2]=u,o=q),m=(A<<3)-M|0,n[d+4>>2]=M|3,A=d+M|0,n[A+4>>2]=m|1,n[A+m>>2]=m,L|0&&(d=n[2788]|0,l=L>>>3,u=11172+(l<<1<<2)|0,l=1<<l,o&l?(o=u+8|0,l=n[o>>2]|0):(n[2783]=o|l,l=u,o=u+8|0),n[o>>2]=d,n[l+12>>2]=d,n[d+8>>2]=l,n[d+12>>2]=u),n[2785]=m,n[2788]=A,We=B,I=Lt,We|0;if(k=n[2784]|0,k){if(u=(k&0-k)+-1|0,B=u>>>12&16,u=u>>>B,m=u>>>5&8,u=u>>>m,T=u>>>2&4,u=u>>>T,A=u>>>1&2,u=u>>>A,o=u>>>1&1,o=n[11436+((m|B|T|A|o)+(u>>>o)<<2)>>2]|0,u=(n[o+4>>2]&-8)-M|0,A=n[o+16+(((n[o+16>>2]|0)==0&1)<<2)>>2]|0,!A)T=o,m=u;else{do B=(n[A+4>>2]&-8)-M|0,T=B>>>0<u>>>0,u=T?B:u,o=T?A:o,A=n[A+16+(((n[A+16>>2]|0)==0&1)<<2)>>2]|0;while(A|0);T=o,m=u}if(B=T+M|0,T>>>0<B>>>0){d=n[T+24>>2]|0,l=n[T+12>>2]|0;do if((l|0)==(T|0)){if(o=T+20|0,l=n[o>>2]|0,!l&&(o=T+16|0,l=n[o>>2]|0,!l)){u=0;break}for(;;){if(u=l+20|0,A=n[u>>2]|0,A|0){l=A,o=u;continue}if(u=l+16|0,A=n[u>>2]|0,A)l=A,o=u;else break}n[o>>2]=0,u=l}else u=n[T+8>>2]|0,n[u+12>>2]=l,n[l+8>>2]=u,u=l;while(!1);do if(d|0){if(l=n[T+28>>2]|0,o=11436+(l<<2)|0,(T|0)==(n[o>>2]|0)){if(n[o>>2]=u,!u){n[2784]=k&~(1<<l);break}}else if(n[d+16+(((n[d+16>>2]|0)!=(T|0)&1)<<2)>>2]=u,!u)break;n[u+24>>2]=d,l=n[T+16>>2]|0,l|0&&(n[u+16>>2]=l,n[l+24>>2]=u),l=n[T+20>>2]|0,l|0&&(n[u+20>>2]=l,n[l+24>>2]=u)}while(!1);return m>>>0<16?(We=m+M|0,n[T+4>>2]=We|3,We=T+We+4|0,n[We>>2]=n[We>>2]|1):(n[T+4>>2]=M|3,n[B+4>>2]=m|1,n[B+m>>2]=m,L|0&&(A=n[2788]|0,l=L>>>3,u=11172+(l<<1<<2)|0,l=1<<l,q&l?(o=u+8|0,l=n[o>>2]|0):(n[2783]=q|l,l=u,o=u+8|0),n[o>>2]=A,n[l+12>>2]=A,n[A+8>>2]=l,n[A+12>>2]=u),n[2785]=m,n[2788]=B),We=T+8|0,I=Lt,We|0}else q=M}else q=M}else q=M}else if(o>>>0<=4294967231)if(o=o+11|0,M=o&-8,T=n[2784]|0,T){A=0-M|0,o=o>>>8,o?M>>>0>16777215?k=31:(q=(o+1048320|0)>>>16&8,He=o<<q,L=(He+520192|0)>>>16&4,He=He<<L,k=(He+245760|0)>>>16&2,k=14-(L|q|k)+(He<<k>>>15)|0,k=M>>>(k+7|0)&1|k<<1):k=0,u=n[11436+(k<<2)>>2]|0;e:do if(!u)u=0,o=0,He=57;else for(o=0,B=M<<((k|0)==31?0:25-(k>>>1)|0),m=0;;){if(d=(n[u+4>>2]&-8)-M|0,d>>>0<A>>>0)if(d)o=u,A=d;else{o=u,A=0,d=u,He=61;break e}if(d=n[u+20>>2]|0,u=n[u+16+(B>>>31<<2)>>2]|0,m=(d|0)==0|(d|0)==(u|0)?m:d,d=(u|0)==0,d){u=m,He=57;break}else B=B<<((d^1)&1)}while(!1);if((He|0)==57){if((u|0)==0&(o|0)==0){if(o=2<<k,o=T&(o|0-o),!o){q=M;break}q=(o&0-o)+-1|0,B=q>>>12&16,q=q>>>B,m=q>>>5&8,q=q>>>m,k=q>>>2&4,q=q>>>k,L=q>>>1&2,q=q>>>L,u=q>>>1&1,o=0,u=n[11436+((m|B|k|L|u)+(q>>>u)<<2)>>2]|0}u?(d=u,He=61):(k=o,B=A)}if((He|0)==61)for(;;)if(He=0,u=(n[d+4>>2]&-8)-M|0,q=u>>>0<A>>>0,u=q?u:A,o=q?d:o,d=n[d+16+(((n[d+16>>2]|0)==0&1)<<2)>>2]|0,d)A=u,He=61;else{k=o,B=u;break}if(k|0&&B>>>0<((n[2785]|0)-M|0)>>>0){if(m=k+M|0,k>>>0>=m>>>0)return We=0,I=Lt,We|0;d=n[k+24>>2]|0,l=n[k+12>>2]|0;do if((l|0)==(k|0)){if(o=k+20|0,l=n[o>>2]|0,!l&&(o=k+16|0,l=n[o>>2]|0,!l)){l=0;break}for(;;){if(u=l+20|0,A=n[u>>2]|0,A|0){l=A,o=u;continue}if(u=l+16|0,A=n[u>>2]|0,A)l=A,o=u;else break}n[o>>2]=0}else We=n[k+8>>2]|0,n[We+12>>2]=l,n[l+8>>2]=We;while(!1);do if(d){if(o=n[k+28>>2]|0,u=11436+(o<<2)|0,(k|0)==(n[u>>2]|0)){if(n[u>>2]=l,!l){A=T&~(1<<o),n[2784]=A;break}}else if(n[d+16+(((n[d+16>>2]|0)!=(k|0)&1)<<2)>>2]=l,!l){A=T;break}n[l+24>>2]=d,o=n[k+16>>2]|0,o|0&&(n[l+16>>2]=o,n[o+24>>2]=l),o=n[k+20>>2]|0,o&&(n[l+20>>2]=o,n[o+24>>2]=l),A=T}else A=T;while(!1);do if(B>>>0>=16){if(n[k+4>>2]=M|3,n[m+4>>2]=B|1,n[m+B>>2]=B,l=B>>>3,B>>>0<256){u=11172+(l<<1<<2)|0,o=n[2783]|0,l=1<<l,o&l?(o=u+8|0,l=n[o>>2]|0):(n[2783]=o|l,l=u,o=u+8|0),n[o>>2]=m,n[l+12>>2]=m,n[m+8>>2]=l,n[m+12>>2]=u;break}if(l=B>>>8,l?B>>>0>16777215?l=31:(He=(l+1048320|0)>>>16&8,We=l<<He,ct=(We+520192|0)>>>16&4,We=We<<ct,l=(We+245760|0)>>>16&2,l=14-(ct|He|l)+(We<<l>>>15)|0,l=B>>>(l+7|0)&1|l<<1):l=0,u=11436+(l<<2)|0,n[m+28>>2]=l,o=m+16|0,n[o+4>>2]=0,n[o>>2]=0,o=1<<l,!(A&o)){n[2784]=A|o,n[u>>2]=m,n[m+24>>2]=u,n[m+12>>2]=m,n[m+8>>2]=m;break}for(o=B<<((l|0)==31?0:25-(l>>>1)|0),u=n[u>>2]|0;;){if((n[u+4>>2]&-8|0)==(B|0)){He=97;break}if(A=u+16+(o>>>31<<2)|0,l=n[A>>2]|0,l)o=o<<1,u=l;else{He=96;break}}if((He|0)==96){n[A>>2]=m,n[m+24>>2]=u,n[m+12>>2]=m,n[m+8>>2]=m;break}else if((He|0)==97){He=u+8|0,We=n[He>>2]|0,n[We+12>>2]=m,n[He>>2]=m,n[m+8>>2]=We,n[m+12>>2]=u,n[m+24>>2]=0;break}}else We=B+M|0,n[k+4>>2]=We|3,We=k+We+4|0,n[We>>2]=n[We>>2]|1;while(!1);return We=k+8|0,I=Lt,We|0}else q=M}else q=M;else q=-1;while(!1);if(u=n[2785]|0,u>>>0>=q>>>0)return l=u-q|0,o=n[2788]|0,l>>>0>15?(We=o+q|0,n[2788]=We,n[2785]=l,n[We+4>>2]=l|1,n[We+l>>2]=l,n[o+4>>2]=q|3):(n[2785]=0,n[2788]=0,n[o+4>>2]=u|3,We=o+u+4|0,n[We>>2]=n[We>>2]|1),We=o+8|0,I=Lt,We|0;if(B=n[2786]|0,B>>>0>q>>>0)return ct=B-q|0,n[2786]=ct,We=n[2789]|0,He=We+q|0,n[2789]=He,n[He+4>>2]=ct|1,n[We+4>>2]=q|3,We=We+8|0,I=Lt,We|0;if(n[2901]|0?o=n[2903]|0:(n[2903]=4096,n[2902]=4096,n[2904]=-1,n[2905]=-1,n[2906]=0,n[2894]=0,o=ae&-16^1431655768,n[ae>>2]=o,n[2901]=o,o=4096),k=q+48|0,T=q+47|0,m=o+T|0,d=0-o|0,M=m&d,M>>>0<=q>>>0||(o=n[2893]|0,o|0&&(L=n[2891]|0,ae=L+M|0,ae>>>0<=L>>>0|ae>>>0>o>>>0)))return We=0,I=Lt,We|0;e:do if(n[2894]&4)l=0,He=133;else{u=n[2789]|0;t:do if(u){for(A=11580;o=n[A>>2]|0,!(o>>>0<=u>>>0&&(Qe=A+4|0,(o+(n[Qe>>2]|0)|0)>>>0>u>>>0));)if(o=n[A+8>>2]|0,o)A=o;else{He=118;break t}if(l=m-B&d,l>>>0<2147483647)if(o=qh(l|0)|0,(o|0)==((n[A>>2]|0)+(n[Qe>>2]|0)|0)){if((o|0)!=-1){B=l,m=o,He=135;break e}}else A=o,He=126;else l=0}else He=118;while(!1);do if((He|0)==118)if(u=qh(0)|0,(u|0)!=-1&&(l=u,Ye=n[2902]|0,Le=Ye+-1|0,l=(Le&l|0?(Le+l&0-Ye)-l|0:0)+M|0,Ye=n[2891]|0,Le=l+Ye|0,l>>>0>q>>>0&l>>>0<2147483647)){if(Qe=n[2893]|0,Qe|0&&Le>>>0<=Ye>>>0|Le>>>0>Qe>>>0){l=0;break}if(o=qh(l|0)|0,(o|0)==(u|0)){B=l,m=u,He=135;break e}else A=o,He=126}else l=0;while(!1);do if((He|0)==126){if(u=0-l|0,!(k>>>0>l>>>0&(l>>>0<2147483647&(A|0)!=-1)))if((A|0)==-1){l=0;break}else{B=l,m=A,He=135;break e}if(o=n[2903]|0,o=T-l+o&0-o,o>>>0>=2147483647){B=l,m=A,He=135;break e}if((qh(o|0)|0)==-1){qh(u|0)|0,l=0;break}else{B=o+l|0,m=A,He=135;break e}}while(!1);n[2894]=n[2894]|4,He=133}while(!1);if((He|0)==133&&M>>>0<2147483647&&(ct=qh(M|0)|0,Qe=qh(0)|0,tt=Qe-ct|0,Ze=tt>>>0>(q+40|0)>>>0,!((ct|0)==-1|Ze^1|ct>>>0<Qe>>>0&((ct|0)!=-1&(Qe|0)!=-1)^1))&&(B=Ze?tt:l,m=ct,He=135),(He|0)==135){l=(n[2891]|0)+B|0,n[2891]=l,l>>>0>(n[2892]|0)>>>0&&(n[2892]=l),T=n[2789]|0;do if(T){for(l=11580;;){if(o=n[l>>2]|0,u=l+4|0,A=n[u>>2]|0,(m|0)==(o+A|0)){He=145;break}if(d=n[l+8>>2]|0,d)l=d;else break}if((He|0)==145&&!(n[l+12>>2]&8|0)&&T>>>0<m>>>0&T>>>0>=o>>>0){n[u>>2]=A+B,We=T+8|0,We=We&7|0?0-We&7:0,He=T+We|0,We=(n[2786]|0)+(B-We)|0,n[2789]=He,n[2786]=We,n[He+4>>2]=We|1,n[He+We+4>>2]=40,n[2790]=n[2905];break}for(m>>>0<(n[2787]|0)>>>0&&(n[2787]=m),u=m+B|0,l=11580;;){if((n[l>>2]|0)==(u|0)){He=153;break}if(o=n[l+8>>2]|0,o)l=o;else break}if((He|0)==153&&!(n[l+12>>2]&8|0)){n[l>>2]=m,L=l+4|0,n[L>>2]=(n[L>>2]|0)+B,L=m+8|0,L=m+(L&7|0?0-L&7:0)|0,l=u+8|0,l=u+(l&7|0?0-l&7:0)|0,M=L+q|0,k=l-L-q|0,n[L+4>>2]=q|3;do if((l|0)!=(T|0)){if((l|0)==(n[2788]|0)){We=(n[2785]|0)+k|0,n[2785]=We,n[2788]=M,n[M+4>>2]=We|1,n[M+We>>2]=We;break}if(o=n[l+4>>2]|0,(o&3|0)==1){B=o&-8,A=o>>>3;e:do if(o>>>0<256)if(o=n[l+8>>2]|0,u=n[l+12>>2]|0,(u|0)==(o|0)){n[2783]=n[2783]&~(1<<A);break}else{n[o+12>>2]=u,n[u+8>>2]=o;break}else{m=n[l+24>>2]|0,o=n[l+12>>2]|0;do if((o|0)==(l|0)){if(A=l+16|0,u=A+4|0,o=n[u>>2]|0,!o)if(o=n[A>>2]|0,o)u=A;else{o=0;break}for(;;){if(A=o+20|0,d=n[A>>2]|0,d|0){o=d,u=A;continue}if(A=o+16|0,d=n[A>>2]|0,d)o=d,u=A;else break}n[u>>2]=0}else We=n[l+8>>2]|0,n[We+12>>2]=o,n[o+8>>2]=We;while(!1);if(!m)break;u=n[l+28>>2]|0,A=11436+(u<<2)|0;do if((l|0)!=(n[A>>2]|0)){if(n[m+16+(((n[m+16>>2]|0)!=(l|0)&1)<<2)>>2]=o,!o)break e}else{if(n[A>>2]=o,o|0)break;n[2784]=n[2784]&~(1<<u);break e}while(!1);if(n[o+24>>2]=m,u=l+16|0,A=n[u>>2]|0,A|0&&(n[o+16>>2]=A,n[A+24>>2]=o),u=n[u+4>>2]|0,!u)break;n[o+20>>2]=u,n[u+24>>2]=o}while(!1);l=l+B|0,d=B+k|0}else d=k;if(l=l+4|0,n[l>>2]=n[l>>2]&-2,n[M+4>>2]=d|1,n[M+d>>2]=d,l=d>>>3,d>>>0<256){u=11172+(l<<1<<2)|0,o=n[2783]|0,l=1<<l,o&l?(o=u+8|0,l=n[o>>2]|0):(n[2783]=o|l,l=u,o=u+8|0),n[o>>2]=M,n[l+12>>2]=M,n[M+8>>2]=l,n[M+12>>2]=u;break}l=d>>>8;do if(!l)l=0;else{if(d>>>0>16777215){l=31;break}He=(l+1048320|0)>>>16&8,We=l<<He,ct=(We+520192|0)>>>16&4,We=We<<ct,l=(We+245760|0)>>>16&2,l=14-(ct|He|l)+(We<<l>>>15)|0,l=d>>>(l+7|0)&1|l<<1}while(!1);if(A=11436+(l<<2)|0,n[M+28>>2]=l,o=M+16|0,n[o+4>>2]=0,n[o>>2]=0,o=n[2784]|0,u=1<<l,!(o&u)){n[2784]=o|u,n[A>>2]=M,n[M+24>>2]=A,n[M+12>>2]=M,n[M+8>>2]=M;break}for(o=d<<((l|0)==31?0:25-(l>>>1)|0),u=n[A>>2]|0;;){if((n[u+4>>2]&-8|0)==(d|0)){He=194;break}if(A=u+16+(o>>>31<<2)|0,l=n[A>>2]|0,l)o=o<<1,u=l;else{He=193;break}}if((He|0)==193){n[A>>2]=M,n[M+24>>2]=u,n[M+12>>2]=M,n[M+8>>2]=M;break}else if((He|0)==194){He=u+8|0,We=n[He>>2]|0,n[We+12>>2]=M,n[He>>2]=M,n[M+8>>2]=We,n[M+12>>2]=u,n[M+24>>2]=0;break}}else We=(n[2786]|0)+k|0,n[2786]=We,n[2789]=M,n[M+4>>2]=We|1;while(!1);return We=L+8|0,I=Lt,We|0}for(l=11580;o=n[l>>2]|0,!(o>>>0<=T>>>0&&(We=o+(n[l+4>>2]|0)|0,We>>>0>T>>>0));)l=n[l+8>>2]|0;d=We+-47|0,o=d+8|0,o=d+(o&7|0?0-o&7:0)|0,d=T+16|0,o=o>>>0<d>>>0?T:o,l=o+8|0,u=m+8|0,u=u&7|0?0-u&7:0,He=m+u|0,u=B+-40-u|0,n[2789]=He,n[2786]=u,n[He+4>>2]=u|1,n[He+u+4>>2]=40,n[2790]=n[2905],u=o+4|0,n[u>>2]=27,n[l>>2]=n[2895],n[l+4>>2]=n[2896],n[l+8>>2]=n[2897],n[l+12>>2]=n[2898],n[2895]=m,n[2896]=B,n[2898]=0,n[2897]=l,l=o+24|0;do He=l,l=l+4|0,n[l>>2]=7;while((He+8|0)>>>0<We>>>0);if((o|0)!=(T|0)){if(m=o-T|0,n[u>>2]=n[u>>2]&-2,n[T+4>>2]=m|1,n[o>>2]=m,l=m>>>3,m>>>0<256){u=11172+(l<<1<<2)|0,o=n[2783]|0,l=1<<l,o&l?(o=u+8|0,l=n[o>>2]|0):(n[2783]=o|l,l=u,o=u+8|0),n[o>>2]=T,n[l+12>>2]=T,n[T+8>>2]=l,n[T+12>>2]=u;break}if(l=m>>>8,l?m>>>0>16777215?u=31:(He=(l+1048320|0)>>>16&8,We=l<<He,ct=(We+520192|0)>>>16&4,We=We<<ct,u=(We+245760|0)>>>16&2,u=14-(ct|He|u)+(We<<u>>>15)|0,u=m>>>(u+7|0)&1|u<<1):u=0,A=11436+(u<<2)|0,n[T+28>>2]=u,n[T+20>>2]=0,n[d>>2]=0,l=n[2784]|0,o=1<<u,!(l&o)){n[2784]=l|o,n[A>>2]=T,n[T+24>>2]=A,n[T+12>>2]=T,n[T+8>>2]=T;break}for(o=m<<((u|0)==31?0:25-(u>>>1)|0),u=n[A>>2]|0;;){if((n[u+4>>2]&-8|0)==(m|0)){He=216;break}if(A=u+16+(o>>>31<<2)|0,l=n[A>>2]|0,l)o=o<<1,u=l;else{He=215;break}}if((He|0)==215){n[A>>2]=T,n[T+24>>2]=u,n[T+12>>2]=T,n[T+8>>2]=T;break}else if((He|0)==216){He=u+8|0,We=n[He>>2]|0,n[We+12>>2]=T,n[He>>2]=T,n[T+8>>2]=We,n[T+12>>2]=u,n[T+24>>2]=0;break}}}else{We=n[2787]|0,(We|0)==0|m>>>0<We>>>0&&(n[2787]=m),n[2895]=m,n[2896]=B,n[2898]=0,n[2792]=n[2901],n[2791]=-1,l=0;do We=11172+(l<<1<<2)|0,n[We+12>>2]=We,n[We+8>>2]=We,l=l+1|0;while((l|0)!=32);We=m+8|0,We=We&7|0?0-We&7:0,He=m+We|0,We=B+-40-We|0,n[2789]=He,n[2786]=We,n[He+4>>2]=We|1,n[He+We+4>>2]=40,n[2790]=n[2905]}while(!1);if(l=n[2786]|0,l>>>0>q>>>0)return ct=l-q|0,n[2786]=ct,We=n[2789]|0,He=We+q|0,n[2789]=He,n[He+4>>2]=ct|1,n[We+4>>2]=q|3,We=We+8|0,I=Lt,We|0}return n[(Xy()|0)>>2]=12,We=0,I=Lt,We|0}function HP(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0,T=0;if(o){u=o+-8|0,d=n[2787]|0,o=n[o+-4>>2]|0,l=o&-8,T=u+l|0;do if(o&1)k=u,B=u;else{if(A=n[u>>2]|0,!(o&3)||(B=u+(0-A)|0,m=A+l|0,B>>>0<d>>>0))return;if((B|0)==(n[2788]|0)){if(o=T+4|0,l=n[o>>2]|0,(l&3|0)!=3){k=B,l=m;break}n[2785]=m,n[o>>2]=l&-2,n[B+4>>2]=m|1,n[B+m>>2]=m;return}if(u=A>>>3,A>>>0<256)if(o=n[B+8>>2]|0,l=n[B+12>>2]|0,(l|0)==(o|0)){n[2783]=n[2783]&~(1<<u),k=B,l=m;break}else{n[o+12>>2]=l,n[l+8>>2]=o,k=B,l=m;break}d=n[B+24>>2]|0,o=n[B+12>>2]|0;do if((o|0)==(B|0)){if(u=B+16|0,l=u+4|0,o=n[l>>2]|0,!o)if(o=n[u>>2]|0,o)l=u;else{o=0;break}for(;;){if(u=o+20|0,A=n[u>>2]|0,A|0){o=A,l=u;continue}if(u=o+16|0,A=n[u>>2]|0,A)o=A,l=u;else break}n[l>>2]=0}else k=n[B+8>>2]|0,n[k+12>>2]=o,n[o+8>>2]=k;while(!1);if(d){if(l=n[B+28>>2]|0,u=11436+(l<<2)|0,(B|0)==(n[u>>2]|0)){if(n[u>>2]=o,!o){n[2784]=n[2784]&~(1<<l),k=B,l=m;break}}else if(n[d+16+(((n[d+16>>2]|0)!=(B|0)&1)<<2)>>2]=o,!o){k=B,l=m;break}n[o+24>>2]=d,l=B+16|0,u=n[l>>2]|0,u|0&&(n[o+16>>2]=u,n[u+24>>2]=o),l=n[l+4>>2]|0,l?(n[o+20>>2]=l,n[l+24>>2]=o,k=B,l=m):(k=B,l=m)}else k=B,l=m}while(!1);if(!(B>>>0>=T>>>0)&&(o=T+4|0,A=n[o>>2]|0,!!(A&1))){if(A&2)n[o>>2]=A&-2,n[k+4>>2]=l|1,n[B+l>>2]=l,d=l;else{if(o=n[2788]|0,(T|0)==(n[2789]|0)){if(T=(n[2786]|0)+l|0,n[2786]=T,n[2789]=k,n[k+4>>2]=T|1,(k|0)!=(o|0))return;n[2788]=0,n[2785]=0;return}if((T|0)==(o|0)){T=(n[2785]|0)+l|0,n[2785]=T,n[2788]=B,n[k+4>>2]=T|1,n[B+T>>2]=T;return}d=(A&-8)+l|0,u=A>>>3;do if(A>>>0<256)if(l=n[T+8>>2]|0,o=n[T+12>>2]|0,(o|0)==(l|0)){n[2783]=n[2783]&~(1<<u);break}else{n[l+12>>2]=o,n[o+8>>2]=l;break}else{m=n[T+24>>2]|0,o=n[T+12>>2]|0;do if((o|0)==(T|0)){if(u=T+16|0,l=u+4|0,o=n[l>>2]|0,!o)if(o=n[u>>2]|0,o)l=u;else{u=0;break}for(;;){if(u=o+20|0,A=n[u>>2]|0,A|0){o=A,l=u;continue}if(u=o+16|0,A=n[u>>2]|0,A)o=A,l=u;else break}n[l>>2]=0,u=o}else u=n[T+8>>2]|0,n[u+12>>2]=o,n[o+8>>2]=u,u=o;while(!1);if(m|0){if(o=n[T+28>>2]|0,l=11436+(o<<2)|0,(T|0)==(n[l>>2]|0)){if(n[l>>2]=u,!u){n[2784]=n[2784]&~(1<<o);break}}else if(n[m+16+(((n[m+16>>2]|0)!=(T|0)&1)<<2)>>2]=u,!u)break;n[u+24>>2]=m,o=T+16|0,l=n[o>>2]|0,l|0&&(n[u+16>>2]=l,n[l+24>>2]=u),o=n[o+4>>2]|0,o|0&&(n[u+20>>2]=o,n[o+24>>2]=u)}}while(!1);if(n[k+4>>2]=d|1,n[B+d>>2]=d,(k|0)==(n[2788]|0)){n[2785]=d;return}}if(o=d>>>3,d>>>0<256){u=11172+(o<<1<<2)|0,l=n[2783]|0,o=1<<o,l&o?(l=u+8|0,o=n[l>>2]|0):(n[2783]=l|o,o=u,l=u+8|0),n[l>>2]=k,n[o+12>>2]=k,n[k+8>>2]=o,n[k+12>>2]=u;return}o=d>>>8,o?d>>>0>16777215?o=31:(B=(o+1048320|0)>>>16&8,T=o<<B,m=(T+520192|0)>>>16&4,T=T<<m,o=(T+245760|0)>>>16&2,o=14-(m|B|o)+(T<<o>>>15)|0,o=d>>>(o+7|0)&1|o<<1):o=0,A=11436+(o<<2)|0,n[k+28>>2]=o,n[k+20>>2]=0,n[k+16>>2]=0,l=n[2784]|0,u=1<<o;do if(l&u){for(l=d<<((o|0)==31?0:25-(o>>>1)|0),u=n[A>>2]|0;;){if((n[u+4>>2]&-8|0)==(d|0)){o=73;break}if(A=u+16+(l>>>31<<2)|0,o=n[A>>2]|0,o)l=l<<1,u=o;else{o=72;break}}if((o|0)==72){n[A>>2]=k,n[k+24>>2]=u,n[k+12>>2]=k,n[k+8>>2]=k;break}else if((o|0)==73){B=u+8|0,T=n[B>>2]|0,n[T+12>>2]=k,n[B>>2]=k,n[k+8>>2]=T,n[k+12>>2]=u,n[k+24>>2]=0;break}}else n[2784]=l|u,n[A>>2]=k,n[k+24>>2]=A,n[k+12>>2]=k,n[k+8>>2]=k;while(!1);if(T=(n[2791]|0)+-1|0,n[2791]=T,!T)o=11588;else return;for(;o=n[o>>2]|0,o;)o=o+8|0;n[2791]=-1}}}function r6e(){return 11628}function n6e(o){o=o|0;var l=0,u=0;return l=I,I=I+16|0,u=l,n[u>>2]=o6e(n[o+60>>2]|0)|0,o=jP(Au(6,u|0)|0)|0,I=l,o|0}function yZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0,Ye=0;q=I,I=I+48|0,M=q+16|0,m=q,d=q+32|0,k=o+28|0,A=n[k>>2]|0,n[d>>2]=A,T=o+20|0,A=(n[T>>2]|0)-A|0,n[d+4>>2]=A,n[d+8>>2]=l,n[d+12>>2]=u,A=A+u|0,B=o+60|0,n[m>>2]=n[B>>2],n[m+4>>2]=d,n[m+8>>2]=2,m=jP(La(146,m|0)|0)|0;e:do if((A|0)!=(m|0)){for(l=2;!((m|0)<0);)if(A=A-m|0,Ye=n[d+4>>2]|0,ae=m>>>0>Ye>>>0,d=ae?d+8|0:d,l=(ae<<31>>31)+l|0,Ye=m-(ae?Ye:0)|0,n[d>>2]=(n[d>>2]|0)+Ye,ae=d+4|0,n[ae>>2]=(n[ae>>2]|0)-Ye,n[M>>2]=n[B>>2],n[M+4>>2]=d,n[M+8>>2]=l,m=jP(La(146,M|0)|0)|0,(A|0)==(m|0)){L=3;break e}n[o+16>>2]=0,n[k>>2]=0,n[T>>2]=0,n[o>>2]=n[o>>2]|32,(l|0)==2?u=0:u=u-(n[d+4>>2]|0)|0}else L=3;while(!1);return(L|0)==3&&(Ye=n[o+44>>2]|0,n[o+16>>2]=Ye+(n[o+48>>2]|0),n[k>>2]=Ye,n[T>>2]=Ye),I=q,u|0}function i6e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;return d=I,I=I+32|0,m=d,A=d+20|0,n[m>>2]=n[o+60>>2],n[m+4>>2]=0,n[m+8>>2]=l,n[m+12>>2]=A,n[m+16>>2]=u,(jP(Oa(140,m|0)|0)|0)<0?(n[A>>2]=-1,o=-1):o=n[A>>2]|0,I=d,o|0}function jP(o){return o=o|0,o>>>0>4294963200&&(n[(Xy()|0)>>2]=0-o,o=-1),o|0}function Xy(){return(s6e()|0)+64|0}function s6e(){return lU()|0}function lU(){return 2084}function o6e(o){return o=o|0,o|0}function a6e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;return d=I,I=I+32|0,A=d,n[o+36>>2]=1,!(n[o>>2]&64|0)&&(n[A>>2]=n[o+60>>2],n[A+4>>2]=21523,n[A+8>>2]=d+16,no(54,A|0)|0)&&(s[o+75>>0]=-1),A=yZ(o,l,u)|0,I=d,A|0}function EZ(o,l){o=o|0,l=l|0;var u=0,A=0;if(u=s[o>>0]|0,A=s[l>>0]|0,!(u<<24>>24)||u<<24>>24!=A<<24>>24)o=A;else{do o=o+1|0,l=l+1|0,u=s[o>>0]|0,A=s[l>>0]|0;while(!(!(u<<24>>24)||u<<24>>24!=A<<24>>24));o=A}return(u&255)-(o&255)|0}function l6e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;e:do if(!u)o=0;else{for(;A=s[o>>0]|0,d=s[l>>0]|0,A<<24>>24==d<<24>>24;)if(u=u+-1|0,u)o=o+1|0,l=l+1|0;else{o=0;break e}o=(A&255)-(d&255)|0}while(!1);return o|0}function IZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0;Qe=I,I=I+224|0,L=Qe+120|0,q=Qe+80|0,Ye=Qe,Le=Qe+136|0,A=q,d=A+40|0;do n[A>>2]=0,A=A+4|0;while((A|0)<(d|0));return n[L>>2]=n[u>>2],(cU(0,l,L,Ye,q)|0)<0?u=-1:((n[o+76>>2]|0)>-1?ae=c6e(o)|0:ae=0,u=n[o>>2]|0,M=u&32,(s[o+74>>0]|0)<1&&(n[o>>2]=u&-33),A=o+48|0,n[A>>2]|0?u=cU(o,l,L,Ye,q)|0:(d=o+44|0,m=n[d>>2]|0,n[d>>2]=Le,B=o+28|0,n[B>>2]=Le,k=o+20|0,n[k>>2]=Le,n[A>>2]=80,T=o+16|0,n[T>>2]=Le+80,u=cU(o,l,L,Ye,q)|0,m&&(YP[n[o+36>>2]&7](o,0,0)|0,u=n[k>>2]|0?u:-1,n[d>>2]=m,n[A>>2]=0,n[T>>2]=0,n[B>>2]=0,n[k>>2]=0)),A=n[o>>2]|0,n[o>>2]=A|M,ae|0&&u6e(o),u=A&32|0?-1:u),I=Qe,u|0}function cU(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0,tt=0,Ze=0,ct=0,He=0,We=0,Lt=0,Gr=0,fr=0,$t=0,Tr=0,Hr=0,cr=0;cr=I,I=I+64|0,fr=cr+16|0,$t=cr,Lt=cr+24|0,Tr=cr+8|0,Hr=cr+20|0,n[fr>>2]=l,ct=(o|0)!=0,He=Lt+40|0,We=He,Lt=Lt+39|0,Gr=Tr+4|0,B=0,m=0,L=0;e:for(;;){do if((m|0)>-1)if((B|0)>(2147483647-m|0)){n[(Xy()|0)>>2]=75,m=-1;break}else{m=B+m|0;break}while(!1);if(B=s[l>>0]|0,B<<24>>24)k=l;else{Ze=87;break}t:for(;;){switch(B<<24>>24){case 37:{B=k,Ze=9;break t}case 0:{B=k;break t}default:}tt=k+1|0,n[fr>>2]=tt,B=s[tt>>0]|0,k=tt}t:do if((Ze|0)==9)for(;;){if(Ze=0,(s[k+1>>0]|0)!=37)break t;if(B=B+1|0,k=k+2|0,n[fr>>2]=k,(s[k>>0]|0)==37)Ze=9;else break}while(!1);if(B=B-l|0,ct&&vs(o,l,B),B|0){l=k;continue}T=k+1|0,B=(s[T>>0]|0)+-48|0,B>>>0<10?(tt=(s[k+2>>0]|0)==36,Qe=tt?B:-1,L=tt?1:L,T=tt?k+3|0:T):Qe=-1,n[fr>>2]=T,B=s[T>>0]|0,k=(B<<24>>24)+-32|0;t:do if(k>>>0<32)for(M=0,q=B;;){if(B=1<<k,!(B&75913)){B=q;break t}if(M=B|M,T=T+1|0,n[fr>>2]=T,B=s[T>>0]|0,k=(B<<24>>24)+-32|0,k>>>0>=32)break;q=B}else M=0;while(!1);if(B<<24>>24==42){if(k=T+1|0,B=(s[k>>0]|0)+-48|0,B>>>0<10&&(s[T+2>>0]|0)==36)n[d+(B<<2)>>2]=10,B=n[A+((s[k>>0]|0)+-48<<3)>>2]|0,L=1,T=T+3|0;else{if(L|0){m=-1;break}ct?(L=(n[u>>2]|0)+3&-4,B=n[L>>2]|0,n[u>>2]=L+4,L=0,T=k):(B=0,L=0,T=k)}n[fr>>2]=T,tt=(B|0)<0,B=tt?0-B|0:B,M=tt?M|8192:M}else{if(B=CZ(fr)|0,(B|0)<0){m=-1;break}T=n[fr>>2]|0}do if((s[T>>0]|0)==46){if((s[T+1>>0]|0)!=42){n[fr>>2]=T+1,k=CZ(fr)|0,T=n[fr>>2]|0;break}if(q=T+2|0,k=(s[q>>0]|0)+-48|0,k>>>0<10&&(s[T+3>>0]|0)==36){n[d+(k<<2)>>2]=10,k=n[A+((s[q>>0]|0)+-48<<3)>>2]|0,T=T+4|0,n[fr>>2]=T;break}if(L|0){m=-1;break e}ct?(tt=(n[u>>2]|0)+3&-4,k=n[tt>>2]|0,n[u>>2]=tt+4):k=0,n[fr>>2]=q,T=q}else k=-1;while(!1);for(Le=0;;){if(((s[T>>0]|0)+-65|0)>>>0>57){m=-1;break e}if(tt=T+1|0,n[fr>>2]=tt,q=s[(s[T>>0]|0)+-65+(5178+(Le*58|0))>>0]|0,ae=q&255,(ae+-1|0)>>>0<8)Le=ae,T=tt;else break}if(!(q<<24>>24)){m=-1;break}Ye=(Qe|0)>-1;do if(q<<24>>24==19)if(Ye){m=-1;break e}else Ze=49;else{if(Ye){n[d+(Qe<<2)>>2]=ae,Ye=A+(Qe<<3)|0,Qe=n[Ye+4>>2]|0,Ze=$t,n[Ze>>2]=n[Ye>>2],n[Ze+4>>2]=Qe,Ze=49;break}if(!ct){m=0;break e}wZ($t,ae,u)}while(!1);if((Ze|0)==49&&(Ze=0,!ct)){B=0,l=tt;continue}T=s[T>>0]|0,T=(Le|0)!=0&(T&15|0)==3?T&-33:T,Ye=M&-65537,Qe=M&8192|0?Ye:M;t:do switch(T|0){case 110:switch((Le&255)<<24>>24){case 0:{n[n[$t>>2]>>2]=m,B=0,l=tt;continue e}case 1:{n[n[$t>>2]>>2]=m,B=0,l=tt;continue e}case 2:{B=n[$t>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=tt;continue e}case 3:{a[n[$t>>2]>>1]=m,B=0,l=tt;continue e}case 4:{s[n[$t>>2]>>0]=m,B=0,l=tt;continue e}case 6:{n[n[$t>>2]>>2]=m,B=0,l=tt;continue e}case 7:{B=n[$t>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=tt;continue e}default:{B=0,l=tt;continue e}}case 112:{T=120,k=k>>>0>8?k:8,l=Qe|8,Ze=61;break}case 88:case 120:{l=Qe,Ze=61;break}case 111:{T=$t,l=n[T>>2]|0,T=n[T+4>>2]|0,ae=A6e(l,T,He)|0,Ye=We-ae|0,M=0,q=5642,k=(Qe&8|0)==0|(k|0)>(Ye|0)?k:Ye+1|0,Ye=Qe,Ze=67;break}case 105:case 100:if(T=$t,l=n[T>>2]|0,T=n[T+4>>2]|0,(T|0)<0){l=GP(0,0,l|0,T|0)|0,T=ye,M=$t,n[M>>2]=l,n[M+4>>2]=T,M=1,q=5642,Ze=66;break t}else{M=(Qe&2049|0)!=0&1,q=Qe&2048|0?5643:Qe&1|0?5644:5642,Ze=66;break t}case 117:{T=$t,M=0,q=5642,l=n[T>>2]|0,T=n[T+4>>2]|0,Ze=66;break}case 99:{s[Lt>>0]=n[$t>>2],l=Lt,M=0,q=5642,ae=He,T=1,k=Ye;break}case 109:{T=p6e(n[(Xy()|0)>>2]|0)|0,Ze=71;break}case 115:{T=n[$t>>2]|0,T=T|0?T:5652,Ze=71;break}case 67:{n[Tr>>2]=n[$t>>2],n[Gr>>2]=0,n[$t>>2]=Tr,ae=-1,T=Tr,Ze=75;break}case 83:{l=n[$t>>2]|0,k?(ae=k,T=l,Ze=75):(Ls(o,32,B,0,Qe),l=0,Ze=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{B=g6e(o,+E[$t>>3],B,k,Qe,T)|0,l=tt;continue e}default:M=0,q=5642,ae=He,T=k,k=Qe}while(!1);t:do if((Ze|0)==61)Qe=$t,Le=n[Qe>>2]|0,Qe=n[Qe+4>>2]|0,ae=f6e(Le,Qe,He,T&32)|0,q=(l&8|0)==0|(Le|0)==0&(Qe|0)==0,M=q?0:2,q=q?5642:5642+(T>>4)|0,Ye=l,l=Le,T=Qe,Ze=67;else if((Ze|0)==66)ae=Zy(l,T,He)|0,Ye=Qe,Ze=67;else if((Ze|0)==71)Ze=0,Qe=h6e(T,0,k)|0,Le=(Qe|0)==0,l=T,M=0,q=5642,ae=Le?T+k|0:Qe,T=Le?k:Qe-T|0,k=Ye;else if((Ze|0)==75){for(Ze=0,q=T,l=0,k=0;M=n[q>>2]|0,!(!M||(k=BZ(Hr,M)|0,(k|0)<0|k>>>0>(ae-l|0)>>>0));)if(l=k+l|0,ae>>>0>l>>>0)q=q+4|0;else break;if((k|0)<0){m=-1;break e}if(Ls(o,32,B,l,Qe),!l)l=0,Ze=84;else for(M=0;;){if(k=n[T>>2]|0,!k){Ze=84;break t}if(k=BZ(Hr,k)|0,M=k+M|0,(M|0)>(l|0)){Ze=84;break t}if(vs(o,Hr,k),M>>>0>=l>>>0){Ze=84;break}else T=T+4|0}}while(!1);if((Ze|0)==67)Ze=0,T=(l|0)!=0|(T|0)!=0,Qe=(k|0)!=0|T,T=((T^1)&1)+(We-ae)|0,l=Qe?ae:He,ae=He,T=Qe?(k|0)>(T|0)?k:T:k,k=(k|0)>-1?Ye&-65537:Ye;else if((Ze|0)==84){Ze=0,Ls(o,32,B,l,Qe^8192),B=(B|0)>(l|0)?B:l,l=tt;continue}Le=ae-l|0,Ye=(T|0)<(Le|0)?Le:T,Qe=Ye+M|0,B=(B|0)<(Qe|0)?Qe:B,Ls(o,32,B,Qe,k),vs(o,q,M),Ls(o,48,B,Qe,k^65536),Ls(o,48,Ye,Le,0),vs(o,l,Le),Ls(o,32,B,Qe,k^8192),l=tt}e:do if((Ze|0)==87&&!o)if(!L)m=0;else{for(m=1;l=n[d+(m<<2)>>2]|0,!!l;)if(wZ(A+(m<<3)|0,l,u),m=m+1|0,(m|0)>=10){m=1;break e}for(;;){if(n[d+(m<<2)>>2]|0){m=-1;break e}if(m=m+1|0,(m|0)>=10){m=1;break}}}while(!1);return I=cr,m|0}function c6e(o){return o=o|0,0}function u6e(o){o=o|0}function vs(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]&32||v6e(l,u,o)|0}function CZ(o){o=o|0;var l=0,u=0,A=0;if(u=n[o>>2]|0,A=(s[u>>0]|0)+-48|0,A>>>0<10){l=0;do l=A+(l*10|0)|0,u=u+1|0,n[o>>2]=u,A=(s[u>>0]|0)+-48|0;while(A>>>0<10)}else l=0;return l|0}function wZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;e:do if(l>>>0<=20)do switch(l|0){case 9:{A=(n[u>>2]|0)+3&-4,l=n[A>>2]|0,n[u>>2]=A+4,n[o>>2]=l;break e}case 10:{A=(n[u>>2]|0)+3&-4,l=n[A>>2]|0,n[u>>2]=A+4,A=o,n[A>>2]=l,n[A+4>>2]=((l|0)<0)<<31>>31;break e}case 11:{A=(n[u>>2]|0)+3&-4,l=n[A>>2]|0,n[u>>2]=A+4,A=o,n[A>>2]=l,n[A+4>>2]=0;break e}case 12:{A=(n[u>>2]|0)+7&-8,l=A,d=n[l>>2]|0,l=n[l+4>>2]|0,n[u>>2]=A+8,A=o,n[A>>2]=d,n[A+4>>2]=l;break e}case 13:{d=(n[u>>2]|0)+3&-4,A=n[d>>2]|0,n[u>>2]=d+4,A=(A&65535)<<16>>16,d=o,n[d>>2]=A,n[d+4>>2]=((A|0)<0)<<31>>31;break e}case 14:{d=(n[u>>2]|0)+3&-4,A=n[d>>2]|0,n[u>>2]=d+4,d=o,n[d>>2]=A&65535,n[d+4>>2]=0;break e}case 15:{d=(n[u>>2]|0)+3&-4,A=n[d>>2]|0,n[u>>2]=d+4,A=(A&255)<<24>>24,d=o,n[d>>2]=A,n[d+4>>2]=((A|0)<0)<<31>>31;break e}case 16:{d=(n[u>>2]|0)+3&-4,A=n[d>>2]|0,n[u>>2]=d+4,d=o,n[d>>2]=A&255,n[d+4>>2]=0;break e}case 17:{d=(n[u>>2]|0)+7&-8,m=+E[d>>3],n[u>>2]=d+8,E[o>>3]=m;break e}case 18:{d=(n[u>>2]|0)+7&-8,m=+E[d>>3],n[u>>2]=d+8,E[o>>3]=m;break e}default:break e}while(!1);while(!1)}function f6e(o,l,u,A){if(o=o|0,l=l|0,u=u|0,A=A|0,!((o|0)==0&(l|0)==0))do u=u+-1|0,s[u>>0]=c[5694+(o&15)>>0]|0|A,o=qP(o|0,l|0,4)|0,l=ye;while(!((o|0)==0&(l|0)==0));return u|0}function A6e(o,l,u){if(o=o|0,l=l|0,u=u|0,!((o|0)==0&(l|0)==0))do u=u+-1|0,s[u>>0]=o&7|48,o=qP(o|0,l|0,3)|0,l=ye;while(!((o|0)==0&(l|0)==0));return u|0}function Zy(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;if(l>>>0>0|(l|0)==0&o>>>0>4294967295){for(;A=pU(o|0,l|0,10,0)|0,u=u+-1|0,s[u>>0]=A&255|48,A=o,o=AU(o|0,l|0,10,0)|0,l>>>0>9|(l|0)==9&A>>>0>4294967295;)l=ye;l=o}else l=o;if(l)for(;u=u+-1|0,s[u>>0]=(l>>>0)%10|0|48,!(l>>>0<10);)l=(l>>>0)/10|0;return u|0}function p6e(o){return o=o|0,I6e(o,n[(E6e()|0)+188>>2]|0)|0}function h6e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;m=l&255,A=(u|0)!=0;e:do if(A&(o&3|0)!=0)for(d=l&255;;){if((s[o>>0]|0)==d<<24>>24){B=6;break e}if(o=o+1|0,u=u+-1|0,A=(u|0)!=0,!(A&(o&3|0)!=0)){B=5;break}}else B=5;while(!1);(B|0)==5&&(A?B=6:u=0);e:do if((B|0)==6&&(d=l&255,(s[o>>0]|0)!=d<<24>>24)){A=Ue(m,16843009)|0;t:do if(u>>>0>3){for(;m=n[o>>2]^A,!((m&-2139062144^-2139062144)&m+-16843009|0);)if(o=o+4|0,u=u+-4|0,u>>>0<=3){B=11;break t}}else B=11;while(!1);if((B|0)==11&&!u){u=0;break}for(;;){if((s[o>>0]|0)==d<<24>>24)break e;if(o=o+1|0,u=u+-1|0,!u){u=0;break}}}while(!1);return(u|0?o:0)|0}function Ls(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0;if(B=I,I=I+256|0,m=B,(u|0)>(A|0)&(d&73728|0)==0){if(d=u-A|0,eE(m|0,l|0,(d>>>0<256?d:256)|0)|0,d>>>0>255){l=u-A|0;do vs(o,m,256),d=d+-256|0;while(d>>>0>255);d=l&255}vs(o,m,d)}I=B}function BZ(o,l){return o=o|0,l=l|0,o?o=m6e(o,l,0)|0:o=0,o|0}function g6e(o,l,u,A,d,m){o=o|0,l=+l,u=u|0,A=A|0,d=d|0,m=m|0;var B=0,k=0,T=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0,tt=0,Ze=0,ct=0,He=0,We=0,Lt=0,Gr=0,fr=0,$t=0,Tr=0,Hr=0,cr=0,Hn=0;Hn=I,I=I+560|0,T=Hn+8|0,tt=Hn,cr=Hn+524|0,Hr=cr,M=Hn+512|0,n[tt>>2]=0,Tr=M+12|0,vZ(l)|0,(ye|0)<0?(l=-l,fr=1,Gr=5659):(fr=(d&2049|0)!=0&1,Gr=d&2048|0?5662:d&1|0?5665:5660),vZ(l)|0,$t=ye&2146435072;do if($t>>>0<2146435072|($t|0)==2146435072&!1){if(Ye=+d6e(l,tt)*2,B=Ye!=0,B&&(n[tt>>2]=(n[tt>>2]|0)+-1),ct=m|32,(ct|0)==97){Le=m&32,ae=Le|0?Gr+9|0:Gr,q=fr|2,B=12-A|0;do if(A>>>0>11|(B|0)==0)l=Ye;else{l=8;do B=B+-1|0,l=l*16;while(B|0);if((s[ae>>0]|0)==45){l=-(l+(-Ye-l));break}else{l=Ye+l-l;break}}while(!1);k=n[tt>>2]|0,B=(k|0)<0?0-k|0:k,B=Zy(B,((B|0)<0)<<31>>31,Tr)|0,(B|0)==(Tr|0)&&(B=M+11|0,s[B>>0]=48),s[B+-1>>0]=(k>>31&2)+43,L=B+-2|0,s[L>>0]=m+15,M=(A|0)<1,T=(d&8|0)==0,B=cr;do $t=~~l,k=B+1|0,s[B>>0]=c[5694+$t>>0]|Le,l=(l-+($t|0))*16,(k-Hr|0)==1&&!(T&(M&l==0))?(s[k>>0]=46,B=B+2|0):B=k;while(l!=0);$t=B-Hr|0,Hr=Tr-L|0,Tr=(A|0)!=0&($t+-2|0)<(A|0)?A+2|0:$t,B=Hr+q+Tr|0,Ls(o,32,u,B,d),vs(o,ae,q),Ls(o,48,u,B,d^65536),vs(o,cr,$t),Ls(o,48,Tr-$t|0,0,0),vs(o,L,Hr),Ls(o,32,u,B,d^8192);break}k=(A|0)<0?6:A,B?(B=(n[tt>>2]|0)+-28|0,n[tt>>2]=B,l=Ye*268435456):(l=Ye,B=n[tt>>2]|0),$t=(B|0)<0?T:T+288|0,T=$t;do We=~~l>>>0,n[T>>2]=We,T=T+4|0,l=(l-+(We>>>0))*1e9;while(l!=0);if((B|0)>0)for(M=$t,q=T;;){if(L=(B|0)<29?B:29,B=q+-4|0,B>>>0>=M>>>0){T=0;do He=kZ(n[B>>2]|0,0,L|0)|0,He=fU(He|0,ye|0,T|0,0)|0,We=ye,Ze=pU(He|0,We|0,1e9,0)|0,n[B>>2]=Ze,T=AU(He|0,We|0,1e9,0)|0,B=B+-4|0;while(B>>>0>=M>>>0);T&&(M=M+-4|0,n[M>>2]=T)}for(T=q;!(T>>>0<=M>>>0);)if(B=T+-4|0,!(n[B>>2]|0))T=B;else break;if(B=(n[tt>>2]|0)-L|0,n[tt>>2]=B,(B|0)>0)q=T;else break}else M=$t;if((B|0)<0){A=((k+25|0)/9|0)+1|0,Qe=(ct|0)==102;do{if(Le=0-B|0,Le=(Le|0)<9?Le:9,M>>>0<T>>>0){L=(1<<Le)+-1|0,q=1e9>>>Le,ae=0,B=M;do We=n[B>>2]|0,n[B>>2]=(We>>>Le)+ae,ae=Ue(We&L,q)|0,B=B+4|0;while(B>>>0<T>>>0);B=n[M>>2]|0?M:M+4|0,ae?(n[T>>2]=ae,M=B,B=T+4|0):(M=B,B=T)}else M=n[M>>2]|0?M:M+4|0,B=T;T=Qe?$t:M,T=(B-T>>2|0)>(A|0)?T+(A<<2)|0:B,B=(n[tt>>2]|0)+Le|0,n[tt>>2]=B}while((B|0)<0);B=M,A=T}else B=M,A=T;if(We=$t,B>>>0<A>>>0){if(T=(We-B>>2)*9|0,L=n[B>>2]|0,L>>>0>=10){M=10;do M=M*10|0,T=T+1|0;while(L>>>0>=M>>>0)}}else T=0;if(Qe=(ct|0)==103,Ze=(k|0)!=0,M=k-((ct|0)!=102?T:0)+((Ze&Qe)<<31>>31)|0,(M|0)<(((A-We>>2)*9|0)+-9|0)){if(M=M+9216|0,Le=$t+4+(((M|0)/9|0)+-1024<<2)|0,M=((M|0)%9|0)+1|0,(M|0)<9){L=10;do L=L*10|0,M=M+1|0;while((M|0)!=9)}else L=10;if(q=n[Le>>2]|0,ae=(q>>>0)%(L>>>0)|0,M=(Le+4|0)==(A|0),M&(ae|0)==0)M=Le;else if(Ye=((q>>>0)/(L>>>0)|0)&1|0?9007199254740994:9007199254740992,He=(L|0)/2|0,l=ae>>>0<He>>>0?.5:M&(ae|0)==(He|0)?1:1.5,fr&&(He=(s[Gr>>0]|0)==45,l=He?-l:l,Ye=He?-Ye:Ye),M=q-ae|0,n[Le>>2]=M,Ye+l!=Ye){if(He=M+L|0,n[Le>>2]=He,He>>>0>999999999)for(T=Le;M=T+-4|0,n[T>>2]=0,M>>>0<B>>>0&&(B=B+-4|0,n[B>>2]=0),He=(n[M>>2]|0)+1|0,n[M>>2]=He,He>>>0>999999999;)T=M;else M=Le;if(T=(We-B>>2)*9|0,q=n[B>>2]|0,q>>>0>=10){L=10;do L=L*10|0,T=T+1|0;while(q>>>0>=L>>>0)}}else M=Le;M=M+4|0,M=A>>>0>M>>>0?M:A,He=B}else M=A,He=B;for(ct=M;;){if(ct>>>0<=He>>>0){tt=0;break}if(B=ct+-4|0,!(n[B>>2]|0))ct=B;else{tt=1;break}}A=0-T|0;do if(Qe)if(B=((Ze^1)&1)+k|0,(B|0)>(T|0)&(T|0)>-5?(L=m+-1|0,k=B+-1-T|0):(L=m+-2|0,k=B+-1|0),B=d&8,B)Le=B;else{if(tt&&(Lt=n[ct+-4>>2]|0,(Lt|0)!=0))if((Lt>>>0)%10|0)M=0;else{M=0,B=10;do B=B*10|0,M=M+1|0;while(!((Lt>>>0)%(B>>>0)|0|0))}else M=9;if(B=((ct-We>>2)*9|0)+-9|0,(L|32|0)==102){Le=B-M|0,Le=(Le|0)>0?Le:0,k=(k|0)<(Le|0)?k:Le,Le=0;break}else{Le=B+T-M|0,Le=(Le|0)>0?Le:0,k=(k|0)<(Le|0)?k:Le,Le=0;break}}else L=m,Le=d&8;while(!1);if(Qe=k|Le,q=(Qe|0)!=0&1,ae=(L|32|0)==102,ae)Ze=0,B=(T|0)>0?T:0;else{if(B=(T|0)<0?A:T,B=Zy(B,((B|0)<0)<<31>>31,Tr)|0,M=Tr,(M-B|0)<2)do B=B+-1|0,s[B>>0]=48;while((M-B|0)<2);s[B+-1>>0]=(T>>31&2)+43,B=B+-2|0,s[B>>0]=L,Ze=B,B=M-B|0}if(B=fr+1+k+q+B|0,Ls(o,32,u,B,d),vs(o,Gr,fr),Ls(o,48,u,B,d^65536),ae){L=He>>>0>$t>>>0?$t:He,Le=cr+9|0,q=Le,ae=cr+8|0,M=L;do{if(T=Zy(n[M>>2]|0,0,Le)|0,(M|0)==(L|0))(T|0)==(Le|0)&&(s[ae>>0]=48,T=ae);else if(T>>>0>cr>>>0){eE(cr|0,48,T-Hr|0)|0;do T=T+-1|0;while(T>>>0>cr>>>0)}vs(o,T,q-T|0),M=M+4|0}while(M>>>0<=$t>>>0);if(Qe|0&&vs(o,5710,1),M>>>0<ct>>>0&(k|0)>0)for(;;){if(T=Zy(n[M>>2]|0,0,Le)|0,T>>>0>cr>>>0){eE(cr|0,48,T-Hr|0)|0;do T=T+-1|0;while(T>>>0>cr>>>0)}if(vs(o,T,(k|0)<9?k:9),M=M+4|0,T=k+-9|0,M>>>0<ct>>>0&(k|0)>9)k=T;else{k=T;break}}Ls(o,48,k+9|0,9,0)}else{if(Qe=tt?ct:He+4|0,(k|0)>-1){tt=cr+9|0,Le=(Le|0)==0,A=tt,q=0-Hr|0,ae=cr+8|0,L=He;do{T=Zy(n[L>>2]|0,0,tt)|0,(T|0)==(tt|0)&&(s[ae>>0]=48,T=ae);do if((L|0)==(He|0)){if(M=T+1|0,vs(o,T,1),Le&(k|0)<1){T=M;break}vs(o,5710,1),T=M}else{if(T>>>0<=cr>>>0)break;eE(cr|0,48,T+q|0)|0;do T=T+-1|0;while(T>>>0>cr>>>0)}while(!1);Hr=A-T|0,vs(o,T,(k|0)>(Hr|0)?Hr:k),k=k-Hr|0,L=L+4|0}while(L>>>0<Qe>>>0&(k|0)>-1)}Ls(o,48,k+18|0,18,0),vs(o,Ze,Tr-Ze|0)}Ls(o,32,u,B,d^8192)}else cr=(m&32|0)!=0,B=fr+3|0,Ls(o,32,u,B,d&-65537),vs(o,Gr,fr),vs(o,l!=l|!1?cr?5686:5690:cr?5678:5682,3),Ls(o,32,u,B,d^8192);while(!1);return I=Hn,((B|0)<(u|0)?u:B)|0}function vZ(o){o=+o;var l=0;return E[S>>3]=o,l=n[S>>2]|0,ye=n[S+4>>2]|0,l|0}function d6e(o,l){return o=+o,l=l|0,+ +SZ(o,l)}function SZ(o,l){o=+o,l=l|0;var u=0,A=0,d=0;switch(E[S>>3]=o,u=n[S>>2]|0,A=n[S+4>>2]|0,d=qP(u|0,A|0,52)|0,d&2047){case 0:{o!=0?(o=+SZ(o*18446744073709552e3,l),u=(n[l>>2]|0)+-64|0):u=0,n[l>>2]=u;break}case 2047:break;default:n[l>>2]=(d&2047)+-1022,n[S>>2]=u,n[S+4>>2]=A&-2146435073|1071644672,o=+E[S>>3]}return+o}function m6e(o,l,u){o=o|0,l=l|0,u=u|0;do if(o){if(l>>>0<128){s[o>>0]=l,o=1;break}if(!(n[n[(y6e()|0)+188>>2]>>2]|0))if((l&-128|0)==57216){s[o>>0]=l,o=1;break}else{n[(Xy()|0)>>2]=84,o=-1;break}if(l>>>0<2048){s[o>>0]=l>>>6|192,s[o+1>>0]=l&63|128,o=2;break}if(l>>>0<55296|(l&-8192|0)==57344){s[o>>0]=l>>>12|224,s[o+1>>0]=l>>>6&63|128,s[o+2>>0]=l&63|128,o=3;break}if((l+-65536|0)>>>0<1048576){s[o>>0]=l>>>18|240,s[o+1>>0]=l>>>12&63|128,s[o+2>>0]=l>>>6&63|128,s[o+3>>0]=l&63|128,o=4;break}else{n[(Xy()|0)>>2]=84,o=-1;break}}else o=1;while(!1);return o|0}function y6e(){return lU()|0}function E6e(){return lU()|0}function I6e(o,l){o=o|0,l=l|0;var u=0,A=0;for(A=0;;){if((c[5712+A>>0]|0)==(o|0)){o=2;break}if(u=A+1|0,(u|0)==87){u=5800,A=87,o=5;break}else A=u}if((o|0)==2&&(A?(u=5800,o=5):u=5800),(o|0)==5)for(;;){do o=u,u=u+1|0;while(s[o>>0]|0);if(A=A+-1|0,A)o=5;else break}return C6e(u,n[l+20>>2]|0)|0}function C6e(o,l){return o=o|0,l=l|0,w6e(o,l)|0}function w6e(o,l){return o=o|0,l=l|0,l?l=B6e(n[l>>2]|0,n[l+4>>2]|0,o)|0:l=0,(l|0?l:o)|0}function B6e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0;ae=(n[o>>2]|0)+1794895138|0,m=Ad(n[o+8>>2]|0,ae)|0,A=Ad(n[o+12>>2]|0,ae)|0,d=Ad(n[o+16>>2]|0,ae)|0;e:do if(m>>>0<l>>>2>>>0&&(q=l-(m<<2)|0,A>>>0<q>>>0&d>>>0<q>>>0)&&!((d|A)&3|0)){for(q=A>>>2,L=d>>>2,M=0;;){if(k=m>>>1,T=M+k|0,B=T<<1,d=B+q|0,A=Ad(n[o+(d<<2)>>2]|0,ae)|0,d=Ad(n[o+(d+1<<2)>>2]|0,ae)|0,!(d>>>0<l>>>0&A>>>0<(l-d|0)>>>0)){A=0;break e}if(s[o+(d+A)>>0]|0){A=0;break e}if(A=EZ(u,o+d|0)|0,!A)break;if(A=(A|0)<0,(m|0)==1){A=0;break e}else M=A?M:T,m=A?k:m-k|0}A=B+L|0,d=Ad(n[o+(A<<2)>>2]|0,ae)|0,A=Ad(n[o+(A+1<<2)>>2]|0,ae)|0,A>>>0<l>>>0&d>>>0<(l-A|0)>>>0?A=s[o+(A+d)>>0]|0?0:o+A|0:A=0}else A=0;while(!1);return A|0}function Ad(o,l){o=o|0,l=l|0;var u=0;return u=RZ(o|0)|0,(l|0?u:o)|0}function v6e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=u+16|0,d=n[A>>2]|0,d?m=5:S6e(u)|0?A=0:(d=n[A>>2]|0,m=5);e:do if((m|0)==5){if(k=u+20|0,B=n[k>>2]|0,A=B,(d-B|0)>>>0<l>>>0){A=YP[n[u+36>>2]&7](u,o,l)|0;break}t:do if((s[u+75>>0]|0)>-1){for(B=l;;){if(!B){m=0,d=o;break t}if(d=B+-1|0,(s[o+d>>0]|0)==10)break;B=d}if(A=YP[n[u+36>>2]&7](u,o,B)|0,A>>>0<B>>>0)break e;m=B,d=o+B|0,l=l-B|0,A=n[k>>2]|0}else m=0,d=o;while(!1);Qr(A|0,d|0,l|0)|0,n[k>>2]=(n[k>>2]|0)+l,A=m+l|0}while(!1);return A|0}function S6e(o){o=o|0;var l=0,u=0;return l=o+74|0,u=s[l>>0]|0,s[l>>0]=u+255|u,l=n[o>>2]|0,l&8?(n[o>>2]=l|32,o=-1):(n[o+8>>2]=0,n[o+4>>2]=0,u=n[o+44>>2]|0,n[o+28>>2]=u,n[o+20>>2]=u,n[o+16>>2]=u+(n[o+48>>2]|0),o=0),o|0}function $n(o,l){o=y(o),l=y(l);var u=0,A=0;u=DZ(o)|0;do if((u&2147483647)>>>0<=2139095040){if(A=DZ(l)|0,(A&2147483647)>>>0<=2139095040)if((A^u|0)<0){o=(u|0)<0?l:o;break}else{o=o<l?l:o;break}}else o=l;while(!1);return y(o)}function DZ(o){return o=y(o),h[S>>2]=o,n[S>>2]|0|0}function pd(o,l){o=y(o),l=y(l);var u=0,A=0;u=bZ(o)|0;do if((u&2147483647)>>>0<=2139095040){if(A=bZ(l)|0,(A&2147483647)>>>0<=2139095040)if((A^u|0)<0){o=(u|0)<0?o:l;break}else{o=o<l?o:l;break}}else o=l;while(!1);return y(o)}function bZ(o){return o=y(o),h[S>>2]=o,n[S>>2]|0|0}function uU(o,l){o=y(o),l=y(l);var u=0,A=0,d=0,m=0,B=0,k=0,T=0,M=0;m=(h[S>>2]=o,n[S>>2]|0),k=(h[S>>2]=l,n[S>>2]|0),u=m>>>23&255,B=k>>>23&255,T=m&-2147483648,d=k<<1;e:do if(d|0&&!((u|0)==255|((D6e(l)|0)&2147483647)>>>0>2139095040)){if(A=m<<1,A>>>0<=d>>>0)return l=y(o*y(0)),y((A|0)==(d|0)?l:o);if(u)A=m&8388607|8388608;else{if(u=m<<9,(u|0)>-1){A=u,u=0;do u=u+-1|0,A=A<<1;while((A|0)>-1)}else u=0;A=m<<1-u}if(B)k=k&8388607|8388608;else{if(m=k<<9,(m|0)>-1){d=0;do d=d+-1|0,m=m<<1;while((m|0)>-1)}else d=0;B=d,k=k<<1-d}d=A-k|0,m=(d|0)>-1;t:do if((u|0)>(B|0)){for(;;){if(m)if(d)A=d;else break;if(A=A<<1,u=u+-1|0,d=A-k|0,m=(d|0)>-1,(u|0)<=(B|0))break t}l=y(o*y(0));break e}while(!1);if(m)if(d)A=d;else{l=y(o*y(0));break}if(A>>>0<8388608)do A=A<<1,u=u+-1|0;while(A>>>0<8388608);(u|0)>0?u=A+-8388608|u<<23:u=A>>>(1-u|0),l=(n[S>>2]=u|T,y(h[S>>2]))}else M=3;while(!1);return(M|0)==3&&(l=y(o*l),l=y(l/l)),y(l)}function D6e(o){return o=y(o),h[S>>2]=o,n[S>>2]|0|0}function b6e(o,l){return o=o|0,l=l|0,IZ(n[582]|0,o,l)|0}function an(o){o=o|0,Nt()}function $y(o){o=o|0}function P6e(o,l){return o=o|0,l=l|0,0}function x6e(o){return o=o|0,(PZ(o+4|0)|0)==-1?(ip[n[(n[o>>2]|0)+8>>2]&127](o),o=1):o=0,o|0}function PZ(o){o=o|0;var l=0;return l=n[o>>2]|0,n[o>>2]=l+-1,l+-1|0}function Gh(o){o=o|0,x6e(o)|0&&k6e(o)}function k6e(o){o=o|0;var l=0;l=o+8|0,n[l>>2]|0&&(PZ(l)|0)!=-1||ip[n[(n[o>>2]|0)+16>>2]&127](o)}function Kt(o){o=o|0;var l=0;for(l=o|0?o:1;o=_P(l)|0,!(o|0);){if(o=T6e()|0,!o){o=0;break}GZ[o&0]()}return o|0}function xZ(o){return o=o|0,Kt(o)|0}function It(o){o=o|0,HP(o)}function Q6e(o){o=o|0,(s[o+11>>0]|0)<0&&It(n[o>>2]|0)}function T6e(){var o=0;return o=n[2923]|0,n[2923]=o+0,o|0}function R6e(){}function GP(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,A=l-A-(u>>>0>o>>>0|0)>>>0,ye=A,o-u>>>0|0|0}function fU(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,u=o+u>>>0,ye=l+A+(u>>>0<o>>>0|0)>>>0,u|0|0}function eE(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;if(m=o+u|0,l=l&255,(u|0)>=67){for(;o&3;)s[o>>0]=l,o=o+1|0;for(A=m&-4|0,d=A-64|0,B=l|l<<8|l<<16|l<<24;(o|0)<=(d|0);)n[o>>2]=B,n[o+4>>2]=B,n[o+8>>2]=B,n[o+12>>2]=B,n[o+16>>2]=B,n[o+20>>2]=B,n[o+24>>2]=B,n[o+28>>2]=B,n[o+32>>2]=B,n[o+36>>2]=B,n[o+40>>2]=B,n[o+44>>2]=B,n[o+48>>2]=B,n[o+52>>2]=B,n[o+56>>2]=B,n[o+60>>2]=B,o=o+64|0;for(;(o|0)<(A|0);)n[o>>2]=B,o=o+4|0}for(;(o|0)<(m|0);)s[o>>0]=l,o=o+1|0;return m-u|0}function kZ(o,l,u){return o=o|0,l=l|0,u=u|0,(u|0)<32?(ye=l<<u|(o&(1<<u)-1<<32-u)>>>32-u,o<<u):(ye=o<<u-32,0)}function qP(o,l,u){return o=o|0,l=l|0,u=u|0,(u|0)<32?(ye=l>>>u,o>>>u|(l&(1<<u)-1)<<32-u):(ye=0,l>>>u-32|0)}function Qr(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;if((u|0)>=8192)return OA(o|0,l|0,u|0)|0;if(m=o|0,d=o+u|0,(o&3)==(l&3)){for(;o&3;){if(!u)return m|0;s[o>>0]=s[l>>0]|0,o=o+1|0,l=l+1|0,u=u-1|0}for(u=d&-4|0,A=u-64|0;(o|0)<=(A|0);)n[o>>2]=n[l>>2],n[o+4>>2]=n[l+4>>2],n[o+8>>2]=n[l+8>>2],n[o+12>>2]=n[l+12>>2],n[o+16>>2]=n[l+16>>2],n[o+20>>2]=n[l+20>>2],n[o+24>>2]=n[l+24>>2],n[o+28>>2]=n[l+28>>2],n[o+32>>2]=n[l+32>>2],n[o+36>>2]=n[l+36>>2],n[o+40>>2]=n[l+40>>2],n[o+44>>2]=n[l+44>>2],n[o+48>>2]=n[l+48>>2],n[o+52>>2]=n[l+52>>2],n[o+56>>2]=n[l+56>>2],n[o+60>>2]=n[l+60>>2],o=o+64|0,l=l+64|0;for(;(o|0)<(u|0);)n[o>>2]=n[l>>2],o=o+4|0,l=l+4|0}else for(u=d-4|0;(o|0)<(u|0);)s[o>>0]=s[l>>0]|0,s[o+1>>0]=s[l+1>>0]|0,s[o+2>>0]=s[l+2>>0]|0,s[o+3>>0]=s[l+3>>0]|0,o=o+4|0,l=l+4|0;for(;(o|0)<(d|0);)s[o>>0]=s[l>>0]|0,o=o+1|0,l=l+1|0;return m|0}function QZ(o){o=o|0;var l=0;return l=s[N+(o&255)>>0]|0,(l|0)<8?l|0:(l=s[N+(o>>8&255)>>0]|0,(l|0)<8?l+8|0:(l=s[N+(o>>16&255)>>0]|0,(l|0)<8?l+16|0:(s[N+(o>>>24)>>0]|0)+24|0))}function TZ(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,T=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0;if(L=o,T=l,M=T,B=u,ae=A,k=ae,!M)return m=(d|0)!=0,k?m?(n[d>>2]=o|0,n[d+4>>2]=l&0,ae=0,d=0,ye=ae,d|0):(ae=0,d=0,ye=ae,d|0):(m&&(n[d>>2]=(L>>>0)%(B>>>0),n[d+4>>2]=0),ae=0,d=(L>>>0)/(B>>>0)>>>0,ye=ae,d|0);m=(k|0)==0;do if(B){if(!m){if(m=(b(k|0)|0)-(b(M|0)|0)|0,m>>>0<=31){q=m+1|0,k=31-m|0,l=m-31>>31,B=q,o=L>>>(q>>>0)&l|M<<k,l=M>>>(q>>>0)&l,m=0,k=L<<k;break}return d?(n[d>>2]=o|0,n[d+4>>2]=T|l&0,ae=0,d=0,ye=ae,d|0):(ae=0,d=0,ye=ae,d|0)}if(m=B-1|0,m&B|0){k=(b(B|0)|0)+33-(b(M|0)|0)|0,Le=64-k|0,q=32-k|0,T=q>>31,Ye=k-32|0,l=Ye>>31,B=k,o=q-1>>31&M>>>(Ye>>>0)|(M<<q|L>>>(k>>>0))&l,l=l&M>>>(k>>>0),m=L<<Le&T,k=(M<<Le|L>>>(Ye>>>0))&T|L<<q&k-33>>31;break}return d|0&&(n[d>>2]=m&L,n[d+4>>2]=0),(B|0)==1?(Ye=T|l&0,Le=o|0|0,ye=Ye,Le|0):(Le=QZ(B|0)|0,Ye=M>>>(Le>>>0)|0,Le=M<<32-Le|L>>>(Le>>>0)|0,ye=Ye,Le|0)}else{if(m)return d|0&&(n[d>>2]=(M>>>0)%(B>>>0),n[d+4>>2]=0),Ye=0,Le=(M>>>0)/(B>>>0)>>>0,ye=Ye,Le|0;if(!L)return d|0&&(n[d>>2]=0,n[d+4>>2]=(M>>>0)%(k>>>0)),Ye=0,Le=(M>>>0)/(k>>>0)>>>0,ye=Ye,Le|0;if(m=k-1|0,!(m&k))return d|0&&(n[d>>2]=o|0,n[d+4>>2]=m&M|l&0),Ye=0,Le=M>>>((QZ(k|0)|0)>>>0),ye=Ye,Le|0;if(m=(b(k|0)|0)-(b(M|0)|0)|0,m>>>0<=30){l=m+1|0,k=31-m|0,B=l,o=M<<k|L>>>(l>>>0),l=M>>>(l>>>0),m=0,k=L<<k;break}return d?(n[d>>2]=o|0,n[d+4>>2]=T|l&0,Ye=0,Le=0,ye=Ye,Le|0):(Ye=0,Le=0,ye=Ye,Le|0)}while(!1);if(!B)M=k,T=0,k=0;else{q=u|0|0,L=ae|A&0,M=fU(q|0,L|0,-1,-1)|0,u=ye,T=k,k=0;do A=T,T=m>>>31|T<<1,m=k|m<<1,A=o<<1|A>>>31|0,ae=o>>>31|l<<1|0,GP(M|0,u|0,A|0,ae|0)|0,Le=ye,Ye=Le>>31|((Le|0)<0?-1:0)<<1,k=Ye&1,o=GP(A|0,ae|0,Ye&q|0,(((Le|0)<0?-1:0)>>31|((Le|0)<0?-1:0)<<1)&L|0)|0,l=ye,B=B-1|0;while(B|0);M=T,T=0}return B=0,d|0&&(n[d>>2]=o,n[d+4>>2]=l),Ye=(m|0)>>>31|(M|B)<<1|(B<<1|m>>>31)&0|T,Le=(m<<1|0)&-2|k,ye=Ye,Le|0}function AU(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,TZ(o,l,u,A,0)|0}function qh(o){o=o|0;var l=0,u=0;return u=o+15&-16|0,l=n[C>>2]|0,o=l+u|0,(u|0)>0&(o|0)<(l|0)|(o|0)<0?(oe()|0,fu(12),-1):(n[C>>2]=o,(o|0)>($()|0)&&!(X()|0)?(n[C>>2]=l,fu(12),-1):l|0)}function Q2(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;if((l|0)<(o|0)&(o|0)<(l+u|0)){for(A=o,l=l+u|0,o=o+u|0;(u|0)>0;)o=o-1|0,l=l-1|0,u=u-1|0,s[o>>0]=s[l>>0]|0;o=A}else Qr(o,l,u)|0;return o|0}function pU(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;return m=I,I=I+16|0,d=m|0,TZ(o,l,u,A,d)|0,I=m,ye=n[d+4>>2]|0,n[d>>2]|0|0}function RZ(o){return o=o|0,(o&255)<<24|(o>>8&255)<<16|(o>>16&255)<<8|o>>>24|0}function F6e(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,FZ[o&1](l|0,u|0,A|0,d|0,m|0)}function N6e(o,l,u){o=o|0,l=l|0,u=y(u),NZ[o&1](l|0,y(u))}function O6e(o,l,u){o=o|0,l=l|0,u=+u,OZ[o&31](l|0,+u)}function L6e(o,l,u,A){return o=o|0,l=l|0,u=y(u),A=y(A),y(LZ[o&0](l|0,y(u),y(A)))}function M6e(o,l){o=o|0,l=l|0,ip[o&127](l|0)}function U6e(o,l,u){o=o|0,l=l|0,u=u|0,sp[o&31](l|0,u|0)}function _6e(o,l){return o=o|0,l=l|0,gd[o&31](l|0)|0}function H6e(o,l,u,A,d){o=o|0,l=l|0,u=+u,A=+A,d=d|0,MZ[o&1](l|0,+u,+A,d|0)}function j6e(o,l,u,A){o=o|0,l=l|0,u=+u,A=+A,wGe[o&1](l|0,+u,+A)}function G6e(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,YP[o&7](l|0,u|0,A|0)|0}function q6e(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,+BGe[o&1](l|0,u|0,A|0)}function W6e(o,l){return o=o|0,l=l|0,+UZ[o&15](l|0)}function Y6e(o,l,u){return o=o|0,l=l|0,u=+u,vGe[o&1](l|0,+u)|0}function V6e(o,l,u){return o=o|0,l=l|0,u=u|0,gU[o&15](l|0,u|0)|0}function J6e(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=+A,d=+d,m=m|0,SGe[o&1](l|0,u|0,+A,+d,m|0)}function K6e(o,l,u,A,d,m,B){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,B=B|0,DGe[o&1](l|0,u|0,A|0,d|0,m|0,B|0)}function z6e(o,l,u){return o=o|0,l=l|0,u=u|0,+_Z[o&7](l|0,u|0)}function X6e(o){return o=o|0,VP[o&7]()|0}function Z6e(o,l,u,A,d,m){return o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,HZ[o&1](l|0,u|0,A|0,d|0,m|0)|0}function $6e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=+d,bGe[o&1](l|0,u|0,A|0,+d)}function eGe(o,l,u,A,d,m,B){o=o|0,l=l|0,u=u|0,A=y(A),d=d|0,m=y(m),B=B|0,jZ[o&1](l|0,u|0,y(A),d|0,y(m),B|0)}function tGe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,F2[o&15](l|0,u|0,A|0)}function rGe(o){o=o|0,GZ[o&0]()}function nGe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=+A,qZ[o&15](l|0,u|0,+A)}function iGe(o,l,u){return o=o|0,l=+l,u=+u,PGe[o&1](+l,+u)|0}function sGe(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,dU[o&15](l|0,u|0,A|0,d|0)}function oGe(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,F(0)}function aGe(o,l){o=o|0,l=y(l),F(1)}function Xa(o,l){o=o|0,l=+l,F(2)}function lGe(o,l,u){return o=o|0,l=y(l),u=y(u),F(3),$e}function wr(o){o=o|0,F(4)}function T2(o,l){o=o|0,l=l|0,F(5)}function Ol(o){return o=o|0,F(6),0}function cGe(o,l,u,A){o=o|0,l=+l,u=+u,A=A|0,F(7)}function uGe(o,l,u){o=o|0,l=+l,u=+u,F(8)}function fGe(o,l,u){return o=o|0,l=l|0,u=u|0,F(9),0}function AGe(o,l,u){return o=o|0,l=l|0,u=u|0,F(10),0}function hd(o){return o=o|0,F(11),0}function pGe(o,l){return o=o|0,l=+l,F(12),0}function R2(o,l){return o=o|0,l=l|0,F(13),0}function hGe(o,l,u,A,d){o=o|0,l=l|0,u=+u,A=+A,d=d|0,F(14)}function gGe(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,F(15)}function hU(o,l){return o=o|0,l=l|0,F(16),0}function dGe(){return F(17),0}function mGe(o,l,u,A,d){return o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,F(18),0}function yGe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=+A,F(19)}function EGe(o,l,u,A,d,m){o=o|0,l=l|0,u=y(u),A=A|0,d=y(d),m=m|0,F(20)}function WP(o,l,u){o=o|0,l=l|0,u=u|0,F(21)}function IGe(){F(22)}function tE(o,l,u){o=o|0,l=l|0,u=+u,F(23)}function CGe(o,l){return o=+o,l=+l,F(24),0}function rE(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,F(25)}var FZ=[oGe,m3e],NZ=[aGe,Ty],OZ=[Xa,Zg,Fh,h2,g2,d2,m2,bf,_y,y2,Pf,$g,ed,E2,I2,wu,td,C2,Hy,Xa,Xa,Xa,Xa,Xa,Xa,Xa,Xa,Xa,Xa,Xa,Xa,Xa],LZ=[lGe],ip=[wr,$y,Xke,Zke,$ke,PFe,xFe,kFe,Y_e,V_e,J_e,i3e,s3e,o3e,Dje,bje,Pje,Bl,Xg,u2,sr,hc,xP,kP,Hke,aQe,EQe,LQe,$Qe,dTe,RTe,JTe,cRe,SRe,HRe,nFe,EFe,VFe,cNe,SNe,HNe,nOe,EOe,MOe,$Oe,pLe,xLe,dP,oMe,wMe,HMe,sUe,IUe,HUe,XUe,e_e,m_e,I_e,L_e,z_e,$_e,d4e,F4e,Iz,g8e,Y8e,aHe,wHe,qHe,sje,dje,Eje,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr],sp=[T2,Ly,JL,f2,A2,xr,so,Xi,Ns,ws,Uy,Rh,B2,CP,id,XL,ZL,wP,BP,tM,xf,ne,jOe,rLe,cUe,y8e,j4e,iZ,T2,T2,T2,T2],gd=[Ol,n6e,Ny,nd,Gy,ga,mP,Nh,w2,zL,EP,qy,vP,rM,Vy,TLe,vUe,E4e,w8e,Rl,Ol,Ol,Ol,Ol,Ol,Ol,Ol,Ol,Ol,Ol,Ol,Ol],MZ=[cGe,aM],wGe=[uGe,__e],YP=[fGe,yZ,i6e,a6e,ITe,XFe,uMe,DHe],BGe=[AGe,WRe],UZ=[hd,Oh,IP,$A,lM,v,D,Q,H,V,hd,hd,hd,hd,hd,hd],vGe=[pGe,JUe],gU=[R2,P6e,SP,Wke,HQe,OTe,XTe,BFe,pNe,mLe,Ry,fHe,R2,R2,R2,R2],SGe=[hGe,BQe],DGe=[gGe,JHe],_Z=[hU,$L,Se,_e,pt,aFe,hU,hU],VP=[dGe,Wt,Fy,gP,i_e,v_e,n4e,Bje],HZ=[mGe,Sy],bGe=[yGe,WNe],jZ=[EGe,nM],F2=[WP,ko,yP,eM,vu,nTe,ARe,aOe,BOe,VL,_3e,z8e,cje,WP,WP,WP],GZ=[IGe],qZ=[tE,KL,My,ZA,p2,Bu,jy,rd,xNe,DMe,qUe,tE,tE,tE,tE,tE],PGe=[CGe,q_e],dU=[rE,xRe,_Le,WMe,RUe,u_e,k_e,u4e,U4e,P8e,Fje,rE,rE,rE,rE,rE];return{_llvm_bswap_i32:RZ,dynCall_idd:iGe,dynCall_i:X6e,_i64Subtract:GP,___udivdi3:AU,dynCall_vif:N6e,setThrew:ca,dynCall_viii:tGe,_bitshift64Lshr:qP,_bitshift64Shl:kZ,dynCall_vi:M6e,dynCall_viiddi:J6e,dynCall_diii:q6e,dynCall_iii:V6e,_memset:eE,_sbrk:qh,_memcpy:Qr,__GLOBAL__sub_I_Yoga_cpp:a2,dynCall_vii:U6e,___uremdi3:pU,dynCall_vid:O6e,stackAlloc:Ua,_nbind_init:Wje,getTempRet0:MA,dynCall_di:W6e,dynCall_iid:Y6e,setTempRet0:LA,_i64Add:fU,dynCall_fiff:L6e,dynCall_iiii:G6e,_emscripten_get_global_libc:r6e,dynCall_viid:nGe,dynCall_viiid:$6e,dynCall_viififi:eGe,dynCall_ii:_6e,__GLOBAL__sub_I_Binding_cc:a8e,dynCall_viiii:sGe,dynCall_iiiiii:Z6e,stackSave:hf,dynCall_viiiii:F6e,__GLOBAL__sub_I_nbind_cc:Sr,dynCall_vidd:j6e,_free:HP,runPostSets:R6e,dynCall_viiiiii:K6e,establishStackSpace:wn,_memmove:Q2,stackRestore:lc,_malloc:_P,__GLOBAL__sub_I_common_cc:b4e,dynCall_viddi:H6e,dynCall_dii:z6e,dynCall_v:rGe}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii;Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm;function ExitStatus(t){this.name=\"ExitStatus\",this.message=\"Program terminated with exit(\"+t+\")\",this.status=t}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function t(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=t)},Module.callMain=Module.callMain=function t(e){e=e||[],ensureInitRuntime();var r=e.length+1;function s(){for(var p=0;p<3;p++)a.push(0)}var a=[allocate(intArrayFromString(Module.thisProgram),\"i8\",ALLOC_NORMAL)];s();for(var n=0;n<r-1;n=n+1)a.push(allocate(intArrayFromString(e[n]),\"i8\",ALLOC_NORMAL)),s();a.push(0),a=allocate(a,\"i32\",ALLOC_NORMAL);try{var c=Module._main(r,a,0);exit(c,!0)}catch(p){if(p instanceof ExitStatus)return;if(p==\"SimulateInfiniteLoop\"){Module.noExitRuntime=!0;return}else{var f=p;p&&typeof p==\"object\"&&p.stack&&(f=[p,p.stack]),Module.printErr(\"exception thrown: \"+f),Module.quit(1,p)}}finally{calledMain=!0}};function run(t){if(t=t||Module.arguments,preloadStartTime===null&&(preloadStartTime=Date.now()),runDependencies>0||(preRun(),runDependencies>0)||Module.calledRun)return;function e(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(t),postRun()))}Module.setStatus?(Module.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){Module.setStatus(\"\")},1),e()},1)):e()}Module.run=Module.run=run;function exit(t,e){e&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=t,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(t)),ENVIRONMENT_IS_NODE&&process.exit(t),Module.quit(t,new ExitStatus(t)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(t){Module.onAbort&&Module.onAbort(t),t!==void 0?(Module.print(t),Module.printErr(t),t=JSON.stringify(t)):t=\"\",ABORT=!0,EXITSTATUS=1;var e=`\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,r=\"abort(\"+t+\") at \"+stackTrace()+e;throw abortDecorators&&abortDecorators.forEach(function(s){r=s(r,t)}),r}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit==\"function\"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var Fm=_((PKt,Rwe)=>{\"use strict\";var Ppt=Qwe(),xpt=Twe(),K9=!1,z9=null;xpt({},function(t,e){if(!K9){if(K9=!0,t)throw t;z9=e}});if(!K9)throw new Error(\"Failed to load the yoga module - it needed to be loaded synchronously, but didn't\");Rwe.exports=Ppt(z9.bind,z9.lib)});var Z9=_((xKt,X9)=>{\"use strict\";var Fwe=t=>Number.isNaN(t)?!1:t>=4352&&(t<=4447||t===9001||t===9002||11904<=t&&t<=12871&&t!==12351||12880<=t&&t<=19903||19968<=t&&t<=42182||43360<=t&&t<=43388||44032<=t&&t<=55203||63744<=t&&t<=64255||65040<=t&&t<=65049||65072<=t&&t<=65131||65281<=t&&t<=65376||65504<=t&&t<=65510||110592<=t&&t<=110593||127488<=t&&t<=127569||131072<=t&&t<=262141);X9.exports=Fwe;X9.exports.default=Fwe});var Owe=_((kKt,Nwe)=>{\"use strict\";Nwe.exports=function(){return/\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g}});var GS=_((QKt,$9)=>{\"use strict\";var kpt=dk(),Qpt=Z9(),Tpt=Owe(),Lwe=t=>{if(typeof t!=\"string\"||t.length===0||(t=kpt(t),t.length===0))return 0;t=t.replace(Tpt(),\"  \");let e=0;for(let r=0;r<t.length;r++){let s=t.codePointAt(r);s<=31||s>=127&&s<=159||s>=768&&s<=879||(s>65535&&r++,e+=Qpt(s)?2:1)}return e};$9.exports=Lwe;$9.exports.default=Lwe});var tW=_((TKt,eW)=>{\"use strict\";var Rpt=GS(),Mwe=t=>{let e=0;for(let r of t.split(`\n`))e=Math.max(e,Rpt(r));return e};eW.exports=Mwe;eW.exports.default=Mwe});var Uwe=_(qS=>{\"use strict\";var Fpt=qS&&qS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(qS,\"__esModule\",{value:!0});var Npt=Fpt(tW()),rW={};qS.default=t=>{if(t.length===0)return{width:0,height:0};if(rW[t])return rW[t];let e=Npt.default(t),r=t.split(`\n`).length;return rW[t]={width:e,height:r},{width:e,height:r}}});var _we=_(WS=>{\"use strict\";var Opt=WS&&WS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(WS,\"__esModule\",{value:!0});var bn=Opt(Fm()),Lpt=(t,e)=>{\"position\"in e&&t.setPositionType(e.position===\"absolute\"?bn.default.POSITION_TYPE_ABSOLUTE:bn.default.POSITION_TYPE_RELATIVE)},Mpt=(t,e)=>{\"marginLeft\"in e&&t.setMargin(bn.default.EDGE_START,e.marginLeft||0),\"marginRight\"in e&&t.setMargin(bn.default.EDGE_END,e.marginRight||0),\"marginTop\"in e&&t.setMargin(bn.default.EDGE_TOP,e.marginTop||0),\"marginBottom\"in e&&t.setMargin(bn.default.EDGE_BOTTOM,e.marginBottom||0)},Upt=(t,e)=>{\"paddingLeft\"in e&&t.setPadding(bn.default.EDGE_LEFT,e.paddingLeft||0),\"paddingRight\"in e&&t.setPadding(bn.default.EDGE_RIGHT,e.paddingRight||0),\"paddingTop\"in e&&t.setPadding(bn.default.EDGE_TOP,e.paddingTop||0),\"paddingBottom\"in e&&t.setPadding(bn.default.EDGE_BOTTOM,e.paddingBottom||0)},_pt=(t,e)=>{var r;\"flexGrow\"in e&&t.setFlexGrow((r=e.flexGrow)!==null&&r!==void 0?r:0),\"flexShrink\"in e&&t.setFlexShrink(typeof e.flexShrink==\"number\"?e.flexShrink:1),\"flexDirection\"in e&&(e.flexDirection===\"row\"&&t.setFlexDirection(bn.default.FLEX_DIRECTION_ROW),e.flexDirection===\"row-reverse\"&&t.setFlexDirection(bn.default.FLEX_DIRECTION_ROW_REVERSE),e.flexDirection===\"column\"&&t.setFlexDirection(bn.default.FLEX_DIRECTION_COLUMN),e.flexDirection===\"column-reverse\"&&t.setFlexDirection(bn.default.FLEX_DIRECTION_COLUMN_REVERSE)),\"flexBasis\"in e&&(typeof e.flexBasis==\"number\"?t.setFlexBasis(e.flexBasis):typeof e.flexBasis==\"string\"?t.setFlexBasisPercent(Number.parseInt(e.flexBasis,10)):t.setFlexBasis(NaN)),\"alignItems\"in e&&((e.alignItems===\"stretch\"||!e.alignItems)&&t.setAlignItems(bn.default.ALIGN_STRETCH),e.alignItems===\"flex-start\"&&t.setAlignItems(bn.default.ALIGN_FLEX_START),e.alignItems===\"center\"&&t.setAlignItems(bn.default.ALIGN_CENTER),e.alignItems===\"flex-end\"&&t.setAlignItems(bn.default.ALIGN_FLEX_END)),\"alignSelf\"in e&&((e.alignSelf===\"auto\"||!e.alignSelf)&&t.setAlignSelf(bn.default.ALIGN_AUTO),e.alignSelf===\"flex-start\"&&t.setAlignSelf(bn.default.ALIGN_FLEX_START),e.alignSelf===\"center\"&&t.setAlignSelf(bn.default.ALIGN_CENTER),e.alignSelf===\"flex-end\"&&t.setAlignSelf(bn.default.ALIGN_FLEX_END)),\"justifyContent\"in e&&((e.justifyContent===\"flex-start\"||!e.justifyContent)&&t.setJustifyContent(bn.default.JUSTIFY_FLEX_START),e.justifyContent===\"center\"&&t.setJustifyContent(bn.default.JUSTIFY_CENTER),e.justifyContent===\"flex-end\"&&t.setJustifyContent(bn.default.JUSTIFY_FLEX_END),e.justifyContent===\"space-between\"&&t.setJustifyContent(bn.default.JUSTIFY_SPACE_BETWEEN),e.justifyContent===\"space-around\"&&t.setJustifyContent(bn.default.JUSTIFY_SPACE_AROUND))},Hpt=(t,e)=>{var r,s;\"width\"in e&&(typeof e.width==\"number\"?t.setWidth(e.width):typeof e.width==\"string\"?t.setWidthPercent(Number.parseInt(e.width,10)):t.setWidthAuto()),\"height\"in e&&(typeof e.height==\"number\"?t.setHeight(e.height):typeof e.height==\"string\"?t.setHeightPercent(Number.parseInt(e.height,10)):t.setHeightAuto()),\"minWidth\"in e&&(typeof e.minWidth==\"string\"?t.setMinWidthPercent(Number.parseInt(e.minWidth,10)):t.setMinWidth((r=e.minWidth)!==null&&r!==void 0?r:0)),\"minHeight\"in e&&(typeof e.minHeight==\"string\"?t.setMinHeightPercent(Number.parseInt(e.minHeight,10)):t.setMinHeight((s=e.minHeight)!==null&&s!==void 0?s:0))},jpt=(t,e)=>{\"display\"in e&&t.setDisplay(e.display===\"flex\"?bn.default.DISPLAY_FLEX:bn.default.DISPLAY_NONE)},Gpt=(t,e)=>{if(\"borderStyle\"in e){let r=typeof e.borderStyle==\"string\"?1:0;t.setBorder(bn.default.EDGE_TOP,r),t.setBorder(bn.default.EDGE_BOTTOM,r),t.setBorder(bn.default.EDGE_LEFT,r),t.setBorder(bn.default.EDGE_RIGHT,r)}};WS.default=(t,e={})=>{Lpt(t,e),Mpt(t,e),Upt(t,e),_pt(t,e),Hpt(t,e),jpt(t,e),Gpt(t,e)}});var Gwe=_((NKt,jwe)=>{\"use strict\";var YS=GS(),qpt=dk(),Wpt=sk(),iW=new Set([\"\\x1B\",\"\\x9B\"]),Ypt=39,Hwe=t=>`${iW.values().next().value}[${t}m`,Vpt=t=>t.split(\" \").map(e=>YS(e)),nW=(t,e,r)=>{let s=[...e],a=!1,n=YS(qpt(t[t.length-1]));for(let[c,f]of s.entries()){let p=YS(f);if(n+p<=r?t[t.length-1]+=f:(t.push(f),n=0),iW.has(f))a=!0;else if(a&&f===\"m\"){a=!1;continue}a||(n+=p,n===r&&c<s.length-1&&(t.push(\"\"),n=0))}!n&&t[t.length-1].length>0&&t.length>1&&(t[t.length-2]+=t.pop())},Jpt=t=>{let e=t.split(\" \"),r=e.length;for(;r>0&&!(YS(e[r-1])>0);)r--;return r===e.length?t:e.slice(0,r).join(\" \")+e.slice(r).join(\"\")},Kpt=(t,e,r={})=>{if(r.trim!==!1&&t.trim()===\"\")return\"\";let s=\"\",a=\"\",n,c=Vpt(t),f=[\"\"];for(let[p,h]of t.split(\" \").entries()){r.trim!==!1&&(f[f.length-1]=f[f.length-1].trimLeft());let E=YS(f[f.length-1]);if(p!==0&&(E>=e&&(r.wordWrap===!1||r.trim===!1)&&(f.push(\"\"),E=0),(E>0||r.trim===!1)&&(f[f.length-1]+=\" \",E++)),r.hard&&c[p]>e){let C=e-E,S=1+Math.floor((c[p]-C-1)/e);Math.floor((c[p]-1)/e)<S&&f.push(\"\"),nW(f,h,e);continue}if(E+c[p]>e&&E>0&&c[p]>0){if(r.wordWrap===!1&&E<e){nW(f,h,e);continue}f.push(\"\")}if(E+c[p]>e&&r.wordWrap===!1){nW(f,h,e);continue}f[f.length-1]+=h}r.trim!==!1&&(f=f.map(Jpt)),s=f.join(`\n`);for(let[p,h]of[...s].entries()){if(a+=h,iW.has(h)){let C=parseFloat(/\\d[^m]*/.exec(s.slice(p,p+4)));n=C===Ypt?null:C}let E=Wpt.codes.get(Number(n));n&&E&&(s[p+1]===`\n`?a+=Hwe(E):h===`\n`&&(a+=Hwe(n)))}return a};jwe.exports=(t,e,r)=>String(t).normalize().replace(/\\r\\n/g,`\n`).split(`\n`).map(s=>Kpt(s,e,r)).join(`\n`)});var Ywe=_((OKt,Wwe)=>{\"use strict\";var qwe=\"[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\",zpt=t=>t&&t.exact?new RegExp(`^${qwe}$`):new RegExp(qwe,\"g\");Wwe.exports=zpt});var sW=_((LKt,zwe)=>{\"use strict\";var Xpt=Z9(),Zpt=Ywe(),Vwe=sk(),Kwe=[\"\\x1B\",\"\\x9B\"],NF=t=>`${Kwe[0]}[${t}m`,Jwe=(t,e,r)=>{let s=[];t=[...t];for(let a of t){let n=a;a.match(\";\")&&(a=a.split(\";\")[0][0]+\"0\");let c=Vwe.codes.get(parseInt(a,10));if(c){let f=t.indexOf(c.toString());f>=0?t.splice(f,1):s.push(NF(e?c:n))}else if(e){s.push(NF(0));break}else s.push(NF(n))}if(e&&(s=s.filter((a,n)=>s.indexOf(a)===n),r!==void 0)){let a=NF(Vwe.codes.get(parseInt(r,10)));s=s.reduce((n,c)=>c===a?[c,...n]:[...n,c],[])}return s.join(\"\")};zwe.exports=(t,e,r)=>{let s=[...t.normalize()],a=[];r=typeof r==\"number\"?r:s.length;let n=!1,c,f=0,p=\"\";for(let[h,E]of s.entries()){let C=!1;if(Kwe.includes(E)){let S=/\\d[^m]*/.exec(t.slice(h,h+18));c=S&&S.length>0?S[0]:void 0,f<r&&(n=!0,c!==void 0&&a.push(c))}else n&&E===\"m\"&&(n=!1,C=!0);if(!n&&!C&&++f,!Zpt({exact:!0}).test(E)&&Xpt(E.codePointAt())&&++f,f>e&&f<=r)p+=E;else if(f===e&&!n&&c!==void 0)p=Jwe(a);else if(f>=r){p+=Jwe(a,!0,c);break}}return p}});var Zwe=_((MKt,Xwe)=>{\"use strict\";var $0=sW(),$pt=GS();function OF(t,e,r){if(t.charAt(e)===\" \")return e;for(let s=1;s<=3;s++)if(r){if(t.charAt(e+s)===\" \")return e+s}else if(t.charAt(e-s)===\" \")return e-s;return e}Xwe.exports=(t,e,r)=>{r={position:\"end\",preferTruncationOnSpace:!1,...r};let{position:s,space:a,preferTruncationOnSpace:n}=r,c=\"\\u2026\",f=1;if(typeof t!=\"string\")throw new TypeError(`Expected \\`input\\` to be a string, got ${typeof t}`);if(typeof e!=\"number\")throw new TypeError(`Expected \\`columns\\` to be a number, got ${typeof e}`);if(e<1)return\"\";if(e===1)return c;let p=$pt(t);if(p<=e)return t;if(s===\"start\"){if(n){let h=OF(t,p-e+1,!0);return c+$0(t,h,p).trim()}return a===!0&&(c+=\" \",f=2),c+$0(t,p-e+f,p)}if(s===\"middle\"){a===!0&&(c=\" \"+c+\" \",f=3);let h=Math.floor(e/2);if(n){let E=OF(t,h),C=OF(t,p-(e-h)+1,!0);return $0(t,0,E)+c+$0(t,C,p).trim()}return $0(t,0,h)+c+$0(t,p-(e-h)+f,p)}if(s===\"end\"){if(n){let h=OF(t,e-1);return $0(t,0,h)+c}return a===!0&&(c=\" \"+c,f=2),$0(t,0,e-f)+c}throw new Error(`Expected \\`options.position\\` to be either \\`start\\`, \\`middle\\` or \\`end\\`, got ${s}`)}});var aW=_(VS=>{\"use strict\";var $we=VS&&VS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(VS,\"__esModule\",{value:!0});var eht=$we(Gwe()),tht=$we(Zwe()),oW={};VS.default=(t,e,r)=>{let s=t+String(e)+String(r);if(oW[s])return oW[s];let a=t;if(r===\"wrap\"&&(a=eht.default(t,e,{trim:!1,hard:!0})),r.startsWith(\"truncate\")){let n=\"end\";r===\"truncate-middle\"&&(n=\"middle\"),r===\"truncate-start\"&&(n=\"start\"),a=tht.default(t,e,{position:n})}return oW[s]=a,a}});var cW=_(lW=>{\"use strict\";Object.defineProperty(lW,\"__esModule\",{value:!0});var e1e=t=>{let e=\"\";if(t.childNodes.length>0)for(let r of t.childNodes){let s=\"\";r.nodeName===\"#text\"?s=r.nodeValue:((r.nodeName===\"ink-text\"||r.nodeName===\"ink-virtual-text\")&&(s=e1e(r)),s.length>0&&typeof r.internal_transform==\"function\"&&(s=r.internal_transform(s))),e+=s}return e};lW.default=e1e});var uW=_(bi=>{\"use strict\";var JS=bi&&bi.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(bi,\"__esModule\",{value:!0});bi.setTextNodeValue=bi.createTextNode=bi.setStyle=bi.setAttribute=bi.removeChildNode=bi.insertBeforeNode=bi.appendChildNode=bi.createNode=bi.TEXT_NAME=void 0;var rht=JS(Fm()),t1e=JS(Uwe()),nht=JS(_we()),iht=JS(aW()),sht=JS(cW());bi.TEXT_NAME=\"#text\";bi.createNode=t=>{var e;let r={nodeName:t,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:t===\"ink-virtual-text\"?void 0:rht.default.Node.create()};return t===\"ink-text\"&&((e=r.yogaNode)===null||e===void 0||e.setMeasureFunc(oht.bind(null,r))),r};bi.appendChildNode=(t,e)=>{var r;e.parentNode&&bi.removeChildNode(e.parentNode,e),e.parentNode=t,t.childNodes.push(e),e.yogaNode&&((r=t.yogaNode)===null||r===void 0||r.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName===\"ink-text\"||t.nodeName===\"ink-virtual-text\")&&LF(t)};bi.insertBeforeNode=(t,e,r)=>{var s,a;e.parentNode&&bi.removeChildNode(e.parentNode,e),e.parentNode=t;let n=t.childNodes.indexOf(r);if(n>=0){t.childNodes.splice(n,0,e),e.yogaNode&&((s=t.yogaNode)===null||s===void 0||s.insertChild(e.yogaNode,n));return}t.childNodes.push(e),e.yogaNode&&((a=t.yogaNode)===null||a===void 0||a.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName===\"ink-text\"||t.nodeName===\"ink-virtual-text\")&&LF(t)};bi.removeChildNode=(t,e)=>{var r,s;e.yogaNode&&((s=(r=e.parentNode)===null||r===void 0?void 0:r.yogaNode)===null||s===void 0||s.removeChild(e.yogaNode)),e.parentNode=null;let a=t.childNodes.indexOf(e);a>=0&&t.childNodes.splice(a,1),(t.nodeName===\"ink-text\"||t.nodeName===\"ink-virtual-text\")&&LF(t)};bi.setAttribute=(t,e,r)=>{t.attributes[e]=r};bi.setStyle=(t,e)=>{t.style=e,t.yogaNode&&nht.default(t.yogaNode,e)};bi.createTextNode=t=>{let e={nodeName:\"#text\",nodeValue:t,yogaNode:void 0,parentNode:null,style:{}};return bi.setTextNodeValue(e,t),e};var oht=function(t,e){var r,s;let a=t.nodeName===\"#text\"?t.nodeValue:sht.default(t),n=t1e.default(a);if(n.width<=e||n.width>=1&&e>0&&e<1)return n;let c=(s=(r=t.style)===null||r===void 0?void 0:r.textWrap)!==null&&s!==void 0?s:\"wrap\",f=iht.default(a,e,c);return t1e.default(f)},r1e=t=>{var e;if(!(!t||!t.parentNode))return(e=t.yogaNode)!==null&&e!==void 0?e:r1e(t.parentNode)},LF=t=>{let e=r1e(t);e?.markDirty()};bi.setTextNodeValue=(t,e)=>{typeof e!=\"string\"&&(e=String(e)),t.nodeValue=e,LF(t)}});var a1e=_(KS=>{\"use strict\";var o1e=KS&&KS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(KS,\"__esModule\",{value:!0});var n1e=Y9(),aht=o1e(Swe()),i1e=o1e(Fm()),ea=uW(),s1e=t=>{t?.unsetMeasureFunc(),t?.freeRecursive()};KS.default=aht.default({schedulePassiveEffects:n1e.unstable_scheduleCallback,cancelPassiveEffects:n1e.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>null,preparePortalMount:()=>null,clearContainer:()=>!1,shouldDeprioritizeSubtree:()=>!1,resetAfterCommit:t=>{if(t.isStaticDirty){t.isStaticDirty=!1,typeof t.onImmediateRender==\"function\"&&t.onImmediateRender();return}typeof t.onRender==\"function\"&&t.onRender()},getChildHostContext:(t,e)=>{let r=t.isInsideText,s=e===\"ink-text\"||e===\"ink-virtual-text\";return r===s?t:{isInsideText:s}},shouldSetTextContent:()=>!1,createInstance:(t,e,r,s)=>{if(s.isInsideText&&t===\"ink-box\")throw new Error(\"<Box> can\\u2019t be nested inside <Text> component\");let a=t===\"ink-text\"&&s.isInsideText?\"ink-virtual-text\":t,n=ea.createNode(a);for(let[c,f]of Object.entries(e))c!==\"children\"&&(c===\"style\"?ea.setStyle(n,f):c===\"internal_transform\"?n.internal_transform=f:c===\"internal_static\"?n.internal_static=!0:ea.setAttribute(n,c,f));return n},createTextInstance:(t,e,r)=>{if(!r.isInsideText)throw new Error(`Text string \"${t}\" must be rendered inside <Text> component`);return ea.createTextNode(t)},resetTextContent:()=>{},hideTextInstance:t=>{ea.setTextNodeValue(t,\"\")},unhideTextInstance:(t,e)=>{ea.setTextNodeValue(t,e)},getPublicInstance:t=>t,hideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(i1e.default.DISPLAY_NONE)},unhideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(i1e.default.DISPLAY_FLEX)},appendInitialChild:ea.appendChildNode,appendChild:ea.appendChildNode,insertBefore:ea.insertBeforeNode,finalizeInitialChildren:(t,e,r,s)=>(t.internal_static&&(s.isStaticDirty=!0,s.staticNode=t),!1),supportsMutation:!0,appendChildToContainer:ea.appendChildNode,insertInContainerBefore:ea.insertBeforeNode,removeChildFromContainer:(t,e)=>{ea.removeChildNode(t,e),s1e(e.yogaNode)},prepareUpdate:(t,e,r,s,a)=>{t.internal_static&&(a.isStaticDirty=!0);let n={},c=Object.keys(s);for(let f of c)if(s[f]!==r[f]){if(f===\"style\"&&typeof s.style==\"object\"&&typeof r.style==\"object\"){let h=s.style,E=r.style,C=Object.keys(h);for(let S of C){if(S===\"borderStyle\"||S===\"borderColor\"){if(typeof n.style!=\"object\"){let P={};n.style=P}n.style.borderStyle=h.borderStyle,n.style.borderColor=h.borderColor}if(h[S]!==E[S]){if(typeof n.style!=\"object\"){let P={};n.style=P}n.style[S]=h[S]}}continue}n[f]=s[f]}return n},commitUpdate:(t,e)=>{for(let[r,s]of Object.entries(e))r!==\"children\"&&(r===\"style\"?ea.setStyle(t,s):r===\"internal_transform\"?t.internal_transform=s:r===\"internal_static\"?t.internal_static=!0:ea.setAttribute(t,r,s))},commitTextUpdate:(t,e,r)=>{ea.setTextNodeValue(t,r)},removeChild:(t,e)=>{ea.removeChildNode(t,e),s1e(e.yogaNode)}})});var c1e=_((GKt,l1e)=>{\"use strict\";l1e.exports=(t,e=1,r)=>{if(r={indent:\" \",includeEmptyLines:!1,...r},typeof t!=\"string\")throw new TypeError(`Expected \\`input\\` to be a \\`string\\`, got \\`${typeof t}\\``);if(typeof e!=\"number\")throw new TypeError(`Expected \\`count\\` to be a \\`number\\`, got \\`${typeof e}\\``);if(typeof r.indent!=\"string\")throw new TypeError(`Expected \\`options.indent\\` to be a \\`string\\`, got \\`${typeof r.indent}\\``);if(e===0)return t;let s=r.includeEmptyLines?/^/gm:/^(?!\\s*$)/gm;return t.replace(s,r.indent.repeat(e))}});var u1e=_(zS=>{\"use strict\";var lht=zS&&zS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(zS,\"__esModule\",{value:!0});var MF=lht(Fm());zS.default=t=>t.getComputedWidth()-t.getComputedPadding(MF.default.EDGE_LEFT)-t.getComputedPadding(MF.default.EDGE_RIGHT)-t.getComputedBorder(MF.default.EDGE_LEFT)-t.getComputedBorder(MF.default.EDGE_RIGHT)});var f1e=_((WKt,cht)=>{cht.exports={single:{topLeft:\"\\u250C\",topRight:\"\\u2510\",bottomRight:\"\\u2518\",bottomLeft:\"\\u2514\",vertical:\"\\u2502\",horizontal:\"\\u2500\"},double:{topLeft:\"\\u2554\",topRight:\"\\u2557\",bottomRight:\"\\u255D\",bottomLeft:\"\\u255A\",vertical:\"\\u2551\",horizontal:\"\\u2550\"},round:{topLeft:\"\\u256D\",topRight:\"\\u256E\",bottomRight:\"\\u256F\",bottomLeft:\"\\u2570\",vertical:\"\\u2502\",horizontal:\"\\u2500\"},bold:{topLeft:\"\\u250F\",topRight:\"\\u2513\",bottomRight:\"\\u251B\",bottomLeft:\"\\u2517\",vertical:\"\\u2503\",horizontal:\"\\u2501\"},singleDouble:{topLeft:\"\\u2553\",topRight:\"\\u2556\",bottomRight:\"\\u255C\",bottomLeft:\"\\u2559\",vertical:\"\\u2551\",horizontal:\"\\u2500\"},doubleSingle:{topLeft:\"\\u2552\",topRight:\"\\u2555\",bottomRight:\"\\u255B\",bottomLeft:\"\\u2558\",vertical:\"\\u2502\",horizontal:\"\\u2550\"},classic:{topLeft:\"+\",topRight:\"+\",bottomRight:\"+\",bottomLeft:\"+\",vertical:\"|\",horizontal:\"-\"}}});var p1e=_((YKt,fW)=>{\"use strict\";var A1e=f1e();fW.exports=A1e;fW.exports.default=A1e});var AW=_(ZS=>{\"use strict\";var uht=ZS&&ZS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ZS,\"__esModule\",{value:!0});var XS=uht(TE()),fht=/^(rgb|hsl|hsv|hwb)\\(\\s?(\\d+),\\s?(\\d+),\\s?(\\d+)\\s?\\)$/,Aht=/^(ansi|ansi256)\\(\\s?(\\d+)\\s?\\)$/,UF=(t,e)=>e===\"foreground\"?t:\"bg\"+t[0].toUpperCase()+t.slice(1);ZS.default=(t,e,r)=>{if(!e)return t;if(e in XS.default){let a=UF(e,r);return XS.default[a](t)}if(e.startsWith(\"#\")){let a=UF(\"hex\",r);return XS.default[a](e)(t)}if(e.startsWith(\"ansi\")){let a=Aht.exec(e);if(!a)return t;let n=UF(a[1],r),c=Number(a[2]);return XS.default[n](c)(t)}if(e.startsWith(\"rgb\")||e.startsWith(\"hsl\")||e.startsWith(\"hsv\")||e.startsWith(\"hwb\")){let a=fht.exec(e);if(!a)return t;let n=UF(a[1],r),c=Number(a[2]),f=Number(a[3]),p=Number(a[4]);return XS.default[n](c,f,p)(t)}return t}});var g1e=_($S=>{\"use strict\";var h1e=$S&&$S.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty($S,\"__esModule\",{value:!0});var pht=h1e(p1e()),pW=h1e(AW());$S.default=(t,e,r,s)=>{if(typeof r.style.borderStyle==\"string\"){let a=r.yogaNode.getComputedWidth(),n=r.yogaNode.getComputedHeight(),c=r.style.borderColor,f=pht.default[r.style.borderStyle],p=pW.default(f.topLeft+f.horizontal.repeat(a-2)+f.topRight,c,\"foreground\"),h=(pW.default(f.vertical,c,\"foreground\")+`\n`).repeat(n-2),E=pW.default(f.bottomLeft+f.horizontal.repeat(a-2)+f.bottomRight,c,\"foreground\");s.write(t,e,p,{transformers:[]}),s.write(t,e+1,h,{transformers:[]}),s.write(t+a-1,e+1,h,{transformers:[]}),s.write(t,e+n-1,E,{transformers:[]})}}});var m1e=_(eD=>{\"use strict\";var Nm=eD&&eD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(eD,\"__esModule\",{value:!0});var hht=Nm(Fm()),ght=Nm(tW()),dht=Nm(c1e()),mht=Nm(aW()),yht=Nm(u1e()),Eht=Nm(cW()),Iht=Nm(g1e()),Cht=(t,e)=>{var r;let s=(r=t.childNodes[0])===null||r===void 0?void 0:r.yogaNode;if(s){let a=s.getComputedLeft(),n=s.getComputedTop();e=`\n`.repeat(n)+dht.default(e,a)}return e},d1e=(t,e,r)=>{var s;let{offsetX:a=0,offsetY:n=0,transformers:c=[],skipStaticElements:f}=r;if(f&&t.internal_static)return;let{yogaNode:p}=t;if(p){if(p.getDisplay()===hht.default.DISPLAY_NONE)return;let h=a+p.getComputedLeft(),E=n+p.getComputedTop(),C=c;if(typeof t.internal_transform==\"function\"&&(C=[t.internal_transform,...c]),t.nodeName===\"ink-text\"){let S=Eht.default(t);if(S.length>0){let P=ght.default(S),I=yht.default(p);if(P>I){let R=(s=t.style.textWrap)!==null&&s!==void 0?s:\"wrap\";S=mht.default(S,I,R)}S=Cht(t,S),e.write(h,E,S,{transformers:C})}return}if(t.nodeName===\"ink-box\"&&Iht.default(h,E,t,e),t.nodeName===\"ink-root\"||t.nodeName===\"ink-box\")for(let S of t.childNodes)d1e(S,e,{offsetX:h,offsetY:E,transformers:C,skipStaticElements:f})}};eD.default=d1e});var I1e=_(tD=>{\"use strict\";var E1e=tD&&tD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(tD,\"__esModule\",{value:!0});var y1e=E1e(sW()),wht=E1e(GS()),hW=class{constructor(e){this.writes=[];let{width:r,height:s}=e;this.width=r,this.height=s}write(e,r,s,a){let{transformers:n}=a;s&&this.writes.push({x:e,y:r,text:s,transformers:n})}get(){let e=[];for(let s=0;s<this.height;s++)e.push(\" \".repeat(this.width));for(let s of this.writes){let{x:a,y:n,text:c,transformers:f}=s,p=c.split(`\n`),h=0;for(let E of p){let C=e[n+h];if(!C)continue;let S=wht.default(E);for(let P of f)E=P(E);e[n+h]=y1e.default(C,0,a)+E+y1e.default(C,a+S),h++}}return{output:e.map(s=>s.trimRight()).join(`\n`),height:e.length}}};tD.default=hW});var B1e=_(rD=>{\"use strict\";var gW=rD&&rD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(rD,\"__esModule\",{value:!0});var Bht=gW(Fm()),C1e=gW(m1e()),w1e=gW(I1e());rD.default=(t,e)=>{var r;if(t.yogaNode.setWidth(e),t.yogaNode){t.yogaNode.calculateLayout(void 0,void 0,Bht.default.DIRECTION_LTR);let s=new w1e.default({width:t.yogaNode.getComputedWidth(),height:t.yogaNode.getComputedHeight()});C1e.default(t,s,{skipStaticElements:!0});let a;!((r=t.staticNode)===null||r===void 0)&&r.yogaNode&&(a=new w1e.default({width:t.staticNode.yogaNode.getComputedWidth(),height:t.staticNode.yogaNode.getComputedHeight()}),C1e.default(t.staticNode,a,{skipStaticElements:!1}));let{output:n,height:c}=s.get();return{output:n,outputHeight:c,staticOutput:a?`${a.get().output}\n`:\"\"}}return{output:\"\",outputHeight:0,staticOutput:\"\"}}});var b1e=_((ZKt,D1e)=>{\"use strict\";var v1e=Ie(\"stream\"),S1e=[\"assert\",\"count\",\"countReset\",\"debug\",\"dir\",\"dirxml\",\"error\",\"group\",\"groupCollapsed\",\"groupEnd\",\"info\",\"log\",\"table\",\"time\",\"timeEnd\",\"timeLog\",\"trace\",\"warn\"],dW={},vht=t=>{let e=new v1e.PassThrough,r=new v1e.PassThrough;e.write=a=>t(\"stdout\",a),r.write=a=>t(\"stderr\",a);let s=new console.Console(e,r);for(let a of S1e)dW[a]=console[a],console[a]=s[a];return()=>{for(let a of S1e)console[a]=dW[a];dW={}}};D1e.exports=vht});var yW=_(mW=>{\"use strict\";Object.defineProperty(mW,\"__esModule\",{value:!0});mW.default=new WeakMap});var IW=_(EW=>{\"use strict\";Object.defineProperty(EW,\"__esModule\",{value:!0});var Sht=hn(),P1e=Sht.createContext({exit:()=>{}});P1e.displayName=\"InternalAppContext\";EW.default=P1e});var wW=_(CW=>{\"use strict\";Object.defineProperty(CW,\"__esModule\",{value:!0});var Dht=hn(),x1e=Dht.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});x1e.displayName=\"InternalStdinContext\";CW.default=x1e});var vW=_(BW=>{\"use strict\";Object.defineProperty(BW,\"__esModule\",{value:!0});var bht=hn(),k1e=bht.createContext({stdout:void 0,write:()=>{}});k1e.displayName=\"InternalStdoutContext\";BW.default=k1e});var DW=_(SW=>{\"use strict\";Object.defineProperty(SW,\"__esModule\",{value:!0});var Pht=hn(),Q1e=Pht.createContext({stderr:void 0,write:()=>{}});Q1e.displayName=\"InternalStderrContext\";SW.default=Q1e});var _F=_(bW=>{\"use strict\";Object.defineProperty(bW,\"__esModule\",{value:!0});var xht=hn(),T1e=xht.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{},focus:()=>{}});T1e.displayName=\"InternalFocusContext\";bW.default=T1e});var F1e=_((szt,R1e)=>{\"use strict\";var kht=/[|\\\\{}()[\\]^$+*?.-]/g;R1e.exports=t=>{if(typeof t!=\"string\")throw new TypeError(\"Expected a string\");return t.replace(kht,\"\\\\$&\")}});var M1e=_((ozt,L1e)=>{\"use strict\";var Qht=F1e(),Tht=typeof process==\"object\"&&process&&typeof process.cwd==\"function\"?process.cwd():\".\",O1e=[].concat(Ie(\"module\").builtinModules,\"bootstrap_node\",\"node\").map(t=>new RegExp(`(?:\\\\((?:node:)?${t}(?:\\\\.js)?:\\\\d+:\\\\d+\\\\)$|^\\\\s*at (?:node:)?${t}(?:\\\\.js)?:\\\\d+:\\\\d+$)`));O1e.push(/\\((?:node:)?internal\\/[^:]+:\\d+:\\d+\\)$/,/\\s*at (?:node:)?internal\\/[^:]+:\\d+:\\d+$/,/\\/\\.node-spawn-wrap-\\w+-\\w+\\/node:\\d+:\\d+\\)?$/);var PW=class t{constructor(e){e={ignoredPackages:[],...e},\"internals\"in e||(e.internals=t.nodeInternals()),\"cwd\"in e||(e.cwd=Tht),this._cwd=e.cwd.replace(/\\\\/g,\"/\"),this._internals=[].concat(e.internals,Rht(e.ignoredPackages)),this._wrapCallSite=e.wrapCallSite||!1}static nodeInternals(){return[...O1e]}clean(e,r=0){r=\" \".repeat(r),Array.isArray(e)||(e=e.split(`\n`)),!/^\\s*at /.test(e[0])&&/^\\s*at /.test(e[1])&&(e=e.slice(1));let s=!1,a=null,n=[];return e.forEach(c=>{if(c=c.replace(/\\\\/g,\"/\"),this._internals.some(p=>p.test(c)))return;let f=/^\\s*at /.test(c);s?c=c.trimEnd().replace(/^(\\s+)at /,\"$1\"):(c=c.trim(),f&&(c=c.slice(3))),c=c.replace(`${this._cwd}/`,\"\"),c&&(f?(a&&(n.push(a),a=null),n.push(c)):(s=!0,a=c))}),n.map(c=>`${r}${c}\n`).join(\"\")}captureString(e,r=this.captureString){typeof e==\"function\"&&(r=e,e=1/0);let{stackTraceLimit:s}=Error;e&&(Error.stackTraceLimit=e);let a={};Error.captureStackTrace(a,r);let{stack:n}=a;return Error.stackTraceLimit=s,this.clean(n)}capture(e,r=this.capture){typeof e==\"function\"&&(r=e,e=1/0);let{prepareStackTrace:s,stackTraceLimit:a}=Error;Error.prepareStackTrace=(f,p)=>this._wrapCallSite?p.map(this._wrapCallSite):p,e&&(Error.stackTraceLimit=e);let n={};Error.captureStackTrace(n,r);let{stack:c}=n;return Object.assign(Error,{prepareStackTrace:s,stackTraceLimit:a}),c}at(e=this.at){let[r]=this.capture(1,e);if(!r)return{};let s={line:r.getLineNumber(),column:r.getColumnNumber()};N1e(s,r.getFileName(),this._cwd),r.isConstructor()&&(s.constructor=!0),r.isEval()&&(s.evalOrigin=r.getEvalOrigin()),r.isNative()&&(s.native=!0);let a;try{a=r.getTypeName()}catch{}a&&a!==\"Object\"&&a!==\"[object Object]\"&&(s.type=a);let n=r.getFunctionName();n&&(s.function=n);let c=r.getMethodName();return c&&n!==c&&(s.method=c),s}parseLine(e){let r=e&&e.match(Fht);if(!r)return null;let s=r[1]===\"new\",a=r[2],n=r[3],c=r[4],f=Number(r[5]),p=Number(r[6]),h=r[7],E=r[8],C=r[9],S=r[10]===\"native\",P=r[11]===\")\",I,R={};if(E&&(R.line=Number(E)),C&&(R.column=Number(C)),P&&h){let N=0;for(let U=h.length-1;U>0;U--)if(h.charAt(U)===\")\")N++;else if(h.charAt(U)===\"(\"&&h.charAt(U-1)===\" \"&&(N--,N===-1&&h.charAt(U-1)===\" \")){let W=h.slice(0,U-1);h=h.slice(U+1),a+=` (${W}`;break}}if(a){let N=a.match(Nht);N&&(a=N[1],I=N[2])}return N1e(R,h,this._cwd),s&&(R.constructor=!0),n&&(R.evalOrigin=n,R.evalLine=f,R.evalColumn=p,R.evalFile=c&&c.replace(/\\\\/g,\"/\")),S&&(R.native=!0),a&&(R.function=a),I&&a!==I&&(R.method=I),R}};function N1e(t,e,r){e&&(e=e.replace(/\\\\/g,\"/\"),e.startsWith(`${r}/`)&&(e=e.slice(r.length+1)),t.file=e)}function Rht(t){if(t.length===0)return[];let e=t.map(r=>Qht(r));return new RegExp(`[/\\\\\\\\]node_modules[/\\\\\\\\](?:${e.join(\"|\")})[/\\\\\\\\][^:]+:\\\\d+:\\\\d+`)}var Fht=new RegExp(\"^(?:\\\\s*at )?(?:(new) )?(?:(.*?) \\\\()?(?:eval at ([^ ]+) \\\\((.+?):(\\\\d+):(\\\\d+)\\\\), )?(?:(.+?):(\\\\d+):(\\\\d+)|(native))(\\\\)?)$\"),Nht=/^(.*?) \\[as (.*?)\\]$/;L1e.exports=PW});var _1e=_((azt,U1e)=>{\"use strict\";U1e.exports=(t,e)=>t.replace(/^\\t+/gm,r=>\" \".repeat(r.length*(e||2)))});var j1e=_((lzt,H1e)=>{\"use strict\";var Oht=_1e(),Lht=(t,e)=>{let r=[],s=t-e,a=t+e;for(let n=s;n<=a;n++)r.push(n);return r};H1e.exports=(t,e,r)=>{if(typeof t!=\"string\")throw new TypeError(\"Source code is missing.\");if(!e||e<1)throw new TypeError(\"Line number must start from `1`.\");if(t=Oht(t).split(/\\r?\\n/),!(e>t.length))return r={around:3,...r},Lht(e,r.around).filter(s=>t[s-1]!==void 0).map(s=>({line:s,value:t[s-1]}))}});var HF=_(rf=>{\"use strict\";var Mht=rf&&rf.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),Uht=rf&&rf.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),_ht=rf&&rf.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.hasOwnProperty.call(t,r)&&Mht(e,t,r);return Uht(e,t),e},Hht=rf&&rf.__rest||function(t,e){var r={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&e.indexOf(s)<0&&(r[s]=t[s]);if(t!=null&&typeof Object.getOwnPropertySymbols==\"function\")for(var a=0,s=Object.getOwnPropertySymbols(t);a<s.length;a++)e.indexOf(s[a])<0&&Object.prototype.propertyIsEnumerable.call(t,s[a])&&(r[s[a]]=t[s[a]]);return r};Object.defineProperty(rf,\"__esModule\",{value:!0});var G1e=_ht(hn()),xW=G1e.forwardRef((t,e)=>{var{children:r}=t,s=Hht(t,[\"children\"]);let a=Object.assign(Object.assign({},s),{marginLeft:s.marginLeft||s.marginX||s.margin||0,marginRight:s.marginRight||s.marginX||s.margin||0,marginTop:s.marginTop||s.marginY||s.margin||0,marginBottom:s.marginBottom||s.marginY||s.margin||0,paddingLeft:s.paddingLeft||s.paddingX||s.padding||0,paddingRight:s.paddingRight||s.paddingX||s.padding||0,paddingTop:s.paddingTop||s.paddingY||s.padding||0,paddingBottom:s.paddingBottom||s.paddingY||s.padding||0});return G1e.default.createElement(\"ink-box\",{ref:e,style:a},r)});xW.displayName=\"Box\";xW.defaultProps={flexDirection:\"row\",flexGrow:0,flexShrink:1};rf.default=xW});var TW=_(nD=>{\"use strict\";var kW=nD&&nD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(nD,\"__esModule\",{value:!0});var jht=kW(hn()),yw=kW(TE()),q1e=kW(AW()),QW=({color:t,backgroundColor:e,dimColor:r,bold:s,italic:a,underline:n,strikethrough:c,inverse:f,wrap:p,children:h})=>{if(h==null)return null;let E=C=>(r&&(C=yw.default.dim(C)),t&&(C=q1e.default(C,t,\"foreground\")),e&&(C=q1e.default(C,e,\"background\")),s&&(C=yw.default.bold(C)),a&&(C=yw.default.italic(C)),n&&(C=yw.default.underline(C)),c&&(C=yw.default.strikethrough(C)),f&&(C=yw.default.inverse(C)),C);return jht.default.createElement(\"ink-text\",{style:{flexGrow:0,flexShrink:1,flexDirection:\"row\",textWrap:p},internal_transform:E},h)};QW.displayName=\"Text\";QW.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:\"wrap\"};nD.default=QW});var J1e=_(nf=>{\"use strict\";var Ght=nf&&nf.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),qht=nf&&nf.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),Wht=nf&&nf.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.hasOwnProperty.call(t,r)&&Ght(e,t,r);return qht(e,t),e},iD=nf&&nf.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(nf,\"__esModule\",{value:!0});var W1e=Wht(Ie(\"fs\")),Qs=iD(hn()),Y1e=iD(M1e()),Yht=iD(j1e()),$p=iD(HF()),AA=iD(TW()),V1e=new Y1e.default({cwd:process.cwd(),internals:Y1e.default.nodeInternals()}),Vht=({error:t})=>{let e=t.stack?t.stack.split(`\n`).slice(1):void 0,r=e?V1e.parseLine(e[0]):void 0,s,a=0;if(r?.file&&r?.line&&W1e.existsSync(r.file)){let n=W1e.readFileSync(r.file,\"utf8\");if(s=Yht.default(n,r.line),s)for(let{line:c}of s)a=Math.max(a,String(c).length)}return Qs.default.createElement($p.default,{flexDirection:\"column\",padding:1},Qs.default.createElement($p.default,null,Qs.default.createElement(AA.default,{backgroundColor:\"red\",color:\"white\"},\" \",\"ERROR\",\" \"),Qs.default.createElement(AA.default,null,\" \",t.message)),r&&Qs.default.createElement($p.default,{marginTop:1},Qs.default.createElement(AA.default,{dimColor:!0},r.file,\":\",r.line,\":\",r.column)),r&&s&&Qs.default.createElement($p.default,{marginTop:1,flexDirection:\"column\"},s.map(({line:n,value:c})=>Qs.default.createElement($p.default,{key:n},Qs.default.createElement($p.default,{width:a+1},Qs.default.createElement(AA.default,{dimColor:n!==r.line,backgroundColor:n===r.line?\"red\":void 0,color:n===r.line?\"white\":void 0},String(n).padStart(a,\" \"),\":\")),Qs.default.createElement(AA.default,{key:n,backgroundColor:n===r.line?\"red\":void 0,color:n===r.line?\"white\":void 0},\" \"+c)))),t.stack&&Qs.default.createElement($p.default,{marginTop:1,flexDirection:\"column\"},t.stack.split(`\n`).slice(1).map(n=>{let c=V1e.parseLine(n);return c?Qs.default.createElement($p.default,{key:n},Qs.default.createElement(AA.default,{dimColor:!0},\"- \"),Qs.default.createElement(AA.default,{dimColor:!0,bold:!0},c.function),Qs.default.createElement(AA.default,{dimColor:!0,color:\"gray\"},\" \",\"(\",c.file,\":\",c.line,\":\",c.column,\")\")):Qs.default.createElement($p.default,{key:n},Qs.default.createElement(AA.default,{dimColor:!0},\"- \"),Qs.default.createElement(AA.default,{dimColor:!0,bold:!0},n))})))};nf.default=Vht});var z1e=_(sf=>{\"use strict\";var Jht=sf&&sf.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),Kht=sf&&sf.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),zht=sf&&sf.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.hasOwnProperty.call(t,r)&&Jht(e,t,r);return Kht(e,t),e},Lm=sf&&sf.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(sf,\"__esModule\",{value:!0});var Om=zht(hn()),K1e=Lm(F9()),Xht=Lm(IW()),Zht=Lm(wW()),$ht=Lm(vW()),e0t=Lm(DW()),t0t=Lm(_F()),r0t=Lm(J1e()),n0t=\"\t\",i0t=\"\\x1B[Z\",s0t=\"\\x1B\",jF=class extends Om.PureComponent{constructor(){super(...arguments),this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=e=>{let{stdin:r}=this.props;if(!this.isRawModeSupported())throw r===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default.\nRead about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`):new Error(`Raw mode is not supported on the stdin provided to Ink.\nRead about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(r.setEncoding(\"utf8\"),e){this.rawModeEnabledCount===0&&(r.addListener(\"data\",this.handleInput),r.resume(),r.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount===0&&(r.setRawMode(!1),r.removeListener(\"data\",this.handleInput),r.pause())},this.handleInput=e=>{e===\"\u0003\"&&this.props.exitOnCtrlC&&this.handleExit(),e===s0t&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(e===n0t&&this.focusNext(),e===i0t&&this.focusPrevious())},this.handleExit=e=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(e)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focus=e=>{this.setState(r=>r.focusables.some(a=>a?.id===e)?{activeFocusId:e}:r)},this.focusNext=()=>{this.setState(e=>{var r;let s=(r=e.focusables[0])===null||r===void 0?void 0:r.id;return{activeFocusId:this.findNextFocusable(e)||s}})},this.focusPrevious=()=>{this.setState(e=>{var r;let s=(r=e.focusables[e.focusables.length-1])===null||r===void 0?void 0:r.id;return{activeFocusId:this.findPreviousFocusable(e)||s}})},this.addFocusable=(e,{autoFocus:r})=>{this.setState(s=>{let a=s.activeFocusId;return!a&&r&&(a=e),{activeFocusId:a,focusables:[...s.focusables,{id:e,isActive:!0}]}})},this.removeFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.filter(s=>s.id!==e)}))},this.activateFocusable=e=>{this.setState(r=>({focusables:r.focusables.map(s=>s.id!==e?s:{id:e,isActive:!0})}))},this.deactivateFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.map(s=>s.id!==e?s:{id:e,isActive:!1})}))},this.findNextFocusable=e=>{var r;let s=e.focusables.findIndex(a=>a.id===e.activeFocusId);for(let a=s+1;a<e.focusables.length;a++)if(!((r=e.focusables[a])===null||r===void 0)&&r.isActive)return e.focusables[a].id},this.findPreviousFocusable=e=>{var r;let s=e.focusables.findIndex(a=>a.id===e.activeFocusId);for(let a=s-1;a>=0;a--)if(!((r=e.focusables[a])===null||r===void 0)&&r.isActive)return e.focusables[a].id}}static getDerivedStateFromError(e){return{error:e}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return Om.default.createElement(Xht.default.Provider,{value:{exit:this.handleExit}},Om.default.createElement(Zht.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},Om.default.createElement($ht.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},Om.default.createElement(e0t.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},Om.default.createElement(t0t.default.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious,focus:this.focus}},this.state.error?Om.default.createElement(r0t.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){K1e.default.hide(this.props.stdout)}componentWillUnmount(){K1e.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(e){this.handleExit(e)}};sf.default=jF;jF.displayName=\"InternalApp\"});var $1e=_(of=>{\"use strict\";var o0t=of&&of.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),a0t=of&&of.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),l0t=of&&of.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.hasOwnProperty.call(t,r)&&o0t(e,t,r);return a0t(e,t),e},af=of&&of.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(of,\"__esModule\",{value:!0});var c0t=af(hn()),X1e=WCe(),u0t=af(awe()),f0t=af(x9()),A0t=af(pwe()),p0t=af(gwe()),RW=af(a1e()),h0t=af(B1e()),g0t=af(R9()),d0t=af(b1e()),m0t=l0t(uW()),y0t=af(yW()),E0t=af(z1e()),Ew=process.env.CI===\"false\"?!1:A0t.default,Z1e=()=>{},FW=class{constructor(e){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:r,outputHeight:s,staticOutput:a}=h0t.default(this.rootNode,this.options.stdout.columns||80),n=a&&a!==`\n`;if(this.options.debug){n&&(this.fullStaticOutput+=a),this.options.stdout.write(this.fullStaticOutput+r);return}if(Ew){n&&this.options.stdout.write(a),this.lastOutput=r;return}if(n&&(this.fullStaticOutput+=a),s>=this.options.stdout.rows){this.options.stdout.write(f0t.default.clearTerminal+this.fullStaticOutput+r),this.lastOutput=r;return}n&&(this.log.clear(),this.options.stdout.write(a),this.log(r)),!n&&r!==this.lastOutput&&this.throttledLog(r),this.lastOutput=r},p0t.default(this),this.options=e,this.rootNode=m0t.createNode(\"ink-root\"),this.rootNode.onRender=e.debug?this.onRender:X1e(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=u0t.default.create(e.stdout),this.throttledLog=e.debug?this.log:X1e(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput=\"\",this.fullStaticOutput=\"\",this.container=RW.default.createContainer(this.rootNode,0,!1,null),this.unsubscribeExit=g0t.default(this.unmount,{alwaysLast:!1}),e.patchConsole&&this.patchConsole(),Ew||(e.stdout.on(\"resize\",this.onRender),this.unsubscribeResize=()=>{e.stdout.off(\"resize\",this.onRender)})}render(e){let r=c0t.default.createElement(E0t.default,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount},e);RW.default.updateContainer(r,this.container,null,Z1e)}writeToStdout(e){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(e+this.fullStaticOutput+this.lastOutput);return}if(Ew){this.options.stdout.write(e);return}this.log.clear(),this.options.stdout.write(e),this.log(this.lastOutput)}}writeToStderr(e){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(e),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(Ew){this.options.stderr.write(e);return}this.log.clear(),this.options.stderr.write(e),this.log(this.lastOutput)}}unmount(e){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole==\"function\"&&this.restoreConsole(),typeof this.unsubscribeResize==\"function\"&&this.unsubscribeResize(),Ew?this.options.stdout.write(this.lastOutput+`\n`):this.options.debug||this.log.done(),this.isUnmounted=!0,RW.default.updateContainer(null,this.container,null,Z1e),y0t.default.delete(this.options.stdout),e instanceof Error?this.rejectExitPromise(e):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((e,r)=>{this.resolveExitPromise=e,this.rejectExitPromise=r})),this.exitPromise}clear(){!Ew&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=d0t.default((e,r)=>{e===\"stdout\"&&this.writeToStdout(r),e===\"stderr\"&&(r.startsWith(\"The above error occurred\")||this.writeToStderr(r))}))}};of.default=FW});var t2e=_(sD=>{\"use strict\";var e2e=sD&&sD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(sD,\"__esModule\",{value:!0});var I0t=e2e($1e()),GF=e2e(yW()),C0t=Ie(\"stream\"),w0t=(t,e)=>{let r=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},B0t(e)),s=v0t(r.stdout,()=>new I0t.default(r));return s.render(t),{rerender:s.render,unmount:()=>s.unmount(),waitUntilExit:s.waitUntilExit,cleanup:()=>GF.default.delete(r.stdout),clear:s.clear}};sD.default=w0t;var B0t=(t={})=>t instanceof C0t.Stream?{stdout:t,stdin:process.stdin}:t,v0t=(t,e)=>{let r;return GF.default.has(t)?r=GF.default.get(t):(r=e(),GF.default.set(t,r)),r}});var n2e=_(eh=>{\"use strict\";var S0t=eh&&eh.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),D0t=eh&&eh.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),b0t=eh&&eh.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.hasOwnProperty.call(t,r)&&S0t(e,t,r);return D0t(e,t),e};Object.defineProperty(eh,\"__esModule\",{value:!0});var oD=b0t(hn()),r2e=t=>{let{items:e,children:r,style:s}=t,[a,n]=oD.useState(0),c=oD.useMemo(()=>e.slice(a),[e,a]);oD.useLayoutEffect(()=>{n(e.length)},[e.length]);let f=c.map((h,E)=>r(h,a+E)),p=oD.useMemo(()=>Object.assign({position:\"absolute\",flexDirection:\"column\"},s),[s]);return oD.default.createElement(\"ink-box\",{internal_static:!0,style:p},f)};r2e.displayName=\"Static\";eh.default=r2e});var s2e=_(aD=>{\"use strict\";var P0t=aD&&aD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(aD,\"__esModule\",{value:!0});var x0t=P0t(hn()),i2e=({children:t,transform:e})=>t==null?null:x0t.default.createElement(\"ink-text\",{style:{flexGrow:0,flexShrink:1,flexDirection:\"row\"},internal_transform:e},t);i2e.displayName=\"Transform\";aD.default=i2e});var a2e=_(lD=>{\"use strict\";var k0t=lD&&lD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(lD,\"__esModule\",{value:!0});var Q0t=k0t(hn()),o2e=({count:t=1})=>Q0t.default.createElement(\"ink-text\",null,`\n`.repeat(t));o2e.displayName=\"Newline\";lD.default=o2e});var u2e=_(cD=>{\"use strict\";var l2e=cD&&cD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(cD,\"__esModule\",{value:!0});var T0t=l2e(hn()),R0t=l2e(HF()),c2e=()=>T0t.default.createElement(R0t.default,{flexGrow:1});c2e.displayName=\"Spacer\";cD.default=c2e});var qF=_(uD=>{\"use strict\";var F0t=uD&&uD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(uD,\"__esModule\",{value:!0});var N0t=hn(),O0t=F0t(wW()),L0t=()=>N0t.useContext(O0t.default);uD.default=L0t});var A2e=_(fD=>{\"use strict\";var M0t=fD&&fD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(fD,\"__esModule\",{value:!0});var f2e=hn(),U0t=M0t(qF()),_0t=(t,e={})=>{let{stdin:r,setRawMode:s,internal_exitOnCtrlC:a}=U0t.default();f2e.useEffect(()=>{if(e.isActive!==!1)return s(!0),()=>{s(!1)}},[e.isActive,s]),f2e.useEffect(()=>{if(e.isActive===!1)return;let n=c=>{let f=String(c),p={upArrow:f===\"\\x1B[A\",downArrow:f===\"\\x1B[B\",leftArrow:f===\"\\x1B[D\",rightArrow:f===\"\\x1B[C\",pageDown:f===\"\\x1B[6~\",pageUp:f===\"\\x1B[5~\",return:f===\"\\r\",escape:f===\"\\x1B\",ctrl:!1,shift:!1,tab:f===\"\t\"||f===\"\\x1B[Z\",backspace:f===\"\\b\",delete:f===\"\\x7F\"||f===\"\\x1B[3~\",meta:!1};f<=\"\u001a\"&&!p.return&&(f=String.fromCharCode(f.charCodeAt(0)+97-1),p.ctrl=!0),f.startsWith(\"\\x1B\")&&(f=f.slice(1),p.meta=!0);let h=f>=\"A\"&&f<=\"Z\",E=f>=\"\\u0410\"&&f<=\"\\u042F\";f.length===1&&(h||E)&&(p.shift=!0),p.tab&&f===\"[Z\"&&(p.shift=!0),(p.tab||p.backspace||p.delete)&&(f=\"\"),(!(f===\"c\"&&p.ctrl)||!a)&&t(f,p)};return r?.on(\"data\",n),()=>{r?.off(\"data\",n)}},[e.isActive,r,a,t])};fD.default=_0t});var p2e=_(AD=>{\"use strict\";var H0t=AD&&AD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(AD,\"__esModule\",{value:!0});var j0t=hn(),G0t=H0t(IW()),q0t=()=>j0t.useContext(G0t.default);AD.default=q0t});var h2e=_(pD=>{\"use strict\";var W0t=pD&&pD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(pD,\"__esModule\",{value:!0});var Y0t=hn(),V0t=W0t(vW()),J0t=()=>Y0t.useContext(V0t.default);pD.default=J0t});var g2e=_(hD=>{\"use strict\";var K0t=hD&&hD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(hD,\"__esModule\",{value:!0});var z0t=hn(),X0t=K0t(DW()),Z0t=()=>z0t.useContext(X0t.default);hD.default=Z0t});var m2e=_(dD=>{\"use strict\";var d2e=dD&&dD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(dD,\"__esModule\",{value:!0});var gD=hn(),$0t=d2e(_F()),egt=d2e(qF()),tgt=({isActive:t=!0,autoFocus:e=!1,id:r}={})=>{let{isRawModeSupported:s,setRawMode:a}=egt.default(),{activeId:n,add:c,remove:f,activate:p,deactivate:h,focus:E}=gD.useContext($0t.default),C=gD.useMemo(()=>r??Math.random().toString().slice(2,7),[r]);return gD.useEffect(()=>(c(C,{autoFocus:e}),()=>{f(C)}),[C,e]),gD.useEffect(()=>{t?p(C):h(C)},[t,C]),gD.useEffect(()=>{if(!(!s||!t))return a(!0),()=>{a(!1)}},[t]),{isFocused:!!C&&n===C,focus:E}};dD.default=tgt});var y2e=_(mD=>{\"use strict\";var rgt=mD&&mD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(mD,\"__esModule\",{value:!0});var ngt=hn(),igt=rgt(_F()),sgt=()=>{let t=ngt.useContext(igt.default);return{enableFocus:t.enableFocus,disableFocus:t.disableFocus,focusNext:t.focusNext,focusPrevious:t.focusPrevious,focus:t.focus}};mD.default=sgt});var E2e=_(NW=>{\"use strict\";Object.defineProperty(NW,\"__esModule\",{value:!0});NW.default=t=>{var e,r,s,a;return{width:(r=(e=t.yogaNode)===null||e===void 0?void 0:e.getComputedWidth())!==null&&r!==void 0?r:0,height:(a=(s=t.yogaNode)===null||s===void 0?void 0:s.getComputedHeight())!==null&&a!==void 0?a:0}}});var Wc=_(mo=>{\"use strict\";Object.defineProperty(mo,\"__esModule\",{value:!0});var ogt=t2e();Object.defineProperty(mo,\"render\",{enumerable:!0,get:function(){return ogt.default}});var agt=HF();Object.defineProperty(mo,\"Box\",{enumerable:!0,get:function(){return agt.default}});var lgt=TW();Object.defineProperty(mo,\"Text\",{enumerable:!0,get:function(){return lgt.default}});var cgt=n2e();Object.defineProperty(mo,\"Static\",{enumerable:!0,get:function(){return cgt.default}});var ugt=s2e();Object.defineProperty(mo,\"Transform\",{enumerable:!0,get:function(){return ugt.default}});var fgt=a2e();Object.defineProperty(mo,\"Newline\",{enumerable:!0,get:function(){return fgt.default}});var Agt=u2e();Object.defineProperty(mo,\"Spacer\",{enumerable:!0,get:function(){return Agt.default}});var pgt=A2e();Object.defineProperty(mo,\"useInput\",{enumerable:!0,get:function(){return pgt.default}});var hgt=p2e();Object.defineProperty(mo,\"useApp\",{enumerable:!0,get:function(){return hgt.default}});var ggt=qF();Object.defineProperty(mo,\"useStdin\",{enumerable:!0,get:function(){return ggt.default}});var dgt=h2e();Object.defineProperty(mo,\"useStdout\",{enumerable:!0,get:function(){return dgt.default}});var mgt=g2e();Object.defineProperty(mo,\"useStderr\",{enumerable:!0,get:function(){return mgt.default}});var ygt=m2e();Object.defineProperty(mo,\"useFocus\",{enumerable:!0,get:function(){return ygt.default}});var Egt=y2e();Object.defineProperty(mo,\"useFocusManager\",{enumerable:!0,get:function(){return Egt.default}});var Igt=E2e();Object.defineProperty(mo,\"measureElement\",{enumerable:!0,get:function(){return Igt.default}})});var LW={};Vt(LW,{Gem:()=>OW});var I2e,Mm,OW,WF=Xe(()=>{I2e=ut(Wc()),Mm=ut(hn()),OW=(0,Mm.memo)(({active:t})=>{let e=(0,Mm.useMemo)(()=>t?\"\\u25C9\":\"\\u25EF\",[t]),r=(0,Mm.useMemo)(()=>t?\"green\":\"yellow\",[t]);return Mm.default.createElement(I2e.Text,{color:r},e)})});var w2e={};Vt(w2e,{useKeypress:()=>Um});function Um({active:t},e,r){let{stdin:s}=(0,C2e.useStdin)(),a=(0,YF.useCallback)((n,c)=>e(n,c),r);(0,YF.useEffect)(()=>{if(!(!t||!s))return s.on(\"keypress\",a),()=>{s.off(\"keypress\",a)}},[t,a,s])}var C2e,YF,yD=Xe(()=>{C2e=ut(Wc()),YF=ut(hn())});var v2e={};Vt(v2e,{FocusRequest:()=>B2e,useFocusRequest:()=>MW});var B2e,MW,UW=Xe(()=>{yD();B2e=(r=>(r.BEFORE=\"before\",r.AFTER=\"after\",r))(B2e||{}),MW=function({active:t},e,r){Um({active:t},(s,a)=>{a.name===\"tab\"&&(a.shift?e(\"before\"):e(\"after\"))},r)}});var S2e={};Vt(S2e,{useListInput:()=>ED});var ED,VF=Xe(()=>{yD();ED=function(t,e,{active:r,minus:s,plus:a,set:n,loop:c=!0}){Um({active:r},(f,p)=>{let h=e.indexOf(t);switch(p.name){case s:{let E=h-1;if(c){n(e[(e.length+E)%e.length]);return}if(E<0)return;n(e[E])}break;case a:{let E=h+1;if(c){n(e[E%e.length]);return}if(E>=e.length)return;n(e[E])}break}},[e,t,a,n,c])}});var JF={};Vt(JF,{ScrollableItems:()=>Cgt});var eg,dl,Cgt,KF=Xe(()=>{eg=ut(Wc()),dl=ut(hn());UW();VF();Cgt=({active:t=!0,children:e=[],radius:r=10,size:s=1,loop:a=!0,onFocusRequest:n,willReachEnd:c})=>{let f=N=>{if(N.key===null)throw new Error(\"Expected all children to have a key\");return N.key},p=dl.default.Children.map(e,N=>f(N)),h=p[0],[E,C]=(0,dl.useState)(h),S=p.indexOf(E);(0,dl.useEffect)(()=>{p.includes(E)||C(h)},[e]),(0,dl.useEffect)(()=>{c&&S>=p.length-2&&c()},[S]),MW({active:t&&!!n},N=>{n?.(N)},[n]),ED(E,p,{active:t,minus:\"up\",plus:\"down\",set:C,loop:a});let P=S-r,I=S+r;I>p.length&&(P-=I-p.length,I=p.length),P<0&&(I+=-P,P=0),I>=p.length&&(I=p.length-1);let R=[];for(let N=P;N<=I;++N){let U=p[N],W=t&&U===E;R.push(dl.default.createElement(eg.Box,{key:U,height:s},dl.default.createElement(eg.Box,{marginLeft:1,marginRight:1},dl.default.createElement(eg.Text,null,W?dl.default.createElement(eg.Text,{color:\"cyan\",bold:!0},\">\"):\" \")),dl.default.createElement(eg.Box,null,dl.default.cloneElement(e[N],{active:W}))))}return dl.default.createElement(eg.Box,{flexDirection:\"column\",width:\"100%\"},R)}});var D2e,th,b2e,_W,P2e,HW=Xe(()=>{D2e=ut(Wc()),th=ut(hn()),b2e=Ie(\"readline\"),_W=th.default.createContext(null),P2e=({children:t})=>{let{stdin:e,setRawMode:r}=(0,D2e.useStdin)();(0,th.useEffect)(()=>{r&&r(!0),e&&(0,b2e.emitKeypressEvents)(e)},[e,r]);let[s,a]=(0,th.useState)(new Map),n=(0,th.useMemo)(()=>({getAll:()=>s,get:c=>s.get(c),set:(c,f)=>a(new Map([...s,[c,f]]))}),[s,a]);return th.default.createElement(_W.Provider,{value:n,children:t})}});var jW={};Vt(jW,{useMinistore:()=>wgt});function wgt(t,e){let r=(0,zF.useContext)(_W);if(r===null)throw new Error(\"Expected this hook to run with a ministore context attached\");if(typeof t>\"u\")return r.getAll();let s=(0,zF.useCallback)(n=>{r.set(t,n)},[t,r.set]),a=r.get(t);return typeof a>\"u\"&&(a=e),[a,s]}var zF,GW=Xe(()=>{zF=ut(hn());HW()});var ZF={};Vt(ZF,{renderForm:()=>Bgt});async function Bgt(t,e,{stdin:r,stdout:s,stderr:a}){let n,c=p=>{let{exit:h}=(0,XF.useApp)();Um({active:!0},(E,C)=>{C.name===\"return\"&&(n=p,h())},[h,p])},{waitUntilExit:f}=(0,XF.render)(qW.default.createElement(P2e,null,qW.default.createElement(t,{...e,useSubmit:c})),{stdin:r,stdout:s,stderr:a});return await f(),n}var XF,qW,$F=Xe(()=>{XF=ut(Wc()),qW=ut(hn());HW();yD()});var T2e=_(ID=>{\"use strict\";Object.defineProperty(ID,\"__esModule\",{value:!0});ID.UncontrolledTextInput=void 0;var k2e=hn(),WW=hn(),x2e=Wc(),_m=TE(),Q2e=({value:t,placeholder:e=\"\",focus:r=!0,mask:s,highlightPastedText:a=!1,showCursor:n=!0,onChange:c,onSubmit:f})=>{let[{cursorOffset:p,cursorWidth:h},E]=WW.useState({cursorOffset:(t||\"\").length,cursorWidth:0});WW.useEffect(()=>{E(R=>{if(!r||!n)return R;let N=t||\"\";return R.cursorOffset>N.length-1?{cursorOffset:N.length,cursorWidth:0}:R})},[t,r,n]);let C=a?h:0,S=s?s.repeat(t.length):t,P=S,I=e?_m.grey(e):void 0;if(n&&r){I=e.length>0?_m.inverse(e[0])+_m.grey(e.slice(1)):_m.inverse(\" \"),P=S.length>0?\"\":_m.inverse(\" \");let R=0;for(let N of S)R>=p-C&&R<=p?P+=_m.inverse(N):P+=N,R++;S.length>0&&p===S.length&&(P+=_m.inverse(\" \"))}return x2e.useInput((R,N)=>{if(N.upArrow||N.downArrow||N.ctrl&&R===\"c\"||N.tab||N.shift&&N.tab)return;if(N.return){f&&f(t);return}let U=p,W=t,ee=0;N.leftArrow?n&&U--:N.rightArrow?n&&U++:N.backspace||N.delete?p>0&&(W=t.slice(0,p-1)+t.slice(p,t.length),U--):(W=t.slice(0,p)+R+t.slice(p,t.length),U+=R.length,R.length>1&&(ee=R.length)),p<0&&(U=0),p>t.length&&(U=t.length),E({cursorOffset:U,cursorWidth:ee}),W!==t&&c(W)},{isActive:r}),k2e.createElement(x2e.Text,null,e?S.length>0?P:I:P)};ID.default=Q2e;ID.UncontrolledTextInput=({initialValue:t=\"\",...e})=>{let[r,s]=WW.useState(t);return k2e.createElement(Q2e,Object.assign({},e,{value:r,onChange:s}))}});var N2e={};Vt(N2e,{Pad:()=>YW});var R2e,F2e,YW,VW=Xe(()=>{R2e=ut(Wc()),F2e=ut(hn()),YW=({length:t,active:e})=>{if(t===0)return null;let r=t>1?` ${\"-\".repeat(t-1)}`:\" \";return F2e.default.createElement(R2e.Text,{dimColor:!e},r)}});var O2e={};Vt(O2e,{ItemOptions:()=>vgt});var wD,tg,vgt,L2e=Xe(()=>{wD=ut(Wc()),tg=ut(hn());VF();WF();VW();vgt=function({active:t,skewer:e,options:r,value:s,onChange:a,sizes:n=[]}){let c=r.filter(({label:p})=>!!p).map(({value:p})=>p),f=r.findIndex(p=>p.value===s&&p.label!=\"\");return ED(s,c,{active:t,minus:\"left\",plus:\"right\",set:a}),tg.default.createElement(tg.default.Fragment,null,r.map(({label:p},h)=>{let E=h===f,C=n[h]-1||0,S=p.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,\"\"),P=Math.max(0,C-S.length-2);return p?tg.default.createElement(wD.Box,{key:p,width:C,marginLeft:1},tg.default.createElement(wD.Text,{wrap:\"truncate\"},tg.default.createElement(OW,{active:E}),\" \",p),e?tg.default.createElement(YW,{active:t,length:P}):null):tg.default.createElement(wD.Box,{key:`spacer-${h}`,width:C,marginLeft:1})}))}});var Z2e=_((AZt,X2e)=>{var iY;X2e.exports=()=>(typeof iY>\"u\"&&(iY=Ie(\"zlib\").brotliDecompressSync(Buffer.from(\"WzmldgG9bVwKtw2AiKrr15/TXjBi3O6p4GPsCmiaKasTbJt2D+y21UTTKAOXMxqqqpq6VIbMhM6nhTJgV91V/5cFDwSquCGpJ1XeWdjhTo079eGQs7AbMhPpEM0oNVKxWVSokGh1zUG1OJFHO+BouYdnwZE6MKWCZkTDEH/XOa63elQXHNewNtw3eZjOST/PFzqE15siLy8+9Pwl5wiSrGtqcy24yMtDbvbtnc6+SKLjQeHW8wsYF3HDH+mfwvahWfT13uhuqPbHARtcHABFCLFV+2AucYtH5HCfSPg0sVm+8ec1x5FggZBS6voI6fWF2RVXSgNifmuv/0ZNERTIsq4D3OVL3+xRCpTLpvbP52V0hXXqrhAMQ4qu15dSVmBI5AI7MVyT5/xv7+y/vukaU4ZnwuRwn4hn5d1As6UWYtXwXrV3/8ukdDu1OBMnIX+eJdAD2VdSuCm1+OVPq69f7e4FqJG5kPElJgbGGzLYDUyQHqruJlZh6vo3RK1FGymt7PHYsbWoLS3rsaf082OnA+jOWmb/+bwqd7VSdI672R2EYdi150KDcyLkJqaMO2bdiMKjEC1EbLN/SYfNIigs/ljpTlHV2m+ZhJtS9HWsba2FjgiYLuJDsvCvAPH9dDquCbfjlVUCu/qbvnTPDhYcX8D/1vx3uf3vkuYSnHgwBe0gu5bhtftLM/75W/n1+yZ31ybrQIXW8RNlQ40yb4Isl5Xga37U0P3x4EFs4//p8b3ZWRgCtEskmt7S9DtgVJoS3eT78Y2t46GDVLZrxzefAcfEeiAV3QxzMHfDxN0vDWw3R0OYgB9g+F5tVpaAbp+/dwM4x3V8PMeWYikddFcklIfn893+h4P7+eGT6To7SbNDS5tClDqDoifApehFX1SCp3q3jof9Bc1iPFbPdJIBRvehUcINBn1AgKjRbdCPfjT/6fNjd/dO1OSZz1PV1U0xgBbYKPM3Ya4FQR1vmASNHxabfzx4MEV/vz2+mUyyARbMhoD0hrbOhoiotl0ihGimlcWndUjlAMTuQZl2LhVBiM53foq69kP7z1/U0MZPaKKVd9KCFYh/SfIq0TVhqkIQLN203o/eVWAGCUYBfeGfZfEVqL154YYXt4BjyO/fN812PYeUt9kalyRymKXWuSBSkqGr7n1F/N/9e4gGmmQD4GhBM4YamXEy7lW912B3A9QBMGYBWc7IGBOtMSZINgpWSbpZpJls1/9/39LPFMS3mUJNpKUklaeTMSYItXL0uWe/Pexy89Ho5hIBkmOsufucc19VV1Xjo5v4f9GNcSaWS10YKVeaNMCR85ks2vv9z37IEml/UCSn4ZypWz8TslLY7a7uqY0XskNhlJnZJdwn/9/3pvm1Pfe9RCJBVLFAVn0JlL7h9+JXG7/tBEjpy7dx1XbXPWax+rz3nHtH7977spXvZaKV+V4ihHyZCCETZDQyE5ggDPMlACqBYtWApfo9KEr6wdJXR7Ak/Q5+6wogK0IsliJEsqpNSW2lsW41EdXGuN2PXs2flY19Gz/WrHo/u9nsZ72Y3SyXvVrOYjn/v00/23sf3Ddr2SPvfm3IDkFJRfMGbA6xiy5F9TXvzhxbM6M9sfzJsICkkeS17O+/DAGgGqlOmTJlSmw6wKpNl5Nqef7/j286sw/cWU8H5a4BGvNP3y9Qln1BBwPNtATCMINEApJEPPi+bnw7E3zFt7Z23y7ixMITTQIMNLD0vFB41eZwKoP+4Up1d+blBjlu0giFPH9zY8Ai2FNrWOGq1qzZLLOmj9BIhDE0G8L3q0osCmHIdU94WKarShKoBM7Qkopuv6w/D3o+/yfa0FtSb/Tea2UgA4kYRZQIYqyqas1aq2oUDUHveH8O4Wb931Ckh4TnXYEWQkyIAyEEleItjSCBtL7avv8dwW3spuaDXOkP0i3FLOhBc8V5FQww6HZB8AIT3E77h3Hv/P47dChYJEORiEEyBMzQIUPBgh063FCwQ4QbDvx8TV3P8/7dcwDpf8GCgAUBURVVAQZRZVUBVhXgSgEDrPcMDAzW1y3++f68m3xhr7hiBGLECASCZBFkg6hAVCAqEBUV3aTiZIOfrvrnvXMfzbIPGNBgQIMGBg0MrMjAwIospYCVGBg4kkF9qcCJdECBzjI8udm3JLZPkf/vLokF+hRgGgLDUAZQWleQVlUsEDdxr/Qpr0Qz2KZVZSfakAoBSsVsIv75RyhLwskA2/z/f+4au5ue/TxlT8IA0YmiTsHCyM0KjFkzcOlO/N+AxIs0Qfk9UFbArxp5km5W0QGc0HcqMcqgr+LK1I9eBf0Mmq/see0jsOJUuMguhCcf+1qd+5ZW75op4YvuCvoZ9Jj94rYKMTJNQjj2TXYPHb6XqZCwVlMG3jzbrKbWNutghn285871s3z5OEWrdwShnykkrOX+OfRknEF8d4xTQF80BLuriePXfUin0EnlXaA1eNGKMosEvfhya6R7WCQf+EQ5EQ3MNg3OGqqvGBFgVow+kkJiUrJXErBuR/NebYx4hta6H71fm7wuNmRaqkFcDjw7WbcM+rWA0S74PWtIhrSuAjWS1gOShuV27spkClYmhyA8lTySmUw0X8s/qFJvh2M3unws/vt6xtZaOQP/oEXE/J84i/3KJFoQ3AbCIqDUPFRdnsdAEiVziRyt11wyQAXJ7R9XP+F0sBe/77vvAAz6v+xaH/5Hv+SNxO9bZp1ePsXufZsFjvMnxXIm68xedh66UB45jl0V/50kJJYLIrxsukPBKJP0UccI+Hi8ky4Sy6VEvpMEMzwVqcFOkvZUfJqws2SBI0oPdpIaFFmS8TZqzSnX/uQrppF6wVxIpPgGll58oeL8Bo6V9cLCy03UTpzbkNHXmy3QV4tc1T9ZCiLZmXZXnXDCeHz/HJrOAgoiHAh8er+prR5YLci9jZwN4Pll5pfJey1GLJZz29QwjO7X9XK32nGg5VlqGWZ4Tkb4nsHSWahv9wJWIkbO3jDD7N7GQuA4bLbAN4l4gzIQAIwAox3MXdKQoZbKJ7eDlIOaRa4nq6B6jaHvHGuTXxwLcg8BRtSrh64NUXLnKnYCqY98cj2RhpgDsY9cgek8crLgOlmQC1v2dvU7QFWf9fxVA4wAqi4uI2GIWRv55FSyAc0iGrGhCV4IxU6MDacoDn0z9mmBVtGcQCbjS324rqV3Vpr6JG1t7dIsicL2utKK6dWBdj/1ROr/BU/WfvNYQteeTtAMubmB9AWes7kx5Wzd+H7hDJGM/uEAg3+lVghwpxzaOCguWf14LKU0mN139UeteCV4LCwHg8YX5Z93VZdoS0R9FjFDo4Rceown4BlgktP4Gg4a01s4/UgXTW/pYmLP9pbA/yjVr/PgtCA0/cuX5F36sJST0SekTuAmIgsjTLxKPgialVgEOycyamJ6s8YnoRWdtV69MDjNedux5M3CNiP3yWRvs9gpo012zrbfpTh/UwrvDqwqjGG76nblzJ1z9CWFl8EU1e/1TM0SY4TPyj4BgYRg31sNKQJUQxRSLUQiBF5Fe8WoopLTehXXr+L6VV6/9Po5KZJkH6IphhRRqiWu7owgURdk4tDsCEWX5p55EQZjiPwOwhhx+vGO4FZsRxz/z3AE62wgzq9HUIv1/szhoq/5a+MvFnp7MF9u1VduvVVpulrK/Pc5qWhygvCM8Ic7yO3QEE8Jc6Ne/uF+GHfOlsD3Wrm8rq67uzV3JJvoS14x27UrCT0i72U8DR+9V8P5j3FVjcPIepDhTufUi+SJImciDRVUj1GU6rU8X3VA4TlCLTEsRz9Ym/3wDGpvontKrI72sDSE509JQ4ysoIBmq6VVp8pCQiIvKUWz0X1UkubO1WZMLiM9+/ldJRiHGxlFdNrt1uNpR58fluHK5CictBrz6QYzm1DJf97krboSsqsDRisIu1pvN5ViEtvYMhzUnw4PH1R4Qb1qbGR7uKZO9fV8ZPAGI3NSyCqmfF+N9ZIqktqqvUTgRbUI4JybOCKYanylLN1wGtzUeH1Bb+TMeCpczNVJgQb1lpnLE+BFPWB5OSHTnQry2bvh8gj15FDwg4T8WG/JR8TTbFryA4Sfq6GZOdreyAzmiW2qq+FHFP9lfbBG9TOuA3ijk8Wwxttdp7sgbAZF8mZ5iXa6bYl4mtEyKSNBw2oy7vWj1Vyk5V71b1v+JDWVXZNuY7VWjDb9fErQqikGyzh2U8WvRHrJEknolZ09n/ovBSZeA63IVPTWvh6AihgPYe5prt1emr5/VNIPqazqNds34ONK7vSK7Rd6sL5Y/LysFW5yUBT+cGQbT/ZcJn32REu6jbplO/eretn7Hek3l4jxuWQCZyIoYyYkUBpPwSJNbl7IfwvWJHisYH/QKK3OJ1PihvsMW/2zduAk4x6m5+WB2F81uUYtYb5FJr0Oyppsdsh6p7d8sTJeUZoTHf+VvdESxeZhMZZi2syxaUNKDckoRr3XlfAG78FSOjCaj+aR9DFCRWtZShIeriaBbhz80F1CmF7X8u5/WqGfTRbTJclVYXmpwdeOQDcW8cthOaSXBwjm1aRWfYklfy6JyYaEO41XWYWyDmVEOO6TWIpgsn7w+/YEn45AG1r242i0gPpZb82uxPv/2XYzR4CSezjvTj8efeNVMFFI82OfLxlBijcP0GVFgiKX2Az5ljJ0QUCJfzmokD4FRqPfUhBBMWe6svtfql2NpqTOlWdfGAxL8zFnqVb2M012IDs1qJSqxRyZUlkjpkazpFB//K9e0PinG/X9v+aBvJT9o3Pv/Or26er0brYKyhT2E/rJ0eFvi/r+rv5SolLjE+n7OZXOaynWoti4wJbqsXXrn6kMqsCu0TdfxXftlNBnkgoxpX4Ai96ThXmaVAliWBFQuk4VOWYZa0YLIRaZz30GMzTyUEWJSqmmdpbjay0bkMaEb4Mtn5BvjKHCNsFc1XsyFl2Z1aqQLmY2QXdH1a3ogmjT4uF0LgIw7dCdio1eonRogRUEaTEWB5mxGKWhVmntjOqEyBTxNDL9GBtV0WlISmRtXwSIM4yKEA9eJIo5LGpFYW1upPDpqMoJi/doIsY3yWIpfj7xTE+D5mshpnElIDRMlmJvBrqLw/oezdXReWyY5zoYT1YufC1fZEW9pi4oaeaQWr9yUdlkXkJlYSqd6FyNSdbJ4K4x6OeX7eCKlfrOaCOp/ElKPNorOPeF9TD9eTHztnMrGeUGiRuCgA/rOmQIlWGWt+6jFI+4yNmxq86Lc3hNyCFljGYYgI0agjCZ49uMhUcGNOgCayjSc7AM9g8tEwPb8rCSFG6UvBO71WJTnXSUYZhqmtn918A0qfhO1yZCwxq7pHgvKYVg5kB9D2pz47jHUKXa3rI8j7gr1Tqknb4d9QFOyjOfMaOs5vCWpe87VF6fZMaLgYmUC90bSyhk74+k6CfvF9lciO4PqUe/wV4MrLlVUrdLwDhE+4g8WPpZFIoyu5B4Z02Yt9MNASGzjaqtVkd4R0Z1slBr6hV2/WqSg5X6vVQJA8WtA0msjtnNJVZtFZZkB2NEEiQjpFVtpmxUP6j1JOcr9d90KxYDbONpJK9whCyjfTIUwbrWqdkslp2JGvlmmW8zd+adLsywpErFm3PJog7WtFt4Ptk1lIoLZzsikuZ6son7tbgdyVvvWOrLnuCSmbWvMc+forl/ABu88b8f1ja0GJN+NEfk44GiriweW8hmtxxxavWRu07+NtvozokuZTU8Y6agyUyWeuTlGy12I5TMxd02onzFUiSbfrQGN/PfOEBpaopGXTBH8or9y3iuKvQFJ2DsLsBCSdBj9dkllfqzeepgJAOOjAYLd6ZVhCPupRimrZ54LUyZNnk3czOh2NRFV+2kcGfjeKccL5OaKp/+diQvL/RHrg+QoRDC95wbJXsTQ4jqhixBJ98KXzzUUrOgEHPxBGtLIWGx6J8qpO5rNgGFHgL48pooA0J0P0t+RsEYhQpKpc9dhaVQVtAh2whXL6FxldoZxAlmBmOp6xsABasN84zlhhdrx56loBTp5PP/48pulvxmYFcl88AgCkO/HOu4AZOsPlMG1/z21oibCrILJFusUUMbt3A3ejzakQ6gFLM82ZE+RTIFTnkSVjS8hws0ykUp6qRHUJM+8zGUzEhdOuShPlMplKxd28o2Izs+iq+blcloK1/q4GcX1WALGHCFZTeFGu9F3Xn9hsubvkTbz2hwcutuGPMzh0Is/+DK1YAnOcWxM0CngtIuKUNkaTiC7ScqLOOU/fXsbmykufFG5ZDkCdDp9yQ3RnIzJGSTSZfihq0HBidy8hdWxe36095pwgPx2Vj/9N6U+IWT9tqODy7KAXWmK/fslktPJhSXtNe3AqXvQ8Z+N38yuGoBPQuzRDR9iMa1cizoLTJ6XMuqr5xOm0ONYpYA7yxcw0mPXRpekmZp8bPlVFkH89jtjlsXmEM2MTz7urFF6RbevmqUHArVlUxu4YsPwBpL+/tGqyZOET/FvD1iUCeD0Zf6mLAh5fN1WWyQtmOI9gxhoAP26VNNwU3xe1H9NszbSnefpJemacA5psg5ACs6AEVBdXU5AWbg58VMv1vgCebXbCnxdLxWDjcf2UH4pcass5pKqKALi0iL830ZllHFePsL15XEujuJwk8aZxY7szFY3ONwI28H+S9PIH+wIvWROFKOmNB+ZCSD9tmUzCXmFSt4YRvEOdjWQvDdNkuUb832W+r/Z/swaHYudI6WbYXqjWPQhyl673Lie+/jZCtUtwk0OLJ7Pi0jTH57E1voliImhSjyG8vRC2hMfFpeXKJ3m1Y5uWbduvgM0ZPQdMBCrMzQaX7EEdm60AU+taUWGukV+hExLgUCBfnF64fBhI5y3lKNHIk4xZt2zOV5Sh75aHgKlZaTrTrDf/MDEfKpq7ueGzHCiG7tVFfUVWasaCFDWNc6L2JcOLmaamawVKST7ILiJ4M5UCxOtlr1PS7o5MOnE12lS6E+zyliVkHAwXSzoLpjR18dto+Fj9dhdeb1XXyp9zjWZrHfJN69NCajWaDTqUW3KRP1te2PgGjrtOusMxeh4l61ZZWrLsbirsl/Muq+rL+fazFc4sFxpDI/f5LaDOAL4CEZTLEFkD0PmMLT1UYqZtxOyBp5dknE4pJE3QEqFubBFHLzfXTs0iVyJkxjOLRJtU/y9ECtBLj4Ci/QNnrn6GVjWSep5rBvUHzInC5hPN6fHugOhbU2bv/7ElawutTG+03PFTU/acQUY9aL0sf/PxR9TGPtufInh8t1Yu4HM/7lLT+qXIPXjwvomTro+jORQ4mU5iHNsCxgzBlXl4t+3GLxh7nW3LCGbt66lrugm9twA3ooI3aiY0qan1nl2tXGJXlw5SbQq0cemg/SWuXIRM41cz3zWZ+/iJfppWI6jFlagPF/EjIRbMQfHwCVacXu2zjGDs/NOxoiF3AL1h6uupVGGsNyP0HCpj/qpqC8HK5ag/moKN9g4KoA+A8XEyFMokQmysfSEJdURKvWjc5YccPQd0mTUJtHKJHqjMxs293a3IEDuNs/a21eVRsHlznTC7z84L/xXr4cfjrpzsYv6TI1Ppcs3/offPI3Iw7ooyfXmVfehwbRVTjLhov3nnN2azUkzeW+s77dt+UOPb1Y48fpNlc/3O/COx25vYfahSBbb+4NlO/BmlSP6vO46QxfLrhIhtPv8IJhHw6z7JDd/IhgcBcJ2XHY4j46PILdJtjw28/DF64RuMqfIjNtvunMGMujhA9G6BDBaT7ojNyVkLkbGEMag6jCXsM7dL6X1NMLfVMATNZobijsTo0S/jFPZypmmy9uy1tPism4N2rNih8tUNK34z0zCx57iAguMmFwvpTzYxNdB2UZyyZh1/y57PAeSLV1MMg2qQzcL3unqMxUGW6f/2uvX8TyC78KZ+ZHWabSR+hDsKyoOqXSe+iP9r9fBKAsYnmVhhTuNNFCZvJQr3VK7hUpGuMQkphh7apDJN+Nh225pggazJwxcDbZkQ2Jr/HpPiXzQLIX2hV/OKpjEhzPYcIoRZMr2/vGx0mPGUes62mv6VRxHr2aP/ZQv0uiO2laHzDvfl80ceQO18GiXV0PeHIOvwu1ssWdeHrSLWad2fHNeFu8/OGKxrkdX5v7LH/fHgPXwQbpHX3qeyL9Z+SI21/DjWpumVyMCcqkqpOyHKYgi/kq6lqGYHe6o7WAUHKnQ1b4DBRaT0aN6vRtSjUbNCYuCiTV+X4mLsQZUvHQ/Gur9QTZ+bKZTtLtKTMeNSuMpB4jELTcWimnR9jNJwN4h/jAvZ/gXvTUwFRpJaHyo1xPTEaozShJXF6ocIV8j3/+YB81zOUdtbmT72Zf58nEN27WEyI6VgfnTMYNJFfHi2s8+Saq0rxFfxjMlLWsfveuzD8HZK2dEGNIFYODEvoJYtcl3BxANyQSNG0qgsm1GYM7w2MFGrXhH9xB+GJ1zPloO+Ct32tW/Za1WuhVPA63WhtLzmw10I6QNhUAjZntgPKfFmmdURTZ7UoAeyWBw0Y6XP9SWfSshHDM+xmDfWgAZg2cg51uyLSF6GDkDb8kuN2L0TE+m9pYfs48IM4yKbsC0CAv886A9X+m9lu382jsz5tpPSfhRp60F1+Vq65UZM4qkUatyWO+lpv/mjL5SZtFkDJPdDcEjcHDMd+vrobLqVaEk/XUMFoz6UVtGgkHqNJmMkf+Kd2h1CMzVQ8F7EfBxrQJYjUeB1FgenkyX8VpA5XZJUfKytonVKWVMTsJjY0AduI3gGS5cA6ya2NZsnqqHo111YTRLNxmo+CIj7S3r9OcXrTWOFZJr6B7TO5qLmIIzq0mlJ4DJHM6AGaV0eSvnZYxDCGoqENW6m/Ervu2ktAzV+A6mLWVE8EUjylqZZbSYinNuW0IuIq5L1wBYqr4Bgh27AoWvd3wrbaIdanf0tE73tx3mhDpul1aS6Km7+8OfUyNAo5lwyZEu6z33BGd6tYOfPvVugKsC7lyByPf4iF2xEdM+yJia2shELvLM4FIpxHBndiyH/s65AHPu2/GNTbCdelVRCvucl5yufVMvpx76fvpyL4qS4x5GDd/Dkf7OphM6oBsbtH4GSD0k/9meDeaG8qkA2tYCBBf8CnzXNIhqn/K8zcrL250wlnsvyDCU6/zH4yn40eb/3zrMv+lfvcZb4ax0+PpMEUGt5y6XPt9TdAF2on3UEJkxgTvS/vIUi+JIyJ1040pk+SU70ddIq5/LMGZR9yY2+B6QWPS3+OyEDlZ6dWyIg0szYXO8pnZ96klJ6fxz0tqWEbkbY7qH77V10mTb1wGbiynEk2mH031lut5qDe9/4+LO1bJPbnJcOgTm0NLM9guqOvbxkcY3/UBHFevgJ16Xm3Q6BrOkrvUUXIwCxHKZ7ud1MgekWx7SDjrVN2FzRNuODJ5WblfaohNY7NzbQ3kxHsy+1vvJ/GDYyl+1eER4Jg1rHOQYtHnxf+CwL0frCtbnI4e7Ymypv/YJ+yTIROauCSfraOexFuBmi2c5I4EfjDc6TjmxdOpdgkshazMUqO0wNMY669XXb+BnENz1tK+cTr+5yyEcL5HTePILzNz0Y7qnalqdcZPFSZCi24Bk3bE8J8hoNl+rsg3RlS667EIyWq/GrjoS6cFkpM3qAXoCpvcsgzZHpFmJVA8PTFCe6YkjHKGp5VRX56O7csL/R39wuQ0+HC9e8Pei8nlo7Zt7/wDjt3jvd6HXBlb4V0+vcEH5I9BtWS6q5R4Zm+/6hba0yPqZrKtvoqP7EeRfCVQU6s2GB03A8MbAx6hNNKujsCSTDOaaHtZJeaSnB0mRt8usUn/+K8XtInlMmJ5nW6cBN2vjDAKdYFFzNA42z15P3pAP/dTAWr7gftpZ1ZzPLW3BRZ9f/8E6loAwH90gvqqD1VsAZJaFCDdfnVnPW90xqA6j7e/bmNwL51a1jlVr6LvC8/zScudCJx9xYs6/NoeQwl0jyLsMjh+SHxuKJfOhTALDoVpJoU74SriZp2WkRvVVhRbUEdpDcs441j6UayT0A1Vbx0Ql45CLZqHx5+Ojq12CmgzO0F4iyzwzTFpksjHsTHS2E2Jim6fDR/+B1P1A//UkRSO7t2L5lQHxfsPmmnXvg15Drfa8GoPFofoudbjbS8qc2MrjYEK97cgmUP1vKsnqWdLBnitCA222lgEOBzQ4gIFlWhFVBKX/1gx83qhck/h04kD5wv7avkM/ssRFz8D/dbcjxfqtYpawZON9m+PQNDBLin2dqy+dt5wk9JVUxhHul2hQVjAfCDyj2s0pcPk1NYRc9gSRb22HEFrq8YbCqvAowzBk068qkCbrGjl9h0Rl4IBF6+Qqbxzt729FoVjHG2n2WB913QwxZVDbUHDL4udmkVd3pv4ulQPbzg86/OYCj/fbEoDF7+FfKG7j+/Ki/2SrpOmMuH6CaActgJB/ykTh0TZ6+pf2W1OGVpBxKTnLpgIX15CKBy04Le6loLeFiEgrEMpE7e1Xmolc7q3sTbmg269GuayrDc8joe32gBjFT3H615eDIJlpCmUjYbmKfo0jgmdWm1r82VPZgmG2ReXv/KQcAuGNHUm88C3Pv5BMuEvFuux7xeo/e+cpNW1I4pB1u1D+SwgVUY8qdyqHGAg4nFkehkJ/3NyYNfrtpbTUP3UKcn+cJbNR8UUnF9t3PCfJzdR6KXceXCi7Sj9vqr3gKvSuFsd7ij78iCxu00Sb6NF7FEUBcK1otcepQNV7/yHVtVjkhTRICJVtGf+SRwJdZq1lSOilCOeSG97GP1dRESQsu7ADfkZ98SjFiDmn7o9JGatahUAxbhlwPnV/1B9QW08zPmVs4DClelXyvPI5poWYn3VLlcv1ZlcBOs13T8o1Cf+tm880oF78JiWeLrW3gb2K47PNHy0Z9t6xw6/YlA7SXsl363hPZ5kiCnZbBYvrcjr62vxcFFsMGy7Yf4yF9/o6gld47D4eohGPrrwNf1W1yXLCWIZdaKY2choRtUOlh0M50fVUz2Gpwq5Zlyl7b1yA/tI3+RVFS8j9JpSK7zjx68/HuRC7Xha3JCSArbuKIOGh2HPvlAoslZBNXYaD2ljFd/yru54d+fvHWauX4+AYmj395EZk+WoUaNwZtq+eif2Vjy5Hb1LcE993DIom3DOzTE0Lf/RHtracp8M/RGMuxYho79QOyPv4Ibt6rg63TeDu+5IH1/X8lgoxjfbuwu4eLcVJYbyUih30sil3LaAKplTHYF4H/m3IHyvGHd95X5xfBF6AQkOMx8hlsJU3uWaeoHmti43WX3PsPLtAju0KnxQ0fudxNPH8fDWlmVwymTDHH+A7m7RV1IspWemOdvtiLnxf2LpBvTLYLzWL+OV8/H0SierBsPjwkw5Ao0+c4AHscZa6xNOmUp12fHO8OUpY3oOnjSHk0KdF8MnefMSe/BUUs98lHGIHk8TQQHL48jHH11FehWC/JZjb/OvMOLdz66yN4rL1EVYqx7JlUXLRIxPHeNkciY5SkdHIOFIGUZrh7GdG6TAtqw1Wpe8+85sAcURVWW1gz2NSwnFAmBVG4Ig5P7yHiFJm2VUy1kIIvs4pJKJBR+3cBaP1mBrSC6AsCYuCFg25N41dmXxAYiQ90FOQiaAZ0YIiogcffHaL0v6rzfjv9XA9CxGEZOJUmZFHvu3mZ0jZYY4x6FkuDOvarQPArw3mz4WwLyursIRNnQFdquoc43o2K8ByPRWQso8iQ9pYQsIB8VHeYjmPtUKF2XLfBsRU4wDVxKCS4V1fvfvWsc2ocpLDN89ceNGQrtg9avAHzHQnhd9vhBybyXGDujUZU5sg0f6qgwitlKMvRhJe3s7W68oaKrkIKBvbtfjoKHZkhgDvfVGHTNhqpA/59fHirGuFRnzRD6gemZGx4kx5xxJmfEMll1mTWlFBsrpxgwUChrKjX5ZcsROeYhSnpP414WVYaxZRm4tnlGtj42hx8XQY2WIbrpT7B91AzlUMjNGJ4lhxFnWiFcNXk2CDOYajsiRkVmI8KwMEfx1fjieTtXuT32rwbCIgKT8cipvnECePeJdg1eXIIO51jOyZGo2YgXt1yQKbh9+2eCafJp7bB4AfBYDuhMbpWnoyUZ3h24e4sg5L6RuoYn/5eWtu9Uqn6vZUKwqT8SXqwHYs2SjNs0H1UWTq3dpezgDMiMEbYUP6V92w6qyJhCNY8T+sl5XyIiZvAAR8jadA6DpQ/n0yyH+wGOIAkyOArJEs21uVaLI1hstjngPIFoH4Ddd4I2PfyxTizjyZIaTknD1dSJVIOhC8Wa+Ja9/Aoauz9D1GeKBukkTPMK2AbeNTCEyK/DPa1YJCNsG3K/YJzI1MO180vmc81nnoWO5vHJncyRQbJGIsDcZYDs0iwPAWyBIL6LIJ7z/0ixnEu2zg82n02XWdk55kkR0q2l44IAv8THRwV7TXDoyliuWDujgCdzuD8GJ/GITjDnP90XUdsbS8T0jGhALt1FM/3nS8ktJD6Ihn6Eo4GBQccJdrC3oX+z9n/FSB1sfeSGobRhCNc9sQaZXgh24UTA2WSZOBsRSYzaigJ8LmrFLZObxBOKzJBCdK4HdOFtb3QW2YQC4uQHQjANrZ/hjsK3V5NpthaocmbkkjSObSE6wLtEwIWatQ1zkIW9MDhGswXOBRzgaRZ7nJNT+I5EsxSNlFaXnQPubaAGpvv2B4sl5Dfz9L4JnTF7qZ+F/88czg1n7nItwIWDMYvE4c8h1qxm8/oHI0Q2Qs5i3hmcioc1TdjfvYHwTNX1LmPoGnbIhN97kvhC4F8p6/aoleOiJ2r2s4mW8N4dfHni+Q4rWRwUbkC0s+JjloGdQ2UWk4rsxQLcJHYHe/cnk/KO2QQz4zaj92Sl4nsa6o+2vL2VUvO8BUXQE9puNSv68faMOIqIWk0VZbLUSnON5lph2G5YjVVvgc+t3fqELeyQXOy2+wmvHhE4g/anZ04/XiilOlXZuqxSwR1BhcQvWKVvSnNbxhji2kEOmUM3gqppsmGdSMZuPrRCfkSqK1Y5G0OK5yoiH1m11T+3bjJmN3tzYVfHNiiU3rP+N+Scti9iOfbZX4fxcf9GI+KWLfW2yu2KSJDwJL+QB8WG7IubdHvmLRvGOsLoZKdsg+pgrLMjvQLFsKxyH83AeRrgans2uyloVJncUvzi5pJzw/yZH91tGY2ncFWZFzuJy8iIJoAlJfcCAGU/WPZtw8CCx9IgRdrylbbcKo1I2A/62um5HpSVGQkGeFrpOtK+Y+S32OxQs0SChEQDhssDWNJzoz9jsCZC0ayMhC+ALpH/hWvvoSlYYMOBSNpKqFHL6F0p967f1GQUDMTbdRc5WNi5Uyt36Py/OlQbDrINyiIFxPdcaGS/I+tZ6GmMqJFHVBe1a7/VlX5P5QF6OAx3VMdFWDxQBipIbbPa85jYotfibFmjbReaF0VFS08bQ3LcHlKnCDts3mV9FyA/VbSilPHSxEVFHKbE/NiK/YC1bay5fHk7qpOsv9UjDVsDR2XR2ImLqF6bGokvt3VrU23eIoVtl6E/H0G0xdH2G6s7A/sFs0CKR+V1X38EY5H3AL/wI1orEpZG283JkqWoaDidmv7IGvUjIYSJ9x2iy4Qd+ZYxgrZiMGuo7XeesVc3G43ztTwxyJS5hQV1Je7I1XZt9B2+CCBxsex2+/bIH9VIC3FST0Tl7WjGYncohTQQWiZxO5sbCuXyvk/HRXrCUwjvKYVmuu6jSH6bdEe5BxAEF9IzSHLRdsb4r/nIKz8M6DAb1mR7/OfA+T50+82YwYeRv8WifsnnR/jUpw+DPHAXWyVG938Pf6w0i/qnidWwvSeSjPFAZ9pSYFTQoVkHkwaCtxmEOzVxVbe7DKn4l3jpDV2To+gz1t8P41XcmVlkZup5ttYksVbXV33Kz/kraSX4LAGhF0N9RRJ4shbXT+Tbna57POa+eWw5P+VuYah9PBtZZPZh9QAtJAhfvjgNbfrWDZiUJHsJLj/+hzBR/QhBNG9FgeG5x9Hcv6WRAsY5Qnn03+0/FctcHNXenGNNLrr4raDHhtBkEbipiKl0uPwzg26bxCaXHu2ub36kgx3Ws9eXw7rFFwUBOl7ZjuPEF/NDAU0AIja/HPYnTXQpHAkoqSOgBd2RYOslEpvtHVvuZ19Wp/Tj3Phf+cQNIte6GOg27H65W9SnjSG2wZetcP3ld+eol7uej+CQuGx29lnMQWTEBKtXEjo544NEBgKoKDNssfVq/gCI4iU+T/8QtnDlbVU0ZtnK6FUZyoGLQTHt7KBNmAJQRFDS80zZRQAR+Rv3w9xclEIGaC2O/0Xq0mEO8rTpypE8zrMclR/ug03hESV11QlT6CbOE6CN59AxyrnkFW9aL/OBV1qq1nT2VUPKUwzYxolaApmGnZW2dlC+mpGuEFbrpOuhWs7QDSdHjZm8ZS3N9EQO5wWzr/XCIprpWZeAhurpZWdy+MsYNg3I4HnIvxXn6kqGfEIttqCmlGmZf+p36iK1WrF38VB8k50e3Zm+3VXQMlZWdxOCOOV9Rn+5yc9HHtT3PzRuhMn774wxSZDuGG5PwxubzFVmsxo3BTfnPL9M3dEhtkmL2uuhdqC24G8CLKHjmrHIe5tLLl9JrjGPZG2ag6783WPnopYYeGE1XVgDwBRHWoAVDN/9+YrPaJ4u7rufZWW7Y8Gdia582buq+uf1hUeJAkuwCFwwpjRq2cMHtHM7zusAbx/dIQW+rAjaSgd/26kDXmzOO84Z67iZFF9zO4XyQ9sreKLcCn51DaNz810wT3gQJtz2cF0ZnkJtx/Gc/p3Tz+r8nYPqx/Muz9tulbO93I0OzZEbDFX54jhD0U9/EApKI+Dc1d/lSWnRjwW/KKqRuxRExKX5lcr9oVSIx1K71y3qs4NdoVT3leYUmSbLB4Se1ADCWr7u2PEq/LDCGnj8ByGQpo4QON9lmjRamflEYj0eyNlCFD6afu+l5iV3Ncw1ZB0p9qaYMz1HiyM1X+2vzmNx8PgTi+JU44rNANz3oV+lj4kvkzN/P4ttbPJUIDkqpxsEFvogcAHFkxOadgNoBrFaLfppGSRlWLSBJmg3xTcck+I2jQNtiGMoExKt3ZNSIDT/59+P7ja/1+NkC7aMA/OaR05htGsgRUJtk4H+kCbqDYw7I+6fXEmOyd6ej+5pa7PEn2XNDhY70a/Wvd+n+Vhc4GcU4E9+k9/zptA8tRXbG4wiZY4HPgXtkkMYaJRwo3I928ZdM8zEw+xcJOJteLMhwR7yRcROvBv1SMXgzsD0MJ0ZWjHCstXR5OZmdB/U1rhs2NVOPRRtJK2r/E4fWr6S2JxTFiCGye7kEq6uWTZYjEm6bowGh9fQN/xgho7P4wHMSBxTI4HoSSdvogOIxVrsPln1gJ/b1VUnSC6kzyjJU3r7/lPh2U3yS55Sng3Hkbr4mSOnUpwV432NjqF+YIWS/kAAQ5TT1fOEL4KBXR31HQ3tLlmymrxwHUhBS+pKxFxrQ+mN1Qu5rOIFfz+Lme7bxz9pzqnrK3jdUPifBQf1eDHfpeLhBcnY+d/GCemyLcnxFL4w5XFNkzcqj4PgD9CGRFUuMVLisSxkW3DpWfsNzr6JxDUyJxUbZ9BRkbiwJdprNq2swNQlfz7ISKwiFySF9ktPqbU1K1L8aGEkwWveC5K8KAbllcIgYUzE8/qf8etOU/cUHOikAuaZ3L39RCgoefUbEOm+OY7P8OlWE/fFIpjOhOcyttbYOAnaIWDU046Gk9lmbprP4/O3kwLbWGiUYmfsPX/WrD0S2gqzr00TImNxGtU+ncaMMXYmh22PoVhh6GUP9Y7f8MU1o8djgwRaDEDHWf8SwP0Yye2nP2oEAJWPOU8/8QJP2A/1CmSDWOzHNf5aTcAHiLQvVP53NXyOKxBavGoOPrFr8S38UwuflmRAj59QnaNtVCVKbQWDCqMnQpPj94/mblhJ5f/MCSjkgwb5/PX8zo8n4mhrgLgro8uen9Yzc/WSO57BXgnpZqXHPxTaJnbWp+J5RzNt3b0rWTh8grR98pCP5jW/ZB9DJ3j3Keir33Pn1JqvK7KxyCXXTP/alcBHd2ls/vzqfH8rvZ3R4VMvZ2l4wwexWl6a/xTN2Go9JxbuU4M+mxHL/pul0SbYnhFNJnTiIJ6D5QgK6Km1dh2ZWn7pm9qwtb5BGktaQ0e8YIIfPU3iJwI460OzF7MKfmrZ2S/jW8xvexbSnro+EFtzc+yRHQPpfyFTQM8UijJ5FIz6n+06USjH4Odhet3gwaEket+xkI01JiOXhjTh6gYncgWh84fmgqCFWJ/hdPBxDq9jD5LdPwAQPWrUr3ffIuvrlYqrSHboyBswh9jvyNc/0M/bN+o56YEe+UVs/7/gtbv7qJDxbaOCNLUf+8wnl6zkMxLn3xGuEERsYNSTBytxYv6oXJxgfmr6XVjlhM8H7FqN9ABMkQ8zNCdyHFu8Va6qT0pAZsvAgahoadcozdkXvK76dTuRXKnzyMOzxwpBIiyRgTLLvMZ4ynfc4b9+BJn1J5te8j8m7F0j3CkJxQEFe+lBsyoL4/WkJSfZjzSoamjrDAGHvHXqDgltOrj5g3eZ/vXb/gjUag6O193vr969gNvmwL2ZqokCUUzb4yvctcNboOW/A5mT60seDXBtWEHCxchQ0Z0eBY9koqC0VBRFDtH3SvN8UUqL+ogeJlvvjyLIKAHIrIMYceD3h+/XX4MBfnJEegSTbP07fX9RFSja9k0A/z7SC2rES3DzXdXW6Zbo9ugpZHoE/QDdU9t+Onf4P7pytBQU/rvZ9ZZr1TpRXg52+c7YWFPx+jPO6S7SLqyWvplytdrXGVfHKt+hCv8dBPySrLrAHa9E+EPO9oyFvSO4GdYmWKcRJvupV8/wP/pjbcIE9+Is2AjDMCeGK21ValvDXduSAZ14Jf6iXHfbf5PaBTEKzP5+EP8xLNpluIvmWV2OY71Oc0rRXCe+Fxm0D8bUARcMZCdZT7FCXlTvqh0CjC8HKMhDImyHg1ZBpxn5/CFZo+8MxtwkAHGtO+O+/p4qGKVQj4dqd9RcX8A8zKDm0uJrOsI1Wyr0ycPQ/hM3PyUhntxtvny/ipbb8rgd/7IpvhfgcS3+atsACVVRBZUicOXOAFmKxPE+Fn7uwY1UOa4bIBDbpBTcyAPqLX3iA3I6O06+kaJUQCOSZcFZIYmrwJf2JrPbFolXySWDxB9tdElPwpXkhbMSk4/EGbg7nWyskFmYmv9h5jclts/3dD3tqfUq0eWB+zGkAAu9bGy2SWyVxydO0q6t7FU0XEpjuQ+eQjIUTPWi04Hecfq+6ZKHzLENbot0tv8/PhfC9Rfc2D9PgfraALtxoMA6HHn0gWA5hvyiFy46jM3LZk97bzOV4wE3ZLDXNET+/CJuNUVkpMVSMWyY/dfvItGXssbYRyW6PRyfKIl8wDVUukJG9OeMQ0tpYdoNPiezI4k5T1S6AfEqoCXGX2Mw+WRJz19iGi2lZ509gqODtNaElKPMtzLCrZIybi3eojIIOw3gtpIsdliXzzZzXXspTR/LFK+mhk7oDXghllfNt1nszD6nYMvw9ZSKf4aun08cz7+SqpRn23EuFIRvvq87fa3KVztbaDjObi7FEMheIUb8cNxiDofaWj8osjUFqesSw06K2wBOOOuc0dpKZu6QWl6HaZ0U9PWDDF5ThDXaTkrCJjbOfarMG1d9D8hZpXWQP6Mva3pkWJoFvTUS8N7ctagRaluCmAPYj7HlbIiGkfJtLHfDHDGBrdm/hIjCX4ONLvX+Sg66UcGnu76jdyXaR7TjkeWdwgLu7ZYIa9e64sqrcYxG9Elskg4PnqVsTwqUVBrNKCSmY+muDZMIy8NR3et7InDUqtwao6uJettTJGwOP6kHYnWpRXakt1ufTQIfFw7U8tI1kJn7NeG/vz/LSRFtwK8HGp5IH2aGSiHdWjElnL44rNQ4cyxbfCtqLdzQfM1xZV+XUFY2JYL9xzz17mbEYs95rINyUttm1FIZZp+rRhMWrlJ+Sxb8+rAaJLHYLvydyg9gKs9Hu1awlKjhyIkyhlyoFiIs2zLe1nBLgRLCA0XD3T3UWXtD1N++iCEpheDwgpCuKl+Pug2117wA9yXTzd2ZJeeLZF/26aFEZv0svCmCKWarMlVR+pBAr8NVw4sh53JENGOJ+PUqDleEYCfThyNxvVcgk9kcNty6kbzMNF+h0pawwF3Ou198d6WzIqpqTTQuVJmKnTSB3fW3l+Furo/le/fcBLJLhG19focW7V7vcRz7+OYcd8h/nL9Xb2b3WrhwuUNFEt/3ZmzI5nP1/fw4nRN7k8m4C71tR0/rVJr0+IenVCVpWsHZWinCWmHnL00LJ/7ARAD1uMs9w7f9iZDqI+zqC+kTiUI6J6aE9I+aDo2emVy4LhkyCoGZRfvWHklj3ttL2lZQ+ZM2q+EXsJ+ZHUEoajCdFo/vKPDuy40BqdUkRU8b8QG1iKvLFD/TInlHPtHrc9Q9kwJRjfWDPuql4shpuLhVM26zVMMCSx8lJ5bajkmRk2GOQ5Dayk7T7oFLJRNsu7KkEzMEMpIWIKjSTC6KeaSI0YxEQ+K3EQMaQ5AwL55Gg7SxbcTiPiCTu88iVAgPl+ljQsFFVkMQeIXrbfTVe6AhE24SatZTUhttlW7SUwV8g5k7IYE4W5VVgUmbbL/HzYfmutdtj5AG75yBzgpyNdCTXLjJqkg52YnjhePLkUzFUKJKat1Et1jJv0Ql7vOypGboMgBQpU2vEWVP7zZaVIkHXVkqbz4lHeYiKxoylVwvvB58JjPUES67oiI5VvN709pzRWuIrL5cca/9FePN3Fzij9/XUfAYg0k4AF0I/5VlbH6pEkCx3Ylz6LUs8P2Pbu/OF+AOuP2eIjYNNu1b2zWBLvhDNX2XzUHeHA3jF0U8FYpoCk5+S9OqfCQJyYeJYbfzvk1XZc8X8Kvf5NIsPzmdyhuxUWduFzisXiaOrRfGh9fafWpJskylmOmE8kTAn/5qP95Kc0djX8XudgVYh6Uw3mlLfHIWNnK6H6O57nfWnK6NPEuUBuawv9vsmzvJ63WPcxCGKdKQKq23tz4FV5Zw0LvSk/f3nc0TdjniRRxXeSsVDp8g240xqVkjf8Vl3H+XFMRxiTlmqEasItvPIOep4NE7ZDqHXWP98tQP9FXVW+3BkA7Yn4nqY2nItkufOT1xWgw8bdzxg/Ekt7rMl3Z+2h70te/t5V39oX6zOj6YX1L4+efGoifd3X1l16TRbm1b/EkA/aVr4minKKqRbCLj8EJN92iD9cqNu9SVCIp5PsCCdTlAob+mQXqkmQ8fdsu4ZMeTDC/DfobewJvwpeHOUfJ8fx/NnIoL/Yr4HrC/uJvKBVwlx/6uENPv8HXoOw6GEFvt55hQCvCgBMoVLeE2E/PrYO9ZeUqMAMbrML45/xKCArkDIoLJXRxrUg0dujaqgs/Yq3VbH9ZDYYOB8RBDqHpTNAdDg+RzAncq1Zn6tJx0zQKZ4dKZARPPObk92qVR4koSPhLRWmtED27+EpMNLG+ZtAbOs8rOOStDcPx10/RqiMzkQrS+JCGvz/ROR9De4sI2flUpM9KXazpLWaTudkwPtcPWoY5LUc3r5Z6fSD1yIjqiaaXzdoZwMeNQfm/mrKi/qRNz0HtXbcoN/TKt1GRhmvpkdB5q5GGg0Z2c8fteiRFWyFTEU4mitcJAYpVNqH3kwVVsfkRZPnNN2EJhT3bopfodXbw8VpxPaxlJP8Ch20lhkXsvhQ+W5n3/FvJZ796eo+NicnVuzT0dO4FC937zlW3/AYrfUTd58OxwdzREdb8wdFH1Xa5GoHT8Ni1e27+whq9pjgPuJTowpg3Jdu9HP+G6H+d01ToKdFJ/DGbBBi/CVFHA4A/bWxYGbQHt6A19NiU5oBlkUrcnaWMOMKbfvY/oLNkRlI/ywf2aBBdLjAC1uGwDSPMD2PRp7EHch0k/u+Xjyg912+ci7QO3g0wjWJoFNWjKft6Yx99Z9N0nTeF1nAalOKT11meQgqcHhI+FsJPpEaVdrOXUREgufgyCh8zXu9zkY5PYqB4gQ00sUIfw/dFLMJ11TJBQ0ok+G/CM9wvPQoJJUGAJQbifP5hLh5iqhwfozrqGzYg1Jz+5PZkc7pp9CIU15zyOP5h+BdrKpyfEehXLtYQPh2raD245vaGOW/FNbdNBwjYeWYY4/WhlWfN3snBeIB8tZZjPM+GR1nPnpJnaD2Tzz9XgxBh8IKmPfbLFEgxnttvCMBDLPxHUaInDNYNloWxGqOWZ7+fsj1HPLIa2tykpphjs4VGAO8RpaPoGViY2UQXEhh6/7cyQCLg60wPYuGCY2RF8eJvh0GRbeytZECzlF+uABX/DQm+zrgvJ2ub9k6yzeWhhivfu2IPr2C6b5+snPvxzdFv1n808pgJ3++rUg8TmIoqv+MeExyvOGUxEo9NkDODc27StuWUc7SkMAWJ+ImKTh6R7ak38Wd8cuPLomQYwFUrvsq3euqZrOJY0m1oF32Gq8pL5bHQDbdOuVrF/BJEQHQ2/CdevyNZRyMl7eUt7muyuRVxx9FeKyn3VTlX+cWtdaUGoztK6mEjWp16qKKhGiZx2RY5DWXQYVn+YGhYnrZzXpi5e5sZLwyzt7lyt7+QiYCH1OZp717kGVVCbDetDJPKxXBn46d3vuzenVMeDyMtfad2XBcXRPl3FC2Fdg4dXIYw1M8HuISJvqnfuID2vdYTyuyOZf4N7QLkycWHeJ/Q0Q4k3nQxlG9YuyvBtmAnDt7Y8T9aiPNThmwXeIQ52QthT/At+/cvSvHHysrc3uNQc7btH2M8tGrK3vjMOyGCGtWYWai3u6wb5NsNWaK6Iqmh91Ck6OTshnGqEe+thB/TKb09ibhDhzo1/42rHkWhE5tYnqkzUCYzjYFYaAReD+GtMR0qC7Ctw3zZJFYHqh6wMjMeRUw7zhQHOoowBriPxRzOlk0zSEza+7ronvs/RUKCEeoVYQwGNqGF9CyFSRKCROqvDRBLWBTaYNkBN9neK2j4yTgtr4WjAocLGxthMKIusoIZ15SPiUhtRG13oVBwB4VgBqA26mMIi4epNxNHyOzqMluwwsYoQ+q/jTgkc9ygFp+c8opLoeMSINLRfw9kVBTrPyBrsptj0O7M+aKZbvoO0PALvznpZWvcAQfVP31MLpVxrwrkjaThKLMQDedPX0+6eqPeMIjTq+xbmdZaXK6nuFG3BHuLzkN9a8YdnADFZEgEMqdaqdZI4heLvVM9itbu8HlpQVdzI/i2ReRWpK/IwAPRi93kQpcsE9IhMM6/dnf9fkwAp4JfloD6yY1REiyxuwN6HCbkz/UbTYpjuTa1xE7/vIQ8ATt2niK5SZr55vuYtO02oMRM0+mGyU66cyOMZ6s3MxsHMiuIx9w+036fbUL2knzVapvkTnklljy1HagPgCx6olwmRNhfpKQ8xMnNbDW4O78v07hc0cZZ4w5ATIzHIwrDZUjQu/cBPN5WsUoFRI+QSRumnygwTSbcvNFjfnXyodRJetQUOeJ1bqD9OG52o4HVE4OCjeWiNzv8xfgi0vVuHean7TsFcg0q3WG36GFXtndWRMTtYlwf2fZ/nK+8STlRZEtr++PDDFZemk7EQCaG1WejhKniOQ1m0/f9meCqq54hy50v4mo5B/WrNv4t9sCbT5taxrtiywuSogUdD6ZVoAMSKubZBp5QKx2Knd/z8McAhoeFofKmX4k4uVNODW6ghKzc7Rz2FOCZ+M58LmyHZz4hkLX/AuIeZ+fsaUfc4nhVg596KznqWCKgoOmNtCjiJ8sIUPOaynz/NfPm9T4XqiJ2n7dafiuWkkFbAQqaUEQNXUAF6mBjnbZSG0Gk08+zkqzD2Hwhe4nLJZ96qH2YQBgAiFD62w31hhkhSCAaLLEIyul3f+5sXJcsdV5JqTKUDDb1yk4Fo+yHw3dIdSTerK674DrnLqvzRQ4gOgc6YUCtQqG1FyzovAjovpF+NREhevQNUAYF9Ty6JXFk1CHCmWVzy0e+gR54FhpKMmd/xA76CR8TaqYdfMarQ6DmiFysr6bMqPNHFFuzbOjkuIX+/QHRDqtAPW3/+TzULbPy4kMPdbLsFeZvJ00G7fQHauyuNbySrNJKLTRQPERiwtskzTi0JZo9hYPXHfnIAT5fQrRi84YxaH4EQWhS09glP6D5cIPYj/CXcm4nx+P8FJg+IvIkH4E0pJ3acsfmZUDwZvMZZNTRa3WNwGEmgcaa+ou5MrgK8IfD+AuTpamqOuuEnOc+vcFcp49RbxdHWQDEK5jpT6MhK5Txkzjsnu51TXmzhMYGQlSbjD3EiWPWaoPUws6ryhKqnH4AQO86ZXb8IaTcnE4OMemIZNt+bZmg9J3xVsjhtvS4zkGigzryD6yLFCbrSSUhTn1gNzyu2N5/wBN1FNFYwJ2C50A/VCsJlH50H8qhe9rBhTJihdkXAHSurWdqPnpYoKddfHkqoUDBnGQ73cnZ2LEPs2Rs6pmSYyvOCxKTAMPA/1UWC+gi0IPgV+uxryHxjZjobN+eaJkj+t3+B0DV+TUaBuEabhijx2r0J74k8t9qkwKceO1CxaYNkdYE8n29O5Y75/JilUvM5vKERjpvV2i8Ui2jQCotyY7wojS835NsAC/jRg/iWeYTIXTdKW/A/mOHFH+VQfDI/bt9qEYxyTMX+FJwqepdvIGhJ3alXMsYfW45hqcGKoPrCLj3qJPGK4e5XBDHV1OYQQzLkLdEbdiEsS6Mji42Bi0nTt54TebDOpIRnfG5NK6wylGvuQ/BDfaX52FN8hJqIt92TLkfEpBFVk5oO12j4hBYniLj4WCXBaF5vb32I6h+Qum0IO5+/m8ui7t4trXZFK8C/olsWwFM+dbXrE61qFwb/L0ubWTTmTullqzB4lnsoH8Xj4xj+oWAH0aXSY1AYZYWRyqmT71AMz6tCeKkVoxSarDJNkO9YquSwgSk8RnttWBaQnfUs4cvPyBrKLMQWzGZpYhx5jXBE5yLbfVflodBo2tN4ifETE4ubNi78/tl8CFCUJ8M0M8eFVsd0/yE2ifG57woANWNnw1D2QYgSn0j2U6u8wctFr9dZuque63veo0wUBQ483nOWakhlhFcRl0BWxpT/3VSS7o6EOhOE8e6pkAEzvXahyWAGfYCTtSFP7O7xRaOZNthbsC6AP9+N4s5sfVEuw8kH9282wWJCQtDyBmEeH+U1pQYrkO2ngIQOOPo35Of6B+Id62J7qTcx4fFzbBB8i6GTZUtmFch/1ApyWNyG/sIkUOX82pcJBTfEolP6tJVx8efcsMb/lKZ+UH3KpTwgp97EzcZZj8IoO1s1gieLuJCx3qheA04CaWHjWeRXdTmW+/X4yrxh5ktIgcbVgkZhegB4dGE6A+5HnGVTVSsMv+2fOMMJSpJNTQpbjTtODrsLLniQf5X5joFhOVxrnMLw2mGBu8t7XQ8ltNt+w/493//HOB1Nxoi9JfixjNntF9KAyo9ekW9gJpp9onkZ8qnTQPNpAVbvoJi8EmarphhZk+kurRDff6XSZdLZWs3g2QCjw1L24X298k3w7IeBGErnoEhZ75vSG1SwSSmkq96nfjGg9o2KB7vPO0AqeJiO/xh2PRAMXA6uexbBUFn4tjDYkgMJGyUc1nxnfoNCA7w1Jz2zxxe7P4zxdV01pMriVMXim7j/TNSpFj1EZi2MYZ2fD5T3uKbfd+VgYDDhPHvWNVPFQCjGbnTtc3pDV/3JKytH9pe9qK+/V0QffRexiLBN2zH6z5knSJF2LhEAd/CR/SvYgMusdC72eNTvWqDCealdOnhCtT31IlSbMfKhGzTZf5+5vnt4Qo4L3CDg/eG3Bs+QHHAHHJxUpnrTiTgH4jM5QekP6UYpUgQDp1yAbSOEyK/rrEE6uCEtM1hvdYgL+vk1hOwpPrw19LxehWSGCTpFZlfTTOVfmaDE3e1eVY0+ci9c/KU2fp/CRP6MVlQg0DeGxivFZVA73jfpz9KnZGPPpDkrG2xuMdnX2GnevGF9E6MmW5LD+CIwIif7z+FY9Z5EimLAsSdicIIe2v0iozrqticl8AFqKPRNhr/S2STDHwdgNoq1z+2iW/9SPCMgbQDTnUK+JvbuzZwKfZ7UP2Ce7yR3LeU0/q9Mb+u032rY9Ui+iiHqAq+Zbi24lmQ2T71nQMZMIGKchJ50tnc6Wy6mq3FV+4JdPl6TV9klf25ZfvkfHVGSKcu8ZJTTuzgOdSt1LzCv5crYv8Lh3+QkU+i7J64Y9SP1bRAHQAU6BFD6KGHeTDjucMK6qrOqGbc3Ei+uAW8I6AnAhk3poC+HZjy9Xx3sZ8uLplaDR+/C0EpSS0A7aOqGGR+Xp4AYKrGejPqFTKJxRcHOvoX496pdp8BESQN4RXXs93Fbpltdn9nzq6Ra9TPUP9F1bFhArRBlOu0BuDHUaMV1qpUmVUGiefyqnUUarKpNjBltJsuwkZDBqJTFF2v5J4v8iZlQ7lQIVUzBLk4pJkeRDs9tBqOV0pL8ewponrHJipoWlMiLswRQhBLEcRGvsmljKN/xSYOX7aM93/uFz7WbXxVnwWDBYA0RtxGrNkks7sX8nHi3LZTHRS83l2YsTHOPqwT18jQ+9j2xUFPAYvz5skH1fPIYTOBTaeZRsjiFiJg9osFYTVIu2xTE41fyJopdV0Ggl0veWmG75puBeDTnW4lgFW5vihoVmzB3pW2zO9jMZhRXzgW1aPx8YZidG0whH9LKIc2hSGZiWu7eNGnXqkZYgMZeTKdS/xsBvwcCzo5e4ca0s05Cg62hxOnU/Aml1SvWsDzSv6iGnU/86H/irPrDYFML/Akb6+D/WCOrPz1Ou1weBZfW9nmVzZvjHXKHFn0NPI3ZZfndIQqOskTNRDHFko6YulyJv5ZlC0zBMumZhX8EfWmjwPJbsmSVpemxOnBUa05k2x0GBJQLRfqleo/wJOXwBmwcsXCWVUHaT5quM1AH8QEf9vSKDOhfQBEIuVuNmOJU1esD8laFB2Gq1WZlebVpTm4l6tSHXqwF4y9f3vlhULqs9P+zLBsgF6cbsQjEjpitxyhlce6WF4vQaC4hQa54pay0P325w2Td0s0B2IL4zmKBnPdym39wxhrIxMXbWbEj2yInK5//QRgyXD6MfzyxyQWgtEMapgEXe3vpXCpTM7s54gaP3n1gAbY/vWw9DUS0HX1wOdyNQyubdC0x9dCgOUaqXxapPonFslPi1jQ12m6cyup4A99PE31O2KslZTVZkapNKWfABEJsEvjAMxMQaqC5ONlOEt5Qay6wx2kj0AGxK65Hqn1CjvfwxDVY3avK9bxeebpeedhr/kN9Mvk7xfFJDxi905F5vD2YZGLpwksGqtmcdLWLbZBZhqtD3HYjwu50Qj4juXHqylQ9os77Q6XZDZCLqD/o7Z8+vxaEjUvxymUy5I6ryjFiSFbcr0D70O3PaR8//Fr+6EIBV9vOSBABoErXu0Ux2t2vu7kC7HK8blJObY9fGCVaQ5/uHB74sYkA/edLbIpXdfckDUMfiwteau1+gkc/QnvUfGRd3jteHD7i4dwjWFSqyxtt5EtjfZprawl0vc9VnYIN/X6mvOhadhVideWhihdDnnyELH7qpBjjgKF78bkxWcIj50Ao9x5R3VWHLIpSfAuAFG2mYdUAdwN4R+HQAB0fgj6Pw9/+Dp4S7XL0gFsCmFpt2KTw4P3biatOyjbBZUGTDZoTJlS8nhRUiHCK21qIFC2rAvaGowAabe7J53HtQJHm7yUQLiccdX1YgeEVQhuMZ0RhuPqsANcxASdw6eNHoVkRYzeAihSEDSEJlYR1CXLZwtUIrYKoMcCAVBgoQCuwF24kwJXH14nsQVAiWq1EBtICEQC1hKAMPhCkHnwHqJ5gSNjDcWGigiIV4rgAEuLFQhZhFbGYfhS0xgN3A4ic+50hur4Qv1ZXrF3atALHHUTbVfiNm31gOxOOAKQm9g4+I2RkLJx6neM9K71leELOIRSF4UpwRal0eEbMf9CA8Eb9DaZv4DpbdQFb+yqEQsylqJ54OuGSljwgMywT1gciK3wgxwiMbmFmGfSPIAy5ZqYwyg2WGqibkBX8gVLl8IWZLVEbIGz6T0JohImaP2M+IfIs/EKrB/4hZiX1C9IZfEKo3HNgSHOMWewr6BrXHBxjoBXxCzN6w7wV9z8WVXmNwMF3QU/AaRyxnxGs9YjklXrsRy4Th1QkRCj//TPw+pU8vI/rjy48c91+5/IXtxy3b6+Nc3dvzn69P+NnLKfkGh5YvXm5xoBxymXBQ+pXmPb+v+Z9XL/hdaZrmO/yGbr36hV+ZM68esa/pJs0bnI785tUWp0RJrhJOSgmKJ4wr/qSuwLiwud7mrIvrblbepXmRQopdrqGgLCUcInqcZg0kkg8zikKO0+M24JjmsECRhdpkoIiC65ilVEeDfYBCPX6YdnSxKA9QdExogGPXNzAC28nQuUBGjQHE3ZprllDUPeoTBSJXN+Y94bqXWzPZ9P3BoY7mYoNR6T3sfSvIKRkhZ5S0m5DTvV7B0WNbHAVaufUGcRz3HLAJj7AP0MGsCQwIhrpH80QeNQaEB6iqm2LThDSADHoF9xY2SAwILMtvUzujKIIdFI1o6pMSAjYJFAErpZAKOziKdQbbkyUf0/kBCvW0AoNYyrdFcyQXYZNAVIYTEZoArM46rGALKGpHc+mCMblI0sc7j8c+hV0gg1qAKOQKDkVMyPfJkNOU0BR+WawaWdJZQoQRyu5yrrpdzg18cSSkldueVG5ETXsQrSuDX6PJmyIkjm07cuUpzZDbp2c7ZKb/SZoltIOEMhaw95uiAxo3KLIjx6t2vQ8SEAwkeLIreFIwwiZB44YQF0eDW8cC9UDt3AAll/C2ThTOXBQk7tmLkvxYFEN9AydFi8JWeOxh4JjeCeqvEKH2R5rZNR125WyEm2lWCruvw21j6GXkniuKFQsIKzdiLiUzq0ChDT+384vLc5DB8xQTbHZqAZHXe80StpOLcZWk7U3xeCz9HqbE8tygplWJnZy7rrLXqbPbXhs/MbQycH87Z3LxQRMWKFM71K3YiaLUy8GY7ZbUx7YcHOs5Tfz7uP/Dgc6dP/DX9D59nGJvSs7Lp+GnGEZO9ika7uJYcFGKoaVMIL7eid5N2OaQuW8D8G+3NJBMYrYShUOYypIQ9k+AcsL3raB5gToeuOehaprYEiPDV/t9JdjII7CHKo/KBji+9hwCeIFd2dEAMY/Ur+C2YTkbUbB03GCCQorJZDLrt+EkSZg3LN2uSa+ebt4oxZuEuc693lvg8qBXjsDrpDDkiwJCDm+/x6UrJb3dOxK4nZDx1zKRhbYCKKJkL8e7xOxyPOnTIY3n4IIg33dV3mp3GD2+W1QmSmAh/ZtEbNbBHXgroWiHLKZMLTgZhQQASegZUDRB/h4ngcjBUAqe3k6GUubJ/v1VhA1yRjEirqCQWdiFVA711gt5e6WvTYcEJrPEzJwMIsvLIb1jKd89A10tRDcxeVFCjvbdeWbAepwN53Skqo6fJA2QEeDHjQLrRAmCg0oTt618tKj/HYvHYULixOBHpwaOfwpBwu4GZgN5iD0UcCSwQo8O3IcRUJTfFovAACjiT4qrSx9LYIFCJJDmr8BMWB2oShVqqxN0CD/DwOV1XwB8A9RlcpNGULYe+6TW8vYC/teoWaREFWINRSO7SmaRApClA4MNrTDvU/LaAQ0U6kguQgfm9CZdpxboAaoRyvCCllJvhD8BM2X0JsdMGZ0U57TwSvhz4Eqf2FPhHZP/M+EN3eI9PP1qxJpOFtVRI47T2NCvCLVGGtd7SqmBwxEJYRK/ckzy1QXpmIDjLIdbslyIwsHK/HtQ6jtPjtOkixOK7j/DkqBHB21IgJ8zmF9Y/dh1J/dhcnEUqGaBXTUDwItayDVNfJv+F0gwxw5YmwBUuUOBFgpcABELwB4qgmFpgIkvzTmfM53PfkDENtP6BcBECSw3ITud7LqvGtuBIllMfGd1+O+dOESqqhwmlbRlUesL1c8qx0mbKLVb8CbdkqvEPNKdmWz29VUZu7NFMANEHeaKdgTxnuhl7vWtN2of0xT6/OpkNJZwvVETCRI6seH327WyTzm4iP78O71oLTp0IFEwVdhQJuYkMHB8Zo4E3lYyIwIFnY6D0GYaFCTp/E200JnXfSFL3J40jNsARTkaxNEVGDsyOU5QQDedzdMOBHRtBjR1JvzYlFXP9fZt2hGu0x7bA0g98JTECdjHZiLDfIc7c7wyze1xG6JWMQFxLcARr7EIhKBBqIWJ4gkyFJh6BAnnKyGzccdb4vS9jAHfnr0oXOpmN2gqI37nkSgnphd0oK0E2iUn+RIkRFP0Dsa5a9G0JZhAYCLlz8ZTspNBQeBGZMNgZuy5ElvHSTllGg/B55JIOE+Xa4rZyRQKkXp70thuue54vknsrqUdr1OxxWhJUzM6Pec/3eLXG/HW050Ni+DW+7yLvXZXw/RusXAkZezADOAHqJnTicJRQlwwtEyUpr8ip2baZsyZ2yMQ952HBZXc+8IImnCGU5x3nXTDwTTRkE67fQbTYBhTaFzPsFhdiVV3SBnx1GhjmkJdRPqtWetgEwV3cVpoIULBQBNw4+8NAWsTX2ejMGDvDx+rWEBO1TnRkHOi9j7p4acrSyYwwsUPIybZ6cnzt0cSsJw60JHdiGC7j0eTuG0scVS8nz8D7PXnzwA8ANNiGly4AjoNXRfLJFnrkCyrxRFx8H4SEy4544m8Qjzw5jDhWN6X+W1Ss58ECxRFLPjgztA8pYSjmPyb1RMlPTFkDSaQP8jVo5OtuSjzV1LRi1ngcx3KjS+oL0e24us+xc6u+6kzbisB/8/S4c83w8vVlC5l4ULtP1yosS2sDjlJVw0xrAu0bk4jGjtrx7iMoKDtniMjnQmV5ypJ9VjMPBr0JJKWEGP/KzkvQCSomEt3Qx34o6LBekYfmSAKg5+MDBGtri/7AG+htorsbNLLKkuuMjbBBJ3aTsSx2GFhYgNYDmWnF8AF4wsqH660k0d0JPZ4t7ClwD41Fb6GsnpaQW+C8l5Nh5CRggiUkqgX4/p2ZlIds3FshsNG1XvY+Whir1nS/7uGDJ9GrurKycTUIvQPNaRSh0h0tMBxqSeGqrMsiLrDTcFNBYWUwhnAaN7Be3oMVXmF89ZidW/iLnkuymJfzdvQ1ncxdOJkevxrfe8djgN6VTeGIz7Z510FfNDmRz5VTm42p9277756T2w0BIKf1+6ku8sGLs1ok+5IOHbDJDc6at0Dkw0/ZiXQdUJKcmfjifw92ypOc5IQ1kwagzhl7TheeGcjlwSM5SXEmomSGlY6gd0nwRBQk4HBuTX0OKR/NzTLlMXyD+3s8aL7BeHdNNKu2K9kD5s9y8G0o+nOXAeD2jT8ng3Hj226VprTsYsINBJjl5eGXib/hT/7Jr+vShKzr81TH29wLUWzSnfrXxNIF4sqjHDKhwkGlbFgCm8CsvO0OG90llxcTSaTiSRLR9UbCsLH6M9br4UqZAJWiQGw1/syJVxEtkPi1kxgb5XRXEuGxbk7n+c7f76axjF0YKjTGrGHOk7KiDseObySBKhpHXAhGHHzgLdSc+QRIAzHDs/KEax2ElvFib5zhhrVqwsJSRXHHKc/voDyWjHUmbt/YWSyigUvVHuolEgEERQzltEN1joVyo94PDVBrerOFYZExlDksIReFLOkX8+EFqIPiUZXxQIOpytGiTSqol5L2UX48zJ1QRdfEln63O6ljxOqs3UIiVVFrjqxTM0B5P7G12bC15lzEzTjvAi1r02Ycw0M6bYxqh8ZGrtQS2dc078eIxjCgvUi3k8FOJHXsSznOctX12aCdIuCXd2dU9xey2YHWsmNq3IFoozzmMnkGxfpetGCHZx8rbAPaW+LC/BBnmsDRjCo1N04Eoo1EyjgKLjNfZ0u+i41cWo4vaMJHX8ho3rs2rX954TvU+VzBa53Ei0ycU4VfkDqqXxqQrHpej4pthWppXbCAJJr4VLbiktReuBsZSyX831HrcyYdcRBJlwpsB2ywKjWChblzHdygqCieHOFnTkcLXQV4ChXNKk1NKqqLqx7CSpAaGprFtmFAtEPL4CmvtFsTk3QPfyxX8qHgjeLFu0gUJQS8iPpVn8c0p3BXXZ9ymkZUXCGk5U47ZDHecNybIFHODOBh3S8MHXMhp0SFUr+HsUCToXzNAcs6nG1FRKodQZyDV2rxlbuytLFUbnRgDAuvXYmA3TTKgiZu0s4xEBW0UYAKkqMMKlecngYZxWqFeyWoIJp713EOASCxVQQsKMiixcOqoa04SBRIPa64HP92WLtKHQAThO0e9r9VrTYUQRmlCdEhSFm5WQpuN4vioStgtN10XhXYBfAqJWY8yJ+970KRQsDQdQhIYx1BIMX0+UORmIHBu+owkNI7e3CblwiqoJXnF/JZHd3E0n45/P+nAbBh3JnCuM3pKsQr6MOtvhPSJrE+zuDOG7M0S1OpiQ80VGAlc/fryel9ttc5nnfgNVZQOP2ZDgEhFaEAVaub0SJU62Dacnrsv8yN4YkGBDycTmWD+sIRoEnJYGabvWYt6ZHxnrdr/DWdX1npn6cY4GCqhmNGa9AhiJz2ixIbi06qUkyA7idcNF7aBWxS6PxrZCzAxSoMGn9H61AX958p+TfY0+JmfBt98UWLGtlMUKELB7hzeWKuv47w2IXwVadXkxryn9aKsxdRzeHucRjdNvNWszGrIcDe3vTV8DN3UkY0urBYXHZnXcqgbHd00hEodoh05YZtgvSoNrM81HYoCsUz2Ond1PbHBWEWKG1eckpBhFUSdgFOoB+kKoZ0FAnQI5AxeV4kn+0cqLPFuE0hiZa7Ni1yJgyQ3XI62LI1IYJCe/FrMkTNSJAL0QCQ5Aj0LK61UQECNZ1CgookcKL4SiX2QeoWTyA6iZHxxGousboxECWV6oDhchZLyHS0S/E6gfwonFiClyHL8BmvLIGRveYLfp0RoBMo7MUKRyHi79Z/ayTnwn2mYobAciLO4tyya4LgZNSYV6Rz4m0DTVcBQ4omQALlLzN0/MpDGm9R51giFNm0vVf7H911o0qOdJiKZJpiGB8T54DiiU0xqMST+7yNIDaEJgPMLIpMDar7c7POEUCo/fbmpijgUgfkQk4B+MLcjlhLjbIkyWiKirBh1h5tNc0z0aYP+ioBio0EO8BY/7/5xsgxtDzQoCXOMQqtKo8gL9CYAaUu10KnaFy1XGMaxULB7UUDc22gahaoyi1NaYcssFGZJOxywLhgwc5iryO50ScF3iEZUwVvKwWuDgkohqtJfJQ1WFtZFMkbZQySUZli23aAmKLFLb/ebpb55ChllO2quzMu8PYdc6QuwgmHy4JJu/91y67ICzxoBlnj2TEy7ASbYAGg0sIGrhl13uhgPlk40xToWvgxusH0FiNNfh9BNOwgx0YT9FYoASSjwq0V6Y17eVycJs0jJcY5/nbSZfvqeBo5dPM3XF6wEz5PeIEuzjeu0pZeB8bAcvRCcySkymeFlKtJxeSzM3X5suV5HUmDJDuxThzRCGWsEwInUwGOVdtdgnwj7i51xoDQv2lkrjTkmKWi8JBkoZIJFeGyePbFXEu5h0oV2rcufRIJpugcjwZ5krB22Blg6EV9JuL8NPUXUqt4Tbb91x2wneJRNLQQ0k+0U0UxtrSbo7Tq6lBD8bkzhAMy3A9K95W3OX6WmizqEjq2DsuC7m833n0SmPAW54oYM/CHrFjGAEjvgEkEDnSyGlixiOMLxR4FdtoqB2Hm3MzARwvI7S+wsVMiBIKXOAcH8SHIGzMr09fH5PVeKdDt65p3Fvq0OWhB7htmlsiWeyXr5UePgYJ91+47MU2Kf3CuXgFjw7wLAtsMbFG0jRMwgSWLjf3AeG0L99TzC69fzaR5r3kAgJqpo6oFfFr7a5Esb7qBmAZF8BULIN6N4YUcCu3ULxFcCzNa959goVX2YjkwyNHxZ+uIWAlWaeOss1o2MNNTk9WQothRLDgGA/L8xRB/R1RDIV+LulIclzKFp2GrZY39HBST57Jh3expJHTk4XJ/le/W3aKqZP9Cg20cU68JBzyvBLSH6j6572j3T3n7sqvMTxFVMVm7bc8cw5GZhao6+BIlTXFuv2208Ez3kEafAJVrM7EJBjwB78HLYti3mzUPPTso5MvKZ+grznArzki5J1HR94wah569NH/D1V46CnljaP5oV9+Ru221D7m00x9rNyvEVaYqN1mX1yVtxLiJokJWFsn88V3M1WVzE2dWXT8Nf+P35XQDRHJy62i4knzzT2TQ0ILVYp64XxofJ4nIXHUeNfHIhpilrKuxRdHVbdJF7W2xXYhOi3C6KiE85DAPUrRr6e55g5QkNzz7Vudztx2HckF9huXoK9C5auEf9fg98LvrgpJzP7OTRmwN75s0gYDySd/flvcEqzJ8EHIjZpKwaaXAHu3eE1RCfd7PPL5pnPs4GRVBVyareXuXco5v8UTkgq3JpUO39FkMmvabbg3fLmXhjtl8SZuLWfSBJdjb+sitGedPPSqz24aUqvrSVxdDN8dC89xv/BkVjsbguKltNSjAy4ivC3f+MXtt+leWV4TIrS5X+gH3ZzUiQlmpM6W26V4rH1cJin4ZVRr8IoeJ4URE7W+Nm0mSoJPXbDppTJaiYypl8EHUp8FHbQz5B/SdGXwUeLggXHXRl/veaTY2Gz+HxETTntV/7X6sun4m674HyYzcXQ09CesEz4M61Sq0iZ9Sbe/Czl7hkXt2Ol+rXNpWN2D+DRTwtA2Sggn7sPu19RLeJ/79wzuq1gg7QmkJOg0GkYXRll6wXwPFNPgJU95d0jv7fr/tfqxfwWDc9pgMfWkMlp74GeF7KtyaCZ+mBHvXgRqTdjdIC1LGItOarmAVSaB5Ji5vbtc5Evnm8gIl8dlDAmqdmgCNg/Vj0ScKceb9b0inPnnF7w+UGdgTf/pkK8J7JAOi7rLZNy9N5MiEMc6wCEpz/4SF54Q2Oth2/224kFpPfn4XDFZi826GyF2Ky3n23GnHr+Kq/hwBd6rxd+iPXdy/CXi38ZOOXP8XKvaVe37UuUWaXuvJnm7q5A42OU6XDP8fQN1LXtYOp+DKMS+oOkJwK1jI1fOsYCS/KlKkfz4FPmv3DB06CCKU2XJpaERvJ4vNpiDD+Ekt2NkYI+9N8WJXH2bvvI+qYDuJuk8TuRJpLOSxr3pes1HQ6cNxBZovVdCMeZiSX1E2wIq/+WkkPdCFkI4A1/vrAU67fceg90CcHhAvIcgpnxeojy9DCMbEltAEU/vex1VFwejW8XH/XKPlS/vP/x1kHgrsCZ9AIU5zEtufb9vpVPN7/N//scHBtJg/S+zUAtMlkWJoFynLHVeuUlyE2EVT4iI8iAJZjzd6df+ls2pCa2b/H6Yere0kAg4dv8Ok0oXRkDJrofQsa70eqtgMsTT7N4+x/erKOb31haJkWk0StSmZJfrq5sQeVUel+Hw4HQseQ+Jqrz0I9CLLwwuNPXW7502n+6P+etiwyJIpdnYn8JJqNYtXf+FkpoKYMjx5Z1pWzhF/ncYy8iE8iTSGXp5XJYOHeJpK1nRi7z0J8Fa10KeJjYdJvIIx+zb1a8/56F8/yS4LkY1Fq0tJTAKjxS+/87D09LoUTjoZESuz+/ddB3lxCKPFB3HQ9Lux0Aw6Hn82n8P4bAqx3DhDn0wqnKjB9W2mOTNaPgXESwGvs4Vzu8UZ/QABbsAXWOLSdBpsVEX75CM+Ja+IPUHgHYMVkvvWwJr7i91itwiX5voXJCjaaOwiaNwSaf69kbWB7JYGGSnO6PNk0dhzP2Orhxa0VMTUhkLAKzJxQMaN+iYI7QPl6TbsKbR9Xls61+AssvZCqKz/NbZHnFM/Qn1vMLfrklEvn6hQLLefGJpIa6e1zdcSMmVLvT3JpLa5jQ/gUMeanZXiBan7apJTqbDEfw+7p9Hms9of6/Y83FYfhakH8BrCVxsHyzuCzkc7f03wtsxwJYHrW9gYB5kSOxhGJJGyBdidYigcWPHwEZN6rQ8lwExN0BI4BQn2gNI569M2OLqwNvpSK9g74ByEhOQsMV0bjp2v2CFDgQRW4KBrImA6cCK+BIoAayhLbCsb9TYAYGA7vPu7ZCwoblPVEv3Lvb18O3Qf8Hp0fEtfa0dDbam4YlHSJYsFhAM7cy8VbzMZ/BMjsv7BiMjbLgdoIcGPpIAfM5ZR/OaP57sB1PtT8+HwJl3MIYaQlyXNn3ER4gAPGDwbiwAag/bHzMHsRpF8cVVfvnDcAeQ2/TfAbgM8IhBfuq6Jt6Zm2JLcPOfK0R+nFA2BmSJXuMjtPsrc7ybT35l5d2thZVyMm0rJE4sGIh2xAE6BFXsTj7atqbHFVLIKCZqyTU20FrFjiQd1kzhUfFlxF+oV1gdRm2TFQpbPkfjnUeUy/5+B2WeArIxDNEa+DO2weHXA+Npyt0NIO3A4ZATmKu1FLXCxJ8qp/Jc7/c4Czuc5dLrEQWiuF7TGlixNXUIBrrNhcBCqeQnhPnEZqTdTl+KBRCri+7vrKJiPifUVpILSnNL4rDFC3xIfqNqGAm6b9OG2BSSruvQKIWSQfBbon9uEMk/Uuub42UIp20zuN/Vc947UQ7d+gQZrHMNb/w5+T1QrM66TWUC7VfzM4QH8zWQi3vNjIgzPIBPVzM65pNcF4u5P7lo7FkRyyeE59M6ebxihfisyzdg3ratmOAUDCyCgIk3EyQNLuEBLWxrSxzTi/Pp/FEBAt+saXPxTBuwv8qLTHy/UM5jBN9Spz9Hl8KF1rmFoPtGpYR66RCa8oor5GyEfPDKNpGX97IYmvmp66KfVx2dkh9LXgp5i1JqWXIXXjYlzy91ORTdlzR0N1OkD0x6d+PXsBC3/2ckZHJYlIvTgXyNDw+ykONHxIklvfXxPWacsDR8ZdXn7bSsecxqd/AaRAtu0EY4BGKiq2WiUWWI6HKHX3vZ3cjUMRU0B1OM14Lxfiw/xOvKC7Lk0gwO9bz84OL7wNolFO7WRL3Ci+nay2+raj/YkzGyt9bXz+U52ufN4fqI/owv8hyQkul8vqXipjHveffJERWj0K2xrgEYWeGMeHmCHmD1VA3+taZEMaGFgUW5s6GVHSIG9FYcL3zOSzOHyHJnaE/YxerGoskeCqm+JQ3fOW0HUOb1WFbdytadRk/vd5tYBR1sGidQEwU/p22U+2sj9yBZ/dLAbgLOypcSfToFz/j8gciq7vBWR/h+M9rb55dxnC5gQKwFx+UGtmXDczvhIivDNPfw2mBBMuvLk9LVCFc7AlonPM205lXu0U74OosGAzIUez2qXt6zcX7nSbnXKUOvp5koEF/QwzyArTexDi8c8QZwZL2B4uUc7Lr7dWz4dk1crx2sFK3L+NgmLTPz2cCYVitHWAyMsZwj2eIG9rze/29oBHrA+Zr2QXx+e+tCC60QgqWIsQ2OY127sixApyF470nKhhryQA72Q3OTjcJ85hB1YCSJgfbaCiJktiSRYIVyFTTYVt5CDSXMuSe0/Kr3FZU8ia7R/VZl2A5iQW+xfd2Rkk34LNXjL+hSTgXwtpbdDcwPqB06IA+g3dM4jNJhrDJ3RdeFJT1s8W1xJWBNNKj37KjVLZ4ymSHORUkkKKfIB1ZI/ODVtzS1JCqzP0VO858KNOsOM25JEFtQO3ggjx0WtWZ0agFFvgClRLhL2oPKWIhh6cCISyJUcCxsMc0kzYauCtPJ3Ad4s9UOUV7pOJcRSr5Jj0XY/xCv6B50l3lKEYnXvbndOKd6iBeTUeEpSqfUyZ2vgg74td930A4Ki+atZzmaOmNi7iLKvKG7AYdgQkLk6/3GMdlQL7s8kNzKLqDM+e/uY4cCbYlK5QRZpqicW5kuNq7Gmo1h0+xjDpMEvPNcw+EuXmMHbRbldQzE6noronQls25dZGhE+4Ogy7euFcnyVtoS9lZRRX1gbJLOvKrdSmHoZTrEHr5vbYjhZdCXCwLM65eZZMkmW0FOyMKDtWCBn9PSjlkOwC9r1lpCZHkxvFPhFvnN27uVGGTTiqMiI23X3Mhg5rXZucZmms9WwLUdXcsgE2abUBeU6XgqJWGJz2vVa3LSIs9w/BcgVJXns0UuDbZULJOYoUGHSKozC1WXZZSqUHsWsCbs4EwoNmkWb2sngV5qdY26O65a9fMK5iXbtecGdbXq9Wq8p4wVHyJ4u1kTH5gVRmSgjlf6dUThMvoh5HeofD3T020UhxvP6MZecDWfBKvNTtsb3iu+zchd9zTedIXi6pfNaEgCx1i26yMGKtv9sNG7iURRMl5VoTmrhezfw1nmd7RulLhM4hPbUK6fjqetwMoJS5sYF74C9HV6we5AhRbPVhSDOpLFuYqktBFfxwlnJCdKMhIm9lnJIV02UTOs6cgNsjxRiqaC8ZWgrOF7XR31u+V/hBFXLw69/CFmjoV2P6c6VKwa2qiFpOJa6jBZlmsMUSYxu0SksLRqCcx8rueqMsov+Ln1UWAwz4uOYMsyF8a3B6TH2ut5khNzTV7N69yB3wJTQgBImvFFD3IQmuNuNff/JrDqxmAi/vxibcAP1y1yZDUPLkC2WguodygomzPUz2X5p32JULJU4RS1RXR58TmD8iTmGKiCfI54OPjaCG8P7ExoKq0acdGmx7vjNnAKbKhGc0Jpeu0MVkqSU4kMu0CKA9VpeSVx1rCpFFm2Tg32OmtWEQopJ2cENcoJgeMidWNTMUw+WR1n9/h0h5xv2E9SQKgH/P5KvLuoGhBKzwRhQnSXcYqWYljkMtDUyD7dDPu8aD4KJ+427dvyf7XvPbFDouChh/bQIZ8zR0bTXekWbrb5/KZ3WApj7Vl0LvWhfeyv1yOOS5OPYpgxd/jorMrz95GEa4e1w1vF+6e1eVJ8S/Z+Ww5TXh6ntREHgW6pJpf55MWV8La3rPQwvywkriweFZYerpVAcw5Ikkp0YgYVI3Bh7ekiDX+kkfQ4gagN6GIEsibcaeJbqRUg8OSUoIfH9tY132pBh3ZiLI+TJ2CHHxRUQTj+uYKe1xtVBKySpBMkcTtfgLrLCZMAcdvXJNCS8mBJqfWOzr5BzuEnA8LuKlPRYEfOabnC4/XFD4yXwUIA5V77pPd+byhrWDvPkOuKuYZg97Ey3CnKLvHvpgvHAq06z0WkpOvyzIxOmSiBqGsTyfdYQ3vIaaNNsOrGQ31jaadDRAGGdEy0tOH7hk4UaUVyHHuKvrXOsm4KxsPguguAQ8mHaW/82xE1eZywLeuo8/pjR+CeFyr4EwvySi5X9qv798NUNkjwZbjtPAWmdQBflXMMMaduJRjIL8dwp3XqtP7kFMXRLY/4dHAbTy431Rle/Wmbd3/voTVH+a+unlv5RmwfQP4H031GMWBDGUwvQC1jUJsQWzmgJgfbCdQJAucW+WhsONw0Vvar3CbNGeTF26zT+n0zynOJQOqzcSq0GSuBgcMIsQ20SZxBELVcPXUOA/xmYq2xGTLTHlyKLiqkomlQYG5ZiR5tX42FN+tjfsuXCXq8/pYVYhjBgXPjDguorrydSOANBOZwBl/cDSMixd7XnjyNT/SJEXDhmh+yAAxeEvR2y9wDuMJL6mHao/AJ23sgLRwubbLXat9XeK0b8+Fk2ruU7Gh7Z2rkKa93y0c4iWJYB51t1FzFQfOKM7WxSx96Cj6Q85ECCLrVi0S04Jjfw8OWYsDlSwL2CEiYtdWeCauWASFZ3MYc+qQjELnXMXXbFB265fBkmCKzmFYzokDi8holX2+VDhBvFzax3GHBMtwVAkNr1VvYyGF1ETa3c85RmbLN3AQf3f87Z2IRszpJLOXntIJcDV3PLbeCqyuzaIcd+2nO05CLYKRDn1GFdbpp12ApIdimpdRI/TwLki7x6T0X1Ssm193VKMF8NpRukvr0+dQJCpGn9/Th0o8usVN85MO1ArQJiNagw95+RHNibr6G1KFceAI2Fl6kVgCuXIc/VkqVR7kIn1lCFzMr/UTrHw9zEgh39vWwSwkkDrq3LmWy6Tz+hweinJT+qC2pz6MVjss/i4nt1udTfS1VmQzc9o3rfRolQKRQ3DThbnbY+eNMHiseUGZ0NfI4KQ2uEPfj+QCWcGSpNj3KW0vkufajeiCOhkm2xJQxvEO/zFHmjCXWxFVxmoclSAkJ5asTyhnzT6kRPMo9poNfGJZ5sqTEyF68CfECdUpMHFTKIqU6E8rMUg8OY4qLsMTLzRwmmEVPGIdbnGKDq4XacE3H9pYOUEkejMlAgrRWj2p2QZEepPakXAlRH0wO9VQhOAZ/O5C7GAopvF1OSWT73kVzMhBsdFikZ4yHwqK0VG7Vmk++EE+6+FoT3nJ5xxISyI4yajOuVjAi8+O+5G+xkxqXHyCw/lpTFHri0C1bCFgllnlLWueIZPFgH9IR3nSFDiFrlWu/uRbeKdb7gUGMY/sieT1mFFKcFEYIq8FkixMCfDdywrVOm3eXGKCQY01FFXvUyatGIYDLY84NbZ3yVTVhwR5NhgkOiwFr3ma+VkVhrOMhx6CSUDFd2MjQizRnxQsgSBaS5RyTj7TTAG/Nma3kn5HLUSs1JMti+kLSjF0Rp16qSpyyKr4gqFU2wRPCYNfsLtkUg8sjsPStgI+YLOM6RHAPvFuzmYBtLF8Wxxp69XSkWmD++6OzeiD8TyNvYVYZtDK3HII+y9EbxvrojkPrkDjLnvhid4rG1psrG1hz7I5BdKW6LEPVhG9zUa5+JSVcQzZCbiXQBUE4hjwKhDCesMeY87zJSc3XOsnlMg9CL7BhZNV8cH+1JIsFY5GX16jNEA6ajGRMFIEuBilG3TPh9MrdNgQPHWp7NwMpIHnft2bllUg9dmCI++DTDtIJFgZFKKXf7Fk2/H4PI4R/DwRbTBKxCSegkIXcOvFhwVYhWzmqXtifb5gGEfcCMjmo4s2VYNxUtmpUROTfR16sP3s5e6OkHua2i+l7UK/9DvdaLutEH3rHZcxK620FLmJNtO/9HC9pGe5zC/95Mf6+/oBEHNN9MhdzxXcggfDTdEdYnklZOm8SYfbJfinPEy8BcvEaMS6e0XKcbDe0fHC7dhtaRu3ZwNofC63AoEiV7mL3cY8b/R/sQrBGQ7OY5P4/qCN9x1hofDNlBCbMBZuLWMMJ1EHIANsWz/xx3Nfle9C5iokBI1NT5yV2oN/Yvx87HGnGOi8XyHxIih8FRl3yjjZKwszcG+eOdAhBqnSanzpgcQPJXy+hB67Msq3JbPeMiZc7NsqbJQAJVosQ5sktlgTvq2oJ/orkqK7V7UyqSgvDtv7grPak1C6YYHmTYMy9O2SEVYotcWgozxXCxSPBm8pgPjg5xUOFz3hBYo0aw0l19k4bjWQhGIoxxrB1ZIeGI7HshJpO9q5XkWRdfaGke7gxJHIlWK+rBauJ9ohiS76YH8IXj5W7AmEI4xz9jWwYrn7PSUVAk08fXC4zGEOgKaKpz2FPqpMTAO2VsSMucHQsj3P2YmA5qquxMVUvjADxWe2YlmaWHXsOQS54cKCQ681sv5ualXOyeHOYsAoq3bUO4VObHU/yxOk6ZUYlNB/7GaCmB7O0QlDkdWzyEVW7YSPWD/m4CJ2OKsZBT+fvO49x3Bh8nSk/tZZnMxKHt9tQ5ImKcHTWHhIMiz4XeuGSS4GJVxW7pd9RYjlhlUSD/EHsT+KitqUVwtPGe++qz0X1CTCKBJfYp6NHYxh+OQ/9BAS3PMhT3tdjklnFTjT/MFiUpD2Cb4sUxPFvi/FPIa3qRONJCWvT4jCqvLa1J3lNUXWySrUtz3fAWtr+mpskqC3BMgjEzrdzOhTAxRe6vst86HA7xquv/ueWoiSrS+rYZ6ON6eT5cEFab8CwjwYBc6DcWf9Deo/sRWGRmUAS8/1ocaJlIbucA3v/u/3a+m3tj3lJMi9/38xDrX0vW7sJYREE/x7/IzIjMan87UqKkZ8W6/o938s3CubEOQ6euzFPbfo9SxVVqBbwI8pny9Dd/WjEqQ8oVchIJlsacfKKFMZLJBRW9y8A00+/B84A5HnCPrCg1Aq+4NEiHRcERSs702cInW0LD701mzpO1jtDwLgmskHSdH43JgwiaIsGLTgTOD0BceaPTIUYD+9hvqlCrKkFD17I+ftC2RwXPt90EUZ41nSqARe9dLDFxMgFwAR1tQxcVLSEpXmatBTYGZrpVdRZQBD1McAF4V6pdCPJ59fG+HuE37vS3F0sMrgKGNt5BciXowigWtWm/Gvr+w4E+CaqxP1BKLn91PCjhpwh3/EiVPFg+L4oPELC64nCKSrdzSSs0vVjN/IYHezHQgVUbPq/h1zJctMAcl/Of2Lqk0AgqrFfqtFy7f11QHHftMiYtYDeYyQuro9BQ+O17IC7oRaS/NyRm1ZmJQNGCT07vU0cl8TLLJSM+8rzJZSyu29/X81JOW/7P1x7dOGvKTDyrBPC4G+LtflADHiaccd6sswPV2MHh4G6wyHmBbLI7+x9lTm3UoqjPfABK9dPE3B2G77CaZMxPpVN8VBOLfBrkiF7Fqs+vP6mAxsZxLnlu6ne4MObADticse2UUMDhfUoFIcb34Hd82tmpZ0E+lkbh0x49agRpU5KQT+4UZDzSgGlKcvSjku+uoN3hd5Q2d4ZTZok2m7PDX4cA9Yr3GCraJ+kvB5+H5tSEwlpfODqXCi0ek0WJbo0PI1gFP0176ximQIzCUTnJv85Bh8AHg3BL0Rh/39XmG5htEB4ERrsotDC6qnUgZqsj4Z1a3FRnaPy7VAZUO1HJkXxBX0lbLNsVnwybKncHd4OJYniVnlF8hSfijfT8JHQ4hJwF8mumMQCK7IGHPwXtruBv6pNggHZLQYsv8JCBCIpPIQbE+I24RNwcEDqFGBVR08k8wsUVI0GN2o27FrXFt5yxgr7sBT6idBUTUOmAkwsWL7PEAHWJegyDgf/QhgJJEUAk2cS0cCd3AACEcmQrEiSQiskWcPYSAwzB6/DxvyJ2BW/yyr7XzLNQmvCmimMkEGlUSJMBaBsU+KdXk7/q/cVsKnk6lW9+OrPibsiySaLAYGMUYsVZQ5yMMqAr4FXUH0jo0UgZBUaDAqFQSCr+DYLvBjp8ptCz2uM15MbRLKsQJFlDGBbTQi3hdKum+uFtbNrNABgvjRpNtwodKKAYCXMjRmGQlZgMGWcMXITsm/bL883jI9ZAkNPHwhBySqQEABSTudrV+DmorJA/u23kvbg1xC4m5yPNyMDicwX4gbpmCAd4rURRzWdjp9epBnpntcgcTcdmIuVO84/jkFKhyYAFaPa78miLENcmEjSRRF5tFf9TmRe/eOu7BtYc5XTtPA3mJYBDEjcrPzPT9Hw+0Ao7XyXNeOvD5sj9eduWdKL7PFsKR3c1q1yHUvQs2D+cCn5ewJcKMfnH9wE/ck0upRmZsUnrSOOlQSaCKRabcE1mX02MyXNrZ82HnfIIsexioAyXA15a+gBtgoEJG0+TWq17bem2EcmKVU+swuDs0FRx8xSHaJY45wFb2QdThL3WzkZc/fYgFhSmiz+k7bBSbFg3YvL+wpZVlV8A4hMVXUxQxeDQwgKwNeycpCAoSJkJdUQp+sgM9CCHaooFR5alznVt6ADJC7RnrIvTqD1WICPMwWf/PhxjCQakgAOEjYgD6B833yE1PTFJkjCYtxMJS5ARopZODjCULIqyUICV6P1Vbqv4rKnbLMvofRJVK9R6bOsoD8fQHrC91jw//yUY+zLOs88ZRnGRCRexTVGdM+vvn9ofd+jDM19we+6rfmWjWUumPICX6tKxyKQbv5AAcqWwycf2WLCapWqAJgAdutfCUJWKwpGP4/uKXKlKUeB+oKno0bxn1pJAErZXhMHP7Qo5AclpbKas9UaEKwJf+fAiD+O3nqR+d5g1OxHYkzDV+pZRW+7KJ1RrWEyQzA8foPQMTc9cG6dGKG+L0aD11Cshnz5JJgTBQ/rUBj4/F0C+UoFDVUfyD4fIbmQGNTgVakaeZJbp0R/vjurm31JUCay9Nib1isQ8qo75KNDKLojxvhT95LuYbWe4EkpivyxRL93wRrDCBdGgwJnylvZolYrr4nt/cMJv+ECa/Po0uw1Zs/YYUWG2VSfDOsavP2vI8ejEFgMmn34XveOCYqH+F1hogcsmzCGvIzw2wytfBo+ihbENe58xFkW6qW7Na4joTFn2chjj49g5KrzyJhxIHh6NEXurnG8F5tlsUnxiA1MbNJrnNNaimzxCcP8Ot6aI0OGweC/BsNaatNBZ76Z9ZB+DIXuub9tU5ZMrTXghl0in/4AcCmzXF+BI0wj3F/ECt8AVEFmXEAIyIn0vWmaxUHCFRQbot0dGqR2K5HEhKkT0cSMwXJ6Dl1HOxeeNiBuQ3RYa5gEpL7mIRll1J7RSlg7FL58Dqv+QczOmequj3pZi4wJhAPqcH0knu6p8cdoVzXU7oThzOkh/4O5w5SgFRFECoZ9yt8KzPfHIFHDr1LOBroU6BW++PT3j0ST57y7skaaIvAhHShpB23U6E0YZES4K1YUOJ4Tm5NuH5+t+Wl8696BnWsKE5pM02RNthkNU0ymQdtVshx2xwrxl1fjDcZHTsu6CGyjwkzZLNOSRXmf0mLuxQcnzaZtqbtLSj62Bz/a3J59M9yJBvw1loVTiTgFrbMPlmQ+yweeE/QC69g6LC6Mf4f49+oi3Vee1C+ruLjDHC33B4+N4Gf0b9RvA0OSAL8JRRTsuIvZBsK0h6k221QLsnA/aAQiZFDb2HxSR4kPvOvr6lBfp6iX8lSfr+jrD1e/M8gz6qKBvNjY50hMcfJy4yDbjCvUtRvyvZBd1iT77wMQ+IQpaiSKwyKj3fURDUW38vDeddxawqVpKGn/iftMA75aguj3kI+k5f8GCwrsbPTFaOi1Xgr6j1fdSkqx2jdqaQpcDuzAisf8M/1udqqwSBwFojOy+CtRHvmZX0iPDTPDu+ApTlp4D3uYMWB7vtuGwoGgPyURynXS1ZrpZUi3tSmFY/dbRZjtBQKqW8cxQ5drK86BElmNd4W52NZrygb4yMr4YTUMOshpbx0d4/OJxH3I1tBsGN3XmCKUxqbk15k6dTXGKprtdJXC+gN7X4MU0P1L5exDeruW3XQK2wLHaW4B4GSx7nvZKaubuWnLrTszfLqiT8dr74xigSJTXNh6OC2O7BOdo8nTugmJJH/qRrXvjmnrj1w/AGVhfhwRv5mXGM28bqf3fBJFKOVqlVzoLLM0yKwxm1V96V0tGVXfXi5AlEU9dugQDdGY5dT661xuGJtjfafZeoOPSKhZPecbp/2XnD1RtUIkINZNG4M0aTWobupMsr9ABLJsh0X361iELlAyfQWfoCVAXMvJ4j3RaWuIgqtZG/yUceCNYHK/hztNn02M4Iil4WYMCQh015wbLEopGJBCzLmTf6LDE66f3wDHyNtEnUKjidFYYnHDKeRKYzjn111A0G/5lFxtFUJFgrVlM27vMUKfhBr3slwJVsUCRYoA2z7iaD/TPFkyEBUckija36g7ZqAjm9BgUVZ9dSSTWxbzYpEB90apvoQ61RFholKxU1d/5+KwLTYmEtQ0vSkenywx5yqjJcGsMqjYhzOpCiTAnXs8k2svq6pcJUFOtEfwXTF5rHUUhTzPRdoEFWibSZKUjLxdg0wR1SOSCZ3TZ6qKcCO7mIzOyyJcZssoDcGaFChskizlmoxD44256zBDe17xC3cpLhYySbI8iEGMy6pjSQpCZ8JTw5ktp+NmaciZCCGaagqlVJcRCOfiAiflE5K8V6YkucD/XBwlIRISix5jQwSIR0GMX0rWIPX1103nr9flEfGcHagUS1yCkHrfHNYqjot+3cai6svIWRxqkBXAxMKCrRcgcX1cDr18/hf0jXPBM5HgUw+aKLP5Utp5yFI2HlSaPD1t1oUfFtGR4zELfFideoMdaoGPcF4nDmOLOeIopobah85LGVQTGDHhVesZ5TBPnt7YePv1appdmJs/R/WHxTcBa8NNDWozV1b1P+mxuVOsBRrFyg8mPt9fDeLIcm/BdCf8e+ny0Yhbx2GsRpJ1Ov0V0tX34qvH0Jl/3snN4cNSKI10MrH/c8RWIUuqtLOlZgn4VyeZPuWhFaMzcQjRy0SUY9l8W6pKi0TAnYI6YBZE2kjdcW0hdMdL29eNqkJxDoM+a9O+e9/jr/AUgG0oT/wLewvdROrwScUa8vrg24KNoeA7loiAql3jmeVXgIpNdM18jqwURkSz1pHFj1upDfkdBvPqJGVgCgR8oaPHxZb2NsrwBBxh1tb5ivvK5g9fzfqIojKrZMUZzTh4HZmycFYlrH6CUPLQTQ3HtHvSppDPg2iVfGA5H7kHTQ4sScjvX/KGtg7s1WkzYWT0ZGZlnk/gIBOLa1Jspu1AJ8Ql+8thAZftMml5O2aFUnlvU7rBjhuGLGjBnWVOulAK7oc6N18C9wa2XthBowxDMwBGezQquOvUArK2tYGiRGugsdyrOiNMOw5fnx/eitLIpAtXO2wbyp6ttXT6JF5FPFxPMvXALhAjxPEtje7fJ+/J43J4Ktp9dX+aYH0E1sJwrk8Ae2jYOQzcgWQ6Oa96oljeLiYN58z92OzcXjw61K6fmqkLZHgxDWsplv7+NhZyetAZykfrSLgM8stclQ3zzc0BGhTbyAJxUg7LrYZhlBiNR8z31GsiNiFTJG4x6yQptw0j60JvcttROhVl2PRe3WChY59+uk6CdURzQszjZOhXeYXSEMoFjOn3O4L7EFPPHRiFYXHszk2sGySw8CvcM7FTpSYLnfOzicQDdjGMgFVwaSDDwMUIMvUaE2IktHUCBLpf1LigvWLW4fggq4IX/md+dFkdrAyqvKABzjlcRac8dan5YNEUFxHaDRLjwPFNaokN9KPcZlshLsZfYt+8Ff5KxA6K1SUhGaKA9ARWSmHLqjsiVolSP6CJNmPNUoHY/MMEcZRaiLM80ID/h2W2TIVRGhYP4i+mb2dTd2kIisvGj0YGd454NcBDw0p56hDZDOLCSGwCaF5wMQK2hkuhJ2GLEVCMHgi/P0BTHH2gS+5WAd7vPSSXI0eh/Chb7h1sEKoQl5Lu0EzoOlNqVDO/SfMW5sRMfgNaKs+5+3eGwsJxQcd8SgnxQa36+pih+CCCJ2Ro964ZWd8RLIZgS11wBq38FlCTy9yPgSWx2H0AFbpIw51AS8K7HlV+xs6fJn0Lab+q68a/mGHG5dc3KMEXeKsdJf0bgZXpdIObsaoFVzycTbRr4+QiKAc7GHMhpelZ5bA1l1m/ym5+vCkb+oCnOHLp0Nso0d4GooYYM5XfHbVBWiSN1ojiwL84/ia/e8vlqcrP8Hka8ha1xVw9EZZIztqEGKhKiF0iTyrfbVHeo3Rby2w75M1OGrJx/WmIjtsjGsYeTpeyWRpaoXFCGHBib4BWwPpBVSLWWOjKYqeqOmXJK1ZtZIQKErT9ZooTxfe0xrmeJS2sLghBkDtiz/Ce6XQ1ztVgs2wPD3Z0NdEOtWXRl8YLiqwvhHp4h1bwnfOXVBG5V/+2FzK/l+N/+00wOpICOzgZxWlYTrBdzW5Qi5aeR6BFg6LVz9dfFe7XKwsOaU33xZyyB2ewfShkAYvCaThAOT6K8xq768gCDo7sep+y4G4ej8qQ6XVKdA/UMx+pnSV5jmSspLqchLh2epHmKXxoN7yFBbnd/YakypIi0nWZtpmQZa7oJ+yQO2gCZuvYgDVEIIsgoGs8yXFlMLM8QVYyWFPXuXrf04Tf3z6kWC9Q7m9zHp7IJOZ2J1IbhjMgPTWHfs4UDKR1Xtj0fbJ+ga/pj3lH3fYcjindMEzHXLxuADsobiJkTctS/MxDggfLvFBLE3rWbV8P25TKsN+/C3n3SRtBfQ+xV+H3wIeJjWKFTYkMddLWIHJMFPxGnEWAzj7s/j8GvjWDNkNua0HUwLPjaGVY9sH/x/9Zrf0tXO3RtGASDKkIbockGMu/ZYRb8zeO2VjTobxckro5L6xl0KQ0wj3oUXEoh9vuSy1WDxARACR9VrqgC3WcssXU5uIuNlWUk8E32dUQY4YakLyuFxrXFO52mNivnBAeZCcKF7gXeKNHtkoCQ2x5q9u0uex0Q3WbZsxu1zan6TYQGYDOtbf+aZPBuyf59MWnpDXfEzIXzkcIuFuUd1XX6yeGpL6bsiF9dRrykE8AVzGcA0mecSgzftN8EG916l1F8+28MAJRgjk7xMMklkggGJZ6ipb4jvICHzJ0UNSallxHcXXIwuYnkrNRGrpl1Cu71ZWjVcnVDk3kdORhr9Xv0tZ8wg7GJP0rfw8USYNWhvEvNt5BpDIbUiMrp14YP1TCSEcKUCv+jsl+JEWKIw9OFGcfn6IhxsotgDfkQlPAvCEKqKIUJgWSmDtAQYRdN6wFr1xnoLV82JyUubVnopOBRhRCscLmJKFyYOqSx7279FDZIHaSIlBcpmBJnsdgiLBfCdEjik4W14fuZemQRUp1cG+M+4f6Gw+00WHH9WtYQWXvaXmEhAIVqh1WV/Gx6xZSifASEF9E+wj6XP3jpSyD9fA3xrO3QYzZUoq9/wQT57qEZl92S3lkG96h7+bvJ0562lPf/Y4w0Fa4G8elQ4fS6NyE9kiwquJEhIGY6Qy3/8LobLg3km/T/f+wxtngjRY/2vVK97rUUT/rqXoba6G32vQfTX1RzRi+pFlUp9sSSR3Vivd+p2/4dxjAsp+bNCgUrfNI0G632PaiWYcXlCOnrQoF1qPhnWCxwVWBTnERoVaWfECejmyVidiZiv1ncXEy3U+e0roG5icnhxl1VIR/+ey9VSSPEjh9n4S7TcEj5kaDl+Myhix5O/sjeDTkWYvtSUyq2vQiuDFAjd8GRkMeG8uVeAqTShHvEqZS0hcnja01vWqtcLm3HYnEiDM/tADjYi6KGtb2GlV8YahXZ1Bnh2Yr4WFJlIe4YL0MTWJCI4n5DAjga9ZmWOB+U2p7VMmaxcNsGeOkpQcx14WNRAybXr7xPQHbLJEEVNyprQFeegvLmIK/iX2AWVrfh8oyybhgmYrw8L41Dh4K99vJer7OPN6kjoWDpsmylC1hvVmsn5fcEtrHTdno4PFrBh0OBnwD4IIdOFHiLpwLswZoEvrAa0o2QvH1GiIqbjBSVgUrOUscJa2X6sQaVggdXa/R1OPkDm2DimEWnmtfSktbjFfS83RTZbrsVYAvbrlGKDyhmgS/fWpSXRLuDTsPl2UqZm29phHljZBxd5KG+83U3rCMglJiXEzHSr4N03vyMAlSuigJ8z7LhftNeoBjLdE2sk+QQuFoJHi1wBS797GjM96ap2SCUeNqKoperiFCIxlmDMug6mHTEGhm4FJDOt5eOCbF6UK88d5hGC7hgNNxiw4XiQfX4j7Ek1u0SRKhSskcAR6S0iUQMxqHVzDJgm7+3iOatiZGDUejjDwpZ94kruasyT9rxBC/2wZQgLzLypbt5dRRtdMXqTdbuYDc63FUl6zFFQtH49WI5XrbP5+xGe+8u2aTLhA+BY4XvlUsOh2b5QJMR+HNklbx61Bw3wm4TR00iHdG+FDFJNyYerOVK2qF/ifDl9tnkMcjJuXO5bTG8ROtQbTHr9fb55iVd4DyTuL4NlAeJNQDlHbYmRTc6cv1FsAsCUKPgaLCW/jS3I2J9G0NOdD8CayWoGD9ApFYEPP0TpaXjBt8w3uKmCA8VtEoOu+xu9Le3xAGD9izJpolRU1ms8F69ujeJEDRxP/2HcY3RNGhcJze+C4v5xTJbiEhpHJnEHpmZDhUSjDJU8L12eJsXTFtXvqmKYNOHqDwIR0xTzozEZGd2PkltKEMiTsSvUWOHKHKcmt7+RlncwQpVCERruMqWMpHKwIuNnQWPqHS46blqJ7j1bQxjzFXFDHRrQeyVUURf/U4SaAP3cu/Uow+AKgcRQq/OKFWNXHyUlHu3vKNH/x1XntGppHVmkYqeiA9b0TGuSb3AsXLOR3i7ZC2MgwdY9s8i9u3X1OiHhT0CjGEgvFA2GIsxFTfgjj6rq79BXubb4ZZI1IPyrgO9GWOloSotMO0VZkxR9vREMMCZhVu6Hw1C7aLkoqponpH7/NDuap8jCXNbuC6uRiVgjXYZmYGzTXoYpHEyHmq1xlb1oknOXpfe0NbGLm/pcAgaEVz5bVLOTbITocqc6l+dFibcVMPZHQIhybuWzE2XdztZ4Q+13+gAIusG/iL6JQRIVcJFTrx1iF1LUmbEJNWIZd9lJvGwBJhoJKSMyhkdhazNYj+SraMSgE82X87aimck/2KXigru4YSFJCx5dbQNsTRjHqzyUGkxwkJQmr8oxYGHzZZGX3vj4ssNnawJjEEkZtwaQS3TT30UUnc7/peKcxFg81qHiuFwB3wNtf3KVfzY8pVh6RrKY2oVzAHR1Xf5EXucPdX9Sj1N/jkFuR3fQwNsoMI7B6OTXNQUwlXQWyit78imeBiUV8OSvzWoekfooTc+wapT85BVN1xJKvUTSVhX9PnzrY3qEtdXlLMvh8VUGTncSFmRMGCnUgr30yxZ/5zPwcTr4YdWmV7ch3bmk4YSq8pRhrl87TyjrFlOqjbhVRGB6Ggg9nR5y0lldren7h12pxe3Pr3afUPiX3xaErpetXJhY6Qz/mBHcqwGrdvH4onlQ88HMgPkCTQI3CT3CWWrS+wnjWAwFw1ITUHtbYCcLifN0FoCQbsLX47dEPTu/of/jrL4aLhhCKcU3slVIDouF+PRcl0HKTQ61W32Ntyavk/9Sw77DcidNeCzgrqmrylYp2HLln/ItbBmxrDiXyi1/hq5/LR1sWCks26HrV1nf/4CBVLrZz21Q7VIpfMcuyJIKy27/LpUg5Np4TU1QfgV5PXi4b18dvV966/CJC50HCfF72GJHrJHf3GJ3jHFytvJtZ81eB7oYKSX1UkTzjEjrRb2FQfoKTzDKE4Mb2psLTBBiWf6nuihI/Dut7PCCklYmLjgjTaFPsA8sKzJ1pkr5sbytjiVHXoG8+XcQLKZ4NjS25T1ht/zNNYG4aXzaYzbDnW4yvWSVG4QkswG07npQmtnmbwOyNNGlyV1+s7Y9wTkVstSYzbjNp5pdU4nCrhwHjCtJ2HG4OOGA3kuiC76Q1FgTmIl8dsv93MojBbcnvfnbTZDjbbwbZ2als7tcVWW2y1nZ3Zzs5sb+e2t3PZvQH+YIiO3e1/o70jWIGC6KBhet7akobT+ORmgSQlOJnrkiH8/j2e07lcYd6FYJPom8DT+EHHwPvjhWFYBd8vdBa64l7De1FNcKHOXExwkZ/T+Ti6iT6fNjHOmYlP2W/cmabnk+33x7+oT7eh/TYXZdDm2V6Gfgp4kNEYZ3Ps3p48bMTYzg4E4MLIrDYiicjBC7+25lXnN4zAQ0jnGyB8MzGFmBhmJHOTonT/TBkVEaMrR/NIPWOxd8SZYe9vIYT7Ua4rbKAw8wgrJ4aAFAhD2aBF01GETHlTLhVUFt6fjrz7vhYkQPHIB1Te6/wiHZ3t8MJNa9mnLkzJc9y8ft9qfvdYy2kzW0bU8hsrjQaZgOYdY9EZ7ixnVHEB/meme79lr7wXoktXONye51eKbdKLSSLMnK6JdPr5wgazNu9k2/I5Eb/5FvbAxCB/ilHpkn8bs8z/+qqhY8IQr5HkMmBEGAEjifkvYtAQUlPbt6aX/JS+msiiMdtMGOlEO6RX0EKiXdhXY6SGQOKXo1VpsRTwFa54ntuM0P7KsifLg192sAhDIKkEY+NvWRO1SjVrndMfz4dvMwqAlTJ8WjJ+Z2wPXyqcUlw+9tWUBkmOviPY8MRuCOV7CNSXpklT/aMqCuiHoUwoz5AEe1Q/e3Tgwo+7O3VA26Igo4xjpdlf7Cpu8Bbti8nx29v5kCaKKJIjiMfKE75TvdsDGdyacpTLGopR19hKwMaAwFpuyFPXrGxD4IdCcDNVHfA5D1xhoYfwAaz/2p7Vz2fVzloHI+WCVyiwWJqz0+kW4A780PB8GkR6oK1+g0vMStl55Xv2jgd2nny4eaMoz4UCirB1fAq+hB81pqVSSsfyLrG57o4dj7ozEvFcf9hQFDgLeDigkfTvMkaGRFuDwU2QejtqerX0LTO0teMFJxg+HM3Y9vP+8RPOtbpJfRX0Lt19xFgm2BSsngUGqK07g8YQoOjd+ChKhwmDqRZW6k0dcEE2wM3S6e630eLSiSrmUTFUimrYYV69UGsJan6Ekcoyj1NkuQvsvEqg016n3eHa9TXydI6dwf4yUp3YTHTDX90EPzqIudClKcaAT6cJfp9TxS4vlKZkuJBuYJrkIRUZ4XRLYZwM+/OkclJLCELHF+ubwSKjVlRVurfeKHEuriWdPqpO599G3ZUZi8ZMETxUv7+aBormKE8WwKSoOeoCRhph/lt3ABjya7/38lzHsuAMreD6+ZTilgaWh9c/iDaVDUGh/7gzODp35ngjpModrE1GsINTCgB45AnBDHSx/Foj8CtbL7tSdvddEeNxpop3H5hBWermeDwB4DyETz6oZeTnTzTfV3bkkt+4ucMECOyXt5mqDU0DrqhnttxDAlvj+yq/3sZXLJMKhMeBt6h5xhNBaQ7vd6a67E2jZVJJsESsEl2px5STiQOb+fGVU3jeTEK3MBbpuuYvy2/VTdpfd8HovLbpz3eLdaP91dxefg3h3lc+VglktH0n5NJjS5g5sD2Cm1s/Xvz+9tu0v09p8RN+qa93ljrW+lF/xe9ZU5X5E0l3IRQhsq4xrCNjjJOgvzYKAdrm4XRIX/xXDB5qsb423DhPl7ObHlM8GZ+W6abqTMEWCxCrcqQLOCyn+2xx69j929s4B9+LaWs4OJ0HP9rh5828zAuW7TNWt+dAXh913moDBt0g2KvJZmqF2kBgNrWI5f0nsqxG/DG1KCMRX5SM+sB7Me1ei2nn4NbFZf4pUEIpelV4MrrDO/gxFcmk8LLpoZrfLhqmrZp+3wZP+jWYx7vkj9amh1SGtFPeoZctjtLh0xY+gAz6DsI1KMF0VVA6SiiSUZRYOQ+jLJ7/xL3gqWEMWdnqNqkcjjNL79JDGKCTo5UxgUyM1gTcaMIFLTzGGMOTxuceM2VP3BdHEHBPe/QmYaQJf5e/3T7raRwu8+AgnlXWDbi8cqv2vDvoefTW96sEAWim13dbmU7GRTOesyn3+kfhrLeYRghQoFBnZxGe9RWJEVPW8YJ/9P+IfbzqxWtGL2+KsTrv+EHyE7ykWIasLuele9rglXQGem0o5g3bCPedTkuDPAO/zYZmZRAPDbR5maet4E/b8MOoj/Jbep+hkv7cW/gFHkAGT1CNj8zTYLXcRIpxLPgTWYP1dAGyPL9uAwHi9mZRE1H4jgdHOtv4+cGma7JEuFHZ4c8xGk29Yvz7sYJg1u3QQmkYQ63VRxsHdPvJRePeAu00BL/Zc20KQY/9oEuOBC91gebfpG/pWIv8sLbHLiT5X/KcNP4490EQefSaLGEKqrme33mAD+BAe5S2JNDJ8YZusace2TA6Ke5o5zmMRXhiPgNGiuhNwp7O+ERPnc79X0V2bg2ngY7TUZpcXv4m3fW+GecykL6VZNQjMaWw7xFGHKqOB5E0QoDYZ2ep1SOUG6LSElN7yzh6t/l4o4Xm7/JkdH6wNnopL6pQeyzTIeusfelMOo858J/NEZ2z5uwQx0AIQtKgaSGz6+Kq15zqsAPXbHJObKEI6/RDW6uG4i544pwgnY7jTzYrB6NbaXAcxpCxp8cU2QyaI+j1Y1D0siveXIh9PYBeb6Bc/iV80jX4Dc1hu2kZIXrMtFAkyfahmBs+eJZE9RYFAjUJmIST3hSByhqfd+SJODgYYwyYhDHGgI0wBIEBkzDGmCYgXca2vk3uUMDTKsDTKsAzIsBTkC0nGR3QNzkYI4cfwiWOdxFzIbxZsi0MuhBlfjsM45sEHoo9AwprkAa/9t+7bRgH7BiA9WdEvJhiMULvxQbRRYLhDD+c3nNcMZ13noWl6QRPF8FNu999s8w/APPIJWTUxBkeSpx808oY7bbhOSmT9PphpOkv6LEbPCWSxzWt0ZqAZzpjaIcJRidHUsRECcUIOikezAGRXTjddcvE56GW4Klj9QyXVx7r+PD1oO/NOe3NO3JsKkuxpikZWp8BJzOdpilYwRJ03VBPYonFONMD1cSjeP0pFePH962MRsc08AkmmfMunXCi8wbJDTTRzUrR6HwvM2deoDh735Qj8hxJ1NBcQ2F1uj1twB0zOw+ayWeaMk8kMGucqCLt4nJPEGnA3yQMuWjS/06ka9KWRsIo8zOEw+QV27gsIwZKQw+LNrRkrI0JclmFCGX3wGfSCF6ay2NBw9AhIZoVLknTRJ8jI1ZR3J63sQpoVS8jh0L2T/OyRwwfYc+obWLRdnbMllCN/tQ2cLwDpjG9R1F7TPgVFemF2mWPKLI9qWmp0mQg2hNExuPBoFbJrNZwltla3TFGnIoX+GeYiw7LFZ+uUh4kPwqWHZcXKp87LX/Z+9bFcsO4ObRFbdvpbKeuJpDMlnTh7DxhmodzF2Ya7EQrz319ZIEtFSIBaS8Rl51yq9s7QEseeiPqb71ot0FIEQQTmDT7XDymGJVCuCN38Kq99Vkz33WKBsQUIKOcQCHxaO1ThQMNWOzRVSq6xaa60elPPkuKq84oL+w/EkbQMBuhi0tTJ64oJzAVFss9inIri4u0oi1U0QNwtMT0tKvUTFWHvPjBUJ7Svgj4gIAIta/ZvzOW2wvH58MUM5yDAaNXuZwYPo+n+rpr+ivsK4WrVkOIagfIjXueQAQpqZNA5tY+CyjXY6HRYS8pXJT1FY5vZb8lWFowjgXnjc49YAeoA8FdvF2KS29TzBSA9VfPXlCH5YpPy5QHyY+Czx2XFyrfOi1/2bvtYrlh3FDsRIEKktMVwi9gU5xFRrLLfQl/I7AQtigPtxSNrZ7ydqdqSU+BVls5oTE0aXRdcg3bmeFoCS7HEjx/AXVD2eBxKyZ8ZpXBFONQrFBLTWAg61HqU8BMGZPxrZ8GEGlGFdaLk62E/IgAt1nVXDVBSAQ4Cfy5Se1pd0ONoHGx0GvKcV0r7c4matdH7UddoTb8ZOy0iE7vfyerT6XVb9LnF7yCrGFD/mG6U7n90/6ZaGfYtLUqF51fzxbfBNS/CGfeElkLMLHZp3N8VF6uN9Yq88BPcXc6VjRm7gF0BnQ1RonwaLukBAXWlzM1QK3XOu15Xzhbp7LIc21m7I1aqy4oS8DV6sLcY0UMlEPHI9Yik8lzUDVDBK6awlg24080mM55YU6X0gG8mx7XaIIVO36yOXL4FLdOowqv2Na976Jg4X/RxaDXL8u1FBrb7Bla96xfipR1tkuMWiBJMlysILu7cSsL/CJT+FOrlj8g2xgJXcsFiDmv6vf2jcbGIJ5fXR8yW7NLXVWklHSXKdGFnpBFD03Zk2b4FZMxmuOoUFNqUxl7mEBgCBrg2QwLg1hMRtJOJi9reoEW5O9gUK3VaJFU4SXNaxRI5spcRepDohx8OoS8ydEUdMuwEonpQXdfYbmw1unK8kLyDrhQAZBhSi8ngUPn9dADl4aur3A6uZ/hNc8VcoeArvqIjWAVS6HrxrDAGNXdJr3mkrWCo8b64OZqdkxwbsEETrGpV+VJZh09pToo6z1TByUg3fcztJY1r4AcFDksVm83Ca1jYdsBa/utWeLAxpZrHLyE9FXVowswPWTqjpYxdzxTAL6GmQ52AqgAB/T0AVa0I4ZPCmZp6PCFRgz8vvEKr0EX4lPKpnWM6oBf1Ilx8I0KTbwajJoaWMuIzqzSOeOLoZIFKuw6PR8KRPKXXCwcYKYENQjvAtMdAEW/zOOfjagP5IfEtEYSElIAeHoxY/PRqLwSVJXDyKmYdiaaaenjrNSTtacTNfW7OSO1ea6Z6NgXW+L074iluR/BRDGYcy+QSTE0gc1+k01QK+e79bjekCVWQR82KtgPRcKW0OzOKRIHIVGfUMU5BYG3LN24Ddn4hl/eLAYfR/qIGObBxsOyphMCr3JzZSSj7DIjMVX0NPrjzmdLaznJE6LdTp228trnlZATHPxAGBlZWJh0Z2Db2y/WbBpUVjE6YxvHRaK2ndY8vmkuzScNljWqKM6VV5XoEOLVSAlt2VJkSy+qG++cqdIsJET4tIcN2Gy7kDUapQcaVd31p0E8KGnhfSouyG7yxHqFEBjRM29Pwxpe1LpAJnVLzD9M5aJ9UioaPmMEIQY4TjYwZWrV5Txy8TaQRHbNjU5HnEKjzbcBEfTWaPKtkeixaHEaUpebUg2qKzNmk8xWyaIMFbi5/DDFLhi0urtFy261aJ8iU5QlawmuTnHSAOhIS9h+g41UE3YmkHi/f/72E4VrihGCTVuMB+HOUIlGf7qaAy0IQP0TmYy22BsxgqHNXT6S/NFUg0lIngHLsB0+fTNo/tUZXb3JdVo/ViNSMCnkfFleEOaQsvzn2tF7OXnSca0o+ICCFidG84+TSnE+ztkG0FGAl6K8afdi9HF7qu54GyUJrdzhRPv1TBPcXNMvTPl1gZJbs8vV09DxwXCtKk1RbHVcpHu8734stof/vqeA1N7Ms3ySfdxXdZ1jRH6ug8jIWaf+4GGxgPa3gV/H+7ZjwfPfqP8x3VH2ZOR2PpJ3f9nitVnSg9LpXvtsG7cm9erF6ud4U1efpwm7SIlsoyWWSAIQkVgQEkmx4CCfTut/voiQCEn3nBIyPD/lxY26yrmSSuak148wUI1q/y0Ue0T0NOXS+arp+bV0LBUyuBe909eCslv9UGPgRzubsffn6ozY3rf+YP+/Pzv36fs5Q3H4kcR/V/UzdLPzH6Zlke26zqLpwmS2iVdQ8vwrgwpSa+hKZL3nsSicNbwNcp+Azdj/JX1zbwqpXY1R9vKkfYwu7GazXT2T2Rp80WkQd7V0ZWLHm+g96ZksLhX0uUIPJFx/Gd0I1/DLTwwlwEG5lsjBzhYMyG4KtgKDCQrM0683FfqzohhAheQLzat0IlECfP0iYDRHo+fpbI1yH2xwaEA9hntBoajXv5ASGqyL3tBQfvpbTUPqME7ii+snOc4KfwKk4Lf9RGGoMB25mjh92kmgVewmw+g43MzDjfGk31C4cdazOEYqZrPqvJTDVRqPfHZZN/0QUCAC2Sh0E6XgAVhB1OfA2TgovVgVOW968nC4xE0ZnG9cCZWw/cCVH1EKLpU3hKSYEnymjWvMA1BYc5zT2cz63cSm5j6l+jeU8DR1pEMAG9M3dl9m4A/DTNzgo9dQBrFGDdFIHu7TNnisjmrBtSTfYTYcT7Db3k4eq6Oi4sozcbGlXl5Pb4C7N56xSAf2sJluYJ8jvsv5OVs5K+zYAhR71elVGlHlhCNjmXHyGdb+RSTzuNyjQTaQgEF5UiiIeRJhrAR3KZc5Jq/v4eE1n/gssHPk0RCz8rXCOOXXvqKUZpoFig70e28QkTwjuW/KJJyEL2YKcpqQquUOa7gmcO9jRqd6+pgF7qsinJntnfAoNADqx2ZQr/u6yTu3JUxvYVVsdSkgvJqyguGdjxuX2vnlHwCOYsLbKf9wMIGttZ+7CXUt8Rp3NHp3TIgNEgkrTWREGXJqYTC11+qR9CQ65diHZ3o6lTG5AEU6O7S/T5i3zEajxwlpkQAI2wN6A3oKja0SO5FHvhxlGYIkJNfWl1PEAI4hLqvVL3QF8RPcBySYfHxVKRLAz5z5jqefdX7FxvD4JczmxEms3S/px3U1Rf88ZaKOdbwh/vwKk4XhOqoJx1uK/FvT1HFZRsFPaq3hr9mzJEtLAjSfOksPHJAeWHCXtgFYXb5/OpSoHun++OTMGKKtwe/DRAReJ1wM12tIObFI6PxPIqsIFT0g6R9q+mZwXJYZ0FwUr9YTOE8+RIUr+I4sDhoUA1tIiAxIQoiEyCAgRMlY/6LPhYIqRMXWrDcNCjgH1I+bLr6pdx1Cl11PtjRo+vJLiIL/MsvOF5l5yeiS5fnBCXiC4uRBwu3e/HTLijOmxfX94wZgzOgLCVRAFLpIwkvw+hYgSTqt5bE4kVm6bx1oSMoNJ/Z5X2l94Oa92TLP5uFmAYV0MqLSy7k2LDKkxQ4C7yasKAkKuuSXjRXyZEZ3ycfM+URmhxcBtkglfYskvtZ1Wy/CAf0pfd5j584U7N0kkDuTpQGBjpVBGzTVB/HwKjEvxd+IJxUL2LMFxjTAbRA/bvE4QzcJHgbmTQ/L1HqrChYe+2IAq8VFOrQYoJ8BPsxZc+z/8frBWsEjFqfd+Qxdkbw1ZgqzWWof/79LihggFfR1WwXiuaHVHUQS92p7YZSI3dajJIUYbyXH8DrMjKlTg+wLirJ9IgIr2/zp1hqZc4jseE2ITuKWj1Eeo/+XxkplNfoWMtkN86fL/5po60bGd8Prk0y0xz/RTQmixbxwrOG4Ms8DkpO3YIQqE0CHvkIjs/VzgyO1x2eXme00CvrBzv5MLxpsObRgyzhRxLO2x4s5qMa3nxb77h487l0vPALUUpAm0KcxgO06UhsADKG1nG2fkW1dlK3R7dCV2KDDBCS3CGtoRjJmTlL+9zuKIuqk1E7kUSpUFiHhE+FYZxptfs+jRSXbUFdqZmhOkBiyap3mn4HvG0rCXY8d5tYEeD6Q2cUS4k5TYEowCr4+Exosy6Gpqs0T0c6bBvSVFtg08gQ3Gy/GqTWz+Zfx6G8gkw+nwzwUmnpxIRmtdgVaxQGeK9lKpP1yc78Mp3mEg6SyxI8qX/ZxSAAEcp2CFfX65PHqFSk+IWNTjlKUWDcOomv1xZjtIhZ1NHWne3fkmz66+UgU6wLveOS5y+ca1LmWIY3vV0b0F+CfJqgxDNWm1C3laRsw4oU9jeXLXuQcbKxU/AdI4v7Mndt/Sixnd64TEkq/ocL6EfqtgjtuIFj7Zizl1vsNShQjmmCJkcHzcwRvMR5rnlw91QXBaGF1cIAoTyG4SFLiKlxVWG5+FWPYolT0+WQTpsqPUR50us8EMV7O6QkwwhaVpZLJFOmrTvYDgCnhGJ6i567Rsd85x/dCCdduEs521+q4dqTWumSI8105wuzKQ2Sg0/USD6aggMGKgw+KQTZFMaQxSZsDvPxfWz3iJ6siI3D6GbggnGfqYvzviCcBlnENC9UYHMnSlcgRmM2j2AFdDMg7tifGpivHdeBQTiJHaUKO630Ff6VYJscPFIIGo9UiaAaQJxTLp9IR6BvW+N5AFaBoK1E4F+2IBImmyfhUUx32EAJlF1vgFosHQn0G/72g+u3KuF6bI8lrfWnnhARP6AG9U8eNTICJHZx3/Ly4VYWgVUgDhDdNsjBzszHgbLxyTZBQgSF1o69MMwZB8+12lwJJZy95tYVJnoZCIfMjusGfNmBF6D4OVsCWVVICmMEmz+CR6xRgDIuWRnvs0+oJzi8M5xp96QFCAiuIRizjEuzZIi5UsUDpQiZl5dXKf5mw1cSQNCEUA4Vw8elFPpGLZAVUTkDlnOnIPTxEQus4MWdD4y73H4WIYPxSqOluOBJCTgxAbPbvHvYCRyd9nR51eBVZhPzcTR4NiPb24IkFLEM6B0oHwUI40uUXAA3yucGtR5nMfTOonMuVPo6UR4dfhDKu0IEUm4r0IhBLg6VTjwfz8QT15fG86vE/GL1ze7cOGovSqKYYpBQ1GuYgEiyxEHbAcVJAJUooVq+fgR0mvieudzrwxZFH0yOBWsNgH5OJX3JPe/fOC2rKYxaTx20lOwmjeUmIzs2SHWSNcpttg+E0Vy+JbmjR5UvZFrwtBA8iWV/t/ngzR66WKXeLaqvZXKEjtJemvTfdCkyTQ5cg9CGlEXrLCvyeILZPY+B2MP85dtaB12TE3KG4VKxqnOuFrlGHQaBQh1aYe3fHuBDMdO8u89jeHbeL+DTcMXlMiydvkp0DvvdMhKu4KyCqEiPFoFYFeC4juq/6XY6gDXQSkQKL2VhnFWRvp8e3pYecYrSTEHR92wfoJbkt8w+wlVTlKMrPgsAe7Cjwwv1EBrcfI399FAo9E4AF7uVoT/qBtX1+mB5vasMIHiLj6e8rMdAnG6pstxTtYTTNegEblR8ATpBUuBU75ycCh0UrGttDCC1aG7m5n5bRWqQbEVcwsWJ6LfRYyP7G9XvShBcOLBDicCIJPGKLxUIkwpdM5P32BQ1GzhKQDsLlFN8otGlVgG+B4xzJ6z1NntMyrGOukIX34eJNYZOpaM7SubGyOykO15PYaVOkvU8b2ARc2ZdVP2pHFjivuSEgxDhSPXtpgjk0v6QGr4uDigJ0Q2j3dHky7IRpnV3N9qC8D0w+t3jH6J2CmIW1KEsnZ7hS45SAT6E0kFraSn8Q4Xoh8f9xG8pP6JgJgmcOV1XBtTGxRQ7d+uQPgca9/VX8W8vKWL4m8gbmvYyRHHneW2CcrkS19No6WMmvcWX8bUUnwqJwOlN/gJdfEsxcraDuRqpRN/mcPUHxIooRhnIf7KCS1Z67xeU1T3pApRQXSb4l06mZxp9l064O1GwmIoFThhBwvQzaaKoZGDCUuppgc/9G5bGQ+aMi2RbtmSmKyVGC3YkRwwsEK50/U0pAT5tcUi6Yl12qChFRDaiOzYM4B5G5PZDrNQZVuNDGrUgg5UUfo7PddVWZtNTNJ2yw7dTXtgLCzxRXLbVfhAFLYp6lHFT2dDtVdYU7g/f+64dDsNCn2QdCNsPoRR+1iGoRgPb4akIpF1hY4xtAmbYv3gzGxguCrEJNRuOg8K0hPExcQxBdH22ewDinkYWy8kw7xcsCMbfLHnPOKtczp5n6vwzKnJVoKLSvw5EijEKfsr8r3FgVjCvDoHiDzAXBIyOKdR/gP/OSyrwU0wONOrACHIrDr7UOHwrvpDG+hhIcjV0mA7zVvsksFdS9c2bZ2EOCkZCIoRRT2GkaCDUXLUCDg8yvX0OAKSaSJQTAMbFTl0a6rjgJKs5jZuQlw33cVmWCAQtHuSmpwA3n1E49w59WQYS3yJPjS+a18ay8rxFQqrqJQj9KzYJJ422QRLzK2qkpWpwIb+iUhxEtRQ1lI4O0TacIGI6ZeOXGh0UII7ZiJYLgLQSb1/XR9PNZl/+ImUApXoiZT8XbRIpT5dCw4weiEgDwAmVQkVrxVZ6m/33XaeeVK+7nAnsLkpMke1JnGgrYhqVwVAJr85faK9yC5AAxucxBBho3w2CFuRZwH6cKTPWfpgMZ1fpIim+VwyTHKUrSwJ0sLJisaqfjAS9KEOd3icZ7KWtmQCM97jtFkQfBweZ2uy/IFVYnFhIYX9jIg4kERCcilfexARttQ0HKo1oLAgKuYsXxsU0jaE1eb/v2ylKs0Ekw9xa/F4rDVIbHPjhOpPeUHuWa5rhoC5TGx/HsU0zoK/cJvkwmwrD6dlT4bO6lrfOQWCgPRFJx40IBbY9+NwAF0BFkflgxpijPI5f+05HR67Wc9tP1+Z6AFf0J8NXlA5oZRBggvy63jCC6IyjeG0P598KRqK9OiYULtVHKz1f1prYxDlB8AiRFfsbGOFCIymUDYA1Ea7bJwm78YewsyBrg+Sjhb0bS4AqpZGiu34jcxcKXxeeQpdyM1QYQxpac+NGY/UmAcnmEdirVSwjHuMXjsQ3fiTacpuZ7YvHLc9lO9P9tnv5GGh2/qcU7CYBemjvY4B4o4TbEWhAufDCBHCiwgb55ewHopOyNe1NqM5qa7hTFqx/XtA8TzPYrdKU+AgxguvzzMsjIiCnOdjUI60QvjCnlUnzo40v/GtE0DwYwffQJDNB5TvBOlkT+IX7t/2btxa/qtqdqGkJ4b01NVzPz20znDiXJZORQj6ROFYrU1SFCIf79N77ZIU/tfDeb8iBSarByVKyWPZEIwWVo85S2L5HnpD5/CDhSpX232aSrdj44/xAcW5MqPpDzNTwOgkXFxkLsYp4DYk0eOozvcngu/ncntAG/3HYbCWhXW79Bdyn9BUCSFyzYUIXHDb7S1j9/JKqPKrTDHEqvYsNPDexjq6Y2Y/i7n4xBJXDNQYbp8NEhPrWOe/zTXJbTsDjB/eWx1o/EP2SfN1AcNLAp/q3xvDzvoxVNiBeDZTNgAoY8KBrwCw2F9AHnjtTNGuhg8TK1vfk2Ax3UC5Zja6fFX3cIHmuz89Hpcp8oWpeCWqfmM8XREgr5gX8OPQCowtQE/oz/GBN5KvJjbhuMz6UgkBRq1xKk8Y7yXGz+/JPnJglkVgALLuzO6d+afp8TJijQbVoj6kyb3ZBcTbptd7Cn6SiRzHeoHK5jbOr/pJmkdT2nFBe9yHQjp5TW+TE7t+GmBkuUsLMoRqfA2DD6Zp3TQQMy8qtxPJktEHT8CgxQBfjhnvbII9/4Rf/Z8Ds+3FXTb996/6v+RCh3e5ovUqrFoGzFV5M2v3GzF1cCAhyxBXRf/8K4f1EBUy8YKb/GuHBUDdNBwjIwZVzzSXWD9IDXmSMZidB/MAmn8Q4ZmtF5MFVqgfJhDl6guHZEuOZSxYWwYTCwWLf8Wi+V50i9jyrmgwylrxg8C4/zwDW8hn8NCSQfFRHi3c/Uo7Sxx/HJo6l42Q/vlxO6udv5MWK/cbdgyISxd//Vwa0u7etn4KOGRZfdUl9xfvx1OWP4ykHmzHJzaLIAtPoptzj3llkaGQ2uN3IIotfVLxZbiIzOO+bz+Q92vrlLrMiyz7kjIa4dcxmNZ7GDfeOpYxfkofxTXHzaLgOCcAUk2oQYX9IpBs8uWdDe6lyyUHva/EWFc9EOUz17OM7Rk9FwU/pwMOyhpXdqZ0cfbrGcpx1X407R9xNfQfbw2+z5gVgwitsfxgrwXlMt6XQEQT/hN09CJ1jA9E48YIU2lMRrnKI/tI+uSCnfOw8ithkRCbp8gDVfa1IytqSyggQ1Y4RgA+HcItHAkhco8mz2Y7cFysWtHbFeXdDG63A+SkUhJ2ZxzM5SpVReJHbBFzWi4ut9KwrniOXgZCSISYPMijPnB0VWJvLw/hSjG+dcx6FDw75zbhnje5ohOqyBml7GRYm26+MhF0jhHDHodagnTTKhgRTrL1o19pRlhboFTKvxCOf2ujlkWyO+u1ntpSMSivc4F3GtAiE3EGRPXZzh05wFveYaXXbAl6dnXX8EDEqAIBitBNhCNerxBpZHWW9/yunzrAfHhRzi2tCF08GqEGD/9lDJvHwKOBi30i5lN3yKIa3PP+ygw3i/01p/UlPMnA0hieVYovstEOLQP/1ekFMfSRyX5Q7/jWNIPQuIOyJGuHeBe9ZHA+3RXTlq/LEdzbdfztg9jvRSFnL0/kswZ07mycm3CRnq9+XOReo2w39XrE11WJN/eCmMt+bfUQKTfXAIzPuSQS3V90PiN+i/BxcSDeBLvG5x+IWcFVS8xPs+c3rZKZmawn6lJ9oa9n7eRYTaacMjXAFfxg8ppyLJwu1SyfpAKNk850AG8IWyEgjyhQWSJxXcVA0TD/DG4Jx15nvLG/59XHjV+DpVb6npbSaI4O5YJrlGF4x25Rhsr4wj8Z9Bl8AWuP7zHo4nwo3/ET9c2+R12fYyOqhEb/26EokaeSBECCavhW2dEcEyGXrPDrX5Pg0bq3vdCwq6aLxTxMNKPOJ3a/rjiA2bCQ4Rj03lc/YEsNI0lqZSGJti3JbAlzcPkj7JSA1NE+nhWpg124q2W2z8N9K/7xJVqVAol9rq20LjPMJyRXRGuZYlRG8WaffWaY2scPAVqUc/UJbPDTP1xPlD3j9S3fzTN3sgQOFlgQ1WNO7Q8CZGyz47a2SrSBLksei5EU63gdjGwd7DitpIiSMRbBCfz5kPF9MhPnbmfsS67LAwd9ZuinJ3ExZVjMyCabjLI/oAWJ2tQ3Du8zLBvh4XljY/PMl41hH6BnzHAZ1IakR/8vs50wpRqqQ8gQZjKp94o2jxO3+JCiFcsMqoDwrNBhsQVGu53regsM0LvzChF3BG3ZldnimNVOmhUJlGGoKE/NjjEpf4Ubz3OVQ8/8UGXrON4GfoUgaT4kC7AhrjZgOc3XMznOvf4dZulsu0I6OstULcLOsIlEK2bJsMNkx90BvNICkEZ7QTBHWlV7F/mqhpwz21SRJVKnSbtbn1pdOI4rYWU0d1565P0cEuE3LPDggr2Fuf65muiBiNS+QCXHVZnB5rpLbrG7x4NasJxTcvAwJqBhjivYSy6AnjcwFo5HL8PTDFKWX1g2Vt7HRY6ea0JkKqH1oqi2NvUKU5TR6GkfkXn6RizDP5V9F//Jb/5RURZhbVe4Bmta9K3XMthKEYs0IaTszLUBNnGEKKUGUUcBEfmDcyLA78g2ZKQl5ZcVnwgJjdjJx7nayr5QY1z1o6p1f3qZwWBn6XqJugUK05Vn4o1ljECDGMIGoW+baqECI1J10WrRMH1a3ebdyxOvPKKkM0WTqpYoCx+qb6tK2zq34kPU6/SLbwl/2U9NU78jqLSLOxvfqq0x8qFSaYmKOdQ3jakFZv9cW9UPalWQ4k7MmFgMH5DHkrrSaxV/5ahx0Xq7a3FewDER2INWwYS2FSGNYW3uYPKSkf0EHTqA7j06MdFL58DNcJ/tCPWbjKbIFkz+tsb2ByEoA6o35qbzfMK+QRiJb9Vq3W8WWsMonuTuA4ZFC79xGj1LHp55ajsdnec6Urq05oH0fmdr8j2Imt0mMmqMfrQoO8Q2G/6jsj4PS88Hc3CISYO8OypfW/dlzxLI4uda+q5JSBRr2dUlba0wCkOwJ90k6KLw0EtmR3YfYsucOKpAJXuzC9shlLFhE2Hwc0dXHk/auRcC/bk8J0C1vIJ/ddQPw5bwLHxn1x4QKMSzlw48T/I6fxGH37ARqsw5RdGeh1dmBN42ceXiridPW4Z4Y/zxJH+d2xRQ7D7VmN4U5DseZ920C8tP2seeuSwz27MtjrgNH/M4ovclY2SMROqKffW9WxjNne1gr5a6CKZcqUjm2bI7vMgL5/Jg1TKrJ5bzSsQV+T71fBW3G9hMD1xbmG08SdtXN8F3z4m+61BuKdLwY3ogiVypVBXhDkdS1kEZJAueXf/JEm/oTtxEJe7UCF7S+/+Mod8rIFDvRGNwvKzbSLLKbfIr8eDomnARk6TQ+oaG0vSNDKhhYcrE4JCCBQYA+qpMrC32A0aJhz/n4md//pWuf6d3IdRQHoOSQNldPFIViXZGTapPslh1vV0BiAHzabQ+mkclLcWs8ur/8DGCwzsMZVtP1CRCmjC/ayjOkVP2GI7bG3CMmubO81Rwy0Heq9mfA3g1Jh7HpLRQrKvqihsecxX1Hno36VQ3lRtOjDrZDbtcQu6cy+gbK08W8L5Jdwl4/QSFMqll1RYUJ/XNNosT2VwOscNCWwnF7SPl0i9QcAs2ThrQQ9pi+WUXmT5g3nR0T4VURZ6gUAOtFBiZUNK6iqoo/3LUcmktsEmY3akI/Eaog7KUTbk9RE1RX2LA77aksW3Y8zYmSRXRnw9RoRxzQ7fBGb1C4wtPIF86+CrEnyRbGWl/JcGsUxSsvJUWLyCe4EDmuKUIs7XJ5IXSnRy3EGR2p2ZbBXK98NtOvjldcva5Mby85mBhNco3pyB8gtRujIjA24DvzsMCrjr7dxFRARGcHsl9dIn1MRBn4xc0Cj2uunOwl1sovkwJ/feo2HLXyK7Pwf1vg30xFtl3fzlTyfiiS+EOY3+/yoZso2t26uydbmoY0cmsac4P9M03xPZuCQmzBHer5F89fUhPmkZUP6Wsz0qu38S7vnijE/hvllDoS3D0UTm7umyoXvs3mWAgTMEQ2oz9FMTfx3jM38+n+erYMjJzcDinnjtn6/ySrPcZRV5mlTK1/ZAOuYasDF5wWlWcYlYe6xBghmekYqQMeGDFvceLAcESVYJOWSJ+kF10hyQjcCmEkarJdRyCrQ+vxtOi6DK6ZHdwJMtKMwDda6dcBnZYQnKXOg0lGMtcJiM5BoQhONXqb/PhuM17e4uHGdNKx2IhU8fPkouniQjUQ5Vr56rCA2jO3PLZN41kbDf79TXCUVHbT4Bl+s52hbinqZYaDsGXlL/vxEtLCv5nPDHkZCkdirH9u7qM+G6soUCPrulwuBDEYSYq7wDOjyC8YU5ZHp87ECm8xSw/dbGX6KgTkke2WDJYSWHdF8Lv9p0CB7aMYvP+EhhNCG8NP1jPgfD3glVYzpcdOW/mXGc2aAnYHhXZqO6ykXArgQanb0R+0a0suiOLxNXRiPmh+vRnhF5KOKDxdKa23Bf2BTP8fcxwOLAGIjkyoWzL2+XhwKksSr6CwK17iCO0rZAvfSGsI6h7mJq11k5eNchQtAqdPKUBhlzMPcC/ojz7Ru3hjnZ+KJ5NCNoX660DI0eKgX/AHQLyiZEtCTQ6kZzLOT5fF9GHYlS9TD4QtlEoi1j05KRq6X9rA89r/xE0+BomBBppg4KGnQYtLU1ad1XlPKx05m2mIYB14jqL7BwVhvbFDnrBVZ8YQ4Zj+fBjupzkFaIrSo1pYNGlW2WVUuEe4mxJkAkr1HUdjyF3RbitsOo2yBW24wUUTU6sCtHyKTgPe2J08x2ASocxBdBE3QfdMrwn/qUcAjI8i1pvRs12t/FtK1tyv7qHGuS02evFKSQiyUbIoZLJYpIyhOvzYDABEXAmcMEH5b6R8KuDWtUBenJFKTwOj91wAZTBTglgBp/k1DTvjfCu/1MJWQWRX6ZWiG6GneFllQC7VXxg8A7L36uv8e/3tRud+eqqtJ3F4P6S5MYW+cKfTUWz9P3KWb4xGBER2PCNWPPxBYHeKJWAhoE2YsK9SmCCess/NuA5B0WT/cX//7dKG9fZbJ/1nV9mlMsi8U/jbWDDJpzARQOlaQOBdp9S+U8KR9ZRw6+OJrgzVBkIX9hH0mRjc8wjtThG0iYhp/zBRklHcpUffj7S0VU2q2aRDvxu0t90wxtmmRtusUSU9p9jJH2veeN62eSNjvJqoJkTvQ6cTQvXj3Snpv7czG37b+0r3z4NTeWwdvjF6bmDj1xxnjpIQX1dhatyyqVqoYfhcB/y64VWpS6V7f9rAmeHITajGZX07w953pRFIT18b6yhChT+CQgCfQJtAkpU4Kk1IkxaJoFLR6FqSqtLM+98f/Apw3UTrU34q8CEcz9Kz1OV+NrsiB0/5LR/NDtUhiXdgSqR00GRCiuTIiG479HykwP9dpTEZE8XEc+P1XNTr2Xz7459cxCE7M52meOvgvH/gh3dL/2TJ6M1Xik71U8KwrZ9aKR4T/y0f7o3BNxdhUIU+itYKSNpnkDtH8rU1T0OuGI7dmUA82UEncoX9kWA+NEmNtagOXUhRr1x7qMhWu+8sHxvWqaiqNYIm/Xb+L/5owAyR0ythyBEQYS8081My2Jj81AU0IWW/PE2yQM6fU18XiEz27Heoe49e6MWuKoI43iQkwLLw3o1r+JQHEj4p6CKvIzDc04fUHhKnveLcaHN+SdtCslZ3A/aQVLZ2+tAt+Oh6GvCc3+R5b3q4LOtd4zcOoNYEmZcO3epEtDomQWOuDwzzFVuPQsNuGyL4AjLeNke9KOotR2F8U5Q70bUoT6uOLvzYB7425xnxXSw5Gy7613U5CeMFug06iuExcMVgCYu1WX9MSltSvXZ8LbPF3mCHwRdI9d0vEEUpEUei0v10kLFN++aW6gVU0+HEXf/Z524EpbBGJFodmOBwerQmqUGscLQuNRy8sXP9mJK7PXrLuN6wt+XJaRVne/YilyoekhuS5mooRovwYCOAFbYKA+4BfcZSHvK97lefXwxipueQRVIDcYlMIL3c/iaQUlsB4QwVFkr3MkJwbuSuGQ12UEO0TOhRW1GBhqAYAPA22fFSWOXoBjMcdN8fcIgMe1EI8qh/U2aFlZZjz4U+DM6M3jj9uQact+DQEH+eqaBDRs/ClJTxNHYS/ppFN5+8KOA7XzWNW2k0n9o9MXXcGJW/9KXBLpNoS6i7LtGsSjdcDyKPMiw9dUvO0RbjtMJJU4X5WeO18ZOfthrhIQ+sbaW1+P/Mye+XOlO4SaZWUdktb7Z7iKv+J15UBjeyGPzdmoZAMJ99Sg1rOJqr8Ppv0kxLM9eIZUDX77FKx2Ns5pauJyUz5SVyNmNqrcK2aV8Zi9J0p3qehMlAzFngXs0fMZ1mJUsC00O+wDX1uUb1DyiPmswkSANfbSlMzg6fsJFW45JwO2MZBP9RlFr67HbXwK3ovHN8/ienRhHQWUZ+OnxIY8q5TmbvC02dViOKHGSFnqaGO+lwmMdc4rKEE/k5uJucM9F2JZAOFcUSXMJwHqTpRKGpGGFauACCSS5vj9mFxvIcVrNXf+6HLr6yEt5XspozPj8ylG5q+XbfUkhH6x+SG2uK2Oagn2qOcA/f44rfGLZbXOhfSH6wrQ8PBrMGb3bAvUBcZBJ6U+ojp322Nnv0JlVTFm9YRUStmuhnFIiwOu1FV0LQfgCluei0k7YaJ2DQuslWtjhAXW+VaKmpUfbEU69dLKUaZHPXIvc3mMwXWob6e2wADE0YceiIQnjgvoeZrr1Z6LJZGmAmosksKcVFqxMvrtrpULwqGqjgFRK7kNpEbxQYZylnVqBuKGDtkBX7hNISfm9+Ud8dq37Q1SoeXMUoQ/wDkvYxA9tJ5+NGg4ljtnkJqZmGmT0ZfIKol0kX7/ptzkB+5WAmTDBfWg11NFI9XGyJbqz64+7YEb/C3xGZOXJFagStnyUS2zUqWpCe5zPLLlK5D2WZphlGg3gIQ+dMbtQO8zumXi7Mjd77YdXDD3y2zPKwE4CAbHY8izhQNIF0zXzNQYA0H3oN1DrHwDGKoCMIrdBynt8hRIOVpv+4MITng3X4P0ynRgE963zlo8RogeV9phEeHLi11R0aGOsqV4ZwCztbnotGxRoJ/FmwxtQ1X5N6SgpCFs0jgUHN0g7VgJ4c1F6nrZbAwIpSkKiJKy+X/2EKlWBV6lSg8PY1zzTJhkqeg8ZKgaa4b9meXMt9O0iiXfebFsu5z09Qsb6dTm96u7dnjnW2kGehkejrBEPwDIl8JBpKqwVGlVOVDb611ePvMwXpRL07d71fBIWtL9udwo0gK2/ciozXPO0djuvdkjGmeMuQlvN8PDbU7GDuuWOV9pA7cL9wYZ+Qa24dTuLvqyL/nwM1wKrF3sX3g978+hBGbMG1dv9mNbzFPEZS3KGN6nP78BcIejB5So1WZj7Zg2V3T0JV6/9HDbQwvXKe+LryG4k52Mz9S4Ipllnxe6LVFZO1Vh9vkMYIHUjV1m9/2YFizLRjpV4D8LZj9sZ8d8sDeCKeIaLCeMxXtm7EpzDjblyYPsDW9rbugpes3mYQF95H3M7sgYkwwwzUqy+QqxZyvKS+/9h2PqNy72eynwM9ia/1NcY6V4Rq0WNMu1dUJjLvWlB5uqoqvqyMTtBXqznRfnloYW+uKUF8BqWhqTS+JDEvGXjSUHgLrg0GtqiwqIjP03b1TOatif0Z6P9Fz7XD/8J6O33io0WoCFXmI1/QGDXuFuJwokL5yPy7UVL5ogEin+PZbpkIVfXOMxn1ZHlpI8d+AMEjCbrff08tekO1fH1kWuF9SlJObwhyqZvPtiG+3Huo0WtoNwkql+tmNobemDVxgs5AYyzcMRX/w2FCniAMPvTK9JKPExd5+qa3aIxrcosnxIT35ZVDhKbJMaSHgE/E6LbWrnUaL8D0DpcLNyMpDYNXcd+ZGD7ARCbu0wkODEypjnJiNhqI04NjEhIdlcEEMeC7nyT3//m76Snm9ELtFo5YTO29DDBYZ0bS60QcWt5upPjsmNPkLdJQAzoLdPPC7ishXPc7hPd9mW7LgExMIJq67ipQ/NmYsFDIMrSjDZWOazvEK+Tz54Fh9AHwk1tqdn/gi7tnpQOP6Fy8PibnvOyupNx97Hb8rtVlRqzRpd7nPpPr+ek5DedoAsK3s/n4ZK2V5tWNHy2op2QI50Pflnkr7EWv0AAxlqZ61RQ0/Days+VGpjLqTz+SQfI8ItlHa21hIDUqmVTaUWeRo2QwLGfPP52yf49qmQbVht5Pw+Oz2lUL/3cZYcg3MNZ3hmIk9x71G9Q9EoutNMa0JEsPUGnuA3+qobB4tqYpprHwrDPnJRDNST+usdjsWtQIDLplFr2Qiur7U0NS4SblG6vgULR0fR8COmvNK+xiaIjKafv64ED0+XMTOo8cXXSFXyoDFHT3dEhAUrvXTJpd600N6KzPD6rT+RZ+PujyA9st2HvLwaisdNUbukr7rSUMsuyXIJyENqzZ5l/So8DRqUkFiKNfM22Afmq63Ub7jVHorPFpiNk/jTBiNGv+IZVpnrIZHlnlcG1/ztCU8vsiTjCP7KFs4R+AaTz5LyE/5z5AHXt4fO8/+IvSWfxyN3GPW3xG1Q5eKkjJRGcSPNV8tWSnjzuvM9XgUItppbEyXuhLTIbZUt006JZ9gl8ucxDGH+vkBcRJq8+diuQX1nRazSou3u94s01roTtvQ7yQMRoXHLk5rW2wrQnQbJYv4LSqdNridz4LFQRpNKjjMbppIao8bRZFoqHGOUCJXneBUNaOGGG+2dindNBcsZfWzuy033vQ5JtTmPxZMw+u8Ce+MzPXm+rVVaKHZnS9AK4KktVUzcXtfyjztsGZ5hinM8rI2K44HG+vcFe4iAanIOAiUzKOzHweK5N1jriM2jJk6aaiVzfaBAdrEBTtUWaDt3m63sd6LtuWE0eqSSgLFVlcq9oGqMz7CrosnNxpSZ3A9OVOs1v2eg7AR7XS4bV7/9HLp50pIXyrOYtdbyTVaV4PXULDzVTY3lws6AQpuomSI17wP9ogXDYifDc5sngteUlgSa4iFx2p/P2IX8LbO0WratGM3SDYW6HlToyrI0auip25fUveP6HuDXIU2UwytUgkeP2/xqHtxjIuNqvWa6bMKS6eBNEH2aH041xstStA0xuy/6ATxW8nhK1JQVSDoeK1Qu0kQqUMwdX6NLNu3bEbzuNkSXDjTdgnLOV67olU3kNJcdLZk4vGB9n3vHyYP3QmGNkHDTY4vp9TdZkeJe7935ex3yZbOJ1FJj+LgJtzz0GGui+0hIzHRIL3C5n1JfxKlQQcqaSpdD4XYRkNHSV6sDGu3vP9BgZWreUq2k+Ca5cZ40aPR4t6mZ5hof+ZQ4tKVIz1G+COZOdNNGc9iUJ+apv4GYSnVYq6MrBTEurXRGAoXPtFa6baNaAzXDnFhkIqPETrrBXasahltd3y80ZPbk1JoHXzUyInd7R2h42hrmtC2jqYj3ZbEuGdEp/A76Eq8p7P/bikd/IIzmq03D/+d+XivdH4pbBntNgsAVXP13kVQpe20QwqL5QJvAm5tBylX1PlBL6NEo1lbeQQp5VsVCk9JzkM5plGGPK5ZuW4xfAkI0XPjoI2lkqCKIc0Lv7AFWF0Fw4VGZtVu305hJeASkRXh61PaNzSQBDfGvypJl6fp/2+csqWfJYCbp9+w8Qb35SjhqFD+VkWaEQflMk694fHXzr0OHm2kjd1ot08AsZZR2k6aUrCfenFjaEbTjmTeOG4sOarjpdDYLAbqE8Iupt6vfIcPfApWGTCVlsp3LW4gXSuVMyXifomhoROFqejVFH5IplaEjj7EPYhKB9zFhaW0Cr3NRH9rFkwF/V5ADEWszRl63JohdikUmLByeGHRMhcnQUardoCIaALQnPSFkX0ZixBGbOjxzqZWmQ6hz7gCtsARS+zA7Bx6IJLj8oJQBPyOKyMIJu8lDkt4IN1Jshp09KrJrrEGx9/bkUdbJlkwZgmMhruh7Oc0hN+O2qiOIiCqFI9Ff+0I4zzjMInjnPJ8sl8bEg3o/cRwAXSDwp/5VMkMr88cXyA4puTS5VT6Ik9XALcLYjvgQYfmUKUBR3tF7QI2MDaBPXwn6N7b4ho1SmFUGvNoTp8d+6hTK1WojuxZQiSofGgDHCxtLowdWg7AgpWxSRyJUMiQ4swvejBciKdH1XYSG1L6kWlsOdEWe7N7knZYjKNMboqUA7QVppGwc+tecXb3zBqwSgaQYJoDmbk1T3ypqNSLhj5euX9xKtfSo6NZMXoL5BIus44IhKP/Q+Vb//APMsgd2lCAMZj1wxxuRhMkNhC29ndYZDw9Y7p0Mw7z7YdjoWF3yy4dWdjddFdSq7ye2UIyZJkSmSJE+yU1b5DJxWVSJmZTY/BYSPHB1I5Nhz93yxh1cZYFYT77g+fJ6M+eFC4X+DuYNpdGf3eybgroj+hUyjiMI5dCKve2LWq93MrVx1IpBuXvCH0dpB3IwRy4xpQEWL6Em7UGmeepW5irMfKbbrNfx1SjMkq9Dq4dZQBrJ/8oThds+PVPsPaPBDd3VYO2DQvAJx23qm/OdSrVg1GOvl+gayE0eWT7HhYBA/fbwmkFLf7g8bdK3mF8soaN0Vutro82NB4Zg+Hk3XFyEfD2dbTwkz7/Mw00idre1waWmi5hDi5NWJOJjN+KBLA+MPHJHujnDe4qJRGbdvFKlIDGyK9C23dMPXbxjtIdCb5kdxOmowWxv0+ZZl2Kr2EiuzoFFZQGSdxxymnAJ+W0ltLNu6OtYkCztXKw90fLqv2mmwhlQTLzA6fOTUnTyByVQaZGUbgi6inz030dgba7iFOt8fZgrv84UnpY+JQxeyCB+2/47Bp0FNXa8PKdRKtu8yeiflYxTMxOndwLCWxTsV9r1bYNayLQbLKrsXO6ojxHkZ3KcSf2Cc6RCayz/dIOqxXyT6L0JtoyQGQPNRXwlYOQFEf6F2BAun4pD9d2XPTjTmSaST0CeYx+38A5GbqvxEFzz/y2xp9ArmiKByRNECVLuXXjTdr4QVpTX80c/hL8BWw9/Ut7qpEUHeDHPLUe2R5q76H0+M1o/GHD4GqMdhLy7+RpnnqgQsEu2/1+tTyebCF/VoyGz/iEouyDMI5O/5oQ/96ck8dZw9Ghtg+Xc9S7Jct4RbxSZj9PzTd05CnXin0XgkLBb6Waqnt8SS1iwmqRRTrLc77rL9EzV4k64mjbfTdDtKPPNX77hgx/S50xYe7wImix6Aqe49kGZGzIcn5ZTQ8Utroc/UZ+1bWoZNGTZc7b99vYtLvbXUtTcmNJyNjnsT2XWfe2tgmtkF5yZR/HJEXkDLF2PbzOaykCpwYqt9PYlDKqam22VMkSUFdIVvFkGfFHs+HPK6G2N3Ack183sYJAddCzOnZ4lvHVDZgOYfyvvRjuXMqh8AoRi8z5dE5RpyBhJMKhDlhQdeAOFQHlUKctsiNQNEzaiptUSj3QiOvxykzPmKfMO6arbbKHj+2WNREqV1to7x4WIIgUpTeZ5j+LxufiybIR/k7otQMyYhM3pWBbC0iG6rwAtkJXIL1LTDHm0eUSW1G2mk3Ax/rZlFZ8v9aTes/qHIZYrKRCNPLByuiqIAmMZi24rBiR0NiokDB3YUeQTCxzCuqZpJLyKKFYRpgsW9v1VDAG45PSmmAdB8D7qSncS7Xc2XBQnSQMfnRVlNiRZa93T6LgNpoQmcnr4BTNS8yPCD6SJFJCHf16Z8foSnmt33zvdXl7z4DttMlusLnwbHD4tEYLaiNb04GvX8SoUKkmdCh1i8/iOPc6DPLGNg43+HSeSe1uSPN/jvl63aj+1wQtBFtr/5FprsWXX6h4+zcoeMz7evvz/it8278H2JIN9mzARs/BV4/bx37/NY85cFKCDyUws/X743XroNTZZynytAT3+rmUgxth1PvynIvz0TZSoAyHCjtU0Bn2UWSwiJqIOpULf9ycRb4PguIXL7gx71NIpoTbFSM5ICrZl5l4v71ckIifmMtRvWmvWQitAieQUc9IRhSC0iQJeJpKRLDFrU2SmJahWRToqcjMiZb1PqmrV+U9jHzKwET2XCwuwQsH+ndAAI5oG69qEbwq/B9tEfPhDmgDkb7VDQXzj10bxlhbUbD4CksJfTHO2JFc+nFldL6qYHiIkddVhcRFmUp8rd2zh0z92qS8mAWiXnG8IT9aSocU/XYTxkjK050hZV1UVTIrLuc1O7PhRJTfbq24/caBqjzfTn7Hp/ygFGKMrnXdhNQnFoKESEQ40JyiqlM1rWrLgLiqmhKQJyxRHPGAT+XRXt7Vphj9/405F4DQ2lQz+mIFUWh78JgVPUsovdxZ25cYAMWJMR9cR+QEzokcVo6mXhquXRDe9id7wfM2HP69w/HHA9U0ePI5z6ItIKSz1VIapUqx00CviDhOJCzFZc8nzl0IxuQwdKyBKZIlAlRhXgPqIf7b+o7txsyI8+9aw9itVCJT0qjwpb2wFZULpeX5ZESjqUwfoWw3E5JJ1FESwpoNLLiZKjHYijqtSnbIp+oLWXOikSylkjbi4Xr0KsrsEGBrq1/o56Xk83rR/BGvsTamKBhNXG0LIzgLQ8hqeahrWAQe5IliKueVHAyQbLR4bu9LmfXQoE37A8JMc0Bowh2o2nO5pHJQBQfiJvF5WgXFkSEpp9WnTcjWP+i4ZU4hx5BIt6Q3Fuwdu3P2LHwaeZr+6an2skvu8WkfME6izpNUiztjjm1ge0GWeIcSdNnlxzuzlTyNk7tBOg7h5T1oC5gF9KrfwV737VlfVkrrbxyvh/sOjbPD3kY/R6HISGBL0xBWGW8C6TsAenT4NtBdRHkbRmPmJrYN0st9rWx/2Je10vwYrj6I192m1Wg5+pYUFmWE49jxt0a1uU5U48bjK1m7sAnYdTKiN3COognYUpOGxc1FQHnxC1YJdxbiarg2iIhMN2WpwunVJE+VcMkkxCmFiK0a7CckwYg31OF2vCBUOoyNHn7VsUBGWL2Iwxn/0ZBv/HcOWW4NrOm5PnH48i/Vre0MbOGobfV2a/s4j0bfP7QbXDdgOo75jIbs9pO2OgdlIWvVkWV0nJ8Moq1sbAmXFLY0KtuI0Z4dUo72qkqkG1IvzotAVwqtRTBj/c0Y7Ri12M/xV+CHRmX0MbomIZBhOEcD0pTxSqw94kdFERV1iCBR/oMh91DI6PJqoxQeBvvsUWwcbMzqotBs2laM6pXaNfXVLIRR2FQMWpqrPQga9vy4YP/H5db1D8moTaTNnuK/BkfPo+H91i7CqdpP9VMXFeH4e2efSu6s+kexe3sUhGyikKf4yIZtOTyb+7+7+4mqpE05/9l8jTWJYDUcBITOMHiUajKJxZ/ZVU7oniBQqLDwW63xepCYoVWNzeUXJGhrd8P2GEPm33a3JJkH+cZCxT24+S+EOZG+32ot7XxKLfu2PLYvBgwMqkgCHNSUZZU2OlSUBgWWJ4U7MpfYq19q0TKBr7Yg5eyqjIou1t4lG+0wi9dMi+ukZp8KpQpDQBBgmhRMDdc/Ke0kt5iQU/twV5X3S4VDgPBJMrl4+j4lqUkMPiWFmDrHyUCR9HofyqGvm/2ANmr2HWt8YK08cdb7KAocjhZfUtxJgUvSYH6G9Kgbnw6SZSdHL7TlDb6Ug0tUeZjsF+Mshvv3fM9v8plv06BTl33tJTw7opkcO2RKA1bQTQPdICbAI3KzQHzHJuaCFZYnnEA+afdqpp3eR/jSqXWaaDghmadxXtkmwCOJodXIKarXXKAzEVehxXolR38xRDIMUlgZy8ntsaYTCp+UFJwl1buAWsXbI0hrQEWnaGaI4OGbknlaQVJcO/ozvdfiCr6p+rxceG0FUTD8pnmUoHHyyzYrffTwAFiyIAyz9AMK9nhpDj2vEuauTrhEIlf24SZrA2ZSF7nG56+4coWmqHzE9kVKSunCyQk3O3Euhz44x2V/FJefytWXfkwnvvNcGzlTjnNipM/oEnhAE3vtf0Se2YpUaKB9ElqjMKSuytSU4auaFcMB5FemlThpMCXHPWwzDTaUkHSYEEXDV4nIMVArGu8JqtAdzoW1yoTR79JJQMceCr9O4CRlQqdxvw+wHJqIeMpWW1FnV8XM6vHOm9WKkM70h9NLHu52pqoeJ9hQSkx0SsOx9smJNioC6PeUavINcAFk6ge6y2UfcgOrM3IekEeESDO6BZ51sDuL9cd3w/ld7pbSESfvMI7npG1PaxP6+r8l99yWvMS/PPHarDyqXtSI0VNTO4vDF+lCfV+s5SO9U5MulUo1pou4+aQzyfmAmUGdM63ih9I0broRoLDYmSn1qpxCUhv7KRSlOHcv3VyetQP3aifZZJx5uWb6tDe37loxNDuszagZNBgFzeqm+DL2Sogd2kZuamtxggUXYv3+0fxWSWPSTsbLR9Xvtnobg+FMAYfF2LPS0NybP7sAewvWhunhu+NKw84hSx40DUaojGmiXVKZJ6usTcEiHGadkQKBEElHHoM7faIBfpuorXrrKIdJY97OdaLLFXTfaYoM4SJ8toAHhty29ACpBux5iw29FEEwWtyr9EJuRJb0HNCHKSVkVNB0KIZCCJhzXXLxiW3apcpMkKs1s/5/BXtAwf4v0hhYEvKIzUlLPLjMvh1hB7xwIN15QU2vH0a/qRP5T64J6bUbnV2lUbPPxRRGhCLRVKGyccVatICbbTy/XSURC5aSEFcxgxwXFKPqX885mY0QMF4Bc/c/VowdufrEkyg3lKIPjlvVZ/0RKuxRDARvnfhf7DoRXeurI/vK9FV7Om9HENzSzyi1LjnzfsWbHivnhdQUv4ZAu63EFK7ToH1mI3Arruc089qbEgQmlcao3IiOkgbR9kNyjy3H9mNoiI538+hWS8jyCx1gUdUcE04AdVR3oxFuJxLvN5O1t7XBwiJH/JEsVaCdcG6+38ikEXG4wRy2SG1D/5IqH0yIh85LKlTw/di2XLTr2WZkdSQ6RKEdMQuyOt5elpgaX+F0OQ4g+3GWXI930iAqU7Q6fmEGjeyQVOrkjfO4YRhaJr7fnAmAS+5B/UKkvG2ehoBt8UGxW4Bmsr8oliSgFtZW4kIdWtVjU1NEdJzWVDNQbXIzyEWE/bXgKami7iVhokitn9fTE2J/TdqqdZKW54eCZDd8vsjXQqoYuxz5BDD+u5s39nOl3urVd0zk8ySHnpTCYVm1eFI5TaIwdIGQ8l1NuIBVDaBVGxV6lcRx8Ybl6a9LhqQBtJpVFj9ULLSIrhqpvcH6u7dUvA2V43UNxPYMjJtM2kdADLMptKYPhogZxjRX/acLsenuIYVexIr3ZfFZu2lh+3CZSernvZAWqWqHPo4HidTA/CodqW+uXx8T6E+NcOYggNVFS2vrC7k78PvZd4R/7/LzVcoRRtMwSc8N/jyuzBov/OGtSz8rMQaoV5bdezaFFO9ePSyEE+99k0kt+eKMwkQfj+SJwhQ79zhTJrj1WzK77e/H9JPns4fzLlUdIAZvGK0DTc2O75oDH4d83b++61KqFR1Ej+NHAZb09VzjVW45wB1xpfq8QUVRuxz3vABiGKxWCyFI3cz3XyeFTWEIZAERyDh9+1wiCfcx6QbqPX6P6KlywHKZBaURumLX6wliMzAY7ORHQX263hTscFqsXERfFIORWuWSmRv3s3FM4GWgLttC3z9X0vXlkIgxS9LrlmCIsXzIb942loh0B/xOKatqXB2rkU8fcoM3eLIER52hMNdjBV9sqgtsEwzT0Opd4qVITRqpIhg/Oe8eWzyKG6sF+Q+B4RoKRiP2yB6xFhjp8gGbcUDT4SGH/aOhHS0yyBpNKr4P9iotn8WTy/vcaX4Lx8NC5redhDkdOeEfX11S7O6OPxZ4Z1Bu39wNhHbZiyABLpQmCQ7X+cnDRU/q4U9T9fQtfJjTlaIh/ey38fhjf8mIAUwoGHghKwLuxAA0yRb2v3HKtpTP0BSiaK07yGMe9PmGFZrtVZX+yHDMzGYONZ127sjuZw62GVneratpP2zPt3V2jFNVJuHPXmbTyu2T7yliGBm/xiOJH2o3oPlgrRhtIiPQSnm5/eN914M22qpP5SjKHnIfHFu/66Ma7FeQ00Dqj4oyQ4e5wQH7ewRy9UhKUSVyEyJ51SWz9p9cBm182XYNDki21b4AXcmKFF8Z3TgI5HRbLwj77lnPvDjX7iVHc0oJLaduE2+m21OkkzbFAQ740GKM9xwMHinUo0YVUUTBMhJvZ71jFOfzVcFaHrLEO1TC/iFedf03wgaV3Bzvg3jOjp5YRZ5TfzDiK9L/yVXJxR88Hsuxu3qArhRvQZHJPZoKhFZzuqDMQEL3uFMUwgFWhSiXP3K5BkbhmQ1qHMz+vFqyHXAcqx+AKUGEYP/INN+eWSuPtzeKaJ9gM0/K2URnhib7gKH46f33isQH96gaAiGHEAHcwrJBCUW+x572ir36StmcKQ+mMNs82Cnm3a3K9sS3uK6G9juyT9wY2lNslPacD1A9IDfxVrt/JsAHNC+FkRrdJUh3MSdmcGhccnZLFrzxrFw6CKBNvdzV93ODqmNE/2Z+cJZfzGsNuxZ7E4aUljiDK9dTRLG4GD1q1uYjcEjFxwtaYdeH3KOKJx4E8jdAKrVGwFWtmGoRgqlynujQgpIpadmFjWTHXnUsKgZ/Nce1Je86eBuimV4M0jKTUJacRifwgfjnLsvw9H9RV26TtJzoSw4aRkwZ8Ix4PmBtEt075oofdZM7MUKrrBDOMqQOZWXzYxwbn+QiFBacJw8xN3T4fbJkeOksay8WwQWRPQTMHuuD/Hy67M6IWb43hEJVHWLD9CIfA0JMedsWtUN4YUugnXjzjP9Cl2tO+wJyJi8mQ3T2j5iWKUa8m4yh+IQSkH0BM4LS3VSMh3yMWEhtyhhlquBbQ3plsyPwaPU7vaQczlLKbBlZtpcUkIahUhyuQR28lNfMg6YaVU3p7EOe/FwQ2IAkJd0Ahl7D4rfG5V/f+cGaGflKV4fM814bBCt8fTMRK4mKsIJDXp9qVMo0gjugnto2l9sn1SbLqqjAYGyGEuyNsMIEgnv0IdUBi0FGDAy4plSyScbLb81lFAdziimOFwtk4Rky5OAtUlGV+i5GNZe36tteFWtBGKD4talXIOGmT5pqd5LUCQ9JEGeroXEZSrVT+4c/AiveDe6r/C/XXTvvW7OKTcoaP0mIl/8dl0Micm9JaUc/nWFVw5xb+B9EwOB2LDv5d6EbBxNyyeSfw+FbO/3pp2J3jsERO4HAB339UayuvNg/YP5XXAjC/RUEr5M3Qnam7WcBU23DkkBg+O9KO3X1bZAfwE58OKeP6Uy0l6XXfVPvGCojHsvlvc+gkKSnd0U24tIdU15Dm9gRsF7h0SmLQnCLGRAwDrwkc+wjy6jnQjUvuQgWc/aAPo7prDP/RPd6qZAp/MtjT7CGjXnUNWdvzRG88Q4ADLIcUTToL4pCKjSuctuFcYpJBY1+OanQvKdoVZLW45cYyjhsskWJCnQFCxPINWJHQcky95AjJ5jxKz39wgMal5gR1CcFkmlAmXnG1Omp5VtQ9db0mp+mSfljZpumAJkX7tRXmrrkL5sb5D0SDbxBRsNGotZyvwRs0gAmMou806thikkiHicL/UhX/PVRJ6m+bAVStooM8ge/a5iTj1NV4Ybq8UrBmvmZs87TYm40r3qP7d7z9xn9XN8KrpZaPPsUDsCUVU4p7v93Rs5pBXYw/h313WlnMzeCKfGZ4UH/Q//yL1+oNn8+hvaYQhwpaCzirZE09YhC9j1Kv1naFJ6zsRi/mcVv3k3iKUVYOsIWGeElmdZfYX2TSWwUgBm7QJ9s8yqlipfPTK8nV4I6m89jlntJ1fpESk1vvxX6NAdMZwK7RYfzYVnqd/XTO9C3yIAFoz3OLEpxEcWiKTey6UvPyvH+OOjhResUZJGphnFkWyEePTegrgSvSwQzVJMxveFKtauSBzQ/aH51ftCHE7htJGQK1FPaGmXrFhI87tRokrqy+RnlquSt/kidRy0VueZmDsnyddvr0lc+irFdjzFuF9BnDG9+JcBVUq12cy4SN5BHzabVAMaRBXA3+Wp49yCOUuQxsdINKnQQKtlv405u81yu95/xhk/BzGQf0DPDEduPUFYlaSm3yywUHHSz8Ju8D3RN8DiQcFjbuxlwZSAGjBQ5QrNKnDyS7Zo+GLHsCgeJh5TiZme8jeOHefOHUNwive7u+NuWZmpUSKfrioqD1SYN51IhSh0mzrB+t9k2EW4yk0x5hN9MdDO5wYKW8DT358bUI/HKztstiXPd4wF85dTEzsLups0BKyzUN6FzDX1LtfcvV1id2SXLmfnaJp4vYPNU2GS+KPL7xGNpEpoKTPfFnuLT7QxSOfFNRm6YfSamnPHv3MqEgu+Zh7SnpHt2kmNTPLJybJc3dr81mh2rQvm3MUhQvLutHmfOlcz6sCDNe2ubrJGszZF22w7EVB78TfbtXzHFxD9PtziO1XdO+8Dsv9blepYUL00cnr2nHj/tC5saTSwe8fenpXpr4oI3nKUXVBRDz4RPIl5WQ7DCXEy87X0lWfkDyWT+FLVOjUV2Zrl7iMWby7GkFqdwQRDtL05yKyu49xJG3ArEwuJOvcjh1NkAUVMXn2tA87ZlaclTWtWKRpySqcjo9sCGpd/dOx/ocpqbFBzLrrZMnKx09mHNP1mZKf0nDXY5+vrPF1ckBaEDBX3CjQtif99kx6TrsQ4JpUe1czGVuvI8LPR98uIDlcH+Z/9YMN2Xsu4Yh9smeN/MN0VGN8JNsQbqDy+KMo5W6gUIS094bN8wgeg23lwXMNFVkeV9kzLe8GZ+ZMP0pUX22EfgHvif/Q6Z1aw7E5vW3JdMzkYg/n8dyDcAWTOB+/n6eyMxWl2ekNp1DEP2EQVcV1bTbW77rl+NpyEb9anahOvksdDrlzlVadzuVAhqtYekElJvfGeKizVykWXGmeWXikuHCcvTxw2rP1+EFISkZrPHexy8jExozFg8Yr1BlTB7xVaZ4eedmX9psmgcbaxEbRtn8ZosWGfYjcS2Kunxb4uCKmr8Xfm1omibWus18I5RH19FZp4TlMPrOAtQdlJs9Y8klZjAPxjNz7t05U94jv/Nfldg/911ii1vzmo+Ccob2CLju3TZmZICX5lK1nfXW0YT+3SCyJVDZjMBNFXlig6vXpm97mJ4UpFU1CXr+ax4x2s/4RTPWlThxzJP2WTo8RQZGy2AFFu2GVWK1qC2O3ujxsNspmK1zfMHFDBCmZBd/yQzKugIiyq6IrhwUU090winvG2xAEVPbDSXLLDtJMo1BZzSGNcgXoVROqMITeDDxzanLqYTNtLy6GkNv8V7s69ioUmTW59eVYzo12NveBdosfyZ22+rEPSvLjLvejpp8zJ/seC2utrntmtuaj++X3M7xtIApseA2j0ynfc9UdFHvz6yxH/fj3kSdj3fd6LFoJRyyADh2CN/9jdMZRmXdDbgc+bCTZ9x/6gyTDq2T6HLWJssmgUOcrpZEIWh09C45t1f0HIqB873RIO4EIpioIRB8R7ob8CB9Jy6okXoOfHDGB4b58fHnZH4dmoaBdsl2APvH1N3PYGoWQ4MDaunUCo6VzqsTqf0SGP3Kgx7/34t2KTAtX59e0ltOl0hbrUwQ4IRJp8edp1KLZE1oTdjcqTBHM6voCe62MfZj8sKqMRiW/EzQh6NB88mbN6gKW86i0hYyIRRl6hR7qQH+dzrqb4kBenQv0m8h8gplJKUL2xegJfeV7GHnKB2CtT91MwLQ++WIq++QqUGwTyC2SXnXSvLGYRAT1JJnq1AvAW5VoFYC6esfk2xmlRafL4CbCEEFHM3NOicaCKPwJOMdIHx5KIzt3kqSuZ7Qd362737lsf41V1O7x866G1UZx7gMLiEp+k3LwYRLKqMPQzZfvEei3FB7y5Qa134qOXDI2P/uKE3jPJ8wYz3h8heygu9JvqjU4Qn3mDK9frA3wtRkP4IsXgdqYgkoGpIymGe2nzr2EiJ1TXKNSumkjOyh1+ycNnD1OWIz/CIpOlWqF0zWqpLg1t72oi3zGDB2DW2kuk+Nx5L0POZE4XrhA+zgeR32uV06oS3gwUvmj6RzB3lBXLjJxWuyfzSJKkFrF6JBMoGPYhITcB96wHwpnqZtKTRsirR0jqAI9JyWN/BPZzmELO8KMZDFkqjgF+3Fkk6i045RBuoj0E81NLiqAMjwNd1Lb7Hg4cyIfOYK1P1Tpr7ofLXw0axwwpT7q7zmRgtEG09RJOOX8iNvyB7taSHialggZ8OqkFu7yYXYRTU2sOZyjPEDZEMTrLfqaG7LB1KnG42Jj4WGY5dhpZWS2GQfmym3HP5NYtfKoYygCVV9Vj4Kw843YppHcP10LNooeXV3o5Pw9aRZfdNmPKW0eHqqhKkQNOBOa+q4tFlRiLpgVKz7KQJWcgOzlXfytj4WCDcB8WbGKQL58iA5cRjTyIQIAmXyNm4eG3XCjWx6sZxEcJF6VrMt/nviV2cIWaGoYac1D3R8+Hpl/0Qe3wjIF3lXRmMcpkurj5r6z7YXMV8bHtMy9zTXYwcp5usatQ9YycZFfnHsW2jU/tMNZ1/ytGKwuiOd4mFCvxpkj0ws2BLwms6pX8jpbiBEiup2LDn29ULluPobc5trU/2YHjAZiPGG8x1/ko1rqRSYze0WWuWeikjP6dc90e2+2tMR15nMjQ9eA87FE0NE3uyfej6fNRPD+owv4ziRn5yHY3Q4FAtl3Z58hUfVF/T2J+oBulMvx7Nm73IoboNZWY5cDJLsaaSQwhGTOCxxJyhDivLxnJ9uaCCiaw+6PojVx5F3AOiEVmxk/NxSgIy4eyO92DMnf1Y33MF4F7MDdgRlm2gS/kldsP9jRA58lBd/Yto22VXHKeI+d+U10dPvervumVOlH34rwQ51dad2adbFD6GIEab6744qQ1DUgrcrUe35NU9Ihr82nsIsrC1bRtgHuBWTt2ssq60szCWdYzchJGS5Kpmqsd80JBSur5Ka+VjJ0ZQWQl97DjlvJLd0zWKx2/irr+kEitK6GauI83W6zG/4EGoWwACjkjYo6mPxbt8V+/OgJOULwzvgCY+KuagYvigr3xBINk53evrx2aFKL+mzx1T9HrxwKH9nZQYpOh55b3t6khdqxc3nxiiDOte32R+q7NYC+yQHPdvJYn31wc68ceYc86gFyERZdV3g3oiIqfiRK3MAQaDi/jz++4nOJwlu6jMyUaOfiWS6JBps7QXK1EkecZB9RLl7IO/LGUkaXxj7tft7igaHif3aEbgS8L/QOvLJ/9h1hkY7YqlwSfxsHjIRFkKNZVOPirXRHfcv2jwMADFY01XkzciXCQQ965Bz2EDuayKHaZDD4tt8tD2FMxPz4HRAJ/i8Ofocs8nzuBsNAuzI8UBnz4ZsKpnyDsj0+entV/5Zh/3SvI7/HL2qD8P6EL5xMEp8XKQR/ViMPn57VIw30anzEtfVsQFGzpY+wMyr45zvMiMWdBFt2DiNznjEk86BXOio0upswPyHlUQL2DeatmwMFpcbPQLhtB7UtrOJhWk5Lmcm7RyL7WqScymLiZVWPovomPCJh5Nf78/lQaXwvqYfo08qvmrAImmnC8bNnBY/rxqhkCSRX2KRlQWZdpnnh9h3L3+HOH13NzMW2C0rDUUKP7E9RFQEqqyz5+wXWZaDAb+i8AdZcm2/SoR25p9SohQrcGBvlkytC7G/2HT5lTOnhKKcN0nreB64PGlIB7+71+l8jsrHda51TfP21WHdu6QpWXfuUd9ek5wMlrUMdd9QrhyYl/1KhAXSs+PFXUIzBWteCoRhjjd9uvzMN3W2SJzGdY6PBrkgD8E1hENYdG+mrJlWhYuOQA/NPu+rJm4IeDDwDbKO3QZK0f/DnN9qakHdDpKSZ0KXADT0Y8VcQgyj7xgrAIejo2mp3nCFz8QM3oy85fFVsy8u+aDT/gXjznm52omDQ3jNk+ZP+vpDdQrRv/7q48q4aByM5UrvxAzOKzdo6if90wRPV9wgrnHw7uIR/cKF6f+uH1CvCw8Gx3SZu+rUf7n81c2486H54JtmmrM/ChhRQTf/L5OCQ+mVCwn5TnvvkLYmDl9jkdXmIgU+d/1azyAD3pWV2wea3XGmAcRt0AhserZKzrdr1CE60WpaLPBVIVHhTxdC7mr1LFjJ3rA/nd2RWcDdBYHOqOGcYwUm3FZ3x9/tsKi3m847i6mnyuVT8TDOw/6pSEQM+FJW/mMeDnyZeg+KmJe1Cwi/8Xai9HVQPcc8UHn4jYsOGDSp5w2yDw4D3OIZ9sQZLAuw0l1dP4DT0KNeKWgsxyn/VnQzBlW/ysgDcPme0+7+3a/PqjLzd51NqflMNVyemsoji5fY6yPjCC3VzXdV+XG/YpRXtzT9wvPES53zu52xKaqnw0vG7P+tYw4Q+HIG0BJWwReOKnvLkrYW+c0HOkDXAzlvF9hrYc3o5JMeBwrxhIQ0mrOMl8GkyYalm1iRMz84TXyVQxCFWVidv1Ub1YZlMd8SG1SxhMF088IWypc5rfoxZCZW2LRlX+g0qYh8sm1miq8pNSEj7QiG8Jhghwz0un1d5RxaXmlczF5DfM6owmCR5UkIvRsl3/aQZ8mtqG9ayKve0yvulz5wWxpaDWwoS3uz75TiuW+48dpCquVfTx5ZuqeTKXG6wqsJtpyTBZt226Dgz10saQiiPacpJUnck7YI7nFl4nCKSBymhRGeeoyyovRsKjWQNk1Jya233Eut6YaejQu5pZYiDDZPj1GJ7GgUkwdhiiM6g4ksJ4T9nEPYiXDWyTsoxr8Od1fR8eZiPCKiGVFNwZmXEwJwcEuVSvMMwZSmBcy8yD0B5s0qXK8pGbC/n5qpOWGl5OzGfwpJe0M72Jr1bDA7WBRJCz/B6hw/90L4WdaisMKxEEyujHcYAQjRbI0fEd6qpNl0/UESiSUck+NzTqzfRnnvYe77oMTuNrfOgmM3OzQyF45ptLHWYcf+C1ZBii6MRzfhbYT2V3VfwLMxZ/P0mxpBA8NcZPEzaK0+ZUnT7ifCyC5OeWWtR9NFOYozV9lOlhxtYT5Iw2Tvx8n9WB6rcWlIXqv+XGVkawMi8tsDhVPRSua6GBRmLQQ0Bn2m0jJtVbrw8YT77GTii/jdMM5Lqf/HMSxYfu8G705F14zfhrDJMri22XCio0vZ5s9B1/r88f3IKN8C3MBoYWbSViNs0lLKCcOTpkQ5edZR7le1+wMYYAuPcMDmdhhjDEQWhzGGGMMIZFxGGOM6RLmup2kW57luWa5b5NMzTJM8mVSEgToc8Y5YAQgJa6zs8RxSAyZso4XxyH28aoXZxRur15oDSOIWbYkS6+ER9zNDBNPZlKDQEtLPXS70kn+rHzfeV0vKL5znBzOJnhUWKXfklm0kDn47NAQ1qiXw1aYe0h1ilix01WRvDR+AWOR+lJDOaa6Gk9ukZNfY0STWix5joLcEqtYcx0INU+yKjp1udPqDXR6cRIDZRAxM6BXXwudeYS+TbeJ7TLJt235AuDhxQ3bHSkCz0u06mfSgfL8gCk337aLdWOf5Ub0QHm2vBRLNE2SpSj7LHXeODQM3T5W9mzmO7OsYcAcpOda0thYN+16terB4kIJ+nHccifiRbw2sX5NishIM+FJlyDjHr8s4srbsLABmqRLQtP4gHae9ngdpArJYuafJx77u+zLc0vsUP9zse5XyOW9eKTkaYouFmKI8vN3BbEp1dfCIWcDMYnOWjxMHWFgDZuQgdA/bXChw82PUqVbp9aLz8ZJf1EdpM9jckeLs2vB/vaDwUdIhzEMQ8plNu3g5xZz7hmYpSfv3GKN0wu+4aeN0y3OEifN8P7ua3iWRKNrPpN5DKRFQZ56jA0YaRLM6P2mXOBQ+mCHOaulWka4O3OKuA5fyJowv2alnVG7hDg4D0iYD14xu3+hsEi1h+5e12YPmcEyOAgG1yEAHIoYupFSrPAfKAVFm1WETYVeD7/NVbCov3YE20LvR0mOwc2yJy5WuEIpr/LgU7TjyOD+aQ4upmq/GAkE+emF5ZNxamy0qh3HBnnG4TR7Y0JwdiLMX1+y2eaBkDnK22BmAiHTOHLmDuPCu5ILunz4gXd/KHtTFY0iBHbs4g/onK7VNPrcT7YlJmFYUNPoEHlpNmcIgUWYGf6CvoSc5C+3dm5wZh4wrkVpjJ2hbbAYqijT9OLCZ5GnjPFM4EIH6drcGE854DCxk/RC4kQs3Lv+yNj7WQjmAiONmYYx6jkW1V6Nr6QcNxMKFke+roPIbf89Y3+GvcS/K7QHDSdBZPv9A3V4h8ISpLOVjwlJad7iMJZNH8KIDIwM4+S8SjlEL9q6Mz/9HptqYB2Rz99Bj+rHoEVyZZs9ZOCGK4iE1EW5NI4o1wUja1whrqEQTwggnWwdF0UZlOrS39tsjFsmqAtbphhJVb1RSyf8n66eYP9eQIM31WaKf62NeiQuxauFVh9Nxy9Pa8PVoTqYGbOJFLeNbhxD6daUfHT52AfhJ7/LKO1WSLpxakawWD5SU7qxLwglh6hVQBYLrOvrpbnyXhSHUAKx3QbVqnGV+PMUCvLgTnLULWOZavQ02z8DxI99uyRg6yyX+Ux2MTFWWm+Wi2bar72DUzlns3hEmXnTWMzrmXLMztUqZp7Bp/gm3TKJqQQQ9OLecJnEmVlh0Xiec42ZJDJND3Sgknp1++TGkeChBeNL4VvfIK6iPXlS4D86AgqA/lE4jD1iWExuYaEJThtPOHOqxIENochkKA4j15ZeNWsUB+0nMq9iwgv8UdUxSMkevO4d4gZeeXM+SUlLn1UfdeV1vCzCC9ON7zRPTVfjv3HxncgXvH2PVZmpY4ZrG808MUu9KxbL5u37DRjMj/sd8AsEsKpJfoh3AfqinjKDJEU+AT5IUcR9Dt8qn3+0gqsrcbXc4U/6w0JiSjkocJdqlcscovx2338oFBH5ehirz0pZVSyb/ONl64emJYnUAFUY4jVFnWxUCuqUYF7MRaF2ZMtMH/ZCKZ4LwcZlsyewkraEnnaUxywO0/Vi2vDVp6UudQg2btFH39FjZFDVrzODE+pQdAU6kr295hv926GXWmRovDVxVbjv4k58cuRiFv++8dj1MDTweK7Rq1matytYP+Pbd3r+sYUiH1GYQtcxcV5LU9VJ59qLKcW4wBZQSEq11NiuvOvHL1ynw02Ml8U00rnTRYQOoz9PdxHfwx5+YeIrvFtFOnIa70BcA2js7Wf+TWzSbqe0jDXyY75/dWITxBJr/Kg8ll9TjbE7pRvA5Fkdl/KQ81NCPewZim85L5R/4qN6hr4I0dFCBBKF65qWGF/7MX7N2wM/evURfDTAx3sK0L/iZG5SsWfanUmRizNbV9pPIcRN6UB9a3xQXCGS43VwpbCOWzn/4WHhR6SLB1x3dy8bYUjb0i2XG4uNr2lSuuy5o5e0L37SaBMVNFV84WzWUJ7BtbYmozzyH2P8ILE+4Yen2FANXdrQ5HuSTsNqH9GdXGCxBz2Uw05WTlr4G6D+7GVpeoJ4+gKtPFs7V7rkLPizd8dmot03nILcARzpHMOTHPWp+Kgy8NzYzm3dkK8mpAAiwPYv+ZCeOIoJqobrMc73sHiccEzL6ew0CrX5QCWxUG4Ya4myMbCbg8G40mT9vyEiReU7gi8NORSEpGb/etOTXdRCGK/gxEmROG6p/1Iv24eJ2IRdGnrv4vHKMWm4Rshl4JE6I9L2IWIPyqeM7cdGdlTqqVLNpVnBL9owPE5RU7THpugv37q+f3owf7PnRox9MGCv1x/vu9yc0fGg+jo+hTXmpTD5JVIIgHnO/MQM+9Aqs1w93mqM13mjoXr4mLMALHRMo7V6ypXh06SdIyc77FiZsblmfltu5uQ4czJ/18wO1jrZ8umnDiy0UvkRYgbky0m5TFrBLir/Ua+EBTVup3hw2iG8FeDYq7M6+zHWc+ZI1vfMB47TKbfP4pgHaznmi1wR1aeTCg69ZUVLDj7ZYpcnCY+i4L/dxdtIN+oojARSKTrnRScjNl9gcboZU/6W4WGQgh5LxJycioXC801FnRqLdK+D1GqmV1kXjHo7y1oaaNNnD6SUru+uipfKciFg5Xtg1w7qO8kUzicjaO/eggECoeJ6+pE/0RZiNeVOjtweZFfLit0be9QUkRNbjGTaNIDiWSITZCDd3DATjJkzic1x4w5R/bX1b6WAaYIfba89IuM0txNb6tO25YV23zl0sSlPVcPWZl3iawuJe6kA0AftNZ1sTioPGJxQoNhd7NoOscMszGw0OuoSbCrl8Dhnv7t+m2U5S3p+Ip5VWVz3BqjSQtGtSQNYCLIFHlIypWS1YEGqvh446FXVSaL92VrdEKzFjLvJQRHeVR3D85RdabnGSjRzc3QtU2ZYludJKk6bjTHeTWQUFiC8qe9pwZUSOqGATTTR2E7bjYguXlZVNkvddHCkJhTWyDkmAaUWuZfHP4bj4fs2dPS4SWmuEVy4pX0TNi8/7WKCjgFmDzITW2Oe6EVA9n+sP5KswKNpQhcUHhxuh7H0WrO2afiCuCSmh/7hYoA++bIcGBl1jUpnX63pz2jJjaPRB5w7EY/HlwlKSKSIiYrTs8WE9EfoycMHhf/vOl8jQAKu+W0iJwG3tGljpglLPTYVfcX73x9yUu0PJ5an/V2Kz1Cvd8kLfyWBUYUg4qXmQcA7FawwrD3x8ddXzte3zTSn35g0ChD4wilYn6Rwo+w/8yrB7yX54tQsBT4iefqeyvUmh3GmM6MbHNSSVrH4sMsdUByGqKCG7dZGxp0ZKACpo+eLJQlpMPZRS/uGkd4z4rvAjMaa5utUYGU1btgmnSCne0HEaYdIfbRvSsAIXVqKoa9+/ql8bMp/PB0ALDs8TR9YI37L3yXsDVNIE0OpUvmBItwQhlRIVbDUBY8NO7oKjw20wPd+FX5v3c/6gZmX02Q22CqeF4JGvgbRxxWeogU2Hp8zzRc8WjxOv9fV0oVrsgvfzvOy4GGKL/572UWWd6HpKVwUUPsVINqCaTkutJC8tiFzPFK/OzS359d+0puRhDIVTa2nQaHKuD8s6fo+HxVGO/GCunbAyDN9MnRXoH7qKmAfjQMdFx4bEejbHqGY/cvnI1y6XLJfg6aiNmr2AfWtUWlcEmsToIQrvMJAypR6jDvC86jTdUAFUpkWCX54mNg7LlulI5/PnPNrXjlKO9LqfiSrGUyLmxb98F69qQw/hVEyEhSv3irykBusplRFm5hdrsBexh0U7JsogV+kzN1uhK8xLH7pnROfX3oFrAV/LMjnY/Lm+DQnKViAt6ikk06jlFFSoEMB6LsFw/GXPf3+dZOB1ySdYv5NmuqAK4KCb+1sWn8OBizDJj/kulzybTdqVc970DjuemKO4fm29FJkF/eKQ48R8m+IF86+32iP5e7+8ZmrnUnhj/xuZZA+b1Opm9N2LmBsYv5MpAa8ScQacFWeqe1nn75h+cYZVycH5uf12TEbHCnuQRWZkoVMF7VZujixrJV/PRQ4inFxFLMvHR0zwCiPIo+RlLzkz8JoMgX1a/23JMXbH3zGJcDiclR2sUsVGxJ7+6bNptPxKOo0Zclr8dtmL0t1uvix/ARIb7Nn09OuL0HX/ggSHmHOrPxlC0NcAza/OdNm8zGHkvPQ5Lu4wWW0MJSf3qmhfCJ30frSe1QfFjp31aF3L6WVHgK4d54SCt2krA+Pj/uuev310rVfm7CtL1Nr8J1A2XQ8IJX5KHZsoyYSmMuyiayQx7R0J9jJESOzkx5uhAuuXVddeTrJCtXIEyQjFOgeX0oqruDDAcpVyQs9F0V0YHZuW/b/uZZhYDaQI8sgdfp0eLf5tmsvrU1noWXDrKip3OWnFflW+z/zZYxwGNI/iugqgfNi0Adf+jXqCubtjhNWERMVrkeAY7hsirVg5SrnwoHKdKBJ7TEg1loTidfxyrl63wI7FHYfq46Phl3Rs/CR3n2kbXqwMD2MroadkETFJ/CapfaCJz7ZYFT3gqxaqP2VwjHA7VA3Deh4zd4/l8VKzEK3v0eqSD4MxTnKj+iYmyYpsK+xjdNlq7cjTXGbxrwO23/9Zwx5mJdRUjKrgSptQ/EyGTGNceqmhqG9BdKyqZ8omK1Dr7WPcAuxsW90bQWrEGpoy8vJTzq5GUvOlN2OnbcKTx/zTnpCkP4dKH2lvjsVDd3+SEjEXrPkRe3GDPNdaEDzdfqgwrZ/Upc5HIIldPlo4h2JW+h8KmZjLaCsvIp0rG1oWee8JmHnLMSHuOCpmfjp5bU7kB1M4Hy9NDgI4zKdmTsD+/ZRUle29cos3R4H4g+C6oFcqm1t0YVUzY9ztoVmBNFboSqlEvXsJI0Iu7N/pK8AgteWAgdxl3siRr7ZzVGXX/8QJR6SpwKbYEZINaaIaXD7cnnpwdqp+aVy2IBVvt97uM8CPHFa1X9EKUXg64YsnsIIHtSWkYCEcxEstztiuYrLke/AP9eIGtlf5e5dpTwGE6cxiET6ojDknylPhzzTilvt3L2WvvGKIUP2jSN4csmt3MpJwFS5LDAI5XVxRGoHpIv5ieS16f87Eg9TlpivF8hK301xE3HDwT3JaynTpxnbb700wrOhIwuf9R8gJpjRx7SoKLgeIpIXyUsJBimG5TKCEcRAjk+eBzKUg4aNblcK4ZFFfneTdxMMQ3PEWfEEPdA76Cb4LSIPciEeItGE2OTi/xhh28MMSnHhp3qiqrherKBFEGwPkDEO+yQC/boFM4+otPHaNJZuWAR0GrELYXqJl+58AeXJbtAPF6PH41I3+AsjadbD7AQLn6jgxnqBqzBZsFfPykWXp8liS3+F2kPUfUvvsEMv3f54CaTLPlI99b1SSj68cuxRXExuFNtYPj2jMb1fRXsEZWqGropDk+Vx1IcU0jjw6RNAewEz0G2zDaOvf10gsbvDOQuz1YAUzzds6GdlBSbDqziIPQycq+Cp3WQSWNwCD05pKL/S9bpH8K0yTdgQKjN2YVP30cEPiIteoTtwCCsUNDoXhxP4fPn3xDKgQYAj4juP+9m0akl5Lb3g57ebW4cM+Ozx/AczjYxTBUe1KZJCOlP+LqOkMwbXAKVEVLhAsITFsjBUgQAWKM808gfa65xjJVb7qf+fsWN2hTwfIve6A4lzCkvRbU0sQLXz43aE8nyS9EaZJZNReBWxD6B6fuV3gDKWj9GgFEwncXxSdu/Rn2EvYlz9vLg4K4sFUxROljMV+ueIXrFZIGkJ8ke+Zvv1jeO+5AANKWa89DrEykHP3MNOxGmdo0eF6UUw3p9NX7WcvwwaJe+CLBIw2RbbL5/L8XbYFCnKtD2egkMU9juAn6ZgNsDAqsJg/OJGwmHSyCkojJ46Vtq4FVo7CCMxJd5rgXCZbSU4EbLlHFGDbQY8mYppU1a2AEN2bdOCLg2/igCvBy61YbrFnkT5+IurCbL/he09hvlcI3hSZwlb80VQyNGk82d6ecziNi6+Jad+vy50480cypw4e/01sVAujPw/7YvnvIwT/zpKH2kabYZrtvZni931dWx2Xz7+vPjQkG4xU/DyjhmtZ2etC4RLXbVgS1CjWoqQYWXLvQx+ufYoFtjJec5ZZNJI9wuhDgQzJA0hKwtVkaso+MiJDKfqcCeJ9bvliyEb925TwtHAFROQpgehXn71Z6WvVZQgd5u3vNRvn+eAkHbJSTcssaV56uAg2KexqNS0TUUrLKQRsFBZG8VL6akUiXxkikQ+sokd0lWCy2hRuyK6X4Pn8KAUzk59hgK7ULy5OX72zKBrtbdBuLz9PK7RrjuTea/5rWVfpSmnfV35cGQ+23tvStkJcrxlRqvSJA+fUU3Z86hCd9NmAbbxz/gNX9z5E29S8T6nv8O3w/P1hZSIhIF38nMUWvJ/sec1Oce4P3U0dIb2PnkZFO3M/CsUrdUDIiWNAxTrIElItUsKbkYWrG3E+iSL7ZYa/bd1lS8prdpDi3Y3A7dSBTjvjjdbXL2uSCZx/49pAEzQtYrTvgWhI7oOCRzU8Zf7cSRMuQ8RxYPpqu749JiHO9ZmgQK2r9OvUVuei7b6pNWVT5Xz4YGyfeZw+06GdRVgOFMIKmJeYtzfJ6IErzgSfkvv+UIyEzywgKV6JEEma+dmb8ADa7FCxHc3m7db7ALM3SbHphu+qIwVZN0OBTfTBCSaMbMg8hOP/eZZyhLaxU6gInA9LAwET8wcncxhzjaAn70HdinuBaOsF6PsYQ8g+LWc8Xk18tDSI2cFsIXuGM5+nPxc+BdTbFsewfTxIN1UZHegrzlUVdXHm5wfVYI8TGS+EEu3C2wxXOJkCBlqbb3hsSL1+pIsMEiuQUyjS/qXfDSWagODjNegH+fd72JDPgpcl/nbjec1hUiHGJGbYsVwxz+U0891Jp5TNn22wTCqWyglyCPdpuUd6dijz6nyB+Mz/fmp+fOPrIKski2adA+VsGIw/75dY0gkgcpd57vpH1BZ6gJVWf15GxhcFCfsI6rfm++rUFxqLdpEo7YydnJt4KPrkPV2h9dP/enbNKLgDId4xX951Pw6JBGTK3GDQJUEubxGBlQHrtK4pyb0x72yz/tuwBwUEfunsXx8sjazjaI4zMz7HQYCjKqCIquinTVkiBth7ZbCQChFZyhp2PROH/NFR5FJ0WdtT4YaHQRlHjMe6wKftLnLKq/rua7p85Hc8wDVm0xK6D1IRfrjKqj5goiKjU5SfDop83BRo4AExBAlIam/myJWs+78tn8Y5x8lYU6KCVG2TO2rBFcibSuDFeg+3UsG1w51hykZcWoyDBcUPkUd+hR5HgLtr3mWELHJqGkyBFb5jNEP+DJuFFK3ixjxzqGt0CSM4hll7stTe4d6sgK4UofE8hpOCI51g/s/j375UL9CfSFMBsM489dde1XVn+VkHy/AryvpgvEXA4PPyM4AU07AqSpgucqA0rDzN1+G1bVIKgqUw08b8B9QzD7ME/yBZhr5OUBPx+jEhPMSrxdCrlps2gDRGzOepmbhIw2VPt7leVVEND0Xo2L/BzWOUL3+6AOO6f5V+OvlLY4jx9KhE470tw5czz6VrIv7btU4MG11RC4TLISyHh3C+vE3sOvrKA8+rTNlLUVuaq5OdRIBkRVi3R1dJyP/GoVAPW42X150E6w9roiATVZf56nCtpoqKWP96MKorCW3w4eiNK14wTPBulHshmB77qFRlsd9oOjWO4iaYXHZ4scMsi6a94yhkX1nQgYX+p4hmT7XfZm+cTVY7QSu2CCh5lMET2f3lt2L7FlUKaGmxXZ5OrwArM558BN4fmnJCY7YRuwO4H7d4tDBhvoXcRNxNyBE3sQPOJcON+Lvn6ge3HYFyH65IEciNEQT69I6dSEoOaSqFlt4/DIlp9K+RBccU3+C5pinF9CXwvfXgkaFlaCwgz72H/VC7FNBnCc1GPXGn2D3bufP30Ua0f/Wfho3cpw9evp/5wGlBeuL9yB6kI/qMlwnhRkZKjJ0RE56FKE+OWkkxUvjqGj6qljEfoxRMIZbozW8mHlHQWjM3+FvS/+PLKAuYEtPFd1iJ5+FDZ2DSspNpZ6elBAXgyUKie1/yBwKinx2WGkgaLOUN8DfFYsECMkXDSkEN5EsEXzHAUOV7vwsKZrlf4Kvw/9lg37UMDw4iiv/VXqsQ//jA/ln3j5d+clX4d9rXqtT/ktJ+cN/nb+i9v4tGDX4v8z1UUw7TPPGaf9LSfhZaVD7zMrL5X/7G3poVaoGFcuDT9qoOMZP6ZiHXywI0NiuP/cu/2+eEATQJP//8yjIJDFbkuf7KEoH/fZgRX5NQS13GCezdFMntH5lB0dpstEV4/Qfr0KIf05/bTOsgfJvreS8c41PYbvJLHfQeCBI1rT5MQ90hVajVDrN3h0Jt/54k3czN+0me32gu9S431RT62ye5jqQQr+l570TnDLUGnLYZestAau2RURWLdB4kAB95mY2K3oCBp1hlnXeQeNtwJ5aOYQc52nIj0/uUbaFUCuy96cfaoMRJNf4n1xlXKgndDHCVAXT4eyzp95JFRZR4n2iYtW0KlpkLmqK8hn2TeI1QBco/fSOaIvq1/FYyBOFDPw0uib5Ni/SpOXjDXFOmh/Zgf+YsmQDIsesmaeuSajxSPXr13/QLZAfoUWv0+FzSzvC395d/n6s272pyfaoJkxVlKroXMXE1xL+mZIj36yWEwV//OW9qNbrV5c7du/zPnITv8xwgJ4bb1ikqOSa3btAG13np/WbB3sNeR/kOtcFW+UeVRZIm4f29pTixH/ml6Rkr0Y6nQ731g780TjSLvE4239UCbLRTpr8uqiTnIr/KVePOt88ajZH/C+pdaOj8zpELbtb03a9pV3pTylYhOZI8FlFzg/nSzoY1GC7cmTj/fEXaPbW46uU0iAtbqn0PNSkZcXpJtNXXs3uB+y/GpS0Af5M1/Hj6T55PcXpG29h8UfjrXr/hgRB78t8LJq7zMtauLL4SAr5/9cKRdS0/c28rHk6R4JjyXzfE5h930ahovJVvIqfEUIT7K4JxyFxaolX2bBvrKHLjgGGUmxD1rD3gpZpTlqRcq1zCBcg6GRPwSruFRXOLjg8524bNfUOtUqrwHH/2njWu1CD1XQy+1rL0AidtKFVREOBPPSkE4ynGyV4SaT4F1+/qjZVh1IDqntKl8NGcxypxks06txVUq1GuATtGk3Pd64ZaHQ2LqJVyG7zVU0QcQ8ZMh7Ar1MjrXC7kMxGzYFxZ4rf1eFQb/ZNiho2GGDUmbonV0g0T/yOen8cAUR9X29VVCMRNk0+d3HZmJgdRVbnvVnfIGCL/6hQCKZ/cQyO/BhQY8J4Ohph+JY7y+fWDAtsmw51hxaVk1BXCJr492EfKBz5/uGJDm5opqbuNT2URAilmfVLKYjSKjeOxfceBuRmMYu3ogQ66p2bmCcd5tp2NhDkxe2Y0M+yhakCXipXLVaU3u3XIlLrgmccs1GkkaJzeM3djpGKtpRU4qVpiuWe+uB2kb9LPORt+BXjmoEbK3/qs5KTqX1dlSzxoW1Wxsct8X8rigr+KMHiyDAOlHmHuzYx1I5yXILXnOi2A+5K468MvK5pvpfkZGKTK+KlQ59J5JqyLnhxYKXDt4JdTjSLgeaP0njMA5vdQPOlw5ucWA8ryqcSfHEkGKe87p5rASO08NX3WMqbMp51AaB++WOJM/9/B2O8zilaLdr+w9K33brfP25/XD6cPG4fty+XeXI31FdxcXZys/t3vLs0PO4fb18Oi5Mf+4fv8fnTcN3ya40nF+3hS6zOhw/j7e5hFcN+cfcQq5eT6/ZvMotBLp7ExpBOIl2EL+JgzVcxt24WTbVJPzXhMvytmWx5o9nbLs41M7v0hzNG6bQbe2WpPdi3MmifXGU50y6uo7zXnpuUc91gWspGt/Euy4UuvY9ypTu4UW50czetpFV1yHJvFT5EebSa3CrfrPZuWzlYzdxl+V/PMcqLfnSvHOm37luZ63c+Znmjbz5F+YN8fF6ahe2Ts+x3tryJ/sn2xf9av7c99zb7g034Hv2J7cH3bGZ2W+fZv7Hb+aOVzy6bl4x7FxufX+KDj9Xb6H/b7Z1Hf+5i71vGP+bxh3hr3bxE98P6wG612TWsq4GUXNnuCKfS75hq4dTUwNQVnpK6su0Mwm3LfgT84/bKIoFvVv+X2/2DLn1meoRD6ZVtCVx4+2C7Hg6sgG1HeGTVMFXDeerf2dBDYF2xk4CBd4KdCMx2/0vm9SGQ9UDuxsMi7JG8bQ8TWTvyfxw+75Un75vDfw2z1ccRXcPGquBYpe/Msb8L0FV/V/h7ee2lIk/e9QSEEPKha+KTzRLVJcEi99Xl0iF9JUjuQXcr+GhMgKkfI68ylj7nNw9D5aEiyrjpzNkbv9M4m4mudRFgPwTDcaG8cXYQ9KKkOu7Jhva9artyckKoSz+TrntAI9g9Sx96sdhv4CzJWZvZpHOo7rEDq19Nk9WOGSFAokdKEIPmwR3mnc78OPayYMzJgn9wIj4sZnFeTnlg/leGGVcHk8CEpgvmtpjY9ADO1e5zzly96JMB8u/AkD8x5rBAodjmy7yIfNTdiOdBvIRgTNxtRDn+2LSFdACmdadVKO8P1ym8DspecwSb94bTmE5hQ+BDnF9SrUE/kpLKP8r1pTbZXrh9fOhM98xxyhdhZzln8qeB1mYTzPjukugtXAA+m2zEdaA2aA8jNF1l0QYCHMbut0Yd2y7hL4nkoxXUffjk1PJIVYGNJXuiRXHPELXN2T8xpEj0G7ajLiRkp5dcHSF/akdpxlrgwVhCcnYMrAkVrg27l5Pq9JlCX7RMhuFE2vivTctIgz8A4LY9BtQK8oAoGY5aAOW5aJddS1qD8TixI1SAMp+kzdzPrnF1wD/Ne1fqpOqE9LZBZuNkBX+UHeOPoUfbjpHiS4gqnNDZBoFTX8bhSEJSmF9V83AJSUvMP0aFpQyfAbf9GxJHRyL5ymFV1t45dG+BqSK2czNtHATS+7O48+rM9Z1RFAsj8+y/8cXA9oSfTu0t+VGGq+0uaa0UvTxnFSNCZcPjELtv+XMYeXzLHWSJppXgKMrCVRTkUmPeG0Y7UkyuA8/nQd5bnk7ObIWVb5Jjp7EMER39kHJsZAHJ2Xlmp/Mq2zsAL2aHsDGrzsX5hb1MEbC+6hknScJySAIV6cg6JH5Z6DyqV9tdCp9D+NajTtqmooqEojK+tbxk9wD0/uzzzGXny9aQnu2mh4U3J5ZgBZknEb4OS3reLMDKexG/p1HqdbP93o1P96+BJmo0L3UJ1hDljYd3n4u83IRTOmpiwwiwyF3UmIs+VjU7uUPIdrNYQTB+etmG9Eifz+GQM7KKSJ5L1WOiJvuYNXMrnc3PHW1lm6mw/8QisHBmUcUPH0Zshg0cXZe4LO3SSJG02Avh1cuCVsW8z3g8AbCoOblGnjuATktyLj2g6u5Ho/Zq6KX+3QxowmO66rwtSfYuoQqVrDTjlPbJGhD8+kNKx0dnXBmcp8jOMrwDTBvMEFH8kSeqLEVbLNLjyzJoHtd6doO3ImFKiRoVJ97xg3L1yhPNe1zLTulCxT1CokRHIf6x6AYNCILaiqi6aBz8SVUmagA22P+7c0R79l0zVOsPiKw/OUc0T44Ynjz+vTFGRw9M6aHX53U6yFZLCoeTkLYcufPW+grgSK/tm5+XaEqMFvRmOohhGIZx+3NOkxf5j13zs+mOqvv0W9DpujucPUsYiFTAcj1CcBQi8x+zNyYM0S4ven23/dzfndQ9p1IH2KEtVJpSs1vCJMtZkmhFnWYjgfT20ZfRCIyooF+n+HxM9cRsGimuXZiGgpSQ2EOHyLI0dN/71/wxsO4c4ZTDeBJnzTOdmdMB2dXM8BNsv+SDDKEM89C7XjEQFRYxStJEcSKh9568kmRuQYB2LAWmrNEsqMvSLPb8jmkKN+TI2UNgvqVJkOQC/p3IDLacCc2keX44VzMsXz4+eWE/TJlM2xG4QxiQ8OfEojoTl4QTxOPew7TxjF58m2dtQHj3hel5LsPuiEgSNx4zQy6fYS6D+xxELdidBloX40MtZKV6fjQ/kkC6TW8oO2vBBlj4vYYhI/WysEUGU9TC92vaEvMlHuYwaXb2fEO3zxA2xOm5UfSRwVEa0XXDTCvXzQsCryySQ6nZ4wVqSnT0jHpqOsjcvovzcNbA6QbhmKziI7oPBV76WZVcsqGkGOeOqLP3Vkn6rji+M4Rx2XtNHKXpG1/JvWrvx5T5N2pCSX2V8z5WYMatpHAvWxT5fZ067DSc4o0E+YRq1NO3xJv7UbxZsw3SnUek2nRPJOnRMWHuoH4gi7z1iJtuO0Lr3dH79RQwn5yE8ZZ5dJ6GkByS1bAc0LEW+D2SvLM8vpehonOr8MRa+ARcqsSMDBfe3mc0cJZ07LmELgDE90ib12Sjz+70U8PDLIcKzYuPipJ+yY51N770nkMtGujJ20Il/kr3adYhl6gEAplfV2wIGD573YS8M74oW8eeBvjP9oMm2Zxml/M3oaNDZfFx87mDGzFZLXiyI6L5cWWZiB5VX8YsImHPWm9PD4skQ2RAZ5LEeAp7lDKjFuiicw/xUi58z/yAQOTt3OmRuLTuUJr/OYhcliWKjZKJwHBhJ87jHY38cFFotB/qD0iMqB5JejwPuLyWo5O9zmIi2MiVE/o5JMjh7TQqkYGSaFKqOg5fgEkCA+2+02VOa+bvOFsPLYjAmLGqzfOyyCx6cf/ZM/5NnnsQuOBp0PiuvT3bgtS8sQaBDtvi82hiBabgApWskN9FfcAcgTQhRGSngiIf1KSTodu+x/HZzMu3HRGCnXQSgqxRboaZoCj8zvywlv/sYOCcXacniPR3O3lHrnGGdMSg5RzPc9WcmxZj+Gq2+9N5eumhAxftcKW9i4Ts75uOrXOJ3kbTJxbMAeeED64Td2lskORCirD08scWLMb3vEsuz8188Ko4N/8L78OMXZ7J+iaQfmsIOjZ40vYEI7IK10X3a74imlu/EpBtW6ZpSRh1s9wk+LmhF7rQ9mOikI9x0hxUmxC9XLgTZtP5SAjOiD9hGIZhxI7BzvpldxfakjRaAMXMrInokwUQnruYg0u3h02UM0FFU5hHZycXY+iYwGpLX17FeMDR/ioSZyT416x2noV0WtO7CF4AfhRJCYsWdX4xu5049FzR3eGZF5w95Dftv7yXzmpiChhQxPJSNw6+ImjvQAPekGGYOQhsKe9EQyYoF2fy7XSiqvAxRI2mTE2k5/v4CZLk20auw46MQYTIVXFXPVAlqBpLJMSN/v4ssPdPB1TSgOwWErUBcj3D2HOUB1Qyg9xULf32UJU9qcsZ75fZz294hEfngyTbxFgCZCAPpIJ6aE4kkDWCoOaDe6muQsiGPbkkHU2JyKuFzDMtu/7gBPjJrS1Dqo2yEnGLL1LDIm4YJokr/nuGTbZP/0Tea2l17fD1cLOgX+hh5RrEIZB6MiiuOZO47xVGqpQYH6yDobWqxmrpStsFu00P3J9+zKU78TZ7JOZF1ZzPwhcStVoj4Br0mokJj7dWHty4a1d8MQuQg7LNcp81qf1wyqC01c3IECfL99+c+aYe3T/7TCLGFU0SnzTUcdGh58I9OglvP7jDnNo+g46d3MRh4puNsFXsHkNb4W/rbRmkmsfX+Kz95/ZSvO9+iZLgVWqezDvYtcztuVdwu2gTrpDWbuY7yPcuqoPqs5S7zkOU+gWHRull8UY1qtBe9Oon7QYN/NNBWCnjxP73M7laKxKPhwI/zhAvgDWcCJeHKEiWYOOGzFg8VMt0Q1VQDUPA0ZfHewb9zJbIoYbYi9zKGaLyFzKNLtPvHLU/QmLHq5qmkEDU9v6yEL7Jzwn1qs4WWXHJC7sGb41pUcwJPxJzbxepNKe3ayvLovCvdNKgPawc5dj4Bu8a86fQ53I/s6b9LGh5XmBaQDgEO6Nuxmr0PMFWsxt5cgM60+GHJ+U5E57N+LATOwuIxZe0d0KH9n7RlAXjbtoay+oW2wCudMBP6HsWMMHY1Q50byeJU7Gcm+NjXXLFi0spt8znVPe1FpKDJsVSmGBtXdwunJiazI7f+othoP6oeCeFPw4CHk41NqSHctUu1QUvfJK7UnvNflD0egtUcZTW8r5aszHjnOfmtTXYAZyWP98xoWowLv5SJpc/N00aZcWOKGfrycFvnvk+zEvlo8pheuP8FN0FJkFo4QFvpciiX534M8CT2EUSBQKPV+/I26AeOtecUf7H2WEK9C99lfJwVvQ1DRVUV1jQklh8jdPrBxCWzNwWKRr0AvFQqam/gLG27e5FaeyWxEnpBT7NxkMPRscNaA157zXApKiDGe1L57nGehK3/SiukSv6QUB1Ehc6n7ugxbgoY4WvP/TDsr5PZXK/AK+wWbX7VlrDulZhoiFixnmlzfjJCRXZLJpZHIZhGL49R/1ukDtgI71sr0WCiUbHEZnAlYiqGXzgOrLlNdwVAShhwM5+k8DLZzsGnRUH3H//ifvvXOWUom6owSSJNeMCqv190gMtv5NovFiQl0NXa4qOiq3ETKqpxcz8X/+j+hl2NT4a8WGy5eQuTcNTw+WjcENBU9Hq+/IBzD8x9FaKS8ESde2HcDUJppg5//QmxzxG8g8/HYcIYO/L9IcS21JDM1Zcc5p+ILr6cKmxDgl0yhMlMwLfplOI2Affvn7AY1sN9qrYMOothwVP8OEyIBj7saAeCTiZYtggj8tThQ1KjZjCl2tWIrZ11+LrO62UJZDXIIJZ6lzJBpaZlrApFIRoirwOKyOPcorbndNJt2I8ksItYXL8bQli5a2PkL9CNcTMFJwjyUDZGIyPhnLjYm/qSGryqrFbNEOBbdWouOca1Smr5Zt0wc2VbmmpZ5JsV6D2S/cBU9ab2mdi5BBqZoAffefM7XrdsCSKwXEtxjjuVLtvo/q1G8sUlNZNRl75gOqt10GBCKPGeiX0HTiSEfs4ieFl6BA6gQF6rkCKpSyjdNT5WLDmAxK296OQxu017otkESZAyn0C+/Y4WVEZpV7dPIVQjxu8jWfzKqz3B5t5NhAeOtTUWF/WVVzSBIewSmLspeN9YflEvny+f5cjUzlc4Ju3DklyS6Yx2AJsqnTfJ9axAoHrc2DH/vt0leJ9iHBqcVFjxSVerPhwA8D0+A3PbXwJG6wn9/8e89fvcMA7pmV9REihhQwlAiWI1In4FBbj1fWWTqFo63P2p63OI06vz+NL2Uc6FZI+rLQdXS8dUa/70CaqIcSjqaGuU5s30vcrI/MXtH6caqE60eyNO/QPrBaUeQUG6txviCM9sUkExASE3wLCRpmGQ4cXdvSpLbdwO0y312vBSuoEGoJUaf+OVkli+NZgrD0FRkXcHM1Cgw5CeWXLwj35aEoxCTBUz9RKUAfXdfKDKEhZ+G/cTVBz2c1UvVzmKFAuwqFZ0BN9At1UPawRNFt4svzVACnCW4dRdJ9MbugTElNPbHJ2Aqxm76KgJGeb2k2cjR4m/Q5lns/Cq/cKEEPqgeAlqvuWn0aLAnTOFF/nk+GbKh3/hoCQ5CeG460dfCAXKdsBX/Q0XGK/aZwq+wGaC3ZHwHAQOSiAhpwrG5DR1Aofjvo/yGcSmvj6Yj7JOMvN+92APKLxfC6httRzY9c4QGNa6BrnBAXx4e0MVb1wyWDot75sbLGy+aw/QnJXwwuM4wpC4DIN/b3lyDWxFdi5kr2+qfFjkGJ5RUnx2jlOtutuE9Res/PQWxtvoN+qkemsOER6y9crOHdjVFo6sRReHzmYDkMH5qO7sy5wJOaqNzmqVYFhGIZxqGtqqcqxTU+I8NX/v0IpsP/Yb0c5f2/20M9TVNwWrLxs9bSNSuow2iXo9tDN2C4UNgsQ1hxTBTk0MF2q09EVf9yjcY7gIpQHCl13dQ2IIv8ta7AvPXw8+Hx8/rqHB/ldWHQuO1eqvXDuy6vTbVFtJoogn3hP4jDatN2H6uVbPgIHnGi1M60GZny1YggWs7MsT8xEbk0csen1e8FKZeT/uAoRA6AnE6rAuGSdiDO7yHsZXIjKjU3OP4pVqk7eQAV/JTa4B4b8L4inpHbzlJ/wmlOODcSWjaz6zbKR3HnATjrTITdBZ7/icASslD96gO0YndbQXtGH59abZB6kpVCK8+rCzOWn400teLLg+5PzOxzrqm4FTfUDdiqFZXjTxozUKvmxNYTIJvAqin9ZHbj6rFwCBLqbI6VQwlyYsJkSoV0zSdn0p2efG2Tu3VFCXgpnXQ6/F1FXAJRrlHATSUPeRRdbvNtR/hMbgK4E6S7gaSCPiTGRH+fn4N8ek8cKgfD305enjVlGskrjZap5Yv5kFI30sELCTDlwvRMNcCah09iHYMMLsV51XJfPqbS2QXSSbTdP0u5+fD1PpQouKAJKeUYULguKl+6h8eAyyX+92RpU2s2p0Il5/u5TB/9sMo/bh4VjvcWdxHRFetJVtuygIvHk5nw0V2ZcbwhZrl7v9W1nuIXW4evJp88Rr2EmFV9NuaLzL5a6WKQ/XyIrF6+I+dC2zusVNU6hTkriyakfOZDIeG2pe2sBfhTj5y8MTuSE15HURp3D4sHlghqI5jhE2wko4KnEq0FDO9zunaP8g1OBp9v4FfSdMVoK316wjgBrQbG/H2sDqpdJQnoX7uEeReHrXDvMXJMZNw1+abRSgaoSE7GRBiw34Em8c884e/r7USSlg2NiiEQhs6B1cAFlHDYbkkxgnDt8qe0MJrqpF+PY6EbYbJYLgYPETa5x0fzBsN8pkTr2OmeQra+nPPpKc334LAW5Ye0tYx8ye0xJ25R+KM4F0jZ79tUHhaDYj32OkfBIzAOgeyuhQw6CsJkbVZZLWSOQapwJaTV5Mb1FGpnV5k9yY3mCnYxwRNV8T/XjGxiikzUit1ydg6ZN/CqnOJ2y42paiWLAo4ddCMwZMPtE/kDIEu4Ov1XnSh6slCO6deMc/H45KZVUXlE0RIBPYytQKx39SeA9GSc1r6zIimkMKdpSnDeUI12m8GW9EInIZl62K2yPI+LE7HutTBPX/yNBiQ50oJgElb6v9Roqwh+y6TovJNfseOsmHiBn/b5CDKKKwi9kmaWON80MOeXZ3Xodu80/mheH5GkDm1DT+FZqEgJ8ziUgFcE9plvLPVbvskz6GZSWVdoy9yURl06MDLM1Xrtgzom2LomnEjDSDB2xKMHak3HbF/7/OqIJMVJdkzZN8Er1H2nVhOZA1ZOGJpSJ6h9S04RYUH0i7ZogqGpKbQpNR5VVuhiEckd1llIZhPhANVXpchD8oHpNqR+E5oUqUsoXoZxS/Ugp9kJ8p7pNafsiuKV6TqnbC80V1bZK671Qjql+SZKDECuqfUqbreCZ6nNKq63QPFJ1KQ1boXym+iulZivEK6r7lHZbwZbqMaX2TGjeU61TupgL5RfV25TKXIgvVDcpXc4Fv1D9P6V+LjR/UBmlbIVSqJaQogpxS3UIadsK9lRPIXVVaM6pNiGtq1Ceqc5D8iTECdVVSJud4DPVl5BWO6H5RrUKadgJ5ZLq75CanRD/Un0MabcTdFRzSO0kNEuqIaSLjVAeqN6EVDZCfKJ6F9LlRvAX1deQ+o3QHFE1IeWfQnlH9TOkmAnxk+oupO2fgnuqU0jdTGhuqHYhrWdCeUv1R0hldAgLcYvsEJivcijfgo36Yb0iVG6RtTsoqxyKA7NHh+mKUD5wKwW2qxxiCaZ+mDVSLJENOhjaVJZgvw7RSPxzuwUWbcr/zGYdNo1U/rnVOshtih2zU4exkfKOWyawbhNXsG4/LBsprshWgWmbyhUs6EAlMUW2DczqlKdg/X5YVVKZIqODqFN8M7t2mFRS/uaWD2zqxCNYtR/mlRSPyMYdjHUqj2DpDqWSOCN7BpZ1ymewZYdtJZUzsnIHpIViC7bvMCShvEX2D6zSQuyZtfphkYRiz20emKSFyp5ZsUNOQrxwOwfmaaH8wmzaD+skVF649TooaaE4gr07TJNQPiJLAtu0EHdIcDTSC0oryVFLr6M0C0dHeqrSysDRBb1VKs2Bo/f0mlRamXNU6LWj0jxx9IFeCaWVDUeX9PpQmoaqNqndCE1PlYt0MQrlnuqsSShhZBJ0SiqhZdLRsSjhyETVKYMSLpisUsdBCe+ZNKlT5kooTNpRx5MSPjApoVM2Srhk0oeOjRKumUTTKQcl9Ey6ptOuykuzfuNQ1LEWU1dyuyo59aVN98nED1iDf/8F5P70l31Yd+1Xxaa3/Kr4810f/xvL+faPf7QWu779cf8U+zoP1/V7bLoSn5bnm3fL2+3nP77kYvk88SAYDH45l6vz3S+O2/3Vr4rr1fNBt8L/6wn8o3XTn8/+SH8EWM00K2ddi07u0q/b/m9XMVP3f6X/usGoIz3+nXSVAkp3KaB0ORhInaYBgW0DpesU+BvDFPb3uBpeBxurxAMUqw2xFcxhhOvltkk0Jqvb0tC60AxnxsMuIB3liLR8sGXcfvzAt5/GmrLY548UL30KZN3GmZO2Cfyqw2Gsdsc3PovuyUtXHzn3dYdg7PaM/ohJRBFpfJFYM6OW17R9zhbrj5IPdA0dCj3tyPypEhmkgIEIhzq9mumrDW0fR6wvaadobY47jWu3VXHu1jPsDk4UXirEkWi7veaB/Yk/M/8Gf6X1sPDiFszTXdf9IBxPSu6XXYvRMos+6+7Pf3BSg//H4a/2x8T8lRdw1YzTxy1fb9dxpguDjdE6v3qDNHJwGw5rSiXB8ap9y/CoIJ1E46Up6aQwysBxtcL4H9xSDu924nhzbdEyKamninDBqybslKpd3CgHffMoDjbNW+3GtJR7/ai2uLcZnTVhVJuddsAFvcftjQAetyPAxOLaGWnIBHi3Ygiu6G2VdzZ7EjOJdzEx9v6k/B/nH0S1iVKsqhp9oS0Ztai1MUYpWdPYStUeXCmjjvfAK/GoeCOePu9bXbpRJisOys4q3Cp7q+ZOaXrulZlRYWVCDGX59aHEcGyuyvMCc0NuEBOt4ynygOjgOauGwfy/tmHOWNoW8xa5QlzSLtNb5EdEnziFUvs6EqtE3WM4IFQ8DMgrxFdax4p8hyihi/t7ZVyfNmIdqDMML+xLm2HeIQfEVaJW5IyoI057Rd8hlg11wvDIVI5GzAvkDnGT2jrdIO8QXcPzHNkghgXziOEPxtJGzB+QbfWuOx21y/SIPCbRDzhVpfZdI1YD6h2GbwiJhw45JvEltI5r5Pskyh7PGyXW0Yj1HvUYwxFX5XnE/B15kcR1oJ4iH5KoLzjNFH0JYrlF/ayVuC6/R8yvkJdJTE07Tv8hPyTRbfF8QJYkhgPmFYY3jKXtMH9B9klcNp37e+SnJPo5TpMy9KtGrOaovzD8j3CGh/fI6yS+NgdHyGkkStXFXa8M/boR64r6jKGlsbQ95ltkjsTVgFqQNYja4nSn6EsSyx3qJYZdui6/D5j/RW5H4mbQjtM58jaIbofnF2QEMTxhPsGwSGNpgfkTsgtjJ0tdpv+Q90H0G5xOldr3Qaw2qA8YvidhwsMSuQ/iy17rOCBvgigzPF8psd4sxHqG+hbDq3RVnifMP5HrIK73qO+Qj0HUP3E6VvQWYjmiflQ2uTTX5WXE/Bu5acS01Y7TGfLQiG7E8yPSQgwbzD2Gf9NY2oT5GrlqxOVW575HfmxEf8DpszL0dSFWB9QfGH4m4RUPZ8irRnzdah2XyHeNKJNRpYzrsRHrCfU1ht9pX9oC8xNyaMTVHHWNnBtRjzj9UvRdEMsF6lcMT2kqr0bM/yB3jbiZa+t0h7xrRLfA8x/IphHDOeb/MPyTkqXBHMiWKdajtk6fkEdED6ei6LskVlATwz4I8AA5Ir5UreMK+R5REs/nyrh+vxDrRJ1jmIV9ea6Y98gLxHVFHZAPiFpxelb0BbEM1I2yybPmurwcMM+Ql4hppx2nd8gPiC7w/A1ZEMOIuWI4DmNpiXlC9ojLnc79R+QnRN9wulSGftmIVUM9YPgVhAUPI/Ia8XWndeyRUyXKoIu7e2VcDwuxHlBfMDyHfWkHzHfIrMTVBrVD1iRq4vSg6EsjlnvUKwwPYSqzEfMxcluJm422TtfI2yS6PZ6PkJHE8IL5FMPbMJa2wfwZ2WURaJfpJ/I+iX6L0zul9n0jVlvURww/gnDAwwq5T+LLTOt4grxJoszxfKPEetuI9Rz1Dwyvw1V5PmD+hVwncT1DfY98TKKe4fR2IqBOzpc2WfMs2ijU3Bu1KaVrS0e0mhnbjzFOMKYkWk1cteSdCOwAbZIKAcKagtC2Pyi3CsmJNhNQ3gkovEZ+pqHXgrp9qjMI6gShjYK5GXPeq+VPcM0/m7llrotMMqHtBdd4wTWf1fIrtL1g337t4wX73At/7H4GhSATqI0wfZBSkeJAShqFOAhVIp8FlERkmLBAQiZMyZlhZFRXHeagfoX5V2oUhgwQIhwP0ijpNvwEDRGt98QWnjVJN7iGODFmrsgC8ggralorCmQqxGJKHCVqnfk32kitDuNE/Q51LvANB5E6XhU2bDQhOGO00/b5hnWcV5H2dV/N/VbRV0/mcvwa7WjX3dZ9HcfT0hSezrpGxPYMaw7nwOyk1RaSLv8mVGYDsgOia14vn9w75iGCFc73IunXhwRH7SHFLaV5xuhwEyK2vOBgaQDJ8b/nVvWatueAk3yRBI44c/Dx2w8QjxSna+e+BtdPHeVSqeXnHPQ+sk4vx/o/r4PVNlmbLH2PS5kiyYdZAVtWdv9mJKdH4ixG8UWf3zGZ3mZ4hxfxtwmoU/1sv9K37vO4eswxMOmz0kl3T0B2NbGcparsPn5yVh6jf0x+vpy2QzrI/XitXJr83+J8xfq8LNftU+Kvxxg7FOvL2+Zr/7wtyxEJL5ukGqR+tPl5egzTZpXq8DYvr1+nNwyvs8/ardLisJnvf+wjhaY/mopzdfzay+XN6vUxvySS4SmAp/N5kkT0q/P61saa3rOTIHJwp4BsIDF62sLx4nfoMTzhndivBww28kVSG/J9d8JLcMvQEqeGgvPJbe3vE6VazaoxUe1hmA1AiZfN+htCRVoYyO13D080bRq/RMX7ZdfPnQzPevf+eHMLLATnatjCS+9GBca6GTZsKZ2lVn4GmDeyBxo6UVReh0WUvykULwTVHHwQDf9469Eh5UzesBrGJfWYW6ATlLRnYYk+qi0PzhJvZLaQ+J0EX8dkdhwBaqU3MyXHZ/twbHAo/Jnl+9u/iSbcNKlq6DbNZgj/ida/sTqd7N67qBc8RP5ov5Hf/BDIInDhUWktidE5MNrIj3lizhGqocfdv8cUyuAugSKEDt+2iQZoFWXNIasTum/GhxOQSHeJH+A/mueShOjN1T3KfMxGVXHMkQBOrWp1Xq2mbbtNh7ukGfHJwEXtp1j4FUmLByAIJmj+Vuao4YVf8ai2sPzpL2gE36+KtC1KGVVA/0d/8mwpFolCHwwEVBH0i8+TaKPZ1V9Tx8u+Uu3i0mHwnCzx8ZgeY9dbVOs8W9QIl8nQ5KLotM75dKmdNgUaVmo6OyqkotxlUEpxvsSApeQLS0ReXE5Zzp0KXKEKR/tEq0e4aMNn2WLNk3fj16lNxPql2McSODBAAn78FE48mqPo3Wyk9Wt+nLSo3q1GGD443/cMh0ybP82+PAtF4gIrZJhcL0pokYwQhfutFxHpl1x9N++FPoxgnmjevfRqr8YHgXp4sUorH/rGYEeqpdg5byVjnN0XalbFFI7UWlFx8YUwXlojUUVcN3V5jnzoR+WD8NoimxlID44QdFG8p7x5ykyeVdXAOxRBC/ylVm1OxeMEcF68ap/RKErst62ctAQ+jg7Tupw8JhxBqWlX9Y5toQONCshKgQ2HBhrVHyufUwZWVXDjnFVIkG/EVTLv6t6NlFRbQqHbBxSblAH0rnFSKarAGW2oEEfcs64XyleEH0LQUhldVdVT6UYB44kJK76Yprt1lnP0hiOrMWdVT9EWgVPMKomTT6VtkX4VD5L3qorwwtyCQnpNzzvR7SH4jtJbCqbzWOhpwNWp5IDUZHsLR42rMt9nofOlkUIlJQfL4i9/iodvd5bW3AXPijNbC//JQ72mOP+6Xh+rkjTzgXxJCuloOcp8KD/Ivg++rkPfSuI3u25/eSOdJ7v8HXcbT/5qL21eKViDKf+PRF5RjPKj7epwGeEemntmRsUdk7qbP8qa0dui+ammwAVtoI0AZpRFQT71Jowlc5lAY3usTMUEy3HFtEKkzpPjHFrSSaT12we7+T0juirjNWRWahY30xit2e5+qsariv3ShauFQgYtc0ne6txNtZrRvJ1sjpXFt11YpOR2ws3gv9r25FSfe0ZzatFKOR7kpglmxdbtsMZcuyBfDOsNGev4DTejEU5briHHeBiMBEEeWrPcWjQPnY4V7h4f1LoPjfpTP2DT0AT8BZeJZmo1PdiCoxkOf353TYuNv8dl+6lp/PqhMx66izoar7veeIh/dt4USD3EQbl8/oxpkwFGJjPc0MbEmXRszA3S1VFcFnCl82R5a2mzbO2qqIU1v//0za9F2uGGFOzMssZYsjRyfCq0jvK4MGCl3GNaCcCiAg3FGH5bgZRBrQxT2VJ2f2THGA+kZq8SJU8pycUbBmIpLzSkvuWDICh0pqvlzNuWWnu7+Rjpb9meJgaGic+yWd1BjWbibaBSTIgrUb6TQ5kUyJQZSGmmufldxUZNSra/vVhnbiwUqsmVSblN6qRFXUiEtZbYltBMt1EKGMiO/bxzP/9uw1aYijY6wolrdUzoJRxdopPTmLHsVsFS1MgHTBOsY8FqulFrC5Ko9QvbkGELc0g4eSYX1VeOFC0SuJ4VevFW+e9abrvtk//qAvx15ig28AM4HGoNsg3I2uGqhN8Y7BNUMIH0YAC3x8DZ5WRSBkZJFUsCYBPgDvSBwApNg5DhBNyTNHLrSDM3fi7sQLip3keZDxev6lho1hnlYo0G0kGU7e8qJs6KjItvjwa1PE7QbDKxMhRvqUfE9dFY0g4q7KZsxlfhfLTLOdWJU2j3vfmS8tqPB9nRWYMPnuKuCD4lkmdlPoTFLYZkKb9KNm7jaoSTlOQUvmgInD4wU7NGG1V0R92OiZsJwZRzCtn2jM+57J0pKX/MVCYpaWcswTIvMSqaFPTi3z2xPqMsd1473TkBPHWNg9FIOWWBZ7/xLd4Wm25f+qz9X9Brxk49gC2HfZsRi5aaCcs3JK46bn5f4uuw4elOAxgszbe8KK1EJHoFKRllae/a4R4iOh0JVtV4RLvGi3jRnyyPDnc+w2LW5nbEcA/ZyRkR3dRUJcApWSoIZPHvWLF/pQnSM5/77yBp2eh1On/sr6iBmbuyCTZjFHWeToP50P2xtzR32ZPjgHSdfTvlTWqSUinm2YGcYqHMGTjbgZCfHphZiVSaU78aKxBR84/vggHB5S31nc7OpaXyTEKIWlaH2Yj4ULRlFCxXZyxauZtlORgD2tGDHDUPatD8Z9oaimYqVbvD/nBSjAby09w3rspVdt78yjv7srxxfaZOq1V14khF4qXU9PTU8aWDFXFjyZxYgMku+2LGTGRvRhvnf+HtigztwygwiPijc/sTfzVlk07p8cDTEPwmvjk8ryYb70uPe/5StBq4IxmYS5sqoJtGDo5rPo41fAyT76XZ1TH3K4OEseUWhPjJI+7Q+jYsabPT0jcMecTJLonmHY3QMX+YhaTfzXACoPjrt4zTV99szWEH2Hl+WkmgwccrYAvv8s3A4BdRD8UAOATAZtgVJd04mR1uPBTNhMcfirL7l01iBoNfs1hM/qcDZQyuQB0WLDf+X4CePqtPuFVDc0o/sS3ZRN/8XnEUvbTvIfyjxVk2/WoESrVcaO4bMduzj8fhYHFs8RqQP+0XEPmlHXAUMJjfV9SVXRX7/1HtH2WOMwLr0N1vn33Xb+C+1iI4RbNyPVABx7lY0LLhtgRGlQMYY2B58E+VMC3M4FO09osQ37pXrlmGjN+HNi6WJ2vsR/qc+o3GDNL2xKm9r2vqelA2K2A/ncnwtcyJcXxm+J2qvuCg+EGV3FrlLx0DaKIA70luIubDFOsht01d2QnUXVbpLDBsY8nz308109GZnuZZeqlwa4u19vQmjeSzyH0Ixn7YxVZ2FPOofjg5KpRzgM9eMcdY8eioMNdkvVO2FPjyBZd3l2fC39NROX0dUhfnL8RKOZq+kB/WJzbWyMiKLZqThkvusatnY1RHvv7uqY9niDXguF72VSH2mf7cRNiFdYDLxu6K6ZvyEaAKqQaaiS1abzWiVXc1OYc5Y3S2xoOnGHNHsiNHf70JP8yq6j9q2/zubpEU5Zy0tMJv017Z4G7HYQdonkTAb2Puiy2HUgsXi1To8qSo8gH3OyKWVFQT1yI2HuKC24lEVTPHGgp4SJgEduePZAZYMoN25A3iWz3gY/GcdOCBntN/QbBKK9xlwsof/Ijvfu8wTVd5+UGr//uhNLamp2w1h4uSRZbN92qu84LAeh4eqhzHcJbEUwIE4paqOiieCLmae+gOirDGUXRK1QHzonL1zqOndTo5L2cTnG1dH1E/0VkJH9Bm0PQoYnRRpLULbftx7pLS+JbdrHPsru3O36fZ0QtUrqMynOZOLhNY1fjSNb9wMo6tnXTVaeDPpRzP/GcSj7P0/Rkzudq+xW4kvwlg0t7+eeTz//KOG6BWQI8u8nuLi/5R8fQhR7z7d55X6XSDJqZ505vwZvM6wHYIDKkrFoP+g4fzMLgRmSEfZhgr6bqCe+AdaH8Qk+PE9yebQbyqmQJ5xnWvpq++m6jSBJtN5rMGITi5FMlP49K+I+L0IW8I5mdpTSsR9mejB14LVUBFrijSS27ZQU8lu3cGLcFOvvnFoIyCSJ0ySwhLOVMZgBXtbrH0O4L/SsDjvAGUtq0g4k3uAbiD2+JuqzjJKYjHVIMydp8VsDr2YhFkEffyA8mz37qUaNeDSuIgoBkUZzMzcqtr2B9Ei4Swz3KdzqZBiWY5T2srSZhHT2tXTO/alSzwalV7aNXX4kqV2tfizlTY6NSvVJfNhoij+l+98bqsNDL4iu0CJeOMGV65cwfZSP+r6H+uGMvc/CsPsF2ZLv6Ke7Te1z4qqThG2DqxU3/lw3nDVu8yHX2cvnHWY0+Vej/ZWvcR52Kizj3SKo+23cvb716VwuALDlcBEJ+4v7eLXzvVw24V3DKywi442lMzXEmj70i/YVeSFeHowEg8a4+4zvp1DgXQWaIx9CpubAJVl+G42+lzDajCkXcqbzaPTgCSnqPvuzEozys/GCfLr5c1Xa5XfmzdYE0KFNWpvuKTidg7uhfaNAaPfq4HThYYv+JLxiXulTr1Vx1GC+bYpVo0L47mkb/nmVV41ZGJtnO/6l9/j9JtX/GPb8LRKL30dwbL+Vc/jwXSaXn5f7wNEcYJ6uIvj7w6Errp7dwvviTdqAWFqZ36TUL4SdppTRLSJ18h3WetdQBo8sYM/kb46QZu3wbAiazaLTn91FXAb92dh+2Is4JF4P71pzcaHM83MT2uJeopc47jswRYM8d8BDvqWgUlqXVO12C+LlA+kSYrjj+rAZUlPfNG9xg90j405F7C9KqpDCCVW5Rx5tUIEZzko/g1ZiLFz7m86JCyORgaOw7DOqWpVwNppXAy31jaMCzwvCOvcwTPdWXQc0/+8AOvzeRiMJe9I+odU67nv5fgsP4y/YwRwDiV81tbzFkl6/Cq7fv1/dyMMJtsUmc0DTBLLZol6SWAXgZicPaETm7K2XWfdwA3DC61AG/qkBGQU3Pur1bif3fvMrLZp44l7BsmB0Qhjdc774TKbP5Ezv0PjJgTnqzae2mtSOHdaw8A9xk4zS02XdhdToAzqxh4ABTWWdEZUta3H/4dVHcHNUd1WRypSp967JX7d22CATomMi2wMkxH+1BkqBhqEGnUBIVdhBF4huiR0RCrDiaFmkrfIAUQyaPH5nuljkzRmqbeNAawEkCOLT1rDZYbVYbpaOYgJgwJnSE6Ch00PqeET6YE0o0MEArKQHgDIhv46bWFgaKS3m1joZ0HniBywl82Z7xhgPS4C1Q+/Yiikh59SnXSQ9SGnFTU++0uOYSVFOSE2UMao6icpmZyLX+pBZ29unvFB6LcVcQYS7AaQ68obIHGAqTH6NDzaaRBeHQ3uU1/n/zwopI+VH8ctc97cFJRb8oiCZdjEwGq6b93A7N9bZBFmB41HhlN+rCmFGvWiNwmqGK6qqn0WG0w0TmNHpl1jsHGA1IzX11A++21ZeqDScrfFJt3ZJdnXP5I4syHJSyE8/zYf+D9go+T+XSRvfz23L+pOs+0zHd7G91yUT37lls9vsNjnPfm79qQZ0e3SPjTUMXtZGLFHu8T1NqZVs5/MQxvxHB6qFFn+9u7YZ9o4gVx1afbC5DTScixSvOoZM3l6VOpdu+WwTl5r04sY5NcHH5HdZ/6FSZlDaW8s3P97y7NjuZJrJQu9R6oNENVLa57orNb3VwCAlqly7CEb2/V415k+l7QQcnV7m1R5HXe/LFeIt+xQiTuYpe8xFo7ubzwL6sl6mxs09dtc/o53xP3bBPTPJvNRtTsC5thHSX+BIii7EoWl8KmX8jQhShifExKk1ELTHYon6PodgdOF3m4rc668FR1YelaOZC1wFasLo5Ey82vuruPh5ap5y2TAFEpO/S9LoR/D+tlGueJ0NpjG8Bf/wlOET9FETmSrjOLyQkx8+qHgZiiSekTk3E05TUcUwZ9ynetAnwDcl/B5wn7uO+7OCW+RVdp6/VLizAnKTJR8Nggi0NpbaUCQVC84c1RqWDIyHAEQNjIaNk8iOQT+46NFFSnY0gaJH/ePIzM5Qy0rzlmNffBB2ky0m5rBoLWh3m63Atpav9mie5bxyJtyGJEtC78ErNmc1YTA2ld/pkfzclQZFS5L2Xeq27urxlpb272xCcHzUoWprGLjso7680foG72R03V4EvuyQMavYxIEQNCm3gvoV8fQ55d9vLwPTZl7T/zsz/e/3pzBUwyHja//8qwh1axxO98hGgrzCmzb+Vx3GuTCVbFXihIPuGglL60uecBeT+vLUH4oMQk1XwYOawx8ijEYG+NOmxLzspZt6piMvoYX0xdhwBHL+GYWSuXabFa+qbPQJg0nzUUM8+H7raV6cjFDIxLvubW1PCUXAVmduPkJh0bHywazG7J4HWlosE+DxSNaY0SDokOkLOx+KLR7IbG8ci10c2iwewO8MgaODfMVxHzWHJiZqK5XGz4pJjJ1OYZxeR1GlJgdL5A5GbNiRjPSqpZSbMVzGN0m3Eu4q6CIaklnxQ0ZslrqWxW1TCvn0vZCviUZUuSclFLQjdkJlKxauKkT6z5zKxy+jJMCVRtMKDqfq4ZCEkIaVQdMpi8Gei3ygF0OL5GN0ScBjM2bYrKsGqHmjT1tclY85K00TdbGJUyQnctUn3s7QlQbHJRmeiuwm7p2cbMoN5DDS07EhAwIQkLhNomoe6zCzoeYrlEFzCpewL95TibuLHNnpKgvFwSs4UzbiReeCgn1FT8h/8UFHSJVmrE7+agk0WZ/t2+Y5cV+nq5J0xl3KBPi8HbCCJFvF1mJFaz0r6qx5If+EGoVUQCgxYRVrusj5KJaLET2InUPOiUYOcMVwfdR07UEiooL8ZwQz5idaun+hYXsuN9lhz9LkLlKlVOXabCvcCcCZig5sNIHhBNI3AS+fo6dySWof9d+kWMgWL4ClD2MNw8Rqr7udn7QSJX8D6dY2zuNYnaO2841LufTn7u7I1NZRks3w1g6GtpUkbF7iSFIynUuMqoCg1p+PWyo9JQbD/0ijQ+snc7pBCtV9jIEBZjliFO/o+6F+UGBkGCOI+fkczEsyr1yapZ1gMKQctk8WFGQes9YL7pp8xstWykZj4E2almUxRsiGaxYMbckhl6IDvWKTTqxH0Fl9yD+L1qbrRa9bo493Y2jzgL0L66K2ibniYSWIU9MEuBEb7FQueDubYzDKZUAREkXK34WughAtLHA6BUAtvIMKleujVbod4RedC8dOJDi2CbOonii+V6r2t9Gzmree6QCpKoK221WOckGnjbMzDqBktU9Sco/ok3LuBj29Wdqoq1KLsUgx8JC0Ef9jpiSg3pdbHARJo9f9PXYwBkoTx428Qw13s6Fh9ziLygiBmuWIk9mJB7/Z5nuKVuACPuQx7d7iXdTwKd7VA3VCMDjyhDPipTyec4LFQLs/6KRxQNqlkMA/YIY5LkOlrbsl4UfO06Z/T58jJSYi7eA0BI19GHtwy2Sno27H/s+ml9Lom/Xzn+ZA9jAz1fm/FvcEUjKfZ2pZiJAvnxeRx19xl9VD14iQlSIVnGEjAKltugj74vyn+1W1hytW4K8k3SWF1JIPVOSYlmQ3nMZXhGkWcFs+dGurypOR1wXKOPt+bjtD7RbPcSNmIeqds/YJD+VjXzibiI2OLmHSRj19sVEzvrJdOHcGV7gM55bKb6Vxj71F7wRnOdkiwvDTTxeP1dCYO0z1mcSOzvH0o/Fm2TzYzGzoJF5AfC80TkAPnwupTciU5J0YaljozEHj1faiatq+oAVs/JfwxMMZT6IO1ovMPSmOodMxfdpzYYvBqi3qb0cIonCv4wVDZn1TEPSMpC266yKMmsztQUpqy7/MAeGQfJEU6j0Jno9FGu0O0eMqA+ulIdEmIBk4Y3GGLpQs5IaiVN75+h2Yieo55UxQURhdlyuOs3mRS6joEY4w2fOg5icNTLC3vRjZ4RkZNIUpKzpLqMpttZKeaDmo6mPMFF2ajhQbHm5PqLbHRRSSkpTBEJbGBqSB8RYOO2lWc/YRVkCh2bkTnXPxnv/PleO3FEdZQ0Q4sGalptLXIud4nBpiogc9FD2jGFcdmcKSlT/25/ivXifBWtrpdoE4ptXbx7kkJsjayF1C81jIvxFtfVNDqffUMr7VlfExpSrPs4zABBd55Y0A2Qd9SNz9Cqt2ojCpxjk0eveopnKGo56UyotSZbF72GR1LI3tcmap0GtRQELdP9WHOuX+/PfGC+kfUWMNimWguQ2SIThIa0wdcha1ob9SxR/dO0piwXpCdSwxzZyBrqi0KghEhnoHyPqdr9MKL7krhfmY4FNZeHbMY/NqnomArrE6Y8wmftOUDwpMjjtDdH1BvmU9VSx72Gx89A8fyEJ6g/8aEJEdq5Cq03ievUkW5egcBtKRqZ9C2QvjrwzBJrBzUv7by+aNiIrt1tmt+Ie5cVcnYbW/2ZsFZwBoZtsELym2yLpjGObPpGYEibg9OE9dvLrZaPGSGbElKNYSfyXIpMrAe47Ybx6p3rwd0teasiLgja644/rF54X8XWtIVEtcpGDVHFGx/Fe9uPxLzKvCXl71b2LsiR36jMnLkS7vcFHKv+rTLu9UsUlJ3MO1p35G1eQ+z0/ETPG/g9sVGRecWgxcIqapR+OQuuFZ2TyxSKUX/YPZGOV+dV98jheLnP9MJKQfObepdE6paVMC+fCMdNBLuJalhvggOci9IE7MxTr4fXfoNqUNHCYFsH5Mg2Fos1SyFNw0y5MJb4beTtJjiKADYUSZREDhnC3e3k0vifJNSsY2H0qLyRj4lWIWOoydNZofRMZ9geQMa4C6KHok9yBCKDfmlWIoXxkbhUs43c11DyscifmSgEla5lW/o0r+RY9Gy9QVwXK9XsD6zpAZyRcqiBb5b32oo9129yP9+Whp2YT6KbzXK3FIwR67EReOEI//4QGN3QrtkAJVaGX3v8KBSwx1U2xzAbqulRVgPhIcKLA/fNbvtSIqY5O2JNl5MnzeDIiUsVyGtmKYAbiU0Wxwwsfth3HRMLwBmL/gCtuwSju8CPXpjiPBQDLqJjUDNFwG1l8tYgZA/zhxQRv7T8WDg+ViebOz44jm+w9/Gj/xIP/ziBPc8zH+dS93PqMgvw5GsB/KnD7BqbgCMzbIZU4hxL34Y8EHZ4zp4GwM6bcAvznAX8KB5B5+4y4GiueyUMy/34osP/MbRFcSciuBLMNe2gvq61OrFkuSGEJLGNZ1PI1kOSTzL6/CRRjvQ7iAcYiV6UYIYOz4eTkwSOqYp4IJRP+aGRzDj/STVxkBPvzEeZ99AyBqd5ijc4ipH0IXN+pMkXhS3M+bpIFmM6/Q76UdXPEYt1N8Ull+rlNQOtauKbhMUDKWsVusKtELhISkD14MOWeSAydTSIYaIvGI1+3gh0tnMuxsUU34zGfua6QujEt4adMm1DGCuHNAP5yiZSygTLIE1s60Ark5Ea50KvneaSTyZ2GH5akS8j1Xa5ZY1NwEOmUtvhWbJRSXAw3dlrPGCg6QgKJlwRCMhP1DjwWxS7aZSe6pPCWp57xiUx8WcFxOxiOWBzwOz6KdPmwqLquFdmtenFXNJTrIpz20gJyycIxTjaTfTjMABmu0kXVYyuXSebV1Ja3WMdUEU1ilQSRlTyMcKCj/fr28wR6SkzNohAXU0v8BimkBgi6R6HqaM+A4/RHE56A0nGPmvAQa2pUxX9eVOOD50umjsxwARxcUKiHoonhfaEhomuRJazMYGSa7eWoSl94smVbAP1FJymyqBXQQ1gDww+3dJbulkoc6Ww034YhrjWC+Kt0vve1jem6DFf0jwb5PL5x15gxVd2NHmKfsIMHDvEyIayx5hXE4Bl7QH3hYPjwDwVx7uuLe31ERVwqtyxYSIiRtGXto1jBW4PVhRkhRsLsHzdUZhD4lAcHW7vxa3UXNXcx6URsAVSdBb7nCvxey5/rvR6fRU0II9E+7kGo4STqvSBx6dnkk8Ko+XJjLHKiJX5eMDvKYarBE9HdvF9LbpuTSnFMLVJZ8BuFOPNhSjq+Ct9xQBMloKIq1YMwdVSoo7D50WuNo3bgl8UUef2+TEWBZVArP3vqh3h3li436UoihDKsanO12Rk3rxOR7F6Mcb587lY8skLjrnVwL3RyhWXHXRjZ/kyQsRTrE6TE4CMnUdM0zQd9yvlklv88bJlPujlGomv96olyWZXaDvI1X6tEDPGUQ11bcS3lrI7gwgcklEhiGhtZVPf+/ETOi1CHA20MHVRHskhgfSHboH1S6ptQ8yIoiHkuV7ogn8o52UfIAS3NAz/bhU4pihCNG0ZDFNm1gsmmRGS6w7nf16ia+4EUAoKQ94wCGv5uZyFXkS6/0tdmLwOxnGxq14XmDkp5EK4MhzMj6SvnAanzkFFMUgmmtzGp/k9gfNlmfCZOqejvk3ke3EPS2YSu0bQE6pmTTM77TxrcKaiCOgSp1/6k/fM5LRuOV6pPCvZI1emvV6xyLg3E/6o5KhrITaemZAyAExSG0KCC9UUPFa9ueacD0fkSBlzQMqWRcvXzY/vKwySfzamcP4ZfSPhl4aruw790uydVhwhhGs0vKsBIGuGjtbJAZYx8sn5WrMRlZL4+yOxDl/CUi8Hc4WhytWkCVySC1FrM9JktOE9Myh0GdQuLxKVc0R3WaAyoAuFiHYT+k+f/pfYjykQarBH9tEPAT47Bx+/H7OjPvTR3zlC3urWPgGVAUYpMHZpOjMKuFw65ZT6kzasWawanVKmGGFUHJm7L81o0P4ofNDEsZWvadUGOb3n+pk3fsVqO1CtDutx3mCUo+1mdSIkEdVdZ6gA+M/n6o/6pc78YfZPafrLkXejntPr/f41MLyJ5l15ZIfAJFJTZKyQDZ7KgfsqvxAe5LdkxvO+/9ytoKP2QD13rAzRlw5ALkEeFSxRmeKi3OQpIJgT5u7dLD5EyuAmxKLCzFOSo8NR7wbUK3nSvIjgkmq9Yl3nFsc7864QZs+GWf0OIolU5kUVF3cciUhsbKuvuKfJEAyt5l/jXhwnV7071MJjBrmYIOu7vYMlQ6CdNE+SQsWrk0ZlJ9qjrsh5bs2RUid/xQBGJgOXLaHkNMYlM7S3BdR2yfVOnWRjRyEYE/yMXrssV6j78WyYNODabW/zKdUF0vVtcJOmUe7LlUyv1l8H4BUToSls8o3H7jRRE0jVMXXSFOw2q3mMNV+9yN7awsfV2Y0HQMlIYn1rV1cLb8CMSTScg2DjVqQhnbOQCWkCuZhgjA9zOdSqIcwrPqD/Lpow9rmpsZ5354ZM8zRh41Vh8pBBUBvEwdTxCEY5qvdoLKoL658eRjGo4bCz5Xr9kitN1L2z5p+rbYI3tkj+rknwKYLvCMFH90E49BZSvDP7iuvsg1fYB0fPkGRcA1Rvo8HEcglmMYJSbE+yt5QoYHdVPPsn23yKPvj7KKnnFe2XlkrSpnzrTQZJeLTqGbxmk/cCiMRzA+69OLC/5PVSNcdKvOO5wZFB7B2GXt4S+eiQ/bG5SSYSwZDDwQvyDg1N8God34D7dJLda0rQ/z0oX72nnJMw5sJPuzcellze6sY0pirOOo8je9hWLGEBjxMnImgnYgYren9B4aUMugrGVwm7yUxXmMrCPJBg2sVAPJmLgpzUcJinUTnakhFjgI15JNBLMQwSpdB3FXcNRgB3ZVUKQY0D93GA/K2snFIhmBnHS5ug3NwHqYT2/cS6+Zef2lyY7lcW3gT35aBJ0Muf4wjm7hhWu4OwnAsL3DSdRAXP9rM6jh4z5gFHYA7XgAey+7jbx+PcveLyeVxcMHvlOfLukJYt/82Jl1c+qtHAe9D6uLoBXym88GAbMUgjIr0/VNgCqN7Xq29oNJrWxOA6vqDxKPxIXannAlvQmkIUT1vWi5ggHLI6JUmbQpHXiNPIrlMQlFSKAoxZVdUe5UpJpWOblYSqckp3nK0I6whqOuST6Z+USEybo70TRnU4rZx3iXmmokEbsHcVrPVq2JvLRiwS1SPW/ILyDDN+vI58ykNEnjWC1ZwEiZ/H6/Rqi6zN2U8Rg1cRF+V19BsxYVBruSGs6eKBdwyqhxGFspdHFVykU5yFZJBeok6wtKHgyPADk8Dm6Plz2O6Gg62NaCjEAsbjAuMjFPlNea7JvDmUtujmZ7wHaZTC8umaqdisY9wR3Sd2k1gcq7krjFCalkic6SlRl1QnovfY643pNl21412TD00ILQR66XT4rJRnmDFYRiDZaM5EXUt7WWpZmhkNUhyCKueMN/oX9/LwEI61NebA8Jd3+uAxhGemR64EIdtUFhPPvOzcP+uJIZ1waxRjPUT5YXwIiXZxGvNE4kGPT0SkmsNxsZ5orDrEFEREmg053pYNgmbaoZtvlsZiFBtZUhC80GdNAqX3TYuZlauHxx1y9tEhVzOaZ829+aXKMIVXZ3oFp5tGi2aKV55dUXpQzuuw98l5RTOoIbC1SoPVjdyr2Q+CypwryXlfjLAU2iw36KRHl71zoTtxrM3mG8x4ysLSkdulvcPVipyDS3mdaYPutCmDZuTkk3hL7+bs/KWpGXvlKQj5GHqljXUrO1bkIL9zcDsh7StS2JEeSqomfOc875Gr3vW2u03t4zAXKZNQh1zIOhR1rqOICNOkvVPdr7i1m1Cqg0VZ6FGisHz3ziweO3oxn/GxRapfRkmrifSzZ+YgKJX0jshvF5B9Z7NL9Xz4qoC4rLNRmCg2k8WxsylI5B6AVuJaf0PI1P06zjFgQnAmY6DggOMTF8HFDObZE2Q0YRAGWurIckFWq1oWmIeErSzG1UOmdArxWJS3wUdmntlFUpdEzF/cQI/tbwfroLQC8iN7MkSc4Wn+bBi4/6RqcQrlbzUKBPmBLcD9D90UA/E5BNtDACDSnFzQENubcS52oxSYGsmHcFrf4p1r0JqEQ8MMfSUMaL5+kfFHkTz6MTK9Hr82fVptp4h6hvR2FOamC60xfNM113WsfGApH+ay79kX9hE6SVD+Pqf4/9hMBvFnfSb5Jvzwn/WL9d0ATFe+PnuJ1EDiMkvbhLOBLWI3EN0VA8PVs11AB1K/H6ugNtD4yqz54RkoxycA0s7tboHFce3UDx+Q2GoFbJTrJ2xlQzfb4TSlwxYW72iAQCvMsnWaXDCTX1+Sn7RhqrN28vZJ1C7RcKwiN32hQ1LWHGX4Iab8AS4h9YkcK67ZlDL/2UyMkZh47ok7jYjcOmclmagq/qXLAWvO7SnCPg+AwY1P8EVjCequTwDj+2DLODzN98WQleEeY7VqPGcQ7FGh8IWRyG25jHf7WTUvtOrlPWDEsRgZR6b7lKmyeUzCkC/1iRk6jQjlIs00x4Ku8V99SFXY7xEvktw1e8WobTuDms0Q6WqoxONk0eBPNsieX8KzajL+tlcWKprllFIcb4NYTH2dwX0hNB+yHpPkgvfqcbdYzl92W6Z+qknMw6nvcoH008XyKuK54XyIUxY/widGLmEea0OY8PAYPXA0m9f+vo0c/w2eBo0IUIU3w/zqpM/WCyWOuTWeD3TNl6Tpsn7rn9x9R4YzIj3Ii2RB1WOWCaknup/j8eG4Lx50z6cJDDRNy/XSwzw2oM/ZhKj48sWEM3zJMRV6n7tBtsljrn58RVUX03oYqVpi67Mk68DoJYSNTNSY01zzUSfDlVLbR8I0FfZ/DaSkUpwPodSPojuU9koYOd7HZCuV4Lz3CSsczbSeAYAvqXT7YUamIj/waJXxxnp5S4vQNDfxoEXlSurJyf1SAhZpEFbZpe6+Zy9Tv3qYKsOyLw6V8+AHYas2aNE6H/Oi9JE7jpYTiY2OnNjcGmTmpzta/ZYyX/040jeG/Xah5mIwDTPNaECN4UQvpKg+/nNBCmlinA+aFgMJRUMIEpYogewSCIj0UorrJrh/M/v7HLuYGm3SuQxZbx1de0VeNsL8x11vhlr5pYv5pfYnsXEYuIxzzZpT2fWQRnwhdv7ilhFpDmxKOr3oO3hGewBurXN868HEADMJ6VUaL8siBxqBxn5mwGFrVmo+yc43k47M110Pf5B9RlLgvjz2W3X51L/5cJ90etGpYtijoZcS+rH4/U5XDXxoGl22ni2bHfczAXmhYZtNXosRkVKiuognNAlDaLTs1ZQgG3UjZ7un6bN/VDla7Gjbo12PVjja8GjuUTHfxafyDOL4bObm9NR8prNePUQ3cq/YFNdPYJ6PO0xFeALooyMAEyhAdOaXfI1B1xwbOWjA2MUmAMm71q1/Hmu7E0sFUDs4H0YGZW5Lo0bYfx3Z8qvfqtGtlnkR8vLQGzZIzkzx/Xk9p8dgeBqW0X824Awip/vkq7aoA+YTERQgFmV0lNzCEbeAaP4Zff0zff5npjXXvj/qRcmqO/M9eEUFIQ4/VH/nr1DZkwgKsLMktBjMIY2Uu9O53T2k8291bvMIhLU3PYp+2opESnava3bKoBiaGH7UgJtpQscM7rRFOZt7V7ivzKl+qQYZ72cgm7PCef83RtLwV5s5rMhkL+WQ51yFAp6TnZZEk/tzzNlK75q0sqvpCAByjTIhpW8yCZz0ySa6oZ51q/Np2WPubmyifh2dEzNoDUvxV66ql/U5ZreJVJy2P1PIv23RlJMqZ7SeOtNdDFsjcfAbyNN2fgVWvqjWN+6dN97Jz5KYRsnPw2XqkLEsaYHUaDPMAHSse1cyZIGjPLcP4a0v3ug/wyaPbAiYZK41kzlU8cGHvI2q5defXgLrWTqwxE0cbayXcKQ3N2/zH+iDHBn/6CSkZ9qVa4nKz0cpZ8o+WNHoFggG2L/IPWf11qjH8boZUWzZxzXDCv0IXDzWBJPMc6pTGyOXIIjBpHUbJRTgVavzsucr53/Hli+TRj8QZVYoKH/D1MbAAs5Ft95Ard9XGfmYvopjxgIORtyjpKa/J7zUPIXP66L7qykkICMJDdgFb5HkqsXVSolRnwFLly6smaK5uEqNlA/rfPyZCl7q/mGhWgunCiQg8hURj0+U6SEdcEpWYKa80LoG6SE45DvC7qyBxccxZczgSqyEKL6qLwpfiiQX3aW5PWUx1uZiPHs4djJNvh6HRUCQfSIVNd+wzO9Vm08Qy3mCMWZtFB/+2JQtI3ABgzb3ZlNVNCwgXfha/7R9fhhIblk0n1S3nR/Y/L7fXcCAdwfXBj+OBN/3s8zTG9w1/m/O61wUH93cJ/3HuxEJP50rw27rhfPip2CuoX3o194NOyX1Z8/yVRWkI5Ktqy+9ekQ4/zTcAWmt2eIFcIOk2Lf2CnAQG6sCuzZr4u8wkfu1+o1VUaP+xNtskG2a9g75WK0YCmaa1yrG6UmtaIyYJC1MJ6EUxBEiXDQmfJhz7dFnOSy0kD7oSLAW7OJKBGxo3AGxcG0sQ9CWbkzuJDNM5280WdrMkk6/h4mND2EL9F/68jG6MdewMlfn977d7vKfD3nDkWbrsK39yCFP7j0ExRiwSgUT74lPp3lDG5GfHDAaXla3PWndk0ljZxG9WfKXP3sD3tGGpcVR94sCZoIgcg7iNbTe+Sn8OaM/50NErHil7BSjljTpMpWqHuaHergLvPK8PF5WIrrzdDemWb4zw53Q+9/dLH7GXHNLq+ufF6tVlA4l0Z/hECfT0QHt9LKN3UhIdoBax4a+S5z/HVnAJEzDnd2NVzxlIvi0lsKNvSmrtKaBd8cXrlJXHo0xwVcD2J/F8jLp2c4f9zxL2O7qTOr7FOX9qoLda+WsvssFxs77mQCke5YKLjiGDoba/MVQ2jtFpUg61ahUS124X+IDSpByN+JiY6/EWxLsvTakP8M3wWRAKhel4ivwt+cug0YaEvRtfgZJvn8ifV+ZvPW0kXfBb5LyLtZGZIL6ZHD2q9rmnQcXWchjjfpvBE5qSZhoSG3KFj+pSbFBnf2QfhUu9/UQtVrixvntljhhVEP7vQ1qh3/x/Q6Qd/TSUErAwVil1x5cd7l0w4cxjPj0qVJXzK9oyXv1ws88hWt/aElbTq0d17c2WeeWNUB81/tijGphzUPrR+LxSOAD/nV04Q1jd4TU8zMtVRU3qluXgEKwL/BlFnnAlJL4jQwcBbtVDyRz239X7vMn9ouSYsfUofd85rorZ/8v6BCGK01clgAXappzmoab4bn8sFgpSoCJ+LIaTwcbJPgHstIRNxRX8bjT65V8O6FzJ2EFVJ5G+60PNN7okfuXTixj80RyuXSOgtvpi88lQn/Py4YmCMmF46GWBYxlpU/YAc9QRMsPhA3iiU6yyKezRK5DPZTNKpKb1LdA4Qm1kKCwwcT23m9p+Dqo7LxPZc+w90xZujX1EbB7ayrveCx3fEu59WGhRezlcsJokZvemlXd9IkkwR9L8nrWAZYEOnjNcjpGbWfYfHCvnWbrIp1Won4eYDg+qDlqhxlldif5dwfynLGtRSmvj98s2WcLiwKWIu6knXALsiqM9i37OtOt2TKK0FhrB+1fXs7YRTpsjq6N9yItDNHriQDkY/MxGs43g4QYfSTl17yFr+wd2ulhMVugtrhmAkrCzhUjccX6vnarm+2syBvJuJsh1QT6iLzcuskcIg5gRvIW8kkcJfWZkLq2KC7rtirzwVEiL6mKLm+74EHh3Bd2qQhFw9zZzklpHrSiYQOrWrh7wzXn83G6eojuTHadcp/U0MzKyb2Qw1f6S+X/xWLrfarj24LNu3DyhxrGzw6ZmRrXo7ZjWag7THHs+y2NH8+/jfHxQLa1E+hxRhzA6RQJmkNtvMrt1eOiP81RlfpZ357Nj4D5uniDRn4P9cxKu2rF2W9zU6/WyH8Tzk63XPKMWdVVe9dE/B7EzpLQPyIRS39vpzmpAecxdfwCqJVI5w5zong3qP3zPGFDTsjxSC5xUqPykzZEpUWbZYI/OFYolAkTVJ3mYRtyEwegbxG4Pp+KPZxv+IO4tj8FJ3eUEeOHCw0UeFLg8ZTe/U3veCay+q+L2tc5S/ffKAmXryF1Rx+SNyM0YDSQczSiSQpohBIHdJ0kOEnkzkilngoYgsyYW+K4ozWyRyvV+jwAz9vTIlhEL1Yx+b3z23JZ+Skd9qXpcn8p8dp0NdC1l3nsZS+GK3RwyvFd7tIC78ELDFQXIQGMBzyvUJnrY8cBFFLmMAVmP/qhy5cRBZxm6oBo0v/AERH2MoEYWPPmNbLbQljnoASPYm3JMMfn5k0wTzNUJmu53CNyqri2wHTY/AcEqU2xqi33w39gGp/e/XpdS929aZGhXWGVNPrcrPQWteeGQbKf/anlemCM6dB4sM9qEHJ4aFIQLlUq9XXzhyq0L8cerBhMf6LrwUXJ5ke0OVBjK8S1S6TUYsLBZRajTqwmglaUhr/UONvYLkwr4vTDSqHbIBv4byXbn+aroTmowrGgU1ZEEaGbvng9JWLtscSCCifDh4u03deteULDXGmGE63C9dcna6sZGffx8vqEzCy5VDDU2H+ZHlJm7uwNiob9jx0y2HD0BMTOOHnXl5W0c5inj+nPwI25dz+eKPIj73iYt3wnf+eywa/5GSBeb4ieCtNEaASeQ1Saf3LzYQxybtR7OC+eZ+yShj/hd1UxUwlfJ9LVGEl2NxuDRYDjLKeL9JeACI9FSCbDXD8RyXldRID6mkFyY0mPs92rjySf9qjelMnjZV6Jsq3m9BaD4bwCIOPyXep2k6NVtaS2RQC2y00nDTGiy8N54dYvC9wljxYQ+lincZn5IxVkovLoGONjVnZOlrVtfCXI7m3mfWDjl6Ys1OPjwfOZxc84kGoZr4/n7AxmqGMNRnHW9QKmgfkndPL9dDs+Hnh9nAUBxAGPSASLYbxbR9s5TA07UPzeZNe9P262Vu9DtgXCMVSou/3GprYScfptH8mAq4uemEQ5QzhL23AFrk20BlLHzWtTtLdiiF+pGvk6fknfsqbVUULbXrVA+791yQGpkPANqg8mEKw1tVQdlCqUgfghq2XdjsamKIOs6PIhuIRxpn4HTJjgay/TUBSXxpReRfKpyKNzeh+NkFuLUwFIaAp+zE1OS1qaR+vgVrVy80URE1AX6jNP3T7LpNy4gl8dc0cag2Kk3SW/LotHdGtyHuW0O/oxzA4RfEu6ne09Ar4x/t4893FwBqBz+3wKtyZiJZeHTeZZzl0EswoPEQhaFSJ/5ita/uln68H5JxHJjz6Q8tzTbGnNIF+5nBmVMlJb6NnIX72lFJquVGrsKFF3f8kYUjZKnY4IFZZVW0LRdxOYBWzBs8GiEstb16xkkdDcv/G5byJbcym3zbkRvqedrwFnzWieHIa2aGBrl6LzAWCckR4sW4yHkcwCWQDgLR68HRL4OKNMEEiZ9XLbv3dyIXndV0KmxuSUU5u4nw/Y0f/sINd4/F5ydIy2AC6pPRRPamUmK2YKpkApFtUTY6aeosPMSjB50lpN3khE0hzTSvEJl5lkXenNQ+vJUJIYU2DSNrM23VIu/mt1LyhfZMDNgHKEPzWNQ9LIQkeb3OwUBCw48S3/zRvxwa8E37G60LiedFKSIvy0VYr+pd0Yvlhk9ia8G169+HfC5Avo4MIlKqeZTTqyLqnsrcg5golzs0SdMLB/Hz9h4z1yyj3YmtJV9ihPdn4pXY3WvrCFu+RhzXqv+sv9S12DDne8+46ZciDI0kCJTgSBdpQIPkPNRkLCt0JD7TCXcRx5uHtM7bzP7eHDz0b4UDAYRJPozGZcGdJj1l5TGz4kP7diU9pE/TXONzaR0rPTva+hYwznwQaB3jdPj4WivkNIWy9kxEetVnraNDMWHTLUHSApXrdLQED7re5l1G7EtNl7P99GBpznP85SPBgzeKZYf0BOsWj+5RcSfl3hj4sRgikKVdaefK1fIXR7Tl0Y3UHTaI0mUGfAy7H350wEKK83jljYmwAH/WqRuD4aua+LYrymycPScYPTVmTia/udOvhxx76rHwMev3I2XbRHbgACjB8x3dITNZbP/yyIvBHO2y23NjoivuuQblHsKMQGFW0Yde6gwaXzBmMT6G62bQqTCDmj5277CAu+oo+3jplAAx46DDYOZuaJN96nMZzU3w8H0FY/6rObHMh9FS47TL2HvPhvzkLXRWHxdu2Zwszyt/6S87CjPgqyu3+ECAw4hXzIDFIV6//+P1jRssHCNCtXA4rO46ghpl7sJqrUDGI9NWwJ4y/j0hWjG9VZyhvGojjpOL2JynNAJfQ+KvfdVWdgW0cYTdCBvM4b6SAo2652R9Z+wtc3ghEwhtc09hFGrphLlTdEVWQOWzh53YB1wZi/u1DxkBEvbqZrjePRMIwDmUKo18V58C4hdVIzlelU6qfZJkyhCGhMG/H5Q5fCy4bQB/KQZczi8US6WsPoPRjqoCnganSwUK2pEa697wMMJGXN0SsQ38zX/kpnZFyIm17gJwCsThkbSd3XGURwB25VO/vmrMZVeHelriDuQUyhs6EJNqbz1wf7vpZ5nsI7gRC3feA3rHB20JpiJRFLZ4vVM2XnnYexztxV29sX4dAuPPs0/yTghPHavFWx6KPPxzpJpTLG+iDdZBVV3qVU6oMqQ+lbF6T3EKZMLH2rDZvnh/lhNLwsAXrogjKQBmmP44CCB5hmuHISuG/a/Ycm1RZQOrKoB9xbMNNeu2+H+IGh8/zpdG4fELrvDBpYke9yhMpWcKM88oB1WAz7ulFOZW2Q1aZdo1E15W2T1vCYpX8tHcicuQPCCxu8xJVTvYHt6hXlVkbHamdzYnG6kf2JnLXuSYGLB87s0tWenvp2IlKI3HRKIzVX/mqxP+2Y+7ibog+jtKgaG1HdgdRTqzaHyrfNSTKuLGv5/LG+yuPuzSnRsIbK6c+drk7d/qeqYt7+OA/FdL1wHn8NfY5pTz1WE57VI3iXvnZ9hqUEt8V/sXqPqdV5kdHhjfM3lCy79QoYdyfFyGoj5sK/25zJTjcxopHLXjPlF45zC5gxUlKnenNrdfOzucWuXwGmVWfvUuGfDuIWx+bZtcpOkApRL9X1VWXHkY72aCSey7PfSSUWN24NFkZdztJlc6iuy3ORTpopMEmMRjDygPlIIRutR8ZQ4Z9IJhAW7WTHzf1c8aDHH6du1+AzGIBtLmDIK1QD4VNKzNGGlGacE7OLw7/vhkqOSw4hj8DN5x37TMlGIjT4vb47CoJ24btfqS3Ai9dhZE3ju6tqw/0yAGjghS1IK58cN6m/7qXV8MHtdYFfMAAhCvA+v4dXoi2mqlih8OouSlF5dCYEsRohm1zTHs8w4RSI30+GuCOgI+94Ggb+8ijtw7/myeNvqAKsVcnQAA8VaZ6aJjImdNR7IV6SV9mhTaWDd1AAwBEcu3lWG6+lWjp2JgrvsjkCXSZYr3s5jj+/LYsOy+LD6KtFWkAG+9PJ5C6cm8ihWXwMcOXsOUAI4ETDeXFzfuAz+O6qa/qoRGKfCELuON3jUDQZarXTm9lpdTzIDenTIVP7LLvJaIhZvmoIE4XsvUN+PjBkqMNRuJwYS3KsK2hxNWngaQBBPpB4ukZNjixkCpu1jI2VJREoPJxo9BxOaARalDlsTlwIgZDgVtx1E22pqKvM/syolQTLNbl9hvwhEn/+ii6yFi6LsZI9y7NjG5Gu8cdOERnKHGEJE6DamNDtifXew10kMVdmOS2OFfl3YLMxObeeIOqdZTLJf8UtK6Z6/Pf4pUvS8yf52Mcmp3TJTLbpOYkb3YH16W+AuDfwqbaPT8H0gXJ4khmA8QlP04CZdWANgDDAO5Zo+gCi4N/+B/d2/m8c/aUWdwDK8C+temY4+/dD/xyl82PwbdrzNNDg0bbkTDefT8u7zwe5utP206ZDOFxfhO0uAoQB+tqLcdudmr22NjusfnIXVQtl+spiYjpUMlWhDWbOM37prPfMf589/5JpXbjK3ao0ATJHpIFxwIcbB/AyX2U+TVQKds0q87vZBDqpJVHNWcqmHxeY+Oc8Sbia5Et+KCyKX85oDM96nuQYZX5a6zduKtYAdCqNkQk7irHfhu3OlvIVX2CxlHNY9NAmdK8MUh/NhSLsI03e3Xn5H8CcxphqAqfTtBmQIkadXzoFEwBj/nXgt79oWVHLrCBOTOu/3Ll2/xTUoToDXEQtkSoqIip64r4zA67pVa9lJnwaKgZfkADCcx9usfGXX04nNixk7o3fETgMO49OmOkuIGgZwP+2+uokHImPYHCX/KqsmjgO+p84G0qzqHrBoD7+p0w5meVqPo8eo3jCWz2sQjjPovoRuV+c9kdKF6fl/7PiczhFh0XXHqFm7hx24kjm0XgH+C6mg8gDTT7LuTUWrPYRCPZpSFPgdWtVp4W1JWj5tHG03tS6pGzUMcMXV1M3aYd5c340ALQi6GHPw3YNDTXeWuC4DfVDdiakj7XjjJIGse8KCVFnUFKeoC8GcXq3bsAB0LcqNNwUjvAdF+7IxzR/K+Tvz/n/E0IR3EDdAaNs+Go8p0v6cYXs5SV6YjNPxgFuzxuTc/PMIk5HodN8yiHONpFuIc6OlIArHoZnsUwu14j50wmnnG5bwziDdi+Ku+rrobcObBzgA8QyXnNQwJ0tLIG2NwktQuuNdsBJ3BhwVAwwcbIjN27hD5mMWK0v24Z+s59bkjiy4vQ65RtBlugmZq5ycPjeztZ5wV7FjmDjV0HsElfkK1hnd4+arcuUbAGHYyy6uNLmgZNnM9IeHXIzayqmcsPCRsQRbCFcByMxYyKCsZxo99jXdojgWE1JYQsCxIQf+2d7Nxjknvp3gjSElIBruW4QvEUBiqLK+OPKSDS93jKZkj+FShNBBDi80QoYBv7DslN6jqCjWf0qx8Wo9MZp51ec1BM+WHy6mjZNQWErvsreNlWWq1pJVZljlEJIzjOCcCooxZpoaKB7cjEnXOt62hCgX7C6gBQYWDmjqpTZ+7LjuasZivEVlHLWYemXNjRJPp6SlM4P+/4zKbqkdp1i00ilIVQq7IiZUDE/F0rOizg0UxiC1xujOKqs+sOTlQx3LJyvwF6xUYaZuqZ3SODXQnt0mQNquxXCqO2RuFDiLQL0TOmtWsfJHMAwrb8rc8hnXZGmT/zdAHb0myJnBTaHeYOUQS80SjcJQOsBqppofveLBsBue5DkmFqtFpOSrptofCDLIW3CrXsxMCjwVVazGe77NWab2HoV/SYyEUaBU8lGrGcQuQDPvn4rGd04cXreTATCTO2AAUhTXbR1Gtu4vTH5i0mj5OZAUjGVhNcdFG/BvQpWjN+n6iLym5++EFnLT15XB1ws2BgPZxgHND7cqbJbZCrzXRa1BcduwyyrbjNDCCrNoAvIDj4E4WAmp8KQ1kX79JCKhUMmSmBHhO4Q7C1FKF+2XiNNxvCXc5c8hDbucvAHyyAZxc0y3PSlgE8q8WDw8sVOO53phtNkB+iEeoHZq43g7c2t74M+wnB3BmCspx2C4RFW4mHYVCnrEwrdAq28bgBw3FTxUwv1VOV/VFSw7/JUpdWKacIFqffrvwSoD71A8sNZmglQnWqpJTOgkw29vbGeTg49fgk+/b51poRs6lybLO/CISkwzxb2NLOOk//F+qcT2aRp4zXRAnrn4eNxDLl0T8FxXmNBaZlq4FmbKWC460rESrvbXoT7nkmtShIgy9Iy2M6pTO/jgg6wEhoT3Aw/kdAwUjoeET/cSCRADQt/MDCVXDsOnLXaXc4RjfHvAKrhHmoiR4J9HqleuhKtxGolkvxfcxI6gbEweWwhOatLTNian8faXBtrc22srdMA8eqcmQE1Xuh64/TLb6xp7TtuvmJI4irk7RD1zjBPK50qi2WWJSeR2FFdEteQsPJCvTG96jI1jjXqg+C/OdOdUXKzmCqtPufT3PmSRSuWyp3OpbqbO7y7EYkL1ur/AH1Ss8A/qZkfn9SdgI+/tz8Wo71Bw/Cot8u5Hki6Hp1s7GJjVMwZrJ6IcYo1krBs1xomMIt27cBiJYPtVuE4Xto9qIMIb3rIqn6xQPwlkDXvnwL3iEnw5k15rp8/7mqYOBauYjDNFj1gxvJoAZ+JaQNY1jjduGP+enxg+LspebiU8Q5+4i/OaEbf42n5811mYXnw8Rd+cYEEYosBATfLUcQNfu/r+3qYcGEsrwX82v0FdHlbRj/NB6pD86ZNYn5Sd06rcAsNBuTHxkK37i9RfGrs8xjAc5JimxpYyMTW1kOJmd0MmI48AdiriI0kVwmYjjyX5WeyHbE7XGkzSzHVwLsz6FkvHe2svaNQvYFhgmo3MA7LNLPY7D2dlja0lXLQ2puP+Wd5IjoA9wZwco4lmu6AvNnuMAnqRuTdj1MUHk9dwpciSmQ4+VqYHs8g7KLdjbUyDidbKyrRkPhbRR28x8kGzz3DynIJpzdpzyajeKHPusz3NgUgXIezL2MW4GWOvezH71h9jMt6sFXOpQloNMUJJjqo95+ZCrK44/YehMxRx4axIaUCxuuoYGVIo4wjSajQxY6A2ekBkSWZZjK6yKtjcH6+uA9vBq19jGykvrnSPWOUnWznoc+k+Sf2FDY6aEGlCeN1GrOD9Zw5+mznXdwIP5rXDlxEqS2l6VbOZgsvc1zi/dgAtrIHI8V3u9macIJVXpJGZcwupoblZETceHFar+Bpmw1vqlrK2zVabYorVBsgnJlhIKFy39A8mbWkOiblR7shYcRCZqX5rZYJ+LxvA/wQ4gFZH+cJoO9XaW8B3YoM1MG8nWjwK3zFvgMZRouTyiQvoAPLTwGgHNpNQpqmeq/xU3j7ircwjLA00jTixDibyTzyBr31duBUNpfNQbvXUT9SNQxI2tFEuvH3uU1PNTzingd1ZxiWZvW5zxlDy54wPutVuIZT5AoDYR3EobV8GUO10RcckSkm0i3dQ5IWs+08HRspZdXZuvHKOujiPIJg5uwDGW99LCexzUZrBJ6FGryBHqfJAxeId78ft7EwzC0LMjPVItfHknh/A9O6s2ShuCR02nhQOxrGDJJdn3LtLckBYySeC1nhaG6jtGAkB8gn+AJomFyZSpkecwEtXa5BH7NHNNYO8gjK21fidi3g+c1LTsoLgrwHnA/JYUw3FlevjGQ9Q18u7hssj6GA8XJ18/Jv6JKIDbyB5yN+i+DluFRk/v0VCOYLi1dRv6h+hdoph6htLHDWTPdqOy9afCqmOvVbcpZinbk+EcNU+DzFsLPzKS8qfLnvVhl+J0nUmFP409f4DkVrakb6WW0hl2IKdqUW3DI1rV7CxskQvcS9As27YGmFqujeYZ6SD0D5yAENkhYK0sRDmq8MLh+fvezy1S7vLoWPCx9cIsGCwXBg35yX2Or2pKSLXty4V1bF8xvKXYx3+ZpAaa7nBl7MmJ+Pa3PtcU776dYe9XpCvX/hWbsLmVdysn6qJ3ySkpy8fGQfpne+XdDwtP89cfSW/3GtYhveq4/plSyY3oQVvGfyis/nmKM2GoOUREHSFYEk+vDGqkwV4b2Z+61i5rott/PP3Zy/nPB2LRSBmBx/vLxWFfHTADXxJnBy/I3FUst+WrWfmOBmHe023s2pBNJtOIoDqYDBJqocea+ddWC/j4IaUxwAEWZ0Bq0C6W/NUxMuXAAAHnUrJyIrOiERfg5d8NyHVsOmLQhveOuiax5czOm4WaatdqrOY2i5DtDpENtTHq5Lr5fHmleoYRqeuBKF0sLuUpcWDPcD2ttfR+BF/t2aESvHHNRHOwi0fmjuN47toUUc5SD4CYlqOiJVix1hpSqthZFRhVmU1EJ3rEjcWqnq94sdk9NpzPjXs6+9h3xsaGTkGf2Ud3dM0psxcOTVNdrOh5+oigMk6avyALk9pZoF4pz1kzAU87azp19OW814OzGzMf9KI5u0PL3HiJsh8uybaJXpeMZUr54KQ55x3HgIo2/wUwY1A2fnrxxtfxQvs93xBsLJGRgY5Hq2EJVko85iv0X59ucDQY7CdZzYeoqM9u87X5pgGWa42BpvKOcJgGSd3AlrJDR0bGH4KjH2ScNIl3gIMGRjo0V8/2DNHMSKvGg5TlZHJUU7g7evSWbq4vRNUpPblZuTJhRJQ+iViEwB7Qr+xiNPUVErOVH3aRzhrNoWxUEi+mEkK6aDW0uHY2KGVvLs+P+n7+Wk3pZreRXlL3Dmfbys46wPknCk6i5UQsy+1x8Xy5piltk8OdmxERA0aArmH2k+z+Fhe9SwMLZFcTh0N6WTPP96ltFcjgqnR1Yql8KgHuG+Nv6xMhw4narBuoBCk+GoKePoahrb+WjtY/QjSKxOB3Necgh5YBdWumTgX9MrKbWrh7h+DNtvlAsRA75RrNmMDOTGCepCU7Eclwwbz/V5rsFMxdZR/Ki4KNOE+jGp6OqatEa6ScOMqhtjBYHMK8P1Bid85blD56vSaWqYbhh/hKrdUpWlZGciUytKJ4C9a0f1SpKppqRvpzZox/2KElXlZ/jKU66uRVWeju9vB1+Zmp9LdnV57apRyVI1LUk/dXapr7SOur6urcsjSVd29bh9pp9KRWv60ozboQ5GRGWnVNCltOfW1MozpubDePqnfduH88kHPtxX2zXKR0kyhwceFdpL3JwcXQp7+MycX8KjV+DM2X3K4nv9pl4cNoHKFj8R16ItKt/ELe4lHz+xSVDrxbP3S5+K3oRCyQovZiK3ye1LXMwIr0oex3pUGePaWVsGsCzeups2ttSAB6vJGdorKIyTfHVQL9z42Wqey2uh1jrceqVzT8GGs5QDV24tINCMhOy9UN07ws2MqzrDkrW3sHOlcPITmiCn1odGHAUc+13aN90jdNSPqoGfewVcVJ2ZBpCz41QZMbiuPwa/EFivUdbEt33Bo0E1ogES+UDPR5JWuXdex8KlCQTWFurGVtrQLJawiyH3RhYWVal2Y70+cGQwyTejI07f1VZoT65mr4rlbCdHFM/HfUhXqP9gqOifTIMPfAsxGSb0AeMNrWaOmvDJGAKSC1KTElVoD4OFohwHbICQCAlMv1qZelHydDEnX3qi0gpvQpfdGqA+JXfxN/3ClZtXd1kvNvUGiG56HDwzx9XCNKFzi+dJsIoxtv98iC7bbUuL+ch+qV8JBObgYlG/bqd/lxECY5zIzUR0jvd9ucx54bf1sYSwG85kgY/OcW6umWVnEONpDNOQrICjiCZYr7gumxCSb3manUmEnoTaWLq9QXJFSVWTuJ9OHLmaddXfkE5ZehL6uwS2JSAlAgBPrv+vPO39nqESHk9k/yHLSoTaS5W2VJITiIyp+mDCs4+YqVoCat2sXSaGQZVhBw0PstspfkjkpfURsWD1kETZyp36tzJuHWoDhEQMCygxQPkzzbyG5lMxmTuHcxvphWzyAnEQKBxTLF2kZUipYRl30AO5L5jOE/MDKu7JgtEAQ+Av0QKtdA5jIAcrkoRSWAmEll2Tg1VYFuHkHospzIIW0W6ePZ0kOUXo6UWrbV9NGjiz/erb4exa0cuZPZmqXZBzIQ3zP7C8Z+vp0TWussG/6KEP5MPdgFpUxbEWsb/DkRcCJFUTJGoL9jEOI7umy5c7X4uZJ74IkNViY88BflvQE7KxVun/1ZOa07SvKqdqEc7pt3NL0lcBVI3io8+e9IbIZaDFqeLJzjighpP8N5MASyUav0WgEPdYk3EwU3JmTYeWs3KhWTCy1yJDoCH8orxyQZLdVv6pfyYhb7KvYtm7wA2YhEZFuCG9sj8p9137/jfUHVrrCCPDg93WIKca4zwkXNBlBMM1ki6bZWKuJjULsaLfqcYNJuW4YDk4fhyeSID+U6EeBLn93lQQmTrt+CQpxSvk5j2JhFpMsQMBxs1YuFvwsMCVZQqQDpAgIjtwweXpSDKaQoz8fYyjD/J8oacl25QdZtBk3xcBEhULdk6ZYkVuOqebuapbctY7Sr8YxN86r5q4fvCX4m0d1/f0zTjTMhqwsTIHlCKBoSo51yLNla+tDjmOnzI5FqfBkNllJYfc0hrlAMOVlgfMU1geKvqZ/j1D08g7KV+BDvYCUgHolPy3CWm+NNcIkGVop+D68WBW+fpufQKup+gimS6nCVOLs1UaqWrYmUvS1XHUUcp0MfWxSVnukGx97GdsntIwcP/GnAgzTivsWY7SP6OPDdfLpQjplyruRdjlsnpUeabWYI3KfMLDbDlVieUjPmkFtMr7rB4mV7YQflXxbQUoPdQYtnP330uVYISjBgOXpEurFZFbIq0jcC+RSs+mz7GvI0FgbXMfEQGnRxg2OBUjWi1G3G19fNul88KKjG4anYPUnl3d7mXbwb/u2VI/s3n5/efAE8g9Xef/XzVuK7UcfEqgZMoCZDWI3HBY306S1VBkgwREoE4mfgL7k3jRgKLXkPL/Khtp6NJhD2cdiBeLTL4MeDmFwD1KtHIIVZKLKG3spoiJlw7MVclkkroOkVy8CMWKhOlyRaoBJWkKQSe/3Qtb2U2URCaMfNHSp5ROPLlM1dCZbAgP8A6Ze784YmjpvGkSsIHowo54CD7rNgClgSTisMH81gTsTDJdbcieQXyGt2ktQTr8CcXkNl0cJH6oRCgYOnKAdFjRaBnGyKYllSMIH6ygUSIYeA9w5sNZVugQkagxMN+0CTZj7C9RlrTmYmD1wlU2GV+dsrK1J/+pCtyPQXIAPorgcP5dN+GK6IV/vIRlooWLUnk2UwCq4j4BTwhNl0T8Fv8eIdYbqYBqVW5yOWm8SNk9+3cF4BRYmDgr8SwJ0c8ST1VWtqq8dRWnNy9QoLOCssnR1PZS/G/9eRZ2GArBrqBqxEf5Iw6FPisgVHG3ji7YArb8qwWLeL4FHKTe7ViyUhF/TBftcl2cIttWRHqr3DAVMW0rEDOxvihh4G+TWBaj21dD6CKLXX+KeLYQRetjYYn7i0JXecIjuvEOLruBo1fpos8wNy+H1+pXxitl0FTZdn4S7uSjTz0kgGcTqX909+LhPd0eWa4qaaUirZn5dlbqwl+WcXuPt9Qbk2sbF7g389BzsmlDRCcj775eoAQWjfnA7Guh6latRmaOnok6tCGLy4ZsdeWNENjhTpI8TPE0ObZGhxeiqfEozXJQIMTd0eml3YKaCdjqDTrfXgDt+BfwzlqULSvKllrlGi/rKbtgg/34LlVLyZlVcrKhx+4mqtDQZbgYN8xDBow30WzwZv5DJ+PlzQ42rZjhNIRrG7lu0+S7vTnkAMeqDtYD7Fgl7eyA1KHl+LyJWPQsDx4IcOR2tYeg4m8ZNIpx2qHDOuIS6KmvVBwWvZJdDBBMqFQZ73VRSX/jw7CTVqG0DB4/jofXr7FseK7bCigOMIlCQ/xSAoaHPuZHKauqoyqedlp06fY0zQGHFOHdr4FtEVZAyjwwInE3KIbL2LGPi4Z6CLEr/61rSVZWKgtHmRcG4c5SwfgEOfwhZTXCRGyAk7F+0SSuBz4zCy6632Au5vHgEKUfMrL83C22bUl3iT5XuXzDzZXu7X18D8q+W7IHlrKDuIwcTpvwVcwh6HYslWBVFILh48/JjV1f9igkrn800tnslGIjSFFedZ4uH4gzJwla7/BIKj5fpgBwEk0aPfVUJrbLOrc16B5TE29upv3JblszntzNha18CCXII2ySyfTTSxhTHYnUPKLHBhxQ6npsLEZHPjSPJNZ52Y1CfnfOJFc6arXE5tA4t5Ljph9sTKUfEvx72oLKz8l2M4z9pn3HDPgwfPSfzi28sH//ag5Yzcl6ZMohwzkMj4DNnDD78eTYnduk73Anm/PJgR94dYP2bdeVI89GXGaePEqJxikYWxtTbIZkUTDVFklyFkWiIOaztM1LN5s0wxe2oUhhX2DHSzYMOHKdX+oXqYzfs+nCHdQm1va7x+LGb7YXylnCRiL0xmsN8xBxzGy1thGJZ6MlNy08vPyzRdYfjhMjpbmkPT7WCAMJf0q8vvP45uHQXw5OxObRMBsdxb8WAPxm6/nZ4/fdc8lTS4FSA+vvgs2OH9q1E9h3jhc/L0s5HuB10UrIOU+uuXZ4c1vPBAlPN71bYo17dR493Y+oP4k1I4LqsiAHRrXwkp6uHH4i3HreYG7PO3gFIF/LmK0O6H18/ZNPP6C7b81HnHPBPdW6N1bxNq+J6xVPL/tghAh9o8dDnftjFMNHP/6r5tVAnR5H94AJ+Ow+5zmbi/HUhPyv9nblfI4D6lVv69aqmhE1RskbVz5OBYJ2HQ8ahpCREA0egRTPvm9dz3XI97uXvEnJnFIM3FR0+syfu8lIbu7y27Vp4zKaZKaIj++ha6Gk4/D9OHZVn2AiTW+q7TMveaR6hTsEUbda5IBPB8gSjwzHKUU3AZOU1IY10BsCLl2uPczDCJj0yL4YPdIoZKsTrFLpE9zRZHj906Nh4swfHPNH0ZEIvXFcjb+3wjSZ0N8p+1H78zUyTemmBvl2toi3Xn/COdQQYr+fhkQPJ3OWaWLtdODO7hOP1xMKF6Xlbo8c2oICTdb9IyQ/Ax1aDkVZBjYdjMXGJvYym+MJxsMeTiLZNHdqY9/GUWF1i3g7yyQSSLzAHMZe5kst8V5cc+D93mmjyVprTizr4Y4Tix1KGarWeZBdz/JnCoMmgUEYuJzFhFAwymOSUicrQUZYHF1CvAH4g9Y8/Id9522RQTOrbVUv+wHiWg3BLuqsmQxIdSJd9XyCBATaOG7ZLAiXArKiA7UEibJbYznbtRs3xs08597A2u4V9vL7n4KUodH9jEx9EnsPtyJ2O/HhRYglYutWk7p1qQC+b2j8ldVwlPm3I98+mFMWNR44NJh8ZKiL9ouMJmwl4fOOSOI0hdBQkdbCVzIdiuI0IHmernhjcLINMzmOnqEjPdHOxa0izz7jwSUWq4fdhG1I8YAPjIkhYhmS6AE0NxwZOtTeNZIbdwVc/T8hSkQGvZ7wbkN8jFyFbNGAfDWJvLolCtPFqX3zvXYZNjm58PSCPd7iCYxpd3TdrfTEi9Y5dz0HOuHa0hH5VI5DZgJgZS8USpLJo9XJN9/ipdS4jUJEWsH8OeuUDbjHRN4Dnb0gdA7kD4QwpxvjK5/JxM0gpI9Xr3oyHldrOzCmT4I1jToLe/8SzyGz49cwfa2ZDq8pIrh4bAaJcVNLub3JmzY1JJsnKC9SuaeQsqGTVy87UeJcjHK/bsJBJ1lCY5DIKNz6Y06Unjiun6LTdtWSd8ZnsDXG0WnlSl+587FTmVrnckfE5vPFzlgg1KseScklJUZ9BXgel/+ez04AguQ35nt8bjJ2iuXJEFbO+kbsA4UqbmdX5o3YAuh45Ez+gDH3flMnf0VjNAXQDyPsNtV11JWXAtUjOeyx0THx1QVCGRj8vpQHuHp3L6UbNmMXpVqWihWuhmOhkhTZzpoY1HR2tz2e+rYffDUdSdvlSf4y/lwZYQxHn9OKf5QN/20nlMAahwav5tcN63LyC2uN+e4RuY+4WEWTNZUvYdHtZpGOZX+Uvgvd0Opsh0U8KIdEhPlJpb8qoe86inSBO5zSOqLu1Sz60KJQuTW914DDqHGoqI7uBbFUywLGNymOqqFaGY8DrN83Yfe8p1mzioFCHTY+acG0q0pbT7KmBX2yybw+os0n024l4jc7TUh1t3Pveu0ewIRvoU7qyafaTjIj56iHj6eD2LbB6N/YdmuMbAqiMvvxWvD2SKc+vJP8HSQNbN8I6Oe+Wtj0mPZIDl1OPb71bl62Oeag0jvRodbOCtTmBfplAIv0bMbOQ2n1oWRXuaIE6cY7CndZi8kkNO3M4RWfm1BtC29B0PWhMDUpJON4atjU2eWhKsOUWEU6go+9l+uSQ5D0sLI/UrZhItLkWQrfamaMxhKSZWKz5TUL+EyeEFT4Mi7c6jCIM51FGb+SYBO+/GVewPeo5AnAxXuP7adGgrwP2RUp4RiklOhdCDkktzTGUhJ00+lVCPGcMjK2hpmj82L01+qB/DobaGTvpTCWzSj7maWTCND+hIElwLTNz9pBrp1S7xGIv85Tg8s0E8kzotC/WTKnAlrpwCOyUpf7hFZvVaXtLMmFQHVPPka0PiZF1VRGZupcOuTmgiS3RTGHipAecgWCZZSmT7hKgPWL0KOX10sWbJGE1Uu0b+TRww4Kuryq7qa6EIxS5f6gxo55WCzFjGDtFVCDG8awq3XHl9Ohzcdr5cCYO8dXu/BinVGKCau3Hedc+QGqubOnqM+Fy5PU+luqL1KvlWA66XOeBYZ6xzuenD1hrWgyVaoA0/W+BhQCxkiTYOglIyH2BpqwQytPO5t7ed0ndyfTrlRDFvvn3DcWgQtRho97x5jyq7uwOiqhDMSGUmDD857bzN2M06wc5saCMjNPZue1nkQ3x3ZCeggsV/HQ/aGL3ufB+9Dqff9XdGW6a4ck/5yr8g36Wvtl3pJP4GyvjFvuYwHNnXI/9OH3wXdypdIKjlT85MZtf2ETgKkmJfCBXRQfKULUDlfOSg5Szd3lyrDUFJ2H4DBTDVPNIcdssFjYNPc6WxLmOGRlHiUtDN1h1wbSexDiwdJOna3kkfs/XNP1aLwDoJeDgAWMh41e8KkuMmhurfdXZ1Nz9clWKOSGSgfBtFwlK4JoMR2NHCw4Nd7qlP8oJuGulwdZH1Zd9vQoef8WxwQsi9vcZrVIW3rHw9pf30BOt0B00yBgG178fyEFJl4bRvTktUUUyVsx91AusdJh8VBpTnbyv8qEXT3EM667at2158odyJTeODWjF2LKu8fuwIHZ7PMwlr3P7IwoO3/g4/Pp1h0wlHps+glyh9Johfusskaxt++xSRvV1oicVlwsHexYahYZmCCJ1NQqxwuy7iB9lhGCyGdSETUn7Pyxnq/wk1B3Tv9ZMvAtFbsca+UKxA05SpAW5xNrjUlhl1PNhllAvPUkFbPKvDiDFffBpTQGJkAd/cM3cmuHddJFGWDU7ag5ruNtyT19/2OR85eVZlwAtOdxL9fWtc+6dttaaqmF9qac6AxfId1Wl8iykfQQzcdeDasjuYZRRAi/X1C8YnwV5LDLtYLS8uUb/oKPgfJTicbzXcRS6DqZfrT4FFHvLK1lAdnKmsF5SzddGrwIEpq4w+lnog8PLZ57hVdZ/iBMxvVd/q4nO/2bGPW1KSNnB9B8l7lJH+oA/Fd8Fj4GeCoPKwceW6U8+t6badWluHONPo+cE9/qkIKPd+//I2CyHy9fGBc/fguXEGI4vXQW0grdXZdCHSx2hf7tkd0SiZUmWUJNbdhKkUJKJz7HVzk1E4nQDSvEY3Cdv8YNWEyxtKD3PA/uarQPpzy7E838nie3PLKzSx6WcfT2xjpdWHtrt4hXqRG11FYPJcpJl+NZWkWTTv6IMmsNPBEYq2dUnocsuuto4vOnFyErTSEn4S293oMg0n7vBVCbyIqp+kyF5YtQDYR0Ae9liUrjbXht3P7KIkaolwB6/jtd/xw2nn0QWYi5BL9j0c79nB1IMdWvUUIkRbZt2Oeci7xQO1gRW2fPQi0hrL5qnKzfnWh/yiomtpVGg72lrCrn5QOSa+QOuF7TGm5tG8jMSZrmSc513fx/UIdo0lL7s7DEbSrGGtP0MmZl3y7pIA1QxIAxZvu90/cH9j9dc2o7Acd/1kNsRD37MToOtr0vzTAnXS6uZangi8gVwpjydkPQAi5msU/WJ6lX06QFn2FHx2qglcxw4ey5JU6IKXK7Og2R/YZzYoVJJ7nzjAxM1YFOdc//hPJ2UMnw/5tOPn3E15TWl8orW/lO7dhJM28/EcHNXGObP02Hr4xI/TZrbZOSKPJ0iZ6OToa7BFIa6e1PpkGVJRV87KRZBZmD5CKR8xdYGcH3/hfIMpomE1lcOaAAvG93gcERSKrXGHvQGSpMl1gp7dwP8F4gMJL+q005TlylvM26vCC61XE413/UIuOcIP+vmp/F7W0XP+OFDRPF8z/338OVtTot/e+S4V+qMcKq7HrxEe7qeZptsWy8hT6UYucun9VGZkakSw6ZrRmeh+cBw76p+CEa+VQ89dbxEOP4gQzMaJ8WT6qsUnd3q1fREeDg30es7AerZ/oYcdgzhlpZ0DTjUlkhqD/oqemczQ81UXxD8dCGY2hAVeH+0NP48XYMO8doZrH9glVMOwXLZ7R5WB5BKikPgcLw8MxHcw7zZwhE3fE58JCt+3kZKJJnEdaxFLuvAtTk7g+YJJ4oWvf321RQcmVtNyb+d86XJqZqNoU8v1qxeOwBoE7Z0HydZw/rxUQGs+WAXsbmlGbmMJ57dHz7daeqKiHDQYYUdTzF9fEYC9gygXSUgc2bfxIUOBImGtFWB59ALM7YCodD5QtSpOOaqZ1WROmYTLe8OhbwqQ8bYK6cymjgMtPi3t7bINgWlvgixpugzp1DgEaDXUGkDwDXA3tFC6/kxnSRict4pGz9GXtEiAlmqxgkbzQ/otLbsRpMHxHUjkcAteWgrz/zLBFECzGNyq8o29kIf5akCAcjzOuR3QBuJ5WFUCTnzHA5wCloYz2DdztLpSXQ5RABcorvH1uEXCMngUS8IjbCajYpa7E3mvQRXxLL6IWfcp3+4IYWD/D4KXhKFsRPm2qtfbbgNZepRIa8gvOuo6VK8f15u2T+1yuDx2yB3/NUstwwblVqSF3ZaOjpyN/3Li6bICisZiRikcejAm+kVHx+OjPwgWfVSfUmJgeqYnPSK8J7E0Dlg2oGP04oMVlYu1a2XFYx9e2j3GZ0Df69D3bzG63qvbluuESo9s8+RGCiF1gi4+6W6YVV+7NwMVMWHBTJzCKCnjeXmKRQFJh78R5vxF4uEc1s3S5rW0U19YMLSDeNzxyqkucxyWem9PQSQQUkKNemRkpqjXZei3b/7SkfKD9CFjq2zG2287IdWH/ZiJHn8SaSvyXRLSQFCe/G7D8yByh7RFPUuhR/a+Lzi8BQq6g1fjRdGPk/dVpalFZ0Rwr/jyxJpB6lWG8rufTa/C54AN/z4/rC/ULSR6+jN0A6Mx79ppGPnrqt2/SKbv5fucQ5OItj9tbGLOH1ke06C94aUb5odsWBssEFfz8SmTyaertBDzDV2w6rK2xVGSHmd8JXXeMERSuAsdq5Dp2f68PGnj/9AVoOUCCTuuqTEJO9p5ZYjtEDuMNXuMTCkvPOKQlI4bMXPimvz61Qr93h5OxhXzIPv8bL7tLXwRNMR5XcvMY/53yW1xVVsRlIiVN5dVkxTh9Greh831woHm6sEA86OQukjImIFzERGIfhrfCyngpGqJ8NHqmVjs/EJcZzJjit1WdTgyWlB3NzPsA5NFUnrQTbeSCZJDE2Jbh+55o1nPM5tuIZvjJxYrHUce4FZ/0VgZBXFstn4t6Aqlyv/IAYiKXjT+xhgIFLLO2rqNqWMVvsOHmd+CLHb502yA2GDenyHLa57JdZtU9TiSeJFKoP2t+8zR5PvcYOvupUbDb3DU+6pj+0j6Oc5rkI2qSCn2OhYlmfTZqXSMXXwKMThR9Ewim2Q2ND5uTpy6NnaeJCby2P4Spt/DV32R66BxY9eX8n++dRC3ofxF7KQQRZvPKasPdBLFmvQ9xymUMvQYu3wGBgk8H9tbztpuzIwYa2RUCrFd2SOfL24hynlxbbtaVLn7n/2moZ+QprQ2uSOZTpUWSRVidMWXKRqRbQqPaKXCtM8UfbSpy8iWdjNgZIl8I6OSi1DBGC5A1ue57CIKxTFwWkrzkT9ycpXJzoaYszdJwHFxqAA7ajKyBaD0MMWbtb/DunEl5mM6/KOazL5GFapO+YxyPlc398OMvK+kQ0eipBTvnOitoca+ZdyS2Uu7ZKuSSHzgJDEdQyVLo88njsqnN5yB70FBGXSTOgjbRxaa+qcdTGK/6hs2ulSQPD6nAcEJp73pAQsXyOxh5WFGLc05ypJOtIF3gJ7A9mHzLPSz7lth44BzJ2GhCnYo7E8HrAtrHFP5J6vA6R6LHoHF8nNo8/AHU4yVKm+xMsAm2a2JNJol/kjwHIXQ8wFBe+NQd3Ra0rv9UVKRdOvecRIjftYaP/PIUnqPAbx0b+cLO+P+izO0rNoSZhU/ufas0j5ED3aCN7Ec+viIM7c71/StqokiycfrpAKgJH18IZWKGbruhC3QBxmmDaWw4q08FPK590VTtu8ifAXXkTgZ+bgq5JOGMm0tBkdqNB7dXEdyUfkB17fvX6Nbygi1WXqVPwTlT7H+zgCWPd7i0g0JXRS+fc/vtFtcMFVJ3J19xaRPbKiezL2XzJb4DmK9buKQOx3n7aKE7bANFg/BFFExD4ZJIiOrFZOnc0SLpSNyw9GzBi0NTl1200IsfxICneLkKPdalAQsh//orJJjCQjHmckssfM1y9fFczcDzcgdKhcvCGP7puPcbS9mhuVeP+gUQ8eDxc/0TJeJ2l+iLAevqIna19/ZdlaO7cW2BLXuPdaRMb9fEB4dPSE6aKHQHci3hku7gNjKoum4gzUD69aQCbH+LlLu06yMsQeCEmWqMMc0C/wzC5oosftbN9asFHM8aH4wnaOQA+zpzzj8XAUqffSSBFtJOHfLK8+eWapHHPLZRfuX8/gdFjsVAsdZwiIA7wM7zeS91PArafypYIDK7KS9Un3h+uX48tWz/efcNNOPuX/dR8Ac+u1gXf9HHveKXRS0TiSI+ZStKXKE2ephUhupQ9tQkSg6BaJClG1TGnkS1ggCYWfBOVlefwEtdeHsBKDhxxO4mJzxmqycY46nlQoBWCCwGopIjEMd4QRcLYdDH409fyxOQw0AuLb1z/dJiVR9b+nN2vEFcDeUKhfNhy2rLmqrqLc/YwWViPZ6wMp8jf0QCIxe9D0YtxHP0sOTITUzlY4aScxC/qdyYZvcWJccviV+nODq65Nwicmq5qJeTTzG5N8Rt5XNEvrw9JZgnNVksrhjvfW11YfH2iKq3BtUeJHxahXvB7fujQQka61yeJa8EoXQfAddBcUu0MP5pKoLfBorwcpXYobh1m9qPC1EC6PBR7XIl/r75S04PRG6aj7fs8Ab2tmk18bHw8H0aMdVqptnrKubYxZQ8psw6tvtbfxQJrrPi2sCVr1LbCNNt9OIbQy0yB8CC+0yGU8ALatNLTuRx9jIcbDVUW62/sIcf6U8o8TsNyMpEOruXEdn2AoRv395Ns6erfktVFVvsUslcINz0lc1L8AxUCVihBcfgk4Z52zx5mYqR04f+IuMieNjyEtS9ffvsagE/rwVH2WxxClaEUvE6vMwP8nN1qYd+UH59DLkLsLKtS1wt44J3UzvDDNe4zv723364Kpn4FIMCxn4mw7lybn/cx/iGxvQS1W3qHyOspIaXhRjjQ5UQk+vDqoSg0yIUbpgxdn48jXwLXQF5V9JNlL5b28X4Eosg56eOfOWXabUxGBbuWUxnuM0gYscP53o8yJPnwzAgufzLISOFyTcrNkLK3qbU2mXy+gittRJGK4yyHfH90aN6HYLUdL2YopqE87VLeSUHil6x471pnhmH2iJy9ei8ztHJ0dmOZOOIh+T4pePnl64AXRiO/N0yCNNHZNYVLd8iXyVfBjcqW6ihDQZZOJOPf+XEwy9lYUJZTZ/FGc+IpfkXeYlM4zrjrpjSwqjMdXwiT5GTK2up+AFUH7CC0WESZcNZLXcjFRuI/XQTHh0z4Nq/e38fbv7BV4kVhOWUunfwFU7fPLsvWpgVy3/pfVawHdNTRJH9tazLoblV/NDtmypiNuiQaEok4V4pZI4XLeMIofh3Uv4ZkVlSBVhlAOHEd0H0jiBazhAbMyg7xscTo1/ZBY14ZnvF1Tjepad282nsQfcwDvIGv8nvmOdOvtf99H4GtPhNA5SKQrRnsgxYNZb9eeqx8thAf9Diw/QBUXbhHu4bB6eSYyFGFD3JxBvOBSWXNnUqsKuwLXoIcAbuE7s25MQHrQoSWuw/AklHFvcXEQodRBqjvYnQPjM0cWW9dbguGovmVf0ncdmPUJti5L4GQfTJH+U1x7vII7T3VWtu9pwdAwPB8Lj+v+cDh5vTjOvtbqJ17n+JhTpuj3DIKjI3xWrRXnom6zv/9neYg4H7CEvf0/Qu0OsPHo3OcaVbncU/7ru6MOHKxdyjIlJzjWV398Xqzry9np1Yj4SqnuOz5WypqTsrv7FSWPCWZjlp0Oqb4+1wcft0yIHShagyc0G4PsKWZJTzOUQCbXrybrV1DP78JdXSBu73hBT8wlTtND+iHyNaBsN/sKNUtkCUcnuvLZu4Nv2l7/J/WRZel3F8H\",\"base64\")).toString()),iY)});var EBe=_((LZt,yBe)=>{var pY=Symbol(\"arg flag\"),Yc=class t extends Error{constructor(e,r){super(e),this.name=\"ArgError\",this.code=r,Object.setPrototypeOf(this,t.prototype)}};function UD(t,{argv:e=process.argv.slice(2),permissive:r=!1,stopAtPositional:s=!1}={}){if(!t)throw new Yc(\"argument specification object is required\",\"ARG_CONFIG_NO_SPEC\");let a={_:[]},n={},c={};for(let f of Object.keys(t)){if(!f)throw new Yc(\"argument key cannot be an empty string\",\"ARG_CONFIG_EMPTY_KEY\");if(f[0]!==\"-\")throw new Yc(`argument key must start with '-' but found: '${f}'`,\"ARG_CONFIG_NONOPT_KEY\");if(f.length===1)throw new Yc(`argument key must have a name; singular '-' keys are not allowed: ${f}`,\"ARG_CONFIG_NONAME_KEY\");if(typeof t[f]==\"string\"){n[f]=t[f];continue}let p=t[f],h=!1;if(Array.isArray(p)&&p.length===1&&typeof p[0]==\"function\"){let[E]=p;p=(C,S,P=[])=>(P.push(E(C,S,P[P.length-1])),P),h=E===Boolean||E[pY]===!0}else if(typeof p==\"function\")h=p===Boolean||p[pY]===!0;else throw new Yc(`type missing or not a function or valid array type: ${f}`,\"ARG_CONFIG_VAD_TYPE\");if(f[1]!==\"-\"&&f.length>2)throw new Yc(`short argument keys (with a single hyphen) must have only one character: ${f}`,\"ARG_CONFIG_SHORTOPT_TOOLONG\");c[f]=[p,h]}for(let f=0,p=e.length;f<p;f++){let h=e[f];if(s&&a._.length>0){a._=a._.concat(e.slice(f));break}if(h===\"--\"){a._=a._.concat(e.slice(f+1));break}if(h.length>1&&h[0]===\"-\"){let E=h[1]===\"-\"||h.length===2?[h]:h.slice(1).split(\"\").map(C=>`-${C}`);for(let C=0;C<E.length;C++){let S=E[C],[P,I]=S[1]===\"-\"?S.split(/=(.*)/,2):[S,void 0],R=P;for(;R in n;)R=n[R];if(!(R in c))if(r){a._.push(S);continue}else throw new Yc(`unknown or unexpected option: ${P}`,\"ARG_UNKNOWN_OPTION\");let[N,U]=c[R];if(!U&&C+1<E.length)throw new Yc(`option requires argument (but was followed by another short argument): ${P}`,\"ARG_MISSING_REQUIRED_SHORTARG\");if(U)a[R]=N(!0,R,a[R]);else if(I===void 0){if(e.length<f+2||e[f+1].length>1&&e[f+1][0]===\"-\"&&!(e[f+1].match(/^-?\\d*(\\.(?=\\d))?\\d*$/)&&(N===Number||typeof BigInt<\"u\"&&N===BigInt))){let W=P===R?\"\":` (alias for ${R})`;throw new Yc(`option requires argument: ${P}${W}`,\"ARG_MISSING_REQUIRED_LONGARG\")}a[R]=N(e[f+1],R,a[R]),++f}else a[R]=N(I,R,a[R])}}else a._.push(h)}return a}UD.flag=t=>(t[pY]=!0,t);UD.COUNT=UD.flag((t,e,r)=>(r||0)+1);UD.ArgError=Yc;yBe.exports=UD});var bBe=_((p$t,DBe)=>{var mY;DBe.exports=()=>(typeof mY>\"u\"&&(mY=Ie(\"zlib\").brotliDecompressSync(Buffer.from(\"W7YZIYpg4/ADhvxMjEQIGwcAGt8pgGWBbYj0o7UviYayJiw3vPFeTWWzdDZyI4g/zgB3ckSMeng+3aqqyQXxrRke/8Sqq0wDa5K1CuJ/ezX/3z9fZ50Gk2s5pcrpxSnVo3lixZWXGAHDxdl15uF/qnNnmbDSZHOomC6KSBu2bPKR50q1+UC6iJWq1rOp1jRMYxXuzFYYDpzTV4Je9yHEA03SbVpbvGIj/FQJeL7mh66qm3q9nguUEq1qZdc5Bn12j6J2/kKrr2lzEef375uWG0mAuCZIlekoidc4xutCHUUBu+q+d8U26Bl0A9ACxME4cD051ryqev+hu9GDRYNcCVxyjXWRjAtdFk8QbxhxKJvFUmkvPyEM1vBe/pU5naPXNGFth1H+DrZxgMyxYUJtZhbCaRtLz27ruqft3aYkgfCKiCF2X2y+j35IelDY2sSHrMOWZSUQ/ub3Y5mPrFirEXvpHAx4f9Rs/55yglK8C2Wx18DfjESbpWL5Uxafo02ms1ZJqz/dtngtnMql1YJ+v71s08jzoZlHGNE7NvPPiEXF3le+xheXLcUhOThn/6HG0jL516CHg6SeKYP/iC4fUokGT71K5LM7212ZyHT2QzO2dMJGJ1tpT7XjAjQYVWBIR2RJBjCjJxuzntxFq6x96E/kH0A/snZ/1w3kBnPChH8d4GdAjrG0oDZrAfb/C4KgIV+fEmjqxTLdJnB4PF7VGbJgQxu7OPuYJkVxZ7Bi+rub4dQCXGP+EAZk/mUFvUvi4pxd/N0U/HHhuh3F4lj5iO6bVyhvIQyNSyZRtBrzQOMO7JFSRbHsfiNEDB8IXTG4CSDMi3KKtNtQqRCwbDtpfUezkpqP+JuqmwsuZcL2NkgQjEedwMnFr6TCWRvXQwPUXAD+lhMwu+lNro/7VpwXEtxj8hHtrXMOADNQ4cFD7h+rxUrlZko0NfmIb8I54Nos5DONiyQQZmP9ow+RKkJ0i1cgfUQ4aUBgwp+rKUzly6REWSPwLqbpA+zAVnNGNZB8Uu1qeJ6vkhPp8u2pwbnk4QZnmIaTvHCgzBbcRDjvDv2eCf6WdNfch/zVQ+jk+T+kQD6NLl38f7xoh1ZEDAryVb1wCLBHFy0aE3FuZY73LGF3dKslVQu59ysM5G4pYvnKAU9damJz/0eknF708c2eC6wBHcdur37hekn2fh9EgmYq/4RWTQHrNglQkyMyDBAoFL+hHT3BjXoy96O8psGR+QTvg4XW5KdjMGCj0atxV61XAJlhVBWA/HvRqn+8qL4h2gNT9Yj7mznFCcCaVC6Uvr6DLEmJcs5J6fPPjBB8kkPjz6vQ4AmU99Vqs809/uySk4TSwfKNaXmfh0UsyzkMy09SgFWth+lu7VtImU9KhadmM4sd5KZZ2jZW/I2qLTj50XNwv3jOwlLMU69B22pogDPr1gYaobzhO+HRC6tF0ryj65xKZ2hgiQOI36RLUjllTXiDVwG8UKh+kgT6u45VlC95L2DZXrPln6Uko337svBb6fCfIF+p/F5+YeWijIfxC4z0qcEXZsDAJnXWDqKtIuVjmya4DHUjndKETXIMIHFKCFAmcsVmtu99MVy37vZRymW3R9rJR7/+82E484JOGqGW0mJDAo5bHOdYZjmS2DXSmhOCfs1LMQXjpoyEHpEctD1t2lmXU9QqlPY4Wb2xVynNDz4PcGyFK9+5Dv9ZKh9cfz0lr7A2S4g6g/BGTGzLJW7pxCq7Yoougq4Uzu7gVbfeSI8FCIj0OJ5BDmPpI2ioFgE4Q82q0iREfbgxfrEUz2gmkxSPRF2Z0uylN6krioG0dMdUewkyUdKRoGT2czC2BSmrmlf67wzXCu6+hlENc0YAAHnU8ifl6W4VjxKe3Gwn24DMgiG+HwWQrBnLSnsZ86BxcsDTk3ARbIx+yAZSPA0YffDCJtGaiC6JIqqW4IHC6NikeQ+A8+Iyq/LIan+Tomj4e84V+3DedENFS5MC9eqkCuh1fs9cOm6BTseTMjhtfPXFoTzAk7cpW2qwpSL8fHTeMSHVXLdUWrc2aZoqNOLevM3c5KGk8XFvCPZ7k+WyP5putfYT9bhWBHwyy35+QqoY9xAyeSiyN/Ow+de8dEVxjiO/1/TdUwIyC4LBQgjzh9NSDX1DFDVj81S3SNrrcoskAwU+MfkV5qRqO3GSCUCiPAkBBqqlSRWct75lqe4fTsrja5xDx8KNq26ZgwXNkKn69zIjzJ76RGpANs0ahAwhnfp9QPAk23SNIcHP/nVWhaJsIcXf7P2ZQYfAtgxIp5RAqdVVk3T5ZyXzGUUPyQ5DcHQpCOxCiyk2lFkLtOEE0xzugED1vI8S1U/4Y5jlZgGVM2bvTY8xPPpsvuHu5KyrEecMGIigi0WOLtR5g6OD95i9BmSl24ORZsYMf0ZusSSNq7qSRpQCLUe2BbB40bdsFJBmrLH+FXLczUK0WyUf9B0xk+lYqk6yXzmQYPVf3e4xlUbETyNDp7m59l7XHZNtJpbcgOMYLatBVKxjLGKSMIc0s3R1rZqWlHgABmx+eRyqfgqrt8T0AMdw/j0OY4oX9D4ymSMsiD6cJvyyQEuJKxB+tI0MNcy9784oIq+H+n6FqEZl1wihMarly7SOuO3KfrI0BZudTh6W6FPhx4m5eioQazCRNsnfFn1jRymtjVt0htfNi8QOOi79TUBwqDfqgtH7ms/mPCuZ5deTajrWhrxFlk+yYdWzpcHjuIk5S6c0pvA4RWKQhW0ZrlcpTLGiiihb227YY4IsOUOpafaanHlrFz7L+kyXTB/vMKf+wOcJrKJvpq/aDf2+oNNC9Nc9wFQP9BZfh68s3LsbQfyIlBOc95FoUOAeTW23njcxvoxurud1/XZ6IdaTrP3vsJ13AATa9njnpzaW/4ICcmkU+INciDjNr6DRTLOHPIOzF7HzXtiXFsainupUGqfh8nIUW1vGlbYBeAwn04D4NPsjJYFIrzko/1jViy0NwT65o0usO95lc/3sz/HM0lqNSFrepApkLuArH7MLk4Ud2FpCkHxxlVt3rrBOMa8tQt/aO8s6UaNd1oE9Mvb1ZfjlY4KdXhvNNHXKM5S6zxuj93bUaUFTFs0hXlBIyzyvhqqwtH3J57JCDfVqilT2+4v1T7RV/lc1IMp3jGuhyfkV6Rhd3OCiE7ElRGRCEDNHXazuEzKPP9lfqZ4l/rrpuXVydf/Eny+O48Cu1LPqAb3hPsyELxbyuE/EmXNcy0UNUFcsWhYzAY09S3+HOthcOAFEbCGK72x47AIAlbKq1LOqxZyGnOiLqTIzF82ko/YMPdZA1u35gWi2dXytsg6Dx73BLHPvNbr0+ZbGWhn2K8Jng+R75gfUN+TnNozA27QvgezhtGt3cw465Ve1o6BxRtgYL/mZIfKl2N4Q7I9rchlh+uVgH0tVBdKxp3lySqXkD2YbQzzh3uz4xRdomZ1A0OH9IGa1Moud+rbztgKiAzHAxOOTNxy+ZtPWnPWTHFDmlIfZMmvpU7jOtakpxejjhh3gYIcd9vH3766rS4/UFJnzFQuS0BeljjW9MY2mGhjFisY2jAFticOIgG9ntAnTVOx/Yy5wYdIMjLjLXrvgDQUGJ2runk1niyi1G0LrgH4rFw9bfuT6UzCP+8QwxdNPdnDsLWzHkrwSWt/EAfY6AZevfFPtcMsZU4t7aWrvJLiN70CzN8AUHnfzquATdPr342AYsZJj/rQ72YddOnbdf4ZzY7yPw7cgZmQlSBdfDqfJPpqzeNOPVaEY+l/2XNAeCstnNhZQKwtmH6sAAXfl9yuVJTi/magBJAxUbivQRKHCyxBmEl8pPIyk0MPq58LYx1iJkVg9Iu1/yLotS1F4y2fD1mm3CQnrphi6KURxydEshzi6W58CRn7afwPntq4bq12rzdlnlsD5AZMAyRK9fQbQNR3rAdvfG8eZ1/n49icsiUssBfYXK2iaVlUfYTkZj8RMpBxtxdRlWMQdELGlRPqWZl5tRPf9fJ/XNgd7YU2olh2VjW/2gfo+va+tfFyeFjvq5tvTMtNkHTcqKR5T/YL38aDImuvqm10LfhjkhzJpP2K6G/7Qz/MFdWlNGiycVs65WCOOXqVPufVResqbv/sPJNAktAUAwPhi63Y6F9EJDPBVfDmEQVpbSmcpl0j3HnvjFA3L2msqZBFphCBEaxuBKrmeqAtKa2iKoHEdDJ9Re1Jrx4j8QT2ybiTKEcJyHLIHDJojd9NcftJIuh2YHY0x6Bb++6Dtf73UpsIZgrnS9nakE9ayWlk/r8Xrn0ibW4deGgt/KZT7x/2x6RvB2ShOP7WGVQMNDVgaBhsnKr5ToiegazDrScH4zauteqNk3sSykTXx1cR5MShxFZIHlDrqsHJWesyrJTQuNJx3mpA1nnINBmWSVchFUD9VXSX7sfHXHd1lEiOGTPrlOZQvqoU5V4gAKctLd2jLXOFtZ5fCFa7OBcZaKHyJQSBUARJu/+vkVkg+ov0n6lYKPFHQ/Gakx0ns6IWc4q3pt7r5sN39Is12vWpTncKUOPL+nqmgO8T6zm6Xb8Xhcil+8mSH5ZNVnWpD4GdqwUP2FkiAZoDl3YBlwPHA2HKLD81OKdAeDXVGK+EJopfaq7XkIzhqBWRh6whrxOusdiIV1tbhid5K+ZYeB4HwUhV1v2P11U+MAOWZGNYlXX3eMjD1fm6kjSGKHa72+lLHiMM7K+dEhVNDTc51NUWwSsXcx3c84m0RLdbxv5g8h3R4D2/1BbYbT7zOCo5dXtmzSmHViTZxvZqbwz4jSj6wc/sYabvhhfy73XKz26oz/+T71R/G1frWlc4obxqaDTWIj9HG98/3+rPtnE9tjas3Yyn9UhO2PJErMN7DKinTMlksp05+GakYwb4ZAA4zQZSqrGyHsktqctSjTpMtaVdA4DwemhPyrmwcW+0NlDL9MrhvGiOS+eVu4bCo4jj9d/SV0i1kFZ5CTs/WjOU6Ml9d3JAf6pE89rv73/vApw9U3w11fy0wbP0WCX6V8c7Bmr8t7vhpBemDewoSVo6ghefic5xgecP8ysYyB1QC+Dk2JoiXTkwaEIU1d720dCIf5y0SYm9l5quKY2Yv5LeiFNbtLS98NQJ5mQs12Cp7BsJHzT1c5GLsm+hdKkAzxKA7R7hGPuIauQaNttK6XTBT1OZG5cM6ovLs52W7MA/HNbkjpwAuvzgnrg3T+Df1s3q8GIwwxlHfYvXfxUKsTx5t4cEZxsk2700PH3l3brazpnHEDDa1MLF2q1QGTvUpRt5Xbp+OMr5USgxt07r7JXR95TxwfnGIp8ocvTW1d5vunjz2oyORJzC+vrJ1drWx3XfYJGe7VlkOVPoHuYz49GYjmCXQp9EtzfUaAzKBEBTuhkU0cPYMcpaoLK3XiQtHd+dz6/GxMtpNFEOIqr0AiJGrBH+Gp+sNad0n9quQM4hqu5ohrF2G1Szx6s11MVqJRvd3QlxH8+mQ+4E54gFHyoz5iuQ77qXp49kehksFrzuZSI40Y3aR3T/Z/OnRX2egHXHoibXzcFFK19vVfCXReF6ItIzYw+U1Nx6UkwuJpcdR47EGr/xKs8UOEyZ6V/eJxtxF/qmtW9265WzSrqwNewgxToBKfVnkUrJdmiQIaNqb9r+UDgDuArRTpUUPqMzysWTQQIJbd+Xr9V8aUEpZ0371aZhhI/84RfW+dmtpjRn+yQIllTg7FK5LV0lyUk8eAITuqxaZfESPTa/QEWwg9+66Rbpmc1CBY/Oqk6pNubyv5segdfcpYgTsEpbzVndcExR7oEc4eJRw57hvSNN+AqH8ziy3hOB19jKuML6MKFSCuRVcix9x84zYfUftMusmkOvyGNUGrnKM7tw5Wmrsih6RTdtXe8+O1S6E0TMl8bL59GuZcXke7MfxnQvRvECXjo+1BQOpd75XyPL9Yfm8fLNjZzbMwk0ZgqVv3bFA+7Qu+xFgxwsJbo83PhOeNr6Mcq18n4EtGQhvrzAwQY61aBoMIv3G/FBw/SgYaPrk9ng1MffgnFfcJDNP/5se7spF7Gox82SeuOpiPaXZZFnKIF/5zLH1TMGUJHR8ySsXitq4sIuBlyykqukQhDEiN2DRUBDh2Z1M2h1BQtmcQpxhs8HJ13hVVENSgG3lOPlazd3sYmG92GvbvPbpKJip1q+WDwbQtfa8RkSKAoaY2IgQoLo/rJtMq71UR2VJ5T6Y85hL0JGFT56IQmcCseQ8ouKnL0Vwrs0bxTpbwScO+JYPcMBt3zvI6rqGpHxkDDMm9yLuWS7gRlOktJMAq1M6P2pDQkNcx6QSTmuWmHwHYEgskf9zZa6WdV2o23rX5hg78wKfLDaBkXcnI6ylSbSp+2NEzZ2NQOCt8NQGNc80A5OulHFQhCx8WkzDwEvXT419TFAuCmp18MmKi0ydLVgc7MPg6wnWJ51o6EnXvuOyp+/TJS56u6yiomDYxB3XXpSIxWyztaGhjqXYmOGcdu2bvO3UQcdXidioZ8lJawPuUAF+3VaoJIj6eF0KIrbdhZCmxWD2czpmWFKEMrycyV2MBqzr17lW7xVM/WdWWR/TkO941KAzOxL44QS9OU/M+5Py/kS9Jzg3d3/e2siuhogdsRGdGUYUno62enVUsYpt60mhAk2Y86s60H1QPA0/7U9nydqtBysJKQGT0WrdGcdUns62evVUsYrtHUmjMs2EVNi9Li7OKcOHj96u926XXb9AFnfg0lveGOVK6cWJuUZCQdM2WDBocMGB4RpkNVrvo321gNLF5WNEk22kk4oZaW+BmTxmd0QqgclRBtjJfCMoq8FXtRoFDHSKW0d5nxUtS+oABoxQc9Gg7h78va6jiDbpW7dwrVuEo2m9km21wjB1x61EvLs5trGzerpHde31jqvFWFp/cHhRrjnm2lAcCLsHxu/TsvafBu9P3vuT954F6Rpt25Gks9N3C4e2kfurO0y6v6/y9D7K0/s0T82aRk2bplVjlin5fpEdtwAql0Rk1G07gIufdqJB1j4w3t5FUPApCSdEkGznnFN/k6Ft2fVA5rZ0qVvQgDely/xvUvMgFRWKLUrcedIlqbk4VVnq4GvlqxyXhagrDku8eyTMEeKWnMjfW/94EspJUbqxpihAdFeLGbU8OzHdDcT/9Z7c0OY/vwHm6h4wc0fwj3w/2w4nCLptJ5MXXwad0U4YyFqFVitCvFv1IGnSo23W5yI4R3dYF2y6O0ze3oG6u/tRp7wPgyl57aYPfA7KJfKlgEmWlEkQl84CSFEfeHAnk5mhg6C6Fw/sGFW6Mo1pGPQWx+L8rzYlmce0abEbvNLIdGPj/JEvB4u7ow/zpzjZf36STbphaAbHf3YUksjbVSlOf1crtroPP5bOnfnydVL6zNkulKLzeEN7Cg+3k34rS9tTc670/JVgLvRawvNqKF/jfz/aZytcHkZ29OBZtQXoBGupMUboqsk59ai14cMpj3XHxVnFzFzTzuEyXuF/bnmKFvMTwYFG/UmoxS8ueocx3waoBBQ0G4KSOGHB55gKRMk8DNS5KxLExF7GTe9jU7wGN9vlFEeBD6lF+26RT6RInLpnDDmzERW31XTRHtxL2N7xoxb6onLubI49gVZ09Zq1x6C0t5mdk5WhD4LjxJ55oU7toCwbmZbLiCMR2lBcSk05iRcSma1hWDZdjl6tD94ohLBMSWwy2AbGyv/jbi7dLoGlT/ezqOm33fIA0b/aD18vTsI9I/N4HIIsxuU4uJe7c2Xj3R08xAjfKZAbbgibJqG0MjSEvWVDjki2UkNf13Vd13XUZC0DTx2bDwbsBH8fj2Hxn6DbLxEPq/QhLzcJEp4urxiMY8FRXecFSmDgL14S640Qkkhm+fzdV+xXWGM/p09EFViqjiv6KuiXzHphc4vol9T/UsKbIW5OB0bLOtsC4eR6duJtnxq8FgL0Lpb2B5aLpXyGjDHrCkDHMFTmn8sdIroYt/UVzIKjk0PhbBlisKdX5l/L1+wSG1cHztxB4XqXCgSDSR+TV7Oaxi448DHsYvT6BucMDab0e3AJM6gAeRCVHSNODMzz5zOIaOkle/XBj9NE6FinCSQ0r9ITp6mlDqKb7Ffl4A88ULI0Qp1awaBjjbwaNjId7GhM5vKZ4BQb8vzJnXnbEjajStV9ZlEnYp+8Tq5/az27/kPe/63evzvv/y7v3773POrXvx6DjGCuX2H1kcSQanT+WKPiUsJliz5KOWnC5wk9WtlvJcjJAmQ2USOgId3v/FZARaaO3jZadHXWqJNf9Chrfw8pjHoDJ81McWojt2MfyR0uO722bmS33+BDLNVDDXbIKGyZ9d3occQjO1dc/GhydaLE3ZBuyGdMvDiCkk4dx9G47sGU/sbZM7F6QYmOmLm2zvQyXV0fcr+Yped1XYdi9Ve12efh93r6EjM/DHkXkVq/DZErtsF/9zbH2d+CnbitS3X413Zg7t9DfDu1xEiWz66j5CVH/JaBKNZl2Uo79Uul1Eqx5nIXS/Fb72/3/i16//a975d58Zvt7Fc5JPT2anmarAlrp365mvUPoZ1S93AIK7p+waHQxZJIOzXbNGs2mqbR6ItJ+Zcs7Ko9BC9z2EBfFAtDOKfO6qJZfnNDFjdAdnqqv6fToPqZxig9IK2oNhX6hZTqIVGuFRt96Zr998DmmIdqnz3UlycZX/hnsVjV6Z/UYKJXpeHqK//49+ea+69+Y9DheUDnPA5RVw9nnh+gJ01XJrNjI+MmfyzWM2YXsb34d9x0eFoY4aOaWSOt+XZUtITHcMqWcE2v0v2ZqL5Xu1C8f3MBErrnQW05ul+zM7hk87HOqTQo1y+1znZ8UvvlU/fbMvKvj+Ec0Cv2YE/3W0LwoJvFgQPr9GUpjfYejnSnUJnRheU059qwNpKX1/RbakgJ9nKb9MuARm91wSk7wrb7lAWNEM6voL9MaLjsON1y2VA+P2Rh6rXMyJRspXjbjDretCxLwtqvve0ed0UAJclesqbidU5hxOL9IUu1WHeXZehNLzQMY+yfjIlGu3ArXU2LcpIDh0koQTTy/f/X69ul/mEyAr2S/PHEOfMyXbymM+Riva1xymz+fon2M7SEKpt5DOUz48NHqDB/7I0ILMB9Sk1n5MIp7OcrvIAw2epfCVC9UwyNSdl1Kx+x2IM9OMWgtAdQiKHeLax0/E0ZD2s52JOR+hEXA17aT9nSE0zFLExj3hUS5y0U5tPttXeNRUeWoaVHuht7j3knrVmLeIunqu3zqSZgzmdG+HgVKwNW9A8vCsuyFwzMOmdd5qHy2cBnCaG3AKokR0AW9RefKmI5BfHIVyw5s4Yg1DtB9xhszA270uiOCB8D+BenA20hHOpl/MVWCROFC1DAeQ10fu99qMpsQA8jfhDDoUqBCvJRW6J2pzqLnt8Mzoj/+ekeL2XRRgJhJ3qb4AXTV4aK/3Y3vY6DuN920Okd2WOPp08DfE1bQkBfPhf2f4DSORjXtwn7CaReEMU94zGEFKTW0gxHkFXd4qE5SclFXH4NMVNp557O+j7FT7iQMsPUhbdC4JFMphbansagkmu3SH+D8LNgaHeFLw6CrbEbe9Vvr8JjssSHy2DhhuD4J9OY24/T0N2HnjpwQr23izNcsz0OTSgl6HbYHxguT1X310zImOVKEYMeUTve3Caiih2i/Czr9SFu412TwspMTMhTno+cIq7hkm4/V5CUox/7c1LiVCYDfTsMn+WAjI9oYruk+Mo2Fo39BNc3n+Fuxm5sPUOUVNJY11ZkOjsYivrJcAqrKj0/E+pcq5R1JXIYouWzjPw4+8Fsa4xP40kzxBQRuX+KakC/OtjLXnhDoB98jWRcVUB0x5gjcQWCep0B31VeC+0coDBmXyeakM5adQ/eh/7DR3gxgfShsfABlCf+cKbAAh9HQze7MGeX+twMOnuJiQ+V+N33tl40X/z4OMPZbxu8iEMGUKL5peB+LtMHkAhzON15jSF9EsiaLx/i9SQyA52R4z1Zd04/SI7TsnSOQHSk2Idexi3ZU3b3iaPVM0mfFXp26lVupSzmHmPD3xtj+cLJZFNiFr+RpouhImOd70A4yRE5fwSUJds25rGVOMthYLt4Z2DSQFF0FQ9zmcrSfCGV/gGCU+jXsDv8b8QGX430pERs7CdIhk4yBwsLKgdIgbu0hcK5O8Jw1pMBa4ppsY9pAY6lQ/R5JbWsXMzFeY+nxzUeF0pNFweHkRrmg3sT+yX+zzad81iYfQIFKcv7qZ5jArC7UGZ8N9AUrzc87uCCavsUcfDghX26yBUJ7fCUD58hJ+f7Gsrlr0kDvDWVE81YkASoPUhifNjDekl9cHWdao+BmJNy4wAdUKtohv3KpWRhIiruWpp1zHYXYXjLs/gTOoqL5L8wRKt86ZHL8/uhqpz/8eFl8aLVkeWEkVAmh0IvSiFrMjlbEZL33lYnGjWSbveG/f5x/6X+I/0iVg3/Y/JMH08I895zjFmjl47uh99Gpo+wToBxddQPh1NszyEGDRSWwVzajG3tTtuqBnyMJouYE9hUF8UgvDKF+gq7LUjeLWNZ+uwVIIBWsoULBbto+RFS7N1YMgN9MbFBzQkuWhVEW+HdC6Z3sbtg3DwQa3MQiu3VnCXH1aTpb1lHY8/36jN7xdolzctdbjwZua2JJT12FSQJhM5JrMzdeKijSeVwHx8r7U9jSaED+XF6FzQ5dpthmAgOY1Rj+NkgxgNDkQ/AcHtrAQve1bcQLUwC3KUo5GyBTXRwvi+LMf1S5HDn1wTI/UnOFQiy7TVVD3755WuaEh/hRccyHVqVGR4o7Y6d1HakUEalTvswRZUYfWWbzdY36zTlQkk85VpLOQd3k9fUb+2EE4WyoHe5c7XHNnjP5wIBExdVhlh9miYTFY+a6/dlWUQU6N+HkvTbsv5mtRfaDwTwGj2I6MYz52z2o1fJ+/sGytq2u3e5crJzze4RDn+bVadJSgRec0QxcUQcHihrVCCK5rRVHGkYNTICvQWMqabLpiXatW69ON6sy/QgJ674u6+V+IlvY+ENFQoG81NSA7/6jObtmuI5gXPd+Q7Grd6WRVsIR9KCsjde2WZzkhum7VuwInzdrFTFRrqYT6DXkfQk9cuwN7jZOqAJHSj05LX8OQWzpo37SCt8WjBGYN50o0F76Gf+oFu7p73k8vE0vOuo/jjEm2O2BhwMHAP0+VdGTD8P4PH4D71h5BkJKXUGNH8CJFoGLT8zJWij5g95rjeJH47SO4yW02WexMt7zR2C46ThSWcSm2JqWjT+GG7AcgvHQadqUcDKjdTgE4Ub0tqlEPpgKTmZNw5Jd1DAs3rKAzp8+0furclUDr28+5dZUW/ybEfjBB1++nHXKXtuk+nz8sW76+dLvLtycDstCBCmkspzzcjvTQI8k2ho6fE0WKsuq4LQfxmyVjnHcKLJi3T4/vRqNd0ozdijYGNzct6ITHM6ORtfniyESPNWMBTbWRxSNGkFv8uZqfxpl42DVOGkrvP/ssJ1gbh9XdnQiSRXTq/kmpw7H7LM8XKtXwxfvoYW0APq+JvGSv0M+5lUhiAzwAq8O66O0f8qTS6MEIOUWjijJ0/ZCraxaJPhkpX49yAonqXZ8zAwX2tkIDp5IjjD2kvb1G6/QeVVv7qD5azxLHBpIWbI28rx6q+5D9nzUwkP2wOlDKsGw2/SJiOao4BPWyCXjRg2OXuPp228KdglNL17euvPYXUSGBO6FYxo42R6Ol7yNtW/MZD86somgsK1PR/IVstv3srrKUkbFnPBbpYYeNJs+p2w2fbfKnBxxi4zYK7cvr9ckBhxe+otENmKYn/Hh1YAZQEdReEZ5ZBRnwCO/G6kdDYuIw0Ewd60xZpkj209Bvh9LMJrLiT1tNsrTYy1wbxFCNgOzk8xPkzWye03VL3Jh6qQLRjTkth129p5IUhBfiDQyd131I/tLXEMJnRGwQBV2/X/L7Tv+VC3uYHo0zXq4CWw844CUJqYfDJLqkwaItbIreQF6svTa0TNvScy8r0j7VlLVqczG4USLIqC775j6VhD470dyQzM/16xBeQEy/X6tkgJQKSjL5N6J41QlPCxGHScYuYvTpJGcdVYq+bObbZdZK4v3BtLj3Vc5+/lTWrcSfyvc8LBExCmWLfJviNBX8c8ixX6VGS5VYWp0jjli1CeUgoHzA9zkDBbBM54ESqVKQecS1vWexQpK5UIsOMNSa8NYkRp25MkRpwF7OIQyAb9X8sZuPXgmsD1jbSFA+uweZsQNqGkYVPkBXLSphKJ/C2lIHdCfVKfqbkqTyl5co2vummREV3HZ+qbZBG5yG4G95Znbq56Dh1zYuOGWXhKoRyb+Fq7KYYV9bVJUk52DYc3VFLhlL6Qbkoy8G2Y0tCpCwXcwVBxu6GeicCChN24faPn9IB8cUD+hp3kvjKceZpSsmXP5PCO5piSt/bn+PL/gjVPgvub5jOgq7nNIaA3OqQMljSz8Vs0rD9t2BhzyPEOmpLsqlFtyJQZL8zLy1xJiDiVKOcrWuUdHtDEfILHwsqHsjuc8FY1AQqqj9eGqVtxRTYRMTGYUZPE4S0WfJ7DiRMfTADsQnDHlF+OA64ySBzOxLfNpOdwckf2zFgMQtG7JaygfYm/Xvw9GLu8hdlSf5mZO8coUGi87cEu+Y2LcFASUicf9TgShhXtYI3pZqFK75aBuQY4QLKNtM+1d+law/utG9LwahWnCLwRv2mZrbU9nOtnqcE70KSReJShsp72y7S/NvKWAfQRjoi1hHYvXngDd0xJtKeAJg5TRRkrhIwdD2+5YDWTXpv6DWka7njyJ3+KJ3+ql3gDYkvh5wUtLDo7+x9ieXW7fMMHUWgcF9g4dzHAQDaKZEPGOivoKFfwWcBZEKSo9f64bgDtRu+MPsXwiyfxVF1+9ouXD9TfFJT+mvASGsFIkW04E4Pk6QFt/jaUtQ+ZUuzJm9j6/E1sfV68/A43r5150Wch4uvNOOkKwHBFMfC7OBFob4hFCGp6WE7iMnUzu+OULbC1d1CLoInDP8ACxjiWgSE/N6YVpp7avokMwyJ+T72/AKOx0QfXthxqCYC8cSJmmpAjbQEAMqTtI3Sc4z8IyLiqpdSijDyR65ax/vmBXGOjz03+f8tZx+O5Pq6N68X6jbUb6+X6zbWba++XA1iv1+1SNtra53qtx+VDZn2YHxK7fIHWrz98HTqCd60G6juzQjrYVZbhi8pE3/QYc9NomQ0Ez+9ELpyaKyqpDcrLMGJxPKsFO6YEofopC46C2AU7LtgY3R7Jod8407Id+KwUE4DZ5JrV7K42vTUGtSV/5+TE6t3TkI8mEcr80pHiDMQzGQ1hxfO/y2KChIqxdMavftJ1c9UFSCMVMDhdHj4AcSbd8jJoOKd4kMTB89rjpiZbMCu3kS53nzKehcAb3L+r+II9l2iMFRVUVD+ghglHv0jaQVzLFJXt3QS763tfKo8V6UTxoNRxEVVDX5FLgavrZibQVdQMDHbs5/+WxpStii6woTFaBmXZFROE9Cc3+y0pEAdFxkpOzSBsLtPtWNJKigbwPmO1C5k25PgE3hLaORZi10reiVD1UnELZIw6fn4pYJGMoyUlnw4c04dUt+qZptvBhw33Lnd2iZTSWh3rJtWIpPFc/3Qsy4lMm45lNy2aqY8+aC7gidvQhQrxfmuaAiWKtWtGY43OmmJYnNr2XYMaVcnXosYANFzD8uGEQjAUioJFLJBRFuXNuOukSso2slYR0KLSAhz5lY7q1rroavP1eEGAcASAWbjfnBFK9IswYgGHA5BdQjJew7u4ZXaC3QTgGcaIUYyPEiSucelWSTuXUiG1LMXM8oIR+RU9W0qjNFg6fBugXD10ZeHkvyTrC4Cla5/q5MLq9memnJ8lQjCaYJPvnoYyXm2ByZjV6ZOL7d09CEUvdcIvF389YLM5OPeyxfBWUjiPqMfIGvgOBfjPGQW12cBc/YzZbxgYu92wRiOrYixVM5dG6fmqo6ZX6CK/bqqHboDFCUp73KU/YIS7DEu6Unw0H6X96WuVb2l36CMPyTLgjvFdAFCTA5kmyl1S7/mZ3xOqv651jJX+TnIfP193JOZKKEWTMhhvn1StNy/Twhd1gpgysTnFNWFl5O6/5cP/R2zcJU9ikalZB8sbL1Z4Ok5UqgiX/ZQTaOO+5+zXNcLvODwG2b+8dHsI0r9OSS/UZ0+h01p/chHZu2TvLVMaEqJxkyj10YV5yHd58pbHPIclCt5CeKNcMx5kSr+GsBUhcyT7lr/mRnyR2Sm9tpjpf7a3oR+H00IabdcdATsFp/9yGGPCLqqwyl6lpt9D97XV5mjcim80uvhG6AXM+Ewx4CBr4XXIIwZsYzkWKHrwhWZJM+ztSWXd2ErNAGPs+ZFpa5NxBrm8rN0tHrzoHNExuwMoB6SdGGldMXKFhcy+q99NjgYngNDKRu/vTPALyd3ZcCWg+pv3uW7lylwtESPVrRTHvPIJI9lH0z7FB8MQN0tddxm55q+hZSlHGn4HTIn1qYnBdytlMSEyfTXVh7rpRGakuXPD0vtF8W3QbN8GXgUrwbCybkIaMR9UGREBwaoa8M7qqGTpuHj6ekl9tZxBBouoxbJlLapftgCK1NIrtr6K9YBROQ1UBbINXOiw0wZ5r9zagqRBDFMQFyvzYFnYh8Ig5NoqlDFqSEd+WHiCEAafi3IUpXVePI8oy9fD7QDRWKpQMrIqyRqLMSAn7evHjrNRNKspUBOCq2ytGVeT8T2eOTeau8+WOvHmiLE/AOUmcgVQdwJVlvDgr8UFuw7pcXJArQozzSJo+2DmaKYphScNeSxACQsp4f1xmomLafbNNzK90dk4tdjwL9inPgZWECkUUjcBKLkATF/pFDq3q8VP1dnDEtXN6Ihxx26oXeBRLim6qo5s7nyCeEWn9uc4raEXSDlPqk/bHO1i2XXkIP/zF9RvnkQR1T4ftxeicKzDz7xlegnxpauHhn1hcP/Emh+vsw2CVHWC4V27XblqaC/xkO4YPJP6LpL6KEyLE9VbxKK813gqpcNy7oalqhJ92RanoMF1xUVtyRG0U31KceJT0bR5h8su5sVyAHil2LnWe4QPLNbS1lk5FefiiG2b3IX12+Ez+3Z7RbSvqVxtWcghZBStcIfYtE4wk9ZR0TB2axfOFw3iX6FdlE8tJFwqKr5D0HGTnZ3zvS1qvLEybAAHRSseffG3+vDgpSuyckW9TQTYbPc05tmGMPtCymY/OwC/7KqvBxPavQi/2pToMKv3ysfwamTLeW4bZrqKADs4q67jiKN2/yyucS8StnHeTg/Lm3VqVUHAVfyb0yLTUgpwCgBLocswkQtPaQ8d+y6cBWs1Annqp1igcpQLpghOOVHYg82cXYEYICfygPOL5hvAd9ShDTg5xbEaVI4yaS2ZQQ3+DYY1n1xCJa7Ue2KRIeZIgZQBem1NmIOBfPvonVqOs77IChs0HqPbdpjbrlhTT2YRFnSfOQcEsQG+w33eotwEpkbN3MOv8VvQIfmuY7vd1kG8WnVvzMxnZYubJHccY6zt3Iqw3jp0ehCj26dOpVzveIQ+JdBs7z9mi1F1WRHbG1nCZKkjzXeZWRsmAVuV63K+6fxczgXicHNOJ1byuXpDxgsiM4vGlf37hbCEojg5vBE/THcQU9c5ulMBqczQkatKAOyj1PTEHtuASZ7plKRQ86aNZPWcDTKBdjsZ8Q2H5ayc9oD/mPycHq6U+1y4P8yFbZkvfoLHvnE+hzdismty7Na2YWmYHREuaa7nfhBpxqKVsf0TI1f917qMKTieUfdlNsEnYhT7TbcgKFvREH46deSh9qjtW9KUSpPOWMqONNPcL1F4LUzN2UCO89sAnoX1H/WtjHdkqMtYzswsd1El/me4hRszg6YO0GgWxNuH38Tm2nUIAdMxaZmEKJ8L4rRiAe5WH7Hg8W8njHEcVDB2flFwshvQiuTLoN0XbKrhWHNW+CSKj/6oZf6TL52UpV5UHr/4fY3zbEnkSctnyS1fq8mlfy7IDBeKTRksjn5uKai+tWArnq4FyLGWTCS9Ajp60isRCoFJi1+ndJekdhnWAhnveiA6icBgsxQzkEVrAjZALn3tw/1UmTqKt8m1OdOY/v38fB3j4mcnBX2rrU1uGtLz+9jTF4/o6Ytlk4O5NiiyTKBCLOwKP7HhZqG1fQnBYtxks9dVZRHYDpVvtIokwERT7NPeSwnKqAWGHxPsiAL6YvVI+BBMtunYk+99NOWWtyiadeaGwCbDFz+OFqnQM9GPHlQ5/Lnt3tnrRWyXyaR/4mO/E/fv65K911gFohqGSVGLnzgM71eBIw8LF2+BLqq+mPqi8ovIVdliBIwN+MDY4zKOxfyM4zPjWIdHsZM19d1SrB7nmiLRA8+AP2XBcFaAm6B/sJ2iJA8=\",\"base64\")).toString()),mY)});var TBe=_((BY,vY)=>{(function(t){BY&&typeof BY==\"object\"&&typeof vY<\"u\"?vY.exports=t():typeof define==\"function\"&&define.amd?define([],t):typeof window<\"u\"?window.isWindows=t():typeof global<\"u\"?global.isWindows=t():typeof self<\"u\"?self.isWindows=t():this.isWindows=t()})(function(){\"use strict\";return function(){return process&&(process.platform===\"win32\"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var OBe=_((fer,NBe)=>{\"use strict\";SY.ifExists=Sdt;var Dw=Ie(\"util\"),Vc=Ie(\"path\"),RBe=TBe(),wdt=/^#!\\s*(?:\\/usr\\/bin\\/env)?\\s*([^ \\t]+)(.*)$/,Bdt={createPwshFile:!0,createCmdFile:RBe(),fs:Ie(\"fs\")},vdt=new Map([[\".js\",\"node\"],[\".cjs\",\"node\"],[\".mjs\",\"node\"],[\".cmd\",\"cmd\"],[\".bat\",\"cmd\"],[\".ps1\",\"pwsh\"],[\".sh\",\"sh\"]]);function FBe(t){let e={...Bdt,...t},r=e.fs;return e.fs_={chmod:r.chmod?Dw.promisify(r.chmod):async()=>{},mkdir:Dw.promisify(r.mkdir),readFile:Dw.promisify(r.readFile),stat:Dw.promisify(r.stat),unlink:Dw.promisify(r.unlink),writeFile:Dw.promisify(r.writeFile)},e}async function SY(t,e,r){let s=FBe(r);await s.fs_.stat(t),await bdt(t,e,s)}function Sdt(t,e,r){return SY(t,e,r).catch(()=>{})}function Ddt(t,e){return e.fs_.unlink(t).catch(()=>{})}async function bdt(t,e,r){let s=await Tdt(t,r);return await Pdt(e,r),xdt(t,e,s,r)}function Pdt(t,e){return e.fs_.mkdir(Vc.dirname(t),{recursive:!0})}function xdt(t,e,r,s){let a=FBe(s),n=[{generator:Ndt,extension:\"\"}];return a.createCmdFile&&n.push({generator:Fdt,extension:\".cmd\"}),a.createPwshFile&&n.push({generator:Odt,extension:\".ps1\"}),Promise.all(n.map(c=>Rdt(t,e+c.extension,r,c.generator,a)))}function kdt(t,e){return Ddt(t,e)}function Qdt(t,e){return Ldt(t,e)}async function Tdt(t,e){let a=(await e.fs_.readFile(t,\"utf8\")).trim().split(/\\r*\\n/)[0].match(wdt);if(!a){let n=Vc.extname(t).toLowerCase();return{program:vdt.get(n)||null,additionalArgs:\"\"}}return{program:a[1],additionalArgs:a[2]}}async function Rdt(t,e,r,s,a){let n=a.preserveSymlinks?\"--preserve-symlinks\":\"\",c=[r.additionalArgs,n].filter(f=>f).join(\" \");return a=Object.assign({},a,{prog:r.program,args:c}),await kdt(e,a),await a.fs_.writeFile(e,s(t,e,a),\"utf8\"),Qdt(e,a)}function Fdt(t,e,r){let a=Vc.relative(Vc.dirname(e),t).split(\"/\").join(\"\\\\\"),n=Vc.isAbsolute(a)?`\"${a}\"`:`\"%~dp0\\\\${a}\"`,c,f=r.prog,p=r.args||\"\",h=DY(r.nodePath).win32;f?(c=`\"%~dp0\\\\${f}.exe\"`,a=n):(f=n,p=\"\",a=\"\");let E=r.progArgs?`${r.progArgs.join(\" \")} `:\"\",C=h?`@SET NODE_PATH=${h}\\r\n`:\"\";return c?C+=`@IF EXIST ${c} (\\r\n  ${c} ${p} ${a} ${E}%*\\r\n) ELSE (\\r\n  @SETLOCAL\\r\n  @SET PATHEXT=%PATHEXT:;.JS;=;%\\r\n  ${f} ${p} ${a} ${E}%*\\r\n)\\r\n`:C+=`@${f} ${p} ${a} ${E}%*\\r\n`,C}function Ndt(t,e,r){let s=Vc.relative(Vc.dirname(e),t),a=r.prog&&r.prog.split(\"\\\\\").join(\"/\"),n;s=s.split(\"\\\\\").join(\"/\");let c=Vc.isAbsolute(s)?`\"${s}\"`:`\"$basedir/${s}\"`,f=r.args||\"\",p=DY(r.nodePath).posix;a?(n=`\"$basedir/${r.prog}\"`,s=c):(a=c,f=\"\",s=\"\");let h=r.progArgs?`${r.progArgs.join(\" \")} `:\"\",E=`#!/bin/sh\nbasedir=$(dirname \"$(echo \"$0\" | sed -e 's,\\\\\\\\,/,g')\")\n\ncase \\`uname\\` in\n    *CYGWIN*) basedir=\\`cygpath -w \"$basedir\"\\`;;\nesac\n\n`,C=r.nodePath?`export NODE_PATH=\"${p}\"\n`:\"\";return n?E+=`${C}if [ -x ${n} ]; then\n  exec ${n} ${f} ${s} ${h}\"$@\"\nelse\n  exec ${a} ${f} ${s} ${h}\"$@\"\nfi\n`:E+=`${C}${a} ${f} ${s} ${h}\"$@\"\nexit $?\n`,E}function Odt(t,e,r){let s=Vc.relative(Vc.dirname(e),t),a=r.prog&&r.prog.split(\"\\\\\").join(\"/\"),n=a&&`\"${a}$exe\"`,c;s=s.split(\"\\\\\").join(\"/\");let f=Vc.isAbsolute(s)?`\"${s}\"`:`\"$basedir/${s}\"`,p=r.args||\"\",h=DY(r.nodePath),E=h.win32,C=h.posix;n?(c=`\"$basedir/${r.prog}$exe\"`,s=f):(n=f,p=\"\",s=\"\");let S=r.progArgs?`${r.progArgs.join(\" \")} `:\"\",P=`#!/usr/bin/env pwsh\n$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n\n$exe=\"\"\n${r.nodePath?`$env_node_path=$env:NODE_PATH\n$env:NODE_PATH=\"${E}\"\n`:\"\"}if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\n  # Fix case when both the Windows and Linux builds of Node\n  # are installed in the same directory\n  $exe=\".exe\"\n}`;return r.nodePath&&(P+=` else {\n  $env:NODE_PATH=\"${C}\"\n}`),c?P+=`\n$ret=0\nif (Test-Path ${c}) {\n  # Support pipeline input\n  if ($MyInvocation.ExpectingInput) {\n    $input | & ${c} ${p} ${s} ${S}$args\n  } else {\n    & ${c} ${p} ${s} ${S}$args\n  }\n  $ret=$LASTEXITCODE\n} else {\n  # Support pipeline input\n  if ($MyInvocation.ExpectingInput) {\n    $input | & ${n} ${p} ${s} ${S}$args\n  } else {\n    & ${n} ${p} ${s} ${S}$args\n  }\n  $ret=$LASTEXITCODE\n}\n${r.nodePath?`$env:NODE_PATH=$env_node_path\n`:\"\"}exit $ret\n`:P+=`\n# Support pipeline input\nif ($MyInvocation.ExpectingInput) {\n  $input | & ${n} ${p} ${s} ${S}$args\n} else {\n  & ${n} ${p} ${s} ${S}$args\n}\n${r.nodePath?`$env:NODE_PATH=$env_node_path\n`:\"\"}exit $LASTEXITCODE\n`,P}function Ldt(t,e){return e.fs_.chmod(t,493)}function DY(t){if(!t)return{win32:\"\",posix:\"\"};let e=typeof t==\"string\"?t.split(Vc.delimiter):Array.from(t),r={};for(let s=0;s<e.length;s++){let a=e[s].split(\"/\").join(\"\\\\\"),n=RBe()?e[s].split(\"\\\\\").join(\"/\").replace(/^([^:\\\\/]*):/,(c,f)=>`/mnt/${f.toLowerCase()}`):e[s];r.win32=r.win32?`${r.win32};${a}`:a,r.posix=r.posix?`${r.posix}:${n}`:n,r[s]={win32:a,posix:n}}return r}NBe.exports=SY});var _Y=_((_tr,tve)=>{tve.exports=Ie(\"stream\")});var sve=_((Htr,ive)=>{\"use strict\";function rve(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);e&&(s=s.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,s)}return r}function mmt(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=null?arguments[e]:{};e%2?rve(Object(r),!0).forEach(function(s){ymt(t,s,r[s])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):rve(Object(r)).forEach(function(s){Object.defineProperty(t,s,Object.getOwnPropertyDescriptor(r,s))})}return t}function ymt(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Emt(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function nve(t,e){for(var r=0;r<e.length;r++){var s=e[r];s.enumerable=s.enumerable||!1,s.configurable=!0,\"value\"in s&&(s.writable=!0),Object.defineProperty(t,s.key,s)}}function Imt(t,e,r){return e&&nve(t.prototype,e),r&&nve(t,r),t}var Cmt=Ie(\"buffer\"),pN=Cmt.Buffer,wmt=Ie(\"util\"),HY=wmt.inspect,Bmt=HY&&HY.custom||\"inspect\";function vmt(t,e,r){pN.prototype.copy.call(t,e,r)}ive.exports=function(){function t(){Emt(this,t),this.head=null,this.tail=null,this.length=0}return Imt(t,[{key:\"push\",value:function(r){var s={data:r,next:null};this.length>0?this.tail.next=s:this.head=s,this.tail=s,++this.length}},{key:\"unshift\",value:function(r){var s={data:r,next:this.head};this.length===0&&(this.tail=s),this.head=s,++this.length}},{key:\"shift\",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:\"clear\",value:function(){this.head=this.tail=null,this.length=0}},{key:\"join\",value:function(r){if(this.length===0)return\"\";for(var s=this.head,a=\"\"+s.data;s=s.next;)a+=r+s.data;return a}},{key:\"concat\",value:function(r){if(this.length===0)return pN.alloc(0);for(var s=pN.allocUnsafe(r>>>0),a=this.head,n=0;a;)vmt(a.data,s,n),n+=a.data.length,a=a.next;return s}},{key:\"consume\",value:function(r,s){var a;return r<this.head.data.length?(a=this.head.data.slice(0,r),this.head.data=this.head.data.slice(r)):r===this.head.data.length?a=this.shift():a=s?this._getString(r):this._getBuffer(r),a}},{key:\"first\",value:function(){return this.head.data}},{key:\"_getString\",value:function(r){var s=this.head,a=1,n=s.data;for(r-=n.length;s=s.next;){var c=s.data,f=r>c.length?c.length:r;if(f===c.length?n+=c:n+=c.slice(0,r),r-=f,r===0){f===c.length?(++a,s.next?this.head=s.next:this.head=this.tail=null):(this.head=s,s.data=c.slice(f));break}++a}return this.length-=a,n}},{key:\"_getBuffer\",value:function(r){var s=pN.allocUnsafe(r),a=this.head,n=1;for(a.data.copy(s),r-=a.data.length;a=a.next;){var c=a.data,f=r>c.length?c.length:r;if(c.copy(s,s.length-r,0,f),r-=f,r===0){f===c.length?(++n,a.next?this.head=a.next:this.head=this.tail=null):(this.head=a,a.data=c.slice(f));break}++n}return this.length-=n,s}},{key:Bmt,value:function(r,s){return HY(this,mmt({},s,{depth:0,customInspect:!1}))}}]),t}()});var GY=_((jtr,ave)=>{\"use strict\";function Smt(t,e){var r=this,s=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;return s||a?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(jY,this,t)):process.nextTick(jY,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(n){!e&&n?r._writableState?r._writableState.errorEmitted?process.nextTick(hN,r):(r._writableState.errorEmitted=!0,process.nextTick(ove,r,n)):process.nextTick(ove,r,n):e?(process.nextTick(hN,r),e(n)):process.nextTick(hN,r)}),this)}function ove(t,e){jY(t,e),hN(t)}function hN(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit(\"close\")}function Dmt(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function jY(t,e){t.emit(\"error\",e)}function bmt(t,e){var r=t._readableState,s=t._writableState;r&&r.autoDestroy||s&&s.autoDestroy?t.destroy(e):t.emit(\"error\",e)}ave.exports={destroy:Smt,undestroy:Dmt,errorOrDestroy:bmt}});var lg=_((Gtr,uve)=>{\"use strict\";var cve={};function Kc(t,e,r){r||(r=Error);function s(n,c,f){return typeof e==\"string\"?e:e(n,c,f)}class a extends r{constructor(c,f,p){super(s(c,f,p))}}a.prototype.name=r.name,a.prototype.code=t,cve[t]=a}function lve(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(s=>String(s)),r>2?`one of ${e} ${t.slice(0,r-1).join(\", \")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function Pmt(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function xmt(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function kmt(t,e,r){return typeof r!=\"number\"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}Kc(\"ERR_INVALID_OPT_VALUE\",function(t,e){return'The value \"'+e+'\" is invalid for option \"'+t+'\"'},TypeError);Kc(\"ERR_INVALID_ARG_TYPE\",function(t,e,r){let s;typeof e==\"string\"&&Pmt(e,\"not \")?(s=\"must not be\",e=e.replace(/^not /,\"\")):s=\"must be\";let a;if(xmt(t,\" argument\"))a=`The ${t} ${s} ${lve(e,\"type\")}`;else{let n=kmt(t,\".\")?\"property\":\"argument\";a=`The \"${t}\" ${n} ${s} ${lve(e,\"type\")}`}return a+=`. Received type ${typeof r}`,a},TypeError);Kc(\"ERR_STREAM_PUSH_AFTER_EOF\",\"stream.push() after EOF\");Kc(\"ERR_METHOD_NOT_IMPLEMENTED\",function(t){return\"The \"+t+\" method is not implemented\"});Kc(\"ERR_STREAM_PREMATURE_CLOSE\",\"Premature close\");Kc(\"ERR_STREAM_DESTROYED\",function(t){return\"Cannot call \"+t+\" after a stream was destroyed\"});Kc(\"ERR_MULTIPLE_CALLBACK\",\"Callback called multiple times\");Kc(\"ERR_STREAM_CANNOT_PIPE\",\"Cannot pipe, not readable\");Kc(\"ERR_STREAM_WRITE_AFTER_END\",\"write after end\");Kc(\"ERR_STREAM_NULL_VALUES\",\"May not write null values to stream\",TypeError);Kc(\"ERR_UNKNOWN_ENCODING\",function(t){return\"Unknown encoding: \"+t},TypeError);Kc(\"ERR_STREAM_UNSHIFT_AFTER_END_EVENT\",\"stream.unshift() after end event\");uve.exports.codes=cve});var qY=_((qtr,fve)=>{\"use strict\";var Qmt=lg().codes.ERR_INVALID_OPT_VALUE;function Tmt(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function Rmt(t,e,r,s){var a=Tmt(e,s,r);if(a!=null){if(!(isFinite(a)&&Math.floor(a)===a)||a<0){var n=s?r:\"highWaterMark\";throw new Qmt(n,a)}return Math.floor(a)}return t.objectMode?16:16*1024}fve.exports={getHighWaterMark:Rmt}});var Ave=_((Wtr,WY)=>{typeof Object.create==\"function\"?WY.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:WY.exports=function(e,r){if(r){e.super_=r;var s=function(){};s.prototype=r.prototype,e.prototype=new s,e.prototype.constructor=e}}});var cg=_((Ytr,VY)=>{try{if(YY=Ie(\"util\"),typeof YY.inherits!=\"function\")throw\"\";VY.exports=YY.inherits}catch{VY.exports=Ave()}var YY});var hve=_((Vtr,pve)=>{pve.exports=Ie(\"util\").deprecate});var zY=_((Jtr,Ive)=>{\"use strict\";Ive.exports=Vi;function dve(t){var e=this;this.next=null,this.entry=null,this.finish=function(){oyt(e,t)}}var Tw;Vi.WritableState=ZD;var Fmt={deprecate:hve()},mve=_Y(),dN=Ie(\"buffer\").Buffer,Nmt=global.Uint8Array||function(){};function Omt(t){return dN.from(t)}function Lmt(t){return dN.isBuffer(t)||t instanceof Nmt}var KY=GY(),Mmt=qY(),Umt=Mmt.getHighWaterMark,ug=lg().codes,_mt=ug.ERR_INVALID_ARG_TYPE,Hmt=ug.ERR_METHOD_NOT_IMPLEMENTED,jmt=ug.ERR_MULTIPLE_CALLBACK,Gmt=ug.ERR_STREAM_CANNOT_PIPE,qmt=ug.ERR_STREAM_DESTROYED,Wmt=ug.ERR_STREAM_NULL_VALUES,Ymt=ug.ERR_STREAM_WRITE_AFTER_END,Vmt=ug.ERR_UNKNOWN_ENCODING,Rw=KY.errorOrDestroy;cg()(Vi,mve);function Jmt(){}function ZD(t,e,r){Tw=Tw||Ym(),t=t||{},typeof r!=\"boolean\"&&(r=e instanceof Tw),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=Umt(this,t,\"writableHighWaterMark\",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var s=t.decodeStrings===!1;this.decodeStrings=!s,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(a){tyt(e,a)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new dve(this)}ZD.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty(ZD.prototype,\"buffer\",{get:Fmt.deprecate(function(){return this.getBuffer()},\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch{}})();var gN;typeof Symbol==\"function\"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==\"function\"?(gN=Function.prototype[Symbol.hasInstance],Object.defineProperty(Vi,Symbol.hasInstance,{value:function(e){return gN.call(this,e)?!0:this!==Vi?!1:e&&e._writableState instanceof ZD}})):gN=function(e){return e instanceof this};function Vi(t){Tw=Tw||Ym();var e=this instanceof Tw;if(!e&&!gN.call(Vi,this))return new Vi(t);this._writableState=new ZD(t,this,e),this.writable=!0,t&&(typeof t.write==\"function\"&&(this._write=t.write),typeof t.writev==\"function\"&&(this._writev=t.writev),typeof t.destroy==\"function\"&&(this._destroy=t.destroy),typeof t.final==\"function\"&&(this._final=t.final)),mve.call(this)}Vi.prototype.pipe=function(){Rw(this,new Gmt)};function Kmt(t,e){var r=new Ymt;Rw(t,r),process.nextTick(e,r)}function zmt(t,e,r,s){var a;return r===null?a=new Wmt:typeof r!=\"string\"&&!e.objectMode&&(a=new _mt(\"chunk\",[\"string\",\"Buffer\"],r)),a?(Rw(t,a),process.nextTick(s,a),!1):!0}Vi.prototype.write=function(t,e,r){var s=this._writableState,a=!1,n=!s.objectMode&&Lmt(t);return n&&!dN.isBuffer(t)&&(t=Omt(t)),typeof e==\"function\"&&(r=e,e=null),n?e=\"buffer\":e||(e=s.defaultEncoding),typeof r!=\"function\"&&(r=Jmt),s.ending?Kmt(this,r):(n||zmt(this,s,t,r))&&(s.pendingcb++,a=Zmt(this,s,n,t,e,r)),a};Vi.prototype.cork=function(){this._writableState.corked++};Vi.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&yve(this,t))};Vi.prototype.setDefaultEncoding=function(e){if(typeof e==\"string\"&&(e=e.toLowerCase()),!([\"hex\",\"utf8\",\"utf-8\",\"ascii\",\"binary\",\"base64\",\"ucs2\",\"ucs-2\",\"utf16le\",\"utf-16le\",\"raw\"].indexOf((e+\"\").toLowerCase())>-1))throw new Vmt(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Vi.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function Xmt(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e==\"string\"&&(e=dN.from(e,r)),e}Object.defineProperty(Vi.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function Zmt(t,e,r,s,a,n){if(!r){var c=Xmt(e,s,a);s!==c&&(r=!0,a=\"buffer\",s=c)}var f=e.objectMode?1:s.length;e.length+=f;var p=e.length<e.highWaterMark;if(p||(e.needDrain=!0),e.writing||e.corked){var h=e.lastBufferedRequest;e.lastBufferedRequest={chunk:s,encoding:a,isBuf:r,callback:n,next:null},h?h.next=e.lastBufferedRequest:e.bufferedRequest=e.lastBufferedRequest,e.bufferedRequestCount+=1}else JY(t,e,!1,f,s,a,n);return p}function JY(t,e,r,s,a,n,c){e.writelen=s,e.writecb=c,e.writing=!0,e.sync=!0,e.destroyed?e.onwrite(new qmt(\"write\")):r?t._writev(a,e.onwrite):t._write(a,n,e.onwrite),e.sync=!1}function $mt(t,e,r,s,a){--e.pendingcb,r?(process.nextTick(a,s),process.nextTick(XD,t,e),t._writableState.errorEmitted=!0,Rw(t,s)):(a(s),t._writableState.errorEmitted=!0,Rw(t,s),XD(t,e))}function eyt(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}function tyt(t,e){var r=t._writableState,s=r.sync,a=r.writecb;if(typeof a!=\"function\")throw new jmt;if(eyt(r),e)$mt(t,r,s,e,a);else{var n=Eve(r)||t.destroyed;!n&&!r.corked&&!r.bufferProcessing&&r.bufferedRequest&&yve(t,r),s?process.nextTick(gve,t,r,n,a):gve(t,r,n,a)}}function gve(t,e,r,s){r||ryt(t,e),e.pendingcb--,s(),XD(t,e)}function ryt(t,e){e.length===0&&e.needDrain&&(e.needDrain=!1,t.emit(\"drain\"))}function yve(t,e){e.bufferProcessing=!0;var r=e.bufferedRequest;if(t._writev&&r&&r.next){var s=e.bufferedRequestCount,a=new Array(s),n=e.corkedRequestsFree;n.entry=r;for(var c=0,f=!0;r;)a[c]=r,r.isBuf||(f=!1),r=r.next,c+=1;a.allBuffers=f,JY(t,e,!0,e.length,a,\"\",n.finish),e.pendingcb++,e.lastBufferedRequest=null,n.next?(e.corkedRequestsFree=n.next,n.next=null):e.corkedRequestsFree=new dve(e),e.bufferedRequestCount=0}else{for(;r;){var p=r.chunk,h=r.encoding,E=r.callback,C=e.objectMode?1:p.length;if(JY(t,e,!1,C,p,h,E),r=r.next,e.bufferedRequestCount--,e.writing)break}r===null&&(e.lastBufferedRequest=null)}e.bufferedRequest=r,e.bufferProcessing=!1}Vi.prototype._write=function(t,e,r){r(new Hmt(\"_write()\"))};Vi.prototype._writev=null;Vi.prototype.end=function(t,e,r){var s=this._writableState;return typeof t==\"function\"?(r=t,t=null,e=null):typeof e==\"function\"&&(r=e,e=null),t!=null&&this.write(t,e),s.corked&&(s.corked=1,this.uncork()),s.ending||syt(this,s,r),this};Object.defineProperty(Vi.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}});function Eve(t){return t.ending&&t.length===0&&t.bufferedRequest===null&&!t.finished&&!t.writing}function nyt(t,e){t._final(function(r){e.pendingcb--,r&&Rw(t,r),e.prefinished=!0,t.emit(\"prefinish\"),XD(t,e)})}function iyt(t,e){!e.prefinished&&!e.finalCalled&&(typeof t._final==\"function\"&&!e.destroyed?(e.pendingcb++,e.finalCalled=!0,process.nextTick(nyt,t,e)):(e.prefinished=!0,t.emit(\"prefinish\")))}function XD(t,e){var r=Eve(e);if(r&&(iyt(t,e),e.pendingcb===0&&(e.finished=!0,t.emit(\"finish\"),e.autoDestroy))){var s=t._readableState;(!s||s.autoDestroy&&s.endEmitted)&&t.destroy()}return r}function syt(t,e,r){e.ending=!0,XD(t,e),r&&(e.finished?process.nextTick(r):t.once(\"finish\",r)),e.ended=!0,t.writable=!1}function oyt(t,e,r){var s=t.entry;for(t.entry=null;s;){var a=s.callback;e.pendingcb--,a(r),s=s.next}e.corkedRequestsFree.next=t}Object.defineProperty(Vi.prototype,\"destroyed\",{enumerable:!1,get:function(){return this._writableState===void 0?!1:this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}});Vi.prototype.destroy=KY.destroy;Vi.prototype._undestroy=KY.undestroy;Vi.prototype._destroy=function(t,e){e(t)}});var Ym=_((Ktr,wve)=>{\"use strict\";var ayt=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};wve.exports=dA;var Cve=$Y(),ZY=zY();cg()(dA,Cve);for(XY=ayt(ZY.prototype),mN=0;mN<XY.length;mN++)yN=XY[mN],dA.prototype[yN]||(dA.prototype[yN]=ZY.prototype[yN]);var XY,yN,mN;function dA(t){if(!(this instanceof dA))return new dA(t);Cve.call(this,t),ZY.call(this,t),this.allowHalfOpen=!0,t&&(t.readable===!1&&(this.readable=!1),t.writable===!1&&(this.writable=!1),t.allowHalfOpen===!1&&(this.allowHalfOpen=!1,this.once(\"end\",lyt)))}Object.defineProperty(dA.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});Object.defineProperty(dA.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});Object.defineProperty(dA.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}});function lyt(){this._writableState.ended||process.nextTick(cyt,this)}function cyt(t){t.end()}Object.defineProperty(dA.prototype,\"destroyed\",{enumerable:!1,get:function(){return this._readableState===void 0||this._writableState===void 0?!1:this._readableState.destroyed&&this._writableState.destroyed},set:function(e){this._readableState===void 0||this._writableState===void 0||(this._readableState.destroyed=e,this._writableState.destroyed=e)}})});var Sve=_((eV,vve)=>{var EN=Ie(\"buffer\"),ah=EN.Buffer;function Bve(t,e){for(var r in t)e[r]=t[r]}ah.from&&ah.alloc&&ah.allocUnsafe&&ah.allocUnsafeSlow?vve.exports=EN:(Bve(EN,eV),eV.Buffer=Fw);function Fw(t,e,r){return ah(t,e,r)}Bve(ah,Fw);Fw.from=function(t,e,r){if(typeof t==\"number\")throw new TypeError(\"Argument must not be a number\");return ah(t,e,r)};Fw.alloc=function(t,e,r){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");var s=ah(t);return e!==void 0?typeof r==\"string\"?s.fill(e,r):s.fill(e):s.fill(0),s};Fw.allocUnsafe=function(t){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");return ah(t)};Fw.allocUnsafeSlow=function(t){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");return EN.SlowBuffer(t)}});var nV=_(bve=>{\"use strict\";var rV=Sve().Buffer,Dve=rV.isEncoding||function(t){switch(t=\"\"+t,t&&t.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};function uyt(t){if(!t)return\"utf8\";for(var e;;)switch(t){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return t;default:if(e)return;t=(\"\"+t).toLowerCase(),e=!0}}function fyt(t){var e=uyt(t);if(typeof e!=\"string\"&&(rV.isEncoding===Dve||!Dve(t)))throw new Error(\"Unknown encoding: \"+t);return e||t}bve.StringDecoder=$D;function $D(t){this.encoding=fyt(t);var e;switch(this.encoding){case\"utf16le\":this.text=myt,this.end=yyt,e=4;break;case\"utf8\":this.fillLast=hyt,e=4;break;case\"base64\":this.text=Eyt,this.end=Iyt,e=3;break;default:this.write=Cyt,this.end=wyt;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=rV.allocUnsafe(e)}$D.prototype.write=function(t){if(t.length===0)return\"\";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return\"\";r=this.lastNeed,this.lastNeed=0}else r=0;return r<t.length?e?e+this.text(t,r):this.text(t,r):e||\"\"};$D.prototype.end=dyt;$D.prototype.text=gyt;$D.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length};function tV(t){return t<=127?0:t>>5===6?2:t>>4===14?3:t>>3===30?4:t>>6===2?-1:-2}function Ayt(t,e,r){var s=e.length-1;if(s<r)return 0;var a=tV(e[s]);return a>=0?(a>0&&(t.lastNeed=a-1),a):--s<r||a===-2?0:(a=tV(e[s]),a>=0?(a>0&&(t.lastNeed=a-2),a):--s<r||a===-2?0:(a=tV(e[s]),a>=0?(a>0&&(a===2?a=0:t.lastNeed=a-3),a):0))}function pyt(t,e,r){if((e[0]&192)!==128)return t.lastNeed=0,\"\\uFFFD\";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return t.lastNeed=1,\"\\uFFFD\";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return t.lastNeed=2,\"\\uFFFD\"}}function hyt(t){var e=this.lastTotal-this.lastNeed,r=pyt(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function gyt(t,e){var r=Ayt(this,t,e);if(!this.lastNeed)return t.toString(\"utf8\",e);this.lastTotal=r;var s=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,s),t.toString(\"utf8\",e,s)}function dyt(t){var e=t&&t.length?this.write(t):\"\";return this.lastNeed?e+\"\\uFFFD\":e}function myt(t,e){if((t.length-e)%2===0){var r=t.toString(\"utf16le\",e);if(r){var s=r.charCodeAt(r.length-1);if(s>=55296&&s<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString(\"utf16le\",e,t.length-1)}function yyt(t){var e=t&&t.length?this.write(t):\"\";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString(\"utf16le\",0,r)}return e}function Eyt(t,e){var r=(t.length-e)%3;return r===0?t.toString(\"base64\",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString(\"base64\",e,t.length-r))}function Iyt(t){var e=t&&t.length?this.write(t):\"\";return this.lastNeed?e+this.lastChar.toString(\"base64\",0,3-this.lastNeed):e}function Cyt(t){return t.toString(this.encoding)}function wyt(t){return t&&t.length?this.write(t):\"\"}});var IN=_((Xtr,kve)=>{\"use strict\";var Pve=lg().codes.ERR_STREAM_PREMATURE_CLOSE;function Byt(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,s=new Array(r),a=0;a<r;a++)s[a]=arguments[a];t.apply(this,s)}}}function vyt(){}function Syt(t){return t.setHeader&&typeof t.abort==\"function\"}function xve(t,e,r){if(typeof e==\"function\")return xve(t,null,e);e||(e={}),r=Byt(r||vyt);var s=e.readable||e.readable!==!1&&t.readable,a=e.writable||e.writable!==!1&&t.writable,n=function(){t.writable||f()},c=t._writableState&&t._writableState.finished,f=function(){a=!1,c=!0,s||r.call(t)},p=t._readableState&&t._readableState.endEmitted,h=function(){s=!1,p=!0,a||r.call(t)},E=function(I){r.call(t,I)},C=function(){var I;if(s&&!p)return(!t._readableState||!t._readableState.ended)&&(I=new Pve),r.call(t,I);if(a&&!c)return(!t._writableState||!t._writableState.ended)&&(I=new Pve),r.call(t,I)},S=function(){t.req.on(\"finish\",f)};return Syt(t)?(t.on(\"complete\",f),t.on(\"abort\",C),t.req?S():t.on(\"request\",S)):a&&!t._writableState&&(t.on(\"end\",n),t.on(\"close\",n)),t.on(\"end\",h),t.on(\"finish\",f),e.error!==!1&&t.on(\"error\",E),t.on(\"close\",C),function(){t.removeListener(\"complete\",f),t.removeListener(\"abort\",C),t.removeListener(\"request\",S),t.req&&t.req.removeListener(\"finish\",f),t.removeListener(\"end\",n),t.removeListener(\"close\",n),t.removeListener(\"finish\",f),t.removeListener(\"end\",h),t.removeListener(\"error\",E),t.removeListener(\"close\",C)}}kve.exports=xve});var Tve=_((Ztr,Qve)=>{\"use strict\";var CN;function fg(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var Dyt=IN(),Ag=Symbol(\"lastResolve\"),Vm=Symbol(\"lastReject\"),eb=Symbol(\"error\"),wN=Symbol(\"ended\"),Jm=Symbol(\"lastPromise\"),iV=Symbol(\"handlePromise\"),Km=Symbol(\"stream\");function pg(t,e){return{value:t,done:e}}function byt(t){var e=t[Ag];if(e!==null){var r=t[Km].read();r!==null&&(t[Jm]=null,t[Ag]=null,t[Vm]=null,e(pg(r,!1)))}}function Pyt(t){process.nextTick(byt,t)}function xyt(t,e){return function(r,s){t.then(function(){if(e[wN]){r(pg(void 0,!0));return}e[iV](r,s)},s)}}var kyt=Object.getPrototypeOf(function(){}),Qyt=Object.setPrototypeOf((CN={get stream(){return this[Km]},next:function(){var e=this,r=this[eb];if(r!==null)return Promise.reject(r);if(this[wN])return Promise.resolve(pg(void 0,!0));if(this[Km].destroyed)return new Promise(function(c,f){process.nextTick(function(){e[eb]?f(e[eb]):c(pg(void 0,!0))})});var s=this[Jm],a;if(s)a=new Promise(xyt(s,this));else{var n=this[Km].read();if(n!==null)return Promise.resolve(pg(n,!1));a=new Promise(this[iV])}return this[Jm]=a,a}},fg(CN,Symbol.asyncIterator,function(){return this}),fg(CN,\"return\",function(){var e=this;return new Promise(function(r,s){e[Km].destroy(null,function(a){if(a){s(a);return}r(pg(void 0,!0))})})}),CN),kyt),Tyt=function(e){var r,s=Object.create(Qyt,(r={},fg(r,Km,{value:e,writable:!0}),fg(r,Ag,{value:null,writable:!0}),fg(r,Vm,{value:null,writable:!0}),fg(r,eb,{value:null,writable:!0}),fg(r,wN,{value:e._readableState.endEmitted,writable:!0}),fg(r,iV,{value:function(n,c){var f=s[Km].read();f?(s[Jm]=null,s[Ag]=null,s[Vm]=null,n(pg(f,!1))):(s[Ag]=n,s[Vm]=c)},writable:!0}),r));return s[Jm]=null,Dyt(e,function(a){if(a&&a.code!==\"ERR_STREAM_PREMATURE_CLOSE\"){var n=s[Vm];n!==null&&(s[Jm]=null,s[Ag]=null,s[Vm]=null,n(a)),s[eb]=a;return}var c=s[Ag];c!==null&&(s[Jm]=null,s[Ag]=null,s[Vm]=null,c(pg(void 0,!0))),s[wN]=!0}),e.on(\"readable\",Pyt.bind(null,s)),s};Qve.exports=Tyt});var Ove=_(($tr,Nve)=>{\"use strict\";function Rve(t,e,r,s,a,n,c){try{var f=t[n](c),p=f.value}catch(h){r(h);return}f.done?e(p):Promise.resolve(p).then(s,a)}function Ryt(t){return function(){var e=this,r=arguments;return new Promise(function(s,a){var n=t.apply(e,r);function c(p){Rve(n,s,a,c,f,\"next\",p)}function f(p){Rve(n,s,a,c,f,\"throw\",p)}c(void 0)})}}function Fve(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);e&&(s=s.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,s)}return r}function Fyt(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=null?arguments[e]:{};e%2?Fve(Object(r),!0).forEach(function(s){Nyt(t,s,r[s])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):Fve(Object(r)).forEach(function(s){Object.defineProperty(t,s,Object.getOwnPropertyDescriptor(r,s))})}return t}function Nyt(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var Oyt=lg().codes.ERR_INVALID_ARG_TYPE;function Lyt(t,e,r){var s;if(e&&typeof e.next==\"function\")s=e;else if(e&&e[Symbol.asyncIterator])s=e[Symbol.asyncIterator]();else if(e&&e[Symbol.iterator])s=e[Symbol.iterator]();else throw new Oyt(\"iterable\",[\"Iterable\"],e);var a=new t(Fyt({objectMode:!0},r)),n=!1;a._read=function(){n||(n=!0,c())};function c(){return f.apply(this,arguments)}function f(){return f=Ryt(function*(){try{var p=yield s.next(),h=p.value,E=p.done;E?a.push(null):a.push(yield h)?c():n=!1}catch(C){a.destroy(C)}}),f.apply(this,arguments)}return a}Nve.exports=Lyt});var $Y=_((rrr,Yve)=>{\"use strict\";Yve.exports=Pn;var Nw;Pn.ReadableState=_ve;var trr=Ie(\"events\").EventEmitter,Uve=function(e,r){return e.listeners(r).length},rb=_Y(),BN=Ie(\"buffer\").Buffer,Myt=global.Uint8Array||function(){};function Uyt(t){return BN.from(t)}function _yt(t){return BN.isBuffer(t)||t instanceof Myt}var sV=Ie(\"util\"),cn;sV&&sV.debuglog?cn=sV.debuglog(\"stream\"):cn=function(){};var Hyt=sve(),AV=GY(),jyt=qY(),Gyt=jyt.getHighWaterMark,vN=lg().codes,qyt=vN.ERR_INVALID_ARG_TYPE,Wyt=vN.ERR_STREAM_PUSH_AFTER_EOF,Yyt=vN.ERR_METHOD_NOT_IMPLEMENTED,Vyt=vN.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,Ow,oV,aV;cg()(Pn,rb);var tb=AV.errorOrDestroy,lV=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];function Jyt(t,e,r){if(typeof t.prependListener==\"function\")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function _ve(t,e,r){Nw=Nw||Ym(),t=t||{},typeof r!=\"boolean\"&&(r=e instanceof Nw),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=Gyt(this,t,\"readableHighWaterMark\",r),this.buffer=new Hyt,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(Ow||(Ow=nV().StringDecoder),this.decoder=new Ow(t.encoding),this.encoding=t.encoding)}function Pn(t){if(Nw=Nw||Ym(),!(this instanceof Pn))return new Pn(t);var e=this instanceof Nw;this._readableState=new _ve(t,this,e),this.readable=!0,t&&(typeof t.read==\"function\"&&(this._read=t.read),typeof t.destroy==\"function\"&&(this._destroy=t.destroy)),rb.call(this)}Object.defineProperty(Pn.prototype,\"destroyed\",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){this._readableState&&(this._readableState.destroyed=e)}});Pn.prototype.destroy=AV.destroy;Pn.prototype._undestroy=AV.undestroy;Pn.prototype._destroy=function(t,e){e(t)};Pn.prototype.push=function(t,e){var r=this._readableState,s;return r.objectMode?s=!0:typeof t==\"string\"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=BN.from(t,e),e=\"\"),s=!0),Hve(this,t,e,!1,s)};Pn.prototype.unshift=function(t){return Hve(this,t,null,!0,!1)};function Hve(t,e,r,s,a){cn(\"readableAddChunk\",e);var n=t._readableState;if(e===null)n.reading=!1,Xyt(t,n);else{var c;if(a||(c=Kyt(n,e)),c)tb(t,c);else if(n.objectMode||e&&e.length>0)if(typeof e!=\"string\"&&!n.objectMode&&Object.getPrototypeOf(e)!==BN.prototype&&(e=Uyt(e)),s)n.endEmitted?tb(t,new Vyt):cV(t,n,e,!0);else if(n.ended)tb(t,new Wyt);else{if(n.destroyed)return!1;n.reading=!1,n.decoder&&!r?(e=n.decoder.write(e),n.objectMode||e.length!==0?cV(t,n,e,!1):fV(t,n)):cV(t,n,e,!1)}else s||(n.reading=!1,fV(t,n))}return!n.ended&&(n.length<n.highWaterMark||n.length===0)}function cV(t,e,r,s){e.flowing&&e.length===0&&!e.sync?(e.awaitDrain=0,t.emit(\"data\",r)):(e.length+=e.objectMode?1:r.length,s?e.buffer.unshift(r):e.buffer.push(r),e.needReadable&&SN(t)),fV(t,e)}function Kyt(t,e){var r;return!_yt(e)&&typeof e!=\"string\"&&e!==void 0&&!t.objectMode&&(r=new qyt(\"chunk\",[\"string\",\"Buffer\",\"Uint8Array\"],e)),r}Pn.prototype.isPaused=function(){return this._readableState.flowing===!1};Pn.prototype.setEncoding=function(t){Ow||(Ow=nV().StringDecoder);var e=new Ow(t);this._readableState.decoder=e,this._readableState.encoding=this._readableState.decoder.encoding;for(var r=this._readableState.buffer.head,s=\"\";r!==null;)s+=e.write(r.data),r=r.next;return this._readableState.buffer.clear(),s!==\"\"&&this._readableState.buffer.push(s),this._readableState.length=s.length,this};var Lve=1073741824;function zyt(t){return t>=Lve?t=Lve:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function Mve(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=zyt(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}Pn.prototype.read=function(t){cn(\"read\",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return cn(\"read: emitReadable\",e.length,e.ended),e.length===0&&e.ended?uV(this):SN(this),null;if(t=Mve(t,e),t===0&&e.ended)return e.length===0&&uV(this),null;var s=e.needReadable;cn(\"need readable\",s),(e.length===0||e.length-t<e.highWaterMark)&&(s=!0,cn(\"length less than watermark\",s)),e.ended||e.reading?(s=!1,cn(\"reading or ended\",s)):s&&(cn(\"do read\"),e.reading=!0,e.sync=!0,e.length===0&&(e.needReadable=!0),this._read(e.highWaterMark),e.sync=!1,e.reading||(t=Mve(r,e)));var a;return t>0?a=qve(t,e):a=null,a===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&uV(this)),a!==null&&this.emit(\"data\",a),a};function Xyt(t,e){if(cn(\"onEofChunk\"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?SN(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,jve(t)))}}function SN(t){var e=t._readableState;cn(\"emitReadable\",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(cn(\"emitReadable\",e.flowing),e.emittedReadable=!0,process.nextTick(jve,t))}function jve(t){var e=t._readableState;cn(\"emitReadable_\",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit(\"readable\"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,pV(t)}function fV(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(Zyt,t,e))}function Zyt(t,e){for(;!e.reading&&!e.ended&&(e.length<e.highWaterMark||e.flowing&&e.length===0);){var r=e.length;if(cn(\"maybeReadMore read 0\"),t.read(0),r===e.length)break}e.readingMore=!1}Pn.prototype._read=function(t){tb(this,new Yyt(\"_read()\"))};Pn.prototype.pipe=function(t,e){var r=this,s=this._readableState;switch(s.pipesCount){case 0:s.pipes=t;break;case 1:s.pipes=[s.pipes,t];break;default:s.pipes.push(t);break}s.pipesCount+=1,cn(\"pipe count=%d opts=%j\",s.pipesCount,e);var a=(!e||e.end!==!1)&&t!==process.stdout&&t!==process.stderr,n=a?f:R;s.endEmitted?process.nextTick(n):r.once(\"end\",n),t.on(\"unpipe\",c);function c(N,U){cn(\"onunpipe\"),N===r&&U&&U.hasUnpiped===!1&&(U.hasUnpiped=!0,E())}function f(){cn(\"onend\"),t.end()}var p=$yt(r);t.on(\"drain\",p);var h=!1;function E(){cn(\"cleanup\"),t.removeListener(\"close\",P),t.removeListener(\"finish\",I),t.removeListener(\"drain\",p),t.removeListener(\"error\",S),t.removeListener(\"unpipe\",c),r.removeListener(\"end\",f),r.removeListener(\"end\",R),r.removeListener(\"data\",C),h=!0,s.awaitDrain&&(!t._writableState||t._writableState.needDrain)&&p()}r.on(\"data\",C);function C(N){cn(\"ondata\");var U=t.write(N);cn(\"dest.write\",U),U===!1&&((s.pipesCount===1&&s.pipes===t||s.pipesCount>1&&Wve(s.pipes,t)!==-1)&&!h&&(cn(\"false write response, pause\",s.awaitDrain),s.awaitDrain++),r.pause())}function S(N){cn(\"onerror\",N),R(),t.removeListener(\"error\",S),Uve(t,\"error\")===0&&tb(t,N)}Jyt(t,\"error\",S);function P(){t.removeListener(\"finish\",I),R()}t.once(\"close\",P);function I(){cn(\"onfinish\"),t.removeListener(\"close\",P),R()}t.once(\"finish\",I);function R(){cn(\"unpipe\"),r.unpipe(t)}return t.emit(\"pipe\",r),s.flowing||(cn(\"pipe resume\"),r.resume()),t};function $yt(t){return function(){var r=t._readableState;cn(\"pipeOnDrain\",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&Uve(t,\"data\")&&(r.flowing=!0,pV(t))}}Pn.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit(\"unpipe\",this,r),this);if(!t){var s=e.pipes,a=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var n=0;n<a;n++)s[n].emit(\"unpipe\",this,{hasUnpiped:!1});return this}var c=Wve(e.pipes,t);return c===-1?this:(e.pipes.splice(c,1),e.pipesCount-=1,e.pipesCount===1&&(e.pipes=e.pipes[0]),t.emit(\"unpipe\",this,r),this)};Pn.prototype.on=function(t,e){var r=rb.prototype.on.call(this,t,e),s=this._readableState;return t===\"data\"?(s.readableListening=this.listenerCount(\"readable\")>0,s.flowing!==!1&&this.resume()):t===\"readable\"&&!s.endEmitted&&!s.readableListening&&(s.readableListening=s.needReadable=!0,s.flowing=!1,s.emittedReadable=!1,cn(\"on readable\",s.length,s.reading),s.length?SN(this):s.reading||process.nextTick(eEt,this)),r};Pn.prototype.addListener=Pn.prototype.on;Pn.prototype.removeListener=function(t,e){var r=rb.prototype.removeListener.call(this,t,e);return t===\"readable\"&&process.nextTick(Gve,this),r};Pn.prototype.removeAllListeners=function(t){var e=rb.prototype.removeAllListeners.apply(this,arguments);return(t===\"readable\"||t===void 0)&&process.nextTick(Gve,this),e};function Gve(t){var e=t._readableState;e.readableListening=t.listenerCount(\"readable\")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount(\"data\")>0&&t.resume()}function eEt(t){cn(\"readable nexttick read 0\"),t.read(0)}Pn.prototype.resume=function(){var t=this._readableState;return t.flowing||(cn(\"resume\"),t.flowing=!t.readableListening,tEt(this,t)),t.paused=!1,this};function tEt(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(rEt,t,e))}function rEt(t,e){cn(\"resume\",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit(\"resume\"),pV(t),e.flowing&&!e.reading&&t.read(0)}Pn.prototype.pause=function(){return cn(\"call pause flowing=%j\",this._readableState.flowing),this._readableState.flowing!==!1&&(cn(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this._readableState.paused=!0,this};function pV(t){var e=t._readableState;for(cn(\"flow\",e.flowing);e.flowing&&t.read()!==null;);}Pn.prototype.wrap=function(t){var e=this,r=this._readableState,s=!1;t.on(\"end\",function(){if(cn(\"wrapped end\"),r.decoder&&!r.ended){var c=r.decoder.end();c&&c.length&&e.push(c)}e.push(null)}),t.on(\"data\",function(c){if(cn(\"wrapped data\"),r.decoder&&(c=r.decoder.write(c)),!(r.objectMode&&c==null)&&!(!r.objectMode&&(!c||!c.length))){var f=e.push(c);f||(s=!0,t.pause())}});for(var a in t)this[a]===void 0&&typeof t[a]==\"function\"&&(this[a]=function(f){return function(){return t[f].apply(t,arguments)}}(a));for(var n=0;n<lV.length;n++)t.on(lV[n],this.emit.bind(this,lV[n]));return this._read=function(c){cn(\"wrapped _read\",c),s&&(s=!1,t.resume())},this};typeof Symbol==\"function\"&&(Pn.prototype[Symbol.asyncIterator]=function(){return oV===void 0&&(oV=Tve()),oV(this)});Object.defineProperty(Pn.prototype,\"readableHighWaterMark\",{enumerable:!1,get:function(){return this._readableState.highWaterMark}});Object.defineProperty(Pn.prototype,\"readableBuffer\",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}});Object.defineProperty(Pn.prototype,\"readableFlowing\",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(e){this._readableState&&(this._readableState.flowing=e)}});Pn._fromList=qve;Object.defineProperty(Pn.prototype,\"readableLength\",{enumerable:!1,get:function(){return this._readableState.length}});function qve(t,e){if(e.length===0)return null;var r;return e.objectMode?r=e.buffer.shift():!t||t>=e.length?(e.decoder?r=e.buffer.join(\"\"):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function uV(t){var e=t._readableState;cn(\"endReadable\",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(nEt,e,t))}function nEt(t,e){if(cn(\"endReadableNT\",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit(\"end\"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol==\"function\"&&(Pn.from=function(t,e){return aV===void 0&&(aV=Ove()),aV(Pn,t,e)});function Wve(t,e){for(var r=0,s=t.length;r<s;r++)if(t[r]===e)return r;return-1}});var hV=_((nrr,Jve)=>{\"use strict\";Jve.exports=lh;var DN=lg().codes,iEt=DN.ERR_METHOD_NOT_IMPLEMENTED,sEt=DN.ERR_MULTIPLE_CALLBACK,oEt=DN.ERR_TRANSFORM_ALREADY_TRANSFORMING,aEt=DN.ERR_TRANSFORM_WITH_LENGTH_0,bN=Ym();cg()(lh,bN);function lEt(t,e){var r=this._transformState;r.transforming=!1;var s=r.writecb;if(s===null)return this.emit(\"error\",new sEt);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),s(t);var a=this._readableState;a.reading=!1,(a.needReadable||a.length<a.highWaterMark)&&this._read(a.highWaterMark)}function lh(t){if(!(this instanceof lh))return new lh(t);bN.call(this,t),this._transformState={afterTransform:lEt.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,t&&(typeof t.transform==\"function\"&&(this._transform=t.transform),typeof t.flush==\"function\"&&(this._flush=t.flush)),this.on(\"prefinish\",cEt)}function cEt(){var t=this;typeof this._flush==\"function\"&&!this._readableState.destroyed?this._flush(function(e,r){Vve(t,e,r)}):Vve(this,null,null)}lh.prototype.push=function(t,e){return this._transformState.needTransform=!1,bN.prototype.push.call(this,t,e)};lh.prototype._transform=function(t,e,r){r(new iEt(\"_transform()\"))};lh.prototype._write=function(t,e,r){var s=this._transformState;if(s.writecb=r,s.writechunk=t,s.writeencoding=e,!s.transforming){var a=this._readableState;(s.needTransform||a.needReadable||a.length<a.highWaterMark)&&this._read(a.highWaterMark)}};lh.prototype._read=function(t){var e=this._transformState;e.writechunk!==null&&!e.transforming?(e.transforming=!0,this._transform(e.writechunk,e.writeencoding,e.afterTransform)):e.needTransform=!0};lh.prototype._destroy=function(t,e){bN.prototype._destroy.call(this,t,function(r){e(r)})};function Vve(t,e,r){if(e)return t.emit(\"error\",e);if(r!=null&&t.push(r),t._writableState.length)throw new aEt;if(t._transformState.transforming)throw new oEt;return t.push(null)}});var Xve=_((irr,zve)=>{\"use strict\";zve.exports=nb;var Kve=hV();cg()(nb,Kve);function nb(t){if(!(this instanceof nb))return new nb(t);Kve.call(this,t)}nb.prototype._transform=function(t,e,r){r(null,t)}});var rSe=_((srr,tSe)=>{\"use strict\";var gV;function uEt(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var eSe=lg().codes,fEt=eSe.ERR_MISSING_ARGS,AEt=eSe.ERR_STREAM_DESTROYED;function Zve(t){if(t)throw t}function pEt(t){return t.setHeader&&typeof t.abort==\"function\"}function hEt(t,e,r,s){s=uEt(s);var a=!1;t.on(\"close\",function(){a=!0}),gV===void 0&&(gV=IN()),gV(t,{readable:e,writable:r},function(c){if(c)return s(c);a=!0,s()});var n=!1;return function(c){if(!a&&!n){if(n=!0,pEt(t))return t.abort();if(typeof t.destroy==\"function\")return t.destroy();s(c||new AEt(\"pipe\"))}}}function $ve(t){t()}function gEt(t,e){return t.pipe(e)}function dEt(t){return!t.length||typeof t[t.length-1]!=\"function\"?Zve:t.pop()}function mEt(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];var s=dEt(e);if(Array.isArray(e[0])&&(e=e[0]),e.length<2)throw new fEt(\"streams\");var a,n=e.map(function(c,f){var p=f<e.length-1,h=f>0;return hEt(c,p,h,function(E){a||(a=E),E&&n.forEach($ve),!p&&(n.forEach($ve),s(a))})});return e.reduce(gEt)}tSe.exports=mEt});var Lw=_((zc,sb)=>{var ib=Ie(\"stream\");process.env.READABLE_STREAM===\"disable\"&&ib?(sb.exports=ib.Readable,Object.assign(sb.exports,ib),sb.exports.Stream=ib):(zc=sb.exports=$Y(),zc.Stream=ib||zc,zc.Readable=zc,zc.Writable=zY(),zc.Duplex=Ym(),zc.Transform=hV(),zc.PassThrough=Xve(),zc.finished=IN(),zc.pipeline=rSe())});var sSe=_((orr,iSe)=>{\"use strict\";var{Buffer:cf}=Ie(\"buffer\"),nSe=Symbol.for(\"BufferList\");function Ci(t){if(!(this instanceof Ci))return new Ci(t);Ci._init.call(this,t)}Ci._init=function(e){Object.defineProperty(this,nSe,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};Ci.prototype._new=function(e){return new Ci(e)};Ci.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let s=0;s<this._bufs.length;s++){let a=r+this._bufs[s].length;if(e<a||s===this._bufs.length-1)return[s,e-r];r=a}};Ci.prototype._reverseOffset=function(t){let e=t[0],r=t[1];for(let s=0;s<e;s++)r+=this._bufs[s].length;return r};Ci.prototype.get=function(e){if(e>this.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};Ci.prototype.slice=function(e,r){return typeof e==\"number\"&&e<0&&(e+=this.length),typeof r==\"number\"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};Ci.prototype.copy=function(e,r,s,a){if((typeof s!=\"number\"||s<0)&&(s=0),(typeof a!=\"number\"||a>this.length)&&(a=this.length),s>=this.length||a<=0)return e||cf.alloc(0);let n=!!e,c=this._offset(s),f=a-s,p=f,h=n&&r||0,E=c[1];if(s===0&&a===this.length){if(!n)return this._bufs.length===1?this._bufs[0]:cf.concat(this._bufs,this.length);for(let C=0;C<this._bufs.length;C++)this._bufs[C].copy(e,h),h+=this._bufs[C].length;return e}if(p<=this._bufs[c[0]].length-E)return n?this._bufs[c[0]].copy(e,r,E,E+p):this._bufs[c[0]].slice(E,E+p);n||(e=cf.allocUnsafe(f));for(let C=c[0];C<this._bufs.length;C++){let S=this._bufs[C].length-E;if(p>S)this._bufs[C].copy(e,h,E),h+=S;else{this._bufs[C].copy(e,h,E,E+p),h+=S;break}p-=S,E&&(E=0)}return e.length>h?e.slice(0,h):e};Ci.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!=\"number\"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let s=this._offset(e),a=this._offset(r),n=this._bufs.slice(s[0],a[0]+1);return a[1]===0?n.pop():n[n.length-1]=n[n.length-1].slice(0,a[1]),s[1]!==0&&(n[0]=n[0].slice(s[1])),this._new(n)};Ci.prototype.toString=function(e,r,s){return this.slice(r,s).toString(e)};Ci.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};Ci.prototype.duplicate=function(){let e=this._new();for(let r=0;r<this._bufs.length;r++)e.append(this._bufs[r]);return e};Ci.prototype.append=function(e){if(e==null)return this;if(e.buffer)this._appendBuffer(cf.from(e.buffer,e.byteOffset,e.byteLength));else if(Array.isArray(e))for(let r=0;r<e.length;r++)this.append(e[r]);else if(this._isBufferList(e))for(let r=0;r<e._bufs.length;r++)this.append(e._bufs[r]);else typeof e==\"number\"&&(e=e.toString()),this._appendBuffer(cf.from(e));return this};Ci.prototype._appendBuffer=function(e){this._bufs.push(e),this.length+=e.length};Ci.prototype.indexOf=function(t,e,r){if(r===void 0&&typeof e==\"string\"&&(r=e,e=void 0),typeof t==\"function\"||Array.isArray(t))throw new TypeError('The \"value\" argument must be one of type string, Buffer, BufferList, or Uint8Array.');if(typeof t==\"number\"?t=cf.from([t]):typeof t==\"string\"?t=cf.from(t,r):this._isBufferList(t)?t=t.slice():Array.isArray(t.buffer)?t=cf.from(t.buffer,t.byteOffset,t.byteLength):cf.isBuffer(t)||(t=cf.from(t)),e=Number(e||0),isNaN(e)&&(e=0),e<0&&(e=this.length+e),e<0&&(e=0),t.length===0)return e>this.length?this.length:e;let s=this._offset(e),a=s[0],n=s[1];for(;a<this._bufs.length;a++){let c=this._bufs[a];for(;n<c.length;)if(c.length-n>=t.length){let p=c.indexOf(t,n);if(p!==-1)return this._reverseOffset([a,p]);n=c.length-t.length+1}else{let p=this._reverseOffset([a,n]);if(this._match(p,t))return p;n++}n=0}return-1};Ci.prototype._match=function(t,e){if(this.length-t<e.length)return!1;for(let r=0;r<e.length;r++)if(this.get(t+r)!==e[r])return!1;return!0};(function(){let t={readDoubleBE:8,readDoubleLE:8,readFloatBE:4,readFloatLE:4,readInt32BE:4,readInt32LE:4,readUInt32BE:4,readUInt32LE:4,readInt16BE:2,readInt16LE:2,readUInt16BE:2,readUInt16LE:2,readInt8:1,readUInt8:1,readIntBE:null,readIntLE:null,readUIntBE:null,readUIntLE:null};for(let e in t)(function(r){t[r]===null?Ci.prototype[r]=function(s,a){return this.slice(s,s+a)[r](0,a)}:Ci.prototype[r]=function(s=0){return this.slice(s,s+t[r])[r](0)}})(e)})();Ci.prototype._isBufferList=function(e){return e instanceof Ci||Ci.isBufferList(e)};Ci.isBufferList=function(e){return e!=null&&e[nSe]};iSe.exports=Ci});var oSe=_((arr,PN)=>{\"use strict\";var dV=Lw().Duplex,yEt=cg(),ob=sSe();function ra(t){if(!(this instanceof ra))return new ra(t);if(typeof t==\"function\"){this._callback=t;let e=function(s){this._callback&&(this._callback(s),this._callback=null)}.bind(this);this.on(\"pipe\",function(s){s.on(\"error\",e)}),this.on(\"unpipe\",function(s){s.removeListener(\"error\",e)}),t=null}ob._init.call(this,t),dV.call(this)}yEt(ra,dV);Object.assign(ra.prototype,ob.prototype);ra.prototype._new=function(e){return new ra(e)};ra.prototype._write=function(e,r,s){this._appendBuffer(e),typeof s==\"function\"&&s()};ra.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};ra.prototype.end=function(e){dV.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};ra.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};ra.prototype._isBufferList=function(e){return e instanceof ra||e instanceof ob||ra.isBufferList(e)};ra.isBufferList=ob.isBufferList;PN.exports=ra;PN.exports.BufferListStream=ra;PN.exports.BufferList=ob});var EV=_(Uw=>{var EEt=Buffer.alloc,IEt=\"0000000000000000000\",CEt=\"7777777777777777777\",aSe=48,lSe=Buffer.from(\"ustar\\0\",\"binary\"),wEt=Buffer.from(\"00\",\"binary\"),BEt=Buffer.from(\"ustar \",\"binary\"),vEt=Buffer.from(\" \\0\",\"binary\"),SEt=parseInt(\"7777\",8),ab=257,yV=263,DEt=function(t,e,r){return typeof t!=\"number\"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},bEt=function(t){switch(t){case 0:return\"file\";case 1:return\"link\";case 2:return\"symlink\";case 3:return\"character-device\";case 4:return\"block-device\";case 5:return\"directory\";case 6:return\"fifo\";case 7:return\"contiguous-file\";case 72:return\"pax-header\";case 55:return\"pax-global-header\";case 27:return\"gnu-long-link-path\";case 28:case 30:return\"gnu-long-path\"}return null},PEt=function(t){switch(t){case\"file\":return 0;case\"link\":return 1;case\"symlink\":return 2;case\"character-device\":return 3;case\"block-device\":return 4;case\"directory\":return 5;case\"fifo\":return 6;case\"contiguous-file\":return 7;case\"pax-header\":return 72}return 0},cSe=function(t,e,r,s){for(;r<s;r++)if(t[r]===e)return r;return s},uSe=function(t){for(var e=256,r=0;r<148;r++)e+=t[r];for(var s=156;s<512;s++)e+=t[s];return e},hg=function(t,e){return t=t.toString(8),t.length>e?CEt.slice(0,e)+\" \":IEt.slice(0,e-t.length)+t+\" \"};function xEt(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],s=t.length-1;s>0;s--){var a=t[s];e?r.push(a):r.push(255-a)}var n=0,c=r.length;for(s=0;s<c;s++)n+=r[s]*Math.pow(256,s);return e?n:-1*n}var gg=function(t,e,r){if(t=t.slice(e,e+r),e=0,t[e]&128)return xEt(t);for(;e<t.length&&t[e]===32;)e++;for(var s=DEt(cSe(t,32,e,t.length),t.length,t.length);e<s&&t[e]===0;)e++;return s===e?0:parseInt(t.slice(e,s).toString(),8)},Mw=function(t,e,r,s){return t.slice(e,cSe(t,0,e,e+r)).toString(s)},mV=function(t){var e=Buffer.byteLength(t),r=Math.floor(Math.log(e)/Math.log(10))+1;return e+r>=Math.pow(10,r)&&r++,e+r+t};Uw.decodeLongPath=function(t,e){return Mw(t,0,t.length,e)};Uw.encodePax=function(t){var e=\"\";t.name&&(e+=mV(\" path=\"+t.name+`\n`)),t.linkname&&(e+=mV(\" linkpath=\"+t.linkname+`\n`));var r=t.pax;if(r)for(var s in r)e+=mV(\" \"+s+\"=\"+r[s]+`\n`);return Buffer.from(e)};Uw.decodePax=function(t){for(var e={};t.length;){for(var r=0;r<t.length&&t[r]!==32;)r++;var s=parseInt(t.slice(0,r).toString(),10);if(!s)return e;var a=t.slice(r+1,s-1).toString(),n=a.indexOf(\"=\");if(n===-1)return e;e[a.slice(0,n)]=a.slice(n+1),t=t.slice(s)}return e};Uw.encode=function(t){var e=EEt(512),r=t.name,s=\"\";if(t.typeflag===5&&r[r.length-1]!==\"/\"&&(r+=\"/\"),Buffer.byteLength(r)!==r.length)return null;for(;Buffer.byteLength(r)>100;){var a=r.indexOf(\"/\");if(a===-1)return null;s+=s?\"/\"+r.slice(0,a):r.slice(0,a),r=r.slice(a+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(s)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(hg(t.mode&SEt,6),100),e.write(hg(t.uid,6),108),e.write(hg(t.gid,6),116),e.write(hg(t.size,11),124),e.write(hg(t.mtime.getTime()/1e3|0,11),136),e[156]=aSe+PEt(t.type),t.linkname&&e.write(t.linkname,157),lSe.copy(e,ab),wEt.copy(e,yV),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(hg(t.devmajor||0,6),329),e.write(hg(t.devminor||0,6),337),s&&e.write(s,345),e.write(hg(uSe(e),6),148),e)};Uw.decode=function(t,e,r){var s=t[156]===0?0:t[156]-aSe,a=Mw(t,0,100,e),n=gg(t,100,8),c=gg(t,108,8),f=gg(t,116,8),p=gg(t,124,12),h=gg(t,136,12),E=bEt(s),C=t[157]===0?null:Mw(t,157,100,e),S=Mw(t,265,32),P=Mw(t,297,32),I=gg(t,329,8),R=gg(t,337,8),N=uSe(t);if(N===8*32)return null;if(N!==gg(t,148,8))throw new Error(\"Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?\");if(lSe.compare(t,ab,ab+6)===0)t[345]&&(a=Mw(t,345,155,e)+\"/\"+a);else if(!(BEt.compare(t,ab,ab+6)===0&&vEt.compare(t,yV,yV+2)===0)){if(!r)throw new Error(\"Invalid tar header: unknown format.\")}return s===0&&a&&a[a.length-1]===\"/\"&&(s=5),{name:a,mode:n,uid:c,gid:f,size:p,mtime:new Date(1e3*h),type:E,linkname:C,uname:S,gname:P,devmajor:I,devminor:R}}});var mSe=_((crr,dSe)=>{var ASe=Ie(\"util\"),kEt=oSe(),lb=EV(),pSe=Lw().Writable,hSe=Lw().PassThrough,gSe=function(){},fSe=function(t){return t&=511,t&&512-t},QEt=function(t,e){var r=new xN(t,e);return r.end(),r},TEt=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},xN=function(t,e){this._parent=t,this.offset=e,hSe.call(this,{autoDestroy:!1})};ASe.inherits(xN,hSe);xN.prototype.destroy=function(t){this._parent.destroy(t)};var ch=function(t){if(!(this instanceof ch))return new ch(t);pSe.call(this,t),t=t||{},this._offset=0,this._buffer=kEt(),this._missing=0,this._partial=!1,this._onparse=gSe,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,r=e._buffer,s=function(){e._continue()},a=function(S){if(e._locked=!1,S)return e.destroy(S);e._stream||s()},n=function(){e._stream=null;var S=fSe(e._header.size);S?e._parse(S,c):e._parse(512,C),e._locked||s()},c=function(){e._buffer.consume(fSe(e._header.size)),e._parse(512,C),s()},f=function(){var S=e._header.size;e._paxGlobal=lb.decodePax(r.slice(0,S)),r.consume(S),n()},p=function(){var S=e._header.size;e._pax=lb.decodePax(r.slice(0,S)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(S),n()},h=function(){var S=e._header.size;this._gnuLongPath=lb.decodeLongPath(r.slice(0,S),t.filenameEncoding),r.consume(S),n()},E=function(){var S=e._header.size;this._gnuLongLinkPath=lb.decodeLongPath(r.slice(0,S),t.filenameEncoding),r.consume(S),n()},C=function(){var S=e._offset,P;try{P=e._header=lb.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(I){e.emit(\"error\",I)}if(r.consume(512),!P){e._parse(512,C),s();return}if(P.type===\"gnu-long-path\"){e._parse(P.size,h),s();return}if(P.type===\"gnu-long-link-path\"){e._parse(P.size,E),s();return}if(P.type===\"pax-global-header\"){e._parse(P.size,f),s();return}if(P.type===\"pax-header\"){e._parse(P.size,p),s();return}if(e._gnuLongPath&&(P.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(P.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=P=TEt(P,e._pax),e._pax=null),e._locked=!0,!P.size||P.type===\"directory\"){e._parse(512,C),e.emit(\"entry\",P,QEt(e,S),a);return}e._stream=new xN(e,S),e.emit(\"entry\",P,e._stream,a),e._parse(P.size,n),s()};this._onheader=C,this._parse(512,C)};ASe.inherits(ch,pSe);ch.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit(\"error\",t),this.emit(\"close\"),this._stream&&this._stream.emit(\"close\"))};ch.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};ch.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=gSe,this._overflow?this._write(this._overflow,void 0,t):t()}};ch.prototype._write=function(t,e,r){if(!this._destroyed){var s=this._stream,a=this._buffer,n=this._missing;if(t.length&&(this._partial=!0),t.length<n)return this._missing-=t.length,this._overflow=null,s?s.write(t,r):(a.append(t),r());this._cb=r,this._missing=0;var c=null;t.length>n&&(c=t.slice(n),t=t.slice(0,n)),s?s.end(t):a.append(t),this._overflow=c,this._onparse()}};ch.prototype._final=function(t){if(this._partial)return this.destroy(new Error(\"Unexpected end of data\"));t()};dSe.exports=ch});var ESe=_((urr,ySe)=>{ySe.exports=Ie(\"fs\").constants||Ie(\"constants\")});var vSe=_((frr,BSe)=>{var _w=ESe(),ISe=cH(),QN=cg(),REt=Buffer.alloc,CSe=Lw().Readable,Hw=Lw().Writable,FEt=Ie(\"string_decoder\").StringDecoder,kN=EV(),NEt=parseInt(\"755\",8),OEt=parseInt(\"644\",8),wSe=REt(1024),CV=function(){},IV=function(t,e){e&=511,e&&t.push(wSe.slice(0,512-e))};function LEt(t){switch(t&_w.S_IFMT){case _w.S_IFBLK:return\"block-device\";case _w.S_IFCHR:return\"character-device\";case _w.S_IFDIR:return\"directory\";case _w.S_IFIFO:return\"fifo\";case _w.S_IFLNK:return\"symlink\"}return\"file\"}var TN=function(t){Hw.call(this),this.written=0,this._to=t,this._destroyed=!1};QN(TN,Hw);TN.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};TN.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var RN=function(){Hw.call(this),this.linkname=\"\",this._decoder=new FEt(\"utf-8\"),this._destroyed=!1};QN(RN,Hw);RN.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};RN.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var ub=function(){Hw.call(this),this._destroyed=!1};QN(ub,Hw);ub.prototype._write=function(t,e,r){r(new Error(\"No body allowed for this entry\"))};ub.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var mA=function(t){if(!(this instanceof mA))return new mA(t);CSe.call(this,t),this._drain=CV,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};QN(mA,CSe);mA.prototype.entry=function(t,e,r){if(this._stream)throw new Error(\"already piping an entry\");if(!(this._finalized||this._destroyed)){typeof e==\"function\"&&(r=e,e=null),r||(r=CV);var s=this;if((!t.size||t.type===\"symlink\")&&(t.size=0),t.type||(t.type=LEt(t.mode)),t.mode||(t.mode=t.type===\"directory\"?NEt:OEt),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e==\"string\"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var a=this.push(e);return IV(s,t.size),a?process.nextTick(r):this._drain=r,new ub}if(t.type===\"symlink\"&&!t.linkname){var n=new RN;return ISe(n,function(f){if(f)return s.destroy(),r(f);t.linkname=n.linkname,s._encode(t),r()}),n}if(this._encode(t),t.type!==\"file\"&&t.type!==\"contiguous-file\")return process.nextTick(r),new ub;var c=new TN(this);return this._stream=c,ISe(c,function(f){if(s._stream=null,f)return s.destroy(),r(f);if(c.written!==t.size)return s.destroy(),r(new Error(\"size mismatch\"));IV(s,t.size),s._finalizing&&s.finalize(),r()}),c}};mA.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(wSe),this.push(null))};mA.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit(\"error\",t),this.emit(\"close\"),this._stream&&this._stream.destroy&&this._stream.destroy())};mA.prototype._encode=function(t){if(!t.pax){var e=kN.encode(t);if(e){this.push(e);return}}this._encodePax(t)};mA.prototype._encodePax=function(t){var e=kN.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:\"PaxHeader\",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:\"pax-header\",linkname:t.linkname&&\"PaxHeader\",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(kN.encode(r)),this.push(e),IV(this,e.length),r.size=t.size,r.type=t.type,this.push(kN.encode(r))};mA.prototype._read=function(t){var e=this._drain;this._drain=CV,e()};BSe.exports=mA});var SSe=_(wV=>{wV.extract=mSe();wV.pack=vSe()});var MSe=_(Ta=>{\"use strict\";var zEt=Ta&&Ta.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Ta,\"__esModule\",{value:!0});Ta.Minipass=Ta.isWritable=Ta.isReadable=Ta.isStream=void 0;var RSe=typeof process==\"object\"&&process?process:{stdout:null,stderr:null},FV=Ie(\"node:events\"),LSe=zEt(Ie(\"node:stream\")),XEt=Ie(\"node:string_decoder\"),ZEt=t=>!!t&&typeof t==\"object\"&&(t instanceof jN||t instanceof LSe.default||(0,Ta.isReadable)(t)||(0,Ta.isWritable)(t));Ta.isStream=ZEt;var $Et=t=>!!t&&typeof t==\"object\"&&t instanceof FV.EventEmitter&&typeof t.pipe==\"function\"&&t.pipe!==LSe.default.Writable.prototype.pipe;Ta.isReadable=$Et;var eIt=t=>!!t&&typeof t==\"object\"&&t instanceof FV.EventEmitter&&typeof t.write==\"function\"&&typeof t.end==\"function\";Ta.isWritable=eIt;var uh=Symbol(\"EOF\"),fh=Symbol(\"maybeEmitEnd\"),dg=Symbol(\"emittedEnd\"),ON=Symbol(\"emittingEnd\"),fb=Symbol(\"emittedError\"),LN=Symbol(\"closed\"),FSe=Symbol(\"read\"),MN=Symbol(\"flush\"),NSe=Symbol(\"flushChunk\"),uf=Symbol(\"encoding\"),Gw=Symbol(\"decoder\"),Ks=Symbol(\"flowing\"),Ab=Symbol(\"paused\"),qw=Symbol(\"resume\"),zs=Symbol(\"buffer\"),Qa=Symbol(\"pipes\"),Xs=Symbol(\"bufferLength\"),PV=Symbol(\"bufferPush\"),UN=Symbol(\"bufferShift\"),na=Symbol(\"objectMode\"),ts=Symbol(\"destroyed\"),xV=Symbol(\"error\"),kV=Symbol(\"emitData\"),OSe=Symbol(\"emitEnd\"),QV=Symbol(\"emitEnd2\"),EA=Symbol(\"async\"),TV=Symbol(\"abort\"),_N=Symbol(\"aborted\"),pb=Symbol(\"signal\"),zm=Symbol(\"dataListeners\"),rc=Symbol(\"discarded\"),hb=t=>Promise.resolve().then(t),tIt=t=>t(),rIt=t=>t===\"end\"||t===\"finish\"||t===\"prefinish\",nIt=t=>t instanceof ArrayBuffer||!!t&&typeof t==\"object\"&&t.constructor&&t.constructor.name===\"ArrayBuffer\"&&t.byteLength>=0,iIt=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t),HN=class{src;dest;opts;ondrain;constructor(e,r,s){this.src=e,this.dest=r,this.opts=s,this.ondrain=()=>e[qw](),this.dest.on(\"drain\",this.ondrain)}unpipe(){this.dest.removeListener(\"drain\",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},RV=class extends HN{unpipe(){this.src.removeListener(\"error\",this.proxyErrors),super.unpipe()}constructor(e,r,s){super(e,r,s),this.proxyErrors=a=>r.emit(\"error\",a),e.on(\"error\",this.proxyErrors)}},sIt=t=>!!t.objectMode,oIt=t=>!t.objectMode&&!!t.encoding&&t.encoding!==\"buffer\",jN=class extends FV.EventEmitter{[Ks]=!1;[Ab]=!1;[Qa]=[];[zs]=[];[na];[uf];[EA];[Gw];[uh]=!1;[dg]=!1;[ON]=!1;[LN]=!1;[fb]=null;[Xs]=0;[ts]=!1;[pb];[_N]=!1;[zm]=0;[rc]=!1;writable=!0;readable=!0;constructor(...e){let r=e[0]||{};if(super(),r.objectMode&&typeof r.encoding==\"string\")throw new TypeError(\"Encoding and objectMode may not be used together\");sIt(r)?(this[na]=!0,this[uf]=null):oIt(r)?(this[uf]=r.encoding,this[na]=!1):(this[na]=!1,this[uf]=null),this[EA]=!!r.async,this[Gw]=this[uf]?new XEt.StringDecoder(this[uf]):null,r&&r.debugExposeBuffer===!0&&Object.defineProperty(this,\"buffer\",{get:()=>this[zs]}),r&&r.debugExposePipes===!0&&Object.defineProperty(this,\"pipes\",{get:()=>this[Qa]});let{signal:s}=r;s&&(this[pb]=s,s.aborted?this[TV]():s.addEventListener(\"abort\",()=>this[TV]()))}get bufferLength(){return this[Xs]}get encoding(){return this[uf]}set encoding(e){throw new Error(\"Encoding must be set at instantiation time\")}setEncoding(e){throw new Error(\"Encoding must be set at instantiation time\")}get objectMode(){return this[na]}set objectMode(e){throw new Error(\"objectMode must be set at instantiation time\")}get async(){return this[EA]}set async(e){this[EA]=this[EA]||!!e}[TV](){this[_N]=!0,this.emit(\"abort\",this[pb]?.reason),this.destroy(this[pb]?.reason)}get aborted(){return this[_N]}set aborted(e){}write(e,r,s){if(this[_N])return!1;if(this[uh])throw new Error(\"write after end\");if(this[ts])return this.emit(\"error\",Object.assign(new Error(\"Cannot call write after a stream was destroyed\"),{code:\"ERR_STREAM_DESTROYED\"})),!0;typeof r==\"function\"&&(s=r,r=\"utf8\"),r||(r=\"utf8\");let a=this[EA]?hb:tIt;if(!this[na]&&!Buffer.isBuffer(e)){if(iIt(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(nIt(e))e=Buffer.from(e);else if(typeof e!=\"string\")throw new Error(\"Non-contiguous data written to non-objectMode stream\")}return this[na]?(this[Ks]&&this[Xs]!==0&&this[MN](!0),this[Ks]?this.emit(\"data\",e):this[PV](e),this[Xs]!==0&&this.emit(\"readable\"),s&&a(s),this[Ks]):e.length?(typeof e==\"string\"&&!(r===this[uf]&&!this[Gw]?.lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[uf]&&(e=this[Gw].write(e)),this[Ks]&&this[Xs]!==0&&this[MN](!0),this[Ks]?this.emit(\"data\",e):this[PV](e),this[Xs]!==0&&this.emit(\"readable\"),s&&a(s),this[Ks]):(this[Xs]!==0&&this.emit(\"readable\"),s&&a(s),this[Ks])}read(e){if(this[ts])return null;if(this[rc]=!1,this[Xs]===0||e===0||e&&e>this[Xs])return this[fh](),null;this[na]&&(e=null),this[zs].length>1&&!this[na]&&(this[zs]=[this[uf]?this[zs].join(\"\"):Buffer.concat(this[zs],this[Xs])]);let r=this[FSe](e||null,this[zs][0]);return this[fh](),r}[FSe](e,r){if(this[na])this[UN]();else{let s=r;e===s.length||e===null?this[UN]():typeof s==\"string\"?(this[zs][0]=s.slice(e),r=s.slice(0,e),this[Xs]-=e):(this[zs][0]=s.subarray(e),r=s.subarray(0,e),this[Xs]-=e)}return this.emit(\"data\",r),!this[zs].length&&!this[uh]&&this.emit(\"drain\"),r}end(e,r,s){return typeof e==\"function\"&&(s=e,e=void 0),typeof r==\"function\"&&(s=r,r=\"utf8\"),e!==void 0&&this.write(e,r),s&&this.once(\"end\",s),this[uh]=!0,this.writable=!1,(this[Ks]||!this[Ab])&&this[fh](),this}[qw](){this[ts]||(!this[zm]&&!this[Qa].length&&(this[rc]=!0),this[Ab]=!1,this[Ks]=!0,this.emit(\"resume\"),this[zs].length?this[MN]():this[uh]?this[fh]():this.emit(\"drain\"))}resume(){return this[qw]()}pause(){this[Ks]=!1,this[Ab]=!0,this[rc]=!1}get destroyed(){return this[ts]}get flowing(){return this[Ks]}get paused(){return this[Ab]}[PV](e){this[na]?this[Xs]+=1:this[Xs]+=e.length,this[zs].push(e)}[UN](){return this[na]?this[Xs]-=1:this[Xs]-=this[zs][0].length,this[zs].shift()}[MN](e=!1){do;while(this[NSe](this[UN]())&&this[zs].length);!e&&!this[zs].length&&!this[uh]&&this.emit(\"drain\")}[NSe](e){return this.emit(\"data\",e),this[Ks]}pipe(e,r){if(this[ts])return e;this[rc]=!1;let s=this[dg];return r=r||{},e===RSe.stdout||e===RSe.stderr?r.end=!1:r.end=r.end!==!1,r.proxyErrors=!!r.proxyErrors,s?r.end&&e.end():(this[Qa].push(r.proxyErrors?new RV(this,e,r):new HN(this,e,r)),this[EA]?hb(()=>this[qw]()):this[qw]()),e}unpipe(e){let r=this[Qa].find(s=>s.dest===e);r&&(this[Qa].length===1?(this[Ks]&&this[zm]===0&&(this[Ks]=!1),this[Qa]=[]):this[Qa].splice(this[Qa].indexOf(r),1),r.unpipe())}addListener(e,r){return this.on(e,r)}on(e,r){let s=super.on(e,r);if(e===\"data\")this[rc]=!1,this[zm]++,!this[Qa].length&&!this[Ks]&&this[qw]();else if(e===\"readable\"&&this[Xs]!==0)super.emit(\"readable\");else if(rIt(e)&&this[dg])super.emit(e),this.removeAllListeners(e);else if(e===\"error\"&&this[fb]){let a=r;this[EA]?hb(()=>a.call(this,this[fb])):a.call(this,this[fb])}return s}removeListener(e,r){return this.off(e,r)}off(e,r){let s=super.off(e,r);return e===\"data\"&&(this[zm]=this.listeners(\"data\").length,this[zm]===0&&!this[rc]&&!this[Qa].length&&(this[Ks]=!1)),s}removeAllListeners(e){let r=super.removeAllListeners(e);return(e===\"data\"||e===void 0)&&(this[zm]=0,!this[rc]&&!this[Qa].length&&(this[Ks]=!1)),r}get emittedEnd(){return this[dg]}[fh](){!this[ON]&&!this[dg]&&!this[ts]&&this[zs].length===0&&this[uh]&&(this[ON]=!0,this.emit(\"end\"),this.emit(\"prefinish\"),this.emit(\"finish\"),this[LN]&&this.emit(\"close\"),this[ON]=!1)}emit(e,...r){let s=r[0];if(e!==\"error\"&&e!==\"close\"&&e!==ts&&this[ts])return!1;if(e===\"data\")return!this[na]&&!s?!1:this[EA]?(hb(()=>this[kV](s)),!0):this[kV](s);if(e===\"end\")return this[OSe]();if(e===\"close\"){if(this[LN]=!0,!this[dg]&&!this[ts])return!1;let n=super.emit(\"close\");return this.removeAllListeners(\"close\"),n}else if(e===\"error\"){this[fb]=s,super.emit(xV,s);let n=!this[pb]||this.listeners(\"error\").length?super.emit(\"error\",s):!1;return this[fh](),n}else if(e===\"resume\"){let n=super.emit(\"resume\");return this[fh](),n}else if(e===\"finish\"||e===\"prefinish\"){let n=super.emit(e);return this.removeAllListeners(e),n}let a=super.emit(e,...r);return this[fh](),a}[kV](e){for(let s of this[Qa])s.dest.write(e)===!1&&this.pause();let r=this[rc]?!1:super.emit(\"data\",e);return this[fh](),r}[OSe](){return this[dg]?!1:(this[dg]=!0,this.readable=!1,this[EA]?(hb(()=>this[QV]()),!0):this[QV]())}[QV](){if(this[Gw]){let r=this[Gw].end();if(r){for(let s of this[Qa])s.dest.write(r);this[rc]||super.emit(\"data\",r)}}for(let r of this[Qa])r.end();let e=super.emit(\"end\");return this.removeAllListeners(\"end\"),e}async collect(){let e=Object.assign([],{dataLength:0});this[na]||(e.dataLength=0);let r=this.promise();return this.on(\"data\",s=>{e.push(s),this[na]||(e.dataLength+=s.length)}),await r,e}async concat(){if(this[na])throw new Error(\"cannot concat in objectMode\");let e=await this.collect();return this[uf]?e.join(\"\"):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,r)=>{this.on(ts,()=>r(new Error(\"stream destroyed\"))),this.on(\"error\",s=>r(s)),this.on(\"end\",()=>e())})}[Symbol.asyncIterator](){this[rc]=!1;let e=!1,r=async()=>(this.pause(),e=!0,{value:void 0,done:!0});return{next:()=>{if(e)return r();let a=this.read();if(a!==null)return Promise.resolve({done:!1,value:a});if(this[uh])return r();let n,c,f=C=>{this.off(\"data\",p),this.off(\"end\",h),this.off(ts,E),r(),c(C)},p=C=>{this.off(\"error\",f),this.off(\"end\",h),this.off(ts,E),this.pause(),n({value:C,done:!!this[uh]})},h=()=>{this.off(\"error\",f),this.off(\"data\",p),this.off(ts,E),r(),n({done:!0,value:void 0})},E=()=>f(new Error(\"stream destroyed\"));return new Promise((C,S)=>{c=S,n=C,this.once(ts,E),this.once(\"error\",f),this.once(\"end\",h),this.once(\"data\",p)})},throw:r,return:r,[Symbol.asyncIterator](){return this}}}[Symbol.iterator](){this[rc]=!1;let e=!1,r=()=>(this.pause(),this.off(xV,r),this.off(ts,r),this.off(\"end\",r),e=!0,{done:!0,value:void 0}),s=()=>{if(e)return r();let a=this.read();return a===null?r():{done:!1,value:a}};return this.once(\"end\",r),this.once(xV,r),this.once(ts,r),{next:s,throw:r,return:r,[Symbol.iterator](){return this}}}destroy(e){if(this[ts])return e?this.emit(\"error\",e):this.emit(ts),this;this[ts]=!0,this[rc]=!0,this[zs].length=0,this[Xs]=0;let r=this;return typeof r.close==\"function\"&&!this[LN]&&r.close(),e?this.emit(\"error\",e):this.emit(ts),this}static get isStream(){return Ta.isStream}};Ta.Minipass=jN});var HSe=_((Trr,IA)=>{\"use strict\";var db=Ie(\"crypto\"),{Minipass:aIt}=MSe(),OV=[\"sha512\",\"sha384\",\"sha256\"],MV=[\"sha512\"],lIt=/^[a-z0-9+/]+(?:=?=?)$/i,cIt=/^([a-z0-9]+)-([^?]+)([?\\S*]*)$/,uIt=/^([a-z0-9]+)-([A-Za-z0-9+/=]{44,88})(\\?[\\x21-\\x7E]*)?$/,fIt=/^[\\x21-\\x7E]+$/,mb=t=>t?.length?`?${t.join(\"?\")}`:\"\",LV=class extends aIt{#t;#r;#i;constructor(e){super(),this.size=0,this.opts=e,this.#e(),e?.algorithms?this.algorithms=[...e.algorithms]:this.algorithms=[...MV],this.algorithm!==null&&!this.algorithms.includes(this.algorithm)&&this.algorithms.push(this.algorithm),this.hashes=this.algorithms.map(db.createHash)}#e(){this.sri=this.opts?.integrity?nc(this.opts?.integrity,this.opts):null,this.expectedSize=this.opts?.size,this.sri?this.sri.isHash?(this.goodSri=!0,this.algorithm=this.sri.algorithm):(this.goodSri=!this.sri.isEmpty(),this.algorithm=this.sri.pickAlgorithm(this.opts)):this.algorithm=null,this.digests=this.goodSri?this.sri[this.algorithm]:null,this.optString=mb(this.opts?.options)}on(e,r){return e===\"size\"&&this.#r?r(this.#r):e===\"integrity\"&&this.#t?r(this.#t):e===\"verified\"&&this.#i?r(this.#i):super.on(e,r)}emit(e,r){return e===\"end\"&&this.#n(),super.emit(e,r)}write(e){return this.size+=e.length,this.hashes.forEach(r=>r.update(e)),super.write(e)}#n(){this.goodSri||this.#e();let e=nc(this.hashes.map((s,a)=>`${this.algorithms[a]}-${s.digest(\"base64\")}${this.optString}`).join(\" \"),this.opts),r=this.goodSri&&e.match(this.sri,this.opts);if(typeof this.expectedSize==\"number\"&&this.size!==this.expectedSize){let s=new Error(`stream size mismatch when checking ${this.sri}.\n  Wanted: ${this.expectedSize}\n  Found: ${this.size}`);s.code=\"EBADSIZE\",s.found=this.size,s.expected=this.expectedSize,s.sri=this.sri,this.emit(\"error\",s)}else if(this.sri&&!r){let s=new Error(`${this.sri} integrity checksum failed when using ${this.algorithm}: wanted ${this.digests} but got ${e}. (${this.size} bytes)`);s.code=\"EINTEGRITY\",s.found=e,s.expected=this.digests,s.algorithm=this.algorithm,s.sri=this.sri,this.emit(\"error\",s)}else this.#r=this.size,this.emit(\"size\",this.size),this.#t=e,this.emit(\"integrity\",e),r&&(this.#i=r,this.emit(\"verified\",r))}},Ah=class{get isHash(){return!0}constructor(e,r){let s=r?.strict;this.source=e.trim(),this.digest=\"\",this.algorithm=\"\",this.options=[];let a=this.source.match(s?uIt:cIt);if(!a||s&&!OV.includes(a[1]))return;this.algorithm=a[1],this.digest=a[2];let n=a[3];n&&(this.options=n.slice(1).split(\"?\"))}hexDigest(){return this.digest&&Buffer.from(this.digest,\"base64\").toString(\"hex\")}toJSON(){return this.toString()}match(e,r){let s=nc(e,r);if(!s)return!1;if(s.isIntegrity){let a=s.pickAlgorithm(r,[this.algorithm]);if(!a)return!1;let n=s[a].find(c=>c.digest===this.digest);return n||!1}return s.digest===this.digest?s:!1}toString(e){return e?.strict&&!(OV.includes(this.algorithm)&&this.digest.match(lIt)&&this.options.every(r=>r.match(fIt)))?\"\":`${this.algorithm}-${this.digest}${mb(this.options)}`}};function USe(t,e,r,s){let a=t!==\"\",n=!1,c=\"\",f=s.length-1;for(let h=0;h<f;h++){let E=Ah.prototype.toString.call(s[h],r);E&&(n=!0,c+=E,c+=e)}let p=Ah.prototype.toString.call(s[f],r);return p&&(n=!0,c+=p),a&&n?t+e+c:t+c}var Xm=class{get isIntegrity(){return!0}toJSON(){return this.toString()}isEmpty(){return Object.keys(this).length===0}toString(e){let r=e?.sep||\" \",s=\"\";if(e?.strict){r=r.replace(/\\S+/g,\" \");for(let a of OV)this[a]&&(s=USe(s,r,e,this[a]))}else for(let a of Object.keys(this))s=USe(s,r,e,this[a]);return s}concat(e,r){let s=typeof e==\"string\"?e:gb(e,r);return nc(`${this.toString(r)} ${s}`,r)}hexDigest(){return nc(this,{single:!0}).hexDigest()}merge(e,r){let s=nc(e,r);for(let a in s)if(this[a]){if(!this[a].find(n=>s[a].find(c=>n.digest===c.digest)))throw new Error(\"hashes do not match, cannot update integrity\")}else this[a]=s[a]}match(e,r){let s=nc(e,r);if(!s)return!1;let a=s.pickAlgorithm(r,Object.keys(this));return!!a&&this[a]&&s[a]&&this[a].find(n=>s[a].find(c=>n.digest===c.digest))||!1}pickAlgorithm(e,r){let s=e?.pickAlgorithm||EIt,a=Object.keys(this).filter(n=>r?.length?r.includes(n):!0);return a.length?a.reduce((n,c)=>s(n,c)||n):null}};IA.exports.parse=nc;function nc(t,e){if(!t)return null;if(typeof t==\"string\")return NV(t,e);if(t.algorithm&&t.digest){let r=new Xm;return r[t.algorithm]=[t],NV(gb(r,e),e)}else return NV(gb(t,e),e)}function NV(t,e){if(e?.single)return new Ah(t,e);let r=t.trim().split(/\\s+/).reduce((s,a)=>{let n=new Ah(a,e);if(n.algorithm&&n.digest){let c=n.algorithm;s[c]||(s[c]=[]),s[c].push(n)}return s},new Xm);return r.isEmpty()?null:r}IA.exports.stringify=gb;function gb(t,e){return t.algorithm&&t.digest?Ah.prototype.toString.call(t,e):typeof t==\"string\"?gb(nc(t,e),e):Xm.prototype.toString.call(t,e)}IA.exports.fromHex=AIt;function AIt(t,e,r){let s=mb(r?.options);return nc(`${e}-${Buffer.from(t,\"hex\").toString(\"base64\")}${s}`,r)}IA.exports.fromData=pIt;function pIt(t,e){let r=e?.algorithms||[...MV],s=mb(e?.options);return r.reduce((a,n)=>{let c=db.createHash(n).update(t).digest(\"base64\"),f=new Ah(`${n}-${c}${s}`,e);if(f.algorithm&&f.digest){let p=f.algorithm;a[p]||(a[p]=[]),a[p].push(f)}return a},new Xm)}IA.exports.fromStream=hIt;function hIt(t,e){let r=UV(e);return new Promise((s,a)=>{t.pipe(r),t.on(\"error\",a),r.on(\"error\",a);let n;r.on(\"integrity\",c=>{n=c}),r.on(\"end\",()=>s(n)),r.resume()})}IA.exports.checkData=gIt;function gIt(t,e,r){if(e=nc(e,r),!e||!Object.keys(e).length){if(r?.error)throw Object.assign(new Error(\"No valid integrity hashes to check against\"),{code:\"EINTEGRITY\"});return!1}let s=e.pickAlgorithm(r),a=db.createHash(s).update(t).digest(\"base64\"),n=nc({algorithm:s,digest:a}),c=n.match(e,r);if(r=r||{},c||!r.error)return c;if(typeof r.size==\"number\"&&t.length!==r.size){let f=new Error(`data size mismatch when checking ${e}.\n  Wanted: ${r.size}\n  Found: ${t.length}`);throw f.code=\"EBADSIZE\",f.found=t.length,f.expected=r.size,f.sri=e,f}else{let f=new Error(`Integrity checksum failed when using ${s}: Wanted ${e}, but got ${n}. (${t.length} bytes)`);throw f.code=\"EINTEGRITY\",f.found=n,f.expected=e,f.algorithm=s,f.sri=e,f}}IA.exports.checkStream=dIt;function dIt(t,e,r){if(r=r||Object.create(null),r.integrity=e,e=nc(e,r),!e||!Object.keys(e).length)return Promise.reject(Object.assign(new Error(\"No valid integrity hashes to check against\"),{code:\"EINTEGRITY\"}));let s=UV(r);return new Promise((a,n)=>{t.pipe(s),t.on(\"error\",n),s.on(\"error\",n);let c;s.on(\"verified\",f=>{c=f}),s.on(\"end\",()=>a(c)),s.resume()})}IA.exports.integrityStream=UV;function UV(t=Object.create(null)){return new LV(t)}IA.exports.create=mIt;function mIt(t){let e=t?.algorithms||[...MV],r=mb(t?.options),s=e.map(db.createHash);return{update:function(a,n){return s.forEach(c=>c.update(a,n)),this},digest:function(){return e.reduce((n,c)=>{let f=s.shift().digest(\"base64\"),p=new Ah(`${c}-${f}${r}`,t);if(p.algorithm&&p.digest){let h=p.algorithm;n[h]||(n[h]=[]),n[h].push(p)}return n},new Xm)}}}var yIt=db.getHashes(),_Se=[\"md5\",\"whirlpool\",\"sha1\",\"sha224\",\"sha256\",\"sha384\",\"sha512\",\"sha3\",\"sha3-256\",\"sha3-384\",\"sha3-512\",\"sha3_256\",\"sha3_384\",\"sha3_512\"].filter(t=>yIt.includes(t));function EIt(t,e){return _Se.indexOf(t.toLowerCase())>=_Se.indexOf(e.toLowerCase())?t:e}});var _V=_(mg=>{\"use strict\";Object.defineProperty(mg,\"__esModule\",{value:!0});mg.Signature=mg.Envelope=void 0;mg.Envelope={fromJSON(t){return{payload:GN(t.payload)?Buffer.from(jSe(t.payload)):Buffer.alloc(0),payloadType:GN(t.payloadType)?globalThis.String(t.payloadType):\"\",signatures:globalThis.Array.isArray(t?.signatures)?t.signatures.map(e=>mg.Signature.fromJSON(e)):[]}},toJSON(t){let e={};return t.payload.length!==0&&(e.payload=GSe(t.payload)),t.payloadType!==\"\"&&(e.payloadType=t.payloadType),t.signatures?.length&&(e.signatures=t.signatures.map(r=>mg.Signature.toJSON(r))),e}};mg.Signature={fromJSON(t){return{sig:GN(t.sig)?Buffer.from(jSe(t.sig)):Buffer.alloc(0),keyid:GN(t.keyid)?globalThis.String(t.keyid):\"\"}},toJSON(t){let e={};return t.sig.length!==0&&(e.sig=GSe(t.sig)),t.keyid!==\"\"&&(e.keyid=t.keyid),e}};function jSe(t){return Uint8Array.from(globalThis.Buffer.from(t,\"base64\"))}function GSe(t){return globalThis.Buffer.from(t).toString(\"base64\")}function GN(t){return t!=null}});var WSe=_(qN=>{\"use strict\";Object.defineProperty(qN,\"__esModule\",{value:!0});qN.Timestamp=void 0;qN.Timestamp={fromJSON(t){return{seconds:qSe(t.seconds)?globalThis.String(t.seconds):\"0\",nanos:qSe(t.nanos)?globalThis.Number(t.nanos):0}},toJSON(t){let e={};return t.seconds!==\"0\"&&(e.seconds=t.seconds),t.nanos!==0&&(e.nanos=Math.round(t.nanos)),e}};function qSe(t){return t!=null}});var Ww=_(Ur=>{\"use strict\";Object.defineProperty(Ur,\"__esModule\",{value:!0});Ur.TimeRange=Ur.X509CertificateChain=Ur.SubjectAlternativeName=Ur.X509Certificate=Ur.DistinguishedName=Ur.ObjectIdentifierValuePair=Ur.ObjectIdentifier=Ur.PublicKeyIdentifier=Ur.PublicKey=Ur.RFC3161SignedTimestamp=Ur.LogId=Ur.MessageSignature=Ur.HashOutput=Ur.SubjectAlternativeNameType=Ur.PublicKeyDetails=Ur.HashAlgorithm=void 0;Ur.hashAlgorithmFromJSON=VSe;Ur.hashAlgorithmToJSON=JSe;Ur.publicKeyDetailsFromJSON=KSe;Ur.publicKeyDetailsToJSON=zSe;Ur.subjectAlternativeNameTypeFromJSON=XSe;Ur.subjectAlternativeNameTypeToJSON=ZSe;var IIt=WSe(),yl;(function(t){t[t.HASH_ALGORITHM_UNSPECIFIED=0]=\"HASH_ALGORITHM_UNSPECIFIED\",t[t.SHA2_256=1]=\"SHA2_256\",t[t.SHA2_384=2]=\"SHA2_384\",t[t.SHA2_512=3]=\"SHA2_512\",t[t.SHA3_256=4]=\"SHA3_256\",t[t.SHA3_384=5]=\"SHA3_384\"})(yl||(Ur.HashAlgorithm=yl={}));function VSe(t){switch(t){case 0:case\"HASH_ALGORITHM_UNSPECIFIED\":return yl.HASH_ALGORITHM_UNSPECIFIED;case 1:case\"SHA2_256\":return yl.SHA2_256;case 2:case\"SHA2_384\":return yl.SHA2_384;case 3:case\"SHA2_512\":return yl.SHA2_512;case 4:case\"SHA3_256\":return yl.SHA3_256;case 5:case\"SHA3_384\":return yl.SHA3_384;default:throw new globalThis.Error(\"Unrecognized enum value \"+t+\" for enum HashAlgorithm\")}}function JSe(t){switch(t){case yl.HASH_ALGORITHM_UNSPECIFIED:return\"HASH_ALGORITHM_UNSPECIFIED\";case yl.SHA2_256:return\"SHA2_256\";case yl.SHA2_384:return\"SHA2_384\";case yl.SHA2_512:return\"SHA2_512\";case yl.SHA3_256:return\"SHA3_256\";case yl.SHA3_384:return\"SHA3_384\";default:throw new globalThis.Error(\"Unrecognized enum value \"+t+\" for enum HashAlgorithm\")}}var sn;(function(t){t[t.PUBLIC_KEY_DETAILS_UNSPECIFIED=0]=\"PUBLIC_KEY_DETAILS_UNSPECIFIED\",t[t.PKCS1_RSA_PKCS1V5=1]=\"PKCS1_RSA_PKCS1V5\",t[t.PKCS1_RSA_PSS=2]=\"PKCS1_RSA_PSS\",t[t.PKIX_RSA_PKCS1V5=3]=\"PKIX_RSA_PKCS1V5\",t[t.PKIX_RSA_PSS=4]=\"PKIX_RSA_PSS\",t[t.PKIX_RSA_PKCS1V15_2048_SHA256=9]=\"PKIX_RSA_PKCS1V15_2048_SHA256\",t[t.PKIX_RSA_PKCS1V15_3072_SHA256=10]=\"PKIX_RSA_PKCS1V15_3072_SHA256\",t[t.PKIX_RSA_PKCS1V15_4096_SHA256=11]=\"PKIX_RSA_PKCS1V15_4096_SHA256\",t[t.PKIX_RSA_PSS_2048_SHA256=16]=\"PKIX_RSA_PSS_2048_SHA256\",t[t.PKIX_RSA_PSS_3072_SHA256=17]=\"PKIX_RSA_PSS_3072_SHA256\",t[t.PKIX_RSA_PSS_4096_SHA256=18]=\"PKIX_RSA_PSS_4096_SHA256\",t[t.PKIX_ECDSA_P256_HMAC_SHA_256=6]=\"PKIX_ECDSA_P256_HMAC_SHA_256\",t[t.PKIX_ECDSA_P256_SHA_256=5]=\"PKIX_ECDSA_P256_SHA_256\",t[t.PKIX_ECDSA_P384_SHA_384=12]=\"PKIX_ECDSA_P384_SHA_384\",t[t.PKIX_ECDSA_P521_SHA_512=13]=\"PKIX_ECDSA_P521_SHA_512\",t[t.PKIX_ED25519=7]=\"PKIX_ED25519\",t[t.PKIX_ED25519_PH=8]=\"PKIX_ED25519_PH\",t[t.LMS_SHA256=14]=\"LMS_SHA256\",t[t.LMOTS_SHA256=15]=\"LMOTS_SHA256\"})(sn||(Ur.PublicKeyDetails=sn={}));function KSe(t){switch(t){case 0:case\"PUBLIC_KEY_DETAILS_UNSPECIFIED\":return sn.PUBLIC_KEY_DETAILS_UNSPECIFIED;case 1:case\"PKCS1_RSA_PKCS1V5\":return sn.PKCS1_RSA_PKCS1V5;case 2:case\"PKCS1_RSA_PSS\":return sn.PKCS1_RSA_PSS;case 3:case\"PKIX_RSA_PKCS1V5\":return sn.PKIX_RSA_PKCS1V5;case 4:case\"PKIX_RSA_PSS\":return sn.PKIX_RSA_PSS;case 9:case\"PKIX_RSA_PKCS1V15_2048_SHA256\":return sn.PKIX_RSA_PKCS1V15_2048_SHA256;case 10:case\"PKIX_RSA_PKCS1V15_3072_SHA256\":return sn.PKIX_RSA_PKCS1V15_3072_SHA256;case 11:case\"PKIX_RSA_PKCS1V15_4096_SHA256\":return sn.PKIX_RSA_PKCS1V15_4096_SHA256;case 16:case\"PKIX_RSA_PSS_2048_SHA256\":return sn.PKIX_RSA_PSS_2048_SHA256;case 17:case\"PKIX_RSA_PSS_3072_SHA256\":return sn.PKIX_RSA_PSS_3072_SHA256;case 18:case\"PKIX_RSA_PSS_4096_SHA256\":return sn.PKIX_RSA_PSS_4096_SHA256;case 6:case\"PKIX_ECDSA_P256_HMAC_SHA_256\":return sn.PKIX_ECDSA_P256_HMAC_SHA_256;case 5:case\"PKIX_ECDSA_P256_SHA_256\":return sn.PKIX_ECDSA_P256_SHA_256;case 12:case\"PKIX_ECDSA_P384_SHA_384\":return sn.PKIX_ECDSA_P384_SHA_384;case 13:case\"PKIX_ECDSA_P521_SHA_512\":return sn.PKIX_ECDSA_P521_SHA_512;case 7:case\"PKIX_ED25519\":return sn.PKIX_ED25519;case 8:case\"PKIX_ED25519_PH\":return sn.PKIX_ED25519_PH;case 14:case\"LMS_SHA256\":return sn.LMS_SHA256;case 15:case\"LMOTS_SHA256\":return sn.LMOTS_SHA256;default:throw new globalThis.Error(\"Unrecognized enum value \"+t+\" for enum PublicKeyDetails\")}}function zSe(t){switch(t){case sn.PUBLIC_KEY_DETAILS_UNSPECIFIED:return\"PUBLIC_KEY_DETAILS_UNSPECIFIED\";case sn.PKCS1_RSA_PKCS1V5:return\"PKCS1_RSA_PKCS1V5\";case sn.PKCS1_RSA_PSS:return\"PKCS1_RSA_PSS\";case sn.PKIX_RSA_PKCS1V5:return\"PKIX_RSA_PKCS1V5\";case sn.PKIX_RSA_PSS:return\"PKIX_RSA_PSS\";case sn.PKIX_RSA_PKCS1V15_2048_SHA256:return\"PKIX_RSA_PKCS1V15_2048_SHA256\";case sn.PKIX_RSA_PKCS1V15_3072_SHA256:return\"PKIX_RSA_PKCS1V15_3072_SHA256\";case sn.PKIX_RSA_PKCS1V15_4096_SHA256:return\"PKIX_RSA_PKCS1V15_4096_SHA256\";case sn.PKIX_RSA_PSS_2048_SHA256:return\"PKIX_RSA_PSS_2048_SHA256\";case sn.PKIX_RSA_PSS_3072_SHA256:return\"PKIX_RSA_PSS_3072_SHA256\";case sn.PKIX_RSA_PSS_4096_SHA256:return\"PKIX_RSA_PSS_4096_SHA256\";case sn.PKIX_ECDSA_P256_HMAC_SHA_256:return\"PKIX_ECDSA_P256_HMAC_SHA_256\";case sn.PKIX_ECDSA_P256_SHA_256:return\"PKIX_ECDSA_P256_SHA_256\";case sn.PKIX_ECDSA_P384_SHA_384:return\"PKIX_ECDSA_P384_SHA_384\";case sn.PKIX_ECDSA_P521_SHA_512:return\"PKIX_ECDSA_P521_SHA_512\";case sn.PKIX_ED25519:return\"PKIX_ED25519\";case sn.PKIX_ED25519_PH:return\"PKIX_ED25519_PH\";case sn.LMS_SHA256:return\"LMS_SHA256\";case sn.LMOTS_SHA256:return\"LMOTS_SHA256\";default:throw new globalThis.Error(\"Unrecognized enum value \"+t+\" for enum PublicKeyDetails\")}}var CA;(function(t){t[t.SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED=0]=\"SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED\",t[t.EMAIL=1]=\"EMAIL\",t[t.URI=2]=\"URI\",t[t.OTHER_NAME=3]=\"OTHER_NAME\"})(CA||(Ur.SubjectAlternativeNameType=CA={}));function XSe(t){switch(t){case 0:case\"SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED\":return CA.SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED;case 1:case\"EMAIL\":return CA.EMAIL;case 2:case\"URI\":return CA.URI;case 3:case\"OTHER_NAME\":return CA.OTHER_NAME;default:throw new globalThis.Error(\"Unrecognized enum value \"+t+\" for enum SubjectAlternativeNameType\")}}function ZSe(t){switch(t){case CA.SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED:return\"SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED\";case CA.EMAIL:return\"EMAIL\";case CA.URI:return\"URI\";case CA.OTHER_NAME:return\"OTHER_NAME\";default:throw new globalThis.Error(\"Unrecognized enum value \"+t+\" for enum SubjectAlternativeNameType\")}}Ur.HashOutput={fromJSON(t){return{algorithm:ds(t.algorithm)?VSe(t.algorithm):0,digest:ds(t.digest)?Buffer.from(Zm(t.digest)):Buffer.alloc(0)}},toJSON(t){let e={};return t.algorithm!==0&&(e.algorithm=JSe(t.algorithm)),t.digest.length!==0&&(e.digest=$m(t.digest)),e}};Ur.MessageSignature={fromJSON(t){return{messageDigest:ds(t.messageDigest)?Ur.HashOutput.fromJSON(t.messageDigest):void 0,signature:ds(t.signature)?Buffer.from(Zm(t.signature)):Buffer.alloc(0)}},toJSON(t){let e={};return t.messageDigest!==void 0&&(e.messageDigest=Ur.HashOutput.toJSON(t.messageDigest)),t.signature.length!==0&&(e.signature=$m(t.signature)),e}};Ur.LogId={fromJSON(t){return{keyId:ds(t.keyId)?Buffer.from(Zm(t.keyId)):Buffer.alloc(0)}},toJSON(t){let e={};return t.keyId.length!==0&&(e.keyId=$m(t.keyId)),e}};Ur.RFC3161SignedTimestamp={fromJSON(t){return{signedTimestamp:ds(t.signedTimestamp)?Buffer.from(Zm(t.signedTimestamp)):Buffer.alloc(0)}},toJSON(t){let e={};return t.signedTimestamp.length!==0&&(e.signedTimestamp=$m(t.signedTimestamp)),e}};Ur.PublicKey={fromJSON(t){return{rawBytes:ds(t.rawBytes)?Buffer.from(Zm(t.rawBytes)):void 0,keyDetails:ds(t.keyDetails)?KSe(t.keyDetails):0,validFor:ds(t.validFor)?Ur.TimeRange.fromJSON(t.validFor):void 0}},toJSON(t){let e={};return t.rawBytes!==void 0&&(e.rawBytes=$m(t.rawBytes)),t.keyDetails!==0&&(e.keyDetails=zSe(t.keyDetails)),t.validFor!==void 0&&(e.validFor=Ur.TimeRange.toJSON(t.validFor)),e}};Ur.PublicKeyIdentifier={fromJSON(t){return{hint:ds(t.hint)?globalThis.String(t.hint):\"\"}},toJSON(t){let e={};return t.hint!==\"\"&&(e.hint=t.hint),e}};Ur.ObjectIdentifier={fromJSON(t){return{id:globalThis.Array.isArray(t?.id)?t.id.map(e=>globalThis.Number(e)):[]}},toJSON(t){let e={};return t.id?.length&&(e.id=t.id.map(r=>Math.round(r))),e}};Ur.ObjectIdentifierValuePair={fromJSON(t){return{oid:ds(t.oid)?Ur.ObjectIdentifier.fromJSON(t.oid):void 0,value:ds(t.value)?Buffer.from(Zm(t.value)):Buffer.alloc(0)}},toJSON(t){let e={};return t.oid!==void 0&&(e.oid=Ur.ObjectIdentifier.toJSON(t.oid)),t.value.length!==0&&(e.value=$m(t.value)),e}};Ur.DistinguishedName={fromJSON(t){return{organization:ds(t.organization)?globalThis.String(t.organization):\"\",commonName:ds(t.commonName)?globalThis.String(t.commonName):\"\"}},toJSON(t){let e={};return t.organization!==\"\"&&(e.organization=t.organization),t.commonName!==\"\"&&(e.commonName=t.commonName),e}};Ur.X509Certificate={fromJSON(t){return{rawBytes:ds(t.rawBytes)?Buffer.from(Zm(t.rawBytes)):Buffer.alloc(0)}},toJSON(t){let e={};return t.rawBytes.length!==0&&(e.rawBytes=$m(t.rawBytes)),e}};Ur.SubjectAlternativeName={fromJSON(t){return{type:ds(t.type)?XSe(t.type):0,identity:ds(t.regexp)?{$case:\"regexp\",regexp:globalThis.String(t.regexp)}:ds(t.value)?{$case:\"value\",value:globalThis.String(t.value)}:void 0}},toJSON(t){let e={};return t.type!==0&&(e.type=ZSe(t.type)),t.identity?.$case===\"regexp\"?e.regexp=t.identity.regexp:t.identity?.$case===\"value\"&&(e.value=t.identity.value),e}};Ur.X509CertificateChain={fromJSON(t){return{certificates:globalThis.Array.isArray(t?.certificates)?t.certificates.map(e=>Ur.X509Certificate.fromJSON(e)):[]}},toJSON(t){let e={};return t.certificates?.length&&(e.certificates=t.certificates.map(r=>Ur.X509Certificate.toJSON(r))),e}};Ur.TimeRange={fromJSON(t){return{start:ds(t.start)?YSe(t.start):void 0,end:ds(t.end)?YSe(t.end):void 0}},toJSON(t){let e={};return t.start!==void 0&&(e.start=t.start.toISOString()),t.end!==void 0&&(e.end=t.end.toISOString()),e}};function Zm(t){return Uint8Array.from(globalThis.Buffer.from(t,\"base64\"))}function $m(t){return globalThis.Buffer.from(t).toString(\"base64\")}function CIt(t){let e=(globalThis.Number(t.seconds)||0)*1e3;return e+=(t.nanos||0)/1e6,new globalThis.Date(e)}function YSe(t){return t instanceof globalThis.Date?t:typeof t==\"string\"?new globalThis.Date(t):CIt(IIt.Timestamp.fromJSON(t))}function ds(t){return t!=null}});var HV=_(ms=>{\"use strict\";Object.defineProperty(ms,\"__esModule\",{value:!0});ms.TransparencyLogEntry=ms.InclusionPromise=ms.InclusionProof=ms.Checkpoint=ms.KindVersion=void 0;var $Se=Ww();ms.KindVersion={fromJSON(t){return{kind:Ra(t.kind)?globalThis.String(t.kind):\"\",version:Ra(t.version)?globalThis.String(t.version):\"\"}},toJSON(t){let e={};return t.kind!==\"\"&&(e.kind=t.kind),t.version!==\"\"&&(e.version=t.version),e}};ms.Checkpoint={fromJSON(t){return{envelope:Ra(t.envelope)?globalThis.String(t.envelope):\"\"}},toJSON(t){let e={};return t.envelope!==\"\"&&(e.envelope=t.envelope),e}};ms.InclusionProof={fromJSON(t){return{logIndex:Ra(t.logIndex)?globalThis.String(t.logIndex):\"0\",rootHash:Ra(t.rootHash)?Buffer.from(WN(t.rootHash)):Buffer.alloc(0),treeSize:Ra(t.treeSize)?globalThis.String(t.treeSize):\"0\",hashes:globalThis.Array.isArray(t?.hashes)?t.hashes.map(e=>Buffer.from(WN(e))):[],checkpoint:Ra(t.checkpoint)?ms.Checkpoint.fromJSON(t.checkpoint):void 0}},toJSON(t){let e={};return t.logIndex!==\"0\"&&(e.logIndex=t.logIndex),t.rootHash.length!==0&&(e.rootHash=YN(t.rootHash)),t.treeSize!==\"0\"&&(e.treeSize=t.treeSize),t.hashes?.length&&(e.hashes=t.hashes.map(r=>YN(r))),t.checkpoint!==void 0&&(e.checkpoint=ms.Checkpoint.toJSON(t.checkpoint)),e}};ms.InclusionPromise={fromJSON(t){return{signedEntryTimestamp:Ra(t.signedEntryTimestamp)?Buffer.from(WN(t.signedEntryTimestamp)):Buffer.alloc(0)}},toJSON(t){let e={};return t.signedEntryTimestamp.length!==0&&(e.signedEntryTimestamp=YN(t.signedEntryTimestamp)),e}};ms.TransparencyLogEntry={fromJSON(t){return{logIndex:Ra(t.logIndex)?globalThis.String(t.logIndex):\"0\",logId:Ra(t.logId)?$Se.LogId.fromJSON(t.logId):void 0,kindVersion:Ra(t.kindVersion)?ms.KindVersion.fromJSON(t.kindVersion):void 0,integratedTime:Ra(t.integratedTime)?globalThis.String(t.integratedTime):\"0\",inclusionPromise:Ra(t.inclusionPromise)?ms.InclusionPromise.fromJSON(t.inclusionPromise):void 0,inclusionProof:Ra(t.inclusionProof)?ms.InclusionProof.fromJSON(t.inclusionProof):void 0,canonicalizedBody:Ra(t.canonicalizedBody)?Buffer.from(WN(t.canonicalizedBody)):Buffer.alloc(0)}},toJSON(t){let e={};return t.logIndex!==\"0\"&&(e.logIndex=t.logIndex),t.logId!==void 0&&(e.logId=$Se.LogId.toJSON(t.logId)),t.kindVersion!==void 0&&(e.kindVersion=ms.KindVersion.toJSON(t.kindVersion)),t.integratedTime!==\"0\"&&(e.integratedTime=t.integratedTime),t.inclusionPromise!==void 0&&(e.inclusionPromise=ms.InclusionPromise.toJSON(t.inclusionPromise)),t.inclusionProof!==void 0&&(e.inclusionProof=ms.InclusionProof.toJSON(t.inclusionProof)),t.canonicalizedBody.length!==0&&(e.canonicalizedBody=YN(t.canonicalizedBody)),e}};function WN(t){return Uint8Array.from(globalThis.Buffer.from(t,\"base64\"))}function YN(t){return globalThis.Buffer.from(t).toString(\"base64\")}function Ra(t){return t!=null}});var jV=_(Xc=>{\"use strict\";Object.defineProperty(Xc,\"__esModule\",{value:!0});Xc.Bundle=Xc.VerificationMaterial=Xc.TimestampVerificationData=void 0;var eDe=_V(),wA=Ww(),tDe=HV();Xc.TimestampVerificationData={fromJSON(t){return{rfc3161Timestamps:globalThis.Array.isArray(t?.rfc3161Timestamps)?t.rfc3161Timestamps.map(e=>wA.RFC3161SignedTimestamp.fromJSON(e)):[]}},toJSON(t){let e={};return t.rfc3161Timestamps?.length&&(e.rfc3161Timestamps=t.rfc3161Timestamps.map(r=>wA.RFC3161SignedTimestamp.toJSON(r))),e}};Xc.VerificationMaterial={fromJSON(t){return{content:yg(t.publicKey)?{$case:\"publicKey\",publicKey:wA.PublicKeyIdentifier.fromJSON(t.publicKey)}:yg(t.x509CertificateChain)?{$case:\"x509CertificateChain\",x509CertificateChain:wA.X509CertificateChain.fromJSON(t.x509CertificateChain)}:yg(t.certificate)?{$case:\"certificate\",certificate:wA.X509Certificate.fromJSON(t.certificate)}:void 0,tlogEntries:globalThis.Array.isArray(t?.tlogEntries)?t.tlogEntries.map(e=>tDe.TransparencyLogEntry.fromJSON(e)):[],timestampVerificationData:yg(t.timestampVerificationData)?Xc.TimestampVerificationData.fromJSON(t.timestampVerificationData):void 0}},toJSON(t){let e={};return t.content?.$case===\"publicKey\"?e.publicKey=wA.PublicKeyIdentifier.toJSON(t.content.publicKey):t.content?.$case===\"x509CertificateChain\"?e.x509CertificateChain=wA.X509CertificateChain.toJSON(t.content.x509CertificateChain):t.content?.$case===\"certificate\"&&(e.certificate=wA.X509Certificate.toJSON(t.content.certificate)),t.tlogEntries?.length&&(e.tlogEntries=t.tlogEntries.map(r=>tDe.TransparencyLogEntry.toJSON(r))),t.timestampVerificationData!==void 0&&(e.timestampVerificationData=Xc.TimestampVerificationData.toJSON(t.timestampVerificationData)),e}};Xc.Bundle={fromJSON(t){return{mediaType:yg(t.mediaType)?globalThis.String(t.mediaType):\"\",verificationMaterial:yg(t.verificationMaterial)?Xc.VerificationMaterial.fromJSON(t.verificationMaterial):void 0,content:yg(t.messageSignature)?{$case:\"messageSignature\",messageSignature:wA.MessageSignature.fromJSON(t.messageSignature)}:yg(t.dsseEnvelope)?{$case:\"dsseEnvelope\",dsseEnvelope:eDe.Envelope.fromJSON(t.dsseEnvelope)}:void 0}},toJSON(t){let e={};return t.mediaType!==\"\"&&(e.mediaType=t.mediaType),t.verificationMaterial!==void 0&&(e.verificationMaterial=Xc.VerificationMaterial.toJSON(t.verificationMaterial)),t.content?.$case===\"messageSignature\"?e.messageSignature=wA.MessageSignature.toJSON(t.content.messageSignature):t.content?.$case===\"dsseEnvelope\"&&(e.dsseEnvelope=eDe.Envelope.toJSON(t.content.dsseEnvelope)),e}};function yg(t){return t!=null}});var GV=_(Ri=>{\"use strict\";Object.defineProperty(Ri,\"__esModule\",{value:!0});Ri.ClientTrustConfig=Ri.SigningConfig=Ri.TrustedRoot=Ri.CertificateAuthority=Ri.TransparencyLogInstance=void 0;var El=Ww();Ri.TransparencyLogInstance={fromJSON(t){return{baseUrl:ia(t.baseUrl)?globalThis.String(t.baseUrl):\"\",hashAlgorithm:ia(t.hashAlgorithm)?(0,El.hashAlgorithmFromJSON)(t.hashAlgorithm):0,publicKey:ia(t.publicKey)?El.PublicKey.fromJSON(t.publicKey):void 0,logId:ia(t.logId)?El.LogId.fromJSON(t.logId):void 0,checkpointKeyId:ia(t.checkpointKeyId)?El.LogId.fromJSON(t.checkpointKeyId):void 0}},toJSON(t){let e={};return t.baseUrl!==\"\"&&(e.baseUrl=t.baseUrl),t.hashAlgorithm!==0&&(e.hashAlgorithm=(0,El.hashAlgorithmToJSON)(t.hashAlgorithm)),t.publicKey!==void 0&&(e.publicKey=El.PublicKey.toJSON(t.publicKey)),t.logId!==void 0&&(e.logId=El.LogId.toJSON(t.logId)),t.checkpointKeyId!==void 0&&(e.checkpointKeyId=El.LogId.toJSON(t.checkpointKeyId)),e}};Ri.CertificateAuthority={fromJSON(t){return{subject:ia(t.subject)?El.DistinguishedName.fromJSON(t.subject):void 0,uri:ia(t.uri)?globalThis.String(t.uri):\"\",certChain:ia(t.certChain)?El.X509CertificateChain.fromJSON(t.certChain):void 0,validFor:ia(t.validFor)?El.TimeRange.fromJSON(t.validFor):void 0}},toJSON(t){let e={};return t.subject!==void 0&&(e.subject=El.DistinguishedName.toJSON(t.subject)),t.uri!==\"\"&&(e.uri=t.uri),t.certChain!==void 0&&(e.certChain=El.X509CertificateChain.toJSON(t.certChain)),t.validFor!==void 0&&(e.validFor=El.TimeRange.toJSON(t.validFor)),e}};Ri.TrustedRoot={fromJSON(t){return{mediaType:ia(t.mediaType)?globalThis.String(t.mediaType):\"\",tlogs:globalThis.Array.isArray(t?.tlogs)?t.tlogs.map(e=>Ri.TransparencyLogInstance.fromJSON(e)):[],certificateAuthorities:globalThis.Array.isArray(t?.certificateAuthorities)?t.certificateAuthorities.map(e=>Ri.CertificateAuthority.fromJSON(e)):[],ctlogs:globalThis.Array.isArray(t?.ctlogs)?t.ctlogs.map(e=>Ri.TransparencyLogInstance.fromJSON(e)):[],timestampAuthorities:globalThis.Array.isArray(t?.timestampAuthorities)?t.timestampAuthorities.map(e=>Ri.CertificateAuthority.fromJSON(e)):[]}},toJSON(t){let e={};return t.mediaType!==\"\"&&(e.mediaType=t.mediaType),t.tlogs?.length&&(e.tlogs=t.tlogs.map(r=>Ri.TransparencyLogInstance.toJSON(r))),t.certificateAuthorities?.length&&(e.certificateAuthorities=t.certificateAuthorities.map(r=>Ri.CertificateAuthority.toJSON(r))),t.ctlogs?.length&&(e.ctlogs=t.ctlogs.map(r=>Ri.TransparencyLogInstance.toJSON(r))),t.timestampAuthorities?.length&&(e.timestampAuthorities=t.timestampAuthorities.map(r=>Ri.CertificateAuthority.toJSON(r))),e}};Ri.SigningConfig={fromJSON(t){return{mediaType:ia(t.mediaType)?globalThis.String(t.mediaType):\"\",caUrl:ia(t.caUrl)?globalThis.String(t.caUrl):\"\",oidcUrl:ia(t.oidcUrl)?globalThis.String(t.oidcUrl):\"\",tlogUrls:globalThis.Array.isArray(t?.tlogUrls)?t.tlogUrls.map(e=>globalThis.String(e)):[],tsaUrls:globalThis.Array.isArray(t?.tsaUrls)?t.tsaUrls.map(e=>globalThis.String(e)):[]}},toJSON(t){let e={};return t.mediaType!==\"\"&&(e.mediaType=t.mediaType),t.caUrl!==\"\"&&(e.caUrl=t.caUrl),t.oidcUrl!==\"\"&&(e.oidcUrl=t.oidcUrl),t.tlogUrls?.length&&(e.tlogUrls=t.tlogUrls),t.tsaUrls?.length&&(e.tsaUrls=t.tsaUrls),e}};Ri.ClientTrustConfig={fromJSON(t){return{mediaType:ia(t.mediaType)?globalThis.String(t.mediaType):\"\",trustedRoot:ia(t.trustedRoot)?Ri.TrustedRoot.fromJSON(t.trustedRoot):void 0,signingConfig:ia(t.signingConfig)?Ri.SigningConfig.fromJSON(t.signingConfig):void 0}},toJSON(t){let e={};return t.mediaType!==\"\"&&(e.mediaType=t.mediaType),t.trustedRoot!==void 0&&(e.trustedRoot=Ri.TrustedRoot.toJSON(t.trustedRoot)),t.signingConfig!==void 0&&(e.signingConfig=Ri.SigningConfig.toJSON(t.signingConfig)),e}};function ia(t){return t!=null}});var iDe=_(Vr=>{\"use strict\";Object.defineProperty(Vr,\"__esModule\",{value:!0});Vr.Input=Vr.Artifact=Vr.ArtifactVerificationOptions_ObserverTimestampOptions=Vr.ArtifactVerificationOptions_TlogIntegratedTimestampOptions=Vr.ArtifactVerificationOptions_TimestampAuthorityOptions=Vr.ArtifactVerificationOptions_CtlogOptions=Vr.ArtifactVerificationOptions_TlogOptions=Vr.ArtifactVerificationOptions=Vr.PublicKeyIdentities=Vr.CertificateIdentities=Vr.CertificateIdentity=void 0;var rDe=jV(),Eg=Ww(),nDe=GV();Vr.CertificateIdentity={fromJSON(t){return{issuer:gi(t.issuer)?globalThis.String(t.issuer):\"\",san:gi(t.san)?Eg.SubjectAlternativeName.fromJSON(t.san):void 0,oids:globalThis.Array.isArray(t?.oids)?t.oids.map(e=>Eg.ObjectIdentifierValuePair.fromJSON(e)):[]}},toJSON(t){let e={};return t.issuer!==\"\"&&(e.issuer=t.issuer),t.san!==void 0&&(e.san=Eg.SubjectAlternativeName.toJSON(t.san)),t.oids?.length&&(e.oids=t.oids.map(r=>Eg.ObjectIdentifierValuePair.toJSON(r))),e}};Vr.CertificateIdentities={fromJSON(t){return{identities:globalThis.Array.isArray(t?.identities)?t.identities.map(e=>Vr.CertificateIdentity.fromJSON(e)):[]}},toJSON(t){let e={};return t.identities?.length&&(e.identities=t.identities.map(r=>Vr.CertificateIdentity.toJSON(r))),e}};Vr.PublicKeyIdentities={fromJSON(t){return{publicKeys:globalThis.Array.isArray(t?.publicKeys)?t.publicKeys.map(e=>Eg.PublicKey.fromJSON(e)):[]}},toJSON(t){let e={};return t.publicKeys?.length&&(e.publicKeys=t.publicKeys.map(r=>Eg.PublicKey.toJSON(r))),e}};Vr.ArtifactVerificationOptions={fromJSON(t){return{signers:gi(t.certificateIdentities)?{$case:\"certificateIdentities\",certificateIdentities:Vr.CertificateIdentities.fromJSON(t.certificateIdentities)}:gi(t.publicKeys)?{$case:\"publicKeys\",publicKeys:Vr.PublicKeyIdentities.fromJSON(t.publicKeys)}:void 0,tlogOptions:gi(t.tlogOptions)?Vr.ArtifactVerificationOptions_TlogOptions.fromJSON(t.tlogOptions):void 0,ctlogOptions:gi(t.ctlogOptions)?Vr.ArtifactVerificationOptions_CtlogOptions.fromJSON(t.ctlogOptions):void 0,tsaOptions:gi(t.tsaOptions)?Vr.ArtifactVerificationOptions_TimestampAuthorityOptions.fromJSON(t.tsaOptions):void 0,integratedTsOptions:gi(t.integratedTsOptions)?Vr.ArtifactVerificationOptions_TlogIntegratedTimestampOptions.fromJSON(t.integratedTsOptions):void 0,observerOptions:gi(t.observerOptions)?Vr.ArtifactVerificationOptions_ObserverTimestampOptions.fromJSON(t.observerOptions):void 0}},toJSON(t){let e={};return t.signers?.$case===\"certificateIdentities\"?e.certificateIdentities=Vr.CertificateIdentities.toJSON(t.signers.certificateIdentities):t.signers?.$case===\"publicKeys\"&&(e.publicKeys=Vr.PublicKeyIdentities.toJSON(t.signers.publicKeys)),t.tlogOptions!==void 0&&(e.tlogOptions=Vr.ArtifactVerificationOptions_TlogOptions.toJSON(t.tlogOptions)),t.ctlogOptions!==void 0&&(e.ctlogOptions=Vr.ArtifactVerificationOptions_CtlogOptions.toJSON(t.ctlogOptions)),t.tsaOptions!==void 0&&(e.tsaOptions=Vr.ArtifactVerificationOptions_TimestampAuthorityOptions.toJSON(t.tsaOptions)),t.integratedTsOptions!==void 0&&(e.integratedTsOptions=Vr.ArtifactVerificationOptions_TlogIntegratedTimestampOptions.toJSON(t.integratedTsOptions)),t.observerOptions!==void 0&&(e.observerOptions=Vr.ArtifactVerificationOptions_ObserverTimestampOptions.toJSON(t.observerOptions)),e}};Vr.ArtifactVerificationOptions_TlogOptions={fromJSON(t){return{threshold:gi(t.threshold)?globalThis.Number(t.threshold):0,performOnlineVerification:gi(t.performOnlineVerification)?globalThis.Boolean(t.performOnlineVerification):!1,disable:gi(t.disable)?globalThis.Boolean(t.disable):!1}},toJSON(t){let e={};return t.threshold!==0&&(e.threshold=Math.round(t.threshold)),t.performOnlineVerification!==!1&&(e.performOnlineVerification=t.performOnlineVerification),t.disable!==!1&&(e.disable=t.disable),e}};Vr.ArtifactVerificationOptions_CtlogOptions={fromJSON(t){return{threshold:gi(t.threshold)?globalThis.Number(t.threshold):0,disable:gi(t.disable)?globalThis.Boolean(t.disable):!1}},toJSON(t){let e={};return t.threshold!==0&&(e.threshold=Math.round(t.threshold)),t.disable!==!1&&(e.disable=t.disable),e}};Vr.ArtifactVerificationOptions_TimestampAuthorityOptions={fromJSON(t){return{threshold:gi(t.threshold)?globalThis.Number(t.threshold):0,disable:gi(t.disable)?globalThis.Boolean(t.disable):!1}},toJSON(t){let e={};return t.threshold!==0&&(e.threshold=Math.round(t.threshold)),t.disable!==!1&&(e.disable=t.disable),e}};Vr.ArtifactVerificationOptions_TlogIntegratedTimestampOptions={fromJSON(t){return{threshold:gi(t.threshold)?globalThis.Number(t.threshold):0,disable:gi(t.disable)?globalThis.Boolean(t.disable):!1}},toJSON(t){let e={};return t.threshold!==0&&(e.threshold=Math.round(t.threshold)),t.disable!==!1&&(e.disable=t.disable),e}};Vr.ArtifactVerificationOptions_ObserverTimestampOptions={fromJSON(t){return{threshold:gi(t.threshold)?globalThis.Number(t.threshold):0,disable:gi(t.disable)?globalThis.Boolean(t.disable):!1}},toJSON(t){let e={};return t.threshold!==0&&(e.threshold=Math.round(t.threshold)),t.disable!==!1&&(e.disable=t.disable),e}};Vr.Artifact={fromJSON(t){return{data:gi(t.artifactUri)?{$case:\"artifactUri\",artifactUri:globalThis.String(t.artifactUri)}:gi(t.artifact)?{$case:\"artifact\",artifact:Buffer.from(wIt(t.artifact))}:gi(t.artifactDigest)?{$case:\"artifactDigest\",artifactDigest:Eg.HashOutput.fromJSON(t.artifactDigest)}:void 0}},toJSON(t){let e={};return t.data?.$case===\"artifactUri\"?e.artifactUri=t.data.artifactUri:t.data?.$case===\"artifact\"?e.artifact=BIt(t.data.artifact):t.data?.$case===\"artifactDigest\"&&(e.artifactDigest=Eg.HashOutput.toJSON(t.data.artifactDigest)),e}};Vr.Input={fromJSON(t){return{artifactTrustRoot:gi(t.artifactTrustRoot)?nDe.TrustedRoot.fromJSON(t.artifactTrustRoot):void 0,artifactVerificationOptions:gi(t.artifactVerificationOptions)?Vr.ArtifactVerificationOptions.fromJSON(t.artifactVerificationOptions):void 0,bundle:gi(t.bundle)?rDe.Bundle.fromJSON(t.bundle):void 0,artifact:gi(t.artifact)?Vr.Artifact.fromJSON(t.artifact):void 0}},toJSON(t){let e={};return t.artifactTrustRoot!==void 0&&(e.artifactTrustRoot=nDe.TrustedRoot.toJSON(t.artifactTrustRoot)),t.artifactVerificationOptions!==void 0&&(e.artifactVerificationOptions=Vr.ArtifactVerificationOptions.toJSON(t.artifactVerificationOptions)),t.bundle!==void 0&&(e.bundle=rDe.Bundle.toJSON(t.bundle)),t.artifact!==void 0&&(e.artifact=Vr.Artifact.toJSON(t.artifact)),e}};function wIt(t){return Uint8Array.from(globalThis.Buffer.from(t,\"base64\"))}function BIt(t){return globalThis.Buffer.from(t).toString(\"base64\")}function gi(t){return t!=null}});var yb=_(Zc=>{\"use strict\";var vIt=Zc&&Zc.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||(\"get\"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),Yw=Zc&&Zc.__exportStar||function(t,e){for(var r in t)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,r)&&vIt(e,t,r)};Object.defineProperty(Zc,\"__esModule\",{value:!0});Yw(_V(),Zc);Yw(jV(),Zc);Yw(Ww(),Zc);Yw(HV(),Zc);Yw(GV(),Zc);Yw(iDe(),Zc)});var VN=_(Il=>{\"use strict\";Object.defineProperty(Il,\"__esModule\",{value:!0});Il.BUNDLE_V03_MEDIA_TYPE=Il.BUNDLE_V03_LEGACY_MEDIA_TYPE=Il.BUNDLE_V02_MEDIA_TYPE=Il.BUNDLE_V01_MEDIA_TYPE=void 0;Il.isBundleWithCertificateChain=SIt;Il.isBundleWithPublicKey=DIt;Il.isBundleWithMessageSignature=bIt;Il.isBundleWithDsseEnvelope=PIt;Il.BUNDLE_V01_MEDIA_TYPE=\"application/vnd.dev.sigstore.bundle+json;version=0.1\";Il.BUNDLE_V02_MEDIA_TYPE=\"application/vnd.dev.sigstore.bundle+json;version=0.2\";Il.BUNDLE_V03_LEGACY_MEDIA_TYPE=\"application/vnd.dev.sigstore.bundle+json;version=0.3\";Il.BUNDLE_V03_MEDIA_TYPE=\"application/vnd.dev.sigstore.bundle.v0.3+json\";function SIt(t){return t.verificationMaterial.content.$case===\"x509CertificateChain\"}function DIt(t){return t.verificationMaterial.content.$case===\"publicKey\"}function bIt(t){return t.content.$case===\"messageSignature\"}function PIt(t){return t.content.$case===\"dsseEnvelope\"}});var oDe=_(KN=>{\"use strict\";Object.defineProperty(KN,\"__esModule\",{value:!0});KN.toMessageSignatureBundle=kIt;KN.toDSSEBundle=QIt;var xIt=yb(),JN=VN();function kIt(t){return{mediaType:t.certificateChain?JN.BUNDLE_V02_MEDIA_TYPE:JN.BUNDLE_V03_MEDIA_TYPE,content:{$case:\"messageSignature\",messageSignature:{messageDigest:{algorithm:xIt.HashAlgorithm.SHA2_256,digest:t.digest},signature:t.signature}},verificationMaterial:sDe(t)}}function QIt(t){return{mediaType:t.certificateChain?JN.BUNDLE_V02_MEDIA_TYPE:JN.BUNDLE_V03_MEDIA_TYPE,content:{$case:\"dsseEnvelope\",dsseEnvelope:TIt(t)},verificationMaterial:sDe(t)}}function TIt(t){return{payloadType:t.artifactType,payload:t.artifact,signatures:[RIt(t)]}}function RIt(t){return{keyid:t.keyHint||\"\",sig:t.signature}}function sDe(t){return{content:FIt(t),tlogEntries:[],timestampVerificationData:{rfc3161Timestamps:[]}}}function FIt(t){return t.certificate?t.certificateChain?{$case:\"x509CertificateChain\",x509CertificateChain:{certificates:[{rawBytes:t.certificate}]}}:{$case:\"certificate\",certificate:{rawBytes:t.certificate}}:{$case:\"publicKey\",publicKey:{hint:t.keyHint||\"\"}}}});var WV=_(zN=>{\"use strict\";Object.defineProperty(zN,\"__esModule\",{value:!0});zN.ValidationError=void 0;var qV=class extends Error{constructor(e,r){super(e),this.fields=r}};zN.ValidationError=qV});var YV=_(ey=>{\"use strict\";Object.defineProperty(ey,\"__esModule\",{value:!0});ey.assertBundle=NIt;ey.assertBundleV01=aDe;ey.isBundleV01=OIt;ey.assertBundleV02=LIt;ey.assertBundleLatest=MIt;var XN=WV();function NIt(t){let e=ZN(t);if(e.length>0)throw new XN.ValidationError(\"invalid bundle\",e)}function aDe(t){let e=[];if(e.push(...ZN(t)),e.push(...UIt(t)),e.length>0)throw new XN.ValidationError(\"invalid v0.1 bundle\",e)}function OIt(t){try{return aDe(t),!0}catch{return!1}}function LIt(t){let e=[];if(e.push(...ZN(t)),e.push(...lDe(t)),e.length>0)throw new XN.ValidationError(\"invalid v0.2 bundle\",e)}function MIt(t){let e=[];if(e.push(...ZN(t)),e.push(...lDe(t)),e.push(..._It(t)),e.length>0)throw new XN.ValidationError(\"invalid bundle\",e)}function ZN(t){let e=[];if((t.mediaType===void 0||!t.mediaType.match(/^application\\/vnd\\.dev\\.sigstore\\.bundle\\+json;version=\\d\\.\\d/)&&!t.mediaType.match(/^application\\/vnd\\.dev\\.sigstore\\.bundle\\.v\\d\\.\\d\\+json/))&&e.push(\"mediaType\"),t.content===void 0)e.push(\"content\");else switch(t.content.$case){case\"messageSignature\":t.content.messageSignature.messageDigest===void 0?e.push(\"content.messageSignature.messageDigest\"):t.content.messageSignature.messageDigest.digest.length===0&&e.push(\"content.messageSignature.messageDigest.digest\"),t.content.messageSignature.signature.length===0&&e.push(\"content.messageSignature.signature\");break;case\"dsseEnvelope\":t.content.dsseEnvelope.payload.length===0&&e.push(\"content.dsseEnvelope.payload\"),t.content.dsseEnvelope.signatures.length!==1?e.push(\"content.dsseEnvelope.signatures\"):t.content.dsseEnvelope.signatures[0].sig.length===0&&e.push(\"content.dsseEnvelope.signatures[0].sig\");break}if(t.verificationMaterial===void 0)e.push(\"verificationMaterial\");else{if(t.verificationMaterial.content===void 0)e.push(\"verificationMaterial.content\");else switch(t.verificationMaterial.content.$case){case\"x509CertificateChain\":t.verificationMaterial.content.x509CertificateChain.certificates.length===0&&e.push(\"verificationMaterial.content.x509CertificateChain.certificates\"),t.verificationMaterial.content.x509CertificateChain.certificates.forEach((r,s)=>{r.rawBytes.length===0&&e.push(`verificationMaterial.content.x509CertificateChain.certificates[${s}].rawBytes`)});break;case\"certificate\":t.verificationMaterial.content.certificate.rawBytes.length===0&&e.push(\"verificationMaterial.content.certificate.rawBytes\");break}t.verificationMaterial.tlogEntries===void 0?e.push(\"verificationMaterial.tlogEntries\"):t.verificationMaterial.tlogEntries.length>0&&t.verificationMaterial.tlogEntries.forEach((r,s)=>{r.logId===void 0&&e.push(`verificationMaterial.tlogEntries[${s}].logId`),r.kindVersion===void 0&&e.push(`verificationMaterial.tlogEntries[${s}].kindVersion`)})}return e}function UIt(t){let e=[];return t.verificationMaterial&&t.verificationMaterial.tlogEntries?.length>0&&t.verificationMaterial.tlogEntries.forEach((r,s)=>{r.inclusionPromise===void 0&&e.push(`verificationMaterial.tlogEntries[${s}].inclusionPromise`)}),e}function lDe(t){let e=[];return t.verificationMaterial&&t.verificationMaterial.tlogEntries?.length>0&&t.verificationMaterial.tlogEntries.forEach((r,s)=>{r.inclusionProof===void 0?e.push(`verificationMaterial.tlogEntries[${s}].inclusionProof`):r.inclusionProof.checkpoint===void 0&&e.push(`verificationMaterial.tlogEntries[${s}].inclusionProof.checkpoint`)}),e}function _It(t){let e=[];return t.verificationMaterial?.content?.$case===\"x509CertificateChain\"&&e.push(\"verificationMaterial.content.$case\"),e}});var uDe=_(BA=>{\"use strict\";Object.defineProperty(BA,\"__esModule\",{value:!0});BA.envelopeToJSON=BA.envelopeFromJSON=BA.bundleToJSON=BA.bundleFromJSON=void 0;var $N=yb(),cDe=VN(),VV=YV(),HIt=t=>{let e=$N.Bundle.fromJSON(t);switch(e.mediaType){case cDe.BUNDLE_V01_MEDIA_TYPE:(0,VV.assertBundleV01)(e);break;case cDe.BUNDLE_V02_MEDIA_TYPE:(0,VV.assertBundleV02)(e);break;default:(0,VV.assertBundleLatest)(e);break}return e};BA.bundleFromJSON=HIt;var jIt=t=>$N.Bundle.toJSON(t);BA.bundleToJSON=jIt;var GIt=t=>$N.Envelope.fromJSON(t);BA.envelopeFromJSON=GIt;var qIt=t=>$N.Envelope.toJSON(t);BA.envelopeToJSON=qIt});var Ib=_(Xr=>{\"use strict\";Object.defineProperty(Xr,\"__esModule\",{value:!0});Xr.isBundleV01=Xr.assertBundleV02=Xr.assertBundleV01=Xr.assertBundleLatest=Xr.assertBundle=Xr.envelopeToJSON=Xr.envelopeFromJSON=Xr.bundleToJSON=Xr.bundleFromJSON=Xr.ValidationError=Xr.isBundleWithPublicKey=Xr.isBundleWithMessageSignature=Xr.isBundleWithDsseEnvelope=Xr.isBundleWithCertificateChain=Xr.BUNDLE_V03_MEDIA_TYPE=Xr.BUNDLE_V03_LEGACY_MEDIA_TYPE=Xr.BUNDLE_V02_MEDIA_TYPE=Xr.BUNDLE_V01_MEDIA_TYPE=Xr.toMessageSignatureBundle=Xr.toDSSEBundle=void 0;var fDe=oDe();Object.defineProperty(Xr,\"toDSSEBundle\",{enumerable:!0,get:function(){return fDe.toDSSEBundle}});Object.defineProperty(Xr,\"toMessageSignatureBundle\",{enumerable:!0,get:function(){return fDe.toMessageSignatureBundle}});var Ig=VN();Object.defineProperty(Xr,\"BUNDLE_V01_MEDIA_TYPE\",{enumerable:!0,get:function(){return Ig.BUNDLE_V01_MEDIA_TYPE}});Object.defineProperty(Xr,\"BUNDLE_V02_MEDIA_TYPE\",{enumerable:!0,get:function(){return Ig.BUNDLE_V02_MEDIA_TYPE}});Object.defineProperty(Xr,\"BUNDLE_V03_LEGACY_MEDIA_TYPE\",{enumerable:!0,get:function(){return Ig.BUNDLE_V03_LEGACY_MEDIA_TYPE}});Object.defineProperty(Xr,\"BUNDLE_V03_MEDIA_TYPE\",{enumerable:!0,get:function(){return Ig.BUNDLE_V03_MEDIA_TYPE}});Object.defineProperty(Xr,\"isBundleWithCertificateChain\",{enumerable:!0,get:function(){return Ig.isBundleWithCertificateChain}});Object.defineProperty(Xr,\"isBundleWithDsseEnvelope\",{enumerable:!0,get:function(){return Ig.isBundleWithDsseEnvelope}});Object.defineProperty(Xr,\"isBundleWithMessageSignature\",{enumerable:!0,get:function(){return Ig.isBundleWithMessageSignature}});Object.defineProperty(Xr,\"isBundleWithPublicKey\",{enumerable:!0,get:function(){return Ig.isBundleWithPublicKey}});var WIt=WV();Object.defineProperty(Xr,\"ValidationError\",{enumerable:!0,get:function(){return WIt.ValidationError}});var eO=uDe();Object.defineProperty(Xr,\"bundleFromJSON\",{enumerable:!0,get:function(){return eO.bundleFromJSON}});Object.defineProperty(Xr,\"bundleToJSON\",{enumerable:!0,get:function(){return eO.bundleToJSON}});Object.defineProperty(Xr,\"envelopeFromJSON\",{enumerable:!0,get:function(){return eO.envelopeFromJSON}});Object.defineProperty(Xr,\"envelopeToJSON\",{enumerable:!0,get:function(){return eO.envelopeToJSON}});var Eb=YV();Object.defineProperty(Xr,\"assertBundle\",{enumerable:!0,get:function(){return Eb.assertBundle}});Object.defineProperty(Xr,\"assertBundleLatest\",{enumerable:!0,get:function(){return Eb.assertBundleLatest}});Object.defineProperty(Xr,\"assertBundleV01\",{enumerable:!0,get:function(){return Eb.assertBundleV01}});Object.defineProperty(Xr,\"assertBundleV02\",{enumerable:!0,get:function(){return Eb.assertBundleV02}});Object.defineProperty(Xr,\"isBundleV01\",{enumerable:!0,get:function(){return Eb.isBundleV01}})});var Cb=_(rO=>{\"use strict\";Object.defineProperty(rO,\"__esModule\",{value:!0});rO.ByteStream=void 0;var JV=class extends Error{},tO=class t{constructor(e){this.start=0,e?(this.buf=e,this.view=Buffer.from(e)):(this.buf=new ArrayBuffer(0),this.view=Buffer.from(this.buf))}get buffer(){return this.view.subarray(0,this.start)}get length(){return this.view.byteLength}get position(){return this.start}seek(e){this.start=e}slice(e,r){let s=e+r;if(s>this.length)throw new JV(\"request past end of buffer\");return this.view.subarray(e,s)}appendChar(e){this.ensureCapacity(1),this.view[this.start]=e,this.start+=1}appendUint16(e){this.ensureCapacity(2);let r=new Uint16Array([e]),s=new Uint8Array(r.buffer);this.view[this.start]=s[1],this.view[this.start+1]=s[0],this.start+=2}appendUint24(e){this.ensureCapacity(3);let r=new Uint32Array([e]),s=new Uint8Array(r.buffer);this.view[this.start]=s[2],this.view[this.start+1]=s[1],this.view[this.start+2]=s[0],this.start+=3}appendView(e){this.ensureCapacity(e.length),this.view.set(e,this.start),this.start+=e.length}getBlock(e){if(e<=0)return Buffer.alloc(0);if(this.start+e>this.view.length)throw new Error(\"request past end of buffer\");let r=this.view.subarray(this.start,this.start+e);return this.start+=e,r}getUint8(){return this.getBlock(1)[0]}getUint16(){let e=this.getBlock(2);return e[0]<<8|e[1]}ensureCapacity(e){if(this.start+e>this.view.byteLength){let r=t.BLOCK_SIZE+(e>t.BLOCK_SIZE?e:0);this.realloc(this.view.byteLength+r)}}realloc(e){let r=new ArrayBuffer(e),s=Buffer.from(r);s.set(this.view),this.buf=r,this.view=s}};rO.ByteStream=tO;tO.BLOCK_SIZE=1024});var nO=_(Vw=>{\"use strict\";Object.defineProperty(Vw,\"__esModule\",{value:!0});Vw.ASN1TypeError=Vw.ASN1ParseError=void 0;var KV=class extends Error{};Vw.ASN1ParseError=KV;var zV=class extends Error{};Vw.ASN1TypeError=zV});var pDe=_(iO=>{\"use strict\";Object.defineProperty(iO,\"__esModule\",{value:!0});iO.decodeLength=YIt;iO.encodeLength=VIt;var ADe=nO();function YIt(t){let e=t.getUint8();if(!(e&128))return e;let r=e&127;if(r>6)throw new ADe.ASN1ParseError(\"length exceeds 6 byte limit\");let s=0;for(let a=0;a<r;a++)s=s*256+t.getUint8();if(s===0)throw new ADe.ASN1ParseError(\"indefinite length encoding not supported\");return s}function VIt(t){if(t<128)return Buffer.from([t]);let e=BigInt(t),r=[];for(;e>0n;)r.unshift(Number(e&255n)),e=e>>8n;return Buffer.from([128|r.length,...r])}});var gDe=_(Cg=>{\"use strict\";Object.defineProperty(Cg,\"__esModule\",{value:!0});Cg.parseInteger=zIt;Cg.parseStringASCII=hDe;Cg.parseTime=XIt;Cg.parseOID=ZIt;Cg.parseBoolean=$It;Cg.parseBitString=eCt;var JIt=/^(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\.\\d{3})?Z$/,KIt=/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\.\\d{3})?Z$/;function zIt(t){let e=0,r=t.length,s=t[e],a=s>127,n=a?255:0;for(;s==n&&++e<r;)s=t[e];if(r-e===0)return BigInt(a?-1:0);s=a?s-256:s;let f=BigInt(s);for(let p=e+1;p<r;++p)f=f*BigInt(256)+BigInt(t[p]);return f}function hDe(t){return t.toString(\"ascii\")}function XIt(t,e){let r=hDe(t),s=e?JIt.exec(r):KIt.exec(r);if(!s)throw new Error(\"invalid time\");if(e){let a=Number(s[1]);a+=a>=50?1900:2e3,s[1]=a.toString()}return new Date(`${s[1]}-${s[2]}-${s[3]}T${s[4]}:${s[5]}:${s[6]}Z`)}function ZIt(t){let e=0,r=t.length,s=t[e++],a=Math.floor(s/40),n=s%40,c=`${a}.${n}`,f=0;for(;e<r;++e)s=t[e],f=(f<<7)+(s&127),s&128||(c+=`.${f}`,f=0);return c}function $It(t){return t[0]!==0}function eCt(t){let e=t[0],r=1,s=t.length,a=[];for(let n=r;n<s;++n){let c=t[n],f=n===s-1?e:0;for(let p=7;p>=f;--p)a.push(c>>p&1)}return a}});var mDe=_(sO=>{\"use strict\";Object.defineProperty(sO,\"__esModule\",{value:!0});sO.ASN1Tag=void 0;var dDe=nO(),ty={BOOLEAN:1,INTEGER:2,BIT_STRING:3,OCTET_STRING:4,OBJECT_IDENTIFIER:6,SEQUENCE:16,SET:17,PRINTABLE_STRING:19,UTC_TIME:23,GENERALIZED_TIME:24},XV={UNIVERSAL:0,APPLICATION:1,CONTEXT_SPECIFIC:2,PRIVATE:3},ZV=class{constructor(e){if(this.number=e&31,this.constructed=(e&32)===32,this.class=e>>6,this.number===31)throw new dDe.ASN1ParseError(\"long form tags not supported\");if(this.class===XV.UNIVERSAL&&this.number===0)throw new dDe.ASN1ParseError(\"unsupported tag 0x00\")}isUniversal(){return this.class===XV.UNIVERSAL}isContextSpecific(e){let r=this.class===XV.CONTEXT_SPECIFIC;return e!==void 0?r&&this.number===e:r}isBoolean(){return this.isUniversal()&&this.number===ty.BOOLEAN}isInteger(){return this.isUniversal()&&this.number===ty.INTEGER}isBitString(){return this.isUniversal()&&this.number===ty.BIT_STRING}isOctetString(){return this.isUniversal()&&this.number===ty.OCTET_STRING}isOID(){return this.isUniversal()&&this.number===ty.OBJECT_IDENTIFIER}isUTCTime(){return this.isUniversal()&&this.number===ty.UTC_TIME}isGeneralizedTime(){return this.isUniversal()&&this.number===ty.GENERALIZED_TIME}toDER(){return this.number|(this.constructed?32:0)|this.class<<6}};sO.ASN1Tag=ZV});var CDe=_(aO=>{\"use strict\";Object.defineProperty(aO,\"__esModule\",{value:!0});aO.ASN1Obj=void 0;var $V=Cb(),ry=nO(),EDe=pDe(),Jw=gDe(),tCt=mDe(),oO=class{constructor(e,r,s){this.tag=e,this.value=r,this.subs=s}static parseBuffer(e){return IDe(new $V.ByteStream(e))}toDER(){let e=new $V.ByteStream;if(this.subs.length>0)for(let a of this.subs)e.appendView(a.toDER());else e.appendView(this.value);let r=e.buffer,s=new $V.ByteStream;return s.appendChar(this.tag.toDER()),s.appendView((0,EDe.encodeLength)(r.length)),s.appendView(r),s.buffer}toBoolean(){if(!this.tag.isBoolean())throw new ry.ASN1TypeError(\"not a boolean\");return(0,Jw.parseBoolean)(this.value)}toInteger(){if(!this.tag.isInteger())throw new ry.ASN1TypeError(\"not an integer\");return(0,Jw.parseInteger)(this.value)}toOID(){if(!this.tag.isOID())throw new ry.ASN1TypeError(\"not an OID\");return(0,Jw.parseOID)(this.value)}toDate(){switch(!0){case this.tag.isUTCTime():return(0,Jw.parseTime)(this.value,!0);case this.tag.isGeneralizedTime():return(0,Jw.parseTime)(this.value,!1);default:throw new ry.ASN1TypeError(\"not a date\")}}toBitString(){if(!this.tag.isBitString())throw new ry.ASN1TypeError(\"not a bit string\");return(0,Jw.parseBitString)(this.value)}};aO.ASN1Obj=oO;function IDe(t){let e=new tCt.ASN1Tag(t.getUint8()),r=(0,EDe.decodeLength)(t),s=t.slice(t.position,r),a=t.position,n=[];if(e.constructed)n=yDe(t,r);else if(e.isOctetString())try{n=yDe(t,r)}catch{}return n.length===0&&t.seek(a+r),new oO(e,s,n)}function yDe(t,e){let r=t.position+e;if(r>t.length)throw new ry.ASN1ParseError(\"invalid length\");let s=[];for(;t.position<r;)s.push(IDe(t));if(t.position!==r)throw new ry.ASN1ParseError(\"invalid length\");return s}});var cO=_(lO=>{\"use strict\";Object.defineProperty(lO,\"__esModule\",{value:!0});lO.ASN1Obj=void 0;var rCt=CDe();Object.defineProperty(lO,\"ASN1Obj\",{enumerable:!0,get:function(){return rCt.ASN1Obj}})});var Kw=_(wg=>{\"use strict\";var nCt=wg&&wg.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(wg,\"__esModule\",{value:!0});wg.createPublicKey=iCt;wg.digest=sCt;wg.verify=oCt;wg.bufferEqual=aCt;var wb=nCt(Ie(\"crypto\"));function iCt(t,e=\"spki\"){return typeof t==\"string\"?wb.default.createPublicKey(t):wb.default.createPublicKey({key:t,format:\"der\",type:e})}function sCt(t,...e){let r=wb.default.createHash(t);for(let s of e)r.update(s);return r.digest()}function oCt(t,e,r,s){try{return wb.default.verify(s,t,e,r)}catch{return!1}}function aCt(t,e){try{return wb.default.timingSafeEqual(t,e)}catch{return!1}}});var wDe=_(e7=>{\"use strict\";Object.defineProperty(e7,\"__esModule\",{value:!0});e7.preAuthEncoding=cCt;var lCt=\"DSSEv1\";function cCt(t,e){let r=[lCt,t.length,t,e.length,\"\"].join(\" \");return Buffer.concat([Buffer.from(r,\"ascii\"),e])}});var SDe=_(uO=>{\"use strict\";Object.defineProperty(uO,\"__esModule\",{value:!0});uO.base64Encode=uCt;uO.base64Decode=fCt;var BDe=\"base64\",vDe=\"utf-8\";function uCt(t){return Buffer.from(t,vDe).toString(BDe)}function fCt(t){return Buffer.from(t,BDe).toString(vDe)}});var DDe=_(r7=>{\"use strict\";Object.defineProperty(r7,\"__esModule\",{value:!0});r7.canonicalize=t7;function t7(t){let e=\"\";if(t===null||typeof t!=\"object\"||t.toJSON!=null)e+=JSON.stringify(t);else if(Array.isArray(t)){e+=\"[\";let r=!0;t.forEach(s=>{r||(e+=\",\"),r=!1,e+=t7(s)}),e+=\"]\"}else{e+=\"{\";let r=!0;Object.keys(t).sort().forEach(s=>{r||(e+=\",\"),r=!1,e+=JSON.stringify(s),e+=\":\",e+=t7(t[s])}),e+=\"}\"}return e}});var n7=_(fO=>{\"use strict\";Object.defineProperty(fO,\"__esModule\",{value:!0});fO.toDER=hCt;fO.fromDER=gCt;var ACt=/-----BEGIN (.*)-----/,pCt=/-----END (.*)-----/;function hCt(t){let e=\"\";return t.split(`\n`).forEach(r=>{r.match(ACt)||r.match(pCt)||(e+=r)}),Buffer.from(e,\"base64\")}function gCt(t,e=\"CERTIFICATE\"){let s=t.toString(\"base64\").match(/.{1,64}/g)||\"\";return[`-----BEGIN ${e}-----`,...s,`-----END ${e}-----`].join(`\n`).concat(`\n`)}});var AO=_(zw=>{\"use strict\";Object.defineProperty(zw,\"__esModule\",{value:!0});zw.SHA2_HASH_ALGOS=zw.ECDSA_SIGNATURE_ALGOS=void 0;zw.ECDSA_SIGNATURE_ALGOS={\"1.2.840.10045.4.3.1\":\"sha224\",\"1.2.840.10045.4.3.2\":\"sha256\",\"1.2.840.10045.4.3.3\":\"sha384\",\"1.2.840.10045.4.3.4\":\"sha512\"};zw.SHA2_HASH_ALGOS={\"2.16.840.1.101.3.4.2.1\":\"sha256\",\"2.16.840.1.101.3.4.2.2\":\"sha384\",\"2.16.840.1.101.3.4.2.3\":\"sha512\"}});var s7=_(pO=>{\"use strict\";Object.defineProperty(pO,\"__esModule\",{value:!0});pO.RFC3161TimestampVerificationError=void 0;var i7=class extends Error{};pO.RFC3161TimestampVerificationError=i7});var PDe=_(vA=>{\"use strict\";var dCt=vA&&vA.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||(\"get\"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),mCt=vA&&vA.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),yCt=vA&&vA.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.prototype.hasOwnProperty.call(t,r)&&dCt(e,t,r);return mCt(e,t),e};Object.defineProperty(vA,\"__esModule\",{value:!0});vA.TSTInfo=void 0;var bDe=yCt(Kw()),ECt=AO(),ICt=s7(),o7=class{constructor(e){this.root=e}get version(){return this.root.subs[0].toInteger()}get genTime(){return this.root.subs[4].toDate()}get messageImprintHashAlgorithm(){let e=this.messageImprintObj.subs[0].subs[0].toOID();return ECt.SHA2_HASH_ALGOS[e]}get messageImprintHashedMessage(){return this.messageImprintObj.subs[1].value}get raw(){return this.root.toDER()}verify(e){let r=bDe.digest(this.messageImprintHashAlgorithm,e);if(!bDe.bufferEqual(r,this.messageImprintHashedMessage))throw new ICt.RFC3161TimestampVerificationError(\"message imprint does not match artifact\")}get messageImprintObj(){return this.root.subs[2]}};vA.TSTInfo=o7});var kDe=_(SA=>{\"use strict\";var CCt=SA&&SA.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||(\"get\"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),wCt=SA&&SA.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),BCt=SA&&SA.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.prototype.hasOwnProperty.call(t,r)&&CCt(e,t,r);return wCt(e,t),e};Object.defineProperty(SA,\"__esModule\",{value:!0});SA.RFC3161Timestamp=void 0;var vCt=cO(),a7=BCt(Kw()),xDe=AO(),Bb=s7(),SCt=PDe(),DCt=\"1.2.840.113549.1.7.2\",bCt=\"1.2.840.113549.1.9.16.1.4\",PCt=\"1.2.840.113549.1.9.4\",l7=class t{constructor(e){this.root=e}static parse(e){let r=vCt.ASN1Obj.parseBuffer(e);return new t(r)}get status(){return this.pkiStatusInfoObj.subs[0].toInteger()}get contentType(){return this.contentTypeObj.toOID()}get eContentType(){return this.eContentTypeObj.toOID()}get signingTime(){return this.tstInfo.genTime}get signerIssuer(){return this.signerSidObj.subs[0].value}get signerSerialNumber(){return this.signerSidObj.subs[1].value}get signerDigestAlgorithm(){let e=this.signerDigestAlgorithmObj.subs[0].toOID();return xDe.SHA2_HASH_ALGOS[e]}get signatureAlgorithm(){let e=this.signatureAlgorithmObj.subs[0].toOID();return xDe.ECDSA_SIGNATURE_ALGOS[e]}get signatureValue(){return this.signatureValueObj.value}get tstInfo(){return new SCt.TSTInfo(this.eContentObj.subs[0].subs[0])}verify(e,r){if(!this.timeStampTokenObj)throw new Bb.RFC3161TimestampVerificationError(\"timeStampToken is missing\");if(this.contentType!==DCt)throw new Bb.RFC3161TimestampVerificationError(`incorrect content type: ${this.contentType}`);if(this.eContentType!==bCt)throw new Bb.RFC3161TimestampVerificationError(`incorrect encapsulated content type: ${this.eContentType}`);this.tstInfo.verify(e),this.verifyMessageDigest(),this.verifySignature(r)}verifyMessageDigest(){let e=a7.digest(this.signerDigestAlgorithm,this.tstInfo.raw),r=this.messageDigestAttributeObj.subs[1].subs[0].value;if(!a7.bufferEqual(e,r))throw new Bb.RFC3161TimestampVerificationError(\"signed data does not match tstInfo\")}verifySignature(e){let r=this.signedAttrsObj.toDER();if(r[0]=49,!a7.verify(r,e,this.signatureValue,this.signatureAlgorithm))throw new Bb.RFC3161TimestampVerificationError(\"signature verification failed\")}get pkiStatusInfoObj(){return this.root.subs[0]}get timeStampTokenObj(){return this.root.subs[1]}get contentTypeObj(){return this.timeStampTokenObj.subs[0]}get signedDataObj(){return this.timeStampTokenObj.subs.find(r=>r.tag.isContextSpecific(0)).subs[0]}get encapContentInfoObj(){return this.signedDataObj.subs[2]}get signerInfosObj(){let e=this.signedDataObj;return e.subs[e.subs.length-1]}get signerInfoObj(){return this.signerInfosObj.subs[0]}get eContentTypeObj(){return this.encapContentInfoObj.subs[0]}get eContentObj(){return this.encapContentInfoObj.subs[1]}get signedAttrsObj(){return this.signerInfoObj.subs.find(r=>r.tag.isContextSpecific(0))}get messageDigestAttributeObj(){return this.signedAttrsObj.subs.find(r=>r.subs[0].tag.isOID()&&r.subs[0].toOID()===PCt)}get signerSidObj(){return this.signerInfoObj.subs[1]}get signerDigestAlgorithmObj(){return this.signerInfoObj.subs[2]}get signatureAlgorithmObj(){return this.signerInfoObj.subs[4]}get signatureValueObj(){return this.signerInfoObj.subs[5]}};SA.RFC3161Timestamp=l7});var QDe=_(hO=>{\"use strict\";Object.defineProperty(hO,\"__esModule\",{value:!0});hO.RFC3161Timestamp=void 0;var xCt=kDe();Object.defineProperty(hO,\"RFC3161Timestamp\",{enumerable:!0,get:function(){return xCt.RFC3161Timestamp}})});var RDe=_(DA=>{\"use strict\";var kCt=DA&&DA.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||(\"get\"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),QCt=DA&&DA.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),TCt=DA&&DA.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.prototype.hasOwnProperty.call(t,r)&&kCt(e,t,r);return QCt(e,t),e};Object.defineProperty(DA,\"__esModule\",{value:!0});DA.SignedCertificateTimestamp=void 0;var RCt=TCt(Kw()),TDe=Cb(),c7=class t{constructor(e){this.version=e.version,this.logID=e.logID,this.timestamp=e.timestamp,this.extensions=e.extensions,this.hashAlgorithm=e.hashAlgorithm,this.signatureAlgorithm=e.signatureAlgorithm,this.signature=e.signature}get datetime(){return new Date(Number(this.timestamp.readBigInt64BE()))}get algorithm(){switch(this.hashAlgorithm){case 0:return\"none\";case 1:return\"md5\";case 2:return\"sha1\";case 3:return\"sha224\";case 4:return\"sha256\";case 5:return\"sha384\";case 6:return\"sha512\";default:return\"unknown\"}}verify(e,r){let s=new TDe.ByteStream;return s.appendChar(this.version),s.appendChar(0),s.appendView(this.timestamp),s.appendUint16(1),s.appendView(e),s.appendUint16(this.extensions.byteLength),this.extensions.byteLength>0&&s.appendView(this.extensions),RCt.verify(s.buffer,r,this.signature,this.algorithm)}static parse(e){let r=new TDe.ByteStream(e),s=r.getUint8(),a=r.getBlock(32),n=r.getBlock(8),c=r.getUint16(),f=r.getBlock(c),p=r.getUint8(),h=r.getUint8(),E=r.getUint16(),C=r.getBlock(E);if(r.position!==e.length)throw new Error(\"SCT buffer length mismatch\");return new t({version:s,logID:a,timestamp:n,extensions:f,hashAlgorithm:p,signatureAlgorithm:h,signature:C})}};DA.SignedCertificateTimestamp=c7});var d7=_(sa=>{\"use strict\";Object.defineProperty(sa,\"__esModule\",{value:!0});sa.X509SCTExtension=sa.X509SubjectKeyIDExtension=sa.X509AuthorityKeyIDExtension=sa.X509SubjectAlternativeNameExtension=sa.X509KeyUsageExtension=sa.X509BasicConstraintsExtension=sa.X509Extension=void 0;var FCt=Cb(),NCt=RDe(),ph=class{constructor(e){this.root=e}get oid(){return this.root.subs[0].toOID()}get critical(){return this.root.subs.length===3?this.root.subs[1].toBoolean():!1}get value(){return this.extnValueObj.value}get valueObj(){return this.extnValueObj}get extnValueObj(){return this.root.subs[this.root.subs.length-1]}};sa.X509Extension=ph;var u7=class extends ph{get isCA(){return this.sequence.subs[0]?.toBoolean()??!1}get pathLenConstraint(){return this.sequence.subs.length>1?this.sequence.subs[1].toInteger():void 0}get sequence(){return this.extnValueObj.subs[0]}};sa.X509BasicConstraintsExtension=u7;var f7=class extends ph{get digitalSignature(){return this.bitString[0]===1}get keyCertSign(){return this.bitString[5]===1}get crlSign(){return this.bitString[6]===1}get bitString(){return this.extnValueObj.subs[0].toBitString()}};sa.X509KeyUsageExtension=f7;var A7=class extends ph{get rfc822Name(){return this.findGeneralName(1)?.value.toString(\"ascii\")}get uri(){return this.findGeneralName(6)?.value.toString(\"ascii\")}otherName(e){let r=this.findGeneralName(0);return r===void 0||r.subs[0].toOID()!==e?void 0:r.subs[1].subs[0].value.toString(\"ascii\")}findGeneralName(e){return this.generalNames.find(r=>r.tag.isContextSpecific(e))}get generalNames(){return this.extnValueObj.subs[0].subs}};sa.X509SubjectAlternativeNameExtension=A7;var p7=class extends ph{get keyIdentifier(){return this.findSequenceMember(0)?.value}findSequenceMember(e){return this.sequence.subs.find(r=>r.tag.isContextSpecific(e))}get sequence(){return this.extnValueObj.subs[0]}};sa.X509AuthorityKeyIDExtension=p7;var h7=class extends ph{get keyIdentifier(){return this.extnValueObj.subs[0].value}};sa.X509SubjectKeyIDExtension=h7;var g7=class extends ph{constructor(e){super(e)}get signedCertificateTimestamps(){let e=this.extnValueObj.subs[0].value,r=new FCt.ByteStream(e),s=r.getUint16()+2,a=[];for(;r.position<s;){let n=r.getUint16(),c=r.getBlock(n);a.push(NCt.SignedCertificateTimestamp.parse(c))}if(r.position!==s)throw new Error(\"SCT list length does not match actual length\");return a}};sa.X509SCTExtension=g7});var ODe=_(ic=>{\"use strict\";var OCt=ic&&ic.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||(\"get\"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),LCt=ic&&ic.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),NDe=ic&&ic.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.prototype.hasOwnProperty.call(t,r)&&OCt(e,t,r);return LCt(e,t),e};Object.defineProperty(ic,\"__esModule\",{value:!0});ic.X509Certificate=ic.EXTENSION_OID_SCT=void 0;var MCt=cO(),FDe=NDe(Kw()),UCt=AO(),_Ct=NDe(n7()),ny=d7(),HCt=\"2.5.29.14\",jCt=\"2.5.29.15\",GCt=\"2.5.29.17\",qCt=\"2.5.29.19\",WCt=\"2.5.29.35\";ic.EXTENSION_OID_SCT=\"1.3.6.1.4.1.11129.2.4.2\";var m7=class t{constructor(e){this.root=e}static parse(e){let r=typeof e==\"string\"?_Ct.toDER(e):e,s=MCt.ASN1Obj.parseBuffer(r);return new t(s)}get tbsCertificate(){return this.tbsCertificateObj}get version(){return`v${(this.versionObj.subs[0].toInteger()+BigInt(1)).toString()}`}get serialNumber(){return this.serialNumberObj.value}get notBefore(){return this.validityObj.subs[0].toDate()}get notAfter(){return this.validityObj.subs[1].toDate()}get issuer(){return this.issuerObj.value}get subject(){return this.subjectObj.value}get publicKey(){return this.subjectPublicKeyInfoObj.toDER()}get signatureAlgorithm(){let e=this.signatureAlgorithmObj.subs[0].toOID();return UCt.ECDSA_SIGNATURE_ALGOS[e]}get signatureValue(){return this.signatureValueObj.value.subarray(1)}get subjectAltName(){let e=this.extSubjectAltName;return e?.uri||e?.rfc822Name}get extensions(){return this.extensionsObj?.subs[0]?.subs||[]}get extKeyUsage(){let e=this.findExtension(jCt);return e?new ny.X509KeyUsageExtension(e):void 0}get extBasicConstraints(){let e=this.findExtension(qCt);return e?new ny.X509BasicConstraintsExtension(e):void 0}get extSubjectAltName(){let e=this.findExtension(GCt);return e?new ny.X509SubjectAlternativeNameExtension(e):void 0}get extAuthorityKeyID(){let e=this.findExtension(WCt);return e?new ny.X509AuthorityKeyIDExtension(e):void 0}get extSubjectKeyID(){let e=this.findExtension(HCt);return e?new ny.X509SubjectKeyIDExtension(e):void 0}get extSCT(){let e=this.findExtension(ic.EXTENSION_OID_SCT);return e?new ny.X509SCTExtension(e):void 0}get isCA(){let e=this.extBasicConstraints?.isCA||!1;return this.extKeyUsage?e&&this.extKeyUsage.keyCertSign:e}extension(e){let r=this.findExtension(e);return r?new ny.X509Extension(r):void 0}verify(e){let r=e?.publicKey||this.publicKey,s=FDe.createPublicKey(r);return FDe.verify(this.tbsCertificate.toDER(),s,this.signatureValue,this.signatureAlgorithm)}validForDate(e){return this.notBefore<=e&&e<=this.notAfter}equals(e){return this.root.toDER().equals(e.root.toDER())}clone(){let e=this.root.toDER(),r=Buffer.alloc(e.length);return e.copy(r),t.parse(r)}findExtension(e){return this.extensions.find(r=>r.subs[0].toOID()===e)}get tbsCertificateObj(){return this.root.subs[0]}get signatureAlgorithmObj(){return this.root.subs[1]}get signatureValueObj(){return this.root.subs[2]}get versionObj(){return this.tbsCertificateObj.subs[0]}get serialNumberObj(){return this.tbsCertificateObj.subs[1]}get issuerObj(){return this.tbsCertificateObj.subs[3]}get validityObj(){return this.tbsCertificateObj.subs[4]}get subjectObj(){return this.tbsCertificateObj.subs[5]}get subjectPublicKeyInfoObj(){return this.tbsCertificateObj.subs[6]}get extensionsObj(){return this.tbsCertificateObj.subs.find(e=>e.tag.isContextSpecific(3))}};ic.X509Certificate=m7});var MDe=_(Bg=>{\"use strict\";Object.defineProperty(Bg,\"__esModule\",{value:!0});Bg.X509SCTExtension=Bg.X509Certificate=Bg.EXTENSION_OID_SCT=void 0;var LDe=ODe();Object.defineProperty(Bg,\"EXTENSION_OID_SCT\",{enumerable:!0,get:function(){return LDe.EXTENSION_OID_SCT}});Object.defineProperty(Bg,\"X509Certificate\",{enumerable:!0,get:function(){return LDe.X509Certificate}});var YCt=d7();Object.defineProperty(Bg,\"X509SCTExtension\",{enumerable:!0,get:function(){return YCt.X509SCTExtension}})});var Cl=_(Jn=>{\"use strict\";var VCt=Jn&&Jn.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||(\"get\"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),JCt=Jn&&Jn.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),vb=Jn&&Jn.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.prototype.hasOwnProperty.call(t,r)&&VCt(e,t,r);return JCt(e,t),e};Object.defineProperty(Jn,\"__esModule\",{value:!0});Jn.X509SCTExtension=Jn.X509Certificate=Jn.EXTENSION_OID_SCT=Jn.ByteStream=Jn.RFC3161Timestamp=Jn.pem=Jn.json=Jn.encoding=Jn.dsse=Jn.crypto=Jn.ASN1Obj=void 0;var KCt=cO();Object.defineProperty(Jn,\"ASN1Obj\",{enumerable:!0,get:function(){return KCt.ASN1Obj}});Jn.crypto=vb(Kw());Jn.dsse=vb(wDe());Jn.encoding=vb(SDe());Jn.json=vb(DDe());Jn.pem=vb(n7());var zCt=QDe();Object.defineProperty(Jn,\"RFC3161Timestamp\",{enumerable:!0,get:function(){return zCt.RFC3161Timestamp}});var XCt=Cb();Object.defineProperty(Jn,\"ByteStream\",{enumerable:!0,get:function(){return XCt.ByteStream}});var y7=MDe();Object.defineProperty(Jn,\"EXTENSION_OID_SCT\",{enumerable:!0,get:function(){return y7.EXTENSION_OID_SCT}});Object.defineProperty(Jn,\"X509Certificate\",{enumerable:!0,get:function(){return y7.X509Certificate}});Object.defineProperty(Jn,\"X509SCTExtension\",{enumerable:!0,get:function(){return y7.X509SCTExtension}})});var UDe=_(E7=>{\"use strict\";Object.defineProperty(E7,\"__esModule\",{value:!0});E7.extractJWTSubject=$Ct;var ZCt=Cl();function $Ct(t){let e=t.split(\".\",3),r=JSON.parse(ZCt.encoding.base64Decode(e[1]));switch(r.iss){case\"https://accounts.google.com\":case\"https://oauth2.sigstore.dev/auth\":return r.email;default:return r.sub}}});var _De=_((dnr,ewt)=>{ewt.exports={name:\"@sigstore/sign\",version:\"3.1.0\",description:\"Sigstore signing library\",main:\"dist/index.js\",types:\"dist/index.d.ts\",scripts:{clean:\"shx rm -rf dist *.tsbuildinfo\",build:\"tsc --build\",test:\"jest\"},files:[\"dist\"],author:\"bdehamer@github.com\",license:\"Apache-2.0\",repository:{type:\"git\",url:\"git+https://github.com/sigstore/sigstore-js.git\"},bugs:{url:\"https://github.com/sigstore/sigstore-js/issues\"},homepage:\"https://github.com/sigstore/sigstore-js/tree/main/packages/sign#readme\",publishConfig:{provenance:!0},devDependencies:{\"@sigstore/jest\":\"^0.0.0\",\"@sigstore/mock\":\"^0.10.0\",\"@sigstore/rekor-types\":\"^3.0.0\",\"@types/make-fetch-happen\":\"^10.0.4\",\"@types/promise-retry\":\"^1.1.6\"},dependencies:{\"@sigstore/bundle\":\"^3.1.0\",\"@sigstore/core\":\"^2.0.0\",\"@sigstore/protobuf-specs\":\"^0.4.0\",\"make-fetch-happen\":\"^14.0.2\",\"proc-log\":\"^5.0.0\",\"promise-retry\":\"^2.0.1\"},engines:{node:\"^18.17.0 || >=20.5.0\"}}});var jDe=_(Xw=>{\"use strict\";var twt=Xw&&Xw.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Xw,\"__esModule\",{value:!0});Xw.getUserAgent=void 0;var HDe=twt(Ie(\"os\")),rwt=()=>{let t=_De().version,e=process.version,r=HDe.default.platform(),s=HDe.default.arch();return`sigstore-js/${t} (Node ${e}) (${r}/${s})`};Xw.getUserAgent=rwt});var vg=_(Ji=>{\"use strict\";var nwt=Ji&&Ji.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||(\"get\"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),iwt=Ji&&Ji.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),GDe=Ji&&Ji.__importStar||function(){var t=function(e){return t=Object.getOwnPropertyNames||function(r){var s=[];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(s[s.length]=a);return s},t(e)};return function(e){if(e&&e.__esModule)return e;var r={};if(e!=null)for(var s=t(e),a=0;a<s.length;a++)s[a]!==\"default\"&&nwt(r,e,s[a]);return iwt(r,e),r}}();Object.defineProperty(Ji,\"__esModule\",{value:!0});Ji.ua=Ji.oidc=Ji.pem=Ji.json=Ji.encoding=Ji.dsse=Ji.crypto=void 0;var Sb=Cl();Object.defineProperty(Ji,\"crypto\",{enumerable:!0,get:function(){return Sb.crypto}});Object.defineProperty(Ji,\"dsse\",{enumerable:!0,get:function(){return Sb.dsse}});Object.defineProperty(Ji,\"encoding\",{enumerable:!0,get:function(){return Sb.encoding}});Object.defineProperty(Ji,\"json\",{enumerable:!0,get:function(){return Sb.json}});Object.defineProperty(Ji,\"pem\",{enumerable:!0,get:function(){return Sb.pem}});Ji.oidc=GDe(UDe());Ji.ua=GDe(jDe())});var C7=_(gO=>{\"use strict\";Object.defineProperty(gO,\"__esModule\",{value:!0});gO.BaseBundleBuilder=void 0;var I7=class{constructor(e){this.signer=e.signer,this.witnesses=e.witnesses}async create(e){let r=await this.prepare(e).then(f=>this.signer.sign(f)),s=await this.package(e,r),a=await Promise.all(this.witnesses.map(f=>f.testify(s.content,swt(r.key)))),n=[],c=[];return a.forEach(({tlogEntries:f,rfc3161Timestamps:p})=>{n.push(...f??[]),c.push(...p??[])}),s.verificationMaterial.tlogEntries=n,s.verificationMaterial.timestampVerificationData={rfc3161Timestamps:c},s}async prepare(e){return e.data}};gO.BaseBundleBuilder=I7;function swt(t){switch(t.$case){case\"publicKey\":return t.publicKey;case\"x509Certificate\":return t.certificate}}});var B7=_(bA=>{\"use strict\";var owt=bA&&bA.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||(\"get\"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),awt=bA&&bA.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),lwt=bA&&bA.__importStar||function(){var t=function(e){return t=Object.getOwnPropertyNames||function(r){var s=[];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(s[s.length]=a);return s},t(e)};return function(e){if(e&&e.__esModule)return e;var r={};if(e!=null)for(var s=t(e),a=0;a<s.length;a++)s[a]!==\"default\"&&owt(r,e,s[a]);return awt(r,e),r}}();Object.defineProperty(bA,\"__esModule\",{value:!0});bA.toMessageSignatureBundle=cwt;bA.toDSSEBundle=uwt;var qDe=lwt(Ib()),w7=vg();function cwt(t,e){let r=w7.crypto.digest(\"sha256\",t.data);return qDe.toMessageSignatureBundle({digest:r,signature:e.signature,certificate:e.key.$case===\"x509Certificate\"?w7.pem.toDER(e.key.certificate):void 0,keyHint:e.key.$case===\"publicKey\"?e.key.hint:void 0,certificateChain:!0})}function uwt(t,e,r){return qDe.toDSSEBundle({artifact:t.data,artifactType:t.type,signature:e.signature,certificate:e.key.$case===\"x509Certificate\"?w7.pem.toDER(e.key.certificate):void 0,keyHint:e.key.$case===\"publicKey\"?e.key.hint:void 0,certificateChain:r})}});var YDe=_(dO=>{\"use strict\";Object.defineProperty(dO,\"__esModule\",{value:!0});dO.DSSEBundleBuilder=void 0;var fwt=vg(),Awt=C7(),pwt=B7(),v7=class extends Awt.BaseBundleBuilder{constructor(e){super(e),this.certificateChain=e.certificateChain??!1}async prepare(e){let r=WDe(e);return fwt.dsse.preAuthEncoding(r.type,r.data)}async package(e,r){return(0,pwt.toDSSEBundle)(WDe(e),r,this.certificateChain)}};dO.DSSEBundleBuilder=v7;function WDe(t){return{...t,type:t.type??\"\"}}});var VDe=_(mO=>{\"use strict\";Object.defineProperty(mO,\"__esModule\",{value:!0});mO.MessageSignatureBundleBuilder=void 0;var hwt=C7(),gwt=B7(),S7=class extends hwt.BaseBundleBuilder{constructor(e){super(e)}async package(e,r){return(0,gwt.toMessageSignatureBundle)(e,r)}};mO.MessageSignatureBundleBuilder=S7});var JDe=_(Zw=>{\"use strict\";Object.defineProperty(Zw,\"__esModule\",{value:!0});Zw.MessageSignatureBundleBuilder=Zw.DSSEBundleBuilder=void 0;var dwt=YDe();Object.defineProperty(Zw,\"DSSEBundleBuilder\",{enumerable:!0,get:function(){return dwt.DSSEBundleBuilder}});var mwt=VDe();Object.defineProperty(Zw,\"MessageSignatureBundleBuilder\",{enumerable:!0,get:function(){return mwt.MessageSignatureBundleBuilder}})});var EO=_(yO=>{\"use strict\";Object.defineProperty(yO,\"__esModule\",{value:!0});yO.HTTPError=void 0;var D7=class extends Error{constructor({status:e,message:r,location:s}){super(`(${e}) ${r}`),this.statusCode=e,this.location=s}};yO.HTTPError=D7});var $w=_(Db=>{\"use strict\";Object.defineProperty(Db,\"__esModule\",{value:!0});Db.InternalError=void 0;Db.internalError=Ewt;var ywt=EO(),IO=class extends Error{constructor({code:e,message:r,cause:s}){super(r),this.name=this.constructor.name,this.cause=s,this.code=e}};Db.InternalError=IO;function Ewt(t,e,r){throw t instanceof ywt.HTTPError&&(r+=` - ${t.message}`),new IO({code:e,message:r,cause:t})}});var CO=_((Dnr,KDe)=>{KDe.exports=fetch});var zDe=_(e1=>{\"use strict\";var Iwt=e1&&e1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e1,\"__esModule\",{value:!0});e1.CIContextProvider=void 0;var Cwt=Iwt(CO()),wwt=[Bwt,vwt],b7=class{constructor(e=\"sigstore\"){this.audience=e}async getToken(){return Promise.any(wwt.map(e=>e(this.audience))).catch(()=>Promise.reject(\"CI: no tokens available\"))}};e1.CIContextProvider=b7;async function Bwt(t){if(!process.env.ACTIONS_ID_TOKEN_REQUEST_URL||!process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN)return Promise.reject(\"no token available\");let e=new URL(process.env.ACTIONS_ID_TOKEN_REQUEST_URL);return e.searchParams.append(\"audience\",t),(await(0,Cwt.default)(e.href,{retry:2,headers:{Accept:\"application/json\",Authorization:`Bearer ${process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN}`}})).json().then(s=>s.value)}async function vwt(){return process.env.SIGSTORE_ID_TOKEN?process.env.SIGSTORE_ID_TOKEN:Promise.reject(\"no token available\")}});var XDe=_(wO=>{\"use strict\";Object.defineProperty(wO,\"__esModule\",{value:!0});wO.CIContextProvider=void 0;var Swt=zDe();Object.defineProperty(wO,\"CIContextProvider\",{enumerable:!0,get:function(){return Swt.CIContextProvider}})});var $De=_((xnr,ZDe)=>{var Dwt=Symbol(\"proc-log.meta\");ZDe.exports={META:Dwt,output:{LEVELS:[\"standard\",\"error\",\"buffer\",\"flush\"],KEYS:{standard:\"standard\",error:\"error\",buffer:\"buffer\",flush:\"flush\"},standard:function(...t){return process.emit(\"output\",\"standard\",...t)},error:function(...t){return process.emit(\"output\",\"error\",...t)},buffer:function(...t){return process.emit(\"output\",\"buffer\",...t)},flush:function(...t){return process.emit(\"output\",\"flush\",...t)}},log:{LEVELS:[\"notice\",\"error\",\"warn\",\"info\",\"verbose\",\"http\",\"silly\",\"timing\",\"pause\",\"resume\"],KEYS:{notice:\"notice\",error:\"error\",warn:\"warn\",info:\"info\",verbose:\"verbose\",http:\"http\",silly:\"silly\",timing:\"timing\",pause:\"pause\",resume:\"resume\"},error:function(...t){return process.emit(\"log\",\"error\",...t)},notice:function(...t){return process.emit(\"log\",\"notice\",...t)},warn:function(...t){return process.emit(\"log\",\"warn\",...t)},info:function(...t){return process.emit(\"log\",\"info\",...t)},verbose:function(...t){return process.emit(\"log\",\"verbose\",...t)},http:function(...t){return process.emit(\"log\",\"http\",...t)},silly:function(...t){return process.emit(\"log\",\"silly\",...t)},timing:function(...t){return process.emit(\"log\",\"timing\",...t)},pause:function(){return process.emit(\"log\",\"pause\")},resume:function(){return process.emit(\"log\",\"resume\")}},time:{LEVELS:[\"start\",\"end\"],KEYS:{start:\"start\",end:\"end\"},start:function(t,e){process.emit(\"time\",\"start\",t);function r(){return process.emit(\"time\",\"end\",t)}if(typeof e==\"function\"){let s=e();return s&&s.finally?s.finally(r):(r(),s)}return r},end:function(t){return process.emit(\"time\",\"end\",t)}},input:{LEVELS:[\"start\",\"end\",\"read\"],KEYS:{start:\"start\",end:\"end\",read:\"read\"},start:function(t){process.emit(\"input\",\"start\");function e(){return process.emit(\"input\",\"end\")}if(typeof t==\"function\"){let r=t();return r&&r.finally?r.finally(e):(e(),r)}return e},end:function(){return process.emit(\"input\",\"end\")},read:function(...t){let e,r,s=new Promise((a,n)=>{e=a,r=n});return process.emit(\"input\",\"read\",e,r,...t),s}}}});var rbe=_((knr,tbe)=>{\"use strict\";function ebe(t,e){for(let r in e)Object.defineProperty(t,r,{value:e[r],enumerable:!0,configurable:!0});return t}function bwt(t,e,r){if(!t||typeof t==\"string\")throw new TypeError(\"Please pass an Error to err-code\");r||(r={}),typeof e==\"object\"&&(r=e,e=void 0),e!=null&&(r.code=e);try{return ebe(t,r)}catch{r.message=t.message,r.stack=t.stack;let a=function(){};return a.prototype=Object.create(Object.getPrototypeOf(t)),ebe(new a,r)}}tbe.exports=bwt});var ibe=_((Qnr,nbe)=>{function $c(t,e){typeof e==\"boolean\"&&(e={forever:e}),this._originalTimeouts=JSON.parse(JSON.stringify(t)),this._timeouts=t,this._options=e||{},this._maxRetryTime=e&&e.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._options.forever&&(this._cachedTimeouts=this._timeouts.slice(0))}nbe.exports=$c;$c.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts};$c.prototype.stop=function(){this._timeout&&clearTimeout(this._timeout),this._timeouts=[],this._cachedTimeouts=null};$c.prototype.retry=function(t){if(this._timeout&&clearTimeout(this._timeout),!t)return!1;var e=new Date().getTime();if(t&&e-this._operationStart>=this._maxRetryTime)return this._errors.unshift(new Error(\"RetryOperation timeout occurred\")),!1;this._errors.push(t);var r=this._timeouts.shift();if(r===void 0)if(this._cachedTimeouts)this._errors.splice(this._errors.length-1,this._errors.length),this._timeouts=this._cachedTimeouts.slice(0),r=this._timeouts.shift();else return!1;var s=this,a=setTimeout(function(){s._attempts++,s._operationTimeoutCb&&(s._timeout=setTimeout(function(){s._operationTimeoutCb(s._attempts)},s._operationTimeout),s._options.unref&&s._timeout.unref()),s._fn(s._attempts)},r);return this._options.unref&&a.unref(),!0};$c.prototype.attempt=function(t,e){this._fn=t,e&&(e.timeout&&(this._operationTimeout=e.timeout),e.cb&&(this._operationTimeoutCb=e.cb));var r=this;this._operationTimeoutCb&&(this._timeout=setTimeout(function(){r._operationTimeoutCb()},r._operationTimeout)),this._operationStart=new Date().getTime(),this._fn(this._attempts)};$c.prototype.try=function(t){console.log(\"Using RetryOperation.try() is deprecated\"),this.attempt(t)};$c.prototype.start=function(t){console.log(\"Using RetryOperation.start() is deprecated\"),this.attempt(t)};$c.prototype.start=$c.prototype.try;$c.prototype.errors=function(){return this._errors};$c.prototype.attempts=function(){return this._attempts};$c.prototype.mainError=function(){if(this._errors.length===0)return null;for(var t={},e=null,r=0,s=0;s<this._errors.length;s++){var a=this._errors[s],n=a.message,c=(t[n]||0)+1;t[n]=c,c>=r&&(e=a,r=c)}return e}});var sbe=_(iy=>{var Pwt=ibe();iy.operation=function(t){var e=iy.timeouts(t);return new Pwt(e,{forever:t&&t.forever,unref:t&&t.unref,maxRetryTime:t&&t.maxRetryTime})};iy.timeouts=function(t){if(t instanceof Array)return[].concat(t);var e={retries:10,factor:2,minTimeout:1*1e3,maxTimeout:1/0,randomize:!1};for(var r in t)e[r]=t[r];if(e.minTimeout>e.maxTimeout)throw new Error(\"minTimeout is greater than maxTimeout\");for(var s=[],a=0;a<e.retries;a++)s.push(this.createTimeout(a,e));return t&&t.forever&&!s.length&&s.push(this.createTimeout(a,e)),s.sort(function(n,c){return n-c}),s};iy.createTimeout=function(t,e){var r=e.randomize?Math.random()+1:1,s=Math.round(r*e.minTimeout*Math.pow(e.factor,t));return s=Math.min(s,e.maxTimeout),s};iy.wrap=function(t,e,r){if(e instanceof Array&&(r=e,e=null),!r){r=[];for(var s in t)typeof t[s]==\"function\"&&r.push(s)}for(var a=0;a<r.length;a++){var n=r[a],c=t[n];t[n]=function(p){var h=iy.operation(e),E=Array.prototype.slice.call(arguments,1),C=E.pop();E.push(function(S){h.retry(S)||(S&&(arguments[0]=h.mainError()),C.apply(this,arguments))}),h.attempt(function(){p.apply(t,E)})}.bind(t,c),t[n].options=e}}});var abe=_((Rnr,obe)=>{obe.exports=sbe()});var ube=_((Fnr,cbe)=>{\"use strict\";var xwt=rbe(),kwt=abe(),Qwt=Object.prototype.hasOwnProperty;function lbe(t){return t&&t.code===\"EPROMISERETRY\"&&Qwt.call(t,\"retried\")}function Twt(t,e){var r,s;return typeof t==\"object\"&&typeof e==\"function\"&&(r=e,e=t,t=r),s=kwt.operation(e),new Promise(function(a,n){s.attempt(function(c){Promise.resolve().then(function(){return t(function(f){throw lbe(f)&&(f=f.retried),xwt(new Error(\"Retrying\"),\"EPROMISERETRY\",{retried:f})},c)}).then(a,function(f){lbe(f)&&(f=f.retried,s.retry(f||new Error))||n(f)})})})}cbe.exports=Twt});var BO=_(bb=>{\"use strict\";var Abe=bb&&bb.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(bb,\"__esModule\",{value:!0});bb.fetchWithRetry=qwt;var Rwt=Ie(\"http2\"),Fwt=Abe(CO()),fbe=$De(),Nwt=Abe(ube()),Owt=vg(),Lwt=EO(),{HTTP2_HEADER_LOCATION:Mwt,HTTP2_HEADER_CONTENT_TYPE:Uwt,HTTP2_HEADER_USER_AGENT:_wt,HTTP_STATUS_INTERNAL_SERVER_ERROR:Hwt,HTTP_STATUS_TOO_MANY_REQUESTS:jwt,HTTP_STATUS_REQUEST_TIMEOUT:Gwt}=Rwt.constants;async function qwt(t,e){return(0,Nwt.default)(async(r,s)=>{let a=e.method||\"POST\",n={[_wt]:Owt.ua.getUserAgent(),...e.headers},c=await(0,Fwt.default)(t,{method:a,headers:n,body:e.body,timeout:e.timeout,retry:!1}).catch(f=>(fbe.log.http(\"fetch\",`${a} ${t} attempt ${s} failed with ${f}`),r(f)));if(c.ok)return c;{let f=await Wwt(c);if(fbe.log.http(\"fetch\",`${a} ${t} attempt ${s} failed with ${c.status}`),Ywt(c.status))return r(f);throw f}},Vwt(e.retry))}var Wwt=async t=>{let e=t.statusText,r=t.headers.get(Mwt)||void 0;if(t.headers.get(Uwt)?.includes(\"application/json\"))try{e=(await t.json()).message||e}catch{}return new Lwt.HTTPError({status:t.status,message:e,location:r})},Ywt=t=>[Gwt,jwt].includes(t)||t>=Hwt,Vwt=t=>typeof t==\"boolean\"?{retries:t?1:0}:typeof t==\"number\"?{retries:t}:{retries:0,...t}});var pbe=_(vO=>{\"use strict\";Object.defineProperty(vO,\"__esModule\",{value:!0});vO.Fulcio=void 0;var Jwt=BO(),P7=class{constructor(e){this.options=e}async createSigningCertificate(e){let{baseURL:r,retry:s,timeout:a}=this.options,n=`${r}/api/v2/signingCert`;return(await(0,Jwt.fetchWithRetry)(n,{headers:{\"Content-Type\":\"application/json\"},body:JSON.stringify(e),timeout:a,retry:s})).json()}};vO.Fulcio=P7});var hbe=_(SO=>{\"use strict\";Object.defineProperty(SO,\"__esModule\",{value:!0});SO.CAClient=void 0;var Kwt=$w(),zwt=pbe(),x7=class{constructor(e){this.fulcio=new zwt.Fulcio({baseURL:e.fulcioBaseURL,retry:e.retry,timeout:e.timeout})}async createSigningCertificate(e,r,s){let a=Xwt(e,r,s);try{let n=await this.fulcio.createSigningCertificate(a);return(n.signedCertificateEmbeddedSct?n.signedCertificateEmbeddedSct:n.signedCertificateDetachedSct).chain.certificates}catch(n){(0,Kwt.internalError)(n,\"CA_CREATE_SIGNING_CERTIFICATE_ERROR\",\"error creating signing certificate\")}}};SO.CAClient=x7;function Xwt(t,e,r){return{credentials:{oidcIdentityToken:t},publicKeyRequest:{publicKey:{algorithm:\"ECDSA\",content:e},proofOfPossession:r.toString(\"base64\")}}}});var dbe=_(t1=>{\"use strict\";var Zwt=t1&&t1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(t1,\"__esModule\",{value:!0});t1.EphemeralSigner=void 0;var gbe=Zwt(Ie(\"crypto\")),$wt=\"ec\",e1t=\"P-256\",k7=class{constructor(){this.keypair=gbe.default.generateKeyPairSync($wt,{namedCurve:e1t})}async sign(e){let r=gbe.default.sign(null,e,this.keypair.privateKey),s=this.keypair.publicKey.export({format:\"pem\",type:\"spki\"}).toString(\"ascii\");return{signature:r,key:{$case:\"publicKey\",publicKey:s}}}};t1.EphemeralSigner=k7});var mbe=_(sy=>{\"use strict\";Object.defineProperty(sy,\"__esModule\",{value:!0});sy.FulcioSigner=sy.DEFAULT_FULCIO_URL=void 0;var Q7=$w(),t1t=vg(),r1t=hbe(),n1t=dbe();sy.DEFAULT_FULCIO_URL=\"https://fulcio.sigstore.dev\";var T7=class{constructor(e){this.ca=new r1t.CAClient({...e,fulcioBaseURL:e.fulcioBaseURL||sy.DEFAULT_FULCIO_URL}),this.identityProvider=e.identityProvider,this.keyHolder=e.keyHolder||new n1t.EphemeralSigner}async sign(e){let r=await this.getIdentityToken(),s;try{s=t1t.oidc.extractJWTSubject(r)}catch(f){throw new Q7.InternalError({code:\"IDENTITY_TOKEN_PARSE_ERROR\",message:`invalid identity token: ${r}`,cause:f})}let a=await this.keyHolder.sign(Buffer.from(s));if(a.key.$case!==\"publicKey\")throw new Q7.InternalError({code:\"CA_CREATE_SIGNING_CERTIFICATE_ERROR\",message:\"unexpected format for signing key\"});let n=await this.ca.createSigningCertificate(r,a.key.publicKey,a.signature);return{signature:(await this.keyHolder.sign(e)).signature,key:{$case:\"x509Certificate\",certificate:n[0]}}}async getIdentityToken(){try{return await this.identityProvider.getToken()}catch(e){throw new Q7.InternalError({code:\"IDENTITY_TOKEN_READ_ERROR\",message:\"error retrieving identity token\",cause:e})}}};sy.FulcioSigner=T7});var Ebe=_(r1=>{\"use strict\";Object.defineProperty(r1,\"__esModule\",{value:!0});r1.FulcioSigner=r1.DEFAULT_FULCIO_URL=void 0;var ybe=mbe();Object.defineProperty(r1,\"DEFAULT_FULCIO_URL\",{enumerable:!0,get:function(){return ybe.DEFAULT_FULCIO_URL}});Object.defineProperty(r1,\"FulcioSigner\",{enumerable:!0,get:function(){return ybe.FulcioSigner}})});var wbe=_(DO=>{\"use strict\";Object.defineProperty(DO,\"__esModule\",{value:!0});DO.Rekor=void 0;var Ibe=BO(),R7=class{constructor(e){this.options=e}async createEntry(e){let{baseURL:r,timeout:s,retry:a}=this.options,n=`${r}/api/v1/log/entries`,f=await(await(0,Ibe.fetchWithRetry)(n,{headers:{\"Content-Type\":\"application/json\",Accept:\"application/json\"},body:JSON.stringify(e),timeout:s,retry:a})).json();return Cbe(f)}async getEntry(e){let{baseURL:r,timeout:s,retry:a}=this.options,n=`${r}/api/v1/log/entries/${e}`,f=await(await(0,Ibe.fetchWithRetry)(n,{method:\"GET\",headers:{Accept:\"application/json\"},timeout:s,retry:a})).json();return Cbe(f)}};DO.Rekor=R7;function Cbe(t){let e=Object.entries(t);if(e.length!=1)throw new Error(\"Received multiple entries in Rekor response\");let[r,s]=e[0];return{...s,uuid:r}}});var vbe=_(bO=>{\"use strict\";Object.defineProperty(bO,\"__esModule\",{value:!0});bO.TLogClient=void 0;var Bbe=$w(),i1t=EO(),s1t=wbe(),F7=class{constructor(e){this.fetchOnConflict=e.fetchOnConflict??!1,this.rekor=new s1t.Rekor({baseURL:e.rekorBaseURL,retry:e.retry,timeout:e.timeout})}async createEntry(e){let r;try{r=await this.rekor.createEntry(e)}catch(s){if(o1t(s)&&this.fetchOnConflict){let a=s.location.split(\"/\").pop()||\"\";try{r=await this.rekor.getEntry(a)}catch(n){(0,Bbe.internalError)(n,\"TLOG_FETCH_ENTRY_ERROR\",\"error fetching tlog entry\")}}else(0,Bbe.internalError)(s,\"TLOG_CREATE_ENTRY_ERROR\",\"error creating tlog entry\")}return r}};bO.TLogClient=F7;function o1t(t){return t instanceof i1t.HTTPError&&t.statusCode===409&&t.location!==void 0}});var Sbe=_(N7=>{\"use strict\";Object.defineProperty(N7,\"__esModule\",{value:!0});N7.toProposedEntry=l1t;var a1t=Ib(),Sg=vg(),Pb=\"sha256\";function l1t(t,e,r=\"dsse\"){switch(t.$case){case\"dsseEnvelope\":return r===\"intoto\"?f1t(t.dsseEnvelope,e):u1t(t.dsseEnvelope,e);case\"messageSignature\":return c1t(t.messageSignature,e)}}function c1t(t,e){let r=t.messageDigest.digest.toString(\"hex\"),s=t.signature.toString(\"base64\"),a=Sg.encoding.base64Encode(e);return{apiVersion:\"0.0.1\",kind:\"hashedrekord\",spec:{data:{hash:{algorithm:Pb,value:r}},signature:{content:s,publicKey:{content:a}}}}}function u1t(t,e){let r=JSON.stringify((0,a1t.envelopeToJSON)(t)),s=Sg.encoding.base64Encode(e);return{apiVersion:\"0.0.1\",kind:\"dsse\",spec:{proposedContent:{envelope:r,verifiers:[s]}}}}function f1t(t,e){let r=Sg.crypto.digest(Pb,t.payload).toString(\"hex\"),s=A1t(t,e),a=Sg.encoding.base64Encode(t.payload.toString(\"base64\")),n=Sg.encoding.base64Encode(t.signatures[0].sig.toString(\"base64\")),c=t.signatures[0].keyid,f=Sg.encoding.base64Encode(e),p={payloadType:t.payloadType,payload:a,signatures:[{sig:n,publicKey:f}]};return c.length>0&&(p.signatures[0].keyid=c),{apiVersion:\"0.0.2\",kind:\"intoto\",spec:{content:{envelope:p,hash:{algorithm:Pb,value:s},payloadHash:{algorithm:Pb,value:r}}}}}function A1t(t,e){let r={payloadType:t.payloadType,payload:t.payload.toString(\"base64\"),signatures:[{sig:t.signatures[0].sig.toString(\"base64\"),publicKey:e}]};return t.signatures[0].keyid.length>0&&(r.signatures[0].keyid=t.signatures[0].keyid),Sg.crypto.digest(Pb,Sg.json.canonicalize(r)).toString(\"hex\")}});var Dbe=_(oy=>{\"use strict\";Object.defineProperty(oy,\"__esModule\",{value:!0});oy.RekorWitness=oy.DEFAULT_REKOR_URL=void 0;var p1t=vg(),h1t=vbe(),g1t=Sbe();oy.DEFAULT_REKOR_URL=\"https://rekor.sigstore.dev\";var O7=class{constructor(e){this.entryType=e.entryType,this.tlog=new h1t.TLogClient({...e,rekorBaseURL:e.rekorBaseURL||oy.DEFAULT_REKOR_URL})}async testify(e,r){let s=(0,g1t.toProposedEntry)(e,r,this.entryType),a=await this.tlog.createEntry(s);return d1t(a)}};oy.RekorWitness=O7;function d1t(t){let e=Buffer.from(t.logID,\"hex\"),r=p1t.encoding.base64Decode(t.body),s=JSON.parse(r),a=t?.verification?.signedEntryTimestamp?m1t(t.verification.signedEntryTimestamp):void 0,n=t?.verification?.inclusionProof?y1t(t.verification.inclusionProof):void 0;return{tlogEntries:[{logIndex:t.logIndex.toString(),logId:{keyId:e},integratedTime:t.integratedTime.toString(),kindVersion:{kind:s.kind,version:s.apiVersion},inclusionPromise:a,inclusionProof:n,canonicalizedBody:Buffer.from(t.body,\"base64\")}]}}function m1t(t){return{signedEntryTimestamp:Buffer.from(t,\"base64\")}}function y1t(t){return{logIndex:t.logIndex.toString(),treeSize:t.treeSize.toString(),rootHash:Buffer.from(t.rootHash,\"hex\"),hashes:t.hashes.map(e=>Buffer.from(e,\"hex\")),checkpoint:{envelope:t.checkpoint}}}});var bbe=_(PO=>{\"use strict\";Object.defineProperty(PO,\"__esModule\",{value:!0});PO.TimestampAuthority=void 0;var E1t=BO(),L7=class{constructor(e){this.options=e}async createTimestamp(e){let{baseURL:r,timeout:s,retry:a}=this.options,n=`${r}/api/v1/timestamp`;return(await(0,E1t.fetchWithRetry)(n,{headers:{\"Content-Type\":\"application/json\"},body:JSON.stringify(e),timeout:s,retry:a})).buffer()}};PO.TimestampAuthority=L7});var xbe=_(xO=>{\"use strict\";Object.defineProperty(xO,\"__esModule\",{value:!0});xO.TSAClient=void 0;var I1t=$w(),C1t=bbe(),w1t=vg(),Pbe=\"sha256\",M7=class{constructor(e){this.tsa=new C1t.TimestampAuthority({baseURL:e.tsaBaseURL,retry:e.retry,timeout:e.timeout})}async createTimestamp(e){let r={artifactHash:w1t.crypto.digest(Pbe,e).toString(\"base64\"),hashAlgorithm:Pbe};try{return await this.tsa.createTimestamp(r)}catch(s){(0,I1t.internalError)(s,\"TSA_CREATE_TIMESTAMP_ERROR\",\"error creating timestamp\")}}};xO.TSAClient=M7});var kbe=_(kO=>{\"use strict\";Object.defineProperty(kO,\"__esModule\",{value:!0});kO.TSAWitness=void 0;var B1t=xbe(),U7=class{constructor(e){this.tsa=new B1t.TSAClient({tsaBaseURL:e.tsaBaseURL,retry:e.retry,timeout:e.timeout})}async testify(e){let r=v1t(e);return{rfc3161Timestamps:[{signedTimestamp:await this.tsa.createTimestamp(r)}]}}};kO.TSAWitness=U7;function v1t(t){switch(t.$case){case\"dsseEnvelope\":return t.dsseEnvelope.signatures[0].sig;case\"messageSignature\":return t.messageSignature.signature}}});var Tbe=_(Dg=>{\"use strict\";Object.defineProperty(Dg,\"__esModule\",{value:!0});Dg.TSAWitness=Dg.RekorWitness=Dg.DEFAULT_REKOR_URL=void 0;var Qbe=Dbe();Object.defineProperty(Dg,\"DEFAULT_REKOR_URL\",{enumerable:!0,get:function(){return Qbe.DEFAULT_REKOR_URL}});Object.defineProperty(Dg,\"RekorWitness\",{enumerable:!0,get:function(){return Qbe.RekorWitness}});var S1t=kbe();Object.defineProperty(Dg,\"TSAWitness\",{enumerable:!0,get:function(){return S1t.TSAWitness}})});var H7=_(ys=>{\"use strict\";Object.defineProperty(ys,\"__esModule\",{value:!0});ys.TSAWitness=ys.RekorWitness=ys.DEFAULT_REKOR_URL=ys.FulcioSigner=ys.DEFAULT_FULCIO_URL=ys.CIContextProvider=ys.InternalError=ys.MessageSignatureBundleBuilder=ys.DSSEBundleBuilder=void 0;var Rbe=JDe();Object.defineProperty(ys,\"DSSEBundleBuilder\",{enumerable:!0,get:function(){return Rbe.DSSEBundleBuilder}});Object.defineProperty(ys,\"MessageSignatureBundleBuilder\",{enumerable:!0,get:function(){return Rbe.MessageSignatureBundleBuilder}});var D1t=$w();Object.defineProperty(ys,\"InternalError\",{enumerable:!0,get:function(){return D1t.InternalError}});var b1t=XDe();Object.defineProperty(ys,\"CIContextProvider\",{enumerable:!0,get:function(){return b1t.CIContextProvider}});var Fbe=Ebe();Object.defineProperty(ys,\"DEFAULT_FULCIO_URL\",{enumerable:!0,get:function(){return Fbe.DEFAULT_FULCIO_URL}});Object.defineProperty(ys,\"FulcioSigner\",{enumerable:!0,get:function(){return Fbe.FulcioSigner}});var _7=Tbe();Object.defineProperty(ys,\"DEFAULT_REKOR_URL\",{enumerable:!0,get:function(){return _7.DEFAULT_REKOR_URL}});Object.defineProperty(ys,\"RekorWitness\",{enumerable:!0,get:function(){return _7.RekorWitness}});Object.defineProperty(ys,\"TSAWitness\",{enumerable:!0,get:function(){return _7.TSAWitness}})});var Obe=_(xb=>{\"use strict\";var Nbe=xb&&xb.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(xb,\"__esModule\",{value:!0});xb.appDataPath=x1t;var P1t=Nbe(Ie(\"os\")),n1=Nbe(Ie(\"path\"));function x1t(t){let e=P1t.default.homedir();switch(process.platform){case\"darwin\":{let r=n1.default.join(e,\"Library\",\"Application Support\");return n1.default.join(r,t)}case\"win32\":{let r=process.env.LOCALAPPDATA||n1.default.join(e,\"AppData\",\"Local\");return n1.default.join(r,t,\"Data\")}default:{let r=process.env.XDG_DATA_HOME||n1.default.join(e,\".local\",\"share\");return n1.default.join(r,t)}}}});var PA=_(wl=>{\"use strict\";Object.defineProperty(wl,\"__esModule\",{value:!0});wl.UnsupportedAlgorithmError=wl.CryptoError=wl.LengthOrHashMismatchError=wl.UnsignedMetadataError=wl.RepositoryError=wl.ValueError=void 0;var j7=class extends Error{};wl.ValueError=j7;var kb=class extends Error{};wl.RepositoryError=kb;var G7=class extends kb{};wl.UnsignedMetadataError=G7;var q7=class extends kb{};wl.LengthOrHashMismatchError=q7;var QO=class extends Error{};wl.CryptoError=QO;var W7=class extends QO{};wl.UnsupportedAlgorithmError=W7});var Mbe=_(bg=>{\"use strict\";Object.defineProperty(bg,\"__esModule\",{value:!0});bg.isDefined=k1t;bg.isObject=Lbe;bg.isStringArray=Q1t;bg.isObjectArray=T1t;bg.isStringRecord=R1t;bg.isObjectRecord=F1t;function k1t(t){return t!==void 0}function Lbe(t){return typeof t==\"object\"&&t!==null}function Q1t(t){return Array.isArray(t)&&t.every(e=>typeof e==\"string\")}function T1t(t){return Array.isArray(t)&&t.every(Lbe)}function R1t(t){return typeof t==\"object\"&&t!==null&&Object.keys(t).every(e=>typeof e==\"string\")&&Object.values(t).every(e=>typeof e==\"string\")}function F1t(t){return typeof t==\"object\"&&t!==null&&Object.keys(t).every(e=>typeof e==\"string\")&&Object.values(t).every(e=>typeof e==\"object\"&&e!==null)}});var V7=_(($nr,Hbe)=>{var Ube=\",\",N1t=\":\",O1t=\"[\",L1t=\"]\",M1t=\"{\",U1t=\"}\";function Y7(t){let e=[];if(typeof t==\"string\")e.push(_be(t));else if(typeof t==\"boolean\")e.push(JSON.stringify(t));else if(Number.isInteger(t))e.push(JSON.stringify(t));else if(t===null)e.push(JSON.stringify(t));else if(Array.isArray(t)){e.push(O1t);let r=!0;t.forEach(s=>{r||e.push(Ube),r=!1,e.push(Y7(s))}),e.push(L1t)}else if(typeof t==\"object\"){e.push(M1t);let r=!0;Object.keys(t).sort().forEach(s=>{r||e.push(Ube),r=!1,e.push(_be(s)),e.push(N1t),e.push(Y7(t[s]))}),e.push(U1t)}else throw new TypeError(\"cannot encode \"+t.toString());return e.join(\"\")}function _be(t){return'\"'+t.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"')+'\"'}Hbe.exports={canonicalize:Y7}});var jbe=_(i1=>{\"use strict\";var _1t=i1&&i1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(i1,\"__esModule\",{value:!0});i1.verifySignature=void 0;var H1t=V7(),j1t=_1t(Ie(\"crypto\")),G1t=(t,e,r)=>{let s=Buffer.from((0,H1t.canonicalize)(t));return j1t.default.verify(void 0,s,e,Buffer.from(r,\"hex\"))};i1.verifySignature=G1t});var ff=_(eu=>{\"use strict\";var q1t=eu&&eu.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||(\"get\"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),W1t=eu&&eu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),Gbe=eu&&eu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.prototype.hasOwnProperty.call(t,r)&&q1t(e,t,r);return W1t(e,t),e};Object.defineProperty(eu,\"__esModule\",{value:!0});eu.crypto=eu.guard=void 0;eu.guard=Gbe(Mbe());eu.crypto=Gbe(jbe())});var ay=_(hh=>{\"use strict\";var Y1t=hh&&hh.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(hh,\"__esModule\",{value:!0});hh.Signed=hh.MetadataKind=void 0;hh.isMetadataKind=J1t;var V1t=Y1t(Ie(\"util\")),Qb=PA(),J7=ff(),qbe=[\"1\",\"0\",\"31\"],K7;(function(t){t.Root=\"root\",t.Timestamp=\"timestamp\",t.Snapshot=\"snapshot\",t.Targets=\"targets\"})(K7||(hh.MetadataKind=K7={}));function J1t(t){return typeof t==\"string\"&&Object.values(K7).includes(t)}var z7=class t{constructor(e){this.specVersion=e.specVersion||qbe.join(\".\");let r=this.specVersion.split(\".\");if(!(r.length===2||r.length===3)||!r.every(s=>K1t(s)))throw new Qb.ValueError(\"Failed to parse specVersion\");if(r[0]!=qbe[0])throw new Qb.ValueError(\"Unsupported specVersion\");this.expires=e.expires,this.version=e.version,this.unrecognizedFields=e.unrecognizedFields||{}}equals(e){return e instanceof t?this.specVersion===e.specVersion&&this.expires===e.expires&&this.version===e.version&&V1t.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields):!1}isExpired(e){return e||(e=new Date),e>=new Date(this.expires)}static commonFieldsFromJSON(e){let{spec_version:r,expires:s,version:a,...n}=e;if(J7.guard.isDefined(r)){if(typeof r!=\"string\")throw new TypeError(\"spec_version must be a string\")}else throw new Qb.ValueError(\"spec_version is not defined\");if(J7.guard.isDefined(s)){if(typeof s!=\"string\")throw new TypeError(\"expires must be a string\")}else throw new Qb.ValueError(\"expires is not defined\");if(J7.guard.isDefined(a)){if(typeof a!=\"number\")throw new TypeError(\"version must be a number\")}else throw new Qb.ValueError(\"version is not defined\");return{specVersion:r,expires:s,version:a,unrecognizedFields:n}}};hh.Signed=z7;function K1t(t){return!isNaN(Number(t))}});var Tb=_(xg=>{\"use strict\";var Wbe=xg&&xg.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(xg,\"__esModule\",{value:!0});xg.TargetFile=xg.MetaFile=void 0;var Ybe=Wbe(Ie(\"crypto\")),RO=Wbe(Ie(\"util\")),Pg=PA(),TO=ff(),X7=class t{constructor(e){if(e.version<=0)throw new Pg.ValueError(\"Metafile version must be at least 1\");e.length!==void 0&&Vbe(e.length),this.version=e.version,this.length=e.length,this.hashes=e.hashes,this.unrecognizedFields=e.unrecognizedFields||{}}equals(e){return e instanceof t?this.version===e.version&&this.length===e.length&&RO.default.isDeepStrictEqual(this.hashes,e.hashes)&&RO.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields):!1}verify(e){if(this.length!==void 0&&e.length!==this.length)throw new Pg.LengthOrHashMismatchError(`Expected length ${this.length} but got ${e.length}`);this.hashes&&Object.entries(this.hashes).forEach(([r,s])=>{let a;try{a=Ybe.default.createHash(r)}catch{throw new Pg.LengthOrHashMismatchError(`Hash algorithm ${r} not supported`)}let n=a.update(e).digest(\"hex\");if(n!==s)throw new Pg.LengthOrHashMismatchError(`Expected hash ${s} but got ${n}`)})}toJSON(){let e={version:this.version,...this.unrecognizedFields};return this.length!==void 0&&(e.length=this.length),this.hashes&&(e.hashes=this.hashes),e}static fromJSON(e){let{version:r,length:s,hashes:a,...n}=e;if(typeof r!=\"number\")throw new TypeError(\"version must be a number\");if(TO.guard.isDefined(s)&&typeof s!=\"number\")throw new TypeError(\"length must be a number\");if(TO.guard.isDefined(a)&&!TO.guard.isStringRecord(a))throw new TypeError(\"hashes must be string keys and values\");return new t({version:r,length:s,hashes:a,unrecognizedFields:n})}};xg.MetaFile=X7;var Z7=class t{constructor(e){Vbe(e.length),this.length=e.length,this.path=e.path,this.hashes=e.hashes,this.unrecognizedFields=e.unrecognizedFields||{}}get custom(){let e=this.unrecognizedFields.custom;return!e||Array.isArray(e)||typeof e!=\"object\"?{}:e}equals(e){return e instanceof t?this.length===e.length&&this.path===e.path&&RO.default.isDeepStrictEqual(this.hashes,e.hashes)&&RO.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields):!1}async verify(e){let r=0,s=Object.keys(this.hashes).reduce((a,n)=>{try{a[n]=Ybe.default.createHash(n)}catch{throw new Pg.LengthOrHashMismatchError(`Hash algorithm ${n} not supported`)}return a},{});for await(let a of e)r+=a.length,Object.values(s).forEach(n=>{n.update(a)});if(r!==this.length)throw new Pg.LengthOrHashMismatchError(`Expected length ${this.length} but got ${r}`);Object.entries(s).forEach(([a,n])=>{let c=this.hashes[a],f=n.digest(\"hex\");if(f!==c)throw new Pg.LengthOrHashMismatchError(`Expected hash ${c} but got ${f}`)})}toJSON(){return{length:this.length,hashes:this.hashes,...this.unrecognizedFields}}static fromJSON(e,r){let{length:s,hashes:a,...n}=r;if(typeof s!=\"number\")throw new TypeError(\"length must be a number\");if(!TO.guard.isStringRecord(a))throw new TypeError(\"hashes must have string keys and values\");return new t({length:s,path:e,hashes:a,unrecognizedFields:n})}};xg.TargetFile=Z7;function Vbe(t){if(t<0)throw new Pg.ValueError(\"Length must be at least 0\")}});var Jbe=_($7=>{\"use strict\";Object.defineProperty($7,\"__esModule\",{value:!0});$7.encodeOIDString=X1t;var z1t=6;function X1t(t){let e=t.split(\".\"),r=parseInt(e[0],10)*40+parseInt(e[1],10),s=[];e.slice(2).forEach(n=>{let c=Z1t(parseInt(n,10));s.push(...c)});let a=Buffer.from([r,...s]);return Buffer.from([z1t,a.length,...a])}function Z1t(t){let e=[],r=0;for(;t>0;)e.unshift(t&127|r),t>>=7,r=128;return e}});var Zbe=_(Fb=>{\"use strict\";var $1t=Fb&&Fb.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Fb,\"__esModule\",{value:!0});Fb.getPublicKey=n2t;var s1=$1t(Ie(\"crypto\")),Rb=PA(),eJ=Jbe(),FO=48,Kbe=3,zbe=0,e2t=\"1.3.101.112\",t2t=\"1.2.840.10045.2.1\",r2t=\"1.2.840.10045.3.1.7\",tJ=\"-----BEGIN PUBLIC KEY-----\";function n2t(t){switch(t.keyType){case\"rsa\":return i2t(t);case\"ed25519\":return s2t(t);case\"ecdsa\":case\"ecdsa-sha2-nistp256\":case\"ecdsa-sha2-nistp384\":return o2t(t);default:throw new Rb.UnsupportedAlgorithmError(`Unsupported key type: ${t.keyType}`)}}function i2t(t){if(!t.keyVal.startsWith(tJ))throw new Rb.CryptoError(\"Invalid key format\");let e=s1.default.createPublicKey(t.keyVal);switch(t.scheme){case\"rsassa-pss-sha256\":return{key:e,padding:s1.default.constants.RSA_PKCS1_PSS_PADDING};default:throw new Rb.UnsupportedAlgorithmError(`Unsupported RSA scheme: ${t.scheme}`)}}function s2t(t){let e;if(t.keyVal.startsWith(tJ))e=s1.default.createPublicKey(t.keyVal);else{if(!Xbe(t.keyVal))throw new Rb.CryptoError(\"Invalid key format\");e=s1.default.createPublicKey({key:a2t.hexToDER(t.keyVal),format:\"der\",type:\"spki\"})}return{key:e}}function o2t(t){let e;if(t.keyVal.startsWith(tJ))e=s1.default.createPublicKey(t.keyVal);else{if(!Xbe(t.keyVal))throw new Rb.CryptoError(\"Invalid key format\");e=s1.default.createPublicKey({key:l2t.hexToDER(t.keyVal),format:\"der\",type:\"spki\"})}return{key:e}}var a2t={hexToDER:t=>{let e=Buffer.from(t,\"hex\"),r=(0,eJ.encodeOIDString)(e2t),s=Buffer.concat([Buffer.concat([Buffer.from([FO]),Buffer.from([r.length]),r]),Buffer.concat([Buffer.from([Kbe]),Buffer.from([e.length+1]),Buffer.from([zbe]),e])]);return Buffer.concat([Buffer.from([FO]),Buffer.from([s.length]),s])}},l2t={hexToDER:t=>{let e=Buffer.from(t,\"hex\"),r=Buffer.concat([Buffer.from([Kbe]),Buffer.from([e.length+1]),Buffer.from([zbe]),e]),s=Buffer.concat([(0,eJ.encodeOIDString)(t2t),(0,eJ.encodeOIDString)(r2t)]),a=Buffer.concat([Buffer.from([FO]),Buffer.from([s.length]),s]);return Buffer.concat([Buffer.from([FO]),Buffer.from([a.length+r.length]),a,r])}},Xbe=t=>/^[0-9a-fA-F]+$/.test(t)});var NO=_(o1=>{\"use strict\";var c2t=o1&&o1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(o1,\"__esModule\",{value:!0});o1.Key=void 0;var $be=c2t(Ie(\"util\")),Nb=PA(),ePe=ff(),u2t=Zbe(),rJ=class t{constructor(e){let{keyID:r,keyType:s,scheme:a,keyVal:n,unrecognizedFields:c}=e;this.keyID=r,this.keyType=s,this.scheme=a,this.keyVal=n,this.unrecognizedFields=c||{}}verifySignature(e){let r=e.signatures[this.keyID];if(!r)throw new Nb.UnsignedMetadataError(\"no signature for key found in metadata\");if(!this.keyVal.public)throw new Nb.UnsignedMetadataError(\"no public key found\");let s=(0,u2t.getPublicKey)({keyType:this.keyType,scheme:this.scheme,keyVal:this.keyVal.public}),a=e.signed.toJSON();try{if(!ePe.crypto.verifySignature(a,s,r.sig))throw new Nb.UnsignedMetadataError(`failed to verify ${this.keyID} signature`)}catch(n){throw n instanceof Nb.UnsignedMetadataError?n:new Nb.UnsignedMetadataError(`failed to verify ${this.keyID} signature`)}}equals(e){return e instanceof t?this.keyID===e.keyID&&this.keyType===e.keyType&&this.scheme===e.scheme&&$be.default.isDeepStrictEqual(this.keyVal,e.keyVal)&&$be.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields):!1}toJSON(){return{keytype:this.keyType,scheme:this.scheme,keyval:this.keyVal,...this.unrecognizedFields}}static fromJSON(e,r){let{keytype:s,scheme:a,keyval:n,...c}=r;if(typeof s!=\"string\")throw new TypeError(\"keytype must be a string\");if(typeof a!=\"string\")throw new TypeError(\"scheme must be a string\");if(!ePe.guard.isStringRecord(n))throw new TypeError(\"keyval must be a string record\");return new t({keyID:e,keyType:s,scheme:a,keyVal:n,unrecognizedFields:c})}};o1.Key=rJ});var sPe=_((air,iPe)=>{\"use strict\";iPe.exports=rPe;function rPe(t,e,r){t instanceof RegExp&&(t=tPe(t,r)),e instanceof RegExp&&(e=tPe(e,r));var s=nPe(t,e,r);return s&&{start:s[0],end:s[1],pre:r.slice(0,s[0]),body:r.slice(s[0]+t.length,s[1]),post:r.slice(s[1]+e.length)}}function tPe(t,e){var r=e.match(t);return r?r[0]:null}rPe.range=nPe;function nPe(t,e,r){var s,a,n,c,f,p=r.indexOf(t),h=r.indexOf(e,p+1),E=p;if(p>=0&&h>0){for(s=[],n=r.length;E>=0&&!f;)E==p?(s.push(E),p=r.indexOf(t,E+1)):s.length==1?f=[s.pop(),h]:(a=s.pop(),a<n&&(n=a,c=h),h=r.indexOf(e,E+1)),E=p<h&&p>=0?p:h;s.length&&(f=[n,c])}return f}});var pPe=_((lir,APe)=>{var oPe=sPe();APe.exports=p2t;var aPe=\"\\0SLASH\"+Math.random()+\"\\0\",lPe=\"\\0OPEN\"+Math.random()+\"\\0\",iJ=\"\\0CLOSE\"+Math.random()+\"\\0\",cPe=\"\\0COMMA\"+Math.random()+\"\\0\",uPe=\"\\0PERIOD\"+Math.random()+\"\\0\";function nJ(t){return parseInt(t,10)==t?parseInt(t,10):t.charCodeAt(0)}function f2t(t){return t.split(\"\\\\\\\\\").join(aPe).split(\"\\\\{\").join(lPe).split(\"\\\\}\").join(iJ).split(\"\\\\,\").join(cPe).split(\"\\\\.\").join(uPe)}function A2t(t){return t.split(aPe).join(\"\\\\\").split(lPe).join(\"{\").split(iJ).join(\"}\").split(cPe).join(\",\").split(uPe).join(\".\")}function fPe(t){if(!t)return[\"\"];var e=[],r=oPe(\"{\",\"}\",t);if(!r)return t.split(\",\");var s=r.pre,a=r.body,n=r.post,c=s.split(\",\");c[c.length-1]+=\"{\"+a+\"}\";var f=fPe(n);return n.length&&(c[c.length-1]+=f.shift(),c.push.apply(c,f)),e.push.apply(e,c),e}function p2t(t){return t?(t.substr(0,2)===\"{}\"&&(t=\"\\\\{\\\\}\"+t.substr(2)),Ob(f2t(t),!0).map(A2t)):[]}function h2t(t){return\"{\"+t+\"}\"}function g2t(t){return/^-?0\\d/.test(t)}function d2t(t,e){return t<=e}function m2t(t,e){return t>=e}function Ob(t,e){var r=[],s=oPe(\"{\",\"}\",t);if(!s)return[t];var a=s.pre,n=s.post.length?Ob(s.post,!1):[\"\"];if(/\\$$/.test(s.pre))for(var c=0;c<n.length;c++){var f=a+\"{\"+s.body+\"}\"+n[c];r.push(f)}else{var p=/^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(s.body),h=/^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(s.body),E=p||h,C=s.body.indexOf(\",\")>=0;if(!E&&!C)return s.post.match(/,.*\\}/)?(t=s.pre+\"{\"+s.body+iJ+s.post,Ob(t)):[t];var S;if(E)S=s.body.split(/\\.\\./);else if(S=fPe(s.body),S.length===1&&(S=Ob(S[0],!1).map(h2t),S.length===1))return n.map(function(Ce){return s.pre+S[0]+Ce});var P;if(E){var I=nJ(S[0]),R=nJ(S[1]),N=Math.max(S[0].length,S[1].length),U=S.length==3?Math.abs(nJ(S[2])):1,W=d2t,ee=R<I;ee&&(U*=-1,W=m2t);var ie=S.some(g2t);P=[];for(var ue=I;W(ue,R);ue+=U){var le;if(h)le=String.fromCharCode(ue),le===\"\\\\\"&&(le=\"\");else if(le=String(ue),ie){var me=N-le.length;if(me>0){var pe=new Array(me+1).join(\"0\");ue<0?le=\"-\"+pe+le.slice(1):le=pe+le}}P.push(le)}}else{P=[];for(var Be=0;Be<S.length;Be++)P.push.apply(P,Ob(S[Be],!1))}for(var Be=0;Be<P.length;Be++)for(var c=0;c<n.length;c++){var f=a+P[Be]+n[c];(!e||E||f)&&r.push(f)}}return r}});var hPe=_(OO=>{\"use strict\";Object.defineProperty(OO,\"__esModule\",{value:!0});OO.assertValidPattern=void 0;var y2t=1024*64,E2t=t=>{if(typeof t!=\"string\")throw new TypeError(\"invalid pattern\");if(t.length>y2t)throw new TypeError(\"pattern is too long\")};OO.assertValidPattern=E2t});var dPe=_(LO=>{\"use strict\";Object.defineProperty(LO,\"__esModule\",{value:!0});LO.parseClass=void 0;var I2t={\"[:alnum:]\":[\"\\\\p{L}\\\\p{Nl}\\\\p{Nd}\",!0],\"[:alpha:]\":[\"\\\\p{L}\\\\p{Nl}\",!0],\"[:ascii:]\":[\"\\\\x00-\\\\x7f\",!1],\"[:blank:]\":[\"\\\\p{Zs}\\\\t\",!0],\"[:cntrl:]\":[\"\\\\p{Cc}\",!0],\"[:digit:]\":[\"\\\\p{Nd}\",!0],\"[:graph:]\":[\"\\\\p{Z}\\\\p{C}\",!0,!0],\"[:lower:]\":[\"\\\\p{Ll}\",!0],\"[:print:]\":[\"\\\\p{C}\",!0],\"[:punct:]\":[\"\\\\p{P}\",!0],\"[:space:]\":[\"\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f\",!0],\"[:upper:]\":[\"\\\\p{Lu}\",!0],\"[:word:]\":[\"\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}\",!0],\"[:xdigit:]\":[\"A-Fa-f0-9\",!1]},Lb=t=>t.replace(/[[\\]\\\\-]/g,\"\\\\$&\"),C2t=t=>t.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\"\\\\$&\"),gPe=t=>t.join(\"\"),w2t=(t,e)=>{let r=e;if(t.charAt(r)!==\"[\")throw new Error(\"not in a brace expression\");let s=[],a=[],n=r+1,c=!1,f=!1,p=!1,h=!1,E=r,C=\"\";e:for(;n<t.length;){let R=t.charAt(n);if((R===\"!\"||R===\"^\")&&n===r+1){h=!0,n++;continue}if(R===\"]\"&&c&&!p){E=n+1;break}if(c=!0,R===\"\\\\\"&&!p){p=!0,n++;continue}if(R===\"[\"&&!p){for(let[N,[U,W,ee]]of Object.entries(I2t))if(t.startsWith(N,n)){if(C)return[\"$.\",!1,t.length-r,!0];n+=N.length,ee?a.push(U):s.push(U),f=f||W;continue e}}if(p=!1,C){R>C?s.push(Lb(C)+\"-\"+Lb(R)):R===C&&s.push(Lb(R)),C=\"\",n++;continue}if(t.startsWith(\"-]\",n+1)){s.push(Lb(R+\"-\")),n+=2;continue}if(t.startsWith(\"-\",n+1)){C=R,n+=2;continue}s.push(Lb(R)),n++}if(E<n)return[\"\",!1,0,!1];if(!s.length&&!a.length)return[\"$.\",!1,t.length-r,!0];if(a.length===0&&s.length===1&&/^\\\\?.$/.test(s[0])&&!h){let R=s[0].length===2?s[0].slice(-1):s[0];return[C2t(R),!1,E-r,!1]}let S=\"[\"+(h?\"^\":\"\")+gPe(s)+\"]\",P=\"[\"+(h?\"\":\"^\")+gPe(a)+\"]\";return[s.length&&a.length?\"(\"+S+\"|\"+P+\")\":s.length?S:P,f,E-r,!0]};LO.parseClass=w2t});var UO=_(MO=>{\"use strict\";Object.defineProperty(MO,\"__esModule\",{value:!0});MO.unescape=void 0;var B2t=(t,{windowsPathsNoEscape:e=!1}={})=>e?t.replace(/\\[([^\\/\\\\])\\]/g,\"$1\"):t.replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g,\"$1$2\").replace(/\\\\([^\\/])/g,\"$1\");MO.unescape=B2t});var aJ=_(jO=>{\"use strict\";Object.defineProperty(jO,\"__esModule\",{value:!0});jO.AST=void 0;var v2t=dPe(),_O=UO(),S2t=new Set([\"!\",\"?\",\"+\",\"*\",\"@\"]),mPe=t=>S2t.has(t),D2t=\"(?!(?:^|/)\\\\.\\\\.?(?:$|/))\",HO=\"(?!\\\\.)\",b2t=new Set([\"[\",\".\"]),P2t=new Set([\"..\",\".\"]),x2t=new Set(\"().*{}+?[]^$\\\\!\"),k2t=t=>t.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\"\\\\$&\"),oJ=\"[^/]\",yPe=oJ+\"*?\",EPe=oJ+\"+?\",sJ=class t{type;#t;#r;#i=!1;#e=[];#n;#o;#l;#a=!1;#s;#c;#f=!1;constructor(e,r,s={}){this.type=e,e&&(this.#r=!0),this.#n=r,this.#t=this.#n?this.#n.#t:this,this.#s=this.#t===this?s:this.#t.#s,this.#l=this.#t===this?[]:this.#t.#l,e===\"!\"&&!this.#t.#a&&this.#l.push(this),this.#o=this.#n?this.#n.#e.length:0}get hasMagic(){if(this.#r!==void 0)return this.#r;for(let e of this.#e)if(typeof e!=\"string\"&&(e.type||e.hasMagic))return this.#r=!0;return this.#r}toString(){return this.#c!==void 0?this.#c:this.type?this.#c=this.type+\"(\"+this.#e.map(e=>String(e)).join(\"|\")+\")\":this.#c=this.#e.map(e=>String(e)).join(\"\")}#p(){if(this!==this.#t)throw new Error(\"should only call on root\");if(this.#a)return this;this.toString(),this.#a=!0;let e;for(;e=this.#l.pop();){if(e.type!==\"!\")continue;let r=e,s=r.#n;for(;s;){for(let a=r.#o+1;!s.type&&a<s.#e.length;a++)for(let n of e.#e){if(typeof n==\"string\")throw new Error(\"string part in extglob AST??\");n.copyIn(s.#e[a])}r=s,s=r.#n}}return this}push(...e){for(let r of e)if(r!==\"\"){if(typeof r!=\"string\"&&!(r instanceof t&&r.#n===this))throw new Error(\"invalid part: \"+r);this.#e.push(r)}}toJSON(){let e=this.type===null?this.#e.slice().map(r=>typeof r==\"string\"?r:r.toJSON()):[this.type,...this.#e.map(r=>r.toJSON())];return this.isStart()&&!this.type&&e.unshift([]),this.isEnd()&&(this===this.#t||this.#t.#a&&this.#n?.type===\"!\")&&e.push({}),e}isStart(){if(this.#t===this)return!0;if(!this.#n?.isStart())return!1;if(this.#o===0)return!0;let e=this.#n;for(let r=0;r<this.#o;r++){let s=e.#e[r];if(!(s instanceof t&&s.type===\"!\"))return!1}return!0}isEnd(){if(this.#t===this||this.#n?.type===\"!\")return!0;if(!this.#n?.isEnd())return!1;if(!this.type)return this.#n?.isEnd();let e=this.#n?this.#n.#e.length:0;return this.#o===e-1}copyIn(e){typeof e==\"string\"?this.push(e):this.push(e.clone(this))}clone(e){let r=new t(this.type,e);for(let s of this.#e)r.copyIn(s);return r}static#u(e,r,s,a){let n=!1,c=!1,f=-1,p=!1;if(r.type===null){let P=s,I=\"\";for(;P<e.length;){let R=e.charAt(P++);if(n||R===\"\\\\\"){n=!n,I+=R;continue}if(c){P===f+1?(R===\"^\"||R===\"!\")&&(p=!0):R===\"]\"&&!(P===f+2&&p)&&(c=!1),I+=R;continue}else if(R===\"[\"){c=!0,f=P,p=!1,I+=R;continue}if(!a.noext&&mPe(R)&&e.charAt(P)===\"(\"){r.push(I),I=\"\";let N=new t(R,r);P=t.#u(e,N,P,a),r.push(N);continue}I+=R}return r.push(I),P}let h=s+1,E=new t(null,r),C=[],S=\"\";for(;h<e.length;){let P=e.charAt(h++);if(n||P===\"\\\\\"){n=!n,S+=P;continue}if(c){h===f+1?(P===\"^\"||P===\"!\")&&(p=!0):P===\"]\"&&!(h===f+2&&p)&&(c=!1),S+=P;continue}else if(P===\"[\"){c=!0,f=h,p=!1,S+=P;continue}if(mPe(P)&&e.charAt(h)===\"(\"){E.push(S),S=\"\";let I=new t(P,E);E.push(I),h=t.#u(e,I,h,a);continue}if(P===\"|\"){E.push(S),S=\"\",C.push(E),E=new t(null,r);continue}if(P===\")\")return S===\"\"&&r.#e.length===0&&(r.#f=!0),E.push(S),S=\"\",r.push(...C,E),h;S+=P}return r.type=null,r.#r=void 0,r.#e=[e.substring(s-1)],h}static fromGlob(e,r={}){let s=new t(null,void 0,r);return t.#u(e,s,0,r),s}toMMPattern(){if(this!==this.#t)return this.#t.toMMPattern();let e=this.toString(),[r,s,a,n]=this.toRegExpSource();if(!(a||this.#r||this.#s.nocase&&!this.#s.nocaseMagicOnly&&e.toUpperCase()!==e.toLowerCase()))return s;let f=(this.#s.nocase?\"i\":\"\")+(n?\"u\":\"\");return Object.assign(new RegExp(`^${r}$`,f),{_src:r,_glob:e})}get options(){return this.#s}toRegExpSource(e){let r=e??!!this.#s.dot;if(this.#t===this&&this.#p(),!this.type){let p=this.isStart()&&this.isEnd(),h=this.#e.map(P=>{let[I,R,N,U]=typeof P==\"string\"?t.#h(P,this.#r,p):P.toRegExpSource(e);return this.#r=this.#r||N,this.#i=this.#i||U,I}).join(\"\"),E=\"\";if(this.isStart()&&typeof this.#e[0]==\"string\"&&!(this.#e.length===1&&P2t.has(this.#e[0]))){let I=b2t,R=r&&I.has(h.charAt(0))||h.startsWith(\"\\\\.\")&&I.has(h.charAt(2))||h.startsWith(\"\\\\.\\\\.\")&&I.has(h.charAt(4)),N=!r&&!e&&I.has(h.charAt(0));E=R?D2t:N?HO:\"\"}let C=\"\";return this.isEnd()&&this.#t.#a&&this.#n?.type===\"!\"&&(C=\"(?:$|\\\\/)\"),[E+h+C,(0,_O.unescape)(h),this.#r=!!this.#r,this.#i]}let s=this.type===\"*\"||this.type===\"+\",a=this.type===\"!\"?\"(?:(?!(?:\":\"(?:\",n=this.#A(r);if(this.isStart()&&this.isEnd()&&!n&&this.type!==\"!\"){let p=this.toString();return this.#e=[p],this.type=null,this.#r=void 0,[p,(0,_O.unescape)(this.toString()),!1,!1]}let c=!s||e||r||!HO?\"\":this.#A(!0);c===n&&(c=\"\"),c&&(n=`(?:${n})(?:${c})*?`);let f=\"\";if(this.type===\"!\"&&this.#f)f=(this.isStart()&&!r?HO:\"\")+EPe;else{let p=this.type===\"!\"?\"))\"+(this.isStart()&&!r&&!e?HO:\"\")+yPe+\")\":this.type===\"@\"?\")\":this.type===\"?\"?\")?\":this.type===\"+\"&&c?\")\":this.type===\"*\"&&c?\")?\":`)${this.type}`;f=a+n+p}return[f,(0,_O.unescape)(n),this.#r=!!this.#r,this.#i]}#A(e){return this.#e.map(r=>{if(typeof r==\"string\")throw new Error(\"string type in extglob ast??\");let[s,a,n,c]=r.toRegExpSource(e);return this.#i=this.#i||c,s}).filter(r=>!(this.isStart()&&this.isEnd())||!!r).join(\"|\")}static#h(e,r,s=!1){let a=!1,n=\"\",c=!1;for(let f=0;f<e.length;f++){let p=e.charAt(f);if(a){a=!1,n+=(x2t.has(p)?\"\\\\\":\"\")+p;continue}if(p===\"\\\\\"){f===e.length-1?n+=\"\\\\\\\\\":a=!0;continue}if(p===\"[\"){let[h,E,C,S]=(0,v2t.parseClass)(e,f);if(C){n+=h,c=c||E,f+=C-1,r=r||S;continue}}if(p===\"*\"){s&&e===\"*\"?n+=EPe:n+=yPe,r=!0;continue}if(p===\"?\"){n+=oJ,r=!0;continue}n+=k2t(p)}return[n,(0,_O.unescape)(e),!!r,c]}};jO.AST=sJ});var lJ=_(GO=>{\"use strict\";Object.defineProperty(GO,\"__esModule\",{value:!0});GO.escape=void 0;var Q2t=(t,{windowsPathsNoEscape:e=!1}={})=>e?t.replace(/[?*()[\\]]/g,\"[$&]\"):t.replace(/[?*()[\\]\\\\]/g,\"\\\\$&\");GO.escape=Q2t});var DPe=_(pr=>{\"use strict\";var T2t=pr&&pr.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(pr,\"__esModule\",{value:!0});pr.unescape=pr.escape=pr.AST=pr.Minimatch=pr.match=pr.makeRe=pr.braceExpand=pr.defaults=pr.filter=pr.GLOBSTAR=pr.sep=pr.minimatch=void 0;var R2t=T2t(pPe()),qO=hPe(),wPe=aJ(),F2t=lJ(),N2t=UO(),O2t=(t,e,r={})=>((0,qO.assertValidPattern)(e),!r.nocomment&&e.charAt(0)===\"#\"?!1:new ly(e,r).match(t));pr.minimatch=O2t;var L2t=/^\\*+([^+@!?\\*\\[\\(]*)$/,M2t=t=>e=>!e.startsWith(\".\")&&e.endsWith(t),U2t=t=>e=>e.endsWith(t),_2t=t=>(t=t.toLowerCase(),e=>!e.startsWith(\".\")&&e.toLowerCase().endsWith(t)),H2t=t=>(t=t.toLowerCase(),e=>e.toLowerCase().endsWith(t)),j2t=/^\\*+\\.\\*+$/,G2t=t=>!t.startsWith(\".\")&&t.includes(\".\"),q2t=t=>t!==\".\"&&t!==\"..\"&&t.includes(\".\"),W2t=/^\\.\\*+$/,Y2t=t=>t!==\".\"&&t!==\"..\"&&t.startsWith(\".\"),V2t=/^\\*+$/,J2t=t=>t.length!==0&&!t.startsWith(\".\"),K2t=t=>t.length!==0&&t!==\".\"&&t!==\"..\",z2t=/^\\?+([^+@!?\\*\\[\\(]*)?$/,X2t=([t,e=\"\"])=>{let r=BPe([t]);return e?(e=e.toLowerCase(),s=>r(s)&&s.toLowerCase().endsWith(e)):r},Z2t=([t,e=\"\"])=>{let r=vPe([t]);return e?(e=e.toLowerCase(),s=>r(s)&&s.toLowerCase().endsWith(e)):r},$2t=([t,e=\"\"])=>{let r=vPe([t]);return e?s=>r(s)&&s.endsWith(e):r},eBt=([t,e=\"\"])=>{let r=BPe([t]);return e?s=>r(s)&&s.endsWith(e):r},BPe=([t])=>{let e=t.length;return r=>r.length===e&&!r.startsWith(\".\")},vPe=([t])=>{let e=t.length;return r=>r.length===e&&r!==\".\"&&r!==\"..\"},SPe=typeof process==\"object\"&&process?typeof process.env==\"object\"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:\"posix\",IPe={win32:{sep:\"\\\\\"},posix:{sep:\"/\"}};pr.sep=SPe===\"win32\"?IPe.win32.sep:IPe.posix.sep;pr.minimatch.sep=pr.sep;pr.GLOBSTAR=Symbol(\"globstar **\");pr.minimatch.GLOBSTAR=pr.GLOBSTAR;var tBt=\"[^/]\",rBt=tBt+\"*?\",nBt=\"(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?\",iBt=\"(?:(?!(?:\\\\/|^)\\\\.).)*?\",sBt=(t,e={})=>r=>(0,pr.minimatch)(r,t,e);pr.filter=sBt;pr.minimatch.filter=pr.filter;var tu=(t,e={})=>Object.assign({},t,e),oBt=t=>{if(!t||typeof t!=\"object\"||!Object.keys(t).length)return pr.minimatch;let e=pr.minimatch;return Object.assign((s,a,n={})=>e(s,a,tu(t,n)),{Minimatch:class extends e.Minimatch{constructor(a,n={}){super(a,tu(t,n))}static defaults(a){return e.defaults(tu(t,a)).Minimatch}},AST:class extends e.AST{constructor(a,n,c={}){super(a,n,tu(t,c))}static fromGlob(a,n={}){return e.AST.fromGlob(a,tu(t,n))}},unescape:(s,a={})=>e.unescape(s,tu(t,a)),escape:(s,a={})=>e.escape(s,tu(t,a)),filter:(s,a={})=>e.filter(s,tu(t,a)),defaults:s=>e.defaults(tu(t,s)),makeRe:(s,a={})=>e.makeRe(s,tu(t,a)),braceExpand:(s,a={})=>e.braceExpand(s,tu(t,a)),match:(s,a,n={})=>e.match(s,a,tu(t,n)),sep:e.sep,GLOBSTAR:pr.GLOBSTAR})};pr.defaults=oBt;pr.minimatch.defaults=pr.defaults;var aBt=(t,e={})=>((0,qO.assertValidPattern)(t),e.nobrace||!/\\{(?:(?!\\{).)*\\}/.test(t)?[t]:(0,R2t.default)(t));pr.braceExpand=aBt;pr.minimatch.braceExpand=pr.braceExpand;var lBt=(t,e={})=>new ly(t,e).makeRe();pr.makeRe=lBt;pr.minimatch.makeRe=pr.makeRe;var cBt=(t,e,r={})=>{let s=new ly(e,r);return t=t.filter(a=>s.match(a)),s.options.nonull&&!t.length&&t.push(e),t};pr.match=cBt;pr.minimatch.match=pr.match;var CPe=/[?*]|[+@!]\\(.*?\\)|\\[|\\]/,uBt=t=>t.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\"\\\\$&\"),ly=class{options;set;pattern;windowsPathsNoEscape;nonegate;negate;comment;empty;preserveMultipleSlashes;partial;globSet;globParts;nocase;isWindows;platform;windowsNoMagicRoot;regexp;constructor(e,r={}){(0,qO.assertValidPattern)(e),r=r||{},this.options=r,this.pattern=e,this.platform=r.platform||SPe,this.isWindows=this.platform===\"win32\",this.windowsPathsNoEscape=!!r.windowsPathsNoEscape||r.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(this.pattern=this.pattern.replace(/\\\\/g,\"/\")),this.preserveMultipleSlashes=!!r.preserveMultipleSlashes,this.regexp=null,this.negate=!1,this.nonegate=!!r.nonegate,this.comment=!1,this.empty=!1,this.partial=!!r.partial,this.nocase=!!this.options.nocase,this.windowsNoMagicRoot=r.windowsNoMagicRoot!==void 0?r.windowsNoMagicRoot:!!(this.isWindows&&this.nocase),this.globSet=[],this.globParts=[],this.set=[],this.make()}hasMagic(){if(this.options.magicalBraces&&this.set.length>1)return!0;for(let e of this.set)for(let r of e)if(typeof r!=\"string\")return!0;return!1}debug(...e){}make(){let e=this.pattern,r=this.options;if(!r.nocomment&&e.charAt(0)===\"#\"){this.comment=!0;return}if(!e){this.empty=!0;return}this.parseNegate(),this.globSet=[...new Set(this.braceExpand())],r.debug&&(this.debug=(...n)=>console.error(...n)),this.debug(this.pattern,this.globSet);let s=this.globSet.map(n=>this.slashSplit(n));this.globParts=this.preprocess(s),this.debug(this.pattern,this.globParts);let a=this.globParts.map((n,c,f)=>{if(this.isWindows&&this.windowsNoMagicRoot){let p=n[0]===\"\"&&n[1]===\"\"&&(n[2]===\"?\"||!CPe.test(n[2]))&&!CPe.test(n[3]),h=/^[a-z]:/i.test(n[0]);if(p)return[...n.slice(0,4),...n.slice(4).map(E=>this.parse(E))];if(h)return[n[0],...n.slice(1).map(E=>this.parse(E))]}return n.map(p=>this.parse(p))});if(this.debug(this.pattern,a),this.set=a.filter(n=>n.indexOf(!1)===-1),this.isWindows)for(let n=0;n<this.set.length;n++){let c=this.set[n];c[0]===\"\"&&c[1]===\"\"&&this.globParts[n][2]===\"?\"&&typeof c[3]==\"string\"&&/^[a-z]:$/i.test(c[3])&&(c[2]=\"?\")}this.debug(this.pattern,this.set)}preprocess(e){if(this.options.noglobstar)for(let s=0;s<e.length;s++)for(let a=0;a<e[s].length;a++)e[s][a]===\"**\"&&(e[s][a]=\"*\");let{optimizationLevel:r=1}=this.options;return r>=2?(e=this.firstPhasePreProcess(e),e=this.secondPhasePreProcess(e)):r>=1?e=this.levelOneOptimize(e):e=this.adjascentGlobstarOptimize(e),e}adjascentGlobstarOptimize(e){return e.map(r=>{let s=-1;for(;(s=r.indexOf(\"**\",s+1))!==-1;){let a=s;for(;r[a+1]===\"**\";)a++;a!==s&&r.splice(s,a-s)}return r})}levelOneOptimize(e){return e.map(r=>(r=r.reduce((s,a)=>{let n=s[s.length-1];return a===\"**\"&&n===\"**\"?s:a===\"..\"&&n&&n!==\"..\"&&n!==\".\"&&n!==\"**\"?(s.pop(),s):(s.push(a),s)},[]),r.length===0?[\"\"]:r))}levelTwoFileOptimize(e){Array.isArray(e)||(e=this.slashSplit(e));let r=!1;do{if(r=!1,!this.preserveMultipleSlashes){for(let a=1;a<e.length-1;a++){let n=e[a];a===1&&n===\"\"&&e[0]===\"\"||(n===\".\"||n===\"\")&&(r=!0,e.splice(a,1),a--)}e[0]===\".\"&&e.length===2&&(e[1]===\".\"||e[1]===\"\")&&(r=!0,e.pop())}let s=0;for(;(s=e.indexOf(\"..\",s+1))!==-1;){let a=e[s-1];a&&a!==\".\"&&a!==\"..\"&&a!==\"**\"&&(r=!0,e.splice(s-1,2),s-=2)}}while(r);return e.length===0?[\"\"]:e}firstPhasePreProcess(e){let r=!1;do{r=!1;for(let s of e){let a=-1;for(;(a=s.indexOf(\"**\",a+1))!==-1;){let c=a;for(;s[c+1]===\"**\";)c++;c>a&&s.splice(a+1,c-a);let f=s[a+1],p=s[a+2],h=s[a+3];if(f!==\"..\"||!p||p===\".\"||p===\"..\"||!h||h===\".\"||h===\"..\")continue;r=!0,s.splice(a,1);let E=s.slice(0);E[a]=\"**\",e.push(E),a--}if(!this.preserveMultipleSlashes){for(let c=1;c<s.length-1;c++){let f=s[c];c===1&&f===\"\"&&s[0]===\"\"||(f===\".\"||f===\"\")&&(r=!0,s.splice(c,1),c--)}s[0]===\".\"&&s.length===2&&(s[1]===\".\"||s[1]===\"\")&&(r=!0,s.pop())}let n=0;for(;(n=s.indexOf(\"..\",n+1))!==-1;){let c=s[n-1];if(c&&c!==\".\"&&c!==\"..\"&&c!==\"**\"){r=!0;let p=n===1&&s[n+1]===\"**\"?[\".\"]:[];s.splice(n-1,2,...p),s.length===0&&s.push(\"\"),n-=2}}}}while(r);return e}secondPhasePreProcess(e){for(let r=0;r<e.length-1;r++)for(let s=r+1;s<e.length;s++){let a=this.partsMatch(e[r],e[s],!this.preserveMultipleSlashes);if(a){e[r]=[],e[s]=a;break}}return e.filter(r=>r.length)}partsMatch(e,r,s=!1){let a=0,n=0,c=[],f=\"\";for(;a<e.length&&n<r.length;)if(e[a]===r[n])c.push(f===\"b\"?r[n]:e[a]),a++,n++;else if(s&&e[a]===\"**\"&&r[n]===e[a+1])c.push(e[a]),a++;else if(s&&r[n]===\"**\"&&e[a]===r[n+1])c.push(r[n]),n++;else if(e[a]===\"*\"&&r[n]&&(this.options.dot||!r[n].startsWith(\".\"))&&r[n]!==\"**\"){if(f===\"b\")return!1;f=\"a\",c.push(e[a]),a++,n++}else if(r[n]===\"*\"&&e[a]&&(this.options.dot||!e[a].startsWith(\".\"))&&e[a]!==\"**\"){if(f===\"a\")return!1;f=\"b\",c.push(r[n]),a++,n++}else return!1;return e.length===r.length&&c}parseNegate(){if(this.nonegate)return;let e=this.pattern,r=!1,s=0;for(let a=0;a<e.length&&e.charAt(a)===\"!\";a++)r=!r,s++;s&&(this.pattern=e.slice(s)),this.negate=r}matchOne(e,r,s=!1){let a=this.options;if(this.isWindows){let R=typeof e[0]==\"string\"&&/^[a-z]:$/i.test(e[0]),N=!R&&e[0]===\"\"&&e[1]===\"\"&&e[2]===\"?\"&&/^[a-z]:$/i.test(e[3]),U=typeof r[0]==\"string\"&&/^[a-z]:$/i.test(r[0]),W=!U&&r[0]===\"\"&&r[1]===\"\"&&r[2]===\"?\"&&typeof r[3]==\"string\"&&/^[a-z]:$/i.test(r[3]),ee=N?3:R?0:void 0,ie=W?3:U?0:void 0;if(typeof ee==\"number\"&&typeof ie==\"number\"){let[ue,le]=[e[ee],r[ie]];ue.toLowerCase()===le.toLowerCase()&&(r[ie]=ue,ie>ee?r=r.slice(ie):ee>ie&&(e=e.slice(ee)))}}let{optimizationLevel:n=1}=this.options;n>=2&&(e=this.levelTwoFileOptimize(e)),this.debug(\"matchOne\",this,{file:e,pattern:r}),this.debug(\"matchOne\",e.length,r.length);for(var c=0,f=0,p=e.length,h=r.length;c<p&&f<h;c++,f++){this.debug(\"matchOne loop\");var E=r[f],C=e[c];if(this.debug(r,E,C),E===!1)return!1;if(E===pr.GLOBSTAR){this.debug(\"GLOBSTAR\",[r,E,C]);var S=c,P=f+1;if(P===h){for(this.debug(\"** at the end\");c<p;c++)if(e[c]===\".\"||e[c]===\"..\"||!a.dot&&e[c].charAt(0)===\".\")return!1;return!0}for(;S<p;){var I=e[S];if(this.debug(`\nglobstar while`,e,S,r,P,I),this.matchOne(e.slice(S),r.slice(P),s))return this.debug(\"globstar found match!\",S,p,I),!0;if(I===\".\"||I===\"..\"||!a.dot&&I.charAt(0)===\".\"){this.debug(\"dot detected!\",e,S,r,P);break}this.debug(\"globstar swallow a segment, and continue\"),S++}return!!(s&&(this.debug(`\n>>> no match, partial?`,e,S,r,P),S===p))}let R;if(typeof E==\"string\"?(R=C===E,this.debug(\"string match\",E,C,R)):(R=E.test(C),this.debug(\"pattern match\",E,C,R)),!R)return!1}if(c===p&&f===h)return!0;if(c===p)return s;if(f===h)return c===p-1&&e[c]===\"\";throw new Error(\"wtf?\")}braceExpand(){return(0,pr.braceExpand)(this.pattern,this.options)}parse(e){(0,qO.assertValidPattern)(e);let r=this.options;if(e===\"**\")return pr.GLOBSTAR;if(e===\"\")return\"\";let s,a=null;(s=e.match(V2t))?a=r.dot?K2t:J2t:(s=e.match(L2t))?a=(r.nocase?r.dot?H2t:_2t:r.dot?U2t:M2t)(s[1]):(s=e.match(z2t))?a=(r.nocase?r.dot?Z2t:X2t:r.dot?$2t:eBt)(s):(s=e.match(j2t))?a=r.dot?q2t:G2t:(s=e.match(W2t))&&(a=Y2t);let n=wPe.AST.fromGlob(e,this.options).toMMPattern();return a&&typeof n==\"object\"&&Reflect.defineProperty(n,\"test\",{value:a}),n}makeRe(){if(this.regexp||this.regexp===!1)return this.regexp;let e=this.set;if(!e.length)return this.regexp=!1,this.regexp;let r=this.options,s=r.noglobstar?rBt:r.dot?nBt:iBt,a=new Set(r.nocase?[\"i\"]:[]),n=e.map(p=>{let h=p.map(E=>{if(E instanceof RegExp)for(let C of E.flags.split(\"\"))a.add(C);return typeof E==\"string\"?uBt(E):E===pr.GLOBSTAR?pr.GLOBSTAR:E._src});return h.forEach((E,C)=>{let S=h[C+1],P=h[C-1];E!==pr.GLOBSTAR||P===pr.GLOBSTAR||(P===void 0?S!==void 0&&S!==pr.GLOBSTAR?h[C+1]=\"(?:\\\\/|\"+s+\"\\\\/)?\"+S:h[C]=s:S===void 0?h[C-1]=P+\"(?:\\\\/|\"+s+\")?\":S!==pr.GLOBSTAR&&(h[C-1]=P+\"(?:\\\\/|\\\\/\"+s+\"\\\\/)\"+S,h[C+1]=pr.GLOBSTAR))}),h.filter(E=>E!==pr.GLOBSTAR).join(\"/\")}).join(\"|\"),[c,f]=e.length>1?[\"(?:\",\")\"]:[\"\",\"\"];n=\"^\"+c+n+f+\"$\",this.negate&&(n=\"^(?!\"+n+\").+$\");try{this.regexp=new RegExp(n,[...a].join(\"\"))}catch{this.regexp=!1}return this.regexp}slashSplit(e){return this.preserveMultipleSlashes?e.split(\"/\"):this.isWindows&&/^\\/\\/[^\\/]+/.test(e)?[\"\",...e.split(/\\/+/)]:e.split(/\\/+/)}match(e,r=this.partial){if(this.debug(\"match\",e,this.pattern),this.comment)return!1;if(this.empty)return e===\"\";if(e===\"/\"&&r)return!0;let s=this.options;this.isWindows&&(e=e.split(\"\\\\\").join(\"/\"));let a=this.slashSplit(e);this.debug(this.pattern,\"split\",a);let n=this.set;this.debug(this.pattern,\"set\",n);let c=a[a.length-1];if(!c)for(let f=a.length-2;!c&&f>=0;f--)c=a[f];for(let f=0;f<n.length;f++){let p=n[f],h=a;if(s.matchBase&&p.length===1&&(h=[c]),this.matchOne(h,p,r))return s.flipNegate?!0:!this.negate}return s.flipNegate?!1:this.negate}static defaults(e){return pr.minimatch.defaults(e).Minimatch}};pr.Minimatch=ly;var fBt=aJ();Object.defineProperty(pr,\"AST\",{enumerable:!0,get:function(){return fBt.AST}});var ABt=lJ();Object.defineProperty(pr,\"escape\",{enumerable:!0,get:function(){return ABt.escape}});var pBt=UO();Object.defineProperty(pr,\"unescape\",{enumerable:!0,get:function(){return pBt.unescape}});pr.minimatch.AST=wPe.AST;pr.minimatch.Minimatch=ly;pr.minimatch.escape=F2t.escape;pr.minimatch.unescape=N2t.unescape});var fJ=_(ru=>{\"use strict\";var bPe=ru&&ru.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ru,\"__esModule\",{value:!0});ru.SuccinctRoles=ru.DelegatedRole=ru.Role=ru.TOP_LEVEL_ROLE_NAMES=void 0;var PPe=bPe(Ie(\"crypto\")),hBt=DPe(),WO=bPe(Ie(\"util\")),YO=PA(),cy=ff();ru.TOP_LEVEL_ROLE_NAMES=[\"root\",\"targets\",\"snapshot\",\"timestamp\"];var Mb=class t{constructor(e){let{keyIDs:r,threshold:s,unrecognizedFields:a}=e;if(gBt(r))throw new YO.ValueError(\"duplicate key IDs found\");if(s<1)throw new YO.ValueError(\"threshold must be at least 1\");this.keyIDs=r,this.threshold=s,this.unrecognizedFields=a||{}}equals(e){return e instanceof t?this.threshold===e.threshold&&WO.default.isDeepStrictEqual(this.keyIDs,e.keyIDs)&&WO.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields):!1}toJSON(){return{keyids:this.keyIDs,threshold:this.threshold,...this.unrecognizedFields}}static fromJSON(e){let{keyids:r,threshold:s,...a}=e;if(!cy.guard.isStringArray(r))throw new TypeError(\"keyids must be an array\");if(typeof s!=\"number\")throw new TypeError(\"threshold must be a number\");return new t({keyIDs:r,threshold:s,unrecognizedFields:a})}};ru.Role=Mb;function gBt(t){return new Set(t).size!==t.length}var cJ=class t extends Mb{constructor(e){super(e);let{name:r,terminating:s,paths:a,pathHashPrefixes:n}=e;if(this.name=r,this.terminating=s,e.paths&&e.pathHashPrefixes)throw new YO.ValueError(\"paths and pathHashPrefixes are mutually exclusive\");this.paths=a,this.pathHashPrefixes=n}equals(e){return e instanceof t?super.equals(e)&&this.name===e.name&&this.terminating===e.terminating&&WO.default.isDeepStrictEqual(this.paths,e.paths)&&WO.default.isDeepStrictEqual(this.pathHashPrefixes,e.pathHashPrefixes):!1}isDelegatedPath(e){if(this.paths)return this.paths.some(r=>mBt(e,r));if(this.pathHashPrefixes){let s=PPe.default.createHash(\"sha256\").update(e).digest(\"hex\");return this.pathHashPrefixes.some(a=>s.startsWith(a))}return!1}toJSON(){let e={...super.toJSON(),name:this.name,terminating:this.terminating};return this.paths&&(e.paths=this.paths),this.pathHashPrefixes&&(e.path_hash_prefixes=this.pathHashPrefixes),e}static fromJSON(e){let{keyids:r,threshold:s,name:a,terminating:n,paths:c,path_hash_prefixes:f,...p}=e;if(!cy.guard.isStringArray(r))throw new TypeError(\"keyids must be an array of strings\");if(typeof s!=\"number\")throw new TypeError(\"threshold must be a number\");if(typeof a!=\"string\")throw new TypeError(\"name must be a string\");if(typeof n!=\"boolean\")throw new TypeError(\"terminating must be a boolean\");if(cy.guard.isDefined(c)&&!cy.guard.isStringArray(c))throw new TypeError(\"paths must be an array of strings\");if(cy.guard.isDefined(f)&&!cy.guard.isStringArray(f))throw new TypeError(\"path_hash_prefixes must be an array of strings\");return new t({keyIDs:r,threshold:s,name:a,terminating:n,paths:c,pathHashPrefixes:f,unrecognizedFields:p})}};ru.DelegatedRole=cJ;var dBt=(t,e)=>t.map((r,s)=>[r,e[s]]);function mBt(t,e){let r=t.split(\"/\"),s=e.split(\"/\");return s.length!=r.length?!1:dBt(r,s).every(([a,n])=>(0,hBt.minimatch)(a,n))}var uJ=class t extends Mb{constructor(e){super(e);let{bitLength:r,namePrefix:s}=e;if(r<=0||r>32)throw new YO.ValueError(\"bitLength must be between 1 and 32\");this.bitLength=r,this.namePrefix=s,this.numberOfBins=Math.pow(2,r),this.suffixLen=(this.numberOfBins-1).toString(16).length}equals(e){return e instanceof t?super.equals(e)&&this.bitLength===e.bitLength&&this.namePrefix===e.namePrefix:!1}getRoleForTarget(e){let a=PPe.default.createHash(\"sha256\").update(e).digest().subarray(0,4),n=32-this.bitLength,f=(a.readUInt32BE()>>>n).toString(16).padStart(this.suffixLen,\"0\");return`${this.namePrefix}-${f}`}*getRoles(){for(let e=0;e<this.numberOfBins;e++){let r=e.toString(16).padStart(this.suffixLen,\"0\");yield`${this.namePrefix}-${r}`}}isDelegatedRole(e){let r=this.namePrefix+\"-\";if(!e.startsWith(r))return!1;let s=e.slice(r.length,e.length);if(s.length!=this.suffixLen||!s.match(/^[0-9a-fA-F]+$/))return!1;let a=parseInt(s,16);return 0<=a&&a<this.numberOfBins}toJSON(){return{...super.toJSON(),bit_length:this.bitLength,name_prefix:this.namePrefix}}static fromJSON(e){let{keyids:r,threshold:s,bit_length:a,name_prefix:n,...c}=e;if(!cy.guard.isStringArray(r))throw new TypeError(\"keyids must be an array of strings\");if(typeof s!=\"number\")throw new TypeError(\"threshold must be a number\");if(typeof a!=\"number\")throw new TypeError(\"bit_length must be a number\");if(typeof n!=\"string\")throw new TypeError(\"name_prefix must be a string\");return new t({keyIDs:r,threshold:s,bitLength:a,namePrefix:n,unrecognizedFields:c})}};ru.SuccinctRoles=uJ});var hJ=_(a1=>{\"use strict\";var yBt=a1&&a1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(a1,\"__esModule\",{value:!0});a1.Root=void 0;var xPe=yBt(Ie(\"util\")),AJ=ay(),kPe=PA(),EBt=NO(),VO=fJ(),JO=ff(),pJ=class t extends AJ.Signed{constructor(e){if(super(e),this.type=AJ.MetadataKind.Root,this.keys=e.keys||{},this.consistentSnapshot=e.consistentSnapshot??!0,!e.roles)this.roles=VO.TOP_LEVEL_ROLE_NAMES.reduce((r,s)=>({...r,[s]:new VO.Role({keyIDs:[],threshold:1})}),{});else{let r=new Set(Object.keys(e.roles));if(!VO.TOP_LEVEL_ROLE_NAMES.every(s=>r.has(s)))throw new kPe.ValueError(\"missing top-level role\");this.roles=e.roles}}addKey(e,r){if(!this.roles[r])throw new kPe.ValueError(`role ${r} does not exist`);this.roles[r].keyIDs.includes(e.keyID)||this.roles[r].keyIDs.push(e.keyID),this.keys[e.keyID]=e}equals(e){return e instanceof t?super.equals(e)&&this.consistentSnapshot===e.consistentSnapshot&&xPe.default.isDeepStrictEqual(this.keys,e.keys)&&xPe.default.isDeepStrictEqual(this.roles,e.roles):!1}toJSON(){return{_type:this.type,spec_version:this.specVersion,version:this.version,expires:this.expires,keys:IBt(this.keys),roles:CBt(this.roles),consistent_snapshot:this.consistentSnapshot,...this.unrecognizedFields}}static fromJSON(e){let{unrecognizedFields:r,...s}=AJ.Signed.commonFieldsFromJSON(e),{keys:a,roles:n,consistent_snapshot:c,...f}=r;if(typeof c!=\"boolean\")throw new TypeError(\"consistent_snapshot must be a boolean\");return new t({...s,keys:wBt(a),roles:BBt(n),consistentSnapshot:c,unrecognizedFields:f})}};a1.Root=pJ;function IBt(t){return Object.entries(t).reduce((e,[r,s])=>({...e,[r]:s.toJSON()}),{})}function CBt(t){return Object.entries(t).reduce((e,[r,s])=>({...e,[r]:s.toJSON()}),{})}function wBt(t){let e;if(JO.guard.isDefined(t)){if(!JO.guard.isObjectRecord(t))throw new TypeError(\"keys must be an object\");e=Object.entries(t).reduce((r,[s,a])=>({...r,[s]:EBt.Key.fromJSON(s,a)}),{})}return e}function BBt(t){let e;if(JO.guard.isDefined(t)){if(!JO.guard.isObjectRecord(t))throw new TypeError(\"roles must be an object\");e=Object.entries(t).reduce((r,[s,a])=>({...r,[s]:VO.Role.fromJSON(a)}),{})}return e}});var dJ=_(KO=>{\"use strict\";Object.defineProperty(KO,\"__esModule\",{value:!0});KO.Signature=void 0;var gJ=class t{constructor(e){let{keyID:r,sig:s}=e;this.keyID=r,this.sig=s}toJSON(){return{keyid:this.keyID,sig:this.sig}}static fromJSON(e){let{keyid:r,sig:s}=e;if(typeof r!=\"string\")throw new TypeError(\"keyid must be a string\");if(typeof s!=\"string\")throw new TypeError(\"sig must be a string\");return new t({keyID:r,sig:s})}};KO.Signature=gJ});var EJ=_(l1=>{\"use strict\";var vBt=l1&&l1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(l1,\"__esModule\",{value:!0});l1.Snapshot=void 0;var SBt=vBt(Ie(\"util\")),mJ=ay(),TPe=Tb(),QPe=ff(),yJ=class t extends mJ.Signed{constructor(e){super(e),this.type=mJ.MetadataKind.Snapshot,this.meta=e.meta||{\"targets.json\":new TPe.MetaFile({version:1})}}equals(e){return e instanceof t?super.equals(e)&&SBt.default.isDeepStrictEqual(this.meta,e.meta):!1}toJSON(){return{_type:this.type,meta:DBt(this.meta),spec_version:this.specVersion,version:this.version,expires:this.expires,...this.unrecognizedFields}}static fromJSON(e){let{unrecognizedFields:r,...s}=mJ.Signed.commonFieldsFromJSON(e),{meta:a,...n}=r;return new t({...s,meta:bBt(a),unrecognizedFields:n})}};l1.Snapshot=yJ;function DBt(t){return Object.entries(t).reduce((e,[r,s])=>({...e,[r]:s.toJSON()}),{})}function bBt(t){let e;if(QPe.guard.isDefined(t))if(QPe.guard.isObjectRecord(t))e=Object.entries(t).reduce((r,[s,a])=>({...r,[s]:TPe.MetaFile.fromJSON(a)}),{});else throw new TypeError(\"meta field is malformed\");return e}});var RPe=_(c1=>{\"use strict\";var PBt=c1&&c1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(c1,\"__esModule\",{value:!0});c1.Delegations=void 0;var zO=PBt(Ie(\"util\")),xBt=PA(),kBt=NO(),IJ=fJ(),XO=ff(),CJ=class t{constructor(e){if(this.keys=e.keys,this.unrecognizedFields=e.unrecognizedFields||{},e.roles&&Object.keys(e.roles).some(r=>IJ.TOP_LEVEL_ROLE_NAMES.includes(r)))throw new xBt.ValueError(\"Delegated role name conflicts with top-level role name\");this.succinctRoles=e.succinctRoles,this.roles=e.roles}equals(e){return e instanceof t?zO.default.isDeepStrictEqual(this.keys,e.keys)&&zO.default.isDeepStrictEqual(this.roles,e.roles)&&zO.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields)&&zO.default.isDeepStrictEqual(this.succinctRoles,e.succinctRoles):!1}*rolesForTarget(e){if(this.roles)for(let r of Object.values(this.roles))r.isDelegatedPath(e)&&(yield{role:r.name,terminating:r.terminating});else this.succinctRoles&&(yield{role:this.succinctRoles.getRoleForTarget(e),terminating:!0})}toJSON(){let e={keys:QBt(this.keys),...this.unrecognizedFields};return this.roles?e.roles=TBt(this.roles):this.succinctRoles&&(e.succinct_roles=this.succinctRoles.toJSON()),e}static fromJSON(e){let{keys:r,roles:s,succinct_roles:a,...n}=e,c;return XO.guard.isObject(a)&&(c=IJ.SuccinctRoles.fromJSON(a)),new t({keys:RBt(r),roles:FBt(s),unrecognizedFields:n,succinctRoles:c})}};c1.Delegations=CJ;function QBt(t){return Object.entries(t).reduce((e,[r,s])=>({...e,[r]:s.toJSON()}),{})}function TBt(t){return Object.values(t).map(e=>e.toJSON())}function RBt(t){if(!XO.guard.isObjectRecord(t))throw new TypeError(\"keys is malformed\");return Object.entries(t).reduce((e,[r,s])=>({...e,[r]:kBt.Key.fromJSON(r,s)}),{})}function FBt(t){let e;if(XO.guard.isDefined(t)){if(!XO.guard.isObjectArray(t))throw new TypeError(\"roles is malformed\");e=t.reduce((r,s)=>{let a=IJ.DelegatedRole.fromJSON(s);return{...r,[a.name]:a}},{})}return e}});var vJ=_(u1=>{\"use strict\";var NBt=u1&&u1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(u1,\"__esModule\",{value:!0});u1.Targets=void 0;var FPe=NBt(Ie(\"util\")),wJ=ay(),OBt=RPe(),LBt=Tb(),ZO=ff(),BJ=class t extends wJ.Signed{constructor(e){super(e),this.type=wJ.MetadataKind.Targets,this.targets=e.targets||{},this.delegations=e.delegations}addTarget(e){this.targets[e.path]=e}equals(e){return e instanceof t?super.equals(e)&&FPe.default.isDeepStrictEqual(this.targets,e.targets)&&FPe.default.isDeepStrictEqual(this.delegations,e.delegations):!1}toJSON(){let e={_type:this.type,spec_version:this.specVersion,version:this.version,expires:this.expires,targets:MBt(this.targets),...this.unrecognizedFields};return this.delegations&&(e.delegations=this.delegations.toJSON()),e}static fromJSON(e){let{unrecognizedFields:r,...s}=wJ.Signed.commonFieldsFromJSON(e),{targets:a,delegations:n,...c}=r;return new t({...s,targets:UBt(a),delegations:_Bt(n),unrecognizedFields:c})}};u1.Targets=BJ;function MBt(t){return Object.entries(t).reduce((e,[r,s])=>({...e,[r]:s.toJSON()}),{})}function UBt(t){let e;if(ZO.guard.isDefined(t))if(ZO.guard.isObjectRecord(t))e=Object.entries(t).reduce((r,[s,a])=>({...r,[s]:LBt.TargetFile.fromJSON(s,a)}),{});else throw new TypeError(\"targets must be an object\");return e}function _Bt(t){let e;if(ZO.guard.isDefined(t))if(ZO.guard.isObject(t))e=OBt.Delegations.fromJSON(t);else throw new TypeError(\"delegations must be an object\");return e}});var PJ=_($O=>{\"use strict\";Object.defineProperty($O,\"__esModule\",{value:!0});$O.Timestamp=void 0;var SJ=ay(),NPe=Tb(),DJ=ff(),bJ=class t extends SJ.Signed{constructor(e){super(e),this.type=SJ.MetadataKind.Timestamp,this.snapshotMeta=e.snapshotMeta||new NPe.MetaFile({version:1})}equals(e){return e instanceof t?super.equals(e)&&this.snapshotMeta.equals(e.snapshotMeta):!1}toJSON(){return{_type:this.type,spec_version:this.specVersion,version:this.version,expires:this.expires,meta:{\"snapshot.json\":this.snapshotMeta.toJSON()},...this.unrecognizedFields}}static fromJSON(e){let{unrecognizedFields:r,...s}=SJ.Signed.commonFieldsFromJSON(e),{meta:a,...n}=r;return new t({...s,snapshotMeta:HBt(a),unrecognizedFields:n})}};$O.Timestamp=bJ;function HBt(t){let e;if(DJ.guard.isDefined(t)){let r=t[\"snapshot.json\"];if(!DJ.guard.isDefined(r)||!DJ.guard.isObject(r))throw new TypeError(\"missing snapshot.json in meta\");e=NPe.MetaFile.fromJSON(r)}return e}});var LPe=_(A1=>{\"use strict\";var jBt=A1&&A1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(A1,\"__esModule\",{value:!0});A1.Metadata=void 0;var GBt=V7(),OPe=jBt(Ie(\"util\")),f1=ay(),Ub=PA(),qBt=hJ(),WBt=dJ(),YBt=EJ(),VBt=vJ(),JBt=PJ(),xJ=ff(),kJ=class t{constructor(e,r,s){this.signed=e,this.signatures=r||{},this.unrecognizedFields=s||{}}sign(e,r=!0){let s=Buffer.from((0,GBt.canonicalize)(this.signed.toJSON())),a=e(s);r||(this.signatures={}),this.signatures[a.keyID]=a}verifyDelegate(e,r){let s,a={};switch(this.signed.type){case f1.MetadataKind.Root:a=this.signed.keys,s=this.signed.roles[e];break;case f1.MetadataKind.Targets:if(!this.signed.delegations)throw new Ub.ValueError(`No delegations found for ${e}`);a=this.signed.delegations.keys,this.signed.delegations.roles?s=this.signed.delegations.roles[e]:this.signed.delegations.succinctRoles&&this.signed.delegations.succinctRoles.isDelegatedRole(e)&&(s=this.signed.delegations.succinctRoles);break;default:throw new TypeError(\"invalid metadata type\")}if(!s)throw new Ub.ValueError(`no delegation found for ${e}`);let n=new Set;if(s.keyIDs.forEach(c=>{let f=a[c];if(f)try{f.verifySignature(r),n.add(f.keyID)}catch{}}),n.size<s.threshold)throw new Ub.UnsignedMetadataError(`${e} was signed by ${n.size}/${s.threshold} keys`)}equals(e){return e instanceof t?this.signed.equals(e.signed)&&OPe.default.isDeepStrictEqual(this.signatures,e.signatures)&&OPe.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields):!1}toJSON(){return{signatures:Object.values(this.signatures).map(r=>r.toJSON()),signed:this.signed.toJSON(),...this.unrecognizedFields}}static fromJSON(e,r){let{signed:s,signatures:a,...n}=r;if(!xJ.guard.isDefined(s)||!xJ.guard.isObject(s))throw new TypeError(\"signed is not defined\");if(e!==s._type)throw new Ub.ValueError(`expected '${e}', got ${s._type}`);if(!xJ.guard.isObjectArray(a))throw new TypeError(\"signatures is not an array\");let c;switch(e){case f1.MetadataKind.Root:c=qBt.Root.fromJSON(s);break;case f1.MetadataKind.Timestamp:c=JBt.Timestamp.fromJSON(s);break;case f1.MetadataKind.Snapshot:c=YBt.Snapshot.fromJSON(s);break;case f1.MetadataKind.Targets:c=VBt.Targets.fromJSON(s);break;default:throw new TypeError(\"invalid metadata type\")}let f={};return a.forEach(p=>{let h=WBt.Signature.fromJSON(p);if(f[h.keyID])throw new Ub.ValueError(`multiple signatures found for keyid: ${h.keyID}`);f[h.keyID]=h}),new t(c,f,n)}};A1.Metadata=kJ});var eL=_(Fi=>{\"use strict\";Object.defineProperty(Fi,\"__esModule\",{value:!0});Fi.Timestamp=Fi.Targets=Fi.Snapshot=Fi.Signature=Fi.Root=Fi.Metadata=Fi.Key=Fi.TargetFile=Fi.MetaFile=Fi.ValueError=Fi.MetadataKind=void 0;var KBt=ay();Object.defineProperty(Fi,\"MetadataKind\",{enumerable:!0,get:function(){return KBt.MetadataKind}});var zBt=PA();Object.defineProperty(Fi,\"ValueError\",{enumerable:!0,get:function(){return zBt.ValueError}});var MPe=Tb();Object.defineProperty(Fi,\"MetaFile\",{enumerable:!0,get:function(){return MPe.MetaFile}});Object.defineProperty(Fi,\"TargetFile\",{enumerable:!0,get:function(){return MPe.TargetFile}});var XBt=NO();Object.defineProperty(Fi,\"Key\",{enumerable:!0,get:function(){return XBt.Key}});var ZBt=LPe();Object.defineProperty(Fi,\"Metadata\",{enumerable:!0,get:function(){return ZBt.Metadata}});var $Bt=hJ();Object.defineProperty(Fi,\"Root\",{enumerable:!0,get:function(){return $Bt.Root}});var evt=dJ();Object.defineProperty(Fi,\"Signature\",{enumerable:!0,get:function(){return evt.Signature}});var tvt=EJ();Object.defineProperty(Fi,\"Snapshot\",{enumerable:!0,get:function(){return tvt.Snapshot}});var rvt=vJ();Object.defineProperty(Fi,\"Targets\",{enumerable:!0,get:function(){return rvt.Targets}});var nvt=PJ();Object.defineProperty(Fi,\"Timestamp\",{enumerable:!0,get:function(){return nvt.Timestamp}})});var _Pe=_((Dir,UPe)=>{var p1=1e3,h1=p1*60,g1=h1*60,uy=g1*24,ivt=uy*7,svt=uy*365.25;UPe.exports=function(t,e){e=e||{};var r=typeof t;if(r===\"string\"&&t.length>0)return ovt(t);if(r===\"number\"&&isFinite(t))return e.long?lvt(t):avt(t);throw new Error(\"val is not a non-empty string or a valid number. val=\"+JSON.stringify(t))};function ovt(t){if(t=String(t),!(t.length>100)){var e=/^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(e){var r=parseFloat(e[1]),s=(e[2]||\"ms\").toLowerCase();switch(s){case\"years\":case\"year\":case\"yrs\":case\"yr\":case\"y\":return r*svt;case\"weeks\":case\"week\":case\"w\":return r*ivt;case\"days\":case\"day\":case\"d\":return r*uy;case\"hours\":case\"hour\":case\"hrs\":case\"hr\":case\"h\":return r*g1;case\"minutes\":case\"minute\":case\"mins\":case\"min\":case\"m\":return r*h1;case\"seconds\":case\"second\":case\"secs\":case\"sec\":case\"s\":return r*p1;case\"milliseconds\":case\"millisecond\":case\"msecs\":case\"msec\":case\"ms\":return r;default:return}}}}function avt(t){var e=Math.abs(t);return e>=uy?Math.round(t/uy)+\"d\":e>=g1?Math.round(t/g1)+\"h\":e>=h1?Math.round(t/h1)+\"m\":e>=p1?Math.round(t/p1)+\"s\":t+\"ms\"}function lvt(t){var e=Math.abs(t);return e>=uy?tL(t,e,uy,\"day\"):e>=g1?tL(t,e,g1,\"hour\"):e>=h1?tL(t,e,h1,\"minute\"):e>=p1?tL(t,e,p1,\"second\"):t+\" ms\"}function tL(t,e,r,s){var a=e>=r*1.5;return Math.round(t/r)+\" \"+s+(a?\"s\":\"\")}});var QJ=_((bir,HPe)=>{function cvt(t){r.debug=r,r.default=r,r.coerce=p,r.disable=c,r.enable=a,r.enabled=f,r.humanize=_Pe(),r.destroy=h,Object.keys(t).forEach(E=>{r[E]=t[E]}),r.names=[],r.skips=[],r.formatters={};function e(E){let C=0;for(let S=0;S<E.length;S++)C=(C<<5)-C+E.charCodeAt(S),C|=0;return r.colors[Math.abs(C)%r.colors.length]}r.selectColor=e;function r(E){let C,S=null,P,I;function R(...N){if(!R.enabled)return;let U=R,W=Number(new Date),ee=W-(C||W);U.diff=ee,U.prev=C,U.curr=W,C=W,N[0]=r.coerce(N[0]),typeof N[0]!=\"string\"&&N.unshift(\"%O\");let ie=0;N[0]=N[0].replace(/%([a-zA-Z%])/g,(le,me)=>{if(le===\"%%\")return\"%\";ie++;let pe=r.formatters[me];if(typeof pe==\"function\"){let Be=N[ie];le=pe.call(U,Be),N.splice(ie,1),ie--}return le}),r.formatArgs.call(U,N),(U.log||r.log).apply(U,N)}return R.namespace=E,R.useColors=r.useColors(),R.color=r.selectColor(E),R.extend=s,R.destroy=r.destroy,Object.defineProperty(R,\"enabled\",{enumerable:!0,configurable:!1,get:()=>S!==null?S:(P!==r.namespaces&&(P=r.namespaces,I=r.enabled(E)),I),set:N=>{S=N}}),typeof r.init==\"function\"&&r.init(R),R}function s(E,C){let S=r(this.namespace+(typeof C>\"u\"?\":\":C)+E);return S.log=this.log,S}function a(E){r.save(E),r.namespaces=E,r.names=[],r.skips=[];let C=(typeof E==\"string\"?E:\"\").trim().replace(\" \",\",\").split(\",\").filter(Boolean);for(let S of C)S[0]===\"-\"?r.skips.push(S.slice(1)):r.names.push(S)}function n(E,C){let S=0,P=0,I=-1,R=0;for(;S<E.length;)if(P<C.length&&(C[P]===E[S]||C[P]===\"*\"))C[P]===\"*\"?(I=P,R=S,P++):(S++,P++);else if(I!==-1)P=I+1,R++,S=R;else return!1;for(;P<C.length&&C[P]===\"*\";)P++;return P===C.length}function c(){let E=[...r.names,...r.skips.map(C=>\"-\"+C)].join(\",\");return r.enable(\"\"),E}function f(E){for(let C of r.skips)if(n(E,C))return!1;for(let C of r.names)if(n(E,C))return!0;return!1}function p(E){return E instanceof Error?E.stack||E.message:E}function h(){console.warn(\"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.\")}return r.enable(r.load()),r}HPe.exports=cvt});var jPe=_((sc,rL)=>{sc.formatArgs=fvt;sc.save=Avt;sc.load=pvt;sc.useColors=uvt;sc.storage=hvt();sc.destroy=(()=>{let t=!1;return()=>{t||(t=!0,console.warn(\"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.\"))}})();sc.colors=[\"#0000CC\",\"#0000FF\",\"#0033CC\",\"#0033FF\",\"#0066CC\",\"#0066FF\",\"#0099CC\",\"#0099FF\",\"#00CC00\",\"#00CC33\",\"#00CC66\",\"#00CC99\",\"#00CCCC\",\"#00CCFF\",\"#3300CC\",\"#3300FF\",\"#3333CC\",\"#3333FF\",\"#3366CC\",\"#3366FF\",\"#3399CC\",\"#3399FF\",\"#33CC00\",\"#33CC33\",\"#33CC66\",\"#33CC99\",\"#33CCCC\",\"#33CCFF\",\"#6600CC\",\"#6600FF\",\"#6633CC\",\"#6633FF\",\"#66CC00\",\"#66CC33\",\"#9900CC\",\"#9900FF\",\"#9933CC\",\"#9933FF\",\"#99CC00\",\"#99CC33\",\"#CC0000\",\"#CC0033\",\"#CC0066\",\"#CC0099\",\"#CC00CC\",\"#CC00FF\",\"#CC3300\",\"#CC3333\",\"#CC3366\",\"#CC3399\",\"#CC33CC\",\"#CC33FF\",\"#CC6600\",\"#CC6633\",\"#CC9900\",\"#CC9933\",\"#CCCC00\",\"#CCCC33\",\"#FF0000\",\"#FF0033\",\"#FF0066\",\"#FF0099\",\"#FF00CC\",\"#FF00FF\",\"#FF3300\",\"#FF3333\",\"#FF3366\",\"#FF3399\",\"#FF33CC\",\"#FF33FF\",\"#FF6600\",\"#FF6633\",\"#FF9900\",\"#FF9933\",\"#FFCC00\",\"#FFCC33\"];function uvt(){if(typeof window<\"u\"&&window.process&&(window.process.type===\"renderer\"||window.process.__nwjs))return!0;if(typeof navigator<\"u\"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/))return!1;let t;return typeof document<\"u\"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<\"u\"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<\"u\"&&navigator.userAgent&&(t=navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/))&&parseInt(t[1],10)>=31||typeof navigator<\"u\"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/)}function fvt(t){if(t[0]=(this.useColors?\"%c\":\"\")+this.namespace+(this.useColors?\" %c\":\" \")+t[0]+(this.useColors?\"%c \":\" \")+\"+\"+rL.exports.humanize(this.diff),!this.useColors)return;let e=\"color: \"+this.color;t.splice(1,0,e,\"color: inherit\");let r=0,s=0;t[0].replace(/%[a-zA-Z%]/g,a=>{a!==\"%%\"&&(r++,a===\"%c\"&&(s=r))}),t.splice(s,0,e)}sc.log=console.debug||console.log||(()=>{});function Avt(t){try{t?sc.storage.setItem(\"debug\",t):sc.storage.removeItem(\"debug\")}catch{}}function pvt(){let t;try{t=sc.storage.getItem(\"debug\")}catch{}return!t&&typeof process<\"u\"&&\"env\"in process&&(t=process.env.DEBUG),t}function hvt(){try{return localStorage}catch{}}rL.exports=QJ()(sc);var{formatters:gvt}=rL.exports;gvt.j=function(t){try{return JSON.stringify(t)}catch(e){return\"[UnexpectedJSONParseError]: \"+e.message}}});var qPe=_((Zs,iL)=>{var dvt=Ie(\"tty\"),nL=Ie(\"util\");Zs.init=Bvt;Zs.log=Ivt;Zs.formatArgs=yvt;Zs.save=Cvt;Zs.load=wvt;Zs.useColors=mvt;Zs.destroy=nL.deprecate(()=>{},\"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.\");Zs.colors=[6,2,3,4,5,1];try{let t=Ie(\"supports-color\");t&&(t.stderr||t).level>=2&&(Zs.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}Zs.inspectOpts=Object.keys(process.env).filter(t=>/^debug_/i.test(t)).reduce((t,e)=>{let r=e.substring(6).toLowerCase().replace(/_([a-z])/g,(a,n)=>n.toUpperCase()),s=process.env[e];return/^(yes|on|true|enabled)$/i.test(s)?s=!0:/^(no|off|false|disabled)$/i.test(s)?s=!1:s===\"null\"?s=null:s=Number(s),t[r]=s,t},{});function mvt(){return\"colors\"in Zs.inspectOpts?!!Zs.inspectOpts.colors:dvt.isatty(process.stderr.fd)}function yvt(t){let{namespace:e,useColors:r}=this;if(r){let s=this.color,a=\"\\x1B[3\"+(s<8?s:\"8;5;\"+s),n=`  ${a};1m${e} \\x1B[0m`;t[0]=n+t[0].split(`\n`).join(`\n`+n),t.push(a+\"m+\"+iL.exports.humanize(this.diff)+\"\\x1B[0m\")}else t[0]=Evt()+e+\" \"+t[0]}function Evt(){return Zs.inspectOpts.hideDate?\"\":new Date().toISOString()+\" \"}function Ivt(...t){return process.stderr.write(nL.formatWithOptions(Zs.inspectOpts,...t)+`\n`)}function Cvt(t){t?process.env.DEBUG=t:delete process.env.DEBUG}function wvt(){return process.env.DEBUG}function Bvt(t){t.inspectOpts={};let e=Object.keys(Zs.inspectOpts);for(let r=0;r<e.length;r++)t.inspectOpts[e[r]]=Zs.inspectOpts[e[r]]}iL.exports=QJ()(Zs);var{formatters:GPe}=iL.exports;GPe.o=function(t){return this.inspectOpts.colors=this.useColors,nL.inspect(t,this.inspectOpts).split(`\n`).map(e=>e.trim()).join(\" \")};GPe.O=function(t){return this.inspectOpts.colors=this.useColors,nL.inspect(t,this.inspectOpts)}});var RJ=_((Pir,TJ)=>{typeof process>\"u\"||process.type===\"renderer\"||process.browser===!0||process.__nwjs?TJ.exports=jPe():TJ.exports=qPe()});var oL=_(Ki=>{\"use strict\";Object.defineProperty(Ki,\"__esModule\",{value:!0});Ki.DownloadHTTPError=Ki.DownloadLengthMismatchError=Ki.DownloadError=Ki.ExpiredMetadataError=Ki.EqualVersionError=Ki.BadVersionError=Ki.RepositoryError=Ki.PersistError=Ki.RuntimeError=Ki.ValueError=void 0;var FJ=class extends Error{};Ki.ValueError=FJ;var NJ=class extends Error{};Ki.RuntimeError=NJ;var OJ=class extends Error{};Ki.PersistError=OJ;var _b=class extends Error{};Ki.RepositoryError=_b;var sL=class extends _b{};Ki.BadVersionError=sL;var LJ=class extends sL{};Ki.EqualVersionError=LJ;var MJ=class extends _b{};Ki.ExpiredMetadataError=MJ;var Hb=class extends Error{};Ki.DownloadError=Hb;var UJ=class extends Hb{};Ki.DownloadLengthMismatchError=UJ;var _J=class extends Hb{constructor(e,r){super(e),this.statusCode=r}};Ki.DownloadHTTPError=_J});var YPe=_(d1=>{\"use strict\";var jJ=d1&&d1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(d1,\"__esModule\",{value:!0});d1.withTempFile=void 0;var HJ=jJ(Ie(\"fs/promises\")),vvt=jJ(Ie(\"os\")),WPe=jJ(Ie(\"path\")),Svt=async t=>Dvt(async e=>t(WPe.default.join(e,\"tempfile\")));d1.withTempFile=Svt;var Dvt=async t=>{let e=await HJ.default.realpath(vvt.default.tmpdir()),r=await HJ.default.mkdtemp(e+WPe.default.sep);try{return await t(r)}finally{await HJ.default.rm(r,{force:!0,recursive:!0,maxRetries:3})}}});var qJ=_(kg=>{\"use strict\";var lL=kg&&kg.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(kg,\"__esModule\",{value:!0});kg.DefaultFetcher=kg.BaseFetcher=void 0;var bvt=lL(RJ()),VPe=lL(Ie(\"fs\")),Pvt=lL(CO()),xvt=lL(Ie(\"util\")),JPe=oL(),kvt=YPe(),Qvt=(0,bvt.default)(\"tuf:fetch\"),aL=class{async downloadFile(e,r,s){return(0,kvt.withTempFile)(async a=>{let n=await this.fetch(e),c=0,f=VPe.default.createWriteStream(a);try{for await(let p of n){let h=Buffer.from(p);if(c+=h.length,c>r)throw new JPe.DownloadLengthMismatchError(\"Max length reached\");await Tvt(f,h)}}finally{await xvt.default.promisify(f.close).bind(f)()}return s(a)})}async downloadBytes(e,r){return this.downloadFile(e,r,async s=>{let a=VPe.default.createReadStream(s),n=[];for await(let c of a)n.push(c);return Buffer.concat(n)})}};kg.BaseFetcher=aL;var GJ=class extends aL{constructor(e={}){super(),this.timeout=e.timeout,this.retry=e.retry}async fetch(e){Qvt(\"GET %s\",e);let r=await(0,Pvt.default)(e,{timeout:this.timeout,retry:this.retry});if(!r.ok||!r?.body)throw new JPe.DownloadHTTPError(\"Failed to download\",r.status);return r.body}};kg.DefaultFetcher=GJ;var Tvt=async(t,e)=>new Promise((r,s)=>{t.write(e,a=>{a&&s(a),r(!0)})})});var KPe=_(cL=>{\"use strict\";Object.defineProperty(cL,\"__esModule\",{value:!0});cL.defaultConfig=void 0;cL.defaultConfig={maxRootRotations:256,maxDelegations:32,rootMaxLength:512e3,timestampMaxLength:16384,snapshotMaxLength:2e6,targetsMaxLength:5e6,prefixTargetsWithHash:!0,fetchTimeout:1e5,fetchRetries:void 0,fetchRetry:2}});var zPe=_(uL=>{\"use strict\";Object.defineProperty(uL,\"__esModule\",{value:!0});uL.TrustedMetadataStore=void 0;var Es=eL(),Hi=oL(),WJ=class{constructor(e){this.trustedSet={},this.referenceTime=new Date,this.loadTrustedRoot(e)}get root(){if(!this.trustedSet.root)throw new ReferenceError(\"No trusted root metadata\");return this.trustedSet.root}get timestamp(){return this.trustedSet.timestamp}get snapshot(){return this.trustedSet.snapshot}get targets(){return this.trustedSet.targets}getRole(e){return this.trustedSet[e]}updateRoot(e){let r=JSON.parse(e.toString(\"utf8\")),s=Es.Metadata.fromJSON(Es.MetadataKind.Root,r);if(s.signed.type!=Es.MetadataKind.Root)throw new Hi.RepositoryError(`Expected 'root', got ${s.signed.type}`);if(this.root.verifyDelegate(Es.MetadataKind.Root,s),s.signed.version!=this.root.signed.version+1)throw new Hi.BadVersionError(`Expected version ${this.root.signed.version+1}, got ${s.signed.version}`);return s.verifyDelegate(Es.MetadataKind.Root,s),this.trustedSet.root=s,s}updateTimestamp(e){if(this.snapshot)throw new Hi.RuntimeError(\"Cannot update timestamp after snapshot\");if(this.root.signed.isExpired(this.referenceTime))throw new Hi.ExpiredMetadataError(\"Final root.json is expired\");let r=JSON.parse(e.toString(\"utf8\")),s=Es.Metadata.fromJSON(Es.MetadataKind.Timestamp,r);if(s.signed.type!=Es.MetadataKind.Timestamp)throw new Hi.RepositoryError(`Expected 'timestamp', got ${s.signed.type}`);if(this.root.verifyDelegate(Es.MetadataKind.Timestamp,s),this.timestamp){if(s.signed.version<this.timestamp.signed.version)throw new Hi.BadVersionError(`New timestamp version ${s.signed.version} is less than current version ${this.timestamp.signed.version}`);if(s.signed.version===this.timestamp.signed.version)throw new Hi.EqualVersionError(`New timestamp version ${s.signed.version} is equal to current version ${this.timestamp.signed.version}`);let a=this.timestamp.signed.snapshotMeta,n=s.signed.snapshotMeta;if(n.version<a.version)throw new Hi.BadVersionError(`New snapshot version ${n.version} is less than current version ${a.version}`)}return this.trustedSet.timestamp=s,this.checkFinalTimestamp(),s}updateSnapshot(e,r=!1){if(!this.timestamp)throw new Hi.RuntimeError(\"Cannot update snapshot before timestamp\");if(this.targets)throw new Hi.RuntimeError(\"Cannot update snapshot after targets\");this.checkFinalTimestamp();let s=this.timestamp.signed.snapshotMeta;r||s.verify(e);let a=JSON.parse(e.toString(\"utf8\")),n=Es.Metadata.fromJSON(Es.MetadataKind.Snapshot,a);if(n.signed.type!=Es.MetadataKind.Snapshot)throw new Hi.RepositoryError(`Expected 'snapshot', got ${n.signed.type}`);return this.root.verifyDelegate(Es.MetadataKind.Snapshot,n),this.snapshot&&Object.entries(this.snapshot.signed.meta).forEach(([c,f])=>{let p=n.signed.meta[c];if(!p)throw new Hi.RepositoryError(`Missing file ${c} in new snapshot`);if(p.version<f.version)throw new Hi.BadVersionError(`New version ${p.version} of ${c} is less than current version ${f.version}`)}),this.trustedSet.snapshot=n,this.checkFinalSnapsnot(),n}updateDelegatedTargets(e,r,s){if(!this.snapshot)throw new Hi.RuntimeError(\"Cannot update delegated targets before snapshot\");this.checkFinalSnapsnot();let a=this.trustedSet[s];if(!a)throw new Hi.RuntimeError(`No trusted ${s} metadata`);let n=this.snapshot.signed.meta?.[`${r}.json`];if(!n)throw new Hi.RepositoryError(`Missing ${r}.json in snapshot`);n.verify(e);let c=JSON.parse(e.toString(\"utf8\")),f=Es.Metadata.fromJSON(Es.MetadataKind.Targets,c);if(f.signed.type!=Es.MetadataKind.Targets)throw new Hi.RepositoryError(`Expected 'targets', got ${f.signed.type}`);a.verifyDelegate(r,f);let p=f.signed.version;if(p!=n.version)throw new Hi.BadVersionError(`Version ${p} of ${r} does not match snapshot version ${n.version}`);if(f.signed.isExpired(this.referenceTime))throw new Hi.ExpiredMetadataError(`${r}.json is expired`);this.trustedSet[r]=f}loadTrustedRoot(e){let r=JSON.parse(e.toString(\"utf8\")),s=Es.Metadata.fromJSON(Es.MetadataKind.Root,r);if(s.signed.type!=Es.MetadataKind.Root)throw new Hi.RepositoryError(`Expected 'root', got ${s.signed.type}`);s.verifyDelegate(Es.MetadataKind.Root,s),this.trustedSet.root=s}checkFinalTimestamp(){if(!this.timestamp)throw new ReferenceError(\"No trusted timestamp metadata\");if(this.timestamp.signed.isExpired(this.referenceTime))throw new Hi.ExpiredMetadataError(\"Final timestamp.json is expired\")}checkFinalSnapsnot(){if(!this.snapshot)throw new ReferenceError(\"No trusted snapshot metadata\");if(!this.timestamp)throw new ReferenceError(\"No trusted timestamp metadata\");if(this.snapshot.signed.isExpired(this.referenceTime))throw new Hi.ExpiredMetadataError(\"snapshot.json is expired\");let e=this.timestamp.signed.snapshotMeta;if(this.snapshot.signed.version!==e.version)throw new Hi.BadVersionError(\"Snapshot version doesn't match timestamp\")}};uL.TrustedMetadataStore=WJ});var XPe=_(YJ=>{\"use strict\";Object.defineProperty(YJ,\"__esModule\",{value:!0});YJ.join=Fvt;var Rvt=Ie(\"url\");function Fvt(t,e){return new Rvt.URL(Nvt(t)+Ovt(e)).toString()}function Nvt(t){return t.endsWith(\"/\")?t:t+\"/\"}function Ovt(t){return t.startsWith(\"/\")?t.slice(1):t}});var ZPe=_(nu=>{\"use strict\";var Lvt=nu&&nu.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||(\"get\"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),Mvt=nu&&nu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),KJ=nu&&nu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.prototype.hasOwnProperty.call(t,r)&&Lvt(e,t,r);return Mvt(e,t),e},Uvt=nu&&nu.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(nu,\"__esModule\",{value:!0});nu.Updater=void 0;var xA=eL(),_vt=Uvt(RJ()),m1=KJ(Ie(\"fs\")),fL=KJ(Ie(\"path\")),Hvt=KPe(),fy=oL(),jvt=qJ(),Gvt=zPe(),jb=KJ(XPe()),VJ=(0,_vt.default)(\"tuf:cache\"),JJ=class{constructor(e){let{metadataDir:r,metadataBaseUrl:s,targetDir:a,targetBaseUrl:n,fetcher:c,config:f}=e;this.dir=r,this.metadataBaseUrl=s,this.targetDir=a,this.targetBaseUrl=n,this.forceCache=e.forceCache??!1;let p=this.loadLocalMetadata(xA.MetadataKind.Root);this.trustedSet=new Gvt.TrustedMetadataStore(p),this.config={...Hvt.defaultConfig,...f},this.fetcher=c||new jvt.DefaultFetcher({timeout:this.config.fetchTimeout,retry:this.config.fetchRetries??this.config.fetchRetry})}async refresh(){if(this.forceCache)try{await this.loadTimestamp({checkRemote:!1})}catch{await this.loadRoot(),await this.loadTimestamp()}else await this.loadRoot(),await this.loadTimestamp();await this.loadSnapshot(),await this.loadTargets(xA.MetadataKind.Targets,xA.MetadataKind.Root)}async getTargetInfo(e){return this.trustedSet.targets||await this.refresh(),this.preorderDepthFirstWalk(e)}async downloadTarget(e,r,s){let a=r||this.generateTargetPath(e);if(!s){if(!this.targetBaseUrl)throw new fy.ValueError(\"Target base URL not set\");s=this.targetBaseUrl}let n=e.path;if(this.trustedSet.root.signed.consistentSnapshot&&this.config.prefixTargetsWithHash){let p=Object.values(e.hashes),{dir:h,base:E}=fL.parse(n),C=`${p[0]}.${E}`;n=h?`${h}/${C}`:C}let f=jb.join(s,n);return await this.fetcher.downloadFile(f,e.length,async p=>{await e.verify(m1.createReadStream(p)),VJ(\"WRITE %s\",a),m1.copyFileSync(p,a)}),a}async findCachedTarget(e,r){r||(r=this.generateTargetPath(e));try{if(m1.existsSync(r))return await e.verify(m1.createReadStream(r)),r}catch{return}}loadLocalMetadata(e){let r=fL.join(this.dir,`${e}.json`);return VJ(\"READ %s\",r),m1.readFileSync(r)}async loadRoot(){let r=this.trustedSet.root.signed.version+1,s=r+this.config.maxRootRotations;for(let a=r;a<s;a++){let n=jb.join(this.metadataBaseUrl,`${a}.root.json`);try{let c=await this.fetcher.downloadBytes(n,this.config.rootMaxLength);this.trustedSet.updateRoot(c),this.persistMetadata(xA.MetadataKind.Root,c)}catch(c){if(c instanceof fy.DownloadHTTPError&&[403,404].includes(c.statusCode))break;throw c}}}async loadTimestamp({checkRemote:e}={checkRemote:!0}){try{let a=this.loadLocalMetadata(xA.MetadataKind.Timestamp);if(this.trustedSet.updateTimestamp(a),!e)return}catch{}let r=jb.join(this.metadataBaseUrl,\"timestamp.json\"),s=await this.fetcher.downloadBytes(r,this.config.timestampMaxLength);try{this.trustedSet.updateTimestamp(s)}catch(a){if(a instanceof fy.EqualVersionError)return;throw a}this.persistMetadata(xA.MetadataKind.Timestamp,s)}async loadSnapshot(){try{let e=this.loadLocalMetadata(xA.MetadataKind.Snapshot);this.trustedSet.updateSnapshot(e,!0)}catch{if(!this.trustedSet.timestamp)throw new ReferenceError(\"No timestamp metadata\");let r=this.trustedSet.timestamp.signed.snapshotMeta,s=r.length||this.config.snapshotMaxLength,a=this.trustedSet.root.signed.consistentSnapshot?r.version:void 0,n=jb.join(this.metadataBaseUrl,a?`${a}.snapshot.json`:\"snapshot.json\");try{let c=await this.fetcher.downloadBytes(n,s);this.trustedSet.updateSnapshot(c),this.persistMetadata(xA.MetadataKind.Snapshot,c)}catch(c){throw new fy.RuntimeError(`Unable to load snapshot metadata error ${c}`)}}}async loadTargets(e,r){if(this.trustedSet.getRole(e))return this.trustedSet.getRole(e);try{let s=this.loadLocalMetadata(e);this.trustedSet.updateDelegatedTargets(s,e,r)}catch{if(!this.trustedSet.snapshot)throw new ReferenceError(\"No snapshot metadata\");let a=this.trustedSet.snapshot.signed.meta[`${e}.json`],n=a.length||this.config.targetsMaxLength,c=this.trustedSet.root.signed.consistentSnapshot?a.version:void 0,f=encodeURIComponent(e),p=jb.join(this.metadataBaseUrl,c?`${c}.${f}.json`:`${f}.json`);try{let h=await this.fetcher.downloadBytes(p,n);this.trustedSet.updateDelegatedTargets(h,e,r),this.persistMetadata(e,h)}catch(h){throw new fy.RuntimeError(`Unable to load targets error ${h}`)}}return this.trustedSet.getRole(e)}async preorderDepthFirstWalk(e){let r=[{roleName:xA.MetadataKind.Targets,parentRoleName:xA.MetadataKind.Root}],s=new Set;for(;s.size<=this.config.maxDelegations&&r.length>0;){let{roleName:a,parentRoleName:n}=r.pop();if(s.has(a))continue;let c=(await this.loadTargets(a,n))?.signed;if(!c)continue;let f=c.targets?.[e];if(f)return f;if(s.add(a),c.delegations){let p=[],h=c.delegations.rolesForTarget(e);for(let{role:E,terminating:C}of h)if(p.push({roleName:E,parentRoleName:a}),C){r.splice(0);break}p.reverse(),r.push(...p)}}}generateTargetPath(e){if(!this.targetDir)throw new fy.ValueError(\"Target directory not set\");let r=encodeURIComponent(e.path);return fL.join(this.targetDir,r)}persistMetadata(e,r){let s=encodeURIComponent(e);try{let a=fL.join(this.dir,`${s}.json`);VJ(\"WRITE %s\",a),m1.writeFileSync(a,r.toString(\"utf8\"))}catch(a){throw new fy.PersistError(`Failed to persist metadata ${s} error: ${a}`)}}};nu.Updater=JJ});var $Pe=_(Qg=>{\"use strict\";Object.defineProperty(Qg,\"__esModule\",{value:!0});Qg.Updater=Qg.BaseFetcher=Qg.TargetFile=void 0;var qvt=eL();Object.defineProperty(Qg,\"TargetFile\",{enumerable:!0,get:function(){return qvt.TargetFile}});var Wvt=qJ();Object.defineProperty(Qg,\"BaseFetcher\",{enumerable:!0,get:function(){return Wvt.BaseFetcher}});var Yvt=ZPe();Object.defineProperty(Qg,\"Updater\",{enumerable:!0,get:function(){return Yvt.Updater}})});var XJ=_(AL=>{\"use strict\";Object.defineProperty(AL,\"__esModule\",{value:!0});AL.TUFError=void 0;var zJ=class extends Error{constructor({code:e,message:r,cause:s}){super(r),this.code=e,this.cause=s,this.name=this.constructor.name}};AL.TUFError=zJ});var exe=_(Gb=>{\"use strict\";var Vvt=Gb&&Gb.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Gb,\"__esModule\",{value:!0});Gb.readTarget=Kvt;var Jvt=Vvt(Ie(\"fs\")),pL=XJ();async function Kvt(t,e){let r=await zvt(t,e);return new Promise((s,a)=>{Jvt.default.readFile(r,\"utf-8\",(n,c)=>{n?a(new pL.TUFError({code:\"TUF_READ_TARGET_ERROR\",message:`error reading target ${r}`,cause:n})):s(c)})})}async function zvt(t,e){let r;try{r=await t.getTargetInfo(e)}catch(a){throw new pL.TUFError({code:\"TUF_REFRESH_METADATA_ERROR\",message:\"error refreshing TUF metadata\",cause:a})}if(!r)throw new pL.TUFError({code:\"TUF_FIND_TARGET_ERROR\",message:`target ${e} not found`});let s=await t.findCachedTarget(r);if(!s)try{s=await t.downloadTarget(r)}catch(a){throw new pL.TUFError({code:\"TUF_DOWNLOAD_TARGET_ERROR\",message:`error downloading target ${s}`,cause:a})}return s}});var txe=_((Uir,Xvt)=>{Xvt.exports={\"https://tuf-repo-cdn.sigstore.dev\":{\"root.json\":\"ewogInNpZ25hdHVyZXMiOiBbCiAgewogICAia2V5aWQiOiAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyIsCiAgICJzaWciOiAiMzA0NjAyMjEwMDhhYjFmNmYxN2Q0ZjllNmQ3ZGNmMWM4ODkxMmI2YjUzY2MxMDM4ODY0NGFlMWYwOWJjMzdhMDgyY2QwNjAwM2UwMjIxMDBlMTQ1ZWY0YzdiNzgyZDRlODEwN2I1MzQzN2U2NjlkMDQ3Njg5MmNlOTk5OTAzYWUzM2QxNDQ0ODM2Njk5NmU3IgogIH0sCiAgewogICAia2V5aWQiOiAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICJzaWciOiAiMzA0NTAyMjEwMGM3NjhiMmY4NmRhOTk1NjkwMTljMTYwYTA4MWRhNTRhZTM2YzM0YzBhMzEyMGQzY2I2OWI1M2I3ZDExMzc1OGUwMjIwNGY2NzE1MThmNjE3YjIwZDQ2NTM3ZmFlNmMzYjYzYmFlODkxM2Y0ZjE5NjIxNTYxMDVjYzRmMDE5YWMzNWM2YSIKICB9LAogIHsKICAgImtleWlkIjogIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAic2lnIjogIjMwNDUwMjIxMDBiNDQzNGU2OTk1ZDM2OGQyM2U3NDc1OWFjZDBjYjkwMTNjODNhNWQzNTExZjBmOTk3ZWM1NGM0NTZhZTQzNTBhMDIyMDE1YjBlMjY1ZDE4MmQyYjYxZGM3NGUxNTVkOThiM2MzZmJlNTY0YmEwNTI4NmFhMTRjOGRmMDJjOWI3NTY1MTYiCiAgfSwKICB7CiAgICJrZXlpZCI6ICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgInNpZyI6ICIzMDQ1MDIyMTAwODJjNTg0MTFkOTg5ZWI5Zjg2MTQxMDg1N2Q0MjM4MTU5MGVjOTQyNGRiZGFhNTFlNzhlZDEzNTE1NDMxOTA0ZTAyMjAxMTgxODVkYTZhNmMyOTQ3MTMxYzE3Nzk3ZTJiYjc2MjBjZTI2ZTVmMzAxZDFjZWFjNWYyYTdlNThmOWRjZjJlIgogIH0sCiAgewogICAia2V5aWQiOiAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIsCiAgICJzaWciOiAiMzA0NjAyMjEwMGM3ODUxMzg1NGNhZTljMzJlYWE2Yjg4ZTE4OTEyZjQ4MDA2YzI3NTdhMjU4ZjkxNzMxMmNhYmE3NTk0OGViOWUwMjIxMDBkOWUxYjRjZTBhZGZlOWZkMmUyMTQ4ZDdmYTI3YTJmNDBiYTExMjJiZDY5ZGE3NjEyZDhkMTc3NmIwMTNjOTFkIgogIH0sCiAgewogICAia2V5aWQiOiAiZmRmYTgzYTA3YjVhODM1ODliODdkZWQ0MWY3N2YzOWQyMzJhZDkxZjdjY2U1Mjg2OGRhY2QwNmJhMDg5ODQ5ZiIsCiAgICJzaWciOiAiMzA0NTAyMjA1NjQ4M2EyZDVkOWVhOWNlYzZlMTFlYWRmYjMzYzQ4NGI2MTQyOThmYWNhMTVhY2YxYzQzMWIxMWVkN2Y3MzRjMDIyMTAwZDBjMWQ3MjZhZjkyYTg3ZTRlNjY0NTljYTVhZGYzOGEwNWI0NGUxZjk0MzE4NDIzZjk1NGJhZThiY2E1YmIyZSIKICB9LAogIHsKICAgImtleWlkIjogImUyZjU5YWNiOTQ4ODUxOTQwN2UxOGNiZmM5MzI5NTEwYmUwM2MwNGFjYTk5MjlkMmYwMzAxMzQzZmVjODU1MjMiLAogICAic2lnIjogIjMwNDYwMjIxMDBkMDA0ZGU4ODAyNGMzMmRjNTY1M2E5ZjQ4NDNjZmM1MjE1NDI3MDQ4YWQ5NjAwZDJjZjljOTY5ZTZlZGZmM2QyMDIyMTAwZDllYmI3OThmNWZjNjZhZjEwODk5ZGVjZTAxNGE4NjI4Y2NmM2M1NDAyY2Q0YTQyNzAyMDc0NzJmOGY2ZTcxMiIKICB9LAogIHsKICAgImtleWlkIjogIjNjMzQ0YWEwNjhmZDRjYzRlODdkYzUwYjYxMmMwMjQzMWZiYzc3MWU5NTAwMzk5MzY4M2EyYjBiZjI2MGNmMGUiLAogICAic2lnIjogIjMwNDYwMjIxMDBiN2IwOTk5NmM0NWNhMmQ0YjA1NjAzZTU2YmFlZmEyOTcxOGEwYjcxMTQ3Y2Y4YzZlNjYzNDliYWE2MTQ3N2RmMDIyMTAwYzRkYTgwYzcxN2I0ZmE3YmJhMGZkNWM3MmRhOGEwNDk5MzU4YjAxMzU4YjIzMDlmNDFkMTQ1NmVhMWU3ZTFkOSIKICB9LAogIHsKICAgImtleWlkIjogImVjODE2Njk3MzRlMDE3OTk2YzViODVmM2QwMmMzZGUxZGQ0NjM3YTE1MjAxOWZlMWFmMTI1ZDJmOTM2OGI5NWUiLAogICAic2lnIjogIjMwNDYwMjIxMDBiZTk3ODJjMzA3NDRlNDExYTgyZmE4NWI1MTM4ZDYwMWNlMTQ4YmMxOTI1OGFlYzY0ZTdlYzI0NDc4ZjM4ODEyMDIyMTAwY2FlZjYzZGNhZjFhNGI5YTUwMGQzYmQwZTNmMTY0ZWMxOGYxYjYzZDdhOTQ2MGQ5YWNhYjEwNjZkYjBmMDE2ZCIKICB9LAogIHsKICAgImtleWlkIjogIjFlMWQ2NWNlOThiMTBhZGRhZDQ3NjRmZWJmN2RkYTJkMDQzNmIzZDNhMzg5MzU3OWMwZGRkYWVhMjBlNTQ4NDkiLAogICAic2lnIjogIjMwNDUwMjIwNzQ2ZWMzZjg1MzRjZTU1NTMxZDBkMDFmZjY0OTY0ZWY0NDBkMWU3ZDJjNGMxNDI0MDliOGU5NzY5ZjFhZGE2ZjAyMjEwMGUzYjkyOWZjZDkzZWExOGZlYWEwODI1ODg3YTcyMTA0ODk4NzlhNjY3ODBjMDdhODNmNGJkNDZlMmYwOWFiM2IiCiAgfQogXSwKICJzaWduZWQiOiB7CiAgIl90eXBlIjogInJvb3QiLAogICJjb25zaXN0ZW50X3NuYXBzaG90IjogdHJ1ZSwKICAiZXhwaXJlcyI6ICIyMDI1LTAyLTE5VDA4OjA0OjMyWiIsCiAgImtleXMiOiB7CiAgICIyMmY0Y2FlYzZkOGU2Zjk1NTVhZjY2YjNkNGMzY2IwNmEzYmIyM2ZkYzdlMzljOTE2YzYxZjQ2MmU2ZjUyYjA2IjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFekJ6Vk9tSENQb2pNVkxTSTM2NFdpaVY4TlByRFxuNklnUnhWbGlza3ovdit5M0pFUjVtY1ZHY09ObGlEY1dNQzVKMmxmSG1qUE5QaGI0SDd4bThMemZTQT09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBzYW50aWFnb3RvcnJlcyIKICAgfSwKICAgIjYxNjQzODM4MTI1YjQ0MGI0MGRiNjk0MmY1Y2I1YTMxYzBkYzA0MzY4MzE2ZWIyYWFhNThiOTU5MDRhNTgyMjIiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVpbmlrU3NBUW1Za05lSDVlWXEvQ25JekxhYWNPXG54bFNhYXdRRE93cUt5L3RDcXhxNXh4UFNKYzIxSzRXSWhzOUd5T2tLZnp1ZVkzR0lMemNNSlo0Y1d3PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGJvYmNhbGxhd2F5IgogICB9LAogICAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXk4WEtzbWhCWURJOEpjMEd3ekJ4ZUtheDBjbTVcblNUS0VVNjVIUEZ1blVuNDFzVDhwaTBGak00SWtIei9ZVW13bUxVTzBXdDdseGhqNkJrTElLNHFZQXc9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAZGxvcmVuYyIKICAgfSwKICAgIjcyNDdmMGRiYWQ4NWIxNDdlMTg2M2JhZGU3NjEyNDNjYzc4NWRjYjdhYTQxMGU3MTA1ZGQzZDJiNjFhMzZkMmMiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVXUmlHcjUraiszSjVTc0grWnRyNW5FMkgyd083XG5CVituTzNzOTNnTGNhMThxVE96SFkxb1d5QUdEeWtNU3NHVFVCU3Q5RCtBbjBLZktzRDJtZlNNNDJRPT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2ktb25saW5lLXVyaSI6ICJnY3BrbXM6Ly9wcm9qZWN0cy9zaWdzdG9yZS1yb290LXNpZ25pbmcvbG9jYXRpb25zL2dsb2JhbC9rZXlSaW5ncy9yb290L2NyeXB0b0tleXMvdGltZXN0YW1wIgogICB9LAogICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTBnaHJoOTJMdzFZcjNpZEdWNVdxQ3RNREI4Q3hcbitEOGhkQzR3MlpMTklwbFZSb1ZHTHNrWWEzZ2hlTXlPamlKOGtQaTE1YVEyLy83UCtvajdVdkpQR3c9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAam9zaHVhZ2wiCiAgIH0sCiAgICJlNzFhNTRkNTQzODM1YmE4NmFkYWQ5NDYwMzc5Yzc2NDFmYjg3MjZkMTY0ZWE3NjY4MDFhMWM1MjJhYmE3ZWEyIjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFRVhzejNTWlhGYjhqTVY0Mmo2cEpseWpialI4S1xuTjNCd29jZXhxNkxNSWI1cXNXS09RdkxOMTZOVWVmTGM0SHN3T291bVJzVlZhYWpTcFFTNmZvYmtSdz09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBtbm02NzgiCiAgIH0KICB9LAogICJyb2xlcyI6IHsKICAgInJvb3QiOiB7CiAgICAia2V5aWRzIjogWwogICAgICI2ZjI2MDA4OWQ1OTIzZGFmMjAxNjZjYTY1N2M1NDNhZjYxODM0NmFiOTcxODg0YTk5OTYyYjAxOTg4YmJlMGMzIiwKICAgICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICAgIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIKICAgIF0sCiAgICAidGhyZXNob2xkIjogMwogICB9LAogICAic25hcHNob3QiOiB7CiAgICAia2V5aWRzIjogWwogICAgICI3MjQ3ZjBkYmFkODViMTQ3ZTE4NjNiYWRlNzYxMjQzY2M3ODVkY2I3YWE0MTBlNzEwNWRkM2QyYjYxYTM2ZDJjIgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAxLAogICAgIngtdHVmLW9uLWNpLWV4cGlyeS1wZXJpb2QiOiAzNjUwLAogICAgIngtdHVmLW9uLWNpLXNpZ25pbmctcGVyaW9kIjogMzY1CiAgIH0sCiAgICJ0YXJnZXRzIjogewogICAgImtleWlkcyI6IFsKICAgICAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyIsCiAgICAgImU3MWE1NGQ1NDM4MzViYTg2YWRhZDk0NjAzNzljNzY0MWZiODcyNmQxNjRlYTc2NjgwMWExYzUyMmFiYTdlYTIiLAogICAgICIyMmY0Y2FlYzZkOGU2Zjk1NTVhZjY2YjNkNGMzY2IwNmEzYmIyM2ZkYzdlMzljOTE2YzYxZjQ2MmU2ZjUyYjA2IiwKICAgICAiNjE2NDM4MzgxMjViNDQwYjQwZGI2OTQyZjVjYjVhMzFjMGRjMDQzNjgzMTZlYjJhYWE1OGI5NTkwNGE1ODIyMiIsCiAgICAgImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDMKICAgfSwKICAgInRpbWVzdGFtcCI6IHsKICAgICJrZXlpZHMiOiBbCiAgICAgIjcyNDdmMGRiYWQ4NWIxNDdlMTg2M2JhZGU3NjEyNDNjYzc4NWRjYjdhYTQxMGU3MTA1ZGQzZDJiNjFhMzZkMmMiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDEsCiAgICAieC10dWYtb24tY2ktZXhwaXJ5LXBlcmlvZCI6IDcsCiAgICAieC10dWYtb24tY2ktc2lnbmluZy1wZXJpb2QiOiA0CiAgIH0KICB9LAogICJzcGVjX3ZlcnNpb24iOiAiMS4wIiwKICAidmVyc2lvbiI6IDEwLAogICJ4LXR1Zi1vbi1jaS1leHBpcnktcGVyaW9kIjogMTgyLAogICJ4LXR1Zi1vbi1jaS1zaWduaW5nLXBlcmlvZCI6IDMxCiB9Cn0=\",targets:{\"trusted_root.json\":\"ewogICJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLmRldi5zaWdzdG9yZS50cnVzdGVkcm9vdCtqc29uO3ZlcnNpb249MC4xIiwKICAidGxvZ3MiOiBbCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vcmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUyRzJZKzJ0YWJkVFY1QmNHaUJJeDBhOWZBRndya0JibUxTR3RrczRMM3FYNnlZWTB6dWZCbmhDOFVyL2l5NTVHaFdQLzlBL2JZMkxoQzMwTTkrUll0dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDEtMTJUMTE6NTM6MjcuMDAwWiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAid05JOWF0UUdseitWV2ZPNkxSeWdINFFVZlkvOFc0UkZ3aVQ1aTVXUmdCMD0iCiAgICAgIH0KICAgIH0KICBdLAogICJjZXJ0aWZpY2F0ZUF1dGhvcml0aWVzIjogWwogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly9mdWxjaW8uc2lnc3RvcmUuZGV2IiwKICAgICAgImNlcnRDaGFpbiI6IHsKICAgICAgICAiY2VydGlmaWNhdGVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQitEQ0NBWDZnQXdJQkFnSVROVmtEWm9DaW9mUERzeTdkZm02Z2VMYnVoekFLQmdncWhrak9QUVFEQXpBcU1SVXdFd1lEVlFRS0V3eHphV2R6ZEc5eVpTNWtaWFl4RVRBUEJnTlZCQU1UQ0hOcFozTjBiM0psTUI0WERUSXhNRE13TnpBek1qQXlPVm9YRFRNeE1ESXlNekF6TWpBeU9Wb3dLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkxTeUE3SWk1aytwTk84WkVXWTB5bGVtV0Rvd09rTmEza0wrR1pFNVo1R1dlaEw5L0E5YlJOQTNSYnJzWjVpMEpjYXN0YVJMN1NwNWZwL2pENWR4cWMvVWRUVm5sdlMxNmFuKzJZZnN3ZS9RdUxvbFJVQ3JjT0UyKzJpQTUrdHpkNk5tTUdRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0hRWURWUjBPQkJZRUZNakZIUUJCbWlRcE1sRWs2dzJ1U3UxS0J0UHNNQjhHQTFVZEl3UVlNQmFBRk1qRkhRQkJtaVFwTWxFazZ3MnVTdTFLQnRQc01Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01IOGxpV0pmTXVpNnZYWEJoakRnWTRNd3NsbU4vVEp4VmUvODNXckZvbXdtTmYwNTZ5MVg0OEY5YzRtM2Ezb3pYQUl4QUtqUmF5NS9hai9qc0tLR0lrbVFhdGpJOHV1cEhyLytDeEZ2YUpXbXBZcU5rTERHUlUrOW9yemg1aEkyUnJjdWFRPT0iCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMDdUMDM6MjA6MjkuMDAwWiIsCiAgICAgICAgImVuZCI6ICIyMDIyLTEyLTMxVDIzOjU5OjU5Ljk5OVoiCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAic2lnc3RvcmUuZGV2IiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJzaWdzdG9yZSIKICAgICAgfSwKICAgICAgInVyaSI6ICJodHRwczovL2Z1bGNpby5zaWdzdG9yZS5kZXYiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlDR2pDQ0FhR2dBd0lCQWdJVUFMblZpVmZuVTBickphc21Sa0hybi9VbmZhUXdDZ1lJS29aSXpqMEVBd013S2pFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUkV3RHdZRFZRUURFd2h6YVdkemRHOXlaVEFlRncweU1qQTBNVE15TURBMk1UVmFGdzB6TVRFd01EVXhNelUyTlRoYU1EY3hGVEFUQmdOVkJBb1RESE5wWjNOMGIzSmxMbVJsZGpFZU1Cd0dBMVVFQXhNVmMybG5jM1J2Y21VdGFXNTBaWEp0WldScFlYUmxNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRThSVlMveXNIK05PdnVEWnlQSVp0aWxnVUY5TmxhcllwQWQ5SFAxdkJCSDFVNUNWNzdMU1M3czBaaUg0bkU3SHY3cHRTNkx2dlIvU1RrNzk4TFZnTXpMbEo0SGVJZkYzdEhTYWV4TGNZcFNBU3Ixa1MwTi9SZ0JKei85aldDaVhubzNzd2VUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0V3WURWUjBsQkF3d0NnWUlLd1lCQlFVSEF3TXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBREFkQmdOVkhRNEVGZ1FVMzlQcHoxWWtFWmI1cU5qcEtGV2l4aTRZWkQ4d0h3WURWUjBqQkJnd0ZvQVVXTUFlWDVGRnBXYXBlc3lRb1pNaTBDckZ4Zm93Q2dZSUtvWkl6ajBFQXdNRFp3QXdaQUl3UENzUUs0RFlpWllEUElhRGk1SEZLbmZ4WHg2QVNTVm1FUmZzeW5ZQmlYMlg2U0pSblpVODQvOURaZG5GdnZ4bUFqQk90NlFwQmxjNEovMER4dmtUQ3FwY2x2emlMNkJDQ1BuamRsSUIzUHUzQnhzUG15Z1VZN0lpMnpiZENkbGlpb3c9IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUI5ekNDQVh5Z0F3SUJBZ0lVQUxaTkFQRmR4SFB3amVEbG9Ed3lZQ2hBTy80d0NnWUlLb1pJemowRUF3TXdLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQWVGdzB5TVRFd01EY3hNelUyTlRsYUZ3MHpNVEV3TURVeE16VTJOVGhhTUNveEZUQVRCZ05WQkFvVERITnBaM04wYjNKbExtUmxkakVSTUE4R0ExVUVBeE1JYzJsbmMzUnZjbVV3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBVDdYZUZUNHJiM1BRR3dTNElhanRMazMvT2xucGdhbmdhQmNsWXBzWUJyNWkrNHluQjA3Y2ViM0xQME9JT1pkeGV4WDY5YzVpVnV5SlJRK0h6MDV5aStVRjN1QldBbEhwaVM1c2gwK0gyR0hFN1NYcmsxRUM1bTFUcjE5TDlnZzkyall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUll3QjVma1VXbFpxbDZ6SkNoa3lMUUtzWEYrakFmQmdOVkhTTUVHREFXZ0JSWXdCNWZrVVdsWnFsNnpKQ2hreUxRS3NYRitqQUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUFqMW5IZVhacCsxM05XQk5hK0VEc0RQOEcxV1dnMXRDTVdQL1dIUHFwYVZvMGpoc3dlTkZaZ1NzMGVFN3dZSTRxQWpFQTJXQjlvdDk4c0lrb0YzdlpZZGQzL1Z0V0I1YjlUTk1lYTdJeC9zdEo1VGZjTExlQUJMRTRCTkpPc1E0dm5CSEoiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjItMDQtMTNUMjA6MDY6MTUuMDAwWiIKICAgICAgfQogICAgfQogIF0sCiAgImN0bG9ncyI6IFsKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi90ZXN0IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViZndSK1JKdWRYc2NnUkJScEtYMVhGRHkzUHl1ZER4ei9TZm5SaTFmVDhla3BmQmQyTzF1b3o3anIzWjhuS3p4QTY5RVVRK2VGQ0ZJM3pldWJQV1U3dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMTRUMDA6MDA6MDAuMDAwWiIsCiAgICAgICAgICAiZW5kIjogIjIwMjItMTAtMzFUMjM6NTk6NTkuOTk5WiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAiQ0dDUzhDaFMvMmhGMGRGcko0U2NSV2NZckJZOXd6alNiZWE4SWdZMmIzST0iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vY3RmZS5zaWdzdG9yZS5kZXYvMjAyMiIsCiAgICAgICJoYXNoQWxnb3JpdGhtIjogIlNIQTJfMjU2IiwKICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAicmF3Qnl0ZXMiOiAiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaVBTbEZpMENtRlRmRWpDVXFGOUh1Q0VjWVhOS0FhWWFsSUptQlo4eXllelBqVHFoeHJLQnBNbmFvY1Z0TEpCSTFlTTN1WG5RelFHQUpkSjRnczlGeXc9PSIsCiAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICJzdGFydCI6ICIyMDIyLTEwLTIwVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgfQogICAgICB9LAogICAgICAibG9nSWQiOiB7CiAgICAgICAgImtleUlkIjogIjNUMHdhc2JIRVRKakdSNGNtV2MzQXFKS1hyamVQSzMvaDRweWdDOHA3bzQ9IgogICAgICB9CiAgICB9CiAgXSwKICAidGltZXN0YW1wQXV0aG9yaXRpZXMiOiBbCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAiR2l0SHViLCBJbmMuIiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJJbnRlcm5hbCBTZXJ2aWNlcyBSb290IgogICAgICB9LAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCM0RDQ0FXS2dBd0lCQWdJVWNoa05zSDM2WGEwNGIxTHFJYytxcjlEVmVjTXdDZ1lJS29aSXpqMEVBd013TWpFVk1CTUdBMVVFQ2hNTVIybDBTSFZpTENCSmJtTXVNUmt3RndZRFZRUURFeEJVVTBFZ2FXNTBaWEp0WldScFlYUmxNQjRYRFRJek1EUXhOREF3TURBd01Gb1hEVEkwTURReE16QXdNREF3TUZvd01qRVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVJrd0Z3WURWUVFERXhCVVUwRWdWR2x0WlhOMFlXMXdhVzVuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFVUQ1Wk5iU3FZTWQ2cjhxcE9PRVg5aWJHblpUOUdzdVhPaHIvZjhVOUZKdWdCR0V4S1lwNDBPVUxTMGVyalpXN3hWOXhWNTJObkpmNU9lRHE0ZTVaS3FOV01GUXdEZ1lEVlIwUEFRSC9CQVFEQWdlQU1CTUdBMVVkSlFRTU1Bb0dDQ3NHQVFVRkJ3TUlNQXdHQTFVZEV3RUIvd1FDTUFBd0h3WURWUjBqQkJnd0ZvQVVhVzFSdWRPZ1Z0MGxlcVkwV0tZYnVQcjQ3d0F3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl3YlVIOUh2RDRlakNaSk9XUW5xQWxrcVVSbGx2dTlNOCtWcUxiaVJLK3pTZlpDWndzaWxqUm44TVFRUlNrWEVFNUFqRUFnK1Z4cXRvamZWZnU4RGh6emhDeDlHS0VUYkpIYjE5aVY3Mm1NS1ViREFGbXpaNmJROGI1NFpiOHRpZHk1YVdlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUNFRENDQVpXZ0F3SUJBZ0lVWDhaTzVRWFA3dk40ZE1RNWU5c1UzbnViOE9nd0NnWUlLb1pJemowRUF3TXdPREVWTUJNR0ExVUVDaE1NUjJsMFNIVmlMQ0JKYm1NdU1SOHdIUVlEVlFRREV4WkpiblJsY201aGJDQlRaWEoyYVdObGN5QlNiMjkwTUI0WERUSXpNRFF4TkRBd01EQXdNRm9YRFRJNE1EUXhNakF3TURBd01Gb3dNakVWTUJNR0ExVUVDaE1NUjJsMFNIVmlMQ0JKYm1NdU1Sa3dGd1lEVlFRREV4QlVVMEVnYVc1MFpYSnRaV1JwWVhSbE1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFdk1MWS9kVFZidklKWUFOQXVzekV3Sm5RRTFsbGZ0eW55TUtJTWhoNDhIbXFiVnI1eWd5YnpzTFJMVktiQldPZFoyMWFlSnorZ1ppeXRaZXRxY3lGOVdsRVI1TkVNZjZKVjdaTm9qUXB4SHE0UkhHb0dTY2VRdi9xdlRpWnhFREtvMll3WkRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQURBZEJnTlZIUTRFRmdRVWFXMVJ1ZE9nVnQwbGVxWTBXS1lidVByNDd3QXdId1lEVlIwakJCZ3dGb0FVOU5ZWWxvYm5BRzRjMC9xanh5SC9scS93eitRd0NnWUlLb1pJemowRUF3TURhUUF3WmdJeEFLMUIxODV5Z0NySVlGbElzM0dqc3dqbndTTUc2TFk4d29MVmRha0tEWnhWYThmOGNxTXMxRGhjeEowKzA5dzk1UUl4QU8rdEJ6Wms3dmpVSjlpSmdENFI2WldUeFFXS3FObTc0ak85OW8rbzlzdjRGSS9TWlRaVEZ5TW4wSUpFSGRObXlBPT0iCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQjlEQ0NBWHFnQXdJQkFnSVVhL0pBa2RVaks0SlV3c3F0YWlSSkdXaHFMU293Q2dZSUtvWkl6ajBFQXdNd09ERVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVI4d0hRWURWUVFERXhaSmJuUmxjbTVoYkNCVFpYSjJhV05sY3lCU2IyOTBNQjRYRFRJek1EUXhOREF3TURBd01Gb1hEVE16TURReE1UQXdNREF3TUZvd09ERVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVI4d0hRWURWUVFERXhaSmJuUmxjbTVoYkNCVFpYSjJhV05sY3lCU2IyOTBNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRWY5akZBWHh6NGt4NjhBSFJNT2tGQmhmbERjTVR2emFYejR4L0ZDY1hqSi8xcUVLb24vcVBJR25hVVJza0R0eU5iTkRPcGVKVERERnF0NDhpTVBybnpweDZJWndxZW1mVUpONHhCRVpmemErcFl0L2l5b2QrOXRacjIwUlJXU3YvbzBVd1F6QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQWRCZ05WSFE0RUZnUVU5TllZbG9ibkFHNGMwL3FqeHlIL2xxL3d6K1F3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4QUxaTFo4QmdSWHpLeExNTU45VklsTytlNGhyQm5OQmdGN3R6N0hucm93djJOZXRaRXJJQUNLRnltQmx2V0R2dE1BSXdaTytraTZzc1ExYnNabzk4TzhtRUFmMk5aN2lpQ2dERFUwVndqZWNvNnp5ZWgwekJUczkvN2dWNkFITlE1M3hEIgogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgInZhbGlkRm9yIjogewogICAgICAgICJzdGFydCI6ICIyMDIzLTA0LTE0VDAwOjAwOjAwLjAwMFoiCiAgICAgIH0KICAgIH0KICBdCn0K\",\"registry.npmjs.org%2Fkeys.json\":\"ewogICAgImtleXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIxOTk5LTAxLTAxVDAwOjAwOjAwLjAwMFoiLAogICAgICAgICAgICAgICAgICAgICJlbmQiOiAiMjAyNS0wMS0yOVQwMDowMDowMC4wMDBaIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJrZXlJZCI6ICJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsCiAgICAgICAgICAgICJrZXlVc2FnZSI6ICJucG06YXR0ZXN0YXRpb25zIiwKICAgICAgICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUxT2xiM3pNQUZGeFhLSGlJa1FPNWNKM1lobDVpNlVQcCtJaHV0ZUJKYnVIY0E1VW9nS28wRVd0bFd3VzZLU2FLb1RORVlMN0psQ1FpVm5raEJrdFVnZz09IiwKICAgICAgICAgICAgICAgICJrZXlEZXRhaWxzIjogIlBLSVhfRUNEU0FfUDI1Nl9TSEFfMjU2IiwKICAgICAgICAgICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICAgICAgICAgICAic3RhcnQiOiAiMjAyMi0xMi0wMVQwMDowMDowMC4wMDBaIiwKICAgICAgICAgICAgICAgICAgICAiZW5kIjogIjIwMjUtMDEtMjlUMDA6MDA6MDAuMDAwWiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OkRoUTh3UjVBUEJ2RkhMRi8rVGMrQVl2UE9kVHBjSURxT2h4c0JIUndDN1UiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImtleUlkIjogIlNIQTI1NjpEaFE4d1I1QVBCdkZITEYvK1RjK0FZdlBPZFRwY0lEcU9oeHNCSFJ3QzdVIiwKICAgICAgICAgICAgImtleVVzYWdlIjogIm5wbTphdHRlc3RhdGlvbnMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICBdCn0K\"}}}});var nxe=_(y1=>{\"use strict\";var rxe=y1&&y1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(y1,\"__esModule\",{value:!0});y1.TUFClient=void 0;var Tg=rxe(Ie(\"fs\")),qb=rxe(Ie(\"path\")),Zvt=$Pe(),$vt=hL(),eSt=exe(),$J=\"targets\",ZJ=class{constructor(e){let r=new URL(e.mirrorURL),s=encodeURIComponent(r.host+r.pathname.replace(/\\/$/,\"\")),a=qb.default.join(e.cachePath,s);tSt(a),rSt({cachePath:a,mirrorURL:e.mirrorURL,tufRootPath:e.rootPath,forceInit:e.forceInit}),this.updater=nSt({mirrorURL:e.mirrorURL,cachePath:a,forceCache:e.forceCache,retry:e.retry,timeout:e.timeout})}async refresh(){return this.updater.refresh()}getTarget(e){return(0,eSt.readTarget)(this.updater,e)}};y1.TUFClient=ZJ;function tSt(t){let e=qb.default.join(t,$J);Tg.default.existsSync(t)||Tg.default.mkdirSync(t,{recursive:!0}),Tg.default.existsSync(e)||Tg.default.mkdirSync(e)}function rSt({cachePath:t,mirrorURL:e,tufRootPath:r,forceInit:s}){let a=qb.default.join(t,\"root.json\");if(!Tg.default.existsSync(a)||s)if(r)Tg.default.copyFileSync(r,a);else{let c=txe()[e];if(!c)throw new $vt.TUFError({code:\"TUF_INIT_CACHE_ERROR\",message:`No root.json found for mirror: ${e}`});Tg.default.writeFileSync(a,Buffer.from(c[\"root.json\"],\"base64\")),Object.entries(c.targets).forEach(([f,p])=>{Tg.default.writeFileSync(qb.default.join(t,$J,f),Buffer.from(p,\"base64\"))})}}function nSt(t){let e={fetchTimeout:t.timeout,fetchRetry:t.retry};return new Zvt.Updater({metadataBaseUrl:t.mirrorURL,targetBaseUrl:`${t.mirrorURL}/targets`,metadataDir:t.cachePath,targetDir:qb.default.join(t.cachePath,$J),forceCache:t.forceCache,config:e})}});var hL=_(gh=>{\"use strict\";Object.defineProperty(gh,\"__esModule\",{value:!0});gh.TUFError=gh.DEFAULT_MIRROR_URL=void 0;gh.getTrustedRoot=fSt;gh.initTUF=ASt;var iSt=yb(),sSt=Obe(),oSt=nxe();gh.DEFAULT_MIRROR_URL=\"https://tuf-repo-cdn.sigstore.dev\";var aSt=\"sigstore-js\",lSt={retries:2},cSt=5e3,uSt=\"trusted_root.json\";async function fSt(t={}){let r=await ixe(t).getTarget(uSt);return iSt.TrustedRoot.fromJSON(JSON.parse(r))}async function ASt(t={}){let e=ixe(t);return e.refresh().then(()=>e)}function ixe(t){return new oSt.TUFClient({cachePath:t.cachePath||(0,sSt.appDataPath)(aSt),rootPath:t.rootPath,mirrorURL:t.mirrorURL||gh.DEFAULT_MIRROR_URL,retry:t.retry??lSt,timeout:t.timeout??cSt,forceCache:t.forceCache??!1,forceInit:t.forceInit??t.force??!1})}var pSt=XJ();Object.defineProperty(gh,\"TUFError\",{enumerable:!0,get:function(){return pSt.TUFError}})});var sxe=_(gL=>{\"use strict\";Object.defineProperty(gL,\"__esModule\",{value:!0});gL.DSSESignatureContent=void 0;var Wb=Cl(),eK=class{constructor(e){this.env=e}compareDigest(e){return Wb.crypto.bufferEqual(e,Wb.crypto.digest(\"sha256\",this.env.payload))}compareSignature(e){return Wb.crypto.bufferEqual(e,this.signature)}verifySignature(e){return Wb.crypto.verify(this.preAuthEncoding,e,this.signature)}get signature(){return this.env.signatures.length>0?this.env.signatures[0].sig:Buffer.from(\"\")}get preAuthEncoding(){return Wb.dsse.preAuthEncoding(this.env.payloadType,this.env.payload)}};gL.DSSESignatureContent=eK});var oxe=_(dL=>{\"use strict\";Object.defineProperty(dL,\"__esModule\",{value:!0});dL.MessageSignatureContent=void 0;var tK=Cl(),rK=class{constructor(e,r){this.signature=e.signature,this.messageDigest=e.messageDigest.digest,this.artifact=r}compareSignature(e){return tK.crypto.bufferEqual(e,this.signature)}compareDigest(e){return tK.crypto.bufferEqual(e,this.messageDigest)}verifySignature(e){return tK.crypto.verify(this.artifact,e,this.signature)}};dL.MessageSignatureContent=rK});var lxe=_(mL=>{\"use strict\";Object.defineProperty(mL,\"__esModule\",{value:!0});mL.toSignedEntity=dSt;mL.signatureContent=axe;var nK=Cl(),hSt=sxe(),gSt=oxe();function dSt(t,e){let{tlogEntries:r,timestampVerificationData:s}=t.verificationMaterial,a=[];for(let n of r)a.push({$case:\"transparency-log\",tlogEntry:n});for(let n of s?.rfc3161Timestamps??[])a.push({$case:\"timestamp-authority\",timestamp:nK.RFC3161Timestamp.parse(n.signedTimestamp)});return{signature:axe(t,e),key:mSt(t),tlogEntries:r,timestamps:a}}function axe(t,e){switch(t.content.$case){case\"dsseEnvelope\":return new hSt.DSSESignatureContent(t.content.dsseEnvelope);case\"messageSignature\":return new gSt.MessageSignatureContent(t.content.messageSignature,e)}}function mSt(t){switch(t.verificationMaterial.content.$case){case\"publicKey\":return{$case:\"public-key\",hint:t.verificationMaterial.content.publicKey.hint};case\"x509CertificateChain\":return{$case:\"certificate\",certificate:nK.X509Certificate.parse(t.verificationMaterial.content.x509CertificateChain.certificates[0].rawBytes)};case\"certificate\":return{$case:\"certificate\",certificate:nK.X509Certificate.parse(t.verificationMaterial.content.certificate.rawBytes)}}}});var Eo=_(E1=>{\"use strict\";Object.defineProperty(E1,\"__esModule\",{value:!0});E1.PolicyError=E1.VerificationError=void 0;var yL=class extends Error{constructor({code:e,message:r,cause:s}){super(r),this.code=e,this.cause=s,this.name=this.constructor.name}},iK=class extends yL{};E1.VerificationError=iK;var sK=class extends yL{};E1.PolicyError=sK});var cxe=_(EL=>{\"use strict\";Object.defineProperty(EL,\"__esModule\",{value:!0});EL.filterCertAuthorities=ySt;EL.filterTLogAuthorities=ESt;function ySt(t,e){return t.filter(r=>r.validFor.start<=e.start&&r.validFor.end>=e.end)}function ESt(t,e){return t.filter(r=>e.logID&&!r.logID.equals(e.logID)?!1:r.validFor.start<=e.targetDate&&e.targetDate<=r.validFor.end)}});var py=_(Ay=>{\"use strict\";Object.defineProperty(Ay,\"__esModule\",{value:!0});Ay.filterTLogAuthorities=Ay.filterCertAuthorities=void 0;Ay.toTrustMaterial=CSt;var oK=Cl(),Yb=yb(),ISt=Eo(),aK=new Date(0),lK=new Date(864e13),Axe=cxe();Object.defineProperty(Ay,\"filterCertAuthorities\",{enumerable:!0,get:function(){return Axe.filterCertAuthorities}});Object.defineProperty(Ay,\"filterTLogAuthorities\",{enumerable:!0,get:function(){return Axe.filterTLogAuthorities}});function CSt(t,e){let r=typeof e==\"function\"?e:wSt(e);return{certificateAuthorities:t.certificateAuthorities.map(fxe),timestampAuthorities:t.timestampAuthorities.map(fxe),tlogs:t.tlogs.map(uxe),ctlogs:t.ctlogs.map(uxe),publicKey:r}}function uxe(t){let e=t.publicKey.keyDetails,r=e===Yb.PublicKeyDetails.PKCS1_RSA_PKCS1V5||e===Yb.PublicKeyDetails.PKIX_RSA_PKCS1V5||e===Yb.PublicKeyDetails.PKIX_RSA_PKCS1V15_2048_SHA256||e===Yb.PublicKeyDetails.PKIX_RSA_PKCS1V15_3072_SHA256||e===Yb.PublicKeyDetails.PKIX_RSA_PKCS1V15_4096_SHA256?\"pkcs1\":\"spki\";return{logID:t.logId.keyId,publicKey:oK.crypto.createPublicKey(t.publicKey.rawBytes,r),validFor:{start:t.publicKey.validFor?.start||aK,end:t.publicKey.validFor?.end||lK}}}function fxe(t){return{certChain:t.certChain.certificates.map(e=>oK.X509Certificate.parse(e.rawBytes)),validFor:{start:t.validFor?.start||aK,end:t.validFor?.end||lK}}}function wSt(t){return e=>{let r=(t||{})[e];if(!r)throw new ISt.VerificationError({code:\"PUBLIC_KEY_ERROR\",message:`key not found: ${e}`});return{publicKey:oK.crypto.createPublicKey(r.rawBytes),validFor:s=>(r.validFor?.start||aK)<=s&&(r.validFor?.end||lK)>=s}}}});var cK=_(Vb=>{\"use strict\";Object.defineProperty(Vb,\"__esModule\",{value:!0});Vb.CertificateChainVerifier=void 0;Vb.verifyCertificateChain=vSt;var hy=Eo(),BSt=py();function vSt(t,e){let r=(0,BSt.filterCertAuthorities)(e,{start:t.notBefore,end:t.notAfter}),s;for(let a of r)try{return new IL({trustedCerts:a.certChain,untrustedCert:t}).verify()}catch(n){s=n}throw new hy.VerificationError({code:\"CERTIFICATE_ERROR\",message:\"Failed to verify certificate chain\",cause:s})}var IL=class{constructor(e){this.untrustedCert=e.untrustedCert,this.trustedCerts=e.trustedCerts,this.localCerts=SSt([...e.trustedCerts,e.untrustedCert])}verify(){let e=this.sort();return this.checkPath(e),e}sort(){let e=this.untrustedCert,r=this.buildPaths(e);if(r=r.filter(a=>a.some(n=>this.trustedCerts.includes(n))),r.length===0)throw new hy.VerificationError({code:\"CERTIFICATE_ERROR\",message:\"no trusted certificate path found\"});let s=r.reduce((a,n)=>a.length<n.length?a:n);return[e,...s].slice(0,-1)}buildPaths(e){let r=[],s=this.findIssuer(e);if(s.length===0)throw new hy.VerificationError({code:\"CERTIFICATE_ERROR\",message:\"no valid certificate path found\"});for(let a=0;a<s.length;a++){let n=s[a];if(n.equals(e)){r.push([e]);continue}let c=this.buildPaths(n);for(let f=0;f<c.length;f++)r.push([n,...c[f]])}return r}findIssuer(e){let r=[],s;return e.subject.equals(e.issuer)&&e.verify()?[e]:(e.extAuthorityKeyID&&(s=e.extAuthorityKeyID.keyIdentifier),this.localCerts.forEach(a=>{if(s&&a.extSubjectKeyID){a.extSubjectKeyID.keyIdentifier.equals(s)&&r.push(a);return}a.subject.equals(e.issuer)&&r.push(a)}),r=r.filter(a=>{try{return e.verify(a)}catch{return!1}}),r)}checkPath(e){if(e.length<1)throw new hy.VerificationError({code:\"CERTIFICATE_ERROR\",message:\"certificate chain must contain at least one certificate\"});if(!e.slice(1).every(s=>s.isCA))throw new hy.VerificationError({code:\"CERTIFICATE_ERROR\",message:\"intermediate certificate is not a CA\"});for(let s=e.length-2;s>=0;s--)if(!e[s].issuer.equals(e[s+1].subject))throw new hy.VerificationError({code:\"CERTIFICATE_ERROR\",message:\"incorrect certificate name chaining\"});for(let s=0;s<e.length;s++){let a=e[s];if(a.extBasicConstraints?.isCA){let n=a.extBasicConstraints.pathLenConstraint;if(n!==void 0&&n<s-1)throw new hy.VerificationError({code:\"CERTIFICATE_ERROR\",message:\"path length constraint exceeded\"})}}}};Vb.CertificateChainVerifier=IL;function SSt(t){for(let e=0;e<t.length;e++)for(let r=e+1;r<t.length;r++)t[e].equals(t[r])&&(t.splice(r,1),r--);return t}});var pxe=_(uK=>{\"use strict\";Object.defineProperty(uK,\"__esModule\",{value:!0});uK.verifySCTs=PSt;var CL=Cl(),DSt=Eo(),bSt=py();function PSt(t,e,r){let s,a=t.clone();for(let p=0;p<a.extensions.length;p++){let h=a.extensions[p];if(h.subs[0].toOID()===CL.EXTENSION_OID_SCT){s=new CL.X509SCTExtension(h),a.extensions.splice(p,1);break}}if(!s)return[];if(s.signedCertificateTimestamps.length===0)return[];let n=new CL.ByteStream,c=CL.crypto.digest(\"sha256\",e.publicKey);n.appendView(c);let f=a.tbsCertificate.toDER();return n.appendUint24(f.length),n.appendView(f),s.signedCertificateTimestamps.map(p=>{if(!(0,bSt.filterTLogAuthorities)(r,{logID:p.logID,targetDate:p.datetime}).some(C=>p.verify(n.buffer,C.publicKey)))throw new DSt.VerificationError({code:\"CERTIFICATE_ERROR\",message:\"SCT verification failed\"});return p.logID})}});var gxe=_(wL=>{\"use strict\";Object.defineProperty(wL,\"__esModule\",{value:!0});wL.verifyPublicKey=FSt;wL.verifyCertificate=NSt;var xSt=Cl(),hxe=Eo(),kSt=cK(),QSt=pxe(),TSt=\"1.3.6.1.4.1.57264.1.1\",RSt=\"1.3.6.1.4.1.57264.1.8\";function FSt(t,e,r){let s=r.publicKey(t);return e.forEach(a=>{if(!s.validFor(a))throw new hxe.VerificationError({code:\"PUBLIC_KEY_ERROR\",message:`Public key is not valid for timestamp: ${a.toISOString()}`})}),{key:s.publicKey}}function NSt(t,e,r){let s=(0,kSt.verifyCertificateChain)(t,r.certificateAuthorities);if(!e.every(n=>s.every(c=>c.validForDate(n))))throw new hxe.VerificationError({code:\"CERTIFICATE_ERROR\",message:\"certificate is not valid or expired at the specified date\"});return{scts:(0,QSt.verifySCTs)(s[0],s[1],r.ctlogs),signer:OSt(s[0])}}function OSt(t){let e,r=t.extension(RSt);r?e=r.valueObj.subs?.[0]?.value.toString(\"ascii\"):e=t.extension(TSt)?.value.toString(\"ascii\");let s={extensions:{issuer:e},subjectAlternativeName:t.subjectAltName};return{key:xSt.crypto.createPublicKey(t.publicKey),identity:s}}});var mxe=_(BL=>{\"use strict\";Object.defineProperty(BL,\"__esModule\",{value:!0});BL.verifySubjectAlternativeName=LSt;BL.verifyExtensions=MSt;var dxe=Eo();function LSt(t,e){if(e===void 0||!e.match(t))throw new dxe.PolicyError({code:\"UNTRUSTED_SIGNER_ERROR\",message:`certificate identity error - expected ${t}, got ${e}`})}function MSt(t,e={}){let r;for(r in t)if(e[r]!==t[r])throw new dxe.PolicyError({code:\"UNTRUSTED_SIGNER_ERROR\",message:`invalid certificate extension - expected ${r}=${t[r]}, got ${r}=${e[r]}`})}});var yxe=_(gK=>{\"use strict\";Object.defineProperty(gK,\"__esModule\",{value:!0});gK.verifyCheckpoint=HSt;var AK=Cl(),I1=Eo(),USt=py(),fK=`\n\n`,_St=/\\u2014 (\\S+) (\\S+)\\n/g;function HSt(t,e){let r=(0,USt.filterTLogAuthorities)(e,{targetDate:new Date(Number(t.integratedTime)*1e3)}),s=t.inclusionProof,a=pK.fromString(s.checkpoint.envelope),n=hK.fromString(a.note);if(!jSt(a,r))throw new I1.VerificationError({code:\"TLOG_INCLUSION_PROOF_ERROR\",message:\"invalid checkpoint signature\"});if(!AK.crypto.bufferEqual(n.logHash,s.rootHash))throw new I1.VerificationError({code:\"TLOG_INCLUSION_PROOF_ERROR\",message:\"root hash mismatch\"})}function jSt(t,e){let r=Buffer.from(t.note,\"utf-8\");return t.signatures.every(s=>{let a=e.find(n=>AK.crypto.bufferEqual(n.logID.subarray(0,4),s.keyHint));return a?AK.crypto.verify(r,a.publicKey,s.signature):!1})}var pK=class t{constructor(e,r){this.note=e,this.signatures=r}static fromString(e){if(!e.includes(fK))throw new I1.VerificationError({code:\"TLOG_INCLUSION_PROOF_ERROR\",message:\"missing checkpoint separator\"});let r=e.indexOf(fK),s=e.slice(0,r+1),n=e.slice(r+fK.length).matchAll(_St),c=Array.from(n,f=>{let[,p,h]=f,E=Buffer.from(h,\"base64\");if(E.length<5)throw new I1.VerificationError({code:\"TLOG_INCLUSION_PROOF_ERROR\",message:\"malformed checkpoint signature\"});return{name:p,keyHint:E.subarray(0,4),signature:E.subarray(4)}});if(c.length===0)throw new I1.VerificationError({code:\"TLOG_INCLUSION_PROOF_ERROR\",message:\"no signatures found in checkpoint\"});return new t(s,c)}},hK=class t{constructor(e,r,s,a){this.origin=e,this.logSize=r,this.logHash=s,this.rest=a}static fromString(e){let r=e.trimEnd().split(`\n`);if(r.length<3)throw new I1.VerificationError({code:\"TLOG_INCLUSION_PROOF_ERROR\",message:\"too few lines in checkpoint header\"});let s=r[0],a=BigInt(r[1]),n=Buffer.from(r[2],\"base64\"),c=r.slice(3);return new t(s,a,n,c)}}});var Exe=_(EK=>{\"use strict\";Object.defineProperty(EK,\"__esModule\",{value:!0});EK.verifyMerkleInclusion=WSt;var yK=Cl(),dK=Eo(),GSt=Buffer.from([0]),qSt=Buffer.from([1]);function WSt(t){let e=t.inclusionProof,r=BigInt(e.logIndex),s=BigInt(e.treeSize);if(r<0n||r>=s)throw new dK.VerificationError({code:\"TLOG_INCLUSION_PROOF_ERROR\",message:`invalid index: ${r}`});let{inner:a,border:n}=YSt(r,s);if(e.hashes.length!==a+n)throw new dK.VerificationError({code:\"TLOG_INCLUSION_PROOF_ERROR\",message:\"invalid hash count\"});let c=e.hashes.slice(0,a),f=e.hashes.slice(a),p=ZSt(t.canonicalizedBody),h=JSt(VSt(p,c,r),f);if(!yK.crypto.bufferEqual(h,e.rootHash))throw new dK.VerificationError({code:\"TLOG_INCLUSION_PROOF_ERROR\",message:\"calculated root hash does not match inclusion proof\"})}function YSt(t,e){let r=KSt(t,e),s=zSt(t>>BigInt(r));return{inner:r,border:s}}function VSt(t,e,r){return e.reduce((s,a,n)=>r>>BigInt(n)&BigInt(1)?mK(a,s):mK(s,a),t)}function JSt(t,e){return e.reduce((r,s)=>mK(s,r),t)}function KSt(t,e){return XSt(t^e-BigInt(1))}function zSt(t){return t.toString(2).split(\"1\").length-1}function XSt(t){return t===0n?0:t.toString(2).length}function mK(t,e){return yK.crypto.digest(\"sha256\",qSt,t,e)}function ZSt(t){return yK.crypto.digest(\"sha256\",GSt,t)}});var Cxe=_(IK=>{\"use strict\";Object.defineProperty(IK,\"__esModule\",{value:!0});IK.verifyTLogSET=tDt;var Ixe=Cl(),$St=Eo(),eDt=py();function tDt(t,e){if(!(0,eDt.filterTLogAuthorities)(e,{logID:t.logId.keyId,targetDate:new Date(Number(t.integratedTime)*1e3)}).some(a=>{let n=rDt(t),c=Buffer.from(Ixe.json.canonicalize(n),\"utf8\"),f=t.inclusionPromise.signedEntryTimestamp;return Ixe.crypto.verify(c,a.publicKey,f)}))throw new $St.VerificationError({code:\"TLOG_INCLUSION_PROMISE_ERROR\",message:\"inclusion promise could not be verified\"})}function rDt(t){let{integratedTime:e,logIndex:r,logId:s,canonicalizedBody:a}=t;return{body:a.toString(\"base64\"),integratedTime:Number(e),logIndex:Number(r),logID:s.keyId.toString(\"hex\")}}});var wxe=_(BK=>{\"use strict\";Object.defineProperty(BK,\"__esModule\",{value:!0});BK.verifyRFC3161Timestamp=sDt;var CK=Cl(),wK=Eo(),nDt=cK(),iDt=py();function sDt(t,e,r){let s=t.signingTime;if(r=(0,iDt.filterCertAuthorities)(r,{start:s,end:s}),r=aDt(r,{serialNumber:t.signerSerialNumber,issuer:t.signerIssuer}),!r.some(n=>{try{return oDt(t,e,n),!0}catch{return!1}}))throw new wK.VerificationError({code:\"TIMESTAMP_ERROR\",message:\"timestamp could not be verified\"})}function oDt(t,e,r){let[s,...a]=r.certChain,n=CK.crypto.createPublicKey(s.publicKey),c=t.signingTime;try{new nDt.CertificateChainVerifier({untrustedCert:s,trustedCerts:a}).verify()}catch{throw new wK.VerificationError({code:\"TIMESTAMP_ERROR\",message:\"invalid certificate chain\"})}if(!r.certChain.every(p=>p.validForDate(c)))throw new wK.VerificationError({code:\"TIMESTAMP_ERROR\",message:\"timestamp was signed with an expired certificate\"});t.verify(e,n)}function aDt(t,e){return t.filter(r=>r.certChain.length>0&&CK.crypto.bufferEqual(r.certChain[0].serialNumber,e.serialNumber)&&CK.crypto.bufferEqual(r.certChain[0].issuer,e.issuer))}});var Bxe=_(vL=>{\"use strict\";Object.defineProperty(vL,\"__esModule\",{value:!0});vL.verifyTSATimestamp=pDt;vL.verifyTLogTimestamp=hDt;var lDt=Eo(),cDt=yxe(),uDt=Exe(),fDt=Cxe(),ADt=wxe();function pDt(t,e,r){return(0,ADt.verifyRFC3161Timestamp)(t,e,r),{type:\"timestamp-authority\",logID:t.signerSerialNumber,timestamp:t.signingTime}}function hDt(t,e){let r=!1;if(gDt(t)&&((0,fDt.verifyTLogSET)(t,e),r=!0),dDt(t)&&((0,uDt.verifyMerkleInclusion)(t),(0,cDt.verifyCheckpoint)(t,e),r=!0),!r)throw new lDt.VerificationError({code:\"TLOG_MISSING_INCLUSION_ERROR\",message:\"inclusion could not be verified\"});return{type:\"transparency-log\",logID:t.logId.keyId,timestamp:new Date(Number(t.integratedTime)*1e3)}}function gDt(t){return t.inclusionPromise!==void 0}function dDt(t){return t.inclusionProof!==void 0}});var vxe=_(vK=>{\"use strict\";Object.defineProperty(vK,\"__esModule\",{value:!0});vK.verifyDSSETLogBody=mDt;var SL=Eo();function mDt(t,e){switch(t.apiVersion){case\"0.0.1\":return yDt(t,e);default:throw new SL.VerificationError({code:\"TLOG_BODY_ERROR\",message:`unsupported dsse version: ${t.apiVersion}`})}}function yDt(t,e){if(t.spec.signatures?.length!==1)throw new SL.VerificationError({code:\"TLOG_BODY_ERROR\",message:\"signature count mismatch\"});let r=t.spec.signatures[0].signature;if(!e.compareSignature(Buffer.from(r,\"base64\")))throw new SL.VerificationError({code:\"TLOG_BODY_ERROR\",message:\"tlog entry signature mismatch\"});let s=t.spec.payloadHash?.value||\"\";if(!e.compareDigest(Buffer.from(s,\"hex\")))throw new SL.VerificationError({code:\"TLOG_BODY_ERROR\",message:\"DSSE payload hash mismatch\"})}});var Sxe=_(DK=>{\"use strict\";Object.defineProperty(DK,\"__esModule\",{value:!0});DK.verifyHashedRekordTLogBody=EDt;var SK=Eo();function EDt(t,e){switch(t.apiVersion){case\"0.0.1\":return IDt(t,e);default:throw new SK.VerificationError({code:\"TLOG_BODY_ERROR\",message:`unsupported hashedrekord version: ${t.apiVersion}`})}}function IDt(t,e){let r=t.spec.signature.content||\"\";if(!e.compareSignature(Buffer.from(r,\"base64\")))throw new SK.VerificationError({code:\"TLOG_BODY_ERROR\",message:\"signature mismatch\"});let s=t.spec.data.hash?.value||\"\";if(!e.compareDigest(Buffer.from(s,\"hex\")))throw new SK.VerificationError({code:\"TLOG_BODY_ERROR\",message:\"digest mismatch\"})}});var Dxe=_(bK=>{\"use strict\";Object.defineProperty(bK,\"__esModule\",{value:!0});bK.verifyIntotoTLogBody=CDt;var DL=Eo();function CDt(t,e){switch(t.apiVersion){case\"0.0.2\":return wDt(t,e);default:throw new DL.VerificationError({code:\"TLOG_BODY_ERROR\",message:`unsupported intoto version: ${t.apiVersion}`})}}function wDt(t,e){if(t.spec.content.envelope.signatures?.length!==1)throw new DL.VerificationError({code:\"TLOG_BODY_ERROR\",message:\"signature count mismatch\"});let r=BDt(t.spec.content.envelope.signatures[0].sig);if(!e.compareSignature(Buffer.from(r,\"base64\")))throw new DL.VerificationError({code:\"TLOG_BODY_ERROR\",message:\"tlog entry signature mismatch\"});let s=t.spec.content.payloadHash?.value||\"\";if(!e.compareDigest(Buffer.from(s,\"hex\")))throw new DL.VerificationError({code:\"TLOG_BODY_ERROR\",message:\"DSSE payload hash mismatch\"})}function BDt(t){return Buffer.from(t,\"base64\").toString(\"utf-8\")}});var Pxe=_(PK=>{\"use strict\";Object.defineProperty(PK,\"__esModule\",{value:!0});PK.verifyTLogBody=bDt;var bxe=Eo(),vDt=vxe(),SDt=Sxe(),DDt=Dxe();function bDt(t,e){let{kind:r,version:s}=t.kindVersion,a=JSON.parse(t.canonicalizedBody.toString(\"utf8\"));if(r!==a.kind||s!==a.apiVersion)throw new bxe.VerificationError({code:\"TLOG_BODY_ERROR\",message:`kind/version mismatch - expected: ${r}/${s}, received: ${a.kind}/${a.apiVersion}`});switch(a.kind){case\"dsse\":return(0,vDt.verifyDSSETLogBody)(a,e);case\"intoto\":return(0,DDt.verifyIntotoTLogBody)(a,e);case\"hashedrekord\":return(0,SDt.verifyHashedRekordTLogBody)(a,e);default:throw new bxe.VerificationError({code:\"TLOG_BODY_ERROR\",message:`unsupported kind: ${r}`})}}});var Rxe=_(bL=>{\"use strict\";Object.defineProperty(bL,\"__esModule\",{value:!0});bL.Verifier=void 0;var PDt=Ie(\"util\"),C1=Eo(),xxe=gxe(),kxe=mxe(),Qxe=Bxe(),xDt=Pxe(),xK=class{constructor(e,r={}){this.trustMaterial=e,this.options={ctlogThreshold:r.ctlogThreshold??1,tlogThreshold:r.tlogThreshold??1,tsaThreshold:r.tsaThreshold??0}}verify(e,r){let s=this.verifyTimestamps(e),a=this.verifySigningKey(e,s);return this.verifyTLogs(e),this.verifySignature(e,a),r&&this.verifyPolicy(r,a.identity||{}),a}verifyTimestamps(e){let r=0,s=0,a=e.timestamps.map(n=>{switch(n.$case){case\"timestamp-authority\":return s++,(0,Qxe.verifyTSATimestamp)(n.timestamp,e.signature.signature,this.trustMaterial.timestampAuthorities);case\"transparency-log\":return r++,(0,Qxe.verifyTLogTimestamp)(n.tlogEntry,this.trustMaterial.tlogs)}});if(Txe(a))throw new C1.VerificationError({code:\"TIMESTAMP_ERROR\",message:\"duplicate timestamp\"});if(r<this.options.tlogThreshold)throw new C1.VerificationError({code:\"TIMESTAMP_ERROR\",message:`expected ${this.options.tlogThreshold} tlog timestamps, got ${r}`});if(s<this.options.tsaThreshold)throw new C1.VerificationError({code:\"TIMESTAMP_ERROR\",message:`expected ${this.options.tsaThreshold} tsa timestamps, got ${s}`});return a.map(n=>n.timestamp)}verifySigningKey({key:e},r){switch(e.$case){case\"public-key\":return(0,xxe.verifyPublicKey)(e.hint,r,this.trustMaterial);case\"certificate\":{let s=(0,xxe.verifyCertificate)(e.certificate,r,this.trustMaterial);if(Txe(s.scts))throw new C1.VerificationError({code:\"CERTIFICATE_ERROR\",message:\"duplicate SCT\"});if(s.scts.length<this.options.ctlogThreshold)throw new C1.VerificationError({code:\"CERTIFICATE_ERROR\",message:`expected ${this.options.ctlogThreshold} SCTs, got ${s.scts.length}`});return s.signer}}}verifyTLogs({signature:e,tlogEntries:r}){r.forEach(s=>(0,xDt.verifyTLogBody)(s,e))}verifySignature(e,r){if(!e.signature.verifySignature(r.key))throw new C1.VerificationError({code:\"SIGNATURE_ERROR\",message:\"signature verification failed\"})}verifyPolicy(e,r){e.subjectAlternativeName&&(0,kxe.verifySubjectAlternativeName)(e.subjectAlternativeName,r.subjectAlternativeName),e.extensions&&(0,kxe.verifyExtensions)(e.extensions,r.extensions)}};bL.Verifier=xK;function Txe(t){for(let e=0;e<t.length;e++)for(let r=e+1;r<t.length;r++)if((0,PDt.isDeepStrictEqual)(t[e],t[r]))return!0;return!1}});var PL=_(iu=>{\"use strict\";Object.defineProperty(iu,\"__esModule\",{value:!0});iu.Verifier=iu.toTrustMaterial=iu.VerificationError=iu.PolicyError=iu.toSignedEntity=void 0;var kDt=lxe();Object.defineProperty(iu,\"toSignedEntity\",{enumerable:!0,get:function(){return kDt.toSignedEntity}});var Fxe=Eo();Object.defineProperty(iu,\"PolicyError\",{enumerable:!0,get:function(){return Fxe.PolicyError}});Object.defineProperty(iu,\"VerificationError\",{enumerable:!0,get:function(){return Fxe.VerificationError}});var QDt=py();Object.defineProperty(iu,\"toTrustMaterial\",{enumerable:!0,get:function(){return QDt.toTrustMaterial}});var TDt=Rxe();Object.defineProperty(iu,\"Verifier\",{enumerable:!0,get:function(){return TDt.Verifier}})});var Nxe=_(Fa=>{\"use strict\";Object.defineProperty(Fa,\"__esModule\",{value:!0});Fa.DEFAULT_TIMEOUT=Fa.DEFAULT_RETRY=void 0;Fa.createBundleBuilder=NDt;Fa.createKeyFinder=ODt;Fa.createVerificationPolicy=LDt;var RDt=Cl(),w1=H7(),FDt=PL();Fa.DEFAULT_RETRY={retries:2};Fa.DEFAULT_TIMEOUT=5e3;function NDt(t,e){let r={signer:MDt(e),witnesses:_Dt(e)};switch(t){case\"messageSignature\":return new w1.MessageSignatureBundleBuilder(r);case\"dsseEnvelope\":return new w1.DSSEBundleBuilder({...r,certificateChain:e.legacyCompatibility})}}function ODt(t){return e=>{let r=t(e);if(!r)throw new FDt.VerificationError({code:\"PUBLIC_KEY_ERROR\",message:`key not found: ${e}`});return{publicKey:RDt.crypto.createPublicKey(r),validFor:()=>!0}}}function LDt(t){let e={},r=t.certificateIdentityEmail||t.certificateIdentityURI;return r&&(e.subjectAlternativeName=r),t.certificateIssuer&&(e.extensions={issuer:t.certificateIssuer}),e}function MDt(t){return new w1.FulcioSigner({fulcioBaseURL:t.fulcioURL,identityProvider:t.identityProvider||UDt(t),retry:t.retry??Fa.DEFAULT_RETRY,timeout:t.timeout??Fa.DEFAULT_TIMEOUT})}function UDt(t){let e=t.identityToken;return e?{getToken:()=>Promise.resolve(e)}:new w1.CIContextProvider(\"sigstore\")}function _Dt(t){let e=[];return HDt(t)&&e.push(new w1.RekorWitness({rekorBaseURL:t.rekorURL,entryType:t.legacyCompatibility?\"intoto\":\"dsse\",fetchOnConflict:!1,retry:t.retry??Fa.DEFAULT_RETRY,timeout:t.timeout??Fa.DEFAULT_TIMEOUT})),jDt(t)&&e.push(new w1.TSAWitness({tsaBaseURL:t.tsaServerURL,retry:t.retry??Fa.DEFAULT_RETRY,timeout:t.timeout??Fa.DEFAULT_TIMEOUT})),e}function HDt(t){return t.tlogUpload!==!1}function jDt(t){return t.tsaServerURL!==void 0}});var Mxe=_(su=>{\"use strict\";var GDt=su&&su.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||(\"get\"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),qDt=su&&su.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),Oxe=su&&su.__importStar||function(){var t=function(e){return t=Object.getOwnPropertyNames||function(r){var s=[];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(s[s.length]=a);return s},t(e)};return function(e){if(e&&e.__esModule)return e;var r={};if(e!=null)for(var s=t(e),a=0;a<s.length;a++)s[a]!==\"default\"&&GDt(r,e,s[a]);return qDt(r,e),r}}();Object.defineProperty(su,\"__esModule\",{value:!0});su.sign=YDt;su.attest=VDt;su.verify=JDt;su.createVerifier=Lxe;var QK=Ib(),WDt=Oxe(hL()),kK=PL(),B1=Oxe(Nxe());async function YDt(t,e={}){let s=await B1.createBundleBuilder(\"messageSignature\",e).create({data:t});return(0,QK.bundleToJSON)(s)}async function VDt(t,e,r={}){let a=await B1.createBundleBuilder(\"dsseEnvelope\",r).create({data:t,type:e});return(0,QK.bundleToJSON)(a)}async function JDt(t,e,r){let s;return Buffer.isBuffer(e)?s=e:r=e,Lxe(r).then(a=>a.verify(t,s))}async function Lxe(t={}){let e=await WDt.getTrustedRoot({mirrorURL:t.tufMirrorURL,rootPath:t.tufRootPath,cachePath:t.tufCachePath,forceCache:t.tufForceCache,retry:t.retry??B1.DEFAULT_RETRY,timeout:t.timeout??B1.DEFAULT_TIMEOUT}),r=t.keySelector?B1.createKeyFinder(t.keySelector):void 0,s=(0,kK.toTrustMaterial)(e,r),a={ctlogThreshold:t.ctLogThreshold,tlogThreshold:t.tlogThreshold},n=new kK.Verifier(s,a),c=B1.createVerificationPolicy(t);return{verify:(f,p)=>{let h=(0,QK.bundleFromJSON)(f),E=(0,kK.toSignedEntity)(h,p);n.verify(E,c)}}}});var _xe=_(Ni=>{\"use strict\";Object.defineProperty(Ni,\"__esModule\",{value:!0});Ni.verify=Ni.sign=Ni.createVerifier=Ni.attest=Ni.VerificationError=Ni.PolicyError=Ni.TUFError=Ni.InternalError=Ni.DEFAULT_REKOR_URL=Ni.DEFAULT_FULCIO_URL=Ni.ValidationError=void 0;var KDt=Ib();Object.defineProperty(Ni,\"ValidationError\",{enumerable:!0,get:function(){return KDt.ValidationError}});var TK=H7();Object.defineProperty(Ni,\"DEFAULT_FULCIO_URL\",{enumerable:!0,get:function(){return TK.DEFAULT_FULCIO_URL}});Object.defineProperty(Ni,\"DEFAULT_REKOR_URL\",{enumerable:!0,get:function(){return TK.DEFAULT_REKOR_URL}});Object.defineProperty(Ni,\"InternalError\",{enumerable:!0,get:function(){return TK.InternalError}});var zDt=hL();Object.defineProperty(Ni,\"TUFError\",{enumerable:!0,get:function(){return zDt.TUFError}});var Uxe=PL();Object.defineProperty(Ni,\"PolicyError\",{enumerable:!0,get:function(){return Uxe.PolicyError}});Object.defineProperty(Ni,\"VerificationError\",{enumerable:!0,get:function(){return Uxe.VerificationError}});var xL=Mxe();Object.defineProperty(Ni,\"attest\",{enumerable:!0,get:function(){return xL.attest}});Object.defineProperty(Ni,\"createVerifier\",{enumerable:!0,get:function(){return xL.createVerifier}});Object.defineProperty(Ni,\"sign\",{enumerable:!0,get:function(){return xL.sign}});Object.defineProperty(Ni,\"verify\",{enumerable:!0,get:function(){return xL.verify}})});Dt();Ge();Dt();var dke=Ie(\"child_process\"),mke=ut(Fd());Yt();var $I=new Map([]);var Gv={};Vt(Gv,{BaseCommand:()=>ft,WorkspaceRequiredError:()=>ar,getCli:()=>bde,getDynamicLibs:()=>Dde,getPluginConfiguration:()=>tC,openWorkspace:()=>eC,pluginCommands:()=>$I,runExit:()=>VR});Yt();var ft=class extends ot{constructor(){super(...arguments);this.cwd=ge.String(\"--cwd\",{hidden:!0})}validateAndExecute(){if(typeof this.cwd<\"u\")throw new nt(\"The --cwd option is ambiguous when used anywhere else than the very first parameter provided in the command line, before even the command path\");return super.validateAndExecute()}};Ge();Dt();Yt();var ar=class extends nt{constructor(e,r){let s=J.relative(e,r),a=J.join(e,Ut.fileName);super(`This command can only be run from within a workspace of your project (${s} isn't a workspace of ${a}).`)}};Ge();Dt();eA();wc();pv();Yt();var yat=ut(Ai());Ul();var Dde=()=>new Map([[\"@yarnpkg/cli\",Gv],[\"@yarnpkg/core\",jv],[\"@yarnpkg/fslib\",_2],[\"@yarnpkg/libzip\",fv],[\"@yarnpkg/parsers\",J2],[\"@yarnpkg/shell\",mv],[\"clipanion\",oB],[\"semver\",yat],[\"typanion\",Ea]]);Ge();async function eC(t,e){let{project:r,workspace:s}=await Tt.find(t,e);if(!s)throw new ar(r.cwd,e);return s}Ge();Dt();eA();wc();pv();Yt();var IPt=ut(Ai());Ul();var hq={};Vt(hq,{AddCommand:()=>sC,BinCommand:()=>oC,CacheCleanCommand:()=>aC,ClipanionCommand:()=>pC,ConfigCommand:()=>fC,ConfigGetCommand:()=>lC,ConfigSetCommand:()=>cC,ConfigUnsetCommand:()=>uC,DedupeCommand:()=>AC,EntryCommand:()=>gC,ExecCommand:()=>mC,ExplainCommand:()=>IC,ExplainPeerRequirementsCommand:()=>yC,HelpCommand:()=>hC,InfoCommand:()=>CC,LinkCommand:()=>BC,NodeCommand:()=>vC,PluginCheckCommand:()=>SC,PluginImportCommand:()=>PC,PluginImportSourcesCommand:()=>xC,PluginListCommand:()=>DC,PluginRemoveCommand:()=>kC,PluginRuntimeCommand:()=>QC,RebuildCommand:()=>TC,RemoveCommand:()=>RC,RunCommand:()=>NC,RunIndexCommand:()=>FC,SetResolutionCommand:()=>OC,SetVersionCommand:()=>EC,SetVersionSourcesCommand:()=>bC,UnlinkCommand:()=>LC,UpCommand:()=>MC,VersionCommand:()=>dC,WhyCommand:()=>UC,WorkspaceCommand:()=>qC,WorkspacesListCommand:()=>GC,YarnCommand:()=>wC,dedupeUtils:()=>rF,default:()=>Tct,suggestUtils:()=>Xu});var zye=ut(Fd());Ge();Ge();Ge();Yt();var hye=ut(Vv());Ul();var Xu={};Vt(Xu,{Modifier:()=>W5,Strategy:()=>eF,Target:()=>Jv,WorkspaceModifier:()=>cye,applyModifier:()=>Mlt,extractDescriptorFromPath:()=>Y5,extractRangeModifier:()=>uye,fetchDescriptorFrom:()=>V5,findProjectDescriptors:()=>pye,getModifier:()=>Kv,getSuggestedDescriptors:()=>zv,makeWorkspaceDescriptor:()=>Aye,toWorkspaceModifier:()=>fye});Ge();Ge();Dt();var q5=ut(Ai()),Olt=\"workspace:\",Jv=(s=>(s.REGULAR=\"dependencies\",s.DEVELOPMENT=\"devDependencies\",s.PEER=\"peerDependencies\",s))(Jv||{}),W5=(s=>(s.CARET=\"^\",s.TILDE=\"~\",s.EXACT=\"\",s))(W5||{}),cye=(s=>(s.CARET=\"^\",s.TILDE=\"~\",s.EXACT=\"*\",s))(cye||{}),eF=(n=>(n.KEEP=\"keep\",n.REUSE=\"reuse\",n.PROJECT=\"project\",n.LATEST=\"latest\",n.CACHE=\"cache\",n))(eF||{});function Kv(t,e){return t.exact?\"\":t.caret?\"^\":t.tilde?\"~\":e.configuration.get(\"defaultSemverRangePrefix\")}var Llt=/^([\\^~]?)[0-9]+(?:\\.[0-9]+){0,2}(?:-\\S+)?$/;function uye(t,{project:e}){let r=t.match(Llt);return r?r[1]:e.configuration.get(\"defaultSemverRangePrefix\")}function Mlt(t,e){let{protocol:r,source:s,params:a,selector:n}=G.parseRange(t.range);return q5.default.valid(n)&&(n=`${e}${t.range}`),G.makeDescriptor(t,G.makeRange({protocol:r,source:s,params:a,selector:n}))}function fye(t){switch(t){case\"^\":return\"^\";case\"~\":return\"~\";case\"\":return\"*\";default:throw new Error(`Assertion failed: Unknown modifier: \"${t}\"`)}}function Aye(t,e){return G.makeDescriptor(t.anchoredDescriptor,`${Olt}${fye(e)}`)}async function pye(t,{project:e,target:r}){let s=new Map,a=n=>{let c=s.get(n.descriptorHash);return c||s.set(n.descriptorHash,c={descriptor:n,locators:[]}),c};for(let n of e.workspaces)if(r===\"peerDependencies\"){let c=n.manifest.peerDependencies.get(t.identHash);c!==void 0&&a(c).locators.push(n.anchoredLocator)}else{let c=n.manifest.dependencies.get(t.identHash),f=n.manifest.devDependencies.get(t.identHash);r===\"devDependencies\"?f!==void 0?a(f).locators.push(n.anchoredLocator):c!==void 0&&a(c).locators.push(n.anchoredLocator):c!==void 0?a(c).locators.push(n.anchoredLocator):f!==void 0&&a(f).locators.push(n.anchoredLocator)}return s}async function Y5(t,{cwd:e,workspace:r}){return await _lt(async s=>{J.isAbsolute(t)||(t=J.relative(r.cwd,J.resolve(e,t)),t.match(/^\\.{0,2}\\//)||(t=`./${t}`));let{project:a}=r,n=await V5(G.makeIdent(null,\"archive\"),t,{project:r.project,cache:s,workspace:r});if(!n)throw new Error(\"Assertion failed: The descriptor should have been found\");let c=new ki,f=a.configuration.makeResolver(),p=a.configuration.makeFetcher(),h={checksums:a.storedChecksums,project:a,cache:s,fetcher:p,report:c,resolver:f},E=f.bindDescriptor(n,r.anchoredLocator,h),C=G.convertDescriptorToLocator(E),S=await p.fetch(C,h),P=await Ut.find(S.prefixPath,{baseFs:S.packageFs});if(!P.name)throw new Error(\"Target path doesn't have a name\");return G.makeDescriptor(P.name,t)})}function Ult(t){if(t.range===\"unknown\")return{type:\"resolve\",range:\"latest\"};if(Fr.validRange(t.range))return{type:\"fixed\",range:t.range};if(Mp.test(t.range))return{type:\"resolve\",range:t.range};let e=t.range.match(/^(?:jsr:|npm:)(.*)/);if(!e)return{type:\"fixed\",range:t.range};let[,r]=e,s=`${G.stringifyIdent(t)}@`;return r.startsWith(s)&&(r=r.slice(s.length)),Fr.validRange(r)?{type:\"fixed\",range:t.range}:Mp.test(r)?{type:\"resolve\",range:t.range}:{type:\"fixed\",range:t.range}}async function zv(t,{project:e,workspace:r,cache:s,target:a,fixed:n,modifier:c,strategies:f,maxResults:p=1/0}){if(!(p>=0))throw new Error(`Invalid maxResults (${p})`);let h=!n||t.range===\"unknown\"?Ult(t):{type:\"fixed\",range:t.range};if(h.type===\"fixed\")return{suggestions:[{descriptor:t,name:`Use ${G.prettyDescriptor(e.configuration,t)}`,reason:\"(unambiguous explicit request)\"}],rejections:[]};let E=typeof r<\"u\"&&r!==null&&r.manifest[a].get(t.identHash)||null,C=[],S=[],P=async I=>{try{await I()}catch(R){S.push(R)}};for(let I of f){if(C.length>=p)break;switch(I){case\"keep\":await P(async()=>{E&&C.push({descriptor:E,name:`Keep ${G.prettyDescriptor(e.configuration,E)}`,reason:\"(no changes)\"})});break;case\"reuse\":await P(async()=>{for(let{descriptor:R,locators:N}of(await pye(t,{project:e,target:a})).values()){if(N.length===1&&N[0].locatorHash===r.anchoredLocator.locatorHash&&f.includes(\"keep\"))continue;let U=`(originally used by ${G.prettyLocator(e.configuration,N[0])}`;U+=N.length>1?` and ${N.length-1} other${N.length>2?\"s\":\"\"})`:\")\",C.push({descriptor:R,name:`Reuse ${G.prettyDescriptor(e.configuration,R)}`,reason:U})}});break;case\"cache\":await P(async()=>{for(let R of e.storedDescriptors.values())R.identHash===t.identHash&&C.push({descriptor:R,name:`Reuse ${G.prettyDescriptor(e.configuration,R)}`,reason:\"(already used somewhere in the lockfile)\"})});break;case\"project\":await P(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let R=e.tryWorkspaceByIdent(t);if(R===null)return;let N=Aye(R,c);C.push({descriptor:N,name:`Attach ${G.prettyDescriptor(e.configuration,N)}`,reason:`(local workspace at ${he.pretty(e.configuration,R.relativeCwd,he.Type.PATH)})`})});break;case\"latest\":{let R=e.configuration.get(\"enableNetwork\"),N=e.configuration.get(\"enableOfflineMode\");await P(async()=>{if(a===\"peerDependencies\")C.push({descriptor:G.makeDescriptor(t,\"*\"),name:\"Use *\",reason:\"(catch-all peer dependency pattern)\"});else if(!R&&!N)C.push({descriptor:null,name:\"Resolve from latest\",reason:he.pretty(e.configuration,\"(unavailable because enableNetwork is toggled off)\",\"grey\")});else{let U=await V5(t,h.range,{project:e,cache:s,workspace:r,modifier:c});U&&C.push({descriptor:U,name:`Use ${G.prettyDescriptor(e.configuration,U)}`,reason:`(resolved from ${N?\"the cache\":\"latest\"})`})}})}break}}return{suggestions:C.slice(0,p),rejections:S.slice(0,p)}}async function V5(t,e,{project:r,cache:s,workspace:a,preserveModifier:n=!0,modifier:c}){let f=r.configuration.normalizeDependency(G.makeDescriptor(t,e)),p=new ki,h=r.configuration.makeFetcher(),E=r.configuration.makeResolver(),C={project:r,fetcher:h,cache:s,checksums:r.storedChecksums,report:p,cacheOptions:{skipIntegrityCheck:!0}},S={...C,resolver:E,fetchOptions:C},P=E.bindDescriptor(f,a.anchoredLocator,S),I=await E.getCandidates(P,{},S);if(I.length===0)return null;let R=I[0],{protocol:N,source:U,params:W,selector:ee}=G.parseRange(G.convertToManifestRange(R.reference));if(N===r.configuration.get(\"defaultProtocol\")&&(N=null),q5.default.valid(ee)){let ie=ee;if(typeof c<\"u\")ee=c+ee;else if(n!==!1){let me=typeof n==\"string\"?n:f.range;ee=uye(me,{project:r})+ee}let ue=G.makeDescriptor(R,G.makeRange({protocol:N,source:U,params:W,selector:ee}));(await E.getCandidates(r.configuration.normalizeDependency(ue),{},S)).length!==1&&(ee=ie)}return G.makeDescriptor(R,G.makeRange({protocol:N,source:U,params:W,selector:ee}))}async function _lt(t){return await ce.mktempPromise(async e=>{let r=ze.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new Kr(e,{configuration:r,check:!1,immutable:!1}))})}var sC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.fixed=ge.Boolean(\"-F,--fixed\",!1,{description:\"Store dependency tags as-is instead of resolving them\"});this.exact=ge.Boolean(\"-E,--exact\",!1,{description:\"Don't use any semver modifier on the resolved range\"});this.tilde=ge.Boolean(\"-T,--tilde\",!1,{description:\"Use the `~` semver modifier on the resolved range\"});this.caret=ge.Boolean(\"-C,--caret\",!1,{description:\"Use the `^` semver modifier on the resolved range\"});this.dev=ge.Boolean(\"-D,--dev\",!1,{description:\"Add a package as a dev dependency\"});this.peer=ge.Boolean(\"-P,--peer\",!1,{description:\"Add a package as a peer dependency\"});this.optional=ge.Boolean(\"-O,--optional\",!1,{description:\"Add / upgrade a package to an optional regular / peer dependency\"});this.preferDev=ge.Boolean(\"--prefer-dev\",!1,{description:\"Add / upgrade a package to a dev dependency\"});this.interactive=ge.Boolean(\"-i,--interactive\",{description:\"Reuse the specified package from other workspaces in the project\"});this.cached=ge.Boolean(\"--cached\",!1,{description:\"Reuse the highest version already used somewhere within the project\"});this.mode=ge.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:fo($l)});this.silent=ge.Boolean(\"--silent\",{hidden:!0});this.packages=ge.Rest()}static{this.paths=[[\"add\"]]}static{this.usage=ot.Usage({description:\"add dependencies to the project\",details:\"\\n      This command adds a package to the package.json for the nearest workspace.\\n\\n      - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\\n\\n      - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\\n\\n      - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\\n\\n      - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\\\"peerDependenciesMeta\\\": { \\\"<package>\\\": { \\\"optional\\\": true } }`\\n\\n      - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\\n\\n      - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\\n\\n      If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\\n\\n      If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n\\n      For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/protocols.\\n    \",examples:[[\"Add a regular package to the current workspace\",\"$0 add lodash\"],[\"Add a specific version for a package to the current workspace\",\"$0 add lodash@1.2.3\"],[\"Add a package from a GitHub repository (the master branch) to the current workspace using a URL\",\"$0 add lodash@https://github.com/lodash/lodash\"],[\"Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol\",\"$0 add lodash@github:lodash/lodash\"],[\"Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)\",\"$0 add lodash@lodash/lodash\"],[\"Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)\",\"$0 add lodash-es@lodash/lodash#es\"],[\"Add a local package (gzipped tarball format) to the current workspace\",\"$0 add local-package-name@file:../path/to/local-package-name-v0.1.2.tgz\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=this.fixed,f=r.isInteractive({interactive:this.interactive,stdout:this.context.stdout}),p=f||r.get(\"preferReuse\"),h=Kv(this,s),E=[p?\"reuse\":void 0,\"project\",this.cached?\"cache\":void 0,\"latest\"].filter(W=>typeof W<\"u\"),C=f?1/0:1,S=W=>{let ee=G.tryParseDescriptor(W.slice(4));return ee?ee.range===\"unknown\"?G.makeDescriptor(ee,`jsr:${G.stringifyIdent(ee)}@latest`):G.makeDescriptor(ee,`jsr:${ee.range}`):null},P=await Promise.all(this.packages.map(async W=>{let ee=W.match(/^\\.{0,2}\\//)?await Y5(W,{cwd:this.context.cwd,workspace:a}):W.startsWith(\"jsr:\")?S(W):G.tryParseDescriptor(W),ie=W.match(/^(https?:|git@github)/);if(ie)throw new nt(`It seems you are trying to add a package using a ${he.pretty(r,`${ie[0]}...`,he.Type.RANGE)} url; we now require package names to be explicitly specified.\nTry running the command again with the package name prefixed: ${he.pretty(r,\"yarn add\",he.Type.CODE)} ${he.pretty(r,G.makeDescriptor(G.makeIdent(null,\"my-package\"),`${ie[0]}...`),he.Type.DESCRIPTOR)}`);if(!ee)throw new nt(`The ${he.pretty(r,W,he.Type.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let ue=Hlt(a,ee,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return await Promise.all(ue.map(async me=>{let pe=await zv(ee,{project:s,workspace:a,cache:n,fixed:c,target:me,modifier:h,strategies:E,maxResults:C});return{request:ee,suggestedDescriptors:pe,target:me}}))})).then(W=>W.flat()),I=await lA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async W=>{for(let{request:ee,suggestedDescriptors:{suggestions:ie,rejections:ue}}of P)if(ie.filter(me=>me.descriptor!==null).length===0){let[me]=ue;if(typeof me>\"u\")throw new Error(\"Assertion failed: Expected an error to have been set\");s.configuration.get(\"enableNetwork\")?W.reportError(27,`${G.prettyDescriptor(r,ee)} can't be resolved to a satisfying range`):W.reportError(27,`${G.prettyDescriptor(r,ee)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),W.reportSeparator(),W.reportExceptionOnce(me)}});if(I.hasErrors())return I.exitCode();let R=!1,N=[],U=[];for(let{suggestedDescriptors:{suggestions:W},target:ee}of P){let ie,ue=W.filter(Be=>Be.descriptor!==null),le=ue[0].descriptor,me=ue.every(Be=>G.areDescriptorsEqual(Be.descriptor,le));ue.length===1||me?ie=le:(R=!0,{answer:ie}=await(0,hye.prompt)({type:\"select\",name:\"answer\",message:\"Which range do you want to use?\",choices:W.map(({descriptor:Be,name:Ce,reason:g})=>Be?{name:Ce,hint:g,descriptor:Be}:{name:Ce,hint:g,disabled:!0}),onCancel:()=>process.exit(130),result(Be){return this.find(Be,\"descriptor\")},stdin:this.context.stdin,stdout:this.context.stdout}));let pe=a.manifest[ee].get(ie.identHash);(typeof pe>\"u\"||pe.descriptorHash!==ie.descriptorHash)&&(a.manifest[ee].set(ie.identHash,ie),this.optional&&(ee===\"dependencies\"?a.manifest.ensureDependencyMeta({...ie,range:\"unknown\"}).optional=!0:ee===\"peerDependencies\"&&(a.manifest.ensurePeerDependencyMeta({...ie,range:\"unknown\"}).optional=!0)),typeof pe>\"u\"?N.push([a,ee,ie,E]):U.push([a,ee,pe,ie]))}return await r.triggerMultipleHooks(W=>W.afterWorkspaceDependencyAddition,N),await r.triggerMultipleHooks(W=>W.afterWorkspaceDependencyReplacement,U),R&&this.context.stdout.write(`\n`),await s.installWithNewReport({json:this.json,stdout:this.context.stdout,quiet:this.context.quiet},{cache:n,mode:this.mode})}};function Hlt(t,e,{dev:r,peer:s,preferDev:a,optional:n}){let c=t.manifest.dependencies.has(e.identHash),f=t.manifest.devDependencies.has(e.identHash),p=t.manifest.peerDependencies.has(e.identHash);if((r||s)&&c)throw new nt(`Package \"${G.prettyIdent(t.project.configuration,e)}\" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!s&&p)throw new nt(`Package \"${G.prettyIdent(t.project.configuration,e)}\" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(n&&f)throw new nt(`Package \"${G.prettyIdent(t.project.configuration,e)}\" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(n&&!s&&p)throw new nt(`Package \"${G.prettyIdent(t.project.configuration,e)}\" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||a)&&n)throw new nt(`Package \"${G.prettyIdent(t.project.configuration,e)}\" cannot simultaneously be a dev dependency and an optional dependency`);let h=[];return s&&h.push(\"peerDependencies\"),(r||a)&&h.push(\"devDependencies\"),n&&h.push(\"dependencies\"),h.length>0?h:f?[\"devDependencies\"]:p?[\"peerDependencies\"]:[\"dependencies\"]}Ge();Ge();Yt();var oC=class extends ft{constructor(){super(...arguments);this.verbose=ge.Boolean(\"-v,--verbose\",!1,{description:\"Print both the binary name and the locator of the package that provides the binary\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.name=ge.String({required:!1})}static{this.paths=[[\"bin\"]]}static{this.usage=ot.Usage({description:\"get the path to a binary script\",details:`\n      When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \\`-v,--verbose\\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary.\n\n      When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive.\n    `,examples:[[\"List all the available binaries\",\"$0 bin\"],[\"Print the path to a specific binary\",\"$0 bin eslint\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,locator:a}=await Tt.find(r,this.context.cwd);if(await s.restoreInstallState(),this.name){let f=(await In.getPackageAccessibleBinaries(a,{project:s})).get(this.name);if(!f)throw new nt(`Couldn't find a binary named \"${this.name}\" for package \"${G.prettyLocator(r,a)}\"`);let[,p]=f;return this.context.stdout.write(`${p}\n`),0}return(await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async c=>{let f=await In.getPackageAccessibleBinaries(a,{project:s}),h=Array.from(f.keys()).reduce((E,C)=>Math.max(E,C.length),0);for(let[E,[C,S]]of f)c.reportJson({name:E,source:G.stringifyIdent(C),path:S});if(this.verbose)for(let[E,[C]]of f)c.reportInfo(null,`${E.padEnd(h,\" \")}   ${G.prettyLocator(r,C)}`);else for(let E of f.keys())c.reportInfo(null,E)})).exitCode()}};Ge();Dt();Yt();var aC=class extends ft{constructor(){super(...arguments);this.mirror=ge.Boolean(\"--mirror\",!1,{description:\"Remove the global cache files instead of the local cache files\"});this.all=ge.Boolean(\"--all\",!1,{description:\"Remove both the global cache files and the local cache files of the current project\"})}static{this.paths=[[\"cache\",\"clean\"],[\"cache\",\"clear\"]]}static{this.usage=ot.Usage({description:\"remove the shared cache files\",details:`\n      This command will remove all the files from the cache.\n    `,examples:[[\"Remove all the local archives\",\"$0 cache clean\"],[\"Remove all the archives stored in the ~/.yarn directory\",\"$0 cache clean --mirror\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);if(!r.get(\"enableCacheClean\"))throw new nt(\"Cache cleaning is currently disabled. To enable it, set `enableCacheClean: true` in your configuration file. Note: Cache cleaning is typically not required and should be avoided when using Zero-Installs.\");let s=await Kr.find(r);return(await Ot.start({configuration:r,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&s.mirrorCwd!==null,c=!this.mirror;n&&(await ce.removePromise(s.mirrorCwd),await r.triggerHook(f=>f.cleanGlobalArtifacts,r)),c&&await ce.removePromise(s.cwd)})).exitCode()}};Ge();Yt();ql();var J5=Ie(\"util\"),lC=class extends ft{constructor(){super(...arguments);this.why=ge.Boolean(\"--why\",!1,{description:\"Print the explanation for why a setting has its value\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.unsafe=ge.Boolean(\"--no-redacted\",!1,{description:\"Don't redact secrets (such as tokens) from the output\"});this.name=ge.String()}static{this.paths=[[\"config\",\"get\"]]}static{this.usage=ot.Usage({description:\"read a configuration settings\",details:`\n      This command will print a configuration setting.\n\n      Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \\`--no-redacted\\` to get the untransformed value.\n    `,examples:[[\"Print a simple configuration setting\",\"yarn config get yarnPath\"],[\"Print a complex configuration setting\",\"yarn config get packageExtensions\"],[\"Print a nested field from the configuration\",`yarn config get 'npmScopes[\"my-company\"].npmRegistryServer'`],[\"Print a token from the configuration\",\"yarn config get npmAuthToken --no-redacted\"],[\"Print a configuration setting as JSON\",\"yarn config get packageExtensions --json\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=this.name.replace(/[.[].*$/,\"\"),a=this.name.replace(/^[^.[]*/,\"\");if(typeof r.settings.get(s)>\"u\")throw new nt(`Couldn't find a configuration settings named \"${s}\"`);let c=r.getSpecial(s,{hideSecrets:!this.unsafe,getNativePaths:!0}),f=je.convertMapsToIndexableObjects(c),p=a?va(f,a):f,h=await Ot.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async E=>{E.reportJson(p)});if(!this.json){if(typeof p==\"string\")return this.context.stdout.write(`${p}\n`),h.exitCode();J5.inspect.styles.name=\"cyan\",this.context.stdout.write(`${(0,J5.inspect)(p,{depth:1/0,colors:r.get(\"enableColors\"),compact:!1})}\n`)}return h.exitCode()}};Ge();Yt();ql();var K5=Ie(\"util\"),cC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Set complex configuration settings to JSON values\"});this.home=ge.Boolean(\"-H,--home\",!1,{description:\"Update the home configuration instead of the project configuration\"});this.name=ge.String();this.value=ge.String()}static{this.paths=[[\"config\",\"set\"]]}static{this.usage=ot.Usage({description:\"change a configuration settings\",details:`\n      This command will set a configuration setting.\n\n      When used without the \\`--json\\` flag, it can only set a simple configuration setting (a string, a number, or a boolean).\n\n      When used with the \\`--json\\` flag, it can set both simple and complex configuration settings, including Arrays and Objects.\n    `,examples:[[\"Set a simple configuration setting (a string, a number, or a boolean)\",\"yarn config set initScope myScope\"],[\"Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag\",'yarn config set initScope --json \\\\\"myScope\\\\\"'],[\"Set a complex configuration setting (an Array) using the `--json` flag\",`yarn config set unsafeHttpWhitelist --json '[\"*.example.com\", \"example.com\"]'`],[\"Set a complex configuration setting (an Object) using the `--json` flag\",`yarn config set packageExtensions --json '{ \"@babel/parser@*\": { \"dependencies\": { \"@babel/types\": \"*\" } } }'`],[\"Set a nested configuration setting\",'yarn config set npmScopes.company.npmRegistryServer \"https://npm.example.com\"'],[\"Set a nested configuration setting using indexed access for non-simple keys\",`yarn config set 'npmRegistries[\"//npm.example.com\"].npmAuthToken' \"ffffffff-ffff-ffff-ffff-ffffffffffff\"`]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=()=>{if(!r.projectCwd)throw new nt(\"This command must be run from within a project folder\");return r.projectCwd},a=this.name.replace(/[.[].*$/,\"\"),n=this.name.replace(/^[^.[]*\\.?/,\"\");if(typeof r.settings.get(a)>\"u\")throw new nt(`Couldn't find a configuration settings named \"${a}\"`);if(a===\"enableStrictSettings\")throw new nt(\"This setting only affects the file it's in, and thus cannot be set from the CLI\");let f=this.json?JSON.parse(this.value):this.value;await(this.home?I=>ze.updateHomeConfiguration(I):I=>ze.updateConfiguration(s(),I))(I=>{if(n){let R=f0(I);return Jd(R,this.name,f),R}else return{...I,[a]:f}});let E=(await ze.find(this.context.cwd,this.context.plugins)).getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),C=je.convertMapsToIndexableObjects(E),S=n?va(C,n):C;return(await Ot.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async I=>{K5.inspect.styles.name=\"cyan\",I.reportInfo(0,`Successfully set ${this.name} to ${(0,K5.inspect)(S,{depth:1/0,colors:r.get(\"enableColors\"),compact:!1})}`)})).exitCode()}};Ge();Yt();ql();var uC=class extends ft{constructor(){super(...arguments);this.home=ge.Boolean(\"-H,--home\",!1,{description:\"Update the home configuration instead of the project configuration\"});this.name=ge.String()}static{this.paths=[[\"config\",\"unset\"]]}static{this.usage=ot.Usage({description:\"unset a configuration setting\",details:`\n      This command will unset a configuration setting.\n    `,examples:[[\"Unset a simple configuration setting\",\"yarn config unset initScope\"],[\"Unset a complex configuration setting\",\"yarn config unset packageExtensions\"],[\"Unset a nested configuration setting\",\"yarn config unset npmScopes.company.npmRegistryServer\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=()=>{if(!r.projectCwd)throw new nt(\"This command must be run from within a project folder\");return r.projectCwd},a=this.name.replace(/[.[].*$/,\"\"),n=this.name.replace(/^[^.[]*\\.?/,\"\");if(typeof r.settings.get(a)>\"u\")throw new nt(`Couldn't find a configuration settings named \"${a}\"`);let f=this.home?h=>ze.updateHomeConfiguration(h):h=>ze.updateConfiguration(s(),h);return(await Ot.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async h=>{let E=!1;await f(C=>{if(!vB(C,this.name))return h.reportWarning(0,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),E=!0,C;let S=n?f0(C):{...C};return A0(S,this.name),S}),E||h.reportInfo(0,`Successfully unset ${this.name}`)})).exitCode()}};Ge();Dt();Yt();var tF=Ie(\"util\"),fC=class extends ft{constructor(){super(...arguments);this.noDefaults=ge.Boolean(\"--no-defaults\",!1,{description:\"Omit the default values from the display\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.verbose=ge.Boolean(\"-v,--verbose\",{hidden:!0});this.why=ge.Boolean(\"--why\",{hidden:!0});this.names=ge.Rest()}static{this.paths=[[\"config\"]]}static{this.usage=ot.Usage({description:\"display the current configuration\",details:`\n      This command prints the current active configuration settings.\n    `,examples:[[\"Print the active configuration settings\",\"$0 config\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins,{strict:!1}),s=await SI({configuration:r,stdout:this.context.stdout,forceError:this.json},[{option:this.verbose,message:\"The --verbose option is deprecated, the settings' descriptions are now always displayed\"},{option:this.why,message:\"The --why option is deprecated, the settings' sources are now always displayed\"}]);if(s!==null)return s;let a=this.names.length>0?[...new Set(this.names)].sort():[...r.settings.keys()].sort(),n,c=await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async f=>{if(r.invalid.size>0&&!this.json){for(let[p,h]of r.invalid)f.reportError(34,`Invalid configuration key \"${p}\" in ${h}`);f.reportSeparator()}if(this.json)for(let p of a){if(this.noDefaults&&!r.sources.has(p))continue;let h=r.settings.get(p);typeof h>\"u\"&&f.reportError(34,`No configuration key named \"${p}\"`);let E=r.getSpecial(p,{hideSecrets:!0,getNativePaths:!0}),C=r.sources.get(p)??\"<default>\",S=C&&C[0]!==\"<\"?fe.fromPortablePath(C):C;f.reportJson({key:p,effective:E,source:S,...h})}else{let p={breakLength:1/0,colors:r.get(\"enableColors\"),maxArrayLength:2},h={},E={children:h};for(let C of a){if(this.noDefaults&&!r.sources.has(C))continue;let S=r.settings.get(C),P=r.sources.get(C)??\"<default>\",I=r.getSpecial(C,{hideSecrets:!0,getNativePaths:!0}),R={Description:{label:\"Description\",value:he.tuple(he.Type.MARKDOWN,{text:S.description,format:this.cli.format(),paragraphs:!1})},Source:{label:\"Source\",value:he.tuple(P[0]===\"<\"?he.Type.CODE:he.Type.PATH,P)}};h[C]={value:he.tuple(he.Type.CODE,C),children:R};let N=(U,W)=>{for(let[ee,ie]of W)if(ie instanceof Map){let ue={};U[ee]={children:ue},N(ue,ie)}else U[ee]={label:ee,value:he.tuple(he.Type.NO_HINT,(0,tF.inspect)(ie,p))}};I instanceof Map?N(R,I):R.Value={label:\"Value\",value:he.tuple(he.Type.NO_HINT,(0,tF.inspect)(I,p))}}a.length!==1&&(n=void 0),xs.emitTree(E,{configuration:r,json:this.json,stdout:this.context.stdout,separators:2})}});if(!this.json&&typeof n<\"u\"){let f=a[0],p=(0,tF.inspect)(r.getSpecial(f,{hideSecrets:!0,getNativePaths:!0}),{colors:r.get(\"enableColors\")});this.context.stdout.write(`\n`),this.context.stdout.write(`${p}\n`)}return c.exitCode()}};Ge();Yt();Ul();var rF={};Vt(rF,{Strategy:()=>Xv,acceptedStrategies:()=>jlt,dedupe:()=>z5});Ge();Ge();var gye=ut(Go()),Xv=(e=>(e.HIGHEST=\"highest\",e))(Xv||{}),jlt=new Set(Object.values(Xv)),Glt={highest:async(t,e,{resolver:r,fetcher:s,resolveOptions:a,fetchOptions:n})=>{let c=new Map;for(let[p,h]of t.storedResolutions){let E=t.storedDescriptors.get(p);if(typeof E>\"u\")throw new Error(`Assertion failed: The descriptor (${p}) should have been registered`);je.getSetWithDefault(c,E.identHash).add(h)}let f=new Map(je.mapAndFilter(t.storedDescriptors.values(),p=>G.isVirtualDescriptor(p)?je.mapAndFilter.skip:[p.descriptorHash,je.makeDeferred()]));for(let p of t.storedDescriptors.values()){let h=f.get(p.descriptorHash);if(typeof h>\"u\")throw new Error(`Assertion failed: The descriptor (${p.descriptorHash}) should have been registered`);let E=t.storedResolutions.get(p.descriptorHash);if(typeof E>\"u\")throw new Error(`Assertion failed: The resolution (${p.descriptorHash}) should have been registered`);let C=t.originalPackages.get(E);if(typeof C>\"u\")throw new Error(`Assertion failed: The package (${E}) should have been registered`);Promise.resolve().then(async()=>{let S=r.getResolutionDependencies(p,a),P=Object.fromEntries(await je.allSettledSafe(Object.entries(S).map(async([ee,ie])=>{let ue=f.get(ie.descriptorHash);if(typeof ue>\"u\")throw new Error(`Assertion failed: The descriptor (${ie.descriptorHash}) should have been registered`);let le=await ue.promise;if(!le)throw new Error(\"Assertion failed: Expected the dependency to have been through the dedupe process itself\");return[ee,le.updatedPackage]})));if(e.length&&!gye.default.isMatch(G.stringifyIdent(p),e)||!r.shouldPersistResolution(C,a))return C;let I=c.get(p.identHash);if(typeof I>\"u\")throw new Error(`Assertion failed: The resolutions (${p.identHash}) should have been registered`);if(I.size===1)return C;let R=[...I].map(ee=>{let ie=t.originalPackages.get(ee);if(typeof ie>\"u\")throw new Error(`Assertion failed: The package (${ee}) should have been registered`);return ie}),N=await r.getSatisfying(p,P,R,a),U=N.locators?.[0];if(typeof U>\"u\"||!N.sorted)return C;let W=t.originalPackages.get(U.locatorHash);if(typeof W>\"u\")throw new Error(`Assertion failed: The package (${U.locatorHash}) should have been registered`);return W}).then(async S=>{let P=await t.preparePackage(S,{resolver:r,resolveOptions:a});h.resolve({descriptor:p,currentPackage:C,updatedPackage:S,resolvedPackage:P})}).catch(S=>{h.reject(S)})}return[...f.values()].map(p=>p.promise)}};async function z5(t,{strategy:e,patterns:r,cache:s,report:a}){let{configuration:n}=t,c=new ki,f=n.makeResolver(),p=n.makeFetcher(),h={cache:s,checksums:t.storedChecksums,fetcher:p,project:t,report:c,cacheOptions:{skipIntegrityCheck:!0}},E={project:t,resolver:f,report:c,fetchOptions:h};return await a.startTimerPromise(\"Deduplication step\",async()=>{let C=Glt[e],S=await C(t,r,{resolver:f,resolveOptions:E,fetcher:p,fetchOptions:h}),P=Ao.progressViaCounter(S.length);await a.reportProgress(P);let I=0;await Promise.all(S.map(U=>U.then(W=>{if(W===null||W.currentPackage.locatorHash===W.updatedPackage.locatorHash)return;I++;let{descriptor:ee,currentPackage:ie,updatedPackage:ue}=W;a.reportInfo(0,`${G.prettyDescriptor(n,ee)} can be deduped from ${G.prettyLocator(n,ie)} to ${G.prettyLocator(n,ue)}`),a.reportJson({descriptor:G.stringifyDescriptor(ee),currentResolution:G.stringifyLocator(ie),updatedResolution:G.stringifyLocator(ue)}),t.storedResolutions.set(ee.descriptorHash,ue.locatorHash)}).finally(()=>P.tick())));let R;switch(I){case 0:R=\"No packages\";break;case 1:R=\"One package\";break;default:R=`${I} packages`}let N=he.pretty(n,e,he.Type.CODE);return a.reportInfo(0,`${R} can be deduped using the ${N} strategy`),I})}var AC=class extends ft{constructor(){super(...arguments);this.strategy=ge.String(\"-s,--strategy\",\"highest\",{description:\"The strategy to use when deduping dependencies\",validator:fo(Xv)});this.check=ge.Boolean(\"-c,--check\",!1,{description:\"Exit with exit code 1 when duplicates are found, without persisting the dependency tree\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.mode=ge.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:fo($l)});this.patterns=ge.Rest()}static{this.paths=[[\"dedupe\"]]}static{this.usage=ot.Usage({description:\"deduplicate dependencies with overlapping ranges\",details:\"\\n      Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\\n\\n      This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\\n\\n      - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\\n\\n      **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\\n\\n      If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n\\n      This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\\n\\n      ### In-depth explanation:\\n\\n      Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\\n\\n      **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\\n\\n      Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\\n\\n      **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\\n    \",examples:[[\"Dedupe all packages\",\"$0 dedupe\"],[\"Dedupe all packages using a specific strategy\",\"$0 dedupe --strategy highest\"],[\"Dedupe a specific package\",\"$0 dedupe lodash\"],[\"Dedupe all packages with the `@babel/*` scope\",\"$0 dedupe '@babel/*'\"],[\"Check for duplicates (can be used as a CI step)\",\"$0 dedupe --check\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd),a=await Kr.find(r);await s.restoreInstallState({restoreResolutions:!1});let n=0,c=await Ot.start({configuration:r,includeFooter:!1,stdout:this.context.stdout,json:this.json},async f=>{n=await z5(s,{strategy:this.strategy,patterns:this.patterns,cache:a,report:f})});return c.hasErrors()?c.exitCode():this.check?n?1:0:await s.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:a,mode:this.mode})}};Ge();Yt();var pC=class extends ft{static{this.paths=[[\"--clipanion=definitions\"]]}async execute(){let{plugins:e}=await ze.find(this.context.cwd,this.context.plugins),r=[];for(let c of e){let{commands:f}=c[1];if(f){let h=Ca.from(f).definitions();r.push([c[0],h])}}let s=this.cli.definitions(),a=(c,f)=>c.split(\" \").slice(1).join()===f.split(\" \").slice(1).join(),n=dye()[\"@yarnpkg/builder\"].bundles.standard;for(let c of r){let f=c[1];for(let p of f)s.find(h=>a(h.path,p.path)).plugin={name:c[0],isDefault:n.includes(c[0])}}this.context.stdout.write(`${JSON.stringify(s,null,2)}\n`)}};var hC=class extends ft{static{this.paths=[[\"help\"],[\"--help\"],[\"-h\"]]}async execute(){this.context.stdout.write(this.cli.usage(null))}};Ge();Dt();Yt();var gC=class extends ft{constructor(){super(...arguments);this.leadingArgument=ge.String();this.args=ge.Proxy()}async execute(){if(this.leadingArgument.match(/[\\\\/]/)&&!G.tryParseIdent(this.leadingArgument)){let r=J.resolve(this.context.cwd,fe.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:r})}else return await this.cli.run([\"run\",this.leadingArgument,...this.args])}};Ge();var dC=class extends ft{static{this.paths=[[\"-v\"],[\"--version\"]]}async execute(){this.context.stdout.write(`${fn||\"<unknown>\"}\n`)}};Ge();Ge();Yt();var mC=class extends ft{constructor(){super(...arguments);this.commandName=ge.String();this.args=ge.Proxy()}static{this.paths=[[\"exec\"]]}static{this.usage=ot.Usage({description:\"execute a shell script\",details:`\n      This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell.\n\n      It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment).\n    `,examples:[[\"Execute a single shell command\",\"$0 exec echo Hello World\"],[\"Execute a shell script\",'$0 exec \"tsc & babel src --out-dir lib\"']]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,locator:a}=await Tt.find(r,this.context.cwd);return await s.restoreInstallState(),await In.executePackageShellcode(a,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:s})}};Ge();Yt();Ul();var yC=class extends ft{constructor(){super(...arguments);this.hash=ge.String({required:!1,validator:Nx(wE(),[Z2(/^p[0-9a-f]{6}$/)])})}static{this.paths=[[\"explain\",\"peer-requirements\"]]}static{this.usage=ot.Usage({description:\"explain a set of peer requirements\",details:`\n      A peer requirement represents all peer requests that a subject must satisfy when providing a requested package to requesters.\n\n      When the hash argument is specified, this command prints a detailed explanation of the peer requirement corresponding to the hash and whether it is satisfied or not.\n\n      When used without arguments, this command lists all peer requirements and the corresponding hash that can be used to get detailed information about a given requirement.\n\n      **Note:** A hash is a seven-letter code consisting of the letter 'p' followed by six characters that can be obtained from peer dependency warnings or from the list of all peer requirements(\\`yarn explain peer-requirements\\`).\n    `,examples:[[\"Explain the corresponding peer requirement for a hash\",\"$0 explain peer-requirements p1a4ed\"],[\"List all peer requirements\",\"$0 explain peer-requirements\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd);return await s.restoreInstallState({restoreResolutions:!1}),await s.applyLightResolution(),typeof this.hash<\"u\"?await Wlt(this.hash,s,{stdout:this.context.stdout}):await Ylt(s,{stdout:this.context.stdout})}};async function Wlt(t,e,r){let s=e.peerRequirementNodes.get(t);if(typeof s>\"u\")throw new Error(`No peerDependency requirements found for hash: \"${t}\"`);let a=new Set,n=p=>a.has(p.requester.locatorHash)?{value:he.tuple(he.Type.DEPENDENT,{locator:p.requester,descriptor:p.descriptor}),children:p.children.size>0?[{value:he.tuple(he.Type.NO_HINT,\"...\")}]:[]}:(a.add(p.requester.locatorHash),{value:he.tuple(he.Type.DEPENDENT,{locator:p.requester,descriptor:p.descriptor}),children:Object.fromEntries(Array.from(p.children.values(),h=>[G.stringifyLocator(h.requester),n(h)]))}),c=e.peerWarnings.find(p=>p.hash===t);return(await Ot.start({configuration:e.configuration,stdout:r.stdout,includeFooter:!1,includePrefix:!1},async p=>{let h=he.mark(e.configuration),E=c?h.Cross:h.Check;if(p.reportInfo(0,`Package ${he.pretty(e.configuration,s.subject,he.Type.LOCATOR)} is requested to provide ${he.pretty(e.configuration,s.ident,he.Type.IDENT)} by its descendants`),p.reportSeparator(),p.reportInfo(0,he.pretty(e.configuration,s.subject,he.Type.LOCATOR)),xs.emitTree({children:Object.fromEntries(Array.from(s.requests.values(),C=>[G.stringifyLocator(C.requester),n(C)]))},{configuration:e.configuration,stdout:r.stdout,json:!1}),p.reportSeparator(),s.provided.range===\"missing:\"){let C=c?\"\":\" , but all peer requests are optional\";p.reportInfo(0,`${E} Package ${he.pretty(e.configuration,s.subject,he.Type.LOCATOR)} does not provide ${he.pretty(e.configuration,s.ident,he.Type.IDENT)}${C}.`)}else{let C=e.storedResolutions.get(s.provided.descriptorHash);if(!C)throw new Error(\"Assertion failed: Expected the descriptor to be registered\");let S=e.storedPackages.get(C);if(!S)throw new Error(\"Assertion failed: Expected the package to be registered\");p.reportInfo(0,`${E} Package ${he.pretty(e.configuration,s.subject,he.Type.LOCATOR)} provides ${he.pretty(e.configuration,s.ident,he.Type.IDENT)} with version ${G.prettyReference(e.configuration,S.version??\"0.0.0\")}, ${c?\"which does not satisfy all requests.\":\"which satisfies all requests\"}`),c?.type===3&&(c.range?p.reportInfo(0,`  The combined requested range is ${he.pretty(e.configuration,c.range,he.Type.RANGE)}`):p.reportInfo(0,\"  Unfortunately, the requested ranges have no overlap\"))}})).exitCode()}async function Ylt(t,e){return(await Ot.start({configuration:t.configuration,stdout:e.stdout,includeFooter:!1,includePrefix:!1},async s=>{let a=he.mark(t.configuration),n=je.sortMap(t.peerRequirementNodes,[([,c])=>G.stringifyLocator(c.subject),([,c])=>G.stringifyIdent(c.ident)]);for(let[,c]of n.values()){if(!c.root)continue;let f=t.peerWarnings.find(E=>E.hash===c.hash),p=[...G.allPeerRequests(c)],h;if(p.length>2?h=` and ${p.length-1} other dependencies`:p.length===2?h=\" and 1 other dependency\":h=\"\",c.provided.range!==\"missing:\"){let E=t.storedResolutions.get(c.provided.descriptorHash);if(!E)throw new Error(\"Assertion failed: Expected the resolution to have been registered\");let C=t.storedPackages.get(E);if(!C)throw new Error(\"Assertion failed: Expected the provided package to have been registered\");let S=`${he.pretty(t.configuration,c.hash,he.Type.CODE)} \\u2192 ${f?a.Cross:a.Check} ${G.prettyLocator(t.configuration,c.subject)} provides ${G.prettyLocator(t.configuration,C)} to ${G.prettyLocator(t.configuration,p[0].requester)}${h}`;f?s.reportWarning(0,S):s.reportInfo(0,S)}else{let E=`${he.pretty(t.configuration,c.hash,he.Type.CODE)} \\u2192 ${f?a.Cross:a.Check} ${G.prettyLocator(t.configuration,c.subject)} doesn't provide ${G.prettyIdent(t.configuration,c.ident)} to ${G.prettyLocator(t.configuration,p[0].requester)}${h}`;f?s.reportWarning(0,E):s.reportInfo(0,E)}}})).exitCode()}Ge();Yt();Ul();Ge();Ge();Dt();Yt();var mye=ut(Ai()),EC=class extends ft{constructor(){super(...arguments);this.useYarnPath=ge.Boolean(\"--yarn-path\",{description:\"Set the yarnPath setting even if the version can be accessed by Corepack\"});this.onlyIfNeeded=ge.Boolean(\"--only-if-needed\",!1,{description:\"Only lock the Yarn version if it isn't already locked\"});this.version=ge.String()}static{this.paths=[[\"set\",\"version\"]]}static{this.usage=ot.Usage({description:\"lock the Yarn version used by the project\",details:\"\\n      This command will set a specific release of Yarn to be used by Corepack: https://nodejs.org/api/corepack.html.\\n\\n      By default it only will set the `packageManager` field at the root of your project, but if the referenced release cannot be represented this way, if you already have `yarnPath` configured, or if you set the `--yarn-path` command line flag, then the release will also be downloaded from the Yarn GitHub repository, stored inside your project, and referenced via the `yarnPath` settings from your project `.yarnrc.yml` file.\\n\\n      A very good use case for this command is to enforce the version of Yarn used by any single member of your team inside the same project - by doing this you ensure that you have control over Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting different behavior.\\n\\n      The version specifier can be:\\n\\n      - a tag:\\n        - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\\n        - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\\n        - `classic` -> the most recent classic (`^0.x || ^1.x`) release\\n\\n      - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\\n\\n      - a semver version (e.g. `2.4.1`, `1.22.1`)\\n\\n      - a local file referenced through either a relative or absolute path\\n\\n      - `self` -> the version used to invoke the command\\n    \",examples:[[\"Download the latest release from the Yarn repository\",\"$0 set version latest\"],[\"Download the latest canary release from the Yarn repository\",\"$0 set version canary\"],[\"Download the latest classic release from the Yarn repository\",\"$0 set version classic\"],[\"Download the most recent Yarn 3 build\",\"$0 set version 3.x\"],[\"Download a specific Yarn 2 build\",\"$0 set version 2.0.0-rc.30\"],[\"Switch back to a specific Yarn 1 release\",\"$0 set version 1.22.1\"],[\"Use a release from the local filesystem\",\"$0 set version ./yarn.cjs\"],[\"Use a release from a URL\",\"$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js\"],[\"Download the version used to invoke the command\",\"$0 set version self\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);if(this.onlyIfNeeded&&r.get(\"yarnPath\")){let f=r.sources.get(\"yarnPath\");if(!f)throw new Error(\"Assertion failed: Expected 'yarnPath' to have a source\");let p=r.projectCwd??r.startingCwd;if(J.contains(p,f))return 0}let s=()=>{if(typeof fn>\"u\")throw new nt(\"The --install flag can only be used without explicit version specifier from the Yarn CLI\");return`file://${process.argv[1]}`},a,n=(f,p)=>({version:p,url:f.replace(/\\{\\}/g,p)});if(this.version===\"self\")a={url:s(),version:fn??\"self\"};else if(this.version===\"latest\"||this.version===\"berry\"||this.version===\"stable\")a=n(\"https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js\",await Zv(r,\"stable\"));else if(this.version===\"canary\")a=n(\"https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js\",await Zv(r,\"canary\"));else if(this.version===\"classic\")a={url:\"https://classic.yarnpkg.com/latest.js\",version:\"classic\"};else if(this.version.match(/^https?:/))a={url:this.version,version:\"remote\"};else if(this.version.match(/^\\.{0,2}[\\\\/]/)||fe.isAbsolute(this.version))a={url:`file://${J.resolve(fe.toPortablePath(this.version))}`,version:\"file\"};else if(Fr.satisfiesWithPrereleases(this.version,\">=2.0.0\"))a=n(\"https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js\",this.version);else if(Fr.satisfiesWithPrereleases(this.version,\"^0.x || ^1.x\"))a=n(\"https://github.com/yarnpkg/yarn/releases/download/v{}/yarn-{}.js\",this.version);else if(Fr.validRange(this.version))a=n(\"https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js\",await Vlt(r,this.version));else throw new nt(`Invalid version descriptor \"${this.version}\"`);return(await Ot.start({configuration:r,stdout:this.context.stdout,includeLogs:!this.context.quiet},async f=>{let p=async()=>{let h=\"file://\";return a.url.startsWith(h)?(f.reportInfo(0,`Retrieving ${he.pretty(r,a.url,he.Type.PATH)}`),await ce.readFilePromise(a.url.slice(h.length))):(f.reportInfo(0,`Downloading ${he.pretty(r,a.url,he.Type.URL)}`),await nn.get(a.url,{configuration:r}))};await X5(r,a.version,p,{report:f,useYarnPath:this.useYarnPath})})).exitCode()}};async function Vlt(t,e){let s=(await nn.get(\"https://repo.yarnpkg.com/tags\",{configuration:t,jsonResponse:!0})).tags.filter(a=>Fr.satisfiesWithPrereleases(a,e));if(s.length===0)throw new nt(`No matching release found for range ${he.pretty(t,e,he.Type.RANGE)}.`);return s[0]}async function Zv(t,e){let r=await nn.get(\"https://repo.yarnpkg.com/tags\",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new nt(`Tag ${he.pretty(t,e,he.Type.RANGE)} not found`);return r.latest[e]}async function X5(t,e,r,{report:s,useYarnPath:a}){let n,c=async()=>(typeof n>\"u\"&&(n=await r()),n);if(e===null){let ee=await c();await ce.mktempPromise(async ie=>{let ue=J.join(ie,\"yarn.cjs\");await ce.writeFilePromise(ue,ee);let{stdout:le}=await qr.execvp(process.execPath,[fe.fromPortablePath(ue),\"--version\"],{cwd:ie,env:{...t.env,YARN_IGNORE_PATH:\"1\"}});if(e=le.trim(),!mye.default.valid(e))throw new Error(`Invalid semver version. ${he.pretty(t,\"yarn --version\",he.Type.CODE)} returned:\n${e}`)})}let f=t.projectCwd??t.startingCwd,p=J.resolve(f,\".yarn/releases\"),h=J.resolve(p,`yarn-${e}.cjs`),E=J.relative(t.startingCwd,h),C=je.isTaggedYarnVersion(e),S=t.get(\"yarnPath\"),P=!C,I=P||!!S||!!a;if(a===!1){if(P)throw new jt(0,\"You explicitly opted out of yarnPath usage in your command line, but the version you specified cannot be represented by Corepack\");I=!1}else!I&&!process.env.COREPACK_ROOT&&(s.reportWarning(0,`You don't seem to have ${he.applyHyperlink(t,\"Corepack\",\"https://nodejs.org/api/corepack.html\")} enabled; we'll have to rely on ${he.applyHyperlink(t,\"yarnPath\",\"https://yarnpkg.com/configuration/yarnrc#yarnPath\")} instead`),I=!0);if(I){let ee=await c();s.reportInfo(0,`Saving the new release in ${he.pretty(t,E,\"magenta\")}`),await ce.removePromise(J.dirname(h)),await ce.mkdirPromise(J.dirname(h),{recursive:!0}),await ce.writeFilePromise(h,ee,{mode:493}),await ze.updateConfiguration(f,{yarnPath:J.relative(f,h)})}else await ce.removePromise(J.dirname(h)),await ze.updateConfiguration(f,{yarnPath:ze.deleteProperty});let R=await Ut.tryFind(f)||new Ut;R.packageManager=`yarn@${C?e:await Zv(t,\"stable\")}`;let N={};R.exportTo(N);let U=J.join(f,Ut.fileName),W=`${JSON.stringify(N,null,R.indent)}\n`;return await ce.changeFilePromise(U,W,{automaticNewlines:!0}),{bundleVersion:e}}function yye(t){return Br[jx(t)]}var Jlt=/## (?<code>YN[0-9]{4}) - `(?<name>[A-Z_]+)`\\n\\n(?<details>(?:.(?!##))+)/gs;async function Klt(t){let r=`https://repo.yarnpkg.com/${je.isTaggedYarnVersion(fn)?fn:await Zv(t,\"canary\")}/packages/docusaurus/docs/advanced/01-general-reference/error-codes.mdx`,s=await nn.get(r,{configuration:t});return new Map(Array.from(s.toString().matchAll(Jlt),({groups:a})=>{if(!a)throw new Error(\"Assertion failed: Expected the match to have been successful\");let n=yye(a.code);if(a.name!==n)throw new Error(`Assertion failed: Invalid error code data: Expected \"${a.name}\" to be named \"${n}\"`);return[a.code,a.details]}))}var IC=class extends ft{constructor(){super(...arguments);this.code=ge.String({required:!1,validator:$2(wE(),[Z2(/^YN[0-9]{4}$/)])});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"explain\"]]}static{this.usage=ot.Usage({description:\"explain an error code\",details:`\n      When the code argument is specified, this command prints its name and its details.\n\n      When used without arguments, this command lists all error codes and their names.\n    `,examples:[[\"Explain an error code\",\"$0 explain YN0006\"],[\"List all error codes\",\"$0 explain\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);if(typeof this.code<\"u\"){let s=yye(this.code),a=he.pretty(r,s,he.Type.CODE),n=this.cli.format().header(`${this.code} - ${a}`),f=(await Klt(r)).get(this.code),p=typeof f<\"u\"?he.jsonOrPretty(this.json,r,he.tuple(he.Type.MARKDOWN,{text:f,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description.\n\nYou can help us by editing this page on GitHub \\u{1F642}:\n${he.jsonOrPretty(this.json,r,he.tuple(he.Type.URL,\"https://github.com/yarnpkg/berry/blob/master/packages/docusaurus/docs/advanced/01-general-reference/error-codes.mdx\"))}\n`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:s,details:p})}\n`):this.context.stdout.write(`${n}\n\n${p}\n`)}else{let s={children:je.mapAndFilter(Object.entries(Br),([a,n])=>Number.isNaN(Number(a))?je.mapAndFilter.skip:{label:Yf(Number(a)),value:he.tuple(he.Type.CODE,n)})};xs.emitTree(s,{configuration:r,stdout:this.context.stdout,json:this.json})}}};Ge();Dt();Yt();var Eye=ut(Go()),CC=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Print versions of a package from the whole project\"});this.recursive=ge.Boolean(\"-R,--recursive\",!1,{description:\"Print information for all packages, including transitive dependencies\"});this.extra=ge.Array(\"-X,--extra\",[],{description:\"An array of requests of extra data provided by plugins\"});this.cache=ge.Boolean(\"--cache\",!1,{description:\"Print information about the cache entry of a package (path, size, checksum)\"});this.dependents=ge.Boolean(\"--dependents\",!1,{description:\"Print all dependents for each matching package\"});this.manifest=ge.Boolean(\"--manifest\",!1,{description:\"Print data obtained by looking at the package archive (license, homepage, ...)\"});this.nameOnly=ge.Boolean(\"--name-only\",!1,{description:\"Only print the name for the matching packages\"});this.virtuals=ge.Boolean(\"--virtuals\",!1,{description:\"Print each instance of the virtual packages\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.patterns=ge.Rest()}static{this.paths=[[\"info\"]]}static{this.usage=ot.Usage({description:\"see information related to packages\",details:\"\\n      This command prints various information related to the specified packages, accepting glob patterns.\\n\\n      By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\\n\\n      Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\\n\\n      Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\\n    \",examples:[[\"Show information about Lodash\",\"$0 info lodash\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);if(!a&&!this.all)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let c=new Set(this.extra);this.cache&&c.add(\"cache\"),this.dependents&&c.add(\"dependents\"),this.manifest&&c.add(\"manifest\");let f=(ie,{recursive:ue})=>{let le=ie.anchoredLocator.locatorHash,me=new Map,pe=[le];for(;pe.length>0;){let Be=pe.shift();if(me.has(Be))continue;let Ce=s.storedPackages.get(Be);if(typeof Ce>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");if(me.set(Be,Ce),G.isVirtualLocator(Ce)&&pe.push(G.devirtualizeLocator(Ce).locatorHash),!(!ue&&Be!==le))for(let g of Ce.dependencies.values()){let we=s.storedResolutions.get(g.descriptorHash);if(typeof we>\"u\")throw new Error(\"Assertion failed: Expected the resolution to be registered\");pe.push(we)}}return me.values()},p=({recursive:ie})=>{let ue=new Map;for(let le of s.workspaces)for(let me of f(le,{recursive:ie}))ue.set(me.locatorHash,me);return ue.values()},h=({all:ie,recursive:ue})=>ie&&ue?s.storedPackages.values():ie?p({recursive:ue}):f(a,{recursive:ue}),E=({all:ie,recursive:ue})=>{let le=h({all:ie,recursive:ue}),me=this.patterns.map(Ce=>{let g=G.parseLocator(Ce),we=Eye.default.makeRe(G.stringifyIdent(g)),ye=G.isVirtualLocator(g),Ae=ye?G.devirtualizeLocator(g):g;return se=>{let Z=G.stringifyIdent(se);if(!we.test(Z))return!1;if(g.reference===\"unknown\")return!0;let De=G.isVirtualLocator(se),Re=De?G.devirtualizeLocator(se):se;return!(ye&&De&&g.reference!==se.reference||Ae.reference!==Re.reference)}}),pe=je.sortMap([...le],Ce=>G.stringifyLocator(Ce));return{selection:pe.filter(Ce=>me.length===0||me.some(g=>g(Ce))),sortedLookup:pe}},{selection:C,sortedLookup:S}=E({all:this.all,recursive:this.recursive});if(C.length===0)throw new nt(\"No package matched your request\");let P=new Map;if(this.dependents)for(let ie of S)for(let ue of ie.dependencies.values()){let le=s.storedResolutions.get(ue.descriptorHash);if(typeof le>\"u\")throw new Error(\"Assertion failed: Expected the resolution to be registered\");je.getArrayWithDefault(P,le).push(ie)}let I=new Map;for(let ie of S){if(!G.isVirtualLocator(ie))continue;let ue=G.devirtualizeLocator(ie);je.getArrayWithDefault(I,ue.locatorHash).push(ie)}let R={},N={children:R},U=r.makeFetcher(),W={project:s,fetcher:U,cache:n,checksums:s.storedChecksums,report:new ki,cacheOptions:{skipIntegrityCheck:!0}},ee=[async(ie,ue,le)=>{if(!ue.has(\"manifest\"))return;let me=await U.fetch(ie,W),pe;try{pe=await Ut.find(me.prefixPath,{baseFs:me.packageFs})}finally{me.releaseFs?.()}le(\"Manifest\",{License:he.tuple(he.Type.NO_HINT,pe.license),Homepage:he.tuple(he.Type.URL,pe.raw.homepage??null)})},async(ie,ue,le)=>{if(!ue.has(\"cache\"))return;let me=s.storedChecksums.get(ie.locatorHash)??null,pe=n.getLocatorPath(ie,me),Be;if(pe!==null)try{Be=await ce.statPromise(pe)}catch{}let Ce=typeof Be<\"u\"?[Be.size,he.Type.SIZE]:void 0;le(\"Cache\",{Checksum:he.tuple(he.Type.NO_HINT,me),Path:he.tuple(he.Type.PATH,pe),Size:Ce})}];for(let ie of C){let ue=G.isVirtualLocator(ie);if(!this.virtuals&&ue)continue;let le={},me={value:[ie,he.Type.LOCATOR],children:le};if(R[G.stringifyLocator(ie)]=me,this.nameOnly){delete me.children;continue}let pe=I.get(ie.locatorHash);typeof pe<\"u\"&&(le.Instances={label:\"Instances\",value:he.tuple(he.Type.NUMBER,pe.length)}),le.Version={label:\"Version\",value:he.tuple(he.Type.NO_HINT,ie.version)};let Be=(g,we)=>{let ye={};if(le[g]=ye,Array.isArray(we))ye.children=we.map(Ae=>({value:Ae}));else{let Ae={};ye.children=Ae;for(let[se,Z]of Object.entries(we))typeof Z>\"u\"||(Ae[se]={label:se,value:Z})}};if(!ue){for(let g of ee)await g(ie,c,Be);await r.triggerHook(g=>g.fetchPackageInfo,ie,c,Be)}ie.bin.size>0&&!ue&&Be(\"Exported Binaries\",[...ie.bin.keys()].map(g=>he.tuple(he.Type.PATH,g)));let Ce=P.get(ie.locatorHash);typeof Ce<\"u\"&&Ce.length>0&&Be(\"Dependents\",Ce.map(g=>he.tuple(he.Type.LOCATOR,g))),ie.dependencies.size>0&&!ue&&Be(\"Dependencies\",[...ie.dependencies.values()].map(g=>{let we=s.storedResolutions.get(g.descriptorHash),ye=typeof we<\"u\"?s.storedPackages.get(we)??null:null;return he.tuple(he.Type.RESOLUTION,{descriptor:g,locator:ye})})),ie.peerDependencies.size>0&&ue&&Be(\"Peer dependencies\",[...ie.peerDependencies.values()].map(g=>{let we=ie.dependencies.get(g.identHash),ye=typeof we<\"u\"?s.storedResolutions.get(we.descriptorHash)??null:null,Ae=ye!==null?s.storedPackages.get(ye)??null:null;return he.tuple(he.Type.RESOLUTION,{descriptor:g,locator:Ae})}))}xs.emitTree(N,{configuration:r,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};Ge();Dt();wc();var nF=ut(Fd());Yt();var Z5=ut(Ai());Ul();var zlt=[{selector:t=>t===-1,name:\"nodeLinker\",value:\"node-modules\"},{selector:t=>t!==-1&&t<8,name:\"enableGlobalCache\",value:!1},{selector:t=>t!==-1&&t<8,name:\"compressionLevel\",value:\"mixed\"}],wC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.immutable=ge.Boolean(\"--immutable\",{description:\"Abort with an error exit code if the lockfile was to be modified\"});this.immutableCache=ge.Boolean(\"--immutable-cache\",{description:\"Abort with an error exit code if the cache folder was to be modified\"});this.refreshLockfile=ge.Boolean(\"--refresh-lockfile\",{description:\"Refresh the package metadata stored in the lockfile\"});this.checkCache=ge.Boolean(\"--check-cache\",{description:\"Always refetch the packages and ensure that their checksums are consistent\"});this.checkResolutions=ge.Boolean(\"--check-resolutions\",{description:\"Validates that the package resolutions are coherent\"});this.inlineBuilds=ge.Boolean(\"--inline-builds\",{description:\"Verbosely print the output of the build steps of dependencies\"});this.mode=ge.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:fo($l)});this.cacheFolder=ge.String(\"--cache-folder\",{hidden:!0});this.frozenLockfile=ge.Boolean(\"--frozen-lockfile\",{hidden:!0});this.ignoreEngines=ge.Boolean(\"--ignore-engines\",{hidden:!0});this.nonInteractive=ge.Boolean(\"--non-interactive\",{hidden:!0});this.preferOffline=ge.Boolean(\"--prefer-offline\",{hidden:!0});this.production=ge.Boolean(\"--production\",{hidden:!0});this.registry=ge.String(\"--registry\",{hidden:!0});this.silent=ge.Boolean(\"--silent\",{hidden:!0});this.networkTimeout=ge.String(\"--network-timeout\",{hidden:!0})}static{this.paths=[[\"install\"],ot.Default]}static{this.usage=ot.Usage({description:\"install the project dependencies\",details:\"\\n      This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics:\\n\\n      - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ).\\n\\n      - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of `cacheFolder` in `yarn config` to see where the cache files are stored).\\n\\n      - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the `.pnp.cjs` file you might know).\\n\\n      - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail.\\n\\n      Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your `.pnp.cjs` file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches.\\n\\n      If the `--immutable` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the `immutablePatterns` configuration setting). For backward compatibility we offer an alias under the name of `--frozen-lockfile`, but it will be removed in a later release.\\n\\n      If the `--immutable-cache` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed).\\n\\n      If the `--refresh-lockfile` option is set, Yarn will keep the same resolution for the packages currently in the lockfile but will refresh their metadata. If used together with `--immutable`, it can validate that the lockfile information are consistent. This flag is enabled by default when Yarn detects it runs within a pull request context.\\n\\n      If the `--check-cache` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them.\\n\\n      If the `--inline-builds` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments.\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n    \",examples:[[\"Install the project\",\"$0 install\"],[\"Validate a project when using Zero-Installs\",\"$0 install --immutable --immutable-cache\"],[\"Validate a project when using Zero-Installs (slightly safer if you accept external PRs)\",\"$0 install --immutable --immutable-cache --check-cache\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds<\"u\"&&r.useWithSource(\"<cli>\",{enableInlineBuilds:this.inlineBuilds},r.startingCwd,{overwrite:!0});let s=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,a=await SI({configuration:r,stdout:this.context.stdout},[{option:this.ignoreEngines,message:\"The --ignore-engines option is deprecated; engine checking isn't a core feature anymore\",error:!nF.default.VERCEL},{option:this.registry,message:\"The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file\"},{option:this.preferOffline,message:\"The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead\",error:!nF.default.VERCEL},{option:this.production,message:\"The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead\",error:!0},{option:this.nonInteractive,message:\"The --non-interactive option is deprecated\",error:!s},{option:this.frozenLockfile,message:\"The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead\",callback:()=>this.immutable=this.frozenLockfile},{option:this.cacheFolder,message:\"The cache-folder option has been deprecated; use rc settings instead\",error:!nF.default.NETLIFY}]);if(a!==null)return a;let n=this.mode===\"update-lockfile\";if(n&&(this.immutable||this.immutableCache))throw new nt(`${he.pretty(r,\"--immutable\",he.Type.CODE)} and ${he.pretty(r,\"--immutable-cache\",he.Type.CODE)} cannot be used with ${he.pretty(r,\"--mode=update-lockfile\",he.Type.CODE)}`);let c=(this.immutable??r.get(\"enableImmutableInstalls\"))&&!n,f=this.immutableCache&&!n;if(r.projectCwd!==null){let R=await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{let U=!1;await $lt(r,c)&&(N.reportInfo(48,\"Automatically removed core plugins that are now builtins \\u{1F44D}\"),U=!0),await Zlt(r,c)&&(N.reportInfo(48,\"Automatically fixed merge conflicts \\u{1F44D}\"),U=!0),U&&N.reportSeparator()});if(R.hasErrors())return R.exitCode()}if(r.projectCwd!==null){let R=await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{if(ze.telemetry?.isNew)ze.telemetry.commitTips(),N.reportInfo(65,\"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry\"),N.reportInfo(65,`Run ${he.pretty(r,\"yarn config set --home enableTelemetry 0\",he.Type.CODE)} to disable`),N.reportSeparator();else if(ze.telemetry?.shouldShowTips){let U=await nn.get(\"https://repo.yarnpkg.com/tags\",{configuration:r,jsonResponse:!0}).catch(()=>null);if(U!==null){let W=null;if(fn!==null){let ie=Z5.default.prerelease(fn)?\"canary\":\"stable\",ue=U.latest[ie];Z5.default.gt(ue,fn)&&(W=[ie,ue])}if(W)ze.telemetry.commitTips(),N.reportInfo(88,`${he.applyStyle(r,`A new ${W[0]} version of Yarn is available:`,he.Style.BOLD)} ${G.prettyReference(r,W[1])}!`),N.reportInfo(88,`Upgrade now by running ${he.pretty(r,`yarn set version ${W[1]}`,he.Type.CODE)}`),N.reportSeparator();else{let ee=ze.telemetry.selectTip(U.tips);ee&&(N.reportInfo(89,he.pretty(r,ee.message,he.Type.MARKDOWN_INLINE)),ee.url&&N.reportInfo(89,`Learn more at ${ee.url}`),N.reportSeparator())}}}});if(R.hasErrors())return R.exitCode()}let{project:p,workspace:h}=await Tt.find(r,this.context.cwd),E=p.lockfileLastVersion;if(E!==null){let R=await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{let U={};for(let W of zlt)W.selector(E)&&typeof r.sources.get(W.name)>\"u\"&&(r.use(\"<compat>\",{[W.name]:W.value},p.cwd,{overwrite:!0}),U[W.name]=W.value);Object.keys(U).length>0&&(await ze.updateConfiguration(p.cwd,U),N.reportInfo(87,\"Migrated your project to the latest Yarn version \\u{1F680}\"),N.reportSeparator())});if(R.hasErrors())return R.exitCode()}let C=await Kr.find(r,{immutable:f,check:this.checkCache});if(!h)throw new ar(p.cwd,this.context.cwd);await p.restoreInstallState({restoreResolutions:!1});let S=r.get(\"enableHardenedMode\");S&&typeof r.sources.get(\"enableHardenedMode\")>\"u\"&&await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async R=>{R.reportWarning(0,\"Yarn detected that the current workflow is executed from a public pull request. For safety the hardened mode has been enabled.\"),R.reportWarning(0,`It will prevent malicious lockfile manipulations, in exchange for a slower install time. You can opt-out if necessary; check our ${he.applyHyperlink(r,\"documentation\",\"https://yarnpkg.com/features/security#hardened-mode\")} for more details.`),R.reportSeparator()}),(this.refreshLockfile??S)&&(p.lockfileNeedsRefresh=!0);let P=this.checkResolutions??S;return(await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout,forceSectionAlignment:!0,includeLogs:!0,includeVersion:!0},async R=>{await p.install({cache:C,report:R,immutable:c,checkResolutions:P,mode:this.mode})})).exitCode()}},Xlt=\"<<<<<<<\";async function Zlt(t,e){if(!t.projectCwd)return!1;let r=J.join(t.projectCwd,Er.lockfile);if(!await ce.existsPromise(r)||!(await ce.readFilePromise(r,\"utf8\")).includes(Xlt))return!1;if(e)throw new jt(47,\"Cannot autofix a lockfile when running an immutable install\");let a=await qr.execvp(\"git\",[\"rev-parse\",\"MERGE_HEAD\",\"HEAD\"],{cwd:t.projectCwd});if(a.code!==0&&(a=await qr.execvp(\"git\",[\"rev-parse\",\"REBASE_HEAD\",\"HEAD\"],{cwd:t.projectCwd})),a.code!==0&&(a=await qr.execvp(\"git\",[\"rev-parse\",\"CHERRY_PICK_HEAD\",\"HEAD\"],{cwd:t.projectCwd})),a.code!==0)throw new jt(83,\"Git returned an error when trying to find the commits pertaining to the conflict\");let n=await Promise.all(a.stdout.trim().split(/\\n/).map(async f=>{let p=await qr.execvp(\"git\",[\"show\",`${f}:./${Er.lockfile}`],{cwd:t.projectCwd});if(p.code!==0)throw new jt(83,`Git returned an error when trying to access the lockfile content in ${f}`);try{return ls(p.stdout)}catch{throw new jt(46,\"A variant of the conflicting lockfile failed to parse\")}}));n=n.filter(f=>!!f.__metadata);for(let f of n){if(f.__metadata.version<7)for(let p of Object.keys(f)){if(p===\"__metadata\")continue;let h=G.parseDescriptor(p,!0),E=t.normalizeDependency(h),C=G.stringifyDescriptor(E);C!==p&&(f[C]=f[p],delete f[p])}for(let p of Object.keys(f)){if(p===\"__metadata\")continue;let h=f[p].checksum;typeof h>\"u\"||h.includes(\"/\")||(f[p].checksum=`${f.__metadata.cacheKey}/${h}`)}}let c=Object.assign({},...n);c.__metadata.version=`${Math.min(...n.map(f=>parseInt(f.__metadata.version??0)))}`,c.__metadata.cacheKey=\"merged\";for(let[f,p]of Object.entries(c))typeof p==\"string\"&&delete c[f];return await ce.changeFilePromise(r,nl(c),{automaticNewlines:!0}),!0}async function $lt(t,e){if(!t.projectCwd)return!1;let r=[],s=J.join(t.projectCwd,\".yarn/plugins/@yarnpkg\");return await ze.updateConfiguration(t.projectCwd,{plugins:n=>{if(!Array.isArray(n))return n;let c=n.filter(f=>{if(!f.path)return!0;let p=J.resolve(t.projectCwd,f.path),h=ov.has(f.spec)&&J.contains(s,p);return h&&r.push(p),!h});return c.length===0?ze.deleteProperty:c.length===n.length?n:c}},{immutable:e})?(await Promise.all(r.map(async n=>{await ce.removePromise(n)})),!0):!1}Ge();Dt();Yt();var BC=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Link all workspaces belonging to the target projects to the current one\"});this.private=ge.Boolean(\"-p,--private\",!1,{description:\"Also link private workspaces belonging to the target projects to the current one\"});this.relative=ge.Boolean(\"-r,--relative\",!1,{description:\"Link workspaces using relative paths instead of absolute paths\"});this.destinations=ge.Rest()}static{this.paths=[[\"link\"]]}static{this.usage=ot.Usage({description:\"connect the local project to another one\",details:\"\\n      This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\\n    \",examples:[[\"Register one or more remote workspaces for use in the current project\",\"$0 link ~/ts-loader ~/jest\"],[\"Register all workspaces from a remote project for use in the current project\",\"$0 link ~/jest --all\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=s.topLevelWorkspace,f=[];for(let p of this.destinations){let h=J.resolve(this.context.cwd,fe.toPortablePath(p)),E=await ze.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:C,workspace:S}=await Tt.find(E,h);if(s.cwd===C.cwd)throw new nt(`Invalid destination '${p}'; Can't link the project to itself`);if(!S)throw new ar(C.cwd,h);if(this.all){let P=!1;for(let I of C.workspaces)I.manifest.name&&(!I.manifest.private||this.private)&&(f.push(I),P=!0);if(!P)throw new nt(`No workspace found to be linked in the target project: ${p}`)}else{if(!S.manifest.name)throw new nt(`The target workspace at '${p}' doesn't have a name and thus cannot be linked`);if(S.manifest.private&&!this.private)throw new nt(`The target workspace at '${p}' is marked private - use the --private flag to link it anyway`);f.push(S)}}for(let p of f){let h=G.stringifyIdent(p.anchoredLocator),E=this.relative?J.relative(s.cwd,p.cwd):p.cwd;c.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${E}`})}return await s.installWithNewReport({stdout:this.context.stdout},{cache:n})}};Yt();var vC=class extends ft{constructor(){super(...arguments);this.args=ge.Proxy()}static{this.paths=[[\"node\"]]}static{this.usage=ot.Usage({description:\"run node with the hook already setup\",details:`\n      This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment).\n\n      The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version.\n    `,examples:[[\"Run a Node script\",\"$0 node ./my-script.js\"]]})}async execute(){return this.cli.run([\"exec\",\"node\",...this.args])}};Ge();Yt();var SC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"plugin\",\"check\"]]}static{this.usage=ot.Usage({category:\"Plugin-related commands\",description:\"find all third-party plugins that differ from their own spec\",details:`\n      Check only the plugins from https.\n\n      If this command detects any plugin differences in the CI environment, it will throw an error.\n    `,examples:[[\"find all third-party plugins that differ from their own spec\",\"$0 plugin check\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=await ze.findRcFiles(this.context.cwd);return(await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{for(let c of s)if(c.data?.plugins)for(let f of c.data.plugins){if(!f.checksum||!f.spec.match(/^https?:/))continue;let p=await nn.get(f.spec,{configuration:r}),h=Nn.makeHash(p);if(f.checksum===h)continue;let E=he.pretty(r,f.path,he.Type.PATH),C=he.pretty(r,f.spec,he.Type.URL),S=`${E} is different from the file provided by ${C}`;n.reportJson({...f,newChecksum:h}),n.reportError(0,S)}})).exitCode()}};Ge();Ge();Dt();Yt();var vye=Ie(\"os\");Ge();Dt();Yt();var Iye=Ie(\"os\");Ge();wc();Yt();var ect=\"https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml\";async function Sm(t,e){let r=await nn.get(ect,{configuration:t}),s=ls(r.toString());return Object.fromEntries(Object.entries(s).filter(([a,n])=>!e||Fr.satisfiesWithPrereleases(e,n.range??\"<4.0.0-rc.1\")))}var DC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"plugin\",\"list\"]]}static{this.usage=ot.Usage({category:\"Plugin-related commands\",description:\"list the available official plugins\",details:\"\\n      This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\\n    \",examples:[[\"List the official plugins\",\"$0 plugin list\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);return(await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{let n=await Sm(r,fn);for(let[c,{experimental:f,...p}]of Object.entries(n)){let h=c;f&&(h+=\" [experimental]\"),a.reportJson({name:c,experimental:f,...p}),a.reportInfo(null,h)}})).exitCode()}};var tct=/^[0-9]+$/,rct=process.platform===\"win32\";function Cye(t){return tct.test(t)?`pull/${t}/head`:t}var nct=({repository:t,branch:e},r)=>[[\"git\",\"init\",fe.fromPortablePath(r)],[\"git\",\"remote\",\"add\",\"origin\",t],[\"git\",\"fetch\",\"origin\",\"--depth=1\",Cye(e)],[\"git\",\"reset\",\"--hard\",\"FETCH_HEAD\"]],ict=({branch:t})=>[[\"git\",\"fetch\",\"origin\",\"--depth=1\",Cye(t),\"--force\"],[\"git\",\"reset\",\"--hard\",\"FETCH_HEAD\"],[\"git\",\"clean\",\"-dfx\",\"-e\",\"packages/yarnpkg-cli/bundles\"]],sct=({plugins:t,noMinify:e},r,s)=>[[\"yarn\",\"build:cli\",...new Array().concat(...t.map(a=>[\"--plugin\",J.resolve(s,a)])),...e?[\"--no-minify\"]:[],\"|\"],[rct?\"move\":\"mv\",\"packages/yarnpkg-cli/bundles/yarn.js\",fe.fromPortablePath(r),\"|\"]],bC=class extends ft{constructor(){super(...arguments);this.installPath=ge.String(\"--path\",{description:\"The path where the repository should be cloned to\"});this.repository=ge.String(\"--repository\",\"https://github.com/yarnpkg/berry.git\",{description:\"The repository that should be cloned\"});this.branch=ge.String(\"--branch\",\"master\",{description:\"The branch of the repository that should be cloned\"});this.plugins=ge.Array(\"--plugin\",[],{description:\"An array of additional plugins that should be included in the bundle\"});this.dryRun=ge.Boolean(\"-n,--dry-run\",!1,{description:\"If set, the bundle will be built but not added to the project\"});this.noMinify=ge.Boolean(\"--no-minify\",!1,{description:\"Build a bundle for development (debugging) - non-minified and non-mangled\"});this.force=ge.Boolean(\"-f,--force\",!1,{description:\"Always clone the repository instead of trying to fetch the latest commits\"});this.skipPlugins=ge.Boolean(\"--skip-plugins\",!1,{description:\"Skip updating the contrib plugins\"})}static{this.paths=[[\"set\",\"version\",\"from\",\"sources\"]]}static{this.usage=ot.Usage({description:\"build Yarn from master\",details:`\n      This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project.\n\n      By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \\`--skip-plugins\\` flag.\n    `,examples:[[\"Build Yarn from master\",\"$0 set version from sources\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd),a=typeof this.installPath<\"u\"?J.resolve(this.context.cwd,fe.toPortablePath(this.installPath)):J.resolve(fe.toPortablePath((0,Iye.tmpdir)()),\"yarnpkg-sources\",Nn.makeHash(this.repository).slice(0,6));return(await Ot.start({configuration:r,stdout:this.context.stdout},async c=>{await $5(this,{configuration:r,report:c,target:a}),c.reportSeparator(),c.reportInfo(0,\"Building a fresh bundle\"),c.reportSeparator();let f=await qr.execvp(\"git\",[\"rev-parse\",\"--short\",\"HEAD\"],{cwd:a,strict:!0}),p=J.join(a,`packages/yarnpkg-cli/bundles/yarn-${f.stdout.trim()}.js`);ce.existsSync(p)||(await $v(sct(this,p,a),{configuration:r,context:this.context,target:a}),c.reportSeparator());let h=await ce.readFilePromise(p);if(!this.dryRun){let{bundleVersion:E}=await X5(r,null,async()=>h,{report:c});this.skipPlugins||await oct(this,E,{project:s,report:c,target:a})}})).exitCode()}};async function $v(t,{configuration:e,context:r,target:s}){for(let[a,...n]of t){let c=n[n.length-1]===\"|\";if(c&&n.pop(),c)await qr.pipevp(a,n,{cwd:s,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${he.pretty(e,`  $ ${[a,...n].join(\" \")}`,\"grey\")}\n`);try{await qr.execvp(a,n,{cwd:s,strict:!0})}catch(f){throw r.stdout.write(f.stdout||f.stack),f}}}}async function $5(t,{configuration:e,report:r,target:s}){let a=!1;if(!t.force&&ce.existsSync(J.join(s,\".git\"))){r.reportInfo(0,\"Fetching the latest commits\"),r.reportSeparator();try{await $v(ict(t),{configuration:e,context:t.context,target:s}),a=!0}catch{r.reportSeparator(),r.reportWarning(0,\"Repository update failed; we'll try to regenerate it\")}}a||(r.reportInfo(0,\"Cloning the remote repository\"),r.reportSeparator(),await ce.removePromise(s),await ce.mkdirPromise(s,{recursive:!0}),await $v(nct(t,s),{configuration:e,context:t.context,target:s}))}async function oct(t,e,{project:r,report:s,target:a}){let n=await Sm(r.configuration,e),c=new Set(Object.keys(n));for(let f of r.configuration.plugins.keys())c.has(f)&&await eq(f,t,{project:r,report:s,target:a})}Ge();Ge();Dt();Yt();var wye=ut(Ai()),Bye=Ie(\"vm\");var PC=class extends ft{constructor(){super(...arguments);this.name=ge.String();this.checksum=ge.Boolean(\"--checksum\",!0,{description:\"Whether to care if this plugin is modified\"})}static{this.paths=[[\"plugin\",\"import\"]]}static{this.usage=ot.Usage({category:\"Plugin-related commands\",description:\"download a plugin\",details:`\n      This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations.\n\n      Three types of plugin references are accepted:\n\n      - If the plugin is stored within the Yarn repository, it can be referenced by name.\n      - Third-party plugins can be referenced directly through their public urls.\n      - Local plugins can be referenced by their path on the disk.\n\n      If the \\`--no-checksum\\` option is set, Yarn will no longer care if the plugin is modified.\n\n      Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \\`@yarnpkg/builder\\` package).\n    `,examples:[['Download and activate the \"@yarnpkg/plugin-exec\" plugin',\"$0 plugin import @yarnpkg/plugin-exec\"],['Download and activate the \"@yarnpkg/plugin-exec\" plugin (shorthand)',\"$0 plugin import exec\"],[\"Download and activate a community plugin\",\"$0 plugin import https://example.org/path/to/plugin.js\"],[\"Activate a local plugin\",\"$0 plugin import ./path/to/plugin.js\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);return(await Ot.start({configuration:r,stdout:this.context.stdout},async a=>{let{project:n}=await Tt.find(r,this.context.cwd),c,f;if(this.name.match(/^\\.{0,2}[\\\\/]/)||fe.isAbsolute(this.name)){let p=J.resolve(this.context.cwd,fe.toPortablePath(this.name));a.reportInfo(0,`Reading ${he.pretty(r,p,he.Type.PATH)}`),c=J.relative(n.cwd,p),f=await ce.readFilePromise(p)}else{let p;if(this.name.match(/^https?:/)){try{new URL(this.name)}catch{throw new jt(52,`Plugin specifier \"${this.name}\" is neither a plugin name nor a valid url`)}c=this.name,p=this.name}else{let h=G.parseLocator(this.name.replace(/^((@yarnpkg\\/)?plugin-)?/,\"@yarnpkg/plugin-\"));if(h.reference!==\"unknown\"&&!wye.default.valid(h.reference))throw new jt(0,\"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.\");let E=G.stringifyIdent(h),C=await Sm(r,fn);if(!Object.hasOwn(C,E)){let S=`Couldn't find a plugin named ${G.prettyIdent(r,h)} on the remote registry.\n`;throw r.plugins.has(E)?S+=`A plugin named ${G.prettyIdent(r,h)} is already installed; possibly attempting to import a built-in plugin.`:S+=`Note that only the plugins referenced on our website (${he.pretty(r,\"https://github.com/yarnpkg/berry/blob/master/plugins.yml\",he.Type.URL)}) can be referenced by their name; any other plugin will have to be referenced through its public url (for example ${he.pretty(r,\"https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js\",he.Type.URL)}).`,new jt(51,S)}c=E,p=C[E].url,h.reference!==\"unknown\"?p=p.replace(/\\/master\\//,`/${E}/${h.reference}/`):fn!==null&&(p=p.replace(/\\/master\\//,`/@yarnpkg/cli/${fn}/`))}a.reportInfo(0,`Downloading ${he.pretty(r,p,\"green\")}`),f=await nn.get(p,{configuration:r})}await tq(c,f,{checksum:this.checksum,project:n,report:a})})).exitCode()}};async function tq(t,e,{checksum:r=!0,project:s,report:a}){let{configuration:n}=s,c={},f={exports:c};(0,Bye.runInNewContext)(e.toString(),{module:f,exports:c});let h=`.yarn/plugins/${f.exports.name}.cjs`,E=J.resolve(s.cwd,h);a.reportInfo(0,`Saving the new plugin in ${he.pretty(n,h,\"magenta\")}`),await ce.mkdirPromise(J.dirname(E),{recursive:!0}),await ce.writeFilePromise(E,e);let C={path:h,spec:t};r&&(C.checksum=Nn.makeHash(e)),await ze.addPlugin(s.cwd,[C])}var act=({pluginName:t,noMinify:e},r)=>[[\"yarn\",`build:${t}`,...e?[\"--no-minify\"]:[],\"|\"]],xC=class extends ft{constructor(){super(...arguments);this.installPath=ge.String(\"--path\",{description:\"The path where the repository should be cloned to\"});this.repository=ge.String(\"--repository\",\"https://github.com/yarnpkg/berry.git\",{description:\"The repository that should be cloned\"});this.branch=ge.String(\"--branch\",\"master\",{description:\"The branch of the repository that should be cloned\"});this.noMinify=ge.Boolean(\"--no-minify\",!1,{description:\"Build a plugin for development (debugging) - non-minified and non-mangled\"});this.force=ge.Boolean(\"-f,--force\",!1,{description:\"Always clone the repository instead of trying to fetch the latest commits\"});this.name=ge.String()}static{this.paths=[[\"plugin\",\"import\",\"from\",\"sources\"]]}static{this.usage=ot.Usage({category:\"Plugin-related commands\",description:\"build a plugin from sources\",details:`\n      This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations.\n\n      The plugins can be referenced by their short name if sourced from the official Yarn repository.\n    `,examples:[['Build and activate the \"@yarnpkg/plugin-exec\" plugin',\"$0 plugin import from sources @yarnpkg/plugin-exec\"],['Build and activate the \"@yarnpkg/plugin-exec\" plugin (shorthand)',\"$0 plugin import from sources exec\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=typeof this.installPath<\"u\"?J.resolve(this.context.cwd,fe.toPortablePath(this.installPath)):J.resolve(fe.toPortablePath((0,vye.tmpdir)()),\"yarnpkg-sources\",Nn.makeHash(this.repository).slice(0,6));return(await Ot.start({configuration:r,stdout:this.context.stdout},async n=>{let{project:c}=await Tt.find(r,this.context.cwd),f=G.parseIdent(this.name.replace(/^((@yarnpkg\\/)?plugin-)?/,\"@yarnpkg/plugin-\")),p=G.stringifyIdent(f),h=await Sm(r,fn);if(!Object.hasOwn(h,p))throw new jt(51,`Couldn't find a plugin named \"${p}\" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let E=p;await $5(this,{configuration:r,report:n,target:s}),await eq(E,this,{project:c,report:n,target:s})})).exitCode()}};async function eq(t,{context:e,noMinify:r},{project:s,report:a,target:n}){let c=t.replace(/@yarnpkg\\//,\"\"),{configuration:f}=s;a.reportSeparator(),a.reportInfo(0,`Building a fresh ${c}`),a.reportSeparator(),await $v(act({pluginName:c,noMinify:r},n),{configuration:f,context:e,target:n}),a.reportSeparator();let p=J.resolve(n,`packages/${c}/bundles/${t}.js`),h=await ce.readFilePromise(p);await tq(t,h,{project:s,report:a})}Ge();Dt();Yt();var kC=class extends ft{constructor(){super(...arguments);this.name=ge.String()}static{this.paths=[[\"plugin\",\"remove\"]]}static{this.usage=ot.Usage({category:\"Plugin-related commands\",description:\"remove a plugin\",details:`\n      This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration.\n\n      **Note:** The plugins have to be referenced by their name property, which can be obtained using the \\`yarn plugin runtime\\` command. Shorthands are not allowed.\n   `,examples:[[\"Remove a plugin imported from the Yarn repository\",\"$0 plugin remove @yarnpkg/plugin-typescript\"],[\"Remove a plugin imported from a local file\",\"$0 plugin remove my-local-plugin\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd);return(await Ot.start({configuration:r,stdout:this.context.stdout},async n=>{let c=this.name,f=G.parseIdent(c);if(!r.plugins.has(c))throw new nt(`${G.prettyIdent(r,f)} isn't referenced by the current configuration`);let p=`.yarn/plugins/${c}.cjs`,h=J.resolve(s.cwd,p);ce.existsSync(h)&&(n.reportInfo(0,`Removing ${he.pretty(r,p,he.Type.PATH)}...`),await ce.removePromise(h)),n.reportInfo(0,\"Updating the configuration...\"),await ze.updateConfiguration(s.cwd,{plugins:E=>{if(!Array.isArray(E))return E;let C=E.filter(S=>S.path!==p);return C.length===0?ze.deleteProperty:C.length===E.length?E:C}})})).exitCode()}};Ge();Yt();var QC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"plugin\",\"runtime\"]]}static{this.usage=ot.Usage({category:\"Plugin-related commands\",description:\"list the active plugins\",details:`\n      This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins.\n    `,examples:[[\"List the currently active plugins\",\"$0 plugin runtime\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);return(await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{for(let n of r.plugins.keys()){let c=this.context.plugins.plugins.has(n),f=n;c&&(f+=\" [builtin]\"),a.reportJson({name:n,builtin:c}),a.reportInfo(null,`${f}`)}})).exitCode()}};Ge();Ge();Yt();var TC=class extends ft{constructor(){super(...arguments);this.idents=ge.Rest()}static{this.paths=[[\"rebuild\"]]}static{this.usage=ot.Usage({description:\"rebuild the project's native packages\",details:`\n      This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again.\n\n      Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future).\n\n      By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory.\n    `,examples:[[\"Rebuild all packages\",\"$0 rebuild\"],[\"Rebuild fsevents only\",\"$0 rebuild fsevents\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);let c=new Set;for(let f of this.idents)c.add(G.parseIdent(f).identHash);if(await s.restoreInstallState({restoreResolutions:!1}),await s.resolveEverything({cache:n,report:new ki}),c.size>0)for(let f of s.storedPackages.values())c.has(f.identHash)&&(s.storedBuildState.delete(f.locatorHash),s.skippedBuilds.delete(f.locatorHash));else s.storedBuildState.clear(),s.skippedBuilds.clear();return await s.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Ge();Ge();Ge();Yt();var rq=ut(Go());Ul();var RC=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Apply the operation to all workspaces from the current project\"});this.mode=ge.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:fo($l)});this.patterns=ge.Rest()}static{this.paths=[[\"remove\"]]}static{this.usage=ot.Usage({description:\"remove dependencies from the project\",details:`\n      This command will remove the packages matching the specified patterns from the current workspace.\n\n      If the \\`--mode=<mode>\\` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n      - \\`skip-build\\` will not run the build scripts at all. Note that this is different from setting \\`enableScripts\\` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n      - \\`update-lockfile\\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n      This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n    `,examples:[[\"Remove a dependency from the current project\",\"$0 remove lodash\"],[\"Remove a dependency from all workspaces at once\",\"$0 remove lodash --all\"],[\"Remove all dependencies starting with `eslint-`\",\"$0 remove 'eslint-*'\"],[\"Remove all dependencies with the `@babel` scope\",\"$0 remove '@babel/*'\"],[\"Remove all dependencies matching `react-dom` or `react-helmet`\",\"$0 remove 'react-{dom,helmet}'\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=this.all?s.workspaces:[a],f=[\"dependencies\",\"devDependencies\",\"peerDependencies\"],p=[],h=!1,E=[];for(let I of this.patterns){let R=!1,N=G.parseIdent(I);for(let U of c){let W=[...U.manifest.peerDependenciesMeta.keys()];for(let ee of(0,rq.default)(W,I))U.manifest.peerDependenciesMeta.delete(ee),h=!0,R=!0;for(let ee of f){let ie=U.manifest.getForScope(ee),ue=[...ie.values()].map(le=>G.stringifyIdent(le));for(let le of(0,rq.default)(ue,G.stringifyIdent(N))){let{identHash:me}=G.parseIdent(le),pe=ie.get(me);if(typeof pe>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");U.manifest[ee].delete(me),E.push([U,ee,pe]),h=!0,R=!0}}}R||p.push(I)}let C=p.length>1?\"Patterns\":\"Pattern\",S=p.length>1?\"don't\":\"doesn't\",P=this.all?\"any\":\"this\";if(p.length>0)throw new nt(`${C} ${he.prettyList(r,p,he.Type.CODE)} ${S} match any packages referenced by ${P} workspace`);return h?(await r.triggerMultipleHooks(I=>I.afterWorkspaceDependencyRemoval,E),await s.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})):0}};Ge();Ge();Yt();var Sye=Ie(\"util\"),FC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"run\"]]}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);return(await Ot.start({configuration:r,stdout:this.context.stdout,json:this.json},async c=>{let f=a.manifest.scripts,p=je.sortMap(f.keys(),C=>C),h={breakLength:1/0,colors:r.get(\"enableColors\"),maxArrayLength:2},E=p.reduce((C,S)=>Math.max(C,S.length),0);for(let[C,S]of f.entries())c.reportInfo(null,`${C.padEnd(E,\" \")}   ${(0,Sye.inspect)(S,h)}`),c.reportJson({name:C,script:S})})).exitCode()}};Ge();Ge();Yt();var NC=class extends ft{constructor(){super(...arguments);this.inspect=ge.String(\"--inspect\",!1,{tolerateBoolean:!0,description:\"Forwarded to the underlying Node process when executing a binary\"});this.inspectBrk=ge.String(\"--inspect-brk\",!1,{tolerateBoolean:!0,description:\"Forwarded to the underlying Node process when executing a binary\"});this.topLevel=ge.Boolean(\"-T,--top-level\",!1,{description:\"Check the root workspace for scripts and/or binaries instead of the current one\"});this.binariesOnly=ge.Boolean(\"-B,--binaries-only\",!1,{description:\"Ignore any user defined scripts and only check for binaries\"});this.require=ge.String(\"--require\",{description:\"Forwarded to the underlying Node process when executing a binary\"});this.silent=ge.Boolean(\"--silent\",{hidden:!0});this.scriptName=ge.String();this.args=ge.Proxy()}static{this.paths=[[\"run\"]]}static{this.usage=ot.Usage({description:\"run a script defined in the package.json\",details:`\n      This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace:\n\n      - If the \\`scripts\\` field from your local package.json contains a matching script name, its definition will get executed.\n\n      - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed.\n\n      - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed.\n\n      Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax).\n    `,examples:[[\"Run the tests from the local workspace\",\"$0 run test\"],['Same thing, but without the \"run\" keyword',\"$0 test\"],[\"Inspect Webpack while running\",\"$0 run --inspect-brk webpack\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a,locator:n}=await Tt.find(r,this.context.cwd);await s.restoreInstallState();let c=this.topLevel?s.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await In.hasPackageScript(c,this.scriptName,{project:s}))return await In.executePackageScript(c,this.scriptName,this.args,{project:s,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let f=await In.getPackageAccessibleBinaries(c,{project:s});if(f.get(this.scriptName)){let h=[];return this.inspect&&(typeof this.inspect==\"string\"?h.push(`--inspect=${this.inspect}`):h.push(\"--inspect\")),this.inspectBrk&&(typeof this.inspectBrk==\"string\"?h.push(`--inspect-brk=${this.inspectBrk}`):h.push(\"--inspect-brk\")),this.require&&h.push(`--require=${this.require}`),await In.executePackageAccessibleBinary(c,this.scriptName,this.args,{cwd:this.context.cwd,project:s,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:h,packageAccessibleBinaries:f})}if(!this.topLevel&&!this.binariesOnly&&a&&this.scriptName.includes(\":\")){let E=(await Promise.all(s.workspaces.map(async C=>C.manifest.scripts.has(this.scriptName)?C:null))).filter(C=>C!==null);if(E.length===1)return await In.executeWorkspaceScript(E[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName===\"node-gyp\"?new nt(`Couldn't find a script name \"${this.scriptName}\" in the top-level (used by ${G.prettyLocator(r,n)}). This typically happens because some package depends on \"node-gyp\" to build itself, but didn't list it in their dependencies. To fix that, please run \"yarn add node-gyp\" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new nt(`Couldn't find a script name \"${this.scriptName}\" in the top-level (used by ${G.prettyLocator(r,n)}).`);{if(this.scriptName===\"global\")throw new nt(\"The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead\");let h=[this.scriptName].concat(this.args);for(let[E,C]of $I)for(let S of C)if(h.length>=S.length&&JSON.stringify(h.slice(0,S.length))===JSON.stringify(S))throw new nt(`Couldn't find a script named \"${this.scriptName}\", but a matching command can be found in the ${E} plugin. You can install it with \"yarn plugin import ${E}\".`);throw new nt(`Couldn't find a script named \"${this.scriptName}\".`)}}};Ge();Ge();Yt();var OC=class extends ft{constructor(){super(...arguments);this.descriptor=ge.String();this.resolution=ge.String()}static{this.paths=[[\"set\",\"resolution\"]]}static{this.usage=ot.Usage({description:\"enforce a package resolution\",details:'\\n      This command updates the resolution table so that `descriptor` is resolved by `resolution`.\\n\\n      Note that by default this command only affect the current resolution table - meaning that this \"manual override\" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, edit the `resolutions` field in your top-level manifest.\\n\\n      Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\\n    ',examples:[[\"Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0\",\"$0 set resolution lodash@npm:^1.2.3 npm:1.5.0\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);if(await s.restoreInstallState({restoreResolutions:!1}),!a)throw new ar(s.cwd,this.context.cwd);let c=G.parseDescriptor(this.descriptor,!0),f=G.makeDescriptor(c,this.resolution);return s.storedDescriptors.set(c.descriptorHash,c),s.storedDescriptors.set(f.descriptorHash,f),s.resolutionAliases.set(c.descriptorHash,f.descriptorHash),await s.installWithNewReport({stdout:this.context.stdout},{cache:n})}};Ge();Dt();Yt();var Dye=ut(Go()),LC=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Unlink all workspaces belonging to the target project from the current one\"});this.leadingArguments=ge.Rest()}static{this.paths=[[\"unlink\"]]}static{this.usage=ot.Usage({description:\"disconnect the local project from another one\",details:`\n      This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments.\n    `,examples:[[\"Unregister a remote workspace in the current project\",\"$0 unlink ~/ts-loader\"],[\"Unregister all workspaces from a remote project in the current project\",\"$0 unlink ~/jest --all\"],[\"Unregister all previously linked workspaces\",\"$0 unlink --all\"],[\"Unregister all workspaces matching a glob\",\"$0 unlink '@babel/*' 'pkg-{a,b}'\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);let c=s.topLevelWorkspace,f=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:p,reference:h}of c.manifest.resolutions)h.startsWith(\"portal:\")&&f.add(p.descriptor.fullName);if(this.leadingArguments.length>0)for(let p of this.leadingArguments){let h=J.resolve(this.context.cwd,fe.toPortablePath(p));if(je.isPathLike(p)){let E=await ze.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:C,workspace:S}=await Tt.find(E,h);if(!S)throw new ar(C.cwd,h);if(this.all){for(let P of C.workspaces)P.manifest.name&&f.add(G.stringifyIdent(P.anchoredLocator));if(f.size===0)throw new nt(\"No workspace found to be unlinked in the target project\")}else{if(!S.manifest.name)throw new nt(\"The target workspace doesn't have a name and thus cannot be unlinked\");f.add(G.stringifyIdent(S.anchoredLocator))}}else{let E=[...c.manifest.resolutions.map(({pattern:C})=>C.descriptor.fullName)];for(let C of(0,Dye.default)(E,p))f.add(C)}}return c.manifest.resolutions=c.manifest.resolutions.filter(({pattern:p})=>!f.has(p.descriptor.fullName)),await s.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Ge();Ge();Ge();Yt();var bye=ut(Vv()),nq=ut(Go());Ul();var MC=class extends ft{constructor(){super(...arguments);this.interactive=ge.Boolean(\"-i,--interactive\",{description:\"Offer various choices, depending on the detected upgrade paths\"});this.fixed=ge.Boolean(\"-F,--fixed\",!1,{description:\"Store dependency tags as-is instead of resolving them\"});this.exact=ge.Boolean(\"-E,--exact\",!1,{description:\"Don't use any semver modifier on the resolved range\"});this.tilde=ge.Boolean(\"-T,--tilde\",!1,{description:\"Use the `~` semver modifier on the resolved range\"});this.caret=ge.Boolean(\"-C,--caret\",!1,{description:\"Use the `^` semver modifier on the resolved range\"});this.recursive=ge.Boolean(\"-R,--recursive\",!1,{description:\"Resolve again ALL resolutions for those packages\"});this.mode=ge.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:fo($l)});this.patterns=ge.Rest()}static{this.paths=[[\"up\"]]}static{this.usage=ot.Usage({description:\"upgrade dependencies across the project\",details:\"\\n      This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\\n\\n      If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\\n\\n      If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\\n\\n      The, `-C,--caret`, `-E,--exact` and  `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n\\n      Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\\n\\n      This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\\n\\n      **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\\n    \",examples:[[\"Upgrade all instances of lodash to the latest release\",\"$0 up lodash\"],[\"Upgrade all instances of lodash to the latest release, but ask confirmation for each\",\"$0 up lodash -i\"],[\"Upgrade all instances of lodash to 1.2.3\",\"$0 up lodash@1.2.3\"],[\"Upgrade all instances of packages with the `@babel` scope to the latest release\",\"$0 up '@babel/*'\"],[\"Upgrade all instances of packages containing the word `jest` to the latest release\",\"$0 up '*jest*'\"],[\"Upgrade all instances of packages with the `@babel` scope to 7.0.0\",\"$0 up '@babel/*@7.0.0'\"]]})}static{this.schema=[tB(\"recursive\",qf.Forbids,[\"interactive\",\"exact\",\"tilde\",\"caret\"],{ignore:[void 0,!1]})]}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=[...s.storedDescriptors.values()],f=c.map(E=>G.stringifyIdent(E)),p=new Set;for(let E of this.patterns){if(G.parseDescriptor(E).range!==\"unknown\")throw new nt(\"Ranges aren't allowed when using --recursive\");for(let C of(0,nq.default)(f,E)){let S=G.parseIdent(C);p.add(S.identHash)}}let h=c.filter(E=>p.has(E.identHash));for(let E of h)s.storedDescriptors.delete(E.descriptorHash),s.storedResolutions.delete(E.descriptorHash);return await s.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}async executeUpClassic(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=this.fixed,f=r.isInteractive({interactive:this.interactive,stdout:this.context.stdout}),p=Kv(this,s),h=f?[\"keep\",\"reuse\",\"project\",\"latest\"]:[\"project\",\"latest\"],E=[],C=[];for(let N of this.patterns){let U=!1,W=G.parseDescriptor(N),ee=G.stringifyIdent(W);for(let ie of s.workspaces)for(let ue of[\"dependencies\",\"devDependencies\"]){let me=[...ie.manifest.getForScope(ue).values()].map(Be=>G.stringifyIdent(Be)),pe=ee===\"*\"?me:(0,nq.default)(me,ee);for(let Be of pe){let Ce=G.parseIdent(Be),g=ie.manifest[ue].get(Ce.identHash);if(typeof g>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");let we=G.makeDescriptor(Ce,W.range);E.push(Promise.resolve().then(async()=>[ie,ue,g,await zv(we,{project:s,workspace:ie,cache:n,target:ue,fixed:c,modifier:p,strategies:h})])),U=!0}}U||C.push(N)}if(C.length>1)throw new nt(`Patterns ${he.prettyList(r,C,he.Type.CODE)} don't match any packages referenced by any workspace`);if(C.length>0)throw new nt(`Pattern ${he.prettyList(r,C,he.Type.CODE)} doesn't match any packages referenced by any workspace`);let S=await Promise.all(E),P=await lA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async N=>{for(let[,,U,{suggestions:W,rejections:ee}]of S){let ie=W.filter(ue=>ue.descriptor!==null);if(ie.length===0){let[ue]=ee;if(typeof ue>\"u\")throw new Error(\"Assertion failed: Expected an error to have been set\");let le=this.cli.error(ue);s.configuration.get(\"enableNetwork\")?N.reportError(27,`${G.prettyDescriptor(r,U)} can't be resolved to a satisfying range\n\n${le}`):N.reportError(27,`${G.prettyDescriptor(r,U)} can't be resolved to a satisfying range (note: network resolution has been disabled)\n\n${le}`)}else ie.length>1&&!f&&N.reportError(27,`${G.prettyDescriptor(r,U)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(P.hasErrors())return P.exitCode();let I=!1,R=[];for(let[N,U,,{suggestions:W}]of S){let ee,ie=W.filter(pe=>pe.descriptor!==null),ue=ie[0].descriptor,le=ie.every(pe=>G.areDescriptorsEqual(pe.descriptor,ue));ie.length===1||le?ee=ue:(I=!0,{answer:ee}=await(0,bye.prompt)({type:\"select\",name:\"answer\",message:`Which range do you want to use in ${G.prettyWorkspace(r,N)} \\u276F ${U}?`,choices:W.map(({descriptor:pe,name:Be,reason:Ce})=>pe?{name:Be,hint:Ce,descriptor:pe}:{name:Be,hint:Ce,disabled:!0}),onCancel:()=>process.exit(130),result(pe){return this.find(pe,\"descriptor\")},stdin:this.context.stdin,stdout:this.context.stdout}));let me=N.manifest[U].get(ee.identHash);if(typeof me>\"u\")throw new Error(\"Assertion failed: This descriptor should have a matching entry\");if(me.descriptorHash!==ee.descriptorHash)N.manifest[U].set(ee.identHash,ee),R.push([N,U,me,ee]);else{let pe=r.makeResolver(),Be={project:s,resolver:pe},Ce=r.normalizeDependency(me),g=pe.bindDescriptor(Ce,N.anchoredLocator,Be);s.forgetResolution(g)}}return await r.triggerMultipleHooks(N=>N.afterWorkspaceDependencyReplacement,R),I&&this.context.stdout.write(`\n`),await s.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}};Ge();Ge();Ge();Yt();var UC=class extends ft{constructor(){super(...arguments);this.recursive=ge.Boolean(\"-R,--recursive\",!1,{description:\"List, for each workspace, what are all the paths that lead to the dependency\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.peers=ge.Boolean(\"--peers\",!1,{description:\"Also print the peer dependencies that match the specified name\"});this.package=ge.String()}static{this.paths=[[\"why\"]]}static{this.usage=ot.Usage({description:\"display the reason why a package is needed\",details:`\n      This command prints the exact reasons why a package appears in the dependency tree.\n\n      If \\`-R,--recursive\\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named \"Foo\" when looking for \"Bar\", it means that \"Foo\" already got printed higher in the tree.\n    `,examples:[[\"Explain why lodash is used in your project\",\"$0 why lodash\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let n=G.parseIdent(this.package).identHash,c=this.recursive?cct(s,n,{configuration:r,peers:this.peers}):lct(s,n,{configuration:r,peers:this.peers});xs.emitTree(c,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1})}};function lct(t,e,{configuration:r,peers:s}){let a=je.sortMap(t.storedPackages.values(),f=>G.stringifyLocator(f)),n={},c={children:n};for(let f of a){let p={};for(let E of f.dependencies.values()){if(!s&&f.peerDependencies.has(E.identHash))continue;let C=t.storedResolutions.get(E.descriptorHash);if(!C)throw new Error(\"Assertion failed: The resolution should have been registered\");let S=t.storedPackages.get(C);if(!S)throw new Error(\"Assertion failed: The package should have been registered\");if(S.identHash!==e)continue;{let I=G.stringifyLocator(f);n[I]={value:[f,he.Type.LOCATOR],children:p}}let P=G.stringifyLocator(S);p[P]={value:[{descriptor:E,locator:S},he.Type.DEPENDENT]}}}return c}function cct(t,e,{configuration:r,peers:s}){let a=je.sortMap(t.workspaces,S=>G.stringifyLocator(S.anchoredLocator)),n=new Set,c=new Set,f=S=>{if(n.has(S.locatorHash))return c.has(S.locatorHash);if(n.add(S.locatorHash),S.identHash===e)return c.add(S.locatorHash),!0;let P=!1;S.identHash===e&&(P=!0);for(let I of S.dependencies.values()){if(!s&&S.peerDependencies.has(I.identHash))continue;let R=t.storedResolutions.get(I.descriptorHash);if(!R)throw new Error(\"Assertion failed: The resolution should have been registered\");let N=t.storedPackages.get(R);if(!N)throw new Error(\"Assertion failed: The package should have been registered\");f(N)&&(P=!0)}return P&&c.add(S.locatorHash),P};for(let S of a)f(S.anchoredPackage);let p=new Set,h={},E={children:h},C=(S,P,I)=>{if(!c.has(S.locatorHash))return;let R=I!==null?he.tuple(he.Type.DEPENDENT,{locator:S,descriptor:I}):he.tuple(he.Type.LOCATOR,S),N={},U={value:R,children:N},W=G.stringifyLocator(S);if(P[W]=U,!(I!==null&&t.tryWorkspaceByLocator(S))&&!p.has(S.locatorHash)){p.add(S.locatorHash);for(let ee of S.dependencies.values()){if(!s&&S.peerDependencies.has(ee.identHash))continue;let ie=t.storedResolutions.get(ee.descriptorHash);if(!ie)throw new Error(\"Assertion failed: The resolution should have been registered\");let ue=t.storedPackages.get(ie);if(!ue)throw new Error(\"Assertion failed: The package should have been registered\");C(ue,N,ee)}}};for(let S of a)C(S.anchoredPackage,h,null);return E}Ge();var pq={};Vt(pq,{GitFetcher:()=>tS,GitResolver:()=>rS,default:()=>kct,gitUtils:()=>ka});Ge();Dt();var ka={};Vt(ka,{TreeishProtocols:()=>eS,clone:()=>Aq,fetchBase:()=>Jye,fetchChangedFiles:()=>Kye,fetchChangedWorkspaces:()=>Pct,fetchRoot:()=>Vye,isGitUrl:()=>jC,lsRemote:()=>Yye,normalizeLocator:()=>bct,normalizeRepoUrl:()=>_C,resolveUrl:()=>fq,splitRepoUrl:()=>W0,validateRepoUrl:()=>uq});Ge();Dt();Yt();ql();var qye=ut(Hye()),HC=ut(Ie(\"querystring\")),lq=ut(Ai());function aq(t,e,r){let s=t.indexOf(r);return t.lastIndexOf(e,s>-1?s:1/0)}function jye(t){try{return new URL(t)}catch{return}}function Sct(t){let e=aq(t,\"@\",\"#\"),r=aq(t,\":\",\"#\");return r>e&&(t=`${t.slice(0,r)}/${t.slice(r+1)}`),aq(t,\":\",\"#\")===-1&&t.indexOf(\"//\")===-1&&(t=`ssh://${t}`),t}function Gye(t){return jye(t)||jye(Sct(t))}function _C(t,{git:e=!1}={}){if(t=t.replace(/^git\\+https:/,\"https:\"),t=t.replace(/^(?:github:|https:\\/\\/github\\.com\\/|git:\\/\\/github\\.com\\/)?(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\\.git)?(#.*)?$/,\"https://github.com/$1/$2.git$3\"),t=t.replace(/^https:\\/\\/github\\.com\\/(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\\/tarball\\/(.+)?$/,\"https://github.com/$1/$2.git#$3\"),e){let r=Gye(t);r&&(t=r.href),t=t.replace(/^git\\+([^:]+):/,\"$1:\")}return t}function Wye(){return{...process.env,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||\"ssh\"} -o BatchMode=yes`}}var Dct=[/^ssh:/,/^git(?:\\+[^:]+)?:/,/^(?:git\\+)?https?:[^#]+\\/[^#]+(?:\\.git)(?:#.*)?$/,/^git@[^#]+\\/[^#]+\\.git(?:#.*)?$/,/^(?:github:|https:\\/\\/github\\.com\\/)?(?!\\.{1,2}\\/)([a-zA-Z._0-9-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\\.git)?(?:#.*)?$/,/^https:\\/\\/github\\.com\\/(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\\/tarball\\/(.+)?$/],eS=(a=>(a.Commit=\"commit\",a.Head=\"head\",a.Tag=\"tag\",a.Semver=\"semver\",a))(eS||{});function jC(t){return t?Dct.some(e=>!!t.match(e)):!1}function W0(t){t=_C(t);let e=t.indexOf(\"#\");if(e===-1)return{repo:t,treeish:{protocol:\"head\",request:\"HEAD\"},extra:{}};let r=t.slice(0,e),s=t.slice(e+1);if(s.match(/^[a-z]+=/)){let a=HC.default.parse(s);for(let[p,h]of Object.entries(a))if(typeof h!=\"string\")throw new Error(`Assertion failed: The ${p} parameter must be a literal string`);let n=Object.values(eS).find(p=>Object.hasOwn(a,p)),[c,f]=typeof n<\"u\"?[n,a[n]]:[\"head\",\"HEAD\"];for(let p of Object.values(eS))delete a[p];return{repo:r,treeish:{protocol:c,request:f},extra:a}}else{let a=s.indexOf(\":\"),[n,c]=a===-1?[null,s]:[s.slice(0,a),s.slice(a+1)];return{repo:r,treeish:{protocol:n,request:c},extra:{}}}}function bct(t){return G.makeLocator(t,_C(t.reference))}function uq(t,{configuration:e}){let r=_C(t,{git:!0});if(!nn.getNetworkSettings(`https://${(0,qye.default)(r).resource}`,{configuration:e}).enableNetwork)throw new jt(80,`Request to '${r}' has been blocked because of your configuration settings`);return r}async function Yye(t,e){let r=uq(t,{configuration:e}),s=await cq(\"listing refs\",[\"ls-remote\",r],{cwd:e.startingCwd,env:Wye()},{configuration:e,normalizedRepoUrl:r}),a=new Map,n=/^([a-f0-9]{40})\\t([^\\n]+)/gm,c;for(;(c=n.exec(s.stdout))!==null;)a.set(c[2],c[1]);return a}async function fq(t,e){let{repo:r,treeish:{protocol:s,request:a},extra:n}=W0(t),c=await Yye(r,e),f=(h,E)=>{switch(h){case\"commit\":{if(!E.match(/^[a-f0-9]{40}$/))throw new Error(\"Invalid commit hash\");return HC.default.stringify({...n,commit:E})}case\"head\":{let C=c.get(E===\"HEAD\"?E:`refs/heads/${E}`);if(typeof C>\"u\")throw new Error(`Unknown head (\"${E}\")`);return HC.default.stringify({...n,commit:C})}case\"tag\":{let C=c.get(`refs/tags/${E}`);if(typeof C>\"u\")throw new Error(`Unknown tag (\"${E}\")`);return HC.default.stringify({...n,commit:C})}case\"semver\":{let C=Fr.validRange(E);if(!C)throw new Error(`Invalid range (\"${E}\")`);let S=new Map([...c.entries()].filter(([I])=>I.startsWith(\"refs/tags/\")).map(([I,R])=>[lq.default.parse(I.slice(10)),R]).filter(I=>I[0]!==null)),P=lq.default.maxSatisfying([...S.keys()],C);if(P===null)throw new Error(`No matching range (\"${E}\")`);return HC.default.stringify({...n,commit:S.get(P)})}case null:{let C;if((C=p(\"commit\",E))!==null||(C=p(\"tag\",E))!==null||(C=p(\"head\",E))!==null)return C;throw E.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve \"${E}\" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve \"${E}\" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol (\"${h}\")`)}},p=(h,E)=>{try{return f(h,E)}catch{return null}};return _C(`${r}#${f(s,a)}`)}async function Aq(t,e){return await e.getLimit(\"cloneConcurrency\")(async()=>{let{repo:r,treeish:{protocol:s,request:a}}=W0(t);if(s!==\"commit\")throw new Error(\"Invalid treeish protocol when cloning\");let n=uq(r,{configuration:e}),c=await ce.mktempPromise(),f={cwd:c,env:Wye()};return await cq(\"cloning the repository\",[\"clone\",\"-c\",\"core.autocrlf=false\",n,fe.fromPortablePath(c)],f,{configuration:e,normalizedRepoUrl:n}),await cq(\"switching branch\",[\"checkout\",`${a}`],f,{configuration:e,normalizedRepoUrl:n}),c})}async function Vye(t){let e,r=t;do{if(e=r,await ce.existsPromise(J.join(e,\".git\")))return e;r=J.dirname(e)}while(r!==e);return null}async function Jye(t,{baseRefs:e}){if(e.length===0)throw new nt(\"Can't run this command with zero base refs specified.\");let r=[];for(let f of e){let{code:p}=await qr.execvp(\"git\",[\"merge-base\",f,\"HEAD\"],{cwd:t});p===0&&r.push(f)}if(r.length===0)throw new nt(`No ancestor could be found between any of HEAD and ${e.join(\", \")}`);let{stdout:s}=await qr.execvp(\"git\",[\"merge-base\",\"HEAD\",...r],{cwd:t,strict:!0}),a=s.trim(),{stdout:n}=await qr.execvp(\"git\",[\"show\",\"--quiet\",\"--pretty=format:%s\",a],{cwd:t,strict:!0}),c=n.trim();return{hash:a,title:c}}async function Kye(t,{base:e,project:r}){let s=je.buildIgnorePattern(r.configuration.get(\"changesetIgnorePatterns\")),{stdout:a}=await qr.execvp(\"git\",[\"diff\",\"--name-only\",`${e}`],{cwd:t,strict:!0}),n=a.split(/\\r\\n|\\r|\\n/).filter(h=>h.length>0).map(h=>J.resolve(t,fe.toPortablePath(h))),{stdout:c}=await qr.execvp(\"git\",[\"ls-files\",\"--others\",\"--exclude-standard\"],{cwd:t,strict:!0}),f=c.split(/\\r\\n|\\r|\\n/).filter(h=>h.length>0).map(h=>J.resolve(t,fe.toPortablePath(h))),p=[...new Set([...n,...f].sort())];return s?p.filter(h=>!J.relative(r.cwd,h).match(s)):p}async function Pct({ref:t,project:e}){if(e.configuration.projectCwd===null)throw new nt(\"This command can only be run from within a Yarn project\");let r=[J.resolve(e.cwd,Er.lockfile),J.resolve(e.cwd,e.configuration.get(\"cacheFolder\")),J.resolve(e.cwd,e.configuration.get(\"installStatePath\")),J.resolve(e.cwd,e.configuration.get(\"virtualFolder\"))];await e.configuration.triggerHook(c=>c.populateYarnPaths,e,c=>{c!=null&&r.push(c)});let s=await Vye(e.configuration.projectCwd);if(s==null)throw new nt(\"This command can only be run on Git repositories\");let a=await Jye(s,{baseRefs:typeof t==\"string\"?[t]:e.configuration.get(\"changesetBaseRefs\")}),n=await Kye(s,{base:a.hash,project:e});return new Set(je.mapAndFilter(n,c=>{let f=e.tryWorkspaceByFilePath(c);return f===null?je.mapAndFilter.skip:r.some(p=>c.startsWith(p))?je.mapAndFilter.skip:f}))}async function cq(t,e,r,{configuration:s,normalizedRepoUrl:a}){try{return await qr.execvp(\"git\",e,{...r,strict:!0})}catch(n){if(!(n instanceof qr.ExecError))throw n;let c=n.reportExtra,f=n.stderr.toString();throw new jt(1,`Failed ${t}`,p=>{p.reportError(1,`  ${he.prettyField(s,{label:\"Repository URL\",value:he.tuple(he.Type.URL,a)})}`);for(let h of f.matchAll(/^(.+?): (.*)$/gm)){let[,E,C]=h;E=E.toLowerCase();let S=E===\"error\"?\"Error\":`${bB(E)} Error`;p.reportError(1,`  ${he.prettyField(s,{label:S,value:he.tuple(he.Type.NO_HINT,C)})}`)}c?.(p)})}}var tS=class{supports(e,r){return jC(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,a=new Map(r.checksums);a.set(e.locatorHash,s);let n={...r,checksums:a},c=await this.downloadHosted(e,n);if(c!==null)return c;let[f,p,h]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(e,n),...r.cacheOptions});return{packageFs:f,releaseFs:p,prefixPath:G.getIdentVendorPath(e),checksum:h}}async downloadHosted(e,r){return r.project.configuration.reduceHook(s=>s.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let s=W0(e.reference),a=await Aq(e.reference,r.project.configuration),n=J.resolve(a,s.extra.cwd??vt.dot),c=J.join(n,\"package.tgz\");await In.prepareExternalProject(n,c,{configuration:r.project.configuration,report:r.report,workspace:s.extra.workspace,locator:e});let f=await ce.readFilePromise(c);return await je.releaseAfterUseAsync(async()=>await ps.convertToZip(f,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1}))}};Ge();Ge();var rS=class{supportsDescriptor(e,r){return jC(e.range)}supportsLocator(e,r){return jC(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){let a=await fq(e.range,s.project.configuration);return[G.makeLocator(e,a)]}async getSatisfying(e,r,s,a){let n=W0(e.range);return{locators:s.filter(f=>{if(f.identHash!==e.identHash)return!1;let p=W0(f.reference);return!(n.repo!==p.repo||n.treeish.protocol===\"commit\"&&n.treeish.request!==p.treeish.request)}),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let s=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Ut.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...e,version:a.version||\"0.0.0\",languageName:a.languageName||r.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var xct={configuration:{changesetBaseRefs:{description:\"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.\",type:\"STRING\",isArray:!0,isNullable:!1,default:[\"master\",\"origin/master\",\"upstream/master\",\"main\",\"origin/main\",\"upstream/main\"]},changesetIgnorePatterns:{description:\"Array of glob patterns; files matching them will be ignored when fetching the changed files\",type:\"STRING\",default:[],isArray:!0},cloneConcurrency:{description:\"Maximal number of concurrent clones\",type:\"NUMBER\",default:2}},fetchers:[tS],resolvers:[rS]};var kct=xct;Yt();var GC=class extends ft{constructor(){super(...arguments);this.since=ge.String(\"--since\",{description:\"Only include workspaces that have been changed since the specified ref.\",tolerateBoolean:!0});this.recursive=ge.Boolean(\"-R,--recursive\",!1,{description:\"Find packages via dependencies/devDependencies instead of using the workspaces field\"});this.noPrivate=ge.Boolean(\"--no-private\",{description:\"Exclude workspaces that have the private field set to true\"});this.verbose=ge.Boolean(\"-v,--verbose\",!1,{description:\"Also return the cross-dependencies between workspaces\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"workspaces\",\"list\"]]}static{this.usage=ot.Usage({category:\"Workspace-related commands\",description:\"list all available workspaces\",details:\"\\n      This command will print the list of all workspaces in the project.\\n\\n      - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\\n\\n      - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\\n\\n      - If `--no-private` is set, Yarn will not list any workspaces that have the `private` field set to `true`.\\n\\n      - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\\n    \"})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd);return(await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{let c=this.since?await ka.fetchChangedWorkspaces({ref:this.since,project:s}):s.workspaces,f=new Set(c);if(this.recursive)for(let p of[...c].map(h=>h.getRecursiveWorkspaceDependents()))for(let h of p)f.add(h);for(let p of f){let{manifest:h}=p;if(h.private&&this.noPrivate)continue;let E;if(this.verbose){let C=new Set,S=new Set;for(let P of Ut.hardDependencies)for(let[I,R]of h.getForScope(P)){let N=s.tryWorkspaceByDescriptor(R);N===null?s.workspacesByIdent.has(I)&&S.add(R):C.add(N)}E={workspaceDependencies:Array.from(C).map(P=>P.relativeCwd),mismatchedWorkspaceDependencies:Array.from(S).map(P=>G.stringifyDescriptor(P))}}n.reportInfo(null,`${p.relativeCwd}`),n.reportJson({location:p.relativeCwd,name:h.name?G.stringifyIdent(h.name):null,...E})}})).exitCode()}};Ge();Ge();Yt();var qC=class extends ft{constructor(){super(...arguments);this.workspaceName=ge.String();this.commandName=ge.String();this.args=ge.Proxy()}static{this.paths=[[\"workspace\"]]}static{this.usage=ot.Usage({category:\"Workspace-related commands\",description:\"run a command within the specified workspace\",details:`\n      This command will run a given sub-command on a single workspace.\n    `,examples:[[\"Add a package to a single workspace\",\"yarn workspace components add -D react\"],[\"Run build script on a single workspace\",\"yarn workspace components run build\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);let n=s.workspaces,c=new Map(n.map(p=>[G.stringifyIdent(p.anchoredLocator),p])),f=c.get(this.workspaceName);if(f===void 0){let p=Array.from(c.keys()).sort();throw new nt(`Workspace '${this.workspaceName}' not found. Did you mean any of the following:\n  - ${p.join(`\n  - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:f.cwd})}};var Qct={configuration:{enableImmutableInstalls:{description:\"If true (the default on CI), prevents the install command from modifying the lockfile\",type:\"BOOLEAN\",default:zye.isCI},defaultSemverRangePrefix:{description:\"The default save prefix: '^', '~' or ''\",type:\"STRING\",values:[\"^\",\"~\",\"\"],default:\"^\"},preferReuse:{description:\"If true, `yarn add` will attempt to reuse the most common dependency range in other workspaces.\",type:\"BOOLEAN\",default:!1}},commands:[aC,lC,cC,uC,OC,bC,EC,GC,pC,hC,gC,dC,sC,oC,fC,AC,mC,yC,IC,CC,wC,BC,LC,vC,SC,xC,PC,kC,DC,QC,TC,RC,FC,NC,MC,UC,qC]},Tct=Qct;var yq={};Vt(yq,{default:()=>Oct});Ge();Ge();var gq=\"catalog:\";var dq=t=>t.startsWith(gq),Rct=t=>t.range.slice(gq.length)||null,Xye=t=>t===null?\"default catalog\":`catalog \"${t}\"`,Fct=t=>t.scope?`@${t.scope}/${t.name}`:t.name,mq=(t,e,r,s)=>{let a=Rct(e),n;if(a===null)n=t.configuration.get(\"catalog\");else try{let E=t.configuration.get(\"catalogs\");E&&(n=E.get(a))}catch{n=void 0}if(!n||n.size===0)throw new jt(82,`${G.prettyDescriptor(t.configuration,e)}: ${Xye(a)} not found or empty`);let c=Fct(e),f=n.get(c);if(!f)throw new jt(82,`${G.prettyDescriptor(t.configuration,e)}: entry not found in ${Xye(a)}`);let p=t.configuration.normalizeDependency(G.makeDescriptor(e,f));return r.supportsDescriptor(p,s)?r.bindDescriptor(p,t.topLevelWorkspace.anchoredLocator,s):p};var Nct={configuration:{catalog:{description:\"The default catalog of packages\",type:\"MAP\",valueDefinition:{description:\"The catalog of packages\",type:\"STRING\"}},catalogs:{description:\"Named catalogs of packages\",type:\"MAP\",valueDefinition:{description:\"A named catalog\",type:\"MAP\",valueDefinition:{description:\"Package version in the catalog\",type:\"STRING\"}}}},hooks:{beforeWorkspacePacking:(t,e)=>{let r=t.project,s=r.configuration.makeResolver(),a={project:r,resolver:s,report:new ki};for(let n of Ut.allDependencies){let c=e[n];if(c)for(let[f,p]of Object.entries(c)){if(typeof p!=\"string\"||!dq(p))continue;let h=G.parseIdent(f),E=G.makeDescriptor(h,p),C=mq(r,E,s,a),{protocol:S,source:P,params:I,selector:R}=G.parseRange(G.convertToManifestRange(C.range));S===t.project.configuration.get(\"defaultProtocol\")&&(S=null),c[f]=G.makeRange({protocol:S,source:P,params:I,selector:R})}}},reduceDependency:async(t,e,r,s,{resolver:a,resolveOptions:n})=>dq(t.range)?mq(e,t,a,n):t}},Oct=Nct;var Bq={};Vt(Bq,{default:()=>Mct});Ge();var Qt={optional:!0},Eq=[[\"@tailwindcss/aspect-ratio@<0.2.1\",{peerDependencies:{tailwindcss:\"^2.0.2\"}}],[\"@tailwindcss/line-clamp@<0.2.1\",{peerDependencies:{tailwindcss:\"^2.0.2\"}}],[\"@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0\",{peerDependencies:{postcss:\"^8.0.0\"}}],[\"@samverschueren/stream-to-observable@<0.3.1\",{peerDependenciesMeta:{rxjs:Qt,zenObservable:Qt}}],[\"any-observable@<0.5.1\",{peerDependenciesMeta:{rxjs:Qt,zenObservable:Qt}}],[\"@pm2/agent@<1.0.4\",{dependencies:{debug:\"*\"}}],[\"debug@<4.2.0\",{peerDependenciesMeta:{\"supports-color\":Qt}}],[\"got@<11\",{dependencies:{\"@types/responselike\":\"^1.0.0\",\"@types/keyv\":\"^3.1.1\"}}],[\"cacheable-lookup@<4.1.2\",{dependencies:{\"@types/keyv\":\"^3.1.1\"}}],[\"http-link-dataloader@*\",{peerDependencies:{graphql:\"^0.13.1 || ^14.0.0\"}}],[\"typescript-language-server@*\",{dependencies:{\"vscode-jsonrpc\":\"^5.0.1\",\"vscode-languageserver-protocol\":\"^3.15.0\"}}],[\"postcss-syntax@*\",{peerDependenciesMeta:{\"postcss-html\":Qt,\"postcss-jsx\":Qt,\"postcss-less\":Qt,\"postcss-markdown\":Qt,\"postcss-scss\":Qt}}],[\"jss-plugin-rule-value-function@<=10.1.1\",{dependencies:{\"tiny-warning\":\"^1.0.2\"}}],[\"ink-select-input@<4.1.0\",{peerDependencies:{react:\"^16.8.2\"}}],[\"license-webpack-plugin@<2.3.18\",{peerDependenciesMeta:{webpack:Qt}}],[\"snowpack@>=3.3.0\",{dependencies:{\"node-gyp\":\"^7.1.0\"}}],[\"promise-inflight@*\",{peerDependenciesMeta:{bluebird:Qt}}],[\"reactcss@*\",{peerDependencies:{react:\"*\"}}],[\"react-color@<=2.19.0\",{peerDependencies:{react:\"*\"}}],[\"gatsby-plugin-i18n@*\",{dependencies:{ramda:\"^0.24.1\"}}],[\"useragent@^2.0.0\",{dependencies:{request:\"^2.88.0\",yamlparser:\"0.0.x\",semver:\"5.5.x\"}}],[\"@apollographql/apollo-tools@<=0.5.2\",{peerDependencies:{graphql:\"^14.2.1 || ^15.0.0\"}}],[\"material-table@^2.0.0\",{dependencies:{\"@babel/runtime\":\"^7.11.2\"}}],[\"@babel/parser@*\",{dependencies:{\"@babel/types\":\"^7.8.3\"}}],[\"fork-ts-checker-webpack-plugin@<=6.3.4\",{peerDependencies:{eslint:\">= 6\",typescript:\">= 2.7\",webpack:\">= 4\",\"vue-template-compiler\":\"*\"},peerDependenciesMeta:{eslint:Qt,\"vue-template-compiler\":Qt}}],[\"rc-animate@<=3.1.1\",{peerDependencies:{react:\">=16.9.0\",\"react-dom\":\">=16.9.0\"}}],[\"react-bootstrap-table2-paginator@*\",{dependencies:{classnames:\"^2.2.6\"}}],[\"react-draggable@<=4.4.3\",{peerDependencies:{react:\">= 16.3.0\",\"react-dom\":\">= 16.3.0\"}}],[\"apollo-upload-client@<14\",{peerDependencies:{graphql:\"14 - 15\"}}],[\"react-instantsearch-core@<=6.7.0\",{peerDependencies:{algoliasearch:\">= 3.1 < 5\"}}],[\"react-instantsearch-dom@<=6.7.0\",{dependencies:{\"react-fast-compare\":\"^3.0.0\"}}],[\"ws@<7.2.1\",{peerDependencies:{bufferutil:\"^4.0.1\",\"utf-8-validate\":\"^5.0.2\"},peerDependenciesMeta:{bufferutil:Qt,\"utf-8-validate\":Qt}}],[\"react-portal@<4.2.2\",{peerDependencies:{\"react-dom\":\"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0\"}}],[\"react-scripts@<=4.0.1\",{peerDependencies:{react:\"*\"}}],[\"testcafe@<=1.10.1\",{dependencies:{\"@babel/plugin-transform-for-of\":\"^7.12.1\",\"@babel/runtime\":\"^7.12.5\"}}],[\"testcafe-legacy-api@<=4.2.0\",{dependencies:{\"testcafe-hammerhead\":\"^17.0.1\",\"read-file-relative\":\"^1.2.0\"}}],[\"@google-cloud/firestore@<=4.9.3\",{dependencies:{protobufjs:\"^6.8.6\"}}],[\"gatsby-source-apiserver@*\",{dependencies:{\"babel-polyfill\":\"^6.26.0\"}}],[\"@webpack-cli/package-utils@<=1.0.1-alpha.4\",{dependencies:{\"cross-spawn\":\"^7.0.3\"}}],[\"gatsby-remark-prismjs@<3.3.28\",{dependencies:{lodash:\"^4\"}}],[\"gatsby-plugin-favicon@*\",{peerDependencies:{webpack:\"*\"}}],[\"gatsby-plugin-sharp@<=4.6.0-next.3\",{dependencies:{debug:\"^4.3.1\"}}],[\"gatsby-react-router-scroll@<=5.6.0-next.0\",{dependencies:{\"prop-types\":\"^15.7.2\"}}],[\"@rebass/forms@*\",{dependencies:{\"@styled-system/should-forward-prop\":\"^5.0.0\"},peerDependencies:{react:\"^16.8.6\"}}],[\"rebass@*\",{peerDependencies:{react:\"^16.8.6\"}}],[\"@ant-design/react-slick@<=0.28.3\",{peerDependencies:{react:\">=16.0.0\"}}],[\"mqtt@<4.2.7\",{dependencies:{duplexify:\"^4.1.1\"}}],[\"vue-cli-plugin-vuetify@<=2.0.3\",{dependencies:{semver:\"^6.3.0\"},peerDependenciesMeta:{\"sass-loader\":Qt,\"vuetify-loader\":Qt}}],[\"vue-cli-plugin-vuetify@<=2.0.4\",{dependencies:{\"null-loader\":\"^3.0.0\"}}],[\"vue-cli-plugin-vuetify@>=2.4.3\",{peerDependencies:{vue:\"*\"}}],[\"@vuetify/cli-plugin-utils@<=0.0.4\",{dependencies:{semver:\"^6.3.0\"},peerDependenciesMeta:{\"sass-loader\":Qt}}],[\"@vue/cli-plugin-typescript@<=5.0.0-alpha.0\",{dependencies:{\"babel-loader\":\"^8.1.0\"}}],[\"@vue/cli-plugin-typescript@<=5.0.0-beta.0\",{dependencies:{\"@babel/core\":\"^7.12.16\"},peerDependencies:{\"vue-template-compiler\":\"^2.0.0\"},peerDependenciesMeta:{\"vue-template-compiler\":Qt}}],[\"cordova-ios@<=6.3.0\",{dependencies:{underscore:\"^1.9.2\"}}],[\"cordova-lib@<=10.0.1\",{dependencies:{underscore:\"^1.9.2\"}}],[\"git-node-fs@*\",{peerDependencies:{\"js-git\":\"^0.7.8\"},peerDependenciesMeta:{\"js-git\":Qt}}],[\"consolidate@<0.16.0\",{peerDependencies:{mustache:\"^3.0.0\"},peerDependenciesMeta:{mustache:Qt}}],[\"consolidate@<=0.16.0\",{peerDependencies:{velocityjs:\"^2.0.1\",tinyliquid:\"^0.2.34\",\"liquid-node\":\"^3.0.1\",jade:\"^1.11.0\",\"then-jade\":\"*\",dust:\"^0.3.0\",\"dustjs-helpers\":\"^1.7.4\",\"dustjs-linkedin\":\"^2.7.5\",swig:\"^1.4.2\",\"swig-templates\":\"^2.0.3\",\"razor-tmpl\":\"^1.3.1\",atpl:\">=0.7.6\",liquor:\"^0.0.5\",twig:\"^1.15.2\",ejs:\"^3.1.5\",eco:\"^1.1.0-rc-3\",jazz:\"^0.0.18\",jqtpl:\"~1.1.0\",hamljs:\"^0.6.2\",hamlet:\"^0.3.3\",whiskers:\"^0.4.0\",\"haml-coffee\":\"^1.14.1\",\"hogan.js\":\"^3.0.2\",templayed:\">=0.2.3\",handlebars:\"^4.7.6\",underscore:\"^1.11.0\",lodash:\"^4.17.20\",pug:\"^3.0.0\",\"then-pug\":\"*\",qejs:\"^3.0.5\",walrus:\"^0.10.1\",mustache:\"^4.0.1\",just:\"^0.1.8\",ect:\"^0.5.9\",mote:\"^0.2.0\",toffee:\"^0.3.6\",dot:\"^1.1.3\",\"bracket-template\":\"^1.1.5\",ractive:\"^1.3.12\",nunjucks:\"^3.2.2\",htmling:\"^0.0.8\",\"babel-core\":\"^6.26.3\",plates:\"~0.4.11\",\"react-dom\":\"^16.13.1\",react:\"^16.13.1\",\"arc-templates\":\"^0.5.3\",vash:\"^0.13.0\",slm:\"^2.0.0\",marko:\"^3.14.4\",teacup:\"^2.0.0\",\"coffee-script\":\"^1.12.7\",squirrelly:\"^5.1.0\",twing:\"^5.0.2\"},peerDependenciesMeta:{velocityjs:Qt,tinyliquid:Qt,\"liquid-node\":Qt,jade:Qt,\"then-jade\":Qt,dust:Qt,\"dustjs-helpers\":Qt,\"dustjs-linkedin\":Qt,swig:Qt,\"swig-templates\":Qt,\"razor-tmpl\":Qt,atpl:Qt,liquor:Qt,twig:Qt,ejs:Qt,eco:Qt,jazz:Qt,jqtpl:Qt,hamljs:Qt,hamlet:Qt,whiskers:Qt,\"haml-coffee\":Qt,\"hogan.js\":Qt,templayed:Qt,handlebars:Qt,underscore:Qt,lodash:Qt,pug:Qt,\"then-pug\":Qt,qejs:Qt,walrus:Qt,mustache:Qt,just:Qt,ect:Qt,mote:Qt,toffee:Qt,dot:Qt,\"bracket-template\":Qt,ractive:Qt,nunjucks:Qt,htmling:Qt,\"babel-core\":Qt,plates:Qt,\"react-dom\":Qt,react:Qt,\"arc-templates\":Qt,vash:Qt,slm:Qt,marko:Qt,teacup:Qt,\"coffee-script\":Qt,squirrelly:Qt,twing:Qt}}],[\"vue-loader@<=16.3.3\",{peerDependencies:{\"@vue/compiler-sfc\":\"^3.0.8\",webpack:\"^4.1.0 || ^5.0.0-0\"},peerDependenciesMeta:{\"@vue/compiler-sfc\":Qt}}],[\"vue-loader@^16.7.0\",{peerDependencies:{\"@vue/compiler-sfc\":\"^3.0.8\",vue:\"^3.2.13\"},peerDependenciesMeta:{\"@vue/compiler-sfc\":Qt,vue:Qt}}],[\"scss-parser@<=1.0.5\",{dependencies:{lodash:\"^4.17.21\"}}],[\"query-ast@<1.0.5\",{dependencies:{lodash:\"^4.17.21\"}}],[\"redux-thunk@<=2.3.0\",{peerDependencies:{redux:\"^4.0.0\"}}],[\"skypack@<=0.3.2\",{dependencies:{tar:\"^6.1.0\"}}],[\"@npmcli/metavuln-calculator@<2.0.0\",{dependencies:{\"json-parse-even-better-errors\":\"^2.3.1\"}}],[\"bin-links@<2.3.0\",{dependencies:{\"mkdirp-infer-owner\":\"^1.0.2\"}}],[\"rollup-plugin-polyfill-node@<=0.8.0\",{peerDependencies:{rollup:\"^1.20.0 || ^2.0.0\"}}],[\"snowpack@<3.8.6\",{dependencies:{\"magic-string\":\"^0.25.7\"}}],[\"elm-webpack-loader@*\",{dependencies:{temp:\"^0.9.4\"}}],[\"winston-transport@<=4.4.0\",{dependencies:{logform:\"^2.2.0\"}}],[\"jest-vue-preprocessor@*\",{dependencies:{\"@babel/core\":\"7.8.7\",\"@babel/template\":\"7.8.6\"},peerDependencies:{pug:\"^2.0.4\"},peerDependenciesMeta:{pug:Qt}}],[\"redux-persist@*\",{peerDependencies:{react:\">=16\"},peerDependenciesMeta:{react:Qt}}],[\"sodium@>=3\",{dependencies:{\"node-gyp\":\"^3.8.0\"}}],[\"babel-plugin-graphql-tag@<=3.1.0\",{peerDependencies:{graphql:\"^14.0.0 || ^15.0.0\"}}],[\"@playwright/test@<=1.14.1\",{dependencies:{\"jest-matcher-utils\":\"^26.4.2\"}}],...[\"babel-plugin-remove-graphql-queries@<3.14.0-next.1\",\"babel-preset-gatsby-package@<1.14.0-next.1\",\"create-gatsby@<1.14.0-next.1\",\"gatsby-admin@<0.24.0-next.1\",\"gatsby-cli@<3.14.0-next.1\",\"gatsby-core-utils@<2.14.0-next.1\",\"gatsby-design-tokens@<3.14.0-next.1\",\"gatsby-legacy-polyfills@<1.14.0-next.1\",\"gatsby-plugin-benchmark-reporting@<1.14.0-next.1\",\"gatsby-plugin-graphql-config@<0.23.0-next.1\",\"gatsby-plugin-image@<1.14.0-next.1\",\"gatsby-plugin-mdx@<2.14.0-next.1\",\"gatsby-plugin-netlify-cms@<5.14.0-next.1\",\"gatsby-plugin-no-sourcemaps@<3.14.0-next.1\",\"gatsby-plugin-page-creator@<3.14.0-next.1\",\"gatsby-plugin-preact@<5.14.0-next.1\",\"gatsby-plugin-preload-fonts@<2.14.0-next.1\",\"gatsby-plugin-schema-snapshot@<2.14.0-next.1\",\"gatsby-plugin-styletron@<6.14.0-next.1\",\"gatsby-plugin-subfont@<3.14.0-next.1\",\"gatsby-plugin-utils@<1.14.0-next.1\",\"gatsby-recipes@<0.25.0-next.1\",\"gatsby-source-shopify@<5.6.0-next.1\",\"gatsby-source-wikipedia@<3.14.0-next.1\",\"gatsby-transformer-screenshot@<3.14.0-next.1\",\"gatsby-worker@<0.5.0-next.1\"].map(t=>[t,{dependencies:{\"@babel/runtime\":\"^7.14.8\"}}]),[\"gatsby-core-utils@<2.14.0-next.1\",{dependencies:{got:\"8.3.2\"}}],[\"gatsby-plugin-gatsby-cloud@<=3.1.0-next.0\",{dependencies:{\"gatsby-core-utils\":\"^2.13.0-next.0\"}}],[\"gatsby-plugin-gatsby-cloud@<=3.2.0-next.1\",{peerDependencies:{webpack:\"*\"}}],[\"babel-plugin-remove-graphql-queries@<=3.14.0-next.1\",{dependencies:{\"gatsby-core-utils\":\"^2.8.0-next.1\"}}],[\"gatsby-plugin-netlify@3.13.0-next.1\",{dependencies:{\"gatsby-core-utils\":\"^2.13.0-next.0\"}}],[\"clipanion-v3-codemod@<=0.2.0\",{peerDependencies:{jscodeshift:\"^0.11.0\"}}],[\"react-live@*\",{peerDependencies:{\"react-dom\":\"*\",react:\"*\"}}],[\"webpack@<4.44.1\",{peerDependenciesMeta:{\"webpack-cli\":Qt,\"webpack-command\":Qt}}],[\"webpack@<5.0.0-beta.23\",{peerDependenciesMeta:{\"webpack-cli\":Qt}}],[\"webpack-dev-server@<3.10.2\",{peerDependenciesMeta:{\"webpack-cli\":Qt}}],[\"@docusaurus/responsive-loader@<1.5.0\",{peerDependenciesMeta:{sharp:Qt,jimp:Qt}}],[\"eslint-module-utils@*\",{peerDependenciesMeta:{\"eslint-import-resolver-node\":Qt,\"eslint-import-resolver-typescript\":Qt,\"eslint-import-resolver-webpack\":Qt,\"@typescript-eslint/parser\":Qt}}],[\"eslint-plugin-import@*\",{peerDependenciesMeta:{\"@typescript-eslint/parser\":Qt}}],[\"critters-webpack-plugin@<3.0.2\",{peerDependenciesMeta:{\"html-webpack-plugin\":Qt}}],[\"terser@<=5.10.0\",{dependencies:{acorn:\"^8.5.0\"}}],[\"babel-preset-react-app@10.0.x <10.0.2\",{dependencies:{\"@babel/plugin-proposal-private-property-in-object\":\"^7.16.7\"}}],[\"eslint-config-react-app@*\",{peerDependenciesMeta:{typescript:Qt}}],[\"@vue/eslint-config-typescript@<11.0.0\",{peerDependenciesMeta:{typescript:Qt}}],[\"unplugin-vue2-script-setup@<0.9.1\",{peerDependencies:{\"@vue/composition-api\":\"^1.4.3\",\"@vue/runtime-dom\":\"^3.2.26\"}}],[\"@cypress/snapshot@*\",{dependencies:{debug:\"^3.2.7\"}}],[\"auto-relay@<=0.14.0\",{peerDependencies:{\"reflect-metadata\":\"^0.1.13\"}}],[\"vue-template-babel-compiler@<1.2.0\",{peerDependencies:{\"vue-template-compiler\":\"^2.6.0\"}}],[\"@parcel/transformer-image@<2.5.0\",{peerDependencies:{\"@parcel/core\":\"*\"}}],[\"@parcel/transformer-js@<2.5.0\",{peerDependencies:{\"@parcel/core\":\"*\"}}],[\"parcel@*\",{peerDependenciesMeta:{\"@parcel/core\":Qt}}],[\"react-scripts@*\",{peerDependencies:{eslint:\"*\"}}],[\"focus-trap-react@^8.0.0\",{dependencies:{tabbable:\"^5.3.2\"}}],[\"react-rnd@<10.3.7\",{peerDependencies:{react:\">=16.3.0\",\"react-dom\":\">=16.3.0\"}}],[\"connect-mongo@<5.0.0\",{peerDependencies:{\"express-session\":\"^1.17.1\"}}],[\"vue-i18n@<9\",{peerDependencies:{vue:\"^2\"}}],[\"vue-router@<4\",{peerDependencies:{vue:\"^2\"}}],[\"unified@<10\",{dependencies:{\"@types/unist\":\"^2.0.0\"}}],[\"react-github-btn@<=1.3.0\",{peerDependencies:{react:\">=16.3.0\"}}],[\"react-dev-utils@*\",{peerDependencies:{typescript:\">=2.7\",webpack:\">=4\"},peerDependenciesMeta:{typescript:Qt}}],[\"@asyncapi/react-component@<=1.0.0-next.39\",{peerDependencies:{react:\">=16.8.0\",\"react-dom\":\">=16.8.0\"}}],[\"xo@*\",{peerDependencies:{webpack:\">=1.11.0\"},peerDependenciesMeta:{webpack:Qt}}],[\"babel-plugin-remove-graphql-queries@<=4.20.0-next.0\",{dependencies:{\"@babel/types\":\"^7.15.4\"}}],[\"gatsby-plugin-page-creator@<=4.20.0-next.1\",{dependencies:{\"fs-extra\":\"^10.1.0\"}}],[\"gatsby-plugin-utils@<=3.14.0-next.1\",{dependencies:{fastq:\"^1.13.0\"},peerDependencies:{graphql:\"^15.0.0\"}}],[\"gatsby-plugin-mdx@<3.1.0-next.1\",{dependencies:{mkdirp:\"^1.0.4\"}}],[\"gatsby-plugin-mdx@^2\",{peerDependencies:{gatsby:\"^3.0.0-next\"}}],[\"fdir@<=5.2.0\",{peerDependencies:{picomatch:\"2.x\"},peerDependenciesMeta:{picomatch:Qt}}],[\"babel-plugin-transform-typescript-metadata@<=0.3.2\",{peerDependencies:{\"@babel/core\":\"^7\",\"@babel/traverse\":\"^7\"},peerDependenciesMeta:{\"@babel/traverse\":Qt}}],[\"graphql-compose@>=9.0.10\",{peerDependencies:{graphql:\"^14.2.0 || ^15.0.0 || ^16.0.0\"}}],[\"vite-plugin-vuetify@<=1.0.2\",{peerDependencies:{vue:\"^3.0.0\"}}],[\"webpack-plugin-vuetify@<=2.0.1\",{peerDependencies:{vue:\"^3.2.6\"}}],[\"eslint-import-resolver-vite@<2.0.1\",{dependencies:{debug:\"^4.3.4\",resolve:\"^1.22.8\"}}],[\"notistack@^3.0.0\",{dependencies:{csstype:\"^3.0.10\"}}],[\"@fastify/type-provider-typebox@^5.0.0\",{peerDependencies:{fastify:\"^5.0.0\"}}],[\"@fastify/type-provider-typebox@^4.0.0\",{peerDependencies:{fastify:\"^4.0.0\"}}]];var Iq;function Zye(){return typeof Iq>\"u\"&&(Iq=Ie(\"zlib\").brotliDecompressSync(Buffer.from(\"G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==\",\"base64\")).toString()),Iq}var Cq;function $ye(){return typeof Cq>\"u\"&&(Cq=Ie(\"zlib\").brotliDecompressSync(Buffer.from(\"G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=\",\"base64\")).toString()),Cq}var wq;function eEe(){return typeof wq>\"u\"&&(wq=Ie(\"zlib\").brotliDecompressSync(Buffer.from(\"m9XmPqMRsZ7bFo1U5CxexdgYepcdMsrcAbbqv7/rCXGM7SZhmJ2jPScITf1tA+qxuDFE8KC9mQaCs84ftss/pB0UrlDfSS52Q7rXyYIcHbrGG2egYMqC8FFfnNfZVLU+4ZieJEVLu1qxY0MYkbD8opX7TYstjKzqxwBObq8HUIQwogljOgs72xyCrxj0q79cf/hN2Ys/0fU6gkRgxFedikACuQLS4lvO/N5NpZ85m+BdO3c5VplDLMcfEDt6umRCbfM16uxnqUKPvPFg/qtuzzId3SjAxZFoZRqK3pdtWt/C+VU6+zuX09NsoBs3MwobpU1yyoXZnzA1EmiMRS5GfJeLxV51/jSXrfgTWr1af9hwKvqCfSVHiQuk+uO/N16Cror2c1QlthM7WkS/86azhK3b47PG6f5TAJVtrK7g+zlR2boyKBV+QkdOXcfBDrI8yCciS3LktLb+d3gopE3R1QYFN1QWdQtrso2qK3+OTVYpTdPAfICTe9//3y/1+6mixIob4kfOI1WT3DxyD2ZuR06a6RPOPlftc/bZeqWqUtoqSetJlgP0AOBsOOeWqkpKJDtgP25CmIz+ZAo8+zwb3wI5ZD/0a7Qb7Q8Ag8HkWzhVQqzLFksA/nKSsR6hEu4tymzAQcZUDV4D2f17NbNSreHMVG0D1Knfa5n//prG6IzFVH7GSdEZn+1eEohVH5hmz6wxnj0biDxnMlq0fHQ2v7ogu8tEBnHaJICmVgLINf+jr4b/AVtDfPSZWelMen+u+pT60nu+9LrK0z0L/oyvC+kDtsi13AdC/i6pd29uB/1alOsA0Kc6N0wICwzbHkBQGJ94pBZ5TyKj7lzzUQ5CYn3Xp/cLhrJ2GpBakWmkymfeKcX2Vy2QEDcIxnju2369rf+l+H7E96GzyVs0gyDzUD0ipfKdmd7LN80sxjSiau/0PX2e7EMt4hNqThHEad9B1L44EDU1ZyFL+QJ0n1v7McxqupfO9zYGEBGJ0XxHdZmWuNKcV+0WJmzGd4y1qu3RfbunEBAQgZyBUWwjoXAwxk2XVRjBAy1jWcGsnb/Tu2oRKUbqGxHjFxUihoreyXW2M2ZnxkQYPfCorcVYq7rnrfuUV1ZYBNakboTPj+b+PLaIyFVsA5nmcP8ZS23WpTvTnSog5wfhixjwbRCqUZs5CmhOL9EgGmgj/26ysZ0jCMvtwDK2F7UktN2QnwoB1S1oLmpPmOrFf/CT8ITb/UkMLLqMjdVY/y/EH/MtrH9VkMaxM7mf8v/TkuD1ov5CqEgw9xvc/+8UXQ/+Idb2isH35w98+skf/i3b72L4ElozP8Dyc9wbdJcY70N/9F9PVz4uSI/nhcrSt21q/fpyf6UbWyso4Ds08/rSPGAcAJs8sBMCYualxyZxlLqfQnp9jYxdy/TQVs6vYmnTgEERAfmtB2No5xf8eqN4yCWgmnR91NQZQ4CmYCqijiU983mMTgUPedf8L8/XiCu9jbsDMIARuL0a0MZlq7lU2nxB8T+N/F7EFutvEuWhxf3XFlS0KcKMiAbpPy3gv/6r+NIQcVkdlqicBgiYOnzr6FjwJVz+QQxpM+uMAIW4F13oWQzNh95KZlI9LOFocgrLUo8g+i+ZNTor6ypk+7O/PlsJ9WsFhRgnLuNv5P2Isk25gqT6i2tMopOL1+RQcnRBuKZ06E8Ri4/BOrY/bQ4GAZPE+LXKsS5jTYjEl5jHNgnm+kjV9trqJ4C9pcDVxTWux8uovsXQUEYh9BP+NR07OqmcjOsakIEI/xofJioScCLW09tzJAVwZwgbQtVnkX3x8H1sI2y8Hs4AiQYfXRNklTmb9mn9RgbJl2yf19aSzCGZqFq79dXW791Na6an1ydMUb/LNp5HdEZkkmTAdP7EPMC563MSh6zxa+Bz5hMDuNq43JYIRJRIWCuNWvM1xTjf8XaHnVPKElBLyFDMJyWiSAElJ0FJVA++8CIBc8ItAWrxhecW+tOoGq4yReF6Dcz615ifhRWLpIOaf8WTs3zUcjEBS1JEXbIByQhm6+oAoTb3QPkok35qz9L2c/mp5WEuCJgerL5QCxMXUWHBJ80t+LevvZ65pBkFa72ITFw4oGQ05TynQJyDjU1AqBylBAdTE9uIflWo0b+xSUCJ9Ty3GlCggfasdT0PX/ue3w16GUfU+QVQddTm9XiY2Bckz2tKt2il7oUIGBRa7Ft5qJfrRIK3mVs9QsDo9higyTz0N9jmILeRhROdecjV44DDZzYnJNryISvfdIq2x4c2/8e2UXrlRm303TE6kxkQ/0kylxgtsQimZ/nb6jUaggIXXN+F2vyIqMGIuJXQR8yzdFIHknqeWFDgsdvcftmkZyWojcZc+ZFY4rua8nU3XuMNchfTDpBbrjMXsJGonJ+vKX0sZbNcoakrr9c9i+bj6uf6f4yNDdaiXLRhJrlh5zmfbkOGQkosfTqWYgpEKdYx2Kxfb+ZDz4Ufteybj63LzVc7oklSvXHh5Nab4+b8DeoXZihVLRZRCBJuj0J6zk3PtbkjaEH3sD3j6hHhwmufk+pBoGYd9qCJEFL21AmLzzHHktN9jW7GSpe1p91X10Bm5/Dhxo3BNex+EtiAFD3dTK0NcvT58F0IFIQIhgLP6s1MX8wofvtnPX1PQ/bLAwNP+ulKiokjXruRYKzTErNjFrvX5n6QD7oiRbOs3OQUswDgOxzcd+WwGZH1ONZJLEKk2T4VGPrrdkN9ncxP/oQ8UFvRbI7zGVrpNjlniCHT6nYmp7SlDcZ1XmS7tm9CXTMumh89LnaNuF3/wPVa/NLSE195Ntstwz1V2ZLc/sULMGaL4gdF3src9sR1Fh33/xiS3qOrJQlLpy2luR0/y+0q0RnVBBBe4yi4ueiNOdNAq/pR8JehYiEiu7YVJJcGBNBHlCOREQviO39dwxTxdulwW+UOO+OrXOskQ/csaLPIKxUOUHktlUtch/SkuaV5QD2G4vweAaCoSxMZ8k9jagIRR/irArsMUBBkvwQBZj1NYclQ1WtdeoYsd38CObL/DJksETohDEy6ZCixViSEPvNKiV1SSCwIiVk0dPGwTZxeNwPoA0BDhYNc4tIkej3DcTHVTS8W1vYFlURRUS4k2naQ5xI0fseTRBHJQ3WJ6Tn45afc9k9VffnLeTH+Kdd9X9Rnont4E39i8pr21YM+umrbIBTB8Ex2jNapeDYMPaeXACP6jpZnFy8NEyG2AF+Ega5vkvKIWjidXnkItArCkmeU63Fx+eg8KiP95JfLbUQus2hJTKPeGTz9b9A0TJtnTVcdJW15L/+3ZIOQ3jeoFsEuB9IGzxFY52ntO1vJvNdPQMJhXkvTNcRYz7Qz6l09rNUNGbfVNOW7tQgzdp42/0sZtnFW0+64nFJ127Niq3QLT8vwHYw3kOplK43u3yllVjU+RYv76vu3JMghXWGsSB0u3ESlir8CjF5ZIflzQoMn0xbP3qWknhPYHTAfu11TcndM/gV+npAK5/yKkwjnzWs5UXGXJHwAFo1FU99jtfiDBlqk9Xmq1YKsy7YkB5nOmw6dy9mjCqYT72Nz9S4+BsTCObdH/e/YZR3MzUt/j/sjQMujqJNOqABq9wAJCDwn/vwSbELgikVGYviA89VqCQjLBkWsMBf7qNjRT3hPXMbT+DM+fsTUEgPlFV5oq2qzdgZ6uAb0yK/szd/zKqTdSC0GlgQ//otU9TAFEtm4moY7QTBAIb2YdPBQAqhW1LevpeqAvf9tku0fT+IfpA8fDsqAOAQxGbPa0YLgAOIZRFlh3WHrFyBDcFLdrSJP+9Ikfv1V16ukcQt9i8sBbU/+m0SAUsjdTq6mtQfoeI7xPWpsP+1vTo73Rz8VnYLmgxaDWgOuNmD8+vxzpyCIC1upRk0+Wd7Z0smljU7G9IdJYlY5vyGTyzRkkN88RMEm9OKFJ4IHwBxzcQtMNeMUwwUATphdaafYwiPK8NptzFLY0dUIAFj2UVoHzUBmmTP1mWCmKvvesqnrG3hj+FHkfjO3nN+MaWXgorgAAA6K9IXTUD1+uwaqHXsEALRgD82K6GVuzjQznaC89QI2B34wNf1dPIwydDO38xCsAKCdf19/ePn1xejxPZgLmzLlTLvloYWMde1luC66/CFwUdwGF5iJ4QIAM5jvbl94r6EYr52H2W12SlcjAHBSzoVjusrp7UZh18Z/J+vwjQccSS/JBNE2b1adygAAyNgJ5P+bqz5+CPu24bqx6Gjcz84IAtVx2VEyBJTqrocOCI9I7r4vD7cz9L3AGZ6DBzEu36w6fQsAkN2IsmzCZWMxqbMTE75ymnyFiK09l327D2K9sywTANigkEkmLwTn4RqDiPxpy5HKA4aeYqbSoi0AUAKsGA5go3ZXjR0qpUsAoMWolyNxzyiIPZ+qsEM7QDgbHW9WJWwBADq5800tDEPPiPa6ialFj0uNAEDJEC4am4A/oPGPxmDmXdikl4cLKa8CgG7265rxY/wjtmbutfwJ6M9Mer8dKHyeZkalbAEA49jkE8MATNz+qKwsMOlGAEC+lkvGJh0ds/j5uNtg3tilTY+NTe/JnqF4N6uSDACAHKQP1Lht8vSzU7iEyzPjut2EPs/Y38IspIepXm+8s+bS2w8QPd+8ONuavlmV3gIAJLA8T+O2x6fBKOJyYweNq/YsVtd2SjETADgxiwkX4POo7fsmuHnc8rCP05hqlnABgBq023MivCisNnZRtK+sru0oXAIAK+fRHim5pkf85kL/YfPLQ/xReQkXAChjtR0XhfDJaiOHaB9ZXctR2AQARsyesDkUv0deoTWmffvT4f6SYAUA6+xXzrX3Smi6X8zthH22b/w19LM0XlWqr0rjAgAWs1Wq4T6AhPsAVGoEAAa5PpwVKjiHWlfJ2TZJf63FjF8SUG6KBOOL9A4PW3qOHE295pQyfVPIvxcJeU+CKduBk6Q+a2BAVtKhf4QnHrHLFpj6sNDUDvhCfNPmtn4pdDSUkHE1wPPrF1UvkQS/L1S52Zv0Sb/r9YK+jx51oWU+i39Owb1p4MDw3LcwvjpMvtDXPEWBlLcw4DNpOOC8f11nKez61/hc4txssbudIo5lL+aszAI1EiiSfkCetqOyBs4trCbou3jqJZ4diL4zvDnDBRgP+086X66Tvj3JOY1rJwmj/sJrubDrVb32PWhOs6BN+sJXQ+6nOZJTgPRg4PWz8sp/wWI3wsGBQoSU6tr0dWOkrwhDNCN5mfGAM5vfnawcoCdm2CdzIN0r72XbbDWqjom1cMjYh229sPnvzWLZAaSiQR3bSL1XjCwFH1wa4ZmmLeiaD4xutxAZfzu0FwMUkXTsvb7SX7TLM4zwjGg+HbjiaRWI92lgwaxTyKgiXbnThL9j7uBDihzuMULvXXes0e9x7PwRK+6mBLGD9z7PAt7b7va1J2EHu/zZfZ6JPoQVd849MZCk3RJOxd5Nsxi+O0lUD4Pochlk5+4naG1j6yiVRKBPobLOad//hDECeD1ORiB9M37JsSxMC6yAkKEdy7S1aRmXRGrLECneqByM8iQ8x6d71F1uhkYUi3WEjh/A9Yw//HCidh7pl7XD8vEkuN/f7XQ3+fhmSfR/9fHkNcRp4qCD13IGIBIAsQXtoDUnASJc+5H5f7YWufNDdZ3SiHJqVvKw8K1RNB/4mJi3YzQP47nmN2cw2BH4yKk+zk7wcLx2bVzeS773YW/7nMg8DMlWZGeYPJ8lYLzOnN4o/0fk9Fb9upq1yXbRyN7iDSRnOnj+kn3vLjHbn3NmA2tRwcfVd/KHGxPybUwcg9e742hY/XBtEgCQYe9Qh8t8fte6aEo1Lt7a9rryutsDxLxo0o9/lhdL/GMs9n3cCxZiuv3as0lchJm9dQGckDBOT/R+y2ft/W/eswB4NFnsqcrBTerQmx0BTPclttiZPF+ctHerFc2RW9MJzpuGOShqyTLCNsCjhPV3EtMF8nVQf2TL6GzI6EphQEjQgG6JrtMu/0zWg2e97o/uoTIf4ipUvVVM0KYey+VkMCWrFynVZh/hpTTXcm3+EV7yX7W6Ehrz8KON4P9MrENJx2msYomlnUT80OrH6Y1+KEfOWn8KyenbZuHQkjBZcDAx5+J64Aj6TSooLJw3anwLeZGOQeSSPXLe6dVY7MF7HhAl2HU9fwES3l2dLETAm5btht91AwjpdUoQghLn7RhAIRWFRVWJa2Jtc0Tm+dHRGiAvx6wG/OCGa7BsWuJ6U3LwfOzSY5qNsj3Qpt6+JyEhflEfl2YZ7jhjJ3y+3ehNh4IBG4eEmVuhYdlx/EQQvnVDqC5Lodj7NWEXjMFyT14tjF768alhticUJrdl3w6P7cKsF4rhxIKWxOSELDHpzaBPR0EgNZlKdZrSiJfPGaWK++nvRxwoo0gt4maZU1CAx33oq3e+NirCq8K514FHpLc0jbti5KzNlr3ttdqoSeYKrOsq+jS0w4q5Z2AMeYnbAgCra8oCHFF0wJ/PTdXUMVyIdTRhS8cJZVr5dTMliVhKm9/TZduaYLTA346l+ILCTo1es+CVq/f+2MU+XuX47AuupenBsoFCNMV/2ywHjCr2flEAWipfnI46tqmjq81ytF7IWoydKyHCSI4ew+k4+ATvUzq2buldaR6SAI4VKAMyMT7zkBkAMB00NLbwmtJqj2k7NAGAqHKufA41DAksWEk7A33esJTuBprShiAOZCMOdd72+E7b1umdzQCSOsdaB3BxZgCAIhUUSdbxYbW7MfnSRjQBAOeidlz5FgodFOhlNAn2jcFu6KmERUygbnHGMpnfdLZ+KTEVgF9WExaIcJy8hr/tp7Y+ofIvp0nKjrUMZqLMAMAsmaCWuxWW9dpVpoxoAgBXKtOVhyhPGCAhWFJty3Ija39F5udrAvbBC+QD+d2Qpx5Dhfh+FqLgzUW10AwAWChUQzuhruPOnJ3rUZXMdgmhZDvzdRCfX1UCN4/l/wPrk1X0qHN3KbpjTKBihdxy04nZgZFKr7EcDqvvSSpivzg7QGxmssgfLo5KZRV1TZtdbR+k3S/kYjTNfDUZyWrcFtxkiVhetaWfvcxumYBgVeSozNkvIgSbt+L/2Cl6TuiPToNFUi3gzvnWRxo0ES1a/Wjq0Zc47dikmBBXXE4/cj/BEnTUGU8vsXsssBsmrEbCzB27QqDQGPdcgFpmIb3VQSk9zfTyXFlADILp0V5qUnuHn2SAu8QszfXheW/UnD34sJXHTECWUYQhLc5QozwqlP1qnYO/j2pQmGU03C06s3d2EjlIdLNuy+Z0X9GIUUWCXDpwtAPYI/zXrF26ADyEpyyj5o5bn4GKoyNdkhskDGYenTTQ+fRqo0EL0yIqcAfyVOvo2jq3CjCRKOLgRzv8NZ30rd0sMLzpKrIwt866C8KrAes6AeYvDWFOdG2WjV8dNiG2wUyaYIU3T/cDo3COPFw8EPEFcIZAcCNE6BpH0CBPxefguDvpbTKPZF5TYE+uaLtxvaIUB3bIQI6/yK34JNzrQt1az5ucZEtXCMlBED4lW3rAfndm6l/kCGLzwMc1jaGqJo9VNR0VIO4dMQMAo+m4cpFwrKQXPzW3czk7Vehrc4bS6j+UCQBQhrljlDaOxR/+L+5R2jt6Tz+GWNGIJbKP1cd9mk9gzEk9hjdUxnNNvHTW4dOvtRS4MRoQDFpUwYuR+pe67JmTNfNtDqx7LG4zNLjh8a/7i6F+adgW4ci+DW1Ilf9ok+1zg/3+lfN6pK5X6QelSexeWGj2JnH1ym6sQa173zvfno297vUcHC6hAoTC/3enX+ej+9JNHu5RQubQD4++jHOK2fiK8Df3A4QC1LZSDmK46S0VdPvZ8VSJnWHbWlJDsshRGb3dyRkMr3d8VnqqBEcrMSKUyBqMsk6yUayfov2tM+rgwqxlrsiFu4pvawUNfFtcuWrc8FmGXzmz8Vn5LxfzeQoLfUX/JWNR9xC9tZZamjtBesX5eUAqtw7rpFfDcdbgXsMcsICLg6iqrNnoDTf4umgefPn5ZdXLAEaKmKr9K2jWq3EjfHsxMwBg48Ul4dwopQnV1GzvwQsXaQIAGfxz3b1L+LfNKAGAuxiMqmZyB+AYNU1XTRJXly88AYU39jt8cP2yet2jRRzcU6scgDEiEryUmuE0/9XcsZcfId18ZowZMT1Pn3IAxpBI9rrhhqfOkyl7L398ZNuIPH7ElH1o1LGcrV7PCOR1IzMAwAuoc0mYU0VR8SZmewtvuEATAGjx8Jyr7ndZRRabBAAakrqa1eFyutex5al/HR9+Pg/51BPSD406ljMQA8pRvJ9nBgCMQyre6J1RTDLuzPw1pAsbjcEeOqQ1rdTmu87PE3XTX6L5Gyznwp9PhH9fPkpGQ8UNREgtj619rgZb/3wPFNQVbHc/a4jvwl/8oBKYjqAA6N6ujHBoGb4ATrvhNBnDILjc0CJKnveWTCZsDPoCAtX87ot1zaqQIOzniFoY5+YhQw5B2c/phhnSAZA9ApFkx0IJ7sCLThlPpxnHyv9oR13WpgPR4gUqXIl2N4nXnTkJrp58Eu4njBlKzTOEZg8IxnUq8+sqOnQo9N2SE6jdRZ1z/fsQ3CJqNvCck7DRQdc3RveF/dc5mlOPI8T4uL+oz+Z8sJ9wZo/NELlDNct9N677yFvr2oYCQ3/83EfWnj06lnR27o268AYQhVTPo3RYYPpkhgyVUD50TQGcbIPBCGxagjGtFBjceJbYSX958r3v5q3JbgoA8LXamYl9ce+UOusgjorz1/LGw/LsWuxIqVZLUflBNNzqe8wfBnngUekITgge65Xj6xD8Ero1H/HAEgzxiww6j8ZB7I9hA4PQLxy2xTCSF3tJ/60ye1nRAiEhHZjEwgdaaD7HdmaDiTG4HD0ArtUhToud4pjcKlanIcEUD7j13JTtBA9u040VgeqfcMoXejWyk7YDcHR0TNJsYM2cyGylQEg654jKROckKeaXtByXo7DqAQhhd+e41CpRPIm6zoUBBU30L6veKGoHUvVujt12wrswKY0GCX7BAJ1ePs85euedVbtDdCFD6u6HVpjhIAJuyalS4D2EoUBc+OfKne64AHj8o92ql+v1XqI15bZv54pNU+xgh2zxoFup3vOQ40Jgk6wnrxfKqgVYJ8SCL5iRzYqxfYJEKQ6I4V7umobUg1tBdDZCI6wYso5GIsPj5aztuwBIib7SFoG3neHuUIkB0omw3HgYMqAVKWPKX3j0zEOeXOXa53uihs/cCwK2zTUdWfmdaBXGvP2ca3oubeEUEhTjUTjLD469sBTbSoNat4Q6NAHDoLn1d7TVHjJAmwfrggxygS3ojqv4siKiccTvzqizQ/sT37uxiPOJBH54kEryjipahqC4WYQ3Ztrduw39FZkaL80/Kl1M7mFa0VRxRoxS2hASYUpIdRLxT54CSsaACskZURcD6T7DueOjXevevtHYqtG2ZT+lHHVdNiMYIjJ4fu/nmbJp1zaOCONKPSKaP8J95Ije8V4Dnzyb3018HkdmaFbKBJDZMrXEB/VBy2mXVnq8WJSTK8CQuWPax3x8N3IdHtP+nKkRuXSj644Hnl38rAj9tk+2VVRuWRjNa1nsrvymeydN2VmUP4vo65rVvUozV8g+vFK0Pl3TTFjraGzjnpqnYj8fEn7y8xRGCb8o0PpJFDvkn5OOcISVLmQL98k0v89Y4snCvN8eEeM3lT34MjVzW2tBDx823AnRhLHF+wMcfn1USCfNH/y2+Nkmud//9f0xIbj11Zu5Zj4+4VjnVY/3brOKzwL+ejBmAOA47WPUljHF/2vcrorTjC9qauGcdjWqnl4Xqn61TABAfHiRvtpVT/BXt6udWv7G98iwegCujaC1eL1yhl59ATcUPRL3AaIOA+I5uupJcT1P8HWp2/hzT0Sgulz3jhhpRAGwRce+/k0LmNKMTfgx0HDnnYCoD4hwwcoVOwxDBCUhRKsQoCSRhCue2/9c9F4/djN/iU8vqQQAu2W7NleXuELigy7hrrH0ugYBzkBDFOm6hLH5gmTFDrY922J2jrjyFiDRWEKvovHJtvocMB+GdcfEc26nXAIxds31Zvyjgg9jDEkcu356cP45FQyWQ/2Xr9D3uuWTcP5rnCe2ZJ0E+rAzmSuB7q8l5kKexhJKIEgrqufzwt4z0Ma+6Z2Tc87Mxal5/108FsEkt5OMAUkkyPVYQvnEFI//BZi8mLGfYTCJKmKnPSOjj6PKKtrk9r4yTzXtIoLNfgCFXbO64O3y2dHOc0mB/cn4z5fkuA4VivPPReLcHVz8e0Cn05dLt14MyJdAU5yPV1oQSPcU194ylCH1I3Xt+oTMx7XGZgDuxpWddWvXNDuvgrl5OdL1SFnrVEM9U/0qfyz+6vo/VODmhzpDG/dFXZtJ7jTriHeSCKPhhLO5/uYBuSfw1POp6E8u60XdpKOROkyUcoWjqimnNyHhPDDdV1/7ND2Bh/7aiuxpFbYlYhwZNrk3v2ylTvyNsFmfuRontBwiqKx329Zob7jLYDIb9PrG+AWk4nN4QAF3naK32CroJjFK0dzBGBdbhqGvOwlO4Bqc2B+K8vMn9SgTYKOTXQpGthMF0aJQHsdrTiN+fG+eK6bKky6CiukeqBgoB0KYhl0ngc3MWhYQhR6ULDmmmrqvURCguRGH+xUW59GyJPI78e38CbKxEQpOnYlmZUheRl8+5Orw0KnDEZXpMdVzYEcr8V95gf54U3cS7adnQVQm9yAR5pkyblumE52RaVLbIouY4WxcNzoLJraAqsbN7CUaEyQRtqm83YVxgTXFBNPk2z9SfS/2mTSulgEfWUOYmQEfiAaWnX+P0ezKFz1BzO/T9SX4B8Sm7NUmDnbHI74izpe3Dq/k2jqvsxNBX7keI1eux798aA+Ee3pag6xpPDa7uIun6dXBDb9xrdpAFa1TYvlj/3iacVrXUYInG3OQv5lASKQr6Ok3CWTOFrkE3Ab4lFR8hbY0DZsgpiXw3Ic8YccFXomJeuZ+zNjq4CmlxYhcXQnrgtpWb2S+JXEp5JHh9APA4IjKN4hdm0qnHRzhSFfJCcOkg/RinGMzwtgNDahb4H/uNWjrIexsVRC9uYlMT3CCWCLeq12rSi3BlAQrnIAdFhL2INatBUy7ruc1TE+6eZ2XkZ/C6d6+CJrwouvF0ghjWDogxPbgxotmr56iGJoKnuwNF/VWHb037trPU+K8a9PCmGGWrqdiVkSOISAAc7D91xXG8Svq43DBvltxo/jeFylAbMWcCDXDm0rM6DbyRvFtLzAazwd/SPi1x5/NHyxHgX5VESDDn1tRHXzSlbjz2ulMvtv9Dp+Ic6KQZ3edNwa+9iZsx7kIwYF4aRfPuiAwhoYbkgvhVzlgwfF3Z5tX5KgmwkDs6AQdqyuZv1U3sFzdM7UxaJQ6JM5ELO+d+/k6PEylnYrwSOBlurpS2rECSHSp8S5Sbrm9jweZ44BxmkOBY4P5BmhH1PRRkCRcXYG91K0JRzOD/B1vQCcHf//8atBI/HuWuilLAbut+HwOMwBwqaIhe73RUkx4vCmUs4j6ALwz2cUa21NgLwszAYDj7hk5AvfEbG4HnKsavV0z2HZTPwBwNCiFQ3kIus/yxQ2assWZAi2zvyzAEU2C3XdnMwLHq7+vztaFd9UtqeZAqkKXkjoBs2vNdgByZS2cA1XNs70DCmO/0wQp1xWZZFWF8W3oy6uDaQnLF/YRxHk4rtJAAui5f4zymPhhpt+bgyGzSZdePfx3cSoXJIAuErW2pSJav7eSO0FL2bOd0eNgTenDatV0qcMQm4q085gBgJZgp6OlHCwNuT4pJjv46ZFji8t1ho8XaAIABIPsmTYL/HWV3harXQv7AQAWvtqIyuK3dJ+Cj9PGMb7K/JvB5xoGYzzTeucCQeXKMYa5Jh9EzhnyD3aGdQvU/FS1qMnjkPpyqtBQbX+HZgCANU1TteXcz9EMPZ0a78Xu1gxoX41fMf9Gx5SxOfgyF43WlePpTPS7KysCZeKjhxfH8OR2QZTGU8btjQNsDjEviJ5zZ659N/5Cs3tCTKjmg9XhwU2AieBC2CpJAc9MszqjvkvHbiHW4L7rMM9qMRXNBirYkwJvjoctYaKk80gNWxIUK2xDd1rykGGMhRq2glXBCIanrVbE4ctMSCncz7rDmN8J8+7xEr+37HpwPbbLV7DuIoUNODXiuNOYAYAdqqXg3NFSErZEqkops7NsF4dEt0pzJgBg3t6nyOT+ujWUO3o/HWboODheW/ZPjzH7Y2vJl5Vf1yz6cJxee134g1HHKtqNR06Yb1afnVoMAHh1fMz7KJmMuovLqpY/VRzDP+iqbrVar9VPSZxLCflzMZyzGDZ8juE3iuEfdIFWywg4UAxhvkt7H3Vz2Nmijfg10C3pDCGbW5HkGR033VTgXud+mVEqiPa0FRwBokdONicFMVWtN2cDyUBXkaaL5B06Dqt35stna5O88Hr68+Z+0vHQeOL7mZXCPby/RztHkz1eoTOcHLwcfGzDjP9lqtKlou5FzABAt+Kmy07cqDp8+QpF+lRyz702fCBvwQM5RRMAiMkiog3HhpH3/YCarpVzwsDVzQUBQNA83tWEAQVHZpGCKOs9UgWB0sS0CoJt+jEqKJxR4KigJF3udZC6mslAYLpqlIKwZZRLawYKHLe1OAacLM8+C5yT/b4tcDp1RVdidcVxOsa8Vfh2fiRZ4tPLrNuhQJAAyu8f42gdo2Z48/uSo/P29+J71n4oGiSAghLF0zoExPPe086JT6uNadoIQf+UfWOXtuWPNasWv/o8ZgCguhluxCuXg+UWd3uW2hGf5Yq3s0gTAMDia0wbFX5SKZfmYVwWGgQAHXyMEWXhV+k+Ar+tjd34iPkX4kOGQRqfp70XJHXkjm/sJ/ruOb4mSeuYnTfjCWFvoEcG4BwfnEtpFvRelrlGIum4+DYYBA7AtEQyHmxHxTHP/CVxmr/Sp7QXobUx4qP+rGJRXehvjg/uZD3fs2M5+cf7E5+fOPC8KOzGyYE0ZYwhuF0MBVh+MePAVk05a3djJn7kqrUyvLsOroqbM46Z+nM6JvdaGsEjVfwqoN2SfHc135EyJUq88XZEIX8I5nbsDEklYj4fVQqmNM/LjlmbbOv7O+qij/N1bqYrmUIugDHNlrEKYJjRKVYXlHSPdfyGYRC+RPqs64u/jo2ougiKUNbbpI+Db/x2xXsz0rs6VPAcqFgWBi/RYfXDhM5Ens0FyhIjELEM6DiViir7E6DJ9dNP4HqWVSnodz119e7ebZ8KbVAEGh++0g/ApiYn5VRNSkMFBkNiOgyUXPxXrPkCEEh32BdBNi3O8TCdjh1Kx36Mgtx2wdrve3T5Tblwg3Dy+gFH1Y8bEJ4Y8CpF3f2ifCSfFN4eSp3qgkZwRVzRWFGKT6KmfJbumRyGcIXhjcutiG3UCPipFIo5tES/QJQ4o5fA1zjdnptOZ6UTfGNOqVAk55iL3/7V9vAJgEzoLJTAOcpesyuSLJ9+IW+7q3ToWSR3w5Y1jIGVKSSunuyIIgcV81NlP/hsnTQRh8qFuSJCUR//D4NH89aIdvtqj5KNjOeCsW9jtsu+p9no9a8geJI1GJXPffb0anRpeUfz4mHRTMBWKl2PDpgKGxjEFyPzEZovmYVbBJqzI/RTaIuAbGwW7lIsDnvF2tLp7Hu1b3qfcsk+/G3PLnDBtaF3JHFxcZZjXgxceGu9ILgKdVl711k70N7xjW3vWAcAGE3Dl1+jmMZYWowjir3aY4c8NRZirPY0Ev1+E7PCsPpUUrFDWx5UL3Rodd/wKDQrtaeR5aVhbA3ILyE3ZJhjvRLYnEuAOyGwKzeB1SZsOJCWaGuT/p5rkM+b8QSzB+lVCEqxH0kxZyEM08yz5OVyjGpfkg0zhcnqroQ1mRg3mTReLxNIU9elAcNGtsPJ5lXSDFeEIunTdwmY2MhZ8LoROcH35TLh3OplkQ6JJnwA1CB9d6SN0ThG3scVgT6N+LHBf3cmMBRjqZn7XbXIGemgb/Xk8bt/mx5VZe42eAID680ptynUQBNR9Rf8HbSWhuPaSJA7qG83SvHE4ZU8OEZqIpGXZ2GlaMKbIbq4uiDYovInRvGODQYcpAO4zgeB4dnzqV7jSqHt230tB5CUBEsE9/4cJkpF0SBAh3k35zXTHvCenvz1Ud2TezFEu6rBNFZnsbQrAZqU7ErkypRSf6XKqPZigpk+a+0vsVaED2D3JhRNwxIY2pE+dvJNX6SJNv8AiFzDxFryAUsX4o48r+31f43Yzj4WI6eSDCeJu+GPFvJDu133wd1RnUutlzOH90ntQT/X7R/amKrLW7A0s7jEKi1VMJ5La3AvXzgwxMrp+bww7wFh1HKN3Xhvv+lKLFWQ4sUEOD0zd8CG7eucPfHjJI21YN1vyB1iSH3wVqtyGD321FZKYMEewOQgYKGh26SN3RxAK4uhux5ehCjaQ3GjyCMS4cIeECSG9Ami/Bv5lzzDc4SKixDRO7muxtyUi7xbSGtZIACJ1BYtKuVj8nKICZEkv6tAB0p5TtJpK/9/XVrKVqIC5Gn5Gl+0A2Rp6qk+LbeXn8lN20x2VCwnMxjORdqIQiITNmlKN5I4thKV3Ze3OPhGP46gumAIlPrjldf1dBKZVqhtblr7/oNQt+T9uE7exCNrEZu9oghu1pbzbmo/SpgGJQZbzXpocaLCH1LDy+GH68PkYGdP4CubBJyQ1g6E90ERC3NTSp0QBu/GHRqDgqyK3V2j9dxCEcVLFpXzSIB7on3SnT1kN8WtZr7ekIrjZi5f0VjZ7TRFA2LXcUfw+v714j3uPV07vb6V+Guqzup7wTfa5UOr6bDQ1T3NbY5CGPvUfib/szeX2BjA7h6u+ioHp1/cw2IrfMVok9S9Z7yhpsnxkOmq8Xo0MV1RmRf8bpBvDNH6cgLW961Vv5SeD4Jpn5HEoPWpbBq9Bpna680qtL7lTEt5D8J1k+uhkho8aCcB6XQ2X8v3eZNlMhvyPqR7PLF2hJCMfG8uj+rFeMWAK3akFPtO/o/VbnP2iGtkR7/rWe7ck92lDvk8q6oXiA3cZktHYFYSaLq/Wd2Evot7Yw3RHQToOu7B9UKkrATgIggmR6iaaXml2a1gHX2n548XA7GA0NQHEl1jZVE8ujv65YK5p+tg0LLvdzacpN/toxn+ebxUhZ9WrxYP/6fr9Dd/3jKT9qPcwb0ZHjwa/vmHOeZ72aED+8NvjT7aj4YMnL9DKEMLCLsQsf5EarQaDzcmTWgys8xKOyFBrbcOon9JCV+wNpa53kzxvzJ5O7bVGIgO402v5IAgHbO+6RUbSNbEWEGK5hXuh+Ctu9QahUtfNk/FnItXny1lltmcqOehqOIVT1blWCfzlpMrYeA2qZwB3KGKD+QmDdOALt20yVYVTB5tTj2+GmMDy7xkk08/ezZRHkiu8F0SYN6kOz01gIVGhx4PnxMBNNZ19oSmZ0G7FbhqlOWIIN2tq4hR3nQRsLN+eWFM6eCpGpYrQ5lDB1p4wKcLgCNRIbYX1syQAvEl1a7llGiQmb6ECq/7/nV3Xt89iAoMLWoQN9mTtC42bTObuALCdRI0FV310Ea36gJCuyQ4X4E50iOCXlEIKYZ45eU7UrnNCS17WqO8MCAmY/Yand6v9O4d4kmT7ZC6qk2ekv8GIkgTdUVpWwTWFjLkaZ6q9fkiCDJsYM825A3DCEUh5hZUZGJFNwjUOTlKo3HuGa4aRV7sQlx3cjhkPGRIchPPtePHjmm8Ip2DZR/q5o86FVBaF5Sk9XumrXpwRZPTIQ8bJxNId0kTDy1nEIPjmvYo3kUVH3D7CVqAmawsvm8JH2Z8KLO8/ycLE/DBQ4WvxhWo0Pph5K98UQLfVWZ/UytitHvuWl11gNnpSwBMZijoDMvuarjMIyi2buz2w3nFt2lpdsU17X3m7DfPdSAU9ozBqxNBx8mWf4WzrW5IfaqvHR+vH+6YsTi6rz0tLf4aYgt3gu05+/SiYYq5pqhILfws18fN2XL7xjVL8jw9EWjAFXcAuix8blRIvBCOgrr//dB0izhF6Q4oWfD+aK30NB7cqT/Opn3kXl2QFB4JyrpPrPt0JPzeIdIfbzbr/hE9plcxZZnOkVdFV/zSp8FxdslyWpjEPNJJXZ1ePgtW8Q+fbzcSjnd79KdsHHypr2ZwICYguSrAJJFHlydIA6Ttjc067yPgP6S3LV3rdJuwzy3VURPPHcEuBE9RKTDdFVjDOea4iMrycYG+WNjo2W4TIQg4t+3bQ0kjB2yZ4EE1MQaEyWQTd7kBeL8RFGoyLWXUR5C3g+NeYxfCxVsIvZVoBp9HFHTUJCbXacDeU4pAR7s52EfaGGusTdyg4bF2zu/jkG6jO2B4phg6J6GFn4PPaNgei5xBroUV92Oj5wuQfwYpJO3/plgv5Y0r80XSsnGEXuAWiWmZmY1lsQ8US4K1dYzPRcTy5Jlxw4fYlmKuVWTRbRMYKmuw1I33DmDEq1P8VP92Od4QKQnw9hFYWJPYbHR0xKSftb2WMjZ8tBAxQRPsko2tgFd8fyI6MCWnUbiNYeCpRs+YHAIoP5A+IMw7ilfD67stGzBQbPe0rkPkdzvafekGuhsTZkCc1If+8DSkV43eb9zvJrl1ePyIq5kn1iSK48mmVI5s6WKnHAb87PJYKWmHAK/LiVmO1GT1IDxFSZpp6kLIrQ7z8uqWdiM1+HzjCOwrqHqwKVQCrrOeaQZV3Cn2NWhvzqwXdibTusuLztkgAGUlBxHXhPHbYl7s4t/uGwwBytV2qw66lXlF+tFiQG8sAr/l2+r8X+oPmPxVda9IVEtMFPehuoD+szcvsVuBjanjPfYXvZ1sY08gp19W6SxEGa5MH9kyBEfRetwvbGSqFojHD2jSJn5jmQ3OFTtWNPaj6WgL4LGDmfRvLGMwm5o3lTJkx2kAkCf27T4iS0PfW7p0PeQeHjoPZ90eKsPWr9dxgOSg7PKMbAB5+v0/X3SUGA8BZjFKz+g1kLfK4vgHtHa9G7ODeBAEKJ7NZ+pZtitnlTsDdSbUu3PeQvYjt8EhRO0QBPg22kUkFv+JRStiXAXYTTqYAjjf+cCyqr7UJcxbMM371xP4jigI4Kub0l4rz7G2iqZkzSvv47XPVqmV/l/qyRaVUsyrWGaB8Foer1e7OepmcSpQxfAbod3dnOIX4z27UQXtQgJobSIkWYTYZkjCAP37uo9WcCNqL9w4NRW40ADhRMYBmRub96mtPmEO9KOezoayE3UFzDVvk8YxLZha/Bzt9LXEfY5sF/FVyV4e+iHBKpbaCoIB/I7Ntfnf+qFO6ZQlYjH5ecDmKYSk61/ngM7IN9BaZKepxqwDSNsMK7eQ/gnoyGTVPFcPQgoPz7GMBocsvBftsYYjogrg5iLJtK+2TCKSnAt8VEF6h8ypqi4A7HaAjqhK8eQZOfi9fjaw35vff2n6/3Hy5fs4iRuaT43Vwu+NN/BLTk6tyTyTsd6o3OFwet5g6ojRzhtMnS3peiBHGEcGtg2GVTrJWp2gIFIs5KPyrAophV8Onw+qo/HH+YrmB6vkPieGt7VPry2xQCKnJ+lVCQrgZd0AQMCqvBgQp+mYcCLJzoVtart15zDIVzi0momismLW61a7tTrqbvnlGgR2GxHMECE3111MlUkwFXYtx1vcYe3fbYFXXPoPAKAoMCf2s2xwctbtusDZ1cPHEXsrhg3/zviTN7gbp4AtQqyGI8COwAUt782BS/OxOwDrfsN2AABVtfQvvN+Hai79m45zarWdRnmo7b48HqADqqPphAJOcVWmE6TrpjEPAGAPOIiNuy1QkZ2ZPlALnj0c0LW8YUJQOzVQI7Hs7nij+oX37OGikkz/Wu24Xl39/yx0G2C/WP7edwTWwENB1ZgUIXWF4/F+Hr/JnytTZk0+iu+3VNsAqsF0OLj5/sh79nCxF2bkfPhkWvtMijpO7Xf5R9kf4nyPCXtlFsb3H7YCf10Rc171fYX4MvixfNsA9tosnsxd4BIi9GaGT9iv+W53tfpIK2XugXoVRKRQcdx53QCAj68BNFTUdcqnmZ0LqS3ukg5q5isckmNHUVkxdEhOiVRJXISuGBHtETFhrrvIs0ngCmrX4y0mW/s3YzC3S/8BgF4cqD32EwR0ZN2mDHppiwcL+sT+RgXMwSnAcSFsTduP80FQBb4rDv49Ge9DKs6aW2psI90rV4gcAt7Eced1AQDnKIrYj0f8uwKmfu8wMr+ex/at+DweCrbC59l7ZD2HUL4oysJnurkIaug40ygE01hSAAAwASJFtvhpiPUHId5mMwgZ6lpROiDZvVwHAFBCCGOLuZhnvWQqIkz3JdKaxm5xUzevRXZkZY2929k7imOvtveTwVj3lH3OvBEvfIB4tw9/pcogEIS51MV2nLx6pta2ufndi5N/XyuzHOp4tX07VU0OQJPa84WmSZDrrfWbtTcfv/T39LPko+c1rF7YEz9rM6U1rF96M59g9cktVllRpsCqYhx3PjcAsAqrGUXBMKXcZPANOTGTJeUMraxbO2swl+LlKxzaRURxdsUEzquwS5GzJE5olHIeIgAQaVnLCVY9BRMda0k5d/1pC0gNvOwfANA6kA2xHyfxZ0FOob30iIXKxTmcqD8XxRNkr+jI0nuOA5Q5l/Jq2URemRf4ru8IkTdlT1JNaolgiwm6GXecj6Cx55gVt7BVgStP9CpJzZzxZDKMpraMBPF149VfuDk5W+JGpq7KhshgFoHBMTY8t4SruiUqOBuCgtuPmODsnl5BFd3SdTQ73pZ8fnYEBJfWAo1wYJhoYDrBwFRigU2n1YOJBAYIBC6Vl740850tyXxjgoDL/nFsp8JEAHMIANYhIQCe+XZ6Ki4wtj9z4s37J596qh8oJuSRpUTYdqvLqsl1IUNgMbGRMMVQqerjwIoOBIvhvCkAwLkOnN3usRMeBy7stGOP+bpL3ptAVFwl49CpoGt7WR4AcBwjboIWbqo65luDaW/ux0yvmj+YTumfhIntczgdVuwSmAxrg0FquqAGm9CpGElDj+MzoaBJj1s1e8vq2PD8Ub2HA5/0xTXL6K5pu/r9MM/tLnWJod96/hO400WAK2z3904HZ8b1HBMZXTWZkKNVzTR4IrD65o26AQALhQp4AbG8mTGwc8Xd5VXAeQsBSI0FsgDUVRK44G+FVjUhAgAtQ+sCJ9jUbPh1vDfcvcq/u15rNNB14z8A4DLk6XV+vLY4F6t5HHCxBfFN67IRXJ6mvw0U11QrpXisIL3DrfdWpyz1CcoU42Cq6+fWA06z7mHXSHJldz1Bkhc25j3eTjWa2gGAlJE0ZPmG5u00UW83EtQFOSsNCaSuMQ8AcA48R8Oh45ZVgdmyMih2uCIF5pZlo6wCC7EG1KjAVndAsbwg4+KWFd314aQ4TlpwPkNrbKkHhuodKaKYFRv6GbIfc/DTIS/9MrZTgbEBVOVonNhbndOIfBT6ofxW+ho/Rk89QuxZWDnKVkL8bABfj2PvaSj90uinomMD2POweJQ+Be/a1Cs42xFUIjL6yvFiE2NViUHkDnHced0AwLTOPzTImzsFZKTtprPxkryFUOjqikroqCpQTJVErdB9TYgAQEPQ4oYTrGru8jzeG2ZV+zfX4LSW/gMAWhl0k/3EBfraag4BBtTFkzBTRYeW3rOkWslLmQW+pPdhq706C5QyfZhgboceEvIzWO9lEqQ/ZO9xT/HNeinsY643vp+BGEBexdfzbQAABp/qaNw2vRWCquO3vPmnlM4CUVXQ3ZaB1pHCzA0IZ/H5u0IIma4MsYIQth1nEYuQ0CoWEwAA0w7bVYgUzJcJKp0cm5hka1dmMgCz4uQadgCA2UKsWExpLWFdNnMDYE1LvDGwFmySEogbcIxKHHj06/lwe8wpUMf+TymTqZT6cQlfVbGD4QS7nmACn+6OoP3enWfJG24ruwwvWxvb68HL+c16gt2TNasMXmaRIQBw0wgS+ynUJluos5PourUM3SwnJ0+i6Jh8vnMBH/+0qCq7K1ACAtXukEDFAHoaEAEAAARd7lPLiAJJU3vVf9PRNLE6vfgfABhAc5D5sxXKqv6W3tzG39LG2/hb36bb5EtKrTsBavpEC4MXLK+L+eAi1n/VrN8H+SC7f/79K/05bxVuEMRc/u+Ca6A8krSyN+q8ZhSj3vrcZL3BMXZZjEh+4pkDr12cFHsL/559wPd/sIUbHivH/4Z5/tj48SgOcLjTe8v3zOSy2/2M/gD9GkMWsVtTdyTVvg+3W6uwXhxk1FmId6QMP/uZeku8OJb5sRrrttOGRRDG+lpD88P7L10woNhld50dJssC2L3OGDzF47ApDuFpTp8CAII2lRzF8nnl43Csejuv2TTXrZuiCoipt3LVOC0PABikV4MhsqosnJsXcqNaGTOB3Fwn21xB7shpsLqgtLcrKqoQbBdOMXxwF9rGKrzKaemo3h+DlyEn+EL3F9zk7rf19d/HjKBNRb3EHooiBcy33plc/Tq+s+a6zu92p3tcZQgAjDX4ErKRamcBDryZOGA15vzu1LqhQJ9MYfDu3aUOAXV1EvABnDIihDlXeK67OE1OtL0glpV/vEGwZDDsxn8AYCRou9f8WQRwqr+tN5f4C228xF9cW+ZKN5RiEvjuRGUEldYn6Vt6kYQpp0tCIGG2M1CioNRuuxtMQ+kqZyxYIdOdZe0AQFgFBdiWL2IhA6bbLuIhJbK0klBFVWCVpjwAgOXhVVVBBTZuakC27IxTIAme7VmQXt6QEkijCio1Ltwj4zaUKHzkPcM5RXxjvU0t/cBQqSFFqKKiiIIb/jhTMe8lrqmdy2oNoAJD4wToKYbsWyW9Ofg7we/ImDz9CLE/XaFI8Oi10pejA7vfHCY/l9oawP52tWFpigZrOPMgp/nE2huTszl7klaVCKxzoloEDgCk2x8faoc3NwRE0HbZXL8sZyH17dVYFBuoUp1EWUDHRgR6xv+f6y66tlSUkduLpmZr/6Z3ZEMdTFfjPwAwIDTXNH+2QtTUn9Ob2/hb2ngbf+vadq70glDzAu6AcGy/akkqsE1/TKEItTbUb1F8oT/nBx9PzPQmWmTCtfG1dm8LcVdwF5g4UxQft+VK5Nvoj208DiQ8dQu3/atIawDmRPJ43jNDVrWAFTJ0OAJEYJGQzpeDGKkybTYd5mukPmldavVcjb4/dyfi/gLd/Ozoq0tIKBWjJy2eLim1ITyuoX2Edm7GMqOichceVrfRhypP98e5uOAaIt1SMlMZ2IhIq6e3SphC+I/h0nbG27Ai2dMU2mYYBoNsoANzwdjT0gvkUj0hNRpsDGuJBYmO1C7D5OPki6qP4mLe/obk8oiOTLSuUWjYBtLtYyCHeyA5Tw3tYSJItv1hitwsHaSGHT2dNhvkLxqYUw9Hu7C9CIQD18omTNkPwc1IQXEGbuS07nkzR6JsqXjCoNSB/tnqWkLsaDcUAmA8z86JiEM/Ni+SODFvBxi1gEAWZHLIlnoB1VkBkOBrf239cXXlpVD8c2NFej6ddl8uARiyiGrmQ9Hka+APe1xY9NRUTfwzLfv6FcD5A6WEtXxtbID+ymrVY9/J4iwNREZjukGdhjkX8hGsswGUWk7vnC9l7ibCX6ASP04eueRlIMD4qCzdpyeVoe+2oS3Uyi7xW4CtNYNLneV35GHLjDUvqWAwFviZPsYXKd3Uqh3A9GlyAfPGM0WbZ5+eTm8XiG9bTN+ULlK8BXWhTt9eX0xw6fmhzbNPz7XywsmFvyOUfKx3j5Wv9QMd33Kp0ouJJv36ePfA/bGqXGotwjghbiLn9s4bFtrzcNYh5vdx9wS8PmsHjblJ8rX0ORBx4SCS1KvrdExAQ9xPWeNmlEJnwqBsif2jfm+PyTxBNaN3rYpFkTQK+0rrGNAOxWV/wBCJ0kwgxiXHwLVoG8NTIrrxMiIcUDX6olm6hzE3XbRZFf1Psjqff6ujR29sTcPei1pgfGRzvgAqIHDToyngNbDbYTzaHmDsZMwrhVALcC6VHdMmJNirZ+h4+Aqx1qof3sHNn848n6ekkUKtk4gQdIA2AD2rUSVwMTGA95YBHeotFyOYhipzN3srWpDN6Iflf14z5Ob9ObbbRt2rWegh7JrzO+k0WiiO3AYhqgJrXDZ2t8iMcJNlDZRCMV8DndlBfACGGHAiLJcZtnQk7PVJE6jP8ceelv9dOzC53kfXG+wBAH1T9CXY8UBfmYmhWLzTo5rAMblPkTRKEaBgtZkotQhQ7LLEKNFqfgwbPtog3XsLUMN2ClDrVbGAADVaNwDlEhNsrXS6Fh2BW9tuLbBiz44n5lsQyCo5cbubMgQ5d85YKiOkr0f5k9PV5zqcONcoRMnJkGJoUL1q4RSvmp3aVQeS0lXTQxLDB3tHSL1gYmoFOfhhlYFVoBnIPzXLs4M6sfAJNaRCERBjfr4x17J5b7xCQllj2FP/auE0VrHLhG4qKin4El9AiQ9IcW4M8pntZMUtXK5iTkRlzvjn7m0nwtCCXVkoqCIlK6MULVW0ja07CkDffd/ZVrm6DRDZeDQv+PL2Pp6XH5qd5BLchhHXRrowk70ZsWolmlycHZeoRNFvkmOKUHKbe+0bYAslGi3kgZycD86ZfTZmRG4vKBRMphUh1Fh9Fyxz3n5RsXa4Fg9wYMTpDx4t5qxHiwKc9GSKY51QEz8zu/ENXOaQh+f8YjWU34kzjdUuErVYbcqaQkD6BQqcfSpwev9ejYSyePgOtL5aFtgex6x8BCSSdarUMGq9tUM+h7pXYPAnPvxK/trfumJ1bVjGnipf9E19v5hwCkD6GkwAgIDA0KbHTMcJyqIElfmfNAhW0nXG7kKw5twCNhvBunaR2DIAlxHBWm6unYoAAIgDcKLFgUb0ddjaX3MDHDhqAAgAcgPyiv0YByqrMdO9MjKCLhXFyfWXFHSblSYEBzYKdrKXAAVHZQbsqWAE3rVVYFw1hFuLXOXsbizkapuNJcPbVzcNEAFAlmDqdN/2OGovNz01d7tgMgPJVU6FTCfNhAAAF8As2rgpAgylZ3bHfVXaGDx7r5hsZmUQhwMzqBE7mFVjglV1DsU4rHmlNPXnfG4FjY7fKtQNoFpGYwS66swnSb8lOekLqzlu++bV36rWDWBfvdqocZ33hBvhXyZ3r8G/Gvvp1d8mlzydVnUtBMW2bB4ObwAT5g2gVoMJAKBewCzTwzOGq2ZRAqr4HwQm2HQoY1SflfFGpgGCtzGSVHhyqa2mhdv52no9+aJxO0zx0cU1B1GL+QH6viaAAEAH/LX5A+GHWrPCAHcFsZJY9ojfZZZ68VGlgozuYRGP1v5ZE1vnlIRkfUa71ybJ9dO1uT3X5/5+4usJ2R6uGEEGCTDhlSIelpNdDXBgDfkhCBXLMqgScP45B8E35l8YsGcK4Fw7QxJghRXQANhjyxkDshs+AACXENSWw0JPISL192ZMEJPWDZvfcaNoUgUWr8my5pPkuicgZwfXzWjenE2FgLkUZ0UjcwqkCxvDOpLUmfI84zmoYq4lrtJtYlvE0Rg2OJGLBAwb6zDa3AKN0xtp9MFLGD3+0V35Odcp3O5aBh7+rXbNUcL9weBlnWkPdwtovF19Mk3c9umJgmBvNLbXy/I4RKcX1VEid0n29ti6Wru6riQeoFgn7W2ZsDdAig0mAEBqgOnh6eMB1GUAyrXvEuyg9owogT3MgADAXpZECI9aJAoAqCAKw4hoGqCovAslO1ssU2z+xIvrKK6WagMAKHdsYcxmqYUBGtQ1dLmFHLASXdRstJktG2pqLXHrVu9Km2j6dKTaNSRecmGA9qR1RQ8ybuAEjYHGvy5OlEYDp5devkvTF9419AjUSoOS5RqG+RsheEFXiOU99MAgRldcPnYA8spa/hAAHFTSddLyHYfI69FHjjvfTtr1GStXaUzA5sw2rd/bwkxqm3uXVrj2bTNHsIXt+zFbJgi2cKeKY9tlsEVYYQ+eGGyzT6kR88DR5/KUvrhw0VS4vVLkuHwZmhvWJcb9+vDTWxjn+VWHK/kX/SoUq3XqR0HBGTPh2QLmpsEEANhq4LoN9XPvOoKU+F8UBOnUn1Glx5gGAh7XSBLxrEWiAIAPYtCMiINxvTWehk9Wqi4xuspxDTzbEA8ATDcorOHi3J3Pg4quWM3oQAuaOJv+nCho05SaGjfypyDOlHa9bu2tZMVZa/9jA26ti1vDuy4Gt11HeEMwHM276IdGeBEfuyWDSxogAoBbgzdj++6Wwc3W3N0ddJriKpdNi1hptqqGbxb5nHT+/YIBNdzO2JKvoMZaZqCCOhrZIxV0H4OYKdDNGrFJoAbFpivYPtPh8zIXnWTb4NoMHX9Ry20AdRga5LxjHugH46M3mZujv7QGO7LVx3JrfbcB7NhWfIaTEPDHbemR6f1aLg16p7axgc96WnvDbFfX3mDZOmlPyYQ9BnxoMAEAfAGmwtNHAXhn/kkD4OGGbFt7xj6AHWZANMAelkQQj1wkCgDwIKrDiGiM3q4BivTrJaIktTL/gMNFewCAKzU3zCRFgIYLM84tHjj8KvxqvSnhc7TxCk/L23TBjwvXHiotEtbfKvw5+lkkFSKsNf9Thf0xxbdyL0dmfhsdeZV96q/qm31cL/cESbWfcYgVSXcZmWQwLWX/OcrSNJ3jpCS+0D1+A3c9q/MHX0J4ghoN41Frez4G87xwUEUa3SS4QtPiGQjKX3b3V3oW8PrArxQTyNmt9IIQV8IZNPPN+xiDR7jOYBlumI9m+ndavwQK8ml2TBDE7KrwJRJLIrn933ZRANS++RXGPp5aMdhSrynKLZVl246VVuF28T/3Hn5NBXZYO3PdwK5YwbGAq7bkp0NM8ZZ8AABTuwjFcFc0An8wqrLx71lPM8Nb7ER+vOdplI0sAMBin1K76Ch1eqH2yGZ2Lu3EDKrTZYurZ3nk8Y3q4OOG8SVdqLdVwHYO1puo1IsrUjqt6k1Phhu+CwaMh00+Km9c85JuEr71c6VVc6coTDYFApkwkL5KBMBGkf7cdn4lfi756Ou6Iy5S8+ndlkiwa9w/tg7BPXed8XgIXq2t5KXgpeNnDGFXYCAtFKodFqHWisX+NAQAQNKCjEjHjDI6QG/rdRLRB9bgS/YaTXsAQN9mECdZpIQpcB+s8gqBTWC2tJk4uAlsR0uMy9xNswksRi6FG5OXWJJ+ZU+6uIlKLJ8pQMyjuLRZO127IrQ5dg/uumPEImCZvK/Lml4CluX7+axh4z38jDODyjDNmCHlRwt7m+xaULzsS+/TFP+b2XbHspvwWjdkEDxXhn/+BvDZ6YmXQQ6sjdKFuQiUIcsugueudKltySz0EOPMn0RzN0l5hU0iIj7H5H1Gz+NIo14fqzygBDhyqr6EhzVel9pnCR4A5ye8oyUn4drLXgFM3DSeijXfhN5+ndLoizM2fjpdAmKqvn+Snqv+DW0Rk5GiKkcF03T2GfKlFk7koDmkTRmuCo6N/+zDxA9a0gLghsGHa3f7GzHXnwufk7RCTgAGCjS113fL3VyubGSz8C9VH+J/TK/wlYbHe0XiOoCssAqQhVkOS85pjRk2/zek1zm94jq4saDT5fWk/ic7uyhNxQaIu7LyxeJbA2YtXN1P8V+fA+oqF+5lf1IrZOQoEtY1WkB4fxbUSPoEY/6uc8T/1/ZhckpcKWjvprk6wVs6sg3IUODu0ZONHFcd5ZLmswfUJMfvlsiykJf3jDY0f+sAYIYjjho0sQ2dX8JZIXw89IAQsCMyZnx3zb0lYgpPOEjADm2GTHmEMGSyRfXChbWO2QPb1UZmJNavM3IH52+cZz5oByzl+TwmeeBoGVT4zh2AHcEd2CTOq5zP2JnU9ZIhEU3pEacXOubXNmPYT9Iyrz2PkZDbaY4WD/ht8sKMY9q9r4QvYas9aWviMNFJ7+q9aTPy/dt0kK9cnAfMlygmIvIQnsU/inaR6Tqd2tTz6bImJEJrFGYCwef/j8G584jsg7cSkZ1JF7UcWR22TCVpWf993SKBcqVNaP6vE2h0aYGTARq0Jjksjoe12bjEw032fDSJyPo4Bj9xi9L9O1yaT3PfAikuJrNzdXzglixr6TVyW9QzWhZk588b3VhVCbcC4xJTFxmnmDpX3GLqAY5jTDVTGFTkj1k0gaF7sdGOfOKJtC34HbEThv/ggIetpwlCFx6rmTp37GbqgujyqYuM7QyKgtJjP1OXKRb0zm/d6pY/XjR1aeJHUxcST5o6pzcy2PGmqQ5+/GnqIRKPmmph8ampSxavyhWCsQWKjmflDxIyLTn48a5yuvCMFxofIbGbU486JeA8t6yE1FZkNQufzUtrjxxFUZqkrRb2bTiFNhiUFOkCkzvjRVs3+aQn9s+dK3UXPLHo6UEST47bcLYJGx5JyYXpCWpTCk4rYnqgJwpNKUPiECRAmoNrbKSqfJtl4GbRdC1ZtfiNNVsnc5QVV2ZQiC+Z7KDjcoTZG7RxejediCl9yz/pDuqIWIO7v8c6o26FgDWcOKdW2qUNpk5wVqZ7ptFicadaSggAbPUME2/Blh11ariFwULd92UWmY1TY4TgZCMXELL7gAFASrd5nTm20qrowm2O0CZ0+fa8hEMp+VDfYeNfM73HtRrCU936vdKrvZ2nniDHEYbSlRIGzTajAABaAClphug+jeeCBFabf1QPM439WLly2aO58otQF1wCtUUMYVdgIk0EbBsR5Jmiu9MQAADJ1WMSuftRfQBU7eskAt2jRClNewAAeuaMqUxS2Iv5w5rVDXyc3mTjs7QxG59lTLGZgghu8cozqD3JijALFJ0U7Ukv0uFieJ16c5d/rCI8scluSbvbRFbhssluR6vflGlG6h44PE0v1L1aehIANKeQjcJSuwGgBUFNleVrp+PcBWxq45x6tt0YTNtUh6kya7DVlNJMCAAwAcZVyHWi8K1gynpm50IIyLOxByE6BoFriBHrxHhNcgY6eZNjNMYb9XN/jvYv8QwfriF/EQKegg4B6o66JycYhQ3/gt8TNnbp1ww6pQJB/iMzP1UdAlQoyG9/mDg3Ka+NJbtD+ZDoVVWZIP+3VeaOqpnlsf2PBdz2cZHwYETZAuOijAIAzNGsbHlXe4jpul6Isq3L6V9z+S53FV57s2dYur2pDXToHok04xKlpSclUQCAWtQQRD3ZgTpUnE1s0KhLewDAZF57QdJ1rqUPcxgOh3Kc2TpUDsTnTYZ6SZ26LYJIdt3145JnScv+tSRc8pb7FhtjgQf6vRj++ubchl+5sg5v9gEyLz1kYmWXk62IXeBlOdlNA7fTXAIA3BXC3dAN7g4qlnMQpmH+jUrIe5qxR/047jpiuT7FOGsrJx0bGcfNGL68lS4nhNEu+gAA5vImDjGNuCyDjgTaXTWQggSvl7IAAHABIkrMhex5e3g6EjGxmeQN2beiyFIsMcXT9hZ3iuyPG+xLwkZ0je1mWAbOHxQNfKQpTmx6utzIWX3CX3kE3jpVnVXcTXJZCUe/tcVqnzf82BTL1RHGinX5gk01owAAG7FypjoLb2AATgBlas80DSjLDDQENMWSNAH2VG67rHZ9nrYUejhRlKgUI1qpTGTGF3BJr5fDAwCcXlAK+1EKkkWrqewEvULy2BZrcEF5WZuGkObGuuqUfsEkKmkb9kSXnAomtUSlWMAa3PdzsXaHIWs4UdUo7dmdYd2c+PANkUj5mKNI0finPMZ+7Q5msZJbXywQAmte7Cnnh4AIx+4TS5oJIjFCTBcDy+MV4BASLz0JALBuJLJcajcA4MoQFrF8LJ1nmNgilrLejmU3h9yVoTCYvedGEsw0EgIAmCQ5IpvLtrRwFBa7UcG6ui3NGr1awncZ2ga+y4QwofRV11jkIzgc831wRyDcOfZ9wuF8ujaslSif6D1qlWhvh0erDpx815boU9Cr1KLjboNFyIRZ7GvDwHIUp6MAAAr20U0nSOBQBuBlksIR2mzXma6B0G67BToSoavmSDqPxezCtWtGuM/7f56GAACIsTlRYnxOZSIXyZlr1AYAeD1DEM6oqJj9aA7ScNpM7RakydliXc/yg6hZLqUDyUu6a/3qPrPClqjkqmgU9+kSttRiwKbAu9ie6H6RzVoltjmJKhJMBLfdpUCIcDlsFAMRicNDGRAxu/QkAKAiJHFZajcA0L1Iiqf7kq4xPKBUc8cMpKp2VgRSHNZiQgDg4oTUauPSAlHOYKZRT5Qgo9K2IKOGsPluuPIquJia7Nufg4G3vbzgle+an/rvjhIrkkdV8vSiyY9lgfZxkXAaK9ey5KKIAgDcpWVv9UHkSpghSn0tAS+jlbvU2vmzK/RObXBA79VIJ85ccydtbi5QRKe03cTCKVGigz/+PQ67vqfziSqw0toAQFIrt7eSTrjssPD1jSVsyFzDbt8UKhDfeknToq27Ma/VLILrCknIq1vdzfGkfZYf9ZBRkydeukarr4LTHYTj3U7fmBxSsz48bCRP1SNCuQWUAMCm2Vm6GwDqgOI+9x4Jq+Fm7uL3eAcFCoZBm/3YTPOXj3u/dodfCq9c7Sr9478LSSSCQ4BKAPnt8RFmePFS/GQXvScfH5UKAPnP/GhWjT2uNvJPhw2292QYi3DRA5VSAAABI9UbVTFgYAs7yjNoOSDSoKFslJSKOlgwcduCqmxaW6QsEoh8IsEsxgMAOUAVkBcEcwY0HxcY4dbg8Ddo5thf+Or2EaYtZpAaF1cr2j59eY/k8Naz34seqeGRQSO5bhwydxXC3YniHBMA4ASoiwakl6g5B2F5DHDHQOZqZ6YHyJWuHE6sOcdQmIotHwvYqf/lXd/fFAn/IrGkC+jKzMsKG72neWn9SgIMsZb0gFdVW3Mn8JjlLAAAywXOwHDZ61tZUxJXozMvs129AjtniVWVBoJQcfffVak6ZognkNVP0rE+MijVuHUtoVZ7UQkaA41/VZxg8FE/kVvCOfkeIhEmfDpSQocNvw/f8R4uGSfp859wPXeh6nPW+BNxc6zfmDBuANxFcVoKAOAKDfUecH0lwJr9vJReqfpsVeMvb9s02OAtTaQ9wIUHXWM8bJOTKS9s3l1+DE6Zs0mUO5/eFUA99zqJEK7rFSaF3oZ4AEB0V1IlN8J+jBxRODTKapqeY73IUFli805CgE9geLP0VnmSFnsYwPK13nD62MBJa2QKhKCqeZcDUHUPeuq1xJBt7MI8D3lu+yBlRJuYz75QuY4eDVN/v/mwJRiiwrOMep/u1Qw7Boqcn6jpOpjfhm/FvzwPNuLtrWabFcXgVWG9nBXG/FP3N5slV1GFVP2BcohbSVCoXrdT3gNr7w3KIMOut9BvxuXNTe3gami2d2hgW7A8QabjNRuaaAkZkGmRFSH76GMMtFKFF6VJ4Uk/YIv/iZQooCIDM7pFPSQzdF2/py+WDSQo9rU0Q+FWmX3+t1DKAxY3EyLKkl0CC6AJmtF4eRiEqgChrTDnsh09afuxJ9csBnUPYVk35msPV7WwyOp94BCpCvT7TvyTaqY33Lgq5XAIY5butFhBbjePXBgoRYpxNObIQbCz3csteRS/Y0EWHXc/4gp8MA6BCw/mcqvz8y4kSiAYbIJFhjzwzQ5mXg7Fgl1oFHSKB1FRQ8hxY/qFJ8RHJz0PfDInOMJNxcuVPWiQ7nfORkOaaKIRaKEL8U5h3cf9ad3HCa378I+OqNf707oPi3wrHIAew+4tfQMpqChw+0EvGZ7pow/ub0BNi5yLvx78hDIKKaXMOUxKEKYekUoU7gfrPoYWiBUR9j45q3jGPQsjh1z+aRO6Bjnjwzj8El9kRqyraAuDfhWNNQ5YuDmIVjteui6G2rVJChUNWOnidyteR21FVirTNPBOzlnqOQjmclsbhdH3SMKeoktqZ2QQN9OLakubJS8mIGcB6ZArqOPhJXwgFqOiuycvMyMcatrFJ2bLsKAkuMb6VQkBgNzKzcTMqga1eAGOsqz4cJdkgqKo+DSXZQdoUfENL38INKIyXfvk4erResTmPg3OhDBdBdj6neA1KyFTSxVNuut6XZv8wHE1H3xq5dEiRPGueZJ5Rcc973b8I5quLGvS5D43j6or2+R3nrqKnGvVGOqyeEDPD+BhmkwoL3CfTRF7Xy7xm3cRKhw82Kq1Pj/QfJWv0EPRiRbc7pTb4/FqWa1QYWdkMWH25IuiwN7lKAAA+xirKBDL0plFqEz+p7pvwFjp323tmUvrTwFczQxcAVxkSa7FQzfvAgAYCrfHiaZu5oNNxKFVidrrH3hHarggHgCwJBNl/lh7wezEKrysprWgqMLYkiX7du5JjKm9txJqr4mT1QxYuElUS9aFnrwhZ5MowM5E9BI4tkOgBoAT9bA6MclJo376/N/FYJSFy3Vtq9Pg7S4nEwDUZ0hNt6dijFSLjECcqns/By5c2VhxF0+UCkZbvbdr/l1EouPM7GRskga1MrxBptUsW21kOsMgpAZZyLlWnmwdqBH3a7xpiG2Or1z4XkcTYqL/hS6wEvOvVTF07bUi4dtd3LLXvdMoAIAd2XU6zZlKsiLAHY7bzur25s9ce/WXdtUGLrSrSnJxZtT9L14AwIgCS8SKibYoXIui2cQJTTG5BwBUkFlhUuoWP76pxp15Fmfyxt44BDPx6BBTS+2gpaP33O0xtsjH/u0dqSy6UrDhOtScTxxBQE3QhCgWxrJtPUglqWpkgJrdNmjmlsoEgA2EHFMdGkoQpICMiMBd70UycRc2MGvGYVenseu8jVaekEL8m87+AEIM8TtT5989vD9lOjZNbhqj8EIG707iqQ6t03YLLYYNTCkFABigpbpRrAF3odnps31ZQGus2EALOkrSgirxAgAGpi7aBZ1NHG7oS+4BAJ2y1DAplvwRTS9zEkQoPjdccYBcT79lBR7BfaDZv/E1qef/onV5e7KR/4/t5Pf0CzxQ+7+qPP1X9c3e17palAmNWjQBAEBUmGFzFJrYQS3VgFvoNTviIgDHfqowrVLB+DuZ89x+zu953TiSprj7L+uPO6uJPq+ykAMAwGhd3JJaGW1w8H+vYfXZpBdaAIAx+qZyuU4FDIaSBpx5o+tY6ysxMbXW16qJ1Ky7ir2RUMZ/T91WKEiT+YGjqL2fzz/hHILfaDlBfarPwwjhnUJLzm0XUgCAKtpWcUMPQxQHvSiOAIvWO0s3smfOL+MtDQuD0SJZ9hxfazCqOwGEaWJ5FwDYwWhcnFF0nEtLProykWAVXhQPAHDxO2UX1g2yB9WH9CYXH6ONBXysKSXi6/R3hO8yBBKo1cO62lMDdm6yBduZ2N4ApBwCGgaoOGw0l0/T/10MRq3AQdc2HYG8Xk4mANC3EM1tTzlZJK0wAs60sUxy4AJruYqsxlS0gppaSAgATGX59QrWroVjGumTixk0g3y31hdazoZb69vzNuQgxIbqyVTFeM7P+6EhF+CDRh6WG1wf8aE4lFQvVYwDFc3u36vTOeHtZ1Txj6ejAAAqHpVTX52cnsoEVDNxVTzzzJl/fWTlSgZjZOWMpmPYogCkcRcAwDY0BXKiaaaBlhOpxqpE9wPu/46kuCAeAPBKpmW6WJ08zIO+UIzW9O52o2RlLbHTzeQlNag5JhUWmJ3idbsKocmKUyj+t1EQOpJQLMML/fhSJRT3GnpuonCa23qVCFY4nxVWO+eES6PG/5PwV5JjFG7dsa2eQapKy8kEAKEbUrvbU3EbqfZ1DYpXwKHZijtb5BQxUUMhAMCrZcrpY3WczSBNPaNmkLaZLTJIrwkhk/HEninzMcz0nzcDTo/z2RgbWqo9Z7SJof1NQSycOWQ6SokUAEDreTj+aCM/Bim1SwLejgZ1eTeyo9Kb1chc3cWVuZ8pf51qVt20ijFR9yzwAgADdCsuygvaOvGcqcSH6r7VcArxAMBokSx+dgOFsgjDmpOoZFrk4+IqZD0cqFoKDc2yK2ooeL9eyzEOKIvgHULLrn0MflgNbjpRfbQkAbSgwnAK0XaYCiUZ/UPfWNntSHdWoUwAKC0SGHV0sLKDq762BIrdk9PYYeP5CxDvGAte8KL06EJC/1ygT2p9ANGGeH50zxuWpP5ojzHlEiqVIw0J+tOCHkYMZ4pvPTVWKQUAWBXij8Z7YJBSqQbcheYyaARKHBiAcBqgS7wAQICKizJDn4fqM59YXMdiPAAQQBUQFgRzBjQfFxgx1eCE77oT8aG1hn+95Xg+xvMXOaKLqezwhuK7lqc/qjx4YZa9HELc2NV1mT1F6MFFEwDAQMRt0IMacEC98/td9tQ8eRs4/GBSFZlDFMve1d00hqHsblKeWYuQ8FFBMdFaXny6/Jou6idliJ+l3XXWcr3WLGpPXXl5UI4NLWx4V8qNCa14+0nhSQkOEAKyd3GFiuo18uLGPC+8MGFqQrFj3kmpv67078hXk0stMi2+frECpzezP5xLzKqmaqr+BIwIAHlx0mWje/pBvMGCHABgKMRMgbHMHJOxRSGZoLLmvMLsI3mdZhYAQEVB8pTposztl6cjSUFspm4WH/1BKVsPVEEcQaWYe6LeHZzl1vpL29NBmCA2NVDrsLRGsA60Uofd2c0BR4OG3DvDvOoIWsBXqc8/KWXy6td56555jDWs9IKBNcgXZK0vttHbZw6L7aiJj0RqozCEw6v8WHSlmhJqSqRATNPjaCEl9KYqiKQ73l9EeRL00EAN3JG8B59DKynocr5jPTlSDj6WNkLiMEHZhGxGciDWQnd3go42qClbafoELdPTDKM+/PrHeW+Iw/tdlTu5vqxiVkqanOxXrlg9QVTfbdZysCRR6mYUAEAaARNohgUb1yYPJIVYNgHFLe4B1Ecxhi+XUo0zYqzdTqFdJCR8VF0j2qqN9Ezkg8Mkz2lYRF/L5PHRJp2uINr+hcNcT/RitpEddkKCh4aWVF3zLjXuXw4XTpe/KzfMNa6xwnwF58PaMBxDV0J+hKulnP6E252B+GxGD6U1Ert8FwDQhkHX8iPOnlG09fitJ2NRl2heeaMiTXRDPABgubJ8pQA2f8ICOpHC7tuRaXaYWygUb0dWXCARUGjejnK7Rt8MEGfsNzI1hCLFC0MgQ0BY5XgRU5MCyrcqE6eQko8PxIWUprVwkrL/pFCltM0XM0RKN3Xb2WPgTkOZADAgmNCi7pFBpg2Cqw3NMP+tdLTGyu48xidts5kQAHA53Y0gi23jPAUNdu3MONCwwrPHCw0JBjEpaJXpMtsRJaPsxNklyHI7eR6H+EyAFr+Wu1tt+t7CSZCs/r/ONq6YFQWqy4bqrYWpLdVSUwspAADFht6u04NaSe5T0RpQ5HuGETJrbi5gZQYBsMQLACyomOgGejrYU4n1xIuDldwDAJr07YFSVPQzFfQdrKC5A146CsG4RnTvQch3ggndi56+BzucCEwxwnndLnYfcElnIhsD7AwjcGUO7aN2GZtrQe0xRteBuq7ddhf+saFMAHALdK1FNZuBa+sGTUCphKGE9aQzzU53X4hSIQDQYIW4+iXXwQkyPbSiHrDIHnuw4wd7MHkyMNDhKrwhI9zDMe6C+OWIeUU66f88q+/5bW7dywGKJYYbYCkFACAwoaGjCxYFSTgRSEC5uQUnMwggJV4AoFF7WjR34OQTl+u6GA8ACGwBZLCYUyD5eAHV7zrQDF7gSAHQnu60i91p7NkG57E7n9gb3yRlBYFnVZ0DJdhGB0owrpauzG3XaTVwoUwAoBYNGLV0sHKDraU9FQquNhPfk9rG91ypqz/kOwT2Ff2wRbbifQr3p/RAgEhX/K4dAJNcD2hetJu2v4D6iES54v9LDbPOdVxpeGK4AJRSAAAAkeoFrAgEwNzcgMkMNuASLwBQ4ERFj2Z9C5NPHLAW4wEAESz5Ixpc0Gxo9DqIUKyDlO8LiF/T1n/2LCb8d+qfvfXzbgzq18A/vhj2xwCb7fLg95bz4BvVQeTDRAPfs50lK1CV+dDjBRMAYJZ2qrlhmsbZkYMtCwKQBbuE1bV75mcPPbrSByhaGu+r6q74MPzus25ffqCBnb4/swfE/1X++1BdqH41n57m2UV39mbKtBUa2mmbMo3pijBXLQnXETtN1rJbid0/qYtdNeobpJrXZAEACO6JN86opJvmSq6FXDqt6U59KTfLta0uNqRy3fe3l9E7xFJQxtJ6l5XlmwRl3FqUsjiR5/hA8mtVILxavKcfPQIzjR8zj6aU0NEUTq9YsFYCk4oaMWHNAbo0owAArgLCMdMz3fQbIcYmoPTE498wUXHN1csxAqmtFVQVYBekfFwGOzu1EwAIaI62uZxooaSCmmx1baLjCXe16l0UDwBM42vzP+c+S4rv0ZvT+KnCeCoMky8lrfE+wV/o7xv8lSlwh7fNvHCDt6hPxC3ekBPogDfibDrhjTmjzngztdu6sDq3oEwAqGKgk0bt4WGdKgd7GXRPCcU3pWykNMvNhACAJeBgC5e+hhWkArOyM1uuUIZptsCztwaaxTKI7YL2wm6yA8/1mfYPU3HjUuX1KQBnOHmBh/jMaqX+RvfOlLzGFyswVv/5nL+qwNpM09lQw1qYyv3LNLWUAgBQtGHq9EzXU+FMjE4ApdqfxL9n9oXJmpsjaq4W5B2kK+oCAAInIjqQ2unBmkoswqGsG+YS8QBAffvuICOXfWTvG9vkQmal8dMDHYybhpAOtnwH6OB6noLlW6xwckiCBU4vEsHwLvLqlxUipK5Eqiy5bXfAVCB3xgqbPjjaSZ3GT5erYy7mJPexY9tc83aj0UwmAKgPafrsqfd4u5kxCHwVTEoOXDSdkWJlivj2HlSaEAB4pvs7qADXNEPvQYaZdI7HwY6zdXAiCB3E1JznlOvllt0FxUOllxDdpDdXOB5bcZf9EyOGg9qlFABAB0CqB+UqkAd0bs4AZwZ5KC3qAgA+ELKIIPOJAqcUDwBMt+3DwhFADSZsdgrqHsYnHwss+W6wGTwghcCyITCnXeRuq6UdwSsTyWPjVv6TwOTENNl4g/AptNhBapOVjAWtZrcn3FAslgkABRanFo1XEGybnj8GlxCBkjV2ui/HdD9v/xrmsdqFjZTKBItmxfcSFEjigQDRrfhdewJmzdTXA9cuZRLtdCWyFf/LTuD5Jbfu9VpBi2EDU0oBABboSL3ZSWiBYsAdK8CCys0JRGZwARZ1AYAFOyrqvcdZiHwiwSzGAwA5MAKoAB85c+CyMWl88l1gMbhBsP/ga70JnBvwnJXpxVHhNbLd7ylG7fI9tRH4kDISAKY4gQate1Cx0nMYOyWmaQiB4cRZeURPolI7P5cY/UImFqe7Ptx3/mWSDm4C7Hlb3c4bwRCm6nPMAqbyj/fYoyx8Pw9W77Z5aBpW6sERWsYBCUkKeAXWLb65e3yvxWCRRWniEIzl7Qhf+rFTQr83mCUQtK1DrWnuwj82gX2cp0vK7f0a1a075sa4iCnp6FqsoRcVp9w98OxdpKHRn9KNK15VN3oEIzK7mIWuGWyVGuwGfH58x4KvDEIVM0FsFm8AgAZKzNwfK7L4dlFptgaVQf58X62yzAIAREdJlnTZznr7jw+6Pg3I4MydDgg9ICaG9wtI+lDr5R2brvFXBIEa4LFH1uJN5c04CEpJNg2d7DKdYo6NJnEgQMyzHVxKb9MEHa7ZW3tum9WxwijycNI0itQ3Tseox9mncAd3S9gKAAvg4Bnm8X2a85Vj852EwM6fX+PDqV2BaNC+L6ymBfnXy8rqC87WjZkp7GZJFwDoQGpBlNOxqx5QLjFd5xYHWdoDAHgoTxQohRMl2pWp/K6jBeWweQh21aMmGNsDM+swNzJw/yeYg+Hu8zVkjX+fYAocLnMQbIvFSa/aQg4ul2NGsexGKwqOblKi7ehmSjQe3Wzy20e35cUyAcDF5RmyattdanbQoEvjVCWcnnK8G+okCgGAnj2LpRmWQ8kVbNGZZfbQjsahpsg+HeLVEBA0midLc2eZLlBPJYeBwipvDhNL8B2sGeN2zkTsBPCbzBUA3k8zd8L5lf4BFAVeedXP+pya8zsaJwb9TGdSFwCQVIIoH5oY6ANyKjFlvHYQyT0A4BhVOFAKG5d0tLP8igqaDUJ5BxOGj1YfboqJfR5AB4FPSAB/fLBY0OHfW24JjfDS9pawJex8oti6E0lAtu5ZyUa27l3JSLZGKbstXjTAYpkAIDpOsWpYczY/GMiSKPMIuL37Qk/vHbvJxvCCOa4rQwAHxDJztFHfg4iyvb9wI4iMts1BTpQ5UHo49E7S3c/QD0Annn/AwVGYJm4FgAUF8Qzz+J76M3cZZcEisIDOzQVkZrAAFXUBgAIpiwwyn2ium2I8AABwRA/B8CZofHxssLIPARG8979uBxVQPFzcElzhpa13YUso+USxdXskAdm6c5KNbN1zkpFs3efsNnnRaBXLBADRMc2qYc1cfjCQKVFmF57dD83ptfkYPWNU0zVv76h7ErsCwMKnSJNzAFH4eD4jhDIktZVbYwT3W+YdReCT0BUAFmjG08zt698j/RelKpAHVG7OAGYGeSgu6gIAPhCySCDyieK6FOMBgAYjegA6bDb5hixcNhaNL/tgsMPrkauPZ5Hh/xTVx9cy8jhHMpzD47/4Fx99uptiNG6wG0M4Wxt16Kmzte735N/vgqq3BxDt4vuLXcuP+m5O/KrHNQOEt3e3r3MTR7zVhdiXtWt+OywrmazPDUA93Fd82qtWXlzDyREPXF0sFF2rpHiSRAqkm9O0vnks6JXW0auyN3kfrYqZzW01yFo6JSEMGEDoBHISrfXXnaGBn2PjjPi+NnGstVVr1s/TIu6iYgQ+YbAPYGN56wZnTGXU89pAVxIAAudXACJYLd7u5Hvn3hQsXE/1FcZ4gX0WQHXr/hQ/PRI6rf9AIZYYkUnwuCN2bL5AhOglScUiRHdVXGRT9J9hTa0H+dZKTgIfURn9ZCuJxD1q+feF48pEzVHxf6ZtDotC6aiPBpTXnYNmibyhxiWQ16hJGk2TTk5j49pcHznrISXLcPjoXjyL7qO12v4raIhVQOLpe8qCLLNZZPeMTX6tkvcoY1N+3Lg+clEl6S7CRFWURYeLjv0yT9uU/urrwkbNt+Ms+ysCjcAKz7N1tc6uFqHVQYvQoX32t/je8bVtNyQQP6rWCrvAa/vDNeWZ7nnOsDUxfEVIgQxzPmSaC5kFfrecfUoKW/lHUhGY0xBayFMsQBzRTW9d/5m3qdcTVj9/h9BZWAf9ScJkpocTjamoWmXZOJMEhuMGgWpWHGmUyE9msihjgijVMayAsVUeG8zpC7L6YqEHGeBIIiJpAW808RWYRE6HofNLAmKkXFs70Nxl/70AMe1jfUm+wKJJxLalbtlCU+ABmc2IWeVjgVYyuIh+SrLeyQ9DXUScL8SpKUA+bTEtCIgKOa3jvWSVu0B/3AqoqHepvrEA3nB0LSQxy3dMX8RpZJ5BSUMAqYumdWepHnuI/XQewBJXXw2mrjhzjlCehsGI6MSKvXqaNFQvncKU+fAmGIGsBHNDlRBk1eaU+3Gvu/yN+g7BRp1z0FUQkPXkZRjxEzE3VLJZQcFsxoJ5aAtb/zLKbBpk6aQYjInSGrQlnrnzuvOfOYV5qjQtT0XJd5oq+pYJmV39gxMgLlB9uLT9vNhCMpk7A9PJeasWPBbOUlxIJEBqorrIesY35MkdxrFj9WrFDCDCkeyg7Je92OW05tDhKwiEnIWGwKkRpXURVNugtDIoMtm/XAKxpYZnzkT0YYnwxifqwmBJbqW0PtTNZvDU3te/d6b0Pt0X6kNuuKGHIxKDnyDu2Nq9Y3DYcPzDEtHiWZFDck++iCdgE9esQsy40FLokvtZ61HRKCrLTUIfBssNEEmHqbqfik6yMHX2w3v8hqGXdqyQjp0LDb8qhT7G/2Nvu73a78QS+5pYL6H5r9inSqjp8DJNqLnqoP7NvdlQMYSs0W3lopkwOX8O678qIepfbHXEH+ZGCq6yLd6yUA98mJLRse4/6Keyoa+zBb+bnzYhVeddHdxu6zBFhgxX6d63qeoJ6K4wu/seG7C+x49C6HWkkMTli+C1RBMSUdnmAiFYPRAPDHtUHqLPeReao6lgFEeI3EhzfReP1gjC8KlrdklHZoSX7Bj1W0Jnj7Ymv5tnADH3FDh+nVIytDyo1grvA0Do1k1IpVgE7nU8bFBDGRZD69nFSy3UvJf1OWwFrIhmWt90NtqgBDvj0fNHycyDc9QRRGvvgGUshqGtX42vAsO4tSt1DvJQ6UkBEIc+aXWOTVa99+WbOxDhMwRyYCZY7zYk3oihjI4Bj3kL7zfJ+BKQWzHwKH3DpQTdqeg7ED9yoRnQNJDCf7jcillJGhJxBYjYAdKwAaBsJ18S6D9nXmo4/0Lh+nPA8d9ZmIKPXeTN3dBwYB9C0UZp3KYoqKdEXz9k9zMNeD/9a0DyAwKKOmik5CAYeynb8raKJhY0Hc1g6fuEgWwmDO1mktqcDtBQXN5nqXnccYk8F1vfqQz7LE8mGKhHfkgsgwrUyHhBBdQO9F0QmHPB9MQU/YoUL/aNBXi5wPbup2Oa7DLrnACEWxzoLQ9QcTySOhYFZXvgQXcG8zE6q7xukivOOz8H44YT7rJJikywt0kwt1viT6vxy5oDz83yTouI78Z9Ux4EDbiWewhiI0fXSWVKSd+nUSdo2ZnBazv9m/rI9l1cH06KAswFolWytH4qZgmUJoE+lawZcgBlmXclXECDeU123a198j4H7Sq6GWUOTmj6tmqPJxGlopoSbbSo04Ci+jsTiUrROSNhs29ox7p2O98gnnrWh0S6UopfF8fRVZG6/o0nMEt8YpJH0iYKH3oXtdURpgo+zZI0pOnsWBZ5ha+gCftYn2KLHKSbUFQMC49QBm31FifBBwFENHeL0iTllYE5hRs57GbQ0LCI/z+gc5v+qZGBUY9HHYBU100FmUDfBVpn2QrLNamEbNhNWA+ynkyYvoLkZw1HdlmJ0dBB4ZhdmB/+DXVx3/Te3NZymCwMGM4MACcAvRGom6bwE2eKhIqHYVOtV2TgmoQDYw3qHl2HwrD+tM2+1ULm12r5nr4QjRzihyLnP4/edfJtsQWxdvD9YyfJxv/OeGDXhlF0x59Xv+UVvZm9XWFedVoyfQH2I0ztSxo20r1ZKcNmYXJC6PmIRwpNZp9S6lYVLsiUe5jR7JE35OFk1Ozsgojavt1k1ER7IohaZnd7lG8tmreZuYf2C43UlDQOfKx3WICBfv2VmUMjfcmdMTRyJOZ+KZGQ1eolpSWsOZ4qVm/qTnxP/6pP528flWdyglLkU5m6vnxPWUUFAptK2lE3ulEYfoiUlKlzR2TZ4EbuZDYDZwBYRfpZzvraIWXfTgZGt9t5YGE4435gov8/AwAC69pNBjLaXTJwe7sSckCDL15JSOvAiswKkb8HZr4YSLFd4EOchsPx6SL4efP+zAj6uIh2tqyebeyKLeqWraPrvGNyalt0n0tqRy99JfD5NOIPi4QCuTSTZyCZN0z+k9JewzvYJKhG7Kvkb+C/VPzjt3To9L7d5CPHfeXJembyomMU6pqBrBpcPgBncB8GdHkXgBPdZwEt7v4AnFtN0Hgz+wBM4RpYtPUuANO+Bhal2K0/DeT3zp9CPzGBb5MOCQhmi0oUuC4oHJzeUqkCV1gI22uNUzTGm2htZcG/r5QHAIYtTE5JBObnIiy/e4LVSVwaKCltZzKRuLu3rqBNp/eIkDZylGZ5iKMqoI01UReLUOSCj7DIgoEucKMXV4qKb6PKqT8HAj1Djqx/H3a5Fs8Gi2FZ+QVnERFZbSKHHHUN4TdjKApEeG9djAnBN8VfZPXMWsKxZZFvEb/SfJZOfvylx66TqaA2UjxdEG3TyEsSoUQtvZGkAxmzSov9x5toHtyz8+LXAiW68vpsbSnysrUogBb735H6ym8QdV5goZgU/qlQSMj3zjAIVzuFlfZP67IzcKUqA9hWiySaQiksO6PW6oZFO+vkQXcTKJX+asdnsYO7k2364jUgyVxH4jyuT3jl4jOFaOd4PCYixU28cAzA9kxmxEccZ5W+vgP7GIguiEjJc8x5CBsyX2gGQXvtHjQN7C3qAzjYxrKe0y+8RXAt7c4qEQixhKmPGUrUVqHR1/z8iMlni/EVOA29I+fINkuIQEDH59HwqBSfmitPhR/PM0RfBOLM/nyc0Nog1BON5D3QWzrGkMLaEbEkwqTR+V8f3y5gv+n0zn5M850OGBtfAApiQVsVfwwXEJVCH4WQTAl/5dvKHUF8UwJeSWeMRFdgUTnArtnOOdusnXNyWne2c153bnJid8ad2TK4GVI/a0jjrGKyxNhJQC/g6u+U5vLvFLv+O8c+gM7ufQGdYZ+ANyA0BBLy/OULODoFRJg6VoJwIUpx1Q5ZlDeqYRIVFgcTza1wmBQ7Iff+Oo6b7nq0qyjgQSqJSbUwnrDfOQaHtLm1/1GHd/PueSO0kCCUiSxb2Meps4Bad7mIfw39a1lJi0VlI765sx+ESHyMMyLHtuOD0QTK2yLayTMT3spDbUne9K0rp5iUA6XTrEpMk0tzs16wkk8oZzMhe8OHHoWA0sJIJsVXdjWnatsyay3IZRzCeqwY671Eza1dvLGVDCRJOfQDe0TMcB+sHoNJQemqQa2jjXaNyVlbGbtDQ4rfXSh8VfcN6N4xFR1rcp5Z4Jn9OCXcM9NGjSWbZIrBesmF1/iN86BGWmtvuQKJcpVGyYqbTdqAscRuR7cAD1d0p9z5TtnBGAYDRwqt+9ySNJvONDrn2TsDj3pWzmhQWN9R2oF27vxz1ZstYWeyUfI8qFMm5r4MDo+Ctsr+87qX0hum3GVWMnQlG4XCKSnql5PcV/e1RK0sW6K3/viVL6QqwJZkrPRasrNa1YLJxCg+GZMCM0dGRTYrUwDWo88FEaDCcG70apOyr8mXjNXqk7Fa3i6NKI7DKxNmJAwVrMlqh+XWSFHUOrAlVO+1ZGKWliI9qia9ymoJ2UHZqqmWJNZPLdFzQEZDk2Q45f4dufuyS8o1FRlzScWW+ZMeT7YpV1TIuaDiCIr7ur3KycRbtD+jTZyQbYnxmJKzKZThW4vzhdl9lTFufS6uqRIakE5ZNJACeJEQBS5xGgvljbLLN12Dk46bL0dx8TVwgfyy8XfXztmllhRfw7TpInvu/If6SrqmIuEr9krZsr8Ejc0Ts7hEvkwtsUEfGUterwtS5J98OfW5N1wzR8RbUgdCYq9GpuZvp5gHNEM5lZAFJCgJXbElXuiGByUFsMUl/yzkL4nILR4EgzmP4SVD9vyBVOu+ppTAacGj+v65MAWLr55QTV9kMTCfw+GiTCPM25vmGY/4E9+yD9T4hx4XX8pG/iT80Mx8Svng1YFTYKHgtXYqFz4CoTLA647tVU4I7tyfqyMsZX3XHfbFqSVtvZbbn9Hy/ORLoKNYofGbgo28BLeJapnGfgPig6vMrYu9okWpg2IzOyG3fiXpFeW834Q9yuNjJRF0nRjE0fZ7vv05MmviuhRP1dQP13cpQY3Ikf2AJU6UujIlOM5LzEXAi7QYN+iv1OL4Jgwau3Tresb39peHUu+2w591fvm9jY/Ivs5d2VHqqf694D4e9Hb1JnH3/Sx7XOag75knrm9oEFkEfZOChrCJy6RxVY+mUo/OKE6M34npq4GyF8enXlZf1ZBQSj4p8X1PA7hdkMREmnEgCa4iE8CU/Bp4oVCI5sKRaYp+tlQKweAJoJHwJpU7fHwOEQmhk/ntgyLZIGJB6ASXF5aWA6pT76qitdCeKT2QTYcFbffZ1s/7pqnywq3rWziqIKyvGnWIqlexPNQ1nJ+UP3vNTEIzjQksk/Lvy7DvKzGlLMBK/bC2AFjt2Ce+g0kg8gXdVfVW2wk7bstlfOjQAniWAA5wENiA6eLHcmubmEzvObFM+m6z77tB2qlNNcF/EKZWYU4Ty5gjOB0uBgt0GiGcofPoxOJgI0rc4oZRvCWB88saKH8wK6IFCRf4WgmuKMa9kg85JXjvEFKptgC+bQC2ADkDIISw06Li6lgbBlzSOcTlSitaDvhmAdyg0eFisQYARUSlXyPXgqGZdImceg/s3rWzr6sweDPYfqBVDKbaAvh6ACJtg0lTqSZk3mJbZmQmr1qDjAD2hwMGW7fRK77mUitexpHlc1msfthDomF11HS+hC7iq4IvNJhUmg+ONqc8l5R0QmPL89cKWUdTS3zxP8T6bgBB/DPok2JZOob4BOVxrENbnShM98RMysmfaXwqnbBlKYEO54w9X4wABB1OY8eOc3zWgkCodEEh5HqSqJ+aWLVmE//JKkBVrlqdjiJD+Wp9ukD451E7eM/As1ZCpOO7NaSZ13mh8fqGkFptLBwQ5uZ/4mXwf+K7Z8hvL8UmOHxZ0xWokU6fXq0BbuFfC/Lcxv2btgYYUW/YWLekvdmoKxN6qXV8qmEZdfj9d+CAzJudUy91O1bu4og01lJkTOTFHFHRO9frAEkHTzydVJwAQFDCC5wh2TOK6+enMTnXwVNK5RvCOWAFB5I94RgXL4ALTyk1CHLVgmKpIH301fWB8ibto2hKqRhhxQbECESYwtmTffMwaPV5lDDippaKi6GcQVjSBboYG0AODD2g5xXgTQWzKvPV/4IUDNQtRxdMrVYCNU3lT7ZZT3nzCBBAYK8F8DEFjD3RHvLw3sIdSE0GBuhXAELBWbdzUzbxq1A+aYWnYEt7PIxyZgF61g81yJa18fRK+hEl8ifpxh+Piz/xC5QFTuGaOZJsaXYINUAved54PjbeFwUHS5w8kc28cYfGno4OJizliCkGweF0sazgAkhMF/MPxIfj6tWUe+Ve4CTZW2Azf+zx2dM5o8ufVzqdYIoJazr/+HB8sFhuUAJCZw7nm388giN/2eLT4QIzfDocTofzD0ekw8VwASqIMQUxBZ+gEsJMUTv36ivJg5fgcdKsCT6/7IFI7IlGfM7ZE0JF1ndZeh1c50uDytl1k5Gj+UagknbzWfiVteODp9prGD3Fgtek4I65leMugso978cunBIfI8221n9WdL51XyAVAoOdDcc23YDZPt2muhvoS+NhdIbUuylyusTq9HIafR4dP/1zwFurCzmnm6r14eC5Z5cyFG3Icp8oOmLk9xGiQ7ePyOWRv+CFxXxKHhWR9JXwYAj7aqzQy2HtFX4CAKDzUwop3Kj9nAr+BK8I6QgKQipCA4GIAB9BB09owkQtPHUtCgy3wfSvtCzG6sABoxRV4mtaLOZW1Nyhj+Xady2aLyn/yRJcP86JBX2JRXWvHh5fH0N0QTujs5anK1eD9TgfRhJQi3zDL8/hC/kPvW/l0yvzFWOuT7dGZWE4gdFVMT1mTkbBjApPlBihJORJxsYKbxSo6b8r2Ow9WrA3aoEFmxxLGinRqEjEp+FR0ClQN39bcNyzsT3m73wUWguBiACg+/yVXFrBKv9tCbcXUq5bz8Dppkjpq75IvmROd0fGWVSgyQXYJlmjUdOIYIfAQnCCHm64d9LUPqk6KO1NlLGPsiaBGjNqkikJxKGnpx6dEHNlRT7MBRZL1psDk4eR2gN+RXt4M6hZye2qt1iP3xyAkHb6qv2eABhSnUVPIfAUM0JHPAIAFsrs8V0BTIRzxLwph/SN1g9OfWku8e3rCXY36mYvCj41ooH7Y57cpc0s10f4Oc2+Fox36Xv2+QVnCiQEv17N4zMZZAhE/Z2259iqT2baI2Y86YwnA5225+mCdNl5YZKJpQNe8P2HzwAAL1Yz46XcICq45KiUaLaHEzNHIPyZX5f0fY21m899lfmKUfwwUbdx8cGO0E3mvTfUPUOIkNO9FDKA0ViJSQCz4h5bhvuCY2foju96LsPldrCrolih55QtV4rMRHaruo43hCnaOeKBljBczeXNkUm4E7CsEIgnWTyJHry2askAXIS+mt0TV/xV0QAA3W6/ay9u9c1uGkW+QTRnPMqcZXmIyAVr+mn7Ka8ERWFD/moxtAiEQoBTP4OmsArmMYz1Dmmyrt2cwUc0XF2mzHWHC8EeB12GF6FpolsFosagKaJ7Kz2/GlVi3QJxYC+R9Wslt/w6S03FSVwT7eXXXUpy9k0sEZAwcQZXhNsDTWX0SRffyIprm1dJhFynuhD2ObfW3jn50W86OT0J/r4XmCHpKqLHyQLjhhIcnVySdhY7Xv75xrapwWY/MFfwPTn1wjSgsSxdUgmDk7C9WAeMI8kjil2onrJLbrrkSXrasCGQ8p422/I3YfAiXoqnYd6LptEZDxLPS808G7YlzW3RG9ETZ50DN7Z7uevubJaamvpOn0qjdovkBBN3hkq8pcTk+Gv4L82LZQ6aETE7bBQJEB1takIqYVyKUPYZpkT/pbNOZ19smJMNSmTURiiK77wKlZvYu8LmXmQFWP7zwaDaHbgNzBdgNBa+vHgA4TtnwO9I5N2RXI7etwscg7GFisbJi5v6o+68k5pPCiuvaIPwvkjbzOn1smMR7lzRyUKHhGFpzmdRTfOTpKiTOng3ehoHW/5UFM2LkgUg2wgnbcjAmsh+y0zQJj03oA8HJVNColAPYW9cVszdrRntOO2c5OBNqqitHOD1ZP0TiiX+noPLDLTMsx+7FtpmpgUFUsK6clkVK5bnQTn0Dv1WRcoj5qmhf4DN6jPP0xBt/Kk2X5KxA7NmWjs+MBe/zQNFbF+2jvwy0QdG5m6jmaIAHigFhb5LobPU1/My/2TeurS61yasvwNNbVkdM8AgMPSx4oL0yRm1DPqYaWP63AR9vGtb+myCPnW3eX0OQV96Wre+GYK+EK1p3xzJm08RJniX4vz88O5aiH5EegRIWr1q7VMNjO4zY8TcR51Wb8Qp2sQwKeNCUcCG4X1Am0kK0Tfqpw5vLMnjBpLS7ZRUhu7wds3dlAu2/vlaiS6Q/s06h11CjxfxcaoUKzCcx45U9M900Flq4HaXoAEArBWC8LFJcl1vnB1BVAxuZnq9EbNEZ97cDDQ71cG+pUPMXnXtbE1DyZ3rkt0yPYWECgcR1x/UAEKmjYFkAgh3bQukI4DY3eZBLgLIPa0bNEUAmWhNoQH1On103C3+/K2r3vy17GFlcQub/XBW/focHAPICc6nUOAtQ3c/c2JLbrAERGZM0Lpy5F5igG4U8Nm8JoFojvsJL5M/y/zJAHjAg30e2srcWH5yx7VFylr1i2/ZzhZZkrIYSUIDZXLX2ofdKejVbE8P4SFaX9/O4HZ1/5+JuqXnUwfAtqGpuWHvC5xKQ0eqsoJAsLsJ5iBBYXlCAABvQdDJPcQYEAE6/9QOxDm1HaptpH1tL3YO6dAW+UAo1ji6WQ7UFbV/zRmoMWnr20fCpvF1ydcO72AMXxTviK93PFn74/M6cGg8L/4SUpNwwwPRWhMu4PzSBYGIvWfrCpnu+n43ONzQ3Zk/fJxmIOd9zufJ6nSP42x+nd7qB5jucv+YfcTQ3eHW2gCAuvGwtluFwQ2NkS/Ma2h+IvCbm8DcRuNyNZM9JfrMp/dmxbB/MPpW/vz0ri5dSwg03CgdFRnOih9cfEaCwD2nghM13EJ79R6hw220qMI4jTskJhIFOD6fLOn4CFxLB6rZBCJOikDM14zAhHtkDEHA73ediZn8qdYFg0kQ4veVe19nci5/dxNv9XfesugnyIdnOfOolbWxdO+x8K1Vh8mlxMtx05pL1G4i/gr+QYsdFK67TfrGLgV42nwEXlFA9qYaxEUB7WxqQTYU0N2mPOSWHqb8u92V6GFQv9ceTMFqXm4COKQ+yKsinh6LwZ/fAazWf6039dGtZH7/MZKprOkc4TOTLuBLVfOmjzX1OmDHkiQ/OfIHQN0bgVLX+JCYnHC/XhKS89DfbylLpxaALXq63RR6Hdaro05eyxyGixAO65PR7mY9V0iC3Lq3+x/10KBo9f65U0d+L020uPWOAMCdZaK9f9zrNROd+W3UJ4r16UbfnQqvELGaJe3VUPbXoL435ou+fzNxmkn96ZH3j6aQDix1jykaDGOGvv77oexh4UAmz9433Levmf0wG8+yc6l+DfW6db9XyeWvUveUTUiElu5dbconDnSvsKUKocJjqNTjN758m/v0EXl8NLp4fXpIEAHEFMfGE7oDWrlkQZ/Po2J1VRArAoi/nWy42Rbc8Y4AYEqLTvX3eoct7H7EEQV4rpTn0+DYhyu9ubVjWDPvhLU93kHs9bVwewDDhEv3POHt7LGDRL1L0ACARGKYBOcEJ1mFAcHdW6wN66vDMP3M9kxypRPQQ2XF95PTbu1g7aAt3TVPpRVEdmvJtLx081zfBkemU3w0Uyg7mi4hTVzCFr/uzbuyorQR+sOJaNI07YfeeCT+kO2QLDmbIkdBEaZZpTRxoZ2VJSZ8ixPahjMTfYjn1Bi4QxzlmOtyJo7SQ0nOqP2mKz8K6wO0v+3Pr9NmPctarUhmuybxustm3pwRt4U3XZ23xYB1Z4R598GfZWqGGhJXuTMCJ81CrgIuYGVuQH+t+y6oquVLm7wRNB5Kfw1Vg79mfCcKSFEWhPkO/nnQUa02yaStZCVle9twrJ0Qn4Dhxto9COnri5l3buRlSuCV5bDJScQkAbjcNSmWWj3oYJk0yZQvJT2/YoagJNO8d/cqfIpqvRSPdPTw/q0DPyDbIx0/oj8ryM9Ds/3se5JEONLqIfNfN39k/Sck41nltNPfT0eoWWoPvei5O1J3JG98l5d9XQGUrR9v8skdAU7/eDAwfzoVp5zDWL2qlHR4aw0o8xu4LBIWahVb3xrdY3U/rMBWW4UtkX/t2SJneC67unXOuL+WoV1QW2HXVnhQhqqJjdg0x5CoNpEtDZYzkGCh3XN2HcRyloIBAGyjZyaQbK+kpmKBskLNjj9sMKQJt9Nfk5iD6/O2BpoLa9i3hZhb1u5sB5recV6G2WOcbhayR3AGVuZ84Jasy52B7bR5rhq+5EIHY66O0WTgohNr0IytX6Pzn82lO5Pj4DZsqvvqF8pX1zgFiy92MTHTzFutXSjP6x5yRUiLdglda9JV3UKRebjnO3O8mtGEpg/3+tEWO3VSNBow98QxxFRb6m20rTF2V87GETJu/3C7EHanrSdKhGFw6Drh8Lpt5O4VoHiq6lPWdtQeZNdK5Fq7t2Ta/Onm3XzLZJhmXUetz7pM473r3/Ngxg6mfyDu6tqBuzn/46ZaAFIxCGd9OcrrmQYTWPdQ6dPvOO9Q0t6ah/IO7L8LxFEuvNyh4ui4VjpUqozjPGlAi/csEW1L4/ItJQ2VKu2Mg8B8bHLA9tT+XQ5Yu4vapWamWn/HXTGuEHKBdyV0gx7Y/UkDu+2QsKaBE1obNge4UevCHgK3afPYa77EvisIsP0oeZ21jY99atCOjxomXbp0CP+OIWojqOah3Fc7Ptw/Z3ucENRt/oTu7V+vrfvwL12zwA83rNQMBY2qkXr/G3dWIWGVfxfTxztWnIgF3Qx0hVxWDgrycMt53Ic8bV9QpwxBN51OGAAJdzqUMDFzgus1jJCss4fjQBjzMsTCEmx1+J/glnge3v0i/ZfWfw4TOuUAQxzSbfWEESzdc7GSf3e/tP7kMmE8lx2Wl1djmpDsuaxofeylk6uRUn3P1RV5tNF2FWgLuwcrvA3FcqgXDhDeeYIVIwH0q+sBcAQQNh+zntA1UIklhWbD7yHBWap9aHcHnhhGrEhHADAHFh6fG2SEI2Depj46r1hfr1+DC9+b5DUeRxlWorgfhYRAMTaueIhzxT0/o6CzeikYAHAO09k6zM1ce5VbOtGX6elmfqFunYzSZhGXeP2rvM5fp0VfMhH8iM/q++1T7zMjvNLGq77GtxUk5DTfShc7jXcuFq6k43LugpTtTrRgek3BNL21eW56lasMjDrLYDU3SbC9jPVqgJY4HGSATI2eZLxRHbt76J1qdswjQLGsioHIpQDFrGJh3KvDTkap6ncWW5yMUvOqdmYgRz8fz2wcR7ggYxe/Mf8ezLRz5+feSh19zQ78H1WkPNGOi6anWzbV9/zsswMAk1/Q/VF98LP7ICi2MyMGYfjyXAhXD6sz6vCuonwvt542Mj555mIAAMChF1qextCbMMFWgUSZzEe8Rfl8ggcp2D2LwQAAtBRQO8uqF+1sWr0zizuC3k5tXhPILbh+HSVoS67dAQIq5C6RIMNwQSwKMts2xq4d2cJ1mBrbYpPrMFPugu3u/kzaGVfH40XaSyfWs8XIu7wHu/IWsyVMufQn27tMau6ga1x301FEXmuXIwQAxw10rHIPz16kU2L9m4XS43t+FHCiNbi5tmKRgbbA9njZDVzi6B4ciK5t/7hoiNNs61UswkRfkbzRjkI6qg6T6MnT0woyu9LDg+E04AAAo1L/lBYm1eFtXpcwhQVRMKu36Z/L0e6S8NcLzQCAHbxFVOf2qLdiZIvlbZPOPxcWvFYdelcBR9XHNIC3+x1pAqzc6qcoJNXHR1LHgFptk2FAt3aZRtKY3+kgU4v3PT4YH5zcB2nkYFbzITgYih0dyWBcLPhsSKW+xwgmdCR40FllwEcX+NJyK6u/Ny4Pq3uUDxmwakvVBZUl0ar0jg1OPT748z/OHsb/N/QQW9nIqaS3xGeLozO2Yyn+Ox4zRMoVSJtBkrPcc41GIJFzgg0JpPWYdqUkl/Dk6MYxkbRJ0R49xencyZ+rwXV7A2EPl5nuLHAKByZQnnzpVkSyLpUMC0mLF52VOIkbmrJGjkDz7L1zUEh1VSRcHkOHXeXRrfZg8Kqu/FXXmgdU9+F5BFDfAGg8oRRQiSWFvsZNz7EX3MH5QnUv0RfGkhhx4yYBwA648h99YCxDF+aPC+EPPYOfz7YgOd5X0PveM+rnVYeeYebN0cFxLgYo0g1OKQwAOGhLxAazAn7dt/Vi8HdjwvO58/2vN28eex/g8+Ojzpg247mlzEXvHnkO6L1a8EQ7mfp8u5/bWN0WlsEAgI39HLsAKop0yqZxASEmnDHa2W0gvVbnDSTEqcfGHDMkZFK1s3iyid4ZXRAUAPWp2hjUFdQ3aFvQCNS3dhfQPCT66OqAGiRQ5y6DOcKBipTffBT4V5EN8S5pI0F7K92zQnQrUZwLAACcQMfuCAUwxwRFAmky5mwAzjB0xaAaDWEAgGuB6dJXy3HhN4tWbBccuAUPWpzq88QDSdSwuxugUbdjErpyuS4HNpTVcZApjmzAm8g1tDJT1zcCMSfrMk0o53EXprXK6ZjtDN0tnOX0No8dDiMJiZwlbBZib0wpsucGBtOlUcUMkHY8pLbtZ85Ff0GLW/5oYkm7Pl3J69NPs3ToB6fyNeec9ryRFkyjVxU/1ESapHn/HPpfIC3o6n9ga0B8t9HjaA9if1aBk/pt4n+TiT735J/uB3VtBZPBIkgcUvRt0pdw6AhxfiTbW7rS6i0Fccd6MLiqtSpbzKHBdWEVpsteyZ60f949yLPd1qduuSEK6fUajgI732mg7x6Rp2bP0XQOkKoGHAAg1WDQ+gULBjAKcXgas9qGGoCZze6MgYOGF5oBADS+XdmTpX9ZZ8zdYMOdsu6PDaT7tgadK8jorY1RBeDgbuQUNALs/qQlV4WRuG8Oc0NX2hojAt3VtphVkLvlLpjNTZoAO7LR7wUGJnmwLdDBXcYrNlgHnSB2E2KjLytsEcnWsp6eAjtzQe09gimCqhiCtU5lH5p5rUk+7voUhTcSAACmfN3EglP5WnlOf27UCaZ0UsUcJ2xFwWDKc8rFcC3HRzHQ67vA9PmIDZJumwMbnsrj0q1kxpdKJ4bs7Uusd8EMVYbh4AeBcP2f1BeHe7wGrdFkwRHt/Qx55GI5gxWbgWpnOx/NFqHnzk+1WF51H55HAHUGAMcKsjtgicWFdsHqgYvOLvrqAhXcYFQIPP99BACpoF3nP86CkwxzmD/qgrRs07u/vQ323ixbI/agZ9BkHWPhszOz3saCo5WDCphmCX3yYwMFR3umwTg3yf5t+GKKnbBsVgwbwAunu6/dLAk6eI2PfesKE3IlhU6A6alZGhR4mEJn2spewVO9EtdXbbp+gK4Z+3EXxK0rn2diuop4UpXBlfOT7Mm/h6Cq0fCpGuuCMNbAF7p/jYPNjVNqtzTO9tehdaLuTGqKWI/mxerjx3dlUfrb5k8odZ1dOCA31SR72qON0BuV4sZAXYnwU4lz9CbIK8JUKrKxzJD+YO7Oky2gbI0QVFciRHRbGSAg2tYFLCboQMbADgNOGTuGA3AZMyzCwdv87k1rgz9fVet7FU8S37rZz0jeHI13tRAAADiCauidCSjYENwrDie6eznGPAIgwzy3Ik4l4u+cDwYArJHeLoO/ZsFXM9MXCsX2ksMtMR6I0nKmQs/QV1ex+/DEyp00dHCZL6fjXiinUkYIFPIPNA1amWFD07Z1GQqaznCGoV3lmDsOqzyj1gvshC+x9kJUtSvFNERh640iMJCmOSAAyBpMkR9uGtracfuXbjBpy3JaUBlrMTbobns8d6AspjsSlGq2fyGCDHptvWnCvR+8hVdHMfZe4B/tXTon74qzugFIVLmic3EAANPLWhhy6W39XtL1Kk7XkgFdwRCzThHvaGbvgMQ2mQEAYoHB/g7Gl+D9uTjpH85JOXCH0iWXx3YEFZ0YPCv/rkHMVGspCbhJJq93UxmzBuS+K4UHptfubw2IJiNREcTE2mgaZK11cQ1IFGNwHwNj2dFgGFjiwaMDlr7HpDTIbhYPoggKubBEAXNb6rnxXRTZi0SnUHGq6qIOZjB9TR8BwGWBHRuP3d2sEKfuYjkNJiTjBSYNpHlXi5IJMMvLZWoJ3F07FVYBW26NtmuA1bX3225gDrUVVzd8jD6GKqe/rwqbW/B0BaH6A/X5+EICqPQAZE/IC9RiSaOn6fdQ4CJWFGgHo1SMqOhHALAEVzePfb1wB+OrgtQR8jmSTztL6bmcWLsArN9kc/XJY/fymgogbeUQAcMxz8eHnEnBGSwGAwDmfDqppmw9FWflwCmGc1X0volr9L5s5epn8vDVXuXB7Wm1jhZvVbGz5oM7/7t41favd++//fife+PD3MryGqE8eqfrGCrC1vDB7aZ/Jj9PVR/kUeB2m8EAgJRUAHv1BZwFvDTisim1C8yoPm+X4DZq2M8WlqjduRnQFAvJHOgbHTN6omAI7TLbDu+ESIwBc0iswXZYhcRmeSwLJG8Y8JXWufUDI4SzT0KlhiRtLyp+0u0OgVAdPDHMSMk4Q9tKq2OnGdr2uYJ2wIa93fI3DnPv6nAqeikTPYcfLgoDAIb0jrULqgA4l+I0rJTSalOfFzZoqCJsKjkXzc4FS7U7A1/8jPmyBi0YIQNxUlZm5phMVFqXZYMxGMOK4KacnS03uBOHdmuIJKcuHB6x6+9g/D+JsaX5lBZm/39/j/8BVLxy5pQarOp6I7QZFKo5IACAF+yJgSgmmpY0t2GFC5O2vOonjfFUSzB+8x6dl2D0ridY/z1EBbpiPJESKuiKNp4zHpeJV1HaBb6qAHTmZ6n4siYOSKIZD8NOmtL85JCj6wOtrwr2ybvCwo5Ar5pOAIDeYV/7mU784ZCoHIV+GR/CRFAPL9QOkByvHi0ghWdbBWq7yQwA8BKc7Zq2awCd4mMsAXTX/rkIcq8O3WNAdbUxvgEc3o3GDW2l7f7CeVOm7zgk3l1x0tbmHHAu1uXOwNa6C6kaZKrjGgVtZIpwggMOGOKuExMM5m64Kva/S+2MIbeM2f/f7xOhDQ/hwMsKWoSAas4DIeP62yK48qKaWhA5E0E3ypPl7xxgd6EAAGAO5GTzF3oa4lWVIJureE1ZSKJ9gdE10jjWongKGO9lJOVl/K7j/0W2bPvn+3Drf/Zg87cglrtXhSH+2u/j0eUE7tWHMJcWaev2ACFeKY0v4G8qGK5IOHMcvGEE309e79B28qscVtOAbHFUaAOitQzRWqgzcreZh7mtc89zi6zkIcitFNX5YABAHCa1VsHVm7mfqbPScKjh5fSCJH6tof9L+vv6uPWpryoJez6948M7VDedwe7TOwHYhCk4RqbQefQ028JPLQoDANJshCnrC6QDEhlxk46XAWtX6F3y8EFvrx6bRWbI/jU5A8tPcj0p92AAXOiEgF35XByxkDaGPYFYaetC9OB0RKwhYyAwVztJYvvdSNHjYmFPSMd/1inf0e94n36o999UHX7hvMxf+DFpaAZJ3DixlIcp9LeMkGwUlMDanPg3KPO7yidJvXHRM51hTgHm9AInwyWcx+nMtBcqprbQmQJxFAy6LLhGeoPfhZO3f3drbiY7O0+F6cwFJCihz3gfqmBuzgkDAManVVXL1tXYpdNM9sAMYNaEc5WLtbH2WZ03Ja1vath3ho1Nj5U2c1LV4B8WnIWoF+VQRBDGQbpSlMZe4NcU9Pwkb6gkkW/4w626ZtNJwsEQdJ2MuILsWTAF+mmyLvkD+FT+CcF6KjzIcWIF5ilc6IJsyy2DtpA2ZtGEttJty8KAtobuwiJCLrYdoNWgy7Wfs07s6sR67kNHNlTFkhFVIa+nUsRxKatAcw2McVFk5JJyeDqwp7p/rgAy8tsj+Dacpol4U+wY6DLrnxx0Pb68nYJ8ncLtWIvG1B0GdtEiNxu4Ga4L5IueC4oTC5idcW0bZsYWTy0ryP5e2hp2cR5588OvEuHeENRY/wd+gaeeWYu7vt+IW9mpx3H7/vE7nuFhh6dJ+hk2kGmcJwG+Yk+Lvxl6ssISfPkkku8QOKj9bMCC7cFvaZVAmUU44kCP7Tdfq9qV891AIPcirduHo/6FQM3C2UuI4Qe31FqOBmirjr3x0zsV+kUTqjOZFwuDbuIKErqcOddRgcA6615enHLHxd9maKDSF+uQPaWw02DtBsA17AAAIOxl9IuZQF9ANG5hrBOGxau3Ds9laKfwrYVmAEDEYKWKtjEI0hybAQVV/k1ABbXo0dJb2PNMkRdq8FUIc1daCFT4O4pxSx8/pYAf4JsBfOwui/DSrWrz4QlTBfEuVG+mVeWU7jNJwikAyk/rmxAKeqxL1NmGIQZwGCLsNhDndxRmvD/xE9jxX0Em4e73sSWhh7P/UEamG5x4W2wVR7nLnBdCOY4OkEOCxoXFAzAs1rNuYJuXVRYH2Bo3o4sgxzUGvOEiSxYAgK4x+f3x3g1u4To23FBX5jLZFCCOdYlRsSBvuwsldYCCrctVvNUSqzKuu+huF3KJtkUBkcvY2ieDPHbXY6TNDx+1z2YeTbjH/MG3u/tP3t5A/wy4kmwmZlNnR2+6fL7RrqjgVRaDAQAHFWxtaf0arm1WDEsK+X08a/PeNZbeF5+plr2+qoPbC3VOiNj21DhtJ3xTgatiR1OHtQK8YYNSXQBn85waBY0UJGsxGADAU4HwKgwG4Zvav9S7h5W2GH/Wx6FtviD4bl9sWIfRqM0p3N+B4TXUzU8Tvn9uHpmlQtxcqqJUtOIL5K16mGwnjg2HwpsiPhLsuo/p1Gmy5zIOKmiKih501YqKtFY9Zks2r674l5Mza8zV7P863Tf9qtocqqPvE6lvjPrvCS1CMmE85aWQGrogSERZGWnwxbZFrsMXGYOMKVxaynMOkIZspgcpn3msxvlWVvKtohruZL0wb4X8xZvQnmjBHQnbn27dMz0hEymQuGkAAEgWuJLWucyEOwpcDxe8bQQ65z4DAv3L8HOVd6+0qapgMxgAoDoVj11e10Hum0khZx63RBlVYu9UoXc9FWP4V/rqwNxExZVhNBwmZ4xMXmr2uQPtqhZKpcMMCzk5YuzpqLIyZ0DHsXU5BzruMIbzIM93DtDNlfLSdmhvG5CbxYlMRh0qOZYj5Y0h9smmUJVcsr1kdH1xdH1BdH0F0/X9dM02mim1eKOrJJrWiHLGyPaS0vUZdE3+c+J5S7f30zWf0lipRTpdicw5hwyG4EoTp/9qFFmowXUrqi5sIiXctrUgMitgEAtqjckGxMs5boKPauDcUn0a/JfNhvXuDr4Hth6qifu+cVjpsFpX6iP3w9nvMn6kutByExbVhJ/SNdOO1gJeZW7Ipz1W63zQxB3qwdoy9QaEqu1fHYVp/Gri/e6KOHn7adnAtAi3ntbhfA55EzzG5r6tk7c3peumADcvDO4wx//BTx/GbV8WDUzICZdkaFU7CrP6JMwdz94juFSDGQBwDIQWOtqAIWCtRslNnxn72RjpHylrpqZuJwPkxJqzqbCayr+75zVt6F1bMjW7qUSonjXO4tTpGIfMuaAslMgqbJIlP2Bm969s0afumU7bAed16vPQ6SSm8SMlNftvpt+Mmw2nHGGvCborDTRX6dNlr4W9nW1iVBqhGcmkU4A2Gq3amskcNO6zLjO9ch6iMdtdmGFtckZ0mOYE5IzPCZ6LoC0XLYITAySH69ALMfFlhbuGeCLrUadDt5NafUkVYwhKMQ1kR7Cb/NYmobmmBQAAg9HqJrcvITR7xNXIdIMYXChxB3mqLjG+CTQzXYuypekkgxbM5WrNbLSKL7k7CcEVq+4TXaVAcEXxfv1VZIJr7Kpivz64q731t+j/Fxo6l8QIL0AqRH8oQycvx+/ti+LoD5fGF//K4BOdT1Yb8CgTLB5c9sU2rQo9fS9Zv5v0uBAGAKS1WgHVuqarUe6NRjxCD9nr4mDgFzx87jRotXJwk1ITO8lV8B6phnXYS26ttapiQR29G6EPQ7wOgYkwAMBeAjIGjbaqORvgdN6Yw+tAsxWdUlS1ZPAoxBvmXbMYhSy9IR2dHGXcIZnaSWWxi+2kFg1KnaO+r8BbDTTHOuoT5q3GgHmUd57xSvpd47IX3BH6VLs8AABMo+bIMw2h5KDQgxg6JFMtVfJcSzSkn8s7O2XgdJK6JNZxbPf2VNhIrowqR00+TzroSXgd8Ow9j0LFHxkENkjCCHH3c37FPxcyK55oXS4AT2IMF3LnYmkCraLRXlmdKsfGsf7aJNoDp86UOoRHKpFVj9CtMhGNV41v1z/Inrll6QkVUakZbHOlPsi+t8gW2cecWnZ+LXuP9xKXaWc20ZiarTdyKmqGIQ4Npo737xDE9oXNWSS7bS1UBDtljaVFqqtMN96CufIkFnfH/qEKeZWz79wQNuQeUjkaBevufHF3x8nbKxaCFaypYbP3sUqpw3upuIfcR6oMd7uS83UAgOOKihhxJWXDcGXL1sMKctqZjvBq77lmAMCh+HRlW8IKTLYNV3r+X9/993aUoiTOkxT3rkDf3vyf+XuFrwKNetwKyrpbi5mL37uyfI+gu584vL2CPe/n9g+p6/ZK8lvvL3EGM65h3/n1lmjHmG0isu15X9ayVBOu+jMGSQa0yt4MjT/WLyP8nRLDJohSyuqdyXQLbtsN3kKBXbnbsBcUwXUig4O+uJwa787kARZ0EhHv5qIqNOjMg3MoFZH9V8Zg/DBPs/CTuGHgzR/VuAAADLa3/89oo68mV82D8cMcdAYuGgxG4o/DGhMACMt6j7LLU24G1vG294qtNL7OfjOxwkKXmXQVeJVKlN78UIqW05eszbSYwoX3iqAYXTQcCwAU1La2n53dhxUUOnr9O4hC1cNOsw+D3wAYL3TwmZFby4HQKCDI5I42+6Nm1egSFC+FAQA76O4ZhAAT9Gf3tufFyMuWvCbCx9+TPLq9NFjpDvZQvyLUayethS3ExXjkYr+CDltjn14/3tf6LDEPuU4fn5X2XBW3C81zF0yq4vZsDN4xtBZ0z60dAmu9qhaDAQAHh3ZnugtsGKG037Oa3r3Pll+Um9J8FkLXqs9zIUE7JZ1hrVzH3ESFbkDuvmPK9p+Z9uwH3aN7PJsq7vVNr12XGsSZ3Lp8MJNv/FXyVLkgXg3kCdsYXxvy3OoXX850St4uxuDLZMcoU4ADlJ7dZIrLY4PKISiTN6zw7qa+92GMz65grmcc0HEk+/cx+B5Jn4K/N4xmuXFldyOqsWn6kHCt0FcFP9XBzfcT+/kBXXUCnGLACoHI1sX/zqsV63KPoYQG1g3964Dbhv7VEmevBynsEMJs6aIH+A3YOQBjKIwXewqwhifIscrtDAY/vx2l+b0oHJ5DMsSJtRjMVe8PXU/djVB7XIFAzhYMeDSyuV3urD1142583+I32Z2NWc03BJI4Oo3ew1QLpql0kLYoFInsqzpYe/No6WJL4Dn5wZcML+kXj4sOt7LX9Ql5wU7+r0+eDSRPhFs9+kwzH0bC+4Q/pBCV/N9j99bG99MjXrah7FP888CcJRPL5hfHSwJBMXaHLgSlY4N0IzjVaoznicLGGehOWry0qR25IAwAcBzqHb7OglNVikjl5MVzhY6KDK8zL7uBMjNd8DkvInPTuZHbgrBoZ4BVas3fgLW0C8KuDiXagLW3bQy7loB1pH5h53pMxDpdY+cXvM5ujwPEprnO7qFLy+ZA27RDtFRDm6MjtVeBMuxHcppXmih/rS/rLcCctbfx7yMZ15v9SO74SiPnMQEAa8bfNMjlhDct5Rrvgenh+qeDXJqkLpj94kBMsHnaGi9trhsow2krprBQZvO9NzVDoivLjG2I855042Qv6qQGo5Mhh5/5ML3dtLnZge3OzGyH0JQryQo0I7gZxjW+LYQ5bWI52VmIp0k+Fmsz5PMLxRNdcW9QX9qJWIyVee04ez8dcvZGUVGVvkcKMONiZ7PfKgVm1xRcRheGApmY50MVnO7FYADAjApUp76gawCRPM8MvUGNnpbApPWVbtlHOz/R/mwbDbp1IG1Gf58TPI8RcnXELe94+9Qy08Ba1iXV6/hQ8iYuQwrQHxlA4H66IqtX5VibvGGOfThx5zD6y/G3a2GBG7kie5xiOfR6yhlFqJxXonHYV6G/PExfYCdvz6UDXYQ76syf6CFdhsdA9dW/5O0PcpEcBK+0WAEAKAHI6R1yhaEkiIUzSGr1TAM6BRAwz9VrsGQF6akykJ2bZD9B3YJnA0JEpG8MvbBYURHtVuglUAxXw2cQsVxJkYFwfS4Bu3CvEnywDFItJBPx10XMrDpvIz6qaOmFgXLEJ0wGmFVVHqhfDkdWnZysI+WchhO1CRrFpYYEtq/TaYqODxGZ5eqjqZUd7umoAICUu/DDgfPwtM0T27J+eeck+c1z4by4mQ3luluLQfW9RMBL2We4wPOaxnCciCR2ktU8FNj8Er/D/o/SH4be//bMaS23l3LG1IsVvXbULkuH3GzimLOp7o4iiFRRyXgWYAgi1VFKg+lm6J+s7cfOJnpd4D9SHW5RGABQBzTowDdhpnLYEjyPoZfC056d5+5GrnjrSvjmcHgxcZWt3DCg+GSGZM59b1DisTPZymsJIQfrklWuU38nU/qHYCyk1MgTCcO92bNlGD2Ewz/FffCn4E7Y9xMfuroecun6/G5w9+qUsx7/BdRn/2A/gOe49gdftOrTCi8BqAHSb1fOQydWHq5SsmL5ejYbTp5uaGQG1FxuBAYw5SccEFU98jfgGwcWPaqaSnh8TDp6BK7k+eWFeP++s3kQ6PK7sSSwZOMFX1iH5+gSOPi9XH+6b3Y/cBe/Njjxd3h9Lub2VIfg7m/Wkp+fFaehNuqdqY7ORDGO8ewz/p9h5vPT4qo55YurCjzaLX8STLKf3ya4xZamKR30krko8TSYZDFNOu0u7rmLOqZigLFAU5AvYd9lS8pn7Ic+RzyBW5/D3K5n5gsjJ6Lt2NBHfV5KuWVZWr71XOmHmOFbXqFzXlvpmWjWXY6UoLYL+SJh09cnt+Q3hubO8COP6War8uqA+M9XqMh1l2+vFpfL4TU4H7gWB1cBfE7g+UFteZ7vI05o+u3xUsP9UZK3bgCNNCoAAI0D6NY76sWwwgYZaQyKByN1wjQ1oHfxTuXzPe7tCgq3GAwAMFRgKBN+05NcZkfAmOepBTipzpueqSzvJEXPhN9wHt9IQGs3tlLAJ5EEH6A72McDtjmqTJBB2bEBO1WKjpk1YIdWdMvCgB2NYi6sDNhrt25EiT9gb/afYgEQx7Vvp94/l4lQs3y6CpjUYRYL6FszcVtDtcmxChhMZolEADDXAGfpIG4dgHO/+42ekjghnfPv9q0OWvv8q/5UZR8eYx/f3Bvb+L6w7/pON2u7fbO85b0+3MlVn3053tMWO4O5xmTC1TofFrnRPXjqV+QxerGjYvs5jkrsR0f07/RUYf0w5vURO62d6WOAT+g4YLNWNuULi6qrWhCPU+jskS+PeK7S4LlRhzWPfrpIJ9ILzzZo5yfpZcvwbpisaQijY3lrQK64Oq/nkHdP3AUr4aEYG/qyG18xuJYrb+j2zYsdi1sFzZjG586pDdm9b/ZVu28Ca8fKT3aktXL+4rMD4H4jsyPodkZvG7OjPnfMKFeh/TmbB1kgnkauWMd0NbZUxN/JXs5nzij+XXnBF2UTNX/7m3YL63UvByhLwwXhxY7E6cOb7J8rx/4V9POIDU/l+xnxOsT4TbQn6svnbM8VFhiirzobqG7CMllCe++j7cI3F2l9Fnpwe67vKl14wWIFACDG2yl0vCDbVVBV5mBCT8efBwLEyqMvkagiXnxaGABgxJsqw98xPJ0dgTkzzxVnlhvJ2jP0dummQxlAX+Xm2ef5idunR18xMJThcjCJIR0Cbqf687AUB0F1F29XYG9sDGpV4AjbgoYKnMQX0HSLaEPrRhmJjq0BI2ANl+jKA/LuN0k3zNWcDWcUnDBQ+h7AOTO5krUrz+cekJFCPLOL/0THPo/AKTDmixuvK0vq9Ulp3dBwnWkOLa/4R9nkfs4U+aMIo00vYzBL1SeYrb3XoZplSZPq1Mvt2iUSAcDShVxM8UOzkFaK9Q8CpveiHw20NW0tlmkafNyGfV41X7yO/PcUnp3XZ+c1DM43ifNdG/8MbPHaM7ctvH7Bfe58+qy89rq+m+ziscCOY86oWkGDYscthaWA1uVBK5rxV1p9XuVEpti6T79c8Tg7i9Gl/YPz9uvXa4xrQ7a9TcBvPdn3rNsxnjiOveaCMABAc/iioafZem8NEzrTrSm8MECeZ+JARW/YPKvz4gUe8cSeqK0GiQz5/ETRF6Y8InJsl0NmmKSmSUfPzGTmhZOJe7MtW4OchAbDdjJnvzG7bfu2xQH21EJsOTxPXp8nr2ExvnyIdPR26W1/eH5x+D6ensGb1zDs4OA6HwX4qryTBV9CT8HeStOs6KvOZqiL3kwhONHhH+b156T7iGeuqDX6s9CDb73cd5M5wHONCgCAF8CWip1N5zMV2J7S4Pq0qkRnTa1mH8XLjT6SpoF5dvCLXtcnl02dqpxH8t42gwEAvps8UZ92+ka2PkQKETOT9WOHRTjexQxntaCiMg97QDODWT2nPlXwjN+Y1fcVA0N5UfojCuMOSN76sUtoaYQkcZ5DsGRjMJweBbcIz226ZcYtwteaC7MqsHXtG6sALNASsNAEKkiqDCJpMGIJVNt96k6qusBNfp1x5rVkx2sHMvorxoZ/qfU/87VzW1T9Hqi2arYe58Xt4n/WAYCthkgunYswtQKy/iD02p+bEGyVpIofsiQOxfsnBW7rgr8iQaruFF3BbUh3SrUU7SwapCkq//ZDm2P8bd+VPw8n6NvuWj/1sZt6S3d2UOFzb/eMqosIfIhLKXYsxK2UBuOkVa1BZePpFoUBAO4YpoHRVhcsm4VdjefJ6W2KNzo7b6NS9I7T7Znw9o7D1lSeBafbBFm3W5CCM9Ayh2ZhH8yWdrkwmG2D4Qbcon3bPnDLNmLRzKJzqCt5Ps+lYuchzZfhu/7UP+Hl9g2YZmXOe1PfTU4BaSxWAADSzb7uLTXPFd7aGLxG8e7Ka2P60duYUxPgqIYwAGCKfdsWB6xcYPA2Rt4dkd5MZR4xM4ArA7QKq0uxr+YniqC4snpAsQ2CdBewJYTHQbA4DzigBqeqmNkYj/Ex+gWHh1HKDCfiYt/YBnFjC9iDgqriRCmDN7KbvaEhH7bV4/9o8iqpt0UijZeK23fqXPbwbLEu9l5qH4qOLfxsXPvOyZqOi7ptV29mkEylzceyh1rHKduSdPqEVtt98zl85h7vsomK8+M9/w++WIvOoaq8J3yCf7UYvCR8OKm+lE/yGH2CB+m5Dv6JidLoIU/mh/hiOQXtjzhatQ85YkdsD7v/8VPmJEog7ZUKj2jCxvO6LsXNCcLK7+niPQryHDEdafxurmo3xH/8VbK/jwV5rg03y/tvC9T1Rd8JKI2usEZSQgV1ss8+gJtjtpcD\",\"base64\")).toString()),wq}var tEe=new Map([[G.makeIdent(null,\"fsevents\").identHash,Zye],[G.makeIdent(null,\"resolve\").identHash,$ye],[G.makeIdent(null,\"typescript\").identHash,eEe]]),Lct={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,s]of Eq)e(G.parseDescriptor(r,!0),s)},getBuiltinPatch:async(t,e)=>{let r=\"compat/\";if(!e.startsWith(r))return;let s=G.parseIdent(e.slice(r.length)),a=tEe.get(s.identHash)?.();return typeof a<\"u\"?a:null},reduceDependency:async(t,e,r,s)=>typeof tEe.get(t.identHash)>\"u\"?t:G.makeDescriptor(t,G.makeRange({protocol:\"patch:\",source:G.stringifyDescriptor(t),selector:`optional!builtin<compat/${G.stringifyIdent(t)}>`,params:null}))}},Mct=Lct;var _q={};Vt(_q,{ConstraintsCheckCommand:()=>ZC,ConstraintsQueryCommand:()=>zC,ConstraintsSourceCommand:()=>XC,default:()=>nut});Ge();Ge();iS();var YC=class{constructor(e){this.project=e}createEnvironment(){let e=new WC([\"cwd\",\"ident\"]),r=new WC([\"workspace\",\"type\",\"ident\"]),s=new WC([\"ident\"]),a={manifestUpdates:new Map,reportedErrors:new Map},n=new Map,c=new Map;for(let f of this.project.storedPackages.values()){let p=Array.from(f.peerDependencies.values(),h=>[G.stringifyIdent(h),h.range]);n.set(f.locatorHash,{workspace:null,ident:G.stringifyIdent(f),version:f.version,dependencies:new Map,peerDependencies:new Map(p.filter(([h])=>f.peerDependenciesMeta.get(h)?.optional!==!0)),optionalPeerDependencies:new Map(p.filter(([h])=>f.peerDependenciesMeta.get(h)?.optional===!0))})}for(let f of this.project.storedPackages.values()){let p=n.get(f.locatorHash);p.dependencies=new Map(Array.from(f.dependencies.values(),h=>{let E=this.project.storedResolutions.get(h.descriptorHash);if(typeof E>\"u\")throw new Error(\"Assertion failed: The resolution should have been registered\");let C=n.get(E);if(typeof C>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");return[G.stringifyIdent(h),C]})),p.dependencies.delete(p.ident)}for(let f of this.project.workspaces){let p=G.stringifyIdent(f.anchoredLocator),h=f.manifest.exportTo({}),E=n.get(f.anchoredLocator.locatorHash);if(typeof E>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");let C=(R,N,{caller:U=Ui.getCaller()}={})=>{let W=nS(R),ee=je.getMapWithDefault(a.manifestUpdates,f.cwd),ie=je.getMapWithDefault(ee,W),ue=je.getSetWithDefault(ie,N);U!==null&&ue.add(U)},S=R=>C(R,void 0,{caller:Ui.getCaller()}),P=R=>{je.getArrayWithDefault(a.reportedErrors,f.cwd).push(R)},I=e.insert({cwd:f.relativeCwd,ident:p,manifest:h,pkg:E,set:C,unset:S,error:P});c.set(f,I);for(let R of Ut.allDependencies)for(let N of f.manifest[R].values()){let U=G.stringifyIdent(N),W=()=>{C([R,U],void 0,{caller:Ui.getCaller()})},ee=ue=>{C([R,U],ue,{caller:Ui.getCaller()})},ie=null;if(R!==\"peerDependencies\"&&(R!==\"dependencies\"||!f.manifest.devDependencies.has(N.identHash))){let ue=f.anchoredPackage.dependencies.get(N.identHash);if(ue){if(typeof ue>\"u\")throw new Error(\"Assertion failed: The dependency should have been registered\");let le=this.project.storedResolutions.get(ue.descriptorHash);if(typeof le>\"u\")throw new Error(\"Assertion failed: The resolution should have been registered\");let me=n.get(le);if(typeof me>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");ie=me}}r.insert({workspace:I,ident:U,range:N.range,type:R,resolution:ie,update:ee,delete:W,error:P})}}for(let f of this.project.storedPackages.values()){let p=this.project.tryWorkspaceByLocator(f);if(!p)continue;let h=c.get(p);if(typeof h>\"u\")throw new Error(\"Assertion failed: The workspace should have been registered\");let E=n.get(f.locatorHash);if(typeof E>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");E.workspace=h}return{workspaces:e,dependencies:r,packages:s,result:a}}async process(){let e=this.createEnvironment(),r={Yarn:{workspace:a=>e.workspaces.find(a)[0]??null,workspaces:a=>e.workspaces.find(a),dependency:a=>e.dependencies.find(a)[0]??null,dependencies:a=>e.dependencies.find(a),package:a=>e.packages.find(a)[0]??null,packages:a=>e.packages.find(a)}},s=await this.project.loadUserConfig();return s?.constraints?(await s.constraints(r),e.result):null}};Ge();Ge();Yt();var zC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.query=ge.String()}static{this.paths=[[\"constraints\",\"query\"]]}static{this.usage=ot.Usage({category:\"Constraints-related commands\",description:\"query the constraints fact database\",details:`\n      This command will output all matches to the given prolog query.\n    `,examples:[[\"List all dependencies throughout the workspace\",\"yarn constraints query 'workspace_has_dependency(_, DependencyName, _, _).'\"]]})}async execute(){let{Constraints:r}=await Promise.resolve().then(()=>(lS(),aS)),s=await ze.find(this.context.cwd,this.context.plugins),{project:a}=await Tt.find(s,this.context.cwd),n=await r.find(a),c=this.query;return c.endsWith(\".\")||(c=`${c}.`),(await Ot.start({configuration:s,json:this.json,stdout:this.context.stdout},async p=>{for await(let h of n.query(c)){let E=Array.from(Object.entries(h)),C=E.length,S=E.reduce((P,[I])=>Math.max(P,I.length),0);for(let P=0;P<C;P++){let[I,R]=E[P];p.reportInfo(null,`${tut(P,C)}${I.padEnd(S,\" \")} = ${eut(R)}`)}p.reportJson(h)}})).exitCode()}};function eut(t){return typeof t!=\"string\"?`${t}`:t.match(/^[a-zA-Z][a-zA-Z0-9_]+$/)?t:`'${t}'`}function tut(t,e){let r=t===0,s=t===e-1;return r&&s?\"\":r?\"\\u250C \":s?\"\\u2514 \":\"\\u2502 \"}Ge();Yt();var XC=class extends ft{constructor(){super(...arguments);this.verbose=ge.Boolean(\"-v,--verbose\",!1,{description:\"Also print the fact database automatically compiled from the workspace manifests\"})}static{this.paths=[[\"constraints\",\"source\"]]}static{this.usage=ot.Usage({category:\"Constraints-related commands\",description:\"print the source code for the constraints\",details:\"\\n      This command will print the Prolog source code used by the constraints engine. Adding the `-v,--verbose` flag will print the *full* source code, including the fact database automatically compiled from the workspace manifests.\\n    \",examples:[[\"Prints the source code\",\"yarn constraints source\"],[\"Print the source code and the fact database\",\"yarn constraints source -v\"]]})}async execute(){let{Constraints:r}=await Promise.resolve().then(()=>(lS(),aS)),s=await ze.find(this.context.cwd,this.context.plugins),{project:a}=await Tt.find(s,this.context.cwd),n=await r.find(a);this.context.stdout.write(this.verbose?n.fullSource:n.source)}};Ge();Ge();Yt();iS();var ZC=class extends ft{constructor(){super(...arguments);this.fix=ge.Boolean(\"--fix\",!1,{description:\"Attempt to automatically fix unambiguous issues, following a multi-pass process\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"constraints\"]]}static{this.usage=ot.Usage({category:\"Constraints-related commands\",description:\"check that the project constraints are met\",details:`\n      This command will run constraints on your project and emit errors for each one that is found but isn't met. If any error is emitted the process will exit with a non-zero exit code.\n\n      If the \\`--fix\\` flag is used, Yarn will attempt to automatically fix the issues the best it can, following a multi-pass process (with a maximum of 10 iterations). Some ambiguous patterns cannot be autofixed, in which case you'll have to manually specify the right resolution.\n\n      For more information as to how to write constraints, please consult our dedicated page on our website: https://yarnpkg.com/features/constraints.\n    `,examples:[[\"Check that all constraints are satisfied\",\"yarn constraints\"],[\"Autofix all unmet constraints\",\"yarn constraints --fix\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd);await s.restoreInstallState();let a=await s.loadUserConfig(),n;if(a?.constraints)n=new YC(s);else{let{Constraints:h}=await Promise.resolve().then(()=>(lS(),aS));n=await h.find(s)}let c,f=!1,p=!1;for(let h=this.fix?10:1;h>0;--h){let E=await n.process();if(!E)break;let{changedWorkspaces:C,remainingErrors:S}=iF(s,E,{fix:this.fix}),P=[];for(let[I,R]of C){let N=I.manifest.indent;I.manifest=new Ut,I.manifest.indent=N,I.manifest.load(R),P.push(I.persistManifest())}if(await Promise.all(P),!(C.size>0&&h>1)){c=rEe(S,{configuration:r}),f=!1,p=!0;for(let[,I]of S)for(let R of I)R.fixable?f=!0:p=!1}}if(c.children.length===0)return 0;if(f){let h=p?`Those errors can all be fixed by running ${he.pretty(r,\"yarn constraints --fix\",he.Type.CODE)}`:`Errors prefixed by '\\u2699' can be fixed by running ${he.pretty(r,\"yarn constraints --fix\",he.Type.CODE)}`;await Ot.start({configuration:r,stdout:this.context.stdout,includeNames:!1,includeFooter:!1},async E=>{E.reportInfo(0,h),E.reportSeparator()})}return c.children=je.sortMap(c.children,h=>h.value[1]),xs.emitTree(c,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1}),1}};iS();var rut={configuration:{enableConstraintsChecks:{description:\"If true, constraints will run during installs\",type:\"BOOLEAN\",default:!1},constraintsPath:{description:\"The path of the constraints file.\",type:\"ABSOLUTE_PATH\",default:\"./constraints.pro\"}},commands:[zC,XC,ZC],hooks:{async validateProjectAfterInstall(t,{reportError:e}){if(!t.configuration.get(\"enableConstraintsChecks\"))return;let r=await t.loadUserConfig(),s;if(r?.constraints)s=new YC(t);else{let{Constraints:c}=await Promise.resolve().then(()=>(lS(),aS));s=await c.find(t)}let a=await s.process();if(!a)return;let{remainingErrors:n}=iF(t,a);if(n.size!==0)if(t.configuration.isCI)for(let[c,f]of n)for(let p of f)e(84,`${he.pretty(t.configuration,c.anchoredLocator,he.Type.IDENT)}: ${p.text}`);else e(84,`Constraint check failed; run ${he.pretty(t.configuration,\"yarn constraints\",he.Type.CODE)} for more details`)}}},nut=rut;var Hq={};Vt(Hq,{CreateCommand:()=>$C,DlxCommand:()=>ew,default:()=>sut});Ge();Yt();var $C=class extends ft{constructor(){super(...arguments);this.pkg=ge.String(\"-p,--package\",{description:\"The package to run the provided command from\"});this.quiet=ge.Boolean(\"-q,--quiet\",!1,{description:\"Only report critical errors instead of printing the full install logs\"});this.command=ge.String();this.args=ge.Proxy()}static{this.paths=[[\"create\"]]}async execute(){let r=[];this.pkg&&r.push(\"--package\",this.pkg),this.quiet&&r.push(\"--quiet\");let s=this.command.replace(/^(@[^@/]+)(@|$)/,\"$1/create$2\"),a=G.parseDescriptor(s),n=a.name.match(/^create(-|$)/)?a:a.scope?G.makeIdent(a.scope,`create-${a.name}`):G.makeIdent(null,`create-${a.name}`),c=G.stringifyIdent(n);return a.range!==\"unknown\"&&(c+=`@${a.range}`),this.cli.run([\"dlx\",...r,c,...this.args])}};Ge();Ge();Dt();Yt();var ew=class extends ft{constructor(){super(...arguments);this.packages=ge.Array(\"-p,--package\",{description:\"The package(s) to install before running the command\"});this.quiet=ge.Boolean(\"-q,--quiet\",!1,{description:\"Only report critical errors instead of printing the full install logs\"});this.command=ge.String();this.args=ge.Proxy()}static{this.paths=[[\"dlx\"]]}static{this.usage=ot.Usage({description:\"run a package in a temporary environment\",details:\"\\n      This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\\n\\n      By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\\n\\n      Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\\n    \",examples:[[\"Use create-vite to scaffold a new Vite project\",\"yarn dlx create-vite\"],[\"Install multiple packages for a single command\",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e \"console.log('hello!')\"`]]})}async execute(){return ze.telemetry=null,await ce.mktempPromise(async r=>{let s=J.join(r,`dlx-${process.pid}`);await ce.mkdirPromise(s),await ce.writeFilePromise(J.join(s,\"package.json\"),`{}\n`),await ce.writeFilePromise(J.join(s,\"yarn.lock\"),\"\");let a=J.join(s,\".yarnrc.yml\"),n=await ze.findProjectCwd(this.context.cwd),f={enableGlobalCache:!(await ze.find(this.context.cwd,null,{strict:!1})).get(\"enableGlobalCache\"),enableTelemetry:!1,logFilters:[{code:Yf(68),level:he.LogLevel.Discard}]},p=n!==null?J.join(n,\".yarnrc.yml\"):null;p!==null&&ce.existsSync(p)?(await ce.copyFilePromise(p,a),await ze.updateConfiguration(s,N=>{let U=je.toMerged(N,f);return Array.isArray(N.plugins)&&(U.plugins=N.plugins.map(W=>{let ee=typeof W==\"string\"?W:W.path,ie=fe.isAbsolute(ee)?ee:fe.resolve(fe.fromPortablePath(n),ee);return typeof W==\"string\"?ie:{path:ie,spec:W.spec}})),U})):await ce.writeJsonPromise(a,f);let h=this.packages??[this.command],E=G.parseDescriptor(this.command).name,C=await this.cli.run([\"add\",\"--fixed\",\"--\",...h],{cwd:s,quiet:this.quiet});if(C!==0)return C;this.quiet||this.context.stdout.write(`\n`);let S=await ze.find(s,this.context.plugins),{project:P,workspace:I}=await Tt.find(S,s);if(I===null)throw new ar(P.cwd,s);await P.restoreInstallState();let R=await In.getWorkspaceAccessibleBinaries(I);return R.has(E)===!1&&R.size===1&&typeof this.packages>\"u\"&&(E=Array.from(R)[0][0]),await In.executeWorkspaceAccessibleBinary(I,E,this.args,{packageAccessibleBinaries:R,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};var iut={commands:[$C,ew]},sut=iut;var qq={};Vt(qq,{ExecFetcher:()=>uS,ExecResolver:()=>fS,default:()=>lut,execUtils:()=>lF});Ge();Ge();Dt();var cA=\"exec:\";var lF={};Vt(lF,{loadGeneratorFile:()=>cS,makeLocator:()=>Gq,makeSpec:()=>PEe,parseSpec:()=>jq});Ge();Dt();function jq(t){let{params:e,selector:r}=G.parseRange(t),s=fe.toPortablePath(r);return{parentLocator:e&&typeof e.locator==\"string\"?G.parseLocator(e.locator):null,path:s}}function PEe({parentLocator:t,path:e,generatorHash:r,protocol:s}){let a=t!==null?{locator:G.stringifyLocator(t)}:{},n=typeof r<\"u\"?{hash:r}:{};return G.makeRange({protocol:s,source:e,selector:e,params:{...n,...a}})}function Gq(t,{parentLocator:e,path:r,generatorHash:s,protocol:a}){return G.makeLocator(t,PEe({parentLocator:e,path:r,generatorHash:s,protocol:a}))}async function cS(t,e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(t,{protocol:e}),n=J.isAbsolute(a)?{packageFs:new Sn(vt.root),prefixPath:vt.dot,localPath:vt.root}:await r.fetcher.fetch(s,r),c=n.localPath?{packageFs:new Sn(vt.root),prefixPath:J.relative(vt.root,n.localPath)}:n;n!==c&&n.releaseFs&&n.releaseFs();let f=c.packageFs,p=J.join(c.prefixPath,a);return await f.readFilePromise(p,\"utf8\")}var uS=class{supports(e,r){return!!e.reference.startsWith(cA)}getLocalPath(e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(e.reference,{protocol:cA});if(J.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(s,r);return n===null?null:J.resolve(n,a)}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:c}}async fetchFromDisk(e,r){let s=await cS(e.reference,cA,r);return ce.mktempPromise(async a=>{let n=J.join(a,\"generator.js\");return await ce.writeFilePromise(n,s),ce.mktempPromise(async c=>{if(await this.generatePackage(c,e,n,r),!ce.existsSync(J.join(c,\"build\")))throw new Error(\"The script should have generated a build directory\");return await ps.makeArchiveFromDirectory(J.join(c,\"build\"),{prefixPath:G.getIdentVendorPath(e),compressionLevel:r.project.configuration.get(\"compressionLevel\")})})})}async generatePackage(e,r,s,a){return await ce.mktempPromise(async n=>{let c=await In.makeScriptEnv({project:a.project,binFolder:n}),f=J.join(e,\"runtime.js\");return await ce.mktempPromise(async p=>{let h=J.join(p,\"buildfile.log\"),E=J.join(e,\"generator\"),C=J.join(e,\"build\");await ce.mkdirPromise(E),await ce.mkdirPromise(C);let S={tempDir:fe.fromPortablePath(E),buildDir:fe.fromPortablePath(C),locator:G.stringifyLocator(r)};await ce.writeFilePromise(f,`\n          // Expose 'Module' as a global variable\n          Object.defineProperty(global, 'Module', {\n            get: () => require('module'),\n            configurable: true,\n            enumerable: false,\n          });\n\n          // Expose non-hidden built-in modules as global variables\n          for (const name of Module.builtinModules.filter((name) => name !== 'module' && !name.startsWith('_'))) {\n            Object.defineProperty(global, name, {\n              get: () => require(name),\n              configurable: true,\n              enumerable: false,\n            });\n          }\n\n          // Expose the 'execEnv' global variable\n          Object.defineProperty(global, 'execEnv', {\n            value: {\n              ...${JSON.stringify(S)},\n            },\n            enumerable: true,\n          });\n        `);let P=c.NODE_OPTIONS||\"\",I=/\\s*--require\\s+\\S*\\.pnp\\.c?js\\s*/g;P=P.replace(I,\" \").trim(),c.NODE_OPTIONS=P;let{stdout:R,stderr:N}=a.project.configuration.getSubprocessStreams(h,{header:`# This file contains the result of Yarn generating a package (${G.stringifyLocator(r)})\n`,prefix:G.prettyLocator(a.project.configuration,r),report:a.report}),{code:U}=await qr.pipevp(process.execPath,[\"--require\",fe.fromPortablePath(f),fe.fromPortablePath(s),G.stringifyIdent(r)],{cwd:e,env:c,stdin:null,stdout:R,stderr:N});if(U!==0)throw ce.detachTemp(p),new Error(`Package generation failed (exit code ${U}, logs can be found here: ${he.pretty(a.project.configuration,h,he.Type.PATH)})`)})})}};Ge();Ge();var out=2,fS=class{supportsDescriptor(e,r){return!!e.range.startsWith(cA)}supportsLocator(e,r){return!!e.reference.startsWith(cA)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){if(!s.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let{path:a,parentLocator:n}=jq(e.range);if(n===null)throw new Error(\"Assertion failed: The descriptor should have been bound\");let c=await cS(G.makeRange({protocol:cA,source:a,selector:a,params:{locator:G.stringifyLocator(n)}}),cA,s.fetchOptions),f=Nn.makeHash(`${out}`,c).slice(0,6);return[Gq(e,{parentLocator:n,path:a,generatorHash:f,protocol:cA})]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let s=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Ut.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...e,version:a.version||\"0.0.0\",languageName:a.languageName||r.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var aut={fetchers:[uS],resolvers:[fS]},lut=aut;var Yq={};Vt(Yq,{FileFetcher:()=>gS,FileResolver:()=>dS,TarballFileFetcher:()=>mS,TarballFileResolver:()=>yS,default:()=>fut,fileUtils:()=>xm});Ge();Dt();var tw=/^(?:[a-zA-Z]:[\\\\/]|\\.{0,2}\\/)/,AS=/^[^?]*\\.(?:tar\\.gz|tgz)(?:::.*)?$/,es=\"file:\";var xm={};Vt(xm,{fetchArchiveFromLocator:()=>hS,makeArchiveFromLocator:()=>cF,makeBufferFromLocator:()=>Wq,makeLocator:()=>rw,makeSpec:()=>xEe,parseSpec:()=>pS});Ge();Dt();function pS(t){let{params:e,selector:r}=G.parseRange(t),s=fe.toPortablePath(r);return{parentLocator:e&&typeof e.locator==\"string\"?G.parseLocator(e.locator):null,path:s}}function xEe({parentLocator:t,path:e,hash:r,protocol:s}){let a=t!==null?{locator:G.stringifyLocator(t)}:{},n=typeof r<\"u\"?{hash:r}:{};return G.makeRange({protocol:s,source:e,selector:e,params:{...n,...a}})}function rw(t,{parentLocator:e,path:r,hash:s,protocol:a}){return G.makeLocator(t,xEe({parentLocator:e,path:r,hash:s,protocol:a}))}async function hS(t,e){let{parentLocator:r,path:s}=G.parseFileStyleRange(t.reference,{protocol:es}),a=J.isAbsolute(s)?{packageFs:new Sn(vt.root),prefixPath:vt.dot,localPath:vt.root}:await e.fetcher.fetch(r,e),n=a.localPath?{packageFs:new Sn(vt.root),prefixPath:J.relative(vt.root,a.localPath)}:a;a!==n&&a.releaseFs&&a.releaseFs();let c=n.packageFs,f=J.join(n.prefixPath,s);return await je.releaseAfterUseAsync(async()=>await c.readFilePromise(f),n.releaseFs)}async function cF(t,{protocol:e,fetchOptions:r,inMemory:s=!1}){let{parentLocator:a,path:n}=G.parseFileStyleRange(t.reference,{protocol:e}),c=J.isAbsolute(n)?{packageFs:new Sn(vt.root),prefixPath:vt.dot,localPath:vt.root}:await r.fetcher.fetch(a,r),f=c.localPath?{packageFs:new Sn(vt.root),prefixPath:J.relative(vt.root,c.localPath)}:c;c!==f&&c.releaseFs&&c.releaseFs();let p=f.packageFs,h=J.join(f.prefixPath,n);return await je.releaseAfterUseAsync(async()=>await ps.makeArchiveFromDirectory(h,{baseFs:p,prefixPath:G.getIdentVendorPath(t),compressionLevel:r.project.configuration.get(\"compressionLevel\"),inMemory:s}),f.releaseFs)}async function Wq(t,{protocol:e,fetchOptions:r}){return(await cF(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var gS=class{supports(e,r){return!!e.reference.startsWith(es)}getLocalPath(e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(e.reference,{protocol:es});if(J.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(s,r);return n===null?null:J.resolve(n,a)}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:c}}async fetchFromDisk(e,r){return cF(e,{protocol:es,fetchOptions:r})}};Ge();Ge();var cut=2,dS=class{supportsDescriptor(e,r){return e.range.match(tw)?!0:!!e.range.startsWith(es)}supportsLocator(e,r){return!!e.reference.startsWith(es)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){return tw.test(e.range)&&(e=G.makeDescriptor(e,`${es}${e.range}`)),G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){if(!s.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let{path:a,parentLocator:n}=pS(e.range);if(n===null)throw new Error(\"Assertion failed: The descriptor should have been bound\");let c=await Wq(G.makeLocator(e,G.makeRange({protocol:es,source:a,selector:a,params:{locator:G.stringifyLocator(n)}})),{protocol:es,fetchOptions:s.fetchOptions}),f=Nn.makeHash(`${cut}`,c).slice(0,6);return[rw(e,{parentLocator:n,path:a,hash:f,protocol:es})]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let s=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Ut.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...e,version:a.version||\"0.0.0\",languageName:a.languageName||r.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};Ge();var mS=class{supports(e,r){return AS.test(e.reference)?!!e.reference.startsWith(es):!1}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:c}}async fetchFromDisk(e,r){let s=await hS(e,r);return await ps.convertToZip(s,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ge();Ge();Ge();var yS=class{supportsDescriptor(e,r){return AS.test(e.range)?!!(e.range.startsWith(es)||tw.test(e.range)):!1}supportsLocator(e,r){return AS.test(e.reference)?!!e.reference.startsWith(es):!1}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){return tw.test(e.range)&&(e=G.makeDescriptor(e,`${es}${e.range}`)),G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){if(!s.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let{path:a,parentLocator:n}=pS(e.range);if(n===null)throw new Error(\"Assertion failed: The descriptor should have been bound\");let c=rw(e,{parentLocator:n,path:a,hash:\"\",protocol:es}),f=await hS(c,s.fetchOptions),p=Nn.makeHash(f).slice(0,6);return[rw(e,{parentLocator:n,path:a,hash:p,protocol:es})]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let s=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Ut.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...e,version:a.version||\"0.0.0\",languageName:a.languageName||r.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var uut={fetchers:[mS,gS],resolvers:[yS,dS]},fut=uut;var Kq={};Vt(Kq,{GithubFetcher:()=>ES,default:()=>put,githubUtils:()=>uF});Ge();Dt();var uF={};Vt(uF,{invalidGithubUrlMessage:()=>TEe,isGithubUrl:()=>Vq,parseGithubUrl:()=>Jq});var kEe=ut(Ie(\"querystring\")),QEe=[/^https?:\\/\\/(?:([^/]+?)@)?github.com\\/([^/#]+)\\/([^/#]+)\\/tarball\\/([^/#]+)(?:#(.*))?$/,/^https?:\\/\\/(?:([^/]+?)@)?github.com\\/([^/#]+)\\/([^/#]+?)(?:\\.git)?(?:#(.*))?$/];function Vq(t){return t?QEe.some(e=>!!t.match(e)):!1}function Jq(t){let e;for(let f of QEe)if(e=t.match(f),e)break;if(!e)throw new Error(TEe(t));let[,r,s,a,n=\"master\"]=e,{commit:c}=kEe.default.parse(n);return n=c||n.replace(/[^:]*:/,\"\"),{auth:r,username:s,reponame:a,treeish:n}}function TEe(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var ES=class{supports(e,r){return!!Vq(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:c}}async fetchFromNetwork(e,r){let s=await nn.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await ce.mktempPromise(async a=>{let n=new Sn(a);await ps.extractArchiveTo(s,n,{stripComponents:1});let c=ka.splitRepoUrl(e.reference),f=J.join(a,\"package.tgz\");await In.prepareExternalProject(a,f,{configuration:r.project.configuration,report:r.report,workspace:c.extra.workspace,locator:e});let p=await ce.readFilePromise(f);return await ps.convertToZip(p,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:s,username:a,reponame:n,treeish:c}=Jq(e.reference);return`https://${s?`${s}@`:\"\"}github.com/${a}/${n}/archive/${c}.tar.gz`}};var Aut={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let s=new ES;if(!s.supports(e,r))return null;try{return await s.fetch(e,r)}catch{return null}}}},put=Aut;var zq={};Vt(zq,{TarballHttpFetcher:()=>CS,TarballHttpResolver:()=>wS,default:()=>gut});Ge();function IS(t){let e;try{e=new URL(t)}catch{return!1}return!(e.protocol!==\"http:\"&&e.protocol!==\"https:\"||!e.pathname.match(/(\\.tar\\.gz|\\.tgz|\\/[^.]+)$/))}var CS=class{supports(e,r){return IS(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:c}}async fetchFromNetwork(e,r){let s=await nn.get(e.reference,{configuration:r.project.configuration});return await ps.convertToZip(s,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ge();Ge();var wS=class{supportsDescriptor(e,r){return IS(e.range)}supportsLocator(e,r){return IS(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){return[G.convertDescriptorToLocator(e)]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let s=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Ut.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...e,version:a.version||\"0.0.0\",languageName:a.languageName||r.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var hut={fetchers:[CS],resolvers:[wS]},gut=hut;var Xq={};Vt(Xq,{InitCommand:()=>z0,InitInitializerCommand:()=>nw,default:()=>mut});Yt();Ge();Ge();Dt();Yt();var z0=class extends ft{constructor(){super(...arguments);this.private=ge.Boolean(\"-p,--private\",!1,{description:\"Initialize a private package\"});this.workspace=ge.Boolean(\"-w,--workspace\",!1,{description:\"Initialize a workspace root with a `packages/` directory\"});this.install=ge.String(\"-i,--install\",!1,{tolerateBoolean:!0,description:\"Initialize a package with a specific bundle that will be locked in the project\"});this.name=ge.String(\"-n,--name\",{description:\"Initialize a package with the given name\"});this.usev2=ge.Boolean(\"-2\",!1,{hidden:!0});this.yes=ge.Boolean(\"-y,--yes\",{hidden:!0})}static{this.paths=[[\"init\"]]}static{this.usage=ot.Usage({description:\"create a new package\",details:\"\\n      This command will setup a new package in your local directory.\\n\\n      If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\\n\\n      If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\\n\\n      If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\\n\\n      The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\\n    \",examples:[[\"Create a new package in the local directory\",\"yarn init\"],[\"Create a new private package in the local directory\",\"yarn init -p\"],[\"Create a new package and store the Yarn release inside\",\"yarn init -i=latest\"],[\"Create a new private package and defines it as a workspace root\",\"yarn init -w\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=typeof this.install==\"string\"?this.install:this.usev2||this.install===!0?\"latest\":null;return s!==null?await this.executeProxy(r,s):await this.executeRegular(r)}async executeProxy(r,s){if(r.projectCwd!==null&&r.projectCwd!==this.context.cwd)throw new nt(\"Cannot use the --install flag from within a project subdirectory\");ce.existsSync(this.context.cwd)||await ce.mkdirPromise(this.context.cwd,{recursive:!0});let a=J.join(this.context.cwd,Er.lockfile);ce.existsSync(a)||await ce.writeFilePromise(a,\"\");let n=await this.cli.run([\"set\",\"version\",s],{quiet:!0});if(n!==0)return n;let c=[];return this.private&&c.push(\"-p\"),this.workspace&&c.push(\"-w\"),this.name&&c.push(`-n=${this.name}`),this.yes&&c.push(\"-y\"),await ce.mktempPromise(async f=>{let{code:p}=await qr.pipevp(\"yarn\",[\"init\",...c],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await In.makeScriptEnv({binFolder:f})});return p})}async initialize(){}async executeRegular(r){let s=null;try{s=(await Tt.find(r,this.context.cwd)).project}catch{s=null}ce.existsSync(this.context.cwd)||await ce.mkdirPromise(this.context.cwd,{recursive:!0});let a=await Ut.tryFind(this.context.cwd),n=a??new Ut,c=Object.fromEntries(r.get(\"initFields\").entries());n.load(c),n.name=n.name??G.makeIdent(r.get(\"initScope\"),this.name??J.basename(this.context.cwd)),n.packageManager=fn&&je.isTaggedYarnVersion(fn)?`yarn@${fn}`:null,(!a&&this.workspace||this.private)&&(n.private=!0),this.workspace&&n.workspaceDefinitions.length===0&&(await ce.mkdirPromise(J.join(this.context.cwd,\"packages\"),{recursive:!0}),n.workspaceDefinitions=[{pattern:\"packages/*\"}]);let f={};n.exportTo(f);let p=J.join(this.context.cwd,Ut.fileName);await ce.changeFilePromise(p,`${JSON.stringify(f,null,2)}\n`,{automaticNewlines:!0});let h=[p],E=J.join(this.context.cwd,\"README.md\");if(ce.existsSync(E)||(await ce.writeFilePromise(E,`# ${G.stringifyIdent(n.name)}\n`),h.push(E)),!s||s.cwd===this.context.cwd){let C=J.join(this.context.cwd,Er.lockfile);ce.existsSync(C)||(await ce.writeFilePromise(C,\"\"),h.push(C));let P=[\".yarn/*\",\"!.yarn/patches\",\"!.yarn/plugins\",\"!.yarn/releases\",\"!.yarn/sdks\",\"!.yarn/versions\",\"\",\"# Whether you use PnP or not, the node_modules folder is often used to store\",\"# build artifacts that should be gitignored\",\"node_modules\",\"\",\"# Swap the comments on the following lines if you wish to use zero-installs\",\"# In that case, don't forget to run `yarn config set enableGlobalCache false`!\",\"# Documentation here: https://yarnpkg.com/features/caching#zero-installs\",\"\",\"#!.yarn/cache\",\".pnp.*\"].map(ue=>`${ue}\n`).join(\"\"),I=J.join(this.context.cwd,\".gitignore\");ce.existsSync(I)||(await ce.writeFilePromise(I,P),h.push(I));let N=[\"/.yarn/**            linguist-vendored\",\"/.yarn/releases/*    binary\",\"/.yarn/plugins/**/*  binary\",\"/.pnp.*              binary linguist-generated\"].map(ue=>`${ue}\n`).join(\"\"),U=J.join(this.context.cwd,\".gitattributes\");ce.existsSync(U)||(await ce.writeFilePromise(U,N),h.push(U));let W={\"*\":{charset:\"utf-8\",endOfLine:\"lf\",indentSize:2,indentStyle:\"space\",insertFinalNewline:!0}};je.mergeIntoTarget(W,r.get(\"initEditorConfig\"));let ee=`root = true\n`;for(let[ue,le]of Object.entries(W)){ee+=`\n[${ue}]\n`;for(let[me,pe]of Object.entries(le)){let Be=me.replace(/[A-Z]/g,Ce=>`_${Ce.toLowerCase()}`);ee+=`${Be} = ${pe}\n`}}let ie=J.join(this.context.cwd,\".editorconfig\");ce.existsSync(ie)||(await ce.writeFilePromise(ie,ee),h.push(ie)),await this.cli.run([\"install\"],{quiet:!0}),await this.initialize(),ce.existsSync(J.join(this.context.cwd,\".git\"))||(await qr.execvp(\"git\",[\"init\"],{cwd:this.context.cwd}),await qr.execvp(\"git\",[\"add\",\"--\",...h],{cwd:this.context.cwd}),await qr.execvp(\"git\",[\"commit\",\"--allow-empty\",\"-m\",\"First commit\"],{cwd:this.context.cwd}))}}};var nw=class extends z0{constructor(){super(...arguments);this.initializer=ge.String();this.argv=ge.Proxy()}static{this.paths=[[\"init\"]]}async initialize(){this.context.stdout.write(`\n`),await this.cli.run([\"dlx\",this.initializer,...this.argv],{quiet:!0})}};var dut={configuration:{initScope:{description:\"Scope used when creating packages via the init command\",type:\"STRING\",default:null},initFields:{description:\"Additional fields to set when creating packages via the init command\",type:\"MAP\",valueDefinition:{description:\"\",type:\"ANY\"}},initEditorConfig:{description:\"Extra rules to define in the generator editorconfig\",type:\"MAP\",valueDefinition:{description:\"\",type:\"ANY\"}}},commands:[z0,nw]},mut=dut;var JW={};Vt(JW,{SearchCommand:()=>Iw,UpgradeInteractiveCommand:()=>Cw,default:()=>Dgt});Ge();var FEe=ut(Ie(\"os\"));function iw({stdout:t}){if(FEe.default.endianness()===\"BE\")throw new Error(\"Interactive commands cannot be used on big-endian systems because ink depends on yoga-layout-prebuilt which only supports little-endian architectures\");if(!t.isTTY)throw new Error(\"Interactive commands can only be used inside a TTY environment\")}Yt();var YIe=ut(g9()),d9={appId:\"OFCNCOG2CU\",apiKey:\"6fe4476ee5a1832882e326b506d14126\",indexName:\"npm-search\"},hAt=(0,YIe.default)(d9.appId,d9.apiKey).initIndex(d9.indexName),m9=async(t,e=0)=>await hAt.search(t,{analyticsTags:[\"yarn-plugin-interactive-tools\"],attributesToRetrieve:[\"name\",\"version\",\"owner\",\"repository\",\"humanDownloadsLast30Days\"],page:e,hitsPerPage:10});var CD=[\"regular\",\"dev\",\"peer\"],Iw=class extends ft{static{this.paths=[[\"search\"]]}static{this.usage=ot.Usage({category:\"Interactive commands\",description:\"open the search interface\",details:`\n    This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry.\n    `,examples:[[\"Open the search window\",\"yarn search\"]]})}async execute(){iw(this.context);let{Gem:e}=await Promise.resolve().then(()=>(WF(),LW)),{ScrollableItems:r}=await Promise.resolve().then(()=>(KF(),JF)),{useKeypress:s}=await Promise.resolve().then(()=>(yD(),w2e)),{useMinistore:a}=await Promise.resolve().then(()=>(GW(),jW)),{renderForm:n}=await Promise.resolve().then(()=>($F(),ZF)),{default:c}=await Promise.resolve().then(()=>ut(T2e())),{Box:f,Text:p}=await Promise.resolve().then(()=>ut(Wc())),{default:h,useEffect:E,useState:C}=await Promise.resolve().then(()=>ut(hn())),S=await ze.find(this.context.cwd,this.context.plugins),P=()=>h.createElement(f,{flexDirection:\"row\"},h.createElement(f,{flexDirection:\"column\",width:48},h.createElement(f,null,h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<up>\"),\"/\",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<down>\"),\" to move between packages.\")),h.createElement(f,null,h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<space>\"),\" to select a package.\")),h.createElement(f,null,h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<space>\"),\" again to change the target.\"))),h.createElement(f,{flexDirection:\"column\"},h.createElement(f,{marginLeft:1},h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<enter>\"),\" to install the selected packages.\")),h.createElement(f,{marginLeft:1},h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<ctrl+c>\"),\" to abort.\")))),I=()=>h.createElement(h.Fragment,null,h.createElement(f,{width:15},h.createElement(p,{bold:!0,underline:!0,color:\"gray\"},\"Owner\")),h.createElement(f,{width:11},h.createElement(p,{bold:!0,underline:!0,color:\"gray\"},\"Version\")),h.createElement(f,{width:10},h.createElement(p,{bold:!0,underline:!0,color:\"gray\"},\"Downloads\"))),R=()=>h.createElement(f,{width:17},h.createElement(p,{bold:!0,underline:!0,color:\"gray\"},\"Target\")),N=({hit:pe,active:Be})=>{let[Ce,g]=a(pe.name,null);s({active:Be},(Ae,se)=>{if(se.name!==\"space\")return;if(!Ce){g(CD[0]);return}let Z=CD.indexOf(Ce)+1;Z===CD.length?g(null):g(CD[Z])},[Ce,g]);let we=G.parseIdent(pe.name),ye=G.prettyIdent(S,we);return h.createElement(f,null,h.createElement(f,{width:45},h.createElement(p,{bold:!0,wrap:\"wrap\"},ye)),h.createElement(f,{width:14,marginLeft:1},h.createElement(p,{bold:!0,wrap:\"truncate\"},pe.owner.name)),h.createElement(f,{width:10,marginLeft:1},h.createElement(p,{italic:!0,wrap:\"truncate\"},pe.version)),h.createElement(f,{width:16,marginLeft:1},h.createElement(p,null,pe.humanDownloadsLast30Days)))},U=({name:pe,active:Be})=>{let[Ce]=a(pe,null),g=G.parseIdent(pe);return h.createElement(f,null,h.createElement(f,{width:47},h.createElement(p,{bold:!0},\" - \",G.prettyIdent(S,g))),CD.map(we=>h.createElement(f,{key:we,width:14,marginLeft:1},h.createElement(p,null,\" \",h.createElement(e,{active:Ce===we}),\" \",h.createElement(p,{bold:!0},we)))))},W=()=>h.createElement(f,{marginTop:1},h.createElement(p,null,\"Powered by Algolia.\")),ie=await n(({useSubmit:pe})=>{let Be=a();pe(Be);let Ce=Array.from(Be.keys()).filter(j=>Be.get(j)!==null),[g,we]=C(\"\"),[ye,Ae]=C(0),[se,Z]=C([]),De=j=>{j.match(/\\t| /)||we(j)},Re=async()=>{Ae(0);let j=await m9(g);j.query===g&&Z(j.hits)},mt=async()=>{let j=await m9(g,ye+1);j.query===g&&j.page-1===ye&&(Ae(j.page),Z([...se,...j.hits]))};return E(()=>{g?Re():Z([])},[g]),h.createElement(f,{flexDirection:\"column\"},h.createElement(P,null),h.createElement(f,{flexDirection:\"row\",marginTop:1},h.createElement(p,{bold:!0},\"Search: \"),h.createElement(f,{width:41},h.createElement(c,{value:g,onChange:De,placeholder:\"i.e. babel, webpack, react...\",showCursor:!1})),h.createElement(I,null)),se.length?h.createElement(r,{radius:2,loop:!1,children:se.map(j=>h.createElement(N,{key:j.name,hit:j,active:!1})),willReachEnd:mt}):h.createElement(p,{color:\"gray\"},\"Start typing...\"),h.createElement(f,{flexDirection:\"row\",marginTop:1},h.createElement(f,{width:49},h.createElement(p,{bold:!0},\"Selected:\")),h.createElement(R,null)),Ce.length?Ce.map(j=>h.createElement(U,{key:j,name:j,active:!1})):h.createElement(p,{color:\"gray\"},\"No selected packages...\"),h.createElement(W,null))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof ie>\"u\")return 1;let ue=Array.from(ie.keys()).filter(pe=>ie.get(pe)===\"regular\"),le=Array.from(ie.keys()).filter(pe=>ie.get(pe)===\"dev\"),me=Array.from(ie.keys()).filter(pe=>ie.get(pe)===\"peer\");return ue.length&&await this.cli.run([\"add\",...ue]),le.length&&await this.cli.run([\"add\",\"--dev\",...le]),me&&await this.cli.run([\"add\",\"--peer\",...me]),0}};Ge();Yt();YG();var U2e=ut(Ai()),M2e=/^((?:[\\^~]|>=?)?)([0-9]+)(\\.[0-9]+)(\\.[0-9]+)((?:-\\S+)?)$/;function _2e(t,e){return t.length>0?[t.slice(0,e)].concat(_2e(t.slice(e),e)):[]}var Cw=class extends ft{static{this.paths=[[\"upgrade-interactive\"]]}static{this.usage=ot.Usage({category:\"Interactive commands\",description:\"open the upgrade interface\",details:`\n      This command opens a fullscreen terminal interface where you can see any out of date packages used by your application, their status compared to the latest versions available on the remote registry, and select packages to upgrade.\n    `,examples:[[\"Open the upgrade window\",\"yarn upgrade-interactive\"]]})}async execute(){iw(this.context);let{ItemOptions:e}=await Promise.resolve().then(()=>(L2e(),O2e)),{Pad:r}=await Promise.resolve().then(()=>(VW(),N2e)),{ScrollableItems:s}=await Promise.resolve().then(()=>(KF(),JF)),{useMinistore:a}=await Promise.resolve().then(()=>(GW(),jW)),{renderForm:n}=await Promise.resolve().then(()=>($F(),ZF)),{Box:c,Text:f}=await Promise.resolve().then(()=>ut(Wc())),{default:p,useEffect:h,useRef:E,useState:C}=await Promise.resolve().then(()=>ut(hn())),S=await ze.find(this.context.cwd,this.context.plugins),{project:P,workspace:I}=await Tt.find(S,this.context.cwd),R=await Kr.find(S);if(!I)throw new ar(P.cwd,this.context.cwd);await P.restoreInstallState({restoreResolutions:!1});let N=this.context.stdout.rows-7,U=(we,ye)=>{let Ae=mde(we,ye),se=\"\";for(let Z of Ae)Z.added?se+=he.pretty(S,Z.value,\"green\"):Z.removed||(se+=Z.value);return se},W=(we,ye)=>{if(we===ye)return ye;let Ae=G.parseRange(we),se=G.parseRange(ye),Z=Ae.selector.match(M2e),De=se.selector.match(M2e);if(!Z||!De)return U(we,ye);let Re=[\"gray\",\"red\",\"yellow\",\"green\",\"magenta\"],mt=null,j=\"\";for(let rt=1;rt<Re.length;++rt)mt!==null||Z[rt]!==De[rt]?(mt===null&&(mt=Re[rt-1]),j+=he.pretty(S,De[rt],mt)):j+=De[rt];return j},ee=async(we,ye,Ae)=>{let se=await Xu.fetchDescriptorFrom(we,Ae,{project:P,cache:R,preserveModifier:ye,workspace:I});return se!==null?se.range:we.range},ie=async we=>{let ye=U2e.default.valid(we.range)?`^${we.range}`:we.range,[Ae,se]=await Promise.all([ee(we,we.range,ye).catch(()=>null),ee(we,we.range,\"latest\").catch(()=>null)]),Z=[{value:null,label:we.range}];return Ae&&Ae!==we.range?Z.push({value:Ae,label:W(we.range,Ae)}):Z.push({value:null,label:\"\"}),se&&se!==Ae&&se!==we.range?Z.push({value:se,label:W(we.range,se)}):Z.push({value:null,label:\"\"}),Z},ue=()=>p.createElement(c,{flexDirection:\"row\"},p.createElement(c,{flexDirection:\"column\",width:49},p.createElement(c,{marginLeft:1},p.createElement(f,null,\"Press \",p.createElement(f,{bold:!0,color:\"cyanBright\"},\"<up>\"),\"/\",p.createElement(f,{bold:!0,color:\"cyanBright\"},\"<down>\"),\" to select packages.\")),p.createElement(c,{marginLeft:1},p.createElement(f,null,\"Press \",p.createElement(f,{bold:!0,color:\"cyanBright\"},\"<left>\"),\"/\",p.createElement(f,{bold:!0,color:\"cyanBright\"},\"<right>\"),\" to select versions.\"))),p.createElement(c,{flexDirection:\"column\"},p.createElement(c,{marginLeft:1},p.createElement(f,null,\"Press \",p.createElement(f,{bold:!0,color:\"cyanBright\"},\"<enter>\"),\" to install.\")),p.createElement(c,{marginLeft:1},p.createElement(f,null,\"Press \",p.createElement(f,{bold:!0,color:\"cyanBright\"},\"<ctrl+c>\"),\" to abort.\")))),le=()=>p.createElement(c,{flexDirection:\"row\",paddingTop:1,paddingBottom:1},p.createElement(c,{width:50},p.createElement(f,{bold:!0},p.createElement(f,{color:\"greenBright\"},\"?\"),\" Pick the packages you want to upgrade.\")),p.createElement(c,{width:17},p.createElement(f,{bold:!0,underline:!0,color:\"gray\"},\"Current\")),p.createElement(c,{width:17},p.createElement(f,{bold:!0,underline:!0,color:\"gray\"},\"Range\")),p.createElement(c,{width:17},p.createElement(f,{bold:!0,underline:!0,color:\"gray\"},\"Latest\"))),me=({active:we,descriptor:ye,suggestions:Ae})=>{let[se,Z]=a(ye.descriptorHash,null),De=G.stringifyIdent(ye),Re=Math.max(0,45-De.length);return p.createElement(p.Fragment,null,p.createElement(c,null,p.createElement(c,{width:45},p.createElement(f,{bold:!0},G.prettyIdent(S,ye)),p.createElement(r,{active:we,length:Re})),p.createElement(e,{active:we,options:Ae,value:se,skewer:!0,onChange:Z,sizes:[17,17,17]})))},pe=({dependencies:we})=>{let[ye,Ae]=C(we.map(()=>null)),se=E(!0),Z=async De=>{let Re=await ie(De);return Re.filter(mt=>mt.label!==\"\").length<=1?null:{descriptor:De,suggestions:Re}};return h(()=>()=>{se.current=!1},[]),h(()=>{let De=Math.trunc(N*1.75),Re=we.slice(0,De),mt=we.slice(De),j=_2e(mt,N),rt=Re.map(Z).reduce(async(Fe,Ne)=>{await Fe;let Pe=await Ne;Pe!==null&&se.current&&Ae(Ve=>{let ke=Ve.findIndex(Ue=>Ue===null),it=[...Ve];return it[ke]=Pe,it})},Promise.resolve());j.reduce((Fe,Ne)=>Promise.all(Ne.map(Pe=>Promise.resolve().then(()=>Z(Pe)))).then(async Pe=>{Pe=Pe.filter(Ve=>Ve!==null),await Fe,se.current&&Ae(Ve=>{let ke=Ve.findIndex(it=>it===null);return Ve.slice(0,ke).concat(Pe).concat(Ve.slice(ke+Pe.length))})}),rt).then(()=>{se.current&&Ae(Fe=>Fe.filter(Ne=>Ne!==null))})},[]),ye.length?p.createElement(s,{radius:N>>1,children:ye.map((De,Re)=>De!==null?p.createElement(me,{key:Re,active:!1,descriptor:De.descriptor,suggestions:De.suggestions}):p.createElement(f,{key:Re},\"Loading...\"))}):p.createElement(f,null,\"No upgrades found\")},Ce=await n(({useSubmit:we})=>{we(a());let ye=new Map;for(let se of P.workspaces)for(let Z of[\"dependencies\",\"devDependencies\"])for(let De of se.manifest[Z].values())P.tryWorkspaceByDescriptor(De)===null&&(De.range.startsWith(\"link:\")||ye.set(De.descriptorHash,De));let Ae=je.sortMap(ye.values(),se=>G.stringifyDescriptor(se));return p.createElement(c,{flexDirection:\"column\"},p.createElement(ue,null),p.createElement(le,null),p.createElement(pe,{dependencies:Ae}))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof Ce>\"u\")return 1;let g=!1;for(let we of P.workspaces)for(let ye of[\"dependencies\",\"devDependencies\"]){let Ae=we.manifest[ye];for(let se of Ae.values()){let Z=Ce.get(se.descriptorHash);typeof Z<\"u\"&&Z!==null&&(Ae.set(se.identHash,G.makeDescriptor(se,Z)),g=!0)}}return g?await P.installWithNewReport({quiet:this.context.quiet,stdout:this.context.stdout},{cache:R}):0}};var Sgt={commands:[Iw,Cw]},Dgt=Sgt;var zW={};Vt(zW,{default:()=>kgt});Ge();var BD=\"jsr:\";Ge();Ge();function ww(t){let e=t.range.slice(4);if(Fr.validRange(e))return G.makeDescriptor(t,`npm:${G.stringifyIdent(G.wrapIdentIntoScope(t,\"jsr\"))}@${e}`);let r=G.tryParseDescriptor(e,!0);if(r!==null)return G.makeDescriptor(t,`npm:${G.stringifyIdent(G.wrapIdentIntoScope(r,\"jsr\"))}@${r.range}`);throw new Error(`Invalid range: ${t.range}`)}function Bw(t){return G.makeLocator(G.wrapIdentIntoScope(t,\"jsr\"),`npm:${t.reference.slice(4)}`)}function KW(t){return G.makeLocator(G.unwrapIdentFromScope(t,\"jsr\"),`jsr:${t.reference.slice(4)}`)}var eN=class{supports(e,r){return e.reference.startsWith(BD)}getLocalPath(e,r){let s=Bw(e);return r.fetcher.getLocalPath(s,r)}fetch(e,r){let s=Bw(e);return r.fetcher.fetch(s,r)}};var tN=class{supportsDescriptor(e,r){return!!e.range.startsWith(BD)}supportsLocator(e,r){return!!e.reference.startsWith(BD)}shouldPersistResolution(e,r){let s=Bw(e);return r.resolver.shouldPersistResolution(s,r)}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{inner:ww(e)}}async getCandidates(e,r,s){let a=s.project.configuration.normalizeDependency(ww(e));return(await s.resolver.getCandidates(a,r,s)).map(c=>KW(c))}async getSatisfying(e,r,s,a){let n=a.project.configuration.normalizeDependency(ww(e));return a.resolver.getSatisfying(n,r,s,a)}async resolve(e,r){let s=Bw(e),a=await r.resolver.resolve(s,r);return{...a,...KW(a)}}};var bgt=[\"dependencies\",\"devDependencies\",\"peerDependencies\"];function Pgt(t,e){for(let r of bgt)for(let s of t.manifest.getForScope(r).values()){if(!s.range.startsWith(\"jsr:\"))continue;let a=ww(s),n=r===\"dependencies\"?G.makeDescriptor(s,\"unknown\"):null,c=n!==null&&t.manifest.ensureDependencyMeta(n).optional?\"optionalDependencies\":r;e[c][G.stringifyIdent(s)]=a.range}}var xgt={hooks:{beforeWorkspacePacking:Pgt},resolvers:[tN],fetchers:[eN]},kgt=xgt;var XW={};Vt(XW,{LinkFetcher:()=>vD,LinkResolver:()=>SD,PortalFetcher:()=>DD,PortalResolver:()=>bD,default:()=>Tgt});Ge();Dt();var rh=\"portal:\",nh=\"link:\";var vD=class{supports(e,r){return!!e.reference.startsWith(nh)}getLocalPath(e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(e.reference,{protocol:nh});if(J.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(s,r);return n===null?null:J.resolve(n,a)}async fetch(e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(e.reference,{protocol:nh}),n=J.isAbsolute(a)?{packageFs:new Sn(vt.root),prefixPath:vt.dot,localPath:vt.root}:await r.fetcher.fetch(s,r),c=n.localPath?{packageFs:new Sn(vt.root),prefixPath:J.relative(vt.root,n.localPath),localPath:vt.root}:n;n!==c&&n.releaseFs&&n.releaseFs();let f=c.packageFs,p=J.resolve(c.localPath??c.packageFs.getRealPath(),c.prefixPath,a);return n.localPath?{packageFs:new Sn(p,{baseFs:f}),releaseFs:c.releaseFs,prefixPath:vt.dot,discardFromLookup:!0,localPath:p}:{packageFs:new Hf(p,{baseFs:f}),releaseFs:c.releaseFs,prefixPath:vt.dot,discardFromLookup:!0}}};Ge();Dt();var SD=class{supportsDescriptor(e,r){return!!e.range.startsWith(nh)}supportsLocator(e,r){return!!e.reference.startsWith(nh)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){let a=e.range.slice(nh.length);return[G.makeLocator(e,`${nh}${fe.toPortablePath(a)}`)]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){return{...e,version:\"0.0.0\",languageName:r.project.configuration.get(\"defaultLanguageName\"),linkType:\"SOFT\",conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}};Ge();Dt();var DD=class{supports(e,r){return!!e.reference.startsWith(rh)}getLocalPath(e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(e.reference,{protocol:rh});if(J.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(s,r);return n===null?null:J.resolve(n,a)}async fetch(e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(e.reference,{protocol:rh}),n=J.isAbsolute(a)?{packageFs:new Sn(vt.root),prefixPath:vt.dot,localPath:vt.root}:await r.fetcher.fetch(s,r),c=n.localPath?{packageFs:new Sn(vt.root),prefixPath:J.relative(vt.root,n.localPath),localPath:vt.root}:n;n!==c&&n.releaseFs&&n.releaseFs();let f=c.packageFs,p=J.resolve(c.localPath??c.packageFs.getRealPath(),c.prefixPath,a);return n.localPath?{packageFs:new Sn(p,{baseFs:f}),releaseFs:c.releaseFs,prefixPath:vt.dot,localPath:p}:{packageFs:new Hf(p,{baseFs:f}),releaseFs:c.releaseFs,prefixPath:vt.dot}}};Ge();Ge();Dt();var bD=class{supportsDescriptor(e,r){return!!e.range.startsWith(rh)}supportsLocator(e,r){return!!e.reference.startsWith(rh)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){let a=e.range.slice(rh.length);return[G.makeLocator(e,`${rh}${fe.toPortablePath(a)}`)]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let s=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Ut.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...e,version:a.version||\"0.0.0\",languageName:a.languageName||r.project.configuration.get(\"defaultLanguageName\"),linkType:\"SOFT\",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var Qgt={fetchers:[vD,DD],resolvers:[SD,bD]},Tgt=Qgt;var FY={};Vt(FY,{NodeModulesLinker:()=>jD,NodeModulesMode:()=>kY,PnpLooseLinker:()=>GD,default:()=>Kdt});Dt();Ge();Dt();Dt();var $W=(t,e)=>`${t}@${e}`,H2e=(t,e)=>{let r=e.indexOf(\"#\"),s=r>=0?e.substring(r+1):e;return $W(t,s)};var G2e=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),s=e.check||r>=9,a=e.hoistingLimits||new Map,n={check:s,debugLevel:r,hoistingLimits:a,fastLookupPossible:!0},c;n.debugLevel>=0&&(c=Date.now());let f=Ugt(t,n),p=!1,h=0;do{let E=eY(f,[f],new Set([f.locator]),new Map,n);p=E.anotherRoundNeeded||E.isGraphChanged,n.fastLookupPossible=!1,h++}while(p);if(n.debugLevel>=0&&console.log(`hoist time: ${Date.now()-c}ms, rounds: ${h}`),n.debugLevel>=1){let E=PD(f);if(eY(f,[f],new Set([f.locator]),new Map,n).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree:\n${E}, next tree:\n${PD(f)}`);let S=q2e(f);if(S)throw new Error(`${S}, after hoisting finished:\n${PD(f)}`)}return n.debugLevel>=2&&console.log(PD(f)),_gt(f)},Rgt=t=>{let e=t[t.length-1],r=new Map,s=new Set,a=n=>{if(!s.has(n)){s.add(n);for(let c of n.hoistedDependencies.values())r.set(c.name,c);for(let c of n.dependencies.values())n.peerNames.has(c.name)||a(c)}};return a(e),r},Fgt=t=>{let e=t[t.length-1],r=new Map,s=new Set,a=new Set,n=(c,f)=>{if(s.has(c))return;s.add(c);for(let h of c.hoistedDependencies.values())if(!f.has(h.name)){let E;for(let C of t)E=C.dependencies.get(h.name),E&&r.set(E.name,E)}let p=new Set;for(let h of c.dependencies.values())p.add(h.name);for(let h of c.dependencies.values())c.peerNames.has(h.name)||n(h,p)};return n(e,a),r},j2e=(t,e)=>{if(e.decoupled)return e;let{name:r,references:s,ident:a,locator:n,dependencies:c,originalDependencies:f,hoistedDependencies:p,peerNames:h,reasons:E,isHoistBorder:C,hoistPriority:S,dependencyKind:P,hoistedFrom:I,hoistedTo:R}=e,N={name:r,references:new Set(s),ident:a,locator:n,dependencies:new Map(c),originalDependencies:new Map(f),hoistedDependencies:new Map(p),peerNames:new Set(h),reasons:new Map(E),decoupled:!0,isHoistBorder:C,hoistPriority:S,dependencyKind:P,hoistedFrom:new Map(I),hoistedTo:new Map(R)},U=N.dependencies.get(r);return U&&U.ident==N.ident&&N.dependencies.set(r,N),t.dependencies.set(N.name,N),N},Ngt=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let a of t.dependencies.values())t.peerNames.has(a.name)||r.set(a.name,[a.ident]);let s=Array.from(e.keys());s.sort((a,n)=>{let c=e.get(a),f=e.get(n);if(f.hoistPriority!==c.hoistPriority)return f.hoistPriority-c.hoistPriority;{let p=c.dependents.size+c.peerDependents.size;return f.dependents.size+f.peerDependents.size-p}});for(let a of s){let n=a.substring(0,a.indexOf(\"@\",1)),c=a.substring(n.length+1);if(!t.peerNames.has(n)){let f=r.get(n);f||(f=[],r.set(n,f)),f.indexOf(c)<0&&f.push(c)}}return r},ZW=t=>{let e=new Set,r=(s,a=new Set)=>{if(!a.has(s)){a.add(s);for(let n of s.peerNames)if(!t.peerNames.has(n)){let c=t.dependencies.get(n);c&&!e.has(c)&&r(c,a)}e.add(s)}};for(let s of t.dependencies.values())t.peerNames.has(s.name)||r(s);return e},eY=(t,e,r,s,a,n=new Set)=>{let c=e[e.length-1];if(n.has(c))return{anotherRoundNeeded:!1,isGraphChanged:!1};n.add(c);let f=Hgt(c),p=Ngt(c,f),h=t==c?new Map:a.fastLookupPossible?Rgt(e):Fgt(e),E,C=!1,S=!1,P=new Map(Array.from(p.entries()).map(([R,N])=>[R,N[0]])),I=new Map;do{let R=Mgt(t,e,r,h,P,p,s,I,a);R.isGraphChanged&&(S=!0),R.anotherRoundNeeded&&(C=!0),E=!1;for(let[N,U]of p)U.length>1&&!c.dependencies.has(N)&&(P.delete(N),U.shift(),P.set(N,U[0]),E=!0)}while(E);for(let R of c.dependencies.values())if(!c.peerNames.has(R.name)&&!r.has(R.locator)){r.add(R.locator);let N=eY(t,[...e,R],r,I,a);N.isGraphChanged&&(S=!0),N.anotherRoundNeeded&&(C=!0),r.delete(R.locator)}return{anotherRoundNeeded:C,isGraphChanged:S}},Ogt=t=>{for(let[e,r]of t.dependencies)if(!t.peerNames.has(e)&&r.ident!==t.ident)return!0;return!1},Lgt=(t,e,r,s,a,n,c,f,{outputReason:p,fastLookupPossible:h})=>{let E,C=null,S=new Set;p&&(E=`${Array.from(e).map(N=>yo(N)).join(\"\\u2192\")}`);let P=r[r.length-1],R=!(s.ident===P.ident);if(p&&!R&&(C=\"- self-reference\"),R&&(R=s.dependencyKind!==1,p&&!R&&(C=\"- workspace\")),R&&s.dependencyKind===2&&(R=!Ogt(s),p&&!R&&(C=\"- external soft link with unhoisted dependencies\")),R&&(R=!t.peerNames.has(s.name),p&&!R&&(C=`- cannot shadow peer: ${yo(t.originalDependencies.get(s.name).locator)} at ${E}`)),R){let N=!1,U=a.get(s.name);if(N=!U||U.ident===s.ident,p&&!N&&(C=`- filled by: ${yo(U.locator)} at ${E}`),N)for(let W=r.length-1;W>=1;W--){let ie=r[W].dependencies.get(s.name);if(ie&&ie.ident!==s.ident){N=!1;let ue=f.get(P);ue||(ue=new Set,f.set(P,ue)),ue.add(s.name),p&&(C=`- filled by ${yo(ie.locator)} at ${r.slice(0,W).map(le=>yo(le.locator)).join(\"\\u2192\")}`);break}}R=N}if(R&&(R=n.get(s.name)===s.ident,p&&!R&&(C=`- filled by: ${yo(c.get(s.name)[0])} at ${E}`)),R){let N=!0,U=new Set(s.peerNames);for(let W=r.length-1;W>=1;W--){let ee=r[W];for(let ie of U){if(ee.peerNames.has(ie)&&ee.originalDependencies.has(ie))continue;let ue=ee.dependencies.get(ie);ue&&t.dependencies.get(ie)!==ue&&(W===r.length-1?S.add(ue):(S=null,N=!1,p&&(C=`- peer dependency ${yo(ue.locator)} from parent ${yo(ee.locator)} was not hoisted to ${E}`))),U.delete(ie)}if(!N)break}R=N}if(R&&!h)for(let N of s.hoistedDependencies.values()){let U=a.get(N.name)||t.dependencies.get(N.name);if(!U||N.ident!==U.ident){R=!1,p&&(C=`- previously hoisted dependency mismatch, needed: ${yo(N.locator)}, available: ${yo(U?.locator)}`);break}}return S!==null&&S.size>0?{isHoistable:2,dependsOn:S,reason:C}:{isHoistable:R?0:1,reason:C}},rN=t=>`${t.name}@${t.locator}`,Mgt=(t,e,r,s,a,n,c,f,p)=>{let h=e[e.length-1],E=new Set,C=!1,S=!1,P=(U,W,ee,ie,ue)=>{if(E.has(ie))return;let le=[...W,rN(ie)],me=[...ee,rN(ie)],pe=new Map,Be=new Map;for(let Ae of ZW(ie)){let se=Lgt(h,r,[h,...U,ie],Ae,s,a,n,f,{outputReason:p.debugLevel>=2,fastLookupPossible:p.fastLookupPossible});if(Be.set(Ae,se),se.isHoistable===2)for(let Z of se.dependsOn){let De=pe.get(Z.name)||new Set;De.add(Ae.name),pe.set(Z.name,De)}}let Ce=new Set,g=(Ae,se,Z)=>{if(!Ce.has(Ae)){Ce.add(Ae),Be.set(Ae,{isHoistable:1,reason:Z});for(let De of pe.get(Ae.name)||[])g(ie.dependencies.get(De),se,p.debugLevel>=2?`- peer dependency ${yo(Ae.locator)} from parent ${yo(ie.locator)} was not hoisted`:\"\")}};for(let[Ae,se]of Be)se.isHoistable===1&&g(Ae,se,se.reason);let we=!1;for(let Ae of Be.keys())if(!Ce.has(Ae)){S=!0;let se=c.get(ie);se&&se.has(Ae.name)&&(C=!0),we=!0,ie.dependencies.delete(Ae.name),ie.hoistedDependencies.set(Ae.name,Ae),ie.reasons.delete(Ae.name);let Z=h.dependencies.get(Ae.name);if(p.debugLevel>=2){let De=Array.from(W).concat([ie.locator]).map(mt=>yo(mt)).join(\"\\u2192\"),Re=h.hoistedFrom.get(Ae.name);Re||(Re=[],h.hoistedFrom.set(Ae.name,Re)),Re.push(De),ie.hoistedTo.set(Ae.name,Array.from(e).map(mt=>yo(mt.locator)).join(\"\\u2192\"))}if(!Z)h.ident!==Ae.ident&&(h.dependencies.set(Ae.name,Ae),ue.add(Ae));else for(let De of Ae.references)Z.references.add(De)}if(ie.dependencyKind===2&&we&&(C=!0),p.check){let Ae=q2e(t);if(Ae)throw new Error(`${Ae}, after hoisting dependencies of ${[h,...U,ie].map(se=>yo(se.locator)).join(\"\\u2192\")}:\n${PD(t)}`)}let ye=ZW(ie);for(let Ae of ye)if(Ce.has(Ae)){let se=Be.get(Ae);if((a.get(Ae.name)===Ae.ident||!ie.reasons.has(Ae.name))&&se.isHoistable!==0&&ie.reasons.set(Ae.name,se.reason),!Ae.isHoistBorder&&me.indexOf(rN(Ae))<0){E.add(ie);let De=j2e(ie,Ae);P([...U,ie],le,me,De,R),E.delete(ie)}}},I,R=new Set(ZW(h)),N=Array.from(e).map(U=>rN(U));do{I=R,R=new Set;for(let U of I){if(U.locator===h.locator||U.isHoistBorder)continue;let W=j2e(h,U);P([],Array.from(r),N,W,R)}}while(R.size>0);return{anotherRoundNeeded:C,isGraphChanged:S}},q2e=t=>{let e=[],r=new Set,s=new Set,a=(n,c,f)=>{if(r.has(n)||(r.add(n),s.has(n)))return;let p=new Map(c);for(let h of n.dependencies.values())n.peerNames.has(h.name)||p.set(h.name,h);for(let h of n.originalDependencies.values()){let E=p.get(h.name),C=()=>`${Array.from(s).concat([n]).map(S=>yo(S.locator)).join(\"\\u2192\")}`;if(n.peerNames.has(h.name)){let S=c.get(h.name);(S!==E||!S||S.ident!==h.ident)&&e.push(`${C()} - broken peer promise: expected ${h.ident} but found ${S&&S.ident}`)}else{let S=f.hoistedFrom.get(n.name),P=n.hoistedTo.get(h.name),I=`${S?` hoisted from ${S.join(\", \")}`:\"\"}`,R=`${P?` hoisted to ${P}`:\"\"}`,N=`${C()}${I}`;E?E.ident!==h.ident&&e.push(`${N} - broken require promise for ${h.name}${R}: expected ${h.ident}, but found: ${E.ident}`):e.push(`${N} - broken require promise: no required dependency ${h.name}${R} found`)}}s.add(n);for(let h of n.dependencies.values())n.peerNames.has(h.name)||a(h,p,n);s.delete(n)};return a(t,t.dependencies,t),e.join(`\n`)},Ugt=(t,e)=>{let{identName:r,name:s,reference:a,peerNames:n}=t,c={name:s,references:new Set([a]),locator:$W(r,a),ident:H2e(r,a),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(n),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},f=new Map([[t,c]]),p=(h,E)=>{let C=f.get(h),S=!!C;if(!C){let{name:P,identName:I,reference:R,peerNames:N,hoistPriority:U,dependencyKind:W}=h,ee=e.hoistingLimits.get(E.locator);C={name:P,references:new Set([R]),locator:$W(I,R),ident:H2e(I,R),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(N),reasons:new Map,decoupled:!0,isHoistBorder:ee?ee.has(P):!1,hoistPriority:U||0,dependencyKind:W||0,hoistedFrom:new Map,hoistedTo:new Map},f.set(h,C)}if(E.dependencies.set(h.name,C),E.originalDependencies.set(h.name,C),S){let P=new Set,I=R=>{if(!P.has(R)){P.add(R),R.decoupled=!1;for(let N of R.dependencies.values())R.peerNames.has(N.name)||I(N)}};I(C)}else for(let P of h.dependencies)p(P,C)};for(let h of t.dependencies)p(h,c);return c},tY=t=>t.substring(0,t.indexOf(\"@\",1)),_gt=t=>{let e={name:t.name,identName:tY(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),s=(a,n,c)=>{let f=r.has(a),p;if(n===a)p=c;else{let{name:h,references:E,locator:C}=a;p={name:h,identName:tY(C),references:E,dependencies:new Set}}if(c.dependencies.add(p),!f){r.add(a);for(let h of a.dependencies.values())a.peerNames.has(h.name)||s(h,a,p);r.delete(a)}};for(let a of t.dependencies.values())s(a,t,e);return e},Hgt=t=>{let e=new Map,r=new Set([t]),s=c=>`${c.name}@${c.ident}`,a=c=>{let f=s(c),p=e.get(f);return p||(p={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(f,p)),p},n=(c,f)=>{let p=!!r.has(f);if(a(f).dependents.add(c.ident),!p){r.add(f);for(let E of f.dependencies.values()){let C=a(E);C.hoistPriority=Math.max(C.hoistPriority,E.hoistPriority),f.peerNames.has(E.name)?C.peerDependents.add(f.ident):n(f,E)}}};for(let c of t.dependencies.values())t.peerNames.has(c.name)||n(t,c);return e},yo=t=>{if(!t)return\"none\";let e=t.indexOf(\"@\",1),r=t.substring(0,e);r.endsWith(\"$wsroot$\")&&(r=`wh:${r.replace(\"$wsroot$\",\"\")}`);let s=t.substring(e+1);if(s===\"workspace:.\")return\".\";if(s){let a=(s.indexOf(\"#\")>0?s.split(\"#\")[1]:s).replace(\"npm:\",\"\");return s.startsWith(\"virtual\")&&(r=`v:${r}`),a.startsWith(\"workspace\")&&(r=`w:${r}`,a=\"\"),`${r}${a?`@${a}`:\"\"}`}else return`${r}`};var PD=t=>{let e=0,r=(a,n,c=\"\")=>{if(e>5e4||n.has(a))return\"\";e++;let f=Array.from(a.dependencies.values()).sort((h,E)=>h.name===E.name?0:h.name>E.name?1:-1),p=\"\";n.add(a);for(let h=0;h<f.length;h++){let E=f[h];if(!a.peerNames.has(E.name)&&E!==a){let C=a.reasons.get(E.name),S=tY(E.locator);p+=`${c}${h<f.length-1?\"\\u251C\\u2500\":\"\\u2514\\u2500\"}${(n.has(E)?\">\":\"\")+(S!==E.name?`a:${E.name}:`:\"\")+yo(E.locator)+(C?` ${C}`:\"\")}\n`,p+=r(E,n,`${c}${h<f.length-1?\"\\u2502 \":\"  \"}`)}}return n.delete(a),p};return r(t,new Set)+(e>5e4?`\nTree is too large, part of the tree has been dunped\n`:\"\")};var xD=(s=>(s.WORKSPACES=\"workspaces\",s.DEPENDENCIES=\"dependencies\",s.NONE=\"none\",s))(xD||{}),W2e=\"node_modules\",rg=\"$wsroot$\";var kD=(t,e)=>{let{packageTree:r,hoistingLimits:s,errors:a,preserveSymlinksRequired:n}=Ggt(t,e),c=null;if(a.length===0){let f=G2e(r,{hoistingLimits:s});c=Wgt(t,f,e)}return{tree:c,errors:a,preserveSymlinksRequired:n}},pA=t=>`${t.name}@${t.reference}`,nY=t=>{let e=new Map;for(let[r,s]of t.entries())if(!s.dirList){let a=e.get(s.locator);a||(a={target:s.target,linkType:s.linkType,locations:[],aliases:s.aliases},e.set(s.locator,a)),a.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((s,a)=>{let n=s.split(J.delimiter).length,c=a.split(J.delimiter).length;return a===s?0:n!==c?c-n:a>s?1:-1});return e},Y2e=(t,e)=>{let r=G.isVirtualLocator(t)?G.devirtualizeLocator(t):t,s=G.isVirtualLocator(e)?G.devirtualizeLocator(e):e;return G.areLocatorsEqual(r,s)},rY=(t,e,r,s)=>{if(t.linkType!==\"SOFT\")return!1;let a=fe.toPortablePath(r.resolveVirtual&&e.reference&&e.reference.startsWith(\"virtual:\")?r.resolveVirtual(t.packageLocation):t.packageLocation);return J.contains(s,a)===null},jgt=t=>{let e=t.getPackageInformation(t.topLevel);if(e===null)throw new Error(\"Assertion failed: Expected the top-level package to have been registered\");if(t.findPackageLocator(e.packageLocation)===null)throw new Error(\"Assertion failed: Expected the top-level package to have a physical locator\");let s=fe.toPortablePath(e.packageLocation.slice(0,-1)),a=new Map,n={children:new Map},c=t.getDependencyTreeRoots(),f=new Map,p=new Set,h=(S,P)=>{let I=pA(S);if(p.has(I))return;p.add(I);let R=t.getPackageInformation(S);if(R){let N=P?pA(P):\"\";if(pA(S)!==N&&R.linkType===\"SOFT\"&&!S.reference.startsWith(\"link:\")&&!rY(R,S,t,s)){let U=V2e(R,S,t);(!f.get(U)||S.reference.startsWith(\"workspace:\"))&&f.set(U,S)}for(let[U,W]of R.packageDependencies)W!==null&&(R.packagePeers.has(U)||h(t.getLocator(U,W),S))}};for(let S of c)h(S,null);let E=s.split(J.sep);for(let S of f.values()){let P=t.getPackageInformation(S),R=fe.toPortablePath(P.packageLocation.slice(0,-1)).split(J.sep).slice(E.length),N=n;for(let U of R){let W=N.children.get(U);W||(W={children:new Map},N.children.set(U,W)),N=W}N.workspaceLocator=S}let C=(S,P)=>{if(S.workspaceLocator){let I=pA(P),R=a.get(I);R||(R=new Set,a.set(I,R)),R.add(S.workspaceLocator)}for(let I of S.children.values())C(I,S.workspaceLocator||P)};for(let S of n.children.values())C(S,n.workspaceLocator);return a},Ggt=(t,e)=>{let r=[],s=!1,a=new Map,n=jgt(t),c=t.getPackageInformation(t.topLevel);if(c===null)throw new Error(\"Assertion failed: Expected the top-level package to have been registered\");let f=t.findPackageLocator(c.packageLocation);if(f===null)throw new Error(\"Assertion failed: Expected the top-level package to have a physical locator\");let p=fe.toPortablePath(c.packageLocation.slice(0,-1)),h={name:f.name,identName:f.name,reference:f.reference,peerNames:c.packagePeers,dependencies:new Set,dependencyKind:1},E=new Map,C=(P,I)=>`${pA(I)}:${P}`,S=(P,I,R,N,U,W,ee,ie)=>{let ue=C(P,R),le=E.get(ue),me=!!le;!me&&R.name===f.name&&R.reference===f.reference&&(le=h,E.set(ue,h));let pe=rY(I,R,t,p);if(!le){let Ae=0;pe?Ae=2:I.linkType===\"SOFT\"&&R.name.endsWith(rg)&&(Ae=1),le={name:P,identName:R.name,reference:R.reference,dependencies:new Set,peerNames:Ae===1?new Set:I.packagePeers,dependencyKind:Ae},E.set(ue,le)}let Be;if(pe?Be=2:U.linkType===\"SOFT\"?Be=1:Be=0,le.hoistPriority=Math.max(le.hoistPriority||0,Be),ie&&!pe){let Ae=pA({name:N.identName,reference:N.reference}),se=a.get(Ae)||new Set;a.set(Ae,se),se.add(le.name)}let Ce=new Map(I.packageDependencies);if(e.project){let Ae=e.project.workspacesByCwd.get(fe.toPortablePath(I.packageLocation.slice(0,-1)));if(Ae){let se=new Set([...Array.from(Ae.manifest.peerDependencies.values(),Z=>G.stringifyIdent(Z)),...Array.from(Ae.manifest.peerDependenciesMeta.keys())]);for(let Z of se)Ce.has(Z)||(Ce.set(Z,W.get(Z)||null),le.peerNames.add(Z))}}let g=pA({name:R.name.replace(rg,\"\"),reference:R.reference}),we=n.get(g);if(we)for(let Ae of we)Ce.set(`${Ae.name}${rg}`,Ae.reference);(I!==U||I.linkType!==\"SOFT\"||!pe&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(ee)))&&N.dependencies.add(le);let ye=R!==f&&I.linkType===\"SOFT\"&&!R.name.endsWith(rg)&&!pe;if(!me&&!ye){let Ae=new Map;for(let[se,Z]of Ce)if(Z!==null){let De=t.getLocator(se,Z),Re=t.getLocator(se.replace(rg,\"\"),Z),mt=t.getPackageInformation(Re);if(mt===null)throw new Error(\"Assertion failed: Expected the package to have been registered\");let j=rY(mt,De,t,p);if(e.validateExternalSoftLinks&&e.project&&j){mt.packageDependencies.size>0&&(s=!0);for(let[Ve,ke]of mt.packageDependencies)if(ke!==null){let it=G.parseLocator(Array.isArray(ke)?`${ke[0]}@${ke[1]}`:`${Ve}@${ke}`);if(pA(it)!==pA(De)){let Ue=Ce.get(Ve);if(Ue){let x=G.parseLocator(Array.isArray(Ue)?`${Ue[0]}@${Ue[1]}`:`${Ve}@${Ue}`);Y2e(x,it)||r.push({messageName:71,text:`Cannot link ${G.prettyIdent(e.project.configuration,G.parseIdent(De.name))} into ${G.prettyLocator(e.project.configuration,G.parseLocator(`${R.name}@${R.reference}`))} dependency ${G.prettyLocator(e.project.configuration,it)} conflicts with parent dependency ${G.prettyLocator(e.project.configuration,x)}`})}else{let x=Ae.get(Ve);if(x){let w=x.target,b=G.parseLocator(Array.isArray(w)?`${w[0]}@${w[1]}`:`${Ve}@${w}`);Y2e(b,it)||r.push({messageName:71,text:`Cannot link ${G.prettyIdent(e.project.configuration,G.parseIdent(De.name))} into ${G.prettyLocator(e.project.configuration,G.parseLocator(`${R.name}@${R.reference}`))} dependency ${G.prettyLocator(e.project.configuration,it)} conflicts with dependency ${G.prettyLocator(e.project.configuration,b)} from sibling portal ${G.prettyIdent(e.project.configuration,G.parseIdent(x.portal.name))}`})}else Ae.set(Ve,{target:it.reference,portal:De})}}}}let rt=e.hoistingLimitsByCwd?.get(ee),Fe=j?ee:J.relative(p,fe.toPortablePath(mt.packageLocation))||vt.dot,Ne=e.hoistingLimitsByCwd?.get(Fe);S(se,mt,De,le,I,Ce,Fe,rt===\"dependencies\"||Ne===\"dependencies\"||Ne===\"workspaces\")}}};return S(f.name,c,f,h,c,c.packageDependencies,vt.dot,!1),{packageTree:h,hoistingLimits:a,errors:r,preserveSymlinksRequired:s}};function V2e(t,e,r){let s=r.resolveVirtual&&e.reference&&e.reference.startsWith(\"virtual:\")?r.resolveVirtual(t.packageLocation):t.packageLocation;return fe.toPortablePath(s||t.packageLocation)}function qgt(t,e,r){let s=e.getLocator(t.name.replace(rg,\"\"),t.reference),a=e.getPackageInformation(s);if(a===null)throw new Error(\"Assertion failed: Expected the package to be registered\");return r.pnpifyFs?{linkType:\"SOFT\",target:fe.toPortablePath(a.packageLocation)}:{linkType:a.linkType,target:V2e(a,t,e)}}var Wgt=(t,e,r)=>{let s=new Map,a=(E,C,S)=>{let{linkType:P,target:I}=qgt(E,t,r);return{locator:pA(E),nodePath:C,target:I,linkType:P,aliases:S}},n=E=>{let[C,S]=E.split(\"/\");return S?{scope:C,name:S}:{scope:null,name:C}},c=new Set,f=(E,C,S)=>{if(c.has(E))return;c.add(E);let P=Array.from(E.references).sort().join(\"#\");for(let I of E.dependencies){let R=Array.from(I.references).sort().join(\"#\");if(I.identName===E.identName.replace(rg,\"\")&&R===P)continue;let N=Array.from(I.references).sort(),U={name:I.identName,reference:N[0]},{name:W,scope:ee}=n(I.name),ie=ee?[ee,W]:[W],ue=J.join(C,W2e),le=J.join(ue,...ie),me=`${S}/${U.name}`,pe=a(U,S,N.slice(1)),Be=!1;if(pe.linkType===\"SOFT\"&&r.project){let Ce=r.project.workspacesByCwd.get(pe.target.slice(0,-1));Be=!!(Ce&&!Ce.manifest.name)}if(!I.name.endsWith(rg)&&!Be){let Ce=s.get(le);if(Ce){if(Ce.dirList)throw new Error(`Assertion failed: ${le} cannot merge dir node with leaf node`);{let ye=G.parseLocator(Ce.locator),Ae=G.parseLocator(pe.locator);if(Ce.linkType!==pe.linkType)throw new Error(`Assertion failed: ${le} cannot merge nodes with different link types ${Ce.nodePath}/${G.stringifyLocator(ye)} and ${S}/${G.stringifyLocator(Ae)}`);if(ye.identHash!==Ae.identHash)throw new Error(`Assertion failed: ${le} cannot merge nodes with different idents ${Ce.nodePath}/${G.stringifyLocator(ye)} and ${S}/s${G.stringifyLocator(Ae)}`);pe.aliases=[...pe.aliases,...Ce.aliases,G.parseLocator(Ce.locator).reference]}}s.set(le,pe);let g=le.split(\"/\"),we=g.indexOf(W2e);for(let ye=g.length-1;we>=0&&ye>we;ye--){let Ae=fe.toPortablePath(g.slice(0,ye).join(J.sep)),se=g[ye],Z=s.get(Ae);if(!Z)s.set(Ae,{dirList:new Set([se])});else if(Z.dirList){if(Z.dirList.has(se))break;Z.dirList.add(se)}}}f(I,pe.linkType===\"SOFT\"?pe.target:le,me)}},p=a({name:e.name,reference:Array.from(e.references)[0]},\"\",[]),h=p.target;return s.set(h,p),f(e,h,\"\"),s};Ge();Ge();Dt();Dt();eA();wc();var wY={};Vt(wY,{PnpInstaller:()=>Gm,PnpLinker:()=>sg,UnplugCommand:()=>Sw,default:()=>Cdt,getPnpPath:()=>og,jsInstallUtils:()=>gA,pnpUtils:()=>HD,quotePathIfNeeded:()=>QBe});Dt();var kBe=Ie(\"url\");Ge();Ge();Dt();Dt();var J2e={DEFAULT:{collapsed:!1,next:{\"*\":\"DEFAULT\"}},TOP_LEVEL:{collapsed:!1,next:{fallbackExclusionList:\"FALLBACK_EXCLUSION_LIST\",packageRegistryData:\"PACKAGE_REGISTRY_DATA\",\"*\":\"DEFAULT\"}},FALLBACK_EXCLUSION_LIST:{collapsed:!1,next:{\"*\":\"FALLBACK_EXCLUSION_ENTRIES\"}},FALLBACK_EXCLUSION_ENTRIES:{collapsed:!0,next:{\"*\":\"FALLBACK_EXCLUSION_DATA\"}},FALLBACK_EXCLUSION_DATA:{collapsed:!0,next:{\"*\":\"DEFAULT\"}},PACKAGE_REGISTRY_DATA:{collapsed:!1,next:{\"*\":\"PACKAGE_REGISTRY_ENTRIES\"}},PACKAGE_REGISTRY_ENTRIES:{collapsed:!0,next:{\"*\":\"PACKAGE_STORE_DATA\"}},PACKAGE_STORE_DATA:{collapsed:!1,next:{\"*\":\"PACKAGE_STORE_ENTRIES\"}},PACKAGE_STORE_ENTRIES:{collapsed:!0,next:{\"*\":\"PACKAGE_INFORMATION_DATA\"}},PACKAGE_INFORMATION_DATA:{collapsed:!1,next:{packageDependencies:\"PACKAGE_DEPENDENCIES\",\"*\":\"DEFAULT\"}},PACKAGE_DEPENDENCIES:{collapsed:!1,next:{\"*\":\"PACKAGE_DEPENDENCY\"}},PACKAGE_DEPENDENCY:{collapsed:!0,next:{\"*\":\"DEFAULT\"}}};function Ygt(t,e,r){let s=\"\";s+=\"[\";for(let a=0,n=t.length;a<n;++a)s+=nN(String(a),t[a],e,r).replace(/^ +/g,\"\"),a+1<n&&(s+=\", \");return s+=\"]\",s}function Vgt(t,e,r){let s=`${r}  `,a=\"\";a+=r,a+=`[\n`;for(let n=0,c=t.length;n<c;++n)a+=s+nN(String(n),t[n],e,s).replace(/^ +/,\"\"),n+1<c&&(a+=\",\"),a+=`\n`;return a+=r,a+=\"]\",a}function Jgt(t,e,r){let s=Object.keys(t),a=\"\";a+=\"{\";for(let n=0,c=s.length,f=0;n<c;++n){let p=s[n],h=t[p];typeof h>\"u\"||(f!==0&&(a+=\", \"),a+=JSON.stringify(p),a+=\": \",a+=nN(p,h,e,r).replace(/^ +/g,\"\"),f+=1)}return a+=\"}\",a}function Kgt(t,e,r){let s=Object.keys(t),a=`${r}  `,n=\"\";n+=r,n+=`{\n`;let c=0;for(let f=0,p=s.length;f<p;++f){let h=s[f],E=t[h];typeof E>\"u\"||(c!==0&&(n+=\",\",n+=`\n`),n+=a,n+=JSON.stringify(h),n+=\": \",n+=nN(h,E,e,a).replace(/^ +/g,\"\"),c+=1)}return c!==0&&(n+=`\n`),n+=r,n+=\"}\",n}function nN(t,e,r,s){let{next:a}=J2e[r],n=a[t]||a[\"*\"];return K2e(e,n,s)}function K2e(t,e,r){let{collapsed:s}=J2e[e];return Array.isArray(t)?s?Ygt(t,e,r):Vgt(t,e,r):typeof t==\"object\"&&t!==null?s?Jgt(t,e,r):Kgt(t,e,r):JSON.stringify(t)}function z2e(t){return K2e(t,\"TOP_LEVEL\",\"\")}function QD(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let s=[];for(let n of e)s.push(r.map(c=>n(c)));let a=r.map((n,c)=>c);return a.sort((n,c)=>{for(let f of s){let p=f[n]<f[c]?-1:f[n]>f[c]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function zgt(t){let e=new Map,r=QD(t.fallbackExclusionList||[],[({name:s,reference:a})=>s,({name:s,reference:a})=>a]);for(let{name:s,reference:a}of r){let n=e.get(s);typeof n>\"u\"&&e.set(s,n=new Set),n.add(a)}return Array.from(e).map(([s,a])=>[s,Array.from(a)])}function Xgt(t){return QD(t.fallbackPool||[],([e])=>e)}function Zgt(t){let e=[],r=t.dependencyTreeRoots.find(s=>t.packageRegistry.get(s.name)?.get(s.reference)?.packageLocation===\"./\");for(let[s,a]of QD(t.packageRegistry,([n])=>n===null?\"0\":`1${n}`)){if(s===null)continue;let n=[];e.push([s,n]);for(let[c,{packageLocation:f,packageDependencies:p,packagePeers:h,linkType:E,discardFromLookup:C}]of QD(a,([S])=>S===null?\"0\":`1${S}`)){if(c===null)continue;let S=[];s!==null&&c!==null&&!p.has(s)&&S.push([s,c]);for(let[U,W]of p)S.push([U,W]);let P=QD(S,([U])=>U),I=h&&h.size>0?Array.from(h):void 0,N={packageLocation:f,packageDependencies:P,packagePeers:I,linkType:E,discardFromLookup:C||void 0};n.push([c,N]),r&&s===r.name&&c===r.reference&&e.unshift([null,[[null,N]]])}}return e}function TD(t){return{__info:[\"This file is automatically generated. Do not touch it, or risk\",\"your modifications being lost.\"],dependencyTreeRoots:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,pnpZipBackend:t.pnpZipBackend,fallbackExclusionList:zgt(t),fallbackPool:Xgt(t),packageRegistryData:Zgt(t)}}var $2e=ut(Z2e());function eBe(t,e){return[t?`${t}\n`:\"\",`/* eslint-disable */\n`,`// @ts-nocheck\n`,`\"use strict\";\n`,`\n`,e,`\n`,(0,$2e.default)()].join(\"\")}function $gt(t){return JSON.stringify(t,null,2)}function edt(t){return`'${t.replace(/\\\\/g,\"\\\\\\\\\").replace(/'/g,\"\\\\'\").replace(/\\n/g,`\\\\\n`)}'`}function tdt(t){return[`const RAW_RUNTIME_STATE =\n`,`${edt(z2e(t))};\n\n`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) {\n`,`  return hydrateRuntimeState(JSON.parse(RAW_RUNTIME_STATE), {basePath: basePath || __dirname});\n`,`}\n`].join(\"\")}function rdt(){return[`function $$SETUP_STATE(hydrateRuntimeState, basePath) {\n`,`  const fs = require('fs');\n`,`  const path = require('path');\n`,`  const pnpDataFilepath = path.resolve(__dirname, ${JSON.stringify(Er.pnpData)});\n`,`  return hydrateRuntimeState(JSON.parse(fs.readFileSync(pnpDataFilepath, 'utf8')), {basePath: basePath || __dirname});\n`,`}\n`].join(\"\")}function tBe(t){let e=TD(t),r=tdt(e);return eBe(t.shebang,r)}function rBe(t){let e=TD(t),r=rdt(),s=eBe(t.shebang,r);return{dataFile:$gt(e),loaderFile:s}}Dt();function sY(t,{basePath:e}){let r=fe.toPortablePath(e),s=J.resolve(r),a=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,n=new Map,c=new Map(t.packageRegistryData.map(([C,S])=>[C,new Map(S.map(([P,I])=>{if(C===null!=(P===null))throw new Error(\"Assertion failed: The name and reference should be null, or neither should\");let R=I.discardFromLookup??!1,N={name:C,reference:P},U=n.get(I.packageLocation);U?(U.discardFromLookup=U.discardFromLookup&&R,R||(U.locator=N)):n.set(I.packageLocation,{locator:N,discardFromLookup:R});let W=null;return[P,{packageDependencies:new Map(I.packageDependencies),packagePeers:new Set(I.packagePeers),linkType:I.linkType,discardFromLookup:R,get packageLocation(){return W||(W=J.join(s,I.packageLocation))}}]}))])),f=new Map(t.fallbackExclusionList.map(([C,S])=>[C,new Set(S)])),p=new Map(t.fallbackPool),h=t.dependencyTreeRoots,E=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:h,enableTopLevelFallback:E,fallbackExclusionList:f,pnpZipBackend:t.pnpZipBackend,fallbackPool:p,ignorePattern:a,packageLocatorsByLocations:n,packageRegistry:c}}Dt();Dt();var sh=Ie(\"module\"),jm=Ie(\"url\"),gY=Ie(\"util\");var ta=Ie(\"url\");var oBe=ut(Ie(\"assert\"));var oY=Array.isArray,RD=JSON.stringify,FD=Object.getOwnPropertyNames,Hm=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),aY=(t,e)=>RegExp.prototype.exec.call(t,e),lY=(t,...e)=>RegExp.prototype[Symbol.replace].apply(t,e),ng=(t,...e)=>String.prototype.endsWith.apply(t,e),cY=(t,...e)=>String.prototype.includes.apply(t,e),uY=(t,...e)=>String.prototype.lastIndexOf.apply(t,e),ND=(t,...e)=>String.prototype.indexOf.apply(t,e),nBe=(t,...e)=>String.prototype.replace.apply(t,e),ig=(t,...e)=>String.prototype.slice.apply(t,e),hA=(t,...e)=>String.prototype.startsWith.apply(t,e),iBe=Map,sBe=JSON.parse;function OD(t,e,r){return class extends r{constructor(...s){super(e(...s)),this.code=t,this.name=`${r.name} [${t}]`}}}var aBe=OD(\"ERR_PACKAGE_IMPORT_NOT_DEFINED\",(t,e,r)=>`Package import specifier \"${t}\" is not defined${e?` in package ${e}package.json`:\"\"} imported from ${r}`,TypeError),fY=OD(\"ERR_INVALID_MODULE_SPECIFIER\",(t,e,r=void 0)=>`Invalid module \"${t}\" ${e}${r?` imported from ${r}`:\"\"}`,TypeError),lBe=OD(\"ERR_INVALID_PACKAGE_TARGET\",(t,e,r,s=!1,a=void 0)=>{let n=typeof r==\"string\"&&!s&&r.length&&!hA(r,\"./\");return e===\".\"?((0,oBe.default)(s===!1),`Invalid \"exports\" main target ${RD(r)} defined in the package config ${t}package.json${a?` imported from ${a}`:\"\"}${n?'; targets must start with \"./\"':\"\"}`):`Invalid \"${s?\"imports\":\"exports\"}\" target ${RD(r)} defined for '${e}' in the package config ${t}package.json${a?` imported from ${a}`:\"\"}${n?'; targets must start with \"./\"':\"\"}`},Error),LD=OD(\"ERR_INVALID_PACKAGE_CONFIG\",(t,e,r)=>`Invalid package config ${t}${e?` while importing ${e}`:\"\"}${r?`. ${r}`:\"\"}`,Error),cBe=OD(\"ERR_PACKAGE_PATH_NOT_EXPORTED\",(t,e,r=void 0)=>e===\".\"?`No \"exports\" main defined in ${t}package.json${r?` imported from ${r}`:\"\"}`:`Package subpath '${e}' is not defined by \"exports\" in ${t}package.json${r?` imported from ${r}`:\"\"}`,Error);var sN=Ie(\"url\");function uBe(t,e){let r=Object.create(null);for(let s=0;s<e.length;s++){let a=e[s];Hm(t,a)&&(r[a]=t[a])}return r}var iN=new iBe;function ndt(t,e,r,s){let a=iN.get(t);if(a!==void 0)return a;let n=s(t);if(n===void 0){let P={pjsonPath:t,exists:!1,main:void 0,name:void 0,type:\"none\",exports:void 0,imports:void 0};return iN.set(t,P),P}let c;try{c=sBe(n)}catch(P){throw new LD(t,(r?`\"${e}\" from `:\"\")+(0,sN.fileURLToPath)(r||e),P.message)}let{imports:f,main:p,name:h,type:E}=uBe(c,[\"imports\",\"main\",\"name\",\"type\"]),C=Hm(c,\"exports\")?c.exports:void 0;(typeof f!=\"object\"||f===null)&&(f=void 0),typeof p!=\"string\"&&(p=void 0),typeof h!=\"string\"&&(h=void 0),E!==\"module\"&&E!==\"commonjs\"&&(E=\"none\");let S={pjsonPath:t,exists:!0,main:p,name:h,type:E,exports:C,imports:f};return iN.set(t,S),S}function fBe(t,e){let r=new URL(\"./package.json\",t);for(;;){let n=r.pathname;if(ng(n,\"node_modules/package.json\"))break;let c=ndt((0,sN.fileURLToPath)(r),t,void 0,e);if(c.exists)return c;let f=r;if(r=new URL(\"../package.json\",r),r.pathname===f.pathname)break}let s=(0,sN.fileURLToPath)(r),a={pjsonPath:s,exists:!1,main:void 0,name:void 0,type:\"none\",exports:void 0,imports:void 0};return iN.set(s,a),a}function idt(t,e,r){throw new aBe(t,e&&(0,ta.fileURLToPath)(new URL(\".\",e)),(0,ta.fileURLToPath)(r))}function sdt(t,e,r,s){let a=`request is not a valid subpath for the \"${r?\"imports\":\"exports\"}\" resolution of ${(0,ta.fileURLToPath)(e)}`;throw new fY(t,a,s&&(0,ta.fileURLToPath)(s))}function MD(t,e,r,s,a){throw typeof e==\"object\"&&e!==null?e=RD(e,null,\"\"):e=`${e}`,new lBe((0,ta.fileURLToPath)(new URL(\".\",r)),t,e,s,a&&(0,ta.fileURLToPath)(a))}var ABe=/(^|\\\\|\\/)((\\.|%2e)(\\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\\\|\\/|$)/i,pBe=/\\*/g;function odt(t,e,r,s,a,n,c,f){if(e!==\"\"&&!n&&t[t.length-1]!==\"/\"&&MD(r,t,s,c,a),!hA(t,\"./\")){if(c&&!hA(t,\"../\")&&!hA(t,\"/\")){let C=!1;try{new URL(t),C=!0}catch{}if(!C)return n?lY(pBe,t,()=>e):t+e}MD(r,t,s,c,a)}aY(ABe,ig(t,2))!==null&&MD(r,t,s,c,a);let p=new URL(t,s),h=p.pathname,E=new URL(\".\",s).pathname;if(hA(h,E)||MD(r,t,s,c,a),e===\"\")return p;if(aY(ABe,e)!==null){let C=n?nBe(r,\"*\",()=>e):r+e;sdt(C,s,c,a)}return n?new URL(lY(pBe,p.href,()=>e)):new URL(e,p)}function adt(t){let e=+t;return`${e}`!==t?!1:e>=0&&e<4294967295}function vw(t,e,r,s,a,n,c,f){if(typeof e==\"string\")return odt(e,r,s,t,a,n,c,f);if(oY(e)){if(e.length===0)return null;let p;for(let h=0;h<e.length;h++){let E=e[h],C;try{C=vw(t,E,r,s,a,n,c,f)}catch(S){if(p=S,S.code===\"ERR_INVALID_PACKAGE_TARGET\")continue;throw S}if(C!==void 0){if(C===null){p=null;continue}return C}}if(p==null)return p;throw p}else if(typeof e==\"object\"&&e!==null){let p=FD(e);for(let h=0;h<p.length;h++){let E=p[h];if(adt(E))throw new LD((0,ta.fileURLToPath)(t),a,'\"exports\" cannot contain numeric property keys.')}for(let h=0;h<p.length;h++){let E=p[h];if(E===\"default\"||f.has(E)){let C=e[E],S=vw(t,C,r,s,a,n,c,f);if(S===void 0)continue;return S}}return}else if(e===null)return null;MD(s,e,t,c,a)}function gBe(t,e){let r=ND(t,\"*\"),s=ND(e,\"*\"),a=r===-1?t.length:r+1,n=s===-1?e.length:s+1;return a>n?-1:n>a||r===-1?1:s===-1||t.length>e.length?-1:e.length>t.length?1:0}function ldt(t,e,r){if(typeof t==\"string\"||oY(t))return!0;if(typeof t!=\"object\"||t===null)return!1;let s=FD(t),a=!1,n=0;for(let c=0;c<s.length;c++){let f=s[c],p=f===\"\"||f[0]!==\".\";if(n++===0)a=p;else if(a!==p)throw new LD((0,ta.fileURLToPath)(e),r,`\"exports\" cannot contain some keys starting with '.' and some not. The exports object must either be an object of package subpath keys or an object of main entry condition name keys only.`)}return a}function AY(t,e,r){throw new cBe((0,ta.fileURLToPath)(new URL(\".\",e)),t,r&&(0,ta.fileURLToPath)(r))}var hBe=new Set;function cdt(t,e,r){let s=(0,ta.fileURLToPath)(e);hBe.has(s+\"|\"+t)||(hBe.add(s+\"|\"+t),process.emitWarning(`Use of deprecated trailing slash pattern mapping \"${t}\" in the \"exports\" field module resolution of the package at ${s}${r?` imported from ${(0,ta.fileURLToPath)(r)}`:\"\"}. Mapping specifiers ending in \"/\" is no longer supported.`,\"DeprecationWarning\",\"DEP0155\"))}function dBe({packageJSONUrl:t,packageSubpath:e,exports:r,base:s,conditions:a}){if(ldt(r,t,s)&&(r={\".\":r}),Hm(r,e)&&!cY(e,\"*\")&&!ng(e,\"/\")){let p=r[e],h=vw(t,p,\"\",e,s,!1,!1,a);return h==null&&AY(e,t,s),h}let n=\"\",c,f=FD(r);for(let p=0;p<f.length;p++){let h=f[p],E=ND(h,\"*\");if(E!==-1&&hA(e,ig(h,0,E))){ng(e,\"/\")&&cdt(e,t,s);let C=ig(h,E+1);e.length>=h.length&&ng(e,C)&&gBe(n,h)===1&&uY(h,\"*\")===E&&(n=h,c=ig(e,E,e.length-C.length))}}if(n){let p=r[n],h=vw(t,p,c,n,s,!0,!1,a);return h==null&&AY(e,t,s),h}AY(e,t,s)}function mBe({name:t,base:e,conditions:r,readFileSyncFn:s}){if(t===\"#\"||hA(t,\"#/\")||ng(t,\"/\")){let c=\"is not a valid internal imports specifier name\";throw new fY(t,c,(0,ta.fileURLToPath)(e))}let a,n=fBe(e,s);if(n.exists){a=(0,ta.pathToFileURL)(n.pjsonPath);let c=n.imports;if(c)if(Hm(c,t)&&!cY(t,\"*\")){let f=vw(a,c[t],\"\",t,e,!1,!0,r);if(f!=null)return f}else{let f=\"\",p,h=FD(c);for(let E=0;E<h.length;E++){let C=h[E],S=ND(C,\"*\");if(S!==-1&&hA(t,ig(C,0,S))){let P=ig(C,S+1);t.length>=C.length&&ng(t,P)&&gBe(f,C)===1&&uY(C,\"*\")===S&&(f=C,p=ig(t,S,t.length-P.length))}}if(f){let E=c[f],C=vw(a,E,p,f,e,!0,!0,r);if(C!=null)return C}}}idt(t,a,e)}Dt();var udt=new Set([\"BUILTIN_NODE_RESOLUTION_FAILED\",\"MISSING_DEPENDENCY\",\"MISSING_PEER_DEPENDENCY\",\"QUALIFIED_PATH_RESOLUTION_FAILED\",\"UNDECLARED_DEPENDENCY\"]);function gs(t,e,r={},s){s??=udt.has(t)?\"MODULE_NOT_FOUND\":t;let a={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:{...a,value:s},pnpCode:{...a,value:t},data:{...a,value:r}})}function lf(t){return fe.normalize(fe.fromPortablePath(t))}var CBe=ut(EBe());function wBe(t){return fdt(),hY[t]}var hY;function fdt(){hY||(hY={\"--conditions\":[],...IBe(Adt()),...IBe(process.execArgv)})}function IBe(t){return(0,CBe.default)({\"--conditions\":[String],\"-C\":\"--conditions\"},{argv:t,permissive:!0})}function Adt(){let t=[],e=pdt(process.env.NODE_OPTIONS||\"\",t);return t.length,e}function pdt(t,e){let r=[],s=!1,a=!0;for(let n=0;n<t.length;++n){let c=t[n];if(c===\"\\\\\"&&s){if(n+1===t.length)return e.push(`invalid value for NODE_OPTIONS (invalid escape)\n`),r;c=t[++n]}else if(c===\" \"&&!s){a=!0;continue}else if(c==='\"'){s=!s;continue}a?(r.push(c),a=!1):r[r.length-1]+=c}return s&&e.push(`invalid value for NODE_OPTIONS (unterminated string)\n`),r}Dt();var[ml,ih]=process.versions.node.split(\".\").map(t=>parseInt(t,10)),BBe=ml>19||ml===19&&ih>=2||ml===18&&ih>=13,UZt=ml===20&&ih<6||ml===19&&ih>=3,_Zt=ml>19||ml===19&&ih>=6,HZt=ml>=21||ml===20&&ih>=10||ml===18&&ih>=19,jZt=ml>=21||ml===20&&ih>=10||ml===18&&ih>=20,GZt=ml>=22;function vBe(t){if(process.env.WATCH_REPORT_DEPENDENCIES&&process.send)if(t=t.map(e=>fe.fromPortablePath(uo.resolveVirtual(fe.toPortablePath(e)))),BBe)process.send({\"watch:require\":t});else for(let e of t)process.send({\"watch:require\":e})}function dY(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,s=Number(process.env.PNP_DEBUG_LEVEL),a=/^(?![a-zA-Z]:[\\\\/]|\\\\\\\\|\\.{0,2}(?:\\/|$))((?:node:)?(?:@[^/]+\\/)?[^/]+)\\/*(.*|)$/,n=/^(\\/|\\.{1,2}(\\/|$))/,c=/\\/$/,f=/^\\.{0,2}\\//,p={name:null,reference:null},h=[],E=new Set;if(t.enableTopLevelFallback===!0&&h.push(p),e.compatibilityMode!==!1)for(let Fe of[\"react-scripts\",\"gatsby\"]){let Ne=t.packageRegistry.get(Fe);if(Ne)for(let Pe of Ne.keys()){if(Pe===null)throw new Error(\"Assertion failed: This reference shouldn't be null\");h.push({name:Fe,reference:Pe})}}let{ignorePattern:C,packageRegistry:S,packageLocatorsByLocations:P}=t;function I(Fe,Ne){return{fn:Fe,args:Ne,error:null,result:null}}function R(Fe){let Ne=process.stderr?.hasColors?.()??process.stdout.isTTY,Pe=(it,Ue)=>`\\x1B[${it}m${Ue}\\x1B[0m`,Ve=Fe.error;console.error(Ve?Pe(\"31;1\",`\\u2716 ${Fe.error?.message.replace(/\\n.*/s,\"\")}`):Pe(\"33;1\",\"\\u203C Resolution\")),Fe.args.length>0&&console.error();for(let it of Fe.args)console.error(`  ${Pe(\"37;1\",\"In \\u2190\")} ${(0,gY.inspect)(it,{colors:Ne,compact:!0})}`);Fe.result&&(console.error(),console.error(`  ${Pe(\"37;1\",\"Out \\u2192\")} ${(0,gY.inspect)(Fe.result,{colors:Ne,compact:!0})}`));let ke=new Error().stack.match(/(?<=^ +)at.*/gm)?.slice(2)??[];if(ke.length>0){console.error();for(let it of ke)console.error(`  ${Pe(\"38;5;244\",it)}`)}console.error()}function N(Fe,Ne){if(e.allowDebug===!1)return Ne;if(Number.isFinite(s)){if(s>=2)return(...Pe)=>{let Ve=I(Fe,Pe);try{return Ve.result=Ne(...Pe)}catch(ke){throw Ve.error=ke}finally{R(Ve)}};if(s>=1)return(...Pe)=>{try{return Ne(...Pe)}catch(Ve){let ke=I(Fe,Pe);throw ke.error=Ve,R(ke),Ve}}}return Ne}function U(Fe){let Ne=g(Fe);if(!Ne)throw gs(\"INTERNAL\",\"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)\");return Ne}function W(Fe){if(Fe.name===null)return!0;for(let Ne of t.dependencyTreeRoots)if(Ne.name===Fe.name&&Ne.reference===Fe.reference)return!0;return!1}let ee=new Set([\"node\",\"require\",...wBe(\"--conditions\")]);function ie(Fe,Ne=ee,Pe){let Ve=Ae(J.join(Fe,\"internal.js\"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(Ve===null)throw gs(\"INTERNAL\",`The locator that owns the \"${Fe}\" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:ke}=U(Ve),it=J.join(ke,Er.manifest);if(!e.fakeFs.existsSync(it))return null;let Ue=JSON.parse(e.fakeFs.readFileSync(it,\"utf8\"));if(Ue.exports==null)return null;let x=J.contains(ke,Fe);if(x===null)throw gs(\"INTERNAL\",\"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)\");x!==\".\"&&!f.test(x)&&(x=`./${x}`);try{let w=dBe({packageJSONUrl:(0,jm.pathToFileURL)(fe.fromPortablePath(it)),packageSubpath:x,exports:Ue.exports,base:Pe?(0,jm.pathToFileURL)(fe.fromPortablePath(Pe)):null,conditions:Ne});return fe.toPortablePath((0,jm.fileURLToPath)(w))}catch(w){throw gs(\"EXPORTS_RESOLUTION_FAILED\",w.message,{unqualifiedPath:lf(Fe),locator:Ve,pkgJson:Ue,subpath:lf(x),conditions:Ne},w.code)}}function ue(Fe,Ne,{extensions:Pe}){let Ve;try{Ne.push(Fe),Ve=e.fakeFs.statSync(Fe)}catch{}if(Ve&&!Ve.isDirectory())return e.fakeFs.realpathSync(Fe);if(Ve&&Ve.isDirectory()){let ke;try{ke=JSON.parse(e.fakeFs.readFileSync(J.join(Fe,Er.manifest),\"utf8\"))}catch{}let it;if(ke&&ke.main&&(it=J.resolve(Fe,ke.main)),it&&it!==Fe){let Ue=ue(it,Ne,{extensions:Pe});if(Ue!==null)return Ue}}for(let ke=0,it=Pe.length;ke<it;ke++){let Ue=`${Fe}${Pe[ke]}`;if(Ne.push(Ue),e.fakeFs.existsSync(Ue))return Ue}if(Ve&&Ve.isDirectory())for(let ke=0,it=Pe.length;ke<it;ke++){let Ue=J.format({dir:Fe,name:\"index\",ext:Pe[ke]});if(Ne.push(Ue),e.fakeFs.existsSync(Ue))return Ue}return null}function le(Fe){let Ne=new sh.Module(Fe,null);return Ne.filename=Fe,Ne.paths=sh.Module._nodeModulePaths(Fe),Ne}function me(Fe,Ne){return Ne.endsWith(\"/\")&&(Ne=J.join(Ne,\"internal.js\")),sh.Module._resolveFilename(fe.fromPortablePath(Fe),le(fe.fromPortablePath(Ne)),!1,{plugnplay:!1})}function pe(Fe){if(C===null)return!1;let Ne=J.contains(t.basePath,Fe);return Ne===null?!1:!!C.test(Ne.replace(/\\/$/,\"\"))}let Be={std:3,resolveVirtual:1,getAllLocators:1},Ce=p;function g({name:Fe,reference:Ne}){let Pe=S.get(Fe);if(!Pe)return null;let Ve=Pe.get(Ne);return Ve||null}function we({name:Fe,reference:Ne}){let Pe=[];for(let[Ve,ke]of S)if(Ve!==null)for(let[it,Ue]of ke)it===null||Ue.packageDependencies.get(Fe)!==Ne||Ve===Fe&&it===Ne||Pe.push({name:Ve,reference:it});return Pe}function ye(Fe,Ne){let Pe=new Map,Ve=new Set,ke=Ue=>{let x=JSON.stringify(Ue.name);if(Ve.has(x))return;Ve.add(x);let w=we(Ue);for(let b of w)if(U(b).packagePeers.has(Fe))ke(b);else{let F=Pe.get(b.name);typeof F>\"u\"&&Pe.set(b.name,F=new Set),F.add(b.reference)}};ke(Ne);let it=[];for(let Ue of[...Pe.keys()].sort())for(let x of[...Pe.get(Ue)].sort())it.push({name:Ue,reference:x});return it}function Ae(Fe,{resolveIgnored:Ne=!1,includeDiscardFromLookup:Pe=!1}={}){if(pe(Fe)&&!Ne)return null;let Ve=J.relative(t.basePath,Fe);Ve.match(n)||(Ve=`./${Ve}`),Ve.endsWith(\"/\")||(Ve=`${Ve}/`);do{let ke=P.get(Ve);if(typeof ke>\"u\"||ke.discardFromLookup&&!Pe){Ve=Ve.substring(0,Ve.lastIndexOf(\"/\",Ve.length-2)+1);continue}return ke.locator}while(Ve!==\"\");return null}function se(Fe){try{return e.fakeFs.readFileSync(fe.toPortablePath(Fe),\"utf8\")}catch(Ne){if(Ne.code===\"ENOENT\")return;throw Ne}}function Z(Fe,Ne,{considerBuiltins:Pe=!0}={}){if(Fe.startsWith(\"#\"))throw new Error(\"resolveToUnqualified can not handle private import mappings\");if(Fe===\"pnpapi\")return fe.toPortablePath(e.pnpapiResolution);if(Pe&&(0,sh.isBuiltin)(Fe))return null;let Ve=lf(Fe),ke=Ne&&lf(Ne);if(Ne&&pe(Ne)&&(!J.isAbsolute(Fe)||Ae(Fe)===null)){let x=me(Fe,Ne);if(x===!1)throw gs(\"BUILTIN_NODE_RESOLUTION_FAILED\",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp)\n\nRequire request: \"${Ve}\"\nRequired by: ${ke}\n`,{request:Ve,issuer:ke});return fe.toPortablePath(x)}let it,Ue=Fe.match(a);if(Ue){if(!Ne)throw gs(\"API_ERROR\",\"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute\",{request:Ve,issuer:ke});let[,x,w]=Ue,b=Ae(Ne);if(!b){let Te=me(Fe,Ne);if(Te===!1)throw gs(\"BUILTIN_NODE_RESOLUTION_FAILED\",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree).\n\nRequire path: \"${Ve}\"\nRequired by: ${ke}\n`,{request:Ve,issuer:ke});return fe.toPortablePath(Te)}let F=U(b).packageDependencies.get(x),z=null;if(F==null&&b.name!==null){let Te=t.fallbackExclusionList.get(b.name);if(!Te||!Te.has(b.reference)){for(let Ct=0,qt=h.length;Ct<qt;++Ct){let Pt=U(h[Ct]).packageDependencies.get(x);if(Pt!=null){r?z=Pt:F=Pt;break}}if(t.enableTopLevelFallback&&F==null&&z===null){let Ct=t.fallbackPool.get(x);Ct!=null&&(z=Ct)}}}let X=null;if(F===null)if(W(b))X=gs(\"MISSING_PEER_DEPENDENCY\",`Your application tried to access ${x} (a peer dependency); this isn't allowed as there is no ancestor to satisfy the requirement. Use a devDependency if needed.\n\nRequired package: ${x}${x!==Ve?` (via \"${Ve}\")`:\"\"}\nRequired by: ${ke}\n`,{request:Ve,issuer:ke,dependencyName:x});else{let Te=ye(x,b);Te.every(lt=>W(lt))?X=gs(\"MISSING_PEER_DEPENDENCY\",`${b.name} tried to access ${x} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound.\n\nRequired package: ${x}${x!==Ve?` (via \"${Ve}\")`:\"\"}\nRequired by: ${b.name}@${b.reference} (via ${ke})\n${Te.map(lt=>`Ancestor breaking the chain: ${lt.name}@${lt.reference}\n`).join(\"\")}\n`,{request:Ve,issuer:ke,issuerLocator:Object.assign({},b),dependencyName:x,brokenAncestors:Te}):X=gs(\"MISSING_PEER_DEPENDENCY\",`${b.name} tried to access ${x} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound.\n\nRequired package: ${x}${x!==Ve?` (via \"${Ve}\")`:\"\"}\nRequired by: ${b.name}@${b.reference} (via ${ke})\n\n${Te.map(lt=>`Ancestor breaking the chain: ${lt.name}@${lt.reference}\n`).join(\"\")}\n`,{request:Ve,issuer:ke,issuerLocator:Object.assign({},b),dependencyName:x,brokenAncestors:Te})}else F===void 0&&(!Pe&&(0,sh.isBuiltin)(Fe)?W(b)?X=gs(\"UNDECLARED_DEPENDENCY\",`Your application tried to access ${x}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${x} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound.\n\nRequired package: ${x}${x!==Ve?` (via \"${Ve}\")`:\"\"}\nRequired by: ${ke}\n`,{request:Ve,issuer:ke,dependencyName:x}):X=gs(\"UNDECLARED_DEPENDENCY\",`${b.name} tried to access ${x}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${x} isn't otherwise declared in ${b.name}'s dependencies, this makes the require call ambiguous and unsound.\n\nRequired package: ${x}${x!==Ve?` (via \"${Ve}\")`:\"\"}\nRequired by: ${ke}\n`,{request:Ve,issuer:ke,issuerLocator:Object.assign({},b),dependencyName:x}):W(b)?X=gs(\"UNDECLARED_DEPENDENCY\",`Your application tried to access ${x}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound.\n\nRequired package: ${x}${x!==Ve?` (via \"${Ve}\")`:\"\"}\nRequired by: ${ke}\n`,{request:Ve,issuer:ke,dependencyName:x}):X=gs(\"UNDECLARED_DEPENDENCY\",`${b.name} tried to access ${x}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound.\n\nRequired package: ${x}${x!==Ve?` (via \"${Ve}\")`:\"\"}\nRequired by: ${b.name}@${b.reference} (via ${ke})\n`,{request:Ve,issuer:ke,issuerLocator:Object.assign({},b),dependencyName:x}));if(F==null){if(z===null||X===null)throw X||new Error(\"Assertion failed: Expected an error to have been set\");F=z;let Te=X.message.replace(/\\n.*/g,\"\");X.message=Te,!E.has(Te)&&s!==0&&(E.add(Te),process.emitWarning(X))}let $=Array.isArray(F)?{name:F[0],reference:F[1]}:{name:x,reference:F},oe=U($);if(!oe.packageLocation)throw gs(\"MISSING_DEPENDENCY\",`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod.\n\nRequired package: ${$.name}@${$.reference}${$.name!==Ve?` (via \"${Ve}\")`:\"\"}\nRequired by: ${b.name}@${b.reference} (via ${ke})\n`,{request:Ve,issuer:ke,dependencyLocator:Object.assign({},$)});let xe=oe.packageLocation;w?it=J.join(xe,w):it=xe}else if(J.isAbsolute(Fe))it=J.normalize(Fe);else{if(!Ne)throw gs(\"API_ERROR\",\"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute\",{request:Ve,issuer:ke});let x=J.resolve(Ne);Ne.match(c)?it=J.normalize(J.join(x,Fe)):it=J.normalize(J.join(J.dirname(x),Fe))}return J.normalize(it)}function De(Fe,Ne,Pe=ee,Ve){if(n.test(Fe))return Ne;let ke=ie(Ne,Pe,Ve);return ke?J.normalize(ke):Ne}function Re(Fe,{extensions:Ne=Object.keys(sh.Module._extensions)}={}){let Pe=[],Ve=ue(Fe,Pe,{extensions:Ne});if(Ve)return J.normalize(Ve);{vBe(Pe.map(Ue=>fe.fromPortablePath(Ue)));let ke=lf(Fe),it=Ae(Fe);if(it){let{packageLocation:Ue}=U(it),x=!0;try{e.fakeFs.accessSync(Ue)}catch(w){if(w?.code===\"ENOENT\")x=!1;else{let b=(w?.message??w??\"empty exception thrown\").replace(/^[A-Z]/,y=>y.toLowerCase());throw gs(\"QUALIFIED_PATH_RESOLUTION_FAILED\",`Required package exists but could not be accessed (${b}).\n\nMissing package: ${it.name}@${it.reference}\nExpected package location: ${lf(Ue)}\n`,{unqualifiedPath:ke,extensions:Ne})}}if(!x){let w=Ue.includes(\"/unplugged/\")?\"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).\":\"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.\";throw gs(\"QUALIFIED_PATH_RESOLUTION_FAILED\",`${w}\n\nMissing package: ${it.name}@${it.reference}\nExpected package location: ${lf(Ue)}\n`,{unqualifiedPath:ke,extensions:Ne})}}throw gs(\"QUALIFIED_PATH_RESOLUTION_FAILED\",`Qualified path resolution failed: we looked for the following paths, but none could be accessed.\n\nSource path: ${ke}\n${Pe.map(Ue=>`Not found: ${lf(Ue)}\n`).join(\"\")}`,{unqualifiedPath:ke,extensions:Ne})}}function mt(Fe,Ne,Pe){if(!Ne)throw new Error(\"Assertion failed: An issuer is required to resolve private import mappings\");let Ve=mBe({name:Fe,base:(0,jm.pathToFileURL)(fe.fromPortablePath(Ne)),conditions:Pe.conditions??ee,readFileSyncFn:se});if(Ve instanceof URL)return Re(fe.toPortablePath((0,jm.fileURLToPath)(Ve)),{extensions:Pe.extensions});if(Ve.startsWith(\"#\"))throw new Error(\"Mapping from one private import to another isn't allowed\");return j(Ve,Ne,Pe)}function j(Fe,Ne,Pe={}){try{if(Fe.startsWith(\"#\"))return mt(Fe,Ne,Pe);let{considerBuiltins:Ve,extensions:ke,conditions:it}=Pe,Ue=Z(Fe,Ne,{considerBuiltins:Ve});if(Fe===\"pnpapi\")return Ue;if(Ue===null)return null;let x=()=>Ne!==null?pe(Ne):!1,w=(!Ve||!(0,sh.isBuiltin)(Fe))&&!x()?De(Fe,Ue,it,Ne):Ue;return Re(w,{extensions:ke})}catch(Ve){throw Object.hasOwn(Ve,\"pnpCode\")&&Object.assign(Ve.data,{request:lf(Fe),issuer:Ne&&lf(Ne)}),Ve}}function rt(Fe){let Ne=J.normalize(Fe),Pe=uo.resolveVirtual(Ne);return Pe!==Ne?Pe:null}return{VERSIONS:Be,topLevel:Ce,getLocator:(Fe,Ne)=>Array.isArray(Ne)?{name:Ne[0],reference:Ne[1]}:{name:Fe,reference:Ne},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let Fe=[];for(let[Ne,Pe]of S)for(let Ve of Pe.keys())Ne!==null&&Ve!==null&&Fe.push({name:Ne,reference:Ve});return Fe},getPackageInformation:Fe=>{let Ne=g(Fe);if(Ne===null)return null;let Pe=fe.fromPortablePath(Ne.packageLocation);return{...Ne,packageLocation:Pe}},findPackageLocator:Fe=>Ae(fe.toPortablePath(Fe)),resolveToUnqualified:N(\"resolveToUnqualified\",(Fe,Ne,Pe)=>{let Ve=Ne!==null?fe.toPortablePath(Ne):null,ke=Z(fe.toPortablePath(Fe),Ve,Pe);return ke===null?null:fe.fromPortablePath(ke)}),resolveUnqualified:N(\"resolveUnqualified\",(Fe,Ne)=>fe.fromPortablePath(Re(fe.toPortablePath(Fe),Ne))),resolveRequest:N(\"resolveRequest\",(Fe,Ne,Pe)=>{let Ve=Ne!==null?fe.toPortablePath(Ne):null,ke=j(fe.toPortablePath(Fe),Ve,Pe);return ke===null?null:fe.fromPortablePath(ke)}),resolveVirtual:N(\"resolveVirtual\",Fe=>{let Ne=rt(fe.toPortablePath(Fe));return Ne!==null?fe.fromPortablePath(Ne):null})}}Dt();var SBe=(t,e,r)=>{let s=TD(t),a=sY(s,{basePath:e}),n=fe.join(e,Er.pnpCjs);return dY(a,{fakeFs:r,pnpapiResolution:n})};var yY=ut(bBe());Yt();var gA={};Vt(gA,{checkManifestCompatibility:()=>PBe,extractBuildRequest:()=>oN,getExtractHint:()=>EY,hasBindingGyp:()=>IY});Ge();Dt();function PBe(t){return G.isPackageCompatible(t,Ui.getArchitectureSet())}function oN(t,e,r,{configuration:s}){let a=[];for(let n of[\"preinstall\",\"install\",\"postinstall\"])e.manifest.scripts.has(n)&&a.push({type:0,script:n});return!e.manifest.scripts.has(\"install\")&&e.misc.hasBindingGyp&&a.push({type:1,script:\"node-gyp rebuild\"}),a.length===0?null:t.linkType!==\"HARD\"?{skipped:!0,explain:n=>n.reportWarningOnce(6,`${G.prettyLocator(s,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`)}:r&&r.built===!1?{skipped:!0,explain:n=>n.reportInfoOnce(5,`${G.prettyLocator(s,t)} lists build scripts, but its build has been explicitly disabled through configuration.`)}:!s.get(\"enableScripts\")&&!r.built?{skipped:!0,explain:n=>n.reportWarningOnce(4,`${G.prettyLocator(s,t)} lists build scripts, but all build scripts have been disabled.`)}:PBe(t)?{skipped:!1,directives:a}:{skipped:!0,explain:n=>n.reportWarningOnce(76,`${G.prettyLocator(s,t)} The ${Ui.getArchitectureName()} architecture is incompatible with this package, build skipped.`)}}var gdt=new Set([\".exe\",\".bin\",\".h\",\".hh\",\".hpp\",\".c\",\".cc\",\".cpp\",\".java\",\".jar\",\".node\"]);function EY(t){return t.packageFs.getExtractHint({relevantExtensions:gdt})}function IY(t){let e=J.join(t.prefixPath,\"binding.gyp\");return t.packageFs.existsSync(e)}var HD={};Vt(HD,{getUnpluggedPath:()=>_D});Ge();Dt();function _D(t,{configuration:e}){return J.resolve(e.get(\"pnpUnpluggedFolder\"),G.slugifyLocator(t))}var ddt=new Set([G.makeIdent(null,\"open\").identHash,G.makeIdent(null,\"opn\").identHash]),sg=class{constructor(){this.mode=\"strict\";this.pnpCache=new Map}getCustomDataKey(){return JSON.stringify({name:\"PnpLinker\",version:2})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error(\"Assertion failed: Expected the PnP linker to be enabled\");let s=og(r.project).cjs;if(!ce.existsSync(s))throw new nt(`The project in ${he.pretty(r.project.configuration,`${r.project.cwd}/package.json`,he.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let a=je.getFactoryWithDefault(this.pnpCache,s,()=>je.dynamicRequire(s,{cachingStrategy:je.CachingStrategy.FsTime})),n={name:G.stringifyIdent(e),reference:e.reference},c=a.getPackageInformation(n);if(!c)throw new nt(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return fe.toPortablePath(c.packageLocation)}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let s=og(r.project).cjs;if(!ce.existsSync(s))return null;let n=je.getFactoryWithDefault(this.pnpCache,s,()=>je.dynamicRequire(s,{cachingStrategy:je.CachingStrategy.FsTime})).findPackageLocator(fe.fromPortablePath(e));return n?G.makeLocator(G.parseIdent(n.name),n.reference):null}makeInstaller(e){return new Gm(e)}isEnabled(e){return!(e.project.configuration.get(\"nodeLinker\")!==\"pnp\"||e.project.configuration.get(\"pnpMode\")!==this.mode)}},Gm=class{constructor(e){this.opts=e;this.mode=\"strict\";this.asyncActions=new je.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}attachCustomData(e){this.customData=e}async installPackage(e,r,s){let a=G.stringifyIdent(e),n=e.reference,c=!!this.opts.project.tryWorkspaceByLocator(e),f=G.isVirtualLocator(e),p=e.peerDependencies.size>0&&!f,h=!p&&!c,E=!p&&e.linkType!==\"SOFT\",C,S;if(h||E){let ee=f?G.devirtualizeLocator(e):e;C=this.customData.store.get(ee.locatorHash),typeof C>\"u\"&&(C=await mdt(r),e.linkType===\"HARD\"&&this.customData.store.set(ee.locatorHash,C)),C.manifest.type===\"module\"&&(this.isESMLoaderRequired=!0),S=this.opts.project.getDependencyMeta(ee,e.version)}let P=h?oN(e,C,S,{configuration:this.opts.project.configuration}):null,I=E?await this.unplugPackageIfNeeded(e,C,r,S,s):r.packageFs;if(J.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let R=J.resolve(I.getRealPath(),r.prefixPath),N=CY(this.opts.project.cwd,R),U=new Map,W=new Set;if(f){for(let ee of e.peerDependencies.values())U.set(G.stringifyIdent(ee),null),W.add(G.stringifyIdent(ee));if(!c){let ee=G.devirtualizeLocator(e);this.virtualTemplates.set(ee.locatorHash,{location:CY(this.opts.project.cwd,uo.resolveVirtual(R)),locator:ee})}}return je.getMapWithDefault(this.packageRegistry,a).set(n,{packageLocation:N,packageDependencies:U,packagePeers:W,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:R,buildRequest:P}}async attachInternalDependencies(e,r){let s=this.getPackageInformation(e);for(let[a,n]of r){let c=G.areIdentsEqual(a,n)?n.reference:[G.stringifyIdent(n),n.reference];s.packageDependencies.set(G.stringifyIdent(a),c)}}async attachExternalDependents(e,r){for(let s of r)this.getDiskInformation(s).packageDependencies.set(G.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get(\"pnpMode\")!==this.mode)return;let e=og(this.opts.project);if(this.isEsmEnabled()||await ce.removePromise(e.esmLoader),this.opts.project.configuration.get(\"nodeLinker\")!==\"pnp\"){await ce.removePromise(e.cjs),await ce.removePromise(e.data),await ce.removePromise(e.esmLoader),await ce.removePromise(this.opts.project.configuration.get(\"pnpUnpluggedFolder\"));return}for(let{locator:C,location:S}of this.virtualTemplates.values())je.getMapWithDefault(this.packageRegistry,G.stringifyIdent(C)).set(C.reference,{packageLocation:S,packageDependencies:new Map,packagePeers:new Set,linkType:\"SOFT\",discardFromLookup:!1});let r=this.opts.project.configuration.get(\"pnpFallbackMode\"),s=this.opts.project.workspaces.map(({anchoredLocator:C})=>({name:G.stringifyIdent(C),reference:C.reference})),a=r!==\"none\",n=[],c=new Map,f=je.buildIgnorePattern([\".yarn/sdks/**\",...this.opts.project.configuration.get(\"pnpIgnorePatterns\")]),p=this.packageRegistry,h=this.opts.project.configuration.get(\"pnpShebang\"),E=this.opts.project.configuration.get(\"pnpZipBackend\");if(r===\"dependencies-only\")for(let C of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(C)&&n.push({name:G.stringifyIdent(C),reference:C.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:s,enableTopLevelFallback:a,fallbackExclusionList:n,fallbackPool:c,ignorePattern:f,pnpZipBackend:E,packageRegistry:p,shebang:h}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has(\"pnpEnableEsmLoader\"))return this.opts.project.configuration.get(\"pnpEnableEsmLoader\");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type===\"module\")return!0;return!1}async finalizeInstallWithPnp(e){let r=og(this.opts.project),s=await this.locateNodeModules(e.ignorePattern);if(s.length>0){this.opts.report.reportWarning(31,\"One or more node_modules have been detected and will be removed. This operation may take some time.\");for(let n of s)await ce.removePromise(n)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get(\"pnpEnableInlining\")){let n=tBe(e);await ce.changeFilePromise(r.cjs,n,{automaticNewlines:!0,mode:493}),await ce.removePromise(r.data)}else{let{dataFile:n,loaderFile:c}=rBe(e);await ce.changeFilePromise(r.cjs,c,{automaticNewlines:!0,mode:493}),await ce.changeFilePromise(r.data,n,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(0,\"ESM support for PnP uses the experimental loader API and is therefore experimental\"),await ce.changeFilePromise(r.esmLoader,(0,yY.default)(),{automaticNewlines:!0,mode:420}));let a=this.opts.project.configuration.get(\"pnpUnpluggedFolder\");if(this.unpluggedPaths.size===0)await ce.removePromise(a);else for(let n of await ce.readdirPromise(a)){let c=J.resolve(a,n);this.unpluggedPaths.has(c)||await ce.removePromise(c)}}async locateNodeModules(e){let r=[],s=e?new RegExp(e):null;for(let a of this.opts.project.workspaces){let n=J.join(a.cwd,\"node_modules\");if(s&&s.test(J.relative(this.opts.project.cwd,a.cwd))||!ce.existsSync(n))continue;let c=await ce.readdirPromise(n,{withFileTypes:!0}),f=c.filter(p=>!p.isDirectory()||p.name===\".bin\"||!p.name.startsWith(\".\"));if(f.length===c.length)r.push(n);else for(let p of f)r.push(J.join(n,p.name))}return r}async unplugPackageIfNeeded(e,r,s,a,n){return this.shouldBeUnplugged(e,r,a)?this.unplugPackage(e,s,n):s.packageFs}shouldBeUnplugged(e,r,s){return typeof s.unplugged<\"u\"?s.unplugged:ddt.has(e.identHash)||e.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(oN(e,r,s,{configuration:this.opts.project.configuration})?.skipped===!1||r.misc.extractHint)}async unplugPackage(e,r,s){let a=_D(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new _f(a,{baseFs:r.packageFs,pathUtils:J}):(this.unpluggedPaths.add(a),s.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let n=J.join(a,r.prefixPath,\".ready\");await ce.existsPromise(n)||(this.opts.project.storedBuildState.delete(e.locatorHash),await ce.mkdirPromise(a,{recursive:!0}),await ce.copyPromise(a,vt.dot,{baseFs:r.packageFs,overwrite:!1}),await ce.writeFilePromise(n,\"\"))})),new Sn(a))}getPackageInformation(e){let r=G.stringifyIdent(e),s=e.reference,a=this.packageRegistry.get(r);if(!a)throw new Error(`Assertion failed: The package information store should have been available (for ${G.prettyIdent(this.opts.project.configuration,e)})`);let n=a.get(s);if(!n)throw new Error(`Assertion failed: The package information should have been available (for ${G.prettyLocator(this.opts.project.configuration,e)})`);return n}getDiskInformation(e){let r=je.getMapWithDefault(this.packageRegistry,\"@@disk\"),s=CY(this.opts.project.cwd,e);return je.getFactoryWithDefault(r,s,()=>({packageLocation:s,packageDependencies:new Map,packagePeers:new Set,linkType:\"SOFT\",discardFromLookup:!1}))}};function CY(t,e){let r=J.relative(t,e);return r.match(/^\\.{0,2}\\//)||(r=`./${r}`),r.replace(/\\/?$/,\"/\")}async function mdt(t){let e=await Ut.tryFind(t.prefixPath,{baseFs:t.packageFs})??new Ut,r=new Set([\"preinstall\",\"install\",\"postinstall\"]);for(let s of e.scripts.keys())r.has(s)||e.scripts.delete(s);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:EY(t),hasBindingGyp:IY(t)}}}Ge();Ge();Yt();var xBe=ut(Go());var Sw=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Unplug direct dependencies from the entire project\"});this.recursive=ge.Boolean(\"-R,--recursive\",!1,{description:\"Unplug both direct and transitive dependencies\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.patterns=ge.Rest()}static{this.paths=[[\"unplug\"]]}static{this.usage=ot.Usage({description:\"force the unpacking of a list of packages\",details:\"\\n      This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\\n\\n      A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\\n\\n      Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\\n\\n      By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\\n\\n      This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\\n    \",examples:[[\"Unplug the lodash dependency from the active workspace\",\"yarn unplug lodash\"],[\"Unplug all instances of lodash referenced by any workspace\",\"yarn unplug lodash -A\"],[\"Unplug all instances of lodash referenced by the active workspace and its dependencies\",\"yarn unplug lodash -R\"],[\"Unplug all instances of lodash, anywhere\",\"yarn unplug lodash -AR\"],[\"Unplug one specific version of lodash\",\"yarn unplug lodash@1.2.3\"],[\"Unplug all packages with the `@babel` scope\",\"yarn unplug '@babel/*'\"],[\"Unplug all packages (only for testing, not recommended)\",\"yarn unplug -R '*'\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);if(r.get(\"nodeLinker\")!==\"pnp\")throw new nt(\"This command can only be used if the `nodeLinker` option is set to `pnp`\");await s.restoreInstallState();let c=new Set(this.patterns),f=this.patterns.map(P=>{let I=G.parseDescriptor(P),R=I.range!==\"unknown\"?I:G.makeDescriptor(I,\"*\");if(!Fr.validRange(R.range))throw new nt(`The range of the descriptor patterns must be a valid semver range (${G.prettyDescriptor(r,R)})`);return N=>{let U=G.stringifyIdent(N);return!xBe.default.isMatch(U,G.stringifyIdent(R))||N.version&&!Fr.satisfiesWithPrereleases(N.version,R.range)?!1:(c.delete(P),!0)}}),p=()=>{let P=[];for(let I of s.storedPackages.values())!s.tryWorkspaceByLocator(I)&&!G.isVirtualLocator(I)&&f.some(R=>R(I))&&P.push(I);return P},h=P=>{let I=new Set,R=[],N=(U,W)=>{if(I.has(U.locatorHash))return;let ee=!!s.tryWorkspaceByLocator(U);if(!(W>0&&!this.recursive&&ee)&&(I.add(U.locatorHash),!s.tryWorkspaceByLocator(U)&&f.some(ie=>ie(U))&&R.push(U),!(W>0&&!this.recursive)))for(let ie of U.dependencies.values()){let ue=s.storedResolutions.get(ie.descriptorHash);if(!ue)throw new Error(\"Assertion failed: The resolution should have been registered\");let le=s.storedPackages.get(ue);if(!le)throw new Error(\"Assertion failed: The package should have been registered\");N(le,W+1)}};for(let U of P)N(U.anchoredPackage,0);return R},E,C;if(this.all&&this.recursive?(E=p(),C=\"the project\"):this.all?(E=h(s.workspaces),C=\"any workspace\"):(E=h([a]),C=\"this workspace\"),c.size>1)throw new nt(`Patterns ${he.prettyList(r,c,he.Type.CODE)} don't match any packages referenced by ${C}`);if(c.size>0)throw new nt(`Pattern ${he.prettyList(r,c,he.Type.CODE)} doesn't match any packages referenced by ${C}`);E=je.sortMap(E,P=>G.stringifyLocator(P));let S=await Ot.start({configuration:r,stdout:this.context.stdout,json:this.json},async P=>{for(let I of E){let R=I.version??\"unknown\",N=s.topLevelWorkspace.manifest.ensureDependencyMeta(G.makeDescriptor(I,R));N.unplugged=!0,P.reportInfo(0,`Will unpack ${G.prettyLocator(r,I)} to ${he.pretty(r,_D(I,{configuration:r}),he.Type.PATH)}`),P.reportJson({locator:G.stringifyLocator(I),version:R})}await s.topLevelWorkspace.persistManifest(),this.json||P.reportSeparator()});return S.hasErrors()?S.exitCode():await s.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};var og=t=>({cjs:J.join(t.cwd,Er.pnpCjs),data:J.join(t.cwd,Er.pnpData),esmLoader:J.join(t.cwd,Er.pnpEsmLoader)}),QBe=t=>/\\s/.test(t)?JSON.stringify(t):t;async function ydt(t,e,r){let s=/\\s*--require\\s+\\S*\\.pnp\\.c?js\\s*/g,a=/\\s*--experimental-loader\\s+\\S*\\.pnp\\.loader\\.mjs\\s*/,n=(e.NODE_OPTIONS??\"\").replace(s,\" \").replace(a,\" \").trim();if(t.configuration.get(\"nodeLinker\")!==\"pnp\"){e.NODE_OPTIONS=n||void 0;return}let c=og(t),f=`--require ${QBe(fe.fromPortablePath(c.cjs))}`;ce.existsSync(c.esmLoader)&&(f=`${f} --experimental-loader ${(0,kBe.pathToFileURL)(fe.fromPortablePath(c.esmLoader)).href}`),ce.existsSync(c.cjs)&&(e.NODE_OPTIONS=n?`${f} ${n}`:f)}async function Edt(t,e){let r=og(t);e(r.cjs),e(r.data),e(r.esmLoader),e(t.configuration.get(\"pnpUnpluggedFolder\"))}var Idt={hooks:{populateYarnPaths:Edt,setupScriptEnvironment:ydt},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: \"pnp\", \"pnpm\", or \"node-modules\"',type:\"STRING\",default:\"pnp\"},minizip:{description:\"Whether Yarn should use minizip to extract archives\",type:\"BOOLEAN\",default:!1},winLinkType:{description:\"Whether Yarn should use Windows Junctions or symlinks when creating links on Windows.\",type:\"STRING\",values:[\"junctions\",\"symlinks\"],default:\"junctions\"},pnpMode:{description:\"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.\",type:\"STRING\",default:\"strict\"},pnpShebang:{description:\"String to prepend to the generated PnP script\",type:\"STRING\",default:\"#!/usr/bin/env node\"},pnpIgnorePatterns:{description:\"Array of glob patterns; files matching them will use the classic resolution\",type:\"STRING\",default:[],isArray:!0},pnpZipBackend:{description:\"Whether to use the experimental js implementation for the ZipFS\",type:\"STRING\",values:[\"libzip\",\"js\"],default:\"libzip\"},pnpEnableEsmLoader:{description:\"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.\",type:\"BOOLEAN\",default:!1},pnpEnableInlining:{description:\"If true, the PnP data will be inlined along with the generated loader\",type:\"BOOLEAN\",default:!0},pnpFallbackMode:{description:\"If true, the generated PnP loader will follow the top-level fallback rule\",type:\"STRING\",default:\"dependencies-only\"},pnpUnpluggedFolder:{description:\"Folder where the unplugged packages must be stored\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/unplugged\"}},linkers:[sg],commands:[Sw]},Cdt=Idt;var UBe=ut(OBe());Yt();var xY=ut(Ie(\"crypto\")),_Be=ut(Ie(\"fs\")),HBe=1,Ti=\"node_modules\",aN=\".bin\",jBe=\".yarn-state.yml\",Mdt=1e3,kY=(s=>(s.CLASSIC=\"classic\",s.HARDLINKS_LOCAL=\"hardlinks-local\",s.HARDLINKS_GLOBAL=\"hardlinks-global\",s))(kY||{}),jD=class{constructor(){this.installStateCache=new Map}getCustomDataKey(){return JSON.stringify({name:\"NodeModulesLinker\",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error(\"Assertion failed: Expected the node-modules linker to be enabled\");let s=r.project.tryWorkspaceByLocator(e);if(s)return s.cwd;let a=await je.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await PY(r.project,{unrollAliases:!0}));if(a===null)throw new nt(\"Couldn't find the node_modules state file - running an install might help (findPackageLocation)\");let n=a.locatorMap.get(G.stringifyLocator(e));if(!n){let p=new nt(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw p.code=\"LOCATOR_NOT_INSTALLED\",p}let c=n.locations.sort((p,h)=>p.split(J.sep).length-h.split(J.sep).length),f=J.join(r.project.configuration.startingCwd,Ti);return c.find(p=>J.contains(f,p))||n.locations[0]}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let s=await je.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await PY(r.project,{unrollAliases:!0}));if(s===null)return null;let{locationRoot:a,segments:n}=lN(J.resolve(e),{skipPrefix:r.project.cwd}),c=s.locationTree.get(a);if(!c)return null;let f=c.locator;for(let p of n){if(c=c.children.get(p),!c)break;f=c.locator||f}return G.parseLocator(f)}makeInstaller(e){return new bY(e)}isEnabled(e){return e.project.configuration.get(\"nodeLinker\")===\"node-modules\"}},bY=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}attachCustomData(e){this.customData=e}async installPackage(e,r){let s=J.resolve(r.packageFs.getRealPath(),r.prefixPath),a=this.customData.store.get(e.locatorHash);if(typeof a>\"u\"&&(a=await Udt(e,r),e.linkType===\"HARD\"&&this.customData.store.set(e.locatorHash,a)),!G.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildRequest:null};let n=new Map,c=new Set;n.has(G.stringifyIdent(e))||n.set(G.stringifyIdent(e),e.reference);let f=e;if(G.isVirtualLocator(e)){f=G.devirtualizeLocator(e);for(let E of e.peerDependencies.values())n.set(G.stringifyIdent(E),null),c.add(G.stringifyIdent(E))}let p={packageLocation:`${fe.fromPortablePath(s)}/`,packageDependencies:n,packagePeers:c,linkType:e.linkType,discardFromLookup:r.discardFromLookup??!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:a,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:p});let h=r.checksum?r.checksum.substring(r.checksum.indexOf(\"/\")+1):null;return this.realLocatorChecksums.set(f.locatorHash,h),{packageLocation:s,buildRequest:null}}async attachInternalDependencies(e,r){let s=this.localStore.get(e.locatorHash);if(typeof s>\"u\")throw new Error(\"Assertion failed: Expected information object to have been registered\");for(let[a,n]of r){let c=G.areIdentsEqual(a,n)?n.reference:[G.stringifyIdent(n),n.reference];s.pnpNode.packageDependencies.set(G.stringifyIdent(a),c)}}async attachExternalDependents(e,r){throw new Error(\"External dependencies haven't been implemented for the node-modules linker\")}async finalizeInstall(){if(this.opts.project.configuration.get(\"nodeLinker\")!==\"node-modules\")return;let e=new uo({baseFs:new $f({maxOpenFiles:80,readOnlyArchives:!0})}),r=await PY(this.opts.project),s=this.opts.project.configuration.get(\"nmMode\");(r===null||s!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:s,mtimeMs:0});let a=new Map(this.opts.project.workspaces.map(S=>{let P=this.opts.project.configuration.get(\"nmHoistingLimits\");try{P=je.validateEnum(xD,S.manifest.installConfig?.hoistingLimits??P)}catch{let I=G.prettyWorkspace(this.opts.project.configuration,S);this.opts.report.reportWarning(57,`${I}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(xD).join(\", \")}, using default: \"${P}\"`)}return[S.relativeCwd,P]})),n=new Map(this.opts.project.workspaces.map(S=>{let P=this.opts.project.configuration.get(\"nmSelfReferences\");return P=S.manifest.installConfig?.selfReferences??P,[S.relativeCwd,P]})),c={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(S,P)=>Array.isArray(P)?{name:P[0],reference:P[1]}:{name:S,reference:P},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(S=>{let P=S.anchoredLocator;return{name:G.stringifyIdent(P),reference:P.reference}}),getPackageInformation:S=>{let P=S.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:G.makeLocator(G.parseIdent(S.name),S.reference),I=this.localStore.get(P.locatorHash);if(typeof I>\"u\")throw new Error(\"Assertion failed: Expected the package reference to have been registered\");return I.pnpNode},findPackageLocator:S=>{let P=this.opts.project.tryWorkspaceByCwd(fe.toPortablePath(S));if(P!==null){let I=P.anchoredLocator;return{name:G.stringifyIdent(I),reference:I.reference}}throw new Error(\"Assertion failed: Unimplemented\")},resolveToUnqualified:()=>{throw new Error(\"Assertion failed: Unimplemented\")},resolveUnqualified:()=>{throw new Error(\"Assertion failed: Unimplemented\")},resolveRequest:()=>{throw new Error(\"Assertion failed: Unimplemented\")},resolveVirtual:S=>fe.fromPortablePath(uo.resolveVirtual(fe.toPortablePath(S)))},{tree:f,errors:p,preserveSymlinksRequired:h}=kD(c,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:a,project:this.opts.project,selfReferencesByCwd:n});if(!f){for(let{messageName:S,text:P}of p)this.opts.report.reportError(S,P);return}let E=nY(f);await Ydt(r,E,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async S=>{let P=G.parseLocator(S),I=this.localStore.get(P.locatorHash);if(typeof I>\"u\")throw new Error(\"Assertion failed: Expected the slot to exist\");return I.customPackageData.manifest}});let C=[];for(let[S,P]of E.entries()){if(WBe(S))continue;let I=G.parseLocator(S),R=this.localStore.get(I.locatorHash);if(typeof R>\"u\")throw new Error(\"Assertion failed: Expected the slot to exist\");if(this.opts.project.tryWorkspaceByLocator(R.pkg))continue;let N=gA.extractBuildRequest(R.pkg,R.customPackageData,R.dependencyMeta,{configuration:this.opts.project.configuration});N&&C.push({buildLocations:P.locations,locator:I,buildRequest:N})}return h&&this.opts.report.reportWarning(72,`The application uses portals and that's why ${he.pretty(this.opts.project.configuration,\"--preserve-symlinks\",he.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:C}}};async function Udt(t,e){let r=await Ut.tryFind(e.prefixPath,{baseFs:e.packageFs})??new Ut,s=new Set([\"preinstall\",\"install\",\"postinstall\"]);for(let a of r.scripts.keys())s.has(a)||r.scripts.delete(a);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{hasBindingGyp:gA.hasBindingGyp(e)}}}async function _dt(t,e,r,s,{installChangedByUser:a}){let n=\"\";n+=`# Warning: This file is automatically generated. Removing it is fine, but will\n`,n+=`# cause your node_modules installation to become invalidated.\n`,n+=`\n`,n+=`__metadata:\n`,n+=`  version: ${HBe}\n`,n+=`  nmMode: ${s.value}\n`;let c=Array.from(e.keys()).sort(),f=G.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let E of c){let C=e.get(E);n+=`\n`,n+=`${JSON.stringify(E)}:\n`,n+=`  locations:\n`;for(let S of C.locations){let P=J.contains(t.cwd,S);if(P===null)throw new Error(`Assertion failed: Expected the path to be within the project (${S})`);n+=`    - ${JSON.stringify(P)}\n`}if(C.aliases.length>0){n+=`  aliases:\n`;for(let S of C.aliases)n+=`    - ${JSON.stringify(S)}\n`}if(E===f&&r.size>0){n+=`  bin:\n`;for(let[S,P]of r){let I=J.contains(t.cwd,S);if(I===null)throw new Error(`Assertion failed: Expected the path to be within the project (${S})`);n+=`    ${JSON.stringify(I)}:\n`;for(let[R,N]of P){let U=J.relative(J.join(S,Ti),N);n+=`      ${JSON.stringify(R)}: ${JSON.stringify(U)}\n`}}}}let p=t.cwd,h=J.join(p,Ti,jBe);a&&await ce.removePromise(h),await ce.changeFilePromise(h,n,{automaticNewlines:!0})}async function PY(t,{unrollAliases:e=!1}={}){let r=t.cwd,s=J.join(r,Ti,jBe),a;try{a=await ce.statPromise(s)}catch{}if(!a)return null;let n=ls(await ce.readFilePromise(s,\"utf8\"));if(n.__metadata.version>HBe)return null;let c=n.__metadata.nmMode||\"classic\",f=new Map,p=new Map;delete n.__metadata;for(let[h,E]of Object.entries(n)){let C=E.locations.map(P=>J.join(r,P)),S=E.bin;if(S)for(let[P,I]of Object.entries(S)){let R=J.join(r,fe.toPortablePath(P)),N=je.getMapWithDefault(p,R);for(let[U,W]of Object.entries(I))N.set(U,fe.toPortablePath([R,Ti,W].join(J.sep)))}if(f.set(h,{target:vt.dot,linkType:\"HARD\",locations:C,aliases:E.aliases||[]}),e&&E.aliases)for(let P of E.aliases){let{scope:I,name:R}=G.parseLocator(h),N=G.makeLocator(G.makeIdent(I,R),P),U=G.stringifyLocator(N);f.set(U,{target:vt.dot,linkType:\"HARD\",locations:C,aliases:[]})}}return{locatorMap:f,binSymlinks:p,locationTree:GBe(f,{skipPrefix:t.cwd}),nmMode:c,mtimeMs:a.mtimeMs}}var bw=async(t,e)=>{if(t.split(J.sep).indexOf(Ti)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{let r;if(!e.innerLoop&&(r=await ce.lstatPromise(t),!r.isDirectory()&&!r.isSymbolicLink()||r.isSymbolicLink()&&!e.isWorkspaceDir)){await ce.unlinkPromise(t);return}let s=await ce.readdirPromise(t,{withFileTypes:!0});for(let n of s){let c=J.join(t,n.name);n.isDirectory()?(n.name!==Ti||e&&e.innerLoop)&&await bw(c,{innerLoop:!0,contentsOnly:!1}):await ce.unlinkPromise(c)}let a=!e.innerLoop&&e.isWorkspaceDir&&r?.isSymbolicLink();!e.contentsOnly&&!a&&await ce.rmdirPromise(t)}catch(r){if(r.code!==\"ENOENT\"&&r.code!==\"ENOTEMPTY\")throw r}},LBe=4,lN=(t,{skipPrefix:e})=>{let r=J.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let s=r.split(J.sep).filter(p=>p!==\"\"),a=s.indexOf(Ti),n=s.slice(0,a).join(J.sep),c=J.join(e,n),f=s.slice(a);return{locationRoot:c,segments:f}},GBe=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let s=()=>({children:new Map,linkType:\"HARD\"});for(let[a,n]of t.entries()){if(n.linkType===\"SOFT\"&&J.contains(e,n.target)!==null){let f=je.getFactoryWithDefault(r,n.target,s);f.locator=a,f.linkType=n.linkType}for(let c of n.locations){let{locationRoot:f,segments:p}=lN(c,{skipPrefix:e}),h=je.getFactoryWithDefault(r,f,s);for(let E=0;E<p.length;++E){let C=p[E];if(C!==\".\"){let S=je.getFactoryWithDefault(h.children,C,s);h.children.set(C,S),h=S}E===p.length-1&&(h.locator=a,h.linkType=n.linkType)}}}return r},QY=async(t,e,r)=>{if(process.platform===\"win32\"&&r===\"junctions\"){let s;try{s=await ce.lstatPromise(t)}catch{}if(!s||s.isDirectory()){await ce.symlinkPromise(t,e,\"junction\");return}}await ce.symlinkPromise(J.relative(J.dirname(e),t),e)};async function qBe(t,e,r){let s=J.join(t,`${xY.default.randomBytes(16).toString(\"hex\")}.tmp`);try{await ce.writeFilePromise(s,r);try{await ce.linkPromise(s,e)}catch{}}finally{await ce.unlinkPromise(s)}}async function Hdt({srcPath:t,dstPath:e,entry:r,globalHardlinksStore:s,baseFs:a,nmMode:n}){if(r.kind===\"file\"){if(n.value===\"hardlinks-global\"&&s&&r.digest){let f=J.join(s,r.digest.substring(0,2),`${r.digest.substring(2)}.dat`),p;try{let h=await ce.statPromise(f);if(h&&(!r.mtimeMs||h.mtimeMs>r.mtimeMs||h.mtimeMs<r.mtimeMs-Mdt))if(await Nn.checksumFile(f,{baseFs:ce,algorithm:\"sha1\"})!==r.digest){let C=J.join(s,`${xY.default.randomBytes(16).toString(\"hex\")}.tmp`);await ce.renamePromise(f,C);let S=await a.readFilePromise(t);await ce.writeFilePromise(C,S);try{await ce.linkPromise(C,f),r.mtimeMs=new Date().getTime(),await ce.unlinkPromise(C)}catch{}}else r.mtimeMs||(r.mtimeMs=Math.ceil(h.mtimeMs));await ce.linkPromise(f,e),p=!0}catch{p=!1}if(!p){let h=await a.readFilePromise(t);await qBe(s,f,h),r.mtimeMs=new Date().getTime();try{await ce.linkPromise(f,e)}catch(E){E&&E.code&&E.code==\"EXDEV\"&&(n.value=\"hardlinks-local\",await a.copyFilePromise(t,e))}}}else await a.copyFilePromise(t,e);let c=r.mode&511;c!==420&&await ce.chmodPromise(e,c)}}var jdt=async(t,e,{baseFs:r,globalHardlinksStore:s,nmMode:a,windowsLinkType:n,packageChecksum:c})=>{await ce.mkdirPromise(t,{recursive:!0});let f=async(E=vt.dot)=>{let C=J.join(e,E),S=await r.readdirPromise(C,{withFileTypes:!0}),P=new Map;for(let I of S){let R=J.join(E,I.name),N,U=J.join(C,I.name);if(I.isFile()){if(N={kind:\"file\",mode:(await r.lstatPromise(U)).mode},a.value===\"hardlinks-global\"){let W=await Nn.checksumFile(U,{baseFs:r,algorithm:\"sha1\"});N.digest=W}}else if(I.isDirectory())N={kind:\"directory\"};else if(I.isSymbolicLink())N={kind:\"symlink\",symlinkTo:await r.readlinkPromise(U)};else throw new Error(`Unsupported file type (file: ${U}, mode: 0o${await r.statSync(U).mode.toString(8).padStart(6,\"0\")})`);if(P.set(R,N),I.isDirectory()&&R!==Ti){let W=await f(R);for(let[ee,ie]of W)P.set(ee,ie)}}return P},p;if(a.value===\"hardlinks-global\"&&s&&c){let E=J.join(s,c.substring(0,2),`${c.substring(2)}.json`);try{p=new Map(Object.entries(JSON.parse(await ce.readFilePromise(E,\"utf8\"))))}catch{p=await f()}}else p=await f();let h=!1;for(let[E,C]of p){let S=J.join(e,E),P=J.join(t,E);if(C.kind===\"directory\")await ce.mkdirPromise(P,{recursive:!0});else if(C.kind===\"file\"){let I=C.mtimeMs;await Hdt({srcPath:S,dstPath:P,entry:C,nmMode:a,baseFs:r,globalHardlinksStore:s}),C.mtimeMs!==I&&(h=!0)}else C.kind===\"symlink\"&&await QY(J.resolve(J.dirname(P),C.symlinkTo),P,n)}if(a.value===\"hardlinks-global\"&&s&&h&&c){let E=J.join(s,c.substring(0,2),`${c.substring(2)}.json`);await ce.removePromise(E),await qBe(s,E,Buffer.from(JSON.stringify(Object.fromEntries(p))))}};function Gdt(t,e,r,s){let a=new Map,n=new Map,c=new Map,f=!1,p=(h,E,C,S,P)=>{let I=!0,R=J.join(h,E),N=new Set;if(E===Ti||E.startsWith(\"@\")){let W;try{W=ce.statSync(R)}catch{}I=!!W,W?W.mtimeMs>r?(f=!0,N=new Set(ce.readdirSync(R))):N=new Set(C.children.get(E).children.keys()):f=!0;let ee=e.get(h);if(ee){let ie=J.join(h,Ti,aN),ue;try{ue=ce.statSync(ie)}catch{}if(!ue)f=!0;else if(ue.mtimeMs>r){f=!0;let le=new Set(ce.readdirSync(ie)),me=new Map;n.set(h,me);for(let[pe,Be]of ee)le.has(pe)&&me.set(pe,Be)}else n.set(h,ee)}}else I=P.has(E);let U=C.children.get(E);if(I){let{linkType:W,locator:ee}=U,ie={children:new Map,linkType:W,locator:ee};if(S.children.set(E,ie),ee){let ue=je.getSetWithDefault(c,ee);ue.add(R),c.set(ee,ue)}for(let ue of U.children.keys())p(R,ue,U,ie,N)}else U.locator&&s.storedBuildState.delete(G.parseLocator(U.locator).locatorHash)};for(let[h,E]of t){let{linkType:C,locator:S}=E,P={children:new Map,linkType:C,locator:S};if(a.set(h,P),S){let I=je.getSetWithDefault(c,E.locator);I.add(h),c.set(E.locator,I)}E.children.has(Ti)&&p(h,Ti,E,P,new Set)}return{locationTree:a,binSymlinks:n,locatorLocations:c,installChangedByUser:f}}function WBe(t){let e=G.parseDescriptor(t);return G.isVirtualDescriptor(e)&&(e=G.devirtualizeDescriptor(e)),e.range.startsWith(\"link:\")}async function qdt(t,e,r,{loadManifest:s}){let a=new Map;for(let[f,{locations:p}]of t){let h=WBe(f)?null:await s(f,p[0]),E=new Map;if(h)for(let[C,S]of h.bin){let P=J.join(p[0],S);S!==\"\"&&ce.existsSync(P)&&E.set(C,S)}a.set(f,E)}let n=new Map,c=(f,p,h)=>{let E=new Map,C=J.contains(r,f);if(h.locator&&C!==null){let S=a.get(h.locator);for(let[P,I]of S){let R=J.join(f,fe.toPortablePath(I));E.set(P,R)}for(let[P,I]of h.children){let R=J.join(f,P),N=c(R,R,I);N.size>0&&n.set(f,new Map([...n.get(f)||new Map,...N]))}}else for(let[S,P]of h.children){let I=c(J.join(f,S),p,P);for(let[R,N]of I)E.set(R,N)}return E};for(let[f,p]of e){let h=c(f,f,p);h.size>0&&n.set(f,new Map([...n.get(f)||new Map,...h]))}return n}var MBe=(t,e)=>{if(!t||!e)return t===e;let r=G.parseLocator(t);G.isVirtualLocator(r)&&(r=G.devirtualizeLocator(r));let s=G.parseLocator(e);return G.isVirtualLocator(s)&&(s=G.devirtualizeLocator(s)),G.areLocatorsEqual(r,s)};function TY(t){return J.join(t.get(\"globalFolder\"),\"store\")}function Wdt(t,e){let r=s=>{let a=s.split(J.sep),n=a.lastIndexOf(Ti);if(n<0||n==a.length-1)throw new Error(`Assertion failed. Path is outside of any node_modules package ${s}`);return a.slice(0,n+(a[n+1].startsWith(\"@\")?3:2)).join(J.sep)};for(let s of t.values())for(let[a,n]of s)e.has(r(n))&&s.delete(a)}async function Ydt(t,e,{baseFs:r,project:s,report:a,loadManifest:n,realLocatorChecksums:c}){let f=J.join(s.cwd,Ti),{locationTree:p,binSymlinks:h,locatorLocations:E,installChangedByUser:C}=Gdt(t.locationTree,t.binSymlinks,t.mtimeMs,s),S=GBe(e,{skipPrefix:s.cwd}),P=[],I=async({srcDir:Be,dstDir:Ce,linkType:g,globalHardlinksStore:we,nmMode:ye,windowsLinkType:Ae,packageChecksum:se})=>{let Z=(async()=>{try{g===\"SOFT\"?(await ce.mkdirPromise(J.dirname(Ce),{recursive:!0}),await QY(J.resolve(Be),Ce,Ae)):await jdt(Ce,Be,{baseFs:r,globalHardlinksStore:we,nmMode:ye,windowsLinkType:Ae,packageChecksum:se})}catch(De){throw De.message=`While persisting ${Be} -> ${Ce} ${De.message}`,De}finally{ie.tick()}})().then(()=>P.splice(P.indexOf(Z),1));P.push(Z),P.length>LBe&&await Promise.race(P)},R=async(Be,Ce,g)=>{let we=(async()=>{let ye=async(Ae,se,Z)=>{try{Z.innerLoop||await ce.mkdirPromise(se,{recursive:!0});let De=await ce.readdirPromise(Ae,{withFileTypes:!0});for(let Re of De){if(!Z.innerLoop&&Re.name===aN)continue;let mt=J.join(Ae,Re.name),j=J.join(se,Re.name);Re.isDirectory()?(Re.name!==Ti||Z&&Z.innerLoop)&&(await ce.mkdirPromise(j,{recursive:!0}),await ye(mt,j,{...Z,innerLoop:!0})):me.value===\"hardlinks-local\"||me.value===\"hardlinks-global\"?await ce.linkPromise(mt,j):await ce.copyFilePromise(mt,j,_Be.default.constants.COPYFILE_FICLONE)}}catch(De){throw Z.innerLoop||(De.message=`While cloning ${Ae} -> ${se} ${De.message}`),De}finally{Z.innerLoop||ie.tick()}};await ye(Be,Ce,g)})().then(()=>P.splice(P.indexOf(we),1));P.push(we),P.length>LBe&&await Promise.race(P)},N=async(Be,Ce,g)=>{if(g)for(let[we,ye]of Ce.children){let Ae=g.children.get(we);await N(J.join(Be,we),ye,Ae)}else{Ce.children.has(Ti)&&await bw(J.join(Be,Ti),{contentsOnly:!1});let we=J.basename(Be)===Ti&&p.has(J.join(J.dirname(Be)));await bw(Be,{contentsOnly:Be===f,isWorkspaceDir:we})}};for(let[Be,Ce]of p){let g=S.get(Be);for(let[we,ye]of Ce.children){if(we===\".\")continue;let Ae=g&&g.children.get(we),se=J.join(Be,we);await N(se,ye,Ae)}}let U=async(Be,Ce,g)=>{if(g){MBe(Ce.locator,g.locator)||await bw(Be,{contentsOnly:Ce.linkType===\"HARD\"});for(let[we,ye]of Ce.children){let Ae=g.children.get(we);await U(J.join(Be,we),ye,Ae)}}else{Ce.children.has(Ti)&&await bw(J.join(Be,Ti),{contentsOnly:!0});let we=J.basename(Be)===Ti&&S.has(J.join(J.dirname(Be)));await bw(Be,{contentsOnly:Ce.linkType===\"HARD\",isWorkspaceDir:we})}};for(let[Be,Ce]of S){let g=p.get(Be);for(let[we,ye]of Ce.children){if(we===\".\")continue;let Ae=g&&g.children.get(we);await U(J.join(Be,we),ye,Ae)}}let W=new Map,ee=[];for(let[Be,Ce]of E)for(let g of Ce){let{locationRoot:we,segments:ye}=lN(g,{skipPrefix:s.cwd}),Ae=S.get(we),se=we;if(Ae){for(let Z of ye)if(se=J.join(se,Z),Ae=Ae.children.get(Z),!Ae)break;if(Ae){let Z=MBe(Ae.locator,Be),De=e.get(Ae.locator),Re=De.target,mt=se,j=De.linkType;if(Z)W.has(Re)||W.set(Re,mt);else if(Re!==mt){let rt=G.parseLocator(Ae.locator);G.isVirtualLocator(rt)&&(rt=G.devirtualizeLocator(rt)),ee.push({srcDir:Re,dstDir:mt,linkType:j,realLocatorHash:rt.locatorHash})}}}}for(let[Be,{locations:Ce}]of e.entries())for(let g of Ce){let{locationRoot:we,segments:ye}=lN(g,{skipPrefix:s.cwd}),Ae=p.get(we),se=S.get(we),Z=we,De=e.get(Be),Re=G.parseLocator(Be);G.isVirtualLocator(Re)&&(Re=G.devirtualizeLocator(Re));let mt=Re.locatorHash,j=De.target,rt=g;if(j===rt)continue;let Fe=De.linkType;for(let Ne of ye)se=se.children.get(Ne);if(!Ae)ee.push({srcDir:j,dstDir:rt,linkType:Fe,realLocatorHash:mt});else for(let Ne of ye)if(Z=J.join(Z,Ne),Ae=Ae.children.get(Ne),!Ae){ee.push({srcDir:j,dstDir:rt,linkType:Fe,realLocatorHash:mt});break}}let ie=Ao.progressViaCounter(ee.length),ue=a.reportProgress(ie),le=s.configuration.get(\"nmMode\"),me={value:le},pe=s.configuration.get(\"winLinkType\");try{let Be=me.value===\"hardlinks-global\"?`${TY(s.configuration)}/v1`:null;if(Be&&!await ce.existsPromise(Be)){await ce.mkdirpPromise(Be);for(let g=0;g<256;g++)await ce.mkdirPromise(J.join(Be,g.toString(16).padStart(2,\"0\")))}for(let g of ee)(g.linkType===\"SOFT\"||!W.has(g.srcDir))&&(W.set(g.srcDir,g.dstDir),await I({...g,globalHardlinksStore:Be,nmMode:me,windowsLinkType:pe,packageChecksum:c.get(g.realLocatorHash)||null}));await Promise.all(P),P.length=0;for(let g of ee){let we=W.get(g.srcDir);g.linkType!==\"SOFT\"&&g.dstDir!==we&&await R(we,g.dstDir,{nmMode:me})}await Promise.all(P),await ce.mkdirPromise(f,{recursive:!0}),Wdt(h,new Set(ee.map(g=>g.dstDir)));let Ce=await qdt(e,S,s.cwd,{loadManifest:n});await Vdt(h,Ce,s.cwd,pe),await _dt(s,e,Ce,me,{installChangedByUser:C}),le==\"hardlinks-global\"&&me.value==\"hardlinks-local\"&&a.reportWarningOnce(74,\"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices\")}finally{ue.stop()}}async function Vdt(t,e,r,s){for(let a of t.keys()){if(J.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);if(!e.has(a)){let n=J.join(a,Ti,aN);await ce.removePromise(n)}}for(let[a,n]of e){if(J.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);let c=J.join(a,Ti,aN),f=t.get(a)||new Map;await ce.mkdirPromise(c,{recursive:!0});for(let p of f.keys())n.has(p)||(await ce.removePromise(J.join(c,p)),process.platform===\"win32\"&&await ce.removePromise(J.join(c,`${p}.cmd`)));for(let[p,h]of n){let E=f.get(p),C=J.join(c,p);E!==h&&(process.platform===\"win32\"?await(0,UBe.default)(fe.fromPortablePath(h),fe.fromPortablePath(C),{createPwshFile:!1}):(await ce.removePromise(C),await QY(h,C,s),J.contains(r,await ce.realpathPromise(h))!==null&&await ce.chmodPromise(h,493)))}}}Ge();Dt();eA();var GD=class extends sg{constructor(){super(...arguments);this.mode=\"loose\"}makeInstaller(r){return new RY(r)}},RY=class extends Gm{constructor(){super(...arguments);this.mode=\"loose\"}async transformPnpSettings(r){let s=new uo({baseFs:new $f({maxOpenFiles:80,readOnlyArchives:!0})}),a=SBe(r,this.opts.project.cwd,s),{tree:n,errors:c}=kD(a,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:C,text:S}of c)this.opts.report.reportError(C,S);return}let f=new Map;r.fallbackPool=f;let p=(C,S)=>{let P=G.parseLocator(S.locator),I=G.stringifyIdent(P);I===C?f.set(C,P.reference):f.set(C,[I,P.reference])},h=J.join(this.opts.project.cwd,Er.nodeModules),E=n.get(h);if(!(typeof E>\"u\")){if(\"target\"in E)throw new Error(\"Assertion failed: Expected the root junction point to be a directory\");for(let C of E.dirList){let S=J.join(h,C),P=n.get(S);if(typeof P>\"u\")throw new Error(\"Assertion failed: Expected the child to have been registered\");if(\"target\"in P)p(C,P);else for(let I of P.dirList){let R=J.join(S,I),N=n.get(R);if(typeof N>\"u\")throw new Error(\"Assertion failed: Expected the subchild to have been registered\");if(\"target\"in N)p(`${C}/${I}`,N);else throw new Error(\"Assertion failed: Expected the leaf junction to be a package\")}}}}};var Jdt={hooks:{cleanGlobalArtifacts:async t=>{let e=TY(t);await ce.removePromise(e)}},configuration:{nmHoistingLimits:{description:\"Prevents packages to be hoisted past specific levels\",type:\"STRING\",values:[\"workspaces\",\"dependencies\",\"none\"],default:\"none\"},nmMode:{description:\"Defines in which measure Yarn must use hardlinks and symlinks when generated `node_modules` directories.\",type:\"STRING\",values:[\"classic\",\"hardlinks-local\",\"hardlinks-global\"],default:\"classic\"},nmSelfReferences:{description:\"Defines whether the linker should generate self-referencing symlinks for workspaces.\",type:\"BOOLEAN\",default:!0}},linkers:[jD,GD]},Kdt=Jdt;var FK={};Vt(FK,{NpmHttpFetcher:()=>VD,NpmRemapResolver:()=>JD,NpmSemverFetcher:()=>oh,NpmSemverResolver:()=>KD,NpmTagResolver:()=>zD,default:()=>ubt,npmConfigUtils:()=>hi,npmHttpUtils:()=>en,npmPublishUtils:()=>v1});Ge();var $Be=ut(Ai());var oi=\"npm:\";var en={};Vt(en,{AuthType:()=>zBe,customPackageError:()=>qm,del:()=>Amt,get:()=>Wm,getIdentUrl:()=>WD,getPackageMetadata:()=>Qw,handleInvalidAuthenticationError:()=>ag,post:()=>umt,put:()=>fmt});Ge();Ge();Dt();var LY=ut(Vv());ql();var KBe=ut(Ai());var hi={};Vt(hi,{RegistryType:()=>VBe,getAuditRegistry:()=>zdt,getAuthConfiguration:()=>OY,getDefaultRegistry:()=>qD,getPublishRegistry:()=>Xdt,getRegistryConfiguration:()=>JBe,getScopeConfiguration:()=>NY,getScopeRegistry:()=>Pw,isPackageApproved:()=>xw,normalizeRegistry:()=>Jc});Ge();var YBe=ut(Go()),VBe=(s=>(s.AUDIT_REGISTRY=\"npmAuditRegistry\",s.FETCH_REGISTRY=\"npmRegistryServer\",s.PUBLISH_REGISTRY=\"npmPublishRegistry\",s))(VBe||{});function Jc(t){return t.replace(/\\/$/,\"\")}function zdt({configuration:t}){return qD({configuration:t,type:\"npmAuditRegistry\"})}function Xdt(t,{configuration:e}){return t.publishConfig?.registry?Jc(t.publishConfig.registry):t.name?Pw(t.name.scope,{configuration:e,type:\"npmPublishRegistry\"}):qD({configuration:e,type:\"npmPublishRegistry\"})}function Pw(t,{configuration:e,type:r=\"npmRegistryServer\"}){let s=NY(t,{configuration:e});if(s===null)return qD({configuration:e,type:r});let a=s.get(r);return a===null?qD({configuration:e,type:r}):Jc(a)}function qD({configuration:t,type:e=\"npmRegistryServer\"}){let r=t.get(e);return Jc(r!==null?r:t.get(\"npmRegistryServer\"))}function JBe(t,{configuration:e}){let r=e.get(\"npmRegistries\"),s=Jc(t),a=r.get(s);if(typeof a<\"u\")return a;let n=r.get(s.replace(/^[a-z]+:/,\"\"));return typeof n<\"u\"?n:null}var Zdt=new Map([[\"npmRegistryServer\",\"https://npm.jsr.io/\"]]);function NY(t,{configuration:e}){if(t===null)return null;let s=e.get(\"npmScopes\").get(t);return s||(t===\"jsr\"?Zdt:null)}function OY(t,{configuration:e,ident:r}){let s=r&&NY(r.scope,{configuration:e});return s?.get(\"npmAuthIdent\")||s?.get(\"npmAuthToken\")?s:JBe(t,{configuration:e})||e}function $dt({configuration:t,version:e,publishTimes:r}){let s=t.get(\"npmMinimalAgeGate\");if(s){let a=r?.[e];if(typeof a>\"u\"||(new Date().getTime()-new Date(a).getTime())/60/1e3<s)return!0}return!1}function emt(t,e,r){let s=G.tryParseDescriptor(r);if(!s||s.identHash!==t.identHash&&!YBe.default.isMatch(G.stringifyIdent(t),G.stringifyIdent(s)))return!1;if(s.range===\"unknown\")return!0;let a=Fr.validRange(s.range);return!(!a||!a.test(e))}function tmt({configuration:t,ident:e,version:r}){return t.get(\"npmPreapprovedPackages\").some(s=>emt(e,r,s))}function xw(t){return!$dt(t)||tmt(t)}var zBe=(a=>(a[a.NO_AUTH=0]=\"NO_AUTH\",a[a.BEST_EFFORT=1]=\"BEST_EFFORT\",a[a.CONFIGURATION=2]=\"CONFIGURATION\",a[a.ALWAYS_AUTH=3]=\"ALWAYS_AUTH\",a))(zBe||{});async function ag(t,{attemptedAs:e,registry:r,headers:s,configuration:a}){if(uN(t))throw new jt(41,\"Invalid OTP token\");if(t.originalError?.name===\"HTTPError\"&&t.originalError?.response.statusCode===401)throw new jt(41,`Invalid authentication (${typeof e!=\"string\"?`as ${await hmt(r,s,{configuration:a})}`:`attempted as ${e}`})`)}function qm(t,e){let r=t.response?.statusCode;return r?r===404?\"Package not found\":r>=500&&r<600?`The registry appears to be down (using a ${he.applyHyperlink(e,\"local cache\",\"https://yarnpkg.com/advanced/lexicon#local-cache\")} might have protected you against such outages)`:null:null}function WD(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}var XBe=new Map,rmt=new Map;async function nmt(t){return await je.getFactoryWithDefault(XBe,t,async()=>{let e=null;try{e=await ce.readJsonPromise(t)}catch{}return e})}async function imt(t,e,{configuration:r,cached:s,registry:a,headers:n,version:c,...f}){return await je.getFactoryWithDefault(rmt,t,async()=>await Wm(WD(e),{...f,customErrorMessage:qm,configuration:r,registry:a,ident:e,headers:{...n,\"If-None-Match\":s?.etag,\"If-Modified-Since\":s?.lastModified},wrapNetworkRequest:async p=>async()=>{let h=await p();if(h.statusCode===304){if(s===null)throw new Error(\"Assertion failed: cachedMetadata should not be null\");return{...h,body:s.metadata}}let E=omt(JSON.parse(h.body.toString())),C={metadata:E,etag:h.headers.etag,lastModified:h.headers[\"last-modified\"]};return XBe.set(t,Promise.resolve(C)),Promise.resolve().then(async()=>{let S=`${t}-${process.pid}.tmp`;await ce.mkdirPromise(J.dirname(S),{recursive:!0}),await ce.writeJsonPromise(S,C,{compact:!0}),await ce.renamePromise(S,t)}).catch(()=>{}),{...h,body:E}}}))}function smt(t){return t.scope!==null?`@${t.scope}-${t.name}-${t.scope.length}`:t.name}async function Qw(t,{cache:e,project:r,registry:s,headers:a,version:n,...c}){let{configuration:f}=r;s=YD(f,{ident:t,registry:s});let p=lmt(f,s),h=J.join(p,`${smt(t)}.json`),E=null;if(!r.lockfileNeedsRefresh&&(E=await nmt(h),E)){if(typeof n<\"u\"&&typeof E.metadata.versions[n]<\"u\")return E.metadata;if(f.get(\"enableOfflineMode\")){let C=structuredClone(E.metadata),S=new Set;if(e){for(let I of Object.keys(C.versions)){let R=G.makeLocator(t,`npm:${I}`),N=e.getLocatorMirrorPath(R);(!N||!ce.existsSync(N))&&(delete C.versions[I],S.add(I))}let P=C[\"dist-tags\"].latest;if(S.has(P)){let I=Object.keys(E.metadata.versions).sort(KBe.default.compare),R=I.indexOf(P);for(;S.has(I[R])&&R>=0;)R-=1;R>=0?C[\"dist-tags\"].latest=I[R]:delete C[\"dist-tags\"].latest}}return C}}return await imt(h,t,{...c,configuration:f,cached:E,registry:s,headers:a,version:n})}var ZBe=[\"name\",\"dist.tarball\",\"bin\",\"scripts\",\"os\",\"cpu\",\"libc\",\"dependencies\",\"dependenciesMeta\",\"optionalDependencies\",\"peerDependencies\",\"peerDependenciesMeta\",\"deprecated\"];function omt(t){return{\"dist-tags\":t[\"dist-tags\"],versions:Object.fromEntries(Object.entries(t.versions).map(([e,r])=>[e,Kd(r,ZBe)])),time:t.time}}var amt=Nn.makeHash(\"time\",...ZBe).slice(0,6);function lmt(t,e){let r=cmt(t),s=new URL(e);return J.join(r,amt,s.hostname)}function cmt(t){return J.join(t.get(\"globalFolder\"),\"metadata/npm\")}async function Wm(t,{configuration:e,headers:r,ident:s,authType:a,allowOidc:n,registry:c,...f}){c=YD(e,{ident:s,registry:c}),s&&s.scope&&typeof a>\"u\"&&(a=1);let p=await cN(c,{authType:a,allowOidc:n,configuration:e,ident:s});p&&(r={...r,authorization:p});try{return await nn.get(t.charAt(0)===\"/\"?`${c}${t}`:t,{configuration:e,headers:r,...f})}catch(h){throw await ag(h,{registry:c,configuration:e,headers:r}),h}}async function umt(t,e,{attemptedAs:r,configuration:s,headers:a,ident:n,authType:c=3,allowOidc:f,registry:p,otp:h,...E}){p=YD(s,{ident:n,registry:p});let C=await cN(p,{authType:c,allowOidc:f,configuration:s,ident:n});C&&(a={...a,authorization:C}),h&&(a={...a,...kw(h)});try{return await nn.post(p+t,e,{configuration:s,headers:a,...E})}catch(S){if(!uN(S)||h)throw await ag(S,{attemptedAs:r,registry:p,configuration:s,headers:a}),S;h=await MY(S,{configuration:s});let P={...a,...kw(h)};try{return await nn.post(`${p}${t}`,e,{configuration:s,headers:P,...E})}catch(I){throw await ag(I,{attemptedAs:r,registry:p,configuration:s,headers:a}),I}}}async function fmt(t,e,{attemptedAs:r,configuration:s,headers:a,ident:n,authType:c=3,allowOidc:f,registry:p,otp:h,...E}){p=YD(s,{ident:n,registry:p});let C=await cN(p,{authType:c,allowOidc:f,configuration:s,ident:n});C&&(a={...a,authorization:C}),h&&(a={...a,...kw(h)});try{return await nn.put(p+t,e,{configuration:s,headers:a,...E})}catch(S){if(!uN(S))throw await ag(S,{attemptedAs:r,registry:p,configuration:s,headers:a}),S;h=await MY(S,{configuration:s});let P={...a,...kw(h)};try{return await nn.put(`${p}${t}`,e,{configuration:s,headers:P,...E})}catch(I){throw await ag(I,{attemptedAs:r,registry:p,configuration:s,headers:a}),I}}}async function Amt(t,{attemptedAs:e,configuration:r,headers:s,ident:a,authType:n=3,allowOidc:c,registry:f,otp:p,...h}){f=YD(r,{ident:a,registry:f});let E=await cN(f,{authType:n,allowOidc:c,configuration:r,ident:a});E&&(s={...s,authorization:E}),p&&(s={...s,...kw(p)});try{return await nn.del(f+t,{configuration:r,headers:s,...h})}catch(C){if(!uN(C)||p)throw await ag(C,{attemptedAs:e,registry:f,configuration:r,headers:s}),C;p=await MY(C,{configuration:r});let S={...s,...kw(p)};try{return await nn.del(`${f}${t}`,{configuration:r,headers:S,...h})}catch(P){throw await ag(P,{attemptedAs:e,registry:f,configuration:r,headers:s}),P}}}function YD(t,{ident:e,registry:r}){if(typeof r>\"u\"&&e)return Pw(e.scope,{configuration:t});if(typeof r!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");return Jc(r)}async function cN(t,{authType:e=2,allowOidc:r=!1,configuration:s,ident:a}){let n=OY(t,{configuration:s,ident:a}),c=pmt(n,e);if(!c)return null;let f=await s.reduceHook(p=>p.getNpmAuthenticationHeader,void 0,t,{configuration:s,ident:a});if(f)return f;if(n.get(\"npmAuthToken\"))return`Bearer ${n.get(\"npmAuthToken\")}`;if(n.get(\"npmAuthIdent\")){let p=n.get(\"npmAuthIdent\");return p.includes(\":\")?`Basic ${Buffer.from(p).toString(\"base64\")}`:`Basic ${p}`}if(r&&a){let p=await gmt(t,{configuration:s,ident:a});if(p)return`Bearer ${p}`}if(c&&e!==1)throw new jt(33,\"No authentication configured for request\");return null}function pmt(t,e){switch(e){case 2:return t.get(\"npmAlwaysAuth\");case 1:case 3:return!0;case 0:return!1;default:throw new Error(\"Unreachable\")}}async function hmt(t,e,{configuration:r}){if(typeof e>\"u\"||typeof e.authorization>\"u\")return\"an anonymous user\";try{return(await nn.get(new URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username??\"an unknown user\"}catch{return\"an unknown user\"}}async function MY(t,{configuration:e}){let r=t.originalError?.response.headers[\"npm-notice\"];if(r&&(await Ot.start({configuration:e,stdout:process.stdout,includeFooter:!1},async a=>{if(a.reportInfo(0,r.replace(/(https?:\\/\\/\\S+)/g,he.pretty(e,\"$1\",he.Type.URL))),!process.env.YARN_IS_TEST_ENV){let n=r.match(/open (https?:\\/\\/\\S+)/i);if(n&&Ui.openUrl){let{openNow:c}=await(0,LY.prompt)({type:\"confirm\",name:\"openNow\",message:\"Do you want to try to open this url now?\",required:!0,initial:!0,onCancel:()=>process.exit(130)});c&&(await Ui.openUrl(n[1])||(a.reportSeparator(),a.reportWarning(0,\"We failed to automatically open the url; you'll have to open it yourself in your browser of choice.\")))}}}),process.stdout.write(`\n`)),process.env.YARN_IS_TEST_ENV)return process.env.YARN_INJECT_NPM_2FA_TOKEN||\"\";let{otp:s}=await(0,LY.prompt)({type:\"password\",name:\"otp\",message:\"One-time password:\",required:!0,onCancel:()=>process.exit(130)});return process.stdout.write(`\n`),s}function uN(t){if(t.originalError?.name!==\"HTTPError\")return!1;try{return(t.originalError?.response.headers[\"www-authenticate\"].split(/,\\s*/).map(r=>r.toLowerCase())).includes(\"otp\")}catch{return!1}}function kw(t){return{\"npm-otp\":t}}async function gmt(t,{configuration:e,ident:r}){let s=null;if(process.env.GITLAB_CI)s=process.env.NPM_ID_TOKEN||null;else if(process.env.GITHUB_ACTIONS){if(!(process.env.ACTIONS_ID_TOKEN_REQUEST_URL&&process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN))return null;let a=`npm:${new URL(t).host.replace(\"registry.yarnpkg.com\",\"registry.npmjs.org\").replace(\"yarn.npmjs.org\",\"registry.npmjs.org\")}`,n=new URL(process.env.ACTIONS_ID_TOKEN_REQUEST_URL);n.searchParams.append(\"audience\",a),s=(await nn.get(n.href,{configuration:e,jsonResponse:!0,headers:{Authorization:`Bearer ${process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN}`}})).value}if(!s)return null;try{return(await nn.post(`${t}/-/npm/v1/oidc/token/exchange/package${WD(r)}`,null,{configuration:e,jsonResponse:!0,headers:{Authorization:`Bearer ${s}`}})).token||null}catch{}return null}var VD=class{supports(e,r){if(!e.reference.startsWith(oi))return!1;let{selector:s,params:a}=G.parseRange(e.reference);return!(!$Be.default.valid(s)||a===null||typeof a.__archiveUrl!=\"string\")}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:c}}async fetchFromNetwork(e,r){let{params:s}=G.parseRange(e.reference);if(s===null||typeof s.__archiveUrl!=\"string\")throw new Error(\"Assertion failed: The archiveUrl querystring parameter should have been available\");let a=await Wm(s.__archiveUrl,{customErrorMessage:qm,configuration:r.project.configuration,ident:e});return await ps.convertToZip(a,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ge();var JD=class{supportsDescriptor(e,r){return!(!e.range.startsWith(oi)||!G.tryParseDescriptor(e.range.slice(oi.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error(\"Unreachable\")}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){let s=r.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(oi.length),!0));return r.resolver.getResolutionDependencies(s,r)}async getCandidates(e,r,s){let a=s.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(oi.length),!0));return await s.resolver.getCandidates(a,r,s)}async getSatisfying(e,r,s,a){let n=a.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(oi.length),!0));return a.resolver.getSatisfying(n,r,s,a)}resolve(e,r){throw new Error(\"Unreachable\")}};Ge();Ge();var eve=ut(Ai());var oh=class t{supports(e,r){if(!e.reference.startsWith(oi))return!1;let s=new URL(e.reference);return!(!eve.default.valid(s.pathname)||s.searchParams.has(\"__archiveUrl\"))}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:c}}async fetchFromNetwork(e,r){let s;try{s=await Wm(t.getLocatorUrl(e),{customErrorMessage:qm,configuration:r.project.configuration,ident:e})}catch{s=await Wm(t.getLocatorUrl(e).replace(/%2f/g,\"/\"),{customErrorMessage:qm,configuration:r.project.configuration,ident:e})}return await ps.convertToZip(s,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:s}){let a=Pw(e.scope,{configuration:s}),n=t.getLocatorUrl(e);return r=r.replace(/^https?:(\\/\\/(?:[^/]+\\.)?npmjs.org(?:$|\\/))/,\"https:$1\"),a=a.replace(/^https:\\/\\/registry\\.npmjs\\.org($|\\/)/,\"https://registry.yarnpkg.com$1\"),r=r.replace(/^https:\\/\\/registry\\.npmjs\\.org($|\\/)/,\"https://registry.yarnpkg.com$1\"),r===a+n||r===a+n.replace(/%2f/g,\"/\")}static getLocatorUrl(e){let r=Fr.clean(e.reference.slice(oi.length));if(r===null)throw new jt(10,\"The npm semver resolver got selected, but the version isn't semver\");return`${WD(e)}/-/${e.name}-${r}.tgz`}};Ge();Ge();Ge();var UY=ut(Ai());var fN=G.makeIdent(null,\"node-gyp\"),dmt=/\\b(node-gyp|prebuild-install)\\b/,KD=class{supportsDescriptor(e,r){return e.range.startsWith(oi)?!!Fr.validRange(e.range.slice(oi.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(oi))return!1;let{selector:s}=G.parseRange(e.reference);return!!UY.default.valid(s)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){let a=Fr.validRange(e.range.slice(oi.length));if(a===null)throw new Error(`Expected a valid range, got ${e.range.slice(oi.length)}`);let n=await Qw(e,{cache:s.fetchOptions?.cache,project:s.project,version:UY.default.valid(a.raw)?a.raw:void 0}),c=je.mapAndFilter(Object.keys(n.versions),h=>{try{let E=new Fr.SemVer(h);if(a.test(E))return xw({configuration:s.project.configuration,ident:e,version:h,publishTimes:n.time})?E:je.mapAndFilter.skip}catch{}return je.mapAndFilter.skip}),f=c.filter(h=>!n.versions[h.raw].deprecated),p=f.length>0?f:c;return p.sort((h,E)=>-h.compare(E)),p.map(h=>{let E=G.makeLocator(e,`${oi}${h.raw}`),C=n.versions[h.raw].dist.tarball;return oh.isConventionalTarballUrl(E,C,{configuration:s.project.configuration})?E:G.bindLocator(E,{__archiveUrl:C})})}async getSatisfying(e,r,s,a){let n=Fr.validRange(e.range.slice(oi.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(oi.length)}`);return{locators:je.mapAndFilter(s,p=>{if(p.identHash!==e.identHash)return je.mapAndFilter.skip;let h=G.tryParseRange(p.reference,{requireProtocol:oi});if(!h)return je.mapAndFilter.skip;let E=new Fr.SemVer(h.selector);return n.test(E)?{locator:p,version:E}:je.mapAndFilter.skip}).sort((p,h)=>-p.version.compare(h.version)).map(({locator:p})=>p),sorted:!0}}async resolve(e,r){let{selector:s}=G.parseRange(e.reference),a=Fr.clean(s);if(a===null)throw new jt(10,\"The npm semver resolver got selected, but the version isn't semver\");let n=await Qw(e,{cache:r.fetchOptions?.cache,project:r.project,version:a});if(!Object.hasOwn(n,\"versions\"))throw new jt(15,'Registry returned invalid data for - missing \"versions\" field');if(!Object.hasOwn(n.versions,a))throw new jt(16,`Registry failed to return reference \"${a}\"`);let c=new Ut;if(c.load(n.versions[a]),!c.dependencies.has(fN.identHash)&&!c.peerDependencies.has(fN.identHash)){for(let f of c.scripts.values())if(f.match(dmt)){c.dependencies.set(fN.identHash,G.makeDescriptor(fN,\"latest\"));break}}return{...e,version:a,languageName:\"node\",linkType:\"HARD\",conditions:c.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(c.dependencies),peerDependencies:c.peerDependencies,dependenciesMeta:c.dependenciesMeta,peerDependenciesMeta:c.peerDependenciesMeta,bin:c.bin}}};Ge();Ge();var AN=ut(Ai());var zD=class{supportsDescriptor(e,r){return!(!e.range.startsWith(oi)||!Mp.test(e.range.slice(oi.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error(\"Unreachable\")}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){let a=e.range.slice(oi.length),n=await Qw(e,{cache:s.fetchOptions?.cache,project:s.project});if(!Object.hasOwn(n,\"dist-tags\"))throw new jt(15,'Registry returned invalid data - missing \"dist-tags\" field');let c=n[\"dist-tags\"];if(!Object.hasOwn(c,a))throw new jt(16,`Registry failed to return tag \"${a}\"`);let f=Object.keys(n.versions),p=n.time,h=c[a];if(a===\"latest\"&&!xw({configuration:s.project.configuration,ident:e,version:h,publishTimes:p})){let S=h.includes(\"-\"),P=AN.default.rsort(f).find(I=>AN.default.lt(I,h)&&(S||!I.includes(\"-\"))&&xw({configuration:s.project.configuration,ident:e,version:I,publishTimes:p}));if(!P)throw new jt(16,`The version for tag \"${a}\" is quarantined, and no lower version is available`);h=P}let E=G.makeLocator(e,`${oi}${h}`),C=n.versions[h].dist.tarball;return oh.isConventionalTarballUrl(E,C,{configuration:s.project.configuration})?[E]:[G.bindLocator(E,{__archiveUrl:C})]}async getSatisfying(e,r,s,a){let n=[];for(let c of s){if(c.identHash!==e.identHash)continue;let f=G.tryParseRange(c.reference,{requireProtocol:oi});if(!(!f||!AN.default.valid(f.selector))){if(f.params?.__archiveUrl){let p=G.makeRange({protocol:oi,selector:f.selector,source:null,params:null}),[h]=await a.resolver.getCandidates(G.makeDescriptor(e,p),r,a);if(c.reference!==h.reference)continue}n.push(c)}}return{locators:n,sorted:!1}}async resolve(e,r){throw new Error(\"Unreachable\")}};var v1={};Vt(v1,{getGitHead:()=>abt,getPublishAccess:()=>qxe,getReadmeContent:()=>Wxe,makePublishBody:()=>obt});Ge();Ge();Dt();var bV={};Vt(bV,{PackCommand:()=>jw,default:()=>KEt,packUtils:()=>yA});Ge();Ge();Ge();Dt();Yt();var yA={};Vt(yA,{genPackList:()=>NN,genPackStream:()=>DV,genPackageManifest:()=>QSe,hasPackScripts:()=>vV,prepareForPack:()=>SV});Ge();Dt();var BV=ut(Go()),xSe=ut(SSe()),kSe=Ie(\"zlib\"),MEt=[\"/package.json\",\"/readme\",\"/readme.*\",\"/license\",\"/license.*\",\"/licence\",\"/licence.*\",\"/changelog\",\"/changelog.*\"],UEt=[\"/package.tgz\",\".github\",\".git\",\".hg\",\"node_modules\",\".npmignore\",\".gitignore\",\".#*\",\".DS_Store\"];async function vV(t){return!!(In.hasWorkspaceScript(t,\"prepack\")||In.hasWorkspaceScript(t,\"postpack\"))}async function SV(t,{report:e},r){await In.maybeExecuteWorkspaceLifecycleScript(t,\"prepack\",{report:e});try{let s=J.join(t.cwd,Ut.fileName);await ce.existsPromise(s)&&await t.manifest.loadFile(s,{baseFs:ce}),await r()}finally{await In.maybeExecuteWorkspaceLifecycleScript(t,\"postpack\",{report:e})}}async function DV(t,e){typeof e>\"u\"&&(e=await NN(t));let r=new Set;for(let n of t.manifest.publishConfig?.executableFiles??new Set)r.add(J.normalize(n));for(let n of t.manifest.bin.values())r.add(J.normalize(n));let s=xSe.default.pack();process.nextTick(async()=>{for(let n of e){let c=J.normalize(n),f=J.resolve(t.cwd,c),p=J.join(\"package\",c),h=await ce.lstatPromise(f),E={name:p,mtime:new Date(fi.SAFE_TIME*1e3)},C=r.has(c)?493:420,S,P,I=new Promise((N,U)=>{S=N,P=U}),R=N=>{N?P(N):S()};if(h.isFile()){let N;c===\"package.json\"?N=Buffer.from(JSON.stringify(await QSe(t),null,2)):N=await ce.readFilePromise(f),s.entry({...E,mode:C,type:\"file\"},N,R)}else h.isSymbolicLink()?s.entry({...E,mode:C,type:\"symlink\",linkname:await ce.readlinkPromise(f)},R):R(new Error(`Unsupported file type ${h.mode} for ${fe.fromPortablePath(c)}`));await I}s.finalize()});let a=(0,kSe.createGzip)();return s.pipe(a),a}async function QSe(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function NN(t){let e=t.project,r=e.configuration,s={accept:[],reject:[]};for(let C of UEt)s.reject.push(C);for(let C of MEt)s.accept.push(C);s.reject.push(r.get(\"rcFilename\"));let a=C=>{if(C===null||!C.startsWith(`${t.cwd}/`))return;let S=J.relative(t.cwd,C),P=J.resolve(vt.root,S);s.reject.push(P)};a(J.resolve(e.cwd,Er.lockfile)),a(r.get(\"cacheFolder\")),a(r.get(\"globalFolder\")),a(r.get(\"installStatePath\")),a(r.get(\"virtualFolder\")),a(r.get(\"yarnPath\")),await r.triggerHook(C=>C.populateYarnPaths,e,C=>{a(C)});for(let C of e.workspaces){let S=J.relative(t.cwd,C.cwd);S!==\"\"&&!S.match(/^(\\.\\.)?\\//)&&s.reject.push(`/${S}`)}let n={accept:[],reject:[]},c=t.manifest.publishConfig?.main??t.manifest.main,f=t.manifest.publishConfig?.module??t.manifest.module,p=t.manifest.publishConfig?.browser??t.manifest.browser,h=t.manifest.publishConfig?.bin??t.manifest.bin;c!=null&&n.accept.push(J.resolve(vt.root,c)),f!=null&&n.accept.push(J.resolve(vt.root,f)),typeof p==\"string\"&&n.accept.push(J.resolve(vt.root,p));for(let C of h.values())n.accept.push(J.resolve(vt.root,C));if(p instanceof Map)for(let[C,S]of p.entries())n.accept.push(J.resolve(vt.root,C)),typeof S==\"string\"&&n.accept.push(J.resolve(vt.root,S));let E=t.manifest.files!==null;if(E){n.reject.push(\"/*\");for(let C of t.manifest.files)TSe(n.accept,C,{cwd:vt.root})}return await _Et(t.cwd,{hasExplicitFileList:E,globalList:s,ignoreList:n})}async function _Et(t,{hasExplicitFileList:e,globalList:r,ignoreList:s}){let a=[],n=new Hf(t),c=[[vt.root,[s]]];for(;c.length>0;){let[f,p]=c.pop(),h=await n.lstatPromise(f);if(!bSe(f,{globalList:r,ignoreLists:h.isDirectory()?null:p}))if(h.isDirectory()){let E=await n.readdirPromise(f),C=!1,S=!1;if(!e||f!==vt.root)for(let R of E)C=C||R===\".gitignore\",S=S||R===\".npmignore\";let P=S?await DSe(n,f,\".npmignore\"):C?await DSe(n,f,\".gitignore\"):null,I=P!==null?[P].concat(p):p;bSe(f,{globalList:r,ignoreLists:p})&&(I=[...p,{accept:[],reject:[\"**/*\"]}]);for(let R of E)c.push([J.resolve(f,R),I])}else(h.isFile()||h.isSymbolicLink())&&a.push(J.relative(vt.root,f))}return a.sort()}async function DSe(t,e,r){let s={accept:[],reject:[]},a=await t.readFilePromise(J.join(e,r),\"utf8\");for(let n of a.split(/\\n/g))TSe(s.reject,n,{cwd:e});return s}function HEt(t,{cwd:e}){let r=t[0]===\"!\";return r&&(t=t.slice(1)),t.match(/\\.{0,1}\\//)&&(t=J.resolve(e,t)),r&&(t=`!${t}`),t}function TSe(t,e,{cwd:r}){let s=e.trim();s===\"\"||s[0]===\"#\"||t.push(HEt(s,{cwd:r}))}function bSe(t,{globalList:e,ignoreLists:r}){let s=FN(t,e.accept);if(s!==0)return s===2;let a=FN(t,e.reject);if(a!==0)return a===1;if(r!==null)for(let n of r){let c=FN(t,n.accept);if(c!==0)return c===2;let f=FN(t,n.reject);if(f!==0)return f===1}return!1}function FN(t,e){let r=e,s=[];for(let a=0;a<e.length;++a)e[a][0]!==\"!\"?r!==e&&r.push(e[a]):(r===e&&(r=e.slice(0,a)),s.push(e[a].slice(1)));return PSe(t,s)?2:PSe(t,r)?1:0}function PSe(t,e){let r=e,s=[];for(let a=0;a<e.length;++a)e[a].includes(\"/\")?r!==e&&r.push(e[a]):(r===e&&(r=e.slice(0,a)),s.push(e[a]));return!!(BV.default.isMatch(t,r,{dot:!0,nocase:!0})||BV.default.isMatch(t,s,{dot:!0,basename:!0,nocase:!0}))}var jw=class extends ft{constructor(){super(...arguments);this.installIfNeeded=ge.Boolean(\"--install-if-needed\",!1,{description:\"Run a preliminary `yarn install` if the package contains build scripts\"});this.dryRun=ge.Boolean(\"-n,--dry-run\",!1,{description:\"Print the file paths without actually generating the package archive\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.out=ge.String(\"-o,--out\",{description:\"Create the archive at the specified path\"});this.filename=ge.String(\"--filename\",{hidden:!0})}static{this.paths=[[\"pack\"]]}static{this.usage=ot.Usage({description:\"generate a tarball from the active workspace\",details:\"\\n      This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\\n\\n      If the `-o,--out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\\n    \",examples:[[\"Create an archive from the active workspace\",\"yarn pack\"],[\"List the files that would be made part of the workspace's archive\",\"yarn pack --dry-run\"],[\"Name and output the archive in a dedicated folder\",\"yarn pack --out /artifacts/%s-%v.tgz\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);await vV(a)&&(this.installIfNeeded?await s.install({cache:await Kr.find(r),report:new ki}):await s.restoreInstallState());let n=this.out??this.filename,c=typeof n<\"u\"?J.resolve(this.context.cwd,jEt(n,{workspace:a})):J.resolve(a.cwd,\"package.tgz\");return(await Ot.start({configuration:r,stdout:this.context.stdout,json:this.json},async p=>{await SV(a,{report:p},async()=>{p.reportJson({base:fe.fromPortablePath(a.cwd)});let h=await NN(a);for(let E of h)p.reportInfo(null,fe.fromPortablePath(E)),p.reportJson({location:fe.fromPortablePath(E)});if(!this.dryRun){let E=await DV(a,h);await ce.mkdirPromise(J.dirname(c),{recursive:!0});let C=ce.createWriteStream(c);E.pipe(C),await new Promise(S=>{C.on(\"finish\",S)})}}),this.dryRun||(p.reportInfo(0,`Package archive generated in ${he.pretty(r,c,he.Type.PATH)}`),p.reportJson({output:fe.fromPortablePath(c)}))})).exitCode()}};function jEt(t,{workspace:e}){let r=t.replace(\"%s\",GEt(e)).replace(\"%v\",qEt(e));return fe.toPortablePath(r)}function GEt(t){return t.manifest.name!==null?G.slugifyIdent(t.manifest.name):\"package\"}function qEt(t){return t.manifest.version!==null?t.manifest.version:\"unknown\"}var WEt=[\"dependencies\",\"devDependencies\",\"peerDependencies\"],YEt=\"workspace:\",VEt=(t,e)=>{e.publishConfig&&(e.publishConfig.type&&(e.type=e.publishConfig.type),e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.imports&&(e.imports=e.publishConfig.imports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let s of WEt)for(let a of t.manifest.getForScope(s).values()){let n=r.tryWorkspaceByDescriptor(a),c=G.parseRange(a.range);if(c.protocol===YEt)if(n===null){if(r.tryWorkspaceByIdent(a)===null)throw new jt(21,`${G.prettyDescriptor(r.configuration,a)}: No local workspace found for this range`)}else{let f;G.areDescriptorsEqual(a,n.anchoredDescriptor)||c.selector===\"*\"?f=n.manifest.version??\"0.0.0\":c.selector===\"~\"||c.selector===\"^\"?f=`${c.selector}${n.manifest.version??\"0.0.0\"}`:f=c.selector;let p=s===\"dependencies\"?G.makeDescriptor(a,\"unknown\"):null,h=p!==null&&t.manifest.ensureDependencyMeta(p).optional?\"optionalDependencies\":s;e[h][G.stringifyIdent(a)]=f}}},JEt={hooks:{beforeWorkspacePacking:VEt},commands:[jw]},KEt=JEt;var Gxe=ut(HSe());Ge();var Hxe=ut(_xe()),{env:Bt}=process,XDt=\"application/vnd.in-toto+json\",ZDt=\"https://in-toto.io/Statement/v0.1\",$Dt=\"https://in-toto.io/Statement/v1\",ebt=\"https://slsa.dev/provenance/v0.2\",tbt=\"https://slsa.dev/provenance/v1\",rbt=\"https://github.com/actions/runner\",nbt=\"https://slsa-framework.github.io/github-actions-buildtypes/workflow/v1\",ibt=\"https://github.com/npm/cli/gitlab\",sbt=\"v0alpha1\",jxe=async(t,e)=>{let r;if(Bt.GITHUB_ACTIONS){if(!Bt.ACTIONS_ID_TOKEN_REQUEST_URL)throw new jt(91,'Provenance generation in GitHub Actions requires \"write\" access to the \"id-token\" permission');let s=(Bt.GITHUB_WORKFLOW_REF||\"\").replace(`${Bt.GITHUB_REPOSITORY}/`,\"\"),a=s.indexOf(\"@\"),n=s.slice(0,a),c=s.slice(a+1);r={_type:$Dt,subject:t,predicateType:tbt,predicate:{buildDefinition:{buildType:nbt,externalParameters:{workflow:{ref:c,repository:`${Bt.GITHUB_SERVER_URL}/${Bt.GITHUB_REPOSITORY}`,path:n}},internalParameters:{github:{event_name:Bt.GITHUB_EVENT_NAME,repository_id:Bt.GITHUB_REPOSITORY_ID,repository_owner_id:Bt.GITHUB_REPOSITORY_OWNER_ID}},resolvedDependencies:[{uri:`git+${Bt.GITHUB_SERVER_URL}/${Bt.GITHUB_REPOSITORY}@${Bt.GITHUB_REF}`,digest:{gitCommit:Bt.GITHUB_SHA}}]},runDetails:{builder:{id:`${rbt}/${Bt.RUNNER_ENVIRONMENT}`},metadata:{invocationId:`${Bt.GITHUB_SERVER_URL}/${Bt.GITHUB_REPOSITORY}/actions/runs/${Bt.GITHUB_RUN_ID}/attempts/${Bt.GITHUB_RUN_ATTEMPT}`}}}}}else if(Bt.GITLAB_CI){if(!Bt.SIGSTORE_ID_TOKEN)throw new jt(91,`Provenance generation in GitLab CI requires \"SIGSTORE_ID_TOKEN\" with \"sigstore\" audience to be present in \"id_tokens\". For more info see:\nhttps://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html`);r={_type:ZDt,subject:t,predicateType:ebt,predicate:{buildType:`${ibt}/${sbt}`,builder:{id:`${Bt.CI_PROJECT_URL}/-/runners/${Bt.CI_RUNNER_ID}`},invocation:{configSource:{uri:`git+${Bt.CI_PROJECT_URL}`,digest:{sha1:Bt.CI_COMMIT_SHA},entryPoint:Bt.CI_JOB_NAME},parameters:{CI:Bt.CI,CI_API_GRAPHQL_URL:Bt.CI_API_GRAPHQL_URL,CI_API_V4_URL:Bt.CI_API_V4_URL,CI_BUILD_BEFORE_SHA:Bt.CI_BUILD_BEFORE_SHA,CI_BUILD_ID:Bt.CI_BUILD_ID,CI_BUILD_NAME:Bt.CI_BUILD_NAME,CI_BUILD_REF:Bt.CI_BUILD_REF,CI_BUILD_REF_NAME:Bt.CI_BUILD_REF_NAME,CI_BUILD_REF_SLUG:Bt.CI_BUILD_REF_SLUG,CI_BUILD_STAGE:Bt.CI_BUILD_STAGE,CI_COMMIT_BEFORE_SHA:Bt.CI_COMMIT_BEFORE_SHA,CI_COMMIT_BRANCH:Bt.CI_COMMIT_BRANCH,CI_COMMIT_REF_NAME:Bt.CI_COMMIT_REF_NAME,CI_COMMIT_REF_PROTECTED:Bt.CI_COMMIT_REF_PROTECTED,CI_COMMIT_REF_SLUG:Bt.CI_COMMIT_REF_SLUG,CI_COMMIT_SHA:Bt.CI_COMMIT_SHA,CI_COMMIT_SHORT_SHA:Bt.CI_COMMIT_SHORT_SHA,CI_COMMIT_TIMESTAMP:Bt.CI_COMMIT_TIMESTAMP,CI_COMMIT_TITLE:Bt.CI_COMMIT_TITLE,CI_CONFIG_PATH:Bt.CI_CONFIG_PATH,CI_DEFAULT_BRANCH:Bt.CI_DEFAULT_BRANCH,CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX:Bt.CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX,CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX:Bt.CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX,CI_DEPENDENCY_PROXY_SERVER:Bt.CI_DEPENDENCY_PROXY_SERVER,CI_DEPENDENCY_PROXY_USER:Bt.CI_DEPENDENCY_PROXY_USER,CI_JOB_ID:Bt.CI_JOB_ID,CI_JOB_NAME:Bt.CI_JOB_NAME,CI_JOB_NAME_SLUG:Bt.CI_JOB_NAME_SLUG,CI_JOB_STAGE:Bt.CI_JOB_STAGE,CI_JOB_STARTED_AT:Bt.CI_JOB_STARTED_AT,CI_JOB_URL:Bt.CI_JOB_URL,CI_NODE_TOTAL:Bt.CI_NODE_TOTAL,CI_PAGES_DOMAIN:Bt.CI_PAGES_DOMAIN,CI_PAGES_URL:Bt.CI_PAGES_URL,CI_PIPELINE_CREATED_AT:Bt.CI_PIPELINE_CREATED_AT,CI_PIPELINE_ID:Bt.CI_PIPELINE_ID,CI_PIPELINE_IID:Bt.CI_PIPELINE_IID,CI_PIPELINE_SOURCE:Bt.CI_PIPELINE_SOURCE,CI_PIPELINE_URL:Bt.CI_PIPELINE_URL,CI_PROJECT_CLASSIFICATION_LABEL:Bt.CI_PROJECT_CLASSIFICATION_LABEL,CI_PROJECT_DESCRIPTION:Bt.CI_PROJECT_DESCRIPTION,CI_PROJECT_ID:Bt.CI_PROJECT_ID,CI_PROJECT_NAME:Bt.CI_PROJECT_NAME,CI_PROJECT_NAMESPACE:Bt.CI_PROJECT_NAMESPACE,CI_PROJECT_NAMESPACE_ID:Bt.CI_PROJECT_NAMESPACE_ID,CI_PROJECT_PATH:Bt.CI_PROJECT_PATH,CI_PROJECT_PATH_SLUG:Bt.CI_PROJECT_PATH_SLUG,CI_PROJECT_REPOSITORY_LANGUAGES:Bt.CI_PROJECT_REPOSITORY_LANGUAGES,CI_PROJECT_ROOT_NAMESPACE:Bt.CI_PROJECT_ROOT_NAMESPACE,CI_PROJECT_TITLE:Bt.CI_PROJECT_TITLE,CI_PROJECT_URL:Bt.CI_PROJECT_URL,CI_PROJECT_VISIBILITY:Bt.CI_PROJECT_VISIBILITY,CI_REGISTRY:Bt.CI_REGISTRY,CI_REGISTRY_IMAGE:Bt.CI_REGISTRY_IMAGE,CI_REGISTRY_USER:Bt.CI_REGISTRY_USER,CI_RUNNER_DESCRIPTION:Bt.CI_RUNNER_DESCRIPTION,CI_RUNNER_ID:Bt.CI_RUNNER_ID,CI_RUNNER_TAGS:Bt.CI_RUNNER_TAGS,CI_SERVER_HOST:Bt.CI_SERVER_HOST,CI_SERVER_NAME:Bt.CI_SERVER_NAME,CI_SERVER_PORT:Bt.CI_SERVER_PORT,CI_SERVER_PROTOCOL:Bt.CI_SERVER_PROTOCOL,CI_SERVER_REVISION:Bt.CI_SERVER_REVISION,CI_SERVER_SHELL_SSH_HOST:Bt.CI_SERVER_SHELL_SSH_HOST,CI_SERVER_SHELL_SSH_PORT:Bt.CI_SERVER_SHELL_SSH_PORT,CI_SERVER_URL:Bt.CI_SERVER_URL,CI_SERVER_VERSION:Bt.CI_SERVER_VERSION,CI_SERVER_VERSION_MAJOR:Bt.CI_SERVER_VERSION_MAJOR,CI_SERVER_VERSION_MINOR:Bt.CI_SERVER_VERSION_MINOR,CI_SERVER_VERSION_PATCH:Bt.CI_SERVER_VERSION_PATCH,CI_TEMPLATE_REGISTRY_HOST:Bt.CI_TEMPLATE_REGISTRY_HOST,GITLAB_CI:Bt.GITLAB_CI,GITLAB_FEATURES:Bt.GITLAB_FEATURES,GITLAB_USER_ID:Bt.GITLAB_USER_ID,GITLAB_USER_LOGIN:Bt.GITLAB_USER_LOGIN,RUNNER_GENERATE_ARTIFACTS_METADATA:Bt.RUNNER_GENERATE_ARTIFACTS_METADATA},environment:{name:Bt.CI_RUNNER_DESCRIPTION,architecture:Bt.CI_RUNNER_EXECUTABLE_ARCH,server:Bt.CI_SERVER_URL,project:Bt.CI_PROJECT_PATH,job:{id:Bt.CI_JOB_ID},pipeline:{id:Bt.CI_PIPELINE_ID,ref:Bt.CI_CONFIG_PATH}}},metadata:{buildInvocationId:`${Bt.CI_JOB_URL}`,completeness:{parameters:!0,environment:!0,materials:!1},reproducible:!1},materials:[{uri:`git+${Bt.CI_PROJECT_URL}`,digest:{sha1:Bt.CI_COMMIT_SHA}}]}}}else throw new jt(91,\"Provenance generation is only supported in GitHub Actions and GitLab CI\");return Hxe.attest(Buffer.from(JSON.stringify(r)),XDt,e)};async function obt(t,e,{access:r,tag:s,registry:a,gitHead:n,provenance:c}){let f=t.manifest.name,p=t.manifest.version,h=G.stringifyIdent(f),E=Gxe.default.fromData(e,{algorithms:[\"sha1\",\"sha512\"]}),C=r??qxe(t,f),S=await Wxe(t),P=await yA.genPackageManifest(t),I=`${h}-${p}.tgz`,R=new URL(`${Jc(a)}/${h}/-/${I}`),N={[I]:{content_type:\"application/octet-stream\",data:e.toString(\"base64\"),length:e.length}};if(c){let U={name:`pkg:npm/${h.replace(/^@/,\"%40\")}@${p}`,digest:{sha512:E.sha512[0].hexDigest()}},W=await jxe([U]),ee=JSON.stringify(W);N[`${h}-${p}.sigstore`]={content_type:W.mediaType,data:ee,length:ee.length}}return{_id:h,_attachments:N,name:h,access:C,\"dist-tags\":{[s]:p},versions:{[p]:{...P,_id:`${h}@${p}`,name:h,version:p,gitHead:n,dist:{shasum:E.sha1[0].hexDigest(),integrity:E.sha512[0].toString(),tarball:R.toString()}}},readme:S}}async function abt(t){try{let{stdout:e}=await qr.execvp(\"git\",[\"rev-parse\",\"--revs-only\",\"HEAD\"],{cwd:t});return e.trim()===\"\"?void 0:e.trim()}catch{return}}function qxe(t,e){let r=t.project.configuration;return t.manifest.publishConfig&&typeof t.manifest.publishConfig.access==\"string\"?t.manifest.publishConfig.access:r.get(\"npmPublishAccess\")!==null?r.get(\"npmPublishAccess\"):e.scope?\"restricted\":\"public\"}async function Wxe(t){let e=fe.toPortablePath(`${t.cwd}/README.md`),r=t.manifest.name,a=`# ${G.stringifyIdent(r)}\n`;try{a=await ce.readFilePromise(e,\"utf8\")}catch(n){if(n.code===\"ENOENT\")return a;throw n}return a}var RK={npmAlwaysAuth:{description:\"URL of the selected npm registry (note: npm enterprise isn't supported)\",type:\"BOOLEAN\",default:!1},npmAuthIdent:{description:\"Authentication identity for the npm registry (_auth in npm and yarn v1)\",type:\"SECRET\",default:null},npmAuthToken:{description:\"Authentication token for the npm registry (_authToken in npm and yarn v1)\",type:\"SECRET\",default:null}},Yxe={npmAuditRegistry:{description:\"Registry to query for audit reports\",type:\"STRING\",default:null},npmPublishRegistry:{description:\"Registry to push packages to\",type:\"STRING\",default:null},npmRegistryServer:{description:\"URL of the selected npm registry (note: npm enterprise isn't supported)\",type:\"STRING\",default:\"https://registry.yarnpkg.com\"}},lbt={npmMinimalAgeGate:{description:\"Minimum age of a package version according to the publish date on the npm registry to be considered for installation\",type:\"DURATION\",unit:\"m\",default:\"0m\"},npmPreapprovedPackages:{description:\"Array of package descriptors or package name glob patterns to exclude from the minimum release age check\",type:\"STRING\",isArray:!0,default:[]}},cbt={configuration:{...RK,...Yxe,...lbt,npmScopes:{description:\"Settings per package scope\",type:\"MAP\",valueDefinition:{description:\"\",type:\"SHAPE\",properties:{...RK,...Yxe}}},npmRegistries:{description:\"Settings per registry\",type:\"MAP\",normalizeKeys:Jc,valueDefinition:{description:\"\",type:\"SHAPE\",properties:{...RK}}}},fetchers:[VD,oh],resolvers:[JD,KD,zD]},ubt=cbt;var qK={};Vt(qK,{NpmAuditCommand:()=>D1,NpmInfoCommand:()=>b1,NpmLoginCommand:()=>P1,NpmLogoutCommand:()=>k1,NpmPublishCommand:()=>Q1,NpmTagAddCommand:()=>R1,NpmTagListCommand:()=>T1,NpmTagRemoveCommand:()=>F1,NpmWhoamiCommand:()=>N1,default:()=>wbt,npmAuditTypes:()=>zb,npmAuditUtils:()=>kL});Ge();Ge();Yt();var UK=ut(Go());Ul();var zb={};Vt(zb,{Environment:()=>Jb,Severity:()=>Kb});var Jb=(s=>(s.All=\"all\",s.Production=\"production\",s.Development=\"development\",s))(Jb||{}),Kb=(n=>(n.Info=\"info\",n.Low=\"low\",n.Moderate=\"moderate\",n.High=\"high\",n.Critical=\"critical\",n))(Kb||{});var kL={};Vt(kL,{allSeverities:()=>S1,getPackages:()=>MK,getReportTree:()=>OK,getSeverityInclusions:()=>NK,getTopLevelDependencies:()=>LK});Ge();var Vxe=ut(Ai());var S1=[\"info\",\"low\",\"moderate\",\"high\",\"critical\"];function NK(t){if(typeof t>\"u\")return new Set(S1);let e=S1.indexOf(t),r=S1.slice(e);return new Set(r)}function OK(t){let e={},r={children:e};for(let[s,a]of je.sortMap(Object.entries(t),n=>n[0]))for(let n of je.sortMap(a,c=>`${c.id}`))e[`${s}/${n.id}`]={value:he.tuple(he.Type.IDENT,G.parseIdent(s)),children:{ID:typeof n.id<\"u\"&&{label:\"ID\",value:he.tuple(he.Type.ID,n.id)},Issue:{label:\"Issue\",value:he.tuple(he.Type.NO_HINT,n.title)},URL:typeof n.url<\"u\"&&{label:\"URL\",value:he.tuple(he.Type.URL,n.url)},Severity:{label:\"Severity\",value:he.tuple(he.Type.NO_HINT,n.severity)},\"Vulnerable Versions\":{label:\"Vulnerable Versions\",value:he.tuple(he.Type.RANGE,n.vulnerable_versions)},\"Tree Versions\":{label:\"Tree Versions\",children:[...n.versions].sort(Vxe.default.compare).map(c=>({value:he.tuple(he.Type.REFERENCE,c)}))},Dependents:{label:\"Dependents\",children:je.sortMap(n.dependents,c=>G.stringifyLocator(c)).map(c=>({value:he.tuple(he.Type.LOCATOR,c)}))}}};return r}function LK(t,e,{all:r,environment:s}){let a=[],n=r?t.workspaces:[e],c=[\"all\",\"production\"].includes(s),f=[\"all\",\"development\"].includes(s);for(let p of n)for(let h of p.anchoredPackage.dependencies.values())(p.manifest.devDependencies.has(h.identHash)?!f:!c)||a.push({workspace:p,dependency:h});return a}function MK(t,e,{recursive:r}){let s=new Map,a=new Set,n=[],c=(f,p)=>{let h=t.storedResolutions.get(p.descriptorHash);if(typeof h>\"u\")throw new Error(\"Assertion failed: The resolution should have been registered\");if(!a.has(h))a.add(h);else return;let E=t.storedPackages.get(h);if(typeof E>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");if(G.ensureDevirtualizedLocator(E).reference.startsWith(\"npm:\")&&E.version!==null){let S=G.stringifyIdent(E),P=je.getMapWithDefault(s,S);je.getArrayWithDefault(P,E.version).push(f)}if(r)for(let S of E.dependencies.values())n.push([E,S])};for(let{workspace:f,dependency:p}of e)n.push([f.anchoredLocator,p]);for(;n.length>0;){let[f,p]=n.shift();c(f,p)}return s}var D1=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Audit dependencies from all workspaces\"});this.recursive=ge.Boolean(\"-R,--recursive\",!1,{description:\"Audit transitive dependencies as well\"});this.environment=ge.String(\"--environment\",\"all\",{description:\"Which environments to cover\",validator:fo(Jb)});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.noDeprecations=ge.Boolean(\"--no-deprecations\",!1,{description:\"Don't warn about deprecated packages\"});this.severity=ge.String(\"--severity\",\"info\",{description:\"Minimal severity requested for packages to be displayed\",validator:fo(Kb)});this.excludes=ge.Array(\"--exclude\",[],{description:\"Array of glob patterns of packages to exclude from audit\"});this.ignores=ge.Array(\"--ignore\",[],{description:\"Array of glob patterns of advisory ID's to ignore in the audit report\"})}static{this.paths=[[\"npm\",\"audit\"]]}static{this.usage=ot.Usage({description:\"perform a vulnerability audit against the installed packages\",details:`\n      This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths).\n\n      For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \\`-A,--all\\`. To extend this search to both direct and transitive dependencies, use \\`-R,--recursive\\`.\n\n      Applying the \\`--severity\\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${S1.map(r=>`\\`${r}\\``).join(\", \")}.\n\n      If the \\`--json\\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages.\n\n      If certain packages produce false positives for a particular environment, the \\`--exclude\\` flag can be used to exclude any number of packages from the audit. This can also be set in the configuration file with the \\`npmAuditExcludePackages\\` option.\n\n      If particular advisories are needed to be ignored, the \\`--ignore\\` flag can be used with Advisory ID's to ignore any number of advisories in the audit report. This can also be set in the configuration file with the \\`npmAuditIgnoreAdvisories\\` option.\n\n      To understand the dependency tree requiring vulnerable packages, check the raw report with the \\`--json\\` flag or use \\`yarn why package\\` to get more information as to who depends on them.\n    `,examples:[[\"Checks for known security issues with the installed packages. The output is a list of known issues.\",\"yarn npm audit\"],[\"Audit dependencies in all workspaces\",\"yarn npm audit --all\"],[\"Limit auditing to `dependencies` (excludes `devDependencies`)\",\"yarn npm audit --environment production\"],[\"Show audit report as valid JSON\",\"yarn npm audit --json\"],[\"Audit all direct and transitive dependencies\",\"yarn npm audit --recursive\"],[\"Output moderate (or more severe) vulnerabilities\",\"yarn npm audit --severity moderate\"],[\"Exclude certain packages\",\"yarn npm audit --exclude package1 --exclude package2\"],[\"Ignore specific advisories\",\"yarn npm audit --ignore 1234567 --ignore 7654321\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let n=LK(s,a,{all:this.all,environment:this.environment}),c=MK(s,n,{recursive:this.recursive}),f=Array.from(new Set([...r.get(\"npmAuditExcludePackages\"),...this.excludes])),p=Object.create(null);for(let[N,U]of c)f.some(W=>UK.default.isMatch(N,W))||(p[N]=[...U.keys()]);let h=hi.getAuditRegistry({configuration:r}),E,C=await lA.start({configuration:r,stdout:this.context.stdout},async()=>{let N=en.post(\"/-/npm/v1/security/advisories/bulk\",p,{authType:en.AuthType.BEST_EFFORT,configuration:r,jsonResponse:!0,registry:h}),U=this.noDeprecations?[]:await Promise.all(Array.from(Object.entries(p),async([ee,ie])=>{let ue=await en.getPackageMetadata(G.parseIdent(ee),{project:s});return je.mapAndFilter(ie,le=>{let{deprecated:me}=ue.versions[le];return me?[ee,le,me]:je.mapAndFilter.skip})})),W=await N;for(let[ee,ie,ue]of U.flat(1))Object.hasOwn(W,ee)&&W[ee].some(le=>Fr.satisfiesWithPrereleases(ie,le.vulnerable_versions))||(W[ee]??=[],W[ee].push({id:`${ee} (deprecation)`,title:(typeof ue==\"string\"?ue:\"\").trim()||\"This package has been deprecated.\",severity:\"moderate\",vulnerable_versions:ie}));E=W});if(C.hasErrors())return C.exitCode();let S=NK(this.severity),P=Array.from(new Set([...r.get(\"npmAuditIgnoreAdvisories\"),...this.ignores])),I=Object.create(null);for(let[N,U]of Object.entries(E)){let W=U.filter(ee=>!UK.default.isMatch(`${ee.id}`,P)&&S.has(ee.severity));W.length>0&&(I[N]=W.map(ee=>{let ie=c.get(N);if(typeof ie>\"u\")throw new Error(\"Assertion failed: Expected the registry to only return packages that were requested\");let ue=[...ie.keys()].filter(me=>Fr.satisfiesWithPrereleases(me,ee.vulnerable_versions)),le=new Map;for(let me of ue)for(let pe of ie.get(me))le.set(pe.locatorHash,pe);return{...ee,versions:ue,dependents:[...le.values()]}}))}let R=Object.keys(I).length>0;return R?(xs.emitTree(OK(I),{configuration:r,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Ot.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async N=>{N.reportInfo(1,\"No audit suggestions\")}),R?1:0)}};Ge();Ge();Dt();Yt();var _K=ut(Ai()),HK=Ie(\"util\"),b1=class extends ft{constructor(){super(...arguments);this.fields=ge.String(\"-f,--fields\",{description:\"A comma-separated list of manifest fields that should be displayed\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.packages=ge.Rest()}static{this.paths=[[\"npm\",\"info\"]]}static{this.usage=ot.Usage({category:\"Npm-related commands\",description:\"show information about a package\",details:\"\\n      This command fetches information about a package from the npm registry and prints it in a tree format.\\n\\n      The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\\n\\n      Append `@<range>` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\\n\\n      If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\\n\\n      By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\\n    \",examples:[[\"Show all available information about react (except the `dist`, `readme`, and `users` fields)\",\"yarn npm info react\"],[\"Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)\",\"yarn npm info react --json\"],[\"Show all available information about react@16.12.0\",\"yarn npm info react@16.12.0\"],[\"Show all available information about react@next\",\"yarn npm info react@next\"],[\"Show the description of react\",\"yarn npm info react --fields description\"],[\"Show all available versions of react\",\"yarn npm info react --fields versions\"],[\"Show the readme of react\",\"yarn npm info react --fields readme\"],[\"Show a few fields of react\",\"yarn npm info react --fields homepage,repository\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd),a=typeof this.fields<\"u\"?new Set([\"name\",...this.fields.split(/\\s*,\\s*/)]):null,n=[],c=!1,f=await Ot.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async p=>{for(let h of this.packages){let E;if(h===\".\"){let ie=s.topLevelWorkspace;if(!ie.manifest.name)throw new nt(`Missing ${he.pretty(r,\"name\",he.Type.CODE)} field in ${fe.fromPortablePath(J.join(ie.cwd,Er.manifest))}`);E=G.makeDescriptor(ie.manifest.name,\"unknown\")}else E=G.parseDescriptor(h);let C=en.getIdentUrl(E),S=jK(await en.get(C,{configuration:r,ident:E,jsonResponse:!0,customErrorMessage:en.customPackageError})),P=Object.keys(S.versions).sort(_K.default.compareLoose),R=S[\"dist-tags\"].latest||P[P.length-1],N=Fr.validRange(E.range);if(N){let ie=_K.default.maxSatisfying(P,N);ie!==null?R=ie:(p.reportWarning(0,`Unmet range ${G.prettyRange(r,E.range)}; falling back to the latest version`),c=!0)}else Object.hasOwn(S[\"dist-tags\"],E.range)?R=S[\"dist-tags\"][E.range]:E.range!==\"unknown\"&&(p.reportWarning(0,`Unknown tag ${G.prettyRange(r,E.range)}; falling back to the latest version`),c=!0);let U=S.versions[R],W={...S,...U,version:R,versions:P},ee;if(a!==null){ee={};for(let ie of a){let ue=W[ie];if(typeof ue<\"u\")ee[ie]=ue;else{p.reportWarning(1,`The ${he.pretty(r,ie,he.Type.CODE)} field doesn't exist inside ${G.prettyIdent(r,E)}'s information`),c=!0;continue}}}else this.json||(delete W.dist,delete W.readme,delete W.users),ee=W;p.reportJson(ee),this.json||n.push(ee)}});HK.inspect.styles.name=\"cyan\";for(let p of n)(p!==n[0]||c)&&this.context.stdout.write(`\n`),this.context.stdout.write(`${(0,HK.inspect)(p,{depth:1/0,colors:!0,compact:!1})}\n`);return f.exitCode()}};function jK(t){if(Array.isArray(t)){let e=[];for(let r of t)r=jK(r),r&&e.push(r);return e}else if(typeof t==\"object\"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith(\"_\"))continue;let s=jK(t[r]);s&&(e[r]=s)}return e}else return t||null}Ge();Ge();Yt();var GK=ut(Vv()),P1=class extends ft{constructor(){super(...arguments);this.scope=ge.String(\"-s,--scope\",{description:\"Login to the registry configured for a given scope\"});this.publish=ge.Boolean(\"--publish\",!1,{description:\"Login to the publish registry\"});this.alwaysAuth=ge.Boolean(\"--always-auth\",{description:\"Set the npmAlwaysAuth configuration\"});this.webLogin=ge.Boolean(\"--web-login\",{description:\"Enable web login\"})}static{this.paths=[[\"npm\",\"login\"]]}static{this.usage=ot.Usage({category:\"Npm-related commands\",description:\"store new login info to access the npm registry\",details:\"\\n      This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\\n\\n      Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\\n\\n      Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\\n    \",examples:[[\"Login to the default registry\",\"yarn npm login\"],[\"Login to the registry linked to the @my-scope registry\",\"yarn npm login --scope my-scope\"],[\"Login to the publish registry for the current package\",\"yarn npm login --publish\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=await QL({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Ot.start({configuration:r,stdout:this.context.stdout,includeFooter:!1},async n=>{let c=await gbt({registry:s,configuration:r,report:n,webLogin:this.webLogin,stdin:this.context.stdin,stdout:this.context.stdout});return await mbt(s,c,{alwaysAuth:this.alwaysAuth,scope:this.scope}),n.reportInfo(0,\"Successfully logged in\")})).exitCode()}};async function QL({scope:t,publish:e,configuration:r,cwd:s}){return t&&e?hi.getScopeRegistry(t,{configuration:r,type:hi.RegistryType.PUBLISH_REGISTRY}):t?hi.getScopeRegistry(t,{configuration:r}):e?hi.getPublishRegistry((await eC(r,s)).manifest,{configuration:r}):hi.getDefaultRegistry({configuration:r})}async function fbt(t,e){let r;try{r=await en.post(\"/-/v1/login\",null,{configuration:e,registry:t,authType:en.AuthType.NO_AUTH,jsonResponse:!0,headers:{\"npm-auth-type\":\"web\"}})}catch{return null}return r}async function Abt(t,e){let r=await nn.request(t,null,{configuration:e,jsonResponse:!0});if(r.statusCode===202){let s=r.headers[\"retry-after\"]??\"1\";return{type:\"waiting\",sleep:parseInt(s,10)}}return r.statusCode===200?{type:\"success\",token:r.body.token}:null}async function pbt({registry:t,configuration:e,report:r}){let s=await fbt(t,e);if(!s)return null;if(Ui.openUrl){r.reportInfo(0,\"Starting the web login process...\"),r.reportSeparator();let{openNow:a}=await(0,GK.prompt)({type:\"confirm\",name:\"openNow\",message:\"Do you want to try to open your browser now?\",required:!0,initial:!0,onCancel:()=>process.exit(130)});r.reportSeparator(),(!a||!await Ui.openUrl(s.loginUrl))&&(r.reportWarning(0,\"We failed to automatically open the url; you'll have to open it yourself in your browser of choice:\"),r.reportWarning(0,he.pretty(e,s.loginUrl,he.Type.URL)),r.reportSeparator())}for(;;){let a=await Abt(s.doneUrl,e);if(a===null)return null;if(a.type===\"waiting\")await new Promise(n=>setTimeout(n,a.sleep*1e3));else return a.token}}var hbt=[\"https://registry.yarnpkg.com\",\"https://registry.npmjs.org\"];async function gbt(t){if(t.webLogin??hbt.includes(t.registry)){let e=await pbt(t);if(e!==null)return e}return await dbt(t)}async function dbt({registry:t,configuration:e,report:r,stdin:s,stdout:a}){let n=await ybt({configuration:e,registry:t,report:r,stdin:s,stdout:a}),c=`/-/user/org.couchdb.user:${encodeURIComponent(n.name)}`,f={_id:`org.couchdb.user:${n.name}`,name:n.name,password:n.password,type:\"user\",roles:[],date:new Date().toISOString()},p={attemptedAs:n.name,configuration:e,registry:t,jsonResponse:!0,authType:en.AuthType.NO_AUTH};try{return(await en.put(c,f,p)).token}catch(P){if(!(P.originalError?.name===\"HTTPError\"&&P.originalError?.response.statusCode===409))throw P}let h={...p,authType:en.AuthType.NO_AUTH,headers:{authorization:`Basic ${Buffer.from(`${n.name}:${n.password}`).toString(\"base64\")}`}},E=await en.get(c,h);for(let[P,I]of Object.entries(E))(!f[P]||P===\"roles\")&&(f[P]=I);let C=`${c}/-rev/${f._rev}`;return(await en.put(C,f,h)).token}async function mbt(t,e,{alwaysAuth:r,scope:s}){let a=c=>f=>{let p=je.isIndexableObject(f)?f:{},h=p[c],E=je.isIndexableObject(h)?h:{};return{...p,[c]:{...E,...r!==void 0?{npmAlwaysAuth:r}:{},npmAuthToken:e}}},n=s?{npmScopes:a(s)}:{npmRegistries:a(t)};return await ze.updateHomeConfiguration(n)}async function ybt({configuration:t,registry:e,report:r,stdin:s,stdout:a}){r.reportInfo(0,`Logging in to ${he.pretty(t,e,he.Type.URL)}`);let n=!1;if(e.match(/^https:\\/\\/npm\\.pkg\\.github\\.com(\\/|$)/)&&(r.reportInfo(0,\"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions.\"),n=!0),r.reportSeparator(),t.env.YARN_IS_TEST_ENV)return{name:t.env.YARN_INJECT_NPM_USER||\"\",password:t.env.YARN_INJECT_NPM_PASSWORD||\"\"};let c=await(0,GK.prompt)([{type:\"input\",name:\"name\",message:\"Username:\",required:!0,onCancel:()=>process.exit(130),stdin:s,stdout:a},{type:\"password\",name:\"password\",message:n?\"Token:\":\"Password:\",required:!0,onCancel:()=>process.exit(130),stdin:s,stdout:a}]);return r.reportSeparator(),c}Ge();Ge();Yt();var x1=new Set([\"npmAuthIdent\",\"npmAuthToken\"]),k1=class extends ft{constructor(){super(...arguments);this.scope=ge.String(\"-s,--scope\",{description:\"Logout of the registry configured for a given scope\"});this.publish=ge.Boolean(\"--publish\",!1,{description:\"Logout of the publish registry\"});this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Logout of all registries\"})}static{this.paths=[[\"npm\",\"logout\"]]}static{this.usage=ot.Usage({category:\"Npm-related commands\",description:\"logout of the npm registry\",details:\"\\n      This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\\n\\n      Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\\n\\n      Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\\n\\n      Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\\n    \",examples:[[\"Logout of the default registry\",\"yarn npm logout\"],[\"Logout of the @my-scope scope\",\"yarn npm logout --scope my-scope\"],[\"Logout of the publish registry for the current package\",\"yarn npm logout --publish\"],[\"Logout of all registries\",\"yarn npm logout --all\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=async()=>{let n=await QL({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),c=await ze.find(this.context.cwd,this.context.plugins),f=G.makeIdent(this.scope??null,\"pkg\");return!hi.getAuthConfiguration(n,{configuration:c,ident:f}).get(\"npmAuthToken\")};return(await Ot.start({configuration:r,stdout:this.context.stdout},async n=>{if(this.all&&(await Ibt(),n.reportInfo(0,\"Successfully logged out from everything\")),this.scope){await Jxe(\"npmScopes\",this.scope),await s()?n.reportInfo(0,`Successfully logged out from ${this.scope}`):n.reportWarning(0,\"Scope authentication settings removed, but some other ones settings still apply to it\");return}let c=await QL({configuration:r,cwd:this.context.cwd,publish:this.publish});await Jxe(\"npmRegistries\",c),await s()?n.reportInfo(0,`Successfully logged out from ${c}`):n.reportWarning(0,\"Registry authentication settings removed, but some other ones settings still apply to it\")})).exitCode()}};function Ebt(t,e){let r=t[e];if(!je.isIndexableObject(r))return!1;let s=new Set(Object.keys(r));if([...x1].every(n=>!s.has(n)))return!1;for(let n of x1)s.delete(n);if(s.size===0)return t[e]=void 0,!0;let a={...r};for(let n of x1)delete a[n];return t[e]=a,!0}async function Ibt(){let t=e=>{let r=!1,s=je.isIndexableObject(e)?{...e}:{};s.npmAuthToken&&(delete s.npmAuthToken,r=!0);for(let a of Object.keys(s))Ebt(s,a)&&(r=!0);if(Object.keys(s).length!==0)return r?s:e};return await ze.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function Jxe(t,e){return await ze.updateHomeConfiguration({[t]:r=>{let s=je.isIndexableObject(r)?r:{};if(!Object.hasOwn(s,e))return r;let a=s[e],n=je.isIndexableObject(a)?a:{},c=new Set(Object.keys(n));if([...x1].every(p=>!c.has(p)))return r;for(let p of x1)c.delete(p);if(c.size===0)return Object.keys(s).length===1?void 0:{...s,[e]:void 0};let f={};for(let p of x1)f[p]=void 0;return{...s,[e]:{...n,...f}}}})}Ge();Dt();Yt();var Q1=class extends ft{constructor(){super(...arguments);this.access=ge.String(\"--access\",{description:\"The access for the published package (public or restricted)\"});this.tag=ge.String(\"--tag\",\"latest\",{description:\"The tag on the registry that the package should be attached to\"});this.tolerateRepublish=ge.Boolean(\"--tolerate-republish\",!1,{description:\"Warn and exit when republishing an already existing version of a package\"});this.otp=ge.String(\"--otp\",{description:\"The OTP token to use with the command\"});this.provenance=ge.Boolean(\"--provenance\",!1,{description:\"Generate provenance for the package. Only available in GitHub Actions and GitLab CI. Can be set globally through the `npmPublishProvenance` setting or the `YARN_NPM_CONFIG_PROVENANCE` environment variable, or per-package through the `publishConfig.provenance` field in package.json.\"});this.dryRun=ge.Boolean(\"-n,--dry-run\",!1,{description:\"Show what would be published without actually publishing\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Output the result in JSON format\"})}static{this.paths=[[\"npm\",\"publish\"]]}static{this.usage=ot.Usage({category:\"Npm-related commands\",description:\"publish the active workspace to the npm registry\",details:'\\n      This command will pack the active workspace into a fresh archive and upload it to the npm registry.\\n\\n      The package will by default be attached to the `latest` tag on the registry, but this behavior can be overridden by using the `--tag` option.\\n\\n      Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka \"private packages\"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\\n    ',examples:[[\"Publish the active workspace\",\"yarn npm publish\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);if(a.manifest.private)throw new nt(\"Private workspaces cannot be published\");if(a.manifest.name===null||a.manifest.version===null)throw new nt(\"Workspaces must have valid names and versions to be published on an external registry\");await s.restoreInstallState();let n=a.manifest.name,c=a.manifest.version,f=hi.getPublishRegistry(a.manifest,{configuration:r});return(await Ot.start({configuration:r,stdout:this.context.stdout,json:this.json},async h=>{if(this.tolerateRepublish)try{let E=await en.get(en.getIdentUrl(n),{configuration:r,registry:f,ident:n,jsonResponse:!0});if(!Object.hasOwn(E,\"versions\"))throw new jt(15,'Registry returned invalid data for - missing \"versions\" field');if(Object.hasOwn(E.versions,c)){let C=`Registry already knows about version ${c}; skipping.`;h.reportWarning(0,C),h.reportJson({name:G.stringifyIdent(n),version:c,registry:f,warning:C,skipped:!0});return}}catch(E){if(E.originalError?.response?.statusCode!==404)throw E}await In.maybeExecuteWorkspaceLifecycleScript(a,\"prepublish\",{report:h}),await yA.prepareForPack(a,{report:h},async()=>{let E=await yA.genPackList(a);for(let W of E)h.reportInfo(null,fe.fromPortablePath(W)),h.reportJson({file:fe.fromPortablePath(W)});let C=await yA.genPackStream(a,E),S=await je.bufferStream(C),P=await v1.getGitHead(a.cwd),I=!1,R=\"\";a.manifest.publishConfig&&\"provenance\"in a.manifest.publishConfig?(I=!!a.manifest.publishConfig.provenance,R=I?\"Generating provenance statement because `publishConfig.provenance` field is set.\":\"Skipping provenance statement because `publishConfig.provenance` field is set to false.\"):this.provenance?(I=!0,R=\"Generating provenance statement because `--provenance` flag is set.\"):r.get(\"npmPublishProvenance\")&&(I=!0,R=\"Generating provenance statement because `npmPublishProvenance` setting is set.\"),R&&(h.reportInfo(null,R),h.reportJson({type:\"provenance\",enabled:I,provenanceMessage:R}));let N=await v1.makePublishBody(a,S,{access:this.access,tag:this.tag,registry:f,gitHead:P,provenance:I});this.dryRun||await en.put(en.getIdentUrl(n),N,{configuration:r,registry:f,ident:n,otp:this.otp,jsonResponse:!0,allowOidc:!!(process.env.CI&&(process.env.GITHUB_ACTIONS||process.env.GITLAB_CI))});let U=this.dryRun?`[DRY RUN] Package would be published to ${f} with tag ${this.tag}`:\"Package archive published\";h.reportInfo(0,U),h.reportJson({name:G.stringifyIdent(n),version:c,registry:f,tag:this.tag||\"latest\",files:E.map(W=>fe.fromPortablePath(W)),access:this.access||null,dryRun:this.dryRun,published:!this.dryRun,message:U,provenance:!!I})})})).exitCode()}};Ge();Yt();var Kxe=ut(Ai());Ge();Dt();Yt();var T1=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.package=ge.String({required:!1})}static{this.paths=[[\"npm\",\"tag\",\"list\"]]}static{this.usage=ot.Usage({category:\"Npm-related commands\",description:\"list all dist-tags of a package\",details:`\n      This command will list all tags of a package from the npm registry.\n\n      If the package is not specified, Yarn will default to the current workspace.\n    `,examples:[[\"List all tags of package `my-pkg`\",\"yarn npm tag list my-pkg\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n;if(typeof this.package<\"u\")n=G.parseIdent(this.package);else{if(!a)throw new ar(s.cwd,this.context.cwd);if(!a.manifest.name)throw new nt(`Missing 'name' field in ${fe.fromPortablePath(J.join(a.cwd,Er.manifest))}`);n=a.manifest.name}let c=await Xb(n,r),p={children:je.sortMap(Object.entries(c),([h])=>h).map(([h,E])=>({value:he.tuple(he.Type.RESOLUTION,{descriptor:G.makeDescriptor(n,h),locator:G.makeLocator(n,E)})}))};return xs.emitTree(p,{configuration:r,json:this.json,stdout:this.context.stdout})}};async function Xb(t,e){let r=`/-/package${en.getIdentUrl(t)}/dist-tags`;return en.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:en.customPackageError})}var R1=class extends ft{constructor(){super(...arguments);this.package=ge.String();this.tag=ge.String()}static{this.paths=[[\"npm\",\"tag\",\"add\"]]}static{this.usage=ot.Usage({category:\"Npm-related commands\",description:\"add a tag for a specific version of a package\",details:`\n      This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten.\n    `,examples:[[\"Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`\",\"yarn npm tag add my-pkg@2.3.4-beta.4 beta\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);let n=G.parseDescriptor(this.package,!0),c=n.range;if(!Kxe.default.valid(c))throw new nt(`The range ${he.pretty(r,n.range,he.Type.RANGE)} must be a valid semver version`);let f=hi.getPublishRegistry(a.manifest,{configuration:r}),p=he.pretty(r,n,he.Type.IDENT),h=he.pretty(r,c,he.Type.RANGE),E=he.pretty(r,this.tag,he.Type.CODE);return(await Ot.start({configuration:r,stdout:this.context.stdout},async S=>{let P=await Xb(n,r);Object.hasOwn(P,this.tag)&&P[this.tag]===c&&S.reportWarning(0,`Tag ${E} is already set to version ${h}`);let I=`/-/package${en.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await en.put(I,c,{configuration:r,registry:f,ident:n,jsonRequest:!0,jsonResponse:!0}),S.reportInfo(0,`Tag ${E} added to version ${h} of package ${p}`)})).exitCode()}};Ge();Yt();var F1=class extends ft{constructor(){super(...arguments);this.package=ge.String();this.tag=ge.String()}static{this.paths=[[\"npm\",\"tag\",\"remove\"]]}static{this.usage=ot.Usage({category:\"Npm-related commands\",description:\"remove a tag from a package\",details:`\n      This command will remove a tag from a package from the npm registry.\n    `,examples:[[\"Remove the `beta` tag from package `my-pkg`\",\"yarn npm tag remove my-pkg beta\"]]})}async execute(){if(this.tag===\"latest\")throw new nt(\"The 'latest' tag cannot be removed.\");let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);let n=G.parseIdent(this.package),c=hi.getPublishRegistry(a.manifest,{configuration:r}),f=he.pretty(r,this.tag,he.Type.CODE),p=he.pretty(r,n,he.Type.IDENT),h=await Xb(n,r);if(!Object.hasOwn(h,this.tag))throw new nt(`${f} is not a tag of package ${p}`);return(await Ot.start({configuration:r,stdout:this.context.stdout},async C=>{let S=`/-/package${en.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await en.del(S,{configuration:r,registry:c,ident:n,jsonResponse:!0}),C.reportInfo(0,`Tag ${f} removed from package ${p}`)})).exitCode()}};Ge();Ge();Yt();var N1=class extends ft{constructor(){super(...arguments);this.scope=ge.String(\"-s,--scope\",{description:\"Print username for the registry configured for a given scope\"});this.publish=ge.Boolean(\"--publish\",!1,{description:\"Print username for the publish registry\"})}static{this.paths=[[\"npm\",\"whoami\"]]}static{this.usage=ot.Usage({category:\"Npm-related commands\",description:\"display the name of the authenticated user\",details:\"\\n      Print the username associated with the current authentication settings to the standard output.\\n\\n      When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\\n\\n      When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\\n    \",examples:[[\"Print username for the default registry\",\"yarn npm whoami\"],[\"Print username for the registry on a given scope\",\"yarn npm whoami --scope company\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s;return this.scope&&this.publish?s=hi.getScopeRegistry(this.scope,{configuration:r,type:hi.RegistryType.PUBLISH_REGISTRY}):this.scope?s=hi.getScopeRegistry(this.scope,{configuration:r}):this.publish?s=hi.getPublishRegistry((await eC(r,this.context.cwd)).manifest,{configuration:r}):s=hi.getDefaultRegistry({configuration:r}),(await Ot.start({configuration:r,stdout:this.context.stdout},async n=>{let c;try{c=await en.get(\"/-/whoami\",{configuration:r,registry:s,authType:en.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?G.makeIdent(this.scope,\"\"):void 0})}catch(f){if(f.response?.statusCode===401||f.response?.statusCode===403){n.reportError(41,\"Authentication failed - your credentials may have expired\");return}else throw f}n.reportInfo(0,c.username)})).exitCode()}};var Cbt={configuration:{npmPublishAccess:{description:\"Default access of the published packages\",type:\"STRING\",default:null},npmPublishProvenance:{description:\"Whether to generate provenance for the published packages\",type:\"BOOLEAN\",default:!1},npmAuditExcludePackages:{description:\"Array of glob patterns of packages to exclude from npm audit\",type:\"STRING\",default:[],isArray:!0},npmAuditIgnoreAdvisories:{description:\"Array of glob patterns of advisory IDs to exclude from npm audit\",type:\"STRING\",default:[],isArray:!0}},commands:[D1,b1,P1,k1,Q1,R1,T1,F1,N1]},wbt=Cbt;var XK={};Vt(XK,{PatchCommand:()=>H1,PatchCommitCommand:()=>_1,PatchFetcher:()=>rP,PatchResolver:()=>nP,default:()=>_bt,patchUtils:()=>gy});Ge();Ge();Dt();eA();var gy={};Vt(gy,{applyPatchFile:()=>RL,diffFolders:()=>KK,ensureUnpatchedDescriptor:()=>WK,ensureUnpatchedLocator:()=>NL,extractPackageToDisk:()=>JK,extractPatchFlags:()=>rke,isParentRequired:()=>VK,isPatchDescriptor:()=>FL,isPatchLocator:()=>Rg,loadPatchFiles:()=>tP,makeDescriptor:()=>OL,makeLocator:()=>YK,makePatchHash:()=>zK,parseDescriptor:()=>$b,parseLocator:()=>eP,parsePatchFile:()=>Zb,unpatchDescriptor:()=>Lbt,unpatchLocator:()=>Mbt});Ge();Dt();Ge();Dt();var Bbt=/^@@ -(\\d+)(,(\\d+))? \\+(\\d+)(,(\\d+))? @@.*/;function O1(t){return J.relative(vt.root,J.resolve(vt.root,fe.toPortablePath(t)))}function vbt(t){let e=t.trim().match(Bbt);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var Sbt=420,Dbt=493;var zxe=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),bbt=t=>({header:vbt(t),parts:[]}),Pbt={\"@\":\"header\",\"-\":\"deletion\",\"+\":\"insertion\",\" \":\"context\",\"\\\\\":\"pragma\",undefined:\"context\"};function xbt(t){let e=[],r=zxe(),s=\"parsing header\",a=null,n=null;function c(){a&&(n&&(a.parts.push(n),n=null),r.hunks.push(a),a=null)}function f(){c(),e.push(r),r=zxe()}for(let p=0;p<t.length;p++){let h=t[p];if(s===\"parsing header\")if(h.startsWith(\"@@\"))s=\"parsing hunks\",r.hunks=[],p-=1;else if(h.startsWith(\"diff --git \")){r&&r.diffLineFromPath&&f();let E=h.match(/^diff --git a\\/(.*?) b\\/(.*?)\\s*$/);if(!E)throw new Error(`Bad diff line: ${h}`);r.diffLineFromPath=E[1],r.diffLineToPath=E[2]}else if(h.startsWith(\"old mode \"))r.oldMode=h.slice(9).trim();else if(h.startsWith(\"new mode \"))r.newMode=h.slice(9).trim();else if(h.startsWith(\"deleted file mode \"))r.deletedFileMode=h.slice(18).trim();else if(h.startsWith(\"new file mode \"))r.newFileMode=h.slice(14).trim();else if(h.startsWith(\"rename from \"))r.renameFrom=h.slice(12).trim();else if(h.startsWith(\"rename to \"))r.renameTo=h.slice(10).trim();else if(h.startsWith(\"index \")){let E=h.match(/(\\w+)\\.\\.(\\w+)/);if(!E)continue;r.beforeHash=E[1],r.afterHash=E[2]}else h.startsWith(\"semver exclusivity \")?r.semverExclusivity=h.slice(19).trim():h.startsWith(\"--- \")?r.fromPath=h.slice(6).trim():h.startsWith(\"+++ \")&&(r.toPath=h.slice(6).trim());else{let E=Pbt[h[0]]||null;switch(E){case\"header\":c(),a=bbt(h);break;case null:s=\"parsing header\",f(),p-=1;break;case\"pragma\":{if(!h.startsWith(\"\\\\ No newline at end of file\"))throw new Error(`Unrecognized pragma in patch file: ${h}`);if(!n)throw new Error(\"Bad parser state: No newline at EOF pragma encountered without context\");n.noNewlineAtEndOfFile=!0}break;case\"context\":case\"deletion\":case\"insertion\":{if(!a)throw new Error(\"Bad parser state: Hunk lines encountered before hunk header\");n&&n.type!==E&&(a.parts.push(n),n=null),n||(n={type:E,lines:[],noNewlineAtEndOfFile:!1}),n.lines.push(h.slice(1))}break;default:je.assertNever(E);break}}}f();for(let{hunks:p}of e)if(p)for(let h of p)Qbt(h);return e}function kbt(t){let e=[];for(let r of t){let{semverExclusivity:s,diffLineFromPath:a,diffLineToPath:n,oldMode:c,newMode:f,deletedFileMode:p,newFileMode:h,renameFrom:E,renameTo:C,beforeHash:S,afterHash:P,fromPath:I,toPath:R,hunks:N}=r,U=E?\"rename\":p?\"file deletion\":h?\"file creation\":N&&N.length>0?\"patch\":\"mode change\",W=null;switch(U){case\"rename\":{if(!E||!C)throw new Error(\"Bad parser state: rename from & to not given\");e.push({type:\"rename\",semverExclusivity:s,fromPath:O1(E),toPath:O1(C)}),W=C}break;case\"file deletion\":{let ee=a||I;if(!ee)throw new Error(\"Bad parse state: no path given for file deletion\");e.push({type:\"file deletion\",semverExclusivity:s,hunk:N&&N[0]||null,path:O1(ee),mode:TL(p),hash:S})}break;case\"file creation\":{let ee=n||R;if(!ee)throw new Error(\"Bad parse state: no path given for file creation\");e.push({type:\"file creation\",semverExclusivity:s,hunk:N&&N[0]||null,path:O1(ee),mode:TL(h),hash:P})}break;case\"patch\":case\"mode change\":W=R||n;break;default:je.assertNever(U);break}W&&c&&f&&c!==f&&e.push({type:\"mode change\",semverExclusivity:s,path:O1(W),oldMode:TL(c),newMode:TL(f)}),W&&N&&N.length&&e.push({type:\"patch\",semverExclusivity:s,path:O1(W),hunks:N,beforeHash:S,afterHash:P})}if(e.length===0)throw new Error(\"Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string\");return e}function TL(t){let e=parseInt(t,8)&511;if(e!==Sbt&&e!==Dbt)throw new Error(`Unexpected file mode string: ${t}`);return e}function Zb(t){let e=t.split(/\\n/g);return e[e.length-1]===\"\"&&e.pop(),kbt(xbt(e))}function Qbt(t){let e=0,r=0;for(let{type:s,lines:a}of t.parts)switch(s){case\"context\":r+=a.length,e+=a.length;break;case\"deletion\":e+=a.length;break;case\"insertion\":r+=a.length;break;default:je.assertNever(s);break}if(e!==t.header.original.length||r!==t.header.patched.length){let s=a=>a<0?a:`+${a}`;throw new Error(`hunk header integrity check failed (expected @@ ${s(t.header.original.length)} ${s(t.header.patched.length)} @@, got @@ ${s(e)} ${s(r)} @@)`)}}Ge();Dt();var L1=class extends Error{constructor(r,s){super(`Cannot apply hunk #${r+1}`);this.hunk=s}};async function M1(t,e,r){let s=await t.lstatPromise(e),a=await r();typeof a<\"u\"&&(e=a),await t.lutimesPromise(e,s.atime,s.mtime)}async function RL(t,{baseFs:e=new Yn,dryRun:r=!1,version:s=null}={}){for(let a of t)if(!(a.semverExclusivity!==null&&s!==null&&!Fr.satisfiesWithPrereleases(s,a.semverExclusivity)))switch(a.type){case\"file deletion\":if(r){if(!e.existsSync(a.path))throw new Error(`Trying to delete a file that doesn't exist: ${a.path}`)}else await M1(e,J.dirname(a.path),async()=>{await e.unlinkPromise(a.path)});break;case\"rename\":if(r){if(!e.existsSync(a.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${a.fromPath}`)}else await M1(e,J.dirname(a.fromPath),async()=>{await M1(e,J.dirname(a.toPath),async()=>{await M1(e,a.fromPath,async()=>(await e.movePromise(a.fromPath,a.toPath),a.toPath))})});break;case\"file creation\":if(r){if(e.existsSync(a.path))throw new Error(`Trying to create a file that already exists: ${a.path}`)}else{let n=a.hunk?a.hunk.parts[0].lines.join(`\n`)+(a.hunk.parts[0].noNewlineAtEndOfFile?\"\":`\n`):\"\";await e.mkdirpPromise(J.dirname(a.path),{chmod:493,utimes:[fi.SAFE_TIME,fi.SAFE_TIME]}),await e.writeFilePromise(a.path,n,{mode:a.mode}),await e.utimesPromise(a.path,fi.SAFE_TIME,fi.SAFE_TIME)}break;case\"patch\":await M1(e,a.path,async()=>{await Fbt(a,{baseFs:e,dryRun:r})});break;case\"mode change\":{let c=(await e.statPromise(a.path)).mode;if(Xxe(a.newMode)!==Xxe(c))continue;await M1(e,a.path,async()=>{await e.chmodPromise(a.path,a.newMode)})}break;default:je.assertNever(a);break}}function Xxe(t){return(t&64)>0}function Zxe(t){return t.replace(/\\s+$/,\"\")}function Rbt(t,e){return Zxe(t)===Zxe(e)}async function Fbt({hunks:t,path:e},{baseFs:r,dryRun:s=!1}){let a=await r.statSync(e).mode,c=(await r.readFileSync(e,\"utf8\")).split(/\\n/),f=[],p=0,h=0;for(let C of t){let S=Math.max(h,C.header.patched.start+p),P=Math.max(0,S-h),I=Math.max(0,c.length-S-C.header.original.length),R=Math.max(P,I),N=0,U=0,W=null;for(;N<=R;){if(N<=P&&(U=S-N,W=$xe(C,c,U),W!==null)){N=-N;break}if(N<=I&&(U=S+N,W=$xe(C,c,U),W!==null))break;N+=1}if(W===null)throw new L1(t.indexOf(C),C);f.push(W),p+=N,h=U+C.header.original.length}if(s)return;let E=0;for(let C of f)for(let S of C)switch(S.type){case\"splice\":{let P=S.index+E;c.splice(P,S.numToDelete,...S.linesToInsert),E+=S.linesToInsert.length-S.numToDelete}break;case\"pop\":c.pop();break;case\"push\":c.push(S.line);break;default:je.assertNever(S);break}await r.writeFilePromise(e,c.join(`\n`),{mode:a})}function $xe(t,e,r){let s=[];for(let a of t.parts)switch(a.type){case\"context\":case\"deletion\":{for(let n of a.lines){let c=e[r];if(c==null||!Rbt(c,n))return null;r+=1}a.type===\"deletion\"&&(s.push({type:\"splice\",index:r-a.lines.length,numToDelete:a.lines.length,linesToInsert:[]}),a.noNewlineAtEndOfFile&&s.push({type:\"push\",line:\"\"}))}break;case\"insertion\":s.push({type:\"splice\",index:r,numToDelete:0,linesToInsert:a.lines}),a.noNewlineAtEndOfFile&&s.push({type:\"pop\"});break;default:je.assertNever(a.type);break}return s}var Obt=/^builtin<([^>]+)>$/;function U1(t,e){let{protocol:r,source:s,selector:a,params:n}=G.parseRange(t);if(r!==\"patch:\")throw new Error(\"Invalid patch range\");if(s===null)throw new Error(\"Patch locators must explicitly define their source\");let c=a?a.split(/&/).map(E=>fe.toPortablePath(E)):[],f=n&&typeof n.locator==\"string\"?G.parseLocator(n.locator):null,p=n&&typeof n.version==\"string\"?n.version:null,h=e(s);return{parentLocator:f,sourceItem:h,patchPaths:c,sourceVersion:p}}function FL(t){return t.range.startsWith(\"patch:\")}function Rg(t){return t.reference.startsWith(\"patch:\")}function $b(t){let{sourceItem:e,...r}=U1(t.range,G.parseDescriptor);return{...r,sourceDescriptor:e}}function eP(t){let{sourceItem:e,...r}=U1(t.reference,G.parseLocator);return{...r,sourceLocator:e}}function Lbt(t){let{sourceItem:e}=U1(t.range,G.parseDescriptor);return e}function Mbt(t){let{sourceItem:e}=U1(t.reference,G.parseLocator);return e}function WK(t){if(!FL(t))return t;let{sourceItem:e}=U1(t.range,G.parseDescriptor);return e}function NL(t){if(!Rg(t))return t;let{sourceItem:e}=U1(t.reference,G.parseLocator);return e}function eke({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:s,patchHash:a},n){let c=t!==null?{locator:G.stringifyLocator(t)}:{},f=typeof s<\"u\"?{version:s}:{},p=typeof a<\"u\"?{hash:a}:{};return G.makeRange({protocol:\"patch:\",source:n(e),selector:r.join(\"&\"),params:{...f,...p,...c}})}function OL(t,{parentLocator:e,sourceDescriptor:r,patchPaths:s}){return G.makeDescriptor(t,eke({parentLocator:e,sourceItem:r,patchPaths:s},G.stringifyDescriptor))}function YK(t,{parentLocator:e,sourcePackage:r,patchPaths:s,patchHash:a}){return G.makeLocator(t,eke({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:s,patchHash:a},G.stringifyLocator))}function tke({onAbsolute:t,onRelative:e,onProject:r,onBuiltin:s},a){let n=a.lastIndexOf(\"!\");n!==-1&&(a=a.slice(n+1));let c=a.match(Obt);return c!==null?s(c[1]):a.startsWith(\"~/\")?r(a.slice(2)):J.isAbsolute(a)?t(a):e(a)}function rke(t){let e=t.lastIndexOf(\"!\");return{optional:(e!==-1?new Set(t.slice(0,e).split(/!/)):new Set).has(\"optional\")}}function VK(t){return tke({onAbsolute:()=>!1,onRelative:()=>!0,onProject:()=>!1,onBuiltin:()=>!1},t)}async function tP(t,e,r){let s=t!==null?await r.fetcher.fetch(t,r):null,a=s&&s.localPath?{packageFs:new Sn(vt.root),prefixPath:J.relative(vt.root,s.localPath)}:s;s&&s!==a&&s.releaseFs&&s.releaseFs();let n=await je.releaseAfterUseAsync(async()=>await Promise.all(e.map(async c=>{let f=rke(c),p=await tke({onAbsolute:async h=>await ce.readFilePromise(h,\"utf8\"),onRelative:async h=>{if(a===null)throw new Error(\"Assertion failed: The parent locator should have been fetched\");return await a.packageFs.readFilePromise(J.join(a.prefixPath,h),\"utf8\")},onProject:async h=>await ce.readFilePromise(J.join(r.project.cwd,h),\"utf8\"),onBuiltin:async h=>await r.project.configuration.firstHook(E=>E.getBuiltinPatch,r.project,h)},c);return{...f,source:p}})));for(let c of n)typeof c.source==\"string\"&&(c.source=c.source.replace(/\\r\\n?/g,`\n`));return n}async function JK(t,{cache:e,project:r}){let s=r.storedPackages.get(t.locatorHash);if(typeof s>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");let a=NL(t),n=r.storedChecksums,c=new ki,f=await ce.mktempPromise(),p=J.join(f,\"source\"),h=J.join(f,\"user\"),E=J.join(f,\".yarn-patch.json\"),C=r.configuration.makeFetcher(),S=[];try{let P,I;if(t.locatorHash===a.locatorHash){let R=await C.fetch(t,{cache:e,project:r,fetcher:C,checksums:n,report:c});S.push(()=>R.releaseFs?.()),P=R,I=R}else P=await C.fetch(t,{cache:e,project:r,fetcher:C,checksums:n,report:c}),S.push(()=>P.releaseFs?.()),I=await C.fetch(t,{cache:e,project:r,fetcher:C,checksums:n,report:c}),S.push(()=>I.releaseFs?.());await Promise.all([ce.copyPromise(p,P.prefixPath,{baseFs:P.packageFs}),ce.copyPromise(h,I.prefixPath,{baseFs:I.packageFs}),ce.writeJsonPromise(E,{locator:G.stringifyLocator(t),version:s.version})])}finally{for(let P of S)P()}return ce.detachTemp(f),h}async function KK(t,e){let r=fe.fromPortablePath(t).replace(/\\\\/g,\"/\"),s=fe.fromPortablePath(e).replace(/\\\\/g,\"/\"),{stdout:a,stderr:n}=await qr.execvp(\"git\",[\"-c\",\"core.safecrlf=false\",\"diff\",\"--src-prefix=a/\",\"--dst-prefix=b/\",\"--ignore-cr-at-eol\",\"--full-index\",\"--no-index\",\"--no-renames\",\"--text\",r,s],{cwd:fe.toPortablePath(process.cwd()),env:{...process.env,GIT_CONFIG_NOSYSTEM:\"1\",HOME:\"\",XDG_CONFIG_HOME:\"\",USERPROFILE:\"\"}});if(n.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH.\nThe following error was reported by 'git':\n${n}`);let c=r.startsWith(\"/\")?f=>f.slice(1):f=>f;return a.replace(new RegExp(`(a|b)(${je.escapeRegExp(`/${c(r)}/`)})`,\"g\"),\"$1/\").replace(new RegExp(`(a|b)${je.escapeRegExp(`/${c(s)}/`)}`,\"g\"),\"$1/\").replace(new RegExp(je.escapeRegExp(`${r}/`),\"g\"),\"\").replace(new RegExp(je.escapeRegExp(`${s}/`),\"g\"),\"\")}function zK(t,e){let r=[];for(let{source:s}of t){if(s===null)continue;let a=Zb(s);for(let n of a){let{semverExclusivity:c,...f}=n;c!==null&&e!==null&&!Fr.satisfiesWithPrereleases(e,c)||r.push(JSON.stringify(f))}}return Nn.makeHash(`${3}`,...r).slice(0,6)}Ge();function nke(t,{configuration:e,report:r}){for(let s of t.parts)for(let a of s.lines)switch(s.type){case\"context\":r.reportInfo(null,`  ${he.pretty(e,a,\"grey\")}`);break;case\"deletion\":r.reportError(28,`- ${he.pretty(e,a,he.Type.REMOVED)}`);break;case\"insertion\":r.reportError(28,`+ ${he.pretty(e,a,he.Type.ADDED)}`);break;default:je.assertNever(s.type)}}var rP=class{supports(e,r){return!!Rg(e)}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:c}}async patchPackage(e,r){let{parentLocator:s,sourceLocator:a,sourceVersion:n,patchPaths:c}=eP(e),f=await tP(s,c,r),p=await ce.mktempPromise(),h=J.join(p,\"current.zip\"),E=await r.fetcher.fetch(a,r),C=G.getIdentVendorPath(e),S=new As(h,{create:!0,level:r.project.configuration.get(\"compressionLevel\")});await je.releaseAfterUseAsync(async()=>{await S.copyPromise(C,E.prefixPath,{baseFs:E.packageFs,stableSort:!0})},E.releaseFs),S.saveAndClose();for(let{source:P,optional:I}of f){if(P===null)continue;let R=new As(h,{level:r.project.configuration.get(\"compressionLevel\")}),N=new Sn(J.resolve(vt.root,C),{baseFs:R});try{await RL(Zb(P),{baseFs:N,version:n})}catch(U){if(!(U instanceof L1))throw U;let W=r.project.configuration.get(\"enableInlineHunks\"),ee=!W&&!I?\" (set enableInlineHunks for details)\":\"\",ie=`${G.prettyLocator(r.project.configuration,e)}: ${U.message}${ee}`,ue=le=>{W&&nke(U.hunk,{configuration:r.project.configuration,report:le})};if(R.discardAndClose(),I){r.report.reportWarningOnce(66,ie,{reportExtra:ue});continue}else throw new jt(66,ie,ue)}R.saveAndClose()}return new As(h,{level:r.project.configuration.get(\"compressionLevel\")})}};Ge();var nP=class{supportsDescriptor(e,r){return!!FL(e)}supportsLocator(e,r){return!!Rg(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){let{patchPaths:a}=$b(e);return a.every(n=>!VK(n))?e:G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:s}=$b(e);return{sourceDescriptor:r.project.configuration.normalizeDependency(s)}}async getCandidates(e,r,s){if(!s.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let{parentLocator:a,patchPaths:n}=$b(e),c=await tP(a,n,s.fetchOptions),f=r.sourceDescriptor;if(typeof f>\"u\")throw new Error(\"Assertion failed: The dependency should have been resolved\");let p=zK(c,f.version);return[YK(e,{parentLocator:a,sourcePackage:f,patchPaths:n,patchHash:p})]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let{sourceLocator:s}=eP(e);return{...await r.resolver.resolve(s,r),...e}}};Ge();Dt();Yt();var _1=class extends ft{constructor(){super(...arguments);this.save=ge.Boolean(\"-s,--save\",!1,{description:\"Add the patch to your resolution entries\"});this.patchFolder=ge.String()}static{this.paths=[[\"patch-commit\"]]}static{this.usage=ot.Usage({description:\"generate a patch out of a directory\",details:\"\\n      By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\\n\\n      With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\\n\\n      Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\\n    \"})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let n=J.resolve(this.context.cwd,fe.toPortablePath(this.patchFolder)),c=J.join(n,\"../source\"),f=J.join(n,\"../.yarn-patch.json\");if(!ce.existsSync(c))throw new nt(\"The argument folder didn't get created by 'yarn patch'\");let p=await KK(c,n),h=await ce.readJsonPromise(f),E=G.parseLocator(h.locator,!0);if(!s.storedPackages.has(E.locatorHash))throw new nt(\"No package found in the project for the given locator\");if(!this.save){this.context.stdout.write(p);return}let C=r.get(\"patchFolder\"),S=J.join(C,`${G.slugifyLocator(E)}.patch`);await ce.mkdirPromise(C,{recursive:!0}),await ce.writeFilePromise(S,p);let P=[],I=new Map;for(let R of s.storedPackages.values()){if(G.isVirtualLocator(R))continue;let N=R.dependencies.get(E.identHash);if(!N)continue;let U=G.ensureDevirtualizedDescriptor(N),W=WK(U),ee=s.storedResolutions.get(W.descriptorHash);if(!ee)throw new Error(\"Assertion failed: Expected the resolution to have been registered\");if(!s.storedPackages.get(ee))throw new Error(\"Assertion failed: Expected the package to have been registered\");let ue=s.tryWorkspaceByLocator(R);if(ue)P.push(ue);else{let le=s.originalPackages.get(R.locatorHash);if(!le)throw new Error(\"Assertion failed: Expected the original package to have been registered\");let me=le.dependencies.get(N.identHash);if(!me)throw new Error(\"Assertion failed: Expected the original dependency to have been registered\");I.set(me.descriptorHash,me)}}for(let R of P)for(let N of Ut.hardDependencies){let U=R.manifest[N].get(E.identHash);if(!U)continue;let W=OL(U,{parentLocator:null,sourceDescriptor:G.convertLocatorToDescriptor(E),patchPaths:[J.join(Er.home,J.relative(s.cwd,S))]});R.manifest[N].set(U.identHash,W)}for(let R of I.values()){let N=OL(R,{parentLocator:null,sourceDescriptor:G.convertLocatorToDescriptor(E),patchPaths:[J.join(Er.home,J.relative(s.cwd,S))]});s.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:G.stringifyIdent(N),description:R.range}},reference:N.range})}await s.persist()}};Ge();Dt();Yt();var H1=class extends ft{constructor(){super(...arguments);this.update=ge.Boolean(\"-u,--update\",!1,{description:\"Reapply local patches that already apply to this packages\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.package=ge.String()}static{this.paths=[[\"patch\"]]}static{this.usage=ot.Usage({description:\"prepare a package for patching\",details:\"\\n      This command will cause a package to be extracted in a temporary directory intended to be editable at will.\\n\\n      Once you're done with your changes, run `yarn patch-commit -s path` (with `path` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\\n\\n      Calling the command when you already have a patch won't import it by default (in other words, the default behavior is to reset existing patches). However, adding the `-u,--update` flag will import any current patch.\\n    \"})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let c=G.parseLocator(this.package);if(c.reference===\"unknown\"){let f=je.mapAndFilter([...s.storedPackages.values()],p=>p.identHash!==c.identHash?je.mapAndFilter.skip:G.isVirtualLocator(p)?je.mapAndFilter.skip:Rg(p)!==this.update?je.mapAndFilter.skip:p);if(f.length===0)throw new nt(\"No package found in the project for the given locator\");if(f.length>1)throw new nt(`Multiple candidate packages found; explicitly choose one of them (use \\`yarn why <package>\\` to get more information as to who depends on them):\n${f.map(p=>`\n- ${G.prettyLocator(r,p)}`).join(\"\")}`);c=f[0]}if(!s.storedPackages.has(c.locatorHash))throw new nt(\"No package found in the project for the given locator\");await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async f=>{let p=NL(c),h=await JK(c,{cache:n,project:s});f.reportJson({locator:G.stringifyLocator(p),path:fe.fromPortablePath(h)});let E=this.update?\" along with its current modifications\":\"\";f.reportInfo(0,`Package ${G.prettyLocator(r,p)} got extracted with success${E}!`),f.reportInfo(0,`You can now edit the following folder: ${he.pretty(r,fe.fromPortablePath(h),\"magenta\")}`),f.reportInfo(0,`Once you are done run ${he.pretty(r,`yarn patch-commit -s ${process.platform===\"win32\"?'\"':\"\"}${fe.fromPortablePath(h)}${process.platform===\"win32\"?'\"':\"\"}`,\"cyan\")} and Yarn will store a patchfile based on your changes.`)})}};var Ubt={configuration:{enableInlineHunks:{description:\"If true, the installs will print unmatched patch hunks\",type:\"BOOLEAN\",default:!1},patchFolder:{description:\"Folder where the patch files must be written\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/patches\"}},commands:[_1,H1],fetchers:[rP],resolvers:[nP]},_bt=Ubt;var ez={};Vt(ez,{PnpmLinker:()=>iP,default:()=>Ybt});Ge();Dt();Yt();var iP=class{getCustomDataKey(){return JSON.stringify({name:\"PnpmLinker\",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error(\"Assertion failed: Expected the pnpm linker to be enabled\");let s=this.getCustomDataKey(),a=r.project.linkersCustomData.get(s);if(!a)throw new nt(`The project in ${he.pretty(r.project.configuration,`${r.project.cwd}/package.json`,he.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=a.pathsByLocator.get(e.locatorHash);if(typeof n>\"u\")throw new nt(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return n.packageLocation}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let s=this.getCustomDataKey(),a=r.project.linkersCustomData.get(s);if(!a)throw new nt(`The project in ${he.pretty(r.project.configuration,`${r.project.cwd}/package.json`,he.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=e.match(/(^.*\\/node_modules\\/(@[^/]*\\/)?[^/]+)(\\/.*$)/);if(n){let p=a.locatorByPath.get(n[1]);if(p)return p}let c=e,f=e;do{f=c,c=J.dirname(f);let p=a.locatorByPath.get(f);if(p)return p}while(c!==f);return null}makeInstaller(e){return new ZK(e)}isEnabled(e){return e.project.configuration.get(\"nodeLinker\")===\"pnpm\"}},ZK=class{constructor(e){this.opts=e;this.asyncActions=new je.AsyncActions(10);this.customData={pathsByLocator:new Map,locatorByPath:new Map};this.indexFolderPromise=$P(ce,{indexPath:J.join(e.project.configuration.get(\"globalFolder\"),\"index\")})}attachCustomData(e){}async installPackage(e,r,s){switch(e.linkType){case\"SOFT\":return this.installPackageSoft(e,r,s);case\"HARD\":return this.installPackageHard(e,r,s)}throw new Error(\"Assertion failed: Unsupported package link type\")}async installPackageSoft(e,r,s){let a=J.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.opts.project.tryWorkspaceByLocator(e)?J.join(a,Er.nodeModules):null;return this.customData.pathsByLocator.set(e.locatorHash,{packageLocation:a,dependenciesLocation:n}),{packageLocation:a,buildRequest:null}}async installPackageHard(e,r,s){let a=jbt(e,{project:this.opts.project}),n=a.packageLocation;this.customData.locatorByPath.set(n,G.stringifyLocator(e)),this.customData.pathsByLocator.set(e.locatorHash,a),s.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await ce.mkdirPromise(n,{recursive:!0}),await ce.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1,linkStrategy:{type:\"HardlinkFromIndex\",indexPath:await this.indexFolderPromise,autoRepair:!0}})}));let f=G.isVirtualLocator(e)?G.devirtualizeLocator(e):e,p={manifest:await Ut.tryFind(r.prefixPath,{baseFs:r.packageFs})??new Ut,misc:{hasBindingGyp:gA.hasBindingGyp(r)}},h=this.opts.project.getDependencyMeta(f,e.version),E=gA.extractBuildRequest(e,p,h,{configuration:this.opts.project.configuration});return{packageLocation:n,buildRequest:E}}async attachInternalDependencies(e,r){if(this.opts.project.configuration.get(\"nodeLinker\")!==\"pnpm\"||!ike(e,{project:this.opts.project}))return;let s=this.customData.pathsByLocator.get(e.locatorHash);if(typeof s>\"u\")throw new Error(`Assertion failed: Expected the package to have been registered (${G.stringifyLocator(e)})`);let{dependenciesLocation:a}=s;a&&this.asyncActions.reduce(e.locatorHash,async n=>{await ce.mkdirPromise(a,{recursive:!0});let c=await Gbt(a),f=new Map(c),p=[n],h=(C,S)=>{let P=S;ike(S,{project:this.opts.project})||(this.opts.report.reportWarningOnce(0,\"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies\"),P=G.devirtualizeLocator(S));let I=this.customData.pathsByLocator.get(P.locatorHash);if(typeof I>\"u\")throw new Error(`Assertion failed: Expected the package to have been registered (${G.stringifyLocator(S)})`);let R=G.stringifyIdent(C),N=J.join(a,R),U=J.relative(J.dirname(N),I.packageLocation),W=f.get(R);f.delete(R),p.push(Promise.resolve().then(async()=>{if(W){if(W.isSymbolicLink()&&await ce.readlinkPromise(N)===U)return;await ce.removePromise(N)}await ce.mkdirpPromise(J.dirname(N)),process.platform==\"win32\"&&this.opts.project.configuration.get(\"winLinkType\")===\"junctions\"?await ce.symlinkPromise(I.packageLocation,N,\"junction\"):await ce.symlinkPromise(U,N)}))},E=!1;for(let[C,S]of r)C.identHash===e.identHash&&(E=!0),h(C,S);!E&&!this.opts.project.tryWorkspaceByLocator(e)&&h(G.convertLocatorToDescriptor(e),e),p.push(qbt(a,f)),await Promise.all(p)})}async attachExternalDependents(e,r){throw new Error(\"External dependencies haven't been implemented for the pnpm linker\")}async finalizeInstall(){let e=ske(this.opts.project);if(this.opts.project.configuration.get(\"nodeLinker\")!==\"pnpm\")await ce.removePromise(e);else{let r;try{r=new Set(await ce.readdirPromise(e))}catch{r=new Set}for(let{dependenciesLocation:s}of this.customData.pathsByLocator.values()){if(!s)continue;let a=J.contains(e,s);if(a===null)continue;let[n]=a.split(J.sep);r.delete(n)}await Promise.all([...r].map(async s=>{await ce.removePromise(J.join(e,s))}))}return await this.asyncActions.wait(),await $K(e),this.opts.project.configuration.get(\"nodeLinker\")!==\"node-modules\"&&await $K(Hbt(this.opts.project)),{customData:this.customData}}};function Hbt(t){return J.join(t.cwd,Er.nodeModules)}function ske(t){return t.configuration.get(\"pnpmStoreFolder\")}function jbt(t,{project:e}){let r=G.slugifyLocator(t),s=ske(e),a=J.join(s,r,\"package\"),n=J.join(s,r,Er.nodeModules);return{packageLocation:a,dependenciesLocation:n}}function ike(t,{project:e}){return!G.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function Gbt(t){let e=new Map,r=[];try{r=await ce.readdirPromise(t,{withFileTypes:!0})}catch(s){if(s.code!==\"ENOENT\")throw s}try{for(let s of r)if(!s.name.startsWith(\".\"))if(s.name.startsWith(\"@\")){let a=await ce.readdirPromise(J.join(t,s.name),{withFileTypes:!0});if(a.length===0)e.set(s.name,s);else for(let n of a)e.set(`${s.name}/${n.name}`,n)}else e.set(s.name,s)}catch(s){if(s.code!==\"ENOENT\")throw s}return e}async function qbt(t,e){let r=[],s=new Set;for(let a of e.keys()){r.push(ce.removePromise(J.join(t,a)));let n=G.tryParseIdent(a)?.scope;n&&s.add(`@${n}`)}return Promise.all(r).then(()=>Promise.all([...s].map(a=>$K(J.join(t,a)))))}async function $K(t){try{await ce.rmdirPromise(t)}catch(e){if(e.code!==\"ENOENT\"&&e.code!==\"ENOTEMPTY\"&&e.code!==\"EBUSY\")throw e}}var Wbt={configuration:{pnpmStoreFolder:{description:\"By default, the store is stored in the 'node_modules/.store' of the project. Sometimes in CI scenario's it is convenient to store this in a different location so it can be cached and reused.\",type:\"ABSOLUTE_PATH\",default:\"./node_modules/.store\"}},linkers:[iP]},Ybt=Wbt;var az={};Vt(az,{StageCommand:()=>j1,default:()=>nPt,stageUtils:()=>ML});Ge();Dt();Yt();Ge();Dt();var ML={};Vt(ML,{ActionType:()=>tz,checkConsensus:()=>LL,expandDirectory:()=>iz,findConsensus:()=>sz,findVcsRoot:()=>rz,genCommitMessage:()=>oz,getCommitPrefix:()=>oke,isYarnFile:()=>nz});Dt();var tz=(n=>(n[n.CREATE=0]=\"CREATE\",n[n.DELETE=1]=\"DELETE\",n[n.ADD=2]=\"ADD\",n[n.REMOVE=3]=\"REMOVE\",n[n.MODIFY=4]=\"MODIFY\",n))(tz||{});async function rz(t,{marker:e}){do if(!ce.existsSync(J.join(t,e)))t=J.dirname(t);else return t;while(t!==\"/\");return null}function nz(t,{roots:e,names:r}){if(r.has(J.basename(t)))return!0;do if(!e.has(t))t=J.dirname(t);else return!0;while(t!==\"/\");return!1}function iz(t){let e=[],r=[t];for(;r.length>0;){let s=r.pop(),a=ce.readdirSync(s);for(let n of a){let c=J.resolve(s,n);ce.lstatSync(c).isDirectory()?r.push(c):e.push(c)}}return e}function LL(t,e){let r=0,s=0;for(let a of t)a!==\"wip\"&&(e.test(a)?r+=1:s+=1);return r>=s}function sz(t){let e=LL(t,/^(\\w\\(\\w+\\):\\s*)?\\w+s/),r=LL(t,/^(\\w\\(\\w+\\):\\s*)?[A-Z]/),s=LL(t,/^\\w\\(\\w+\\):/);return{useThirdPerson:e,useUpperCase:r,useComponent:s}}function oke(t){return t.useComponent?\"chore(yarn): \":\"\"}var Vbt=new Map([[0,\"create\"],[1,\"delete\"],[2,\"add\"],[3,\"remove\"],[4,\"update\"]]);function oz(t,e){let r=oke(t),s=[],a=e.slice().sort((n,c)=>n[0]-c[0]);for(;a.length>0;){let[n,c]=a.shift(),f=Vbt.get(n);t.useUpperCase&&s.length===0&&(f=`${f[0].toUpperCase()}${f.slice(1)}`),t.useThirdPerson&&(f+=\"s\");let p=[c];for(;a.length>0&&a[0][0]===n;){let[,E]=a.shift();p.push(E)}p.sort();let h=p.shift();p.length===1?h+=\" (and one other)\":p.length>1&&(h+=` (and ${p.length} others)`),s.push(`${f} ${h}`)}return`${r}${s.join(\", \")}`}var Jbt=\"Commit generated via `yarn stage`\",Kbt=11;async function ake(t){let{code:e,stdout:r}=await qr.execvp(\"git\",[\"log\",\"-1\",\"--pretty=format:%H\"],{cwd:t});return e===0?r.trim():null}async function zbt(t,e){let r=[],s=e.filter(h=>J.basename(h.path)===\"package.json\");for(let{action:h,path:E}of s){let C=J.relative(t,E);if(h===4){let S=await ake(t),{stdout:P}=await qr.execvp(\"git\",[\"show\",`${S}:${C}`],{cwd:t,strict:!0}),I=await Ut.fromText(P),R=await Ut.fromFile(E),N=new Map([...R.dependencies,...R.devDependencies]),U=new Map([...I.dependencies,...I.devDependencies]);for(let[W,ee]of U){let ie=G.stringifyIdent(ee),ue=N.get(W);ue?ue.range!==ee.range&&r.push([4,`${ie} to ${ue.range}`]):r.push([3,ie])}for(let[W,ee]of N)U.has(W)||r.push([2,G.stringifyIdent(ee)])}else if(h===0){let S=await Ut.fromFile(E);S.name?r.push([0,G.stringifyIdent(S.name)]):r.push([0,\"a package\"])}else if(h===1){let S=await ake(t),{stdout:P}=await qr.execvp(\"git\",[\"show\",`${S}:${C}`],{cwd:t,strict:!0}),I=await Ut.fromText(P);I.name?r.push([1,G.stringifyIdent(I.name)]):r.push([1,\"a package\"])}else throw new Error(\"Assertion failed: Unsupported action type\")}let{code:a,stdout:n}=await qr.execvp(\"git\",[\"log\",`-${Kbt}`,\"--pretty=format:%s\"],{cwd:t}),c=a===0?n.split(/\\n/g).filter(h=>h!==\"\"):[],f=sz(c);return oz(f,r)}var Xbt={0:[\" A \",\"?? \"],4:[\" M \"],1:[\" D \"]},Zbt={0:[\"A  \"],4:[\"M  \"],1:[\"D  \"]},lke={async findRoot(t){return await rz(t,{marker:\".git\"})},async filterChanges(t,e,r,s){let{stdout:a}=await qr.execvp(\"git\",[\"status\",\"-s\"],{cwd:t,strict:!0}),n=a.toString().split(/\\n/g),c=s?.staged?Zbt:Xbt;return[].concat(...n.map(p=>{if(p===\"\")return[];let h=p.slice(0,3),E=J.resolve(t,p.slice(3));if(!s?.staged&&h===\"?? \"&&p.endsWith(\"/\"))return iz(E).map(C=>({action:0,path:C}));{let S=[0,4,1].find(P=>c[P].includes(h));return S!==void 0?[{action:S,path:E}]:[]}})).filter(p=>nz(p.path,{roots:e,names:r}))},async genCommitMessage(t,e){return await zbt(t,e)},async makeStage(t,e){let r=e.map(s=>fe.fromPortablePath(s.path));await qr.execvp(\"git\",[\"add\",\"--\",...r],{cwd:t,strict:!0})},async makeCommit(t,e,r){let s=e.map(a=>fe.fromPortablePath(a.path));await qr.execvp(\"git\",[\"add\",\"-N\",\"--\",...s],{cwd:t,strict:!0}),await qr.execvp(\"git\",[\"commit\",\"-m\",`${r}\n\n${Jbt}\n`,\"--\",...s],{cwd:t,strict:!0})},async makeReset(t,e){let r=e.map(s=>fe.fromPortablePath(s.path));await qr.execvp(\"git\",[\"reset\",\"HEAD\",\"--\",...r],{cwd:t,strict:!0})}};var $bt=[lke],j1=class extends ft{constructor(){super(...arguments);this.commit=ge.Boolean(\"-c,--commit\",!1,{description:\"Commit the staged files\"});this.reset=ge.Boolean(\"-r,--reset\",!1,{description:\"Remove all files from the staging area\"});this.dryRun=ge.Boolean(\"-n,--dry-run\",!1,{description:\"Print the commit message and the list of modified files without staging / committing\"});this.update=ge.Boolean(\"-u,--update\",!1,{hidden:!0})}static{this.paths=[[\"stage\"]]}static{this.usage=ot.Usage({description:\"add all yarn files to your vcs\",details:\"\\n      This command will add to your staging area the files belonging to Yarn (typically any modified `package.json` and `.yarnrc.yml` files, but also linker-generated files, cache data, etc). It will take your ignore list into account, so the cache files won't be added if the cache is ignored in a `.gitignore` file (assuming you use Git).\\n\\n      Running `--reset` will instead remove them from the staging area (the changes will still be there, but won't be committed until you stage them back).\\n\\n      Since the staging area is a non-existent concept in Mercurial, Yarn will always create a new commit when running this command on Mercurial repositories. You can get this behavior when using Git by using the `--commit` flag which will directly create a commit.\\n    \",examples:[[\"Adds all modified project files to the staging area\",\"yarn stage\"],[\"Creates a new commit containing all modified project files\",\"yarn stage --commit\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd),{driver:a,root:n}=await ePt(s.cwd),c=[r.get(\"cacheFolder\"),r.get(\"globalFolder\"),r.get(\"virtualFolder\"),r.get(\"yarnPath\")];await r.triggerHook(C=>C.populateYarnPaths,s,C=>{c.push(C)});let f=new Set;for(let C of c)for(let S of tPt(n,C))f.add(S);let p=new Set([r.get(\"rcFilename\"),Er.lockfile,Er.manifest]),h=await a.filterChanges(n,f,p),E=await a.genCommitMessage(n,h);if(this.dryRun)if(this.commit)this.context.stdout.write(`${E}\n`);else for(let C of h)this.context.stdout.write(`${fe.fromPortablePath(C.path)}\n`);else if(this.reset){let C=await a.filterChanges(n,f,p,{staged:!0});C.length===0?this.context.stdout.write(\"No staged changes found!\"):await a.makeReset(n,C)}else h.length===0?this.context.stdout.write(\"No changes found!\"):this.commit?await a.makeCommit(n,h,E):(await a.makeStage(n,h),this.context.stdout.write(E))}};async function ePt(t){let e=null,r=null;for(let s of $bt)if((r=await s.findRoot(t))!==null){e=s;break}if(e===null||r===null)throw new nt(\"No stage driver has been found for your current project\");return{driver:e,root:r}}function tPt(t,e){let r=[];if(e===null)return r;for(;;){(e===t||e.startsWith(`${t}/`))&&r.push(e);let s;try{s=ce.statSync(e)}catch{break}if(s.isSymbolicLink())e=J.resolve(J.dirname(e),ce.readlinkSync(e));else break}return r}var rPt={commands:[j1]},nPt=rPt;var lz={};Vt(lz,{default:()=>fPt});Ge();Ge();Dt();var fke=ut(Ai());Ge();var cke=ut(g9()),iPt=\"e8e1bd300d860104bb8c58453ffa1eb4\",sPt=\"OFCNCOG2CU\",uke=async(t,e)=>{let r=G.stringifyIdent(t),a=oPt(e).initIndex(\"npm-search\");try{return(await a.getObject(r,{attributesToRetrieve:[\"types\"]})).types?.ts===\"definitely-typed\"}catch{return!1}},oPt=t=>(0,cke.default)(sPt,iPt,{requester:{async send(r){try{let s=await nn.request(r.url,r.data||null,{configuration:t,headers:r.headers});return{content:s.body,isTimedOut:!1,status:s.statusCode}}catch(s){return{content:s.response.body,isTimedOut:!1,status:s.response.statusCode}}}}});var Ake=t=>t.scope?`${t.scope}__${t.name}`:`${t.name}`,aPt=async(t,e,r,s)=>{if(r.scope===\"types\")return;let{project:a}=t,{configuration:n}=a;if(!(n.get(\"tsEnableAutoTypes\")??(ce.existsSync(J.join(t.cwd,\"tsconfig.json\"))||ce.existsSync(J.join(a.cwd,\"tsconfig.json\")))))return;let f=n.makeResolver(),p={project:a,resolver:f,report:new ki};if(!await uke(r,n))return;let E=Ake(r),C=G.parseRange(r.range).selector;if(!Fr.validRange(C)){let N=n.normalizeDependency(r),U=await f.getCandidates(N,{},p);C=G.parseRange(U[0].reference).selector}let S=fke.default.coerce(C);if(S===null)return;let P=`${Xu.Modifier.CARET}${S.major}`,I=G.makeDescriptor(G.makeIdent(\"types\",E),P),R=je.mapAndFind(a.workspaces,N=>{let U=N.manifest.dependencies.get(r.identHash)?.descriptorHash,W=N.manifest.devDependencies.get(r.identHash)?.descriptorHash;if(U!==r.descriptorHash&&W!==r.descriptorHash)return je.mapAndFind.skip;let ee=[];for(let ie of Ut.allDependencies){let ue=N.manifest[ie].get(I.identHash);typeof ue>\"u\"||ee.push([ie,ue])}return ee.length===0?je.mapAndFind.skip:ee});if(typeof R<\"u\")for(let[N,U]of R)t.manifest[N].set(U.identHash,U);else{try{let N=n.normalizeDependency(I);if((await f.getCandidates(N,{},p)).length===0)return}catch{return}t.manifest[Xu.Target.DEVELOPMENT].set(I.identHash,I)}},lPt=async(t,e,r)=>{if(r.scope===\"types\")return;let{project:s}=t,{configuration:a}=s;if(!(a.get(\"tsEnableAutoTypes\")??(ce.existsSync(J.join(t.cwd,\"tsconfig.json\"))||ce.existsSync(J.join(s.cwd,\"tsconfig.json\")))))return;let c=Ake(r),f=G.makeIdent(\"types\",c);for(let p of Ut.allDependencies)typeof t.manifest[p].get(f.identHash)>\"u\"||t.manifest[p].delete(f.identHash)},cPt=(t,e)=>{e.publishConfig&&e.publishConfig.typings&&(e.typings=e.publishConfig.typings),e.publishConfig&&e.publishConfig.types&&(e.types=e.publishConfig.types)},uPt={configuration:{tsEnableAutoTypes:{description:\"Whether Yarn should auto-install @types/ dependencies on 'yarn add'\",type:\"BOOLEAN\",isNullable:!0,default:null}},hooks:{afterWorkspaceDependencyAddition:aPt,afterWorkspaceDependencyRemoval:lPt,beforeWorkspacePacking:cPt}},fPt=uPt;var pz={};Vt(pz,{VersionApplyCommand:()=>Y1,VersionCheckCommand:()=>V1,VersionCommand:()=>J1,default:()=>dPt,versionUtils:()=>W1});Ge();Ge();Yt();var W1={};Vt(W1,{Decision:()=>G1,applyPrerelease:()=>pke,applyReleases:()=>Az,applyStrategy:()=>sP,clearVersionFiles:()=>cz,getUndecidedDependentWorkspaces:()=>aP,getUndecidedWorkspaces:()=>UL,openVersionFile:()=>q1,requireMoreDecisions:()=>pPt,resolveVersionFiles:()=>oP,suggestStrategy:()=>fz,updateVersionFiles:()=>uz,validateReleaseDecision:()=>dy});Ge();Dt();wc();Yt();ql();var kA=ut(Ai()),APt=/^(>=|[~^]|)(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$/,G1=(h=>(h.UNDECIDED=\"undecided\",h.DECLINE=\"decline\",h.MAJOR=\"major\",h.MINOR=\"minor\",h.PATCH=\"patch\",h.PREMAJOR=\"premajor\",h.PREMINOR=\"preminor\",h.PREPATCH=\"prepatch\",h.PRERELEASE=\"prerelease\",h))(G1||{});function dy(t){let e=kA.default.valid(t);return e||je.validateEnum(O4(G1,\"UNDECIDED\"),t)}async function oP(t,{prerelease:e=null}={}){let r=new Map,s=t.configuration.get(\"deferredVersionFolder\");if(!ce.existsSync(s))return r;let a=await ce.readdirPromise(s);for(let n of a){if(!n.endsWith(\".yml\"))continue;let c=J.join(s,n),f=await ce.readFilePromise(c,\"utf8\"),p=ls(f);for(let[h,E]of Object.entries(p.releases||{})){if(E===\"decline\")continue;let C=G.parseIdent(h),S=t.tryWorkspaceByIdent(C);if(S===null)throw new Error(`Assertion failed: Expected a release definition file to only reference existing workspaces (${J.basename(c)} references ${h})`);if(S.manifest.version===null)throw new Error(`Assertion failed: Expected the workspace to have a version (${G.prettyLocator(t.configuration,S.anchoredLocator)})`);let P=S.manifest.raw.stableVersion??S.manifest.version,I=r.get(S),R=sP(E===\"prerelease\"?S.manifest.version:P,dy(E));if(R===null)throw new Error(`Assertion failed: Expected ${P} to support being bumped via strategy ${E}`);let N=typeof I<\"u\"?kA.default.gt(R,I)?R:I:R;r.set(S,N)}}return e&&(r=new Map([...r].map(([n,c])=>[n,pke(c,{current:n.manifest.version,prerelease:e})]))),r}async function cz(t){let e=t.configuration.get(\"deferredVersionFolder\");ce.existsSync(e)&&await ce.removePromise(e)}async function uz(t,e){let r=new Set(e),s=t.configuration.get(\"deferredVersionFolder\");if(!ce.existsSync(s))return;let a=await ce.readdirPromise(s);for(let n of a){if(!n.endsWith(\".yml\"))continue;let c=J.join(s,n),f=await ce.readFilePromise(c,\"utf8\"),p=ls(f),h=p?.releases;if(h){for(let E of Object.keys(h)){let C=G.parseIdent(E),S=t.tryWorkspaceByIdent(C);(S===null||r.has(S))&&delete p.releases[E]}Object.keys(p.releases).length>0?await ce.changeFilePromise(c,nl(new nl.PreserveOrdering(p))):await ce.unlinkPromise(c)}}}async function q1(t,{allowEmpty:e=!1}={}){let r=t.configuration;if(r.projectCwd===null)throw new nt(\"This command can only be run from within a Yarn project\");let s=await ka.fetchRoot(r.projectCwd),a=s!==null?await ka.fetchBase(s,{baseRefs:r.get(\"changesetBaseRefs\")}):null,n=s!==null?await ka.fetchChangedFiles(s,{base:a.hash,project:t}):[],c=r.get(\"deferredVersionFolder\"),f=n.filter(P=>J.contains(c,P)!==null);if(f.length>1)throw new nt(`Your current branch contains multiple versioning files; this isn't supported:\n- ${f.map(P=>fe.fromPortablePath(P)).join(`\n- `)}`);let p=new Set(je.mapAndFilter(n,P=>{let I=t.tryWorkspaceByFilePath(P);return I===null?je.mapAndFilter.skip:I}));if(f.length===0&&p.size===0&&!e)return null;let h=f.length===1?f[0]:J.join(c,`${Nn.makeHash(Math.random().toString()).slice(0,8)}.yml`),E=ce.existsSync(h)?await ce.readFilePromise(h,\"utf8\"):\"{}\",C=ls(E),S=new Map;for(let P of C.declined||[]){let I=G.parseIdent(P),R=t.getWorkspaceByIdent(I);S.set(R,\"decline\")}for(let[P,I]of Object.entries(C.releases||{})){let R=G.parseIdent(P),N=t.getWorkspaceByIdent(R);S.set(N,dy(I))}return{project:t,root:s,baseHash:a!==null?a.hash:null,baseTitle:a!==null?a.title:null,changedFiles:new Set(n),changedWorkspaces:p,releaseRoots:new Set([...p].filter(P=>P.manifest.version!==null)),releases:S,async saveAll(){let P={},I=[],R=[];for(let N of t.workspaces){if(N.manifest.version===null)continue;let U=G.stringifyIdent(N.anchoredLocator),W=S.get(N);W===\"decline\"?I.push(U):typeof W<\"u\"?P[U]=dy(W):p.has(N)&&R.push(U)}await ce.mkdirPromise(J.dirname(h),{recursive:!0}),await ce.changeFilePromise(h,nl(new nl.PreserveOrdering({releases:Object.keys(P).length>0?P:void 0,declined:I.length>0?I:void 0,undecided:R.length>0?R:void 0})))}}}function pPt(t){return UL(t).size>0||aP(t).length>0}function UL(t){let e=new Set;for(let r of t.changedWorkspaces)r.manifest.version!==null&&(t.releases.has(r)||e.add(r));return e}function aP(t,{include:e=new Set}={}){let r=[],s=new Map(je.mapAndFilter([...t.releases],([n,c])=>c===\"decline\"?je.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n])),a=new Map(je.mapAndFilter([...t.releases],([n,c])=>c!==\"decline\"?je.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n]));for(let n of t.project.workspaces)if(!(!e.has(n)&&(a.has(n.anchoredLocator.locatorHash)||s.has(n.anchoredLocator.locatorHash)))&&n.manifest.version!==null)for(let c of Ut.hardDependencies)for(let f of n.manifest.getForScope(c).values()){let p=t.project.tryWorkspaceByDescriptor(f);p!==null&&s.has(p.anchoredLocator.locatorHash)&&r.push([n,p])}return r}function fz(t,e){let r=kA.default.clean(e);for(let s of Object.values(G1))if(s!==\"undecided\"&&s!==\"decline\"&&kA.default.inc(t,s)===r)return s;return null}function sP(t,e){if(kA.default.valid(e))return e;if(t===null)throw new nt(`Cannot apply the release strategy \"${e}\" unless the workspace already has a valid version`);if(!kA.default.valid(t))throw new nt(`Cannot apply the release strategy \"${e}\" on a non-semver version (${t})`);let r=kA.default.inc(t,e);if(r===null)throw new nt(`Cannot apply the release strategy \"${e}\" on the specified version (${t})`);return r}function Az(t,e,{report:r,exact:s}){let a=new Map;for(let n of t.workspaces)for(let c of Ut.allDependencies)for(let f of n.manifest[c].values()){let p=t.tryWorkspaceByDescriptor(f);if(p===null||!e.has(p))continue;je.getArrayWithDefault(a,p).push([n,c,f.identHash])}for(let[n,c]of e){let f=n.manifest.version;n.manifest.version=c,kA.default.prerelease(c)===null?delete n.manifest.raw.stableVersion:n.manifest.raw.stableVersion||(n.manifest.raw.stableVersion=f);let p=n.manifest.name!==null?G.stringifyIdent(n.manifest.name):null;r.reportInfo(0,`${G.prettyLocator(t.configuration,n.anchoredLocator)}: Bumped to ${c}`),r.reportJson({cwd:fe.fromPortablePath(n.cwd),ident:p,oldVersion:f,newVersion:c});let h=a.get(n);if(!(typeof h>\"u\"))for(let[E,C,S]of h){let P=E.manifest[C].get(S);if(typeof P>\"u\")throw new Error(\"Assertion failed: The dependency should have existed\");let I=P.range,R=!1;if(I.startsWith(Ei.protocol)&&(I=I.slice(Ei.protocol.length),R=!0,I===n.relativeCwd))continue;let N=I.match(APt);if(!N){r.reportWarning(0,`Couldn't auto-upgrade range ${I} (in ${G.prettyLocator(t.configuration,E.anchoredLocator)})`);continue}let U=s?`${c}`:`${N[1]}${c}`;R&&(U=`${Ei.protocol}${U}`);let W=G.makeDescriptor(P,U);E.manifest[C].set(S,W)}}}var hPt=new Map([[\"%n\",{extract:t=>t.length>=1?[t[0],t.slice(1)]:null,generate:(t=0)=>`${t+1}`}]]);function pke(t,{current:e,prerelease:r}){let s=new kA.default.SemVer(e),a=s.prerelease.slice(),n=[];s.prerelease=[],s.format()!==t&&(a.length=0);let c=!0,f=r.split(/\\./g);for(let p of f){let h=hPt.get(p);if(typeof h>\"u\")n.push(p),a[0]===p?a.shift():c=!1;else{let E=c?h.extract(a):null;E!==null&&typeof E[0]==\"number\"?(n.push(h.generate(E[0])),a=E[1]):(n.push(h.generate()),c=!1)}}return s.prerelease&&(s.prerelease=[]),`${t}-${n.join(\".\")}`}var Y1=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean(\"--all\",!1,{description:\"Apply the deferred version changes on all workspaces\"});this.dryRun=ge.Boolean(\"--dry-run\",!1,{description:\"Print the versions without actually generating the package archive\"});this.prerelease=ge.String(\"--prerelease\",{description:\"Add a prerelease identifier to new versions\",tolerateBoolean:!0});this.exact=ge.Boolean(\"--exact\",!1,{description:\"Use the exact version of each package, removes any range. Useful for nightly releases where the range might match another version.\"});this.recursive=ge.Boolean(\"-R,--recursive\",{description:\"Release the transitive workspaces as well\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"version\",\"apply\"]]}static{this.usage=ot.Usage({category:\"Release-related commands\",description:\"apply all the deferred version bumps at once\",details:`\n      This command will apply the deferred version changes and remove their definitions from the repository.\n\n      Note that if \\`--prerelease\\` is set, the given prerelease identifier (by default \\`rc.%n\\`) will be used on all new versions and the version definitions will be kept as-is.\n\n      By default only the current workspace will be bumped, but you can configure this behavior by using one of:\n\n      - \\`--recursive\\` to also apply the version bump on its dependencies\n      - \\`--all\\` to apply the version bump on all packages in the repository\n\n      Note that this command will also update the \\`workspace:\\` references across all your local workspaces, thus ensuring that they keep referring to the same workspaces even after the version bump.\n    `,examples:[[\"Apply the version change to the local workspace\",\"yarn version apply\"],[\"Apply the version change to all the workspaces in the local workspace\",\"yarn version apply --all\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async f=>{let p=this.prerelease?typeof this.prerelease!=\"boolean\"?this.prerelease:\"rc.%n\":null,h=await oP(s,{prerelease:p}),E=new Map;if(this.all)E=h;else{let C=this.recursive?a.getRecursiveWorkspaceDependencies():[a];for(let S of C){let P=h.get(S);typeof P<\"u\"&&E.set(S,P)}}if(E.size===0){let C=h.size>0?\" Did you want to add --all?\":\"\";f.reportWarning(0,`The current workspace doesn't seem to require a version bump.${C}`);return}Az(s,E,{report:f,exact:this.exact}),this.dryRun||(p||(this.all?await cz(s):await uz(s,[...E.keys()])),f.reportSeparator())});return this.dryRun||c.hasErrors()?c.exitCode():await s.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};Ge();Dt();Yt();var _L=ut(Ai());var V1=class extends ft{constructor(){super(...arguments);this.interactive=ge.Boolean(\"-i,--interactive\",{description:\"Open an interactive interface used to set version bumps\"})}static{this.paths=[[\"version\",\"check\"]]}static{this.usage=ot.Usage({category:\"Release-related commands\",description:\"check that all the relevant packages have been bumped\",details:\"\\n      **Warning:** This command currently requires Git.\\n\\n      This command will check that all the packages covered by the files listed in argument have been properly bumped or declined to bump.\\n\\n      In the case of a bump, the check will also cover transitive packages - meaning that should `Foo` be bumped, a package `Bar` depending on `Foo` will require a decision as to whether `Bar` will need to be bumped. This check doesn't cross packages that have declined to bump.\\n\\n      In case no arguments are passed to the function, the list of modified files will be generated by comparing the HEAD against `master`.\\n    \",examples:[[\"Check whether the modified packages need a bump\",\"yarn version check\"]]})}async execute(){return this.interactive?await this.executeInteractive():await this.executeStandard()}async executeInteractive(){iw(this.context);let{Gem:r}=await Promise.resolve().then(()=>(WF(),LW)),{ScrollableItems:s}=await Promise.resolve().then(()=>(KF(),JF)),{FocusRequest:a}=await Promise.resolve().then(()=>(UW(),v2e)),{useListInput:n}=await Promise.resolve().then(()=>(VF(),S2e)),{renderForm:c}=await Promise.resolve().then(()=>($F(),ZF)),{Box:f,Text:p}=await Promise.resolve().then(()=>ut(Wc())),{default:h,useCallback:E,useState:C}=await Promise.resolve().then(()=>ut(hn())),S=await ze.find(this.context.cwd,this.context.plugins),{project:P,workspace:I}=await Tt.find(S,this.context.cwd);if(!I)throw new ar(P.cwd,this.context.cwd);await P.restoreInstallState();let R=await q1(P);if(R===null||R.releaseRoots.size===0)return 0;if(R.root===null)throw new nt(\"This command can only be run on Git repositories\");let N=()=>h.createElement(f,{flexDirection:\"row\",paddingBottom:1},h.createElement(f,{flexDirection:\"column\",width:60},h.createElement(f,null,h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<up>\"),\"/\",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<down>\"),\" to select workspaces.\")),h.createElement(f,null,h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<left>\"),\"/\",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<right>\"),\" to select release strategies.\"))),h.createElement(f,{flexDirection:\"column\"},h.createElement(f,{marginLeft:1},h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<enter>\"),\" to save.\")),h.createElement(f,{marginLeft:1},h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<ctrl+c>\"),\" to abort.\")))),U=({workspace:me,active:pe,decision:Be,setDecision:Ce})=>{let g=me.manifest.raw.stableVersion??me.manifest.version;if(g===null)throw new Error(`Assertion failed: The version should have been set (${G.prettyLocator(S,me.anchoredLocator)})`);if(_L.default.prerelease(g)!==null)throw new Error(`Assertion failed: Prerelease identifiers shouldn't be found (${g})`);let we=[\"undecided\",\"decline\",\"patch\",\"minor\",\"major\"];n(Be,we,{active:pe,minus:\"left\",plus:\"right\",set:Ce});let ye=Be===\"undecided\"?h.createElement(p,{color:\"yellow\"},g):Be===\"decline\"?h.createElement(p,{color:\"green\"},g):h.createElement(p,null,h.createElement(p,{color:\"magenta\"},g),\" \\u2192 \",h.createElement(p,{color:\"green\"},_L.default.valid(Be)?Be:_L.default.inc(g,Be)));return h.createElement(f,{flexDirection:\"column\"},h.createElement(f,null,h.createElement(p,null,G.prettyLocator(S,me.anchoredLocator),\" - \",ye)),h.createElement(f,null,we.map(Ae=>h.createElement(f,{key:Ae,paddingLeft:2},h.createElement(p,null,h.createElement(r,{active:Ae===Be}),\" \",Ae)))))},W=me=>{let pe=new Set(R.releaseRoots),Be=new Map([...me].filter(([Ce])=>pe.has(Ce)));for(;;){let Ce=aP({project:R.project,releases:Be}),g=!1;if(Ce.length>0){for(let[we]of Ce)if(!pe.has(we)){pe.add(we),g=!0;let ye=me.get(we);typeof ye<\"u\"&&Be.set(we,ye)}}if(!g)break}return{relevantWorkspaces:pe,relevantReleases:Be}},ee=()=>{let[me,pe]=C(()=>new Map(R.releases)),Be=E((Ce,g)=>{let we=new Map(me);g!==\"undecided\"?we.set(Ce,g):we.delete(Ce);let{relevantReleases:ye}=W(we);pe(ye)},[me,pe]);return[me,Be]},ie=({workspaces:me,releases:pe})=>{let Be=[];Be.push(`${me.size} total`);let Ce=0,g=0;for(let we of me){let ye=pe.get(we);typeof ye>\"u\"?g+=1:ye!==\"decline\"&&(Ce+=1)}return Be.push(`${Ce} release${Ce===1?\"\":\"s\"}`),Be.push(`${g} remaining`),h.createElement(p,{color:\"yellow\"},Be.join(\", \"))},le=await c(({useSubmit:me})=>{let[pe,Be]=ee();me(pe);let{relevantWorkspaces:Ce}=W(pe),g=new Set([...Ce].filter(se=>!R.releaseRoots.has(se))),[we,ye]=C(0),Ae=E(se=>{switch(se){case a.BEFORE:ye(we-1);break;case a.AFTER:ye(we+1);break}},[we,ye]);return h.createElement(f,{flexDirection:\"column\"},h.createElement(N,null),h.createElement(f,null,h.createElement(p,{wrap:\"wrap\"},\"The following files have been modified in your local checkout.\")),h.createElement(f,{flexDirection:\"column\",marginTop:1,paddingLeft:2},[...R.changedFiles].map(se=>h.createElement(f,{key:se},h.createElement(p,null,h.createElement(p,{color:\"grey\"},fe.fromPortablePath(R.root)),fe.sep,fe.relative(fe.fromPortablePath(R.root),fe.fromPortablePath(se)))))),R.releaseRoots.size>0&&h.createElement(h.Fragment,null,h.createElement(f,{marginTop:1},h.createElement(p,{wrap:\"wrap\"},\"Because of those files having been modified, the following workspaces may need to be released again (note that private workspaces are also shown here, because even though they won't be published, releasing them will allow us to flag their dependents for potential re-release):\")),g.size>3?h.createElement(f,{marginTop:1},h.createElement(ie,{workspaces:R.releaseRoots,releases:pe})):null,h.createElement(f,{marginTop:1,flexDirection:\"column\"},h.createElement(s,{active:we%2===0,radius:1,size:2,onFocusRequest:Ae},[...R.releaseRoots].map(se=>h.createElement(U,{key:se.cwd,workspace:se,decision:pe.get(se)||\"undecided\",setDecision:Z=>Be(se,Z)}))))),g.size>0?h.createElement(h.Fragment,null,h.createElement(f,{marginTop:1},h.createElement(p,{wrap:\"wrap\"},\"The following workspaces depend on other workspaces that have been marked for release, and thus may need to be released as well:\")),h.createElement(f,null,h.createElement(p,null,\"(Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<tab>\"),\" to move the focus between the workspace groups.)\")),g.size>5?h.createElement(f,{marginTop:1},h.createElement(ie,{workspaces:g,releases:pe})):null,h.createElement(f,{marginTop:1,flexDirection:\"column\"},h.createElement(s,{active:we%2===1,radius:2,size:2,onFocusRequest:Ae},[...g].map(se=>h.createElement(U,{key:se.cwd,workspace:se,decision:pe.get(se)||\"undecided\",setDecision:Z=>Be(se,Z)}))))):null)},{versionFile:R},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof le>\"u\")return 1;R.releases.clear();for(let[me,pe]of le)R.releases.set(me,pe);await R.saveAll()}async executeStandard(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);return await s.restoreInstallState(),(await Ot.start({configuration:r,stdout:this.context.stdout},async c=>{let f=await q1(s);if(f===null||f.releaseRoots.size===0)return;if(f.root===null)throw new nt(\"This command can only be run on Git repositories\");if(c.reportInfo(0,`Your PR was started right after ${he.pretty(r,f.baseHash.slice(0,7),\"yellow\")} ${he.pretty(r,f.baseTitle,\"magenta\")}`),f.changedFiles.size>0){c.reportInfo(0,\"You have changed the following files since then:\"),c.reportSeparator();for(let S of f.changedFiles)c.reportInfo(null,`${he.pretty(r,fe.fromPortablePath(f.root),\"gray\")}${fe.sep}${fe.relative(fe.fromPortablePath(f.root),fe.fromPortablePath(S))}`)}let p=!1,h=!1,E=UL(f);if(E.size>0){p||c.reportSeparator();for(let S of E)c.reportError(0,`${G.prettyLocator(r,S.anchoredLocator)} has been modified but doesn't have a release strategy attached`);p=!0}let C=aP(f);for(let[S,P]of C)h||c.reportSeparator(),c.reportError(0,`${G.prettyLocator(r,S.anchoredLocator)} doesn't have a release strategy attached, but depends on ${G.prettyWorkspace(r,P)} which is planned for release.`),h=!0;(p||h)&&(c.reportSeparator(),c.reportInfo(0,\"This command detected that at least some workspaces have received modifications without explicit instructions as to how they had to be released (if needed).\"),c.reportInfo(0,\"To correct these errors, run `yarn version check --interactive` then follow the instructions.\"))})).exitCode()}};Ge();Yt();var HL=ut(Ai());var J1=class extends ft{constructor(){super(...arguments);this.deferred=ge.Boolean(\"-d,--deferred\",{description:\"Prepare the version to be bumped during the next release cycle\"});this.immediate=ge.Boolean(\"-i,--immediate\",{description:\"Bump the version immediately\"});this.strategy=ge.String()}static{this.paths=[[\"version\"]]}static{this.usage=ot.Usage({category:\"Release-related commands\",description:\"apply a new version to the current package\",details:\"\\n      This command will bump the version number for the given package, following the specified strategy:\\n\\n      - If `major`, the first number from the semver range will be increased (`X.0.0`).\\n      - If `minor`, the second number from the semver range will be increased (`0.X.0`).\\n      - If `patch`, the third number from the semver range will be increased (`0.0.X`).\\n      - If prefixed by `pre` (`premajor`, ...), a `-0` suffix will be set (`0.0.0-0`).\\n      - If `prerelease`, the suffix will be increased (`0.0.0-X`); the third number from the semver range will also be increased if there was no suffix in the previous version.\\n      - If `decline`, the nonce will be increased for `yarn version check` to pass without version bump.\\n      - If a valid semver range, it will be used as new version.\\n      - If unspecified, Yarn will ask you for guidance.\\n\\n      For more information about the `--deferred` flag, consult our documentation (https://yarnpkg.com/features/release-workflow#deferred-versioning).\\n    \",examples:[[\"Immediately bump the version to the next major\",\"yarn version major\"],[\"Prepare the version to be bumped to the next major\",\"yarn version major --deferred\"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);let n=r.get(\"preferDeferredVersions\");this.deferred&&(n=!0),this.immediate&&(n=!1);let c=HL.default.valid(this.strategy),f=this.strategy===\"decline\",p;if(c)if(a.manifest.version!==null){let E=fz(a.manifest.version,this.strategy);E!==null?p=E:p=this.strategy}else p=this.strategy;else{let E=a.manifest.version;if(!f){if(E===null)throw new nt(\"Can't bump the version if there wasn't a version to begin with - use 0.0.0 as initial version then run the command again.\");if(typeof E!=\"string\"||!HL.default.valid(E))throw new nt(`Can't bump the version (${E}) if it's not valid semver`)}p=dy(this.strategy)}if(!n){let C=(await oP(s)).get(a);if(typeof C<\"u\"&&p!==\"decline\"){let S=sP(a.manifest.version,p);if(HL.default.lt(S,C))throw new nt(`Can't bump the version to one that would be lower than the current deferred one (${C})`)}}let h=await q1(s,{allowEmpty:!0});return h.releases.set(a,p),await h.saveAll(),n?0:await this.cli.run([\"version\",\"apply\"])}};var gPt={configuration:{deferredVersionFolder:{description:\"Folder where are stored the versioning files\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/versions\"},preferDeferredVersions:{description:\"If true, running `yarn version` will assume the `--deferred` flag unless `--immediate` is set\",type:\"BOOLEAN\",default:!1}},commands:[Y1,V1,J1]},dPt=gPt;var hz={};Vt(hz,{WorkspacesFocusCommand:()=>K1,WorkspacesForeachCommand:()=>X1,default:()=>EPt});Ge();Ge();Yt();var K1=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.production=ge.Boolean(\"--production\",!1,{description:\"Only install regular dependencies by omitting dev dependencies\"});this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Install the entire project\"});this.workspaces=ge.Rest()}static{this.paths=[[\"workspaces\",\"focus\"]]}static{this.usage=ot.Usage({category:\"Workspace-related commands\",description:\"install a single workspace and its dependencies\",details:\"\\n      This command will run an install as if the specified workspaces (and all other workspaces they depend on) were the only ones in the project. If no workspaces are explicitly listed, the active one will be assumed.\\n\\n      Note that this command is only very moderately useful when using zero-installs, since the cache will contain all the packages anyway - meaning that the only difference between a full install and a focused install would just be a few extra lines in the `.pnp.cjs` file, at the cost of introducing an extra complexity.\\n\\n      If the `-A,--all` flag is set, the entire project will be installed. Combine with `--production` to replicate the old `yarn install --production`.\\n    \"})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await Kr.find(r);await s.restoreInstallState({restoreResolutions:!1});let c;if(this.all)c=new Set(s.workspaces);else if(this.workspaces.length===0){if(!a)throw new ar(s.cwd,this.context.cwd);c=new Set([a])}else c=new Set(this.workspaces.map(f=>s.getWorkspaceByIdent(G.parseIdent(f))));for(let f of c)for(let p of this.production?[\"dependencies\"]:Ut.hardDependencies)for(let h of f.manifest.getForScope(p).values()){let E=s.tryWorkspaceByDescriptor(h);E!==null&&c.add(E)}for(let f of s.workspaces)c.has(f)?this.production&&f.manifest.devDependencies.clear():(f.manifest.installConfig=f.manifest.installConfig||{},f.manifest.installConfig.selfReferences=!1,f.manifest.dependencies.clear(),f.manifest.devDependencies.clear(),f.manifest.peerDependencies.clear(),f.manifest.scripts.clear());return await s.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n,persistProject:!1})}};Ge();Ge();Ge();Yt();var z1=ut(Go()),gke=ut(Ld());Ul();var X1=class extends ft{constructor(){super(...arguments);this.from=ge.Array(\"--from\",{description:\"An array of glob pattern idents or paths from which to base any recursion\"});this.all=ge.Boolean(\"-A,--all\",{description:\"Run the command on all workspaces of a project\"});this.recursive=ge.Boolean(\"-R,--recursive\",{description:\"Run the command on the current workspace and all of its recursive dependencies\"});this.worktree=ge.Boolean(\"-W,--worktree\",{description:\"Run the command on all workspaces of the current worktree\"});this.verbose=ge.Counter(\"-v,--verbose\",{description:\"Increase level of logging verbosity up to 2 times\"});this.parallel=ge.Boolean(\"-p,--parallel\",!1,{description:\"Run the commands in parallel\"});this.interlaced=ge.Boolean(\"-i,--interlaced\",!1,{description:\"Print the output of commands in real-time instead of buffering it\"});this.jobs=ge.String(\"-j,--jobs\",{description:\"The maximum number of parallel tasks that the execution will be limited to; or `unlimited`\",validator:g_([fo([\"unlimited\"]),$2(h_(),[m_(),d_(1)])])});this.topological=ge.Boolean(\"-t,--topological\",!1,{description:\"Run the command after all workspaces it depends on (regular) have finished\"});this.topologicalDev=ge.Boolean(\"--topological-dev\",!1,{description:\"Run the command after all workspaces it depends on (regular + dev) have finished\"});this.include=ge.Array(\"--include\",[],{description:\"An array of glob pattern idents or paths; only matching workspaces will be traversed\"});this.exclude=ge.Array(\"--exclude\",[],{description:\"An array of glob pattern idents or paths; matching workspaces won't be traversed\"});this.publicOnly=ge.Boolean(\"--no-private\",{description:\"Avoid running the command on private workspaces\"});this.since=ge.String(\"--since\",{description:\"Only include workspaces that have been changed since the specified ref.\",tolerateBoolean:!0});this.dryRun=ge.Boolean(\"-n,--dry-run\",{description:\"Print the commands that would be run, without actually running them\"});this.commandName=ge.String();this.args=ge.Proxy()}static{this.paths=[[\"workspaces\",\"foreach\"]]}static{this.usage=ot.Usage({category:\"Workspace-related commands\",description:\"run a command on all workspaces\",details:\"\\n      This command will run a given sub-command on current and all its descendant workspaces. Various flags can alter the exact behavior of the command:\\n\\n      - If `-p,--parallel` is set, the commands will be ran in parallel; they'll by default be limited to a number of parallel tasks roughly equal to half your core number, but that can be overridden via `-j,--jobs`, or disabled by setting `-j unlimited`.\\n\\n      - If `-p,--parallel` and `-i,--interlaced` are both set, Yarn will print the lines from the output as it receives them. If `-i,--interlaced` wasn't set, it would instead buffer the output from each process and print the resulting buffers only after their source processes have exited.\\n\\n      - If `-t,--topological` is set, Yarn will only run the command after all workspaces that it depends on through the `dependencies` field have successfully finished executing. If `--topological-dev` is set, both the `dependencies` and `devDependencies` fields will be considered when figuring out the wait points.\\n\\n      - If `-A,--all` is set, Yarn will run the command on all the workspaces of a project.\\n\\n      - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\\n\\n      - If `-W,--worktree` is set, Yarn will find workspaces to run the command on by looking at the current worktree.\\n\\n      - If `--from` is set, Yarn will use the packages matching the 'from' glob as the starting point for any recursive search.\\n\\n      - If `--since` is set, Yarn will only run the command on workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\\n\\n      - If `--dry-run` is set, Yarn will explain what it would do without actually doing anything.\\n\\n      - The command may apply to only some workspaces through the use of `--include` which acts as a whitelist. The `--exclude` flag will do the opposite and will be a list of packages that mustn't execute the script. Both flags accept glob patterns (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. You can also use the `--no-private` flag to avoid running the command in private workspaces.\\n\\n      The `-v,--verbose` flag can be passed up to twice: once to prefix output lines with the originating workspace's name, and again to include start/finish/timing log lines. Maximum verbosity is enabled by default in terminal environments.\\n\\n      If the command is `run` and the script being run does not exist the child workspace will be skipped without error.\\n    \",examples:[[\"Publish all packages\",\"yarn workspaces foreach -A --no-private npm publish --tolerate-republish\"],[\"Run the build script on all descendant packages\",\"yarn workspaces foreach -A run build\"],[\"Run the build script on current and all descendant packages in parallel, building package dependencies first\",\"yarn workspaces foreach -Apt run build\"],[\"Run the build script on several packages and all their dependencies, building dependencies first\",\"yarn workspaces foreach -Rpt --from '{workspace-a,workspace-b}' run build\"]]})}static{this.schema=[tB(\"all\",qf.Forbids,[\"from\",\"recursive\",\"since\",\"worktree\"],{missingIf:\"undefined\"}),y_([\"all\",\"recursive\",\"since\",\"worktree\"],{missingIf:\"undefined\"})]}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!this.all&&!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let n=this.cli.process([this.commandName,...this.args]),c=n.path.length===1&&n.path[0]===\"run\"&&typeof n.scriptName<\"u\"?n.scriptName:null;if(n.path.length===0)throw new nt(\"Invalid subcommand name for iteration - use the 'run' keyword if you wish to execute a script\");let f=Ce=>{this.dryRun&&this.context.stdout.write(`${Ce}\n`)},p=()=>{let Ce=this.from.map(g=>z1.default.matcher(g));return s.workspaces.filter(g=>{let we=G.stringifyIdent(g.anchoredLocator),ye=g.relativeCwd;return Ce.some(Ae=>Ae(we)||Ae(ye))})},h=[];if(this.since?(f(\"Option --since is set; selecting the changed workspaces as root for workspace selection\"),h=Array.from(await ka.fetchChangedWorkspaces({ref:this.since,project:s}))):this.from?(f(\"Option --from is set; selecting the specified workspaces\"),h=[...p()]):this.worktree?(f(\"Option --worktree is set; selecting the current workspace\"),h=[a]):this.recursive?(f(\"Option --recursive is set; selecting the current workspace\"),h=[a]):this.all&&(f(\"Option --all is set; selecting all workspaces\"),h=[...s.workspaces]),this.dryRun&&!this.all){for(let Ce of h)f(`\n- ${Ce.relativeCwd}\n  ${G.prettyLocator(r,Ce.anchoredLocator)}`);h.length>0&&f(\"\")}let E;if(this.recursive?this.since?(f(\"Option --recursive --since is set; recursively selecting all dependent workspaces\"),E=new Set(h.map(Ce=>[...Ce.getRecursiveWorkspaceDependents()]).flat())):(f(\"Option --recursive is set; recursively selecting all transitive dependencies\"),E=new Set(h.map(Ce=>[...Ce.getRecursiveWorkspaceDependencies()]).flat())):this.worktree?(f(\"Option --worktree is set; recursively selecting all nested workspaces\"),E=new Set(h.map(Ce=>[...Ce.getRecursiveWorkspaceChildren()]).flat())):E=null,E!==null&&(h=[...new Set([...h,...E])],this.dryRun))for(let Ce of E)f(`\n- ${Ce.relativeCwd}\n  ${G.prettyLocator(r,Ce.anchoredLocator)}`);let C=[],S=!1;if(c?.includes(\":\")){for(let Ce of s.workspaces)if(Ce.manifest.scripts.has(c)&&(S=!S,S===!1))break}for(let Ce of h){if(c&&!Ce.manifest.scripts.has(c)&&!S&&!(await In.getWorkspaceAccessibleBinaries(Ce)).has(c)){f(`Excluding ${Ce.relativeCwd} because it doesn't have a \"${c}\" script`);continue}if(!(c===r.env.npm_lifecycle_event&&Ce.cwd===a.cwd)){if(this.include.length>0&&!z1.default.isMatch(G.stringifyIdent(Ce.anchoredLocator),this.include)&&!z1.default.isMatch(Ce.relativeCwd,this.include)){f(`Excluding ${Ce.relativeCwd} because it doesn't match the --include filter`);continue}if(this.exclude.length>0&&(z1.default.isMatch(G.stringifyIdent(Ce.anchoredLocator),this.exclude)||z1.default.isMatch(Ce.relativeCwd,this.exclude))){f(`Excluding ${Ce.relativeCwd} because it matches the --exclude filter`);continue}if(this.publicOnly&&Ce.manifest.private===!0){f(`Excluding ${Ce.relativeCwd} because it's a private workspace and --no-private was set`);continue}C.push(Ce)}}if(this.dryRun)return 0;let P=this.verbose??(this.context.stdout.isTTY?1/0:0),I=P>0,R=P>1,N=this.parallel?this.jobs===\"unlimited\"?1/0:Number(this.jobs)||Math.ceil(Ui.availableParallelism()/2):1,U=N===1?!1:this.parallel,W=U?this.interlaced:!0,ee=(0,gke.default)(N),ie=new Map,ue=new Set,le=0,me=null,pe=!1,Be=await Ot.start({configuration:r,stdout:this.context.stdout,includePrefix:!1},async Ce=>{let g=async(we,{commandIndex:ye})=>{if(pe)return-1;!U&&R&&ye>1&&Ce.reportSeparator();let Ae=mPt(we,{configuration:r,label:I,commandIndex:ye}),[se,Z]=hke(Ce,{prefix:Ae,interlaced:W}),[De,Re]=hke(Ce,{prefix:Ae,interlaced:W});try{R&&Ce.reportInfo(null,`${Ae?`${Ae} `:\"\"}Process started`);let mt=Date.now(),j=await this.cli.run([this.commandName,...this.args],{cwd:we.cwd,stdout:se,stderr:De})||0;se.end(),De.end(),await Z,await Re;let rt=Date.now();if(R){let Fe=r.get(\"enableTimers\")?`, completed in ${he.pretty(r,rt-mt,he.Type.DURATION)}`:\"\";Ce.reportInfo(null,`${Ae?`${Ae} `:\"\"}Process exited (exit code ${j})${Fe}`)}return j===130&&(pe=!0,me=j),j}catch(mt){throw se.end(),De.end(),await Z,await Re,mt}};for(let we of C)ie.set(we.anchoredLocator.locatorHash,we);for(;ie.size>0&&!Ce.hasErrors();){let we=[];for(let[Z,De]of ie){if(ue.has(De.anchoredDescriptor.descriptorHash))continue;let Re=!0;if(this.topological||this.topologicalDev){let mt=this.topologicalDev?new Map([...De.manifest.dependencies,...De.manifest.devDependencies]):De.manifest.dependencies;for(let j of mt.values()){let rt=s.tryWorkspaceByDescriptor(j);if(Re=rt===null||!ie.has(rt.anchoredLocator.locatorHash),!Re)break}}if(Re&&(ue.add(De.anchoredDescriptor.descriptorHash),we.push(ee(async()=>{let mt=await g(De,{commandIndex:++le});return ie.delete(Z),ue.delete(De.anchoredDescriptor.descriptorHash),{workspace:De,exitCode:mt}})),!U))break}if(we.length===0){let Z=Array.from(ie.values()).map(De=>G.prettyLocator(r,De.anchoredLocator)).join(\", \");Ce.reportError(3,`Dependency cycle detected (${Z})`);return}let ye=await Promise.all(we);ye.forEach(({workspace:Z,exitCode:De})=>{De!==0&&Ce.reportError(0,`The command failed in workspace ${G.prettyLocator(r,Z.anchoredLocator)} with exit code ${De}`)});let se=ye.map(Z=>Z.exitCode).find(Z=>Z!==0);(this.topological||this.topologicalDev)&&typeof se<\"u\"&&Ce.reportError(0,\"The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph\")}});return me!==null?me:Be.exitCode()}};function hke(t,{prefix:e,interlaced:r}){let s=t.createStreamReporter(e),a=new je.DefaultStream;a.pipe(s,{end:!1}),a.on(\"finish\",()=>{s.end()});let n=new Promise(f=>{s.on(\"finish\",()=>{f(a.active)})});if(r)return[a,n];let c=new je.BufferStream;return c.pipe(a,{end:!1}),c.on(\"finish\",()=>{a.end()}),[c,n]}function mPt(t,{configuration:e,commandIndex:r,label:s}){if(!s)return null;let n=`[${G.stringifyIdent(t.anchoredLocator)}]:`,c=[\"#2E86AB\",\"#A23B72\",\"#F18F01\",\"#C73E1D\",\"#CCE2A3\"],f=c[r%c.length];return he.pretty(e,n,f)}var yPt={commands:[K1,X1]},EPt=yPt;var tC=()=>({modules:new Map([[\"@yarnpkg/cli\",Gv],[\"@yarnpkg/core\",jv],[\"@yarnpkg/fslib\",_2],[\"@yarnpkg/libzip\",fv],[\"@yarnpkg/parsers\",J2],[\"@yarnpkg/shell\",mv],[\"clipanion\",oB],[\"semver\",IPt],[\"typanion\",Ea],[\"@yarnpkg/plugin-essentials\",hq],[\"@yarnpkg/plugin-catalog\",yq],[\"@yarnpkg/plugin-compat\",Bq],[\"@yarnpkg/plugin-constraints\",_q],[\"@yarnpkg/plugin-dlx\",Hq],[\"@yarnpkg/plugin-exec\",qq],[\"@yarnpkg/plugin-file\",Yq],[\"@yarnpkg/plugin-git\",pq],[\"@yarnpkg/plugin-github\",Kq],[\"@yarnpkg/plugin-http\",zq],[\"@yarnpkg/plugin-init\",Xq],[\"@yarnpkg/plugin-interactive-tools\",JW],[\"@yarnpkg/plugin-jsr\",zW],[\"@yarnpkg/plugin-link\",XW],[\"@yarnpkg/plugin-nm\",FY],[\"@yarnpkg/plugin-npm\",FK],[\"@yarnpkg/plugin-npm-cli\",qK],[\"@yarnpkg/plugin-pack\",bV],[\"@yarnpkg/plugin-patch\",XK],[\"@yarnpkg/plugin-pnp\",wY],[\"@yarnpkg/plugin-pnpm\",ez],[\"@yarnpkg/plugin-stage\",az],[\"@yarnpkg/plugin-typescript\",lz],[\"@yarnpkg/plugin-version\",pz],[\"@yarnpkg/plugin-workspace-tools\",hz]]),plugins:new Set([\"@yarnpkg/plugin-essentials\",\"@yarnpkg/plugin-catalog\",\"@yarnpkg/plugin-compat\",\"@yarnpkg/plugin-constraints\",\"@yarnpkg/plugin-dlx\",\"@yarnpkg/plugin-exec\",\"@yarnpkg/plugin-file\",\"@yarnpkg/plugin-git\",\"@yarnpkg/plugin-github\",\"@yarnpkg/plugin-http\",\"@yarnpkg/plugin-init\",\"@yarnpkg/plugin-interactive-tools\",\"@yarnpkg/plugin-jsr\",\"@yarnpkg/plugin-link\",\"@yarnpkg/plugin-nm\",\"@yarnpkg/plugin-npm\",\"@yarnpkg/plugin-npm-cli\",\"@yarnpkg/plugin-pack\",\"@yarnpkg/plugin-patch\",\"@yarnpkg/plugin-pnp\",\"@yarnpkg/plugin-pnpm\",\"@yarnpkg/plugin-stage\",\"@yarnpkg/plugin-typescript\",\"@yarnpkg/plugin-version\",\"@yarnpkg/plugin-workspace-tools\"])});function yke({cwd:t,pluginConfiguration:e}){let r=new Ca({binaryLabel:\"Yarn Package Manager\",binaryName:\"yarn\",binaryVersion:fn??\"<unknown>\"});return Object.assign(r,{defaultContext:{...Ca.defaultContext,cwd:t,plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr}})}function CPt(t){if(je.parseOptionalBoolean(process.env.YARN_IGNORE_NODE))return!0;let r=process.versions.node,s=\">=18.12.0\";if(Fr.satisfiesWithPrereleases(r,s))return!0;let a=new nt(`This tool requires a Node version compatible with ${s} (got ${r}). Upgrade Node, or set \\`YARN_IGNORE_NODE=1\\` in your environment.`);return Ca.defaultContext.stdout.write(t.error(a)),!1}async function Eke({selfPath:t,pluginConfiguration:e}){return await ze.find(fe.toPortablePath(process.cwd()),e,{strict:!1,usePathCheck:t})}function wPt(t,e,{yarnPath:r}){if(!ce.existsSync(r))return t.error(new Error(`The \"yarn-path\" option has been set, but the specified location doesn't exist (${r}).`)),1;process.on(\"SIGINT\",()=>{});let s={stdio:\"inherit\",env:{...process.env,YARN_IGNORE_PATH:\"1\"}};try{(0,dke.execFileSync)(process.execPath,[fe.fromPortablePath(r),...e],s)}catch(a){return a.status??1}return 0}function BPt(t,e){let r=null,s=e;return e.length>=2&&e[0]===\"--cwd\"?(r=fe.toPortablePath(e[1]),s=e.slice(2)):e.length>=1&&e[0].startsWith(\"--cwd=\")?(r=fe.toPortablePath(e[0].slice(6)),s=e.slice(1)):e[0]===\"add\"&&e[e.length-2]===\"--cwd\"&&(r=fe.toPortablePath(e[e.length-1]),s=e.slice(0,e.length-2)),t.defaultContext.cwd=r!==null?J.resolve(r):J.cwd(),s}function vPt(t,{configuration:e}){if(!e.get(\"enableTelemetry\")||mke.isCI||!process.stdout.isTTY)return;ze.telemetry=new ZI(e,\"puba9cdc10ec5790a2cf4969dd413a47270\");let s=/^@yarnpkg\\/plugin-(.*)$/;for(let a of e.plugins.keys())$I.has(a.match(s)?.[1]??\"\")&&ze.telemetry?.reportPluginName(a);t.binaryVersion&&ze.telemetry.reportVersion(t.binaryVersion)}function Ike(t,{configuration:e}){for(let r of e.plugins.values())for(let s of r.commands||[])t.register(s)}async function SPt(t,e,{selfPath:r,pluginConfiguration:s}){if(!CPt(t))return 1;let a=await Eke({selfPath:r,pluginConfiguration:s}),n=a.get(\"yarnPath\"),c=a.get(\"ignorePath\");if(n&&!c)return wPt(t,e,{yarnPath:n});delete process.env.YARN_IGNORE_PATH;let f=BPt(t,e);vPt(t,{configuration:a}),Ike(t,{configuration:a});let p=t.process(f,t.defaultContext);return p.help||ze.telemetry?.reportCommandName(p.path.join(\" \")),await t.run(p,t.defaultContext)}async function bde({cwd:t=J.cwd(),pluginConfiguration:e=tC()}={}){let r=yke({cwd:t,pluginConfiguration:e}),s=await Eke({pluginConfiguration:e,selfPath:null});return Ike(r,{configuration:s}),r}async function VR(t,{cwd:e=J.cwd(),selfPath:r,pluginConfiguration:s}){let a=yke({cwd:e,pluginConfiguration:s});function n(){Ca.defaultContext.stdout.write(`ERROR: Yarn is terminating due to an unexpected empty event loop.\nPlease report this issue at https://github.com/yarnpkg/berry/issues.`)}process.once(\"beforeExit\",n);try{process.exitCode=42,process.exitCode=await SPt(a,t,{selfPath:r,pluginConfiguration:s})}catch(c){Ca.defaultContext.stdout.write(a.error(c)),process.exitCode=1}finally{process.off(\"beforeExit\",n),await ce.rmtempPromise()}}VR(process.argv.slice(2),{cwd:J.cwd(),selfPath:fe.toPortablePath(fe.resolve(process.argv[1])),pluginConfiguration:tC()});})();\n/**\n  @license\n  Copyright (c) 2015, Rebecca Turner\n\n  Permission to use, copy, modify, and/or distribute this software for any\n  purpose with or without fee is hereby granted, provided that the above\n  copyright notice and this permission notice appear in all copies.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n  REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n  FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n  INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n  PERFORMANCE OF THIS SOFTWARE.\n */\n/**\n  @license\n  Copyright Node.js contributors. All rights reserved.\n\n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to\n  deal in the Software without restriction, including without limitation the\n  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n  sell copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n  IN THE SOFTWARE.\n*/\n/**\n  @license\n  The MIT License (MIT)\n\n  Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)\n\n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n*/\n/**\n  @license\n  Copyright Joyent, Inc. and other Node contributors.\n\n  Permission is hereby granted, free of charge, to any person obtaining a\n  copy of this software and associated documentation files (the\n  \"Software\"), to deal in the Software without restriction, including\n  without limitation the rights to use, copy, modify, merge, publish,\n  distribute, sublicense, and/or sell copies of the Software, and to permit\n  persons to whom the Software is furnished to do so, subject to the\n  following conditions:\n\n  The above copyright notice and this permission notice shall be included\n  in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n  NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n  DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n  USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n/*! Bundled license information:\n\nis-number/index.js:\n  (*!\n   * is-number <https://github.com/jonschlinkert/is-number>\n   *\n   * Copyright (c) 2014-present, Jon Schlinkert.\n   * Released under the MIT License.\n   *)\n\nto-regex-range/index.js:\n  (*!\n   * to-regex-range <https://github.com/micromatch/to-regex-range>\n   *\n   * Copyright (c) 2015-present, Jon Schlinkert.\n   * Released under the MIT License.\n   *)\n\nfill-range/index.js:\n  (*!\n   * fill-range <https://github.com/jonschlinkert/fill-range>\n   *\n   * Copyright (c) 2014-present, Jon Schlinkert.\n   * Licensed under the MIT License.\n   *)\n\nis-extglob/index.js:\n  (*!\n   * is-extglob <https://github.com/jonschlinkert/is-extglob>\n   *\n   * Copyright (c) 2014-2016, Jon Schlinkert.\n   * Licensed under the MIT License.\n   *)\n\nis-glob/index.js:\n  (*!\n   * is-glob <https://github.com/jonschlinkert/is-glob>\n   *\n   * Copyright (c) 2014-2017, Jon Schlinkert.\n   * Released under the MIT License.\n   *)\n\nqueue-microtask/index.js:\n  (*! queue-microtask. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> *)\n\nrun-parallel/index.js:\n  (*! run-parallel. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> *)\n\ngit-url-parse/lib/index.js:\n  (*!\n   * buildToken\n   * Builds OAuth token prefix (helper function)\n   *\n   * @name buildToken\n   * @function\n   * @param {GitUrl} obj The parsed Git url object.\n   * @return {String} token prefix\n   *)\n\nobject-assign/index.js:\n  (*\n  object-assign\n  (c) Sindre Sorhus\n  @license MIT\n  *)\n\nreact/cjs/react.production.min.js:\n  (** @license React v17.0.2\n   * react.production.min.js\n   *\n   * Copyright (c) Facebook, Inc. and its affiliates.\n   *\n   * This source code is licensed under the MIT license found in the\n   * LICENSE file in the root directory of this source tree.\n   *)\n\nscheduler/cjs/scheduler.production.min.js:\n  (** @license React v0.20.2\n   * scheduler.production.min.js\n   *\n   * Copyright (c) Facebook, Inc. and its affiliates.\n   *\n   * This source code is licensed under the MIT license found in the\n   * LICENSE file in the root directory of this source tree.\n   *)\n\nreact-reconciler/cjs/react-reconciler.production.min.js:\n  (** @license React v0.26.2\n   * react-reconciler.production.min.js\n   *\n   * Copyright (c) Facebook, Inc. and its affiliates.\n   *\n   * This source code is licensed under the MIT license found in the\n   * LICENSE file in the root directory of this source tree.\n   *)\n\nis-windows/index.js:\n  (*!\n   * is-windows <https://github.com/jonschlinkert/is-windows>\n   *\n   * Copyright © 2015-2018, Jon Schlinkert.\n   * Released under the MIT License.\n   *)\n*/\n"
  },
  {
    "path": "typescript-dto/.yarnrc.yml",
    "content": "yarnPath: .yarn/releases/yarn-4.12.0.cjs\n"
  },
  {
    "path": "typescript-dto/Dockerfile",
    "content": "# Copyright (c) 2018 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n\n###\n# Builder Image\n#\n#FROM maven:3.3-jdk-8 as builder\n\n#ADD ./dto-pom.xml /generator/pom.xml\n\n#RUN cd /generator && mvn -U -DskipTests=true -Dfindbugs.skip=true -Dskip-validate-sources install\n\n###\n# Publish image\n#\nFROM node:6.11.2\n\nRUN npm i -g yarn@1.9.4\n\nADD package.json README.md /che/\n\nCOPY ./index.d.ts /che/index.d.ts\n\nADD publish.sh publish.sh\n\nARG NPM_AUTH_TOKEN\n\nARG CHE_VERSION\n\nRUN cd /che && ../publish.sh ${CHE_VERSION}\n"
  },
  {
    "path": "typescript-dto/README.md",
    "content": "# This is Eclipse Che API generated from Java DTO interfaces\n"
  },
  {
    "path": "typescript-dto/build.sh",
    "content": "#!/usr/bin/env sh\n#\n# Copyright (c) 2019 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# See: https://sipb.mit.edu/doc/safe-shell/\n\nset -e\nset -u\n\nrm -f ./index.d.ts\n\nset +e\nBUILDER=$(command -v podman)\nif [ ! -x \"$BUILDER\" ]; then BUILDER=$(command -v docker); fi\n$BUILDER run -i --rm -v \"$HOME/.m2:/root/.m2\" \\\n                   -v \"$(pwd)/dto-pom.xml:/usr/src/mymaven/pom.xml\" \\\n                   -w /usr/src/mymaven docker.io/maven:3.8-jdk-11 \\\n                    /bin/bash -c \"mvn -q -U -DskipTests=true -Dfindbugs.skip=true -Dskip-validate-sources install \\\n                    && cat target/dts-dto-typescript.d.ts\" >> index.d.ts\n\nset -\n# validate that index.d.ts has kind of valid output\nif ! grep \"export namespace\" index.d.ts; then\n  echo \"Invalid output generated for index.d.ts, printing its content:\"\n  cat index.d.ts\n  exit 1\nfi\n\nCHE_VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args=\"\\${project.version}\" --non-recursive exec:exec -f ../pom.xml)\n\n$BUILDER build -t eclipse-che-ts-api --build-arg CHE_VERSION=\"${CHE_VERSION}\" --build-arg NPM_AUTH_TOKEN=\"${CHE_NPM_AUTH_TOKEN}\" .\n"
  },
  {
    "path": "typescript-dto/dto-pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2019 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc.- initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>maven-parent-pom</artifactId>\n        <groupId>org.eclipse.che.parent</groupId>\n        <version>7.15.0</version>\n    </parent>\n    <artifactId>dts-dto-typescript</artifactId>\n    <packaging>pom</packaging>\n    <name>Che TypeScript DTO</name>\n    <properties>\n        <che.version>7.118.0-SNAPSHOT</che.version>\n    </properties>\n    <repositories>\n        <repository>\n            <snapshots>\n                <enabled>true</enabled>\n                <checksumPolicy>fail</checksumPolicy>\n            </snapshots>\n            <id>ossrh</id>\n            <name>central public snapshots</name>\n            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>\n        </repository>\n    </repositories>\n    <pluginRepositories>\n        <pluginRepository>\n            <id>ossrh</id>\n            <name>central public snapshots</name>\n            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>\n        </pluginRepository>\n    </pluginRepositories>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-typescript-dto-maven-plugin</artifactId>\n                <version>${che.version}</version>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>build</goal>\n                        </goals>\n                        <configuration>\n                            <dts>true</dts>\n                        </configuration>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-factory-shared</artifactId>\n                        <version>${che.version}</version>\n                    </dependency>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-ssh-shared</artifactId>\n                        <version>${che.version}</version>\n                    </dependency>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-system-shared</artifactId>\n                        <version>${che.version}</version>\n                    </dependency>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-user-shared</artifactId>\n                        <version>${che.version}</version>\n                    </dependency>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-workspace-shared</artifactId>\n                        <version>${che.version}</version>\n                    </dependency>\n                </dependencies>\n                <configuration>\n                    <inherited>false</inherited>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "typescript-dto/package.json",
    "content": "{\n  \"name\": \"@eclipse-che/api\",\n  \"version\": \"7.19.0-SNAPSHOT\",\n  \"description\": \"Eclipse Che DTO API\",\n  \"types\": \"index.d.ts\",\n  \"license\": \"EPL-2.0\",\n  \"files\": [\n    \"index.d.ts\"\n  ],\n  \"packageManager\": \"yarn@4.12.0\"\n}\n"
  },
  {
    "path": "typescript-dto/publish.sh",
    "content": "#!/usr/bin/env sh\n#\n# Copyright (c) 2019 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# See: https://sipb.mit.edu/doc/safe-shell/\n\nset -e\nset -u\n\n#get the latest version of @eclipse-che/api\napi_version=$(yarn -s info @eclipse-che/api version)\n\n#publish only if latest version doesn't match current version\nif [ \"$api_version\" != \"$1\" ];\nthen\n    yarn publish  --registry=https://registry.npmjs.org/ --no-git-tag-version --new-version \"$1\"\nfi\n"
  },
  {
    "path": "wsmaster/che-core-api-account/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-account</artifactId>\n    <name>Che Core :: API :: Account</name>\n    <dependencies>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-persist</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>jakarta.persistence</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-sql-schema</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.jpa</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.flywaydb</groupId>\n            <artifactId>flyway-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <!-- Create the test jar -->\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>test-jar</goal>\n                        </goals>\n                        <configuration>\n                            <includes>\n                                <include>**/spi/tck/*.*</include>\n                            </includes>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-account/src/main/java/org/eclipse/che/account/api/AccountManager.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.account.api;\n\nimport static java.util.Objects.requireNonNull;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.account.shared.model.Account;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.notification.EventService;\n\n/**\n * Facade for Account related operations.\n *\n * @author Sergii Leschenko\n */\n@Deprecated\n@Singleton\npublic class AccountManager {\n  private final EventService eventService;\n\n  @Inject\n  public AccountManager(EventService eventService) {\n    this.eventService = eventService;\n  }\n\n  /**\n   * Account information is no longer persisted in the database\n   *\n   * @param account account to create\n   * @throws NullPointerException when {@code account} is null\n   * @throws ConflictException when account with such name or id already exists\n   * @throws ServerException when any other error occurs during account creating\n   */\n  public void create(Account account) throws ConflictException, ServerException {\n    throw new ServerException(\"Account creation is obsolete and not expected to be invoked\");\n  }\n\n  /**\n   * Updates account by replacing an existing account entity with a new one.\n   *\n   * @param account account to update\n   * @throws NullPointerException when {@code account} is null\n   * @throws NotFoundException when account with id {@code account.getId()} is not found\n   * @throws ConflictException when account's new name is not unique\n   * @throws ServerException when any other error occurs\n   */\n  public void update(Account account) throws NotFoundException, ConflictException, ServerException {\n    requireNonNull(account, \"Required non-null account\");\n  }\n\n  /**\n   * Gets account by identifier.\n   *\n   * @param id id of account to fetch\n   * @return account instance with given id\n   * @throws NullPointerException when {@code id} is null\n   * @throws NotFoundException when account with given {@code id} was not found\n   * @throws ServerException when any other error occurs during account fetching\n   */\n  public Account getById(String id) throws NotFoundException, ServerException {\n    requireNonNull(id, \"Required non-null account id\");\n    return null;\n  }\n\n  /**\n   * Gets account by name.\n   *\n   * @param name name of account to fetch\n   * @return account instance with given name\n   * @throws NullPointerException when {@code name} is null\n   * @throws NotFoundException when account with given {@code name} was not found\n   * @throws ServerException when any other error occurs during account fetching\n   */\n  public Account getByName(String name) throws NotFoundException, ServerException {\n    requireNonNull(name, \"Required non-null account name\");\n    return null;\n  }\n\n  /**\n   * Removes account by specified {@code id}\n   *\n   * @param id account identifier\n   * @throws NullPointerException when {@code id} is null\n   * @throws ServerException when any other error occurs\n   */\n  public void remove(String id) throws ServerException {\n    requireNonNull(id, \"Required non-null account id\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-account/src/main/java/org/eclipse/che/account/shared/model/Account.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.account.shared.model;\n\n/**\n * @author Sergii Leschenko\n */\npublic interface Account {\n  /** Returns account id */\n  String getId();\n\n  /** Returns name of account */\n  String getName();\n\n  /** Returns type of account */\n  String getType();\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-account/src/main/java/org/eclipse/che/account/spi/AccountDao.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.account.spi;\n\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\n\n/**\n * Defines data access object for {@link AccountImpl}\n *\n * @author Sergii Leschenko\n */\npublic interface AccountDao {\n  /**\n   * Creates account.\n   *\n   * @param account account to create\n   * @throws NullPointerException when {@code account} is null\n   * @throws ConflictException when account with such name or id already exists\n   * @throws ServerException when any other error occurs during account creating\n   */\n  void create(AccountImpl account) throws ConflictException, ServerException;\n\n  /**\n   * Updates account by replacing an existing entity with a new one.\n   *\n   * @param account account to update\n   * @throws NullPointerException when {@code account} is null\n   * @throws NotFoundException when account with id {@code account.getId()} doesn't exist\n   * @throws ConflictException when name updated with a value which is not unique\n   * @throws ServerException when any other error occurs\n   */\n  void update(AccountImpl account) throws NotFoundException, ConflictException, ServerException;\n\n  /**\n   * Gets account by identifier.\n   *\n   * @param id account identifier\n   * @return account instance with given id\n   * @throws NullPointerException when {@code id} is null\n   * @throws NotFoundException when account with given {@code id} was not found\n   * @throws ServerException when any other error occurs during account fetching\n   */\n  AccountImpl getById(String id) throws NotFoundException, ServerException;\n\n  /**\n   * Gets account by name.\n   *\n   * @param name account name\n   * @return account instance with given name\n   * @throws NullPointerException when {@code name} is null\n   * @throws NotFoundException when account with given {@code name} was not found\n   * @throws ServerException when any other error occurs during account fetching\n   */\n  AccountImpl getByName(String name) throws ServerException, NotFoundException;\n\n  /**\n   * Removes account by specified {@code id}\n   *\n   * @param id account identifier\n   * @throws NullPointerException when {@code id} is null\n   * @throws ServerException when any other error occurs\n   */\n  void remove(String id) throws ServerException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-account/src/main/java/org/eclipse/che/account/spi/AccountImpl.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.account.spi;\n\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Id;\nimport javax.persistence.NamedQueries;\nimport javax.persistence.NamedQuery;\nimport javax.persistence.Table;\nimport org.eclipse.che.account.shared.model.Account;\n\n/**\n * Data object for {@link Account}.\n *\n * @author Sergii Leschenko\n * @author Yevhenii Voevodin\n */\n@Entity(name = \"Account\")\n@NamedQueries({\n  @NamedQuery(\n      name = \"Account.getByName\",\n      query = \"SELECT a \" + \"FROM Account a \" + \"WHERE a.name = :name\")\n})\n@Table(name = \"account\")\npublic class AccountImpl implements Account {\n\n  @Id\n  @Column(name = \"id\")\n  protected String id;\n\n  @Column(nullable = false, name = \"name\")\n  protected String name;\n\n  @Column(name = \"type\")\n  private String type;\n\n  public AccountImpl() {}\n\n  public AccountImpl(String id, String name, String type) {\n    this.id = id;\n    this.name = name;\n    this.type = type;\n  }\n\n  public AccountImpl(Account account) {\n    this(account.getId(), account.getName(), account.getType());\n  }\n\n  @Override\n  public String getId() {\n    return id;\n  }\n\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  @Override\n  public String getType() {\n    return type;\n  }\n\n  public void setType(String type) {\n    this.type = type;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) return true;\n    if (!(o instanceof AccountImpl)) return false;\n    AccountImpl account = (AccountImpl) o;\n    return Objects.equals(id, account.id) && Objects.equals(name, account.name);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hash(id);\n    hash = 31 * hash + Objects.hash(name);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"AccountImpl{\" + \"id='\" + id + '\\'' + \", name='\" + name + '\\'' + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-account/src/main/java/org/eclipse/che/account/spi/AccountValidator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.account.spi;\n\nimport java.util.regex.Pattern;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.account.api.AccountManager;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Utils for account validation.\n *\n * @author Sergii Leschenko\n */\n// TODO extract normalization code from the validator as it is not related to the validation at all\n@Singleton\npublic class AccountValidator {\n  private static final Logger LOG = LoggerFactory.getLogger(AccountValidator.class);\n\n  private static final Pattern ILLEGAL_ACCOUNT_NAME_CHARACTERS =\n      Pattern.compile(\n          \"[^a-zA-Z0-9-]\"\n              + // all character except allowed\n              \"|(?<=-)-+\"\n              + // non single hyphens\n              \"|^-+\"\n              + // hyphens at the beginning\n              \"|-+$\"); // hyphens at the end\n  private static final Pattern VALID_ACCOUNT_NAME =\n      Pattern.compile(\"^(?:[a-zA-Z0-9]-?)*[a-zA-Z0-9]+\");\n\n  private final AccountManager accountManager;\n\n  @Inject\n  public AccountValidator(AccountManager accountManager) {\n    this.accountManager = accountManager;\n  }\n\n  /**\n   * Validate name, if it doesn't contain illegal characters\n   *\n   * @param name account name\n   * @return true if valid name, false otherwise\n   */\n  public boolean isValidName(String name) {\n    return name != null && VALID_ACCOUNT_NAME.matcher(name).matches();\n  }\n\n  /**\n   * Remove illegal characters from account name, to make it URL-friendly. If all characters are\n   * illegal, return automatically generated account name with specified prefix. Also ensures\n   * account name is unique, if not, adds digits to it's end.\n   *\n   * @param name account name\n   * @param prefix prefix to add to generated name\n   * @return account name without illegal characters\n   */\n  public String normalizeAccountName(String name, String prefix) throws ServerException {\n    String normalized = ILLEGAL_ACCOUNT_NAME_CHARACTERS.matcher(name).replaceAll(\"\");\n    String candidate = normalized.isEmpty() ? NameGenerator.generate(prefix, 4) : normalized;\n\n    int i = 1;\n    try {\n      while (accountExists(candidate)) {\n        candidate =\n            normalized.isEmpty()\n                ? NameGenerator.generate(prefix, 4)\n                : normalized + String.valueOf(i++);\n      }\n    } catch (ServerException e) {\n      LOG.warn(\"Error occurred during account name normalization\", e);\n      throw e;\n    }\n    return candidate;\n  }\n\n  private boolean accountExists(String accountName) throws ServerException {\n    try {\n      accountManager.getByName(accountName);\n    } catch (NotFoundException e) {\n      return false;\n    }\n    return true;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-account/src/test/java/org/eclipse/che/account/spi/AccountValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.account.spi;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.doThrow;\n\nimport org.eclipse.che.account.api.AccountManager;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.Assert;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests of {@link AccountValidator}.\n *\n * @author Mihail Kuznyetsov\n * @author Yevhenii Voevodin\n * @author Sergii Leschenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class AccountValidatorTest {\n\n  @Mock private AccountManager accountManager;\n\n  @InjectMocks private AccountValidator accountValidator;\n\n  @Test(dataProvider = \"namesToNormalize\")\n  public void testNormalizeAccountName(String input, String expected) throws Exception {\n    doThrow(NotFoundException.class).when(accountManager).getByName(anyString());\n\n    Assert.assertEquals(accountValidator.normalizeAccountName(input, \"account\"), expected);\n  }\n\n  @Test\n  public void testNormalizeAccountNameWhenInputDoesNotContainAnyValidCharacter() throws Exception {\n    doThrow(NotFoundException.class).when(accountManager).getByName(anyString());\n\n    Assert.assertTrue(accountValidator.normalizeAccountName(\"#\", \"name\").startsWith(\"name\"));\n  }\n\n  @Test(dataProvider = \"namesToValidate\")\n  public void testValidUserName(String input, boolean expected) throws Exception {\n    Assert.assertEquals(accountValidator.isValidName(input), expected);\n  }\n\n  @DataProvider\n  public Object[][] namesToNormalize() {\n    return new Object[][] {\n      {\"test\", \"test\"},\n      {\"test123\", \"test123\"},\n      {\"test 123\", \"test123\"},\n      {\"test@gmail.com\", \"testgmailcom\"},\n      {\"TEST\", \"TEST\"},\n      {\"test-\", \"test\"},\n      {\"-test\", \"test\"},\n      {\"te_st\", \"test\"},\n      {\"te#st\", \"test\"},\n      {\"-test\", \"test\"},\n      {\"test-\", \"test\"},\n      {\"--test--\", \"test\"},\n      {\"t-----e--s-t\", \"t-e-s-t\"}\n    };\n  }\n\n  @DataProvider\n  public Object[][] namesToValidate() {\n    return new Object[][] {\n      {\"test\", true},\n      {\"t-e-s-t\", true},\n      {\"test123\", true},\n      {\"TEST\", true},\n      {\"te-st\", true},\n      {\"test 123\", false},\n      {\"test@gmail.com\", false},\n      {\"test-\", false},\n      {\"-test\", false},\n      {\"te_st\", false},\n      {\"te#st\", false},\n      {\"-test\", false},\n      {\"test-\", false},\n      {\"--test--\", false},\n      {\"te--st\", false}\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-account/src/test/resources/META-INF/services/org.eclipse.che.commons.test.tck.TckModule",
    "content": "org.eclipse.che.account.spi.tck.jpa.AccountJpaTckModule\n"
  },
  {
    "path": "wsmaster/che-core-api-account/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-auth</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Authentication</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.http-client</groupId>\n            <artifactId>google-http-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.http-client</groupId>\n            <artifactId>google-http-client-jackson2</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.oauth-client</groupId>\n            <artifactId>google-oauth-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.grpc</groupId>\n            <artifactId>grpc-api</artifactId>\n            <scope>runtime</scope>\n            <exclusions>\n                <exclusion>\n                    <artifactId>error_prone_annotations</artifactId>\n                    <groupId>com.google.errorprone</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>jsr305</artifactId>\n                    <groupId>com.google.code.findbugs</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <!-- Test dependencies -->\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.github.tomakehurst</groupId>\n            <artifactId>wiremock-jre8-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>jcl-over-slf4j</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.wiremock</groupId>\n            <artifactId>wiremock-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-dependency-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>analyze</id>\n                        <configuration>\n                            <ignoredDependencies>\n                                <ignoredDependency>org.everrest:everrest-core</ignoredDependency>\n                            </ignoredDependencies>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth/EmbeddedOAuthAPI.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static java.util.Collections.emptyList;\nimport static org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher.OAUTH_2_PREFIX;\nimport static org.eclipse.che.commons.lang.UrlUtils.*;\nimport static org.eclipse.che.commons.lang.UrlUtils.getParameter;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.eclipse.che.security.oauth.OAuthAuthenticator.SSL_ERROR_CODE;\nimport static org.eclipse.che.security.oauth1.OAuthAuthenticationService.ERROR_QUERY_NAME;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.ws.rs.HttpMethod;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.core.UriBuilder;\nimport jakarta.ws.rs.core.UriInfo;\nimport java.io.IOException;\nimport java.net.MalformedURLException;\nimport java.net.URI;\nimport java.net.URL;\nimport java.net.URLEncoder;\nimport java.util.*;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.core.rest.shared.dto.LinkParameter;\nimport org.eclipse.che.api.core.util.LinksHelper;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.security.oauth.shared.dto.OAuthAuthenticatorDescriptor;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Implementation of functional API component for {@link OAuthAuthenticationService}, that uses\n * {@link OAuthAuthenticator}.\n *\n * @author Mykhailo Kuznietsov\n */\n@Singleton\npublic class EmbeddedOAuthAPI implements OAuthAPI {\n  private static final Logger LOG = LoggerFactory.getLogger(EmbeddedOAuthAPI.class);\n\n  @Inject\n  @Named(\"che.auth.access_denied_error_page\")\n  protected String errorPage;\n\n  @Inject protected OAuthAuthenticatorProvider oauth2Providers;\n  @Inject protected org.eclipse.che.security.oauth1.OAuthAuthenticatorProvider oauth1Providers;\n  @Inject private PersonalAccessTokenManager personalAccessTokenManager;\n  private String redirectAfterLogin;\n\n  @Override\n  public Response authenticate(\n      UriInfo uriInfo,\n      String oauthProvider,\n      List<String> scopes,\n      String redirectAfterLogin,\n      HttpServletRequest request)\n      throws NotFoundException, OAuthAuthenticationException {\n    this.redirectAfterLogin = redirectAfterLogin;\n    OAuthAuthenticator oauth = getAuthenticator(oauthProvider);\n    final String authUrl =\n        oauth.getAuthenticateUrl(getRequestUrl(uriInfo), scopes == null ? emptyList() : scopes);\n    return Response.temporaryRedirect(URI.create(authUrl)).build();\n  }\n\n  @Override\n  public Response callback(UriInfo uriInfo, @Nullable List<String> errorValues)\n      throws NotFoundException {\n    URL requestUrl = getRequestUrl(uriInfo);\n    Map<String, List<String>> params = getQueryParametersFromState(getState(requestUrl));\n    errorValues = errorValues == null ? uriInfo.getQueryParameters().get(\"error\") : errorValues;\n    if (!isNullOrEmpty(redirectAfterLogin)\n        && errorValues != null\n        && errorValues.contains(\"access_denied\")) {\n      return Response.temporaryRedirect(\n              URI.create(encodeRedirectUrl(redirectAfterLogin + \"&error_code=access_denied\")))\n          .build();\n    }\n    final String providerName = getParameter(params, \"oauth_provider\");\n    OAuthAuthenticator oauth = getAuthenticator(providerName);\n    final List<String> scopes = params.get(\"scope\");\n    try {\n      String token = oauth.callback(requestUrl, scopes == null ? emptyList() : scopes);\n      personalAccessTokenManager.store(\n          new PersonalAccessToken(\n              oauth.getEndpointUrl(),\n              providerName,\n              EnvironmentContext.getCurrent().getSubject().getUserId(),\n              null,\n              null,\n              NameGenerator.generate(OAUTH_2_PREFIX, 5),\n              NameGenerator.generate(\"id-\", 5),\n              token));\n    } catch (OAuthAuthenticationException e) {\n      return Response.temporaryRedirect(\n              URI.create(\n                  getParameter(params, \"redirect_after_login\")\n                      + String.format(\"&%s=access_denied\", ERROR_QUERY_NAME)))\n          .build();\n    } catch (UnsatisfiedScmPreconditionException | ScmConfigurationPersistenceException e) {\n      // Skip exception, the token will be stored in the next request.\n      LOG.error(e.getMessage(), e);\n    } catch (ScmCommunicationException e) {\n      if (e.getStatusCode() == SSL_ERROR_CODE) {\n        return Response.temporaryRedirect(\n                URI.create(getRedirectAfterLoginUrl(params, \"ssl_exception\")))\n            .build();\n      } else {\n        LOG.error(e.getMessage(), e);\n      }\n    }\n    return Response.temporaryRedirect(URI.create(getRedirectAfterLoginUrl(params, null))).build();\n  }\n\n  /**\n   * Returns the redirect after login URL from the query parameters. If the URL is encoded by the\n   * CSM provider, it will be decoded, to avoid unsupported characters in the URL.\n   *\n   * @param parameters the query parameters\n   * @param errorCode the error code or {@code null}\n   * @return the redirect after login URL\n   */\n  public static String getRedirectAfterLoginUrl(\n      Map<String, List<String>> parameters, @Nullable String errorCode) {\n    String redirectAfterLogin = getParameter(parameters, \"redirect_after_login\");\n    try {\n      URI.create(redirectAfterLogin);\n    } catch (IllegalArgumentException e) {\n      // the redirectUrl was decoded by the CSM provider, so we need to encode it back.\n      redirectAfterLogin = encodeRedirectUrl(redirectAfterLogin);\n    }\n    if (errorCode != null) {\n      redirectAfterLogin += String.format(\"&%s=%s\", ERROR_QUERY_NAME, errorCode);\n    }\n    return redirectAfterLogin;\n  }\n\n  /**\n   * Encode the redirect URL query parameters to avoid the error when the redirect URL contains\n   * JSON, as a query parameter. This prevents passing unsupported characters, like '{' and '}' to\n   * the {@link URI#create(String)} method.\n   */\n  private static String encodeRedirectUrl(String url) {\n    try {\n      String query = new URL(url).getQuery();\n      return url.substring(0, url.indexOf(query)) + URLEncoder.encode(query, UTF_8);\n    } catch (MalformedURLException e) {\n      LOG.error(e.getMessage(), e);\n      throw new RuntimeException(e);\n    }\n  }\n\n  @Override\n  public Set<OAuthAuthenticatorDescriptor> getRegisteredAuthenticators(UriInfo uriInfo) {\n    Set<OAuthAuthenticatorDescriptor> result = new HashSet<>();\n    final UriBuilder uriBuilder =\n        uriInfo.getBaseUriBuilder().clone().path(OAuthAuthenticationService.class);\n    Set<String> registeredProviderNames =\n        new HashSet<>(oauth2Providers.getRegisteredProviderNames());\n    registeredProviderNames.addAll(oauth1Providers.getRegisteredProviderNames());\n    for (String name : registeredProviderNames) {\n      final List<Link> links = new LinkedList<>();\n      links.add(\n          LinksHelper.createLink(\n              HttpMethod.GET,\n              uriBuilder\n                  .clone()\n                  .path(OAuthAuthenticationService.class, \"authenticate\")\n                  .build()\n                  .toString(),\n              null,\n              null,\n              \"Authenticate URL\",\n              newDto(LinkParameter.class)\n                  .withName(\"oauth_provider\")\n                  .withRequired(true)\n                  .withDefaultValue(name),\n              newDto(LinkParameter.class)\n                  .withName(\"mode\")\n                  .withRequired(true)\n                  .withDefaultValue(\"federated_login\")));\n      OAuthAuthenticator authenticator = oauth2Providers.getAuthenticator(name);\n      result.add(\n          newDto(OAuthAuthenticatorDescriptor.class)\n              .withName(name)\n              .withEndpointUrl(\n                  authenticator != null\n                      ? authenticator.getEndpointUrl()\n                      : oauth1Providers.getAuthenticator(name).getEndpointUrl())\n              .withLinks(links));\n    }\n    return result;\n  }\n\n  @Override\n  public OAuthToken getOrRefreshToken(String oauthProvider)\n      throws NotFoundException, UnauthorizedException, ServerException {\n    OAuthAuthenticator provider = getAuthenticator(oauthProvider);\n    Subject subject = EnvironmentContext.getCurrent().getSubject();\n    try {\n      OAuthToken token = provider.getOrRefreshToken(subject.getUserId());\n      if (token == null) {\n        token = provider.getOrRefreshToken(subject.getUserName());\n      }\n      if (token != null) {\n        return token;\n      } else {\n        Optional<PersonalAccessToken> tokenOptional;\n        try {\n          tokenOptional = personalAccessTokenManager.get(subject, oauthProvider, null, null);\n          if (tokenOptional.isEmpty()) {\n            tokenOptional =\n                personalAccessTokenManager.get(subject, null, provider.getEndpointUrl(), null);\n          }\n          if (tokenOptional.isPresent()) {\n            return newDto(OAuthToken.class).withToken(tokenOptional.get().getToken());\n          }\n        } catch (ScmConfigurationPersistenceException | ScmCommunicationException e) {\n          throw new RuntimeException(e);\n        }\n      }\n      throw new UnauthorizedException(\n          \"OAuth token for user \" + subject.getUserId() + \" was not found\");\n    } catch (IOException e) {\n      throw new ServerException(e.getLocalizedMessage(), e);\n    }\n  }\n\n  @Override\n  public OAuthToken refreshToken(String oauthProvider)\n      throws NotFoundException, UnauthorizedException, ServerException {\n    OAuthAuthenticator provider = getAuthenticator(oauthProvider);\n    Subject subject = EnvironmentContext.getCurrent().getSubject();\n    try {\n      OAuthToken token = provider.refreshToken(subject.getUserId());\n      if (token == null) {\n        token = provider.refreshToken(subject.getUserName());\n      }\n\n      if (token != null) {\n        return token;\n      } else {\n        throw new UnauthorizedException(\n            \"OAuth token for user \" + subject.getUserId() + \" was not found\");\n      }\n    } catch (IOException e) {\n      throw new ServerException(e.getLocalizedMessage(), e);\n    }\n  }\n\n  @Override\n  public void invalidateToken(String oauthProvider)\n      throws NotFoundException, UnauthorizedException, ServerException {\n    OAuthAuthenticator oauth = getAuthenticator(oauthProvider);\n    OAuthToken oauthToken = getOrRefreshToken(oauthProvider);\n    try {\n      if (!oauth.invalidateToken(oauthToken.getToken())) {\n        throw new UnauthorizedException(\n            \"OAuth token for provider \" + oauthProvider + \" was not found\");\n      }\n    } catch (IOException e) {\n      throw new ServerException(e.getMessage());\n    }\n  }\n\n  protected OAuthAuthenticator getAuthenticator(String oauthProviderName) throws NotFoundException {\n    OAuthAuthenticator oauth = oauth2Providers.getAuthenticator(oauthProviderName);\n    if (oauth == null) {\n      LOG.warn(\"Unsupported OAuth provider {} \", oauthProviderName);\n      throw new NotFoundException(\"Unsupported OAuth provider \" + oauthProviderName);\n    }\n    return oauth;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth/OAuth2.gwt.xml",
    "content": "<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<!DOCTYPE module PUBLIC \"-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN\" \"http://gwtproject.org/doctype/2.7.0/gwt-module.dtd\">\n<module>\n    <source path=\"shared\"/>\n</module>"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth/OAuthAPI.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.core.UriInfo;\nimport java.util.List;\nimport java.util.Set;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.*;\nimport org.eclipse.che.security.oauth.shared.dto.OAuthAuthenticatorDescriptor;\n\n/**\n * Interface of OAuth authentication service API component, that is used for.\n *\n * @author Mykhailo Kuznietsov\n */\npublic interface OAuthAPI {\n\n  /**\n   * Implementation of method {@link OAuthAuthenticationService#authenticate(String, String, List,\n   * HttpServletRequest)}\n   */\n  Response authenticate(\n      UriInfo uriInfo,\n      String oauthProvider,\n      List<String> scopes,\n      String redirectAfterLogin,\n      HttpServletRequest request)\n      throws NotFoundException,\n          OAuthAuthenticationException,\n          ForbiddenException,\n          BadRequestException;\n\n  /** Implementation of method {@link OAuthAuthenticationService#callback(List)} */\n  Response callback(UriInfo uriInfo, List<String> errorValues)\n      throws NotFoundException, OAuthAuthenticationException, ForbiddenException;\n\n  /** Implementation of method {@link OAuthAuthenticationService#getRegisteredAuthenticators()} */\n  Set<OAuthAuthenticatorDescriptor> getRegisteredAuthenticators(UriInfo uriInfo)\n      throws ForbiddenException;\n\n  /** Implementation of method {@link OAuthAuthenticationService#token(String)} */\n  OAuthToken getOrRefreshToken(String oauthProvider)\n      throws NotFoundException,\n          UnauthorizedException,\n          ServerException,\n          ForbiddenException,\n          BadRequestException,\n          ConflictException;\n\n  /**\n   * Refreshes the token for the given OAuth provider.\n   *\n   * @param oauthProvider - the OAuth provider name\n   * @return the refreshed token\n   */\n  OAuthToken refreshToken(String oauthProvider)\n      throws NotFoundException, UnauthorizedException, ServerException, ForbiddenException;\n\n  /** Implementation of method {@link OAuthAuthenticationService#invalidate(String)}} */\n  void invalidateToken(String oauthProvider)\n      throws NotFoundException, UnauthorizedException, ServerException, ForbiddenException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth/OAuthAuthenticationException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\n@SuppressWarnings(\"serial\")\npublic final class OAuthAuthenticationException extends Exception {\n  public OAuthAuthenticationException(String message) {\n    super(message);\n  }\n\n  public OAuthAuthenticationException(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth/OAuthAuthenticationService.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.ws.rs.DELETE;\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.QueryParam;\nimport jakarta.ws.rs.core.Context;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.core.SecurityContext;\nimport jakarta.ws.rs.core.UriInfo;\nimport java.util.List;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.*;\nimport org.eclipse.che.api.core.rest.Service;\nimport org.eclipse.che.api.core.rest.annotations.Required;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.security.oauth.shared.dto.OAuthAuthenticatorDescriptor;\n\n/** RESTful wrapper for OAuthAuthenticator. */\n@Path(\"oauth\")\npublic class OAuthAuthenticationService extends Service {\n  @Context protected UriInfo uriInfo;\n  @Context protected SecurityContext security;\n\n  @Inject private OAuthAPI oAuthAPI;\n  @Inject private AuthorisationRequestManager authorisationRequestManager;\n\n  /**\n   * Redirect request to OAuth provider site for authentication|authorization. Client must provide\n   * query parameters, that may or may not be required, depending on the active implementation of\n   * {@link OAuthAPI}.\n   *\n   * @param oauthProvider -\n   * @param redirectAfterLogin\n   * @param scopes - list\n   * @return typically Response that redirect user for OAuth provider site\n   */\n  @GET\n  @Path(\"authenticate\")\n  public Response authenticate(\n      @QueryParam(\"oauth_provider\") String oauthProvider,\n      @QueryParam(\"redirect_after_login\") String redirectAfterLogin,\n      @QueryParam(\"scope\") List<String> scopes,\n      @Context HttpServletRequest request)\n      throws NotFoundException,\n          OAuthAuthenticationException,\n          BadRequestException,\n          ForbiddenException {\n    return oAuthAPI.authenticate(uriInfo, oauthProvider, scopes, redirectAfterLogin, request);\n  }\n\n  @GET\n  @Path(\"callback\")\n  /** Process OAuth callback */\n  public Response callback(@QueryParam(\"errorValues\") List<String> errorValues)\n      throws OAuthAuthenticationException, NotFoundException, ForbiddenException {\n    authorisationRequestManager.callback(uriInfo, errorValues);\n    return oAuthAPI.callback(uriInfo, errorValues);\n  }\n\n  /**\n   * Gets list of installed OAuth authenticators.\n   *\n   * @return list of installed OAuth authenticators\n   */\n  @GET\n  @Produces(MediaType.APPLICATION_JSON)\n  public Set<OAuthAuthenticatorDescriptor> getRegisteredAuthenticators() throws ForbiddenException {\n    return oAuthAPI.getRegisteredAuthenticators(uriInfo);\n  }\n\n  /**\n   * Gets OAuth token for user.\n   *\n   * @param oauthProvider OAuth provider name\n   * @return OAuthToken\n   * @throws ServerException\n   */\n  @GET\n  @Path(\"token\")\n  @Produces(MediaType.APPLICATION_JSON)\n  public OAuthToken token(@Required @QueryParam(\"oauth_provider\") String oauthProvider)\n      throws ServerException,\n          UnauthorizedException,\n          NotFoundException,\n          ForbiddenException,\n          BadRequestException,\n          ConflictException {\n    return oAuthAPI.getOrRefreshToken(oauthProvider);\n  }\n\n  /**\n   * Invalidate OAuth token for user.\n   *\n   * @param oauthProvider OAuth provider name\n   */\n  @DELETE\n  @Path(\"token\")\n  public void invalidate(@Required @QueryParam(\"oauth_provider\") String oauthProvider)\n      throws UnauthorizedException, NotFoundException, ServerException, ForbiddenException {\n    oAuthAPI.invalidateToken(oauthProvider);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth/OAuthAuthenticator.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport com.google.api.client.auth.oauth2.*;\nimport com.google.api.client.http.GenericUrl;\nimport com.google.api.client.http.javanet.NetHttpTransport;\nimport com.google.api.client.json.jackson2.JacksonFactory;\nimport com.google.api.client.util.store.MemoryDataStoreFactory;\nimport jakarta.ws.rs.core.MediaType;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.HttpURLConnection;\nimport java.net.URI;\nimport java.net.URL;\nimport java.net.URLDecoder;\nimport java.net.URLEncoder;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.regex.Pattern;\nimport javax.net.ssl.SSLHandshakeException;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.json.JsonHelper;\nimport org.eclipse.che.commons.json.JsonParseException;\nimport org.eclipse.che.security.oauth.shared.OAuthTokenProvider;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Authentication service which allow get access token from OAuth provider site. */\npublic abstract class OAuthAuthenticator {\n  protected static final String AUTHENTICATOR_IS_NOT_CONFIGURED = \"Authenticator is not configured\";\n  protected static final int SSL_ERROR_CODE = 495;\n\n  private static final Logger LOG = LoggerFactory.getLogger(OAuthAuthenticator.class);\n\n  protected AuthorizationCodeFlow flow;\n  protected Map<Pattern, String> redirectUrisMap;\n\n  /**\n   * @see {@link #configure(String, String, String[], String, String, MemoryDataStoreFactory, List)}\n   */\n  protected void configure(\n      String clientId,\n      String clientSecret,\n      String[] redirectUris,\n      String authUri,\n      String tokenUri,\n      MemoryDataStoreFactory dataStoreFactory)\n      throws IOException {\n    configure(\n        clientId,\n        clientSecret,\n        redirectUris,\n        authUri,\n        tokenUri,\n        dataStoreFactory,\n        Collections.emptyList());\n  }\n\n  /**\n   * This method should be invoked by child class for initialization default instance of {@link\n   * AuthorizationCodeFlow} that will be used for authorization\n   */\n  protected void configure(\n      String clientId,\n      String clientSecret,\n      String[] redirectUris,\n      String authUri,\n      String tokenUri,\n      MemoryDataStoreFactory dataStoreFactory,\n      List<String> scopes)\n      throws IOException {\n    final AuthorizationCodeFlow authorizationFlow =\n        new AuthorizationCodeFlow.Builder(\n                BearerToken.authorizationHeaderAccessMethod(),\n                new NetHttpTransport(),\n                new JacksonFactory(),\n                new GenericUrl(tokenUri),\n                new ClientParametersAuthentication(clientId, clientSecret),\n                clientId,\n                authUri)\n            .setDataStoreFactory(dataStoreFactory)\n            .setScopes(scopes)\n            .build();\n\n    LOG.debug(\n        \"clientId={}, clientSecret={}, redirectUris={} , authUri={}, tokenUri={}, dataStoreFactory={}\",\n        clientId,\n        clientSecret,\n        redirectUris,\n        authUri,\n        tokenUri,\n        dataStoreFactory);\n\n    configure(authorizationFlow, Arrays.asList(redirectUris));\n  }\n\n  /**\n   * This method should be invoked by child class for setting instance of {@link\n   * AuthorizationCodeFlow} that will be used for authorization\n   */\n  protected void configure(AuthorizationCodeFlow flow, List<String> redirectUris) {\n    this.flow = flow;\n    this.redirectUrisMap = new HashMap<>(redirectUris.size());\n    for (String uri : redirectUris) {\n      // Redirect URI may be in form urn:ietf:wg:oauth:2.0:oob os use java.net.URI instead of\n      // java.net.URL\n      this.redirectUrisMap.put(\n          Pattern.compile(\"([a-z0-9\\\\-]+\\\\.)?\" + URI.create(uri).getHost()), uri);\n    }\n  }\n\n  /**\n   * Create authentication URL.\n   *\n   * @param requestUrl URL of current HTTP request. This parameter required to be able determine URL\n   *     for redirection after authentication. If URL contains query parameters they will be copy to\n   *     'state' parameter and returned to callback method.\n   * @param scopes specify exactly what type of access needed\n   * @return URL for authentication\n   */\n  public String getAuthenticateUrl(URL requestUrl, List<String> scopes)\n      throws OAuthAuthenticationException {\n    if (!isConfigured()) {\n      throw new OAuthAuthenticationException(AUTHENTICATOR_IS_NOT_CONFIGURED);\n    }\n\n    AuthorizationCodeRequestUrl url =\n        flow.newAuthorizationUrl().setRedirectUri(findRedirectUrl(requestUrl)).setScopes(scopes);\n    url.setState(prepareState(requestUrl));\n    return url.build();\n  }\n\n  protected String prepareState(URL requestUrl) {\n    StringBuilder state = new StringBuilder();\n    String query = requestUrl.getQuery();\n    if (query != null) {\n      if (state.length() > 0) {\n        state.append('&');\n      }\n      state.append(query);\n    }\n    return URLEncoder.encode(state.toString(), StandardCharsets.UTF_8);\n  }\n\n  protected String findRedirectUrl(URL requestUrl) {\n    final String requestHost = requestUrl.getHost();\n    for (Map.Entry<Pattern, String> e : redirectUrisMap.entrySet()) {\n      if (e.getKey().matcher(requestHost).matches()) {\n        return e.getValue();\n      }\n    }\n    return null; // TODO : throw exception instead of return null ???\n  }\n\n  /**\n   * Process callback request.\n   *\n   * @param requestUrl request URI. URI should contain authorization code generated by authorization\n   *     server\n   * @param scopes specify exactly what type of access needed. This list must be exactly the same as\n   *     list passed to the method {@link #getAuthenticateUrl(URL, java.util.List)}\n   * @return access token\n   * @throws OAuthAuthenticationException if authentication failed or <code>requestUrl</code> does\n   *     not contain required parameters, e.g. 'code'\n   * @throws ScmCommunicationException if communication with SCM failed\n   */\n  public String callback(URL requestUrl, List<String> scopes)\n      throws OAuthAuthenticationException, ScmCommunicationException {\n    if (!isConfigured()) {\n      throw new OAuthAuthenticationException(AUTHENTICATOR_IS_NOT_CONFIGURED);\n    }\n\n    AuthorizationCodeResponseUrl authorizationCodeResponseUrl =\n        new AuthorizationCodeResponseUrl(requestUrl.toString());\n    final String error = authorizationCodeResponseUrl.getError();\n    if (error != null) {\n      throw new OAuthAuthenticationException(\"Authentication failed: \" + error);\n    }\n    final String code = authorizationCodeResponseUrl.getCode();\n    if (code == null) {\n      throw new OAuthAuthenticationException(\"Missing authorization code. \");\n    }\n\n    try {\n      TokenResponse tokenResponse =\n          getAuthorizationCodeTokenRequest(requestUrl, scopes, code).execute();\n      String userId = getUserFromUrl(authorizationCodeResponseUrl);\n      if (userId == null) {\n        userId = EnvironmentContext.getCurrent().getSubject().getUserId();\n      }\n      flow.createAndStoreCredential(tokenResponse, userId);\n      return tokenResponse.getAccessToken();\n    } catch (IOException ioe) {\n      if (ioe instanceof SSLHandshakeException) {\n        throw new ScmCommunicationException(\n            \"The required SSL certificate is missing or not trusted by the system. Please contact your administrator.\",\n            SSL_ERROR_CODE);\n      }\n      throw new OAuthAuthenticationException(ioe.getMessage());\n    }\n  }\n\n  /**\n   * Creates a new {@link AuthorizationCodeTokenRequest} for the given authorization code. Intended\n   * to be overridden by subclasses to customize the request.\n   */\n  protected AuthorizationCodeTokenRequest getAuthorizationCodeTokenRequest(\n      URL requestUrl, List<String> scopes, String code) {\n    return flow.newTokenRequest(code)\n        .setRequestInitializer(\n            request -> {\n              if (request.getParser() == null) {\n                request.setParser(flow.getJsonFactory().createJsonObjectParser());\n              }\n              request.getHeaders().setAccept(MediaType.APPLICATION_JSON);\n            })\n        .setRedirectUri(findRedirectUrl(requestUrl))\n        .setScopes(scopes);\n  }\n\n  /**\n   * Get the name of OAuth provider supported by current implementation.\n   *\n   * @return oauth provider name\n   */\n  public abstract String getOAuthProvider();\n\n  private String getUserFromUrl(AuthorizationCodeResponseUrl authorizationCodeResponseUrl)\n      throws IOException {\n    String state = authorizationCodeResponseUrl.getState();\n    if (!(state == null || state.isEmpty())) {\n      String decoded = URLDecoder.decode(state, \"UTF-8\");\n      String[] items = decoded.split(\"&\");\n      for (String str : items) {\n        if (str.startsWith(\"userId=\")) {\n          return str.substring(7, str.length());\n        }\n      }\n    }\n    return null;\n  }\n\n  protected <O> O getJson(String getUserUrl, String accessToken, Class<O> userClass)\n      throws OAuthAuthenticationException {\n    HttpURLConnection urlConnection = null;\n    InputStream urlInputStream = null;\n\n    try {\n      urlConnection = (HttpURLConnection) new URL(getUserUrl).openConnection();\n      urlConnection.setRequestProperty(\"Authorization\", \"token \" + accessToken);\n      urlInputStream = urlConnection.getInputStream();\n      return JsonHelper.fromJson(urlInputStream, userClass, null);\n    } catch (JsonParseException | IOException e) {\n      throw new OAuthAuthenticationException(e.getMessage(), e);\n    } finally {\n      if (urlInputStream != null) {\n        try {\n          urlInputStream.close();\n        } catch (IOException ignored) {\n        }\n      }\n\n      if (urlConnection != null) {\n        urlConnection.disconnect();\n      }\n    }\n  }\n\n  /**\n   * Return authorization token by userId.\n   *\n   * <p>WARN!!!. DO not use it directly.\n   *\n   * @param userId user identifier\n   * @return token value or {@code null}. When user have valid token then it will be returned, when\n   *     user have expired token and it can be refreshed then refreshed value will be returned, when\n   *     none token found for user then {@code null} will be returned, when user have expired token\n   *     and it can't be refreshed then {@code null} will be returned\n   * @throws IOException when error occurs during token loading\n   * @see OAuthTokenProvider#getToken(String, String) TODO: return Optional<OAuthToken> to avoid\n   *     returning null.\n   */\n  public OAuthToken getOrRefreshToken(String userId) throws IOException {\n    if (!isConfigured()) {\n      throw new IOException(AUTHENTICATOR_IS_NOT_CONFIGURED);\n    }\n    Credential credential = flow.loadCredential(userId);\n    if (credential == null) {\n      return null;\n    }\n    final Long expirationTime = credential.getExpiresInSeconds();\n    if (expirationTime != null && expirationTime < 0) {\n      boolean tokenRefreshed;\n      try {\n        tokenRefreshed = credential.refreshToken();\n      } catch (IOException ioEx) {\n        tokenRefreshed = false;\n      }\n      if (tokenRefreshed) {\n        credential = flow.loadCredential(userId);\n      } else {\n        // if token is not refreshed then old value should be invalidated\n        // and null result should be returned\n        try {\n          invalidateTokenByUser(userId);\n        } catch (IOException ignored) {\n        }\n        return null;\n      }\n    }\n    return newDto(OAuthToken.class).withToken(credential.getAccessToken());\n  }\n\n  /**\n   * Refresh personal access token.\n   *\n   * @param userId user identifier\n   * @return a refreshed token value or {@code null}\n   * @throws IOException when error occurs during token loading\n   */\n  public OAuthToken refreshToken(String userId) throws IOException {\n    if (!isConfigured()) {\n      throw new IOException(AUTHENTICATOR_IS_NOT_CONFIGURED);\n    }\n\n    Credential credential = flow.loadCredential(userId);\n    if (credential == null) {\n      return null;\n    }\n\n    boolean tokenRefreshed;\n    try {\n      tokenRefreshed = credential.refreshToken();\n    } catch (IOException ioEx) {\n      tokenRefreshed = false;\n    }\n\n    if (tokenRefreshed) {\n      credential = flow.loadCredential(userId);\n    } else {\n      // if token is not refreshed then old value should be invalidated\n      // and null result should be returned\n      try {\n        invalidateTokenByUser(userId);\n      } catch (IOException ignored) {\n      }\n      return null;\n    }\n    return newDto(OAuthToken.class).withToken(credential.getAccessToken());\n  }\n\n  /**\n   * Invalidate OAuth token for specified user.\n   *\n   * @param userId user\n   */\n  private void invalidateTokenByUser(String userId) throws IOException {\n    Credential credential = flow.loadCredential(userId);\n    if (credential != null) {\n      flow.getCredentialDataStore().delete(userId);\n    }\n  }\n\n  /**\n   * Invalidate OAuth token.\n   *\n   * @param token oauth token\n   * @return <code>true</code> if OAuth token invalidated and <code>false</code> otherwise, e.g. if\n   *     token was not found\n   */\n  public boolean invalidateToken(String token) throws IOException {\n    throw new UnsupportedOperationException(\"Should be implemented by specific provider\");\n  }\n\n  /**\n   * Get endpoint URL.\n   *\n   * @return provider's endpoint URL\n   */\n  public abstract String getEndpointUrl();\n\n  /**\n   * Checks configuring of authenticator\n   *\n   * @return true only if authenticator have valid configuration data and it is able to authorize\n   *     otherwise returns false\n   */\n  public boolean isConfigured() {\n    return flow != null;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth/OAuthAuthenticatorProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport java.util.Set;\n\n/** Allow store and provide services which implementations of OAuthAuthenticator. */\npublic interface OAuthAuthenticatorProvider {\n\n  /**\n   * Get authentication service by name.\n   *\n   * @param oauthProviderName name of OAuth provider\n   * @return OAuthAuthenticator instance or <code>null</code> if specified OAuth provider is not\n   *     supported\n   */\n  OAuthAuthenticator getAuthenticator(String oauthProviderName);\n\n  /**\n   * Gets registered OAuth provider names\n   *\n   * @return set of registered OAuth provider names\n   */\n  Set<String> getRegisteredProviderNames();\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth/OAuthAuthenticatorProviderImpl.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\n\n@Singleton\npublic class OAuthAuthenticatorProviderImpl implements OAuthAuthenticatorProvider {\n  private final Map<String, OAuthAuthenticator> authenticatorMap = new HashMap<>();\n\n  @Inject\n  public OAuthAuthenticatorProviderImpl(Set<OAuthAuthenticator> oAuthAuthenticators) {\n    for (OAuthAuthenticator authenticator : oAuthAuthenticators) {\n      if (authenticator.isConfigured()) {\n        authenticatorMap.put(authenticator.getOAuthProvider(), authenticator);\n      }\n    }\n  }\n\n  @Override\n  public OAuthAuthenticator getAuthenticator(String oauthProviderName) {\n    return authenticatorMap.get(oauthProviderName);\n  }\n\n  @Override\n  public Set<String> getRegisteredProviderNames() {\n    return Collections.unmodifiableSet(authenticatorMap.keySet());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth/OAuthAuthenticatorTokenProvider.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport java.io.IOException;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.security.oauth.shared.OAuthTokenProvider;\n\n/** Retrieves OAuth token with help of OAuthAuthenticatorProvider. */\n@Singleton\npublic class OAuthAuthenticatorTokenProvider implements OAuthTokenProvider {\n  private final OAuthAuthenticatorProvider oAuthAuthenticatorProvider;\n\n  @Inject\n  public OAuthAuthenticatorTokenProvider(OAuthAuthenticatorProvider oAuthAuthenticatorProvider) {\n    this.oAuthAuthenticatorProvider = oAuthAuthenticatorProvider;\n  }\n\n  @Override\n  public OAuthToken getToken(String oauthProviderName, String userId) throws IOException {\n    OAuthAuthenticator oAuthAuthenticator =\n        oAuthAuthenticatorProvider.getAuthenticator(oauthProviderName);\n    OAuthToken token;\n    if (oAuthAuthenticator != null\n        && (token = oAuthAuthenticator.getOrRefreshToken(userId)) != null) {\n      return token;\n    }\n    return null;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth1/OAuthAuthenticationException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth1;\n\nimport org.eclipse.che.api.core.ServerException;\n\n/**\n * Exception raised when the OAuth authentication failed.\n *\n * @author Kevin Pollet\n * @author Igor Vinokur\n */\npublic class OAuthAuthenticationException extends ServerException {\n\n  /**\n   * Constructs an instance of {@link OAuthAuthenticationException}.\n   *\n   * @param message the exception message.\n   */\n  public OAuthAuthenticationException(final String message) {\n    super(message);\n  }\n\n  /**\n   * Constructs an instance of {@link OAuthAuthenticationException}.\n   *\n   * @param cause the cause of the exception.\n   */\n  public OAuthAuthenticationException(final Throwable cause) {\n    super(cause);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth1/OAuthAuthenticationService.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth1;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.commons.lang.UrlUtils.getParameter;\nimport static org.eclipse.che.commons.lang.UrlUtils.getQueryParametersFromState;\nimport static org.eclipse.che.commons.lang.UrlUtils.getRequestUrl;\nimport static org.eclipse.che.commons.lang.UrlUtils.getState;\nimport static org.eclipse.che.security.oauth.EmbeddedOAuthAPI.getRedirectAfterLoginUrl;\n\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.QueryParam;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.net.URI;\nimport java.net.URL;\nimport java.util.List;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.rest.Service;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * RESTful wrapper for OAuth 1.0.\n *\n * @author Kevin Pollet\n * @author Igor Vinokur\n */\n@Path(\"oauth/1.0\")\npublic class OAuthAuthenticationService extends Service {\n  private static final Logger LOG = LoggerFactory.getLogger(OAuthAuthenticationService.class);\n\n  private static final String UNSUPPORTED_OAUTH_PROVIDER_ERROR = \"Unsupported OAuth provider: %s\";\n  public static final String ERROR_QUERY_NAME = \"error_code\";\n  @Inject protected OAuthAuthenticatorProvider providers;\n\n  @GET\n  @Path(\"authenticate\")\n  public Response authenticate(\n      @QueryParam(\"oauth_provider\") String providerName,\n      @QueryParam(\"request_method\") String requestMethod,\n      @QueryParam(\"signature_method\") String signatureMethod,\n      @QueryParam(\"redirect_after_login\") String redirectAfterLogin)\n      throws OAuthAuthenticationException, BadRequestException {\n\n    requiredNotNull(providerName, \"Provider name\");\n    requiredNotNull(redirectAfterLogin, \"Redirect after login\");\n\n    final OAuthAuthenticator oauth = getAuthenticator(providerName);\n    final String authUrl =\n        oauth.getAuthenticateUrl(getRequestUrl(uriInfo), requestMethod, signatureMethod);\n\n    return Response.temporaryRedirect(URI.create(authUrl)).build();\n  }\n\n  @GET\n  @Path(\"callback\")\n  public Response callback() throws OAuthAuthenticationException, BadRequestException {\n    final URL requestUrl = getRequestUrl(uriInfo);\n    final Map<String, List<String>> parameters = getQueryParametersFromState(getState(requestUrl));\n\n    final String providerName = getParameter(parameters, \"oauth_provider\");\n    final String redirectAfterLogin = getRedirectAfterLoginUrl(parameters, null);\n\n    UriBuilder redirectUriBuilder = UriBuilder.fromUri(redirectAfterLogin);\n\n    try {\n      getAuthenticator(providerName).callback(requestUrl);\n    } catch (UserDeniedOAuthAuthenticationException e) {\n      redirectUriBuilder.queryParam(ERROR_QUERY_NAME, \"access_denied\");\n    } catch (OAuthAuthenticationException e) {\n      redirectUriBuilder.queryParam(ERROR_QUERY_NAME, \"invalid_request\");\n    }\n    return Response.temporaryRedirect(redirectUriBuilder.build()).build();\n  }\n\n  @GET\n  @Path(\"signature\")\n  public String signature(\n      @QueryParam(\"oauth_provider\") String providerName,\n      @QueryParam(\"request_url\") String requestUrl,\n      @QueryParam(\"request_method\") String requestMethod)\n      throws OAuthAuthenticationException, BadRequestException {\n    requiredNotNull(providerName, \"Provider name\");\n    requiredNotNull(requestUrl, \"Request url\");\n    requiredNotNull(requestMethod, \"Request method\");\n\n    return getAuthenticator(providerName)\n        .computeAuthorizationHeader(\n            EnvironmentContext.getCurrent().getSubject().getUserId(), requestMethod, requestUrl);\n  }\n\n  private OAuthAuthenticator getAuthenticator(String oauthProviderName) throws BadRequestException {\n    OAuthAuthenticator oauth = providers.getAuthenticator(oauthProviderName);\n    if (oauth == null) {\n      LOG.warn(format(UNSUPPORTED_OAUTH_PROVIDER_ERROR, oauthProviderName));\n      throw new BadRequestException(format(UNSUPPORTED_OAUTH_PROVIDER_ERROR, oauthProviderName));\n    }\n    return oauth;\n  }\n\n  /**\n   * Checks object reference is not {@code null}\n   *\n   * @param object object reference to check\n   * @param subject used as subject of exception message \"{subject} required\"\n   * @throws BadRequestException when object reference is {@code null}\n   */\n  private void requiredNotNull(Object object, String subject) throws BadRequestException {\n    if (object == null) {\n      throw new BadRequestException(subject + \" required\");\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth1/OAuthAuthenticator.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth1;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.net.URLDecoder.decode;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport com.google.api.client.auth.oauth.OAuthAuthorizeTemporaryTokenUrl;\nimport com.google.api.client.auth.oauth.OAuthCredentialsResponse;\nimport com.google.api.client.auth.oauth.OAuthGetAccessToken;\nimport com.google.api.client.auth.oauth.OAuthGetTemporaryToken;\nimport com.google.api.client.auth.oauth.OAuthHmacSigner;\nimport com.google.api.client.auth.oauth.OAuthParameters;\nimport com.google.api.client.auth.oauth.OAuthRsaSigner;\nimport com.google.api.client.http.GenericUrl;\nimport com.google.api.client.http.HttpTransport;\nimport com.google.api.client.http.javanet.NetHttpTransport;\nimport com.google.api.client.util.Base64;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URL;\nimport java.security.GeneralSecurityException;\nimport java.security.KeyFactory;\nimport java.security.NoSuchAlgorithmException;\nimport java.security.PrivateKey;\nimport java.security.spec.InvalidKeySpecException;\nimport java.security.spec.PKCS8EncodedKeySpec;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.locks.ReentrantLock;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\n\n/**\n * Authentication service which allows get access token from OAuth provider site.\n *\n * @author Kevin Pollet\n * @author Igor Vinokur\n */\npublic abstract class OAuthAuthenticator {\n  private static final String USER_ID_PARAM_KEY = \"userId\";\n  private static final String REQUEST_METHOD_PARAM_KEY = \"request_method\";\n  private static final String SIGNATURE_METHOD_PARAM_KEY = \"signature_method\";\n  private static final String STATE_PARAM_KEY = \"state\";\n  private static final String OAUTH_TOKEN_PARAM_KEY = \"oauth_token\";\n  private static final String OAUTH_VERIFIER_PARAM_KEY = \"oauth_verifier\";\n\n  private final String clientId;\n  private final String clientSecret;\n  private final String privateKey;\n  private final String requestTokenUri;\n  private final String accessTokenUri;\n  private final String authorizeTokenUri;\n  private final String redirectUri;\n  private final HttpTransport httpTransport;\n  private final Map<String, OAuthCredentialsResponse> credentialsStore;\n  private final ReentrantLock credentialsStoreLock;\n  private final Map<String, String> sharedTokenSecrets;\n\n  protected OAuthAuthenticator(\n      String clientId,\n      String requestTokenUri,\n      String accessTokenUri,\n      String authorizeTokenUri,\n      String redirectUri,\n      @Nullable String clientSecret,\n      @Nullable String privateKey) {\n    this.clientId = clientId;\n    this.clientSecret = clientSecret;\n    this.privateKey = privateKey;\n    this.requestTokenUri = requestTokenUri;\n    this.accessTokenUri = accessTokenUri;\n    this.authorizeTokenUri = authorizeTokenUri;\n    this.redirectUri = redirectUri;\n    this.httpTransport = new NetHttpTransport();\n    this.credentialsStore = new HashMap<>();\n    this.credentialsStoreLock = new ReentrantLock();\n    this.sharedTokenSecrets = new HashMap<>();\n  }\n\n  /**\n   * Create authentication URL.\n   *\n   * @param requestUrl URL of current HTTP request. This parameter required to be able determine URL\n   *     for redirection after authentication. If URL contains query parameters they will be copied\n   *     to 'state' parameter and returned to callback method.\n   * @param requestMethod HTTP request method that will be used to request temporary token\n   * @param signatureMethod OAuth signature algorithm\n   * @return URL for authentication.\n   * @throws OAuthAuthenticationException if authentication failed.\n   */\n  String getAuthenticateUrl(\n      final URL requestUrl,\n      @Nullable final String requestMethod,\n      @Nullable final String signatureMethod)\n      throws OAuthAuthenticationException {\n    try {\n      final GenericUrl callbackUrl = new GenericUrl(redirectUri);\n      String userId = getParameterFromState(requestUrl.getQuery(), USER_ID_PARAM_KEY);\n      String currentUserId = EnvironmentContext.getCurrent().getSubject().getUserId();\n      if (userId != null) {\n        if (currentUserId.equals(userId)) {\n          callbackUrl.put(STATE_PARAM_KEY, requestUrl.getQuery());\n        } else {\n          throw new OAuthAuthenticationException(\n              \"Provided query parameter \"\n                  + USER_ID_PARAM_KEY\n                  + \"=\"\n                  + userId\n                  + \" does not match the current user id: \"\n                  + currentUserId);\n        }\n      } else {\n        callbackUrl.put(\n            STATE_PARAM_KEY, requestUrl.getQuery() + \"&\" + USER_ID_PARAM_KEY + \"=\" + currentUserId);\n      }\n\n      OAuthGetTemporaryToken temporaryToken;\n      if (requestMethod != null && \"post\".equalsIgnoreCase(requestMethod)) {\n        temporaryToken = new OAuthPostTemporaryToken(requestTokenUri);\n      } else {\n        temporaryToken = new OAuthGetTemporaryToken(requestTokenUri);\n      }\n      if (signatureMethod != null && \"rsa\".equalsIgnoreCase(signatureMethod)) {\n        temporaryToken.signer = getOAuthRsaSigner();\n      } else {\n        temporaryToken.signer = getOAuthHmacSigner(null, null);\n      }\n      temporaryToken.consumerKey = clientId;\n      temporaryToken.callback = callbackUrl.build();\n      temporaryToken.transport = httpTransport;\n      final OAuthCredentialsResponse credentialsResponse = temporaryToken.execute();\n      final OAuthAuthorizeTemporaryTokenUrl authorizeTemporaryTokenUrl =\n          new OAuthAuthorizeTemporaryTokenUrl(authorizeTokenUri);\n      authorizeTemporaryTokenUrl.temporaryToken = credentialsResponse.token;\n\n      sharedTokenSecrets.put(credentialsResponse.token, credentialsResponse.tokenSecret);\n\n      return authorizeTemporaryTokenUrl.build();\n    } catch (Exception e) {\n      throw new OAuthAuthenticationException(e.getMessage());\n    }\n  }\n\n  /**\n   * Process callback request.\n   *\n   * @param requestUrl request URI. URI should contain OAuth token and OAuth verifier.\n   * @return id of authenticated user\n   * @throws OAuthAuthenticationException if authentication failed or {@code requestUrl} does not\n   *     contain required parameters.\n   */\n  String callback(final URL requestUrl) throws OAuthAuthenticationException {\n    try {\n      final GenericUrl callbackUrl = new GenericUrl(requestUrl.toString());\n\n      if (callbackUrl.getFirst(OAUTH_TOKEN_PARAM_KEY) == null) {\n        throw new OAuthAuthenticationException(\"Missing oauth_token parameter\");\n      }\n\n      if (callbackUrl.getFirst(OAUTH_VERIFIER_PARAM_KEY) == null) {\n        throw new OAuthAuthenticationException(\"Missing oauth_verifier parameter\");\n      }\n\n      final String state = (String) callbackUrl.getFirst(STATE_PARAM_KEY);\n\n      String requestMethod = getParameterFromState(state, REQUEST_METHOD_PARAM_KEY);\n      String signatureMethod = getParameterFromState(state, SIGNATURE_METHOD_PARAM_KEY);\n\n      final String oauthTemporaryToken = (String) callbackUrl.getFirst(OAUTH_TOKEN_PARAM_KEY);\n\n      OAuthGetAccessToken getAccessToken;\n      if (requestMethod != null && \"post\".equalsIgnoreCase(requestMethod)) {\n        getAccessToken = new OAuthPostAccessToken(accessTokenUri);\n      } else {\n        getAccessToken = new OAuthGetAccessToken(accessTokenUri);\n      }\n      getAccessToken.consumerKey = clientId;\n      getAccessToken.temporaryToken = oauthTemporaryToken;\n      getAccessToken.verifier = (String) callbackUrl.getFirst(OAUTH_VERIFIER_PARAM_KEY);\n\n      if (\"denied\".equals(getAccessToken.verifier)) {\n        throw new UserDeniedOAuthAuthenticationException(\"Authorization denied\");\n      }\n\n      getAccessToken.transport = httpTransport;\n      if (signatureMethod != null && \"rsa\".equalsIgnoreCase(signatureMethod)) {\n        getAccessToken.signer = getOAuthRsaSigner();\n      } else {\n        getAccessToken.signer =\n            getOAuthHmacSigner(clientSecret, sharedTokenSecrets.remove(oauthTemporaryToken));\n      }\n\n      final OAuthCredentialsResponse credentials = getAccessToken.execute();\n      String userId = getParameterFromState(state, USER_ID_PARAM_KEY);\n\n      credentialsStoreLock.lock();\n      try {\n\n        final OAuthCredentialsResponse userId2Credential = credentialsStore.get(userId);\n        if (userId2Credential == null) {\n          credentialsStore.put(userId, credentials);\n        } else {\n          userId2Credential.token = credentials.token;\n          userId2Credential.tokenSecret = credentials.tokenSecret;\n        }\n\n      } finally {\n        credentialsStoreLock.unlock();\n      }\n\n      return userId;\n\n    } catch (OAuthAuthenticationException e) {\n      throw e;\n    } catch (Exception e) {\n      throw new OAuthAuthenticationException(e.getMessage());\n    }\n  }\n\n  /**\n   * Get name of OAuth provider supported by current implementation.\n   *\n   * @return the oauth provider name.\n   */\n  public abstract String getOAuthProvider();\n\n  /**\n   * Returns URL to initiate authentication process using given authenticator. Typically points to\n   * {@code /api/oauth/} or {@code /api/oauth/1.0} endpoint with necessary request params.\n   *\n   * @return URL to initiate authentication process\n   */\n  public abstract String getLocalAuthenticateUrl();\n\n  /**\n   * Get endpoint URL.\n   *\n   * @return provider's endpoint URL\n   */\n  public abstract String getEndpointUrl();\n\n  /**\n   * Compute the Authorization header to sign the OAuth 1 request.\n   *\n   * @param userId the user id.\n   * @param requestMethod the HTTP request method.\n   * @param requestUrl the HTTP request url with encoded query parameters.\n   * @return the authorization header value, or {@code null} if token was not found for given user\n   *     id.\n   * @throws OAuthAuthenticationException if authentication failed.\n   */\n  public String computeAuthorizationHeader(\n      final String userId, final String requestMethod, final String requestUrl)\n      throws OAuthAuthenticationException {\n    final OAuthCredentialsResponse credentials = new OAuthCredentialsResponse();\n    OAuthToken oauthToken = getToken(userId);\n    credentials.token = oauthToken != null ? oauthToken.getToken() : null;\n    if (credentials.token != null) {\n      return computeAuthorizationHeader(\n          requestMethod, requestUrl, credentials.token, credentials.tokenSecret);\n    }\n    return \"\";\n  }\n\n  private OAuthToken getToken(final String userId) {\n    OAuthCredentialsResponse credentials;\n    credentialsStoreLock.lock();\n    try {\n      credentials = credentialsStore.get(userId);\n    } finally {\n      credentialsStoreLock.unlock();\n    }\n    if (credentials != null) {\n      return newDto(OAuthToken.class)\n          .withToken(credentials.token)\n          .withScope(credentials.tokenSecret);\n    }\n    return null;\n  }\n\n  /**\n   * Compute the Authorization header to sign the OAuth 1 request.\n   *\n   * @param requestMethod the HTTP request method.\n   * @param requestUrl the HTTP request url with encoded query parameters.\n   * @param token the token.\n   * @param tokenSecret the secret token.\n   * @return the authorization header value, or {@code null}.\n   */\n  private String computeAuthorizationHeader(\n      final String requestMethod,\n      final String requestUrl,\n      final String token,\n      final String tokenSecret)\n      throws OAuthAuthenticationException {\n    OAuthParameters oauthParameters;\n    try {\n      oauthParameters = new OAuthParameters();\n      oauthParameters.consumerKey = clientId;\n      oauthParameters.signer =\n          clientSecret == null\n              ? getOAuthRsaSigner()\n              : getOAuthHmacSigner(clientSecret, tokenSecret);\n      oauthParameters.token = token;\n      oauthParameters.version = \"1.0\";\n\n      oauthParameters.computeNonce();\n      oauthParameters.computeTimestamp();\n\n      oauthParameters.computeSignature(requestMethod, new GenericUrl(requestUrl));\n    } catch (GeneralSecurityException e) {\n      throw new OAuthAuthenticationException(e);\n    }\n\n    return oauthParameters.getAuthorizationHeader();\n  }\n\n  private String getParameterFromState(String state, String parameterName) {\n    if (isNullOrEmpty(state)) {\n      return null;\n    }\n    for (final String param : extractStateParams(state)) {\n      if (param.startsWith(parameterName + \"=\")) {\n        return param.substring(parameterName.length() + 1);\n      }\n    }\n    return null;\n  }\n\n  private String[] extractStateParams(String state) {\n    try {\n      String decodedState = decode(state, \"UTF-8\");\n      return decodedState.split(\"&\");\n    } catch (UnsupportedEncodingException ignored) {\n      // should never happen, UTF-8 supported.\n    }\n    return null;\n  }\n\n  private OAuthRsaSigner getOAuthRsaSigner()\n      throws NoSuchAlgorithmException, InvalidKeySpecException {\n    OAuthRsaSigner oAuthRsaSigner = new OAuthRsaSigner();\n    oAuthRsaSigner.privateKey = getPrivateKey(privateKey);\n    return oAuthRsaSigner;\n  }\n\n  private OAuthHmacSigner getOAuthHmacSigner(\n      @Nullable String clientSecret, @Nullable String oauthTemporaryToken)\n      throws NoSuchAlgorithmException, InvalidKeySpecException {\n    final OAuthHmacSigner signer = new OAuthHmacSigner();\n    signer.clientSharedSecret = clientSecret;\n    signer.tokenSharedSecret = sharedTokenSecrets.remove(oauthTemporaryToken);\n    return signer;\n  }\n\n  private PrivateKey getPrivateKey(String privateKey)\n      throws NoSuchAlgorithmException, InvalidKeySpecException {\n    byte[] privateKeyBytes = Base64.decodeBase64(privateKey);\n    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);\n    KeyFactory keyFactory = KeyFactory.getInstance(\"RSA\");\n    return keyFactory.generatePrivate(keySpec);\n  }\n\n  private static class OAuthPostTemporaryToken extends OAuthGetTemporaryToken {\n    OAuthPostTemporaryToken(String authorizationServerUrl) {\n      super(authorizationServerUrl);\n      super.usePost = true;\n    }\n  }\n\n  private static class OAuthPostAccessToken extends OAuthGetAccessToken {\n    OAuthPostAccessToken(String authorizationServerUrl) {\n      super(authorizationServerUrl);\n      super.usePost = true;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth1/OAuthAuthenticatorProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth1;\n\nimport static java.util.stream.Collectors.toUnmodifiableSet;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\n\n/**\n * Allow store and provide services with implementations of {@link OAuthAuthenticator} for OAuth 1.\n *\n * @author Kevin Pollet\n * @author Igor Vinokur\n */\n@Singleton\npublic class OAuthAuthenticatorProvider {\n  private final Map<String, OAuthAuthenticator> oAuthAuthenticators = new HashMap<>();\n\n  @Inject\n  public OAuthAuthenticatorProvider(final Set<OAuthAuthenticator> oAuthAuthenticators) {\n    oAuthAuthenticators.forEach(\n        authenticator ->\n            this.oAuthAuthenticators.put(authenticator.getOAuthProvider(), authenticator));\n  }\n\n  /**\n   * Get the OAuth authentication service by name.\n   *\n   * @param oauthProviderName name of the OAuth provider.\n   * @return {@link OAuthAuthenticator} instance or {@code null} if specified OAuth provider is not\n   *     supported.\n   */\n  public OAuthAuthenticator getAuthenticator(String oauthProviderName) {\n    return oAuthAuthenticators.get(oauthProviderName);\n  }\n\n  /**\n   * Gets registered OAuth1 provider names\n   *\n   * @return set of registered OAuth1 provider names\n   */\n  public Set<String> getRegisteredProviderNames() {\n    return oAuthAuthenticators.keySet().stream()\n        .filter(key -> !\"Noop\".equals(key))\n        .collect(toUnmodifiableSet());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth1/UserDeniedOAuthAuthenticationException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth1;\n\n/** Exception used when a user denies access on the OAuth authorization page. */\npublic final class UserDeniedOAuthAuthenticationException extends OAuthAuthenticationException {\n  public UserDeniedOAuthAuthenticationException(String message) {\n    super(message);\n  }\n\n  public UserDeniedOAuthAuthenticationException(Throwable cause) {\n    super(cause);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/test/java/org/eclipse/che/security/oauth/EmbeddedOAuthAPITest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static java.net.URLEncoder.encode;\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher.OAUTH_2_PREFIX;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.eclipse.che.security.oauth.OAuthAuthenticator.SSL_ERROR_CODE;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyList;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.core.UriBuilder;\nimport jakarta.ws.rs.core.UriInfo;\nimport java.lang.reflect.Field;\nimport java.net.URI;\nimport java.net.URL;\nimport java.util.Set;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.security.oauth.shared.dto.OAuthAuthenticatorDescriptor;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Mykhailo Kuznietsov\n */\n@Listeners(value = MockitoTestNGListener.class)\npublic class EmbeddedOAuthAPITest {\n\n  @Mock OAuthAuthenticatorProvider oauth2Providers;\n  @Mock org.eclipse.che.security.oauth1.OAuthAuthenticatorProvider oauth1Providers;\n  @Mock PersonalAccessTokenManager personalAccessTokenManager;\n\n  @InjectMocks EmbeddedOAuthAPI embeddedOAuthAPI;\n\n  @Test(\n      expectedExceptions = NotFoundException.class,\n      expectedExceptionsMessageRegExp = \"Unsupported OAuth provider unknown\")\n  public void shouldThrowExceptionIfNoSuchProviderFound() throws Exception {\n    embeddedOAuthAPI.getOrRefreshToken(\"unknown\");\n  }\n\n  @Test\n  public void shouldBeAbleToGetUserToken() throws Exception {\n    String provider = \"myprovider\";\n    String token = \"token123\";\n    OAuthAuthenticator authenticator = mock(OAuthAuthenticator.class);\n    when(oauth2Providers.getAuthenticator(eq(provider))).thenReturn(authenticator);\n\n    when(authenticator.getOrRefreshToken(anyString()))\n        .thenReturn(newDto(OAuthToken.class).withToken(token));\n\n    OAuthToken result = embeddedOAuthAPI.getOrRefreshToken(provider);\n\n    assertEquals(result.getToken(), token);\n  }\n\n  @Test\n  public void shouldGetRegisteredAuthenticators() throws Exception {\n    // given\n    UriInfo uriInfo = mock(UriInfo.class);\n    when(uriInfo.getBaseUriBuilder()).thenReturn(UriBuilder.fromUri(\"http://eclipse.che\"));\n    when(oauth2Providers.getRegisteredProviderNames()).thenReturn(Set.of(\"github\"));\n    when(oauth1Providers.getRegisteredProviderNames()).thenReturn(Set.of(\"bitbucket\"));\n    org.eclipse.che.security.oauth1.OAuthAuthenticator authenticator =\n        mock(org.eclipse.che.security.oauth1.OAuthAuthenticator.class);\n    when(oauth2Providers.getAuthenticator(\"github\")).thenReturn(mock(OAuthAuthenticator.class));\n    when(oauth1Providers.getAuthenticator(\"bitbucket\")).thenReturn(authenticator);\n\n    // when\n    Set<OAuthAuthenticatorDescriptor> registeredAuthenticators =\n        embeddedOAuthAPI.getRegisteredAuthenticators(uriInfo);\n\n    // then\n    assertEquals(registeredAuthenticators.size(), 2);\n  }\n\n  @Test\n  public void shouldEncodeRejectErrorForRedirectUrl() throws Exception {\n    // given\n    UriInfo uriInfo = mock(UriInfo.class);\n    when(uriInfo.getRequestUri()).thenReturn(new URI(\"http://eclipse.che\"));\n    Field redirectAfterLogin = EmbeddedOAuthAPI.class.getDeclaredField(\"redirectAfterLogin\");\n    redirectAfterLogin.setAccessible(true);\n    redirectAfterLogin.set(embeddedOAuthAPI, \"http://eclipse.che?quary=param\");\n\n    // when\n    Response callback = embeddedOAuthAPI.callback(uriInfo, singletonList(\"access_denied\"));\n\n    // then\n    assertEquals(\n        callback.getLocation().toString(),\n        \"http://eclipse.che?quary%3Dparam%26error_code%3Daccess_denied\");\n  }\n\n  @Test\n  public void shouldAddSslErrorCode() throws Exception {\n    // given\n    UriInfo uriInfo = mock(UriInfo.class);\n    OAuthAuthenticator authenticator = mock(OAuthAuthenticator.class);\n    when(authenticator.callback(any(URL.class), anyList()))\n        .thenThrow(new ScmCommunicationException(\"\", SSL_ERROR_CODE));\n    when(uriInfo.getRequestUri())\n        .thenReturn(\n            new URI(\n                \"http://eclipse.che?state=oauth_provider\"\n                    + encode(\n                        \"=github&redirect_after_login=https://redirecturl.com?params=\", UTF_8)));\n    when(oauth2Providers.getAuthenticator(\"github\")).thenReturn(authenticator);\n\n    // when\n    Response callback = embeddedOAuthAPI.callback(uriInfo, singletonList(\"ssl_exception\"));\n\n    // then\n    assertEquals(\n        callback.getLocation().toString(),\n        \"https://redirecturl.com?params=&error_code=ssl_exception\");\n  }\n\n  @Test\n  public void shouldStoreTokenOnCallback() throws Exception {\n    // given\n    UriInfo uriInfo = mock(UriInfo.class);\n    OAuthAuthenticator authenticator = mock(OAuthAuthenticator.class);\n    when(authenticator.getEndpointUrl()).thenReturn(\"http://eclipse.che\");\n    when(authenticator.callback(any(URL.class), anyList())).thenReturn(\"token\");\n    when(uriInfo.getRequestUri())\n        .thenReturn(\n            new URI(\n                \"http://eclipse.che?state=oauth_provider%3Dgithub%26redirect_after_login%3DredirectUrl\"));\n    when(oauth2Providers.getAuthenticator(\"github\")).thenReturn(authenticator);\n    ArgumentCaptor<PersonalAccessToken> tokenCapture =\n        ArgumentCaptor.forClass(PersonalAccessToken.class);\n\n    // when\n    embeddedOAuthAPI.callback(uriInfo, emptyList());\n\n    // then\n    verify(personalAccessTokenManager).store(tokenCapture.capture());\n    PersonalAccessToken token = tokenCapture.getValue();\n    assertEquals(token.getScmProviderUrl(), \"http://eclipse.che\");\n    assertEquals(token.getCheUserId(), \"0000-00-0000\");\n    assertTrue(token.getScmTokenId().startsWith(\"id-\"));\n    assertTrue(token.getScmTokenName().startsWith(OAUTH_2_PREFIX));\n    assertEquals(token.getToken(), \"token\");\n  }\n\n  @Test\n  public void shouldEncodeRedirectUrl() throws Exception {\n    // given\n    UriInfo uriInfo = mock(UriInfo.class);\n    OAuthAuthenticator authenticator = mock(OAuthAuthenticator.class);\n    when(uriInfo.getRequestUri())\n        .thenReturn(\n            new URI(\n                \"http://eclipse.che?state=oauth_provider\"\n                    + encode(\n                        \"=github&redirect_after_login=https://redirecturl.com?params=\"\n                            + encode(\"{}\", UTF_8),\n                        UTF_8)));\n    when(oauth2Providers.getAuthenticator(\"github\")).thenReturn(authenticator);\n\n    // when\n    Response callback = embeddedOAuthAPI.callback(uriInfo, emptyList());\n\n    // then\n    assertEquals(callback.getLocation().toString(), \"https://redirecturl.com?params%3D%7B%7D\");\n  }\n\n  @Test\n  public void shouldNotEncodeRedirectUrl() throws Exception {\n    // given\n    UriInfo uriInfo = mock(UriInfo.class);\n    OAuthAuthenticator authenticator = mock(OAuthAuthenticator.class);\n    when(uriInfo.getRequestUri())\n        .thenReturn(\n            new URI(\n                \"http://eclipse.che?state=oauth_provider\"\n                    + encode(\n                        \"=github&redirect_after_login=https://redirecturl.com?params=\"\n                            + encode(encode(\"{}\", UTF_8), UTF_8),\n                        UTF_8)));\n    when(oauth2Providers.getAuthenticator(\"github\")).thenReturn(authenticator);\n\n    // when\n    Response callback = embeddedOAuthAPI.callback(uriInfo, emptyList());\n\n    // then\n    assertEquals(callback.getLocation().toString(), \"https://redirecturl.com?params=%7B%7D\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/test/java/org/eclipse/che/security/oauth1/OAuthAuthenticationServiceTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth1;\n\nimport static io.restassured.RestAssured.given;\nimport static java.net.URLEncoder.encode;\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static org.everrest.assured.JettyHttpServer.ADMIN_USER_NAME;\nimport static org.everrest.assured.JettyHttpServer.ADMIN_USER_PASSWORD;\nimport static org.everrest.assured.JettyHttpServer.SECURE_PATH;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport io.restassured.response.Response;\nimport jakarta.ws.rs.core.UriInfo;\nimport java.lang.reflect.Field;\nimport java.net.URI;\nimport java.net.URL;\nimport org.eclipse.che.api.core.rest.Service;\nimport org.everrest.assured.EverrestJetty;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners({EverrestJetty.class, MockitoTestNGListener.class})\npublic class OAuthAuthenticationServiceTest {\n\n  private final String REDIRECT_URI = \"/dashboard\";\n  private final String STATE =\n      \"oauth_provider=test-server&request_method=POST&signature_method=rsa&redirect_after_login=\"\n          + REDIRECT_URI;\n  private final String OAUTH_TOKEN = \"JeZlJxu8bd1ewAmCkG668PCLC5kJ9ne1\";\n  private final String OAUTH_VERIFIER = \"hfdp7dh39dks9884\";\n\n  @Mock private OAuthAuthenticator oAuthAuthenticator;\n\n  @Mock private UriInfo uriInfo;\n\n  @Mock private OAuthAuthenticatorProvider oAuthProvider;\n\n  @InjectMocks private OAuthAuthenticationService oAuthAuthenticationService;\n\n  @Test\n  public void shouldResolveCallbackWithoutError() throws OAuthAuthenticationException {\n    when(oAuthProvider.getAuthenticator(\"test-server\")).thenReturn(oAuthAuthenticator);\n    when(oAuthAuthenticator.callback(any(URL.class))).thenReturn(\"user1\");\n    final Response response =\n        given()\n            .redirects()\n            .follow(false)\n            .queryParam(\"state\", STATE)\n            .queryParam(\"oauth_token\", OAUTH_TOKEN)\n            .queryParam(\"oauth_verifier\", OAUTH_VERIFIER)\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .when()\n            .get(SECURE_PATH + \"/oauth/1.0/callback\");\n    assertEquals(response.statusCode(), 307);\n    assertEquals(response.header(\"Location\"), REDIRECT_URI);\n  }\n\n  @Test\n  public void shouldResolveCallbackWithAccessDeniedError() throws OAuthAuthenticationException {\n    when(oAuthProvider.getAuthenticator(\"test-server\")).thenReturn(oAuthAuthenticator);\n    when(oAuthAuthenticator.callback(any(URL.class)))\n        .thenThrow(new UserDeniedOAuthAuthenticationException(\"Access denied\"));\n    final Response response =\n        given()\n            .redirects()\n            .follow(false)\n            .queryParam(\"state\", STATE)\n            .queryParam(\"oauth_token\", OAUTH_TOKEN)\n            .queryParam(\"oauth_verifier\", \"denied\")\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .when()\n            .get(SECURE_PATH + \"/oauth/1.0/callback\");\n    assertEquals(response.statusCode(), 307);\n    assertEquals(response.header(\"Location\"), REDIRECT_URI + \"?error_code=access_denied\");\n  }\n\n  @Test\n  public void shouldResolveCallbackWithInvalidRequestError() throws OAuthAuthenticationException {\n    when(oAuthProvider.getAuthenticator(\"test-server\")).thenReturn(oAuthAuthenticator);\n    when(oAuthAuthenticator.callback(any(URL.class)))\n        .thenThrow(new OAuthAuthenticationException(\"Invalid request\"));\n    final Response response =\n        given()\n            .redirects()\n            .follow(false)\n            .queryParam(\"state\", STATE)\n            .queryParam(\"oauth_token\", OAUTH_TOKEN)\n            .queryParam(\"oauth_verifier\", OAUTH_VERIFIER)\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .when()\n            .get(SECURE_PATH + \"/oauth/1.0/callback\");\n    assertEquals(response.statusCode(), 307);\n    assertEquals(response.header(\"Location\"), REDIRECT_URI + \"?error_code=invalid_request\");\n  }\n\n  @Test\n  public void shouldEncodeRedirectUrl() throws Exception {\n    // given\n    Field uriInfoField = Service.class.getDeclaredField(\"uriInfo\");\n    uriInfoField.setAccessible(true);\n    uriInfoField.set(oAuthAuthenticationService, uriInfo);\n    when(uriInfo.getRequestUri())\n        .thenReturn(\n            new URI(\n                \"http://eclipse.che?state=oauth_provider\"\n                    + encode(\n                        \"=bitbucket-server&redirect_after_login=https://redirecturl.com?params=\"\n                            + encode(\"{}\", UTF_8),\n                        UTF_8)));\n    when(oAuthProvider.getAuthenticator(\"bitbucket-server\"))\n        .thenReturn(mock(OAuthAuthenticator.class));\n\n    // when\n    jakarta.ws.rs.core.Response callback = oAuthAuthenticationService.callback();\n\n    // then\n    assertEquals(callback.getLocation().toString(), \"https://redirecturl.com?params%3D%7B%7D\");\n  }\n\n  @Test\n  public void shouldNotEncodeRedirectUrl() throws Exception {\n    // given\n    Field uriInfoField = Service.class.getDeclaredField(\"uriInfo\");\n    uriInfoField.setAccessible(true);\n    uriInfoField.set(oAuthAuthenticationService, uriInfo);\n    when(uriInfo.getRequestUri())\n        .thenReturn(\n            new URI(\n                \"http://eclipse.che?state=oauth_provider\"\n                    + encode(\n                        \"=bitbucket-server&redirect_after_login=https://redirecturl.com?params=\"\n                            + encode(encode(\"{}\", UTF_8), UTF_8),\n                        UTF_8)));\n    when(oAuthProvider.getAuthenticator(\"bitbucket-server\"))\n        .thenReturn(mock(OAuthAuthenticator.class));\n\n    // when\n    jakarta.ws.rs.core.Response callback = oAuthAuthenticationService.callback();\n\n    // then\n    assertEquals(callback.getLocation().toString(), \"https://redirecturl.com?params=%7B%7D\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/test/java/org/eclipse/che/security/oauth1/OAuthAuthenticatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth1;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.post;\nimport static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.verify;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertThrows;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport org.testng.annotations.AfterClass;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.Test;\n\npublic class OAuthAuthenticatorTest {\n  private final String TEST_URI = \"https://test-server\";\n  private final String STATE =\n      \"oauth_provider=test-server&request_method=POST&signature_method=rsa&userId=user1\";\n  private final String OAUTH_TOKEN = \"JeZlJxu8bd1ewAmCkG668PCLC5kJ9ne1\";\n  private OAuthAuthenticator oAuthAuthenticator;\n  private WireMockServer wireMockServer;\n\n  @BeforeClass\n  void start() {\n    wireMockServer = new WireMockServer(wireMockConfig().dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n\n    oAuthAuthenticator =\n        new OAuthAuthenticator(\n            \"test-server\",\n            null,\n            wireMockServer.baseUrl() + \"/access\",\n            null,\n            null,\n            null,\n            \"MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDZvr2tssVQ46qE1UBK1DFRZrKuIBMCL5q+cltLAVJZ7dlsdv2Yr5mgt3il2BQa0CSmwxTsMdwYqRIDchroVREs5IAfcwOFAL6OnMos/8AEg8Gamnz/Fu1/968bmlV/abKfrdlfkUNuOtpzG5PCf8UAQEt0ajMtFWKFeXPl527BTwRqz1rRVU/wqDC3nS6PM335XCr6mjdBzFDMUC1M91l34M6wPJVPcDRi3cQDb1+YMrFmuzloEs6nlUtM9gH4t9SD9bmBOOj5M7lo3jMuNJ+tE/5M/wrjs1BYbFiUKL3n/BKdyPHpGDssFwo25UBvJWPZZ/YFu6HTD85uUfsbDuTlAgMBAAECggEAA0hY27GCQAHupCoC2h3w0GVX9EAPiUzmbFCVB8BxWWG4kWYJ1K9xBXc+nmFvjCfvJYRzYEwwIT8LQnoJ5c7Cf4bCV7cIKo0kUkoS0jLY1jiWRpploALceb1mKmhdOZqCUt3wFPy/o33HpUyZIamDcsmFWa/wLZHQ9moqUSD4Dnn3Wy6mLyipQDC8LIjPQceuU96VGbZa/XJR8sVMulpgUHvQRzr9PZ1tw4yAK+tcg3rfx4XT6qZS64o4mYrNGYO3QBH3AMUZl1BVG9Q2SlrUM+RGlS5c3DYsFCD40yDBCJIvW1Tfoc4nuDn71rgDEQUZzZlP9X6q1Eh8karaHCrEAQKBgQD16HUcfEd+asDa80BZm3U9Rp0lI1JIfrF/AWR6RR1rldnZOGnQD4untYSZF8vpGdSN5t26szYGJQz9SZl1dtz5sQsyXY9TrGnSf/byoy8yJ6FU3IRaIfoxiAV1fL/QxLsyDls4G5OF9kCu4u2IDKPgDQnb1x9Kq8dQHIyB44eWJQKBgQDirmZToQNZE2GKS+GMxFeeGBTLuV2ED3YuyhRAE3v1bvMRsxcNpMWeCxPMfu8Ctn51yxvTkhRYF3vUz7HjfHYfSMFPf+DwZjOCVWMTT6d8XOcjXIq+mY2Dyek7Kagbbx2oMyBC9HCe0/iK0nOhUNfYFi8PFyDrosvmcQO3qEX3wQKBgG/+5xeKIqWYySzvDKfC/apitr9rTtZlnUFSyQhG4hdVsFoWL1rrOZewPCvdgqkvcncOZn3ZkQlLZpcVJicxc4Lk90yA//4D0E5mqXnoiF43Xmrf5AeI4gIdCR9xKYtTjk5F65WqOY4RkXQVNkl4OEqapZrSZxYDFkuONRATKHVhAoGAQSku4wVa6AUpOc78RDHAmgKEH9fmKOsk5uhSD+VJ8dB18PWRP+vIntjCVTt7y0TYb1X2ZsgMLxJ5F0Co+yKw9ec9InQ5HgHS9rlC5K82DwrJqqGUhJuxUVv+PnKID3LOjKY9tOF9ajq2rHk4ofuSQFyIJIdagEHo6RI9plKp4kECgYAtVUUoXAn5EKLuNVPzlnH+E+iBco0WaQGtsWhIlu6RVhSwJNrldxMFIuWzG56RoFV5tu+KA05RZx82cbazcJJVfwn7S6rmHCdxri3bjpnwgNHmY9E9cxBsEBW2DIYTyI8tbEytbH8syYPGSxb5+VIZEuP+8qel12mVfcoNl/oCCw==\") {\n          @Override\n          public String getOAuthProvider() {\n            return null;\n          }\n\n          @Override\n          public String getLocalAuthenticateUrl() {\n            return null;\n          }\n\n          @Override\n          public String getEndpointUrl() {\n            return null;\n          }\n        };\n  }\n\n  @AfterClass\n  void stop() {\n    if (wireMockServer != null) {\n      wireMockServer.stop();\n    }\n  }\n\n  @Test\n  public void shouldResolveCallbackWithUserId()\n      throws MalformedURLException, OAuthAuthenticationException {\n    URL requestURL =\n        UriBuilder.fromUri(TEST_URI)\n            .queryParam(\"state\", STATE)\n            .queryParam(\"oauth_token\", OAUTH_TOKEN)\n            .queryParam(\"oauth_verifier\", \"hfdp7dh39dks9884\")\n            .build()\n            .toURL();\n    stubFor(\n        post(urlPathEqualTo(\"/access\"))\n            .willReturn(\n                aResponse()\n                    .withBody(\"oauth_token=ab3cd9j4ks73hf7g&oauth_token_secret=xyz4992k83j47x0b\")));\n\n    String user = oAuthAuthenticator.callback(requestURL);\n    verify(postRequestedFor(urlPathEqualTo(\"/access\")));\n    assertEquals(\"user1\", user);\n  }\n\n  @Test\n  public void shouldThrowUserDeniedOAuthAuthenticationException() throws MalformedURLException {\n    URL requestURL =\n        UriBuilder.fromUri(TEST_URI)\n            .queryParam(\"state\", STATE)\n            .queryParam(\"oauth_token\", OAUTH_TOKEN)\n            .queryParam(\"oauth_verifier\", \"denied\")\n            .build()\n            .toURL();\n    assertThrows(\n        UserDeniedOAuthAuthenticationException.class,\n        () -> oAuthAuthenticator.callback(requestURL));\n  }\n\n  @Test\n  public void shouldThrowOAuthAuthenticationException() throws MalformedURLException {\n    URL requestURL =\n        UriBuilder.fromUri(TEST_URI)\n            .queryParam(\"state\", STATE)\n            .queryParam(\"oauth_token\", OAUTH_TOKEN)\n            .build()\n            .toURL();\n    assertThrows(OAuthAuthenticationException.class, () -> oAuthAuthenticator.callback(requestURL));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <appender name=\"file\" class=\"ch.qos.logback.core.FileAppender\">\n        <File>target/log/codenvy-factory-commons.log</File>\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <!--logger name=\"com.codenvy.factory\" level=\"DEBUG\"/-->\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n        <appender-ref ref=\"file\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-azure-devops/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-auth-azure-devops</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Authentication Azure DevOps</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.http-client</groupId>\n            <artifactId>google-http-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.oauth-client</groupId>\n            <artifactId>google-oauth-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-azure-devops/src/main/java/org/eclipse/che/security/oauth/AzureDevOpsModule.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\n\n/**\n * Setup AzureDevOpsOAuthAuthenticator in guice container.\n *\n * @author Anatolii Bazko\n */\npublic class AzureDevOpsModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    Multibinder<OAuthAuthenticator> oAuthAuthenticators =\n        Multibinder.newSetBinder(binder(), OAuthAuthenticator.class);\n    oAuthAuthenticators.addBinding().toProvider(AzureDevOpsOAuthAuthenticatorProvider.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-azure-devops/src/main/java/org/eclipse/che/security/oauth/AzureDevOpsOAuthAuthenticator.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static java.lang.String.format;\nimport static java.net.URLEncoder.encode;\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static org.eclipse.che.commons.json.JsonHelper.fromJson;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.google.api.client.auth.oauth2.AuthorizationCodeRequestUrl;\nimport com.google.api.client.auth.oauth2.AuthorizationCodeTokenRequest;\nimport com.google.api.client.auth.oauth2.Credential;\nimport com.google.api.client.auth.oauth2.TokenResponse;\nimport com.google.api.client.util.store.MemoryDataStoreFactory;\nimport com.google.common.io.CharStreams;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.net.URI;\nimport java.net.URL;\nimport java.net.URLEncoder;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.util.Collections;\nimport java.util.List;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.commons.json.JsonParseException;\n\n/**\n * OAuth2 authenticator for Azure DevOps Service.\n *\n * @author Anatolii Bazko\n */\n@Singleton\npublic class AzureDevOpsOAuthAuthenticator extends OAuthAuthenticator {\n  private final String azureDevOpsScmApiEndpoint;\n  private final String cheApiEndpoint;\n  private final String azureDevOpsUserProfileDataApiUrl;\n  private final String tokenUri;\n  private final String[] redirectUris;\n  private final String API_VERSION = \"7.0\";\n  private final String PROVIDER_NAME = \"azure-devops\";\n  private final String clientId;\n  private final String clientSecret;\n  private final boolean isDevOpsOauth;\n\n  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();\n\n  public AzureDevOpsOAuthAuthenticator(\n      String cheApiEndpoint,\n      String clientId,\n      String clientSecret,\n      String azureDevOpsApiEndpoint,\n      String azureDevOpsScmApiEndpoint,\n      String authUri,\n      String tokenUri,\n      String[] redirectUris,\n      boolean isDevOpsOauth)\n      throws IOException {\n    this.cheApiEndpoint = cheApiEndpoint;\n    this.clientId = clientId;\n    this.clientSecret = clientSecret;\n    this.azureDevOpsScmApiEndpoint = trimEnd(azureDevOpsScmApiEndpoint, '/');\n    this.azureDevOpsUserProfileDataApiUrl =\n        format(\n            \"%s/_apis/profile/profiles/me?api-version=%s\",\n            trimEnd(azureDevOpsApiEndpoint, '/'), API_VERSION);\n    this.tokenUri = tokenUri;\n    this.redirectUris = redirectUris;\n    this.isDevOpsOauth = isDevOpsOauth;\n    configure(\n        clientId, clientSecret, redirectUris, authUri, tokenUri, new MemoryDataStoreFactory());\n  }\n\n  /**\n   * Returns the URL to redirect the user to in order to authenticate. Sets the {@code\n   * response_type} to {@code redirect_uri} accordingly the Azure DevOps OAuth docs. See details at:\n   *\n   * <p>https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?toc=%2Fazure%2Fdevops%2Fmarketplace-extensibility%2Ftoc.json&view=azure-devops#2-authorize-your-app.\n   */\n  @Override\n  public String getAuthenticateUrl(URL requestUrl, List<String> scopes) {\n    if (isDevOpsOauth) {\n      scopes = Collections.singletonList(\"vso.code_write\");\n    }\n    AuthorizationCodeRequestUrl url = flow.newAuthorizationUrl().setScopes(scopes);\n    if (isDevOpsOauth) {\n      url.set(\"response_type\", \"Assertion\");\n    } else {\n      url.set(\"response_type\", \"code\");\n    }\n    url.set(\"redirect_uri\", format(\"%s/oauth/callback\", cheApiEndpoint));\n    url.setState(prepareState(requestUrl));\n    return url.build();\n  }\n\n  @Override\n  public final String getOAuthProvider() {\n    return PROVIDER_NAME;\n  }\n\n  @Override\n  public OAuthToken getOrRefreshToken(String userId) throws IOException {\n    final OAuthToken token = super.getOrRefreshToken(userId);\n    try {\n      // check if user's token is valid by requesting user profile data\n      if (token == null\n          || token.getToken() == null\n          || token.getToken().isEmpty()\n          || getUserProfile(token.getToken()) == null) {\n        return null;\n      }\n    } catch (OAuthAuthenticationException e) {\n      return null;\n    }\n    return token;\n  }\n\n  public String getEndpointUrl() {\n    return azureDevOpsScmApiEndpoint;\n  }\n\n  private AzureDevOpsUserProfile getUserProfile(String accessToken)\n      throws OAuthAuthenticationException {\n    HttpClient client = HttpClient.newHttpClient();\n    HttpRequest request =\n        HttpRequest.newBuilder(URI.create(azureDevOpsUserProfileDataApiUrl))\n            .header(\"Authorization\", \"Bearer \" + accessToken)\n            .build();\n\n    try {\n      HttpResponse<InputStream> response =\n          client.send(request, HttpResponse.BodyHandlers.ofInputStream());\n      return fromJson(response.body(), AzureDevOpsUserProfile.class, null);\n    } catch (IOException | InterruptedException | JsonParseException e) {\n      throw new OAuthAuthenticationException(e.getMessage(), e);\n    }\n  }\n\n  private HttpRequest.BodyPublisher getParamsUrlEncoded(String refreshToken) {\n    String urlEncoded =\n        format(\n            \"client_assertion_type=%1s&\"\n                + \"client_assertion=%2s&\"\n                + \"grant_type=refresh_token&\"\n                + \"assertion=%3s&\"\n                + \"redirect_uri=%4s\",\n            encode(\"urn:ietf:params:oauth:client-assertion-type:jwt-bearer\", UTF_8),\n            encode(clientSecret, UTF_8),\n            refreshToken,\n            redirectUris[0]);\n    return HttpRequest.BodyPublishers.ofString(urlEncoded);\n  }\n\n  /**\n   * Refresh personal access token.\n   *\n   * @param userId user identifier\n   * @return a refreshed token object or the previous token if the refresh failed\n   * @throws IOException when error occurs during token loading\n   */\n  public OAuthToken refreshToken(String userId) throws IOException {\n    if (!isConfigured()) {\n      throw new IOException(AUTHENTICATOR_IS_NOT_CONFIGURED);\n    }\n\n    Credential credential = flow.loadCredential(userId);\n    if (credential == null) {\n      return null;\n    }\n    HttpClient client = HttpClient.newHttpClient();\n    HttpRequest request =\n        HttpRequest.newBuilder(URI.create(tokenUri))\n            .POST(getParamsUrlEncoded(credential.getRefreshToken()))\n            .headers(\"Content-Type\", \"application/x-www-form-urlencoded\")\n            .build();\n    try {\n      HttpResponse<InputStream> response =\n          client.send(request, HttpResponse.BodyHandlers.ofInputStream());\n      AzureDevOpsRefreshToken token =\n          OBJECT_MAPPER.readValue(\n              CharStreams.toString(new InputStreamReader(response.body(), UTF_8)),\n              AzureDevOpsRefreshToken.class);\n      String accessToken = token.getAccessToken();\n      credential.setAccessToken(accessToken);\n      return newDto(OAuthToken.class).withToken(accessToken);\n    } catch (IOException | InterruptedException exception) {\n      return newDto(OAuthToken.class).withToken(credential.getAccessToken());\n    }\n  }\n\n  /**\n   * Returns the token request. Overrides the default implementation to set the {@code grant_type},\n   * {@code assertion}, {@code client_assertion} and {@code client_assertion_type} accordingly to\n   * Azure DevOps OAuth docs. See details at:\n   *\n   * <p>https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?toc=%2Fazure%2Fdevops%2Fmarketplace-extensibility%2Ftoc.json&view=azure-devops#3-get-an-access-and-refresh-token-for-the-user\n   */\n  @Override\n  protected AuthorizationCodeTokenRequest getAuthorizationCodeTokenRequest(\n      URL requestUrl, List<String> scopes, String code) {\n    AuthorizationCodeTokenRequest request =\n        super.getAuthorizationCodeTokenRequest(requestUrl, scopes, code);\n    if (isDevOpsOauth) {\n      request.set(\"grant_type\", \"urn:ietf:params:oauth:grant-type:jwt-bearer\");\n      request.set(\"assertion\", code);\n      request.set(\"client_assertion\", clientSecret);\n      request.set(\n          \"client_assertion_type\", \"urn:ietf:params:oauth:client-assertion-type:jwt-bearer\");\n      request.setResponseClass(AzureDevOpsTokenResponse.class);\n    } else {\n      request.set(\"client_id\", clientId);\n      request.set(\"grant_type\", \"authorization_code\");\n      request.set(\"client_secret\", URLEncoder.encode(clientSecret));\n      request.setResponseClass(TokenResponse.class);\n    }\n    return request;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-azure-devops/src/main/java/org/eclipse/che/security/oauth/AzureDevOpsOAuthAuthenticatorProvider.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Azure DevOps Service Authenticator provider.\n *\n * @author Anatolii Bazko\n */\n@Singleton\npublic class AzureDevOpsOAuthAuthenticatorProvider implements Provider<OAuthAuthenticator> {\n  private static final Logger LOG =\n      LoggerFactory.getLogger(AzureDevOpsOAuthAuthenticatorProvider.class);\n  private final OAuthAuthenticator authenticator;\n\n  @Inject\n  public AzureDevOpsOAuthAuthenticatorProvider(\n      @Named(\"che.api\") String cheApiEndpoint,\n      @Nullable @Named(\"che.oauth2.azure.devops.tenantid_filepath\") String azureDevOpsTennantIdPath,\n      @Nullable @Named(\"che.oauth2.azure.devops.clientid_filepath\") String azureDevOpsClientIdPath,\n      @Nullable @Named(\"che.oauth2.azure.devops.clientsecret_filepath\")\n          String azureDevOpsClientSecretPath,\n      @Named(\"che.integration.azure.devops.api_endpoint\") String azureDevOpsApiEndpoint,\n      @Named(\"che.integration.azure.devops.scm.api_endpoint\") String azureDevOpsScmApiEndpoint,\n      @Named(\"che.oauth.azure.devops.authuri.template\") String authUri,\n      @Named(\"che.oauth.azure.devops.tokenuri.template\") String tokenUri,\n      @Named(\"che.oauth.azure.devops.redirecturis\") String[] redirectUris)\n      throws IOException {\n    authenticator =\n        getOAuthAuthenticator(\n            cheApiEndpoint,\n            azureDevOpsTennantIdPath,\n            azureDevOpsClientIdPath,\n            azureDevOpsClientSecretPath,\n            azureDevOpsApiEndpoint,\n            azureDevOpsScmApiEndpoint,\n            authUri,\n            tokenUri,\n            redirectUris);\n    LOG.debug(\"{} Azure DevOps OAuth Authenticator is used.\", authenticator);\n  }\n\n  @Override\n  public OAuthAuthenticator get() {\n    return authenticator;\n  }\n\n  private OAuthAuthenticator getOAuthAuthenticator(\n      String cheApiEndpoint,\n      String tenantIdPath,\n      String clientIdPath,\n      String clientSecretPath,\n      String azureDevOpsApiEndpoint,\n      String azureDevOpsScmApiEndpoint,\n      String authUriTemplate,\n      String tokenUriTemplate,\n      String[] redirectUris)\n      throws IOException {\n\n    if (!isNullOrEmpty(clientIdPath)\n        && !isNullOrEmpty(clientSecretPath)\n        && !isNullOrEmpty(tenantIdPath)) {\n      // This flag is needed to support the deprecated Azure DevOps oauth apps.\n      // TODO remove the related logic when the deprecated Azure DevOps oauth app is no longer\n      // available, see\n      // https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops#azure-devops-oauth-deprecated\n      boolean isDevOpsOauth = false;\n      String tenantId = null;\n      try {\n        tenantId = Files.readString(Path.of(tenantIdPath)).trim();\n      } catch (IOException e) {\n        isDevOpsOauth = true;\n      }\n      final String clientId = Files.readString(Path.of(clientIdPath)).trim();\n      final String clientSecret = Files.readString(Path.of(clientSecretPath)).trim();\n      if (!isNullOrEmpty(clientId) && !isNullOrEmpty(clientSecret)) {\n        return new AzureDevOpsOAuthAuthenticator(\n            cheApiEndpoint,\n            clientId,\n            clientSecret,\n            azureDevOpsApiEndpoint,\n            azureDevOpsScmApiEndpoint,\n            isDevOpsOauth\n                ? \"https://app.vssps.visualstudio.com/oauth2/authorize\"\n                : String.format(authUriTemplate, tenantId),\n            isDevOpsOauth\n                ? \"https://app.vssps.visualstudio.com/oauth2/authorize\"\n                : String.format(tokenUriTemplate, tenantId),\n            redirectUris,\n            isDevOpsOauth);\n      }\n    }\n    return new NoopOAuthAuthenticator();\n  }\n\n  static class NoopOAuthAuthenticator extends OAuthAuthenticator {\n    @Override\n    public String getOAuthProvider() {\n      return \"Noop\";\n    }\n\n    @Override\n    public String getEndpointUrl() {\n      return \"Noop\";\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-azure-devops/src/main/java/org/eclipse/che/security/oauth/AzureDevOpsRefreshToken.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport java.util.Objects;\n\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class AzureDevOpsRefreshToken {\n  /** Access token issued by the authorization server. */\n  private String accessToken;\n\n  /** Token type. */\n  private String tokenType;\n\n  /** Refresh token which can be used to obtain new access tokens. */\n  private String refreshToken;\n\n  /**\n   * Lifetime in seconds of the access token (for example 3600 for an hour) or {@code null} for\n   * none.\n   */\n  private String expiresInSeconds;\n\n  /** Scope of the access token. */\n  private String scope;\n\n  public String getAccessToken() {\n    return accessToken;\n  }\n\n  public String getTokenType() {\n    return tokenType;\n  }\n\n  public String getRefreshToken() {\n    return refreshToken;\n  }\n\n  public String getScope() {\n    return scope;\n  }\n\n  public String getExpiresInSeconds() {\n    return expiresInSeconds;\n  }\n\n  @JsonProperty(\"access_token\")\n  public void setAccessToken(String accessToken) {\n    this.accessToken = accessToken;\n  }\n\n  @JsonProperty(\"token_type\")\n  public void setTokenType(String tokenType) {\n    this.tokenType = tokenType;\n  }\n\n  @JsonProperty(\"refresh_token\")\n  public void setRefreshToken(String refreshToken) {\n    this.refreshToken = refreshToken;\n  }\n\n  @JsonProperty(\"expires_in\")\n  public void setExpiresInSeconds(String expiresInSeconds) {\n    this.expiresInSeconds = expiresInSeconds;\n  }\n\n  public void setScope(String scope) {\n    this.scope = scope;\n  }\n\n  @Override\n  public String toString() {\n    return \"AzureDevOpsRefreshToken{\"\n        + \"accessToken='\"\n        + accessToken\n        + '\\''\n        + \", tokenType='\"\n        + tokenType\n        + '\\''\n        + \", refreshToken='\"\n        + refreshToken\n        + '\\''\n        + \", expiresInSeconds='\"\n        + expiresInSeconds\n        + '\\''\n        + \", scope='\"\n        + scope\n        + '\\''\n        + '}';\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) return true;\n    if (o == null || getClass() != o.getClass()) return false;\n    AzureDevOpsRefreshToken that = (AzureDevOpsRefreshToken) o;\n    return Objects.equals(accessToken, that.accessToken)\n        && Objects.equals(tokenType, that.tokenType)\n        && Objects.equals(refreshToken, that.refreshToken)\n        && Objects.equals(expiresInSeconds, that.expiresInSeconds)\n        && Objects.equals(scope, that.scope);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(accessToken, tokenType, refreshToken, expiresInSeconds, scope);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-azure-devops/src/main/java/org/eclipse/che/security/oauth/AzureDevOpsTokenResponse.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport com.google.api.client.auth.oauth2.TokenResponse;\nimport com.google.api.client.json.JsonString;\nimport com.google.api.client.util.Key;\n\n/**\n * The only difference between from {@link TokenResponse} is that {@link #expiresInSeconds} field is\n * represented in a {@link String} format.\n *\n * <p>https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops#response---authorize-app\n *\n * @author Anatolii Bazko\n */\npublic class AzureDevOpsTokenResponse extends TokenResponse {\n  @JsonString\n  @Key(\"expires_in\")\n  private Long expiresInSeconds;\n\n  public Long getExpiresInSeconds() {\n    return expiresInSeconds;\n  }\n\n  public AzureDevOpsTokenResponse setExpiresInSeconds(Long expiresInSeconds) {\n    this.expiresInSeconds = expiresInSeconds;\n    return this;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-azure-devops/src/main/java/org/eclipse/che/security/oauth/AzureDevOpsUserProfile.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\n\npackage org.eclipse.che.security.oauth;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\n\n/**\n * Represents Azure DevOps user profile data. See details at:\n * https://learn.microsoft.com/en-us/rest/api/azure/devops/profile/profiles/get?view=azure-devops-rest-7.0&tabs=HTTP#profile\n *\n * @author Anatolii Bazko\n */\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class AzureDevOpsUserProfile {\n  private String id;\n\n  public String getId() {\n    return id;\n  }\n\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  @Override\n  public String toString() {\n    return \"AzureDevOpsUserProfile{\" + \"id='\" + id + '\\'' + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-bitbucket/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-auth-bitbucket</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Authentication Bitbucket</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.http-client</groupId>\n            <artifactId>google-http-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.oauth-client</groupId>\n            <artifactId>google-oauth-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.wiremock</groupId>\n            <artifactId>wiremock-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/BitbucketModule.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\nimport org.eclipse.che.security.oauth.BitbucketOAuthAuthenticatorProvider;\nimport org.eclipse.che.security.oauth1.BitbucketServerOAuthAuthenticatorProvider;\nimport org.eclipse.che.security.oauth1.OAuthAuthenticator;\n\n/**\n * Setup BitbucketServerOAuthAuthenticator in guice container.\n *\n * @author Sergii Kabashniuk\n */\npublic class BitbucketModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    Multibinder<OAuthAuthenticator> oAuth1Authenticators =\n        Multibinder.newSetBinder(binder(), OAuthAuthenticator.class);\n    oAuth1Authenticators.addBinding().toProvider(BitbucketServerOAuthAuthenticatorProvider.class);\n    Multibinder<org.eclipse.che.security.oauth.OAuthAuthenticator> oAuth2Authenticators =\n        Multibinder.newSetBinder(binder(), org.eclipse.che.security.oauth.OAuthAuthenticator.class);\n    oAuth2Authenticators.addBinding().toProvider(BitbucketOAuthAuthenticatorProvider.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth/BitbucketOAuthAuthenticator.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.net.URLEncoder.encode;\nimport static java.nio.charset.StandardCharsets.UTF_8;\n\nimport com.google.api.client.auth.oauth2.AuthorizationCodeRequestUrl;\nimport com.google.api.client.util.store.MemoryDataStoreFactory;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.List;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\n\n/** OAuth authentication for BitBucket SAAS account. */\n@Singleton\npublic class BitbucketOAuthAuthenticator extends OAuthAuthenticator {\n  private final String bitbucketEndpoint;\n\n  private static final String BITBUCKET_CLOUD_ENDPOINT = \"https://bitbucket.org\";\n  private static final String BITBUCKET_NAME = \"bitbucket\";\n  private static final String BITBUCKET_SERVER_NAME = \"bitbucket-server\";\n\n  public BitbucketOAuthAuthenticator(\n      String bitbucketEndpoint,\n      String clientId,\n      String clientSecret,\n      String[] redirectUris,\n      String authUri,\n      String tokenUri)\n      throws IOException {\n    this.bitbucketEndpoint = bitbucketEndpoint;\n    configure(\n        clientId, clientSecret, redirectUris, authUri, tokenUri, new MemoryDataStoreFactory());\n  }\n\n  @Override\n  public String getAuthenticateUrl(URL requestUrl, List<String> scopes) {\n    AuthorizationCodeRequestUrl url = flow.newAuthorizationUrl().setScopes(scopes);\n    String state = prepareState(requestUrl);\n    // Although the state is encoded in the OAuthAuthenticator class, we need to additionally encode\n    // it because Bitbucket Server decodes it on callback request.\n    url.setState(BITBUCKET_CLOUD_ENDPOINT.equals(bitbucketEndpoint) ? state : encode(state, UTF_8));\n    url.set(\"redirect_uri\", findRedirectUrl(requestUrl));\n    return url.build();\n  }\n\n  @Override\n  public final String getOAuthProvider() {\n    // Bitbucket Cloud and Bitbucket Server have different provider names.\n    return BITBUCKET_CLOUD_ENDPOINT.equals(bitbucketEndpoint)\n        ? BITBUCKET_NAME\n        : BITBUCKET_SERVER_NAME;\n  }\n\n  @Override\n  public OAuthToken getOrRefreshToken(String userId) throws IOException {\n    final OAuthToken token = super.getOrRefreshToken(userId);\n    // Need to check if token is valid for requests, if valid - return it to caller.\n    try {\n      if (token == null || isNullOrEmpty(token.getToken())) {\n        return null;\n      }\n      testRequest(getTestRequestUrl(), token.getToken());\n    } catch (OAuthAuthenticationException e) {\n      return null;\n    }\n    return token;\n  }\n\n  /**\n   * Generate an API request URL, to use for a token validation.\n   *\n   * @return Bitbucket Cloud or Server API request URL\n   */\n  private String getTestRequestUrl() {\n    return BITBUCKET_CLOUD_ENDPOINT.equals(bitbucketEndpoint)\n        ? \"https://api.bitbucket.org/2.0/user\"\n        : bitbucketEndpoint + \"/plugins/servlet/applinks/whoami\";\n  }\n\n  @Override\n  public String getEndpointUrl() {\n    return bitbucketEndpoint;\n  }\n\n  private void testRequest(String requestUrl, String accessToken)\n      throws OAuthAuthenticationException {\n    HttpURLConnection urlConnection = null;\n    InputStream urlInputStream = null;\n    String result;\n    try {\n      urlConnection = (HttpURLConnection) new URL(requestUrl).openConnection();\n      urlConnection.setRequestProperty(\"Authorization\", \"Bearer \" + accessToken);\n      urlInputStream = urlConnection.getInputStream();\n      result = new String(urlInputStream.readAllBytes(), UTF_8);\n    } catch (IOException e) {\n      throw new OAuthAuthenticationException(e.getMessage(), e);\n    } finally {\n      if (urlInputStream != null) {\n        try {\n          urlInputStream.close();\n        } catch (IOException ignored) {\n        }\n      }\n\n      if (urlConnection != null) {\n        urlConnection.disconnect();\n      }\n    }\n    if (isNullOrEmpty(result)) {\n      throw new OAuthAuthenticationException(\"Empty response from Bitbucket Server API\");\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth/BitbucketOAuthAuthenticatorProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.util.Objects;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Provides implementation of BitBucket {@link OAuthAuthenticator} based on available configuration.\n */\n@Singleton\npublic class BitbucketOAuthAuthenticatorProvider implements Provider<OAuthAuthenticator> {\n  private static final Logger LOG =\n      LoggerFactory.getLogger(BitbucketOAuthAuthenticatorProvider.class);\n  private final OAuthAuthenticator authenticator;\n\n  @Inject\n  public BitbucketOAuthAuthenticatorProvider(\n      @Named(\"che.oauth.bitbucket.endpoint\") String oauthEndpoint,\n      @Nullable @Named(\"che.oauth2.bitbucket.clientid_filepath\") String bitbucketClientIdPath,\n      @Nullable @Named(\"che.oauth2.bitbucket.clientsecret_filepath\")\n          String bitbucketClientSecretPath,\n      @Nullable @Named(\"che.oauth.bitbucket.redirecturis\") String[] redirectUris,\n      @Nullable @Named(\"che.oauth.bitbucket.authuri\") String authUri,\n      @Nullable @Named(\"che.oauth.bitbucket.tokenuri\") String tokenUri)\n      throws IOException {\n    authenticator =\n        getOAuthAuthenticator(\n            oauthEndpoint,\n            bitbucketClientIdPath,\n            bitbucketClientSecretPath,\n            redirectUris,\n            authUri,\n            tokenUri);\n    LOG.debug(\"{} Bitbucket OAuth Authenticator is used.\", authenticator);\n  }\n\n  @Override\n  public OAuthAuthenticator get() {\n    return authenticator;\n  }\n\n  private OAuthAuthenticator getOAuthAuthenticator(\n      String oauthEndpoint,\n      @Nullable String clientIdPath,\n      @Nullable String clientSecretPath,\n      @Nullable String[] redirectUris,\n      @Nullable String authUri,\n      @Nullable String tokenUri)\n      throws IOException {\n\n    if (!isNullOrEmpty(clientIdPath)\n        && !isNullOrEmpty(clientSecretPath)\n        && !isNullOrEmpty(authUri)\n        && !isNullOrEmpty(tokenUri)\n        && Objects.nonNull(redirectUris)\n        && redirectUris.length != 0) {\n      String trimmedOauthEndpoint = trimEnd(oauthEndpoint, '/');\n      boolean isBitbucketCloud = trimmedOauthEndpoint.equals(\"https://bitbucket.org\");\n      authUri = isBitbucketCloud ? authUri : trimmedOauthEndpoint + \"/rest/oauth2/1.0/authorize\";\n      tokenUri = isBitbucketCloud ? tokenUri : trimmedOauthEndpoint + \"/rest/oauth2/1.0/token\";\n      final String clientId = Files.readString(Path.of(clientIdPath)).trim();\n      final String clientSecret = Files.readString(Path.of(clientSecretPath)).trim();\n      if (!isNullOrEmpty(clientId) && !isNullOrEmpty(clientSecret)) {\n        return new BitbucketOAuthAuthenticator(\n            trimmedOauthEndpoint, clientId, clientSecret, redirectUris, authUri, tokenUri);\n      }\n    }\n    return new NoopOAuthAuthenticator();\n  }\n\n  static class NoopOAuthAuthenticator extends OAuthAuthenticator {\n    @Override\n    public String getOAuthProvider() {\n      return \"Noop\";\n    }\n\n    @Override\n    public String getEndpointUrl() {\n      return \"Noop\";\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth/BitbucketUser.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport org.eclipse.che.security.oauth.shared.User;\n\n/** Represents Bitbucket user. */\npublic class BitbucketUser implements User {\n\n  private String name;\n  private String id;\n\n  @Override\n  public String getId() {\n    return id;\n  }\n\n  @Override\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  @Override\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public String getEmail() {\n    return \"email\";\n  }\n\n  @Override\n  public void setEmail(String email) {}\n\n  public void setUsername(String name) {\n    this.name = name;\n  }\n\n  public void setAccount_id(String id) {\n    this.id = id;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth1/BitbucketServerOAuthAuthenticator.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth1;\n\nimport com.google.inject.Singleton;\n\n/**\n * OAuth1 authentication for Bitbucket Server account.\n *\n * @author Igor Vinokur\n */\n@Singleton\npublic class BitbucketServerOAuthAuthenticator extends OAuthAuthenticator {\n  public static final String AUTHENTICATOR_NAME = \"bitbucket-server\";\n  private final String bitbucketEndpoint;\n  private final String apiEndpoint;\n\n  public BitbucketServerOAuthAuthenticator(\n      String consumerKey, String privateKey, String bitbucketEndpoint, String apiEndpoint) {\n    super(\n        consumerKey,\n        bitbucketEndpoint + \"/plugins/servlet/oauth/request-token\",\n        bitbucketEndpoint + \"/plugins/servlet/oauth/access-token\",\n        bitbucketEndpoint + \"/plugins/servlet/oauth/authorize\",\n        apiEndpoint + \"/oauth/1.0/callback\",\n        null,\n        privateKey);\n    this.bitbucketEndpoint = bitbucketEndpoint;\n    this.apiEndpoint = apiEndpoint;\n  }\n\n  @Override\n  public final String getOAuthProvider() {\n    return AUTHENTICATOR_NAME;\n  }\n\n  @Override\n  public String getLocalAuthenticateUrl() {\n    return apiEndpoint\n        + \"/oauth/1.0/authenticate?oauth_provider=\"\n        + AUTHENTICATOR_NAME\n        + \"&request_method=POST&signature_method=rsa\";\n  }\n\n  @Override\n  public String getEndpointUrl() {\n    return bitbucketEndpoint;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth1/BitbucketServerOAuthAuthenticatorProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth1;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n@Singleton\npublic class BitbucketServerOAuthAuthenticatorProvider implements Provider<OAuthAuthenticator> {\n  private static final Logger LOG =\n      LoggerFactory.getLogger(BitbucketServerOAuthAuthenticatorProvider.class);\n\n  private final OAuthAuthenticator authenticator;\n\n  @Inject\n  public BitbucketServerOAuthAuthenticatorProvider(\n      @Nullable @Named(\"che.oauth1.bitbucket.consumerkeypath\") String consumerKeyPath,\n      @Nullable @Named(\"che.oauth1.bitbucket.privatekeypath\") String privateKeyPath,\n      @Nullable @Named(\"che.oauth.bitbucket.endpoint\") String bitbucketEndpoint,\n      @Named(\"che.api\") String apiEndpoint)\n      throws IOException {\n    authenticator =\n        getOAuthAuthenticator(consumerKeyPath, privateKeyPath, bitbucketEndpoint, apiEndpoint);\n    LOG.debug(\"{} Bitbucket OAuthAuthenticator is used.\", authenticator);\n  }\n\n  @Override\n  public OAuthAuthenticator get() {\n    return authenticator;\n  }\n\n  private static OAuthAuthenticator getOAuthAuthenticator(\n      String consumerKeyPath, String privateKeyPath, String bitbucketEndpoint, String apiEndpoint)\n      throws IOException {\n    if (!isNullOrEmpty(bitbucketEndpoint)\n        && !isNullOrEmpty(consumerKeyPath)\n        && !isNullOrEmpty(privateKeyPath)) {\n      String consumerKey = Files.readString(Path.of(consumerKeyPath));\n      String privateKey = Files.readString(Path.of(privateKeyPath));\n      if (!isNullOrEmpty(consumerKey) && !isNullOrEmpty(privateKey)) {\n        return new BitbucketServerOAuthAuthenticator(\n            consumerKey, privateKey, bitbucketEndpoint, apiEndpoint);\n      }\n    }\n\n    return new NoopOAuthAuthenticator();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth1/NoopOAuthAuthenticator.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth1;\n\nimport java.net.URL;\n\n/**\n * Dummy implementation of @{@link OAuthAuthenticator} used in the case if no Bitbucket Server\n * integration is configured to register an empty @{@link BitbucketServerApiClient}.\n */\npublic class NoopOAuthAuthenticator extends OAuthAuthenticator {\n  public NoopOAuthAuthenticator() {\n    super(null, null, null, null, null, null, null);\n  }\n\n  @Override\n  public String getOAuthProvider() {\n    return \"Noop\";\n  }\n\n  @Override\n  String getAuthenticateUrl(URL requestUrl, String requestMethod, String signatureMethod)\n      throws OAuthAuthenticationException {\n    throw new OAuthAuthenticationException(\n        \"The fallback noop authenticator cannot be used for authentication. Make sure OAuth is properly configured.\");\n  }\n\n  @Override\n  String callback(URL requestUrl) throws OAuthAuthenticationException {\n    throw new OAuthAuthenticationException(\n        \"The fallback noop authenticator cannot be used for authentication. Make sure OAuth is properly configured.\");\n  }\n\n  @Override\n  public String computeAuthorizationHeader(String userId, String requestMethod, String requestUrl)\n      throws OAuthAuthenticationException {\n    throw new OAuthAuthenticationException(\n        \"The fallback noop authenticator cannot be used for authentication. Make sure OAuth is properly configured.\");\n  }\n\n  @Override\n  public String getLocalAuthenticateUrl() {\n    return \"Noop URL\";\n  }\n\n  @Override\n  public String getEndpointUrl() {\n    return \"Noop URL\";\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-bitbucket/src/test/java/org/eclipse/che/security/BitbucketOAuthAuthenticatorProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security;\n\nimport static java.util.Collections.emptyList;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.io.Files;\nimport java.io.File;\nimport java.io.IOException;\nimport java.net.URL;\nimport java.nio.charset.Charset;\nimport org.eclipse.che.security.oauth.BitbucketOAuthAuthenticatorProvider;\nimport org.eclipse.che.security.oauth.OAuthAuthenticator;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.Test;\n\npublic class BitbucketOAuthAuthenticatorProviderTest {\n  private BitbucketOAuthAuthenticatorProvider provider;\n  private File cfgFile;\n\n  @BeforeClass\n  public void setup() throws IOException {\n    cfgFile = File.createTempFile(\"BitbucketOAuthAuthenticatorProviderTest-\", \"-cfg\");\n    Files.asCharSink(cfgFile, Charset.defaultCharset()).write(\"tmp-data\");\n    cfgFile.deleteOnExit();\n    provider =\n        new BitbucketOAuthAuthenticatorProvider(\n            \"http://bitubucket-server.com\",\n            cfgFile.getPath(),\n            cfgFile.getPath(),\n            new String[] {\"http://che.server.com\"},\n            \"http://auth.uri\",\n            \"http://token.uri\");\n  }\n\n  @Test\n  public void shouldReturnAuthenticationUrlEncodedOnce() throws Exception {\n    // given\n    BitbucketOAuthAuthenticatorProvider provider =\n        new BitbucketOAuthAuthenticatorProvider(\n            \"https://bitbucket.org\",\n            cfgFile.getPath(),\n            cfgFile.getPath(),\n            new String[] {\"http://che.server.com\"},\n            \"http://auth.uri\",\n            \"http://token.uri\");\n    OAuthAuthenticator authenticator = provider.get();\n    URL url = new URL(\"http://che.server.com?query=param\");\n    // when\n    String authenticateUrl = authenticator.getAuthenticateUrl(url, emptyList());\n    // then\n    assertTrue(authenticateUrl.endsWith(\"&state=query%253Dparam\"));\n  }\n\n  @Test\n  public void shouldReturnAuthenticationUrlEncodedTwice() throws Exception {\n    // given\n    OAuthAuthenticator authenticator = provider.get();\n    URL url = new URL(\"http://che.server.com?query=param\");\n    // when\n    String authenticateUrl = authenticator.getAuthenticateUrl(url, emptyList());\n    // then\n    assertTrue(authenticateUrl.endsWith(\"&state=query%25253Dparam\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-bitbucket/src/test/java/org/eclipse/che/security/oauth1/BitbucketServerOAuthAuthenticatorProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth1;\n\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.io.Files;\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.charset.Charset;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class BitbucketServerOAuthAuthenticatorProviderTest {\n  private File cfgFile;\n  private File emptyFile;\n\n  @BeforeClass\n  public void setup() throws IOException {\n    cfgFile = File.createTempFile(\"BitbucketServerOAuthAuthenticatorProviderTest-\", \"-cfg\");\n    Files.asCharSink(cfgFile, Charset.defaultCharset()).write(\"tmp-data\");\n    cfgFile.deleteOnExit();\n    emptyFile = File.createTempFile(\"BitbucketServerOAuthAuthenticatorProviderTest-\", \"-empty\");\n    emptyFile.deleteOnExit();\n  }\n\n  @Test(dataProvider = \"noopConfig\")\n  public void shouldProvideNoopOAuthAuthenticatorIfSomeConfigurationIsNotSet(\n      String consumerKeyPath, String privateKeyPath, String bitbucketEndpoint) throws IOException {\n    // given\n    BitbucketServerOAuthAuthenticatorProvider provider =\n        new BitbucketServerOAuthAuthenticatorProvider(\n            consumerKeyPath, privateKeyPath, bitbucketEndpoint, \"http://che.server.com\");\n    // when\n    OAuthAuthenticator actual = provider.get();\n    // then\n    assertNotNull(actual);\n    assertTrue(NoopOAuthAuthenticator.class.isAssignableFrom(actual.getClass()));\n  }\n\n  @Test\n  public void shouldBeAbleToConfigureValidBitbucketServerOAuthAuthenticator() throws IOException {\n    // given\n    BitbucketServerOAuthAuthenticatorProvider provider =\n        new BitbucketServerOAuthAuthenticatorProvider(\n            cfgFile.getPath(), cfgFile.getPath(), \"http://bitubucket.com\", \"http://che.server.com\");\n    // when\n    OAuthAuthenticator actual = provider.get();\n    // then\n    assertNotNull(actual);\n    assertTrue(BitbucketServerOAuthAuthenticator.class.isAssignableFrom(actual.getClass()));\n  }\n\n  @DataProvider(name = \"noopConfig\")\n  public Object[][] noopConfig() {\n    return new Object[][] {\n      {null, null, null},\n      {cfgFile.getPath(), null, null},\n      {null, cfgFile.getPath(), null},\n      {cfgFile.getPath(), cfgFile.getPath(), null},\n      {emptyFile.getPath(), null, null},\n      {null, emptyFile.getPath(), null},\n      {emptyFile.getPath(), emptyFile.getPath(), null},\n      {cfgFile.getPath(), emptyFile.getPath(), null},\n      {emptyFile.getPath(), cfgFile.getPath(), null},\n      {emptyFile.getPath(), emptyFile.getPath(), \"http://bitubucket.com\"},\n      {cfgFile.getPath(), emptyFile.getPath(), \"http://bitubucket.com\"},\n      {emptyFile.getPath(), cfgFile.getPath(), \"http://bitubucket.com\"},\n      {null, null, \"http://bitubucket.com\"}\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-bitbucket/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-github/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-auth-github</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Authentication Github</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-github-common</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.github.tomakehurst</groupId>\n            <artifactId>wiremock-jre8-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.wiremock</groupId>\n            <artifactId>wiremock-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-github/src/main/java/org/eclipse/che/security/oauth/GitHubOAuthAuthenticatorProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport java.io.IOException;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Provides implementation of GitHub {@link OAuthAuthenticator} based on available configuration.\n *\n * @author Pavol Baran\n */\n@Singleton\npublic class GitHubOAuthAuthenticatorProvider extends AbstractGitHubOAuthAuthenticatorProvider {\n  private static final String PROVIDER_NAME = \"github\";\n\n  @Inject\n  public GitHubOAuthAuthenticatorProvider(\n      @Nullable @Named(\"che.oauth2.github.clientid_filepath\") String gitHubClientIdPath,\n      @Nullable @Named(\"che.oauth2.github.clientsecret_filepath\") String gitHubClientSecretPath,\n      @Nullable @Named(\"che.oauth.github.redirecturis\") String[] redirectUris,\n      @Nullable @Named(\"che.integration.github.oauth_endpoint\") String oauthEndpoint,\n      @Nullable @Named(\"che.oauth.github.authuri\") String authUri,\n      @Nullable @Named(\"che.oauth.github.tokenuri\") String tokenUri)\n      throws IOException {\n    super(\n        gitHubClientIdPath,\n        gitHubClientSecretPath,\n        redirectUris,\n        oauthEndpoint,\n        authUri,\n        tokenUri,\n        PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-github/src/main/java/org/eclipse/che/security/oauth/GitHubOAuthAuthenticatorProviderSecond.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport java.io.IOException;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Provides implementation of GitHub {@link OAuthAuthenticator} based on available configuration.\n *\n * @author Anatolii Bazko\n */\n@Singleton\npublic class GitHubOAuthAuthenticatorProviderSecond\n    extends AbstractGitHubOAuthAuthenticatorProvider {\n  private static final String PROVIDER_NAME = \"github_2\";\n\n  @Inject\n  public GitHubOAuthAuthenticatorProviderSecond(\n      @Nullable @Named(\"che.oauth2.github.clientid_filepath_2\") String gitHubClientIdPath,\n      @Nullable @Named(\"che.oauth2.github.clientsecret_filepath_2\") String gitHubClientSecretPath,\n      @Nullable @Named(\"che.oauth.github.redirecturis\") String[] redirectUris,\n      @Nullable @Named(\"che.integration.github.oauth_endpoint_2\") String oauthEndpoint,\n      @Nullable @Named(\"che.oauth.github.authuri_2\") String authUri,\n      @Nullable @Named(\"che.oauth.github.tokenuri_2\") String tokenUri)\n      throws IOException {\n    super(\n        gitHubClientIdPath,\n        gitHubClientSecretPath,\n        redirectUris,\n        oauthEndpoint,\n        authUri,\n        tokenUri,\n        PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-github/src/main/java/org/eclipse/che/security/oauth/GithubModule.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\n\n/**\n * Setup GitHubOAuthAuthenticator in guice container.\n *\n * @author Sergii Kabashniuk\n */\npublic class GithubModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    Multibinder<OAuthAuthenticator> oAuthAuthenticators =\n        Multibinder.newSetBinder(binder(), OAuthAuthenticator.class);\n    oAuthAuthenticators.addBinding().toProvider(GitHubOAuthAuthenticatorProvider.class);\n    oAuthAuthenticators.addBinding().toProvider(GitHubOAuthAuthenticatorProviderSecond.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-github/src/test/java/org/eclipse/che/security/oauth/GitHubOAuthAuthenticatorProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.delete;\nimport static com.github.tomakehurst.wiremock.client.WireMock.matching;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.common.io.Files;\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.charset.Charset;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class GitHubOAuthAuthenticatorProviderTest {\n  private static final String TEST_URI = \"https://api.github.com\";\n  private File credentialFile;\n  private File emptyFile;\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  @BeforeClass\n  public void setup() throws IOException {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    wireMock = new WireMock(\"localhost\", wireMockServer.port());\n    credentialFile = File.createTempFile(\"GitHubOAuthAuthenticatorProviderTest-\", \"-credentials\");\n    Files.asCharSink(credentialFile, Charset.defaultCharset()).write(\"id/secret\");\n    credentialFile.deleteOnExit();\n    emptyFile = File.createTempFile(\"GitHubOAuthAuthenticatorProviderTest-\", \"-empty\");\n    emptyFile.deleteOnExit();\n  }\n\n  @Test(dataProvider = \"noopConfig\")\n  public void shouldProvideNoopAuthenticatorWhenInvalidConfigurationSet(\n      String gitHubClientIdPath,\n      String gitHubClientSecretPath,\n      String[] redirectUris,\n      String oauthEndpoint,\n      String authUri,\n      String tokenUri)\n      throws IOException {\n    // given\n    GitHubOAuthAuthenticatorProvider provider =\n        new GitHubOAuthAuthenticatorProvider(\n            gitHubClientIdPath,\n            gitHubClientSecretPath,\n            redirectUris,\n            oauthEndpoint,\n            authUri,\n            tokenUri);\n    // when\n    OAuthAuthenticator authenticator = provider.get();\n    // then\n    assertNotNull(authenticator);\n    assertTrue(\n        GitHubOAuthAuthenticatorProvider.NoopOAuthAuthenticator.class.isAssignableFrom(\n            authenticator.getClass()));\n  }\n\n  @Test\n  public void shouldProvideNoopAuthenticatorWhenConfigFilesAreEmpty() throws IOException {\n    // given\n    GitHubOAuthAuthenticatorProvider provider =\n        new GitHubOAuthAuthenticatorProvider(\n            emptyFile.getPath(),\n            emptyFile.getPath(),\n            new String[] {TEST_URI},\n            null,\n            TEST_URI,\n            TEST_URI);\n    // when\n    OAuthAuthenticator authenticator = provider.get();\n    // then\n    assertNotNull(authenticator);\n    assertTrue(\n        GitHubOAuthAuthenticatorProvider.NoopOAuthAuthenticator.class.isAssignableFrom(\n            authenticator.getClass()));\n  }\n\n  @Test\n  public void shouldProvideValidGitHubOAuthAuthenticator() throws IOException {\n    // given\n    GitHubOAuthAuthenticatorProvider provider =\n        new GitHubOAuthAuthenticatorProvider(\n            credentialFile.getPath(),\n            credentialFile.getPath(),\n            new String[] {TEST_URI},\n            null,\n            TEST_URI,\n            TEST_URI);\n    // when\n    OAuthAuthenticator authenticator = provider.get();\n\n    // then\n    assertNotNull(authenticator);\n    assertTrue(GitHubOAuthAuthenticator.class.isAssignableFrom(authenticator.getClass()));\n  }\n\n  @Test\n  public void shouldProvideValidGitHubOAuthAuthenticatorWithConfiguredOAuthEndpoint()\n      throws IOException {\n    // given\n    GitHubOAuthAuthenticatorProvider provider =\n        new GitHubOAuthAuthenticatorProvider(\n            credentialFile.getPath(),\n            credentialFile.getPath(),\n            new String[] {TEST_URI},\n            \"https://custom.github.com/\",\n            TEST_URI,\n            TEST_URI);\n    // when\n    OAuthAuthenticator authenticator = provider.get();\n\n    // then\n    assertNotNull(authenticator);\n    assertTrue(GitHubOAuthAuthenticator.class.isAssignableFrom(authenticator.getClass()));\n  }\n\n  @Test\n  public void shouldReturnEndpointUrl() throws IOException {\n    // given\n    GitHubOAuthAuthenticatorProvider provider =\n        new GitHubOAuthAuthenticatorProvider(\n            credentialFile.getPath(),\n            credentialFile.getPath(),\n            new String[] {TEST_URI},\n            null,\n            TEST_URI,\n            TEST_URI);\n    OAuthAuthenticator authenticator = provider.get();\n    // when\n    String endpointUrl = authenticator.getEndpointUrl();\n\n    // then\n    assertEquals(endpointUrl, \"https://github.com\");\n  }\n\n  @Test\n  public void shouldInvalidateToken() throws IOException {\n    // given\n    stubFor(\n        delete(urlEqualTo(\"/api/v3/applications/id/secret/grant\"))\n            .withBasicAuth(\"id/secret\", \"id/secret\")\n            .withRequestBody(matching(\"\\\\{\\\"access_token\\\"\\\\:\\\"token\\\"\\\\}\"))\n            .willReturn(aResponse().withStatus(204)));\n    GitHubOAuthAuthenticatorProvider provider =\n        new GitHubOAuthAuthenticatorProvider(\n            credentialFile.getPath(),\n            credentialFile.getPath(),\n            new String[] {TEST_URI},\n            wireMockServer.url(\"/\"),\n            TEST_URI,\n            TEST_URI);\n    OAuthAuthenticator authenticator = provider.get();\n    // when\n    boolean result = authenticator.invalidateToken(\"token\");\n    // then\n    assertTrue(result);\n  }\n\n  @DataProvider(name = \"noopConfig\")\n  public Object[][] noopConfig() {\n    return new Object[][] {\n      {null, null, null, null, null, null},\n      {null, null, null, \"\", null, null},\n      {null, null, null, TEST_URI, null, null},\n      {credentialFile.getPath(), emptyFile.getPath(), null, null, TEST_URI, null},\n      {emptyFile.getPath(), emptyFile.getPath(), null, null, null, TEST_URI},\n      {null, emptyFile.getPath(), null, null, TEST_URI, TEST_URI},\n      {null, credentialFile.getPath(), new String[] {}, null, null, null},\n      {emptyFile.getPath(), null, new String[] {}, null, \"\", \"\"},\n      {credentialFile.getPath(), null, new String[] {}, null, \"\", null},\n      {null, emptyFile.getPath(), new String[] {}, null, null, \"\"},\n      {credentialFile.getPath(), null, new String[] {}, null, TEST_URI, null},\n      {null, emptyFile.getPath(), new String[] {}, null, TEST_URI, TEST_URI},\n      {emptyFile.getPath(), null, new String[] {TEST_URI}, null, null, null},\n      {credentialFile.getPath(), null, new String[] {TEST_URI}, null, \"\", \"\"},\n      {\n        credentialFile.getPath(),\n        credentialFile.getPath(),\n        new String[] {TEST_URI},\n        null,\n        null,\n        TEST_URI\n      },\n      {\n        credentialFile.getPath(), emptyFile.getPath(), new String[] {TEST_URI}, null, TEST_URI, null\n      },\n      {\n        credentialFile.getPath(),\n        credentialFile.getPath(),\n        new String[] {TEST_URI},\n        null,\n        TEST_URI,\n        \"\"\n      },\n      {emptyFile.getPath(), emptyFile.getPath(), new String[] {TEST_URI}, null, \"\", TEST_URI}\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-github-common/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-auth-github-common</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Authentication Github Common</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.http-client</groupId>\n            <artifactId>google-http-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.github.tomakehurst</groupId>\n            <artifactId>wiremock-jre8-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.wiremock</groupId>\n            <artifactId>wiremock-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-github-common/src/main/java/org/eclipse/che/security/oauth/AbstractGitHubOAuthAuthenticatorProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.util.Objects;\nimport javax.inject.Provider;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Provides implementation of GitHub {@link OAuthAuthenticator} based on available configuration.\n *\n * @author Pavol Baran\n */\npublic abstract class AbstractGitHubOAuthAuthenticatorProvider\n    implements Provider<OAuthAuthenticator> {\n  private static final Logger LOG =\n      LoggerFactory.getLogger(AbstractGitHubOAuthAuthenticatorProvider.class);\n  private final String providerName;\n  private final OAuthAuthenticator authenticator;\n\n  public AbstractGitHubOAuthAuthenticatorProvider(\n      String gitHubClientIdPath,\n      String gitHubClientSecretPath,\n      String[] redirectUris,\n      String oauthEndpoint,\n      String authUri,\n      String tokenUri,\n      String providerName)\n      throws IOException {\n    this.providerName = providerName;\n    authenticator =\n        getOAuthAuthenticator(\n            gitHubClientIdPath,\n            gitHubClientSecretPath,\n            redirectUris,\n            oauthEndpoint,\n            authUri,\n            tokenUri);\n    LOG.debug(\"{} GitHub OAuth Authenticator is used.\", authenticator);\n  }\n\n  @Override\n  public OAuthAuthenticator get() {\n    return authenticator;\n  }\n\n  private OAuthAuthenticator getOAuthAuthenticator(\n      String clientIdPath,\n      String clientSecretPath,\n      String[] redirectUris,\n      String oauthEndpoint,\n      String authUri,\n      String tokenUri)\n      throws IOException {\n\n    String trimmedOauthEndpoint = isNullOrEmpty(oauthEndpoint) ? null : trimEnd(oauthEndpoint, '/');\n    authUri =\n        isNullOrEmpty(trimmedOauthEndpoint)\n            ? authUri\n            : trimmedOauthEndpoint + \"/login/oauth/authorize\";\n    tokenUri =\n        isNullOrEmpty(trimmedOauthEndpoint)\n            ? tokenUri\n            : trimmedOauthEndpoint + \"/login/oauth/access_token\";\n    if (!isNullOrEmpty(clientIdPath)\n        && !isNullOrEmpty(clientSecretPath)\n        && !isNullOrEmpty(authUri)\n        && !isNullOrEmpty(tokenUri)\n        && Objects.nonNull(redirectUris)\n        && redirectUris.length != 0) {\n      final String clientId = Files.readString(Path.of(clientIdPath)).trim();\n      final String clientSecret = Files.readString(Path.of(clientSecretPath)).trim();\n      if (!isNullOrEmpty(clientId) && !isNullOrEmpty(clientSecret)) {\n        return new GitHubOAuthAuthenticator(\n            clientId,\n            clientSecret,\n            redirectUris,\n            trimmedOauthEndpoint,\n            authUri,\n            tokenUri,\n            providerName);\n      }\n    }\n    return new NoopOAuthAuthenticator();\n  }\n\n  static class NoopOAuthAuthenticator extends OAuthAuthenticator {\n    @Override\n    public String getOAuthProvider() {\n      return \"Noop\";\n    }\n\n    @Override\n    public String getEndpointUrl() {\n      return \"Noop\";\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-github-common/src/main/java/org/eclipse/che/security/oauth/GitHubOAuthAuthenticator.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport com.google.api.client.util.store.MemoryDataStoreFactory;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.Base64;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\n\n/** OAuth authentication for github account. */\npublic class GitHubOAuthAuthenticator extends OAuthAuthenticator {\n  private final String clientId;\n  private final String clientSecret;\n  private final String githubApiUrl;\n  private final String providerUrl;\n  private final String providerName;\n\n  public GitHubOAuthAuthenticator(\n      String clientId,\n      String clientSecret,\n      String[] redirectUris,\n      String authEndpoint,\n      String authUri,\n      String tokenUri,\n      String providerName)\n      throws IOException {\n    this.clientId = clientId;\n    this.clientSecret = clientSecret;\n    this.providerName = providerName;\n    providerUrl = isNullOrEmpty(authEndpoint) ? \"https://github.com\" : trimEnd(authEndpoint, '/');\n    githubApiUrl =\n        providerUrl.equals(\"https://github.com\")\n            ? \"https://api.github.com\"\n            : providerUrl + \"/api/v3\";\n    configure(\n        clientId, clientSecret, redirectUris, authUri, tokenUri, new MemoryDataStoreFactory());\n  }\n\n  @Override\n  public final String getOAuthProvider() {\n    return providerName;\n  }\n\n  @Override\n  public boolean invalidateToken(String token) throws IOException {\n    HttpURLConnection urlConnection = null;\n    try {\n      String creds = clientId + \":\" + clientSecret;\n      String basicAuth = \"Basic \" + new String(Base64.getEncoder().encode(creds.getBytes()));\n      String jsonInputString = String.format(\"{\\\"access_token\\\":\\\"%s\\\"}\", token);\n      urlConnection =\n          (HttpURLConnection)\n              new URL(String.format(\"%s/applications/%s/grant\", githubApiUrl, clientId))\n                  .openConnection();\n      urlConnection.setRequestMethod(\"DELETE\");\n      urlConnection.setRequestProperty(\"Authorization\", basicAuth);\n      urlConnection.setDoOutput(true);\n      try (OutputStream os = urlConnection.getOutputStream()) {\n        os.write(jsonInputString.getBytes());\n      }\n      if (urlConnection.getResponseCode() != 204) {\n        return false;\n      }\n    } finally {\n      if (urlConnection != null) {\n        urlConnection.disconnect();\n      }\n    }\n    return true;\n  }\n\n  @Override\n  public OAuthToken getOrRefreshToken(String oauthProvider) throws IOException {\n    final OAuthToken token = super.getOrRefreshToken(oauthProvider);\n    // Need to check if token which is stored is valid for requests, then if valid - we returns it\n    // to\n    // caller\n    try {\n      if (token == null\n          || token.getToken() == null\n          || token.getToken().isEmpty()\n          || getJson(githubApiUrl + \"/user\", token.getToken(), GitHubUser.class) == null) {\n        return null;\n      }\n    } catch (OAuthAuthenticationException e) {\n      return null;\n    }\n    return token;\n  }\n\n  public String getEndpointUrl() {\n    return providerUrl;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-github-common/src/main/java/org/eclipse/che/security/oauth/GitHubUser.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport org.eclipse.che.security.oauth.shared.User;\n\n/** Represents GitHub user. */\npublic class GitHubUser implements User {\n  private String name;\n  private String company;\n  private String email;\n\n  @Override\n  public final String getId() {\n    return email;\n  }\n\n  @Override\n  public final void setId(String id) {\n    // JSON response from Github API contains key 'id' but it has different purpose.\n    // Ignore calls of this method. Email address is used as user identifier.\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  @Override\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  public String getCompany() {\n    return company;\n  }\n\n  public void setCompany(String company) {\n    this.company = company;\n  }\n\n  @Override\n  public String getEmail() {\n    return email;\n  }\n\n  @Override\n  public void setEmail(String email) {\n    this.email = email;\n  }\n\n  @Override\n  public String toString() {\n    return \"GitHubUser{\"\n        + \"id='\"\n        + getId()\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", company='\"\n        + company\n        + '\\''\n        + \", email='\"\n        + email\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-gitlab/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-auth-gitlab</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Authentication GitLab</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-gitlab-common</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.google.http-client</groupId>\n            <artifactId>google-http-client</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.google.oauth-client</groupId>\n            <artifactId>google-oauth-client</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.wiremock</groupId>\n            <artifactId>wiremock-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-gitlab/src/main/java/org/eclipse/che/security/oauth/GitLabModule.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\n\n/**\n * Setup GitlabOAuthAuthenticator in guice container.\n *\n * @author Pavol Baran\n */\npublic class GitLabModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    Multibinder<OAuthAuthenticator> oAuthAuthenticators =\n        Multibinder.newSetBinder(binder(), OAuthAuthenticator.class);\n    oAuthAuthenticators.addBinding().toProvider(GitLabOAuthAuthenticatorProvider.class);\n    oAuthAuthenticators.addBinding().toProvider(GitLabOAuthAuthenticatorProviderSecond.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-gitlab/src/main/java/org/eclipse/che/security/oauth/GitLabOAuthAuthenticatorProvider.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport java.io.IOException;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Provides implementation of GitLab {@link OAuthAuthenticator} based on available configuration.\n *\n * @author Pavol Baran\n */\n@Singleton\npublic class GitLabOAuthAuthenticatorProvider extends AbstractGitLabOAuthAuthenticatorProvider {\n  private static final String PROVIDER_NAME = \"gitlab\";\n\n  @Inject\n  public GitLabOAuthAuthenticatorProvider(\n      @Nullable @Named(\"che.oauth2.gitlab.clientid_filepath\") String clientIdPath,\n      @Nullable @Named(\"che.oauth2.gitlab.clientsecret_filepath\") String clientSecretPath,\n      @Nullable @Named(\"che.integration.gitlab.oauth_endpoint\") String gitlabEndpoint,\n      @Named(\"che.api\") String cheApiEndpoint)\n      throws IOException {\n    super(clientIdPath, clientSecretPath, gitlabEndpoint, cheApiEndpoint, PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-gitlab/src/main/java/org/eclipse/che/security/oauth/GitLabOAuthAuthenticatorProviderSecond.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport java.io.IOException;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Provides implementation of GitLab {@link OAuthAuthenticator} based on available configuration.\n *\n * @author Pavol Baran\n */\n@Singleton\npublic class GitLabOAuthAuthenticatorProviderSecond\n    extends AbstractGitLabOAuthAuthenticatorProvider {\n  private static final String PROVIDER_NAME = \"gitlab_2\";\n\n  @Inject\n  public GitLabOAuthAuthenticatorProviderSecond(\n      @Nullable @Named(\"che.oauth2.gitlab.clientid_filepath_2\") String clientIdPath,\n      @Nullable @Named(\"che.oauth2.gitlab.clientsecret_filepath_2\") String clientSecretPath,\n      @Nullable @Named(\"che.integration.gitlab.oauth_endpoint_2\") String gitlabEndpoint,\n      @Named(\"che.api\") String cheApiEndpoint)\n      throws IOException {\n    super(clientIdPath, clientSecretPath, gitlabEndpoint, cheApiEndpoint, PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-gitlab/src/test/java/org/eclipse/che/security/oauth/GitLabAuthenticatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.equalTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNull;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.api.client.auth.oauth2.StoredCredential;\nimport com.google.api.client.util.store.MemoryDataStoreFactory;\nimport com.google.common.net.HttpHeaders;\nimport java.lang.reflect.Field;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.Test;\n\npublic class GitLabAuthenticatorTest {\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  @BeforeClass\n  public void setup() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    wireMock = new WireMock(\"localhost\", wireMockServer.port());\n  }\n\n  @Test\n  public void shouldGetToken() throws Exception {\n    // given\n    GitLabOAuthAuthenticator gitLabOAuthAuthenticator =\n        new GitLabOAuthAuthenticator(\n            \"id\", \"secret\", wireMockServer.url(\"/\"), \"https://che.api.com\", \"gitlab\");\n    Field flowField = OAuthAuthenticator.class.getDeclaredField(\"flow\");\n    Field credentialDataStoreField =\n        ((Class) flowField.getGenericType()).getDeclaredField(\"credentialDataStore\");\n    credentialDataStoreField.setAccessible(true);\n    credentialDataStoreField.set(\n        flowField.get(gitLabOAuthAuthenticator),\n        new MemoryDataStoreFactory()\n            .getDataStore(\"test\")\n            .set(\"userId\", new StoredCredential().setAccessToken(\"token\")));\n    stubFor(\n        get(urlEqualTo(\"/api/v4/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token\"))\n            .willReturn(aResponse().withBody(\"{\\\"id\\\": \\\"testId\\\"}\")));\n    // when\n    OAuthToken token = gitLabOAuthAuthenticator.getOrRefreshToken(\"userId\");\n    // then\n    assertEquals(token.getToken(), \"token\");\n  }\n\n  @Test\n  public void shouldGetEmptyToken() throws Exception {\n    // given\n    GitLabOAuthAuthenticator gitLabOAuthAuthenticator =\n        new GitLabOAuthAuthenticator(\n            \"id\", \"secret\", wireMockServer.url(\"/\"), \"https://che.api.com\", \"gitlab\");\n    Field flowField = OAuthAuthenticator.class.getDeclaredField(\"flow\");\n    Field credentialDataStoreField =\n        ((Class) flowField.getGenericType()).getDeclaredField(\"credentialDataStore\");\n    credentialDataStoreField.setAccessible(true);\n    credentialDataStoreField.set(\n        flowField.get(gitLabOAuthAuthenticator),\n        new MemoryDataStoreFactory()\n            .getDataStore(\"test\")\n            .set(\"userId\", new StoredCredential().setAccessToken(\"token\")));\n    stubFor(\n        get(urlEqualTo(\"/api/v4/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token\"))\n            .willReturn(aResponse().withBody(\"{}\")));\n    // when\n    OAuthToken token = gitLabOAuthAuthenticator.getOrRefreshToken(\"userId\");\n    // then\n    assertNull(token);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-gitlab/src/test/java/org/eclipse/che/security/oauth/GitLabOAuthAuthenticatorProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.io.Files;\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.charset.Charset;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class GitLabOAuthAuthenticatorProviderTest {\n  private static final String TEST_URI = \"https://gitlab.com\";\n  private File credentialFile;\n  private File emptyFile;\n\n  @BeforeClass\n  public void setup() throws IOException {\n    credentialFile = File.createTempFile(\"GitLabOAuthAuthenticatorProviderTest-\", \"-credentials\");\n    Files.asCharSink(credentialFile, Charset.defaultCharset()).write(\"id/secret\");\n    credentialFile.deleteOnExit();\n    emptyFile = File.createTempFile(\"GitLabOAuthAuthenticatorProviderTest-\", \"-empty\");\n    emptyFile.deleteOnExit();\n  }\n\n  @Test(dataProvider = \"noopConfig\")\n  public void shouldProvideNoopAuthenticatorWhenInvalidConfigurationSet(\n      String gitHubClientIdPath, String gitHubClientSecretPath, String gitlabEndpoint)\n      throws IOException {\n    // given\n    GitLabOAuthAuthenticatorProvider provider =\n        new GitLabOAuthAuthenticatorProvider(\n            gitHubClientIdPath, gitHubClientSecretPath, gitlabEndpoint, \"che.api\");\n    // when\n    OAuthAuthenticator authenticator = provider.get();\n    // then\n    assertNotNull(authenticator);\n    assertTrue(\n        GitLabOAuthAuthenticatorProvider.NoopOAuthAuthenticator.class.isAssignableFrom(\n            authenticator.getClass()));\n  }\n\n  @Test\n  public void shouldProvideNoopAuthenticatorWhenConfigFilesAreEmpty() throws IOException {\n    // given\n    GitLabOAuthAuthenticatorProvider provider =\n        new GitLabOAuthAuthenticatorProvider(\n            emptyFile.getPath(), emptyFile.getPath(), TEST_URI, \"che.api\");\n    // when\n    OAuthAuthenticator authenticator = provider.get();\n    // then\n    assertNotNull(authenticator);\n    assertTrue(\n        GitLabOAuthAuthenticatorProvider.NoopOAuthAuthenticator.class.isAssignableFrom(\n            authenticator.getClass()));\n  }\n\n  @Test\n  public void shouldProvideValidGitLabOAuthAuthenticator() throws IOException {\n    // given\n    GitLabOAuthAuthenticatorProvider provider =\n        new GitLabOAuthAuthenticatorProvider(\n            credentialFile.getPath(), credentialFile.getPath(), TEST_URI, \"che.api\");\n    // when\n    OAuthAuthenticator authenticator = provider.get();\n\n    // then\n    assertNotNull(authenticator);\n    assertTrue(GitLabOAuthAuthenticator.class.isAssignableFrom(authenticator.getClass()));\n  }\n\n  @DataProvider(name = \"noopConfig\")\n  public Object[][] noopConfig() {\n    return new Object[][] {\n      {null, null, null},\n      {null, null, TEST_URI},\n      {\"\", \"\", TEST_URI},\n      {\"\", emptyFile.getPath(), TEST_URI},\n      {emptyFile.getPath(), \"\", TEST_URI},\n      {emptyFile.getPath(), emptyFile.getPath(), null},\n      {credentialFile.getPath(), credentialFile.getPath(), null},\n      {null, emptyFile.getPath(), TEST_URI},\n      {emptyFile.getPath(), null, TEST_URI},\n      {credentialFile.getPath(), null, TEST_URI},\n      {null, credentialFile.getPath(), TEST_URI},\n      {credentialFile.getPath(), \"\", TEST_URI},\n      {\"\", credentialFile.getPath(), TEST_URI},\n      {credentialFile.getPath(), null, null},\n      {credentialFile.getPath(), credentialFile.getPath(), \"\"},\n      {credentialFile.getPath(), credentialFile.getPath(), null},\n      {credentialFile.getPath(), emptyFile.getPath(), TEST_URI},\n      {emptyFile.getPath(), credentialFile.getPath(), TEST_URI},\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-gitlab-common/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-auth-gitlab-common</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Authentication GitLab Common</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.http-client</groupId>\n            <artifactId>google-http-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.wiremock</groupId>\n            <artifactId>wiremock-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-gitlab-common/src/main/java/org/eclipse/che/security/oauth/AbstractGitLabOAuthAuthenticatorProvider.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport javax.inject.Provider;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Provides implementation of GitLab {@link OAuthAuthenticator} based on available configuration.\n *\n * @author Pavol Baran\n */\npublic class AbstractGitLabOAuthAuthenticatorProvider implements Provider<OAuthAuthenticator> {\n  private static final Logger LOG =\n      LoggerFactory.getLogger(AbstractGitLabOAuthAuthenticatorProvider.class);\n  private final OAuthAuthenticator authenticator;\n  private final String providerName;\n\n  public AbstractGitLabOAuthAuthenticatorProvider(\n      String clientIdPath,\n      String clientSecretPath,\n      String gitlabEndpoint,\n      String cheApiEndpoint,\n      String providerName)\n      throws IOException {\n    this.providerName = providerName;\n    authenticator =\n        getOAuthAuthenticator(clientIdPath, clientSecretPath, gitlabEndpoint, cheApiEndpoint);\n    LOG.debug(\"{} GitLab OAuth Authenticator is used.\", authenticator);\n  }\n\n  @Override\n  public OAuthAuthenticator get() {\n    return authenticator;\n  }\n\n  private OAuthAuthenticator getOAuthAuthenticator(\n      String clientIdPath, String clientSecretPath, String gitlabEndpoint, String cheApiEndpoint)\n      throws IOException {\n    if (!isNullOrEmpty(clientIdPath)\n        && !isNullOrEmpty(clientSecretPath)\n        && !isNullOrEmpty(gitlabEndpoint)) {\n      String clientId = Files.readString(Path.of(clientIdPath));\n      String clientSecret = Files.readString(Path.of(clientSecretPath));\n      if (!isNullOrEmpty(clientId) && !isNullOrEmpty(clientSecret)) {\n        return new GitLabOAuthAuthenticator(\n            clientId, clientSecret, gitlabEndpoint, cheApiEndpoint, providerName);\n      }\n    }\n    return new NoopOAuthAuthenticator();\n  }\n\n  static class NoopOAuthAuthenticator extends OAuthAuthenticator {\n\n    @Override\n    public String getOAuthProvider() {\n      return \"Noop\";\n    }\n\n    @Override\n    public String getEndpointUrl() {\n      return \"Noop\";\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-gitlab-common/src/main/java/org/eclipse/che/security/oauth/GitLabOAuthAuthenticator.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport com.google.api.client.util.store.MemoryDataStoreFactory;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URI;\nimport java.net.URL;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.commons.json.JsonHelper;\nimport org.eclipse.che.commons.json.JsonParseException;\n\n/**\n * OAuth2 authenticator for GitLab account.\n *\n * @author Pavol Baran\n */\n@Singleton\npublic class GitLabOAuthAuthenticator extends OAuthAuthenticator {\n  private final String gitlabUserEndpoint;\n  private final String cheApiEndpoint;\n  private final String clientId;\n  private final String clientSecret;\n  private final String gitlabEndpoint;\n  private final String providerName;\n\n  public GitLabOAuthAuthenticator(\n      String clientId,\n      String clientSecret,\n      String gitlabEndpoint,\n      String cheApiEndpoint,\n      String providerName)\n      throws IOException {\n    this.clientId = clientId;\n    this.clientSecret = clientSecret;\n    this.gitlabEndpoint = trimEnd(gitlabEndpoint, '/');\n    this.providerName = providerName;\n    String trimmedGitlabEndpoint = trimEnd(gitlabEndpoint, '/');\n    this.gitlabUserEndpoint = trimmedGitlabEndpoint + \"/api/v4/user\";\n    this.cheApiEndpoint = cheApiEndpoint;\n    configure(\n        clientId,\n        clientSecret,\n        new String[] {},\n        trimmedGitlabEndpoint + \"/oauth/authorize\",\n        trimmedGitlabEndpoint + \"/oauth/token\",\n        new MemoryDataStoreFactory());\n  }\n\n  @Override\n  public String getOAuthProvider() {\n    return providerName;\n  }\n\n  @Override\n  protected String findRedirectUrl(URL requestUrl) {\n    return cheApiEndpoint + \"/oauth/callback\";\n  }\n\n  @Override\n  protected <O> O getJson(String getUserUrl, String accessToken, Class<O> userClass)\n      throws OAuthAuthenticationException {\n    HttpClient client = HttpClient.newHttpClient();\n    HttpRequest request =\n        HttpRequest.newBuilder(URI.create(getUserUrl))\n            .header(\"Authorization\", \"Bearer \" + accessToken)\n            .build();\n\n    try {\n      HttpResponse<InputStream> response =\n          client.send(request, HttpResponse.BodyHandlers.ofInputStream());\n      return JsonHelper.fromJson(response.body(), userClass, null);\n    } catch (IOException | InterruptedException | JsonParseException e) {\n      throw new OAuthAuthenticationException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public OAuthToken getOrRefreshToken(String userId) throws IOException {\n    final OAuthToken token = super.getOrRefreshToken(userId);\n    try {\n      if (token == null || token.getToken() == null || token.getToken().isEmpty()) {\n        return null;\n      }\n      GitLabUser user = getJson(gitlabUserEndpoint, token.getToken(), GitLabUser.class);\n      if (user == null || isNullOrEmpty(user.getId())) {\n        return null;\n      }\n    } catch (OAuthAuthenticationException e) {\n      return null;\n    }\n    return token;\n  }\n\n  @Override\n  public boolean invalidateToken(String token) {\n    HttpClient client = HttpClient.newHttpClient();\n    HttpRequest request =\n        HttpRequest.newBuilder()\n            .uri(\n                URI.create(\n                    format(\n                        \"%s/oauth/revoke?client_id=%s&client_secret=%s&token=%s\",\n                        gitlabEndpoint, clientId, clientSecret, token)))\n            .POST(HttpRequest.BodyPublishers.noBody())\n            .build();\n\n    try {\n      HttpResponse<InputStream> response =\n          client.send(request, HttpResponse.BodyHandlers.ofInputStream());\n      return response.statusCode() == 200;\n    } catch (IOException | InterruptedException e) {\n      return false;\n    }\n  }\n\n  public String getEndpointUrl() {\n    return gitlabEndpoint;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-gitlab-common/src/main/java/org/eclipse/che/security/oauth/GitLabUser.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport org.eclipse.che.security.oauth.shared.User;\n\n/**\n * Represents GitLab user.\n *\n * @author Pavol Baran\n */\npublic class GitLabUser implements User {\n  private String id;\n  private String name;\n  private String email;\n\n  @Override\n  public String getId() {\n    return id;\n  }\n\n  @Override\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  @Override\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public String getEmail() {\n    return email;\n  }\n\n  @Override\n  public void setEmail(String email) {\n    this.email = email;\n  }\n\n  @Override\n  public String toString() {\n    return \"GitLabUser{\"\n        + \"id='\"\n        + id\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", email='\"\n        + email\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-openshift/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-auth-openshift</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Authentication OpenShift</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.http-client</groupId>\n            <artifactId>google-http-client</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-openshift/src/main/java/org/eclipse/che/security/oauth/OpenShiftOAuthAuthenticator.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport com.google.api.client.util.store.MemoryDataStoreFactory;\nimport java.io.IOException;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * OAuth authentication for OpenShift.\n *\n * @author Igor Vinokur\n */\n@Singleton\npublic class OpenShiftOAuthAuthenticator extends OAuthAuthenticator {\n  private final String oauthEndpoint;\n  private final String verifyTokenUrl;\n\n  @Inject\n  public OpenShiftOAuthAuthenticator(\n      @Nullable @Named(\"che.oauth.openshift.clientid\") String clientId,\n      @Nullable @Named(\"che.oauth.openshift.clientsecret\") String clientSecret,\n      @Nullable @Named(\"che.oauth.openshift.oauth_endpoint\") String oauthEndpoint,\n      @Nullable @Named(\"che.oauth.openshift.verify_token_url\") String verifyTokenUrl,\n      @Named(\"che.api\") String apiEndpoint)\n      throws IOException {\n    this.oauthEndpoint = isNullOrEmpty(oauthEndpoint) ? \"\" : trimEnd(oauthEndpoint, '/');\n    this.verifyTokenUrl = verifyTokenUrl;\n    String[] redirectUrl = {apiEndpoint + \"/oauth/callback\"};\n    if (!isNullOrEmpty(clientId) && !isNullOrEmpty(clientSecret) && !isNullOrEmpty(oauthEndpoint)) {\n      oauthEndpoint = oauthEndpoint.endsWith(\"/\") ? oauthEndpoint : oauthEndpoint + \"/\";\n      configure(\n          clientId,\n          clientSecret,\n          redirectUrl,\n          oauthEndpoint + \"oauth/authorize\",\n          oauthEndpoint + \"oauth/token\",\n          new MemoryDataStoreFactory());\n    }\n  }\n\n  @Override\n  public final String getOAuthProvider() {\n    return \"openshift\";\n  }\n\n  @Override\n  public OAuthToken getOrRefreshToken(String userId) throws IOException {\n    final OAuthToken token = super.getOrRefreshToken(userId);\n    // Check if the token is valid for requests.\n    if (!(token == null || token.getToken() == null || token.getToken().isEmpty())) {\n      HttpURLConnection http = null;\n      try {\n        http = (HttpURLConnection) new URL(verifyTokenUrl).openConnection();\n        http.setInstanceFollowRedirects(false);\n        http.setRequestMethod(\"GET\");\n        http.setRequestProperty(\"Authorization\", \"Bearer \" + token.getToken());\n        http.setRequestProperty(\"Accept\", \"application/json\");\n\n        if (http.getResponseCode() == 401) {\n          return null;\n        }\n      } finally {\n        if (http != null) {\n          http.disconnect();\n        }\n      }\n\n      return token;\n    }\n    return null;\n  }\n\n  @Override\n  public String getEndpointUrl() {\n    return oauthEndpoint;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-openshift/src/main/java/org/eclipse/che/security/oauth/OpenShiftOAuthModule.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\n\n/**\n * Setup OpenShiftOAuthAuthenticator in guice container.\n *\n * @author Igor Vinokur\n */\npublic class OpenShiftOAuthModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    Multibinder<OAuthAuthenticator> oAuthAuthenticators =\n        Multibinder.newSetBinder(binder(), OAuthAuthenticator.class);\n    oAuthAuthenticators.addBinding().to(OpenShiftOAuthAuthenticator.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-shared/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-auth-shared</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Authentication :: Shared</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-resource</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <id>server</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                        <configuration>\n                            <dtoPackages>\n                                <package>org.eclipse.che.api.auth.shared.dto</package>\n                            </dtoPackages>\n                            <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                            <genClassName>org.eclipse.che.api.auth.shared.dto.server.DtoServerImpls</genClassName>\n                            <impl>server</impl>\n                        </configuration>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-auth-shared</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-model</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-shared/src/main/java/org/eclipse/che/api/auth/shared/dto/OAuthToken.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.auth.shared.dto;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * OAuth token.\n *\n * @author Sergii Kabashniuk\n */\n@DTO\npublic interface OAuthToken {\n  /** Get OAuth token */\n  String getToken();\n\n  /** Set OAuth token */\n  void setToken(String token);\n\n  OAuthToken withToken(String token);\n\n  /** Get OAuth scope */\n  String getScope();\n\n  /** Set OAuth scope */\n  void setScope(String scope);\n\n  OAuthToken withScope(String scope);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-shared/src/main/java/org/eclipse/che/security/oauth/shared/OAuthAuthorizationHeaderProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth.shared;\n\nimport java.util.Map;\n\n/**\n * Provides the Authorization header value from the OAuth 1 providers.\n *\n * @author Kevin Pollet\n * @author Igor Vinokur\n */\npublic interface OAuthAuthorizationHeaderProvider {\n\n  /**\n   * Returns the Authorization header value used to sign the request with OAuth.\n   *\n   * @param oauthProviderName the OAuth 1 provider name.\n   * @param userId the user id.\n   * @param requestMethod the HTTP request method.\n   * @param requestUrl the HTTP request url with encoded query parameters.\n   * @param requestParameters the HTTP request parameters. HTTP request parameters must include raw\n   *     values of application/x-www-form-urlencoded POST parameters.\n   * @return the Authorization header value or {@code null} if it cannot be computed.\n   */\n  String getAuthorizationHeader(\n      String oauthProviderName,\n      String userId,\n      String requestMethod,\n      String requestUrl,\n      Map<String, String> requestParameters);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-shared/src/main/java/org/eclipse/che/security/oauth/shared/OAuthTokenProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth.shared;\n\nimport java.io.IOException;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\n\n/** Retrieves user token from OAuth providers. */\npublic interface OAuthTokenProvider {\n  /**\n   * Get oauth token.\n   *\n   * @param oauthProviderName - name of provider.\n   * @param userId - user\n   * @return oauth token or <code>null</code>\n   * @throws IOException if i/o error occurs when try to refresh expired oauth token\n   */\n  OAuthToken getToken(String oauthProviderName, String userId) throws IOException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-shared/src/main/java/org/eclipse/che/security/oauth/shared/User.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth.shared;\n\n/**\n * Represents an User with unique identifier. Have such interface to be able use GWT AutoBean\n * feature. Any interface that represents an User should extend this interface.\n */\npublic interface User {\n  String getId();\n\n  void setId(String id);\n\n  String getName();\n\n  void setName(String name);\n\n  String getEmail();\n\n  void setEmail(String email);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-auth-shared/src/main/java/org/eclipse/che/security/oauth/shared/dto/OAuthAuthenticatorDescriptor.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.security.oauth.shared.dto;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Max Shaposhnik (mshaposhnik@codenvy.com)\n */\n@DTO\npublic interface OAuthAuthenticatorDescriptor {\n\n  String getName();\n\n  void setName(String name);\n\n  OAuthAuthenticatorDescriptor withName(String name);\n\n  String getEndpointUrl();\n\n  void setEndpointUrl(String endpointUrl);\n\n  OAuthAuthenticatorDescriptor withEndpointUrl(String endpointUrl);\n\n  List<Link> getLinks();\n\n  void setLinks(List<Link> links);\n\n  OAuthAuthenticatorDescriptor withLinks(List<Link> links);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-devfile</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Devfile</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-account</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-devfile-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>jakarta.persistence</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-user</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-sql-schema</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.jpa</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <!-- Create the test jar -->\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>test-jar</goal>\n                        </goals>\n                        <configuration>\n                            <includes>\n                                <include>**/spi/tck/*.*</include>\n                                <include>**/devfile/server/TestObjectGenerator.*</include>\n                            </includes>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/DtoConverter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.devfile.server;\n\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport org.eclipse.che.api.core.model.workspace.devfile.UserDevfile;\nimport org.eclipse.che.api.devfile.shared.dto.UserDevfileDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.DevfileDto;\n\n/** Helps to convert to/from DTOs related to user devfile. */\npublic class DtoConverter {\n  public static UserDevfileDto asDto(UserDevfile userDevfile) {\n    DevfileDto devfileDto =\n        org.eclipse.che.api.workspace.server.DtoConverter.asDto(userDevfile.getDevfile());\n    return newDto(UserDevfileDto.class)\n        .withId(userDevfile.getId())\n        .withDevfile(devfileDto)\n        .withNamespace(userDevfile.getNamespace())\n        .withName(userDevfile.getName())\n        .withDescription(userDevfile.getDescription());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/UserDevfileEntityProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.devfile.server;\n\nimport static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport jakarta.ws.rs.BadRequestException;\nimport jakarta.ws.rs.Consumes;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.WebApplicationException;\nimport jakarta.ws.rs.core.HttpHeaders;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.MultivaluedMap;\nimport jakarta.ws.rs.ext.MessageBodyReader;\nimport jakarta.ws.rs.ext.MessageBodyWriter;\nimport jakarta.ws.rs.ext.Provider;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.io.OutputStreamWriter;\nimport java.io.Writer;\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Type;\nimport java.nio.charset.StandardCharsets;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.devfile.shared.dto.UserDevfileDto;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileParser;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * Entity provider for {@link UserDevfileDto}. Performs schema validation of devfile part of the\n * user devfile before actual {@link UserDevfileDto} creation.\n */\n@Singleton\n@Provider\n@Produces({APPLICATION_JSON})\n@Consumes({APPLICATION_JSON})\npublic class UserDevfileEntityProvider\n    implements MessageBodyReader<UserDevfileDto>, MessageBodyWriter<UserDevfileDto> {\n\n  private final DevfileParser devfileParser;\n  private final ObjectMapper mapper = new ObjectMapper();\n\n  @Inject\n  public UserDevfileEntityProvider(DevfileParser devfileParser) {\n    this.devfileParser = devfileParser;\n  }\n\n  @Override\n  public boolean isReadable(\n      Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {\n    return type == UserDevfileDto.class;\n  }\n\n  @Override\n  public UserDevfileDto readFrom(\n      Class<UserDevfileDto> type,\n      Type genericType,\n      Annotation[] annotations,\n      MediaType mediaType,\n      MultivaluedMap<String, String> httpHeaders,\n      InputStream entityStream)\n      throws IOException, WebApplicationException {\n    try {\n      JsonNode wsNode = mapper.readTree(entityStream);\n      JsonNode devfileNode = wsNode.path(\"devfile\");\n      if (!devfileNode.isNull() && !devfileNode.isMissingNode()) {\n        devfileParser.parseJson(devfileNode.toString());\n      } else {\n        throw new BadRequestException(\"Mandatory field `devfile` is not defined.\");\n      }\n      return DtoFactory.getInstance().createDtoFromJson(wsNode.toString(), UserDevfileDto.class);\n    } catch (DevfileFormatException e) {\n      throw new BadRequestException(e.getMessage());\n    } catch (IOException e) {\n      throw new WebApplicationException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public boolean isWriteable(\n      Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {\n    return UserDevfileDto.class.isAssignableFrom(type);\n  }\n\n  @Override\n  public long getSize(\n      UserDevfileDto userDevfileDto,\n      Class<?> type,\n      Type genericType,\n      Annotation[] annotations,\n      MediaType mediaType) {\n    return -1;\n  }\n\n  @Override\n  public void writeTo(\n      UserDevfileDto userDevfileDto,\n      Class<?> type,\n      Type genericType,\n      Annotation[] annotations,\n      MediaType mediaType,\n      MultivaluedMap<String, Object> httpHeaders,\n      OutputStream entityStream)\n      throws IOException, WebApplicationException {\n    httpHeaders.putSingle(HttpHeaders.CACHE_CONTROL, \"public, no-cache, no-store, no-transform\");\n    try (Writer w = new OutputStreamWriter(entityStream, StandardCharsets.UTF_8)) {\n      w.write(DtoFactory.getInstance().toJson(userDevfileDto));\n      w.flush();\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/model/impl/UserDevfileImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.devfile.server.model.impl;\n\nimport com.google.common.annotations.Beta;\nimport java.util.Objects;\nimport javax.persistence.CascadeType;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.NamedQueries;\nimport javax.persistence.NamedQuery;\nimport javax.persistence.OneToOne;\nimport javax.persistence.Table;\nimport org.eclipse.che.account.shared.model.Account;\nimport org.eclipse.che.account.spi.AccountImpl;\nimport org.eclipse.che.api.core.model.workspace.devfile.Devfile;\nimport org.eclipse.che.api.core.model.workspace.devfile.UserDevfile;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.MetadataImpl;\n\n@Entity(name = \"UserDevfile\")\n@Table(name = \"userdevfile\")\n@NamedQueries({\n  @NamedQuery(\n      name = \"UserDevfile.getByNamespace\",\n      query = \"SELECT d FROM UserDevfile d WHERE d.account.name = :namespace\"),\n  @NamedQuery(\n      name = \"UserDevfile.getByNamespaceCount\",\n      query = \"SELECT COUNT(d) FROM UserDevfile d WHERE d.account.name = :namespace \"),\n  @NamedQuery(name = \"UserDevfile.getAll\", query = \"SELECT d FROM UserDevfile d ORDER BY d.id\"),\n  @NamedQuery(name = \"UserDevfile.getTotalCount\", query = \"SELECT COUNT(d) FROM UserDevfile d\"),\n})\n@Beta\npublic class UserDevfileImpl implements UserDevfile {\n\n  /**\n   * In {@MetadataImpl} name is mandatory and generateName is transient. That is not suitable for\n   * UserDevfile because we need to handle situations when the name is not defined and generateName\n   * is defined. To workaround that original name and generateName stored in individual fields\n   * meta_name and meta_generated_name. But at the same time, we can't leave metadata filed null in\n   * devfile because of database hard constrain. To replace that FAKE_META is used.\n   */\n  private static final MetadataImpl FAKE_META = new MetadataImpl(\"name\");\n\n  @Id\n  @Column(name = \"id\", nullable = false)\n  private String id;\n\n  @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)\n  @JoinColumn(name = \"devfile_id\")\n  private DevfileImpl devfile;\n\n  @Column(name = \"meta_generated_name\")\n  private String metaGeneratedName;\n\n  @Column(name = \"meta_name\")\n  private String metaName;\n\n  @Column(name = \"name\", nullable = false)\n  private String name;\n\n  @Column(name = \"description\")\n  private String description;\n\n  @ManyToOne\n  @JoinColumn(name = \"accountid\", nullable = false)\n  private AccountImpl account;\n\n  public UserDevfileImpl() {}\n\n  public UserDevfileImpl(String id, Account account, UserDevfile userDevfile) {\n    this(\n        id, account, userDevfile.getName(), userDevfile.getDescription(), userDevfile.getDevfile());\n  }\n\n  public UserDevfileImpl(UserDevfile userDevfile, Account account) {\n    this(userDevfile.getId(), account, userDevfile);\n  }\n\n  public UserDevfileImpl(UserDevfileImpl userDevfile) {\n    this(\n        userDevfile.id,\n        userDevfile.account,\n        userDevfile.getName(),\n        userDevfile.getDescription(),\n        userDevfile.getDevfile());\n  }\n\n  public UserDevfileImpl(\n      String id, Account account, String name, String description, Devfile devfile) {\n    this.id = id;\n    this.account = new AccountImpl(account);\n    this.name = name;\n    this.description = description;\n    this.devfile = new DevfileImpl(devfile);\n    syncMeta();\n  }\n\n  @Override\n  public String getId() {\n    return id;\n  }\n\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  @Override\n  public String getNamespace() {\n    return account.getName();\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public String getDescription() {\n    return description;\n  }\n\n  public void setDescription(String description) {\n    this.description = description;\n  }\n\n  @Override\n  public Devfile getDevfile() {\n    return new DevfileImpl(\n        devfile.getApiVersion(),\n        devfile.getProjects(),\n        devfile.getComponents(),\n        devfile.getCommands(),\n        devfile.getAttributes(),\n        new MetadataImpl(metaName, metaGeneratedName));\n  }\n\n  public void setDevfile(DevfileImpl devfile) {\n    this.devfile = devfile;\n    syncMeta();\n  }\n\n  public AccountImpl getAccount() {\n    return account;\n  }\n\n  public void setAccount(AccountImpl account) {\n    this.account = account;\n  }\n\n  private void syncMeta() {\n    MetadataImpl metadata = devfile.getMetadata();\n    metaGeneratedName = metadata.getGenerateName();\n    metaName = metadata.getName();\n    devfile.setMetadata(FAKE_META);\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) return true;\n    if (o == null || getClass() != o.getClass()) return false;\n    UserDevfileImpl that = (UserDevfileImpl) o;\n    return Objects.equals(id, that.id)\n        && Objects.equals(devfile, that.devfile)\n        && Objects.equals(metaGeneratedName, that.metaGeneratedName)\n        && Objects.equals(metaName, that.metaName)\n        && Objects.equals(name, that.name)\n        && Objects.equals(description, that.description)\n        && Objects.equals(account, that.account);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, devfile, metaGeneratedName, metaName, name, description, account);\n  }\n\n  @Override\n  public String toString() {\n    return \"UserDevfileImpl{\"\n        + \"id='\"\n        + id\n        + '\\''\n        + \", devfile=\"\n        + devfile\n        + \", metaGeneratedName='\"\n        + metaGeneratedName\n        + '\\''\n        + \", metaName='\"\n        + metaName\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", description='\"\n        + description\n        + '\\''\n        + \", account=\"\n        + account\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/TestObjectGenerator.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.devfile.server;\n\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\n\nimport com.google.common.base.MoreObjects;\nimport com.google.common.collect.ImmutableMap;\nimport java.util.Collections;\nimport org.eclipse.che.account.shared.model.Account;\nimport org.eclipse.che.account.spi.AccountImpl;\nimport org.eclipse.che.api.devfile.server.model.impl.UserDevfileImpl;\nimport org.eclipse.che.api.devfile.shared.dto.UserDevfileDto;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ActionImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EndpointImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EntrypointImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EnvImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.MetadataImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ProjectImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.SourceImpl;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\n\npublic class TestObjectGenerator {\n\n  public static final String TEST_CHE_NAMESPACE = \"user\";\n  public static final String CURRENT_USER_ID = NameGenerator.generate(\"usrid\", 6);\n  public static final Subject TEST_SUBJECT =\n      new SubjectImpl(TEST_CHE_NAMESPACE, Collections.emptyList(), CURRENT_USER_ID, \"token\", false);\n  public static final String USER_DEVFILE_ID = NameGenerator.generate(\"usrd\", 16);\n  public static final AccountImpl TEST_ACCOUNT =\n      new AccountImpl(\"acc-id042u3ui3oi\", TEST_CHE_NAMESPACE, \"test\");\n\n  public static UserDevfileDto createUserDevfileDto() {\n    return DtoConverter.asDto(createUserDevfile(NameGenerator.generate(\"name\", 6)));\n  }\n\n  public static UserDevfileImpl createUserDevfile() {\n    return createUserDevfile(NameGenerator.generate(\"name\", 6));\n  }\n\n  public static UserDevfileImpl createUserDevfile(String name) {\n    return createUserDevfile(NameGenerator.generate(\"id\", 6), name);\n  }\n\n  public static UserDevfileImpl createUserDevfile(String id, String name) {\n    return new UserDevfileImpl(id, TEST_ACCOUNT, name, \"devfile description\", createDevfile(name));\n  }\n\n  public static UserDevfileImpl createUserDevfile(String id, Account account, String name) {\n    return new UserDevfileImpl(id, account, name, \"devfile description\", createDevfile(name));\n  }\n\n  public static UserDevfileImpl createUserDevfile(Account account) {\n    return createUserDevfile(\n        NameGenerator.generate(\"id\", 6), account, NameGenerator.generate(\"name\", 6));\n  }\n\n  public static DevfileImpl createDevfile(String generatedName) {\n    return createDevfile(null, generatedName);\n  }\n\n  public static DevfileImpl createDevfileWithName(String name) {\n    return createDevfile(name, null);\n  }\n\n  private static DevfileImpl createDevfile(String name, String generatedName) {\n    String effectiveName = MoreObjects.firstNonNull(name, generatedName);\n    SourceImpl source1 =\n        new SourceImpl(\n            \"type1\",\n            \"http://location\",\n            \"branch1\",\n            \"point1\",\n            \"tag1\",\n            \"commit1\",\n            \"sparseCheckoutDir1\");\n    ProjectImpl project1 = new ProjectImpl(\"project1\", source1, \"path1\");\n\n    SourceImpl source2 =\n        new SourceImpl(\n            \"type2\",\n            \"http://location\",\n            \"branch2\",\n            \"point2\",\n            \"tag2\",\n            \"commit2\",\n            \"sparseCheckoutDir2\");\n    ProjectImpl project2 = new ProjectImpl(\"project2\", source2, \"path2\");\n\n    ActionImpl action1 =\n        new ActionImpl(\"exec1\", \"component1\", \"run.sh\", \"/home/user/1\", null, null);\n    ActionImpl action2 =\n        new ActionImpl(\"exec2\", \"component2\", \"run.sh\", \"/home/user/2\", null, null);\n\n    CommandImpl command1 =\n        new CommandImpl(\n            effectiveName + \"-1\", singletonList(action1), singletonMap(\"attr1\", \"value1\"), null);\n    CommandImpl command2 =\n        new CommandImpl(\n            effectiveName + \"-2\", singletonList(action2), singletonMap(\"attr2\", \"value2\"), null);\n\n    EntrypointImpl entrypoint1 =\n        new EntrypointImpl(\n            \"parentName1\",\n            singletonMap(\"parent1\", \"selector1\"),\n            \"containerName1\",\n            asList(\"command1\", \"command2\"),\n            asList(\"arg1\", \"arg2\"));\n\n    EntrypointImpl entrypoint2 =\n        new EntrypointImpl(\n            \"parentName2\",\n            singletonMap(\"parent2\", \"selector2\"),\n            \"containerName2\",\n            asList(\"command3\", \"command4\"),\n            asList(\"arg3\", \"arg4\"));\n\n    org.eclipse.che.api.workspace.server.model.impl.devfile.VolumeImpl volume1 =\n        new org.eclipse.che.api.workspace.server.model.impl.devfile.VolumeImpl(\"name1\", \"path1\");\n\n    org.eclipse.che.api.workspace.server.model.impl.devfile.VolumeImpl volume2 =\n        new org.eclipse.che.api.workspace.server.model.impl.devfile.VolumeImpl(\"name2\", \"path2\");\n\n    EnvImpl env1 = new EnvImpl(\"name1\", \"value1\");\n    EnvImpl env2 = new EnvImpl(\"name2\", \"value2\");\n\n    EndpointImpl endpoint1 = new EndpointImpl(\"name1\", 1111, singletonMap(\"key1\", \"value1\"));\n    EndpointImpl endpoint2 = new EndpointImpl(\"name2\", 2222, singletonMap(\"key2\", \"value2\"));\n\n    ComponentImpl component1 =\n        new ComponentImpl(\n            \"kubernetes\",\n            \"component1\",\n            null,\n            null,\n            null,\n            null,\n            \"refcontent1\",\n            ImmutableMap.of(\"app.kubernetes.io/component\", \"db\"),\n            null,\n            null,\n            null,\n            null,\n            null,\n            null,\n            false,\n            false,\n            null,\n            null,\n            null,\n            asList(env1, env2),\n            null);\n    component1.setSelector(singletonMap(\"key1\", \"value1\"));\n\n    ComponentImpl component2 =\n        new ComponentImpl(\n            \"dockerimage\",\n            \"component2\",\n            null,\n            null,\n            null,\n            null,\n            null,\n            null,\n            null,\n            \"image\",\n            \"256G\",\n            null,\n            \"3\",\n            \"180m\",\n            false,\n            false,\n            singletonList(\"command\"),\n            singletonList(\"arg\"),\n            asList(volume1, volume2),\n            asList(env1, env2),\n            asList(endpoint1, endpoint2));\n    ComponentImpl component3 =\n        new ComponentImpl(\n            \"chePlugin\",\n            \"check/terminal-sample/0.0.1\",\n            ImmutableMap.of(\n                \"java.home\",\n                \"/home/user/jdk11aertwertert\",\n                \"java.boolean\",\n                \"true\",\n                \"java.long\",\n                \"123444L\"));\n    MetadataImpl metadata = new MetadataImpl(name);\n    metadata.setGenerateName(generatedName);\n    DevfileImpl devfile =\n        new DevfileImpl(\n            \"1.0.0\",\n            asList(project1, project2),\n            asList(component1, component2, component3),\n            asList(command1, command2),\n            singletonMap(\"attribute1\", \"value1\"),\n            metadata);\n\n    return devfile;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/jpa/UserDevfileTckModule.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.devfile.server.jpa;\n\nimport com.google.inject.TypeLiteral;\nimport org.eclipse.che.account.spi.AccountImpl;\nimport org.eclipse.che.api.devfile.server.model.impl.UserDevfileImpl;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\nimport org.eclipse.che.commons.test.tck.TckModule;\nimport org.eclipse.che.commons.test.tck.repository.JpaTckRepository;\nimport org.eclipse.che.commons.test.tck.repository.TckRepository;\n\n/** Tck module for UserDevfile test. */\npublic class UserDevfileTckModule extends TckModule {\n\n  @Override\n  protected void configure() {\n\n    bind(new TypeLiteral<TckRepository<UserDevfileImpl>>() {})\n        .toInstance(new JpaTckRepository<>(UserDevfileImpl.class));\n    bind(new TypeLiteral<TckRepository<UserImpl>>() {})\n        .toInstance(new JpaTckRepository<>(UserImpl.class));\n    bind(new TypeLiteral<TckRepository<AccountImpl>>() {})\n        .toInstance(new JpaTckRepository<>(AccountImpl.class));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile/src/test/resources/META-INF/services/org.eclipse.che.commons.test.tck.TckModule",
    "content": "org.eclipse.che.api.devfile.server.jpa.UserDevfileTckModule\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile-shared/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-devfile-shared</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Devfile :: Shared</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-devfile-shared</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-model</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-workspace-shared</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n                <configuration>\n                    <dtoPackages>\n                        <package>org.eclipse.che.api.devfile.shared.dto</package>\n                    </dtoPackages>\n                    <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                    <genClassName>org.eclipse.che.api.devfile.server.dto.DtoServerImpls</genClassName>\n                    <impl>server</impl>\n                </configuration>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-resource</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile-shared/src/main/java/org/eclipse/che/api/devfile/shared/Constants.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.devfile.shared;\n\nimport com.google.common.annotations.Beta;\n\n/** Constants for Devfile API */\n@Beta\npublic final class Constants {\n  public static final String LINK_REL_SELF = \"self\";\n\n  private Constants() {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile-shared/src/main/java/org/eclipse/che/api/devfile/shared/dto/UserDevfileDto.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.devfile.shared.dto;\n\nimport com.google.common.annotations.Beta;\nimport java.util.List;\nimport org.eclipse.che.api.core.model.workspace.devfile.UserDevfile;\nimport org.eclipse.che.api.core.rest.shared.dto.Hyperlinks;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.DevfileDto;\nimport org.eclipse.che.dto.shared.DTO;\n\n@DTO\n@Beta\npublic interface UserDevfileDto extends UserDevfile, Hyperlinks {\n\n  void setId(String id);\n\n  UserDevfileDto withId(String id);\n\n  String getId();\n\n  void setName(String name);\n\n  UserDevfileDto withName(String name);\n\n  String getName();\n\n  void setDescription(String name);\n\n  UserDevfileDto withDescription(String name);\n\n  String getDescription();\n\n  @Override\n  DevfileDto getDevfile();\n\n  void setDevfile(DevfileDto devfile);\n\n  @Override\n  String getNamespace();\n\n  void setNamespace(String namespace);\n\n  UserDevfileDto withNamespace(String namespace);\n\n  UserDevfileDto withDevfile(DevfileDto devfile);\n\n  UserDevfileDto withLinks(List<Link> links);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile-shared/src/main/java/org/eclipse/che/api/devfile/shared/event/DevfileCreatedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.devfile.shared.event;\n\nimport com.google.common.annotations.Beta;\nimport org.eclipse.che.api.core.model.workspace.devfile.UserDevfile;\nimport org.eclipse.che.api.core.notification.EventOrigin;\n\n/** Informs about persisted devfile creation. */\n@EventOrigin(\"devfile\")\n@Beta\npublic class DevfileCreatedEvent {\n  private final UserDevfile userDevfile;\n\n  public DevfileCreatedEvent(UserDevfile userDevfile) {\n    this.userDevfile = userDevfile;\n  }\n\n  public UserDevfile getUserDevfile() {\n    return userDevfile;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile-shared/src/main/java/org/eclipse/che/api/devfile/shared/event/DevfileDeletedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.devfile.shared.event;\n\nimport com.google.common.annotations.Beta;\nimport org.eclipse.che.api.core.notification.EventOrigin;\n\n/** Informs about persisted devfile removal. */\n@EventOrigin(\"devfile\")\n@Beta\npublic class DevfileDeletedEvent {\n  private final String id;\n\n  public DevfileDeletedEvent(String id) {\n    this.id = id;\n  }\n\n  public String getId() {\n    return id;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-devfile-shared/src/main/java/org/eclipse/che/api/devfile/shared/event/DevfileUpdatedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.devfile.shared.event;\n\nimport com.google.common.annotations.Beta;\nimport org.eclipse.che.api.core.model.workspace.devfile.UserDevfile;\nimport org.eclipse.che.api.core.notification.EventOrigin;\n\n/** Informs about persisted devfile update. */\n@EventOrigin(\"devfile\")\n@Beta\npublic class DevfileUpdatedEvent {\n  private final UserDevfile userDevfile;\n\n  public DevfileUpdatedEvent(UserDevfile userDevfile) {\n    this.userDevfile = userDevfile;\n  }\n\n  public UserDevfile getUserDevfile() {\n    return userDevfile;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-factory</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Factory</name>\n    <properties>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-persist</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.swagger.core.v3</groupId>\n            <artifactId>swagger-annotations-jakarta</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.validation</groupId>\n            <artifactId>jakarta.validation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-user</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>jakarta.persistence</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-account</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-sql-schema</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.jpa</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Mock testing -->\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Mock testing of REST services -->\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>jcl-over-slf4j</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>jul-to-slf4j</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>log4j-over-slf4j</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Test dependencies -->\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <!-- Create the test jar -->\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>test-jar</goal>\n                        </goals>\n                        <configuration>\n                            <includes>\n                                <include>**/spi/tck/*.*</include>\n                            </includes>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/AdditionalFilenamesProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport com.google.common.base.Splitter;\nimport java.util.List;\nimport javax.inject.Inject;\nimport javax.inject.Named;\n\n/**\n * Reads, parses, and provide handful access to property which describes a list of additional files\n * required for devfile v2.\n */\npublic class AdditionalFilenamesProvider {\n\n  private final List<String> filenames;\n\n  @Inject\n  public AdditionalFilenamesProvider(\n      @Named(\"che.factory.devfile2_files_resolution_list\") String additionalFilenamesString) {\n    this.filenames = Splitter.on(\",\").splitToList(additionalFilenamesString);\n  }\n\n  public List<String> get() {\n    return filenames;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/ApiExceptionMapper.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport java.util.Collections;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.core.rest.shared.dto.ExtendedError;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl.DevfileLocation;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\n\n/**\n * Helps to convert {@link Exception}s with some specific causes into REST-friendly {@link\n * ApiException}\n */\npublic class ApiExceptionMapper {\n\n  public static ApiException toApiException(DevfileException devfileException) {\n    ApiException apiException = getApiException(devfileException.getCause());\n    return (apiException != null)\n        ? apiException\n        : new BadRequestException(\n            \"Error occurred during file content retrieval.\"\n                + \"Cause: \"\n                + devfileException.getMessage());\n  }\n\n  public static ApiException toApiException(ScmUnauthorizedException scmUnauthorizedException) {\n    ApiException apiException = getApiException(scmUnauthorizedException);\n    return (apiException != null)\n        ? apiException\n        : new BadRequestException(\n            \"Error occurred during SCM authorisation.\"\n                + \"Cause: \"\n                + scmUnauthorizedException.getMessage());\n  }\n\n  public static ApiException toApiException(ScmCommunicationException scmCommunicationException) {\n    ApiException apiException = getApiException(scmCommunicationException);\n    return (apiException != null)\n        ? apiException\n        : new ServerException(\n            \"Error occurred during SCM communication.\"\n                + \"Cause: \"\n                + scmCommunicationException.getMessage());\n  }\n\n  public static ApiException toApiException(\n      DevfileException devfileException, DevfileLocation location) {\n    ApiException cause = getApiException(devfileException.getCause());\n    return (cause != null)\n        ? cause\n        : new BadRequestException(\n            \"Error occurred during creation a workspace from devfile located at `\"\n                + location.location()\n                + \"`. Cause: \"\n                + devfileException.getMessage());\n  }\n\n  private static ApiException getApiException(Throwable throwable) {\n    if (throwable instanceof ScmUnauthorizedException) {\n      ScmUnauthorizedException scmCause = (ScmUnauthorizedException) throwable;\n      return new UnauthorizedException(\n          \"SCM Authentication required\",\n          401,\n          Map.of(\n              \"oauth_version\", scmCause.getOauthVersion(),\n              \"oauth_provider\", scmCause.getOauthProvider(),\n              \"oauth_authentication_url\", scmCause.getAuthenticateUrl()));\n    } else {\n      if (throwable instanceof UnknownScmProviderException) {\n        return new ServerException(\n            appendErrorMessage(\n                \"Provided location is unknown or misconfigured on the server side\",\n                throwable.getMessage()));\n      } else if (throwable instanceof ScmCommunicationException) {\n        return new ServerException(\n            newDto(ExtendedError.class)\n                .withMessage(\n                    appendErrorMessage(\n                        \"Error occurred during SCM communication.\", throwable.getMessage()))\n                .withErrorCode(404)\n                .withAttributes(\n                    Collections.singletonMap(\n                        \"provider\", ((ScmCommunicationException) throwable).getProvider())));\n      }\n    }\n    return null;\n  }\n\n  private static String appendErrorMessage(String message, String errorMessage) {\n    return message + (isNullOrEmpty(errorMessage) ? \"\" : \" Error message: \" + errorMessage);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/BaseFactoryParameterResolver.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static java.util.stream.Collectors.toMap;\nimport static org.eclipse.che.api.factory.shared.Constants.CURRENT_VERSION;\nimport static org.eclipse.che.api.factory.shared.Constants.DEFAULT_DEVFILE;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.Consumer;\nimport java.util.function.Supplier;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryVisitor;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.DevfileDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.ProjectDto;\n\npublic class BaseFactoryParameterResolver {\n\n  private final AuthorisationRequestManager authorisationRequestManager;\n  private final URLFactoryBuilder urlFactoryBuilder;\n  private final String providerName;\n\n  public BaseFactoryParameterResolver(\n      AuthorisationRequestManager authorisationRequestManager,\n      URLFactoryBuilder urlFactoryBuilder,\n      String providerName) {\n    this.authorisationRequestManager = authorisationRequestManager;\n    this.urlFactoryBuilder = urlFactoryBuilder;\n    this.providerName = providerName;\n  }\n\n  protected FactoryMetaDto createFactory(\n      Map<String, String> factoryParameters,\n      RemoteFactoryUrl factoryUrl,\n      FactoryVisitor factoryVisitor,\n      FileContentProvider contentProvider)\n      throws ApiException {\n\n    // create factory from the following location if location exists, else create default factory\n    return urlFactoryBuilder\n        .createFactoryFromDevfile(\n            factoryUrl,\n            contentProvider,\n            extractOverrideParams(factoryParameters),\n            getSkipAuthorisation(factoryParameters))\n        .orElseGet(\n            () ->\n                newDto(FactoryDevfileV2Dto.class)\n                    .withDevfile(DEFAULT_DEVFILE)\n                    .withV(CURRENT_VERSION)\n                    .withSource(\"repo\"))\n        .acceptVisitor(factoryVisitor);\n  }\n\n  protected boolean getSkipAuthorisation(Map<String, String> factoryParameters) {\n    String errorCode = \"error_code\";\n    boolean stored = authorisationRequestManager.isStored(providerName);\n    boolean skipAuthentication =\n        factoryParameters.get(errorCode) != null\n                && factoryParameters.get(errorCode).equals(\"access_denied\")\n            || stored;\n    if (skipAuthentication && !stored) {\n      authorisationRequestManager.store(providerName);\n    }\n    return skipAuthentication;\n  }\n\n  /**\n   * Returns priority of the resolver. Resolvers with higher priority will be used among matched\n   * resolvers.\n   */\n  public FactoryResolverPriority priority() {\n    return FactoryResolverPriority.DEFAULT;\n  }\n\n  /**\n   * Finds and returns devfile override parameters in general factory parameters map.\n   *\n   * @param factoryParameters map containing factory data parameters provided through URL\n   * @return filtered devfile values override map\n   */\n  protected Map<String, String> extractOverrideParams(Map<String, String> factoryParameters) {\n    String overridePrefix = \"override.\";\n    return factoryParameters.entrySet().stream()\n        .filter(e -> e.getKey().startsWith(overridePrefix))\n        .collect(toMap(e -> e.getKey().substring(overridePrefix.length()), Map.Entry::getValue));\n  }\n\n  /**\n   * If devfile has no projects, put there one provided by given `projectSupplier`. Otherwise update\n   * all projects with given `projectModifier`.\n   *\n   * @param devfile of the projects to update\n   * @param projectSupplier provides default project\n   * @param projectModifier updates existing projects\n   */\n  protected void updateProjects(\n      DevfileDto devfile,\n      Supplier<ProjectDto> projectSupplier,\n      Consumer<ProjectDto> projectModifier) {\n    List<ProjectDto> projects = devfile.getProjects();\n    if (projects.isEmpty()) {\n      devfile.setProjects(Collections.singletonList(projectSupplier.get()));\n    } else {\n      // update existing project with same repository, set current branch if needed\n      projects.forEach(projectModifier);\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/DtoConverter.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static java.util.stream.Collectors.toList;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.model.factory.Action;\nimport org.eclipse.che.api.core.model.factory.Author;\nimport org.eclipse.che.api.core.model.factory.Ide;\nimport org.eclipse.che.api.core.model.factory.OnAppClosed;\nimport org.eclipse.che.api.core.model.factory.OnAppLoaded;\nimport org.eclipse.che.api.core.model.factory.OnProjectsLoaded;\nimport org.eclipse.che.api.core.model.factory.Policies;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.factory.shared.dto.AuthorDto;\nimport org.eclipse.che.api.factory.shared.dto.IdeActionDto;\nimport org.eclipse.che.api.factory.shared.dto.IdeDto;\nimport org.eclipse.che.api.factory.shared.dto.OnAppClosedDto;\nimport org.eclipse.che.api.factory.shared.dto.OnAppLoadedDto;\nimport org.eclipse.che.api.factory.shared.dto.OnProjectsLoadedDto;\nimport org.eclipse.che.api.factory.shared.dto.PoliciesDto;\n\n/**\n * Helps to convert to DTOs related to factory.\n *\n * @author Anton Korneta\n */\npublic final class DtoConverter {\n\n  public static IdeDto asDto(Ide ide) {\n    final IdeDto ideDto = newDto(IdeDto.class);\n    final OnAppClosed onAppClosed = ide.getOnAppClosed();\n    final OnAppLoaded onAppLoaded = ide.getOnAppLoaded();\n    final OnProjectsLoaded onProjectsLoaded = ide.getOnProjectsLoaded();\n    if (onAppClosed != null) {\n      ideDto.withOnAppClosed(\n          newDto(OnAppClosedDto.class).withActions(asDto(onAppClosed.getActions())));\n    }\n    if (onAppLoaded != null) {\n      ideDto.withOnAppLoaded(\n          newDto(OnAppLoadedDto.class).withActions(asDto(onAppLoaded.getActions())));\n    }\n    if (onProjectsLoaded != null) {\n      ideDto.withOnProjectsLoaded(\n          newDto(OnProjectsLoadedDto.class).withActions(asDto(onProjectsLoaded.getActions())));\n    }\n    return ideDto;\n  }\n\n  public static AuthorDto asDto(Author author, User user) {\n    return newDto(AuthorDto.class)\n        .withUserId(author.getUserId())\n        .withName(user.getName())\n        .withEmail(user.getEmail())\n        .withCreated(author.getCreated());\n  }\n\n  public static IdeActionDto asDto(Action action) {\n    return newDto(IdeActionDto.class).withId(action.getId()).withProperties(action.getProperties());\n  }\n\n  public static List<IdeActionDto> asDto(List<? extends Action> actions) {\n    return actions.stream().map(DtoConverter::asDto).collect(toList());\n  }\n\n  public static PoliciesDto asDto(Policies policies) {\n    return newDto(PoliciesDto.class)\n        .withCreate(policies.getCreate())\n        .withReferer(policies.getReferer())\n        .withSince(policies.getSince())\n        .withUntil(policies.getUntil());\n  }\n\n  private DtoConverter() {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryAcceptValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\n\n/** Interface for validations of factory urls on accept stage. */\npublic interface FactoryAcceptValidator {\n\n  /**\n   * Validates factory object on accept stage. Implementation should throw {@link\n   * BadRequestException} if factory object is invalid.\n   *\n   * @param factory factory object to validate\n   * @throws BadRequestException in case if factory is not valid\n   */\n  void validateOnAccept(FactoryMetaDto factory) throws BadRequestException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryConstants.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\n/** Message constants for factory builder. */\npublic class FactoryConstants {\n  public static final String INVALID_PARAMETER_MESSAGE =\n      \"Passed in an invalid parameter. You either provided a non-valid parameter, or that parameter is not \"\n          + \"accepted for this Factory version. For more information, please visit \"\n          + \"http://docs.codenvy.com/user/project-lifecycle/#configuration-reference\";\n\n  public static final String INVALID_VERSION_MESSAGE =\n      \"You have provided an inaccurate or deprecated Factory Version. For more information, \"\n          + \"please visit https://www.eclipse.org/che/docs/factories_json_reference.html\";\n\n  public static final String UNPARSABLE_FACTORY_MESSAGE =\n      \"We cannot parse the provided factory. For more information, please visit https://www.eclipse.org/che/docs/factories_json_reference.html\";\n\n  public static final String MISSING_MANDATORY_MESSAGE =\n      \"You are missing a mandatory parameter \\\"%s\\\".  For more information, please visit https://www.eclipse.org/che/docs/factories_json_reference.html\";\n\n  public static final String PARAMETRIZED_INVALID_PARAMETER_MESSAGE =\n      \"You have provided an invalid parameter \\\"%s\\\" for this version of Factory parameters \\\"%s\\\". For more \"\n          + \"information, please visit https://www.eclipse.org/che/docs/factories_json_reference.html\";\n\n  public static final String INVALID_SINCE_MESSAGE =\n      \"Since date cannot occur before the current date.\";\n\n  public static final String INVALID_UNTIL_MESSAGE =\n      \"Until date cannot occur before the current date.\";\n\n  public static final String INVALID_SINCEUNTIL_MESSAGE =\n      \"Until date should occur after the Since date.\";\n\n  public static final String INVALID_ACTION_SECTION =\n      \"The action %s is not allowed in this IDE event section.\";\n\n  public static final String INVALID_OPENFILE_ACTION =\n      \"The openFile action requires 'file' property to be set.\";\n\n  public static final String INVALID_RUNCOMMAND_ACTION =\n      \"The runCommand action requires 'name' property to be set.\";\n\n  public static final String INVALID_FIND_REPLACE_ACTION =\n      \"The findReplace action requires 'in', \" + \"'find' and 'replace' properties to be set.\";\n\n  public static final String INVALID_WELCOME_PAGE_ACTION =\n      \"The openWelcomePage action requires 'greetingContentUrl' property to be set.\";\n\n  public static final String ILLEGAL_FACTORY_BY_SINCE_MESSAGE =\n      \"This Factory is not yet valid due to time restrictions applied by its owner. Please, \"\n          + \"contact owner for more information.\";\n\n  public static final String ILLEGAL_FACTORY_BY_UNTIL_MESSAGE =\n      \"This Factory has expired due to time restrictions applied by its owner. Please, \"\n          + \"contact owner for more information.\";\n\n  public static final String PARAMETRIZED_ILLEGAL_PARAMETER_VALUE_MESSAGE =\n      \"The parameter %s has a value submitted %s with a value that is unexpected. For more information, \"\n          + \"please visit https://www.eclipse.org/che/docs/workspace-data-model.html#projects\";\n\n  private FactoryConstants() {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryLinksHelper.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;\nimport static jakarta.ws.rs.core.MediaType.TEXT_HTML;\nimport static org.eclipse.che.api.core.util.LinksHelper.createLink;\nimport static org.eclipse.che.api.factory.shared.Constants.FACTORY_ACCEPTANCE_REL_ATT;\nimport static org.eclipse.che.api.factory.shared.Constants.NAMED_FACTORY_ACCEPTANCE_REL_ATT;\nimport static org.eclipse.che.api.factory.shared.Constants.RETRIEVE_FACTORY_REL_ATT;\n\nimport jakarta.ws.rs.HttpMethod;\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.util.LinkedList;\nimport java.util.List;\nimport org.eclipse.che.api.core.rest.ServiceContext;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\n\n/**\n * Helper class for creation links.\n *\n * @author Anton Korneta\n */\npublic class FactoryLinksHelper {\n\n  private FactoryLinksHelper() {}\n\n  /**\n   * Creates factory links.\n   *\n   * @param serviceContext the context to retrieve factory service base URI\n   * @return list of factory links\n   */\n  public static List<Link> createLinks(\n      FactoryMetaDto factory,\n      ServiceContext serviceContext,\n      AdditionalFilenamesProvider additionalFilenamesProvider,\n      String userName,\n      String repositoryUrl) {\n    final List<Link> links = new LinkedList<>();\n    final UriBuilder uriBuilder = serviceContext.getServiceUriBuilder();\n    final String factoryId = factory.getId();\n    if (factoryId != null) {\n      // creation of link to retrieve factory\n      links.add(\n          createLink(\n              HttpMethod.GET,\n              uriBuilder\n                  .clone()\n                  .path(FactoryService.class, \"getFactory\")\n                  .build(factoryId)\n                  .toString(),\n              null,\n              APPLICATION_JSON,\n              RETRIEVE_FACTORY_REL_ATT));\n      // creation of accept factory link\n      final Link createWorkspace =\n          createLink(\n              HttpMethod.GET,\n              uriBuilder.clone().replacePath(\"f\").queryParam(\"id\", factoryId).build().toString(),\n              null,\n              TEXT_HTML,\n              FACTORY_ACCEPTANCE_REL_ATT);\n      links.add(createWorkspace);\n    }\n\n    if (!isNullOrEmpty(factory.getName()) && !isNullOrEmpty(userName)) {\n      // creation of accept factory link by name and creator\n      final Link createWorkspaceFromNamedFactory =\n          createLink(\n              HttpMethod.GET,\n              uriBuilder\n                  .clone()\n                  .replacePath(\"f\")\n                  .queryParam(\"name\", factory.getName())\n                  .queryParam(\"user\", userName)\n                  .build()\n                  .toString(),\n              null,\n              TEXT_HTML,\n              NAMED_FACTORY_ACCEPTANCE_REL_ATT);\n      links.add(createWorkspaceFromNamedFactory);\n    }\n\n    if (factory instanceof FactoryDevfileV2Dto) {\n      // link to devfile source\n      if (!isNullOrEmpty(factory.getSource())) {\n        links.add(\n            createLink(\n                HttpMethod.GET,\n                uriBuilder\n                    .clone()\n                    .replacePath(\"api\")\n                    .path(ScmService.class)\n                    .path(ScmService.class, \"resolveFile\")\n                    .queryParam(\"repository\", repositoryUrl)\n                    .queryParam(\"file\", factory.getSource())\n                    .build(factoryId)\n                    .toString(),\n                factory.getSource() + \" content\"));\n      }\n      if (((FactoryDevfileV2Dto) factory).getScmInfo() != null) {\n        // additional files links\n        for (String additionalFile : additionalFilenamesProvider.get()) {\n          links.add(\n              createLink(\n                  HttpMethod.GET,\n                  uriBuilder\n                      .clone()\n                      .replacePath(\"api\")\n                      .path(ScmService.class)\n                      .path(ScmService.class, \"resolveFile\")\n                      .queryParam(\"repository\", repositoryUrl)\n                      .queryParam(\"file\", additionalFile)\n                      .build(factoryId)\n                      .toString(),\n                  additionalFile + \" content\"));\n        }\n      }\n    }\n    return links;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryManager.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.util.Objects.requireNonNull;\n\nimport java.util.List;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.factory.Factory;\nimport org.eclipse.che.api.factory.server.model.impl.AuthorImpl;\nimport org.eclipse.che.api.factory.server.model.impl.FactoryImpl;\nimport org.eclipse.che.api.factory.server.spi.FactoryDao;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * @author Anton Korneta\n */\n@Singleton\npublic class FactoryManager {\n\n  private final FactoryDao factoryDao;\n\n  @Inject\n  public FactoryManager(FactoryDao factoryDao) {\n    this.factoryDao = factoryDao;\n  }\n\n  /**\n   * Stores {@link Factory} instance.\n   *\n   * @param factory instance of factory which would be stored\n   * @return factory which has been stored\n   * @throws NullPointerException when {@code factory} is null\n   * @throws ConflictException when any conflict occurs (e.g Factory with given name already exists\n   *     for {@code creator})\n   * @throws ServerException when any server errors occurs\n   */\n  public Factory saveFactory(Factory factory) throws ConflictException, ServerException {\n    requireNonNull(factory);\n    final FactoryImpl newFactory = new FactoryImpl(factory);\n    newFactory.setId(NameGenerator.generate(\"factory\", 16));\n    if (isNullOrEmpty(newFactory.getName())) {\n      newFactory.setName(NameGenerator.generate(\"f\", 9));\n    }\n    return factoryDao.create(newFactory);\n  }\n\n  /**\n   * Updates factory in accordance to the new configuration.\n   *\n   * <p>Note: Updating uses replacement strategy, therefore existing factory would be replaced with\n   * given update {@code update}\n   *\n   * @param update factory update\n   * @return updated factory\n   * @throws NullPointerException when {@code update} is null\n   * @throws ConflictException when any conflict occurs (e.g Factory with given name already exists\n   *     for {@code creator})\n   * @throws NotFoundException when factory with given id not found\n   * @throws ServerException when any server error occurs\n   */\n  public Factory updateFactory(Factory update)\n      throws ConflictException, NotFoundException, ServerException {\n    requireNonNull(update);\n    final AuthorImpl creator = factoryDao.getById(update.getId()).getCreator();\n    return factoryDao.update(\n        FactoryImpl.builder()\n            .from(new FactoryImpl(update))\n            .setCreator(new AuthorImpl(creator.getUserId(), creator.getCreated()))\n            .build());\n  }\n\n  /**\n   * Removes stored {@link Factory} by given id.\n   *\n   * @param id factory identifier\n   * @throws NullPointerException when {@code id} is null\n   * @throws ServerException when any server errors occurs\n   */\n  public void removeFactory(String id) throws ServerException {\n    requireNonNull(id);\n    factoryDao.remove(id);\n  }\n\n  /**\n   * Gets factory by given id.\n   *\n   * @param id factory identifier\n   * @return factory instance\n   * @throws NullPointerException when {@code id} is null\n   * @throws NotFoundException when factory with given id not found\n   * @throws ServerException when any server errors occurs\n   */\n  public Factory getById(String id) throws NotFoundException, ServerException {\n    requireNonNull(id);\n    return factoryDao.getById(id);\n  }\n\n  /**\n   * Get list of factories which conform specified attributes.\n   *\n   * @param maxItems max number of items in response\n   * @param skipCount skip items. Must be equals or greater then {@code 0}\n   * @param attributes skip items. Must be equals or greater then {@code 0}\n   * @return stored data, if specified attributes is correct\n   * @throws ServerException when any server errors occurs\n   */\n  public Page<? extends Factory> getByAttribute(\n      int maxItems, int skipCount, List<Pair<String, String>> attributes) throws ServerException {\n    return factoryDao.getByAttributes(maxItems, skipCount, attributes);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryParameterValidator.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\n\n/**\n * @author Alexander Garagatyi\n */\npublic interface FactoryParameterValidator<T> {\n  void validate(T arg, FactoryParameter.Version version) throws ConflictException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryParametersResolver.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\n\n/**\n * Defines a resolver that will produce factories for some parameters\n *\n * @author Florent Benoit\n */\npublic interface FactoryParametersResolver {\n  /**\n   * Resolver acceptance based on the given parameters.\n   *\n   * @param factoryParameters map of parameters dedicated to factories\n   * @return true if it will be accepted by the resolver implementation or false if it is not\n   *     accepted\n   */\n  boolean accept(@NotNull Map<String, String> factoryParameters);\n\n  /** Returns the name of the provider */\n  String getProviderName();\n\n  /**\n   * Create factory object based on provided parameters\n   *\n   * @param factoryParameters map containing factory data parameters provided through URL\n   * @throws BadRequestException when data are invalid\n   */\n  FactoryMetaDto createFactory(@NotNull Map<String, String> factoryParameters) throws ApiException;\n\n  /**\n   * Parses a factory Url String to a {@link RemoteFactoryUrl} object\n   *\n   * @param factoryUrl the factory Url string\n   * @return {@link RemoteFactoryUrl} representation of the factory URL\n   * @throws ApiException when authentication required operations fail\n   */\n  RemoteFactoryUrl parseFactoryUrl(String factoryUrl) throws ApiException;\n\n  /**\n   * Returns priority of the resolver. Resolvers with higher priority will be used among matched\n   * resolvers.\n   */\n  FactoryResolverPriority priority();\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryResolverPriority.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\npublic enum FactoryResolverPriority {\n  DEFAULT(1),\n  HIGHEST(2),\n  LOWEST(0);\n\n  private final int value;\n\n  FactoryResolverPriority(int value) {\n    this.value = value;\n  }\n\n  public int getValue() {\n    return value;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;\nimport static java.util.Collections.singletonMap;\nimport static java.util.Comparator.comparingInt;\nimport static org.eclipse.che.api.factory.server.ApiExceptionMapper.toApiException;\nimport static org.eclipse.che.api.factory.server.FactoryLinksHelper.createLinks;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.Parameter;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.ws.rs.Consumes;\nimport jakarta.ws.rs.DefaultValue;\nimport jakarta.ws.rs.POST;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.QueryParam;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.rest.Service;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\n\n/**\n * Defines Factory REST API.\n *\n * @author Anton Korneta\n * @author Florent Benoit\n */\n@Tag(name = \"factory\", description = \"Factory manager\")\n@Path(\"/factory\")\npublic class FactoryService extends Service {\n\n  /** Error message if there is no plugged resolver. */\n  public static final String FACTORY_NOT_RESOLVABLE =\n      \"Cannot build factory with any of the provided parameters. Please check parameters correctness, and resend query.\";\n\n  /** Validate query parameter. If true, factory will be validated */\n  public static final String VALIDATE_QUERY_PARAMETER = \"validate\";\n\n  private final FactoryAcceptValidator acceptValidator;\n  private final FactoryParametersResolverHolder factoryParametersResolverHolder;\n  private final AdditionalFilenamesProvider additionalFilenamesProvider;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n  private final AuthorisationRequestManager authorisationRequestManager;\n\n  @Inject\n  public FactoryService(\n      FactoryAcceptValidator acceptValidator,\n      FactoryParametersResolverHolder factoryParametersResolverHolder,\n      AdditionalFilenamesProvider additionalFilenamesProvider,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      AuthorisationRequestManager authorisationRequestManager) {\n    this.acceptValidator = acceptValidator;\n    this.factoryParametersResolverHolder = factoryParametersResolverHolder;\n    this.additionalFilenamesProvider = additionalFilenamesProvider;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n    this.authorisationRequestManager = authorisationRequestManager;\n  }\n\n  @POST\n  @Path(\"/resolver\")\n  @Consumes(APPLICATION_JSON)\n  @Produces(APPLICATION_JSON)\n  @Operation(\n      summary = \"Create factory by providing map of parameters. Get JSON with factory information\",\n      responses = {\n        @ApiResponse(\n            responseCode = \"200\",\n            description = \"Factory successfully built from parameters\"),\n        @ApiResponse(\n            responseCode = \"400\",\n            description = \"Missed required parameters, failed to validate factory\"),\n        @ApiResponse(responseCode = \"500\", description = \"Internal server error\")\n      })\n  public FactoryMetaDto resolveFactory(\n      @Parameter(description = \"Parameters provided to create factories\")\n          Map<String, String> parameters,\n      @Parameter(\n              description =\n                  \"Whether or not to validate values like it is done when accepting a Factory\")\n          @DefaultValue(\"false\")\n          @QueryParam(VALIDATE_QUERY_PARAMETER)\n          Boolean validate)\n      throws ApiException {\n\n    // check parameter\n    requiredNotNull(parameters, \"Factory build parameters\");\n\n    // search matching resolver and create factory from matching resolver\n    FactoryMetaDto resolvedFactory =\n        factoryParametersResolverHolder\n            .getFactoryParametersResolver(parameters)\n            .createFactory(parameters);\n    if (resolvedFactory == null) {\n      throw new BadRequestException(FACTORY_NOT_RESOLVABLE);\n    }\n    if (validate) {\n      acceptValidator.validateOnAccept(resolvedFactory);\n    }\n\n    resolvedFactory = injectLinks(resolvedFactory, parameters);\n\n    return resolvedFactory;\n  }\n\n  @POST\n  @Path(\"/token/refresh\")\n  @Operation(\n      summary = \"Validate the the factory related OAuth token and update/create it if needed\",\n      responses = {\n        @ApiResponse(\n            responseCode = \"200\",\n            description =\n                \"The factory related OAuth token is valid or has been updated successfully\"),\n        @ApiResponse(\n            responseCode = \"401\",\n            description = \"Failed to update the factory related OAuth token\"),\n        @ApiResponse(responseCode = \"500\", description = \"Internal server error\")\n      })\n  public void refreshToken(@Parameter(description = \"Factory url\") @QueryParam(\"url\") String url)\n      throws ApiException {\n\n    // check parameter\n    requiredNotNull(url, \"Factory url\");\n\n    try {\n      FactoryParametersResolver factoryParametersResolver =\n          factoryParametersResolverHolder.getFactoryParametersResolver(\n              singletonMap(URL_PARAMETER_NAME, url));\n      if (!authorisationRequestManager.isStored(factoryParametersResolver.getProviderName())) {\n        String scmServerUrl = factoryParametersResolver.parseFactoryUrl(url).getProviderUrl();\n        if (Boolean.parseBoolean(System.getenv(\"CHE_FORCE_REFRESH_PERSONAL_ACCESS_TOKEN\"))) {\n          personalAccessTokenManager.forceRefreshPersonalAccessToken(scmServerUrl);\n        } else {\n          personalAccessTokenManager.getAndStore(scmServerUrl);\n        }\n      }\n    } catch (ScmConfigurationPersistenceException | UnsatisfiedScmPreconditionException e) {\n      throw new ApiException(e);\n    } catch (ScmUnauthorizedException e) {\n      throw toApiException(e);\n    } catch (ScmCommunicationException e) {\n      throw toApiException(e);\n    } catch (UnknownScmProviderException e) {\n      // ignore the exception as it is not a problem if the provider from the given URL is unknown\n    }\n  }\n\n  /** Injects factory links */\n  private FactoryMetaDto injectLinks(FactoryMetaDto factory, Map<String, String> parameters) {\n    return factory.withLinks(\n        createLinks(\n            factory,\n            getServiceContext(),\n            additionalFilenamesProvider,\n            null,\n            parameters.get(URL_PARAMETER_NAME)));\n  }\n\n  /** Usage of a dedicated class to manage the optional service-specific resolvers */\n  protected static class FactoryParametersResolverHolder {\n\n    @Inject\n    @SuppressWarnings(\"unused\")\n    private Set<FactoryParametersResolver> specificFactoryParametersResolvers;\n\n    /**\n     * Provides a suitable resolver for the given parameters. If there is no at least one resolver\n     * able to process parameters,then {@link BadRequestException} will be thrown\n     *\n     * @return suitable service-specific resolver or default one\n     */\n    public FactoryParametersResolver getFactoryParametersResolver(Map<String, String> parameters)\n        throws BadRequestException {\n      Optional<FactoryParametersResolver> resolverOptional =\n          specificFactoryParametersResolvers.stream()\n              .filter(\n                  r -> {\n                    try {\n                      return r.accept(parameters);\n                    } catch (IllegalArgumentException e) {\n                      return false;\n                    }\n                  })\n              .max(comparingInt(r -> r.priority().getValue()));\n      if (resolverOptional.isPresent()) {\n        return resolverOptional.get();\n      }\n      throw new BadRequestException(FACTORY_NOT_RESOLVABLE);\n    }\n  }\n\n  /**\n   * Checks object reference is not {@code null}\n   *\n   * @param object object reference to check\n   * @param subject used as subject of exception message \"{subject} required\"\n   * @throws BadRequestException when object reference is {@code null}\n   */\n  private static void requiredNotNull(Object object, String subject) throws BadRequestException {\n    if (object == null) {\n      throw new BadRequestException(subject + \" required\");\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/LegacyConverter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.model.factory.Factory;\n\n/**\n * Convert legacy factory parameter to new the latest format\n *\n * @author Alexander Garagatyi\n */\npublic interface LegacyConverter {\n  void convert(Factory factory) throws ApiException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/RawDevfileUrlFactoryParameterResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.factory.server.FactoryResolverPriority.HIGHEST;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport jakarta.validation.constraints.NotNull;\nimport java.io.IOException;\nimport java.net.MalformedURLException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.net.URL;\nimport java.util.Map;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.factory.server.urlfactory.DefaultFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileParser;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.URLFileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\n\n/**\n * {@link FactoryParametersResolver} implementation to resolve factory based on url parameter as a\n * direct URL to a devfile content. Extracts and applies devfile values override parameters.\n */\npublic class RawDevfileUrlFactoryParameterResolver extends BaseFactoryParameterResolver\n    implements FactoryParametersResolver {\n\n  private static final String PROVIDER_NAME = \"raw-devfile-url\";\n\n  protected final URLFactoryBuilder urlFactoryBuilder;\n  protected final URLFetcher urlFetcher;\n  private final DevfileParser devfileParser;\n\n  @Inject\n  public RawDevfileUrlFactoryParameterResolver(\n      URLFactoryBuilder urlFactoryBuilder, URLFetcher urlFetcher, DevfileParser devfileParser) {\n    super(null, urlFactoryBuilder, PROVIDER_NAME);\n    this.urlFactoryBuilder = urlFactoryBuilder;\n    this.urlFetcher = urlFetcher;\n    this.devfileParser = devfileParser;\n  }\n\n  /**\n   * Check if this resolver can be used with the given parameters.\n   *\n   * @param factoryParameters map of parameters dedicated to factories\n   * @return true if it will be accepted by the resolver implementation or false if it is not\n   *     accepted\n   */\n  @Override\n  public boolean accept(Map<String, String> factoryParameters) {\n    String url = factoryParameters.get(URL_PARAMETER_NAME);\n    return !isNullOrEmpty(url) && containsYaml(url);\n  }\n\n  private boolean containsYaml(String requestURL) {\n    try {\n      Optional<String> credentials = new DefaultFactoryUrl().withUrl(requestURL).getCredentials();\n      URLFileContentProvider urlFileContentProvider =\n          new URLFileContentProvider(new URL(requestURL).toURI(), urlFetcher);\n      String fetch = urlFileContentProvider.fetchContent(requestURL, credentials.orElse(null));\n      JsonNode parsedYaml = devfileParser.parseYamlRaw(fetch);\n      return !parsedYaml.isEmpty();\n    } catch (IOException | URISyntaxException | DevfileException e) {\n      return false;\n    }\n  }\n\n  @Override\n  public String getProviderName() {\n    return PROVIDER_NAME;\n  }\n\n  /**\n   * Creates factory based on provided parameters. Presumes url parameter as direct URL to a devfile\n   * content.\n   *\n   * @param factoryParameters map containing factory data parameters provided through URL\n   */\n  @Override\n  public FactoryMetaDto createFactory(@NotNull final Map<String, String> factoryParameters)\n      throws ApiException {\n    // This should never be null, because our contract in #accept prohibits that\n    String devfileLocation = factoryParameters.get(URL_PARAMETER_NAME);\n\n    URI devfileURI;\n    try {\n      devfileURI = new URL(devfileLocation).toURI();\n    } catch (MalformedURLException | URISyntaxException e) {\n      throw new BadRequestException(\n          format(\n              \"Unable to process provided factory URL. Please check its validity and try again. Parser message: %s\",\n              e.getMessage()));\n    }\n    return urlFactoryBuilder\n        .createFactoryFromDevfile(\n            new DefaultFactoryUrl()\n                .withDevfileFileLocation(devfileLocation)\n                .withUrl(devfileLocation),\n            new URLFileContentProvider(devfileURI, urlFetcher),\n            extractOverrideParams(factoryParameters),\n            false)\n        .orElse(null);\n  }\n\n  @Override\n  public RemoteFactoryUrl parseFactoryUrl(String factoryUrl) throws ApiException {\n    throw new ApiException(\"Operation is not supported\");\n  }\n\n  @Override\n  public FactoryResolverPriority priority() {\n    return HIGHEST;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/ScmFileResolver.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport org.eclipse.che.api.core.ApiException;\n\n/** Defines a resolver that will resolve particular file content in specified SCM repository. */\npublic interface ScmFileResolver {\n\n  /**\n   * Resolver acceptance based on the given repository URL.\n   *\n   * @param repository repository URL to resolve file\n   * @return true if it will be accepted by the resolver implementation or false if it is not\n   *     accepted\n   */\n  boolean accept(String repository);\n\n  /**\n   * Resolves particular file in the given repository.\n   *\n   * @param repository repository URL to resolve file\n   * @param filePath path to the desired file\n   * @return content of the file if it is present in repository\n   * @throws ApiException if the given file is absent or other error occurs\n   */\n  String fileContent(String repository, String filePath) throws ApiException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/ScmService.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.Parameter;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.QueryParam;\nimport jakarta.ws.rs.core.Response;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.rest.Service;\n\n@Tag(name = \"scm\")\n@Path(\"/scm\")\npublic class ScmService extends Service {\n\n  private final Set<ScmFileResolver> specificScmFileResolvers;\n\n  @Inject\n  public ScmService(Set<ScmFileResolver> specificScmFileResolvers) {\n    this.specificScmFileResolvers = specificScmFileResolvers;\n  }\n\n  @GET\n  @Path(\"/resolve\")\n  @Operation(\n      summary = \"Get file content by specific repository and filename.\",\n      responses = {\n        @ApiResponse(\n            responseCode = \"200\",\n            description = \"Factory successfully built from parameters\"),\n        @ApiResponse(responseCode = \"400\", description = \"Missed required parameters.\"),\n        @ApiResponse(responseCode = \"404\", description = \"Requested file not found.\"),\n        @ApiResponse(responseCode = \"500\", description = \"Internal server error\")\n      })\n  public Response resolveFile(\n      @Parameter(description = \"Repository URL\") @QueryParam(\"repository\") String repository,\n      @Parameter(description = \"File name or path\") @QueryParam(\"file\") String filePath)\n      throws ApiException {\n    requireNonNull(repository, \"Repository\");\n    requireNonNull(repository, \"File\");\n    String content = getScmFileResolver(repository).fileContent(repository, filePath);\n    return Response.ok().entity(content).build();\n  }\n\n  /**\n   * Checks object reference is not {@code null}\n   *\n   * @param object object reference to check\n   * @param subject used as subject of exception message \"{subject} required\"\n   * @throws BadRequestException when object reference is {@code null}\n   */\n  private static void requireNonNull(Object object, String subject) throws BadRequestException {\n    if (object == null) {\n      throw new BadRequestException(subject + \" parameter is required\");\n    }\n  }\n\n  /**\n   * Provides a suitable file resolver for the given parameters. If there is no at least one\n   * resolver able to process parameters,then {@link BadRequestException} will be thrown\n   *\n   * @return suitable service-specific resolver or default one\n   */\n  public ScmFileResolver getScmFileResolver(String repository) throws BadRequestException {\n    for (ScmFileResolver scmFileResolver : specificScmFileResolvers) {\n      if (scmFileResolver.accept(repository)) {\n        return scmFileResolver;\n      }\n    }\n    throw new BadRequestException(\"Cannot find suitable file resolver for the provided URL.\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/ValueHelper.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport java.util.Collection;\nimport java.util.Map;\n\n/**\n * @author Sergii Kabashniuk\n */\npublic class ValueHelper {\n  /**\n   * Check that value wasn't set by json parser.\n   *\n   * @param value - value to check\n   * @return - true if value is useless for factory (empty string, collection or map), false\n   *     otherwise\n   */\n  public static boolean isEmpty(Object value) {\n    return (null == value)\n        || ((value.getClass().equals(String.class) && isNullOrEmpty((String) value))\n            || (Collection.class.isAssignableFrom(value.getClass())\n                && ((Collection) value).isEmpty())\n            || (Map.class.isAssignableFrom(value.getClass()) && ((Map) value).isEmpty()));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/impl/FactoryAcceptValidatorImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.impl;\n\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.factory.server.FactoryAcceptValidator;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\n\n/** Factory accept stage validator. */\n@Singleton\npublic class FactoryAcceptValidatorImpl extends FactoryBaseValidator\n    implements FactoryAcceptValidator {\n\n  @Override\n  public void validateOnAccept(FactoryMetaDto factory) throws BadRequestException {\n    validateCurrentTimeBetweenSinceUntil(factory);\n    validateProjectActions(factory);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/impl/FactoryBaseValidator.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.impl;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.lang.System.currentTimeMillis;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.factory.server.FactoryConstants;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\nimport org.eclipse.che.api.factory.shared.dto.IdeActionDto;\nimport org.eclipse.che.api.factory.shared.dto.IdeDto;\nimport org.eclipse.che.api.factory.shared.dto.OnAppLoadedDto;\nimport org.eclipse.che.api.factory.shared.dto.OnProjectsLoadedDto;\nimport org.eclipse.che.api.factory.shared.dto.PoliciesDto;\n\n/**\n * Validates values of factory parameters.\n *\n * @author Alexander Garagatyi\n * @author Valeriy Svydenko\n */\npublic abstract class FactoryBaseValidator {\n  private static final Pattern PROJECT_NAME_VALIDATOR =\n      Pattern.compile(\"^[\\\\\\\\\\\\w\\\\\\\\\\\\d]+[\\\\\\\\\\\\w\\\\\\\\\\\\d_.-]*$\");\n\n  /**\n   * Validates that factory can be used at present time (used on accept)\n   *\n   * @param factory factory to validate\n   * @throws BadRequestException if since date greater than current date<br>\n   * @throws BadRequestException if until date less than current date<br>\n   */\n  protected void validateCurrentTimeBetweenSinceUntil(FactoryMetaDto factory)\n      throws BadRequestException {\n    final PoliciesDto policies = factory.getPolicies();\n    if (policies == null) {\n      return;\n    }\n\n    final Long since = policies.getSince() == null ? 0L : policies.getSince();\n    final Long until = policies.getUntil() == null ? 0L : policies.getUntil();\n\n    if (since != 0 && currentTimeMillis() < since) {\n      throw new BadRequestException(FactoryConstants.ILLEGAL_FACTORY_BY_SINCE_MESSAGE);\n    }\n\n    if (until != 0 && currentTimeMillis() > until) {\n      throw new BadRequestException(FactoryConstants.ILLEGAL_FACTORY_BY_UNTIL_MESSAGE);\n    }\n  }\n\n  /**\n   * Validates IDE actions\n   *\n   * @param factory factory to validate\n   * @throws BadRequestException when factory actions is invalid\n   */\n  protected void validateProjectActions(FactoryMetaDto factory) throws BadRequestException {\n    final IdeDto ide = factory.getIde();\n    if (ide == null) {\n      return;\n    }\n\n    final List<IdeActionDto> applicationActions = new ArrayList<>();\n    if (ide.getOnAppClosed() != null) {\n      applicationActions.addAll(ide.getOnAppClosed().getActions());\n    }\n    if (ide.getOnAppLoaded() != null) {\n      applicationActions.addAll(ide.getOnAppLoaded().getActions());\n    }\n\n    for (IdeActionDto applicationAction : applicationActions) {\n      String id = applicationAction.getId();\n      if (\"openFile\".equals(id)\n          || \"findReplace\".equals(id)\n          || \"runCommand\".equals(id)\n          || \"newTerminal\".equals(id)) {\n        throw new BadRequestException(format(FactoryConstants.INVALID_ACTION_SECTION, id));\n      }\n    }\n\n    final OnAppLoadedDto onAppLoaded = ide.getOnAppLoaded();\n    if (onAppLoaded != null) {\n      for (IdeActionDto action : onAppLoaded.getActions()) {\n        final Map<String, String> properties = action.getProperties();\n        if (\"openWelcomePage\".equals(action.getId())\n            && isNullOrEmpty(properties.get(\"greetingContentUrl\"))) {\n          throw new BadRequestException(FactoryConstants.INVALID_WELCOME_PAGE_ACTION);\n        }\n      }\n    }\n\n    final OnProjectsLoadedDto onLoaded = ide.getOnProjectsLoaded();\n    if (onLoaded != null) {\n      final List<IdeActionDto> onProjectOpenedActions = onLoaded.getActions();\n      for (IdeActionDto applicationAction : onProjectOpenedActions) {\n        final String id = applicationAction.getId();\n        final Map<String, String> properties = applicationAction.getProperties();\n\n        switch (id) {\n          case \"openFile\":\n            if (isNullOrEmpty(properties.get(\"file\"))) {\n              throw new BadRequestException(FactoryConstants.INVALID_OPENFILE_ACTION);\n            }\n            break;\n\n          case \"runCommand\":\n            if (isNullOrEmpty(properties.get(\"name\"))) {\n              throw new BadRequestException(FactoryConstants.INVALID_RUNCOMMAND_ACTION);\n            }\n            break;\n\n          case \"findReplace\":\n            if (isNullOrEmpty(properties.get(\"in\"))\n                || isNullOrEmpty(properties.get(\"find\"))\n                || isNullOrEmpty(properties.get(\"replace\"))) {\n              throw new BadRequestException(FactoryConstants.INVALID_FIND_REPLACE_ACTION);\n            }\n            break;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/impl/SourceStorageParametersValidator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.impl;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.factory.server.FactoryConstants.PARAMETRIZED_ILLEGAL_PARAMETER_VALUE_MESSAGE;\nimport static org.eclipse.che.api.factory.server.FactoryConstants.PARAMETRIZED_INVALID_PARAMETER_MESSAGE;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.workspace.config.SourceStorage;\nimport org.eclipse.che.api.factory.server.FactoryParameterValidator;\n\n/**\n * @author Alexander Garagatyi\n * @author Valeriy Svydenko\n */\npublic class SourceStorageParametersValidator implements FactoryParameterValidator<SourceStorage> {\n  @Override\n  public void validate(SourceStorage source, FactoryParameter.Version version)\n      throws ConflictException {\n    for (Map.Entry<String, String> entry : source.getParameters().entrySet()) {\n      switch (entry.getKey()) {\n        case \"keepVcs\":\n          final String keepVcs = entry.getValue();\n          if (!\"true\".equals(keepVcs) && !\"false\".equals(keepVcs)) {\n            throw new ConflictException(\n                format(\n                    PARAMETRIZED_ILLEGAL_PARAMETER_VALUE_MESSAGE,\n                    \"source.project.parameters.keepVcs\",\n                    entry.getValue()));\n          }\n          break;\n        case \"skipFirstLevel\":\n          final String skipFirstLevel = entry.getValue();\n          if (!\"true\".equals(skipFirstLevel) && !\"false\".equals(skipFirstLevel)) {\n            throw new ConflictException(\n                format(\n                    PARAMETRIZED_ILLEGAL_PARAMETER_VALUE_MESSAGE,\n                    \"project.source.parameters.skipFirstLevel\",\n                    entry.getValue()));\n          }\n          break;\n        case \"branch\":\n        case \"startPoint\":\n        case \"commitId\":\n        case \"keepDir\":\n        case \"fetch\":\n        case \"branchMerge\":\n          break;\n        default:\n          throw new ConflictException(\n              format(\n                  PARAMETRIZED_INVALID_PARAMETER_MESSAGE,\n                  \"source.project.parameters.\" + entry.getKey(),\n                  version));\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/jpa/FactoryJpaModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.jpa;\n\nimport com.google.inject.AbstractModule;\nimport org.eclipse.che.api.factory.server.spi.FactoryDao;\n\n/**\n * @author Yevhenii Voevodin\n */\npublic class FactoryJpaModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    bind(FactoryDao.class).to(JpaFactoryDao.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/jpa/JpaFactoryDao.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.jpa;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.singletonList;\nimport static java.util.Objects.requireNonNull;\nimport static java.util.stream.Collectors.toList;\n\nimport com.google.inject.persist.Transactional;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.StringJoiner;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport javax.persistence.EntityManager;\nimport javax.persistence.TypedQuery;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.factory.server.model.impl.FactoryImpl;\nimport org.eclipse.che.api.factory.server.spi.FactoryDao;\nimport org.eclipse.che.api.workspace.server.model.impl.ProjectConfigImpl;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * @author Anton Korneta\n */\n@Singleton\npublic class JpaFactoryDao implements FactoryDao {\n  private static final Logger LOG = LoggerFactory.getLogger(JpaFactoryDao.class);\n\n  @Inject private Provider<EntityManager> managerProvider;\n\n  @Override\n  public FactoryImpl create(FactoryImpl factory) throws ConflictException, ServerException {\n    requireNonNull(factory);\n    try {\n      doCreate(factory);\n    } catch (RuntimeException ex) {\n      throw new ServerException(ex.getLocalizedMessage(), ex);\n    }\n    return new FactoryImpl(factory);\n  }\n\n  @Override\n  public FactoryImpl update(FactoryImpl update)\n      throws NotFoundException, ConflictException, ServerException {\n    requireNonNull(update);\n    try {\n      return new FactoryImpl(doUpdate(update));\n    } catch (RuntimeException ex) {\n      throw new ServerException(ex.getLocalizedMessage(), ex);\n    }\n  }\n\n  @Override\n  public void remove(String id) throws ServerException {\n    requireNonNull(id);\n    try {\n      doRemove(id);\n    } catch (RuntimeException ex) {\n      throw new ServerException(ex.getLocalizedMessage(), ex);\n    }\n  }\n\n  @Override\n  @Transactional(rollbackOn = {ServerException.class})\n  public FactoryImpl getById(String id) throws NotFoundException, ServerException {\n    requireNonNull(id);\n    try {\n      final FactoryImpl factory = managerProvider.get().find(FactoryImpl.class, id);\n      if (factory == null) {\n        throw new NotFoundException(format(\"Factory with id '%s' doesn't exist\", id));\n      }\n      return new FactoryImpl(factory);\n    } catch (RuntimeException ex) {\n      throw new ServerException(ex.getLocalizedMessage(), ex);\n    }\n  }\n\n  @Override\n  @Transactional(rollbackOn = {ServerException.class})\n  public Page<FactoryImpl> getByAttributes(\n      int maxItems, int skipCount, List<Pair<String, String>> attributes) throws ServerException {\n    checkArgument(maxItems >= 0, \"The number of items to return can't be negative.\");\n    checkArgument(\n        skipCount >= 0,\n        \"The number of items to skip can't be negative or greater than \" + Integer.MAX_VALUE);\n    try {\n      LOG.debug(\n          \"FactoryDao#getByAttributes #maxItems: {} #skipCount: {}, #attributes: {}\",\n          maxItems,\n          skipCount,\n          attributes);\n      final long count = countFactoriesByAttributes(attributes);\n      if (count == 0) {\n        return new Page<>(emptyList(), skipCount, maxItems, count);\n      }\n      List<FactoryImpl> result = getFactoriesByAttributes(maxItems, skipCount, attributes);\n      return new Page<>(result, skipCount, maxItems, count);\n    } catch (RuntimeException ex) {\n      throw new ServerException(ex.getLocalizedMessage(), ex);\n    }\n  }\n\n  @Override\n  @Transactional(rollbackOn = {ServerException.class})\n  public Page<FactoryImpl> getByUser(String userId, int maxItems, long skipCount)\n      throws ServerException {\n    requireNonNull(userId);\n    final Pair<String, String> factoryCreator = Pair.of(\"creator.userId\", userId);\n    try {\n      long totalCount = countFactoriesByAttributes(singletonList(factoryCreator));\n      return new Page<>(\n          getFactoriesByAttributes(maxItems, skipCount, singletonList(factoryCreator)),\n          skipCount,\n          maxItems,\n          totalCount);\n    } catch (RuntimeException ex) {\n      throw new ServerException(ex.getMessage(), ex);\n    }\n  }\n\n  private List<FactoryImpl> getFactoriesByAttributes(\n      int maxItems, long skipCount, List<Pair<String, String>> attributes) {\n    final Map<String, String> params = new HashMap<>();\n    StringBuilder query = new StringBuilder(\"SELECT factory FROM Factory factory\");\n    if (!attributes.isEmpty()) {\n      final StringJoiner matcher = new StringJoiner(\" AND \", \" WHERE \", \" \");\n      int i = 0;\n      for (Pair<String, String> attribute : attributes) {\n        final String parameterName = \"parameterName\" + i++;\n        params.put(parameterName, attribute.second);\n        matcher.add(\"factory.\" + attribute.first + \" = :\" + parameterName);\n      }\n      query.append(matcher);\n    }\n    TypedQuery<FactoryImpl> typedQuery =\n        managerProvider\n            .get()\n            .createQuery(query.toString(), FactoryImpl.class)\n            .setFirstResult((int) skipCount)\n            .setMaxResults(maxItems);\n    for (Map.Entry<String, String> entry : params.entrySet()) {\n      typedQuery.setParameter(entry.getKey(), entry.getValue());\n    }\n    return typedQuery.getResultList().stream().map(FactoryImpl::new).collect(toList());\n  }\n\n  private Long countFactoriesByAttributes(List<Pair<String, String>> attributes) {\n    final Map<String, String> params = new HashMap<>();\n    StringBuilder query = new StringBuilder(\"SELECT COUNT(factory) FROM Factory factory\");\n    if (!attributes.isEmpty()) {\n      final StringJoiner matcher = new StringJoiner(\" AND \", \" WHERE \", \" \");\n      int i = 0;\n      for (Pair<String, String> attribute : attributes) {\n        final String parameterName = \"parameterName\" + i++;\n        params.put(parameterName, attribute.second);\n        matcher.add(\"factory.\" + attribute.first + \" = :\" + parameterName);\n      }\n      query.append(matcher);\n    }\n    TypedQuery<Long> typedQuery = managerProvider.get().createQuery(query.toString(), Long.class);\n    for (Map.Entry<String, String> entry : params.entrySet()) {\n      typedQuery.setParameter(entry.getKey(), entry.getValue());\n    }\n    return typedQuery.getSingleResult();\n  }\n\n  @Transactional\n  protected void doCreate(FactoryImpl factory) {\n    final EntityManager manager = managerProvider.get();\n    if (factory.getWorkspace() != null) {\n      factory.getWorkspace().getProjects().forEach(ProjectConfigImpl::prePersistAttributes);\n    }\n    manager.persist(factory);\n    manager.flush();\n  }\n\n  @Transactional\n  protected FactoryImpl doUpdate(FactoryImpl update) throws NotFoundException {\n    final EntityManager manager = managerProvider.get();\n    if (manager.find(FactoryImpl.class, update.getId()) == null) {\n      throw new NotFoundException(\n          format(\"Could not update factory with id %s because it doesn't exist\", update.getId()));\n    }\n    if (update.getWorkspace() != null) {\n      update.getWorkspace().getProjects().forEach(ProjectConfigImpl::prePersistAttributes);\n    }\n    FactoryImpl merged = manager.merge(update);\n    manager.flush();\n    return merged;\n  }\n\n  @Transactional\n  protected void doRemove(String id) {\n    final EntityManager manager = managerProvider.get();\n    final FactoryImpl factory = manager.find(FactoryImpl.class, id);\n    if (factory != null) {\n      manager.remove(factory);\n      manager.flush();\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/model/impl/ActionImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.model.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.factory.Action;\n\n/**\n * Data object for {@link Action}.\n *\n * @author Anton Korneta\n */\n@Entity(name = \"Action\")\n@Table(name = \"che_factory_action\")\npublic class ActionImpl implements Action {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"entity_id\")\n  private Long entityId;\n\n  @Column(name = \"id\")\n  private String id;\n\n  @ElementCollection\n  @CollectionTable(\n      name = \"che_factory_action_properties\",\n      joinColumns = @JoinColumn(name = \"action_entity_id\"))\n  @MapKeyColumn(name = \"property_key\")\n  @Column(name = \"property_value\")\n  private Map<String, String> properties;\n\n  public ActionImpl() {}\n\n  public ActionImpl(String id, Map<String, String> properties) {\n    this.id = id;\n    if (properties != null) {\n      this.properties = new HashMap<>(properties);\n    }\n  }\n\n  public ActionImpl(Action action) {\n    this(action.getId(), action.getProperties());\n  }\n\n  @Override\n  public String getId() {\n    return id;\n  }\n\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  @Override\n  public Map<String, String> getProperties() {\n    if (properties == null) {\n      properties = new HashMap<>();\n    }\n    return properties;\n  }\n\n  public void setProperties(Map<String, String> properties) {\n    this.properties = properties;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof ActionImpl)) {\n      return false;\n    }\n    final ActionImpl that = (ActionImpl) obj;\n    return Objects.equals(entityId, that.entityId)\n        && Objects.equals(id, that.id)\n        && getProperties().equals(that.getProperties());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(entityId);\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + getProperties().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"ActionImpl{\"\n        + \"entityId=\"\n        + entityId\n        + \", id='\"\n        + id\n        + '\\''\n        + \", properties=\"\n        + properties\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/model/impl/AuthorImpl.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.model.impl;\n\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Embeddable;\nimport org.eclipse.che.api.core.model.factory.Author;\n\n/**\n * Data object for {@link Author}.\n *\n * @author Anton Korneta\n */\n@Embeddable\npublic class AuthorImpl implements Author {\n\n  @Column(name = \"created\")\n  private Long created;\n\n  @Column(name = \"user_id\")\n  private String userId;\n\n  public AuthorImpl() {}\n\n  public AuthorImpl(String userId, Long created) {\n    this.created = created;\n    this.userId = userId;\n  }\n\n  public AuthorImpl(Author creator) {\n    this(creator.getUserId(), creator.getCreated());\n  }\n\n  @Override\n  public Long getCreated() {\n    return created;\n  }\n\n  public void setCreated(Long created) {\n    this.created = created;\n  }\n\n  @Override\n  public String getUserId() {\n    return userId;\n  }\n\n  public void setUserId(String userId) {\n    this.userId = userId;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof AuthorImpl)) return false;\n    final AuthorImpl other = (AuthorImpl) obj;\n    return Objects.equals(userId, other.userId) && Objects.equals(created, other.created);\n  }\n\n  @Override\n  public int hashCode() {\n    int result = 7;\n    result = 31 * result + Objects.hashCode(userId);\n    result = 31 * result + Objects.hashCode(created);\n    return result;\n  }\n\n  @Override\n  public String toString() {\n    return \"AuthorImpl{\" + \"created=\" + created + \", userId='\" + userId + '\\'' + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/model/impl/FactoryImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.model.impl;\n\nimport java.util.Objects;\nimport javax.persistence.CascadeType;\nimport javax.persistence.Column;\nimport javax.persistence.Embedded;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.OneToOne;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.factory.Author;\nimport org.eclipse.che.api.core.model.factory.Factory;\nimport org.eclipse.che.api.core.model.factory.Ide;\nimport org.eclipse.che.api.core.model.factory.Policies;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceConfig;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.commons.lang.NameGenerator;\n\n/**\n * Data object for {@link Factory}.\n *\n * @author Anton Korneta\n */\n@Entity(name = \"Factory\")\n@Table(name = \"che_factory\")\n// TODO fix after issue: https://github.com/eclipse/che/issues/2110\n// (uniqueConstraints = {@UniqueConstraint(columnNames = {\"name\", \"userId\"})})\npublic class FactoryImpl implements Factory {\n\n  public static FactoryImplBuilder builder() {\n    return new FactoryImplBuilder();\n  }\n\n  @Id\n  @Column(name = \"id\")\n  private String id;\n\n  @Column(name = \"name\")\n  private String name;\n\n  @Column(name = \"version\", nullable = false)\n  private String version;\n\n  @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, optional = false)\n  @JoinColumn(name = \"workspace_id\")\n  private WorkspaceConfigImpl workspace;\n\n  @Embedded private AuthorImpl creator;\n\n  // Mapping exists for explicit constraints which allows\n  // jpa backend to perform operations in correct order\n  @OneToOne(fetch = FetchType.LAZY)\n  @JoinColumn(insertable = false, updatable = false, name = \"user_id\")\n  private UserImpl userEntity;\n\n  @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)\n  @JoinColumn(name = \"ide_id\")\n  private IdeImpl ide;\n\n  @Embedded private PoliciesImpl policies;\n\n  public FactoryImpl() {}\n\n  public FactoryImpl(\n      String id,\n      String name,\n      String version,\n      WorkspaceConfig workspace,\n      Author creator,\n      Policies policies,\n      Ide ide) {\n    this.id = id;\n    this.name = name;\n    this.version = version;\n    if (workspace != null) {\n      this.workspace = new WorkspaceConfigImpl(workspace);\n    }\n    if (creator != null) {\n      this.creator = new AuthorImpl(creator);\n    }\n    if (policies != null) {\n      this.policies = new PoliciesImpl(policies);\n    }\n    if (ide != null) {\n      this.ide = new IdeImpl(ide);\n    }\n  }\n\n  public FactoryImpl(Factory factory) {\n    this(\n        factory.getId(),\n        factory.getName(),\n        factory.getV(),\n        factory.getWorkspace(),\n        factory.getCreator(),\n        factory.getPolicies(),\n        factory.getIde());\n  }\n\n  @Override\n  public String getId() {\n    return id;\n  }\n\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public String getV() {\n    return version;\n  }\n\n  public void setV(String version) {\n    this.version = version;\n  }\n\n  @Override\n  public WorkspaceConfigImpl getWorkspace() {\n    return workspace;\n  }\n\n  public void setWorkspace(WorkspaceConfigImpl workspace) {\n    this.workspace = workspace;\n  }\n\n  @Override\n  public AuthorImpl getCreator() {\n    return creator;\n  }\n\n  public void setCreator(AuthorImpl creator) {\n    this.creator = creator;\n  }\n\n  @Override\n  public PoliciesImpl getPolicies() {\n    return policies;\n  }\n\n  public void setPolicies(PoliciesImpl policies) {\n    this.policies = policies;\n  }\n\n  @Override\n  public IdeImpl getIde() {\n    return ide;\n  }\n\n  public void setIde(IdeImpl ide) {\n    this.ide = ide;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof FactoryImpl)) return false;\n    final FactoryImpl other = (FactoryImpl) obj;\n    return Objects.equals(id, other.id)\n        && Objects.equals(name, other.name)\n        && Objects.equals(version, other.version)\n        && Objects.equals(workspace, other.workspace)\n        && Objects.equals(creator, other.creator)\n        && Objects.equals(policies, other.policies)\n        && Objects.equals(ide, other.ide);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + Objects.hashCode(name);\n    hash = 31 * hash + Objects.hashCode(version);\n    hash = 31 * hash + Objects.hashCode(workspace);\n    hash = 31 * hash + Objects.hashCode(creator);\n    hash = 31 * hash + Objects.hashCode(policies);\n    hash = 31 * hash + Objects.hashCode(ide);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"FactoryImpl{\"\n        + \"id='\"\n        + id\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", version='\"\n        + version\n        + '\\''\n        + \", workspace=\"\n        + workspace\n        + \", creator=\"\n        + creator\n        + \", policies=\"\n        + policies\n        + \", ide=\"\n        + ide\n        + '}';\n  }\n\n  /** Helps to create the instance of {@link FactoryImpl}. */\n  public static class FactoryImplBuilder {\n\n    private String id;\n    private String name;\n    private String version;\n    private WorkspaceConfig workspace;\n    private Author creator;\n    private Policies policies;\n    private Ide ide;\n\n    private FactoryImplBuilder() {}\n\n    public FactoryImpl build() {\n      return new FactoryImpl(id, name, version, workspace, creator, policies, ide);\n    }\n\n    public FactoryImplBuilder from(FactoryImpl factory) {\n      this.id = factory.getId();\n      this.name = factory.getName();\n      this.version = factory.getV();\n      this.workspace = factory.getWorkspace();\n      this.creator = factory.getCreator();\n      this.policies = factory.getPolicies();\n      this.ide = factory.getIde();\n      return this;\n    }\n\n    public FactoryImplBuilder generateId() {\n      id = NameGenerator.generate(\"\", 16);\n      return this;\n    }\n\n    public FactoryImplBuilder setId(String id) {\n      this.id = id;\n      return this;\n    }\n\n    public FactoryImplBuilder setName(String name) {\n      this.name = name;\n      return this;\n    }\n\n    public FactoryImplBuilder setVersion(String version) {\n      this.version = version;\n      return this;\n    }\n\n    public FactoryImplBuilder setWorkspace(WorkspaceConfig workspace) {\n      this.workspace = workspace;\n      return this;\n    }\n\n    public FactoryImplBuilder setCreator(Author creator) {\n      this.creator = creator;\n      return this;\n    }\n\n    public FactoryImplBuilder setPolicies(Policies policies) {\n      this.policies = policies;\n      return this;\n    }\n\n    public FactoryImplBuilder setIde(Ide ide) {\n      this.ide = ide;\n      return this;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/model/impl/IdeImpl.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.model.impl;\n\nimport java.util.Objects;\nimport javax.persistence.CascadeType;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.OneToOne;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.factory.Ide;\nimport org.eclipse.che.api.core.model.factory.OnAppClosed;\nimport org.eclipse.che.api.core.model.factory.OnAppLoaded;\nimport org.eclipse.che.api.core.model.factory.OnProjectsLoaded;\n\n/**\n * Data object for {@link Ide}.\n *\n * @author Anton Korneta\n */\n@Entity(name = \"Ide\")\n@Table(name = \"che_factory_ide\")\npublic class IdeImpl implements Ide {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)\n  @JoinColumn(name = \"on_app_loaded_id\")\n  private OnAppLoadedImpl onAppLoaded;\n\n  @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)\n  @JoinColumn(name = \"on_projects_loaded_id\")\n  private OnProjectsLoadedImpl onProjectsLoaded;\n\n  @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)\n  @JoinColumn(name = \"on_app_closed_id\")\n  private OnAppClosedImpl onAppClosed;\n\n  public IdeImpl() {}\n\n  public IdeImpl(\n      OnAppLoaded onAppLoaded, OnProjectsLoaded onProjectsLoaded, OnAppClosed onAppClosed) {\n    if (onAppLoaded != null) {\n      this.onAppLoaded = new OnAppLoadedImpl(onAppLoaded);\n    }\n    if (onProjectsLoaded != null) {\n      this.onProjectsLoaded = new OnProjectsLoadedImpl(onProjectsLoaded);\n    }\n    if (onAppClosed != null) {\n      this.onAppClosed = new OnAppClosedImpl(onAppClosed);\n    }\n  }\n\n  public IdeImpl(Ide ide) {\n    this(ide.getOnAppLoaded(), ide.getOnProjectsLoaded(), ide.getOnAppClosed());\n  }\n\n  @Override\n  public OnAppLoadedImpl getOnAppLoaded() {\n    return onAppLoaded;\n  }\n\n  public void setOnAppLoaded(OnAppLoadedImpl onAppLoaded) {\n    this.onAppLoaded = onAppLoaded;\n  }\n\n  @Override\n  public OnProjectsLoadedImpl getOnProjectsLoaded() {\n    return onProjectsLoaded;\n  }\n\n  public void setOnProjectsLoaded(OnProjectsLoadedImpl onProjectsLoaded) {\n    this.onProjectsLoaded = onProjectsLoaded;\n  }\n\n  @Override\n  public OnAppClosedImpl getOnAppClosed() {\n    return onAppClosed;\n  }\n\n  public void setOnAppClosed(OnAppClosedImpl onAppClosed) {\n    this.onAppClosed = onAppClosed;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof IdeImpl)) {\n      return false;\n    }\n    final IdeImpl that = (IdeImpl) obj;\n    return Objects.equals(id, that.id)\n        && Objects.equals(onAppLoaded, that.onAppLoaded)\n        && Objects.equals(onProjectsLoaded, that.onProjectsLoaded)\n        && Objects.equals(onAppClosed, that.onAppClosed);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + Objects.hashCode(onAppLoaded);\n    hash = 31 * hash + Objects.hashCode(onProjectsLoaded);\n    hash = 31 * hash + Objects.hashCode(onAppClosed);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"IdeImpl{\"\n        + \"id=\"\n        + id\n        + \", onAppLoaded=\"\n        + onAppLoaded\n        + \", onProjectsLoaded=\"\n        + onProjectsLoaded\n        + \", onAppClosed=\"\n        + onAppClosed\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/model/impl/OnAppClosedImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.model.impl;\n\nimport static java.util.stream.Collectors.toList;\nimport static javax.persistence.CascadeType.ALL;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.JoinTable;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.factory.Action;\nimport org.eclipse.che.api.core.model.factory.OnAppClosed;\n\n/**\n * Data object for {@link OnAppClosed}.\n *\n * @author Anton Korneta\n */\n@Entity(name = \"OnAppClosed\")\n@Table(name = \"che_factory_on_app_closed_action\")\npublic class OnAppClosedImpl implements OnAppClosed {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @OneToMany(cascade = ALL, orphanRemoval = true)\n  @JoinTable(\n      name = \"che_factory_on_app_closed_action_value\",\n      joinColumns = @JoinColumn(name = \"on_app_closed_id\"),\n      inverseJoinColumns = @JoinColumn(name = \"action_entity_id\"))\n  private List<ActionImpl> actions;\n\n  public OnAppClosedImpl() {}\n\n  public OnAppClosedImpl(List<? extends Action> actions) {\n    if (actions != null) {\n      this.actions = actions.stream().map(ActionImpl::new).collect(toList());\n    }\n  }\n\n  public OnAppClosedImpl(OnAppClosed onAppClosed) {\n    this(onAppClosed.getActions());\n  }\n\n  @Override\n  public List<ActionImpl> getActions() {\n    if (actions == null) {\n      actions = new ArrayList<>();\n    }\n    return actions;\n  }\n\n  public void setActions(List<ActionImpl> actions) {\n    this.actions = actions;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof OnAppClosedImpl)) {\n      return false;\n    }\n    final OnAppClosedImpl that = (OnAppClosedImpl) obj;\n    return Objects.equals(id, that.id) && getActions().equals(that.getActions());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + getActions().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"OnAppClosedImpl{\" + \"id=\" + id + \", actions=\" + actions + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/model/impl/OnAppLoadedImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.model.impl;\n\nimport static java.util.stream.Collectors.toList;\nimport static javax.persistence.CascadeType.ALL;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.JoinTable;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.factory.Action;\nimport org.eclipse.che.api.core.model.factory.OnAppLoaded;\n\n/**\n * Data object for {@link OnAppLoaded}.\n *\n * @author Anton Korneta\n */\n@Entity(name = \"OnAppLoaded\")\n@Table(name = \"che_factory_on_app_loaded_action\")\npublic class OnAppLoadedImpl implements OnAppLoaded {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @OneToMany(cascade = ALL, orphanRemoval = true)\n  @JoinTable(\n      name = \"che_factory_on_app_loaded_action_value\",\n      joinColumns = @JoinColumn(name = \"on_app_loaded_id\"),\n      inverseJoinColumns = @JoinColumn(name = \"action_entity_id\"))\n  private List<ActionImpl> actions;\n\n  public OnAppLoadedImpl() {}\n\n  public OnAppLoadedImpl(List<? extends Action> actions) {\n    if (actions != null) {\n      this.actions = actions.stream().map(ActionImpl::new).collect(toList());\n    }\n  }\n\n  public OnAppLoadedImpl(OnAppLoaded onAppLoaded) {\n    this(onAppLoaded.getActions());\n  }\n\n  @Override\n  public List<ActionImpl> getActions() {\n    if (actions == null) {\n      actions = new ArrayList<>();\n    }\n    return actions;\n  }\n\n  public void setActions(List<ActionImpl> actions) {\n    this.actions = actions;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof OnAppLoadedImpl)) {\n      return false;\n    }\n    final OnAppLoadedImpl that = (OnAppLoadedImpl) obj;\n    return Objects.equals(id, that.id) && getActions().equals(that.getActions());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + getActions().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"OnAppLoadedImpl{\" + \"id=\" + id + \", actions=\" + actions + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/model/impl/OnProjectsLoadedImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.model.impl;\n\nimport static java.util.stream.Collectors.toList;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\nimport javax.persistence.CascadeType;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.JoinTable;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.factory.Action;\nimport org.eclipse.che.api.core.model.factory.OnProjectsLoaded;\n\n/**\n * Data object for {@link OnProjectsLoaded}.\n *\n * @author Anton Korneta\n */\n@Entity(name = \"OnProjectsLoaded\")\n@Table(name = \"che_factory_on_projects_loaded_action\")\npublic class OnProjectsLoadedImpl implements OnProjectsLoaded {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)\n  @JoinTable(\n      name = \"che_factory_on_projects_loaded_action_value\",\n      joinColumns = @JoinColumn(name = \"on_projects_loaded_id\"),\n      inverseJoinColumns = @JoinColumn(name = \"action_entity_id\"))\n  private List<ActionImpl> actions;\n\n  public OnProjectsLoadedImpl() {}\n\n  public OnProjectsLoadedImpl(List<? extends Action> actions) {\n    if (actions != null) {\n      this.actions = actions.stream().map(ActionImpl::new).collect(toList());\n    }\n  }\n\n  public OnProjectsLoadedImpl(OnProjectsLoaded onProjectsLoaded) {\n    this(onProjectsLoaded.getActions());\n  }\n\n  @Override\n  public List<ActionImpl> getActions() {\n    if (actions == null) {\n      actions = new ArrayList<>();\n    }\n    return actions;\n  }\n\n  public void setActions(List<ActionImpl> actions) {\n    this.actions = actions;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof OnProjectsLoadedImpl)) {\n      return false;\n    }\n    final OnProjectsLoadedImpl that = (OnProjectsLoadedImpl) obj;\n    return Objects.equals(id, that.id) && getActions().equals(that.getActions());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + getActions().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"OnProjectsLoadedImpl{\" + \"id=\" + id + \", actions=\" + actions + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/model/impl/PoliciesImpl.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.model.impl;\n\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Embeddable;\nimport org.eclipse.che.api.core.model.factory.Policies;\n\n/**\n * Data object for {@link Policies}.\n *\n * @author Anton Korneta\n */\n@Embeddable\npublic class PoliciesImpl implements Policies {\n\n  @Column(name = \"referrer\")\n  private String referer;\n\n  @Column(name = \"creation_strategy\")\n  private String create;\n\n  @Column(name = \"until\")\n  private Long until;\n\n  @Column(name = \"since\")\n  private Long since;\n\n  public PoliciesImpl() {}\n\n  public PoliciesImpl(String referer, String create, Long until, Long since) {\n    this.referer = referer;\n    this.create = create;\n    this.until = until;\n    this.since = since;\n  }\n\n  public PoliciesImpl(Policies policies) {\n    this(policies.getReferer(), policies.getCreate(), policies.getUntil(), policies.getSince());\n  }\n\n  @Override\n  public String getReferer() {\n    return referer;\n  }\n\n  public void setReferer(String referer) {\n    this.referer = referer;\n  }\n\n  @Override\n  public String getCreate() {\n    return create;\n  }\n\n  public void setCreate(String create) {\n    this.create = create;\n  }\n\n  @Override\n  public Long getUntil() {\n    return until;\n  }\n\n  public void setUntil(Long until) {\n    this.until = until;\n  }\n\n  @Override\n  public Long getSince() {\n    return since;\n  }\n\n  public void setSince(Long since) {\n    this.since = since;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof PoliciesImpl)) return false;\n    final PoliciesImpl other = (PoliciesImpl) obj;\n    return Objects.equals(referer, other.referer)\n        && Objects.equals(create, other.create)\n        && Objects.equals(until, other.until)\n        && Objects.equals(since, other.since);\n  }\n\n  @Override\n  public int hashCode() {\n    int result = 7;\n    result = 31 * result + Objects.hashCode(referer);\n    result = 31 * result + Objects.hashCode(create);\n    result = 31 * result + Objects.hashCode(until);\n    result = 31 * result + Objects.hashCode(since);\n    return result;\n  }\n\n  @Override\n  public String toString() {\n    return \"PoliciesImpl{\"\n        + \"referer='\"\n        + referer\n        + '\\''\n        + \", create='\"\n        + create\n        + '\\''\n        + \", until=\"\n        + until\n        + \", since=\"\n        + since\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/AbstractGitUserDataFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\nimport java.util.Optional;\nimport org.eclipse.che.api.factory.server.scm.exception.*;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\n\n/**\n * Abstraction to fetch git user data from the specific git provider using OAuth 2.0 or personal\n * access.\n *\n * @author Anatolii Bazko\n */\npublic abstract class AbstractGitUserDataFetcher implements GitUserDataFetcher {\n  protected final String oAuthProviderName;\n  protected final String oAuthProviderUrl;\n  protected final PersonalAccessTokenManager personalAccessTokenManager;\n\n  public AbstractGitUserDataFetcher(\n      String oAuthProviderName,\n      String oAuthProviderUrl,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    this.oAuthProviderName = oAuthProviderName;\n    this.oAuthProviderUrl = oAuthProviderUrl;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n  }\n\n  public GitUserData fetchGitUserData(String namespaceName)\n      throws ScmUnauthorizedException,\n          ScmCommunicationException,\n          ScmConfigurationPersistenceException,\n          ScmItemNotFoundException,\n          ScmBadRequestException {\n    Subject cheSubject = EnvironmentContext.getCurrent().getSubject();\n    Optional<PersonalAccessToken> tokenOptional =\n        personalAccessTokenManager.get(cheSubject, oAuthProviderName, null, namespaceName);\n    if (tokenOptional.isPresent()) {\n      return fetchGitUserDataWithPersonalAccessToken(tokenOptional.get());\n    } else {\n      Optional<PersonalAccessToken> oAuthTokenOptional =\n          personalAccessTokenManager.get(cheSubject, null, oAuthProviderUrl, namespaceName);\n      if (oAuthTokenOptional.isPresent()) {\n        return fetchGitUserDataWithOAuthToken(oAuthTokenOptional.get().getToken());\n      }\n    }\n    throw new ScmCommunicationException(\n        \"There are no tokes for the user \" + cheSubject.getUserId());\n  }\n\n  protected abstract GitUserData fetchGitUserDataWithOAuthToken(String token)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException;\n\n  protected abstract GitUserData fetchGitUserDataWithPersonalAccessToken(\n      PersonalAccessToken personalAccessToken)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException;\n\n  protected abstract String getLocalAuthenticateUrl();\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/AuthorisationRequestManager.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\nimport jakarta.ws.rs.core.UriInfo;\nimport java.util.List;\n\n/**\n * Manager for storing and retrieving rejected authorisation requests. This is used to prevent from\n * asking the user to grant access to the SCM provider after the user has already rejected the\n * request.\n */\npublic interface AuthorisationRequestManager {\n  /**\n   * Store the reject flag for the given SCM provider name.\n   *\n   * @param scmProviderName the SCM provider name\n   */\n  void store(String scmProviderName);\n\n  /**\n   * Remove the reject flag for the given SCM provider name.\n   *\n   * @param scmProviderName the SCM provider name\n   */\n  void remove(String scmProviderName);\n\n  /**\n   * Check if the reject flag is stored for the given SCM provider name.\n   *\n   * @param scmProviderName the SCM provider name to check\n   * @return {@code true} if the reject flag is stored, {@code false} otherwise\n   */\n  boolean isStored(String scmProviderName);\n\n  /** This method must be called on the Oauth callback from the SCM provider. */\n  void callback(UriInfo uriInfo, List<String> errorValues);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/AuthorizingFileContentProvider.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher.OAUTH_2_PREFIX;\nimport static org.eclipse.che.api.factory.server.scm.exception.ExceptionMessages.getDevfileConnectionErrorMessage;\n\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.Base64;\nimport javax.net.ssl.SSLException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Common implementation of file content provider which is able to access content of private\n * repositories using personal access tokens from specially formatted secret in user's namespace.\n */\npublic class AuthorizingFileContentProvider<T extends RemoteFactoryUrl>\n    implements FileContentProvider {\n\n  private static final Logger LOG = LoggerFactory.getLogger(AuthorizingFileContentProvider.class);\n\n  protected final T remoteFactoryUrl;\n  protected final PersonalAccessTokenManager personalAccessTokenManager;\n  protected final URLFetcher urlFetcher;\n\n  public AuthorizingFileContentProvider(\n      T remoteFactoryUrl,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    this.remoteFactoryUrl = remoteFactoryUrl;\n    this.urlFetcher = urlFetcher;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n  }\n\n  @Override\n  public String fetchContent(String fileURL) throws IOException, DevfileException {\n    return fetchContent(fileURL, false, null);\n  }\n\n  @Override\n  public String fetchContent(String fileURL, String credentials)\n      throws IOException, DevfileException {\n    return fetchContent(fileURL, false, credentials);\n  }\n\n  @Override\n  public String fetchContentWithoutAuthentication(String fileURL)\n      throws IOException, DevfileException {\n    return fetchContent(fileURL, true, null);\n  }\n\n  private String fetchContent(\n      String fileURL, boolean skipAuthentication, @Nullable String credentials)\n      throws IOException, DevfileException {\n    final String requestURL = formatUrl(fileURL);\n    try {\n      if (skipAuthentication) {\n        return urlFetcher.fetch(requestURL);\n      } else {\n        // try to authenticate for the given URL\n        String authorization;\n        if (isNullOrEmpty(credentials)) {\n          PersonalAccessToken token =\n              personalAccessTokenManager.getAndStore(remoteFactoryUrl.getProviderUrl());\n          authorization =\n              formatAuthorization(\n                  token.getToken(),\n                  token.getScmTokenName() == null\n                      || !token.getScmTokenName().startsWith(OAUTH_2_PREFIX));\n        } else {\n          authorization = getCredentialsAuthorization(credentials);\n        }\n        return urlFetcher.fetch(requestURL, authorization);\n      }\n    } catch (UnknownScmProviderException\n        | ScmConfigurationPersistenceException\n        | UnsatisfiedScmPreconditionException e) {\n      // No matching SCM provider or Kubernetes credentials unavailable (e.g. standalone mode).\n      // Fall back to an unauthenticated fetch so public repositories still work.\n      if (e instanceof ScmConfigurationPersistenceException\n          || e instanceof UnsatisfiedScmPreconditionException) {\n        LOG.error(\n            \"Kubernetes credentials unavailable (e.g. standalone mode): {}. \"\n                + \"Falling back to unauthenticated fetch for {}\",\n            e.getMessage(),\n            requestURL);\n      }\n      return fetchContentWithoutToken(requestURL);\n    } catch (ScmCommunicationException e) {\n      return toIOException(fileURL, e);\n    } catch (ScmUnauthorizedException e) {\n      throw new DevfileException(e.getMessage(), e);\n    }\n  }\n\n  protected String fetchContentWithoutToken(String requestURL)\n      throws DevfileException, IOException {\n    // we don't have any provider matching this SCM provider\n    // so try without secrets being configured\n    try {\n      return urlFetcher.fetch(requestURL);\n    } catch (IOException exception) {\n      if (exception instanceof SSLException) {\n        ScmCommunicationException cause =\n            new ScmCommunicationException(\n                String.format(\n                    \"Failed to fetch a content from URL %s due to TLS key misconfiguration. Please refer to the docs about how to correctly import it. \",\n                    requestURL));\n        throw new DevfileException(exception.getMessage(), cause);\n      } else if (exception instanceof FileNotFoundException) {\n        if (isPublicRepository(remoteFactoryUrl)) {\n          // for public repo-s return 404 as-is\n          throw exception;\n        }\n      }\n      throw new DevfileException(\n          getDevfileConnectionErrorMessage(exception.getMessage()), exception);\n    }\n  }\n\n  protected String toIOException(String fileURL, ScmCommunicationException e) throws IOException {\n    throw new IOException(\n        String.format(\n            \"Failed to fetch a content from URL %s. Make sure the URL\"\n                + \" is correct. For private repository, make sure authentication is configured.\"\n                + \" Additionally, if you're using \"\n                + \" relative form, make sure the referenced file are actually stored\"\n                + \" relative to the devfile on the same host,\"\n                + \" or try to specify URL in absolute form. The current attempt to authenticate\"\n                + \" request, failed with the following error message: %s\",\n            fileURL, e.getMessage()),\n        e);\n  }\n\n  protected boolean isPublicRepository(T remoteFactoryUrl) {\n    return false;\n  }\n\n  protected String formatUrl(String fileURL) throws DevfileException {\n    String requestURL;\n    try {\n      if (new URI(fileURL).isAbsolute()) {\n        requestURL = fileURL;\n      } else {\n        // since files retrieved via REST, we cannot use path like '.' or one that starts with './'\n        // so cut them off\n        requestURL =\n            remoteFactoryUrl.rawFileLocation(fileURL.replaceAll(\"^(?:\\\\.?\\\\/)|(?:\\\\.$)\", \"\"));\n      }\n    } catch (URISyntaxException e) {\n      throw new DevfileException(e.getMessage(), e);\n    }\n    return requestURL;\n  }\n\n  /**\n   * Formats authorization header value.\n   *\n   * @param token personal access token\n   * @param isPAT true if token is personal access token, false if it is OAuth token\n   * @return formatted authorization header value\n   */\n  protected String formatAuthorization(String token, boolean isPAT) {\n    return \"Bearer \" + token;\n  }\n\n  private String getCredentialsAuthorization(String credentials) {\n    return \"Basic \" + new String(Base64.getEncoder().encode(credentials.getBytes()));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/GitCredentialManager.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException;\n\npublic interface GitCredentialManager {\n  /**\n   * Propagates git credentials in format: \"username:<oauth token>\" if the token is Personal Access\n   * Token or \"oauth2:<oauth token> if oAuth token.\n   *\n   * @param personalAccessToken\n   * @throws UnsatisfiedScmPreconditionException - some storage preconditions aren't met.\n   * @throws ScmConfigurationPersistenceException\n   */\n  void createOrReplace(PersonalAccessToken personalAccessToken)\n      throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/GitUserData.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\nimport java.util.Objects;\n\n/** Personal SCM user data such as `username` and `email`. Is used to sign git commits. */\npublic class GitUserData {\n  private final String scmUsername;\n  private final String scmUserEmail;\n\n  public GitUserData(String scmUsername, String scmUserEmail) {\n    this.scmUsername = scmUsername;\n    this.scmUserEmail = scmUserEmail;\n  }\n\n  public String getScmUsername() {\n    return scmUsername;\n  }\n\n  public String getScmUserEmail() {\n    return scmUserEmail;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) return true;\n    if (o == null || getClass() != o.getClass()) return false;\n    GitUserData that = (GitUserData) o;\n    return Objects.equals(scmUsername, that.scmUsername)\n        && Objects.equals(scmUserEmail, that.scmUserEmail);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(scmUsername, scmUserEmail);\n  }\n\n  @Override\n  public String toString() {\n    return \"GitUserData{\"\n        + \", scmUsername='\"\n        + scmUsername\n        + '\\''\n        + \", scmUserEmail='\"\n        + scmUserEmail\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/GitUserDataFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.annotation.Nullable;\n\npublic interface GitUserDataFetcher {\n\n  /**\n   * Retrieve a {@link GitUserData} object from concrete scm provider. If OAuthProvider is not\n   * configured, then personal access token should be taken into account.\n   *\n   * @param namespaceName - the user's namespace name.\n   * @return - {@link GitUserData} object.\n   * @throws ScmUnauthorizedException - in case if user is not authorized che server to create a new\n   *     token. Further user interaction is needed before calling this method next time.\n   * @throws ScmCommunicationException - Some unexpected problem occurred during communication with\n   *     scm provider.\n   * @throws ScmConfigurationPersistenceException - problem occurred during communication with\n   *     permanent storage.\n   */\n  GitUserData fetchGitUserData(@Nullable String namespaceName)\n      throws ScmUnauthorizedException,\n          ScmCommunicationException,\n          ScmConfigurationPersistenceException,\n          ScmItemNotFoundException,\n          ScmBadRequestException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/PersonalAccessToken.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\nimport com.google.common.base.Objects;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\n\n/**\n * Personal access token that can be used to authorise scm operations like api calls, git clone or\n * git push.\n */\npublic class PersonalAccessToken {\n\n  private final String scmProviderUrl;\n  private final String scmProviderName;\n  private final String scmUserName;\n\n  /** Organization that user belongs to. Can be null if user is not a member of any organization. */\n  @Nullable private final String scmOrganization;\n\n  private final String scmTokenName;\n  private final String scmTokenId;\n  private final String token;\n  private final String cheUserId;\n\n  public PersonalAccessToken(\n      String scmProviderUrl,\n      String scmProviderName,\n      String cheUserId,\n      String scmOrganization,\n      String scmUserName,\n      String scmTokenName,\n      String scmTokenId,\n      String token) {\n    this.scmProviderUrl = scmProviderUrl;\n    this.scmOrganization = scmOrganization;\n    this.scmProviderName = scmProviderName;\n    this.scmUserName = scmUserName;\n    this.scmTokenName = scmTokenName;\n    this.scmTokenId = scmTokenId;\n    this.token = token;\n    this.cheUserId = cheUserId;\n  }\n\n  public PersonalAccessToken(\n      String scmProviderUrl,\n      String scmProviderName,\n      String cheUserId,\n      String scmUserName,\n      String scmTokenName,\n      String scmTokenId,\n      String token) {\n    this(\n        scmProviderUrl,\n        scmProviderName,\n        cheUserId,\n        null,\n        scmUserName,\n        scmTokenName,\n        scmTokenId,\n        token);\n  }\n\n  public PersonalAccessToken(\n      String scmProviderUrl, String scmProviderName, String scmUserName, String token) {\n    this(\n        scmProviderUrl,\n        scmProviderName,\n        EnvironmentContext.getCurrent().getSubject().getUserId(),\n        null,\n        scmUserName,\n        null,\n        null,\n        token);\n  }\n\n  public String getScmProviderUrl() {\n    return scmProviderUrl;\n  }\n\n  public String getScmTokenName() {\n    return scmTokenName;\n  }\n\n  public String getScmTokenId() {\n    return scmTokenId;\n  }\n\n  public String getScmUserName() {\n    return scmUserName;\n  }\n\n  public String getToken() {\n    return token;\n  }\n\n  public String getCheUserId() {\n    return cheUserId;\n  }\n\n  @Nullable\n  public String getScmOrganization() {\n    return scmOrganization;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) return true;\n    if (o == null || getClass() != o.getClass()) return false;\n    PersonalAccessToken that = (PersonalAccessToken) o;\n    return Objects.equal(scmProviderUrl, that.scmProviderUrl)\n        && Objects.equal(scmProviderName, that.scmProviderName)\n        && Objects.equal(scmUserName, that.scmUserName)\n        && Objects.equal(scmOrganization, that.scmOrganization)\n        && Objects.equal(scmTokenName, that.scmTokenName)\n        && Objects.equal(scmTokenId, that.scmTokenId)\n        && Objects.equal(token, that.token)\n        && Objects.equal(cheUserId, that.cheUserId);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hashCode(\n        scmProviderUrl, scmUserName, scmOrganization, scmTokenName, scmTokenId, token, cheUserId);\n  }\n\n  @Override\n  public String toString() {\n    return \"PersonalAccessToken{\"\n        + \"scmProviderUrl='\"\n        + scmProviderUrl\n        + '\\''\n        + \"scmProviderName='\"\n        + scmProviderName\n        + '\\''\n        + \", scmUserName='\"\n        + scmUserName\n        + '\\''\n        + \", scmOrganization='\"\n        + scmOrganization\n        + '\\''\n        + \", scmTokenName='\"\n        + scmTokenName\n        + '\\''\n        + \", scmTokenId='\"\n        + scmTokenId\n        + '\\''\n        + \", token='\"\n        + token\n        + '\\''\n        + \", cheUserId='\"\n        + cheUserId\n        + '}';\n  }\n\n  public String getScmProviderName() {\n    return scmProviderName;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/PersonalAccessTokenFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\nimport java.util.Optional;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\n\npublic interface PersonalAccessTokenFetcher {\n\n  /** Prefix for token names indication it is OAuth token (to differentiate from PAT-s) */\n  String OAUTH_2_PREFIX = \"oauth2-\";\n\n  /**\n   * Retrieve new PersonalAccessToken from concrete scm provider\n   *\n   * @param cheUser\n   * @param scmServerUrl\n   * @return - personal access token. Must return {@code null} if scmServerUrl is not applicable for\n   *     the current fetcher.\n   * @throws ScmUnauthorizedException - in case if user are not authorized che server to create new\n   *     token. Further user interaction is needed before calling next time this method.\n   * @throws ScmCommunicationException - Some unexpected problem occurred during communication with\n   *     scm provider.\n   */\n  PersonalAccessToken fetchPersonalAccessToken(Subject cheUser, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException;\n\n  /**\n   * Refresh a PersonalAccessToken.\n   *\n   * @throws ScmUnauthorizedException - in case if user are not authorized che server to create new\n   *     token. Further user interaction is needed before calling next time this method.\n   * @throws ScmCommunicationException - Some unexpected problem occurred during communication with\n   *     scm provider.\n   */\n  PersonalAccessToken refreshPersonalAccessToken(Subject cheUser, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException;\n\n  /**\n   * Checks whether the provided personal access token is valid and has expected scope of\n   * permissions.\n   *\n   * @deprecated use {@link #isValid(PersonalAccessTokenParams)} instead.\n   * @param personalAccessToken - personal access token to check.\n   * @return - empty optional if {@link PersonalAccessTokenFetcher} is not able to confirm or deny\n   *     that token is valid or {@link Boolean} value if it can.\n   * @throws ScmUnauthorizedException - in case if user did not authorized che server to create new\n   *     token. Further user interaction is needed before calling next time this method.\n   * @throws ScmCommunicationException - Some unexpected problem occurred during communication with\n   *     scm provider.\n   */\n  @Deprecated\n  Optional<Boolean> isValid(PersonalAccessToken personalAccessToken)\n      throws ScmCommunicationException, ScmUnauthorizedException;\n\n  /**\n   * Checks whether the provided personal access token is valid by fetching user info from the scm\n   * provider. Also checks whether the token has expected scope of permissions if the provider API\n   * supports such request.\n   *\n   * @return - Optional with a pair of boolean value and scm username. The boolean value is true if\n   *     the token has expected scope of permissions, false if the token scopes does not match the\n   *     expected ones. Empty optional if {@link PersonalAccessTokenFetcher} is not able to confirm\n   *     or deny that token is valid.\n   * @throws ScmCommunicationException - problem occurred during communication with SCM server.\n   */\n  Optional<Pair<Boolean, String>> isValid(PersonalAccessTokenParams params)\n      throws ScmCommunicationException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/PersonalAccessTokenManager.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\nimport java.util.Optional;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.subject.Subject;\n\n/** Manages {@link PersonalAccessToken}s in Che's permanent storage. */\npublic interface PersonalAccessTokenManager {\n  /**\n   * Fetches a new {@link PersonalAccessToken} token from scm provider and save it in permanent\n   * storage for further usage.\n   *\n   * @param cheUser\n   * @param scmServerUrl\n   * @return personal access token\n   * @throws UnsatisfiedScmPreconditionException - storage preconditions aren't met.\n   * @throws ScmConfigurationPersistenceException - problem occurred during communication with\n   *     permanent storage.\n   * @throws ScmUnauthorizedException - scm authorization required.\n   * @throws ScmCommunicationException - problem occurred during communication with scm provider.\n   * @throws UnknownScmProviderException - scm provider is unknown.\n   */\n  PersonalAccessToken fetchAndSave(Subject cheUser, String scmServerUrl)\n      throws UnsatisfiedScmPreconditionException,\n          ScmConfigurationPersistenceException,\n          ScmUnauthorizedException,\n          ScmCommunicationException,\n          UnknownScmProviderException;\n\n  /**\n   * Gets {@link PersonalAccessToken} from permanent storage.\n   *\n   * @param scmServerUrl Git provider endpoint\n   * @throws ScmConfigurationPersistenceException - problem occurred during communication with\n   *     permanent storage.\n   * @throws ScmUnauthorizedException - scm authorization required.\n   * @throws ScmCommunicationException - problem occurred during communication with scm provider.\n   * @throws UnknownScmProviderException - scm provider is unknown.\n   * @throws UnsatisfiedScmPreconditionException - storage preconditions aren't met.\n   */\n  PersonalAccessToken get(String scmServerUrl)\n      throws ScmConfigurationPersistenceException,\n          ScmUnauthorizedException,\n          ScmCommunicationException,\n          UnknownScmProviderException,\n          UnsatisfiedScmPreconditionException;\n\n  /**\n   * Gets {@link PersonalAccessToken} from permanent storage for the given OAuth provider name. It\n   * is useful when OAuth provider is not configured and Git provider endpoint is unknown. {@code\n   * scmServerUrl} can be provided as an additional clause.\n   *\n   * @param cheUser Che user object\n   * @param oAuthProviderName OAuth provider name to get token for\n   * @param scmServerUrl Git provider endpoint\n   * @param namespaceName The user's namespace name.\n   * @return personal access token\n   * @throws ScmConfigurationPersistenceException - problem occurred during communication with\n   *     permanent storage.\n   * @throws ScmCommunicationException - problem occurred during communication with SCM server.\n   */\n  Optional<PersonalAccessToken> get(\n      Subject cheUser,\n      @Nullable String oAuthProviderName,\n      @Nullable String scmServerUrl,\n      @Nullable String namespaceName)\n      throws ScmConfigurationPersistenceException, ScmCommunicationException;\n\n  /**\n   * Gets {@link PersonalAccessToken} from permanent storage. If the token is not found try to fetch\n   * it from scm provider and save it in a permanent storage and set (update) git-credentials.\n   *\n   * @param scmServerUrl Git provider endpoint\n   */\n  PersonalAccessToken getAndStore(String scmServerUrl)\n      throws ScmCommunicationException,\n          ScmConfigurationPersistenceException,\n          UnknownScmProviderException,\n          UnsatisfiedScmPreconditionException,\n          ScmUnauthorizedException;\n\n  /** Refresh a personal access token. */\n  void forceRefreshPersonalAccessToken(String scmServerUrl)\n      throws UnsatisfiedScmPreconditionException,\n          ScmConfigurationPersistenceException,\n          ScmUnauthorizedException,\n          ScmCommunicationException,\n          UnknownScmProviderException;\n\n  /**\n   * Set or update git-credentials with {@link PersonalAccessToken} from permanent storage.\n   *\n   * @param scmServerUrl Git provider endpoint\n   * @throws UnsatisfiedScmPreconditionException - storage preconditions aren't met.\n   * @throws ScmConfigurationPersistenceException - problem occurred during communication with\n   *     permanent storage.\n   * @throws ScmCommunicationException - problem occurred during communication with scm provider.\n   * @throws ScmUnauthorizedException - scm authorization required.\n   */\n  void storeGitCredentials(String scmServerUrl)\n      throws UnsatisfiedScmPreconditionException,\n          ScmConfigurationPersistenceException,\n          ScmCommunicationException,\n          ScmUnauthorizedException;\n\n  /**\n   * Store {@link PersonalAccessToken} in permanent storage.\n   *\n   * @param token personal access token\n   * @throws UnsatisfiedScmPreconditionException - storage preconditions aren't met.\n   * @throws ScmConfigurationPersistenceException - problem occurred during communication with\n   *     permanent storage.\n   */\n  void store(PersonalAccessToken token)\n      throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException;\n\n  /**\n   * Remove {@link PersonalAccessToken} from permanent storage.\n   *\n   * @param scmUrl Git provider endpoint permanent storage.\n   */\n  void remove(String scmUrl);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/PersonalAccessTokenParams.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\n/** An object to hold parameters for creating a personal access token. */\npublic class PersonalAccessTokenParams {\n  private final String scmProviderUrl;\n  private final String scmProviderName;\n  private final String scmTokenName;\n  private final String scmTokenId;\n  private final String token;\n  private final String organization;\n\n  public PersonalAccessTokenParams(\n      String scmProviderUrl,\n      String scmProviderName,\n      String scmTokenName,\n      String scmTokenId,\n      String token,\n      String organization) {\n    this.scmProviderUrl = scmProviderUrl;\n    this.scmProviderName = scmProviderName;\n    this.scmTokenName = scmTokenName;\n    this.scmTokenId = scmTokenId;\n    this.token = token;\n    this.organization = organization;\n  }\n\n  public String getScmProviderUrl() {\n    return scmProviderUrl;\n  }\n\n  /**\n   * This method returns the provider name if the token is a Personal Access Token, and the token\n   * name in format oauth2-<random string from 5 chars> if the token is an oauth token. Deprecated:\n   * We need to add a new method to distinguish oauth tokens from personal access tokens.\n   *\n   * @return token name\n   */\n  @Deprecated\n  public String getScmTokenName() {\n    return scmTokenName;\n  }\n\n  public String getScmTokenId() {\n    return scmTokenId;\n  }\n\n  public String getToken() {\n    return token;\n  }\n\n  public String getOrganization() {\n    return organization;\n  }\n\n  public String getScmProviderName() {\n    return scmProviderName;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/ScmPersonalAccessTokenFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\nimport java.util.Optional;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\n\n/**\n * Iterate over configured list of PersonalAccessTokenFetcher with attempt to get\n * PersonalAccessToken.\n */\npublic class ScmPersonalAccessTokenFetcher {\n  private final Set<PersonalAccessTokenFetcher> personalAccessTokenFetchers;\n\n  @Inject\n  public ScmPersonalAccessTokenFetcher(\n      Set<PersonalAccessTokenFetcher> personalAccessTokenFetchers) {\n    this.personalAccessTokenFetchers = personalAccessTokenFetchers;\n  }\n\n  public PersonalAccessToken refreshPersonalAccessToken(Subject cheUser, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    for (PersonalAccessTokenFetcher fetcher : personalAccessTokenFetchers) {\n      PersonalAccessToken token = fetcher.refreshPersonalAccessToken(cheUser, scmServerUrl);\n      if (token != null) {\n        return token;\n      }\n    }\n\n    throw new UnknownScmProviderException(\n        \"No PersonalAccessTokenFetcher configured for \" + scmServerUrl, scmServerUrl);\n  }\n\n  /**\n   * Iterate over the Set<PersonalAccessTokenFetcher> declared in container and sequentially invoke\n   * {@link PersonalAccessTokenFetcher#fetchPersonalAccessToken(Subject, String)} method.\n   *\n   * @throws UnknownScmProviderException - if none of PersonalAccessTokenFetchers return a\n   *     meaningful result.\n   */\n  public PersonalAccessToken fetchPersonalAccessToken(Subject cheUser, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    for (PersonalAccessTokenFetcher fetcher : personalAccessTokenFetchers) {\n      PersonalAccessToken token = fetcher.fetchPersonalAccessToken(cheUser, scmServerUrl);\n      if (token != null) {\n        return token;\n      }\n    }\n    throw new UnknownScmProviderException(\n        \"No PersonalAccessTokenFetcher configured for \" + scmServerUrl, scmServerUrl);\n  }\n\n  /**\n   * Iterate over the Set<PersonalAccessTokenFetcher> declared in container and sequentially invoke\n   * {@link PersonalAccessTokenFetcher#isValid(PersonalAccessToken)} method.\n   *\n   * @deprecated use {@link #getScmUsername(PersonalAccessTokenParams)} instead.\n   * @throws UnknownScmProviderException - if none of PersonalAccessTokenFetchers return a\n   *     meaningful result.\n   */\n  @Deprecated\n  public boolean isValid(PersonalAccessToken personalAccessToken)\n      throws UnknownScmProviderException, ScmUnauthorizedException, ScmCommunicationException {\n    for (PersonalAccessTokenFetcher fetcher : personalAccessTokenFetchers) {\n\n      Optional<Boolean> isValid = fetcher.isValid(personalAccessToken);\n      if (isValid.isPresent()) {\n        return isValid.get();\n      }\n    }\n    throw new UnknownScmProviderException(\n        \"No PersonalAccessTokenFetcher configured for \" + personalAccessToken.getScmProviderUrl(),\n        personalAccessToken.getScmProviderUrl());\n  }\n\n  /**\n   * Iterate over the Set<PersonalAccessTokenFetcher> declared in container and sequentially invoke\n   * {@link PersonalAccessTokenFetcher#isValid(PersonalAccessTokenParams)} method. If any of the\n   * fetchers return an scm username, return it. Otherwise, return null.\n   */\n  public Optional<String> getScmUsername(PersonalAccessTokenParams params)\n      throws UnknownScmProviderException, ScmCommunicationException {\n    for (PersonalAccessTokenFetcher fetcher : personalAccessTokenFetchers) {\n      Optional<Pair<Boolean, String>> isValid = fetcher.isValid(params);\n      if (isValid.isPresent() && isValid.get().first) {\n        return Optional.of(isValid.get().second);\n      }\n    }\n    return Optional.empty();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/exception/ExceptionMessages.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.exception;\n\npublic class ExceptionMessages {\n  public static String getDevfileConnectionErrorMessage(String location) {\n    return String.format(\"Could not reach devfile at %s\", location);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/exception/ScmBadRequestException.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.exception;\n\n/** Thrown when scm provider responded 400 on http request. */\npublic class ScmBadRequestException extends Exception {\n\n  public ScmBadRequestException(String message) {\n    super(message);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/exception/ScmCommunicationException.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.exception;\n\n/** Thrown when problem occurred during communication with scm provider */\npublic class ScmCommunicationException extends Exception {\n  private int statusCode;\n  private String provider;\n\n  public ScmCommunicationException(String message) {\n    super(message);\n  }\n\n  public ScmCommunicationException(String message, int statusCode, String provider) {\n    super(message);\n    this.statusCode = statusCode;\n    this.provider = provider;\n  }\n\n  public ScmCommunicationException(String message, int statusCode) {\n    super(message);\n    this.statusCode = statusCode;\n  }\n\n  public ScmCommunicationException(String message, Throwable cause) {\n    super(message, cause);\n  }\n\n  public ScmCommunicationException(String message, Throwable cause, String provider) {\n    super(message, cause);\n    this.provider = provider;\n  }\n\n  public int getStatusCode() {\n    return statusCode;\n  }\n\n  public String getProvider() {\n    return provider;\n  }\n\n  public void setProvider(String provider) {\n    this.provider = provider;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/exception/ScmConfigurationPersistenceException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.exception;\n\n/** Thrown when problem occurred during communication with permanent storage. */\npublic class ScmConfigurationPersistenceException extends Exception {\n  public ScmConfigurationPersistenceException(String message, Exception e) {\n    super(message, e);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/exception/ScmItemNotFoundException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.exception;\n\n/** Thrown when scm provider responded 404 on http request. */\npublic class ScmItemNotFoundException extends Exception {\n  public ScmItemNotFoundException(String message) {\n    super(message);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/exception/ScmUnauthorizedException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.exception;\n\n/** In case if OAuth1 or Oauth2 token is missing and we cant make any authorised calls */\npublic class ScmUnauthorizedException extends Exception {\n\n  private final String oauthProvider;\n  private final String oauthVersion;\n  private final String authenticateUrl;\n\n  public ScmUnauthorizedException(\n      String message, String oauthProvider, String oauthVersion, String authenticateUrl) {\n    super(message);\n    this.oauthProvider = oauthProvider;\n    this.oauthVersion = oauthVersion;\n    this.authenticateUrl = authenticateUrl;\n  }\n\n  public ScmUnauthorizedException(\n      String message,\n      String oauthProvider,\n      Throwable cause,\n      String oauthVersion,\n      String authenticateUrl) {\n    super(message, cause);\n    this.oauthProvider = oauthProvider;\n    this.oauthVersion = oauthVersion;\n    this.authenticateUrl = authenticateUrl;\n  }\n\n  public String getOauthProvider() {\n    return oauthProvider;\n  }\n\n  public String getAuthenticateUrl() {\n    return authenticateUrl;\n  }\n\n  public String getOauthVersion() {\n    return oauthVersion;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/exception/UnknownScmProviderException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.exception;\n\n/** Thrown when scm provider is unknown */\npublic class UnknownScmProviderException extends Exception {\n  private final String providerUrl;\n\n  public UnknownScmProviderException(String message, String providerUrl) {\n    super(message);\n    this.providerUrl = providerUrl;\n  }\n\n  public String getProviderUrl() {\n    return providerUrl;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/exception/UnsatisfiedScmPreconditionException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm.exception;\n\n/**\n * Exception for the case when one of the precondition are not met. For example at least one k8s\n * namespace exists.\n */\npublic class UnsatisfiedScmPreconditionException extends Exception {\n  public UnsatisfiedScmPreconditionException(String message) {\n    super(message);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/spi/FactoryDao.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.spi;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.factory.server.model.impl.FactoryImpl;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * Defines data access object contract for {@code FactoryImpl}.\n *\n * @author Max Shaposhnik\n * @author Anton Korneta\n */\npublic interface FactoryDao {\n\n  /**\n   * Creates factory.\n   *\n   * @param factory factory to create\n   * @return created factory\n   * @throws NullPointerException when {@code factory} is null\n   * @throws ConflictException when {@code factory} with given name and creator already exists\n   * @throws ServerException when any other error occurs\n   */\n  FactoryImpl create(FactoryImpl factory) throws ConflictException, ServerException;\n\n  /**\n   * Updates factory to the new entity, using replacement strategy.\n   *\n   * @param factory factory to update\n   * @return updated factory\n   * @throws NullPointerException when {@code factory} is null\n   * @throws NotFoundException when given factory is not found\n   * @throws ConflictException when {@code factory} with given name is already exist for creator\n   * @throws ServerException when any other error occurs\n   */\n  FactoryImpl update(FactoryImpl factory)\n      throws NotFoundException, ConflictException, ServerException;\n\n  /**\n   * Removes factory.\n   *\n   * @param id factory identifier\n   * @throws NullPointerException when {@code id} is null\n   * @throws ServerException when any other error occurs\n   */\n  void remove(String id) throws ServerException;\n\n  /**\n   * Gets factory by identifier.\n   *\n   * @param id factory identifier\n   * @return factory instance, never null\n   * @throws NullPointerException when {@code id} is null\n   * @throws NotFoundException when factory with given {@code id} is not found\n   * @throws ServerException when any other error occurs\n   */\n  FactoryImpl getById(String id) throws NotFoundException, ServerException;\n\n  /**\n   * Gets all factories of specified user.\n   *\n   * @param userId user identifier\n   * @return list factory instances, never null\n   * @throws NullPointerException when {@code userId} is null\n   * @throws ServerException when any other error occurs\n   */\n  Page<FactoryImpl> getByUser(String userId, int maxItems, long skipCount) throws ServerException;\n\n  /**\n   * Gets the factories for the list of attributes.\n   *\n   * @param maxItems the maximum count of items to fetch\n   * @param skipCount count of items which should be skipped\n   * @param attributes list of pairs of attributes to search for\n   * @return list of the factories which contain the specified attributes\n   * @throws IllegalArgumentException when {@code skipCount} or {@code maxItems} is negative\n   * @throws ServerException when any other error occurs\n   */\n  Page<FactoryImpl> getByAttributes(\n      int maxItems, int skipCount, List<Pair<String, String>> attributes) throws ServerException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/urlfactory/DefaultFactoryUrl.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.urlfactory;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.Collections.singletonList;\n\nimport java.net.MalformedURLException;\nimport java.net.URI;\nimport java.net.URL;\nimport java.util.List;\nimport java.util.Optional;\n\n/**\n * Default implementation of {@link RemoteFactoryUrl} which used with all factory URL's until there\n * is no specific implementation for given URL.\n */\npublic class DefaultFactoryUrl implements RemoteFactoryUrl {\n\n  private String devfileFileLocation;\n  private URL url;\n\n  @Override\n  public String getProviderName() {\n    return \"default\";\n  }\n\n  @Override\n  public List<DevfileLocation> devfileFileLocations() {\n    return singletonList(\n        new DevfileLocation() {\n          @Override\n          public Optional<String> filename() {\n            return Optional.empty();\n          }\n\n          @Override\n          public String location() {\n            return devfileFileLocation;\n          }\n        });\n  }\n\n  @Override\n  public String rawFileLocation(String filename) {\n    return URI.create(devfileFileLocation).resolve(filename).toString();\n  }\n\n  @Override\n  public String getHostName() {\n    return URI.create(devfileFileLocation).getHost();\n  }\n\n  @Override\n  public String getProviderUrl() {\n    return getHostName();\n  }\n\n  @Override\n  public String getBranch() {\n    return null;\n  }\n\n  public URL getUrl() {\n    return url;\n  }\n\n  @Override\n  public Optional<String> getCredentials() {\n    if (url == null || isNullOrEmpty(url.getUserInfo())) {\n      return Optional.empty();\n    }\n    String userInfo = url.getUserInfo();\n    String[] credentials = userInfo.split(\":\");\n    String username = credentials[0];\n    String password = credentials.length == 2 ? credentials[1] : null;\n    if (!isNullOrEmpty(username) || !isNullOrEmpty(password)) {\n      return Optional.of(\n          format(\n              \"%s:%s\",\n              isNullOrEmpty(username) ? \"\" : username, isNullOrEmpty(password) ? \"\" : password));\n    }\n    return Optional.empty();\n  }\n\n  public <U extends DefaultFactoryUrl> U withUrl(String url) {\n    try {\n      this.url = new URL(url);\n    } catch (MalformedURLException e) {\n      // Do nothing, wrong URL.\n    }\n    return (U) this;\n  }\n\n  public DefaultFactoryUrl withDevfileFileLocation(String devfileFileLocation) {\n    this.devfileFileLocation = devfileFileLocation;\n    return this;\n  }\n\n  @Override\n  public void setDevfileFilename(String devfileName) {\n    // do nothing as the devfile location is absolute\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/urlfactory/DevfileFilenamesProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.urlfactory;\n\nimport com.google.common.base.Splitter;\nimport java.util.List;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\n\n/** Provides list of configured devfile filenames to look in repository-based factories. */\n@Singleton\npublic class DevfileFilenamesProvider {\n\n  private final List<String> configuredDevfileFilenames;\n\n  @Inject\n  public DevfileFilenamesProvider(\n      @Named(\"che.factory.default_devfile_filenames\") String devfileFilenames) {\n    this.configuredDevfileFilenames = Splitter.on(\",\").splitToList(devfileFilenames);\n  }\n\n  public List<String> getConfiguredDevfileFilenames() {\n    return configuredDevfileFilenames;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/urlfactory/RemoteFactoryUrl.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.urlfactory;\n\nimport java.util.List;\nimport java.util.Optional;\n\n/**\n * Provides basic information about the remote factory URL components. Vendor specific\n * implementations may provide wider range of details about the URL (like username, repository etc).\n */\npublic interface RemoteFactoryUrl {\n\n  /** Provider name for given URL. */\n  String getProviderName();\n\n  /** Defines the devfile name */\n  void setDevfileFilename(String devfileName);\n\n  /**\n   * List of possible filenames and raw locations of devfile.\n   *\n   * @return devfile filenames and locations list\n   */\n  List<DevfileLocation> devfileFileLocations();\n\n  /** Address of raw file content in remote repository */\n  String rawFileLocation(String filename);\n\n  /** Remote hostname */\n  String getHostName();\n\n  /** Remote provider URL */\n  String getProviderUrl();\n\n  /** Remote branch */\n  String getBranch();\n\n  /** Optional of credentials in format <username>:<password> or <username>: */\n  Optional<String> getCredentials();\n\n  /** Describes devfile location, including filename if any. */\n  interface DevfileLocation {\n    Optional<String> filename();\n\n    String location();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/urlfactory/URLFactoryBuilder.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.urlfactory;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.api.factory.server.ApiExceptionMapper.toApiException;\nimport static org.eclipse.che.api.factory.server.scm.exception.ExceptionMessages.getDevfileConnectionErrorMessage;\nimport static org.eclipse.che.api.factory.shared.Constants.CURRENT_VERSION;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport java.io.IOException;\nimport java.util.Map;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl.DevfileLocation;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileParser;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileVersionDetector;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Handle the creation of some elements used inside a {@link FactoryDto}.\n *\n * @author Florent Benoit\n * @author Max Shaposhnyk\n */\n@Singleton\npublic class URLFactoryBuilder {\n\n  private static final Logger LOG = LoggerFactory.getLogger(URLFactoryBuilder.class);\n\n  public static final String DEVFILE_FILENAME = \"devfileFilename\";\n\n  private final String defaultCheEditor;\n  private final String defaultChePlugins;\n\n  private final boolean devWorskspacesEnabled;\n  private final DevfileParser devfileParser;\n  private final DevfileVersionDetector devfileVersionDetector;\n\n  @Inject\n  public URLFactoryBuilder(\n      @Named(\"che.factory.default_editor\") String defaultCheEditor,\n      @Nullable @Named(\"che.factory.default_plugins\") String defaultChePlugins,\n      @Named(\"che.devworkspaces.enabled\") boolean devWorskspacesEnabled,\n      DevfileParser devfileParser,\n      DevfileVersionDetector devfileVersionDetector) {\n    this.defaultCheEditor = defaultCheEditor;\n    this.defaultChePlugins = defaultChePlugins;\n    this.devWorskspacesEnabled = devWorskspacesEnabled;\n    this.devfileParser = devfileParser;\n    this.devfileVersionDetector = devfileVersionDetector;\n  }\n\n  /**\n   * Build a factory using the provided devfile. Allows to override devfile properties using\n   * specially constructed map {@see DevfileManager#parseYaml(String, Map)}.\n   *\n   * <p>We want factory to never fail due to name collision. Taking `generateName` with precedence.\n   * <br>\n   * If devfile has only `name`, we convert it to `generateName`. <br>\n   * If devfile has `name` and `generateName`, we remove `name` and use just `generateName`. <br>\n   * If devfile has `generateName`, we use that.\n   *\n   * @param remoteFactoryUrl parsed factory URL object\n   * @param fileContentProvider service-specific devfile related file content provider\n   * @param overrideProperties map of overridden properties to apply in devfile\n   * @return a factory or null if devfile is not found\n   */\n  public Optional<FactoryMetaDto> createFactoryFromDevfile(\n      RemoteFactoryUrl remoteFactoryUrl,\n      FileContentProvider fileContentProvider,\n      Map<String, String> overrideProperties,\n      boolean skipAuthentication)\n      throws ApiException {\n    String devfileYamlContent;\n\n    // Apply the new devfile name to look for\n    if (overrideProperties.containsKey(DEVFILE_FILENAME)) {\n      remoteFactoryUrl.setDevfileFilename(overrideProperties.get(DEVFILE_FILENAME));\n    }\n\n    for (DevfileLocation location : remoteFactoryUrl.devfileFileLocations()) {\n      String devfileLocation = location.location();\n      try {\n        Optional<String> credentialsOptional = remoteFactoryUrl.getCredentials();\n        if (skipAuthentication) {\n          devfileYamlContent =\n              fileContentProvider.fetchContentWithoutAuthentication(devfileLocation);\n        } else if (credentialsOptional.isPresent()) {\n          devfileYamlContent =\n              fileContentProvider.fetchContent(devfileLocation, credentialsOptional.get());\n        } else {\n          devfileYamlContent = fileContentProvider.fetchContent(devfileLocation);\n        }\n      } catch (IOException ex) {\n        // try next location\n        LOG.debug(\n            \"Unreachable devfile location met: {}. Error is: {}\", devfileLocation, ex.getMessage());\n        continue;\n      } catch (DevfileException e) {\n        LOG.debug(\"Unexpected devfile exception: {}\", e.getMessage());\n        throw e.getCause() instanceof ScmUnauthorizedException\n            ? toApiException(e, location)\n            : new ApiException(e.getMessage());\n      }\n      if (isNullOrEmpty(devfileYamlContent)) {\n        return Optional.empty();\n      }\n      try {\n        JsonNode parsedDevfile = devfileParser.parseYamlRaw(devfileYamlContent);\n        // We might have an html content in the parsed devfile, in case if the access is restricted,\n        // or if the URL points to a wrong resource.\n        try {\n          devfileVersionDetector.devfileVersion(parsedDevfile);\n        } catch (DevfileException e) {\n          throw new ApiException(getDevfileConnectionErrorMessage(devfileLocation));\n        }\n        return Optional.of(createFactory(parsedDevfile, location));\n      } catch (DevfileException e) {\n        throw toApiException(e, location);\n      }\n    }\n    return Optional.empty();\n  }\n\n  /**\n   * Converts given devfile json into factory.\n   *\n   * @param location devfile's location\n   * @return new factory created from the given devfile\n   */\n  private FactoryMetaDto createFactory(JsonNode devfileJson, DevfileLocation location) {\n    return newDto(FactoryDevfileV2Dto.class)\n        .withV(CURRENT_VERSION)\n        .withDevfile(devfileParser.convertYamlToMap(devfileJson))\n        .withSource(location.filename().isPresent() ? location.filename().get() : null);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/ApiExceptionMapperTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static org.testng.Assert.*;\n\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.core.rest.shared.dto.ExtendedError;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.testng.annotations.Test;\n\npublic class ApiExceptionMapperTest {\n\n  @Test\n  public void shouldReturnUnauthorizedExceptionIfCauseIsScmUnauthorized() {\n\n    ScmUnauthorizedException scmUnauthorizedException =\n        new ScmUnauthorizedException(\n            \"msg\", \"gitlab\", \"2.0\", \"http://gitlab.com/oauth/authenticate\");\n\n    ApiException exception =\n        ApiExceptionMapper.toApiException(new DevfileException(\"text\", scmUnauthorizedException));\n    assertTrue(exception instanceof UnauthorizedException);\n    assertEquals(((ExtendedError) exception.getServiceError()).getErrorCode(), 401);\n    assertEquals(((ExtendedError) exception.getServiceError()).getAttributes().size(), 3);\n    assertEquals(\n        ((ExtendedError) exception.getServiceError()).getAttributes().get(\"oauth_version\"), \"2.0\");\n    assertEquals(\n        ((ExtendedError) exception.getServiceError())\n            .getAttributes()\n            .get(\"oauth_authentication_url\"),\n        \"http://gitlab.com/oauth/authenticate\");\n  }\n\n  @Test\n  public void shouldReturnServerExceptionWhenCauseIsUnknownProvider() {\n\n    UnknownScmProviderException scmProviderException =\n        new UnknownScmProviderException(\"unknown\", \"http://gitlab.com/oauth/authenticate\");\n    ApiException exception =\n        ApiExceptionMapper.toApiException(new DevfileException(\"text\", scmProviderException));\n    assertTrue(exception instanceof ServerException);\n  }\n\n  @Test\n  public void shouldReturnServerExceptionWhenCauseIsCommunicationException() {\n\n    ScmCommunicationException communicationException = new ScmCommunicationException(\"unknown\");\n    ApiException exception =\n        ApiExceptionMapper.toApiException(new DevfileException(\"text\", communicationException));\n    assertTrue(exception instanceof ServerException);\n  }\n\n  @Test\n  public void shouldReturnBadrequestExceptionWhenCauseIsOtherException() {\n\n    ScmItemNotFoundException itemNotFoundException = new ScmItemNotFoundException(\"unknown\");\n    ApiException exception =\n        ApiExceptionMapper.toApiException(new DevfileException(\"text\", itemNotFoundException));\n    assertTrue(exception instanceof BadRequestException);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/BaseFactoryParameterResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static java.util.Collections.emptyMap;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport java.util.Map;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryVisitor;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(value = {MockitoTestNGListener.class})\npublic class BaseFactoryParameterResolverTest {\n\n  @Mock private AuthorisationRequestManager authorisationRequestManager;\n  @Mock private URLFactoryBuilder urlFactoryBuilder;\n  @Mock private RemoteFactoryUrl remoteFactoryUrl;\n  @Mock private FactoryVisitor factoryVisitor;\n  @Mock private FileContentProvider contentProvider;\n  private static final String PROVIDER_NAME = \"test\";\n\n  private BaseFactoryParameterResolver baseFactoryParameterResolver;\n\n  @BeforeMethod\n  protected void init() throws Exception {\n    baseFactoryParameterResolver =\n        new BaseFactoryParameterResolver(\n            authorisationRequestManager, urlFactoryBuilder, PROVIDER_NAME);\n  }\n\n  @Test\n  public void shouldReturnFalseOnGetSkipAuthorisation() {\n    // given\n    when(authorisationRequestManager.isStored(eq(PROVIDER_NAME))).thenReturn(false);\n    // when\n    boolean result = baseFactoryParameterResolver.getSkipAuthorisation(emptyMap());\n    // then\n    assertFalse(result);\n  }\n\n  @Test\n  public void shouldReturnTrueOnGetSkipAuthorisation() {\n    // given\n    when(authorisationRequestManager.isStored(eq(PROVIDER_NAME))).thenReturn(true);\n    // when\n    boolean result = baseFactoryParameterResolver.getSkipAuthorisation(emptyMap());\n    // then\n    assertTrue(result);\n  }\n\n  @Test\n  public void shouldReturnTrueOnGetSkipAuthorisationFromFactoryParams() {\n    // given\n    when(authorisationRequestManager.isStored(eq(PROVIDER_NAME))).thenReturn(false);\n    // when\n    boolean result =\n        baseFactoryParameterResolver.getSkipAuthorisation(Map.of(\"error_code\", \"access_denied\"));\n    // then\n    assertTrue(result);\n  }\n\n  @Test\n  public void shouldReturnDevfileV2() throws Exception {\n    // given\n    when(authorisationRequestManager.isStored(eq(PROVIDER_NAME))).thenReturn(false);\n    // when\n    baseFactoryParameterResolver.createFactory(\n        emptyMap(), remoteFactoryUrl, factoryVisitor, contentProvider);\n    // then\n    verify(factoryVisitor).visit(any(FactoryDevfileV2Dto.class));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryLinksHelperTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.*;\n\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.rest.ServiceContext;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.factory.shared.dto.AuthorDto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.ScmInfoDto;\nimport org.everrest.core.impl.uri.UriBuilderImpl;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class FactoryLinksHelperTest {\n\n  private static final String USER_ID = \"user123\";\n  private static final String URI_BASE = \"http://localhost:8080\";\n  public static final String TEST_REPO = \"https://test.repo.com\";\n\n  @Mock ServiceContext serviceContext;\n  @Mock AdditionalFilenamesProvider additionalFilenamesProvider;\n\n  @BeforeMethod\n  public void setUp() {\n    final UriBuilder uriBuilder = new UriBuilderImpl();\n    uriBuilder.uri(URI_BASE);\n    when(serviceContext.getServiceUriBuilder()).thenReturn(uriBuilder);\n  }\n\n  @Test\n  public void shouldContainDevfileLinkIfSourceIsPresent() {\n    final String testRepo = \"https://test.repo.com\";\n    List<Link> links =\n        FactoryLinksHelper.createLinks(\n            createV2FactoryWithSource(\"factory1\"),\n            serviceContext,\n            additionalFilenamesProvider,\n            \"user1\",\n            testRepo);\n    assertTrue(\n        links.stream()\n            .anyMatch(\n                l ->\n                    l.getMethod().equals(\"GET\")\n                        && l.getRel().equals(\"devfile.yaml content\")\n                        && l.getHref()\n                            .equals(\n                                URI_BASE\n                                    + \"/api/scm/resolve?repository=\"\n                                    + testRepo\n                                    + \"&file=devfile.yaml\")));\n  }\n\n  @Test\n  public void shouldContainFilesLinksIfScmInfoIsPresent() {\n    when(additionalFilenamesProvider.get()).thenReturn(Collections.singletonList(\"myfile.ext\"));\n    List<Link> links =\n        FactoryLinksHelper.createLinks(\n            createV2FactoryWithScmInfo(\"factory1\", TEST_REPO),\n            serviceContext,\n            additionalFilenamesProvider,\n            \"user1\",\n            TEST_REPO);\n    assertTrue(\n        links.stream()\n            .anyMatch(\n                l ->\n                    l.getMethod().equals(\"GET\")\n                        && l.getRel().equals(\"myfile.ext content\")\n                        && l.getHref()\n                            .equals(\n                                URI_BASE\n                                    + \"/api/scm/resolve?repository=\"\n                                    + TEST_REPO\n                                    + \"&file=myfile.ext\")));\n  }\n\n  @Test\n  public void shouldNotContainFilesLinksIfNoScmInfoIsPresent() {\n    final String testRepo = \"https://test.repo.com\";\n    List<Link> links =\n        FactoryLinksHelper.createLinks(\n            createV2FactoryWithSource(\"factory1\"),\n            serviceContext,\n            additionalFilenamesProvider,\n            \"user1\",\n            testRepo);\n    assertTrue(\n        links.stream()\n            .noneMatch(\n                l -> l.getMethod().equals(\"GET\") && l.getRel().equals(\"myfile.ext content\")));\n  }\n\n  private FactoryDevfileV2Dto createV2FactoryWithScmInfo(String name, String testRepo) {\n    return (FactoryDevfileV2Dto)\n        newDto(FactoryDevfileV2Dto.class)\n            .withV(\"4.0\")\n            .withDevfile(Map.of(\"a\", \"b\"))\n            .withScmInfo(\n                newDto(ScmInfoDto.class)\n                    .withRepositoryUrl(testRepo)\n                    .withScmProviderName(\"prov1\")\n                    .withBranch(\"branch\"))\n            .withCreator(newDto(AuthorDto.class).withUserId(USER_ID).withCreated(12L))\n            .withName(name);\n  }\n\n  private FactoryDevfileV2Dto createV2FactoryWithSource(String name) {\n    return (FactoryDevfileV2Dto)\n        newDto(FactoryDevfileV2Dto.class)\n            .withV(\"4.0\")\n            .withDevfile(Map.of(\"a\", \"b\"))\n            .withSource(\"devfile.yaml\")\n            .withCreator(newDto(AuthorDto.class).withUserId(USER_ID).withCreated(12L))\n            .withName(name);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryManagerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.assertFalse;\n\nimport org.eclipse.che.api.factory.server.model.impl.FactoryImpl;\nimport org.eclipse.che.api.factory.server.spi.FactoryDao;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Max Shaposhnik (mshaposhnik@codenvy.com) on 3/20/17.\n */\n@Listeners(value = {MockitoTestNGListener.class})\npublic class FactoryManagerTest {\n\n  @Mock private FactoryDao factoryDao;\n\n  @InjectMocks private FactoryManager factoryManager;\n\n  @Captor private ArgumentCaptor<FactoryImpl> factoryCaptor;\n\n  @Test\n  public void shouldGenerateNameOnFactoryCreation() throws Exception {\n    final FactoryImpl factory = FactoryImpl.builder().generateId().build();\n    factoryManager.saveFactory(factory);\n    verify(factoryDao).create(factoryCaptor.capture());\n    assertFalse(isNullOrEmpty(factoryCaptor.getValue().getName()));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static io.restassured.RestAssured.given;\nimport static java.lang.String.valueOf;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.factory.server.FactoryResolverPriority.DEFAULT;\nimport static org.eclipse.che.api.factory.server.FactoryResolverPriority.HIGHEST;\nimport static org.eclipse.che.api.factory.server.FactoryResolverPriority.LOWEST;\nimport static org.eclipse.che.api.factory.server.FactoryService.VALIDATE_QUERY_PARAMETER;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.everrest.assured.JettyHttpServer.ADMIN_USER_NAME;\nimport static org.everrest.assured.JettyHttpServer.ADMIN_USER_PASSWORD;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyMap;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport io.restassured.http.ContentType;\nimport io.restassured.response.Response;\nimport java.lang.reflect.Field;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Map;\nimport java.util.Set;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.core.rest.ApiExceptionMapper;\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\nimport org.eclipse.che.api.factory.server.FactoryService.FactoryParametersResolverHolder;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.user.server.PreferenceManager;\nimport org.eclipse.che.api.user.server.UserManager;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.everrest.assured.EverrestJetty;\nimport org.everrest.core.Filter;\nimport org.everrest.core.GenericContainerRequest;\nimport org.everrest.core.RequestFilter;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@link FactoryService}.\n *\n * @author Anton Korneta\n */\n@Listeners(value = {EverrestJetty.class, MockitoTestNGListener.class})\npublic class FactoryServiceTest {\n\n  private static final String SERVICE_PATH = \"/factory\";\n  private static final String FACTORY_ID = \"correctFactoryId\";\n  private static final String FACTORY_NAME = \"factory\";\n  private static final String USER_ID = \"userId\";\n  private static final String USER_EMAIL = \"email\";\n  private static final String WORKSPACE_NAME = \"workspace\";\n  private static final String PROJECT_SOURCE_TYPE = \"git\";\n  private static final String PROJECT_SOURCE_LOCATION =\n      \"https://github.com/codenvy/platform-api.git\";\n\n  private static final DtoFactory DTO = DtoFactory.getInstance();\n\n  private final String scmServerUrl = \"https://hostName.com\";\n\n  @Mock private FactoryAcceptValidator acceptValidator;\n  @Mock private PreferenceManager preferenceManager;\n  @Mock private UserManager userManager;\n  @Mock private AdditionalFilenamesProvider additionalFilenamesProvider;\n  @Mock private RawDevfileUrlFactoryParameterResolver rawDevfileUrlFactoryParameterResolver;\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n  @Mock private AuthorisationRequestManager authorisationRequestManager;\n\n  @InjectMocks private FactoryParametersResolverHolder factoryParametersResolverHolder;\n  private Set<FactoryParametersResolver> specificFactoryParametersResolvers;\n\n  private User user;\n\n  private FactoryService service;\n\n  @SuppressWarnings(\"unused\")\n  private ApiExceptionMapper apiExceptionMapper;\n\n  @SuppressWarnings(\"unused\")\n  private EnvironmentFilter environmentFilter;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    specificFactoryParametersResolvers = new HashSet<>();\n    Field parametersResolvers =\n        FactoryParametersResolverHolder.class.getDeclaredField(\n            \"specificFactoryParametersResolvers\");\n    parametersResolvers.setAccessible(true);\n    parametersResolvers.set(factoryParametersResolverHolder, specificFactoryParametersResolvers);\n    specificFactoryParametersResolvers.add(rawDevfileUrlFactoryParameterResolver);\n    user = new UserImpl(USER_ID, USER_EMAIL, ADMIN_USER_NAME);\n    lenient()\n        .when(preferenceManager.find(USER_ID))\n        .thenReturn(ImmutableMap.of(\"preference\", \"value\"));\n    service =\n        new FactoryService(\n            acceptValidator,\n            factoryParametersResolverHolder,\n            additionalFilenamesProvider,\n            personalAccessTokenManager,\n            authorisationRequestManager);\n  }\n\n  @Filter\n  public static class EnvironmentFilter implements RequestFilter {\n    @Override\n    public void doFilter(GenericContainerRequest request) {\n      EnvironmentContext context = EnvironmentContext.getCurrent();\n      context.setSubject(\n          new SubjectImpl(\n              ADMIN_USER_NAME, Collections.emptyList(), USER_ID, ADMIN_USER_PASSWORD, false));\n    }\n  }\n\n  @Test\n  public void shouldThrowBadRequestWhenNoURLParameterGiven() throws Exception {\n    final FactoryParametersResolverHolder dummyHolder = spy(factoryParametersResolverHolder);\n    doReturn(rawDevfileUrlFactoryParameterResolver)\n        .when(dummyHolder)\n        .getFactoryParametersResolver(anyMap());\n    // service instance with dummy holder\n    service =\n        new FactoryService(\n            acceptValidator,\n            dummyHolder,\n            additionalFilenamesProvider,\n            personalAccessTokenManager,\n            authorisationRequestManager);\n\n    // when\n    final Map<String, String> map = new HashMap<>();\n    final Response response =\n        given()\n            .contentType(ContentType.JSON)\n            .when()\n            .body(map)\n            .queryParam(VALIDATE_QUERY_PARAMETER, valueOf(true))\n            .post(SERVICE_PATH + \"/resolver\");\n\n    assertEquals(response.getStatusCode(), 400);\n    assertEquals(\n        DTO.createDtoFromJson(response.getBody().asString(), ServiceError.class).getMessage(),\n        \"Cannot build factory with any of the provided parameters. Please check parameters correctness, and resend query.\");\n  }\n\n  @Test\n  public void checkRefreshToken() throws Exception {\n    // given\n    final FactoryParametersResolverHolder dummyHolder = spy(factoryParametersResolverHolder);\n    FactoryParametersResolver factoryParametersResolver = mock(FactoryParametersResolver.class);\n    RemoteFactoryUrl remoteFactoryUrl = mock(RemoteFactoryUrl.class);\n    when(factoryParametersResolver.parseFactoryUrl(eq(\"someUrl\"))).thenReturn(remoteFactoryUrl);\n    when(remoteFactoryUrl.getProviderUrl()).thenReturn(scmServerUrl);\n    doReturn(factoryParametersResolver).when(dummyHolder).getFactoryParametersResolver(anyMap());\n    service =\n        new FactoryService(\n            acceptValidator,\n            dummyHolder,\n            additionalFilenamesProvider,\n            personalAccessTokenManager,\n            authorisationRequestManager);\n\n    // when\n    given()\n        .contentType(ContentType.JSON)\n        .when()\n        .queryParam(\"url\", \"someUrl\")\n        .post(SERVICE_PATH + \"/token/refresh\");\n\n    // then\n    verify(personalAccessTokenManager).getAndStore(eq(scmServerUrl));\n  }\n\n  @Test\n  public void shouldNotRefreshTokenIfAuthorisationRejected() throws Exception {\n    // given\n    final FactoryParametersResolverHolder dummyHolder = spy(factoryParametersResolverHolder);\n    FactoryParametersResolver factoryParametersResolver = mock(FactoryParametersResolver.class);\n    doReturn(factoryParametersResolver).when(dummyHolder).getFactoryParametersResolver(anyMap());\n    when(authorisationRequestManager.isStored(any())).thenReturn(true);\n    service =\n        new FactoryService(\n            acceptValidator,\n            dummyHolder,\n            additionalFilenamesProvider,\n            personalAccessTokenManager,\n            authorisationRequestManager);\n\n    // when\n    given()\n        .contentType(ContentType.JSON)\n        .when()\n        .queryParam(\"url\", \"someUrl\")\n        .post(SERVICE_PATH + \"/token/refresh\");\n\n    // then\n    verify(personalAccessTokenManager, never()).getAndStore(eq(scmServerUrl));\n  }\n\n  @Test\n  public void shouldThrowBadRequestWhenRefreshTokenWithoutUrl() throws Exception {\n    service =\n        new FactoryService(\n            acceptValidator,\n            factoryParametersResolverHolder,\n            additionalFilenamesProvider,\n            personalAccessTokenManager,\n            authorisationRequestManager);\n\n    // when\n    final Response response =\n        given().contentType(ContentType.JSON).when().post(SERVICE_PATH + \"/token/refresh\");\n\n    assertEquals(response.getStatusCode(), 400);\n    assertEquals(\n        DTO.createDtoFromJson(response.getBody().asString(), ServiceError.class).getMessage(),\n        \"Factory url required\");\n  }\n\n  @Test\n  public void shouldReturnDefaultFactoryParameterResolver() throws Exception {\n    // given\n    Map<String, String> params = singletonMap(URL_PARAMETER_NAME, \"https://host/path/devfile.yaml\");\n    when(rawDevfileUrlFactoryParameterResolver.accept(eq(params))).thenReturn(true);\n\n    // when\n    FactoryParametersResolver factoryParametersResolver =\n        factoryParametersResolverHolder.getFactoryParametersResolver(params);\n\n    // then\n    assertTrue(\n        factoryParametersResolver\n            .getClass()\n            .getName()\n            .startsWith(RawDevfileUrlFactoryParameterResolver.class.getName()));\n  }\n\n  @Test\n  public void shouldReturnTopPriorityFactoryParameterResolverOverLowPriority() throws Exception {\n    // given\n    Map<String, String> params = singletonMap(URL_PARAMETER_NAME, \"https://host/path/devfile.yaml\");\n    specificFactoryParametersResolvers.clear();\n    FactoryParametersResolver topPriorityResolver = mock(FactoryParametersResolver.class);\n    FactoryParametersResolver lowPriorityResolver = mock(FactoryParametersResolver.class);\n    when(topPriorityResolver.accept(eq(params))).thenReturn(true);\n    when(lowPriorityResolver.accept(eq(params))).thenReturn(true);\n    when(topPriorityResolver.priority()).thenReturn(HIGHEST);\n    when(lowPriorityResolver.priority()).thenReturn(LOWEST);\n    specificFactoryParametersResolvers.add(topPriorityResolver);\n    specificFactoryParametersResolvers.add(lowPriorityResolver);\n\n    // when\n    FactoryParametersResolver factoryParametersResolver =\n        factoryParametersResolverHolder.getFactoryParametersResolver(params);\n\n    // then\n    assertEquals(factoryParametersResolver, topPriorityResolver);\n  }\n\n  @Test\n  public void shouldReturnTopPriorityFactoryParameterResolverOverDefaultPriority()\n      throws Exception {\n    // given\n    Map<String, String> params = singletonMap(URL_PARAMETER_NAME, \"https://host/path/devfile.yaml\");\n    specificFactoryParametersResolvers.clear();\n    FactoryParametersResolver topPriorityResolver = mock(FactoryParametersResolver.class);\n    FactoryParametersResolver defaultPriorityResolver = mock(FactoryParametersResolver.class);\n    when(topPriorityResolver.accept(eq(params))).thenReturn(true);\n    when(defaultPriorityResolver.accept(eq(params))).thenReturn(true);\n    when(topPriorityResolver.priority()).thenReturn(HIGHEST);\n    when(defaultPriorityResolver.priority()).thenReturn(DEFAULT);\n    specificFactoryParametersResolvers.add(topPriorityResolver);\n    specificFactoryParametersResolvers.add(defaultPriorityResolver);\n\n    // when\n    FactoryParametersResolver factoryParametersResolver =\n        factoryParametersResolverHolder.getFactoryParametersResolver(params);\n\n    // then\n    assertEquals(factoryParametersResolver, topPriorityResolver);\n  }\n\n  @Test\n  public void shouldReturnDefaultPriorityFactoryParameterResolverOverLowPriority()\n      throws Exception {\n    // given\n    Map<String, String> params = singletonMap(URL_PARAMETER_NAME, \"https://host/path/devfile.yaml\");\n    specificFactoryParametersResolvers.clear();\n    FactoryParametersResolver lowPriorityResolver = mock(FactoryParametersResolver.class);\n    FactoryParametersResolver defaultPriorityResolver = mock(FactoryParametersResolver.class);\n    when(lowPriorityResolver.accept(eq(params))).thenReturn(true);\n    when(defaultPriorityResolver.accept(eq(params))).thenReturn(true);\n    when(lowPriorityResolver.priority()).thenReturn(LOWEST);\n    when(defaultPriorityResolver.priority()).thenReturn(DEFAULT);\n    specificFactoryParametersResolvers.add(lowPriorityResolver);\n    specificFactoryParametersResolvers.add(defaultPriorityResolver);\n\n    // when\n    FactoryParametersResolver factoryParametersResolver =\n        factoryParametersResolverHolder.getFactoryParametersResolver(params);\n\n    // then\n    assertEquals(factoryParametersResolver, defaultPriorityResolver);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/RawDevfileUrlFactoryParameterResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server;\n\nimport static java.lang.String.format;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyBoolean;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.fail;\nimport static org.testng.AssertJUnit.assertEquals;\nimport static org.testng.AssertJUnit.assertTrue;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport java.io.FileNotFoundException;\nimport java.util.Base64;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileParser;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.URLFileContentProvider;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(value = {MockitoTestNGListener.class})\npublic class RawDevfileUrlFactoryParameterResolverTest {\n\n  private static final String DEVFILE =\n      \"\" + \"schemaVersion: 2.3.0\\n\" + \"metadata:\\n\" + \"  name: test\\n\";\n\n  @Mock private URLFetcher urlFetcher;\n  @Mock private DevfileParser devfileParser;\n\n  @InjectMocks private RawDevfileUrlFactoryParameterResolver rawDevfileUrlFactoryParameterResolver;\n\n  @Test\n  @SuppressWarnings(\"unchecked\")\n  public void shouldFilterAndProvideOverrideParameters() throws Exception {\n    URLFactoryBuilder urlFactoryBuilder = mock(URLFactoryBuilder.class);\n    URLFetcher urlFetcher = mock(URLFetcher.class);\n\n    RawDevfileUrlFactoryParameterResolver res =\n        new RawDevfileUrlFactoryParameterResolver(urlFactoryBuilder, urlFetcher, devfileParser);\n\n    Map<String, String> factoryParameters = new HashMap<>();\n    factoryParameters.put(URL_PARAMETER_NAME, \"http://myloc/devfile\");\n    factoryParameters.put(\"override.param.foo\", \"bar\");\n    factoryParameters.put(\"override.param.bar\", \"foo\");\n    factoryParameters.put(\"ignored.non-override.property\", \"baz\");\n\n    ArgumentCaptor<Map<String, String>> captor = ArgumentCaptor.forClass(Map.class);\n    // when\n    res.createFactory(factoryParameters);\n\n    verify(urlFactoryBuilder)\n        .createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class),\n            any(URLFileContentProvider.class),\n            captor.capture(),\n            anyBoolean());\n    Map<String, String> filteredOverrides = captor.getValue();\n    assertEquals(2, filteredOverrides.size());\n    assertEquals(\"bar\", filteredOverrides.get(\"param.foo\"));\n    assertEquals(\"foo\", filteredOverrides.get(\"param.bar\"));\n    assertFalse(filteredOverrides.containsKey(\"ignored.non-override.property\"));\n  }\n\n  @Test(dataProvider = \"invalidURLsProvider\")\n  public void shouldThrowExceptionOnInvalidURL(String url, String message) throws Exception {\n    URLFactoryBuilder urlFactoryBuilder = mock(URLFactoryBuilder.class);\n    URLFetcher urlFetcher = mock(URLFetcher.class);\n\n    RawDevfileUrlFactoryParameterResolver res =\n        new RawDevfileUrlFactoryParameterResolver(urlFactoryBuilder, urlFetcher, devfileParser);\n\n    Map<String, String> factoryParameters = new HashMap<>();\n    factoryParameters.put(URL_PARAMETER_NAME, url);\n\n    // when\n    try {\n      res.createFactory(factoryParameters);\n      fail(\"Exception is expected\");\n    } catch (BadRequestException e) {\n      assertEquals(\n          e.getMessage(),\n          format(\n              \"Unable to process provided factory URL. Please check its validity and try again. Parser message: %s\",\n              message));\n    }\n  }\n\n  @Test(dataProvider = \"devfileUrls\")\n  public void shouldAcceptRawDevfileUrl(String url) throws Exception {\n    // given\n    JsonNode jsonNode = mock(JsonNode.class);\n    when(urlFetcher.fetch(eq(url), eq(null))).thenReturn(DEVFILE);\n    when(devfileParser.parseYamlRaw(eq(DEVFILE))).thenReturn(jsonNode);\n    when(jsonNode.isEmpty()).thenReturn(false);\n\n    // when\n    boolean result =\n        rawDevfileUrlFactoryParameterResolver.accept(singletonMap(URL_PARAMETER_NAME, url));\n\n    // then\n    assertTrue(result);\n  }\n\n  @Test(dataProvider = \"devfileUrlsWithoutExtension\")\n  public void shouldAcceptRawDevfileUrlWithoutExtension(String url) throws Exception {\n    // given\n    JsonNode jsonNode = mock(JsonNode.class);\n    when(urlFetcher.fetch(eq(url), eq(null))).thenReturn(DEVFILE);\n    when(devfileParser.parseYamlRaw(eq(DEVFILE))).thenReturn(jsonNode);\n    when(jsonNode.isEmpty()).thenReturn(false);\n\n    // when\n    boolean result =\n        rawDevfileUrlFactoryParameterResolver.accept(singletonMap(URL_PARAMETER_NAME, url));\n\n    // then\n    assertTrue(result);\n  }\n\n  @Test\n  public void shouldAcceptRawDevfileUrlWithYaml() throws Exception {\n    // given\n    JsonNode jsonNode = mock(JsonNode.class);\n    String url = \"https://host/path/devfile\";\n    when(urlFetcher.fetch(eq(url), eq(null))).thenReturn(DEVFILE);\n    when(devfileParser.parseYamlRaw(eq(DEVFILE))).thenReturn(jsonNode);\n    when(jsonNode.isEmpty()).thenReturn(false);\n\n    // when\n    boolean result =\n        rawDevfileUrlFactoryParameterResolver.accept(singletonMap(URL_PARAMETER_NAME, url));\n\n    // then\n    assertTrue(result);\n  }\n\n  @Test\n  public void shouldAcceptRawDevfileUrlWithCredentials() throws Exception {\n    // given\n    JsonNode jsonNode = mock(JsonNode.class);\n    String url = \"https://credentials@host/path/devfile\";\n    when(urlFetcher.fetch(\n            eq(url), eq(\"Basic \" + Base64.getEncoder().encodeToString(\"credentials:\".getBytes()))))\n        .thenReturn(DEVFILE);\n    when(devfileParser.parseYamlRaw(eq(DEVFILE))).thenReturn(jsonNode);\n    when(jsonNode.isEmpty()).thenReturn(false);\n\n    // when\n    boolean result =\n        rawDevfileUrlFactoryParameterResolver.accept(singletonMap(URL_PARAMETER_NAME, url));\n\n    // then\n    assertTrue(result);\n  }\n\n  @Test\n  public void shouldNotAcceptPublicGitRepositoryUrl() throws Exception {\n    // given\n    JsonNode jsonNode = mock(JsonNode.class);\n    String gitRepositoryUrl = \"https://host/user/repo.git\";\n    when(urlFetcher.fetch(eq(gitRepositoryUrl), eq(null))).thenReturn(\"unsupported content\");\n    when(devfileParser.parseYamlRaw(eq(\"unsupported content\"))).thenReturn(jsonNode);\n    when(jsonNode.isEmpty()).thenReturn(true);\n\n    // when\n    boolean result =\n        rawDevfileUrlFactoryParameterResolver.accept(\n            singletonMap(URL_PARAMETER_NAME, gitRepositoryUrl));\n\n    // then\n    assertFalse(result);\n  }\n\n  @Test\n  public void shouldNotAcceptPrivateGitRepositoryUrl() throws Exception {\n    // given\n    String gitRepositoryUrl = \"https://host/user/private-repo.git\";\n    when(urlFetcher.fetch(eq(gitRepositoryUrl), eq(null))).thenThrow(new FileNotFoundException());\n\n    // when\n    boolean result =\n        rawDevfileUrlFactoryParameterResolver.accept(\n            singletonMap(URL_PARAMETER_NAME, gitRepositoryUrl));\n\n    // then\n    assertFalse(result);\n  }\n\n  @DataProvider(name = \"invalidURLsProvider\")\n  private Object[][] invalidUrlsProvider() {\n    return new Object[][] {\n      {\"C:\\\\Users\\\\aa\\\\bb\\\\XX\\\\\", \"unknown protocol: c\"},\n      {\n        \"https://github.com/ .git\",\n        \"Illegal character in path at index 19: https://github.com/ .git\"\n      },\n      {\"unknown:///abc.dce\", \"unknown protocol: unknown\"}\n    };\n  }\n\n  @DataProvider(name = \"devfileUrls\")\n  private Object[] devfileUrls() {\n    return new String[] {\n      \"https://host/path/devfile.yaml\",\n      \"https://host/path/.devfile.yaml\",\n      \"https://host/path/any-name.yaml\",\n      \"https://host/path/any-name.yml\",\n      \"https://host/path/devfile.yaml?token=TOKEN123\",\n      \"https://host/path/.devfile.yaml?token=TOKEN123\",\n      \"https://host/path/any-name.yaml?token=TOKEN123\",\n      \"https://host/path/any-name.yml?token=TOKEN123\",\n      \"https://host/path/devfile.yaml?at=refs/heads/branch\",\n      \"https://host/path/.devfile.yaml?at=refs/heads/branch\",\n      \"https://host/path/any-name.yaml?at=refs/heads/branch\",\n      \"https://host/path/any-name.yml?at=refs/heads/branch\"\n    };\n  }\n\n  @DataProvider(name = \"devfileUrlsWithoutExtension\")\n  private Object[] devfileUrlsWithoutExtension() {\n    return new String[] {\"https://host/path/any-name\", \"https://host/path/any-name?token=TOKEN123\"};\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/impl/FactoryBaseValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.impl;\n\nimport static java.util.Collections.singletonList;\nimport static java.util.Objects.*;\nimport static org.eclipse.che.dto.server.DtoFactory.*;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.mockito.Mockito.lenient;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.io.IOException;\nimport java.net.URISyntaxException;\nimport java.text.ParseException;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.factory.server.FactoryConstants;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\nimport org.eclipse.che.api.factory.shared.dto.IdeActionDto;\nimport org.eclipse.che.api.factory.shared.dto.IdeDto;\nimport org.eclipse.che.api.factory.shared.dto.OnAppClosedDto;\nimport org.eclipse.che.api.factory.shared.dto.OnAppLoadedDto;\nimport org.eclipse.che.api.factory.shared.dto.OnProjectsLoadedDto;\nimport org.eclipse.che.api.factory.shared.dto.PoliciesDto;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\nimport org.eclipse.che.api.user.server.spi.UserDao;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(value = {MockitoTestNGListener.class})\npublic class FactoryBaseValidatorTest {\n  private static final String VALID_REPOSITORY_URL = \"https://github.com/codenvy/cloudide\";\n  private static final String VALID_PROJECT_PATH = \"/cloudide\";\n  private static final String ID = \"id\";\n\n  @Mock private UserDao userDao;\n\n  private TesterFactoryBaseValidator validator;\n\n  private FactoryDevfileV2Dto factory;\n\n  @BeforeMethod\n  public void setUp() throws ParseException, NotFoundException, ServerException {\n    factory = newDto(FactoryDevfileV2Dto.class).withV(\"4.0\");\n    final UserImpl user = new UserImpl(\"userid\", \"email\", \"name\");\n\n    lenient().when(userDao.getById(\"userid\")).thenReturn(user);\n    validator = new TesterFactoryBaseValidator();\n  }\n\n  @DataProvider(name = \"invalidProjectNamesProvider\")\n  public Object[][] invalidProjectNames() {\n    return new Object[][] {\n      {\"-untitled\"}, {\"untitled->3\"}, {\"untitled__2%\"}, {\"untitled_!@#$%^&*()_+?><\"}\n    };\n  }\n\n  @Test(\n      expectedExceptions = ApiException.class,\n      expectedExceptionsMessageRegExp = FactoryConstants.ILLEGAL_FACTORY_BY_UNTIL_MESSAGE)\n  public void shouldNotValidateIfUntilBeforeCurrentTime() throws ApiException {\n    Long currentTime = new Date().getTime();\n    factory.withPolicies(newDto(PoliciesDto.class).withUntil(currentTime - 10000L));\n\n    validator.validateCurrentTimeBetweenSinceUntil(factory);\n  }\n\n  @Test\n  public void shouldValidateIfCurrentTimeBetweenUntilSince() throws ApiException {\n    Long currentTime = new Date().getTime();\n\n    factory.withPolicies(\n        newDto(PoliciesDto.class).withSince(currentTime - 10000L).withUntil(currentTime + 10000L));\n\n    validator.validateCurrentTimeBetweenSinceUntil(factory);\n  }\n\n  @Test(\n      expectedExceptions = ApiException.class,\n      expectedExceptionsMessageRegExp = FactoryConstants.ILLEGAL_FACTORY_BY_SINCE_MESSAGE)\n  public void shouldNotValidateIfUntilSinceAfterCurrentTime() throws ApiException {\n    Long currentTime = new Date().getTime();\n    factory.withPolicies(newDto(PoliciesDto.class).withSince(currentTime + 10000L));\n\n    validator.validateCurrentTimeBetweenSinceUntil(factory);\n  }\n\n  @Test\n  public void shouldValidateTrackedParamsIfOrgIdIsMissingButOnPremisesTrue() throws Exception {\n    final DtoFactory dtoFactory = getInstance();\n    FactoryDevfileV2Dto factory = dtoFactory.createDto(FactoryDevfileV2Dto.class);\n    factory\n        .withV(\"4.0\")\n        .withPolicies(\n            dtoFactory\n                .createDto(PoliciesDto.class)\n                .withSince(System.currentTimeMillis() + 1_000_000)\n                .withUntil(System.currentTimeMillis() + 10_000_000)\n                .withReferer(\"codenvy.com\"));\n    validator = new TesterFactoryBaseValidator();\n  }\n\n  @Test(expectedExceptions = BadRequestException.class)\n  public void shouldNotValidateOpenfileActionIfInWrongSectionOnAppClosed() throws Exception {\n    // given\n    validator = new TesterFactoryBaseValidator();\n    List<IdeActionDto> actions = singletonList(newDto(IdeActionDto.class).withId(\"openFile\"));\n    IdeDto ide =\n        newDto(IdeDto.class).withOnAppClosed(newDto(OnAppClosedDto.class).withActions(actions));\n    FactoryMetaDto factoryWithAccountId = requireNonNull(getInstance().clone(factory)).withIde(ide);\n    // when\n    validator.validateProjectActions(factoryWithAccountId);\n  }\n\n  @Test(expectedExceptions = BadRequestException.class)\n  public void shouldNotValidateFindReplaceActionIfInWrongSectionOnAppLoaded() throws Exception {\n    // given\n    validator = new TesterFactoryBaseValidator();\n    List<IdeActionDto> actions = singletonList(newDto(IdeActionDto.class).withId(\"findReplace\"));\n    IdeDto ide =\n        newDto(IdeDto.class).withOnAppLoaded(newDto(OnAppLoadedDto.class).withActions(actions));\n    FactoryMetaDto factoryWithAccountId = requireNonNull(getInstance().clone(factory)).withIde(ide);\n    // when\n    validator.validateProjectActions(factoryWithAccountId);\n  }\n\n  @Test(expectedExceptions = BadRequestException.class)\n  public void shouldNotValidateIfOpenfileActionInsufficientParams() throws Exception {\n    // given\n    validator = new TesterFactoryBaseValidator();\n    List<IdeActionDto> actions = singletonList(newDto(IdeActionDto.class).withId(\"openFile\"));\n    IdeDto ide =\n        newDto(IdeDto.class)\n            .withOnProjectsLoaded(newDto(OnProjectsLoadedDto.class).withActions(actions));\n    FactoryMetaDto factoryWithAccountId = requireNonNull(getInstance().clone(factory)).withIde(ide);\n    // when\n    validator.validateProjectActions(factoryWithAccountId);\n  }\n\n  @Test(expectedExceptions = BadRequestException.class)\n  public void shouldNotValidateIfrunCommandActionInsufficientParams() throws Exception {\n    // given\n    validator = new TesterFactoryBaseValidator();\n    List<IdeActionDto> actions = singletonList(newDto(IdeActionDto.class).withId(\"openFile\"));\n    IdeDto ide =\n        newDto(IdeDto.class)\n            .withOnProjectsLoaded(newDto(OnProjectsLoadedDto.class).withActions(actions));\n    FactoryMetaDto factoryWithAccountId = requireNonNull(getInstance().clone(factory)).withIde(ide);\n    // when\n    validator.validateProjectActions(factoryWithAccountId);\n  }\n\n  @Test(expectedExceptions = BadRequestException.class)\n  public void shouldNotValidateIfOpenWelcomePageActionInsufficientParams() throws Exception {\n    // given\n    validator = new TesterFactoryBaseValidator();\n    List<IdeActionDto> actions =\n        singletonList(newDto(IdeActionDto.class).withId(\"openWelcomePage\"));\n    IdeDto ide =\n        newDto(IdeDto.class).withOnAppLoaded((newDto(OnAppLoadedDto.class).withActions(actions)));\n    FactoryMetaDto factoryWithAccountId = requireNonNull(getInstance().clone(factory)).withIde(ide);\n    // when\n    validator.validateProjectActions(factoryWithAccountId);\n  }\n\n  @Test(expectedExceptions = BadRequestException.class)\n  public void shouldNotValidateIfFindReplaceActionInsufficientParams() throws Exception {\n    // given\n    validator = new TesterFactoryBaseValidator();\n    Map<String, String> params = new HashMap<>();\n    params.put(\"in\", \"pom.xml\");\n    // find is missing!\n    params.put(\"replace\", \"123\");\n    List<IdeActionDto> actions =\n        singletonList(newDto(IdeActionDto.class).withId(\"findReplace\").withProperties(params));\n    IdeDto ide =\n        newDto(IdeDto.class)\n            .withOnProjectsLoaded(newDto(OnProjectsLoadedDto.class).withActions(actions));\n    FactoryMetaDto factoryWithAccountId = requireNonNull(getInstance().clone(factory)).withIde(ide);\n    // when\n    validator.validateProjectActions(factoryWithAccountId);\n  }\n\n  @Test\n  public void shouldValidateFindReplaceAction() throws Exception {\n    // given\n    validator = new TesterFactoryBaseValidator();\n    Map<String, String> params = new HashMap<>();\n    params.put(\"in\", \"pom.xml\");\n    params.put(\"find\", \"123\");\n    params.put(\"replace\", \"456\");\n    List<IdeActionDto> actions =\n        singletonList(newDto(IdeActionDto.class).withId(\"findReplace\").withProperties(params));\n    IdeDto ide =\n        newDto(IdeDto.class)\n            .withOnProjectsLoaded(newDto(OnProjectsLoadedDto.class).withActions(actions));\n    FactoryMetaDto factoryWithAccountId = requireNonNull(getInstance().clone(factory)).withIde(ide);\n    // when\n    validator.validateProjectActions(factoryWithAccountId);\n  }\n\n  @Test\n  public void shouldValidateOpenfileAction() throws Exception {\n    // given\n    validator = new TesterFactoryBaseValidator();\n    Map<String, String> params = new HashMap<>();\n    params.put(\"file\", \"pom.xml\");\n    List<IdeActionDto> actions =\n        singletonList(newDto(IdeActionDto.class).withId(\"openFile\").withProperties(params));\n    IdeDto ide =\n        newDto(IdeDto.class)\n            .withOnProjectsLoaded(newDto(OnProjectsLoadedDto.class).withActions(actions));\n    FactoryMetaDto factoryWithAccountId = requireNonNull(getInstance().clone(factory)).withIde(ide);\n    // when\n    validator.validateProjectActions(factoryWithAccountId);\n  }\n\n  @DataProvider(name = \"trackedFactoryParameterWithoutValidAccountId\")\n  public Object[][] trackedFactoryParameterWithoutValidAccountId()\n      throws URISyntaxException, IOException, NoSuchMethodException {\n    return new Object[][] {\n      {\n        newDto(FactoryMetaDto.class)\n            .withV(\"4.0\")\n            .withIde(\n                newDto(IdeDto.class)\n                    .withOnAppLoaded(\n                        newDto(OnAppLoadedDto.class)\n                            .withActions(\n                                singletonList(\n                                    newDto(IdeActionDto.class)\n                                        .withId(\"openWelcomePage\")\n                                        .withProperties(\n                                            ImmutableMap.<String, String>builder()\n                                                .put(\"authenticatedTitle\", \"title\")\n                                                .put(\"authenticatedIconUrl\", \"url\")\n                                                .put(\"authenticatedContentUrl\", \"url\")\n                                                .put(\"nonAuthenticatedTitle\", \"title\")\n                                                .put(\"nonAuthenticatedIconUrl\", \"url\")\n                                                .put(\"nonAuthenticatedContentUrl\", \"url\")\n                                                .build())))))\n      },\n      {\n        newDto(FactoryMetaDto.class)\n            .withV(\"4.0\")\n            .withPolicies(newDto(PoliciesDto.class).withSince(10000L))\n      },\n      {\n        newDto(FactoryMetaDto.class)\n            .withV(\"4.0\")\n            .withPolicies(newDto(PoliciesDto.class).withUntil(10000L))\n      },\n      {\n        newDto(FactoryMetaDto.class)\n            .withV(\"4.0\")\n            .withPolicies(newDto(PoliciesDto.class).withReferer(\"host\"))\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/impl/SourceProjectParametersValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.impl;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.HashMap;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.workspace.shared.dto.SourceStorageDto;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class SourceProjectParametersValidatorTest {\n  private SourceStorageParametersValidator validator;\n\n  private SourceStorageDto sourceStorage;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    validator = new SourceStorageParametersValidator();\n\n    sourceStorage =\n        DtoFactory.getInstance()\n            .createDto(SourceStorageDto.class)\n            .withLocation(\"location\")\n            .withType(\"git\")\n            .withParameters(\n                new HashMap<>(\n                    ImmutableMap.of(\n                        \"branch\",\n                        \"master\",\n                        \"commitId\",\n                        \"123456\",\n                        \"keepVcs\",\n                        \"true\",\n                        \"fetch\",\n                        \"12345\",\n                        \"keepDir\",\n                        \"/src\")));\n  }\n\n  @Test\n  public void shouldBeAbleValidateGitSource() throws Exception {\n    validator.validate(sourceStorage, FactoryParameter.Version.V4_0);\n  }\n\n  @Test\n  public void shouldBeAbleValidateESBWSO2Source() throws Exception {\n    sourceStorage.setType(\"esbwso2\");\n\n    validator.validate(sourceStorage, FactoryParameter.Version.V4_0);\n  }\n\n  @Test(\n      expectedExceptions = ConflictException.class,\n      expectedExceptionsMessageRegExp =\n          \"You have provided an invalid parameter .* for this version of Factory parameters.*\")\n  public void shouldThrowExceptionIfUnknownParameterIsUsed() throws Exception {\n    sourceStorage.getParameters().put(\"other\", \"value\");\n\n    validator.validate(sourceStorage, FactoryParameter.Version.V4_0);\n  }\n\n  @Test(\n      expectedExceptions = ConflictException.class,\n      expectedExceptionsMessageRegExp =\n          \"The parameter .* has a value submitted .* with a value that is unexpected.*\")\n  public void shouldThrowExceptionIfKeepVcsIsNotTrueOrFalse() throws Exception {\n    sourceStorage.getParameters().put(\"keepVcs\", \"qwerty\");\n\n    validator.validate(sourceStorage, FactoryParameter.Version.V4_0);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/impl/TesterFactoryBaseValidator.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.impl;\n\n/**\n * @author Sergii Kabashniuk\n */\npublic class TesterFactoryBaseValidator extends FactoryBaseValidator {\n\n  public TesterFactoryBaseValidator() {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/jpa/FactoryTckModule.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.jpa;\n\nimport com.google.inject.TypeLiteral;\nimport org.eclipse.che.api.factory.server.model.impl.FactoryImpl;\nimport org.eclipse.che.api.factory.server.spi.FactoryDao;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\nimport org.eclipse.che.commons.test.tck.TckModule;\nimport org.eclipse.che.commons.test.tck.repository.JpaTckRepository;\nimport org.eclipse.che.commons.test.tck.repository.TckRepository;\n\n/**\n * Tck module for factory test.\n *\n * @author Yevhenii Voevodin\n */\npublic class FactoryTckModule extends TckModule {\n\n  @Override\n  protected void configure() {\n    bind(FactoryDao.class).to(JpaFactoryDao.class);\n\n    bind(new TypeLiteral<TckRepository<FactoryImpl>>() {})\n        .toInstance(new JpaTckRepository<>(FactoryImpl.class));\n    bind(new TypeLiteral<TckRepository<UserImpl>>() {})\n        .toInstance(new JpaTckRepository<>(UserImpl.class));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/scm/AuthorizingFactoryParameterResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.scm;\n\nimport static org.mockito.AdditionalAnswers.returnsFirstArg;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(value = {MockitoTestNGListener.class})\npublic class AuthorizingFactoryParameterResolverTest {\n  @Mock private RemoteFactoryUrl remoteFactoryUrl;\n  @Mock private URLFetcher urlFetcher;\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n  @Mock private PersonalAccessToken personalAccessToken;\n\n  private AuthorizingFileContentProvider<?> provider;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    provider =\n        new AuthorizingFileContentProvider<>(\n            remoteFactoryUrl, urlFetcher, personalAccessTokenManager);\n    when(remoteFactoryUrl.rawFileLocation(anyString())).thenAnswer(returnsFirstArg());\n  }\n\n  @Test\n  public void shouldFetchContentWithAuthentication() throws Exception {\n    // given\n    when(remoteFactoryUrl.getProviderUrl()).thenReturn(\"https://provider.url\");\n    when(urlFetcher.fetch(anyString(), anyString())).thenReturn(\"content\");\n    when(personalAccessTokenManager.getAndStore(anyString())).thenReturn(personalAccessToken);\n\n    // when\n    provider.fetchContent(\"url\");\n\n    // then\n    verify(personalAccessTokenManager).getAndStore(anyString());\n  }\n\n  @Test\n  public void shouldFetchContentWithoutAuthentication() throws Exception {\n    // given\n    when(urlFetcher.fetch(anyString())).thenReturn(\"content\");\n\n    // when\n    provider.fetchContentWithoutAuthentication(\"url\");\n\n    // then\n    verify(personalAccessTokenManager, never()).getAndStore(anyString());\n  }\n\n  @Test\n  public void shouldOmitDotInTheResourceName() throws Exception {\n    assertEquals(provider.formatUrl(\"./pom.xml\"), \"pom.xml\");\n  }\n\n  @Test\n  public void shouldKeepResourceNameUnchanged() throws Exception {\n    assertEquals(provider.formatUrl(\".gitconfig\"), \".gitconfig\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/urlfactory/DefaultFactoryUrlTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.urlfactory;\n\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport java.util.Optional;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/** Testing {@link DefaultFactoryUrl} */\n@Listeners(MockitoTestNGListener.class)\npublic class DefaultFactoryUrlTest {\n  @Test(dataProvider = \"urlsProvider\")\n  public void shouldGetCredentials(String url, String credentials) {\n    // given\n    DefaultFactoryUrl factoryUrl = new DefaultFactoryUrl().withUrl(url);\n    // when\n    Optional<String> credentialsOptional = factoryUrl.getCredentials();\n    // then\n    assertTrue(credentialsOptional.isPresent());\n    assertEquals(credentialsOptional.get(), credentials);\n  }\n\n  @DataProvider(name = \"urlsProvider\")\n  private Object[][] urlsProvider() {\n    return new Object[][] {\n      {\"https://username:password@hostname/path\", \"username:password\"},\n      {\"https://token@hostname/path/user/repo/\", \"token:\"},\n      {\"http://token@hostname/path/user/repo/\", \"token:\"},\n      {\"https://token@dev.azure.com/user/repo/\", \"token:\"},\n      {\"https://token@dev.azure.com/user/repo?a=&b=b&c=/.devfile.yaml&api-version=7.0\", \"token:\"},\n      {\"https://token@gitlub.com/user/repo/\", \"token:\"},\n      {\"https://token@bitbucket.org/user/repo/\", \"token:\"},\n      {\n        \"https://personal-access-token@raw.githubusercontent.com/user/repo/branch/.devfile.yaml\",\n        \"personal-access-token:\"\n      }\n    };\n  }\n\n  @Test\n  public void shouldGetEmptyCredentials() {\n    // given\n    DefaultFactoryUrl factoryUrl = new DefaultFactoryUrl().withUrl(\"https://hostname/path\");\n    // when\n    Optional<String> credentialsOptional = factoryUrl.getCredentials();\n    // then\n    assertFalse(credentialsOptional.isPresent());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/urlfactory/URLFactoryBuilderTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.urlfactory;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.node.JsonNodeFactory;\nimport com.fasterxml.jackson.databind.node.ObjectNode;\nimport java.io.IOException;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.core.rest.shared.dto.ExtendedError;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl.DevfileLocation;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileParser;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileVersionDetector;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.EnvironmentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.RecipeImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.MetadataImpl;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Testing {@link URLFactoryBuilder}\n *\n * @author Florent Benoit\n * @author Max Shaposhnyk\n */\n@Listeners(MockitoTestNGListener.class)\npublic class URLFactoryBuilderTest {\n\n  private final String defaultEditor = \"eclipse/che-theia/1.0.0\";\n  private final String defaultPlugin = \"eclipse/che-machine-exec-plugin/0.0.1\";\n\n  /** Grab content of URLs */\n  @Mock private URLFetcher urlFetcher;\n\n  @Mock private DevfileParser devfileParser;\n\n  @Mock private DevfileVersionDetector devfileVersionDetector;\n\n  @Mock private FileContentProvider fileContentProvider;\n\n  /** Tested instance. */\n  private URLFactoryBuilder urlFactoryBuilder;\n\n  @BeforeMethod\n  public void setUp() throws IOException, DevfileException {\n    this.urlFactoryBuilder =\n        new URLFactoryBuilder(\n            defaultEditor, defaultPlugin, true, devfileParser, devfileVersionDetector);\n  }\n\n  @Test\n  public void checkWithCustomDevfileAndRecipe() throws Exception {\n\n    DevfileImpl devfile = new DevfileImpl();\n    WorkspaceConfigImpl workspaceConfigImpl = new WorkspaceConfigImpl();\n    String myLocation = \"http://foo-location/\";\n    RecipeImpl expectedRecipe =\n        new RecipeImpl(KUBERNETES_COMPONENT_TYPE, \"application/x-yaml\", \"content\", \"\");\n    EnvironmentImpl expectedEnv = new EnvironmentImpl(expectedRecipe, emptyMap());\n    workspaceConfigImpl.setEnvironments(singletonMap(\"name\", expectedEnv));\n    workspaceConfigImpl.setDefaultEnv(\"name\");\n\n    when(devfileParser.parseYamlRaw(anyString()))\n        .thenReturn(new ObjectNode(JsonNodeFactory.instance));\n    when(fileContentProvider.fetchContent(anyString())).thenReturn(\"content\");\n\n    FactoryMetaDto factory =\n        urlFactoryBuilder\n            .createFactoryFromDevfile(\n                new DefaultFactoryUrl().withDevfileFileLocation(myLocation).withUrl(\"url\"),\n                fileContentProvider,\n                emptyMap(),\n                false)\n            .get();\n\n    assertNotNull(factory);\n    assertNull(factory.getSource());\n    assertTrue(factory instanceof FactoryDevfileV2Dto);\n  }\n\n  @Test\n  public void testDevfileV2() throws ApiException, DevfileException, IOException {\n    String myLocation = \"http://foo-location/\";\n    Map<String, Object> devfileAsMap = Map.of(\"hello\", \"there\", \"how\", \"are\", \"you\", \"?\");\n\n    JsonNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    when(devfileParser.parseYamlRaw(anyString())).thenReturn(devfile);\n    when(devfileParser.convertYamlToMap(devfile)).thenReturn(devfileAsMap);\n    when(fileContentProvider.fetchContent(anyString())).thenReturn(\"content\");\n\n    FactoryMetaDto factory =\n        urlFactoryBuilder\n            .createFactoryFromDevfile(\n                new DefaultFactoryUrl().withDevfileFileLocation(myLocation).withUrl(\"url\"),\n                fileContentProvider,\n                emptyMap(),\n                false)\n            .get();\n\n    assertNotNull(factory);\n    assertNull(factory.getSource());\n    assertTrue(factory instanceof FactoryDevfileV2Dto);\n    assertEquals(((FactoryDevfileV2Dto) factory).getDevfile(), devfileAsMap);\n  }\n\n  @Test\n  public void testDevfileV2WithFilename() throws ApiException, DevfileException, IOException {\n    String myLocation = \"http://foo-location/\";\n    Map<String, Object> devfileAsMap = Map.of(\"hello\", \"there\", \"how\", \"are\", \"you\", \"?\");\n\n    JsonNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    when(devfileParser.parseYamlRaw(anyString())).thenReturn(devfile);\n    when(devfileParser.convertYamlToMap(devfile)).thenReturn(devfileAsMap);\n    when(fileContentProvider.fetchContent(anyString())).thenReturn(\"content\");\n\n    RemoteFactoryUrl githubLikeRemoteUrl =\n        new RemoteFactoryUrl() {\n          @Override\n          public String getProviderName() {\n            return null;\n          }\n\n          @Override\n          public List<DevfileLocation> devfileFileLocations() {\n            return Collections.singletonList(\n                new DevfileLocation() {\n                  @Override\n                  public Optional<String> filename() {\n                    return Optional.of(\"devfile.yaml\");\n                  }\n\n                  @Override\n                  public String location() {\n                    return myLocation;\n                  }\n                });\n          }\n\n          @Override\n          public String rawFileLocation(String filename) {\n            return null;\n          }\n\n          @Override\n          public String getHostName() {\n            return null;\n          }\n\n          @Override\n          public String getProviderUrl() {\n            return null;\n          }\n\n          @Override\n          public String getBranch() {\n            return null;\n          }\n\n          @Override\n          public Optional<String> getCredentials() {\n            return Optional.empty();\n          }\n\n          @Override\n          public void setDevfileFilename(String devfileName) {}\n        };\n\n    FactoryMetaDto factory =\n        urlFactoryBuilder\n            .createFactoryFromDevfile(githubLikeRemoteUrl, fileContentProvider, emptyMap(), false)\n            .get();\n\n    assertNotNull(factory);\n    assertEquals(factory.getSource(), \"devfile.yaml\");\n    assertTrue(factory instanceof FactoryDevfileV2Dto);\n    assertEquals(((FactoryDevfileV2Dto) factory).getDevfile(), devfileAsMap);\n  }\n\n  @Test\n  public void testDevfileSpecifyingFilename() throws ApiException, DevfileException, IOException {\n    String myLocation = \"http://foo-location/\";\n    Map<String, Object> devfileAsMap = Map.of(\"hello\", \"there\", \"how\", \"are\", \"you\", \"?\");\n\n    JsonNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    when(devfileParser.parseYamlRaw(anyString())).thenReturn(devfile);\n    when(devfileParser.convertYamlToMap(devfile)).thenReturn(devfileAsMap);\n    when(fileContentProvider.fetchContent(anyString())).thenReturn(\"content\");\n\n    RemoteFactoryUrl githubLikeRemoteUrl =\n        new RemoteFactoryUrl() {\n\n          private String devfileName = \"default-devfile.yaml\";\n\n          @Override\n          public String getProviderName() {\n            return null;\n          }\n\n          @Override\n          public List<DevfileLocation> devfileFileLocations() {\n            return Collections.singletonList(\n                new DevfileLocation() {\n                  @Override\n                  public Optional<String> filename() {\n                    return Optional.of(devfileName);\n                  }\n\n                  @Override\n                  public String location() {\n                    return myLocation;\n                  }\n                });\n          }\n\n          @Override\n          public String rawFileLocation(String filename) {\n            return null;\n          }\n\n          @Override\n          public String getHostName() {\n            return null;\n          }\n\n          @Override\n          public String getProviderUrl() {\n            return null;\n          }\n\n          @Override\n          public String getBranch() {\n            return null;\n          }\n\n          @Override\n          public Optional<String> getCredentials() {\n            return Optional.empty();\n          }\n\n          @Override\n          public void setDevfileFilename(String devfileName) {\n            this.devfileName = devfileName;\n          }\n        };\n\n    String pathToDevfile = \"my-custom-devfile-path.yaml\";\n    Map<String, String> propertiesMap =\n        singletonMap(URLFactoryBuilder.DEVFILE_FILENAME, pathToDevfile);\n    FactoryMetaDto factory =\n        urlFactoryBuilder\n            .createFactoryFromDevfile(\n                githubLikeRemoteUrl, fileContentProvider, propertiesMap, false)\n            .get();\n\n    assertNotNull(factory);\n    // Check that we didn't fetch from default files but from the parameter\n    assertEquals(factory.getSource(), pathToDevfile);\n    assertTrue(factory instanceof FactoryDevfileV2Dto);\n    assertEquals(((FactoryDevfileV2Dto) factory).getDevfile(), devfileAsMap);\n  }\n\n  @Test\n  public void testShouldReturnV2WithDevworkspacesDisabled()\n      throws ApiException, DevfileException, IOException {\n    String myLocation = \"http://foo-location/\";\n    Map<String, Object> devfileAsMap = Map.of(\"hello\", \"there\", \"how\", \"are\", \"you\", \"?\");\n\n    JsonNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    when(devfileParser.parseYamlRaw(anyString())).thenReturn(devfile);\n    when(devfileParser.convertYamlToMap(devfile)).thenReturn(devfileAsMap);\n    when(fileContentProvider.fetchContent(anyString())).thenReturn(\"content\");\n\n    URLFactoryBuilder localUrlFactoryBuilder =\n        new URLFactoryBuilder(\n            defaultEditor, defaultPlugin, false, devfileParser, devfileVersionDetector);\n\n    FactoryMetaDto factory =\n        localUrlFactoryBuilder\n            .createFactoryFromDevfile(\n                new DefaultFactoryUrl().withDevfileFileLocation(myLocation).withUrl(\"url\"),\n                fileContentProvider,\n                emptyMap(),\n                false)\n            .get();\n    assertNotNull(factory);\n    assertTrue(factory instanceof FactoryDevfileV2Dto);\n    assertEquals(((FactoryDevfileV2Dto) factory).getDevfile(), devfileAsMap);\n  }\n\n  @DataProvider\n  public Object[][] devfiles() {\n    final String NAME = \"name\";\n    final String GEN_NAME = \"genName\";\n\n    DevfileImpl devfileTemplate = new DevfileImpl();\n    devfileTemplate.setApiVersion(\"1.0.0\");\n    MetadataImpl metadataTemplate = new MetadataImpl();\n\n    metadataTemplate.setName(NAME);\n    devfileTemplate.setMetadata(metadataTemplate);\n    DevfileImpl justName = new DevfileImpl(devfileTemplate);\n\n    metadataTemplate.setName(null);\n    metadataTemplate.setGenerateName(GEN_NAME);\n    devfileTemplate.setMetadata(metadataTemplate);\n    DevfileImpl justGenerateName = new DevfileImpl(devfileTemplate);\n\n    metadataTemplate.setName(NAME);\n    metadataTemplate.setGenerateName(GEN_NAME);\n    devfileTemplate.setMetadata(metadataTemplate);\n    DevfileImpl bothNames = new DevfileImpl(devfileTemplate);\n\n    return new Object[][] {{justName, NAME}, {justGenerateName, GEN_NAME}, {bothNames, GEN_NAME}};\n  }\n\n  @Test(dataProvider = \"devfileExceptions\")\n  public void checkCorrectExceptionThrownDependingOnCause(\n      Throwable cause,\n      Class expectedClass,\n      String expectedMessage,\n      Map<String, String> expectedAttributes)\n      throws IOException, DevfileException {\n    DefaultFactoryUrl defaultFactoryUrl = mock(DefaultFactoryUrl.class);\n    FileContentProvider fileContentProvider = mock(FileContentProvider.class);\n    when(defaultFactoryUrl.devfileFileLocations())\n        .thenReturn(\n            singletonList(\n                new DevfileLocation() {\n                  @Override\n                  public Optional<String> filename() {\n                    return Optional.empty();\n                  }\n\n                  @Override\n                  public String location() {\n                    return \"http://foo.bar/anything\";\n                  }\n                }));\n\n    when(fileContentProvider.fetchContent(anyString()))\n        .thenThrow(new DevfileException(expectedMessage, cause));\n\n    // when\n    try {\n      urlFactoryBuilder.createFactoryFromDevfile(\n          defaultFactoryUrl, fileContentProvider, emptyMap(), false);\n    } catch (ApiException e) {\n      assertTrue(e.getClass().isAssignableFrom(expectedClass));\n      assertEquals(e.getMessage(), expectedMessage);\n      if (\"SCM Authentication required\".equals(e.getMessage()))\n        assertEquals(((ExtendedError) e.getServiceError()).getAttributes(), expectedAttributes);\n    }\n  }\n\n  @Test(\n      expectedExceptions = ApiException.class,\n      expectedExceptionsMessageRegExp = \"Could not reach devfile at location\")\n  public void shouldThrowErrorOnUnsupportedDevfileContent()\n      throws ApiException, DevfileException, IOException {\n    JsonNode jsonNode = mock(JsonNode.class);\n    when(fileContentProvider.fetchContent(eq(\"location\"))).thenReturn(\"unsupported content\");\n    when(devfileParser.parseYamlRaw(eq(\"unsupported content\"))).thenReturn(jsonNode);\n    when(devfileVersionDetector.devfileVersion(eq(jsonNode))).thenThrow(new DevfileException(\"\"));\n    urlFactoryBuilder.createFactoryFromDevfile(\n        new DefaultFactoryUrl().withDevfileFileLocation(\"location\"),\n        fileContentProvider,\n        emptyMap(),\n        false);\n  }\n\n  @DataProvider\n  public static Object[][] devfileExceptions() {\n    return new Object[][] {\n      {\n        new ScmCommunicationException(\"foo\"),\n        ServerException.class,\n        \"There is an error happened when communicate with SCM server. Error message: foo\",\n        null\n      },\n      {\n        new UnknownScmProviderException(\"foo\", \"bar\"),\n        ServerException.class,\n        \"Provided location is unknown or misconfigured on the server side. Error message: foo\",\n        null\n      },\n      {\n        new ScmUnauthorizedException(\"foo\", \"bitbucket\", \"1.0\", \"http://foo.bar\"),\n        UnauthorizedException.class,\n        \"SCM Authentication required\",\n        Map.of(\n            \"oauth_version\",\n            \"1.0\",\n            \"oauth_authentication_url\",\n            \"http://foo.bar\",\n            \"oauth_provider\",\n            \"bitbucket\")\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/resources/META-INF/services/org.eclipse.che.commons.test.tck.TckModule",
    "content": "org.eclipse.che.api.factory.server.jpa.FactoryTckModule\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n    <contextListener class=\"ch.qos.logback.classic.jul.LevelChangePropagator\">\n        <resetJUL>true</resetJUL>\n    </contextListener>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <appender name=\"file\" class=\"ch.qos.logback.core.FileAppender\">\n        <File>target/log/codenvy-factory-commons.log</File>\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <logger name=\"org.flywaydb.core.internal\" level=\"OFF\"/>\n    <logger name=\"org.eclipse.jetty\" level=\"OFF\"/>\n    <logger name=\"org.eclipse.che.core.db.schema.impl.flyway\" level=\"OFF\"/>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n        <appender-ref ref=\"file\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory/src/test/resources/logging.properties",
    "content": "handlers = org.apache.juli.logging.org.slf4j.bridge.SLF4JBridgeHandler\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-factory-azure-devops</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Factory Resolver Azure DevOps</name>\n    <properties>\n        <findbugs.failonerror>true</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.validation</groupId>\n            <artifactId>jakarta.validation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.github.tomakehurst</groupId>\n            <artifactId>wiremock-jre8-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>jcl-over-slf4j</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.wiremock</groupId>\n            <artifactId>wiremock-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOps.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport com.google.common.base.Joiner;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Base64;\n\n/**\n * Utils for Azure DevOps OAuth.\n *\n * @author Anatolii Bazko\n */\npublic class AzureDevOps {\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  public static final String PROVIDER_NAME = \"azure-devops\";\n\n  /** Azure DevOps SAAS endpoint. */\n  public static final String SAAS_ENDPOINT = \"https://dev.azure.com\";\n\n  /** Azure DevOps Service API version calls. */\n  public static final String API_VERSION = \"7.0\";\n\n  public static String getAuthenticateUrlPath(String[] scopes) {\n    return \"/oauth/authenticate?oauth_provider=\"\n        + PROVIDER_NAME\n        + \"&scope=\"\n        + Joiner.on(\" \").join(scopes);\n  }\n\n  /** The authorization request varies depending on the type of token. */\n  public static String formatAuthorizationHeader(String token, boolean isPAT) {\n    return isPAT\n        ? \"Basic \"\n            + Base64.getEncoder().encodeToString((\":\" + token).getBytes(StandardCharsets.UTF_8))\n        : \"Bearer \" + token;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsApiClient.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport static java.net.HttpURLConnection.HTTP_BAD_REQUEST;\nimport static java.net.HttpURLConnection.HTTP_FORBIDDEN;\nimport static java.net.HttpURLConnection.HTTP_MOVED_TEMP;\nimport static java.net.HttpURLConnection.HTTP_NOT_FOUND;\nimport static java.net.HttpURLConnection.HTTP_NO_CONTENT;\nimport static java.net.HttpURLConnection.HTTP_OK;\nimport static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;\nimport static java.time.Duration.ofSeconds;\nimport static org.eclipse.che.api.factory.server.azure.devops.AzureDevOps.formatAuthorizationHeader;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.google.common.base.Charsets;\nimport com.google.common.io.CharStreams;\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.UncheckedIOException;\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.time.Duration;\nimport java.util.concurrent.Executors;\nimport java.util.function.Function;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Azure DevOps Service API operations helper. */\n@Singleton\npublic class AzureDevOpsApiClient {\n\n  private static final Logger LOG = LoggerFactory.getLogger(AzureDevOpsApiClient.class);\n\n  private final HttpClient httpClient;\n  private final String azureDevOpsApiEndpoint;\n  private static final Duration DEFAULT_HTTP_TIMEOUT = ofSeconds(10);\n  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();\n\n  @Inject\n  public AzureDevOpsApiClient(\n      @Named(\"che.integration.azure.devops.api_endpoint\") String azureDevOpsApiEndpoint) {\n    this.azureDevOpsApiEndpoint = trimEnd(azureDevOpsApiEndpoint, '/');\n    this.httpClient =\n        HttpClient.newBuilder()\n            .executor(\n                Executors.newCachedThreadPool(\n                    new ThreadFactoryBuilder()\n                        .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n                        .setNameFormat(AzureDevOpsApiClient.class.getName() + \"-%d\")\n                        .setDaemon(true)\n                        .build()))\n            .connectTimeout(DEFAULT_HTTP_TIMEOUT)\n            .version(HttpClient.Version.HTTP_1_1)\n            .build();\n  }\n\n  /**\n   * Returns the user associated with the provided OAuth access token. See Microsoft documentation\n   * at:\n   *\n   * <p>https://learn.microsoft.com/en-us/rest/api/azure/devops/graph/users/get?view=azure-devops-rest-7.0&tabs=HTTP\n   */\n  public AzureDevOpsUser getUserWithOAuthToken(String token)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    final String url =\n        String.format(\n            \"%s/_apis/profile/profiles/me?api-version=%s\",\n            azureDevOpsApiEndpoint, AzureDevOps.API_VERSION);\n    return getUser(url, formatAuthorizationHeader(token, false));\n  }\n\n  /**\n   * Returns the user associated with the provided PAT. The difference from {@code\n   * getUserWithOAuthToken} is in authorization header and the fact that PAT is associated with\n   * organization.\n   */\n  public AzureDevOpsUser getUserWithPAT(String pat, String organization)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    final String url =\n        String.format(\n            \"%s/%s/_apis/profile/profiles/me?api-version=%s\",\n            azureDevOpsApiEndpoint, organization, AzureDevOps.API_VERSION);\n    return getUser(url, formatAuthorizationHeader(pat, true));\n  }\n\n  private AzureDevOpsUser getUser(String url, String authorizationHeader)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    final HttpRequest userDataRequest;\n    try {\n      userDataRequest =\n          HttpRequest.newBuilder(URI.create(url))\n              .headers(\"Authorization\", authorizationHeader)\n              .timeout(DEFAULT_HTTP_TIMEOUT)\n              .build();\n    } catch (IllegalArgumentException e) {\n      throw new ScmBadRequestException(e.getMessage());\n    }\n    LOG.trace(\"executeRequest={}\", userDataRequest);\n    return executeRequest(\n        httpClient,\n        userDataRequest,\n        response -> {\n          try {\n            String result =\n                CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n            return OBJECT_MAPPER.readValue(result, AzureDevOpsUser.class);\n          } catch (IOException e) {\n            throw new UncheckedIOException(e);\n          }\n        });\n  }\n\n  private <T> T executeRequest(\n      HttpClient httpClient,\n      HttpRequest request,\n      Function<HttpResponse<InputStream>, T> responseConverter)\n      throws ScmBadRequestException,\n          ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmUnauthorizedException {\n    try {\n      HttpResponse<InputStream> response =\n          httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());\n      LOG.trace(\"executeRequest={} response {}\", request, response.statusCode());\n      if (response.statusCode() == HTTP_OK) {\n        return responseConverter.apply(response);\n      } else if (response.statusCode() == HTTP_NO_CONTENT) {\n        return null;\n      } else {\n        String body = CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n        switch (response.statusCode()) {\n          case HTTP_BAD_REQUEST:\n            throw new ScmBadRequestException(body);\n          case HTTP_NOT_FOUND:\n            throw new ScmItemNotFoundException(body);\n          case HTTP_UNAUTHORIZED:\n          case HTTP_FORBIDDEN:\n          // Azure DevOps tries to redirect to the login page if the user is not authorized.\n          case HTTP_MOVED_TEMP:\n            throw new ScmUnauthorizedException(body, \"azure-devops\", \"v2\", \"\");\n          default:\n            throw new ScmCommunicationException(\n                \"Unexpected status code \" + response.statusCode() + \" \" + response,\n                response.statusCode(),\n                \"azure-devops\");\n        }\n      }\n    } catch (IOException | InterruptedException | UncheckedIOException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsAuthorizingFileContentProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport static org.eclipse.che.api.factory.server.azure.devops.AzureDevOps.formatAuthorizationHeader;\n\nimport java.io.IOException;\nimport org.eclipse.che.api.factory.server.scm.AuthorizingFileContentProvider;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/**\n * AzureDevops specific authorizing file content provider.\n *\n * @author Anatolii Bazko\n */\nclass AzureDevOpsAuthorizingFileContentProvider\n    extends AuthorizingFileContentProvider<AzureDevOpsUrl> {\n\n  AzureDevOpsAuthorizingFileContentProvider(\n      AzureDevOpsUrl azureDevOpsUrl,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(azureDevOpsUrl, urlFetcher, personalAccessTokenManager);\n  }\n\n  @Override\n  protected boolean isPublicRepository(AzureDevOpsUrl remoteFactoryUrl) {\n    try {\n      urlFetcher.fetch(remoteFactoryUrl.getRepositoryLocation());\n      return true;\n    } catch (IOException e) {\n      return false;\n    }\n  }\n\n  @Override\n  protected String formatAuthorization(String token, boolean isPAT) {\n    return formatAuthorizationHeader(token, isPAT);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsFactoryParametersResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport static org.eclipse.che.api.factory.shared.Constants.REVISION_PARAMETER_NAME;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport com.google.common.base.Strings;\nimport jakarta.validation.constraints.NotNull;\nimport java.util.HashMap;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.factory.server.BaseFactoryParameterResolver;\nimport org.eclipse.che.api.factory.server.FactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryVisitor;\nimport org.eclipse.che.api.factory.shared.dto.ScmInfoDto;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.shared.dto.SourceStorageDto;\n\n/**\n * Provides Factory Parameters resolver for Azure DevOps repositories.\n *\n * @author Anatolii Bazko\n */\n@Singleton\npublic class AzureDevOpsFactoryParametersResolver extends BaseFactoryParameterResolver\n    implements FactoryParametersResolver {\n\n  private static final String PROVIDER_NAME = \"azure-devops\";\n\n  /** Parser which will allow to check validity of URLs and create objects. */\n  private final AzureDevOpsURLParser azureDevOpsURLParser;\n\n  private final URLFetcher urlFetcher;\n  private final URLFactoryBuilder urlFactoryBuilder;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n\n  @Inject\n  public AzureDevOpsFactoryParametersResolver(\n      AzureDevOpsURLParser azureDevOpsURLParser,\n      URLFetcher urlFetcher,\n      URLFactoryBuilder urlFactoryBuilder,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      AuthorisationRequestManager authorisationRequestManager) {\n    super(authorisationRequestManager, urlFactoryBuilder, PROVIDER_NAME);\n    this.azureDevOpsURLParser = azureDevOpsURLParser;\n    this.urlFetcher = urlFetcher;\n    this.urlFactoryBuilder = urlFactoryBuilder;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n  }\n\n  @Override\n  public boolean accept(@NotNull final Map<String, String> factoryParameters) {\n    return factoryParameters.containsKey(URL_PARAMETER_NAME)\n        && azureDevOpsURLParser.isValid(factoryParameters.get(URL_PARAMETER_NAME));\n  }\n\n  @Override\n  public String getProviderName() {\n    return PROVIDER_NAME;\n  }\n\n  @Override\n  public FactoryMetaDto createFactory(@NotNull final Map<String, String> factoryParameters)\n      throws ApiException {\n    // no need to check null value of url parameter as accept() method has performed the check\n    final AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser.parse(\n            factoryParameters.get(URL_PARAMETER_NAME),\n            factoryParameters.get(REVISION_PARAMETER_NAME));\n\n    // create factory from the following location if location exists, else create default factory\n    return createFactory(\n        factoryParameters,\n        azureDevOpsUrl,\n        new AzureDevOpsFactoryVisitor(azureDevOpsUrl),\n        new AzureDevOpsAuthorizingFileContentProvider(\n            azureDevOpsUrl, urlFetcher, personalAccessTokenManager));\n  }\n\n  /**\n   * Visitor that puts the default devfile or updates devfile projects into the Azure DevOps\n   * Factory, if needed.\n   */\n  private class AzureDevOpsFactoryVisitor implements FactoryVisitor {\n\n    private final AzureDevOpsUrl azureDevOpsUrl;\n\n    private AzureDevOpsFactoryVisitor(AzureDevOpsUrl azureDevOpsUrl) {\n      this.azureDevOpsUrl = azureDevOpsUrl;\n    }\n\n    @Override\n    public FactoryDevfileV2Dto visit(FactoryDevfileV2Dto factoryDto) {\n      ScmInfoDto scmInfo =\n          newDto(ScmInfoDto.class)\n              .withScmProviderName(azureDevOpsUrl.getProviderName())\n              .withRepositoryUrl(azureDevOpsUrl.getRepositoryLocation())\n              .withBranch(azureDevOpsUrl.getBranch());\n      return factoryDto.withScmInfo(scmInfo);\n    }\n  }\n\n  @Override\n  public RemoteFactoryUrl parseFactoryUrl(String factoryUrl) throws ApiException {\n    return azureDevOpsURLParser.parse(factoryUrl, null);\n  }\n\n  private SourceStorageDto buildWorkspaceConfigSource(AzureDevOpsUrl azureDevOpsUrl) {\n    Map<String, String> parameters = new HashMap<>(1);\n    if (!Strings.isNullOrEmpty(azureDevOpsUrl.getBranch())) {\n      parameters.put(\"branch\", azureDevOpsUrl.getBranch());\n    }\n    if (!Strings.isNullOrEmpty(azureDevOpsUrl.getTag())) {\n      parameters.put(\"tag\", azureDevOpsUrl.getTag());\n    }\n\n    return newDto(SourceStorageDto.class)\n        .withLocation(azureDevOpsUrl.getRepositoryLocation())\n        .withType(\"git\")\n        .withParameters(parameters);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsModule.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\nimport org.eclipse.che.api.factory.server.scm.GitUserDataFetcher;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher;\n\npublic class AzureDevOpsModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    Multibinder<PersonalAccessTokenFetcher> tokenFetcherMultibinder =\n        Multibinder.newSetBinder(binder(), PersonalAccessTokenFetcher.class);\n    tokenFetcherMultibinder.addBinding().to(AzureDevOpsPersonalAccessTokenFetcher.class);\n    Multibinder<GitUserDataFetcher> gitUserDataMultibinder =\n        Multibinder.newSetBinder(binder(), GitUserDataFetcher.class);\n    gitUserDataMultibinder.addBinding().to(AzureDevOpsUserDataFetcher.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsPersonalAccessTokenFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport static org.eclipse.che.api.factory.server.azure.devops.AzureDevOps.getAuthenticateUrlPath;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport java.util.Arrays;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenParams;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Azure DevOps Service OAuth2 token fetcher.\n *\n * @author Anatolii Bazko\n */\npublic class AzureDevOpsPersonalAccessTokenFetcher implements PersonalAccessTokenFetcher {\n\n  private static final Logger LOG =\n      LoggerFactory.getLogger(AzureDevOpsPersonalAccessTokenFetcher.class);\n  private static final String OAUTH_PROVIDER_NAME = \"azure-devops\";\n  private final String cheApiEndpoint;\n  private final String azureDevOpsSAASApiEndpoint;\n  private final OAuthAPI oAuthAPI;\n  private final String[] scopes;\n\n  private final AzureDevOpsApiClient azureDevOpsApiClient;\n\n  @Inject\n  public AzureDevOpsPersonalAccessTokenFetcher(\n      @Named(\"che.api\") String cheApiEndpoint,\n      @Named(\"che.integration.azure.devops.scm.api_endpoint\") String azureDevOpsSAASApiEndpoint,\n      @Named(\"che.integration.azure.devops.application_scopes\") String[] scopes,\n      AzureDevOpsApiClient azureDevOpsApiClient,\n      OAuthAPI oAuthAPI) {\n    this.cheApiEndpoint = cheApiEndpoint;\n    this.azureDevOpsSAASApiEndpoint = trimEnd(azureDevOpsSAASApiEndpoint, '/');\n    this.oAuthAPI = oAuthAPI;\n    this.scopes = scopes;\n    this.azureDevOpsApiClient = azureDevOpsApiClient;\n  }\n\n  @Override\n  public PersonalAccessToken refreshPersonalAccessToken(Subject cheSubject, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    return fetchOrRefreshPersonalAccessToken(cheSubject, scmServerUrl, true);\n  }\n\n  @Override\n  public PersonalAccessToken fetchPersonalAccessToken(Subject cheSubject, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    return fetchOrRefreshPersonalAccessToken(cheSubject, scmServerUrl, false);\n  }\n\n  private PersonalAccessToken fetchOrRefreshPersonalAccessToken(\n      Subject cheSubject, String scmServerUrl, boolean forceRefreshToken)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    OAuthToken oAuthToken;\n\n    if (!isValidAzureDevOpsSAASUrl(scmServerUrl)) {\n      LOG.debug(\"not a  valid url {} for current fetcher \", scmServerUrl);\n      return null;\n    }\n\n    try {\n      oAuthToken =\n          forceRefreshToken\n              ? oAuthAPI.refreshToken(AzureDevOps.PROVIDER_NAME)\n              : oAuthAPI.getOrRefreshToken(AzureDevOps.PROVIDER_NAME);\n      String tokenName = NameGenerator.generate(OAUTH_2_PREFIX, 5);\n      String tokenId = NameGenerator.generate(\"id-\", 5);\n      Optional<Pair<Boolean, String>> valid =\n          isValid(\n              new PersonalAccessTokenParams(\n                  scmServerUrl,\n                  OAUTH_PROVIDER_NAME,\n                  tokenName,\n                  tokenId,\n                  oAuthToken.getToken(),\n                  null));\n      if (valid.isEmpty()) {\n        throw buildScmUnauthorizedException(cheSubject);\n      } else if (!valid.get().first) {\n        throw new ScmCommunicationException(\n            \"Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: \"\n                + Arrays.toString(scopes));\n      }\n      return new PersonalAccessToken(\n          scmServerUrl,\n          OAUTH_PROVIDER_NAME,\n          cheSubject.getUserId(),\n          valid.get().second,\n          tokenName,\n          tokenId,\n          oAuthToken.getToken());\n    } catch (UnauthorizedException e) {\n      throw buildScmUnauthorizedException(cheSubject);\n    } catch (NotFoundException nfe) {\n      throw new UnknownScmProviderException(nfe.getMessage(), scmServerUrl);\n    } catch (ServerException | ForbiddenException | BadRequestException | ConflictException e) {\n      LOG.error(e.getMessage());\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  private ScmUnauthorizedException buildScmUnauthorizedException(Subject cheSubject) {\n    return new ScmUnauthorizedException(\n        cheSubject.getUserName()\n            + \" is not authorized in \"\n            + AzureDevOps.PROVIDER_NAME\n            + \" OAuth provider.\",\n        AzureDevOps.PROVIDER_NAME,\n        \"2.0\",\n        getLocalAuthenticateUrl());\n  }\n\n  @Override\n  public Optional<Boolean> isValid(PersonalAccessToken personalAccessToken) {\n    if (!isValidAzureDevOpsSAASUrl(personalAccessToken.getScmProviderUrl())) {\n      LOG.debug(\"not a valid url {} for current fetcher \", personalAccessToken.getScmProviderUrl());\n      return Optional.empty();\n    }\n\n    try {\n      AzureDevOpsUser user;\n      if (personalAccessToken.getScmTokenName() != null\n          && personalAccessToken.getScmTokenName().startsWith(OAUTH_2_PREFIX)) {\n        user = azureDevOpsApiClient.getUserWithOAuthToken(personalAccessToken.getToken());\n      } else {\n        user =\n            azureDevOpsApiClient.getUserWithPAT(\n                personalAccessToken.getToken(), personalAccessToken.getScmOrganization());\n      }\n      return Optional.of(personalAccessToken.getScmUserName().equals(user.getEmailAddress()));\n    } catch (ScmItemNotFoundException\n        | ScmCommunicationException\n        | ScmBadRequestException\n        | ScmUnauthorizedException e) {\n      return Optional.of(Boolean.FALSE);\n    }\n  }\n\n  @Override\n  public Optional<Pair<Boolean, String>> isValid(PersonalAccessTokenParams params) {\n    if (!isValidAzureDevOpsSAASUrl(params.getScmProviderUrl())) {\n      if (OAUTH_PROVIDER_NAME.equals(params.getScmProviderName())) {\n        AzureDevOpsServerApiClient azureDevOpsServerApiClient =\n            new AzureDevOpsServerApiClient(params.getScmProviderUrl(), params.getOrganization());\n        try {\n          AzureDevOpsServerUserProfile user = azureDevOpsServerApiClient.getUser(params.getToken());\n          return Optional.of(Pair.of(Boolean.TRUE, user.getIdentity().getAccountName()));\n        } catch (ScmItemNotFoundException | ScmBadRequestException | ScmCommunicationException e) {\n          return Optional.empty();\n        }\n      } else {\n        LOG.debug(\"not a valid url {} for current fetcher \", params.getScmProviderUrl());\n        return Optional.empty();\n      }\n    }\n\n    try {\n      AzureDevOpsUser user;\n      if (params.getScmTokenName() != null && params.getScmTokenName().startsWith(OAUTH_2_PREFIX)) {\n        user = azureDevOpsApiClient.getUserWithOAuthToken(params.getToken());\n      } else {\n        user = azureDevOpsApiClient.getUserWithPAT(params.getToken(), params.getOrganization());\n      }\n      return Optional.of(Pair.of(Boolean.TRUE, user.getEmailAddress()));\n    } catch (ScmItemNotFoundException\n        | ScmBadRequestException\n        | ScmUnauthorizedException\n        | ScmCommunicationException e) {\n      return Optional.empty();\n    }\n  }\n\n  private String getLocalAuthenticateUrl() {\n    return cheApiEndpoint + getAuthenticateUrlPath(scopes);\n  }\n\n  private Boolean isValidAzureDevOpsSAASUrl(String url) {\n    return azureDevOpsSAASApiEndpoint.equals(trimEnd(url, '/'));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsScmFileResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport static org.eclipse.che.api.factory.server.ApiExceptionMapper.toApiException;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.io.IOException;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.factory.server.ScmFileResolver;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\n\n/**\n * Azure DevOps specific SCM file resolver.\n *\n * @author Anatolii Bazko\n */\npublic class AzureDevOpsScmFileResolver implements ScmFileResolver {\n\n  private final AzureDevOpsURLParser azureDevOpsURLParser;\n  private final URLFetcher urlFetcher;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n\n  @Inject\n  public AzureDevOpsScmFileResolver(\n      AzureDevOpsURLParser azureDevOpsURLParser,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    this.azureDevOpsURLParser = azureDevOpsURLParser;\n    this.urlFetcher = urlFetcher;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n  }\n\n  @Override\n  public boolean accept(@NotNull String repository) {\n    return azureDevOpsURLParser.isValid(repository);\n  }\n\n  @Override\n  public String fileContent(@NotNull String repository, @NotNull String filePath)\n      throws ApiException {\n    final AzureDevOpsUrl azureDevOpsUrl = azureDevOpsURLParser.parse(repository, null);\n    try {\n      return fetchContent(azureDevOpsUrl, filePath, false);\n    } catch (DevfileException exception) {\n      // This catch might mean that the authentication was rejected by user, try to repeat the fetch\n      // without authentication flow.\n      try {\n        return fetchContent(azureDevOpsUrl, filePath, true);\n      } catch (DevfileException devfileException) {\n        throw toApiException(devfileException);\n      }\n    }\n  }\n\n  private String fetchContent(\n      AzureDevOpsUrl azureDevOpsUrl, String filePath, boolean skipAuthentication)\n      throws DevfileException, NotFoundException {\n    try {\n      AzureDevOpsAuthorizingFileContentProvider contentProvider =\n          new AzureDevOpsAuthorizingFileContentProvider(\n              azureDevOpsUrl, urlFetcher, personalAccessTokenManager);\n      return skipAuthentication\n          ? contentProvider.fetchContentWithoutAuthentication(filePath)\n          : contentProvider.fetchContent(filePath);\n    } catch (IOException e) {\n      throw new NotFoundException(e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsServerApiClient.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport static java.net.HttpURLConnection.HTTP_BAD_REQUEST;\nimport static java.net.HttpURLConnection.HTTP_NOT_FOUND;\nimport static java.net.HttpURLConnection.HTTP_NO_CONTENT;\nimport static java.net.HttpURLConnection.HTTP_OK;\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static java.time.Duration.ofSeconds;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.google.common.base.Charsets;\nimport com.google.common.io.CharStreams;\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.UncheckedIOException;\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.time.Duration;\nimport java.util.Base64;\nimport java.util.concurrent.Executors;\nimport java.util.function.Function;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Azure DevOps Server API operations helper. */\npublic class AzureDevOpsServerApiClient {\n\n  private static final Logger LOG = LoggerFactory.getLogger(AzureDevOpsServerApiClient.class);\n\n  private final HttpClient httpClient;\n  private final String azureDevOpsServerApiEndpoint;\n  private final String azureDevOpsServerCollection;\n  private static final Duration DEFAULT_HTTP_TIMEOUT = ofSeconds(10);\n  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();\n\n  public AzureDevOpsServerApiClient(\n      String azureDevOpsServerApiEndpoint, String azureDevOpsServerCollection) {\n    this.azureDevOpsServerApiEndpoint = trimEnd(azureDevOpsServerApiEndpoint, '/');\n    this.azureDevOpsServerCollection = azureDevOpsServerCollection;\n    this.httpClient =\n        HttpClient.newBuilder()\n            .executor(\n                Executors.newCachedThreadPool(\n                    new ThreadFactoryBuilder()\n                        .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n                        .setNameFormat(AzureDevOpsServerApiClient.class.getName() + \"-%d\")\n                        .setDaemon(true)\n                        .build()))\n            .connectTimeout(DEFAULT_HTTP_TIMEOUT)\n            .version(HttpClient.Version.HTTP_1_1)\n            .build();\n  }\n\n  /**\n   * Returns the user associated with the provided PAT.\n   *\n   * @param token personal access token.\n   */\n  public AzureDevOpsServerUserProfile getUser(String token)\n      throws ScmItemNotFoundException, ScmCommunicationException, ScmBadRequestException {\n    final String url =\n        String.format(\n            \"%s/%s/_api/_common/GetUserProfile\",\n            azureDevOpsServerApiEndpoint, azureDevOpsServerCollection);\n    return getUser(url, encodeAuthorizationHeader(token));\n  }\n\n  private static String encodeAuthorizationHeader(String token) {\n    return \"Basic \" + Base64.getEncoder().encodeToString((\":\" + token).getBytes(UTF_8));\n  }\n\n  private AzureDevOpsServerUserProfile getUser(String url, String authorizationHeader)\n      throws ScmItemNotFoundException, ScmCommunicationException, ScmBadRequestException {\n    final HttpRequest userDataRequest =\n        HttpRequest.newBuilder(URI.create(url))\n            .headers(\"Authorization\", authorizationHeader)\n            .timeout(DEFAULT_HTTP_TIMEOUT)\n            .build();\n\n    LOG.trace(\"executeRequest={}\", userDataRequest);\n    return executeRequest(\n        httpClient,\n        userDataRequest,\n        response -> {\n          try {\n            String result =\n                CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n            return OBJECT_MAPPER.readValue(result, AzureDevOpsServerUserProfile.class);\n          } catch (IOException e) {\n            throw new UncheckedIOException(e);\n          }\n        });\n  }\n\n  private <T> T executeRequest(\n      HttpClient httpClient,\n      HttpRequest request,\n      Function<HttpResponse<InputStream>, T> responseConverter)\n      throws ScmBadRequestException, ScmItemNotFoundException, ScmCommunicationException {\n    try {\n      HttpResponse<InputStream> response =\n          httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());\n      LOG.trace(\"executeRequest={} response {}\", request, response.statusCode());\n      if (response.statusCode() == HTTP_OK) {\n        return responseConverter.apply(response);\n      } else if (response.statusCode() == HTTP_NO_CONTENT) {\n        return null;\n      } else {\n        String body = CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n        switch (response.statusCode()) {\n          case HTTP_BAD_REQUEST:\n            throw new ScmBadRequestException(body);\n          case HTTP_NOT_FOUND:\n            throw new ScmItemNotFoundException(body);\n          default:\n            throw new ScmCommunicationException(\n                \"Unexpected status code \" + response.statusCode() + \" \" + response,\n                response.statusCode(),\n                \"azure-devops\");\n        }\n      }\n    } catch (IOException | InterruptedException | UncheckedIOException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsServerUserIdentity.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport com.fasterxml.jackson.annotation.JsonProperty;\n\n/** Azure DevOps Server user's identity. */\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class AzureDevOpsServerUserIdentity {\n  private String accountName;\n  private String mailAddress;\n\n  public String getAccountName() {\n    return accountName;\n  }\n\n  @JsonProperty(\"AccountName\")\n  public void setAccountName(String accountName) {\n    this.accountName = accountName;\n  }\n\n  public String getMailAddress() {\n    return mailAddress;\n  }\n\n  @JsonProperty(\"MailAddress\")\n  public void setMailAddress(String mailAddress) {\n    this.mailAddress = mailAddress;\n  }\n\n  @Override\n  public String toString() {\n    return \"AzureDevOpsServerUserIdentity{\"\n        + \"accountName='\"\n        + accountName\n        + '\\''\n        + \", mailAddress='\"\n        + mailAddress\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsServerUserPreferences.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport com.fasterxml.jackson.annotation.JsonProperty;\n\n/** Azure DevOps Server user's preferences. */\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class AzureDevOpsServerUserPreferences {\n  private String preferredEmail;\n\n  public String getPreferredEmail() {\n    return preferredEmail;\n  }\n\n  @JsonProperty(\"PreferredEmail\")\n  public void setPreferredEmail(String preferredEmail) {\n    this.preferredEmail = preferredEmail;\n  }\n\n  @Override\n  public String toString() {\n    return \"AzureDevOpsServerUserPreferences{\" + \"preferredEmail='\" + preferredEmail + '\\'' + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsServerUserProfile.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\n\n/** Azure DevOps Server user's profile. */\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class AzureDevOpsServerUserProfile {\n  private AzureDevOpsServerUserIdentity identity;\n  private AzureDevOpsServerUserPreferences userPreferences;\n  private String defaultMailAddress;\n\n  public AzureDevOpsServerUserIdentity getIdentity() {\n    return identity;\n  }\n\n  public void setIdentity(AzureDevOpsServerUserIdentity identity) {\n    this.identity = identity;\n  }\n\n  public String getDefaultMailAddress() {\n    return defaultMailAddress;\n  }\n\n  public void setDefaultMailAddress(String defaultMailAddress) {\n    this.defaultMailAddress = defaultMailAddress;\n  }\n\n  public AzureDevOpsServerUserPreferences getUserPreferences() {\n    return userPreferences;\n  }\n\n  public void setUserPreferences(AzureDevOpsServerUserPreferences userPreferences) {\n    this.userPreferences = userPreferences;\n  }\n\n  @Override\n  public String toString() {\n    return \"AzureDevOpsServerUserProfile{\"\n        + \"identity=\"\n        + identity\n        + \", userPreferences=\"\n        + userPreferences\n        + \", defaultMailAddress='\"\n        + defaultMailAddress\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsURLParser.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.regex.Pattern.compile;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.net.URI;\nimport java.util.Optional;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Parser of String Azure DevOps URLs and provide {@link AzureDevOpsUrl} objects.\n *\n * @author Anatolii Bazko\n */\n@Singleton\npublic class AzureDevOpsURLParser {\n\n  private final DevfileFilenamesProvider devfileFilenamesProvider;\n  private final PersonalAccessTokenManager tokenManager;\n  private final String azureDevOpsScmApiEndpointHost;\n\n  /**\n   * Regexp to find repository details (repository name, organization name and branch or tag)\n   * Examples of valid URLs are in the test class.\n   */\n  private final Pattern azureDevOpsPattern;\n\n  private final Pattern azureSSHDevOpsPattern;\n  private final String azureSSHDevOpsPatternTemplate =\n      \"^git@ssh\\\\.%s:v3/(?<organization>.*)/(?<project>.*)/(?<repoName>.*)$\";\n  private final String azureSSHDevOpsServerPatternTemplate =\n      \"^ssh://%s(:\\\\d*)?/(?<organization>.*)/(?<project>.*)/_git/(?<repoName>.*)$\";\n  private final String azureDevOpsPatternTemplate =\n      \"^https?://(?<organizationCanIgnore>[^@]++)?@?%s/(?<organization>[^/]++)/((?<project>[^/]++)/)?_git/\"\n          + \"(?<repoName>[^?]++)\"\n          + \"([?&]path=(?<path>[^&]++))?\"\n          + \"([?&]version=GT(?<tag>[^&]++))?\"\n          + \"([?&]version=GB(?<branch>[^&]++))?\"\n          + \"(.*)\";\n  private static final String PROVIDER_NAME = \"azure-devops\";\n\n  @Inject\n  public AzureDevOpsURLParser(\n      DevfileFilenamesProvider devfileFilenamesProvider,\n      PersonalAccessTokenManager tokenManager,\n      @Named(\"che.integration.azure.devops.scm.api_endpoint\") String azureDevOpsScmApiEndpoint) {\n\n    this.devfileFilenamesProvider = devfileFilenamesProvider;\n    this.tokenManager = tokenManager;\n    this.azureDevOpsScmApiEndpointHost =\n        trimEnd(azureDevOpsScmApiEndpoint, '/').replaceFirst(\"https?://\", \"\");\n    this.azureDevOpsPattern =\n        compile(format(azureDevOpsPatternTemplate, azureDevOpsScmApiEndpointHost));\n    this.azureSSHDevOpsPattern =\n        compile(format(azureSSHDevOpsPatternTemplate, azureDevOpsScmApiEndpointHost));\n  }\n\n  public boolean isValid(@NotNull String url) {\n    String trimmedUrl = trimEnd(url, '/');\n    return azureDevOpsPattern.matcher(trimmedUrl).matches()\n        || azureSSHDevOpsPattern.matcher(trimmedUrl).matches()\n        // Check whether PAT is configured for the Azure Devops Server URL. It is sufficient to\n        // confirm\n        // that the URL is a valid Azure Devops Server URL.\n        || isUserTokenPresent(trimmedUrl);\n  }\n\n  // Try to find the given url in a manually added user namespace token secret.\n  private boolean isUserTokenPresent(String repositoryUrl) {\n    Optional<String> serverUrlOptional = getServerUrl(repositoryUrl);\n    if (serverUrlOptional.isPresent()) {\n      String serverUrl = serverUrlOptional.get();\n      try {\n        PersonalAccessToken accessToken = tokenManager.get(serverUrl);\n        return accessToken.getScmTokenName().equals(PROVIDER_NAME);\n      } catch (ScmConfigurationPersistenceException\n          | ScmCommunicationException\n          | ScmUnauthorizedException\n          | UnknownScmProviderException\n          | UnsatisfiedScmPreconditionException exception) {\n        return false;\n      }\n    }\n    return false;\n  }\n\n  private Optional<String> getServerUrl(String repositoryUrl) {\n    // If the given repository url is an SSH url, generate the base url from the pattern:\n    // https://<hostname extracted from the SSH url>.\n    String substring = null;\n    if (repositoryUrl.startsWith(\"git@ssh.\")) {\n      substring = repositoryUrl.substring(8);\n    } else if (repositoryUrl.startsWith(\"ssh://\")) {\n      substring = repositoryUrl.substring(6);\n    }\n    if (!isNullOrEmpty(substring)) {\n      // Handle IPv6 addresses in SSH URLs (e.g., ssh://[2001:db8::1]:port/...)\n      if (substring.startsWith(\"[\")) {\n        int closingBracket = substring.indexOf(']');\n        if (closingBracket > 0) {\n          return Optional.of(\"https://\" + substring.substring(0, closingBracket + 1));\n        }\n      }\n      return Optional.of(\n          \"https://\"\n              + substring.substring(\n                  0, substring.contains(\":\") ? substring.indexOf(\":\") : substring.indexOf(\"/\")));\n    }\n    // Use URI parsing to properly handle IPv6 addresses\n    try {\n      URI uri = URI.create(repositoryUrl);\n      if (uri.getScheme() != null && uri.getHost() != null) {\n        String authority = uri.getRawAuthority();\n        if (authority == null) {\n          String host = uri.getHost();\n          boolean ipv6 = host != null && host.contains(\":\");\n          String hostForUrl = ipv6 ? \"[\" + host + \"]\" : host;\n          int port = uri.getPort();\n          authority = port == -1 ? hostForUrl : hostForUrl + \":\" + port;\n        }\n\n        if (authority != null) {\n          String serverUrl = uri.getScheme() + \"://\" + authority;\n          // Remove path and query from the server URL\n          int authorityIdx = repositoryUrl.indexOf(authority);\n          if (authorityIdx >= 0) {\n            int pathIndex = authorityIdx + authority.length();\n            if (pathIndex < repositoryUrl.length() && repositoryUrl.charAt(pathIndex) == '/') {\n              return Optional.of(serverUrl);\n            }\n          }\n        }\n      }\n    } catch (IllegalArgumentException e) {\n      // Fall through to old logic if URI parsing fails\n    }\n    // Otherwise, extract the base url from the given repository url by cutting the url after the\n    // first slash.\n    Matcher serverUrlMatcher = compile(\"[^/|:]/\").matcher(repositoryUrl);\n    if (serverUrlMatcher.find()) {\n      return Optional.of(\n          repositoryUrl.substring(0, repositoryUrl.indexOf(serverUrlMatcher.group()) + 1));\n    }\n    return Optional.empty();\n  }\n\n  private Optional<Matcher> getPatternMatcherByUrl(String url) {\n    URI uri = URI.create(url);\n    String host = uri.getHost();\n    // Handle IPv6 addresses: escape brackets for regex\n    final String hostForRegex;\n    if (host != null && host.startsWith(\"[\") && host.endsWith(\"]\")) {\n      // IPv6 address - escape the brackets\n      hostForRegex = \"\\\\[\" + Pattern.quote(host.substring(1, host.length() - 1)) + \"\\\\]\";\n    } else if (host != null) {\n      // Regular hostname - escape special regex characters\n      hostForRegex = Pattern.quote(host);\n    } else {\n      hostForRegex = \"\";\n    }\n    Matcher matcher = compile(format(azureDevOpsPatternTemplate, hostForRegex)).matcher(url);\n    if (matcher.matches()) {\n      return Optional.of(matcher);\n    } else {\n      matcher = compile(format(azureSSHDevOpsPatternTemplate, hostForRegex)).matcher(url);\n      if (matcher.matches()) {\n        return Optional.of(matcher);\n      } else {\n        matcher = compile(format(azureSSHDevOpsServerPatternTemplate, hostForRegex)).matcher(url);\n      }\n      return matcher.matches() ? Optional.of(matcher) : Optional.empty();\n    }\n  }\n\n  private IllegalArgumentException buildIllegalArgumentException(String url) {\n    return new IllegalArgumentException(\n        format(\"The given url %s is not a valid Azure DevOps URL. \", url));\n  }\n\n  public AzureDevOpsUrl parse(String url, @Nullable String revision) {\n    Matcher matcher = azureDevOpsPattern.matcher(url);\n    boolean isHTTPSUrl = matcher.matches();\n    if (!isHTTPSUrl) {\n      matcher = azureSSHDevOpsPattern.matcher(url);\n      if (!matcher.matches()) {\n        matcher = getPatternMatcherByUrl(url).orElseThrow(() -> buildIllegalArgumentException(url));\n        isHTTPSUrl = url.startsWith(\"http\");\n      }\n    }\n    String serverUrl = getServerUrl(url).orElseThrow(() -> buildIllegalArgumentException(url));\n    String repoName = matcher.group(\"repoName\");\n    String project = matcher.group(\"project\");\n    if (project == null) {\n      // if project is not specified, repo name must be equal to project name\n      // https://dev.azure.com/<MyOrg>/<MyRepo>/_git/<MyRepo> ==\n      // https://dev.azure.com/<MyOrg>/_git/<MyRepo>\n      project = repoName;\n    }\n\n    String branchFromUrl = null;\n    String tag = null;\n\n    String organization = matcher.group(\"organization\");\n    String urlToReturn = url;\n    if (isHTTPSUrl) {\n      branchFromUrl = matcher.group(\"branch\");\n      tag = matcher.group(\"tag\");\n      // The url might have the following formats:\n      // - https://<organization>@<host>/<organization>/<project>/_git/<repoName>\n      // - https://<credentials>@<host>/<organization>/<project>/_git/<repoName>\n      // For the first case we need to remove the `organization` from the url to distinguish it from\n      // `credentials`\n      // TODO: return empty credentials like the BitBucketUrl\n      String organizationCanIgnore = matcher.group(\"organizationCanIgnore\");\n      if (!isNullOrEmpty(organization) && organization.equals(organizationCanIgnore)) {\n        urlToReturn = urlToReturn.replace(organizationCanIgnore + \"@\", \"\");\n        serverUrl = serverUrl.replace(organizationCanIgnore + \"@\", \"\");\n      }\n    }\n\n    return new AzureDevOpsUrl()\n        .withHostName(\n            url.startsWith(\"git@ssh.\") ? azureDevOpsScmApiEndpointHost : URI.create(url).getHost())\n        .setIsHTTPSUrl(isHTTPSUrl)\n        .withProject(project)\n        .withRepository(repoName)\n        .withOrganization(organization)\n        .withBranch(isNullOrEmpty(branchFromUrl) ? revision : branchFromUrl)\n        .withTag(tag)\n        .withDevfileFilenames(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .withServerUrl(serverUrl)\n        .withUrl(urlToReturn);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsUrl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.StringJoiner;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.factory.server.urlfactory.DefaultFactoryUrl;\n\n/**\n * Representation of Azure DevOps URL, allowing to get details from it.\n *\n * <p>https://learn.microsoft.com/en-us/rest/api/azure/devops/git/items/get?view=azure-devops-rest-7.0&tabs=HTTP\n * Repository should allow OAUth requests TODO doc\n *\n * @author Anatolii Bazko\n */\npublic class AzureDevOpsUrl extends DefaultFactoryUrl {\n\n  private boolean isHTTPSUrl;\n  private String hostName;\n\n  private String repository;\n\n  private String project;\n\n  private String organization;\n\n  private String branch;\n\n  private String tag;\n\n  private String serverUrl;\n\n  private final List<String> devfileFilenames = new ArrayList<>();\n\n  protected AzureDevOpsUrl() {}\n\n  @Override\n  public String getProviderName() {\n    return AzureDevOps.PROVIDER_NAME;\n  }\n\n  public String getProject() {\n    return project;\n  }\n\n  public AzureDevOpsUrl withProject(String project) {\n    this.project = project;\n    return this;\n  }\n\n  public String getRepository() {\n    return this.repository;\n  }\n\n  public AzureDevOpsUrl withRepository(String repository) {\n    this.repository = repository;\n    return this;\n  }\n\n  public String getOrganization() {\n    return organization;\n  }\n\n  public AzureDevOpsUrl withOrganization(String organization) {\n    this.organization = organization;\n    return this;\n  }\n\n  public String getTag() {\n    return tag;\n  }\n\n  public AzureDevOpsUrl withTag(String tag) {\n    this.tag = tag;\n    return this;\n  }\n\n  @Override\n  public String getBranch() {\n    return branch;\n  }\n\n  public AzureDevOpsUrl withBranch(String branch) {\n    this.branch = branch;\n    return this;\n  }\n\n  @Override\n  public String getProviderUrl() {\n    return isNullOrEmpty(serverUrl) ? \"https://\" + hostName : serverUrl;\n  }\n\n  protected AzureDevOpsUrl withDevfileFilenames(List<String> devfileFilenames) {\n    this.devfileFilenames.addAll(devfileFilenames);\n    return this;\n  }\n\n  public AzureDevOpsUrl withServerUrl(String serverUrl) {\n    this.serverUrl = serverUrl;\n    return this;\n  }\n\n  @Override\n  public void setDevfileFilename(String devfileName) {\n    this.devfileFilenames.clear();\n    this.devfileFilenames.add(devfileName);\n  }\n\n  @Override\n  public List<DevfileLocation> devfileFileLocations() {\n    return devfileFilenames.stream().map(this::createDevfileLocation).collect(Collectors.toList());\n  }\n\n  private DevfileLocation createDevfileLocation(String devfileFilename) {\n    return new DevfileLocation() {\n      @Override\n      public Optional<String> filename() {\n        return Optional.of(devfileFilename);\n      }\n\n      @Override\n      public String location() {\n        return rawFileLocation(devfileFilename);\n      }\n    };\n  }\n\n  public String rawFileLocation(String fileName) {\n    return getRepoPathJoiner()\n        .add(\"_apis\")\n        .add(\"git\")\n        .add(\"repositories\")\n        .add(repository)\n        .add(\n            \"items\"\n                + String.format(\"?path=/%s\", fileName)\n                + (!isNullOrEmpty(branch)\n                    ? String.format(\"&versionType=branch&version=%s\", branch)\n                    : \"\")\n                + (!isNullOrEmpty(tag) ? String.format(\"&versionType=tag&version=%s\", tag) : \"\")\n                + String.format(\"&api-version=%s\", AzureDevOps.API_VERSION))\n        .toString();\n  }\n\n  public String getRepositoryLocation() {\n    if (isHTTPSUrl) {\n      return getRepoPathJoiner().add(\"_git\").add(repository).toString();\n    }\n    if (\"dev.azure.com\".equals(hostName)) {\n      return \"git@ssh.\" + hostName + \":v3/\" + organization + \"/\" + project + \"/\" + repository;\n    } else {\n      return \"ssh://\" + hostName + \":22/\" + organization + \"/\" + project + \"/_git/\" + repository;\n    }\n  }\n\n  private StringJoiner getRepoPathJoiner() {\n    return new StringJoiner(\"/\").add(getProviderUrl()).add(organization).add(project);\n  }\n\n  @Override\n  public String getHostName() {\n    return hostName;\n  }\n\n  public AzureDevOpsUrl setIsHTTPSUrl(boolean isHTTPSUrl) {\n    this.isHTTPSUrl = isHTTPSUrl;\n    return this;\n  }\n\n  public AzureDevOpsUrl withHostName(String hostName) {\n    this.hostName = hostName;\n    return this;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsUser.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\n\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\n\n/**\n * Azure DevOps user's profile. See more details at:\n * https://learn.microsoft.com/en-us/rest/api/azure/devops/profile/profiles/get?view=azure-devops-rest-7.0&tabs=HTTP#profile\n */\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class AzureDevOpsUser {\n  private String displayName;\n  private String emailAddress;\n\n  private String id;\n\n  public String getDisplayName() {\n    return displayName;\n  }\n\n  public void setDisplayName(String displayName) {\n    this.displayName = displayName;\n  }\n\n  public String getEmailAddress() {\n    return emailAddress;\n  }\n\n  public void setEmailAddress(String emailAddress) {\n    this.emailAddress = emailAddress;\n  }\n\n  public String getId() {\n    return id;\n  }\n\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  @Override\n  public String toString() {\n    return \"AzureDevOpsUser{\"\n        + \"displayName='\"\n        + displayName\n        + '\\''\n        + \", emailAddress='\"\n        + emailAddress\n        + '\\''\n        + \", id='\"\n        + id\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsUserDataFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.api.factory.server.azure.devops.AzureDevOps.SAAS_ENDPOINT;\nimport static org.eclipse.che.api.factory.server.azure.devops.AzureDevOps.getAuthenticateUrlPath;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.factory.server.scm.AbstractGitUserDataFetcher;\nimport org.eclipse.che.api.factory.server.scm.GitUserData;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\n\n/**\n * Azure DevOps user data fetcher.\n *\n * @author Anatolii Bazko\n */\npublic class AzureDevOpsUserDataFetcher extends AbstractGitUserDataFetcher {\n  private final String cheApiEndpoint;\n  private final String[] scopes;\n  private final AzureDevOpsApiClient azureDevOpsApiClient;\n  private static final String NO_USERNAME_AND_EMAIL_ERROR_MESSAGE =\n      \"User name and/or email is not found in the azure devops profile.\";\n\n  @Inject\n  public AzureDevOpsUserDataFetcher(\n      PersonalAccessTokenManager personalAccessTokenManager,\n      AzureDevOpsApiClient azureDevOpsApiClient,\n      @Named(\"che.api\") String cheApiEndpoint,\n      @Named(\"che.integration.azure.devops.scm.api_endpoint\") String azureDevOpsScmApiEndpoint,\n      @Named(\"che.integration.azure.devops.application_scopes\") String[] scopes) {\n    super(AzureDevOps.PROVIDER_NAME, azureDevOpsScmApiEndpoint, personalAccessTokenManager);\n    this.scopes = scopes;\n    this.cheApiEndpoint = cheApiEndpoint;\n    this.azureDevOpsApiClient = azureDevOpsApiClient;\n  }\n\n  @Override\n  protected GitUserData fetchGitUserDataWithOAuthToken(String token)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    AzureDevOpsUser user = azureDevOpsApiClient.getUserWithOAuthToken(token);\n    return new GitUserData(user.getDisplayName(), user.getEmailAddress());\n  }\n\n  @Override\n  protected GitUserData fetchGitUserDataWithPersonalAccessToken(\n      PersonalAccessToken personalAccessToken)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    if (SAAS_ENDPOINT.equals(personalAccessToken.getScmProviderUrl())) {\n      AzureDevOpsUser user =\n          azureDevOpsApiClient.getUserWithPAT(\n              personalAccessToken.getToken(), personalAccessToken.getScmOrganization());\n      if (isNullOrEmpty(user.getDisplayName()) || isNullOrEmpty(user.getEmailAddress())) {\n        throw new ScmItemNotFoundException(NO_USERNAME_AND_EMAIL_ERROR_MESSAGE);\n      } else {\n        return new GitUserData(user.getDisplayName(), user.getEmailAddress());\n      }\n    } else {\n      AzureDevOpsServerApiClient apiClient =\n          new AzureDevOpsServerApiClient(\n              personalAccessToken.getScmProviderUrl(), personalAccessToken.getScmOrganization());\n      AzureDevOpsServerUserProfile user = apiClient.getUser(personalAccessToken.getToken());\n      String defaultMailAddress = user.getDefaultMailAddress();\n      String identityMailAddress = user.getIdentity().getMailAddress();\n      String preferredEmail = user.getUserPreferences().getPreferredEmail();\n      String email =\n          isNullOrEmpty(defaultMailAddress)\n              ? (isNullOrEmpty(identityMailAddress) ? preferredEmail : identityMailAddress)\n              : defaultMailAddress;\n      String name = user.getIdentity().getAccountName();\n      if (isNullOrEmpty(name) || isNullOrEmpty(email)) {\n        throw new ScmItemNotFoundException(NO_USERNAME_AND_EMAIL_ERROR_MESSAGE);\n      } else {\n        return new GitUserData(name, email);\n      }\n    }\n  }\n\n  protected String getLocalAuthenticateUrl() {\n    return cheApiEndpoint + getAuthenticateUrlPath(scopes);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/test/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsPersonalAccessTokenFetcherTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.equalTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static java.net.HttpURLConnection.HTTP_FORBIDDEN;\nimport static java.net.HttpURLConnection.HTTP_MOVED_TEMP;\nimport static org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher.OAUTH_2_PREFIX;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.*;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.common.net.HttpHeaders;\nimport java.util.Base64;\nimport java.util.Collections;\nimport java.util.Optional;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenParams;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Anatalii Bazko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class AzureDevOpsPersonalAccessTokenFetcherTest {\n\n  @Mock private AzureDevOpsApiClient azureDevOpsApiClient;\n  @Mock private OAuthAPI oAuthAPI;\n  @Mock private OAuthToken oAuthToken;\n  @Mock private AzureDevOpsUser azureDevOpsUser;\n\n  private final String azureDevOpsToken = \"token\";\n\n  final int httpPort = 3301;\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  final String azureOauthToken = \"token\";\n  private AzureDevOpsPersonalAccessTokenFetcher personalAccessTokenFetcher;\n\n  @BeforeMethod\n  protected void start() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).port(httpPort));\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", httpPort);\n    wireMock = new WireMock(\"localhost\", httpPort);\n    personalAccessTokenFetcher =\n        new AzureDevOpsPersonalAccessTokenFetcher(\n            \"localhost\",\n            \"http://localhost:3301\",\n            new String[] {},\n            new AzureDevOpsApiClient(wireMockServer.url(\"/\")),\n            oAuthAPI);\n  }\n\n  @AfterMethod\n  void stop() {\n    wireMockServer.stop();\n  }\n\n  @Test\n  public void fetchPersonalAccessTokenShouldReturnNullIfScmServerUrlIsNotAzureDevOps()\n      throws Exception {\n    PersonalAccessToken personalAccessToken =\n        personalAccessTokenFetcher.fetchPersonalAccessToken(\n            mock(Subject.class), \"https://eclipse.org\");\n\n    assertNull(personalAccessToken);\n  }\n\n  @Test\n  public void fetchPersonalAccessTokenShouldReturnToken() throws Exception {\n    personalAccessTokenFetcher =\n        new AzureDevOpsPersonalAccessTokenFetcher(\n            \"localhost\", \"https://dev.azure.com\", new String[] {}, azureDevOpsApiClient, oAuthAPI);\n    when(oAuthAPI.getOrRefreshToken(AzureDevOps.PROVIDER_NAME)).thenReturn(oAuthToken);\n    when(azureDevOpsApiClient.getUserWithOAuthToken(any())).thenReturn(azureDevOpsUser);\n    when(azureDevOpsUser.getEmailAddress()).thenReturn(\"user-email\");\n\n    PersonalAccessToken personalAccessToken =\n        personalAccessTokenFetcher.fetchPersonalAccessToken(\n            mock(Subject.class), \"https://dev.azure.com/\");\n\n    assertNotNull(personalAccessToken);\n  }\n\n  @Test(\n      expectedExceptions = ScmUnauthorizedException.class,\n      expectedExceptionsMessageRegExp =\n          \"Username is not authorized in azure-devops OAuth provider.\")\n  public void shouldThrowUnauthorizedExceptionIfTokenIsNotValid() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    OAuthToken oAuthToken = newDto(OAuthToken.class).withToken(azureOauthToken).withScope(\"\");\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenReturn(oAuthToken);\n    stubFor(\n        get(urlEqualTo(\"/_apis/profile/profiles/me?api-version=7.0\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer \" + azureOauthToken))\n            .willReturn(aResponse().withStatus(HTTP_FORBIDDEN)));\n\n    personalAccessTokenFetcher.fetchPersonalAccessToken(subject, wireMockServer.url(\"/\"));\n  }\n\n  @Test(expectedExceptions = ScmUnauthorizedException.class)\n  public void shouldThrowUnauthorizedExceptionOnRedirectResponse() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    OAuthToken oAuthToken = newDto(OAuthToken.class).withToken(azureOauthToken).withScope(\"\");\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenReturn(oAuthToken);\n    stubFor(\n        get(urlEqualTo(\"/_apis/profile/profiles/me?api-version=7.0\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer \" + azureOauthToken))\n            .willReturn(aResponse().withStatus(HTTP_MOVED_TEMP)));\n\n    personalAccessTokenFetcher.fetchPersonalAccessToken(subject, wireMockServer.url(\"/\"));\n  }\n\n  @Test\n  public void shouldValidateSAASPersonalAccessToken() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/organization/_apis/profile/profiles/me?api-version=7.0\"))\n            .withHeader(\n                HttpHeaders.AUTHORIZATION,\n                equalTo(\n                    \"Basic \"\n                        + Base64.getEncoder().encodeToString((\":\" + azureDevOpsToken).getBytes())))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"azure-devops/rest/user/response.json\")));\n\n    PersonalAccessTokenParams params =\n        new PersonalAccessTokenParams(\n            wireMockServer.url(\"/\"),\n            \"azure-devops\",\n            \"token-name\",\n            \"tid-23434\",\n            azureDevOpsToken,\n            \"organization\");\n\n    Optional<Pair<Boolean, String>> valid = personalAccessTokenFetcher.isValid(params);\n    assertTrue(valid.isPresent());\n    assertTrue(valid.get().first);\n  }\n\n  @Test\n  public void shouldNotValidateSAASPersonalAccessToken() throws Exception {\n    PersonalAccessTokenParams params =\n        new PersonalAccessTokenParams(\n            wireMockServer.url(\"/\"),\n            \"azure-devops\",\n            \"token-name\",\n            \"tid-23434\",\n            azureDevOpsToken,\n            \"invalid organization\");\n\n    Optional<Pair<Boolean, String>> valid = personalAccessTokenFetcher.isValid(params);\n    assertTrue(valid.isEmpty());\n  }\n\n  @Test\n  public void shouldValidateServerPersonalAccessToken() throws Exception {\n    personalAccessTokenFetcher =\n        new AzureDevOpsPersonalAccessTokenFetcher(\n            \"localhost\",\n            \"https://dev.azure-server.com\",\n            new String[] {},\n            new AzureDevOpsApiClient(wireMockServer.url(\"/\")),\n            oAuthAPI);\n    stubFor(\n        get(urlEqualTo(\"/organization/_api/_common/GetUserProfile\"))\n            .withHeader(\n                HttpHeaders.AUTHORIZATION,\n                equalTo(\n                    \"Basic \"\n                        + Base64.getEncoder().encodeToString((\":\" + azureDevOpsToken).getBytes())))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"azure-devops-server/rest/user/response.json\")));\n\n    PersonalAccessTokenParams params =\n        new PersonalAccessTokenParams(\n            wireMockServer.url(\"/\"),\n            \"azure-devops\",\n            \"token-name\",\n            \"tid-23434\",\n            azureDevOpsToken,\n            \"organization\");\n\n    Optional<Pair<Boolean, String>> valid = personalAccessTokenFetcher.isValid(params);\n    assertTrue(valid.isPresent());\n    assertTrue(valid.get().first);\n  }\n\n  @Test\n  public void shouldValidateOauthToken() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/_apis/profile/profiles/me?api-version=7.0\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer \" + azureDevOpsToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"azure-devops/rest/user/response.json\")));\n\n    PersonalAccessTokenParams params =\n        new PersonalAccessTokenParams(\n            wireMockServer.url(\"/\"),\n            \"dev-azure\",\n            OAUTH_2_PREFIX + \"-token-name\",\n            \"tid-23434\",\n            azureDevOpsToken,\n            \"organization\");\n\n    Optional<Pair<Boolean, String>> valid = personalAccessTokenFetcher.isValid(params);\n    assertTrue(valid.isPresent());\n    assertTrue(valid.get().first);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/test/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsURLParserTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport static org.mockito.Mockito.mock;\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.Optional;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Anatalii Bazko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class AzureDevOpsURLParserTest {\n\n  private AzureDevOpsURLParser azureDevOpsURLParser;\n\n  @BeforeMethod\n  protected void start() {\n    azureDevOpsURLParser =\n        new AzureDevOpsURLParser(\n            mock(DevfileFilenamesProvider.class),\n            mock(PersonalAccessTokenManager.class),\n            \"https://dev.azure.com/\");\n  }\n\n  @Test(expectedExceptions = IllegalArgumentException.class)\n  public void testParseInvalidUrl() {\n    azureDevOpsURLParser.parse(\"http://www.eclipse.org\", null);\n  }\n\n  @Test\n  public void shouldParseWithBranch() {\n    AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser.parse(\"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo\", \"branch\");\n    assertEquals(azureDevOpsUrl.getBranch(), \"branch\");\n  }\n\n  @Test\n  public void shouldParseWithUrlBranch() {\n    AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser.parse(\n            \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?version=GBmain\", \"branch\");\n    assertEquals(azureDevOpsUrl.getBranch(), \"main\");\n  }\n\n  @Test\n  public void shouldParseServerUrlWithIpv6Host() {\n    // given\n    azureDevOpsURLParser =\n        new AzureDevOpsURLParser(\n            mock(DevfileFilenamesProvider.class),\n            mock(PersonalAccessTokenManager.class),\n            \"https://[2001:db8::1]/\");\n\n    // when\n    AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser.parse(\"https://[2001:db8::1]/MyOrg/MyProject/_git/MyRepo\", null);\n\n    // then\n    assertEquals(azureDevOpsUrl.getOrganization(), \"MyOrg\");\n    assertEquals(azureDevOpsUrl.getProject(), \"MyProject\");\n    assertEquals(azureDevOpsUrl.getRepository(), \"MyRepo\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithBranch() {\n    // given\n    azureDevOpsURLParser =\n        new AzureDevOpsURLParser(\n            mock(DevfileFilenamesProvider.class),\n            mock(PersonalAccessTokenManager.class),\n            \"https://[2001:db8::1]/\");\n\n    // when\n    AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser.parse(\n            \"https://[2001:db8::1]/MyOrg/MyProject/_git/MyRepo?version=GBfeature-branch\", null);\n\n    // then\n    assertEquals(azureDevOpsUrl.getOrganization(), \"MyOrg\");\n    assertEquals(azureDevOpsUrl.getProject(), \"MyProject\");\n    assertEquals(azureDevOpsUrl.getRepository(), \"MyRepo\");\n    assertEquals(azureDevOpsUrl.getBranch(), \"feature-branch\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithTag() {\n    // given\n    azureDevOpsURLParser =\n        new AzureDevOpsURLParser(\n            mock(DevfileFilenamesProvider.class),\n            mock(PersonalAccessTokenManager.class),\n            \"https://[2001:db8::1]/\");\n\n    // when\n    AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser.parse(\n            \"https://[2001:db8::1]/MyOrg/MyProject/_git/MyRepo?version=GTv1.0\", null);\n\n    // then\n    assertEquals(azureDevOpsUrl.getOrganization(), \"MyOrg\");\n    assertEquals(azureDevOpsUrl.getProject(), \"MyProject\");\n    assertEquals(azureDevOpsUrl.getRepository(), \"MyRepo\");\n    assertEquals(azureDevOpsUrl.getTag(), \"v1.0\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithRevisionParam() {\n    // given\n    azureDevOpsURLParser =\n        new AzureDevOpsURLParser(\n            mock(DevfileFilenamesProvider.class),\n            mock(PersonalAccessTokenManager.class),\n            \"https://[2001:db8::1]/\");\n\n    // when\n    AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser.parse(\n            \"https://[2001:db8::1]/MyOrg/MyProject/_git/MyRepo\", \"my-branch\");\n\n    // then\n    assertEquals(azureDevOpsUrl.getOrganization(), \"MyOrg\");\n    assertEquals(azureDevOpsUrl.getProject(), \"MyProject\");\n    assertEquals(azureDevOpsUrl.getRepository(), \"MyRepo\");\n    assertEquals(azureDevOpsUrl.getBranch(), \"my-branch\");\n  }\n\n  @Test\n  public void shouldParseIpv6LoopbackAddress() {\n    // given\n    azureDevOpsURLParser =\n        new AzureDevOpsURLParser(\n            mock(DevfileFilenamesProvider.class),\n            mock(PersonalAccessTokenManager.class),\n            \"https://[::1]/\");\n\n    // when\n    AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser.parse(\"https://[::1]/MyOrg/MyProject/_git/MyRepo\", null);\n\n    // then\n    assertEquals(azureDevOpsUrl.getOrganization(), \"MyOrg\");\n    assertEquals(azureDevOpsUrl.getProject(), \"MyProject\");\n    assertEquals(azureDevOpsUrl.getRepository(), \"MyRepo\");\n  }\n\n  @Test\n  public void shouldParseIpv6FullFormAddress() {\n    // given\n    azureDevOpsURLParser =\n        new AzureDevOpsURLParser(\n            mock(DevfileFilenamesProvider.class),\n            mock(PersonalAccessTokenManager.class),\n            \"https://[2001:0db8:0000:0000:0000:0000:0000:0001]/\");\n\n    // when\n    AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser.parse(\n            \"https://[2001:0db8:0000:0000:0000:0000:0000:0001]/MyOrg/MyProject/_git/MyRepo\", null);\n\n    // then\n    assertEquals(azureDevOpsUrl.getOrganization(), \"MyOrg\");\n    assertEquals(azureDevOpsUrl.getProject(), \"MyProject\");\n    assertEquals(azureDevOpsUrl.getRepository(), \"MyRepo\");\n  }\n\n  @Test\n  public void shouldParseIpv6WithCredentials() {\n    // given\n    azureDevOpsURLParser =\n        new AzureDevOpsURLParser(\n            mock(DevfileFilenamesProvider.class),\n            mock(PersonalAccessTokenManager.class),\n            \"https://[2001:db8::1]/\");\n\n    // when\n    AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser.parse(\n            \"https://user:pwd@[2001:db8::1]/MyOrg/MyProject/_git/MyRepo\", null);\n\n    // then\n    assertEquals(azureDevOpsUrl.getOrganization(), \"MyOrg\");\n    assertEquals(azureDevOpsUrl.getProject(), \"MyProject\");\n    assertEquals(azureDevOpsUrl.getRepository(), \"MyRepo\");\n    assertEquals(azureDevOpsUrl.getCredentials(), Optional.of(\"user:pwd\"));\n  }\n\n  @Test\n  public void shouldParseIpv6UrlViaDynamicPatternMatching() {\n    // The parser is configured for dev.azure.com, but getPatternMatcherByUrl() dynamically\n    // creates a pattern from the URL itself, so IPv6 URLs can be parsed even when the\n    // constructor was configured with a different host.\n    AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser.parse(\"https://[2001:db8::1]/MyOrg/MyProject/_git/MyRepo\", null);\n\n    assertEquals(azureDevOpsUrl.getOrganization(), \"MyOrg\");\n    assertEquals(azureDevOpsUrl.getProject(), \"MyProject\");\n    assertEquals(azureDevOpsUrl.getRepository(), \"MyRepo\");\n  }\n\n  @Test(dataProvider = \"parsing\")\n  public void testParse(\n      String url,\n      String organization,\n      String project,\n      String repository,\n      String branch,\n      String tag) {\n    AzureDevOpsUrl azureDevOpsUrl = azureDevOpsURLParser.parse(url, null);\n\n    assertEquals(azureDevOpsUrl.getOrganization(), organization);\n    assertEquals(azureDevOpsUrl.getProject(), project);\n    assertEquals(azureDevOpsUrl.getRepository(), repository);\n    assertEquals(azureDevOpsUrl.getBranch(), branch);\n    assertEquals(azureDevOpsUrl.getTag(), tag);\n  }\n\n  @Test(dataProvider = \"parsingServer\")\n  public void testParseServer(\n      String url,\n      String organization,\n      String project,\n      String repository,\n      String branch,\n      String tag) {\n    AzureDevOpsUrl azureDevOpsUrl = azureDevOpsURLParser.parse(url, null);\n\n    assertEquals(azureDevOpsUrl.getOrganization(), organization);\n    assertEquals(azureDevOpsUrl.getProject(), project);\n    assertEquals(azureDevOpsUrl.getRepository(), repository);\n    assertEquals(azureDevOpsUrl.getBranch(), branch);\n    assertEquals(azureDevOpsUrl.getTag(), tag);\n  }\n\n  @DataProvider(name = \"parsing\")\n  public Object[][] expectedParsing() {\n    return new Object[][] {\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        null,\n        null\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo.git\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo.git\",\n        null,\n        null\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo.dot.git\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo.dot.git\",\n        null,\n        null\n      },\n      {\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        null,\n        null\n      },\n      {\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo-with-hypen\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo-with-hypen\",\n        null,\n        null\n      },\n      {\"https://dev.azure.com/MyOrg/MyProject/_git/-\", \"MyOrg\", \"MyProject\", \"-\", null, null},\n      {\n        \"https://dev.azure.com/MyOrg/MyProject/_git/-j.git\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"-j.git\",\n        null,\n        null\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GBmain&_a=contents\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        \"main\",\n        null\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        null,\n        null\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo.git\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo.git\",\n        null,\n        null\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo.dot.git\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo.dot.git\",\n        null,\n        null\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        null,\n        null\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo-with-hypen\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo-with-hypen\",\n        null,\n        null\n      },\n      {\"git@ssh.dev.azure.com:v3/MyOrg/MyProject/-\", \"MyOrg\", \"MyProject\", \"-\", null, null},\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/-j.git\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"-j.git\",\n        null,\n        null\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GBmain\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        \"main\",\n        null\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GTMyTag&_a=contents\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        null,\n        \"MyTag\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GTMyTag\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        null,\n        \"MyTag\"\n      },\n      {\"https://MyOrg@dev.azure.com/MyOrg/_git/MyRepo\", \"MyOrg\", \"MyRepo\", \"MyRepo\", null, null},\n    };\n  }\n\n  @DataProvider(name = \"parsingServer\")\n  public Object[][] expectedServerParsing() {\n    return new Object[][] {\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        null,\n        null\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo.git\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo.git\",\n        null,\n        null\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo.dot.git\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo.dot.git\",\n        null,\n        null\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo-with-hypen\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo-with-hypen\",\n        null,\n        null\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/-\", \"MyOrg\", \"MyProject\", \"-\", null, null\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/-j.git\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"-j.git\",\n        null,\n        null\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GBmain&_a=contents\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        \"main\",\n        null\n      },\n      {\n        \"ssh://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        null,\n        null\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        null,\n        null\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo.git\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo.git\",\n        null,\n        null\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo.dot.git\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo.dot.git\",\n        null,\n        null\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        null,\n        null\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo-with-hypen\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo-with-hypen\",\n        null,\n        null\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/-\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"-\",\n        null,\n        null\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/-j.git\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"-j.git\",\n        null,\n        null\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GBmain\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        \"main\",\n        null\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GTMyTag&_a=contents\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        null,\n        \"MyTag\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GTMyTag\",\n        \"MyOrg\",\n        \"MyProject\",\n        \"MyRepo\",\n        null,\n        \"MyTag\"\n      },\n      {\"https://dev.azure-server.com/MyOrg/_git/MyRepo\", \"MyOrg\", \"MyRepo\", \"MyRepo\", null, null},\n    };\n  }\n\n  @Test(dataProvider = \"url\")\n  public void testCredentials(String url, String organization, Optional<String> credentials) {\n    AzureDevOpsUrl azureDevOpsUrl = azureDevOpsURLParser.parse(url, null);\n\n    assertEquals(azureDevOpsUrl.getOrganization(), organization);\n    assertEquals(azureDevOpsUrl.getCredentials(), credentials);\n  }\n\n  @DataProvider(name = \"url\")\n  public Object[][] url() {\n    return new Object[][] {\n      {\"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo\", \"MyOrg\", Optional.empty()},\n      {\n        \"https://user:pwd@dev.azure.com/MyOrg/MyProject/_git/MyRepo\",\n        \"MyOrg\",\n        Optional.of(\"user:pwd\")\n      },\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/test/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsURLTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.azure.devops;\n\nimport static java.lang.String.format;\nimport static org.mockito.Mockito.mock;\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.Arrays;\nimport java.util.Iterator;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class AzureDevOpsURLTest {\n  private AzureDevOpsURLParser azureDevOpsURLParser;\n\n  @BeforeMethod\n  protected void init() {\n    azureDevOpsURLParser =\n        new AzureDevOpsURLParser(\n            mock(DevfileFilenamesProvider.class),\n            mock(PersonalAccessTokenManager.class),\n            \"https://dev.azure.com/\");\n  }\n\n  @Test(dataProvider = \"urlsProvider\")\n  public void checkDevfileLocation(String repoUrl, String fileUrl) {\n\n    AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser\n            .parse(repoUrl, null)\n            .withDevfileFilenames(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n    assertEquals(azureDevOpsUrl.devfileFileLocations().size(), 2);\n    Iterator<RemoteFactoryUrl.DevfileLocation> iterator =\n        azureDevOpsUrl.devfileFileLocations().iterator();\n    String location = iterator.next().location();\n    assertEquals(location, format(fileUrl, \"devfile.yaml\"));\n    assertEquals(location, format(fileUrl, \"foo.bar\"));\n  }\n\n  @Test(dataProvider = \"urlsProviderServer\")\n  public void checkDevfileLocationServer(String repoUrl, String fileUrl) {\n\n    AzureDevOpsUrl azureDevOpsUrl =\n        azureDevOpsURLParser\n            .parse(repoUrl, null)\n            .withDevfileFilenames(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n    assertEquals(azureDevOpsUrl.devfileFileLocations().size(), 2);\n    Iterator<RemoteFactoryUrl.DevfileLocation> iterator =\n        azureDevOpsUrl.devfileFileLocations().iterator();\n    String location = iterator.next().location();\n    assertEquals(location, format(fileUrl, \"devfile.yaml\"));\n    assertEquals(location, format(fileUrl, \"foo.bar\"));\n  }\n\n  @DataProvider\n  public static Object[][] urlsProvider() {\n    return new Object[][] {\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo.git\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo.git/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo.dot.git\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo.dot.git/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo-with-hypen\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo-with-hypen/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure.com/MyOrg/MyProject/_git/-\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/-/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure.com/MyOrg/MyProject/_git/-j.git\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/-j.git/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo.git\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo.git/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo.dot.git\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo.dot.git/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo-with-hypen\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo-with-hypen/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/-\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/-/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/-j.git\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/-j.git/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GBmain&_a=contents\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&versionType=branch&version=main&api-version=7.0\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GBmain\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&versionType=branch&version=main&api-version=7.0\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GTMyTag&_a=contents\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&versionType=tag&version=MyTag&api-version=7.0\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GTMyTag\",\n        \"https://dev.azure.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&versionType=tag&version=MyTag&api-version=7.0\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/_git/MyRepo\",\n        \"https://dev.azure.com/MyOrg/MyRepo/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&api-version=7.0\"\n      }\n    };\n  }\n\n  @DataProvider\n  public static Object[][] urlsProviderServer() {\n    return new Object[][] {\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo.git\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/MyRepo.git/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo.dot.git\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/MyRepo.dot.git/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo-with-hypen\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/MyRepo-with-hypen/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/-\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/-/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/-j.git\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/-j.git/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo.git\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/MyRepo.git/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo.dot.git\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/MyRepo.dot.git/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo-with-hypen\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/MyRepo-with-hypen/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/-\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/-/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/-j.git\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/-j.git/items?path=/devfile.yaml&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GBmain&_a=contents\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&versionType=branch&version=main&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GBmain\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&versionType=branch&version=main&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GTMyTag&_a=contents\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&versionType=tag&version=MyTag&api-version=7.0\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GTMyTag\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_apis/git/repositories/MyRepo/items?path=/devfile.yaml&versionType=tag&version=MyTag&api-version=7.0\"\n      },\n    };\n  }\n\n  @Test(dataProvider = \"repoProvider\")\n  public void checkRepositoryLocation(String rawUrl, String repoUrl) {\n    AzureDevOpsUrl azureDevOpsUrl = azureDevOpsURLParser.parse(rawUrl, null);\n    assertEquals(azureDevOpsUrl.getRepositoryLocation(), repoUrl);\n  }\n\n  @Test(dataProvider = \"repoProviderServer\")\n  public void checkRepositoryLocationServer(String rawUrl, String repoUrl) {\n    AzureDevOpsUrl azureDevOpsUrl = azureDevOpsURLParser.parse(rawUrl, null);\n    assertEquals(azureDevOpsUrl.getRepositoryLocation(), repoUrl);\n  }\n\n  @DataProvider\n  public static Object[][] repoProvider() {\n    return new Object[][] {\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo\",\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo.git\",\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo.git\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo.dot.git\",\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo.dot.git\"\n      },\n      {\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo\",\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo\"\n      },\n      {\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo-with-hypen\",\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo-with-hypen\"\n      },\n      {\n        \"https://dev.azure.com/MyOrg/MyProject/_git/-\",\n        \"https://dev.azure.com/MyOrg/MyProject/_git/-\"\n      },\n      {\n        \"https://dev.azure.com/MyOrg/MyProject/_git/-j.git\",\n        \"https://dev.azure.com/MyOrg/MyProject/_git/-j.git\"\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo\",\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo\"\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo.git\",\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo.git\"\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo.dot.git\",\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo.dot.git\"\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo\",\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo\"\n      },\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo-with-hypen\",\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo-with-hypen\"\n      },\n      {\"git@ssh.dev.azure.com:v3/MyOrg/MyProject/-\", \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/-\"},\n      {\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/-j.git\",\n        \"git@ssh.dev.azure.com:v3/MyOrg/MyProject/-j.git\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GBmain&_a=contents\",\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GBmain\",\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GTMyTag&_a=contents\",\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GTMyTag\",\n        \"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo\"\n      },\n      {\n        \"https://MyOrg@dev.azure.com/MyOrg/_git/MyRepo\",\n        \"https://dev.azure.com/MyOrg/MyRepo/_git/MyRepo\"\n      }\n    };\n  }\n\n  @DataProvider\n  public static Object[][] repoProviderServer() {\n    return new Object[][] {\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo.git\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo.git\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo.dot.git\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo.dot.git\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo-with-hypen\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo-with-hypen\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/-\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/-\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/-j.git\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/-j.git\"\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo\",\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo\"\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo.git\",\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo.git\"\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo.dot.git\",\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo.dot.git\"\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo-with-hypen\",\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/MyRepo-with-hypen\"\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/-\",\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/-\"\n      },\n      {\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/-j.git\",\n        \"ssh://dev.azure-server.com:22/MyOrg/MyProject/_git/-j.git\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GBmain&_a=contents\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GBmain\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GTMyTag&_a=contents\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo\"\n      },\n      {\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo?path=MyFile&version=GTMyTag\",\n        \"https://dev.azure-server.com/MyOrg/MyProject/_git/MyRepo\"\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/test/resources/__files/azure-devops/rest/user/email/response.json",
    "content": "{\n  \"values\": [{\"email\" :  \"azure-user@mail.com\"}]\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/test/resources/__files/azure-devops/rest/user/response.json",
    "content": "{\n  \"displayName\": \"Display Name\",\n  \"emailAddress\": \"user@mail.com\"\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/test/resources/__files/azure-devops-server/rest/user/response.json",
    "content": "{\n  \"identity\": {\n    \"AccountName\": \"Azure DevOps\"\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-azure-devops/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2023 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n%nopex</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-factory-bitbucket</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Factory Resolver Bitbucket</name>\n    <properties>\n        <findbugs.failonerror>true</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.validation</groupId>\n            <artifactId>jakarta.validation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.github.tomakehurst</groupId>\n            <artifactId>wiremock-jre8-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>jcl-over-slf4j</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.wiremock</groupId>\n            <artifactId>wiremock-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketApiClient.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static java.net.HttpURLConnection.HTTP_BAD_REQUEST;\nimport static java.net.HttpURLConnection.HTTP_NOT_FOUND;\nimport static java.net.HttpURLConnection.HTTP_NO_CONTENT;\nimport static java.net.HttpURLConnection.HTTP_OK;\nimport static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;\nimport static java.time.Duration.ofSeconds;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.google.common.base.Charsets;\nimport com.google.common.base.Splitter;\nimport com.google.common.io.CharStreams;\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.UncheckedIOException;\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.time.Duration;\nimport java.util.Optional;\nimport java.util.concurrent.Executors;\nimport java.util.function.Function;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Bitbucket API operations helper. */\npublic class BitbucketApiClient {\n\n  private static final Logger LOG = LoggerFactory.getLogger(BitbucketApiClient.class);\n\n  /** Bitbucket API endpoint URL. */\n  public static final String BITBUCKET_API_SERVER = \"https://api.bitbucket.org/2.0/\";\n\n  /** Bitbucket endpoint URL. */\n  public static final String BITBUCKET_SERVER = \"https://bitbucket.org\";\n\n  /** Bitbucket HTTP header containing OAuth scopes. */\n  public static final String BITBUCKET_OAUTH_SCOPES_HEADER = \"X-OAuth-Scopes\";\n\n  private final HttpClient httpClient;\n  private final URI apiServerUrl;\n  private final URI scmServerUrl;\n\n  private static final Duration DEFAULT_HTTP_TIMEOUT = ofSeconds(10);\n  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();\n\n  /** Default constructor, binds http client to https://api.bitbucket.org */\n  public BitbucketApiClient() {\n    this(BITBUCKET_API_SERVER);\n  }\n\n  /**\n   * Used for URL injection in testing.\n   *\n   * @param apiServerUrl the Bitbucket API url\n   */\n  BitbucketApiClient(final String apiServerUrl) {\n    this.apiServerUrl = URI.create(apiServerUrl);\n    this.scmServerUrl = URI.create(BITBUCKET_SERVER);\n    this.httpClient =\n        HttpClient.newBuilder()\n            .executor(\n                Executors.newCachedThreadPool(\n                    new ThreadFactoryBuilder()\n                        .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n                        .setNameFormat(BitbucketApiClient.class.getName() + \"-%d\")\n                        .setDaemon(true)\n                        .build()))\n            .connectTimeout(DEFAULT_HTTP_TIMEOUT)\n            .version(HttpClient.Version.HTTP_1_1)\n            .build();\n  }\n\n  /**\n   * Returns the user associated with the provided OAuth access token.\n   *\n   * @param authenticationToken OAuth access token used by the user.\n   * @return Information about the user associated with the token\n   * @throws ScmItemNotFoundException\n   * @throws ScmCommunicationException\n   * @throws ScmBadRequestException\n   */\n  public BitbucketUser getUser(String authenticationToken)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    final URI uri = apiServerUrl.resolve(\"user\");\n    HttpRequest request = buildBitbucketApiRequest(uri, authenticationToken);\n    LOG.trace(\"executeRequest={}\", request);\n    return executeRequest(\n        httpClient,\n        request,\n        response -> {\n          try {\n            String result =\n                CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n            return OBJECT_MAPPER.readValue(result, BitbucketUser.class);\n          } catch (IOException e) {\n            throw new UncheckedIOException(e);\n          }\n        });\n  }\n\n  public String getFileContent(\n      String workspace, String repository, String source, String path, String authenticationToken)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    final URI uri =\n        apiServerUrl.resolve(\n            String.format(\"repositories/%s/%s/src/%s/%s\", workspace, repository, source, path));\n    HttpRequest request = buildBitbucketApiRequest(uri, authenticationToken);\n    LOG.trace(\"executeRequest={}\", request);\n    return executeRequest(\n        httpClient,\n        request,\n        response -> {\n          try {\n            return CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n          } catch (IOException e) {\n            throw new UncheckedIOException(e);\n          }\n        });\n  }\n\n  /**\n   * Returns email of the user, associated with the provided OAuth access token.\n   *\n   * @param authenticationToken OAuth access token used by the user.\n   * @return Information about email of the user, associated with the token\n   * @throws ScmItemNotFoundException\n   * @throws ScmCommunicationException\n   * @throws ScmBadRequestException\n   */\n  public BitbucketUserEmail getEmail(String authenticationToken)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    final URI uri = apiServerUrl.resolve(\"user/emails\");\n    HttpRequest request = buildBitbucketApiRequest(uri, authenticationToken);\n    LOG.trace(\"executeRequest={}\", request);\n    return executeRequest(\n        httpClient,\n        request,\n        response -> {\n          try {\n            String result =\n                CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n            return OBJECT_MAPPER.readValue(result, BitbucketUserEmail.class);\n          } catch (IOException e) {\n            throw new UncheckedIOException(e);\n          }\n        });\n  }\n\n  /**\n   * Returns a pair of the username and array of scopes of the OAuth token.\n   *\n   * @param authenticationToken The OAuth token to inspect.\n   * @return A pair of the username and array of scopes from the supplied token, empty array if no\n   *     scopes.\n   */\n  public Pair<String, String[]> getTokenScopes(String authenticationToken)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    final URI uri = apiServerUrl.resolve(\"user\");\n    HttpRequest request = buildBitbucketApiRequest(uri, authenticationToken);\n    LOG.trace(\"executeRequest={}\", request);\n    return executeRequest(\n        httpClient,\n        request,\n        response -> {\n          try {\n            String result =\n                CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n            BitbucketUser user = OBJECT_MAPPER.readValue(result, BitbucketUser.class);\n            Optional<String> responseScopes =\n                response.headers().firstValue(BITBUCKET_OAUTH_SCOPES_HEADER);\n            String[] scopes =\n                Splitter.on(',')\n                    .trimResults()\n                    .omitEmptyStrings()\n                    .splitToList(responseScopes.orElse(\"\"))\n                    .toArray(String[]::new);\n            return Pair.of(user.getName(), scopes);\n          } catch (IOException e) {\n            throw new UncheckedIOException(e);\n          }\n        });\n  }\n\n  private HttpRequest buildBitbucketApiRequest(URI uri, String authenticationToken) {\n    return HttpRequest.newBuilder(uri)\n        .headers(\"Authorization\", \"Bearer \" + authenticationToken, \"Accept\", \"application/json\")\n        .timeout(DEFAULT_HTTP_TIMEOUT)\n        .build();\n  }\n\n  private <T> T executeRequest(\n      HttpClient httpClient,\n      HttpRequest request,\n      Function<HttpResponse<InputStream>, T> responseConverter)\n      throws ScmBadRequestException,\n          ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmUnauthorizedException {\n    try {\n      HttpResponse<InputStream> response =\n          httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());\n      LOG.trace(\"executeRequest={} response {}\", request, response.statusCode());\n      if (response.statusCode() == HTTP_OK) {\n        return responseConverter.apply(response);\n      } else if (response.statusCode() == HTTP_NO_CONTENT) {\n        return null;\n      } else {\n        String body = CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n        switch (response.statusCode()) {\n          case HTTP_BAD_REQUEST:\n            throw new ScmBadRequestException(body);\n          case HTTP_NOT_FOUND:\n            throw new ScmItemNotFoundException(body);\n          case HTTP_UNAUTHORIZED:\n            throw new ScmUnauthorizedException(body, \"bitbucket\", \"v2\", \"\");\n          default:\n            throw new ScmCommunicationException(\n                \"Unexpected status code \" + response.statusCode() + \" \" + response,\n                response.statusCode(),\n                \"bitbucket\");\n        }\n      }\n    } catch (IOException | InterruptedException | UncheckedIOException e) {\n      throw new ScmCommunicationException(e.getMessage(), e, \"bitbucket\");\n    }\n  }\n\n  /**\n   * Checks if the provided url belongs to this client (Bitbucket)\n   *\n   * @param scmServerUrl the SCM url to verify\n   * @return {@code true} If the provided url is recognized by the current client\n   */\n  public boolean isConnected(String scmServerUrl) {\n    return this.scmServerUrl.equals(URI.create(scmServerUrl));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketAuthorizingFileContentProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport org.eclipse.che.api.factory.server.scm.AuthorizingFileContentProvider;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\n\n/** Bitbucket specific authorizing file content provider. */\nclass BitbucketAuthorizingFileContentProvider extends AuthorizingFileContentProvider<BitbucketUrl> {\n\n  private final BitbucketApiClient apiClient;\n\n  BitbucketAuthorizingFileContentProvider(\n      BitbucketUrl bitbucketUrl,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      BitbucketApiClient apiClient) {\n    super(bitbucketUrl, urlFetcher, personalAccessTokenManager);\n    this.apiClient = apiClient;\n  }\n\n  /** Formats OAuth token as HTTP Authorization header. */\n  @Override\n  protected String formatAuthorization(String token, boolean isPAT) {\n    return \"Bearer \" + token;\n  }\n\n  @Override\n  public String fetchContent(String fileURL) throws IOException, DevfileException {\n    final String requestURL = formatUrl(fileURL);\n    try {\n      // try to authenticate for the given URL\n      PersonalAccessToken token =\n          personalAccessTokenManager.getAndStore(remoteFactoryUrl.getHostName());\n      String[] split = requestURL.split(\"/\");\n      return apiClient.getFileContent(\n          split[3],\n          split[4],\n          split[6],\n          requestURL.substring(requestURL.indexOf(split[6]) + split[6].length() + 1),\n          token.getToken());\n    } catch (UnknownScmProviderException e) {\n      return fetchContentWithoutToken(requestURL);\n    } catch (ScmCommunicationException e) {\n      return toIOException(fileURL, e);\n    } catch (ScmUnauthorizedException\n        | ScmConfigurationPersistenceException\n        | UnsatisfiedScmPreconditionException\n        | ScmBadRequestException e) {\n      throw new DevfileException(e.getMessage(), e);\n    } catch (ScmItemNotFoundException e) {\n      throw new FileNotFoundException(e.getMessage());\n    }\n  }\n\n  @Override\n  protected boolean isPublicRepository(BitbucketUrl remoteFactoryUrl) {\n    try {\n      urlFetcher.fetch(\n          remoteFactoryUrl.getHostName()\n              + '/'\n              + remoteFactoryUrl.getWorkspaceId()\n              + '/'\n              + remoteFactoryUrl.getRepository());\n      return true;\n    } catch (IOException e) {\n      return false;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketFactoryParametersResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.eclipse.che.api.factory.shared.Constants.REVISION_PARAMETER_NAME;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.factory.server.BaseFactoryParameterResolver;\nimport org.eclipse.che.api.factory.server.FactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryVisitor;\nimport org.eclipse.che.api.factory.shared.dto.ScmInfoDto;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/** Provides Factory Parameters resolver for bitbucket repositories. */\n@Singleton\npublic class BitbucketFactoryParametersResolver extends BaseFactoryParameterResolver\n    implements FactoryParametersResolver {\n\n  private static final String PROVIDER_NAME = \"bitbucket\";\n\n  /** Parser which will allow to check validity of URLs and create objects. */\n  private final BitbucketURLParser bitbucketURLParser;\n\n  private final URLFetcher urlFetcher;\n\n  /** Builder allowing to build objects from bitbucket URL. */\n  private final BitbucketSourceStorageBuilder bitbucketSourceStorageBuilder;\n\n  private final URLFactoryBuilder urlFactoryBuilder;\n\n  /** Personal Access Token manager used when fetching protected content. */\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n\n  private final BitbucketApiClient bitbucketApiClient;\n\n  @Inject\n  public BitbucketFactoryParametersResolver(\n      BitbucketURLParser bitbucketURLParser,\n      URLFetcher urlFetcher,\n      BitbucketSourceStorageBuilder bitbucketSourceStorageBuilder,\n      URLFactoryBuilder urlFactoryBuilder,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      BitbucketApiClient bitbucketApiClient,\n      AuthorisationRequestManager authorisationRequestManager) {\n    super(authorisationRequestManager, urlFactoryBuilder, PROVIDER_NAME);\n    this.bitbucketURLParser = bitbucketURLParser;\n    this.urlFetcher = urlFetcher;\n    this.bitbucketSourceStorageBuilder = bitbucketSourceStorageBuilder;\n    this.urlFactoryBuilder = urlFactoryBuilder;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n    this.bitbucketApiClient = bitbucketApiClient;\n  }\n\n  /**\n   * Check if this resolver can be used with the given parameters.\n   *\n   * @param factoryParameters map of parameters dedicated to factories\n   * @return true if it will be accepted by the resolver implementation or false if it is not\n   *     accepted\n   */\n  @Override\n  public boolean accept(@NotNull final Map<String, String> factoryParameters) {\n    // Check if url parameter is a bitbucket URL\n    return factoryParameters.containsKey(URL_PARAMETER_NAME)\n        && bitbucketURLParser.isValid(factoryParameters.get(URL_PARAMETER_NAME));\n  }\n\n  @Override\n  public String getProviderName() {\n    return PROVIDER_NAME;\n  }\n\n  /**\n   * Create factory object based on provided parameters\n   *\n   * @param factoryParameters map containing factory data parameters provided through URL\n   * @throws BadRequestException when data are invalid\n   */\n  @Override\n  public FactoryMetaDto createFactory(@NotNull final Map<String, String> factoryParameters)\n      throws ApiException {\n    // no need to check null value of url parameter as accept() method has performed the check\n    final BitbucketUrl bitbucketUrl =\n        bitbucketURLParser.parse(\n            factoryParameters.get(URL_PARAMETER_NAME),\n            factoryParameters.get(REVISION_PARAMETER_NAME));\n    // create factory from the following location if location exists, else create default factory\n    return createFactory(\n        factoryParameters,\n        bitbucketUrl,\n        new BitbucketFactoryVisitor(bitbucketUrl),\n        new BitbucketAuthorizingFileContentProvider(\n            bitbucketUrl, urlFetcher, personalAccessTokenManager, bitbucketApiClient));\n  }\n\n  /**\n   * Visitor that puts the default devfile or updates devfile projects into the Bitbucket Factory,\n   * if needed.\n   */\n  private class BitbucketFactoryVisitor implements FactoryVisitor {\n\n    private final BitbucketUrl bitbucketUrl;\n\n    private BitbucketFactoryVisitor(BitbucketUrl bitbucketUrl) {\n      this.bitbucketUrl = bitbucketUrl;\n    }\n\n    @Override\n    public FactoryDevfileV2Dto visit(FactoryDevfileV2Dto factoryDto) {\n      ScmInfoDto scmInfo =\n          newDto(ScmInfoDto.class)\n              .withScmProviderName(bitbucketUrl.getProviderName())\n              .withRepositoryUrl(bitbucketUrl.repositoryLocation());\n      if (bitbucketUrl.getBranch() != null) {\n        scmInfo.withBranch(bitbucketUrl.getBranch());\n      }\n      return factoryDto.withScmInfo(scmInfo);\n    }\n  }\n\n  @Override\n  public RemoteFactoryUrl parseFactoryUrl(String factoryUrl) {\n    return bitbucketURLParser.parse(factoryUrl, null);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketModule.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\nimport org.eclipse.che.api.factory.server.scm.GitUserDataFetcher;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher;\n\npublic class BitbucketModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    Multibinder<PersonalAccessTokenFetcher> tokenFetcherMultibinder =\n        Multibinder.newSetBinder(binder(), PersonalAccessTokenFetcher.class);\n    tokenFetcherMultibinder.addBinding().to(BitbucketPersonalAccessTokenFetcher.class);\n    Multibinder<GitUserDataFetcher> gitUserDataMultibinder =\n        Multibinder.newSetBinder(binder(), GitUserDataFetcher.class);\n    gitUserDataMultibinder.addBinding().to(BitbucketUserDataFetcher.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketPersonalAccessTokenFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport com.google.common.collect.Sets;\nimport java.util.Optional;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenParams;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Bitbucket OAuth token retriever. */\npublic class BitbucketPersonalAccessTokenFetcher implements PersonalAccessTokenFetcher {\n\n  private static final Logger LOG =\n      LoggerFactory.getLogger(BitbucketPersonalAccessTokenFetcher.class);\n  private final String apiEndpoint;\n  private final OAuthAPI oAuthAPI;\n\n  /** Bitbucket API client. */\n  private final BitbucketApiClient bitbucketApiClient;\n\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  private static final String OAUTH_PROVIDER_NAME = \"bitbucket\";\n\n  /** OAuth scope required to make integration with Bitbucket work. */\n  public static final String DEFAULT_REPOSITORY_WRITE_TOKEN_SCOPE = \"repository:write\";\n\n  public static final String DEFAULT_PULLREQUEST_WRITE_TOKEN_SCOPE = \"pullrequest:write\";\n\n  public static final String DEFAULT_ACCOUNT_READ_TOKEN_SCOPE = \"account\";\n\n  public static final String DEFAULT_ACCOUNT_WRITE_TOKEN_SCOPE = \"account:write\";\n\n  @Inject\n  public BitbucketPersonalAccessTokenFetcher(\n      @Named(\"che.api\") String apiEndpoint, OAuthAPI oAuthAPI) {\n    this(apiEndpoint, oAuthAPI, new BitbucketApiClient());\n  }\n\n  /**\n   * Constructor used for testing only.\n   *\n   * @param apiEndpoint\n   * @param oAuthAPI\n   * @param bitbucketApiClient\n   */\n  BitbucketPersonalAccessTokenFetcher(\n      String apiEndpoint, OAuthAPI oAuthAPI, BitbucketApiClient bitbucketApiClient) {\n    this.apiEndpoint = apiEndpoint;\n    this.oAuthAPI = oAuthAPI;\n    this.bitbucketApiClient = bitbucketApiClient;\n  }\n\n  @Override\n  public PersonalAccessToken refreshPersonalAccessToken(Subject cheSubject, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    return fetchOrRefreshPersonalAccessToken(cheSubject, scmServerUrl, true);\n  }\n\n  @Override\n  public PersonalAccessToken fetchPersonalAccessToken(Subject cheSubject, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    return fetchOrRefreshPersonalAccessToken(cheSubject, scmServerUrl, false);\n  }\n\n  private PersonalAccessToken fetchOrRefreshPersonalAccessToken(\n      Subject cheSubject, String scmServerUrl, boolean forceRefreshToken)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    OAuthToken oAuthToken;\n\n    if (bitbucketApiClient == null || !bitbucketApiClient.isConnected(scmServerUrl)) {\n      LOG.debug(\"not a  valid url {} for current fetcher \", scmServerUrl);\n      return null;\n    }\n    try {\n      oAuthToken =\n          forceRefreshToken\n              ? oAuthAPI.refreshToken(OAUTH_PROVIDER_NAME)\n              : oAuthAPI.getOrRefreshToken(OAUTH_PROVIDER_NAME);\n      String tokenName = NameGenerator.generate(OAUTH_2_PREFIX, 5);\n      String tokenId = NameGenerator.generate(\"id-\", 5);\n      Optional<Pair<Boolean, String>> valid =\n          isValid(\n              new PersonalAccessTokenParams(\n                  scmServerUrl,\n                  OAUTH_PROVIDER_NAME,\n                  tokenName,\n                  tokenId,\n                  oAuthToken.getToken(),\n                  null));\n      if (valid.isEmpty()) {\n        throw buildScmUnauthorizedException(cheSubject);\n      } else if (!valid.get().first) {\n        throw new ScmCommunicationException(\n            \"Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: \"\n                + DEFAULT_REPOSITORY_WRITE_TOKEN_SCOPE\n                + \" and \"\n                + DEFAULT_ACCOUNT_READ_TOKEN_SCOPE);\n      }\n      return new PersonalAccessToken(\n          scmServerUrl,\n          OAUTH_PROVIDER_NAME,\n          cheSubject.getUserId(),\n          valid.get().second,\n          tokenName,\n          tokenId,\n          oAuthToken.getToken());\n    } catch (UnauthorizedException e) {\n      throw buildScmUnauthorizedException(cheSubject);\n    } catch (NotFoundException nfe) {\n      throw new UnknownScmProviderException(nfe.getMessage(), scmServerUrl);\n    } catch (ServerException | ForbiddenException | BadRequestException | ConflictException e) {\n      LOG.error(e.getMessage());\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  private ScmUnauthorizedException buildScmUnauthorizedException(Subject cheSubject) {\n    return new ScmUnauthorizedException(\n        cheSubject.getUserName()\n            + \" is not authorized in \"\n            + OAUTH_PROVIDER_NAME\n            + \" OAuth provider.\",\n        OAUTH_PROVIDER_NAME,\n        \"2.0\",\n        getLocalAuthenticateUrl());\n  }\n\n  @Override\n  public Optional<Boolean> isValid(PersonalAccessToken personalAccessToken) {\n    if (!bitbucketApiClient.isConnected(personalAccessToken.getScmProviderUrl())) {\n      LOG.debug(\"not a valid url {} for current fetcher \", personalAccessToken.getScmProviderUrl());\n      return Optional.empty();\n    }\n\n    try {\n      String[] scopes = bitbucketApiClient.getTokenScopes(personalAccessToken.getToken()).second;\n      return Optional.of(isValidScope(Sets.newHashSet(scopes)));\n    } catch (ScmItemNotFoundException\n        | ScmCommunicationException\n        | ScmBadRequestException\n        | ScmUnauthorizedException e) {\n      return Optional.of(Boolean.FALSE);\n    }\n  }\n\n  @Override\n  public Optional<Pair<Boolean, String>> isValid(PersonalAccessTokenParams params)\n      throws ScmCommunicationException {\n    if (!bitbucketApiClient.isConnected(params.getScmProviderUrl())) {\n      LOG.debug(\"not a valid url {} for current fetcher \", params.getScmProviderUrl());\n      return Optional.empty();\n    }\n\n    try {\n      Pair<String, String[]> pair = bitbucketApiClient.getTokenScopes(params.getToken());\n      return Optional.of(\n          Pair.of(\n              isValidScope(Sets.newHashSet(pair.second)) ? Boolean.TRUE : Boolean.FALSE,\n              pair.first));\n    } catch (ScmItemNotFoundException | ScmBadRequestException | ScmUnauthorizedException e) {\n      return Optional.empty();\n    }\n  }\n\n  private String getLocalAuthenticateUrl() {\n    return apiEndpoint\n        + \"/oauth/authenticate?oauth_provider=\"\n        + OAUTH_PROVIDER_NAME\n        + \"&scope=repository&request_method=POST&signature_method=rsa\";\n  }\n\n  /**\n   * Checks if the given scopes are valid for Bitbucket. Note: that pullrequest:write is a wider\n   * scope than repository:write, and account:write is a wider scope than account.\n   */\n  private boolean isValidScope(Set<String> scopes) {\n    return (scopes.contains(DEFAULT_REPOSITORY_WRITE_TOKEN_SCOPE)\n            || scopes.contains(DEFAULT_PULLREQUEST_WRITE_TOKEN_SCOPE))\n        && (scopes.contains(DEFAULT_ACCOUNT_READ_TOKEN_SCOPE)\n            || scopes.contains(DEFAULT_ACCOUNT_WRITE_TOKEN_SCOPE));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketScmFileResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.eclipse.che.api.factory.server.ApiExceptionMapper.toApiException;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.io.IOException;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.factory.server.ScmFileResolver;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\n\n/** Bitbucket specific SCM file resolver. */\npublic class BitbucketScmFileResolver implements ScmFileResolver {\n\n  private final BitbucketURLParser bitbucketUrlParser;\n  private final URLFetcher urlFetcher;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n  private final BitbucketApiClient bitbucketApiClient;\n\n  @Inject\n  public BitbucketScmFileResolver(\n      BitbucketURLParser bitbucketUrlParser,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      BitbucketApiClient bitbucketApiClient) {\n    this.bitbucketUrlParser = bitbucketUrlParser;\n    this.urlFetcher = urlFetcher;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n    this.bitbucketApiClient = bitbucketApiClient;\n  }\n\n  @Override\n  public boolean accept(@NotNull String repository) {\n    // Check if repository parameter is a bitbucket URL\n    return bitbucketUrlParser.isValid(repository);\n  }\n\n  @Override\n  public String fileContent(@NotNull String repository, @NotNull String filePath)\n      throws ApiException {\n    final BitbucketUrl bitbucketUrl = bitbucketUrlParser.parse(repository, null);\n    try {\n      return fetchContent(bitbucketUrl, filePath, false);\n    } catch (DevfileException exception) {\n      // This catch might mean that the authentication was rejected by user, try to repeat the fetch\n      // without authentication flow.\n      try {\n        return fetchContent(bitbucketUrl, filePath, true);\n      } catch (DevfileException devfileException) {\n        throw toApiException(devfileException);\n      }\n    }\n  }\n\n  private String fetchContent(\n      BitbucketUrl bitbucketUrl, String filePath, boolean skipAuthentication)\n      throws DevfileException, NotFoundException {\n    try {\n      BitbucketAuthorizingFileContentProvider contentProvider =\n          new BitbucketAuthorizingFileContentProvider(\n              bitbucketUrl, urlFetcher, personalAccessTokenManager, bitbucketApiClient);\n      return skipAuthentication\n          ? contentProvider.fetchContentWithoutAuthentication(filePath)\n          : contentProvider.fetchContent(filePath);\n    } catch (IOException e) {\n      throw new NotFoundException(e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketSourceStorageBuilder.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport com.google.common.base.Strings;\nimport java.util.HashMap;\nimport java.util.Map;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto;\nimport org.eclipse.che.api.workspace.shared.dto.SourceStorageDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.SourceDto;\n\n/** Create {@link ProjectConfigDto} object from objects */\n@Singleton\npublic class BitbucketSourceStorageBuilder {\n\n  /**\n   * Create SourceStorageDto DTO by using data of a bitbucket url\n   *\n   * @param bitbucketUrl an instance of {@link BitbucketUrl}\n   * @return newly created source storage DTO object\n   */\n  public SourceStorageDto buildWorkspaceConfigSource(BitbucketUrl bitbucketUrl) {\n    // Create map for source storage dto\n    Map<String, String> parameters = new HashMap<>(1);\n    if (!Strings.isNullOrEmpty(bitbucketUrl.getBranch())) {\n      parameters.put(\"branch\", bitbucketUrl.getBranch());\n    }\n    return newDto(SourceStorageDto.class)\n        .withLocation(bitbucketUrl.repositoryLocation())\n        .withType(\"bitbucket\")\n        .withParameters(parameters);\n  }\n\n  /**\n   * Create SourceStorageDto DTO by using data of a bitbucket url\n   *\n   * @param bitbucketUrl an instance of {@link BitbucketUrl}\n   * @return newly created source DTO object\n   */\n  public SourceDto buildDevfileSource(BitbucketUrl bitbucketUrl) {\n    return newDto(SourceDto.class)\n        .withLocation(bitbucketUrl.repositoryLocation())\n        .withType(\"bitbucket\")\n        .withBranch(bitbucketUrl.getBranch());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketURLParser.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/** Parser of String Bitbucket SAAS URLs and provides {@link BitbucketUrl} objects. */\n@Singleton\npublic class BitbucketURLParser {\n  private final DevfileFilenamesProvider devfileFilenamesProvider;\n\n  @Inject\n  public BitbucketURLParser(DevfileFilenamesProvider devfileFilenamesProvider) {\n    this.devfileFilenamesProvider = devfileFilenamesProvider;\n  }\n\n  /**\n   * Regexp to find repository details (repository name, workspace id, project name and branch)\n   * Examples of valid URLs are in the test class.\n   */\n  protected static final Pattern BITBUCKET_PATTERN =\n      Pattern.compile(\n          \"^https?://(?<username>[^/@]+)?@?bitbucket\\\\.org/(?<workspaceId>[^/]+)/(?<repoName>[^/]+)/?(\\\\.git)?(/(src|branch)/(?<branchName>[^/]+)/?)?$\");\n\n  protected static final Pattern BITBUCKET_SSH_PATTERN =\n      Pattern.compile(\"^git@bitbucket.org:(?<workspaceId>.*)/(?<repoName>.*)$\");\n\n  public boolean isValid(@NotNull String url) {\n    return BITBUCKET_PATTERN.matcher(url).matches() || BITBUCKET_SSH_PATTERN.matcher(url).matches();\n  }\n\n  public BitbucketUrl parse(String url, @Nullable String revision) {\n    // Apply bitbucket url to the regexp\n    boolean isHTTPSUrl = BITBUCKET_PATTERN.matcher(url).matches();\n    Matcher matcher =\n        isHTTPSUrl ? BITBUCKET_PATTERN.matcher(url) : BITBUCKET_SSH_PATTERN.matcher(url);\n    if (!matcher.matches()) {\n      throw new IllegalArgumentException(\n          String.format(\"The given bitbucket url %s is not a valid URL bitbucket url. \", url));\n    }\n\n    String workspaceId = matcher.group(\"workspaceId\");\n    String repoName = matcher.group(\"repoName\");\n    if (repoName.matches(\"^[\\\\w-][\\\\w.-]*?\\\\.git$\")) {\n      repoName = repoName.substring(0, repoName.length() - 4);\n    }\n    String username = null;\n    String branchFromUrl = null;\n    if (isHTTPSUrl) {\n      username = matcher.group(\"username\");\n      branchFromUrl = matcher.group(\"branchName\");\n    }\n\n    return new BitbucketUrl()\n        .withUsername(username)\n        .withRepository(repoName)\n        .setIsHTTPSUrl(isHTTPSUrl)\n        .withBranch(isNullOrEmpty(branchFromUrl) ? revision : branchFromUrl)\n        .withWorkspaceId(workspaceId)\n        .withDevfileFilenames(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .withUrl(url);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketUrl.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static com.google.common.base.MoreObjects.firstNonNull;\n\nimport com.google.common.base.Strings;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.StringJoiner;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.factory.server.urlfactory.DefaultFactoryUrl;\n\n/**\n * Representation of a bitbucket URL, allowing to get details from it.\n *\n * <p>like https://<your_username>@bitbucket.org/<workspace_ID>/<repo_name>.git\n */\npublic class BitbucketUrl extends DefaultFactoryUrl {\n\n  private final String NAME = \"bitbucket\";\n\n  private static final String HOSTNAME = \"bitbucket.org\";\n\n  /** Username part of the bitbucket URL */\n  private String username;\n\n  /** workspace part of the bitbucket URL */\n  private String workspaceId;\n\n  /** Repository part of the URL. */\n  private String repository;\n\n  private boolean isHTTPSUrl;\n\n  /** Branch name */\n  private String branch;\n\n  /** Devfile filenames list */\n  private final List<String> devfileFilenames = new ArrayList<>();\n\n  /**\n   * Creation of this instance is made by the parser so user may not need to create a new instance\n   * directly\n   */\n  protected BitbucketUrl() {}\n\n  @Override\n  public String getProviderName() {\n    return NAME;\n  }\n\n  /**\n   * Gets username of this bitbucket url\n   *\n   * @return the username part\n   */\n  public String getUsername() {\n    return this.username;\n  }\n\n  public BitbucketUrl withUsername(String userName) {\n    this.username = userName;\n    return this;\n  }\n\n  public String getRepository() {\n    return this.repository;\n  }\n\n  protected BitbucketUrl withRepository(String repository) {\n    this.repository = repository;\n    return this;\n  }\n\n  public BitbucketUrl setIsHTTPSUrl(boolean isHTTPSUrl) {\n    this.isHTTPSUrl = isHTTPSUrl;\n    return this;\n  }\n\n  public String getWorkspaceId() {\n    return workspaceId;\n  }\n\n  protected BitbucketUrl withWorkspaceId(String workspaceId) {\n    this.workspaceId = workspaceId;\n    return this;\n  }\n\n  protected BitbucketUrl withDevfileFilenames(List<String> devfileFilenames) {\n    this.devfileFilenames.addAll(devfileFilenames);\n    return this;\n  }\n\n  @Override\n  public void setDevfileFilename(String devfileName) {\n    this.devfileFilenames.clear();\n    this.devfileFilenames.add(devfileName);\n  }\n\n  public String getBranch() {\n    return this.branch;\n  }\n\n  protected BitbucketUrl withBranch(String branch) {\n    if (!Strings.isNullOrEmpty(branch)) {\n      this.branch = branch;\n    }\n    return this;\n  }\n\n  @Override\n  public List<DevfileLocation> devfileFileLocations() {\n    return devfileFilenames.stream().map(this::createDevfileLocation).collect(Collectors.toList());\n  }\n\n  private DevfileLocation createDevfileLocation(String devfileFilename) {\n    return new DevfileLocation() {\n      @Override\n      public Optional<String> filename() {\n        return Optional.of(devfileFilename);\n      }\n\n      @Override\n      public String location() {\n        return rawFileLocation(devfileFilename);\n      }\n    };\n  }\n\n  public String rawFileLocation(String fileName) {\n    return new StringJoiner(\"/\")\n        .add(\"https://bitbucket.org\")\n        .add(workspaceId)\n        .add(repository)\n        .add(\"raw\")\n        .add(firstNonNull(branch, \"HEAD\"))\n        .add(fileName)\n        .toString();\n  }\n\n  @Override\n  public String getHostName() {\n    return \"https://\" + HOSTNAME;\n  }\n\n  @Override\n  public Optional<String> getCredentials() {\n    // Bitbucket repository URL may contain username e.g.\n    // https://<username>@bitbucket.org/<workspace_ID>/<repo_name>.git. If username is present, it\n    // can not be used as credentials. Moreover, we skip credentials for Bitbucket repository URl at\n    // all, because we do not support credentials in a repository URL. We only support credentials\n    // in a devfile URL, which is handled by the DefaultFactoryUrl class.\n    // Todo: add a new abstraction for divfile URL to be able to retrieve credentials separately.\n    return Optional.empty();\n  }\n\n  /**\n   * Provides location to the repository part of the full bitbucket URL.\n   *\n   * @return location of the repository.\n   */\n  protected String repositoryLocation() {\n    if (isHTTPSUrl) {\n      return \"https://\"\n          + (this.username != null ? this.username + '@' : \"\")\n          + HOSTNAME\n          + \"/\"\n          + workspaceId\n          + \"/\"\n          + repository\n          + \".git\";\n    }\n    return String.format(\"git@%s:%s/%s.git\", HOSTNAME, workspaceId, repository);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketUser.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.google.common.base.Objects;\n\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class BitbucketUser {\n  private String name;\n  private String id;\n\n  @JsonProperty(\"display_name\")\n  private String displayName;\n\n  public String getName() {\n    return name;\n  }\n\n  @JsonProperty(\"username\")\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  public String getId() {\n    return id;\n  }\n\n  @JsonProperty(\"account_id\")\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  public String getDisplayName() {\n    return displayName;\n  }\n\n  public void setDisplayName(String displayName) {\n    this.displayName = displayName;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) return true;\n    if (o == null || getClass() != o.getClass()) return false;\n    BitbucketUser that = (BitbucketUser) o;\n    return Objects.equal(name, that.name)\n        && Objects.equal(id, that.id)\n        && Objects.equal(displayName, that.displayName);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hashCode(name, id, displayName);\n  }\n\n  @Override\n  public String toString() {\n    return \"BitbucketUser{\"\n        + \"name='\"\n        + name\n        + '\\''\n        + \", id='\"\n        + id\n        + '\\''\n        + \", displayName='\"\n        + displayName\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketUserDataFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport com.google.common.base.Joiner;\nimport com.google.common.collect.ImmutableSet;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.GitUserData;\nimport org.eclipse.che.api.factory.server.scm.GitUserDataFetcher;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.security.oauth.OAuthAPI;\n\n/**\n * Bitbucket user data retriever. TODO: extends {@code AbstractGitUserDataFetcher} when we support\n * personal access tokens for BitBucket.\n */\npublic class BitbucketUserDataFetcher implements GitUserDataFetcher {\n  private final String apiEndpoint;\n  private final OAuthAPI oAuthAPI;\n\n  /** Bitbucket API client. */\n  private final BitbucketApiClient bitbucketApiClient;\n\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  private static final String OAUTH_PROVIDER_NAME = \"bitbucket\";\n\n  /** Collection of OAuth scopes required to make integration with Bitbucket work. */\n  public static final Set<String> DEFAULT_TOKEN_SCOPES = ImmutableSet.of(\"repo\");\n\n  @Inject\n  public BitbucketUserDataFetcher(@Named(\"che.api\") String apiEndpoint, OAuthAPI oAuthAPI) {\n    this(apiEndpoint, oAuthAPI, new BitbucketApiClient());\n  }\n\n  /** Constructor used for testing only. */\n  public BitbucketUserDataFetcher(\n      String apiEndpoint, OAuthAPI oAuthAPI, BitbucketApiClient bitbucketApiClient) {\n    this.apiEndpoint = apiEndpoint;\n    this.oAuthAPI = oAuthAPI;\n    this.bitbucketApiClient = bitbucketApiClient;\n  }\n\n  @Override\n  public GitUserData fetchGitUserData(String namespaceName)\n      throws ScmUnauthorizedException, ScmCommunicationException {\n    OAuthToken oAuthToken;\n    try {\n      oAuthToken = oAuthAPI.getOrRefreshToken(OAUTH_PROVIDER_NAME);\n      // Find the user associated to the OAuth token by querying the Bitbucket API.\n      BitbucketUser user = bitbucketApiClient.getUser(oAuthToken.getToken());\n      BitbucketUserEmail emailResponse = bitbucketApiClient.getEmail(oAuthToken.getToken());\n      String email =\n          emailResponse.getValues().length > 0 ? emailResponse.getValues()[0].getEmail() : \"\";\n      return new GitUserData(user.getDisplayName(), email);\n    } catch (UnauthorizedException e) {\n      Subject cheSubject = EnvironmentContext.getCurrent().getSubject();\n      throw new ScmUnauthorizedException(\n          cheSubject.getUserName()\n              + \" is not authorized in \"\n              + OAUTH_PROVIDER_NAME\n              + \" OAuth provider.\",\n          OAUTH_PROVIDER_NAME,\n          \"2.0\",\n          getLocalAuthenticateUrl());\n    } catch (NotFoundException\n        | ServerException\n        | ForbiddenException\n        | BadRequestException\n        | ScmItemNotFoundException\n        | ScmBadRequestException\n        | ConflictException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  private String getLocalAuthenticateUrl() {\n    return apiEndpoint\n        + \"/oauth/authenticate?oauth_provider=\"\n        + OAUTH_PROVIDER_NAME\n        + \"&scope=\"\n        + Joiner.on(',').join(DEFAULT_TOKEN_SCOPES)\n        + \"&request_method=POST&signature_method=rsa\";\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketUserEmail.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\n\n@JsonIgnoreProperties(ignoreUnknown = true)\nclass Value {\n  private String email;\n\n  public String getEmail() {\n    return email;\n  }\n\n  public void setEmail(String email) {\n    this.email = email;\n  }\n}\n\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class BitbucketUserEmail {\n  private Value[] values;\n\n  public Value[] getValues() {\n    return values;\n  }\n\n  public void setValues(Value[] values) {\n    this.values = values;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketApiClientTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.equalTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertEqualsNoOrder;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.common.net.HttpHeaders;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketApiClientTest {\n\n  private BitbucketApiClient client;\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  @BeforeMethod\n  void start() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    wireMock = new WireMock(\"localhost\", wireMockServer.port());\n    client = new BitbucketApiClient(wireMockServer.url(\"/\"));\n  }\n\n  @AfterMethod\n  void stop() {\n    wireMockServer.stop();\n  }\n\n  @Test\n  public void testGetUser() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token1\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/user/response.json\")));\n\n    BitbucketUser user = client.getUser(\"token1\");\n    assertNotNull(user, \"Bitbucket API should have returned a non-null user object\");\n    assertEquals(\n        user.getId(),\n        \"bitbucket-user_id_123\",\n        \"Bitbucket user id was not parsed properly by client\");\n    assertEquals(user.getName(), \"user\", \"Bitbucket user name was not parsed properly by client\");\n    assertEquals(\n        user.getDisplayName(),\n        \"Bitbucket User\",\n        \"Bitbucket user display name was not parsed properly by client\");\n  }\n\n  @Test\n  public void testGetTokenScopes() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token1\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(\n                        BitbucketApiClient.BITBUCKET_OAUTH_SCOPES_HEADER,\n                        \"repository:write,account\")\n                    .withBodyFile(\"bitbucket/rest/user/response.json\")));\n\n    String[] scopes = client.getTokenScopes(\"token1\").second;\n    String[] expectedScopes = {\"repository:write\", \"account\"};\n    assertNotNull(scopes, \"Bitbucket API should have returned a non-null scope array\");\n    assertEqualsNoOrder(\n        scopes, expectedScopes, \"Returned scope array does not match expected values\");\n  }\n\n  @Test\n  public void testGetTokenScopesWithNoScopeHeader() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token1\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/user/response.json\")));\n\n    String[] scopes = client.getTokenScopes(\"token1\").second;\n    assertNotNull(scopes, \"Bitbucket API should have returned a non-null scope array\");\n    assertEquals(\n        scopes.length,\n        0,\n        \"A response with no \"\n            + BitbucketApiClient.BITBUCKET_OAUTH_SCOPES_HEADER\n            + \" header should return an empty array\");\n  }\n\n  @Test\n  public void testGetTokenScopesWithNoScope() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token1\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(BitbucketApiClient.BITBUCKET_OAUTH_SCOPES_HEADER, \"\")\n                    .withBodyFile(\"bitbucket/rest/user/response.json\")));\n\n    String[] scopes = client.getTokenScopes(\"token1\").second;\n    assertNotNull(scopes, \"Bitbucket API should have returned a non-null scope array\");\n    assertEquals(\n        scopes.length,\n        0,\n        \"A response with empty \"\n            + BitbucketApiClient.BITBUCKET_OAUTH_SCOPES_HEADER\n            + \" header should return an empty array\");\n  }\n\n  @Test\n  public void shouldReturnFalseOnConnectedToOtherHost() {\n    assertFalse(client.isConnected(\"https://other.com\"));\n  }\n\n  @Test\n  public void shouldReturnTrueWhenConnectedToBitbucket() {\n    assertTrue(client.isConnected(\"https://bitbucket.org\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketAuthorizingFileContentProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.mockito.ArgumentMatchers.*;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport java.io.FileNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketAuthorizingFileContentProviderTest {\n\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n  @Mock private BitbucketApiClient bitbucketApiClient;\n\n  @Test\n  public void shouldExpandRelativePaths() throws Exception {\n    URLFetcher urlFetcher = Mockito.mock(URLFetcher.class);\n    BitbucketUrl bitbucketUrl = new BitbucketUrl().withWorkspaceId(\"eclipse\").withRepository(\"che\");\n    FileContentProvider fileContentProvider =\n        new BitbucketAuthorizingFileContentProvider(\n            bitbucketUrl, urlFetcher, personalAccessTokenManager, bitbucketApiClient);\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenThrow(UnknownScmProviderException.class);\n    fileContentProvider.fetchContent(\"devfile.yaml\");\n    verify(urlFetcher).fetch(eq(\"https://bitbucket.org/eclipse/che/raw/HEAD/devfile.yaml\"));\n  }\n\n  @Test\n  public void shouldPreserveAbsolutePaths() throws Exception {\n    URLFetcher urlFetcher = Mockito.mock(URLFetcher.class);\n    BitbucketUrl bitbucketUrl = new BitbucketUrl().withUsername(\"eclipse\").withRepository(\"che\");\n    FileContentProvider fileContentProvider =\n        new BitbucketAuthorizingFileContentProvider(\n            bitbucketUrl, urlFetcher, personalAccessTokenManager, bitbucketApiClient);\n    String url = \"https://api.bitbucket.org/2.0/repositories/foo/bar/devfile.yaml\";\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenThrow(UnknownScmProviderException.class);\n    fileContentProvider.fetchContent(url);\n    verify(urlFetcher).fetch(eq(url));\n  }\n\n  @Test(expectedExceptions = FileNotFoundException.class)\n  public void shouldThrowNotFoundForPublicRepos() throws Exception {\n    URLFetcher urlFetcher = Mockito.mock(URLFetcher.class);\n    String url = \"https://bitbucket.org/foo/bar/raw/HEAD/devfile.yaml\";\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenThrow(UnknownScmProviderException.class);\n    when(urlFetcher.fetch(eq(url))).thenThrow(FileNotFoundException.class);\n    when(urlFetcher.fetch(eq(\"https://bitbucket.org/eclipse/che\"))).thenReturn(\"OK\");\n    BitbucketUrl bitbucketUrl =\n        new BitbucketUrl().withUsername(\"eclipse\").withWorkspaceId(\"eclipse\").withRepository(\"che\");\n    FileContentProvider fileContentProvider =\n        new BitbucketAuthorizingFileContentProvider(\n            bitbucketUrl, urlFetcher, personalAccessTokenManager, bitbucketApiClient);\n    fileContentProvider.fetchContent(url);\n  }\n\n  @Test\n  public void shouldFetchContent() throws Exception {\n    // given\n    URLFetcher urlFetcher = Mockito.mock(URLFetcher.class);\n    String url = \"https://bitbucket.org/workspace/repository/raw/HEAD/devfile.yaml\";\n    PersonalAccessToken personalAccessToken =\n        new PersonalAccessToken(url, \"provider\", \"che\", \"my-token\");\n    when(personalAccessTokenManager.getAndStore(anyString())).thenReturn(personalAccessToken);\n    when(bitbucketApiClient.getFileContent(\n            eq(\"workspace\"), eq(\"repository\"), eq(\"HEAD\"), eq(\"devfile.yaml\"), eq(\"my-token\")))\n        .thenReturn(\"content\");\n    BitbucketUrl bitbucketUrl =\n        new BitbucketUrl().withUsername(\"eclipse\").withWorkspaceId(\"eclipse\").withRepository(\"che\");\n    FileContentProvider fileContentProvider =\n        new BitbucketAuthorizingFileContentProvider(\n            bitbucketUrl, urlFetcher, personalAccessTokenManager, bitbucketApiClient);\n    // when\n    String content = fileContentProvider.fetchContent(url);\n\n    // then\n    assertEquals(content, \"content\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketFactoryParametersResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.factory.shared.Constants.CURRENT_VERSION;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.eclipse.che.security.oauth1.OAuthAuthenticationService.ERROR_QUERY_NAME;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyBoolean;\nimport static org.mockito.ArgumentMatchers.anyMap;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.model.factory.ScmInfo;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.ScmInfoDto;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.Mock;\nimport org.mockito.Spy;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/** Validate operations performed by the Bitbucket Factory service */\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketFactoryParametersResolverTest {\n\n  @Mock private URLFetcher urlFetcher;\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  @Mock private AuthorisationRequestManager authorisationRequestManager;\n\n  /** Parser which will allow to check validity of URLs and create objects. */\n  private BitbucketURLParser bitbucketURLParser;\n\n  /** Converter allowing to convert bitbucket URL to other objects. */\n  @Spy\n  private BitbucketSourceStorageBuilder bitbucketSourceStorageBuilder =\n      new BitbucketSourceStorageBuilder();\n\n  /** Parser which will allow to check validity of URLs and create objects. */\n  @Mock private URLFactoryBuilder urlFactoryBuilder;\n\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n  @Mock private BitbucketApiClient bitbucketApiClient;\n\n  /**\n   * Capturing the location parameter when calling {@link\n   * URLFactoryBuilder#createFactoryFromDevfile(RemoteFactoryUrl, FileContentProvider, Map,\n   * boolean)}\n   */\n  @Captor private ArgumentCaptor<RemoteFactoryUrl> factoryUrlArgumentCaptor;\n\n  /** Instance of resolver that will be tested. */\n  private BitbucketFactoryParametersResolver bitbucketFactoryParametersResolver;\n\n  @BeforeMethod\n  protected void init() {\n    bitbucketURLParser = new BitbucketURLParser(devfileFilenamesProvider);\n    assertNotNull(this.bitbucketURLParser);\n    bitbucketFactoryParametersResolver =\n        new BitbucketFactoryParametersResolver(\n            bitbucketURLParser,\n            urlFetcher,\n            bitbucketSourceStorageBuilder,\n            urlFactoryBuilder,\n            personalAccessTokenManager,\n            bitbucketApiClient,\n            authorisationRequestManager);\n    assertNotNull(this.bitbucketFactoryParametersResolver);\n  }\n\n  /** Check missing parameter name can't be accepted by this resolver */\n  @Test\n  public void checkMissingParameter() {\n    Map<String, String> parameters = singletonMap(\"foo\", \"this is a foo bar\");\n    boolean accept = bitbucketFactoryParametersResolver.accept(parameters);\n    // shouldn't be accepted\n    assertFalse(accept);\n  }\n\n  /** Check url which is not a bitbucket url can't be accepted by this resolver */\n  @Test\n  public void checkInvalidAcceptUrl() {\n    Map<String, String> parameters = singletonMap(URL_PARAMETER_NAME, \"http://www.eclipse.org/che\");\n    boolean accept = bitbucketFactoryParametersResolver.accept(parameters);\n    // shouldn't be accepted\n    assertFalse(accept);\n  }\n\n  /** Check bitbucket url will be accepted by this resolver */\n  @Test\n  public void checkValidAcceptUrl() {\n    Map<String, String> parameters =\n        singletonMap(URL_PARAMETER_NAME, \"https://bitbucket.org/eclipse/che.git\");\n    boolean accept = bitbucketFactoryParametersResolver.accept(parameters);\n    // shouldn't be accepted\n    assertTrue(accept);\n  }\n\n  @Test\n  public void shouldGenerateDevfileForFactoryWithNoDevfile() throws Exception {\n\n    String bitbucketUrl = \"https://bitbucket.org/eclipse/che\";\n\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.empty());\n    Map<String, String> params = ImmutableMap.of(URL_PARAMETER_NAME, bitbucketUrl);\n    // when\n    FactoryDevfileV2Dto factory =\n        (FactoryDevfileV2Dto) bitbucketFactoryParametersResolver.createFactory(params);\n    // then\n    ScmInfoDto scmInfo = factory.getScmInfo();\n    assertEquals(scmInfo.getRepositoryUrl(), bitbucketUrl + \".git\");\n    assertEquals(scmInfo.getBranch(), null);\n  }\n\n  @Test\n  public void shouldSetScmInfoIntoDevfileV2() throws Exception {\n\n    String bitbucketUrl = \"https://bitbucket.org/eclipse/che/src/foobar\";\n\n    FactoryDevfileV2Dto computedFactory = generateDevfileV2Factory();\n\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.of(computedFactory));\n\n    Map<String, String> params = ImmutableMap.of(URL_PARAMETER_NAME, bitbucketUrl);\n    // when\n    FactoryDevfileV2Dto factory =\n        (FactoryDevfileV2Dto) bitbucketFactoryParametersResolver.createFactory(params);\n    // then\n    ScmInfo scmInfo = factory.getScmInfo();\n    assertNotNull(scmInfo);\n    assertEquals(scmInfo.getScmProviderName(), \"bitbucket\");\n    assertEquals(scmInfo.getRepositoryUrl(), \"https://bitbucket.org/eclipse/che.git\");\n    assertEquals(scmInfo.getBranch(), \"foobar\");\n  }\n\n  private FactoryDevfileV2Dto generateDevfileV2Factory() {\n    return newDto(FactoryDevfileV2Dto.class)\n        .withV(CURRENT_VERSION)\n        .withSource(\"repo\")\n        .withDevfile(Map.of(\"schemaVersion\", \"2.0.0\"));\n  }\n\n  @Test\n  public void shouldCreateFactoryWithoutAuthentication() throws ApiException {\n    // given\n    String bitbucketUrl = \"https://bitbucket.org/user/repo.git\";\n    Map<String, String> params =\n        ImmutableMap.of(URL_PARAMETER_NAME, bitbucketUrl, ERROR_QUERY_NAME, \"access_denied\");\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.of(generateDevfileV2Factory()));\n\n    // when\n    bitbucketFactoryParametersResolver.createFactory(params);\n\n    // then\n    verify(urlFactoryBuilder)\n        .createFactoryFromDevfile(\n            any(BitbucketUrl.class),\n            any(BitbucketAuthorizingFileContentProvider.class),\n            anyMap(),\n            eq(true));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketGitUserDataFetcherTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.equalTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.common.net.HttpHeaders;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.factory.server.scm.GitUserData;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketGitUserDataFetcherTest {\n\n  @Mock OAuthAPI oAuthAPI;\n  BitbucketUserDataFetcher bitbucketUserDataFetcher;\n\n  final int httpPort = 3301;\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  final String bitbucketOauthToken = \"bitbucket_token\";\n\n  @BeforeMethod\n  void start() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).port(httpPort));\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", httpPort);\n    wireMock = new WireMock(\"localhost\", httpPort);\n    bitbucketUserDataFetcher =\n        new BitbucketUserDataFetcher(\n            \"http://che.api\", oAuthAPI, new BitbucketApiClient(wireMockServer.url(\"/\")));\n    stubFor(\n        get(urlEqualTo(\"/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer \" + bitbucketOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/user/response.json\")));\n    stubFor(\n        get(urlEqualTo(\"/user/emails\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer \" + bitbucketOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/user/email/response.json\")));\n  }\n\n  @AfterMethod\n  void stop() {\n    wireMockServer.stop();\n  }\n\n  @Test\n  public void shouldFetchGitUserData() throws Exception {\n    OAuthToken oAuthToken =\n        newDto(OAuthToken.class).withToken(bitbucketOauthToken).withScope(\"repo\");\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenReturn(oAuthToken);\n\n    GitUserData gitUserData = bitbucketUserDataFetcher.fetchGitUserData(null);\n\n    assertEquals(gitUserData.getScmUsername(), \"Bitbucket User\");\n    assertEquals(gitUserData.getScmUserEmail(), \"bitbucketuser@email.com\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketPersonalAccessTokenFetcherTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.equalTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;\nimport static org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher.OAUTH_2_PREFIX;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.*;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.common.net.HttpHeaders;\nimport java.util.Collections;\nimport java.util.Optional;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenParams;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketPersonalAccessTokenFetcherTest {\n\n  @Mock OAuthAPI oAuthAPI;\n  BitbucketPersonalAccessTokenFetcher bitbucketPersonalAccessTokenFetcher;\n\n  final int httpPort = 3301;\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  final String bitbucketOauthToken = \"token\";\n\n  @BeforeMethod\n  void start() {\n\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).port(httpPort));\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", httpPort);\n    wireMock = new WireMock(\"localhost\", httpPort);\n    bitbucketPersonalAccessTokenFetcher =\n        new BitbucketPersonalAccessTokenFetcher(\n            \"http://che.api\", oAuthAPI, new BitbucketApiClient(wireMockServer.url(\"/\")));\n  }\n\n  @AfterMethod\n  void stop() {\n    wireMockServer.stop();\n  }\n\n  @Test\n  public void shouldNotValidateSCMServerWithTrailingSlash() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer \" + bitbucketOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/user/response.json\")));\n    PersonalAccessTokenParams personalAccessTokenParams =\n        new PersonalAccessTokenParams(\n            \"https://bitbucket.org/\",\n            \"provider\",\n            \"scmTokenName\",\n            \"scmTokenId\",\n            bitbucketOauthToken,\n            null);\n    assertTrue(\n        bitbucketPersonalAccessTokenFetcher.isValid(personalAccessTokenParams).isEmpty(),\n        \"Should not validate SCM server with trailing /\");\n  }\n\n  @Test(\n      expectedExceptions = ScmCommunicationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: repository:write and account\")\n  public void shouldThrowExceptionOnInsufficientTokenScopes() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    OAuthToken oAuthToken = newDto(OAuthToken.class).withToken(bitbucketOauthToken).withScope(\"\");\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenReturn(oAuthToken);\n\n    stubFor(\n        get(urlEqualTo(\"/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer \" + bitbucketOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(BitbucketApiClient.BITBUCKET_OAUTH_SCOPES_HEADER, \"\")\n                    .withBodyFile(\"bitbucket/rest/user/response.json\")));\n\n    bitbucketPersonalAccessTokenFetcher.fetchPersonalAccessToken(\n        subject, BitbucketApiClient.BITBUCKET_SERVER);\n  }\n\n  @Test(\n      expectedExceptions = ScmUnauthorizedException.class,\n      expectedExceptionsMessageRegExp = \"Username is not authorized in bitbucket OAuth provider.\")\n  public void shouldThrowUnauthorizedExceptionWhenUserNotLoggedIn() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenThrow(UnauthorizedException.class);\n\n    bitbucketPersonalAccessTokenFetcher.fetchPersonalAccessToken(\n        subject, BitbucketApiClient.BITBUCKET_SERVER);\n  }\n\n  @Test\n  public void shouldReturnToken() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    OAuthToken oAuthToken =\n        newDto(OAuthToken.class).withToken(bitbucketOauthToken).withScope(\"repo\");\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenReturn(oAuthToken);\n\n    stubFor(\n        get(urlEqualTo(\"/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer \" + bitbucketOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(\n                        BitbucketApiClient.BITBUCKET_OAUTH_SCOPES_HEADER,\n                        \"repository:write,account\")\n                    .withBodyFile(\"bitbucket/rest/user/response.json\")));\n\n    PersonalAccessToken token =\n        bitbucketPersonalAccessTokenFetcher.fetchPersonalAccessToken(\n            subject, BitbucketApiClient.BITBUCKET_SERVER);\n    assertNotNull(token);\n    assertTrue(token.getScmTokenName().startsWith(OAUTH_2_PREFIX));\n  }\n\n  @Test\n  public void shouldValidatePersonalToken() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer \" + bitbucketOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(\n                        BitbucketApiClient.BITBUCKET_OAUTH_SCOPES_HEADER,\n                        \"repository:write,account\")\n                    .withBodyFile(\"bitbucket/rest/user/response.json\")));\n\n    PersonalAccessTokenParams params =\n        new PersonalAccessTokenParams(\n            \"https://bitbucket.org\",\n            \"provider\",\n            \"params-name\",\n            \"tid-23434\",\n            bitbucketOauthToken,\n            null);\n\n    Optional<Pair<Boolean, String>> valid = bitbucketPersonalAccessTokenFetcher.isValid(params);\n    assertTrue(valid.isPresent());\n    assertTrue(valid.get().first);\n  }\n\n  @Test\n  public void shouldValidateOauthToken() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer \" + bitbucketOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(\n                        BitbucketApiClient.BITBUCKET_OAUTH_SCOPES_HEADER,\n                        \"repository:write,account\")\n                    .withBodyFile(\"bitbucket/rest/user/response.json\")));\n\n    PersonalAccessTokenParams params =\n        new PersonalAccessTokenParams(\n            \"https://bitbucket.org\",\n            \"provider\",\n            OAUTH_2_PREFIX + \"-params-name\",\n            \"tid-23434\",\n            bitbucketOauthToken,\n            null);\n\n    Optional<Pair<Boolean, String>> valid = bitbucketPersonalAccessTokenFetcher.isValid(params);\n    assertTrue(valid.isPresent());\n    assertTrue(valid.get().first);\n  }\n\n  @Test\n  public void shouldNotValidateExpiredOauthToken() throws Exception {\n    stubFor(get(urlEqualTo(\"/user\")).willReturn(aResponse().withStatus(HTTP_UNAUTHORIZED)));\n\n    PersonalAccessTokenParams params =\n        new PersonalAccessTokenParams(\n            \"https://bitbucket.org\",\n            \"provider\",\n            OAUTH_2_PREFIX + \"-token-name\",\n            \"tid-23434\",\n            bitbucketOauthToken,\n            null);\n\n    assertFalse(bitbucketPersonalAccessTokenFetcher.isValid(params).isPresent());\n  }\n\n  @Test(\n      expectedExceptions = ScmUnauthorizedException.class,\n      expectedExceptionsMessageRegExp = \"Username is not authorized in bitbucket OAuth provider.\")\n  public void shouldThrowUnauthorizedExceptionIfTokenIsNotValid() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    OAuthToken oAuthToken = newDto(OAuthToken.class).withToken(bitbucketOauthToken).withScope(\"\");\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenReturn(oAuthToken);\n    stubFor(\n        get(urlEqualTo(\"/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token \" + bitbucketOauthToken))\n            .willReturn(aResponse().withStatus(HTTP_UNAUTHORIZED)));\n\n    bitbucketPersonalAccessTokenFetcher.fetchPersonalAccessToken(\n        subject, BitbucketApiClient.BITBUCKET_SERVER);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketScmFileResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.AssertJUnit.assertEquals;\nimport static org.testng.AssertJUnit.assertFalse;\nimport static org.testng.AssertJUnit.assertNotNull;\nimport static org.testng.AssertJUnit.assertTrue;\n\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketScmFileResolverTest {\n\n  BitbucketURLParser bitbucketURLParser;\n\n  @Mock private URLFetcher urlFetcher;\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n  @Mock private BitbucketApiClient bitbucketApiClient;\n\n  private BitbucketScmFileResolver bitbucketScmFileResolver;\n\n  @BeforeMethod\n  protected void init() {\n    bitbucketURLParser = new BitbucketURLParser(devfileFilenamesProvider);\n    assertNotNull(this.bitbucketURLParser);\n    bitbucketScmFileResolver =\n        new BitbucketScmFileResolver(\n            bitbucketURLParser, urlFetcher, personalAccessTokenManager, bitbucketApiClient);\n    assertNotNull(this.bitbucketScmFileResolver);\n  }\n\n  /** Check url which is not a Gitlab url can't be accepted by this resolver */\n  @Test\n  public void checkInvalidAcceptUrl() {\n    // shouldn't be accepted\n    assertFalse(bitbucketScmFileResolver.accept(\"http://foobar.com\"));\n  }\n\n  /** Check <Bitbucket> url will be be accepted by this resolver */\n  @Test\n  public void checkValidAcceptUrl() {\n    // should be accepted\n    assertTrue(bitbucketScmFileResolver.accept(\"http://bitbucket.org/test/repo.git\"));\n  }\n\n  @Test\n  public void shouldReturnContentFromUrlFetcher() throws Exception {\n    final String rawContent = \"raw_content\";\n    final String filename = \"devfile.yaml\";\n    when(bitbucketApiClient.getFileContent(\n            eq(\"test\"), eq(\"repo\"), eq(\"HEAD\"), eq(\"devfile.yaml\"), eq(\"my-token\")))\n        .thenReturn(rawContent);\n    var personalAccessToken = new PersonalAccessToken(\"foo\", \"provider\", \"che\", \"my-token\");\n    when(personalAccessTokenManager.getAndStore(anyString())).thenReturn(personalAccessToken);\n\n    String content =\n        bitbucketScmFileResolver.fileContent(\"http://bitbucket.org/test/repo.git\", filename);\n\n    assertEquals(content, rawContent);\n  }\n\n  @Test\n  public void shouldFetchContentWithoutAuthentication() throws Exception {\n    // given\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenThrow(new ScmUnauthorizedException(\"message\", \"bitbucket\", \"v1\", \"url\"));\n\n    // when\n    bitbucketScmFileResolver.fileContent(\"https://bitbucket.org/username/repo.git\", \"devfile.yaml\");\n\n    // then\n    verify(urlFetcher).fetch(anyString());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketURLParserTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.lenient;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/** Validate operations performed by the Bitbucket parser */\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketURLParserTest {\n\n  @Mock private URLFetcher urlFetcher;\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  /** Instance of component that will be tested. */\n  @InjectMocks private BitbucketURLParser bitbucketURLParser;\n\n  @BeforeMethod\n  public void init() {\n    lenient().when(urlFetcher.fetchSafely(any(String.class))).thenReturn(\"\");\n  }\n\n  /** Check URLs are valid with regexp */\n  @Test(dataProvider = \"UrlsProvider\")\n  public void checkRegexp(String url) {\n    assertTrue(bitbucketURLParser.isValid(url), \"url \" + url + \" is invalid\");\n  }\n\n  @Test\n  public void shouldParseWithBranch() {\n    BitbucketUrl bitbucketUrl =\n        bitbucketURLParser.parse(\"https://bitbucket.org/eclipse/che\", \"branch\");\n    assertEquals(bitbucketUrl.getBranch(), \"branch\");\n  }\n\n  @Test\n  public void shouldParseWithUrlBranch() {\n    BitbucketUrl bitbucketUrl =\n        bitbucketURLParser.parse(\"https://bitbucket.org/eclipse/che/src/master/\", \"branch\");\n    assertEquals(bitbucketUrl.getBranch(), \"master\");\n  }\n\n  /** Compare parsing */\n  @Test(dataProvider = \"parsing\")\n  public void checkParsing(String url, String username, String repository, String branch) {\n    BitbucketUrl bitbucketUrl = bitbucketURLParser.parse(url, null);\n\n    assertEquals(bitbucketUrl.getWorkspaceId(), username);\n    assertEquals(bitbucketUrl.getRepository(), repository);\n    assertEquals(bitbucketUrl.getBranch(), branch);\n  }\n\n  /** Compare parsing */\n  @Test(dataProvider = \"parsingBadRepository\")\n  public void checkParsingBadRepositoryDoNotModifiesInitialInput(String url, String repository) {\n    BitbucketUrl bitbucketUrl = bitbucketURLParser.parse(url, null);\n    assertEquals(bitbucketUrl.getRepository(), repository);\n  }\n\n  @DataProvider(name = \"UrlsProvider\")\n  public Object[][] urls() {\n    return new Object[][] {\n      {\"https://bitbucket.org/eclipse/che\"},\n      {\"https://bitbucket.org/eclipse/che123\"},\n      {\"https://bitbucket.org/eclipse/che/\"},\n      {\"https://bitbucket.org/eclipse/che/src/4.2.x\"},\n      {\"https://bitbucket.org/eclipse/che/src/master/\"},\n      {\"https://bitbucket.org/eclipse/che.git\"},\n      {\"https://bitbucket.org/eclipse/che.with.dots.git\"},\n      {\"https://bitbucket.org/eclipse/che-with-hyphen\"},\n      {\"https://bitbucket.org/eclipse/che-with-hyphen.git\"},\n      {\"git@bitbucket.org:eclipse/che\"},\n      {\"git@bitbucket.org:eclipse/che123\"},\n      {\"git@bitbucket.org:eclipse/che/\"},\n      {\"git@bitbucket.org:eclipse/che/src/4.2.x\"},\n      {\"git@bitbucket.org:eclipse/che/src/master/\"},\n      {\"git@bitbucket.org:eclipse/che.git\"},\n      {\"git@bitbucket.org:eclipse/che.with.dots.git\"},\n      {\"git@bitbucket.org:eclipse/che-with-hyphen\"},\n      {\"git@bitbucket.org:eclipse/che-with-hyphen.git\"},\n      {\"https://username@bitbucket.org/eclipse/che\"},\n      {\"https://username@bitbucket.org/eclipse/che123\"},\n      {\"https://username@bitbucket.org/eclipse/che/\"},\n      {\"https://username@bitbucket.org/eclipse/che/src/4.2.x\"},\n      {\"https://username@bitbucket.org/eclipse/che/src/master/\"},\n      {\"https://username@bitbucket.org/eclipse/che.git\"},\n      {\"https://username@bitbucket.org/eclipse/che.with.dots.git\"},\n      {\"https://username@bitbucket.org/eclipse/che-with-hyphen\"},\n      {\"https://username@bitbucket.org/eclipse/che-with-hyphen.git\"}\n    };\n  }\n\n  @DataProvider(name = \"parsing\")\n  public Object[][] expectedParsing() {\n    return new Object[][] {\n      {\"https://bitbucket.org/eclipse/che\", \"eclipse\", \"che\", null},\n      {\"https://bitbucket.org/eclipse/che123\", \"eclipse\", \"che123\", null},\n      {\"https://bitbucket.org/eclipse/che.git\", \"eclipse\", \"che\", null},\n      {\"https://bitbucket.org/eclipse/che.with.dot.git\", \"eclipse\", \"che.with.dot\", null},\n      {\"https://bitbucket.org/eclipse/-.git\", \"eclipse\", \"-\", null},\n      {\"https://bitbucket.org/eclipse/-j.git\", \"eclipse\", \"-j\", null},\n      {\"https://bitbucket.org/eclipse/-\", \"eclipse\", \"-\", null},\n      {\"https://bitbucket.org/eclipse/che-with-hyphen\", \"eclipse\", \"che-with-hyphen\", null},\n      {\"https://bitbucket.org/eclipse/che-with-hyphen.git\", \"eclipse\", \"che-with-hyphen\", null},\n      {\"https://bitbucket.org/eclipse/che/\", \"eclipse\", \"che\", null},\n      {\"https://bitbucket.org/eclipse/repositorygit\", \"eclipse\", \"repositorygit\", null},\n      {\"git@bitbucket.org:eclipse/che\", \"eclipse\", \"che\", null},\n      {\"git@bitbucket.org:eclipse/che123\", \"eclipse\", \"che123\", null},\n      {\"git@bitbucket.org:eclipse/che.git\", \"eclipse\", \"che\", null},\n      {\"git@bitbucket.org:eclipse/che.with.dot.git\", \"eclipse\", \"che.with.dot\", null},\n      {\"git@bitbucket.org:eclipse/-.git\", \"eclipse\", \"-\", null},\n      {\"git@bitbucket.org:eclipse/-j.git\", \"eclipse\", \"-j\", null},\n      {\"git@bitbucket.org:eclipse/-\", \"eclipse\", \"-\", null},\n      {\"git@bitbucket.org:eclipse/che-with-hyphen\", \"eclipse\", \"che-with-hyphen\", null},\n      {\"git@bitbucket.org:eclipse/che-with-hyphen.git\", \"eclipse\", \"che-with-hyphen\", null},\n      {\"git@bitbucket.org:eclipse/repositorygit\", \"eclipse\", \"repositorygit\", null},\n      {\"https://bitbucket.org/eclipse/che/src/4.2.x\", \"eclipse\", \"che\", \"4.2.x\"},\n      {\"https://bitbucket.org/eclipse/che/src/master/\", \"eclipse\", \"che\", \"master\"}\n    };\n  }\n\n  @DataProvider(name = \"parsingBadRepository\")\n  public Object[][] parsingBadRepository() {\n    return new Object[][] {\n      {\"https://bitbucket.org/eclipse/che .git\", \"che .git\"},\n      {\"https://bitbucket.org/eclipse/.git\", \".git\"},\n      {\"https://bitbucket.org/eclipse/myB@dR&pository.git\", \"myB@dR&pository.git\"},\n      {\"https://bitbucket.org/eclipse/.\", \".\"},\n      {\"https://bitbucket.org/eclipse/івапівап.git\", \"івапівап.git\"},\n      {\"https://bitbucket.org/eclipse/ \", \" \"},\n      {\"https://bitbucket.org/eclipse/.\", \".\"},\n      {\"https://bitbucket.org/eclipse/ .git\", \" .git\"},\n      {\"git@bitbucket.org:eclipse/che .git\", \"che .git\"},\n      {\"git@bitbucket.org:eclipse/.git\", \".git\"},\n      {\"git@bitbucket.org:eclipse/myB@dR&pository.git\", \"myB@dR&pository.git\"},\n      {\"git@bitbucket.org:eclipse/.\", \".\"},\n      {\"git@bitbucket.org:eclipse/івапівап.git\", \"івапівап.git\"},\n      {\"git@bitbucket.org:eclipse/ \", \" \"},\n      {\"git@bitbucket.org:eclipse/.\", \".\"},\n      {\"git@bitbucket.org:eclipse/ .git\", \" .git\"}\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketUrlTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport java.util.Arrays;\nimport java.util.Iterator;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl.DevfileLocation;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/** Test of {@Link BitbucketUrl} Note: The parser is also testing the object */\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketUrlTest {\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  /** Parser used to create the url. */\n  @InjectMocks private BitbucketURLParser bitbucketURLParser;\n\n  /** Instance of the url created */\n  private BitbucketUrl bitbucketUrl;\n\n  /** Setup objects/ */\n  @BeforeMethod\n  protected void init() {\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n    this.bitbucketUrl = this.bitbucketURLParser.parse(\"https://bitbucket.org/eclipse/che\", null);\n    assertNotNull(this.bitbucketUrl);\n  }\n\n  /** Check when there is devfile in the repository */\n  @Test\n  public void checkDevfileLocation() {\n    lenient()\n        .when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n\n    assertEquals(bitbucketUrl.devfileFileLocations().size(), 2);\n    Iterator<DevfileLocation> iterator = bitbucketUrl.devfileFileLocations().iterator();\n    assertEquals(\n        iterator.next().location(), \"https://bitbucket.org/eclipse/che/raw/HEAD/devfile.yaml\");\n\n    assertEquals(iterator.next().location(), \"https://bitbucket.org/eclipse/che/raw/HEAD/foo.bar\");\n  }\n\n  @Test\n  public void shouldReturnDevfileLocationBySSHUrl() {\n    bitbucketUrl = bitbucketURLParser.parse(\"git@bitbucket.org:eclipse/che\", null);\n\n    lenient()\n        .when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n\n    assertEquals(bitbucketUrl.devfileFileLocations().size(), 2);\n    Iterator<DevfileLocation> iterator = bitbucketUrl.devfileFileLocations().iterator();\n    assertEquals(\n        iterator.next().location(), \"https://bitbucket.org/eclipse/che/raw/HEAD/devfile.yaml\");\n\n    assertEquals(iterator.next().location(), \"https://bitbucket.org/eclipse/che/raw/HEAD/foo.bar\");\n  }\n\n  @Test\n  public void shouldReturnEmptyCredentials() {\n    // when\n    BitbucketUrl url =\n        this.bitbucketURLParser.parse(\"https://user@bitbucket.org/eclipse/che\", null);\n    // then\n    assertTrue(url.getCredentials().isEmpty());\n  }\n\n  /** Check the original repository */\n  @Test\n  public void checkRepositoryLocation() {\n    assertEquals(bitbucketUrl.repositoryLocation(), \"https://bitbucket.org/eclipse/che.git\");\n  }\n\n  @Test\n  public void shouldReturnRepositoryLocationBySSHUrl() {\n    bitbucketUrl = bitbucketURLParser.parse(\"git@bitbucket.org:eclipse/che\", null);\n\n    assertEquals(bitbucketUrl.repositoryLocation(), \"git@bitbucket.org:eclipse/che.git\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/test/resources/__files/bitbucket/rest/user/email/response.json",
    "content": "{\n  \"values\": [{\"email\" :  \"bitbucketuser@email.com\"}]\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/test/resources/__files/bitbucket/rest/user/response.json",
    "content": "{\n  \"username\": \"user\",\n  \"display_name\": \"Bitbucket User\",\n  \"account_id\": \"bitbucket-user_id_123\"\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2023 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n%nopex</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-factory-bitbucket-server</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Factory Resolver Bitbucket Server</name>\n    <properties>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.validation</groupId>\n            <artifactId>jakarta.validation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-bitbucket</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-inject</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.github.tomakehurst</groupId>\n            <artifactId>wiremock-jre8-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>jcl-over-slf4j</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.wiremock</groupId>\n            <artifactId>wiremock-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerApiProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.base.Splitter;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketServerApiClient;\nimport org.eclipse.che.api.factory.server.bitbucket.server.NoopBitbucketServerApiClient;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.lang.StringUtils;\nimport org.eclipse.che.inject.ConfigurationException;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.eclipse.che.security.oauth1.NoopOAuthAuthenticator;\nimport org.eclipse.che.security.oauth1.OAuthAuthenticator;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n@Singleton\npublic class BitbucketServerApiProvider implements Provider<BitbucketServerApiClient> {\n\n  private static final Logger LOG = LoggerFactory.getLogger(BitbucketServerApiProvider.class);\n\n  private final BitbucketServerApiClient bitbucketServerApiClient;\n  private final String apiEndpoint;\n  private final OAuthAPI oAuthAPI;\n\n  @Inject\n  public BitbucketServerApiProvider(\n      @Nullable @Named(\"che.integration.bitbucket.server_endpoints\") String bitbucketEndpoints,\n      @Named(\"che.oauth.bitbucket.endpoint\") String bitbucketOauthEndpoint,\n      @Named(\"che.api\") String apiEndpoint,\n      OAuthAPI oAuthAPI,\n      Set<OAuthAuthenticator> authenticators) {\n    this.apiEndpoint = apiEndpoint;\n    this.oAuthAPI = oAuthAPI;\n    bitbucketServerApiClient = doGet(bitbucketEndpoints, bitbucketOauthEndpoint, authenticators);\n    LOG.debug(\"Bitbucket server api is used {}\", bitbucketServerApiClient);\n  }\n\n  @Override\n  public BitbucketServerApiClient get() {\n    return bitbucketServerApiClient;\n  }\n\n  private BitbucketServerApiClient doGet(\n      String rawBitbucketEndpoints,\n      String bitbucketOauthEndpoint,\n      Set<OAuthAuthenticator> authenticators) {\n    boolean isBitbucketCloud = bitbucketOauthEndpoint.equals(\"https://bitbucket.org\");\n    if (isBitbucketCloud && isNullOrEmpty(rawBitbucketEndpoints)) {\n      return new NoopBitbucketServerApiClient();\n    } else if (!isBitbucketCloud && isNullOrEmpty(rawBitbucketEndpoints)) {\n      throw new ConfigurationException(\n          \"`che.integration.bitbucket.server_endpoints` bitbucket configuration is missing.\"\n              + \" It should contain values from 'che.oauth.bitbucket.endpoint'\");\n    } else if (isBitbucketCloud && !isNullOrEmpty(rawBitbucketEndpoints)) {\n      return new HttpBitbucketServerApiClient(\n          sanitizedEndpoints(rawBitbucketEndpoints).get(0),\n          new NoopOAuthAuthenticator(),\n          oAuthAPI,\n          apiEndpoint);\n    } else {\n      bitbucketOauthEndpoint = StringUtils.trimEnd(bitbucketOauthEndpoint, '/');\n      if (!sanitizedEndpoints(rawBitbucketEndpoints).contains(bitbucketOauthEndpoint)) {\n        throw new ConfigurationException(\n            \"`che.integration.bitbucket.server_endpoints` must contain `\"\n                + bitbucketOauthEndpoint\n                + \"` value\");\n      } else {\n        Optional<OAuthAuthenticator> authenticator = authenticators.stream().findFirst();\n        if (authenticator.isEmpty()) {\n          throw new ConfigurationException(\n              \"'che.oauth.bitbucket.endpoint' is set but BitbucketServerOAuthAuthenticator is not deployed correctly\");\n        }\n        return new HttpBitbucketServerApiClient(\n            bitbucketOauthEndpoint, authenticator.get(), oAuthAPI, apiEndpoint);\n      }\n    }\n  }\n\n  private static List<String> sanitizedEndpoints(String rawBitbucketEndpoints) {\n    return Splitter.on(\",\").splitToList(rawBitbucketEndpoints).stream()\n        .map(s -> StringUtils.trimEnd(s, '/'))\n        .collect(Collectors.toList());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerAuthorizingFactoryParametersResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.eclipse.che.api.factory.shared.Constants.REVISION_PARAMETER_NAME;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.factory.server.BaseFactoryParameterResolver;\nimport org.eclipse.che.api.factory.server.FactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryVisitor;\nimport org.eclipse.che.api.factory.shared.dto.ScmInfoDto;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/**\n * Provides Factory Parameters resolver for both public and private bitbucket repositories.\n *\n * @author Max Shaposhnyk\n */\n@Singleton\npublic class BitbucketServerAuthorizingFactoryParametersResolver\n    extends BaseFactoryParameterResolver implements FactoryParametersResolver {\n\n  private static final String PROVIDER_NAME = \"bitbucket-server\";\n\n  private final URLFactoryBuilder urlFactoryBuilder;\n  private final URLFetcher urlFetcher;\n\n  /** Parser which will allow to check validity of URLs and create objects. */\n  private final BitbucketServerURLParser bitbucketURLParser;\n\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n\n  @Inject\n  public BitbucketServerAuthorizingFactoryParametersResolver(\n      URLFactoryBuilder urlFactoryBuilder,\n      URLFetcher urlFetcher,\n      BitbucketServerURLParser bitbucketURLParser,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      AuthorisationRequestManager authorisationRequestManager) {\n    super(authorisationRequestManager, urlFactoryBuilder, PROVIDER_NAME);\n    this.urlFactoryBuilder = urlFactoryBuilder;\n    this.urlFetcher = urlFetcher;\n    this.bitbucketURLParser = bitbucketURLParser;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n  }\n\n  /**\n   * Check if this resolver can be used with the given parameters.\n   *\n   * @param factoryParameters map of parameters dedicated to factories\n   * @return true if it will be accepted by the resolver implementation or false if it is not\n   *     accepted\n   */\n  @Override\n  public boolean accept(@NotNull final Map<String, String> factoryParameters) {\n    return factoryParameters.containsKey(URL_PARAMETER_NAME)\n        && bitbucketURLParser.isValid(factoryParameters.get(URL_PARAMETER_NAME));\n  }\n\n  @Override\n  public String getProviderName() {\n    return PROVIDER_NAME;\n  }\n\n  /**\n   * Create factory object based on provided parameters\n   *\n   * @param factoryParameters map containing factory data parameters provided through URL\n   * @throws BadRequestException when data are invalid\n   */\n  @Override\n  public FactoryMetaDto createFactory(@NotNull final Map<String, String> factoryParameters)\n      throws ApiException {\n\n    // no need to check null value of url parameter as accept() method has performed the check\n    final BitbucketServerUrl bitbucketServerUrl =\n        bitbucketURLParser.parse(\n            factoryParameters.get(URL_PARAMETER_NAME),\n            factoryParameters.get(REVISION_PARAMETER_NAME));\n    // create factory from the following location if location exists, else create default factory\n    return createFactory(\n        factoryParameters,\n        bitbucketServerUrl,\n        new BitbucketFactoryVisitor(bitbucketServerUrl),\n        new BitbucketServerAuthorizingFileContentProvider(\n            bitbucketServerUrl, urlFetcher, personalAccessTokenManager));\n  }\n\n  /**\n   * Visitor that puts the default devfile or updates devfile projects into the Bitbucket Factory,\n   * if needed.\n   */\n  private class BitbucketFactoryVisitor implements FactoryVisitor {\n\n    private final BitbucketServerUrl bitbucketServerUrl;\n\n    private BitbucketFactoryVisitor(BitbucketServerUrl bitbucketServerUrl) {\n      this.bitbucketServerUrl = bitbucketServerUrl;\n    }\n\n    @Override\n    public FactoryDevfileV2Dto visit(FactoryDevfileV2Dto factoryDto) {\n      ScmInfoDto scmInfo =\n          newDto(ScmInfoDto.class)\n              .withScmProviderName(bitbucketServerUrl.getProviderName())\n              .withRepositoryUrl(bitbucketServerUrl.repositoryLocation());\n      if (bitbucketServerUrl.getBranch() != null) {\n        String branch = bitbucketServerUrl.getBranch();\n        scmInfo.withBranch(\n            branch.startsWith(\"refs%2Fheads%2F\")\n                ? branch.substring(branch.lastIndexOf(\"%2F\") + 3)\n                : branch);\n      }\n      return factoryDto.withScmInfo(scmInfo);\n    }\n  }\n\n  @Override\n  public RemoteFactoryUrl parseFactoryUrl(String factoryUrl) throws ApiException {\n    return bitbucketURLParser.parse(factoryUrl, null);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerAuthorizingFileContentProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport org.eclipse.che.api.factory.server.scm.AuthorizingFileContentProvider;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/**\n * Bitbucket Server specific file content provider. Files are retrieved using bitbucket Server REST\n * API and personal access token based authentication is performed during requests.\n */\npublic class BitbucketServerAuthorizingFileContentProvider\n    extends AuthorizingFileContentProvider<BitbucketServerUrl> {\n\n  public BitbucketServerAuthorizingFileContentProvider(\n      BitbucketServerUrl bitbucketServerUrl,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(bitbucketServerUrl, urlFetcher, personalAccessTokenManager);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerModule.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketServerApiClient;\nimport org.eclipse.che.api.factory.server.scm.GitUserDataFetcher;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher;\n\npublic class BitbucketServerModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    Multibinder<PersonalAccessTokenFetcher> tokenFetcherMultibinder =\n        Multibinder.newSetBinder(binder(), PersonalAccessTokenFetcher.class);\n    tokenFetcherMultibinder.addBinding().to(BitbucketServerPersonalAccessTokenFetcher.class);\n    bind(BitbucketServerApiClient.class).toProvider(BitbucketServerApiProvider.class);\n    Multibinder<GitUserDataFetcher> gitUserDataMultibinder =\n        Multibinder.newSetBinder(binder(), GitUserDataFetcher.class);\n    gitUserDataMultibinder.addBinding().to(BitbucketServerUserDataFetcher.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static java.lang.String.format;\nimport static java.lang.String.valueOf;\n\nimport com.google.common.collect.ImmutableSet;\nimport java.net.URL;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketPersonalAccessToken;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketServerApiClient;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketUser;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenParams;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.eclipse.che.security.oauth1.NoopOAuthAuthenticator;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Bitbucket implementation for {@link PersonalAccessTokenFetcher}. Right now returns {@code null}\n * for all possible SCM URL-s (which is valid value) but later will be extended to fully featured\n * class.\n */\npublic class BitbucketServerPersonalAccessTokenFetcher implements PersonalAccessTokenFetcher {\n\n  private static final Logger LOG =\n      LoggerFactory.getLogger(BitbucketServerPersonalAccessTokenFetcher.class);\n\n  private static final String OAUTH_PROVIDER_NAME = \"bitbucket-server\";\n\n  private static final String TOKEN_NAME_TEMPLATE = \"che-token-<%s>-<%s>\";\n  public static final Set<String> DEFAULT_TOKEN_SCOPE =\n      ImmutableSet.of(\"PROJECT_WRITE\", \"REPO_WRITE\");\n  private final BitbucketServerApiClient bitbucketServerApiClient;\n  private final URL apiEndpoint;\n  private final OAuthAPI oAuthAPI;\n\n  @Inject\n  public BitbucketServerPersonalAccessTokenFetcher(\n      BitbucketServerApiClient bitbucketServerApiClient,\n      @Named(\"che.api\") URL apiEndpoint,\n      OAuthAPI oAuthAPI) {\n    this.bitbucketServerApiClient = bitbucketServerApiClient;\n    this.apiEndpoint = apiEndpoint;\n    this.oAuthAPI = oAuthAPI;\n  }\n\n  @Override\n  public PersonalAccessToken refreshPersonalAccessToken(Subject cheUser, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException {\n    // #fetchPersonalAccessToken does the same thing as #refreshPersonalAccessToken\n    return fetchOrRefreshPersonalAccessToken(cheUser, scmServerUrl);\n  }\n\n  @Override\n  public PersonalAccessToken fetchPersonalAccessToken(Subject cheUser, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException {\n    return fetchOrRefreshPersonalAccessToken(cheUser, scmServerUrl);\n  }\n\n  private PersonalAccessToken fetchOrRefreshPersonalAccessToken(\n      Subject cheUser, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException {\n    if (!bitbucketServerApiClient.isConnected(scmServerUrl)) {\n      LOG.debug(\"not a  valid url {} for current fetcher \", scmServerUrl);\n      return null;\n    }\n\n    final String tokenName =\n        format(TOKEN_NAME_TEMPLATE, cheUser.getUserId(), apiEndpoint.getHost());\n    try {\n      BitbucketUser user = bitbucketServerApiClient.getUser();\n      LOG.debug(\"Current bitbucket user {} \", user);\n      // cleanup existed\n      List<BitbucketPersonalAccessToken> existingTokens =\n          bitbucketServerApiClient.getPersonalAccessTokens().stream()\n              .filter(p -> p.getName().equals(tokenName))\n              .collect(Collectors.toList());\n      for (BitbucketPersonalAccessToken existedToken : existingTokens) {\n        LOG.debug(\"Deleting existed che token {} {}\", existedToken.getId(), existedToken.getName());\n        bitbucketServerApiClient.deletePersonalAccessTokens(existedToken.getId());\n      }\n\n      BitbucketPersonalAccessToken token =\n          bitbucketServerApiClient.createPersonalAccessTokens(tokenName, DEFAULT_TOKEN_SCOPE);\n      LOG.debug(\"Token created = {} for {}\", token.getId(), token.getUser());\n      return new PersonalAccessToken(\n          scmServerUrl,\n          OAUTH_PROVIDER_NAME,\n          EnvironmentContext.getCurrent().getSubject().getUserId(),\n          null,\n          user.getSlug(),\n          token.getName(),\n          valueOf(token.getId()),\n          token.getToken());\n    } catch (ScmBadRequestException | ScmItemNotFoundException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public Optional<Boolean> isValid(PersonalAccessToken accessToken)\n      throws ScmCommunicationException, ScmUnauthorizedException {\n    if (!bitbucketServerApiClient.isConnected(accessToken.getScmProviderUrl())) {\n      // If BitBucket oAuth is not configured check the manually added user namespace token.\n      HttpBitbucketServerApiClient apiClient =\n          new HttpBitbucketServerApiClient(\n              accessToken.getScmProviderUrl(),\n              new NoopOAuthAuthenticator(),\n              oAuthAPI,\n              apiEndpoint.toString());\n      try {\n        apiClient.getUser(accessToken.getToken());\n        return Optional.of(Boolean.TRUE);\n      } catch (ScmItemNotFoundException\n          | ScmUnauthorizedException\n          | ScmCommunicationException exception) {\n        LOG.debug(\"not a valid url {} for current fetcher \", accessToken.getScmProviderUrl());\n        return Optional.empty();\n      }\n    }\n    try {\n      BitbucketPersonalAccessToken bitbucketPersonalAccessToken =\n          bitbucketServerApiClient.getPersonalAccessToken(\n              accessToken.getScmTokenId(),\n              // Pass oauth token to fetch personal access token\n              // TODO: rename the PersonalAccessToken interface to more generic name, so both OAuth\n              // and personal access token implementations would be suitable.\n              accessToken.getToken());\n      return Optional.of(DEFAULT_TOKEN_SCOPE.equals(bitbucketPersonalAccessToken.getPermissions()));\n    } catch (ScmItemNotFoundException e) {\n      return Optional.of(Boolean.FALSE);\n    }\n  }\n\n  @Override\n  public Optional<Pair<Boolean, String>> isValid(PersonalAccessTokenParams params)\n      throws ScmCommunicationException {\n    if (!bitbucketServerApiClient.isConnected(params.getScmProviderUrl())) {\n      // If BitBucket oAuth is not configured check the manually added user namespace token.\n      HttpBitbucketServerApiClient apiClient =\n          new HttpBitbucketServerApiClient(\n              params.getScmProviderUrl(),\n              new NoopOAuthAuthenticator(),\n              oAuthAPI,\n              apiEndpoint.toString());\n      try {\n        BitbucketUser user = apiClient.getUser(params.getToken());\n        return Optional.of(Pair.of(Boolean.TRUE, user.getName()));\n      } catch (ScmItemNotFoundException\n          | ScmUnauthorizedException\n          | ScmCommunicationException exception) {\n        if (exception instanceof ScmCommunicationException) {\n          ScmCommunicationException scmCommunicationException =\n              (ScmCommunicationException) exception;\n          if (scmCommunicationException.getStatusCode() == 495) {\n            throw scmCommunicationException;\n          }\n        }\n        LOG.debug(\"not a valid url {} for current fetcher \", params.getScmProviderUrl());\n        return Optional.empty();\n      }\n    }\n    try {\n      BitbucketUser user = bitbucketServerApiClient.getUser(params.getToken());\n      return Optional.of(Pair.of(Boolean.TRUE, user.getName()));\n    } catch (ScmItemNotFoundException | ScmUnauthorizedException e) {\n      return Optional.empty();\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerScmFileResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.eclipse.che.api.factory.server.ApiExceptionMapper.toApiException;\n\nimport java.io.IOException;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.factory.server.ScmFileResolver;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\n\n/** Bitbucket Server specific SCM file resolver. */\npublic class BitbucketServerScmFileResolver implements ScmFileResolver {\n\n  private final URLFetcher urlFetcher;\n  private final BitbucketServerURLParser bitbucketURLParser;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n\n  @Inject\n  public BitbucketServerScmFileResolver(\n      BitbucketServerURLParser bitbucketURLParser,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    this.urlFetcher = urlFetcher;\n    this.bitbucketURLParser = bitbucketURLParser;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n  }\n\n  @Override\n  public boolean accept(String repository) {\n    return bitbucketURLParser.isValid(repository);\n  }\n\n  @Override\n  public String fileContent(String repository, String filePath) throws ApiException {\n\n    BitbucketServerUrl bitbucketServerUrl = bitbucketURLParser.parse(repository, null);\n\n    try {\n      return fetchContent(bitbucketServerUrl, filePath, false);\n    } catch (DevfileException exception) {\n      // This catch might mean that the authentication was rejected by user, try to repeat the fetch\n      // without authentication flow.\n      try {\n        return fetchContent(bitbucketServerUrl, filePath, true);\n      } catch (DevfileException devfileException) {\n        throw toApiException(devfileException);\n      }\n    }\n  }\n\n  private String fetchContent(\n      BitbucketServerUrl bitbucketServerUrl, String filePath, boolean skipAuthentication)\n      throws DevfileException, NotFoundException {\n    try {\n      BitbucketServerAuthorizingFileContentProvider contentProvider =\n          new BitbucketServerAuthorizingFileContentProvider(\n              bitbucketServerUrl, urlFetcher, personalAccessTokenManager);\n      return skipAuthentication\n          ? contentProvider.fetchContentWithoutAuthentication(filePath)\n          : contentProvider.fetchContent(filePath);\n    } catch (IOException e) {\n      throw new NotFoundException(e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerURLParser.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.regex.Pattern.compile;\n\nimport com.google.common.base.Splitter;\nimport jakarta.validation.constraints.NotNull;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.StringUtils;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.eclipse.che.security.oauth1.BitbucketServerOAuthAuthenticator;\n\n/**\n * Parser of String Bitbucket Server URLs and provide {@link BitbucketServerUrl} objects.\n *\n * @author Max Shaposhnyk\n */\n@Singleton\npublic class BitbucketServerURLParser {\n\n  private final DevfileFilenamesProvider devfileFilenamesProvider;\n  private final OAuthAPI oAuthAPI;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n  private static final List<String> bitbucketUrlPatternTemplates =\n      List.of(\n          \"^(?<scheme>%s)://(?<host>%s)/scm/~(?<user>[^/]+)/(?<repo>.*).git$\",\n          \"^(?<scheme>%s)://(?<host>%s)/users/(?<user>[^/]+)/repos/(?<repo>[^/]+)/browse(\\\\?at=(?<branch>.*))?\",\n          \"^(?<scheme>%s)://(?<host>%s)/users/(?<user>[^/]+)/repos/(?<repo>[^/]+)/?\",\n          \"^(?<scheme>%s)://(?<host>%s)/scm/(?<project>[^/~]+)/(?<repo>[^/]+).git\",\n          \"^(?<scheme>%s)://(?<host>%s)/projects/(?<project>[^/]+)/repos/(?<repo>[^/]+)/browse(\\\\?at=(?<branch>.*))?\",\n          \"^(?<scheme>%s)://git@(?<host>%s):?(?<port>\\\\d*)?/~(?<user>[^/]+)/(?<repo>.*).git$\",\n          \"^(?<scheme>%s)://git@(?<host>%s):?(?<port>\\\\d*)?/(?<project>[^/]+)/(?<repo>.*).git$\");\n  private final List<Pattern> bitbucketUrlPatterns = new ArrayList<>();\n  private static final String OAUTH_PROVIDER_NAME = \"bitbucket-server\";\n\n  @Inject\n  public BitbucketServerURLParser(\n      @Nullable @Named(\"che.integration.bitbucket.server_endpoints\") String bitbucketEndpoints,\n      DevfileFilenamesProvider devfileFilenamesProvider,\n      OAuthAPI oAuthAPI,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    this.devfileFilenamesProvider = devfileFilenamesProvider;\n    this.oAuthAPI = oAuthAPI;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n    if (!isNullOrEmpty(bitbucketEndpoints)) {\n      for (String bitbucketEndpoint : Splitter.on(\",\").split(bitbucketEndpoints)) {\n        String trimmedEndpoint = StringUtils.trimEnd(bitbucketEndpoint, '/');\n        bitbucketUrlPatterns.addAll(getUrlPatterns(trimmedEndpoint));\n      }\n    }\n  }\n\n  private boolean isUserTokenPresent(String repositoryUrl) {\n    String serverUrl = getServerUrl(repositoryUrl);\n    URI uri = URI.create(repositoryUrl);\n    String schema = uri.getScheme();\n    String host = uri.getHost();\n    // Handle IPv6 addresses: escape brackets for regex\n    final String hostForRegex;\n    if (host != null && host.startsWith(\"[\") && host.endsWith(\"]\")) {\n      hostForRegex = \"\\\\[\" + Pattern.quote(host.substring(1, host.length() - 1)) + \"\\\\]\";\n    } else if (host != null) {\n      hostForRegex = Pattern.quote(host);\n    } else {\n      hostForRegex = \"\";\n    }\n    // Escape scheme for regex to prevent injection\n    final String schemeForRegex = schema != null ? Pattern.quote(schema) : \"\";\n    if (bitbucketUrlPatternTemplates.stream()\n        .anyMatch(\n            t ->\n                Pattern.compile(format(t, schemeForRegex, hostForRegex))\n                    .matcher(repositoryUrl)\n                    .matches())) {\n      try {\n        Optional<PersonalAccessToken> token =\n            personalAccessTokenManager.get(\n                EnvironmentContext.getCurrent().getSubject(), null, serverUrl, null);\n        return token.isPresent() && token.get().getScmTokenName().equals(OAUTH_PROVIDER_NAME);\n      } catch (ScmConfigurationPersistenceException | ScmCommunicationException exception) {\n        return false;\n      }\n    }\n    return false;\n  }\n\n  public boolean isValid(@NotNull String url) {\n    if (!url.contains(\"://\")) {\n      return false;\n    } else if (!bitbucketUrlPatterns.isEmpty()) {\n      return bitbucketUrlPatterns.stream().anyMatch(pattern -> pattern.matcher(url).matches());\n    } else {\n      return\n      // If Bitbucket server URL is not configured try to find it in a manually added user namespace\n      // token.\n      isUserTokenPresent(url)\n          // Try to call an API request to see if the URL matches Bitbucket Server.\n          || (isApiRequestRelevant(url)\n              // Also check if the URL matches the Bitbucket Server url pattern.\n              && getUrlPatterns(getServerUrl(url)).stream()\n                  .anyMatch(pattern -> pattern.matcher(url).matches()));\n    }\n  }\n\n  private List<Pattern> getUrlPatterns(String url) {\n    URI uri = URI.create(url);\n    ArrayList<Pattern> patterns = new ArrayList<>();\n    String rawHost = uri.getHost();\n    // Handle IPv6 addresses: escape brackets for regex\n    final String hostForRegex;\n    if (rawHost != null && rawHost.startsWith(\"[\") && rawHost.endsWith(\"]\")) {\n      hostForRegex = \"\\\\[\" + Pattern.quote(rawHost.substring(1, rawHost.length() - 1)) + \"\\\\]\";\n    } else if (rawHost != null) {\n      hostForRegex = Pattern.quote(rawHost);\n    } else {\n      hostForRegex = \"\";\n    }\n    String portSuffix = uri.getPort() > 0 ? \":\" + uri.getPort() : \"\";\n    String pathSuffix = uri.getPath() != null ? Pattern.quote(uri.getPath()) : \"\";\n    bitbucketUrlPatternTemplates.forEach(\n        t -> {\n          String scheme = t.contains(\"git@\") ? \"ssh\" : uri.getScheme();\n          // Escape scheme for regex to prevent injection\n          String schemeForRegex = scheme != null ? Pattern.quote(scheme) : \"\";\n          String host = hostForRegex + portSuffix + pathSuffix;\n          patterns.add(Pattern.compile(format(t, schemeForRegex, host)));\n        });\n    return patterns;\n  }\n\n  private boolean isApiRequestRelevant(String repositoryUrl) {\n    try {\n      HttpBitbucketServerApiClient bitbucketServerApiClient =\n          new HttpBitbucketServerApiClient(\n              getServerUrl(repositoryUrl),\n              new BitbucketServerOAuthAuthenticator(\"\", \"\", \"\", \"\"),\n              oAuthAPI,\n              \"\");\n      // If the user request catches the unauthorised error, it means that the provided url\n      // belongs to Bitbucket.\n      bitbucketServerApiClient.getUser();\n    } catch (ScmItemNotFoundException | ScmCommunicationException e) {\n      return false;\n    } catch (ScmUnauthorizedException e) {\n      return true;\n    }\n    return false;\n  }\n\n  private String getServerUrl(String repositoryUrl) {\n    if (repositoryUrl.startsWith(\"ssh://git@\")) {\n      String substring = repositoryUrl.substring(10);\n      // Handle IPv6 addresses in SSH URLs (e.g., ssh://git@[2001:db8::1]:port/...)\n      if (substring.startsWith(\"[\")) {\n        int closingBracket = substring.indexOf(']');\n        if (closingBracket > 0) {\n          return \"https://\" + substring.substring(0, closingBracket + 1);\n        }\n      }\n      return \"https://\"\n          + substring.substring(\n              0, substring.contains(\":\") ? substring.indexOf(\":\") : substring.indexOf(\"/\"));\n    }\n    // Use URI parsing to properly handle IPv6 addresses\n    try {\n      URI uri = URI.create(repositoryUrl);\n      if (uri.getScheme() != null && uri.getHost() != null) {\n        String authority = uri.getRawAuthority();\n        if (authority == null) {\n          String host = uri.getHost();\n          boolean ipv6 = host != null && host.contains(\":\");\n          String hostForUrl = ipv6 ? \"[\" + host + \"]\" : host;\n          int port = uri.getPort();\n          authority = port == -1 ? hostForUrl : hostForUrl + \":\" + port;\n        }\n\n        if (authority != null) {\n          String serverUrl = uri.getScheme() + \"://\" + authority;\n          int authorityIdx = repositoryUrl.indexOf(authority);\n          if (authorityIdx >= 0) {\n            int pathIndex = authorityIdx + authority.length();\n            if (pathIndex < repositoryUrl.length() && repositoryUrl.charAt(pathIndex) == '/') {\n              return serverUrl;\n            }\n          }\n        }\n      }\n    } catch (IllegalArgumentException e) {\n      // Fall through to old logic if URI parsing fails\n    }\n    return repositoryUrl.substring(\n        0,\n        repositoryUrl.indexOf(\"/scm\") > 0\n            ? repositoryUrl.indexOf(\"/scm\")\n            : repositoryUrl.indexOf(\"/users\") > 0\n                ? repositoryUrl.indexOf(\"/users\")\n                : repositoryUrl.indexOf(\"/projects\") > 0\n                    ? repositoryUrl.indexOf(\"/projects\")\n                    : repositoryUrl.length());\n  }\n\n  private Optional<Matcher> getPatternMatcherByUrl(String url) {\n    URI uri = URI.create(url);\n    String scheme = uri.getScheme();\n    String host = uri.getHost();\n    // Handle IPv6 addresses: escape brackets for regex\n    final String hostForRegex;\n    if (host != null && host.startsWith(\"[\") && host.endsWith(\"]\")) {\n      // IPv6 address - strip brackets, quote the address, re-add escaped brackets\n      hostForRegex = \"\\\\[\" + Pattern.quote(host.substring(1, host.length() - 1)) + \"\\\\]\";\n    } else if (host != null) {\n      hostForRegex = Pattern.quote(host);\n    } else {\n      hostForRegex = \"\";\n    }\n    // Append port if present\n    String hostWithPort = hostForRegex;\n    if (uri.getPort() > 0) {\n      hostWithPort += \":\" + uri.getPort();\n    }\n    final String finalHostWithPort = hostWithPort;\n    // Escape scheme for regex to prevent injection\n    final String schemeForRegex = scheme != null ? Pattern.quote(scheme) : \"\";\n    return bitbucketUrlPatternTemplates.stream()\n        .map(t -> compile(format(t, schemeForRegex, finalHostWithPort)).matcher(url))\n        .filter(Matcher::matches)\n        .findAny();\n  }\n\n  /**\n   * Parses url-s like\n   * https://bitbucket.apps.cluster-cb82.cb82.example.opentlc.com/scm/test/test1.git into\n   * BitbucketUrl objects.\n   */\n  public BitbucketServerUrl parse(String url, @Nullable String revision) {\n\n    if (bitbucketUrlPatterns.isEmpty()) {\n      Optional<Matcher> matcherOptional = getPatternMatcherByUrl(url);\n      if (matcherOptional.isPresent()) {\n        return parse(matcherOptional.get(), revision);\n      }\n      throw new UnsupportedOperationException(\n          \"The Bitbucket integration is not configured properly and cannot be used at this moment.\"\n              + \"Please refer to docs to check the Bitbucket integration instructions\");\n    }\n\n    Matcher matcher =\n        bitbucketUrlPatterns.stream()\n            .map(pattern -> pattern.matcher(url))\n            .filter(Matcher::matches)\n            .findFirst()\n            .orElseThrow(\n                () ->\n                    new IllegalArgumentException(\n                        format(\n                            \"The given url %s is not a valid Bitbucket server URL. Check either URL or server configuration.\",\n                            url)));\n    return parse(matcher, revision).withUrl(url);\n  }\n\n  private BitbucketServerUrl parse(Matcher matcher, @Nullable String revision) {\n    String scheme = matcher.group(\"scheme\");\n    String host = matcher.group(\"host\");\n    String port = null;\n    try {\n      port = matcher.group(\"port\");\n    } catch (IllegalArgumentException e) {\n      // keep port with null, as the pattern doesn't have the port group\n    }\n    String user = null;\n    String project = null;\n    try {\n      user = matcher.group(\"user\");\n    } catch (IllegalArgumentException e) {\n      project = matcher.group(\"project\");\n    }\n    String repoName = matcher.group(\"repo\");\n    String branch = null;\n    try {\n      String branchFromUrl = matcher.group(\"branch\");\n      if (!isNullOrEmpty(branchFromUrl)) {\n        branch =\n            branchFromUrl.startsWith(\"refs/heads/\")\n                ? branchFromUrl.substring(11)\n                : (branchFromUrl.startsWith(\"refs%2Fheads%2F\")\n                    ? branchFromUrl.substring(15)\n                    : branchFromUrl);\n      }\n    } catch (IllegalArgumentException e) {\n      // keep branch with null, as the pattern doesn't have the branch group\n    }\n\n    return new BitbucketServerUrl()\n        .withScheme(scheme)\n        .withHostName(host)\n        .withPort(port)\n        .withProject(project)\n        .withUser(user)\n        .withRepository(repoName)\n        .withBranch(isNullOrEmpty(branch) ? revision : branch)\n        .withDevfileFilenames(devfileFilenamesProvider.getConfiguredDevfileFilenames());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerUrl.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static com.google.common.base.MoreObjects.firstNonNull;\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.StringJoiner;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.factory.server.urlfactory.DefaultFactoryUrl;\n\n/** Representation of a bitbucket Server URL, allowing to get details from it. */\npublic class BitbucketServerUrl extends DefaultFactoryUrl {\n\n  private final String NAME = \"bitbucket\";\n\n  /** Hostname of bitbucket URL */\n  private String hostName;\n\n  private String scheme;\n  private String port;\n\n  /** Project part of bitbucket URL */\n  private String project;\n\n  private String user;\n\n  /** Repository part of the URL. */\n  private String repository;\n\n  /** Branch name */\n  private String branch;\n\n  /** Devfile filenames list */\n  private final List<String> devfileFilenames = new ArrayList<>();\n\n  /**\n   * Creation of this instance is made by the parser so user may not need to create a new instance\n   * directly\n   */\n  protected BitbucketServerUrl() {}\n\n  @Override\n  public String getProviderName() {\n    return NAME;\n  }\n\n  @Override\n  public String getProviderUrl() {\n    return (scheme.equals(\"ssh\") ? \"https\" : scheme) + \"://\" + hostName;\n  }\n\n  /**\n   * Gets hostname of this bitbucket server url\n   *\n   * @return the project part\n   */\n  public String getHostName() {\n    return this.hostName;\n  }\n\n  public BitbucketServerUrl withHostName(String hostName) {\n    this.hostName = hostName;\n    return this;\n  }\n\n  public BitbucketServerUrl withScheme(String scheme) {\n    this.scheme = scheme;\n    return this;\n  }\n\n  public BitbucketServerUrl withPort(String port) {\n    this.port = port;\n    return this;\n  }\n\n  /**\n   * Gets project of this bitbucket server url\n   *\n   * @return the project part\n   */\n  public String getProject() {\n    return this.project;\n  }\n\n  public BitbucketServerUrl withProject(String project) {\n    this.project = project;\n    return this;\n  }\n\n  /**\n   * Gets repository of this bitbucket url\n   *\n   * @return the repository part\n   */\n  public String getRepository() {\n    return this.repository;\n  }\n\n  protected BitbucketServerUrl withRepository(String repository) {\n    this.repository = repository;\n    return this;\n  }\n\n  @Override\n  public void setDevfileFilename(String devfileName) {\n    this.devfileFilenames.clear();\n    this.devfileFilenames.add(devfileName);\n  }\n\n  protected BitbucketServerUrl withDevfileFilenames(List<String> devfileFilenames) {\n    this.devfileFilenames.addAll(devfileFilenames);\n    return this;\n  }\n\n  /**\n   * Gets branch of this bitbucket url\n   *\n   * @return the branch part\n   */\n  public String getBranch() {\n    return this.branch;\n  }\n\n  protected BitbucketServerUrl withBranch(String branch) {\n    if (!isNullOrEmpty(branch)) {\n      this.branch = branch;\n    }\n    return this;\n  }\n\n  /**\n   * Gets user of this bitbucket server url\n   *\n   * @return the user part\n   */\n  public String getUser() {\n    return this.user;\n  }\n\n  protected BitbucketServerUrl withUser(String user) {\n    if (!isNullOrEmpty(user)) {\n      this.user = user;\n    }\n    return this;\n  }\n\n  /**\n   * Provides list of configured devfile filenames with locations\n   *\n   * @return list of devfile filenames and locations\n   */\n  @Override\n  public List<DevfileLocation> devfileFileLocations() {\n    return devfileFilenames.stream().map(this::createDevfileLocation).collect(Collectors.toList());\n  }\n\n  private DevfileLocation createDevfileLocation(String devfileFilename) {\n    return new DevfileLocation() {\n      @Override\n      public Optional<String> filename() {\n        return Optional.of(devfileFilename);\n      }\n\n      @Override\n      public String location() {\n        return rawFileLocation(devfileFilename);\n      }\n    };\n  }\n\n  /**\n   * Provides location to raw content of specified file\n   *\n   * @return location of specified file in a repository\n   */\n  public String rawFileLocation(String fileName) {\n    StringJoiner joiner =\n        new StringJoiner(\"/\")\n            .add((scheme.equals(\"ssh\") ? \"https\" : scheme) + \"://\" + hostName)\n            .add(\"rest/api/1.0\")\n            .add(!isNullOrEmpty(user) && isNullOrEmpty(project) ? \"users\" : \"projects\")\n            .add(firstNonNull(user, project))\n            .add(\"repos\")\n            .add(repository)\n            .add(\"raw\")\n            .add(fileName);\n    String resultUrl = joiner.toString();\n    if (branch != null) {\n      resultUrl = resultUrl + \"?at=\" + branch;\n    }\n    return resultUrl;\n  }\n\n  /**\n   * Provides location to the repository part of the full bitbucket URL.\n   *\n   * @return location of the repository.\n   */\n  protected String repositoryLocation() {\n    if (scheme.equals(\"ssh\")) {\n      return String.format(\n          \"%s://git@%s:%s/%s/%s.git\",\n          scheme, hostName, port, (isNullOrEmpty(user) ? project : \"~\" + user), repository);\n    }\n    return scheme\n        + \"://\"\n        + hostName\n        + \"/scm/\"\n        + (isNullOrEmpty(user) ? project : \"~\" + user)\n        + \"/\"\n        + this.repository\n        + \".git\";\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerUserDataFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static java.util.stream.Collectors.toList;\n\nimport com.google.common.base.Splitter;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketServerApiClient;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketUser;\nimport org.eclipse.che.api.factory.server.scm.GitUserData;\nimport org.eclipse.che.api.factory.server.scm.GitUserDataFetcher;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.StringUtils;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.eclipse.che.security.oauth1.NoopOAuthAuthenticator;\n\n/** Bitbucket git user data retriever. */\npublic class BitbucketServerUserDataFetcher implements GitUserDataFetcher {\n\n  private final String OAUTH_PROVIDER_NAME = \"bitbucket-server\";\n  private final String apiEndpoint;\n\n  /** Bitbucket API client. */\n  private final BitbucketServerApiClient bitbucketServerApiClient;\n\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n  private final OAuthAPI oAuthAPI;\n\n  private final List<String> registeredBitbucketEndpoints;\n\n  @Inject\n  public BitbucketServerUserDataFetcher(\n      @Named(\"che.api\") String apiEndpoint,\n      @Nullable @Named(\"che.integration.bitbucket.server_endpoints\") String bitbucketEndpoints,\n      BitbucketServerApiClient bitbucketServerApiClient,\n      OAuthAPI oAuthAPI,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    this.oAuthAPI = oAuthAPI;\n    this.apiEndpoint = apiEndpoint;\n    this.bitbucketServerApiClient = bitbucketServerApiClient;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n    if (bitbucketEndpoints != null) {\n      this.registeredBitbucketEndpoints =\n          Splitter.on(\",\")\n              .splitToStream(bitbucketEndpoints)\n              .map(e -> StringUtils.trimEnd(e, '/'))\n              .collect(toList());\n    } else {\n      this.registeredBitbucketEndpoints = Collections.emptyList();\n    }\n  }\n\n  @Override\n  public GitUserData fetchGitUserData(String namespaceName)\n      throws ScmUnauthorizedException,\n          ScmCommunicationException,\n          ScmConfigurationPersistenceException,\n          ScmItemNotFoundException {\n    Subject cheSubject = EnvironmentContext.getCurrent().getSubject();\n    for (String bitbucketServerEndpoint : this.registeredBitbucketEndpoints) {\n      if (bitbucketServerApiClient.isConnected(bitbucketServerEndpoint)) {\n        try {\n          BitbucketUser user = bitbucketServerApiClient.getUser();\n          return new GitUserData(user.getDisplayName(), user.getEmailAddress());\n        } catch (ScmItemNotFoundException e) {\n          throw new ScmCommunicationException(e.getMessage(), e);\n        }\n      }\n    }\n\n    // Try go get user data using personal access token\n    Optional<PersonalAccessToken> personalAccessToken =\n        this.personalAccessTokenManager.get(cheSubject, OAUTH_PROVIDER_NAME, null, namespaceName);\n    if (personalAccessToken.isPresent()) {\n      PersonalAccessToken token = personalAccessToken.get();\n      HttpBitbucketServerApiClient httpBitbucketServerApiClient =\n          new HttpBitbucketServerApiClient(\n              StringUtils.trimEnd(token.getScmProviderUrl(), '/'),\n              new NoopOAuthAuthenticator(),\n              oAuthAPI,\n              this.apiEndpoint);\n\n      BitbucketUser user = httpBitbucketServerApiClient.getUser(token.getToken());\n      return new GitUserData(user.getDisplayName(), user.getEmailAddress());\n    }\n\n    throw new ScmCommunicationException(\"Failed to retrieve git user data from Bitbucket\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/HttpBitbucketServerApiClient.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.net.HttpURLConnection.HTTP_BAD_REQUEST;\nimport static java.net.HttpURLConnection.HTTP_NOT_FOUND;\nimport static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static java.time.Duration.ofSeconds;\n\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.JavaType;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.type.TypeFactory;\nimport com.google.common.base.Charsets;\nimport com.google.common.io.CharStreams;\nimport com.google.common.net.HttpHeaders;\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport jakarta.ws.rs.core.MediaType;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.UncheckedIOException;\nimport java.net.URI;\nimport java.net.URLDecoder;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.time.Duration;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.concurrent.Executors;\nimport java.util.function.Function;\nimport javax.net.ssl.SSLHandshakeException;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketApplicationProperties;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketPersonalAccessToken;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketServerApiClient;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketUser;\nimport org.eclipse.che.api.factory.server.bitbucket.server.Page;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.eclipse.che.security.oauth1.NoopOAuthAuthenticator;\nimport org.eclipse.che.security.oauth1.OAuthAuthenticationException;\nimport org.eclipse.che.security.oauth1.OAuthAuthenticator;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Implementation of @{@link BitbucketServerApiClient} that is using @{@link HttpClient} to\n * communicate with Bitbucket Server.\n */\npublic class HttpBitbucketServerApiClient implements BitbucketServerApiClient {\n\n  private static final ObjectMapper OM = new ObjectMapper();\n\n  private static final Logger LOG = LoggerFactory.getLogger(HttpBitbucketServerApiClient.class);\n  private static final Duration DEFAULT_HTTP_TIMEOUT = ofSeconds(10);\n  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();\n  public static final String USERNAME_HEADER = \"x-ausername\";\n  private final URI serverUri;\n  private final OAuthAuthenticator authenticator;\n  private final OAuthAPI oAuthAPI;\n  private final String apiEndpoint;\n  private final HttpClient httpClient;\n  private static final int SSL_ERROR_CODE = 495;\n\n  public HttpBitbucketServerApiClient(\n      String serverUrl, OAuthAuthenticator authenticator, OAuthAPI oAuthAPI, String apiEndpoint) {\n    this.serverUri = URI.create(serverUrl.endsWith(\"/\") ? serverUrl : serverUrl + \"/\");\n    this.authenticator = authenticator;\n    this.oAuthAPI = oAuthAPI;\n    this.apiEndpoint = apiEndpoint;\n    this.httpClient =\n        HttpClient.newBuilder()\n            .executor(\n                Executors.newCachedThreadPool(\n                    new ThreadFactoryBuilder()\n                        .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n                        .setNameFormat(HttpBitbucketServerApiClient.class.getName() + \"-%d\")\n                        .setDaemon(true)\n                        .build()))\n            .connectTimeout(DEFAULT_HTTP_TIMEOUT)\n            .version(HttpClient.Version.HTTP_1_1)\n            .build();\n  }\n\n  @Override\n  public boolean isConnected(String bitbucketServerUrl) {\n    return serverUri.equals(\n        URI.create(\n            bitbucketServerUrl.endsWith(\"/\") ? bitbucketServerUrl : bitbucketServerUrl + \"/\"));\n  }\n\n  @Override\n  public BitbucketUser getUser(String token)\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException {\n    return getUser(Optional.of(token));\n  }\n\n  @Override\n  public BitbucketUser getUser()\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException {\n    return getUser(Optional.empty());\n  }\n\n  @Override\n  public List<BitbucketUser> getUsers()\n      throws ScmBadRequestException, ScmUnauthorizedException, ScmCommunicationException {\n    try {\n      return doGetItems(Optional.empty(), BitbucketUser.class, \"./rest/api/1.0/users\", null);\n    } catch (ScmItemNotFoundException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public List<BitbucketUser> getUsers(String filter)\n      throws ScmBadRequestException, ScmUnauthorizedException, ScmCommunicationException {\n    try {\n      return doGetItems(Optional.empty(), BitbucketUser.class, \"./rest/api/1.0/users\", filter);\n    } catch (ScmItemNotFoundException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public void deletePersonalAccessTokens(String tokenId)\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException {\n    URI uri =\n        serverUri.resolve(\n            \"./rest/access-tokens/1.0/users/\" + getUserSlug(Optional.empty()) + \"/\" + tokenId);\n    HttpRequest request =\n        HttpRequest.newBuilder(uri)\n            .DELETE()\n            .headers(\n                HttpHeaders.AUTHORIZATION,\n                computeAuthorizationHeader(\"DELETE\", uri.toString()),\n                HttpHeaders.ACCEPT,\n                MediaType.APPLICATION_JSON,\n                HttpHeaders.CONTENT_TYPE,\n                MediaType.APPLICATION_JSON)\n            .timeout(DEFAULT_HTTP_TIMEOUT)\n            .build();\n\n    try {\n      LOG.trace(\"executeRequest={}\", request);\n      executeRequest(\n          httpClient,\n          request,\n          response -> {\n            try {\n              String result =\n                  CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n              return OM.readValue(result, String.class);\n            } catch (IOException e) {\n              throw new UncheckedIOException(e);\n            }\n          });\n    } catch (ScmBadRequestException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public BitbucketPersonalAccessToken createPersonalAccessTokens(\n      String tokenName, Set<String> permissions)\n      throws ScmBadRequestException,\n          ScmUnauthorizedException,\n          ScmCommunicationException,\n          ScmItemNotFoundException {\n    BitbucketPersonalAccessToken token =\n        new BitbucketPersonalAccessToken(tokenName, permissions, 90);\n    URI uri = serverUri.resolve(\"./rest/access-tokens/1.0/users/\" + getUserSlug(Optional.empty()));\n\n    try {\n      HttpRequest request =\n          HttpRequest.newBuilder(uri)\n              .PUT(\n                  HttpRequest.BodyPublishers.ofString(\n                      OM.writeValueAsString(\n                          // set maximum allowed expiryDays to 90\n                          token)))\n              .headers(\n                  HttpHeaders.AUTHORIZATION,\n                  computeAuthorizationHeader(\"PUT\", uri.toString()),\n                  HttpHeaders.ACCEPT,\n                  MediaType.APPLICATION_JSON,\n                  HttpHeaders.CONTENT_TYPE,\n                  MediaType.APPLICATION_JSON)\n              .timeout(DEFAULT_HTTP_TIMEOUT)\n              .build();\n      LOG.trace(\"executeRequest={}\", request);\n      return executeRequest(\n          httpClient,\n          request,\n          response -> {\n            try {\n              String result =\n                  CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n              return OM.readValue(result, BitbucketPersonalAccessToken.class);\n            } catch (IOException e) {\n              throw new UncheckedIOException(e);\n            }\n          });\n    } catch (ScmItemNotFoundException | JsonProcessingException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public List<BitbucketPersonalAccessToken> getPersonalAccessTokens()\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException {\n    try {\n      return doGetItems(\n          Optional.empty(),\n          BitbucketPersonalAccessToken.class,\n          \"./rest/access-tokens/1.0/users/\" + getUserSlug(Optional.empty()),\n          null);\n    } catch (ScmBadRequestException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public BitbucketPersonalAccessToken getPersonalAccessToken(String tokenId, String oauthToken)\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException {\n    URI uri =\n        serverUri.resolve(\n            \"./rest/access-tokens/1.0/users/\"\n                + getUserSlug(Optional.of(oauthToken))\n                + \"/\"\n                + tokenId);\n    HttpRequest request =\n        HttpRequest.newBuilder(uri)\n            .headers(\n                \"Authorization\",\n                \"Bearer \" + oauthToken,\n                HttpHeaders.ACCEPT,\n                MediaType.APPLICATION_JSON)\n            .timeout(DEFAULT_HTTP_TIMEOUT)\n            .build();\n\n    try {\n      LOG.trace(\"executeRequest={}\", request);\n      return executeRequest(\n          httpClient,\n          request,\n          response -> {\n            try {\n              String result =\n                  CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n              return OM.readValue(result, BitbucketPersonalAccessToken.class);\n            } catch (IOException e) {\n              throw new UncheckedIOException(e);\n            }\n          });\n    } catch (ScmBadRequestException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  private String getUserSlug(Optional<String> token)\n      throws ScmItemNotFoundException, ScmCommunicationException, ScmUnauthorizedException {\n    return getUser(token).getSlug();\n  }\n\n  private BitbucketUser getUser(Optional<String> token)\n      throws ScmCommunicationException, ScmUnauthorizedException, ScmItemNotFoundException {\n    // We use the application-properties request to obtain the authenticated username from the\n    // response headers. The request does not fail if no authentication is passed, see:\n    // https://developer.atlassian.com/server/bitbucket/rest/v906/api-group-system-maintenance/#api-api-latest-application-properties-get\n    URI uri = serverUri.resolve(\"/rest/api/1.0/application-properties\");\n\n    HttpRequest request =\n        HttpRequest.newBuilder(uri)\n            .headers(\n                \"Authorization\",\n                token.isPresent()\n                    ? \"Bearer \" + token.get()\n                    : computeAuthorizationHeader(\"GET\", uri.toString()))\n            .timeout(DEFAULT_HTTP_TIMEOUT)\n            .build();\n\n    HttpResponse<InputStream> response;\n    try {\n      LOG.trace(\"executeRequest={}\", request);\n      response = executeRequest(httpClient, request, r -> r);\n    } catch (ScmBadRequestException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n\n    String username = URLDecoder.decode(getUsername(response), UTF_8);\n\n    try {\n      List<BitbucketUser> users =\n          doGetItems(token, BitbucketUser.class, \"./rest/api/1.0/users\", username);\n      // The result can contain multiple users, but we only want the one with the correct username\n      // See https://docs.atlassian.com/bitbucket-server/rest/7.9.0/bitbucket-rest.html#idp434\n      return users.stream()\n          .filter(user -> user.getName().equals(username))\n          .findFirst()\n          .orElseThrow(\n              () -> new ScmItemNotFoundException(\"User '\" + username + \"' not found in Bitbucket\"));\n    } catch (ScmBadRequestException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  private String getUsername(HttpResponse<InputStream> response)\n      throws ScmCommunicationException, ScmUnauthorizedException {\n    try {\n      // Try to get the username from the response header.\n      if (response.headers().firstValue(USERNAME_HEADER).isPresent()) {\n        return response.headers().firstValue(USERNAME_HEADER).get();\n      } else {\n        String result =\n            CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n        // Convert the response data to the Bitbucket Server info object.\n        OBJECT_MAPPER.readValue(result, BitbucketApplicationProperties.class);\n        // Throw the unauthorized exception if the response contains the Bitbucket info.\n        throw buildScmUnauthorizedException();\n      }\n    } catch (IOException e) {\n      // The response does not contain the Bitbucket Server info\n      throw new ScmCommunicationException(\"Bad request\");\n    }\n  }\n\n  private <T> List<T> doGetItems(Optional<String> token, Class<T> tClass, String api, String filter)\n      throws ScmUnauthorizedException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmItemNotFoundException {\n    Page<T> currentPage = doGetPage(token, tClass, api, 0, 25, filter);\n    List<T> result = new ArrayList<>(currentPage.getValues());\n    while (!currentPage.isLastPage()) {\n      currentPage = doGetPage(token, tClass, api, currentPage.getNextPageStart(), 25, filter);\n      result.addAll(currentPage.getValues());\n    }\n    return result;\n  }\n\n  private <T> Page<T> doGetPage(\n      Optional<String> token, Class<T> tClass, String api, int start, int limit, String filter)\n      throws ScmUnauthorizedException,\n          ScmBadRequestException,\n          ScmCommunicationException,\n          ScmItemNotFoundException {\n    String suffix = api + \"?start=\" + start + \"&limit=\" + limit;\n    if (!isNullOrEmpty(filter)) {\n      suffix += \"&filter=\" + filter;\n    }\n\n    URI uri = serverUri.resolve(suffix);\n    HttpRequest request =\n        HttpRequest.newBuilder(uri)\n            .headers(\n                \"Authorization\",\n                token.isPresent()\n                    ? \"Bearer \" + token.get()\n                    : computeAuthorizationHeader(\"GET\", uri.toString()))\n            .timeout(DEFAULT_HTTP_TIMEOUT)\n            .build();\n    LOG.trace(\"executeRequest={}\", request);\n    final JavaType typeReference =\n        TypeFactory.defaultInstance().constructParametricType(Page.class, tClass);\n    return executeRequest(\n        httpClient,\n        request,\n        response -> {\n          try {\n            String result =\n                CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n            return OM.readValue(result, typeReference);\n          } catch (IOException e) {\n            throw new UncheckedIOException(e);\n          }\n        });\n  }\n\n  private <T> T executeRequest(\n      HttpClient httpClient,\n      HttpRequest request,\n      Function<HttpResponse<InputStream>, T> bodyConverter)\n      throws ScmBadRequestException,\n          ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmUnauthorizedException {\n    try {\n      HttpResponse<InputStream> response =\n          httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());\n      LOG.trace(\"executeRequest={} response {}\", request, response.statusCode());\n      if (response.statusCode() == 200) {\n        return bodyConverter.apply(response);\n      } else if (response.statusCode() == 204) {\n        return null;\n      } else {\n        String body = CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n        switch (response.statusCode()) {\n          case HTTP_UNAUTHORIZED:\n            throw buildScmUnauthorizedException();\n          case HTTP_BAD_REQUEST:\n            throw new ScmBadRequestException(body);\n          case HTTP_NOT_FOUND:\n            throw new ScmItemNotFoundException(body);\n          default:\n            throw new ScmCommunicationException(\n                \"Unexpected status code \" + response.statusCode() + \" \" + response,\n                response.statusCode(),\n                \"bitbucket\");\n        }\n      }\n    } catch (IOException | InterruptedException | UncheckedIOException e) {\n      if (e instanceof SSLHandshakeException) {\n        throw new ScmCommunicationException(\n            \"The required SSL certificate is missing or not trusted by the system. Please contact your administrator.\",\n            SSL_ERROR_CODE);\n      }\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  private @Nullable String getToken() throws ScmUnauthorizedException {\n    try {\n      OAuthToken token = oAuthAPI.getOrRefreshToken(\"bitbucket-server\");\n      return token.getToken();\n    } catch (NotFoundException\n        | ServerException\n        | ForbiddenException\n        | BadRequestException\n        | ConflictException e) {\n      LOG.error(e.getMessage());\n      return null;\n    } catch (UnauthorizedException e) {\n      throw buildScmUnauthorizedException();\n    }\n  }\n\n  private String computeAuthorizationHeader(String requestMethod, String requestUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException {\n    if (authenticator instanceof NoopOAuthAuthenticator) {\n      String token = getToken();\n      if (!isNullOrEmpty(token)) {\n        return \"Bearer \" + token;\n      }\n    }\n    try {\n      Subject subject = EnvironmentContext.getCurrent().getSubject();\n      return authenticator.computeAuthorizationHeader(\n          subject.getUserId(), requestMethod, requestUrl);\n    } catch (OAuthAuthenticationException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  private ScmUnauthorizedException buildScmUnauthorizedException() {\n    return new ScmUnauthorizedException(\n        EnvironmentContext.getCurrent().getSubject().getUserName()\n            + \" is not authorized in bitbucket OAuth provider\",\n        \"bitbucket\",\n        authenticator instanceof NoopOAuthAuthenticator ? \"2.0\" : \"1.0\",\n        authenticator instanceof NoopOAuthAuthenticator\n            ? apiEndpoint + \"/oauth/authenticate?oauth_provider=bitbucket-server&scope=ADMIN_WRITE\"\n            : authenticator.getLocalAuthenticateUrl());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/BitbucketApplicationProperties.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket.server;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport java.util.Objects;\n\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class BitbucketApplicationProperties {\n\n  private String version;\n  private String buildNumber;\n  private String buildDate;\n  private String displayName;\n\n  public BitbucketApplicationProperties() {}\n\n  public BitbucketApplicationProperties(\n      String version, String buildNumber, String buildDate, String displayName) {\n    this.version = version;\n    this.buildNumber = buildNumber;\n    this.buildDate = buildDate;\n    this.displayName = displayName;\n  }\n\n  public String getVersion() {\n    return version;\n  }\n\n  public String getBuildNumber() {\n    return buildNumber;\n  }\n\n  public String getBuildDate() {\n    return buildDate;\n  }\n\n  public String getDisplayName() {\n    return displayName;\n  }\n\n  @Override\n  public String toString() {\n    return \"BitbucketApplicationProperties{\"\n        + \"version='\"\n        + version\n        + '\\''\n        + \", buildNumber=\"\n        + buildNumber\n        + \", buildDate=\"\n        + buildDate\n        + \", displayName='\"\n        + displayName\n        + '\\''\n        + '}';\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    BitbucketApplicationProperties that = (BitbucketApplicationProperties) o;\n    return buildNumber == that.buildNumber\n        && buildDate == that.buildDate\n        && Objects.equals(version, that.version)\n        && Objects.equals(displayName, that.displayName);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(version, buildNumber, buildDate, displayName);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/BitbucketPersonalAccessToken.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket.server;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport java.util.Objects;\nimport java.util.Set;\n\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class BitbucketPersonalAccessToken {\n  private String id;\n  private long createdDate;\n  private long lastAuthenticated;\n  private int expiryDays;\n  private String name;\n  private String token;\n  private BitbucketUser user;\n  private Set<String> permissions;\n\n  public BitbucketPersonalAccessToken(String name, Set<String> permissions, int expiryDays) {\n    this.name = name;\n    this.permissions = permissions;\n    this.expiryDays = expiryDays;\n  }\n\n  public BitbucketPersonalAccessToken() {}\n\n  public BitbucketPersonalAccessToken(\n      String id,\n      long createdDate,\n      long lastAuthenticated,\n      int expiryDays,\n      String name,\n      String token,\n      BitbucketUser user,\n      Set<String> permissions) {\n    this.id = id;\n    this.createdDate = createdDate;\n    this.lastAuthenticated = lastAuthenticated;\n    this.expiryDays = expiryDays;\n    this.name = name;\n    this.token = token;\n    this.user = user;\n    this.permissions = permissions;\n  }\n\n  public String getId() {\n    return id;\n  }\n\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  public long getCreatedDate() {\n    return createdDate;\n  }\n\n  public void setCreatedDate(long createdDate) {\n    this.createdDate = createdDate;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  public BitbucketUser getUser() {\n    return user;\n  }\n\n  public void setUser(BitbucketUser user) {\n    this.user = user;\n  }\n\n  public Set<String> getPermissions() {\n    return permissions;\n  }\n\n  public void setPermissions(Set<String> permissions) {\n    this.permissions = permissions;\n  }\n\n  public String getToken() {\n    return token;\n  }\n\n  public void setToken(String token) {\n    this.token = token;\n  }\n\n  public long getLastAuthenticated() {\n    return lastAuthenticated;\n  }\n\n  public void setLastAuthenticated(long lastAuthenticated) {\n    this.lastAuthenticated = lastAuthenticated;\n  }\n\n  public long getExpiryDays() {\n    return expiryDays;\n  }\n\n  public void setExpiryDays(int expiryDays) {\n    this.expiryDays = expiryDays;\n  }\n\n  @Override\n  public String toString() {\n    return \"BitbucketPersonalAccessToken{\"\n        + \"id=\"\n        + id\n        + \", createdDate=\"\n        + createdDate\n        + \", lastAuthenticated=\"\n        + lastAuthenticated\n        + \", expiryDate=\"\n        + expiryDays\n        + \", name='\"\n        + name\n        + '\\''\n        + \", token='\"\n        + token\n        + '\\''\n        + \", user=\"\n        + user\n        + \", permissions=\"\n        + permissions\n        + '}';\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) return true;\n    if (o == null || getClass() != o.getClass()) return false;\n    BitbucketPersonalAccessToken that = (BitbucketPersonalAccessToken) o;\n    return id.equals(that.id)\n        && createdDate == that.createdDate\n        && lastAuthenticated == that.lastAuthenticated\n        && expiryDays == that.expiryDays\n        && Objects.equals(name, that.name)\n        && Objects.equals(token, that.token)\n        && Objects.equals(user, that.user)\n        && Objects.equals(permissions, that.permissions);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(\n        id, createdDate, lastAuthenticated, expiryDays, name, token, user, permissions);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/BitbucketServerApiClient.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket.server;\n\nimport java.util.List;\nimport java.util.Set;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\n\n/** Bitbucket Server API client. */\npublic interface BitbucketServerApiClient {\n  /**\n   * @param bitbucketServerUrl\n   * @return - true if client is connected to the given bitbucket server.\n   */\n  boolean isConnected(String bitbucketServerUrl);\n\n  /**\n   * @param token token to authorise the user request.\n   * @return - authenticated {@link BitbucketUser}.\n   */\n  BitbucketUser getUser(String token)\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException;\n\n  /**\n   * @return Retrieve the authenticated {@link BitbucketUser} using an OAuth token.\n   * @return - authenticated {@link BitbucketUser}.\n   */\n  BitbucketUser getUser()\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException;\n\n  /**\n   * @return Retrieve a list of {@link BitbucketUser}. Only authenticated users may call this\n   *     resource.\n   * @throws ScmBadRequestException\n   * @throws ScmUnauthorizedException\n   * @throws ScmCommunicationException\n   */\n  List<BitbucketUser> getUsers()\n      throws ScmBadRequestException, ScmUnauthorizedException, ScmCommunicationException;\n\n  /**\n   * @return Retrieve a list of {@link BitbucketUser}, optionally run through provided filters. Only\n   *     authenticated users may call this resource.\n   * @throws ScmBadRequestException\n   * @throws ScmUnauthorizedException\n   * @throws ScmCommunicationException\n   */\n  List<BitbucketUser> getUsers(String filter)\n      throws ScmBadRequestException, ScmUnauthorizedException, ScmCommunicationException;\n\n  /**\n   * Modify an access token for the user according to the given request. Any fields not specified\n   * will not be altered\n   *\n   * @param tokenId - the token id\n   * @throws ScmItemNotFoundException\n   * @throws ScmUnauthorizedException\n   * @throws ScmCommunicationException\n   */\n  void deletePersonalAccessTokens(String tokenId)\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException;\n\n  /**\n   * Create an access token for the user according to the given request.\n   *\n   * @param tokenName\n   * @param permissions\n   * @return\n   * @throws ScmBadRequestException\n   * @throws ScmUnauthorizedException\n   * @throws ScmCommunicationException\n   */\n  BitbucketPersonalAccessToken createPersonalAccessTokens(String tokenName, Set<String> permissions)\n      throws ScmBadRequestException,\n          ScmUnauthorizedException,\n          ScmCommunicationException,\n          ScmItemNotFoundException;\n\n  /**\n   * Get all personal access tokens associated with the given user\n   *\n   * @return\n   * @throws ScmItemNotFoundException\n   * @throws ScmUnauthorizedException\n   * @throws ScmBadRequestException\n   * @throws ScmCommunicationException\n   */\n  List<BitbucketPersonalAccessToken> getPersonalAccessTokens()\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException;\n\n  /**\n   * @param tokenId - bitbucket personal access token id.\n   * @param oauthToken - bitbucket oauth token.\n   * @return - Bitbucket personal access token.\n   * @throws ScmCommunicationException\n   */\n  BitbucketPersonalAccessToken getPersonalAccessToken(String tokenId, String oauthToken)\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/BitbucketUser.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket.server;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport java.util.Objects;\n\n@JsonIgnoreProperties(value = \"links\")\npublic class BitbucketUser {\n\n  private String displayName;\n  private String name;\n  private long id;\n  private String type;\n  private boolean isActive;\n  private String slug;\n  private String emailAddress;\n\n  public BitbucketUser(\n      String displayName,\n      String name,\n      long id,\n      String type,\n      boolean isActive,\n      String slug,\n      String emailAddress) {\n    this.displayName = displayName;\n    this.name = name;\n    this.id = id;\n    this.type = type;\n    this.isActive = isActive;\n    this.slug = slug;\n    this.emailAddress = emailAddress;\n  }\n\n  public BitbucketUser() {}\n\n  public String getDisplayName() {\n    return displayName;\n  }\n\n  public void setDisplayName(String displayName) {\n    this.displayName = displayName;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  public long getId() {\n    return id;\n  }\n\n  public void setId(long id) {\n    this.id = id;\n  }\n\n  public String getType() {\n    return type;\n  }\n\n  public void setType(String type) {\n    this.type = type;\n  }\n\n  public boolean isActive() {\n    return isActive;\n  }\n\n  public void setActive(boolean active) {\n    isActive = active;\n  }\n\n  public String getSlug() {\n    return slug;\n  }\n\n  public void setSlug(String slug) {\n    this.slug = slug;\n  }\n\n  public String getEmailAddress() {\n    return emailAddress;\n  }\n\n  public void setEmailAddress(String emailAddress) {\n    this.emailAddress = emailAddress;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) return true;\n    if (o == null || getClass() != o.getClass()) return false;\n    BitbucketUser that = (BitbucketUser) o;\n    return id == that.id\n        && isActive == that.isActive\n        && Objects.equals(displayName, that.displayName)\n        && Objects.equals(name, that.name)\n        && Objects.equals(type, that.type)\n        && Objects.equals(slug, that.slug)\n        && Objects.equals(emailAddress, that.emailAddress);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(displayName, name, id, type, isActive, slug, emailAddress);\n  }\n\n  @Override\n  public String toString() {\n    return \"BitbucketUser{\"\n        + \"displayName='\"\n        + displayName\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", id=\"\n        + id\n        + \", type='\"\n        + type\n        + '\\''\n        + \", isActive=\"\n        + isActive\n        + \", slug='\"\n        + slug\n        + '\\''\n        + \", emailAddress='\"\n        + emailAddress\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/NoopBitbucketServerApiClient.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket.server;\n\nimport java.util.List;\nimport java.util.Set;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\n\n/**\n * Implementation of @{@link BitbucketServerApiClient} that is going to be deployed in container in\n * case if no integration with Bitbucket server is needed.\n */\npublic class NoopBitbucketServerApiClient implements BitbucketServerApiClient {\n  @Override\n  public boolean isConnected(String bitbucketServerUrl) {\n    return false;\n  }\n\n  @Override\n  public BitbucketUser getUser(String token)\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException {\n    throw new RuntimeException(\n        \"The fallback noop api client cannot be used for real operation. Make sure Bitbucket OAuth1 is properly configured.\");\n  }\n\n  @Override\n  public BitbucketUser getUser()\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException {\n    throw new RuntimeException(\n        \"The fallback noop api client cannot be used for real operation. Make sure Bitbucket OAuth1 is properly configured.\");\n  }\n\n  @Override\n  public List<BitbucketUser> getUsers()\n      throws ScmBadRequestException, ScmUnauthorizedException, ScmCommunicationException {\n    throw new RuntimeException(\n        \"The fallback noop api client cannot be used for real operation. Make sure Bitbucket OAuth1 is properly configured.\");\n  }\n\n  @Override\n  public List<BitbucketUser> getUsers(String filter)\n      throws ScmBadRequestException, ScmUnauthorizedException, ScmCommunicationException {\n    throw new RuntimeException(\n        \"The fallback noop api client cannot be used for real operation. Make sure Bitbucket OAuth1 is properly configured.\");\n  }\n\n  @Override\n  public void deletePersonalAccessTokens(String tokenId)\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException {\n    throw new RuntimeException(\n        \"The fallback noop api client cannot be used for real operation. Make sure Bitbucket OAuth1 is properly configured.\");\n  }\n\n  @Override\n  public BitbucketPersonalAccessToken createPersonalAccessTokens(\n      String tokenName, Set<String> permissions)\n      throws ScmBadRequestException, ScmUnauthorizedException, ScmCommunicationException {\n    throw new RuntimeException(\"Invalid usage of BitbucketServerApi\");\n  }\n\n  @Override\n  public List<BitbucketPersonalAccessToken> getPersonalAccessTokens()\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException {\n    throw new RuntimeException(\"Invalid usage of BitbucketServerApi\");\n  }\n\n  @Override\n  public BitbucketPersonalAccessToken getPersonalAccessToken(String tokenId, String oauthToken)\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException {\n    throw new RuntimeException(\"Invalid usage of BitbucketServerApi\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/Page.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket.server;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * Bitbucket's paging object. Combines collections of items with some metadata.\n *\n * <p>See more\n *\n * <p>https://docs.atlassian.com/bitbucket-server/rest/5.6.1/bitbucket-rest.html\n *\n * @param <T>\n */\npublic class Page<T> {\n  private int start;\n  private int size;\n  private int limit;\n\n  @JsonProperty(value = \"isLastPage\")\n  private boolean isLastPage;\n\n  private int nextPageStart;\n  List<T> values;\n\n  public int getStart() {\n    return start;\n  }\n\n  public void setStart(int start) {\n    this.start = start;\n  }\n\n  public int getSize() {\n    return size;\n  }\n\n  public void setSize(int size) {\n    this.size = size;\n  }\n\n  public int getLimit() {\n    return limit;\n  }\n\n  public void setLimit(int limit) {\n    this.limit = limit;\n  }\n\n  public boolean isLastPage() {\n    return isLastPage;\n  }\n\n  public void setLastPage(boolean lastPage) {\n    isLastPage = lastPage;\n  }\n\n  public List<T> getValues() {\n    return values;\n  }\n\n  public void setValues(List<T> values) {\n    this.values = values;\n  }\n\n  public int getNextPageStart() {\n    return nextPageStart;\n  }\n\n  public void setNextPageStart(int nextPageStart) {\n    this.nextPageStart = nextPageStart;\n  }\n\n  @Override\n  public String toString() {\n    return \"Page{\"\n        + \"start=\"\n        + start\n        + \", size=\"\n        + size\n        + \", limit=\"\n        + limit\n        + \", isLastPage=\"\n        + isLastPage\n        + \", nextPageStart=\"\n        + nextPageStart\n        + \", values=\"\n        + values\n        + '}';\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) return true;\n    if (o == null || getClass() != o.getClass()) return false;\n    Page<?> page = (Page<?>) o;\n    return start == page.start\n        && size == page.size\n        && limit == page.limit\n        && isLastPage == page.isLastPage\n        && nextPageStart == page.nextPageStart\n        && Objects.equals(values, page.values);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(start, size, limit, isLastPage, nextPageStart, values);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerApiClientProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableSet;\nimport java.io.IOException;\nimport java.util.Collections;\nimport java.util.Set;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketServerApiClient;\nimport org.eclipse.che.api.factory.server.bitbucket.server.NoopBitbucketServerApiClient;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.inject.ConfigurationException;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.eclipse.che.security.oauth1.BitbucketServerOAuthAuthenticator;\nimport org.eclipse.che.security.oauth1.OAuthAuthenticator;\nimport org.mockito.Mock;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class BitbucketServerApiClientProviderTest {\n  BitbucketServerOAuthAuthenticator oAuthAuthenticator;\n  @Mock OAuthAPI oAuthAPI;\n\n  @BeforeClass\n  public void setUp() {\n    oAuthAuthenticator =\n        new BitbucketServerOAuthAuthenticator(\n            \"df\", \"private\", \" https://bitbucket2.server.com\", \" https://che.server.com\");\n  }\n\n  @Test\n  public void shouldBeAbleToCreateBitbucketServerApi() {\n    // given\n    BitbucketServerApiProvider bitbucketServerApiProvider =\n        new BitbucketServerApiProvider(\n            \"https://bitbucket.server.com, https://bitbucket2.server.com\",\n            \"https://bitbucket.server.com\",\n            \"https://bitbucket.server.com\",\n            oAuthAPI,\n            ImmutableSet.of(oAuthAuthenticator));\n    // when\n    BitbucketServerApiClient actual = bitbucketServerApiProvider.get();\n    // then\n    assertNotNull(actual);\n    assertTrue(HttpBitbucketServerApiClient.class.isAssignableFrom(actual.getClass()));\n  }\n\n  @Test\n  public void shouldNormalizeURLsBeforeCreateBitbucketServerApi() {\n    // given\n    BitbucketServerApiProvider bitbucketServerApiProvider =\n        new BitbucketServerApiProvider(\n            \"https://bitbucket.server.com, https://bitbucket2.server.com\",\n            \"https://bitbucket.server.com\",\n            \"https://bitbucket.server.com\",\n            oAuthAPI,\n            ImmutableSet.of(oAuthAuthenticator));\n    // when\n    BitbucketServerApiClient actual = bitbucketServerApiProvider.get();\n    // then\n    assertNotNull(actual);\n    // internal representation always w/out slashes\n    assertTrue(actual.isConnected(\"https://bitbucket.server.com/\"));\n  }\n\n  @Test(dataProvider = \"noopConfig\")\n  public void shouldProvideNoopOAuthAuthenticatorIfSomeConfigurationIsNotSet(\n      @Nullable String bitbucketEndpoints, Set<OAuthAuthenticator> authenticators)\n      throws IOException {\n    // given\n    BitbucketServerApiProvider bitbucketServerApiProvider =\n        new BitbucketServerApiProvider(\n            bitbucketEndpoints, \"https://bitbucket.org\", \"\", oAuthAPI, authenticators);\n    // when\n    BitbucketServerApiClient actual = bitbucketServerApiProvider.get();\n    // then\n    assertNotNull(actual);\n    assertTrue(NoopBitbucketServerApiClient.class.isAssignableFrom(actual.getClass()));\n  }\n\n  @Test(dataProvider = \"httpOnlyConfig\")\n  public void shouldProvideHttpAuthenticatorIfOauthConfigurationIsNotSet(\n      @Nullable String bitbucketEndpoints, Set<OAuthAuthenticator> authenticators)\n      throws IOException {\n    // given\n    BitbucketServerApiProvider bitbucketServerApiProvider =\n        new BitbucketServerApiProvider(\n            bitbucketEndpoints, \"https://bitbucket.org\", \"\", oAuthAPI, authenticators);\n    // when\n    BitbucketServerApiClient actual = bitbucketServerApiProvider.get();\n    // then\n    assertNotNull(actual);\n    assertTrue(HttpBitbucketServerApiClient.class.isAssignableFrom(actual.getClass()));\n  }\n\n  @Test(\n      expectedExceptions = ConfigurationException.class,\n      expectedExceptionsMessageRegExp =\n          \"`che.integration.bitbucket.server_endpoints` bitbucket configuration is missing. It should contain values from 'che.oauth.bitbucket.endpoint'\")\n  public void shouldFailToBuildIfEndpointsAreMisconfigured() {\n    // given\n    // when\n    BitbucketServerApiProvider bitbucketServerApiProvider =\n        new BitbucketServerApiProvider(\n            \"\",\n            \"https://bitbucket.server.com\",\n            \"https://bitbucket.server.com\",\n            oAuthAPI,\n            ImmutableSet.of(oAuthAuthenticator));\n  }\n\n  @Test(\n      expectedExceptions = ConfigurationException.class,\n      expectedExceptionsMessageRegExp =\n          \"'che.oauth.bitbucket.endpoint' is set but BitbucketServerOAuthAuthenticator is not deployed correctly\")\n  public void shouldFailToBuildIfEndpointsAreMisconfigured2() {\n    // given\n    // when\n    BitbucketServerApiProvider bitbucketServerApiProvider =\n        new BitbucketServerApiProvider(\n            \"https://bitbucket.server.com, https://bitbucket2.server.com\",\n            \"https://bitbucket.server.com\",\n            \"https://bitbucket.server.com\",\n            oAuthAPI,\n            Collections.emptySet());\n  }\n\n  @Test(\n      expectedExceptions = ConfigurationException.class,\n      expectedExceptionsMessageRegExp =\n          \"`che.integration.bitbucket.server_endpoints` must contain `https://bitbucket.server.com` value\")\n  public void shouldFailToBuildIfEndpointsAreMisconfigured3() {\n    // given\n    // when\n    BitbucketServerApiProvider bitbucketServerApiProvider =\n        new BitbucketServerApiProvider(\n            \"https://bitbucket3.server.com, https://bitbucket2.server.com\",\n            \"https://bitbucket.server.com\",\n            \"https://bitbucket.server.com\",\n            oAuthAPI,\n            ImmutableSet.of(oAuthAuthenticator));\n  }\n\n  @DataProvider(name = \"noopConfig\")\n  public Object[][] noopConfig() {\n    return new Object[][] {\n      {null, null},\n      {\"\", null}\n    };\n  }\n\n  @DataProvider(name = \"httpOnlyConfig\")\n  public Object[][] httpOnlyConfig() {\n    return new Object[][] {\n      {\"https://bitbucket.server.com\", null},\n      {\"https://bitbucket.server.com, https://bitbucket2.server.com\", null},\n      {\n        \"https://bitbucket.server.com, https://bitbucket2.server.com\",\n        ImmutableSet.of(oAuthAuthenticator)\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerAuthorizingFactoryParametersResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.factory.shared.Constants.CURRENT_VERSION;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.eclipse.che.security.oauth1.OAuthAuthenticationService.ERROR_QUERY_NAME;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyBoolean;\nimport static org.mockito.ArgumentMatchers.anyMap;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.model.factory.ScmInfo;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.ScmInfoDto;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketServerAuthorizingFactoryParametersResolverTest {\n\n  @Mock private OAuthAPI oAuthAPI;\n  @Mock private URLFactoryBuilder urlFactoryBuilder;\n\n  @Mock private URLFetcher urlFetcher;\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  @Mock private AuthorisationRequestManager authorisationRequestManager;\n\n  BitbucketServerURLParser bitbucketURLParser;\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n\n  private BitbucketServerAuthorizingFactoryParametersResolver\n      bitbucketServerFactoryParametersResolver;\n\n  @BeforeMethod\n  protected void init() {\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"http://bitbucket.2mcl.com\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n    assertNotNull(this.bitbucketURLParser);\n    bitbucketServerFactoryParametersResolver =\n        new BitbucketServerAuthorizingFactoryParametersResolver(\n            urlFactoryBuilder,\n            urlFetcher,\n            bitbucketURLParser,\n            personalAccessTokenManager,\n            authorisationRequestManager);\n    assertNotNull(this.bitbucketServerFactoryParametersResolver);\n  }\n\n  /** Check url which is not a bitbucket url can't be accepted by this resolver */\n  @Test\n  public void checkInvalidAcceptUrl() {\n    Map<String, String> parameters = singletonMap(URL_PARAMETER_NAME, \"http://github.com\");\n    // shouldn't be accepted\n    assertFalse(bitbucketServerFactoryParametersResolver.accept(parameters));\n  }\n\n  /** Check bitbucket url will be be accepted by this resolver */\n  @Test\n  public void checkValidAcceptUrl() {\n    Map<String, String> parameters =\n        singletonMap(URL_PARAMETER_NAME, \"http://bitbucket.2mcl.com/scm/test/repo.git\");\n    // should be accepted\n    assertTrue(bitbucketServerFactoryParametersResolver.accept(parameters));\n  }\n\n  @Test\n  public void shouldGenerateDevfileForFactoryWithNoDevfileOrJson() throws Exception {\n\n    String bitbucketUrl = \"http://bitbucket.2mcl.com/scm/test/repo.git\";\n\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.empty());\n    Map<String, String> params = ImmutableMap.of(URL_PARAMETER_NAME, bitbucketUrl);\n    // when\n    FactoryDevfileV2Dto factory =\n        (FactoryDevfileV2Dto) bitbucketServerFactoryParametersResolver.createFactory(params);\n    // then\n    ScmInfoDto scmInfo = factory.getScmInfo();\n    assertEquals(scmInfo.getRepositoryUrl(), bitbucketUrl);\n    assertEquals(scmInfo.getBranch(), null);\n  }\n\n  @Test\n  public void shouldSetDefaultProjectIntoDevfileIfNotSpecified() throws Exception {\n\n    String bitbucketUrl =\n        \"http://bitbucket.2mcl.com/users/test/repos/repo/browse?at=refs%2Fheads%2Ffoobar\";\n\n    FactoryDevfileV2Dto factoryDevfileV2Dto = generateDevfileV2Factory();\n\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.of(factoryDevfileV2Dto));\n\n    Map<String, String> params = ImmutableMap.of(URL_PARAMETER_NAME, bitbucketUrl);\n    // when\n    FactoryDevfileV2Dto factory =\n        (FactoryDevfileV2Dto) bitbucketServerFactoryParametersResolver.createFactory(params);\n    // then\n    assertNotNull(factory.getDevfile());\n    ScmInfoDto source = factory.getScmInfo();\n    assertEquals(source.getRepositoryUrl(), \"http://bitbucket.2mcl.com/scm/~test/repo.git\");\n    assertEquals(source.getBranch(), \"foobar\");\n  }\n\n  @Test\n  public void shouldSetScmInfoIntoDevfileV2() throws Exception {\n\n    String bitbucketUrl =\n        \"http://bitbucket.2mcl.com/users/test/repos/repo/browse?at=refs%2Fheads%2Ffoobar\";\n\n    FactoryDevfileV2Dto computedFactory = generateDevfileV2Factory();\n\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.of(computedFactory));\n\n    Map<String, String> params = ImmutableMap.of(URL_PARAMETER_NAME, bitbucketUrl);\n    // when\n    FactoryDevfileV2Dto factory =\n        (FactoryDevfileV2Dto) bitbucketServerFactoryParametersResolver.createFactory(params);\n    // then\n    ScmInfo scmInfo = factory.getScmInfo();\n    assertNotNull(scmInfo);\n    assertEquals(scmInfo.getScmProviderName(), \"bitbucket\");\n    assertEquals(scmInfo.getRepositoryUrl(), \"http://bitbucket.2mcl.com/scm/~test/repo.git\");\n    assertEquals(scmInfo.getBranch(), \"foobar\");\n  }\n\n  private FactoryDevfileV2Dto generateDevfileV2Factory() {\n    return newDto(FactoryDevfileV2Dto.class)\n        .withV(CURRENT_VERSION)\n        .withSource(\"repo\")\n        .withDevfile(Map.of(\"schemaVersion\", \"2.0.0\"));\n  }\n\n  @Test\n  public void shouldCreateFactoryWithoutAuthentication() throws ApiException {\n    // given\n    String bitbucketServerUrl = \"http://bitbucket.2mcl.com/scm/~user/repo.git\";\n    Map<String, String> params =\n        ImmutableMap.of(URL_PARAMETER_NAME, bitbucketServerUrl, ERROR_QUERY_NAME, \"access_denied\");\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.of(generateDevfileV2Factory()));\n\n    // when\n    bitbucketServerFactoryParametersResolver.createFactory(params);\n\n    // then\n    verify(urlFactoryBuilder)\n        .createFactoryFromDevfile(\n            any(BitbucketServerUrl.class),\n            any(BitbucketServerAuthorizingFileContentProvider.class),\n            anyMap(),\n            eq(true));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerAuthorizingFileContentProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport java.util.Collections;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketServerAuthorizingFileContentProviderTest {\n\n  public static final String TEST_HOSTNAME = \"foo.bar\";\n  public static final String TEST_SCHEME = \"https\";\n  @Mock private URLFetcher urlFetcher;\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n\n  @Test\n  public void shouldFetchContentWithTokenIfPresent() throws Exception {\n    BitbucketServerUrl url =\n        new BitbucketServerUrl().withHostName(TEST_HOSTNAME).withScheme(TEST_SCHEME);\n    BitbucketServerAuthorizingFileContentProvider fileContentProvider =\n        new BitbucketServerAuthorizingFileContentProvider(\n            url, urlFetcher, personalAccessTokenManager);\n\n    PersonalAccessToken token =\n        new PersonalAccessToken(TEST_SCHEME + \"://\" + TEST_HOSTNAME, \"provider\", \"user1\", \"token\");\n    when(personalAccessTokenManager.getAndStore(anyString())).thenReturn(token);\n\n    String fileURL = \"https://foo.bar/scm/repo/.devfile\";\n\n    // when\n    fileContentProvider.fetchContent(fileURL);\n\n    // then\n    verify(urlFetcher).fetch(eq(fileURL), eq(\"Bearer token\"));\n  }\n\n  @Test\n  public void shouldFetchTokenIfNotYetPresent() throws Exception {\n    BitbucketServerUrl url =\n        new BitbucketServerUrl().withHostName(TEST_HOSTNAME).withScheme(TEST_SCHEME);\n    BitbucketServerAuthorizingFileContentProvider fileContentProvider =\n        new BitbucketServerAuthorizingFileContentProvider(\n            url, urlFetcher, personalAccessTokenManager);\n\n    PersonalAccessToken token =\n        new PersonalAccessToken(TEST_SCHEME + \"://\" + TEST_HOSTNAME, \"provider\", \"user1\", \"token\");\n    when(personalAccessTokenManager.getAndStore(eq(TEST_SCHEME + \"://\" + TEST_HOSTNAME)))\n        .thenReturn(token);\n\n    String fileURL = \"https://foo.bar/scm/repo/.devfile\";\n\n    // when\n    fileContentProvider.fetchContent(fileURL);\n\n    // then\n    verify(personalAccessTokenManager).getAndStore(eq(TEST_SCHEME + \"://\" + TEST_HOSTNAME));\n    verify(urlFetcher).fetch(eq(fileURL), eq(\"Bearer token\"));\n  }\n\n  @Test(dataProvider = \"relativePathsProvider\")\n  public void shouldResolveRelativePaths(String relative, String expected, String branch)\n      throws Exception {\n    BitbucketServerUrl url =\n        new BitbucketServerUrl()\n            .withHostName(TEST_HOSTNAME)\n            .withScheme(TEST_SCHEME)\n            .withProject(\"proj\")\n            .withRepository(\"repo\")\n            .withDevfileFilenames(Collections.singletonList(\".devfile\"));\n    if (branch != null) {\n      url.withBranch(branch);\n    }\n    BitbucketServerAuthorizingFileContentProvider fileContentProvider =\n        new BitbucketServerAuthorizingFileContentProvider(\n            url, urlFetcher, personalAccessTokenManager);\n    PersonalAccessToken token =\n        new PersonalAccessToken(TEST_SCHEME + \"://\" + TEST_HOSTNAME, \"provider\", \"user1\", \"token\");\n    when(personalAccessTokenManager.getAndStore(anyString())).thenReturn(token);\n\n    // when\n    fileContentProvider.fetchContent(relative);\n\n    // then\n    verify(urlFetcher).fetch(eq(expected), eq(\"Bearer token\"));\n  }\n\n  @DataProvider\n  public static Object[][] relativePathsProvider() {\n    return new Object[][] {\n      {\"./file.txt\", \"https://foo.bar/rest/api/1.0/projects/proj/repos/repo/raw/file.txt\", null},\n      {\"/file.txt\", \"https://foo.bar/rest/api/1.0/projects/proj/repos/repo/raw/file.txt\", null},\n      {\"file.txt\", \"https://foo.bar/rest/api/1.0/projects/proj/repos/repo/raw/file.txt\", null},\n      {\n        \"foo/file.txt\",\n        \"https://foo.bar/rest/api/1.0/projects/proj/repos/repo/raw/foo/file.txt\",\n        null\n      },\n      {\n        \"file.txt\",\n        \"https://foo.bar/rest/api/1.0/projects/proj/repos/repo/raw/file.txt?at=foo\",\n        \"foo\"\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcherTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static java.lang.String.valueOf;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableSet;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.util.Collections;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketPersonalAccessToken;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketServerApiClient;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketUser;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenParams;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketServerPersonalAccessTokenFetcherTest {\n  String someNotBitbucketURL = \"https://notabitbucket.com\";\n  String someBitbucketURL = \"https://some.bitbucketserver.com\";\n  Subject subject;\n  @Mock BitbucketServerApiClient bitbucketServerApiClient;\n  @Mock PersonalAccessTokenParams personalAccessTokenParams;\n  @Mock OAuthAPI oAuthAPI;\n  BitbucketUser bitbucketUser;\n  BitbucketServerPersonalAccessTokenFetcher fetcher;\n  BitbucketPersonalAccessToken bitbucketPersonalAccessToken;\n  BitbucketPersonalAccessToken bitbucketPersonalAccessToken2;\n  BitbucketPersonalAccessToken bitbucketPersonalAccessToken3;\n\n  @BeforeMethod\n  public void setup() throws MalformedURLException {\n    URL apiEndpoint = new URL(\"https://che.server.com\");\n    subject =\n        new SubjectImpl(\"another_user\", Collections.emptyList(), \"user987\", \"token111\", false);\n    bitbucketUser =\n        new BitbucketUser(\n            \"User User\", \"user-name\", 32423523, \"NORMAL\", true, \"user-slug\", \"user@users.com\");\n    bitbucketPersonalAccessToken =\n        new BitbucketPersonalAccessToken(\n            \"234234\",\n            234345345,\n            23534534,\n            90,\n            \"che-token-<user987>-<che.server.com>\",\n            \"2340590skdf3<0>945i0923i4jasoidfj934ui50\",\n            bitbucketUser,\n            ImmutableSet.of(\"PROJECT_WRITE\", \"REPO_WRITE\"));\n    bitbucketPersonalAccessToken2 =\n        new BitbucketPersonalAccessToken(\n            \"3647456\",\n            234345345,\n            23534534,\n            90,\n            \"che-token-<user987>-<che.server.com>\",\n            \"34545<0>945i0923i4jasoidfj934ui50\",\n            bitbucketUser,\n            ImmutableSet.of(\"REPO_READ\"));\n    bitbucketPersonalAccessToken3 =\n        new BitbucketPersonalAccessToken(\n            \"132423\",\n            234345345,\n            23534534,\n            90,\n            \"che-token-<user987>-<che.server.com>\",\n            \"3456\\\\<0>945//i0923i4jasoidfj934ui50\",\n            bitbucketUser,\n            ImmutableSet.of(\"PROJECT_READ\", \"REPO_READ\"));\n    fetcher =\n        new BitbucketServerPersonalAccessTokenFetcher(\n            bitbucketServerApiClient, apiEndpoint, oAuthAPI);\n    EnvironmentContext context = new EnvironmentContext();\n    context.setSubject(subject);\n    EnvironmentContext.setCurrent(context);\n  }\n\n  @Test\n  public void shouldSkipToFetchUnknownUrls()\n      throws ScmUnauthorizedException, ScmCommunicationException {\n    // given\n    when(bitbucketServerApiClient.isConnected(eq(someNotBitbucketURL))).thenReturn(false);\n    // when\n    PersonalAccessToken result = fetcher.fetchPersonalAccessToken(subject, someNotBitbucketURL);\n    // then\n    assertNull(result);\n  }\n\n  @Test(\n      dataProvider = \"expectedExceptions\",\n      expectedExceptions = {ScmUnauthorizedException.class, ScmCommunicationException.class})\n  public void shouldRethrowBasicExceptionsOnGetUserStep(Class<? extends Throwable> exception)\n      throws ScmUnauthorizedException, ScmCommunicationException, ScmItemNotFoundException {\n    // given\n    when(bitbucketServerApiClient.isConnected(eq(someNotBitbucketURL))).thenReturn(true);\n    doThrow(exception).when(bitbucketServerApiClient).getUser();\n    // when\n    fetcher.fetchPersonalAccessToken(subject, someNotBitbucketURL);\n  }\n\n  @Test\n  public void shouldBeAbleToFetchPersonalAccessToken()\n      throws ScmUnauthorizedException,\n          ScmCommunicationException,\n          ScmItemNotFoundException,\n          ScmBadRequestException {\n    // given\n    when(bitbucketServerApiClient.isConnected(eq(someBitbucketURL))).thenReturn(true);\n    when(bitbucketServerApiClient.getUser()).thenReturn(bitbucketUser);\n    when(bitbucketServerApiClient.getPersonalAccessTokens()).thenReturn(Collections.emptyList());\n\n    when(bitbucketServerApiClient.createPersonalAccessTokens(\n            eq(\"che-token-<user987>-<che.server.com>\"),\n            eq(ImmutableSet.of(\"PROJECT_WRITE\", \"REPO_WRITE\"))))\n        .thenReturn(bitbucketPersonalAccessToken);\n    // when\n    PersonalAccessToken result = fetcher.fetchPersonalAccessToken(subject, someBitbucketURL);\n    // then\n    assertNotNull(result);\n    assertEquals(result.getScmProviderUrl(), someBitbucketURL);\n    assertEquals(result.getCheUserId(), subject.getUserId());\n    assertNull(result.getScmOrganization(), bitbucketUser.getName());\n    assertEquals(result.getScmTokenId(), valueOf(bitbucketPersonalAccessToken.getId()));\n    assertEquals(result.getToken(), bitbucketPersonalAccessToken.getToken());\n  }\n\n  @Test\n  public void shouldDeleteExistedCheTokenBeforeCreatingNew()\n      throws ScmUnauthorizedException,\n          ScmCommunicationException,\n          ScmItemNotFoundException,\n          ScmBadRequestException {\n    when(bitbucketServerApiClient.isConnected(eq(someBitbucketURL))).thenReturn(true);\n    when(bitbucketServerApiClient.getUser()).thenReturn(bitbucketUser);\n    when(bitbucketServerApiClient.getPersonalAccessTokens())\n        .thenReturn(ImmutableList.of(bitbucketPersonalAccessToken, bitbucketPersonalAccessToken2));\n    when(bitbucketServerApiClient.createPersonalAccessTokens(\n            eq(\"che-token-<user987>-<che.server.com>\"),\n            eq(ImmutableSet.of(\"PROJECT_WRITE\", \"REPO_WRITE\"))))\n        .thenReturn(bitbucketPersonalAccessToken3);\n    // when\n    PersonalAccessToken result = fetcher.fetchPersonalAccessToken(subject, someBitbucketURL);\n    // then\n    assertNotNull(result);\n    verify(bitbucketServerApiClient)\n        .deletePersonalAccessTokens(eq(bitbucketPersonalAccessToken.getId()));\n    verify(bitbucketServerApiClient)\n        .deletePersonalAccessTokens(eq(bitbucketPersonalAccessToken2.getId()));\n  }\n\n  @Test(expectedExceptions = {ScmCommunicationException.class})\n  public void shouldRethrowUnExceptionsOnCreatePersonalAccessTokens()\n      throws ScmUnauthorizedException,\n          ScmCommunicationException,\n          ScmItemNotFoundException,\n          ScmBadRequestException {\n    // given\n    when(bitbucketServerApiClient.isConnected(eq(someBitbucketURL))).thenReturn(true);\n    when(bitbucketServerApiClient.getUser()).thenReturn(bitbucketUser);\n    when(bitbucketServerApiClient.getPersonalAccessTokens()).thenReturn(Collections.emptyList());\n    doThrow(ScmBadRequestException.class)\n        .when(bitbucketServerApiClient)\n        .createPersonalAccessTokens(\n            eq(\"che-token-<user987>-<che.server.com>\"),\n            eq(ImmutableSet.of(\"PROJECT_WRITE\", \"REPO_WRITE\")));\n    // when\n\n    fetcher.fetchPersonalAccessToken(subject, someBitbucketURL);\n  }\n\n  @Test\n  public void shouldSkipToValidateTokensWithUnknownUrls()\n      throws ScmUnauthorizedException,\n          ScmCommunicationException,\n          ForbiddenException,\n          ServerException,\n          ConflictException,\n          UnauthorizedException,\n          NotFoundException,\n          BadRequestException {\n    // given\n    when(personalAccessTokenParams.getToken()).thenReturn(\"token\");\n    when(personalAccessTokenParams.getScmProviderUrl()).thenReturn(someNotBitbucketURL);\n    when(bitbucketServerApiClient.isConnected(eq(someNotBitbucketURL))).thenReturn(false);\n    // when\n    Optional<Pair<Boolean, String>> result = fetcher.isValid(personalAccessTokenParams);\n    // then\n    assertTrue(result.isEmpty());\n  }\n\n  @Test\n  public void shouldBeAbleToValidateToken()\n      throws ScmUnauthorizedException, ScmCommunicationException, ScmItemNotFoundException {\n    // given\n    when(personalAccessTokenParams.getScmProviderUrl()).thenReturn(someBitbucketURL);\n    when(personalAccessTokenParams.getToken()).thenReturn(bitbucketPersonalAccessToken.getToken());\n    when(bitbucketServerApiClient.isConnected(eq(someBitbucketURL))).thenReturn(true);\n    when(bitbucketServerApiClient.getUser(anyString())).thenReturn(bitbucketUser);\n    // when\n    Optional<Pair<Boolean, String>> result = fetcher.isValid(personalAccessTokenParams);\n    // then\n    assertFalse(result.isEmpty());\n    assertTrue(result.get().first);\n    assertEquals(result.get().second, bitbucketUser.getName());\n  }\n\n  @Test\n  public void shouldValidateTokenWithoutId()\n      throws ScmUnauthorizedException, ScmCommunicationException, ScmItemNotFoundException {\n    // given\n    when(personalAccessTokenParams.getScmProviderUrl()).thenReturn(someBitbucketURL);\n    when(personalAccessTokenParams.getToken()).thenReturn(\"token\");\n    when(bitbucketServerApiClient.isConnected(eq(someBitbucketURL))).thenReturn(true);\n    when(bitbucketServerApiClient.getUser(eq(\"token\"))).thenReturn(bitbucketUser);\n    // when\n    Optional<Pair<Boolean, String>> result = fetcher.isValid(personalAccessTokenParams);\n    // then\n    assertFalse(result.isEmpty());\n    assertTrue(result.get().first);\n    assertEquals(result.get().second, bitbucketUser.getName());\n  }\n\n  @DataProvider\n  public static Object[][] expectedExceptions() {\n    return new Object[][] {{ScmUnauthorizedException.class}, {ScmCommunicationException.class}};\n  }\n\n  @DataProvider\n  public static Object[][] unExpectedExceptions() {\n    return new Object[][] {{ScmBadRequestException.class}, {ScmItemNotFoundException.class}};\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerScmFileResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.*;\n\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketServerScmFileResolverTest {\n\n  public static final String SCM_URL = \"https://foo.bar\";\n  BitbucketServerURLParser bitbucketURLParser;\n\n  @Mock private OAuthAPI oAuthAPI;\n  @Mock private URLFetcher urlFetcher;\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n\n  private BitbucketServerScmFileResolver serverScmFileResolver;\n\n  @BeforeMethod\n  protected void init() {\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            SCM_URL, devfileFilenamesProvider, oAuthAPI, personalAccessTokenManager);\n    assertNotNull(this.bitbucketURLParser);\n    serverScmFileResolver =\n        new BitbucketServerScmFileResolver(\n            bitbucketURLParser, urlFetcher, personalAccessTokenManager);\n    assertNotNull(this.serverScmFileResolver);\n  }\n\n  /** Check url which is not a bitbucket url can't be accepted by this resolver */\n  @Test\n  public void checkInvalidAcceptUrl() {\n    // shouldn't be accepted\n    assertFalse(serverScmFileResolver.accept(\"http://github.com\"));\n  }\n\n  /** Check bitbucket url will be be accepted by this resolver */\n  @Test\n  public void checkValidAcceptUrl() {\n    // should be accepted\n    assertTrue(serverScmFileResolver.accept(\"https://foo.bar/scm/test/repo.git\"));\n  }\n\n  @Test\n  public void shouldReturnContentFromUrlFetcher() throws Exception {\n    final String rawContent = \"raw_content\";\n    final String filename = \"devfile.yaml\";\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenReturn(new PersonalAccessToken(SCM_URL, \"provider\", \"root\", \"token123\"));\n\n    when(urlFetcher.fetch(anyString(), eq(\"Bearer token123\"))).thenReturn(rawContent);\n\n    String content =\n        serverScmFileResolver.fileContent(\"https://foo.bar/scm/test/repo.git\", filename);\n\n    assertEquals(content, rawContent);\n  }\n\n  @Test\n  public void shouldFetchContentWithoutAuthentication() throws Exception {\n    // given\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenThrow(new ScmUnauthorizedException(\"message\", \"bitbucket-server\", \"v1\", \"url\"));\n\n    // when\n    serverScmFileResolver.fileContent(\"https://foo.bar/scm/~username/repo.git\", \"devfile.yaml\");\n\n    // then\n    verify(urlFetcher).fetch(anyString());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerURLParserTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static org.mockito.Mockito.mock;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketServerURLParserTest {\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n  @Mock private OAuthAPI oAuthAPI;\n\n  /** Instance of component that will be tested. */\n  private BitbucketServerURLParser bitbucketURLParser;\n\n  private WireMockServer wireMockServer;\n\n  @BeforeClass\n  public void prepare() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    new WireMock(\"localhost\", wireMockServer.port());\n  }\n\n  @BeforeMethod\n  public void setUp() {\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"https://bitbucket.2mcl.com,https://bbkt.com,https://my-bitbucket.org/bitbucket\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n  }\n\n  /** Check URLs are valid with regexp */\n  @Test(dataProvider = \"UrlsProvider\")\n  public void checkRegexp(String url) {\n    assertTrue(bitbucketURLParser.isValid(url), \"url \" + url + \" is invalid\");\n  }\n\n  @Test\n  public void shouldParseWithBranch() {\n    BitbucketServerUrl bitbucketServerUrl =\n        bitbucketURLParser.parse(\"https://my-bitbucket.org/bitbucket/scm/proj/repo.git\", \"branch\");\n    assertEquals(bitbucketServerUrl.getBranch(), \"branch\");\n  }\n\n  @Test\n  public void shouldParseWithUrlBranch() {\n    BitbucketServerUrl bitbucketServerUrl =\n        bitbucketURLParser.parse(\n            \"https://my-bitbucket.org/bitbucket/projects/proj/repos/repo/browse?at=master\",\n            \"branch\");\n    assertEquals(bitbucketServerUrl.getBranch(), \"master\");\n  }\n\n  /** Compare parsing */\n  @Test(dataProvider = \"parsing\")\n  public void checkParsing(\n      String url, String user, String project, String repository, String branch) {\n    BitbucketServerUrl bitbucketServerUrl = bitbucketURLParser.parse(url, null);\n\n    assertEquals(bitbucketServerUrl.getUser(), user);\n    assertEquals(bitbucketServerUrl.getProject(), project);\n    assertEquals(bitbucketServerUrl.getRepository(), repository);\n    assertEquals(bitbucketServerUrl.getBranch(), branch);\n  }\n\n  @Test(dataProvider = \"parsing\")\n  public void shouldParseWithoutPredefinedEndpoint(\n      String url, String user, String project, String repository, String branch) {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            null, devfileFilenamesProvider, oAuthAPI, mock(PersonalAccessTokenManager.class));\n\n    // when\n    BitbucketServerUrl bitbucketServerUrl = bitbucketURLParser.parse(url, null);\n\n    // then\n    assertEquals(bitbucketServerUrl.getUser(), user);\n    assertEquals(bitbucketServerUrl.getProject(), project);\n    assertEquals(bitbucketServerUrl.getRepository(), repository);\n    assertEquals(bitbucketServerUrl.getBranch(), branch);\n  }\n\n  @Test(\n      expectedExceptions = IllegalArgumentException.class,\n      expectedExceptionsMessageRegExp =\n          \"The given url https://github.com/org/repo is not a valid Bitbucket server URL. Check either URL or server configuration.\")\n  public void shouldThrowExceptionWhenURLDintMatchAnyConfiguredServer() {\n    bitbucketURLParser.parse(\"https://github.com/org/repo\", null);\n  }\n\n  @Test\n  public void shouldValidateUrlByApiRequest() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            null, devfileFilenamesProvider, oAuthAPI, mock(PersonalAccessTokenManager.class));\n    String url = wireMockServer.url(\"/users/user/repos/repo\");\n    stubFor(\n        get(urlEqualTo(\"/rest/api/1.0/application-properties\"))\n            .willReturn(\n                aResponse()\n                    .withBodyFile(\"bitbucket/rest/api.1.0.application-properties/response.json\")));\n\n    // when\n    boolean result = bitbucketURLParser.isValid(url);\n\n    // then\n    assertTrue(result);\n  }\n\n  @Test\n  public void shouldValidateUrlByApiRequestButFailOnPatternCheck() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            null, devfileFilenamesProvider, oAuthAPI, mock(PersonalAccessTokenManager.class));\n    String url = wireMockServer.url(\"/user/repo\");\n    stubFor(\n        get(urlEqualTo(\"/rest/api/1.0/application-properties\"))\n            .willReturn(\n                aResponse()\n                    .withBodyFile(\"bitbucket/rest/api.1.0.application-properties/response.json\")));\n\n    // when\n    boolean result = bitbucketURLParser.isValid(url);\n\n    // then\n    assertFalse(result);\n  }\n\n  @Test\n  public void shouldNotValidateUrlByApiRequestWithBadRequest() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            null, devfileFilenamesProvider, oAuthAPI, mock(PersonalAccessTokenManager.class));\n    String url = wireMockServer.url(\"/users/user/repos/repo\");\n    stubFor(\n        get(urlEqualTo(\"/rest/api/1.0/application-properties\"))\n            .willReturn(aResponse().withStatus(400)));\n\n    // when\n    boolean result = bitbucketURLParser.isValid(url);\n\n    // then\n    assertFalse(result);\n  }\n\n  @Test\n  public void shouldNotValidateUrlByApiRequestWithEmptyData() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            null, devfileFilenamesProvider, oAuthAPI, mock(PersonalAccessTokenManager.class));\n    String url = wireMockServer.url(\"/users/user/repos/repo\");\n    stubFor(\n        get(urlEqualTo(\"/rest/api/1.0/application-properties\"))\n            .willReturn(aResponse().withBody(\"\")));\n\n    // when\n    boolean result = bitbucketURLParser.isValid(url);\n\n    // then\n    assertFalse(result);\n  }\n\n  @Test\n  public void shouldNotValidateUrlByApiRequestWithEmptyHeader() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            null, devfileFilenamesProvider, oAuthAPI, mock(PersonalAccessTokenManager.class));\n    String url = wireMockServer.url(\"/users/user/repos/repo\");\n    stubFor(\n        get(urlEqualTo(\"/rest/api/1.0/application-properties\"))\n            .willReturn(aResponse().withStatus(200)));\n\n    // when\n    boolean result = bitbucketURLParser.isValid(url);\n\n    // then\n    assertFalse(result);\n  }\n\n  @Test\n  public void shouldParseIpv6HttpsUrl() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    BitbucketServerUrl bitbucketServerUrl =\n        bitbucketURLParser.parse(\"https://[2001:db8::1]/scm/project/repo.git\", null);\n\n    // then\n    assertEquals(bitbucketServerUrl.getProject(), \"project\");\n    assertEquals(bitbucketServerUrl.getRepository(), \"repo\");\n  }\n\n  @Test\n  public void shouldParseIpv6HttpsUrlWithUserRepo() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    BitbucketServerUrl bitbucketServerUrl =\n        bitbucketURLParser.parse(\"https://[2001:db8::1]/scm/~user/repo.git\", null);\n\n    // then\n    assertEquals(bitbucketServerUrl.getUser(), \"user\");\n    assertEquals(bitbucketServerUrl.getRepository(), \"repo\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithBranch() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    BitbucketServerUrl bitbucketServerUrl =\n        bitbucketURLParser.parse(\n            \"https://[2001:db8::1]/projects/project/repos/repo/browse?at=refs%2Fheads%2Ffeature\",\n            null);\n\n    // then\n    assertEquals(bitbucketServerUrl.getProject(), \"project\");\n    assertEquals(bitbucketServerUrl.getRepository(), \"repo\");\n    assertEquals(bitbucketServerUrl.getBranch(), \"feature\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithRevisionParam() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    BitbucketServerUrl bitbucketServerUrl =\n        bitbucketURLParser.parse(\"https://[2001:db8::1]/scm/project/repo.git\", \"my-branch\");\n\n    // then\n    assertEquals(bitbucketServerUrl.getProject(), \"project\");\n    assertEquals(bitbucketServerUrl.getRepository(), \"repo\");\n    assertEquals(bitbucketServerUrl.getBranch(), \"my-branch\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithUserBrowse() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    BitbucketServerUrl bitbucketServerUrl =\n        bitbucketURLParser.parse(\n            \"https://[2001:db8::1]/users/user/repos/repo/browse?at=refs/heads/main\", null);\n\n    // then\n    assertEquals(bitbucketServerUrl.getUser(), \"user\");\n    assertEquals(bitbucketServerUrl.getRepository(), \"repo\");\n    assertEquals(bitbucketServerUrl.getBranch(), \"main\");\n  }\n\n  @Test\n  public void shouldParseIpv6LoopbackAddress() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"https://[::1]\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    BitbucketServerUrl bitbucketServerUrl =\n        bitbucketURLParser.parse(\"https://[::1]/scm/project/repo.git\", null);\n\n    // then\n    assertEquals(bitbucketServerUrl.getProject(), \"project\");\n    assertEquals(bitbucketServerUrl.getRepository(), \"repo\");\n  }\n\n  @Test\n  public void shouldParseIpv6FullFormAddress() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"https://[2001:0db8:0000:0000:0000:0000:0000:0001]\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    BitbucketServerUrl bitbucketServerUrl =\n        bitbucketURLParser.parse(\n            \"https://[2001:0db8:0000:0000:0000:0000:0000:0001]/scm/project/repo.git\", null);\n\n    // then\n    assertEquals(bitbucketServerUrl.getProject(), \"project\");\n    assertEquals(bitbucketServerUrl.getRepository(), \"repo\");\n  }\n\n  @Test\n  public void shouldValidateIpv6Url() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n\n    // when/then\n    assertTrue(bitbucketURLParser.isValid(\"https://[2001:db8::1]/scm/project/repo.git\"));\n  }\n\n  @Test\n  public void shouldValidateIpv6UrlWithProjectsBrowse() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n\n    // when/then\n    assertTrue(\n        bitbucketURLParser.isValid(\"https://[2001:db8::1]/projects/project/repos/repo/browse\"));\n  }\n\n  @Test\n  public void shouldParseIpv6SshUrl() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    BitbucketServerUrl bitbucketServerUrl =\n        bitbucketURLParser.parse(\"ssh://git@[2001:db8::1]:7999/project/repo.git\", null);\n\n    // then\n    assertEquals(bitbucketServerUrl.getProject(), \"project\");\n    assertEquals(bitbucketServerUrl.getRepository(), \"repo\");\n  }\n\n  @Test\n  public void shouldParseIpv6SshUrlWithUserRepo() {\n    // given\n    bitbucketURLParser =\n        new BitbucketServerURLParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            oAuthAPI,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    BitbucketServerUrl bitbucketServerUrl =\n        bitbucketURLParser.parse(\"ssh://git@[2001:db8::1]:7999/~user/repo.git\", null);\n\n    // then\n    assertEquals(bitbucketServerUrl.getUser(), \"user\");\n    assertEquals(bitbucketServerUrl.getRepository(), \"repo\");\n  }\n\n  @DataProvider(name = \"UrlsProvider\")\n  public Object[][] urls() {\n    return new Object[][] {\n      {\"https://my-bitbucket.org/bitbucket/scm/proj/repo.git\"},\n      {\"https://bitbucket.2mcl.com/scm/~user/repo.git\"},\n      {\"https://bitbucket.2mcl.com/scm/project/test1.git\"},\n      {\"https://bitbucket.2mcl.com/projects/project/repos/test1/browse?at=refs%2Fheads%2Fbranch\"},\n      {\"https://bitbucket.2mcl.com/projects/project/repos/test1/browse\"},\n      {\"https://bitbucket.2mcl.com/users/user/repos/repo\"},\n      {\"https://bitbucket.2mcl.com/users/user/repos/repo/\"},\n      {\"https://bbkt.com/scm/project/test1.git\"},\n      {\"ssh://git@bitbucket.2mcl.com:12345/~user/repo.git\"},\n      {\"ssh://git@bitbucket.2mcl.com:12345/project/test1.git\"},\n      {\"ssh://git@bitbucket.2mcl.com/~user/repo.git\"},\n      {\"ssh://git@bitbucket.2mcl.com/project/test1.git\"}\n    };\n  }\n\n  @DataProvider(name = \"parsing\")\n  public Object[][] expectedParsing() {\n    return new Object[][] {\n      {\"https://bitbucket.2mcl.com/scm/project/test1.git\", null, \"project\", \"test1\", null},\n      {\"ssh://git@bitbucket.2mcl.com:12345/project/test1.git\", null, \"project\", \"test1\", null},\n      {\"ssh://git@bitbucket.2mcl.com:12345/~user/test1.git\", \"user\", null, \"test1\", null},\n      {\n        \"https://bitbucket.2mcl.com/projects/project/repos/test1/browse?at=refs%2Fheads%2Fbranch\",\n        null,\n        \"project\",\n        \"test1\",\n        \"branch\"\n      },\n      {\n        \"https://bbkt.com/projects/project/repos/test1/browse?at=refs%2Fheads%2Fbranch\",\n        null,\n        \"project\",\n        \"test1\",\n        \"branch\"\n      },\n      {\n        \"https://bitbucket.2mcl.com/users/user/repos/repo/browse?at=refs/heads/branch\",\n        \"user\",\n        null,\n        \"repo\",\n        \"branch\"\n      },\n      {\"https://bitbucket.2mcl.com/users/user/repos/repo/browse\", \"user\", null, \"repo\", null},\n      {\"https://bbkt.com/users/user/repos/repo/\", \"user\", null, \"repo\", null}\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerURLTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static java.lang.String.format;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.Arrays;\nimport java.util.Iterator;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketServerURLTest {\n  private BitbucketServerURLParser bitbucketServerURLParser;\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  @BeforeMethod\n  protected void init() {\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n    bitbucketServerURLParser =\n        new BitbucketServerURLParser(\n            \"https://bitbucket.net\",\n            devfileFilenamesProvider,\n            mock(OAuthAPI.class),\n            mock(PersonalAccessTokenManager.class));\n  }\n\n  @Test(dataProvider = \"urlsProvider\")\n  public void checkDevfileLocation(String repoUrl, String fileUrl) {\n    lenient()\n        .when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n\n    BitbucketServerUrl gitlabUrl = bitbucketServerURLParser.parse(repoUrl, null);\n    assertEquals(gitlabUrl.devfileFileLocations().size(), 2);\n    Iterator<RemoteFactoryUrl.DevfileLocation> iterator =\n        gitlabUrl.devfileFileLocations().iterator();\n    assertEquals(iterator.next().location(), format(fileUrl, \"devfile.yaml\"));\n    assertEquals(iterator.next().location(), format(fileUrl, \"foo.bar\"));\n  }\n\n  @DataProvider\n  public static Object[][] urlsProvider() {\n    return new Object[][] {\n      {\n        \"https://bitbucket.net/scm/~user/repo.git\",\n        \"https://bitbucket.net/rest/api/1.0/users/user/repos/repo/raw/%s\"\n      },\n      {\n        \"https://bitbucket.net/users/user/repos/repo/browse?at=branch\",\n        \"https://bitbucket.net/rest/api/1.0/users/user/repos/repo/raw/%s?at=branch\"\n      },\n      {\n        \"https://bitbucket.net/users/user/repos/repo\",\n        \"https://bitbucket.net/rest/api/1.0/users/user/repos/repo/raw/%s\"\n      },\n      {\n        \"https://bitbucket.net/scm/project/repo.git\",\n        \"https://bitbucket.net/rest/api/1.0/projects/project/repos/repo/raw/%s\"\n      },\n      {\n        \"https://bitbucket.net/projects/project/repos/repo/browse?at=branch\",\n        \"https://bitbucket.net/rest/api/1.0/projects/project/repos/repo/raw/%s?at=branch\"\n      },\n      {\n        \"ssh://git@bitbucket.net:12345/project/repo.git\",\n        \"https://bitbucket.net/rest/api/1.0/projects/project/repos/repo/raw/%s\"\n      },\n      {\n        \"ssh://git@bitbucket.net:12345/~user/repo.git\",\n        \"https://bitbucket.net/rest/api/1.0/users/user/repos/repo/raw/%s\"\n      }\n    };\n  }\n\n  @Test(dataProvider = \"repoProvider\")\n  public void checkRepositoryLocation(String rawUrl, String repoUrl) {\n    BitbucketServerUrl bitbucketServerUrl = bitbucketServerURLParser.parse(rawUrl, null);\n    assertEquals(bitbucketServerUrl.repositoryLocation(), repoUrl);\n  }\n\n  @Test(dataProvider = \"urlsProvider\")\n  public void shouldReturnProviderUrl(String repoUrl, String ignored) {\n    // when\n    BitbucketServerUrl bitbucketServerUrl = bitbucketServerURLParser.parse(repoUrl, null);\n\n    // then\n    assertEquals(bitbucketServerUrl.getProviderUrl(), \"https://bitbucket.net\");\n  }\n\n  @DataProvider\n  public static Object[][] repoProvider() {\n    return new Object[][] {\n      {\"https://bitbucket.net/scm/~user/repo.git\", \"https://bitbucket.net/scm/~user/repo.git\"},\n      {\n        \"https://bitbucket.net/users/user/repos/repo/browse?at=branch\",\n        \"https://bitbucket.net/scm/~user/repo.git\"\n      },\n      {\"https://bitbucket.net/users/user/repos/repo\", \"https://bitbucket.net/scm/~user/repo.git\"},\n      {\"https://bitbucket.net/scm/project/repo.git\", \"https://bitbucket.net/scm/project/repo.git\"},\n      {\n        \"https://bitbucket.net/projects/project/repos/repo/browse?at=branch\",\n        \"https://bitbucket.net/scm/project/repo.git\"\n      },\n      {\n        \"ssh://git@bitbucket.net:12345/project/repo.git\",\n        \"ssh://git@bitbucket.net:12345/project/repo.git\"\n      },\n      {\n        \"ssh://git@bitbucket.net:12345/~user/repo.git\",\n        \"ssh://git@bitbucket.net:12345/~user/repo.git\"\n      },\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerUserDataFetcherTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport java.net.MalformedURLException;\nimport java.util.Collections;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketServerApiClient;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketUser;\nimport org.eclipse.che.api.factory.server.scm.GitUserData;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.*;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class BitbucketServerUserDataFetcherTest {\n  String someBitbucketURL = \"https://some.bitbucketserver.com\";\n  Subject subject;\n  @Mock BitbucketServerApiClient bitbucketServerApiClient;\n  @Mock PersonalAccessTokenManager personalAccessTokenManager;\n  @Mock OAuthAPI oAuthAPI;\n  BitbucketUser bitbucketUser;\n  BitbucketServerUserDataFetcher fetcher;\n\n  @BeforeMethod\n  public void setup() throws MalformedURLException {\n    subject =\n        new SubjectImpl(\"another_user\", Collections.emptyList(), \"user987\", \"token111\", false);\n    bitbucketUser =\n        new BitbucketUser(\"User\", \"user\", 32423523, \"NORMAL\", true, \"user\", \"user@users.com\");\n    fetcher =\n        new BitbucketServerUserDataFetcher(\n            \"api.local\",\n            someBitbucketURL,\n            bitbucketServerApiClient,\n            oAuthAPI,\n            personalAccessTokenManager);\n    EnvironmentContext context = new EnvironmentContext();\n    context.setSubject(subject);\n    EnvironmentContext.setCurrent(context);\n  }\n\n  @Test\n  public void shouldBeAbleToFetchPersonalAccessToken()\n      throws ScmUnauthorizedException,\n          ScmCommunicationException,\n          ScmItemNotFoundException,\n          ScmBadRequestException,\n          ScmConfigurationPersistenceException {\n    // given\n    when(bitbucketServerApiClient.isConnected(eq(someBitbucketURL))).thenReturn(true);\n    when(bitbucketServerApiClient.getUser()).thenReturn(bitbucketUser);\n    // when\n    GitUserData gitUserData = fetcher.fetchGitUserData(null);\n    // then\n    assertEquals(gitUserData.getScmUsername(), \"User\");\n    assertEquals(gitUserData.getScmUserEmail(), \"user@users.com\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/HttpBitbucketServerApiClientTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.bitbucket;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.delete;\nimport static com.github.tomakehurst.wiremock.client.WireMock.equalTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.notFound;\nimport static com.github.tomakehurst.wiremock.client.WireMock.ok;\nimport static com.github.tomakehurst.wiremock.client.WireMock.put;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.unauthorized;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableSet;\nimport com.google.common.net.HttpHeaders;\nimport jakarta.ws.rs.core.MediaType;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketPersonalAccessToken;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketServerApiClient;\nimport org.eclipse.che.api.factory.server.bitbucket.server.BitbucketUser;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.eclipse.che.security.oauth1.BitbucketServerOAuthAuthenticator;\nimport org.eclipse.che.security.oauth1.NoopOAuthAuthenticator;\nimport org.eclipse.che.security.oauth1.OAuthAuthenticationException;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class HttpBitbucketServerApiClientTest {\n  private final String AUTHORIZATION_TOKEN =\n      \"OAuth oauth_consumer_key=\\\"key123321\\\", oauth_nonce=\\\"nonce\\\",\"\n          + \" oauth_signature=\\\"signature\\\", \"\n          + \"oauth_signature_method=\\\"RSA-SHA1\\\", oauth_timestamp=\\\"1609250025\\\", \"\n          + \"oauth_token=\\\"token\\\", oauth_version=\\\"1.0\\\"\";\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n  BitbucketServerApiClient bitbucketServer;\n\n  @Mock OAuthAPI oAuthAPI;\n  String apiEndpoint;\n\n  @BeforeMethod\n  void start() {\n    oAuthAPI = mock(OAuthAPI.class);\n    apiEndpoint = \"apiEndpoint\";\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    wireMock = new WireMock(\"localhost\", wireMockServer.port());\n    bitbucketServer =\n        new HttpBitbucketServerApiClient(\n            wireMockServer.url(\"/\"),\n            new BitbucketServerOAuthAuthenticator(\"\", \"\", \"\", \"\") {\n              @Override\n              public String computeAuthorizationHeader(\n                  String userId, String requestMethod, String requestUrl)\n                  throws OAuthAuthenticationException {\n                return AUTHORIZATION_TOKEN;\n              }\n            },\n            oAuthAPI,\n            apiEndpoint);\n    stubFor(\n        get(urlEqualTo(\"/rest/api/1.0/application-properties\"))\n            .willReturn(aResponse().withHeader(\"x-ausername\", \"ksmster\")));\n  }\n\n  @AfterMethod\n  void stop() {\n    wireMockServer.stop();\n  }\n\n  @Test\n  public void testGetUser()\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException {\n    stubFor(\n        get(urlEqualTo(\"/rest/api/1.0/users/ksmster\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/ksmster/response.json\")));\n\n    stubFor(\n        get(urlPathEqualTo(\"/rest/api/1.0/users\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withQueryParam(\"start\", equalTo(\"0\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/filtered/response.json\")));\n\n    BitbucketUser user = bitbucketServer.getUser();\n    assertNotNull(user);\n  }\n\n  @Test\n  public void shouldGetUserWithSpecialCharacters()\n      throws ScmItemNotFoundException, ScmUnauthorizedException, ScmCommunicationException {\n    stubFor(\n        get(urlEqualTo(\"/rest/api/1.0/application-properties\"))\n            .willReturn(aResponse().withHeader(\"x-ausername\", \"user%40email.com\")));\n    stubFor(\n        get(urlEqualTo(\"/rest/api/1.0/users?start=0&limit=25&filter=user@email.com\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withQueryParam(\"start\", equalTo(\"0\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .withQueryParam(\"filter\", equalTo(\"user@email.com\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/email-user/response.json\")));\n\n    BitbucketUser user = bitbucketServer.getUser();\n    assertNotNull(user);\n  }\n\n  @Test\n  public void testGetUsers()\n      throws ScmCommunicationException, ScmBadRequestException, ScmUnauthorizedException {\n    stubFor(\n        get(urlPathEqualTo(\"/rest/api/1.0/users\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withQueryParam(\"start\", equalTo(\"0\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/response_s0_l25.json\")));\n    stubFor(\n        get(urlPathEqualTo(\"/rest/api/1.0/users\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withQueryParam(\"start\", equalTo(\"3\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/response_s3_l25.json\")));\n    stubFor(\n        get(urlPathEqualTo(\"/rest/api/1.0/users\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withQueryParam(\"start\", equalTo(\"6\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/response_s6_l25.json\")));\n    stubFor(\n        get(urlPathEqualTo(\"/rest/api/1.0/users\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withQueryParam(\"start\", equalTo(\"9\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/response_s9_l25.json\")));\n\n    List<String> page =\n        bitbucketServer.getUsers().stream()\n            .map(BitbucketUser::getSlug)\n            .collect(Collectors.toList());\n    assertEquals(\n        page,\n        ImmutableList.of(\n            \"admin\",\n            \"ksmster\",\n            \"skabashn\",\n            \"user1\",\n            \"user2\",\n            \"user3\",\n            \"user4\",\n            \"user5\",\n            \"user6\",\n            \"user7\"));\n  }\n\n  @Test\n  public void testGetUsersFiltered()\n      throws ScmCommunicationException, ScmBadRequestException, ScmUnauthorizedException {\n    stubFor(\n        get(urlPathEqualTo(\"/rest/api/1.0/users\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withQueryParam(\"start\", equalTo(\"0\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/filtered/response.json\")));\n\n    List<String> page =\n        bitbucketServer.getUsers(\"ksmster\").stream()\n            .map(BitbucketUser::getSlug)\n            .collect(Collectors.toList());\n    assertEquals(page, ImmutableList.of(\"admin\", \"ksmster\"));\n  }\n\n  @Test\n  public void testGetPersonalAccessTokens()\n      throws ScmCommunicationException,\n          ScmBadRequestException,\n          ScmItemNotFoundException,\n          ScmUnauthorizedException {\n    stubFor(\n        get(urlPathEqualTo(\"/rest/access-tokens/1.0/users/ksmster\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withQueryParam(\"start\", equalTo(\"0\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/access-tokens/1.0/users/ksmster/response.json\")));\n\n    stubFor(\n        get(urlPathEqualTo(\"/rest/api/1.0/users\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withQueryParam(\"start\", equalTo(\"0\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/filtered/response.json\")));\n\n    List<String> page =\n        bitbucketServer.getPersonalAccessTokens().stream()\n            .map(BitbucketPersonalAccessToken::getName)\n            .collect(Collectors.toList());\n    assertEquals(page, ImmutableList.of(\"che\", \"t2\"));\n  }\n\n  @Test\n  public void shouldBeAbleToCreatePAT()\n      throws ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException,\n          ScmItemNotFoundException {\n\n    // given\n    stubFor(\n        put(urlPathEqualTo(\"/rest/access-tokens/1.0/users/ksmster\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withHeader(HttpHeaders.ACCEPT, equalTo(MediaType.APPLICATION_JSON))\n            .withHeader(HttpHeaders.CONTENT_TYPE, equalTo(MediaType.APPLICATION_JSON))\n            .withHeader(HttpHeaders.CONTENT_LENGTH, equalTo(\"152\"))\n            .willReturn(\n                ok().withBodyFile(\"bitbucket/rest/access-tokens/1.0/users/ksmster/newtoken.json\")));\n    stubFor(\n        get(urlPathEqualTo(\"/rest/api/1.0/users\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withQueryParam(\"start\", equalTo(\"0\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/filtered/response.json\")));\n\n    // when\n    BitbucketPersonalAccessToken result =\n        bitbucketServer.createPersonalAccessTokens(\n            \"myToKen\", ImmutableSet.of(\"PROJECT_WRITE\", \"REPO_WRITE\"));\n    // then\n    assertNotNull(result);\n    assertEquals(result.getToken(), \"token\");\n  }\n\n  @Test\n  public void shouldBeAbleToDeletePAT()\n      throws ScmCommunicationException, ScmUnauthorizedException, ScmItemNotFoundException {\n\n    // given\n    stubFor(\n        delete(urlPathEqualTo(\"/rest/access-tokens/1.0/users/ksmster/5\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withHeader(HttpHeaders.ACCEPT, equalTo(MediaType.APPLICATION_JSON))\n            .withHeader(HttpHeaders.CONTENT_TYPE, equalTo(MediaType.APPLICATION_JSON))\n            .willReturn(aResponse().withStatus(204)));\n\n    stubFor(\n        get(urlPathEqualTo(\"/rest/api/1.0/users\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withQueryParam(\"start\", equalTo(\"0\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/filtered/response.json\")));\n\n    // when\n    bitbucketServer.deletePersonalAccessTokens(\"5\");\n  }\n\n  @Test\n  public void shouldBeAbleToGetExistedPAT()\n      throws ScmCommunicationException, ScmUnauthorizedException, ScmItemNotFoundException {\n\n    // given\n    stubFor(\n        get(urlPathEqualTo(\"/rest/access-tokens/1.0/users/ksmster/5\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token\"))\n            .withHeader(HttpHeaders.ACCEPT, equalTo(MediaType.APPLICATION_JSON))\n            .willReturn(\n                ok().withBodyFile(\"bitbucket/rest/access-tokens/1.0/users/ksmster/newtoken.json\")));\n\n    stubFor(\n        get(urlPathEqualTo(\"/rest/api/1.0/users\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token\"))\n            .withQueryParam(\"start\", equalTo(\"0\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/filtered/response.json\")));\n\n    // when\n    BitbucketPersonalAccessToken result = bitbucketServer.getPersonalAccessToken(\"5\", \"token\");\n    // then\n    assertNotNull(result);\n    assertEquals(result.getToken(), \"token\");\n  }\n\n  @Test(expectedExceptions = ScmItemNotFoundException.class)\n  public void shouldBeAbleToThrowNotFoundOnGePAT()\n      throws ScmCommunicationException, ScmUnauthorizedException, ScmItemNotFoundException {\n\n    // given\n    stubFor(\n        get(urlPathEqualTo(\"/rest/access-tokens/1.0/users/ksmster/5\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(AUTHORIZATION_TOKEN))\n            .withHeader(HttpHeaders.ACCEPT, equalTo(MediaType.APPLICATION_JSON))\n            .willReturn(notFound()));\n\n    // when\n    bitbucketServer.getPersonalAccessToken(\"5\", \"token\");\n  }\n\n  @Test(expectedExceptions = ScmUnauthorizedException.class)\n  public void shouldBeAbleToThrowScmUnauthorizedExceptionOnGetUser()\n      throws ScmCommunicationException, ScmUnauthorizedException, ScmItemNotFoundException {\n    // given\n    stubFor(\n        get(urlEqualTo(\"/rest/api/1.0/application-properties\"))\n            .willReturn(\n                aResponse()\n                    .withBodyFile(\"bitbucket/rest/api.1.0.application-properties/response.json\")));\n\n    // when\n    bitbucketServer.getUser();\n  }\n\n  @Test(expectedExceptions = ScmCommunicationException.class)\n  public void shouldBeAbleToThrowScmCommunicationExceptionOnGetUser()\n      throws ScmCommunicationException, ScmUnauthorizedException, ScmItemNotFoundException {\n    // given\n    stubFor(get(urlEqualTo(\"/rest/api/1.0/application-properties\")).willReturn(aResponse()));\n\n    // when\n    bitbucketServer.getUser();\n  }\n\n  @Test(expectedExceptions = ScmUnauthorizedException.class)\n  public void shouldBeAbleToThrowScmUnauthorizedExceptionOnGetPAT()\n      throws ScmCommunicationException, ScmUnauthorizedException, ScmItemNotFoundException {\n\n    // given\n    stubFor(\n        get(urlPathEqualTo(\"/rest/access-tokens/1.0/users/ksmster/5\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token\"))\n            .withHeader(HttpHeaders.ACCEPT, equalTo(MediaType.APPLICATION_JSON))\n            .willReturn(unauthorized()));\n    stubFor(\n        get(urlPathEqualTo(\"/rest/api/1.0/users\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token\"))\n            .withQueryParam(\"start\", equalTo(\"0\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/filtered/response.json\")));\n\n    // when\n    bitbucketServer.getPersonalAccessToken(\"5\", \"token\");\n  }\n\n  @Test(\n      expectedExceptions = ScmCommunicationException.class,\n      expectedExceptionsMessageRegExp =\n          \"The fallback noop authenticator cannot be used for authentication. Make sure OAuth is properly configured.\")\n  public void shouldThrowScmCommunicationExceptionInNoOauthAuthenticator()\n      throws ScmCommunicationException,\n          ScmUnauthorizedException,\n          ScmItemNotFoundException,\n          ForbiddenException,\n          ServerException,\n          ConflictException,\n          UnauthorizedException,\n          NotFoundException,\n          BadRequestException {\n\n    // given\n    when(oAuthAPI.getOrRefreshToken(eq(\"bitbucket-server\"))).thenReturn(mock(OAuthToken.class));\n    HttpBitbucketServerApiClient localServer =\n        new HttpBitbucketServerApiClient(\n            wireMockServer.url(\"/\"), new NoopOAuthAuthenticator(), oAuthAPI, apiEndpoint);\n\n    // when\n    localServer.getUser();\n  }\n\n  @Test\n  public void shouldGetOauth2Token()\n      throws ScmItemNotFoundException,\n          ScmUnauthorizedException,\n          ScmCommunicationException,\n          ForbiddenException,\n          ServerException,\n          ConflictException,\n          UnauthorizedException,\n          NotFoundException,\n          BadRequestException {\n    // given\n    OAuthToken token = mock(OAuthToken.class);\n    when(token.getToken()).thenReturn(\"token\");\n    when(oAuthAPI.getOrRefreshToken(eq(\"bitbucket-server\"))).thenReturn(token);\n    bitbucketServer =\n        new HttpBitbucketServerApiClient(\n            wireMockServer.url(\"/\"), new NoopOAuthAuthenticator(), oAuthAPI, apiEndpoint);\n    stubFor(\n        get(urlEqualTo(\"/rest/api/1.0/users/ksmster\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/ksmster/response.json\")));\n\n    stubFor(\n        get(urlPathEqualTo(\"/rest/api/1.0/users\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token\"))\n            .withQueryParam(\"start\", equalTo(\"0\"))\n            .withQueryParam(\"limit\", equalTo(\"25\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"bitbucket/rest/api/1.0/users/filtered/response.json\")));\n\n    // when\n    bitbucketServer.getUser();\n\n    // then\n    verify(oAuthAPI, times(2)).getOrRefreshToken(eq(\"bitbucket-server\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/resources/__files/bitbucket/rest/access-tokens/1.0/users/ksmster/newtoken.json",
    "content": "{\n  \"id\": \"158910532909\",\n  \"createdDate\": 1609249808751,\n  \"expiryDays\": 90,\n  \"name\": \"che5\",\n  \"permissions\": [\n    \"PROJECT_WRITE\",\n    \"REPO_WRITE\"\n  ],\n  \"user\": {\n    \"name\": \"ksmster\",\n    \"emailAddress\": \"ksmster@gmail.com\",\n    \"id\": 2,\n    \"displayName\": \"ksmster\",\n    \"active\": true,\n    \"slug\": \"ksmster\",\n    \"type\": \"NORMAL\",\n    \"links\": {\n      \"self\": [\n        {\n          \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c5ac.devtools-c5ac.example.opentlc.com/users/ksmster\"\n        }\n      ]\n    }\n  },\n  \"token\": \"token\"\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/resources/__files/bitbucket/rest/access-tokens/1.0/users/ksmster/response.json",
    "content": "{\n  \"size\": 2,\n  \"limit\": 25,\n  \"isLastPage\": true,\n  \"values\": [\n    {\n      \"id\": \"898123953680\",\n      \"createdDate\": 1609227270831,\n      \"name\": \"che\",\n      \"permissions\": [\n        \"PROJECT_WRITE\",\n        \"REPO_WRITE\"\n      ],\n      \"user\": {\n        \"name\": \"ksmster\",\n        \"emailAddress\": \"ksmster@gmail.com\",\n        \"id\": 2,\n        \"displayName\": \"ksmster\",\n        \"active\": true,\n        \"slug\": \"ksmster\",\n        \"type\": \"NORMAL\",\n        \"links\": {\n          \"self\": [\n            {\n              \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c5ac.devtools-c5ac.example.opentlc.com/users/ksmster\"\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"id\": \"080920112506\",\n      \"createdDate\": 1609227263410,\n      \"name\": \"t2\",\n      \"permissions\": [\n        \"REPO_ADMIN\",\n        \"PROJECT_WRITE\"\n      ],\n      \"user\": {\n        \"name\": \"ksmster\",\n        \"emailAddress\": \"ksmster@gmail.com\",\n        \"id\": 2,\n        \"displayName\": \"ksmster\",\n        \"active\": true,\n        \"slug\": \"ksmster\",\n        \"type\": \"NORMAL\",\n        \"links\": {\n          \"self\": [\n            {\n              \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c5ac.devtools-c5ac.example.opentlc.com/users/ksmster\"\n            }\n          ]\n        }\n      }\n    }\n  ],\n  \"start\": 0\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/resources/__files/bitbucket/rest/api/1.0/users/email-user/response.json",
    "content": "{\n  \"size\": 1,\n  \"limit\": 3,\n  \"isLastPage\": true,\n  \"values\": [\n    {\n      \"name\": \"user@email.com\",\n      \"emailAddress\": \"user@email.com\",\n      \"id\": 58,\n      \"displayName\": \"user\",\n      \"active\": true,\n      \"slug\": \"user@email.com\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/user%40email.com\"\n          }\n        ]\n      }\n    }\n  ],\n  \"start\": 9\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/resources/__files/bitbucket/rest/api/1.0/users/filtered/response.json",
    "content": "{\n  \"size\": 2,\n  \"limit\": 25,\n  \"isLastPage\": true,\n  \"values\": [\n    {\n      \"name\": \"admin\",\n      \"emailAddress\": \"admin@ksmster.com\",\n      \"id\": 1,\n      \"displayName\": \"Admin\",\n      \"active\": true,\n      \"slug\": \"admin\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c5ac.devtools-c5ac.example.opentlc.com/users/admin\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"ksmster\",\n      \"emailAddress\": \"ksmster@gmail.com\",\n      \"id\": 2,\n      \"displayName\": \"ksmster\",\n      \"active\": true,\n      \"slug\": \"ksmster\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c5ac.devtools-c5ac.example.opentlc.com/users/ksmster\"\n          }\n        ]\n      }\n    }\n  ],\n  \"start\": 0\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/resources/__files/bitbucket/rest/api/1.0/users/ksmster/response.json",
    "content": "{\n  \"name\": \"ksmster\",\n  \"emailAddress\": \"ksmster@gmail.com\",\n  \"id\": 2,\n  \"displayName\": \"Sergii Kabashniuk\",\n  \"active\": true,\n  \"slug\": \"ksmster\",\n  \"type\": \"NORMAL\",\n  \"links\": {\n    \"self\": [\n      {\n        \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/ksmster\"\n      }\n    ]\n  }\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/resources/__files/bitbucket/rest/api/1.0/users/response.json",
    "content": "{\n  \"size\": 3,\n  \"limit\": 25,\n  \"isLastPage\": true,\n  \"values\": [\n    {\n      \"name\": \"admin\",\n      \"emailAddress\": \"admin@ksmster.com\",\n      \"id\": 1,\n      \"displayName\": \"Admin\",\n      \"active\": true,\n      \"slug\": \"admin\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/admin\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"ksmster\",\n      \"emailAddress\": \"ksmster@gmail.com\",\n      \"id\": 2,\n      \"displayName\": \"Sergii Kabashniuk\",\n      \"active\": true,\n      \"slug\": \"ksmster\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/ksmster\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"skabashn\",\n      \"emailAddress\": \"skabashniuk@redhat.com\",\n      \"id\": 3,\n      \"displayName\": \"Kabashn\",\n      \"active\": true,\n      \"slug\": \"skabashn\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/skabashn\"\n          }\n        ]\n      }\n    }\n  ],\n  \"start\": 0\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/resources/__files/bitbucket/rest/api/1.0/users/response_s0_l25.json",
    "content": "{\n  \"size\": 3,\n  \"limit\": 3,\n  \"isLastPage\": false,\n  \"values\": [\n    {\n      \"name\": \"admin\",\n      \"emailAddress\": \"admin@ksmster.com\",\n      \"id\": 1,\n      \"displayName\": \"Admin\",\n      \"active\": true,\n      \"slug\": \"admin\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/admin\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"ksmster\",\n      \"emailAddress\": \"ksmster@gmail.com\",\n      \"id\": 2,\n      \"displayName\": \"Sergii Kabashniuk\",\n      \"active\": true,\n      \"slug\": \"ksmster\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/ksmster\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"skabashn\",\n      \"emailAddress\": \"skabashniuk@redhat.com\",\n      \"id\": 3,\n      \"displayName\": \"Kabashn\",\n      \"active\": true,\n      \"slug\": \"skabashn\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/skabashn\"\n          }\n        ]\n      }\n    }\n  ],\n  \"start\": 0,\n  \"nextPageStart\": 3\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/resources/__files/bitbucket/rest/api/1.0/users/response_s3_l25.json",
    "content": "{\n  \"size\": 3,\n  \"limit\": 3,\n  \"isLastPage\": false,\n  \"values\": [\n    {\n      \"name\": \"user1\",\n      \"emailAddress\": \"user1@gmail.com\",\n      \"id\": 52,\n      \"displayName\": \"User1\",\n      \"active\": true,\n      \"slug\": \"user1\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/user1\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"user2\",\n      \"emailAddress\": \"user2@gmail.com\",\n      \"id\": 53,\n      \"displayName\": \"user2\",\n      \"active\": true,\n      \"slug\": \"user2\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/user2\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"user3@gmail.com\",\n      \"emailAddress\": \"user3@gmail.com\",\n      \"id\": 54,\n      \"displayName\": \"user3\",\n      \"active\": true,\n      \"slug\": \"user3\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/user3_gmail.com\"\n          }\n        ]\n      }\n    }\n  ],\n  \"start\": 3,\n  \"nextPageStart\": 6\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/resources/__files/bitbucket/rest/api/1.0/users/response_s6_l25.json",
    "content": "{\n  \"size\": 3,\n  \"limit\": 3,\n  \"isLastPage\": false,\n  \"values\": [\n    {\n      \"name\": \"user4\",\n      \"emailAddress\": \"user4@gmail.com\",\n      \"id\": 55,\n      \"displayName\": \"user4\",\n      \"active\": true,\n      \"slug\": \"user4\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/user4\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"user5\",\n      \"emailAddress\": \"user5@gmail.com\",\n      \"id\": 56,\n      \"displayName\": \"user5\",\n      \"active\": true,\n      \"slug\": \"user5\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/user5\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"user6\",\n      \"emailAddress\": \"user6@gmail.com\",\n      \"id\": 57,\n      \"displayName\": \"user6\",\n      \"active\": true,\n      \"slug\": \"user6\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/user6\"\n          }\n        ]\n      }\n    }\n  ],\n  \"start\": 6,\n  \"nextPageStart\": 9\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/resources/__files/bitbucket/rest/api/1.0/users/response_s9_l25.json",
    "content": "{\n  \"size\": 1,\n  \"limit\": 3,\n  \"isLastPage\": true,\n  \"values\": [\n    {\n      \"name\": \"user7\",\n      \"emailAddress\": \"user7@gmail.com\",\n      \"id\": 58,\n      \"displayName\": \"user7\",\n      \"active\": true,\n      \"slug\": \"user7\",\n      \"type\": \"NORMAL\",\n      \"links\": {\n        \"self\": [\n          {\n            \"href\": \"https://bitbucket-bitbucket.apps.cluster-devtools-c9ac.devtools-c9ac.example.opentlc.com/users/user7\"\n          }\n        ]\n      }\n    }\n  ],\n  \"start\": 9\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/resources/__files/bitbucket/rest/api.1.0.application-properties/response.json",
    "content": "{\n  \"version\": \"8.7.0\",\n  \"buildNumber\": 8007000,\n  \"buildDate\": 1672975062662,\n  \"displayName\": \"Bitbucket\"\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-bitbucket-server/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n%nopex</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-git-ssh/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-factory-git-ssh</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Factory Resolver Git Ssh</name>\n    <properties>\n        <findbugs.failonerror>true</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.validation</groupId>\n            <artifactId>jakarta.validation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.github.tomakehurst</groupId>\n            <artifactId>wiremock-jre8-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>jcl-over-slf4j</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-git-ssh/src/main/java/org/eclipse/che/api/factory/server/git/ssh/GitSshAuthorizingFileContentProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.git.ssh;\n\nimport org.eclipse.che.api.factory.server.scm.AuthorizingFileContentProvider;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/**\n * Git Ssh specific authorizing file content provider.\n *\n * @author Anatolii Bazko\n */\nclass GitSshAuthorizingFileContentProvider extends AuthorizingFileContentProvider<GitSshUrl> {\n\n  GitSshAuthorizingFileContentProvider(\n      GitSshUrl gitSshUrl,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(gitSshUrl, urlFetcher, personalAccessTokenManager);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-git-ssh/src/main/java/org/eclipse/che/api/factory/server/git/ssh/GitSshFactoryParametersResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.git.ssh;\n\nimport static org.eclipse.che.api.factory.server.FactoryResolverPriority.LOWEST;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.factory.server.BaseFactoryParameterResolver;\nimport org.eclipse.che.api.factory.server.FactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.FactoryResolverPriority;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryVisitor;\nimport org.eclipse.che.api.factory.shared.dto.ScmInfoDto;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/**\n * Provides Factory Parameters resolver for SSH urls of unsupported Git providers.\n *\n * @author Anatolii Bazko\n */\n@Singleton\npublic class GitSshFactoryParametersResolver extends BaseFactoryParameterResolver\n    implements FactoryParametersResolver {\n\n  private static final String PROVIDER_NAME = \"git-ssh\";\n\n  private final GitSshURLParser gitSshURLParser;\n\n  private final URLFetcher urlFetcher;\n  private final URLFactoryBuilder urlFactoryBuilder;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n\n  @Inject\n  public GitSshFactoryParametersResolver(\n      GitSshURLParser gitSshURLParser,\n      URLFetcher urlFetcher,\n      URLFactoryBuilder urlFactoryBuilder,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      AuthorisationRequestManager authorisationRequestManager) {\n    super(authorisationRequestManager, urlFactoryBuilder, PROVIDER_NAME);\n    this.gitSshURLParser = gitSshURLParser;\n    this.urlFetcher = urlFetcher;\n    this.urlFactoryBuilder = urlFactoryBuilder;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n  }\n\n  @Override\n  public boolean accept(@NotNull final Map<String, String> factoryParameters) {\n    return factoryParameters.containsKey(URL_PARAMETER_NAME)\n        && gitSshURLParser.isValid(factoryParameters.get(URL_PARAMETER_NAME));\n  }\n\n  @Override\n  public String getProviderName() {\n    return PROVIDER_NAME;\n  }\n\n  @Override\n  public FactoryMetaDto createFactory(@NotNull final Map<String, String> factoryParameters)\n      throws ApiException {\n    // no need to check null value of url parameter as accept() method has performed the check\n    final GitSshUrl gitSshUrl = gitSshURLParser.parse(factoryParameters.get(URL_PARAMETER_NAME));\n\n    // create factory from the following location if location exists, else create default factory\n    return urlFactoryBuilder\n        .createFactoryFromDevfile(\n            gitSshUrl,\n            new GitSshAuthorizingFileContentProvider(\n                gitSshUrl, urlFetcher, personalAccessTokenManager),\n            extractOverrideParams(factoryParameters),\n            true)\n        .orElseThrow(() -> new ApiException(\"Failed to fetch devfile\"))\n        .acceptVisitor(new GitSshFactoryVisitor(gitSshUrl));\n  }\n\n  /** Visitor that updates factory dto with git ssh information. */\n  private class GitSshFactoryVisitor implements FactoryVisitor {\n\n    private final GitSshUrl gitSshUrl;\n\n    private GitSshFactoryVisitor(GitSshUrl gitSshUrl) {\n      this.gitSshUrl = gitSshUrl;\n    }\n\n    @Override\n    public FactoryDevfileV2Dto visit(FactoryDevfileV2Dto factoryDto) {\n      ScmInfoDto scmInfo =\n          newDto(ScmInfoDto.class)\n              .withScmProviderName(gitSshUrl.getProviderName())\n              .withRepositoryUrl(gitSshUrl.getRepositoryLocation());\n      return factoryDto.withScmInfo(scmInfo);\n    }\n  }\n\n  @Override\n  public RemoteFactoryUrl parseFactoryUrl(String factoryUrl) {\n    return gitSshURLParser.parse(factoryUrl);\n  }\n\n  @Override\n  public FactoryResolverPriority priority() {\n    return LOWEST;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-git-ssh/src/main/java/org/eclipse/che/api/factory/server/git/ssh/GitSshScmFileResolver.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.git.ssh;\n\nimport jakarta.validation.constraints.NotNull;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.factory.server.ScmFileResolver;\n\n/**\n * Git Ssh specific SCM file resolver.\n *\n * @author Anatolii Bazko\n */\npublic class GitSshScmFileResolver implements ScmFileResolver {\n\n  private final GitSshURLParser gitSshURLParser;\n\n  @Inject\n  public GitSshScmFileResolver(GitSshURLParser gitSshURLParser) {\n    this.gitSshURLParser = gitSshURLParser;\n  }\n\n  @Override\n  public boolean accept(@NotNull String repository) {\n    return gitSshURLParser.isValid(repository);\n  }\n\n  /**\n   * There is no way to get a file content from a git repository via ssh protocol. So this method\n   * always returns an empty string. It allows to start a workspace from an empty devfile.\n   */\n  @Override\n  public String fileContent(@NotNull String repository, @NotNull String filePath) {\n    return \"\";\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-git-ssh/src/main/java/org/eclipse/che/api/factory/server/git/ssh/GitSshURLParser.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.git.ssh;\n\nimport static java.lang.String.format;\nimport static java.util.regex.Pattern.compile;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\n\n/**\n * Parser of String Git Ssh URLs and provide {@link GitSshUrl} objects.\n *\n * @author Anatolii Bazko\n */\n@Singleton\npublic class GitSshURLParser {\n\n  private final Pattern gitSshPattern;\n\n  private final DevfileFilenamesProvider devfileFilenamesProvider;\n\n  @Inject\n  public GitSshURLParser(DevfileFilenamesProvider devfileFilenamesProvider) {\n    this.devfileFilenamesProvider = devfileFilenamesProvider;\n    this.gitSshPattern = compile(\"^git@(?<hostName>[^:]++):(.*)/(?<repoName>[^/]++)$\");\n  }\n\n  public boolean isValid(@NotNull String url) {\n    return gitSshPattern.matcher(url).matches();\n  }\n\n  public GitSshUrl parse(String url) {\n    Matcher matcher = gitSshPattern.matcher(url);\n    if (!matcher.matches()) {\n      throw new IllegalArgumentException(\n          format(\"The given url %s is not a valid. It should start with git@<hostName>\", url));\n    }\n\n    String hostName = matcher.group(\"hostName\");\n    String repoName = matcher.group(\"repoName\");\n    if (repoName.endsWith(\".git\")) {\n      repoName = repoName.substring(0, repoName.length() - 4);\n    }\n\n    return new GitSshUrl()\n        .withDevfileFilenames(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .withHostName(hostName)\n        .withRepository(repoName)\n        .withRepositoryLocation(url)\n        .withUrl(url);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-git-ssh/src/main/java/org/eclipse/che/api/factory/server/git/ssh/GitSshUrl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.git.ssh;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.factory.server.urlfactory.DefaultFactoryUrl;\n\n/**\n * Representation of Git Ssh URL, allowing to get details from it.\n *\n * @author Anatolii Bazko\n */\npublic class GitSshUrl extends DefaultFactoryUrl {\n\n  private String repository;\n  private String hostName;\n\n  private String repositoryLocation;\n\n  private final List<String> devfileFilenames = new ArrayList<>();\n\n  protected GitSshUrl() {}\n\n  @Override\n  public String getProviderName() {\n    return \"git-ssh\";\n  }\n\n  @Override\n  public String getBranch() {\n    return null;\n  }\n\n  public GitSshUrl withDevfileFilenames(List<String> devfileFilenames) {\n    this.devfileFilenames.addAll(devfileFilenames);\n    return this;\n  }\n\n  @Override\n  public void setDevfileFilename(String devfileName) {\n    this.devfileFilenames.clear();\n    this.devfileFilenames.add(devfileName);\n  }\n\n  @Override\n  public List<DevfileLocation> devfileFileLocations() {\n    return devfileFilenames.stream().map(this::createDevfileLocation).collect(Collectors.toList());\n  }\n\n  @Override\n  public String rawFileLocation(String filename) {\n    return filename;\n  }\n\n  private DevfileLocation createDevfileLocation(String devfileFilename) {\n    return new DevfileLocation() {\n      @Override\n      public Optional<String> filename() {\n        return Optional.of(devfileFilename);\n      }\n\n      @Override\n      public String location() {\n        // Since we do not know the location from an SSH URL, we return the filename instead. The\n        // devfile content fetcher will always fail to fetch the devfile in this case.\n        // TODO: throw an error in order to avoid http request to fetch the devfile content.\n        return devfileFilename;\n      }\n    };\n  }\n\n  @Override\n  public String getHostName() {\n    return hostName;\n  }\n\n  public GitSshUrl withHostName(String hostName) {\n    this.hostName = hostName;\n    return this;\n  }\n\n  public String getRepositoryLocation() {\n    return repositoryLocation;\n  }\n\n  public GitSshUrl withRepositoryLocation(String repositoryLocation) {\n    this.repositoryLocation = repositoryLocation;\n    return this;\n  }\n\n  public String getRepository() {\n    return repository;\n  }\n\n  public GitSshUrl withRepository(String repository) {\n    this.repository = repository;\n    return this;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-git-ssh/src/test/java/org/eclipse/che/api/factory/server/git/ssh/GitSshFactoryParametersResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.git.ssh;\n\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.factory.shared.Constants.CURRENT_VERSION;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.Collections;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.ScmInfoDto;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GitSshFactoryParametersResolverTest {\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n  @Mock private URLFetcher urlFetcher;\n  @Mock private URLFactoryBuilder urlFactoryBuilder;\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n  @Mock private AuthorisationRequestManager authorisationRequestManager;\n  @Mock private GitSshURLParser gitSshURLParser;\n  @Mock private GitSshUrl gitSshUrl;\n  private GitSshFactoryParametersResolver gitSshFactoryParametersResolver;\n\n  @BeforeMethod\n  protected void init() {\n    gitSshFactoryParametersResolver =\n        new GitSshFactoryParametersResolver(\n            gitSshURLParser,\n            urlFetcher,\n            urlFactoryBuilder,\n            personalAccessTokenManager,\n            authorisationRequestManager);\n  }\n\n  @Test\n  public void ShouldNotAcceptMissingParameter() {\n    // given\n    Map<String, String> parameters = singletonMap(\"foo\", \"this is a foo bar\");\n    // when\n    boolean accept = gitSshFactoryParametersResolver.accept(parameters);\n    // then\n    assertFalse(accept);\n  }\n\n  @Test\n  public void ShouldNotAcceptInvalidUrl() {\n    // given\n    String url = \"https://provider.com/user/repo.git\";\n    when(gitSshURLParser.isValid(eq(url))).thenReturn(false);\n    Map<String, String> parameters = singletonMap(URL_PARAMETER_NAME, url);\n    // when\n    boolean accept = gitSshFactoryParametersResolver.accept(parameters);\n    // then\n    assertFalse(accept);\n  }\n\n  @Test\n  public void shouldAcceptValidUrl() {\n    // given\n    String url = \"git@provider.com:user/repo.git\";\n    when(gitSshURLParser.isValid(eq(url))).thenReturn(true);\n    Map<String, String> parameters = singletonMap(URL_PARAMETER_NAME, url);\n    // when\n    boolean accept = gitSshFactoryParametersResolver.accept(parameters);\n    // then\n    assertTrue(accept);\n  }\n\n  @Test\n  public void shouldCreateFactoryWithDevfile() throws Exception {\n    // given\n    String url = \"git@provider.com:user/repo.git\";\n    when(gitSshUrl.getProviderName()).thenReturn(\"git-ssh\");\n    when(gitSshUrl.getRepositoryLocation()).thenReturn(\"repository-location\");\n    ImmutableMap<String, String> params = ImmutableMap.of(URL_PARAMETER_NAME, url);\n    when(gitSshURLParser.parse(eq(url))).thenReturn(gitSshUrl);\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            eq(gitSshUrl), any(FileContentProvider.class), eq(Collections.emptyMap()), eq(true)))\n        .thenReturn(Optional.of(generateDevfileV2Factory()));\n    // when\n    FactoryDevfileV2Dto factory =\n        (FactoryDevfileV2Dto) gitSshFactoryParametersResolver.createFactory(params);\n    // then\n    ScmInfoDto scmInfo = factory.getScmInfo();\n    assertEquals(scmInfo.getScmProviderName(), \"git-ssh\");\n    assertEquals(scmInfo.getRepositoryUrl(), \"repository-location\");\n  }\n\n  @Test(\n      expectedExceptions = ApiException.class,\n      expectedExceptionsMessageRegExp = \"Failed to fetch devfile\")\n  public void shouldThrowException() throws Exception {\n    // given\n    String url = \"git@provider.com:user/repo.git\";\n    ImmutableMap<String, String> params = ImmutableMap.of(URL_PARAMETER_NAME, url);\n    when(gitSshURLParser.parse(eq(url))).thenReturn(gitSshUrl);\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            eq(gitSshUrl), any(FileContentProvider.class), eq(Collections.emptyMap()), eq(true)))\n        .thenReturn(Optional.empty());\n    // when\n    FactoryDevfileV2Dto factory =\n        (FactoryDevfileV2Dto) gitSshFactoryParametersResolver.createFactory(params);\n  }\n\n  private FactoryDevfileV2Dto generateDevfileV2Factory() {\n    return newDto(FactoryDevfileV2Dto.class)\n        .withV(CURRENT_VERSION)\n        .withSource(\"repo\")\n        .withDevfile(Map.of(\"schemaVersion\", \"2.0.0\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-git-ssh/src/test/java/org/eclipse/che/api/factory/server/git/ssh/GitSshURLParserTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.git.ssh;\n\nimport static org.mockito.Mockito.mock;\nimport static org.testng.Assert.assertEquals;\n\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Anatalii Bazko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class GitSshURLParserTest {\n\n  private GitSshURLParser gitSshURLParser;\n\n  @BeforeMethod\n  protected void start() {\n    gitSshURLParser = new GitSshURLParser(mock(DevfileFilenamesProvider.class));\n  }\n\n  @Test(dataProvider = \"parsing\")\n  public void testParse(String url, String hostName, String repository) {\n    GitSshUrl gitSshUrl = gitSshURLParser.parse(url);\n\n    assertEquals(gitSshUrl.getHostName(), hostName);\n    assertEquals(gitSshUrl.getRepository(), repository);\n  }\n\n  @DataProvider(name = \"parsing\")\n  public Object[][] expectedParsing() {\n    return new Object[][] {\n      {\"git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepo\", \"ssh.dev.azure.com\", \"MyRepo\"},\n      {\"git@github.com:MyOrg/MyRepo.git\", \"github.com\", \"MyRepo\"},\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-git-ssh/src/test/java/org/eclipse/che/api/factory/server/git/ssh/GitSshUrlTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.git.ssh;\n\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl.DevfileLocation;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GitSshUrlTest {\n\n  @Test\n  public void shouldReturnDevfileLocations() throws Exception {\n    String[] devfileNames = {\"devfile.yaml\", \".devfile.yaml\"};\n    GitSshUrl sshUrl =\n        new GitSshUrl()\n            .withRepository(\"repository\")\n            .withHostName(\"hostname\")\n            .withDevfileFilenames(Arrays.asList(devfileNames));\n    List<DevfileLocation> devfileLocations = sshUrl.devfileFileLocations();\n    assertEquals(devfileLocations.size(), 2);\n    assertEquals(devfileLocations.get(0).location(), \"devfile.yaml\");\n    assertEquals(devfileLocations.get(1).location(), \".devfile.yaml\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-git-ssh/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2023 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n%nopex</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-factory-github</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Factory Resolver Github</name>\n    <properties>\n        <findbugs.failonerror>true</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-github-common</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.github.tomakehurst</groupId>\n            <artifactId>wiremock-jre8-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-shared</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>jcl-over-slf4j</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.wiremock</groupId>\n            <artifactId>wiremock-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubFactoryParametersResolver.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/**\n * Provides Factory Parameters resolver for github repositories.\n *\n * @author Florent Benoit\n */\n@Singleton\npublic class GithubFactoryParametersResolver extends AbstractGithubFactoryParametersResolver {\n\n  private static final String PROVIDER_NAME = \"github\";\n\n  @Inject\n  public GithubFactoryParametersResolver(\n      GithubURLParser githubUrlParser,\n      URLFetcher urlFetcher,\n      GithubSourceStorageBuilder githubSourceStorageBuilder,\n      AuthorisationRequestManager authorisationRequestManager,\n      URLFactoryBuilder urlFactoryBuilder,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(\n        githubUrlParser,\n        urlFetcher,\n        githubSourceStorageBuilder,\n        authorisationRequestManager,\n        urlFactoryBuilder,\n        personalAccessTokenManager,\n        PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubFactoryParametersResolverSecond.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/**\n * Provides Factory Parameters resolver for github repositories.\n *\n * @author Florent Benoit\n */\n@Singleton\npublic class GithubFactoryParametersResolverSecond extends AbstractGithubFactoryParametersResolver {\n\n  private static final String PROVIDER_NAME = \"github_2\";\n\n  @Inject\n  public GithubFactoryParametersResolverSecond(\n      GithubURLParserSecond githubUrlParser,\n      URLFetcher urlFetcher,\n      GithubSourceStorageBuilder githubSourceStorageBuilder,\n      AuthorisationRequestManager authorisationRequestManager,\n      URLFactoryBuilder urlFactoryBuilder,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(\n        githubUrlParser,\n        urlFetcher,\n        githubSourceStorageBuilder,\n        authorisationRequestManager,\n        urlFactoryBuilder,\n        personalAccessTokenManager,\n        PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubModule.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\nimport org.eclipse.che.api.factory.server.scm.GitUserDataFetcher;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher;\n\npublic class GithubModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    Multibinder<PersonalAccessTokenFetcher> tokenFetcherMultibinder =\n        Multibinder.newSetBinder(binder(), PersonalAccessTokenFetcher.class);\n    tokenFetcherMultibinder.addBinding().to(GithubPersonalAccessTokenFetcher.class);\n    tokenFetcherMultibinder.addBinding().to(GithubPersonalAccessTokenFetcherSecond.class);\n\n    Multibinder<GitUserDataFetcher> gitUserDataMultibinder =\n        Multibinder.newSetBinder(binder(), GitUserDataFetcher.class);\n    gitUserDataMultibinder.addBinding().to(GithubUserDataFetcher.class);\n    gitUserDataMultibinder.addBinding().to(GithubUserDataFetcherSecond.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubPersonalAccessTokenFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.security.oauth.OAuthAPI;\n\n/** GitHub OAuth token retriever. */\npublic class GithubPersonalAccessTokenFetcher extends AbstractGithubPersonalAccessTokenFetcher {\n\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  private static final String OAUTH_PROVIDER_NAME = \"github\";\n\n  @Inject\n  public GithubPersonalAccessTokenFetcher(\n      @Named(\"che.api\") String apiEndpoint,\n      @Nullable @Named(\"che.integration.github.oauth_endpoint\") String oauthEndpoint,\n      OAuthAPI oAuthAPI) {\n    super(apiEndpoint, oAuthAPI, new GithubApiClient(oauthEndpoint), OAUTH_PROVIDER_NAME);\n  }\n\n  GithubPersonalAccessTokenFetcher(\n      @Named(\"che.api\") String apiEndpoint, OAuthAPI oAuthAPI, GithubApiClient githubApiClient) {\n    super(apiEndpoint, oAuthAPI, githubApiClient, OAUTH_PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubPersonalAccessTokenFetcherSecond.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.security.oauth.OAuthAPI;\n\n/** GitHub OAuth token retriever. */\npublic class GithubPersonalAccessTokenFetcherSecond\n    extends AbstractGithubPersonalAccessTokenFetcher {\n\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  private static final String OAUTH_PROVIDER_NAME = \"github_2\";\n\n  @Inject\n  public GithubPersonalAccessTokenFetcherSecond(\n      @Named(\"che.api\") String apiEndpoint,\n      @Nullable @Named(\"che.integration.github.oauth_endpoint_2\") String oauthEndpoint,\n      OAuthAPI oAuthAPI) {\n    super(apiEndpoint, oAuthAPI, new GithubApiClient(oauthEndpoint), OAUTH_PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubScmFileResolver.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/** Github specific SCM file resolver. */\npublic class GithubScmFileResolver extends AbstractGithubScmFileResolver {\n\n  @Inject\n  public GithubScmFileResolver(\n      GithubURLParser githubUrlParser,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(githubUrlParser, urlFetcher, personalAccessTokenManager);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubScmFileResolverSecond.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/** Github specific SCM file resolver. */\npublic class GithubScmFileResolverSecond extends AbstractGithubScmFileResolver {\n\n  @Inject\n  public GithubScmFileResolverSecond(\n      GithubURLParserSecond githubUrlParser,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(githubUrlParser, urlFetcher, personalAccessTokenManager);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubURLParser.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Parser of String Github URLs and provide {@link GithubUrl} objects.\n *\n * @author Florent Benoit\n */\n@Singleton\npublic class GithubURLParser extends AbstractGithubURLParser {\n\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  private static final String OAUTH_PROVIDER_NAME = \"github\";\n\n  @Inject\n  public GithubURLParser(\n      PersonalAccessTokenManager tokenManager,\n      DevfileFilenamesProvider devfileFilenamesProvider,\n      @Nullable @Named(\"che.integration.github.oauth_endpoint\") String oauthEndpoint,\n      @Named(\"che.integration.github.disable_subdomain_isolation\")\n          boolean disableSubdomainIsolation) {\n    super(\n        tokenManager,\n        devfileFilenamesProvider,\n        new GithubApiClient(oauthEndpoint),\n        oauthEndpoint,\n        disableSubdomainIsolation,\n        OAUTH_PROVIDER_NAME);\n  }\n\n  GithubURLParser(\n      PersonalAccessTokenManager tokenManager,\n      DevfileFilenamesProvider devfileFilenamesProvider,\n      GithubApiClient githubApiClient,\n      String oauthEndpoint,\n      boolean disableSubdomainIsolation) {\n    super(\n        tokenManager,\n        devfileFilenamesProvider,\n        githubApiClient,\n        oauthEndpoint,\n        disableSubdomainIsolation,\n        OAUTH_PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubURLParserSecond.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Parser of String Github URLs and provide {@link GithubUrl} objects.\n *\n * @author Florent Benoit\n */\n@Singleton\npublic class GithubURLParserSecond extends AbstractGithubURLParser {\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  private static final String OAUTH_PROVIDER_NAME = \"github_2\";\n\n  @Inject\n  public GithubURLParserSecond(\n      PersonalAccessTokenManager tokenManager,\n      DevfileFilenamesProvider devfileFilenamesProvider,\n      @Nullable @Named(\"che.integration.github.oauth_endpoint_2\") String oauthEndpoint,\n      @Named(\"che.integration.github.disable_subdomain_isolation_2\")\n          boolean disableSubdomainIsolation) {\n    super(\n        tokenManager,\n        devfileFilenamesProvider,\n        new GithubApiClient(oauthEndpoint),\n        oauthEndpoint,\n        disableSubdomainIsolation,\n        OAUTH_PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubUserDataFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/** GitHub user data retriever. */\npublic class GithubUserDataFetcher extends AbstractGithubUserDataFetcher {\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  private static final String OAUTH_PROVIDER_NAME = \"github\";\n\n  @Inject\n  public GithubUserDataFetcher(\n      @Named(\"che.api\") String apiEndpoint,\n      @Nullable @Named(\"che.integration.github.oauth_endpoint\") String oauthEndpoint,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(\n        apiEndpoint,\n        personalAccessTokenManager,\n        new GithubApiClient(oauthEndpoint),\n        OAUTH_PROVIDER_NAME);\n  }\n\n  GithubUserDataFetcher(\n      String apiEndpoint,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      GithubApiClient githubApiClient) {\n    super(apiEndpoint, personalAccessTokenManager, githubApiClient, OAUTH_PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubUserDataFetcherSecond.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/** GitHub user data retriever. */\npublic class GithubUserDataFetcherSecond extends AbstractGithubUserDataFetcher {\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  private static final String OAUTH_PROVIDER_NAME = \"github_2\";\n\n  @Inject\n  public GithubUserDataFetcherSecond(\n      @Named(\"che.api\") String apiEndpoint,\n      @Nullable @Named(\"che.integration.github.oauth_endpoint_2\") String oauthEndpoint,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(\n        apiEndpoint,\n        personalAccessTokenManager,\n        new GithubApiClient(oauthEndpoint),\n        OAUTH_PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubApiClientTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.equalTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static java.net.HttpURLConnection.HTTP_BAD_GATEWAY;\nimport static java.net.HttpURLConnection.HTTP_BAD_REQUEST;\nimport static java.net.HttpURLConnection.HTTP_NOT_FOUND;\nimport static java.net.HttpURLConnection.HTTP_NO_CONTENT;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertEqualsNoOrder;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.common.net.HttpHeaders;\nimport java.lang.reflect.Field;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpResponse;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GithubApiClientTest {\n\n  private GithubApiClient client;\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  @BeforeMethod\n  void start() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    wireMock = new WireMock(\"localhost\", wireMockServer.port());\n    client = new GithubApiClient(wireMockServer.url(\"/\"));\n  }\n\n  @AfterMethod\n  void stop() {\n    wireMockServer.stop();\n  }\n\n  @Test\n  public void shouldUseDefaultApiUrl() throws Exception {\n    // given\n    client = new GithubApiClient(\"https://github.com\");\n    Field serverUrl = client.getClass().getDeclaredField(\"apiServerUrl\");\n    serverUrl.setAccessible(true);\n    // then\n    assertEquals(serverUrl.get(client).toString(), \"https://api.github.com/\");\n  }\n\n  @Test\n  public void shouldUseDefaultApiUrlWithNull() throws Exception {\n    // given\n    client = new GithubApiClient(null);\n    Field serverUrl = client.getClass().getDeclaredField(\"apiServerUrl\");\n    serverUrl.setAccessible(true);\n    // then\n    assertEquals(serverUrl.get(client).toString(), \"https://api.github.com/\");\n  }\n\n  @Test\n  public void shouldUseDefaultApiUrlWithEmpty() throws Exception {\n    // given\n    client = new GithubApiClient(\"\");\n    Field serverUrl = client.getClass().getDeclaredField(\"apiServerUrl\");\n    serverUrl.setAccessible(true);\n    // then\n    assertEquals(serverUrl.get(client).toString(), \"https://api.github.com/\");\n  }\n\n  @Test(expectedExceptions = ScmCommunicationException.class)\n  public void shouldThrowExceptionOnUserParseError() throws Exception {\n    // given\n    stubFor(get(urlEqualTo(\"/api/v3/user\")).willReturn(aResponse().withBody(\"invalid value\")));\n    // when\n    client.getUser(\"token\");\n  }\n\n  @Test\n  public void testGetUser() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token token1\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"github/rest/user/response.json\")));\n\n    GithubUser user = client.getUser(\"token1\");\n    assertNotNull(user, \"GitHub API should have returned a non-null user object\");\n    assertEquals(user.getId(), 123456789, \"GitHub user id was not parsed properly by client\");\n    assertEquals(\n        user.getLogin(), \"github-user\", \"GitHub user login was not parsed properly by client\");\n    assertEquals(\n        user.getEmail(),\n        \"github-user@acme.com\",\n        \"GitHub user email was not parsed properly by client\");\n    assertEquals(\n        user.getName(), \"Github User\", \"GitHub user name was not parsed properly by client\");\n  }\n\n  @Test\n  public void testGetPullRequest() throws Exception {\n    // given\n    stubFor(\n        get(urlEqualTo(\"/api/v3/repos/user/repo/pulls/id\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token token1\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"github/rest/pullRequest/response.json\")));\n\n    // when\n    GithubPullRequest pullRequest = client.getPullRequest(\"id\", \"user\", \"repo\", \"token1\");\n    // then\n    assertNotNull(pullRequest);\n    assertNotNull(pullRequest.getHead());\n    assertEquals(pullRequest.getState(), \"open\");\n  }\n\n  @Test(expectedExceptions = ScmCommunicationException.class)\n  public void shouldThrowExceptionOnPullRequestParseError() throws Exception {\n    // given\n    stubFor(\n        get(urlEqualTo(\"/api/v3/repos/user/repo/pulls/id\"))\n            .willReturn(aResponse().withBody(\"invalid value\")));\n    // when\n    client.getPullRequest(\"id\", \"user\", \"repo\", \"token1\");\n  }\n\n  @Test\n  public void testGetTokenScopes() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token token1\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(GithubApiClient.GITHUB_OAUTH_SCOPES_HEADER, \"repo, user:email\")\n                    .withBodyFile(\"github/rest/user/response.json\")));\n\n    Pair<String, String[]> pair = client.getTokenScopes(\"token1\");\n    String[] scopes = pair.second;\n    String[] expectedScopes = {\"repo\", \"user:email\"};\n    assertNotNull(scopes, \"GitHub API should have returned a non-null scope array\");\n    assertEqualsNoOrder(\n        scopes, expectedScopes, \"Returned scope array does not match expected values\");\n    assertEquals(pair.first, \"github-user\");\n  }\n\n  @Test\n  public void testGetTokenScopesWithNoScopeHeader() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token token1\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"github/rest/user/response.json\")));\n\n    String[] scopes = client.getTokenScopes(\"token1\").second;\n    assertNotNull(scopes, \"GitHub API should have returned a non-null scope array\");\n    assertEquals(\n        scopes.length,\n        0,\n        \"A response with no \"\n            + GithubApiClient.GITHUB_OAUTH_SCOPES_HEADER\n            + \" header should return an empty array\");\n  }\n\n  @Test\n  public void testGetTokenScopesWithNoScope() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token token1\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(GithubApiClient.GITHUB_OAUTH_SCOPES_HEADER, \"\")\n                    .withBodyFile(\"github/rest/user/response.json\")));\n\n    String[] scopes = client.getTokenScopes(\"token1\").second;\n    assertNotNull(scopes, \"GitHub API should have returned a non-null scope array\");\n    assertEquals(\n        scopes.length,\n        0,\n        \"A response with empty \"\n            + GithubApiClient.GITHUB_OAUTH_SCOPES_HEADER\n            + \" header should return an empty array\");\n  }\n\n  @Test\n  public void shouldReturnFalseOnConnectedToOtherHost() {\n    assertFalse(client.isConnected(\"https://other.com\"));\n  }\n\n  @Test\n  public void shouldReturnTrueWhenConnectedToGithub() {\n    assertTrue(client.isConnected(wireMockServer.url(\"/\")));\n  }\n\n  @Test()\n  public void shouldReturnNull() throws Exception {\n    // given\n    stubFor(get(urlEqualTo(\"/api/v3/user\")).willReturn(aResponse().withStatus(HTTP_NO_CONTENT)));\n    // when\n    GithubUser user = client.getUser(\"token\");\n    // then\n    assertNull(user);\n  }\n\n  @Test(\n      expectedExceptions = ScmBadRequestException.class,\n      expectedExceptionsMessageRegExp = \"bad request\")\n  public void shouldThrowExceptionOnBadRequestError() throws Exception {\n    // given\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .willReturn(aResponse().withStatus(HTTP_BAD_REQUEST).withBody(\"bad request\")));\n    // when\n    client.getUser(\"token\");\n  }\n\n  @Test(\n      expectedExceptions = ScmItemNotFoundException.class,\n      expectedExceptionsMessageRegExp = \"item not found\")\n  public void shouldThrowExceptionOnNotFoundError() throws Exception {\n    // given\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .willReturn(aResponse().withStatus(HTTP_NOT_FOUND).withBody(\"item not found\")));\n    // when\n    client.getUser(\"token\");\n  }\n\n  @Test(\n      expectedExceptions = ScmBadRequestException.class,\n      expectedExceptionsMessageRegExp = \"Unrecognised error\")\n  public void shouldThrowExceptionWithUnrecognisedErrorIfResponseBodyIsNull() throws Exception {\n    // given\n    HttpClient httpClient = Mockito.mock(HttpClient.class);\n    HttpResponse response = Mockito.mock(HttpResponse.class);\n    Field declaredField = GithubApiClient.class.getDeclaredField(\"httpClient\");\n    declaredField.setAccessible(true);\n    declaredField.set(client, httpClient);\n    when(httpClient.send(any(), any())).thenReturn(response);\n    when(response.body()).thenReturn(null);\n    when(response.statusCode()).thenReturn(HTTP_BAD_REQUEST);\n\n    // when\n    client.getUser(\"token\");\n  }\n\n  @Test(\n      expectedExceptions = ScmCommunicationException.class,\n      expectedExceptionsMessageRegExp = \"Unexpected status code 502 item not found\")\n  public void shouldThrowExceptionOnOtherError() throws Exception {\n    // given\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .willReturn(aResponse().withStatus(HTTP_BAD_GATEWAY).withBody(\"item not found\")));\n    // when\n    client.getUser(\"token\");\n  }\n\n  @Test\n  public void testGetLatestCommit() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/api/v3/repos/eclipse-che/che-server/commits?sha=HEAD&page=1&per_page=1\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token token1\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBody(\"[{\\\"sha\\\": \\\"test_sha\\\", \\\"url\\\": \\\"http://commit.url\\\" }]\")));\n\n    GithubCommit commit = client.getLatestCommit(\"eclipse-che\", \"che-server\", \"HEAD\", \"token1\");\n\n    assertNotNull(commit, \"GitHub API should return the latest commit\");\n    assertEquals(commit.getSha(), \"test_sha\");\n    assertEquals(commit.getUrl(), \"http://commit.url\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubAuthorizingFileContentProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static org.mockito.ArgumentMatchers.*;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GithubAuthorizingFileContentProviderTest {\n\n  private PersonalAccessTokenManager personalAccessTokenManager;\n\n  @BeforeMethod\n  void start() {\n    personalAccessTokenManager = mock(PersonalAccessTokenManager.class);\n  }\n\n  @Test\n  public void shouldExpandRelativePaths() throws Exception {\n    URLFetcher urlFetcher = mock(URLFetcher.class);\n\n    GithubUrl githubUrl =\n        new GithubUrl(\"github\")\n            .withUsername(\"eclipse\")\n            .withRepository(\"che\")\n            .withBranch(\"main\")\n            .withServerUrl(\"https://github.com\")\n            .withLatestCommit(\"d74923ebf968454cf13251f17df69dcd87d3b932\");\n\n    FileContentProvider fileContentProvider =\n        new GithubAuthorizingFileContentProvider(githubUrl, urlFetcher, personalAccessTokenManager);\n\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenReturn(new PersonalAccessToken(\"foo\", \"provider\", \"che\", \"my-token\"));\n\n    fileContentProvider.fetchContent(\"devfile.yaml\");\n\n    verify(urlFetcher)\n        .fetch(\n            eq(\n                \"https://raw.githubusercontent.com/eclipse/che/d74923ebf968454cf13251f17df69dcd87d3b932/devfile.yaml\"),\n            eq(\"token my-token\"));\n  }\n\n  @Test\n  public void shouldPreserveAbsolutePaths() throws Exception {\n    String raw_url = \"https://raw.githubusercontent.com/foo/bar/branch-name/devfile.yaml\";\n\n    GithubUrl githubUrl =\n        new GithubUrl(\"github\")\n            .withUsername(\"eclipse\")\n            .withRepository(\"che\")\n            .withServerUrl(\"https://github.com\")\n            .withBranch(\"main\")\n            .withLatestCommit(\"9ac2f42ed62944d164f189afd57f14a2793a7e4b\");\n\n    URLFetcher urlFetcher = mock(URLFetcher.class);\n    FileContentProvider fileContentProvider =\n        new GithubAuthorizingFileContentProvider(githubUrl, urlFetcher, personalAccessTokenManager);\n\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenReturn(new PersonalAccessToken(raw_url, \"provider\", \"che\", \"my-token\"));\n\n    fileContentProvider.fetchContent(raw_url);\n    verify(urlFetcher).fetch(eq(raw_url), eq(\"token my-token\"));\n  }\n\n  @Test(expectedExceptions = FileNotFoundException.class)\n  public void shouldThrowNotFoundForPublicRepos() throws Exception {\n    String url = \"https://raw.githubusercontent.com/foo/bar/branch-name/devfile.yaml\";\n\n    GithubUrl githubUrl =\n        new GithubUrl(\"github\")\n            .withUsername(\"eclipse\")\n            .withRepository(\"che\")\n            .withServerUrl(\"https://github.com\");\n\n    URLFetcher urlFetcher = Mockito.mock(URLFetcher.class);\n    FileContentProvider fileContentProvider =\n        new GithubAuthorizingFileContentProvider(githubUrl, urlFetcher, personalAccessTokenManager);\n\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenThrow(UnknownScmProviderException.class);\n\n    when(urlFetcher.fetch(eq(url))).thenThrow(FileNotFoundException.class);\n\n    fileContentProvider.fetchContent(url);\n  }\n\n  @Test(expectedExceptions = DevfileException.class)\n  public void shouldThrowDevfileException() throws Exception {\n    String url = \"https://raw.githubusercontent.com/foo/bar/branch-name/devfile.yaml\";\n    GithubUrl githubUrl =\n        new GithubUrl(\"github\")\n            .withUsername(\"eclipse\")\n            .withRepository(\"che\")\n            .withServerUrl(\"https://github.com\");\n\n    URLFetcher urlFetcher = Mockito.mock(URLFetcher.class);\n    FileContentProvider fileContentProvider =\n        new GithubAuthorizingFileContentProvider(githubUrl, urlFetcher, personalAccessTokenManager);\n\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenThrow(UnknownScmProviderException.class);\n    when(urlFetcher.fetch(eq(url))).thenThrow(FileNotFoundException.class);\n    when(urlFetcher.fetch(eq(\"https://github.com/eclipse/che\"))).thenThrow(IOException.class);\n\n    fileContentProvider.fetchContent(url);\n  }\n\n  @Test\n  public void shouldNotAskGitHubAPIForDifferentDomain() throws Exception {\n    String raw_url = \"https://ghserver.com/foo/bar/branch-name/devfile.yaml\";\n\n    URLFetcher urlFetcher = Mockito.mock(URLFetcher.class);\n    GithubUrl githubUrl =\n        new GithubUrl(\"github\")\n            .withUsername(\"eclipse\")\n            .withRepository(\"che\")\n            .withServerUrl(\"https://github.com\");\n    FileContentProvider fileContentProvider =\n        new GithubAuthorizingFileContentProvider(githubUrl, urlFetcher, personalAccessTokenManager);\n    var personalAccessToken = new PersonalAccessToken(raw_url, \"provider\", \"che\", \"my-token\");\n    when(personalAccessTokenManager.getAndStore(anyString())).thenReturn(personalAccessToken);\n\n    fileContentProvider.fetchContent(raw_url);\n\n    verify(urlFetcher).fetch(eq(raw_url), eq(\"token my-token\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubFactoryParametersResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.factory.shared.Constants.CURRENT_VERSION;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.eclipse.che.security.oauth1.OAuthAuthenticationService.ERROR_QUERY_NAME;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyBoolean;\nimport static org.mockito.ArgumentMatchers.anyMap;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.model.factory.ScmInfo;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.ScmInfoDto;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.Mock;\nimport org.mockito.Spy;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Validate operations performed by the Github Factory service\n *\n * @author Florent Benoit\n */\n@Listeners(MockitoTestNGListener.class)\npublic class GithubFactoryParametersResolverTest {\n\n  @Mock private URLFetcher urlFetcher;\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  /** Parser which will allow to check validity of URLs and create objects. */\n  private GithubURLParser githubUrlParser;\n\n  private GithubApiClient githubApiClient;\n\n  /** Converter allowing to convert github URL to other objects. */\n  @Spy\n  private GithubSourceStorageBuilder githubSourceStorageBuilder = new GithubSourceStorageBuilder();\n\n  /** Parser which will allow to check validity of URLs and create objects. */\n  private URLFactoryBuilder urlFactoryBuilder;\n\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n  @Mock private AuthorisationRequestManager authorisationRequestManager;\n\n  /**\n   * Capturing the location parameter when calling {@link\n   * URLFactoryBuilder#createFactoryFromDevfile(RemoteFactoryUrl, FileContentProvider, Map,\n   * boolean)}\n   */\n  @Captor private ArgumentCaptor<RemoteFactoryUrl> factoryUrlArgumentCaptor;\n\n  /** Instance of resolver that will be tested. */\n  private AbstractGithubFactoryParametersResolver abstractGithubFactoryParametersResolver;\n\n  @BeforeMethod\n  protected void init() throws Exception {\n    this.githubApiClient = mock(GithubApiClient.class);\n    this.urlFactoryBuilder = mock(URLFactoryBuilder.class);\n\n    githubUrlParser =\n        new GithubURLParser(\n            personalAccessTokenManager, devfileFilenamesProvider, githubApiClient, null, false);\n\n    abstractGithubFactoryParametersResolver =\n        new GithubFactoryParametersResolver(\n            githubUrlParser,\n            urlFetcher,\n            githubSourceStorageBuilder,\n            authorisationRequestManager,\n            urlFactoryBuilder,\n            personalAccessTokenManager);\n    assertNotNull(this.abstractGithubFactoryParametersResolver);\n  }\n\n  /** Check missing parameter name can't be accepted by this resolver */\n  @Test\n  public void checkMissingParameter() {\n    Map<String, String> parameters = singletonMap(\"foo\", \"this is a foo bar\");\n    boolean accept = abstractGithubFactoryParametersResolver.accept(parameters);\n    // shouldn't be accepted\n    assertFalse(accept);\n  }\n\n  /** Check url which is not a github url can't be accepted by this resolver */\n  @Test\n  public void checkInvalidAcceptUrl() {\n    Map<String, String> parameters = singletonMap(URL_PARAMETER_NAME, \"http://www.eclipse.org/che\");\n    boolean accept = abstractGithubFactoryParametersResolver.accept(parameters);\n    // shouldn't be accepted\n    assertFalse(accept);\n  }\n\n  /** Check github url will be be accepted by this resolver */\n  @Test\n  public void checkValidAcceptUrl() {\n    Map<String, String> parameters =\n        singletonMap(URL_PARAMETER_NAME, \"https://github.com/codenvy/codenvy.git\");\n    boolean accept = abstractGithubFactoryParametersResolver.accept(parameters);\n    // shouldn't be accepted\n    assertTrue(accept);\n  }\n\n  @Test\n  public void shouldGenerateDevfileForFactoryWithNoDevfile() throws Exception {\n\n    String githubUrl = \"https://github.com/eclipse/che\";\n\n    when(githubApiClient.isConnected(eq(\"https://github.com\"))).thenReturn(true);\n    when(githubApiClient.getLatestCommit(anyString(), anyString(), anyString(), any()))\n        .thenReturn(new GithubCommit().withSha(\"test-sha\"));\n\n    Map<String, String> params = ImmutableMap.of(URL_PARAMETER_NAME, githubUrl);\n    // when\n    FactoryDevfileV2Dto factory =\n        (FactoryDevfileV2Dto) abstractGithubFactoryParametersResolver.createFactory(params);\n    // then\n    ScmInfoDto scmInfo = factory.getScmInfo();\n    assertEquals(scmInfo.getRepositoryUrl(), githubUrl + \".git\");\n    assertEquals(scmInfo.getBranch(), null);\n  }\n\n  @Test\n  public void shouldSkipAuthenticationWhenAccessDenied() throws Exception {\n    // given\n    when(githubApiClient.isConnected(eq(\"https://github.com\"))).thenReturn(true);\n    when(githubApiClient.getLatestCommit(anyString(), anyString(), anyString(), any()))\n        .thenReturn(new GithubCommit().withSha(\"test-sha\"));\n\n    // when\n    Map<String, String> params =\n        ImmutableMap.of(\n            URL_PARAMETER_NAME,\n            \"https://github.com/eclipse/che\",\n            ERROR_QUERY_NAME,\n            \"access_denied\");\n    abstractGithubFactoryParametersResolver.createFactory(params);\n    // then\n    verify(urlFactoryBuilder)\n        .createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(FileContentProvider.class), anyMap(), eq(true));\n  }\n\n  @Test\n  public void shouldNotSkipAuthenticationWhenNoErrorParameterPassed() throws Exception {\n    // given\n    when(githubApiClient.isConnected(eq(\"https://github.com\"))).thenReturn(true);\n    when(githubApiClient.getLatestCommit(anyString(), anyString(), anyString(), any()))\n        .thenReturn(new GithubCommit().withSha(\"test-sha\"));\n\n    // when\n    abstractGithubFactoryParametersResolver.createFactory(\n        ImmutableMap.of(URL_PARAMETER_NAME, \"https://github.com/eclipse/che\"));\n    // then\n    verify(urlFactoryBuilder)\n        .createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(FileContentProvider.class), anyMap(), eq(false));\n  }\n\n  @Test\n  public void shouldSetScmInfoIntoDevfileV2() throws Exception {\n\n    String githubUrl = \"https://github.com/eclipse/che/tree/foobar\";\n\n    FactoryDevfileV2Dto computedFactory = generateDevfileV2Factory();\n\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.of(computedFactory));\n    when(githubApiClient.isConnected(eq(\"https://github.com\"))).thenReturn(true);\n    when(githubApiClient.getLatestCommit(anyString(), anyString(), anyString(), any()))\n        .thenReturn(new GithubCommit().withSha(\"test-sha\"));\n\n    Map<String, String> params = ImmutableMap.of(URL_PARAMETER_NAME, githubUrl);\n    // when\n    FactoryDevfileV2Dto factory =\n        (FactoryDevfileV2Dto) abstractGithubFactoryParametersResolver.createFactory(params);\n    // then\n    ScmInfo scmInfo = factory.getScmInfo();\n    assertNotNull(scmInfo);\n    assertEquals(scmInfo.getScmProviderName(), \"github\");\n    assertEquals(scmInfo.getRepositoryUrl(), \"https://github.com/eclipse/che.git\");\n    assertEquals(scmInfo.getBranch(), \"foobar\");\n  }\n\n  @Test\n  public void shouldCreateFactoryWithoutAuthentication() throws ApiException {\n    // given\n    String githubUrl = \"https://github.com/user/repo.git\";\n    Map<String, String> params =\n        ImmutableMap.of(URL_PARAMETER_NAME, githubUrl, ERROR_QUERY_NAME, \"access_denied\");\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.of(generateDevfileV2Factory()));\n\n    // when\n    abstractGithubFactoryParametersResolver.createFactory(params);\n\n    // then\n    verify(urlFactoryBuilder)\n        .createFactoryFromDevfile(\n            any(GithubUrl.class),\n            any(GithubAuthorizingFileContentProvider.class),\n            anyMap(),\n            eq(true));\n  }\n\n  @Test\n  public void shouldParseFactoryUrlWithAuthentication() throws Exception {\n    // given\n    githubUrlParser = mock(GithubURLParser.class);\n\n    abstractGithubFactoryParametersResolver =\n        new GithubFactoryParametersResolver(\n            githubUrlParser,\n            urlFetcher,\n            githubSourceStorageBuilder,\n            authorisationRequestManager,\n            urlFactoryBuilder,\n            personalAccessTokenManager);\n    when(authorisationRequestManager.isStored(eq(\"github\"))).thenReturn(true);\n    // when\n    abstractGithubFactoryParametersResolver.parseFactoryUrl(\"url\");\n    // then\n    verify(githubUrlParser).parseWithoutAuthentication(\"url\", null);\n    verify(githubUrlParser, never()).parse(\"url\", null);\n  }\n\n  @Test\n  public void shouldParseFactoryUrlWithOutAuthentication() throws Exception {\n    // given\n    githubUrlParser = mock(GithubURLParser.class);\n\n    abstractGithubFactoryParametersResolver =\n        new GithubFactoryParametersResolver(\n            githubUrlParser,\n            urlFetcher,\n            githubSourceStorageBuilder,\n            authorisationRequestManager,\n            urlFactoryBuilder,\n            personalAccessTokenManager);\n    when(authorisationRequestManager.isStored(eq(\"github\"))).thenReturn(false);\n    // when\n    abstractGithubFactoryParametersResolver.parseFactoryUrl(\"url\");\n    // then\n    verify(githubUrlParser).parse(\"url\", null);\n    verify(githubUrlParser, never()).parseWithoutAuthentication(\"url\", null);\n  }\n\n  private FactoryDevfileV2Dto generateDevfileV2Factory() {\n    return newDto(FactoryDevfileV2Dto.class)\n        .withV(CURRENT_VERSION)\n        .withSource(\"repo\")\n        .withDevfile(Map.of(\"schemaVersion\", \"2.0.0\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubGitUserDataFetcherTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.equalTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.common.net.HttpHeaders;\nimport java.util.Optional;\nimport org.eclipse.che.api.factory.server.scm.GitUserData;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GithubGitUserDataFetcherTest {\n\n  @Mock OAuthAPI oAuthTokenFetcher;\n  @Mock PersonalAccessTokenManager personalAccessTokenManager;\n  GithubUserDataFetcher githubGUDFetcher;\n\n  final int httpPort = 3301;\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  final String githubOauthToken = \"gho_token1\";\n\n  @BeforeMethod\n  void start() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).port(httpPort));\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", httpPort);\n    wireMock = new WireMock(\"localhost\", httpPort);\n    githubGUDFetcher =\n        new GithubUserDataFetcher(\n            \"http://che.api\",\n            personalAccessTokenManager,\n            new GithubApiClient(wireMockServer.url(\"/\")));\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token \" + githubOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(GithubApiClient.GITHUB_OAUTH_SCOPES_HEADER, \"repo\")\n                    .withBodyFile(\"github/rest/user/response.json\")));\n  }\n\n  @AfterMethod\n  void stop() {\n    wireMockServer.stop();\n  }\n\n  @Test\n  public void shouldFetchGitUserData() throws Exception {\n    PersonalAccessToken token = mock(PersonalAccessToken.class);\n    when(token.getToken()).thenReturn(githubOauthToken);\n    when(token.getScmProviderUrl()).thenReturn(wireMockServer.url(\"/\"));\n    when(personalAccessTokenManager.get(any(Subject.class), eq(\"github\"), eq(null), eq(null)))\n        .thenReturn(Optional.of(token));\n\n    GitUserData gitUserData = githubGUDFetcher.fetchGitUserData(null);\n\n    assertEquals(gitUserData.getScmUsername(), \"Github User\");\n    assertEquals(gitUserData.getScmUserEmail(), \"github-user@acme.com\");\n  }\n\n  @Test\n  public void shouldFetchGitUserDataByUrl() throws Exception {\n    // given\n    PersonalAccessToken token = mock(PersonalAccessToken.class);\n    when(token.getToken()).thenReturn(githubOauthToken);\n    when(personalAccessTokenManager.get(any(Subject.class), eq(\"github\"), eq(null), eq(null)))\n        .thenReturn(Optional.empty());\n    when(personalAccessTokenManager.get(\n            any(Subject.class), eq(null), eq(wireMockServer.baseUrl()), eq(null)))\n        .thenReturn(Optional.of(token));\n    // when\n    GitUserData gitUserData = githubGUDFetcher.fetchGitUserData(null);\n    // then\n    assertEquals(gitUserData.getScmUsername(), \"Github User\");\n    assertEquals(gitUserData.getScmUserEmail(), \"github-user@acme.com\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubPersonalAccessTokenFetcherTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.equalTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;\nimport static org.eclipse.che.api.factory.server.github.GithubPersonalAccessTokenFetcher.DEFAULT_TOKEN_SCOPES;\nimport static org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher.OAUTH_2_PREFIX;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.*;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.common.collect.ImmutableSet;\nimport com.google.common.net.HttpHeaders;\nimport java.util.Collections;\nimport java.util.Optional;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenParams;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Ignore;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GithubPersonalAccessTokenFetcherTest {\n\n  @Mock OAuthAPI oAuthAPI;\n  GithubPersonalAccessTokenFetcher githubPATFetcher;\n\n  final int httpPort = 3301;\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  final String githubOauthToken = \"gho_token1\";\n\n  @BeforeMethod\n  void start() {\n\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).port(httpPort));\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", httpPort);\n    wireMock = new WireMock(\"localhost\", httpPort);\n    githubPATFetcher =\n        new GithubPersonalAccessTokenFetcher(\n            \"http://che.api\", oAuthAPI, new GithubApiClient(wireMockServer.url(\"/\")));\n  }\n\n  @AfterMethod\n  void stop() {\n    wireMockServer.stop();\n  }\n\n  @Test\n  public void shouldNotValidateSCMServerWithTrailingSlash() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token \" + githubOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(GithubApiClient.GITHUB_OAUTH_SCOPES_HEADER, \"repo\")\n                    .withBodyFile(\"github/rest/user/response.json\")));\n    PersonalAccessTokenParams personalAccessTokenParams =\n        new PersonalAccessTokenParams(\n            \"https://github.com/\",\n            \"provider\",\n            \"scmTokenName\",\n            \"scmTokenId\",\n            githubOauthToken,\n            null);\n    assertTrue(\n        githubPATFetcher.isValid(personalAccessTokenParams).isEmpty(),\n        \"Should not validate SCM server with trailing /\");\n  }\n\n  @Test\n  public void testContainsScope() {\n    String[] tokenScopes = {\"repo\", \"notifications\", \"write:org\", \"admin:gpg_key\"};\n    assertTrue(\n        githubPATFetcher.containsScopes(tokenScopes, ImmutableSet.of(\"repo\")),\n        \"'repo' scope should have matched directly.\");\n    assertTrue(\n        githubPATFetcher.containsScopes(tokenScopes, ImmutableSet.of(\"public_repo\")),\n        \"'public_repo' scope should have matched since token has parent scope 'repo'.\");\n    assertTrue(\n        githubPATFetcher.containsScopes(\n            tokenScopes, ImmutableSet.of(\"read:gpg_key\", \"write:gpg_key\")),\n        \"'admin:gpg_key' token scope should cover both scope requirement.\");\n    assertFalse(\n        githubPATFetcher.containsScopes(tokenScopes, ImmutableSet.of(\"admin:org\")),\n        \"'admin:org' scope should not match since token only has scope 'write:org'.\");\n    assertFalse(\n        githubPATFetcher.containsScopes(tokenScopes, ImmutableSet.of(\"gist\")),\n        \"'gist' shouldn't matche since it is not present in token scope\");\n    assertTrue(\n        githubPATFetcher.containsScopes(tokenScopes, ImmutableSet.of(\"unknown\", \"repo\")),\n        \"'unknown' is not even a valid GitHub scope, so it shouldn't have any impact.\");\n    assertTrue(\n        githubPATFetcher.containsScopes(tokenScopes, Collections.emptySet()),\n        \"No required scope should always return true\");\n    assertFalse(\n        githubPATFetcher.containsScopes(new String[0], ImmutableSet.of(\"repo\")),\n        \"Token has no scope, so it should not match\");\n    assertTrue(\n        githubPATFetcher.containsScopes(new String[0], Collections.emptySet()),\n        \"No scope requirement and a token with no scope should match\");\n  }\n\n  @Ignore\n  @Test(\n      expectedExceptions = ScmCommunicationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: \\\\[repo, user:email, read:user, read:org, workflow]\")\n  public void shouldThrowExceptionOnInsufficientTokenScopes() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    OAuthToken oAuthToken = newDto(OAuthToken.class).withToken(githubOauthToken).withScope(\"\");\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenReturn(oAuthToken);\n\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token \" + githubOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(GithubApiClient.GITHUB_OAUTH_SCOPES_HEADER, \"\")\n                    .withBodyFile(\"github/rest/user/response.json\")));\n\n    githubPATFetcher.fetchPersonalAccessToken(subject, wireMockServer.url(\"/\"));\n  }\n\n  @Test(\n      expectedExceptions = ScmUnauthorizedException.class,\n      expectedExceptionsMessageRegExp = \"Username is not authorized in github OAuth provider.\")\n  public void shouldThrowUnauthorizedExceptionWhenUserNotLoggedIn() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenThrow(UnauthorizedException.class);\n\n    githubPATFetcher.fetchPersonalAccessToken(subject, wireMockServer.url(\"/\"));\n  }\n\n  @Test(\n      expectedExceptions = ScmUnauthorizedException.class,\n      expectedExceptionsMessageRegExp = \"Username is not authorized in github OAuth provider.\")\n  public void shouldThrowUnauthorizedExceptionIfTokenIsNotValid() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    OAuthToken oAuthToken = newDto(OAuthToken.class).withToken(githubOauthToken).withScope(\"\");\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenReturn(oAuthToken);\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token \" + githubOauthToken))\n            .willReturn(aResponse().withStatus(HTTP_UNAUTHORIZED)));\n\n    githubPATFetcher.fetchPersonalAccessToken(subject, wireMockServer.url(\"/\"));\n  }\n\n  @Test\n  public void shouldReturnToken() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    OAuthToken oAuthToken = newDto(OAuthToken.class).withToken(githubOauthToken);\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenReturn(oAuthToken);\n\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token \" + githubOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(\n                        GithubApiClient.GITHUB_OAUTH_SCOPES_HEADER,\n                        DEFAULT_TOKEN_SCOPES.toString().replace(\"[\", \"\").replace(\"]\", \"\"))\n                    .withBodyFile(\"github/rest/user/response.json\")));\n\n    PersonalAccessToken token =\n        githubPATFetcher.fetchPersonalAccessToken(subject, wireMockServer.url(\"/\"));\n    assertNotNull(token);\n  }\n\n  @Test\n  public void shouldValidatePersonalToken() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token \" + githubOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(\n                        GithubApiClient.GITHUB_OAUTH_SCOPES_HEADER,\n                        DEFAULT_TOKEN_SCOPES.toString().replace(\"[\", \"\").replace(\"]\", \"\"))\n                    .withBodyFile(\"github/rest/user/response.json\")));\n\n    PersonalAccessTokenParams params =\n        new PersonalAccessTokenParams(\n            wireMockServer.url(\"/\"), \"provider\", \"token-name\", \"tid-23434\", githubOauthToken, null);\n\n    Optional<Pair<Boolean, String>> valid = githubPATFetcher.isValid(params);\n    assertTrue(valid.isPresent());\n    assertTrue(valid.get().first);\n  }\n\n  @Test\n  public void shouldValidateOauthToken() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token \" + githubOauthToken))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withHeader(\n                        GithubApiClient.GITHUB_OAUTH_SCOPES_HEADER,\n                        DEFAULT_TOKEN_SCOPES.toString().replace(\"[\", \"\").replace(\"]\", \"\"))\n                    .withBodyFile(\"github/rest/user/response.json\")));\n\n    PersonalAccessTokenParams params =\n        new PersonalAccessTokenParams(\n            wireMockServer.url(\"/\"),\n            \"provider\",\n            OAUTH_2_PREFIX + \"-params-name\",\n            \"tid-23434\",\n            githubOauthToken,\n            null);\n\n    Optional<Pair<Boolean, String>> valid = githubPATFetcher.isValid(params);\n    assertTrue(valid.isPresent());\n    assertTrue(valid.get().first);\n  }\n\n  @Test\n  public void shouldNotValidateExpiredOauthToken() throws Exception {\n    stubFor(get(urlEqualTo(\"/api/v3/user\")).willReturn(aResponse().withStatus(HTTP_UNAUTHORIZED)));\n\n    PersonalAccessTokenParams params =\n        new PersonalAccessTokenParams(\n            wireMockServer.url(\"/\"),\n            \"provider\",\n            OAUTH_2_PREFIX + \"-token-name\",\n            \"tid-23434\",\n            githubOauthToken,\n            null);\n\n    assertFalse(githubPATFetcher.isValid(params).isPresent());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubScmFileResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.*;\n\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GithubScmFileResolverTest {\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  GithubURLParser githubURLParser;\n\n  private URLFetcher urlFetcher;\n\n  private PersonalAccessTokenManager personalAccessTokenManager;\n\n  private GithubScmFileResolver githubScmFileResolver;\n\n  private GithubApiClient githubApiClient;\n\n  @BeforeMethod\n  void start() {\n    this.githubApiClient = mock(GithubApiClient.class);\n    this.urlFetcher = mock(URLFetcher.class);\n\n    this.personalAccessTokenManager = mock(PersonalAccessTokenManager.class);\n\n    githubURLParser =\n        new GithubURLParser(\n            personalAccessTokenManager, devfileFilenamesProvider, githubApiClient, null, false);\n\n    githubScmFileResolver =\n        new GithubScmFileResolver(githubURLParser, urlFetcher, personalAccessTokenManager);\n  }\n\n  /** Check url which is not a Gitlab url can't be accepted by this resolver */\n  @Test\n  public void checkInvalidAcceptUrl() {\n    // shouldn't be accepted\n    assertFalse(githubScmFileResolver.accept(\"http://foobar.com\"));\n  }\n\n  /** Check <GitHub> url will be be accepted by this resolver */\n  @Test\n  public void checkValidAcceptUrl() {\n    // should be accepted\n    assertTrue(githubScmFileResolver.accept(\"https://github.com/test/repo.git\"));\n  }\n\n  @Test\n  public void shouldReturnContentFromUrlFetcher() throws Exception {\n    final String rawContent = \"raw_content\";\n    final String filename = \"devfile.yaml\";\n\n    when(urlFetcher.fetch(\n            eq(\n                \"https://raw.githubusercontent.com/organization/samples/d74923ebf968454cf13251f17df69dcd87d3b932/devfile.yaml\"),\n            anyString()))\n        .thenReturn(rawContent);\n\n    lenient()\n        .when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenReturn(new PersonalAccessToken(\"foo\", \"provider\", \"che\", \"my-token\"));\n\n    when(githubApiClient.isConnected(eq(\"https://github.com\"))).thenReturn(true);\n    when(githubApiClient.getLatestCommit(anyString(), anyString(), anyString(), any()))\n        .thenReturn(\n            new GithubCommit()\n                .withSha(\"d74923ebf968454cf13251f17df69dcd87d3b932\")\n                .withUrl(\"http://commit.url\"));\n\n    String content =\n        githubScmFileResolver.fileContent(\"https://github.com/organization/samples.git\", filename);\n\n    assertEquals(content, rawContent);\n  }\n\n  @Test\n  public void shouldReturnContentWithoutAuthentication() throws Exception {\n    // given\n    lenient()\n        .when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenThrow(new ScmUnauthorizedException(\"message\", \"github\", \"v1\", \"url\"));\n\n    // when\n    githubScmFileResolver.fileContent(\"https://github.com/username/repo.git\", \"devfile.yaml\");\n\n    // then\n    verify(urlFetcher).fetch(anyString());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubURLParserTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;\nimport static java.util.Arrays.asList;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport java.lang.reflect.Field;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Validate operations performed by the Github parser\n *\n * @author Florent Benoit\n */\n@Listeners(MockitoTestNGListener.class)\npublic class GithubURLParserTest {\n\n  private GithubApiClient githubApiClient;\n\n  private PersonalAccessTokenManager personalAccessTokenManager;\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  /** Instance of component that will be tested. */\n  private GithubURLParser githubUrlParser;\n\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  /** Setup objects/ */\n  @BeforeMethod\n  protected void start() throws ApiException {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    wireMock = new WireMock(\"localhost\", wireMockServer.port());\n    this.personalAccessTokenManager = mock(PersonalAccessTokenManager.class);\n    this.githubApiClient = mock(GithubApiClient.class);\n\n    githubUrlParser =\n        new GithubURLParser(\n            personalAccessTokenManager, devfileFilenamesProvider, githubApiClient, null, false);\n  }\n\n  /** Check invalid url (not a GitHub one) */\n  @Test(expectedExceptions = IllegalArgumentException.class)\n  public void invalidUrl() throws ApiException {\n    githubUrlParser.parse(\"http://www.eclipse.org\", null);\n  }\n\n  @Test\n  public void shouldParseWithBranch() throws ApiException {\n    GithubUrl githubUrl = githubUrlParser.parse(\"https://github.com/eclipse/che\", \"branch\");\n    assertEquals(githubUrl.getBranch(), \"branch\");\n  }\n\n  @Test\n  public void shouldParseWithUrlBranch() throws ApiException {\n    GithubUrl githubUrl =\n        githubUrlParser.parse(\"https://github.com/eclipse/che/tree/master/\", \"branch\");\n    assertEquals(githubUrl.getBranch(), \"master\");\n  }\n\n  @Test\n  public void shouldParseGithubServerUrlWithIpv6Host() throws ApiException {\n    // given\n    githubUrlParser =\n        new GithubURLParser(\n            personalAccessTokenManager,\n            devfileFilenamesProvider,\n            githubApiClient,\n            \"https://[2001:db8::1]\",\n            false);\n    when(githubApiClient.isConnected(eq(\"https://[2001:db8::1]\"))).thenReturn(true);\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(asList(\"devfile.yaml\", \".devfile.yaml\"));\n\n    // when\n    GithubUrl githubUrl = githubUrlParser.parse(\"https://[2001:db8::1]/eclipse/che\", null);\n\n    // then\n    assertEquals(githubUrl.getUsername(), \"eclipse\");\n    assertEquals(githubUrl.getRepository(), \"che\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithBranch() throws ApiException {\n    // given\n    githubUrlParser =\n        new GithubURLParser(\n            personalAccessTokenManager,\n            devfileFilenamesProvider,\n            githubApiClient,\n            \"https://[2001:db8::1]\",\n            false);\n    when(githubApiClient.isConnected(eq(\"https://[2001:db8::1]\"))).thenReturn(true);\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(asList(\"devfile.yaml\", \".devfile.yaml\"));\n\n    // when\n    GithubUrl githubUrl =\n        githubUrlParser.parse(\"https://[2001:db8::1]/eclipse/che/tree/feature-branch\", null);\n\n    // then\n    assertEquals(githubUrl.getUsername(), \"eclipse\");\n    assertEquals(githubUrl.getRepository(), \"che\");\n    assertEquals(githubUrl.getBranch(), \"feature-branch\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithRevisionParam() throws ApiException {\n    // given\n    githubUrlParser =\n        new GithubURLParser(\n            personalAccessTokenManager,\n            devfileFilenamesProvider,\n            githubApiClient,\n            \"https://[2001:db8::1]\",\n            false);\n    when(githubApiClient.isConnected(eq(\"https://[2001:db8::1]\"))).thenReturn(true);\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(asList(\"devfile.yaml\", \".devfile.yaml\"));\n\n    // when\n    GithubUrl githubUrl = githubUrlParser.parse(\"https://[2001:db8::1]/eclipse/che\", \"my-branch\");\n\n    // then\n    assertEquals(githubUrl.getUsername(), \"eclipse\");\n    assertEquals(githubUrl.getRepository(), \"che\");\n    assertEquals(githubUrl.getBranch(), \"my-branch\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithPullRequestId() throws Exception {\n    // given\n    githubUrlParser =\n        new GithubURLParser(\n            personalAccessTokenManager,\n            devfileFilenamesProvider,\n            githubApiClient,\n            \"https://[2001:db8::1]\",\n            false);\n\n    GithubPullRequest pr =\n        new GithubPullRequest()\n            .withState(\"open\")\n            .withHead(\n                new GithubHead()\n                    .withRef(\"pr-branch\")\n                    .withUser(new GithubUser().withId(0).withName(\"eclipse\").withLogin(\"eclipse\"))\n                    .withRepo(new GithubRepo().withName(\"che\")));\n    when(githubApiClient.isConnected(eq(\"https://[2001:db8::1]\"))).thenReturn(true);\n    when(githubApiClient.getPullRequest(any(), any(), any(), any())).thenReturn(pr);\n\n    // when\n    GithubUrl githubUrl = githubUrlParser.parse(\"https://[2001:db8::1]/eclipse/che/pull/123\", null);\n\n    // then\n    assertEquals(githubUrl.getUsername(), \"eclipse\");\n    assertEquals(githubUrl.getRepository(), \"che\");\n    assertEquals(githubUrl.getBranch(), \"pr-branch\");\n  }\n\n  @Test\n  public void shouldParseIpv6LoopbackAddress() throws ApiException {\n    // given\n    githubUrlParser =\n        new GithubURLParser(\n            personalAccessTokenManager,\n            devfileFilenamesProvider,\n            githubApiClient,\n            \"https://[::1]\",\n            false);\n    when(githubApiClient.isConnected(eq(\"https://[::1]\"))).thenReturn(true);\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(asList(\"devfile.yaml\", \".devfile.yaml\"));\n\n    // when\n    GithubUrl githubUrl = githubUrlParser.parse(\"https://[::1]/eclipse/che\", null);\n\n    // then\n    assertEquals(githubUrl.getUsername(), \"eclipse\");\n    assertEquals(githubUrl.getRepository(), \"che\");\n  }\n\n  @Test\n  public void shouldParseIpv6FullFormAddress() throws ApiException {\n    // given\n    githubUrlParser =\n        new GithubURLParser(\n            personalAccessTokenManager,\n            devfileFilenamesProvider,\n            githubApiClient,\n            \"https://[2001:0db8:0000:0000:0000:0000:0000:0001]\",\n            false);\n    when(githubApiClient.isConnected(eq(\"https://[2001:0db8:0000:0000:0000:0000:0000:0001]\")))\n        .thenReturn(true);\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(asList(\"devfile.yaml\", \".devfile.yaml\"));\n\n    // when\n    GithubUrl githubUrl =\n        githubUrlParser.parse(\n            \"https://[2001:0db8:0000:0000:0000:0000:0000:0001]/eclipse/che\", null);\n\n    // then\n    assertEquals(githubUrl.getUsername(), \"eclipse\");\n    assertEquals(githubUrl.getRepository(), \"che\");\n  }\n\n  @Test\n  public void shouldParseIpv6DotGitUrl() throws ApiException {\n    // given\n    githubUrlParser =\n        new GithubURLParser(\n            personalAccessTokenManager,\n            devfileFilenamesProvider,\n            githubApiClient,\n            \"https://[2001:db8::1]\",\n            false);\n    when(githubApiClient.isConnected(eq(\"https://[2001:db8::1]\"))).thenReturn(true);\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(asList(\"devfile.yaml\", \".devfile.yaml\"));\n\n    // when\n    GithubUrl githubUrl = githubUrlParser.parse(\"https://[2001:db8::1]/eclipse/che.git\", null);\n\n    // then\n    assertEquals(githubUrl.getUsername(), \"eclipse\");\n    assertEquals(githubUrl.getRepository(), \"che\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlViaDynamicPatternMatching() throws ApiException {\n    // The parser is configured for github.com, but getPatternMatcherByUrl() dynamically\n    // creates a pattern from the URL itself, so IPv6 URLs can be parsed even when the\n    // constructor was configured with a different host.\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(asList(\"devfile.yaml\", \".devfile.yaml\"));\n\n    GithubUrl githubUrl = githubUrlParser.parse(\"https://[2001:db8::1]/eclipse/che\", null);\n\n    assertEquals(githubUrl.getUsername(), \"eclipse\");\n    assertEquals(githubUrl.getRepository(), \"che\");\n  }\n\n  /** Check URLs are valid with regexp */\n  @Test(dataProvider = \"UrlsProvider\")\n  public void checkRegexp(String url) {\n    assertTrue(githubUrlParser.isValid(url), \"url \" + url + \" is invalid\");\n  }\n\n  /** Compare parsing */\n  @Test(dataProvider = \"parsing\")\n  public void checkParsing(String url, String username, String repository, String path)\n      throws ApiException {\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(asList(\"devfile.yaml\", \".devfile.yaml\"));\n\n    GithubUrl githubUrl = githubUrlParser.parse(url, null);\n\n    assertEquals(githubUrl.getUsername(), username);\n    assertEquals(githubUrl.getRepository(), repository);\n    assertEquals(githubUrl.getBranch(), path);\n  }\n\n  /** Compare parsing */\n  @Test(dataProvider = \"parsingBadRepository\")\n  public void checkParsingBadRepositoryDoNotModifiesInitialInput(String url, String repository)\n      throws ApiException {\n    // given\n    when(githubApiClient.isConnected(eq(\"https://github.com\"))).thenReturn(true);\n\n    // when\n    GithubUrl githubUrl = githubUrlParser.parse(url, null);\n\n    // then\n    assertEquals(githubUrl.getRepository(), repository);\n  }\n\n  @DataProvider(name = \"UrlsProvider\")\n  public Object[][] urls() {\n    return new Object[][] {\n      {\"https://github.com/eclipse/che\"},\n      {\"https://github.com/eclipse/che123\"},\n      {\"https://github.com/eclipse/che/\"},\n      {\"https://github.com/eclipse/che/tree/4.2.x\"},\n      {\"https://github.com/eclipse/che/tree/master/\"},\n      {\"https://github.com/eclipse/che/tree/master/dashboard/\"},\n      {\"https://github.com/eclipse/che/tree/master/plugins/plugin-git/che-plugin-git-ext-git\"},\n      {\"https://github.com/eclipse/che/tree/master/plugins/plugin-git/che-plugin-git-ext-git/\"},\n      {\"https://github.com/eclipse/che/pull/11103\"},\n      {\"https://github.com/eclipse/che.git\"},\n      {\"https://github.com/eclipse/che.with.dots.git\"},\n      {\"https://github.com/eclipse/che-with-hyphen\"},\n      {\"https://github.com/eclipse/che-with-hyphen.git\"},\n      {\"git@github.com:eclipse/che.git)\"},\n      {\"git@github.com:eclipse/che)\"},\n      {\"git@github.com:eclipse/che123)\"},\n      {\"git@github.com:eclipse/che.with.dots.git)\"},\n      {\"git@github.com:eclipse/che-with-hyphen)\"},\n      {\"git@github.com:eclipse/che-with-hyphen.git)\"}\n    };\n  }\n\n  @DataProvider(name = \"parsing\")\n  public Object[][] expectedParsing() {\n    return new Object[][] {\n      {\"https://github.com/eclipse/che\", \"eclipse\", \"che\", null},\n      {\"https://github.com/eclipse/che123\", \"eclipse\", \"che123\", null},\n      {\"https://github.com/eclipse/che.git\", \"eclipse\", \"che\", null},\n      {\"https://github.com/eclipse/che.with.dot.git\", \"eclipse\", \"che.with.dot\", null},\n      {\"https://github.com/eclipse/-.git\", \"eclipse\", \"-\", null},\n      {\"https://github.com/eclipse/-j.git\", \"eclipse\", \"-j\", null},\n      {\"https://github.com/eclipse/-\", \"eclipse\", \"-\", null},\n      {\"https://github.com/eclipse/che-with-hyphen\", \"eclipse\", \"che-with-hyphen\", null},\n      {\"https://github.com/eclipse/che-with-hyphen.git\", \"eclipse\", \"che-with-hyphen\", null},\n      {\"https://github.com/eclipse/che/\", \"eclipse\", \"che\", null},\n      {\"https://github.com/eclipse/repositorygit\", \"eclipse\", \"repositorygit\", null},\n      {\"https://github.com/eclipse/che/tree/4.2.x\", \"eclipse\", \"che\", \"4.2.x\"},\n      {\"https://github.com/eclipse/che/tree/master\", \"eclipse\", \"che\", \"master\"},\n      {\"https://github.com/eclipse/che/tree/master/\", \"eclipse\", \"che\", \"master\"},\n      {\n        \"https://github.com/eclipse/che/tree/branch/with/slash\",\n        \"eclipse\",\n        \"che\",\n        \"branch/with/slash\"\n      },\n      {\"https://github.com/eclipse/che/blob/branch/path/to/\", \"eclipse\", \"che\", \"branch/path/to\"},\n      {\n        \"https://github.com/eclipse/che/blob/branch/path/to/devfile.yaml\",\n        \"eclipse\",\n        \"che\",\n        \"branch/path/to\"\n      },\n      {\n        \"https://github.com/eclipse/che/blob/branch/path/to/.devfile.yaml\",\n        \"eclipse\",\n        \"che\",\n        \"branch/path/to\"\n      },\n      {\"git@github.com:eclipse/che\", \"eclipse\", \"che\", null},\n      {\"git@github.com:eclipse/che123\", \"eclipse\", \"che123\", null},\n      {\"git@github.com:eclipse/che.git\", \"eclipse\", \"che\", null},\n      {\"git@github.com:eclipse/che.with.dot.git\", \"eclipse\", \"che.with.dot\", null},\n      {\"git@github.com:eclipse/-.git\", \"eclipse\", \"-\", null},\n      {\"git@github.com:eclipse/-j.git\", \"eclipse\", \"-j\", null},\n      {\"git@github.com:eclipse/-\", \"eclipse\", \"-\", null},\n      {\"git@github.com:eclipse/che-with-hyphen\", \"eclipse\", \"che-with-hyphen\", null},\n      {\"git@github.com:eclipse/che-with-hyphen.git\", \"eclipse\", \"che-with-hyphen\", null},\n      {\"git@github.com:eclipse/che/\", \"eclipse\", \"che\", null},\n      {\"git@github.com:eclipse/repositorygit\", \"eclipse\", \"repositorygit\", null},\n    };\n  }\n\n  @DataProvider(name = \"parsingBadRepository\")\n  public Object[][] parsingBadRepository() {\n    return new Object[][] {\n      {\"https://github.com/eclipse/che .git\", \"che .git\"},\n      {\"https://github.com/eclipse/.git\", \".git\"},\n      {\"https://github.com/eclipse/myB@dR&pository.git\", \"myB@dR&pository.git\"},\n      {\"https://github.com/eclipse/.\", \".\"},\n      {\"https://github.com/eclipse/івапівап.git\", \"івапівап.git\"},\n      {\"https://github.com/eclipse/ \", \" \"},\n      {\"https://github.com/eclipse/.\", \".\"},\n      {\"https://github.com/eclipse/ .git\", \" .git\"},\n      {\"git@github.com:eclipse/che .git\", \"che .git\"},\n      {\"git@github.com:eclipse/.git\", \".git\"},\n      {\"git@github.com:eclipse/myB@dR&pository.git\", \"myB@dR&pository.git\"},\n      {\"git@github.com:eclipse/.\", \".\"},\n      {\"git@github.com:eclipse/івапівап.git\", \"івапівап.git\"},\n      {\"git@github.com:eclipse/ \", \" \"},\n      {\"git@github.com:eclipse/.\", \".\"},\n      {\"git@github.com:eclipse/ .git\", \" .git\"}\n    };\n  }\n\n  /** Check Pull Request with data inside the repository */\n  @Test\n  public void checkPullRequestFromRepository() throws Exception {\n    String url = \"https://github.com/eclipse/che/pull/21276\";\n\n    GithubPullRequest pr =\n        new GithubPullRequest()\n            .withState(\"open\")\n            .withHead(\n                new GithubHead()\n                    .withRef(\"pr-main-to-7.46.0\")\n                    .withUser(new GithubUser().withId(0).withName(\"eclipse\").withLogin(\"eclipse\"))\n                    .withRepo(new GithubRepo().withName(\"che\")));\n    when(githubApiClient.isConnected(eq(\"https://github.com\"))).thenReturn(true);\n    when(githubApiClient.getPullRequest(any(), any(), any(), any())).thenReturn(pr);\n\n    GithubUrl githubUrl = githubUrlParser.parse(url, null);\n\n    assertEquals(githubUrl.getUsername(), \"eclipse\");\n    assertEquals(githubUrl.getRepository(), \"che\");\n    assertEquals(githubUrl.getBranch(), \"pr-main-to-7.46.0\");\n  }\n\n  /** Check Pull Request with data outside the repository (fork) */\n  @Test\n  public void checkPullRequestFromForkedRepository() throws Exception {\n    GithubPullRequest pr =\n        new GithubPullRequest()\n            .withState(\"open\")\n            .withHead(\n                new GithubHead()\n                    .withRef(\"main\")\n                    .withUser(new GithubUser().withLogin(\"eclipse\"))\n                    .withRepo(new GithubRepo().withName(\"che\")));\n\n    PersonalAccessToken personalAccessToken = mock(PersonalAccessToken.class);\n    when(personalAccessToken.getToken()).thenReturn(\"token\");\n    when(personalAccessTokenManager.get(any(Subject.class), eq(null), anyString(), eq(null)))\n        .thenReturn(Optional.of(personalAccessToken));\n\n    when(githubApiClient.isConnected(eq(\"https://github.com\"))).thenReturn(true);\n    when(githubApiClient.getPullRequest(anyString(), anyString(), anyString(), anyString()))\n        .thenReturn(pr);\n\n    String url = \"https://github.com/eclipse/che/pull/20189\";\n    GithubUrl githubUrl = githubUrlParser.parse(url, null);\n\n    assertEquals(githubUrl.getUsername(), \"eclipse\");\n    assertEquals(githubUrl.getRepository(), \"che\");\n    assertEquals(githubUrl.getBranch(), \"main\");\n  }\n\n  @Test\n  public void checkPullRequestFromForkedRepositoryWithoutAuthentication() throws Exception {\n    String url = \"https://github.com/eclipse/che/pull/21276\";\n\n    GithubPullRequest pr =\n        new GithubPullRequest()\n            .withState(\"open\")\n            .withHead(\n                new GithubHead()\n                    .withRef(\"pr-main-to-7.46.0-SNAPSHOT\")\n                    .withUser(new GithubUser().withId(0).withName(\"eclipse\").withLogin(\"eclipse\"))\n                    .withRepo(new GithubRepo().withName(\"che\")));\n\n    when(githubApiClient.isConnected(eq(\"https://github.com\"))).thenReturn(true);\n    when(githubApiClient.getPullRequest(any(), any(), any(), any())).thenReturn(pr);\n\n    GithubUrl githubUrl = githubUrlParser.parseWithoutAuthentication(url, null);\n\n    assertEquals(githubUrl.getUsername(), \"eclipse\");\n    assertEquals(githubUrl.getRepository(), \"che\");\n    assertEquals(githubUrl.getBranch(), \"pr-main-to-7.46.0-SNAPSHOT\");\n\n    verify(personalAccessTokenManager, never()).fetchAndSave(any(Subject.class), anyString());\n  }\n\n  /** Check Pull Request is failing with Merged state */\n  @Test(\n      expectedExceptions = IllegalArgumentException.class,\n      expectedExceptionsMessageRegExp = \".*found merged.*\")\n  public void checkPullRequestMergedState() throws Exception {\n    PersonalAccessToken personalAccessToken = mock(PersonalAccessToken.class);\n    GithubPullRequest githubPullRequest = mock(GithubPullRequest.class);\n    when(githubPullRequest.getState()).thenReturn(\"merged\");\n    when(personalAccessToken.getToken()).thenReturn(\"token\");\n    when(personalAccessTokenManager.get(any(Subject.class), eq(null), anyString(), eq(null)))\n        .thenReturn(Optional.of(personalAccessToken));\n    when(githubApiClient.isConnected(eq(\"https://github.com\"))).thenReturn(true);\n    when(githubApiClient.getPullRequest(anyString(), anyString(), anyString(), anyString()))\n        .thenReturn(githubPullRequest);\n\n    String url = \"https://github.com/eclipse/che/pull/11103\";\n    githubUrlParser.parse(url, null);\n  }\n\n  @Test\n  public void shouldParseServerUr() throws Exception {\n    // given\n    String url = \"https://github-server.com/user/repo\";\n\n    // when\n    GithubUrl githubUrl = githubUrlParser.parse(url, null);\n\n    // then\n    assertEquals(githubUrl.getUsername(), \"user\");\n    assertEquals(githubUrl.getRepository(), \"repo\");\n    assertEquals(githubUrl.getHostName(), \"https://github-server.com\");\n  }\n\n  @Test\n  public void shouldParseServerUrWithPullRequestId() throws Exception {\n    // given\n    String url = \"https://github-server.com/user/repo/pull/11103\";\n    GithubPullRequest pr =\n        new GithubPullRequest()\n            .withState(\"open\")\n            .withHead(\n                new GithubHead()\n                    .withUser(new GithubUser().withId(0).withName(\"eclipse\").withLogin(\"eclipse\"))\n                    .withRepo(new GithubRepo().withName(\"che\")));\n    when(githubApiClient.isConnected(eq(\"https://github-server.com\"))).thenReturn(true);\n    when(githubApiClient.getPullRequest(any(), any(), any(), any())).thenReturn(pr);\n\n    // when\n    githubUrlParser.parse(url, null);\n\n    // then\n    verify(personalAccessTokenManager, times(2))\n        .get(any(Subject.class), eq(null), eq(\"https://github-server.com\"), eq(null));\n  }\n\n  @Test\n  public void shouldValidateOldVersionGitHubServerUrl() throws Exception {\n    // given\n    Field endpoint = AbstractGithubURLParser.class.getDeclaredField(\"endpoint\");\n    endpoint.setAccessible(true);\n    endpoint.set(githubUrlParser, wireMockServer.baseUrl());\n    String url = wireMockServer.url(\"/user/repo\");\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .willReturn(\n                aResponse()\n                    .withStatus(HTTP_UNAUTHORIZED)\n                    .withBody(\"{\\\"message\\\": \\\"Must authenticate to access this API.\\\",\\n}\")));\n\n    // when\n    boolean valid = githubUrlParser.isValid(url);\n\n    // then\n    assertTrue(valid);\n  }\n\n  @Test\n  public void shouldValidateGitHubServerUrl() throws Exception {\n    // given\n    Field endpoint = AbstractGithubURLParser.class.getDeclaredField(\"endpoint\");\n    endpoint.setAccessible(true);\n    endpoint.set(githubUrlParser, wireMockServer.baseUrl());\n    String url = wireMockServer.url(\"/user/repo\");\n    stubFor(\n        get(urlEqualTo(\"/api/v3/user\"))\n            .willReturn(\n                aResponse()\n                    .withStatus(HTTP_UNAUTHORIZED)\n                    .withBody(\"{\\\"message\\\": \\\"Requires authentication\\\",\\n}\")));\n\n    // when\n    boolean valid = githubUrlParser.isValid(url);\n\n    // then\n    assertTrue(valid);\n  }\n\n  @Test\n  public void shouldNotRequestGitHubSAASUrl() throws Exception {\n    // when\n    githubUrlParser.isValid(\"https:github.com/repo/user.git\");\n\n    // then\n    verify(githubApiClient, never()).getUser(anyString());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubUrlTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.Arrays;\nimport java.util.Iterator;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl.DevfileLocation;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Test of {@Link GithubUrl} Note: The parser is also testing the object\n *\n * @author Florent Benoit\n */\n@Listeners(MockitoTestNGListener.class)\npublic class GithubUrlTest {\n\n  @Mock private GithubApiClient githubApiClient;\n\n  /** Check when there is devfile in the repository */\n  @Test\n  public void checkDevfileLocation() throws Exception {\n    DevfileFilenamesProvider devfileFilenamesProvider = mock(DevfileFilenamesProvider.class);\n    when(githubApiClient.isConnected(\"https://github.com\")).thenReturn(true);\n\n    /** Parser used to create the url. */\n    GithubURLParser githubUrlParser =\n        new GithubURLParser(\n            mock(PersonalAccessTokenManager.class),\n            devfileFilenamesProvider,\n            githubApiClient,\n            null,\n            false);\n\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n\n    GithubUrl githubUrl = githubUrlParser.parse(\"https://github.com/eclipse/che\", null);\n\n    assertEquals(githubUrl.devfileFileLocations().size(), 2);\n    Iterator<DevfileLocation> iterator = githubUrl.devfileFileLocations().iterator();\n    assertEquals(\n        iterator.next().location(),\n        \"https://raw.githubusercontent.com/eclipse/che/HEAD/devfile.yaml\");\n\n    assertEquals(\n        iterator.next().location(), \"https://raw.githubusercontent.com/eclipse/che/HEAD/foo.bar\");\n  }\n\n  @Test\n  public void shouldReturnDevfileLocationFromSSHUrl() throws Exception {\n    DevfileFilenamesProvider devfileFilenamesProvider = mock(DevfileFilenamesProvider.class);\n    when(githubApiClient.isConnected(\"https://github.com\")).thenReturn(true);\n\n    /** Parser used to create the url. */\n    GithubURLParser githubUrlParser =\n        new GithubURLParser(\n            mock(PersonalAccessTokenManager.class),\n            devfileFilenamesProvider,\n            githubApiClient,\n            null,\n            false);\n\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n\n    GithubUrl githubUrl = githubUrlParser.parse(\"git@github.com:eclipse/che\", null);\n\n    assertEquals(githubUrl.devfileFileLocations().size(), 2);\n    Iterator<DevfileLocation> iterator = githubUrl.devfileFileLocations().iterator();\n    assertEquals(\n        iterator.next().location(),\n        \"https://raw.githubusercontent.com/eclipse/che/HEAD/devfile.yaml\");\n\n    assertEquals(\n        iterator.next().location(), \"https://raw.githubusercontent.com/eclipse/che/HEAD/foo.bar\");\n  }\n\n  /** Check the original repository */\n  @Test\n  public void checkRepositoryLocation() throws Exception {\n    DevfileFilenamesProvider devfileFilenamesProvider = mock(DevfileFilenamesProvider.class);\n\n    /** Parser used to create the url. */\n    GithubURLParser githubUrlParser =\n        new GithubURLParser(\n            mock(PersonalAccessTokenManager.class),\n            devfileFilenamesProvider,\n            githubApiClient,\n            null,\n            false);\n\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n\n    GithubUrl githubUrl = githubUrlParser.parse(\"https://github.com/eclipse/che\", null);\n\n    assertEquals(githubUrl.repositoryLocation(), \"https://github.com/eclipse/che.git\");\n  }\n\n  @Test\n  public void shouldReturnRepositoryLocationFromSSHUrl() throws Exception {\n    DevfileFilenamesProvider devfileFilenamesProvider = mock(DevfileFilenamesProvider.class);\n\n    /** Parser used to create the url. */\n    GithubURLParser githubUrlParser =\n        new GithubURLParser(\n            mock(PersonalAccessTokenManager.class),\n            devfileFilenamesProvider,\n            githubApiClient,\n            null,\n            false);\n\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n\n    GithubUrl githubUrl = githubUrlParser.parse(\"git@github.com:eclipse/che.git\", null);\n\n    assertEquals(githubUrl.repositoryLocation(), \"git@github.com:eclipse/che.git\");\n  }\n\n  @Test\n  public void testRawFileLocationWithDefaultBranchName() {\n    String file = \".che/che-theia-plugins.yaml\";\n\n    GithubUrl url =\n        new GithubUrl(\"github\")\n            .withUsername(\"eclipse\")\n            .withRepository(\"che\")\n            .withServerUrl(\"https://github.com\");\n\n    assertEquals(\n        url.rawFileLocation(file),\n        \"https://raw.githubusercontent.com/eclipse/che/HEAD/.che/che-theia-plugins.yaml\");\n  }\n\n  @Test\n  public void testRawFileLocationWithCustomBranchName() {\n    String file = \".che/che-theia-plugins.yaml\";\n\n    GithubUrl url =\n        new GithubUrl(\"github\")\n            .withUsername(\"eclipse\")\n            .withRepository(\"che\")\n            .withBranch(\"main\")\n            .withServerUrl(\"https://github.com\");\n\n    assertEquals(\n        url.rawFileLocation(file),\n        \"https://raw.githubusercontent.com/eclipse/che/main/.che/che-theia-plugins.yaml\");\n  }\n\n  @Test\n  public void testRawFileLocationForCommit() {\n    String file = \".che/che-theia-plugins.yaml\";\n\n    GithubUrl url =\n        new GithubUrl(\"github\")\n            .withUsername(\"eclipse\")\n            .withRepository(\"che\")\n            .withServerUrl(\"https://github.com\")\n            .withBranch(\"main\")\n            .withLatestCommit(\"c24fd44e0f7296be2e49a380fb8abe2fe4db9100\");\n\n    assertEquals(\n        url.rawFileLocation(file),\n        \"https://raw.githubusercontent.com/eclipse/che/c24fd44e0f7296be2e49a380fb8abe2fe4db9100/.che/che-theia-plugins.yaml\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/test/resources/__files/github/rest/pullRequest/response.json",
    "content": "{\n  \"url\": \"https://api.github.com/repos/octocat/Hello-World/pulls/1347\",\n  \"id\": 1,\n  \"node_id\": \"MDExOlB1bGxSZXF1ZXN0MQ==\",\n  \"html_url\": \"https://github.com/octocat/Hello-World/pull/1347\",\n  \"diff_url\": \"https://github.com/octocat/Hello-World/pull/1347.diff\",\n  \"patch_url\": \"https://github.com/octocat/Hello-World/pull/1347.patch\",\n  \"issue_url\": \"https://api.github.com/repos/octocat/Hello-World/issues/1347\",\n  \"commits_url\": \"https://api.github.com/repos/octocat/Hello-World/pulls/1347/commits\",\n  \"review_comments_url\": \"https://api.github.com/repos/octocat/Hello-World/pulls/1347/comments\",\n  \"review_comment_url\": \"https://api.github.com/repos/octocat/Hello-World/pulls/comments{/number}\",\n  \"comments_url\": \"https://api.github.com/repos/octocat/Hello-World/issues/1347/comments\",\n  \"statuses_url\": \"https://api.github.com/repos/octocat/Hello-World/statuses/6dcb09b5b57875f334f61aebed695e2e4193db5e\",\n  \"number\": 1347,\n  \"state\": \"open\",\n  \"locked\": true,\n  \"title\": \"Amazing new feature\",\n  \"user\": {\n    \"login\": \"octocat\",\n    \"id\": 1,\n    \"node_id\": \"MDQ6VXNlcjE=\",\n    \"avatar_url\": \"https://github.com/images/error/octocat_happy.gif\",\n    \"gravatar_id\": \"\",\n    \"url\": \"https://api.github.com/users/octocat\",\n    \"html_url\": \"https://github.com/octocat\",\n    \"followers_url\": \"https://api.github.com/users/octocat/followers\",\n    \"following_url\": \"https://api.github.com/users/octocat/following{/other_user}\",\n    \"gists_url\": \"https://api.github.com/users/octocat/gists{/gist_id}\",\n    \"starred_url\": \"https://api.github.com/users/octocat/starred{/owner}{/repo}\",\n    \"subscriptions_url\": \"https://api.github.com/users/octocat/subscriptions\",\n    \"organizations_url\": \"https://api.github.com/users/octocat/orgs\",\n    \"repos_url\": \"https://api.github.com/users/octocat/repos\",\n    \"events_url\": \"https://api.github.com/users/octocat/events{/privacy}\",\n    \"received_events_url\": \"https://api.github.com/users/octocat/received_events\",\n    \"type\": \"User\",\n    \"site_admin\": false\n  },\n  \"body\": \"Please pull these awesome changes in!\",\n  \"labels\": [\n    {\n      \"id\": 208045946,\n      \"node_id\": \"MDU6TGFiZWwyMDgwNDU5NDY=\",\n      \"url\": \"https://api.github.com/repos/octocat/Hello-World/labels/bug\",\n      \"name\": \"bug\",\n      \"description\": \"Something isn't working\",\n      \"color\": \"f29513\",\n      \"default\": true\n    }\n  ],\n  \"milestone\": {\n    \"url\": \"https://api.github.com/repos/octocat/Hello-World/milestones/1\",\n    \"html_url\": \"https://github.com/octocat/Hello-World/milestones/v1.0\",\n    \"labels_url\": \"https://api.github.com/repos/octocat/Hello-World/milestones/1/labels\",\n    \"id\": 1002604,\n    \"node_id\": \"MDk6TWlsZXN0b25lMTAwMjYwNA==\",\n    \"number\": 1,\n    \"state\": \"open\",\n    \"title\": \"v1.0\",\n    \"description\": \"Tracking milestone for version 1.0\",\n    \"creator\": {\n      \"login\": \"octocat\",\n      \"id\": 1,\n      \"node_id\": \"MDQ6VXNlcjE=\",\n      \"avatar_url\": \"https://github.com/images/error/octocat_happy.gif\",\n      \"gravatar_id\": \"\",\n      \"url\": \"https://api.github.com/users/octocat\",\n      \"html_url\": \"https://github.com/octocat\",\n      \"followers_url\": \"https://api.github.com/users/octocat/followers\",\n      \"following_url\": \"https://api.github.com/users/octocat/following{/other_user}\",\n      \"gists_url\": \"https://api.github.com/users/octocat/gists{/gist_id}\",\n      \"starred_url\": \"https://api.github.com/users/octocat/starred{/owner}{/repo}\",\n      \"subscriptions_url\": \"https://api.github.com/users/octocat/subscriptions\",\n      \"organizations_url\": \"https://api.github.com/users/octocat/orgs\",\n      \"repos_url\": \"https://api.github.com/users/octocat/repos\",\n      \"events_url\": \"https://api.github.com/users/octocat/events{/privacy}\",\n      \"received_events_url\": \"https://api.github.com/users/octocat/received_events\",\n      \"type\": \"User\",\n      \"site_admin\": false\n    },\n    \"open_issues\": 4,\n    \"closed_issues\": 8,\n    \"created_at\": \"2011-04-10T20:09:31Z\",\n    \"updated_at\": \"2014-03-03T18:58:10Z\",\n    \"closed_at\": \"2013-02-12T13:22:01Z\",\n    \"due_on\": \"2012-10-09T23:39:01Z\"\n  },\n  \"active_lock_reason\": \"too heated\",\n  \"created_at\": \"2011-01-26T19:01:12Z\",\n  \"updated_at\": \"2011-01-26T19:01:12Z\",\n  \"closed_at\": \"2011-01-26T19:01:12Z\",\n  \"merged_at\": \"2011-01-26T19:01:12Z\",\n  \"merge_commit_sha\": \"e5bd3914e2e596debea16f433f57875b5b90bcd6\",\n  \"assignee\": {\n    \"login\": \"octocat\",\n    \"id\": 1,\n    \"node_id\": \"MDQ6VXNlcjE=\",\n    \"avatar_url\": \"https://github.com/images/error/octocat_happy.gif\",\n    \"gravatar_id\": \"\",\n    \"url\": \"https://api.github.com/users/octocat\",\n    \"html_url\": \"https://github.com/octocat\",\n    \"followers_url\": \"https://api.github.com/users/octocat/followers\",\n    \"following_url\": \"https://api.github.com/users/octocat/following{/other_user}\",\n    \"gists_url\": \"https://api.github.com/users/octocat/gists{/gist_id}\",\n    \"starred_url\": \"https://api.github.com/users/octocat/starred{/owner}{/repo}\",\n    \"subscriptions_url\": \"https://api.github.com/users/octocat/subscriptions\",\n    \"organizations_url\": \"https://api.github.com/users/octocat/orgs\",\n    \"repos_url\": \"https://api.github.com/users/octocat/repos\",\n    \"events_url\": \"https://api.github.com/users/octocat/events{/privacy}\",\n    \"received_events_url\": \"https://api.github.com/users/octocat/received_events\",\n    \"type\": \"User\",\n    \"site_admin\": false\n  },\n  \"assignees\": [\n    {\n      \"login\": \"octocat\",\n      \"id\": 1,\n      \"node_id\": \"MDQ6VXNlcjE=\",\n      \"avatar_url\": \"https://github.com/images/error/octocat_happy.gif\",\n      \"gravatar_id\": \"\",\n      \"url\": \"https://api.github.com/users/octocat\",\n      \"html_url\": \"https://github.com/octocat\",\n      \"followers_url\": \"https://api.github.com/users/octocat/followers\",\n      \"following_url\": \"https://api.github.com/users/octocat/following{/other_user}\",\n      \"gists_url\": \"https://api.github.com/users/octocat/gists{/gist_id}\",\n      \"starred_url\": \"https://api.github.com/users/octocat/starred{/owner}{/repo}\",\n      \"subscriptions_url\": \"https://api.github.com/users/octocat/subscriptions\",\n      \"organizations_url\": \"https://api.github.com/users/octocat/orgs\",\n      \"repos_url\": \"https://api.github.com/users/octocat/repos\",\n      \"events_url\": \"https://api.github.com/users/octocat/events{/privacy}\",\n      \"received_events_url\": \"https://api.github.com/users/octocat/received_events\",\n      \"type\": \"User\",\n      \"site_admin\": false\n    },\n    {\n      \"login\": \"hubot\",\n      \"id\": 1,\n      \"node_id\": \"MDQ6VXNlcjE=\",\n      \"avatar_url\": \"https://github.com/images/error/hubot_happy.gif\",\n      \"gravatar_id\": \"\",\n      \"url\": \"https://api.github.com/users/hubot\",\n      \"html_url\": \"https://github.com/hubot\",\n      \"followers_url\": \"https://api.github.com/users/hubot/followers\",\n      \"following_url\": \"https://api.github.com/users/hubot/following{/other_user}\",\n      \"gists_url\": \"https://api.github.com/users/hubot/gists{/gist_id}\",\n      \"starred_url\": \"https://api.github.com/users/hubot/starred{/owner}{/repo}\",\n      \"subscriptions_url\": \"https://api.github.com/users/hubot/subscriptions\",\n      \"organizations_url\": \"https://api.github.com/users/hubot/orgs\",\n      \"repos_url\": \"https://api.github.com/users/hubot/repos\",\n      \"events_url\": \"https://api.github.com/users/hubot/events{/privacy}\",\n      \"received_events_url\": \"https://api.github.com/users/hubot/received_events\",\n      \"type\": \"User\",\n      \"site_admin\": true\n    }\n  ],\n  \"requested_reviewers\": [\n    {\n      \"login\": \"other_user\",\n      \"id\": 1,\n      \"node_id\": \"MDQ6VXNlcjE=\",\n      \"avatar_url\": \"https://github.com/images/error/other_user_happy.gif\",\n      \"gravatar_id\": \"\",\n      \"url\": \"https://api.github.com/users/other_user\",\n      \"html_url\": \"https://github.com/other_user\",\n      \"followers_url\": \"https://api.github.com/users/other_user/followers\",\n      \"following_url\": \"https://api.github.com/users/other_user/following{/other_user}\",\n      \"gists_url\": \"https://api.github.com/users/other_user/gists{/gist_id}\",\n      \"starred_url\": \"https://api.github.com/users/other_user/starred{/owner}{/repo}\",\n      \"subscriptions_url\": \"https://api.github.com/users/other_user/subscriptions\",\n      \"organizations_url\": \"https://api.github.com/users/other_user/orgs\",\n      \"repos_url\": \"https://api.github.com/users/other_user/repos\",\n      \"events_url\": \"https://api.github.com/users/other_user/events{/privacy}\",\n      \"received_events_url\": \"https://api.github.com/users/other_user/received_events\",\n      \"type\": \"User\",\n      \"site_admin\": false\n    }\n  ],\n  \"requested_teams\": [\n    {\n      \"id\": 1,\n      \"node_id\": \"MDQ6VGVhbTE=\",\n      \"url\": \"https://api.github.com/teams/1\",\n      \"html_url\": \"https://github.com/orgs/github/teams/justice-league\",\n      \"name\": \"Justice League\",\n      \"slug\": \"justice-league\",\n      \"description\": \"A great team.\",\n      \"privacy\": \"closed\",\n      \"permission\": \"admin\",\n      \"members_url\": \"https://api.github.com/teams/1/members{/member}\",\n      \"repositories_url\": \"https://api.github.com/teams/1/repos\"\n    }\n  ],\n  \"head\": {\n    \"label\": \"octocat:new-topic\",\n    \"ref\": \"new-topic\",\n    \"sha\": \"6dcb09b5b57875f334f61aebed695e2e4193db5e\",\n    \"user\": {\n      \"login\": \"octocat\",\n      \"id\": 1,\n      \"node_id\": \"MDQ6VXNlcjE=\",\n      \"avatar_url\": \"https://github.com/images/error/octocat_happy.gif\",\n      \"gravatar_id\": \"\",\n      \"url\": \"https://api.github.com/users/octocat\",\n      \"html_url\": \"https://github.com/octocat\",\n      \"followers_url\": \"https://api.github.com/users/octocat/followers\",\n      \"following_url\": \"https://api.github.com/users/octocat/following{/other_user}\",\n      \"gists_url\": \"https://api.github.com/users/octocat/gists{/gist_id}\",\n      \"starred_url\": \"https://api.github.com/users/octocat/starred{/owner}{/repo}\",\n      \"subscriptions_url\": \"https://api.github.com/users/octocat/subscriptions\",\n      \"organizations_url\": \"https://api.github.com/users/octocat/orgs\",\n      \"repos_url\": \"https://api.github.com/users/octocat/repos\",\n      \"events_url\": \"https://api.github.com/users/octocat/events{/privacy}\",\n      \"received_events_url\": \"https://api.github.com/users/octocat/received_events\",\n      \"type\": \"User\",\n      \"site_admin\": false\n    },\n    \"repo\": {\n      \"id\": 1296269,\n      \"node_id\": \"MDEwOlJlcG9zaXRvcnkxMjk2MjY5\",\n      \"name\": \"Hello-World\",\n      \"full_name\": \"octocat/Hello-World\",\n      \"owner\": {\n        \"login\": \"octocat\",\n        \"id\": 1,\n        \"node_id\": \"MDQ6VXNlcjE=\",\n        \"avatar_url\": \"https://github.com/images/error/octocat_happy.gif\",\n        \"gravatar_id\": \"\",\n        \"url\": \"https://api.github.com/users/octocat\",\n        \"html_url\": \"https://github.com/octocat\",\n        \"followers_url\": \"https://api.github.com/users/octocat/followers\",\n        \"following_url\": \"https://api.github.com/users/octocat/following{/other_user}\",\n        \"gists_url\": \"https://api.github.com/users/octocat/gists{/gist_id}\",\n        \"starred_url\": \"https://api.github.com/users/octocat/starred{/owner}{/repo}\",\n        \"subscriptions_url\": \"https://api.github.com/users/octocat/subscriptions\",\n        \"organizations_url\": \"https://api.github.com/users/octocat/orgs\",\n        \"repos_url\": \"https://api.github.com/users/octocat/repos\",\n        \"events_url\": \"https://api.github.com/users/octocat/events{/privacy}\",\n        \"received_events_url\": \"https://api.github.com/users/octocat/received_events\",\n        \"type\": \"User\",\n        \"site_admin\": false\n      },\n      \"private\": false,\n      \"html_url\": \"https://github.com/octocat/Hello-World\",\n      \"description\": \"This your first repo!\",\n      \"fork\": false,\n      \"url\": \"https://api.github.com/repos/octocat/Hello-World\",\n      \"archive_url\": \"https://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}\",\n      \"assignees_url\": \"https://api.github.com/repos/octocat/Hello-World/assignees{/user}\",\n      \"blobs_url\": \"https://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}\",\n      \"branches_url\": \"https://api.github.com/repos/octocat/Hello-World/branches{/branch}\",\n      \"collaborators_url\": \"https://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}\",\n      \"comments_url\": \"https://api.github.com/repos/octocat/Hello-World/comments{/number}\",\n      \"commits_url\": \"https://api.github.com/repos/octocat/Hello-World/commits{/sha}\",\n      \"compare_url\": \"https://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}\",\n      \"contents_url\": \"https://api.github.com/repos/octocat/Hello-World/contents/{+path}\",\n      \"contributors_url\": \"https://api.github.com/repos/octocat/Hello-World/contributors\",\n      \"deployments_url\": \"https://api.github.com/repos/octocat/Hello-World/deployments\",\n      \"downloads_url\": \"https://api.github.com/repos/octocat/Hello-World/downloads\",\n      \"events_url\": \"https://api.github.com/repos/octocat/Hello-World/events\",\n      \"forks_url\": \"https://api.github.com/repos/octocat/Hello-World/forks\",\n      \"git_commits_url\": \"https://api.github.com/repos/octocat/Hello-World/git/commits{/sha}\",\n      \"git_refs_url\": \"https://api.github.com/repos/octocat/Hello-World/git/refs{/sha}\",\n      \"git_tags_url\": \"https://api.github.com/repos/octocat/Hello-World/git/tags{/sha}\",\n      \"git_url\": \"git:github.com/octocat/Hello-World.git\",\n      \"issue_comment_url\": \"https://api.github.com/repos/octocat/Hello-World/issues/comments{/number}\",\n      \"issue_events_url\": \"https://api.github.com/repos/octocat/Hello-World/issues/events{/number}\",\n      \"issues_url\": \"https://api.github.com/repos/octocat/Hello-World/issues{/number}\",\n      \"keys_url\": \"https://api.github.com/repos/octocat/Hello-World/keys{/key_id}\",\n      \"labels_url\": \"https://api.github.com/repos/octocat/Hello-World/labels{/name}\",\n      \"languages_url\": \"https://api.github.com/repos/octocat/Hello-World/languages\",\n      \"merges_url\": \"https://api.github.com/repos/octocat/Hello-World/merges\",\n      \"milestones_url\": \"https://api.github.com/repos/octocat/Hello-World/milestones{/number}\",\n      \"notifications_url\": \"https://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}\",\n      \"pulls_url\": \"https://api.github.com/repos/octocat/Hello-World/pulls{/number}\",\n      \"releases_url\": \"https://api.github.com/repos/octocat/Hello-World/releases{/id}\",\n      \"ssh_url\": \"git@github.com:octocat/Hello-World.git\",\n      \"stargazers_url\": \"https://api.github.com/repos/octocat/Hello-World/stargazers\",\n      \"statuses_url\": \"https://api.github.com/repos/octocat/Hello-World/statuses/{sha}\",\n      \"subscribers_url\": \"https://api.github.com/repos/octocat/Hello-World/subscribers\",\n      \"subscription_url\": \"https://api.github.com/repos/octocat/Hello-World/subscription\",\n      \"tags_url\": \"https://api.github.com/repos/octocat/Hello-World/tags\",\n      \"teams_url\": \"https://api.github.com/repos/octocat/Hello-World/teams\",\n      \"trees_url\": \"https://api.github.com/repos/octocat/Hello-World/git/trees{/sha}\",\n      \"clone_url\": \"https://github.com/octocat/Hello-World.git\",\n      \"mirror_url\": \"git:git.example.com/octocat/Hello-World\",\n      \"hooks_url\": \"https://api.github.com/repos/octocat/Hello-World/hooks\",\n      \"svn_url\": \"https://svn.github.com/octocat/Hello-World\",\n      \"homepage\": \"https://github.com\",\n      \"language\": null,\n      \"forks_count\": 9,\n      \"stargazers_count\": 80,\n      \"watchers_count\": 80,\n      \"size\": 108,\n      \"default_branch\": \"master\",\n      \"open_issues_count\": 0,\n      \"topics\": [\n        \"octocat\",\n        \"atom\",\n        \"electron\",\n        \"api\"\n      ],\n      \"has_issues\": true,\n      \"has_projects\": true,\n      \"has_wiki\": true,\n      \"has_pages\": false,\n      \"has_downloads\": true,\n      \"archived\": false,\n      \"disabled\": false,\n      \"pushed_at\": \"2011-01-26T19:06:43Z\",\n      \"created_at\": \"2011-01-26T19:01:12Z\",\n      \"updated_at\": \"2011-01-26T19:14:43Z\",\n      \"permissions\": {\n        \"admin\": false,\n        \"push\": false,\n        \"pull\": true\n      },\n      \"allow_rebase_merge\": true,\n      \"temp_clone_token\": \"ABTLWHOULUVAXGTRYU7OC2876QJ2O\",\n      \"allow_squash_merge\": true,\n      \"allow_merge_commit\": true,\n      \"allow_forking\": true,\n      \"forks\": 123,\n      \"open_issues\": 123,\n      \"license\": {\n        \"key\": \"mit\",\n        \"name\": \"MIT License\",\n        \"url\": \"https://api.github.com/licenses/mit\",\n        \"spdx_id\": \"MIT\",\n        \"node_id\": \"MDc6TGljZW5zZW1pdA==\"\n      },\n      \"watchers\": 123\n    }\n  },\n  \"base\": {\n    \"label\": \"octocat:master\",\n    \"ref\": \"master\",\n    \"sha\": \"6dcb09b5b57875f334f61aebed695e2e4193db5e\",\n    \"user\": {\n      \"login\": \"octocat\",\n      \"id\": 1,\n      \"node_id\": \"MDQ6VXNlcjE=\",\n      \"avatar_url\": \"https://github.com/images/error/octocat_happy.gif\",\n      \"gravatar_id\": \"\",\n      \"url\": \"https://api.github.com/users/octocat\",\n      \"html_url\": \"https://github.com/octocat\",\n      \"followers_url\": \"https://api.github.com/users/octocat/followers\",\n      \"following_url\": \"https://api.github.com/users/octocat/following{/other_user}\",\n      \"gists_url\": \"https://api.github.com/users/octocat/gists{/gist_id}\",\n      \"starred_url\": \"https://api.github.com/users/octocat/starred{/owner}{/repo}\",\n      \"subscriptions_url\": \"https://api.github.com/users/octocat/subscriptions\",\n      \"organizations_url\": \"https://api.github.com/users/octocat/orgs\",\n      \"repos_url\": \"https://api.github.com/users/octocat/repos\",\n      \"events_url\": \"https://api.github.com/users/octocat/events{/privacy}\",\n      \"received_events_url\": \"https://api.github.com/users/octocat/received_events\",\n      \"type\": \"User\",\n      \"site_admin\": false\n    },\n    \"repo\": {\n      \"id\": 1296269,\n      \"node_id\": \"MDEwOlJlcG9zaXRvcnkxMjk2MjY5\",\n      \"name\": \"Hello-World\",\n      \"full_name\": \"octocat/Hello-World\",\n      \"owner\": {\n        \"login\": \"octocat\",\n        \"id\": 1,\n        \"node_id\": \"MDQ6VXNlcjE=\",\n        \"avatar_url\": \"https://github.com/images/error/octocat_happy.gif\",\n        \"gravatar_id\": \"\",\n        \"url\": \"https://api.github.com/users/octocat\",\n        \"html_url\": \"https://github.com/octocat\",\n        \"followers_url\": \"https://api.github.com/users/octocat/followers\",\n        \"following_url\": \"https://api.github.com/users/octocat/following{/other_user}\",\n        \"gists_url\": \"https://api.github.com/users/octocat/gists{/gist_id}\",\n        \"starred_url\": \"https://api.github.com/users/octocat/starred{/owner}{/repo}\",\n        \"subscriptions_url\": \"https://api.github.com/users/octocat/subscriptions\",\n        \"organizations_url\": \"https://api.github.com/users/octocat/orgs\",\n        \"repos_url\": \"https://api.github.com/users/octocat/repos\",\n        \"events_url\": \"https://api.github.com/users/octocat/events{/privacy}\",\n        \"received_events_url\": \"https://api.github.com/users/octocat/received_events\",\n        \"type\": \"User\",\n        \"site_admin\": false\n      },\n      \"private\": false,\n      \"html_url\": \"https://github.com/octocat/Hello-World\",\n      \"description\": \"This your first repo!\",\n      \"fork\": false,\n      \"url\": \"https://api.github.com/repos/octocat/Hello-World\",\n      \"archive_url\": \"https://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}\",\n      \"assignees_url\": \"https://api.github.com/repos/octocat/Hello-World/assignees{/user}\",\n      \"blobs_url\": \"https://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}\",\n      \"branches_url\": \"https://api.github.com/repos/octocat/Hello-World/branches{/branch}\",\n      \"collaborators_url\": \"https://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}\",\n      \"comments_url\": \"https://api.github.com/repos/octocat/Hello-World/comments{/number}\",\n      \"commits_url\": \"https://api.github.com/repos/octocat/Hello-World/commits{/sha}\",\n      \"compare_url\": \"https://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}\",\n      \"contents_url\": \"https://api.github.com/repos/octocat/Hello-World/contents/{+path}\",\n      \"contributors_url\": \"https://api.github.com/repos/octocat/Hello-World/contributors\",\n      \"deployments_url\": \"https://api.github.com/repos/octocat/Hello-World/deployments\",\n      \"downloads_url\": \"https://api.github.com/repos/octocat/Hello-World/downloads\",\n      \"events_url\": \"https://api.github.com/repos/octocat/Hello-World/events\",\n      \"forks_url\": \"https://api.github.com/repos/octocat/Hello-World/forks\",\n      \"git_commits_url\": \"https://api.github.com/repos/octocat/Hello-World/git/commits{/sha}\",\n      \"git_refs_url\": \"https://api.github.com/repos/octocat/Hello-World/git/refs{/sha}\",\n      \"git_tags_url\": \"https://api.github.com/repos/octocat/Hello-World/git/tags{/sha}\",\n      \"git_url\": \"git:github.com/octocat/Hello-World.git\",\n      \"issue_comment_url\": \"https://api.github.com/repos/octocat/Hello-World/issues/comments{/number}\",\n      \"issue_events_url\": \"https://api.github.com/repos/octocat/Hello-World/issues/events{/number}\",\n      \"issues_url\": \"https://api.github.com/repos/octocat/Hello-World/issues{/number}\",\n      \"keys_url\": \"https://api.github.com/repos/octocat/Hello-World/keys{/key_id}\",\n      \"labels_url\": \"https://api.github.com/repos/octocat/Hello-World/labels{/name}\",\n      \"languages_url\": \"https://api.github.com/repos/octocat/Hello-World/languages\",\n      \"merges_url\": \"https://api.github.com/repos/octocat/Hello-World/merges\",\n      \"milestones_url\": \"https://api.github.com/repos/octocat/Hello-World/milestones{/number}\",\n      \"notifications_url\": \"https://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}\",\n      \"pulls_url\": \"https://api.github.com/repos/octocat/Hello-World/pulls{/number}\",\n      \"releases_url\": \"https://api.github.com/repos/octocat/Hello-World/releases{/id}\",\n      \"ssh_url\": \"git@github.com:octocat/Hello-World.git\",\n      \"stargazers_url\": \"https://api.github.com/repos/octocat/Hello-World/stargazers\",\n      \"statuses_url\": \"https://api.github.com/repos/octocat/Hello-World/statuses/{sha}\",\n      \"subscribers_url\": \"https://api.github.com/repos/octocat/Hello-World/subscribers\",\n      \"subscription_url\": \"https://api.github.com/repos/octocat/Hello-World/subscription\",\n      \"tags_url\": \"https://api.github.com/repos/octocat/Hello-World/tags\",\n      \"teams_url\": \"https://api.github.com/repos/octocat/Hello-World/teams\",\n      \"trees_url\": \"https://api.github.com/repos/octocat/Hello-World/git/trees{/sha}\",\n      \"clone_url\": \"https://github.com/octocat/Hello-World.git\",\n      \"mirror_url\": \"git:git.example.com/octocat/Hello-World\",\n      \"hooks_url\": \"https://api.github.com/repos/octocat/Hello-World/hooks\",\n      \"svn_url\": \"https://svn.github.com/octocat/Hello-World\",\n      \"homepage\": \"https://github.com\",\n      \"language\": null,\n      \"forks_count\": 9,\n      \"stargazers_count\": 80,\n      \"watchers_count\": 80,\n      \"size\": 108,\n      \"default_branch\": \"master\",\n      \"open_issues_count\": 0,\n      \"topics\": [\n        \"octocat\",\n        \"atom\",\n        \"electron\",\n        \"api\"\n      ],\n      \"has_issues\": true,\n      \"has_projects\": true,\n      \"has_wiki\": true,\n      \"has_pages\": false,\n      \"has_downloads\": true,\n      \"archived\": false,\n      \"disabled\": false,\n      \"pushed_at\": \"2011-01-26T19:06:43Z\",\n      \"created_at\": \"2011-01-26T19:01:12Z\",\n      \"updated_at\": \"2011-01-26T19:14:43Z\",\n      \"permissions\": {\n        \"admin\": false,\n        \"push\": false,\n        \"pull\": true\n      },\n      \"allow_rebase_merge\": true,\n      \"temp_clone_token\": \"ABTLWHOULUVAXGTRYU7OC2876QJ2O\",\n      \"allow_squash_merge\": true,\n      \"allow_merge_commit\": true,\n      \"forks\": 123,\n      \"open_issues\": 123,\n      \"license\": {\n        \"key\": \"mit\",\n        \"name\": \"MIT License\",\n        \"url\": \"https://api.github.com/licenses/mit\",\n        \"spdx_id\": \"MIT\",\n        \"node_id\": \"MDc6TGljZW5zZW1pdA==\"\n      },\n      \"watchers\": 123\n    }\n  },\n  \"_links\": {\n    \"self\": {\n      \"href\": \"https://api.github.com/repos/octocat/Hello-World/pulls/1347\"\n    },\n    \"html\": {\n      \"href\": \"https://github.com/octocat/Hello-World/pull/1347\"\n    },\n    \"issue\": {\n      \"href\": \"https://api.github.com/repos/octocat/Hello-World/issues/1347\"\n    },\n    \"comments\": {\n      \"href\": \"https://api.github.com/repos/octocat/Hello-World/issues/1347/comments\"\n    },\n    \"review_comments\": {\n      \"href\": \"https://api.github.com/repos/octocat/Hello-World/pulls/1347/comments\"\n    },\n    \"review_comment\": {\n      \"href\": \"https://api.github.com/repos/octocat/Hello-World/pulls/comments{/number}\"\n    },\n    \"commits\": {\n      \"href\": \"https://api.github.com/repos/octocat/Hello-World/pulls/1347/commits\"\n    },\n    \"statuses\": {\n      \"href\": \"https://api.github.com/repos/octocat/Hello-World/statuses/6dcb09b5b57875f334f61aebed695e2e4193db5e\"\n    }\n  },\n  \"author_association\": \"OWNER\",\n  \"auto_merge\": null,\n  \"draft\": false,\n  \"merged\": false,\n  \"mergeable\": true,\n  \"rebaseable\": true,\n  \"mergeable_state\": \"clean\",\n  \"merged_by\": {\n    \"login\": \"octocat\",\n    \"id\": 1,\n    \"node_id\": \"MDQ6VXNlcjE=\",\n    \"avatar_url\": \"https://github.com/images/error/octocat_happy.gif\",\n    \"gravatar_id\": \"\",\n    \"url\": \"https://api.github.com/users/octocat\",\n    \"html_url\": \"https://github.com/octocat\",\n    \"followers_url\": \"https://api.github.com/users/octocat/followers\",\n    \"following_url\": \"https://api.github.com/users/octocat/following{/other_user}\",\n    \"gists_url\": \"https://api.github.com/users/octocat/gists{/gist_id}\",\n    \"starred_url\": \"https://api.github.com/users/octocat/starred{/owner}{/repo}\",\n    \"subscriptions_url\": \"https://api.github.com/users/octocat/subscriptions\",\n    \"organizations_url\": \"https://api.github.com/users/octocat/orgs\",\n    \"repos_url\": \"https://api.github.com/users/octocat/repos\",\n    \"events_url\": \"https://api.github.com/users/octocat/events{/privacy}\",\n    \"received_events_url\": \"https://api.github.com/users/octocat/received_events\",\n    \"type\": \"User\",\n    \"site_admin\": false\n  },\n  \"comments\": 10,\n  \"review_comments\": 0,\n  \"maintainer_can_modify\": true,\n  \"commits\": 3,\n  \"additions\": 100,\n  \"deletions\": 3,\n  \"changed_files\": 5\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/test/resources/__files/github/rest/user/response.json",
    "content": "{\n  \"login\": \"github-user\",\n  \"id\": 123456789,\n  \"node_id\": \"ddfsSDSDDJKHSDjhd\",\n  \"avatar_url\": \"https://avatars.githubusercontent.com/u/123456789?v=4\",\n  \"gravatar_id\": \"\",\n  \"url\": \"https://api.github.com/users/github-user\",\n  \"html_url\": \"https://github.com/github-user\",\n  \"followers_url\": \"https://api.github.com/users/github-user/followers\",\n  \"following_url\": \"https://api.github.com/users/github-user/following{/other_user}\",\n  \"gists_url\": \"https://api.github.com/users/github-user/gists{/gist_id}\",\n  \"starred_url\": \"https://api.github.com/users/github-user/starred{/owner}{/repo}\",\n  \"subscriptions_url\": \"https://api.github.com/users/github-user/subscriptions\",\n  \"organizations_url\": \"https://api.github.com/users/github-user/orgs\",\n  \"repos_url\": \"https://api.github.com/users/github-user/repos\",\n  \"events_url\": \"https://api.github.com/users/github-user/events{/privacy}\",\n  \"received_events_url\": \"https://api.github.com/users/github-user/received_events\",\n  \"type\": \"User\",\n  \"site_admin\": false,\n  \"name\": \"Github User\",\n  \"company\": \"ACME\",\n  \"blog\": \"https://acme.com/\",\n  \"location\": \"Planet Earth\",\n  \"email\": \"github-user@acme.com\",\n  \"hireable\": null,\n  \"bio\": null,\n  \"twitter_username\": null,\n  \"public_repos\": 12,\n  \"public_gists\": 3,\n  \"followers\": 1,\n  \"following\": 0,\n  \"created_at\": \"2019-10-11T15:46:45Z\",\n  \"updated_at\": \"2021-06-21T12:38:04Z\"\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-github/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n%nopex</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-factory-github-common</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Factory Resolver Github Common</name>\n    <properties>\n        <findbugs.failonerror>true</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.validation</groupId>\n            <artifactId>jakarta.validation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/AbstractGithubFactoryParametersResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static java.util.Collections.emptyMap;\nimport static org.eclipse.che.api.factory.shared.Constants.REVISION_PARAMETER_NAME;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.factory.server.BaseFactoryParameterResolver;\nimport org.eclipse.che.api.factory.server.FactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.*;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/**\n * Provides Factory Parameters resolver for github repositories.\n *\n * @author Florent Benoit\n */\npublic abstract class AbstractGithubFactoryParametersResolver extends BaseFactoryParameterResolver\n    implements FactoryParametersResolver {\n\n  /** Parser which will allow to check validity of URLs and create objects. */\n  private final AbstractGithubURLParser githubUrlParser;\n\n  private final URLFetcher urlFetcher;\n\n  /** Builder allowing to build objects from github URL. */\n  private final GithubSourceStorageBuilder githubSourceStorageBuilder;\n\n  private final URLFactoryBuilder urlFactoryBuilder;\n\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n\n  private final String providerName;\n\n  public AbstractGithubFactoryParametersResolver(\n      AbstractGithubURLParser githubUrlParser,\n      URLFetcher urlFetcher,\n      GithubSourceStorageBuilder githubSourceStorageBuilder,\n      AuthorisationRequestManager authorisationRequestManager,\n      URLFactoryBuilder urlFactoryBuilder,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      String providerName) {\n    super(authorisationRequestManager, urlFactoryBuilder, providerName);\n    this.providerName = providerName;\n    this.githubUrlParser = githubUrlParser;\n    this.urlFetcher = urlFetcher;\n    this.githubSourceStorageBuilder = githubSourceStorageBuilder;\n    this.urlFactoryBuilder = urlFactoryBuilder;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n  }\n\n  /**\n   * Check if this resolver can be used with the given parameters.\n   *\n   * @param factoryParameters map of parameters dedicated to factories\n   * @return true if it will be accepted by the resolver implementation or false if it is not\n   *     accepted\n   */\n  @Override\n  public boolean accept(@NotNull final Map<String, String> factoryParameters) {\n    // Check if url parameter is a github URL\n    return factoryParameters.containsKey(URL_PARAMETER_NAME)\n        && githubUrlParser.isValid(factoryParameters.get(URL_PARAMETER_NAME));\n  }\n\n  @Override\n  public String getProviderName() {\n    return providerName;\n  }\n\n  /**\n   * Create factory object based on provided parameters\n   *\n   * @param factoryParameters map containing factory data parameters provided through URL\n   * @throws BadRequestException when data are invalid\n   */\n  @Override\n  public FactoryMetaDto createFactory(@NotNull final Map<String, String> factoryParameters)\n      throws ApiException {\n    // no need to check null value of url parameter as accept() method has performed the check\n    final GithubUrl githubUrl;\n    if (getSkipAuthorisation(factoryParameters)) {\n      githubUrl =\n          githubUrlParser.parseWithoutAuthentication(\n              factoryParameters.get(URL_PARAMETER_NAME),\n              factoryParameters.get(REVISION_PARAMETER_NAME));\n    } else {\n      githubUrl =\n          githubUrlParser.parse(\n              factoryParameters.get(URL_PARAMETER_NAME),\n              factoryParameters.get(REVISION_PARAMETER_NAME));\n    }\n\n    return createFactory(\n        factoryParameters,\n        githubUrl,\n        new GithubFactoryVisitor(githubUrl),\n        new GithubAuthorizingFileContentProvider(\n            githubUrl, urlFetcher, personalAccessTokenManager));\n  }\n\n  /**\n   * Visitor that puts the default devfile or updates devfile projects into the Github Factory, if\n   * needed.\n   */\n  private class GithubFactoryVisitor implements FactoryVisitor {\n\n    private final GithubUrl githubUrl;\n\n    private GithubFactoryVisitor(GithubUrl githubUrl) {\n      this.githubUrl = githubUrl;\n    }\n\n    @Override\n    public FactoryDevfileV2Dto visit(FactoryDevfileV2Dto factoryDto) {\n      ScmInfoDto scmInfo =\n          newDto(ScmInfoDto.class)\n              .withScmProviderName(githubUrl.getProviderName())\n              .withRepositoryUrl(githubUrl.repositoryLocation());\n      if (githubUrl.getBranch() != null) {\n        scmInfo.withBranch(githubUrl.getBranch());\n      }\n      return factoryDto.withScmInfo(scmInfo);\n    }\n  }\n\n  @Override\n  public RemoteFactoryUrl parseFactoryUrl(String factoryUrl) throws ApiException {\n    if (getSkipAuthorisation(emptyMap())) {\n      return githubUrlParser.parseWithoutAuthentication(factoryUrl, null);\n    } else {\n      return githubUrlParser.parse(factoryUrl, null);\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/AbstractGithubPersonalAccessTokenFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport com.google.common.base.Joiner;\nimport com.google.common.collect.ImmutableMap;\nimport com.google.common.collect.ImmutableSet;\nimport java.util.Arrays;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Set;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.*;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenParams;\nimport org.eclipse.che.api.factory.server.scm.exception.*;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** GitHub OAuth token retriever. */\npublic abstract class AbstractGithubPersonalAccessTokenFetcher\n    implements PersonalAccessTokenFetcher {\n\n  private static final Logger LOG =\n      LoggerFactory.getLogger(AbstractGithubPersonalAccessTokenFetcher.class);\n  private static final String OAUTH_PROVIDER_NAME = \"github\";\n  private final String apiEndpoint;\n  private final OAuthAPI oAuthAPI;\n\n  /** GitHub API client. */\n  private final GithubApiClient githubApiClient;\n\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  private final String providerName;\n\n  /** Collection of OAuth scopes required to make integration with GitHub work. */\n  public static final Set<String> DEFAULT_TOKEN_SCOPES =\n      ImmutableSet.of(\"repo\", \"user:email\", \"read:user\", \"read:org\", \"workflow\");\n\n  /**\n   * Map of OAuth GitHub scopes where each key is a scope and its value is the parent scope. The\n   * parent scope includes all of its children scopes. This map is used when determining if a token\n   * has the required scopes. See\n   * https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps#available-scopes\n   */\n  private static final Map<String, String> SCOPE_MAP =\n      ImmutableMap.<String, String>builderWithExpectedSize(35)\n          .put(\"repo\", \"repo\")\n          .put(\"repo:status\", \"repo\")\n          .put(\"repo_deployment\", \"repo\")\n          .put(\"public_repo\", \"repo\")\n          .put(\"repo:invite\", \"repo\")\n          .put(\"security_events\", \"repo\")\n          //\n          .put(\"workflow\", \"workflow\")\n          //\n          .put(\"write:packages\", \"write:packages\")\n          .put(\"read:packages\", \"write:packages\")\n          //\n          .put(\"delete:packages\", \"delete:packages\")\n          //\n          .put(\"admin:org\", \"admin:org\")\n          .put(\"write:org\", \"admin:org\")\n          .put(\"read:org\", \"admin:org\")\n          //\n          .put(\"admin:public_key\", \"admin:public_key\")\n          .put(\"write:public_key\", \"admin:public_key\")\n          .put(\"read:public_key\", \"admin:public_key\")\n          //\n          .put(\"admin:repo_hook\", \"admin:repo_hook\")\n          .put(\"write:repo_hook\", \"admin:repo_hook\")\n          .put(\"read:repo_hook\", \"admin:repo_hook\")\n          //\n          .put(\"admin:org_hook\", \"admin:org_hook\")\n          //\n          .put(\"gist\", \"gist\")\n          //\n          .put(\"notifications\", \"notifications\")\n          //\n          .put(\"user\", \"user\")\n          .put(\"read:user\", \"user\")\n          .put(\"user:email\", \"user\")\n          .put(\"user:follow\", \"user\")\n          //\n          .put(\"delete_repo\", \"delete_repo\")\n          //\n          .put(\"write:discussion\", \"write:discussion\")\n          .put(\"read:discussion\", \"write:discussion\")\n          //\n          .put(\"admin:enterprise\", \"admin:enterprise\")\n          .put(\"manage_billing:enterprise\", \"admin:enterprise\")\n          .put(\"read:enterprise\", \"admin:enterprise\")\n          //\n          .put(\"admin:gpg_key\", \"admin:gpg_key\")\n          .put(\"write:gpg_key\", \"admin:gpg_key\")\n          .put(\"read:gpg_key\", \"admin:gpg_key\")\n          .build();\n\n  /**\n   * Constructor used for testing only.\n   *\n   * @param apiEndpoint\n   * @param oAuthAPI\n   * @param githubApiClient\n   */\n  AbstractGithubPersonalAccessTokenFetcher(\n      String apiEndpoint, OAuthAPI oAuthAPI, GithubApiClient githubApiClient, String providerName) {\n    this.apiEndpoint = apiEndpoint;\n    this.oAuthAPI = oAuthAPI;\n    this.githubApiClient = githubApiClient;\n    this.providerName = providerName;\n  }\n\n  public PersonalAccessToken refreshPersonalAccessToken(Subject cheSubject, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    // Tokens generated via GitHub OAuth app do not have an expiration date, so we don't need to\n    // refresh them.\n    return fetchPersonalAccessToken(cheSubject, scmServerUrl);\n  }\n\n  @Override\n  public PersonalAccessToken fetchPersonalAccessToken(Subject cheSubject, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    OAuthToken oAuthToken;\n\n    if (githubApiClient == null || !githubApiClient.isConnected(scmServerUrl)) {\n      LOG.debug(\"not a  valid url {} for current fetcher \", scmServerUrl);\n      return null;\n    }\n    try {\n      oAuthToken = oAuthAPI.getOrRefreshToken(providerName);\n      String tokenName = NameGenerator.generate(OAUTH_2_PREFIX, 5);\n      String tokenId = NameGenerator.generate(\"id-\", 5);\n      Optional<Pair<Boolean, String>> valid =\n          isValid(\n              new PersonalAccessTokenParams(\n                  scmServerUrl,\n                  // Despite the fact that we may have two GitHub oauth providers, we always set\n                  // \"github\" to the token provider name. The specific GitHub oauth provider\n                  // references to the specific token by the url parameter.\n                  OAUTH_PROVIDER_NAME,\n                  tokenName,\n                  tokenId,\n                  oAuthToken.getToken(),\n                  null));\n      if (valid.isEmpty()) {\n        throw buildScmUnauthorizedException(cheSubject);\n      } else if (!valid.get().first) {\n        throw new ScmCommunicationException(\n            \"Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: \"\n                + DEFAULT_TOKEN_SCOPES.toString());\n      }\n      return new PersonalAccessToken(\n          scmServerUrl,\n          OAUTH_PROVIDER_NAME,\n          cheSubject.getUserId(),\n          valid.get().second,\n          tokenName,\n          tokenId,\n          oAuthToken.getToken());\n    } catch (UnauthorizedException e) {\n      throw buildScmUnauthorizedException(cheSubject);\n    } catch (NotFoundException nfe) {\n      throw new UnknownScmProviderException(nfe.getMessage(), scmServerUrl);\n    } catch (ServerException | ForbiddenException | BadRequestException | ConflictException e) {\n      LOG.error(e.getMessage());\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  private ScmUnauthorizedException buildScmUnauthorizedException(Subject cheSubject) {\n    return new ScmUnauthorizedException(\n        cheSubject.getUserName()\n            + \" is not authorized in \"\n            + this.providerName\n            + \" OAuth provider.\",\n        this.providerName,\n        \"2.0\",\n        getLocalAuthenticateUrl());\n  }\n\n  @Override\n  @Deprecated\n  public Optional<Boolean> isValid(PersonalAccessToken personalAccessToken) {\n    if (!githubApiClient.isConnected(personalAccessToken.getScmProviderUrl())) {\n      LOG.debug(\"not a valid url {} for current fetcher \", personalAccessToken.getScmProviderUrl());\n      return Optional.empty();\n    }\n\n    try {\n      if (personalAccessToken.getScmTokenName() != null\n          && personalAccessToken.getScmTokenName().startsWith(OAUTH_2_PREFIX)) {\n        String[] scopes = githubApiClient.getTokenScopes(personalAccessToken.getToken()).second;\n        return Optional.of(containsScopes(scopes, DEFAULT_TOKEN_SCOPES));\n      } else {\n        // No REST API for PAT-s in Github found yet. Just try to do some action.\n        GithubUser user = githubApiClient.getUser(personalAccessToken.getToken());\n        if (personalAccessToken.getScmUserName().equals(user.getLogin())) {\n          return Optional.of(Boolean.TRUE);\n        } else {\n          return Optional.of(Boolean.FALSE);\n        }\n      }\n    } catch (ScmItemNotFoundException\n        | ScmCommunicationException\n        | ScmBadRequestException\n        | ScmUnauthorizedException e) {\n      return Optional.of(Boolean.FALSE);\n    }\n  }\n\n  @Override\n  public Optional<Pair<Boolean, String>> isValid(PersonalAccessTokenParams params)\n      throws ScmCommunicationException {\n    GithubApiClient apiClient;\n    if (githubApiClient.isConnected(params.getScmProviderUrl())) {\n      // The url from the token has the same url as the api client, no need to create a new one.\n      apiClient = githubApiClient;\n    } else {\n      if (OAUTH_PROVIDER_NAME.equals(params.getScmTokenName())) {\n        apiClient = new GithubApiClient(params.getScmProviderUrl());\n      } else {\n        LOG.debug(\"not a  valid url {} for current fetcher \", params.getScmProviderUrl());\n        return Optional.empty();\n      }\n    }\n    try {\n      // TODO: add PAT scope validation\n      // No way to get scopes from PAT-s or GitHub app tokens found yet. Just try to do some action.\n      GithubUser user = apiClient.getUser(params.getToken());\n      return Optional.of(Pair.of(Boolean.TRUE, user.getLogin()));\n    } catch (ScmItemNotFoundException | ScmBadRequestException | ScmUnauthorizedException e) {\n      return Optional.empty();\n    }\n  }\n\n  /**\n   * Checks if the tokenScopes array contains the requiredScopes.\n   *\n   * @param tokenScopes Scopes from token\n   * @param requiredScopes Mandatory scopes\n   * @return If all mandatory scopes are contained in the token's scopes\n   */\n  boolean containsScopes(String[] tokenScopes, Set<String> requiredScopes) {\n    Arrays.sort(tokenScopes);\n    // We need check that the token has the required minimal scopes.  The scopes can be normalized\n    // by GitHub, so we need to be careful for sub-scopes being included in parent scopes.\n    for (String requiredScope : requiredScopes) {\n      String parentScope = SCOPE_MAP.get(requiredScope);\n      if (parentScope == null) {\n        // requiredScope is not recognized as a GitHub scope, so just skip it.\n        continue;\n      }\n      if (Arrays.binarySearch(tokenScopes, parentScope) < 0\n          && Arrays.binarySearch(tokenScopes, requiredScope) < 0) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  private String getLocalAuthenticateUrl() {\n    return apiEndpoint\n        + \"/oauth/authenticate?oauth_provider=\"\n        + providerName\n        + \"&scope=\"\n        + Joiner.on(',').join(DEFAULT_TOKEN_SCOPES)\n        + \"&request_method=POST&signature_method=rsa\";\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/AbstractGithubScmFileResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static org.eclipse.che.api.factory.server.ApiExceptionMapper.toApiException;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.io.IOException;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.factory.server.ScmFileResolver;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\n\n/** Github specific SCM file resolver. */\npublic abstract class AbstractGithubScmFileResolver implements ScmFileResolver {\n\n  private final AbstractGithubURLParser githubUrlParser;\n  private final URLFetcher urlFetcher;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n\n  public AbstractGithubScmFileResolver(\n      AbstractGithubURLParser githubUrlParser,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    this.githubUrlParser = githubUrlParser;\n    this.urlFetcher = urlFetcher;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n  }\n\n  @Override\n  public boolean accept(@NotNull String repository) {\n    // Check if repository parameter is a github URL\n    return githubUrlParser.isValid(repository);\n  }\n\n  @Override\n  public String fileContent(@NotNull String repository, @NotNull String filePath)\n      throws ApiException {\n    final GithubUrl githubUrl = githubUrlParser.parse(repository, null);\n    try {\n      return fetchContent(githubUrl, filePath, false);\n    } catch (DevfileException exception) {\n      // This catch might mean that the authentication was rejected by user, try to repeat the fetch\n      // without authentication flow.\n      try {\n        return fetchContent(githubUrl, filePath, true);\n      } catch (DevfileException devfileException) {\n        throw toApiException(devfileException);\n      }\n    }\n  }\n\n  private String fetchContent(GithubUrl githubUrl, String filePath, boolean skipAuthentication)\n      throws DevfileException, NotFoundException {\n    try {\n      GithubAuthorizingFileContentProvider contentProvider =\n          new GithubAuthorizingFileContentProvider(\n              githubUrl, urlFetcher, personalAccessTokenManager);\n      return skipAuthentication\n          ? contentProvider.fetchContentWithoutAuthentication(filePath)\n          : contentProvider.fetchContent(filePath);\n    } catch (IOException e) {\n      throw new NotFoundException(e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/AbstractGithubURLParser.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static com.google.common.base.MoreObjects.firstNonNull;\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.regex.Pattern.compile;\nimport static org.eclipse.che.api.factory.server.ApiExceptionMapper.toApiException;\nimport static org.eclipse.che.api.factory.server.github.GithubApiClient.GITHUB_SAAS_ENDPOINT;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.time.Duration;\nimport java.util.Optional;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.*;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Parser of String Github URLs and provide {@link GithubUrl} objects.\n *\n * @author Florent Benoit\n */\npublic abstract class AbstractGithubURLParser {\n\n  private static final Logger LOG = LoggerFactory.getLogger(AbstractGithubURLParser.class);\n  private final PersonalAccessTokenManager tokenManager;\n  private final DevfileFilenamesProvider devfileFilenamesProvider;\n  private final GithubApiClient apiClient;\n\n  /**\n   * Regexp to find repository details (repository name, project name and branch and subfolder)\n   * Examples of valid URLs are in the test class.\n   */\n  private final Pattern githubPattern;\n\n  private final String githubPatternTemplate =\n      \"%s/(?<repoUser>[^/]+)/(?<repoName>[^/]++)((/)|(?:/((tree)|(blob))/(?<path>.++))|(/pull/(?<pullRequestId>\\\\d++)))?$\";\n\n  private final Pattern githubSSHPattern;\n\n  private final String githubSSHPatternTemplate = \"^git@%s:(?<repoUser>.*)/(?<repoName>.*)$\";\n\n  private final boolean disableSubdomainIsolation;\n\n  private final String providerName;\n  private final String endpoint;\n  private final boolean isGitHubServer;\n\n  /** Constructor used for testing only. */\n  AbstractGithubURLParser(\n      PersonalAccessTokenManager tokenManager,\n      DevfileFilenamesProvider devfileFilenamesProvider,\n      GithubApiClient githubApiClient,\n      String oauthEndpoint,\n      boolean disableSubdomainIsolation,\n      String providerName) {\n    this.tokenManager = tokenManager;\n    this.devfileFilenamesProvider = devfileFilenamesProvider;\n    this.apiClient = githubApiClient;\n    this.disableSubdomainIsolation = disableSubdomainIsolation;\n    this.providerName = providerName;\n    // Check if the given OAuth endpoint is a GitHub server URL. If the OAuth endpoint is not\n    // defined, or it equals the GitHub SaaS endpoint, it means that the given URL is a GitHub SaaS\n    // URL (https://github.com). Otherwise, the given URL is a GitHub server URL.\n    this.isGitHubServer =\n        !isNullOrEmpty(oauthEndpoint) && !GITHUB_SAAS_ENDPOINT.equals(oauthEndpoint);\n\n    endpoint = isNullOrEmpty(oauthEndpoint) ? GITHUB_SAAS_ENDPOINT : trimEnd(oauthEndpoint, '/');\n\n    this.githubPattern = compile(format(githubPatternTemplate, endpoint));\n    this.githubSSHPattern =\n        compile(format(githubSSHPatternTemplate, URI.create(endpoint).getHost()));\n  }\n\n  // Check if the given URL is a valid GitHub URL.\n  public boolean isValid(@NotNull String url) {\n    String trimmedUrl = trimEnd(url, '/');\n    return\n    // Check if the given URL matches the GitHub URL patterns. It works if OAuth is configured and\n    // GitHub server URL is known or the repository URL points to GitHub SaaS (https://github.com).\n    githubPattern.matcher(trimmedUrl).matches()\n        || githubSSHPattern.matcher(trimmedUrl).matches()\n        // Check whether PAT is configured for the GitHub server URL. It is sufficient to confirm\n        // that the URL is a valid GitHub URL.\n        || isUserTokenPresent(trimmedUrl)\n        // Check if the given URL is a valid GitHub URL by reaching the endpoint of the GitHub\n        // server and analysing the response. This query basically only needs to be performed if the\n        // specified repository URL does not point to GitHub SaaS.\n        || (!isGitHubServer && isApiRequestRelevant(trimmedUrl));\n  }\n\n  // Try to find the given url in a manually added user namespace token secret.\n  private boolean isUserTokenPresent(String repositoryUrl) {\n    Optional<String> serverUrlOptional = getServerUrl(repositoryUrl);\n    if (serverUrlOptional.isPresent()) {\n      String serverUrl = serverUrlOptional.get();\n      try {\n        Optional<PersonalAccessToken> token =\n            tokenManager.get(EnvironmentContext.getCurrent().getSubject(), null, serverUrl, null);\n        if (token.isPresent()) {\n          PersonalAccessToken accessToken = token.get();\n          return accessToken.getScmTokenName().equals(providerName);\n        }\n      } catch (ScmConfigurationPersistenceException | ScmCommunicationException exception) {\n        return false;\n      }\n    }\n    return false;\n  }\n\n  // Try to call an API request to see if the given url matches self-hosted GitHub Enterprise.\n  private boolean isApiRequestRelevant(String repositoryUrl) {\n    Optional<String> serverUrlOptional = getServerUrl(repositoryUrl);\n    if (serverUrlOptional.isPresent()) {\n      String serverUrl = serverUrlOptional.get();\n      GithubApiClient githubApiClient = new GithubApiClient(serverUrl);\n      try {\n        // If the user request catches the unauthorised error, it means that the provided url\n        // belongs to GitHub.\n        githubApiClient.getUser(\"\");\n      } catch (ScmUnauthorizedException e) {\n        // Check the error message as well, because other providers might also return 401\n        // for such requests.\n        return e.getMessage().contains(\"Requires authentication\")\n            || // for older GitHub Enterprise versions\n            e.getMessage().contains(\"Must authenticate to access this API.\");\n      } catch (ScmItemNotFoundException e) {\n        // GitHub API v3 (/api/v3/user) returned 404 — this server does not expose the GitHub\n        // v3 API path. Fall back to checking the Gitea-compatible API (/api/v1/user): if that\n        // endpoint returns 401 the server is a GitHub-compatible instance (e.g. Gitea).\n        return isGiteaCompatibleServer(serverUrl);\n      } catch (ScmBadRequestException | IllegalArgumentException | ScmCommunicationException e) {\n        return false;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Returns {@code true} when the server at {@code serverUrl} exposes a Gitea-style GitHub\n   * compatible API ({@code /api/v1/user}) and requires authentication (HTTP 401).\n   */\n  private boolean isGiteaCompatibleServer(String serverUrl) {\n    try {\n      HttpRequest request =\n          HttpRequest.newBuilder()\n              .uri(URI.create(serverUrl + \"/api/v1/user\"))\n              .timeout(Duration.ofSeconds(10))\n              .GET()\n              .build();\n      HttpResponse<Void> response =\n          HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.discarding());\n      return response.statusCode() == 401;\n    } catch (Exception e) {\n      LOG.debug(\"Failed to reach Gitea API at {}: {}\", serverUrl, e.getMessage());\n      return false;\n    }\n  }\n\n  private Optional<String> getServerUrl(String repositoryUrl) {\n    // If the given repository url is an SSH url, generate the base url from the pattern:\n    // https://<hostname extracted from the SSH url>.\n    if (repositoryUrl.startsWith(\"git@\")) {\n      String substring = repositoryUrl.substring(4);\n      // Handle IPv6 addresses in SSH URLs (e.g., git@[2001:db8::1]:repo)\n      if (substring.startsWith(\"[\")) {\n        int closingBracket = substring.indexOf(']');\n        if (closingBracket > 0) {\n          return Optional.of(\"https://\" + substring.substring(0, closingBracket + 1));\n        }\n      }\n      return Optional.of(\"https://\" + substring.substring(0, substring.indexOf(\":\")));\n    }\n    // Use URI parsing to properly handle IPv6 addresses\n    try {\n      URI uri = URI.create(repositoryUrl);\n      if (uri.getScheme() != null && uri.getHost() != null) {\n        String authority = uri.getRawAuthority();\n        if (authority == null) {\n          String host = uri.getHost();\n          boolean ipv6 = host != null && host.contains(\":\");\n          String hostForUrl = ipv6 ? \"[\" + host + \"]\" : host;\n          int port = uri.getPort();\n          authority = port == -1 ? hostForUrl : hostForUrl + \":\" + port;\n        }\n\n        if (authority != null) {\n          String serverUrl = uri.getScheme() + \"://\" + authority;\n          // Remove path and query from the server URL\n          int authorityIdx = repositoryUrl.indexOf(authority);\n          if (authorityIdx >= 0) {\n            int pathIndex = authorityIdx + authority.length();\n            if (pathIndex < repositoryUrl.length() && repositoryUrl.charAt(pathIndex) == '/') {\n              return Optional.of(serverUrl);\n            }\n          }\n        }\n      }\n    } catch (IllegalArgumentException e) {\n      // Fall through to old logic if URI parsing fails\n    }\n    // Otherwise, extract the base url from the given repository url by cutting the url after the\n    // first slash.\n    Matcher serverUrlMatcher = compile(\"[^/|:]/\").matcher(repositoryUrl);\n    if (serverUrlMatcher.find()) {\n      return Optional.of(\n          repositoryUrl.substring(0, repositoryUrl.indexOf(serverUrlMatcher.group()) + 1));\n    }\n    return Optional.empty();\n  }\n\n  public GithubUrl parseWithoutAuthentication(String url, @Nullable String revision)\n      throws ApiException {\n    return parse(trimEnd(url, '/'), false, revision);\n  }\n\n  public GithubUrl parse(String url, @Nullable String revision) throws ApiException {\n    return parse(trimEnd(url, '/'), true, revision);\n  }\n\n  private IllegalArgumentException buildIllegalArgumentException(String url) {\n    return new IllegalArgumentException(\n        format(\"The given url %s is not a valid github URL. \", url));\n  }\n\n  private GithubUrl parse(String url, boolean authenticationRequired, @Nullable String revision)\n      throws ApiException {\n    Matcher matcher;\n    boolean isHTTPSUrl = githubPattern.matcher(url).matches();\n    if (isHTTPSUrl) {\n      matcher = githubPattern.matcher(url);\n    } else if (githubSSHPattern.matcher(url).matches()) {\n      matcher = githubSSHPattern.matcher(url);\n    } else {\n      matcher = getPatternMatcherByUrl(url).orElseThrow(() -> buildIllegalArgumentException(url));\n      isHTTPSUrl = url.startsWith(\"http\");\n    }\n    if (!matcher.matches()) {\n      throw buildIllegalArgumentException(url);\n    }\n\n    String serverUrl = getServerUrl(url).orElseThrow(() -> buildIllegalArgumentException(url));\n    String repoUser = matcher.group(\"repoUser\");\n    String repoName = matcher.group(\"repoName\");\n    if (repoName.matches(\"^[\\\\w-][\\\\w.-]*?\\\\.git$\")) {\n      repoName = repoName.substring(0, repoName.length() - 4);\n    }\n\n    String branchFromUrl = null;\n    String pullRequestId = null;\n    if (isHTTPSUrl) {\n      branchFromUrl = getBranch(matcher.group(\"path\"));\n      pullRequestId = matcher.group(\"pullRequestId\");\n    }\n\n    if (pullRequestId != null) {\n      GithubPullRequest pullRequest =\n          this.getPullRequest(serverUrl, pullRequestId, repoUser, repoName, authenticationRequired);\n      if (pullRequest != null) {\n        String state = pullRequest.getState();\n        if (!\"open\".equalsIgnoreCase(state)) {\n          throw new IllegalArgumentException(\n              format(\n                  \"The given Pull Request url %s is not Opened, (found %s), thus it can't be opened as branch may have been removed.\",\n                  url, state));\n        }\n\n        GithubHead pullRequestHead = pullRequest.getHead();\n        repoUser = pullRequestHead.getUser().getLogin();\n        repoName = pullRequestHead.getRepo().getName();\n        branchFromUrl = pullRequestHead.getRef();\n      }\n    }\n\n    String latestCommit = null;\n    GithubCommit commit =\n        getLatestCommit(\n            serverUrl,\n            repoUser,\n            repoName,\n            isNullOrEmpty(revision) ? firstNonNull(branchFromUrl, \"HEAD\") : revision,\n            authenticationRequired);\n    if (commit != null) {\n      latestCommit = commit.getSha();\n    }\n\n    return new GithubUrl(providerName)\n        .withUsername(repoUser)\n        .withRepository(repoName)\n        .setIsHTTPSUrl(isHTTPSUrl)\n        .withServerUrl(serverUrl)\n        .withDisableSubdomainIsolation(disableSubdomainIsolation)\n        .withBranch(isNullOrEmpty(branchFromUrl) ? revision : branchFromUrl)\n        .withLatestCommit(latestCommit)\n        .withDevfileFilenames(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .withUrl(url);\n  }\n\n  /*\n   * Get branch from the file path by extracting the segment before the devfile name.\n   * Example of a file path: \"branch/devfile.yaml\" => \"branch\"\n   */\n  private String getBranch(String path) {\n    if (path != null && path.contains(\"/\")) {\n      Optional<String> devfileNameOptional =\n          devfileFilenamesProvider.getConfiguredDevfileFilenames().stream()\n              .filter(devfileName -> path.endsWith(\"/\" + devfileName))\n              .findAny();\n      return devfileNameOptional.map(s -> path.substring(0, path.indexOf(s) - 1)).orElse(path);\n    }\n    return path;\n  }\n\n  private GithubPullRequest getPullRequest(\n      String githubEndpoint,\n      String pullRequestId,\n      String repoUser,\n      String repoName,\n      boolean authenticationRequired)\n      throws ApiException {\n    try {\n      // prepare token\n      Subject subject = EnvironmentContext.getCurrent().getSubject();\n      PersonalAccessToken personalAccessToken = null;\n      Optional<PersonalAccessToken> token = tokenManager.get(subject, null, githubEndpoint, null);\n      if (token.isPresent()) {\n        personalAccessToken = token.get();\n      } else if (authenticationRequired) {\n        personalAccessToken = tokenManager.fetchAndSave(subject, githubEndpoint);\n      }\n\n      GithubApiClient apiClient =\n          this.apiClient.isConnected(githubEndpoint)\n              ? this.apiClient\n              : new GithubApiClient(githubEndpoint);\n\n      // get pull request\n      return apiClient.getPullRequest(\n          pullRequestId,\n          repoUser,\n          repoName,\n          personalAccessToken != null ? personalAccessToken.getToken() : null);\n    } catch (UnknownScmProviderException e) {\n\n      // get pull request without authentication\n      try {\n        return apiClient.getPullRequest(pullRequestId, repoUser, repoName, null);\n      } catch (ScmItemNotFoundException\n          | ScmCommunicationException\n          | ScmBadRequestException\n          | ScmUnauthorizedException exception) {\n        LOG.error(\"Failed to authenticate to GitHub\", e);\n      }\n\n    } catch (ScmUnauthorizedException e) {\n      throw toApiException(e);\n    } catch (ScmCommunicationException\n        | UnsatisfiedScmPreconditionException\n        | ScmConfigurationPersistenceException e) {\n      LOG.error(\"Failed to authenticate to GitHub\", e);\n    } catch (ScmItemNotFoundException | ScmBadRequestException e) {\n      LOG.error(\"Failed retrieve GitHub Pull Request\", e);\n    }\n\n    return null;\n  }\n\n  private GithubCommit getLatestCommit(\n      String githubEndpoint,\n      String repoUser,\n      String repoName,\n      String branchName,\n      boolean authenticationRequired) {\n    GithubApiClient apiClient =\n        this.apiClient.isConnected(githubEndpoint)\n            ? this.apiClient\n            : new GithubApiClient(githubEndpoint);\n    try {\n      // prepare token\n      Subject subject = EnvironmentContext.getCurrent().getSubject();\n      PersonalAccessToken personalAccessToken = null;\n      Optional<PersonalAccessToken> token = tokenManager.get(subject, null, githubEndpoint, null);\n      if (token.isPresent()) {\n        personalAccessToken = token.get();\n      } else if (authenticationRequired) {\n        personalAccessToken = tokenManager.fetchAndSave(subject, githubEndpoint);\n      }\n\n      // get latest commit\n      return apiClient.getLatestCommit(\n          repoUser,\n          repoName,\n          branchName,\n          personalAccessToken != null ? personalAccessToken.getToken() : null);\n    } catch (UnknownScmProviderException | ScmUnauthorizedException e) {\n      // get latest commit without authentication\n      try {\n        return apiClient.getLatestCommit(repoUser, repoName, branchName, null);\n      } catch (ScmItemNotFoundException\n          | ScmCommunicationException\n          | ScmBadRequestException\n          | URISyntaxException\n          | ScmUnauthorizedException exception) {\n        LOG.error(\"Failed to authenticate to GitHub\", e);\n      }\n    } catch (ScmCommunicationException\n        | UnsatisfiedScmPreconditionException\n        | ScmConfigurationPersistenceException e) {\n      LOG.error(\"Failed to authenticate to GitHub\", e);\n    } catch (ScmItemNotFoundException | ScmBadRequestException | URISyntaxException e) {\n      LOG.error(\"Failed to retrieve the latest commit\", e);\n      e.printStackTrace();\n    }\n\n    return null;\n  }\n\n  /**\n   * Converts an SSH git URL (git@host:path) to a parseable URI (ssh://git@host/path), handling IPv6\n   * addresses where colons in the address must not be replaced.\n   */\n  private static String sshToUri(String url) {\n    // Strip \"git@\" prefix\n    String afterAt = url.substring(4);\n    if (afterAt.startsWith(\"[\")) {\n      // IPv6: git@[2001:db8::1]:path -> ssh://git@[2001:db8::1]/path\n      int closingBracket = afterAt.indexOf(']');\n      if (closingBracket >= 0 && closingBracket + 1 < afterAt.length()) {\n        String host = afterAt.substring(0, closingBracket + 1);\n        // Skip the colon separator after the closing bracket\n        String path = afterAt.substring(closingBracket + 1);\n        if (path.startsWith(\":\")) {\n          path = path.substring(1);\n        }\n        return \"ssh://git@\" + host + \"/\" + path;\n      }\n    }\n    // Regular hostname: git@host:path -> ssh://git@host/path\n    return \"ssh://\" + url.replace(\":\", \"/\");\n  }\n\n  private Optional<Matcher> getPatternMatcherByUrl(String url) {\n    URI uri = URI.create(url.matches(format(githubSSHPatternTemplate, \".*\")) ? sshToUri(url) : url);\n    String scheme = uri.getScheme();\n    String host = uri.getHost(); // IPv6 addresses are returned WITH brackets, e.g. \"[fd00::1]\"\n\n    // uri.getRawAuthority() already contains the correct authority string (including brackets\n    // for IPv6 and the port number), so we can quote it directly to build a literal-match regex.\n    String rawAuthority = uri.getRawAuthority();\n    final String hostForRegex;\n    if (rawAuthority != null) {\n      hostForRegex = Pattern.quote(scheme + \"://\" + rawAuthority);\n    } else {\n      // Fallback: build from host + port\n      String authority = host != null ? host : \"\";\n      if (uri.getPort() > 0) {\n        authority += \":\" + uri.getPort();\n      }\n      hostForRegex = Pattern.quote(scheme + \"://\" + authority);\n    }\n\n    Matcher matcher = compile(format(githubPatternTemplate, hostForRegex)).matcher(url);\n    if (matcher.matches()) {\n      return Optional.of(matcher);\n    } else {\n      // For SSH git@ URLs the host is used without brackets even for IPv6.\n      final String hostOnlyForRegex;\n      if (host != null && host.startsWith(\"[\") && host.endsWith(\"]\")) {\n        // Strip brackets that uri.getHost() includes for IPv6.\n        hostOnlyForRegex = Pattern.quote(host.substring(1, host.length() - 1));\n      } else {\n        hostOnlyForRegex = host != null ? Pattern.quote(host) : \"\";\n      }\n      matcher = compile(format(githubSSHPatternTemplate, hostOnlyForRegex)).matcher(url);\n      return matcher.matches() ? Optional.of(matcher) : Optional.empty();\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/AbstractGithubUserDataFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.base.Joiner;\nimport com.google.common.collect.ImmutableSet;\nimport java.util.Set;\nimport org.eclipse.che.api.factory.server.scm.AbstractGitUserDataFetcher;\nimport org.eclipse.che.api.factory.server.scm.GitUserData;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\n\n/** GitHub user data retriever. */\npublic abstract class AbstractGithubUserDataFetcher extends AbstractGitUserDataFetcher {\n  private final String apiEndpoint;\n\n  /** GitHub API client. */\n  private final GithubApiClient githubApiClient;\n\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  private final String providerName;\n\n  /** Collection of OAuth scopes required to make integration with GitHub work. */\n  public static final Set<String> DEFAULT_TOKEN_SCOPES =\n      ImmutableSet.of(\"repo\", \"user:email\", \"read:user\");\n\n  private static final String NO_USERNAME_AND_EMAIL_ERROR_MESSAGE =\n      \"User name and/or email is not found in the GitHub profile.\";\n\n  /** Constructor used for testing only. */\n  public AbstractGithubUserDataFetcher(\n      String apiEndpoint,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      GithubApiClient githubApiClient,\n      String providerName) {\n    super(providerName, githubApiClient.getServerUrl(), personalAccessTokenManager);\n    this.providerName = providerName;\n    this.githubApiClient = githubApiClient;\n    this.apiEndpoint = apiEndpoint;\n  }\n\n  @Override\n  protected GitUserData fetchGitUserDataWithOAuthToken(String token)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    GithubUser user = githubApiClient.getUser(token);\n    if (isNullOrEmpty(user.getName()) || isNullOrEmpty(user.getEmail())) {\n      throw new ScmItemNotFoundException(NO_USERNAME_AND_EMAIL_ERROR_MESSAGE);\n    } else {\n      return new GitUserData(user.getName(), user.getEmail());\n    }\n  }\n\n  @Override\n  protected GitUserData fetchGitUserDataWithPersonalAccessToken(\n      PersonalAccessToken personalAccessToken)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    GithubApiClient apiClient =\n        githubApiClient.isConnected(personalAccessToken.getScmProviderUrl())\n            ? githubApiClient\n            : new GithubApiClient(personalAccessToken.getScmProviderUrl());\n    GithubUser user = apiClient.getUser(personalAccessToken.getToken());\n    if (isNullOrEmpty(user.getName()) || isNullOrEmpty(user.getEmail())) {\n      throw new ScmItemNotFoundException(NO_USERNAME_AND_EMAIL_ERROR_MESSAGE);\n    } else {\n      return new GitUserData(user.getName(), user.getEmail());\n    }\n  }\n\n  protected String getLocalAuthenticateUrl() {\n    return apiEndpoint\n        + \"/oauth/authenticate?oauth_provider=\"\n        + providerName\n        + \"&scope=\"\n        + Joiner.on(',').join(DEFAULT_TOKEN_SCOPES)\n        + \"&request_method=POST&signature_method=rsa\";\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/GithubApiClient.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.net.HttpURLConnection.HTTP_BAD_REQUEST;\nimport static java.net.HttpURLConnection.HTTP_NOT_FOUND;\nimport static java.net.HttpURLConnection.HTTP_NO_CONTENT;\nimport static java.net.HttpURLConnection.HTTP_OK;\nimport static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;\nimport static java.time.Duration.ofSeconds;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.google.common.base.Charsets;\nimport com.google.common.base.Splitter;\nimport com.google.common.io.CharStreams;\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.UncheckedIOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.time.Duration;\nimport java.util.Optional;\nimport java.util.concurrent.Executors;\nimport java.util.function.Function;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** GitHub API operations helper. */\npublic class GithubApiClient {\n\n  private static final Logger LOG = LoggerFactory.getLogger(GithubApiClient.class);\n\n  /** GitHub endpoint URL. */\n  public static final String GITHUB_SAAS_ENDPOINT = \"https://github.com\";\n\n  public static final String GITHUB_SAAS_ENDPOINT_API = \"https://api.github.com\";\n\n  public static final String GITHUB_SAAS_ENDPOINT_RAW = \"https://raw.githubusercontent.com\";\n\n  /** GitHub HTTP header containing OAuth scopes. */\n  public static final String GITHUB_OAUTH_SCOPES_HEADER = \"X-OAuth-Scopes\";\n\n  private final HttpClient httpClient;\n  private final URI apiServerUrl;\n  private final URI scmServerUrl;\n\n  private static final Duration DEFAULT_HTTP_TIMEOUT = ofSeconds(10);\n  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();\n\n  /** Default constructor, binds http client to GitHub API url */\n  public GithubApiClient(@Nullable String serverUrl) {\n    String trimmedServerUrl = !isNullOrEmpty(serverUrl) ? trimEnd(serverUrl, '/') : null;\n    this.apiServerUrl =\n        URI.create(\n            isNullOrEmpty(trimmedServerUrl) || trimmedServerUrl.equals(GITHUB_SAAS_ENDPOINT)\n                ? GITHUB_SAAS_ENDPOINT_API + \"/\"\n                : trimmedServerUrl + \"/api/v3/\");\n    this.scmServerUrl =\n        URI.create(isNullOrEmpty(trimmedServerUrl) ? GITHUB_SAAS_ENDPOINT : trimmedServerUrl);\n    this.httpClient =\n        HttpClient.newBuilder()\n            .executor(\n                Executors.newCachedThreadPool(\n                    new ThreadFactoryBuilder()\n                        .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n                        .setNameFormat(GithubApiClient.class.getName() + \"-%d\")\n                        .setDaemon(true)\n                        .build()))\n            .connectTimeout(DEFAULT_HTTP_TIMEOUT)\n            .version(HttpClient.Version.HTTP_1_1)\n            .build();\n  }\n\n  /**\n   * Returns the user associated with the provided OAuth access token.\n   *\n   * @see https://docs.github.com/en/rest/reference/users#get-the-authenticated-user\n   * @param authenticationToken OAuth access token used by the user.\n   * @return Information about the user associated with the token\n   * @throws ScmItemNotFoundException\n   * @throws ScmCommunicationException\n   * @throws ScmBadRequestException\n   */\n  public GithubUser getUser(String authenticationToken)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    final URI uri = apiServerUrl.resolve(\"./user\");\n    HttpRequest request = buildGithubApiRequest(uri, authenticationToken);\n    LOG.trace(\"executeRequest={}\", request);\n    return executeRequest(\n        httpClient,\n        request,\n        response -> {\n          try {\n            String result =\n                CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n            return OBJECT_MAPPER.readValue(result, GithubUser.class);\n          } catch (IOException e) {\n            throw new UncheckedIOException(e);\n          }\n        });\n  }\n\n  /**\n   * Fetches and returns a pull request.\n   *\n   * @param id pull request ID\n   * @param username user name\n   * @param repoName repository name\n   * @param authenticationToken oauth access token, can be NULL as the GitHub can handle some\n   *     requests without authentication\n   * @return pull request\n   */\n  public GithubPullRequest getPullRequest(\n      String id, String username, String repoName, String authenticationToken)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    final URI uri =\n        apiServerUrl.resolve(String.format(\"./repos/%s/%s/pulls/%s\", username, repoName, id));\n    HttpRequest request = buildGithubApiRequest(uri, authenticationToken);\n    LOG.trace(\"executeRequest={}\", request);\n    return executeRequest(\n        httpClient,\n        request,\n        response -> {\n          try {\n            String result =\n                CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n            return OBJECT_MAPPER.readValue(result, GithubPullRequest.class);\n          } catch (IOException e) {\n            throw new UncheckedIOException(e);\n          }\n        });\n  }\n\n  /**\n   * Returns the latest commit of the branch.\n   *\n   * <p>GitHub REST API documentation: https://docs.github.com/en/rest/commits/commits\n   *\n   * @param user user or organization name\n   * @param repository repository name\n   * @param branch required branch\n   * @param authenticationToken OAuth access token, can be NULL as the GitHub can handle some\n   *     requests without authentication\n   * @return the latest commit of the branch\n   */\n  public GithubCommit getLatestCommit(\n      String user, String repository, String branch, @Nullable String authenticationToken)\n      throws ScmBadRequestException,\n          ScmItemNotFoundException,\n          ScmCommunicationException,\n          URISyntaxException,\n          ScmUnauthorizedException {\n\n    final URI uri = apiServerUrl.resolve(String.format(\"./repos/%s/%s/commits\", user, repository));\n\n    final URI requestURI =\n        new URI(\n            uri.getScheme(),\n            uri.getAuthority(),\n            uri.getPath(),\n            String.format(\"sha=%s&page=1&per_page=1\", branch),\n            null);\n    HttpRequest request = buildGithubApiRequest(requestURI, authenticationToken);\n    LOG.trace(\"executeRequest={}\", request);\n\n    return executeRequest(\n        httpClient,\n        request,\n        response -> {\n          try {\n            String result =\n                CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n            return OBJECT_MAPPER.readValue(result, GithubCommit[].class)[0];\n          } catch (IOException e) {\n            throw new UncheckedIOException(e);\n          }\n        });\n  }\n\n  /**\n   * Returns the scopes of the OAuth token.\n   *\n   * <p>See GitHub documentation at\n   * https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps\n   *\n   * @param authenticationToken The OAuth token to inspect.\n   * @return Array of scopes from the supplied token, empty array if no scope.\n   * @throws ScmItemNotFoundException\n   * @throws ScmCommunicationException\n   * @throws ScmBadRequestException\n   */\n  public Pair<String, String[]> getTokenScopes(String authenticationToken)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    final URI uri = apiServerUrl.resolve(\"./user\");\n    HttpRequest request = buildGithubApiRequest(uri, authenticationToken);\n    LOG.trace(\"executeRequest={}\", request);\n    return executeRequest(\n        httpClient,\n        request,\n        response -> {\n          Optional<String> responseScopes =\n              response.headers().firstValue(GITHUB_OAUTH_SCOPES_HEADER);\n          String[] scopes =\n              Splitter.on(',')\n                  .trimResults()\n                  .omitEmptyStrings()\n                  .splitToList(responseScopes.orElse(\"\"))\n                  .toArray(String[]::new);\n          try {\n            String result =\n                CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n            GithubUser user = OBJECT_MAPPER.readValue(result, GithubUser.class);\n            return Pair.of(user.getLogin(), scopes);\n          } catch (IOException e) {\n            throw new UncheckedIOException(e);\n          }\n        });\n  }\n\n  /** Returns the GitHub endpoint URL. */\n  public String getServerUrl() {\n    return this.scmServerUrl.toString();\n  }\n\n  /**\n   * Builds and returns HttpRequest to acces the GitHub API.\n   *\n   * @param uri request uri\n   * @param authenticationToken authentication token, can be NULL as the GitHub can handle some\n   *     requests without authentication\n   * @return HttpRequest object\n   */\n  private HttpRequest buildGithubApiRequest(URI uri, @Nullable String authenticationToken) {\n    if (isNullOrEmpty(authenticationToken)) {\n      return HttpRequest.newBuilder(uri)\n          .headers(\"Accept\", \"application/vnd.github.v3+json\")\n          .timeout(DEFAULT_HTTP_TIMEOUT)\n          .build();\n    } else {\n      return HttpRequest.newBuilder(uri)\n          .headers(\n              \"Authorization\",\n              \"token \" + authenticationToken,\n              \"Accept\",\n              \"application/vnd.github.v3+json\")\n          .timeout(DEFAULT_HTTP_TIMEOUT)\n          .build();\n    }\n  }\n\n  private <T> T executeRequest(\n      HttpClient httpClient,\n      HttpRequest request,\n      Function<HttpResponse<InputStream>, T> responseConverter)\n      throws ScmBadRequestException,\n          ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmUnauthorizedException {\n    String provider = GITHUB_SAAS_ENDPOINT.equals(getServerUrl()) ? \"github\" : \"github-server\";\n    try {\n      HttpResponse<InputStream> response =\n          httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());\n      int statusCode = response.statusCode();\n      LOG.trace(\"executeRequest={} response {}\", request, statusCode);\n      if (statusCode == HTTP_OK) {\n        return responseConverter.apply(response);\n      } else if (statusCode == HTTP_NO_CONTENT) {\n        return null;\n      } else {\n        String body =\n            response.body() == null\n                ? \"Unrecognised error\"\n                : CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n        switch (statusCode) {\n          case HTTP_BAD_REQUEST:\n            throw new ScmBadRequestException(body);\n          case HTTP_NOT_FOUND:\n            throw new ScmItemNotFoundException(body);\n          case HTTP_UNAUTHORIZED:\n            throw new ScmUnauthorizedException(body, \"github\", \"v2\", \"\");\n          default:\n            throw new ScmCommunicationException(\n                \"Unexpected status code \" + statusCode + \" \" + body, statusCode, provider);\n        }\n      }\n    } catch (IOException | InterruptedException | UncheckedIOException e) {\n      throw new ScmCommunicationException(e.getMessage(), e, provider);\n    }\n  }\n\n  /**\n   * Checks if the provided url belongs to this client (GitHub)\n   *\n   * @param scmServerUrl the SCM url to verify\n   * @return If the provided url is recognized by the current client\n   */\n  public boolean isConnected(String scmServerUrl) {\n    return this.scmServerUrl.equals(URI.create(trimEnd(scmServerUrl, '/')));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/GithubAuthorizingFileContentProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport java.io.IOException;\nimport org.eclipse.che.api.factory.server.scm.AuthorizingFileContentProvider;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/** Github specific authorizing file content provider. */\nclass GithubAuthorizingFileContentProvider extends AuthorizingFileContentProvider<GithubUrl> {\n\n  GithubAuthorizingFileContentProvider(\n      GithubUrl githubUrl,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(githubUrl, urlFetcher, personalAccessTokenManager);\n  }\n\n  /**\n   * Formatting OAuth token as HTTP Authorization header.\n   *\n   * <p>GitHub Authorization HTTP header format is described here:\n   * https://docs.github.com/en/rest/overview/resources-in-the-rest-api#oauth2-token-sent-in-a-header\n   */\n  @Override\n  protected String formatAuthorization(String token, boolean isPAT) {\n    return \"token \" + token;\n  }\n\n  @Override\n  protected boolean isPublicRepository(GithubUrl remoteFactoryUrl) {\n    try {\n      urlFetcher.fetch(\n          remoteFactoryUrl.getHostName()\n              + '/'\n              + remoteFactoryUrl.getUsername()\n              + '/'\n              + remoteFactoryUrl.getRepository());\n      return true;\n    } catch (IOException e) {\n      return false;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/GithubCommit.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\n\npackage org.eclipse.che.api.factory.server.github;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\n\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class GithubCommit {\n\n  private String sha;\n\n  private String url;\n\n  public String getSha() {\n    return sha;\n  }\n\n  public void setSha(String sha) {\n    this.sha = sha;\n  }\n\n  public GithubCommit withSha(String sha) {\n    this.sha = sha;\n    return this;\n  }\n\n  public String getUrl() {\n    return url;\n  }\n\n  public void setUrl(String url) {\n    this.url = url;\n  }\n\n  public GithubCommit withUrl(String url) {\n    this.url = url;\n    return this;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/GithubPullRequest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\n\n@JsonIgnoreProperties(ignoreUnknown = true)\nclass GithubRepo {\n  private String name;\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  public GithubRepo withName(String name) {\n    this.name = name;\n    return this;\n  }\n}\n\n@JsonIgnoreProperties(ignoreUnknown = true)\nclass GithubHead {\n  private String ref;\n  private GithubUser user;\n  private GithubRepo repo;\n\n  public String getRef() {\n    return ref;\n  }\n\n  public void setRef(String ref) {\n    this.ref = ref;\n  }\n\n  public GithubHead withRef(String ref) {\n    this.ref = ref;\n    return this;\n  }\n\n  public GithubUser getUser() {\n    return user;\n  }\n\n  public void setUser(GithubUser user) {\n    this.user = user;\n  }\n\n  public GithubHead withUser(GithubUser user) {\n    this.user = user;\n    return this;\n  }\n\n  public GithubRepo getRepo() {\n    return repo;\n  }\n\n  public void setRepo(GithubRepo repo) {\n    this.repo = repo;\n  }\n\n  public GithubHead withRepo(GithubRepo repo) {\n    this.repo = repo;\n    return this;\n  }\n}\n\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class GithubPullRequest {\n  private String state;\n  private GithubHead head;\n\n  public String getState() {\n    return state;\n  }\n\n  public void setState(String state) {\n    this.state = state;\n  }\n\n  public GithubPullRequest withState(String state) {\n    this.state = state;\n    return this;\n  }\n\n  public GithubHead getHead() {\n    return head;\n  }\n\n  public void setHead(GithubHead head) {\n    this.head = head;\n  }\n\n  public GithubPullRequest withHead(GithubHead head) {\n    this.head = head;\n    return this;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/GithubSourceStorageBuilder.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto;\nimport org.eclipse.che.api.workspace.shared.dto.SourceStorageDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.SourceDto;\n\n/**\n * Create {@link ProjectConfigDto} object from objects\n *\n * @author Florent Benoit\n */\n@Singleton\npublic class GithubSourceStorageBuilder {\n\n  /**\n   * Create SourceStorageDto DTO by using data of a github url\n   *\n   * @param githubUrl an instance of {@link GithubUrl}\n   * @return newly created source storage DTO object\n   */\n  public SourceStorageDto buildWorkspaceConfigSource(GithubUrl githubUrl) {\n    // Create map for source storage dto\n    Map<String, String> parameters = new HashMap<>(2);\n    parameters.put(\"branch\", githubUrl.getBranch());\n\n    return newDto(SourceStorageDto.class)\n        .withLocation(githubUrl.repositoryLocation())\n        .withType(\"github\")\n        .withParameters(parameters);\n  }\n\n  /**\n   * Create SourceStorageDto DTO by using data of a github url\n   *\n   * @param githubUrl an instance of {@link GithubUrl}\n   * @return newly created source DTO object\n   */\n  public SourceDto buildDevfileSource(GithubUrl githubUrl) {\n    return newDto(SourceDto.class)\n        .withLocation(githubUrl.repositoryLocation())\n        .withType(\"github\")\n        .withBranch(githubUrl.getBranch());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/GithubUrl.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.StringJoiner;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.factory.server.urlfactory.DefaultFactoryUrl;\n\n/**\n * Representation of a github URL, allowing to get details from it.\n *\n * <p>like https://github.com/<username>/<repository>\n * https://github.com/<username>/<repository>/tree/<branch>\n *\n * @author Florent Benoit\n */\npublic class GithubUrl extends DefaultFactoryUrl {\n  private final String providerName;\n\n  private static final String HOSTNAME = \"https://github.com\";\n\n  /** Username part of github URL */\n  private String username;\n\n  private boolean isHTTPSUrl = true;\n\n  /** Repository part of the URL. */\n  private String repository;\n\n  /** Branch name */\n  private String branch;\n\n  /** SHA of the latest commit in the current branch */\n  private String latestCommit;\n\n  private String serverUrl;\n\n  private boolean disableSubdomainIsolation;\n\n  /** Devfile filenames list */\n  private final List<String> devfileFilenames = new ArrayList<>();\n\n  /**\n   * Creation of this instance is made by the parser so user may not need to create a new instance\n   * directly\n   */\n  protected GithubUrl(String providerName) {\n    this.providerName = providerName;\n  }\n\n  @Override\n  public String getProviderName() {\n    return providerName;\n  }\n\n  /**\n   * Gets username of this github url\n   *\n   * @return the username part\n   */\n  public String getUsername() {\n    return this.username;\n  }\n\n  public GithubUrl withUsername(String userName) {\n    this.username = userName;\n    return this;\n  }\n\n  public GithubUrl setIsHTTPSUrl(boolean isHTTPSUrl) {\n    this.isHTTPSUrl = isHTTPSUrl;\n    return this;\n  }\n\n  /**\n   * Gets repository of this github url\n   *\n   * @return the repository part\n   */\n  public String getRepository() {\n    return this.repository;\n  }\n\n  protected GithubUrl withRepository(String repository) {\n    this.repository = repository;\n    return this;\n  }\n\n  protected GithubUrl withDevfileFilenames(List<String> devfileFilenames) {\n    this.devfileFilenames.addAll(devfileFilenames);\n    return this;\n  }\n\n  @Override\n  public void setDevfileFilename(String devfileName) {\n    this.devfileFilenames.clear();\n    this.devfileFilenames.add(devfileName);\n  }\n\n  /**\n   * Gets branch of this github url\n   *\n   * @return the branch part\n   */\n  public String getBranch() {\n    return this.branch;\n  }\n\n  protected GithubUrl withBranch(String branch) {\n    if (!isNullOrEmpty(branch)) {\n      this.branch = branch;\n    }\n    return this;\n  }\n\n  /**\n   * Retuna SHA of the latest commimt\n   *\n   * @return latest commit SHA\n   */\n  public String getLatestCommit() {\n    return this.latestCommit;\n  }\n\n  /**\n   * Sets SHA of the latest commit\n   *\n   * @param latestCommit latest commit SHA\n   */\n  protected GithubUrl withLatestCommit(String latestCommit) {\n    if (!isNullOrEmpty(latestCommit)) {\n      this.latestCommit = latestCommit;\n    }\n    return this;\n  }\n\n  public GithubUrl withServerUrl(String serverUrl) {\n    this.serverUrl = serverUrl;\n    return this;\n  }\n\n  public GithubUrl withDisableSubdomainIsolation(boolean disableSubdomainIsolation) {\n    this.disableSubdomainIsolation = disableSubdomainIsolation;\n    return this;\n  }\n\n  /**\n   * Provides list of configured devfile filenames with locations\n   *\n   * @return list of devfile filenames and locations\n   */\n  @Override\n  public List<DevfileLocation> devfileFileLocations() {\n    return devfileFilenames.stream().map(this::createDevfileLocation).collect(Collectors.toList());\n  }\n\n  private DevfileLocation createDevfileLocation(String devfileFilename) {\n    return new DevfileLocation() {\n      @Override\n      public Optional<String> filename() {\n        return Optional.of(devfileFilename);\n      }\n\n      @Override\n      public String location() {\n        return rawFileLocation(devfileFilename);\n      }\n    };\n  }\n\n  /**\n   * Provides location to raw content of specified file\n   *\n   * @return location of specified file in a repository\n   */\n  public String rawFileLocation(String fileName) {\n    String branchName = latestCommit != null ? latestCommit : branch != null ? branch : \"HEAD\";\n\n    final String rawBaseUrl;\n    if (HOSTNAME.equals(serverUrl)) {\n      rawBaseUrl = \"https://raw.githubusercontent.com\";\n    } else {\n      // IPv6 addresses (recognised by \"://[\") cannot carry a \"raw.\" subdomain prefix.\n      // Treat them the same as servers with subdomain isolation disabled.\n      boolean isIPv6 = serverUrl.contains(\"://[\");\n      if (disableSubdomainIsolation || isIPv6) {\n        rawBaseUrl = serverUrl + \"/raw\";\n      } else {\n        rawBaseUrl =\n            serverUrl.substring(0, serverUrl.indexOf(\"://\") + 3)\n                + \"raw.\"\n                + serverUrl.substring(serverUrl.indexOf(\"://\") + 3);\n      }\n    }\n    return new StringJoiner(\"/\")\n        .add(rawBaseUrl)\n        .add(username)\n        .add(repository)\n        .add(branchName)\n        .add(fileName)\n        .toString();\n  }\n\n  @Override\n  public String getHostName() {\n    // TODO: rework this method to return hostname in format https://<hostname>/user/repo\n    return serverUrl;\n  }\n\n  /**\n   * Provides location to the repository part of the full github URL.\n   *\n   * @return location of the repository.\n   */\n  protected String repositoryLocation() {\n    if (isHTTPSUrl) {\n      return serverUrl + \"/\" + this.username + \"/\" + this.repository + \".git\";\n    }\n    return \"git@\"\n        + getHostName().substring(getHostName().indexOf(\"://\") + 3)\n        + \":\"\n        + this.username\n        + \"/\"\n        + this.repository\n        + \".git\";\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/GithubUser.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.github;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport java.util.Objects;\n\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class GithubUser {\n\n  private long id;\n  private String login;\n  private String email;\n  private String name;\n\n  public long getId() {\n    return id;\n  }\n\n  public void setId(long id) {\n    this.id = id;\n  }\n\n  public GithubUser withId(long id) {\n    this.id = id;\n    return this;\n  }\n\n  public String getLogin() {\n    return login;\n  }\n\n  public void setLogin(String login) {\n    this.login = login;\n  }\n\n  public GithubUser withLogin(String login) {\n    this.login = login;\n    return this;\n  }\n\n  public String getEmail() {\n    return email;\n  }\n\n  public void setEmail(String email) {\n    this.email = email;\n  }\n\n  public GithubUser withEmail(String email) {\n    this.email = email;\n    return this;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  public GithubUser withName(String name) {\n    this.name = name;\n    return this;\n  }\n\n  @Override\n  public String toString() {\n    return \"GithubUser{\"\n        + \"id=\"\n        + id\n        + \", login='\"\n        + login\n        + '\\''\n        + \", email='\"\n        + email\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + '}';\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    GithubUser that = (GithubUser) o;\n    return id == that.id\n        && Objects.equals(login, that.login)\n        && Objects.equals(email, that.email)\n        && Objects.equals(name, that.name);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, login, email, name);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-factory-gitlab</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Factory Resolver Gitlab</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-gitlab-common</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.github.tomakehurst</groupId>\n            <artifactId>wiremock-jre8-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-shared</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>jcl-over-slf4j</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.wiremock</groupId>\n            <artifactId>wiremock-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabFactoryParametersResolver.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.FactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/**\n * Provides Factory Parameters resolver for Gitlab repositories.\n *\n * @author Max Shaposhnyk\n */\n@Singleton\npublic class GitlabFactoryParametersResolver extends AbstractGitlabFactoryParametersResolver\n    implements FactoryParametersResolver {\n\n  private static final String PROVIDER_NAME = \"gitlab\";\n\n  @Inject\n  public GitlabFactoryParametersResolver(\n      URLFactoryBuilder urlFactoryBuilder,\n      URLFetcher urlFetcher,\n      GitlabUrlParser gitlabURLParser,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      AuthorisationRequestManager authorisationRequestManager) {\n    super(\n        urlFactoryBuilder,\n        urlFetcher,\n        gitlabURLParser,\n        personalAccessTokenManager,\n        authorisationRequestManager,\n        PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabFactoryParametersResolverSecond.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.factory.server.FactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/**\n * Provides Factory Parameters resolver for Gitlab repositories.\n *\n * @author Max Shaposhnyk\n */\n@Singleton\npublic class GitlabFactoryParametersResolverSecond extends AbstractGitlabFactoryParametersResolver\n    implements FactoryParametersResolver {\n\n  private static final String PROVIDER_NAME = \"gitlab_2\";\n\n  @Inject\n  public GitlabFactoryParametersResolverSecond(\n      URLFactoryBuilder urlFactoryBuilder,\n      URLFetcher urlFetcher,\n      GitlabUrlParserSecond gitlabURLParser,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      AuthorisationRequestManager authorisationRequestManager) {\n    super(\n        urlFactoryBuilder,\n        urlFetcher,\n        gitlabURLParser,\n        personalAccessTokenManager,\n        authorisationRequestManager,\n        PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabModule.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\nimport org.eclipse.che.api.factory.server.scm.GitUserDataFetcher;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher;\n\npublic class GitlabModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    Multibinder<PersonalAccessTokenFetcher> tokenFetcherMultibinder =\n        Multibinder.newSetBinder(binder(), PersonalAccessTokenFetcher.class);\n    tokenFetcherMultibinder.addBinding().to(GitlabOAuthTokenFetcher.class);\n    tokenFetcherMultibinder.addBinding().to(GitlabOAuthTokenFetcherSecond.class);\n\n    Multibinder<GitUserDataFetcher> gitUserDataMultibinder =\n        Multibinder.newSetBinder(binder(), GitUserDataFetcher.class);\n    gitUserDataMultibinder.addBinding().to(GitlabUserDataFetcher.class);\n    gitUserDataMultibinder.addBinding().to(GitlabUserDataFetcherSecond.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabOAuthTokenFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.security.oauth.OAuthAPI;\n\n/** GitLab OAuth token retriever. */\npublic class GitlabOAuthTokenFetcher extends AbstractGitlabOAuthTokenFetcher {\n\n  private static final String OAUTH_PROVIDER_NAME = \"gitlab\";\n\n  @Inject\n  public GitlabOAuthTokenFetcher(\n      @Nullable @Named(\"che.integration.gitlab.oauth_endpoint\") String serverUrl,\n      @Named(\"che.api\") String apiEndpoint,\n      OAuthAPI oAuthAPI) {\n    super(serverUrl, apiEndpoint, oAuthAPI, OAUTH_PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabOAuthTokenFetcherSecond.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.security.oauth.OAuthAPI;\n\n/** GitLab OAuth token retriever. */\npublic class GitlabOAuthTokenFetcherSecond extends AbstractGitlabOAuthTokenFetcher {\n\n  private static final String OAUTH_PROVIDER_NAME = \"gitlab_2\";\n\n  @Inject\n  public GitlabOAuthTokenFetcherSecond(\n      @Nullable @Named(\"che.integration.gitlab.oauth_endpoint_2\") String serverUrl,\n      @Named(\"che.api\") String apiEndpoint,\n      OAuthAPI oAuthAPI) {\n    super(serverUrl, apiEndpoint, oAuthAPI, OAUTH_PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabScmFileResolver.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/** GitLab specific SCM file resolver. */\npublic class GitlabScmFileResolver extends AbstractGitlabScmFileResolver {\n\n  @Inject\n  public GitlabScmFileResolver(\n      GitlabUrlParser gitlabUrlParser,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(gitlabUrlParser, urlFetcher, personalAccessTokenManager);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabScmFileResolverSecond.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/** GitLab specific SCM file resolver. */\npublic class GitlabScmFileResolverSecond extends AbstractGitlabScmFileResolver {\n\n  @Inject\n  public GitlabScmFileResolverSecond(\n      GitlabUrlParserSecond gitlabUrlParser,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(gitlabUrlParser, urlFetcher, personalAccessTokenManager);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabUrlParser.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Parser of String Gitlab URLs and provide {@link GitlabUrl} objects.\n *\n * @author Max Shaposhnyk\n */\npublic class GitlabUrlParser extends AbstractGitlabUrlParser {\n\n  private static final String OAUTH_PROVIDER_NAME = \"gitlab\";\n\n  @Inject\n  public GitlabUrlParser(\n      @Nullable @Named(\"che.integration.gitlab.oauth_endpoint\") String serverUrl,\n      DevfileFilenamesProvider devfileFilenamesProvider,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(serverUrl, devfileFilenamesProvider, personalAccessTokenManager, OAUTH_PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabUrlParserSecond.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Parser of String Gitlab URLs and provide {@link GitlabUrl} objects.\n *\n * @author Max Shaposhnyk\n */\npublic class GitlabUrlParserSecond extends AbstractGitlabUrlParser {\n\n  private static final String OAUTH_PROVIDER_NAME = \"gitlab_2\";\n\n  @Inject\n  public GitlabUrlParserSecond(\n      @Nullable @Named(\"che.integration.gitlab.oauth_endpoint_2\") String serverUrl,\n      DevfileFilenamesProvider devfileFilenamesProvider,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(serverUrl, devfileFilenamesProvider, personalAccessTokenManager, OAUTH_PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabUserDataFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.factory.server.scm.*;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/** Gitlab OAuth token retriever. */\npublic class GitlabUserDataFetcher extends AbstractGitlabUserDataFetcher {\n\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  private static final String OAUTH_PROVIDER_NAME = \"gitlab\";\n\n  @Inject\n  public GitlabUserDataFetcher(\n      @Nullable @Named(\"che.integration.gitlab.oauth_endpoint\") String serverUrl,\n      @Named(\"che.api\") String apiEndpoint,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(serverUrl, apiEndpoint, personalAccessTokenManager, OAUTH_PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabUserDataFetcherSecond.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.factory.server.scm.*;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/** Gitlab OAuth token retriever. */\npublic class GitlabUserDataFetcherSecond extends AbstractGitlabUserDataFetcher {\n\n  /** Name of this OAuth provider as found in OAuthAPI. */\n  private static final String OAUTH_PROVIDER_NAME = \"gitlab_2\";\n\n  @Inject\n  public GitlabUserDataFetcherSecond(\n      @Nullable @Named(\"che.integration.gitlab.oauth_endpoint_2\") String serverUrl,\n      @Named(\"che.api\") String apiEndpoint,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(serverUrl, apiEndpoint, personalAccessTokenManager, OAUTH_PROVIDER_NAME);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabApiClientTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.equalTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static org.eclipse.che.api.factory.server.gitlab.GitlabOAuthTokenFetcher.DEFAULT_TOKEN_SCOPES;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.common.collect.Sets;\nimport com.google.common.net.HttpHeaders;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GitlabApiClientTest {\n\n  private GitlabApiClient client;\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  @BeforeMethod\n  void start() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    wireMock = new WireMock(\"localhost\", wireMockServer.port());\n    client = new GitlabApiClient(wireMockServer.url(\"/\"));\n  }\n\n  @AfterMethod\n  void stop() {\n    wireMockServer.stop();\n  }\n\n  @Test\n  public void testGetUser() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/api/v4/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token1\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"gitlab/rest/api/v4/user/response.json\")));\n\n    GitlabUser user = client.getUser(\"token1\");\n    assertNotNull(user);\n  }\n\n  @Test\n  public void shouldGetPersonalAccessTokenInfo() throws Exception {\n    // given\n    stubFor(\n        get(urlEqualTo(\"/api/v4/personal_access_tokens/self\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token1\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"gitlab/rest/api/v4/user/PAT_info.json\")));\n\n    // when\n    GitlabPersonalAccessTokenInfo tokenInfo = client.getPersonalAccessTokenInfo(\"token1\");\n\n    // then\n    assertNotNull(tokenInfo);\n    assertEquals(tokenInfo.getId(), 1);\n    assertTrue(Sets.newHashSet(tokenInfo.getScopes()).containsAll(DEFAULT_TOKEN_SCOPES));\n  }\n\n  @Test\n  public void shouldReturnFalseOnConnectedToOtherHost() {\n    assertFalse(client.isConnected(\"https://other.com\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabAuthorizingFileContentProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static java.lang.String.format;\nimport static java.net.HttpURLConnection.HTTP_MOVED_TEMP;\nimport static java.net.HttpURLConnection.HTTP_OK;\nimport static org.mockito.ArgumentMatchers.*;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport java.io.FileNotFoundException;\nimport java.net.URI;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GitlabAuthorizingFileContentProviderTest {\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n  @Mock private URLFetcher urlFetcher;\n\n  private WireMockServer wireMockServer;\n  private WireMock wireMock;\n\n  @BeforeMethod\n  public void start() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    wireMock = new WireMock(\"localhost\", wireMockServer.port());\n  }\n\n  @AfterMethod\n  void stop() {\n    wireMockServer.stop();\n  }\n\n  @Test\n  public void shouldExpandRelativePaths() throws Exception {\n    GitlabUrl gitlabUrl = new GitlabUrl().withHostName(\"gitlab.net\").withSubGroups(\"eclipse/che\");\n    FileContentProvider fileContentProvider =\n        new GitlabAuthorizingFileContentProvider(gitlabUrl, urlFetcher, personalAccessTokenManager);\n    var personalAccessToken = new PersonalAccessToken(\"foo\", \"provider\", \"che\", \"my-token\");\n    when(personalAccessTokenManager.getAndStore(anyString())).thenReturn(personalAccessToken);\n    fileContentProvider.fetchContent(\"devfile.yaml\");\n    verify(urlFetcher)\n        .fetch(\n            eq(\n                \"https://gitlab.net/api/v4/projects/eclipse%2Fche/repository/files/devfile.yaml/raw?ref=HEAD\"),\n            eq(\"Bearer my-token\"));\n  }\n\n  @Test\n  public void shouldPreserveAbsolutePaths() throws Exception {\n    GitlabUrl gitlabUrl = new GitlabUrl().withHostName(\"gitlab.net\").withSubGroups(\"eclipse/che\");\n    FileContentProvider fileContentProvider =\n        new GitlabAuthorizingFileContentProvider(gitlabUrl, urlFetcher, personalAccessTokenManager);\n    String url =\n        \"https://gitlab.net/api/v4/projects/eclipse%2Fche/repository/files/devfile.yaml/raw\";\n    var personalAccessToken = new PersonalAccessToken(url, \"provider\", \"che\", \"my-token\");\n    when(personalAccessTokenManager.getAndStore(anyString())).thenReturn(personalAccessToken);\n\n    fileContentProvider.fetchContent(url);\n    verify(urlFetcher).fetch(eq(url), eq(\"Bearer my-token\"));\n  }\n\n  @Test(expectedExceptions = FileNotFoundException.class)\n  public void shouldThrowFileNotFoundException() throws Exception {\n    // given\n    when(urlFetcher.fetch(\n            eq(\n                wireMockServer.url(\n                    \"/api/v4/projects/eclipse%2Fche/repository/files/devfile.yaml/raw?ref=HEAD\"))))\n        .thenThrow(new FileNotFoundException());\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenThrow(new UnknownScmProviderException(\"\", \"\"));\n    URI uri = URI.create(wireMockServer.url(\"/\"));\n    GitlabUrl gitlabUrl =\n        new GitlabUrl()\n            .withScheme(\"http\")\n            .withHostName(format(\"%s:%s\", uri.getHost(), uri.getPort()))\n            .withSubGroups(\"eclipse/che\");\n    FileContentProvider fileContentProvider =\n        new GitlabAuthorizingFileContentProvider(gitlabUrl, urlFetcher, personalAccessTokenManager);\n\n    stubFor(get(urlEqualTo(\"/eclipse/che\")).willReturn(aResponse().withStatus(HTTP_OK)));\n\n    // when\n    fileContentProvider.fetchContent(\"devfile.yaml\");\n  }\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp = \"Could not reach devfile at test path\")\n  public void shouldThrowDevfileException() throws Exception {\n    // given\n    when(urlFetcher.fetch(\n            eq(\n                wireMockServer.url(\n                    \"/api/v4/projects/eclipse%2Fche/repository/files/devfile.yaml/raw?ref=HEAD\"))))\n        .thenThrow(new FileNotFoundException(\"test path\"));\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenThrow(new UnknownScmProviderException(\"\", \"\"));\n    URI uri = URI.create(wireMockServer.url(\"/\"));\n    GitlabUrl gitlabUrl =\n        new GitlabUrl()\n            .withScheme(\"http\")\n            .withHostName(format(\"%s:%s\", uri.getHost(), uri.getPort()))\n            .withSubGroups(\"eclipse/che\");\n    FileContentProvider fileContentProvider =\n        new GitlabAuthorizingFileContentProvider(gitlabUrl, urlFetcher, personalAccessTokenManager);\n\n    stubFor(get(urlEqualTo(\"/eclipse/che\")).willReturn(aResponse().withStatus(HTTP_MOVED_TEMP)));\n\n    // when\n    fileContentProvider.fetchContent(\"devfile.yaml\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabCustomPortUrlParserTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static org.mockito.Mockito.mock;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GitlabCustomPortUrlParserTest {\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  /** Instance of component that will be tested. */\n  private GitlabUrlParser gitlabUrlParser;\n\n  private WireMockServer wireMockServer;\n  private WireMock wireMock;\n\n  @BeforeClass\n  public void prepare() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    wireMock = new WireMock(\"localhost\", wireMockServer.port());\n  }\n\n  @BeforeMethod\n  public void setUp() {\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://gitlab.custom.com:31280\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n  }\n\n  /** Check URLs are valid with regexp */\n  @Test(dataProvider = \"UrlsProvider\")\n  public void checkRegexp(String url) {\n    assertTrue(gitlabUrlParser.isValid(url), \"url \" + url + \" is invalid\");\n  }\n\n  /** Compare parsing */\n  @Test(dataProvider = \"parsing\")\n  public void checkParsing(String url, String project, String subGroups, String branch) {\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(url, null);\n\n    assertEquals(gitlabUrl.getProject(), project);\n    assertEquals(gitlabUrl.getSubGroups(), subGroups);\n    assertEquals(gitlabUrl.getBranch(), branch);\n  }\n\n  /** Compare parsing */\n  @Test(dataProvider = \"parsing\")\n  public void shouldParseWithoutPredefinedEndpoint(\n      String url, String project, String subGroups, String branch) {\n    // given\n    gitlabUrlParser =\n        new GitlabUrlParser(null, devfileFilenamesProvider, mock(PersonalAccessTokenManager.class));\n    // when\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(url, null);\n\n    // then\n    assertEquals(gitlabUrl.getProject(), project);\n    assertEquals(gitlabUrl.getSubGroups(), subGroups);\n    assertEquals(gitlabUrl.getBranch(), branch);\n  }\n\n  @Test\n  public void shouldValidateUrlByApiRequest() {\n    // given\n    String url = wireMockServer.url(\"/user/repo\");\n    stubFor(\n        get(urlEqualTo(\"/oauth/token/info\"))\n            .willReturn(\n                aResponse()\n                    .withStatus(401)\n                    .withBody(\n                        \"{\\\"error\\\":\\\"invalid_token\\\",\\\"error_description\\\":\\\"The access token is invalid\\\",\\\"state\\\":\\\"unauthorized\\\"}\")));\n\n    // when\n    boolean result = gitlabUrlParser.isValid(url);\n\n    // then\n    assertTrue(result);\n  }\n\n  @Test\n  public void shouldNotValidateUrlByApiRequestWithPlainStringResponse() {\n    // given\n    String url = wireMockServer.url(\"/user/repo\");\n    stubFor(\n        get(urlEqualTo(\"/oauth/token/info\"))\n            .willReturn(aResponse().withStatus(401).withBody(\"plain string error\")));\n\n    // when\n    boolean result = gitlabUrlParser.isValid(url);\n\n    // then\n    assertFalse(result);\n  }\n\n  @Test\n  public void shouldNotValidateUrlByApiRequest() {\n    // given\n    String url = wireMockServer.url(\"/user/repo\");\n    stubFor(get(urlEqualTo(\"/oauth/token/info\")).willReturn(aResponse().withStatus(500)));\n\n    // when\n    boolean result = gitlabUrlParser.isValid(url);\n\n    // then\n    assertFalse(result);\n  }\n\n  @DataProvider(name = \"UrlsProvider\")\n  public Object[][] urls() {\n    return new Object[][] {\n      {\"https://gitlab.custom.com:31280/user/project/test1.git\"},\n      {\"https://gitlab.custom.com:31280/user/project1.git\"},\n      {\"https://gitlab.custom.com:31280/scm/project/test1.git\"},\n      {\"https://gitlab.custom.com:31280/user/project/\"},\n      {\"https://gitlab.custom.com:31280/user/project/repo/\"},\n      {\"https://gitlab.custom.com:31280/user/project/-/tree/master/\"},\n      {\"https://gitlab.custom.com:31280/user/project/repo/-/tree/master/subfolder\"},\n      {\"git@gitlab.custom.com:user/project/test1.git\"},\n      {\"git@gitlab.custom.com:user/project1.git\"},\n      {\"git@gitlab.custom.com:scm/project/test1.git\"},\n      {\"git@gitlab.custom.com:user/project/\"},\n      {\"git@gitlab.custom.com:user/project/repo/\"},\n    };\n  }\n\n  @DataProvider(name = \"parsing\")\n  public Object[][] expectedParsing() {\n    return new Object[][] {\n      {\"https://gitlab.custom.com:31280/user/project1.git\", \"project1\", \"user/project1\", null},\n      {\n        \"https://gitlab.custom.com:31280/user/project/test1.git\",\n        \"test1\",\n        \"user/project/test1\",\n        null\n      },\n      {\n        \"https://gitlab.custom.com:31280/user/project/group1/group2/test1.git\",\n        \"test1\",\n        \"user/project/group1/group2/test1\",\n        null\n      },\n      {\"https://gitlab.custom.com:31280/user/project/\", \"project\", \"user/project\", null},\n      {\"https://gitlab.custom.com:31280/user/project/repo/\", \"repo\", \"user/project/repo\", null},\n      {\"git@gitlab.custom.com:user/project1.git\", \"project1\", \"user/project1\", null},\n      {\"git@gitlab.custom.com:user/project/test1.git\", \"test1\", \"user/project/test1\", null},\n      {\n        \"git@gitlab.custom.com:user/project/group1/group2/test1.git\",\n        \"test1\",\n        \"user/project/group1/group2/test1\",\n        null\n      },\n      {\"git@gitlab.custom.com:user/project/\", \"project\", \"user/project\", null},\n      {\"git@gitlab.custom.com:user/project/repo/\", \"repo\", \"user/project/repo\", null},\n      {\n        \"https://gitlab.custom.com:31280/user/project/-/tree/master/\",\n        \"project\",\n        \"user/project\",\n        \"master\"\n      },\n      {\n        \"https://gitlab.custom.com:31280/user/project/repo/-/tree/foo\",\n        \"repo\",\n        \"user/project/repo\",\n        \"foo\"\n      },\n      {\n        \"https://gitlab.custom.com:31280/user/project/repo/-/tree/branch/with/slash\",\n        \"repo\",\n        \"user/project/repo\",\n        \"branch/with/slash\"\n      },\n      {\n        \"https://gitlab.custom.com:31280/user/project/group1/group2/repo/-/tree/foo/\",\n        \"repo\",\n        \"user/project/group1/group2/repo\",\n        \"foo\"\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabFactoryParametersResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.factory.shared.Constants.CURRENT_VERSION;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.eclipse.che.security.oauth1.OAuthAuthenticationService.ERROR_QUERY_NAME;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyBoolean;\nimport static org.mockito.ArgumentMatchers.anyMap;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.model.factory.ScmInfo;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.ScmInfoDto;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Validate operations performed by the Github Factory service\n *\n * @author Florent Benoit\n */\n@Listeners(MockitoTestNGListener.class)\npublic class GitlabFactoryParametersResolverTest {\n\n  @Mock private URLFactoryBuilder urlFactoryBuilder;\n\n  @Mock private URLFetcher urlFetcher;\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  GitlabUrlParser gitlabUrlParser;\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n\n  @Mock private AuthorisationRequestManager authorisationRequestManager;\n\n  private GitlabFactoryParametersResolver gitlabFactoryParametersResolver;\n\n  @BeforeMethod\n  protected void init() {\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"http://gitlab.2mcl.com\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n    assertNotNull(this.gitlabUrlParser);\n    gitlabFactoryParametersResolver =\n        new GitlabFactoryParametersResolver(\n            urlFactoryBuilder,\n            urlFetcher,\n            gitlabUrlParser,\n            personalAccessTokenManager,\n            authorisationRequestManager);\n    assertNotNull(this.gitlabFactoryParametersResolver);\n  }\n\n  /** Check url which is not a Gitlab url can't be accepted by this resolver */\n  @Test\n  public void checkInvalidAcceptUrl() {\n    Map<String, String> parameters =\n        singletonMap(URL_PARAMETER_NAME, \"http://github.com/user/repo\");\n    // shouldn't be accepted\n    assertFalse(gitlabFactoryParametersResolver.accept(parameters));\n  }\n\n  /** Check Gitlab url will be be accepted by this resolver */\n  @Test\n  public void checkValidAcceptUrl() {\n    Map<String, String> parameters =\n        singletonMap(URL_PARAMETER_NAME, \"http://gitlab.2mcl.com/test/proj/repo.git\");\n    // should be accepted\n    assertTrue(gitlabFactoryParametersResolver.accept(parameters));\n  }\n\n  @Test\n  public void shouldGenerateDevfileForFactoryWithNoDevfileOrJson() throws Exception {\n\n    String gitlabUrl = \"http://gitlab.2mcl.com/test/proj/repo.git\";\n\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.empty());\n    Map<String, String> params = ImmutableMap.of(URL_PARAMETER_NAME, gitlabUrl);\n    // when\n    FactoryDevfileV2Dto factory =\n        (FactoryDevfileV2Dto) gitlabFactoryParametersResolver.createFactory(params);\n    // then\n    ScmInfoDto scmInfo = factory.getScmInfo();\n    assertEquals(scmInfo.getRepositoryUrl(), gitlabUrl);\n    assertEquals(scmInfo.getBranch(), null);\n  }\n\n  @Test\n  public void shouldSetDefaultProjectIntoDevfileIfNotSpecified() throws Exception {\n\n    String gitlabUrl = \"http://gitlab.2mcl.com/test/proj/repo/-/tree/foobar\";\n\n    FactoryDevfileV2Dto computedFactory = generateDevfileV2Factory();\n\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.of(computedFactory));\n\n    Map<String, String> params = ImmutableMap.of(URL_PARAMETER_NAME, gitlabUrl);\n    // when\n    FactoryDevfileV2Dto factory =\n        (FactoryDevfileV2Dto) gitlabFactoryParametersResolver.createFactory(params);\n    // then\n    assertNotNull(factory.getDevfile());\n    ScmInfoDto source = factory.getScmInfo();\n    assertEquals(source.getRepositoryUrl(), \"http://gitlab.2mcl.com/test/proj/repo.git\");\n    assertEquals(source.getBranch(), \"foobar\");\n  }\n\n  @Test\n  public void shouldCreateFactoryWithoutAuthentication() throws ApiException {\n    // given\n    String gitlabUrl = \"https://gitlab.com/user/repo.git\";\n    Map<String, String> params =\n        ImmutableMap.of(URL_PARAMETER_NAME, gitlabUrl, ERROR_QUERY_NAME, \"access_denied\");\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.of(generateDevfileV2Factory()));\n\n    // when\n    gitlabFactoryParametersResolver.createFactory(params);\n\n    // then\n    verify(urlFactoryBuilder)\n        .createFactoryFromDevfile(\n            any(GitlabUrl.class),\n            any(GitlabAuthorizingFileContentProvider.class),\n            anyMap(),\n            eq(true));\n  }\n\n  @Test\n  public void shouldSetScmInfoIntoDevfileV2() throws Exception {\n\n    String gitlabUrl = \"http://gitlab.2mcl.com/eclipse/che/-/tree/foobar\";\n\n    FactoryDevfileV2Dto computedFactory = generateDevfileV2Factory();\n\n    when(urlFactoryBuilder.createFactoryFromDevfile(\n            any(RemoteFactoryUrl.class), any(), anyMap(), anyBoolean()))\n        .thenReturn(Optional.of(computedFactory));\n\n    Map<String, String> params = ImmutableMap.of(URL_PARAMETER_NAME, gitlabUrl);\n    // when\n    FactoryDevfileV2Dto factory =\n        (FactoryDevfileV2Dto) gitlabFactoryParametersResolver.createFactory(params);\n    // then\n    ScmInfo scmInfo = factory.getScmInfo();\n    assertNotNull(scmInfo);\n    assertEquals(scmInfo.getScmProviderName(), \"gitlab\");\n    assertEquals(scmInfo.getRepositoryUrl(), \"http://gitlab.2mcl.com/eclipse/che.git\");\n    assertEquals(scmInfo.getBranch(), \"foobar\");\n  }\n\n  private FactoryDevfileV2Dto generateDevfileV2Factory() {\n    return newDto(FactoryDevfileV2Dto.class)\n        .withV(CURRENT_VERSION)\n        .withSource(\"repo\")\n        .withDevfile(Map.of(\"schemaVersion\", \"2.0.0\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabOAuthTokenFetcherTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.equalTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static java.net.HttpURLConnection.HTTP_FORBIDDEN;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.common.net.HttpHeaders;\nimport java.util.Collections;\nimport java.util.Optional;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenParams;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GitlabOAuthTokenFetcherTest {\n\n  @Mock OAuthAPI oAuthAPI;\n  GitlabOAuthTokenFetcher oAuthTokenFetcher;\n\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  @BeforeMethod\n  void start() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    wireMock = new WireMock(\"localhost\", wireMockServer.port());\n    oAuthTokenFetcher =\n        new GitlabOAuthTokenFetcher(wireMockServer.url(\"/\"), \"http://che.api\", oAuthAPI);\n  }\n\n  @AfterMethod\n  void stop() {\n    wireMockServer.stop();\n  }\n\n  @Test(\n      expectedExceptions = ScmCommunicationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: \\\\[api, write_repository]\")\n  public void shouldThrowExceptionOnInsufficientTokenScopes() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    OAuthToken oAuthToken = newDto(OAuthToken.class).withToken(\"oauthtoken\").withScope(\"api repo\");\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenReturn(oAuthToken);\n\n    stubFor(\n        get(urlEqualTo(\"/api/v4/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer oauthtoken\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"gitlab/rest/api/v4/user/response.json\")));\n\n    stubFor(\n        get(urlEqualTo(\"/oauth/token/info\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer oauthtoken\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"gitlab/rest/api/v4/user/token_info_lack_scopes.json\")));\n\n    oAuthTokenFetcher.fetchPersonalAccessToken(subject, wireMockServer.url(\"/\"));\n  }\n\n  @Test(\n      expectedExceptions = ScmUnauthorizedException.class,\n      expectedExceptionsMessageRegExp = \"Username is not authorized in gitlab OAuth provider.\")\n  public void shouldThrowUnauthorizedExceptionWhenUserNotLoggedIn() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenThrow(UnauthorizedException.class);\n\n    oAuthTokenFetcher.fetchPersonalAccessToken(subject, wireMockServer.url(\"/\"));\n  }\n\n  @Test\n  public void shouldReturnToken() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    OAuthToken oAuthToken =\n        newDto(OAuthToken.class).withToken(\"oauthtoken\").withScope(\"api write_repository openid\");\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenReturn(oAuthToken);\n\n    stubFor(\n        get(urlEqualTo(\"/oauth/token/info\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer oauthtoken\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"gitlab/rest/api/v4/user/token_info.json\")));\n\n    stubFor(\n        get(urlEqualTo(\"/api/v4/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer oauthtoken\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"gitlab/rest/api/v4/user/response.json\")));\n\n    PersonalAccessToken token =\n        oAuthTokenFetcher.fetchPersonalAccessToken(subject, wireMockServer.url(\"/\"));\n    assertNotNull(token);\n  }\n\n  @Test(\n      expectedExceptions = ScmCommunicationException.class,\n      expectedExceptionsMessageRegExp =\n          \"OAuth 2 is not configured for SCM provider \\\\[gitlab\\\\]. For details, refer \"\n              + \"the documentation in section of SCM providers configuration.\")\n  public void shouldThrowScmCommunicationExceptionWhenNoOauthIsConfigured() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    GitlabOAuthTokenFetcher localFetcher =\n        new GitlabOAuthTokenFetcher(wireMockServer.url(\"/\"), \"http://che.api\", null);\n    localFetcher.fetchPersonalAccessToken(subject, wireMockServer.url(\"/\"));\n  }\n\n  @Test\n  public void shouldValidateOAuthToken() throws Exception {\n    stubFor(\n        get(urlEqualTo(\"/api/v4/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token123\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"gitlab/rest/api/v4/user/response.json\")));\n    stubFor(\n        get(urlEqualTo(\"/oauth/token/info\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer token123\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"gitlab/rest/api/v4/user/token_info.json\")));\n\n    PersonalAccessTokenParams params =\n        new PersonalAccessTokenParams(\n            wireMockServer.baseUrl(),\n            \"provider\",\n            \"oauth2-token-name\",\n            \"tid-23434\",\n            \"token123\",\n            null);\n\n    Optional<Pair<Boolean, String>> valid = oAuthTokenFetcher.isValid(params);\n\n    assertTrue(valid.isPresent());\n    assertTrue(valid.get().first);\n  }\n\n  @Test(\n      expectedExceptions = ScmUnauthorizedException.class,\n      expectedExceptionsMessageRegExp = \"Username is not authorized in gitlab OAuth provider.\")\n  public void shouldThrowUnauthorizedExceptionIfTokenIsNotValid() throws Exception {\n    Subject subject = new SubjectImpl(\"Username\", Collections.emptyList(), \"id1\", \"token\", false);\n    OAuthToken oAuthToken = newDto(OAuthToken.class).withToken(\"token\").withScope(\"\");\n    when(oAuthAPI.getOrRefreshToken(anyString())).thenReturn(oAuthToken);\n    stubFor(\n        get(urlEqualTo(\"/api/v4/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"token token\"))\n            .willReturn(aResponse().withStatus(HTTP_FORBIDDEN)));\n\n    oAuthTokenFetcher.fetchPersonalAccessToken(subject, wireMockServer.url(\"/\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabScmFileResolverTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.*;\n\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GitlabScmFileResolverTest {\n\n  public static final String SCM_URL = \"http://gitlab.2mcl.com\";\n  GitlabUrlParser gitlabUrlParser;\n\n  @Mock private URLFetcher urlFetcher;\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n  @Mock private PersonalAccessTokenManager personalAccessTokenManager;\n\n  private GitlabScmFileResolver gitlabScmFileResolver;\n\n  @BeforeMethod\n  protected void init() {\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            SCM_URL, devfileFilenamesProvider, mock(PersonalAccessTokenManager.class));\n    assertNotNull(this.gitlabUrlParser);\n    gitlabScmFileResolver =\n        new GitlabScmFileResolver(gitlabUrlParser, urlFetcher, personalAccessTokenManager);\n    assertNotNull(this.gitlabScmFileResolver);\n  }\n\n  /** Check url which is not a Gitlab url can't be accepted by this resolver */\n  @Test\n  public void checkInvalidAcceptUrl() {\n    // shouldn't be accepted\n    assertFalse(gitlabScmFileResolver.accept(\"http://github.com/user/repo\"));\n  }\n\n  /** Check Gitlab url will be be accepted by this resolver */\n  @Test\n  public void checkValidAcceptUrl() {\n    // should be accepted\n    assertTrue(gitlabScmFileResolver.accept(\"http://gitlab.2mcl.com/test/proj/repo.git\"));\n  }\n\n  @Test\n  public void shouldReturnContentFromUrlFetcher() throws Exception {\n    final String rawContent = \"raw_content\";\n    final String filename = \"devfile.yaml\";\n    when(personalAccessTokenManager.getAndStore(any(String.class)))\n        .thenReturn(new PersonalAccessToken(SCM_URL, \"provider\", \"root\", \"token123\"));\n\n    when(urlFetcher.fetch(anyString(), eq(\"Bearer token123\"))).thenReturn(rawContent);\n\n    String content =\n        gitlabScmFileResolver.fileContent(\"http://gitlab.2mcl.com/test/proj/repo.git\", filename);\n\n    assertEquals(content, rawContent);\n  }\n\n  @Test\n  public void shouldFetchContentWithoutAuthentication() throws Exception {\n    // given\n    when(personalAccessTokenManager.getAndStore(anyString()))\n        .thenThrow(new ScmUnauthorizedException(\"message\", \"gitlab\", \"v1\", \"url\"));\n\n    // when\n    gitlabScmFileResolver.fileContent(\"https://gitlab.com/username/repo.git\", \"devfile.yaml\");\n\n    // then\n    verify(urlFetcher).fetch(anyString());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabUrlCustomPortTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static java.lang.String.format;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.Arrays;\nimport java.util.Iterator;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl.DevfileLocation;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Test of {@Link GitlabUrl} Note: The parser is also testing the {@code GitlabURLParser} object\n *\n * @author Florent Benoit\n */\n@Listeners(MockitoTestNGListener.class)\npublic class GitlabUrlCustomPortTest {\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  /** Parser used to create the url. */\n  private GitlabUrlParser gitlabUrlParser;\n\n  /** Setup objects/ */\n  @BeforeMethod\n  protected void init() {\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://gitlab.net:3120\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n  }\n\n  /** Check when there is devfile in the repository */\n  @Test(dataProvider = \"urlsProvider\")\n  public void checkDevfileLocation(String repoUrl, String fileUrl) {\n    lenient()\n        .when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(repoUrl, null);\n    assertEquals(gitlabUrl.devfileFileLocations().size(), 2);\n    Iterator<DevfileLocation> iterator = gitlabUrl.devfileFileLocations().iterator();\n    assertEquals(iterator.next().location(), format(fileUrl, \"devfile.yaml\"));\n    assertEquals(iterator.next().location(), format(fileUrl, \"foo.bar\"));\n  }\n\n  @Test(dataProvider = \"urlsProvider\")\n  public void shouldReturnProviderUrl(String repoUrl, String ignored) {\n    // when\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(repoUrl, null);\n\n    // then\n    assertEquals(gitlabUrl.getProviderUrl(), \"https://gitlab.net:3120\");\n  }\n\n  @DataProvider\n  public static Object[][] urlsProvider() {\n    return new Object[][] {\n      {\n        \"https://gitlab.net:3120/eclipse/che.git\",\n        \"https://gitlab.net:3120/api/v4/projects/eclipse%%2Fche/repository/files/%s/raw?ref=HEAD\"\n      },\n      {\n        \"https://gitlab.net:3120/eclipse/fooproj/che.git\",\n        \"https://gitlab.net:3120/api/v4/projects/eclipse%%2Ffooproj%%2Fche/repository/files/%s/raw?ref=HEAD\"\n      },\n      // {\n      //   \"git@gitlab.net:eclipse/che.git\",\n      //   \"https://gitlab.net:3120/api/v4/projects/eclipse%%2Fche/repository/files/%s/raw?ref=HEAD\"\n      // },\n      // {\n      //   \"git@gitlab.net:eclipse/fooproj/che.git\",\n      //\n      // \"https://gitlab.net:3120/api/v4/projects/eclipse%%2Ffooproj%%2Fche/repository/files/%s/raw?ref=HEAD\"\n      // },\n      {\n        \"https://gitlab.net:3120/eclipse/fooproj/-/tree/master/\",\n        \"https://gitlab.net:3120/api/v4/projects/eclipse%%2Ffooproj/repository/files/%s/raw?ref=master\"\n      },\n      {\n        \"https://gitlab.net:3120/eclipse/fooproj/che/-/tree/foobranch/\",\n        \"https://gitlab.net:3120/api/v4/projects/eclipse%%2Ffooproj%%2Fche/repository/files/%s/raw?ref=foobranch\"\n      },\n    };\n  }\n\n  /** Check the original repository */\n  @Test(dataProvider = \"repoProvider2\")\n  public void checkRepositoryLocation(String rawUrl, String repoUrl) {\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(rawUrl, null);\n    assertEquals(gitlabUrl.repositoryLocation(), repoUrl);\n  }\n\n  @DataProvider\n  public static Object[][] repoProvider2() {\n    return new Object[][] {\n      {\"https://gitlab.net:3120/eclipse/che.git\", \"https://gitlab.net:3120/eclipse/che.git\"},\n      {\n        \"https://gitlab.net:3120/eclipse/foo/che.git\", \"https://gitlab.net:3120/eclipse/foo/che.git\"\n      },\n      {\"git@gitlab.net:eclipse/che.git\", \"git@gitlab.net:eclipse/che.git\"},\n      {\"git@gitlab.net:eclipse/foo/che.git\", \"git@gitlab.net:eclipse/foo/che.git\"},\n      {\n        \"https://gitlab.net:3120/eclipse/fooproj/che/-/tree/master/\",\n        \"https://gitlab.net:3120/eclipse/fooproj/che.git\"\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabUrlParserTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static org.mockito.Mockito.mock;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GitlabUrlParserTest {\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  /** Instance of component that will be tested. */\n  private GitlabUrlParser gitlabUrlParser;\n\n  private WireMockServer wireMockServer;\n  private WireMock wireMock;\n\n  @BeforeClass\n  public void prepare() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    wireMock = new WireMock(\"localhost\", wireMockServer.port());\n  }\n\n  @BeforeMethod\n  public void setUp() {\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://gitlab1.com\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n  }\n\n  /** Check URLs are valid with regexp */\n  @Test(dataProvider = \"UrlsProvider\")\n  public void checkRegexp(String url) {\n    assertTrue(gitlabUrlParser.isValid(url), \"url \" + url + \" is invalid\");\n  }\n\n  @Test\n  public void shouldParseWithBranch() throws ApiException {\n    GitlabUrl gitlabUrl =\n        gitlabUrlParser.parse(\"https://gitlab.com/user/project/test.git\", \"branch\");\n    assertEquals(gitlabUrl.getBranch(), \"branch\");\n  }\n\n  @Test\n  public void shouldGetProviderUrlWithExtraSegment() throws ApiException {\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://gitlab-server.com/scm\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n    GitlabUrl gitlabUrl =\n        gitlabUrlParser.parse(\"https://gitlab-server.com/scm/user/project/test.git\", null);\n    assertEquals(gitlabUrl.getProviderUrl(), \"https://gitlab-server.com/scm\");\n  }\n\n  @Test\n  public void shouldGetProviderUrlWithExtraSegmentOnIpv6Endpoint() throws ApiException {\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://[2001:db8::1]/scm\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n    GitlabUrl gitlabUrl =\n        gitlabUrlParser.parse(\"https://[2001:db8::1]/scm/user/project/test.git\", null);\n    assertEquals(gitlabUrl.getProviderUrl(), \"https://[2001:db8::1]/scm\");\n  }\n\n  @Test\n  public void shouldGetProviderUrlWithExtraSegmentOnIpv6EndpointWithPort() throws ApiException {\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://[2001:db8::1]:8443/scm\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n    GitlabUrl gitlabUrl =\n        gitlabUrlParser.parse(\"https://[2001:db8::1]:8443/scm/user/project/test.git\", null);\n    assertEquals(gitlabUrl.getProviderUrl(), \"https://[2001:db8::1]:8443/scm\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithoutExtraSegment() throws ApiException {\n    // given\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(\"https://[2001:db8::1]/user/project.git\", null);\n\n    // then\n    assertEquals(gitlabUrl.getProject(), \"project\");\n    assertEquals(gitlabUrl.getSubGroups(), \"user/project\");\n    assertEquals(gitlabUrl.getProviderUrl(), \"https://[2001:db8::1]\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithBranch() throws ApiException {\n    // given\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    GitlabUrl gitlabUrl =\n        gitlabUrlParser.parse(\"https://[2001:db8::1]/user/project/-/tree/feature-branch\", null);\n\n    // then\n    assertEquals(gitlabUrl.getProject(), \"project\");\n    assertEquals(gitlabUrl.getSubGroups(), \"user/project\");\n    assertEquals(gitlabUrl.getBranch(), \"feature-branch\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithBranchContainingSlash() throws ApiException {\n    // given\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    GitlabUrl gitlabUrl =\n        gitlabUrlParser.parse(\"https://[2001:db8::1]/user/project/-/tree/feature/my-branch\", null);\n\n    // then\n    assertEquals(gitlabUrl.getProject(), \"project\");\n    assertEquals(gitlabUrl.getSubGroups(), \"user/project\");\n    assertEquals(gitlabUrl.getBranch(), \"feature/my-branch\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithRevisionParam() throws ApiException {\n    // given\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    GitlabUrl gitlabUrl =\n        gitlabUrlParser.parse(\"https://[2001:db8::1]/user/project.git\", \"my-branch\");\n\n    // then\n    assertEquals(gitlabUrl.getProject(), \"project\");\n    assertEquals(gitlabUrl.getSubGroups(), \"user/project\");\n    assertEquals(gitlabUrl.getBranch(), \"my-branch\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlWithSubgroups() throws ApiException {\n    // given\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    GitlabUrl gitlabUrl =\n        gitlabUrlParser.parse(\"https://[2001:db8::1]/group/subgroup/project.git\", null);\n\n    // then\n    assertEquals(gitlabUrl.getProject(), \"project\");\n    assertEquals(gitlabUrl.getSubGroups(), \"group/subgroup/project\");\n  }\n\n  @Test\n  public void shouldParseIpv6LoopbackAddress() throws ApiException {\n    // given\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://[::1]\", devfileFilenamesProvider, mock(PersonalAccessTokenManager.class));\n\n    // when\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(\"https://[::1]/user/project.git\", null);\n\n    // then\n    assertEquals(gitlabUrl.getProject(), \"project\");\n    assertEquals(gitlabUrl.getSubGroups(), \"user/project\");\n    assertEquals(gitlabUrl.getProviderUrl(), \"https://[::1]\");\n  }\n\n  @Test\n  public void shouldParseIpv6FullFormAddress() throws ApiException {\n    // given\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://[2001:0db8:0000:0000:0000:0000:0000:0001]\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n\n    // when\n    GitlabUrl gitlabUrl =\n        gitlabUrlParser.parse(\n            \"https://[2001:0db8:0000:0000:0000:0000:0000:0001]/user/project.git\", null);\n\n    // then\n    assertEquals(gitlabUrl.getProject(), \"project\");\n    assertEquals(gitlabUrl.getSubGroups(), \"user/project\");\n  }\n\n  @Test\n  public void shouldValidateIpv6Url() {\n    // given\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n\n    // when/then\n    assertTrue(gitlabUrlParser.isValid(\"https://[2001:db8::1]/user/project.git\"));\n  }\n\n  @Test\n  public void shouldValidateIpv6UrlWithPort() {\n    // given\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://[2001:db8::1]:8443\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n\n    // when/then\n    assertTrue(gitlabUrlParser.isValid(\"https://[2001:db8::1]:8443/user/project.git\"));\n  }\n\n  @Test\n  public void shouldValidateIpv6UrlWithBranch() {\n    // given\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://[2001:db8::1]\",\n            devfileFilenamesProvider,\n            mock(PersonalAccessTokenManager.class));\n\n    // when/then\n    assertTrue(gitlabUrlParser.isValid(\"https://[2001:db8::1]/user/project/-/tree/master\"));\n  }\n\n  @Test\n  public void shouldParseIpv6UrlViaDynamicPatternMatching() throws ApiException {\n    // The parser is configured for gitlab1.com (via setUp), but getPatternMatcherByUrl()\n    // dynamically creates a pattern from the URL itself. This exercises the fixed\n    // IPv6 bracket handling in getPatternMatcherByUrl() -- the code path where the\n    // double-bracketing bug (Issue #4 in the verdict) was fixed.\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(\"https://[2001:db8::1]/user/project.git\", null);\n\n    assertEquals(gitlabUrl.getProject(), \"project\");\n    assertEquals(gitlabUrl.getSubGroups(), \"user/project\");\n  }\n\n  @Test\n  public void shouldParseIpv6UrlViaDynamicPatternMatchingWithBranch() throws ApiException {\n    // Exercises getPatternMatcherByUrl() dynamic path with IPv6 and branch\n    GitlabUrl gitlabUrl =\n        gitlabUrlParser.parse(\"https://[2001:db8::1]/user/project/-/tree/feature-branch\", null);\n\n    assertEquals(gitlabUrl.getProject(), \"project\");\n    assertEquals(gitlabUrl.getSubGroups(), \"user/project\");\n    assertEquals(gitlabUrl.getBranch(), \"feature-branch\");\n  }\n\n  @Test\n  public void shouldParseWithUrlBranch() throws ApiException {\n    GitlabUrl gitlabUrl =\n        gitlabUrlParser.parse(\"https://gitlab.com/user/project/-/tree/master/\", \"branch\");\n    assertEquals(gitlabUrl.getBranch(), \"master\");\n  }\n\n  /** Compare parsing */\n  @Test(dataProvider = \"parsing\")\n  public void checkParsing(String url, String project, String subGroups, String branch) {\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(url, null);\n\n    assertEquals(gitlabUrl.getProject(), project);\n    assertEquals(gitlabUrl.getSubGroups(), subGroups);\n    assertEquals(gitlabUrl.getBranch(), branch);\n  }\n\n  /** Compare parsing */\n  @Test(dataProvider = \"parsing\")\n  public void shouldParseWithoutPredefinedEndpoint(\n      String url, String project, String subGroups, String branch) {\n    // given\n    gitlabUrlParser =\n        new GitlabUrlParser(null, devfileFilenamesProvider, mock(PersonalAccessTokenManager.class));\n    // when\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(url, null);\n\n    // then\n    assertEquals(gitlabUrl.getProject(), project);\n    assertEquals(gitlabUrl.getSubGroups(), subGroups);\n    assertEquals(gitlabUrl.getBranch(), branch);\n  }\n\n  @Test\n  public void shouldValidateUrlByApiRequest() {\n    // given\n    String url = wireMockServer.url(\"/user/repo\");\n    stubFor(\n        get(urlEqualTo(\"/oauth/token/info\"))\n            .willReturn(\n                aResponse()\n                    .withStatus(401)\n                    .withBody(\n                        \"{\\\"error\\\":\\\"invalid_token\\\",\\\"error_description\\\":\\\"The access token is invalid\\\",\\\"state\\\":\\\"unauthorized\\\"}\")));\n\n    // when\n    boolean result = gitlabUrlParser.isValid(url);\n\n    // then\n    assertTrue(result);\n  }\n\n  @Test\n  public void shouldNotValidateUrlByApiRequestWithPlainStringResponse() {\n    // given\n    String url = wireMockServer.url(\"/user/repo\");\n    stubFor(\n        get(urlEqualTo(\"/oauth/token/info\"))\n            .willReturn(aResponse().withStatus(401).withBody(\"plain string error\")));\n\n    // when\n    boolean result = gitlabUrlParser.isValid(url);\n\n    // then\n    assertFalse(result);\n  }\n\n  @Test\n  public void shouldNotValidateUrlByApiRequest() {\n    // given\n    String url = wireMockServer.url(\"/user/repo\");\n    stubFor(get(urlEqualTo(\"/oauth/token/info\")).willReturn(aResponse().withStatus(500)));\n\n    // when\n    boolean result = gitlabUrlParser.isValid(url);\n\n    // then\n    assertFalse(result);\n  }\n\n  @DataProvider(name = \"UrlsProvider\")\n  public Object[][] urls() {\n    return new Object[][] {\n      {\"https://gitlab1.com/user/project/test1.git\"},\n      {\"https://gitlab1.com/user/project1.git\"},\n      {\"https://gitlab1.com/scm/project/test1.git\"},\n      {\"https://gitlab1.com/user/project/\"},\n      {\"https://gitlab1.com/user/project/repo/\"},\n      {\"https://gitlab1.com/user/project/-/tree/master/\"},\n      {\"https://gitlab1.com/user/project/repo/-/tree/master/subfolder\"},\n      {\"git@gitlab1.com:user/project/test1.git\"},\n      {\"git@gitlab1.com:user/project1.git\"},\n      {\"git@gitlab1.com:scm/project/test1.git\"},\n      {\"git@gitlab1.com:user/project/\"},\n      {\"git@gitlab1.com:user/project/repo/\"},\n    };\n  }\n\n  @DataProvider(name = \"parsing\")\n  public Object[][] expectedParsing() {\n    return new Object[][] {\n      {\"https://gitlab1.com/user/project1.git\", \"project1\", \"user/project1\", null},\n      {\"https://gitlab1.com/user/project/test1.git\", \"test1\", \"user/project/test1\", null},\n      {\n        \"https://gitlab1.com/user/project/group1/group2/test1.git\",\n        \"test1\",\n        \"user/project/group1/group2/test1\",\n        null\n      },\n      {\"https://gitlab1.com/user/project/\", \"project\", \"user/project\", null},\n      {\"https://gitlab1.com/user/project/repo/\", \"repo\", \"user/project/repo\", null},\n      {\"git@gitlab1.com:user/project1.git\", \"project1\", \"user/project1\", null},\n      {\"git@gitlab1.com:user/project/test1.git\", \"test1\", \"user/project/test1\", null},\n      {\n        \"git@gitlab1.com:user/project/group1/group2/test1.git\",\n        \"test1\",\n        \"user/project/group1/group2/test1\",\n        null\n      },\n      {\"git@gitlab1.com:user/project/\", \"project\", \"user/project\", null},\n      {\"git@gitlab1.com:user/project/repo/\", \"repo\", \"user/project/repo\", null},\n      {\"https://gitlab1.com/user/project/-/tree/master/\", \"project\", \"user/project\", \"master\"},\n      {\"https://gitlab1.com/user/project/repo/-/tree/foo\", \"repo\", \"user/project/repo\", \"foo\"},\n      {\n        \"https://gitlab1.com/user/project/repo/-/tree/branch/with/slash\",\n        \"repo\",\n        \"user/project/repo\",\n        \"branch/with/slash\"\n      },\n      {\n        \"https://gitlab1.com/user/project/group1/group2/repo/-/tree/foo/\",\n        \"repo\",\n        \"user/project/group1/group2/repo\",\n        \"foo\"\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabUrlTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static java.lang.String.format;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.Arrays;\nimport java.util.Iterator;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl.DevfileLocation;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Test of {@Link GitlabUrl} Note: The parser is also testing the {@code GitlabURLParser} object\n *\n * @author Florent Benoit\n */\n@Listeners(MockitoTestNGListener.class)\npublic class GitlabUrlTest {\n\n  @Mock private DevfileFilenamesProvider devfileFilenamesProvider;\n\n  /** Parser used to create the url. */\n  private GitlabUrlParser gitlabUrlParser;\n\n  /** Setup objects/ */\n  @BeforeMethod\n  protected void init() {\n    when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n    gitlabUrlParser =\n        new GitlabUrlParser(\n            \"https://gitlab.net\", devfileFilenamesProvider, mock(PersonalAccessTokenManager.class));\n  }\n\n  /** Check when there is devfile in the repository */\n  @Test(dataProvider = \"urlsProvider\")\n  public void checkDevfileLocation(String repoUrl, String fileUrl) {\n    lenient()\n        .when(devfileFilenamesProvider.getConfiguredDevfileFilenames())\n        .thenReturn(Arrays.asList(\"devfile.yaml\", \"foo.bar\"));\n\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(repoUrl, null);\n    assertEquals(gitlabUrl.devfileFileLocations().size(), 2);\n    Iterator<DevfileLocation> iterator = gitlabUrl.devfileFileLocations().iterator();\n    assertEquals(iterator.next().location(), format(fileUrl, \"devfile.yaml\"));\n    assertEquals(iterator.next().location(), format(fileUrl, \"foo.bar\"));\n  }\n\n  @Test(dataProvider = \"urlsProvider\")\n  public void shouldReturnProviderUrl(String repoUrl, String ignored) {\n    // when\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(repoUrl, null);\n\n    // then\n    assertEquals(gitlabUrl.getProviderUrl(), \"https://gitlab.net\");\n  }\n\n  @DataProvider\n  public static Object[][] urlsProvider() {\n    return new Object[][] {\n      {\n        \"https://gitlab.net/eclipse/che.git\",\n        \"https://gitlab.net/api/v4/projects/eclipse%%2Fche/repository/files/%s/raw?ref=HEAD\"\n      },\n      {\n        \"https://gitlab.net/eclipse/fooproj/che.git\",\n        \"https://gitlab.net/api/v4/projects/eclipse%%2Ffooproj%%2Fche/repository/files/%s/raw?ref=HEAD\"\n      },\n      {\n        \"git@gitlab.net:eclipse/che.git\",\n        \"https://gitlab.net/api/v4/projects/eclipse%%2Fche/repository/files/%s/raw?ref=HEAD\"\n      },\n      {\n        \"git@gitlab.net:eclipse/fooproj/che.git\",\n        \"https://gitlab.net/api/v4/projects/eclipse%%2Ffooproj%%2Fche/repository/files/%s/raw?ref=HEAD\"\n      },\n      {\n        \"https://gitlab.net/eclipse/fooproj/-/tree/master/\",\n        \"https://gitlab.net/api/v4/projects/eclipse%%2Ffooproj/repository/files/%s/raw?ref=master\"\n      },\n      {\n        \"https://gitlab.net/eclipse/fooproj/che/-/tree/foobranch/\",\n        \"https://gitlab.net/api/v4/projects/eclipse%%2Ffooproj%%2Fche/repository/files/%s/raw?ref=foobranch\"\n      },\n    };\n  }\n\n  /** Check the original repository */\n  @Test(dataProvider = \"repoProvider\")\n  public void checkRepositoryLocation(String rawUrl, String repoUrl) {\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(rawUrl, null);\n    assertEquals(gitlabUrl.repositoryLocation(), repoUrl);\n  }\n\n  @DataProvider\n  public static Object[][] repoProvider() {\n    return new Object[][] {\n      {\"https://gitlab.net/eclipse/che.git\", \"https://gitlab.net/eclipse/che.git\"},\n      {\"https://gitlab.net/eclipse/foo/che.git\", \"https://gitlab.net/eclipse/foo/che.git\"},\n      {\"git@gitlab.net:eclipse/che.git\", \"git@gitlab.net:eclipse/che.git\"},\n      {\"git@gitlab.net:eclipse/foo/che.git\", \"git@gitlab.net:eclipse/foo/che.git\"},\n      {\n        \"https://gitlab.net/eclipse/fooproj/che/-/tree/master/\",\n        \"https://gitlab.net/eclipse/fooproj/che.git\"\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabUserDataFetcherTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static com.github.tomakehurst.wiremock.client.WireMock.aResponse;\nimport static com.github.tomakehurst.wiremock.client.WireMock.equalTo;\nimport static com.github.tomakehurst.wiremock.client.WireMock.get;\nimport static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\nimport static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\nimport static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport com.github.tomakehurst.wiremock.client.WireMock;\nimport com.github.tomakehurst.wiremock.common.Slf4jNotifier;\nimport com.google.common.net.HttpHeaders;\nimport java.lang.reflect.Field;\nimport java.util.Optional;\nimport org.eclipse.che.api.factory.server.scm.GitUserData;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class GitlabUserDataFetcherTest {\n\n  @Mock PersonalAccessTokenManager personalAccessTokenManager;\n\n  GitlabUserDataFetcher gitlabUserDataFetcher;\n\n  WireMockServer wireMockServer;\n  WireMock wireMock;\n\n  @BeforeMethod\n  void start() {\n    wireMockServer =\n        new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).dynamicPort());\n    wireMockServer.start();\n    WireMock.configureFor(\"localhost\", wireMockServer.port());\n    wireMock = new WireMock(\"localhost\", wireMockServer.port());\n    gitlabUserDataFetcher =\n        new GitlabUserDataFetcher(\n            wireMockServer.url(\"/\"), \"http://che.api\", personalAccessTokenManager);\n\n    stubFor(\n        get(urlEqualTo(\"/api/v4/user\"))\n            .withHeader(HttpHeaders.AUTHORIZATION, equalTo(\"Bearer oauthtoken\"))\n            .willReturn(\n                aResponse()\n                    .withHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n                    .withBodyFile(\"gitlab/rest/api/v4/user/response.json\")));\n  }\n\n  @AfterMethod\n  void stop() {\n    wireMockServer.stop();\n  }\n\n  @Test\n  public void shouldFetchGitUserData() throws Exception {\n    PersonalAccessToken token = mock(PersonalAccessToken.class);\n    when(token.getToken()).thenReturn(\"oauthtoken\");\n    when(token.getScmProviderUrl()).thenReturn(wireMockServer.url(\"/\"));\n    when(personalAccessTokenManager.get(any(Subject.class), eq(\"gitlab\"), eq(null), eq(null)))\n        .thenReturn(Optional.of(token));\n\n    GitUserData gitUserData = gitlabUserDataFetcher.fetchGitUserData(null);\n    assertEquals(gitUserData.getScmUsername(), \"John Smith\");\n    assertEquals(gitUserData.getScmUserEmail(), \"john@example.com\");\n  }\n\n  @Test\n  public void shouldFetchGitUserDataByUrl() throws Exception {\n    // given\n    PersonalAccessToken token = mock(PersonalAccessToken.class);\n    when(token.getToken()).thenReturn(\"oauthtoken\");\n    when(personalAccessTokenManager.get(any(Subject.class), eq(\"gitlab\"), eq(null), eq(null)))\n        .thenReturn(Optional.empty());\n    when(personalAccessTokenManager.get(\n            any(Subject.class), eq(null), eq(wireMockServer.url(\"/\")), eq(null)))\n        .thenReturn(Optional.of(token));\n    // when\n    GitUserData gitUserData = gitlabUserDataFetcher.fetchGitUserData(null);\n    // then\n    assertEquals(gitUserData.getScmUsername(), \"John Smith\");\n    assertEquals(gitUserData.getScmUserEmail(), \"john@example.com\");\n  }\n\n  @Test\n  public void shouldSetSAASUrlAsDefault() throws Exception {\n    gitlabUserDataFetcher =\n        new GitlabUserDataFetcher(null, \"http://che.api\", personalAccessTokenManager);\n\n    Field serverUrlField =\n        gitlabUserDataFetcher.getClass().getSuperclass().getDeclaredField(\"serverUrl\");\n    serverUrlField.setAccessible(true);\n    String serverUrl = (String) serverUrlField.get(gitlabUserDataFetcher);\n\n    assertEquals(serverUrl, \"https://gitlab.com\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/resources/__files/gitlab/rest/api/v4/user/PAT_info.json",
    "content": "{\n  \"id\": 1,\n  \"name\": \"gitlab\",\n  \"scopes\": [\"api\", \"write_repository\"],\n  \"expires_at\": \"2024-07-18\",\n  \"created_at\": \"2023-07-19T07:41:19.492Z\"\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/resources/__files/gitlab/rest/api/v4/user/response.json",
    "content": "{\n  \"id\": 1,\n  \"username\": \"john_smith\",\n  \"email\": \"john@example.com\",\n  \"name\": \"John Smith\",\n  \"state\": \"active\",\n  \"avatar_url\": \"http://localhost:3000/uploads/user/avatar/1/index.jpg\",\n  \"web_url\": \"http://localhost:3000/john_smith\",\n  \"created_at\": \"2012-05-23T08:00:58Z\",\n  \"bio\": \"\",\n  \"bio_html\": \"\",\n  \"location\": null,\n  \"public_email\": \"john@example.com\",\n  \"skype\": \"\",\n  \"linkedin\": \"\",\n  \"twitter\": \"\",\n  \"website_url\": \"\",\n  \"organization\": \"\",\n  \"last_sign_in_at\": \"2012-06-01T11:41:01Z\",\n  \"confirmed_at\": \"2012-05-23T09:05:22Z\",\n  \"theme_id\": 1,\n  \"last_activity_on\": \"2012-05-23\",\n  \"color_scheme_id\": 2,\n  \"projects_limit\": 100,\n  \"current_sign_in_at\": \"2012-06-02T06:36:55Z\",\n  \"identities\": [\n    {\"provider\": \"github\", \"extern_uid\": \"2435223452345\"},\n    {\"provider\": \"bitbucket\", \"extern_uid\": \"john_smith\"},\n    {\"provider\": \"google_oauth2\", \"extern_uid\": \"8776128412476123468721346\"}\n  ],\n  \"can_create_group\": true,\n  \"can_create_project\": true,\n  \"two_factor_enabled\": true,\n  \"external\": false,\n  \"private_profile\": false\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/resources/__files/gitlab/rest/api/v4/user/token_info.json",
    "content": "{\n  \"resource_owner_id\": 1,\n  \"scope\": [\"api\", \"write_repository\", \"openid\"],\n  \"expires_in\": null,\n  \"application\": {\"uid\": \"1cb242f495280beb4291e64bee2a17f330902e499882fe8e1e2aa875519cab33\"},\n  \"created_at\": 1575890427\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/resources/__files/gitlab/rest/api/v4/user/token_info_lack_scopes.json",
    "content": "{\n  \"resource_owner_id\": 1,\n  \"scope\": [\"api\"],\n  \"expires_in\": null,\n  \"application\": {\"uid\": \"1cb242f495280beb4291e64bee2a17f330902e499882fe8e1e2aa875519cab33\"},\n  \"created_at\": 1575890427\n}"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n%nopex</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab-common/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-factory-gitlab-common</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Factory Resolver Gitlab Common</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.validation</groupId>\n            <artifactId>jakarta.validation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-auth-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-factory-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.github.tomakehurst</groupId>\n            <artifactId>wiremock-jre8-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>jcl-over-slf4j</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.wiremock</groupId>\n            <artifactId>wiremock-standalone</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <configuration>\n                    <source>8</source>\n                    <target>8</target>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab-common/src/main/java/org/eclipse/che/api/factory/server/gitlab/AbstractGitlabFactoryParametersResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static org.eclipse.che.api.factory.shared.Constants.REVISION_PARAMETER_NAME;\nimport static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport jakarta.validation.constraints.NotNull;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.factory.server.BaseFactoryParameterResolver;\nimport org.eclipse.che.api.factory.server.FactoryParametersResolver;\nimport org.eclipse.che.api.factory.server.scm.AuthorisationRequestManager;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl;\nimport org.eclipse.che.api.factory.server.urlfactory.URLFactoryBuilder;\nimport org.eclipse.che.api.factory.shared.dto.FactoryDevfileV2Dto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryMetaDto;\nimport org.eclipse.che.api.factory.shared.dto.FactoryVisitor;\nimport org.eclipse.che.api.factory.shared.dto.ScmInfoDto;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\n\n/**\n * Provides Factory Parameters resolver for Gitlab repositories.\n *\n * @author Max Shaposhnyk\n */\npublic class AbstractGitlabFactoryParametersResolver extends BaseFactoryParameterResolver\n    implements FactoryParametersResolver {\n\n  private final URLFetcher urlFetcher;\n  private final AbstractGitlabUrlParser gitlabURLParser;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n  private final String providerName;\n\n  public AbstractGitlabFactoryParametersResolver(\n      URLFactoryBuilder urlFactoryBuilder,\n      URLFetcher urlFetcher,\n      AbstractGitlabUrlParser gitlabURLParser,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      AuthorisationRequestManager authorisationRequestManager,\n      String providerName) {\n    super(authorisationRequestManager, urlFactoryBuilder, providerName);\n    this.urlFetcher = urlFetcher;\n    this.gitlabURLParser = gitlabURLParser;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n    this.providerName = providerName;\n  }\n\n  /**\n   * Check if this resolver can be used with the given parameters.\n   *\n   * @param factoryParameters map of parameters dedicated to factories\n   * @return true if it will be accepted by the resolver implementation or false if it is not\n   *     accepted\n   */\n  @Override\n  public boolean accept(@NotNull final Map<String, String> factoryParameters) {\n    return factoryParameters.containsKey(URL_PARAMETER_NAME)\n        && gitlabURLParser.isValid(factoryParameters.get(URL_PARAMETER_NAME));\n  }\n\n  @Override\n  public String getProviderName() {\n    return providerName;\n  }\n\n  /**\n   * Create factory object based on provided parameters\n   *\n   * @param factoryParameters map containing factory data parameters provided through URL\n   * @throws BadRequestException when data are invalid\n   */\n  @Override\n  public FactoryMetaDto createFactory(@NotNull final Map<String, String> factoryParameters)\n      throws ApiException {\n    // no need to check null value of url parameter as accept() method has performed the check\n    final GitlabUrl gitlabUrl =\n        gitlabURLParser.parse(\n            factoryParameters.get(URL_PARAMETER_NAME),\n            factoryParameters.get(REVISION_PARAMETER_NAME));\n    // create factory from the following location if location exists, else create default factory\n    return createFactory(\n        factoryParameters,\n        gitlabUrl,\n        new GitlabFactoryVisitor(gitlabUrl),\n        new GitlabAuthorizingFileContentProvider(\n            gitlabUrl, urlFetcher, personalAccessTokenManager));\n  }\n\n  /**\n   * Visitor that puts the default devfile or updates devfile projects into the Gitlab Factory, if\n   * needed.\n   */\n  private class GitlabFactoryVisitor implements FactoryVisitor {\n\n    private final GitlabUrl gitlabUrl;\n\n    private GitlabFactoryVisitor(GitlabUrl gitlabUrl) {\n      this.gitlabUrl = gitlabUrl;\n    }\n\n    @Override\n    public FactoryDevfileV2Dto visit(FactoryDevfileV2Dto factoryDto) {\n      ScmInfoDto scmInfo =\n          newDto(ScmInfoDto.class)\n              .withScmProviderName(gitlabUrl.getProviderName())\n              .withRepositoryUrl(gitlabUrl.repositoryLocation());\n      if (gitlabUrl.getBranch() != null) {\n        scmInfo.withBranch(gitlabUrl.getBranch());\n      }\n      return factoryDto.withScmInfo(scmInfo);\n    }\n  }\n\n  @Override\n  public RemoteFactoryUrl parseFactoryUrl(String factoryUrl) throws ApiException {\n    return gitlabURLParser.parse(factoryUrl, null);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab-common/src/main/java/org/eclipse/che/api/factory/server/gitlab/AbstractGitlabOAuthTokenFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport com.google.common.base.Joiner;\nimport com.google.common.collect.ImmutableSet;\nimport com.google.common.collect.Sets;\nimport java.util.Optional;\nimport java.util.Set;\nimport org.eclipse.che.api.auth.shared.dto.OAuthToken;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.ForbiddenException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.UnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenParams;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.eclipse.che.commons.subject.Subject;\nimport org.eclipse.che.security.oauth.OAuthAPI;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** GitLab OAuth token retriever. */\npublic class AbstractGitlabOAuthTokenFetcher implements PersonalAccessTokenFetcher {\n\n  private static final Logger LOG = LoggerFactory.getLogger(AbstractGitlabOAuthTokenFetcher.class);\n  public static final Set<String> DEFAULT_TOKEN_SCOPES = ImmutableSet.of(\"api\", \"write_repository\");\n\n  private final OAuthAPI oAuthAPI;\n  private final String serverUrl;\n  private final String apiEndpoint;\n  private final String providerName;\n\n  public AbstractGitlabOAuthTokenFetcher(\n      String serverUrl, String apiEndpoint, OAuthAPI oAuthAPI, String providerName) {\n    this.serverUrl = trimEnd(serverUrl, '/');\n    this.apiEndpoint = apiEndpoint;\n    this.providerName = providerName;\n    this.oAuthAPI = oAuthAPI;\n  }\n\n  @Override\n  public PersonalAccessToken refreshPersonalAccessToken(Subject cheSubject, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    return fetchOrRefreshPersonalAccessToken(cheSubject, scmServerUrl, true);\n  }\n\n  @Override\n  public PersonalAccessToken fetchPersonalAccessToken(Subject cheSubject, String scmServerUrl)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    return fetchOrRefreshPersonalAccessToken(cheSubject, scmServerUrl, false);\n  }\n\n  private PersonalAccessToken fetchOrRefreshPersonalAccessToken(\n      Subject cheSubject, String scmServerUrl, boolean forceRefreshToken)\n      throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {\n    scmServerUrl = trimEnd(scmServerUrl, '/');\n    GitlabApiClient gitlabApiClient = getApiClient(scmServerUrl);\n    if (gitlabApiClient == null || !gitlabApiClient.isConnected(scmServerUrl)) {\n      LOG.debug(\"not a  valid url {} for current fetcher \", scmServerUrl);\n      return null;\n    }\n    if (oAuthAPI == null) {\n      throw new ScmCommunicationException(\n          format(\n              \"OAuth 2 is not configured for SCM provider [%s]. For details, refer \"\n                  + \"the documentation in section of SCM providers configuration.\",\n              providerName));\n    }\n    OAuthToken oAuthToken;\n    try {\n      oAuthToken =\n          forceRefreshToken\n              ? oAuthAPI.refreshToken(providerName)\n              : oAuthAPI.getOrRefreshToken(providerName);\n      String tokenName = NameGenerator.generate(OAUTH_2_PREFIX, 5);\n      String tokenId = NameGenerator.generate(\"id-\", 5);\n      Optional<Pair<Boolean, String>> valid =\n          isValid(\n              new PersonalAccessTokenParams(\n                  scmServerUrl, providerName, tokenName, tokenId, oAuthToken.getToken(), null));\n      if (valid.isEmpty()) {\n        throw buildScmUnauthorizedException(cheSubject);\n      } else if (!valid.get().first) {\n        throw new ScmCommunicationException(\n            \"Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: \"\n                + DEFAULT_TOKEN_SCOPES);\n      }\n      return new PersonalAccessToken(\n          scmServerUrl,\n          providerName,\n          cheSubject.getUserId(),\n          valid.get().second,\n          tokenName,\n          tokenId,\n          oAuthToken.getToken());\n    } catch (UnauthorizedException e) {\n      throw buildScmUnauthorizedException(cheSubject);\n    } catch (NotFoundException nfe) {\n      throw new UnknownScmProviderException(nfe.getMessage(), scmServerUrl);\n    } catch (ServerException | ForbiddenException | BadRequestException | ConflictException e) {\n      LOG.warn(e.getMessage());\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  private ScmUnauthorizedException buildScmUnauthorizedException(Subject cheSubject) {\n    return new ScmUnauthorizedException(\n        cheSubject.getUserName() + \" is not authorized in \" + providerName + \" OAuth provider.\",\n        providerName,\n        \"2.0\",\n        getLocalAuthenticateUrl());\n  }\n\n  @Override\n  public Optional<Boolean> isValid(PersonalAccessToken personalAccessToken) {\n    GitlabApiClient gitlabApiClient = getApiClient(personalAccessToken.getScmProviderUrl());\n    if (gitlabApiClient == null\n        || !gitlabApiClient.isConnected(personalAccessToken.getScmProviderUrl())) {\n      if (personalAccessToken.getScmTokenName().equals(providerName)) {\n        gitlabApiClient = new GitlabApiClient(personalAccessToken.getScmProviderUrl());\n      } else {\n        LOG.debug(\n            \"not a  valid url {} for current fetcher \", personalAccessToken.getScmProviderUrl());\n        return Optional.empty();\n      }\n    }\n    if (personalAccessToken.getScmTokenName() != null\n        && personalAccessToken.getScmTokenName().startsWith(OAUTH_2_PREFIX)) {\n      // validation OAuth token by special API call\n      try {\n        GitlabOauthTokenInfo info =\n            gitlabApiClient.getOAuthTokenInfo(personalAccessToken.getToken());\n        return Optional.of(Sets.newHashSet(info.getScope()).containsAll(DEFAULT_TOKEN_SCOPES));\n      } catch (ScmItemNotFoundException | ScmCommunicationException | ScmUnauthorizedException e) {\n        return Optional.of(Boolean.FALSE);\n      }\n    } else {\n      // validating personal access token from secret. Since PAT API is accessible only in\n      // latest GitLab version, we just perform check by accessing something from API.\n      try {\n        GitlabUser user = gitlabApiClient.getUser(personalAccessToken.getToken());\n        if (personalAccessToken.getScmUserName().equals(user.getUsername())) {\n          return Optional.of(Boolean.TRUE);\n        } else {\n          return Optional.of(Boolean.FALSE);\n        }\n      } catch (ScmItemNotFoundException\n          | ScmCommunicationException\n          | ScmBadRequestException\n          | ScmUnauthorizedException e) {\n        return Optional.of(Boolean.FALSE);\n      }\n    }\n  }\n\n  @Override\n  public Optional<Pair<Boolean, String>> isValid(PersonalAccessTokenParams params)\n      throws ScmCommunicationException {\n    GitlabApiClient gitlabApiClient = getApiClient(params.getScmProviderUrl());\n    if (gitlabApiClient == null || !gitlabApiClient.isConnected(params.getScmProviderUrl())) {\n      if (providerName.equals(params.getScmTokenName())) {\n        gitlabApiClient = new GitlabApiClient(params.getScmProviderUrl());\n      } else {\n        LOG.debug(\"not a  valid url {} for current fetcher \", params.getScmProviderUrl());\n        return Optional.empty();\n      }\n    }\n    try {\n      GitlabUser user = gitlabApiClient.getUser(params.getToken());\n      if (params.getScmTokenName() != null && params.getScmTokenName().startsWith(OAUTH_2_PREFIX)) {\n        // validation OAuth token by special API call\n        GitlabOauthTokenInfo info = gitlabApiClient.getOAuthTokenInfo(params.getToken());\n        return Optional.of(\n            Pair.of(\n                Sets.newHashSet(info.getScope()).containsAll(DEFAULT_TOKEN_SCOPES)\n                    ? Boolean.TRUE\n                    : Boolean.FALSE,\n                user.getUsername()));\n      }\n      // validating personal access token from secret. Since PAT API is accessible only in\n      // latest GitLab version, we just perform check by accessing something from API.\n      // TODO: add PAT scope validation\n      return Optional.of(Pair.of(Boolean.TRUE, user.getUsername()));\n    } catch (ScmItemNotFoundException | ScmBadRequestException | ScmUnauthorizedException e) {\n      return Optional.empty();\n    }\n  }\n\n  private String getLocalAuthenticateUrl() {\n    return apiEndpoint\n        + \"/oauth/authenticate?oauth_provider=\"\n        + providerName\n        + \"&scope=\"\n        + Joiner.on('+').join(DEFAULT_TOKEN_SCOPES)\n        + \"&request_method=POST&signature_method=rsa\";\n  }\n\n  private GitlabApiClient getApiClient(String serverUrl) {\n    return serverUrl.equals(this.serverUrl) ? new GitlabApiClient(serverUrl) : null;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab-common/src/main/java/org/eclipse/che/api/factory/server/gitlab/AbstractGitlabScmFileResolver.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static org.eclipse.che.api.factory.server.ApiExceptionMapper.toApiException;\n\nimport java.io.IOException;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.factory.server.ScmFileResolver;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\n\n/** GitLab specific SCM file resolver. */\npublic class AbstractGitlabScmFileResolver implements ScmFileResolver {\n\n  private final AbstractGitlabUrlParser gitlabUrlParser;\n  private final URLFetcher urlFetcher;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n\n  public AbstractGitlabScmFileResolver(\n      AbstractGitlabUrlParser gitlabUrlParser,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    this.gitlabUrlParser = gitlabUrlParser;\n    this.urlFetcher = urlFetcher;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n  }\n\n  @Override\n  public boolean accept(String repository) {\n    return gitlabUrlParser.isValid(repository);\n  }\n\n  @Override\n  public String fileContent(String repository, String filePath) throws ApiException {\n    GitlabUrl gitlabUrl = gitlabUrlParser.parse(repository, null);\n\n    try {\n      return fetchContent(gitlabUrl, filePath, false);\n    } catch (DevfileException exception) {\n      // This catch might mean that the authentication was rejected by user, try to repeat the fetch\n      // without authentication flow.\n      try {\n        return fetchContent(gitlabUrl, filePath, true);\n      } catch (DevfileException devfileException) {\n        throw toApiException(devfileException);\n      }\n    }\n  }\n\n  private String fetchContent(GitlabUrl gitlabUrl, String filePath, boolean skipAuthentication)\n      throws DevfileException, NotFoundException {\n    try {\n      GitlabAuthorizingFileContentProvider contentProvider =\n          new GitlabAuthorizingFileContentProvider(\n              gitlabUrl, urlFetcher, personalAccessTokenManager);\n      return skipAuthentication\n          ? contentProvider.fetchContentWithoutAuthentication(filePath)\n          : contentProvider.fetchContent(filePath);\n    } catch (IOException e) {\n      throw new NotFoundException(e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab-common/src/main/java/org/eclipse/che/api/factory/server/gitlab/AbstractGitlabUrlParser.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.regex.Pattern.compile;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport com.google.gson.JsonObject;\nimport com.google.gson.JsonParser;\nimport jakarta.validation.constraints.NotNull;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Optional;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessToken;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.env.EnvironmentContext;\n\n/**\n * Parser of String Gitlab URLs and provide {@link GitlabUrl} objects.\n *\n * @author Max Shaposhnyk\n */\npublic class AbstractGitlabUrlParser {\n\n  private final DevfileFilenamesProvider devfileFilenamesProvider;\n  private final PersonalAccessTokenManager personalAccessTokenManager;\n  private final String providerName;\n  private static final List<String> gitlabUrlPatternTemplates =\n      List.of(\n          \"^(?<scheme>%s)://(?<host>%s)(:(?<port>%s))?/(?<subgroups>([^/]++/?)+)/-/tree/(?<branch>.++)(/)?\",\n          \"^(?<scheme>%s)://(?<host>%s)(:(?<port>%s))?/(?<subgroups>.*)\"); // a wider one, should be\n  // the last in\n  // the list\n  private final String gitlabSSHPatternTemplate = \"^git@(?<host>%s):(?<subgroups>.*)$\";\n  // list\n  private final List<Pattern> gitlabUrlPatterns = new ArrayList<>();\n\n  public AbstractGitlabUrlParser(\n      String serverUrl,\n      DevfileFilenamesProvider devfileFilenamesProvider,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      String providerName) {\n    this.devfileFilenamesProvider = devfileFilenamesProvider;\n    this.personalAccessTokenManager = personalAccessTokenManager;\n    this.providerName = providerName;\n    if (isNullOrEmpty(serverUrl)) {\n      gitlabUrlPatternTemplates.forEach(\n          t -> gitlabUrlPatterns.add(compile(format(t, \"https\", \"gitlab.com\", 443))));\n      gitlabUrlPatterns.add(compile(format(gitlabSSHPatternTemplate, \"gitlab.com\")));\n    } else {\n      String trimmedEndpoint = trimEnd(serverUrl, '/');\n      URI uri = URI.create(trimmedEndpoint);\n      String schema = uri.getScheme();\n      // We support GitLab endpoints that include an extra path segment, e.g.:\n      //   https://gitlab-server.com/scm\n      // and want to match repo URLs like:\n      //   https://gitlab-server.com/scm/group/project.git\n      //\n      // In that case, we treat \"/scm\" as part of the fixed endpoint prefix, not as part of the\n      // repository path.\n      // Review feedback: use \"hostname\" naming instead of \"endpointWithoutScheme\".\n      final String hostname = uri.getAuthority();\n      final String endpointPath = Objects.toString(uri.getPath(), \"\");\n\n      // What if URI#getAuthority() is null? Fallback to string parsing.\n      final String authority;\n      if (hostname != null) {\n        authority = hostname;\n      } else {\n        final int schemeSeparatorIdx = trimmedEndpoint.indexOf(\"://\");\n        final String withoutScheme =\n            schemeSeparatorIdx >= 0\n                ? trimmedEndpoint.substring(schemeSeparatorIdx + 3)\n                : trimmedEndpoint;\n        final int firstSlashIdx = withoutScheme.indexOf('/');\n        authority = firstSlashIdx >= 0 ? withoutScheme.substring(0, firstSlashIdx) : withoutScheme;\n      }\n\n      // authority may be:\n      // - gitlab-server.com\n      // - gitlab-server.com:8443\n      // - [2001:db8::1]\n      // - [2001:db8::1]:8443\n      final String hostOnly;\n      if (authority.startsWith(\"[\")) {\n        int closingBracket = authority.indexOf(']');\n        hostOnly = closingBracket > 0 ? authority.substring(0, closingBracket + 1) : authority;\n      } else {\n        int colonIdx = authority.indexOf(':');\n        hostOnly = colonIdx > 0 ? authority.substring(0, colonIdx) : authority;\n      }\n\n      // HTTP(S) patterns should match the configured endpoint prefix (including any extra path\n      // segment). SSH pattern should match host only.\n      // For HTTP(S) patterns we include any configured endpointPath and keep the port (if any) as a\n      // part of the \"host\" group. This allows GitlabUrl#getProviderUrl() to return values like\n      // \"https://host:8443/scm\" even though GitlabUrl models \"host\" and \"port\" separately.\n      final String httpHostForRegex = Pattern.quote(authority + endpointPath);\n      final String sshHostForRegex = Pattern.quote(hostOnly);\n      for (String gitlabUrlPatternTemplate : gitlabUrlPatternTemplates) {\n        gitlabUrlPatterns.add(\n            compile(format(gitlabUrlPatternTemplate, schema, httpHostForRegex, uri.getPort())));\n      }\n      gitlabUrlPatterns.add(compile(format(gitlabSSHPatternTemplate, sshHostForRegex)));\n    }\n  }\n\n  private boolean isUserTokenPresent(String repositoryUrl) {\n    Optional<String> serverUrlOptional = getServerUrl(repositoryUrl);\n    if (serverUrlOptional.isPresent()) {\n      String serverUrl = serverUrlOptional.get();\n      try {\n        Optional<PersonalAccessToken> token =\n            personalAccessTokenManager.get(\n                EnvironmentContext.getCurrent().getSubject(), null, serverUrl, null);\n        if (token.isPresent()) {\n          PersonalAccessToken accessToken = token.get();\n          return accessToken.getScmTokenName().equals(providerName);\n        }\n      } catch (ScmConfigurationPersistenceException | ScmCommunicationException exception) {\n        return false;\n      }\n    }\n    return false;\n  }\n\n  public boolean isValid(@NotNull String url) {\n    return gitlabUrlPatterns.stream()\n            .anyMatch(pattern -> pattern.matcher(trimEnd(url, '/')).matches())\n        // If the Gitlab URL is not configured, try to find it in a manually added user namespace\n        // token.\n        || isUserTokenPresent(url)\n        // Try to call an API request to see if the URL matches Gitlab.\n        || isApiRequestRelevant(url);\n  }\n\n  private boolean isApiRequestRelevant(String repositoryUrl) {\n    Optional<String> serverUrlOptional = getServerUrl(repositoryUrl);\n    if (serverUrlOptional.isPresent()) {\n      GitlabApiClient gitlabApiClient = new GitlabApiClient(serverUrlOptional.get());\n      try {\n        // If the token request catches the unauthorised error, it means that the provided url\n        // belongs to Gitlab.\n        gitlabApiClient.getOAuthTokenInfo(\"\");\n      } catch (ScmUnauthorizedException e) {\n        // Some Git providers e.g. Azure Devops Server, may return unauthorized exception on invalid\n        // API request, but Gitlab API returns unauthorized error message in JSON format, so to be\n        // sure that the URL belongs to Gitlab, we need to check if the error message is a valid\n        // JSON.\n        return isJsonValid(e.getMessage());\n      } catch (ScmItemNotFoundException | IllegalArgumentException | ScmCommunicationException e) {\n        return false;\n      }\n    }\n    return false;\n  }\n\n  private boolean isJsonValid(String message) {\n    try {\n      JsonObject unused = new JsonParser().parse(message).getAsJsonObject();\n      return true;\n    } catch (Exception exception) {\n      return false;\n    }\n  }\n\n  /**\n   * Converts an SSH git URL (git@host:path) to a parseable URI (ssh://git@host/path), handling IPv6\n   * addresses where colons in the address must not be replaced.\n   */\n  private static String sshToUri(String url) {\n    // Strip \"git@\" prefix\n    String afterAt = url.substring(4);\n    if (afterAt.startsWith(\"[\")) {\n      // IPv6: git@[2001:db8::1]:path -> ssh://git@[2001:db8::1]/path\n      int closingBracket = afterAt.indexOf(']');\n      if (closingBracket >= 0 && closingBracket + 1 < afterAt.length()) {\n        String host = afterAt.substring(0, closingBracket + 1);\n        // Skip the colon separator after the closing bracket\n        String path = afterAt.substring(closingBracket + 1);\n        if (path.startsWith(\":\")) {\n          path = path.substring(1);\n        }\n        return \"ssh://git@\" + host + \"/\" + path;\n      }\n    }\n    // Regular hostname: git@host:path -> ssh://git@host/path\n    return \"ssh://\" + url.replace(\":\", \"/\");\n  }\n\n  private Optional<Matcher> getPatternMatcherByUrl(String url) {\n    URI uri = URI.create(url.matches(format(gitlabSSHPatternTemplate, \".*\")) ? sshToUri(url) : url);\n    String scheme = uri.getScheme();\n    String host = uri.getHost();\n    // Handle IPv6 addresses: escape brackets for regex\n    final String hostForRegex;\n    if (host != null && host.startsWith(\"[\") && host.endsWith(\"]\")) {\n      // IPv6 address - strip brackets, then re-add with regex escaping\n      String ipv6 = host.substring(1, host.length() - 1);\n      hostForRegex = \"\\\\[\" + Pattern.quote(ipv6) + \"\\\\]\";\n    } else if (host != null) {\n      // Regular hostname - escape special regex characters\n      hostForRegex = Pattern.quote(host);\n    } else {\n      hostForRegex = \"\";\n    }\n    return gitlabUrlPatternTemplates.stream()\n        .map(t -> compile(format(t, scheme, hostForRegex, uri.getPort())).matcher(url))\n        .filter(Matcher::matches)\n        .findAny()\n        .or(\n            () -> {\n              Matcher matcher =\n                  compile(format(gitlabSSHPatternTemplate, hostForRegex)).matcher(url);\n              if (matcher.matches()) {\n                return Optional.of(matcher);\n              }\n              return Optional.empty();\n            });\n  }\n\n  private Optional<String> getServerUrl(String repositoryUrl) {\n    if (repositoryUrl.startsWith(\"git@\")) {\n      String substring = repositoryUrl.substring(4);\n      // Handle IPv6 addresses in SSH URLs (e.g., git@[2001:db8::1]:repo)\n      if (substring.startsWith(\"[\")) {\n        int closingBracket = substring.indexOf(']');\n        if (closingBracket > 0) {\n          return Optional.of(\"https://\" + substring.substring(0, closingBracket + 1));\n        }\n      }\n      return Optional.of(\"https://\" + substring.substring(0, substring.indexOf(\":\")));\n    }\n    // Use URI parsing to properly handle IPv6 addresses\n    try {\n      URI uri = URI.create(repositoryUrl);\n      if (uri.getScheme() != null && uri.getHost() != null) {\n        String authority = uri.getRawAuthority();\n        if (authority == null) {\n          String host = uri.getHost();\n          boolean ipv6 = host != null && host.contains(\":\");\n          String hostForUrl = ipv6 ? \"[\" + host + \"]\" : host;\n          int port = uri.getPort();\n          authority = port == -1 ? hostForUrl : hostForUrl + \":\" + port;\n        }\n\n        if (authority != null) {\n          String serverUrl = uri.getScheme() + \"://\" + authority;\n          // Remove path and query from the server URL\n          int authorityIdx = repositoryUrl.indexOf(authority);\n          if (authorityIdx >= 0) {\n            int pathIndex = authorityIdx + authority.length();\n            if (pathIndex < repositoryUrl.length() && repositoryUrl.charAt(pathIndex) == '/') {\n              return Optional.of(serverUrl);\n            }\n          }\n        }\n      }\n    } catch (IllegalArgumentException e) {\n      // Fall through to old logic if URI parsing fails\n    }\n    // Fallback for non-standard URLs\n    Matcher serverUrlMatcher = compile(\"[^/|:]/\").matcher(repositoryUrl);\n    if (serverUrlMatcher.find()) {\n      return Optional.of(\n          repositoryUrl.substring(0, repositoryUrl.indexOf(serverUrlMatcher.group()) + 1));\n    }\n    return Optional.empty();\n  }\n\n  /**\n   * Parses url-s like https://gitlab.apps.cluster-327a.327a.example.opentlc.com/root/proj1.git into\n   * {@link GitlabUrl} objects.\n   */\n  public GitlabUrl parse(String url, @Nullable String revision) {\n    String trimmedUrl = trimEnd(url, '/');\n    Optional<Matcher> matcherOptional =\n        gitlabUrlPatterns.stream()\n            .map(pattern -> pattern.matcher(trimmedUrl))\n            .filter(Matcher::matches)\n            .findFirst()\n            .or(() -> getPatternMatcherByUrl(trimmedUrl));\n    if (matcherOptional.isPresent()) {\n      return parse(matcherOptional.get(), revision).withUrl(trimmedUrl);\n    } else {\n      throw new UnsupportedOperationException(\n          \"The gitlab integration is not configured properly and cannot be used at this moment.\"\n              + \"Please refer to docs to check the Gitlab integration instructions\");\n    }\n  }\n\n  private GitlabUrl parse(Matcher matcher, @Nullable String revision) {\n    String scheme = null;\n    String port = null;\n    try {\n      scheme = matcher.group(\"scheme\");\n    } catch (IllegalArgumentException e) {\n      // ok no such group\n    }\n    String host = matcher.group(\"host\");\n    try {\n      port = matcher.group(\"port\");\n    } catch (IllegalArgumentException e) {\n      // ok no such group\n    }\n    String subGroups = trimEnd(matcher.group(\"subgroups\"), '/');\n    if (subGroups.endsWith(\".git\")) {\n      subGroups = subGroups.substring(0, subGroups.length() - 4);\n    }\n\n    String branchFromUrl = null;\n    try {\n      branchFromUrl = matcher.group(\"branch\");\n    } catch (IllegalArgumentException e) {\n      // ok no such group\n    }\n\n    return new GitlabUrl()\n        .withHostName(host)\n        .withPort(port)\n        .withScheme(scheme)\n        .withSubGroups(subGroups)\n        .withBranch(isNullOrEmpty(branchFromUrl) ? revision : branchFromUrl)\n        .withDevfileFilenames(devfileFilenamesProvider.getConfiguredDevfileFilenames());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab-common/src/main/java/org/eclipse/che/api/factory/server/gitlab/AbstractGitlabUserDataFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.base.Joiner;\nimport com.google.common.collect.ImmutableSet;\nimport java.util.Set;\nimport org.eclipse.che.api.factory.server.scm.*;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/** Gitlab OAuth token retriever. */\npublic class AbstractGitlabUserDataFetcher extends AbstractGitUserDataFetcher {\n\n  private final String serverUrl;\n  private final String apiEndpoint;\n  private final String providerName;\n\n  public static final Set<String> DEFAULT_TOKEN_SCOPES =\n      ImmutableSet.of(\"api\", \"write_repository\", \"openid\");\n  private static final String GITLAB_SAAS_ENDPOINT = \"https://gitlab.com\";\n\n  public AbstractGitlabUserDataFetcher(\n      @Nullable String serverUrl,\n      String apiEndpoint,\n      PersonalAccessTokenManager personalAccessTokenManager,\n      String providerName) {\n    super(\n        providerName,\n        isNullOrEmpty(serverUrl) ? GITLAB_SAAS_ENDPOINT : serverUrl,\n        personalAccessTokenManager);\n    this.serverUrl = super.oAuthProviderUrl;\n    this.apiEndpoint = apiEndpoint;\n    this.providerName = providerName;\n  }\n\n  @Override\n  protected GitUserData fetchGitUserDataWithOAuthToken(String token)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    GitlabUser user = new GitlabApiClient(serverUrl).getUser(token);\n    return new GitUserData(user.getName(), user.getEmail());\n  }\n\n  @Override\n  protected GitUserData fetchGitUserDataWithPersonalAccessToken(\n      PersonalAccessToken personalAccessToken)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    GitlabUser user =\n        new GitlabApiClient(personalAccessToken.getScmProviderUrl())\n            .getUser(personalAccessToken.getToken());\n    return new GitUserData(user.getName(), user.getEmail());\n  }\n\n  protected String getLocalAuthenticateUrl() {\n    return apiEndpoint\n        + \"/oauth/authenticate?oauth_provider=\"\n        + providerName\n        + \"&scope=\"\n        + Joiner.on('+').join(DEFAULT_TOKEN_SCOPES)\n        + \"&request_method=POST&signature_method=rsa\";\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab-common/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabApiClient.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static java.net.HttpURLConnection.HTTP_BAD_REQUEST;\nimport static java.net.HttpURLConnection.HTTP_NOT_FOUND;\nimport static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;\nimport static java.time.Duration.ofSeconds;\nimport static org.eclipse.che.commons.lang.StringUtils.trimEnd;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.google.common.base.Charsets;\nimport com.google.common.io.CharStreams;\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.UncheckedIOException;\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.time.Duration;\nimport java.util.concurrent.Executors;\nimport java.util.function.Function;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmBadRequestException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;\nimport org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** GitLab API operations helper. */\npublic class GitlabApiClient {\n\n  private static final Logger LOG = LoggerFactory.getLogger(GitlabApiClient.class);\n\n  private final HttpClient httpClient;\n  private final String serverUrl;\n\n  private static final Duration DEFAULT_HTTP_TIMEOUT = ofSeconds(10);\n  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();\n\n  public GitlabApiClient(String serverUrl) {\n    this.serverUrl = trimEnd(serverUrl, '/');\n    this.httpClient =\n        HttpClient.newBuilder()\n            .executor(\n                Executors.newCachedThreadPool(\n                    new ThreadFactoryBuilder()\n                        .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n                        .setNameFormat(GitlabApiClient.class.getName() + \"-%d\")\n                        .setDaemon(true)\n                        .build()))\n            .connectTimeout(DEFAULT_HTTP_TIMEOUT)\n            .version(HttpClient.Version.HTTP_1_1)\n            .build();\n  }\n\n  public GitlabUser getUser(String authenticationToken)\n      throws ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmBadRequestException,\n          ScmUnauthorizedException {\n    final URI uri = URI.create(serverUrl + \"/api/v4/user\");\n    HttpRequest request =\n        HttpRequest.newBuilder(uri)\n            .headers(\"Authorization\", \"Bearer \" + authenticationToken)\n            .timeout(DEFAULT_HTTP_TIMEOUT)\n            .build();\n    LOG.trace(\"executeRequest={}\", request);\n    return executeRequest(\n        httpClient,\n        request,\n        inputStream -> {\n          try {\n            String result =\n                CharStreams.toString(new InputStreamReader(inputStream, Charsets.UTF_8));\n            return OBJECT_MAPPER.readValue(result, GitlabUser.class);\n          } catch (IOException e) {\n            throw new UncheckedIOException(e);\n          }\n        });\n  }\n\n  public GitlabPersonalAccessTokenInfo getPersonalAccessTokenInfo(String authenticationToken)\n      throws ScmItemNotFoundException, ScmCommunicationException, ScmUnauthorizedException {\n    final URI uri = URI.create(serverUrl + \"/api/v4/personal_access_tokens/self\");\n    HttpRequest request =\n        HttpRequest.newBuilder(uri)\n            .headers(\"Authorization\", \"Bearer \" + authenticationToken)\n            .timeout(DEFAULT_HTTP_TIMEOUT)\n            .build();\n    LOG.trace(\"executeRequest={}\", request);\n    try {\n      return executeRequest(\n          httpClient,\n          request,\n          inputStream -> {\n            try {\n              String result =\n                  CharStreams.toString(new InputStreamReader(inputStream, Charsets.UTF_8));\n              return OBJECT_MAPPER.readValue(result, GitlabPersonalAccessTokenInfo.class);\n            } catch (IOException e) {\n              throw new UncheckedIOException(e);\n            }\n          });\n    } catch (ScmBadRequestException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  public GitlabOauthTokenInfo getOAuthTokenInfo(String authenticationToken)\n      throws ScmItemNotFoundException, ScmCommunicationException, ScmUnauthorizedException {\n    final URI uri = URI.create(serverUrl + \"/oauth/token/info\");\n    HttpRequest request =\n        HttpRequest.newBuilder(uri)\n            .headers(\"Authorization\", \"Bearer \" + authenticationToken)\n            .timeout(DEFAULT_HTTP_TIMEOUT)\n            .build();\n    LOG.trace(\"executeRequest={}\", request);\n    try {\n      return executeRequest(\n          httpClient,\n          request,\n          inputStream -> {\n            try {\n              String result =\n                  CharStreams.toString(new InputStreamReader(inputStream, Charsets.UTF_8));\n              return OBJECT_MAPPER.readValue(result, GitlabOauthTokenInfo.class);\n            } catch (IOException e) {\n              throw new UncheckedIOException(e);\n            }\n          });\n    } catch (ScmBadRequestException e) {\n      throw new ScmCommunicationException(e.getMessage(), e);\n    }\n  }\n\n  private <T> T executeRequest(\n      HttpClient httpClient, HttpRequest request, Function<InputStream, T> bodyConverter)\n      throws ScmBadRequestException,\n          ScmItemNotFoundException,\n          ScmCommunicationException,\n          ScmUnauthorizedException {\n    String provider = \"http://gitlab.com\".equals(serverUrl.toString()) ? \"gitlab\" : \"gitlab-server\";\n    try {\n      HttpResponse<InputStream> response =\n          httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());\n      LOG.trace(\"executeRequest={} response {}\", request, response.statusCode());\n      if (response.statusCode() == 200) {\n        return bodyConverter.apply(response.body());\n      } else if (response.statusCode() == 204) {\n        return null;\n      } else {\n        String body = CharStreams.toString(new InputStreamReader(response.body(), Charsets.UTF_8));\n        switch (response.statusCode()) {\n          case HTTP_BAD_REQUEST:\n            throw new ScmBadRequestException(body);\n          case HTTP_NOT_FOUND:\n            throw new ScmItemNotFoundException(body);\n          case HTTP_UNAUTHORIZED:\n            throw new ScmUnauthorizedException(body, \"gitlab\", \"v2\", \"\");\n          default:\n            throw new ScmCommunicationException(\n                \"Unexpected status code \" + response.statusCode() + \" \" + response,\n                response.statusCode(),\n                provider);\n        }\n      }\n    } catch (IOException | InterruptedException | UncheckedIOException e) {\n      throw new ScmCommunicationException(e.getMessage(), e, provider);\n    }\n  }\n\n  public boolean isConnected(String scmServerUrl) {\n    return serverUrl.equals(scmServerUrl);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab-common/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabAuthorizingFileContentProvider.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static java.net.HttpURLConnection.HTTP_OK;\nimport static java.time.Duration.ofSeconds;\n\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.time.Duration;\nimport java.util.concurrent.Executors;\nimport org.eclipse.che.api.factory.server.scm.AuthorizingFileContentProvider;\nimport org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\n\n/** Gitlab specific authorizing file content provider. */\nclass GitlabAuthorizingFileContentProvider extends AuthorizingFileContentProvider<GitlabUrl> {\n\n  private final HttpClient httpClient;\n\n  private static final Duration DEFAULT_HTTP_TIMEOUT = ofSeconds(10);\n\n  GitlabAuthorizingFileContentProvider(\n      GitlabUrl gitlabUrl,\n      URLFetcher urlFetcher,\n      PersonalAccessTokenManager personalAccessTokenManager) {\n    super(gitlabUrl, urlFetcher, personalAccessTokenManager);\n    this.httpClient =\n        HttpClient.newBuilder()\n            .executor(\n                Executors.newCachedThreadPool(\n                    new ThreadFactoryBuilder()\n                        .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n                        .setNameFormat(GitlabAuthorizingFileContentProvider.class.getName() + \"-%d\")\n                        .setDaemon(true)\n                        .build()))\n            .connectTimeout(DEFAULT_HTTP_TIMEOUT)\n            .version(HttpClient.Version.HTTP_1_1)\n            .build();\n  }\n\n  @Override\n  protected boolean isPublicRepository(GitlabUrl remoteFactoryUrl) {\n    HttpRequest request =\n        HttpRequest.newBuilder(\n                URI.create(\n                    remoteFactoryUrl.getProviderUrl() + '/' + remoteFactoryUrl.getSubGroups()))\n            .timeout(DEFAULT_HTTP_TIMEOUT)\n            .build();\n    try {\n      HttpResponse<InputStream> response =\n          httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());\n      return response.statusCode() == HTTP_OK;\n    } catch (IOException | InterruptedException e) {\n      return false;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab-common/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabOauthTokenInfo.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport java.util.Arrays;\nimport java.util.Objects;\n\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class GitlabOauthTokenInfo {\n\n  private long resource_owner_id;\n  private String[] scope;\n  private long expires_in;\n  private long created_at;\n\n  public long getResource_owner_id() {\n    return resource_owner_id;\n  }\n\n  public void setResource_owner_id(long resource_owner_id) {\n    this.resource_owner_id = resource_owner_id;\n  }\n\n  public String[] getScope() {\n    return scope;\n  }\n\n  public void setScope(String[] scope) {\n    this.scope = scope;\n  }\n\n  public long getExpires_in() {\n    return expires_in;\n  }\n\n  public void setExpires_in(long expires_in) {\n    this.expires_in = expires_in;\n  }\n\n  public long getCreated_at() {\n    return created_at;\n  }\n\n  public void setCreated_at(long created_at) {\n    this.created_at = created_at;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    GitlabOauthTokenInfo info = (GitlabOauthTokenInfo) o;\n    return resource_owner_id == info.resource_owner_id\n        && expires_in == info.expires_in\n        && created_at == info.created_at\n        && Arrays.equals(scope, info.scope);\n  }\n\n  @Override\n  public int hashCode() {\n    int result = Objects.hash(resource_owner_id, expires_in, created_at);\n    result = 31 * result + Arrays.hashCode(scope);\n    return result;\n  }\n\n  @Override\n  public String toString() {\n    return \"GitlabOauthTokenInfo{\"\n        + \"resource_owner_id=\"\n        + resource_owner_id\n        + \", scope=\"\n        + Arrays.toString(scope)\n        + \", expires_in=\"\n        + expires_in\n        + \", created_at=\"\n        + created_at\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab-common/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabPersonalAccessTokenInfo.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport java.util.Arrays;\nimport java.util.Objects;\n\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class GitlabPersonalAccessTokenInfo {\n\n  private int id;\n  private String[] scopes;\n  private String expires_at;\n  private String created_at;\n\n  public int getId() {\n    return id;\n  }\n\n  public void setId(int id) {\n    this.id = id;\n  }\n\n  public String[] getScopes() {\n    return scopes;\n  }\n\n  public void setScopes(String[] scopes) {\n    this.scopes = scopes;\n  }\n\n  public String getExpires_at() {\n    return expires_at;\n  }\n\n  public void setExpires_at(String expires_at) {\n    this.expires_at = expires_at;\n  }\n\n  public String getCreated_at() {\n    return created_at;\n  }\n\n  public void setCreated_at(String created_at) {\n    this.created_at = created_at;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    GitlabPersonalAccessTokenInfo info = (GitlabPersonalAccessTokenInfo) o;\n    return id == info.id\n        && Objects.equals(expires_at, info.expires_at)\n        && created_at == info.created_at\n        && Arrays.equals(scopes, info.scopes);\n  }\n\n  @Override\n  public int hashCode() {\n    int result = Objects.hash(id, expires_at, created_at);\n    result = 31 * result + Arrays.hashCode(scopes);\n    return result;\n  }\n\n  @Override\n  public String toString() {\n    return \"GitlabOauthTokenInfo{\"\n        + \"resource_owner_id=\"\n        + id\n        + \", scope=\"\n        + Arrays.toString(scopes)\n        + \", expires_at=\"\n        + expires_at\n        + \", created_at=\"\n        + created_at\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab-common/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabUrl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.net.URLEncoder.encode;\n\nimport com.google.common.base.Charsets;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.StringJoiner;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.factory.server.urlfactory.DefaultFactoryUrl;\n\n/**\n * Representation of a gitlab URL, allowing to get details from it.\n *\n * <p>like https://gitlab.com/path/to/repository or\n * https://gitlab.com/path/to/repository/-/tree/<branch>\n *\n * @author Max Shaposhnyk\n */\npublic class GitlabUrl extends DefaultFactoryUrl {\n\n  private final String NAME = \"gitlab\";\n\n  /** Hostname of the gitlab URL */\n  private String hostName;\n\n  /** Port of the gitlab URL */\n  private String port;\n\n  /** Scheme of the gitlab URL */\n  private String scheme;\n\n  /** Project part of the gitlab URL */\n  private String project;\n\n  /**\n   * Incorporates subgroups in the project path of the gitlab URL. See details at:\n   * https://docs.gitlab.com/ee/user/group/subgroups/\n   */\n  private String subGroups;\n\n  /** Branch name */\n  private String branch;\n\n  /** Devfile filenames list */\n  private final List<String> devfileFilenames = new ArrayList<>();\n\n  /**\n   * Creation of this instance is made by the parser so user may not need to create a new instance\n   * directly\n   */\n  protected GitlabUrl() {}\n\n  @Override\n  public String getProviderName() {\n    return NAME;\n  }\n\n  @Override\n  public String getProviderUrl() {\n    return (isNullOrEmpty(scheme) ? \"https\" : scheme)\n        + \"://\"\n        + hostName\n        + (isNullOrEmpty(port) ? \"\" : \":\" + port);\n  }\n\n  /**\n   * Gets hostname of this gitlab url\n   *\n   * @return the project part\n   */\n  public String getHostName() {\n    return this.hostName;\n  }\n\n  public GitlabUrl withHostName(String hostName) {\n    this.hostName = hostName;\n    return this;\n  }\n\n  public GitlabUrl withPort(String port) {\n    this.port = port;\n    return this;\n  }\n\n  public GitlabUrl withScheme(String scheme) {\n    this.scheme = scheme;\n    return this;\n  }\n\n  /**\n   * Gets project of this bitbucket url\n   *\n   * @return the project part\n   */\n  public String getProject() {\n    return this.project;\n  }\n\n  public String getSubGroups() {\n    return subGroups;\n  }\n\n  protected GitlabUrl withSubGroups(String subGroups) {\n    this.subGroups = subGroups;\n\n    String[] subGroupsItems = subGroups.split(\"/\");\n    this.project =\n        subGroupsItems[subGroupsItems.length - 1]; // project (repository) name is the last item\n    return this;\n  }\n\n  protected GitlabUrl withDevfileFilenames(List<String> devfileFilenames) {\n    this.devfileFilenames.addAll(devfileFilenames);\n    return this;\n  }\n\n  @Override\n  public void setDevfileFilename(String devfileName) {\n    this.devfileFilenames.clear();\n    this.devfileFilenames.add(devfileName);\n  }\n\n  /**\n   * Gets branch of this gitlab url\n   *\n   * @return the branch part\n   */\n  public String getBranch() {\n    return this.branch;\n  }\n\n  protected GitlabUrl withBranch(String branch) {\n    if (!isNullOrEmpty(branch)) {\n      this.branch = branch;\n    }\n    return this;\n  }\n\n  /**\n   * Provides list of configured devfile filenames with locations\n   *\n   * @return list of devfile filenames and locations\n   */\n  @Override\n  public List<DevfileLocation> devfileFileLocations() {\n    return devfileFilenames.stream().map(this::createDevfileLocation).collect(Collectors.toList());\n  }\n\n  private DevfileLocation createDevfileLocation(String devfileFilename) {\n    return new DevfileLocation() {\n      @Override\n      public Optional<String> filename() {\n        return Optional.of(devfileFilename);\n      }\n\n      @Override\n      public String location() {\n        return rawFileLocation(devfileFilename);\n      }\n    };\n  }\n\n  /**\n   * Provides location to raw content of specified file\n   *\n   * @return location of specified file in a repository\n   */\n  public String rawFileLocation(String fileName) {\n    String resultUrl =\n        new StringJoiner(\"/\")\n            .add(\n                (isNullOrEmpty(scheme) ? \"https\" : scheme)\n                    + \"://\"\n                    + hostName\n                    + (isNullOrEmpty(port) ? \"\" : \":\" + port))\n            .add(\"api/v4/projects\")\n            // use URL-encoded path to the project as a selector instead of id\n            .add(encode(subGroups, Charsets.UTF_8))\n            .add(\"repository\")\n            .add(\"files\")\n            .add(encode(fileName, Charsets.UTF_8))\n            .add(\"raw?ref=\" + (isNullOrEmpty(branch) ? \"HEAD\" : branch))\n            .toString();\n\n    return resultUrl;\n  }\n\n  /**\n   * Provides location to the repository part of the full gitlab URL.\n   *\n   * @return location of the repository.\n   */\n  protected String repositoryLocation() {\n    if (isNullOrEmpty(scheme)) {\n      return \"git@\" + hostName + \":\" + subGroups + \".git\";\n    }\n    return scheme\n        + \"://\"\n        + hostName\n        + (isNullOrEmpty(port) ? \"\" : \":\" + port)\n        + \"/\"\n        + subGroups\n        + \".git\";\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-gitlab-common/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabUser.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.server.gitlab;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport java.util.Objects;\n\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class GitlabUser {\n\n  private long id;\n  private String username;\n  private String email;\n  private String name;\n  private String state;\n\n  public long getId() {\n    return id;\n  }\n\n  public void setId(long id) {\n    this.id = id;\n  }\n\n  public String getUsername() {\n    return username;\n  }\n\n  public void setUsername(String username) {\n    this.username = username;\n  }\n\n  public String getEmail() {\n    return email;\n  }\n\n  public void setEmail(String email) {\n    this.email = email;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  public String getState() {\n    return state;\n  }\n\n  public void setState(String state) {\n    this.state = state;\n  }\n\n  @Override\n  public String toString() {\n    return \"GitlabUser{\"\n        + \"id=\"\n        + id\n        + \", userame='\"\n        + username\n        + '\\''\n        + \", email='\"\n        + email\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", state='\"\n        + state\n        + '\\''\n        + '}';\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    GitlabUser that = (GitlabUser) o;\n    return id == that.id\n        && Objects.equals(username, that.username)\n        && Objects.equals(email, that.email)\n        && Objects.equals(name, that.name)\n        && Objects.equals(state, that.state);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, username, email, name, state);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-factory-shared</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Factory :: Shared</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n            <scope>provided</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-resource</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <id>server</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                        <configuration>\n                            <dtoPackages>\n                                <package>org.eclipse.che.api.factory.shared.dto</package>\n                            </dtoPackages>\n                            <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                            <genClassName>org.eclipse.che.api.factory.shared.dto.server.DtoServerImpls</genClassName>\n                            <impl>server</impl>\n                        </configuration>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-factory-shared</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-model</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/src/main/java/org/eclipse/che/api/factory/shared/Constants.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.shared;\n\nimport java.util.Map;\n\n/**\n * Constants for Factory API.\n *\n * @author Anton Korneta\n */\npublic final class Constants {\n\n  public static final String CURRENT_VERSION = \"4.0\";\n\n  // factory links rel attributes\n  public static final String IMAGE_REL_ATT = \"image\";\n  public static final String RETRIEVE_FACTORY_REL_ATT = \"self\";\n  public static final String FACTORY_ACCEPTANCE_REL_ATT = \"accept\";\n  public static final String NAMED_FACTORY_ACCEPTANCE_REL_ATT = \"accept-named\";\n\n  // url factory parameter names\n  public static final String URL_PARAMETER_NAME = \"url\";\n  public static final String REVISION_PARAMETER_NAME = \"revision\";\n\n  public static final Map<String, Object> DEFAULT_DEVFILE = Map.of(\"schemaVersion\", \"2.3.0\");\n\n  private Constants() {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/src/main/java/org/eclipse/che/api/factory/shared/dto/AuthorDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.factory.Author;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describes author of the factory\n *\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface AuthorDto extends Author {\n\n  /** Id of user that create factory, set by the server */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL, setByServer = true)\n  String getUserId();\n\n  void setUserId(String userId);\n\n  AuthorDto withUserId(String userId);\n\n  /**\n   * @return Creation time of factory, set by the server (in milliseconds, from Unix epoch, no\n   *     timezone)\n   */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL, setByServer = true)\n  Long getCreated();\n\n  void setCreated(Long created);\n\n  AuthorDto withCreated(Long created);\n\n  /** Name of the author */\n  @FactoryParameter(obligation = OPTIONAL)\n  String getName();\n\n  void setName(String name);\n\n  AuthorDto withName(String name);\n\n  /** Email of the author */\n  @FactoryParameter(obligation = OPTIONAL)\n  String getEmail();\n\n  void setEmail(String email);\n\n  AuthorDto withEmail(String email);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/src/main/java/org/eclipse/che/api/factory/shared/dto/FactoryDevfileV2Dto.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.MANDATORY;\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.rest.shared.dto.Hyperlinks;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.dto.shared.JsonFieldName;\n\n/**\n * Factory DTO for Devfile v2. As che-server don't know the structure of Devfile v2, we're using\n * just generic {@code Map<String, Object>} here.\n */\n@DTO\npublic interface FactoryDevfileV2Dto extends FactoryMetaDto, Hyperlinks {\n\n  @Override\n  default FactoryMetaDto acceptVisitor(FactoryVisitor visitor) {\n    return visitor.visit(this);\n  }\n\n  @Override\n  FactoryDevfileV2Dto withV(String v);\n\n  @FactoryParameter(obligation = MANDATORY)\n  Map<String, Object> getDevfile();\n\n  void setDevfile(Map<String, Object> devfile);\n\n  FactoryDevfileV2Dto withDevfile(Map<String, Object> devfile);\n\n  @FactoryParameter(obligation = OPTIONAL)\n  @JsonFieldName(\"scm_info\")\n  ScmInfoDto getScmInfo();\n\n  FactoryDevfileV2Dto withScmInfo(ScmInfoDto scmInfo);\n\n  @Override\n  FactoryDevfileV2Dto withSource(String source);\n\n  @Override\n  FactoryDevfileV2Dto withLinks(List<Link> links);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/src/main/java/org/eclipse/che/api/factory/shared/dto/FactoryMetaDto.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.MANDATORY;\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.rest.shared.dto.Hyperlinks;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\n\n/** Ancestor for Factory DTOs that does not know about devfile version it will hold. */\npublic interface FactoryMetaDto extends Hyperlinks {\n\n  /**\n   * Gives an option to update the factory based on devfile version. See {@link FactoryVisitor}.\n   *\n   * @param visitor visitor that should update the factory\n   * @return updated factory\n   */\n  FactoryMetaDto acceptVisitor(FactoryVisitor visitor);\n\n  @FactoryParameter(obligation = MANDATORY)\n  String getV();\n\n  void setV(String v);\n\n  FactoryMetaDto withV(String v);\n\n  /**\n   * Indicates filename in repository from which the factory was created (for example, .devfile) or\n   * just contains 'repo' value if factory was created from bare GitHub repository. For custom raw\n   * URL's (pastebin, gist etc) value is {@code null}\n   */\n  @FactoryParameter(obligation = OPTIONAL, setByServer = true)\n  String getSource();\n\n  void setSource(String source);\n\n  FactoryMetaDto withSource(String source);\n\n  @FactoryParameter(obligation = OPTIONAL)\n  String getName();\n\n  void setName(String name);\n\n  FactoryMetaDto withName(String name);\n\n  @FactoryParameter(obligation = OPTIONAL, setByServer = true)\n  String getId();\n\n  void setId(String id);\n\n  FactoryMetaDto withId(String id);\n\n  @FactoryParameter(obligation = OPTIONAL)\n  AuthorDto getCreator();\n\n  void setCreator(AuthorDto creator);\n\n  FactoryMetaDto withCreator(AuthorDto creator);\n\n  @Override\n  FactoryMetaDto withLinks(List<Link> links);\n\n  @FactoryParameter(obligation = OPTIONAL, trackedOnly = true)\n  PoliciesDto getPolicies();\n\n  void setPolicies(PoliciesDto policies);\n\n  FactoryMetaDto withPolicies(PoliciesDto policies);\n\n  @FactoryParameter(obligation = OPTIONAL)\n  IdeDto getIde();\n\n  void setIde(IdeDto ide);\n\n  FactoryMetaDto withIde(IdeDto ide);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/src/main/java/org/eclipse/che/api/factory/shared/dto/FactoryVisitor.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.shared.dto;\n\n/**\n * Visitor that allows us to do necessary updates to the factory, like include default devfile, set\n * project url, set branch of the project etc.\n */\npublic interface FactoryVisitor {\n\n  /**\n   * Visit factory with devfile v2.\n   *\n   * <p>Implementation should update given factory and give it back.\n   *\n   * <p>Che-server does not know devfile v2 structure so most likely we don't want to do anything\n   * with it. The default implementation is here for that reason.\n   *\n   * @param factoryDto factory to visit\n   * @return update factory\n   */\n  default FactoryDevfileV2Dto visit(FactoryDevfileV2Dto factoryDto) {\n    // most likely nothing to do with Devfile v2 factory as we don't know or touch the structure\n    return factoryDto;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/src/main/java/org/eclipse/che/api/factory/shared/dto/IdeActionDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.factory.Action;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describe ide action.\n *\n * @author Sergii Kabashniuk\n */\n@DTO\npublic interface IdeActionDto extends Action {\n\n  /**\n   * Action Id\n   *\n   * @return id of action.\n   */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getId();\n\n  void setId(String id);\n\n  IdeActionDto withId(String id);\n\n  /**\n   * *\n   *\n   * @return Action properties\n   */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Map<String, String> getProperties();\n\n  void setProperties(Map<String, String> properties);\n\n  IdeActionDto withProperties(Map<String, String> properties);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/src/main/java/org/eclipse/che/api/factory/shared/dto/IdeDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.factory.Ide;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describe IDE interface Look and Feel\n *\n * @author Sergii Kabashniuk\n */\n@DTO\npublic interface IdeDto extends Ide {\n\n  /**\n   * @return configuration of IDE on application loaded event.\n   */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  OnAppLoadedDto getOnAppLoaded();\n\n  void setOnAppLoaded(OnAppLoadedDto onAppLoaded);\n\n  IdeDto withOnAppLoaded(OnAppLoadedDto onAppLoaded);\n\n  /**\n   * @return configuration of IDE on application closed event.\n   */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  OnAppClosedDto getOnAppClosed();\n\n  void setOnAppClosed(OnAppClosedDto onAppClosed);\n\n  IdeDto withOnAppClosed(OnAppClosedDto onAppClosed);\n\n  /**\n   * @return configuration of IDE on projects loaded event.\n   */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  OnProjectsLoadedDto getOnProjectsLoaded();\n\n  void setOnProjectsLoaded(OnProjectsLoadedDto onProjectsLoaded);\n\n  IdeDto withOnProjectsLoaded(OnProjectsLoadedDto onProjectsLoaded);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/src/main/java/org/eclipse/che/api/factory/shared/dto/OnAppClosedDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.factory.OnAppClosed;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describe IDE look and feel on application closed event.\n *\n * @author Sergii Kabashniuk\n */\n@DTO\npublic interface OnAppClosedDto extends OnAppClosed {\n\n  /**\n   * @return actions for current event.\n   */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  List<IdeActionDto> getActions();\n\n  void setActions(List<IdeActionDto> actions);\n\n  OnAppClosedDto withActions(List<IdeActionDto> actions);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/src/main/java/org/eclipse/che/api/factory/shared/dto/OnAppLoadedDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.factory.OnAppLoaded;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describe IDE look and feel on application loaded event.\n *\n * @author Sergii Kabashniuk\n */\n@DTO\npublic interface OnAppLoadedDto extends OnAppLoaded {\n\n  /**\n   * @return actions for current event.\n   */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  List<IdeActionDto> getActions();\n\n  void setActions(List<IdeActionDto> actions);\n\n  OnAppLoadedDto withActions(List<IdeActionDto> actions);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/src/main/java/org/eclipse/che/api/factory/shared/dto/OnProjectsLoadedDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.factory.OnProjectsLoaded;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describe IDE look and feel on project opened event.\n *\n * @author Sergii Kabashniuk\n */\n@DTO\npublic interface OnProjectsLoadedDto extends OnProjectsLoaded {\n\n  /**\n   * @return actions for current event.\n   */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  List<IdeActionDto> getActions();\n\n  void setActions(List<IdeActionDto> actions);\n\n  OnProjectsLoadedDto withActions(List<IdeActionDto> actions);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/src/main/java/org/eclipse/che/api/factory/shared/dto/PoliciesDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.factory.Policies;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describe restrictions of the factory\n *\n * @author andrew00x\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface PoliciesDto extends Policies {\n  /** Restrict access if referer header doesn't match this field */\n  // Do not change referer to referrer\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getReferer();\n\n  void setReferer(String referer);\n\n  PoliciesDto withReferer(String referer);\n\n  /** Restrict access for factories used earlier then author supposes */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Long getSince();\n\n  void setSince(Long since);\n\n  PoliciesDto withSince(Long since);\n\n  /** Restrict access for factories used later then author supposes */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Long getUntil();\n\n  void setUntil(Long until);\n\n  PoliciesDto withUntil(Long until);\n\n  /** Workspace creation strategy */\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getCreate();\n\n  void setCreate(String create);\n\n  PoliciesDto withCreate(String create);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-factory-shared/src/main/java/org/eclipse/che/api/factory/shared/dto/ScmInfoDto.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.factory.shared.dto;\n\nimport org.eclipse.che.api.core.model.factory.ScmInfo;\nimport org.eclipse.che.dto.shared.DTO;\nimport org.eclipse.che.dto.shared.JsonFieldName;\n\n@DTO\npublic interface ScmInfoDto extends ScmInfo {\n\n  @Override\n  @JsonFieldName(\"scm_provider\")\n  String getScmProviderName();\n\n  void setScmProviderName(String scmProviderName);\n\n  ScmInfoDto withScmProviderName(String scmProviderName);\n\n  @Override\n  @JsonFieldName(\"clone_url\")\n  String getRepositoryUrl();\n\n  void setRepositoryUrl(String repositoryUrl);\n\n  ScmInfoDto withRepositoryUrl(String repositoryUrl);\n\n  @Override\n  String getBranch();\n\n  void setBranch(String branch);\n\n  ScmInfoDto withBranch(String branch);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-logger/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-logger</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Logger</name>\n    <properties>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.swagger.core.v3</groupId>\n            <artifactId>swagger-annotations-jakarta</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-logger-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Mock testing -->\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Mock testing of REST services -->\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Test dependencies -->\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-logger/src/main/java/org/eclipse/che/api/logger/ErrorRuntimeLogEventLogger.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.logger;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.core.notification.EventSubscriber;\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeIdentityDto;\nimport org.eclipse.che.api.workspace.shared.dto.event.RuntimeLogEvent;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * The goal of this class is to catch all RuntimeLogEvent events from error stream and dump them to\n * slf4j log.\n */\n@Singleton\npublic class ErrorRuntimeLogEventLogger implements EventSubscriber<RuntimeLogEvent> {\n\n  private static final Logger LOG = LoggerFactory.getLogger(ErrorRuntimeLogEventLogger.class);\n\n  @Inject\n  public void subscribe(EventService eventService) {\n    eventService.subscribe(this, RuntimeLogEvent.class);\n  }\n\n  @Override\n  public void onEvent(RuntimeLogEvent event) {\n    if (\"stderr\".equalsIgnoreCase(event.getStream()) && !isNullOrEmpty(event.getText())) {\n      RuntimeIdentityDto identity = event.getRuntimeId();\n      LOG.error(\n          \"{} error from owner=`{}` env=`{}` workspace=`{}` text=`{}` time=`{}`\",\n          event.getMachineName() != null ? \"Machine `\" + event.getMachineName() + \"`\" : \"Runtime\",\n          identity.getOwnerId(),\n          identity.getEnvName(),\n          identity.getWorkspaceId(),\n          event.getText(),\n          event.getTime());\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-logger/src/main/java/org/eclipse/che/api/logger/LoggerService.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.logger;\n\nimport static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport ch.qos.logback.classic.Level;\nimport ch.qos.logback.classic.Logger;\nimport ch.qos.logback.classic.LoggerContext;\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.Parameter;\nimport io.swagger.v3.oas.annotations.media.ArraySchema;\nimport io.swagger.v3.oas.annotations.media.Content;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.ws.rs.Consumes;\nimport jakarta.ws.rs.DefaultValue;\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.POST;\nimport jakarta.ws.rs.PUT;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.PathParam;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.QueryParam;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.rest.Service;\nimport org.eclipse.che.api.logger.shared.dto.LoggerDto;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Defines Logger REST API. It allows to manage the loggers (with log level) dynamically.\n *\n * @author Florent Benoit\n */\n@Tag(name = \"logger\", description = \"Logger REST API\")\n@Path(\"/logger\")\npublic class LoggerService extends Service {\n\n  @GET\n  @Path(\"/{name}\")\n  @Produces(APPLICATION_JSON)\n  @Operation(\n      summary = \"Get the logger level for the given logger\",\n      responses = {\n        @ApiResponse(\n            responseCode = \"200\",\n            description = \"The response contains requested logger entity\"),\n        @ApiResponse(\n            responseCode = \"404\",\n            description = \"The logger with specified name does not exist\")\n      })\n  public LoggerDto getLoggerByName(\n      @Parameter(description = \"logger name\") @PathParam(\"name\") String name)\n      throws NotFoundException {\n    return asDto(getLogger(name));\n  }\n\n  @GET\n  @Produces(APPLICATION_JSON)\n  @Operation(\n      summary =\n          \"Get loggers which are configured. This operation can be performed only by authorized user\",\n      responses = {\n        @ApiResponse(\n            responseCode = \"200\",\n            description = \"The loggers successfully fetched\",\n            content =\n                @Content(array = @ArraySchema(schema = @Schema(implementation = LoggerDto.class)))),\n      })\n  public List<LoggerDto> getLoggers(\n      @Parameter(description = \"The number of the items to skip\")\n          @DefaultValue(\"0\")\n          @QueryParam(\"skipCount\")\n          Integer skipCount,\n      @Parameter(description = \"The limit of the items in the response, default is 30\")\n          @DefaultValue(\"30\")\n          @QueryParam(\"maxItems\")\n          Integer maxItems) {\n    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();\n\n    return loggerContext.getLoggerList().stream()\n        .filter(log -> log.getLevel() != null || log.iteratorForAppenders().hasNext())\n        .skip(skipCount)\n        .limit(maxItems)\n        .map(this::asDto)\n        .collect(Collectors.toList());\n  }\n\n  protected LoggerDto asDto(final Logger log) {\n    return newDto(LoggerDto.class).withName(log.getName()).withLevel(log.getLevel().levelStr);\n  }\n\n  @PUT\n  @Path(\"/{name}\")\n  @Consumes(APPLICATION_JSON)\n  @Produces(APPLICATION_JSON)\n  @Operation(\n      summary = \"Update the logger level\",\n      responses = {\n        @ApiResponse(responseCode = \"200\", description = \"The logger successfully updated\"),\n      })\n  public LoggerDto updateLogger(\n      @Parameter(description = \"logger name\") @PathParam(\"name\") String name, LoggerDto update)\n      throws NotFoundException {\n    Logger logger = getLogger(name);\n    logger.setLevel(Level.toLevel(update.getLevel()));\n    return asDto(logger);\n  }\n\n  @POST\n  @Path(\"/{name}\")\n  @Consumes(APPLICATION_JSON)\n  @Produces(APPLICATION_JSON)\n  @Operation(\n      summary = \"Create a new logger level\",\n      responses = {\n        @ApiResponse(responseCode = \"200\", description = \"The logger successfully created\"),\n      })\n  public LoggerDto createLogger(\n      @Parameter(description = \"logger name\") @PathParam(\"name\") String name,\n      LoggerDto createdLogger)\n      throws NotFoundException {\n    Logger logger = getLogger(name, false);\n    logger.setLevel(Level.toLevel(createdLogger.getLevel()));\n    return asDto(logger);\n  }\n\n  /** Check if given logger exists */\n  protected Logger getLogger(String name) throws NotFoundException {\n    return getLogger(name, true);\n  }\n\n  /**\n   * Gets a logger, if checkLevel is true and if logger has no level defined it will return a\n   * NameNotFound exception\n   */\n  protected Logger getLogger(String name, boolean checkLevel) throws NotFoundException {\n    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();\n\n    Logger log = loggerContext.getLogger(name);\n    if (checkLevel && log.getLevel() == null) {\n      throw new NotFoundException(\"The logger with name \" + name + \" is not existing.\");\n    }\n    return log;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-logger/src/main/java/org/eclipse/che/api/logger/deploy/LoggerModule.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.logger.deploy;\n\nimport com.google.inject.AbstractModule;\nimport org.eclipse.che.api.logger.ErrorRuntimeLogEventLogger;\n\npublic class LoggerModule extends AbstractModule {\n  @Override\n  protected void configure() {\n    bind(org.eclipse.che.api.logger.LoggerService.class);\n    bind(ErrorRuntimeLogEventLogger.class).asEagerSingleton();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-logger/src/test/java/org/eclipse/che/api/logger/LoggerServiceTest.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.logger;\n\nimport static io.restassured.RestAssured.given;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.everrest.assured.JettyHttpServer.ADMIN_USER_NAME;\nimport static org.everrest.assured.JettyHttpServer.ADMIN_USER_PASSWORD;\nimport static org.everrest.assured.JettyHttpServer.SECURE_PATH;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertTrue;\n\nimport io.restassured.response.Response;\nimport java.util.Collections;\nimport java.util.List;\nimport org.eclipse.che.api.core.rest.ApiExceptionMapper;\nimport org.eclipse.che.api.core.rest.shared.dto.ServiceError;\nimport org.eclipse.che.api.logger.shared.dto.LoggerDto;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.SubjectImpl;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.everrest.assured.EverrestJetty;\nimport org.everrest.core.Filter;\nimport org.everrest.core.GenericContainerRequest;\nimport org.everrest.core.RequestFilter;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@link org.eclipse.che.api.logger.LoggerService}.\n *\n * @author Florent Benoit\n */\n@Listeners(value = {EverrestJetty.class, MockitoTestNGListener.class})\npublic class LoggerServiceTest {\n\n  @SuppressWarnings(\"unused\")\n  private static final ApiExceptionMapper MAPPER = new ApiExceptionMapper();\n\n  private static final String NAMESPACE = \"user\";\n  private static final String USER_ID = \"user123\";\n  private static final String LOGGER_NAME = \"org.eclipse.che.api-sample-logger\";\n\n  @SuppressWarnings(\"unused\")\n  private static final EnvironmentFilter FILTER = new EnvironmentFilter();\n\n  private LoggerService loggerService;\n\n  @BeforeMethod\n  public void setup() {\n    loggerService = new LoggerService();\n  }\n\n  @Test\n  public void shouldGetLogger() {\n\n    final Response response =\n        given()\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .when()\n            .get(SECURE_PATH + \"/logger/ROOT\");\n\n    assertEquals(response.getStatusCode(), 200);\n    LoggerDto remoteLoggerDto =\n        DtoFactory.getInstance().createDtoFromJson(response.body().print(), LoggerDto.class);\n    assertNotNull(remoteLoggerDto);\n    assertEquals(remoteLoggerDto.getName(), \"ROOT\");\n    assertEquals(remoteLoggerDto.getLevel(), \"INFO\");\n  }\n\n  @Test\n  public void shouldGetNotFoundExceptionOnUnknownLogger() {\n\n    final Response response =\n        given()\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .when()\n            .get(SECURE_PATH + \"/logger/unknown\");\n\n    assertEquals(response.getStatusCode(), 404);\n    assertEquals(\n        DtoFactory.getInstance()\n            .createDtoFromJson(response.body().print(), ServiceError.class)\n            .getMessage(),\n        \"The logger with name unknown is not existing.\");\n  }\n\n  @Test\n  public void shouldGetLoggers() throws Exception {\n\n    final Response response =\n        given()\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .when()\n            .get(SECURE_PATH + \"/logger\");\n\n    assertEquals(response.getStatusCode(), 200);\n    List<LoggerDto> loggers = unwrapDtoList(response, LoggerDto.class);\n    LoggerDto rootLoggerDto = newDto(LoggerDto.class).withName(\"ROOT\").withLevel(\"INFO\");\n    assertTrue(loggers.contains(rootLoggerDto));\n  }\n\n  @Test\n  public void shouldCreateLogger() throws Exception {\n\n    LoggerDto toCreateLoggerDto = newDto(LoggerDto.class).withName(LOGGER_NAME).withLevel(\"INFO\");\n\n    final Response response =\n        given()\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .contentType(\"application/json\")\n            .body(toCreateLoggerDto)\n            .when()\n            .post(SECURE_PATH + \"/logger/\" + LOGGER_NAME);\n\n    assertEquals(response.getStatusCode(), 200);\n\n    List<LoggerDto> loggers = this.loggerService.getLoggers(0, 30);\n    assertTrue(loggers.contains(toCreateLoggerDto));\n  }\n\n  @Test(dependsOnMethods = \"shouldCreateLogger\")\n  public void shouldUpdateLogger() throws Exception {\n\n    LoggerDto toUpdateLoggerDto = newDto(LoggerDto.class).withName(LOGGER_NAME).withLevel(\"DEBUG\");\n\n    final Response response =\n        given()\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .contentType(\"application/json\")\n            .body(toUpdateLoggerDto)\n            .when()\n            .put(SECURE_PATH + \"/logger/\" + LOGGER_NAME);\n\n    assertEquals(response.getStatusCode(), 200);\n\n    List<LoggerDto> loggers = this.loggerService.getLoggers(0, 30);\n    assertTrue(loggers.contains(toUpdateLoggerDto));\n  }\n\n  @Test(dependsOnMethods = \"shouldCreateLogger\")\n  public void shouldGetLoggerPaginateSkip() {\n    final Response response =\n        given()\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .when()\n            .get(SECURE_PATH + \"/logger/?skipCount=100\");\n\n    assertEquals(response.getStatusCode(), 200);\n    List<LoggerDto> loggers = unwrapDtoList(response, LoggerDto.class);\n    assertEquals(loggers.size(), 0);\n  }\n\n  @Test(dependsOnMethods = \"shouldCreateLogger\")\n  public void shouldGetLoggerPaginateLimit() {\n    final Response response =\n        given()\n            .auth()\n            .basic(ADMIN_USER_NAME, ADMIN_USER_PASSWORD)\n            .when()\n            .get(SECURE_PATH + \"/logger/?maxItems=1\");\n\n    assertEquals(response.getStatusCode(), 200);\n    List<LoggerDto> loggers = unwrapDtoList(response, LoggerDto.class);\n    assertEquals(loggers.size(), 1);\n  }\n\n  private static <T> List<T> unwrapDtoList(Response response, Class<T> dtoClass) {\n    return DtoFactory.getInstance().createListDtoFromJson(response.body().print(), dtoClass);\n  }\n\n  @Filter\n  public static class EnvironmentFilter implements RequestFilter {\n    @Override\n    public void doFilter(GenericContainerRequest request) {\n      EnvironmentContext.getCurrent()\n          .setSubject(new SubjectImpl(NAMESPACE, Collections.emptyList(), USER_ID, \"token\", false));\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-logger/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-logger-shared/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-logger-shared</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Logger :: Shared</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <id>generate-server-dto</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                        <configuration>\n                            <dtoPackages>\n                                <package>org.eclipse.che.api.logger.shared.dto</package>\n                            </dtoPackages>\n                            <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                            <genClassName>org.eclipse.che.api.logger.server.dto.DtoServerImpls</genClassName>\n                            <impl>server</impl>\n                        </configuration>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-logger-shared</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-resource</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-logger-shared/src/main/java/org/eclipse/che/api/logger/shared/dto/LoggerDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.logger.shared.dto;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n@DTO\npublic interface LoggerDto {\n\n  public String getName();\n\n  public void setName(String name);\n\n  public LoggerDto withName(String name);\n\n  public String getLevel();\n\n  public void setLevel(String level);\n\n  public LoggerDto withLevel(String level);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/extending-che-monitoring-metrics.adoc",
    "content": "// monitoring-che\n\n[id=\"extending-che-monitoring-metrics_che\"]\n= Extending Che monitoring metrics\n\nThis section describes how to create a metric or a group of metrics to extend the monitoring metrics that Che is exposing.\n\nChe has two major modules metrics:\n\n* `che-core-metrics-core` -- contains core metrics module\n* `che-core-api-metrics` -- contains metrics that are dependent on core Che components, such as workspace or user managers\n\n\n.Procedure\n\n* Create a class that extends the `MeterBinder` class. This allows to register the created metric in the overridden `bindTo(MeterRegistry registry)` method.\n+\nThe following is an example of a metric that has a function that supplies the value for it:\n+\n.Example metric\n[source,java]\n----\npublic class UserMeterBinder implements MeterBinder {\n\n  private final UserManager userManager;\n\n  @Inject\n  public UserMeterBinder(UserManager userManager) {\n    this.userManager = userManager;\n  }\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n    Gauge.builder(\"che.user.total\", this::count)\n        .description(\"Total amount of users\")\n        .register(registry);\n  }\n\n  private double count() {\n    try {\n      return userManager.getTotalCount();\n    } catch (ServerException e) {\n      return Double.NaN;\n    }\n  }\n----\n+\nAlternatively, the metric can be stored with a reference and updated manually in other place in the code.\n\n\n.Additional resources\n\n* link:https://prometheus.io/docs/practices/naming/[Metric and label naming for Prometheus]\n* link:https://prometheus.io/docs/concepts/metric_types/[Metric types for Prometheus]\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-metrics</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Metrics</name>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.micrometer</groupId>\n            <artifactId>micrometer-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-user</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/main/java/org/eclipse/che/api/metrics/RuntimeLogMeterBinder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport java.nio.charset.StandardCharsets;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.RuntimeLogEvent;\n\n/** Counts sent messages and bytes to runtime log by listening to {@link RuntimeLogEvent}s. */\n@Singleton\npublic class RuntimeLogMeterBinder implements MeterBinder {\n\n  private final EventService eventService;\n\n  private Counter messages;\n  private Counter bytes;\n\n  @Inject\n  RuntimeLogMeterBinder(EventService eventService) {\n    this.eventService = eventService;\n  }\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n    messages =\n        Counter.builder(\"runtime_log_messages\")\n            .baseUnit(\"message\")\n            .description(\"number of sent messages to runtime log\")\n            .register(registry);\n    bytes =\n        Counter.builder(\"runtime_log_bytes\")\n            .baseUnit(\"byte\")\n            .description(\"number of sent bytes to runtime log\")\n            .register(registry);\n\n    eventService.subscribe(\n        (e) -> {\n          messages.increment();\n          bytes.increment(e.getText().getBytes(StandardCharsets.UTF_8).length);\n        },\n        RuntimeLogEvent.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/main/java/org/eclipse/che/api/metrics/UserMeterBinder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport io.micrometer.core.instrument.Gauge;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.user.server.UserManager;\n\n/** Provide metric for number of users in Che database */\n@Singleton\npublic class UserMeterBinder implements MeterBinder {\n\n  private final UserManager userManager;\n\n  @Inject\n  public UserMeterBinder(UserManager userManager) {\n    this.userManager = userManager;\n  }\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n    Gauge.builder(\"che.user.total\", this::count)\n        .description(\"Total amount of users\")\n        .register(registry);\n  }\n\n  private double count() {\n    try {\n      return userManager.getTotalCount();\n    } catch (ServerException e) {\n      return Double.NaN;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/main/java/org/eclipse/che/api/metrics/WorkspaceBinders.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport java.util.Arrays;\n\n/** Utility methods for workspace meter binders. */\nfinal class WorkspaceBinders {\n\n  private static final String METRIC_NAME_PREFIX = \"che.workspace.\";\n  private static final String[] STANDARD_TAGS = new String[] {\"area\", \"workspace\"};\n\n  private WorkspaceBinders() {}\n\n  /** Produces a name for the workspace metric with the standard prefix. */\n  static String workspaceMetric(String name) {\n    return METRIC_NAME_PREFIX + name;\n  }\n\n  /**\n   * Produces a list of tags to add to the metric. The returned array always contains standard tags\n   * common to all workspace metrics.\n   *\n   * @param tags the additional tags to add in addition to the standard tags\n   * @return an array representing the tags\n   */\n  static String[] withStandardTags(String... tags) {\n    if (tags.length == 0) {\n      return STANDARD_TAGS;\n    }\n\n    String[] ret = Arrays.copyOf(STANDARD_TAGS, STANDARD_TAGS.length + tags.length);\n    System.arraycopy(tags, 0, ret, STANDARD_TAGS.length, tags.length);\n    return ret;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/main/java/org/eclipse/che/api/metrics/WorkspaceFailureMeterBinder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static org.eclipse.che.api.metrics.WorkspaceBinders.withStandardTags;\nimport static org.eclipse.che.api.metrics.WorkspaceBinders.workspaceMetric;\n\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\n\n/**\n * Counts errors in workspaces while in different statuses. I.e. the errors while starting, running\n * or stopping are counted separately. The counter IDs only differ in the \"while\" tag which\n * specifies the workspace status in which the failure occurred.\n */\n@Singleton\npublic class WorkspaceFailureMeterBinder implements MeterBinder {\n\n  private final EventService eventService;\n\n  private Counter startingStoppedFailureCounter;\n  private Counter stoppingStoppedFailureCounter;\n  private Counter runningStoppedFailureCounter;\n\n  @Inject\n  public WorkspaceFailureMeterBinder(EventService eventService) {\n    this.eventService = eventService;\n  }\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n    startingStoppedFailureCounter = bindFailureFrom(WorkspaceStatus.STARTING, registry);\n    runningStoppedFailureCounter = bindFailureFrom(WorkspaceStatus.RUNNING, registry);\n    stoppingStoppedFailureCounter = bindFailureFrom(WorkspaceStatus.STOPPING, registry);\n\n    // only subscribe to the event once we have the counters ready\n    eventService.subscribe(\n        event -> {\n          if (event.getError() == null\n              || event.getStatus() != WorkspaceStatus.STOPPED\n              || event.isInitiatedByUser()) {\n            return;\n          }\n          Counter counter;\n          switch (event.getPrevStatus()) {\n            case STARTING:\n              counter = startingStoppedFailureCounter;\n              break;\n            case RUNNING:\n              counter = runningStoppedFailureCounter;\n              break;\n            case STOPPING:\n              counter = stoppingStoppedFailureCounter;\n              break;\n            default:\n              return;\n          }\n\n          counter.increment();\n        },\n        WorkspaceStatusEvent.class);\n  }\n\n  private Counter bindFailureFrom(WorkspaceStatus previousState, MeterRegistry registry) {\n    // there's apparently a convention to suffix the counters with \"_total\" (which is what the name\n    // will end up looking like).\n    return Counter.builder(workspaceMetric(\"failure.total\"))\n        .tags(withStandardTags(\"while\", previousState.name()))\n        .description(\"The count of failed workspaces\")\n        .register(registry);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/main/java/org/eclipse/che/api/metrics/WorkspaceInterruptedStartAttemptsMeterBinder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static org.eclipse.che.api.metrics.WorkspaceBinders.workspaceMetric;\n\nimport com.google.inject.Inject;\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\n\n/** Counts number of workspace startup interruption. */\n@Singleton\npublic class WorkspaceInterruptedStartAttemptsMeterBinder implements MeterBinder {\n  private final EventService eventService;\n\n  private Counter interruptionCounter;\n\n  @Inject\n  public WorkspaceInterruptedStartAttemptsMeterBinder(EventService eventService) {\n    this.eventService = eventService;\n  }\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n    interruptionCounter =\n        Counter.builder(workspaceMetric(\"start.interrupt.total\"))\n            .description(\"The count of workspace startup interruption\")\n            .register(registry);\n\n    // only subscribe to the event once we have the counters ready\n    eventService.subscribe(\n        event -> {\n          if (event.getPrevStatus() == WorkspaceStatus.STARTING\n              && event.getStatus() == WorkspaceStatus.STOPPED\n              && event.isInitiatedByUser()) {\n            interruptionCounter.increment();\n          }\n        },\n        WorkspaceStatusEvent.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/main/java/org/eclipse/che/api/metrics/WorkspaceStartAttemptsMeterBinder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static java.lang.Boolean.FALSE;\nimport static org.eclipse.che.api.metrics.WorkspaceBinders.withStandardTags;\nimport static org.eclipse.che.api.metrics.WorkspaceBinders.workspaceMetric;\nimport static org.eclipse.che.api.workspace.shared.Constants.DEBUG_WORKSPACE_START;\n\nimport com.google.inject.Inject;\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\n\n/** Counts number of attempts to start workspace. */\n@Singleton\npublic class WorkspaceStartAttemptsMeterBinder implements MeterBinder {\n  private final EventService eventService;\n\n  private Counter startingCounter;\n  private Counter startingDebugCounter;\n\n  @Inject\n  public WorkspaceStartAttemptsMeterBinder(EventService eventService) {\n    this.eventService = eventService;\n  }\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n    startingCounter =\n        Counter.builder(workspaceMetric(\"starting_attempts.total\"))\n            .tags(withStandardTags(\"debug\", \"false\"))\n            .description(\"The count of workspaces start attempts\")\n            .register(registry);\n    startingDebugCounter =\n        Counter.builder(workspaceMetric(\"starting_attempts.total\"))\n            .tags(withStandardTags(\"debug\", \"true\"))\n            .description(\"The count of workspaces start attempts in debug mode\")\n            .register(registry);\n\n    // only subscribe to the event once we have the counters ready\n    eventService.subscribe(\n        event -> {\n          if (event.getPrevStatus() == WorkspaceStatus.STOPPED\n              && event.getStatus() == WorkspaceStatus.STARTING) {\n            if (event.getOptions() != null\n                && Boolean.parseBoolean(\n                    event.getOptions().getOrDefault(DEBUG_WORKSPACE_START, FALSE.toString()))) {\n              startingDebugCounter.increment();\n            } else {\n              startingCounter.increment();\n            }\n          }\n        },\n        WorkspaceStatusEvent.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/main/java/org/eclipse/che/api/metrics/WorkspaceStartTrackerMeterBinder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static org.eclipse.che.api.metrics.WorkspaceBinders.withStandardTags;\nimport static org.eclipse.che.api.metrics.WorkspaceBinders.workspaceMetric;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.inject.Inject;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Timer;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport java.time.Duration;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * {@link MeterBinder} that is providing metrics about workspace successful or failed start time.\n */\n@Singleton\npublic class WorkspaceStartTrackerMeterBinder implements MeterBinder {\n\n  private static final Logger LOG = LoggerFactory.getLogger(WorkspaceStartTrackerMeterBinder.class);\n\n  private final EventService eventService;\n\n  private final Map<String, Long> workspaceStartTime;\n  private Timer successTimer;\n  private Timer failTimer;\n\n  @Inject\n  public WorkspaceStartTrackerMeterBinder(EventService eventService) {\n    this(eventService, new ConcurrentHashMap<>());\n  }\n\n  @VisibleForTesting\n  WorkspaceStartTrackerMeterBinder(\n      EventService eventService, Map<String, Long> workspaceStartTime) {\n    this.eventService = eventService;\n    this.workspaceStartTime = workspaceStartTime;\n  }\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n\n    successTimer =\n        Timer.builder(workspaceMetric(\"start.time\"))\n            .description(\"The time of workspace start\")\n            .tags(withStandardTags(\"result\", \"success\"))\n            .publishPercentileHistogram()\n            .sla(Duration.ofSeconds(10))\n            .minimumExpectedValue(Duration.ofSeconds(10))\n            .maximumExpectedValue(Duration.ofMinutes(15))\n            .register(registry);\n\n    failTimer =\n        Timer.builder(workspaceMetric(\"start.time\"))\n            .description(\"The time of workspace start\")\n            .tags(withStandardTags(\"result\", \"fail\"))\n            .publishPercentileHistogram()\n            .sla(Duration.ofSeconds(10))\n            .minimumExpectedValue(Duration.ofSeconds(10))\n            .maximumExpectedValue(Duration.ofMinutes(15))\n            .register(registry);\n\n    // only subscribe to the event once we have the counters ready\n    eventService.subscribe(this::handleWorkspaceStatusChange, WorkspaceStatusEvent.class);\n  }\n\n  private void handleWorkspaceStatusChange(WorkspaceStatusEvent event) {\n    if (event.getPrevStatus() == WorkspaceStatus.STOPPED\n        && event.getStatus() == WorkspaceStatus.STARTING) {\n      workspaceStartTime.put(event.getWorkspaceId(), System.currentTimeMillis());\n    } else if (event.getPrevStatus() == WorkspaceStatus.STARTING) {\n      Long startTime = workspaceStartTime.remove(event.getWorkspaceId());\n      if (startTime == null) {\n        // this situation is possible when starting workspace is recovered or some bug happened\n        LOG.warn(\"No workspace start time recorded for workspace {}\", event.getWorkspaceId());\n        return;\n      }\n\n      if (event.getStatus() == WorkspaceStatus.RUNNING) {\n        successTimer.record(Duration.ofMillis(System.currentTimeMillis() - startTime));\n      } else if (event.getStatus() == WorkspaceStatus.STOPPED) {\n        failTimer.record(Duration.ofMillis(System.currentTimeMillis() - startTime));\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/main/java/org/eclipse/che/api/metrics/WorkspaceStopTrackerMeterBinder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static org.eclipse.che.api.core.model.workspace.WorkspaceStatus.*;\nimport static org.eclipse.che.api.metrics.WorkspaceBinders.withStandardTags;\nimport static org.eclipse.che.api.metrics.WorkspaceBinders.workspaceMetric;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.inject.Inject;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Timer;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport java.time.Duration;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * {@link MeterBinder} that is providing metrics about workspace stop time.\n *\n * <p>We're measuring these state transitions:\n *\n * <pre>\n *   RUNNING -> STOPPING -> STOPPED\n *   STARTING -> STOPPING -> STOPPED\n * </pre>\n */\n@Singleton\npublic class WorkspaceStopTrackerMeterBinder implements MeterBinder {\n\n  private static final Logger LOG = LoggerFactory.getLogger(WorkspaceStopTrackerMeterBinder.class);\n\n  private final EventService eventService;\n\n  private final Map<String, Long> workspaceStopTime;\n  private Timer stopTimer;\n\n  @Inject\n  public WorkspaceStopTrackerMeterBinder(EventService eventService) {\n    this(eventService, new ConcurrentHashMap<>());\n  }\n\n  @VisibleForTesting\n  WorkspaceStopTrackerMeterBinder(EventService eventService, Map<String, Long> workspaceStopTime) {\n    this.eventService = eventService;\n    this.workspaceStopTime = workspaceStopTime;\n  }\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n\n    stopTimer =\n        Timer.builder(workspaceMetric(\"stop.time\"))\n            .description(\"The time of workspace stop\")\n            .tags(withStandardTags(\"result\", \"success\"))\n            .register(registry);\n\n    // only subscribe to the event once we have the counters ready\n    eventService.subscribe(this::handleWorkspaceStatusChange, WorkspaceStatusEvent.class);\n  }\n\n  private void handleWorkspaceStatusChange(WorkspaceStatusEvent event) {\n    if ((event.getPrevStatus() == RUNNING || event.getPrevStatus() == STARTING)\n        && event.getStatus() == STOPPING) {\n      workspaceStopTime.put(event.getWorkspaceId(), System.currentTimeMillis());\n    } else if (event.getPrevStatus() == STOPPING) {\n      Long stopTime = workspaceStopTime.remove(event.getWorkspaceId());\n      if (stopTime == null) {\n        LOG.warn(\"No workspace stop time recorded for workspace {}\", event.getWorkspaceId());\n        return;\n      }\n\n      if (event.getStatus() == STOPPED) {\n        stopTimer.record(Duration.ofMillis(System.currentTimeMillis() - stopTime));\n      } else {\n        LOG.error(\"Unexpected change of status from STOPPING to {}\", event.getStatus());\n        return;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/main/java/org/eclipse/che/api/metrics/WorkspaceSuccessfulStartAttemptsMeterBinder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static org.eclipse.che.api.metrics.WorkspaceBinders.workspaceMetric;\n\nimport com.google.inject.Inject;\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\n\n/** Counts number of successfully started workspaces. */\n@Singleton\npublic class WorkspaceSuccessfulStartAttemptsMeterBinder implements MeterBinder {\n  private final EventService eventService;\n\n  private Counter startedCounter;\n\n  @Inject\n  public WorkspaceSuccessfulStartAttemptsMeterBinder(EventService eventService) {\n    this.eventService = eventService;\n  }\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n    startedCounter =\n        Counter.builder(workspaceMetric(\"started.total\"))\n            .description(\"The count of started workspaces\")\n            .register(registry);\n\n    // only subscribe to the event once we have the counters ready\n    eventService.subscribe(\n        event -> {\n          if (event.getPrevStatus() == WorkspaceStatus.STARTING\n              && event.getStatus() == WorkspaceStatus.RUNNING) {\n            startedCounter.increment();\n          }\n        },\n        WorkspaceStatusEvent.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/main/java/org/eclipse/che/api/metrics/WorkspaceSuccessfulStopAttemptsMeterBinder.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static org.eclipse.che.api.metrics.WorkspaceBinders.workspaceMetric;\n\nimport com.google.inject.Inject;\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.binder.MeterBinder;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\n\n/** Counts number of successfully stopped workspaces. */\n@Singleton\npublic class WorkspaceSuccessfulStopAttemptsMeterBinder implements MeterBinder {\n  private final EventService eventService;\n\n  private Counter stoppedCounter;\n\n  @Inject\n  public WorkspaceSuccessfulStopAttemptsMeterBinder(EventService eventService) {\n    this.eventService = eventService;\n  }\n\n  @Override\n  public void bindTo(MeterRegistry registry) {\n    stoppedCounter =\n        Counter.builder(workspaceMetric(\"stopped.total\"))\n            .description(\"The count of stopped workspaces\")\n            .register(registry);\n\n    // only subscribe to the event once we have the counters ready\n    eventService.subscribe(\n        event -> {\n          if ((event.getError() == null)\n              && (event.getPrevStatus() == WorkspaceStatus.STOPPING\n                  && event.getStatus() == WorkspaceStatus.STOPPED)) {\n            stoppedCounter.increment();\n          }\n        },\n        WorkspaceStatusEvent.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/main/java/org/eclipse/che/api/metrics/WsMasterMetricsModule.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\nimport io.micrometer.core.instrument.binder.MeterBinder;\n\n/**\n * A Guice module to bind all our metric binders to a single multi-binder. The set of all metric\n * binders is used to produce the Prometheus metrics on request.\n */\npublic class WsMasterMetricsModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    Multibinder<MeterBinder> meterMultibinder =\n        Multibinder.newSetBinder(binder(), MeterBinder.class);\n\n    meterMultibinder.addBinding().to(WorkspaceFailureMeterBinder.class);\n    meterMultibinder.addBinding().to(WorkspaceStartTrackerMeterBinder.class);\n    meterMultibinder.addBinding().to(WorkspaceStopTrackerMeterBinder.class);\n    meterMultibinder.addBinding().to(WorkspaceSuccessfulStartAttemptsMeterBinder.class);\n    meterMultibinder.addBinding().to(WorkspaceSuccessfulStopAttemptsMeterBinder.class);\n    meterMultibinder.addBinding().to(WorkspaceStartAttemptsMeterBinder.class);\n    meterMultibinder.addBinding().to(WorkspaceInterruptedStartAttemptsMeterBinder.class);\n    meterMultibinder.addBinding().to(UserMeterBinder.class);\n    meterMultibinder.addBinding().to(RuntimeLogMeterBinder.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/test/java/org/eclipse/che/api/metrics/UserMeterBinderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static java.lang.Double.NaN;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.user.server.UserManager;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class UserMeterBinderTest {\n\n  @Mock private UserManager userManager;\n\n  private MeterRegistry registry;\n\n  @BeforeMethod\n  public void setUp() {\n    registry = new SimpleMeterRegistry();\n    UserMeterBinder meterBinder = new UserMeterBinder(userManager);\n    meterBinder.bindTo(registry);\n  }\n\n  @Test\n  public void shouldCollectUserCount() throws Exception {\n    when(userManager.getTotalCount()).thenReturn(5L);\n\n    assertEquals(registry.find(\"che.user.total\").gauge().value(), 5.0);\n  }\n\n  @Test\n  public void shouldCollectNaNUserCountIfExceptionOccursInManager() throws Exception {\n    doThrow(ServerException.class).when(userManager).getTotalCount();\n\n    assertEquals(registry.find(\"che.user.total\").gauge().value(), NaN);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/test/java/org/eclipse/che/api/metrics/WorkspaceFailureMeterBinderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static java.util.Arrays.asList;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.assertEquals;\n\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.core.notification.EventSubscriber;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.mockito.ArgumentCaptor;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class WorkspaceFailureMeterBinderTest {\n\n  private Collection<Counter> failureCounters;\n  private EventSubscriber<WorkspaceStatusEvent> events;\n\n  @BeforeMethod\n  public void setup() {\n    MeterRegistry registry = new SimpleMeterRegistry();\n\n    EventService eventService = mock(EventService.class);\n\n    WorkspaceFailureMeterBinder meterBinder = new WorkspaceFailureMeterBinder(eventService);\n\n    meterBinder.bindTo(registry);\n\n    @SuppressWarnings(\"unchecked\")\n    ArgumentCaptor<EventSubscriber<WorkspaceStatusEvent>> statusChangeEventCaptor =\n        ArgumentCaptor.forClass(EventSubscriber.class);\n\n    failureCounters = registry.find(\"che.workspace.failure.total\").counters();\n\n    verify(eventService)\n        .subscribe(statusChangeEventCaptor.capture(), eq(WorkspaceStatusEvent.class));\n\n    events = statusChangeEventCaptor.getValue();\n  }\n\n  @Test(dataProvider = \"failureWhileInStatus\")\n  public void shouldCollectFailureCountsPerStatus(WorkspaceStatus failureStatus) {\n    events.onEvent(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(failureStatus)\n            .withStatus(WorkspaceStatus.STOPPED)\n            .withError(\"D'oh!\")\n            .withWorkspaceId(\"1\"));\n\n    List<Counter> restOfCounters = new ArrayList<>(failureCounters);\n\n    Counter counter =\n        failureCounters.stream()\n            .filter(c -> failureStatus.name().equals(c.getId().getTag(\"while\")))\n            .findAny()\n            .orElseThrow(\n                () ->\n                    new AssertionError(\n                        \"Could not find a counter for failure status \" + failureStatus));\n\n    restOfCounters.remove(counter);\n\n    assertEquals(counter.count(), 1d);\n    restOfCounters.forEach(c -> assertEquals(c.count(), 0d));\n  }\n\n  @Test(dataProvider = \"failureWhileInStatus\")\n  public void shouldNotCollectFailureWhenNoErrorInEvent(WorkspaceStatus prevStatus) {\n    events.onEvent(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(prevStatus)\n            .withStatus(WorkspaceStatus.STOPPED)\n            .withWorkspaceId(\"1\"));\n\n    failureCounters.forEach(c -> assertEquals(c.count(), 0d));\n  }\n\n  @Test\n  public void shouldNotCollectInterruptedEvent() {\n    // given\n    WorkspaceStatusEvent event =\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STARTING)\n            .withStatus(WorkspaceStatus.STOPPED)\n            .withInitiatedByUser(true)\n            .withError(\"interrupted\")\n            .withWorkspaceId(\"1\");\n\n    // when\n    events.onEvent(event);\n\n    // then\n    failureCounters.forEach(c -> assertEquals(c.count(), 0d));\n  }\n\n  @Test(dataProvider = \"allStatusTransitionsWithoutToStopped\")\n  public void shouldNotCollectFailureWhenNotTransitioningToStopped(\n      WorkspaceStatus from, WorkspaceStatus to) {\n    // This really doesn't make much sense because the codebase always transitions the workspace\n    // to STOPPED on any kind of failure. This is just a precaution that a potential bug in the\n    // rest of the codebase doesn't affect the metric collection ;)\n\n    events.onEvent(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(from)\n            .withStatus(to)\n            .withError(\"D'oh!\")\n            .withWorkspaceId(\"1\"));\n\n    failureCounters.forEach(c -> assertEquals(c.count(), 0d));\n  }\n\n  @DataProvider\n  public Object[][] failureWhileInStatus() {\n    return new Object[][] {\n      new Object[] {WorkspaceStatus.STARTING},\n      new Object[] {WorkspaceStatus.RUNNING},\n      new Object[] {WorkspaceStatus.STOPPING},\n    };\n  }\n\n  @DataProvider\n  public Object[][] allStatusTransitionsWithoutToStopped() {\n    List<List<WorkspaceStatus>> transitions = new ArrayList<>(9);\n\n    for (WorkspaceStatus from : WorkspaceStatus.values()) {\n      for (WorkspaceStatus to : WorkspaceStatus.values()) {\n        if (from == to || to == WorkspaceStatus.STOPPED) {\n          continue;\n        }\n\n        transitions.add(asList(from, to));\n      }\n    }\n\n    return transitions.stream().map(List::toArray).toArray(Object[][]::new);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/test/java/org/eclipse/che/api/metrics/WorkspaceInterruptedStartAttemptsMeterBinderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static java.util.Arrays.asList;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\n\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.core.notification.EventSubscriber;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.mockito.ArgumentCaptor;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class WorkspaceInterruptedStartAttemptsMeterBinderTest {\n\n  private EventSubscriber<WorkspaceStatusEvent> events;\n  private Counter interruptedCounter;\n\n  @BeforeMethod\n  public void setup() {\n    MeterRegistry registry = new SimpleMeterRegistry();\n\n    EventService eventService = mock(EventService.class);\n\n    WorkspaceInterruptedStartAttemptsMeterBinder meterBinder =\n        new WorkspaceInterruptedStartAttemptsMeterBinder(eventService);\n\n    meterBinder.bindTo(registry);\n\n    @SuppressWarnings(\"unchecked\")\n    ArgumentCaptor<EventSubscriber<WorkspaceStatusEvent>> statusChangeEventCaptor =\n        ArgumentCaptor.forClass(EventSubscriber.class);\n\n    interruptedCounter = registry.find(\"che.workspace.start.interrupt.total\").counter();\n\n    verify(eventService)\n        .subscribe(statusChangeEventCaptor.capture(), eq(WorkspaceStatusEvent.class));\n\n    events = statusChangeEventCaptor.getValue();\n  }\n\n  @Test\n  public void shouldCountWorkspaceInterruptedEvent() {\n    // given\n    WorkspaceStatusEvent event =\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STARTING)\n            .withStatus(WorkspaceStatus.STOPPED)\n            .withInitiatedByUser(true)\n            .withError(\"interrupted\")\n            .withWorkspaceId(\"1\");\n\n    // when\n    events.onEvent(event);\n\n    // then\n    Assert.assertEquals(interruptedCounter.count(), 1.0);\n  }\n\n  @Test\n  public void shouldNotCountWorkspaceNonInterruptedEvent() {\n    // given\n    WorkspaceStatusEvent event =\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STARTING)\n            .withStatus(WorkspaceStatus.STOPPED)\n            .withInitiatedByUser(false)\n            .withError(\"interrupted\")\n            .withWorkspaceId(\"1\");\n\n    // when\n    events.onEvent(event);\n\n    // then\n    Assert.assertEquals(interruptedCounter.count(), 0.0);\n  }\n\n  @Test(dataProvider = \"allStatusTransitionsWithoutToStopped\")\n  public void shouldNotCollectInterruptionWhenNotTransitioningToStopped(\n      WorkspaceStatus from, WorkspaceStatus to) {\n    // This really doesn't make much sense because the codebase always transitions the workspace\n    // to STOPPED on interruption. This is just a precaution that a potential bug in the\n    // rest of the codebase doesn't affect the metric collection ;)\n\n    events.onEvent(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(from)\n            .withStatus(to)\n            .withInitiatedByUser(true)\n            .withError(\"D'oh!\")\n            .withWorkspaceId(\"1\"));\n\n    Assert.assertEquals(interruptedCounter.count(), 0.0);\n  }\n\n  @DataProvider\n  public Object[][] allStatusTransitionsWithoutToStopped() {\n    List<List<WorkspaceStatus>> transitions = new ArrayList<>(9);\n\n    for (WorkspaceStatus from : WorkspaceStatus.values()) {\n      for (WorkspaceStatus to : WorkspaceStatus.values()) {\n        if (from == to || to == WorkspaceStatus.STOPPED) {\n          continue;\n        }\n\n        transitions.add(asList(from, to));\n      }\n    }\n\n    return transitions.stream().map(List::toArray).toArray(Object[][]::new);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/test/java/org/eclipse/che/api/metrics/WorkspaceStartAttemptsMeterBinderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.singletonMap;\n\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class WorkspaceStartAttemptsMeterBinderTest {\n\n  private EventService eventService;\n  private MeterRegistry registry;\n\n  @BeforeMethod\n  public void setUp() {\n    eventService = new EventService();\n    registry = new SimpleMeterRegistry();\n  }\n\n  @Test(dataProvider = \"allStatusTransitionsWithoutStarting\")\n  public void shouldNotCollectEvents(WorkspaceStatus from, WorkspaceStatus to) {\n    // given\n    WorkspaceStartAttemptsMeterBinder meterBinder =\n        new WorkspaceStartAttemptsMeterBinder(eventService);\n    meterBinder.bindTo(registry);\n\n    // when\n\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(from)\n            .withStatus(to)\n            .withWorkspaceId(\"id1\"));\n\n    // then\n    Counter successful = registry.find(\"che.workspace.starting_attempts.total\").counter();\n    Assert.assertEquals(successful.count(), 0.0);\n  }\n\n  @Test\n  public void shouldCollectOnlyStart() {\n    // given\n    WorkspaceStartAttemptsMeterBinder meterBinder =\n        new WorkspaceStartAttemptsMeterBinder(eventService);\n    meterBinder.bindTo(registry);\n\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STOPPED)\n            .withStatus(WorkspaceStatus.STARTING)\n            .withWorkspaceId(\"id1\"));\n    // then\n    Counter successful =\n        registry.find(\"che.workspace.starting_attempts.total\").tag(\"debug\", \"false\").counter();\n    Assert.assertEquals(successful.count(), 1.0);\n\n    Counter debug =\n        registry.find(\"che.workspace.starting_attempts.total\").tag(\"debug\", \"true\").counter();\n    Assert.assertEquals(debug.count(), 0.0);\n  }\n\n  @Test\n  public void shouldCollectOnlyDebugStart() {\n    // given\n    WorkspaceStartAttemptsMeterBinder meterBinder =\n        new WorkspaceStartAttemptsMeterBinder(eventService);\n    meterBinder.bindTo(registry);\n\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STOPPED)\n            .withStatus(WorkspaceStatus.STARTING)\n            .withWorkspaceId(\"id1\")\n            .withOptions(singletonMap(Constants.DEBUG_WORKSPACE_START, Boolean.TRUE.toString())));\n\n    // then\n    Counter successful =\n        registry.find(\"che.workspace.starting_attempts.total\").tag(\"debug\", \"false\").counter();\n    Assert.assertEquals(successful.count(), 0.0);\n\n    Counter debug =\n        registry.find(\"che.workspace.starting_attempts.total\").tag(\"debug\", \"true\").counter();\n    Assert.assertEquals(debug.count(), 1.0);\n  }\n\n  @Test\n  public void shouldNotCollectDebugStartWhenSetToFalse() {\n    // given\n    WorkspaceStartAttemptsMeterBinder meterBinder =\n        new WorkspaceStartAttemptsMeterBinder(eventService);\n    meterBinder.bindTo(registry);\n\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STOPPED)\n            .withStatus(WorkspaceStatus.STARTING)\n            .withWorkspaceId(\"id1\")\n            .withOptions(singletonMap(Constants.DEBUG_WORKSPACE_START, Boolean.FALSE.toString())));\n\n    // then\n    Counter successful =\n        registry.find(\"che.workspace.starting_attempts.total\").tag(\"debug\", \"false\").counter();\n    Assert.assertEquals(successful.count(), 1.0);\n\n    Counter debug =\n        registry.find(\"che.workspace.starting_attempts.total\").tag(\"debug\", \"true\").counter();\n    Assert.assertEquals(debug.count(), 0.0);\n  }\n\n  @Test\n  public void shouldNotCollectDebugStartWhenSetToStrangeString() {\n    // given\n    WorkspaceStartAttemptsMeterBinder meterBinder =\n        new WorkspaceStartAttemptsMeterBinder(eventService);\n    meterBinder.bindTo(registry);\n\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STOPPED)\n            .withStatus(WorkspaceStatus.STARTING)\n            .withWorkspaceId(\"id1\")\n            .withOptions(singletonMap(Constants.DEBUG_WORKSPACE_START, \"strange\")));\n\n    // then\n    Counter successful =\n        registry.find(\"che.workspace.starting_attempts.total\").tag(\"debug\", \"false\").counter();\n    Assert.assertEquals(successful.count(), 1.0);\n\n    Counter debug =\n        registry.find(\"che.workspace.starting_attempts.total\").tag(\"debug\", \"true\").counter();\n    Assert.assertEquals(debug.count(), 0.0);\n  }\n\n  @Test\n  public void shouldNotCollectDebugStartWhenNotSetInOptions() {\n    // given\n    WorkspaceStartAttemptsMeterBinder meterBinder =\n        new WorkspaceStartAttemptsMeterBinder(eventService);\n    meterBinder.bindTo(registry);\n\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STOPPED)\n            .withStatus(WorkspaceStatus.STARTING)\n            .withWorkspaceId(\"id1\")\n            .withOptions(singletonMap(\"bla\", \"bol\")));\n\n    // then\n    Counter successful =\n        registry.find(\"che.workspace.starting_attempts.total\").tag(\"debug\", \"false\").counter();\n    Assert.assertEquals(successful.count(), 1.0);\n\n    Counter debug =\n        registry.find(\"che.workspace.starting_attempts.total\").tag(\"debug\", \"true\").counter();\n    Assert.assertEquals(debug.count(), 0.0);\n  }\n\n  @DataProvider\n  public Object[][] allStatusTransitionsWithoutStarting() {\n    List<List<WorkspaceStatus>> transitions = new ArrayList<>(9);\n\n    for (WorkspaceStatus from : WorkspaceStatus.values()) {\n      for (WorkspaceStatus to : WorkspaceStatus.values()) {\n        if (from == WorkspaceStatus.STOPPED && to == WorkspaceStatus.STARTING) {\n          continue;\n        }\n\n        transitions.add(asList(from, to));\n      }\n    }\n\n    return transitions.stream().map(List::toArray).toArray(Object[][]::new);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/test/java/org/eclipse/che/api/metrics/WorkspaceStartTrackerMeterBinderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static java.util.Arrays.asList;\n\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Timer;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class WorkspaceStartTrackerMeterBinderTest {\n\n  private EventService eventService;\n  private MeterRegistry registry;\n  private WorkspaceStartTrackerMeterBinder meterBinder;\n  private Map<String, Long> workspaceStartTime;\n\n  @BeforeMethod\n  public void setUp() {\n    eventService = new EventService();\n    registry = new SimpleMeterRegistry();\n    workspaceStartTime = new ConcurrentHashMap<>();\n    meterBinder = new WorkspaceStartTrackerMeterBinder(eventService, workspaceStartTime);\n    meterBinder.bindTo(registry);\n  }\n\n  @Test\n  public void shouldRecordWorkspaceStartTime() {\n    // given\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STOPPED)\n            .withStatus(WorkspaceStatus.STARTING)\n            .withWorkspaceId(\"id1\"));\n    // then\n    Assert.assertTrue(workspaceStartTime.containsKey(\"id1\"));\n  }\n\n  @Test(dataProvider = \"allStatusTransitionsWithoutStarting\")\n  public void shouldNotRecordWorkspaceStartTimeForNonStartingStatuses(\n      WorkspaceStatus from, WorkspaceStatus to) {\n    // given\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(from)\n            .withStatus(to)\n            .withWorkspaceId(\"id1\"));\n    // then\n    Assert.assertTrue(workspaceStartTime.isEmpty());\n  }\n\n  @Test\n  public void shouldCountSuccessfulStart() {\n\n    // given\n    workspaceStartTime.put(\"id1\", System.currentTimeMillis() - 60 * 1000);\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STARTING)\n            .withStatus(WorkspaceStatus.RUNNING)\n            .withWorkspaceId(\"id1\"));\n\n    // then\n\n    Timer t = registry.find(\"che.workspace.start.time\").tag(\"result\", \"success\").timer();\n    Assert.assertEquals(t.count(), 1);\n    Assert.assertTrue(t.totalTime(TimeUnit.MILLISECONDS) >= 60 * 1000);\n  }\n\n  @Test\n  public void shouldCountFailedStart() {\n\n    // given\n    workspaceStartTime.put(\"id1\", System.currentTimeMillis() - 60 * 1000);\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STARTING)\n            .withStatus(WorkspaceStatus.STOPPED)\n            .withWorkspaceId(\"id1\"));\n\n    // then\n\n    Timer t = registry.find(\"che.workspace.start.time\").tag(\"result\", \"fail\").timer();\n    Assert.assertEquals(t.count(), 1);\n    Assert.assertTrue(t.totalTime(TimeUnit.MILLISECONDS) >= 60 * 1000);\n  }\n\n  @Test\n  public void shouldIgnoreNotRecordedStartOnFailedStart() {\n\n    // given\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STARTING)\n            .withStatus(WorkspaceStatus.STOPPED)\n            .withWorkspaceId(\"id1\"));\n\n    // then\n    Timer t = registry.find(\"che.workspace.start.time\").tag(\"result\", \"fail\").timer();\n    Assert.assertEquals(t.count(), 0);\n  }\n\n  @Test\n  public void shouldIgnoreNotRecordedStartOnSuccessStart() {\n\n    // given\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STARTING)\n            .withStatus(WorkspaceStatus.STOPPED)\n            .withWorkspaceId(\"id1\"));\n\n    // then\n\n    Timer t = registry.find(\"che.workspace.start.time\").tag(\"result\", \"fail\").timer();\n\n    Assert.assertEquals(t.count(), 0);\n  }\n\n  @DataProvider\n  public Object[][] allStatusTransitionsWithoutStarting() {\n    List<List<WorkspaceStatus>> transitions = new ArrayList<>(9);\n\n    for (WorkspaceStatus from : WorkspaceStatus.values()) {\n      for (WorkspaceStatus to : WorkspaceStatus.values()) {\n        if (from == WorkspaceStatus.STOPPED && to == WorkspaceStatus.STARTING) {\n          continue;\n        }\n\n        transitions.add(asList(from, to));\n      }\n    }\n\n    return transitions.stream().map(List::toArray).toArray(Object[][]::new);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/test/java/org/eclipse/che/api/metrics/WorkspaceStopTrackerMeterBinderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static java.util.Arrays.asList;\n\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Timer;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class WorkspaceStopTrackerMeterBinderTest {\n\n  private EventService eventService;\n  private MeterRegistry registry;\n  private WorkspaceStopTrackerMeterBinder meterBinder;\n  private Map<String, Long> workspaceStopTime;\n\n  @BeforeMethod\n  public void setUp() {\n    eventService = new EventService();\n    registry = new SimpleMeterRegistry();\n    workspaceStopTime = new ConcurrentHashMap<>();\n    meterBinder = new WorkspaceStopTrackerMeterBinder(eventService, workspaceStopTime);\n    meterBinder.bindTo(registry);\n  }\n\n  @Test\n  public void shouldRecordWorkspaceStopTime() {\n    // given\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.RUNNING)\n            .withStatus(WorkspaceStatus.STOPPING)\n            .withWorkspaceId(\"id1\"));\n    // then\n    Assert.assertTrue(workspaceStopTime.containsKey(\"id1\"));\n  }\n\n  @Test(dataProvider = \"allStatusTransitionsWithoutStarting\")\n  public void shouldNotRecordWorkspaceStopTimeForNonStoppingStatuses(\n      WorkspaceStatus from, WorkspaceStatus to) {\n    // given\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(from)\n            .withStatus(to)\n            .withWorkspaceId(\"id1\"));\n    // then\n    Assert.assertTrue(workspaceStopTime.isEmpty());\n  }\n\n  @Test\n  public void shouldCountSuccessfulStart() {\n    // given\n    workspaceStopTime.put(\"id1\", System.currentTimeMillis() - 60 * 1000);\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STOPPING)\n            .withStatus(WorkspaceStatus.STOPPED)\n            .withWorkspaceId(\"id1\"));\n\n    // then\n\n    Timer t = registry.find(\"che.workspace.stop.time\").tag(\"result\", \"success\").timer();\n    Assert.assertEquals(t.count(), 1);\n    Assert.assertTrue(t.totalTime(TimeUnit.MILLISECONDS) >= 60 * 1000);\n  }\n\n  @DataProvider\n  public Object[][] allStatusTransitionsWithoutStarting() {\n    List<List<WorkspaceStatus>> transitions = new ArrayList<>(9);\n\n    for (WorkspaceStatus from : WorkspaceStatus.values()) {\n      for (WorkspaceStatus to : WorkspaceStatus.values()) {\n        if ((from == WorkspaceStatus.RUNNING || from == WorkspaceStatus.STARTING)\n            && to == WorkspaceStatus.STOPPING) {\n          continue;\n        }\n\n        transitions.add(asList(from, to));\n      }\n    }\n\n    return transitions.stream().map(List::toArray).toArray(Object[][]::new);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/test/java/org/eclipse/che/api/metrics/WorkspaceSuccessfulStartAttemptsMeterBinderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static java.util.Arrays.asList;\n\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class WorkspaceSuccessfulStartAttemptsMeterBinderTest {\n\n  private EventService eventService;\n  private MeterRegistry registry;\n\n  @BeforeMethod\n  public void setUp() {\n    eventService = new EventService();\n    registry = new SimpleMeterRegistry();\n  }\n\n  @Test(dataProvider = \"allStatusTransitionsWithoutRunning\")\n  public void shouldNotCollectEvents(WorkspaceStatus from, WorkspaceStatus to) {\n    // given\n    WorkspaceSuccessfulStartAttemptsMeterBinder meterBinder =\n        new WorkspaceSuccessfulStartAttemptsMeterBinder(eventService);\n    meterBinder.bindTo(registry);\n\n    // when\n\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(from)\n            .withStatus(to)\n            .withWorkspaceId(\"id1\"));\n\n    // then\n    Counter successful = registry.find(\"che.workspace.started.total\").counter();\n    Assert.assertEquals(successful.count(), 0.0);\n  }\n\n  @Test\n  public void shouldCollectOnlyStarted() {\n    // given\n    WorkspaceSuccessfulStartAttemptsMeterBinder meterBinder =\n        new WorkspaceSuccessfulStartAttemptsMeterBinder(eventService);\n    meterBinder.bindTo(registry);\n\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STARTING)\n            .withStatus(WorkspaceStatus.RUNNING)\n            .withWorkspaceId(\"id1\"));\n    // then\n    Counter successful = registry.find(\"che.workspace.started.total\").counter();\n    Assert.assertEquals(successful.count(), 1.0);\n  }\n\n  @DataProvider\n  public Object[][] allStatusTransitionsWithoutRunning() {\n    List<List<WorkspaceStatus>> transitions = new ArrayList<>(9);\n\n    for (WorkspaceStatus from : WorkspaceStatus.values()) {\n      for (WorkspaceStatus to : WorkspaceStatus.values()) {\n        if (from == WorkspaceStatus.STARTING && to == WorkspaceStatus.RUNNING) {\n          continue;\n        }\n\n        transitions.add(asList(from, to));\n      }\n    }\n\n    return transitions.stream().map(List::toArray).toArray(Object[][]::new);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/test/java/org/eclipse/che/api/metrics/WorkspaceSuccessfulStopAttemptsMeterBinderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.metrics;\n\nimport static java.util.Arrays.asList;\n\nimport io.micrometer.core.instrument.Counter;\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.simple.SimpleMeterRegistry;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class WorkspaceSuccessfulStopAttemptsMeterBinderTest {\n\n  private EventService eventService;\n  private MeterRegistry registry;\n\n  @BeforeMethod\n  public void setUp() {\n    eventService = new EventService();\n    registry = new SimpleMeterRegistry();\n  }\n\n  @Test(dataProvider = \"allStatusTransitionsWithoutStopping\")\n  public void shouldNotCollectEvents(WorkspaceStatus from, WorkspaceStatus to) {\n    // given\n    WorkspaceSuccessfulStopAttemptsMeterBinder meterBinder =\n        new WorkspaceSuccessfulStopAttemptsMeterBinder(eventService);\n    meterBinder.bindTo(registry);\n\n    // when\n\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(from)\n            .withStatus(to)\n            .withWorkspaceId(\"id1\"));\n\n    // then\n    Counter successful = registry.find(\"che.workspace.stopped.total\").counter();\n    Assert.assertEquals(successful.count(), 0.0);\n  }\n\n  @Test\n  public void shouldCollectOnlyStoppedWithoutError() {\n    // given\n    WorkspaceSuccessfulStopAttemptsMeterBinder meterBinder =\n        new WorkspaceSuccessfulStopAttemptsMeterBinder(eventService);\n    meterBinder.bindTo(registry);\n\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STOPPING)\n            .withStatus(WorkspaceStatus.STOPPED)\n            .withWorkspaceId(\"id1\"));\n    // then\n    Counter successful = registry.find(\"che.workspace.stopped.total\").counter();\n    Assert.assertEquals(successful.count(), 1.0);\n  }\n\n  @Test\n  public void shouldNotCollectStoppedWithError() {\n    // given\n    WorkspaceSuccessfulStopAttemptsMeterBinder meterBinder =\n        new WorkspaceSuccessfulStopAttemptsMeterBinder(eventService);\n    meterBinder.bindTo(registry);\n\n    // when\n    eventService.publish(\n        DtoFactory.newDto(WorkspaceStatusEvent.class)\n            .withPrevStatus(WorkspaceStatus.STOPPING)\n            .withStatus(WorkspaceStatus.STOPPED)\n            .withError(\"Error during workspace stop\")\n            .withWorkspaceId(\"id1\"));\n    // then\n    Counter successful = registry.find(\"che.workspace.stopped.total\").counter();\n    Assert.assertEquals(successful.count(), 0.0);\n  }\n\n  @DataProvider\n  public Object[][] allStatusTransitionsWithoutStopping() {\n    List<List<WorkspaceStatus>> transitions = new ArrayList<>(9);\n\n    for (WorkspaceStatus from : WorkspaceStatus.values()) {\n      for (WorkspaceStatus to : WorkspaceStatus.values()) {\n        if (from == WorkspaceStatus.STOPPING && to == WorkspaceStatus.STOPPED) {\n          continue;\n        }\n\n        transitions.add(asList(from, to));\n      }\n    }\n\n    return transitions.stream().map(List::toArray).toArray(Object[][]::new);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-metrics/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-ssh</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: SSH</name>\n    <properties>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-persist</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.jcraft</groupId>\n            <artifactId>jsch</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-ssh-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-user</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>jakarta.persistence</artifactId>\n            <scope>provided</scope>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh/src/main/java/org/eclipse/che/api/ssh/server/SshManager.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.ssh.server;\n\nimport com.jcraft.jsch.JSch;\nimport com.jcraft.jsch.JSchException;\nimport com.jcraft.jsch.KeyPair;\nimport java.io.ByteArrayOutputStream;\nimport java.util.List;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.ssh.server.model.impl.SshPairImpl;\nimport org.eclipse.che.api.ssh.server.spi.SshDao;\n\n/**\n * Facade for Ssh related operations.\n *\n * @author Sergii Leschenko\n */\n@Singleton\npublic class SshManager {\n  private final JSch genJSch;\n  private final SshDao sshDao;\n\n  @Inject\n  public SshManager(SshDao sshDao) {\n    this.sshDao = sshDao;\n    this.genJSch = new JSch();\n  }\n\n  /**\n   * Generates and stores ssh pair for specified user.\n   *\n   * @param owner the id of the user who will be the owner of the ssh pair\n   * @param service service name pf ssh pair\n   * @param name name of pair\n   * @return instance of generated ssh pair\n   * @throws ConflictException when given ssh pair cannot be generated or created\n   * @throws ServerException when any other error occurs during ssh pair generating or creating\n   */\n  public SshPairImpl generatePair(String owner, String service, String name)\n      throws ServerException, ConflictException {\n    KeyPair keyPair;\n    try {\n      keyPair = KeyPair.genKeyPair(genJSch, 2, 2048);\n    } catch (JSchException e) {\n      throw new ServerException(\"Failed to generate ssh pair.\", e);\n    }\n\n    ByteArrayOutputStream privateBuff = new ByteArrayOutputStream();\n    keyPair.writePrivateKey(privateBuff);\n\n    ByteArrayOutputStream publicBuff = new ByteArrayOutputStream();\n    keyPair.writePublicKey(publicBuff, null);\n\n    final SshPairImpl generatedSshPair =\n        new SshPairImpl(owner, service, name, publicBuff.toString(), privateBuff.toString());\n    sshDao.create(generatedSshPair);\n    return generatedSshPair;\n  }\n\n  /**\n   * Creates new ssh pair for specified user.\n   *\n   * @param sshPair ssh pair to create\n   * @throws ConflictException when given ssh pair cannot be created\n   * @throws ServerException when any other error occurs during ssh pair creating\n   */\n  public void createPair(SshPairImpl sshPair) throws ServerException, ConflictException {\n    sshDao.create(sshPair);\n  }\n\n  /**\n   * Returns ssh pair by owner, service and name.\n   *\n   * @param owner the id of the user who is the owner of the ssh pair\n   * @param service service name of ssh pair\n   * @param name name of ssh pair\n   * @return ssh pair instance\n   * @throws NotFoundException when ssh pair is not found\n   * @throws ServerException when any other error occurs during ssh pair fetching\n   */\n  public SshPairImpl getPair(String owner, String service, String name)\n      throws NotFoundException, ServerException {\n    return sshDao.get(owner, service, name);\n  }\n\n  /**\n   * Returns ssh pairs by owner and service.\n   *\n   * @param owner the id of the user who is the owner of the ssh pairs\n   * @param service service name of ssh pair\n   * @return list of ssh pair with given service and owned by given service.\n   * @throws ServerException when any other error occurs during ssh pair fetching\n   */\n  public List<SshPairImpl> getPairs(String owner, String service) throws ServerException {\n    return sshDao.get(owner, service);\n  }\n\n  /**\n   * Removes ssh pair by owner, service and name.\n   *\n   * @param owner the id of the user who is the owner of the ssh pair\n   * @param service service name of ssh pair\n   * @param name of ssh pair\n   * @throws NotFoundException when ssh pair is not found\n   * @throws ServerException when any other error occurs during ssh pair removing\n   */\n  public void removePair(String owner, String service, String name)\n      throws ServerException, NotFoundException {\n    sshDao.remove(owner, service, name);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh/src/main/java/org/eclipse/che/api/ssh/server/SshService.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.ssh.server;\n\nimport static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;\nimport static org.eclipse.che.api.ssh.shared.Constants.LINK_REL_GET_PAIR;\nimport static org.eclipse.che.api.ssh.shared.Constants.LINK_REL_REMOVE_PAIR;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.util.Arrays;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport org.apache.commons.fileupload.FileItem;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.rest.Service;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.core.util.LinksHelper;\nimport org.eclipse.che.api.ssh.server.model.impl.SshPairImpl;\nimport org.eclipse.che.api.ssh.shared.dto.GenerateSshPairRequest;\nimport org.eclipse.che.api.ssh.shared.dto.SshPairDto;\nimport org.eclipse.che.api.ssh.shared.model.SshPair;\nimport org.eclipse.che.commons.env.EnvironmentContext;\n\n/**\n * Defines Ssh Rest API.\n *\n * @author Sergii Leschenko\n */\n@Deprecated\npublic class SshService extends Service {\n  private final SshManager sshManager;\n\n  @Inject\n  public SshService(SshManager sshManager) {\n    this.sshManager = sshManager;\n  }\n\n  public Response generatePair(GenerateSshPairRequest request)\n      throws BadRequestException, ServerException, ConflictException {\n    requiredNotNull(request, \"Generate ssh pair request required\");\n    requiredNotNull(request.getService(), \"Service name required\");\n    requiredNotNull(request.getName(), \"Name required\");\n    final SshPairImpl generatedPair =\n        sshManager.generatePair(getCurrentUserId(), request.getService(), request.getName());\n\n    return Response.status(Response.Status.CREATED)\n        .entity(asDto(injectLinks(asDto(generatedPair))))\n        .build();\n  }\n\n  public Response createPair(Iterator<FileItem> formData)\n      throws BadRequestException, ServerException, ConflictException {\n    String service = null;\n    String name = null;\n    String privateKey = null;\n    String publicKey = null;\n\n    while (formData.hasNext()) {\n      FileItem item = formData.next();\n      String fieldName = item.getFieldName();\n      switch (fieldName) {\n        case \"service\":\n          service = item.getString();\n          break;\n        case \"name\":\n          name = item.getString();\n          break;\n        case \"privateKey\":\n          privateKey = item.getString();\n          break;\n        case \"publicKey\":\n          publicKey = item.getString();\n          break;\n        default:\n          // do nothing\n      }\n    }\n\n    requiredNotNull(service, \"Service name required\");\n    requiredNotNull(name, \"Name required\");\n    if (privateKey == null && publicKey == null) {\n      throw new BadRequestException(\"Key content was not provided.\");\n    }\n\n    sshManager.createPair(\n        new SshPairImpl(getCurrentUserId(), service, name, publicKey, privateKey));\n\n    // We should send 200 response code and body with empty line\n    // through specific of html form that doesn't invoke complete submit handler\n    return Response.ok(\"\", MediaType.TEXT_HTML).build();\n  }\n\n  public void createPair(SshPairDto sshPair)\n      throws BadRequestException, ServerException, ConflictException {\n    requiredNotNull(sshPair, \"Ssh pair required\");\n    requiredNotNull(sshPair.getService(), \"Service name required\");\n    requiredNotNull(sshPair.getName(), \"Name required\");\n    if (sshPair.getPublicKey() == null && sshPair.getPrivateKey() == null) {\n      throw new BadRequestException(\"Key content was not provided.\");\n    }\n\n    sshManager.createPair(new SshPairImpl(getCurrentUserId(), sshPair));\n  }\n\n  public SshPairDto getPair(String service, String name)\n      throws NotFoundException, ServerException, BadRequestException {\n    requiredNotNull(name, \"Name of ssh pair\");\n    return injectLinks(asDto(sshManager.getPair(getCurrentUserId(), service, name)));\n  }\n\n  public void removePair(String service, String name)\n      throws ServerException, NotFoundException, BadRequestException {\n    requiredNotNull(name, \"Name of ssh pair\");\n    sshManager.removePair(getCurrentUserId(), service, name);\n  }\n\n  public List<SshPairDto> getPairs(String service) throws ServerException {\n    return sshManager.getPairs(getCurrentUserId(), service).stream()\n        .map(sshPair -> injectLinks(asDto(sshPair)))\n        .collect(Collectors.toList());\n  }\n\n  private static String getCurrentUserId() {\n    return EnvironmentContext.getCurrent().getSubject().getUserId();\n  }\n\n  private static SshPairDto asDto(SshPair pair) {\n    return newDto(SshPairDto.class)\n        .withService(pair.getService())\n        .withName(pair.getName())\n        .withPublicKey(pair.getPublicKey())\n        .withPrivateKey(pair.getPrivateKey());\n  }\n\n  private SshPairDto injectLinks(SshPairDto sshPairDto) {\n    final UriBuilder uriBuilder = getServiceContext().getServiceUriBuilder();\n    final Link getPairsLink =\n        LinksHelper.createLink(\n            \"GET\",\n            uriBuilder\n                .clone()\n                .path(getClass(), \"getPairs\")\n                .build(sshPairDto.getService())\n                .toString(),\n            APPLICATION_JSON,\n            LINK_REL_GET_PAIR);\n\n    final Link removePairLink =\n        LinksHelper.createLink(\n            \"DELETE\",\n            uriBuilder\n                .clone()\n                .path(getClass(), \"removePair\")\n                .build(sshPairDto.getService(), sshPairDto.getName())\n                .toString(),\n            APPLICATION_JSON,\n            LINK_REL_REMOVE_PAIR);\n\n    final Link getPairLink =\n        LinksHelper.createLink(\n            \"GET\",\n            uriBuilder\n                .clone()\n                .path(getClass(), \"getPair\")\n                .build(sshPairDto.getService(), sshPairDto.getName())\n                .toString(),\n            APPLICATION_JSON,\n            LINK_REL_GET_PAIR);\n\n    return sshPairDto.withLinks(Arrays.asList(getPairsLink, removePairLink, getPairLink));\n  }\n\n  /**\n   * Checks object reference is not {@code null}\n   *\n   * @param object object reference to check\n   * @param subject used as subject of exception message \"{subject} required\"\n   * @throws BadRequestException when object reference is {@code null}\n   */\n  private void requiredNotNull(Object object, String subject) throws BadRequestException {\n    if (object == null) {\n      throw new BadRequestException(subject + \" required\");\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh/src/main/java/org/eclipse/che/api/ssh/server/jpa/JpaSshDao.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.ssh.server.jpa;\n\nimport static java.lang.String.format;\nimport static java.util.Objects.requireNonNull;\n\nimport com.google.inject.persist.Transactional;\nimport java.util.List;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport javax.persistence.EntityManager;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.ssh.server.model.impl.SshPairImpl;\nimport org.eclipse.che.api.ssh.server.spi.SshDao;\n\n/**\n * JPA based implementation of {@link SshDao}.\n *\n * @author Mihail Kuznyetsov\n * @author Yevhenii Voevodin\n */\n@Singleton\npublic class JpaSshDao implements SshDao {\n\n  @Inject private Provider<EntityManager> managerProvider;\n\n  @Override\n  public void create(SshPairImpl sshPair) throws ServerException, ConflictException {\n    requireNonNull(sshPair);\n    try {\n      doCreate(sshPair);\n    } catch (RuntimeException e) {\n      throw new ServerException(e);\n    }\n  }\n\n  @Override\n  @Transactional\n  public List<SshPairImpl> get(String owner, String service) throws ServerException {\n    requireNonNull(owner);\n    requireNonNull(service);\n    try {\n      return managerProvider\n          .get()\n          .createNamedQuery(\"SshKeyPair.getByOwnerAndService\", SshPairImpl.class)\n          .setParameter(\"owner\", owner)\n          .setParameter(\"service\", service)\n          .getResultList();\n    } catch (RuntimeException e) {\n      throw new ServerException(e.getLocalizedMessage(), e);\n    }\n  }\n\n  @Override\n  @Transactional\n  public SshPairImpl get(String owner, String service, String name)\n      throws ServerException, NotFoundException {\n    requireNonNull(owner);\n    requireNonNull(service);\n    requireNonNull(name);\n    try {\n      SshPairImpl result =\n          managerProvider\n              .get()\n              .find(SshPairImpl.class, new SshPairPrimaryKey(owner, service, name));\n      if (result == null) {\n        throw new NotFoundException(\n            format(\"Ssh pair with service '%s' and name '%s' was not found.\", service, name));\n      }\n      return result;\n    } catch (RuntimeException e) {\n      throw new ServerException(e.getLocalizedMessage(), e);\n    }\n  }\n\n  @Override\n  public void remove(String owner, String service, String name)\n      throws ServerException, NotFoundException {\n    requireNonNull(owner);\n    requireNonNull(service);\n    requireNonNull(name);\n    try {\n      doRemove(owner, service, name);\n    } catch (RuntimeException e) {\n      throw new ServerException(e);\n    }\n  }\n\n  @Override\n  @Transactional\n  public List<SshPairImpl> get(String owner) throws ServerException {\n    requireNonNull(owner, \"Required non-null owner\");\n    try {\n      return managerProvider\n          .get()\n          .createNamedQuery(\"SshKeyPair.getByOwner\", SshPairImpl.class)\n          .setParameter(\"owner\", owner)\n          .getResultList();\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Transactional\n  protected void doCreate(SshPairImpl entity) {\n    EntityManager manager = managerProvider.get();\n    manager.persist(entity);\n    manager.flush();\n  }\n\n  @Transactional\n  protected void doRemove(String owner, String service, String name) throws NotFoundException {\n    EntityManager manager = managerProvider.get();\n    SshPairImpl entity =\n        manager.find(SshPairImpl.class, new SshPairPrimaryKey(owner, service, name));\n    if (entity == null) {\n      throw new NotFoundException(\n          format(\"Ssh pair with service '%s' and name '%s' was not found.\", service, name));\n    }\n    manager.remove(entity);\n    manager.flush();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh/src/main/java/org/eclipse/che/api/ssh/server/jpa/SshJpaModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.ssh.server.jpa;\n\nimport com.google.inject.AbstractModule;\nimport org.eclipse.che.api.ssh.server.spi.SshDao;\n\n/**\n * @author Yevhenii Voevodin\n */\npublic class SshJpaModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    bind(SshDao.class).to(JpaSshDao.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh/src/main/java/org/eclipse/che/api/ssh/server/jpa/SshPairPrimaryKey.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.ssh.server.jpa;\n\nimport java.io.Serializable;\nimport java.util.Objects;\nimport org.eclipse.che.api.ssh.server.model.impl.SshPairImpl;\n\n/**\n * Primary key for {@link SshPairImpl} entity\n *\n * @author Mihail Kuznyetsov\n */\npublic class SshPairPrimaryKey implements Serializable {\n  private String owner;\n  private String service;\n  private String name;\n\n  public SshPairPrimaryKey() {}\n\n  public SshPairPrimaryKey(String owner, String service, String name) {\n    this.owner = owner;\n    this.service = service;\n    this.name = name;\n  }\n\n  public String getOwner() {\n    return owner;\n  }\n\n  public String getService() {\n    return service;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof SshPairPrimaryKey)) return false;\n    final SshPairPrimaryKey other = (SshPairPrimaryKey) obj;\n    return Objects.equals(owner, other.owner)\n        && Objects.equals(service, other.service)\n        && Objects.equals(name, other.name);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(owner);\n    hash = 31 * hash + Objects.hashCode(service);\n    hash = 31 * hash + Objects.hashCode(name);\n    return hash;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh/src/main/java/org/eclipse/che/api/ssh/server/model/impl/SshPairImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.ssh.server.model.impl;\n\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Id;\nimport javax.persistence.IdClass;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.NamedQueries;\nimport javax.persistence.NamedQuery;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.ssh.server.jpa.SshPairPrimaryKey;\nimport org.eclipse.che.api.ssh.shared.model.SshPair;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * @author Sergii Leschenko\n */\n@Entity(name = \"SshKeyPair\")\n@NamedQueries({\n  @NamedQuery(\n      name = \"SshKeyPair.getByOwnerAndService\",\n      query =\n          \"SELECT pair \"\n              + \"FROM SshKeyPair pair \"\n              + \"WHERE pair.owner = :owner \"\n              + \"  AND pair.service = :service\"),\n  @NamedQuery(\n      name = \"SshKeyPair.getByOwner\",\n      query = \"SELECT pair \" + \"FROM SshKeyPair pair \" + \"WHERE pair.owner = :owner\")\n})\n@IdClass(SshPairPrimaryKey.class)\n@Table(name = \"sshkeypair\")\npublic class SshPairImpl implements SshPair {\n  @Id\n  @Column(name = \"owner\")\n  private String owner;\n\n  @Id\n  @Column(name = \"service\")\n  private String service;\n\n  @Id\n  @Column(name = \"name\")\n  private String name;\n\n  @Column(name = \"publickey\", columnDefinition = \"TEXT\")\n  private String publicKey;\n\n  @Column(name = \"privatekey\", columnDefinition = \"TEXT\")\n  private String privateKey;\n\n  @ManyToOne\n  @JoinColumn(name = \"owner\", insertable = false, updatable = false)\n  private UserImpl user;\n\n  public SshPairImpl() {}\n\n  public SshPairImpl(\n      String owner, String service, String name, String publicKey, String privateKey) {\n    this.owner = owner;\n    this.service = service;\n    this.name = name;\n    this.publicKey = publicKey;\n    this.privateKey = privateKey;\n  }\n\n  public SshPairImpl(String owner, SshPair sshPair) {\n    this.owner = owner;\n    this.service = sshPair.getService();\n    this.name = sshPair.getName();\n    this.publicKey = sshPair.getPublicKey();\n    this.privateKey = sshPair.getPrivateKey();\n  }\n\n  public SshPairImpl(SshPairImpl sshPair) {\n    this(sshPair.owner, sshPair.service, sshPair.name, sshPair.publicKey, sshPair.privateKey);\n  }\n\n  public String getOwner() {\n    return owner;\n  }\n\n  @Override\n  public String getService() {\n    return service;\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  @Override\n  @Nullable\n  public String getPublicKey() {\n    return publicKey;\n  }\n\n  @Override\n  @Nullable\n  public String getPrivateKey() {\n    return privateKey;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof SshPairImpl)) return false;\n    final SshPairImpl other = (SshPairImpl) obj;\n    return Objects.equals(owner, other.owner)\n        && Objects.equals(service, other.service)\n        && Objects.equals(name, other.name)\n        && Objects.equals(publicKey, other.publicKey)\n        && Objects.equals(privateKey, other.privateKey);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(owner);\n    hash = 31 * hash + Objects.hashCode(service);\n    hash = 31 * hash + Objects.hashCode(name);\n    hash = 31 * hash + Objects.hashCode(publicKey);\n    hash = 31 * hash + Objects.hashCode(privateKey);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"SshPairImpl{\"\n        + \"owner='\"\n        + owner\n        + '\\''\n        + \", service='\"\n        + service\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", publicKey='\"\n        + publicKey\n        + '\\''\n        + \", privateKey='\"\n        + privateKey\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh/src/main/java/org/eclipse/che/api/ssh/server/spi/SshDao.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.ssh.server.spi;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.ssh.server.model.impl.SshPairImpl;\n\n/**\n * Defines data access object contract for {@link SshPairImpl}.\n *\n * @author Sergii Leschenko\n */\npublic interface SshDao {\n\n  /**\n   * Creates new ssh pair for specified user.\n   *\n   * @param sshPair ssh pair to create\n   * @throws ConflictException when specified user already has ssh pair with given service and name\n   * @throws NullPointerException when {@code sshPair} is null\n   * @throws ServerException when any other error occurs during ssh pair creating\n   */\n  void create(SshPairImpl sshPair) throws ServerException, ConflictException;\n\n  /**\n   * Returns ssh pairs by owner and service.\n   *\n   * @param owner the id of the user who is the owner of the ssh pairs\n   * @param service service name of ssh pair\n   * @return list of ssh pair with given service and owned by given service.\n   * @throws NullPointerException when {@code owner} or {@code service} is null\n   * @throws ServerException when any other error occurs during ssh pair fetching\n   */\n  List<SshPairImpl> get(String owner, String service) throws ServerException;\n\n  /**\n   * Returns ssh pair by owner, service and name.\n   *\n   * @param owner the id of the user who is the owner of the ssh pair\n   * @param service service name of ssh pair\n   * @param name name of ssh pair\n   * @return ssh pair instance\n   * @throws NullPointerException when {@code owner} or {@code service} or {@code name} is null\n   * @throws NotFoundException when ssh pair is not found\n   * @throws ServerException when any other error occurs during ssh pair fetching\n   */\n  SshPairImpl get(String owner, String service, String name)\n      throws ServerException, NotFoundException;\n\n  /**\n   * Removes ssh pair by owner, service and name.\n   *\n   * @param owner the id of the user who is the owner of the ssh pair\n   * @param service service name of ssh pair\n   * @param name of ssh pair\n   * @throws NullPointerException when {@code owner} or {@code service} or {@code name} is null\n   * @throws NotFoundException when ssh pair is not found\n   * @throws ServerException when any other error occurs during ssh pair removing\n   */\n  void remove(String owner, String service, String name) throws ServerException, NotFoundException;\n\n  /**\n   * Gets ssh pairs by owner.\n   *\n   * @param owner the owner of the ssh key\n   * @return the list of the ssh key pairs owned by the {@code owner}, or empty list if there are no\n   *     ssh key pairs by the given {@code owner}\n   * @throws NullPointerException when {@code owner} is null\n   * @throws ServerException when any error occurs(e.g. database connection error)\n   */\n  List<SshPairImpl> get(String owner) throws ServerException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh-shared/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-ssh-shared</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: SSH :: Shared</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <id>generate-server-dto</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                        <configuration>\n                            <dtoPackages>\n                                <package>org.eclipse.che.api.ssh.shared.dto</package>\n                            </dtoPackages>\n                            <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                            <genClassName>org.eclipse.che.api.ssh.server.dto.DtoServerImpls</genClassName>\n                            <impl>server</impl>\n                        </configuration>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-ssh-shared</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-resource</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh-shared/src/main/java/org/eclipse/che/api/ssh/shared/Constants.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.ssh.shared;\n\n/**\n * Constants for ssh API\n *\n * @author Sergii Leschenko\n */\npublic final class Constants {\n  public static final String LINK_REL_GENERATE_PAIR = \"create pair\";\n  public static final String LINK_REL_CREATE_PAIR = \"create pair\";\n  public static final String LINK_REL_GET_PAIRS = \"get pairs\";\n  public static final String LINK_REL_GET_PAIR = \"get pair\";\n  public static final String LINK_REL_REMOVE_PAIR = \"remove pair\";\n\n  private Constants() {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh-shared/src/main/java/org/eclipse/che/api/ssh/shared/dto/GenerateSshPairRequest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.ssh.shared.dto;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Interface describe a request for generating a SSH key pair.\n *\n * @author Sergii Leschenko\n */\n@DTO\npublic interface GenerateSshPairRequest {\n  /** Returns name service that will use generated ssh pair. */\n  String getService();\n\n  void setService(String service);\n\n  GenerateSshPairRequest withService(String service);\n\n  /** Returns name for generated ssh pair */\n  String getName();\n\n  void setName(String name);\n\n  GenerateSshPairRequest withName(String name);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh-shared/src/main/java/org/eclipse/che/api/ssh/shared/dto/SshPairDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.ssh.shared.dto;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.rest.shared.dto.Hyperlinks;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.ssh.shared.model.SshPair;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Leschenko\n */\n@DTO\npublic interface SshPairDto extends SshPair, Hyperlinks {\n  @Override\n  String getService();\n\n  void setService(String service);\n\n  SshPairDto withService(String service);\n\n  @Override\n  String getName();\n\n  void setName(String name);\n\n  SshPairDto withName(String name);\n\n  @Override\n  String getPublicKey();\n\n  void setPublicKey(String publicKey);\n\n  SshPairDto withPublicKey(String publicKey);\n\n  @Override\n  String getPrivateKey();\n\n  void setPrivateKey(String privateKey);\n\n  SshPairDto withPrivateKey(String privateKey);\n\n  @Override\n  SshPairDto withLinks(List<Link> links);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-ssh-shared/src/main/java/org/eclipse/che/api/ssh/shared/model/SshPair.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.ssh.shared.model;\n\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Defines ssh pair\n *\n * @author Sergii Leschenko\n */\npublic interface SshPair {\n  /** Returns name service that use current ssh pair. It is mandatory. */\n  String getService();\n\n  /** Returns name of ssh pair. It is mandatory. */\n  String getName();\n\n  /** Returns content of public key. It is optional */\n  @Nullable\n  String getPublicKey();\n\n  /** Returns content of private key. It is optional */\n  @Nullable\n  String getPrivateKey();\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-system</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: System</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.swagger.core.v3</groupId>\n            <artifactId>swagger-annotations-jakarta</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.annotation</groupId>\n            <artifactId>jakarta.annotation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-system-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-inject</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-schedule</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.websocket</groupId>\n            <artifactId>jakarta.websocket-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>jakarta.persistence</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-resource</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <id>generate-server-dto</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                        <configuration>\n                            <dtoPackages>\n                                <package>org.eclipse.che.api.system.shared.dto</package>\n                            </dtoPackages>\n                            <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                            <genClassName>org.eclipse.che.api.system.shared.dto.DtoServerImpls</genClassName>\n                            <impl>server</impl>\n                        </configuration>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-system</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/main/java/org/eclipse/che/api/system/server/CronThreadPullTermination.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport java.util.Collections;\nimport java.util.Set;\nimport org.eclipse.che.commons.schedule.executor.ThreadPullLauncher;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Terminates {@link ThreadPullLauncher}.\n *\n * @author Anton Korneta\n */\n@Singleton\npublic class CronThreadPullTermination implements ServiceTermination {\n  private static final Logger LOG = LoggerFactory.getLogger(CronThreadPullTermination.class);\n\n  public static final String SERVICE_NAME = \"CronJobService\";\n\n  private final ThreadPullLauncher launcher;\n\n  @Inject\n  public CronThreadPullTermination(ThreadPullLauncher launcher) {\n    this.launcher = launcher;\n  }\n\n  @Override\n  public void terminate() throws InterruptedException {\n    suspend();\n  }\n\n  @Override\n  public void suspend() throws InterruptedException {\n    try {\n      launcher.shutdown();\n    } catch (RuntimeException ex) {\n      LOG.error(\"Failed to stop cron job thread pool. Cause: \" + ex.getMessage());\n    }\n  }\n\n  @Override\n  public String getServiceName() {\n    return SERVICE_NAME;\n  }\n\n  @Override\n  public Set<String> getDependencies() {\n    return Collections.emptySet();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/main/java/org/eclipse/che/api/system/server/DtoConverter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport org.eclipse.che.api.system.shared.dto.SystemEventDto;\nimport org.eclipse.che.api.system.shared.dto.SystemServiceEventDto;\nimport org.eclipse.che.api.system.shared.dto.SystemServiceItemStoppedEventDto;\nimport org.eclipse.che.api.system.shared.dto.SystemStatusChangedEventDto;\nimport org.eclipse.che.api.system.shared.event.SystemEvent;\nimport org.eclipse.che.api.system.shared.event.SystemStatusChangedEvent;\nimport org.eclipse.che.api.system.shared.event.service.SystemServiceEvent;\nimport org.eclipse.che.api.system.shared.event.service.SystemServiceItemStoppedEvent;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * Converts events to corresponding DTOs.\n *\n * @author Yevhenii Voevodin\n */\npublic final class DtoConverter {\n\n  /** Creates {@link SystemStatusChangedEventDto} from event. */\n  public static SystemStatusChangedEventDto asDto(SystemStatusChangedEvent event) {\n    SystemStatusChangedEventDto dto = DtoFactory.newDto(SystemStatusChangedEventDto.class);\n    dto.setType(event.getType());\n    dto.setStatus(event.getStatus());\n    dto.setPrevStatus(event.getPrevStatus());\n    return dto;\n  }\n\n  /** Creates {@link SystemServiceEventDto} from event. */\n  public static SystemServiceEventDto asDto(SystemServiceEvent event) {\n    SystemServiceEventDto dto = DtoFactory.newDto(SystemServiceEventDto.class);\n    dto.setService(event.getServiceName());\n    dto.setType(event.getType());\n    return dto;\n  }\n\n  /** Creates {@link SystemServiceItemStoppedEventDto} from event. */\n  public static SystemServiceItemStoppedEventDto asDto(SystemServiceItemStoppedEvent event) {\n    SystemServiceItemStoppedEventDto dto =\n        DtoFactory.newDto(SystemServiceItemStoppedEventDto.class);\n    dto.setService(event.getServiceName());\n    dto.setType(event.getType());\n    dto.setCurrent(event.getCurrent());\n    dto.setTotal(event.getTotal());\n    dto.setItem(event.getItem());\n    return dto;\n  }\n\n  /**\n   * Converts given event to the corresponding DTO, if event type is unknown throws {@link\n   * IllegalArgumentException}.\n   */\n  public static SystemEventDto asDto(SystemEvent event) {\n    switch (event.getType()) {\n      case STATUS_CHANGED:\n        return asDto((SystemStatusChangedEvent) event);\n      case SERVICE_ITEM_STOPPED:\n        return asDto((SystemServiceItemStoppedEvent) event);\n      case SERVICE_STOPPED:\n      case STOPPING_SERVICE:\n        return asDto((SystemServiceEvent) event);\n      default:\n        throw new IllegalArgumentException(\n            \"Can't convert event to dto, event type '\" + event.getType() + \"' is unknown\");\n    }\n  }\n\n  private DtoConverter() {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/main/java/org/eclipse/che/api/system/server/JvmManager.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport com.sun.management.HotSpotDiagnosticMXBean;\nimport java.io.BufferedOutputStream;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.OutputStreamWriter;\nimport java.lang.management.ManagementFactory;\nimport java.lang.management.ThreadInfo;\nimport java.lang.management.ThreadMXBean;\nimport java.nio.file.Files;\nimport java.text.DateFormat;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.zip.ZipOutputStream;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.lang.IoUtil;\nimport org.eclipse.che.commons.lang.ZipUtils;\n\n/** The class that allow getting different diagnostic information from the current JVM. */\n@Singleton\npublic class JvmManager {\n\n  private static final DateFormat MILLIS_FORMAT = new SimpleDateFormat(\"mm:ss:SSS\");\n  private final ThreadMXBean threadMxBean;\n  private final HotSpotDiagnosticMXBean hotSpotMxBean;\n\n  public JvmManager() {\n    threadMxBean = ManagementFactory.getThreadMXBean();\n    hotSpotMxBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);\n  }\n\n  /**\n   * Write thread dump that contains stack traces of existed threads, plus it contains some other\n   * diagnostic information about threads such as: daemon, priority, etc.\n   */\n  public void writeThreadDump(OutputStream outputStream) throws IOException {\n    ThreadInfo[] threadInfos =\n        threadMxBean.getThreadInfo(threadMxBean.getAllThreadIds(), Integer.MAX_VALUE);\n    Map<Long, ThreadInfo> threadInfoMap = new HashMap<>();\n    for (ThreadInfo threadInfo : threadInfos) {\n      threadInfoMap.put(threadInfo.getThreadId(), threadInfo);\n    }\n\n    try (OutputStreamWriter writer = new OutputStreamWriter(outputStream)) {\n      Map<Thread, StackTraceElement[]> stacks = Thread.getAllStackTraces();\n\n      writer.write(String.format(\"Dump of %d threads at %Tc\\n\", stacks.size(), new Date()));\n      for (Map.Entry<Thread, StackTraceElement[]> entry : stacks.entrySet()) {\n        Thread thread = entry.getKey();\n        writer.write(\n            String.format(\n                \"\\\"%s\\\" prio=%d tid=%d state=%s daemon=%s\\n\",\n                thread.getName(),\n                thread.getPriority(),\n                thread.getId(),\n                thread.getState(),\n                thread.isDaemon()));\n        ThreadInfo threadInfo = threadInfoMap.get(thread.getId());\n        if (threadInfo != null) {\n          writer.write(\n              String.format(\n                  \"    native=%s, suspended=%s, block=%d, wait=%s\\n\",\n                  threadInfo.isInNative(),\n                  threadInfo.isSuspended(),\n                  threadInfo.getBlockedCount(),\n                  threadInfo.getWaitedCount()));\n          writer.write(\n              String.format(\n                  \"    lock=%s owned by %s (%s), cpu=%s, user=%s\\n\",\n                  threadInfo.getLockName(),\n                  threadInfo.getLockOwnerName(),\n                  threadInfo.getLockOwnerId(),\n                  MILLIS_FORMAT.format(\n                      new Date(threadMxBean.getThreadCpuTime(threadInfo.getThreadId()) / 1000000L)),\n                  MILLIS_FORMAT.format(\n                      new Date(\n                          threadMxBean.getThreadUserTime(threadInfo.getThreadId()) / 1000000L))));\n        }\n        for (StackTraceElement element : entry.getValue()) {\n          writer.append(\"        \").append(element.toString()).append(System.lineSeparator());\n        }\n        writer.write(System.lineSeparator());\n      }\n      writer.write(\"------------------------------------------------------\");\n      writer.write(System.lineSeparator());\n      writer.write(\"Non-daemon threads: \");\n      writer.write(System.lineSeparator());\n\n      for (Thread thread : stacks.keySet()) {\n        if (!thread.isDaemon()) {\n          writer\n              .append(\"\\\"\")\n              .append(thread.getName())\n              .append(\"\\\", \")\n              .append(System.lineSeparator());\n        }\n      }\n      writer.write(\"------------------------------------------------------\");\n      writer.write(System.lineSeparator());\n      writer.write(\"Blocked threads: \");\n      writer.write(System.lineSeparator());\n      for (Thread thread : stacks.keySet()) {\n        if (thread.getState() == Thread.State.BLOCKED) {\n          writer\n              .append(\"\\\"\")\n              .append(thread.getName())\n              .append(\"\\\", \")\n              .append(System.lineSeparator());\n        }\n      }\n      writer.write(\"------------------------------------------------------\");\n    }\n  }\n\n  /** Create a file with a zipped hprof heap dump. */\n  public File createZippedHeapDump() throws IOException {\n    File tmpFolder = Files.createTempDirectory(\"heapdump\").toFile();\n    File heapFile = new File(tmpFolder, \"heapdump.hprof\");\n    hotSpotMxBean.dumpHeap(heapFile.getAbsolutePath(), false);\n    File zip = File.createTempFile(\"heapdump\", \".zip\");\n    try (ZipOutputStream result =\n        new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zip)))) {\n      ZipUtils.add(result, heapFile.toPath());\n    }\n    IoUtil.deleteRecursive(tmpFolder);\n    return zip;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/main/java/org/eclipse/che/api/system/server/JvmService.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.Response;\nimport jakarta.ws.rs.core.StreamingOutput;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport javax.inject.Inject;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * REST API for JVM manipulations.\n *\n * @author Sergii Kabashniuk\n */\n@Tag(name = \"jvm\", description = \"API for JVM manipulations\")\n@Path(\"/jvm\")\npublic class JvmService {\n\n  private static final Logger LOG = LoggerFactory.getLogger(JvmService.class);\n\n  private final JvmManager manager;\n\n  @Inject\n  public JvmService(JvmManager manager) {\n    this.manager = manager;\n  }\n\n  @GET\n  @Path(\"/dump/thread\")\n  @Produces(MediaType.TEXT_PLAIN)\n  @Operation(\n      summary = \"Get thread dump of jvm\",\n      responses = {\n        @ApiResponse(responseCode = \"200\", description = \"The response contains thread dump\"),\n        @ApiResponse(responseCode = \"500\", description = \"Internal server error occurred\")\n      })\n  public StreamingOutput threadDump() {\n    return manager::writeThreadDump;\n  }\n\n  @GET\n  @Path(\"/dump/heap\")\n  @Produces(\"application/zip\")\n  @Operation(\n      summary = \"Get heap dump of jvm\",\n      responses = {\n        @ApiResponse(responseCode = \"200\", description = \"The response contains jvm heap dump\"),\n        @ApiResponse(responseCode = \"500\", description = \"Internal server error occurred\")\n      })\n  public Response heapDump() throws IOException {\n    File heapDump = manager.createZippedHeapDump();\n    heapDump.deleteOnExit();\n    return Response.ok(\n            new FileInputStream(heapDump) {\n              @Override\n              public void close() throws IOException {\n                super.close();\n                if (!heapDump.delete()) {\n                  LOG.warn(\"Not able to delete temporary file {}\", heapDump);\n                }\n              }\n            },\n            \"application/zip\")\n        .header(\"Content-Length\", String.valueOf(Files.size(heapDump.toPath())))\n        .header(\"Content-Disposition\", \"attachment; filename=heapdump.hprof.zip\")\n        .build();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/main/java/org/eclipse/che/api/system/server/ServiceTermination.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport java.util.Set;\nimport org.eclipse.che.api.system.shared.event.service.StoppingSystemServiceEvent;\nimport org.eclipse.che.api.system.shared.event.service.SystemServiceItemStoppedEvent;\nimport org.eclipse.che.api.system.shared.event.service.SystemServiceStoppedEvent;\n\n/**\n * Defines an interface for implementing termination or suspend process for a certain service.\n *\n * @author Yevhenii Voevodin\n */\npublic interface ServiceTermination {\n\n  /**\n   * Terminates a certain service. It's expected that termination is synchronous.\n   *\n   * @throws InterruptedException as termination is synchronous some of the implementations may need\n   *     to wait for asynchronous jobs to finish their execution, so if termination is interrupted\n   *     and implementation supports termination it should throw an interrupted exception\n   */\n  void terminate() throws InterruptedException;\n\n  /**\n   * Suspends a certain service. Means that no more new service entities should be created and/or\n   * executed etc.\n   *\n   * @throws UnsupportedOperationException if this operation is not supported\n   * @throws InterruptedException as suspend is synchronous some of the implementations may need to\n   *     wait for asynchronous jobs to finish their execution, so if suspend is interrupted and\n   *     implementation supports suspending it should throw an interrupted exception\n   */\n  default void suspend() throws InterruptedException, UnsupportedOperationException {\n    throw new UnsupportedOperationException(\"This operation is not supported.\");\n  }\n\n  /**\n   * Returns the name of the service which is terminated by this termination. The name is used for\n   * logging/sending events like {@link StoppingSystemServiceEvent}, {@link\n   * SystemServiceItemStoppedEvent} or {@link SystemServiceStoppedEvent}.\n   */\n  String getServiceName();\n\n  /**\n   * Returns set of terminations service names on which the given termination depends, i.e. it MUST\n   * be executed after them.\n   *\n   * @return list of dependencies is any, or empty list otherwise.\n   */\n  Set<String> getDependencies();\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/main/java/org/eclipse/che/api/system/server/ServiceTerminator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.common.collect.ImmutableSortedSet;\nimport java.util.Comparator;\nimport java.util.HashSet;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.system.shared.event.service.StoppingSystemServiceEvent;\nimport org.eclipse.che.api.system.shared.event.service.SuspendingSystemServiceEvent;\nimport org.eclipse.che.api.system.shared.event.service.SystemServiceStoppedEvent;\nimport org.eclipse.che.api.system.shared.event.service.SystemServiceSuspendedEvent;\nimport org.eclipse.che.inject.ConfigurationException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Terminates or suspends system services.\n *\n * @author Yevhenii Voevodin\n */\nclass ServiceTerminator {\n\n  private static final Logger LOG = LoggerFactory.getLogger(ServiceTerminator.class);\n\n  private final EventService eventService;\n  private final Set<ServiceTermination> terminations;\n\n  @Inject\n  ServiceTerminator(EventService eventService, Set<ServiceTermination> terminations) {\n    this.eventService = eventService;\n    checkNamesAndDependencies(terminations);\n    this.terminations =\n        ImmutableSortedSet.copyOf(new ServiceTerminationComparator(terminations), terminations);\n  }\n\n  /**\n   * Terminates system services in a order satisfying termination dependencies.\n   *\n   * @throws InterruptedException when termination is interrupted\n   */\n  void terminateAll() throws InterruptedException {\n    for (ServiceTermination termination : terminations) {\n      LOG.info(\"Shutting down '{}' service\", termination.getServiceName());\n      doTerminate(termination);\n    }\n  }\n\n  /**\n   * Suspends system services in a order satisfying termination dependencies.\n   *\n   * @throws InterruptedException when suspending is interrupted\n   */\n  void suspendAll() throws InterruptedException {\n    for (ServiceTermination termination : terminations) {\n      LOG.info(\"Suspending down '{}' service\", termination.getServiceName());\n      eventService.publish(new SuspendingSystemServiceEvent(termination.getServiceName()));\n      try {\n        termination.suspend();\n        eventService.publish(new SystemServiceSuspendedEvent(termination.getServiceName()));\n        LOG.info(\"Service '{}' is suspended\", termination.getServiceName());\n      } catch (UnsupportedOperationException e) {\n        LOG.info(\n            \"Suspending down '{}' service isn't supported, terminating it\",\n            termination.getServiceName());\n        doTerminate(termination);\n      } catch (InterruptedException x) {\n        LOG.error(\n            \"Interrupted while waiting for '{}' service to suspend\", termination.getServiceName());\n        throw x;\n      }\n    }\n  }\n\n  @VisibleForTesting\n  void doTerminate(ServiceTermination termination) throws InterruptedException {\n    eventService.publish(new StoppingSystemServiceEvent(termination.getServiceName()));\n    try {\n      termination.terminate();\n    } catch (InterruptedException x) {\n      LOG.error(\n          \"Interrupted while waiting for '{}' service to shutdown\", termination.getServiceName());\n      throw x;\n    }\n    LOG.info(\"Service '{}' is shut down\", termination.getServiceName());\n    eventService.publish(new SystemServiceStoppedEvent(termination.getServiceName()));\n  }\n\n  private void checkNamesAndDependencies(Set<ServiceTermination> terminationSet) {\n    Set<String> uniqueNamesSet = new HashSet<>();\n    terminationSet.forEach(\n        t -> {\n          if (!uniqueNamesSet.add(t.getServiceName())) {\n            throw new ConfigurationException(\n                String.format(\n                    \"Duplicate termination found with service name %s\", t.getServiceName()));\n          }\n        });\n\n    terminationSet.forEach(\n        t -> {\n          if (!uniqueNamesSet.containsAll(t.getDependencies())) {\n            throw new RuntimeException(\n                String.format(\"Unknown dependency found in termination %s\", t.getServiceName()));\n          }\n        });\n  }\n\n  public static class ServiceTerminationComparator implements Comparator<ServiceTermination> {\n\n    private final Map<String, Set<String>> dependencies;\n\n    public ServiceTerminationComparator(Set<ServiceTermination> terminations) {\n      this.dependencies =\n          terminations.stream()\n              .collect(\n                  Collectors.toMap(\n                      ServiceTermination::getServiceName, ServiceTermination::getDependencies));\n    }\n\n    @Override\n    public int compare(ServiceTermination o1, ServiceTermination o2) {\n      return checkTransitiveDependency(o1.getServiceName(), o2.getServiceName(), new HashSet<>());\n    }\n\n    // Recursively dig into dependencies and sort them out\n    private int checkTransitiveDependency(String o1, String o2, Set<String> loopList) {\n      if (loopList.contains(o1)) {\n        throw new RuntimeException(\"Circular dependency found between terminations \" + loopList);\n      }\n      Set<String> directDependencies = dependencies.get(o1);\n      if (directDependencies.isEmpty()) {\n        return -1;\n      } else {\n        if (directDependencies.contains(o2)) {\n          return 1;\n        } else {\n          loopList.add(o1);\n          for (String dependency : directDependencies) {\n            if (checkTransitiveDependency(dependency, o2, loopList) > 0) {\n              return 1;\n            }\n          }\n          return -1;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/main/java/org/eclipse/che/api/system/server/SystemEventsWebsocketBroadcaster.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport jakarta.annotation.PostConstruct;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.notification.RemoteSubscriptionManager;\nimport org.eclipse.che.api.system.shared.event.SystemEvent;\n\n/**\n * Broadcasts system status events to the websocket channel.\n *\n * @author Yevhenii Voevodin\n */\n@Singleton\npublic class SystemEventsWebsocketBroadcaster {\n\n  public static final String SYSTEM_STATE_METHOD_NAME = \"system/state\";\n\n  private final RemoteSubscriptionManager remoteSubscriptionManager;\n\n  @Inject\n  public SystemEventsWebsocketBroadcaster(RemoteSubscriptionManager remoteSubscriptionManager) {\n    this.remoteSubscriptionManager = remoteSubscriptionManager;\n  }\n\n  @PostConstruct\n  @VisibleForTesting\n  void subscribe() {\n    remoteSubscriptionManager.register(\n        SYSTEM_STATE_METHOD_NAME, SystemEvent.class, (systemEvent, stringStringMap) -> true);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/main/java/org/eclipse/che/api/system/server/SystemManager.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport static org.eclipse.che.api.system.server.DtoConverter.asDto;\nimport static org.eclipse.che.api.system.shared.SystemStatus.PREPARING_TO_SHUTDOWN;\nimport static org.eclipse.che.api.system.shared.SystemStatus.READY_TO_SHUTDOWN;\nimport static org.eclipse.che.api.system.shared.SystemStatus.RUNNING;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport jakarta.annotation.PreDestroy;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.atomic.AtomicReference;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.system.shared.SystemStatus;\nimport org.eclipse.che.api.system.shared.event.SystemStatusChangedEvent;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.eclipse.che.commons.lang.concurrent.ThreadLocalPropagateContext;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Facade for system operations.\n *\n * @author Yevhenii Voevodin\n */\n@Singleton\npublic class SystemManager {\n\n  private static final Logger LOG = LoggerFactory.getLogger(SystemManager.class);\n\n  private final AtomicReference<SystemStatus> statusRef;\n  private final EventService eventService;\n  private final ServiceTerminator terminator;\n\n  private final CountDownLatch shutdownLatch = new CountDownLatch(1);\n\n  @Inject\n  public SystemManager(ServiceTerminator terminator, EventService eventService) {\n    this.terminator = terminator;\n    this.eventService = eventService;\n    this.statusRef = new AtomicReference<>(RUNNING);\n  }\n\n  /**\n   * Stops some of the system services preparing system to full shutdown. System status is changed\n   * from {@link SystemStatus#RUNNING} to {@link SystemStatus#PREPARING_TO_SHUTDOWN}.\n   *\n   * @throws ConflictException when system status is different from running\n   */\n  public void stopServices() throws ConflictException {\n    if (!statusRef.compareAndSet(RUNNING, PREPARING_TO_SHUTDOWN)) {\n      throw new ConflictException(\n          \"System shutdown has been already called, system status: \" + statusRef.get());\n    }\n    ExecutorService exec =\n        Executors.newSingleThreadExecutor(\n            new ThreadFactoryBuilder()\n                .setDaemon(false)\n                .setNameFormat(\"ShutdownSystemServicesPool\")\n                .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n                .build());\n    exec.execute(ThreadLocalPropagateContext.wrap(this::doStopServices));\n    exec.shutdown();\n  }\n\n  /**\n   * Suspends some of the system services preparing system to lighter shutdown. System status is\n   * changed from {@link SystemStatus#RUNNING} to {@link SystemStatus#PREPARING_TO_SHUTDOWN}.\n   *\n   * @throws ConflictException when system status is different from running\n   */\n  public void suspendServices() throws ConflictException {\n    if (!statusRef.compareAndSet(RUNNING, PREPARING_TO_SHUTDOWN)) {\n      throw new ConflictException(\n          \"System shutdown has been already called, system status: \" + statusRef.get());\n    }\n    ExecutorService exec =\n        Executors.newSingleThreadExecutor(\n            new ThreadFactoryBuilder()\n                .setDaemon(false)\n                .setNameFormat(\"SuspendSystemServicesPool\")\n                .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n                .build());\n    exec.execute(ThreadLocalPropagateContext.wrap(this::doSuspendServices));\n    exec.shutdown();\n  }\n\n  /**\n   * Gets current system status.\n   *\n   * @see SystemStatus\n   */\n  public SystemStatus getSystemStatus() {\n    return statusRef.get();\n  }\n\n  /** Synchronously stops corresponding services. */\n  private void doStopServices() {\n    LOG.info(\"Preparing system to shutdown\");\n    eventService.publish(asDto(new SystemStatusChangedEvent(RUNNING, PREPARING_TO_SHUTDOWN)));\n    try {\n      terminator.terminateAll();\n      statusRef.set(READY_TO_SHUTDOWN);\n      eventService.publish(\n          asDto(new SystemStatusChangedEvent(PREPARING_TO_SHUTDOWN, READY_TO_SHUTDOWN)));\n      LOG.info(\"System is ready to shutdown\");\n    } catch (InterruptedException x) {\n      LOG.error(\"Interrupted while waiting for system service to shutdown components\");\n      Thread.currentThread().interrupt();\n    } finally {\n      shutdownLatch.countDown();\n    }\n  }\n\n  /** Synchronously stops corresponding services. */\n  private void doSuspendServices() {\n    LOG.info(\"Preparing system to shutdown\");\n    eventService.publish(asDto(new SystemStatusChangedEvent(RUNNING, PREPARING_TO_SHUTDOWN)));\n    try {\n      terminator.suspendAll();\n      statusRef.set(READY_TO_SHUTDOWN);\n      eventService.publish(\n          asDto(new SystemStatusChangedEvent(PREPARING_TO_SHUTDOWN, READY_TO_SHUTDOWN)));\n      LOG.info(\"System is ready to shutdown\");\n    } catch (InterruptedException x) {\n      LOG.error(\"Interrupted while waiting for system service to shutdown components\");\n      Thread.currentThread().interrupt();\n    } finally {\n      shutdownLatch.countDown();\n    }\n  }\n\n  @PreDestroy\n  @VisibleForTesting\n  void shutdown() throws InterruptedException {\n    if (!statusRef.compareAndSet(RUNNING, PREPARING_TO_SHUTDOWN)) {\n      shutdownLatch.await();\n    } else {\n      doSuspendServices();\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/main/java/org/eclipse/che/api/system/server/SystemModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport com.google.inject.AbstractModule;\nimport com.google.inject.multibindings.Multibinder;\n\n/**\n * @author Anton Korneta\n */\npublic class SystemModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    bind(org.eclipse.che.api.system.server.SystemService.class);\n    bind(org.eclipse.che.api.system.server.JvmService.class);\n    bind(org.eclipse.che.api.system.server.JvmManager.class).asEagerSingleton();\n    bind(org.eclipse.che.api.system.server.SystemEventsWebsocketBroadcaster.class)\n        .asEagerSingleton();\n    Multibinder.newSetBinder(binder(), ServiceTermination.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/main/java/org/eclipse/che/api/system/server/SystemService.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport static java.util.Collections.singletonList;\nimport static org.eclipse.che.api.core.util.LinksHelper.createLink;\nimport static org.eclipse.che.api.system.server.SystemEventsWebsocketBroadcaster.SYSTEM_STATE_METHOD_NAME;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.ws.rs.DefaultValue;\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.POST;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.QueryParam;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.rest.Service;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.core.rest.shared.dto.LinkParameter;\nimport org.eclipse.che.api.system.shared.dto.SystemStateDto;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * REST API for system state management.\n *\n * @author Yevhenii Voevodin\n */\n@Tag(name = \"system\", description = \"API for system state management\")\n@Path(\"/system\")\npublic class SystemService extends Service {\n\n  private final SystemManager manager;\n\n  @Inject\n  public SystemService(SystemManager manager) {\n    this.manager = manager;\n  }\n\n  @POST\n  @Path(\"/stop\")\n  @Operation(\n      summary = \"Stops system services. Prepares system to shutdown\",\n      responses = {\n        @ApiResponse(responseCode = \"204\", description = \"The system is preparing to stop\"),\n        @ApiResponse(responseCode = \"409\", description = \"Stop has been already called\")\n      })\n  public void stop(@QueryParam(\"shutdown\") @DefaultValue(\"false\") boolean shutdown)\n      throws ConflictException {\n    if (shutdown) {\n      manager.stopServices();\n    } else {\n      manager.suspendServices();\n    }\n  }\n\n  @GET\n  @Path(\"/state\")\n  @Produces(\"application/json\")\n  @Operation(\n      summary = \"Gets current system state\",\n      responses = {\n        @ApiResponse(responseCode = \"200\", description = \"The response contains system status\"),\n        @ApiResponse(responseCode = \"409\", description = \"Stop has been already called\")\n      })\n  public SystemStateDto getState() {\n    Link wsLink =\n        createLink(\n            \"GET\",\n            getServiceContext()\n                .getBaseUriBuilder()\n                .scheme(\"https\".equals(uriInfo.getBaseUri().getScheme()) ? \"wss\" : \"ws\")\n                .path(\"websocket\")\n                .build()\n                .toString(),\n            \"system.state.channel\",\n            singletonList(\n                DtoFactory.newDto(LinkParameter.class)\n                    .withName(\"channel\")\n                    .withDefaultValue(SYSTEM_STATE_METHOD_NAME)\n                    .withRequired(true)));\n    return DtoFactory.newDto(SystemStateDto.class)\n        .withStatus(manager.getSystemStatus())\n        .withLinks(singletonList(wsLink));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/test/java/org/eclipse/che/api/system/server/DtoConverterTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport static org.eclipse.che.api.system.shared.SystemStatus.PREPARING_TO_SHUTDOWN;\nimport static org.eclipse.che.api.system.shared.SystemStatus.RUNNING;\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.EnumSet;\nimport org.eclipse.che.api.system.shared.dto.SystemServiceEventDto;\nimport org.eclipse.che.api.system.shared.dto.SystemServiceItemStoppedEventDto;\nimport org.eclipse.che.api.system.shared.dto.SystemStatusChangedEventDto;\nimport org.eclipse.che.api.system.shared.event.EventType;\nimport org.eclipse.che.api.system.shared.event.SystemStatusChangedEvent;\nimport org.eclipse.che.api.system.shared.event.service.StoppingSystemServiceEvent;\nimport org.eclipse.che.api.system.shared.event.service.SystemServiceItemStoppedEvent;\nimport org.eclipse.che.api.system.shared.event.service.SystemServiceStoppedEvent;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link DtoConverter}.\n *\n * @author Yevhenii Voevodin\n */\npublic class DtoConverterTest {\n\n  @Test\n  public void convertsSystemStatusChangedEvent() {\n    SystemStatusChangedEvent event = new SystemStatusChangedEvent(RUNNING, PREPARING_TO_SHUTDOWN);\n\n    SystemStatusChangedEventDto dto = DtoConverter.asDto(event);\n\n    assertEquals(dto.getType(), EventType.STATUS_CHANGED);\n    assertEquals(dto.getPrevStatus(), event.getPrevStatus());\n    assertEquals(dto.getStatus(), event.getStatus());\n  }\n\n  @Test\n  public void convertsSystemServiceStoppingEvent() {\n    StoppingSystemServiceEvent event = new StoppingSystemServiceEvent(\"service1\");\n\n    SystemServiceEventDto dto = DtoConverter.asDto(event);\n\n    assertEquals(dto.getType(), EventType.STOPPING_SERVICE);\n    assertEquals(dto.getService(), event.getServiceName());\n  }\n\n  @Test\n  public void convertsSystemServiceStoppedEvent() {\n    SystemServiceStoppedEvent event = new SystemServiceStoppedEvent(\"service1\");\n\n    SystemServiceEventDto dto = DtoConverter.asDto(event);\n\n    assertEquals(dto.getType(), EventType.SERVICE_STOPPED);\n    assertEquals(dto.getService(), event.getServiceName());\n  }\n\n  @Test\n  public void convertsSystemServiceItemStoppedEvent() {\n    SystemServiceItemStoppedEvent event =\n        new SystemServiceItemStoppedEvent(\"service1\", \"workspace1\", 3, 5);\n\n    SystemServiceItemStoppedEventDto dto = DtoConverter.asDto(event);\n\n    assertEquals(dto.getType(), EventType.SERVICE_ITEM_STOPPED);\n    assertEquals(dto.getService(), event.getServiceName());\n    assertEquals(dto.getItem(), event.getItem());\n    assertEquals(dto.getCurrent(), event.getCurrent());\n    assertEquals(dto.getTotal(), event.getTotal());\n  }\n\n  @Test\n  public void allEventTypesAreHandled() {\n    EnumSet<EventType> handled =\n        EnumSet.of(\n            EventType.STATUS_CHANGED,\n            EventType.STOPPING_SERVICE,\n            EventType.SUSPENDING_SERVICE,\n            EventType.SERVICE_ITEM_STOPPED,\n            EventType.SERVICE_ITEM_SUSPENDED,\n            EventType.SERVICE_SUSPENDED,\n            EventType.SERVICE_STOPPED);\n    assertEquals(handled, EnumSet.allOf(EventType.class));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/test/java/org/eclipse/che/api/system/server/JvmServiceTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport static io.restassured.RestAssured.expect;\nimport static org.testng.Assert.*;\n\nimport io.restassured.response.Response;\nimport jakarta.ws.rs.core.MediaType;\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport org.eclipse.che.commons.lang.ZipUtils;\nimport org.everrest.assured.EverrestJetty;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(EverrestJetty.class)\npublic class JvmServiceTest {\n\n  JvmService service = new JvmService(new JvmManager());\n\n  @Test\n  public void testThreadDump() {\n    final Response response =\n        expect().statusCode(200).contentType(MediaType.TEXT_PLAIN).when().get(\"/jvm/dump/thread\");\n    assertTrue(response.body().asString().contains(\"Dump of\"));\n    assertTrue(response.body().asString().contains(\"\\\"main\\\" prio=\"));\n    assertTrue(response.body().asString().contains(\"\\\"main\\\" prio=\"));\n    assertTrue(response.body().asString().contains(\"Non-daemon threads\"));\n    assertTrue(response.body().asString().contains(\"Blocked threads\"));\n  }\n\n  @Test\n  public void testHeapDump() throws IOException {\n    final Response response =\n        expect().statusCode(200).contentType(\"application/zip\").when().get(\"/jvm/dump/heap\");\n\n    byte[] array = response.asByteArray();\n    File tmp = File.createTempFile(\"test\", \"zip\");\n    tmp.deleteOnExit();\n    Files.write(tmp.toPath(), array);\n    assertTrue(ZipUtils.isZipFile(tmp));\n    assertTrue(array.length > 1000);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/test/java/org/eclipse/che/api/system/server/SystemManagerTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport static org.eclipse.che.api.system.shared.SystemStatus.PREPARING_TO_SHUTDOWN;\nimport static org.eclipse.che.api.system.shared.SystemStatus.READY_TO_SHUTDOWN;\nimport static org.eclipse.che.api.system.shared.SystemStatus.RUNNING;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.mockito.Mockito.timeout;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.Iterator;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.system.shared.dto.SystemStatusChangedEventDto;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.Mock;\nimport org.mockito.MockitoAnnotations;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link SystemManager}.\n *\n * @author Yevhenii Voevodin\n */\n@Listeners(MockitoTestNGListener.class)\npublic class SystemManagerTest {\n\n  @Mock private ServiceTerminator terminator;\n\n  @Mock private EventService eventService;\n\n  @Captor private ArgumentCaptor<SystemStatusChangedEventDto> eventsCaptor;\n\n  private SystemManager systemManager;\n\n  @BeforeMethod\n  public void init() {\n    MockitoAnnotations.initMocks(this);\n    systemManager = new SystemManager(terminator, eventService);\n  }\n\n  @Test\n  public void isRunningByDefault() {\n    assertEquals(systemManager.getSystemStatus(), RUNNING);\n  }\n\n  @Test\n  public void servicesAreSuspended() throws Exception {\n    systemManager.suspendServices();\n\n    verifySuspendCompleted();\n  }\n\n  @Test\n  public void servicesAreStopped() throws Exception {\n    systemManager.stopServices();\n\n    verifyShutdownCompleted();\n  }\n\n  @Test(expectedExceptions = ConflictException.class)\n  public void exceptionIsThrownWhenStoppingServicesTwice() throws Exception {\n    systemManager.stopServices();\n    systemManager.stopServices();\n  }\n\n  @Test\n  public void shutdownDoesNotFailIfServicesAreAlreadyStopped() throws Exception {\n    systemManager.stopServices();\n    systemManager.shutdown();\n\n    verifyShutdownCompleted();\n  }\n\n  @Test\n  public void shutdownStopsServicesIfNotStopped() throws Exception {\n    systemManager.shutdown();\n\n    verifySuspendCompleted();\n  }\n\n  private void verifyShutdownCompleted() throws InterruptedException {\n    verify(terminator, timeout(2000)).terminateAll();\n    verifyEvents();\n  }\n\n  private void verifySuspendCompleted() throws InterruptedException {\n    verify(terminator, timeout(2000)).suspendAll();\n    verifyEvents();\n  }\n\n  private void verifyEvents() {\n    verify(eventService, times(2)).publish(eventsCaptor.capture());\n    Iterator<SystemStatusChangedEventDto> eventsIt = eventsCaptor.getAllValues().iterator();\n    assertEquals(\n        eventsIt.next(),\n        newDto(SystemStatusChangedEventDto.class)\n            .withPrevStatus(RUNNING)\n            .withStatus(PREPARING_TO_SHUTDOWN));\n    assertEquals(\n        eventsIt.next(),\n        newDto(SystemStatusChangedEventDto.class)\n            .withPrevStatus(PREPARING_TO_SHUTDOWN)\n            .withStatus(READY_TO_SHUTDOWN));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/test/java/org/eclipse/che/api/system/server/SystemTerminatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.server;\n\nimport static java.util.stream.Collectors.toSet;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableSet;\nimport java.util.Collections;\nimport java.util.Set;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.system.shared.event.service.StoppingSystemServiceEvent;\nimport org.eclipse.che.api.system.shared.event.service.SuspendingSystemServiceEvent;\nimport org.eclipse.che.api.system.shared.event.service.SystemServiceStoppedEvent;\nimport org.eclipse.che.api.system.shared.event.service.SystemServiceSuspendedEvent;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link ServiceTerminator}.\n *\n * @author Yevhenii Voevodin\n */\n@Listeners(MockitoTestNGListener.class)\npublic class SystemTerminatorTest {\n\n  @Mock private EventService eventService;\n  @Mock private ServiceTermination termination1;\n  @Mock private ServiceTermination termination2;\n\n  private ServiceTerminator terminator;\n\n  @BeforeMethod\n  public void setUp() {\n    when(termination1.getServiceName()).thenReturn(\"service1\");\n    when(termination2.getServiceName()).thenReturn(\"service2\");\n    terminator = new ServiceTerminator(eventService, ImmutableSet.of(termination1, termination2));\n  }\n\n  @Test\n  public void executesTerminations() throws Exception {\n    terminator.terminateAll();\n\n    verify(termination1).terminate();\n    verify(termination2).terminate();\n    verify(eventService).publish(new StoppingSystemServiceEvent(\"service1\"));\n    verify(eventService).publish(new SystemServiceStoppedEvent(\"service1\"));\n    verify(eventService).publish(new StoppingSystemServiceEvent(\"service2\"));\n    verify(eventService).publish(new SystemServiceStoppedEvent(\"service2\"));\n  }\n\n  @Test\n  public void executesSuspendals() throws Exception {\n    terminator.suspendAll();\n\n    verify(termination1).suspend();\n    verify(termination2).suspend();\n    verify(eventService).publish(new SuspendingSystemServiceEvent(\"service1\"));\n    verify(eventService).publish(new SystemServiceSuspendedEvent(\"service1\"));\n    verify(eventService).publish(new SuspendingSystemServiceEvent(\"service2\"));\n    verify(eventService).publish(new SystemServiceSuspendedEvent(\"service2\"));\n  }\n\n  @Test\n  public void executesTermitationsWhenSuspendalsNotSupported() throws Exception {\n\n    doThrow(UnsupportedOperationException.class).when(termination1).suspend();\n    terminator.suspendAll();\n\n    verify(termination1).terminate();\n    verify(termination2).suspend();\n\n    verify(eventService).publish(new SuspendingSystemServiceEvent(\"service1\"));\n    verify(eventService).publish(new StoppingSystemServiceEvent(\"service1\"));\n    verify(eventService).publish(new SystemServiceStoppedEvent(\"service1\"));\n    verify(eventService).publish(new SuspendingSystemServiceEvent(\"service2\"));\n    verify(eventService).publish(new SystemServiceSuspendedEvent(\"service2\"));\n  }\n\n  @Test(\n      expectedExceptions = InterruptedException.class,\n      expectedExceptionsMessageRegExp = \"interrupt!\")\n  public void stopsExecutingTerminationIfOneIsInterrupted() throws Exception {\n    doThrow(new InterruptedException(\"interrupt!\")).when(termination1).terminate();\n\n    terminator.terminateAll();\n  }\n\n  @Test(dataProvider = \"dependableTerminations\")\n  public void shouldOrderTerminationsByDependency(\n      Set<ServiceTermination> terminations, Set<String> expectedOrder) throws Exception {\n    ServiceTerminator localTerminator = spy(new ServiceTerminator(eventService, terminations));\n    localTerminator.suspendAll();\n    ArgumentCaptor<ServiceTermination> captor = ArgumentCaptor.forClass(ServiceTermination.class);\n    verify(localTerminator, times(terminations.size())).doTerminate(captor.capture());\n    assertEquals(\n        captor.getAllValues().stream().map(ServiceTermination::getServiceName).collect(toSet()),\n        expectedOrder);\n  }\n\n  @Test(\n      dataProvider = \"loopableTerminations\",\n      expectedExceptions = RuntimeException.class,\n      expectedExceptionsMessageRegExp = \"Circular dependency found between terminations \\\\[B, D\\\\]\")\n  public void shouldFailOnCyclicDependency(Set<ServiceTermination> terminations) throws Exception {\n    new ServiceTerminator(eventService, terminations);\n  }\n\n  @Test(\n      dataProvider = \"sameNameTerminations\",\n      expectedExceptions = RuntimeException.class,\n      expectedExceptionsMessageRegExp = \"Duplicate termination found with service name .+\")\n  public void shouldFailOnTerminationsWithSameServiceName(Set<ServiceTermination> terminations)\n      throws Exception {\n    new ServiceTerminator(eventService, terminations);\n  }\n\n  @Test(\n      dataProvider = \"wrongDependencyTerminations\",\n      expectedExceptions = RuntimeException.class,\n      expectedExceptionsMessageRegExp = \"Unknown dependency found in termination .+\")\n  public void shouldFailOnTerminationsWithUnexistingDeps(Set<ServiceTermination> terminations)\n      throws Exception {\n    new ServiceTerminator(eventService, terminations);\n  }\n\n  @DataProvider(name = \"dependableTerminations\")\n  public Object[][] dependableTerminations() {\n    return new Object[][] {\n      {\n        ImmutableSet.of(\n            getServiceTerminationWithDependency(\"A\", Collections.emptySet()),\n            getServiceTerminationWithDependency(\"B\", ImmutableSet.of(\"C\", \"D\", \"G\")),\n            getServiceTerminationWithDependency(\"C\", Collections.emptySet()),\n            getServiceTerminationWithDependency(\"D\", ImmutableSet.of(\"C\")),\n            getServiceTerminationWithDependency(\"E\", ImmutableSet.of(\"B\")),\n            getServiceTerminationWithDependency(\"F\", ImmutableSet.of(\"C\")),\n            getServiceTerminationWithDependency(\"G\", ImmutableSet.of(\"C\"))),\n        ImmutableSet.of(\"A\", \"C\", \"D\", \"F\", \"G\", \"B\", \"E\")\n      }\n    };\n  }\n\n  @DataProvider(name = \"loopableTerminations\")\n  public Object[][] loopableTerminations() {\n    return new Object[][] {\n      {\n        ImmutableSet.of(\n            getServiceTerminationWithDependency(\"A\", Collections.emptySet()),\n            getServiceTerminationWithDependency(\"B\", ImmutableSet.of(\"C\", \"D\")),\n            getServiceTerminationWithDependency(\"C\", Collections.emptySet()),\n            getServiceTerminationWithDependency(\"D\", ImmutableSet.of(\"B\")) // loop here\n            )\n      }\n    };\n  }\n\n  @DataProvider(name = \"sameNameTerminations\")\n  public Object[][] sameNameTerminations() {\n    return new Object[][] {\n      {\n        ImmutableSet.of(\n            getServiceTerminationWithDependency(\"A\", Collections.emptySet()),\n            getServiceTerminationWithDependency(\"C\", Collections.emptySet()),\n            getServiceTerminationWithDependency(\"C\", Collections.emptySet()))\n      }\n    };\n  }\n\n  @DataProvider(name = \"wrongDependencyTerminations\")\n  public Object[][] wrongDependencyTerminations() {\n    return new Object[][] {\n      {\n        ImmutableSet.of(\n            getServiceTerminationWithDependency(\"A\", Collections.emptySet()),\n            // no such termination\n            getServiceTerminationWithDependency(\"C\", ImmutableSet.of(\"B\")))\n      }\n    };\n  }\n\n  private ServiceTermination getServiceTerminationWithDependency(\n      String name, Set<String> depencencies) {\n    return new ServiceTermination() {\n      @Override\n      public void terminate() throws InterruptedException {}\n\n      @Override\n      public String getServiceName() {\n        return name;\n      }\n\n      @Override\n      public Set<String> getDependencies() {\n        return depencencies;\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n    <root level=\"ERROR\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-system-shared</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: System Shared</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-resource</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <id>generate-server-dto</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                        <configuration>\n                            <dtoPackages>\n                                <package>org.eclipse.che.api.system.shared.dto</package>\n                            </dtoPackages>\n                            <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                            <genClassName>org.eclipse.che.api.system.shared.dto.DtoServerImpls</genClassName>\n                            <impl>server</impl>\n                        </configuration>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-system-shared</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/SystemStatus.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared;\n\n/**\n * Defines system status.\n *\n * @author Yevhenii Voevodin\n */\npublic enum SystemStatus {\n\n  /** The system is running, which means that it wasn't stopped via system API. */\n  RUNNING,\n\n  /** The system stops corresponding services and will be eventually {@link #READY_TO_SHUTDOWN}. */\n  PREPARING_TO_SHUTDOWN,\n\n  /** All the necessary services are stopped, system is ready to be shut down. */\n  READY_TO_SHUTDOWN\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/dto/SystemEventDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.dto;\n\nimport org.eclipse.che.api.core.notification.EventOrigin;\nimport org.eclipse.che.api.system.shared.event.EventType;\nimport org.eclipse.che.api.system.shared.event.SystemEvent;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * DTO for {@link SystemEvent}.\n *\n * @author Yevhenii Voevodin\n */\n@DTO\n@EventOrigin(\"system\")\npublic interface SystemEventDto extends SystemEvent {\n\n  void setType(EventType type);\n\n  SystemEventDto withType(EventType type);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/dto/SystemServiceEventDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.dto;\n\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * DTO for system service events.\n *\n * @author Yevhenii Voevodin\n */\n@DTO\npublic interface SystemServiceEventDto extends SystemEventDto {\n\n  /** Returns the name of the service described by this event. */\n  String getService();\n\n  void setService(String service);\n\n  SystemServiceEventDto withService(String service);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/dto/SystemServiceItemStoppedEventDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.dto;\n\nimport org.eclipse.che.api.system.shared.event.EventType;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * See {@link EventType#SERVICE_ITEM_STOPPED} for details.\n *\n * @author Yevhenii Voevodin\n */\n@DTO\npublic interface SystemServiceItemStoppedEventDto extends SystemServiceEventDto {\n\n  /** Returns an item for which this event is published(like workspace id). */\n  String getItem();\n\n  void setItem(String item);\n\n  SystemServiceItemStoppedEventDto withItem(String item);\n\n  /**\n   * Returns an amount of items currently stopped, it's either present with {@link #getTotal()} or\n   * missing at all(null is returned).\n   */\n  @Nullable\n  Integer getCurrent();\n\n  void setCurrent(Integer current);\n\n  SystemServiceItemStoppedEventDto withCurrent(Integer current);\n\n  /**\n   * Returns total count of items which had not been stopped before service shutdown was called.\n   * It's either present with {@link #getCurrent()} or missing at all(null is returned).\n   */\n  @Nullable\n  Integer getTotal();\n\n  void setTotal(Integer total);\n\n  SystemServiceItemStoppedEventDto withTotal(Integer total);\n\n  SystemServiceItemStoppedEventDto withService(String service);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/dto/SystemStateDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.dto;\n\nimport java.util.List;\nimport org.eclipse.che.api.core.rest.shared.dto.Hyperlinks;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.api.system.shared.SystemStatus;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describes current system state.\n *\n * @author Yevhenii Voevodin\n */\n@DTO\npublic interface SystemStateDto extends Hyperlinks {\n\n  /** Returns current system status. */\n  SystemStatus getStatus();\n\n  void setStatus(SystemStatus status);\n\n  SystemStateDto withStatus(SystemStatus status);\n\n  SystemStateDto withLinks(List<Link> links);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/dto/SystemStatusChangedEventDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.dto;\n\nimport org.eclipse.che.api.core.notification.EventOrigin;\nimport org.eclipse.che.api.system.shared.SystemStatus;\nimport org.eclipse.che.api.system.shared.event.SystemStatusChangedEvent;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * DTO for {@link SystemStatusChangedEvent}.\n *\n * @author Yevhenii Voevodin\n */\n@DTO\n@EventOrigin(\"system\")\npublic interface SystemStatusChangedEventDto extends SystemEventDto {\n\n  /** Returns new status of the system. */\n  SystemStatus getStatus();\n\n  void setStatus(SystemStatus status);\n\n  SystemStatusChangedEventDto withStatus(SystemStatus status);\n\n  /** Returns the previous status of the system. */\n  SystemStatus getPrevStatus();\n\n  void setPrevStatus(SystemStatus prevStatus);\n\n  SystemStatusChangedEventDto withPrevStatus(SystemStatus prevStatus);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/event/EventType.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.event;\n\n/**\n * Defines set of system event types.\n *\n * @author Yevhenii Voevodin\n */\npublic enum EventType {\n\n  /** Published when system status is changed. */\n  STATUS_CHANGED,\n\n  /**\n   * Published when system is starting shutting down a service. This is the first event published\n   * for a certain service.\n   *\n   * <pre>\n   *     STOPPING_SERVICE -> (0..N)SERVICE_ITEM_STOPPED -> SERVICE_STOPPED\n   * </pre>\n   */\n  STOPPING_SERVICE,\n\n  /**\n   * Published when system is starting to suspend a service. This is the first event published for a\n   * certain service.\n   *\n   * <pre>\n   *     SUSPENDING_SERVICE -> (0..N)SERVICE_ITEM_SUSPENDED -> SERVICE_SUSPENDED\n   * </pre>\n   */\n  SUSPENDING_SERVICE,\n\n  /**\n   * Published after service item is stopped. Events of such type are published between {@link\n   * #STOPPING_SERVICE} and {@link #SERVICE_STOPPED} events.\n   */\n  SERVICE_ITEM_STOPPED,\n\n  /**\n   * Published after service item is suspended. Events of such type are published between {@link\n   * #SUSPENDING_SERVICE} and {@link #SERVICE_SUSPENDED} events.\n   */\n  SERVICE_ITEM_SUSPENDED,\n\n  /**\n   * Published when shutting down of a service is finished. The last event in the chain for a\n   * certain service.\n   */\n  SERVICE_STOPPED,\n\n  /**\n   * Published when suspending a service is finished. The last event in the chain for a certain\n   * service.\n   */\n  SERVICE_SUSPENDED\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/event/SystemEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.event;\n\n/**\n * The base interface for system events.\n *\n * @author Yevhenii Voevodin\n */\npublic interface SystemEvent {\n\n  /** Returns type of this event. */\n  EventType getType();\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/event/SystemStatusChangedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.event;\n\nimport java.util.Objects;\nimport org.eclipse.che.api.system.shared.SystemStatus;\n\n/**\n * Describes system status changes.\n *\n * @author Yevhenii Voevodin\n */\npublic class SystemStatusChangedEvent implements SystemEvent {\n\n  private final SystemStatus status;\n  private final SystemStatus prevStatus;\n\n  public SystemStatusChangedEvent(SystemStatus prevStatus, SystemStatus status) {\n    this.status = status;\n    this.prevStatus = prevStatus;\n  }\n\n  @Override\n  public EventType getType() {\n    return EventType.STATUS_CHANGED;\n  }\n\n  public SystemStatus getStatus() {\n    return status;\n  }\n\n  public SystemStatus getPrevStatus() {\n    return prevStatus;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof SystemStatusChangedEvent)) {\n      return false;\n    }\n    final SystemStatusChangedEvent that = (SystemStatusChangedEvent) obj;\n    return Objects.equals(status, that.status) && Objects.equals(prevStatus, that.prevStatus);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(status);\n    hash = 31 * hash + Objects.hashCode(prevStatus);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"SystemStatusChangedEvent{\" + \"status=\" + status + \", prevStatus=\" + prevStatus + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/event/service/StoppingSystemServiceEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.event.service;\n\nimport org.eclipse.che.api.system.shared.event.EventType;\n\n/**\n * See {@link EventType#STOPPING_SERVICE} description.\n *\n * @author Yevhenii Voevodin\n */\npublic class StoppingSystemServiceEvent extends SystemServiceEvent {\n\n  public StoppingSystemServiceEvent(String serviceName) {\n    super(serviceName);\n  }\n\n  @Override\n  public EventType getType() {\n    return EventType.STOPPING_SERVICE;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/event/service/SuspendingSystemServiceEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.event.service;\n\nimport org.eclipse.che.api.system.shared.event.EventType;\n\n/**\n * See {@link EventType#SUSPENDING_SERVICE} description.\n *\n * @author Max Shaposhnyk\n */\npublic class SuspendingSystemServiceEvent extends SystemServiceEvent {\n\n  public SuspendingSystemServiceEvent(String serviceName) {\n    super(serviceName);\n  }\n\n  @Override\n  public EventType getType() {\n    return EventType.SUSPENDING_SERVICE;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/event/service/SystemServiceEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.event.service;\n\nimport java.util.Objects;\nimport org.eclipse.che.api.system.shared.event.SystemEvent;\n\n/**\n * The base class for system service events.\n *\n * @author Yevhenii Voevodin\n */\npublic abstract class SystemServiceEvent implements SystemEvent {\n\n  protected final String serviceName;\n\n  protected SystemServiceEvent(String serviceName) {\n    this.serviceName = Objects.requireNonNull(serviceName, \"Service name required\");\n  }\n\n  public String getServiceName() {\n    return serviceName;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof SystemServiceEvent)) {\n      return false;\n    }\n    final SystemServiceEvent that = (SystemServiceEvent) obj;\n    return Objects.equals(getType(), that.getType())\n        && Objects.equals(serviceName, that.serviceName);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 17;\n    hash = 31 * hash + Objects.hashCode(getType());\n    hash = 31 * hash + Objects.hashCode(serviceName);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return getClass().getSimpleName()\n        + \"{eventType='\"\n        + getType()\n        + \"', serviceName=\"\n        + serviceName\n        + \"'}\";\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/event/service/SystemServiceItemStoppedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.event.service;\n\nimport java.util.Objects;\nimport org.eclipse.che.api.system.shared.event.EventType;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * See {@link EventType#SERVICE_ITEM_STOPPED} description.\n *\n * @author Yevhenii Voevodin\n */\npublic class SystemServiceItemStoppedEvent extends SystemServiceEvent {\n\n  private final String item;\n\n  private Integer total;\n  private Integer current;\n\n  public SystemServiceItemStoppedEvent(String serviceName, String item) {\n    super(serviceName);\n    this.item = Objects.requireNonNull(item, \"Item required\");\n  }\n\n  public SystemServiceItemStoppedEvent(\n      String serviceName, String item, @Nullable Integer current, @Nullable Integer total) {\n    this(serviceName, item);\n    this.current = current;\n    this.total = total;\n  }\n\n  @Override\n  public EventType getType() {\n    return EventType.SERVICE_ITEM_STOPPED;\n  }\n\n  public String getItem() {\n    return item;\n  }\n\n  @Nullable\n  public Integer getTotal() {\n    return total;\n  }\n\n  @Nullable\n  public Integer getCurrent() {\n    return current;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof SystemServiceItemStoppedEvent)) {\n      return false;\n    }\n    final SystemServiceItemStoppedEvent that = (SystemServiceItemStoppedEvent) obj;\n    return super.equals(that)\n        && item.equals(that.item)\n        && Objects.equals(total, that.total)\n        && Objects.equals(current, that.current);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + super.hashCode();\n    hash = 31 * hash + item.hashCode();\n    hash = 31 * hash + Objects.hashCode(total);\n    hash = 31 * hash + Objects.hashCode(current);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"SystemServiceItemStoppedEvent{\"\n        + \"item='\"\n        + item\n        + '\\''\n        + \", total=\"\n        + total\n        + \", current=\"\n        + current\n        + \", eventType='\"\n        + getType()\n        + '\\''\n        + \", service='\"\n        + getServiceName()\n        + \"\\'}\";\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/event/service/SystemServiceItemSuspendedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.event.service;\n\nimport java.util.Objects;\nimport org.eclipse.che.api.system.shared.event.EventType;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * See {@link EventType#SERVICE_ITEM_SUSPENDED} description.\n *\n * @author Max Shaposhnyk\n */\npublic class SystemServiceItemSuspendedEvent extends SystemServiceEvent {\n\n  private final String item;\n\n  private Integer total;\n  private Integer current;\n\n  public SystemServiceItemSuspendedEvent(String serviceName, String item) {\n    super(serviceName);\n    this.item = Objects.requireNonNull(item, \"Item required\");\n  }\n\n  public SystemServiceItemSuspendedEvent(\n      String serviceName, String item, @Nullable Integer current, @Nullable Integer total) {\n    this(serviceName, item);\n    this.current = current;\n    this.total = total;\n  }\n\n  @Override\n  public EventType getType() {\n    return EventType.SERVICE_ITEM_SUSPENDED;\n  }\n\n  public String getItem() {\n    return item;\n  }\n\n  @Nullable\n  public Integer getTotal() {\n    return total;\n  }\n\n  @Nullable\n  public Integer getCurrent() {\n    return current;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof SystemServiceItemSuspendedEvent)) {\n      return false;\n    }\n    final SystemServiceItemSuspendedEvent that = (SystemServiceItemSuspendedEvent) obj;\n    return super.equals(that)\n        && item.equals(that.item)\n        && Objects.equals(total, that.total)\n        && Objects.equals(current, that.current);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + super.hashCode();\n    hash = 31 * hash + item.hashCode();\n    hash = 31 * hash + Objects.hashCode(total);\n    hash = 31 * hash + Objects.hashCode(current);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"SystemServiceItemSuspendedEvent{\"\n        + \"item='\"\n        + item\n        + '\\''\n        + \", total=\"\n        + total\n        + \", current=\"\n        + current\n        + \", eventType='\"\n        + getType()\n        + '\\''\n        + \", service='\"\n        + getServiceName()\n        + \"\\'}\";\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/event/service/SystemServiceStoppedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.event.service;\n\nimport org.eclipse.che.api.system.shared.event.EventType;\n\n/**\n * See {@link EventType#SERVICE_STOPPED} description.\n *\n * @author Yevhenii Voevodin\n */\npublic class SystemServiceStoppedEvent extends SystemServiceEvent {\n\n  public SystemServiceStoppedEvent(String serviceName) {\n    super(serviceName);\n  }\n\n  @Override\n  public EventType getType() {\n    return EventType.SERVICE_STOPPED;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-system-shared/src/main/java/org/eclipse/che/api/system/shared/event/service/SystemServiceSuspendedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.system.shared.event.service;\n\nimport org.eclipse.che.api.system.shared.event.EventType;\n\n/**\n * See {@link EventType#SERVICE_SUSPENDED} description.\n *\n * @author Max Shaposhnyk\n */\npublic class SystemServiceSuspendedEvent extends SystemServiceEvent {\n\n  public SystemServiceSuspendedEvent(String serviceName) {\n    super(serviceName);\n  }\n\n  @Override\n  public EventType getType() {\n    return EventType.SERVICE_SUSPENDED;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-user</artifactId>\n    <name>Che Core :: API :: User</name>\n    <properties>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.swagger.core.v3</groupId>\n            <artifactId>swagger-annotations-jakarta</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.annotation</groupId>\n            <artifactId>jakarta.annotation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-account</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-user-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-persist</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>jakarta.persistence</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-inject</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-json</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-sql-schema</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.jpa</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.flywaydb</groupId>\n            <artifactId>flyway-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Mock testing -->\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Mock testing of REST services -->\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Test dependencies -->\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <!-- Create the test jar -->\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>test-jar</goal>\n                        </goals>\n                        <configuration>\n                            <includes>\n                                <include>**/spi/tck/*.*</include>\n                            </includes>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/AppStatesPreferenceCleaner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonObject;\nimport com.google.gson.JsonParser;\nimport com.google.inject.Inject;\nimport com.google.inject.Singleton;\nimport jakarta.annotation.PostConstruct;\nimport java.util.Map;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.core.model.workspace.Workspace;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.core.notification.EventSubscriber;\nimport org.eclipse.che.api.workspace.shared.event.WorkspaceRemovedEvent;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/** Handler for clean up app state preference when workspace is removed. */\n@Singleton\npublic class AppStatesPreferenceCleaner implements EventSubscriber<WorkspaceRemovedEvent> {\n  private static final Logger LOG = LoggerFactory.getLogger(AppStatesPreferenceCleaner.class);\n\n  /** The name of the property for the mappings in user preferences. */\n  public static final String APP_STATES_PREFERENCE_PROPERTY = \"IdeAppStates\";\n\n  private JsonParser jsonParser;\n  private EventService eventService;\n  private UserManager userManager;\n  private PreferenceManager preferenceManager;\n\n  @Inject\n  public AppStatesPreferenceCleaner(\n      JsonParser jsonParser,\n      EventService eventService,\n      UserManager userManager,\n      PreferenceManager preferenceManager) {\n    this.jsonParser = jsonParser;\n    this.eventService = eventService;\n    this.userManager = userManager;\n    this.preferenceManager = preferenceManager;\n  }\n\n  @PostConstruct\n  public void subscribe() {\n    eventService.subscribe(this);\n  }\n\n  @Override\n  public void onEvent(WorkspaceRemovedEvent workspaceRemovedEvent) {\n    try {\n      Workspace workspace = workspaceRemovedEvent.getWorkspace();\n      User user = userManager.getByName(workspace.getNamespace());\n      if (user == null) {\n        return;\n      }\n\n      String userId = user.getId();\n      Map<String, String> preferences = preferenceManager.find(userId);\n      String appStates = preferences.get(APP_STATES_PREFERENCE_PROPERTY);\n      if (appStates == null) {\n        return;\n      }\n\n      JsonObject workspaces = jsonParser.parse(appStates).getAsJsonObject();\n      JsonElement removedWorkspacePreferences = workspaces.remove(workspace.getId());\n      if (removedWorkspacePreferences != null) {\n        preferences.put(APP_STATES_PREFERENCE_PROPERTY, workspaces.toString());\n        preferenceManager.save(userId, preferences);\n      }\n    } catch (NotFoundException | ServerException e) {\n      Workspace workspace = workspaceRemovedEvent.getWorkspace();\n      LOG.error(\n          \"Unable to clean up preferences for owner of the workspace {} with namespace {} because of '{}'\",\n          workspace.getId(),\n          workspace.getNamespace(),\n          e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/CheUserCreator.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport static java.util.Collections.emptyList;\n\nimport jakarta.annotation.PostConstruct;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.account.api.AccountManager;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\n\n/**\n * Creates 'che' default user.\n *\n * @author Anton Korneta\n */\n@Deprecated\n@Singleton\npublic class CheUserCreator {\n\n  @Inject private UserManager userManager;\n\n  @Inject private AccountManager accountManager;\n\n  @PostConstruct\n  public void createCheUser() throws ServerException {\n    try {\n      userManager.getById(\"che\");\n    } catch (NotFoundException ex) {\n      try {\n        final UserImpl cheUser =\n            new UserImpl(\"che\", \"che@eclipse.org\", \"che\", \"secret\", emptyList());\n        userManager.create(cheUser, false);\n      } catch (ConflictException ignore) {\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/Constants.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\n/**\n * Constants for User/Profile/Preferences API.\n *\n * @author Yevhenii Voevodin\n * @author Max Shaposhnik\n */\npublic final class Constants {\n\n  /** Profile link relationships. */\n  public static final String LINK_REL_CURRENT_PROFILE = \"current_profile\";\n\n  public static final String LINK_REL_CURRENT_PROFILE_ATTRIBUTES = \"current_profile.attributes\";\n  public static final String LINK_REL_PROFILE = \"profile\";\n  public static final String LINK_REL_PROFILE_ATTRIBUTES = \"profile.attributes\";\n\n  /** User links relationships. */\n  public static final String LINK_REL_USER = \"user\";\n\n  public static final String LINK_REL_CURRENT_USER = \"current_user\";\n  public static final String LINK_REL_CURRENT_USER_PASSWORD = \"current_user.password\";\n  public static final String LINK_REL_CURRENT_USER_SETTINGS = \"current_user.settings\";\n\n  /** Preferences links relationships. */\n  public static final String LINK_REL_PREFERENCES = \"preferences\";\n\n  public static final String LINK_REL_SELF = \"self\";\n\n  public static final int ID_LENGTH = 16;\n  public static final int PASSWORD_LENGTH = 10;\n\n  private Constants() {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/DtoConverter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.user.shared.dto.UserDto;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * Helps to convert to/from DTOs related to user.\n *\n * @author Anatoliy Bazko\n */\npublic final class DtoConverter {\n\n  /** Converts {@link User} to {@link UserDto}. */\n  public static UserDto asDto(User user) {\n    return DtoFactory.getInstance()\n        .createDto(UserDto.class)\n        .withId(user.getId())\n        .withEmail(user.getEmail())\n        .withName(user.getName())\n        .withAliases(user.getAliases());\n  }\n\n  private DtoConverter() {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/NotImplementedTokenValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.model.user.User;\n\n@Singleton\npublic class NotImplementedTokenValidator implements TokenValidator {\n\n  @Override\n  public User validateToken(String token) throws ConflictException {\n    throw new ConflictException(\"Token validation do not implemented\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/PreferenceManager.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport static java.util.Objects.requireNonNull;\n\nimport com.google.common.util.concurrent.Striped;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.locks.Lock;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.user.server.spi.PreferenceDao;\n\n/**\n * Preferences manager layer, simplifies preferences service by taking all the business logic out\n * from the service and making that logic easily reusable throughout the system.\n *\n * <p>The manager doesn't perform any bean validations and it is expected that all the incoming\n * objects are valid, nevertheless this exactly the right place for performing business validations.\n *\n * @author Yevhenii Voevodin\n */\n@Deprecated\n@Singleton\npublic class PreferenceManager {\n\n  private static final Striped<Lock> UPDATE_REENTRANT_LOCKS = Striped.lazyWeakLock(32);\n\n  @Inject private PreferenceDao preferenceDao;\n\n  /**\n   * Associates the given {@code preferences} with the given {@code userId}.\n   *\n   * <p>Note that this method will override all the existing properties for the user with id {@code\n   * userId}.\n   *\n   * @param userId the user id whom the {@code preferences} belong to\n   * @param preferences the preferences to associate with the {@code userId}\n   * @throws NullPointerException when either {@code userId} or {@code preferences} is null\n   * @throws ServerException when any error occurs\n   */\n  public void save(String userId, Map<String, String> preferences) throws ServerException {\n    requireNonNull(userId, \"Required non-null user id\");\n    requireNonNull(preferences, \"Required non-null preferences\");\n    preferenceDao.setPreferences(userId, preferences);\n  }\n\n  /**\n   * Updates the preferences of the user by merging given {@code preferences} with the existing\n   * preferences. If user doesn't have any preferences then the given {@code preferences} will be\n   * associated with the user.\n   *\n   * @param userId the user whose preferences should be updated\n   * @param preferences preferences update\n   * @return all the user's preferences including the update\n   * @throws NullPointerException when either {@code userId} or {@code preferences} is null\n   * @throws ServerException when any error occurs\n   */\n  public Map<String, String> update(String userId, Map<String, String> preferences)\n      throws ServerException {\n    requireNonNull(userId, \"Required non-null user id\");\n    requireNonNull(preferences, \"Required non-null preferences\");\n    // Holding reference to prevent garbage collection\n    // this reentrantLock helps to avoid race-conditions when parallel updates are applied\n    final Lock reentrantLock = UPDATE_REENTRANT_LOCKS.get(userId);\n    reentrantLock.lock();\n    try {\n      final Map<String, String> found = preferenceDao.getPreferences(userId);\n      found.putAll(preferences);\n      preferenceDao.setPreferences(userId, found);\n      return found;\n    } finally {\n      reentrantLock.unlock();\n    }\n  }\n\n  /**\n   * Finds user's preferences.\n   *\n   * @param userId user id to find preferences\n   * @return found preferences or empty map, if there are no preferences related to user\n   * @throws NullPointerException when {@code userId} is null\n   * @throws ServerException when any error occurs\n   */\n  public Map<String, String> find(String userId) throws ServerException {\n    requireNonNull(userId, \"Required non-null user id\");\n    return Collections.emptyMap();\n  }\n\n  /**\n   * Finds user's preferences.\n   *\n   * @param userId user id to find preferences\n   * @param keyFilter regex which is used to filter preferences by keys, so result contains only the\n   *     user's preferences that match {@code keyFilter} regex\n   * @return found preferences filtered by {@code keyFilter} or an empty map if there are no\n   *     preferences related to user\n   * @throws NullPointerException when {@code userId} is null\n   * @throws ServerException when any error occurs\n   */\n  public Map<String, String> find(String userId, String keyFilter) throws ServerException {\n    requireNonNull(userId, \"Required non-null user id\");\n    return Collections.emptyMap();\n  }\n\n  /**\n   * Removes(clears) user's preferences.\n   *\n   * @param userId the id of the user to remove preferences\n   * @throws NullPointerException when {@code userId} is null\n   * @throws ServerException when any error occurs\n   */\n  public void remove(String userId) throws ServerException {\n    requireNonNull(userId, \"Required non-null user id\");\n    preferenceDao.remove(userId);\n  }\n\n  /**\n   * Removes the preferences with the given {@code names}.\n   *\n   * @param userId the id of the user to remove preferences\n   * @param names the names to remove\n   * @throws NullPointerException when either {@code userId} or {@code names} is null\n   * @throws ServerException when any error occurs\n   */\n  public void remove(String userId, List<String> names) throws ServerException {\n    requireNonNull(userId, \"Required non-null user id\");\n    requireNonNull(names, \"Required non-null preference names\");\n    // Holding reference to prevent garbage collection\n    // this reentrantLock helps to avoid race-conditions when parallel updates are applied\n    final Lock reentrantLock = UPDATE_REENTRANT_LOCKS.get(userId);\n    reentrantLock.lock();\n    try {\n      final Map<String, String> preferences = preferenceDao.getPreferences(userId);\n      names.forEach(preferences::remove);\n      preferenceDao.setPreferences(userId, preferences);\n    } finally {\n      reentrantLock.unlock();\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/ProfileManager.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport static java.util.Objects.requireNonNull;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.user.Profile;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.user.server.model.impl.ProfileImpl;\nimport org.eclipse.che.api.user.server.spi.ProfileDao;\n\n/**\n * Preferences manager layer, simplifies prefernces service by taking all the business logic out\n * from the service and making that logic easily reusable throughout the system.\n *\n * <p>The manager doesn't perform any bean validations and it is expected that all the incoming\n * objects are valid, nevertheless this exactly the right place for performing business validations.\n *\n * @author Yevhenii Voevodin\n */\n@Singleton\npublic class ProfileManager {\n\n  @Inject private ProfileDao profileDao;\n\n  /**\n   * Finds the profile related to the user with given {@code userId}.\n   *\n   * @param userId the id to search the user's profile\n   * @return found profile\n   * @throws NullPointerException when {@code userId} is null\n   * @throws NotFoundException when there is no profile for the user with the id {@code userId}\n   * @throws ServerException when any other error occurs\n   */\n  public Profile getById(String userId) throws NotFoundException, ServerException {\n    requireNonNull(userId, \"Required non-null user id\");\n    return profileDao.getById(userId);\n  }\n\n  /**\n   * Creates a new user's profile .\n   *\n   * @param profile new profile\n   * @throws NullPointerException when profile is null\n   * @throws ConflictException when profile for the user {@code profile.getUserId()} already exists\n   * @throws ServerException when any other error occurs\n   */\n  public void create(Profile profile) throws ServerException, ConflictException {\n    requireNonNull(profile, \"Required non-null profile\");\n    profileDao.create(new ProfileImpl(profile));\n  }\n\n  /**\n   * Updates current profile using replace strategy.\n   *\n   * <p>Note that {@link Profile#getEmail()} can't be updated using this method as it is mirrored\n   * from the {@link User#getEmail()}.\n   *\n   * @param profile profile update\n   * @throws NullPointerException when {@code profile} is null\n   * @throws NotFoundException when there is no profile for the user with the id {@code\n   *     profile.getUserId()}\n   * @throws ServerException when any other error occurs\n   */\n  public void update(Profile profile) throws NotFoundException, ServerException {\n    requireNonNull(profile, \"Required non-null profile\");\n    profileDao.update(new ProfileImpl(profile));\n  }\n\n  /**\n   * Removes the user's profile.\n   *\n   * <p>Note that this method won't throw any exception when user doesn't have the corresponding\n   * profile.\n   *\n   * @param userId the id of the user, whose profile should be removed\n   * @throws NullPointerException when {@code id} is null\n   * @throws ServerException when any other error occurs\n   */\n  public void remove(String userId) throws ServerException {\n    requireNonNull(userId, \"Required non-null user id\");\n    profileDao.remove(userId);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/TokenValidator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.model.user.User;\n\n/**\n * Validates token.\n *\n * @author Eugene Voevodin\n * @see UserService\n */\npublic interface TokenValidator {\n\n  /**\n   * Validates {@code token}.\n   *\n   * @return user email\n   * @throws ConflictException when token is not valid\n   */\n  User validateToken(String token) throws ConflictException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/UserManager.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport static com.google.common.base.MoreObjects.firstNonNull;\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.util.Collections.emptyList;\nimport static java.util.Objects.requireNonNull;\nimport static org.eclipse.che.api.user.server.Constants.ID_LENGTH;\nimport static org.eclipse.che.api.user.server.Constants.PASSWORD_LENGTH;\nimport static org.eclipse.che.commons.lang.NameGenerator.generate;\n\nimport com.google.common.collect.Sets;\nimport com.google.inject.persist.Transactional;\nimport java.util.Optional;\nimport java.util.Set;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.user.Profile;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.user.server.event.UserCreatedEvent;\nimport org.eclipse.che.api.user.server.event.UserRemovedEvent;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\nimport org.eclipse.che.api.user.server.spi.PreferenceDao;\nimport org.eclipse.che.api.user.server.spi.ProfileDao;\nimport org.eclipse.che.api.user.server.spi.UserDao;\n\n/**\n * Facade for {@link User} and {@link Profile} related operations.\n *\n * @author Max Shaposhnik (mshaposhnik@codenvy.com)\n * @author Yevhenii Voevodin\n * @author Anton Korneta\n */\n@Deprecated\n@Singleton\npublic class UserManager {\n\n  public static final String PERSONAL_ACCOUNT = \"personal\";\n\n  protected final UserDao userDao;\n  protected final ProfileDao profileDao;\n  protected final PreferenceDao preferencesDao;\n  protected final Set<String> reservedNames;\n  protected final EventService eventService;\n\n  @Inject\n  public UserManager(\n      UserDao userDao,\n      ProfileDao profileDao,\n      PreferenceDao preferencesDao,\n      EventService eventService,\n      @Named(\"che.auth.reserved_user_names\") String[] reservedNames) {\n    this.userDao = userDao;\n    this.profileDao = profileDao;\n    this.preferencesDao = preferencesDao;\n    this.eventService = eventService;\n    this.reservedNames = Sets.newHashSet(reservedNames);\n  }\n\n  /**\n   * Creates new user and his profile. NOTE: The user data is no longer persisted in the database.\n   *\n   * @param newUser created user\n   * @throws NullPointerException when {@code newUser} is null\n   * @throws ConflictException when user with such name/email/alias already exists\n   * @throws ServerException when any other error occurs\n   */\n  public User create(User newUser, boolean isTemporary) throws ConflictException, ServerException {\n    requireNonNull(newUser, \"Required non-null user\");\n    if (reservedNames.contains(newUser.getName().toLowerCase())) {\n      throw new ConflictException(String.format(\"Username '%s' is reserved\", newUser.getName()));\n    }\n    final String userId = newUser.getId() != null ? newUser.getId() : generate(\"user\", ID_LENGTH);\n    final UserImpl user =\n        new UserImpl(\n            userId,\n            newUser.getEmail(),\n            newUser.getName(),\n            firstNonNull(newUser.getPassword(), generate(\"\", PASSWORD_LENGTH)),\n            newUser.getAliases());\n    eventService.publish(new UserCreatedEvent(user));\n    return user;\n  }\n\n  @Transactional(rollbackOn = {RuntimeException.class, ApiException.class})\n  protected void doCreate(UserImpl user, boolean isTemporary)\n      throws ConflictException, ServerException {\n    throw new UnsupportedOperationException(\n        \"'doCreate' method should never be called. User information is no longer persisted in the database.\");\n  }\n\n  /**\n   * Updates user by replacing an existing user entity with a new one.\n   *\n   * @param user user update\n   * @throws NullPointerException when {@code user} is null\n   * @throws NotFoundException when user with id {@code user.getId()} is not found\n   * @throws ConflictException when user's new alias/email/name is not unique\n   * @throws ServerException when any other error occurs\n   */\n  public void update(User user) throws NotFoundException, ServerException, ConflictException {\n    requireNonNull(user, \"Required non-null user\");\n    userDao.update(new UserImpl(user));\n  }\n\n  /**\n   * Finds user by given {@code id}.\n   *\n   * @param id user identifier\n   * @return user instance\n   * @throws NullPointerException when {@code id} is null\n   * @throws NotFoundException when user doesn't exist\n   * @throws ServerException when any other error occurs\n   */\n  public User getById(String id) throws NotFoundException, ServerException {\n    requireNonNull(id, \"Required non-null id\");\n    return userDao.getById(id);\n  }\n\n  /**\n   * Finds user by given {@code alias}.\n   *\n   * @param alias user alias\n   * @return user instance\n   * @throws NullPointerException when {@code alias} is null\n   * @throws NotFoundException when user doesn't exist\n   * @throws ServerException when any other error occurs\n   */\n  public User getByAlias(String alias) throws NotFoundException, ServerException {\n    requireNonNull(alias, \"Required non-null alias\");\n    return userDao.getByAlias(alias);\n  }\n\n  /**\n   * Finds user by given {@code name}.\n   *\n   * @param name user name\n   * @return user instance\n   * @throws NullPointerException when {@code name} is null\n   * @throws NotFoundException when user doesn't exist\n   * @throws ServerException when any other error occurs\n   */\n  public User getByName(String name) throws NotFoundException, ServerException {\n    requireNonNull(name, \"Required non-null name\");\n    return userDao.getByName(name);\n  }\n\n  /**\n   * Finds user by given {@code email}.\n   *\n   * @param email user email\n   * @return user instance\n   * @throws NullPointerException when {@code email} is null\n   * @throws NotFoundException when user doesn't exist\n   * @throws ServerException when any other error occurs\n   */\n  public User getByEmail(String email) throws NotFoundException, ServerException {\n    requireNonNull(email, \"Required non-null email\");\n    return userDao.getByEmail(email);\n  }\n\n  /**\n   * Finds all users {@code email}.\n   *\n   * @param maxItems the maximum number of users to return\n   * @param skipCount the number of users to skip\n   * @return user instance\n   * @throws IllegalArgumentException when {@code maxItems} or {@code skipCount} is negative\n   * @throws ServerException when any other error occurs\n   */\n  public Page<UserImpl> getAll(int maxItems, long skipCount) throws ServerException {\n    checkArgument(maxItems >= 0, \"The number of items to return can't be negative.\");\n    checkArgument(skipCount >= 0, \"The number of items to skip can't be negative.\");\n    return userDao.getAll(maxItems, skipCount);\n  }\n\n  /**\n   * Returns all users whose email address contains specified {@code emailPart}.\n   *\n   * @param emailPart fragment of user's email\n   * @param maxItems the maximum number of users to return\n   * @param skipCount the number of users to skip\n   * @return list of matched users\n   * @throws NullPointerException when {@code emailPart} is null\n   * @throws IllegalArgumentException when {@code maxItems} or {@code skipCount} is negative or when\n   *     {@code skipCount} more than {@value Integer#MAX_VALUE}\n   * @throws ServerException when any other error occurs\n   */\n  public Page<? extends User> getByEmailPart(String emailPart, int maxItems, long skipCount)\n      throws ServerException {\n    requireNonNull(emailPart, \"Required non-null email part\");\n    checkArgument(maxItems >= 0, \"The number of items to return can't be negative\");\n    checkArgument(\n        skipCount >= 0 && skipCount <= Integer.MAX_VALUE,\n        \"The number of items to skip can't be negative or greater than \" + Integer.MAX_VALUE);\n    return userDao.getByEmailPart(emailPart, maxItems, skipCount);\n  }\n\n  /**\n   * Returns all users whose name contains specified {@code namePart}.\n   *\n   * @param namePart fragment of user's name\n   * @param maxItems the maximum number of users to return\n   * @param skipCount the number of users to skip\n   * @return list of matched users\n   * @throws NullPointerException when {@code namePart} is null\n   * @throws IllegalArgumentException when {@code maxItems} or {@code skipCount} is negative or when\n   *     {@code skipCount} more than {@value Integer#MAX_VALUE}\n   * @throws ServerException when any other error occurs\n   */\n  public Page<? extends User> getByNamePart(String namePart, int maxItems, long skipCount)\n      throws ServerException {\n    requireNonNull(namePart, \"Required non-null name part\");\n    checkArgument(maxItems >= 0, \"The number of items to return can't be negative\");\n    checkArgument(\n        skipCount >= 0 && skipCount <= Integer.MAX_VALUE,\n        \"The number of items to skip can't be negative or greater than \" + Integer.MAX_VALUE);\n    return userDao.getByNamePart(namePart, maxItems, skipCount);\n  }\n\n  /**\n   * Gets total count of all users\n   *\n   * @return user count\n   * @throws ServerException when any error occurs\n   */\n  public long getTotalCount() throws ServerException {\n    return userDao.getTotalCount();\n  }\n\n  /**\n   * Removes user by given {@code id}.\n   *\n   * @param id user identifier\n   * @throws NullPointerException when {@code id} is null\n   * @throws ConflictException when given user cannot be deleted\n   * @throws ServerException when any other error occurs\n   */\n  public void remove(String id) throws ServerException, ConflictException {\n    requireNonNull(id, \"Required non-null id\");\n    doRemove(id);\n    eventService.publish(new UserRemovedEvent(id));\n  }\n\n  /**\n   * Method is used to retrieve user object from Che DB for given user {@code id}, {@code email},\n   * and {@code username}. Various actualization operations may be performed:\n   *\n   * <p>- if user is found in Che DB by the given {@code id}, then it will check, if it's email,\n   * matches the {@code email} , and update it in DB if necessary.\n   *\n   * <p>- if user is not found in Che DB by the given {@code id} , then attempt to create one. But\n   * also, it will attempt to get one by {@code email}. If such is found, he will be removed. That\n   * way, there will be no conflict with existing user id or email upon recreation. In case of\n   * conflict with user name, it may be prepended randomized symbols\n   *\n   * @param id - user id from\n   * @param email - user email\n   * @param username - user name\n   * @return user object from Che Database, with all needed actualization operations performed on\n   *     him\n   * @throws ServerException if this exception during user creation, removal, or retrieval\n   * @throws ConflictException if this exception occurs during user creation or removal\n   */\n  public User getOrCreateUser(String id, String email, String username)\n      throws ServerException, ConflictException {\n    return new UserImpl(id, email, username, generate(\"\", 12), emptyList());\n  }\n\n  /**\n   * Method is used to retrieve user object from Che DB for given user {@code id} and {@code\n   * username}\n   *\n   * <p>- if user is found in Che DB by the given {@code id}, then it will update it in DB if\n   * necessary.\n   *\n   * <p>- if user is not found in Che DB by the given {@code id} , then attempt to create one. In\n   * case of conflict with user name, it may be prepended randomized symbols\n   *\n   * @param id - user id from\n   * @param username - user name\n   * @return user object from Che Database, with all needed actualization operations performed on\n   *     him\n   * @throws ServerException if this exception during user creation, removal, or retrieval\n   * @throws ConflictException if this exception occurs during user creation or removal\n   */\n  public User getOrCreateUser(String id, String username)\n      throws ServerException, ConflictException {\n    return new UserImpl(id, username + \"@che\", username, generate(\"\", 12), emptyList());\n  }\n\n  @Transactional(\n      rollbackOn = {RuntimeException.class, ServerException.class, ConflictException.class})\n  protected void doRemove(String id) throws ConflictException, ServerException {\n    UserImpl user;\n    try {\n      user = userDao.getById(id);\n    } catch (NotFoundException ignored) {\n      return;\n    }\n    preferencesDao.remove(id);\n    profileDao.remove(id);\n    userDao.remove(id);\n  }\n\n  /**\n   * Performs check that {@code email} matches with the one in local DB, and synchronize them\n   * otherwise\n   */\n  private User actualizeUserEmail(User actualUser, String email) throws ServerException {\n    if (isNullOrEmpty(email) || actualUser.getEmail().equals(email)) {\n      return actualUser;\n    }\n    UserImpl update = new UserImpl(actualUser);\n    update.setEmail(email);\n    try {\n      update(update);\n    } catch (NotFoundException e) {\n      throw new ServerException(\"Unable to actualize user email. User not found.\", e);\n    } catch (ConflictException e) {\n      throw new ServerException(\n          \"Unable to actualize user email. Another user with such email exists\", e);\n    }\n    return update;\n  }\n\n  private Optional<User> getUserById(String id) throws ServerException {\n    try {\n      return Optional.of(getById(id));\n    } catch (NotFoundException e) {\n      return Optional.empty();\n    }\n  }\n\n  private Optional<User> getUserByEmail(String email) throws ServerException {\n    try {\n      return Optional.of(getByEmail(email));\n    } catch (NotFoundException e) {\n      return Optional.empty();\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/UserService.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport static jakarta.ws.rs.core.MediaType.TEXT_PLAIN;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.Produces;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.rest.Service;\nimport org.eclipse.che.commons.env.EnvironmentContext;\n\n/**\n * User REST API.\n *\n * @author Yevhenii Voevodin\n * @author Anton Korneta\n */\n@Path(\"/user\")\n@Tag(name = \"user\", description = \"User REST API\")\npublic class UserService extends Service {\n\n  @Inject\n  public UserService() {}\n\n  @GET\n  @Path(\"/id\")\n  @Produces(TEXT_PLAIN)\n  @Operation(\n      summary = \"Get current user's id\",\n      responses = {\n        @ApiResponse(\n            responseCode = \"200\",\n            description =\n                \"The response contains current user's id ('0000-00-0000' is returned for the anonymous user)\"),\n      })\n  public String getId() {\n    return userId();\n  }\n\n  private static String userId() {\n    return EnvironmentContext.getCurrent().getSubject().getUserId();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/UserValidator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport javax.inject.Inject;\nimport org.eclipse.che.account.spi.AccountValidator;\nimport org.eclipse.che.api.core.BadRequestException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.user.User;\n\n/**\n * Utils for username validation and normalization.\n *\n * @author Mihail Kuznyetsov\n * @author Yevhenii Voevodin\n * @author Sergii Leschenko\n */\npublic class UserValidator {\n  @VisibleForTesting static final String GENERATED_NAME_PREFIX = \"username\";\n\n  private final AccountValidator accountValidator;\n\n  @Inject\n  public UserValidator(AccountValidator accountValidator) {\n    this.accountValidator = accountValidator;\n  }\n\n  /**\n   * Checks whether given user is valid.\n   *\n   * @param user user to check\n   * @throws BadRequestException when user is not valid\n   */\n  public void checkUser(User user) throws BadRequestException {\n    if (user == null) {\n      throw new BadRequestException(\"User required\");\n    }\n    if (isNullOrEmpty(user.getName())) {\n      throw new BadRequestException(\"User name required\");\n    }\n    if (!isValidName(user.getName())) {\n      throw new BadRequestException(\n          \"Username may only contain alphanumeric characters or single hyphens inside\");\n    }\n    if (isNullOrEmpty(user.getEmail())) {\n      throw new BadRequestException(\"User email required\");\n    }\n    if (user.getPassword() != null) {\n      checkPassword(user.getPassword());\n    }\n  }\n\n  /**\n   * Checks whether password is ok.\n   *\n   * @param password password to check\n   * @throws BadRequestException when password is not valid\n   */\n  public void checkPassword(String password) throws BadRequestException {\n    if (password == null) {\n      throw new BadRequestException(\"Password required\");\n    }\n    if (password.length() < 8) {\n      throw new BadRequestException(\"Password should contain at least 8 characters\");\n    }\n    int numOfLetters = 0;\n    int numOfDigits = 0;\n    for (char passwordChar : password.toCharArray()) {\n      if (Character.isDigit(passwordChar)) {\n        numOfDigits++;\n      } else if (Character.isLetter(passwordChar)) {\n        numOfLetters++;\n      }\n    }\n    if (numOfDigits == 0 || numOfLetters == 0) {\n      throw new BadRequestException(\"Password should contain letters and digits\");\n    }\n  }\n\n  /**\n   * Validate name, if it doesn't contain illegal characters\n   *\n   * @param name username\n   * @return true if valid name, false otherwise\n   */\n  public boolean isValidName(String name) {\n    return accountValidator.isValidName(name);\n  }\n\n  /**\n   * Remove illegal characters from username, to make it URL-friendly. If all characters are\n   * illegal, return automatically generated username. Also ensures username is unique, if not, adds\n   * digits to it's end.\n   *\n   * @param name username\n   * @return username without illegal characters\n   */\n  public String normalizeUserName(String name) throws ServerException {\n    return accountValidator.normalizeAccountName(name, GENERATED_NAME_PREFIX);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/event/UserCreatedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server.event;\n\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.core.notification.EventOrigin;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\n\n/**\n * Will be published when {@link UserImpl user} is created.\n *\n * @author Anatolii Bazko\n */\n@EventOrigin(\"user\")\npublic class UserCreatedEvent {\n\n  private final User user;\n\n  public UserCreatedEvent(User user) {\n    this.user = user;\n  }\n\n  public User getUser() {\n    return user;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/event/UserRemovedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server.event;\n\nimport org.eclipse.che.api.core.notification.EventOrigin;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\n\n/**\n * Published after {@link UserImpl user} removed.\n *\n * @author Sergii Kabashniuk\n */\n@EventOrigin(\"user\")\npublic class UserRemovedEvent {\n\n  private final String userId;\n\n  public UserRemovedEvent(String userId) {\n    this.userId = userId;\n  }\n\n  /** Returns id of removed user */\n  public String getUserId() {\n    return userId;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/jpa/JpaPreferenceDao.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server.jpa;\n\nimport static java.util.Objects.requireNonNull;\n\nimport com.google.inject.persist.Transactional;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport javax.persistence.EntityManager;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.user.server.spi.PreferenceDao;\n\n/**\n * Implementation of {@link PreferenceDao}.\n *\n * @author Anton Korneta\n */\n@Singleton\npublic class JpaPreferenceDao implements PreferenceDao {\n\n  @Inject private Provider<EntityManager> managerProvider;\n\n  @Override\n  public void setPreferences(String userId, Map<String, String> preferences)\n      throws ServerException {\n    requireNonNull(userId);\n    requireNonNull(preferences);\n    final PreferenceEntity prefs = new PreferenceEntity(userId, preferences);\n    if (preferences.isEmpty()) {\n      remove(userId);\n    } else {\n      try {\n        doSetPreference(prefs);\n      } catch (RuntimeException ex) {\n        throw new ServerException(ex.getLocalizedMessage(), ex);\n      }\n    }\n  }\n\n  @Override\n  @Transactional\n  public Map<String, String> getPreferences(String userId) throws ServerException {\n    requireNonNull(userId);\n    try {\n      final EntityManager manager = managerProvider.get();\n      final PreferenceEntity prefs = manager.find(PreferenceEntity.class, userId);\n      return prefs == null ? new HashMap<>() : prefs.getPreferences();\n    } catch (RuntimeException ex) {\n      throw new ServerException(ex.getLocalizedMessage(), ex);\n    }\n  }\n\n  @Override\n  @Transactional\n  public Map<String, String> getPreferences(String userId, String filter) throws ServerException {\n    requireNonNull(userId);\n    requireNonNull(filter);\n    try {\n      final EntityManager manager = managerProvider.get();\n      final PreferenceEntity prefs = manager.find(PreferenceEntity.class, userId);\n      if (prefs == null) {\n        return new HashMap<>();\n      }\n      final Map<String, String> preferences = prefs.getPreferences();\n      if (!filter.isEmpty()) {\n        final Pattern pattern = Pattern.compile(filter);\n        return preferences.entrySet().stream()\n            .filter(preference -> pattern.matcher(preference.getKey()).matches())\n            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));\n      } else {\n        return preferences;\n      }\n    } catch (RuntimeException ex) {\n      throw new ServerException(ex.getLocalizedMessage(), ex);\n    }\n  }\n\n  @Override\n  public void remove(String userId) throws ServerException {\n    requireNonNull(userId);\n    try {\n      doRemove(userId);\n    } catch (RuntimeException ex) {\n      throw new ServerException(ex);\n    }\n  }\n\n  @Transactional\n  protected void doSetPreference(PreferenceEntity prefs) {\n    final EntityManager manager = managerProvider.get();\n    final PreferenceEntity existing = manager.find(PreferenceEntity.class, prefs.getUserId());\n    if (existing != null) {\n      manager.merge(prefs);\n    } else {\n      manager.persist(prefs);\n    }\n    manager.flush();\n  }\n\n  @Transactional\n  protected void doRemove(String userId) {\n    final EntityManager manager = managerProvider.get();\n    final PreferenceEntity prefs = manager.find(PreferenceEntity.class, userId);\n    if (prefs != null) {\n      manager.remove(prefs);\n      manager.flush();\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/jpa/JpaProfileDao.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server.jpa;\n\nimport static java.lang.String.format;\nimport static java.util.Objects.requireNonNull;\n\nimport com.google.inject.persist.Transactional;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport javax.persistence.EntityManager;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.user.server.model.impl.ProfileImpl;\nimport org.eclipse.che.api.user.server.spi.ProfileDao;\n\n@Singleton\npublic class JpaProfileDao implements ProfileDao {\n\n  @Inject private Provider<EntityManager> managerProvider;\n\n  @Override\n  public void create(ProfileImpl profile) throws ServerException, ConflictException {\n    requireNonNull(profile, \"Required non-null profile\");\n    try {\n      doCreate(profile);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  public void update(ProfileImpl profile) throws NotFoundException, ServerException {\n    requireNonNull(profile, \"Required non-null profile\");\n    try {\n      doUpdate(profile);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  public void remove(String id) throws ServerException {\n    requireNonNull(id, \"Required non-null id\");\n    try {\n      doRemove(id);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  @Transactional\n  public ProfileImpl getById(String userId) throws NotFoundException, ServerException {\n    requireNonNull(userId, \"Required non-null id\");\n    try {\n      final EntityManager manager = managerProvider.get();\n      final ProfileImpl profile = manager.find(ProfileImpl.class, userId);\n      if (profile == null) {\n        throw new NotFoundException(format(\"Couldn't find profile for user with id '%s'\", userId));\n      }\n      manager.refresh(profile);\n      return profile;\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Transactional\n  protected void doCreate(ProfileImpl profile) {\n    EntityManager manager = managerProvider.get();\n    manager.persist(profile);\n    manager.flush();\n  }\n\n  @Transactional\n  protected void doUpdate(ProfileImpl profile) throws NotFoundException {\n    final EntityManager manager = managerProvider.get();\n    if (manager.find(ProfileImpl.class, profile.getUserId()) == null) {\n      throw new NotFoundException(\n          format(\n              \"Couldn't update profile, because profile for user with id '%s' doesn't exist\",\n              profile.getUserId()));\n    }\n    manager.merge(profile);\n    manager.flush();\n  }\n\n  @Transactional\n  protected void doRemove(String userId) {\n    final EntityManager manager = managerProvider.get();\n    final ProfileImpl profile = manager.find(ProfileImpl.class, userId);\n    if (profile != null) {\n      manager.remove(profile);\n      manager.flush();\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/jpa/JpaUserDao.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server.jpa;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static java.lang.String.format;\nimport static java.util.Objects.requireNonNull;\nimport static java.util.stream.Collectors.toList;\n\nimport com.google.inject.persist.Transactional;\nimport java.util.List;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport javax.persistence.EntityManager;\nimport javax.persistence.NoResultException;\nimport org.eclipse.che.api.core.ApiException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\nimport org.eclipse.che.api.user.server.spi.UserDao;\nimport org.eclipse.che.security.PasswordEncryptor;\n\n/**\n * JPA based implementation of {@link UserDao}.\n *\n * @author Yevhenii Voevodin\n * @author Anton Korneta\n * @author Igor Vinokur\n */\n@Singleton\npublic class JpaUserDao implements UserDao {\n\n  @Inject protected Provider<EntityManager> managerProvider;\n  @Inject private PasswordEncryptor encryptor;\n\n  @Override\n  @Transactional\n  public UserImpl getByAliasAndPassword(String emailOrName, String password)\n      throws NotFoundException, ServerException {\n    requireNonNull(emailOrName, \"Required non-null email or name\");\n    requireNonNull(password, \"Required non-null password\");\n    try {\n      final UserImpl user =\n          managerProvider\n              .get()\n              .createNamedQuery(\"User.getByAliasAndPassword\", UserImpl.class)\n              .setParameter(\"alias\", emailOrName)\n              .getSingleResult();\n      if (!encryptor.test(password, user.getPassword())) {\n        throw new NotFoundException(\n            format(\"User with email or name '%s' and given password doesn't exist\", emailOrName));\n      }\n      return erasePassword(user);\n    } catch (NoResultException x) {\n      throw new NotFoundException(\n          format(\"User with email or name '%s' and given password doesn't exist\", emailOrName));\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  public void create(UserImpl user) throws ConflictException, ServerException {\n    requireNonNull(user, \"Required non-null user\");\n    try {\n      if (user.getPassword() != null) {\n        user.setPassword(encryptor.encrypt(user.getPassword()));\n      }\n      doCreate(user);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  public void update(UserImpl update) throws NotFoundException, ServerException, ConflictException {\n    requireNonNull(update, \"Required non-null update\");\n    try {\n      doUpdate(update);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  public void remove(String id) throws ServerException {\n    requireNonNull(id, \"Required non-null id\");\n    try {\n      doRemove(id);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  public UserImpl getByAlias(String alias) throws NotFoundException, ServerException {\n    requireNonNull(alias, \"Required non-null alias\");\n    try {\n      return erasePassword(\n          managerProvider\n              .get()\n              .createNamedQuery(\"User.getByAlias\", UserImpl.class)\n              .setParameter(\"alias\", alias)\n              .getSingleResult());\n    } catch (NoResultException x) {\n      throw new NotFoundException(format(\"User with alias '%s' doesn't exist\", alias));\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  @Transactional\n  public UserImpl getById(String id) throws NotFoundException, ServerException {\n    requireNonNull(id, \"Required non-null id\");\n    try {\n      final UserImpl user = managerProvider.get().find(UserImpl.class, id);\n      if (user == null) {\n        throw new NotFoundException(format(\"User with id '%s' doesn't exist\", id));\n      }\n      return erasePassword(user);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  @Transactional\n  public UserImpl getByName(String name) throws NotFoundException, ServerException {\n    requireNonNull(name, \"Required non-null name\");\n    try {\n      return erasePassword(\n          managerProvider\n              .get()\n              .createNamedQuery(\"User.getByName\", UserImpl.class)\n              .setParameter(\"name\", name)\n              .getSingleResult());\n    } catch (NoResultException x) {\n      throw new NotFoundException(format(\"User with name '%s' doesn't exist\", name));\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  @Transactional\n  public UserImpl getByEmail(String email) throws NotFoundException, ServerException {\n    requireNonNull(email, \"Required non-null email\");\n    try {\n      return erasePassword(\n          managerProvider\n              .get()\n              .createNamedQuery(\"User.getByEmail\", UserImpl.class)\n              .setParameter(\"email\", email)\n              .getSingleResult());\n    } catch (NoResultException x) {\n      throw new NotFoundException(format(\"User with email '%s' doesn't exist\", email));\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  @Transactional\n  public Page<UserImpl> getAll(int maxItems, long skipCount) throws ServerException {\n    // TODO need to ensure that 'getAll' query works with same data as 'getTotalCount'\n    checkArgument(maxItems >= 0, \"The number of items to return can't be negative.\");\n    checkArgument(\n        skipCount >= 0 && skipCount <= Integer.MAX_VALUE,\n        \"The number of items to skip can't be negative or greater than \" + Integer.MAX_VALUE);\n    try {\n      final List<UserImpl> list =\n          managerProvider\n              .get()\n              .createNamedQuery(\"User.getAll\", UserImpl.class)\n              .setMaxResults(maxItems)\n              .setFirstResult((int) skipCount)\n              .getResultList()\n              .stream()\n              .map(JpaUserDao::erasePassword)\n              .collect(toList());\n      return new Page<>(list, skipCount, maxItems, getTotalCount());\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  @Transactional\n  public Page<UserImpl> getByNamePart(String namePart, int maxItems, long skipCount)\n      throws ServerException {\n    requireNonNull(namePart, \"Required non-null name part\");\n    checkArgument(maxItems >= 0, \"The number of items to return can't be negative\");\n    checkArgument(\n        skipCount >= 0 && skipCount <= Integer.MAX_VALUE,\n        \"The number of items to skip can't be negative or greater than \" + Integer.MAX_VALUE);\n    try {\n      final List<UserImpl> list =\n          managerProvider\n              .get()\n              .createNamedQuery(\"User.getByNamePart\", UserImpl.class)\n              .setParameter(\"name\", namePart.toLowerCase())\n              .setMaxResults(maxItems)\n              .setFirstResult((int) skipCount)\n              .getResultList()\n              .stream()\n              .map(JpaUserDao::erasePassword)\n              .collect(toList());\n      final long count =\n          managerProvider\n              .get()\n              .createNamedQuery(\"User.getByNamePartCount\", Long.class)\n              .setParameter(\"name\", namePart.toLowerCase())\n              .getSingleResult();\n      return new Page<>(list, skipCount, maxItems, count);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  @Transactional\n  public Page<UserImpl> getByEmailPart(String emailPart, int maxItems, long skipCount)\n      throws ServerException {\n    requireNonNull(emailPart, \"Required non-null email part\");\n    checkArgument(maxItems >= 0, \"The number of items to return can't be negative\");\n    checkArgument(\n        skipCount >= 0 && skipCount <= Integer.MAX_VALUE,\n        \"The number of items to skip can't be negative or greater than \" + Integer.MAX_VALUE);\n    try {\n      final List<UserImpl> list =\n          managerProvider\n              .get()\n              .createNamedQuery(\"User.getByEmailPart\", UserImpl.class)\n              .setParameter(\"email\", emailPart.toLowerCase())\n              .setMaxResults(maxItems)\n              .setFirstResult((int) skipCount)\n              .getResultList()\n              .stream()\n              .map(JpaUserDao::erasePassword)\n              .collect(toList());\n      final long count =\n          managerProvider\n              .get()\n              .createNamedQuery(\"User.getByEmailPartCount\", Long.class)\n              .setParameter(\"email\", emailPart.toLowerCase())\n              .getSingleResult();\n      return new Page<>(list, skipCount, maxItems, count);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  @Transactional\n  public long getTotalCount() throws ServerException {\n    try {\n      return managerProvider\n          .get()\n          .createNamedQuery(\"User.getTotalCount\", Long.class)\n          .getSingleResult();\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Transactional(rollbackOn = {RuntimeException.class, ApiException.class})\n  protected void doCreate(UserImpl user) throws ConflictException, ServerException {\n    EntityManager manage = managerProvider.get();\n    manage.persist(user);\n    manage.flush();\n  }\n\n  @Transactional\n  protected void doUpdate(UserImpl update) throws NotFoundException {\n    final EntityManager manager = managerProvider.get();\n    final UserImpl user = manager.find(UserImpl.class, update.getId());\n    if (user == null) {\n      throw new NotFoundException(\n          format(\"Couldn't update user with id '%s' because it doesn't exist\", update.getId()));\n    }\n    final String password = update.getPassword();\n    if (password != null) {\n      update.setPassword(encryptor.encrypt(password));\n    } else {\n      update.setPassword(user.getPassword());\n    }\n    manager.merge(update);\n    manager.flush();\n  }\n\n  @Transactional(rollbackOn = {RuntimeException.class, ServerException.class})\n  protected void doRemove(String id) {\n    final EntityManager manager = managerProvider.get();\n    final UserImpl user = manager.find(UserImpl.class, id);\n    if (user != null) {\n      manager.remove(user);\n      manager.flush();\n    }\n  }\n\n  // Returns user instance copy without password\n  private static UserImpl erasePassword(UserImpl source) {\n    return new UserImpl(\n        source.getId(), source.getEmail(), source.getName(), null, source.getAliases());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/jpa/PreferenceEntity.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server.jpa;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.Table;\n\n/**\n * Describes JPA implementation of user's preferences.\n *\n * @author Anton Korneta\n * @author Yevhenii Voevodin\n */\n@Entity(name = \"Preference\")\n@Table(name = \"preference\")\npublic class PreferenceEntity {\n\n  @Id\n  @Column(name = \"userid\")\n  private String userId;\n\n  @ElementCollection\n  @CollectionTable(\n      name = \"preference_preferences\",\n      joinColumns = @JoinColumn(name = \"preference_userid\"))\n  @MapKeyColumn(name = \"name\")\n  @Column(name = \"value_param\", columnDefinition = \"TEXT\")\n  private Map<String, String> preferences;\n\n  public PreferenceEntity() {}\n\n  public PreferenceEntity(String userId, Map<String, String> preferences) {\n    this.userId = userId;\n    this.preferences = preferences;\n  }\n\n  public String getUserId() {\n    return userId;\n  }\n\n  public void setUserId(String userId) {\n    this.userId = userId;\n  }\n\n  public Map<String, String> getPreferences() {\n    if (preferences == null) {\n      preferences = new HashMap<>();\n    }\n    return preferences;\n  }\n\n  public void setPreferences(Map<String, String> preferences) {\n    this.preferences = preferences;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof PreferenceEntity)) return false;\n\n    final PreferenceEntity other = (PreferenceEntity) obj;\n\n    return Objects.equals(userId, other.userId) && getPreferences().equals(other.getPreferences());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(userId);\n    hash = 31 * hash + getPreferences().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"PreferenceEntity{\" + \"userId='\" + userId + '\\'' + \", preferences=\" + preferences + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/jpa/UserJpaModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server.jpa;\n\nimport com.google.inject.AbstractModule;\nimport org.eclipse.che.api.user.server.spi.PreferenceDao;\nimport org.eclipse.che.api.user.server.spi.ProfileDao;\nimport org.eclipse.che.api.user.server.spi.UserDao;\nimport org.eclipse.che.security.PBKDF2PasswordEncryptor;\nimport org.eclipse.che.security.PasswordEncryptor;\n\n/**\n * @author Yevhenii Voevodin\n */\npublic class UserJpaModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    bind(PasswordEncryptor.class).to(PBKDF2PasswordEncryptor.class);\n    bind(UserDao.class).to(JpaUserDao.class);\n    bind(ProfileDao.class).to(JpaProfileDao.class);\n    bind(PreferenceDao.class).to(JpaPreferenceDao.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/model/impl/ProfileImpl.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server.model.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.PrimaryKeyJoinColumn;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.user.Profile;\n\n/**\n * Data object for the {@link Profile}.\n *\n * @author Yevhenii Voevodin\n */\n@Entity(name = \"Profile\")\n@Table(name = \"profile\")\npublic class ProfileImpl implements Profile {\n\n  @Id\n  @Column(name = \"userid\")\n  private String userId;\n\n  @PrimaryKeyJoinColumn private UserImpl user;\n\n  @ElementCollection\n  @MapKeyColumn(name = \"name\")\n  @Column(name = \"value_param\", nullable = false)\n  @CollectionTable(name = \"profile_attributes\", joinColumns = @JoinColumn(name = \"user_id\"))\n  private Map<String, String> attributes;\n\n  public ProfileImpl() {}\n\n  public ProfileImpl(String userId) {\n    this.userId = userId;\n  }\n\n  public ProfileImpl(String userId, Map<String, String> attributes) {\n    this.userId = userId;\n    if (attributes != null) {\n      this.attributes = new HashMap<>(attributes);\n    }\n  }\n\n  public ProfileImpl(Profile profile) {\n    this(profile.getUserId(), profile.getAttributes());\n  }\n\n  public ProfileImpl(ProfileImpl profile) {\n    this(profile.getUserId(), profile.getAttributes());\n    this.user = profile.user;\n  }\n\n  @Override\n  public String getUserId() {\n    return userId;\n  }\n\n  public void setUserId(String userId) {\n    this.userId = userId;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      this.attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public UserImpl getUser() {\n    return user;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof ProfileImpl)) {\n      return false;\n    }\n    final ProfileImpl that = (ProfileImpl) obj;\n    return Objects.equals(userId, that.userId) && getAttributes().equals(that.getAttributes());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(userId);\n    hash = 31 * hash + getAttributes().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"ProfileImpl{\" + \"userId='\" + userId + '\\'' + \", attributes=\" + attributes + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/model/impl/UserImpl.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server.model.impl;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Objects;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.Id;\nimport javax.persistence.Index;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.NamedQueries;\nimport javax.persistence.NamedQuery;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.user.User;\n\n/**\n * Data object for the {@link User}.\n *\n * @author Yevhenii Voevodin\n */\n@Entity(name = \"Usr\")\n@NamedQueries({\n  @NamedQuery(\n      name = \"User.getByAliasAndPassword\",\n      query = \"SELECT u \" + \"FROM Usr u \" + \"WHERE :alias = u.name OR\" + \"      :alias = u.email\"),\n  @NamedQuery(\n      name = \"User.getByAlias\",\n      query = \"SELECT u FROM Usr u WHERE :alias MEMBER OF u.aliases\"),\n  @NamedQuery(name = \"User.getByName\", query = \"SELECT u FROM Usr u WHERE u.name = :name\"),\n  @NamedQuery(name = \"User.getByEmail\", query = \"SELECT u FROM Usr u WHERE u.email = :email\"),\n  @NamedQuery(name = \"User.getAll\", query = \"SELECT u FROM Usr u\"),\n  @NamedQuery(name = \"User.getTotalCount\", query = \"SELECT COUNT(u) FROM Usr u\"),\n  @NamedQuery(\n      name = \"User.getByEmailPart\",\n      query = \"SELECT u FROM Usr u WHERE LOWER(u.email) LIKE CONCAT('%', :email, '%')\"),\n  @NamedQuery(\n      name = \"User.getByEmailPartCount\",\n      query = \"SELECT COUNT(u) FROM Usr u WHERE LOWER(u.email) LIKE CONCAT('%', :email, '%')\"),\n  @NamedQuery(\n      name = \"User.getByNamePart\",\n      query = \"SELECT u FROM Usr u WHERE LOWER(u.name) LIKE CONCAT('%', :name, '%')\"),\n  @NamedQuery(\n      name = \"User.getByNamePartCount\",\n      query = \"SELECT COUNT(u) FROM Usr u WHERE LOWER(u.name) LIKE CONCAT('%', :name, '%')\")\n})\n@Table(name = \"usr\")\npublic class UserImpl implements User {\n  @Id\n  @Column(name = \"id\")\n  private String id;\n\n  @Column(nullable = false, name = \"email\")\n  private String email;\n\n  @Column(nullable = false, name = \"name\")\n  private String name;\n\n  @Column(name = \"password\")\n  private String password;\n\n  @ElementCollection\n  @Column(name = \"alias\", nullable = false, unique = true)\n  @CollectionTable(\n      name = \"user_aliases\",\n      indexes = @Index(columnList = \"alias\"),\n      joinColumns = @JoinColumn(name = \"user_id\"))\n  private List<String> aliases;\n\n  public UserImpl() {}\n\n  public UserImpl(String id, String email, String name) {\n    this.id = id;\n    this.name = name;\n    this.email = email;\n  }\n\n  public UserImpl(\n      String id, String email, String name, String password, Collection<String> aliases) {\n    this(id, email, name);\n    this.password = password;\n    if (aliases != null) {\n      this.aliases = new ArrayList<>(aliases);\n    }\n  }\n\n  public UserImpl(User user) {\n    this(user.getId(), user.getEmail(), user.getName(), user.getPassword(), user.getAliases());\n  }\n\n  @Override\n  public String getId() {\n    return id;\n  }\n\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  @Override\n  public String getEmail() {\n    return email;\n  }\n\n  public void setEmail(String email) {\n    this.email = email;\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public String getPassword() {\n    return password;\n  }\n\n  public void setPassword(String password) {\n    this.password = password;\n  }\n\n  @Override\n  public List<String> getAliases() {\n    if (aliases == null) {\n      aliases = new ArrayList<>();\n    }\n    return aliases;\n  }\n\n  public void setAliases(List<String> aliases) {\n    this.aliases = aliases;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof UserImpl)) {\n      return false;\n    }\n    final UserImpl that = (UserImpl) obj;\n    return Objects.equals(id, that.id)\n        && Objects.equals(email, that.email)\n        && Objects.equals(name, that.name)\n        && Objects.equals(password, that.password)\n        && getAliases().equals(that.getAliases());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + Objects.hashCode(email);\n    hash = 31 * hash + Objects.hashCode(name);\n    hash = 31 * hash + Objects.hashCode(password);\n    hash = 31 * hash + getAliases().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"UserImpl{\"\n        + \"id='\"\n        + id\n        + '\\''\n        + \", email='\"\n        + email\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", password='\"\n        + password\n        + '\\''\n        + \", aliases=\"\n        + aliases\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/spi/PreferenceDao.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server.spi;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.ServerException;\n\n/**\n * Defines data access object contract for user preferences.\n *\n * @author Yevhenii Voevodin\n */\npublic interface PreferenceDao {\n\n  /**\n   * Sets user preferences, overrides existing preferences if any.\n   *\n   * @param userId user identifier\n   * @param preferences new preferences, if preferences are empty - removes user preferences\n   * @throws NullPointerException when preferences or userId is null\n   * @throws ServerException when any other error occurs\n   */\n  void setPreferences(String userId, Map<String, String> preferences) throws ServerException;\n\n  /**\n   * Gets user preferences.\n   *\n   * <p>Note that this method must always return upgradable map, thus it may be used as:\n   *\n   * <pre>{@code\n   * Map<String, String> prefs = dao.getPreferences(\"user123\");\n   * prefs.put(\"key\", \"secret\");\n   * spi.setPreferences(\"user123\", prefs);\n   * }</pre>\n   *\n   * @param userId user identifier\n   * @return user preferences, or empty map\n   * @throws NullPointerException when userId is null\n   * @throws ServerException when any error occurs\n   */\n  Map<String, String> getPreferences(String userId) throws ServerException;\n\n  /**\n   * Gets user preferences filtered with given regexp.\n   *\n   * <p>Note that this method must always return upgradable map, thus it may be used as:\n   *\n   * <pre>{@code\n   * Map<String, String> prefs = spi.getPreferences(\"user123\", \".*key.*\");\n   * prefs.put(\"new-key\", \"secret\");\n   * prefs.setPreferences(\"user123\", prefs);\n   * }</pre>\n   *\n   * @param userId user identifier\n   * @param filter {@link java.util.regex.Pattern regexp} which is used to filter preferences by\n   *     their keys\n   * @return user preferences with keys which match given {@code filter} or empty map if user\n   *     doesn't have any preferences\n   * @throws NullPointerException {@code userId} or {@code filter} is null\n   * @throws ServerException when any other error occurs\n   */\n  Map<String, String> getPreferences(String userId, String filter) throws ServerException;\n\n  /**\n   * Removes user preferences.\n   *\n   * <p>Note that this method doesn't throw any exception if user doesn't exist or user doesn't have\n   * any preferences\n   *\n   * @param userId user identifier\n   * @throws NullPointerException when {@code userId} is null\n   * @throws ServerException when any error occurs\n   */\n  void remove(String userId) throws ServerException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/spi/ProfileDao.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server.spi;\n\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.user.Profile;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.user.server.model.impl.ProfileImpl;\n\n/**\n * Data access object contract for {@link Profile}.\n *\n * @author Yevhenii Voevodin\n */\npublic interface ProfileDao {\n\n  /**\n   * Creates user profile.\n   *\n   * @param profile new profile\n   * @throws NullPointerException when {@code profile} is null\n   * @throws ServerException when any error occurs\n   * @throws ConflictException when profile for user {@code profile.getUserId()} already exists\n   */\n  void create(ProfileImpl profile) throws ServerException, ConflictException;\n\n  /**\n   * Updates profile by replacing an existing entity with a new one.\n   *\n   * @param profile profile update\n   * @throws NullPointerException when {@code profile} is null\n   * @throws NotFoundException when profile with such id doesn't exist\n   * @throws ServerException when any other error occurs\n   */\n  void update(ProfileImpl profile) throws NotFoundException, ServerException;\n\n  /**\n   * Removes profile.\n   *\n   * @param id profile identifier\n   * @throws NullPointerException when {@code id} is null\n   * @throws ServerException when any other error occurs\n   */\n  void remove(String id) throws ServerException;\n\n  /**\n   * Finds profile by its id.\n   *\n   * <p>Due to {@link Profile#getEmail()} and {@link Profile#getUserId()} definition returned\n   * profile must contain profile owner's {@link User#getEmail() email} and {@link User#getId()}\n   * identifier.\n   *\n   * @param id profile identifier\n   * @return profile with given {@code id}\n   * @throws NullPointerException when {@code id} is null\n   * @throws NotFoundException when profile with such {@code id} doesn't exist\n   * @throws ServerException when any other error occurs\n   */\n  ProfileImpl getById(String id) throws NotFoundException, ServerException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/spi/UserDao.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server.spi;\n\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\n\n/**\n * Defines data access object contract for {@link UserImpl}.\n *\n * <p>The implementation is not required to be responsible for persistent layer data dto integrity.\n * It simply transfers data from one layer to another, so if you're going to call any of implemented\n * methods it is considered that all needed verifications are already done.\n *\n * <p><strong>Note:</strong> This particularly does not mean that method call will not make any\n * inconsistency, but this mean that such kind of inconsistencies are expected by design and may be\n * treated further.\n *\n * @author Yevhenii Voevodin\n * @author Anton Korneta\n */\npublic interface UserDao {\n\n  /**\n   * Gets user by email or name and password\n   *\n   * @param emailOrName one of user attribute such as email/name(but not id)\n   * @param password password\n   * @return user identifier\n   * @throws NullPointerException when either {@code emailOrName} or {@code password} is null\n   * @throws NotFoundException when user with such {@code emailOrName} and {@code password} doesn't\n   *     exist\n   * @throws ServerException when any other error occurs\n   */\n  UserImpl getByAliasAndPassword(String emailOrName, String password)\n      throws NotFoundException, ServerException;\n\n  /**\n   * Creates a new user.\n   *\n   * @param user user to create\n   * @throws NullPointerException when {@code user} is null\n   * @throws ConflictException when user with such id/alias/email/name already exists\n   * @throws ServerException when any other error occurs\n   */\n  void create(UserImpl user) throws ConflictException, ServerException;\n\n  /**\n   * Updates user by replacing an existing entity with a new one.\n   *\n   * @param user user to update\n   * @throws NullPointerException when {@code user} is null\n   * @throws NotFoundException when user with id {@code user.getId()} doesn't exist\n   * @throws ConflictException when any of the id/alias/email/name updated with a value which is not\n   *     unique\n   * @throws ServerException when any other error occurs\n   */\n  void update(UserImpl user) throws NotFoundException, ServerException, ConflictException;\n\n  /**\n   * Removes user.\n   *\n   * <p>It is up to implementation to do cascade removing of dependent data or to forbid removing at\n   * all.\n   *\n   * <p>Note that this method doesn't throw any exception when user doesn't exist.\n   *\n   * @param id user identifier\n   * @throws NullPointerException when {@code id} is null\n   * @throws ServerException when any other error occurs\n   */\n  void remove(String id) throws ServerException;\n\n  /**\n   * Finds user by his alias.\n   *\n   * <p>This method doesn't work for user's email or name. If it is necessary to get user by name\n   * use {@link #getByName(String)} method instead.\n   *\n   * @param alias user name or alias\n   * @return user instance, never null\n   * @throws NullPointerException when {@code alias} is null\n   * @throws NotFoundException when user with given {@code alias} doesn't exist\n   * @throws ServerException when any other error occurs\n   */\n  UserImpl getByAlias(String alias) throws NotFoundException, ServerException;\n\n  /**\n   * Finds user by his identifier.\n   *\n   * @param id user identifier\n   * @return user instance, never null\n   * @throws NullPointerException when {@code id} is null\n   * @throws NotFoundException when user with given {@code id} doesn't exist\n   * @throws ServerException when any other error occurs\n   */\n  UserImpl getById(String id) throws NotFoundException, ServerException;\n\n  /**\n   * Finds user by his name.\n   *\n   * @param name user name\n   * @return user instance, never null\n   * @throws NullPointerException when {@code name} is null\n   * @throws NotFoundException when user with such {@code name} doesn't exist\n   * @throws ServerException when any other error occurs\n   */\n  UserImpl getByName(String name) throws NotFoundException, ServerException;\n\n  /**\n   * Finds user by his email.\n   *\n   * @param email user email\n   * @return user instance, never null\n   * @throws NullPointerException when {@code email} is null\n   * @throws NotFoundException when user with such {@code email} doesn't exist\n   * @throws ServerException when any other error occurs\n   */\n  UserImpl getByEmail(String email) throws NotFoundException, ServerException;\n\n  /**\n   * Gets all users from persistent layer.\n   *\n   * @param maxItems the maximum number of users to return\n   * @param skipCount the number of users to skip\n   * @return list of users POJO or empty list if no users were found\n   * @throws IllegalArgumentException when {@code maxItems} or {@code skipCount} is negative\n   * @throws ServerException when any other error occurs\n   */\n  Page<UserImpl> getAll(int maxItems, long skipCount) throws ServerException;\n\n  /**\n   * Returns all users whose name contains(case insensitively) specified {@code namePart}.\n   *\n   * @param namePart fragment of user's name\n   * @param maxItems the maximum number of users to return\n   * @param skipCount the number of users to skip\n   * @return list of matched users\n   * @throws NullPointerException when {@code namePart} is null\n   * @throws IllegalArgumentException when {@code maxItems} or {@code skipCount} is negative or when\n   *     {@code skipCount} more than {@value Integer#MAX_VALUE}\n   * @throws ServerException when any other error occurs\n   */\n  Page<UserImpl> getByNamePart(String namePart, int maxItems, long skipCount)\n      throws ServerException;\n\n  /**\n   * Returns all users whose email address contains(case insensitively) specified {@code emailPart}.\n   *\n   * <p>For example if email fragment would be 'CHE' then result of search will include the\n   * following:\n   *\n   * <pre>\n   *  |        emails          |  result  |\n   *  | Cherkassy@example.com  |    +     |\n   *  | preacher@example.com   |    +     |\n   *  | user@ukr.che           |    +     |\n   *  | johny@example.com      |    -     |\n   *  | CoachEddie@example.com |    +     |\n   * </pre>\n   *\n   * @param emailPart fragment of user's email\n   * @param maxItems the maximum number of users to return\n   * @param skipCount the number of users to skip\n   * @return list of matched users\n   * @throws NullPointerException when {@code emailPart} is null\n   * @throws IllegalArgumentException when {@code maxItems} or {@code skipCount} is negative or when\n   *     {@code skipCount} more than {@value Integer#MAX_VALUE}\n   * @throws ServerException when any other error occurs\n   */\n  Page<UserImpl> getByEmailPart(String emailPart, int maxItems, long skipCount)\n      throws ServerException;\n\n  /**\n   * Get count of all users from persistent layer.\n   *\n   * @return user count\n   * @throws ServerException when any error occurs\n   */\n  long getTotalCount() throws ServerException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/PreferenceManagerTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport static java.util.Arrays.asList;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.user.server.spi.PreferenceDao;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Ignore;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@link PreferenceManager}.\n *\n * @author Yevhenii Voevodin.\n */\n@Listeners(MockitoTestNGListener.class)\npublic class PreferenceManagerTest {\n\n  @Mock private PreferenceDao preferenceDao;\n\n  @InjectMocks private PreferenceManager preferenceManager;\n\n  @Captor private ArgumentCaptor<Map<String, String>> preferencesCaptor;\n\n  @Test\n  public void shouldUseMergeStrategyForPreferencesUpdate() throws Exception {\n    // Preparing preferences\n    final Map<String, String> existingPreferences = new HashMap<>();\n    existingPreferences.put(\"pKey1\", \"pValue1\");\n    existingPreferences.put(\"pKey2\", \"pValue2\");\n    existingPreferences.put(\"pKey3\", \"pValue3\");\n    existingPreferences.put(\"pKey4\", \"pValue4\");\n    when(preferenceDao.getPreferences(any())).thenReturn(existingPreferences);\n\n    // Updating preferences\n    final Map<String, String> newPreferences = new HashMap<>();\n    newPreferences.put(\"pKey5\", \"pValue5\");\n    newPreferences.put(\"pKey1\", \"new-value\");\n    preferenceManager.update(\"user123\", newPreferences);\n\n    // Checking\n    verify(preferenceDao).setPreferences(anyString(), preferencesCaptor.capture());\n    assertEquals(\n        preferencesCaptor.getValue(),\n        ImmutableMap.of(\n            \"pKey1\", \"new-value\",\n            \"pKey2\", \"pValue2\",\n            \"pKey3\", \"pValue3\",\n            \"pKey4\", \"pValue4\",\n            \"pKey5\", \"pValue5\"));\n  }\n\n  @Test\n  public void shouldRemoveSpecifiedPreferences() throws Exception {\n    // Preparing preferences\n    final Map<String, String> existingPreferences = new HashMap<>();\n    existingPreferences.put(\"pKey1\", \"pValue1\");\n    existingPreferences.put(\"pKey2\", \"pValue2\");\n    existingPreferences.put(\"pKey3\", \"pValue3\");\n    existingPreferences.put(\"pKey4\", \"pValue4\");\n    when(preferenceDao.getPreferences(any())).thenReturn(existingPreferences);\n\n    // Removing\n    preferenceManager.remove(\"user123\", asList(\"pKey1\", \"pKey5\", \"odd-pref-name\"));\n\n    // Checking\n    verify(preferenceDao).setPreferences(anyString(), preferencesCaptor.capture());\n    assertEquals(\n        preferencesCaptor.getValue(),\n        ImmutableMap.of(\n            \"pKey2\", \"pValue2\",\n            \"pKey3\", \"pValue3\",\n            \"pKey4\", \"pValue4\"));\n  }\n\n  @Test\n  @Ignore\n  public void shouldGetPreferencesByUser() throws Exception {\n    final Map<String, String> preferences = ImmutableMap.of(\"name\", \"value\");\n    when(preferenceDao.getPreferences(\"user123\")).thenReturn(preferences);\n\n    assertEquals(preferenceManager.find(\"user123\"), preferences);\n  }\n\n  @Test\n  @Ignore\n  public void shouldGetPreferencesByUserAndFilter() throws Exception {\n    final Map<String, String> preferences = ImmutableMap.of(\"name\", \"value\");\n    when(preferenceDao.getPreferences(\"user123\", \"name.*\")).thenReturn(preferences);\n\n    assertEquals(preferenceManager.find(\"user123\", \"name.*\"), preferences);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void getPreferencesShouldThrowNpeWhenUserIdIsNull() throws Exception {\n    preferenceManager.find(null);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void getPreferencesByUserAndFilterShouldThrowNpeWhenUserIdIsNull() throws Exception {\n    preferenceManager.find(null, \"name.*\");\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNpeWhenRemovingPreferencesAndUserIdIsNull() throws Exception {\n    preferenceManager.remove(null);\n  }\n\n  @Test\n  public void shouldRemoveUserPreferences() throws Exception {\n    preferenceManager.remove(\"user123\");\n\n    verify(preferenceDao).remove(\"user123\");\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNpeWhenSavePreferencesWithNullUser() throws Exception {\n    preferenceManager.save(null, Collections.emptyMap());\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNpeWhenSavePreferencesWithNullPreferences() throws Exception {\n    preferenceManager.save(\"user123\", null);\n  }\n\n  @Test\n  public void shouldSavePreferences() throws Exception {\n    preferenceManager.save(\"user123\", Collections.emptyMap());\n\n    verify(preferenceDao).setPreferences(\"user123\", Collections.emptyMap());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/ProfileManagerTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport org.eclipse.che.api.user.server.model.impl.ProfileImpl;\nimport org.eclipse.che.api.user.server.spi.ProfileDao;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@link ProfileManager}.\n *\n * @author Yevhenii Voevodin\n */\n@Listeners(MockitoTestNGListener.class)\npublic class ProfileManagerTest {\n\n  @Mock private ProfileDao profileDao;\n\n  @InjectMocks private ProfileManager profileManager;\n\n  @Test\n  public void shouldGetProfileById() throws Exception {\n    final ProfileImpl profile = new ProfileImpl(\"user123\");\n    when(profileDao.getById(profile.getUserId())).thenReturn(profile);\n\n    assertEquals(profile, profileManager.getById(profile.getUserId()));\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNpeWhenGettingProfileByNullId() throws Exception {\n    profileManager.getById(null);\n  }\n\n  @Test\n  public void shouldCreateProfile() throws Exception {\n    final ProfileImpl profile = new ProfileImpl(\"user123\");\n\n    profileManager.create(profile);\n\n    final ArgumentCaptor<ProfileImpl> captor = ArgumentCaptor.forClass(ProfileImpl.class);\n    verify(profileDao).create(captor.capture());\n    assertEquals(captor.getValue(), profile);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNpeWhenCreatingNullProfile() throws Exception {\n    profileManager.create(null);\n  }\n\n  @Test\n  public void shouldUpdateProfile() throws Exception {\n    final ProfileImpl profile = new ProfileImpl(\"user123\");\n\n    profileManager.update(profile);\n\n    final ArgumentCaptor<ProfileImpl> captor = ArgumentCaptor.forClass(ProfileImpl.class);\n    verify(profileDao).update(captor.capture());\n    assertEquals(captor.getValue(), profile);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNpeWhenUpdatingNull() throws Exception {\n    profileManager.update(null);\n  }\n\n  @Test\n  public void shouldRemoveProfile() throws Exception {\n    profileManager.remove(\"user123\");\n\n    verify(profileDao).remove(\"user123\");\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNpeWhenRemovingNull() throws Exception {\n    profileManager.remove(null);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/UserManagerTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\n\nimport java.util.Arrays;\nimport java.util.Collections;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.user.server.model.impl.UserImpl;\nimport org.eclipse.che.api.user.server.spi.PreferenceDao;\nimport org.eclipse.che.api.user.server.spi.ProfileDao;\nimport org.eclipse.che.api.user.server.spi.UserDao;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Ignore;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@link UserManager}.\n *\n * @author Max Shaposhnik (mshaposhnik@codenvy.com)\n * @author Yevhenii Voevodin\n */\n@Listeners(MockitoTestNGListener.class)\npublic class UserManagerTest {\n\n  @Mock private UserDao userDao;\n  @Mock private ProfileDao profileDao;\n  @Mock private PreferenceDao preferencesDao;\n  @Mock private EventService eventService;\n\n  private UserManager manager;\n\n  @BeforeMethod\n  public void setUp() {\n    manager =\n        new UserManager(\n            userDao, profileDao, preferencesDao, eventService, new String[] {\"reserved\"});\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNpeWhenUpdatingUserWithNullEntity() throws Exception {\n    manager.update(null);\n  }\n\n  @Test\n  public void shouldUpdateUser() throws Exception {\n    final UserImpl user =\n        new UserImpl(\n            \"identifier\", \"test@email.com\", \"testName\", \"password\", Collections.emptyList());\n    UserImpl user2 = new UserImpl(user);\n    user2.setName(\"testName2\");\n    manager.update(user2);\n\n    verify(userDao).update(new UserImpl(user2));\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrownNpeWhenTryingToGetUserByNullId() throws Exception {\n    manager.getById(null);\n  }\n\n  @Test\n  public void shouldGetUserById() throws Exception {\n    final User user =\n        new UserImpl(\n            \"identifier\",\n            \"test@email.com\",\n            \"testName\",\n            \"password\",\n            Collections.singletonList(\"alias\"));\n    when(manager.getById(user.getId())).thenReturn(user);\n\n    assertEquals(manager.getById(user.getId()), user);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrownNpeWhenTryingToGetUserByNullAlias() throws Exception {\n    manager.getByAlias(null);\n  }\n\n  @Test\n  public void shouldGetUserByAlias() throws Exception {\n    final User user =\n        new UserImpl(\n            \"identifier\",\n            \"test@email.com\",\n            \"testName\",\n            \"password\",\n            Collections.singletonList(\"alias\"));\n    when(manager.getByAlias(\"alias\")).thenReturn(user);\n\n    assertEquals(manager.getByAlias(\"alias\"), user);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrownNpeWhenTryingToGetUserByNullName() throws Exception {\n    manager.getByName(null);\n  }\n\n  @Test\n  public void shouldGetUserByName() throws Exception {\n    final User user =\n        new UserImpl(\n            \"identifier\",\n            \"test@email.com\",\n            \"testName\",\n            \"password\",\n            Collections.singletonList(\"alias\"));\n    when(manager.getByName(user.getName())).thenReturn(user);\n\n    assertEquals(manager.getByName(user.getName()), user);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrownNpeWhenTryingToGetUserWithNullEmail() throws Exception {\n    manager.getByEmail(null);\n  }\n\n  @Test\n  public void shouldGetUserByEmail() throws Exception {\n    final User user =\n        new UserImpl(\n            \"identifier\",\n            \"test@email.com\",\n            \"testName\",\n            \"password\",\n            Collections.singletonList(\"alias\"));\n    when(manager.getByEmail(user.getEmail())).thenReturn(user);\n\n    assertEquals(manager.getByEmail(user.getEmail()), user);\n  }\n\n  @Test\n  public void shouldGetTotalUserCount() throws Exception {\n    when(userDao.getTotalCount()).thenReturn(5L);\n\n    assertEquals(manager.getTotalCount(), 5);\n    verify(userDao).getTotalCount();\n  }\n\n  @Test\n  public void shouldGetAllUsers() throws Exception {\n    final Page users =\n        new Page(\n            Arrays.asList(\n                new UserImpl(\n                    \"identifier1\",\n                    \"test1@email.com\",\n                    \"testName1\",\n                    \"password\",\n                    Collections.singletonList(\"alias1\")),\n                new UserImpl(\n                    \"identifier2\",\n                    \"test2@email.com\",\n                    \"testName2\",\n                    \"password\",\n                    Collections.singletonList(\"alias2\")),\n                new UserImpl(\n                    \"identifier3\",\n                    \"test3@email.com\",\n                    \"testName3\",\n                    \"password\",\n                    Collections.singletonList(\"alias3\"))),\n            0,\n            30,\n            3);\n    when(userDao.getAll(30, 0)).thenReturn(users);\n\n    assertEquals(manager.getAll(30, 0), users);\n    verify(userDao).getAll(30, 0);\n  }\n\n  @Test(expectedExceptions = IllegalArgumentException.class)\n  public void shouldThrowIllegalArgumentExceptionsWhenGetAllUsersWithNegativeMaxItems()\n      throws Exception {\n    manager.getAll(-5, 0);\n  }\n\n  @Test(expectedExceptions = IllegalArgumentException.class)\n  public void shouldThrowIllegalArgumentExceptionsWhenGetAllUsersWithNegativeSkipCount()\n      throws Exception {\n    manager.getAll(30, -11);\n  }\n\n  @Test(expectedExceptions = NullPointerException.class)\n  public void shouldThrowNpeWhenRemovingUserByNullId() throws Exception {\n    manager.remove(null);\n  }\n\n  @Test\n  public void shouldRemoveUser() throws Exception {\n    manager.remove(\"user123\");\n\n    verify(userDao).remove(\"user123\");\n  }\n\n  @Test(expectedExceptions = ConflictException.class)\n  public void shouldThrowConflictExceptionOnCreationIfUserNameIsReserved() throws Exception {\n    final User user = new UserImpl(\"id\", \"test@email.com\", \"reserved\");\n\n    manager.create(user, false);\n  }\n\n  @Test\n  public void shouldBeAbleToGetOrCreate_existed() throws Exception {\n    // when\n    User actual = manager.getOrCreateUser(\"identifier\", \"testName@che\", \"testName\");\n\n    // then\n    assertNotNull(actual);\n    assertEquals(actual.getEmail(), \"testName@che\");\n    assertEquals(actual.getId(), \"identifier\");\n    assertEquals(actual.getName(), \"testName\");\n  }\n\n  @Test\n  public void shouldBeAbleToGetOrCreate_nonexisted() throws Exception {\n    // when\n    User actual = manager.getOrCreateUser(\"identifier\", \"testName@che\", \"testName\");\n    // then\n    assertNotNull(actual);\n    assertEquals(actual.getEmail(), \"testName@che\");\n    assertEquals(actual.getId(), \"identifier\");\n    assertEquals(actual.getName(), \"testName\");\n  }\n\n  @Ignore\n  @Test\n  public void shouldBeAbleToGetOrCreateWithoutEmail_existed() throws Exception {\n    // given\n    final User user =\n        new UserImpl(\n            \"identifier\",\n            \"test@email.com\",\n            \"testName\",\n            \"password\",\n            Collections.singletonList(\"alias\"));\n    when(manager.getById(user.getId())).thenReturn(user);\n\n    // when\n    User actual = manager.getOrCreateUser(\"identifier\", \"testName\");\n\n    // then\n    assertNotNull(actual);\n    assertEquals(actual.getEmail(), \"test@email.com\");\n    assertEquals(actual.getId(), \"identifier\");\n    assertEquals(actual.getName(), \"testName\");\n  }\n\n  @Ignore\n  @Test\n  public void shouldBeAbleToGetOrCreateWithoutEmail_nonexisted() throws Exception {\n    // given\n    when(manager.getById(\"identifier\")).thenThrow(NotFoundException.class);\n\n    // when\n    User actual = manager.getOrCreateUser(\"identifier\", \"testName\");\n    // then\n    assertNotNull(actual);\n    assertEquals(actual.getEmail(), \"testName@che\");\n    assertEquals(actual.getId(), \"identifier\");\n    assertEquals(actual.getName(), \"testName\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/UserValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.server;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport org.eclipse.che.account.spi.AccountValidator;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests of {@link UserValidator}.\n *\n * @author Sergii Leschenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class UserValidatorTest {\n\n  @Mock private AccountValidator accountValidator;\n\n  @InjectMocks private UserValidator userNameValidator;\n\n  @Test\n  public void shouldReturnNameNormalizedByAccountValidator() throws Exception {\n    when(accountValidator.normalizeAccountName(anyString(), anyString())).thenReturn(\"testname\");\n\n    assertEquals(userNameValidator.normalizeUserName(\"toNormalize\"), \"testname\");\n    verify(accountValidator)\n        .normalizeAccountName(\"toNormalize\", UserValidator.GENERATED_NAME_PREFIX);\n  }\n\n  @Test\n  public void shouldReturnTrueWhenInputIsValidAccountName() throws Exception {\n    when(accountValidator.isValidName(any())).thenReturn(true);\n\n    assertEquals(userNameValidator.isValidName(\"toTest\"), true);\n    verify(accountValidator).isValidName(\"toTest\");\n  }\n\n  @Test\n  public void shouldReturnFalseWhenInputIsInvalidAccountName() throws Exception {\n    when(accountValidator.isValidName(any())).thenReturn(false);\n\n    assertEquals(userNameValidator.isValidName(\"toTest\"), false);\n    verify(accountValidator).isValidName(\"toTest\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user/src/test/resources/META-INF/services/org.eclipse.che.commons.test.tck.TckModule",
    "content": "org.eclipse.che.api.user.server.jpa.JpaTckModule\n"
  },
  {
    "path": "wsmaster/che-core-api-user-shared/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-user-shared</artifactId>\n    <name>Che Core :: API :: User :: Shared</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.swagger.core.v3</groupId>\n            <artifactId>swagger-annotations-jakarta</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-user-shared</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n                <configuration>\n                    <dtoPackages>\n                        <package>org.eclipse.che.api.user.shared.dto</package>\n                    </dtoPackages>\n                    <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                    <genClassName>org.eclipse.che.api.user.server.dto.DtoServerImpls</genClassName>\n                    <impl>server</impl>\n                </configuration>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-resource</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-user-shared/src/main/java/org/eclipse/che/api/user/shared/dto/ProfileDto.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.shared.dto;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.user.Profile;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * This object used for transporting profile data to/from client.\n *\n * @author Yevhenii Voevodin\n * @see Profile\n * @see DtoFactory\n */\n@DTO\npublic interface ProfileDto extends Profile {\n\n  void setUserId(String id);\n\n  @Schema(description = \"Profile ID\")\n  String getUserId();\n\n  ProfileDto withUserId(String id);\n\n  @Schema(description = \"Profile attributes\")\n  Map<String, String> getAttributes();\n\n  void setAttributes(Map<String, String> attributes);\n\n  ProfileDto withAttributes(Map<String, String> attributes);\n\n  List<Link> getLinks();\n\n  void setLinks(List<Link> links);\n\n  ProfileDto withLinks(List<Link> links);\n\n  String getEmail();\n\n  ProfileDto withEmail(String email);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-user-shared/src/main/java/org/eclipse/che/api/user/shared/dto/UserDto.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.user.shared.dto;\n\nimport io.swagger.v3.oas.annotations.media.ArraySchema;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport java.util.List;\nimport org.eclipse.che.api.core.model.user.User;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * This object used for transporting user data to/from client.\n *\n * @author Yevhenii Voevodin\n * @see User\n * @see DtoFactory\n */\n@DTO\npublic interface UserDto extends User {\n  @Schema(description = \"User ID\")\n  String getId();\n\n  void setId(String id);\n\n  UserDto withId(String id);\n\n  @ArraySchema(\n      schema =\n          @Schema(\n              implementation = String.class,\n              description = \"User alias which is used for OAuth\"))\n  List<String> getAliases();\n\n  void setAliases(List<String> aliases);\n\n  UserDto withAliases(List<String> aliases);\n\n  @Schema(description = \"User email\")\n  String getEmail();\n\n  void setEmail(String email);\n\n  UserDto withEmail(String email);\n\n  @Schema(description = \"User name\")\n  String getName();\n\n  void setName(String name);\n\n  UserDto withName(String name);\n\n  @Schema(description = \"User password\")\n  String getPassword();\n\n  void setPassword(String password);\n\n  UserDto withPassword(String password);\n\n  List<Link> getLinks();\n\n  void setLinks(List<Link> links);\n\n  UserDto withLinks(List<Link> links);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-workspace</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Workspace</name>\n    <properties>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.dataformat</groupId>\n            <artifactId>jackson-dataformat-yaml</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject</groupId>\n            <artifactId>guice</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-assistedinject</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.annotation</groupId>\n            <artifactId>jakarta.annotation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.inject</groupId>\n            <artifactId>jakarta.inject-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.validation</groupId>\n            <artifactId>jakarta.validation-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-account</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-workspace-shared</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-lang</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-observability</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.leadpony.justify</groupId>\n            <artifactId>justify</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.google.inject.extensions</groupId>\n            <artifactId>guice-persist</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.websocket</groupId>\n            <artifactId>jakarta.websocket-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.ws.rs</groupId>\n            <artifactId>jakarta.ws.rs-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>jakarta.persistence</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.core</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-ssh</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-sql-schema</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>org.eclipse.persistence.jpa</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-assured</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.everrest</groupId>\n            <artifactId>everrest-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.flywaydb</groupId>\n            <artifactId>flyway-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.hamcrest</groupId>\n            <artifactId>hamcrest</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Mock testing -->\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Mock testing of REST services -->\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- Test dependencies -->\n        <dependency>\n            <groupId>org.testng</groupId>\n            <artifactId>testng</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <!-- Create the test jar -->\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>test-jar</goal>\n                        </goals>\n                        <configuration>\n                            <includes>\n                                <include>**/spi/tck/*.*</include>\n                            </includes>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/DefaultWorkspaceLockService.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport com.google.inject.Singleton;\nimport org.eclipse.che.commons.lang.concurrent.StripedLocks;\nimport org.eclipse.che.commons.lang.concurrent.Unlocker;\n\n/**\n * Default implementation of {@link WorkspaceLockService} that uses {@link StripedLocks}.\n *\n * @author Anton Korneta\n */\n@Singleton\npublic class DefaultWorkspaceLockService implements WorkspaceLockService {\n  private final StripedLocks delegate;\n\n  public DefaultWorkspaceLockService() {\n    this.delegate = new StripedLocks(16);\n  }\n\n  @Override\n  public Unlocker readLock(String key) {\n    return delegate.readLock(key);\n  }\n\n  @Override\n  public Unlocker writeLock(String key) {\n    return delegate.writeLock(key);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/DefaultWorkspaceStatusCache.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\n\n/**\n * Default implementation of {@link WorkspaceStatusCache} based on {@link ConcurrentHashMap}.\n *\n * @author Anton Korneta\n */\npublic class DefaultWorkspaceStatusCache implements WorkspaceStatusCache {\n\n  private final ConcurrentHashMap<String, WorkspaceStatus> delegate = new ConcurrentHashMap<>();\n\n  @Override\n  public WorkspaceStatus get(String workspaceId) {\n    return delegate.get(workspaceId);\n  }\n\n  @Override\n  public WorkspaceStatus replace(String workspaceId, WorkspaceStatus newStatus) {\n    return delegate.replace(workspaceId, newStatus);\n  }\n\n  @Override\n  public boolean replace(\n      String workspaceId, WorkspaceStatus prevStatus, WorkspaceStatus newStatus) {\n    return delegate.replace(workspaceId, prevStatus, newStatus);\n  }\n\n  @Override\n  public WorkspaceStatus remove(String workspaceId) {\n    return delegate.remove(workspaceId);\n  }\n\n  @Override\n  public WorkspaceStatus putIfAbsent(String workspaceId, WorkspaceStatus status) {\n    return delegate.putIfAbsent(workspaceId, status);\n  }\n\n  @Override\n  public Map<String, WorkspaceStatus> asMap() {\n    return new HashMap<>(delegate);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/DtoConverter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport static java.util.stream.Collectors.toList;\nimport static java.util.stream.Collectors.toMap;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.Runtime;\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.api.core.model.workspace.Workspace;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceConfig;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.config.Environment;\nimport org.eclipse.che.api.core.model.workspace.config.MachineConfig;\nimport org.eclipse.che.api.core.model.workspace.config.ProjectConfig;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.config.SourceStorage;\nimport org.eclipse.che.api.core.model.workspace.config.Volume;\nimport org.eclipse.che.api.core.model.workspace.devfile.Action;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.api.core.model.workspace.devfile.Devfile;\nimport org.eclipse.che.api.core.model.workspace.devfile.Endpoint;\nimport org.eclipse.che.api.core.model.workspace.devfile.Entrypoint;\nimport org.eclipse.che.api.core.model.workspace.devfile.Env;\nimport org.eclipse.che.api.core.model.workspace.devfile.Metadata;\nimport org.eclipse.che.api.core.model.workspace.devfile.PreviewUrl;\nimport org.eclipse.che.api.core.model.workspace.devfile.Project;\nimport org.eclipse.che.api.core.model.workspace.devfile.Source;\nimport org.eclipse.che.api.core.model.workspace.runtime.Machine;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\nimport org.eclipse.che.api.workspace.shared.dto.CommandDto;\nimport org.eclipse.che.api.workspace.shared.dto.EnvironmentDto;\nimport org.eclipse.che.api.workspace.shared.dto.MachineConfigDto;\nimport org.eclipse.che.api.workspace.shared.dto.MachineDto;\nimport org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto;\nimport org.eclipse.che.api.workspace.shared.dto.RecipeDto;\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeDto;\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeIdentityDto;\nimport org.eclipse.che.api.workspace.shared.dto.ServerConfigDto;\nimport org.eclipse.che.api.workspace.shared.dto.ServerDto;\nimport org.eclipse.che.api.workspace.shared.dto.SourceStorageDto;\nimport org.eclipse.che.api.workspace.shared.dto.VolumeDto;\nimport org.eclipse.che.api.workspace.shared.dto.WarningDto;\nimport org.eclipse.che.api.workspace.shared.dto.WorkspaceConfigDto;\nimport org.eclipse.che.api.workspace.shared.dto.WorkspaceDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.ComponentDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.DevfileActionDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.DevfileCommandDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.DevfileDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.DevfileVolumeDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.EndpointDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.EntrypointDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.EnvDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.MetadataDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.PreviewUrlDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.ProjectDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.SourceDto;\n\n/**\n * Helps to convert to/from DTOs related to workspace.\n *\n * @author Yevhenii Voevodin\n */\npublic final class DtoConverter {\n\n  /** Converts {@link Workspace} to {@link WorkspaceDto}. */\n  public static WorkspaceDto asDto(Workspace workspace) {\n    WorkspaceDto workspaceDto =\n        newDto(WorkspaceDto.class)\n            .withId(workspace.getId())\n            .withStatus(workspace.getStatus())\n            .withNamespace(workspace.getNamespace())\n            .withTemporary(workspace.isTemporary())\n            .withAttributes(workspace.getAttributes());\n\n    if (workspace.getConfig() != null) {\n      workspaceDto.setConfig(asDto(workspace.getConfig()));\n    }\n\n    if (workspace.getDevfile() != null) {\n      workspaceDto.setDevfile(asDto(workspace.getDevfile()));\n    }\n\n    if (workspace.getRuntime() != null) {\n      RuntimeDto runtime = asDto(workspace.getRuntime());\n      workspaceDto.setRuntime(runtime);\n    }\n\n    return workspaceDto;\n  }\n\n  public static DevfileDto asDto(Devfile devfile) {\n    List<DevfileCommandDto> commands =\n        devfile.getCommands().stream().map(DtoConverter::asDto).collect(toList());\n    List<ComponentDto> components =\n        devfile.getComponents().stream().map(DtoConverter::asDto).collect(toList());\n    List<ProjectDto> projects =\n        devfile.getProjects().stream().map(DtoConverter::asDto).collect(toList());\n    return newDto(DevfileDto.class)\n        .withApiVersion(devfile.getApiVersion())\n        .withCommands(commands)\n        .withComponents(components)\n        .withProjects(projects)\n        .withAttributes(devfile.getAttributes())\n        .withMetadata(asDto(devfile.getMetadata()));\n  }\n\n  private static ProjectDto asDto(Project project) {\n    Source source = project.getSource();\n    return newDto(ProjectDto.class)\n        .withName(project.getName())\n        .withClonePath(project.getClonePath())\n        .withSource(\n            newDto(SourceDto.class)\n                .withType(source.getType())\n                .withLocation(source.getLocation())\n                .withBranch(source.getBranch())\n                .withStartPoint(source.getStartPoint())\n                .withTag(source.getTag())\n                .withCommitId(source.getCommitId())\n                .withSparseCheckoutDir(source.getSparseCheckoutDir()));\n  }\n\n  private static ComponentDto asDto(Component component) {\n    return newDto(ComponentDto.class)\n        .withType(component.getType())\n        .withAlias(component.getAlias())\n        .withAutomountWorkspaceSecrets(component.getAutomountWorkspaceSecrets())\n        // chePlugin/cheEditor\n        .withId(component.getId())\n        .withRegistryUrl(component.getRegistryUrl())\n        // chePlugin\n        .withPreferences(component.getPreferences())\n        // dockerimage\n        .withImage(component.getImage())\n        .withMemoryLimit(component.getMemoryLimit())\n        .withMemoryRequest(component.getMemoryRequest())\n        .withCpuLimit(component.getCpuLimit())\n        .withCpuRequest(component.getCpuRequest())\n        .withCommand(component.getCommand())\n        .withArgs(component.getArgs())\n        .withEndpoints(component.getEndpoints().stream().map(DtoConverter::asDto).collect(toList()))\n        .withEnv(component.getEnv().stream().map(DtoConverter::asDto).collect(toList()))\n        .withMountSources(component.getMountSources())\n        .withVolumes(component.getVolumes().stream().map(DtoConverter::asDto).collect(toList()))\n        // k8s/os\n        .withReference(component.getReference())\n        .withReferenceContent(component.getReferenceContent())\n        .withSelector(component.getSelector())\n        .withEntrypoints(\n            component.getEntrypoints().stream().map(DtoConverter::asDto).collect(toList()));\n  }\n\n  private static EntrypointDto asDto(Entrypoint entrypoint) {\n    return newDto(EntrypointDto.class)\n        .withContainerName(entrypoint.getContainerName())\n        .withParentName(entrypoint.getParentName())\n        .withParentSelector(entrypoint.getParentSelector())\n        .withCommand(entrypoint.getCommand())\n        .withArgs(entrypoint.getArgs());\n  }\n\n  private static DevfileVolumeDto asDto(\n      org.eclipse.che.api.core.model.workspace.devfile.Volume volume) {\n    return newDto(DevfileVolumeDto.class)\n        .withName(volume.getName())\n        .withContainerPath(volume.getContainerPath());\n  }\n\n  private static EnvDto asDto(Env env) {\n    return newDto(EnvDto.class).withName(env.getName()).withValue(env.getValue());\n  }\n\n  private static EndpointDto asDto(Endpoint endpoint) {\n    return newDto(EndpointDto.class)\n        .withName(endpoint.getName())\n        .withPort(endpoint.getPort())\n        .withAttributes(endpoint.getAttributes());\n  }\n\n  private static DevfileCommandDto asDto(\n      org.eclipse.che.api.core.model.workspace.devfile.Command command) {\n    List<DevfileActionDto> actions =\n        command.getActions().stream().map(DtoConverter::asDto).collect(toList());\n\n    DevfileCommandDto commandDto =\n        newDto(DevfileCommandDto.class)\n            .withName(command.getName())\n            .withActions(actions)\n            .withAttributes(command.getAttributes());\n\n    if (command.getPreviewUrl() != null) {\n      commandDto.setPreviewUrl(asDto(command.getPreviewUrl()));\n    }\n    return commandDto;\n  }\n\n  private static PreviewUrlDto asDto(PreviewUrl previewUrl) {\n    final PreviewUrlDto previewUrlDto = newDto(PreviewUrlDto.class);\n    if (previewUrl != null) {\n      if (previewUrl.getPath() != null) {\n        previewUrlDto.setPath(previewUrl.getPath());\n      }\n      if (previewUrl.getPort() != 0) {\n        previewUrlDto.setPort(previewUrl.getPort());\n      }\n    }\n    return previewUrlDto;\n  }\n\n  private static DevfileActionDto asDto(Action action) {\n    return newDto(DevfileActionDto.class)\n        .withComponent(action.getComponent())\n        .withType(action.getType())\n        .withWorkdir(action.getWorkdir())\n        .withCommand(action.getCommand())\n        .withReference(action.getReference())\n        .withReferenceContent(action.getReferenceContent());\n  }\n\n  /** Converts {@link WorkspaceConfig} to {@link WorkspaceConfigDto}. */\n  public static WorkspaceConfigDto asDto(WorkspaceConfig workspace) {\n    List<CommandDto> commands =\n        workspace.getCommands().stream().map(DtoConverter::asDto).collect(toList());\n    List<ProjectConfigDto> projects =\n        workspace.getProjects().stream().map(DtoConverter::asDto).collect(toList());\n    Map<String, EnvironmentDto> environments =\n        workspace.getEnvironments().entrySet().stream()\n            .collect(toMap(Map.Entry::getKey, entry -> asDto(entry.getValue())));\n\n    return newDto(WorkspaceConfigDto.class)\n        .withName(workspace.getName())\n        .withDefaultEnv(workspace.getDefaultEnv())\n        .withCommands(commands)\n        .withProjects(projects)\n        .withEnvironments(environments)\n        .withAttributes(workspace.getAttributes())\n        .withDescription(workspace.getDescription());\n  }\n\n  /** Converts {@link Command} to {@link CommandDto}. */\n  public static CommandDto asDto(Command command) {\n    return newDto(CommandDto.class)\n        .withName(command.getName())\n        .withCommandLine(command.getCommandLine())\n        .withType(command.getType())\n        .withAttributes(command.getAttributes());\n  }\n\n  /** Converts {@link ProjectConfig} to {@link ProjectConfigDto}. */\n  public static ProjectConfigDto asDto(ProjectConfig projectCfg) {\n    final ProjectConfigDto projectConfigDto =\n        newDto(ProjectConfigDto.class)\n            .withName(projectCfg.getName())\n            .withDescription(projectCfg.getDescription())\n            .withPath(projectCfg.getPath())\n            .withType(projectCfg.getType())\n            .withAttributes(projectCfg.getAttributes())\n            .withMixins(projectCfg.getMixins());\n    final SourceStorage source = projectCfg.getSource();\n    if (source != null) {\n      projectConfigDto.withSource(\n          newDto(SourceStorageDto.class)\n              .withLocation(source.getLocation())\n              .withType(source.getType())\n              .withParameters(source.getParameters()));\n    }\n    return projectConfigDto;\n  }\n\n  /** Converts {@link Environment} to {@link EnvironmentDto}. */\n  public static EnvironmentDto asDto(Environment env) {\n    final EnvironmentDto envDto = newDto(EnvironmentDto.class);\n    if (env.getMachines() != null) {\n      envDto.withMachines(\n          env.getMachines().entrySet().stream()\n              .collect(toMap(Map.Entry::getKey, entry -> asDto(entry.getValue()))));\n    }\n    if (env.getRecipe() != null) {\n      envDto.withRecipe(\n          newDto(RecipeDto.class)\n              .withType(env.getRecipe().getType())\n              .withContentType(env.getRecipe().getContentType())\n              .withLocation(env.getRecipe().getLocation())\n              .withContent(env.getRecipe().getContent()));\n    }\n    return envDto;\n  }\n\n  /** Converts {@link MachineConfig} to {@link MachineConfigDto}. */\n  public static MachineConfigDto asDto(MachineConfig machine) {\n    MachineConfigDto machineDto = newDto(MachineConfigDto.class);\n    if (machine.getServers() != null) {\n      machineDto.setServers(\n          machine.getServers().entrySet().stream()\n              .collect(toMap(Map.Entry::getKey, entry -> asDto(entry.getValue()))));\n    }\n    if (machine.getAttributes() != null) {\n      machineDto.setAttributes(machine.getAttributes());\n    }\n    if (machine.getVolumes() != null) {\n      machineDto.setVolumes(\n          machine.getVolumes().entrySet().stream()\n              .collect(toMap(Map.Entry::getKey, entry -> asDto(entry.getValue()))));\n    }\n    if (machine.getEnv() != null) {\n      machineDto.setEnv(machine.getEnv());\n    }\n    return machineDto;\n  }\n\n  /** Converts {@link ServerConfig} to {@link ServerConfigDto}. */\n  public static ServerConfigDto asDto(ServerConfig serverConf) {\n    return newDto(ServerConfigDto.class)\n        .withPort(serverConf.getPort())\n        .withProtocol(serverConf.getProtocol())\n        .withPath(serverConf.getPath())\n        .withAttributes(serverConf.getAttributes());\n  }\n\n  /** Converts {@link Runtime} to {@link RuntimeDto}. */\n  public static RuntimeDto asDto(Runtime runtime) {\n    if (runtime == null) {\n      return null;\n    }\n    RuntimeDto runtimeDto = newDto(RuntimeDto.class).withActiveEnv(runtime.getActiveEnv());\n    if (runtime.getMachines() != null) {\n      runtimeDto.setMachines(\n          runtime.getMachines().entrySet().stream()\n              .collect(toMap(Map.Entry::getKey, entry -> asDto(entry.getValue()))));\n    }\n    if (runtime.getWarnings() != null) {\n      runtimeDto.setWarnings(\n          runtime.getWarnings().stream().map(DtoConverter::asDto).collect(toList()));\n    }\n\n    if (runtime.getCommands() != null) {\n      runtimeDto.setCommands(\n          runtime.getCommands().stream().map(DtoConverter::asDto).collect(toList()));\n    }\n    return runtimeDto;\n  }\n\n  /** Converts {@link RuntimeIdentity} to {@link RuntimeIdentityDto}. */\n  public static RuntimeIdentityDto asDto(RuntimeIdentity identity) {\n    return newDto(RuntimeIdentityDto.class)\n        .withWorkspaceId(identity.getWorkspaceId())\n        .withEnvName(identity.getEnvName())\n        .withOwnerId(identity.getOwnerId());\n  }\n\n  /** Converts {@link Volume} to {@link VolumeDto}. */\n  public static VolumeDto asDto(Volume volume) {\n    return newDto(VolumeDto.class).withPath(volume.getPath());\n  }\n\n  /** Converts {@link Warning} to {@link WarningDto}. */\n  public static WarningDto asDto(Warning warning) {\n    return newDto(WarningDto.class).withCode(warning.getCode()).withMessage(warning.getMessage());\n  }\n\n  /** Converts {@link Server} to {@link ServerDto}. */\n  public static ServerDto asDto(Server server) {\n    return newDto(ServerDto.class)\n        .withUrl(server.getUrl())\n        .withStatus(server.getStatus())\n        .withAttributes(server.getAttributes());\n  }\n\n  /** Converts {@link Machine} to {@link MachineDto}. */\n  public static MachineDto asDto(Machine machine) {\n    MachineDto machineDto =\n        newDto(MachineDto.class)\n            .withAttributes(machine.getAttributes())\n            .withStatus(machine.getStatus());\n    if (machine.getServers() != null) {\n      machineDto.withServers(\n          machine.getServers().entrySet().stream()\n              .collect(toMap(Map.Entry::getKey, entry -> asDto(entry.getValue()))));\n    }\n    return machineDto;\n  }\n\n  /** Converts {@link Metadata} to {@link MetadataDto}. */\n  public static MetadataDto asDto(Metadata metadata) {\n    return newDto(MetadataDto.class)\n        .withName(metadata.getName())\n        .withGenerateName(metadata.getGenerateName());\n  }\n\n  private DtoConverter() {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/NoEnvironmentFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport java.util.List;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironment;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironmentFactory;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalMachineConfig;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalRecipe;\nimport org.eclipse.che.api.workspace.server.spi.environment.MachineConfigsValidator;\nimport org.eclipse.che.api.workspace.server.spi.environment.RecipeRetriever;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Fake environment factory for a case when sidecar-based workspace has no environment.\n *\n * @author Alexander Garagatyi\n */\npublic class NoEnvironmentFactory extends InternalEnvironmentFactory<InternalEnvironment> {\n\n  @Inject\n  public NoEnvironmentFactory(\n      RecipeRetriever recipeRetriever, MachineConfigsValidator machinesValidator) {\n    super(recipeRetriever, machinesValidator);\n  }\n\n  @Override\n  protected InternalEnvironment doCreate(\n      @Nullable InternalRecipe recipe,\n      Map<String, InternalMachineConfig> machines,\n      List<Warning> warnings)\n      throws InternalInfrastructureException {\n    if (recipe != null) {\n      throw new InternalInfrastructureException(\n          \"No environment factory doesn't accept non-null workspace recipes\");\n    }\n    return new NoEnvInternalEnvironment();\n  }\n\n  public static class NoEnvInternalEnvironment extends InternalEnvironment {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/PreviewUrlLinksVariableGenerator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport static org.eclipse.che.api.core.model.workspace.config.Command.PREVIEW_URL_ATTRIBUTE;\n\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl;\n\n/**\n * Helps to generate links for Preview URLs and update commands with these links.\n *\n * <p>For preview URLs, we need to include following data in {@link\n * org.eclipse.che.api.workspace.shared.dto.WorkspaceDto}:\n * <li>Map with final preview url links where keys are composed from prefix {@link\n *     PreviewUrlLinksVariableGenerator#PREVIEW_URL_VARIABLE_PREFIX}, modified command name and CRC\n *     hash.\n * <li>Each command that has defined Preview url must have attribute `previewUrl` referencing to\n *     correct key in the map in format that IDE will understand.\n */\n@Singleton\nclass PreviewUrlLinksVariableGenerator {\n\n  private static final String PREVIEW_URL_VARIABLE_PREFIX = \"previewurl/\";\n\n  /**\n   * Takes commands from given {@code workspace}. For all commands that have defined previewUrl,\n   * creates variable name in defined format and final preview url link. It updates the command so\n   * it's `previewUrl` attribute will contain variable in proper format. Method then returns map of\n   * all preview url links with these variables as keys:\n   *\n   * <pre>\n   *   links:\n   *     \"previewURl/run_123\": http://your.domain\n   *   command:\n   *     attributes:\n   *       previewUrl: '${previewUrl/run_123}/some/path'\n   * </pre>\n   *\n   * @return map of all <commandPreviewUrlVariable, previewUrlFullLink>\n   */\n  Map<String, String> genLinksMapAndUpdateCommands(WorkspaceImpl workspace, UriBuilder uriBuilder) {\n    if (workspace == null\n        || workspace.getRuntime() == null\n        || workspace.getRuntime().getCommands() == null\n        || uriBuilder == null) {\n      return Collections.emptyMap();\n    }\n\n    Map<String, String> links = new HashMap<>();\n    for (Command command : workspace.getRuntime().getCommands()) {\n      Map<String, String> commandAttributes = command.getAttributes();\n\n      if (command.getPreviewUrl() != null\n          && commandAttributes != null\n          && commandAttributes.containsKey(PREVIEW_URL_ATTRIBUTE)) {\n        String previewUrlLinkValue = createPreviewUrlLinkValue(uriBuilder, command);\n        String previewUrlLinkKey = createPreviewUrlLinkKey(command);\n        links.put(previewUrlLinkKey, previewUrlLinkValue);\n\n        commandAttributes.replace(\n            PREVIEW_URL_ATTRIBUTE,\n            formatAttributeValue(previewUrlLinkKey, command.getPreviewUrl().getPath()));\n      }\n    }\n    return links;\n  }\n\n  private String createPreviewUrlLinkValue(UriBuilder uriBuilder, Command command) {\n    UriBuilder previewUriBuilder =\n        uriBuilder.clone().host(command.getAttributes().get(PREVIEW_URL_ATTRIBUTE));\n    previewUriBuilder.replacePath(null);\n    return previewUriBuilder.build().toString();\n  }\n\n  /**\n   * Creates link key for given command in format\n   * `previewUrl/<commandName_withoutSpaces>_<hash(command.name)>`\n   */\n  private String createPreviewUrlLinkKey(Command command) {\n    return PREVIEW_URL_VARIABLE_PREFIX\n        + command.getName().replaceAll(\" \", \"\")\n        + \"_\"\n        + Math.abs(command.getName().hashCode());\n  }\n\n  private String formatAttributeValue(String var, String path) {\n    String previewUrlAttributeValue = \"${\" + var + \"}\";\n    if (path != null) {\n      previewUrlAttributeValue += path;\n    }\n    return previewUrlAttributeValue;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/SidecarToolingWorkspaceUtil.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport com.google.common.base.Strings;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceConfig;\nimport org.eclipse.che.api.workspace.shared.Constants;\n\n/**\n * Util class to deal with sidecar based workspaces.\n *\n * @author Alexander Garagatyi\n */\npublic class SidecarToolingWorkspaceUtil {\n\n  /**\n   * Checks whether provided workspace config attributes {@link WorkspaceConfig#getAttributes()}\n   * contains configuration of sidecars. <br>\n   * This indicates whether this workspace is Che6 or Che7 compatible.\n   */\n  public static boolean isSidecarBasedWorkspace(Map<String, String> attributes) {\n    boolean hasPlugins =\n        !Strings.isNullOrEmpty(\n            attributes.getOrDefault(Constants.WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE, null));\n    boolean hasEditor =\n        !Strings.isNullOrEmpty(\n            attributes.getOrDefault(Constants.WORKSPACE_TOOLING_EDITOR_ATTRIBUTE, null));\n    return hasPlugins || hasEditor;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/URLRewriter.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * System specific strategy for rewriting URLs to use in rewriting Servers, Hyperlinks, etc For\n * example in a case when machines supposed to be accessible via reverse Proxy.\n *\n * @author gazarenkov\n */\npublic interface URLRewriter {\n\n  /**\n   * Rewrites URL according to URL rewriting strategy rules. May depend on\n   * RuntimeIdentityImpl(workspace, owner,..) and name (some id) of this particular URL\n   *\n   * @param identity RuntimeIdentityImpl\n   * @param machineName symbolic name of the machine\n   * @param serverName symbolic name of the server\n   * @param url URL to rewrite\n   * @return rewritten URL (may be unchanged)\n   * @throws InfrastructureException if URL rewriting failed\n   */\n  String rewriteURL(\n      @Nullable RuntimeIdentity identity,\n      @Nullable String machineName,\n      @Nullable String serverName,\n      String url)\n      throws InfrastructureException;\n\n  /** No rewriting, just pass URL back */\n  class NoOpURLRewriter implements URLRewriter {\n\n    @Override\n    public String rewriteURL(\n        @Nullable RuntimeIdentity identity,\n        @Nullable String machineName,\n        @Nullable String serverName,\n        String url)\n        throws InfrastructureException {\n\n      return url;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceAttributeValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.ValidationException;\n\n/**\n * Adds an ability to extends logic of workspace attributes validation.\n *\n * <p>It may needed since attributes may be used as configuration storage by different components.\n * And that components may need to validate attributes.\n *\n * @author Sergii Leshchenko\n */\npublic interface WorkspaceAttributeValidator {\n\n  /**\n   * Validates if the specified workspace attributes does not contain invalid attributes according\n   * to implementors rules.\n   *\n   * @param attributes workspace attributes to validate\n   * @throws ValidationException when the specified workspace attributes is not valid\n   */\n  void validate(Map<String, String> attributes) throws ValidationException;\n\n  /**\n   * Validates if the specified workspace attributes can be updated with new values.\n   *\n   * <p>Note that this method must not allow updates that would not validate using the {@link\n   * #validate(Map)} method.\n   *\n   * <p>This check includes:\n   *\n   * <ul>\n   *   <li>format checking;\n   *   <li>checking if unmodifiable attributes are not changed,<br>\n   *       if they are two scenarios depending on the implementation:\n   *       <ul>\n   *         <li>error is thrown;\n   *         <li>the needed value is provisioned into update;\n   *       </ul>\n   * </ul>\n   *\n   * @param existing workspace attributes to validate\n   * @param update new workspace attributes\n   * @throws ValidationException when the specified workspace attributes is not valid\n   */\n  void validateUpdate(Map<String, String> existing, Map<String, String> update)\n      throws ValidationException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceEntityProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport jakarta.ws.rs.BadRequestException;\nimport jakarta.ws.rs.Consumes;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.WebApplicationException;\nimport jakarta.ws.rs.core.HttpHeaders;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.MultivaluedMap;\nimport jakarta.ws.rs.ext.MessageBodyReader;\nimport jakarta.ws.rs.ext.MessageBodyWriter;\nimport jakarta.ws.rs.ext.Provider;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.io.OutputStreamWriter;\nimport java.io.Writer;\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Type;\nimport java.nio.charset.StandardCharsets;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileParser;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.api.workspace.shared.dto.WorkspaceDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.DevfileDto;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * Entity provider for {@link WorkspaceDto}. Performs schema validation of devfile part of the\n * workspace before actual {@link DevfileDto} creation.\n *\n * @author Max Shaposhnyk\n */\n@Singleton\n@Provider\n@Produces({APPLICATION_JSON})\n@Consumes({APPLICATION_JSON})\npublic class WorkspaceEntityProvider\n    implements MessageBodyReader<WorkspaceDto>, MessageBodyWriter<WorkspaceDto> {\n\n  private DevfileParser devfileParser;\n  private ObjectMapper mapper = new ObjectMapper();\n\n  @Inject\n  public WorkspaceEntityProvider(DevfileParser devfileParser) {\n    this.devfileParser = devfileParser;\n  }\n\n  @Override\n  public boolean isReadable(\n      Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {\n    return type == WorkspaceDto.class;\n  }\n\n  @Override\n  public WorkspaceDto readFrom(\n      Class<WorkspaceDto> type,\n      Type genericType,\n      Annotation[] annotations,\n      MediaType mediaType,\n      MultivaluedMap<String, String> httpHeaders,\n      InputStream entityStream)\n      throws IOException, WebApplicationException {\n    try {\n      JsonNode wsNode = mapper.readTree(entityStream);\n      JsonNode devfileNode = wsNode.path(\"devfile\");\n      if (!devfileNode.isNull() && !devfileNode.isMissingNode()) {\n        devfileParser.parseJson(devfileNode.toString());\n      }\n      return DtoFactory.getInstance().createDtoFromJson(wsNode.toString(), WorkspaceDto.class);\n    } catch (DevfileFormatException e) {\n      throw new BadRequestException(e.getMessage());\n    } catch (IOException e) {\n      throw new WebApplicationException(e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public boolean isWriteable(\n      Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {\n    return WorkspaceDto.class.isAssignableFrom(type);\n  }\n\n  @Override\n  public long getSize(\n      WorkspaceDto workspaceDto,\n      Class<?> type,\n      Type genericType,\n      Annotation[] annotations,\n      MediaType mediaType) {\n    return -1;\n  }\n\n  @Override\n  public void writeTo(\n      WorkspaceDto workspaceDto,\n      Class<?> type,\n      Type genericType,\n      Annotation[] annotations,\n      MediaType mediaType,\n      MultivaluedMap<String, Object> httpHeaders,\n      OutputStream entityStream)\n      throws IOException, WebApplicationException {\n    httpHeaders.putSingle(HttpHeaders.CACHE_CONTROL, \"public, no-cache, no-store, no-transform\");\n    try (Writer w = new OutputStreamWriter(entityStream, StandardCharsets.UTF_8)) {\n      w.write(DtoFactory.getInstance().toJson(workspaceDto));\n      w.flush();\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceKeyValidator.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport static java.lang.String.format;\n\nimport org.eclipse.che.api.core.BadRequestException;\n\n/** Helper class to validate workspace composite keys. */\npublic class WorkspaceKeyValidator {\n\n  /**\n   * Checks that key consists either from workspaceId or username:workspace_name string.\n   *\n   * @param key key string to validate\n   * @throws BadRequestException if validation is failed\n   */\n  public static void validateKey(String key) throws BadRequestException {\n    String[] parts = key.split(\":\", -1); // -1 is to prevent skipping trailing part\n    switch (parts.length) {\n      case 1:\n        {\n          return; // consider it's id\n        }\n      case 2:\n        {\n          if (parts[1].isEmpty()) {\n            throw new BadRequestException(\n                \"Wrong composite key format - workspace name required to be set.\");\n          }\n          break;\n        }\n      default:\n        {\n          throw new BadRequestException(\n              format(\"Wrong composite key %s. Format should be 'username:workspace_name'. \", key));\n        }\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceLockService.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport org.eclipse.che.commons.lang.concurrent.Unlocker;\n\n/**\n * Defines an abstract synchronization mechanism for operations associated with workspaces.(e.g.\n * sync statuses and runtime states). Note that different Che assemblies can provide various\n * implementations of the locking mechanism, these implementations are not required to follow the\n * contract defined by {@link java.util.concurrent.locks.ReadWriteLock}. For ease of use, acquired\n * locks are wrapped in {@link Unlocker}.\n *\n * @author Anton Korneta\n */\npublic interface WorkspaceLockService {\n\n  /**\n   * Acquires lock by given key. Returned instance may follow the read lock contract defined in\n   * {@link java.util.concurrent.locks.ReadWriteLock}.\n   *\n   * @param key lock key\n   * @return lock instance wrapped in {@link Unlocker}\n   */\n  Unlocker readLock(String key);\n\n  /**\n   * Acquires lock by given key. Returned instance may follow the write lock contract defined in\n   * {@link java.util.concurrent.locks.ReadWriteLock}.\n   *\n   * @param key lock key\n   * @return lock instance wrapped in {@link Unlocker}\n   */\n  Unlocker writeLock(String key);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceSharedPool.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport com.google.inject.Inject;\nimport java.util.concurrent.Callable;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.TimeUnit;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler;\nimport org.eclipse.che.commons.lang.concurrent.ThreadLocalPropagateContext;\nimport org.eclipse.che.commons.observability.ExecutorServiceWrapper;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Provides a single non-daemon {@link ExecutorService} instance for workspace components.\n *\n * @author Yevhenii Voevodin\n */\n@Singleton\npublic class WorkspaceSharedPool {\n\n  private final ExecutorService executor;\n\n  @Inject\n  public WorkspaceSharedPool(ExecutorServiceWrapper wrapper) {\n\n    ThreadFactory factory =\n        new ThreadFactoryBuilder()\n            .setNameFormat(\"WorkspaceSharedPool-%d\")\n            .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance())\n            .setDaemon(false)\n            .build();\n\n    int size = Runtime.getRuntime().availableProcessors();\n\n    executor =\n        wrapper.wrap(\n            Executors.newFixedThreadPool(size, factory), WorkspaceSharedPool.class.getName());\n  }\n\n  /**\n   * Returns an {@link ExecutorService} managed by this pool instance. The executor service is\n   * tracing aware and will propagate the active tracing span, if any, to the submitted tasks.\n   */\n  public ExecutorService getExecutor() {\n    return executor;\n  }\n\n  /**\n   * Delegates call to {@link ExecutorService#execute(Runnable)} and propagates thread locals to it\n   * like defined by {@link ThreadLocalPropagateContext}.\n   */\n  public void execute(Runnable runnable) {\n    executor.execute(ThreadLocalPropagateContext.wrap(runnable));\n  }\n\n  /**\n   * Delegates call to {@link ExecutorService#submit(Callable)} and propagates thread locals to it\n   * like defined by {@link ThreadLocalPropagateContext}.\n   */\n  public <T> Future<T> submit(Callable<T> callable) {\n    return executor.submit(ThreadLocalPropagateContext.wrap(callable));\n  }\n\n  /**\n   * Asynchronously runs the given task wrapping it with {@link\n   * ThreadLocalPropagateContext#wrap(Runnable)}\n   *\n   * @param runnable task to run\n   * @return completable future bounded to the task\n   */\n  public CompletableFuture<Void> runAsync(Runnable runnable) {\n    return CompletableFuture.runAsync(ThreadLocalPropagateContext.wrap(runnable), executor);\n  }\n\n  /** Terminates this pool if it's not terminated yet. */\n  void shutdown() {\n    if (!executor.isShutdown()) {\n      Logger logger = LoggerFactory.getLogger(getClass());\n      executor.shutdown();\n      try {\n        logger.info(\"Shutdown workspace threads pool, wait 30s to stop normally\");\n        if (!executor.awaitTermination(30, TimeUnit.SECONDS)) {\n          executor.shutdownNow();\n          logger.info(\"Interrupt workspace threads pool, wait 60s to stop\");\n          if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {\n            logger.error(\"Couldn't shutdown workspace threads pool\");\n          }\n        }\n      } catch (InterruptedException x) {\n        executor.shutdownNow();\n        Thread.currentThread().interrupt();\n      }\n      logger.info(\"Workspace threads pool is terminated\");\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceStatusCache.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\n\n/**\n * Defines a base set of operations that are used to manage {@link WorkspaceStatus}.\n *\n * @author Anton Korneta\n */\npublic interface WorkspaceStatusCache {\n\n  /**\n   * Returns {@link WorkspaceStatus} mapped to given workspace id. When no mapping for given\n   * workspace id found then {@code null} will be returned.\n   *\n   * @param workspaceId workspace identifier\n   * @return workspace status mapped to given workspace id\n   */\n  WorkspaceStatus get(String workspaceId);\n\n  /**\n   * Replaces workspace status with given value and returns previous value mapped to given workspace\n   * id. When no workspace status mapped to given workspace id then {@code null} will be returned.\n   *\n   * @param workspaceId workspace identifier\n   * @param newStatus new workspace status\n   * @return old workspace status or {@code null} if no previously mapped value\n   */\n  WorkspaceStatus replace(String workspaceId, WorkspaceStatus newStatus);\n\n  /**\n   * Replaces workspace status with given new value only if currently mapped to the specified value.\n   *\n   * @param workspaceId workspace identifier\n   * @param prevStatus expected workspace status mapped to given id\n   * @param newStatus new workspace status that is going to be mapped to given id\n   * @return {@code true} when workspace status is replaced\n   */\n  boolean replace(String workspaceId, WorkspaceStatus prevStatus, WorkspaceStatus newStatus);\n\n  /**\n   * Removes workspace status mapped to given workspace id.\n   *\n   * @param workspaceId workspace identifier\n   * @return workspace status mapped to given workspace id or {@code null} when no mapped value for\n   *     given workspace id\n   */\n  WorkspaceStatus remove(String workspaceId);\n\n  /**\n   * Puts workspace status when specified key is not already mapped.\n   *\n   * @param workspaceId workspace identifier\n   * @param status workspace status\n   * @return previous workspace status or {@code null} mapped with given workspace id\n   */\n  WorkspaceStatus putIfAbsent(String workspaceId, WorkspaceStatus status);\n\n  /** Returns copy of this cache as map. */\n  Map<String, WorkspaceStatus> asMap();\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_REQUEST_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.SidecarToolingWorkspaceUtil.isSidecarBasedWorkspace;\n\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Set;\nimport java.util.regex.Pattern;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.Workspace;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceConfig;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.config.Environment;\nimport org.eclipse.che.api.core.model.workspace.config.MachineConfig;\nimport org.eclipse.che.api.core.model.workspace.config.Recipe;\nimport org.eclipse.che.api.core.model.workspace.config.Volume;\n\n/**\n * Validator for {@link Workspace}.\n *\n * @author Yevhenii Voevodin\n */\n@Singleton\npublic class WorkspaceValidator {\n\n  /**\n   * Must contain [3, 100] characters, first and last character is letter or digit, available\n   * characters {A-Za-z0-9.-_}.\n   */\n  private static final Pattern WS_NAME =\n      Pattern.compile(\"[a-zA-Z0-9][-_.a-zA-Z0-9]{1,98}[a-zA-Z0-9]\");\n\n  private static final Pattern VOLUME_NAME =\n      Pattern.compile(\"[a-zA-Z][a-zA-Z0-9-_.]{0,18}[a-zA-Z0-9]\");\n  private static final Pattern VOLUME_PATH = Pattern.compile(\"/.+\");\n\n  private final Set<WorkspaceAttributeValidator> attributeValidators;\n\n  @Inject\n  public WorkspaceValidator(Set<WorkspaceAttributeValidator> attributeValidators) {\n    this.attributeValidators = attributeValidators;\n  }\n\n  /**\n   * Checks whether given workspace configuration object is in application valid state, so it\n   * provides enough data to be processed by internal components, and the data it provides is valid\n   * so consistency is not violated.\n   *\n   * @param config configuration to validate\n   * @throws ValidationException if any of validation constraints is violated\n   * @throws ServerException when any other error occurs during environment validation\n   */\n  public void validateConfig(WorkspaceConfig config) throws ValidationException, ServerException {\n    // configuration object properties\n    checkNotNull(config.getName(), \"Workspace name required\");\n    check(\n        WS_NAME.matcher(config.getName()).matches(),\n        \"Incorrect workspace name, it must be between 3 and 100 characters and may contain digits, \"\n            + \"latin letters, underscores, dots, dashes and must start and end only with digits, \"\n            + \"latin letters or underscores\");\n\n    validateEnvironments(config);\n\n    // commands\n    for (Command command : config.getCommands()) {\n      check(\n          !isNullOrEmpty(command.getName()),\n          \"Workspace %s contains command with null or empty name\",\n          config.getName());\n      check(\n          !isNullOrEmpty(command.getCommandLine())\n              || !isNullOrEmpty(\n                  command.getAttributes().get(Command.COMMAND_ACTION_REFERENCE_CONTENT_ATTRIBUTE)),\n          \"Command line or content required for command '%s' in workspace '%s'.\",\n          command.getName(),\n          config.getName());\n    }\n  }\n\n  /**\n   * Checks whether workspace attributes are valid. The attribute is valid if it's key is not null &\n   * not empty & is not prefixed with 'codenvy'.\n   *\n   * @param attributes the map to check\n   * @throws ValidationException when attributes are not valid\n   */\n  public void validateAttributes(Map<String, String> attributes) throws ValidationException {\n    for (String attributeName : attributes.keySet()) {\n      // attribute name should not be empty and should not start with codenvy\n      check(\n          attributeName != null\n              && !attributeName.trim().isEmpty()\n              && !attributeName.toLowerCase().startsWith(\"codenvy\"),\n          \"Attribute name '%s' is not valid\",\n          attributeName);\n    }\n\n    for (WorkspaceAttributeValidator attributeValidator : attributeValidators) {\n      attributeValidator.validate(attributes);\n    }\n  }\n\n  /**\n   * Checks whether workspace attributes are valid on updating.\n   *\n   * @param existing actual attributes\n   * @param update new attributes that are going to be stored instead of existing\n   * @throws ValidationException when attributes are not valid\n   */\n  public void validateUpdateAttributes(Map<String, String> existing, Map<String, String> update)\n      throws ValidationException {\n    for (WorkspaceAttributeValidator attributeValidator : attributeValidators) {\n      attributeValidator.validateUpdate(existing, update);\n    }\n  }\n\n  private void validateEnvironments(WorkspaceConfig config) throws ValidationException {\n    boolean environmentIsNotSet =\n        (config.getEnvironments() == null || config.getEnvironments().isEmpty())\n            && isNullOrEmpty(config.getDefaultEnv());\n    boolean isSidecarWorkspace = isSidecarBasedWorkspace(config.getAttributes());\n    if (environmentIsNotSet && isSidecarWorkspace) {\n      // sidecar based workspaces allowed not to have environment\n      return;\n    }\n    check(!isNullOrEmpty(config.getDefaultEnv()), \"Workspace default environment name required\");\n    checkNotNull(config.getEnvironments(), \"Workspace must contain at least one environment\");\n    check(\n        config.getEnvironments().containsKey(config.getDefaultEnv()),\n        \"Workspace default environment configuration required\");\n\n    for (Environment environment : config.getEnvironments().values()) {\n      checkNotNull(environment, \"Environment must not be null\");\n      Recipe recipe = environment.getRecipe();\n      checkNotNull(recipe, \"Environment recipe must not be null\");\n      checkNotNull(recipe.getType(), \"Environment recipe type must not be null\");\n\n      for (Entry<String, ? extends MachineConfig> machineEntry :\n          environment.getMachines().entrySet()) {\n        validateMachine(machineEntry.getKey(), machineEntry.getValue());\n      }\n    }\n  }\n\n  private void validateMachine(String machineName, MachineConfig machine)\n      throws ValidationException {\n    validateLongAttribute(\n        MEMORY_LIMIT_ATTRIBUTE, machine.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE), machineName);\n    validateLongAttribute(\n        MEMORY_REQUEST_ATTRIBUTE,\n        machine.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE),\n        machineName);\n\n    for (Entry<String, ? extends Volume> volumeEntry : machine.getVolumes().entrySet()) {\n      String volumeName = volumeEntry.getKey();\n      check(\n          VOLUME_NAME.matcher(volumeName).matches(),\n          \"Volume name '%s' in machine '%s' is invalid\",\n          volumeName,\n          machineName);\n      Volume volume = volumeEntry.getValue();\n      check(\n          volume != null && !isNullOrEmpty(volume.getPath()),\n          \"Path of volume '%s' in machine '%s' is invalid. It should not be empty\",\n          volumeName,\n          machineName);\n      check(\n          VOLUME_PATH.matcher(volume.getPath()).matches(),\n          \"Path '%s' of volume '%s' in machine '%s' is invalid. It should be absolute\",\n          volume.getPath(),\n          volumeName,\n          machineName);\n    }\n  }\n\n  private void validateLongAttribute(\n      String attributeName, String attributeValue, String machineName) throws ValidationException {\n    if (attributeValue != null) {\n      try {\n        Long.parseLong(attributeValue);\n      } catch (NumberFormatException e) {\n        throw new ValidationException(\n            format(\n                \"Value '%s' of attribute '%s' in machine '%s' is illegal\",\n                attributeValue, attributeName, machineName));\n      }\n    }\n  }\n\n  /**\n   * Checks that object reference is not null, throws {@link ValidationException} in the case of\n   * null {@code object} with given {@code message}.\n   */\n  private static void checkNotNull(Object object, String message) throws ValidationException {\n    if (object == null) {\n      throw new ValidationException(message);\n    }\n  }\n\n  /**\n   * Checks that expression is true, throws {@link ValidationException} otherwise.\n   *\n   * <p>Exception uses error message built from error message template and error message parameters.\n   */\n  private static void check(boolean expression, String fmt, Object... args)\n      throws ValidationException {\n    if (!expression) {\n      throw new ValidationException(format(fmt, args));\n    }\n  }\n\n  /**\n   * Checks that expression is true, throws {@link ValidationException} otherwise.\n   *\n   * <p>Exception uses error message built from error message template and error message parameters.\n   */\n  private static void check(boolean expression, String message) throws ValidationException {\n    if (!expression) {\n      throw new ValidationException(message);\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/Components.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.DOCKERIMAGE_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.EDITOR_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.OPENSHIFT_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.PLUGIN_COMPONENT_TYPE;\n\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\n\n/** Utility methods for working with components */\npublic class Components {\n\n  private Components() {}\n\n  /**\n   * Get a name that can be used to identify the component in the devfile. Either the component\n   * alias is used or, if not defined, the identifying attribute corresponding to the component\n   * type.\n   *\n   * <p>The alias is unique in the devfile but the identifying attributes are only unique per\n   * component type. Hence, it is required to use both type and the returned name to uniquely\n   * identify a component in all cases.\n   *\n   * @throws IllegalStateException if the type of the component is not recognized which can be\n   *     classified as an implementation bug\n   */\n  public static String getIdentifiableComponentName(Component component)\n      throws IllegalStateException {\n    if (component.getAlias() != null) {\n      return component.getAlias();\n    }\n\n    switch (component.getType()) {\n      case EDITOR_COMPONENT_TYPE:\n      case PLUGIN_COMPONENT_TYPE:\n        return component.getId();\n      case DOCKERIMAGE_COMPONENT_TYPE:\n        return component.getImage();\n      case KUBERNETES_COMPONENT_TYPE:\n      case OPENSHIFT_COMPONENT_TYPE:\n        String reference = component.getReference();\n        return reference == null ? component.getType() : reference;\n      default:\n        throw new IllegalStateException(\n            format(\"Unhandled component type: %s\", component.getType()));\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/Constants.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\npublic class Constants {\n\n  private Constants() {}\n\n  public static final String SCHEMAS_LOCATION = \"schema/\";\n\n  public static final String SCHEMA_FILENAME = \"devfile.json\";\n\n  public static final String CURRENT_API_VERSION = \"1.0.0\";\n\n  public static final String EDITOR_COMPONENT_TYPE = \"cheEditor\";\n\n  public static final String PLUGIN_COMPONENT_TYPE = \"chePlugin\";\n\n  public static final String KUBERNETES_COMPONENT_TYPE = \"kubernetes\";\n\n  public static final String OPENSHIFT_COMPONENT_TYPE = \"openshift\";\n\n  public static final String DOCKERIMAGE_COMPONENT_TYPE = \"dockerimage\";\n\n  /** Action type that should be used for commands execution. */\n  public static final String EXEC_ACTION_TYPE = \"exec\";\n\n  /** Workspace command attributes that indicates with which component it is associated. */\n  public static final String COMPONENT_ALIAS_COMMAND_ATTRIBUTE = \"componentAlias\";\n\n  /**\n   * {@link org.eclipse.che.api.core.model.workspace.devfile.Endpoint} attribute name which can\n   * identify endpoint as public or internal. Attribute value {@code false} makes a endpoint\n   * internal, any other value or lack of the attribute makes the endpoint public.\n   */\n  public static final String PUBLIC_ENDPOINT_ATTRIBUTE = \"public\";\n\n  /**\n   * {@link org.eclipse.che.api.core.model.workspace.devfile.Endpoint} attribute name which can\n   * identify endpoint as discoverable(i.e. it is accessible by its name from workspace's\n   * containers). Attribute value {@code true} makes a endpoint discoverable, any other value or\n   * lack of the attribute makes the endpoint non-discoverable.\n   */\n  public static final String DISCOVERABLE_ENDPOINT_ATTRIBUTE = \"discoverable\";\n\n  /**\n   * The attribute of Devfile that should be devfile when no editor is needed and default one should\n   * not be provisioned. Attributes value {@code true} deactivates provisioning of default editor,\n   * any other value of lack of the attributes activates provisioning of default editor\n   */\n  public static final String EDITOR_FREE_DEVFILE_ATTRIBUTE = \"editorFree\";\n\n  /**\n   * Format used for composite (containing registry URL and id) editor and plugin components\n   * workspace attribute values.\n   */\n  public static final String COMPOSITE_EDITOR_PLUGIN_ATTRIBUTE_FORMAT = \"%s#%s\";\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/DevfileBindings.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport com.google.inject.Binder;\nimport com.google.inject.multibindings.MapBinder;\nimport java.util.function.Consumer;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentToWorkspaceApplier;\nimport org.eclipse.che.api.workspace.server.devfile.validator.ComponentIntegrityValidator;\n\n/**\n * Utility class to ease the adding of devfile-related bindings in a guice module configuration.\n *\n * <p>Consult the individual methods on this class to see if you need to use them in a particular\n * module.\n */\npublic class DevfileBindings {\n\n  /**\n   * The {@code binder} consumer can be used to bind {@link ComponentToWorkspaceApplier}\n   * implementations to component types. I.e. the keys of the binder are component type strings and\n   * the bindings are the deemed implementations.\n   *\n   * @param baseBinder the binder available in the Guice module calling this method\n   * @param binder a consumer to accept a new binder for the workspace appliers\n   */\n  public static void onWorkspaceApplierBinder(\n      Binder baseBinder, Consumer<MapBinder<String, ComponentToWorkspaceApplier>> binder) {\n    binder.accept(\n        MapBinder.newMapBinder(baseBinder, String.class, ComponentToWorkspaceApplier.class));\n  }\n\n  /**\n   * The {@code binder} consumer can be used to bind {@link ComponentIntegrityValidator}\n   * implementations to component types. I.e. the keys of the binder are component type strings and\n   * the bindings are the deemed implementations.\n   *\n   * @param baseBinder the binder available in the Guice module calling this method\n   * @param binder a consumer to accept a new binder for the component integrity validators\n   */\n  public static void onComponentIntegrityValidatorBinder(\n      Binder baseBinder, Consumer<MapBinder<String, ComponentIntegrityValidator>> binder) {\n    binder.accept(\n        MapBinder.newMapBinder(baseBinder, String.class, ComponentIntegrityValidator.class));\n  }\n\n  private DevfileBindings() {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/DevfileEntityProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;\nimport static org.eclipse.che.api.workspace.server.DtoConverter.asDto;\n\nimport com.google.common.io.CharStreams;\nimport jakarta.ws.rs.BadRequestException;\nimport jakarta.ws.rs.Consumes;\nimport jakarta.ws.rs.NotSupportedException;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.WebApplicationException;\nimport jakarta.ws.rs.core.HttpHeaders;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.MultivaluedMap;\nimport jakarta.ws.rs.ext.MessageBodyReader;\nimport jakarta.ws.rs.ext.MessageBodyWriter;\nimport jakarta.ws.rs.ext.Provider;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.OutputStream;\nimport java.io.OutputStreamWriter;\nimport java.io.Writer;\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Type;\nimport java.nio.charset.StandardCharsets;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.DevfileDto;\nimport org.eclipse.che.dto.server.DtoFactory;\n\n/**\n * Parses {@link DevfileDto} either from Json or yaml content, and performs schema validation before\n * the actual DTO created.\n *\n * @author Max Shaposhnyk\n */\n@Singleton\n@Provider\n@Produces({APPLICATION_JSON})\n@Consumes({APPLICATION_JSON, \"text/yaml\", \"text/x-yaml\"})\npublic class DevfileEntityProvider\n    implements MessageBodyReader<DevfileDto>, MessageBodyWriter<DevfileDto> {\n\n  private DevfileParser devfileParser;\n\n  @Inject\n  public DevfileEntityProvider(DevfileParser devfileParser) {\n    this.devfileParser = devfileParser;\n  }\n\n  @Override\n  public boolean isReadable(\n      Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {\n    return type == DevfileDto.class;\n  }\n\n  @Override\n  public DevfileDto readFrom(\n      Class<DevfileDto> type,\n      Type genericType,\n      Annotation[] annotations,\n      MediaType mediaType,\n      MultivaluedMap<String, String> httpHeaders,\n      InputStream entityStream)\n      throws IOException, WebApplicationException {\n\n    try {\n      if (mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE)) {\n        return asDto(\n            devfileParser.parseJson(\n                CharStreams.toString(\n                    new InputStreamReader(entityStream, getCharsetOrUtf8(mediaType)))));\n      } else if (mediaType.isCompatible(MediaType.valueOf(\"text/yaml\"))\n          || mediaType.isCompatible(MediaType.valueOf(\"text/x-yaml\"))) {\n        return asDto(\n            devfileParser.parseYaml(\n                CharStreams.toString(\n                    new InputStreamReader(entityStream, getCharsetOrUtf8(mediaType)))));\n      }\n    } catch (DevfileFormatException e) {\n      throw new BadRequestException(e.getMessage());\n    }\n    throw new NotSupportedException(\"Unknown media type \" + mediaType.toString());\n  }\n\n  @Override\n  public boolean isWriteable(\n      Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {\n    return DevfileDto.class.isAssignableFrom(type);\n  }\n\n  @Override\n  public long getSize(\n      DevfileDto devfileDto,\n      Class<?> type,\n      Type genericType,\n      Annotation[] annotations,\n      MediaType mediaType) {\n    return -1;\n  }\n\n  @Override\n  public void writeTo(\n      DevfileDto devfileDto,\n      Class<?> type,\n      Type genericType,\n      Annotation[] annotations,\n      MediaType mediaType,\n      MultivaluedMap<String, Object> httpHeaders,\n      OutputStream entityStream)\n      throws IOException, WebApplicationException {\n    httpHeaders.putSingle(HttpHeaders.CACHE_CONTROL, \"public, no-cache, no-store, no-transform\");\n    try (Writer w = new OutputStreamWriter(entityStream, StandardCharsets.UTF_8)) {\n      w.write(DtoFactory.getInstance().toJson(devfileDto));\n      w.flush();\n    }\n  }\n\n  private String getCharsetOrUtf8(MediaType mediaType) {\n    String charset = mediaType == null ? null : mediaType.getParameters().get(\"charset\");\n    if (isNullOrEmpty(charset)) {\n      charset = \"UTF-8\";\n    }\n    return charset;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/DevfileModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.EDITOR_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.PLUGIN_COMPONENT_TYPE;\n\nimport com.google.inject.AbstractModule;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.editor.EditorComponentToWorkspaceApplier;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.plugin.PluginComponentToWorkspaceApplier;\nimport org.eclipse.che.api.workspace.server.devfile.validator.ComponentIntegrityValidator.NoopComponentIntegrityValidator;\n\n/**\n * @author Sergii Leshchenko\n */\npublic class DevfileModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    bind(DevfileEntityProvider.class);\n\n    DevfileBindings.onWorkspaceApplierBinder(\n        binder(),\n        binder -> {\n          binder.addBinding(EDITOR_COMPONENT_TYPE).to(EditorComponentToWorkspaceApplier.class);\n          binder.addBinding(PLUGIN_COMPONENT_TYPE).to(PluginComponentToWorkspaceApplier.class);\n        });\n\n    DevfileBindings.onComponentIntegrityValidatorBinder(\n        binder(),\n        binder -> {\n          binder.addBinding(PLUGIN_COMPONENT_TYPE).to(NoopComponentIntegrityValidator.class);\n          binder.addBinding(EDITOR_COMPONENT_TYPE).to(NoopComponentIntegrityValidator.class);\n        });\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/DevfileParser.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static com.google.common.base.MoreObjects.firstNonNull;\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyMap;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.OPENSHIFT_COMPONENT_TYPE;\n\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.core.type.TypeReference;\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.dataformat.yaml.YAMLFactory;\nimport com.google.common.annotations.Beta;\nimport com.google.common.annotations.VisibleForTesting;\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.OverrideParameterException;\nimport org.eclipse.che.api.workspace.server.devfile.validator.DevfileIntegrityValidator;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\n\n/**\n * Facade for devfile related operations.\n *\n * @author Max Shaposhnyk\n */\n@Beta\n@Singleton\npublic class DevfileParser {\n\n  private final ObjectMapper yamlMapper;\n  private final ObjectMapper jsonMapper;\n  private final DevfileIntegrityValidator integrityValidator;\n  private final OverridePropertiesApplier overridePropertiesApplier;\n\n  @Inject\n  public DevfileParser(DevfileIntegrityValidator integrityValidator) {\n    this(integrityValidator, new ObjectMapper(new YAMLFactory()), new ObjectMapper());\n  }\n\n  @VisibleForTesting\n  DevfileParser(\n      DevfileIntegrityValidator integrityValidator,\n      ObjectMapper yamlMapper,\n      ObjectMapper jsonMapper) {\n    this.integrityValidator = integrityValidator;\n    this.yamlMapper = yamlMapper;\n    this.jsonMapper = jsonMapper;\n    this.overridePropertiesApplier = new OverridePropertiesApplier();\n  }\n\n  /**\n   * Creates {@link DevfileImpl} from given devfile content in YAML. Performs schema and integrity\n   * validation of input data.\n   *\n   * @param devfileContent raw content of devfile\n   * @return Devfile object created from the source content\n   * @throws DevfileFormatException when any of schema or integrity validations fail\n   * @throws DevfileFormatException when any yaml parsing error occurs\n   */\n  public DevfileImpl parseYaml(String devfileContent) throws DevfileFormatException {\n    try {\n      return parse(parseYamlRaw(devfileContent), yamlMapper, emptyMap());\n    } catch (OverrideParameterException e) {\n      // should never happen as we send empty overrides map\n      throw new RuntimeException(e.getMessage());\n    }\n  }\n\n  /**\n   * Tries to parse given `yaml` into {@link JsonNode}.\n   *\n   * @param yaml to parse\n   * @return parsed yaml\n   * @throws DevfileFormatException if given yaml is empty or invalid\n   */\n  public JsonNode parseYamlRaw(String yaml) throws DevfileFormatException {\n    try {\n      return Optional.ofNullable(yamlMapper.readTree(yaml))\n          .orElseThrow(\n              () ->\n                  new DevfileFormatException(\"Unable to parse Devfile - provided source is empty\"));\n    } catch (JsonProcessingException jpe) {\n      throw new DevfileFormatException(\"Can't parse devfile yaml.\", jpe);\n    }\n  }\n\n  /**\n   * converts given devfile in {@link JsonNode} into {@link Map}.\n   *\n   * @param devfileJson json with devfile content\n   * @return devfile in simple Map structure\n   */\n  public Map<String, Object> convertYamlToMap(JsonNode devfileJson) {\n    return yamlMapper.convertValue(devfileJson, new TypeReference<>() {});\n  }\n\n  /**\n   * Parse given devfile in {@link JsonNode} format into our {@link DevfileImpl} and provides\n   * possibility to override its values using key-value map, where key is an json-pointer-like\n   * string and value is desired property value. NOTE: unlike json pointers, objects in arrays\n   * should be pointed by their names, not by index. Examples:\n   *\n   * <ul>\n   *   <li>metadata.generateName : python-dev-\n   *   <li>projects.foo.source.type : git // foo is an project name\n   * </ul>\n   *\n   * <p>Performs schema and integrity validation of input data.\n   *\n   * @param devfile devfile parsed in Json\n   * @param overrideProperties properties to override\n   * @return devfile created from given {@link JsonNode}\n   * @throws OverrideParameterException when any error when overriding parameters\n   * @throws DevfileFormatException when given devfile is not valid devfile\n   */\n  public DevfileImpl parseJsonNode(JsonNode devfile, Map<String, String> overrideProperties)\n      throws OverrideParameterException, DevfileFormatException {\n    return parse(devfile, jsonMapper, overrideProperties);\n  }\n\n  /**\n   * Creates {@link DevfileImpl} from given devfile content in JSON. Performs schema and integrity\n   * validation of input data.\n   *\n   * @param devfileContent raw content of devfile\n   * @return Devfile object created from the source content\n   * @throws DevfileFormatException when any of schema or integrity validations fail\n   * @throws DevfileFormatException when any yaml parsing error occurs\n   */\n  public DevfileImpl parseJson(String devfileContent) throws DevfileFormatException {\n    try {\n      return parse(devfileContent, jsonMapper, emptyMap());\n    } catch (OverrideParameterException e) {\n      // should never happen as we send empty overrides map\n      throw new RuntimeException(e.getMessage());\n    }\n  }\n\n  /**\n   * Resolve devfile component references into their reference content.\n   *\n   * @param devfile input devfile\n   * @param fileContentProvider provider to fetch reference content\n   */\n  public void resolveReference(DevfileImpl devfile, FileContentProvider fileContentProvider)\n      throws DevfileException {\n    List<ComponentImpl> toResolve =\n        devfile.getComponents().stream()\n            .filter(\n                c ->\n                    c.getType().equals(KUBERNETES_COMPONENT_TYPE)\n                        || c.getType().equals(OPENSHIFT_COMPONENT_TYPE))\n            .filter(c -> !isNullOrEmpty(c.getReference()))\n            .collect(Collectors.toList());\n    for (ComponentImpl c : toResolve) {\n      try {\n        c.setReferenceContent(fileContentProvider.fetchContent(c.getReference()));\n      } catch (IOException e) {\n        throw new DevfileException(\n            format(\n                \"Unable to resolve reference of component: %s\",\n                firstNonNull(c.getAlias(), c.getReference())),\n            e);\n      }\n    }\n  }\n\n  private DevfileImpl parse(\n      String content, ObjectMapper mapper, Map<String, String> overrideProperties)\n      throws DevfileFormatException, OverrideParameterException {\n    try {\n      return parse(mapper.readTree(content), mapper, overrideProperties);\n    } catch (JsonProcessingException e) {\n      throw new DevfileFormatException(e.getMessage());\n    }\n  }\n\n  private DevfileImpl parse(\n      JsonNode parsed, ObjectMapper mapper, Map<String, String> overrideProperties)\n      throws DevfileFormatException, OverrideParameterException {\n    if (parsed == null) {\n      throw new DevfileFormatException(\"Unable to parse Devfile - provided source is empty\");\n    }\n    DevfileImpl devfile;\n    try {\n      parsed = overridePropertiesApplier.applyPropertiesOverride(parsed, overrideProperties);\n      devfile = mapper.treeToValue(parsed, DevfileImpl.class);\n    } catch (JsonProcessingException e) {\n      throw new DevfileFormatException(e.getMessage());\n    }\n    integrityValidator.validateDevfile(devfile);\n    return devfile;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/DevfileRecipeFormatException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\n\n/** Thrown when the provided content of recipe-type component is empty or invalid. */\npublic class DevfileRecipeFormatException extends DevfileException {\n\n  public DevfileRecipeFormatException(String message) {\n    super(message);\n  }\n\n  public DevfileRecipeFormatException(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/DevfileVersionDetector.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\n\n/** Class that helps determine devfile versions. */\n@Singleton\npublic class DevfileVersionDetector {\n\n  private final String DEVFILE_V1_VERSION_FIELD = \"apiVersion\";\n  private final String DEVFILE_V2_VERSION_FIELD = \"schemaVersion\";\n\n  /**\n   * Gives exact version of the devfile.\n   *\n   * @param devfile to inspect\n   * @return exact version of the devfile\n   * @throws DevfileException when can't find the field with version\n   */\n  public String devfileVersion(JsonNode devfile) throws DevfileException {\n    final String version;\n    if (devfile.has(DEVFILE_V1_VERSION_FIELD)) {\n      version = devfile.get(DEVFILE_V1_VERSION_FIELD).asText();\n    } else if (devfile.has(DEVFILE_V2_VERSION_FIELD)) {\n      version = devfile.get(DEVFILE_V2_VERSION_FIELD).asText();\n    } else {\n      throw new DevfileException(\n          \"Neither of `apiVersion` or `schemaVersion` found. This is not a valid devfile.\");\n    }\n\n    return version;\n  }\n\n  /**\n   * Gives major version of the devfile.\n   *\n   * <pre>\n   *   1 -> 1\n   *   1.0.0 -> 1\n   *   1.99 -> 1\n   *   2.0.0 -> 2\n   *   2.1 -> 2\n   *   a.a -> DevfileException\n   *   a -> DevfileException\n   * </pre>\n   *\n   * @param devfile to inspect\n   * @return major version of the devfile\n   * @throws DevfileException when can't find the field with version\n   */\n  public int devfileMajorVersion(JsonNode devfile) throws DevfileException {\n    String version = devfileVersion(devfile);\n\n    int dot = version.indexOf(\".\");\n    final String majorVersion = dot > 0 ? version.substring(0, dot) : version;\n    try {\n      return Integer.parseInt(majorVersion);\n    } catch (NumberFormatException nfe) {\n      throw new DevfileException(\n          \"Unable to parse devfile version. This is not a valid devfile.\", nfe);\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/FileContentProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport java.io.IOException;\nimport java.lang.ref.SoftReference;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\n\n/**\n * Interface for fetching devfile-related content from repositories or raw URL-s. Used for\n * retrieving devfile content as well as referenced files.\n *\n * @author Max Shaposhnyk\n * @author Sergii Leshchenko\n */\npublic interface FileContentProvider {\n\n  /**\n   * Fetches content of the specified file.\n   *\n   * @param fileURL absolute or devfile-relative file URL to fetch content\n   * @return content of the specified file\n   * @throws IOException when there is an error during content retrieval\n   * @throws DevfileException when implementation does not support fetching of additional files\n   *     content\n   */\n  String fetchContent(String fileURL) throws IOException, DevfileException;\n\n  /**\n   * Fetches content of the specified file without the authentication step.\n   *\n   * @param fileURL absolute or devfile-relative file URL to fetch content\n   * @param credentials a string representation of credentials in format: <username>:<password>\n   * @return content of the specified file\n   * @throws IOException when there is an error during content retrieval\n   * @throws DevfileException when implementation does not support fetching of additional files\n   *     content\n   */\n  String fetchContent(String fileURL, String credentials) throws IOException, DevfileException;\n\n  /**\n   * Fetches content of the specified file without the authentication step.\n   *\n   * @param fileURL absolute or devfile-relative file URL to fetch content\n   * @return content of the specified file\n   * @throws IOException when there is an error during content retrieval\n   * @throws DevfileException when implementation does not support fetching of additional files\n   *     content\n   */\n  String fetchContentWithoutAuthentication(String fileURL) throws IOException, DevfileException;\n\n  /**\n   * Short for {@code new CachingProvider(contentProvider);}. If the {@code contentProvider} is\n   * itself an instance of the {@link CachingProvider}, no new instance is produced.\n   *\n   * @param contentProvider the content provider to cache\n   * @return a file content provider that caches the responses\n   */\n  static FileContentProvider cached(FileContentProvider contentProvider) {\n    if (contentProvider instanceof CachingProvider) {\n      return contentProvider;\n    } else {\n      return new CachingProvider(contentProvider);\n    }\n  }\n\n  /**\n   * A file content provider that caches responses from the content provider it is wrapping. Useful\n   * in situations where repeated calls to the {@link #fetchContent(String)} are necessary.\n   */\n  class CachingProvider implements FileContentProvider {\n\n    private final FileContentProvider provider;\n\n    // we don't want to be holding on to large strings with content\n    private final Map<String, SoftReference<String>> cache = new HashMap<>();\n\n    public CachingProvider(FileContentProvider provider) {\n      this.provider = provider;\n    }\n\n    private String fetchContentInternal(String fileURL) throws IOException, DevfileException {\n      SoftReference<String> ref = cache.get(fileURL);\n      String ret = ref == null ? null : ref.get();\n\n      if (ret == null) {\n        ret = provider.fetchContent(fileURL);\n        cache.put(fileURL, new SoftReference<>(ret));\n      }\n\n      return ret;\n    }\n\n    @Override\n    public String fetchContent(String fileURL) throws IOException, DevfileException {\n      return fetchContentInternal(fileURL);\n    }\n\n    @Override\n    public String fetchContent(String fileURL, String credentials)\n        throws IOException, DevfileException {\n      return fetchContentInternal(fileURL);\n    }\n\n    @Override\n    public String fetchContentWithoutAuthentication(String fileURL)\n        throws IOException, DevfileException {\n      return fetchContentInternal(fileURL);\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/OverridePropertiesApplier.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static java.lang.String.format;\nimport static java.lang.String.join;\nimport static java.util.Arrays.asList;\nimport static java.util.stream.Collectors.joining;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.node.ArrayNode;\nimport com.fasterxml.jackson.databind.node.ObjectNode;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Stream;\nimport java.util.stream.StreamSupport;\nimport org.eclipse.che.api.workspace.server.devfile.exception.OverrideParameterException;\n\n/**\n * Applies override properties to provided devfile {@link JsonNode}. The following set of rules will\n * be used during object modification:\n *\n * <ul>\n *   <li>Only allowed top-level fields can be altered: apiVersion, metadata, project, attributes.\n *   <li>The absent segment will be created as an empty object and next segment will be added as a\n *       field of it\n *   <li>The property identifier cannot ends with an array type reference\n *   <li>The property identifier for object in an array should contain valid object name, error will\n *       be thrown otherwise.\n * </ul>\n */\npublic class OverridePropertiesApplier {\n\n  private final List<String> allowedFirstSegments =\n      asList(\"apiVersion\", \"metadata\", \"projects\", \"attributes\", \"devfileFilename\");\n\n  private final List<String> skipJsonSegments = asList(\"devfileFilename\");\n\n  public JsonNode applyPropertiesOverride(\n      JsonNode devfileNode, Map<String, String> overrideProperties)\n      throws OverrideParameterException {\n    for (Map.Entry<String, String> entry : overrideProperties.entrySet()) {\n\n      // skip some segment\n      if (skipJsonSegments.contains(entry.getKey())) {\n        continue;\n      }\n      String[] pathSegments = parseSegments(entry.getKey());\n      if (pathSegments.length < 1) {\n        continue;\n      }\n      validateFirstSegment(pathSegments);\n      String lastSegment = pathSegments[pathSegments.length - 1];\n      JsonNode currentNode = devfileNode;\n      Iterator<String> pathSegmentsIterator = Stream.of(pathSegments).iterator();\n      do {\n        String currentSegment = pathSegmentsIterator.next();\n        JsonNode nextNode = currentNode.path(currentSegment);\n        if (nextNode.isMissingNode() && pathSegmentsIterator.hasNext()) {\n          // no such intermediate node, let's create it as a empty object\n          currentNode = ((ObjectNode) currentNode).putObject(currentSegment);\n          continue;\n        } else if (nextNode.isArray()) {\n          // ok we have reference to array, so need to make sure that we have next path segment\n          // and then try to retrieve it from array\n          if (!pathSegmentsIterator.hasNext()) {\n            throw new OverrideParameterException(\n                format(\n                    \"Override property reference '%s' points to an array type object. Please add an item qualifier by name.\",\n                    entry.getKey()));\n          }\n          // retrieve object by name from array\n          String arrayObjectName = pathSegmentsIterator.next();\n          currentNode = findNodeByName((ArrayNode) nextNode, arrayObjectName, currentSegment);\n          continue;\n        } else {\n          // because it's impossible to change value of the current Json node,\n          // so to set value, we should be 1 level up and do put(key, value),\n          // so not set latest segment as an current node\n          if (pathSegmentsIterator.hasNext()) {\n            currentNode = nextNode;\n          }\n        }\n      } while (pathSegmentsIterator.hasNext());\n      // end of path segments reached, now we can set value\n      ((ObjectNode) currentNode).put(lastSegment, entry.getValue());\n    }\n    return devfileNode;\n  }\n\n  private String[] parseSegments(String key) {\n    return key.startsWith(\"attributes.\")\n        // for attributes we treat the rest as a attribute name so just need only 2 parts\n        ? key.split(\"\\\\.\", 2)\n        : key.split(\"\\\\.\");\n  }\n\n  private void validateFirstSegment(String[] pathSegments) throws OverrideParameterException {\n    if (!allowedFirstSegments.contains(pathSegments[0])) {\n      throw new OverrideParameterException(\n          format(\n              \"Override path '%s' starts with an unsupported field pointer. Supported fields are %s.\",\n              join(\".\", pathSegments),\n              allowedFirstSegments.stream().collect(joining(\"\\\",\\\"\", \"{\\\"\", \"\\\"}\"))));\n    }\n  }\n\n  private JsonNode findNodeByName(ArrayNode parentNode, String searchName, String parentNodeName)\n      throws OverrideParameterException {\n    return StreamSupport.stream(parentNode.spliterator(), false)\n        .filter(node -> node.path(\"name\").asText().equals(searchName))\n        .findFirst()\n        .orElseThrow(\n            () ->\n                new OverrideParameterException(\n                    format(\n                        \"Cannot apply override: object with name '%s' not found in array of %s.\",\n                        searchName, parentNodeName)));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/PreferencesDeserializer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static java.lang.String.format;\n\nimport com.fasterxml.jackson.core.JsonParseException;\nimport com.fasterxml.jackson.core.JsonParser;\nimport com.fasterxml.jackson.core.JsonToken;\nimport com.fasterxml.jackson.databind.DeserializationContext;\nimport com.fasterxml.jackson.databind.JsonDeserializer;\nimport java.io.IOException;\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\n\n/**\n * Helps to deserialize multi-type preferences into {@link Component} as a {@code Map}.\n *\n * @author Max Shaposhnyk\n */\npublic class PreferencesDeserializer extends JsonDeserializer<Map<String, Serializable>> {\n\n  @Override\n  public Map<String, Serializable> deserialize(JsonParser jsonParser, DeserializationContext ctxt)\n      throws IOException {\n    Map<String, Serializable> result = new HashMap<>();\n    jsonParser.nextToken();\n    while (!JsonToken.END_OBJECT.equals(jsonParser.getCurrentToken())) {\n      JsonToken currentToken = jsonParser.nextValue();\n      switch (currentToken) {\n        case VALUE_NUMBER_INT:\n        case VALUE_NUMBER_FLOAT:\n          result.put(jsonParser.getCurrentName(), jsonParser.getNumberValue());\n          break;\n        case VALUE_FALSE:\n        case VALUE_TRUE:\n          result.put(jsonParser.getCurrentName(), jsonParser.getValueAsBoolean());\n          break;\n        case VALUE_STRING:\n          result.put(jsonParser.getCurrentName(), jsonParser.getValueAsString());\n          break;\n        case START_ARRAY:\n          String key = jsonParser.getCurrentName();\n          ArrayList<Serializable> array = new ArrayList<>();\n          // Iterate over nested array\n          JsonToken nextValue = jsonParser.nextValue();\n          while (!JsonToken.END_ARRAY.equals(nextValue)) {\n\n            switch (nextValue) {\n              case VALUE_NUMBER_INT:\n              case VALUE_NUMBER_FLOAT:\n                array.add(jsonParser.getNumberValue());\n                break;\n              case VALUE_FALSE:\n              case VALUE_TRUE:\n                array.add(jsonParser.getValueAsBoolean());\n                break;\n              case VALUE_STRING:\n                array.add(jsonParser.getValueAsString());\n                break;\n              default:\n                throw new JsonParseException(\n                    jsonParser,\n                    format(\n                        \"Unexpected value in the nested array of the preference with key '%s'.\",\n                        key));\n            }\n            nextValue = jsonParser.nextValue();\n          }\n          result.put(key, array.toArray());\n          break;\n        default:\n          throw new JsonParseException(\n              jsonParser,\n              format(\n                  \"Unexpected value of the preference with key '%s'.\",\n                  jsonParser.getCurrentName()));\n      }\n      jsonParser.nextToken();\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/SerializableConverter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport java.io.IOException;\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.List;\nimport javax.persistence.AttributeConverter;\nimport javax.persistence.Converter;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\n\n/**\n * Helps to store and read serializable values of the preferences map in {@link Component} to/from\n * database.\n *\n * @author Max Shaposhnyk\n */\n@Converter(autoApply = true)\npublic class SerializableConverter implements AttributeConverter<Serializable, String> {\n\n  private ObjectMapper objectMapper;\n\n  public SerializableConverter() {\n    this.objectMapper = new ObjectMapper();\n    objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE);\n  }\n\n  @Override\n  public String convertToDatabaseColumn(Serializable value) {\n    try {\n      return objectMapper.writeValueAsString(value);\n    } catch (JsonProcessingException e) {\n      throw new RuntimeException(\"Unable to serialize preference value:\" + e.getMessage(), e);\n    }\n  }\n\n  @Override\n  public Serializable convertToEntityAttribute(String dbData) {\n    try {\n      JsonNode node = objectMapper.readTree(dbData);\n      if (node.isValueNode()) {\n        return serializableNodeValue(node);\n      } else if (node.isArray()) {\n        List<Serializable> values = new ArrayList<>();\n        node.elements().forEachRemaining(n -> values.add(serializableNodeValue(n)));\n        return values.toArray();\n      } else {\n        throw new RuntimeException(\"Unable to deserialize preference value:\" + dbData);\n      }\n    } catch (IOException e) {\n      throw new RuntimeException(\"Unable to deserialize preference value:\" + e.getMessage(), e);\n    }\n  }\n\n  private Serializable serializableNodeValue(JsonNode node) {\n    if (node.isNumber()) {\n      return node.numberValue();\n    } else if (node.isBoolean()) {\n      return node.booleanValue();\n    } else if (node.isTextual()) {\n      return node.textValue();\n    } else {\n      throw new RuntimeException(\"Unable to deserialize preference value:\" + node.asText());\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/URLFetcher.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static java.util.Objects.requireNonNull;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.common.io.ByteStreams;\nimport jakarta.validation.constraints.NotNull;\nimport jakarta.ws.rs.core.HttpHeaders;\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.net.URL;\nimport java.net.URLConnection;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport javax.inject.Singleton;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Allow to grab content from URL\n *\n * @author Florent Benoit\n */\n@Singleton\npublic class URLFetcher {\n\n  /** Logger. */\n  private static final Logger LOG = LoggerFactory.getLogger(URLFetcher.class);\n\n  /** timeout when reading */\n  @VisibleForTesting static final int CONNECTION_READ_TIMEOUT = 10 * 1000; // 10s\n\n  /** The Compiled REGEX PATTERN that can be used for http|https git urls */\n  final Pattern GIT_HTTP_URL_PATTERN = Pattern.compile(\"(?<sanitized>^http[s]?://.*)\\\\.git$\");\n\n  /** Maximum size of allowed data. */\n  protected long maximumReadBytes;\n\n  @Inject\n  public URLFetcher(@Named(\"che.factory.scm_file_fetcher_limit_bytes\") long maxFetchBytes) {\n    this.maximumReadBytes = maxFetchBytes;\n  }\n\n  /**\n   * Fetches the url provided and return its content. To prevent DOS attack, limit the amount of the\n   * collected data\n   *\n   * @param url the URL to fetch\n   * @return the content of the requested URL or {@code null} if error happened\n   */\n  public String fetchSafely(@NotNull final String url) {\n    requireNonNull(url, \"url parameter can't be null\");\n    try {\n      return fetch(url);\n    } catch (IOException e) {\n      return null;\n    }\n  }\n\n  /**\n   * Fetches the url provided and return its content. Uses default read connection timeout {@link\n   * URLFetcher#CONNECTION_READ_TIMEOUT}\n   *\n   * @param url the URL to fetch\n   * @return content of the requested URL\n   * @throws IOException if fetch error occurs\n   */\n  public String fetch(@NotNull final String url) throws IOException {\n    return fetch(url, CONNECTION_READ_TIMEOUT);\n  }\n\n  /**\n   * Fetches the url provided and return its content. Uses default read connection timeout {@link\n   * URLFetcher#CONNECTION_READ_TIMEOUT}\n   *\n   * @param url the URL to fetch\n   * @param authorization Authorisation string or {@code null}\n   * @return content of the requested URL\n   * @throws IOException if fetch error occurs\n   */\n  public String fetch(@NotNull final String url, @Nullable String authorization)\n      throws IOException {\n    return fetch(url, CONNECTION_READ_TIMEOUT, authorization);\n  }\n\n  /**\n   * Fetches the url provided and return its content.\n   *\n   * @param url the URL to fetch\n   * @param timeout read and connection timeout (see {@link URLConnection#setConnectTimeout(int)}\n   *     and {@link URLConnection#setReadTimeout(int)}\n   * @return content of the requested URL\n   * @throws IOException if fetch error occurs\n   */\n  String fetch(@NotNull final String url, int timeout) throws IOException {\n    return fetch(url, timeout, null);\n  }\n\n  /**\n   * Fetches the url provided and return its content.\n   *\n   * @param url the URL to fetch\n   * @param authorization Authorisation string or {@code null}\n   * @param timeout read and connection timeout (see {@link URLConnection#setConnectTimeout(int)}\n   *     and {@link URLConnection#setReadTimeout(int)}\n   * @return content of the requested URL\n   * @throws IOException if fetch error occurs\n   */\n  String fetch(@NotNull final String url, int timeout, @Nullable String authorization)\n      throws IOException {\n    requireNonNull(url, \"url parameter can't be null\");\n    URLConnection connection = new URL(sanitized(url)).openConnection();\n    connection.setConnectTimeout(timeout);\n    connection.setReadTimeout(timeout);\n    if (!isNullOrEmpty(authorization)) {\n      connection.setRequestProperty(HttpHeaders.AUTHORIZATION, authorization);\n    }\n    return fetch(connection);\n  }\n\n  /**\n   * Fetch the urlConnection stream by using the urlconnection and return its content To prevent DOS\n   * attack, limit the amount of the collected data\n   *\n   * @param urlConnection the URL connection to fetch\n   * @return the content of the file\n   * @throws IOException if fetch error occurs\n   */\n  @VisibleForTesting\n  String fetch(@NotNull URLConnection urlConnection) throws IOException {\n    requireNonNull(urlConnection, \"urlConnection parameter can't be null\");\n    final String value;\n    try (InputStream inputStream = urlConnection.getInputStream();\n        BufferedReader reader =\n            new BufferedReader(\n                new InputStreamReader(ByteStreams.limit(inputStream, getLimit()), UTF_8))) {\n      value = reader.lines().collect(Collectors.joining(\"\\n\"));\n    } catch (IOException e) {\n      // we shouldn't fetch if check is done before\n      LOG.debug(\"Invalid URL\", e);\n      throw e;\n    }\n    return value;\n  }\n\n  /**\n   * Maximum size that can be read.\n   *\n   * @return maximum size.\n   */\n  protected long getLimit() {\n    return maximumReadBytes;\n  }\n\n  /**\n   * Simple method to sanitize the Git urls like &quot;https://github.com/demo.git&quot; or\n   * &quot;http://myowngit.example.com/demo.git&quot;\n   *\n   * @param url - the String format of the url\n   * @return if the url ends with .git will return the url without .git otherwise return the url as\n   *     it is\n   */\n  @VisibleForTesting\n  String sanitized(String url) {\n    if (url != null) {\n      final Matcher matcher = GIT_HTTP_URL_PATTERN.matcher(url);\n      if (matcher.find()) {\n        return matcher.group(\"sanitized\");\n      }\n    }\n    return url;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/URLFileContentProvider.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.Base64;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * A simple implementation of the FileContentProvider that merely uses the function resolve relative\n * paths and {@link URLFetcher} for retrieving the content, handling common error cases.\n */\npublic class URLFileContentProvider implements FileContentProvider {\n\n  private final URI devfileLocation;\n  private final URLFetcher urlFetcher;\n\n  public URLFileContentProvider(@Nullable URI devfileLocation, URLFetcher urlFetcher) {\n    this.devfileLocation = devfileLocation;\n    this.urlFetcher = urlFetcher;\n  }\n\n  private String fetchContentInternal(String fileURL, @Nullable String credentials)\n      throws IOException, DevfileException {\n    URI fileURI;\n    String requestURL;\n    try {\n      fileURI = new URI(fileURL);\n    } catch (URISyntaxException e) {\n      throw new DevfileException(e.getMessage(), e);\n    }\n\n    if (fileURI.isAbsolute()) {\n      requestURL = fileURL;\n    } else {\n      if (devfileLocation == null) {\n        throw new DevfileException(\n            format(\n                \"It is unable to fetch a file %s as relative to devfile, since devfile location\"\n                    + \" is unknown. Try specifying absolute URL.\",\n                fileURL));\n      }\n      requestURL = devfileLocation.resolve(fileURI).toString();\n    }\n    try {\n      return urlFetcher.fetch(\n          requestURL, isNullOrEmpty(credentials) ? null : getCredentialsAuthorization(credentials));\n    } catch (IOException e) {\n      throw new IOException(\n          format(\n              \"Failed to fetch a file from URL %s. Make sure the URL\"\n                  + \" of the devfile points to the raw content of it (e.g. not to the webpage\"\n                  + \" showing it but really just its contents). Additionally, if you're using \"\n                  + \" relative form, make sure the referenced files are actually stored\"\n                  + \" relative to the devfile on the same host,\"\n                  + \" or try to specify URL in absolute form. The current attempt to download\"\n                  + \" the file failed with the following error message: %s\",\n              fileURL, e.getMessage()),\n          e);\n    }\n  }\n\n  private String getCredentialsAuthorization(String credentials) {\n    return \"Basic \" + new String(Base64.getEncoder().encode(credentials.getBytes()));\n  }\n\n  @Override\n  public String fetchContent(String fileURL) throws IOException, DevfileException {\n    return fetchContentInternal(fileURL, null);\n  }\n\n  @Override\n  public String fetchContentWithoutAuthentication(String fileURL)\n      throws IOException, DevfileException {\n    return fetchContentInternal(fileURL, null);\n  }\n\n  @Override\n  public String fetchContent(String fileURL, String credentials)\n      throws IOException, DevfileException {\n    return fetchContentInternal(fileURL, credentials);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/convert/CommandConverter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.core.model.workspace.config.Command.COMMAND_ACTION_REFERENCE_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.Command.COMMAND_ACTION_REFERENCE_CONTENT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.Command.WORKING_DIRECTORY_ATTRIBUTE;\n\nimport java.io.IOException;\nimport org.eclipse.che.api.core.model.workspace.devfile.Action;\nimport org.eclipse.che.api.core.model.workspace.devfile.Command;\nimport org.eclipse.che.api.workspace.server.devfile.Constants;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.WorkspaceExportException;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ActionImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.CommandImpl;\n\n/**\n * Helps to convert {@link CommandImpl workspace command} to {@link Command devfile command} and\n * vice versa.\n *\n * @author Sergii Leshchenko\n */\npublic class CommandConverter {\n\n  /**\n   * Converts the specified workspace command to devfile command.\n   *\n   * @param command source workspace command\n   * @return created devfile command based on the specified workspace command\n   * @throws WorkspaceExportException if workspace command does not has specified component name\n   *     attribute where it should be run\n   */\n  public CommandImpl toDevfileCommand(\n      org.eclipse.che.api.workspace.server.model.impl.CommandImpl command)\n      throws WorkspaceExportException {\n    String componentName =\n        command.getAttributes().remove(Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE);\n    if (componentName == null) {\n      throw new WorkspaceExportException(\n          format(\n              \"Command `%s` has no specified component where it should be run\", command.getName()));\n    }\n\n    CommandImpl devCommand = new CommandImpl();\n    devCommand.setName(command.getName());\n    ActionImpl action = new ActionImpl();\n    action.setCommand(command.getCommandLine());\n    action.setType(command.getType());\n    action.setWorkdir(command.getAttributes().remove(WORKING_DIRECTORY_ATTRIBUTE));\n    action.setComponent(componentName);\n    action.setType(Constants.EXEC_ACTION_TYPE);\n    devCommand.getActions().add(action);\n    devCommand.setAttributes(command.getAttributes());\n    return devCommand;\n  }\n\n  /**\n   * Converts the specified devfile command to workspace command.\n   *\n   * @param devfileCommand devfile command that should be converted\n   * @return created workspace command based on the specified devfile command\n   * @throws DevfileFormatException if devfile command does not have any action\n   * @throws DevfileFormatException if devfile command has more than one action\n   */\n  public org.eclipse.che.api.workspace.server.model.impl.CommandImpl toWorkspaceCommand(\n      Command devfileCommand, FileContentProvider fileContentProvider) throws DevfileException {\n    if (devfileCommand.getActions().size() != 1) {\n      throw new DevfileFormatException(\n          format(\"Command `%s` MUST has one and only one action\", devfileCommand.getName()));\n    }\n\n    Action commandAction = devfileCommand.getActions().get(0);\n\n    return toWorkspaceCommand(devfileCommand, commandAction, fileContentProvider);\n  }\n\n  private org.eclipse.che.api.workspace.server.model.impl.CommandImpl toWorkspaceCommand(\n      Command devCommand, Action commandAction, FileContentProvider contentProvider)\n      throws DevfileException {\n    org.eclipse.che.api.workspace.server.model.impl.CommandImpl command =\n        new org.eclipse.che.api.workspace.server.model.impl.CommandImpl();\n    command.setName(devCommand.getName());\n    command.setType(commandAction.getType());\n    command.setCommandLine(commandAction.getCommand());\n    command.setPreviewUrl(devCommand.getPreviewUrl());\n\n    if (commandAction.getWorkdir() != null) {\n      command.getAttributes().put(WORKING_DIRECTORY_ATTRIBUTE, commandAction.getWorkdir());\n    }\n\n    if (commandAction.getComponent() != null) {\n      command\n          .getAttributes()\n          .put(Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE, commandAction.getComponent());\n    }\n\n    if (commandAction.getReference() != null) {\n      command.getAttributes().put(COMMAND_ACTION_REFERENCE_ATTRIBUTE, commandAction.getReference());\n    }\n\n    if (commandAction.getReferenceContent() != null) {\n      command\n          .getAttributes()\n          .put(COMMAND_ACTION_REFERENCE_CONTENT_ATTRIBUTE, commandAction.getReferenceContent());\n    } else if (commandAction.getReference() != null) {\n      try {\n        String referenceContent = contentProvider.fetchContent(commandAction.getReference());\n        command.getAttributes().put(COMMAND_ACTION_REFERENCE_CONTENT_ATTRIBUTE, referenceContent);\n      } catch (IOException e) {\n        throw new DevfileException(\n            format(\n                \"Failed to fetch content of action from reference %s: %s\",\n                commandAction.getReference(), e.getMessage()),\n            e);\n      }\n    }\n\n    command.getAttributes().putAll(devCommand.getAttributes());\n\n    return command;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/convert/DefaultEditorProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.EDITOR_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.EDITOR_FREE_DEVFILE_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.PLUGIN_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.shared.Constants.ASYNC_PERSIST_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.PERSIST_VOLUMES_ATTRIBUTE;\n\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentFQNParser;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.PluginFQNParser;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ExtendedPluginFQN;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Provision default editor if there is no any another editor and default plugins for it.\n *\n * @author Sergii Leshchenko\n */\npublic class DefaultEditorProvisioner {\n\n  private final String defaultEditorRef;\n  private final String defaultEditor;\n  private final Map<String, String> defaultPluginsToRefs;\n  private final String asyncStoragePluginRef;\n  private final ComponentFQNParser componentFQNParser;\n  private final PluginFQNParser pluginFQNParser;\n\n  @Inject\n  public DefaultEditorProvisioner(\n      @Named(\"che.workspace.devfile.default_editor\") String defaultEditorRef,\n      @Named(\"che.workspace.devfile.default_editor.plugins\") @Nullable String defaultPluginsRefs,\n      @Named(\"che.workspace.devfile.async.storage.plugin\") String asyncStoragePluginRef,\n      ComponentFQNParser componentFQNParser,\n      PluginFQNParser pluginFQNParser)\n      throws DevfileException {\n    this.defaultEditorRef = isNullOrEmpty(defaultEditorRef) ? null : defaultEditorRef;\n    this.asyncStoragePluginRef = asyncStoragePluginRef;\n    this.componentFQNParser = componentFQNParser;\n    this.pluginFQNParser = pluginFQNParser;\n    this.defaultEditor =\n        this.defaultEditorRef == null\n            ? null\n            : componentFQNParser.getPluginPublisherAndName(this.defaultEditorRef);\n    Map<String, String> map = new HashMap<>();\n    if (!isNullOrEmpty(defaultPluginsRefs)) {\n      for (String defaultPluginsRef : defaultPluginsRefs.split(\",\")) {\n        map.put(componentFQNParser.getPluginPublisherAndName(defaultPluginsRef), defaultPluginsRef);\n      }\n    }\n    this.defaultPluginsToRefs = map;\n  }\n\n  /**\n   * Provision default editor if there is no editor. Also provisions default plugins for default\n   * editor regardless whether it is provisioned or set by user.\n   *\n   * @param devfile devfile where editor and plugins should be provisioned\n   * @param contentProvider content provider for plugin references retrieval\n   */\n  public void apply(DevfileImpl devfile, FileContentProvider contentProvider)\n      throws DevfileException {\n    if (defaultEditorRef == null) {\n      // there is no default editor configured\n      return;\n    }\n\n    if (\"true\".equals(devfile.getAttributes().get(EDITOR_FREE_DEVFILE_ATTRIBUTE))) {\n      return;\n    }\n\n    List<ComponentImpl> components = devfile.getComponents();\n\n    Optional<ComponentImpl> editorOpt =\n        components.stream().filter(t -> EDITOR_COMPONENT_TYPE.equals(t.getType())).findFirst();\n\n    boolean isDefaultEditorUsed;\n    if (!editorOpt.isPresent()) {\n      components.add(new ComponentImpl(EDITOR_COMPONENT_TYPE, defaultEditorRef));\n      isDefaultEditorUsed = true;\n    } else {\n      Component editor = editorOpt.get();\n      String editorPublisherAndName = getPluginPublisherAndName(editor, contentProvider);\n      isDefaultEditorUsed = defaultEditor.equals(editorPublisherAndName);\n    }\n\n    if (isDefaultEditorUsed) {\n      provisionDefaultPlugins(components, contentProvider);\n    }\n    if (\"false\".equals(devfile.getAttributes().get(PERSIST_VOLUMES_ATTRIBUTE))\n        && \"true\".equals(devfile.getAttributes().get(ASYNC_PERSIST_ATTRIBUTE))) {\n      provisionAsyncStoragePlugin(components, contentProvider);\n    }\n  }\n\n  /**\n   * Provision the default editor plugins and add them to the the Devfile's component list\n   *\n   * @param components The set of components currently present in the Devfile\n   * @param contentProvider content provider for plugin references retrieval\n   * @throws DevfileException - A DevfileException containing any caught InfrastructureException\n   */\n  private void provisionDefaultPlugins(\n      List<ComponentImpl> components, FileContentProvider contentProvider) throws DevfileException {\n    Map<String, String> missingPluginsIdToRef = new HashMap<>(defaultPluginsToRefs);\n    removeAlreadyAddedPlugins(components, contentProvider, missingPluginsIdToRef);\n    try {\n      addMissingPlugins(components, contentProvider, missingPluginsIdToRef);\n    } catch (InfrastructureException e) {\n      throw new DevfileException(e.getMessage(), e);\n    }\n  }\n\n  /**\n   * Provision the for async storage service, it will provide ability backup and restore project\n   * source using special storage. Will torn on only if workspace start in Ephemeral mode and has\n   * attribute 'asyncPersist = true'\n   *\n   * @param components The set of components currently present in the Devfile\n   * @param contentProvider content provider for plugin references retrieval\n   * @throws DevfileException - A DevfileException containing any caught InfrastructureException\n   */\n  private void provisionAsyncStoragePlugin(\n      List<ComponentImpl> components, FileContentProvider contentProvider) throws DevfileException {\n    try {\n      Map<String, String> missingPluginsIdToRef =\n          Collections.singletonMap(\n              componentFQNParser.getPluginPublisherAndName(asyncStoragePluginRef),\n              asyncStoragePluginRef);\n      addMissingPlugins(components, contentProvider, missingPluginsIdToRef);\n    } catch (InfrastructureException e) {\n      throw new DevfileException(e.getMessage(), e);\n    }\n  }\n\n  /**\n   * Checks if any of the Devfile's components are also in the list of missing default plugins, and\n   * removes them.\n   *\n   * @param devfileComponents - The list of Devfile components\n   * @param contentProvider - The content provider to retrieve YAML\n   * @param missingPluginsIdToRef - The list of default plugins that are not currently in the list\n   *     of Devfile components\n   */\n  private void removeAlreadyAddedPlugins(\n      List<ComponentImpl> devfileComponents,\n      FileContentProvider contentProvider,\n      Map<String, String> missingPluginsIdToRef)\n      throws DevfileException {\n    for (ComponentImpl component : devfileComponents) {\n      if (PLUGIN_COMPONENT_TYPE.equals(component.getType())) {\n        String pluginPublisherAndName = getPluginPublisherAndName(component, contentProvider);\n        missingPluginsIdToRef.remove(pluginPublisherAndName);\n      }\n    }\n  }\n\n  /**\n   * Tries to add default plugins to the Devfile components. Each plugin is initially parsed by\n   * plugin ref. If the plugin does not have a reference, it is added to the component list, and its\n   * plugin ID will be used to resolve it. If it has a reference, the Plugin is evaluated, so that\n   * its meta.yaml can be retrieved. From the meta.yaml, the new Component's ID and reference are\n   * properly set, and the Component is added to the list.\n   *\n   * @param devfileComponents - The list of Devfile components\n   * @param contentProvider - The content provider to retrieve YAML\n   * @param missingPluginsIdToRef - The list of default plugins that are not currently in the list\n   *     of devfile components\n   * @throws InfrastructureException if the parser is unable to evaluate the FQN of the plugin.\n   */\n  private void addMissingPlugins(\n      List<ComponentImpl> devfileComponents,\n      FileContentProvider contentProvider,\n      Map<String, String> missingPluginsIdToRef)\n      throws InfrastructureException {\n    for (String pluginRef : missingPluginsIdToRef.values()) {\n      ComponentImpl component;\n      ExtendedPluginFQN fqn = pluginFQNParser.parsePluginFQN(pluginRef);\n      if (!isNullOrEmpty(fqn.getId())) {\n        component = new ComponentImpl(PLUGIN_COMPONENT_TYPE, pluginRef);\n      } else {\n        component = createReferencePluginComponent(pluginRef, contentProvider);\n      }\n      devfileComponents.add(component);\n    }\n  }\n\n  /**\n   * Evaluates a plugin FQN by retrieving it's meta.yaml, and sets it's name and reference to the\n   * appropriate values.\n   *\n   * @param pluginRef - The formatted plugin reference (e.g.\n   *     eclipse/che-machine-exec-plugin/nightly)\n   * @param contentProvider - The content provider used to read YAML data\n   * @return - A {@link ComponentImpl} with it's ID and reference URL set.\n   * @throws InfrastructureException when the parser cannot evalute the plugin's FQN.\n   */\n  private ComponentImpl createReferencePluginComponent(\n      String pluginRef, FileContentProvider contentProvider) throws InfrastructureException {\n    ExtendedPluginFQN fqn = pluginFQNParser.evaluateFqn(pluginRef, contentProvider);\n    ComponentImpl component = new ComponentImpl();\n    component.setType(PLUGIN_COMPONENT_TYPE);\n    if (!isNullOrEmpty(fqn.getId())) {\n      component.setId(fqn.getId());\n    }\n    if (!isNullOrEmpty(fqn.getReference())) {\n      component.setReference(fqn.getReference());\n    }\n    return component;\n  }\n\n  private String getPluginPublisherAndName(Component component, FileContentProvider contentProvider)\n      throws DevfileException {\n    final ExtendedPluginFQN fqn = componentFQNParser.evaluateFQN(component, contentProvider);\n    return fqn.getPublisherAndName();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/convert/DevfileConverter.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static org.eclipse.che.api.workspace.server.devfile.Components.getIdentifiableComponentName;\n\nimport java.util.Map;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.workspace.devfile.Command;\nimport org.eclipse.che.api.core.model.workspace.devfile.Devfile;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileRecipeFormatException;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.URLFileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentToWorkspaceApplier;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.ProjectConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ProjectImpl;\n\n/**\n * Helps to convert Devfile to workspace config and back.\n *\n * @author Max Shaposhnyk\n * @author Sergii Leshchenko\n */\npublic class DevfileConverter {\n\n  private final ProjectConverter projectConverter;\n  private final CommandConverter commandConverter;\n  private final Map<String, ComponentToWorkspaceApplier> componentTypeToApplier;\n  private final DefaultEditorProvisioner defaultEditorProvisioner;\n  private final URLFileContentProvider urlFileContentProvider;\n\n  @Inject\n  public DevfileConverter(\n      ProjectConverter projectConverter,\n      CommandConverter commandConverter,\n      Map<String, ComponentToWorkspaceApplier> componentTypeToApplier,\n      DefaultEditorProvisioner defaultEditorProvisioner,\n      URLFetcher urlFetcher) {\n    this.projectConverter = projectConverter;\n    this.commandConverter = commandConverter;\n    this.componentTypeToApplier = componentTypeToApplier;\n    this.defaultEditorProvisioner = defaultEditorProvisioner;\n    this.urlFileContentProvider = new URLFileContentProvider(null, urlFetcher);\n  }\n\n  /**\n   * Converts given {@link Devfile} into {@link WorkspaceConfigImpl workspace config}.\n   *\n   * <p>Note: some default components may be provisioned into devfile. The final devfile is\n   * accessible via {@link WorkspaceConfigImpl#getDevfile()}.\n   *\n   * @param devfile initial devfile\n   * @return constructed workspace config\n   * @throws ServerException when general devfile error occurs\n   */\n  public WorkspaceConfigImpl convert(Devfile devfile) throws ServerException {\n    try {\n      return devFileToWorkspaceConfig(\n          new DevfileImpl(devfile), FileContentProvider.cached(urlFileContentProvider));\n    } catch (DevfileException e) {\n      throw new ServerException(e.getMessage(), e);\n    }\n  }\n\n  /**\n   * Converts given {@link Devfile} into {@link WorkspaceConfigImpl workspace config}.\n   *\n   * @param devfile initial devfile\n   * @param contentProvider content provider for recipe-type component or plugin references\n   * @return constructed workspace config\n   * @throws DevfileException when general devfile error occurs\n   * @throws DevfileException when devfile requires additional files content but the specified\n   *     content provider does not support it\n   * @throws DevfileFormatException when devfile format is invalid\n   * @throws DevfileRecipeFormatException when content of the file specified in recipe type\n   *     component is empty or its format is invalid\n   */\n  public WorkspaceConfigImpl devFileToWorkspaceConfig(\n      DevfileImpl devfile, FileContentProvider contentProvider) throws DevfileException {\n    checkArgument(devfile != null, \"Devfile must not be null\");\n    checkArgument(contentProvider != null, \"Content provider must not be null\");\n\n    // make copy to avoid modification of original devfile\n    devfile = new DevfileImpl(devfile);\n\n    defaultEditorProvisioner.apply(devfile, contentProvider);\n\n    WorkspaceConfigImpl config = new WorkspaceConfigImpl();\n\n    config.setName(devfile.getName());\n\n    for (Command command : devfile.getCommands()) {\n      CommandImpl com = commandConverter.toWorkspaceCommand(command, contentProvider);\n      if (com != null) {\n        config.getCommands().add(com);\n      }\n    }\n\n    // note that component applier modifies commands in workspace config\n    // so, commands should be already converted\n    for (ComponentImpl component : devfile.getComponents()) {\n      ComponentToWorkspaceApplier applier = componentTypeToApplier.get(component.getType());\n      if (applier == null) {\n        throw new DevfileException(\n            String.format(\n                \"Devfile contains component `%s` with type `%s` that can not be converted to workspace\",\n                getIdentifiableComponentName(component), component.getType()));\n      }\n      applier.apply(config, component, contentProvider);\n    }\n\n    for (ProjectImpl project : devfile.getProjects()) {\n      ProjectConfigImpl projectConfig = projectConverter.toWorkspaceProject(project);\n      config.getProjects().add(projectConfig);\n    }\n\n    config.getAttributes().putAll(devfile.getAttributes());\n\n    config.setDevfile(devfile);\n\n    return config;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/convert/ProjectConverter.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.core.model.workspace.config.SourceStorage.BRANCH_PARAMETER_NAME;\nimport static org.eclipse.che.api.core.model.workspace.config.SourceStorage.COMMIT_ID_PARAMETER_NAME;\nimport static org.eclipse.che.api.core.model.workspace.config.SourceStorage.SPARSE_CHECKOUT_DIR_PARAMETER_NAME;\nimport static org.eclipse.che.api.core.model.workspace.config.SourceStorage.START_POINT_PARAMETER_NAME;\nimport static org.eclipse.che.api.core.model.workspace.config.SourceStorage.TAG_PARAMETER_NAME;\n\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport org.eclipse.che.api.core.model.workspace.devfile.Project;\nimport org.eclipse.che.api.core.model.workspace.devfile.Source;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.ProjectConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.SourceStorageImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ProjectImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.SourceImpl;\n\n/**\n * Helps to convert {@link ProjectConfigImpl workspace project} to {@link Project devfile project}\n * and vice versa.\n *\n * @author Sergii Leshchenko\n */\npublic class ProjectConverter {\n\n  /**\n   * Converts the specified workspace project to devfile project.\n   *\n   * @param projectConfig source workspace project\n   * @return created devfile project based on the specified workspace project\n   */\n  public ProjectImpl toDevfileProject(ProjectConfigImpl projectConfig) {\n    String branch = projectConfig.getSource().getParameters().get(BRANCH_PARAMETER_NAME);\n    String startPoint = projectConfig.getSource().getParameters().get(START_POINT_PARAMETER_NAME);\n    String tag = projectConfig.getSource().getParameters().get(TAG_PARAMETER_NAME);\n    String commitId = projectConfig.getSource().getParameters().get(COMMIT_ID_PARAMETER_NAME);\n    String sparseCheckoutDir =\n        projectConfig.getSource().getParameters().get(SPARSE_CHECKOUT_DIR_PARAMETER_NAME);\n\n    SourceImpl source =\n        new SourceImpl(\n            projectConfig.getSource().getType(),\n            projectConfig.getSource().getLocation(),\n            branch,\n            startPoint,\n            tag,\n            commitId,\n            sparseCheckoutDir);\n\n    String path = projectConfig.getPath();\n    while (path != null && path.startsWith(\"/\")) {\n      path = path.substring(1);\n    }\n\n    // don't specify the clonePath if it is the same as the project name\n    if (projectConfig.getName().equals(path)) {\n      path = null;\n    }\n\n    return new ProjectImpl(projectConfig.getName(), source, path);\n  }\n\n  /**\n   * Converts the specified devfile project to workspace project.\n   *\n   * @param devProject base devfile project\n   * @return created workspace project based on the specified devfile project\n   */\n  public ProjectConfigImpl toWorkspaceProject(Project devProject) throws DevfileException {\n    String clonePath = devProject.getClonePath();\n    if (clonePath == null || clonePath.isEmpty()) {\n      clonePath = \"/\" + devProject.getName();\n    } else {\n      clonePath = \"/\" + sanitizeClonePath(clonePath);\n    }\n\n    ProjectConfigImpl projectConfig = new ProjectConfigImpl();\n    projectConfig.setName(devProject.getName());\n    projectConfig.setPath(clonePath);\n\n    projectConfig.setSource(toSourceStorage(devProject.getSource()));\n    return projectConfig;\n  }\n\n  private SourceStorageImpl toSourceStorage(Source source) throws DevfileException {\n    SourceStorageImpl sourceStorage = new SourceStorageImpl();\n\n    sourceStorage.setType(source.getType());\n    sourceStorage.setLocation(source.getLocation());\n\n    updateSourceStorage(source, sourceStorage);\n\n    return sourceStorage;\n  }\n\n  private String sanitizeClonePath(String clonePath) throws DevfileException {\n    URI uri = clonePathToURI(clonePath);\n\n    if (uri.isAbsolute()) {\n      throw new DevfileException(\n          \"The clonePath must be a relative path. This seems to be an URI with a scheme: \"\n              + clonePath);\n    }\n\n    uri = uri.normalize();\n\n    String path = uri.getPath();\n\n    if (path.isEmpty()) {\n      // the user tried to trick us with something like \"blah/..\"\n      throw new DevfileException(\n          \"Cloning directly into projects root is not allowed.\"\n              + \" The clonePath that resolves to empty path: \"\n              + clonePath);\n    }\n\n    if (path.startsWith(\"/\")) {\n      // while technically we could allow this, because the project config contains what resembles\n      // an absolute path, it is better to explicitly disallow this in devfile, which is\n      // user-authored. Just don't give the user impression we can support absolute paths.\n      throw new DevfileException(\n          \"The clonePath must be a relative. This seems to be an absolute path: \" + clonePath);\n    }\n\n    if (path.startsWith(\"..\")) {\n      // an attempt to escape the projects root, e.g. \"ich/../muss/../../raus\". That's a no-no.\n      throw new DevfileException(\n          \"The clonePath cannot escape the projects root. Don't use .. to try and do that.\"\n              + \" The invalid path was: \"\n              + clonePath);\n    }\n\n    return path;\n  }\n\n  /**\n   * This merely re-throws the failure during the URI conversion as {@code DevfileException}.\n   *\n   * @param clonePath the path to convert to URI\n   * @return the URI representing the clonePath\n   * @throws DevfileException when the clonePath cannot be converted to an URI\n   */\n  private URI clonePathToURI(String clonePath) throws DevfileException {\n    try {\n      return new URI(clonePath);\n    } catch (URISyntaxException e) {\n      throw new DevfileException(\"Failed to parse the clonePath.\", e);\n    }\n  }\n\n  private void updateSourceStorage(Source devfileSource, SourceStorageImpl sourceStorage)\n      throws DevfileException {\n\n    String startPoint = devfileSource.getStartPoint();\n    String tag = devfileSource.getTag();\n    String commitId = devfileSource.getCommitId();\n\n    if ((startPoint != null && tag != null)\n        || (startPoint != null && commitId != null)\n        || (tag != null && commitId != null)) {\n\n      throw new DevfileException(\n          format(\n              \"Only one of '%s', '%s', '%s' can be specified.\",\n              START_POINT_PARAMETER_NAME, TAG_PARAMETER_NAME, COMMIT_ID_PARAMETER_NAME));\n    }\n\n    if (devfileSource.getBranch() != null) {\n      sourceStorage.getParameters().put(BRANCH_PARAMETER_NAME, devfileSource.getBranch());\n    }\n\n    // the order of importance is: startPoint > tag > commitId\n    if (startPoint != null) {\n      sourceStorage.getParameters().put(START_POINT_PARAMETER_NAME, startPoint);\n    } else if (tag != null) {\n      sourceStorage.getParameters().put(TAG_PARAMETER_NAME, tag);\n    } else if (commitId != null) {\n      sourceStorage.getParameters().put(COMMIT_ID_PARAMETER_NAME, commitId);\n    }\n\n    if (devfileSource.getSparseCheckoutDir() != null) {\n      sourceStorage.getParameters().put(\"keepDir\", devfileSource.getSparseCheckoutDir());\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/convert/component/ComponentFQNParser.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert.component;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.COMPOSITE_EDITOR_PLUGIN_ATTRIBUTE_FORMAT;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.EDITOR_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.PLUGIN_COMPONENT_TYPE;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.PluginFQNParser;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ExtendedPluginFQN;\n\n/**\n * Helper class to build {@code ExtendedPluginFQN} from editor/plugin type components and other FQN\n * utility functions.\n */\npublic class ComponentFQNParser {\n\n  private final PluginFQNParser fqnParser;\n\n  @Inject\n  public ComponentFQNParser(PluginFQNParser fqnParser) {\n    this.fqnParser = fqnParser;\n  }\n\n  public ExtendedPluginFQN evaluateFQN(Component component, FileContentProvider contentProvider)\n      throws DevfileException {\n    if (!component.getType().equals(EDITOR_COMPONENT_TYPE)\n        && !component.getType().equals(PLUGIN_COMPONENT_TYPE)) {\n      throw new DevfileException(\n          \"Invalid component type provided. Only editor or plugin is supported.\");\n    }\n    try {\n      if (!isNullOrEmpty(component.getReference())) {\n        return fqnParser.evaluateFqn(component.getReference(), contentProvider);\n      } else {\n        return fqnParser.parsePluginFQN(\n            getCompositeId(component.getRegistryUrl(), component.getId()));\n      }\n    } catch (InfrastructureException e) {\n      throw new DevfileException(e.getMessage(), e);\n    }\n  }\n\n  public String getCompositeId(String registryUrl, String id) {\n    return registryUrl != null\n        ? format(COMPOSITE_EDITOR_PLUGIN_ATTRIBUTE_FORMAT, registryUrl, id)\n        : id;\n  }\n\n  public String getPluginPublisherAndName(String pluginId) throws DevfileException {\n    try {\n      ExtendedPluginFQN meta = fqnParser.parsePluginFQN(pluginId);\n      return meta.getPublisherAndName();\n    } catch (InfrastructureException e) {\n      throw new DevfileException(e.getMessage(), e);\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/convert/component/ComponentToWorkspaceApplier.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert.component;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.devfile.Endpoint;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\n\n/**\n * Applies changes on workspace config according to the specified component. Different\n * implementations are specialized on the concrete component type.\n *\n * @author Sergii Leshchenko\n */\npublic interface ComponentToWorkspaceApplier {\n\n  /**\n   * Applies changes on workspace config according to the specified component.\n   *\n   * @param workspaceConfig workspace config on which changes should be applied\n   * @param component component that should be applied\n   * @param contentProvider optional content provider that may be used for external component\n   *     resource fetching\n   * @throws IllegalArgumentException if the specified workspace config or devfile is null\n   * @throws DevfileException if content provider is null while the specified component requires\n   *     external file content\n   * @throws DevfileException if any exception occurs during content retrieving\n   */\n  void apply(\n      WorkspaceConfigImpl workspaceConfig,\n      ComponentImpl component,\n      FileContentProvider contentProvider)\n      throws DevfileException;\n\n  static Map<String, ServerConfigImpl> convertEndpointsIntoServers(\n      List<? extends Endpoint> endpoints, boolean requireSubdomain) {\n    return endpoints.stream()\n        .collect(\n            Collectors.toMap(\n                Endpoint::getName,\n                e -> {\n                  var cfg = ServerConfigImpl.createFromEndpoint(e);\n                  ServerConfig.setRequireSubdomain(cfg.getAttributes(), requireSubdomain);\n                  return cfg;\n                }));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/convert/component/editor/EditorComponentToWorkspaceApplier.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert.component.editor;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.core.model.workspace.config.Command.PLUGIN_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.EDITOR_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.shared.Constants.WORKSPACE_TOOLING_EDITOR_ATTRIBUTE;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentFQNParser;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentToWorkspaceApplier;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ExtendedPluginFQN;\n\n/**\n * Applies changes on workspace config according to the specified editor component.\n *\n * @author Sergii Leshchenko\n */\npublic class EditorComponentToWorkspaceApplier implements ComponentToWorkspaceApplier {\n\n  private final ComponentFQNParser componentFQNParser;\n\n  @Inject\n  public EditorComponentToWorkspaceApplier(ComponentFQNParser componentFQNParser) {\n    this.componentFQNParser = componentFQNParser;\n  }\n\n  /**\n   * Applies changes on workspace config according to the specified editor component.\n   *\n   * @param workspaceConfig workspace config on which changes should be applied\n   * @param editorComponent plugin component that should be applied\n   * @param contentProvider optional content provider that may be used for external component\n   *     resource fetching\n   * @throws IllegalArgumentException if specified workspace config or plugin component is null\n   * @throws IllegalArgumentException if specified component has type different from cheEditor\n   */\n  @Override\n  public void apply(\n      WorkspaceConfigImpl workspaceConfig,\n      ComponentImpl editorComponent,\n      FileContentProvider contentProvider)\n      throws DevfileException {\n    checkArgument(workspaceConfig != null, \"Workspace config must not be null\");\n    checkArgument(editorComponent != null, \"Component must not be null\");\n    checkArgument(\n        EDITOR_COMPONENT_TYPE.equals(editorComponent.getType()),\n        format(\"Plugin must have `%s` type\", EDITOR_COMPONENT_TYPE));\n\n    final String editorComponentAlias = editorComponent.getAlias();\n    final String editorId = editorComponent.getId();\n    final String registryUrl = editorComponent.getRegistryUrl();\n\n    final ExtendedPluginFQN fqn = componentFQNParser.evaluateFQN(editorComponent, contentProvider);\n\n    if (!isNullOrEmpty(fqn.getReference())) {\n      workspaceConfig.getAttributes().put(WORKSPACE_TOOLING_EDITOR_ATTRIBUTE, fqn.getReference());\n    } else {\n      workspaceConfig\n          .getAttributes()\n          .put(\n              WORKSPACE_TOOLING_EDITOR_ATTRIBUTE,\n              componentFQNParser.getCompositeId(registryUrl, editorId));\n    }\n\n    workspaceConfig.getCommands().stream()\n        .filter(\n            c ->\n                editorComponentAlias != null\n                    && editorComponentAlias.equals(\n                        c.getAttributes().get(COMPONENT_ALIAS_COMMAND_ATTRIBUTE)))\n        .forEach(c -> c.getAttributes().put(PLUGIN_ATTRIBUTE, fqn.getId()));\n\n    // make sure id is set to be able to match component with plugin broker result\n    // when referenceContent is used\n    editorComponent.setId(fqn.getId());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/convert/component/plugin/PluginComponentToWorkspaceApplier.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert.component.plugin;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.core.model.workspace.config.Command.PLUGIN_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.PLUGIN_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.shared.Constants.WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentFQNParser;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentToWorkspaceApplier;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ExtendedPluginFQN;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Applies changes on workspace config according to the specified plugin component.\n *\n * @author Sergii Leshchenko\n */\npublic class PluginComponentToWorkspaceApplier implements ComponentToWorkspaceApplier {\n\n  private final ComponentFQNParser componentFQNParser;\n\n  @Inject\n  public PluginComponentToWorkspaceApplier(ComponentFQNParser componentFQNParser) {\n    this.componentFQNParser = componentFQNParser;\n  }\n\n  /**\n   * Applies changes on workspace config according to the specified plugin component.\n   *\n   * @param workspaceConfig workspace config on which changes should be applied\n   * @param pluginComponent plugin component that should be applied\n   * @param contentProvider optional content provider that may be used for external component\n   *     resource fetching\n   * @throws IllegalArgumentException if specified workspace config or plugin component is null\n   * @throws IllegalArgumentException if specified component has type different from chePlugin\n   */\n  @Override\n  public void apply(\n      WorkspaceConfigImpl workspaceConfig,\n      ComponentImpl pluginComponent,\n      @Nullable FileContentProvider contentProvider)\n      throws DevfileException {\n    checkArgument(workspaceConfig != null, \"Workspace config must not be null\");\n    checkArgument(pluginComponent != null, \"Component must not be null\");\n    checkArgument(\n        PLUGIN_COMPONENT_TYPE.equals(pluginComponent.getType()),\n        format(\"Plugin must have `%s` type\", PLUGIN_COMPONENT_TYPE));\n\n    String workspacePluginsAttribute =\n        workspaceConfig.getAttributes().get(WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE);\n\n    final String pluginId = pluginComponent.getId();\n    final String registryUrl = pluginComponent.getRegistryUrl();\n\n    final ExtendedPluginFQN fqn = componentFQNParser.evaluateFQN(pluginComponent, contentProvider);\n    if (!isNullOrEmpty(fqn.getReference())) {\n      workspaceConfig\n          .getAttributes()\n          .put(\n              WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE,\n              append(workspacePluginsAttribute, fqn.getReference()));\n    } else {\n      workspaceConfig\n          .getAttributes()\n          .put(\n              WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE,\n              append(\n                  workspacePluginsAttribute,\n                  componentFQNParser.getCompositeId(registryUrl, pluginId)));\n    }\n\n    for (CommandImpl command : workspaceConfig.getCommands()) {\n      String commandComponent = command.getAttributes().get(COMPONENT_ALIAS_COMMAND_ATTRIBUTE);\n\n      if (commandComponent == null) {\n        // command does not have component information\n        continue;\n      }\n\n      if (!commandComponent.equals(pluginComponent.getAlias())) {\n        continue;\n      }\n\n      command.getAttributes().put(PLUGIN_ATTRIBUTE, fqn.getId());\n    }\n\n    // make sure id is set to be able to match component with plugin broker result\n    // when referenceContent is used\n    pluginComponent.setId(fqn.getId());\n  }\n\n  private String append(String source, String toAppend) {\n    if (isNullOrEmpty(source)) {\n      return toAppend;\n    } else {\n      return source + \",\" + toAppend;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/exception/DevfileException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.exception;\n\n/** Describes general devfile exception. */\npublic class DevfileException extends Exception {\n\n  public DevfileException(String message, Throwable cause) {\n    super(message, cause);\n  }\n\n  public DevfileException(String message) {\n    super(message);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/exception/DevfileFormatException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.exception;\n\n/** Thrown when devfile schema or integrity validation is failed. */\npublic class DevfileFormatException extends DevfileException {\n\n  public DevfileFormatException(String formatError) {\n    super(formatError);\n  }\n\n  public DevfileFormatException(String formatError, Exception cause) {\n    super(formatError, cause);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/exception/OverrideParameterException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.exception;\n\npublic class OverrideParameterException extends Exception {\n\n  public OverrideParameterException(String error) {\n    super(error);\n  }\n\n  public OverrideParameterException(String error, Exception cause) {\n    super(error, cause);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/exception/WorkspaceExportException.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.exception;\n\n/** Thrown when workspace can not be exported into devfile by some reason. */\npublic class WorkspaceExportException extends Exception {\n\n  public WorkspaceExportException(String error) {\n    super(error);\n  }\n\n  public WorkspaceExportException(String error, Exception cause) {\n    super(error, cause);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/validator/ComponentIntegrityValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.validator;\n\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\n\n/**\n * There are several types of components that are handled in an infrastructure-specific way. This\n * interface provides the devfile validator with component-specific validators.\n */\npublic interface ComponentIntegrityValidator {\n\n  /**\n   * Validates the component. The component is guaranteed to be of the type that can be handled by\n   * this validator.\n   *\n   * @param component the devfile component to validate\n   * @param contentProvider content provider that can be used to resolve references\n   */\n  void validateComponent(Component component, FileContentProvider contentProvider)\n      throws DevfileFormatException;\n\n  final class NoopComponentIntegrityValidator implements ComponentIntegrityValidator {\n\n    @Override\n    public void validateComponent(Component component, FileContentProvider contentProvider) {}\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/validator/DevfileIntegrityValidator.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.validator;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.workspace.server.devfile.Components.getIdentifiableComponentName;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.DOCKERIMAGE_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.EDITOR_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.OPENSHIFT_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.PLUGIN_COMPONENT_TYPE;\n\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.function.Function;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.devfile.Action;\nimport org.eclipse.che.api.core.model.workspace.devfile.Command;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.api.core.model.workspace.devfile.Devfile;\nimport org.eclipse.che.api.core.model.workspace.devfile.Endpoint;\nimport org.eclipse.che.api.core.model.workspace.devfile.Env;\nimport org.eclipse.che.api.core.model.workspace.devfile.Project;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\n\n/** Validates devfile logical integrity. */\n@Singleton\npublic class DevfileIntegrityValidator {\n\n  /**\n   * Checks than name may contain only letters, digits, symbols _.- and does not starts with\n   * non-word character.\n   */\n  private static final Pattern PROJECT_NAME_PATTERN = Pattern.compile(\"^[\\\\w\\\\d]+[\\\\w\\\\d_.-]*$\");\n\n  private final Map<String, ComponentIntegrityValidator> validators;\n\n  @Inject\n  public DevfileIntegrityValidator(Map<String, ComponentIntegrityValidator> validators) {\n    this.validators = validators;\n  }\n\n  /**\n   * Performs the following checks:\n   *\n   * <pre>\n   * <ul>\n   *   <li>All listed items (projects, components, commands) have unique names</li>\n   *   <li>There is only one component of type cheEditor</li>\n   *   <li>All components exists which are referenced/required by command actions</li>\n   *   <li>Project names conforms naming rules</li>\n   * </ul>\n   * </pre>\n   *\n   * <p>Note that this doesn't validate the selectors in the devfile. If you have access to the\n   * {@link FileContentProvider} instance, you may want to also invoke {@link\n   * #validateContentReferences(Devfile, FileContentProvider)} to perform further validation that is\n   * otherwise impossible.\n   *\n   * @param devfile input devfile\n   * @throws DevfileFormatException if some of the checks is failed\n   * @see #validateContentReferences(Devfile, FileContentProvider)\n   */\n  public void validateDevfile(Devfile devfile) throws DevfileFormatException {\n    validateProjects(devfile);\n    Set<String> knownAliases = validateComponents(devfile);\n    validateCommands(devfile, knownAliases);\n  }\n\n  /**\n   * Validates that various selectors in the devfile reference something in the referenced content.\n   *\n   * @param devfile the validated devfile\n   * @param provider the file content provider to fetch the referenced content with.\n   * @throws DevfileFormatException when some selectors don't match any objects in the referenced\n   *     content or any other exception thrown during the validation\n   */\n  public void validateContentReferences(Devfile devfile, FileContentProvider provider)\n      throws DevfileFormatException {\n    for (Component component : devfile.getComponents()) {\n      ComponentIntegrityValidator validator = validators.get(component.getType());\n      if (validator == null) {\n        throw new DevfileFormatException(format(\"Unknown component type: %s\", component.getType()));\n      }\n\n      validator.validateComponent(component, provider);\n    }\n  }\n\n  private Set<String> validateComponents(Devfile devfile) throws DevfileFormatException {\n    Set<String> definedAliases = new HashSet<>();\n    Component editorComponent = null;\n\n    Map<String, Set<String>> idsPerComponentType = new HashMap<>();\n\n    for (Component component : devfile.getComponents()) {\n      if (component.getAlias() != null && !definedAliases.add(component.getAlias())) {\n        throw new DevfileFormatException(\n            format(\"Duplicate component alias found:'%s'\", component.getAlias()));\n      }\n      Optional<Map.Entry<String, Long>> duplicatedEndpoint =\n          component.getEndpoints().stream()\n              .map(Endpoint::getName)\n              .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))\n              .entrySet()\n              .stream()\n              .filter(e -> e.getValue() > 1L)\n              .findFirst();\n      if (duplicatedEndpoint.isPresent()) {\n        throw new DevfileFormatException(\n            format(\n                \"Duplicated endpoint name '%s' found in '%s' component\",\n                duplicatedEndpoint.get().getKey(), getIdentifiableComponentName(component)));\n      }\n\n      Set<String> tempSet = new HashSet<>();\n      for (Env env : component.getEnv()) {\n        if (!tempSet.add(env.getName())) {\n          throw new DevfileFormatException(\n              format(\n                  \"Duplicate environment variable '%s' found in component '%s'\",\n                  env.getName(), getIdentifiableComponentName(component)));\n        }\n      }\n\n      if (!idsPerComponentType\n          .computeIfAbsent(component.getType(), __ -> new HashSet<>())\n          .add(getIdentifiableComponentName(component))) {\n\n        throw new DevfileFormatException(\n            format(\n                \"There are multiple components '%s' of type '%s' that cannot be uniquely\"\n                    + \" identified. Please add aliases that would distinguish the components.\",\n                getIdentifiableComponentName(component), component.getType()));\n      }\n\n      if (component.getAutomountWorkspaceSecrets() != null && component.getAlias() == null) {\n        throw new DevfileFormatException(\n            format(\n                \"The 'automountWorkspaceSecrets' property cannot be used in component which doesn't have alias. \"\n                    + \"Please add alias to component '%s' that would allow to distinguish its containers.\",\n                getIdentifiableComponentName(component)));\n      }\n\n      switch (component.getType()) {\n        case EDITOR_COMPONENT_TYPE:\n          if (editorComponent != null) {\n            throw new DevfileFormatException(\n                format(\n                    \"Multiple editor components found: '%s', '%s'\",\n                    getIdentifiableComponentName(editorComponent),\n                    getIdentifiableComponentName(component)));\n          }\n          editorComponent = component;\n          break;\n\n        case PLUGIN_COMPONENT_TYPE:\n        case KUBERNETES_COMPONENT_TYPE:\n        case OPENSHIFT_COMPONENT_TYPE:\n        case DOCKERIMAGE_COMPONENT_TYPE:\n          // do nothing\n          break;\n\n        default:\n          throw new DevfileFormatException(\n              format(\n                  \"One of the components has unsupported component type: '%s'\",\n                  component.getType()));\n      }\n    }\n    return definedAliases;\n  }\n\n  private void validateCommands(Devfile devfile, Set<String> knownAliases)\n      throws DevfileFormatException {\n    Set<String> existingNames = new HashSet<>();\n    for (Command command : devfile.getCommands()) {\n      if (!existingNames.add(command.getName())) {\n        throw new DevfileFormatException(\n            format(\"Duplicate command name found:'%s'\", command.getName()));\n      }\n\n      if (command.getActions().isEmpty()) {\n        throw new DevfileFormatException(\n            format(\"Command '%s' does not have actions.\", command.getName()));\n      }\n\n      // It is temporary restriction while exec plugin is not able to handle multiple commands\n      // in different containers as one Task. Later supporting of multiple actions in one command\n      // may be implemented.\n      if (command.getActions().size() > 1) {\n        throw new DevfileFormatException(\n            format(\"Multiple actions in command '%s' are not supported yet.\", command.getName()));\n      }\n\n      Action action = command.getActions().get(0);\n\n      if (action.getComponent() == null\n          && (action.getReference() != null || action.getReferenceContent() != null)) {\n        // ok, this action contains a reference to the file containing the definition. Such\n        // actions don't have to have component alias defined.\n        continue;\n      }\n\n      if (!knownAliases.contains(action.getComponent())) {\n        throw new DevfileFormatException(\n            format(\n                \"Command '%s' has action that refers to a component with unknown alias '%s'\",\n                command.getName(), action.getComponent()));\n      }\n    }\n  }\n\n  private void validateProjects(Devfile devfile) throws DevfileFormatException {\n    Set<String> existingNames = new HashSet<>();\n    for (Project project : devfile.getProjects()) {\n      if (!existingNames.add(project.getName())) {\n        throw new DevfileFormatException(\n            format(\"Duplicate project name found:'%s'\", project.getName()));\n      }\n      if (!PROJECT_NAME_PATTERN.matcher(project.getName()).matches()) {\n        throw new DevfileFormatException(\n            format(\n                \"Invalid project name found:'%s'. Name must contain only Latin letters,\"\n                    + \"digits or these following special characters ._-\",\n                project.getName()));\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/validator/ErrorMessageComposer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.validator;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\nimport java.util.List;\nimport org.leadpony.justify.api.Problem;\n\n/**\n * Helps to convert json schema validation result list of {@link Problem} into an error message\n * string.\n */\npublic class ErrorMessageComposer {\n\n  /**\n   * Parses {@link Problem} list into an error string. Each problem is recursively parsed to extract\n   * nested errors if any.\n   *\n   * @param validationErrors Schema validation problems list\n   * @return composite error string\n   */\n  public String extractMessages(List<Problem> validationErrors, StringBuilder messageBuilder) {\n    for (Problem problem : validationErrors) {\n      int branchCount = problem.countBranches();\n      if (branchCount == 0) {\n        messageBuilder.append(getMessage(problem));\n      } else {\n        messageBuilder.append(problem.getMessage()).append(\": [\");\n        for (int i = 0; i < branchCount; i++) {\n          extractMessages(problem.getBranch(i), messageBuilder);\n        }\n        messageBuilder.append(\"]\");\n      }\n    }\n    return messageBuilder.toString();\n  }\n\n  private String getMessage(Problem problem) {\n    StringBuilder messageBuilder = new StringBuilder();\n    if (!isNullOrEmpty(problem.getPointer())) {\n      messageBuilder.append(\"(\").append(problem.getPointer()).append(\"):\");\n    }\n    messageBuilder.append(problem.getMessage());\n    return messageBuilder.toString();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/event/MachineStatusJsonRpcMessenger.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.event;\n\nimport static org.eclipse.che.api.workspace.shared.Constants.MACHINE_STATUS_CHANGED_METHOD;\n\nimport jakarta.annotation.PostConstruct;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.notification.RemoteSubscriptionManager;\nimport org.eclipse.che.api.workspace.shared.dto.event.MachineStatusEvent;\n\n/** Send workspace events using JSON RPC to the clients */\n@Singleton\npublic class MachineStatusJsonRpcMessenger {\n  private final RemoteSubscriptionManager remoteSubscriptionManager;\n\n  @Inject\n  public MachineStatusJsonRpcMessenger(RemoteSubscriptionManager remoteSubscriptionManager) {\n    this.remoteSubscriptionManager = remoteSubscriptionManager;\n  }\n\n  @PostConstruct\n  private void postConstruct() {\n    remoteSubscriptionManager.register(\n        MACHINE_STATUS_CHANGED_METHOD, MachineStatusEvent.class, this::predicate);\n  }\n\n  private boolean predicate(MachineStatusEvent event, Map<String, String> scope) {\n    return event.getIdentity().getWorkspaceId().equals(scope.get(\"workspaceId\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/event/RuntimeAbnormalStoppedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.event;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\n\n/**\n * Should be propagated after Infrastructure stopped a runtime because of any fatal error.\n *\n * @author Sergii Leshchenko\n */\npublic class RuntimeAbnormalStoppedEvent {\n\n  private RuntimeIdentity runtimeId;\n  private String reason;\n\n  public RuntimeAbnormalStoppedEvent(RuntimeIdentity runtimeId, String reason) {\n    this.runtimeId = runtimeId;\n    this.reason = reason;\n  }\n\n  public RuntimeIdentity getIdentity() {\n    return runtimeId;\n  }\n\n  public String getReason() {\n    return reason;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/event/RuntimeAbnormalStoppingEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.event;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\n\n/**\n * Should be propagated before Infrastructure stops a runtime because of any fatal error.\n *\n * @author Sergii Leshchenko\n */\npublic class RuntimeAbnormalStoppingEvent {\n\n  private RuntimeIdentity runtimeId;\n  private String reason;\n\n  public RuntimeAbnormalStoppingEvent(RuntimeIdentity runtimeId, String reason) {\n    this.runtimeId = runtimeId;\n    this.reason = reason;\n  }\n\n  public RuntimeIdentity getIdentity() {\n    return runtimeId;\n  }\n\n  public String getReason() {\n    return reason;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/event/RuntimeLogJsonRpcMessenger.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.event;\n\nimport static org.eclipse.che.api.workspace.shared.Constants.MACHINE_LOG_METHOD;\nimport static org.eclipse.che.api.workspace.shared.Constants.RUNTIME_LOG_METHOD;\n\nimport jakarta.annotation.PostConstruct;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.notification.RemoteSubscriptionManager;\nimport org.eclipse.che.api.workspace.shared.dto.event.RuntimeLogEvent;\n\n/**\n * Register subscriber on {@link RuntimeLogEvent runtime log event} for resending this type of event\n * via JSON-RPC to clients.\n *\n * @author Sergii Leshchenko\n */\n@Singleton\npublic class RuntimeLogJsonRpcMessenger {\n\n  private final RemoteSubscriptionManager subscriptionManager;\n\n  @Inject\n  public RuntimeLogJsonRpcMessenger(RemoteSubscriptionManager subscriptionManager) {\n    this.subscriptionManager = subscriptionManager;\n  }\n\n  @PostConstruct\n  private void postConstruct() {\n    subscriptionManager.register(RUNTIME_LOG_METHOD, RuntimeLogEvent.class, this::predicate);\n    subscriptionManager.register(\n        MACHINE_LOG_METHOD, RuntimeLogEvent.class, this::predicateMachineLog);\n  }\n\n  private boolean predicate(RuntimeLogEvent event, Map<String, String> scope) {\n    return event.getRuntimeId().getWorkspaceId().equals(scope.get(\"workspaceId\"));\n  }\n\n  private boolean predicateMachineLog(RuntimeLogEvent event, Map<String, String> scope) {\n    return event.getMachineName() != null\n        && event.getRuntimeId().getWorkspaceId().equals(scope.get(\"workspaceId\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/event/RuntimeStatusJsonRpcMessenger.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.event;\n\nimport jakarta.annotation.PostConstruct;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.notification.RemoteSubscriptionManager;\nimport org.eclipse.che.api.workspace.shared.dto.event.RuntimeStatusEvent;\n\n/** Send workspace events using JSON RPC to the clients */\n@Singleton\npublic class RuntimeStatusJsonRpcMessenger {\n  private final RemoteSubscriptionManager remoteSubscriptionManager;\n\n  @Inject\n  public RuntimeStatusJsonRpcMessenger(RemoteSubscriptionManager remoteSubscriptionManager) {\n    this.remoteSubscriptionManager = remoteSubscriptionManager;\n  }\n\n  @PostConstruct\n  private void postConstruct() {\n    remoteSubscriptionManager.register(\n        \"runtime/statusChanged\", RuntimeStatusEvent.class, this::predicate);\n  }\n\n  private boolean predicate(RuntimeStatusEvent event, Map<String, String> scope) {\n    return event.getIdentity().getWorkspaceId().equals(scope.get(\"workspaceId\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/event/ServerIdleEvent.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.event;\n\n/** Event informing about idling the che server. */\npublic class ServerIdleEvent {\n  private long timeout;\n\n  /** Implements the handler to handle idling. */\n  public ServerIdleEvent(long timeout) {\n    super();\n    this.timeout = timeout;\n  }\n\n  public long getTimeout() {\n    return timeout;\n  }\n\n  public void setTimeout(long timeout) {\n    this.timeout = timeout;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/event/ServerStatusJsonRpcMessenger.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.event;\n\nimport static org.eclipse.che.api.workspace.shared.Constants.SERVER_STATUS_CHANGED_METHOD;\n\nimport jakarta.annotation.PostConstruct;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.notification.RemoteSubscriptionManager;\nimport org.eclipse.che.api.workspace.shared.dto.event.ServerStatusEvent;\n\n/** Send workspace events using JSON RPC to the clients */\n@Singleton\npublic class ServerStatusJsonRpcMessenger {\n  private final RemoteSubscriptionManager remoteSubscriptionManager;\n\n  @Inject\n  public ServerStatusJsonRpcMessenger(RemoteSubscriptionManager remoteSubscriptionManager) {\n    this.remoteSubscriptionManager = remoteSubscriptionManager;\n  }\n\n  @PostConstruct\n  private void postConstruct() {\n    remoteSubscriptionManager.register(\n        SERVER_STATUS_CHANGED_METHOD, ServerStatusEvent.class, this::predicate);\n  }\n\n  private boolean predicate(ServerStatusEvent event, Map<String, String> scope) {\n    return event.getIdentity().getWorkspaceId().equals(scope.get(\"workspaceId\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/event/WorkspaceJsonRpcMessenger.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.event;\n\nimport static org.eclipse.che.api.workspace.shared.Constants.WORKSPACE_STATUS_CHANGED_METHOD;\n\nimport jakarta.annotation.PostConstruct;\nimport java.util.Map;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.notification.RemoteSubscriptionManager;\nimport org.eclipse.che.api.workspace.shared.dto.event.WorkspaceStatusEvent;\n\n/** Send workspace events using JSON RPC to the clients */\n@Singleton\npublic class WorkspaceJsonRpcMessenger {\n  private final RemoteSubscriptionManager remoteSubscriptionManager;\n\n  @Inject\n  public WorkspaceJsonRpcMessenger(RemoteSubscriptionManager remoteSubscriptionManager) {\n    this.remoteSubscriptionManager = remoteSubscriptionManager;\n  }\n\n  @PostConstruct\n  private void postConstruct() {\n    remoteSubscriptionManager.register(\n        WORKSPACE_STATUS_CHANGED_METHOD, WorkspaceStatusEvent.class, this::predicate);\n  }\n\n  private boolean predicate(WorkspaceStatusEvent event, Map<String, String> scope) {\n    return event.getWorkspaceId().equals(scope.get(\"workspaceId\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/HttpConnectionServerChecker.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.common.io.CharStreams;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.Reader;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.Timer;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.commons.proxy.ProxyAuthenticator;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Server checker that uses http connection response code as a criteria of availability of a server.\n * If response code is not less than 200 and less than 400 server is treated as available.\n *\n * @author Alexander Garagatyi\n */\npublic class HttpConnectionServerChecker extends ServerChecker {\n  private static final Logger LOG = LoggerFactory.getLogger(HttpConnectionServerChecker.class);\n  private static final String AUTHORIZATION_HEADER = \"Authorization\";\n  private static final String CONNECTION_HEADER = \"Connection\";\n  private static final String CONNECTION_CLOSE = \"close\";\n  private final URL url;\n  private final String token;\n  private final String serverRef;\n\n  public HttpConnectionServerChecker(\n      URL url,\n      String machineName,\n      String serverRef,\n      long timeout,\n      TimeUnit timeUnit,\n      Timer timer,\n      String token) {\n    super(machineName, serverRef, timeout, timeUnit, timer);\n    this.url = url;\n    this.serverRef = serverRef;\n    this.token = token;\n  }\n\n  @Override\n  public boolean isAvailable() {\n    HttpURLConnection httpURLConnection = null;\n    try {\n      ProxyAuthenticator.initAuthenticator(url.toString());\n      httpURLConnection = createConnection(url);\n      // TODO consider how much time we should use as a limit\n      httpURLConnection.setConnectTimeout((int) TimeUnit.SECONDS.toMillis(3));\n      httpURLConnection.setReadTimeout((int) TimeUnit.SECONDS.toMillis(3));\n      httpURLConnection.setRequestProperty(CONNECTION_HEADER, CONNECTION_CLOSE);\n      if (token != null) {\n        httpURLConnection.setRequestProperty(AUTHORIZATION_HEADER, \"Bearer \" + token);\n      }\n      return isConnectionSuccessful(httpURLConnection);\n    } catch (IOException e) {\n      LOG.debug(\n          \"Failed to establish http connection to check server '{}'. Cause: {}\",\n          serverRef,\n          e.getMessage());\n      return false;\n    } finally {\n      ProxyAuthenticator.resetAuthenticator();\n      if (httpURLConnection != null) {\n        httpURLConnection.disconnect();\n      }\n    }\n  }\n\n  boolean isConnectionSuccessful(HttpURLConnection conn) {\n    try {\n      int responseCode = conn.getResponseCode();\n      boolean success = isConnectionSuccessful(responseCode);\n\n      if (!success && LOG.isDebugEnabled()) {\n        String response;\n        try {\n          InputStream in = conn.getErrorStream();\n          if (in == null) {\n            in = conn.getInputStream();\n          }\n\n          try (Reader reader = new InputStreamReader(in)) {\n            response = CharStreams.toString(reader);\n          }\n        } catch (Exception e) {\n          response = \"failed to ready response: \" + e.getMessage();\n        }\n        LOG.debug(\n            \"Server check for '{}:{}' request failed with code {}. Response: {}\",\n            serverRef,\n            url,\n            responseCode,\n            response);\n      }\n\n      return success;\n    } catch (IOException e) {\n      LOG.debug(\n          \"Failed to establish http connection to check server '{}:{}'. Cause: {}\",\n          serverRef,\n          url,\n          e.getMessage());\n      return false;\n    }\n  }\n\n  boolean isConnectionSuccessful(int responseCode) {\n    return responseCode >= 200 && responseCode < 400;\n  }\n\n  @VisibleForTesting\n  HttpURLConnection createConnection(URL url) throws IOException {\n    return (HttpURLConnection) url.openConnection();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/ServerChecker.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc;\n\nimport java.util.Timer;\nimport java.util.TimerTask;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.TimeUnit;\nimport java.util.function.Consumer;\nimport java.util.function.Function;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\n\n/**\n * Checks availability of a server.\n *\n * @author Alexander Garagatyi\n */\npublic abstract class ServerChecker {\n  private final String machineName;\n  private final String serverRef;\n  private final long period;\n  private final long deadLine;\n  private final CompletableFuture<String> reportFuture;\n  private final Timer timer;\n\n  /**\n   * Creates server checker instance.\n   *\n   * @param machineName name of machine to whom the server belongs\n   * @param serverRef reference of the server\n   * @param period period between unsuccessful availability checks, measured in {@code timeUnit}\n   *     treated as available\n   * @param timeout max time allowed for the server availability checks to last before server is\n   *     treated unavailable, measured in {@code timeUnit}\n   * @param timeUnit measurement unit for {@code period} and {@code timeout} parameters\n   */\n  protected ServerChecker(\n      String machineName, String serverRef, long timeout, TimeUnit timeUnit, Timer timer) {\n    this.machineName = machineName;\n    this.serverRef = serverRef;\n    this.timer = timer;\n    this.period = TimeUnit.MILLISECONDS.convert(1, timeUnit);\n    this.reportFuture = new CompletableFuture<>();\n    this.deadLine = System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(timeout, timeUnit);\n  }\n\n  /**\n   * Starts server availability checking, which will be stopped when server become available or\n   * checking times out.\n   */\n  public void start() {\n    timer.schedule(new ServerCheckingTask(0), 0);\n  }\n\n  /**\n   * Checks server availability, throws {@link InfrastructureException} if the server is not\n   * available.\n   */\n  public void checkOnce(Consumer<String> readinessHandler) throws InfrastructureException {\n    if (!isAvailable()) {\n      throw new InfrastructureException(\n          String.format(\"Server '%s' in container '%s' not available.\", serverRef, machineName));\n    }\n    readinessHandler.accept(serverRef);\n  }\n\n  /**\n   * Shows whether the server is treated as available.\n   *\n   * @return true if server is available, false otherwise\n   */\n  public abstract boolean isAvailable();\n\n  /**\n   * Returns {@code CompletableFuture} that will be completed when server become available or\n   * unavailable. When server become available completable future returns server reference.\n   * </br>This completable future can be used to chain {@code CompletableFuture} stage to successful\n   * or unsuccessful completion of the server availability check.\n   *\n   * @see CompletableFuture\n   * @see CompletableFuture#thenAccept(Consumer)\n   * @see CompletableFuture#exceptionally(Function)\n   */\n  public CompletableFuture<String> getReportCompFuture() {\n    return reportFuture;\n  }\n\n  private boolean isTimedOut() {\n    return System.currentTimeMillis() > deadLine;\n  }\n\n  private class ServerCheckingTask extends TimerTask {\n    private int currentNumberOfSequentialSuccessfulPings;\n\n    public ServerCheckingTask(int currentNumberOfSequentialSuccessfulPings) {\n      this.currentNumberOfSequentialSuccessfulPings = currentNumberOfSequentialSuccessfulPings;\n    }\n\n    @Override\n    public void run() {\n      if (isTimedOut()) {\n        reportFuture.completeExceptionally(\n            new InfrastructureException(\n                String.format(\n                    \"Server '%s' in container '%s' not available.\", serverRef, machineName)));\n      } else if (isAvailable()) {\n        currentNumberOfSequentialSuccessfulPings++;\n        if (currentNumberOfSequentialSuccessfulPings == 1) {\n          reportFuture.complete(serverRef);\n        } else {\n          timer.schedule(new ServerCheckingTask(currentNumberOfSequentialSuccessfulPings), period);\n        }\n      } else {\n        timer.schedule(new ServerCheckingTask(0), period);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/ServersChecker.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport com.google.inject.assistedinject.Assisted;\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.Timer;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\nimport java.util.function.Consumer;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.api.workspace.server.token.MachineTokenProvider;\n\n/**\n * Checks readiness of servers of a machine.\n *\n * @author Alexander Garagatyi\n */\npublic class ServersChecker {\n  private final RuntimeIdentity runtimeIdentity;\n  private final String machineName;\n  private final Map<String, ? extends Server> servers;\n  private final MachineTokenProvider machineTokenProvider;\n  private final Set<String> livenessProbes;\n\n  private Timer timer;\n  private long resultTimeoutSeconds;\n  private CompletableFuture<?> result;\n\n  /**\n   * Creates instance of this class.\n   *\n   * @param machineName name of machine whose servers will be checked by this method\n   * @param servers map of servers in a machine\n   */\n  @Inject\n  public ServersChecker(\n      @Assisted RuntimeIdentity runtimeIdentity,\n      @Assisted String machineName,\n      @Assisted Map<String, ? extends Server> servers,\n      MachineTokenProvider machineTokenProvider,\n      @Named(\"che.workspace.server.liveness_probes\") String[] livenessProbes) {\n    this.runtimeIdentity = runtimeIdentity;\n    this.machineName = machineName;\n    this.servers = servers;\n    this.timer = new Timer(\"ServersChecker\", true);\n    this.machineTokenProvider = machineTokenProvider;\n    this.livenessProbes =\n        Arrays.stream(livenessProbes).map(String::trim).collect(Collectors.toSet());\n  }\n\n  /**\n   * Asynchronously starts checking readiness of servers of a machine. Method {@link #await()} waits\n   * the result of this asynchronous check.\n   *\n   * @param serverReadinessHandler consumer which will be called with server reference as the\n   *     argument when server become available\n   * @throws InternalInfrastructureException if check of a server failed due to an unexpected error\n   * @throws InfrastructureException if check of a server failed due to an error\n   */\n  public CompletableFuture<?> startAsync(Consumer<String> serverReadinessHandler)\n      throws InfrastructureException {\n    timer = new Timer(\"ServersChecker\", true);\n    List<ServerChecker> serverCheckers = getServerCheckers();\n    // should be completed with an exception if a server considered unavailable\n    CompletableFuture<Void> firstNonAvailable = new CompletableFuture<>();\n    CompletableFuture[] checkTasks =\n        serverCheckers.stream()\n            .map(ServerChecker::getReportCompFuture)\n            .map(\n                compFut ->\n                    compFut\n                        .thenAccept(serverReadinessHandler)\n                        .exceptionally(\n                            e -> {\n                              // cleanup checkers tasks\n                              timer.cancel();\n                              firstNonAvailable.completeExceptionally(e);\n                              return null;\n                            }))\n            .toArray(CompletableFuture[]::new);\n    resultTimeoutSeconds = checkTasks.length * 180;\n    // should complete when all servers checks reported availability\n    CompletableFuture<Void> allAvailable = CompletableFuture.allOf(checkTasks);\n    // should complete when all servers are available or any server is unavailable\n    result = CompletableFuture.anyOf(allAvailable, firstNonAvailable);\n    for (ServerChecker serverChecker : serverCheckers) {\n      serverChecker.start();\n    }\n    return result;\n  }\n\n  /**\n   * Synchronously checks whether servers are available, throws {@link InfrastructureException} if\n   * any is not.\n   */\n  public void checkOnce(Consumer<String> readyHandler) throws InfrastructureException {\n    for (ServerChecker checker : getServerCheckers()) {\n      checker.checkOnce(readyHandler);\n    }\n  }\n\n  /**\n   * Waits until servers are considered available or one of them is considered as unavailable.\n   *\n   * @throws InternalInfrastructureException if check of a server failed due to an unexpected error\n   * @throws InfrastructureException if check of a server failed due to interruption\n   * @throws InfrastructureException if check of a server failed because it reached timeout\n   * @throws InfrastructureException if check of a server failed due to an error\n   */\n  public void await() throws InfrastructureException, InterruptedException {\n    try {\n      // TODO how much time should we check?\n      result.get(resultTimeoutSeconds, TimeUnit.SECONDS);\n    } catch (TimeoutException e) {\n      throw new InfrastructureException(\n          \"Servers readiness check of machine \" + machineName + \" timed out\");\n    } catch (ExecutionException e) {\n      try {\n        throw e.getCause();\n      } catch (InfrastructureException rethrow) {\n        throw rethrow;\n      } catch (Throwable thr) {\n        throw new InternalInfrastructureException(\n            \"Machine \"\n                + machineName\n                + \" servers readiness check failed. Error: \"\n                + thr.getMessage(),\n            thr);\n      }\n    }\n  }\n\n  private List<ServerChecker> getServerCheckers() throws InfrastructureException {\n    ArrayList<ServerChecker> checkers = new ArrayList<>(servers.size());\n    for (Map.Entry<String, ? extends Server> serverEntry : servers.entrySet()) {\n      // TODO replace with correct behaviour\n      // workaround needed because we don't have server readiness check in the model\n      if (livenessProbes.contains(serverEntry.getKey())) {\n        checkers.add(getChecker(serverEntry.getKey(), serverEntry.getValue()));\n      }\n    }\n    return checkers;\n  }\n\n  private ServerChecker getChecker(String serverRef, Server server) throws InfrastructureException {\n    // TODO replace with correct behaviour\n    // workaround needed because we don't have server readiness check in the model\n    // Create server readiness endpoint URL\n    URL url;\n    String token;\n    try {\n      String serverUrl = server.getUrl();\n\n      if (\"terminal\".equals(serverRef)) {\n        serverUrl = serverUrl.replaceFirst(\"^ws\", \"http\").replaceFirst(\"/pty$\", \"/\");\n      }\n\n      if (\"wsagent/http\".equals(serverRef) && !serverUrl.endsWith(\"/\")) {\n        // add trailing slash if it is not present\n        serverUrl = serverUrl + '/';\n      }\n\n      token =\n          machineTokenProvider.getToken(\n              runtimeIdentity.getOwnerId(), runtimeIdentity.getWorkspaceId());\n      url = UriBuilder.fromUri(serverUrl).build().toURL();\n    } catch (MalformedURLException e) {\n      throw new InternalInfrastructureException(\n          \"Server \" + serverRef + \" URL is invalid. Error: \" + e.getMessage(), e);\n    }\n\n    return doCreateChecker(url, serverRef, token);\n  }\n\n  @VisibleForTesting\n  ServerChecker doCreateChecker(URL url, String serverRef, String token) {\n    // TODO add readiness endpoint to terminal and remove this\n    // workaround needed because terminal server doesn't have endpoint to check it readiness\n    if (\"terminal\".equals(serverRef)) {\n      return new TerminalHttpConnectionServerChecker(\n          url,\n          machineName,\n          serverRef,\n          TimeUnit.SECONDS.toMillis(180),\n          TimeUnit.MILLISECONDS,\n          timer,\n          token);\n    }\n    // TODO do not hardcode timeouts, use server conf instead\n    return new HttpConnectionServerChecker(\n        url,\n        machineName,\n        serverRef,\n        TimeUnit.SECONDS.toMillis(180),\n        TimeUnit.MILLISECONDS,\n        timer,\n        token);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/ServersCheckerFactory.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\n\n/**\n * Creates {@link ServersChecker} for server readiness checking.\n *\n * @author Alexander Garagatyi\n * @author Sergii Leshchenko\n */\npublic interface ServersCheckerFactory {\n  ServersChecker create(\n      RuntimeIdentity runtimeIdentity, String machineName, Map<String, ? extends Server> servers);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/TerminalHttpConnectionServerChecker.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc;\n\nimport java.net.URL;\nimport java.util.Timer;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * This class is used as {@link ServerChecker} for terminal server as it doesn't have an endpoint\n * that responds with 200 and can be used with default {@link HttpConnectionServerChecker}\n *\n * @author Alexander Garagatyi\n */\n// TODO add readiness endpoint to terminal and remove this class\nclass TerminalHttpConnectionServerChecker extends HttpConnectionServerChecker {\n  TerminalHttpConnectionServerChecker(\n      URL url,\n      String machineName,\n      String serverRef,\n      long timeout,\n      TimeUnit timeUnit,\n      Timer timer,\n      String token) {\n    super(url, machineName, serverRef, timeout, timeUnit, timer, token);\n  }\n\n  @Override\n  boolean isConnectionSuccessful(int responseCode) {\n    return responseCode == 404;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/HttpProbe.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe;\n\nimport java.io.IOException;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * Probes a HTTP(s) URL for a response with code >=200 and <400\n *\n * @author Alexander Garagatyi\n */\npublic class HttpProbe extends Probe {\n\n  private static final String CONNECTION_HEADER = \"Connection\";\n  private static final String CONNECTION_CLOSE = \"close\";\n\n  private final URL url;\n  private final int timeout;\n  private final Map<String, String> headers;\n\n  private HttpURLConnection httpURLConnection;\n\n  /**\n   * Creates probe\n   *\n   * @param url HTTP endpoint to probe\n   * @param timeout connection and read timeouts\n   */\n  public HttpProbe(URL url, int timeout, Map<String, String> headers) {\n    this.url = url;\n    this.timeout = timeout;\n    this.headers = new HashMap<>();\n    if (headers != null) {\n      this.headers.putAll(headers);\n    }\n    this.headers.put(CONNECTION_HEADER, CONNECTION_CLOSE);\n  }\n\n  @Override\n  public boolean doProbe() {\n    try {\n      httpURLConnection = (HttpURLConnection) url.openConnection();\n      httpURLConnection.setConnectTimeout(timeout);\n      httpURLConnection.setReadTimeout(timeout);\n      headers.forEach((name, value) -> httpURLConnection.setRequestProperty(name, value));\n      return isConnectionSuccessful(httpURLConnection);\n    } catch (IOException e) {\n      return false;\n    } finally {\n      if (httpURLConnection != null) {\n        httpURLConnection.disconnect();\n        this.httpURLConnection = null;\n      }\n    }\n  }\n\n  /**\n   * More effectively cancels the probe than cancellation inherited from {@link Probe}.\n   *\n   * @see Probe#cancel()\n   */\n  @Override\n  public void cancel() {\n    httpURLConnection.disconnect();\n    this.httpURLConnection = null;\n  }\n\n  private boolean isConnectionSuccessful(HttpURLConnection conn) {\n    try {\n      int responseCode = conn.getResponseCode();\n      return responseCode >= 200 && responseCode < 400;\n    } catch (IOException e) {\n      return false;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/HttpProbeConfig.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe;\n\nimport static java.util.Collections.emptyMap;\n\nimport java.util.Map;\n\n/**\n * Configuration of a HTTP URL probe.\n *\n * @author Alexander Garagatyi\n */\npublic class HttpProbeConfig extends TcpProbeConfig {\n\n  private final String scheme;\n  private final String path;\n  private final Map<String, String> headers;\n\n  /**\n   * Creates probe configuration.\n   *\n   * @param scheme protocol of the HTTP server (http or https)\n   * @param path path for the HTTP probe\n   * @param headers optional headers to add into the HTTP probe request\n   * @see TcpProbeConfig#TcpProbeConfig(int, int, int, int, int, int, String)\n   */\n  public HttpProbeConfig(\n      int port,\n      String host,\n      String scheme,\n      String path,\n      Map<String, String> headers,\n      int successThreshold,\n      int failureThreshold,\n      int timeoutSeconds,\n      int periodSeconds,\n      int initialDelaySeconds) {\n    super(\n        successThreshold,\n        failureThreshold,\n        timeoutSeconds,\n        periodSeconds,\n        initialDelaySeconds,\n        port,\n        host);\n    if (!\"http\".equals(scheme) && !\"https\".equals(scheme)) {\n      throw new IllegalArgumentException(\"HTTP probe scheme must be 'http' or 'https'\");\n    }\n    this.scheme = scheme;\n    this.path = path;\n    this.headers = headers != null ? headers : emptyMap();\n  }\n\n  public String getScheme() {\n    return scheme;\n  }\n\n  public String getPath() {\n    return path;\n  }\n\n  public Map<String, String> getHeaders() {\n    return headers;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/HttpProbeFactory.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe;\n\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.util.Map;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Produces {@link HttpProbe} instances\n *\n * @see ProbeFactory\n * @author Alexander Garagatyi\n */\npublic class HttpProbeFactory extends ProbeFactory {\n  private final URL url;\n  private final int timeout;\n  private final Map<String, String> headers;\n  private final HttpProbeConfig probeConfig;\n\n  public HttpProbeFactory(\n      String workspaceId, String machineName, String serverName, HttpProbeConfig probeConfig)\n      throws MalformedURLException {\n    super(workspaceId, machineName, serverName, probeConfig);\n    url =\n        new URL(\n            probeConfig.getScheme(),\n            probeConfig.getHost(),\n            probeConfig.getPort(),\n            probeConfig.getPath());\n    timeout = (int) TimeUnit.SECONDS.toMillis(probeConfig.getTimeoutSeconds());\n    headers = probeConfig.getHeaders();\n    this.probeConfig = probeConfig;\n  }\n\n  @Override\n  public HttpProbeConfig getProbeConfig() {\n    return probeConfig;\n  }\n\n  @Override\n  public HttpProbe get() {\n    return new HttpProbe(url, timeout, headers);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/Probe.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe;\n\n/**\n * One-time probe for a server. Should not be used directly but rather by a probe scheduling\n * framework.\n *\n * @author Alexander Garagatyi\n */\npublic abstract class Probe {\n\n  private Thread probeThread;\n\n  /**\n   * Checks {@link Probe}. Note that it must not be called more than one time.\n   *\n   * @return true if probe finishes successfully, false otherwise\n   * @throws IllegalStateException if called second time\n   */\n  final boolean probe() {\n    if (probeThread != null) {\n      throw new IllegalStateException(\n          \"This probe can be used only once, but second usage is detected!\");\n    }\n    probeThread = Thread.currentThread();\n    try {\n      return doProbe();\n    } finally {\n      // clear interrupted state\n      Thread.interrupted();\n    }\n  }\n\n  /**\n   * Returns {@code true} if probe finishes successfully, {@code false} otherwise. Must return false\n   * when probe is interrupted even if interruption is not respected by probe implementation.\n   */\n  protected abstract boolean doProbe();\n\n  /**\n   * Interrupts execution of the probe. May be useful when probing takes too much time. Doesn't\n   * guarantee that interruption is respected by the probe or will lead to the immediate stop of\n   * usage of a thread where {@link #probe()} is called.\n   */\n  public void cancel() {\n    probeThread.interrupt();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/ProbeConfig.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe;\n\n/**\n * Configuration of a workspace server probe.\n *\n * @author Alexander Garagatyi\n */\npublic abstract class ProbeConfig {\n  private int successThreshold;\n  private int failureThreshold;\n  private int timeoutSeconds;\n  private int periodSeconds;\n  private int initialDelaySeconds;\n\n  /**\n   * Creates probe configuration.\n   *\n   * @param successThreshold minimum consecutive successes for the probe to be considered successful\n   *     after having failed. Minimum value is 1.\n   * @param failureThreshold consecutive failures of a probe needed to consider probe failed.\n   *     Minimum value is 1.\n   * @param timeoutSeconds number of seconds after which the probe times out. Minimum value is 1.\n   * @param periodSeconds how often to perform the probe. Minimum value is 1.\n   * @param initialDelaySeconds number of seconds after the probe is submitted for checks before\n   *     probes are initiated.\n   */\n  public ProbeConfig(\n      int successThreshold,\n      int failureThreshold,\n      int timeoutSeconds,\n      int periodSeconds,\n      int initialDelaySeconds) {\n    if (successThreshold < 1) {\n      throw new IllegalArgumentException(\n          \"Success threshold value '\"\n              + successThreshold\n              + \"' is illegal. Should be not less than 1\");\n    }\n    this.successThreshold = successThreshold;\n    if (failureThreshold < 1) {\n      throw new IllegalArgumentException(\n          \"Failure threshold value '\"\n              + failureThreshold\n              + \"' is illegal. Should be not less than 1\");\n    }\n    this.failureThreshold = failureThreshold;\n    if (timeoutSeconds < 1) {\n      throw new IllegalArgumentException(\n          \"Timeout value '\" + timeoutSeconds + \"' is illegal. Should be not less than 1\");\n    }\n    this.timeoutSeconds = timeoutSeconds;\n    if (periodSeconds < 1) {\n      throw new IllegalArgumentException(\n          \"Period value '\" + periodSeconds + \"' is illegal. Should be not less than 1\");\n    }\n    this.periodSeconds = periodSeconds;\n    this.initialDelaySeconds = initialDelaySeconds;\n  }\n\n  public int getInitialDelaySeconds() {\n    return initialDelaySeconds;\n  }\n\n  public int getFailureThreshold() {\n    return failureThreshold;\n  }\n\n  public int getSuccessThreshold() {\n    return successThreshold;\n  }\n\n  public int getPeriodSeconds() {\n    return periodSeconds;\n  }\n\n  public int getTimeoutSeconds() {\n    return timeoutSeconds;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/ProbeFactory.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe;\n\n/**\n * Produces {@link Probe} instances and holds information about probe configuration and Che\n * workspace server the probe corresponds to.\n *\n * @author Alexander Garagatyi\n */\npublic abstract class ProbeFactory {\n  private final String workspaceId;\n  private final String machineName;\n  private final String serverName;\n  private final ProbeConfig probeConfig;\n\n  protected ProbeFactory(\n      String workspaceId, String machineName, String serverName, ProbeConfig probeConfig) {\n    this.workspaceId = workspaceId;\n    this.machineName = machineName;\n    this.serverName = serverName;\n    this.probeConfig = probeConfig;\n  }\n\n  /** Returns an instance of a probe for a server in a workspace */\n  public abstract Probe get();\n\n  /** Returns ID of a workspace the probe corresponds to */\n  public String getWorkspaceId() {\n    return workspaceId;\n  }\n\n  /** Returns name of a machine the probe corresponds to */\n  public String getMachineName() {\n    return machineName;\n  }\n\n  /** Returns name of a workspace server the probe corresponds to */\n  public String getServerName() {\n    return serverName;\n  }\n\n  /** Returns configuration of a probe */\n  public ProbeConfig getProbeConfig() {\n    return probeConfig;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/ProbeResult.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe;\n\n/**\n * Result of a probe. Should be fired in accordance with {@link ProbeConfig}, e.g. thresholds,\n * timeouts. In particular if a threshold if >1 then this result should be fired after reaching of\n * the threshold instead of on each probe check.\n *\n * @author Alexander Garagatyi\n */\npublic class ProbeResult {\n  public enum ProbeStatus {\n    PASSED,\n    FAILED\n  }\n\n  private final String workspaceId;\n  private final String machineName;\n  private final String serverName;\n  private final ProbeStatus status;\n\n  public ProbeResult(\n      String workspaceId, String machineName, String serverName, ProbeStatus status) {\n    this.workspaceId = workspaceId;\n    this.machineName = machineName;\n    this.serverName = serverName;\n    this.status = status;\n  }\n\n  /** Returns ID of a workspace the probe corresponds to */\n  public String getWorkspaceId() {\n    return workspaceId;\n  }\n\n  /** Returns name of a machine the probe corresponds to */\n  public String getMachineName() {\n    return machineName;\n  }\n\n  /** Returns name of a workspace server the probe corresponds to */\n  public String getServerName() {\n    return serverName;\n  }\n\n  /** Status of a probe */\n  public ProbeStatus getStatus() {\n    return status;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/ProbeScheduler.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe;\n\nimport com.google.common.util.concurrent.ThreadFactoryBuilder;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Timer;\nimport java.util.TimerTask;\nimport java.util.concurrent.*;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.function.Consumer;\nimport java.util.function.Supplier;\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.workspace.server.hc.probe.ProbeResult.ProbeStatus;\nimport org.eclipse.che.commons.observability.ExecutorServiceWrapper;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Schedules workspace servers probes checks asynchronously.\n *\n * @author Alexander Garagatyi\n * @author Sergii Leshchenko\n */\n@Singleton\npublic class ProbeScheduler {\n  private static final Logger LOG = LoggerFactory.getLogger(ProbeScheduler.class);\n\n  private final ScheduledExecutorService probesExecutor;\n\n  /**\n   * Use single thread for a scheduling of tasks interruption by timeout. Single thread can be used\n   * since it is supposed that interruption is a very quick call. Separate thread is needed to\n   * prevent a situation when executor is full of jobs and current ones are hanging but we need to\n   * time them out.\n   */\n  private final Timer timeouts;\n\n  /** Mapping of workspaceId to a list of futures with probes of a workspace. */\n  private final Map<String, List<ScheduledFuture>> probesFutures;\n\n  @Inject\n  public ProbeScheduler(ExecutorServiceWrapper executorServiceWrapper) {\n    probesExecutor =\n        executorServiceWrapper.wrap(\n            new ScheduledThreadPoolExecutor(\n                10,\n                new ThreadFactoryBuilder()\n                    .setDaemon(true)\n                    .setNameFormat(\"ServerProbes-%s\")\n                    .build()),\n            ProbeScheduler.class.getName());\n    timeouts = new Timer(\"ServerProbesTimeouts\", true);\n    probesFutures = new ConcurrentHashMap<>();\n  }\n\n  /**\n   * Schedules provided {@link WorkspaceProbes} and uses provided {@code Consumer<ProbeResult>} to\n   * send probes results. Respects {@link ProbeConfig} parameters such as thresholds, timeouts. Note\n   * that probe execution is not deleted automatically when probe results are passed to probe\n   * results consumer. To stop a probe execution method {@link #cancel(String)} should be used.\n   *\n   * @param probes probes to check\n   * @param probeResultConsumer consumer of {@link ProbeResult} instances produced on retrieving\n   *     probe execution results\n   * @throws RejectedExecutionException when {@link ProbeScheduler} is terminated\n   */\n  public void schedule(WorkspaceProbes probes, Consumer<ProbeResult> probeResultConsumer) {\n    probesFutures.putIfAbsent(probes.getWorkspaceId(), new ArrayList<>());\n    probes\n        .getProbes()\n        .forEach(\n            probeFactory -> schedule(probes.getWorkspaceId(), probeFactory, probeResultConsumer));\n  }\n\n  /**\n   * Schedules provided {@link WorkspaceProbes} when a workspace becomes {@link\n   * WorkspaceStatus#RUNNING}.\n   *\n   * <p>Note that probes scheduling will be canceled when {@link #cancel(String)} is called or when\n   * a workspace becomes {@link WorkspaceStatus#STOPPING} or {@link WorkspaceStatus#STOPPED}.\n   *\n   * @param probes probes to schedule\n   * @param probeResultConsumer consumer of {@link ProbeResult} instances produced on retrieving\n   *     probe execution results\n   * @param statusSupplier supplier to retrieve workspace status. Scheduling will be delayed if\n   *     {@link RuntimeException} is thrown\n   * @see #schedule(WorkspaceProbes, Consumer)\n   */\n  public void schedule(\n      WorkspaceProbes probes,\n      Consumer<ProbeResult> probeResultConsumer,\n      Supplier<WorkspaceStatus> statusSupplier) {\n    DelayedSchedulingTask task =\n        new DelayedSchedulingTask(statusSupplier, probes, probeResultConsumer);\n\n    // scheduleWithFixedDelay is used in favor of scheduleAtFixedRate because in case of big amount\n    // of scheduled probes start time of tasks may shift and this may lead to a situation when\n    // another probeConfig is needed immediately after the previous one is finished which doesn't\n    // seem a good thing\n    ScheduledFuture scheduledFuture =\n        probesExecutor.scheduleWithFixedDelay(task, 10L, 10L, TimeUnit.SECONDS);\n\n    probesFutures.compute(\n        probes.getWorkspaceId(),\n        (key, scheduledFutures) -> {\n          List<ScheduledFuture> target = scheduledFutures;\n          if (target == null) {\n            target = new ArrayList<>();\n          }\n          target.add(scheduledFuture);\n          return target;\n        });\n  }\n\n  /**\n   * Dismisses following and if possible current executions of probes of a workspace with a\n   * specified ID.\n   */\n  public void cancel(String workspaceId) {\n    List<ScheduledFuture> tasks = probesFutures.remove(workspaceId);\n    if (tasks != null) {\n      tasks.forEach(task -> task.cancel(true));\n    }\n  }\n\n  /** Denies starting of new probes and terminates active one if scheduler not terminated yet. */\n  public void shutdown() {\n    if (!probesExecutor.isShutdown()) {\n      probesExecutor.shutdown();\n      try {\n        LOG.info(\"Shutdown probe scheduler, wait 30s to stop normally\");\n        if (!probesExecutor.awaitTermination(30, TimeUnit.SECONDS)) {\n          probesExecutor.shutdownNow();\n          LOG.info(\"Interrupt probe scheduler, wait 60s to stop\");\n          if (!probesExecutor.awaitTermination(60, TimeUnit.SECONDS)) {\n            LOG.error(\"Couldn't shutdown probe scheduler threads pool\");\n          } else {\n            LOG.info(\"Probe scheduler threads pool is interrupted\");\n          }\n        } else {\n          LOG.info(\"Probe scheduler threads pool is shut down\");\n        }\n      } catch (InterruptedException x) {\n        probesExecutor.shutdownNow();\n        Thread.currentThread().interrupt();\n      }\n    }\n  }\n\n  private void schedule(\n      String workspaceId, ProbeFactory probeFactory, Consumer<ProbeResult> probeResultConsumer) {\n    ProbeConfig probeConfig = probeFactory.getProbeConfig();\n    Task task = new Task(probeFactory, probeResultConsumer);\n    // scheduleWithFixedDelay is used in favor of scheduleAtFixedRate because in case of big amount\n    // of scheduled probes start time of tasks may shift and this may lead to a situation when\n    // another probeConfig is needed immediately after the previous one is finished which doesn't\n    // seem a good thing\n    ScheduledFuture scheduledFuture =\n        probesExecutor.scheduleWithFixedDelay(\n            task,\n            probeConfig.getInitialDelaySeconds(),\n            probeConfig.getPeriodSeconds(),\n            TimeUnit.SECONDS);\n\n    List<ScheduledFuture> workspaceProbes =\n        probesFutures.computeIfPresent(\n            workspaceId,\n            (key, scheduledFutures) -> {\n              scheduledFutures.add(scheduledFuture);\n              return scheduledFutures;\n            });\n    // check whether workspace probes were cancelled concurrently which led to removal of the value\n    // in the map\n    if (workspaceProbes == null) {\n      scheduledFuture.cancel(true);\n      task.cancel();\n    }\n  }\n\n  private class Task implements Runnable {\n    private final ProbeFactory probeFactory;\n    private final Consumer<ProbeResult> probeResultConsumer;\n    private final ProbeConfig probeConfig;\n\n    private int failures = 0;\n    private int successes = 0;\n    private AtomicBoolean cancelled = new AtomicBoolean(false);\n\n    public Task(ProbeFactory probeFactory, Consumer<ProbeResult> probeResultConsumer) {\n      this.probeFactory = probeFactory;\n      this.probeConfig = probeFactory.getProbeConfig();\n      this.probeResultConsumer = probeResultConsumer;\n    }\n\n    @Override\n    public void run() {\n      if (cancelled.get()) {\n        return;\n      }\n      Probe probe = probeFactory.get();\n      TimeoutProbeTask timeoutProbeTask = new TimeoutProbeTask(probe);\n      timeouts.schedule(\n          timeoutProbeTask, TimeUnit.SECONDS.toMillis(probeConfig.getTimeoutSeconds()));\n      boolean success = probe.probe();\n      timeoutProbeTask.cancel();\n      if (success) {\n        // current success increases successes count and clears failures count\n        successes++;\n        failures = 0;\n\n        if (successes >= probeConfig.getSuccessThreshold()) {\n          // TODO make them completable futures? Then we should ensure that\n          // consecutive calls won't use executors thread time but rather use common thread\n          // pool to perform processing of passed probe result\n          if (cancelled.get()) {\n            return;\n          }\n          // Health check satisfies probeConfig health conditions\n          probeResultConsumer.accept(\n              new ProbeResult(\n                  probeFactory.getWorkspaceId(),\n                  probeFactory.getMachineName(),\n                  probeFactory.getServerName(),\n                  ProbeStatus.PASSED));\n        }\n      } else {\n        // current failure increases failures count and clears successes count\n        failures++;\n        successes = 0;\n\n        if (failures >= probeConfig.getFailureThreshold()) {\n          if (cancelled.get()) {\n            return;\n          }\n          // Health check satisfies probeConfig failure conditions\n          probeResultConsumer.accept(\n              new ProbeResult(\n                  probeFactory.getWorkspaceId(),\n                  probeFactory.getMachineName(),\n                  probeFactory.getServerName(),\n                  ProbeStatus.FAILED));\n        }\n      }\n    }\n\n    public void cancel() {\n      cancelled.set(true);\n    }\n  }\n\n  private class DelayedSchedulingTask implements Runnable {\n    private final String workspaceId;\n    private final Supplier<WorkspaceStatus> statusSupplier;\n    private final WorkspaceProbes probes;\n    private final Consumer<ProbeResult> probeResultConsumer;\n\n    DelayedSchedulingTask(\n        Supplier<WorkspaceStatus> statusSupplier,\n        WorkspaceProbes probes,\n        Consumer<ProbeResult> probeResultConsumer) {\n      this.workspaceId = probes.getWorkspaceId();\n      this.statusSupplier = statusSupplier;\n      this.probes = probes;\n      this.probeResultConsumer = probeResultConsumer;\n    }\n\n    @Override\n    public void run() {\n      WorkspaceStatus status;\n\n      try {\n        status = statusSupplier.get();\n      } catch (RuntimeException e) {\n        // delay\n        return;\n      }\n\n      switch (status) {\n        case STARTING:\n          // delay\n          return;\n        case RUNNING:\n          ProbeScheduler.this.cancel(workspaceId);\n          schedule(probes, probeResultConsumer);\n          return;\n        case STOPPED:\n        case STOPPING:\n        default:\n          ProbeScheduler.this.cancel(workspaceId);\n      }\n    }\n  }\n\n  private class TimeoutProbeTask extends TimerTask {\n    private final Probe probe;\n\n    public TimeoutProbeTask(Probe probe) {\n      this.probe = probe;\n    }\n\n    @Override\n    public void run() {\n      probe.cancel();\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/TcpProbeConfig.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\n\n/**\n * @author Alexander Garagatyi\n */\npublic class TcpProbeConfig extends ProbeConfig {\n\n  private final int port;\n  private final String host;\n\n  /**\n   * Creates probe configuration.\n   *\n   * @param port port of the TCP server to probe\n   * @param host hostname of the TCP server to probe\n   * @see ProbeConfig#ProbeConfig(int, int, int, int, int)\n   */\n  public TcpProbeConfig(\n      int successThreshold,\n      int failureThreshold,\n      int timeoutSeconds,\n      int periodSeconds,\n      int initialDelaySeconds,\n      int port,\n      String host) {\n    super(successThreshold, failureThreshold, timeoutSeconds, periodSeconds, initialDelaySeconds);\n    if (port < 1) {\n      throw new IllegalArgumentException(\n          \"Port '\" + port + \"' is illegal. Port should not be less than 1\");\n    }\n    this.port = port;\n    if (isNullOrEmpty(host)) {\n      throw new IllegalArgumentException(\n          \"Host '\" + host + \"' is illegal. Host should not be empty\");\n    }\n    this.host = host;\n  }\n\n  public String getHost() {\n    return host;\n  }\n\n  public int getPort() {\n    return port;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/WorkspaceProbes.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe;\n\nimport java.util.List;\n\n/**\n * Holds {@link ProbeFactory} instances for probes of a workspace runtime\n *\n * @author Alexander Garagatyi\n */\npublic class WorkspaceProbes {\n\n  private String workspaceId;\n  private List<ProbeFactory> probesFactories;\n\n  public WorkspaceProbes(String workspaceId, List<ProbeFactory> probesFactories) {\n    this.workspaceId = workspaceId;\n    this.probesFactories = probesFactories;\n  }\n\n  public List<ProbeFactory> getProbes() {\n    return probesFactories;\n  }\n\n  public String getWorkspaceId() {\n    return workspaceId;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/WorkspaceProbesFactory.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.net.MalformedURLException;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.Runtime;\nimport org.eclipse.che.api.core.model.workspace.runtime.Machine;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\nimport org.eclipse.che.api.workspace.server.hc.probe.server.ExecServerLivenessProbeConfigFactory;\nimport org.eclipse.che.api.workspace.server.hc.probe.server.HttpProbeConfigFactory;\nimport org.eclipse.che.api.workspace.server.hc.probe.server.TerminalServerLivenessProbeConfigFactory;\nimport org.eclipse.che.api.workspace.server.hc.probe.server.WsAgentServerLivenessProbeConfigFactory;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.api.workspace.server.token.MachineTokenProvider;\nimport org.eclipse.che.api.workspace.shared.Constants;\n\n/**\n * Produces instances of {@link WorkspaceProbes} according to provided servers of a workspace\n * runtime.\n *\n * @author Alexander Garagatyi\n */\npublic class WorkspaceProbesFactory {\n  // Is used to define servers which will be checked by this server checker class.\n  // It is also a workaround to set correct paths for servers readiness checks.\n  private final Map<String, HttpProbeConfigFactory> probeConfigFactories;\n\n  @Inject\n  public WorkspaceProbesFactory(MachineTokenProvider machineTokenProvider) {\n    probeConfigFactories =\n        ImmutableMap.of(\n            Constants.SERVER_WS_AGENT_HTTP_REFERENCE,\n            new WsAgentServerLivenessProbeConfigFactory(machineTokenProvider, 1),\n            Constants.SERVER_EXEC_AGENT_HTTP_REFERENCE,\n            new ExecServerLivenessProbeConfigFactory(1),\n            Constants.SERVER_TERMINAL_REFERENCE,\n            new TerminalServerLivenessProbeConfigFactory(1));\n  }\n\n  /**\n   * Get {@link WorkspaceProbes} for a whole workspace runtime\n   *\n   * @throws InfrastructureException when the operation fails\n   */\n  public WorkspaceProbes getProbes(RuntimeIdentity runtimeId, Runtime runtime)\n      throws InfrastructureException {\n    return getProbes(runtimeId, runtime.getMachines());\n  }\n\n  /**\n   * Get {@link WorkspaceProbes} for servers of the specified machines\n   *\n   * @throws InfrastructureException when the operation fails\n   */\n  public WorkspaceProbes getProbes(\n      RuntimeIdentity runtimeId, Map<String, ? extends Machine> machines)\n      throws InfrastructureException {\n    List<ProbeFactory> factories = new ArrayList<>();\n    try {\n      for (Entry<String, ? extends Machine> entry : machines.entrySet()) {\n        fillProbes(runtimeId, entry.getKey(), factories, entry.getValue().getServers());\n      }\n    } catch (MalformedURLException e) {\n      throw new InternalInfrastructureException(\n          \"Server liveness probes creation failed. Error: \" + e.getMessage());\n    }\n\n    return new WorkspaceProbes(runtimeId.getWorkspaceId(), factories);\n  }\n\n  /**\n   * Get {@link WorkspaceProbes} for servers of a machine from a workspace runtime\n   *\n   * @throws InfrastructureException when the operation fails\n   */\n  public WorkspaceProbes getProbes(\n      RuntimeIdentity runtimeId, String machineName, Map<String, ? extends Server> servers)\n      throws InfrastructureException {\n    List<ProbeFactory> factories = new ArrayList<>();\n    try {\n      fillProbes(runtimeId, machineName, factories, servers);\n    } catch (MalformedURLException e) {\n      throw new InternalInfrastructureException(\n          \"Server liveness probes creation failed. Error: \" + e.getMessage());\n    }\n    return new WorkspaceProbes(runtimeId.getWorkspaceId(), factories);\n  }\n\n  private void fillProbes(\n      RuntimeIdentity runtimeId,\n      String machineName,\n      List<ProbeFactory> factories,\n      Map<String, ? extends Server> servers)\n      throws InfrastructureException, MalformedURLException {\n    for (Entry<String, ? extends Server> entry : servers.entrySet()) {\n      ProbeFactory probeFactory =\n          getProbeFactory(\n              runtimeId.getOwnerId(),\n              runtimeId.getWorkspaceId(),\n              machineName,\n              entry.getKey(),\n              entry.getValue());\n      if (probeFactory != null) {\n        factories.add(probeFactory);\n      }\n    }\n  }\n\n  private ProbeFactory getProbeFactory(\n      String userId, String workspaceId, String machineName, String serverRef, Server server)\n      throws InfrastructureException, MalformedURLException {\n    // workaround needed because we don't have server readiness check in the model\n    HttpProbeConfigFactory configFactory = probeConfigFactories.get(serverRef);\n    if (configFactory == null) {\n      return null;\n    }\n    final HttpProbeConfig httpProbeConfig = configFactory.get(userId, workspaceId, server);\n    return new HttpProbeFactory(workspaceId, machineName, serverRef, httpProbeConfig);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/server/ExecServerLivenessProbeConfigFactory.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe.server;\n\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\nimport org.eclipse.che.api.workspace.server.hc.probe.HttpProbeConfig;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\n\n/**\n * Produces {@link HttpProbeConfig} for exec agent liveness probes.\n *\n * @author Alexander Garagatyi\n */\npublic class ExecServerLivenessProbeConfigFactory implements HttpProbeConfigFactory {\n  private final int successThreshold;\n\n  public ExecServerLivenessProbeConfigFactory(int successThreshold) {\n    this.successThreshold = successThreshold;\n  }\n\n  @Override\n  public HttpProbeConfig get(String workspaceId, Server server)\n      throws InternalInfrastructureException {\n    return get(EnvironmentContext.getCurrent().getSubject().getUserId(), workspaceId, server);\n  }\n\n  @Override\n  public HttpProbeConfig get(String userId, String workspaceId, Server server)\n      throws InternalInfrastructureException {\n    try {\n      URL url = new URL(server.getUrl());\n      return new HttpProbeConfig(\n          url.getPort() == -1 ? url.getDefaultPort() : url.getPort(),\n          url.getHost(),\n          url.getProtocol(),\n          url.getPath().replaceFirst(\"/process$\", \"/liveness\"),\n          null,\n          successThreshold,\n          3,\n          120,\n          10,\n          10);\n    } catch (MalformedURLException e) {\n      throw new InternalInfrastructureException(\n          \"Exec agent server liveness probe url is invalid. Error: \" + e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/server/HttpProbeConfigFactory.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe.server;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\nimport org.eclipse.che.api.workspace.server.hc.probe.HttpProbeConfig;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\n\n/**\n * Produces {@link HttpProbeConfig} for a server liveness probes.\n *\n * @author Alexander Garagatyi\n * @apiNote this is a workaround needed because Che agents doesn't have a way to specify liveness\n *     probes configuration. We should remove this when it is possible to configure ws-agent, exec\n *     and terminal agents probes configuration\n */\npublic interface HttpProbeConfigFactory {\n\n  /**\n   * Returns liveness probe config for a specified server\n   *\n   * @throws InternalInfrastructureException when server probe creation failed\n   */\n  HttpProbeConfig get(String workspaceId, Server server) throws InternalInfrastructureException;\n\n  HttpProbeConfig get(String userId, String workspaceId, Server server)\n      throws InternalInfrastructureException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/server/TerminalServerLivenessProbeConfigFactory.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe.server;\n\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\nimport org.eclipse.che.api.workspace.server.hc.probe.HttpProbeConfig;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\n\n/**\n * Produces {@link HttpProbeConfig} for terminal agent liveness probes.\n *\n * @author Alexander Garagatyi\n */\npublic class TerminalServerLivenessProbeConfigFactory implements HttpProbeConfigFactory {\n  private final int successThreshold;\n\n  public TerminalServerLivenessProbeConfigFactory(int successThreshold) {\n    this.successThreshold = successThreshold;\n  }\n\n  @Override\n  public HttpProbeConfig get(String workspaceId, Server server)\n      throws InternalInfrastructureException {\n    return get(EnvironmentContext.getCurrent().getSubject().getUserId(), workspaceId, server);\n  }\n\n  @Override\n  public HttpProbeConfig get(String userId, String workspaceId, Server server)\n      throws InternalInfrastructureException {\n    URI uri;\n    try {\n      uri = new URI(server.getUrl());\n    } catch (URISyntaxException e) {\n      throw new InternalInfrastructureException(\n          \"Terminal agent server liveness probe url is invalid. Error: \" + e.getMessage());\n    }\n    String protocol;\n    if (\"wss\".equals(uri.getScheme())) {\n      protocol = \"https\";\n    } else {\n      protocol = \"http\";\n    }\n    int port;\n    if (uri.getPort() == -1) {\n      if (\"http\".equals(protocol)) {\n        port = 80;\n      } else {\n        port = 443;\n      }\n    } else {\n      port = uri.getPort();\n    }\n\n    String path = uri.getPath().replaceFirst(\"/pty$\", \"/liveness\");\n\n    return new HttpProbeConfig(\n        port, uri.getHost(), protocol, path, null, successThreshold, 3, 120, 10, 10);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/hc/probe/server/WsAgentServerLivenessProbeConfigFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe.server;\n\nimport static java.util.Collections.singletonMap;\n\nimport jakarta.ws.rs.core.HttpHeaders;\nimport jakarta.ws.rs.core.UriBuilder;\nimport jakarta.ws.rs.core.UriBuilderException;\nimport java.net.URI;\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\nimport org.eclipse.che.api.workspace.server.hc.probe.HttpProbeConfig;\nimport org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException;\nimport org.eclipse.che.api.workspace.server.token.MachineTokenException;\nimport org.eclipse.che.api.workspace.server.token.MachineTokenProvider;\nimport org.eclipse.che.commons.env.EnvironmentContext;\n\n/**\n * Produces {@link HttpProbeConfig} for ws-agent liveness probes.\n *\n * @author Alexander Garagatyi\n */\npublic class WsAgentServerLivenessProbeConfigFactory implements HttpProbeConfigFactory {\n  private final MachineTokenProvider machineTokenProvider;\n  private final int successThreshold;\n\n  @Inject\n  public WsAgentServerLivenessProbeConfigFactory(\n      MachineTokenProvider machineTokenProvider, int successThreshold) {\n    this.machineTokenProvider = machineTokenProvider;\n    this.successThreshold = successThreshold;\n  }\n\n  @Override\n  public HttpProbeConfig get(String workspaceId, Server server)\n      throws InternalInfrastructureException {\n    return get(EnvironmentContext.getCurrent().getSubject().getUserId(), workspaceId, server);\n  }\n\n  @Override\n  public HttpProbeConfig get(String userId, String workspaceId, Server server)\n      throws InternalInfrastructureException {\n\n    try {\n      // add check path\n      URI uri = UriBuilder.fromUri(server.getUrl()).path(\"/liveness\").build();\n\n      int port;\n      if (uri.getPort() == -1) {\n        if (\"http\".equals(uri.getScheme())) {\n          port = 80;\n        } else {\n          port = 443;\n        }\n      } else {\n        port = uri.getPort();\n      }\n\n      return new HttpProbeConfig(\n          port,\n          uri.getHost(),\n          uri.getScheme(),\n          uri.getPath(),\n          singletonMap(\n              HttpHeaders.AUTHORIZATION,\n              \"Bearer \" + machineTokenProvider.getToken(userId, workspaceId)),\n          successThreshold,\n          3,\n          120,\n          10,\n          10);\n    } catch (MachineTokenException e) {\n      throw new InternalInfrastructureException(\n          \"Failed to retrieve workspace token for ws-agent server liveness probe. Error: \"\n              + e.getMessage());\n    } catch (UriBuilderException e) {\n      throw new InternalInfrastructureException(\n          \"Wsagent server liveness probe url is invalid. Error: \" + e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/jpa/JpaWorkspaceDao.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.jpa;\n\nimport static com.google.common.base.Preconditions.checkArgument;\nimport static java.lang.String.format;\nimport static java.util.Objects.requireNonNull;\nimport static java.util.stream.Collectors.toList;\n\nimport com.google.inject.persist.Transactional;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport javax.inject.Provider;\nimport javax.inject.Singleton;\nimport javax.persistence.EntityManager;\nimport javax.persistence.NoResultException;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.notification.EventService;\nimport org.eclipse.che.api.workspace.server.model.impl.ProjectConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl;\nimport org.eclipse.che.api.workspace.server.spi.WorkspaceDao;\nimport org.eclipse.che.api.workspace.shared.event.WorkspaceRemovedEvent;\n\n/**\n * JPA based implementation of {@link WorkspaceDao}.\n *\n * @author Yevhenii Voevodin\n */\n@Singleton\npublic class JpaWorkspaceDao implements WorkspaceDao {\n\n  @Inject private EventService eventService;\n  @Inject private Provider<EntityManager> managerProvider;\n\n  @Override\n  public WorkspaceImpl create(WorkspaceImpl workspace) throws ConflictException, ServerException {\n    requireNonNull(workspace, \"Required non-null workspace\");\n    try {\n      doCreate(workspace);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getMessage(), x);\n    }\n    return new WorkspaceImpl(workspace);\n  }\n\n  @Override\n  public WorkspaceImpl update(WorkspaceImpl update)\n      throws NotFoundException, ConflictException, ServerException {\n    requireNonNull(update, \"Required non-null update\");\n    try {\n      return new WorkspaceImpl(doUpdate(update));\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getMessage(), x);\n    }\n  }\n\n  @Override\n  public Optional<WorkspaceImpl> remove(String id) throws ServerException {\n    requireNonNull(id, \"Required non-null id\");\n    Optional<WorkspaceImpl> workspaceOpt;\n    try {\n      workspaceOpt = doRemove(id);\n      workspaceOpt.ifPresent(\n          workspace -> eventService.publish(new WorkspaceRemovedEvent(workspace)));\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n    return workspaceOpt;\n  }\n\n  @Override\n  @Transactional\n  public WorkspaceImpl get(String id) throws NotFoundException, ServerException {\n    requireNonNull(id, \"Required non-null id\");\n    try {\n      final WorkspaceImpl workspace = managerProvider.get().find(WorkspaceImpl.class, id);\n      if (workspace == null) {\n        throw new NotFoundException(format(\"Workspace with id '%s' doesn't exist\", id));\n      }\n      return new WorkspaceImpl(workspace);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  @Transactional\n  public WorkspaceImpl get(String name, String namespace)\n      throws NotFoundException, ServerException {\n    requireNonNull(name, \"Required non-null name\");\n    requireNonNull(namespace, \"Required non-null namespace\");\n    try {\n      return new WorkspaceImpl(\n          managerProvider\n              .get()\n              .createNamedQuery(\"Workspace.getByName\", WorkspaceImpl.class)\n              .setParameter(\"namespace\", namespace)\n              .setParameter(\"name\", name)\n              .getSingleResult());\n    } catch (NoResultException noResEx) {\n      throw new NotFoundException(\n          format(\"Workspace with name '%s' in namespace '%s' doesn't exist\", name, namespace));\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  @Transactional\n  public Page<WorkspaceImpl> getByNamespace(String namespace, int maxItems, long skipCount)\n      throws ServerException {\n    requireNonNull(namespace, \"Required non-null namespace\");\n    try {\n      final EntityManager manager = managerProvider.get();\n      final List<WorkspaceImpl> list =\n          manager\n              .createNamedQuery(\"Workspace.getByNamespace\", WorkspaceImpl.class)\n              .setParameter(\"namespace\", namespace)\n              .setMaxResults(maxItems)\n              .setFirstResult((int) skipCount)\n              .getResultList()\n              .stream()\n              .map(WorkspaceImpl::new)\n              .collect(Collectors.toList());\n      final long count =\n          manager\n              .createNamedQuery(\"Workspace.getByNamespaceCount\", Long.class)\n              .setParameter(\"namespace\", namespace)\n              .getSingleResult();\n      return new Page<>(list, skipCount, maxItems, count);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  @Transactional\n  public Page<WorkspaceImpl> getWorkspaces(String userId, int maxItems, long skipCount)\n      throws ServerException {\n    try {\n      final List<WorkspaceImpl> list =\n          managerProvider\n              .get()\n              .createNamedQuery(\"Workspace.getAll\", WorkspaceImpl.class)\n              .setMaxResults(maxItems)\n              .setFirstResult((int) skipCount)\n              .getResultList()\n              .stream()\n              .map(WorkspaceImpl::new)\n              .collect(Collectors.toList());\n      final long count =\n          managerProvider\n              .get()\n              .createNamedQuery(\"Workspace.getAllCount\", Long.class)\n              .getSingleResult();\n      return new Page<>(list, skipCount, maxItems, count);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Override\n  @Transactional\n  public Page<WorkspaceImpl> getWorkspaces(boolean isTemporary, int maxItems, long skipCount)\n      throws ServerException {\n    checkArgument(maxItems >= 0, \"The number of items to return can't be negative.\");\n    checkArgument(\n        skipCount >= 0,\n        \"The number of items to skip can't be negative or greater than \" + Integer.MAX_VALUE);\n    try {\n      final List<WorkspaceImpl> list =\n          managerProvider\n              .get()\n              .createNamedQuery(\"Workspace.getByTemporary\", WorkspaceImpl.class)\n              .setParameter(\"temporary\", isTemporary)\n              .setMaxResults(maxItems)\n              .setFirstResult((int) skipCount)\n              .getResultList()\n              .stream()\n              .map(WorkspaceImpl::new)\n              .collect(toList());\n      final long count =\n          managerProvider\n              .get()\n              .createNamedQuery(\"Workspace.getByTemporaryCount\", Long.class)\n              .setParameter(\"temporary\", isTemporary)\n              .getSingleResult();\n      return new Page<>(list, skipCount, maxItems, count);\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n\n  @Transactional\n  protected void doCreate(WorkspaceImpl workspace) {\n    if (workspace.getConfig() != null) {\n      workspace.getConfig().getProjects().forEach(ProjectConfigImpl::prePersistAttributes);\n    }\n    EntityManager manager = managerProvider.get();\n    manager.persist(workspace);\n    manager.flush();\n  }\n\n  @Transactional(rollbackOn = {RuntimeException.class, ServerException.class})\n  protected Optional<WorkspaceImpl> doRemove(String id) throws ServerException {\n    final WorkspaceImpl workspace = managerProvider.get().find(WorkspaceImpl.class, id);\n    if (workspace == null) {\n      return Optional.empty();\n    }\n    final EntityManager manager = managerProvider.get();\n    manager.remove(workspace);\n    manager.flush();\n    return Optional.of(workspace);\n  }\n\n  @Transactional\n  protected WorkspaceImpl doUpdate(WorkspaceImpl update) throws NotFoundException {\n    EntityManager manager = managerProvider.get();\n    if (manager.find(WorkspaceImpl.class, update.getId()) == null) {\n      throw new NotFoundException(format(\"Workspace with id '%s' doesn't exist\", update.getId()));\n    }\n    if (update.getConfig() != null) {\n      update.getConfig().getProjects().forEach(ProjectConfigImpl::prePersistAttributes);\n    }\n    WorkspaceImpl merged = manager.merge(update);\n    manager.flush();\n    return merged;\n  }\n\n  @Override\n  @Transactional\n  public long getWorkspacesTotalCount() throws ServerException {\n    try {\n      return managerProvider\n          .get()\n          .createNamedQuery(\"Workspace.getWorkspacesTotalCount\", Long.class)\n          .getSingleResult();\n    } catch (RuntimeException x) {\n      throw new ServerException(x.getLocalizedMessage(), x);\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/jpa/WorkspaceJpaModule.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.jpa;\n\nimport com.google.inject.AbstractModule;\nimport org.eclipse.che.api.workspace.server.spi.WorkspaceDao;\n\n/**\n * @author Yevhenii Voevodin\n */\npublic class WorkspaceJpaModule extends AbstractModule {\n\n  @Override\n  protected void configure() {\n    bind(WorkspaceDao.class).to(JpaWorkspaceDao.class);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/CommandImpl.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.StringJoiner;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Embedded;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.devfile.PreviewUrl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.PreviewUrlImpl;\n\n/**\n * Data object for {@link Command}.\n *\n * @author Eugene Voevodin\n */\n@Entity(name = \"Command\")\n@Table(name = \"command\")\npublic class CommandImpl implements Command {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"name\", nullable = false)\n  private String name;\n\n  @Column(name = \"commandline\", nullable = false, columnDefinition = \"TEXT\")\n  private String commandLine;\n\n  @Column(name = \"type\", nullable = false)\n  private String type;\n\n  @Embedded private PreviewUrlImpl previewUrl;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(name = \"command_attributes\", joinColumns = @JoinColumn(name = \"command_id\"))\n  @MapKeyColumn(name = \"name\")\n  @Column(name = \"value_param\", columnDefinition = \"TEXT\")\n  private Map<String, String> attributes;\n\n  public CommandImpl() {}\n\n  public CommandImpl(String name, String commandLine, String type) {\n    this.name = name;\n    this.commandLine = commandLine;\n    this.type = type;\n  }\n\n  public CommandImpl(\n      String name,\n      String commandLine,\n      String type,\n      PreviewUrlImpl previewUrl,\n      Map<String, String> attributes) {\n    this.name = name;\n    this.commandLine = commandLine;\n    this.type = type;\n    this.previewUrl = previewUrl;\n    this.attributes = new HashMap<>(attributes);\n  }\n\n  public CommandImpl(Command command) {\n    this.name = command.getName();\n    this.commandLine = command.getCommandLine();\n    this.type = command.getType();\n    if (command.getPreviewUrl() != null) {\n      this.previewUrl = new PreviewUrlImpl(command.getPreviewUrl());\n    }\n    this.attributes = new HashMap<>(command.getAttributes());\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public String getCommandLine() {\n    return commandLine;\n  }\n\n  public void setCommandLine(String commandLine) {\n    this.commandLine = commandLine;\n  }\n\n  public PreviewUrlImpl getPreviewUrl() {\n    return previewUrl;\n  }\n\n  public void setPreviewUrl(PreviewUrl previewUrl) {\n    if (previewUrl != null) {\n      this.previewUrl = new PreviewUrlImpl(previewUrl);\n    } else {\n      this.previewUrl = null;\n    }\n  }\n\n  @Override\n  public String getType() {\n    return type;\n  }\n\n  public void setType(String type) {\n    this.type = type;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    CommandImpl command = (CommandImpl) o;\n    return Objects.equals(id, command.id)\n        && Objects.equals(name, command.name)\n        && Objects.equals(commandLine, command.commandLine)\n        && Objects.equals(type, command.type)\n        && Objects.equals(previewUrl, command.previewUrl)\n        && Objects.equals(attributes, command.attributes);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, name, commandLine, type, previewUrl, attributes);\n  }\n\n  @Override\n  public String toString() {\n    return new StringJoiner(\", \", CommandImpl.class.getSimpleName() + \"[\", \"]\")\n        .add(\"id=\" + id)\n        .add(\"name='\" + name + \"'\")\n        .add(\"commandLine='\" + commandLine + \"'\")\n        .add(\"type='\" + type + \"'\")\n        .add(\"previewUrl=\" + previewUrl)\n        .add(\"attributes=\" + attributes)\n        .toString();\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/EnvironmentImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.stream.Collectors;\nimport javax.persistence.CascadeType;\nimport javax.persistence.Column;\nimport javax.persistence.Embedded;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.config.Environment;\nimport org.eclipse.che.api.core.model.workspace.config.MachineConfig;\nimport org.eclipse.che.api.core.model.workspace.config.Recipe;\n\n/**\n * Data object for {@link Environment}.\n *\n * @author Yevhenii Voevodin\n */\n@Entity(name = \"Environment\")\n@Table(name = \"environment\")\npublic class EnvironmentImpl implements Environment {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Embedded private RecipeImpl recipe;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"machines_id\")\n  @MapKeyColumn(name = \"machines_key\")\n  private Map<String, MachineConfigImpl> machines;\n\n  public EnvironmentImpl() {}\n\n  public EnvironmentImpl(Recipe recipe, Map<String, ? extends MachineConfig> machines) {\n    if (recipe != null) {\n      this.recipe = new RecipeImpl(recipe);\n    }\n    if (machines != null) {\n      this.machines =\n          machines.entrySet().stream()\n              .collect(\n                  Collectors.toMap(\n                      Map.Entry::getKey, entry -> new MachineConfigImpl(entry.getValue())));\n    }\n  }\n\n  public EnvironmentImpl(Environment environment) {\n    this(environment.getRecipe(), environment.getMachines());\n  }\n\n  @Override\n  public RecipeImpl getRecipe() {\n    return recipe;\n  }\n\n  public void setRecipe(RecipeImpl environmentRecipe) {\n    this.recipe = environmentRecipe;\n  }\n\n  @Override\n  public Map<String, MachineConfigImpl> getMachines() {\n    if (machines == null) {\n      machines = new HashMap<>();\n    }\n    return machines;\n  }\n\n  public void setMachines(Map<String, MachineConfigImpl> machines) {\n    this.machines = machines;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) return true;\n    if (!(o instanceof EnvironmentImpl)) return false;\n    EnvironmentImpl that = (EnvironmentImpl) o;\n    return Objects.equals(id, that.id)\n        && Objects.equals(getRecipe(), that.getRecipe())\n        && Objects.equals(getMachines(), that.getMachines());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, getRecipe(), getMachines());\n  }\n\n  @Override\n  public String toString() {\n    return \"EnvironmentImpl{\" + \"id=\" + id + \", recipe=\" + recipe + \", machines=\" + machines + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/MachineConfigImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.stream.Collectors;\nimport javax.persistence.CascadeType;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.config.MachineConfig;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.config.Volume;\n\n/**\n * @author Alexander Garagatyi\n */\n@Entity(name = \"ExternalMachine\")\n@Table(name = \"externalmachine\")\npublic class MachineConfigImpl implements MachineConfig {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"externalmachine_attributes\",\n      joinColumns = @JoinColumn(name = \"externalmachine_id\"))\n  @MapKeyColumn(name = \"attributes_key\")\n  @Column(name = \"attributes\")\n  private Map<String, String> attributes;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"externalmachine_env\",\n      joinColumns = @JoinColumn(name = \"externalmachine_id\"))\n  @MapKeyColumn(name = \"env_key\")\n  @Column(name = \"env_value\")\n  private Map<String, String> env;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"servers_id\")\n  @MapKeyColumn(name = \"servers_key\")\n  private Map<String, ServerConfigImpl> servers;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"machine_id\")\n  @MapKeyColumn(name = \"name\")\n  private Map<String, VolumeImpl> volumes;\n\n  public MachineConfigImpl() {}\n\n  public MachineConfigImpl(\n      Map<String, ? extends ServerConfig> servers,\n      Map<String, String> env,\n      Map<String, String> attributes,\n      Map<String, ? extends Volume> volumes) {\n    if (servers != null) {\n      this.servers =\n          servers.entrySet().stream()\n              .collect(\n                  Collectors.toMap(\n                      Map.Entry::getKey, entry -> new ServerConfigImpl(entry.getValue())));\n    }\n    if (env != null) {\n      this.env = new HashMap<>(env);\n    }\n    if (attributes != null) {\n      this.attributes = new HashMap<>(attributes);\n    }\n    if (volumes != null) {\n      this.volumes =\n          volumes.entrySet().stream()\n              .collect(\n                  Collectors.toMap(Map.Entry::getKey, entry -> new VolumeImpl(entry.getValue())));\n    }\n  }\n\n  public MachineConfigImpl(MachineConfig machine) {\n    this(machine.getServers(), machine.getEnv(), machine.getAttributes(), machine.getVolumes());\n  }\n\n  @Override\n  public Map<String, ServerConfigImpl> getServers() {\n    if (servers == null) {\n      servers = new HashMap<>();\n    }\n    return servers;\n  }\n\n  public void setServers(Map<String, ServerConfigImpl> servers) {\n    this.servers = servers;\n  }\n\n  public MachineConfigImpl withServers(Map<String, ServerConfigImpl> servers) {\n    this.servers = servers;\n    return this;\n  }\n\n  @Override\n  public Map<String, String> getEnv() {\n    if (env == null) {\n      env = new HashMap<>();\n    }\n    return env;\n  }\n\n  public void setEnv(Map<String, String> env) {\n    this.env = env;\n  }\n\n  public MachineConfigImpl withEnv(Map<String, String> env) {\n    this.env = env;\n    return this;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n  }\n\n  public MachineConfigImpl withAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n    return this;\n  }\n\n  @Override\n  public Map<String, VolumeImpl> getVolumes() {\n    if (volumes == null) {\n      volumes = new HashMap<>();\n    }\n    return volumes;\n  }\n\n  public void setVolumes(Map<String, VolumeImpl> volumes) {\n    this.volumes = volumes;\n  }\n\n  public MachineConfigImpl withVolumes(Map<String, VolumeImpl> volumes) {\n    this.volumes = volumes;\n    return this;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof MachineConfigImpl)) {\n      return false;\n    }\n    final MachineConfigImpl that = (MachineConfigImpl) obj;\n    return Objects.equals(id, that.id)\n        && getEnv().equals(that.getEnv())\n        && getAttributes().equals(that.getAttributes())\n        && getServers().equals(that.getServers())\n        && getVolumes().equals(that.getVolumes());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + getEnv().hashCode();\n    hash = 31 * hash + getAttributes().hashCode();\n    hash = 31 * hash + getServers().hashCode();\n    hash = 31 * hash + getVolumes().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"MachineConfigImpl{\"\n        + \"id=\"\n        + id\n        + \", env=\"\n        + env\n        + \", attributes=\"\n        + attributes\n        + \", servers=\"\n        + servers\n        + \", volumes=\"\n        + volumes\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/MachineImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport org.eclipse.che.api.core.model.workspace.runtime.Machine;\nimport org.eclipse.che.api.core.model.workspace.runtime.MachineStatus;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\n\n/**\n * Data object for {@link Machine}.\n *\n * @author Alexander Garagatyi\n */\npublic class MachineImpl implements Machine {\n\n  private Map<String, String> attributes;\n  private Map<String, ServerImpl> servers;\n  private MachineStatus status;\n\n  public MachineImpl(Machine machineRuntime) {\n    this(machineRuntime.getAttributes(), machineRuntime.getServers(), machineRuntime.getStatus());\n  }\n\n  public MachineImpl(\n      Map<String, String> attributes, Map<String, ? extends Server> servers, MachineStatus status) {\n    this(servers);\n    this.attributes = new HashMap<>(attributes);\n    this.status = status;\n  }\n\n  public MachineImpl(Map<String, ? extends Server> servers) {\n    if (servers != null) {\n      this.servers =\n          servers.entrySet().stream()\n              .collect(\n                  HashMap::new,\n                  (map, entry) -> map.put(entry.getKey(), new ServerImpl(entry.getValue())),\n                  HashMap::putAll);\n    }\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  @Override\n  public Map<String, ServerImpl> getServers() {\n    if (servers == null) {\n      servers = new HashMap<>();\n    }\n    return servers;\n  }\n\n  @Override\n  public MachineStatus getStatus() {\n    return status;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof MachineImpl)) {\n      return false;\n    }\n    MachineImpl machine = (MachineImpl) o;\n    return Objects.equals(getAttributes(), machine.getAttributes())\n        && Objects.equals(getServers(), machine.getServers())\n        && getStatus() == machine.getStatus();\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(getAttributes(), getServers(), getStatus());\n  }\n\n  @Override\n  public String toString() {\n    return \"MachineImpl{\"\n        + \"attributes=\"\n        + attributes\n        + \", servers=\"\n        + servers\n        + \", status=\"\n        + status\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/ProjectConfigImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport static java.util.stream.Collectors.toMap;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.stream.Collectors;\nimport javax.persistence.CascadeType;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKey;\nimport javax.persistence.OneToMany;\nimport javax.persistence.OneToOne;\nimport javax.persistence.PostLoad;\nimport javax.persistence.PostPersist;\nimport javax.persistence.PostUpdate;\nimport javax.persistence.PrePersist;\nimport javax.persistence.PreUpdate;\nimport javax.persistence.Table;\nimport javax.persistence.Transient;\nimport org.eclipse.che.api.core.model.workspace.config.ProjectConfig;\nimport org.eclipse.che.api.core.model.workspace.config.SourceStorage;\nimport org.eclipse.che.api.workspace.shared.ProjectProblemImpl;\n\n/**\n * Data object for {@link ProjectConfig}.\n *\n * @author Eugene Voevodin\n * @author Dmitry Shnurenko\n */\n@Entity(name = \"ProjectConfig\")\n@Table(name = \"projectconfig\")\npublic class ProjectConfigImpl implements ProjectConfig {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"path\", nullable = false)\n  private String path;\n\n  @Column(name = \"name\")\n  private String name;\n\n  @Column(name = \"type\")\n  private String type;\n\n  @Column(name = \"description\", columnDefinition = \"TEXT\")\n  private String description;\n\n  @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)\n  @JoinColumn(name = \"source_id\")\n  private SourceStorageImpl source;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"projectconfig_mixins\",\n      joinColumns = @JoinColumn(name = \"projectconfig_id\"))\n  @Column(name = \"mixins\")\n  private List<String> mixins;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"dbattributes_id\")\n  @MapKey(name = \"name\")\n  private Map<String, Attribute> dbAttributes;\n\n  // Mapping delegated to 'dbAttributes' field\n  // as it is impossible to map nested list directly\n  @Transient private Map<String, List<String>> attributes;\n\n  @Transient private List<ProjectProblemImpl> problems;\n\n  public ProjectConfigImpl() {}\n\n  public ProjectConfigImpl(ProjectConfig projectConfig) {\n    name = projectConfig.getName();\n    path = projectConfig.getPath();\n    description = projectConfig.getDescription();\n    type = projectConfig.getType();\n    mixins = new ArrayList<>(projectConfig.getMixins());\n    attributes =\n        projectConfig.getAttributes().entrySet().stream()\n            .collect(toMap(Map.Entry::getKey, e -> new ArrayList<>(e.getValue())));\n\n    SourceStorage sourceStorage = projectConfig.getSource();\n\n    if (sourceStorage != null) {\n      source =\n          new SourceStorageImpl(\n              sourceStorage.getType(), sourceStorage.getLocation(), sourceStorage.getParameters());\n    }\n    if (projectConfig.getProblems() != null) {\n      problems =\n          projectConfig.getProblems().stream()\n              .map(problem -> new ProjectProblemImpl(problem.getCode(), problem.getMessage()))\n              .collect(Collectors.toList());\n    } else {\n      problems = Collections.emptyList();\n    }\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public String getPath() {\n    return path;\n  }\n\n  public void setPath(String path) {\n    this.path = path;\n  }\n\n  @Override\n  public String getDescription() {\n    return description;\n  }\n\n  public void setDescription(String description) {\n    this.description = description;\n  }\n\n  @Override\n  public String getType() {\n    return type;\n  }\n\n  public void setType(String type) {\n    this.type = type;\n  }\n\n  @Override\n  public List<String> getMixins() {\n    if (mixins == null) {\n      mixins = new ArrayList<>();\n    }\n    return mixins;\n  }\n\n  public void setMixins(List<String> mixins) {\n    this.mixins = mixins;\n  }\n\n  @Override\n  public Map<String, List<String>> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, List<String>> attributes) {\n    this.attributes = attributes;\n  }\n\n  @Override\n  public SourceStorageImpl getSource() {\n    return source;\n  }\n\n  @Override\n  public List<ProjectProblemImpl> getProblems() {\n    return problems;\n  }\n\n  public void setSource(SourceStorageImpl sourceStorage) {\n    this.source = sourceStorage;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof ProjectConfigImpl)) {\n      return false;\n    }\n    final ProjectConfigImpl that = (ProjectConfigImpl) obj;\n    return Objects.equals(id, that.id)\n        && Objects.equals(path, that.path)\n        && Objects.equals(name, that.name)\n        && Objects.equals(type, that.type)\n        && Objects.equals(description, that.description)\n        && Objects.equals(source, that.source)\n        && getMixins().equals(that.getMixins())\n        && getAttributes().equals(that.getAttributes());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + Objects.hashCode(path);\n    hash = 31 * hash + Objects.hashCode(name);\n    hash = 31 * hash + Objects.hashCode(type);\n    hash = 31 * hash + Objects.hashCode(description);\n    hash = 31 * hash + Objects.hashCode(source);\n    hash = 31 * hash + getMixins().hashCode();\n    hash = 31 * hash + getAttributes().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"ProjectConfigImpl{\"\n        + \"id=\"\n        + id\n        + \", path='\"\n        + path\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", type='\"\n        + type\n        + '\\''\n        + \", description='\"\n        + description\n        + '\\''\n        + \", source=\"\n        + source\n        + \", mixins=\"\n        + mixins\n        + \", attributes=\"\n        + attributes\n        + '}';\n  }\n\n  /**\n   * Synchronizes instance attributes with db attributes, should be called by internal components in\n   * needed places, this can't be done neither by {@link PrePersist} nor by {@link PreUpdate} as\n   * when the entity is merged the transient attribute won't be passed to event handlers.\n   */\n  public void prePersistAttributes() {\n    if (dbAttributes == null) {\n      dbAttributes = new HashMap<>();\n    }\n    final Map<String, Attribute> dbAttrsCopy = new HashMap<>(dbAttributes);\n    dbAttributes.clear();\n    for (Map.Entry<String, List<String>> entry : getAttributes().entrySet()) {\n      Attribute attribute = dbAttrsCopy.get(entry.getKey());\n      if (attribute == null) {\n        attribute = new Attribute(entry.getKey(), entry.getValue());\n      } else if (!Objects.equals(attribute.values, entry.getValue())) {\n        attribute.values = entry.getValue();\n      }\n      dbAttributes.put(entry.getKey(), attribute);\n    }\n  }\n\n  @PostLoad\n  @PostUpdate\n  @PostPersist\n  private void postLoadAttributes() {\n    if (dbAttributes != null) {\n      attributes =\n          dbAttributes.values().stream().collect(toMap(attr -> attr.name, attr -> attr.values));\n    }\n  }\n\n  @Entity(name = \"ProjectAttribute\")\n  @Table(name = \"projectattribute\")\n  private static class Attribute {\n\n    @Id\n    @GeneratedValue\n    @Column(name = \"id\")\n    private Long id;\n\n    @Column(name = \"name\")\n    private String name;\n\n    @ElementCollection(fetch = FetchType.EAGER)\n    @CollectionTable(\n        name = \"projectattribute_values\",\n        joinColumns = @JoinColumn(name = \"projectattribute_id\"))\n    @Column(name = \"attribute_values\")\n    private List<String> values;\n\n    public Attribute() {}\n\n    public Attribute(String name, List<String> values) {\n      this.name = name;\n      this.values = values;\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) {\n        return true;\n      }\n      if (!(obj instanceof Attribute)) {\n        return false;\n      }\n      final Attribute that = (Attribute) obj;\n      return Objects.equals(id, that.id)\n          && Objects.equals(name, that.name)\n          && values.equals(that.values);\n    }\n\n    @Override\n    public int hashCode() {\n      int hash = 7;\n      hash = 31 * hash + Objects.hashCode(id);\n      hash = 31 * hash + Objects.hashCode(name);\n      hash = 31 * hash + values.hashCode();\n      return hash;\n    }\n\n    @Override\n    public String toString() {\n      return \"Attribute{\" + \"values=\" + values + \", name='\" + name + '\\'' + \", id=\" + id + '}';\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/RecipeImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Embeddable;\nimport org.eclipse.che.api.core.model.workspace.config.Recipe;\n\n/**\n * @author Alexander Garagatyi\n */\n@Embeddable\npublic class RecipeImpl implements Recipe {\n\n  @Column(name = \"type\")\n  private String type;\n\n  @Column(name = \"contenttype\")\n  private String contentType;\n\n  @Column(name = \"content\", columnDefinition = \"TEXT\")\n  private String content;\n\n  @Column(name = \"location\", columnDefinition = \"TEXT\")\n  private String location;\n\n  public RecipeImpl() {}\n\n  public RecipeImpl(String type, String contentType, String content, String location) {\n    this.type = type;\n    this.contentType = contentType;\n    this.content = content;\n    this.location = location;\n  }\n\n  public RecipeImpl(Recipe recipe) {\n    this.type = recipe.getType();\n    this.contentType = recipe.getContentType();\n    this.content = recipe.getContent();\n    this.location = recipe.getLocation();\n  }\n\n  @Override\n  public String getType() {\n    return type;\n  }\n\n  public void setType(String type) {\n    this.type = type;\n  }\n\n  @Override\n  public String getContentType() {\n    return contentType;\n  }\n\n  public void setContentType(String contentType) {\n    this.contentType = contentType;\n  }\n\n  @Override\n  public String getContent() {\n    return content;\n  }\n\n  public void setContent(String content) {\n    this.content = content;\n  }\n\n  @Override\n  public String getLocation() {\n    return location;\n  }\n\n  public void setLocation(String location) {\n    this.location = location;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) return true;\n    if (!(o instanceof RecipeImpl)) return false;\n    RecipeImpl that = (RecipeImpl) o;\n    return Objects.equals(type, that.type)\n        && Objects.equals(contentType, that.contentType)\n        && Objects.equals(content, that.content)\n        && Objects.equals(location, that.location);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(type, contentType, content, location);\n  }\n\n  @Override\n  public String toString() {\n    return \"RecipeImpl{\"\n        + \"type='\"\n        + type\n        + '\\''\n        + \", contentType='\"\n        + contentType\n        + '\\''\n        + \", content='\"\n        + content\n        + '\\''\n        + \", location='\"\n        + location\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/RuntimeIdentityImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport java.util.Objects;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\n\n/**\n * @author gazarenkov\n */\npublic final class RuntimeIdentityImpl implements RuntimeIdentity {\n\n  private final String workspaceId;\n  private final String envName;\n  private final String ownerId;\n  private final String infrastructureNamespace;\n\n  public RuntimeIdentityImpl(RuntimeIdentity id) {\n    this(id.getWorkspaceId(), id.getEnvName(), id.getOwnerId(), id.getInfrastructureNamespace());\n  }\n\n  public RuntimeIdentityImpl(\n      String workspaceId, String envName, String ownerId, String infrastructureNamespace) {\n    this.workspaceId = workspaceId;\n    this.envName = envName;\n    this.ownerId = ownerId;\n    this.infrastructureNamespace = infrastructureNamespace;\n  }\n\n  @Override\n  public String getWorkspaceId() {\n    return workspaceId;\n  }\n\n  @Override\n  public String getEnvName() {\n    return envName;\n  }\n\n  @Override\n  public String getOwnerId() {\n    return ownerId;\n  }\n\n  @Override\n  public String getInfrastructureNamespace() {\n    return infrastructureNamespace;\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(workspaceId, envName, ownerId, infrastructureNamespace);\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (!(obj instanceof RuntimeIdentityImpl)) {\n      return false;\n    }\n    RuntimeIdentityImpl other = (RuntimeIdentityImpl) obj;\n    return workspaceId.equals(other.workspaceId)\n        && Objects.equals(envName, other.envName)\n        && Objects.equals(ownerId, other.ownerId)\n        && Objects.equals(infrastructureNamespace, other.infrastructureNamespace);\n  }\n\n  @Override\n  public String toString() {\n    return \"RuntimeIdentityImpl{\"\n        + \"workspaceId='\"\n        + workspaceId\n        + '\\''\n        + \", envName='\"\n        + envName\n        + '\\''\n        + \", ownerId='\"\n        + ownerId\n        + '\\''\n        + \", infrastructureNamespace='\"\n        + infrastructureNamespace\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/RuntimeImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.core.model.workspace.Runtime;\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.runtime.Machine;\n\n/**\n * Data object for {@link Runtime}.\n *\n * @author Yevhenii Voevodin\n */\npublic class RuntimeImpl implements Runtime {\n\n  private final String activeEnv;\n  private final String owner;\n  private final Map<String, ? extends Machine> machines;\n  private List<WarningImpl> warnings;\n  private List<CommandImpl> commands;\n\n  public RuntimeImpl(String activeEnv, Map<String, ? extends Machine> machines, String owner) {\n    this.activeEnv = activeEnv;\n    this.machines = machines;\n    this.owner = owner;\n  }\n\n  public RuntimeImpl(\n      String activeEnv,\n      Map<String, ? extends Machine> machines,\n      String owner,\n      List<? extends Command> commands,\n      List<? extends Warning> warnings) {\n    this.activeEnv = activeEnv;\n    this.machines = machines;\n    this.owner = owner;\n    if (commands != null) {\n      this.commands = commands.stream().map(CommandImpl::new).collect(Collectors.toList());\n    }\n    this.warnings = warnings.stream().map(WarningImpl::new).collect(Collectors.toList());\n  }\n\n  public RuntimeImpl(Runtime runtime) {\n    this.activeEnv = runtime.getActiveEnv();\n    this.machines =\n        runtime.getMachines().entrySet().stream()\n            .collect(Collectors.toMap(Map.Entry::getKey, e -> new MachineImpl(e.getValue())));\n    this.owner = runtime.getOwner();\n    this.warnings =\n        runtime.getWarnings().stream().map(WarningImpl::new).collect(Collectors.toList());\n    this.commands =\n        runtime.getCommands().stream().map(CommandImpl::new).collect(Collectors.toList());\n  }\n\n  @Override\n  public String getActiveEnv() {\n    return activeEnv;\n  }\n\n  @Override\n  public String getOwner() {\n    return owner;\n  }\n\n  @Override\n  public List<WarningImpl> getWarnings() {\n    if (warnings == null) {\n      warnings = new ArrayList<>();\n    }\n    return warnings;\n  }\n\n  @Override\n  public List<CommandImpl> getCommands() {\n    if (commands == null) {\n      commands = new ArrayList<>();\n    }\n    return commands;\n  }\n\n  @Override\n  public Map<String, ? extends Machine> getMachines() {\n    return machines;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) return true;\n    if (!(o instanceof RuntimeImpl)) return false;\n    RuntimeImpl that = (RuntimeImpl) o;\n    return Objects.equals(activeEnv, that.activeEnv)\n        && Objects.equals(machines, that.machines)\n        && Objects.equals(owner, that.owner)\n        && Objects.equals(commands, that.commands)\n        && Objects.equals(warnings, that.warnings);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(activeEnv, machines, owner, commands, warnings);\n  }\n\n  @Override\n  public String toString() {\n    return \"RuntimeImpl{\"\n        + \"activeEnv='\"\n        + activeEnv\n        + '\\''\n        + \", owner='\"\n        + owner\n        + '\\''\n        + \", machines=\"\n        + machines\n        + \", commands=\"\n        + commands\n        + \", warnings=\"\n        + warnings\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/ServerConfigImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.PUBLIC_ENDPOINT_ATTRIBUTE;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.devfile.Endpoint;\n\n/**\n * @author Alexander Garagatyi\n */\n@Entity(name = \"ServerConf\")\n@Table(name = \"serverconf\")\npublic class ServerConfigImpl implements ServerConfig {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"port\")\n  private String port;\n\n  @Column(name = \"protocol\")\n  private String protocol;\n\n  @Column(name = \"path\")\n  private String path;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"serverconf_attributes\",\n      joinColumns = @JoinColumn(name = \"serverconf_id\"))\n  @MapKeyColumn(name = \"attributes_key\")\n  @Column(name = \"attributes\")\n  private Map<String, String> attributes;\n\n  public ServerConfigImpl() {}\n\n  public ServerConfigImpl(\n      String port, String protocol, String path, Map<String, String> attributes) {\n    this.port = port;\n    this.protocol = protocol;\n    this.path = path;\n    if (attributes != null) {\n      this.attributes = new HashMap<>(attributes);\n    }\n  }\n\n  public ServerConfigImpl(ServerConfig serverConf) {\n    this(\n        serverConf.getPort(),\n        serverConf.getProtocol(),\n        serverConf.getPath(),\n        serverConf.getAttributes());\n  }\n\n  @Override\n  public String getPort() {\n    return port;\n  }\n\n  public void setPort(String port) {\n    this.port = port;\n  }\n\n  public ServerConfigImpl withPort(String port) {\n    this.port = port;\n    return this;\n  }\n\n  @Override\n  public String getProtocol() {\n    return protocol;\n  }\n\n  public void setProtocol(String protocol) {\n    this.protocol = protocol;\n  }\n\n  public ServerConfigImpl withProtocol(String protocol) {\n    this.protocol = protocol;\n    return this;\n  }\n\n  @Override\n  public String getPath() {\n    return path;\n  }\n\n  public void setPath(String path) {\n    this.path = path;\n  }\n\n  public ServerConfigImpl withPath(String path) {\n    this.path = path;\n    return this;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    if (attributes != null) {\n      this.attributes = new HashMap<>(attributes);\n    } else {\n      this.attributes = new HashMap<>();\n    }\n  }\n\n  public ServerConfigImpl withAttributes(Map<String, String> attributes) {\n    setAttributes(attributes);\n    return this;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof ServerConfigImpl)) {\n      return false;\n    }\n    ServerConfigImpl that = (ServerConfigImpl) o;\n    return Objects.equals(id, that.id)\n        && Objects.equals(getPort(), that.getPort())\n        && Objects.equals(getProtocol(), that.getProtocol())\n        && Objects.equals(getPath(), that.getPath())\n        && Objects.equals(getAttributes(), that.getAttributes());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, getPort(), getProtocol(), getPath(), getAttributes());\n  }\n\n  @Override\n  public String toString() {\n    return \"ServerConfigImpl{\"\n        + \"id=\"\n        + id\n        + \", port='\"\n        + port\n        + '\\''\n        + \", protocol='\"\n        + protocol\n        + '\\''\n        + \", path='\"\n        + path\n        + '\\''\n        + \", attributes=\"\n        + attributes\n        + '}';\n  }\n\n  public static ServerConfigImpl createFromEndpoint(Endpoint endpoint) {\n    HashMap<String, String> attributes = new HashMap<>(endpoint.getAttributes());\n    attributes.put(SERVER_NAME_ATTRIBUTE, endpoint.getName());\n\n    String protocol = attributes.remove(\"protocol\");\n    if (isNullOrEmpty(protocol)) {\n      protocol = \"http\";\n    }\n\n    String path = attributes.remove(\"path\");\n\n    String isPublic = attributes.remove(PUBLIC_ENDPOINT_ATTRIBUTE);\n    if (\"false\".equals(isPublic)) {\n      ServerConfig.setInternal(attributes, true);\n    }\n\n    return new ServerConfigImpl(Integer.toString(endpoint.getPort()), protocol, path, attributes);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/ServerImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\nimport org.eclipse.che.api.core.model.workspace.runtime.ServerStatus;\n\n/**\n * @author gazarenkov\n */\npublic class ServerImpl implements Server {\n\n  private String url;\n  private ServerStatus status;\n  private Map<String, String> attributes;\n\n  public ServerImpl() {}\n\n  public ServerImpl(String url, ServerStatus status, Map<String, String> attributes) {\n    this.url = url;\n    this.status = status;\n    if (attributes != null) {\n      this.attributes = new HashMap<>(attributes);\n    } else {\n      this.attributes = new HashMap<>();\n    }\n  }\n\n  public ServerImpl(Server server) {\n    this.url = server.getUrl();\n    this.status = server.getStatus();\n    if (server.getAttributes() != null) {\n      this.attributes = new HashMap<>(server.getAttributes());\n    } else {\n      this.attributes = new HashMap<>();\n    }\n  }\n\n  @Override\n  public String getUrl() {\n    return url;\n  }\n\n  public void setUrl(String url) {\n    this.url = url;\n  }\n\n  public ServerImpl withUrl(String url) {\n    this.url = url;\n    return this;\n  }\n\n  @Override\n  public ServerStatus getStatus() {\n    return this.status;\n  }\n\n  public void setStatus(ServerStatus status) {\n    this.status = status;\n  }\n\n  public ServerImpl withStatus(ServerStatus status) {\n    this.status = status;\n    return this;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    if (attributes != null) {\n      this.attributes = attributes;\n    } else {\n      this.attributes = new HashMap<>();\n    }\n  }\n\n  public ServerImpl withAttributes(Map<String, String> attributes) {\n    setAttributes(attributes);\n    return this;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof ServerImpl)) {\n      return false;\n    }\n    ServerImpl server = (ServerImpl) o;\n    return Objects.equals(getUrl(), server.getUrl())\n        && getStatus() == server.getStatus()\n        && Objects.equals(getAttributes(), server.getAttributes());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(getUrl(), getStatus(), getAttributes());\n  }\n\n  @Override\n  public String toString() {\n    return \"ServerImpl{\"\n        + \"url='\"\n        + url\n        + '\\''\n        + \", status=\"\n        + status\n        + \", attributes=\"\n        + attributes\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/SourceStorageImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport static java.lang.String.format;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.PrePersist;\nimport javax.persistence.PreUpdate;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.config.SourceStorage;\n\n/**\n * Data object for {@link SourceStorage}.\n *\n * @author Yevhenii Voevodin\n */\n@Entity(name = \"SourceStorage\")\n@Table(name = \"sourcestorage\")\npublic class SourceStorageImpl implements SourceStorage {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"type\")\n  private String type;\n\n  @Column(name = \"location\", columnDefinition = \"TEXT\")\n  private String location;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"sourcestorage_parameters\",\n      joinColumns = @JoinColumn(name = \"sourcestorage_id\"))\n  @MapKeyColumn(name = \"parameters_key\")\n  @Column(name = \"parameters\")\n  private Map<String, String> parameters;\n\n  public SourceStorageImpl() {}\n\n  public SourceStorageImpl(String type, String location, Map<String, String> parameters) {\n    this.type = type;\n    this.location = location;\n    if (parameters != null) {\n      this.parameters = new HashMap<>(parameters);\n    }\n  }\n\n  @PrePersist\n  @PreUpdate\n  public void validate() {\n    if (parameters != null) {\n      for (Map.Entry<String, String> e : parameters.entrySet()) {\n        if (e.getValue() == null) {\n          throw new IllegalStateException(\n              format(\n                  \"Parameter '%s' of the source %s is null. This is illegal.\", e.getKey(), this));\n        }\n      }\n    }\n  }\n\n  @Override\n  public String getType() {\n    return type;\n  }\n\n  public void setType(String type) {\n    this.type = type;\n  }\n\n  @Override\n  public String getLocation() {\n    return location;\n  }\n\n  public void setLocation(String location) {\n    this.location = location;\n  }\n\n  @Override\n  public Map<String, String> getParameters() {\n    if (parameters == null) {\n      parameters = new HashMap<>();\n    }\n    return parameters;\n  }\n\n  public void setParameters(Map<String, String> parameters) {\n    this.parameters = parameters;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof SourceStorageImpl)) {\n      return false;\n    }\n    final SourceStorageImpl that = (SourceStorageImpl) obj;\n    return Objects.equals(id, that.id)\n        && Objects.equals(type, that.type)\n        && Objects.equals(location, that.location)\n        && getParameters().equals(that.getParameters());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + Objects.hashCode(type);\n    hash = 31 * hash + Objects.hashCode(location);\n    hash = 31 * hash + getParameters().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"SourceStorageImpl{\"\n        + \"id=\"\n        + id\n        + \", type='\"\n        + type\n        + '\\''\n        + \", location='\"\n        + location\n        + '\\''\n        + \", parameters=\"\n        + parameters\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/VolumeImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.config.Volume;\n\n/**\n * @author Alexander Garagatyi\n */\n@Entity(name = \"MachineVolume\")\n@Table(name = \"machine_volume\")\npublic class VolumeImpl implements Volume {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"path\")\n  private String path;\n\n  public VolumeImpl() {}\n\n  public VolumeImpl(Volume value) {\n    path = value.getPath();\n  }\n\n  @Override\n  public String getPath() {\n    return path;\n  }\n\n  public void setPath(String path) {\n    this.path = path;\n  }\n\n  public VolumeImpl withPath(String path) {\n    this.path = path;\n    return this;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof VolumeImpl)) {\n      return false;\n    }\n    VolumeImpl volume = (VolumeImpl) o;\n    return Objects.equals(id, volume.id) && Objects.equals(getPath(), volume.getPath());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, getPath());\n  }\n\n  @Override\n  public String toString() {\n    return \"VolumeImpl{\" + \"id=\" + id + \", path='\" + path + '\\'' + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/WarningImpl.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport java.util.Objects;\nimport org.eclipse.che.api.core.model.workspace.Warning;\n\n/**\n * Data object for {@link Warning}.\n *\n * @author Yevhenii Voevodin\n */\npublic class WarningImpl implements Warning {\n\n  private final int code;\n  private final String message;\n\n  public WarningImpl(int code, String message) {\n    this.code = code;\n    this.message = message;\n  }\n\n  public WarningImpl(Warning warning) {\n    this.code = warning.getCode();\n    this.message = warning.getMessage();\n  }\n\n  @Override\n  public int getCode() {\n    return code;\n  }\n\n  @Override\n  public String getMessage() {\n    return message;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof WarningImpl)) {\n      return false;\n    }\n    final WarningImpl that = (WarningImpl) obj;\n    return code == that.code && Objects.equals(message, that.message);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + code;\n    hash = 31 * hash + Objects.hashCode(message);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"Warning{\" + \"code=\" + code + \", message='\" + message + '\\'' + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/WorkspaceConfigImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport static java.util.Objects.requireNonNull;\nimport static java.util.stream.Collectors.toList;\nimport static java.util.stream.Collectors.toMap;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.persistence.CascadeType;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\nimport javax.persistence.Transient;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceConfig;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.config.Environment;\nimport org.eclipse.che.api.core.model.workspace.config.ProjectConfig;\nimport org.eclipse.che.api.core.model.workspace.devfile.Devfile;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Data object for {@link WorkspaceConfig}.\n *\n * @author Alexander Garagatyi\n * @author Yevhenii Voevodin\n */\n@Entity(name = \"WorkspaceConfig\")\n@Table(name = \"workspaceconfig\")\npublic class WorkspaceConfigImpl implements WorkspaceConfig {\n\n  public static WorkspaceConfigImplBuilder builder() {\n    return new WorkspaceConfigImplBuilder();\n  }\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"name\", nullable = false)\n  private String name;\n\n  @Column(name = \"description\", columnDefinition = \"TEXT\")\n  private String description;\n\n  @Column(name = \"defaultenv\", nullable = true)\n  private String defaultEnv;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"commands_id\")\n  private List<CommandImpl> commands;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"projects_id\")\n  private List<ProjectConfigImpl> projects;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"environments_id\")\n  @MapKeyColumn(name = \"environments_key\")\n  private Map<String, EnvironmentImpl> environments;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"che_workspace_cfg_attributes\",\n      joinColumns = @JoinColumn(name = \"workspace_id\"))\n  @MapKeyColumn(name = \"attributes_key\")\n  @Column(name = \"attributes\")\n  private Map<String, String> attributes;\n\n  // we do not store converted workspace configs,\n  // so it's not needed to store devfile from which this workspace config is generated\n  @Transient private DevfileImpl devfile;\n\n  public WorkspaceConfigImpl() {}\n\n  public WorkspaceConfigImpl(\n      String name,\n      String description,\n      String defaultEnv,\n      List<? extends Command> commands,\n      List<? extends ProjectConfig> projects,\n      Map<String, ? extends Environment> environments,\n      Map<String, String> attributes) {\n    this(name, description, defaultEnv, commands, projects, environments, attributes, null);\n  }\n\n  public WorkspaceConfigImpl(\n      String name,\n      String description,\n      String defaultEnv,\n      List<? extends Command> commands,\n      List<? extends ProjectConfig> projects,\n      Map<String, ? extends Environment> environments,\n      Map<String, String> attributes,\n      Devfile devfile) {\n    this.name = name;\n    this.defaultEnv = defaultEnv;\n    this.description = description;\n    if (environments != null) {\n      this.environments =\n          environments.entrySet().stream()\n              .collect(toMap(Map.Entry::getKey, entry -> new EnvironmentImpl(entry.getValue())));\n    }\n    if (commands != null) {\n      this.commands = commands.stream().map(CommandImpl::new).collect(toList());\n    }\n    if (projects != null) {\n      this.projects = projects.stream().map(ProjectConfigImpl::new).collect(toList());\n    }\n    if (attributes != null) {\n      this.attributes = new HashMap<>(attributes);\n    }\n    if (devfile != null) {\n      this.devfile = new DevfileImpl(devfile);\n    }\n  }\n\n  public WorkspaceConfigImpl(WorkspaceConfig workspaceConfig) {\n    this(\n        workspaceConfig.getName(),\n        workspaceConfig.getDescription(),\n        workspaceConfig.getDefaultEnv(),\n        workspaceConfig.getCommands(),\n        workspaceConfig.getProjects(),\n        workspaceConfig.getEnvironments(),\n        workspaceConfig.getAttributes(),\n        workspaceConfig.getDevfile());\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = requireNonNull(name, \"Non-null name required\");\n  }\n\n  @Override\n  @Nullable\n  public String getDescription() {\n    return description;\n  }\n\n  public void setDescription(String description) {\n    this.description = description;\n  }\n\n  @Override\n  public String getDefaultEnv() {\n    return defaultEnv;\n  }\n\n  public void setDefaultEnv(String defaultEnv) {\n    this.defaultEnv = defaultEnv;\n  }\n\n  @Override\n  public List<CommandImpl> getCommands() {\n    if (commands == null) {\n      commands = new ArrayList<>();\n    }\n    return commands;\n  }\n\n  public void setCommands(List<CommandImpl> commands) {\n    this.commands = commands;\n  }\n\n  @Override\n  public List<ProjectConfigImpl> getProjects() {\n    if (projects == null) {\n      projects = new ArrayList<>();\n    }\n    return projects;\n  }\n\n  public void setProjects(List<ProjectConfigImpl> projects) {\n    this.projects = projects;\n  }\n\n  @Override\n  public Map<String, EnvironmentImpl> getEnvironments() {\n    if (environments == null) {\n      environments = new HashMap<>();\n    }\n    return environments;\n  }\n\n  public void setEnvironments(Map<String, EnvironmentImpl> environments) {\n    this.environments = environments;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n  }\n\n  public WorkspaceConfigImpl setDevfile(DevfileImpl devfile) {\n    this.devfile = devfile;\n    return this;\n  }\n\n  @Nullable\n  @Override\n  public DevfileImpl getDevfile() {\n    return devfile;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof WorkspaceConfigImpl)) {\n      return false;\n    }\n    final WorkspaceConfigImpl that = (WorkspaceConfigImpl) obj;\n    return Objects.equals(id, that.id)\n        && Objects.equals(name, that.name)\n        && Objects.equals(description, that.description)\n        && Objects.equals(defaultEnv, that.defaultEnv)\n        && Objects.equals(devfile, that.devfile)\n        && getCommands().equals(that.getCommands())\n        && getProjects().equals(that.getProjects())\n        && getEnvironments().equals(that.getEnvironments())\n        && getAttributes().equals(that.getAttributes());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + Objects.hashCode(name);\n    hash = 31 * hash + Objects.hashCode(description);\n    hash = 31 * hash + Objects.hashCode(defaultEnv);\n    hash = 31 * hash + Objects.hashCode(devfile);\n    hash = 31 * hash + getCommands().hashCode();\n    hash = 31 * hash + getProjects().hashCode();\n    hash = 31 * hash + getEnvironments().hashCode();\n    hash = 31 * hash + getAttributes().hashCode();\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"WorkspaceConfigImpl{\"\n        + \"id=\"\n        + id\n        + \", name='\"\n        + name\n        + '\\''\n        + \", description='\"\n        + description\n        + '\\''\n        + \", defaultEnv='\"\n        + defaultEnv\n        + '\\''\n        + \", commands=\"\n        + commands\n        + \", projects=\"\n        + projects\n        + \", environments=\"\n        + environments\n        + \", attributes=\"\n        + attributes\n        + \", devfile=\"\n        + devfile\n        + '}';\n  }\n\n  /**\n   * Helps to build complex {@link WorkspaceConfigImpl users workspace instance}.\n   *\n   * @see WorkspaceConfigImpl#builder()\n   */\n  public static class WorkspaceConfigImplBuilder {\n\n    private String name;\n    private String defaultEnvName;\n    private String description;\n    private List<? extends Command> commands;\n    private List<? extends ProjectConfig> projects;\n    private Map<String, ? extends Environment> environments;\n    private Map<String, String> attributes;\n\n    private WorkspaceConfigImplBuilder() {}\n\n    public WorkspaceConfigImpl build() {\n      return new WorkspaceConfigImpl(\n          name, description, defaultEnvName, commands, projects, environments, attributes);\n    }\n\n    public WorkspaceConfigImplBuilder fromConfig(WorkspaceConfig workspaceConfig) {\n      this.name = workspaceConfig.getName();\n      this.description = workspaceConfig.getDescription();\n      this.defaultEnvName = workspaceConfig.getDefaultEnv();\n      this.projects = workspaceConfig.getProjects();\n      this.commands = workspaceConfig.getCommands();\n      this.environments = workspaceConfig.getEnvironments();\n      return this;\n    }\n\n    public WorkspaceConfigImplBuilder setName(String name) {\n      this.name = name;\n      return this;\n    }\n\n    public WorkspaceConfigImplBuilder setDefaultEnv(String defaultEnvName) {\n      this.defaultEnvName = defaultEnvName;\n      return this;\n    }\n\n    public WorkspaceConfigImplBuilder setCommands(List<? extends Command> commands) {\n      this.commands = commands;\n      return this;\n    }\n\n    public WorkspaceConfigImplBuilder setProjects(List<? extends ProjectConfig> projects) {\n      this.projects = projects;\n      return this;\n    }\n\n    public WorkspaceConfigImplBuilder setEnvironments(\n        Map<String, ? extends Environment> environments) {\n      this.environments = environments;\n      return this;\n    }\n\n    public WorkspaceConfigImplBuilder setDescription(String description) {\n      this.description = description;\n      return this;\n    }\n\n    public WorkspaceConfigImplBuilder setAttributes(Map<String, String> attributes) {\n      this.attributes = attributes;\n      return this;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/WorkspaceImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.persistence.CascadeType;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.EntityListeners;\nimport javax.persistence.FetchType;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.NamedQueries;\nimport javax.persistence.NamedQuery;\nimport javax.persistence.OneToOne;\nimport javax.persistence.PrePersist;\nimport javax.persistence.PreUpdate;\nimport javax.persistence.Table;\nimport javax.persistence.Transient;\nimport org.eclipse.che.account.shared.model.Account;\nimport org.eclipse.che.account.spi.AccountImpl;\nimport org.eclipse.che.api.core.model.workspace.Runtime;\nimport org.eclipse.che.api.core.model.workspace.Workspace;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceConfig;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.model.workspace.devfile.Devfile;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.lang.NameGenerator;\nimport org.eclipse.persistence.descriptors.DescriptorEvent;\nimport org.eclipse.persistence.descriptors.DescriptorEventAdapter;\n\n/**\n * Data object for {@link Workspace}.\n *\n * @author Yevhenii Voevodin\n */\n@Entity(name = \"Workspace\")\n@Table(name = \"workspace\")\n@NamedQueries({\n  @NamedQuery(\n      name = \"Workspace.getByNamespace\",\n      query = \"SELECT w FROM Workspace w WHERE w.account.name = :namespace\"),\n  @NamedQuery(\n      name = \"Workspace.getByName\",\n      query = \"SELECT w FROM Workspace w WHERE w.account.name = :namespace AND w.name = :name\"),\n  @NamedQuery(name = \"Workspace.getAll\", query = \"SELECT w FROM Workspace w\"),\n  @NamedQuery(\n      name = \"Workspace.getByTemporary\",\n      query = \"SELECT w \" + \"FROM Workspace w \" + \"WHERE w.isTemporary = :temporary \"),\n  @NamedQuery(name = \"Workspace.getAllCount\", query = \"SELECT COUNT(w) FROM Workspace w\"),\n  @NamedQuery(\n      name = \"Workspace.getByNamespaceCount\",\n      query = \"SELECT COUNT(w) \" + \"FROM Workspace w \" + \"WHERE w.account.name = :namespace \"),\n  @NamedQuery(\n      name = \"Workspace.getWorkspacesTotalCount\",\n      query = \"SELECT COUNT(w) FROM Workspace w\"),\n  @NamedQuery(\n      name = \"Workspace.getByTemporaryCount\",\n      query = \"SELECT COUNT(w) \" + \"FROM Workspace w \" + \"WHERE w.isTemporary = :temporary \")\n})\n@EntityListeners(WorkspaceImpl.SyncNameOnUpdateAndPersistEventListener.class)\npublic class WorkspaceImpl implements Workspace {\n\n  public static WorkspaceImplBuilder builder() {\n    return new WorkspaceImplBuilder();\n  }\n\n  @Id\n  @Column(name = \"id\")\n  private String id;\n\n  /**\n   * The original workspace name is workspace.config.name this attribute is stored for unique\n   * constraint with account id. See {@link #syncName()}.\n   */\n  @Column(name = \"name\")\n  private String name;\n\n  @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)\n  @JoinColumn(name = \"config_id\")\n  private WorkspaceConfigImpl config;\n\n  @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)\n  @JoinColumn(name = \"devfile_id\")\n  private DevfileImpl devfile;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(name = \"workspace_attributes\", joinColumns = @JoinColumn(name = \"workspace_id\"))\n  @MapKeyColumn(name = \"attributes_key\")\n  @Column(name = \"attributes\")\n  private Map<String, String> attributes;\n\n  @Column(name = \"istemporary\")\n  private boolean isTemporary;\n\n  @ManyToOne\n  @JoinColumn(name = \"accountid\", nullable = false)\n  private AccountImpl account;\n\n  @Transient private WorkspaceStatus status;\n\n  @Transient private Runtime runtime;\n\n  public WorkspaceImpl() {}\n\n  public WorkspaceImpl(String id, Account account, WorkspaceConfig config) {\n    this(id, account, config, null, null, false, null);\n  }\n\n  public WorkspaceImpl(String id, Account account, Devfile devfile) {\n    this(id, account, devfile, null, null, false, null);\n  }\n\n  public WorkspaceImpl(\n      String id,\n      Account account,\n      WorkspaceConfig config,\n      Runtime runtime,\n      Map<String, String> attributes,\n      boolean isTemporary,\n      WorkspaceStatus status) {\n    this(id, account, config, null, runtime, attributes, isTemporary, status);\n  }\n\n  public WorkspaceImpl(\n      String id,\n      Account account,\n      Devfile devfile,\n      Runtime runtime,\n      Map<String, String> attributes,\n      boolean isTemporary,\n      WorkspaceStatus status) {\n    this(id, account, null, devfile, runtime, attributes, isTemporary, status);\n  }\n\n  public WorkspaceImpl(\n      String id,\n      Account account,\n      WorkspaceConfig config,\n      Devfile devfile,\n      Runtime runtime,\n      Map<String, String> attributes,\n      boolean isTemporary,\n      WorkspaceStatus status) {\n    this.id = id;\n    if (account != null) {\n      this.account = new AccountImpl(account);\n    }\n    if (config != null && devfile != null) {\n      throw new IllegalArgumentException(\"Only config or devfile must be specified.\");\n    }\n    if (config != null) {\n      this.config = new WorkspaceConfigImpl(config);\n    }\n    if (devfile != null) {\n      this.devfile = new DevfileImpl(devfile);\n    }\n    if (runtime != null) {\n      this.runtime =\n          new RuntimeImpl(\n              runtime.getActiveEnv(),\n              runtime.getMachines(),\n              runtime.getOwner(),\n              runtime.getCommands(),\n              runtime.getWarnings());\n    }\n    if (attributes != null) {\n      this.attributes = new HashMap<>(attributes);\n    }\n    this.isTemporary = isTemporary;\n    this.status = status;\n  }\n\n  public WorkspaceImpl(Workspace workspace, Account account) {\n    this(\n        workspace.getId(),\n        account,\n        workspace.getConfig(),\n        workspace.getDevfile(),\n        workspace.getRuntime(),\n        workspace.getAttributes(),\n        workspace.isTemporary(),\n        workspace.getStatus());\n  }\n\n  public WorkspaceImpl(WorkspaceImpl workspace) {\n    this(workspace, workspace.account);\n  }\n\n  @Override\n  public String getId() {\n    return id;\n  }\n\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  @Override\n  public String getNamespace() {\n    if (account != null) {\n      return account.getName();\n    }\n    return null;\n  }\n\n  /** Returns the name of workspace. It can be stored by workspace config or devfile. */\n  public String getName() {\n    if (devfile != null) {\n      return devfile.getMetadata().getName();\n    } else if (config != null) {\n      return config.getName();\n    } else {\n      return null;\n    }\n  }\n\n  public void setAccount(AccountImpl account) {\n    this.account = account;\n  }\n\n  public AccountImpl getAccount() {\n    return account;\n  }\n\n  @Nullable\n  @Override\n  public WorkspaceConfigImpl getConfig() {\n    return config;\n  }\n\n  public void setConfig(WorkspaceConfigImpl config) {\n    this.config = config;\n  }\n\n  @Nullable\n  @Override\n  public DevfileImpl getDevfile() {\n    return devfile;\n  }\n\n  public WorkspaceImpl setDevfile(DevfileImpl devfile) {\n    this.devfile = devfile;\n    return this;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n  }\n\n  @Override\n  public boolean isTemporary() {\n    return isTemporary;\n  }\n\n  public void setTemporary(boolean temporary) {\n    isTemporary = temporary;\n  }\n\n  @Override\n  public WorkspaceStatus getStatus() {\n    return status;\n  }\n\n  public void setStatus(WorkspaceStatus status) {\n    this.status = status;\n  }\n\n  @Override\n  public Runtime getRuntime() {\n    return runtime;\n  }\n\n  public void setRuntime(Runtime runtime) {\n    this.runtime = runtime;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof WorkspaceImpl)) return false;\n    final WorkspaceImpl other = (WorkspaceImpl) obj;\n    return Objects.equals(id, other.id)\n        && Objects.equals(getNamespace(), other.getNamespace())\n        && Objects.equals(status, other.status)\n        && isTemporary == other.isTemporary\n        && getAttributes().equals(other.getAttributes())\n        && Objects.equals(config, other.config)\n        && Objects.equals(devfile, other.devfile)\n        && Objects.equals(runtime, other.runtime);\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 7;\n    hash = 31 * hash + Objects.hashCode(id);\n    hash = 31 * hash + Objects.hashCode(getNamespace());\n    hash = 31 * hash + Objects.hashCode(status);\n    hash = 31 * hash + Objects.hashCode(config);\n    hash = 31 * hash + Objects.hashCode(devfile);\n    hash = 31 * hash + getAttributes().hashCode();\n    hash = 31 * hash + Boolean.hashCode(isTemporary);\n    hash = 31 * hash + Objects.hashCode(runtime);\n    return hash;\n  }\n\n  @Override\n  public String toString() {\n    return \"WorkspaceImpl{\"\n        + \"id='\"\n        + id\n        + '\\''\n        + \", namespace='\"\n        + getNamespace()\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", config=\"\n        + config\n        + \", devfile=\"\n        + devfile\n        + \", isTemporary=\"\n        + isTemporary\n        + \", status=\"\n        + status\n        + \", attributes=\"\n        + attributes\n        + \", runtime=\"\n        + runtime\n        + '}';\n  }\n\n  /** Syncs {@link #name} with config name or devfile name. */\n  private void syncName() {\n    name = getName();\n  }\n\n  /**\n   * {@link PreUpdate} and {@link PrePersist} methods are not called when the configuration is\n   * updated and workspace object is not, while listener methods are always called, even if\n   * workspace instance is not changed.\n   */\n  public static class SyncNameOnUpdateAndPersistEventListener extends DescriptorEventAdapter {\n    @Override\n    public void preUpdate(DescriptorEvent event) {\n      ((WorkspaceImpl) event.getObject()).syncName();\n    }\n\n    @Override\n    public void prePersist(DescriptorEvent event) {\n      ((WorkspaceImpl) event.getObject()).syncName();\n    }\n\n    @Override\n    public void preUpdateWithChanges(DescriptorEvent event) {\n      ((WorkspaceImpl) event.getObject()).syncName();\n    }\n  }\n\n  /**\n   * Helps to build complex {@link WorkspaceImpl workspace} instance.\n   *\n   * @see WorkspaceImpl#builder()\n   */\n  public static class WorkspaceImplBuilder {\n\n    private String id;\n    private Account account;\n    private boolean isTemporary;\n    private WorkspaceStatus status;\n    private WorkspaceConfig config;\n    private Devfile devfile;\n    private Runtime runtime;\n    private Map<String, String> attributes;\n\n    public WorkspaceImpl build() {\n      return new WorkspaceImpl(\n          id, account, config, devfile, runtime, attributes, isTemporary, status);\n    }\n\n    public WorkspaceImplBuilder generateId() {\n      id = NameGenerator.generate(\"workspace\", 16);\n      return this;\n    }\n\n    public WorkspaceImplBuilder setConfig(WorkspaceConfig workspaceConfig) {\n      this.config = workspaceConfig;\n      return this;\n    }\n\n    public WorkspaceImplBuilder setDevfile(Devfile devfile) {\n      this.devfile = devfile;\n      return this;\n    }\n\n    public WorkspaceImplBuilder setId(String id) {\n      this.id = id;\n      return this;\n    }\n\n    public WorkspaceImplBuilder setAccount(Account account) {\n      this.account = account;\n      return this;\n    }\n\n    public WorkspaceImplBuilder setTemporary(boolean isTemporary) {\n      this.isTemporary = isTemporary;\n      return this;\n    }\n\n    public WorkspaceImplBuilder setStatus(WorkspaceStatus status) {\n      this.status = status;\n      return this;\n    }\n\n    public WorkspaceImplBuilder setAttributes(Map<String, String> attributes) {\n      this.attributes = attributes;\n      return this;\n    }\n\n    public WorkspaceImplBuilder setRuntime(Runtime runtime) {\n      this.runtime = runtime;\n      return this;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/devfile/ActionImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl.devfile;\n\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.devfile.Action;\n\n/**\n * @author Sergii Leshchenko\n */\n@Entity(name = \"DevfileAction\")\n@Table(name = \"devfile_action\")\npublic class ActionImpl implements Action {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"type\", nullable = false)\n  private String type;\n\n  @Column(name = \"component\", nullable = false)\n  private String component;\n\n  @Column(name = \"command\", nullable = false)\n  private String command;\n\n  @Column(name = \"workdir\")\n  private String workdir;\n\n  @Column(name = \"reference\")\n  private String reference;\n\n  @Column(name = \"reference_content\")\n  private String referenceContent;\n\n  public ActionImpl() {}\n\n  public ActionImpl(\n      String type,\n      String component,\n      String command,\n      String workdir,\n      String reference,\n      String referenceContent) {\n    this.type = type;\n    this.component = component;\n    this.command = command;\n    this.workdir = workdir;\n    this.reference = reference;\n    this.referenceContent = referenceContent;\n  }\n\n  public ActionImpl(Action action) {\n    this(\n        action.getType(),\n        action.getComponent(),\n        action.getCommand(),\n        action.getWorkdir(),\n        action.getReference(),\n        action.getReferenceContent());\n  }\n\n  @Override\n  public String getType() {\n    return type;\n  }\n\n  public void setType(String type) {\n    this.type = type;\n  }\n\n  @Override\n  public String getComponent() {\n    return component;\n  }\n\n  public void setComponent(String component) {\n    this.component = component;\n  }\n\n  @Override\n  public String getCommand() {\n    return command;\n  }\n\n  public void setCommand(String command) {\n    this.command = command;\n  }\n\n  @Override\n  public String getWorkdir() {\n    return workdir;\n  }\n\n  public void setWorkdir(String workdir) {\n    this.workdir = workdir;\n  }\n\n  @Override\n  public String getReference() {\n    return reference;\n  }\n\n  public void setReference(String reference) {\n    this.reference = reference;\n  }\n\n  @Override\n  public String getReferenceContent() {\n    return referenceContent;\n  }\n\n  public void setReferenceContent(String referenceContent) {\n    this.referenceContent = referenceContent;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof ActionImpl)) {\n      return false;\n    }\n    ActionImpl action = (ActionImpl) o;\n    return Objects.equals(id, action.id)\n        && Objects.equals(type, action.type)\n        && Objects.equals(component, action.component)\n        && Objects.equals(command, action.command)\n        && Objects.equals(workdir, action.workdir);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, type, component, command, workdir);\n  }\n\n  @Override\n  public String toString() {\n    return \"ActionImpl{\"\n        + \"id='\"\n        + id\n        + '\\''\n        + \", type='\"\n        + type\n        + '\\''\n        + \", component='\"\n        + component\n        + '\\''\n        + \", command='\"\n        + command\n        + '\\''\n        + \", workdir='\"\n        + workdir\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/devfile/CommandImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl.devfile;\n\nimport static java.util.stream.Collectors.toCollection;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.StringJoiner;\nimport javax.persistence.CascadeType;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Embedded;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.devfile.Action;\nimport org.eclipse.che.api.core.model.workspace.devfile.Command;\nimport org.eclipse.che.api.core.model.workspace.devfile.PreviewUrl;\n\n/**\n * @author Sergii Leshchenko\n */\n@Entity(name = \"DevfileCommand\")\n@Table(name = \"devfile_command\")\npublic class CommandImpl implements Command {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"name\", nullable = false)\n  private String name;\n\n  @Embedded private PreviewUrlImpl previewUrl;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"devfile_command_id\")\n  private List<ActionImpl> actions;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"devfile_command_attributes\",\n      joinColumns = @JoinColumn(name = \"devfile_command_id\"))\n  @MapKeyColumn(name = \"name\")\n  @Column(name = \"value_param\", columnDefinition = \"TEXT\")\n  private Map<String, String> attributes;\n\n  public CommandImpl() {}\n\n  public CommandImpl(\n      String name,\n      List<? extends Action> actions,\n      Map<String, String> attributes,\n      PreviewUrl previewUrl) {\n    this.name = name;\n    if (actions != null) {\n      this.actions = actions.stream().map(ActionImpl::new).collect(toCollection(ArrayList::new));\n    }\n    if (attributes != null) {\n      this.attributes = new HashMap<>(attributes);\n    }\n    if (previewUrl != null) {\n      this.previewUrl = new PreviewUrlImpl(previewUrl.getPort(), previewUrl.getPath());\n    }\n  }\n\n  public CommandImpl(Command command) {\n    this(command.getName(), command.getActions(), command.getAttributes(), command.getPreviewUrl());\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public PreviewUrlImpl getPreviewUrl() {\n    return previewUrl;\n  }\n\n  public void setPreviewUrl(PreviewUrlImpl previewUrl) {\n    this.previewUrl = previewUrl;\n  }\n\n  @Override\n  public List<ActionImpl> getActions() {\n    if (actions == null) {\n      actions = new ArrayList<>();\n    }\n    return actions;\n  }\n\n  public void setActions(List<ActionImpl> actions) {\n    this.actions = actions;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n  }\n\n  @Override\n  public String toString() {\n    return new StringJoiner(\", \", CommandImpl.class.getSimpleName() + \"[\", \"]\")\n        .add(\"id=\" + id)\n        .add(\"name='\" + name + \"'\")\n        .add(\"previewURL=\" + previewUrl)\n        .add(\"actions=\" + actions)\n        .add(\"attributes=\" + attributes)\n        .toString();\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    CommandImpl command = (CommandImpl) o;\n    return Objects.equals(id, command.id)\n        && Objects.equals(name, command.name)\n        && Objects.equals(previewUrl, command.previewUrl)\n        && Objects.equals(actions, command.actions)\n        && Objects.equals(attributes, command.attributes);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, name, previewUrl, actions, attributes);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/devfile/ComponentImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl.devfile;\n\nimport static java.util.stream.Collectors.toCollection;\n\nimport com.fasterxml.jackson.databind.annotation.JsonDeserialize;\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.persistence.CascadeType;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.Convert;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.api.core.model.workspace.devfile.Endpoint;\nimport org.eclipse.che.api.core.model.workspace.devfile.Entrypoint;\nimport org.eclipse.che.api.core.model.workspace.devfile.Env;\nimport org.eclipse.che.api.core.model.workspace.devfile.Volume;\nimport org.eclipse.che.api.workspace.server.devfile.PreferencesDeserializer;\nimport org.eclipse.che.api.workspace.server.devfile.SerializableConverter;\n\n/**\n * @author Sergii Leshchenko\n */\n@Entity(name = \"DevfileComponent\")\n@Table(name = \"devfile_component\")\npublic class ComponentImpl implements Component {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long generatedId;\n\n  @Column(name = \"component_id\", nullable = false)\n  private String componentId;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"devfile_component_preferences\",\n      joinColumns = @JoinColumn(name = \"devfile_component_id\"))\n  @MapKeyColumn(name = \"preference_key\")\n  @Convert(converter = SerializableConverter.class)\n  @Column(name = \"preference\")\n  @JsonDeserialize(using = PreferencesDeserializer.class)\n  private Map<String, Serializable> preferences;\n\n  @Column(name = \"alias\")\n  private String alias;\n\n  @Column(name = \"type\", nullable = false)\n  private String type;\n\n  @Column(name = \"registry_url\")\n  private String registryUrl;\n\n  @Column(name = \"reference\")\n  private String reference;\n\n  @Column(name = \"reference_content\")\n  private String referenceContent;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"devfile_component_selector\",\n      joinColumns = @JoinColumn(name = \"devfile_component_id\"))\n  @MapKeyColumn(name = \"selector_key\")\n  @Column(name = \"selector\")\n  private Map<String, String> selector;\n\n  @Column(name = \"image\")\n  private String image;\n\n  @Column(name = \"memory_limit\")\n  private String memoryLimit;\n\n  @Column(name = \"memory_request\")\n  private String memoryRequest;\n\n  @Column(name = \"cpu_limit\")\n  private String cpuLimit;\n\n  @Column(name = \"cpu_request\")\n  private String cpuRequest;\n\n  @Column(name = \"mount_sources\")\n  private Boolean mountSources;\n\n  @Column(name = \"automount_secrets\")\n  private Boolean automountWorkspaceSecrets;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"devfile_component_command\",\n      joinColumns = @JoinColumn(name = \"devfile_component_id\"))\n  @Column(name = \"command\")\n  private List<String> command;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"devfile_component_arg\",\n      joinColumns = @JoinColumn(name = \"devfile_component_id\"))\n  @Column(name = \"args\")\n  private List<String> args;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"devfile_component_id\")\n  private List<EntrypointImpl> entrypoints;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"devfile_component_id\")\n  private List<VolumeImpl> volumes;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"devfile_component_id\")\n  private List<EnvImpl> env;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"devfile_component_id\")\n  private List<EndpointImpl> endpoints;\n\n  public ComponentImpl() {}\n\n  public ComponentImpl(String type, String id) {\n    this.type = type;\n    this.componentId = id;\n  }\n\n  public ComponentImpl(String type, String id, Map<String, String> preferences) {\n    this.type = type;\n    this.componentId = id;\n    if (preferences != null) {\n      this.preferences = new HashMap<>(preferences);\n    }\n  }\n\n  public ComponentImpl(\n      String type,\n      String id,\n      String reference,\n      String referenceContent,\n      Map<String, String> selector,\n      List<? extends Entrypoint> entrypoints) {\n    this.type = type;\n    this.componentId = id;\n    this.reference = reference;\n    this.referenceContent = referenceContent;\n    if (selector != null) {\n      this.selector = new HashMap<>(selector);\n    }\n    if (entrypoints != null) {\n      this.entrypoints =\n          entrypoints.stream().map(EntrypointImpl::new).collect(toCollection(ArrayList::new));\n    }\n  }\n\n  public ComponentImpl(\n      String type,\n      String alias,\n      String id,\n      Map<String, Serializable> preferences,\n      String registryUrl,\n      String reference,\n      String referenceContent,\n      Map<String, String> selector,\n      List<? extends Entrypoint> entrypoints,\n      String image,\n      String memoryLimit,\n      String memoryRequest,\n      String cpuLimit,\n      String cpuRequest,\n      Boolean mountSources,\n      Boolean automountWorkspaceSecrets,\n      List<String> command,\n      List<String> args,\n      List<? extends Volume> volumes,\n      List<? extends Env> env,\n      List<? extends Endpoint> endpoints) {\n    this.alias = alias;\n    this.type = type;\n    this.componentId = id;\n    this.registryUrl = registryUrl;\n    if (preferences != null) {\n      this.preferences = new HashMap<>(preferences);\n    }\n    this.reference = reference;\n    this.referenceContent = referenceContent;\n    if (selector != null) {\n      this.selector = new HashMap<>(selector);\n    }\n    if (entrypoints != null) {\n      this.entrypoints =\n          entrypoints.stream().map(EntrypointImpl::new).collect(toCollection(ArrayList::new));\n    }\n    this.image = image;\n    this.memoryLimit = memoryLimit;\n    this.memoryRequest = memoryRequest;\n    this.cpuLimit = cpuLimit;\n    this.cpuRequest = cpuRequest;\n    this.mountSources = mountSources;\n    this.automountWorkspaceSecrets = automountWorkspaceSecrets;\n    this.command = command;\n    this.args = args;\n    if (volumes != null) {\n      this.volumes = volumes.stream().map(VolumeImpl::new).collect(toCollection(ArrayList::new));\n    }\n    if (env != null) {\n      this.env = env.stream().map(EnvImpl::new).collect(toCollection(ArrayList::new));\n    }\n    if (endpoints != null) {\n      this.endpoints =\n          endpoints.stream().map(EndpointImpl::new).collect(toCollection(ArrayList::new));\n    }\n  }\n\n  public ComponentImpl(Component component) {\n    this(\n        component.getType(),\n        component.getAlias(),\n        component.getId(),\n        component.getPreferences(),\n        component.getRegistryUrl(),\n        component.getReference(),\n        component.getReferenceContent(),\n        component.getSelector(),\n        component.getEntrypoints(),\n        component.getImage(),\n        component.getMemoryLimit(),\n        component.getMemoryRequest(),\n        component.getCpuLimit(),\n        component.getCpuRequest(),\n        component.getMountSources(),\n        component.getAutomountWorkspaceSecrets(),\n        component.getCommand(),\n        component.getArgs(),\n        component.getVolumes(),\n        component.getEnv(),\n        component.getEndpoints());\n  }\n\n  @Override\n  public String getAlias() {\n    return alias;\n  }\n\n  public void setAlias(String alias) {\n    this.alias = alias;\n  }\n\n  @Override\n  public String getType() {\n    return type;\n  }\n\n  public void setType(String type) {\n    this.type = type;\n  }\n\n  @Override\n  public String getId() {\n    return componentId;\n  }\n\n  public void setId(String id) {\n    this.componentId = id;\n  }\n\n  @Override\n  public String getRegistryUrl() {\n    return registryUrl;\n  }\n\n  public void setRegistryUrl(String registryUrl) {\n    this.registryUrl = registryUrl;\n  }\n\n  public Map<String, Serializable> getPreferences() {\n    if (preferences == null) {\n      preferences = new HashMap<>();\n    }\n    return preferences;\n  }\n\n  public void setPreferences(Map<String, Serializable> preferences) {\n    this.preferences = preferences;\n  }\n\n  @Override\n  public String getReference() {\n    return reference;\n  }\n\n  public void setReference(String reference) {\n    this.reference = reference;\n  }\n\n  @Override\n  public String getReferenceContent() {\n    return referenceContent;\n  }\n\n  public void setReferenceContent(String referenceContent) {\n    this.referenceContent = referenceContent;\n  }\n\n  @Override\n  public Map<String, String> getSelector() {\n    if (selector == null) {\n      selector = new HashMap<>();\n    }\n    return selector;\n  }\n\n  public void setSelector(Map<String, String> selector) {\n    this.selector = selector;\n  }\n\n  @Override\n  public List<EntrypointImpl> getEntrypoints() {\n    if (entrypoints == null) {\n      entrypoints = new ArrayList<>();\n    }\n    return entrypoints;\n  }\n\n  public void setEntrypoints(List<EntrypointImpl> entrypoints) {\n    this.entrypoints = entrypoints;\n  }\n\n  @Override\n  public String getImage() {\n    return image;\n  }\n\n  public void setImage(String image) {\n    this.image = image;\n  }\n\n  @Override\n  public String getMemoryLimit() {\n    return memoryLimit;\n  }\n\n  public void setMemoryLimit(String memoryLimit) {\n    this.memoryLimit = memoryLimit;\n  }\n\n  @Override\n  public String getMemoryRequest() {\n    return memoryRequest;\n  }\n\n  public void setMemoryRequest(String memoryRequest) {\n    this.memoryRequest = memoryRequest;\n  }\n\n  @Override\n  public String getCpuLimit() {\n    return cpuLimit;\n  }\n\n  public void setCpuLimit(String cpuLimit) {\n    this.cpuLimit = cpuLimit;\n  }\n\n  @Override\n  public String getCpuRequest() {\n    return cpuRequest;\n  }\n\n  public void setCpuRequest(String cpuRequest) {\n    this.cpuRequest = cpuRequest;\n  }\n\n  @Override\n  public Boolean getMountSources() {\n    return mountSources;\n  }\n\n  public void setMountSources(Boolean mountSources) {\n    this.mountSources = mountSources;\n  }\n\n  @Override\n  public Boolean getAutomountWorkspaceSecrets() {\n    return automountWorkspaceSecrets;\n  }\n\n  public void setAutomountWorkspaceSecrets(Boolean automountWorkspaceSecrets) {\n    this.automountWorkspaceSecrets = automountWorkspaceSecrets;\n  }\n\n  @Override\n  public List<String> getCommand() {\n    if (command == null) {\n      command = new ArrayList<>();\n    }\n    return command;\n  }\n\n  public void setCommand(List<String> command) {\n    this.command = command;\n  }\n\n  @Override\n  public List<String> getArgs() {\n    if (args == null) {\n      args = new ArrayList<>();\n    }\n    return args;\n  }\n\n  public void setArgs(List<String> args) {\n    this.args = args;\n  }\n\n  @Override\n  public List<VolumeImpl> getVolumes() {\n    if (volumes == null) {\n      volumes = new ArrayList<>();\n    }\n    return volumes;\n  }\n\n  public void setVolumes(List<VolumeImpl> volumes) {\n    this.volumes = volumes;\n  }\n\n  @Override\n  public List<EnvImpl> getEnv() {\n    if (env == null) {\n      env = new ArrayList<>();\n    }\n    return env;\n  }\n\n  public void setEnv(List<EnvImpl> env) {\n    this.env = env;\n  }\n\n  @Override\n  public List<EndpointImpl> getEndpoints() {\n    if (endpoints == null) {\n      endpoints = new ArrayList<>();\n    }\n    return endpoints;\n  }\n\n  public void setEndpoints(List<EndpointImpl> endpoints) {\n    this.endpoints = endpoints;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof ComponentImpl)) {\n      return false;\n    }\n    ComponentImpl component = (ComponentImpl) o;\n    return Objects.equals(getMountSources(), component.getMountSources())\n        && Objects.equals(getAutomountWorkspaceSecrets(), component.getAutomountWorkspaceSecrets())\n        && Objects.equals(generatedId, component.generatedId)\n        && Objects.equals(alias, component.alias)\n        && Objects.equals(type, component.type)\n        && Objects.equals(componentId, component.componentId)\n        && Objects.equals(registryUrl, component.registryUrl)\n        && Objects.equals(reference, component.reference)\n        && Objects.equals(referenceContent, component.referenceContent)\n        && Objects.equals(image, component.image)\n        && Objects.equals(memoryLimit, component.memoryLimit)\n        && Objects.equals(getPreferences(), component.getPreferences())\n        && Objects.equals(getSelector(), component.getSelector())\n        && Objects.equals(getEntrypoints(), component.getEntrypoints())\n        && Objects.equals(getCommand(), component.getCommand())\n        && Objects.equals(getArgs(), component.getArgs())\n        && Objects.equals(getVolumes(), component.getVolumes())\n        && Objects.equals(getEnv(), component.getEnv())\n        && Objects.equals(getEndpoints(), component.getEndpoints());\n  }\n\n  @Override\n  public int hashCode() {\n\n    return Objects.hash(\n        generatedId,\n        alias,\n        type,\n        componentId,\n        registryUrl,\n        reference,\n        referenceContent,\n        image,\n        memoryLimit,\n        getPreferences(),\n        getSelector(),\n        getEntrypoints(),\n        getMountSources(),\n        getAutomountWorkspaceSecrets(),\n        getCommand(),\n        getArgs(),\n        getVolumes(),\n        getEnv(),\n        getEndpoints());\n  }\n\n  @Override\n  public String toString() {\n    return \"ComponentImpl{\"\n        + \"id='\"\n        + componentId\n        + '\\''\n        + \", alias='\"\n        + alias\n        + '\\''\n        + \", type='\"\n        + type\n        + '\\''\n        + \", preferences=\"\n        + preferences\n        + \", registryUrl='\"\n        + registryUrl\n        + '\\''\n        + \", reference='\"\n        + reference\n        + '\\''\n        + \", referenceContent='\"\n        + referenceContent\n        + '\\''\n        + \", selector=\"\n        + selector\n        + \", entrypoints=\"\n        + entrypoints\n        + \", image='\"\n        + image\n        + '\\''\n        + \", memoryLimit='\"\n        + memoryLimit\n        + '\\''\n        + \", mountSources=\"\n        + mountSources\n        + \", automountWorkspaceSecrets=\"\n        + automountWorkspaceSecrets\n        + \", command=\"\n        + command\n        + \", args=\"\n        + args\n        + \", volumes=\"\n        + volumes\n        + \", env=\"\n        + env\n        + \", endpoints=\"\n        + endpoints\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/devfile/DevfileImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl.devfile;\n\nimport static java.util.stream.Collectors.toCollection;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.persistence.CascadeType;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Embedded;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.devfile.Command;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.api.core.model.workspace.devfile.Devfile;\nimport org.eclipse.che.api.core.model.workspace.devfile.Metadata;\nimport org.eclipse.che.api.core.model.workspace.devfile.Project;\n\n/**\n * @author Sergii Leshchenko\n */\n@Entity(name = \"Devfile\")\n@Table(name = \"devfile\")\npublic class DevfileImpl implements Devfile {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"api_version\", nullable = false)\n  private String apiVersion;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"devfile_id\")\n  private List<ProjectImpl> projects;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"devfile_id\")\n  private List<ComponentImpl> components;\n\n  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)\n  @JoinColumn(name = \"devfile_id\")\n  private List<CommandImpl> commands;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(name = \"devfile_attributes\", joinColumns = @JoinColumn(name = \"devfile_id\"))\n  @MapKeyColumn(name = \"name\")\n  @Column(name = \"value_param\", columnDefinition = \"TEXT\")\n  private Map<String, String> attributes;\n\n  @Embedded private MetadataImpl metadata;\n\n  public DevfileImpl() {}\n\n  public DevfileImpl(\n      String apiVersion,\n      List<? extends Project> projects,\n      List<? extends Component> components,\n      List<? extends Command> commands,\n      Map<String, String> attributes,\n      Metadata metadata) {\n    this.apiVersion = apiVersion;\n    if (projects != null) {\n      this.projects = projects.stream().map(ProjectImpl::new).collect(toCollection(ArrayList::new));\n    }\n    if (components != null) {\n      this.components =\n          components.stream().map(ComponentImpl::new).collect(toCollection(ArrayList::new));\n    }\n    if (commands != null) {\n      this.commands = commands.stream().map(CommandImpl::new).collect(toCollection(ArrayList::new));\n    }\n    if (attributes != null) {\n      this.attributes = new HashMap<>(attributes);\n    }\n\n    if (metadata != null) {\n      this.metadata = new MetadataImpl(metadata);\n    }\n  }\n\n  public DevfileImpl(Devfile devfile) {\n    this(\n        devfile.getApiVersion(),\n        devfile.getProjects(),\n        devfile.getComponents(),\n        devfile.getCommands(),\n        devfile.getAttributes(),\n        devfile.getMetadata());\n  }\n\n  @Override\n  public String getApiVersion() {\n    return apiVersion;\n  }\n\n  public void setApiVersion(String apiVersion) {\n    this.apiVersion = apiVersion;\n  }\n\n  public void setName(String name) {\n    getMetadata().setName(name);\n  }\n\n  @Override\n  public List<ProjectImpl> getProjects() {\n    if (projects == null) {\n      projects = new ArrayList<>();\n    }\n    return projects;\n  }\n\n  public void setProjects(List<ProjectImpl> projects) {\n    this.projects = projects;\n  }\n\n  @Override\n  public List<ComponentImpl> getComponents() {\n    if (components == null) {\n      components = new ArrayList<>();\n    }\n    return components;\n  }\n\n  public void setComponents(List<ComponentImpl> components) {\n    this.components = components;\n  }\n\n  @Override\n  public List<CommandImpl> getCommands() {\n    if (commands == null) {\n      commands = new ArrayList<>();\n    }\n    return commands;\n  }\n\n  public void setCommands(List<CommandImpl> commands) {\n    this.commands = commands;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n  }\n\n  @Override\n  public MetadataImpl getMetadata() {\n    if (metadata == null) {\n      metadata = new MetadataImpl();\n    }\n    return metadata;\n  }\n\n  public void setMetadata(MetadataImpl metadata) {\n    this.metadata = metadata;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof DevfileImpl)) {\n      return false;\n    }\n    DevfileImpl devfile = (DevfileImpl) o;\n    return Objects.equals(id, devfile.id)\n        && Objects.equals(apiVersion, devfile.apiVersion)\n        && Objects.equals(getProjects(), devfile.getProjects())\n        && Objects.equals(getComponents(), devfile.getComponents())\n        && Objects.equals(getCommands(), devfile.getCommands())\n        && Objects.equals(getAttributes(), devfile.getAttributes())\n        && Objects.equals(getMetadata(), devfile.getMetadata());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(\n        id,\n        apiVersion,\n        getProjects(),\n        getComponents(),\n        getCommands(),\n        getAttributes(),\n        getMetadata());\n  }\n\n  @Override\n  public String toString() {\n    return \"DevfileImpl{\"\n        + \"id='\"\n        + id\n        + '\\''\n        + \", apiVersion='\"\n        + apiVersion\n        + '\\''\n        + \", projects=\"\n        + projects\n        + \", components=\"\n        + components\n        + \", commands=\"\n        + commands\n        + \", attributes=\"\n        + attributes\n        + \", metadata=\"\n        + metadata\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/devfile/EndpointImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl.devfile;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.devfile.Endpoint;\n\n/**\n * @author Sergii Leshchenko\n */\n@Entity(name = \"DevfileEndpoint\")\n@Table(name = \"devfile_endpoint\")\npublic class EndpointImpl implements Endpoint {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"name\", nullable = false)\n  private String name;\n\n  @Column(name = \"port\", nullable = false)\n  private Integer port;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"devfile_endpoint_attributes\",\n      joinColumns = @JoinColumn(name = \"devfile_endpoint_id\"))\n  @MapKeyColumn(name = \"name\")\n  @Column(name = \"value_param\", columnDefinition = \"TEXT\")\n  private Map<String, String> attributes;\n\n  public EndpointImpl() {}\n\n  public EndpointImpl(String name, Integer port, Map<String, String> attributes) {\n    this.name = name;\n    this.port = port;\n    this.attributes = attributes;\n  }\n\n  public EndpointImpl(Endpoint endpoint) {\n    this(endpoint.getName(), endpoint.getPort(), endpoint.getAttributes());\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public Integer getPort() {\n    return port;\n  }\n\n  public void setPort(Integer port) {\n    this.port = port;\n  }\n\n  @Override\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof EndpointImpl)) {\n      return false;\n    }\n    EndpointImpl endpoint = (EndpointImpl) o;\n    return Objects.equals(id, endpoint.id)\n        && Objects.equals(name, endpoint.name)\n        && Objects.equals(port, endpoint.port)\n        && Objects.equals(getAttributes(), endpoint.getAttributes());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, name, port, getAttributes());\n  }\n\n  @Override\n  public String toString() {\n    return \"EndpointImpl{\"\n        + \"id='\"\n        + id\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", port=\"\n        + port\n        + \", attributes=\"\n        + attributes\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/devfile/EntrypointImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl.devfile;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.persistence.CollectionTable;\nimport javax.persistence.Column;\nimport javax.persistence.ElementCollection;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.MapKeyColumn;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.devfile.Entrypoint;\n\n/**\n * @author Sergii Leshchenko\n */\n@Entity(name = \"DevfileEntrypoint\")\n@Table(name = \"devfile_entrypoint\")\npublic class EntrypointImpl implements Entrypoint {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"parent_name\", nullable = false)\n  private String parentName;\n\n  @Column(name = \"container_name\", nullable = false)\n  private String containerName;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"devfile_entrypoint_commands\",\n      joinColumns = @JoinColumn(name = \"devfile_entrypoint_id\"))\n  @Column(name = \"command\")\n  private List<String> command;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"devfile_entrypoint_arg\",\n      joinColumns = @JoinColumn(name = \"devfile_entrypoint_id\"))\n  @Column(name = \"arg\")\n  private List<String> args;\n\n  @ElementCollection(fetch = FetchType.EAGER)\n  @CollectionTable(\n      name = \"devfile_entrypoint_selector\",\n      joinColumns = @JoinColumn(name = \"devfile_entrypoint_id\"))\n  @MapKeyColumn(name = \"selector_key\")\n  @Column(name = \"selector\")\n  private Map<String, String> parentSelector;\n\n  public EntrypointImpl() {}\n\n  public EntrypointImpl(\n      String parentName,\n      Map<String, String> parentSelector,\n      String containerName,\n      List<String> command,\n      List<String> args) {\n    this.parentName = parentName;\n    this.parentSelector = parentSelector;\n    this.containerName = containerName;\n    this.command = command;\n    this.args = args;\n  }\n\n  public EntrypointImpl(Entrypoint entrypoint) {\n    this(\n        entrypoint.getParentName(),\n        entrypoint.getParentSelector(),\n        entrypoint.getContainerName(),\n        entrypoint.getCommand(),\n        entrypoint.getArgs());\n  }\n\n  @Override\n  public String getParentName() {\n    return parentName;\n  }\n\n  public void setParentName(String parentName) {\n    this.parentName = parentName;\n  }\n\n  @Override\n  public Map<String, String> getParentSelector() {\n    if (parentSelector == null) {\n      parentSelector = new HashMap<>();\n    }\n    return parentSelector;\n  }\n\n  public void setParentSelector(Map<String, String> parentSelector) {\n    this.parentSelector = parentSelector;\n  }\n\n  @Override\n  public String getContainerName() {\n    return containerName;\n  }\n\n  public void setContainerName(String containerName) {\n    this.containerName = containerName;\n  }\n\n  @Override\n  public List<String> getCommand() {\n    if (command == null) {\n      command = new ArrayList<>();\n    }\n    return command;\n  }\n\n  public void setCommand(List<String> command) {\n    this.command = command;\n  }\n\n  @Override\n  public List<String> getArgs() {\n    if (args == null) {\n      args = new ArrayList<>();\n    }\n    return args;\n  }\n\n  public void setArgs(List<String> args) {\n    this.args = args;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof EntrypointImpl)) {\n      return false;\n    }\n    EntrypointImpl that = (EntrypointImpl) o;\n    return Objects.equals(parentName, that.parentName)\n        && Objects.equals(containerName, that.containerName)\n        && Objects.equals(getParentSelector(), that.getParentSelector())\n        && Objects.equals(getCommand(), that.getCommand())\n        && Objects.equals(getArgs(), that.getArgs());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(\n        id, parentName, getParentSelector(), getContainerName(), getCommand(), getArgs());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/devfile/EnvImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl.devfile;\n\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.devfile.Env;\n\n/**\n * @author Sergii Leshchenko\n */\n@Entity(name = \"DevfileEnv\")\n@Table(name = \"devfile_env\")\npublic class EnvImpl implements Env {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"name\", nullable = false)\n  private String name;\n\n  @Column(name = \"value_param\", nullable = false)\n  private String value;\n\n  public EnvImpl() {}\n\n  public EnvImpl(String name, String value) {\n    this.name = name;\n    this.value = value;\n  }\n\n  public EnvImpl(Env env) {\n    this(env.getName(), env.getValue());\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public String getValue() {\n    return value;\n  }\n\n  public void setValue(String value) {\n    this.value = value;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof EnvImpl)) {\n      return false;\n    }\n    EnvImpl env = (EnvImpl) o;\n    return Objects.equals(id, env.id)\n        && Objects.equals(name, env.name)\n        && Objects.equals(value, env.value);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, name, value);\n  }\n\n  @Override\n  public String toString() {\n    return \"EnvImpl{\"\n        + \"id='\"\n        + id\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", value='\"\n        + value\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/devfile/MetadataImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl.devfile;\n\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Embeddable;\nimport javax.persistence.Transient;\nimport org.eclipse.che.api.core.model.workspace.devfile.Metadata;\n\n@Embeddable\npublic class MetadataImpl implements Metadata {\n\n  @Column(name = \"meta_name\")\n  private String name;\n\n  /**\n   * generateName is used just at workspace create time, when name is generated from it and stored\n   * into {@link MetadataImpl#name}, thus it's not needed to persist\n   */\n  @Transient private String generateName;\n\n  public MetadataImpl() {}\n\n  public MetadataImpl(String name) {\n    this.name = name;\n  }\n\n  public MetadataImpl(String name, String generateName) {\n    this.name = name;\n    this.generateName = generateName;\n  }\n\n  public MetadataImpl(Metadata metadata) {\n    this.name = metadata.getName();\n    this.generateName = metadata.getGenerateName();\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public String getGenerateName() {\n    return generateName;\n  }\n\n  public void setGenerateName(String generateName) {\n    this.generateName = generateName;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    MetadataImpl metadata = (MetadataImpl) o;\n    return Objects.equals(name, metadata.name)\n        && Objects.equals(generateName, metadata.generateName);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(name, generateName);\n  }\n\n  @Override\n  public String toString() {\n    return \"MetadataImpl{\"\n        + \"name='\"\n        + name\n        + '\\''\n        + \", generateName='\"\n        + generateName\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/devfile/PreviewUrlImpl.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl.devfile;\n\nimport java.util.Objects;\nimport java.util.StringJoiner;\nimport javax.persistence.Column;\nimport javax.persistence.Embeddable;\nimport org.eclipse.che.api.core.model.workspace.devfile.PreviewUrl;\n\n@Embeddable\npublic class PreviewUrlImpl implements PreviewUrl {\n\n  @Column(name = \"preview_url_port\")\n  private int port;\n\n  @Column(name = \"preview_url_path\")\n  private String path;\n\n  public PreviewUrlImpl() {}\n\n  public PreviewUrlImpl(PreviewUrl previewUrl) {\n    this(previewUrl.getPort(), previewUrl.getPath());\n  }\n\n  public PreviewUrlImpl(int port, String path) {\n    this.port = port;\n    this.path = path;\n  }\n\n  @Override\n  public int getPort() {\n    return port;\n  }\n\n  @Override\n  public String getPath() {\n    return path;\n  }\n\n  @Override\n  public String toString() {\n    return new StringJoiner(\", \", PreviewUrlImpl.class.getSimpleName() + \"[\", \"]\")\n        .add(\"port=\" + port)\n        .add(\"path='\" + path + \"'\")\n        .toString();\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    PreviewUrlImpl that = (PreviewUrlImpl) o;\n    return port == that.port && Objects.equals(path, that.path);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(port, path);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/devfile/ProjectImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl.devfile;\n\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Embedded;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.devfile.Project;\nimport org.eclipse.che.api.core.model.workspace.devfile.Source;\n\n/**\n * @author Sergii Leshchenko\n */\n@Entity(name = \"DevfileProject\")\n@Table(name = \"devfile_project\")\npublic class ProjectImpl implements Project {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"name\", nullable = false)\n  private String name;\n\n  @Embedded private SourceImpl source;\n\n  @Column(name = \"clone_path\", nullable = false)\n  private String clonePath;\n\n  public ProjectImpl() {}\n\n  public ProjectImpl(String name, Source source, String clonePath) {\n    this.name = name;\n    if (source != null) {\n      this.source = new SourceImpl(source);\n    }\n    this.clonePath = clonePath;\n  }\n\n  public ProjectImpl(Project project) {\n    this(project.getName(), project.getSource(), project.getClonePath());\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public SourceImpl getSource() {\n    return source;\n  }\n\n  public void setSource(SourceImpl source) {\n    this.source = source;\n  }\n\n  @Override\n  public String getClonePath() {\n    return clonePath;\n  }\n\n  public void setClonePath(String clonePath) {\n    this.clonePath = clonePath;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof ProjectImpl)) {\n      return false;\n    }\n    ProjectImpl project = (ProjectImpl) o;\n    return Objects.equals(id, project.id)\n        && Objects.equals(name, project.name)\n        && Objects.equals(source, project.source)\n        && Objects.equals(clonePath, project.clonePath);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, name, source, clonePath);\n  }\n\n  @Override\n  public String toString() {\n    return \"ProjectImpl{\"\n        + \"id='\"\n        + id\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", source=\"\n        + source\n        + \", clonePath='\"\n        + clonePath\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/devfile/SourceImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl.devfile;\n\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Embeddable;\nimport org.eclipse.che.api.core.model.workspace.devfile.Source;\n\n/**\n * @author Sergii Leshchenko\n */\n@Embeddable\npublic class SourceImpl implements Source {\n\n  @Column(name = \"type\", nullable = false)\n  private String type;\n\n  @Column(name = \"location\", nullable = false)\n  private String location;\n\n  @Column(name = \"branch\")\n  private String branch;\n\n  @Column(name = \"start_point\")\n  private String startPoint;\n\n  @Column(name = \"tag\")\n  private String tag;\n\n  @Column(name = \"commit_id\")\n  private String commitId;\n\n  @Column(name = \"sparse_checkout_dir\")\n  private String sparseCheckoutDir;\n\n  public SourceImpl() {}\n\n  public SourceImpl(\n      String type,\n      String location,\n      String branch,\n      String startPoint,\n      String tag,\n      String commitId,\n      String sparseCheckoutDir) {\n    this.type = type;\n    this.location = location;\n    this.branch = branch;\n    this.startPoint = startPoint;\n    this.tag = tag;\n    this.commitId = commitId;\n    this.sparseCheckoutDir = sparseCheckoutDir;\n  }\n\n  public SourceImpl(Source source) {\n    this(\n        source.getType(),\n        source.getLocation(),\n        source.getBranch(),\n        source.getStartPoint(),\n        source.getTag(),\n        source.getCommitId(),\n        source.getSparseCheckoutDir());\n  }\n\n  @Override\n  public String getType() {\n    return type;\n  }\n\n  public void setType(String type) {\n    this.type = type;\n  }\n\n  @Override\n  public String getLocation() {\n    return location;\n  }\n\n  public void setLocation(String location) {\n    this.location = location;\n  }\n\n  @Override\n  public String getBranch() {\n    return branch;\n  }\n\n  public void setBranch(String branch) {\n    this.branch = branch;\n  }\n\n  @Override\n  public String getStartPoint() {\n    return startPoint;\n  }\n\n  public void setStartPoint(String startPoint) {\n    this.startPoint = startPoint;\n  }\n\n  @Override\n  public String getTag() {\n    return tag;\n  }\n\n  public void setTag(String tag) {\n    this.tag = tag;\n  }\n\n  @Override\n  public String getCommitId() {\n    return commitId;\n  }\n\n  public void setCommitId(String commitId) {\n    this.commitId = commitId;\n  }\n\n  @Override\n  public String getSparseCheckoutDir() {\n    return sparseCheckoutDir;\n  }\n\n  public void setSparseCheckoutDir(String sparseCheckoutDir) {\n    this.sparseCheckoutDir = sparseCheckoutDir;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof SourceImpl)) {\n      return false;\n    }\n    SourceImpl source = (SourceImpl) o;\n    return Objects.equals(type, source.type)\n        && Objects.equals(location, source.location)\n        && Objects.equals(branch, source.branch)\n        && Objects.equals(startPoint, source.startPoint)\n        && Objects.equals(tag, source.tag)\n        && Objects.equals(commitId, source.commitId)\n        && Objects.equals(sparseCheckoutDir, source.sparseCheckoutDir);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(type, location, branch, startPoint, tag, commitId, sparseCheckoutDir);\n  }\n\n  @Override\n  public String toString() {\n    return \"SourceImpl{\"\n        + \"type='\"\n        + type\n        + '\\''\n        + \", location='\"\n        + location\n        + '\\''\n        + \", branch='\"\n        + branch\n        + '\\''\n        + \", startPoint='\"\n        + startPoint\n        + '\\''\n        + \", tag='\"\n        + tag\n        + '\\''\n        + \", commitId='\"\n        + commitId\n        + '\\''\n        + \", sparseCheckoutDir='\"\n        + sparseCheckoutDir\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/devfile/VolumeImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl.devfile;\n\nimport java.util.Objects;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\nimport org.eclipse.che.api.core.model.workspace.devfile.Volume;\n\n/**\n * @author Sergii Leshchenko\n */\n@Entity(name = \"DevfileVolume\")\n@Table(name = \"devfile_volume\")\npublic class VolumeImpl implements Volume {\n\n  @Id\n  @GeneratedValue\n  @Column(name = \"id\")\n  private Long id;\n\n  @Column(name = \"name\", nullable = false)\n  private String name;\n\n  @Column(name = \"container_path\", nullable = false)\n  private String containerPath;\n\n  public VolumeImpl() {}\n\n  public VolumeImpl(String name, String containerPath) {\n    this.name = name;\n    this.containerPath = containerPath;\n  }\n\n  public VolumeImpl(Volume volume) {\n    this(volume.getName(), volume.getContainerPath());\n  }\n\n  @Override\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  @Override\n  public String getContainerPath() {\n    return containerPath;\n  }\n\n  public void setContainerPath(String containerPath) {\n    this.containerPath = containerPath;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof VolumeImpl)) {\n      return false;\n    }\n    VolumeImpl volume = (VolumeImpl) o;\n    return Objects.equals(id, volume.id)\n        && Objects.equals(name, volume.name)\n        && Objects.equals(containerPath, volume.containerPath);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(id, name, containerPath);\n  }\n\n  @Override\n  public String toString() {\n    return \"VolumeImpl{\"\n        + \"id='\"\n        + id\n        + '\\''\n        + \", name='\"\n        + name\n        + '\\''\n        + \", containerPath='\"\n        + containerPath\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/InfrastructureException.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi;\n\n/**\n * An exception thrown by RuntimeInfrastructure and related components. Indicates that an\n * infrastructure operation can't be performed or an error occurred during operation execution.\n *\n * @author Yevhenii Voevodin\n */\npublic class InfrastructureException extends Exception {\n\n  public InfrastructureException(String message) {\n    super(message);\n  }\n\n  public InfrastructureException(Exception e) {\n    super(e);\n  }\n\n  public InfrastructureException(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/InternalInfrastructureException.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi;\n\n/**\n * Thrown by RuntimeInfrastructure and related components when unexpected internal error occurs.\n *\n * @author Yevhenii Voevodin\n */\npublic class InternalInfrastructureException extends InfrastructureException {\n\n  public InternalInfrastructureException(String message) {\n    super(message);\n  }\n\n  public InternalInfrastructureException(String message, Throwable cause) {\n    super(message, cause);\n  }\n\n  public InternalInfrastructureException(Exception e) {\n    super(e);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/NamespaceResolutionContext.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi;\n\nimport java.util.Objects;\nimport org.eclipse.che.commons.subject.Subject;\n\n/**\n * Holds information needed for resolving placeholders in the namespace name. The {@code\n * persistAfterCreate} attribute indicates whether namespace name should be persisted after\n * resolution (if the infrastructure supports it).\n *\n * @author Lukas Krejci\n * @author Sergii Leshchenko\n */\npublic class NamespaceResolutionContext {\n  private final String workspaceId;\n  private final String userId;\n  private final String userName;\n\n  public NamespaceResolutionContext(Subject subject) {\n    this(null, subject.getUserId(), subject.getUserName());\n  }\n\n  public NamespaceResolutionContext(String workspaceId, String userId, String userName) {\n    this.workspaceId = workspaceId;\n    this.userId = userId;\n    this.userName = userName;\n  }\n\n  public String getWorkspaceId() {\n    return workspaceId;\n  }\n\n  public String getUserId() {\n    return userId;\n  }\n\n  public String getUserName() {\n    return userName;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof NamespaceResolutionContext)) {\n      return false;\n    }\n    final NamespaceResolutionContext that = (NamespaceResolutionContext) obj;\n    return Objects.equals(workspaceId, that.workspaceId)\n        && Objects.equals(userId, that.userId)\n        && Objects.equals(userName, that.userName);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(workspaceId, userId, userName);\n  }\n\n  @Override\n  public String toString() {\n    return \"NamespaceResolutionContext{\"\n        + \"workspaceId='\"\n        + workspaceId\n        + '\\''\n        + \", userId='\"\n        + userId\n        + '\\''\n        + \", userName='\"\n        + userName\n        + '\\''\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/RuntimeStartInterruptedException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi;\n\nimport static java.lang.String.format;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\n\n/**\n * Thrown when start of the runtime is interrupted.\n *\n * @author Anton Korneta\n */\npublic class RuntimeStartInterruptedException extends InfrastructureException {\n\n  public RuntimeStartInterruptedException(RuntimeIdentity identity) {\n    super(\n        format(\n            \"Runtime start for identity 'workspace: %s, environment: %s, ownerId: %s' is interrupted\",\n            identity.getWorkspaceId(), identity.getEnvName(), identity.getOwnerId()));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/StateException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi;\n\n/**\n * Thrown by {@link RuntimeContext} and related components. Indicates that an operation cannot be\n * performed due to context state violation(e.g. workspace cannot be stopped while it is starting).\n *\n * @author Yevhenii Voevodin\n */\npublic class StateException extends InfrastructureException {\n  public StateException(String message) {\n    super(message);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/WorkspaceDao.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi;\n\nimport java.util.Optional;\nimport org.eclipse.che.api.core.ConflictException;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.Page;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl;\n\n/**\n * Defines data access object contract for {@link WorkspaceImpl}.\n *\n * @author Eugene Voevodin\n */\npublic interface WorkspaceDao {\n\n  /**\n   * Creates workspace.\n   *\n   * @param workspace workspace to create\n   * @return created workspace\n   * @throws NullPointerException when {@code workspace} is null\n   * @throws ConflictException when workspace with given name already exists for given namespace\n   * @throws ServerException when any other error occurs during workspace creation\n   */\n  WorkspaceImpl create(WorkspaceImpl workspace) throws ConflictException, ServerException;\n\n  /**\n   * Updates workspace with new entity, actually replaces(not merges) existing workspaces.\n   *\n   * <p>Workspace will be fully updated(replaced), all data which was present before update will not\n   * be accessible with {@link WorkspaceDao this} class anymore. Expected update usage:\n   *\n   * <pre>\n   *     UsersWorkspaceImpl workspace = workspaceDao.get(\"workspace123\");\n   *     ...\n   *     workspace.setName(\"new-workspace-name\");\n   *     ...\n   *     workspaceDao.update(workspace);\n   * </pre>\n   *\n   * @param update workspace update\n   * @return updated workspace\n   * @throws NullPointerException when {@code update} is null\n   * @throws NotFoundException when workspace with given {@link WorkspaceImpl#getId() identifier}\n   *     was not found\n   * @throws ConflictException when workspace with given name already exists in given namespace\n   * @throws ServerException when any other error occurs during workspace updating\n   */\n  WorkspaceImpl update(WorkspaceImpl update)\n      throws NotFoundException, ConflictException, ServerException;\n\n  /**\n   * Removes workspace.\n   *\n   * <p>It is up to implementation to do cascade removing of related to workspace data or to forbid\n   * remove operation at all\n   *\n   * <p>Doesn't throw an exception when workspace with given {@code id} does not exist\n   *\n   * @param id workspace identifier\n   * @return removed workspace\n   * @throws NullPointerException when {@code id} is null\n   * @throws ServerException when any other error occurs during workspace removing\n   */\n  Optional<WorkspaceImpl> remove(String id) throws ServerException;\n\n  /**\n   * Gets workspace by identifier.\n   *\n   * @param id workspace identifier\n   * @return workspace instance, never null\n   * @throws NullPointerException when {@code id} is null\n   * @throws NotFoundException when workspace with given {@code id} was not found\n   * @throws ServerException when any other error occurs during workspace fetching\n   */\n  WorkspaceImpl get(String id) throws NotFoundException, ServerException;\n\n  /**\n   * Gets workspace by name in namespace.\n   *\n   * @param namespace namespace of workspace\n   * @param name workspace identifier\n   * @return workspace instance, never null\n   * @throws NullPointerException when {@code name} or {@code owner} is null\n   * @throws NotFoundException when workspace with given name & owner was not found\n   * @throws ServerException when any other error occurs during workspace fetching\n   */\n  WorkspaceImpl get(String name, String namespace) throws NotFoundException, ServerException;\n\n  /**\n   * Gets list of workspaces in given namespace.\n   *\n   * @param namespace workspace namespace\n   * @return list of workspaces in given namespace. Always returns list(even when there are no\n   *     workspace in given namespace), never null\n   * @throws NullPointerException when {@code owner} is null\n   * @throws ServerException when any other error occurs during workspaces fetching\n   */\n  Page<WorkspaceImpl> getByNamespace(String namespace, int maxItems, long skipCount)\n      throws ServerException;\n\n  /**\n   * Gets list of workspaces which user can read\n   *\n   * @param userId id of user\n   * @return list of workspaces which user can read\n   * @throws ServerException when any other error occurs during workspaces fetching\n   */\n  Page<WorkspaceImpl> getWorkspaces(String userId, int maxItems, long skipCount)\n      throws ServerException;\n\n  /**\n   * Gets workspaces by temporary attribute.\n   *\n   * @param isTemporary When {@code true}, only temporary workspaces should be retrieved. When\n   *     {@code false}, only non-temporary workspaces should be retrieved.\n   * @param skipCount the number of workspaces to skip\n   * @param maxItems the maximum number of workspaces to return\n   * @return list of workspaces or empty list if no workspaces were found\n   * @throws ServerException when any other error occurs during workspaces fetching\n   * @throws IllegalArgumentException when {@code maxItems} or {@code skipCount} is negative\n   */\n  Page<WorkspaceImpl> getWorkspaces(boolean isTemporary, int maxItems, long skipCount)\n      throws ServerException;\n\n  /**\n   * Get the count of all workspaces from the persistent layer.\n   *\n   * @return workspace count\n   * @throws ServerException when any error occurs\n   */\n  long getWorkspacesTotalCount() throws ServerException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/environment/InternalEnvironment.java",
    "content": "/*\n * Copyright (c) 2012-2026 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.environment;\n\nimport com.google.common.annotations.Beta;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.CopyOnWriteArrayList;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceConfig;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.core.model.workspace.config.Environment;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Representation of {@link Environment} which holds internal representations of environment\n * components to ease implementation of RuntimeInfrastructure.\n *\n * <p>It is related but not really bound to some specific infrastructure. It lets an infrastructure\n * apply multiple different implementations, some of which can be considered as a \"native format\",\n * while others as rather \"supported, adopted formats\".\n *\n * @author Alexander Garagatyi\n * @author gazarenkov\n */\npublic abstract class InternalEnvironment {\n  private String type;\n  private InternalRecipe recipe;\n  private Map<String, InternalMachineConfig> machines;\n  private final List<Warning> warnings;\n  private Map<String, String> attributes;\n  private List<CommandImpl> commands;\n  private DevfileImpl devfile;\n\n  protected InternalEnvironment() {\n    this.warnings = new CopyOnWriteArrayList<>();\n  }\n\n  protected InternalEnvironment(\n      InternalRecipe recipe, Map<String, InternalMachineConfig> machines, List<Warning> warnings) {\n    this.recipe = recipe;\n    this.machines = machines;\n    this.warnings = new CopyOnWriteArrayList<>();\n    if (warnings != null) {\n      this.warnings.addAll(warnings);\n    }\n    this.type = recipe != null ? recipe.getType() : null;\n  }\n\n  protected InternalEnvironment(InternalEnvironment internalEnvironment) {\n    this.recipe = internalEnvironment.getRecipe();\n    this.type = recipe != null ? recipe.getType() : null;\n    this.machines = internalEnvironment.getMachines();\n    this.warnings = new CopyOnWriteArrayList<>(internalEnvironment.getWarnings());\n    this.attributes = internalEnvironment.getAttributes();\n    this.commands = internalEnvironment.getCommands();\n    this.devfile = internalEnvironment.getDevfile();\n  }\n\n  /**\n   * Returns internal environment type - an identifier of the type of the environment.\n   *\n   * <p>It can differ from the type of {@link InternalRecipe#getType()} in certain cases. An example\n   * of such a case is converting of an environment from one type to another for the purposes of an\n   * infrastructure. In this case, {@link InternalRecipe#getType()} shows an origin type of the\n   * environment whereas this method might return the type of the environment after the conversion.\n   */\n  @Nullable\n  public String getType() {\n    return type;\n  }\n\n  public InternalEnvironment setType(String type) {\n    this.type = type;\n    return this;\n  }\n\n  /** Returns environment recipe which includes recipe content. */\n  @Nullable\n  public InternalRecipe getRecipe() {\n    return recipe;\n  }\n\n  public InternalEnvironment setRecipe(InternalRecipe recipe) {\n    this.recipe = recipe;\n    return this;\n  }\n\n  /**\n   * Returns unmodifiable map of internal machines configs which include all information about\n   * machine configuration which may be needed by infrastructure implementation.\n   */\n  public Map<String, InternalMachineConfig> getMachines() {\n    if (machines == null) {\n      machines = new HashMap<>();\n    }\n    return machines;\n  }\n\n  public InternalEnvironment setMachines(Map<String, InternalMachineConfig> machines) {\n    this.machines = machines;\n    return this;\n  }\n\n  /**\n   * Returns the list of the warnings indicating that the environment violates some non-critical\n   * constraints or some preferable configuration is missing so defaults are used.\n   */\n  public List<Warning> getWarnings() {\n    return warnings;\n  }\n\n  /** Adds an {@link Warning}. */\n  public void addWarning(Warning warning) {\n    warnings.add(warning);\n  }\n\n  public InternalEnvironment setWarnings(List<Warning> warnings) {\n    this.warnings.clear();\n    if (warnings != null) {\n      this.warnings.addAll(warnings);\n    }\n    return this;\n  }\n\n  /**\n   * Note that this field is in Beta and is subject to be removed at any point of time without any\n   * notification.\n   *\n   * <p>Returns map of workspace config attributes that can be used for workspace runtime creation.\n   *\n   * @see WorkspaceConfig#getAttributes()\n   */\n  @Beta\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  /**\n   * Note that this field is in Beta and is subject to be removed at any point of time without any\n   * notification.\n   *\n   * @param attributes workspace config attributes that might be used in creation of workspace\n   *     runtime\n   * @see WorkspaceConfig#getAttributes()\n   */\n  @Beta\n  public InternalEnvironment setAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n    return this;\n  }\n\n  @Beta\n  public List<CommandImpl> getCommands() {\n    if (commands == null) {\n      commands = new ArrayList<>();\n    }\n    return commands;\n  }\n\n  @Beta\n  public InternalEnvironment setCommands(List<? extends Command> commands) {\n    if (commands != null) {\n      this.commands = commands.stream().map(CommandImpl::new).collect(Collectors.toList());\n    }\n    return this;\n  }\n\n  /** Return the devfile that was used for the environment constructing. */\n  public DevfileImpl getDevfile() {\n    return devfile;\n  }\n\n  public void setDevfile(DevfileImpl devfile) {\n    this.devfile = devfile;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/environment/InternalEnvironmentFactory.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.environment;\n\nimport static org.eclipse.che.api.workspace.shared.Constants.CONTAINER_SOURCE_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.RECIPE_CONTAINER_SOURCE;\n\nimport com.google.common.annotations.VisibleForTesting;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.api.core.model.workspace.config.Environment;\nimport org.eclipse.che.api.core.model.workspace.config.MachineConfig;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Creates a valid instance of InternalEnvironment.\n *\n * <p>Expected to be bound with a MapBinder with unique String key that contains recipe type, like:\n *\n * <pre>\n *   MapBinder<String, InternalEnvironmentFactory> envFactories =\n *       MapBinder.newMapBinder(binder(), String.class, InternalEnvironmentFactory.class);\n *   envFactories.addBinding(\"recipe_type_1\").to(SubclassOfInternalEnvironmentFactory.class);\n * </pre>\n *\n * @author gazarenkov\n * @author Sergii Leshchenko\n */\npublic abstract class InternalEnvironmentFactory<T extends InternalEnvironment> {\n\n  private final RecipeRetriever recipeRetriever;\n  private final MachineConfigsValidator machinesValidator;\n\n  public InternalEnvironmentFactory(\n      RecipeRetriever recipeRetriever, MachineConfigsValidator machinesValidator) {\n    this.recipeRetriever = recipeRetriever;\n    this.machinesValidator = machinesValidator;\n  }\n\n  /**\n   * Creates a valid instance of InternalEnvironment.\n   *\n   * <p>To construct a valid instance it performs the following actions:\n   *\n   * <ul>\n   *   <li>download recipe content if it is needed;\n   *   <li>retrieve the configured installers from installers registry;\n   *   <li>normalize servers port by adding default protocol in port if it is absent;\n   *   <li>validate the environment machines;\n   *   <li>invoke implementation specific method that should validate and parse recipe;\n   *   <li>ensure there are environment variables pointing to machine names;\n   * </ul>\n   *\n   * @param sourceEnv the environment\n   * @return InternalEnvironment a valid InternalEnvironment instance\n   * @throws InfrastructureException if exception occurs on recipe downloading\n   * @throws InfrastructureException if infrastructure specific error occurs\n   * @throws ValidationException if validation fails\n   */\n  public T create(@Nullable final Environment sourceEnv)\n      throws InfrastructureException, ValidationException {\n\n    Map<String, InternalMachineConfig> machines = new HashMap<>();\n    List<Warning> warnings = new ArrayList<>();\n    InternalRecipe recipe = null;\n\n    if (sourceEnv != null) {\n      recipe = recipeRetriever.getRecipe(sourceEnv.getRecipe());\n\n      for (Map.Entry<String, ? extends MachineConfig> machineEntry :\n          sourceEnv.getMachines().entrySet()) {\n        MachineConfig machineConfig = machineEntry.getValue();\n        machines.put(\n            machineEntry.getKey(),\n            new InternalMachineConfig(\n                normalizeServers(machineConfig.getServers()),\n                machineConfig.getEnv(),\n                machineConfig.getAttributes(),\n                machineConfig.getVolumes()));\n      }\n\n      machinesValidator.validate(machines);\n    }\n\n    T internalEnv = doCreate(recipe, machines, warnings);\n\n    internalEnv\n        .getMachines()\n        .values()\n        .forEach(m -> m.getAttributes().put(CONTAINER_SOURCE_ATTRIBUTE, RECIPE_CONTAINER_SOURCE));\n\n    return internalEnv;\n  }\n\n  /**\n   * Implementation validates downloaded recipe and creates specific InternalEnvironment.\n   *\n   * <p>Returned InternalEnvironment must contains all machine that are defined in recipe and in\n   * source machines collection. Also, if memory limitation is supported, it may add memory limit\n   * attribute {@link MachineConfig#MEMORY_LIMIT_ATTRIBUTE} from recipe or configured system-wide\n   * default value.\n   *\n   * @param recipe downloaded recipe\n   * @param machines machines configuration\n   * @param warnings list of warnings\n   * @return InternalEnvironment\n   * @throws InfrastructureException if infrastructure specific error occurs\n   * @throws ValidationException if validation fails\n   */\n  protected abstract T doCreate(\n      @Nullable InternalRecipe recipe,\n      Map<String, InternalMachineConfig> machines,\n      List<Warning> warnings)\n      throws InfrastructureException, ValidationException;\n\n  @VisibleForTesting\n  Map<String, ServerConfig> normalizeServers(Map<String, ? extends ServerConfig> servers) {\n    return servers.entrySet().stream()\n        .collect(Collectors.toMap(Entry::getKey, e -> normalizeServer(e.getValue())));\n  }\n\n  private ServerConfig normalizeServer(ServerConfig serverConfig) {\n    String port = serverConfig.getPort();\n    if (port != null && !port.contains(\"/\")) {\n      port = port + \"/tcp\";\n    }\n    return new ServerConfigImpl(\n        port, serverConfig.getProtocol(), serverConfig.getPath(), serverConfig.getAttributes());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/environment/InternalMachineConfig.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.environment;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.core.model.workspace.config.Volume;\n\n/**\n * Machine Config to use inside infrastructure.\n *\n * <p>It contains:\n *\n * <ul>\n *   <li>retrieved full information about installers;\n *   <li>normalized server configs.\n * </ul>\n *\n * @author gazarenkov\n */\npublic class InternalMachineConfig {\n  private final Map<String, ServerConfig> servers;\n  private final Map<String, String> env;\n  private final Map<String, String> attributes;\n  private final Map<String, Volume> volumes;\n\n  public InternalMachineConfig() {\n    this.servers = new HashMap<>();\n    this.env = new HashMap<>();\n    this.attributes = new HashMap<>();\n    this.volumes = new HashMap<>();\n  }\n\n  public InternalMachineConfig(\n      Map<String, ? extends ServerConfig> servers,\n      Map<String, String> env,\n      Map<String, String> attributes,\n      Map<String, ? extends Volume> volumes) {\n    this();\n    if (servers != null) {\n      this.servers.putAll(servers);\n    }\n    if (env != null) {\n      this.env.putAll(env);\n    }\n    if (attributes != null) {\n      this.attributes.putAll(attributes);\n    }\n    if (volumes != null) {\n      this.volumes.putAll(volumes);\n    }\n  }\n\n  /** Returns modifiable map of servers configured in the machine. */\n  public Map<String, ServerConfig> getServers() {\n    return servers;\n  }\n\n  /** Returns modifiable map of machine environment variables. */\n  public Map<String, String> getEnv() {\n    return env;\n  }\n\n  /** Returns modifiable map of machine attributes. */\n  public Map<String, String> getAttributes() {\n    return attributes;\n  }\n\n  /** Returns modifiable map of machine volumes. */\n  public Map<String, Volume> getVolumes() {\n    return volumes;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/environment/InternalRecipe.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.environment;\n\nimport org.eclipse.che.api.core.model.workspace.config.Environment;\nimport org.eclipse.che.api.core.model.workspace.config.Recipe;\nimport org.eclipse.che.commons.annotation.Nullable;\n\n/**\n * Recipe of {@link Environment} with content either provided by {@link Recipe#getContent()} or\n * downloaded from {@link Recipe#getLocation()}.\n *\n * @author Alexander Garagatyi\n * @author gazarenkov\n * @author Sergii Leshchenko\n */\npublic class InternalRecipe {\n  private final String type;\n  private final String contentType;\n  private final String content;\n\n  InternalRecipe(String type, String contentType, String content) {\n    this.type = type;\n    this.contentType = contentType;\n    this.content = content;\n  }\n\n  /** Type of the recipe. It is mandatory. */\n  public String getType() {\n    return type;\n  }\n\n  /** Content type. It is optional. */\n  @Nullable\n  public String getContentType() {\n    return contentType;\n  }\n\n  /** The context of the recipe. It is mandatory. */\n  public String getContent() {\n    return content;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/environment/MachineConfigsValidator.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.environment;\n\nimport static java.lang.String.format;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_REQUEST_ATTRIBUTE;\n\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\n\n/**\n * @author Sergii Leshchenko\n */\npublic class MachineConfigsValidator {\n  private static final String MACHINE_NAME_REGEXP = \"[a-zA-Z0-9]+([a-zA-Z0-9_/-]*[a-zA-Z0-9])?\";\n  private static final Pattern MACHINE_NAME_PATTERN =\n      Pattern.compile(\"^\" + MACHINE_NAME_REGEXP + \"$\");\n\n  private static final Pattern SERVER_PORT_PATTERN = Pattern.compile(\"^[1-9]+[0-9]*(/(tcp|udp))?$\");\n  private static final Pattern SERVER_PROTOCOL_PATTERN = Pattern.compile(\"^[a-z][a-z0-9-+.]*$\");\n\n  /**\n   * Validates the specified machine configs.\n   *\n   * @param machines machines configs to validate\n   * @throws ValidationException when the specified environment is not valid\n   */\n  public void validate(Map<String, InternalMachineConfig> machines) throws ValidationException {\n    for (Entry<String, InternalMachineConfig> machineConfigEntry : machines.entrySet()) {\n      validateMachine(machineConfigEntry.getKey(), machineConfigEntry.getValue());\n    }\n  }\n\n  private void validateMachine(String machineName, InternalMachineConfig machineConfig)\n      throws ValidationException {\n\n    checkArgument(\n        MACHINE_NAME_PATTERN.matcher(machineName).matches(),\n        \"Name of machine '%s' in environment is invalid\",\n        machineName);\n\n    if (machineConfig.getServers() != null) {\n      for (Map.Entry<String, ? extends ServerConfig> serverEntry :\n          machineConfig.getServers().entrySet()) {\n        String serverName = serverEntry.getKey();\n        ServerConfig server = serverEntry.getValue();\n\n        checkArgument(\n            server.getPort() != null && SERVER_PORT_PATTERN.matcher(server.getPort()).matches(),\n            \"Machine '%s' in environment contains server conf '%s' with invalid port '%s'\",\n            machineName,\n            serverName,\n            server.getPort());\n        checkArgument(\n            server.getProtocol() == null\n                || SERVER_PROTOCOL_PATTERN.matcher(server.getProtocol()).matches(),\n            \"Machine '%s' in environment contains server conf '%s' with invalid protocol '%s'\",\n            machineName,\n            serverName,\n            server.getProtocol());\n      }\n    }\n\n    if (machineConfig.getAttributes() != null) {\n      String memoryLimit = machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE);\n      String memoryRequest = machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE);\n      if (memoryLimit != null && memoryRequest != null) {\n        checkArgument(\n            Long.parseLong(memoryLimit) >= Long.parseLong(memoryRequest),\n            \"Machine '%s' in environment contains inconsistent memory attributes: Memory limit: '%s', Memory request: '%s'\",\n            machineName,\n            Long.parseLong(memoryLimit),\n            Long.parseLong(memoryRequest));\n      }\n    }\n  }\n\n  private static void checkArgument(\n      boolean expression, String errorMessageTemplate, Object... errorMessageParams)\n      throws ValidationException {\n    if (!expression) {\n      throw new ValidationException(format(errorMessageTemplate, errorMessageParams));\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/environment/RecipeRetriever.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.environment;\n\nimport static org.slf4j.LoggerFactory.getLogger;\n\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.net.MalformedURLException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.net.URL;\nimport java.util.Objects;\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.config.Recipe;\nimport org.eclipse.che.api.core.util.FileCleaner;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.lang.IoUtil;\nimport org.slf4j.Logger;\n\n/**\n * Handle how recipe is retrieved, either by downloading it with external location or by using the\n * provided content.\n *\n * @author Alexander Garagatyi\n */\npublic class RecipeRetriever {\n  private static final Logger LOG = getLogger(RecipeRetriever.class);\n\n  private final URI apiEndpoint;\n\n  @Inject\n  public RecipeRetriever(@Named(\"che.api\") URI apiEndpoint) {\n    this.apiEndpoint = apiEndpoint;\n  }\n\n  /**\n   * Returns content of recipe either by getting it from provided {@link Recipe} object or by\n   * retrieving it from location set in provided recipe.\n   *\n   * @param recipe recipe of {@link org.eclipse.che.api.core.model.workspace.config.Environment}\n   * @return recipe content\n   * @throws NullPointerException when recipe is null\n   * @throws IllegalArgumentException when both recipe content and location are null or empty\n   */\n  public InternalRecipe getRecipe(Recipe recipe) throws InfrastructureException {\n    Objects.requireNonNull(recipe, \"Recipe should not be null\");\n    Objects.requireNonNull(recipe.getType(), \"Recipe type should not be null\");\n    return new InternalRecipe(recipe.getType(), recipe.getContentType(), retrieveContent(recipe));\n  }\n\n  private String retrieveContent(Recipe recipe) throws InfrastructureException {\n    if (recipe.getContent() != null && !recipe.getContent().isEmpty()) {\n      // no downloading is needed\n      return recipe.getContent();\n    }\n    if (recipe.getLocation() == null || recipe.getLocation().isEmpty()) {\n      throw new IllegalArgumentException(\"Neither content nor location are present in recipe\");\n    }\n    URL url = prepareURL(recipe.getLocation());\n    return downloadContent(url);\n  }\n\n  private URL prepareURL(String location) throws InfrastructureException {\n    URI uri;\n    try {\n      uri = new URI(location);\n    } catch (URISyntaxException e) {\n      LOG.debug(e.getLocalizedMessage(), e);\n      throw new InfrastructureException(\n          \"Location of recipe downloading is not supported because it is not a valid URI\");\n    }\n    // if URI to this server add token to access protected API\n    boolean addToken = isTokenNeeded(uri);\n    UriBuilder uriBuilder = makeURIAbsolute(uri);\n    if (addToken) {\n      addToken(uriBuilder);\n    }\n    try {\n      return uriBuilder.build().toURL();\n    } catch (MalformedURLException e) {\n      LOG.debug(e.getLocalizedMessage(), e);\n      throw new InfrastructureException(\"Constructing URL for downloading recipe failed\");\n    }\n  }\n\n  private String downloadContent(URL url) throws InfrastructureException {\n    File file = null;\n    try {\n      file = IoUtil.downloadFileWithRedirect(null, \"recipe\", null, url);\n      return IoUtil.readAndCloseQuietly(new FileInputStream(file));\n    } catch (IOException e) {\n      LOG.debug(e.getLocalizedMessage(), e);\n      throw new InfrastructureException(\"Failed to download recipe content\");\n    } finally {\n      if (file != null && !file.delete()) {\n        FileCleaner.addFile(file);\n      }\n    }\n  }\n\n  private UriBuilder makeURIAbsolute(URI uri) {\n    UriBuilder uriBuilder = UriBuilder.fromUri(uri);\n    if (!uri.isAbsolute() && uri.getHost() == null) {\n      uriBuilder\n          .scheme(apiEndpoint.getScheme())\n          .host(apiEndpoint.getHost())\n          .port(apiEndpoint.getPort())\n          .replacePath(apiEndpoint.getPath() + uri.toString());\n    }\n    return uriBuilder;\n  }\n\n  private boolean isTokenNeeded(URI uri) {\n    // relative URI or host is the same as CHE API host - token is needed\n    return (!uri.isAbsolute() && uri.getHost() == null)\n        || (apiEndpoint.getHost().equals(uri.getHost()) && apiEndpoint.getPort() == uri.getPort());\n  }\n\n  private void addToken(UriBuilder ub) {\n    if (EnvironmentContext.getCurrent().getSubject().getToken() != null) {\n      ub.queryParam(\"token\", EnvironmentContext.getCurrent().getSubject().getToken());\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/environment/ResourceLimitAttributesProvisioner.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.environment;\n\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_REQUEST_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_REQUEST_ATTRIBUTE;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.MachineConfig;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Configures resource limits attributes for a given machine, if they are not present in {@link\n * MachineConfig} the attributes are taken from recipe, when available, by the specific\n * infrastructure implementation, or from wsmaster properties as a fallback\n *\n * <p>if default requested memory allocation is greater then default memory limit, requested memory\n * allocation is set to be equal to memory limit.\n */\npublic class ResourceLimitAttributesProvisioner {\n\n  private static final Logger LOG =\n      LoggerFactory.getLogger(ResourceLimitAttributesProvisioner.class);\n\n  /**\n   * Configures memory attributes, if they are missing in {@link MachineConfig}\n   *\n   * @param machineConfig - given machine configuration\n   * @param memoryLimit - resource limit parameter configured by user in specific infra recipe. Can\n   *     be 0 if defaults should be used\n   * @param memoryRequest - memory request parameter configured by user in specific infra recipe.\n   *     Can be 0 if defaults should be used\n   * @param defaultMemoryLimit - default memory limit resource parameter value\n   * @param defaultMemoryRequest - default memory request resource parameter value\n   */\n  public static void provisionMemory(\n      InternalMachineConfig machineConfig,\n      long memoryLimit,\n      long memoryRequest,\n      long defaultMemoryLimit,\n      long defaultMemoryRequest) {\n    if (defaultMemoryRequest > defaultMemoryLimit) {\n      defaultMemoryRequest = defaultMemoryLimit;\n      LOG.warn(\n          \"Requested default container resource limit is less than default request. Request parameter will be ignored.\");\n    }\n\n    if (memoryLimit <= 0 && defaultMemoryLimit > 0) {\n      memoryLimit = defaultMemoryLimit;\n    }\n    if (memoryRequest <= 0 && defaultMemoryRequest > 0) {\n      memoryRequest = defaultMemoryRequest;\n    }\n    if (memoryRequest > memoryLimit) { // if both properties are defined, but not consistent\n      memoryRequest = memoryLimit;\n    }\n\n    final Map<String, String> attributes = machineConfig.getAttributes();\n    String configuredLimit = attributes.get(MEMORY_LIMIT_ATTRIBUTE);\n    String configuredRequest = attributes.get(MEMORY_REQUEST_ATTRIBUTE);\n    // Added < 0  check to avoid bypassing limit if someone is set negative value into attribute.\n    if (isNullOrEmpty(configuredLimit) || Long.parseLong(configuredLimit) <= 0) {\n      attributes.put(MEMORY_LIMIT_ATTRIBUTE, String.valueOf(memoryLimit));\n    }\n    if (isNullOrEmpty(configuredRequest) || Long.parseLong(configuredRequest) <= 0) {\n      attributes.put(MEMORY_REQUEST_ATTRIBUTE, String.valueOf(memoryRequest));\n    }\n  }\n\n  /**\n   * Configures CPU attributes, if they are missing in {@link MachineConfig}\n   *\n   * @param machineConfig - given machine configuration\n   * @param cpuLimit - CPU resource limit parameter configured by user in specific infra recipe. Can\n   *     be 0 if defaults should be used\n   * @param cpuRequest - CPU resource request parameter configured by user in specific infra recipe.\n   *     Can be 0 if defaults should be used\n   * @param defaultCPULimit - default CPU limit resource parameter value\n   * @param defaultCPURequest - default CPU request resource parameter value\n   */\n  public static void provisionCPU(\n      InternalMachineConfig machineConfig,\n      float cpuLimit,\n      float cpuRequest,\n      float defaultCPULimit,\n      float defaultCPURequest) {\n    if (defaultCPURequest > defaultCPULimit) {\n      defaultCPURequest = defaultCPULimit;\n      LOG.warn(\n          \"Requested default container resource limit is less than default request. Request parameter will be ignored.\");\n    }\n\n    if (cpuLimit <= 0 && defaultCPULimit > 0) {\n      cpuLimit = defaultCPULimit;\n    }\n    if (cpuRequest <= 0 && defaultCPURequest > 0) {\n      cpuRequest = defaultCPURequest;\n    }\n    if (cpuRequest > cpuLimit) { // if both properties are defined, but not consistent\n      cpuRequest = cpuLimit;\n    }\n\n    final Map<String, String> attributes = machineConfig.getAttributes();\n    String configuredLimit = attributes.get(CPU_LIMIT_ATTRIBUTE);\n    String configuredRequest = attributes.get(CPU_REQUEST_ATTRIBUTE);\n    // Added < 0  check to avoid bypassing limit if someone is set negative value into attribute.\n    if (isNullOrEmpty(configuredLimit) || Float.parseFloat(configuredLimit) <= 0) {\n      attributes.put(CPU_LIMIT_ATTRIBUTE, Float.toString(cpuLimit));\n    }\n    if (isNullOrEmpty(configuredRequest) || Float.parseFloat(configuredRequest) <= 0) {\n      attributes.put(CPU_REQUEST_ATTRIBUTE, Float.toString(cpuRequest));\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/provision/env/AgentAuthEnableEnvVarProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * Provides environment variable that is used for enabling/disabling authentication on agents.\n *\n * @author Sergii Leshchenko\n */\npublic class AgentAuthEnableEnvVarProvider implements LegacyEnvVarProvider {\n\n  public static final String CHE_AUTH_ENABLED_ENV = \"CHE_AUTH_ENABLED\";\n\n  private final boolean agentsAuthEnabled;\n\n  @Inject\n  public AgentAuthEnableEnvVarProvider(\n      @Named(\"che.agents.auth_enabled\") boolean agentsAuthEnabled) {\n    this.agentsAuthEnabled = agentsAuthEnabled;\n  }\n\n  @Override\n  public Pair<String, String> get(RuntimeIdentity runtimeIdentity) {\n    return Pair.of(CHE_AUTH_ENABLED_ENV, Boolean.toString(agentsAuthEnabled));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/provision/env/CheApiEnvVarProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * CHE_API endpoint var provided. For all currently supported infrastructures, it reuses {@link\n * CheApiInternalEnvVarProvider} to provide the value.\n *\n * @deprecated this class shall soon be removed, as this variable is provided only for backward\n *     compatibility\n * @author Sergii Leshchenko\n * @author Mykhailo Kuznietsov\n */\n@Deprecated\npublic class CheApiEnvVarProvider implements EnvVarProvider {\n\n  /** Che API url */\n  public static final String CHE_API_VARIABLE = \"CHE_API\";\n\n  private final CheApiInternalEnvVarProvider cheApiInternalEnvVarProvider;\n  private final CheApiExternalEnvVarProvider cheApiExternalEnvVarProvider;\n\n  @Inject\n  public CheApiEnvVarProvider(\n      CheApiInternalEnvVarProvider cheApiInternalEnvVarProvider,\n      CheApiExternalEnvVarProvider cheApiExternalEnvVarProvider) {\n    this.cheApiInternalEnvVarProvider = cheApiInternalEnvVarProvider;\n    this.cheApiExternalEnvVarProvider = cheApiExternalEnvVarProvider;\n  }\n\n  /**\n   * Returns Che API environment variable which should be injected into machines.\n   *\n   * @param runtimeIdentity which may be needed to evaluate environment variable value\n   */\n  @Override\n  public Pair<String, String> get(RuntimeIdentity runtimeIdentity) throws InfrastructureException {\n    if (cheApiInternalEnvVarProvider.get(runtimeIdentity) != null) {\n      return Pair.of(CHE_API_VARIABLE, cheApiInternalEnvVarProvider.get(runtimeIdentity).second);\n    }\n    return Pair.of(CHE_API_VARIABLE, cheApiExternalEnvVarProvider.get(runtimeIdentity).second);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/provision/env/CheApiExternalEnvVarProvider.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * @author Mykhailo Kuznietsov\n */\npublic interface CheApiExternalEnvVarProvider extends EnvVarProvider {\n\n  /** Env variable for machine that contains url of Che API */\n  String CHE_API_EXTERNAL_VARIABLE = \"CHE_API_EXTERNAL\";\n\n  /**\n   * Returns Che API environment variable which should be injected into machines. External API URL\n   * is meant to be used by external clients like browsers.\n   *\n   * @param runtimeIdentity which may be needed to evaluate environment variable value\n   */\n  @Override\n  Pair<String, String> get(RuntimeIdentity runtimeIdentity) throws InfrastructureException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/provision/env/CheApiInternalEnvVarProvider.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * @author Mykhailo Kuznietsov\n */\npublic interface CheApiInternalEnvVarProvider extends EnvVarProvider {\n\n  /** Env variable for machine that contains url of Che API */\n  String CHE_API_INTERNAL_VARIABLE = \"CHE_API_INTERNAL\";\n\n  /**\n   * Returns Che API environment variable which should be injected into machines. Internal API URL\n   * is meant to be used from the inside of other machines.\n   *\n   * @param runtimeIdentity which may be needed to evaluate environment variable value\n   */\n  @Override\n  Pair<String, String> get(RuntimeIdentity runtimeIdentity) throws InfrastructureException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/provision/env/EnvVarProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * Provides an environment variable which is needed for servers used by Che for providing IDE\n * features.\n *\n * @author Sergii Leshchenko\n */\npublic interface EnvVarProvider {\n  /**\n   * Returns environment variable which should be injected into machine environment. If null is\n   * returned, that means that no variable will be provided\n   *\n   * @param runtimeIdentity which may be needed to evaluate environment variable value\n   */\n  Pair<String, String> get(RuntimeIdentity runtimeIdentity) throws InfrastructureException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/provision/env/JavaOptsEnvVariableProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * Add env variable to machines with java opts.\n *\n * @author Roman Iuvshyn\n * @author Alexander Garagatyi\n */\npublic class JavaOptsEnvVariableProvider implements LegacyEnvVarProvider {\n\n  /** Env variable for jvm settings */\n  public static final String JAVA_OPTS_VARIABLE = \"JAVA_OPTS\";\n\n  private String javaOpts;\n\n  @Inject\n  public JavaOptsEnvVariableProvider(\n      @Named(\"che.workspace.java_options\") String javaOpts,\n      @Nullable @Named(\"che.workspace.http_proxy_java_options\") String httpProxyJavaOptions) {\n    this.javaOpts = httpProxyJavaOptions == null ? javaOpts : javaOpts + \" \" + httpProxyJavaOptions;\n  }\n\n  @Override\n  public Pair<String, String> get(RuntimeIdentity runtimeIdentity) {\n    return Pair.of(JAVA_OPTS_VARIABLE, javaOpts);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/provision/env/LegacyEnvVarProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\n/**\n * Marker interface for environment variable providers which keeps backward-compatibility with Che 6\n * workspaces.\n */\npublic interface LegacyEnvVarProvider extends EnvVarProvider {}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/provision/env/MachineTokenEnvVarProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.token.MachineTokenException;\nimport org.eclipse.che.api.workspace.server.token.MachineTokenProvider;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * Provides environment variable with a token that should be used by servers in a container to\n * access Che master API.\n *\n * @author Alexander Garagatyi\n * @author Sergii Leshchenko\n */\npublic class MachineTokenEnvVarProvider implements EnvVarProvider {\n  /** Environment variable that will be setup in machines and contains machine token. */\n  public static final String MACHINE_TOKEN = \"CHE_MACHINE_TOKEN\";\n\n  private final MachineTokenProvider machineTokenProvider;\n\n  @Inject\n  public MachineTokenEnvVarProvider(MachineTokenProvider machineTokenProvider) {\n    this.machineTokenProvider = machineTokenProvider;\n  }\n\n  @Override\n  public Pair<String, String> get(RuntimeIdentity runtimeIdentity) throws MachineTokenException {\n    return Pair.of(\n        MACHINE_TOKEN,\n        machineTokenProvider.getToken(\n            runtimeIdentity.getOwnerId(), runtimeIdentity.getWorkspaceId()));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/provision/env/MavenOptsEnvVariableProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * Provides MAVEN_OPTS environment variable with a value set to either maven options from\n * configuration or java options if maven options are not set.\n *\n * @author Yevhenii Voevodin\n */\npublic class MavenOptsEnvVariableProvider implements LegacyEnvVarProvider {\n\n  private final String javaOpts;\n\n  @Inject\n  public MavenOptsEnvVariableProvider(\n      @Named(\"che.workspace.maven_options\") String javaOpts,\n      @Nullable @Named(\"che.workspace.http_proxy_java_options\") String httpProxyJavaOptions) {\n    this.javaOpts = httpProxyJavaOptions == null ? javaOpts : javaOpts + \" \" + httpProxyJavaOptions;\n  }\n\n  @Override\n  public Pair<String, String> get(RuntimeIdentity runtimeIdentity) {\n    return Pair.of(\"MAVEN_OPTS\", javaOpts);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/provision/env/WorkspaceIdEnvVarProvider.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * @author Sergii Leshchenko\n */\npublic class WorkspaceIdEnvVarProvider implements EnvVarProvider {\n  /**\n   * Environment variable that will be setup in machine will contain ID of a workspace for which\n   * this machine has been created\n   */\n  public static final String WORKSPACE_ID_ENV_VAR = \"CHE_WORKSPACE_ID\";\n\n  @Override\n  public Pair<String, String> get(RuntimeIdentity runtimeIdentity) {\n    return Pair.of(WORKSPACE_ID_ENV_VAR, runtimeIdentity.getWorkspaceId());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/provision/env/WorkspaceNameEnvVarProvider.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.WorkspaceDao;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * Provides environment variable with workspace name\n *\n * @author Sergii Kabashniuk\n */\npublic class WorkspaceNameEnvVarProvider implements EnvVarProvider {\n\n  /** Env variable for workspace name */\n  public static final String CHE_WORKSPACE_NAME = \"CHE_WORKSPACE_NAME\";\n\n  private final WorkspaceDao workspaceDao;\n\n  @Inject\n  public WorkspaceNameEnvVarProvider(WorkspaceDao workspaceDao) {\n    this.workspaceDao = workspaceDao;\n  }\n\n  @Override\n  public Pair<String, String> get(RuntimeIdentity runtimeIdentity) throws InfrastructureException {\n    try {\n      WorkspaceImpl workspace = workspaceDao.get(runtimeIdentity.getWorkspaceId());\n      return Pair.of(CHE_WORKSPACE_NAME, workspace.getName());\n    } catch (NotFoundException | ServerException e) {\n      throw new InfrastructureException(\n          \"Not able to get workspace name for workspace with id \"\n              + runtimeIdentity.getWorkspaceId(),\n          e);\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/spi/provision/env/WorkspaceNamespaceNameEnvVarProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport javax.inject.Inject;\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.WorkspaceDao;\nimport org.eclipse.che.commons.lang.Pair;\n\n/**\n * Provides environment variable with workspace namespace\n *\n * @author Sergii Kabashniuk\n */\npublic class WorkspaceNamespaceNameEnvVarProvider implements EnvVarProvider {\n\n  /** Env variable for workspace name */\n  public static final String CHE_WORKSPACE_NAMESPACE = \"CHE_WORKSPACE_NAMESPACE\";\n\n  private final WorkspaceDao workspaceDao;\n\n  @Inject\n  public WorkspaceNamespaceNameEnvVarProvider(WorkspaceDao workspaceDao) {\n    this.workspaceDao = workspaceDao;\n  }\n\n  @Override\n  public Pair<String, String> get(RuntimeIdentity runtimeIdentity) throws InfrastructureException {\n    try {\n      WorkspaceImpl workspace = workspaceDao.get(runtimeIdentity.getWorkspaceId());\n      return Pair.of(CHE_WORKSPACE_NAMESPACE, workspace.getNamespace());\n    } catch (NotFoundException | ServerException e) {\n      throw new InfrastructureException(\n          \"Not able to get workspace namespace for workspace with id \"\n              + runtimeIdentity.getWorkspaceId(),\n          e);\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/token/MachineAccessForbidden.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.token;\n\n/**\n * An exception should be thrown by {@link MachineTokenProvider} when an user doesn't have the\n * needed permissions.\n *\n * @author Sergii Leshchenko\n */\npublic class MachineAccessForbidden extends MachineTokenException {\n\n  public MachineAccessForbidden(String message) {\n    super(message);\n  }\n\n  public MachineAccessForbidden(Exception e) {\n    super(e);\n  }\n\n  public MachineAccessForbidden(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/token/MachineTokenException.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.token;\n\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\n\n/**\n * An exception should be thrown by {@link MachineTokenProvider} when an error occurred during token\n * fetching.\n *\n * @author Sergii Leshchenko\n */\npublic class MachineTokenException extends InfrastructureException {\n  public MachineTokenException(String message) {\n    super(message);\n  }\n\n  public MachineTokenException(Exception e) {\n    super(e);\n  }\n\n  public MachineTokenException(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/token/MachineTokenProvider.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.token;\n\nimport org.eclipse.che.commons.env.EnvironmentContext;\nimport org.eclipse.che.commons.subject.Subject;\n\n/**\n * Provides machine token that should be used for accessing workspace master from a machine.\n *\n * @author Sergii Leshchenko\n */\npublic interface MachineTokenProvider {\n\n  /**\n   * Returns the machine's token for the specified workspace and user from {@link\n   * EnvironmentContext#getSubject()}.\n   *\n   * @param workspaceId identifier of workspace to fetch token\n   * @throws IllegalStateException when the current subject in context is {@link Subject#ANONYMOUS}\n   * @throws MachineAccessForbidden when the current subject doesn't have the needed permissions\n   * @throws MachineTokenException when any exception occurs on token fetching\n   */\n  String getToken(String workspaceId) throws MachineTokenException;\n\n  /**\n   * Returns the machine's token for the specified pair: user, workspace.\n   *\n   * @param workspaceId identifier of workspace to fetch token\n   * @throws MachineAccessForbidden when the specified user doesn't have the needed permissions\n   * @throws MachineTokenException when any exception occurs on token fetching\n   */\n  String getToken(String userId, String workspaceId) throws MachineTokenException;\n\n  /** Returns empty string as machine token. */\n  class EmptyMachineTokenProvider implements MachineTokenProvider {\n\n    @Override\n    public String getToken(String workspaceId) {\n      return \"\";\n    }\n\n    @Override\n    public String getToken(String userId, String workspaceId) {\n      return \"\";\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/ChePluginsApplier.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins;\n\nimport com.google.common.annotations.Beta;\nimport java.util.Collection;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironment;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ChePlugin;\n\n/**\n * Applies Che plugins tooling configuration to an internal runtime object that represents workspace\n * runtime configuration on an infrastructure level.\n *\n * @author Oleksander Garagatyi\n */\n@Beta\npublic interface ChePluginsApplier {\n\n  /**\n   * Applies Che plugins tooling configuration to internal environment.\n   *\n   * @param runtimeIdentity the runtime identity of the workspace that the plugins are being applied\n   *     to\n   * @param internalEnvironment infrastructure specific representation of workspace runtime\n   *     environment\n   * @param chePlugins Che plugins tooling configuration to apply to {@code internalEnvironment}\n   * @throws InfrastructureException when applying Che plugins tooling fails\n   */\n  void apply(\n      RuntimeIdentity runtimeIdentity,\n      InternalEnvironment internalEnvironment,\n      Collection<ChePlugin> chePlugins)\n      throws InfrastructureException;\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/PluginFQNParser.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins;\n\nimport static com.google.common.base.MoreObjects.firstNonNull;\nimport static com.google.common.base.Strings.isNullOrEmpty;\nimport static java.lang.String.format;\nimport static java.util.Collections.emptyList;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.dataformat.yaml.YAMLFactory;\nimport com.google.common.annotations.Beta;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ExtendedPluginFQN;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.PluginFQN;\nimport org.eclipse.che.api.workspace.shared.Constants;\n\n/**\n * Parses workspace attributes into a list of {@link PluginFQN}.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Oleksander Garagatyi\n * @author Angel Misevski\n */\n@Beta\npublic class PluginFQNParser {\n\n  private ObjectMapper yamlReader = new ObjectMapper(new YAMLFactory());\n\n  private static final String INCORRECT_PLUGIN_FORMAT_TEMPLATE =\n      \"Plugin '%s' has incorrect format. Should be: 'registryURL#publisher/name/version' or 'publisher/name/version' or `referenceURL`\";\n  private static final String URL_PATTERN = \"https?://[-.\\\\w]+(:[0-9]+)?(/[-.\\\\w]+)*\";\n  private static final String PUBLISHER_PATTERN = \"[-a-z0-9]+\";\n  private static final String NAME_PATTERN = \"[-a-z0-9]+\";\n  private static final String VERSION_PATTERN = \"[-.a-z0-9]+\";\n  private static final String ID_PATTERN =\n      \"(?<publisher>\"\n          + PUBLISHER_PATTERN\n          + \")/(?<name>\"\n          + NAME_PATTERN\n          + \")/(?<version>\"\n          + VERSION_PATTERN\n          + \")\";\n  private static final Pattern PLUGIN_PATTERN =\n      Pattern.compile(\"((?<url>\" + URL_PATTERN + \")/?#?)?(?<id>\" + ID_PATTERN + \")?\");\n\n  /**\n   * Parses a workspace attributes map into a collection of {@link PluginFQN}.\n   *\n   * @param attributes workspace attributes containing plugin and/or editor fields\n   * @return a Collection of PluginFQN containing the editor and all plugins for this attributes\n   * @throws InfrastructureException if attributes defines more than one editor\n   */\n  public Collection<PluginFQN> parsePlugins(Map<String, String> attributes)\n      throws InfrastructureException {\n    if (attributes == null) {\n      return emptyList();\n    }\n\n    String pluginsAttribute =\n        attributes.getOrDefault(Constants.WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE, null);\n    String editorAttribute =\n        attributes.getOrDefault(Constants.WORKSPACE_TOOLING_EDITOR_ATTRIBUTE, null);\n\n    List<PluginFQN> metaFQNs = new ArrayList<>();\n    if (!isNullOrEmpty(pluginsAttribute)) {\n      metaFQNs.addAll(parsePluginFQNs(pluginsAttribute));\n    }\n    if (!isNullOrEmpty(editorAttribute)) {\n      Collection<PluginFQN> editorsFQNs = parsePluginFQNs(editorAttribute);\n      if (editorsFQNs.size() > 1) {\n        throw new InfrastructureException(\n            \"Multiple editors found in workspace config attributes. \"\n                + \"Only one editor is supported per workspace.\");\n      }\n      metaFQNs.addAll(editorsFQNs);\n    }\n    return metaFQNs;\n  }\n\n  private Collection<PluginFQN> parsePluginFQNs(String attribute) throws InfrastructureException {\n\n    String[] plugins = splitAttribute(attribute);\n    if (plugins.length == 0) {\n      return emptyList();\n    }\n\n    List<PluginFQN> collectedFQNs = new ArrayList<>();\n    for (String plugin : plugins) {\n      PluginFQN pFQN = parsePluginFQN(plugin);\n\n      String pluginKey = firstNonNull(pFQN.getReference(), pFQN.getId());\n      if (collectedFQNs.stream()\n          .anyMatch(p -> pluginKey.equals(p.getId()) || pluginKey.equals(p.getReference()))) {\n        throw new InfrastructureException(\n            format(\n                \"Invalid Che tooling plugins configuration: plugin %s is duplicated\",\n                pluginKey)); // even if different registries\n      }\n      collectedFQNs.add(pFQN);\n    }\n    return collectedFQNs;\n  }\n\n  public ExtendedPluginFQN parsePluginFQN(String plugin) throws InfrastructureException {\n    String url;\n    String id;\n    String publisher;\n    String name;\n    String version;\n    URI registryURI = null;\n    Matcher matcher = PLUGIN_PATTERN.matcher(plugin);\n    if (matcher.matches()) {\n      url = matcher.group(\"url\");\n      id = matcher.group(\"id\");\n      publisher = matcher.group(\"publisher\");\n      name = matcher.group(\"name\");\n      version = matcher.group(\"version\");\n    } else {\n      throw new InfrastructureException(format(INCORRECT_PLUGIN_FORMAT_TEMPLATE, plugin));\n    }\n    if (!isNullOrEmpty(url)) {\n      if (isNullOrEmpty(id)) {\n        // reference only\n        return new ExtendedPluginFQN(url);\n      } else {\n        // registry + id\n        try {\n          registryURI = new URI(url);\n        } catch (URISyntaxException e) {\n          throw new InfrastructureException(\n              format(\n                  \"Plugin registry URL '%s' is invalid. Problematic plugin entry: '%s'\",\n                  url, plugin));\n        }\n      }\n    }\n    return new ExtendedPluginFQN(registryURI, id, publisher, name, version);\n  }\n\n  private String[] splitAttribute(String attribute) {\n    String[] plugins = attribute.split(\",\");\n    return Arrays.stream(plugins).map(String::trim).toArray(String[]::new);\n  }\n\n  /**\n   * Evaluates plugin FQN from provided reference by trying to fetch and parse its meta information.\n   *\n   * @param reference plugin reference to evaluate FQN from\n   * @param fileContentProvider content provider instance to perform plugin meta requests\n   * @return plugin FQN evaluated from given reference\n   * @throws InfrastructureException if plugin reference is invalid or inaccessible\n   */\n  public ExtendedPluginFQN evaluateFqn(String reference, FileContentProvider fileContentProvider)\n      throws InfrastructureException {\n    JsonNode contentNode;\n    try {\n      String pluginMetaContent = fileContentProvider.fetchContent(reference);\n      contentNode = yamlReader.readTree(pluginMetaContent);\n    } catch (DevfileException | IOException e) {\n      throw new InfrastructureException(\n          format(\"Plugin reference URL '%s' is invalid.\", reference), e);\n    }\n    JsonNode publisher = contentNode.path(\"publisher\");\n    if (publisher.isMissingNode()) {\n      throw new InfrastructureException(formatMessage(reference, \"publisher\"));\n    }\n    JsonNode name = contentNode.get(\"name\");\n    if (name.isMissingNode()) {\n      throw new InfrastructureException(formatMessage(reference, \"name\"));\n    }\n    JsonNode version = contentNode.get(\"version\");\n    if (version.isMissingNode()) {\n      throw new InfrastructureException(formatMessage(reference, \"version\"));\n    }\n    if (!version.isValueNode()) {\n      throw new InfrastructureException(\n          format(\n              \"Plugin specified by reference URL '%s' has version field that cannot be parsed to string\",\n              reference));\n    }\n    return new ExtendedPluginFQN(\n        reference, publisher.textValue(), name.textValue(), version.asText());\n  }\n\n  private String formatMessage(String reference, String field) {\n    return format(\n        \"Plugin specified by reference URL '%s' have missing required field '\" + field + \"'.\",\n        reference);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/model/CheContainer.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins.model;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\n\n/** Represents sidecar container in Che workspace. */\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class CheContainer {\n\n  private String image = null;\n  private String name = null;\n  private List<EnvVar> env = new ArrayList<>();\n\n  @JsonProperty(\"commands\")\n  private List<Command> commands = new ArrayList<>();\n\n  private List<Volume> volumes = new ArrayList<>();\n  private List<CheContainerPort> ports = new ArrayList<>();\n\n  @JsonProperty(\"memoryLimit\")\n  private String memoryLimit = null;\n\n  @JsonProperty(\"memoryRequest\")\n  private String memoryRequest = null;\n\n  @JsonProperty(\"cpuLimit\")\n  private String cpuLimit = null;\n\n  @JsonProperty(\"cpuRequest\")\n  private String cpuRequest = null;\n\n  @JsonProperty(\"mountSources\")\n  private boolean mountSources = false;\n\n  @JsonProperty(\"command\")\n  private List<String> command;\n\n  @JsonProperty(\"args\")\n  private List<String> args;\n\n  @JsonProperty(\"lifecycle\")\n  private Lifecycle lifecycle;\n\n  public CheContainer image(String image) {\n    this.image = image;\n    return this;\n  }\n\n  public String getImage() {\n    return image;\n  }\n\n  public void setImage(String image) {\n    this.image = image;\n  }\n\n  public CheContainer name(String name) {\n    this.name = name;\n    return this;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  /** List of environment variables to set in the container. Cannot be updated. */\n  public CheContainer env(List<EnvVar> env) {\n    this.env = env;\n    return this;\n  }\n\n  public List<EnvVar> getEnv() {\n    if (env == null) {\n      env = new ArrayList<>();\n    }\n    return env;\n  }\n\n  public void setEnv(List<EnvVar> env) {\n    this.env = env;\n  }\n\n  /** List of container commands */\n  public CheContainer commands(List<Command> commands) {\n    this.commands = commands;\n    return this;\n  }\n\n  public List<Command> getCommands() {\n    if (commands == null) {\n      commands = new ArrayList<>();\n    }\n    return commands;\n  }\n\n  public void setCommands(List<Command> commands) {\n    this.commands = commands;\n  }\n\n  /** List of container volumes */\n  public CheContainer volumes(List<Volume> volumes) {\n    this.volumes = volumes;\n    return this;\n  }\n\n  public List<Volume> getVolumes() {\n    if (volumes == null) {\n      volumes = new ArrayList<>();\n    }\n    return volumes;\n  }\n\n  public void setVolumes(List<Volume> volumes) {\n    this.volumes = volumes;\n  }\n\n  public CheContainer ports(List<CheContainerPort> ports) {\n    this.ports = ports;\n    return this;\n  }\n\n  public List<CheContainerPort> getPorts() {\n    if (ports == null) {\n      ports = new ArrayList<>();\n    }\n    return ports;\n  }\n\n  public void setPorts(List<CheContainerPort> ports) {\n    this.ports = ports;\n  }\n\n  public CheContainer memoryLimit(String memoryLimit) {\n    this.memoryLimit = memoryLimit;\n    return this;\n  }\n\n  public String getMemoryLimit() {\n    return memoryLimit;\n  }\n\n  public void setMemoryLimit(String memoryLimit) {\n    this.memoryLimit = memoryLimit;\n  }\n\n  public CheContainer memoryRequest(String memoryRequest) {\n    this.memoryRequest = memoryRequest;\n    return this;\n  }\n\n  public String getMemoryRequest() {\n    return memoryRequest;\n  }\n\n  public void setMemoryRequest(String memoryRequest) {\n    this.memoryRequest = memoryRequest;\n  }\n\n  public CheContainer cpuLimit(String cpuLimit) {\n    this.cpuLimit = cpuLimit;\n    return this;\n  }\n\n  public String getCpuLimit() {\n    return cpuLimit;\n  }\n\n  public void setCpuLimit(String cpuLimit) {\n    this.cpuLimit = cpuLimit;\n  }\n\n  public CheContainer cpuRequest(String cpuRequest) {\n    this.cpuRequest = cpuRequest;\n    return this;\n  }\n\n  public String getCpuRequest() {\n    return cpuRequest;\n  }\n\n  public void setCpuRequest(String cpuRequest) {\n    this.cpuRequest = cpuRequest;\n  }\n\n  public CheContainer mountSources(boolean mountSources) {\n    this.mountSources = mountSources;\n    return this;\n  }\n\n  public boolean isMountSources() {\n    return mountSources;\n  }\n\n  public void setMountSources(boolean mountSources) {\n    this.mountSources = mountSources;\n  }\n\n  public CheContainer command(List<String> command) {\n    this.command = command;\n    return this;\n  }\n\n  public List<String> getCommand() {\n    if (command == null) {\n      return new ArrayList<>();\n    }\n    return command;\n  }\n\n  public void setCommand(List<String> command) {\n    this.command = command;\n  }\n\n  public CheContainer args(List<String> args) {\n    this.args = args;\n    return this;\n  }\n\n  public List<String> getArgs() {\n    if (args == null) {\n      return new ArrayList<>();\n    }\n    return args;\n  }\n\n  public void setLifecycle(Lifecycle lifecycle) {\n    this.lifecycle = lifecycle;\n  }\n\n  public CheContainer lifecycle(Lifecycle lifecycle) {\n    this.lifecycle = lifecycle;\n    return this;\n  }\n\n  public Lifecycle getLifecycle() {\n    return lifecycle;\n  }\n\n  public void setArgs(List<String> args) {\n    this.args = args;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof CheContainer)) {\n      return false;\n    }\n    CheContainer that = (CheContainer) o;\n    return Objects.equals(getImage(), that.getImage())\n        && Objects.equals(getEnv(), that.getEnv())\n        && Objects.equals(getCommands(), that.getCommands())\n        && Objects.equals(getVolumes(), that.getVolumes())\n        && Objects.equals(getPorts(), that.getPorts())\n        && Objects.equals(getMemoryLimit(), that.getMemoryLimit())\n        && Objects.equals(getMemoryRequest(), that.getMemoryRequest())\n        && Objects.equals(getCpuLimit(), that.getCpuLimit())\n        && Objects.equals(getCpuRequest(), that.getCpuRequest())\n        && Objects.equals(getName(), that.getName())\n        && isMountSources() == that.isMountSources()\n        && Objects.equals(getCommand(), that.getCommand())\n        && Objects.equals(getArgs(), that.getArgs());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(\n        getImage(),\n        getEnv(),\n        getCommands(),\n        getVolumes(),\n        getPorts(),\n        getMemoryLimit(),\n        getMemoryRequest(),\n        getCpuLimit(),\n        getCpuRequest(),\n        getName(),\n        isMountSources(),\n        getCommand(),\n        getArgs());\n  }\n\n  @Override\n  public String toString() {\n    return \"CheContainer{\"\n        + \"image='\"\n        + image\n        + '\\''\n        + \", env=\"\n        + env\n        + \", commands=\"\n        + commands\n        + \", volumes=\"\n        + volumes\n        + \", ports=\"\n        + ports\n        + \", memoryLimit=\"\n        + memoryLimit\n        + \", memoryRequest=\"\n        + memoryRequest\n        + \", cpuLimit=\"\n        + cpuLimit\n        + \", cpuRequest=\"\n        + cpuRequest\n        + \", name=\"\n        + name\n        + \", mountSources=\"\n        + mountSources\n        + \", command=\"\n        + command\n        + \", args=\"\n        + args\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/model/CheContainerPort.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins.model;\n\nimport java.util.Objects;\n\npublic class CheContainerPort {\n  public int exposedPort = 0;\n\n  public CheContainerPort exposedPort(int exposedPort) {\n    this.exposedPort = exposedPort;\n    return this;\n  }\n\n  public int getExposedPort() {\n    return exposedPort;\n  }\n\n  public void setExposedPort(int exposedPort) {\n    this.exposedPort = exposedPort;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof CheContainerPort)) {\n      return false;\n    }\n    CheContainerPort that = (CheContainerPort) o;\n    return Objects.equals(getExposedPort(), that.getExposedPort());\n  }\n\n  @Override\n  public int hashCode() {\n\n    return Objects.hash(getExposedPort());\n  }\n\n  @Override\n  public String toString() {\n    return \"CheContainerPort{\" + \"exposedPort='\" + exposedPort + '\\'' + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/model/ChePlugin.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins.model;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\n\n/** Represents Che plugin in sidecar-powered workspace. */\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class ChePlugin {\n\n  private String name = null;\n  private String publisher = null;\n  private String id = null;\n  private String version = null;\n  private List<CheContainer> containers = new ArrayList<>();\n  private List<CheContainer> initContainers;\n\n  private List<ChePluginEndpoint> endpoints = new ArrayList<>();\n\n  @JsonProperty(\"workspaceEnv\")\n  private List<EnvVar> workspaceEnv = new ArrayList<>();\n\n  /** Object name. Name must be unique. */\n  public ChePlugin name(String name) {\n    this.name = name;\n    return this;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  public ChePlugin id(String id) {\n    this.id = id;\n    return this;\n  }\n\n  public String getId() {\n    return id;\n  }\n\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  public ChePlugin version(String version) {\n    this.version = version;\n    return this;\n  }\n\n  public String getPublisher() {\n    return publisher;\n  }\n\n  public void setPublisher(String publisher) {\n    this.publisher = publisher;\n  }\n\n  public ChePlugin publisher(String publisher) {\n    this.publisher = publisher;\n    return this;\n  }\n\n  public String getVersion() {\n    return version;\n  }\n\n  public void setVersion(String version) {\n    this.version = version;\n  }\n\n  public ChePlugin containers(List<CheContainer> containers) {\n    this.containers = containers;\n    return this;\n  }\n\n  public List<CheContainer> getContainers() {\n    if (containers == null) {\n      containers = new ArrayList<>();\n    }\n    return containers;\n  }\n\n  public void setContainers(List<CheContainer> containers) {\n    this.containers = containers;\n  }\n\n  public ChePlugin initContainers(List<CheContainer> initContainers) {\n    this.initContainers = initContainers;\n    return this;\n  }\n\n  public List<CheContainer> getInitContainers() {\n    if (initContainers == null) {\n      initContainers = new ArrayList<>();\n    }\n    return initContainers;\n  }\n\n  public void setInitContainers(List<CheContainer> initContainers) {\n    this.initContainers = initContainers;\n  }\n\n  public ChePlugin endpoints(List<ChePluginEndpoint> endpoints) {\n    this.endpoints = endpoints;\n    return this;\n  }\n\n  public List<ChePluginEndpoint> getEndpoints() {\n    if (endpoints == null) {\n      endpoints = new ArrayList<>();\n    }\n    return endpoints;\n  }\n\n  public void setEndpoints(List<ChePluginEndpoint> endpoints) {\n    this.endpoints = endpoints;\n  }\n\n  /** List of environment variables to set in all the containers of a workspace */\n  public ChePlugin workspaceEnv(List<EnvVar> workspaceEnv) {\n    this.workspaceEnv = workspaceEnv;\n    return this;\n  }\n\n  public List<EnvVar> getWorkspaceEnv() {\n    if (workspaceEnv == null) {\n      workspaceEnv = new ArrayList<>();\n    }\n    return workspaceEnv;\n  }\n\n  public void setWorkspaceEnv(List<EnvVar> workspaceEnv) {\n    this.workspaceEnv = workspaceEnv;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof ChePlugin)) {\n      return false;\n    }\n    ChePlugin chePlugin = (ChePlugin) o;\n    return Objects.equals(getName(), chePlugin.getName())\n        && Objects.equals(getPublisher(), chePlugin.getPublisher())\n        && Objects.equals(getId(), chePlugin.getId())\n        && Objects.equals(getVersion(), chePlugin.getVersion())\n        && Objects.equals(getContainers(), chePlugin.getContainers())\n        && Objects.equals(getEndpoints(), chePlugin.getEndpoints())\n        && Objects.equals(getWorkspaceEnv(), chePlugin.getWorkspaceEnv())\n        && Objects.equals(getInitContainers(), chePlugin.getInitContainers());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(\n        getName(),\n        getPublisher(),\n        getId(),\n        getVersion(),\n        getContainers(),\n        getInitContainers(),\n        getEndpoints(),\n        getWorkspaceEnv());\n  }\n\n  @Override\n  public String toString() {\n    return \"ChePlugin{\"\n        + \"name='\"\n        + name\n        + '\\''\n        + \", publisher='\"\n        + publisher\n        + '\\''\n        + \", id='\"\n        + id\n        + '\\''\n        + \", version='\"\n        + version\n        + '\\''\n        + \", containers=\"\n        + containers\n        + \", init containers=\"\n        + initContainers\n        + \", endpoints=\"\n        + endpoints\n        + \", workspaceEnv=\"\n        + workspaceEnv\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/model/ChePluginEndpoint.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins.model;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\n\n/**\n * Represents a network endpoint that can be accessed by clients inside or outside of workspace.\n *\n * <p>Whether an endpoint is accessible from the outside of a workspace is defined by {@link\n * #isPublic()} method.\n */\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class ChePluginEndpoint {\n\n  private String name = null;\n\n  @JsonProperty(\"public\")\n  private boolean isPublic = false;\n\n  private int targetPort = 0;\n  private Map<String, String> attributes = new HashMap<>();\n\n  public ChePluginEndpoint name(String name) {\n    this.name = name;\n    return this;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  public boolean isPublic() {\n    return isPublic;\n  }\n\n  public ChePluginEndpoint setPublic(boolean isPublic) {\n    this.isPublic = isPublic;\n    return this;\n  }\n\n  public ChePluginEndpoint targetPort(int targetPort) {\n    this.targetPort = targetPort;\n    return this;\n  }\n\n  public int getTargetPort() {\n    return targetPort;\n  }\n\n  public void setTargetPort(int targetPort) {\n    this.targetPort = targetPort;\n  }\n\n  public ChePluginEndpoint attributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n    return this;\n  }\n\n  public Map<String, String> getAttributes() {\n    if (attributes == null) {\n      attributes = new HashMap<>();\n    }\n    return attributes;\n  }\n\n  public void setAttributes(Map<String, String> attributes) {\n    this.attributes = attributes;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof ChePluginEndpoint)) {\n      return false;\n    }\n    ChePluginEndpoint that = (ChePluginEndpoint) o;\n    return isPublic() == that.isPublic()\n        && Objects.equals(getName(), that.getName())\n        && Objects.equals(getTargetPort(), that.getTargetPort())\n        && Objects.equals(getAttributes(), that.getAttributes());\n  }\n\n  @Override\n  public int hashCode() {\n\n    return Objects.hash(getName(), isPublic(), getTargetPort(), getAttributes());\n  }\n\n  @Override\n  public String toString() {\n    return \"ChePluginEndpoint{\"\n        + \"name='\"\n        + name\n        + '\\''\n        + \", isPlugin=\"\n        + isPublic\n        + \", targetPort='\"\n        + targetPort\n        + '\\''\n        + \", attributes=\"\n        + attributes\n        + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/model/Command.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins.model;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\n\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class Command {\n\n  private String name = null;\n\n  @JsonProperty(\"workingDir\")\n  private String workingDir = null;\n\n  private List<String> command = new ArrayList<String>();\n\n  /** */\n  public Command name(String name) {\n    this.name = name;\n    return this;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  /** */\n  public Command workingDir(String workingDir) {\n    this.workingDir = workingDir;\n    return this;\n  }\n\n  public String getWorkingDir() {\n    return workingDir;\n  }\n\n  public void setWorkingDir(String workingDir) {\n    this.workingDir = workingDir;\n  }\n\n  /** */\n  public Command command(List<String> command) {\n    this.command = command;\n    return this;\n  }\n\n  public List<String> getCommand() {\n    if (command == null) {\n      command = new ArrayList<>();\n    }\n    return command;\n  }\n\n  public void setCommand(List<String> command) {\n    this.command = command;\n  }\n\n  @Override\n  public boolean equals(java.lang.Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    Command command = (Command) o;\n    return Objects.equals(name, command.name)\n        && Objects.equals(workingDir, command.workingDir)\n        && Objects.equals(command, command.command);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(name, workingDir, command);\n  }\n\n  @Override\n  public String toString() {\n    StringBuilder sb = new StringBuilder();\n    sb.append(\"class Command {\\n\");\n\n    sb.append(\"    name: \").append(toIndentedString(name)).append(\"\\n\");\n    sb.append(\"    workingDir: \").append(toIndentedString(workingDir)).append(\"\\n\");\n    sb.append(\"    command: \").append(toIndentedString(command)).append(\"\\n\");\n    sb.append(\"}\");\n    return sb.toString();\n  }\n\n  /**\n   * Convert the given object to string with each line indented by 4 spaces (except the first line).\n   */\n  private String toIndentedString(java.lang.Object o) {\n    if (o == null) {\n      return \"null\";\n    }\n    return o.toString().replace(\"\\n\", \"\\n    \");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/model/EnvVar.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins.model;\n\nimport java.util.Objects;\n\n/** EnvVar represents an environment variable present in a Container. */\npublic class EnvVar {\n\n  private String name = null;\n  private String value = null;\n\n  /** Name of the environment variable. Must be a C_IDENTIFIER. */\n  public EnvVar name(String name) {\n    this.name = name;\n    return this;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  /**\n   * Variable references $(VAR_NAME) are expanded using the previous defined environment variables\n   * in the container and any service environment variables. If a variable cannot be resolved, the\n   * reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a\n   * double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether\n   * the variable exists or not. Defaults to \\&quot;\\&quot;.\n   */\n  public EnvVar value(String value) {\n    this.value = value;\n    return this;\n  }\n\n  public String getValue() {\n    return value;\n  }\n\n  public void setValue(String value) {\n    this.value = value;\n  }\n\n  @Override\n  public boolean equals(java.lang.Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    EnvVar envVar = (EnvVar) o;\n    return Objects.equals(name, envVar.name) && Objects.equals(value, envVar.value);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(name, value);\n  }\n\n  @Override\n  public String toString() {\n    StringBuilder sb = new StringBuilder();\n    sb.append(\"class EnvVar {\\n\");\n\n    sb.append(\"    name: \").append(toIndentedString(name)).append(\"\\n\");\n    sb.append(\"    value: \").append(toIndentedString(value)).append(\"\\n\");\n    sb.append(\"}\");\n    return sb.toString();\n  }\n\n  /**\n   * Convert the given object to string with each line indented by 4 spaces (except the first line).\n   */\n  private String toIndentedString(java.lang.Object o) {\n    if (o == null) {\n      return \"null\";\n    }\n    return o.toString().replace(\"\\n\", \"\\n    \");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/model/Exec.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins.model;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * Exec describes a \"run in container\" action. Command is the command line to execute inside the\n * container, the working directory for the command is root ('/') in the container's filesystem. T\n * he command is simply exec'd, it is not run inside a shell, so traditional shell instructions\n * ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status\n * of 0 is treated as live/healthy and non-zero is unhealthy.\n */\npublic class Exec {\n\n  @JsonProperty(\"command\")\n  private List<String> command;\n\n  public Exec command(List<String> commands) {\n    this.command = commands;\n    return this;\n  }\n\n  public List<String> getCommand() {\n    if (command == null) {\n      command = new ArrayList<>();\n    }\n    return command;\n  }\n\n  public void setCommand(List<String> command) {\n    this.command = command;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    Exec that = (Exec) o;\n    return Objects.equals(getCommand(), that.getCommand());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(command);\n  }\n\n  @Override\n  public String toString() {\n    return \"Exec{\" + \"command=\" + command + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/model/ExtendedPluginFQN.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins.model;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport java.net.URI;\nimport java.util.Objects;\n\n/**\n * Represents extended information about plugin identification.\n *\n * @author Oleksandr Garagatyi\n * @see PluginFQN\n */\npublic class ExtendedPluginFQN extends PluginFQN {\n\n  private String name;\n  private String version;\n  private String publisher;\n\n  public ExtendedPluginFQN(URI registry, String id, String publisher, String name, String version) {\n    super(registry, id);\n    this.publisher = publisher;\n    this.name = name;\n    this.version = version;\n  }\n\n  /** In this constructor, id is composed from given params */\n  public ExtendedPluginFQN(String reference, String publisher, String name, String version) {\n    super(reference, publisher + \"/\" + name + \"/\" + version);\n    this.publisher = publisher;\n    this.name = name;\n    this.version = version;\n  }\n\n  public ExtendedPluginFQN(String reference) {\n    super(reference);\n  }\n\n  public String getPublisher() {\n    return publisher;\n  }\n\n  public void setPublisher(String publisher) {\n    this.publisher = publisher;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  public String getVersion() {\n    return version;\n  }\n\n  public void setVersion(String version) {\n    this.version = version;\n  }\n\n  @JsonIgnore\n  public String getPublisherAndName() {\n    return publisher + \"/\" + name;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (!(o instanceof ExtendedPluginFQN)) {\n      return false;\n    }\n    if (!super.equals(o)) {\n      return false;\n    }\n    ExtendedPluginFQN that = (ExtendedPluginFQN) o;\n    return Objects.equals(getName(), that.getName())\n        && Objects.equals(getVersion(), that.getVersion())\n        && Objects.equals(getPublisher(), that.getPublisher());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(super.hashCode(), getName(), getVersion(), getPublisher());\n  }\n\n  @Override\n  public String toString() {\n    return String.format(\n        \"{id:%s, registry:%s, publisher:%s, name:%s, version:%s, reference:%s}\",\n        getId(), getRegistry(), getPublisher(), getName(), getVersion(), getReference());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/model/Handler.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins.model;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport java.util.Objects;\n\n/** Handler defines a specific action that should be taken on postStart or preStop. */\npublic class Handler {\n\n  @JsonProperty(\"exec\")\n  private Exec exec;\n\n  public Handler exec(Exec exec) {\n    this.exec = exec;\n    return this;\n  }\n\n  public Exec getExec() {\n    return exec;\n  }\n\n  public void setExec(Exec exec) {\n    this.exec = exec;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    Handler that = (Handler) o;\n    return Objects.equals(getExec(), that.getExec());\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(exec);\n  }\n\n  @Override\n  public String toString() {\n    return \"Handler{\" + \"exec=\" + exec + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/model/Lifecycle.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins.model;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport java.util.Objects;\n\n/**\n * Lifecycle describes actions that the management system should take in response to container\n * lifecycle events.\n *\n * <p>For the PostStart and PreStop lifecycle handlers, management of the container blocks until the\n * action is complete, unless the container process fails, in which case the handler is aborted.\n *\n * <p>PostStart is called immediately after a container is created. If the handler fails, the\n * container is terminated and restarted according to its restart policy. Other management of the\n * container blocks until the hook completes. More info:\n * https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n *\n * <p>PreStop is called immediately before a container is terminated due to an API request or\n * management event such as liveness/startup probe failure, preemption, resource contention, etc.\n * The handler is not called if the container crashes or exits. The reason for termination is passed\n * to the handler. The Pod's termination grace period countdown begins before the PreStop hooked is\n * executed. Regardless of the outcome of the handler, the container will eventually terminate\n * within the Pod's termination grace period. Other management of the container blocks until the\n * hook completes or until the termination grace period is reached. More info:\n * https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n */\npublic class Lifecycle {\n\n  @JsonProperty(\"preStop\")\n  private Handler preStop = new Handler();\n\n  @JsonProperty(\"postStart\")\n  private Handler postStart = new Handler();\n\n  public Lifecycle preStop(Handler preStop) {\n    this.preStop = preStop;\n    return this;\n  }\n\n  public Handler getPreStop() {\n    return preStop;\n  }\n\n  public void setPreStop(Handler preStop) {\n    this.preStop = preStop;\n  }\n\n  public Lifecycle postStart(Handler postStart) {\n    this.postStart = postStart;\n    return this;\n  }\n\n  public Handler getPostStart() {\n    return postStart;\n  }\n\n  public void setPostStart(Handler postStart) {\n    this.postStart = postStart;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    Lifecycle that = (Lifecycle) o;\n    return Objects.equals(preStop, that.preStop) && Objects.equals(postStart, that.postStart);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(postStart, preStop);\n  }\n\n  @Override\n  public String toString() {\n    return \"Lifecycle{\" + \"postStart=\" + postStart + \", preStop=\" + preStop + '}';\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/model/PluginFQN.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins.model;\n\nimport com.fasterxml.jackson.annotation.JsonInclude;\nimport com.fasterxml.jackson.annotation.JsonInclude.Include;\nimport java.net.URI;\nimport java.util.Objects;\n\n/**\n * Represents full information about plugin, including registry address and id, or direct reference\n * to plugin descriptor. When {@link PluginFQN#reference} and {@link PluginFQN#id} are set\n * simultaneously, {@link PluginFQN#reference} should take precedence.\n *\n * @author Max Shaposhnyk\n */\n@JsonInclude(Include.NON_NULL)\npublic class PluginFQN {\n\n  private URI registry;\n  private String id;\n  private String reference;\n\n  public PluginFQN(URI registry, String id) {\n    this.registry = registry;\n    this.id = id;\n  }\n\n  protected PluginFQN(String reference, String id) {\n    this.reference = reference;\n    this.id = id;\n  }\n\n  public PluginFQN(String reference) {\n    this.reference = reference;\n  }\n\n  public URI getRegistry() {\n    return registry;\n  }\n\n  public void setRegistry(URI registry) {\n    this.registry = registry;\n  }\n\n  public String getId() {\n    return id;\n  }\n\n  public void setId(String id) {\n    this.id = id;\n  }\n\n  public String getReference() {\n    return reference;\n  }\n\n  public void setReference(String reference) {\n    this.reference = reference;\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(getRegistry(), getId(), getReference());\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof PluginFQN)) {\n      return false;\n    }\n    PluginFQN other = (PluginFQN) obj;\n    return Objects.equals(getId(), other.getId())\n        && Objects.equals(getRegistry(), other.getRegistry())\n        && Objects.equals(getReference(), other.getReference());\n  }\n\n  @Override\n  public String toString() {\n    return String.format(\n        \"{id:%s, registry:%s, reference:%s}\", this.id, this.registry, this.reference);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/wsplugins/model/Volume.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins.model;\n\nimport java.util.Objects;\n\npublic class Volume {\n\n  private String name = null;\n  private String mountPath = null;\n  private boolean ephemeral;\n\n  /** */\n  public Volume name(String name) {\n    this.name = name;\n    return this;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  /** mountPath of the volume in running container */\n  public Volume mountPath(String path) {\n    this.mountPath = path;\n    return this;\n  }\n\n  public String getMountPath() {\n    return mountPath;\n  }\n\n  public void setMountPath(String mountPath) {\n    this.mountPath = mountPath;\n  }\n\n  public Volume ephemeral(boolean ephemeral) {\n    this.ephemeral = ephemeral;\n    return this;\n  }\n\n  public boolean isEphemeral() {\n    return ephemeral;\n  }\n\n  public void setEphemeral(boolean ephemeral) {\n    this.ephemeral = ephemeral;\n  }\n\n  @Override\n  public boolean equals(java.lang.Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    Volume volume = (Volume) o;\n    return Objects.equals(name, volume.name)\n        && Objects.equals(mountPath, volume.mountPath)\n        && Objects.equals(ephemeral, volume.ephemeral);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(name, mountPath, ephemeral);\n  }\n\n  @Override\n  public String toString() {\n    StringBuilder sb = new StringBuilder();\n    sb.append(\"class Volume {\\n\");\n    sb.append(\"    name: \").append(toIndentedString(name)).append(\"\\n\");\n    sb.append(\"    mountPath: \").append(toIndentedString(mountPath)).append(\"\\n\");\n    sb.append(\"    ephemeral: \").append(toIndentedString(ephemeral)).append(\"\\n\");\n    sb.append(\"}\");\n    return sb.toString();\n  }\n\n  /**\n   * Convert the given object to string with each line indented by 4 spaces (except the first line).\n   */\n  private String toIndentedString(java.lang.Object o) {\n    if (o == null) {\n      return \"null\";\n    }\n    return o.toString().replace(\"\\n\", \"\\n    \");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/PreviewUrlLinksVariableGeneratorTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport static java.util.Collections.singletonList;\nimport static org.testng.Assert.*;\n\nimport jakarta.ws.rs.core.UriBuilder;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.RuntimeImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.PreviewUrlImpl;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\npublic class PreviewUrlLinksVariableGeneratorTest {\n\n  private PreviewUrlLinksVariableGenerator generator;\n  private UriBuilder uriBuilder;\n\n  @BeforeMethod\n  public void setUp() {\n    generator = new PreviewUrlLinksVariableGenerator();\n    uriBuilder = UriBuilder.fromUri(\"http://host/path\");\n  }\n\n  @Test\n  public void shouldDoNothingWhenSomethingIsNull() {\n    assertTrue(generator.genLinksMapAndUpdateCommands(null, null).isEmpty());\n  }\n\n  @Test\n  public void shouldDoNothingWhenRuntimeIsNull() {\n    WorkspaceImpl w = new WorkspaceImpl();\n    w.setRuntime(null);\n\n    assertTrue(generator.genLinksMapAndUpdateCommands(w, uriBuilder).isEmpty());\n  }\n\n  @Test\n  public void shouldDoNothingWhenCommandsIsNull() {\n    WorkspaceImpl w = createWorkspaceWithCommands(null);\n\n    assertTrue(generator.genLinksMapAndUpdateCommands(w, uriBuilder).isEmpty());\n  }\n\n  @Test\n  public void shouldDoNothingWhenNoCommandWithPreviewUrl() {\n    WorkspaceImpl w = createWorkspaceWithCommands(singletonList(new CommandImpl(\"a\", \"a\", \"a\")));\n\n    assertTrue(generator.genLinksMapAndUpdateCommands(w, uriBuilder).isEmpty());\n  }\n\n  @Test\n  public void shouldDoNothingWhenNoCommandWithPreviewurlAttribute() {\n    CommandImpl command =\n        new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(123, null), Collections.emptyMap());\n    WorkspaceImpl w = createWorkspaceWithCommands(singletonList(command));\n\n    assertTrue(generator.genLinksMapAndUpdateCommands(w, uriBuilder).isEmpty());\n  }\n\n  @Test\n  public void shouldUpdateCommandAndReturnLinkMapWhenPreviewUrlFound() {\n    Map<String, String> commandAttrs = new HashMap<>();\n    commandAttrs.put(Command.PREVIEW_URL_ATTRIBUTE, \"preview_url_host\");\n    CommandImpl command =\n        new CommandImpl(\"a\", \"a\", \"a\", new PreviewUrlImpl(123, null), commandAttrs);\n    WorkspaceImpl w =\n        createWorkspaceWithCommands(Arrays.asList(command, new CommandImpl(\"b\", \"b\", \"b\")));\n\n    Map<String, String> linkMap = generator.genLinksMapAndUpdateCommands(w, uriBuilder);\n    assertEquals(linkMap.size(), 1);\n    assertEquals(linkMap.values().iterator().next(), \"http://preview_url_host\");\n    String varKey = linkMap.keySet().iterator().next();\n    assertTrue(varKey.startsWith(\"previewurl/\"));\n\n    Command aCommand =\n        w.getRuntime().getCommands().stream()\n            .filter(c -> c.getName().equals(\"a\"))\n            .findFirst()\n            .get();\n\n    assertTrue(aCommand.getAttributes().get(Command.PREVIEW_URL_ATTRIBUTE).contains(varKey));\n    assertEquals(aCommand.getAttributes().get(Command.PREVIEW_URL_ATTRIBUTE), \"${\" + varKey + \"}\");\n  }\n\n  @Test\n  public void variableNamesForTwoCommandsWithSimilarNameMustBeDifferent() {\n    Map<String, String> commandAttrs = new HashMap<>();\n    commandAttrs.put(Command.PREVIEW_URL_ATTRIBUTE, \"preview_url_host\");\n\n    CommandImpl command =\n        new CommandImpl(\"run command\", \"a\", \"a\", new PreviewUrlImpl(123, null), commandAttrs);\n\n    CommandImpl command2 = new CommandImpl(command);\n    command2.setName(\"runcommand\");\n\n    WorkspaceImpl w = createWorkspaceWithCommands(Arrays.asList(command, command2));\n\n    Map<String, String> linkMap = generator.genLinksMapAndUpdateCommands(w, uriBuilder);\n    assertEquals(linkMap.size(), 2);\n\n    List<? extends Command> commandsAfter = w.getRuntime().getCommands();\n    assertNotEquals(\n        commandsAfter.get(1).getAttributes().get(Command.PREVIEW_URL_ATTRIBUTE),\n        commandsAfter.get(0).getAttributes().get(Command.PREVIEW_URL_ATTRIBUTE));\n  }\n\n  @Test\n  public void shouldGetHttpsWhenUriBuilderHasHttps() {\n    UriBuilder httpsUriBuilder = UriBuilder.fromUri(\"https://host/path\");\n\n    Map<String, String> commandAttrs = new HashMap<>();\n    commandAttrs.put(Command.PREVIEW_URL_ATTRIBUTE, \"preview_url_host\");\n\n    CommandImpl command =\n        new CommandImpl(\"run command\", \"a\", \"a\", new PreviewUrlImpl(123, null), commandAttrs);\n\n    Map<String, String> linkMap =\n        generator.genLinksMapAndUpdateCommands(\n            createWorkspaceWithCommands(singletonList(command)), httpsUriBuilder);\n\n    assertTrue(linkMap.values().iterator().next().startsWith(\"https://\"));\n  }\n\n  @Test\n  public void shouldAppendPathWhenDefinedInPreviewUrl() {\n    Map<String, String> commandAttrs = new HashMap<>();\n    commandAttrs.put(Command.PREVIEW_URL_ATTRIBUTE, \"preview_url_host\");\n\n    CommandImpl command =\n        new CommandImpl(\"run command\", \"a\", \"a\", new PreviewUrlImpl(123, \"testpath\"), commandAttrs);\n\n    WorkspaceImpl workspace = createWorkspaceWithCommands(singletonList(command));\n\n    Map<String, String> linkMap = generator.genLinksMapAndUpdateCommands(workspace, uriBuilder);\n\n    assertTrue(linkMap.values().iterator().next().endsWith(\"preview_url_host\"));\n    String linkKey = linkMap.keySet().iterator().next();\n    assertEquals(\n        workspace\n            .getRuntime()\n            .getCommands()\n            .get(0)\n            .getAttributes()\n            .get(Command.PREVIEW_URL_ATTRIBUTE),\n        \"${\" + linkKey + \"}testpath\");\n  }\n\n  @Test\n  public void shouldAppendQueryParamsWhenDefinedInPreviewUrl() {\n    Map<String, String> commandAttrs = new HashMap<>();\n    commandAttrs.put(Command.PREVIEW_URL_ATTRIBUTE, \"preview_url_host\");\n\n    CommandImpl command =\n        new CommandImpl(\"run command\", \"a\", \"a\", new PreviewUrlImpl(123, \"?a=b\"), commandAttrs);\n\n    WorkspaceImpl workspace = createWorkspaceWithCommands(singletonList(command));\n\n    Map<String, String> linkMap = generator.genLinksMapAndUpdateCommands(workspace, uriBuilder);\n\n    assertTrue(linkMap.values().iterator().next().endsWith(\"preview_url_host\"));\n    String linkKey = linkMap.keySet().iterator().next();\n    assertEquals(\n        workspace\n            .getRuntime()\n            .getCommands()\n            .get(0)\n            .getAttributes()\n            .get(Command.PREVIEW_URL_ATTRIBUTE),\n        \"${\" + linkKey + \"}?a=b\");\n  }\n\n  @Test\n  public void shouldAppendMultipleQueryParamsWhenDefinedInPreviewUrl() {\n    Map<String, String> commandAttrs = new HashMap<>();\n    commandAttrs.put(Command.PREVIEW_URL_ATTRIBUTE, \"preview_url_host\");\n\n    CommandImpl command =\n        new CommandImpl(\"run command\", \"a\", \"a\", new PreviewUrlImpl(123, \"?a=b&c=d\"), commandAttrs);\n\n    WorkspaceImpl workspace = createWorkspaceWithCommands(singletonList(command));\n    Map<String, String> linkMap = generator.genLinksMapAndUpdateCommands(workspace, uriBuilder);\n\n    assertTrue(linkMap.values().iterator().next().endsWith(\"preview_url_host\"));\n    String linkKey = linkMap.keySet().iterator().next();\n    assertEquals(\n        workspace\n            .getRuntime()\n            .getCommands()\n            .get(0)\n            .getAttributes()\n            .get(Command.PREVIEW_URL_ATTRIBUTE),\n        \"${\" + linkKey + \"}?a=b&c=d\");\n  }\n\n  @Test\n  public void shouldAppendPathWithQueryParamsWhenDefinedInPreviewUrl() {\n    Map<String, String> commandAttrs = new HashMap<>();\n    commandAttrs.put(Command.PREVIEW_URL_ATTRIBUTE, \"preview_url_host\");\n\n    CommandImpl command =\n        new CommandImpl(\n            \"run command\", \"a\", \"a\", new PreviewUrlImpl(123, \"/hello?a=b\"), commandAttrs);\n\n    WorkspaceImpl workspace = createWorkspaceWithCommands(singletonList(command));\n\n    Map<String, String> linkMap = generator.genLinksMapAndUpdateCommands(workspace, uriBuilder);\n\n    assertTrue(linkMap.values().iterator().next().endsWith(\"preview_url_host\"));\n    String linkKey = linkMap.keySet().iterator().next();\n    assertEquals(\n        workspace\n            .getRuntime()\n            .getCommands()\n            .get(0)\n            .getAttributes()\n            .get(Command.PREVIEW_URL_ATTRIBUTE),\n        \"${\" + linkKey + \"}/hello?a=b\");\n  }\n\n  private WorkspaceImpl createWorkspaceWithCommands(List<CommandImpl> commands) {\n    RuntimeImpl runtime =\n        new RuntimeImpl(\"\", Collections.emptyMap(), \"\", commands, new ArrayList<>());\n    WorkspaceImpl w = new WorkspaceImpl();\n    w.setRuntime(runtime);\n\n    return w;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/WorkspaceEntityProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.MultivaluedHashMap;\nimport java.io.ByteArrayInputStream;\nimport java.nio.charset.StandardCharsets;\nimport org.eclipse.che.api.workspace.server.devfile.DevfileParser;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.shared.dto.WorkspaceDto;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.DevfileDto;\nimport org.eclipse.che.dto.server.DtoFactory;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class WorkspaceEntityProviderTest {\n\n  @Mock private DevfileParser devfileParser;\n\n  @InjectMocks private WorkspaceEntityProvider workspaceEntityProvider;\n\n  @Test\n  public void shouldBuildDtoFromValidJson() throws Exception {\n\n    when(devfileParser.parseJson(anyString())).thenReturn(new DevfileImpl());\n\n    WorkspaceDto actual = newDto(WorkspaceDto.class).withDevfile(newDto(DevfileDto.class));\n\n    workspaceEntityProvider.readFrom(\n        WorkspaceDto.class,\n        WorkspaceDto.class,\n        null,\n        MediaType.APPLICATION_JSON_TYPE,\n        new MultivaluedHashMap<>(),\n        new ByteArrayInputStream(\n            DtoFactory.getInstance().toJson(actual).getBytes(StandardCharsets.UTF_8)));\n\n    verify(devfileParser).parseJson(anyString());\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/WorkspaceValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server;\n\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_REQUEST_ATTRIBUTE;\nimport static org.eclipse.che.dto.server.DtoFactory.newDto;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.eclipse.che.api.workspace.shared.dto.CommandDto;\nimport org.eclipse.che.api.workspace.shared.dto.EnvironmentDto;\nimport org.eclipse.che.api.workspace.shared.dto.MachineConfigDto;\nimport org.eclipse.che.api.workspace.shared.dto.RecipeDto;\nimport org.eclipse.che.api.workspace.shared.dto.ServerConfigDto;\nimport org.eclipse.che.api.workspace.shared.dto.VolumeDto;\nimport org.eclipse.che.api.workspace.shared.dto.WorkspaceConfigDto;\nimport org.mockito.InjectMocks;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests for {@link WorkspaceValidator}.\n *\n * @author Alexander Reshetnyak\n */\n@Listeners(MockitoTestNGListener.class)\npublic class WorkspaceValidatorTest {\n\n  @InjectMocks private WorkspaceValidator wsValidator;\n\n  @Test\n  public void shouldValidateCorrectWorkspace() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Workspace name required\")\n  public void shouldFailValidationIfNameIsNull() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    config.withName(null);\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      dataProvider = \"invalidNameProvider\",\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Incorrect workspace name, it must be between 3 and 100 \"\n              + \"characters and may contain digits, latin letters, underscores, dots, dashes and must \"\n              + \"start and end only with digits, latin letters or underscores\")\n  public void shouldFailValidationIfNameIsInvalid(String name) throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    config.withName(name);\n\n    wsValidator.validateConfig(config);\n  }\n\n  @DataProvider(name = \"invalidNameProvider\")\n  public static Object[][] invalidNameProvider() {\n    return new Object[][] {\n      {\".name\"},\n      {\"name.\"},\n      {\"-name\"},\n      {\"name-\"},\n      {\n        \"long-name1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\"\n      },\n      {\"_name\"},\n      {\"name_\"}\n    };\n  }\n\n  @Test(dataProvider = \"validNameProvider\")\n  public void shouldValidateCorrectWorkspaceName(String name) throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    config.withName(name);\n\n    wsValidator.validateConfig(config);\n  }\n\n  @DataProvider(name = \"validNameProvider\")\n  public static Object[][] validNameProvider() {\n    return new Object[][] {\n      {\"name\"},\n      {\"quiteLongName1234567\"},\n      {\"name-with-dashes\"},\n      {\"name.with.dots\"},\n      {\"name0with1digits\"},\n      {\"mixed-symbols.name12\"},\n      {\"123456\"},\n      {\"name_name\"},\n      {\"123-456.78\"}\n    };\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Attribute name 'null' is not valid\")\n  public void shouldFailValidationIfAttributeNameIsNull() throws Exception {\n    Map<String, String> attributes = new HashMap<>();\n    attributes.put(null, \"value1\");\n\n    wsValidator.validateAttributes(attributes);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Attribute name '' is not valid\")\n  public void shouldFailValidationIfAttributeNameIsEmpty() throws Exception {\n    wsValidator.validateAttributes(ImmutableMap.of(\"\", \"value1\"));\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Attribute name 'codenvy_key' is not valid\")\n  public void shouldFailValidationIfAttributeNameStartsWithWordCodenvy() throws Exception {\n    wsValidator.validateAttributes(ImmutableMap.of(\"codenvy_key\", \"value1\"));\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Workspace default environment name required\")\n  public void shouldFailValidationOfChe6WSIfDefaultEnvNameIsNull() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    config.setDefaultEnv(null);\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Workspace default environment name required\")\n  public void shouldFailValidationOfChe6WSIfDefaultEnvNameIsEmpty() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    config.setDefaultEnv(\"\");\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test\n  public void shouldNotFailValidationOfChe7WSIfDefaultEnvNameIsNullAndNoEnvIsPresent()\n      throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    config.setDefaultEnv(null);\n    config.getEnvironments().clear();\n    config.getAttributes().put(Constants.WORKSPACE_TOOLING_EDITOR_ATTRIBUTE, \"something\");\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Workspace default environment configuration required\")\n  public void shouldFailValidationIfEnvWithDefaultEnvNameIsNull() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    config.setEnvironments(null);\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Workspace ws-name contains command with null or empty name\")\n  public void shouldFailValidationIfCommandNameIsNull() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    config.getCommands().get(0).withName(null);\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Value '.*' of attribute '\" + MEMORY_LIMIT_ATTRIBUTE + \"' in machine '.*' is illegal\",\n      dataProvider = \"illegalMemoryAttributeValueProvider\")\n  public void shouldFailValidationIfMemoryLimitMachineAttributeHasIllegalValue(\n      String attributeValue) throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    EnvironmentDto env = config.getEnvironments().values().iterator().next();\n    MachineConfigDto machine = env.getMachines().values().iterator().next();\n    machine.getAttributes().put(MEMORY_LIMIT_ATTRIBUTE, attributeValue);\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Value '.*' of attribute '\" + MEMORY_REQUEST_ATTRIBUTE + \"' in machine '.*' is illegal\",\n      dataProvider = \"illegalMemoryAttributeValueProvider\")\n  public void shouldFailValidationIfMemoryRequestMachineAttributeHasIllegalValue(\n      String attributeValue) throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    EnvironmentDto env = config.getEnvironments().values().iterator().next();\n    MachineConfigDto machine = env.getMachines().values().iterator().next();\n    machine.getAttributes().put(MEMORY_REQUEST_ATTRIBUTE, attributeValue);\n\n    wsValidator.validateConfig(config);\n  }\n\n  @DataProvider(name = \"illegalMemoryAttributeValueProvider\")\n  public static Object[][] illegalMemoryAttributeValueProvider() {\n    return new Object[][] {{\"text\"}, {\"\"}, {\"123MB\"}, {\"123GB\"}, {\"123KB\"}};\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Workspace ws-name contains command with null or empty name\")\n  public void shouldFailValidationIfCommandNameIsEmpty() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    config.getCommands().get(0).withName(null);\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Command line or content required for command '.*' in workspace '.*'\\\\.\")\n  public void shouldFailValidationIfCommandLineIsNull() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    config.getCommands().get(0).withCommandLine(null);\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Command line or content required for command '.*' in workspace '.*'\\\\.\")\n  public void shouldFailValidationIfCommandLineIsEmpty() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    config.getCommands().get(0).withCommandLine(\"\");\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Volume name '.*' in machine '.*' is invalid\",\n      dataProvider = \"illegalVolumeNameProvider\")\n  public void shouldFailValidationIfVolumeNameDoesNotMatchCriteria(String volumeName)\n      throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    EnvironmentDto env = config.getEnvironments().values().iterator().next();\n    MachineConfigDto machine = env.getMachines().values().iterator().next();\n    machine.getVolumes().put(volumeName, newDto(VolumeDto.class).withPath(\"/path\"));\n\n    wsValidator.validateConfig(config);\n  }\n\n  @DataProvider(name = \"illegalVolumeNameProvider\")\n  public static Object[][] illegalVolumeNameProvider() {\n    return new Object[][] {\n      {\"0begin_with_number\"},\n      {\"begin_with_dot.\"},\n      {\"begin_with_underscore_\"},\n      {\"begin_with_hyphen-\"},\n      {\"with_@_special_char\"},\n      {\"with_@_special_char\"},\n      {\"veryveryveryveryveryveryverylongname\"},\n      {\"volume/name\"},\n    };\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Path of volume '.*' in machine '.*' is invalid. It should not be empty\")\n  public void shouldFailValidationIfVolumeValueIsEmpty() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    EnvironmentDto env = config.getEnvironments().values().iterator().next();\n    MachineConfigDto machine = env.getMachines().values().iterator().next();\n    machine.getVolumes().put(\"volume1\", null);\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Path of volume '.*' in machine '.*' is invalid. It should not be empty\")\n  public void shouldFailValidationIfVolumePathIsEmpty() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    EnvironmentDto env = config.getEnvironments().values().iterator().next();\n    MachineConfigDto machine = env.getMachines().values().iterator().next();\n    machine.getVolumes().put(\"volume1\", newDto(VolumeDto.class).withPath(\"\"));\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Path of volume '.*' in machine '.*' is invalid. It should not be empty\")\n  public void shouldFailValidationIfVolumePathIsNull() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    EnvironmentDto env = config.getEnvironments().values().iterator().next();\n    MachineConfigDto machine = env.getMachines().values().iterator().next();\n    machine.getVolumes().put(\"volume1\", newDto(VolumeDto.class).withPath(null));\n\n    wsValidator.validateConfig(config);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Path '.*' of volume '.*' in machine '.*' is invalid. It should be absolute\")\n  public void shouldFailValidationIfVolumePathIsNotAbsolute() throws Exception {\n    final WorkspaceConfigDto config = createConfig();\n    EnvironmentDto env = config.getEnvironments().values().iterator().next();\n    MachineConfigDto machine = env.getMachines().values().iterator().next();\n    machine.getVolumes().put(\"volume1\", newDto(VolumeDto.class).withPath(\"not/absolute/path\"));\n\n    wsValidator.validateConfig(config);\n  }\n\n  private static WorkspaceConfigDto createConfig() {\n    final WorkspaceConfigDto workspaceConfigDto =\n        newDto(WorkspaceConfigDto.class).withName(\"ws-name\").withDefaultEnv(\"dev-env\");\n\n    MachineConfigDto machineConfig =\n        newDto(MachineConfigDto.class)\n            .withServers(\n                singletonMap(\n                    \"ref1\",\n                    newDto(ServerConfigDto.class)\n                        .withPort(\"8080/tcp\")\n                        .withProtocol(\"https\")\n                        .withAttributes(singletonMap(\"key\", \"value\"))))\n            .withAttributes(new HashMap<>(singletonMap(MEMORY_LIMIT_ATTRIBUTE, \"1000000\")));\n    EnvironmentDto env =\n        newDto(EnvironmentDto.class)\n            .withMachines(singletonMap(\"devmachine1\", machineConfig))\n            .withRecipe(\n                newDto(RecipeDto.class)\n                    .withType(\"type\")\n                    .withContent(\"content\")\n                    .withContentType(\"content type\"));\n    workspaceConfigDto.setEnvironments(new HashMap<>(singletonMap(\"dev-env\", env)));\n\n    List<CommandDto> commandDtos = new ArrayList<>();\n    commandDtos.add(\n        newDto(CommandDto.class)\n            .withName(\"command_name\")\n            .withType(\"maven\")\n            .withCommandLine(\"mvn clean install\")\n            .withAttributes(\n                new HashMap<>(singletonMap(\"cmd-attribute-name\", \"cmd-attribute-value\"))));\n    workspaceConfigDto.setCommands(commandDtos);\n\n    return workspaceConfigDto;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/DevfileEntityProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\n\nimport jakarta.ws.rs.NotSupportedException;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.MultivaluedHashMap;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.DevfileDto;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class DevfileEntityProviderTest {\n\n  @Mock private DevfileParser devfileParser;\n\n  @InjectMocks private DevfileEntityProvider devfileEntityProvider;\n\n  @Test\n  public void shouldBuildDtoFromValidYaml() throws Exception {\n\n    when(devfileParser.parseYaml(anyString())).thenReturn(new DevfileImpl());\n\n    devfileEntityProvider.readFrom(\n        DevfileDto.class,\n        DevfileDto.class,\n        null,\n        MediaType.valueOf(\"text/x-yaml\"),\n        new MultivaluedHashMap<>(),\n        getClass().getClassLoader().getResourceAsStream(\"devfile/devfile.yaml\"));\n\n    verify(devfileParser).parseYaml(anyString());\n  }\n\n  @Test\n  public void shouldBuildDtoFromValidJson() throws Exception {\n\n    when(devfileParser.parseJson(anyString())).thenReturn(new DevfileImpl());\n\n    devfileEntityProvider.readFrom(\n        DevfileDto.class,\n        DevfileDto.class,\n        null,\n        MediaType.APPLICATION_JSON_TYPE,\n        new MultivaluedHashMap<>(),\n        getClass().getClassLoader().getResourceAsStream(\"devfile/devfile.json\"));\n\n    verify(devfileParser).parseJson(anyString());\n  }\n\n  @Test(\n      expectedExceptions = NotSupportedException.class,\n      expectedExceptionsMessageRegExp = \"Unknown media type text/plain\")\n  public void shouldThrowErrorOnInvalidMediaType() throws Exception {\n\n    devfileEntityProvider.readFrom(\n        DevfileDto.class,\n        DevfileDto.class,\n        null,\n        MediaType.TEXT_PLAIN_TYPE,\n        new MultivaluedHashMap<>(),\n        getClass().getClassLoader().getResourceAsStream(\"devfile/devfile.json\"));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/DevfileParserTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNotNull;\n\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.core.type.TypeReference;\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport java.io.IOException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.api.workspace.server.devfile.validator.DevfileIntegrityValidator;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ActionImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EndpointImpl;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class DevfileParserTest {\n\n  private static final String DEVFILE_YAML_CONTENT = \"devfile yaml stub\";\n  @Mock private DevfileIntegrityValidator integrityValidator;\n  @Mock private ObjectMapper jsonMapper;\n  @Mock private ObjectMapper yamlMapper;\n  @Mock private FileContentProvider contentProvider;\n\n  @Mock private JsonNode devfileJsonNode;\n  private DevfileImpl devfile;\n\n  private DevfileParser devfileParser;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    devfile = new DevfileImpl();\n    devfileParser = new DevfileParser(integrityValidator, yamlMapper, jsonMapper);\n\n    lenient().when(jsonMapper.treeToValue(any(), eq(DevfileImpl.class))).thenReturn(devfile);\n    lenient().when(yamlMapper.treeToValue(any(), eq(DevfileImpl.class))).thenReturn(devfile);\n    lenient().when(yamlMapper.readTree(anyString())).thenReturn(devfileJsonNode);\n  }\n\n  @Test\n  public void testValidateAndParse() throws Exception {\n    // when\n    DevfileImpl parsed = devfileParser.parseYaml(DEVFILE_YAML_CONTENT);\n\n    // then\n    assertEquals(parsed, devfile);\n    verify(yamlMapper).treeToValue(devfileJsonNode, DevfileImpl.class);\n    verify(integrityValidator).validateDevfile(devfile);\n  }\n\n  @Test\n  public void testParseRaw() throws DevfileFormatException {\n    JsonNode parsed = devfileParser.parseYamlRaw(DEVFILE_YAML_CONTENT);\n    assertEquals(parsed, devfileJsonNode);\n  }\n\n  @Test(expectedExceptions = DevfileFormatException.class)\n  public void testParseRawThrowsExceptionWhenNothinParsed()\n      throws DevfileFormatException, JsonProcessingException {\n    when(yamlMapper.readTree(DEVFILE_YAML_CONTENT)).thenReturn(null);\n    devfileParser.parseYamlRaw(DEVFILE_YAML_CONTENT);\n  }\n\n  @Test(expectedExceptions = DevfileFormatException.class)\n  public void testParseRawThrowsDevfilExceptionWhenJsonParsingFails()\n      throws JsonProcessingException, DevfileFormatException {\n    when(yamlMapper.readTree(DEVFILE_YAML_CONTENT)).thenThrow(JsonProcessingException.class);\n    devfileParser.parseYamlRaw(DEVFILE_YAML_CONTENT);\n  }\n\n  @Test\n  public void testInitializingDevfileMapsAfterParsing() throws Exception {\n    // given\n    CommandImpl command = new CommandImpl();\n    command.getActions().add(new ActionImpl());\n    devfile.getCommands().add(command);\n\n    ComponentImpl component = new ComponentImpl();\n    component.getEndpoints().add(new EndpointImpl());\n    devfile.getComponents().add(component);\n\n    // when\n    DevfileImpl parsed = devfileParser.parseYaml(DEVFILE_YAML_CONTENT);\n\n    // then\n    assertNotNull(parsed.getCommands().get(0).getAttributes());\n    assertNotNull(parsed.getComponents().get(0).getSelector());\n    assertNotNull(parsed.getComponents().get(0).getEndpoints().get(0).getAttributes());\n  }\n\n  @Test\n  public void shouldResolveReferencesIntoReferenceContentForFactories() throws Exception {\n\n    String referenceContent = \"my_content_yaml_v3\";\n    when(contentProvider.fetchContent(anyString())).thenReturn(referenceContent);\n\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setReference(\"myfile.yaml\");\n    devfile.getComponents().add(component);\n\n    // when\n    devfileParser.resolveReference(devfile, contentProvider);\n\n    // then\n    verify(contentProvider).fetchContent(eq(\"myfile.yaml\"));\n    assertEquals(devfile.getComponents().get(0).getReferenceContent(), referenceContent);\n  }\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp = \"Unable to parse Devfile - provided source is empty\")\n  public void shouldThrowDevfileExceptionWhenEmptyObjectProvided() throws Exception {\n    // when\n    devfileParser.parseJson(\"{}\");\n  }\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp = \"Unable to parse Devfile - provided source is empty\")\n  public void shouldThrowDevfileExceptionWhenEmptySourceProvided() throws Exception {\n    // when\n    devfileParser.parseJson(\"\");\n  }\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp = \"Unable to resolve reference of component: test\")\n  public void shouldThrowDevfileExceptionWhenReferenceIsNotResolvable() throws Exception {\n\n    when(contentProvider.fetchContent(anyString())).thenThrow(IOException.class);\n\n    ComponentImpl component = new ComponentImpl();\n    component.setType(KUBERNETES_COMPONENT_TYPE);\n    component.setAlias(\"test\");\n    component.setReference(\"myfile.yaml\");\n    devfile.getComponents().add(component);\n\n    // when\n    devfileParser.resolveReference(devfile, contentProvider);\n\n    // then exception is thrown\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp = \"non valid\")\n  public void shouldThrowExceptionWhenErrorOccurredDuringDevfileParsing() throws Exception {\n    // given\n    JsonProcessingException jsonException = mock(JsonProcessingException.class);\n    when(jsonException.getMessage()).thenReturn(\"non valid\");\n    when(jsonMapper.readTree(anyString())).thenReturn(devfileJsonNode);\n    doThrow(jsonException).when(jsonMapper).treeToValue(any(), eq(DevfileImpl.class));\n\n    // when\n    devfileParser.parseJson(DEVFILE_YAML_CONTENT);\n  }\n\n  @Test\n  public void shouldConvertYamlToMapAndValidate() throws Exception {\n    // when\n    devfileParser.convertYamlToMap(devfileJsonNode);\n\n    // then\n    verify(yamlMapper).convertValue(eq(devfileJsonNode), any(TypeReference.class));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/DevfileVersionTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static org.testng.Assert.*;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.node.JsonNodeFactory;\nimport com.fasterxml.jackson.databind.node.ObjectNode;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.testng.annotations.Test;\n\npublic class DevfileVersionTest {\n  private final DevfileVersionDetector devfileVersionDetector = new DevfileVersionDetector();\n\n  @Test(expectedExceptions = DevfileException.class)\n  public void shouldThrowExceptionWhenEmptyDevfile() throws DevfileException {\n    JsonNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    devfileVersionDetector.devfileVersion(devfile);\n  }\n\n  @Test\n  public void shouldReturnApiVersion() throws DevfileException {\n    ObjectNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    devfile.put(\"apiVersion\", \"1.1.1\");\n    assertEquals(devfileVersionDetector.devfileVersion(devfile), \"1.1.1\");\n  }\n\n  @Test\n  public void shouldReturnSchemaVersion() throws DevfileException {\n    ObjectNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    devfile.put(\"schemaVersion\", \"1.1.1\");\n    assertEquals(devfileVersionDetector.devfileVersion(devfile), \"1.1.1\");\n  }\n\n  @Test\n  public void shouldReturnApiVersionWhenBothDefined() throws DevfileException {\n    ObjectNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    devfile.put(\"apiVersion\", \"1\");\n    devfile.put(\"schemaVersion\", \"2\");\n    assertEquals(devfileVersionDetector.devfileVersion(devfile), \"1\");\n  }\n\n  @Test\n  public void shouldReturnMainVersionFromSchemaVersion() throws DevfileException {\n    ObjectNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    devfile.put(\"schemaVersion\", \"10.1.1\");\n    assertEquals(devfileVersionDetector.devfileMajorVersion(devfile), 10);\n  }\n\n  @Test\n  public void shouldReturnMainVersionFromApiVersion() throws DevfileException {\n    ObjectNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    devfile.put(\"apiVersion\", \"11.1.1\");\n    assertEquals(devfileVersionDetector.devfileMajorVersion(devfile), 11);\n  }\n\n  @Test(expectedExceptions = DevfileException.class)\n  public void shouldThrowExceptionWhenVersionNotDefined() throws DevfileException {\n    ObjectNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    devfileVersionDetector.devfileMajorVersion(devfile);\n  }\n\n  @Test\n  public void shouldReturnMajorVersionWhenIsNumberString() throws DevfileException {\n    ObjectNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    devfile.put(\"apiVersion\", \"2\");\n    assertEquals(devfileVersionDetector.devfileMajorVersion(devfile), 2);\n  }\n\n  @Test\n  public void shouldReturnMajorVersionWhenIsNumber() throws DevfileException {\n    ObjectNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    devfile.put(\"apiVersion\", 2);\n    assertEquals(devfileVersionDetector.devfileMajorVersion(devfile), 2);\n  }\n\n  @Test(expectedExceptions = DevfileException.class)\n  public void shouldThrowExceptionWhenVersionIsNotNumber() throws DevfileException {\n    ObjectNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    devfile.put(\"apiVersion\", \"a\");\n    devfileVersionDetector.devfileMajorVersion(devfile);\n  }\n\n  @Test(expectedExceptions = DevfileException.class)\n  public void shouldThrowExceptionWhenVersionIsNotSemverNumber() throws DevfileException {\n    ObjectNode devfile = new ObjectNode(JsonNodeFactory.instance);\n    devfile.put(\"apiVersion\", \"a.a\");\n    devfileVersionDetector.devfileMajorVersion(devfile);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/OverridePropertiesApplierTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNull;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.workspace.server.devfile.exception.OverrideParameterException;\nimport org.testng.annotations.Test;\n\npublic class OverridePropertiesApplierTest {\n\n  private final OverridePropertiesApplier applier = new OverridePropertiesApplier();\n  private final ObjectMapper jsonMapper = new ObjectMapper();\n\n  @Test\n  public void shouldOverrideExistingPropertiesInDevfile() throws Exception {\n    String json =\n        \"{\"\n            + \"\\\"apiVersion\\\": \\\"1.0.0\\\",\"\n            + \"\\\"metadata\\\": {\"\n            + \"   \\\"generateName\\\": \\\"python\\\"\"\n            + \"  }\"\n            + \"}\";\n    Map<String, String> overrides = new HashMap<>();\n    overrides.put(\"apiVersion\", \"2.0.0\");\n    overrides.put(\"metadata.generateName\", \"go\");\n    // when\n    JsonNode result = applier.applyPropertiesOverride(jsonMapper.readTree(json), overrides);\n    // then\n    assertEquals(result.get(\"apiVersion\").textValue(), \"2.0.0\");\n    assertEquals(result.get(\"metadata\").get(\"generateName\").textValue(), \"go\");\n  }\n\n  @Test\n  public void shouldNotOverrideDevfileFilenameInDevfile() throws Exception {\n    String json =\n        \"{\"\n            + \"\\\"apiVersion\\\": \\\"2.0.0\\\",\"\n            + \"\\\"metadata\\\": {\"\n            + \"   \\\"generateName\\\": \\\"python\\\"\"\n            + \"  }\"\n            + \"}\";\n    Map<String, String> overrides = new HashMap<>();\n    overrides.put(\"devfileFilename\", \"devfile.v2\");\n    overrides.put(\"metadata.generateName\", \"go\");\n    // when\n    JsonNode result = applier.applyPropertiesOverride(jsonMapper.readTree(json), overrides);\n\n    // then\n    assertEquals(result.get(\"metadata\").get(\"generateName\").textValue(), \"go\");\n    // this parameter is accepted but not added into the JSON\n    assertNull(result.get(\"devfileFilename\"));\n  }\n\n  @Test\n  public void shouldCreateUnExistingOverridePropertiesInDevfile() throws Exception {\n    String json = \"{\" + \"\\\"apiVersion\\\": \\\"1.0.0\\\"\" + \"}\";\n    Map<String, String> overrides = new HashMap<>();\n    overrides.put(\"metadata.generateName\", \"go\");\n    // when\n    JsonNode result = applier.applyPropertiesOverride(jsonMapper.readTree(json), overrides);\n    assertEquals(result.get(\"metadata\").get(\"generateName\").textValue(), \"go\");\n  }\n\n  @Test\n  public void shouldCreateUnExistingAttributesInDevfile() throws Exception {\n    String json = \"{\" + \"\\\"apiVersion\\\": \\\"1.0.0\\\"\" + \"}\";\n    Map<String, String> overrides = new HashMap<>();\n    overrides.put(\"attributes.persistVolumes\", \"true\");\n    // when\n    JsonNode result = applier.applyPropertiesOverride(jsonMapper.readTree(json), overrides);\n    assertEquals(result.get(\"attributes\").get(\"persistVolumes\").textValue(), \"true\");\n  }\n\n  @Test\n  public void shouldUpdateExistingAttributesInDevfile() throws Exception {\n    String json =\n        \"{\"\n            + \"\\\"apiVersion\\\": \\\"1.0.0\\\",\"\n            + \"\\\"attributes\\\": {\"\n            + \"    \\\"persistVolumes\\\": \\\"false\\\"\"\n            + \"  }\"\n            + \"}\";\n    Map<String, String> overrides = new HashMap<>();\n    overrides.put(\"attributes.persistVolumes\", \"true\");\n    // when\n    JsonNode result = applier.applyPropertiesOverride(jsonMapper.readTree(json), overrides);\n    assertEquals(result.get(\"attributes\").get(\"persistVolumes\").textValue(), \"true\");\n  }\n\n  @Test\n  public void shouldUpdateExistingAttributesWithDotsInDevfile() throws Exception {\n    String json =\n        \"{\"\n            + \"\\\"apiVersion\\\": \\\"1.0.0\\\",\"\n            + \"\\\"attributes\\\": {\"\n            + \"    \\\"che.persistVolumes\\\": \\\"false\\\"\"\n            + \"  }\"\n            + \"}\";\n    Map<String, String> overrides = new HashMap<>();\n    overrides.put(\"attributes.che.persistVolumes\", \"true\");\n    // when\n    JsonNode result = applier.applyPropertiesOverride(jsonMapper.readTree(json), overrides);\n    assertEquals(result.get(\"attributes\").get(\"che.persistVolumes\").textValue(), \"true\");\n  }\n\n  @Test\n  public void shouldRewriteValueInProjectsArrayElementByName() throws Exception {\n    String json =\n        \"{\"\n            + \"\\\"apiVersion\\\": \\\"1.0.0\\\",\"\n            + \"\\\"projects\\\": [\"\n            + \"   {\"\n            + \"      \\\"name\\\": \\\"test1\\\",\"\n            + \"      \\\"clonePath\\\": \\\"/foo/bar1\\\"\"\n            + \"   },\"\n            + \"   {\"\n            + \"      \\\"name\\\": \\\"test2\\\",\"\n            + \"      \\\"clonePath\\\": \\\"/foo/bar2\\\"\"\n            + \"   }\"\n            + \"  ]\"\n            + \"}\";\n    Map<String, String> overrides = new HashMap<>();\n    overrides.put(\"projects.test1.clonePath\", \"baz1\");\n    overrides.put(\"projects.test2.clonePath\", \"baz2\");\n\n    // when\n    JsonNode result = applier.applyPropertiesOverride(jsonMapper.readTree(json), overrides);\n    // then\n    assertEquals(result.get(\"projects\").get(0).get(\"clonePath\").textValue(), \"baz1\");\n    assertEquals(result.get(\"projects\").get(1).get(\"clonePath\").textValue(), \"baz2\");\n  }\n\n  @Test(\n      expectedExceptions = OverrideParameterException.class,\n      expectedExceptionsMessageRegExp =\n          \"Cannot apply override: object with name 'test3' not found in array of projects.\")\n  public void shouldThrowExceptionIfOverrideArrayObjectNotFoundByName() throws Exception {\n    String json =\n        \"{\"\n            + \"\\\"apiVersion\\\": \\\"1.0.0\\\",\"\n            + \"\\\"projects\\\": [\"\n            + \"   {\"\n            + \"      \\\"name\\\": \\\"test1\\\",\"\n            + \"      \\\"clonePath\\\": \\\"/foo/bar1\\\"\"\n            + \"   },\"\n            + \"   {\"\n            + \"      \\\"name\\\": \\\"test2\\\",\"\n            + \"      \\\"clonePath\\\": \\\"/foo/bar2\\\"\"\n            + \"   }\"\n            + \"  ]\"\n            + \"}\";\n    Map<String, String> overrides = new HashMap<>();\n    overrides.put(\"projects.test3.clonePath\", \"baz1\");\n    // when\n    applier.applyPropertiesOverride(jsonMapper.readTree(json), overrides);\n  }\n\n  @Test(\n      expectedExceptions = OverrideParameterException.class,\n      expectedExceptionsMessageRegExp =\n          \"Override property reference 'projects' points to an array type object. Please add an item qualifier by name.\")\n  public void shouldThrowExceptionIfOverrideReferenceEndsWithArray() throws Exception {\n    String json =\n        \"{\"\n            + \"\\\"apiVersion\\\": \\\"1.0.0\\\",\"\n            + \"\\\"projects\\\": [\"\n            + \"   {\"\n            + \"      \\\"name\\\": \\\"test1\\\",\"\n            + \"      \\\"clonePath\\\": \\\"/foo/bar1\\\"\"\n            + \"   },\"\n            + \"   {\"\n            + \"      \\\"name\\\": \\\"test2\\\",\"\n            + \"      \\\"clonePath\\\": \\\"/foo/bar2\\\"\"\n            + \"   }\"\n            + \"  ]\"\n            + \"}\";\n    Map<String, String> overrides = new HashMap<>();\n    overrides.put(\"projects\", \"baz1\");\n    // when\n    applier.applyPropertiesOverride(jsonMapper.readTree(json), overrides);\n  }\n\n  @Test(\n      expectedExceptions = OverrideParameterException.class,\n      expectedExceptionsMessageRegExp =\n          \"Override property reference 'projects' points to an array type object. Please add an item qualifier by name.\")\n  public void shouldThrowExceptionIfOverrideReferenceIsJustWithArray() throws Exception {\n    String json =\n        \"{\"\n            + \"\\\"apiVersion\\\": \\\"1.0.0\\\",\"\n            + \"\\\"projects\\\": [\"\n            + \"   {\"\n            + \"      \\\"name\\\": \\\"test1\\\",\"\n            + \"      \\\"clonePath\\\": \\\"/foo/bar1\\\"\"\n            + \"   }\"\n            + \"  ]\"\n            + \"}\";\n    Map<String, String> overrides = new HashMap<>();\n    overrides.put(\"projects\", \"baz1\");\n    // when\n    applier.applyPropertiesOverride(jsonMapper.readTree(json), overrides);\n  }\n\n  @Test(\n      expectedExceptions = OverrideParameterException.class,\n      expectedExceptionsMessageRegExp =\n          \"Override path 'commands.run.foo.bar' starts with an unsupported field pointer. Supported fields are \\\\{\\\"apiVersion\\\",\\\"metadata\\\",\\\"projects\\\"\\\\,\\\"attributes\\\"\\\\,\\\"devfileFilename\\\"\\\\}.\")\n  public void shouldThrowExceptionIfOverrideReferenceUsesUnsupportedField() throws Exception {\n    String json =\n        \"{\"\n            + \"\\\"apiVersion\\\": \\\"1.0.0\\\",\"\n            + \"\\\"projects\\\": [\"\n            + \"   {\"\n            + \"      \\\"name\\\": \\\"test1\\\",\"\n            + \"      \\\"clonePath\\\": \\\"/foo/bar1\\\"\"\n            + \"   }\"\n            + \"  ]\"\n            + \"}\";\n    Map<String, String> overrides = new HashMap<>();\n    overrides.put(\"commands.run.foo.bar\", \"baz1\");\n    // when\n    applier.applyPropertiesOverride(jsonMapper.readTree(json), overrides);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/PreferencesDeserializerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static org.testng.Assert.assertEquals;\n\nimport com.fasterxml.jackson.core.JsonFactory;\nimport com.fasterxml.jackson.core.JsonParseException;\nimport com.fasterxml.jackson.core.JsonParser;\nimport com.fasterxml.jackson.databind.DeserializationContext;\nimport java.io.Serializable;\nimport java.util.Map;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class PreferencesDeserializerTest {\n\n  @Mock private DeserializationContext ctxt;\n\n  private final JsonFactory factory = new JsonFactory();\n\n  /** Instance to test. */\n  private PreferencesDeserializer preferencesDeserializer = new PreferencesDeserializer();\n\n  @Test\n  public void shouldParseSimpleTypesCorrectly() throws Exception {\n    String json =\n        \"{\"\n            + \"\\\"valid.string\\\": \\\"/usr/bin/value\\\",\"\n            + \"\\\"valid.boolean\\\": false,\"\n            + \"\\\"valid.integer\\\": 777555888,\"\n            + \"\\\"valid.float\\\": 3.1415926,\"\n            + \"\\\"valid.string.array\\\": [\\\"foo\\\",\\\"bar\\\",\\\"baz\\\"],\"\n            + \"\\\"valid.int.array\\\": [12,13,0],\"\n            + \"\\\"valid.bool.array\\\": [true,false,false]\"\n            + \"}\";\n\n    final JsonParser parser = factory.createParser(json);\n    Map<String, Serializable> result = preferencesDeserializer.deserialize(parser, ctxt);\n    assertEquals(7, result.size());\n    assertEquals(result.get(\"valid.integer\"), 777555888);\n    assertEquals(result.get(\"valid.float\"), 3.1415926);\n    assertEquals(result.get(\"valid.boolean\"), false);\n    assertEquals(result.get(\"valid.string\"), \"/usr/bin/value\");\n    assertEquals(result.get(\"valid.string.array\"), new String[] {\"foo\", \"bar\", \"baz\"});\n    assertEquals(result.get(\"valid.int.array\"), new int[] {12, 13, 0});\n    assertEquals(result.get(\"valid.bool.array\"), new boolean[] {true, false, false});\n  }\n\n  @Test(\n      expectedExceptions = JsonParseException.class,\n      expectedExceptionsMessageRegExp =\n          \"Unexpected value of the preference with key 'invalid.object'.\\n\"\n              + \" at \\\\[Source: REDACTED \\\\(`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled\\\\); line: 1, column: 54]\")\n  public void shouldThrowExceptionOnUnsupportedPreferenceValue() throws Exception {\n\n    String json =\n        \"{\"\n            + \"\\\"valid.string\\\": \\\"/usr/bin/value\\\",\"\n            + \"\\\"invalid.object\\\": {\\\"someobject\\\": true}\"\n            + \"}\";\n\n    final JsonParser parser = factory.createParser(json);\n    preferencesDeserializer.deserialize(parser, ctxt);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/SerializableConverterTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static org.testng.Assert.assertEquals;\n\nimport java.io.Serializable;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\npublic class SerializableConverterTest {\n\n  private final SerializableConverter converter = new SerializableConverter();\n\n  @DataProvider\n  public static Object[][] SerializableProvider() {\n    return new Object[][] {\n      {\"foo\"},\n      {\"bar\"},\n      {true},\n      {false},\n      {Integer.MAX_VALUE},\n      {0},\n      {Integer.MIN_VALUE},\n      {\"{\\\"java.home\\\": \\\"/home/user/jdk11\\\", \\\"java.jdt.ls.vmargs\\\": \\\"-Xmx1G\\\"}\"},\n      {new String[] {\"single\"}},\n      {new String[] {\"--enable-all\", \"--new\"}},\n      {new int[] {213, 456, 459}},\n      {new boolean[] {true, false, false}}\n    };\n  }\n\n  @Test(dataProvider = \"SerializableProvider\")\n  public void testConvertToDatabaseColumnAndBack(Serializable initialObj) {\n    String res = converter.convertToDatabaseColumn(initialObj);\n    Serializable backObj = converter.convertToEntityAttribute(res);\n    assertEquals(initialObj, backObj);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/URLFetcherTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static java.nio.charset.StandardCharsets.UTF_8;\nimport static org.eclipse.che.api.workspace.server.devfile.URLFetcher.CONNECTION_READ_TIMEOUT;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertNull;\n\nimport com.google.common.base.Strings;\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.SocketTimeoutException;\nimport java.net.URL;\nimport java.net.URLConnection;\nimport java.util.function.Consumer;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.Assert;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Testing {@link org.eclipse.che.api.workspace.server.devfile.URLFetcher}\n *\n * @author Florent Benoit\n */\n@Listeners(MockitoTestNGListener.class)\npublic class URLFetcherTest {\n\n  /** Instance to test. */\n  private URLFetcher urlFetcher = new URLFetcher(1024);\n\n  /** Check that when url is null, NPE is thrown */\n  @Test(expectedExceptions = NullPointerException.class)\n  public void checkNullURL() {\n    urlFetcher.fetchSafely(null);\n  }\n\n  /** Check that when url exists the content is retrieved */\n  @Test\n  public void checkGetContent() {\n\n    // test to download this class object\n    URL urlJson = getClass().getClassLoader().getResource(\"devfile/url_fetcher_test_resource.json\");\n    Assert.assertNotNull(urlJson);\n\n    String content = urlFetcher.fetchSafely(urlJson.toString());\n    assertEquals(content, \"Hello\");\n  }\n\n  /** Check when url is invalid */\n  @Test\n  public void checkUrlFileIsInvalid() {\n    String result = urlFetcher.fetchSafely(\"hello world\");\n    assertNull(result);\n  }\n\n  /** Check when url is invalid */\n  @Test(\n      expectedExceptions = IOException.class,\n      expectedExceptionsMessageRegExp = \"no protocol: hello_world\")\n  public void checkUnsafeGetUrlFileIsInvalid() throws Exception {\n    String result = urlFetcher.fetch(\"hello_world\");\n    assertNull(result);\n  }\n\n  /** Check Sanitizing of Git URL works */\n  @Test\n  public void checkDotGitRemovedFromURL() {\n    String result = urlFetcher.sanitized(\"https://github.com/acme/demo.git\");\n    assertEquals(\"https://github.com/acme/demo\", result);\n\n    result = urlFetcher.sanitized(\"http://github.com/acme/demo.git\");\n    assertEquals(\"http://github.com/acme/demo\", result);\n  }\n\n  /** Check that when url doesn't exist */\n  @Test\n  public void checkMissingContent() {\n\n    // test to download this class object\n    URL urlJson = getClass().getClassLoader().getResource(\"devfile/url_fetcher_test_resource.json\");\n    Assert.assertNotNull(urlJson);\n\n    // add extra path to make url not found\n    String content = urlFetcher.fetchSafely(urlJson.toString() + \"-invalid\");\n    assertNull(content);\n  }\n\n  /** Check that when url doesn't exist */\n  @Test(\n      expectedExceptions = IOException.class,\n      expectedExceptionsMessageRegExp =\n          \".*url_fetcher_test_resource.json-invalid \\\\(No such file or directory\\\\)\")\n  public void checkMissingContentUnsafeGet() throws Exception {\n\n    // test to download this class object\n    URL urlJson = getClass().getClassLoader().getResource(\"devfile/url_fetcher_test_resource.json\");\n    Assert.assertNotNull(urlJson);\n\n    // add extra path to make url not found\n    String content = urlFetcher.fetch(urlJson.toString() + \"-invalid\");\n    assertNull(content);\n  }\n\n  /** Check when we reach custom limit */\n  @Test\n  public void checkPartialContent() {\n    URL urlJson = getClass().getClassLoader().getResource(\"devfile/url_fetcher_test_resource.json\");\n    Assert.assertNotNull(urlJson);\n\n    String content = new OneByteURLFetcher(1).fetchSafely(urlJson.toString());\n    assertEquals(content, \"Hello\".substring(0, 1));\n  }\n\n  /** Check when we reach custom limit */\n  @Test\n  public void checkDefaultPartialContent() throws IOException {\n    URLConnection urlConnection = Mockito.mock(URLConnection.class);\n    String originalContent = Strings.padEnd(\"\", 1024, 'a');\n    String extraContent = originalContent + \"----\";\n    when(urlConnection.getInputStream())\n        .thenReturn(new ByteArrayInputStream(extraContent.getBytes(UTF_8)));\n    String readcontent = urlFetcher.fetch(urlConnection);\n    // check extra content has been removed as we keep only first values\n    assertEquals(readcontent, originalContent);\n  }\n\n  @Test\n  public void testDefaultFetchTimeoutIsSet() throws IOException {\n    URLFetcher fetcher =\n        new TimeoutCheckURLFetcher(\n            timeout -> assertEquals(timeout.intValue(), CONNECTION_READ_TIMEOUT));\n\n    fetcher.fetch(\"http://eclipse.org/che\");\n  }\n\n  @Test\n  public void testFetchTimeoutIsSet() throws IOException {\n    URLFetcher fetcher =\n        new TimeoutCheckURLFetcher(timeout -> assertEquals(timeout.intValue(), 123));\n\n    fetcher.fetch(\"http://eclipse.org/che\", 123);\n  }\n\n  @Test(expectedExceptions = IOException.class)\n  public void testExceptionIsThrownOnTimeout() throws IOException {\n    URLFetcher fetcher = new URLFetcher(1024);\n    URLConnection connection =\n        new URLConnection(new URL(\"http://eclipse.org/che\")) {\n          @Override\n          public void connect() throws IOException {\n            // noop\n          }\n\n          @Override\n          public InputStream getInputStream() throws IOException {\n            throw new SocketTimeoutException(\"yes\");\n          }\n        };\n\n    fetcher.fetch(connection);\n  }\n\n  /** Limit to only one Byte. */\n  static class OneByteURLFetcher extends URLFetcher {\n\n    public OneByteURLFetcher(long maxFetchBytes) {\n      super(maxFetchBytes);\n    }\n\n    /** Override the limit */\n    @Override\n    protected long getLimit() {\n      return 1;\n    }\n  }\n\n  private static class TimeoutCheckURLFetcher extends URLFetcher {\n    private final Consumer<Integer> assertion;\n\n    public TimeoutCheckURLFetcher(Consumer<Integer> assertion) {\n      super(500);\n      this.assertion = assertion;\n    }\n\n    @Override\n    String fetch(URLConnection urlConnection) {\n      assertion.accept(urlConnection.getReadTimeout());\n      assertion.accept(urlConnection.getConnectTimeout());\n      return \"NOOP\";\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/URLFileContentProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile;\n\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.verify;\nimport static org.testng.Assert.assertEquals;\n\nimport java.net.URI;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class URLFileContentProviderTest {\n\n  @Mock private URLFetcher urlFetcher;\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp =\n          \"It is unable to fetch a file /relative/dev.yaml as relative to devfile, since devfile location is unknown. Try specifying absolute URL.\")\n  public void shouldThrowExceptionWhenNoDevfileLocationKnownAndURLIsRelative() throws Exception {\n    URLFileContentProvider provider = new URLFileContentProvider(null, urlFetcher);\n    provider.fetchContent(\"/relative/dev.yaml\");\n  }\n\n  @Test\n  public void shouldFetchByAbsoluteURL() throws Exception {\n    String url = \"http://myhost.com/relative/dev.yaml\";\n    URLFileContentProvider provider = new URLFileContentProvider(null, urlFetcher);\n    ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);\n    provider.fetchContent(url);\n    verify(urlFetcher).fetch(captor.capture(), eq(null));\n    assertEquals(captor.getValue(), url);\n  }\n\n  @Test\n  public void shouldMergeDevfileLocationAndRelativeURL() throws Exception {\n    String devfileUrl = \"http://myhost.com/relative/devile.yaml\";\n    String relativeUrl = \"relative.yaml\";\n    URLFileContentProvider provider = new URLFileContentProvider(new URI(devfileUrl), urlFetcher);\n    ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);\n    provider.fetchContent(relativeUrl);\n    verify(urlFetcher).fetch(captor.capture(), eq(null));\n    assertEquals(captor.getValue(), \"http://myhost.com/relative/relative.yaml\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/convert/CommandConverterTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert;\n\nimport static org.eclipse.che.api.core.model.workspace.config.Command.WORKING_DIRECTORY_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.EXEC_ACTION_TYPE;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNull;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.HashMap;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.api.workspace.server.devfile.exception.WorkspaceExportException;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ActionImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.CommandImpl;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\n/**\n * @author Sergii Leshchenko\n */\npublic class CommandConverterTest {\n\n  private CommandConverter commandConverter;\n\n  @BeforeMethod\n  public void setUp() {\n    commandConverter = new CommandConverter();\n  }\n\n  @Test\n  public void shouldConvertWorkspaceCommandToDevfileCommand() throws Exception {\n    // given\n    org.eclipse.che.api.workspace.server.model.impl.CommandImpl workspaceCommand =\n        new org.eclipse.che.api.workspace.server.model.impl.CommandImpl(\n            \"build\", \"mvn clean install\", \"custom\");\n    workspaceCommand.getAttributes().put(COMPONENT_ALIAS_COMMAND_ATTRIBUTE, \"dockerimageComponent\");\n    workspaceCommand.getAttributes().put(WORKING_DIRECTORY_ATTRIBUTE, \"/tmp\");\n    workspaceCommand.getAttributes().put(\"anotherAttribute\", \"value\");\n\n    // when\n    CommandImpl devfileCommand = commandConverter.toDevfileCommand(workspaceCommand);\n\n    // then\n    assertEquals(devfileCommand.getName(), \"build\");\n    assertEquals(devfileCommand.getActions().size(), 1);\n    assertEquals(devfileCommand.getAttributes().size(), 1);\n    assertEquals(devfileCommand.getAttributes().get(\"anotherAttribute\"), \"value\");\n    ActionImpl action = devfileCommand.getActions().get(0);\n    assertEquals(action.getComponent(), \"dockerimageComponent\");\n    assertEquals(action.getWorkdir(), \"/tmp\");\n    assertEquals(action.getCommand(), \"mvn clean install\");\n    assertEquals(action.getType(), EXEC_ACTION_TYPE);\n  }\n\n  @Test(\n      expectedExceptions = WorkspaceExportException.class,\n      expectedExceptionsMessageRegExp =\n          \"Command `build` has no specified component where it should be run\")\n  public void shouldThrowAnExceptionIfWorkspaceCommandDoesNotHaveComponentNameAttribute()\n      throws Exception {\n    // given\n    org.eclipse.che.api.workspace.server.model.impl.CommandImpl workspaceCommand =\n        new org.eclipse.che.api.workspace.server.model.impl.CommandImpl(\n            \"build\", \"mvn clean install\", \"custom\");\n\n    // when\n    commandConverter.toDevfileCommand(workspaceCommand);\n  }\n\n  @Test\n  public void shouldConvertDevfileCommandToWorkspaceCommands() throws Exception {\n    // given\n    CommandImpl devfileCommand = new CommandImpl();\n    devfileCommand.setName(\"build\");\n    devfileCommand.setAttributes(ImmutableMap.of(\"attr\", \"value\"));\n    ActionImpl action = new ActionImpl();\n    action.setComponent(\"dockerimageComponent\");\n    action.setType(EXEC_ACTION_TYPE);\n    action.setWorkdir(\"/tmp\");\n    action.setCommand(\"mvn clean install\");\n    devfileCommand.getActions().add(action);\n\n    // when\n    org.eclipse.che.api.workspace.server.model.impl.CommandImpl workspaceCommand =\n        commandConverter.toWorkspaceCommand(devfileCommand, null);\n\n    // then\n    assertEquals(workspaceCommand.getName(), \"build\");\n    assertEquals(workspaceCommand.getType(), EXEC_ACTION_TYPE);\n    assertEquals(workspaceCommand.getAttributes().size(), 3);\n    assertEquals(workspaceCommand.getAttributes().get(\"attr\"), \"value\");\n    assertEquals(workspaceCommand.getAttributes().get(WORKING_DIRECTORY_ATTRIBUTE), \"/tmp\");\n    assertEquals(\n        workspaceCommand.getAttributes().get(COMPONENT_ALIAS_COMMAND_ATTRIBUTE),\n        \"dockerimageComponent\");\n    assertEquals(workspaceCommand.getCommandLine(), \"mvn clean install\");\n  }\n\n  @Test\n  public void\n      shouldNotSetWorkingDirAttributeIfItIsMissingInDevfileCommandDuringConvertingDevfileCommandToWorkspaceCommands()\n          throws Exception {\n    // given\n    CommandImpl devfileCommand = new CommandImpl();\n    ActionImpl action = new ActionImpl();\n    action.setWorkdir(null);\n    devfileCommand.getActions().add(action);\n    devfileCommand.setAttributes(new HashMap<>());\n\n    // when\n    org.eclipse.che.api.workspace.server.model.impl.CommandImpl workspaceCommand =\n        commandConverter.toWorkspaceCommand(devfileCommand, null);\n\n    // then\n    assertFalse(workspaceCommand.getAttributes().containsKey(WORKING_DIRECTORY_ATTRIBUTE));\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp = \"Command `build` MUST has one and only one action\")\n  public void shouldThrowAnExceptionIfDevfileCommandHasMultipleActions() throws Exception {\n    // given\n    CommandImpl devfileCommand = new CommandImpl();\n    devfileCommand.setName(\"build\");\n    devfileCommand.setAttributes(ImmutableMap.of(\"attr\", \"value\"));\n    devfileCommand.getActions().add(new ActionImpl());\n    devfileCommand.getActions().add(new ActionImpl());\n\n    // when\n    commandConverter.toWorkspaceCommand(devfileCommand, null);\n  }\n\n  @Test\n  public void shouldAcceptActionWithCommand() throws Exception {\n    // given\n    CommandImpl devfileCommand = new CommandImpl();\n    devfileCommand.setName(\"build\");\n\n    ActionImpl action = new ActionImpl();\n    action.setType(\"exec\");\n    action.setCommand(\"blah\");\n\n    devfileCommand.getActions().add(action);\n\n    // when\n    Command command = commandConverter.toWorkspaceCommand(devfileCommand, null);\n\n    // then\n    assertEquals(command.getCommandLine(), \"blah\");\n  }\n\n  @Test\n  public void shouldAcceptActionWithReference() throws Exception {\n    // given\n    CommandImpl devfileCommand = new CommandImpl();\n    devfileCommand.setName(\"build\");\n\n    ActionImpl action = new ActionImpl();\n    action.setType(\"exec\");\n    action.setReference(\"blah\");\n\n    devfileCommand.getActions().add(action);\n    FileContentProvider fileContentProvider = mock(FileContentProvider.class);\n    when(fileContentProvider.fetchContent(anyString())).thenReturn(\"content\");\n\n    // when\n    Command command = commandConverter.toWorkspaceCommand(devfileCommand, fileContentProvider);\n\n    // then\n    assertNull(command.getCommandLine());\n    assertEquals(\"blah\", command.getAttributes().get(Command.COMMAND_ACTION_REFERENCE_ATTRIBUTE));\n    assertEquals(\n        \"content\", command.getAttributes().get(Command.COMMAND_ACTION_REFERENCE_CONTENT_ATTRIBUTE));\n  }\n\n  @Test\n  public void shouldAcceptActionWithReferenceContent() throws Exception {\n    // given\n    CommandImpl devfileCommand = new CommandImpl();\n    devfileCommand.setName(\"build\");\n\n    ActionImpl action = new ActionImpl();\n    action.setType(\"exec\");\n    action.setReference(\"blah\");\n    action.setReferenceContent(\"content\");\n\n    devfileCommand.getActions().add(action);\n\n    // when\n    Command command = commandConverter.toWorkspaceCommand(devfileCommand, null);\n\n    // then\n    assertNull(command.getCommandLine());\n    assertEquals(\"blah\", command.getAttributes().get(Command.COMMAND_ACTION_REFERENCE_ATTRIBUTE));\n    assertEquals(\n        \"content\", command.getAttributes().get(Command.COMMAND_ACTION_REFERENCE_CONTENT_ATTRIBUTE));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/convert/DefaultEditorProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert;\n\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.EDITOR_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.EDITOR_FREE_DEVFILE_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.PLUGIN_COMPONENT_TYPE;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertNotNull;\nimport static org.testng.Assert.assertNull;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.List;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentFQNParser;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.server.wsplugins.PluginFQNParser;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link DefaultEditorProvisioner}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class DefaultEditorProvisionerTest {\n\n  @Mock private FileContentProvider fileContentProvider;\n\n  private static final String EDITOR_NAME = \"theia\";\n  private static final String EDITOR_VERSION = \"1.0.0\";\n  private static final String EDITOR_PUBLISHER = \"eclipse\";\n  private static final String EDITOR_REF =\n      EDITOR_PUBLISHER + \"/\" + EDITOR_NAME + \"/\" + EDITOR_VERSION;\n\n  private static final String TERMINAL_PLUGIN_NAME = \"theia-terminal\";\n  private static final String TERMINAL_PLUGIN_VERSION = \"0.0.4\";\n  private static final String ASYNC_STORAGE_PLUGIN_REF = \"eclipse/che-async-pv-plugin/nightly\";\n  private static final String TERMINAL_PLUGIN_REF =\n      EDITOR_PUBLISHER + \"/\" + TERMINAL_PLUGIN_NAME + \"/\" + TERMINAL_PLUGIN_VERSION;\n\n  private static final String COMMAND_PLUGIN_NAME = \"theia-command\";\n  private static final String COMMAND_PLUGIN_REF =\n      EDITOR_PUBLISHER + \"/\" + COMMAND_PLUGIN_NAME + \"/v1.0.0\";\n\n  private DefaultEditorProvisioner provisioner;\n\n  private PluginFQNParser pluginFQNParser = new PluginFQNParser();\n  private ComponentFQNParser fqnParser = new ComponentFQNParser(pluginFQNParser);\n\n  @Test\n  public void shouldNotProvisionDefaultEditorIfItIsNotConfigured() throws Exception {\n    // given\n    provisioner =\n        new DefaultEditorProvisioner(\n            null, \"\", ASYNC_STORAGE_PLUGIN_REF, fqnParser, pluginFQNParser);\n    DevfileImpl devfile = new DevfileImpl();\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    assertTrue(devfile.getComponents().isEmpty());\n  }\n\n  @Test\n  public void shouldProvisionDefaultEditorWithPluginsWhenDevfileDoNotHaveAny() throws Exception {\n    // given\n    provisioner =\n        new DefaultEditorProvisioner(\n            EDITOR_REF,\n            TERMINAL_PLUGIN_REF + \",\" + COMMAND_PLUGIN_REF,\n            \"\",\n            fqnParser,\n            pluginFQNParser);\n    DevfileImpl devfile = new DevfileImpl();\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 3);\n    assertTrue(components.contains(new ComponentImpl(EDITOR_COMPONENT_TYPE, EDITOR_REF)));\n    assertTrue(components.contains(new ComponentImpl(PLUGIN_COMPONENT_TYPE, COMMAND_PLUGIN_REF)));\n    assertTrue(components.contains(new ComponentImpl(PLUGIN_COMPONENT_TYPE, TERMINAL_PLUGIN_REF)));\n  }\n\n  @Test\n  public void shouldProvisionDefaultPluginsIfTheyAreNotSpecifiedAndDefaultEditorIsConfigured()\n      throws Exception {\n    // given\n    provisioner =\n        new DefaultEditorProvisioner(\n            EDITOR_REF, TERMINAL_PLUGIN_REF, \"\", fqnParser, pluginFQNParser);\n\n    DevfileImpl devfile = new DevfileImpl();\n    ComponentImpl defaultEditorWithDifferentVersion =\n        new ComponentImpl(EDITOR_COMPONENT_TYPE, EDITOR_PUBLISHER + \"/\" + EDITOR_NAME + \"/latest\");\n    devfile.getComponents().add(defaultEditorWithDifferentVersion);\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 2);\n\n    assertTrue(components.contains(defaultEditorWithDifferentVersion));\n\n    assertTrue(components.contains(new ComponentImpl(PLUGIN_COMPONENT_TYPE, TERMINAL_PLUGIN_REF)));\n  }\n\n  @Test\n  public void\n      shouldProvisionDefaultPluginsIfTheyAreNotSpecifiedAndDefaultEditorFromCustomRegistryIsConfigured()\n          throws Exception {\n    // given\n    provisioner =\n        new DefaultEditorProvisioner(\n            EDITOR_REF, TERMINAL_PLUGIN_REF, \"\", fqnParser, pluginFQNParser);\n\n    DevfileImpl devfile = new DevfileImpl();\n    ComponentImpl defaultEditorWithDifferentVersion =\n        new ComponentImpl(\n            EDITOR_COMPONENT_TYPE,\n            \"https://my-custom-registry#\" + EDITOR_PUBLISHER + \"/\" + EDITOR_NAME + \"/latest\");\n    devfile.getComponents().add(defaultEditorWithDifferentVersion);\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 2);\n\n    assertTrue(components.contains(defaultEditorWithDifferentVersion));\n\n    assertTrue(components.contains(new ComponentImpl(PLUGIN_COMPONENT_TYPE, TERMINAL_PLUGIN_REF)));\n  }\n\n  @Test\n  public void shouldNotProvisionDefaultPluginsIfCustomEditorIsConfiguredWhichStartWithDefaultId()\n      throws Exception {\n    // given\n    provisioner =\n        new DefaultEditorProvisioner(\n            EDITOR_REF, TERMINAL_PLUGIN_REF, \"\", fqnParser, pluginFQNParser);\n\n    DevfileImpl devfile = new DevfileImpl();\n    ComponentImpl editorWithNameSimilarToDefault =\n        new ComponentImpl(\n            EDITOR_COMPONENT_TYPE, EDITOR_PUBLISHER + \"/\" + EDITOR_NAME + \"-dev/dev-version\");\n    devfile.getComponents().add(editorWithNameSimilarToDefault);\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 1);\n    assertTrue(components.contains(editorWithNameSimilarToDefault));\n    assertNull(findById(components, EDITOR_NAME));\n  }\n\n  @Test\n  public void shouldNotProvisionDefaultPluginsIfDevfileContainsEditorFreeAttribute()\n      throws Exception {\n    // given\n    provisioner =\n        new DefaultEditorProvisioner(\n            EDITOR_REF, TERMINAL_PLUGIN_REF, \"\", fqnParser, pluginFQNParser);\n\n    DevfileImpl devfile = new DevfileImpl();\n    devfile.getAttributes().put(EDITOR_FREE_DEVFILE_ATTRIBUTE, \"true\");\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertTrue(components.isEmpty());\n  }\n\n  @Test\n  public void\n      shouldProvisionDefaultPluginIfDevfileAlreadyContainPluginWithNameWhichStartWithDefaultOne()\n          throws Exception {\n    // given\n    provisioner =\n        new DefaultEditorProvisioner(\n            EDITOR_REF, TERMINAL_PLUGIN_REF, \"\", fqnParser, pluginFQNParser);\n\n    DevfileImpl devfile = new DevfileImpl();\n    ComponentImpl pluginWithNameSimilarToDefault =\n        new ComponentImpl(\n            PLUGIN_COMPONENT_TYPE, EDITOR_PUBLISHER + \"/\" + TERMINAL_PLUGIN_NAME + \"-dummy/latest\");\n    devfile.getComponents().add(pluginWithNameSimilarToDefault);\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 3);\n    assertTrue(components.contains(new ComponentImpl(EDITOR_COMPONENT_TYPE, EDITOR_REF)));\n    assertTrue(components.contains(new ComponentImpl(PLUGIN_COMPONENT_TYPE, TERMINAL_PLUGIN_REF)));\n    assertTrue(components.contains(pluginWithNameSimilarToDefault));\n  }\n\n  @Test\n  public void shouldNotProvisionDefaultEditorOrDefaultPluginsIfDevfileAlreadyHasNonDefaultEditor()\n      throws Exception {\n    // given\n    provisioner = new DefaultEditorProvisioner(EDITOR_REF, \"\", \"\", fqnParser, pluginFQNParser);\n    DevfileImpl devfile = new DevfileImpl();\n    ComponentImpl nonDefaultEditor =\n        new ComponentImpl(EDITOR_COMPONENT_TYPE, \"anypublisher/anyname/v\" + EDITOR_VERSION);\n    devfile.getComponents().add(nonDefaultEditor);\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 1);\n    assertTrue(components.contains(nonDefaultEditor));\n  }\n\n  @Test\n  public void shouldNotProvisionDefaultEditorIfDevfileAlreadyContainsSuchButWithDifferentVersion()\n      throws Exception {\n    // given\n    provisioner = new DefaultEditorProvisioner(EDITOR_REF, \"\", \"\", fqnParser, pluginFQNParser);\n    DevfileImpl devfile = new DevfileImpl();\n    ComponentImpl myTheiaEditor =\n        new ComponentImpl(\n            EDITOR_COMPONENT_TYPE, EDITOR_PUBLISHER + \"/\" + EDITOR_NAME + \"/my-custom\");\n    devfile.getComponents().add(myTheiaEditor);\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 1);\n    assertTrue(components.contains(myTheiaEditor));\n  }\n\n  @Test\n  public void shouldNotProvisionDefaultEditorIfDevfileAlreadyContainsSuchByReference()\n      throws Exception {\n    // given\n    provisioner = new DefaultEditorProvisioner(EDITOR_REF, \"\", \"\", fqnParser, pluginFQNParser);\n    DevfileImpl devfile = new DevfileImpl();\n    ComponentImpl myTheiaEditor =\n        new ComponentImpl(\n            EDITOR_COMPONENT_TYPE, null, \"https://myregistry.com/abc/meta.yaml\", null, null, null);\n    String meta =\n        \"apiVersion: v2\\n\"\n            + \"publisher: \"\n            + EDITOR_PUBLISHER\n            + \"\\n\"\n            + \"name: \"\n            + EDITOR_NAME\n            + \"\\n\"\n            + \"version: \"\n            + EDITOR_VERSION\n            + \"\\n\"\n            + \"type: Che Editor\";\n    devfile.getComponents().add(myTheiaEditor);\n    when(fileContentProvider.fetchContent(anyString())).thenReturn(meta);\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 1);\n    assertTrue(components.contains(myTheiaEditor));\n  }\n\n  @Test\n  public void shouldNotProvisionDefaultPluginIfDevfileAlreadyContainsSuchButWithDifferentVersion()\n      throws Exception {\n    // given\n    provisioner =\n        new DefaultEditorProvisioner(\n            EDITOR_REF, TERMINAL_PLUGIN_REF, \"\", fqnParser, pluginFQNParser);\n    DevfileImpl devfile = new DevfileImpl();\n    ComponentImpl myTerminal =\n        new ComponentImpl(\n            PLUGIN_COMPONENT_TYPE, EDITOR_PUBLISHER + \"/\" + TERMINAL_PLUGIN_NAME + \"/my-custom\");\n    devfile.getComponents().add(myTerminal);\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 2);\n    assertTrue(components.contains(new ComponentImpl(EDITOR_COMPONENT_TYPE, EDITOR_REF)));\n    assertTrue(components.contains(myTerminal));\n  }\n\n  @Test\n  public void shouldNotProvisionDefaultPluginIfDevfileAlreadyContainsSuchByReference()\n      throws Exception {\n    // given\n    provisioner =\n        new DefaultEditorProvisioner(\n            EDITOR_REF, TERMINAL_PLUGIN_REF, \"\", fqnParser, pluginFQNParser);\n    DevfileImpl devfile = new DevfileImpl();\n    String meta =\n        \"apiVersion: v2\\n\"\n            + \"publisher: \"\n            + EDITOR_PUBLISHER\n            + \"\\n\"\n            + \"name: \"\n            + TERMINAL_PLUGIN_NAME\n            + \"\\n\"\n            + \"version: \"\n            + TERMINAL_PLUGIN_VERSION\n            + \"\\n\"\n            + \"type: Che Plugin\";\n    ComponentImpl myTerminal =\n        new ComponentImpl(\n            PLUGIN_COMPONENT_TYPE, null, \"https://myregistry.com/abc/meta.yaml\", null, null, null);\n    when(fileContentProvider.fetchContent(anyString())).thenReturn(meta);\n    devfile.getComponents().add(myTerminal);\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 2);\n    assertTrue(components.contains(new ComponentImpl(EDITOR_COMPONENT_TYPE, EDITOR_REF)));\n    assertTrue(components.contains(myTerminal));\n  }\n\n  @Test\n  public void shouldGenerateDefaultPluginNameIfIdIsNotUnique() throws Exception {\n    // given\n    provisioner =\n        new DefaultEditorProvisioner(\n            EDITOR_REF, EDITOR_PUBLISHER + \"/\" + \"my-plugin/v2.0\", \"\", fqnParser, pluginFQNParser);\n    DevfileImpl devfile = new DevfileImpl();\n    ComponentImpl myPlugin =\n        new ComponentImpl(\n            PLUGIN_COMPONENT_TYPE, EDITOR_PUBLISHER + \"/\" + \"my-custom-plugin/v0.0.3\");\n    devfile.getComponents().add(myPlugin);\n\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 3);\n    assertTrue(components.contains(new ComponentImpl(EDITOR_COMPONENT_TYPE, EDITOR_REF)));\n    assertTrue(components.contains(myPlugin));\n    ComponentImpl defaultPlugin = findByRef(components, EDITOR_PUBLISHER + \"/\" + \"my-plugin/v2.0\");\n    assertNotNull(defaultPlugin);\n    assertNull(defaultPlugin.getAlias());\n  }\n\n  @Test\n  public void shouldResolveDefaultReferencePlugins() throws Exception {\n    // given\n    String referencePluginRef = \"https://remotepluginregistry.com/plugins/abc/meta.yaml\";\n    provisioner =\n        new DefaultEditorProvisioner(\n            EDITOR_REF,\n            EDITOR_PUBLISHER + \"/\" + \"my-plugin/v2.0\" + \",\" + referencePluginRef,\n            \"\",\n            fqnParser,\n            pluginFQNParser);\n    String meta =\n        \"apiVersion: v2\\n\"\n            + \"publisher: \"\n            + EDITOR_PUBLISHER\n            + \"\\n\"\n            + \"name: \"\n            + COMMAND_PLUGIN_NAME\n            + \"\\n\"\n            + \"version: v1.0.0\"\n            + \"\\n\"\n            + \"type: Che Plugin\";\n    DevfileImpl devfile = new DevfileImpl();\n    when(fileContentProvider.fetchContent(anyString())).thenReturn(meta);\n    ComponentImpl myPlugin = new ComponentImpl(PLUGIN_COMPONENT_TYPE, COMMAND_PLUGIN_REF);\n    myPlugin.setReference(referencePluginRef);\n    myPlugin.setId(COMMAND_PLUGIN_REF);\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 3);\n    assertTrue(components.contains(myPlugin));\n  }\n\n  @Test\n  public void shouldProvisionAsyncStoragePluginsIfWorkspaceHasOnlyOneAttribute() throws Exception {\n    // given\n    provisioner =\n        new DefaultEditorProvisioner(\n            EDITOR_REF, TERMINAL_PLUGIN_REF, ASYNC_STORAGE_PLUGIN_REF, fqnParser, pluginFQNParser);\n\n    DevfileImpl devfile = new DevfileImpl();\n    devfile.setAttributes(ImmutableMap.of(Constants.ASYNC_PERSIST_ATTRIBUTE, \"true\"));\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 2);\n\n    assertFalse(\n        components.contains(new ComponentImpl(PLUGIN_COMPONENT_TYPE, ASYNC_STORAGE_PLUGIN_REF)));\n  }\n\n  @Test\n  public void shouldProvisionAsyncStoragePluginsIfWorkspaceHasBothAttributes() throws Exception {\n    // given\n    provisioner =\n        new DefaultEditorProvisioner(\n            EDITOR_REF, TERMINAL_PLUGIN_REF, ASYNC_STORAGE_PLUGIN_REF, fqnParser, pluginFQNParser);\n\n    DevfileImpl devfile = new DevfileImpl();\n    devfile.setAttributes(\n        ImmutableMap.of(\n            Constants.ASYNC_PERSIST_ATTRIBUTE,\n            \"true\",\n            Constants.PERSIST_VOLUMES_ATTRIBUTE,\n            \"false\"));\n    // when\n    provisioner.apply(devfile, fileContentProvider);\n\n    // then\n    List<ComponentImpl> components = devfile.getComponents();\n    assertEquals(components.size(), 3);\n\n    assertTrue(\n        components.contains(new ComponentImpl(PLUGIN_COMPONENT_TYPE, ASYNC_STORAGE_PLUGIN_REF)));\n  }\n\n  private ComponentImpl findById(List<ComponentImpl> components, String id) {\n    return components.stream()\n        .filter(c -> c.getId() != null && c.getId().startsWith(id + ':'))\n        .findAny()\n        .orElse(null);\n  }\n\n  private ComponentImpl findByRef(List<ComponentImpl> components, String ref) {\n    return components.stream().filter(c -> ref.equals(c.getId())).findAny().orElse(null);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/convert/DevfileConverterTest.java",
    "content": "/*\n * Copyright (c) 2012-2024 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert;\n\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.CURRENT_API_VERSION;\nimport static org.eclipse.che.api.workspace.shared.Constants.PERSIST_VOLUMES_ATTRIBUTE;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertSame;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceConfig;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.URLFetcher;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentToWorkspaceApplier;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.ProjectConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ProjectImpl;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class DevfileConverterTest {\n\n  public static final String COMPONENT_TYPE = \"componentType\";\n  @Mock private ProjectConverter projectConverter;\n  @Mock private CommandConverter commandConverter;\n  @Mock private ComponentToWorkspaceApplier componentToWorkspaceApplier;\n  @Mock private DefaultEditorProvisioner defaultEditorToolApplier;\n  @Mock private URLFetcher urlFetcher;\n\n  private DevfileConverter devfileConverter;\n\n  @BeforeMethod\n  public void setUp() {\n    devfileConverter =\n        new DevfileConverter(\n            projectConverter,\n            commandConverter,\n            ImmutableMap.of(COMPONENT_TYPE, componentToWorkspaceApplier),\n            defaultEditorToolApplier,\n            urlFetcher);\n  }\n\n  @Test\n  public void shouldUseDevfileNameForWorkspaceNameDuringConvertingDevfileToWorkspaceConfig()\n      throws Exception {\n    // given\n    FileContentProvider fileContentProvider = mock(FileContentProvider.class);\n    DevfileImpl devfile = newDevfile(\"petclinic\");\n\n    // when\n    WorkspaceConfigImpl workspaceConfig =\n        devfileConverter.devFileToWorkspaceConfig(devfile, fileContentProvider);\n\n    // then\n    assertEquals(workspaceConfig.getName(), \"petclinic\");\n  }\n\n  @Test\n  public void shouldInvokeDefaultEditorProvisionerDuringConvertingDevfileToWorkrspaceConfig()\n      throws Exception {\n    // given\n    FileContentProvider fileContentProvider = mock(FileContentProvider.class);\n    DevfileImpl devfile = newDevfile(\"petclinic\");\n\n    // when\n    devfileConverter.devFileToWorkspaceConfig(devfile, fileContentProvider);\n\n    // then\n    verify(defaultEditorToolApplier).apply(devfile, fileContentProvider);\n  }\n\n  @Test\n  public void\n      shouldProvisionDevfileAttributesAsConfigAttributesDuringConvertingDevfileToWorkspaceConfig()\n          throws Exception {\n    // given\n    FileContentProvider fileContentProvider = mock(FileContentProvider.class);\n    Map<String, String> devfileAttributes = new HashMap<>();\n    devfileAttributes.put(PERSIST_VOLUMES_ATTRIBUTE, \"false\");\n    devfileAttributes.put(\"anotherAttribute\", \"value\");\n\n    DevfileImpl devfile = newDevfile(\"petclinic\");\n    devfile.getAttributes().putAll(devfileAttributes);\n\n    // when\n    WorkspaceConfigImpl config =\n        devfileConverter.devFileToWorkspaceConfig(devfile, fileContentProvider);\n\n    // then\n    assertEquals(config.getAttributes(), devfileAttributes);\n  }\n\n  @Test\n  public void shouldConvertCommandsDuringConvertingDevfileToWorkspaceConfig() throws Exception {\n    // given\n    FileContentProvider fileContentProvider = mock(FileContentProvider.class);\n    DevfileImpl devfile = newDevfile(\"petclinic\");\n    CommandImpl devfileCommand = mock(CommandImpl.class);\n    devfile.getCommands().add(devfileCommand);\n\n    org.eclipse.che.api.workspace.server.model.impl.CommandImpl workspaceCommand =\n        mock(org.eclipse.che.api.workspace.server.model.impl.CommandImpl.class);\n    when(commandConverter.toWorkspaceCommand(any(), any())).thenReturn(workspaceCommand);\n\n    // when\n    WorkspaceConfigImpl workspaceConfig =\n        devfileConverter.devFileToWorkspaceConfig(devfile, fileContentProvider);\n\n    // then\n    assertEquals(workspaceConfig.getCommands().size(), 1);\n    assertSame(workspaceConfig.getCommands().get(0), workspaceCommand);\n  }\n\n  @Test\n  public void shouldConvertProjectsDuringConvertingDevfileToWorkspaceConfig() throws Exception {\n    // given\n    FileContentProvider fileContentProvider = mock(FileContentProvider.class);\n    DevfileImpl devfile = newDevfile(\"petclinic\");\n    ProjectImpl devfileProject = mock(ProjectImpl.class);\n    devfile.getProjects().add(devfileProject);\n\n    ProjectConfigImpl workspaceProject = mock(ProjectConfigImpl.class);\n    when(projectConverter.toWorkspaceProject(any())).thenReturn(workspaceProject);\n\n    // when\n    WorkspaceConfigImpl workspaceConfig =\n        devfileConverter.devFileToWorkspaceConfig(devfile, fileContentProvider);\n\n    // then\n    assertEquals(workspaceConfig.getProjects().size(), 1);\n    assertSame(workspaceConfig.getProjects().get(0), workspaceProject);\n  }\n\n  @Test\n  public void shouldConvertComponentsDuringConvertingDevfileToWorkspaceConfig() throws Exception {\n    // given\n    DevfileImpl devfile = newDevfile(\"petclinic\");\n    ComponentImpl component = new ComponentImpl();\n    component.setType(COMPONENT_TYPE);\n    devfile.getComponents().add(component);\n\n    FileContentProvider fileContentProvider = mock(FileContentProvider.class);\n\n    // when\n    WorkspaceConfigImpl workspaceConfig =\n        devfileConverter.devFileToWorkspaceConfig(devfile, fileContentProvider);\n\n    // then\n    verify(componentToWorkspaceApplier).apply(workspaceConfig, component, fileContentProvider);\n  }\n\n  @Test\n  public void shouldConvertDevfileToWorkspaceConfig() throws Exception {\n    devfileConverter = spy(devfileConverter);\n    WorkspaceConfigImpl wsConfig = new WorkspaceConfigImpl();\n    wsConfig.setName(\"converted\");\n    wsConfig.getAttributes().put(\"att\", \"value\");\n    doReturn(wsConfig).when(devfileConverter).devFileToWorkspaceConfig(any(), any());\n\n    WorkspaceConfig converted = devfileConverter.convert(new DevfileImpl());\n\n    assertEquals(converted, wsConfig);\n  }\n\n  @Test(expectedExceptions = ServerException.class, expectedExceptionsMessageRegExp = \"error\")\n  public void\n      shouldThrowServerExceptionIfAnyDevfileExceptionOccursOnConvertingDevfileToWorkspaceConfig()\n          throws Exception {\n    devfileConverter = spy(devfileConverter);\n    doThrow(new DevfileException(\"error\"))\n        .when(devfileConverter)\n        .devFileToWorkspaceConfig(any(), any());\n\n    devfileConverter.convert(new DevfileImpl());\n  }\n\n  private DevfileImpl newDevfile(String name) {\n    DevfileImpl devfile = new DevfileImpl();\n    devfile.setApiVersion(CURRENT_API_VERSION);\n    devfile.setName(name);\n    return devfile;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/convert/ProjectConverterTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert;\n\nimport static org.eclipse.che.api.core.model.workspace.config.SourceStorage.BRANCH_PARAMETER_NAME;\nimport static org.eclipse.che.api.core.model.workspace.config.SourceStorage.COMMIT_ID_PARAMETER_NAME;\nimport static org.eclipse.che.api.core.model.workspace.config.SourceStorage.SPARSE_CHECKOUT_DIR_PARAMETER_NAME;\nimport static org.eclipse.che.api.core.model.workspace.config.SourceStorage.START_POINT_PARAMETER_NAME;\nimport static org.eclipse.che.api.core.model.workspace.config.SourceStorage.TAG_PARAMETER_NAME;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.AssertJUnit.assertFalse;\n\nimport com.google.common.collect.ImmutableMap;\nimport org.eclipse.che.api.core.model.workspace.devfile.Project;\nimport org.eclipse.che.api.core.model.workspace.devfile.Source;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;\nimport org.eclipse.che.api.workspace.server.model.impl.ProjectConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.SourceStorageImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ProjectImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.SourceImpl;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Test;\n\n/**\n * @author Sergii Leshchenko\n */\npublic class ProjectConverterTest {\n\n  private ProjectConverter projectConverter;\n\n  @BeforeMethod\n  public void setUp() {\n    projectConverter = new ProjectConverter();\n  }\n\n  @Test\n  public void testConvertingDevfileProjectToProjectConfig() throws Exception {\n    ProjectImpl devfileProject =\n        new ProjectImpl(\n            \"myProject\",\n            new SourceImpl(\n                \"git\", \"https://github.com/eclipse/che.git\", \"master\", \"3434d\", null, null, \"core\"),\n            null);\n\n    ProjectConfigImpl workspaceProject = projectConverter.toWorkspaceProject(devfileProject);\n\n    assertEquals(workspaceProject.getName(), \"myProject\");\n    assertEquals(workspaceProject.getPath(), \"/myProject\");\n    SourceStorageImpl source = workspaceProject.getSource();\n    assertEquals(source.getType(), \"git\");\n    assertEquals(source.getLocation(), \"https://github.com/eclipse/che.git\");\n    assertEquals(source.getParameters().get(BRANCH_PARAMETER_NAME), \"master\");\n    assertEquals(source.getParameters().get(START_POINT_PARAMETER_NAME), \"3434d\");\n    assertEquals(source.getParameters().get(\"keepDir\"), \"core\");\n  }\n\n  @Test\n  public void testConvertingProjectConfigToDevfileProject() {\n    ProjectConfigImpl workspaceProject = new ProjectConfigImpl();\n    workspaceProject.setName(\"myProject\");\n    workspaceProject.setPath(\"/clone/path\");\n    SourceStorageImpl sourceStorage = new SourceStorageImpl();\n    sourceStorage.setType(\"git\");\n    sourceStorage.setLocation(\"https://github.com/eclipse/che.git\");\n    sourceStorage.setParameters(\n        ImmutableMap.of(TAG_PARAMETER_NAME, \"v1.0\", BRANCH_PARAMETER_NAME, \"develop\"));\n    workspaceProject.setSource(sourceStorage);\n\n    Project devfileProject = projectConverter.toDevfileProject(workspaceProject);\n\n    assertEquals(devfileProject.getName(), \"myProject\");\n    Source source = devfileProject.getSource();\n    assertEquals(source.getType(), \"git\");\n    assertEquals(source.getLocation(), \"https://github.com/eclipse/che.git\");\n    assertEquals(source.getBranch(), \"develop\");\n    assertEquals(source.getTag(), \"v1.0\");\n    assertEquals(devfileProject.getClonePath(), \"clone/path\");\n  }\n\n  @Test\n  public void testClonePathSetWhenConvertingDevfileToProjectConfig() throws Exception {\n    ProjectImpl devfileProject =\n        new ProjectImpl(\n            \"myProject\",\n            new SourceImpl(\n                \"git\", \"https://github.com/eclipse/che.git\", \"master\", null, null, null, null),\n            \"down/the/rabbit/hole/myProject\");\n\n    ProjectConfigImpl workspaceProject = projectConverter.toWorkspaceProject(devfileProject);\n\n    assertEquals(workspaceProject.getName(), \"myProject\");\n    assertEquals(workspaceProject.getPath(), \"/down/the/rabbit/hole/myProject\");\n    SourceStorageImpl source = workspaceProject.getSource();\n    assertEquals(source.getType(), \"git\");\n    assertEquals(source.getLocation(), \"https://github.com/eclipse/che.git\");\n  }\n\n  @Test(expectedExceptions = DevfileException.class)\n  public void testClonePathCannotEscapeProjectsRoot() throws Exception {\n    ProjectImpl devfileProject =\n        new ProjectImpl(\n            \"myProject\",\n            new SourceImpl(\n                \"git\", \"https://github.com/eclipse/che.git\", \"master\", null, null, null, null),\n            \"cant/hack/../../../usr/bin\");\n\n    projectConverter.toWorkspaceProject(devfileProject);\n  }\n\n  @Test(expectedExceptions = DevfileException.class)\n  public void testClonePathCannotBeAbsolute() throws Exception {\n    ProjectImpl devfileProject =\n        new ProjectImpl(\n            \"myProject\",\n            new SourceImpl(\n                \"git\", \"https://github.com/eclipse/che.git\", \"master\", null, null, null, null),\n            \"/usr/bin\");\n\n    projectConverter.toWorkspaceProject(devfileProject);\n  }\n\n  @Test\n  public void testUpDirOkInClonePathAsLongAsItDoesntEscapeProjectsRoot() throws Exception {\n    ProjectImpl devfileProject =\n        new ProjectImpl(\n            \"myProject\",\n            new SourceImpl(\n                \"git\", \"https://github.com/eclipse/che.git\", \"master\", null, null, null, null),\n            \"cant/hack/../../usr/bin\");\n\n    ProjectConfigImpl workspaceProject = projectConverter.toWorkspaceProject(devfileProject);\n    // this is OK, because the absolute-looking path is applied to the projects root\n    assertEquals(workspaceProject.getPath(), \"/usr/bin\");\n  }\n\n  @Test(expectedExceptions = DevfileException.class)\n  public void testCloningIntoProjectsRootFails() throws Exception {\n    ProjectImpl devfileProject =\n        new ProjectImpl(\n            \"myProject\",\n            new SourceImpl(\n                \"git\", \"https://github.com/eclipse/che.git\", \"master\", null, null, null, null),\n            \"not/../in/root/../..\");\n\n    projectConverter.toWorkspaceProject(devfileProject);\n  }\n\n  @Test(\n      expectedExceptions = DevfileException.class,\n      expectedExceptionsMessageRegExp =\n          \"Only one of '\"\n              + START_POINT_PARAMETER_NAME\n              + \"', '\"\n              + TAG_PARAMETER_NAME\n              + \"', '\"\n              + COMMIT_ID_PARAMETER_NAME\n              + \"' can be specified\\\\.\",\n      dataProvider = \"invalidStartPointOrTagOrCommitIdCombinations\")\n  public void testOnlyOneOfStartPointAttributesAllowed(\n      String startPoint, String tag, String commitId) throws Exception {\n    ProjectImpl devfileProject =\n        new ProjectImpl(\n            \"myProject\",\n            new SourceImpl(\n                \"git\", \"https://github.com/eclipse/che.git\", null, startPoint, tag, commitId, null),\n            null);\n\n    projectConverter.toWorkspaceProject(devfileProject);\n  }\n\n  @DataProvider\n  public static Object[][] invalidStartPointOrTagOrCommitIdCombinations() {\n    return new Object[][] {\n      new Object[] {\"a\", \"b\", null},\n      new Object[] {\"a\", null, \"b\"},\n      new Object[] {null, \"a\", \"b\"},\n      new Object[] {\"a\", \"b\", \"c\"}\n    };\n  }\n\n  @Test\n  public void testUndefinedCloneParametersNotTransferredToWorkspaceConfig() throws Exception {\n    ProjectImpl devfileProject =\n        new ProjectImpl(\n            \"myProject\",\n            new SourceImpl(\n                \"git\", \"https://github.com/eclipse/che.git\", null, null, null, null, null),\n            null);\n\n    ProjectConfigImpl wsProject = projectConverter.toWorkspaceProject(devfileProject);\n    SourceStorageImpl wsSource = wsProject.getSource();\n\n    assertFalse(wsSource.getParameters().containsKey(BRANCH_PARAMETER_NAME));\n    assertFalse(wsSource.getParameters().containsKey(START_POINT_PARAMETER_NAME));\n    assertFalse(wsSource.getParameters().containsKey(TAG_PARAMETER_NAME));\n    assertFalse(wsSource.getParameters().containsKey(COMMIT_ID_PARAMETER_NAME));\n    assertFalse(wsSource.getParameters().containsKey(SPARSE_CHECKOUT_DIR_PARAMETER_NAME));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/convert/component/editor/EditorComponentToWorkspaceApplierTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert.component.editor;\n\nimport static org.eclipse.che.api.core.model.workspace.config.Command.PLUGIN_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.EDITOR_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.shared.Constants.WORKSPACE_TOOLING_EDITOR_ATTRIBUTE;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentFQNParser;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.wsplugins.PluginFQNParser;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class EditorComponentToWorkspaceApplierTest {\n\n  @Mock private FileContentProvider fileContentProvider;\n\n  private EditorComponentToWorkspaceApplier editorComponentApplier;\n  private PluginFQNParser fqnParser = new PluginFQNParser();\n\n  @BeforeMethod\n  public void setUp() {\n    editorComponentApplier =\n        new EditorComponentToWorkspaceApplier(new ComponentFQNParser(fqnParser));\n  }\n\n  @Test\n  public void shouldProvisionWorkspaceEditorAttributeDuringCheEditorComponentApplying()\n      throws Exception {\n    String editorId = \"eclipse/super-editor/0.0.1\";\n    // given\n    WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();\n    ComponentImpl editorComponent = new ComponentImpl();\n    editorComponent.setType(EDITOR_COMPONENT_TYPE);\n    editorComponent.setAlias(\"editor\");\n    editorComponent.setId(editorId);\n    editorComponent.setMemoryLimit(\"12345M\");\n\n    // when\n    editorComponentApplier.apply(workspaceConfig, editorComponent, null);\n\n    // then\n    assertEquals(workspaceConfig.getAttributes().get(WORKSPACE_TOOLING_EDITOR_ATTRIBUTE), editorId);\n  }\n\n  @Test\n  public void\n      shouldProvisionWorkspaceEditorAttributeWithCustomRegistryDuringCheEditorComponentApplying()\n          throws Exception {\n    String editorId = \"eclipse/super-editor/0.0.1\";\n    String registryUrl = \"https://myregistry.com/infolder/\";\n    // given\n    WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();\n    ComponentImpl editorComponent = new ComponentImpl();\n    editorComponent.setType(EDITOR_COMPONENT_TYPE);\n    editorComponent.setAlias(\"editor1\");\n    editorComponent.setId(editorId);\n    editorComponent.setRegistryUrl(registryUrl);\n    editorComponent.setMemoryLimit(\"12345M\");\n\n    // when\n    editorComponentApplier.apply(workspaceConfig, editorComponent, null);\n\n    // then\n    assertEquals(\n        workspaceConfig.getAttributes().get(WORKSPACE_TOOLING_EDITOR_ATTRIBUTE),\n        registryUrl + \"#\" + editorId);\n  }\n\n  @Test\n  public void shouldProvisionWorkspaceEditorAttributeWithReferenceDuringCheEditorComponentApplying()\n      throws Exception {\n    String reference = \"https://myregistry.com/infolder/meta.yaml\";\n    String meta =\n        \"apiVersion: v2\\n\"\n            + \"publisher: eclipse\\n\"\n            + \"name: super-editor\\n\"\n            + \"version: 0.0.1\\n\"\n            + \"type: Che Editor\";\n    // given\n    WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();\n    ComponentImpl editorComponent = new ComponentImpl();\n    editorComponent.setType(EDITOR_COMPONENT_TYPE);\n    editorComponent.setAlias(\"editor1\");\n    editorComponent.setReference(reference);\n    editorComponent.setMemoryLimit(\"12345M\");\n    when(fileContentProvider.fetchContent(anyString())).thenReturn(meta);\n\n    // when\n    editorComponentApplier.apply(workspaceConfig, editorComponent, fileContentProvider);\n\n    // then\n    assertEquals(\n        workspaceConfig.getAttributes().get(WORKSPACE_TOOLING_EDITOR_ATTRIBUTE), reference);\n    assertEquals(editorComponent.getId(), \"eclipse/super-editor/0.0.1\");\n  }\n\n  @Test\n  public void shouldProvisionPluginCommandAttributesDuringCheEditorComponentApplying()\n      throws Exception {\n    // given\n    ComponentImpl superPluginComponent = new ComponentImpl();\n    superPluginComponent.setAlias(\"editor\");\n    superPluginComponent.setId(\"eclipse/super-editor/0.0.1\");\n    superPluginComponent.setType(EDITOR_COMPONENT_TYPE);\n\n    WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();\n    CommandImpl command = new CommandImpl();\n    command.getAttributes().put(COMPONENT_ALIAS_COMMAND_ATTRIBUTE, \"editor\");\n    workspaceConfig.getCommands().add(command);\n\n    // when\n    editorComponentApplier.apply(workspaceConfig, superPluginComponent, null);\n\n    // then\n    assertEquals(\n        workspaceConfig.getCommands().get(0).getAttributes().get(PLUGIN_ATTRIBUTE),\n        \"eclipse/super-editor/0.0.1\");\n  }\n\n  @Test\n  public void shouldProvisionPluginCommandAttributeWhenIdIsURLToCustomPluginRegistry()\n      throws Exception {\n    // given\n    ComponentImpl superPluginComponent = new ComponentImpl();\n    superPluginComponent.setAlias(\"editor\");\n    superPluginComponent.setId(\"https://custom-plugin.registry/plugins#eclipse/super-editor/0.0.1\");\n    superPluginComponent.setType(EDITOR_COMPONENT_TYPE);\n\n    WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();\n    CommandImpl command = new CommandImpl();\n    command.getAttributes().put(COMPONENT_ALIAS_COMMAND_ATTRIBUTE, \"editor\");\n    workspaceConfig.getCommands().add(command);\n\n    // when\n    editorComponentApplier.apply(workspaceConfig, superPluginComponent, null);\n\n    // then\n    assertEquals(\n        workspaceConfig.getCommands().get(0).getAttributes().get(PLUGIN_ATTRIBUTE),\n        \"eclipse/super-editor/0.0.1\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/convert/component/plugin/PluginComponentToWorkspaceApplierTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.convert.component.plugin;\n\nimport static org.eclipse.che.api.core.model.workspace.config.Command.PLUGIN_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.PLUGIN_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.shared.Constants.WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentFQNParser;\nimport org.eclipse.che.api.workspace.server.model.impl.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.wsplugins.PluginFQNParser;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class PluginComponentToWorkspaceApplierTest {\n\n  @Mock private FileContentProvider fileContentProvider;\n\n  private PluginComponentToWorkspaceApplier pluginComponentApplier;\n  private PluginFQNParser fqnParser = new PluginFQNParser();\n\n  @BeforeMethod\n  public void setUp() {\n    pluginComponentApplier =\n        new PluginComponentToWorkspaceApplier(new ComponentFQNParser(fqnParser));\n  }\n\n  @Test\n  public void shouldProvisionPluginWorkspaceAttributeDuringChePluginComponentApplying()\n      throws Exception {\n\n    String superPluginId = \"eclipse/super-plugin/0.0.1\";\n    // given\n    ComponentImpl superPluginComponent = new ComponentImpl();\n    superPluginComponent.setAlias(\"super-plugin\");\n    superPluginComponent.setId(superPluginId);\n    superPluginComponent.setType(PLUGIN_COMPONENT_TYPE);\n    superPluginComponent.setMemoryLimit(\"1234M\");\n    superPluginComponent.getPreferences().put(\"java-home\", \"/home/user/jdk11\");\n\n    ComponentImpl customPluginComponent = new ComponentImpl();\n    customPluginComponent.setAlias(\"custom\");\n    customPluginComponent.setId(\"publisher1/custom-plugin/v1\");\n    customPluginComponent.setType(PLUGIN_COMPONENT_TYPE);\n\n    WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();\n\n    // when\n    pluginComponentApplier.apply(workspaceConfig, superPluginComponent, null);\n    pluginComponentApplier.apply(workspaceConfig, customPluginComponent, null);\n\n    // then\n    String workspaceTooling =\n        workspaceConfig.getAttributes().get(WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE);\n    assertTrue(workspaceTooling.matches(\"(.+/.+/.+),(.+/.+/.+)\"));\n    assertTrue(workspaceTooling.contains(superPluginId));\n    assertTrue(workspaceTooling.contains(\"publisher1/custom-plugin/v1\"));\n  }\n\n  @Test\n  public void\n      shouldProvisionPluginWorkspaceAttributeWithCustomRegistryDuringChePluginComponentApplying()\n          throws Exception {\n\n    String superPluginId = \"eclipse/super-plugin/0.0.1\";\n    String registryUrl = \"https://myregistry.com/infolder/\";\n    // given\n    ComponentImpl superPluginComponent = new ComponentImpl();\n    superPluginComponent.setAlias(\"super-plugin\");\n    superPluginComponent.setId(superPluginId);\n    superPluginComponent.setType(PLUGIN_COMPONENT_TYPE);\n    superPluginComponent.setMemoryLimit(\"1234M\");\n\n    ComponentImpl customPluginComponent = new ComponentImpl();\n    customPluginComponent.setAlias(\"custom\");\n    customPluginComponent.setId(\"publisher1/custom-plugin/v1\");\n    customPluginComponent.setRegistryUrl(registryUrl);\n    customPluginComponent.setType(PLUGIN_COMPONENT_TYPE);\n\n    WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();\n\n    // when\n    pluginComponentApplier.apply(workspaceConfig, superPluginComponent, null);\n    pluginComponentApplier.apply(workspaceConfig, customPluginComponent, null);\n\n    // then\n    String workspaceTooling =\n        workspaceConfig.getAttributes().get(WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE);\n    assertTrue(workspaceTooling.matches(\"(.+/.+/.+),(.+/.+/.+)\"));\n    assertTrue(workspaceTooling.contains(superPluginId));\n    assertTrue(workspaceTooling.contains(registryUrl + \"#\" + \"publisher1/custom-plugin/v1\"));\n  }\n\n  @Test\n  public void shouldProvisionPluginWorkspaceAttributeWithReferenceDuringChePluginComponentApplying()\n      throws Exception {\n\n    String superPluginId = \"eclipse/super-plugin/0.0.1\";\n    String reference = \"https://myregistry.com/infolder/meta.yaml\";\n    String meta =\n        \"apiVersion: v2\\n\"\n            + \"publisher: eclipse\\n\"\n            + \"name: super-plugin\\n\"\n            + \"version: 0.0.1\\n\"\n            + \"type: Che Plugin\";\n    // given\n    ComponentImpl superPluginComponent = new ComponentImpl();\n    superPluginComponent.setAlias(\"super-plugin\");\n    superPluginComponent.setId(superPluginId);\n    superPluginComponent.setType(PLUGIN_COMPONENT_TYPE);\n    superPluginComponent.setMemoryLimit(\"1234M\");\n\n    when(fileContentProvider.fetchContent(anyString())).thenReturn(meta);\n\n    ComponentImpl customPluginComponent = new ComponentImpl();\n    customPluginComponent.setAlias(\"custom\");\n    customPluginComponent.setType(PLUGIN_COMPONENT_TYPE);\n    customPluginComponent.setReference(reference);\n\n    WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();\n\n    // when\n    pluginComponentApplier.apply(workspaceConfig, superPluginComponent, fileContentProvider);\n    pluginComponentApplier.apply(workspaceConfig, customPluginComponent, fileContentProvider);\n\n    // then\n    String workspaceTooling =\n        workspaceConfig.getAttributes().get(WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE);\n    assertTrue(workspaceTooling.matches(\"(.+/.+/.+),(https://.+/.+/.+)\"));\n    assertTrue(workspaceTooling.contains(superPluginId));\n    assertTrue(workspaceTooling.contains(reference));\n    assertEquals(customPluginComponent.getId(), \"eclipse/super-plugin/0.0.1\");\n  }\n\n  @Test\n  public void shouldProvisionPluginCommandAttributesDuringChePluginComponentApplying()\n      throws Exception {\n    // given\n    ComponentImpl superPluginComponent = new ComponentImpl();\n    superPluginComponent.setAlias(\"super-plugin\");\n    superPluginComponent.setId(\"eclipse/super-plugin/0.0.1\");\n    superPluginComponent.setType(PLUGIN_COMPONENT_TYPE);\n\n    WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();\n    CommandImpl command = new CommandImpl();\n    command.getAttributes().put(COMPONENT_ALIAS_COMMAND_ATTRIBUTE, \"super-plugin\");\n    workspaceConfig.getCommands().add(command);\n\n    // when\n    pluginComponentApplier.apply(workspaceConfig, superPluginComponent, null);\n\n    // then\n    assertEquals(\n        workspaceConfig.getCommands().get(0).getAttributes().get(PLUGIN_ATTRIBUTE),\n        \"eclipse/super-plugin/0.0.1\");\n  }\n\n  @Test\n  public void shouldProvisionPluginCommandAttributeWhenIdIsURLToCustomPluginRegistry()\n      throws Exception {\n    // given\n    ComponentImpl superPluginComponent = new ComponentImpl();\n    superPluginComponent.setAlias(\"super-plugin\");\n    superPluginComponent.setId(\n        \"https://custom-plugin.registry/plugins/#eclipse/super-plugin/0.0.1\");\n    superPluginComponent.setType(PLUGIN_COMPONENT_TYPE);\n\n    WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();\n    CommandImpl command = new CommandImpl();\n    command.getAttributes().put(COMPONENT_ALIAS_COMMAND_ATTRIBUTE, \"super-plugin\");\n    workspaceConfig.getCommands().add(command);\n\n    // when\n    pluginComponentApplier.apply(workspaceConfig, superPluginComponent, null);\n\n    // then\n    assertEquals(\n        workspaceConfig.getCommands().get(0).getAttributes().get(PLUGIN_ATTRIBUTE),\n        \"eclipse/super-plugin/0.0.1\");\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/validator/DevfileIntegrityValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2023 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.devfile.validator;\n\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.DOCKERIMAGE_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.EDITOR_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.OPENSHIFT_COMPONENT_TYPE;\nimport static org.eclipse.che.api.workspace.server.devfile.Constants.PLUGIN_COMPONENT_TYPE;\nimport static org.mockito.Mockito.mock;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.dataformat.yaml.YAMLFactory;\nimport com.google.common.collect.ImmutableList;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Map;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ActionImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.CommandImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EndpointImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EnvImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.ProjectImpl;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\nimport org.testng.reporters.Files;\n\n@Listeners(MockitoTestNGListener.class)\npublic class DevfileIntegrityValidatorTest {\n\n  private ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());\n\n  private DevfileImpl initialDevfile;\n\n  private DevfileIntegrityValidator integrityValidator;\n\n  @Mock private ComponentIntegrityValidator dummyComponentValidator;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    Map<String, ComponentIntegrityValidator> componentValidators = new HashMap<>();\n    componentValidators.put(KUBERNETES_COMPONENT_TYPE, dummyComponentValidator);\n    componentValidators.put(OPENSHIFT_COMPONENT_TYPE, dummyComponentValidator);\n    componentValidators.put(PLUGIN_COMPONENT_TYPE, dummyComponentValidator);\n    componentValidators.put(EDITOR_COMPONENT_TYPE, dummyComponentValidator);\n\n    integrityValidator = new DevfileIntegrityValidator(componentValidators);\n    String devFileYamlContent =\n        Files.readFile(getClass().getClassLoader().getResourceAsStream(\"devfile/devfile.yaml\"));\n    initialDevfile = objectMapper.readValue(devFileYamlContent, DevfileImpl.class);\n  }\n\n  @Test\n  public void shouldValidateCorrectDevfile() throws Exception {\n    // when\n    integrityValidator.validateDevfile(initialDevfile);\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp = \"Duplicate component alias found:'mvn-stack'\")\n  public void shouldThrowExceptionOnDuplicateComponentAlias() throws Exception {\n    DevfileImpl broken = new DevfileImpl(initialDevfile);\n    ComponentImpl component = new ComponentImpl();\n    component.setAlias(initialDevfile.getComponents().get(0).getAlias());\n    broken.getComponents().add(component);\n    // when\n    integrityValidator.validateDevfile(broken);\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"Duplicated endpoint name 'e1' found in 'dockerimage:latest' component\")\n  public void shouldThrowExceptionOnDuplicateEndpointName() throws Exception {\n    DevfileImpl broken = new DevfileImpl(initialDevfile);\n    ComponentImpl component = new ComponentImpl();\n    component.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    component.setImage(\"dockerimage:latest\");\n    component.setEndpoints(\n        ImmutableList.of(\n            new EndpointImpl(\"e1\", 8080, Collections.emptyMap()),\n            new EndpointImpl(\"e1\", 8082, Collections.emptyMap())));\n    broken.getComponents().add(component);\n    // when\n    integrityValidator.validateDevfile(broken);\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"Multiple editor components found: 'eclipse/che-theia/0.0.3', 'editor-2'\")\n  public void shouldThrowExceptionOnMultipleEditors() throws Exception {\n    DevfileImpl broken = new DevfileImpl(initialDevfile);\n    ComponentImpl component = new ComponentImpl();\n    component.setAlias(\"editor-2\");\n    component.setType(EDITOR_COMPONENT_TYPE);\n    broken.getComponents().add(component);\n    // when\n    integrityValidator.validateDevfile(broken);\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp = \"Duplicate command name found:'build'\")\n  public void shouldThrowExceptionOnDuplicateCommandName() throws Exception {\n    DevfileImpl broken = new DevfileImpl(initialDevfile);\n\n    CommandImpl command = new CommandImpl();\n    command.setName(initialDevfile.getCommands().get(0).getName());\n    broken.getCommands().add(command);\n    // when\n    integrityValidator.validateDevfile(broken);\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp = \"Command 'build' does not have actions.\")\n  public void shouldThrowExceptionWhenCommandDoesNotHaveActions() throws Exception {\n    DevfileImpl broken = new DevfileImpl(initialDevfile);\n    broken.getCommands().get(0).getActions().clear();\n\n    // when\n    integrityValidator.validateDevfile(broken);\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"Multiple actions in command 'build' are not supported yet.\")\n  public void shouldThrowExceptionWhenCommandHasMultipleActions() throws Exception {\n    DevfileImpl broken = new DevfileImpl(initialDevfile);\n    broken.getCommands().get(0).getActions().add(new ActionImpl());\n\n    // when\n    integrityValidator.validateDevfile(broken);\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"Command 'build' has action that refers to a component with unknown alias 'no_such_component'\")\n  public void shouldThrowExceptionOnUnexistingCommandActionComponent() throws Exception {\n    DevfileImpl broken = new DevfileImpl(initialDevfile);\n    broken.getCommands().get(0).getActions().clear();\n    ActionImpl action = new ActionImpl();\n    action.setComponent(\"no_such_component\");\n    broken.getCommands().get(0).getActions().add(action);\n\n    // when\n    integrityValidator.validateDevfile(broken);\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp = \"Duplicate project name found:'petclinic'\")\n  public void shouldThrowExceptionOnDuplicateProjectName() throws Exception {\n    DevfileImpl broken = new DevfileImpl(initialDevfile);\n    ProjectImpl project = new ProjectImpl();\n    project.setName(initialDevfile.getProjects().get(0).getName());\n    broken.getProjects().add(project);\n    // when\n    integrityValidator.validateDevfile(broken);\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"Duplicate environment variable 'foo' found in component 'test1'\")\n  public void shouldThrowExceptionOnDuplicateEnvironmentVariable() throws Exception {\n    DevfileImpl broken = new DevfileImpl(initialDevfile);\n    ComponentImpl k8s1 = new ComponentImpl();\n    k8s1.setType(OPENSHIFT_COMPONENT_TYPE);\n    k8s1.setAlias(\"test1\");\n    k8s1.getEnv().add(new EnvImpl(\"foo\", \"bar\"));\n    k8s1.getEnv().add(new EnvImpl(\"foo\", \"baz\"));\n    broken.getComponents().add(k8s1);\n    // when\n    integrityValidator.validateDevfile(broken);\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"Invalid project name found:'.*'. Name must contain only Latin letters,\"\n              + \"digits or these following special characters ._-\")\n  public void shouldThrowExceptionOnInvalidProjectName() throws Exception {\n    DevfileImpl broken = new DevfileImpl(initialDevfile);\n    broken.getProjects().get(0).setName(\"./\" + initialDevfile.getProjects().get(0).getName());\n    // when\n    integrityValidator.validateDevfile(broken);\n  }\n\n  @Test\n  public void shouldNotValidateContentReferencesOnNonKuberenetesComponents() throws Exception {\n    // given\n\n    // just remove all the content-referencing components and check that all still works\n    DevfileImpl devfile = new DevfileImpl(initialDevfile);\n    Iterator<ComponentImpl> it = devfile.getComponents().iterator();\n    while (it.hasNext()) {\n      String componentType = it.next().getType();\n      if (componentType.equals(KUBERNETES_COMPONENT_TYPE)\n          || componentType.equals(OPENSHIFT_COMPONENT_TYPE)) {\n        it.remove();\n      }\n    }\n\n    // when\n    integrityValidator.validateContentReferences(devfile, mock(FileContentProvider.class));\n\n    // then\n    // no exception is thrown\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"There are multiple components 'dockerimage:latest' of type 'dockerimage' that cannot be\"\n              + \" uniquely identified. Please add aliases that would distinguish the components.\")\n  public void shouldRequireAliasWhenDockerImageComponentsHaveSameImage() throws Exception {\n    // given\n    DevfileImpl devfile = new DevfileImpl(initialDevfile);\n\n    ComponentImpl docker1 = new ComponentImpl();\n    docker1.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    docker1.setImage(\"dockerimage:latest\");\n\n    ComponentImpl docker2 = new ComponentImpl();\n    docker2.setType(DOCKERIMAGE_COMPONENT_TYPE);\n    docker2.setImage(\"dockerimage:latest\");\n\n    devfile.getComponents().add(docker1);\n    devfile.getComponents().add(docker2);\n\n    // when\n    integrityValidator.validateDevfile(devfile);\n\n    // then\n    // exception is thrown\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"There are multiple components 'list.yaml' of type 'kubernetes' that cannot be\"\n              + \" uniquely identified. Please add aliases that would distinguish the components.\")\n  public void shouldRequireAliasWhenKubernetesComponentsHaveSameReference() throws Exception {\n    // given\n    DevfileImpl devfile = new DevfileImpl(initialDevfile);\n\n    ComponentImpl k8s1 = new ComponentImpl();\n    k8s1.setType(KUBERNETES_COMPONENT_TYPE);\n    k8s1.setReference(\"list.yaml\");\n\n    ComponentImpl k8s2 = new ComponentImpl();\n    k8s2.setType(KUBERNETES_COMPONENT_TYPE);\n    k8s2.setReference(\"list.yaml\");\n\n    devfile.getComponents().add(k8s1);\n    devfile.getComponents().add(k8s2);\n\n    // when\n    integrityValidator.validateDevfile(devfile);\n\n    // then\n    // exception is thrown\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"There are multiple components 'list.yaml' of type 'openshift' that cannot be\"\n              + \" uniquely identified. Please add aliases that would distinguish the components.\")\n  public void shouldRequireAliasWhenOpenshiftComponentsHaveSameReference() throws Exception {\n    // given\n    DevfileImpl devfile = new DevfileImpl(initialDevfile);\n\n    ComponentImpl k8s1 = new ComponentImpl();\n    k8s1.setType(OPENSHIFT_COMPONENT_TYPE);\n    k8s1.setReference(\"list.yaml\");\n\n    ComponentImpl k8s2 = new ComponentImpl();\n    k8s2.setType(OPENSHIFT_COMPONENT_TYPE);\n    k8s2.setReference(\"list.yaml\");\n\n    devfile.getComponents().add(k8s1);\n    devfile.getComponents().add(k8s2);\n\n    // when\n    integrityValidator.validateDevfile(devfile);\n\n    // then\n    // exception is thrown\n  }\n\n  @Test(\n      expectedExceptions = DevfileFormatException.class,\n      expectedExceptionsMessageRegExp =\n          \"There are multiple components 'openshift' of type 'openshift' that cannot be\"\n              + \" uniquely identified. Please add aliases that would distinguish the components.\")\n  public void shouldRequireAliasWhenOpenshiftComponentsHaveNoReference() throws Exception {\n    // given\n    DevfileImpl devfile = new DevfileImpl(initialDevfile);\n\n    ComponentImpl k8s1 = new ComponentImpl();\n    k8s1.setType(OPENSHIFT_COMPONENT_TYPE);\n\n    ComponentImpl k8s2 = new ComponentImpl();\n    k8s2.setType(OPENSHIFT_COMPONENT_TYPE);\n\n    devfile.getComponents().add(k8s1);\n    devfile.getComponents().add(k8s2);\n\n    // when\n    integrityValidator.validateDevfile(devfile);\n\n    // then\n    // exception is thrown\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/hc/HttpConnectionServerCheckerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc;\n\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.ArgumentMatchers.nullable;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport java.io.IOException;\nimport java.lang.reflect.Method;\nimport java.net.Authenticator;\nimport java.net.HttpURLConnection;\nimport java.net.PasswordAuthentication;\nimport java.net.URL;\nimport java.util.Timer;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.commons.proxy.ProxyAuthenticator;\nimport org.mockito.Mock;\nimport org.mockito.stubbing.Answer;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.Assert;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\n@Listeners(MockitoTestNGListener.class)\npublic class HttpConnectionServerCheckerTest {\n  private String MACHINE_NAME = \"mach1\";\n  private String SERVER_REF = \"ref1\";\n  private URL SERVER_URL;\n\n  @Mock private Timer timer;\n  @Mock private HttpURLConnection conn;\n\n  private HttpConnectionServerChecker checker;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    SERVER_URL = new URL(\"http://localhost\");\n\n    checker =\n        spy(\n            new HttpConnectionServerChecker(\n                SERVER_URL, MACHINE_NAME, SERVER_REF, 1, TimeUnit.SECONDS, timer, null));\n\n    lenient().doReturn(conn).when(checker).createConnection(nullable(URL.class));\n    lenient().when(conn.getResponseCode()).thenReturn(200);\n  }\n\n  @BeforeClass\n  public void setup() {\n    // These variables affect on ProxyAuthenticator's enums HTTP and HTTPS. It's very hard\n    // to reinitialize them (internal fields in a private enum).\n    // Until they do not affect other tests we can skip the cleanup phase.\n    System.setProperty(\"http.proxyUser\", \"u1\");\n    System.setProperty(\"http.proxyPassword\", \"p1\");\n  }\n\n  @Test(dataProvider = \"successfulResponseCodeProvider\")\n  public void shouldConfirmConnectionSuccessIfResponseCodeIsBetween200And400(Integer responseCode)\n      throws Exception {\n    when(conn.getResponseCode()).thenReturn(responseCode);\n    assertTrue(checker.isConnectionSuccessful(conn));\n  }\n\n  @DataProvider\n  public static Object[][] successfulResponseCodeProvider() {\n    return new Object[][] {{200}, {201}, {210}, {301}, {302}, {303}};\n  }\n\n  @Test(dataProvider = \"nonSuccessfulResponseCodeProvider\")\n  public void shouldNotConfirmConnectionSuccessIfResponseCodeIsLessThan200Or400OrMore(\n      Integer responseCode) throws Exception {\n    when(conn.getResponseCode()).thenReturn(responseCode);\n    assertFalse(checker.isConnectionSuccessful(conn));\n  }\n\n  @DataProvider\n  public static Object[][] nonSuccessfulResponseCodeProvider() {\n    return new Object[][] {{199}, {400}, {401}, {402}, {403}, {404}, {405}, {409}, {500}};\n  }\n\n  @Test\n  public void shouldSetProxyAuthenticatorBeforeCreateConnection() throws Exception {\n\n    Assert.assertFalse(isPasswordAuthenticationSet());\n    when(checker.createConnection(eq(SERVER_URL)))\n        .thenAnswer(\n            (Answer<HttpURLConnection>)\n                invocation -> {\n                  assertTrue(isPasswordAuthenticationSet());\n                  return conn;\n                });\n    checker.isAvailable();\n    Assert.assertFalse(isPasswordAuthenticationSet());\n  }\n\n  @Test\n  public void shouldOpenConnectionToProvidedUrl() throws Exception {\n    checker.isAvailable();\n\n    verify(checker).createConnection(eq(SERVER_URL));\n  }\n\n  @Test\n  public void shouldSetTimeoutsToConnection() throws Exception {\n    checker.isAvailable();\n\n    verify(conn).setReadTimeout((int) TimeUnit.SECONDS.toMillis(3));\n    verify(conn).setConnectTimeout((int) TimeUnit.SECONDS.toMillis(3));\n  }\n\n  @Test\n  public void shouldBeAbleToConfirmAvailability() throws Exception {\n    assertTrue(checker.isAvailable());\n  }\n\n  @Test\n  public void shouldBeAbleToRejectAvailability() throws Exception {\n    when(conn.getResponseCode()).thenReturn(401);\n    assertFalse(checker.isAvailable());\n  }\n\n  @Test\n  public void shouldRejectAvailabilityInCaseOfExceptionOnResponseCodeRetrieving() throws Exception {\n    when(conn.getResponseCode()).thenThrow(new IOException());\n    assertFalse(checker.isAvailable());\n  }\n\n  @Test\n  public void shouldRejectAvailabilityInCaseOfExceptionOnConnectionOpening() throws Exception {\n    when(checker.createConnection(nullable(URL.class))).thenThrow(new IOException());\n    assertFalse(checker.isAvailable());\n  }\n\n  @Test\n  public void shouldDisconnectIfAvailable() throws Exception {\n    assertTrue(checker.isAvailable());\n    verify(conn).disconnect();\n  }\n\n  @Test\n  public void shouldDisconnectIfNotAvailable() throws Exception {\n    when(conn.getResponseCode()).thenReturn(401);\n    assertFalse(checker.isAvailable());\n    verify(conn).disconnect();\n  }\n\n  public boolean isPasswordAuthenticationSet() {\n\n    Authenticator authenticator = Authenticator.getDefault();\n    if (authenticator != null && authenticator instanceof ProxyAuthenticator) {\n      ProxyAuthenticator proxyAuthenticator = (ProxyAuthenticator) authenticator;\n\n      try {\n        Method method =\n            ProxyAuthenticator.class.getDeclaredMethod(\"getPasswordAuthentication\", null);\n        method.setAccessible(true);\n\n        PasswordAuthentication value =\n            (PasswordAuthentication) method.invoke(proxyAuthenticator, null);\n        return value != null;\n      } catch (ReflectiveOperationException e) {\n        throw new RuntimeException(e);\n      }\n    }\n    return false;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/hc/ServerCheckerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc;\n\nimport static java.lang.String.format;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\nimport static org.testng.Assert.fail;\n\nimport java.util.Timer;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.TimeUnit;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\npublic class ServerCheckerTest {\n  private static final String MACHINE_NAME = \"mach1\";\n  private static final String SERVER_REF = \"ref1\";\n  private static final long PERIOD_MS = 10;\n  private static final long CHECKER_TIMEOUT_MS = 5000;\n  private static final long TEST_TIMEOUT_MS = CHECKER_TIMEOUT_MS + 5000;\n  private static final int SUCCESS_THRESHOLD = 1;\n\n  private Timer timer;\n  private TestServerChecker checker;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    timer = new Timer(true);\n  }\n\n  @AfterMethod\n  public void tearDown() throws Exception {\n    timer.cancel();\n  }\n\n  @Test(timeOut = TEST_TIMEOUT_MS)\n  public void successfulCheckTest() throws Exception {\n    checker =\n        new TestServerChecker(\n            MACHINE_NAME,\n            SERVER_REF,\n            PERIOD_MS,\n            CHECKER_TIMEOUT_MS,\n            SUCCESS_THRESHOLD,\n            TimeUnit.MILLISECONDS,\n            timer);\n    CompletableFuture<String> reportCompFuture = checker.getReportCompFuture();\n    // not considered as available before start\n    assertFalse(reportCompFuture.isDone());\n    // ensure server not available before start\n    CountDownLatch isAvailableCountDownLatch = checker.setAvailable(false);\n\n    checker.start();\n\n    isAvailableCountDownLatch.await(PERIOD_MS * 2, TimeUnit.MILLISECONDS);\n    // not considered as available after check\n    assertFalse(reportCompFuture.isDone());\n\n    // make server available\n    isAvailableCountDownLatch = checker.setAvailable(true);\n\n    assertEquals(reportCompFuture.get(), SERVER_REF);\n    isAvailableCountDownLatch.await(PERIOD_MS * 2, TimeUnit.MILLISECONDS);\n  }\n\n  @Test(timeOut = TEST_TIMEOUT_MS)\n  public void checkTimeoutTest() throws Exception {\n    checker =\n        new TestServerChecker(\n            MACHINE_NAME,\n            SERVER_REF,\n            PERIOD_MS,\n            PERIOD_MS * 2,\n            SUCCESS_THRESHOLD,\n            TimeUnit.MILLISECONDS,\n            timer);\n\n    // ensure server not available before start\n    checker.setAvailable(false);\n    checker.start();\n\n    CompletableFuture<String> reportCompFuture = checker.getReportCompFuture();\n    try {\n      reportCompFuture.get();\n      fail();\n    } catch (ExecutionException e) {\n      assertTrue(e.getCause() instanceof InfrastructureException);\n      assertEquals(\n          e.getCause().getMessage(),\n          format(\"Server '%s' in container '%s' not available.\", SERVER_REF, MACHINE_NAME));\n    }\n  }\n\n  @Test(expectedExceptions = InfrastructureException.class)\n  public void checkOnceThrowsExceptionIfServerIsNotAvailable() throws InfrastructureException {\n    new TestServerChecker(\"test\", \"test\", 1, 1, 1, TimeUnit.SECONDS, null).checkOnce(ref -> {});\n  }\n\n  private static class TestServerChecker extends ServerChecker {\n\n    private boolean isAvailable;\n\n    private CountDownLatch isAvailableCountDownLatch = new CountDownLatch(1);\n\n    protected TestServerChecker(\n        String machineName,\n        String serverRef,\n        long period,\n        long timeout,\n        int successThreshold,\n        TimeUnit timeUnit,\n        Timer timer) {\n      super(machineName, serverRef, timeout, timeUnit, timer);\n    }\n\n    @Override\n    public boolean isAvailable() {\n      isAvailableCountDownLatch.countDown();\n      return isAvailable;\n    }\n\n    public CountDownLatch setAvailable(boolean isAvailable) {\n      this.isAvailable = isAvailable;\n      this.isAvailableCountDownLatch = new CountDownLatch(1);\n      return isAvailableCountDownLatch;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/hc/ServersCheckerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyString;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.after;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.never;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.fail;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.net.URL;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.function.Consumer;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.token.MachineTokenProvider;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\n@Listeners(MockitoTestNGListener.class)\npublic class ServersCheckerTest {\n  private static final String WSAGENT_HTTP_SERVER = \"wsagent/http\";\n  private static final String EXEC_AGENT_HTTP_SERVER = \"exec-agent/http\";\n  private static final String TERMINAL_SERVER = \"terminal\";\n\n  private static final String[] CONFIGURED_SERVERS =\n      new String[] {WSAGENT_HTTP_SERVER, EXEC_AGENT_HTTP_SERVER, TERMINAL_SERVER};\n\n  private static final String MACHINE_NAME = \"mach1\";\n  private static final String MACHINE_TOKEN = \"machineToken\";\n  private static final String WORKSPACE_ID = \"ws123\";\n  private static final String USER_ID = \"0000-0000-0007\";\n\n  @Mock private Consumer<String> readinessHandler;\n  @Mock private MachineTokenProvider machineTokenProvider;\n  @Mock private HttpConnectionServerChecker connectionChecker;\n  @Mock private RuntimeIdentity runtimeIdentity;\n  private Map<String, ServerImpl> servers;\n\n  private ServersChecker checker;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    servers = new HashMap<>();\n    servers.putAll(\n        ImmutableMap.of(\n            WSAGENT_HTTP_SERVER, new ServerImpl().withUrl(\"http://localhost/api\"),\n            EXEC_AGENT_HTTP_SERVER, new ServerImpl().withUrl(\"http://localhost/exec-agent/process\"),\n            TERMINAL_SERVER, new ServerImpl().withUrl(\"http://localhost/terminal/pty\")));\n\n    CompletableFuture<String> compFuture = new CompletableFuture<>();\n\n    when(connectionChecker.getReportCompFuture()).thenReturn(compFuture);\n\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(WORKSPACE_ID);\n    when(runtimeIdentity.getOwnerId()).thenReturn(USER_ID);\n\n    checker =\n        spy(\n            new ServersChecker(\n                runtimeIdentity, MACHINE_NAME, servers, machineTokenProvider, CONFIGURED_SERVERS));\n    when(checker.doCreateChecker(any(URL.class), anyString(), anyString()))\n        .thenReturn(connectionChecker);\n    when(machineTokenProvider.getToken(anyString(), anyString())).thenReturn(MACHINE_TOKEN);\n  }\n\n  @Test(timeOut = 5000)\n  public void shouldUseMachineTokenWhenCallChecker() throws Exception {\n    servers.clear();\n    servers.put(\"wsagent/http\", new ServerImpl().withUrl(\"http://localhost\"));\n\n    checker.startAsync(readinessHandler);\n    connectionChecker.getReportCompFuture().complete(\"wsagent/http\");\n\n    verify(machineTokenProvider).getToken(USER_ID, WORKSPACE_ID);\n    ArgumentCaptor<String> tokenCaptor = ArgumentCaptor.forClass(String.class);\n    verify(checker)\n        .doCreateChecker(\n            eq(new URL(\"http://localhost/\")), eq(\"wsagent/http\"), tokenCaptor.capture());\n    assertEquals(tokenCaptor.getValue(), MACHINE_TOKEN);\n  }\n\n  @Test(timeOut = 5000)\n  public void shouldNotifyReadinessHandlerAboutEachServerReadiness() throws Exception {\n    checker.startAsync(readinessHandler);\n\n    verify(readinessHandler, after(500).never()).accept(anyString());\n\n    connectionChecker.getReportCompFuture().complete(\"test_ref\");\n\n    verify(readinessHandler, times(3)).accept(\"test_ref\");\n  }\n\n  @Test(timeOut = 5000)\n  public void shouldThrowExceptionIfAServerIsUnavailable() throws Exception {\n    checker.startAsync(readinessHandler);\n\n    connectionChecker\n        .getReportCompFuture()\n        .completeExceptionally(new InfrastructureException(\"my exception\"));\n\n    try {\n      checker.await();\n    } catch (InfrastructureException e) {\n      assertEquals(e.getMessage(), \"my exception\");\n    }\n  }\n\n  @Test(timeOut = 5000)\n  public void shouldNotCheckNotConfiguredServers() throws Exception {\n    servers.clear();\n    servers.putAll(\n        ImmutableMap.of(\n            \"wsagent/http\", new ServerImpl().withUrl(\"http://localhost\"),\n            \"not-configured\", new ServerImpl().withUrl(\"http://localhost\")));\n\n    checker.startAsync(readinessHandler);\n    connectionChecker.getReportCompFuture().complete(\"test_ref\");\n    checker.await();\n\n    verify(readinessHandler).accept(\"test_ref\");\n  }\n\n  @Test(timeOut = 5000)\n  public void awaitShouldReturnOnFirstUnavailability() throws Exception {\n    CompletableFuture<String> future1 = spy(new CompletableFuture<>());\n    CompletableFuture<String> future2 = spy(new CompletableFuture<>());\n    CompletableFuture<String> future3 = spy(new CompletableFuture<>());\n    when(connectionChecker.getReportCompFuture())\n        .thenReturn(future1)\n        .thenReturn(future2)\n        .thenReturn(future3);\n\n    checker.startAsync(readinessHandler);\n\n    future2.completeExceptionally(new InfrastructureException(\"error\"));\n\n    try {\n      checker.await();\n      fail();\n    } catch (InfrastructureException ignored) {\n      verify(future1, never()).complete(anyString());\n      verify(future2, never()).complete(anyString());\n      verify(future3, never()).complete(anyString());\n      verify(future1, never()).completeExceptionally(any(Throwable.class));\n      verify(future2).completeExceptionally(any(Throwable.class));\n      verify(future3, never()).completeExceptionally(any(Throwable.class));\n    }\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp = \"oops!\")\n  public void throwsExceptionIfAnyServerIsNotAvailable() throws InfrastructureException {\n    doThrow(new InfrastructureException(\"oops!\")).when(connectionChecker).checkOnce(any());\n\n    checker.checkOnce(ref -> {});\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/hc/TerminalHttpConnectionServerCheckerTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc;\n\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertFalse;\nimport static org.testng.Assert.assertTrue;\n\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.Timer;\nimport java.util.concurrent.TimeUnit;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\n@Listeners(MockitoTestNGListener.class)\npublic class TerminalHttpConnectionServerCheckerTest {\n  private String MACHINE_NAME = \"mach1\";\n  private String SERVER_REF = \"ref1\";\n\n  @Mock private Timer timer;\n  @Mock private HttpURLConnection conn;\n\n  private TerminalHttpConnectionServerChecker checker;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    checker =\n        new TerminalHttpConnectionServerChecker(\n            new URL(\"http://localhost\"),\n            MACHINE_NAME,\n            SERVER_REF,\n            1,\n            TimeUnit.SECONDS,\n            timer,\n            null);\n  }\n\n  @Test\n  public void shouldConfirmConnectionSuccessIfResponseCodeIs404() throws Exception {\n    when(conn.getResponseCode()).thenReturn(404);\n\n    assertTrue(checker.isConnectionSuccessful(conn));\n  }\n\n  @Test\n  public void shouldNotConfirmConnectionSuccessIfResponseCodeIsNot404() throws Exception {\n    when(conn.getResponseCode()).thenReturn(200);\n\n    assertFalse(checker.isConnectionSuccessful(conn));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/hc/probe/WorkspaceProbesFactoryTest.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.hc.probe;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.workspace.shared.Constants.SERVER_EXEC_AGENT_HTTP_REFERENCE;\nimport static org.eclipse.che.api.workspace.shared.Constants.SERVER_TERMINAL_REFERENCE;\nimport static org.eclipse.che.api.workspace.shared.Constants.SERVER_WS_AGENT_HTTP_REFERENCE;\nimport static org.mockito.Mockito.lenient;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableMap;\nimport jakarta.ws.rs.core.HttpHeaders;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.RuntimeIdentityImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerImpl;\nimport org.eclipse.che.api.workspace.server.token.MachineTokenProvider;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * @author Alexander Garagatyi\n */\n@Listeners(MockitoTestNGListener.class)\npublic class WorkspaceProbesFactoryTest {\n  private static final String WORKSPACE_ID = \"wsId\";\n  private static final String MACHINE_NAME = \"machine1\";\n  private static final String TOKEN = \"token1\";\n  private static final ServerImpl SERVER = new ServerImpl().withUrl(\"https://localhost:4040/path1\");\n\n  private static final RuntimeIdentity IDENTITY =\n      new RuntimeIdentityImpl(WORKSPACE_ID, \"default\", \"id1\", \"infraNamespace\");\n\n  @Mock private MachineTokenProvider tokenProvider;\n\n  private WorkspaceProbesFactory probesFactory;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    lenient().when(tokenProvider.getToken(IDENTITY.getOwnerId(), WORKSPACE_ID)).thenReturn(TOKEN);\n\n    probesFactory = new WorkspaceProbesFactory(tokenProvider);\n  }\n\n  @Test\n  public void shouldNotCreateProbesFactoriesForOtherServers() throws Exception {\n    WorkspaceProbes wsProbes =\n        probesFactory.getProbes(\n            IDENTITY,\n            MACHINE_NAME,\n            ImmutableMap.of(\"server1/http\", SERVER, \"terminal/http\", SERVER, \"terminal1\", SERVER));\n\n    assertTrue(wsProbes.getProbes().isEmpty());\n  }\n\n  @Test\n  public void returnsProbesForAMachineForWsAgent() throws Exception {\n    WorkspaceProbes wsProbes =\n        probesFactory.getProbes(\n            IDENTITY, MACHINE_NAME, singletonMap(SERVER_WS_AGENT_HTTP_REFERENCE, SERVER));\n\n    verifyHttpProbeConfig(\n        wsProbes,\n        SERVER_WS_AGENT_HTTP_REFERENCE,\n        3,\n        1,\n        10,\n        10,\n        120,\n        \"/path1/liveness\",\n        \"localhost\",\n        4040,\n        \"https\",\n        singletonMap(HttpHeaders.AUTHORIZATION, \"Bearer \" + TOKEN));\n  }\n\n  @Test\n  public void returnsProbesForAMachineForTerminal() throws Exception {\n    WorkspaceProbes wsProbes =\n        probesFactory.getProbes(\n            IDENTITY,\n            MACHINE_NAME,\n            singletonMap(\n                SERVER_TERMINAL_REFERENCE, new ServerImpl().withUrl(\"wss://localhost:4040/pty\")));\n\n    verifyHttpProbeConfig(\n        wsProbes,\n        SERVER_TERMINAL_REFERENCE,\n        3,\n        1,\n        10,\n        10,\n        120,\n        \"/liveness\",\n        \"localhost\",\n        4040,\n        \"https\",\n        emptyMap());\n  }\n\n  @Test\n  public void returnsProbesForAMachineForExec() throws Exception {\n    WorkspaceProbes wsProbes =\n        probesFactory.getProbes(\n            IDENTITY,\n            MACHINE_NAME,\n            singletonMap(\n                SERVER_EXEC_AGENT_HTTP_REFERENCE,\n                new ServerImpl().withUrl(\"https://localhost:4040/process\")));\n\n    verifyHttpProbeConfig(\n        wsProbes,\n        SERVER_EXEC_AGENT_HTTP_REFERENCE,\n        3,\n        1,\n        10,\n        10,\n        120,\n        \"/liveness\",\n        \"localhost\",\n        4040,\n        \"https\",\n        emptyMap());\n  }\n\n  public void verifyHttpProbeConfig(\n      WorkspaceProbes wsProbes,\n      String serverName,\n      int failureThreshold,\n      int successThreshold,\n      int initialDelay,\n      int period,\n      int timeout,\n      String path,\n      String host,\n      int port,\n      String protocol,\n      Map<String, String> headers)\n      throws Exception {\n\n    assertEquals(wsProbes.getWorkspaceId(), WORKSPACE_ID);\n    List<ProbeFactory> probes = wsProbes.getProbes();\n    assertEquals(probes.size(), 1);\n    ProbeFactory probeFactory = probes.get(0);\n    assertTrue(probeFactory instanceof HttpProbeFactory);\n    HttpProbeFactory httpProbeFactory = (HttpProbeFactory) probeFactory;\n    assertEquals(httpProbeFactory.getMachineName(), MACHINE_NAME);\n    assertEquals(httpProbeFactory.getServerName(), serverName);\n    assertEquals(httpProbeFactory.getWorkspaceId(), WORKSPACE_ID);\n    HttpProbeConfig probeConfig = httpProbeFactory.getProbeConfig();\n    assertEquals(probeConfig.getFailureThreshold(), failureThreshold);\n    assertEquals(probeConfig.getSuccessThreshold(), successThreshold);\n    assertEquals(probeConfig.getInitialDelaySeconds(), initialDelay);\n    assertEquals(probeConfig.getPeriodSeconds(), period);\n    assertEquals(probeConfig.getTimeoutSeconds(), timeout);\n    assertEquals(probeConfig.getPath(), path);\n    assertEquals(probeConfig.getHost(), host);\n    assertEquals(probeConfig.getPort(), port);\n    assertEquals(probeConfig.getScheme(), protocol);\n    assertEquals(probeConfig.getHeaders(), headers);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/model/impl/ServerConfigImplTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.model.impl;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.INTERNAL_SERVER_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.REQUIRE_SUBDOMAIN;\nimport static org.eclipse.che.api.core.model.workspace.config.ServerConfig.SERVER_NAME_ATTRIBUTE;\nimport static org.testng.Assert.*;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.devfile.EndpointImpl;\nimport org.testng.annotations.Test;\n\npublic class ServerConfigImplTest {\n\n  @Test\n  public void testStoreEndpointNameIntoAttributes() {\n    ServerConfig serverConfig =\n        ServerConfigImpl.createFromEndpoint(new EndpointImpl(\"blabol\", 123, emptyMap()));\n\n    assertEquals(serverConfig.getAttributes().get(SERVER_NAME_ATTRIBUTE), \"blabol\");\n  }\n\n  @Test\n  public void testCreateFromEndpointMinimalEndpointShouldTranslateToHttpProtocol() {\n    ServerConfig serverConfig =\n        ServerConfigImpl.createFromEndpoint(new EndpointImpl(\"name\", 123, emptyMap()));\n\n    assertEquals(serverConfig.getProtocol(), \"http\");\n  }\n\n  @Test\n  public void testCreateFromEndpointMinimalEndpointShouldTranslateToNullPath() {\n    ServerConfig serverConfig =\n        ServerConfigImpl.createFromEndpoint(new EndpointImpl(\"name\", 123, emptyMap()));\n\n    assertNull(serverConfig.getPath());\n  }\n\n  @Test\n  public void testCreateFromEndpointCustomAttributesShouldPreserveInAttributes() {\n    Map<String, String> customAttributes = ImmutableMap.of(\"k1\", \"v1\", \"k2\", \"v2\");\n    ServerConfig serverConfig =\n        ServerConfigImpl.createFromEndpoint(new EndpointImpl(\"name\", 123, customAttributes));\n\n    assertEquals(serverConfig.getAttributes().get(\"k1\"), \"v1\");\n    assertEquals(serverConfig.getAttributes().get(\"k2\"), \"v2\");\n    assertEquals(serverConfig.getAttributes().size(), 3);\n  }\n\n  @Test\n  public void testCreateFromEndpointTranslatePath() {\n    ServerConfig serverConfig =\n        ServerConfigImpl.createFromEndpoint(\n            new EndpointImpl(\"name\", 123, singletonMap(\"path\", \"hello\")));\n\n    assertEquals(serverConfig.getPath(), \"hello\");\n  }\n\n  @Test\n  public void testCreateFromEndpointTranslateProtocol() {\n    ServerConfig serverConfig =\n        ServerConfigImpl.createFromEndpoint(\n            new EndpointImpl(\"name\", 123, singletonMap(\"protocol\", \"hello\")));\n\n    assertEquals(serverConfig.getProtocol(), \"hello\");\n  }\n\n  @Test\n  public void testCreateFromEndpointTranslatePublicTrue() {\n    ServerConfig serverConfig =\n        ServerConfigImpl.createFromEndpoint(\n            new EndpointImpl(\"name\", 123, singletonMap(\"public\", \"true\")));\n\n    assertFalse(serverConfig.isInternal());\n  }\n\n  @Test\n  public void testCreateFromEndpointTranslatePublicWhatever() {\n    ServerConfig serverConfig =\n        ServerConfigImpl.createFromEndpoint(\n            new EndpointImpl(\"name\", 123, singletonMap(\"public\", \"whatever\")));\n\n    assertFalse(serverConfig.isInternal());\n  }\n\n  @Test\n  public void testCreateFromEndpointTranslatePublicFalse() {\n    ServerConfig serverConfig =\n        ServerConfigImpl.createFromEndpoint(\n            new EndpointImpl(\"name\", 123, singletonMap(\"public\", \"false\")));\n\n    assertFalse(serverConfig.getAttributes().isEmpty());\n    assertEquals(\n        serverConfig.getAttributes().get(INTERNAL_SERVER_ATTRIBUTE), Boolean.TRUE.toString());\n  }\n\n  @Test\n  public void testCreateFromEndpointDevfileEndpointAttributeNotSetWhenDefault() {\n    ServerConfig serverConfig =\n        ServerConfigImpl.createFromEndpoint(new EndpointImpl(\"name\", 123, new HashMap<>()));\n\n    assertFalse(serverConfig.getAttributes().containsKey(REQUIRE_SUBDOMAIN));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/environment/InternalEnvironmentFactoryTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.environment;\n\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.CONTAINER_SOURCE_ATTRIBUTE;\nimport static org.eclipse.che.api.workspace.shared.Constants.RECIPE_CONTAINER_SOURCE;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.ArgumentMatchers.anyList;\nimport static org.mockito.ArgumentMatchers.anyMap;\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.lenient;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.spy;\nimport static org.mockito.Mockito.verify;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.config.Environment;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.EnvironmentImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.RecipeImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Captor;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link InternalEnvironmentFactory}.\n *\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class InternalEnvironmentFactoryTest {\n\n  @Mock private RecipeRetriever recipeRetriever;\n  @Mock private MachineConfigsValidator machinesValidator;\n\n  @Captor private ArgumentCaptor<Map<String, InternalMachineConfig>> machinesCaptor;\n\n  private InternalEnvironmentFactory<InternalEnvironment> environmentFactory;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    environmentFactory = spy(new TestEnvironmentFactory(recipeRetriever, machinesValidator));\n    final InternalEnvironment internalEnv = mock(InternalEnvironment.class);\n    lenient().when(internalEnv.getMachines()).thenReturn(Collections.emptyMap());\n    lenient().when(environmentFactory.doCreate(any(), anyMap(), anyList())).thenReturn(internalEnv);\n  }\n\n  @Test\n  public void shouldUseRetrievedRecipeWhileInternalEnvironmentCreation() throws Exception {\n    // given\n    RecipeImpl recipe = new RecipeImpl(\"type\", \"contentType\", \"content\", \"location\");\n    InternalRecipe retrievedRecipe = mock(InternalRecipe.class);\n    doReturn(retrievedRecipe).when(recipeRetriever).getRecipe(any());\n\n    EnvironmentImpl env = new EnvironmentImpl(recipe, null);\n\n    // when\n    environmentFactory.create(env);\n\n    // then\n    verify(recipeRetriever).getRecipe(recipe);\n    verify(environmentFactory).doCreate(eq(retrievedRecipe), any(), any());\n  }\n\n  @Test\n  public void shouldUseNormalizedServersWhileInternalEnvironmentCreation() throws Exception {\n    // given\n    ServerConfigImpl server =\n        new ServerConfigImpl(\"8080\", \"http\", \"/api\", singletonMap(\"key\", \"value\"));\n\n    Map<String, ServerConfig> normalizedServers =\n        ImmutableMap.of(\"server\", mock(ServerConfig.class));\n    doReturn(normalizedServers).when(environmentFactory).normalizeServers(any());\n\n    ImmutableMap<String, ServerConfigImpl> sourceServers = ImmutableMap.of(\"server\", server);\n    MachineConfigImpl machineConfig = new MachineConfigImpl(sourceServers, null, null, null);\n\n    EnvironmentImpl env = new EnvironmentImpl(null, ImmutableMap.of(\"machine\", machineConfig));\n\n    // when\n    environmentFactory.create(env);\n\n    // then\n    verify(environmentFactory).normalizeServers(sourceServers);\n    verify(environmentFactory).doCreate(any(), machinesCaptor.capture(), any());\n    Map<String, InternalMachineConfig> internalMachines = machinesCaptor.getValue();\n    assertEquals(internalMachines.get(\"machine\").getServers(), normalizedServers);\n  }\n\n  @Test\n  public void shouldReturnCreatedInternalEnvironment() throws Exception {\n    // given\n    InternalEnvironment expectedEnv = mock(InternalEnvironment.class);\n    when(environmentFactory.doCreate(any(), any(), any())).thenReturn(expectedEnv);\n    Environment env = mock(Environment.class);\n\n    // when\n    InternalEnvironment createdEnv = environmentFactory.create(env);\n\n    // then\n    assertEquals(createdEnv, expectedEnv);\n  }\n\n  @Test\n  public void shouldPassNullRecipeIfEnvironmentIsNull() throws Exception {\n    // given\n    InternalEnvironment expectedEnv = mock(InternalEnvironment.class);\n    when(environmentFactory.doCreate(any(), any(), any())).thenReturn(expectedEnv);\n\n    // when\n    InternalEnvironment createdEnv = environmentFactory.create(null);\n\n    // then\n    assertEquals(createdEnv, expectedEnv);\n    verify(environmentFactory).doCreate(eq(null), any(), any());\n  }\n\n  @Test\n  public void normalizeServersProtocols() throws InfrastructureException {\n    ServerConfigImpl serverWithoutProtocol =\n        new ServerConfigImpl(\"8080\", \"http\", \"/api\", singletonMap(\"key\", \"value\"));\n    ServerConfigImpl udpServer =\n        new ServerConfigImpl(\"8080/udp\", \"http\", \"/api\", singletonMap(\"key\", \"value\"));\n    ServerConfigImpl normalizedServer =\n        new ServerConfigImpl(\"8080/tcp\", \"http\", \"/api\", singletonMap(\"key\", \"value\"));\n\n    Map<String, ServerConfig> servers = new HashMap<>();\n    servers.put(\"serverWithoutProtocol\", serverWithoutProtocol);\n    servers.put(\"udpServer\", udpServer);\n\n    Map<String, ServerConfig> normalizedServers = environmentFactory.normalizeServers(servers);\n\n    assertEquals(\n        normalizedServers,\n        ImmutableMap.of(\"serverWithoutProtocol\", normalizedServer, \"udpServer\", udpServer));\n  }\n\n  @Test\n  public void testDoNotOverrideRamLimitAttributeWhenMachineAlreadyContainsIt() throws Exception {\n    final String ramLimit = \"2147483648\";\n    final InternalEnvironment internalEnv = mock(InternalEnvironment.class);\n    final InternalMachineConfig machine = mock(InternalMachineConfig.class);\n    when(environmentFactory.doCreate(any(), any(), any())).thenReturn(internalEnv);\n    when(internalEnv.getMachines()).thenReturn(ImmutableMap.of(\"testMachine\", machine));\n\n    Map<String, String> machineAttr = new HashMap<>();\n    machineAttr.put(MEMORY_LIMIT_ATTRIBUTE, ramLimit);\n    when(machine.getAttributes()).thenReturn(machineAttr);\n\n    environmentFactory.create(mock(Environment.class));\n\n    assertEquals(machine.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE), ramLimit);\n  }\n\n  @Test\n  public void testApplyContainerSourceAttributeToTheMachineSpecifiedInEnv() throws Exception {\n    // given\n    final Environment sourceEnv = mock(Environment.class);\n\n    MachineConfigImpl machineConfig = mock(MachineConfigImpl.class);\n    final Map<String, MachineConfigImpl> machineConfigMap =\n        ImmutableMap.of(\"envMachine\", machineConfig);\n    doReturn(machineConfigMap).when(sourceEnv).getMachines();\n\n    when(environmentFactory.doCreate(any(), any(), any()))\n        .thenAnswer(\n            invocation -> {\n              Map<String, InternalMachineConfig> envMachines = invocation.getArgument(1);\n\n              final InternalEnvironment internalEnv = mock(InternalEnvironment.class);\n              when(internalEnv.getMachines()).thenReturn(envMachines);\n              return internalEnv;\n            });\n\n    // when\n    InternalEnvironment resultEnv = environmentFactory.create(sourceEnv);\n\n    // then\n    assertEquals(\n        resultEnv.getMachines().get(\"envMachine\").getAttributes().get(CONTAINER_SOURCE_ATTRIBUTE),\n        RECIPE_CONTAINER_SOURCE);\n  }\n\n  @Test\n  public void testApplyContainerSourceAttributeToTheMachineThatComesFromRecipe() throws Exception {\n    // given\n    final Environment sourceEnv = mock(Environment.class);\n\n    final InternalEnvironment internalEnv = mock(InternalEnvironment.class);\n    final InternalMachineConfig internalMachine = new InternalMachineConfig();\n    when(internalEnv.getMachines()).thenReturn(ImmutableMap.of(\"internalMachine\", internalMachine));\n\n    when(environmentFactory.doCreate(any(), any(), any())).thenReturn(internalEnv);\n\n    // when\n    InternalEnvironment resultEnv = environmentFactory.create(sourceEnv);\n\n    // then\n    assertEquals(\n        resultEnv\n            .getMachines()\n            .get(\"internalMachine\")\n            .getAttributes()\n            .get(CONTAINER_SOURCE_ATTRIBUTE),\n        RECIPE_CONTAINER_SOURCE);\n  }\n\n  private static class TestEnvironmentFactory\n      extends InternalEnvironmentFactory<InternalEnvironment> {\n\n    private TestEnvironmentFactory(\n        RecipeRetriever recipeRetriever, MachineConfigsValidator machinesValidator) {\n      super(recipeRetriever, machinesValidator);\n    }\n\n    @Override\n    protected InternalEnvironment doCreate(InternalRecipe recipe, Map machines, List list)\n        throws InfrastructureException, ValidationException {\n      return null;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/environment/MachineConfigsValidatorTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.environment;\n\nimport static java.util.Collections.emptyMap;\nimport static java.util.Collections.singletonMap;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_REQUEST_ATTRIBUTE;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\nimport org.eclipse.che.api.core.ValidationException;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/**\n * Tests {@link MachineConfigsValidator}.\n *\n * @author Alexander Garagatyi\n * @author Sergii Leshchenko\n */\n@Listeners(MockitoTestNGListener.class)\npublic class MachineConfigsValidatorTest {\n\n  private static final String MACHINE_NAME = \"machine1\";\n\n  private InternalMachineConfig machineConfig;\n\n  private MachineConfigsValidator machinesValidator;\n\n  @BeforeMethod\n  public void setUp() throws Exception {\n    machinesValidator = new MachineConfigsValidator();\n\n    machineConfig = machineMockWithServers(Constants.SERVER_WS_AGENT_HTTP_REFERENCE);\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp = \"Name of machine '.*' in environment is invalid\",\n      dataProvider = \"invalidMachineNames\")\n  public void shouldFailIfMachinesNameAreInvalid(String machineName) throws Exception {\n    // when\n    machinesValidator.validate(singletonMap(machineName, machineConfig));\n  }\n\n  @DataProvider(name = \"invalidMachineNames\")\n  public Object[][] invalidMachineNames() {\n    return new Object[][] {\n      {\"\"}, {\"-123\"}, {\"123-\"}, {\"-123-\"}, {\"/123-\"}, {\"/123\"}, {\"123/\"}, {\"123_\"}, {\"!asdd/\"},\n    };\n  }\n\n  @Test(dataProvider = \"validMachineNames\")\n  public void shouldNotFailIfMachinesNameAreValid(String machineName) throws Exception {\n    // when\n    machinesValidator.validate(singletonMap(machineName, machineConfig));\n  }\n\n  @DataProvider(name = \"validMachineNames\")\n  public Object[][] validMachineNames() {\n    return new Object[][] {\n      {\"machine\"}, {\"machine123\"}, {\"machine-123\"}, {\"app/db\"}, {\"app_db\"},\n    };\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Machine '.*' in environment contains server conf '.*' with invalid port '.*'\",\n      dataProvider = \"invalidServerPorts\")\n  public void shouldFailIfServerPortIsInvalid(String servicePort) throws Exception {\n    // given\n    ServerConfigImpl server =\n        new ServerConfigImpl(servicePort, \"https\", \"/some/path\", singletonMap(\"key\", \"value\"));\n    when(machineConfig.getServers())\n        .thenReturn(singletonMap(Constants.SERVER_WS_AGENT_HTTP_REFERENCE, server));\n\n    // when\n    machinesValidator.validate(singletonMap(MACHINE_NAME, machineConfig));\n  }\n\n  @DataProvider(name = \"invalidServerPorts\")\n  public Object[][] invalidServerPorts() {\n    return new Object[][] {\n      {\"aaa\"}, {\"123aaa\"}, {\"8080/tpc2\"}, {\"8080/TCP\"}, {\"123udp\"}, {\"\"}, {\"/123\"},\n    };\n  }\n\n  @Test(dataProvider = \"validServerPorts\")\n  public void shouldNotFailIfServerPortIsValid(String servicePort) throws Exception {\n    // given\n    ServerConfigImpl server =\n        new ServerConfigImpl(servicePort, \"https\", \"/some/path\", singletonMap(\"key\", \"value\"));\n    when(machineConfig.getServers())\n        .thenReturn(singletonMap(Constants.SERVER_WS_AGENT_HTTP_REFERENCE, server));\n\n    // when\n    machinesValidator.validate(singletonMap(MACHINE_NAME, machineConfig));\n  }\n\n  @DataProvider(name = \"validServerPorts\")\n  public Object[][] validServerPorts() {\n    return new Object[][] {\n      {\"1\"}, {\"12\"}, {\"8080\"}, {\"8080/tcp\"}, {\"8080/udp\"},\n    };\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Machine '.*' in environment contains server conf '.*' with invalid protocol '.*'\",\n      dataProvider = \"invalidServerProtocols\")\n  public void shouldFailIfServerProtocolIsInvalid(String serviceProtocol) throws Exception {\n    // given\n    ServerConfigImpl server =\n        new ServerConfigImpl(\"8080\", serviceProtocol, \"/some/path\", singletonMap(\"key\", \"value\"));\n    when(machineConfig.getServers())\n        .thenReturn(singletonMap(Constants.SERVER_WS_AGENT_HTTP_REFERENCE, server));\n\n    // when\n    machinesValidator.validate(singletonMap(MACHINE_NAME, machineConfig));\n  }\n\n  @DataProvider(name = \"invalidServerProtocols\")\n  public Object[][] invalidServerProtocols() {\n    return new Object[][] {{\"0\"}, {\"0sds\"}, {\"TCP\"}, {\"UDP\"}, {\"http@\"}};\n  }\n\n  @Test(\n      expectedExceptions = ValidationException.class,\n      expectedExceptionsMessageRegExp =\n          \"Machine '.*' in environment contains inconsistent memory attributes: Memory limit: '.*', Memory request: '.*'\")\n  public void shouldFailIfMemoryAttributesAreInconsistent() throws Exception {\n    // given\n    when(machineConfig.getAttributes())\n        .thenReturn(\n            ImmutableMap.of(\n                MEMORY_LIMIT_ATTRIBUTE,\n                String.valueOf(1024L * 1024L * 1024L),\n                MEMORY_REQUEST_ATTRIBUTE,\n                String.valueOf(2048L * 1024L * 1024L)));\n    // when\n    machinesValidator.validate(singletonMap(MACHINE_NAME, machineConfig));\n  }\n\n  @Test(dataProvider = \"validMemoryAttributes\")\n  public void shouldSucceedIfMemoryAttributesAreConsistentOrNotPresent(\n      String memoryLimit, String memoryRequest) throws Exception {\n    // given\n    Map<String, String> attributes = new HashMap<>();\n    if (memoryLimit != null) {\n      attributes.put(MEMORY_LIMIT_ATTRIBUTE, memoryLimit);\n    }\n    if (memoryRequest != null) {\n      attributes.put(MEMORY_LIMIT_ATTRIBUTE, memoryRequest);\n    }\n    when(machineConfig.getAttributes()).thenReturn(attributes);\n    // when\n    machinesValidator.validate(singletonMap(MACHINE_NAME, machineConfig));\n  }\n\n  @DataProvider(name = \"validMemoryAttributes\")\n  public Object[][] validMemoryAttributes() {\n    return new Object[][] {\n      {null, String.valueOf(2048L * 1024L * 1024L)},\n      {String.valueOf(2048L * 1024L * 1024L), null},\n      {null, null},\n      {String.valueOf(2048L * 1024L * 1024L), String.valueOf(2048L * 1024L * 1024L)}\n    };\n  }\n\n  @Test(dataProvider = \"validServerProtocols\")\n  public void shouldNotFailIfServerProtocolIsValid(String serviceProtocol) throws Exception {\n    // given\n    ServerConfigImpl server =\n        new ServerConfigImpl(\"8080\", serviceProtocol, \"/some/path\", singletonMap(\"key\", \"value\"));\n    when(machineConfig.getServers())\n        .thenReturn(singletonMap(Constants.SERVER_WS_AGENT_HTTP_REFERENCE, server));\n\n    // when\n    machinesValidator.validate(singletonMap(MACHINE_NAME, machineConfig));\n  }\n\n  @DataProvider(name = \"validServerProtocols\")\n  public Object[][] validServerProtocols() {\n    return new Object[][] {{\"a\"}, {\"http\"}, {\"tcp\"}, {\"tcp2\"}};\n  }\n\n  private static InternalMachineConfig machineMock() {\n    InternalMachineConfig machineConfig = mock(InternalMachineConfig.class);\n    when(machineConfig.getServers()).thenReturn(emptyMap());\n    return machineConfig;\n  }\n\n  private static InternalMachineConfig machineMockWithServers(String... servers) {\n    InternalMachineConfig machineConfig = machineMock();\n    when(machineConfig.getServers()).thenReturn(createServers(servers));\n    return machineConfig;\n  }\n\n  private static Map<String, ServerConfig> createServers(String... servers) {\n    return Arrays.stream(servers)\n        .collect(\n            Collectors.toMap(\n                Function.identity(),\n                s -> new ServerConfigImpl(\"8080\", \"http\", \"/\", singletonMap(\"key\", \"value\"))));\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/environment/ResourceLimitAttributesProvisionerTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.environment;\n\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.CPU_REQUEST_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;\nimport static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_REQUEST_ATTRIBUTE;\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.*;\n\nimport com.google.common.collect.ImmutableMap;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n/** Tests {@link ResourceLimitAttributesProvisioner} */\n@Listeners(MockitoTestNGListener.class)\npublic class ResourceLimitAttributesProvisionerTest {\n\n  @Test\n  public void testSetsRamDefaultAttributesWhenTheyAreMissingInConfigAndNotPassedInRecipe() {\n    long defaultMemoryLimit = 2048L;\n    long defaultMemoryRequest = 1024L;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    ResourceLimitAttributesProvisioner.provisionMemory(\n        machineConfig, 0L, 0L, defaultMemoryLimit, defaultMemoryRequest);\n    long memLimit = Long.parseLong(machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE));\n    long memRequest = Long.parseLong(machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE));\n\n    assertEquals(memLimit, defaultMemoryLimit);\n    assertEquals(memRequest, defaultMemoryRequest);\n  }\n\n  @Test\n  public void testRamDefaultMemoryRequestIsIgnoredIfGreaterThanDefaultRamLimit() {\n    long defaultMemoryLimit = 1024L;\n    long defaultMemoryRequest = 2048L;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    ResourceLimitAttributesProvisioner.provisionMemory(\n        machineConfig, 0L, 0L, defaultMemoryLimit, defaultMemoryRequest);\n    long memLimit = Long.parseLong(machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE));\n    long memRequest = Long.parseLong(machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE));\n\n    assertEquals(memLimit, defaultMemoryLimit);\n    assertEquals(memRequest, defaultMemoryLimit);\n  }\n\n  @Test\n  public void testSkipDefaultMemoryAttributesWhenTheyAreNegative() {\n    long defaultMemoryLimit = -1L;\n    long defaultMemoryRequest = -1024L;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    ResourceLimitAttributesProvisioner.provisionMemory(\n        machineConfig, 0L, 0L, defaultMemoryLimit, defaultMemoryRequest);\n\n    long memLimit = Long.parseLong(machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE));\n    long memRequest = Long.parseLong(machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE));\n\n    assertEquals(memLimit, 0L);\n    assertEquals(memRequest, 0L);\n  }\n\n  @Test\n  public void testRamAttributesAreTakenFromRecipeWhenNotPresentInConfig() {\n    long defaultMemoryLimit = 1024L;\n    long defaultMemoryRequest = 2048L;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    long recipeLimit = 4096L;\n    long recipeRequest = 2048L;\n    ResourceLimitAttributesProvisioner.provisionMemory(\n        machineConfig, recipeLimit, recipeRequest, defaultMemoryLimit, defaultMemoryRequest);\n\n    assertEquals(\n        machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE), String.valueOf(recipeLimit));\n    assertEquals(\n        machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE), String.valueOf(recipeRequest));\n  }\n\n  @Test\n  public void\n      testWhenRamAttributesTakenFromRecipeAreInconsistentAndNotPresentInConfigRequestIsIgnored() {\n    long defaultMemoryLimit = 1024L;\n    long defaultMemoryRequest = 2048L;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    // inconsistent attributes mean request > limit\n    long recipeLimit = 2048L;\n    long recipeRequest = 4096L;\n    ResourceLimitAttributesProvisioner.provisionMemory(\n        machineConfig, recipeLimit, recipeRequest, defaultMemoryLimit, defaultMemoryRequest);\n\n    assertEquals(\n        machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE), String.valueOf(recipeLimit));\n    assertEquals(\n        machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE), String.valueOf(recipeLimit));\n  }\n\n  @Test\n  public void testWhenRamAttributesArePresentInMachineConfigValuesInRecipeAreIgnored() {\n    long defaultMemoryLimit = 1024L;\n    long defaultMemoryRequest = 2048L;\n    InternalMachineConfig machineConfig =\n        mockInternalMachineConfig(\n            ImmutableMap.of(MEMORY_LIMIT_ATTRIBUTE, \"1526\", MEMORY_REQUEST_ATTRIBUTE, \"512\"));\n\n    long recipeLimit = 4096L;\n    long recipeRequest = 2048L;\n    ResourceLimitAttributesProvisioner.provisionMemory(\n        machineConfig, recipeLimit, recipeRequest, defaultMemoryLimit, defaultMemoryRequest);\n\n    assertEquals(machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE), String.valueOf(1526L));\n    assertEquals(machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE), String.valueOf(512L));\n  }\n\n  @Test\n  public void testWhenRamAttributesArePresentInMachineAreNegativeDefaultsShouldBeApplied() {\n    long defaultMemoryLimit = 2048L;\n    long defaultMemoryRequest = 1024L;\n    Map<String, String> attributes = new HashMap<>();\n    attributes.put(MEMORY_LIMIT_ATTRIBUTE, \"-1\");\n    attributes.put(MEMORY_REQUEST_ATTRIBUTE, \"-1\");\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(attributes);\n\n    ResourceLimitAttributesProvisioner.provisionMemory(\n        machineConfig, 0L, 0L, defaultMemoryLimit, defaultMemoryRequest);\n\n    assertEquals(\n        machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE),\n        String.valueOf(defaultMemoryLimit));\n    assertEquals(\n        machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE),\n        String.valueOf(defaultMemoryRequest));\n  }\n\n  @Test\n  public void testWhenRamRequestAttributeIsPresentInMachineConfigValuesInRecipeAreIgnored() {\n    long defaultMemoryLimit = 1024L;\n    long defaultMemoryRequest = 2048L;\n    Map<String, String> attributes = new HashMap<>();\n    attributes.put(MEMORY_REQUEST_ATTRIBUTE, \"512\");\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(attributes);\n\n    long recipeLimit = 4096L;\n    long recipeRequest = 2048L;\n    ResourceLimitAttributesProvisioner.provisionMemory(\n        machineConfig, recipeLimit, recipeRequest, defaultMemoryLimit, defaultMemoryRequest);\n\n    assertEquals(\n        machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE), String.valueOf(recipeLimit));\n    assertEquals(machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE), String.valueOf(512L));\n  }\n\n  @Test\n  public void testWhenRamLimitAttributeIsPresentInMachineConfigValuesInRecipeAreIgnored() {\n    long defaultMemoryLimit = 1024L;\n    long defaultMemoryRequest = 2048L;\n    Map<String, String> attributes = new HashMap<>();\n    attributes.put(MEMORY_LIMIT_ATTRIBUTE, \"1526\");\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(attributes);\n\n    long recipeLimit = 4096L;\n    long recipeRequest = 2048L;\n    ResourceLimitAttributesProvisioner.provisionMemory(\n        machineConfig, recipeLimit, recipeRequest, defaultMemoryLimit, defaultMemoryRequest);\n\n    assertEquals(machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE), String.valueOf(1526L));\n    assertEquals(\n        machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE),\n        String.valueOf(defaultMemoryRequest));\n  }\n\n  @Test\n  public void testWhenRamAttributesAreNotPresentInMachineConfigAndOnlyRequestIsProvidedInRecipe() {\n    long defaultMemoryLimit = 2048L;\n    long defaultMemoryRequest = 1024L;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    long recipeRequest = 1526L;\n    ResourceLimitAttributesProvisioner.provisionMemory(\n        machineConfig, 0, recipeRequest, defaultMemoryLimit, defaultMemoryRequest);\n\n    assertEquals(\n        machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE),\n        String.valueOf(defaultMemoryLimit));\n    assertEquals(\n        machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE), String.valueOf(recipeRequest));\n  }\n\n  @Test\n  public void testWhenRamAttributesAreNotPresentInMachineConfigAndOnlyLimitIsProvidedInRecipe() {\n    long defaultMemoryLimit = 2048L;\n    long defaultMemoryRequest = 1024L;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    long recipeLimit = 1526L;\n    ResourceLimitAttributesProvisioner.provisionMemory(\n        machineConfig, recipeLimit, 0, defaultMemoryLimit, defaultMemoryRequest);\n\n    assertEquals(\n        machineConfig.getAttributes().get(MEMORY_LIMIT_ATTRIBUTE), String.valueOf(recipeLimit));\n    assertEquals(\n        machineConfig.getAttributes().get(MEMORY_REQUEST_ATTRIBUTE),\n        String.valueOf(defaultMemoryRequest));\n  }\n\n  @Test\n  public void testSetsCPUDefaultAttributesWhenTheyAreMissingInConfigAndNotPassedInRecipe() {\n    float defaultCPULimit = 0.500f;\n    float defaultCPURequest = 0.200f;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    ResourceLimitAttributesProvisioner.provisionCPU(\n        machineConfig, 0, 0, defaultCPULimit, defaultCPURequest);\n    float cpuLimit = Float.parseFloat(machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE));\n    float cpuRequest = Float.parseFloat(machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE));\n\n    assertEquals(cpuLimit, defaultCPULimit);\n    assertEquals(cpuRequest, defaultCPURequest);\n  }\n\n  @Test\n  public void testSkipDefaultCPUAttributesWhenTheyAreNegative() {\n    float defaultCPULimit = -1;\n    float defaultCPURequest = -1;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    ResourceLimitAttributesProvisioner.provisionCPU(\n        machineConfig, 0, 0, defaultCPULimit, defaultCPURequest);\n    float cpuLimit = Float.parseFloat(machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE));\n    float cpuRequest = Float.parseFloat(machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE));\n\n    assertEquals(cpuLimit, 0);\n    assertEquals(cpuRequest, 0);\n  }\n\n  @Test\n  public void testRamDefaultCPURequestIsIgnoredIfGreaterThanDefaultCPULimit() {\n    float defaultCPULimit = 0.2f;\n    float defaultCPURequest = 0.5f;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    ResourceLimitAttributesProvisioner.provisionCPU(\n        machineConfig, 0L, 0L, defaultCPULimit, defaultCPURequest);\n    float memLimit = Float.parseFloat(machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE));\n    float memRequest = Float.parseFloat(machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE));\n\n    assertEquals(memLimit, defaultCPULimit);\n    assertEquals(memRequest, defaultCPULimit);\n  }\n\n  @Test\n  public void testCPUAttributesAreTakenFromRecipeWhenNotPresentInConfig() {\n    float defaultCPULimit = 1.0f;\n    float defaultCPURequest = 0.2f;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    float recipeLimit = 4f;\n    float recipeRequest = 2f;\n    ResourceLimitAttributesProvisioner.provisionCPU(\n        machineConfig, recipeLimit, recipeRequest, defaultCPULimit, defaultCPURequest);\n\n    assertEquals(\n        machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE), String.valueOf(recipeLimit));\n    assertEquals(\n        machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE), String.valueOf(recipeRequest));\n  }\n\n  @Test\n  public void\n      testWhenCPUAttributesTakenFromRecipeAreInconsistentAndNotPresentInConfigRequestIsIgnored() {\n    float defaultCPULimit = 0.2f;\n    float defaultCPURequest = 0.5f;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    // inconsistent attributes mean request > limit\n    float recipeLimit = 0.3f;\n    float recipeRequest = 0.6f;\n    ResourceLimitAttributesProvisioner.provisionCPU(\n        machineConfig, recipeLimit, recipeRequest, defaultCPULimit, defaultCPURequest);\n\n    assertEquals(\n        machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE), String.valueOf(recipeLimit));\n    assertEquals(\n        machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE), String.valueOf(recipeLimit));\n  }\n\n  @Test\n  public void testWhenCPUAttributesArePresentInMachineConfigValuesInRecipeAreIgnored() {\n    float defaultCPULimit = 0.5f;\n    float defaultCPURequest = 0.2f;\n    InternalMachineConfig machineConfig =\n        mockInternalMachineConfig(\n            ImmutableMap.of(CPU_LIMIT_ATTRIBUTE, \"0.512\", CPU_REQUEST_ATTRIBUTE, \"0.152\"));\n\n    float recipeLimit = 0.6f;\n    float recipeRequest = 0.3f;\n    ResourceLimitAttributesProvisioner.provisionCPU(\n        machineConfig, recipeLimit, recipeRequest, defaultCPULimit, defaultCPURequest);\n\n    assertEquals(machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE), String.valueOf(0.512f));\n    assertEquals(machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE), String.valueOf(0.152f));\n  }\n\n  @Test\n  public void testWhenCPURequestAttributeIsPresentInMachineConfigValuesInRecipeAreIgnored() {\n    float defaultCPULimit = 0.5f;\n    float defaultCPURequest = 0.2f;\n    Map<String, String> attributes = new HashMap<>();\n    attributes.put(CPU_REQUEST_ATTRIBUTE, \"0.512\");\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(attributes);\n\n    float recipeLimit = 0.6f;\n    float recipeRequest = 0.3f;\n    ResourceLimitAttributesProvisioner.provisionCPU(\n        machineConfig, recipeLimit, recipeRequest, defaultCPULimit, defaultCPURequest);\n\n    assertEquals(\n        machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE), String.valueOf(recipeLimit));\n    assertEquals(machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE), String.valueOf(0.512f));\n  }\n\n  @Test\n  public void testWhenCPULimitAttributeIsPresentInMachineConfigValuesInRecipeAreIgnored() {\n    float defaultCPULimit = 0.5f;\n    float defaultCPURequest = 0.2f;\n    Map<String, String> attributes = new HashMap<>();\n    attributes.put(CPU_LIMIT_ATTRIBUTE, \"0.152\");\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(attributes);\n\n    float recipeLimit = 0.6f;\n    float recipeRequest = 0.3f;\n    ResourceLimitAttributesProvisioner.provisionCPU(\n        machineConfig, recipeLimit, recipeRequest, defaultCPULimit, defaultCPURequest);\n\n    assertEquals(machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE), String.valueOf(0.152f));\n    assertEquals(\n        machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE), String.valueOf(recipeRequest));\n  }\n\n  @Test\n  public void testWhenCPULimitAttributeIsPresentInMachineAreNegativeDefaultsShouldBeApplied() {\n    float defaultCPULimit = 0.5f;\n    float defaultCPURequest = 0.2f;\n    Map<String, String> attributes = new HashMap<>();\n    attributes.put(CPU_LIMIT_ATTRIBUTE, \"-1\");\n    attributes.put(CPU_REQUEST_ATTRIBUTE, \"-1\");\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(attributes);\n\n    ResourceLimitAttributesProvisioner.provisionCPU(\n        machineConfig, 0, 0, defaultCPULimit, defaultCPURequest);\n\n    assertEquals(\n        machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE), String.valueOf(defaultCPULimit));\n    assertEquals(\n        machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE),\n        String.valueOf(defaultCPURequest));\n  }\n\n  @Test\n  public void testWhenCPUAttributesAreNotPresentInMachineConfigAndOnlyRequestIsProvidedInRecipe() {\n    float defaultCPULimit = 0.5f;\n    float defaultCPURequest = 0.2f;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    float recipeRequest = 0.1526f;\n    ResourceLimitAttributesProvisioner.provisionCPU(\n        machineConfig, 0, recipeRequest, defaultCPULimit, defaultCPURequest);\n\n    assertEquals(\n        machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE), String.valueOf(defaultCPULimit));\n    assertEquals(\n        machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE), String.valueOf(recipeRequest));\n  }\n\n  @Test\n  public void testWhenCPUAttributesAreNotPresentInMachineConfigAndOnlyLimitIsProvidedInRecipe() {\n    float defaultCPULimit = 0.5f;\n    float defaultCPURequest = 0.2f;\n    InternalMachineConfig machineConfig = mockInternalMachineConfig(new HashMap<>());\n\n    float recipeLimit = 0.152f;\n    ResourceLimitAttributesProvisioner.provisionCPU(\n        machineConfig, recipeLimit, 0, defaultCPULimit, defaultCPURequest);\n\n    assertEquals(\n        machineConfig.getAttributes().get(CPU_LIMIT_ATTRIBUTE), String.valueOf(recipeLimit));\n    assertEquals(\n        machineConfig.getAttributes().get(CPU_REQUEST_ATTRIBUTE), String.valueOf(recipeLimit));\n  }\n\n  private static InternalMachineConfig mockInternalMachineConfig(Map<String, String> attributes) {\n    final InternalMachineConfig machineConfigMock = mock(InternalMachineConfig.class);\n    when(machineConfigMock.getAttributes()).thenReturn(attributes);\n    return machineConfigMock;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/provision/env/WorkspaceNameEnvVarProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.WorkspaceDao;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class WorkspaceNameEnvVarProviderTest {\n\n  @Mock WorkspaceDao workspaceDao;\n  @Mock WorkspaceImpl workspace;\n  @Mock WorkspaceConfigImpl config;\n  @Mock RuntimeIdentity runtimeIdentity;\n  WorkspaceNameEnvVarProvider provider;\n\n  @BeforeMethod\n  public void setup() {\n    provider = new WorkspaceNameEnvVarProvider(workspaceDao);\n  }\n\n  @Test\n  public void shouldReturnNameVar()\n      throws NotFoundException, ServerException, InfrastructureException {\n    // given\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(\"ws-id111\");\n    doReturn(workspace).when(workspaceDao).get(Mockito.eq(\"ws-id111\"));\n    when(workspace.getName()).thenReturn(\"ws-name\");\n\n    // when\n    Pair<String, String> actual = provider.get(runtimeIdentity);\n\n    // then\n    assertEquals(actual.first, WorkspaceNameEnvVarProvider.CHE_WORKSPACE_NAME);\n    assertEquals(actual.second, \"ws-name\");\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Not able to get workspace name for workspace with id ws-id111\")\n  public void shouldWrapNotFoundExceptionException()\n      throws NotFoundException, ServerException, InfrastructureException {\n    // given\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(\"ws-id111\");\n    doThrow(new NotFoundException(\"Some message\")).when(workspaceDao).get(Mockito.eq(\"ws-id111\"));\n\n    // when\n    provider.get(runtimeIdentity);\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Not able to get workspace name for workspace with id ws-id111\")\n  public void shouldWrapServerExceptionException()\n      throws NotFoundException, ServerException, InfrastructureException {\n    // given\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(\"ws-id111\");\n    doThrow(new ServerException(\"Some message\")).when(workspaceDao).get(Mockito.eq(\"ws-id111\"));\n\n    // when\n    provider.get(runtimeIdentity);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/provision/env/WorkspaceNamespaceEnvVarProviderTest.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.spi.provision.env;\n\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.doThrow;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\n\nimport org.eclipse.che.api.core.NotFoundException;\nimport org.eclipse.che.api.core.ServerException;\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.spi.WorkspaceDao;\nimport org.eclipse.che.commons.lang.Pair;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeMethod;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class WorkspaceNamespaceEnvVarProviderTest {\n\n  @Mock WorkspaceDao workspaceDao;\n  @Mock WorkspaceImpl workspace;\n  @Mock RuntimeIdentity runtimeIdentity;\n  WorkspaceNamespaceNameEnvVarProvider provider;\n\n  @BeforeMethod\n  public void setup() {\n    provider = new WorkspaceNamespaceNameEnvVarProvider(workspaceDao);\n  }\n\n  @Test\n  public void shouldReturnNamespaceVar()\n      throws NotFoundException, ServerException, InfrastructureException {\n    // given\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(\"ws-id111\");\n    doReturn(workspace).when(workspaceDao).get(Mockito.eq(\"ws-id111\"));\n    when(workspace.getNamespace()).thenReturn(\"ws-namespace\");\n\n    // when\n    Pair<String, String> actual = provider.get(runtimeIdentity);\n\n    // then\n    assertEquals(actual.first, WorkspaceNamespaceNameEnvVarProvider.CHE_WORKSPACE_NAMESPACE);\n    assertEquals(actual.second, \"ws-namespace\");\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Not able to get workspace namespace for workspace with id ws-id111\")\n  public void shouldWrapNotFoundExceptionException()\n      throws NotFoundException, ServerException, InfrastructureException {\n    // given\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(\"ws-id111\");\n    doThrow(new NotFoundException(\"Some message\")).when(workspaceDao).get(Mockito.eq(\"ws-id111\"));\n\n    // when\n    provider.get(runtimeIdentity);\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Not able to get workspace namespace for workspace with id ws-id111\")\n  public void shouldWrapServerExceptionException()\n      throws NotFoundException, ServerException, InfrastructureException {\n    // given\n    when(runtimeIdentity.getWorkspaceId()).thenReturn(\"ws-id111\");\n    doThrow(new ServerException(\"Some message\")).when(workspaceDao).get(Mockito.eq(\"ws-id111\"));\n\n    // when\n    provider.get(runtimeIdentity);\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/wsplugins/PluginFQNParserTest.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.server.wsplugins;\n\nimport static org.mockito.ArgumentMatchers.eq;\nimport static org.mockito.Mockito.when;\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.Assert.assertEqualsNoOrder;\nimport static org.testng.Assert.assertTrue;\n\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\nimport java.net.URI;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.workspace.server.devfile.FileContentProvider;\nimport org.eclipse.che.api.workspace.server.spi.InfrastructureException;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.ExtendedPluginFQN;\nimport org.eclipse.che.api.workspace.server.wsplugins.model.PluginFQN;\nimport org.eclipse.che.api.workspace.shared.Constants;\nimport org.mockito.Mock;\nimport org.mockito.testng.MockitoTestNGListener;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.DataProvider;\nimport org.testng.annotations.Listeners;\nimport org.testng.annotations.Test;\n\n@Listeners(MockitoTestNGListener.class)\npublic class PluginFQNParserTest {\n\n  @Mock private FileContentProvider fileContentProvider;\n\n  private PluginFQNParser parser;\n\n  @BeforeClass\n  public void setUp() throws Exception {\n    parser = new PluginFQNParser();\n  }\n\n  @Test\n  public void shouldReturnEmptyListWhenNoPluginsOrEditors() throws Exception {\n    Map<String, String> attributes = ImmutableMap.of(\"testProperty\", \"testValue\");\n\n    Collection<PluginFQN> result = parser.parsePlugins(attributes);\n\n    assertTrue(\n        result.isEmpty(),\n        \"PluginFQNParser should return empty list when attributes does not contain plugins or editors\");\n  }\n\n  @Test\n  public void shouldComposeIdWhenAllPartsGivenToTheConstructor() {\n    ExtendedPluginFQN pluginFQN =\n        new ExtendedPluginFQN(\"reference\", \"publisher\", \"name\", \"version\");\n    assertEquals(pluginFQN.getId(), \"publisher/name/version\");\n  }\n\n  @Test(dataProvider = \"validAttributesProvider\")\n  public void shouldParseAllPluginsAndEditor(AttributeParsingTestCase testCase) throws Exception {\n    Collection<PluginFQN> actual = parser.parsePlugins(testCase.attributes);\n    assertEqualsNoOrder(actual.toArray(), testCase.expectedPlugins.toArray());\n  }\n\n  @Test(dataProvider = \"validPluginStringProvider\")\n  public void shouldParsePluginOrEditorToExtendedFQN(String plugin, ExtendedPluginFQN expected)\n      throws Exception {\n    ExtendedPluginFQN actual = parser.parsePluginFQN(plugin);\n    assertEquals(actual, expected);\n  }\n\n  @Test(dataProvider = \"validPluginReferencesProvider\")\n  public void shouldParsePluginOrEditorFromReference(\n      String reference, String pluginYaml, ExtendedPluginFQN expected) throws Exception {\n    when(fileContentProvider.fetchContent(eq(reference))).thenReturn(pluginYaml);\n    ExtendedPluginFQN actual = parser.evaluateFqn(reference, fileContentProvider);\n    assertEquals(actual, expected);\n  }\n\n  @Test(\n      dataProvider = \"invalidAttributeStringProvider\",\n      expectedExceptions = InfrastructureException.class)\n  public void shouldThrowExceptionWhenPluginStringIsInvalid(String plugin) throws Exception {\n    Map<String, String> attributes = createAttributes(\"\", plugin);\n    parser.parsePlugins(attributes);\n  }\n\n  @Test(\n      dataProvider = \"invalidAttributeStringProvider\",\n      expectedExceptions = InfrastructureException.class)\n  public void shouldThrowExceptionWhenEditorStringIsInvalid(String editor) throws Exception {\n    Map<String, String> attributes = createAttributes(editor, \"\");\n\n    parser.parsePlugins(attributes);\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp = \"Multiple editors.*\")\n  public void shouldThrowExceptionWhenMultipleEditorsDefined() throws Exception {\n    Map<String, String> attributes =\n        createAttributes(\"publisher1/editor1/version1,publisher1/editor2/version1\", \"\");\n\n    parser.parsePlugins(attributes);\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Invalid Che tooling plugins configuration: plugin publisher1/testplugin/1.0 is duplicated\")\n  public void shouldThrowExceptionWhenDuplicatePluginDefined() throws Exception {\n    Map<String, String> attributes =\n        createAttributes(\n            \"\",\n            formatPlugin(\"http://testregistry1:8080\", \"publisher1/testplugin/1.0\"),\n            formatPlugin(\"http://testregistry2:8080\", \"publisher1/testplugin/1.0\"));\n\n    parser.parsePlugins(attributes);\n  }\n\n  @Test(\n      expectedExceptions = InfrastructureException.class,\n      expectedExceptionsMessageRegExp =\n          \"Invalid Che tooling plugins configuration: plugin publisher1/testplugin/1.0 is duplicated\")\n  public void shouldDetectDuplicatedPluginsIfTheyArePrefixedOrSuffixedWithEmptySpaces()\n      throws Exception {\n    Map<String, String> attributes =\n        createAttributes(\n            \"\",\n            \" \" + formatPlugin(\"http://testregistry1:8080\", \"publisher1/testplugin/1.0\"),\n            formatPlugin(\"http://testregistry2:8080\", \"publisher1/testplugin/1.0\") + \" \");\n\n    parser.parsePlugins(attributes);\n  }\n\n  @DataProvider(name = \"invalidAttributeStringProvider\")\n  public static Object[][] invalidAttributeStringProvider() {\n    return new Object[][] {\n      {formatPlugin(\"http://bad registry url\", \"testplugin/1.0\")},\n      {formatPlugin(\"http://testregistry:8080\", \"bad:pluginname/1.0\")},\n      {formatPlugin(\"http://testregistry:8080\", \"/version\")},\n      {formatPlugin(\"http://testregistry:8080\", \"id/\")},\n      {formatPlugin(\"http://testregistry:8080\", \"name/version\")},\n      {formatPlugin(\"http://testregistry:8080\", \"id:version\")},\n      {formatPlugin(\"http://testregistry:8080\", \"publisher/name:version\")},\n    };\n  }\n\n  @DataProvider(name = \"validAttributesProvider\")\n  public static Object[][] validAttributesProvider() {\n    PluginFQN basicEditor =\n        new PluginFQN(URI.create(\"http://registry:8080\"), \"publisher/editor/ver\");\n    PluginFQN withRegistry =\n        new PluginFQN(URI.create(\"http://registry:8080\"), \"publisher/plugin/1.0\");\n    PluginFQN noRegistry = new PluginFQN(null, \"publisher/pluginnoregistry/2.0\");\n    PluginFQN pathRegistry =\n        new PluginFQN(\n            URI.create(\"http://registry/multiple/path\"), \"publisher/pluginpathregistry/3.0\");\n    PluginFQN reference = new PluginFQN(\"http://mysite:8080/multiple/path/meta.yaml\");\n    return new AttributeParsingTestCase[][] {\n      {\n        new AttributeParsingTestCase(\n            \"Test plugin with registry\",\n            ImmutableList.of(basicEditor, withRegistry),\n            createAttributes(formatPlugin(basicEditor), formatPlugins(withRegistry)))\n      },\n      {\n        new AttributeParsingTestCase(\n            \"Test plugin with https registry\",\n            ImmutableList.of(\n                new PluginFQN(URI.create(\"https://registry:8080\"), \"publisher/editor/ver\")),\n            createAttributes(\n                null,\n                formatPlugin(\n                    new PluginFQN(URI.create(\"https://registry:8080\"), \"publisher/editor/ver\"))))\n      },\n      {\n        new AttributeParsingTestCase(\n            \"Test plugin with registry containing path\",\n            ImmutableList.of(\n                new PluginFQN(\n                    URI.create(\"https://registry:8080/some/path/v3\"), \"publisher/editor/ver\")),\n            createAttributes(\n                null,\n                formatPlugin(\n                    new PluginFQN(\n                        URI.create(\"https://registry:8080/some/path/v3/\"),\n                        \"publisher/editor/ver\"))))\n      },\n      {\n        new AttributeParsingTestCase(\n            \"Test plugin without registry\",\n            ImmutableList.of(basicEditor, noRegistry),\n            createAttributes(formatPlugin(basicEditor), formatPlugins(noRegistry)))\n      },\n      {\n        new AttributeParsingTestCase(\n            \"Test plugin with multi-level path in registry\",\n            ImmutableList.of(basicEditor, pathRegistry),\n            createAttributes(formatPlugin(basicEditor), formatPlugins(pathRegistry)))\n      },\n      {\n        new AttributeParsingTestCase(\n            \"Test plugin described by reference\",\n            ImmutableList.of(basicEditor, reference),\n            createAttributes(\n                formatPlugin(basicEditor), \"http://mysite:8080/multiple/path/meta.yaml\"))\n      },\n      {\n        new AttributeParsingTestCase(\n            \"Test attributes with no editor field\",\n            ImmutableList.of(withRegistry),\n            createAttributes(null, formatPlugins(withRegistry)))\n      },\n      {\n        new AttributeParsingTestCase(\n            \"Test attributes with empty editor field\",\n            ImmutableList.of(withRegistry),\n            createAttributes(\"\", formatPlugins(withRegistry)))\n      },\n      {\n        new AttributeParsingTestCase(\n            \"Test attributes with no plugin field\",\n            ImmutableList.of(basicEditor),\n            createAttributes(formatPlugin(basicEditor), (String[]) null))\n      },\n      {\n        new AttributeParsingTestCase(\n            \"Test attributes with empty plugin field\",\n            ImmutableList.of(basicEditor),\n            createAttributes(formatPlugin(basicEditor), \"\"))\n      },\n      {\n        new AttributeParsingTestCase(\n            \"Test attributes with no plugin or editor field\",\n            Collections.emptyList(),\n            createAttributes(null, (String[]) null))\n      },\n      {\n        new AttributeParsingTestCase(\n            \"Test attributes with empty plugin and editor field\",\n            Collections.emptyList(),\n            createAttributes(\"\", \"\"))\n      },\n      {\n        new AttributeParsingTestCase(\n            \"Test multiple plugins and an editor\",\n            ImmutableList.of(basicEditor, withRegistry, noRegistry, pathRegistry),\n            createAttributes(\n                formatPlugin(basicEditor), formatPlugins(withRegistry, noRegistry, pathRegistry)))\n      },\n    };\n  }\n\n  // Objects are\n  //   (String plugin, ExtendedPluginFQN expectedPlugin)\n  @DataProvider(name = \"validPluginStringProvider\")\n  public static Object[][] validPluginStringProvider() {\n    return new Object[][] {\n      {\n        \"http://registry:8080#publisher/editor/ver\",\n        new ExtendedPluginFQN(\n            URI.create(\"http://registry:8080\"),\n            \"publisher/editor/ver\",\n            \"publisher\",\n            \"editor\",\n            \"ver\")\n      },\n      {\n        \"https://registry:8080#publisher/editor/ver\",\n        new ExtendedPluginFQN(\n            URI.create(\"https://registry:8080\"),\n            \"publisher/editor/ver\",\n            \"publisher\",\n            \"editor\",\n            \"ver\")\n      },\n      {\n        \"https://che-registry.com.ua#publisher/editor/ver\",\n        new ExtendedPluginFQN(\n            URI.create(\"https://che-registry.com.ua\"),\n            \"publisher/editor/ver\",\n            \"publisher\",\n            \"editor\",\n            \"ver\")\n      },\n      {\n        \"https://che-registry.com.ua/plugins#publisher/editor/ver\",\n        new ExtendedPluginFQN(\n            URI.create(\"https://che-registry.com.ua/plugins\"),\n            \"publisher/editor/ver\",\n            \"publisher\",\n            \"editor\",\n            \"ver\")\n      },\n      {\n        \"https://che-registry.com.ua/plugins/v3/#publisher/editor/ver\",\n        new ExtendedPluginFQN(\n            URI.create(\"https://che-registry.com.ua/plugins/v3\"),\n            \"publisher/editor/ver\",\n            \"publisher\",\n            \"editor\",\n            \"ver\")\n      },\n      {\n        \"https://che-registry.com.ua/some/long/path#publisher/editor/ver\",\n        new ExtendedPluginFQN(\n            URI.create(\"https://che-registry.com.ua/some/long/path\"),\n            \"publisher/editor/ver\",\n            \"publisher\",\n            \"editor\",\n            \"ver\")\n      },\n      {\n        \"publisher/editor/ver\",\n        new ExtendedPluginFQN(null, \"publisher/editor/ver\", \"publisher\", \"editor\", \"ver\")\n      },\n      {\n        \"publisher/editor/1.12.1\",\n        new ExtendedPluginFQN(null, \"publisher/editor/1.12.1\", \"publisher\", \"editor\", \"1.12.1\")\n      },\n      {\n        \"publisher/editor/v2.12.x\",\n        new ExtendedPluginFQN(null, \"publisher/editor/v2.12.x\", \"publisher\", \"editor\", \"v2.12.x\")\n      },\n      {\n        \"publisher/che-theia/next\",\n        new ExtendedPluginFQN(null, \"publisher/che-theia/next\", \"publisher\", \"che-theia\", \"next\")\n      },\n      {\n        \"publisher/che-theia/2.12-latest\",\n        new ExtendedPluginFQN(\n            null, \"publisher/che-theia/2.12-latest\", \"publisher\", \"che-theia\", \"2.12-latest\")\n      },\n    };\n  }\n\n  // Objects are\n  //   (String reference, String yamlContent, ExtendedPluginFQN expectedPlugin)\n  @DataProvider(name = \"validPluginReferencesProvider\")\n  public static Object[][] validPluginReferencesProvider() {\n    return new Object[][] {\n      {\n        \"http://registry:8080/publisher/editor/ver/meta.yaml\",\n        \"apiVersion: v2\\n\"\n            + \"publisher: publisher\\n\"\n            + \"name: editor\\n\"\n            + \"version: ver\\n\"\n            + \"type: Che Editor\",\n        new ExtendedPluginFQN(\n            \"http://registry:8080/publisher/editor/ver/meta.yaml\", \"publisher\", \"editor\", \"ver\")\n      },\n      {\n        \"https://pastebin.com/1ij3475rh\",\n        \"apiVersion: v2\\n\"\n            + \"publisher: publisher\\n\"\n            + \"name: editor\\n\"\n            + \"version: 0.0.5\\n\"\n            + \"type: Che Editor\",\n        new ExtendedPluginFQN(\"https://pastebin.com/1ij3475rh\", \"publisher\", \"editor\", \"0.0.5\")\n      },\n      {\n        \"https://che-registry.com.ua/publisher/plugin/0.0.5/meta.yaml\",\n        \"apiVersion: v2\\n\"\n            + \"publisher: publisher\\n\"\n            + \"name: plugin123\\n\"\n            + \"version: 0.0.5\\n\"\n            + \"type: Che Plugin\",\n        new ExtendedPluginFQN(\n            \"https://che-registry.com.ua/publisher/plugin/0.0.5/meta.yaml\",\n            \"publisher\",\n            \"plugin123\",\n            \"0.0.5\")\n      },\n      {\n        \"https://pastebin.com/raw/EBmz0YMS\",\n        \"apiVersion: v2\\n\"\n            + \"publisher: publisher\\n\"\n            + \"name: numericVersion\\n\"\n            + \"version: 1.1\\n\"\n            + \"type: Che Plugin\",\n        new ExtendedPluginFQN(\n            \"https://pastebin.com/raw/EBmz0YMS\", \"publisher\", \"numericVersion\", \"1.1\")\n      }\n    };\n  }\n\n  private static String[] formatPlugins(PluginFQN... plugins) {\n    return Arrays.stream(plugins).map(PluginFQNParserTest::formatPlugin).toArray(String[]::new);\n  }\n\n  private static String formatPlugin(PluginFQN plugin) {\n    String registry = plugin.getRegistry() == null ? null : plugin.getRegistry().toString();\n    return formatPlugin(registry, plugin.getId());\n  }\n\n  private static String formatPlugin(String registry, String id) {\n    if (registry == null) {\n      return id;\n    } else {\n      return registry + \"#\" + id;\n    }\n  }\n\n  private static Map<String, String> createAttributes(String editor, String... plugins) {\n    Map<String, String> attributes = new HashMap<>();\n    if (plugins != null) {\n      String allPlugins = String.join(\",\", plugins);\n      attributes.put(Constants.WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE, allPlugins);\n    }\n    if (editor != null) {\n      attributes.put(Constants.WORKSPACE_TOOLING_EDITOR_ATTRIBUTE, editor);\n    }\n    return ImmutableMap.copyOf(attributes);\n  }\n\n  /**\n   * Holder of data for a test case. Syntax sugar that primary goal is to allow IDE log test case\n   * description (in one of the fields) and compare expected and actual arrays in a way that prints\n   * diff when they are not equal\n   */\n  private static class AttributeParsingTestCase {\n\n    private String description;\n    private List<PluginFQN> expectedPlugins;\n    private Map<String, String> attributes;\n\n    public AttributeParsingTestCase(\n        String description, List<PluginFQN> expectedPlugins, Map<String, String> attributes) {\n      this.description = description;\n      this.expectedPlugins = expectedPlugins;\n      this.attributes = attributes;\n    }\n\n    @Override\n    public String toString() {\n      return description;\n    }\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/META-INF/services/org.eclipse.che.commons.test.tck.TckModule",
    "content": "org.eclipse.che.api.workspace.server.jpa.WorkspaceTckModule\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/devfile.json",
    "content": "{\n  \"apiVersion\": \"1.0.0\",\n  \"metadata\": {\n    \"name\": \"petclinic-dev-environment\",\n    \"generateName\": \"petclinic-\"\n  },\n  \"projects\": [\n    {\n      \"name\": \"petclinic\",\n      \"source\": {\n        \"type\": \"git\",\n        \"location\": \"git@github.com:spring-projects/spring-petclinic.git\"\n      }\n    }\n  ],\n  \"components\": [\n    {\n      \"alias\": \"mvn-stack\",\n      \"type\": \"chePlugin\",\n      \"id\": \"eclipse/chemaven-jdk8/1.0.0\"\n    },\n    {\n      \"type\": \"cheEditor\",\n      \"id\": \"eclipse/che-theia/0.0.3\"\n    },\n    {\n      \"alias\": \"jdt.ls\",\n      \"type\": \"chePlugin\",\n      \"id\": \"org.eclipse.chetheia-jdtls:0.0.3\",\n      \"preferences\": {\n        \"java.home\": \"/home/user/jdk11\",\n        \"java.jdt.ls.vmargs\": \"-noverify -Xmx1G -XX:+UseG1GC -XX:+UseStringDeduplication\",\n        \"java.jtg.memory\": 12345,\n        \"java.boolean\": true\n      }\n    },\n    {\n      \"type\": \"openshift\",\n      \"reference\": \"petclinic.yaml\",\n      \"selector\": {\n        \"app.kubernetes.io/name\": \"mysql\",\n        \"app.kubernetes.io/component\": \"database\",\n        \"app.kubernetes.io/part-of\": \"petclinic\"\n      }\n    }\n  ],\n  \"commands\": [\n    {\n      \"name\": \"build\",\n      \"actions\": [\n        {\n          \"type\": \"exec\",\n          \"component\": \"mvn-stack\",\n          \"command\": \"mvn package\",\n          \"workdir\": \"/projects/spring-petclinic\"\n        }\n      ]\n    },\n    {\n      \"name\": \"run\",\n      \"attributes\": {\n        \"runType\": \"sequential\"\n      },\n      \"actions\": [\n        {\n          \"type\": \"exec\",\n          \"component\": \"mvn-stack\",\n          \"command\": \"mvn spring-boot:run\",\n          \"workdir\": \"/projects/spring-petclinic\"\n        }\n      ]\n    },\n    {\n      \"name\": \"other\",\n      \"actions\": [\n        {\n          \"type\": \"exec\",\n          \"component\": \"jdt.ls\",\n          \"command\": \"run.sh\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/devfile.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\n  generateName: petclinic-\nprojects:\n  - name: petclinic\n    source:\n      type: git\n      location: 'git@github.com:spring-projects/spring-petclinic.git'\ncomponents:\n  - alias: mvn-stack\n    type: chePlugin\n    id: eclipse/chemaven-jdk8/1.0.0\n  - type: cheEditor\n    id: eclipse/che-theia/0.0.3\n  - alias: jdt.ls\n    type: chePlugin\n    id: org.eclipse.chetheia-jdtls:0.0.3\n    preferences:\n      java.home: '/home/user/jdk11'\n      java.jdt.ls.vmargs: '-noverify -Xmx1G -XX:+UseG1GC -XX:+UseStringDeduplication'\n      java.jtg.memory: 12345\n      java.boolean: true\n  - type: openshift\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\ncommands:\n  - name: build\n    actions:\n      - type: exec\n        component: mvn-stack\n        command: mvn package\n        workdir: /projects/spring-petclinic\n  - name: run\n    attributes:\n      runType: sequential\n    actions:\n      - type: exec\n        component: mvn-stack\n        command: mvn spring-boot:run\n        workdir: /projects/spring-petclinic\n  - name: other\n    actions:\n      - type: exec\n        component: jdt.ls\n        command: run.sh\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2021 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/petclinic.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: v1\nkind: List\nitems:\n- apiVersion: v1\n  kind: Pod\n  metadata:\n    name: petclinic\n    labels:\n      app.kubernetes.io/name: petclinic\n      app.kubernetes.io/component: webapp\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    containers:\n    - name: server\n      image: mariolet/petclinic\n      ports:\n      - containerPort: 8080\n        protocol: TCP\n      resources:\n        limits:\n          memory: 512Mi\n- apiVersion: v1\n  kind: Pod\n  metadata:\n    name: mysql\n    labels:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    containers:\n    - name: mysql\n      image: centos/mysql-57-centos7\n      env:\n      - name: MYSQL_USER\n        value: petclinic\n      - name: MYSQL_PASSWORD\n        value: petclinic\n      - name: MYSQL_ROOT_PASSWORD\n        value: petclinic\n      - name: MYSQL_DATABASE\n        value: petclinic\n      ports:\n      - containerPort: 3306\n        protocol: TCP\n      resources:\n        limits:\n          memory: 512Mi\n- apiVersion: v1\n  kind: Pod\n  metadata:\n    name: withoutLabels\n- kind: Service\n  apiVersion: v1\n  metadata:\n    name: mysql\n    labels:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    ports:\n      - name: mysql\n        port: 3306\n        targetPort: 3360\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n- kind: Service\n  apiVersion: v1\n  metadata:\n    name: petclinic\n    labels:\n      app.kubernetes.io/name: petclinic\n      app.kubernetes.io/component: webapp\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    ports:\n      - name: web\n        port: 8080\n        targetPort: 8080\n    selector:\n      app: petclinic\n      component: webapp\n- kind: Route\n  apiVersion: v1\n  metadata:\n    name: petclinic\n    labels:\n      app.kubernetes.io/name: petclinic\n      app.kubernetes.io/component: webapp\n      app.kubernetes.io/part-of: petclinic\n  spec:\n    to:\n      kind: Service\n      name: petclinic\n    port:\n      targetPort: web\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/command/devfile_action_without_commandline_and_reference.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n - alias: theia\n   type: cheEditor\n   id: eclipse/chetheia/0.0.3\ncommands:\n  - name: build\n    actions:\n      - type: vscode-task\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/command/devfile_command_with_empty_preview_url.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\ncommands:\n  - name: build\n    previewUrl:\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/command/devfile_command_with_preview_url.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\ncommands:\n  - name: build\n    previewUrl:\n      port: 65535\n      path: hello-world\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/command/devfile_command_with_preview_url_only_path.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\ncommands:\n  - name: build\n    previewUrl:\n      path: hello-world\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/command/devfile_command_with_preview_url_only_port.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\ncommands:\n  - name: build\n    previewUrl:\n      port: 8080\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/command/devfile_command_with_preview_url_port_is_negative.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\ncommands:\n  - name: build\n    previewUrl:\n      port: -1\n      path: hello-world\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/command/devfile_command_with_preview_url_port_is_string.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\ncommands:\n  - name: build\n    previewUrl:\n      port: abc\n      path: hello-world\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/command/devfile_command_with_preview_url_port_is_too_high.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\ncommands:\n  - name: build\n    previewUrl:\n      port: 123456\n      path: hello-world\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/command/devfile_missing_command_actions.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n - alias: theia\n   type: cheEditor\n   id: eclipse/chetheia/0.0.3\ncommands:\n  - name: build\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/command/devfile_missing_command_name.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n - alias: theia\n   type: cheEditor\n   id: eclipse/chetheia/0.0.3\ncommands:\n  - actions:\n      - type: exec\n        component: mvn-stack\n        command: mvn package\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/command/devfile_multiple_commands_actions.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\ncommands:\n  - name: build\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n      - type: exec\n        component: mysql\n        command: mvn package\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/component/devfile_component_with_automount_secrets.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: chePlugin\n    alias: maven\n    id: eclipse/chemaven-jdk8/1.0.0\n    automountWorkspaceSecrets: false\n  - type: dockerimage\n    alias: maven2\n    image: eclipse/chemaven-jdk8/1.0.0\n    automountWorkspaceSecrets: true\n    memoryLimit: 256Mi\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/component/devfile_component_with_undeclared_field.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: chePlugin\n    alias: maven\n    id: eclipse/chemaven-jdk8/1.0.0\n    unknown: blah-blah\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/component/devfile_missing_component_type.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: maven\n    id: eclipse/chemaven-jdk8/1.0.0\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/component/devfile_unknown_component_type.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: maven\n    id: org.eclipse.chemaven-jdk8:1.0.0\n    type: unknown\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/component/devfile_without_any_component.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\nprojects:\n  - name: petclinic\n    source:\n      type: git\n      location: 'git@github.com:spring-projects/spring-petclinic.git'\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_empty_metadata.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata: {}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_just_generatename.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  generateName: test-\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_missing_api_version.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\nmetadata:\n  name: petclinic-dev-environment\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_missing_metadata.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_missing_name_and_generatename.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  something: else\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_name_and_generatename.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: testName\n  generateName: testGenerateName-\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_null_metadata.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2-1-0_just_schemaVersion.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\nschemaVersion: 2.1.0\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2-1-0_simple-devfile.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nschemaVersion: 2.1.0\nmetadata:\n  name: spring-petclinic\nattributes:\n  example: foo\ncomponents:\n  - name: maven\n    container:\n      image: quay.io/eclipse/che-java8-maven:nightly\n      volumeMounts:\n        - name: mavenrepo\n          path: /root/.m2\n      env:\n        - name: ENV_VAR\n          value: value\n      memoryLimit: 1536M\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2-1-0_unsupported_schemaVersion.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\nschemaVersion: 2.1.0-beta\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2-1-0_with_invalid_plugin_definition.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nschemaVersion: 2.1.0\nmetadata:\n  name: test-project\n  attributes:\n    type: workspace\nprojects:\n  - name: test-project\n    git:\n      remotes:\n        origin: https://github.com/Test/Project\ncomponents:\n  - plugin:\n      name: java language server\n      id: redhat/java11/0.57.0\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2-2-0-basic-nodejs.yaml",
    "content": "#\n# Copyright (c) 2012-2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nschemaVersion: 2.2.0\nmetadata:\n  name: nodejs\n  version: 1.0.1\n  displayName: Node.js Runtime\n  description: Stack with Node.js 14\n  tags: [\"NodeJS\", \"Express\", \"ubi8\"]\n  projectType: \"nodejs\"\n  language: \"nodejs\"\n  attributes:\n    alpha.dockerimage-port: 3001\n  provider: Red Hat\n  supportUrl: https://github.com/devfile-samples/devfile-support#support-information\nparent:\n  id: nodejs\n  registryUrl: \"https://registry.devfile.io\"\ncomponents:\n  - name: outerloop-build\n    image:\n      imageName: nodejs-image:latest\n      dockerfile:\n        uri: Dockerfile\n        buildContext: .\n        rootRequired: false\n  - name: outerloop-deploy\n    kubernetes:\n      uri: outerloop-deploy.yaml\ncommands:\n  - id: build-image\n    apply:\n      component: outerloop-build\n  - id: deployk8s\n    apply:\n      component: outerloop-deploy\n  - id: deploy\n    composite:\n      commands:\n        - build-image\n        - deployk8s\n      group:\n        kind: deploy\n        isDefault: true\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2-2-0-basic-python.yaml",
    "content": "#\n# Copyright (c) 2012-2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nschemaVersion: 2.2.0\nmetadata:\n  name: python\n  version: 1.0.0\n  provider: Red Hat\n  supportUrl: https://github.com/devfile-samples/devfile-support#support-information\n  attributes:\n    alpha.dockerimage-port: 8081\nparent:\n  id: python\n  registryUrl: \"https://registry.devfile.io\"\ncomponents:\n  - name: outerloop-build\n    image:\n      imageName: python-image:latest\n      dockerfile:\n        uri: docker/Dockerfile\n        buildContext: .\n        rootRequired: false\n  - name: outerloop-deploy\n    kubernetes:\n      uri: outerloop-deploy.yaml\ncommands:\n  - id: build-image\n    apply:\n      component: outerloop-build\n  - id: deployk8s\n    apply:\n      component: outerloop-deploy\n  - id: deploy\n    composite:\n      commands:\n        - build-image\n        - deployk8s\n      group:\n        kind: deploy\n        isDefault: true\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2-2-0-basic-quarkus.yaml",
    "content": "#\n# Copyright (c) 2012-2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nschemaVersion: 2.2.0\nmetadata:\n  name: java-quarkus\n  version: 1.1.0\n  provider: Red Hat\n  supportUrl: https://github.com/devfile-samples/devfile-support#support-information\n  website: https://quarkus.io\n  displayName: Quarkus Java\n  description: Upstream Quarkus with Java+GraalVM\n  tags: [\"Java\", \"Quarkus\"]\n  projectType: \"quarkus\"\n  language: \"java\"\n  attributes:\n    alpha.dockerimage-port: 8081\nparent:\n  id: java-quarkus\n  registryUrl: \"https://registry.devfile.io\"\ncomponents:\n  - name: outerloop-build\n    image:\n      imageName: java-quarkus-image:latest\n      dockerfile:\n        uri: src/main/docker/Dockerfile.jvm.staged\n        buildContext: .\n        rootRequired: false\n  - name: outerloop-deploy\n    kubernetes:\n      uri: outerloop-deploy.yaml\ncommands:\n  - id: build-image\n    apply:\n      component: outerloop-build\n  - id: deployk8s\n    apply:\n      component: outerloop-deploy\n  - id: deploy\n    composite:\n      commands:\n        - build-image\n        - deployk8s\n      group:\n        kind: deploy\n        isDefault: true\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2-2-0-basic-springboot.yaml",
    "content": "#\n# Copyright (c) 2012-2023 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nschemaVersion: 2.2.0\nmetadata:\n  name: java-springboot\n  version: 1.1.0\n  attributes:\n    alpha.dockerimage-port: 8081\n  displayName: Java Spring Boot\n  description: Java Spring Boot using Maven\n  tags: [\"Java\", \"Spring\"]\n  projectType: \"springboot\"\n  language: \"java\"\n  provider: Red Hat\n  supportUrl: https://github.com/devfile-samples/devfile-support#support-information\nparent:\n  id: java-springboot\n  registryUrl: \"https://registry.devfile.io\"\ncomponents:\n  - name: outerloop-build\n    image:\n      imageName: java-springboot-image:latest\n      dockerfile:\n        uri: docker/Dockerfile\n        buildContext: .\n        rootRequired: false\n  - name: outerloop-deploy\n    kubernetes:\n      uri: outerloop-deploy.yaml\ncommands:\n  - id: build-image\n    apply:\n      component: outerloop-build\n  - id: deployk8s\n    apply:\n      component: outerloop-deploy\n  - id: deploy\n    composite:\n      commands:\n        - build-image\n        - deployk8s\n      group:\n        kind: deploy\n        isDefault: true\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2-2-0-quarkus.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nschemaVersion: 2.2.0\nmetadata:\n  name: java-quarkus\n  version: 1.1.0\n  provider: Red Hat\n  supportUrl: https://github.com/devfile-samples/devfile-support#support-information\n  website: https://quarkus.io\n  displayName: Quarkus Java\n  description: Upstream Quarkus with Java+GraalVM\n  tags: [\"Java\", \"Quarkus\"]\n  projectType: \"quarkus\"\n  language: \"java\"\n  attributes:\n    alpha.dockerimage-port: 8081\nstarterProjects:\n  - name: community\n    zip:\n      location: https://code.quarkus.io/d?e=io.quarkus%3Aquarkus-resteasy&e=io.quarkus%3Aquarkus-micrometer&e=io.quarkus%3Aquarkus-smallrye-health&e=io.quarkus%3Aquarkus-openshift&cn=devfile\n  - name: redhat-product\n    zip:\n      location: https://code.quarkus.redhat.com/d?e=io.quarkus%3Aquarkus-resteasy&e=io.quarkus%3Aquarkus-smallrye-health&e=io.quarkus%3Aquarkus-openshift\ncomponents:\n  - name: outerloop-build\n    image:\n      imageName: java-quarkus-image:latest\n      dockerfile:\n        uri: src/main/docker/Dockerfile.jvm.staged\n        buildContext: .\n        rootRequired: false\n  - name: outerloop-deploy\n    kubernetes:\n      uri: outerloop-deploy.yaml\n  - name: tools\n    container:\n      image: quay.io/eclipse/che-quarkus:7.36.0\n      memoryLimit: 1512Mi\n      mountSources: true\n      volumeMounts:\n        - name: m2\n          path: /home/user/.m2\n      endpoints:\n        - name: '8080-http'\n          targetPort: 8080\n  - name: m2\n    volume:\n      size: 3Gi\ncommands:\n  - id: init-compile\n    exec:\n      component: tools\n      commandLine: \"mvn -Dmaven.repo.local=/home/user/.m2/repository compile\"\n      workingDir: $PROJECTS_ROOT\n  - id: dev-run\n    exec:\n      component: tools\n      commandLine: \"mvn -Dmaven.repo.local=/home/user/.m2/repository quarkus:dev -Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager\"\n      hotReloadCapable: true\n      group:\n        kind: run\n        isDefault: true\n      workingDir: $PROJECTS_ROOT\n  - id: dev-debug\n    exec:\n      component: tools\n      commandLine: \"mvn -Dmaven.repo.local=/home/user/.m2/repository quarkus:dev -Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager -Ddebug=${DEBUG_PORT}\"\n      hotReloadCapable: true\n      group:\n        kind: debug\n        isDefault: true\n      workingDir: $PROJECTS_ROOT\n  - id: build-image\n    apply:\n      component: outerloop-build\n  - id: deployk8s\n    apply:\n      component: outerloop-deploy\n  - id: deploy\n    composite:\n      commands:\n        - build-image\n        - deployk8s\n      group:\n        kind: deploy\n        isDefault: true\nevents:\n  postStart:\n    - init-compile\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2-2-0-simple-devfile.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nschemaVersion: 2.2.0\nmetadata:\n  name: spring-petclinic\nattributes:\n  example: foo\ncomponents:\n  - name: maven\n    container:\n      image: quay.io/eclipse/che-java8-maven:nightly\n      volumeMounts:\n        - name: mavenrepo\n          path: /root/.m2\n      env:\n        - name: ENV_VAR\n          value: value\n      memoryLimit: 1536M\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2_invalid_schemaVersion.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\nschemaVersion: a.b.c\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2_just_schemaVersion.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\nschemaVersion: 2.0.0\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2_sample-devfile.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nschemaVersion: \"2.0.0\"\nmetadata:\n  name: \"devfile example\"\n  version: \"1.0.0\"\nprojects:\n  - name: \"my-project\"\n    git:\n      remotes:\n        origin: \"https://github.com/devfile/api\"\n      checkoutFrom:\n        revision: \"master\"\n        remote: origin\ncomponents:\n  - name: editor\n    attributes:\n      kjkh: \"128M\"\n      kjhkjh:\n        \"\": \"\"\n    plugin:\n      id: eclipse/che-theia/latest\n  - name: \"ownplugin\"\n    plugin:\n      id: acme/newPlugin/latest\n      registryUrl: \"https://acme.com/registry/\"\n  - name: \"myplugin\"\n    plugin:\n      uri: \"https://github.com/johndoe/che-plugins/blob/master/cool-plugin/0.0.1/meta.yaml\"\n  - name: \"mycontainer\"\n    container:\n      image: \"busybox\"\n      memoryLimit: \"128M\"\n      mountSources: true\n      endpoints:\n        - name: term-websockets\n          exposure: public\n          protocol: ws\n          attributes:\n            type: terminal\n          targetPort: 4000\n  - name: \"production\"\n    kubernetes:\n      uri: \"https://somewhere/production-environment.yaml\"\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2_simple-devfile.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nschemaVersion: \"2.0.0\"\nmetadata:\n  name: \"myDevfile\"\n  version: \"0.0.1\"\nprojects:\n  - name: \"devworkspace-spec\"\n    git:\n      remotes:\n        origin: \"https://github.com/devfile/api\"\ncommands:\n  - id: buildschema\n    exec:\n      label: Build the schema\n      commandLine: \"./buildSchema.sh\"\n      component: build-tools\n      group:\n        kind: build\n        isDefault: true\n  - id: opendevfile\n    vscodeTask:\n      inlined:\n        json        \n  - id: build-schema-and-open-devfile\n    composite:\n      label: Build schema and open devfile\n      commands:\n        - buildschema\n        - opendevfile\n      parallel: false\n  - id: helloworld\n    exec:\n      env:\n        - name: \"USER\"\n          value: \"John Doe\"\n      commandLine: 'echo \"Hello ${USER}\"'\n      component: build-tools\nevents:\n  postStart:\n    - \"build-schema-and-open-devfile\"\ncomponents:\n  - name: yaml-support\n    plugin:\n      id: redhat/vscode-yaml/latest\n  - name: go-support\n    plugin:\n      id: ms-vscode/go/latest\n  - name: editor\n    plugin:\n      id: eclipse/che-theia/latest\n      registryUrl: \"external-registry-url\"\n  - name: \"build-tools\"\n    container:\n      image: some container image with required build tools\n      mountSources: true\n      sourceMapping: /home/src\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2_spring-boot-http-booster-devfile.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\nschemaVersion: 2.0.0\nmetadata:\n  name: spring-boot-http-booster\n  attributes:\n    type: workspace\nprojects:\n  - name: spring-boot-http-booster\n    git:\n      remotes:\n        origin: https://github.com/snowdrop/spring-boot-http-booster\n      checkoutFrom:\n        revision: master\ncomponents:\n  - name: java-support\n    plugin:\n      id: redhat/java8/latest\n      components:\n        - name: vscode-java            \n          container:\n            memoryLimit: 2Gi\n        - name: m2\n          volume:\n            size: 2G\n  - name: dependency-analytics\n    plugin:\n      id: redhat/dependency-analytics/latest\n  - name: maven-tooling\n    container:\n      image: registry.redhat.io/codeready-workspaces/stacks-java-rhel8:2.1\n      mountSources: true\n      memoryLimit: 768Mi\n      env:\n        - name: JAVA_OPTS\n          value: >-\n            -XX:MaxRAMPercentage=50.0 -XX:+UseParallelGC -XX:MinHeapFreeRatio=10\n            -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4\n            -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true\n            -Xms20m -Djava.security.egd=file:/dev/./urandom -Duser.home=/home/jboss\n        - name: MAVEN_OPTS\n          value: $(JAVA_OPTS)\n      endpoints:\n        - name: tcp-8080\n          targetPort: 8080\n          exposure: public\n      volumeMounts:\n        - name: m2\n          path: /home/jboss/.m2\ncommands:\n  - id: build \n    exec:\n      component: maven\n      commandLine: mvn -Duser.home=${HOME} -DskipTests clean install\n      workingDir: '${PROJECTS_ROOT}/spring-boot-http-booster'\n      env:\n        - name: MAVEN_OPTS\n          value: \"-Xmx200m\"\n  - id: debug-remote-java-application\n    vscodeLaunch:\n      inlined: |\n        {\n          \"version\": \"0.2.0\",\n          \"configurations\": [\n            {\n              \"type\": \"java\",\n              \"name\": \"Debug (Attach) - Remote\",\n              \"request\": \"attach\",\n              \"hostName\": \"localhost\",\n              \"port\": 8000\n            }]\n          }\n  - id: run\n    exec:\n      component: maven\n      commandLine: 'mvn -Duser.home=${HOME} spring-boot:run'\n      workingDir: '${PROJECTS_ROOT}/spring-boot-http-booster'\n      env:\n        - name: MAVEN_OPTS\n          value: \"-Xmx200m\"\n  - id: debug\n    exec:\n      component: maven\n      commandLine: >-\n        mvn  -Duser.home=${HOME} spring-boot:run -Drun.jvmArguments=\"-Xdebug\n        -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000\"\n      workingDir: '${PROJECTS_ROOT}/spring-boot-http-booster'\n  - id: test\n    exec:\n      component: maven\n      commandLine: 'mvn -Duser.home=${HOME} verify'\n      workingDir: '${PROJECTS_ROOT}/spring-boot-http-booster'\n      env:\n        - name: MAVEN_OPTS\n          value: \"-Xmx200m\"\n  - id: dependency-analysis\n    exec:\n      component: maven\n      workingDir: '${PROJECTS_ROOT}/spring-boot-http-booster'\n      commandLine: >-\n        ${HOME}/stack-analysis.sh -f\n        ${PROJECTS_ROOT}/spring-boot-http-booster/pom.xml -p\n        ${PROJECTS_ROOT}/spring-boot-http-booster\n  - id: deploy-to-openshift \n    exec:\n      component: maven\n      commandLine: 'mvn fabric8:deploy -Popenshift -DskipTests'\n      workingDir: '${PROJECTS_ROOT}/spring-boot-http-booster'\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_v2_unsupported_schemaVersion.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\nschemaVersion: 22.33.44\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_with_sparse_checkout_dir.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: spring-integration-samples\n  generateName: spring-integration-samples-\nprojects:\n  - name: spring-integration-samples\n    source:\n      type: git\n      location: 'https://github.com/spring-projects/spring-integration-samples.git'\n      branch: master\n      sparseCheckoutDir: basic/http/\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/devfile/devfile_with_undeclared_field.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\nunknown: blah-blah\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/dockerimage_component/devfile_dockerimage_component.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: dockerimage\n    image: eclipe/maven-jdk8:latest\n    volumes:\n      - name: maven-repo\n        containerPath: /root/.m2\n    env:\n      - name: ENV_VAR\n        value: value\n    endpoints:\n      - name: maven-server\n        port: 3101\n        attributes:\n          protocol: http\n          secure: 'true'\n          public: 'true'\n          discoverable: 'false'\n    memoryLimit: 1536M\n    memoryRequest: 512M\n    cpuLimit: 1.5\n    cpuRequest: 750m\n    command: ['/bin/sh']\n    args: ['-c', 'echo', 'hi']\n    mountSources: true\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/dockerimage_component/devfile_dockerimage_component_with_indistinctive_field_selector.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: dockerimage\n    image: eclipe/maven-jdk8:latest\n    volumes:\n      - name: maven-repo\n        containerPath: /root/.m2\n    env:\n      - name: ENV_VAR\n        value: value\n    endpoints:\n      - name: maven-server\n        port: 3101\n        attributes:\n          protocol: http\n          secure: 'true'\n          public: 'true'\n          discoverable: 'false'\n    memoryLimit: 1536M\n    selector:\n      app.kubernetes.io/name: mysql\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/dockerimage_component/devfile_dockerimage_component_with_invalid_memory_limit.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\napiVersion: 1.0.0\nmetadata:\n  name: terminal-sample\ncomponents:\n  - type: dockerimage\n    memoryLimit: 0\n    image: eclipe/maven-jdk8:latest\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/dockerimage_component/devfile_dockerimage_component_with_missing_image.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: dockerimage\n    memoryLimit: 1G\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/dockerimage_component/devfile_dockerimage_component_with_missing_memory_limit.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: dockerimage\n    image: org.eclipse.cheubuntu-jdk:latest\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/dockerimage_component/devfile_dockerimage_component_without_entry_point.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: dockerimage\n    image: eclipe/maven-jdk8:latest\n    volumes:\n      - name: maven-repo\n        containerPath: /root/.m2\n    env:\n      - name: ENV_VAR\n        value: value\n    endpoints:\n      - name: maven-server\n        port: 3101\n        attributes:\n          protocol: http\n          secure: 'true'\n          public: 'true'\n          discoverable: 'false'\n    memoryLimit: 1536M\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_editor_component_with_bad_registry.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: cheEditor\n    id: eclipse/theia/dev\n    registryUrl: ftp://foo/bar\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_editor_component_with_custom_registry.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\napiVersion: 1.0.0\nmetadata:\n  name: terminal-sample\ncomponents:\n  - type: cheEditor\n    registryUrl: https://che-plugin-registry.openshift.io/v3/\n    id: eclipse/theia-ide/0.0.1\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_editor_component_with_id_and_reference.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\napiVersion: 1.0.0\nmetadata:\n  name: terminal-sample\ncomponents:\n  - type: cheEditor\n    reference: https://gist.githubusercontent.com/sleshchenko/e132bd9d37e8cf8f2c0a2b4929ecda3e/raw/9c28962cc3a24dcaf357b5716d98068734f51165/meta.yaml\n    id: eclipse/che-theia/1.0.0\n\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_editor_component_with_indistinctive_field.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: cheEditor\n    id: eclipse/theia/0.0.3\n    unknown: petclinic.yaml\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_editor_component_with_missing_id.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: cheEditor\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_editor_component_with_multiple_colons_in_id.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: cheEditor\n    id: eclipse/theia/dev:v1\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_editor_component_with_registry_in_id.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: cheEditor\n    id: https://myregistry.com/eclipse/theia/dev:v1\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_editor_component_without_version.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: cheEditor\n    id: eclipse/theia\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_editor_plugins.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\nprojects:\n  - name: petclinic\n    source:\n      type: git\n      location: 'git@github.com:spring-projects/spring-petclinic.git'\ncomponents:\n  - type: cheEditor\n    id: eclipse/chetheia/0.0.3\n    env:\n      - name: ENV_VAR\n        value: value\n    volumes:\n      - name: maven-repo\n        containerPath: /root/.m2\n    endpoints:\n      - name: editor-endpoint\n        port: 8088\n        attributes:\n          discoverable: 'true'\n          public: 'false'\n          secure: 'true'\n  - alias: mvn-stack\n    type: chePlugin\n    id: eclipse/chemaven-jdk8/1.0.0\n  - type: chePlugin\n    id: eclipse/chetheia-jdtls/0.0.3\n    env:\n      - name: ENV_VAR\n        value: value\n    volumes:\n      - name: maven-repo\n        containerPath: /root/.m2\n    endpoints:\n      - name: plugin-endpoint\n        port: 8080\n        attributes:\n          discoverable: 'true'\n          public: 'false'\n          secure: 'true'\ncommands:\n  - name: build\n    actions:\n      - type: exec\n        component: mvn-stack\n        command: mvn package\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_editor_plugins_components_with_invalid_memory_limit.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\napiVersion: 1.0.0\nmetadata:\n  name: terminal-sample\ncomponents:\n  - type: cheEditor\n    id: publisher/terminal-sample/0.0.1\n    memoryLimit: 0\n  - type: chePlugin\n    id: publisher/terminal-sample/0.0.1\n    memoryLimit: 0\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_editor_plugins_components_with_resource_limits.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\napiVersion: 1.0.0\nmetadata:\n  name: terminal-sample\ncomponents:\n  - type: chePlugin\n    id: check/terminal-sample/0.0.1\n    memoryLimit: 256\n    memoryRequest: 123Mi\n    cpuLimit: 2\n    cpuRequest: 127m\n  - type: chePlugin\n    id: eclipse/chemaven-jdk8/1.0.0\n    memoryLimit: 108M\n    memoryRequest: 26Mi\n    cpuLimit: 1500m\n    cpuRequest: 100m\n  - alias: theia\n    type: cheEditor\n    id: eclipse/theia/0.0.3\n    memoryLimit: 1048M\n    memoryRequest: 256M\n    cpuLimit: 1500m\n    cpuRequest: 100m\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_plugin_component_with_reference.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\napiVersion: 1.0.0\nmetadata:\n  name: terminal-sample\ncomponents:\n  - type: chePlugin\n    reference: https://raw.githubusercontent.com/eclipse/che-plugin-registry/myplugin/meta.yaml\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/editor_plugin_component/devfile_plugin_components_with_preferences.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\napiVersion: 1.0.0\nmetadata:\n  name: terminal-sample\ncomponents:\n  - type: chePlugin\n    id: check/terminal-sample/0.0.1\n    preferences:\n      java.home: '/home/user/jdk11'\n      java.jdt.ls.vmargs: '-noverify -Xmx1G -XX:+UseG1GC -XX:+UseStringDeduplication'\n      java.jtg.memory: 12345\n      go.lintFlags: [\"--enable-all\", \"--new\"]\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/kubernetes_openshift_component/devfile_k8s_openshift_component_with_endpoints.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    reference: petclinic.yaml\n    endpoints:\n      - name: test-endpoint-os\n        port: 1234\n        attributes:\n          protocol: http\n          secure: 'true'\n          public: 'true'\n          discoverable: 'false'\n  - alias: web-app\n    type: kubernetes\n    reference: petclinic.yaml\n    endpoints:\n      - name: test-endpoint-k8s\n        port: 4321\n        attributes:\n          protocol: http\n          secure: 'true'\n          public: 'true'\n          discoverable: 'false'\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/kubernetes_openshift_component/devfile_k8s_openshift_component_with_env.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    reference: petclinic.yaml\n    env:\n      - name: TEST_ENV\n        value: any\n  - alias: web-app\n    type: kubernetes\n    reference: petclinic.yaml\n    env:\n      - name: TEST_ENV\n        value: any\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/kubernetes_openshift_component/devfile_kubernetes_component.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: kubernetes\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n    mountSources: true\n    volumes:\n          - name: maven-repo\n            containerPath: /root/.m2\ncommands:\n  - name: build\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/kubernetes_openshift_component/devfile_kubernetes_component_absolute_reference.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: kubernetes\n    reference: https://github.com/redhat-developer/devfile/blob/master/samples/web-nodejs-with-db-sample/mongo-db.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\ncommands:\n  - name: build\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/kubernetes_openshift_component/devfile_kubernetes_component_content_without_reference.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: kubernetes\n    referenceContent: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\ncommands:\n  - name: build\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/kubernetes_openshift_component/devfile_kubernetes_component_reference_and_content_as_block.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: kubernetes\n    reference: petclinic.yaml\n    referenceContent: |\n      kind: List\n      items:\n       -\n        apiVersion: v1\n        kind: Pod\n        metadata:\n         name: ws\n        spec:\n         containers:\n          -\n           image: 'quay.io/eclipse/che-dev:nightly'\n           name: dev\n           resources:\n            limits:\n             memory: 512Mi\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/kubernetes_openshift_component/devfile_openshift_component.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n    mountSources: true\n    volumes:\n      - name: maven-repo\n        containerPath: /root/.m2\ncommands:\n  - name: build\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/kubernetes_openshift_component/devfile_openshift_component_content_without_reference.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    referenceContent: this is content of file that is supposed to be in local field but it is missing\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\ncommands:\n  - name: build\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/kubernetes_openshift_component/devfile_openshift_component_reference_and_content.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: openshift\n    referenceContent: it is supposed to be a content of the file specified in the local field\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/kubernetes_openshift_component/devfile_openshift_component_reference_and_content_as_block.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: openshift\n    referenceContent: |\n      kind: List\n      items:\n       -\n        apiVersion: v1\n        kind: Pod\n        metadata:\n         name: ws\n        spec:\n         containers:\n          -\n           image: 'quay.io/eclipse/che-dev:nightly'\n           name: dev\n           resources:\n            limits:\n             memory: 512Mi\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/kubernetes_openshift_component/devfile_openshift_component_with_indistinctive_field_id.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - alias: mysql\n    type: openshift\n    reference: petclinic.yaml\n    selector:\n      app.kubernetes.io/name: mysql\n      app.kubernetes.io/component: database\n      app.kubernetes.io/part-of: petclinic\n    id: eclipse/chetheia/0.0.3\ncommands:\n  - name: build\n    actions:\n      - type: exec\n        component: mysql\n        command: mvn clean\n        workdir: /projects/spring-petclinic\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/schema_test/kubernetes_openshift_component/devfile_openshift_component_with_missing_reference_and_referenceContent.yaml",
    "content": "#\n# Copyright (c) 2012-2021 Red Hat, Inc.\n# This program and the accompanying materials are made\n# available under the terms of the Eclipse Public License 2.0\n# which is available at https://www.eclipse.org/legal/epl-2.0/\n#\n# SPDX-License-Identifier: EPL-2.0\n#\n# Contributors:\n#   Red Hat, Inc. - initial API and implementation\n#\n\n---\napiVersion: 1.0.0\nmetadata:\n  name: petclinic-dev-environment\ncomponents:\n  - type: openshift\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/url_fetcher_test_resource.json",
    "content": "Hello\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/devfile/workspace_config.json",
    "content": "{\n  \"projects\": [\n    {\n      \"source\": {\n        \"location\": \"git@github.com:spring-projects/spring-petclinic.git\",\n        \"type\": \"git\",\n        \"parameters\": {}\n      },\n      \"mixins\": [],\n      \"name\": \"petclinic\",\n      \"path\": \"/petclinic\",\n      \"attributes\": {}\n    }\n  ],\n  \"commands\": [\n    {\n      \"commandLine\": \"mvn package\",\n      \"name\": \"build\",\n      \"type\": \"exec\",\n      \"attributes\": {\n        \"plugin\": \"eclipse/chemaven-jdk8/1.0.0\",\n        \"workingDir\": \"/projects/spring-petclinic\"\n      }\n    },\n    {\n      \"commandLine\": \"mvn spring-boot:run\",\n      \"name\": \"run\",\n      \"type\": \"exec\",\n      \"attributes\": {\n        \"plugin\": \"eclipse/chemaven-jdk8/1.0.0\",\n        \"runType\": \"sequential\",\n        \"workingDir\": \"/projects/spring-petclinic\"\n      }\n    },\n    {\n      \"commandLine\": \"run.sh\",\n      \"name\": \"other\",\n      \"type\": \"exec\",\n      \"attributes\": {\n        \"plugin\": \"eclipse/chetheia-jdtls/0.0.3\"\n      }\n    }\n  ],\n  \"defaultEnv\": \"os-recipe\",\n  \"environments\": {\n    \"os-recipe\": {\n      \"machines\": {},\n      \"recipe\": {\n        \"contentType\": \"application/x-yaml\",\n        \"type\": \"openshift\",\n        \"content\": \"---\\napiVersion: \\\"v1\\\"\\nkind: \\\"List\\\"\\nitems:\\n- apiVersion: \\\"v1\\\"\\n  kind: \\\"Service\\\"\\n  metadata:\\n    labels:\\n      app.kubernetes.io/name: \\\"mysql\\\"\\n      app.kubernetes.io/component: \\\"database\\\"\\n      app.kubernetes.io/part-of: \\\"petclinic\\\"\\n    name: \\\"mysql\\\"\\n  spec:\\n    ports:\\n    - name: \\\"mysql\\\"\\n      port: 3306\\n      targetPort: 3360\\n    selector:\\n      app.kubernetes.io/name: \\\"mysql\\\"\\n      app.kubernetes.io/component: \\\"database\\\"\\n      app.kubernetes.io/part-of: \\\"petclinic\\\"\\n- apiVersion: \\\"v1\\\"\\n  kind: \\\"Pod\\\"\\n  metadata:\\n    labels:\\n      app.kubernetes.io/name: \\\"mysql\\\"\\n      app.kubernetes.io/component: \\\"database\\\"\\n      app.kubernetes.io/part-of: \\\"petclinic\\\"\\n    name: \\\"petclinic\\\"\\n  spec:\\n    containers:\\n    - env:\\n      - name: \\\"MYSQL_USER\\\"\\n        value: \\\"petclinic\\\"\\n      - name: \\\"MYSQL_PASSWORD\\\"\\n        value: \\\"petclinic\\\"\\n      - name: \\\"MYSQL_ROOT_PASSWORD\\\"\\n        value: \\\"petclinic\\\"\\n      - name: \\\"MYSQL_DATABASE\\\"\\n        value: \\\"petclinic\\\"\\n      image: \\\"centos/mysql-57-centos7\\\"\\n      name: \\\"mysql\\\"\\n      ports:\\n      - containerPort: 3306\\n        protocol: \\\"TCP\\\"\\n      resources:\\n        limits:\\n          memory: \\\"512Mi\\\"\\n\"\n      }\n    }\n  },\n  \"name\": \"petclinic-dev-environment\",\n  \"attributes\": {\n    \"pluginComponentsAliases\": \"eclipse/chemaven-jdk8/1.0.0=mvn-stack,eclipse/chetheia/0.0.3=theia-ide,eclipse/chetheia-jdtls/0.0.3=jdt.ls\",\n    \"editor\": \"eclipse/chetheia/0.0.3\",\n    \"plugins\": \"eclipse/chemaven-jdk8/1.0.0,eclipse/chetheia-jdtls/0.0.3\"\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/invalid-json.json",
    "content": "invalid json file/\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/invalid-recipes.json",
    "content": "invalid json file/\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/logback-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2018 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<configuration>\n\n    <appender name=\"stdout\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <appender name=\"file\" class=\"ch.qos.logback.core.FileAppender\">\n        <File>target/log/codenvy.log</File>\n        <encoder>\n            <pattern>%-41(%date[%.15thread]) %-45([%-5level] [%.30logger{30} %L]) - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <!--logger name=\"com.codenvy.factory\" level=\"DEBUG\"/-->\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"stdout\"/>\n        <appender-ref ref=\"file\"/>\n    </root>\n\n</configuration>\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/recipes.json",
    "content": "[\n  {\n    \"creator\": \"creator\",\n    \"tags\": [\n      \"azz\"\n    ],\n    \"description\": \"description\",\n    \"name\": \"name\",\n    \"id\": \"Hello\",\n    \"type\": \"type\",\n    \"script\": \"script\"\n  },\n  {\n    \"creator\": \"creator\",\n    \"tags\": [\n      \"azz\"\n    ],\n    \"description\": \"description\",\n    \"name\": \"name\",\n    \"id\": \"Hello\",\n    \"type\": \"type\",\n    \"script\": \"script\"\n  }\n]"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/ws_conf_machine_source_dockerfile_content.json",
    "content": "{\n  \"name\": \"default\",\n  \"defaultEnv\": \"dev-env\",\n  \"description\": \"This is workspace description\",\n  \"environments\": [\n    {\n      \"name\": \"dev-env\",\n      \"machineConfigs\": [\n        {\n          \"type\": \"docker\",\n          \"name\": \"site\",\n          \"dev\": true,\n          \"limits\": {\n            \"ram\": 1024\n          },\n          \"source\": {\n            \"type\": \"dockerfile\",\n            \"content\": \"FROM codenvy/ubuntu_jdk8\"\n          }\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/ws_conf_machine_source_dockerfile_location.json",
    "content": "{\n  \"name\": \"default\",\n  \"defaultEnv\": \"dev-env\",\n  \"description\": \"This is workspace description\",\n  \"environments\": [\n    {\n      \"name\": \"dev-env\",\n      \"machineConfigs\": [\n        {\n          \"name\": \"dev\",\n          \"type\": \"docker\",\n          \"dev\": true,\n          \"limits\": {\n            \"ram\": 2048\n          },\n          \"source\": {\n            \"location\": \"https://somewhere/Dockerfile\",\n            \"type\": \"dockerfile\"\n          },\n          \"servers\": [\n            {\n              \"ref\": \"ref\",\n              \"port\": \"9090/udp\",\n              \"protocol\": \"protocol\",\n              \"path\": \"/any/path\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace/src/test/resources/ws_conf_machine_source_dockerimage.json",
    "content": "{\n  \"name\": \"default\",\n  \"defaultEnv\": \"dev-env\",\n  \"description\": \"This is workspace description\",\n  \"environments\": [\n    {\n      \"name\": \"dev-env\",\n      \"machineConfigs\": [\n        {\n          \"type\": \"docker\",\n          \"name\": \"site\",\n          \"dev\": true,\n          \"limits\": {\n            \"ram\": 1024\n          },\n          \"source\": {\n            \"type\": \"image\",\n            \"location\": \"codenvy/ubuntu_jdk8\"\n          }\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-api-workspace-shared</artifactId>\n    <packaging>jar</packaging>\n    <name>Che Core :: API :: Workspace :: Shared</name>\n    <properties>\n        <dto-generator-out-directory>${project.build.directory}/generated-sources/dto/</dto-generator-out-directory>\n        <findbugs.failonerror>false</findbugs.failonerror>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>io.swagger.core.v3</groupId>\n            <artifactId>swagger-annotations-jakarta</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-dto</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-api-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.che.core</groupId>\n            <artifactId>che-core-commons-annotations</artifactId>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.eclipse.che.core</groupId>\n                <artifactId>che-core-api-dto-maven-plugin</artifactId>\n                <version>${project.version}</version>\n                <executions>\n                    <execution>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>generate</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.eclipse.che.core</groupId>\n                        <artifactId>che-core-api-workspace-shared</artifactId>\n                        <version>${project.version}</version>\n                    </dependency>\n                </dependencies>\n                <configuration>\n                    <dtoPackages>\n                        <package>org.eclipse.che.api.workspace.shared.dto</package>\n                    </dtoPackages>\n                    <outputDirectory>${dto-generator-out-directory}</outputDirectory>\n                    <genClassName>org.eclipse.che.api.workspace.server.dto.DtoServerImpls</genClassName>\n                    <impl>server</impl>\n                </configuration>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>pre-compile</id>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>compile</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>add-resource</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-resource</goal>\n                        </goals>\n                        <configuration>\n                            <resources>\n                                <resource>\n                                    <directory>${dto-generator-out-directory}/META-INF</directory>\n                                    <targetPath>META-INF</targetPath>\n                                </resource>\n                            </resources>\n                        </configuration>\n                    </execution>\n                    <execution>\n                        <id>add-source</id>\n                        <phase>process-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${dto-generator-out-directory}</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/Constants.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared;\n\nimport org.eclipse.che.api.core.model.workspace.Workspace;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceConfig;\nimport org.eclipse.che.api.core.model.workspace.devfile.Devfile;\nimport org.eclipse.che.api.core.model.workspace.runtime.Machine;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\n\n/**\n * Constants for Workspace API\n *\n * @author Yevhenii Voevodin\n */\npublic final class Constants {\n\n  public static final String LINK_REL_IDE_URL = \"ide\";\n  public static final String LINK_REL_SELF = \"self\";\n  public static final String LINK_REL_ENVIRONMENT_OUTPUT_CHANNEL = \"environment/outputChannel\";\n  public static final String LINK_REL_ENVIRONMENT_STATUS_CHANNEL = \"environment/statusChannel\";\n\n  public static final String DEBUG_WORKSPACE_START = \"debug-workspace-start\";\n  public static final String DEBUG_WORKSPACE_START_LOG_LIMIT_BYTES =\n      \"che.workspace.startup_debug_log_limit_bytes\";\n\n  public static final String WORKSPACE_STOPPED_BY = \"stopped_by\";\n  public static final String WORKSPACE_STOP_REASON = \"stop_reason\";\n\n  /**\n   * The configuration property that defines available values for storage types that clients like\n   * Dashboard should propose for users during workspace creation/update.\n   */\n  public static final String CHE_WORKSPACE_STORAGE_AVAILABLE_TYPES =\n      \"che.workspace.storage.available_types\";\n\n  /**\n   * The configuration property that defines a preferred value for storage type that clients like\n   * Dashboard should propose for users during workspace creation/update.\n   */\n  public static final String CHE_WORKSPACE_STORAGE_PREFERRED_TYPE =\n      \"che.workspace.storage.preferred_type\";\n\n  /** Property name for Che plugin registry url. */\n  public static final String CHE_WORKSPACE_PLUGIN_REGISTRY_URL_PROPERTY =\n      \"che.workspace.plugin_registry_url\";\n\n  /** Property name for internal network Che plugin registry url. */\n  public static final String CHE_WORKSPACE_PLUGIN_REGISTRY_INTERNAL_URL_PROPERTY =\n      \"che.workspace.plugin_registry_internal_url\";\n\n  /** Property name for Che Devfile Registry URL. */\n  public static final String CHE_WORKSPACE_DEVFILE_REGISTRY_URL_PROPERTY =\n      \"che.workspace.devfile_registry_url\";\n\n  /** Property name for internal network Che Devfile Registry URL. */\n  public static final String CHE_WORKSPACE_DEVFILE_REGISTRY_INTERNAL_URL_PROPERTY =\n      \"che.workspace.devfile_registry_internal_url\";\n\n  /** Name for property that specifies whether che is deployed with devworkspaces enabled */\n  public static final String CHE_DEVWORKSPACES_ENABLED_PROPERTY = \"che.devworkspaces.enabled\";\n\n  public static final String CHE_FACTORY_DEFAULT_EDITOR_PROPERTY = \"che.factory.default_editor\";\n  public static final String CHE_FACTORY_DEFAULT_PLUGINS_PROPERTY = \"che.factory.default_plugins\";\n\n  /** Name for environment variable of machine name */\n  public static final String CHE_MACHINE_NAME_ENV_VAR = \"CHE_MACHINE_NAME\";\n\n  /**\n   * Describes time when workspace was created. Should be set/read from {@link\n   * Workspace#getAttributes}\n   */\n  public static final String CREATED_ATTRIBUTE_NAME = \"created\";\n\n  /**\n   * Describes time when workspace was last updated or started. Should be set/read from {@link\n   * Workspace#getAttributes}\n   */\n  public static final String UPDATED_ATTRIBUTE_NAME = \"updated\";\n\n  /**\n   * Describes time when workspace was last stopped. Should be set/read from {@link\n   * Workspace#getAttributes}\n   */\n  public static final String STOPPED_ATTRIBUTE_NAME = \"stopped\";\n\n  /**\n   * Indicates that last workspace stop was abnormal. Should be set/read from {@link\n   * Workspace#getAttributes}\n   */\n  public static final String STOPPED_ABNORMALLY_ATTRIBUTE_NAME = \"stoppedAbnormally\";\n\n  /**\n   * Describes latest workspace runtime error message. Should be set/read from {@link\n   * Workspace#getAttributes}\n   */\n  public static final String ERROR_MESSAGE_ATTRIBUTE_NAME = \"errorMessage\";\n\n  /**\n   * Contains an identifier of an editor that should be used in a workspace. Should be set/read from\n   * {@link WorkspaceConfig#getAttributes}.\n   *\n   * <p>Value is plugin id.\n   *\n   * <p>Example of the attribute value: 'eclipse/super-editor/0.0.1'\n   *\n   * <p>This is beta constant that is subject to change or removal.\n   */\n  public static final String WORKSPACE_TOOLING_EDITOR_ATTRIBUTE = \"editor\";\n\n  /**\n   * The attribute allows to configure workspace to be ephemeral with no PVC attached on K8S /\n   * OpenShift infrastructure. Should be set/read from {@link Devfile#getAttributes}.\n   *\n   * <p>Value is expected to be boolean, and if set to 'false' regardless of the PVC strategy,\n   * workspace volumes would be created as `emptyDir`. When a workspace Pod is removed for any\n   * reason, the data in the `emptyDir` volume is deleted forever\n   *\n   * @see <a\n   *     href=\"https://www.eclipse.org/che/docs/kubernetes-admin-guide.html#che-workspaces-storage\">Che\n   *     PVC strategies</a>\n   * @see <a href=\"https://kubernetes.io/docs/concepts/storage/volumes/#emptydir\">emptyDir</a>\n   */\n  public static final String PERSIST_VOLUMES_ATTRIBUTE = \"persistVolumes\";\n\n  /**\n   * This attribute enables or disables merging plugins while provisioning a workspace. When\n   * enabled, the plugin broker will be configured to attempt to merge plugins where possible (when\n   * two or more plugins share the same image and do not have conflicting settings). Should be\n   * set/read from {@link Devfile#getAttributes}.\n   *\n   * <p>Value is expected to be boolean; if it set to true, then the broker will attempt to merge\n   * plugins in the current devfile, otherwise it will not. The behavior when this property is not\n   * present in a devfile is governed by the configuration property {@code\n   * che.workspace.plugin_broker.default_merge_plugins}.\n   */\n  public static final String MERGE_PLUGINS_ATTRIBUTE = \"mergePlugins\";\n\n  /**\n   * The attribute allows to configure workspace with async storage support this configuration. Make\n   * sense only in case org.eclipse.che.api.workspace.shared.Constants#PERSIST_VOLUMES_ATTRIBUTE set\n   * to 'false'.\n   *\n   * <p>Should be set/read from {@link Devfile#getAttributes}.\n   *\n   * <p>Value is expected to be boolean, and if set to 'true' special plugin will be added to\n   * workspace. It will provide ability to backup/restore project source to the async storage.\n   * Workspace volumes still would be created as `emptyDir`. During stopping workspace project\n   * source will be sent to the storage Pod and restore from it on next restarts.\n   */\n  public static final String ASYNC_PERSIST_ATTRIBUTE = \"asyncPersist\";\n\n  /**\n   * Contains a list of workspace tooling plugins that should be used in a workspace. Should be\n   * set/read from {@link Devfile#getAttributes}.\n   *\n   * <p>Value is comma separated list of plugins in a format: '< plugin1ID >,<plugin2ID >'<br>\n   * Spaces around commas are trimmed. <br>\n   *\n   * <p>This is beta constant that is subject to change or removal.\n   *\n   * <p>Example of the attribute value: 'eclipse/plugin1/0.0.1, redhat/plugin2/1.0.0'\n   */\n  public static final String WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE = \"plugins\";\n\n  /**\n   * Describes workspace runtimes which perform start/stop of this workspace. Should be set/read\n   * from {@link Workspace#getAttributes}\n   */\n  public static final String WORKSPACE_RUNTIMES_ID_ATTRIBUTE = \"org.eclipse.che.runtimes_id\";\n\n  public static final String COMMAND_PREVIEW_URL_ATTRIBUTE_NAME = \"previewUrl\";\n  public static final String COMMAND_GOAL_ATTRIBUTE_NAME = \"goal\";\n\n  public static final String WORKSPACE_STATUS_CHANGED_METHOD = \"workspace/statusChanged\";\n  public static final String MACHINE_STATUS_CHANGED_METHOD = \"machine/statusChanged\";\n  public static final String SERVER_STATUS_CHANGED_METHOD = \"server/statusChanged\";\n\n  public static final String RUNTIME_LOG_METHOD = \"runtime/log\";\n\n  /**\n   * JSON RPC methods for listening to machine logs.\n   *\n   * @deprecated use {@link #RUNTIME_LOG_METHOD} instead\n   */\n  @Deprecated public static final String MACHINE_LOG_METHOD = \"machine/log\";\n\n  public static final String INSTALLER_LOG_METHOD = \"installer/log\";\n  public static final String INSTALLER_STATUS_CHANGED_METHOD = \"installer/statusChanged\";\n  public static final String BOOTSTRAPPER_STATUS_CHANGED_METHOD = \"bootstrapper/statusChanged\";\n\n  public static final String SERVER_WS_AGENT_HTTP_REFERENCE = \"wsagent/http\";\n  public static final String SERVER_TERMINAL_REFERENCE = \"terminal\";\n  public static final String SERVER_EXEC_AGENT_HTTP_REFERENCE = \"exec-agent/http\";\n\n  public static final String SUPPORTED_RECIPE_TYPES = \"supportedRecipeTypes\";\n\n  public static final String NO_ENVIRONMENT_RECIPE_TYPE = \"no-environment\";\n\n  /** Attribute of {@link Machine} to mark source of the container. */\n  public static final String CONTAINER_SOURCE_ATTRIBUTE = \"source\";\n\n  /**\n   * Attribute of {@link Machine} that indicates by which plugin this machines is provisioned\n   *\n   * <p>It contains plugin id, like \"plugin\": \"eclipse/che-theia/master\"\n   */\n  public static final String PLUGIN_MACHINE_ATTRIBUTE = \"plugin\";\n\n  /** Mark containers applied to workspace with help recipe definition. */\n  public static final String RECIPE_CONTAINER_SOURCE = \"recipe\";\n\n  /** Mark containers created workspace api like tooling for user development. */\n  public static final String TOOL_CONTAINER_SOURCE = \"tool\";\n\n  /** The projects volume has a standard name used in a couple of locations. */\n  public static final String PROJECTS_VOLUME_NAME = \"projects\";\n\n  /** Attribute of {@link Server} that specifies exposure of which port created the server */\n  public static final String SERVER_PORT_ATTRIBUTE = \"port\";\n\n  /** When generating workspace name from generateName, append this many characters. */\n  public static final int WORKSPACE_GENERATE_NAME_CHARS_APPEND = 5;\n\n  /**\n   * The attribute of the workspace where we store the infrastructure namespace the workspace is\n   * deployed to\n   */\n  public static final String WORKSPACE_INFRASTRUCTURE_NAMESPACE_ATTRIBUTE =\n      \"infrastructureNamespace\";\n\n  /**\n   * The attribute for storing the infrastructure namespace of last used workspace, it recorded on\n   * workspace stop if no more running\n   */\n  public static final String LAST_ACTIVE_INFRASTRUCTURE_NAMESPACE =\n      \"lastUsedInfrastructureNamespace\";\n\n  /** The attribute for storing the time then last active workspace was stopped */\n  public static final String LAST_ACTIVITY_TIME = \"lastActivityTime\";\n\n  /** The flag for removing a workspace after it's stopped */\n  public static final String REMOVE_WORKSPACE_AFTER_STOP = \"removeWorkspaceImmediatelyAfterStop\";\n\n  private Constants() {}\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/ProjectProblemImpl.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared;\n\nimport org.eclipse.che.api.core.model.project.ProjectProblem;\n\n/**\n * @author Vitalii Parfonov\n */\npublic class ProjectProblemImpl implements ProjectProblem {\n\n  public ProjectProblemImpl(ProjectProblem projectProblem) {\n    this(projectProblem.getCode(), projectProblem.getMessage());\n  }\n\n  public ProjectProblemImpl(int code, String message) {\n    this.code = code;\n    this.message = message;\n  }\n\n  int code;\n  String message;\n\n  @Override\n  public int getCode() {\n    return code;\n  }\n\n  @Override\n  public String getMessage() {\n    return message;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/BrokerStatus.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\n/**\n * Statuses of a plugin broker that is used in the process of workspace start when sidecar-based\n * tooling is used.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Oleksandr Garagatyi\n */\npublic enum BrokerStatus {\n\n  /** Means that broker is started but neither error nor success was achieved yet. */\n  STARTED,\n\n  /** Means that broker successfully finished execution. */\n  DONE,\n\n  /** Means that broker execution failed. */\n  FAILED\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/CommandDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.MANDATORY;\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.workspace.config.Command;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.PreviewUrlDto;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface CommandDto extends Command {\n\n  @Override\n  @FactoryParameter(obligation = MANDATORY)\n  String getName();\n\n  void setName(String name);\n\n  CommandDto withName(String name);\n\n  @Override\n  @FactoryParameter(obligation = MANDATORY)\n  String getCommandLine();\n\n  void setCommandLine(String commandLine);\n\n  CommandDto withCommandLine(String commandLine);\n\n  @Override\n  @FactoryParameter(obligation = MANDATORY)\n  String getType();\n\n  void setType(String type);\n\n  CommandDto withType(String type);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Map<String, String> getAttributes();\n\n  void setAttributes(Map<String, String> attributes);\n\n  CommandDto withAttributes(Map<String, String> attributes);\n\n  @Override\n  PreviewUrlDto getPreviewUrl();\n\n  void setPreviewUrl(PreviewUrlDto previewUrl);\n\n  CommandDto withPreviewUrl(PreviewUrlDto previewUrl);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/EnvironmentDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.MANDATORY;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.workspace.config.Environment;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface EnvironmentDto extends Environment {\n\n  @Override\n  @FactoryParameter(obligation = MANDATORY)\n  RecipeDto getRecipe();\n\n  void setRecipe(RecipeDto recipe);\n\n  EnvironmentDto withRecipe(RecipeDto recipe);\n\n  @Override\n  @FactoryParameter(obligation = MANDATORY)\n  Map<String, MachineConfigDto> getMachines();\n\n  void setMachines(Map<String, MachineConfigDto> machines);\n\n  EnvironmentDto withMachines(Map<String, MachineConfigDto> machines);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/MachineConfigDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.workspace.config.MachineConfig;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface MachineConfigDto extends MachineConfig {\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Map<String, ServerConfigDto> getServers();\n\n  void setServers(Map<String, ServerConfigDto> servers);\n\n  MachineConfigDto withServers(Map<String, ServerConfigDto> servers);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Map<String, String> getEnv();\n\n  void setEnv(Map<String, String> env);\n\n  MachineConfigDto withEnv(Map<String, String> env);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Map<String, String> getAttributes();\n\n  void setAttributes(Map<String, String> attributes);\n\n  MachineConfigDto withAttributes(Map<String, String> attributes);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Map<String, VolumeDto> getVolumes();\n\n  void setVolumes(Map<String, VolumeDto> volumes);\n\n  MachineConfigDto withVolumes(Map<String, VolumeDto> volumes);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/MachineDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.Machine;\nimport org.eclipse.che.api.core.model.workspace.runtime.MachineStatus;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface MachineDto extends Machine {\n\n  @Override\n  Map<String, String> getAttributes();\n\n  MachineDto withAttributes(Map<String, String> attributes);\n\n  @Override\n  Map<String, ServerDto> getServers();\n\n  MachineDto withServers(Map<String, ServerDto> servers);\n\n  @Override\n  MachineStatus getStatus();\n\n  MachineDto withStatus(MachineStatus status);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/ProjectConfigDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.MANDATORY;\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.workspace.config.ProjectConfig;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface ProjectConfigDto extends ProjectConfig {\n  @Override\n  @FactoryParameter(obligation = MANDATORY)\n  String getName();\n\n  void setName(String name);\n\n  ProjectConfigDto withName(String name);\n\n  @Override\n  @FactoryParameter(obligation = MANDATORY)\n  String getPath();\n\n  void setPath(String path);\n\n  ProjectConfigDto withPath(String path);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getDescription();\n\n  void setDescription(String description);\n\n  ProjectConfigDto withDescription(String description);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getType();\n\n  void setType(String type);\n\n  ProjectConfigDto withType(String type);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  List<String> getMixins();\n\n  void setMixins(List<String> mixins);\n\n  ProjectConfigDto withMixins(List<String> mixins);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Map<String, List<String>> getAttributes();\n\n  void setAttributes(Map<String, List<String>> attributes);\n\n  ProjectConfigDto withAttributes(Map<String, List<String>> attributes);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  SourceStorageDto getSource();\n\n  void setSource(SourceStorageDto source);\n\n  ProjectConfigDto withSource(SourceStorageDto source);\n\n  @FactoryParameter(obligation = OPTIONAL)\n  List<Link> getLinks();\n\n  void setLinks(List<Link> links);\n\n  ProjectConfigDto withLinks(List<Link> links);\n\n  /**\n   * Provides information about project errors. If project doesn't have any error this field is\n   * empty.\n   */\n  @Schema(\n      description =\n          \"Optional information about project errors. If project doesn't have any error this field is empty\")\n  @Override\n  List<ProjectProblemDto> getProblems();\n\n  /**\n   * @see #getProblems\n   */\n  void setProblems(List<ProjectProblemDto> problems);\n\n  ProjectConfigDto withProblems(List<ProjectProblemDto> problems);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/ProjectProblemDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport org.eclipse.che.api.core.model.project.ProjectProblem;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Kabashniuk\n */\n@DTO\npublic interface ProjectProblemDto extends ProjectProblem {\n\n  int getCode();\n\n  void setCode(int status);\n\n  ProjectProblemDto withCode(int status);\n\n  String getMessage();\n\n  void setMessage(String message);\n\n  ProjectProblemDto withMessage(String message);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/RecipeDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.MANDATORY;\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.workspace.config.Recipe;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface RecipeDto extends Recipe {\n\n  @Override\n  @FactoryParameter(obligation = MANDATORY)\n  String getType();\n\n  void setType(String type);\n\n  RecipeDto withType(String type);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getContentType();\n\n  void setContentType(String contentType);\n\n  RecipeDto withContentType(String contentType);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getContent();\n\n  void setContent(String content);\n\n  RecipeDto withContent(String content);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getLocation();\n\n  void setLocation(String location);\n\n  RecipeDto withLocation(String location);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/RuntimeDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.Runtime;\nimport org.eclipse.che.api.core.rest.shared.dto.Hyperlinks;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface RuntimeDto extends Runtime, Hyperlinks {\n\n  @Override\n  String getActiveEnv();\n\n  void setActiveEnv(String activeEnv);\n\n  RuntimeDto withActiveEnv(String activeEnvName);\n\n  @Override\n  Map<String, MachineDto> getMachines();\n\n  void setMachines(Map<String, MachineDto> machines);\n\n  RuntimeDto withMachines(Map<String, MachineDto> machines);\n\n  @Override\n  String getOwner();\n\n  RuntimeDto withOwner(String owner);\n\n  String getMachineToken();\n\n  RuntimeDto withMachineToken(String machineToken);\n\n  void setMachineToken(String machineToken);\n\n  @Override\n  List<WarningDto> getWarnings();\n\n  void setWarnings(List<WarningDto> warnings);\n\n  RuntimeDto withWarnings(List<WarningDto> warnings);\n\n  @Override\n  List<CommandDto> getCommands();\n\n  void setCommands(List<CommandDto> commands);\n\n  RuntimeDto withCommands(List<CommandDto> commands);\n\n  @Override\n  RuntimeDto withLinks(List<Link> links);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/RuntimeIdentityDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author gazarenkov\n */\n@DTO\npublic interface RuntimeIdentityDto extends RuntimeIdentity {\n\n  @Override\n  String getWorkspaceId();\n\n  RuntimeIdentityDto withWorkspaceId(String workspaceId);\n\n  @Override\n  String getEnvName();\n\n  RuntimeIdentityDto withEnvName(String envName);\n\n  @Override\n  String getOwnerId();\n\n  RuntimeIdentityDto withOwnerId(String ownerId);\n\n  @Override\n  String getInfrastructureNamespace();\n\n  RuntimeIdentityDto withInfrastructureNamespace(String infrastructureNamespace);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/ServerConfigDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.MANDATORY;\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.workspace.config.ServerConfig;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface ServerConfigDto extends ServerConfig {\n  @Override\n  @FactoryParameter(obligation = MANDATORY)\n  String getPort();\n\n  void setPort(String port);\n\n  ServerConfigDto withPort(String port);\n\n  @Override\n  @FactoryParameter(obligation = MANDATORY)\n  String getProtocol();\n\n  void setProtocol(String protocol);\n\n  ServerConfigDto withProtocol(String protocol);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getPath();\n\n  void setPath(String path);\n\n  ServerConfigDto withPath(String path);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Map<String, String> getAttributes();\n\n  void setAttributes(Map<String, String> attributes);\n\n  ServerConfigDto withAttributes(Map<String, String> attributes);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/ServerDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.runtime.Server;\nimport org.eclipse.che.api.core.model.workspace.runtime.ServerStatus;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describes how to access to exposed ports for servers inside machine\n *\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface ServerDto extends Server {\n\n  @Override\n  String getUrl();\n\n  void setUrl(String url);\n\n  ServerDto withUrl(String url);\n\n  @Override\n  ServerStatus getStatus();\n\n  ServerDto withStatus(ServerStatus status);\n\n  @Override\n  Map<String, String> getAttributes();\n\n  ServerDto withAttributes(Map<String, String> attributes);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/SourceStorageDto.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.workspace.config.SourceStorage;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * TODO Type and location are optional in case it is a subproject, that has an empty source.\n *\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface SourceStorageDto extends SourceStorage {\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getType();\n\n  void setType(String type);\n\n  SourceStorageDto withType(String type);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getLocation();\n\n  void setLocation(String location);\n\n  SourceStorageDto withLocation(String location);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Map<String, String> getParameters();\n\n  void setParameters(Map<String, String> parameters);\n\n  SourceStorageDto withParameters(Map<String, String> parameters);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/VolumeDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport org.eclipse.che.api.core.model.workspace.config.Volume;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Alexander Garagatyi\n */\n@DTO\npublic interface VolumeDto extends Volume {\n  @Override\n  String getPath();\n\n  void setPath(String path);\n\n  VolumeDto withPath(String path);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/WarningDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport org.eclipse.che.api.core.model.workspace.Warning;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Yevhenii Voevodin\n */\n@DTO\npublic interface WarningDto extends Warning {\n\n  void setCode(int code);\n\n  WarningDto withCode(int code);\n\n  void setMessage(String message);\n\n  WarningDto withMessage(String message);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/WorkspaceConfigDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.MANDATORY;\nimport static org.eclipse.che.api.core.factory.FactoryParameter.Obligation.OPTIONAL;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.factory.FactoryParameter;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceConfig;\nimport org.eclipse.che.api.core.rest.shared.dto.Hyperlinks;\nimport org.eclipse.che.api.core.rest.shared.dto.Link;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author andrew00x\n */\n@DTO\npublic interface WorkspaceConfigDto extends WorkspaceConfig, Hyperlinks {\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getName();\n\n  WorkspaceConfigDto withName(String name);\n\n  void setName(String name);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getDefaultEnv();\n\n  void setDefaultEnv(String defaultEnvironment);\n\n  WorkspaceConfigDto withDefaultEnv(String defaultEnvironment);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  String getDescription();\n\n  void setDescription(String description);\n\n  WorkspaceConfigDto withDescription(String description);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  List<CommandDto> getCommands();\n\n  void setCommands(List<CommandDto> commands);\n\n  WorkspaceConfigDto withCommands(List<CommandDto> commands);\n\n  @Override\n  @FactoryParameter(obligation = MANDATORY)\n  List<ProjectConfigDto> getProjects();\n\n  void setProjects(List<ProjectConfigDto> projects);\n\n  WorkspaceConfigDto withProjects(List<ProjectConfigDto> projects);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Map<String, EnvironmentDto> getEnvironments();\n\n  void setEnvironments(Map<String, EnvironmentDto> environments);\n\n  WorkspaceConfigDto withEnvironments(Map<String, EnvironmentDto> environments);\n\n  @Override\n  @FactoryParameter(obligation = OPTIONAL)\n  Map<String, String> getAttributes();\n\n  void setAttributes(Map<String, String> attributes);\n\n  WorkspaceConfigDto withAttributes(Map<String, String> attributes);\n\n  @Override\n  WorkspaceConfigDto withLinks(List<Link> links);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/WorkspaceDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.Workspace;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.workspace.shared.dto.devfile.DevfileDto;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Yevhenii Voevodin\n */\n@DTO\npublic interface WorkspaceDto extends Workspace {\n\n  @Override\n  WorkspaceConfigDto getConfig();\n\n  void setConfig(WorkspaceConfigDto config);\n\n  WorkspaceDto withConfig(WorkspaceConfigDto config);\n\n  @Override\n  DevfileDto getDevfile();\n\n  void setDevfile(DevfileDto devfile);\n\n  WorkspaceDto withDevfile(DevfileDto devfile);\n\n  @Override\n  RuntimeDto getRuntime();\n\n  void setRuntime(RuntimeDto runtime);\n\n  WorkspaceDto withRuntime(RuntimeDto runtime);\n\n  void setId(String id);\n\n  WorkspaceDto withId(String id);\n\n  void setNamespace(String namespace);\n\n  WorkspaceDto withNamespace(String owner);\n\n  void setStatus(WorkspaceStatus status);\n\n  WorkspaceDto withStatus(WorkspaceStatus status);\n\n  void setTemporary(boolean isTemporary);\n\n  WorkspaceDto withTemporary(boolean isTemporary);\n\n  void setAttributes(Map<String, String> attributes);\n\n  WorkspaceDto withAttributes(Map<String, String> attributes);\n\n  Map<String, String> getLinks();\n\n  void setLinks(Map<String, String> links);\n\n  WorkspaceDto withLinks(Map<String, String> links);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/devfile/ComponentDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.devfile;\n\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.devfile.Component;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface ComponentDto extends Component {\n\n  @Override\n  String getAlias();\n\n  void setAlias(String alias);\n\n  ComponentDto withAlias(String alias);\n\n  @Override\n  String getType();\n\n  void setType(String type);\n\n  ComponentDto withType(String type);\n\n  @Override\n  String getId();\n\n  void setId(String id);\n\n  ComponentDto withId(String id);\n\n  @Override\n  String getRegistryUrl();\n\n  void setRegistryUrl(String registryUrl);\n\n  ComponentDto withRegistryUrl(String registryUrl);\n\n  @Override\n  Map<String, Serializable> getPreferences();\n\n  void setPreferences(Map<String, Serializable> preferences);\n\n  ComponentDto withPreferences(Map<String, Serializable> preferences);\n\n  @Override\n  String getReference();\n\n  void setReference(String reference);\n\n  ComponentDto withReference(String reference);\n\n  @Override\n  String getReferenceContent();\n\n  void setReferenceContent(String referenceContent);\n\n  ComponentDto withReferenceContent(String referenceContent);\n\n  @Override\n  List<EntrypointDto> getEntrypoints();\n\n  void setEntrypoints(List<EntrypointDto> entrypoints);\n\n  ComponentDto withEntrypoints(List<EntrypointDto> entrypoints);\n\n  @Override\n  Map<String, String> getSelector();\n\n  void setSelector(Map<String, String> selector);\n\n  ComponentDto withSelector(Map<String, String> selector);\n\n  @Override\n  String getImage();\n\n  void setImage(String image);\n\n  ComponentDto withImage(String image);\n\n  @Override\n  String getMemoryLimit();\n\n  void setMemoryLimit(String memoryLimit);\n\n  ComponentDto withMemoryLimit(String memoryLimit);\n\n  @Override\n  String getMemoryRequest();\n\n  void setMemoryRequest(String memoryRequest);\n\n  ComponentDto withMemoryRequest(String memoryRequest);\n\n  @Override\n  String getCpuLimit();\n\n  void setCpuLimit(String cpuLimit);\n\n  ComponentDto withCpuLimit(String cpuLimit);\n\n  @Override\n  String getCpuRequest();\n\n  void setCpuRequest(String cpuRequest);\n\n  ComponentDto withCpuRequest(String cpuRequest);\n\n  @Override\n  Boolean getMountSources();\n\n  void setMountSources(Boolean mountSources);\n\n  ComponentDto withMountSources(Boolean mountSources);\n\n  @Override\n  Boolean getAutomountWorkspaceSecrets();\n\n  void setAutomountWorkspaceSecrets(Boolean automountWorkspaceSecrets);\n\n  ComponentDto withAutomountWorkspaceSecrets(Boolean automountWorkspaceSecrets);\n\n  @Override\n  List<String> getCommand();\n\n  void setCommand(List<String> command);\n\n  ComponentDto withCommand(List<String> command);\n\n  @Override\n  List<String> getArgs();\n\n  void setArgs(List<String> args);\n\n  ComponentDto withArgs(List<String> args);\n\n  @Override\n  List<DevfileVolumeDto> getVolumes();\n\n  void setVolumes(List<DevfileVolumeDto> volumes);\n\n  ComponentDto withVolumes(List<DevfileVolumeDto> volumes);\n\n  @Override\n  List<EnvDto> getEnv();\n\n  void setEnv(List<EnvDto> env);\n\n  ComponentDto withEnv(List<EnvDto> env);\n\n  @Override\n  List<EndpointDto> getEndpoints();\n\n  void setEndpoints(List<EndpointDto> endpoints);\n\n  ComponentDto withEndpoints(List<EndpointDto> endpoints);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/devfile/DevfileActionDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.devfile;\n\nimport org.eclipse.che.api.core.model.workspace.devfile.Action;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface DevfileActionDto extends Action {\n  @Override\n  String getType();\n\n  void setType(String type);\n\n  DevfileActionDto withType(String type);\n\n  @Override\n  String getComponent();\n\n  void setComponent(String component);\n\n  DevfileActionDto withComponent(String component);\n\n  @Override\n  String getCommand();\n\n  void setCommand(String command);\n\n  DevfileActionDto withCommand(String command);\n\n  @Override\n  String getWorkdir();\n\n  void setWorkdir(String workdir);\n\n  DevfileActionDto withWorkdir(String workdir);\n\n  @Override\n  String getReference();\n\n  void setReference(String reference);\n\n  DevfileActionDto withReference(String reference);\n\n  @Override\n  String getReferenceContent();\n\n  void setReferenceContent(String referenceContent);\n\n  DevfileActionDto withReferenceContent(String referenceContent);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/devfile/DevfileCommandDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.devfile;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.devfile.Command;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface DevfileCommandDto extends Command {\n  @Override\n  String getName();\n\n  void setName(String name);\n\n  DevfileCommandDto withName(String name);\n\n  void setPreviewUrl(PreviewUrlDto previewUrl);\n\n  DevfileCommandDto withPreviewUrl(PreviewUrlDto previewUrl);\n\n  PreviewUrlDto getPreviewUrl();\n\n  @Override\n  List<DevfileActionDto> getActions();\n\n  void setActions(List<DevfileActionDto> actions);\n\n  DevfileCommandDto withActions(List<DevfileActionDto> actions);\n\n  @Override\n  Map<String, String> getAttributes();\n\n  void setAttributes(Map<String, String> attributes);\n\n  DevfileCommandDto withAttributes(Map<String, String> attributes);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/devfile/DevfileDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.devfile;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.devfile.Devfile;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface DevfileDto extends Devfile {\n  @Override\n  String getApiVersion();\n\n  void setApiVersion(String apiVersion);\n\n  DevfileDto withApiVersion(String apiVersion);\n\n  @Override\n  List<ProjectDto> getProjects();\n\n  void setProjects(List<ProjectDto> projects);\n\n  DevfileDto withProjects(List<ProjectDto> projects);\n\n  @Override\n  List<ComponentDto> getComponents();\n\n  void setComponents(List<ComponentDto> components);\n\n  DevfileDto withComponents(List<ComponentDto> components);\n\n  @Override\n  List<DevfileCommandDto> getCommands();\n\n  void setCommands(List<DevfileCommandDto> commands);\n\n  DevfileDto withCommands(List<DevfileCommandDto> commands);\n\n  @Override\n  Map<String, String> getAttributes();\n\n  void setAttributes(Map<String, String> attributes);\n\n  DevfileDto withAttributes(Map<String, String> attributes);\n\n  @Override\n  MetadataDto getMetadata();\n\n  void setMetadata(MetadataDto metadata);\n\n  DevfileDto withMetadata(MetadataDto metadata);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/devfile/DevfileVolumeDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.devfile;\n\nimport org.eclipse.che.api.core.model.workspace.devfile.Volume;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface DevfileVolumeDto extends Volume {\n\n  @Override\n  String getName();\n\n  void setName(String name);\n\n  DevfileVolumeDto withName(String name);\n\n  @Override\n  String getContainerPath();\n\n  void setContainerPath(String containerPath);\n\n  DevfileVolumeDto withContainerPath(String containerPath);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/devfile/EndpointDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.devfile;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.devfile.Endpoint;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface EndpointDto extends Endpoint {\n\n  @Override\n  String getName();\n\n  void setName(String name);\n\n  EndpointDto withName(String name);\n\n  @Override\n  Integer getPort();\n\n  void setPort(Integer port);\n\n  EndpointDto withPort(Integer port);\n\n  @Override\n  Map<String, String> getAttributes();\n\n  void setAttributes(Map<String, String> attributes);\n\n  EndpointDto withAttributes(Map<String, String> attributes);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/devfile/EntrypointDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.devfile;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.devfile.Entrypoint;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface EntrypointDto extends Entrypoint {\n\n  @Override\n  String getParentName();\n\n  void setParentName(String parentName);\n\n  EntrypointDto withParentName(String parentName);\n\n  @Override\n  String getContainerName();\n\n  void setContainerName(String containerName);\n\n  EntrypointDto withContainerName(String containerName);\n\n  @Override\n  Map<String, String> getParentSelector();\n\n  void setParentSelector(Map<String, String> parentSelector);\n\n  EntrypointDto withParentSelector(Map<String, String> parentSelector);\n\n  @Override\n  List<String> getCommand();\n\n  void setCommand(List<String> command);\n\n  EntrypointDto withCommand(List<String> command);\n\n  @Override\n  List<String> getArgs();\n\n  void setArgs(List<String> args);\n\n  EntrypointDto withArgs(List<String> args);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/devfile/EnvDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.devfile;\n\nimport org.eclipse.che.api.core.model.workspace.devfile.Env;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface EnvDto extends Env {\n\n  @Override\n  String getName();\n\n  void setName(String name);\n\n  EnvDto withName(String name);\n\n  @Override\n  String getValue();\n\n  void setValue(String value);\n\n  EnvDto withValue(String value);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/devfile/MetadataDto.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.devfile;\n\nimport org.eclipse.che.api.core.model.workspace.devfile.Metadata;\nimport org.eclipse.che.dto.shared.DTO;\n\n@DTO\npublic interface MetadataDto extends Metadata {\n\n  @Override\n  String getName();\n\n  void setName(String name);\n\n  MetadataDto withName(String name);\n\n  MetadataDto withGenerateName(String generateName);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/devfile/PreviewUrlDto.java",
    "content": "/*\n * Copyright (c) 2012-2021 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.devfile;\n\nimport org.eclipse.che.api.core.model.workspace.devfile.PreviewUrl;\nimport org.eclipse.che.dto.shared.DTO;\n\n@DTO\npublic interface PreviewUrlDto extends PreviewUrl {\n\n  @Override\n  int getPort();\n\n  @Override\n  String getPath();\n\n  void setPort(int port);\n\n  PreviewUrlDto withPort(int port);\n\n  void setPath(String path);\n\n  PreviewUrlDto withPath(String path);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/devfile/ProjectDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.devfile;\n\nimport org.eclipse.che.api.core.model.workspace.devfile.Project;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface ProjectDto extends Project {\n\n  @Override\n  String getName();\n\n  void setName(String name);\n\n  ProjectDto withName(String name);\n\n  @Override\n  SourceDto getSource();\n\n  void setSource(SourceDto source);\n\n  ProjectDto withSource(SourceDto source);\n\n  @Override\n  String getClonePath();\n\n  void setClonePath(String clonePath);\n\n  ProjectDto withClonePath(String clonePath);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/devfile/SourceDto.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.devfile;\n\nimport org.eclipse.che.api.core.model.workspace.devfile.Source;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface SourceDto extends Source {\n\n  @Override\n  String getType();\n\n  void setType(String type);\n\n  SourceDto withType(String type);\n\n  @Override\n  String getLocation();\n\n  void setLocation(String location);\n\n  SourceDto withLocation(String location);\n\n  @Override\n  String getBranch();\n\n  void setBranch(String branch);\n\n  SourceDto withBranch(String branch);\n\n  @Override\n  String getStartPoint();\n\n  void setStartPoint(String startPoint);\n\n  SourceDto withStartPoint(String startPoint);\n\n  @Override\n  String getTag();\n\n  void setTag(String tag);\n\n  SourceDto withTag(String tag);\n\n  @Override\n  String getCommitId();\n\n  void setCommitId(String commitId);\n\n  SourceDto withCommitId(String commitId);\n\n  @Override\n  String getSparseCheckoutDir();\n\n  void setSparseCheckoutDir(String sparseCheckoutDir);\n\n  SourceDto withSparseCheckoutDir(String sparseCheckoutDir);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/event/BootstrapperStatusEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.event;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.BootstrapperStatus;\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeIdentityDto;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Bootstrapper event status DTO.\n *\n * @author Max Shaposhnik (mshaposhnik@codenvy.com)\n */\n@DTO\npublic interface BootstrapperStatusEvent {\n\n  BootstrapperStatus getStatus();\n\n  void setStatus(BootstrapperStatus status);\n\n  BootstrapperStatusEvent withStatus(BootstrapperStatus status);\n\n  String getMachineName();\n\n  void setMachineName(String machineName);\n\n  BootstrapperStatusEvent withMachineName(String machineName);\n\n  RuntimeIdentityDto getRuntimeId();\n\n  void setRuntimeId(RuntimeIdentityDto runtimeId);\n\n  BootstrapperStatusEvent withRuntimeId(RuntimeIdentityDto runtimeId);\n\n  String getError();\n\n  void setError(String error);\n\n  BootstrapperStatusEvent withError(String error);\n\n  String getTime();\n\n  void setTime(String time);\n\n  BootstrapperStatusEvent withTime(String time);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/event/BrokerLogEvent.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.event;\n\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeIdentityDto;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface BrokerLogEvent {\n\n  /** Returns the contents of the log event. */\n  String getText();\n\n  void setText(String text);\n\n  BrokerLogEvent withText(String text);\n\n  /** Returns runtime identity. */\n  RuntimeIdentityDto getRuntimeId();\n\n  void setRuntimeId(RuntimeIdentityDto runtimeId);\n\n  BrokerLogEvent withRuntimeId(RuntimeIdentityDto runtimeId);\n\n  /** Returns time in format '2017-06-27T17:11:09.306+03:00' */\n  String getTime();\n\n  void setTime(String time);\n\n  BrokerLogEvent withTime(String time);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/event/BrokerStatusChangedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.event;\n\nimport org.eclipse.che.api.workspace.shared.dto.BrokerStatus;\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeIdentityDto;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Event initiated by a plugin broker with the results of the plugin broker invocation for a\n * workspace.\n *\n * <p>This API is in <b>Beta</b> and is subject to changes or removal.\n *\n * @author Oleksandr Garagatyi\n */\n@DTO\npublic interface BrokerStatusChangedEvent {\n\n  /** Status of execution of a broker process. */\n  BrokerStatus getStatus();\n\n  BrokerStatusChangedEvent withStatus(BrokerStatus status);\n\n  /** Returns identity of runtime to which broker belongs t. */\n  RuntimeIdentityDto getRuntimeId();\n\n  BrokerStatusChangedEvent withRuntimeId(RuntimeIdentityDto runtimeId);\n\n  /**\n   * Error message that explains the reason of the broker process failure.\n   *\n   * <p>This method must return non-null value if {@link #getStatus() status} is {@link\n   * BrokerStatus#FAILED}.\n   */\n  String getError();\n\n  BrokerStatusChangedEvent withError(String error);\n\n  /**\n   * Stringified workspace tooling in JSON format.\n   *\n   * <p>Current model of workspace tooling description has fields with names not supported by a DTO\n   * framework (dashes in field name, field name not matching POJO getter), so we have to stringify\n   * it to pass over Che JSON_RPC framework.\n   *\n   * <p>This method must return non-null value if {@link #getStatus() status} is {@link\n   * BrokerStatus#DONE}.\n   */\n  String getTooling();\n\n  BrokerStatusChangedEvent withTooling(String tooling);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/event/MachineLogEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.event;\n\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeIdentityDto;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Defines event format for machine logs.\n *\n * @author Anton Korneta\n * @deprecated use {@link RuntimeLogEvent} instead\n */\n@DTO\n@Deprecated\npublic interface MachineLogEvent {\n\n  /** Returns the contents of the log event. */\n  String getText();\n\n  void setText(String text);\n\n  MachineLogEvent withText(String text);\n\n  /** Returns the name of the machine that produces the logs. */\n  String getMachineName();\n\n  void setMachineName(String machineName);\n\n  MachineLogEvent withMachineName(String machineName);\n\n  /** Returns runtime identity. */\n  RuntimeIdentityDto getRuntimeId();\n\n  void setRuntimeId(RuntimeIdentityDto runtimeId);\n\n  MachineLogEvent withRuntimeId(RuntimeIdentityDto runtimeId);\n\n  /** Returns time in format '2017-06-27T17:11:09.306+03:00' */\n  String getTime();\n\n  void setTime(String time);\n\n  MachineLogEvent withTime(String time);\n\n  /** Returns standard streams, if present otherwise, null will be returned. */\n  String getStream();\n\n  void setStream(String stream);\n\n  MachineLogEvent withStream(String stream);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/event/MachineStatusEvent.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.event;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.MachineStatus;\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeIdentityDto;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describes event about status of machine\n *\n * @author Eugene Voevodin\n * @author Alexander Garagatyi\n */\n// @EventOrigin(\"machine\")\n@DTO\npublic interface MachineStatusEvent {\n\n  MachineStatus getEventType();\n\n  void setEventType(MachineStatus eventType);\n\n  MachineStatusEvent withEventType(MachineStatus eventType);\n\n  String getError();\n\n  void setError(String error);\n\n  MachineStatusEvent withError(String error);\n\n  String getMachineName();\n\n  MachineStatusEvent withMachineName(String machineName);\n\n  /**\n   * @return runtime identity\n   */\n  RuntimeIdentityDto getIdentity();\n\n  MachineStatusEvent withIdentity(RuntimeIdentityDto identity);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/event/RuntimeLogEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.event;\n\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeIdentityDto;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Defines event format for runtime logs.\n *\n * @author Sergii Leshchenko\n */\n@DTO\npublic interface RuntimeLogEvent {\n\n  /** Returns the contents of the log event. */\n  String getText();\n\n  void setText(String text);\n\n  RuntimeLogEvent withText(String text);\n\n  /** Returns runtime identity. */\n  RuntimeIdentityDto getRuntimeId();\n\n  void setRuntimeId(RuntimeIdentityDto runtimeId);\n\n  RuntimeLogEvent withRuntimeId(RuntimeIdentityDto runtimeId);\n\n  /**\n   * Returns the name of the machine that produces the logs.\n   *\n   * <p>May return null when log is produced by process which doesn't belong to any particular\n   * machine.\n   */\n  @Nullable\n  String getMachineName();\n\n  void setMachineName(String machineName);\n\n  RuntimeLogEvent withMachineName(String machineName);\n\n  /** Returns time in format '2017-06-27T17:11:09.306+03:00' */\n  String getTime();\n\n  void setTime(String time);\n\n  RuntimeLogEvent withTime(String time);\n\n  /** Returns standard streams, if present otherwise, null will be returned. */\n  @Nullable\n  String getStream();\n\n  void setStream(String stream);\n\n  RuntimeLogEvent withStream(String stream);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/event/RuntimeStatusEvent.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.event;\n\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeIdentityDto;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Infrastructure specific status changes.\n *\n * @author gazarenkov\n */\n@DTO\npublic interface RuntimeStatusEvent {\n\n  /**\n   * @return new status\n   */\n  String getStatus();\n\n  RuntimeStatusEvent withStatus(String status);\n\n  /**\n   * @return previous status\n   */\n  String getPrevStatus();\n\n  RuntimeStatusEvent withPrevStatus(String status);\n\n  /**\n   * @return runtime identity\n   */\n  RuntimeIdentityDto getIdentity();\n\n  RuntimeStatusEvent withIdentity(RuntimeIdentityDto identity);\n\n  /**\n   * Error message/log returned by infrastructure in case if it caused runtime failure Filled only\n   * if failed == true\n   */\n  @Nullable\n  String getError();\n\n  RuntimeStatusEvent withError(String error);\n\n  /**\n   * @return whether Runtime is not workable anymore\n   */\n  boolean isFailed();\n\n  RuntimeStatusEvent withFailed(boolean failed);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/event/ServerStatusEvent.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.event;\n\nimport org.eclipse.che.api.core.model.workspace.runtime.ServerStatus;\nimport org.eclipse.che.api.workspace.shared.dto.RuntimeIdentityDto;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * @author gazarenkov\n */\n@DTO\npublic interface ServerStatusEvent {\n\n  ServerStatus getStatus();\n\n  ServerStatusEvent withStatus(ServerStatus status);\n\n  String getServerName();\n\n  ServerStatusEvent withServerName(String serverName);\n\n  String getServerUrl();\n\n  ServerStatusEvent withServerUrl(String serverUrl);\n\n  String getMachineName();\n\n  ServerStatusEvent withMachineName(String machineName);\n\n  /**\n   * @return runtime identity\n   */\n  RuntimeIdentityDto getIdentity();\n\n  ServerStatusEvent withIdentity(RuntimeIdentityDto identity);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/dto/event/WorkspaceStatusEvent.java",
    "content": "/*\n * Copyright (c) 2012-2025 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.dto.event;\n\nimport java.util.Map;\nimport org.eclipse.che.api.core.model.workspace.WorkspaceStatus;\nimport org.eclipse.che.api.core.notification.EventOrigin;\nimport org.eclipse.che.commons.annotation.Nullable;\nimport org.eclipse.che.dto.shared.DTO;\n\n/**\n * Describes workspace status changes.\n *\n * @author Alexander Garagatyi\n * @author Yevhenii Voevodin\n */\n@EventOrigin(\"workspace\")\n@DTO\npublic interface WorkspaceStatusEvent {\n  WorkspaceStatus getStatus();\n\n  void setStatus(WorkspaceStatus status);\n\n  WorkspaceStatusEvent withStatus(WorkspaceStatus status);\n\n  /**\n   * Returns previous workspace status.\n   *\n   * @see WorkspaceStatus for more information about certain values\n   */\n  WorkspaceStatus getPrevStatus();\n\n  void setPrevStatus(WorkspaceStatus status);\n\n  WorkspaceStatusEvent withPrevStatus(WorkspaceStatus status);\n\n  /** The id of the workspace to which this event belongs to . */\n  String getWorkspaceId();\n\n  void setWorkspaceId(String machineId);\n\n  WorkspaceStatusEvent withWorkspaceId(String machineId);\n\n  /** Returns an error message value. */\n  @Nullable\n  String getError();\n\n  void setError(String error);\n\n  WorkspaceStatusEvent withError(String error);\n\n  void setOptions(Map<String, String> options);\n\n  @Nullable\n  Map<String, String> getOptions();\n\n  WorkspaceStatusEvent withOptions(Map<String, String> options);\n\n  /**\n   * @return whether event cause by some concrete user's request\n   */\n  boolean isInitiatedByUser();\n\n  WorkspaceStatusEvent withInitiatedByUser(boolean isInitiatedByUser);\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/event/WorkspaceCreatedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.event;\n\nimport org.eclipse.che.api.core.model.workspace.Workspace;\nimport org.eclipse.che.api.core.notification.EventOrigin;\n\n/**\n * Informs about workspace creation.\n *\n * @author Sergii Leschenko\n */\n@EventOrigin(\"workspace\")\npublic class WorkspaceCreatedEvent {\n  private final Workspace workspace;\n\n  public WorkspaceCreatedEvent(Workspace workspace) {\n    this.workspace = workspace;\n  }\n\n  public Workspace getWorkspace() {\n    return workspace;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-api-workspace-shared/src/main/java/org/eclipse/che/api/workspace/shared/event/WorkspaceRemovedEvent.java",
    "content": "/*\n * Copyright (c) 2012-2018 Red Hat, Inc.\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors:\n *   Red Hat, Inc. - initial API and implementation\n */\npackage org.eclipse.che.api.workspace.shared.event;\n\nimport org.eclipse.che.api.core.model.workspace.Workspace;\nimport org.eclipse.che.api.core.notification.EventOrigin;\n\n/**\n * Informs that workspace was removed.\n *\n * @author Sergii Leschenko\n * @author Alexander Andrienko\n */\n@EventOrigin(\"workspace\")\npublic class WorkspaceRemovedEvent {\n\n  private final Workspace workspace;\n\n  public WorkspaceRemovedEvent(Workspace workspace) {\n    this.workspace = workspace;\n  }\n\n  public Workspace getWorkspace() {\n    return workspace;\n  }\n}\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-master-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n    </parent>\n    <artifactId>che-core-sql-schema</artifactId>\n    <name>Che Core :: SQL :: Schema</name>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>com.mycila</groupId>\n                <artifactId>license-maven-plugin</artifactId>\n                <configuration>\n                    <excludes>\n                        <exclude>**/*.sql</exclude>\n                    </excludes>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.0.0-M8/1__init.sql",
    "content": "--\n-- Copyright (c) 2012-2016 Codenvy, S.A.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Codenvy, S.A. - initial API and implementation\n--\n\n-- Account ---------------------------------------------------------------------\nCREATE TABLE account (\n    id          VARCHAR(255)    NOT NULL,\n    name        VARCHAR(255)    NOT NULL,\n    type        VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n-- indexes\nCREATE UNIQUE INDEX index_account_name ON account (name);\n--------------------------------------------------------------------------------\n\n\n-- User ------------------------------------------------------------------------\nCREATE TABLE usr (\n    id          VARCHAR(255)    NOT NULL,\n    email       VARCHAR(255)    NOT NULL,\n    account_id  VARCHAR(255)    NOT NULL,\n    password    VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n-- indexes\nCREATE UNIQUE INDEX index_usr_email ON usr (email);\n-- constraints\nALTER TABLE usr ADD CONSTRAINT fk_usr_account_id FOREIGN KEY (account_id) REFERENCES account (id);\n--------------------------------------------------------------------------------\n\n\n-- User aliases ----------------------------------------------------------------\nCREATE TABLE user_aliases (\n    user_id         VARCHAR(255),\n    alias           VARCHAR(255) NOT NULL UNIQUE\n);\n--indexes\nCREATE INDEX index_user_aliases_alias ON user_aliases (alias);\n--constraints\nALTER TABLE user_aliases ADD CONSTRAINT fk_user_aliases_user_id FOREIGN KEY (user_id) REFERENCES usr (id);\n--------------------------------------------------------------------------------\n\n\n-- Profile ---------------------------------------------------------------------\nCREATE TABLE profile (\n    userid      VARCHAR(255) NOT NULL,\n\n    PRIMARY KEY (userid)\n);\n-- constraints\nALTER TABLE profile ADD CONSTRAINT fk_profile_userid FOREIGN KEY (userid) REFERENCES usr (id);\n--------------------------------------------------------------------------------\n\n\n-- Profile Attribute -----------------------------------------------------------\nCREATE TABLE profile_attributes (\n    user_id     VARCHAR(255),\n    value_param VARCHAR(255)    NOT NULL,\n    name        VARCHAR(255)\n);\n-- constraints\nALTER TABLE profile_attributes ADD CONSTRAINT unq_profile_attributes_0 UNIQUE (user_id, name);\nALTER TABLE profile_attributes ADD CONSTRAINT fk_profile_attributes_user_id FOREIGN KEY (user_id) REFERENCES profile (userid);\n--------------------------------------------------------------------------------\n\n\n-- Preferences -----------------------------------------------------------------\nCREATE TABLE preference (\n    userid      VARCHAR(255)    NOT NULL,\n\n    PRIMARY KEY (userid)\n);\n-- constraints\nALTER TABLE preference ADD CONSTRAINT fk_preference_userid FOREIGN KEY (userid) REFERENCES usr (id);\n--------------------------------------------------------------------------------\n\n\n-- Preferences Preferences -----------------------------------------------------\nCREATE TABLE preference_preferences (\n    preference_userid   VARCHAR(255),\n    value_param         TEXT,\n    name                VARCHAR(255)\n);\n-- constraints\nALTER TABLE preference_preferences ADD CONSTRAINT fk_preference_preferences_preference_userid FOREIGN KEY (preference_userid) REFERENCES preference (userid);\n--------------------------------------------------------------------------------\n\n\n-- SSH -------------------------------------------------------------------------\nCREATE TABLE sshkeypair (\n    owner       VARCHAR(255)    NOT NULL,\n    service     VARCHAR(255)    NOT NULL,\n    name        VARCHAR(255)    NOT NULL,\n    privatekey  TEXT,\n    publickey   TEXT,\n\n    PRIMARY KEY (owner, service, name)\n);\n-- constraints\nALTER TABLE sshkeypair ADD CONSTRAINT fk_sshkeypair_owner FOREIGN KEY (owner) REFERENCES usr (id);\n--------------------------------------------------------------------------------\n\n\n-- Workspace configuration -----------------------------------------------------\nCREATE TABLE workspaceconfig (\n    id          BIGINT          NOT NULL,\n    defaultenv  VARCHAR(255)    NOT NULL,\n    description TEXT,\n    name        VARCHAR(255)    NOT NULL,\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Workspace -------------------------------------------------------------------\nCREATE TABLE workspace (\n    id              VARCHAR(255)        NOT NULL,\n    istemporary     BOOLEAN,\n    name            VARCHAR(255),\n    accountid       VARCHAR(255)        NOT NULL,\n    config_id       BIGINT,\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE workspace ADD CONSTRAINT unq_workspace_0 UNIQUE (name, accountid);\nALTER TABLE workspace ADD CONSTRAINT fx_workspace_accountid FOREIGN KEY (accountid) REFERENCES account (id);\nALTER TABLE workspace ADD CONSTRAINT fk_workspace_config_id FOREIGN KEY (config_id) REFERENCES workspaceconfig (id);\n--------------------------------------------------------------------------------\n\n\n--Workspace attributes ---------------------------------------------------------\nCREATE TABLE workspace_attributes (\n    workspace_id    VARCHAR(255),\n    attributes      VARCHAR(255),\n    attributes_key  VARCHAR(255)\n);\n--constraints\nALTER TABLE workspace_attributes ADD CONSTRAINT fk_workspace_attributes_workspace_id FOREIGN KEY (workspace_id) REFERENCES workspace (id);\n--------------------------------------------------------------------------------\n\n\n-- Project source --------------------------------------------------------------\nCREATE TABLE sourcestorage (\n    id          BIGINT      NOT NULL,\n    location    TEXT,\n    type        VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Project source parameters----------------------------------------------------\nCREATE TABLE sourcestorage_parameters (\n    sourcestorage_id        BIGINT,\n    parameters              VARCHAR(255),\n    parameters_key          VARCHAR(255)\n);\n--constraints\nALTER TABLE sourcestorage_parameters ADD CONSTRAINT fk_sourcestorage_parameters_sourcestorage_id FOREIGN KEY (sourcestorage_id) REFERENCES sourcestorage (id);\n--------------------------------------------------------------------------------\n\n\n-- Project configuration -------------------------------------------------------\nCREATE TABLE projectconfig (\n    id              BIGINT          NOT NULL,\n    description     TEXT,\n    name            VARCHAR(255),\n    path            VARCHAR(255)    NOT NULL,\n    type            VARCHAR(255),\n    source_id       BIGINT,\n    projects_id     BIGINT,\n\n    PRIMARY KEY (id)\n);\n\n-- constraints\nALTER TABLE projectconfig ADD CONSTRAINT fk_projectconfig_projects_id FOREIGN KEY (projects_id) REFERENCES workspaceconfig (id);\nALTER TABLE projectconfig ADD CONSTRAINT fk_projectconfig_source_id FOREIGN KEY (source_id) REFERENCES sourcestorage (id);\n--------------------------------------------------------------------------------\n\n\n-- Project attributes ----------------------------------------------------------\nCREATE TABLE projectattribute (\n    id              BIGINT          NOT NULL,\n    name            VARCHAR(255),\n    dbattributes_id BIGINT,\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE projectattribute ADD CONSTRAINT fk_projectattribute_dbattributes_id FOREIGN KEY (dbattributes_id) REFERENCES projectconfig (id);\n--------------------------------------------------------------------------------\n\n\n-- Project attribute values ----------------------------------------------------\nCREATE TABLE projectattribute_values (\n    projectattribute_id     BIGINT,\n    values_param            VARCHAR(255)\n);\n--constraints\nALTER TABLE projectattribute_values ADD CONSTRAINT fk_projectattribute_values_projectattribute_id FOREIGN KEY (projectattribute_id) REFERENCES projectattribute (id);\n--------------------------------------------------------------------------------\n\n\n-- Project mixins --------------------------------------------------------------\nCREATE TABLE projectconfig_mixins (\n    projectconfig_id    BIGINT,\n    mixins              VARCHAR(255)\n);\n--constraints\nALTER TABLE projectconfig_mixins ADD CONSTRAINT fk_projectconfig_mixins_projectconfig_id FOREIGN KEY (projectconfig_id) REFERENCES projectconfig (id);\n--------------------------------------------------------------------------------\n\n\n-- Commands --------------------------------------------------------------------\nCREATE TABLE command (\n    id              BIGINT      NOT NULL,\n    commandline     TEXT,\n    name            VARCHAR(255) NOT NULL,\n    type            VARCHAR(255) NOT NULL,\n    commands_id     BIGINT,\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE command ADD CONSTRAINT fk_command_commands_id FOREIGN KEY (commands_id) REFERENCES workspaceconfig (id);\n--------------------------------------------------------------------------------\n\n\n-- Command attributes ----------------------------------------------------------\nCREATE TABLE command_attributes (\n    command_id  BIGINT,\n    value_param TEXT,\n    name        VARCHAR(255)\n);\n--constraints\nALTER TABLE command_attributes ADD CONSTRAINT fk_command_attributes_command_id FOREIGN KEY (command_id) REFERENCES command (id);\n--------------------------------------------------------------------------------\n\n\n-- Workspace Environments ------------------------------------------------------\nCREATE TABLE environment (\n    id                  BIGINT          NOT NULL,\n    content             TEXT,\n    contenttype         VARCHAR(255),\n    location            TEXT,\n    type                VARCHAR(255),\n    environments_id     BIGINT,\n    environments_key    VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE environment ADD CONSTRAINT fk_environment_environments_id FOREIGN KEY (environments_id) REFERENCES workspaceconfig (id);\n--------------------------------------------------------------------------------\n\n\n-- Environment machines --------------------------------------------------------\nCREATE TABLE externalmachine (\n    id              BIGINT          NOT NULL,\n    machines_id     BIGINT,\n    machines_key    VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE externalmachine ADD CONSTRAINT fk_externalmachine_machines_id FOREIGN KEY (machines_id) REFERENCES environment (id);\n--------------------------------------------------------------------------------\n\n\n-- Environment machine agents  -------------------------------------------------\nCREATE TABLE externalmachine_agents (\n    externalmachine_id  BIGINT,\n    agents              VARCHAR(255)\n);\n-- constraints\nALTER TABLE externalmachine_agents ADD CONSTRAINT fk_externalmachine_agents_externalmachine_id FOREIGN KEY (externalmachine_id) REFERENCES externalmachine (id);\n--------------------------------------------------------------------------------\n\n\n-- Environment machine attributes ----------------------------------------------\nCREATE TABLE externalmachine_attributes (\n    externalmachine_id      BIGINT,\n    attributes              VARCHAR(255),\n    attributes_key          VARCHAR(255)\n);\n--constraints\nALTER TABLE externalmachine_attributes ADD CONSTRAINT fk_externalmachine_attributes_externalmachine_id FOREIGN KEY (externalmachine_id) REFERENCES externalmachine (id);\n--------------------------------------------------------------------------------\n\n\n-- Machine servers configuration -----------------------------------------------\nCREATE TABLE serverconf (\n    id              BIGINT          NOT NULL,\n    port            VARCHAR(255),\n    protocol        VARCHAR(255),\n    servers_id      BIGINT,\n    servers_key     VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE serverconf ADD CONSTRAINT fk_serverconf_servers_id FOREIGN KEY (servers_id) REFERENCES externalmachine (id);\n--------------------------------------------------------------------------------\n\n-- Machine server properties ---------------------------------------------------\nCREATE TABLE serverconf_properties (\n    serverconf_id       BIGINT,\n    properties          VARCHAR(255),\n    properties_key      VARCHAR(255)\n);\n--constraints\nALTER TABLE serverconf_properties ADD CONSTRAINT fk_serverconf_properties_serverconf_id FOREIGN KEY (serverconf_id) REFERENCES serverconf (id);\n--------------------------------------------------------------------------------\n\n\n-- Workspace snapshots ---------------------------------------------------------\nCREATE TABLE snapshot (\n    id              VARCHAR(255)        NOT NULL,\n    creationdate    BIGINT,\n    description     TEXT,\n    envname         VARCHAR(255)        NOT NULL,\n    isdev           BOOLEAN,\n    machinename     VARCHAR(255)        NOT NULL,\n    type            VARCHAR(255),\n    workspaceid     VARCHAR(255)        NOT NULL,\n    content         TEXT,\n    location        VARCHAR(255),\n    source_type     VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--indexes\nCREATE UNIQUE INDEX index_snapshot_workspaceid_envname_machinename ON snapshot (workspaceid, envname, machinename);\n--constraints\nALTER TABLE snapshot ADD CONSTRAINT fk_snapshot_workspaceid FOREIGN KEY (workspaceid) REFERENCES workspace (id);\n--------------------------------------------------------------------------------\n\n\n-- Recipe ----------------------------------------------------------------------\nCREATE TABLE recipe (\n    id              VARCHAR(255) NOT NULL,\n    creator         VARCHAR(255),\n    description     TEXT,\n    name            VARCHAR(255),\n    script          TEXT,\n    type            VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Recipe tags -----------------------------------------------------------------\nCREATE TABLE recipe_tags (\n    recipe_id   VARCHAR(255),\n    tag         VARCHAR(255)\n);\n--indexes\nCREATE INDEX index_recipe_tags_tag ON recipe_tags (tag);\n--constraints\nALTER TABLE recipe_tags ADD CONSTRAINT fs_recipe_tags_recipe_id FOREIGN KEY (recipe_id) REFERENCES recipe (id);\n--------------------------------------------------------------------------------\n\n\n-- Stack -----------------------------------------------------------------------\nCREATE TABLE stack (\n    id                  VARCHAR(255)        NOT NULL,\n    creator             VARCHAR(255),\n    description         TEXT,\n    name                VARCHAR(255)        NOT NULL    UNIQUE,\n    scope               VARCHAR(255),\n    origin              VARCHAR(255),\n    type                VARCHAR(255),\n    data                BYTEA,\n    mediatype           VARCHAR(255),\n    icon_name           VARCHAR(255),\n    workspaceconfig_id  BIGINT,\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE stack ADD CONSTRAINT fk_stack_workspaceconfig_id FOREIGN KEY (workspaceconfig_id) REFERENCES workspaceconfig (id);\n--------------------------------------------------------------------------------\n\n\n-- Stack components ------------------------------------------------------------\nCREATE TABLE stack_components (\n    name        VARCHAR(255),\n    version     VARCHAR(255),\n    stack_id    VARCHAR(255)\n);\n--constraints\nALTER TABLE stack_components ADD CONSTRAINT fk_stack_components_stack_id FOREIGN KEY (stack_id) REFERENCES stack (id);\n--------------------------------------------------------------------------------\n\n\n-- Stack tags ------------------------------------------------------------------\nCREATE TABLE stack_tags (\n    stack_id    VARCHAR(255),\n    tag         VARCHAR(255)\n);\n--indexes\nCREATE INDEX index_stack_tags_tag ON stack_tags (tag);\n--constraints\nALTER TABLE stack_tags ADD CONSTRAINT fk_stack_tags_stack_id FOREIGN KEY (stack_id) REFERENCES stack (id);\n--------------------------------------------------------------------------------\n\n-- Sequence table --------------------------------------------------------------\nCREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT NUMERIC(38), PRIMARY KEY (SEQ_NAME));\nINSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 0);\n--------------------------------------------------------------------------------\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.0.0-M8/mysql/1__init.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Account ---------------------------------------------------------------------\nCREATE TABLE account (\n    id          VARCHAR(255)    NOT NULL,\n    name        VARCHAR(255)    NOT NULL,\n    type        VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n-- indexes\nCREATE UNIQUE INDEX index_account_name ON account (name);\n--------------------------------------------------------------------------------\n\n\n-- User ------------------------------------------------------------------------\nCREATE TABLE usr (\n    id          VARCHAR(255)    NOT NULL,\n    email       VARCHAR(255)    NOT NULL,\n    account_id  VARCHAR(255)    NOT NULL,\n    password    VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n-- indexes\nCREATE UNIQUE INDEX index_usr_email ON usr (email);\n-- constraints\nALTER TABLE usr ADD CONSTRAINT fk_usr_account_id FOREIGN KEY (account_id) REFERENCES account (id);\n--------------------------------------------------------------------------------\n\n\n-- User aliases ----------------------------------------------------------------\nCREATE TABLE user_aliases (\n    user_id         VARCHAR(255),\n    alias           VARCHAR(255) NOT NULL UNIQUE\n);\n--indexes\nCREATE INDEX index_user_aliases_alias ON user_aliases (alias);\n--constraints\nALTER TABLE user_aliases ADD CONSTRAINT fk_user_aliases_user_id FOREIGN KEY (user_id) REFERENCES usr (id);\n--------------------------------------------------------------------------------\n\n\n-- Profile ---------------------------------------------------------------------\nCREATE TABLE profile (\n    userid      VARCHAR(255) NOT NULL,\n\n    PRIMARY KEY (userid)\n);\n-- constraints\nALTER TABLE profile ADD CONSTRAINT fk_profile_userid FOREIGN KEY (userid) REFERENCES usr (id);\n--------------------------------------------------------------------------------\n\n\n-- Profile Attribute -----------------------------------------------------------\nCREATE TABLE profile_attributes (\n    user_id     VARCHAR(255),\n    value_param VARCHAR(255)    NOT NULL,\n    name        VARCHAR(255)\n);\n-- constraints\nALTER TABLE profile_attributes ADD CONSTRAINT unq_profile_attributes_0 UNIQUE (user_id, name);\nALTER TABLE profile_attributes ADD CONSTRAINT fk_profile_attributes_user_id FOREIGN KEY (user_id) REFERENCES profile (userid);\n--------------------------------------------------------------------------------\n\n\n-- Preferences -----------------------------------------------------------------\nCREATE TABLE preference (\n    userid      VARCHAR(255)    NOT NULL,\n\n    PRIMARY KEY (userid)\n);\n-- constraints\nALTER TABLE preference ADD CONSTRAINT fk_preference_userid FOREIGN KEY (userid) REFERENCES usr (id);\n--------------------------------------------------------------------------------\n\n\n-- Preferences Preferences -----------------------------------------------------\nCREATE TABLE preference_preferences (\n    preference_userid   VARCHAR(255),\n    value_param         TEXT,\n    name                VARCHAR(255)\n);\n-- constraints\nALTER TABLE preference_preferences ADD CONSTRAINT fk_preference_preferences_preference_userid FOREIGN KEY (preference_userid) REFERENCES preference (userid);\n--------------------------------------------------------------------------------\n\n\n-- SSH -------------------------------------------------------------------------\nCREATE TABLE sshkeypair (\n    owner       VARCHAR(255)    NOT NULL,\n    service     VARCHAR(255)    NOT NULL,\n    name        VARCHAR(255)    NOT NULL,\n    privatekey  TEXT,\n    publickey   TEXT,\n\n    PRIMARY KEY (owner, service, name)\n);\n-- constraints\nALTER TABLE sshkeypair ADD CONSTRAINT fk_sshkeypair_owner FOREIGN KEY (owner) REFERENCES usr (id);\n--------------------------------------------------------------------------------\n\n\n-- Workspace configuration -----------------------------------------------------\nCREATE TABLE workspaceconfig (\n    id          BIGINT          NOT NULL,\n    defaultenv  VARCHAR(255)    NOT NULL,\n    description TEXT,\n    name        VARCHAR(255)    NOT NULL,\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Workspace -------------------------------------------------------------------\nCREATE TABLE workspace (\n    id              VARCHAR(255)        NOT NULL,\n    istemporary     BOOLEAN,\n    name            VARCHAR(255),\n    accountid       VARCHAR(255)        NOT NULL,\n    config_id       BIGINT,\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE workspace ADD CONSTRAINT unq_workspace_0 UNIQUE (name, accountid);\nALTER TABLE workspace ADD CONSTRAINT fx_workspace_accountid FOREIGN KEY (accountid) REFERENCES account (id);\nALTER TABLE workspace ADD CONSTRAINT fk_workspace_config_id FOREIGN KEY (config_id) REFERENCES workspaceconfig (id);\n--------------------------------------------------------------------------------\n\n\n--Workspace attributes ---------------------------------------------------------\nCREATE TABLE workspace_attributes (\n    workspace_id    VARCHAR(255),\n    attributes      VARCHAR(255),\n    attributes_key  VARCHAR(255)\n);\n--constraints\nALTER TABLE workspace_attributes ADD CONSTRAINT fk_workspace_attributes_workspace_id FOREIGN KEY (workspace_id) REFERENCES workspace (id);\n--------------------------------------------------------------------------------\n\n\n-- Project source --------------------------------------------------------------\nCREATE TABLE sourcestorage (\n    id          BIGINT      NOT NULL,\n    location    TEXT,\n    type        VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Project source parameters----------------------------------------------------\nCREATE TABLE sourcestorage_parameters (\n    sourcestorage_id        BIGINT,\n    parameters              VARCHAR(255),\n    parameters_key          VARCHAR(255)\n);\n--constraints\nALTER TABLE sourcestorage_parameters ADD CONSTRAINT fk_sourcestorage_parameters_sourcestorage_id FOREIGN KEY (sourcestorage_id) REFERENCES sourcestorage (id);\n--------------------------------------------------------------------------------\n\n\n-- Project configuration -------------------------------------------------------\nCREATE TABLE projectconfig (\n    id              BIGINT          NOT NULL,\n    description     TEXT,\n    name            VARCHAR(255),\n    path            VARCHAR(255)    NOT NULL,\n    type            VARCHAR(255),\n    source_id       BIGINT,\n    projects_id     BIGINT,\n\n    PRIMARY KEY (id)\n);\n\n-- constraints\nALTER TABLE projectconfig ADD CONSTRAINT fk_projectconfig_projects_id FOREIGN KEY (projects_id) REFERENCES workspaceconfig (id);\nALTER TABLE projectconfig ADD CONSTRAINT fk_projectconfig_source_id FOREIGN KEY (source_id) REFERENCES sourcestorage (id);\n--------------------------------------------------------------------------------\n\n\n-- Project attributes ----------------------------------------------------------\nCREATE TABLE projectattribute (\n    id              BIGINT          NOT NULL,\n    name            VARCHAR(255),\n    dbattributes_id BIGINT,\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE projectattribute ADD CONSTRAINT fk_projectattribute_dbattributes_id FOREIGN KEY (dbattributes_id) REFERENCES projectconfig (id);\n--------------------------------------------------------------------------------\n\n\n-- Project attribute values ----------------------------------------------------\nCREATE TABLE projectattribute_values (\n    projectattribute_id     BIGINT,\n    `values_param`          VARCHAR(255)\n);\n--constraints\nALTER TABLE projectattribute_values ADD CONSTRAINT fk_projectattribute_values_projectattribute_id FOREIGN KEY (projectattribute_id) REFERENCES projectattribute (id);\n--------------------------------------------------------------------------------\n\n\n-- Project mixins --------------------------------------------------------------\nCREATE TABLE projectconfig_mixins (\n    projectconfig_id    BIGINT,\n    mixins              VARCHAR(255)\n);\n--constraints\nALTER TABLE projectconfig_mixins ADD CONSTRAINT fk_projectconfig_mixins_projectconfig_id FOREIGN KEY (projectconfig_id) REFERENCES projectconfig (id);\n--------------------------------------------------------------------------------\n\n\n-- Commands --------------------------------------------------------------------\nCREATE TABLE command (\n    id              BIGINT      NOT NULL,\n    commandline     TEXT,\n    name            VARCHAR(255) NOT NULL,\n    type            VARCHAR(255) NOT NULL,\n    commands_id     BIGINT,\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE command ADD CONSTRAINT fk_command_commands_id FOREIGN KEY (commands_id) REFERENCES workspaceconfig (id);\n--------------------------------------------------------------------------------\n\n\n-- Command attributes ----------------------------------------------------------\nCREATE TABLE command_attributes (\n    command_id  BIGINT,\n    value_param TEXT,\n    name        VARCHAR(255)\n);\n--constraints\nALTER TABLE command_attributes ADD CONSTRAINT fk_command_attributes_command_id FOREIGN KEY (command_id) REFERENCES command (id);\n--------------------------------------------------------------------------------\n\n\n-- Workspace Environments ------------------------------------------------------\nCREATE TABLE environment (\n    id                  BIGINT          NOT NULL,\n    content             TEXT,\n    contenttype         VARCHAR(255),\n    location            TEXT,\n    type                VARCHAR(255),\n    environments_id     BIGINT,\n    environments_key    VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE environment ADD CONSTRAINT fk_environment_environments_id FOREIGN KEY (environments_id) REFERENCES workspaceconfig (id);\n--------------------------------------------------------------------------------\n\n\n-- Environment machines --------------------------------------------------------\nCREATE TABLE externalmachine (\n    id              BIGINT          NOT NULL,\n    machines_id     BIGINT,\n    machines_key    VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE externalmachine ADD CONSTRAINT fk_externalmachine_machines_id FOREIGN KEY (machines_id) REFERENCES environment (id);\n--------------------------------------------------------------------------------\n\n\n-- Environment machine agents  -------------------------------------------------\nCREATE TABLE externalmachine_agents (\n    externalmachine_id  BIGINT,\n    agents              VARCHAR(255)\n);\n-- constraints\nALTER TABLE externalmachine_agents ADD CONSTRAINT fk_externalmachine_agents_externalmachine_id FOREIGN KEY (externalmachine_id) REFERENCES externalmachine (id);\n--------------------------------------------------------------------------------\n\n\n-- Environment machine attributes ----------------------------------------------\nCREATE TABLE externalmachine_attributes (\n    externalmachine_id      BIGINT,\n    attributes              VARCHAR(255),\n    attributes_key          VARCHAR(255)\n);\n--constraints\nALTER TABLE externalmachine_attributes ADD CONSTRAINT fk_externalmachine_attributes_externalmachine_id FOREIGN KEY (externalmachine_id) REFERENCES externalmachine (id);\n--------------------------------------------------------------------------------\n\n\n-- Machine servers configuration -----------------------------------------------\nCREATE TABLE serverconf (\n    id              BIGINT          NOT NULL,\n    port            VARCHAR(255),\n    protocol        VARCHAR(255),\n    servers_id      BIGINT,\n    servers_key     VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE serverconf ADD CONSTRAINT fk_serverconf_servers_id FOREIGN KEY (servers_id) REFERENCES externalmachine (id);\n--------------------------------------------------------------------------------\n\n-- Machine server properties ---------------------------------------------------\nCREATE TABLE serverconf_properties (\n    serverconf_id       BIGINT,\n    properties          VARCHAR(255),\n    properties_key      VARCHAR(255)\n);\n--constraints\nALTER TABLE serverconf_properties ADD CONSTRAINT fk_serverconf_properties_serverconf_id FOREIGN KEY (serverconf_id) REFERENCES serverconf (id);\n--------------------------------------------------------------------------------\n\n\n-- Workspace snapshots ---------------------------------------------------------\nCREATE TABLE snapshot (\n    id              VARCHAR(255)        NOT NULL,\n    creationdate    BIGINT,\n    description     TEXT,\n    envname         VARCHAR(255)        NOT NULL,\n    isdev           BOOLEAN,\n    machinename     VARCHAR(255)        NOT NULL,\n    type            VARCHAR(255),\n    workspaceid     VARCHAR(255)        NOT NULL,\n    content         TEXT,\n    location        VARCHAR(255),\n    source_type     VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--indexes\nCREATE UNIQUE INDEX index_snapshot_workspaceid_envname_machinename ON snapshot (workspaceid, envname, machinename);\n--constraints\nALTER TABLE snapshot ADD CONSTRAINT fk_snapshot_workspaceid FOREIGN KEY (workspaceid) REFERENCES workspace (id);\n--------------------------------------------------------------------------------\n\n\n-- Recipe ----------------------------------------------------------------------\nCREATE TABLE recipe (\n    id              VARCHAR(255) NOT NULL,\n    creator         VARCHAR(255),\n    description     TEXT,\n    name            VARCHAR(255),\n    script          TEXT,\n    type            VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Recipe tags -----------------------------------------------------------------\nCREATE TABLE recipe_tags (\n    recipe_id   VARCHAR(255),\n    tag         VARCHAR(255)\n);\n--indexes\nCREATE INDEX index_recipe_tags_tag ON recipe_tags (tag);\n--constraints\nALTER TABLE recipe_tags ADD CONSTRAINT fs_recipe_tags_recipe_id FOREIGN KEY (recipe_id) REFERENCES recipe (id);\n--------------------------------------------------------------------------------\n\n\n-- Stack -----------------------------------------------------------------------\nCREATE TABLE stack (\n    id                  VARCHAR(255)        NOT NULL,\n    creator             VARCHAR(255),\n    description         TEXT,\n    name                VARCHAR(255)        NOT NULL    UNIQUE,\n    scope               VARCHAR(255),\n    origin              VARCHAR(255),\n    type                VARCHAR(255),\n    data                BLOB,\n    mediatype           VARCHAR(255),\n    icon_name           VARCHAR(255),\n    workspaceconfig_id  BIGINT,\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE stack ADD CONSTRAINT fk_stack_workspaceconfig_id FOREIGN KEY (workspaceconfig_id) REFERENCES workspaceconfig (id);\n--------------------------------------------------------------------------------\n\n\n-- Stack components ------------------------------------------------------------\nCREATE TABLE stack_components (\n    name        VARCHAR(255),\n    version     VARCHAR(255),\n    stack_id    VARCHAR(255)\n);\n--constraints\nALTER TABLE stack_components ADD CONSTRAINT fk_stack_components_stack_id FOREIGN KEY (stack_id) REFERENCES stack (id);\n--------------------------------------------------------------------------------\n\n\n-- Stack tags ------------------------------------------------------------------\nCREATE TABLE stack_tags (\n    stack_id    VARCHAR(255),\n    tag         VARCHAR(255)\n);\n--indexes\nCREATE INDEX index_stack_tags_tag ON stack_tags (tag);\n--constraints\nALTER TABLE stack_tags ADD CONSTRAINT fk_stack_tags_stack_id FOREIGN KEY (stack_id) REFERENCES stack (id);\n--------------------------------------------------------------------------------\n\n-- Sequence table --------------------------------------------------------------\nCREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT NUMERIC(38), PRIMARY KEY (SEQ_NAME));\nINSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 0);\n--------------------------------------------------------------------------------\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.0.0-M9/1__add_index_on_workspace_temporary.sql",
    "content": "--\n-- Copyright (c) 2012-2016 Codenvy, S.A.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Codenvy, S.A. - initial API and implementation\n--\n\n--indexes\nCREATE INDEX index_workspace_istemporary ON workspace (istemporary);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.0.0-M9/2__update_local_links_in_environments.sql",
    "content": "--\n-- Copyright (c) 2012-2016 Codenvy, S.A.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Codenvy, S.A. - initial API and implementation\n--\n\nUPDATE environment\nSET location=regexp_replace(location, '${che.api}', '');\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.0.0-M9/mysql/2__update_local_links_in_environments.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nUPDATE environment\nSET location=REPLACE(location, '${che.api}', '');\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.11.0/1__optimize_user_search.sql",
    "content": "--\n--  [2012] - [2017] Codenvy, S.A.\n--  All Rights Reserved.\n--\n-- NOTICE:  All information contained herein is, and remains\n-- the property of Codenvy S.A. and its suppliers,\n-- if any.  The intellectual and technical concepts contained\n-- herein are proprietary to Codenvy S.A.\n-- and its suppliers and may be covered by U.S. and Foreign Patents,\n-- patents in process, and are protected by trade secret or copyright law.\n-- Dissemination of this information or reproduction of this material\n-- is strictly forbidden unless prior written permission is obtained\n-- from Codenvy S.A..\n--\n\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.11.0/postgresql/1__optimize_user_search.sql",
    "content": "--\n--  [2012] - [2017] Codenvy, S.A.\n--  All Rights Reserved.\n--\n-- NOTICE:  All information contained herein is, and remains\n-- the property of Codenvy S.A. and its suppliers,\n-- if any.  The intellectual and technical concepts contained\n-- herein are proprietary to Codenvy S.A.\n-- and its suppliers and may be covered by U.S. and Foreign Patents,\n-- patents in process, and are protected by trade secret or copyright law.\n-- Dissemination of this information or reproduction of this material\n-- is strictly forbidden unless prior written permission is obtained\n-- from Codenvy S.A..\n--\nCREATE EXTENSION IF NOT EXISTS pg_trgm;\nCREATE INDEX index_user_lower_email ON usr USING GIN (LOWER(email) gin_trgm_ops);\nCREATE INDEX index_user_lower_name ON usr USING GIN (LOWER(name) gin_trgm_ops);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.2.0/1__increase_project_attributes_values_length.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Codenvy, S.A.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Codenvy, S.A. - initial API and implementation\n--\n\nALTER TABLE projectattribute_values ALTER COLUMN values_param TYPE TEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.2.0/mysql/1__increase_project_attributes_values_length.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE projectattribute_values MODIFY COLUMN `values_param` MEDIUMTEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.4.0/1__drop_user_to_account_relation.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Codenvy, S.A.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Codenvy, S.A. - initial API and implementation\n--\n\nALTER TABLE usr ADD name VARCHAR(255);\n\nUPDATE usr\nSET name = ( SELECT name\n             FROM account\n             WHERE id = usr.account_id );\n\nALTER TABLE usr ALTER COLUMN name SET NOT NULL;\n\nCREATE UNIQUE INDEX index_user_name ON usr (name);\n\nALTER TABLE usr DROP COLUMN account_id;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.4.0/2__create_missed_account_indexes.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Codenvy, S.A.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Codenvy, S.A. - initial API and implementation\n--\n\nCREATE INDEX index_account_type ON account (type);\nCREATE INDEX index_workspace_accountid ON workspace (accountid);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.4.0/mysql/1__drop_user_to_account_relation.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE usr ADD name VARCHAR(255);\n\nUPDATE usr\nSET name = ( SELECT name\n             FROM account\n             WHERE id = usr.account_id );\n\nALTER TABLE usr MODIFY name VARCHAR(255) NOT NULL;\n\nCREATE UNIQUE INDEX index_user_name ON usr (name);\n\nALTER TABLE usr DROP FOREIGN KEY fk_usr_account_id;\n\nALTER TABLE usr DROP COLUMN account_id;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.6.0/1__add_exec_agent_where_terminal_agent_is_present.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Codenvy, S.A.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Codenvy, S.A. - initial API and implementation\n--\n\nINSERT INTO externalmachine_agents\n(externalmachine_id, agents)\n    SELECT externalmachine_id, 'org.eclipse.che.exec'\n    FROM externalmachine_agents\n    WHERE agents = 'org.eclipse.che.terminal'\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.7.0/1__add_factory.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Codenvy, S.A.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Codenvy, S.A. - initial API and implementation\n--\n\n-- Factory button --------------------------------------------------------------\nCREATE TABLE che_factory_button (\n    id          BIGINT          NOT NULL,\n    type        VARCHAR(255),\n    color       VARCHAR(255),\n    counter     BOOLEAN,\n    logo        VARCHAR(255),\n    style       VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Factory action --------------------------------------------------------------\nCREATE TABLE che_factory_action (\n    entity_id       BIGINT          NOT NULL,\n    id              VARCHAR(255),\n\n    PRIMARY KEY (entity_id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Factory action properties ---------------------------------------------------\nCREATE TABLE che_factory_action_properties (\n    action_entity_id        BIGINT          NOT NULL,\n    property_value          VARCHAR(255),\n    property_key            VARCHAR(255)\n);\n-- constraints\nALTER TABLE che_factory_action_properties ADD CONSTRAINT fk_che_f_action_props_action_entity_id FOREIGN KEY (action_entity_id) REFERENCES che_factory_action (entity_id);\nCREATE INDEX che_f_action_entity_id_fk ON che_factory_action_properties (action_entity_id);\n--------------------------------------------------------------------------------\n\n\n-- Factory on app closed action ------------------------------------------------\nCREATE TABLE che_factory_on_app_closed_action (\n    id      BIGINT      NOT NULL,\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Factory on projects loaded action -------------------------------------------\nCREATE TABLE che_factory_on_projects_loaded_action (\n    id      BIGINT      NOT NULL,\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Factory on app loaded action ------------------------------------------------\nCREATE TABLE che_factory_on_app_loaded_action (\n    id      BIGINT      NOT NULL,\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Factory on app closed action value ------------------------------------------\nCREATE TABLE che_factory_on_app_closed_action_value (\n    on_app_closed_id    BIGINT      NOT NULL,\n    action_entity_id    BIGINT      NOT NULL,\n\n    PRIMARY KEY (on_app_closed_id, action_entity_id)\n);\n-- constraints\nALTER TABLE che_factory_on_app_closed_action_value ADD CONSTRAINT fk_che_f_on_app_closed_entity_id FOREIGN KEY (action_entity_id) REFERENCES che_factory_action (entity_id);\nALTER TABLE che_factory_on_app_closed_action_value ADD CONSTRAINT fk_che_f_on_app_closed_action_id FOREIGN KEY (on_app_closed_id) REFERENCES che_factory_on_app_closed_action (id);\n--------------------------------------------------------------------------------\n\n\n-- Factory on project loaded action --------------------------------------------\nCREATE TABLE che_factory_on_projects_loaded_action_value (\n    on_projects_loaded_id       BIGINT      NOT NULL,\n    action_entity_id            BIGINT      NOT NULL,\n\n    PRIMARY KEY (on_projects_loaded_id, action_entity_id)\n);\n-- constraints\nALTER TABLE che_factory_on_projects_loaded_action_value ADD CONSTRAINT fk_che_f_on_projects_loaded_entity_id FOREIGN KEY (action_entity_id) REFERENCES che_factory_action (entity_id);\nALTER TABLE che_factory_on_projects_loaded_action_value ADD CONSTRAINT fk_che_f_on_projects_loaded_action_id FOREIGN KEY (on_projects_loaded_id) REFERENCES che_factory_on_projects_loaded_action (id);\n--------------------------------------------------------------------------------\n\n\n-- Factory on app loaded action ------------------------------------------------\nCREATE TABLE che_factory_on_app_loaded_action_value (\n    on_app_loaded_id       BIGINT      NOT NULL,\n    action_entity_id       BIGINT      NOT NULL,\n\n    PRIMARY KEY (on_app_loaded_id, action_entity_id)\n);\n-- constraints\nALTER TABLE che_factory_on_app_loaded_action_value ADD CONSTRAINT fk_che_f_on_app_loaded_entity_id FOREIGN KEY (action_entity_id) REFERENCES che_factory_action (entity_id);\nALTER TABLE che_factory_on_app_loaded_action_value ADD CONSTRAINT fk_che_f_on_app_loaded_action_id FOREIGN KEY (on_app_loaded_id) REFERENCES che_factory_on_app_loaded_action (id);\n--------------------------------------------------------------------------------\n\n\n-- Factory ide -----------------------------------------------------------------\nCREATE TABLE che_factory_ide (\n    id                      BIGINT      NOT NULL,\n    on_app_closed_id        BIGINT,\n    on_app_loaded_id        BIGINT,\n    on_projects_loaded_id   BIGINT,\n\n    PRIMARY KEY (id)\n);\n-- constraints\nALTER TABLE che_factory_ide ADD CONSTRAINT fk_che_f_ide_on_app_closed_id FOREIGN KEY (on_app_closed_id) REFERENCES che_factory_on_app_closed_action (id);\nALTER TABLE che_factory_ide ADD CONSTRAINT fk_che_f_ide_on_projects_loaded_id FOREIGN KEY (on_projects_loaded_id) REFERENCES che_factory_on_projects_loaded_action (id);\nALTER TABLE che_factory_ide ADD CONSTRAINT fk_che_f_ide_on_app_loaded_id FOREIGN KEY (on_app_loaded_id) REFERENCES che_factory_on_app_loaded_action (id);\n--------------------------------------------------------------------------------\n\n\n-- Factory ---------------------------------------------------------------------\nCREATE TABLE che_factory (\n    id                  VARCHAR(255)         NOT NULL,\n    name                VARCHAR(255),\n    version             VARCHAR(255)         NOT NULL,\n    created             BIGINT,\n    user_id             VARCHAR(255),\n    creation_strategy   VARCHAR(255),\n    match_reopen        VARCHAR(255),\n    referrer            VARCHAR(255),\n    since               BIGINT,\n    until               BIGINT,\n    button_id           BIGINT,\n    ide_id              BIGINT,\n    workspace_id        BIGINT,\n\n    PRIMARY KEY (id)\n);\n-- constraints\nALTER TABLE che_factory ADD CONSTRAINT fk_che_f_user_id FOREIGN KEY (user_id) REFERENCES usr (id);\nALTER TABLE che_factory ADD CONSTRAINT fk_che_f_workspace_id FOREIGN KEY (workspace_id) REFERENCES workspaceconfig (id);\nALTER TABLE che_factory ADD CONSTRAINT fk_che_f_button_id FOREIGN KEY (button_id) REFERENCES che_factory_button (id);\nALTER TABLE che_factory ADD CONSTRAINT fk_che_f_ide_id FOREIGN KEY (ide_id) REFERENCES che_factory_ide (id);\nCREATE UNIQUE INDEX index_che_factory_name_user_id ON che_factory (user_id, name);\n--------------------------------------------------------------------------------\n\n\n-- Factory Images --------------------------------------------------------------\nCREATE TABLE che_factory_image (\n    image_data   BYTEA,\n    media_type   VARCHAR(255),\n    name         VARCHAR(255),\n    factory_id   VARCHAR(255)   NOT NULL\n);\n-- constraints\nALTER TABLE che_factory_image ADD CONSTRAINT fk_che_factory_image_factory_id FOREIGN KEY (factory_id) REFERENCES che_factory (id);\n--------------------------------------------------------------------------------\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.7.0/2__remove_match_policy.sql",
    "content": "--\n--  [2012] - [2017] Codenvy, S.A.\n--  All Rights Reserved.\n--\n-- NOTICE:  All information contained herein is, and remains\n-- the property of Codenvy S.A. and its suppliers,\n-- if any.  The intellectual and technical concepts contained\n-- herein are proprietary to Codenvy S.A.\n-- and its suppliers and may be covered by U.S. and Foreign Patents,\n-- patents in process, and are protected by trade secret or copyright law.\n-- Dissemination of this information or reproduction of this material\n-- is strictly forbidden unless prior written permission is obtained\n-- from Codenvy S.A..\n--\n\nALTER TABLE che_factory DROP COLUMN match_reopen;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.7.0/mysql/1__add_factory.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Factory button --------------------------------------------------------------\nCREATE TABLE che_factory_button (\n    id          BIGINT          NOT NULL,\n    type        VARCHAR(255),\n    color       VARCHAR(255),\n    counter     BOOLEAN,\n    logo        VARCHAR(255),\n    style       VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Factory action --------------------------------------------------------------\nCREATE TABLE che_factory_action (\n    entity_id       BIGINT          NOT NULL,\n    id              VARCHAR(255),\n\n    PRIMARY KEY (entity_id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Factory action properties ---------------------------------------------------\nCREATE TABLE che_factory_action_properties (\n    action_entity_id        BIGINT          NOT NULL,\n    property_value          VARCHAR(255),\n    property_key            VARCHAR(255)\n);\n-- constraints\nALTER TABLE che_factory_action_properties ADD CONSTRAINT fk_che_f_action_props_action_entity_id FOREIGN KEY (action_entity_id) REFERENCES che_factory_action (entity_id);\nCREATE INDEX che_f_action_entity_id_fk ON che_factory_action_properties (action_entity_id);\n--------------------------------------------------------------------------------\n\n\n-- Factory on app closed action ------------------------------------------------\nCREATE TABLE che_factory_on_app_closed_action (\n    id      BIGINT      NOT NULL,\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Factory on projects loaded action -------------------------------------------\nCREATE TABLE che_factory_on_projects_loaded_action (\n    id      BIGINT      NOT NULL,\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Factory on app loaded action ------------------------------------------------\nCREATE TABLE che_factory_on_app_loaded_action (\n    id      BIGINT      NOT NULL,\n\n    PRIMARY KEY (id)\n);\n--------------------------------------------------------------------------------\n\n\n-- Factory on app closed action value ------------------------------------------\nCREATE TABLE che_factory_on_app_closed_action_value (\n    on_app_closed_id    BIGINT      NOT NULL,\n    action_entity_id    BIGINT      NOT NULL,\n\n    PRIMARY KEY (on_app_closed_id, action_entity_id)\n);\n-- constraints\nALTER TABLE che_factory_on_app_closed_action_value ADD CONSTRAINT fk_che_f_on_app_closed_entity_id FOREIGN KEY (action_entity_id) REFERENCES che_factory_action (entity_id);\nALTER TABLE che_factory_on_app_closed_action_value ADD CONSTRAINT fk_che_f_on_app_closed_action_id FOREIGN KEY (on_app_closed_id) REFERENCES che_factory_on_app_closed_action (id);\n--------------------------------------------------------------------------------\n\n\n-- Factory on project loaded action --------------------------------------------\nCREATE TABLE che_factory_on_projects_loaded_action_value (\n    on_projects_loaded_id       BIGINT      NOT NULL,\n    action_entity_id            BIGINT      NOT NULL,\n\n    PRIMARY KEY (on_projects_loaded_id, action_entity_id)\n);\n-- constraints\nALTER TABLE che_factory_on_projects_loaded_action_value ADD CONSTRAINT fk_che_f_on_projects_loaded_entity_id FOREIGN KEY (action_entity_id) REFERENCES che_factory_action (entity_id);\nALTER TABLE che_factory_on_projects_loaded_action_value ADD CONSTRAINT fk_che_f_on_projects_loaded_action_id FOREIGN KEY (on_projects_loaded_id) REFERENCES che_factory_on_projects_loaded_action (id);\n--------------------------------------------------------------------------------\n\n\n-- Factory on app loaded action ------------------------------------------------\nCREATE TABLE che_factory_on_app_loaded_action_value (\n    on_app_loaded_id       BIGINT      NOT NULL,\n    action_entity_id       BIGINT      NOT NULL,\n\n    PRIMARY KEY (on_app_loaded_id, action_entity_id)\n);\n-- constraints\nALTER TABLE che_factory_on_app_loaded_action_value ADD CONSTRAINT fk_che_f_on_app_loaded_entity_id FOREIGN KEY (action_entity_id) REFERENCES che_factory_action (entity_id);\nALTER TABLE che_factory_on_app_loaded_action_value ADD CONSTRAINT fk_che_f_on_app_loaded_action_id FOREIGN KEY (on_app_loaded_id) REFERENCES che_factory_on_app_loaded_action (id);\n--------------------------------------------------------------------------------\n\n\n-- Factory ide -----------------------------------------------------------------\nCREATE TABLE che_factory_ide (\n    id                      BIGINT      NOT NULL,\n    on_app_closed_id        BIGINT,\n    on_app_loaded_id        BIGINT,\n    on_projects_loaded_id   BIGINT,\n\n    PRIMARY KEY (id)\n);\n-- constraints\nALTER TABLE che_factory_ide ADD CONSTRAINT fk_che_f_ide_on_app_closed_id FOREIGN KEY (on_app_closed_id) REFERENCES che_factory_on_app_closed_action (id);\nALTER TABLE che_factory_ide ADD CONSTRAINT fk_che_f_ide_on_projects_loaded_id FOREIGN KEY (on_projects_loaded_id) REFERENCES che_factory_on_projects_loaded_action (id);\nALTER TABLE che_factory_ide ADD CONSTRAINT fk_che_f_ide_on_app_loaded_id FOREIGN KEY (on_app_loaded_id) REFERENCES che_factory_on_app_loaded_action (id);\n--------------------------------------------------------------------------------\n\n\n-- Factory ---------------------------------------------------------------------\nCREATE TABLE che_factory (\n    id                  VARCHAR(255)         NOT NULL,\n    name                VARCHAR(255),\n    version             VARCHAR(255)         NOT NULL,\n    created             BIGINT,\n    user_id             VARCHAR(255),\n    creation_strategy   VARCHAR(255),\n    match_reopen        VARCHAR(255),\n    referrer            VARCHAR(255),\n    since               BIGINT,\n    until               BIGINT,\n    button_id           BIGINT,\n    ide_id              BIGINT,\n    workspace_id        BIGINT,\n\n    PRIMARY KEY (id)\n);\n-- constraints\nALTER TABLE che_factory ADD CONSTRAINT fk_che_f_user_id FOREIGN KEY (user_id) REFERENCES usr (id);\nALTER TABLE che_factory ADD CONSTRAINT fk_che_f_workspace_id FOREIGN KEY (workspace_id) REFERENCES workspaceconfig (id);\nALTER TABLE che_factory ADD CONSTRAINT fk_che_f_button_id FOREIGN KEY (button_id) REFERENCES che_factory_button (id);\nALTER TABLE che_factory ADD CONSTRAINT fk_che_f_ide_id FOREIGN KEY (ide_id) REFERENCES che_factory_ide (id);\nCREATE UNIQUE INDEX index_che_factory_name_user_id ON che_factory (user_id, name);\n--------------------------------------------------------------------------------\n\n\n-- Factory Images --------------------------------------------------------------\nCREATE TABLE che_factory_image (\n    image_data   BLOB,\n    media_type   VARCHAR(255),\n    name         VARCHAR(255),\n    factory_id   VARCHAR(255)   NOT NULL\n);\n-- constraints\nALTER TABLE che_factory_image ADD CONSTRAINT fk_che_factory_image_factory_id FOREIGN KEY (factory_id) REFERENCES che_factory (id);\n--------------------------------------------------------------------------------\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/5.8.0/1__add_foreigh_key_indexes.sql",
    "content": "--\n--  [2012] - [2017] Codenvy, S.A.\n--  All Rights Reserved.\n--\n-- NOTICE:  All information contained herein is, and remains\n-- the property of Codenvy S.A. and its suppliers,\n-- if any.  The intellectual and technical concepts contained\n-- herein are proprietary to Codenvy S.A.\n-- and its suppliers and may be covered by U.S. and Foreign Patents,\n-- patents in process, and are protected by trade secret or copyright law.\n-- Dissemination of this information or reproduction of this material\n-- is strictly forbidden unless prior written permission is obtained\n-- from Codenvy S.A..\n--\n\nCREATE INDEX index_command_attributes_commandid ON command_attributes (command_id);\nCREATE INDEX index_command_commandsid ON command (commands_id);\n\nCREATE INDEX index_factory_action_properties_entityid ON che_factory_action_properties (action_entity_id);\nCREATE INDEX index_factory_buttonid ON che_factory (button_id);\nCREATE INDEX index_factory_ideid ON che_factory (ide_id);\nCREATE INDEX index_factory_userid ON che_factory (user_id);\nCREATE INDEX index_factory_workspaceid ON che_factory (workspace_id);\nCREATE INDEX index_factory_images_factoryid ON che_factory_image (factory_id);\nCREATE INDEX index_ide_onappclosedid ON che_factory_ide (on_app_closed_id);\nCREATE INDEX index_ide_onapploadedid ON che_factory_ide (on_app_loaded_id);\nCREATE INDEX index_ide_onprojectsloadedid ON che_factory_ide (on_projects_loaded_id);\n\nCREATE INDEX index_environment_environmentsid ON environment (environments_id);\nCREATE INDEX index_externalmachine_agents_externalmachineid ON externalmachine_agents (externalmachine_id);\nCREATE INDEX index_externalmachine_attributes_externalmachineid ON externalmachine_attributes (externalmachine_id);\nCREATE INDEX index_externalmachine_machinesid ON externalmachine (machines_id);\n\nCREATE INDEX index_preference_preferences_userid ON preference_preferences (preference_userid);\nCREATE INDEX index_profile_attributes_userid ON profile_attributes (user_id);\nCREATE INDEX index_projectattribute_dbattributesid ON projectattribute (dbattributes_id);\nCREATE INDEX index_projectattribute_values_projectattributeid ON projectattribute_values (projectattribute_id);\nCREATE INDEX index_projectconfig_mixins_projectconfigid ON projectconfig_mixins (projectconfig_id);\nCREATE INDEX index_projectconfig_projectsid ON projectconfig (projects_id);\nCREATE INDEX index_projectconfig_sourceid ON projectconfig (source_id);\nCREATE INDEX index_recipe_tags_recipeid ON recipe_tags (recipe_id);\n\nCREATE INDEX index_serverconf_properties_serverconfid ON serverconf_properties (serverconf_id);\nCREATE INDEX index_serverconf_serversid ON serverconf (servers_id);\nCREATE INDEX index_snapshot_workspaceid ON snapshot (workspaceid);\nCREATE INDEX index_sourcestorage_parameters_sourcestorageid ON sourcestorage_parameters (sourcestorage_id);\nCREATE INDEX index_stack_components_stackid ON stack_components (stack_id);\nCREATE INDEX index_stack_tags_stackid ON stack_tags (stack_id);\nCREATE INDEX index_stack_workspaceconfigid ON stack (workspaceconfig_id);\n\nCREATE INDEX index_user_aliases_userid ON user_aliases (user_id);\nCREATE INDEX index_workspace_configid ON workspace (config_id);\nCREATE INDEX index_workspace_attributes_workspaceid ON workspace_attributes (workspace_id);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/10__move_dockerimage_recipe_location_to_content.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n--Moving location of 'dockerimage' type recipes into content\nUPDATE environment\n     SET content=location,\n         location = null\nWHERE type = 'dockerimage'\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/11__increase_workspace_attributes_values_length.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE workspace_attributes ALTER COLUMN attributes TYPE TEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/12__remove_stack_sources.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE stack DROP COLUMN type;\nALTER TABLE stack DROP COLUMN origin;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/1__add_path_to_serverconf.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE serverconf ADD path VARCHAR(255);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/2__rename_agents_to_installers.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Environment machine installers  -------------------------------------------------\nCREATE TABLE externalmachine_installers (\n    externalmachine_id  BIGINT,\n    installers          VARCHAR(255)\n);\n-- constraints\nALTER TABLE externalmachine_installers ADD CONSTRAINT fk_externalmachine_installers_externalmachine_id FOREIGN KEY (externalmachine_id) REFERENCES externalmachine (id);\n\nINSERT INTO externalmachine_installers\nSELECT * FROM externalmachine_agents;\n\nDROP TABLE externalmachine_agents;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/3__add_installer.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Installer ---------------------------------------------------------------------\nCREATE TABLE installer (\n    internal_id         BIGINT               NOT NULL,\n    id                  VARCHAR(255)         NOT NULL,\n    name                VARCHAR(255),\n    version             VARCHAR(255)         NOT NULL,\n    description         VARCHAR(255),\n    script              TEXT,\n\n    PRIMARY KEY (internal_id)\n);\n--constraints\nALTER TABLE installer ADD CONSTRAINT unq_installer_key UNIQUE (id, version);\n----------------------------------------------------------------------------------------\n-- Installer dependencies ----------------------------------------------------------------\nCREATE TABLE installer_dependencies (\n    inst_int_id         BIGINT       NOT NULL,\n    dependency          VARCHAR(255) NOT NULL\n);\n--constraints\nALTER TABLE installer_dependencies ADD CONSTRAINT fk_installer_dependencies_inst_int_id FOREIGN KEY (inst_int_id) REFERENCES installer (internal_id);\nALTER TABLE installer_dependencies ADD CONSTRAINT unq_installer_dependency UNIQUE (inst_int_id, dependency);\n----------------------------------------------------------------------------------------\n-- Installer properties ----------------------------------------------------------------\nCREATE TABLE installer_properties (\n    inst_int_id         BIGINT       NOT NULL,\n    name                VARCHAR(255) NOT NULL,\n    value_param         VARCHAR(255) NOT NULL\n);\n--constraints\nALTER TABLE installer_properties ADD CONSTRAINT fk_installer_properties_inst_int_id FOREIGN KEY (inst_int_id) REFERENCES installer (internal_id);\nALTER TABLE installer_properties ADD CONSTRAINT unq_installer_property UNIQUE (inst_int_id, name);\n----------------------------------------------------------------------------------------\n-- Installer properties ----------------------------------------------------------------\nCREATE TABLE installer_servers (\n    id                  BIGINT,\n    inst_int_id         BIGINT,\n    server_key          VARCHAR(255),\n    port                VARCHAR(255),\n    protocol            VARCHAR(255),\n    path                VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE installer_servers ADD CONSTRAINT fk_installer_servers_inst_int_id FOREIGN KEY (inst_int_id) REFERENCES installer (internal_id);\nALTER TABLE installer_servers ADD CONSTRAINT unq_installer_server UNIQUE (inst_int_id, server_key);\n----------------------------------------------------------------------------------------\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/4__remove_old_recipe.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nDROP TABLE recipe_tags;\nDROP TABLE recipe;\n\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/5__add_machine_env.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Machine env ----------------------------------------------\nCREATE TABLE externalmachine_env (\n    externalmachine_id      BIGINT,\n    env_value               VARCHAR(255),\n    env_key                 VARCHAR(255)\n);\n--constraints\nALTER TABLE externalmachine_env ADD CONSTRAINT fk_externalmachine_env_externalmachine_id FOREIGN KEY (externalmachine_id) REFERENCES externalmachine (id);\n--indexes\nCREATE INDEX index_externalmachine_env_externalmachine_id ON externalmachine_env (externalmachine_id);\n--------------------------------------------------------------------------------\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/6__remove_snapshots.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nDROP TABLE snapshot;\n\nDELETE FROM workspace_attributes\n   WHERE attributes_key = 'snapshotted_at';\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/7__add_machine_volumes.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Machine volumes configuration -----------------------------------------------\nCREATE TABLE machine_volume (\n    id              BIGINT          NOT NULL,\n    name            VARCHAR(255),\n    path            VARCHAR(255)    NOT NULL,\n    machine_id      BIGINT,\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE machine_volume ADD CONSTRAINT fk_machine_volume_id FOREIGN KEY (machine_id) REFERENCES externalmachine (id);\n--------------------------------------------------------------------------------\n--indexes\nCREATE INDEX index_machine_volume_machine_id ON machine_volume (machine_id);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/8__add_serverconf_attributes.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- ServerConfig attributes ----------------------------------------------\nCREATE TABLE serverconf_attributes (\n    serverconf_id           BIGINT,\n    attributes              VARCHAR(255),\n    attributes_key          VARCHAR(255)\n);\n--constraints\nALTER TABLE serverconf_attributes ADD CONSTRAINT fk_serverconf_attributes_serverconf_id FOREIGN KEY (serverconf_id) REFERENCES serverconf (id);\n--indexes\nCREATE INDEX index_serverconf_attributes_serverconf_id ON serverconf_attributes (serverconf_id);\n-------------------------------------------------------------------------\n\n-- InstallerServerConfig attributes ----------------------------------------------\nCREATE TABLE installer_serverconf_attributes (\n    serverconf_id           BIGINT,\n    attributes              VARCHAR(255),\n    attributes_key          VARCHAR(255)\n);\n--constraints\nALTER TABLE installer_serverconf_attributes ADD CONSTRAINT fk_installer_serverconf_attributes_serverconf_id FOREIGN KEY (serverconf_id) REFERENCES installer_servers (id);\n--indexes\nCREATE INDEX index_installer_serverconf_attributes_serverconf_id ON installer_serverconf_attributes (serverconf_id);\n-------------------------------------------------------------------------\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/9__increase_externalmachine_env_value_length.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE externalmachine_env ALTER COLUMN env_value TYPE TEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/mysql/11__increase_workspace_attributes_values_length.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE workspace_attributes MODIFY COLUMN attributes TEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.0.0/mysql/9__increase_externalmachine_env_value_length.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE externalmachine_env MODIFY COLUMN env_value TEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.10.0/1__add_workspace_cfg_attributes.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n--Workspace config attributes ---------------------------------------------------------\nCREATE TABLE che_workspace_cfg_attributes (\n    workspace_id    BIGINT,\n    attributes      VARCHAR(255),\n    attributes_key  VARCHAR(255)\n);\n\n--constraints\nALTER TABLE che_workspace_cfg_attributes ADD CONSTRAINT fk_che_workspace_cfg_attr_workspace_id FOREIGN KEY (workspace_id) REFERENCES workspaceconfig (id);\n--------------------------------------------------------------------------------\n\n--indexes\nCREATE INDEX index_che_workspace_cfg_attributes_ws_id ON che_workspace_cfg_attributes (workspace_id);\n--------------------------------------------------------------------------------\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.10.0/2__change_signature_key_pair_id.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Rename old table\nALTER TABLE che_sign_key_pair RENAME TO che_sign_key_pair_old;\n\n-- Create new key pair table\nCREATE TABLE che_sign_key_pair (\n    workspace_id        VARCHAR(255) NOT NULL,\n    public_key          BIGINT       NOT NULL,\n    private_key         BIGINT       NOT NULL,\n\n    PRIMARY KEY (workspace_id)\n);\n-- Constraint\nALTER TABLE che_sign_key_pair ADD CONSTRAINT fk_sign_workspace_id FOREIGN KEY (workspace_id) REFERENCES workspace (id);\n\n-- Copy data\nINSERT  INTO che_sign_key_pair\nSELECT r.workspace_id, k.public_key, k.private_key\nFROM che_k8s_runtime AS r,\n(SELECT public_key, private_key FROM che_sign_key_pair_old LIMIT 1) AS k;\n\n-- Cleanup\nDROP TABLE che_sign_key_pair_old CASCADE;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.11.0/1__add_signature_key_constraints.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n\n-- remove key pair records which linked to non-existing keys\nDELETE FROM che_sign_key_pair kp\nWHERE NOT EXISTS (\n   SELECT id\n   FROM   che_sign_key k\n   WHERE  k.id = kp.private_key\n   )\nOR NOT EXISTS (\n   SELECT id\n   FROM   che_sign_key k\n   WHERE  k.id = kp.public_key\n   );\n\n-- remove duplicated keys id if any\nDELETE FROM che_sign_key_pair kp1\nWHERE (\n      SELECT count(*) FROM che_sign_key_pair kp2\n      WHERE kp1.private_key = kp2.private_key\n      OR kp1.private_key = kp2.public_key\n      ) > 1;\n\n-- remove keys which have no more key pair references to it\nDELETE FROM che_sign_key k\nWHERE NOT EXISTS (\n      SELECT * FROM che_sign_key_pair kp\n      WHERE kp.private_key = k.id\n      OR kp.public_key = k.id\n      );\n\n-- add pair uniqueness constraint\nCREATE UNIQUE INDEX index_sign_public_private_key_id ON che_sign_key_pair (public_key, private_key);\n\n-- add foreign key indexes\nCREATE INDEX index_sign_public_key_id ON che_sign_key_pair (public_key);\nCREATE INDEX index_sign_private_key_id ON che_sign_key_pair (private_key);\n\n-- add keys table constraints\nALTER TABLE che_sign_key_pair ADD CONSTRAINT fk_sign_public_key_id FOREIGN KEY (public_key) REFERENCES che_sign_key (id);\nALTER TABLE che_sign_key_pair ADD CONSTRAINT fk_sign_private_key_id FOREIGN KEY (private_key) REFERENCES che_sign_key (id);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.11.0/mysql/1__add_signature_key_constraints.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n\n-- remove key pair records which linked to non-existing keys\nDELETE kp FROM che_sign_key_pair AS kp\nWHERE NOT EXISTS (\n   SELECT id\n   FROM   che_sign_key k\n   WHERE  k.id = kp.private_key\n   )\nOR NOT EXISTS (\n   SELECT id\n   FROM   che_sign_key k\n   WHERE  k.id = kp.public_key\n   );\n   \n-- remove duplicated keys id if any\nDELETE FROM che_sign_key_pair\nWHERE (\n      SELECT cnt FROM (SELECT count(*) AS cnt FROM che_sign_key_pair kp2\n      JOIN che_sign_key_pair ON (che_sign_key_pair.private_key = kp2.private_key\n      OR che_sign_key_pair.private_key = kp2.public_key)) AS C\n      ) > 1;\n\n-- remove keys which have no more key pair references to it\nDELETE FROM che_sign_key\nWHERE NOT EXISTS (\n      SELECT * FROM (SELECT public_key FROM che_sign_key_pair kp\n      JOIN che_sign_key ON (kp.private_key = che_sign_key.id\n      OR kp.public_key = che_sign_key.id)) AS S\n      );\n\n-- add pair uniqueness constraint\nCREATE UNIQUE INDEX index_sign_public_private_key_id ON che_sign_key_pair (public_key, private_key);\n\n-- add foreign key indexes\nCREATE INDEX index_sign_public_key_id ON che_sign_key_pair (public_key);\nCREATE INDEX index_sign_private_key_id ON che_sign_key_pair (private_key);\n\n-- add keys table constraints\nALTER TABLE che_sign_key_pair ADD CONSTRAINT fk_sign_public_key_id FOREIGN KEY (public_key) REFERENCES che_sign_key (id);\nALTER TABLE che_sign_key_pair ADD CONSTRAINT fk_sign_private_key_id FOREIGN KEY (private_key) REFERENCES che_sign_key (id);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.12.0/1__rename_project_attributes_values_field.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE projectattribute_values RENAME COLUMN values_param TO attribute_values;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.12.0/mysql/1__rename_project_attributes_values_field.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE projectattribute_values CHANGE `values_param` attribute_values MEDIUMTEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.15.0/1__remove_not_null_constraint_from_env_name_fields.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Allow null as defaultEnv field in workspace config\nALTER TABLE workspaceconfig ALTER COLUMN defaultenv DROP NOT NULL;\n\nALTER TABLE che_k8s_runtime DROP PRIMARY KEY;\nALTER TABLE che_k8s_runtime ADD PRIMARY KEY (workspace_id);\n\n-- Allow null as env_name field in kubernetes runtime\nALTER TABLE che_k8s_runtime ALTER COLUMN env_name DROP NOT NULL;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.15.0/2__add_commands_to_k8s_runtime.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n\n-- Commands --------------------------------------------------------------------\nCREATE TABLE k8s_runtime_command (\n    id              BIGINT         NOT NULL,\n    commandline     TEXT,\n    name            VARCHAR(255)   NOT NULL,\n    type            VARCHAR(255)   NOT NULL,\n    workspace_id    VARCHAR(255),\n\n    PRIMARY KEY (id)\n);\n--indexes\nCREATE INDEX index_k8s_runtime_command_ws_id ON k8s_runtime_command (workspace_id);\n--constraints\nALTER TABLE k8s_runtime_command ADD CONSTRAINT fk_k8s_runtime_workspace_id FOREIGN KEY (workspace_id) REFERENCES che_k8s_runtime (workspace_id);\n--------------------------------------------------------------------------------\n\n\n-- Command attributes ----------------------------------------------------------\nCREATE TABLE k8s_runtime_command_attributes (\n    command_id  BIGINT             NOT NULL,\n    name        VARCHAR(255)       NOT NULL,\n    value_param TEXT\n);\n--indexes\nCREATE INDEX index_k8s_runtime_command_attr_command_id ON k8s_runtime_command_attributes (command_id);\n--constraints\nALTER TABLE k8s_runtime_command_attributes ADD CONSTRAINT fk_k8s_runtime_command_attr_command_id FOREIGN KEY (command_id) REFERENCES k8s_runtime_command (id);\n--------------------------------------------------------------------------------\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.15.0/mysql/1__remove_not_null_constraint_from_env_name_fields.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Allow null as defaultEnv field in workspace config\nALTER TABLE workspaceconfig MODIFY COLUMN defaultenv VARCHAR(255);\n\nALTER TABLE che_k8s_runtime DROP PRIMARY KEY;\nALTER TABLE che_k8s_runtime ADD PRIMARY KEY (workspace_id);\n\n-- Allow null as env_name field in kubernetes runtime\nALTER TABLE che_k8s_runtime MODIFY COLUMN env_name VARCHAR(255);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.15.0/postgresql/1__remove_not_null_constraint_from_env_name_fields.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Allow null as defaultEnv field in workspace config\nALTER TABLE workspaceconfig ALTER COLUMN defaultenv DROP NOT NULL;\n\nALTER TABLE che_k8s_runtime DROP CONSTRAINT che_k8s_runtime_pkey;\nALTER TABLE che_k8s_runtime ADD PRIMARY KEY (workspace_id);\n\n-- Allow null as env_name field in kubernetes runtime\nALTER TABLE che_k8s_runtime ALTER COLUMN env_name DROP NOT NULL;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.16.0/1__increase_workspace_config_attributes_values_length.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE che_workspace_cfg_attributes ALTER COLUMN attributes TYPE TEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.16.0/2__create_workspace_activity_table.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nCREATE TABLE che_workspace_activity (\n    workspace_id               VARCHAR(255) NOT NULL,\n    status                     VARCHAR(255),\n    created                    BIGINT,\n    last_starting              BIGINT,\n    last_running               BIGINT,\n    last_stopping              BIGINT,\n    last_stopped               BIGINT,\n    expiration                 BIGINT,\n\n    PRIMARY KEY (workspace_id)\n);\nALTER TABLE che_workspace_activity ADD CONSTRAINT ws_activity_workspace_id FOREIGN KEY (workspace_id) REFERENCES workspace (id);\nCREATE INDEX che_index_ws_activity_last_starting ON che_workspace_activity (status, last_starting);\nCREATE INDEX che_index_ws_activity_last_running ON che_workspace_activity (status, last_running);\nCREATE INDEX che_index_ws_activity_last_stopping ON che_workspace_activity (status, last_stopping);\nCREATE INDEX che_index_ws_activity_last_stopped ON che_workspace_activity (status, last_stopped);\nCREATE INDEX che_index_ws_activity_expiration ON che_workspace_activity (expiration);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.16.0/3__bootstrap_ws_activity_data.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- copy data from the old workspace expiration table. Leave the old table and data intact, we just\n-- won't be using it anymore, but leave it there so that we don't make breaking schema changes\n-- straight away.\n\n-- We specialize for postgres and mysql, leaving this default for H2.\n\nINSERT INTO che_workspace_activity (workspace_id, created, expiration, status, last_running, last_stopped)\n  SELECT a.workspace_id, cast(a.attributes as bigint), e.expiration,\n    CASE\n      WHEN r.status = '0' THEN 'STARTING'\n      WHEN r.status = '1' THEN 'RUNNING'\n      WHEN r.status = '2' THEN 'STOPPING'\n      ELSE 'STOPPED' -- also handles the lack of explicit status\n    END,\n    cast(a_forRunning.attributes as bigint), cast(a_forStopped.attributes as bigint)\n  FROM workspace_attributes AS a\n  -- pull in the existing expiration times\n  LEFT JOIN che_workspace_expiration AS e\n    ON a.workspace_id = e.workspace_id\n  -- pull in the recorded current status of the workspaces\n  LEFT JOIN che_k8s_runtime AS r\n    ON a.workspace_id = r.workspace_id\n  -- consider the 'updated' time of a running workspace as its \"last_running\" event time\n  LEFT JOIN workspace_attributes AS a_forRunning\n    ON a.workspace_id = a_forRunning.workspace_id\n    AND r.status = '1'\n    AND a_forRunning.attributes_key = 'updated'\n  -- pick up the 'stopped' timestamp from the workspace attributes (if any)\n  LEFT JOIN workspace_attributes AS a_forStopped\n    ON a.workspace_id = a_forStopped.workspace_id\n    AND a_forStopped.attributes_key = 'stopped'\n  -- we're basing all of the above on workspaces that have the 'created' attribute that stores the\n  -- timestamp when the workspace was created\n  WHERE a.attributes_key = 'created';\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.16.0/mysql/1__increase_workspace_config_attributes_values_length.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE che_workspace_cfg_attributes MODIFY COLUMN attributes TEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.16.0/mysql/3__bootstrap_ws_activity_data.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- copy data from the old workspace expiration table. Leave the old table and data intact, we just\n-- won't be using it anymore, but leave it there so that we don't make breaking schema changes\n-- straight away.\n\nINSERT INTO che_workspace_activity (workspace_id, created, expiration, status, last_running, last_stopped)\n  SELECT a.workspace_id, a.attributes, e.expiration,\n    CASE\n      WHEN r.status = '0' THEN 'STARTING'\n      WHEN r.status = '1' THEN 'RUNNING'\n      WHEN r.status = '2' THEN 'STOPPING'\n      ELSE 'STOPPED' -- also handles the lack of explicit status\n    END,\n    a_forRunning.attributes, a_forStopped.attributes\n  FROM workspace_attributes AS a\n  -- pull in the existing expiration times\n  LEFT JOIN che_workspace_expiration AS e\n    ON a.workspace_id = e.workspace_id\n  -- pull in the recorded current status of the workspaces\n  LEFT JOIN che_k8s_runtime AS r\n    ON a.workspace_id = r.workspace_id\n  -- consider the 'updated' time of a running workspace as its \"last_running\" event time\n  LEFT JOIN workspace_attributes AS a_forRunning\n    ON a.workspace_id = a_forRunning.workspace_id\n    AND r.status = 'RUNNING'\n    AND a_forRunning.attributes_key = 'updated'\n  -- pick up the 'stopped' timestamp from the workspace attributes (if any)\n  LEFT JOIN workspace_attributes AS a_forStopped\n    ON a.workspace_id = a_forStopped.workspace_id\n    AND a_forStopped.attributes_key = 'stopped'\n  -- we're basing all of the above on workspaces that have the 'created' attribute that stores the\n  -- timestamp when the workspace was created\n  WHERE a.attributes_key = 'created';\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.17.0/1__convert_enums_to_strings.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nUPDATE che_k8s_machine SET status = 'STARTING' WHERE status = '0';\nUPDATE che_k8s_machine SET status = 'RUNNING' WHERE status = '1';\nUPDATE che_k8s_machine SET status = 'STOPPED' WHERE status = '2';\nUPDATE che_k8s_machine SET status = 'FAILED' WHERE status = '3';\n\nUPDATE che_k8s_runtime SET status = 'STARTING' WHERE status = '0';\nUPDATE che_k8s_runtime SET status = 'RUNNING' WHERE status = '1';\nUPDATE che_k8s_runtime SET status = 'STOPPING' WHERE status = '2';\nUPDATE che_k8s_runtime SET status = 'STOPPED' WHERE status = '3';\n\nUPDATE che_k8s_server SET status = 'RUNNING' WHERE status = '0';\nUPDATE che_k8s_server SET status = 'STOPPED' WHERE status = '1';\nUPDATE che_k8s_server SET status = 'UNKNOWN' WHERE status = '2';\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.3.0/1__add_fk_indexes.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Indexes for \"reference-side\" foreign keys\nCREATE INDEX che_index_externalmachine_installers_externalmachine_id ON externalmachine_installers(externalmachine_id);\nCREATE INDEX che_index_factory_on_app_closed_action_value_action_entity_id ON che_factory_on_app_closed_action_value(action_entity_id);\nCREATE INDEX che_index_factory_on_app_loaded_action_value_action_entity_id ON che_factory_on_app_loaded_action_value(action_entity_id);\nCREATE INDEX che_index_factory_on_projects_loaded_action_value_action_entity_id ON che_factory_on_projects_loaded_action_value(action_entity_id);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.3.0/mysql/1__add_fk_indexes.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Indexes for \"reference-side\" foreign keys\nCREATE INDEX che_index_externalmachine_installers_externalmachine_id ON externalmachine_installers(externalmachine_id);\nCREATE INDEX che_index_factory_on_app_closed_action_value_action_entity_id ON che_factory_on_app_closed_action_value(action_entity_id);\nCREATE INDEX che_index_factory_on_app_loaded_action_value_action_entity_id ON che_factory_on_app_loaded_action_value(action_entity_id);\nCREATE INDEX che_index_factory_on_proj_loaded_action_value_action_entity_id ON che_factory_on_projects_loaded_action_value(action_entity_id);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.4.0/1__add_workspace_expirations.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nCREATE TABLE che_workspace_expiration (\n    workspace_id               VARCHAR(255)    NOT NULL,\n    expiration                 BIGINT          NOT NULL,\n\n    PRIMARY KEY (workspace_id)\n);\n--constraints\nALTER TABLE che_workspace_expiration ADD CONSTRAINT ws_expiration_workspace_id FOREIGN KEY (workspace_id) REFERENCES workspace (id);\n--indexes\nCREATE INDEX che_index_ws_expiration_expiration ON che_workspace_expiration (expiration);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.4.0/2__add_signature_key.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Signature key ---------------------------------------------------------------------\nCREATE TABLE che_sign_key (\n    id                    BIGINT       NOT NULL,\n    algorithm             VARCHAR(255) NOT NULL,\n    encoding_format       VARCHAR(255) NOT NULL,\n    encoded_value         BLOB         NOT NULL,\n\n    PRIMARY KEY (id)\n);\n\n-- Signature key pair ----------------------------------------------------------------\nCREATE TABLE che_sign_key_pair (\n    id                  VARCHAR(255) NOT NULL,\n    public_key          BIGINT       NOT NULL,\n    private_key         BIGINT       NOT NULL,\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE che_sign_key_pair ADD CONSTRAINT fk_sign_public_key_id FOREIGN KEY (public_key) REFERENCES che_sign_key (id);\nALTER TABLE che_sign_key_pair ADD CONSTRAINT fk_sign_private_key_id FOREIGN KEY (private_key) REFERENCES che_sign_key (id);\n--indexes\nCREATE INDEX index_sign_public_key_id ON che_sign_key_pair (public_key);\nCREATE INDEX index_sign_private_key_id ON che_sign_key_pair (private_key);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.4.0/3__add_k8s_runtimes.sql",
    "content": "--\n-- Copyright (c) 2012-2018 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Runtimes --------------------------------------------------------------------\nCREATE TABLE che_k8s_runtime (\n    workspace_id    VARCHAR(255)    NOT NULL    UNIQUE,\n    env_name        VARCHAR(255)    NOT NULL,\n    owner_id        VARCHAR(255)    NOT NULL,\n    namespace       VARCHAR(255)    NOT NULL,\n    status          VARCHAR(255)    NOT NULL,\n\n    PRIMARY KEY (workspace_id, env_name, owner_id)\n);\n--indexes\nCREATE UNIQUE INDEX index_che_k8s_runtime_ws_id ON che_k8s_runtime (workspace_id);\n--constraints\nALTER TABLE che_k8s_runtime ADD CONSTRAINT fk_che_k8s_runtime_workspace FOREIGN KEY (workspace_id) REFERENCES workspace (id);\n--------------------------------------------------------------------------------\n\n\n-- Machines ---------------------------------------------------------------------\nCREATE TABLE che_k8s_machine (\n    workspace_id        VARCHAR(255)    NOT NULL,\n    machine_name        VARCHAR(255)    NOT NULL,\n    pod_name            VARCHAR(255)    NOT NULL,\n    container_name      VARCHAR(255)    NOT NULL,\n    status              VARCHAR(255)    NOT NULL,\n\n    PRIMARY KEY (workspace_id, machine_name)\n);\n--constraints\nALTER TABLE che_k8s_machine ADD CONSTRAINT fk_che_k8s_machine_runtime FOREIGN KEY (workspace_id) REFERENCES che_k8s_runtime (workspace_id);\n\n\nCREATE TABLE che_k8s_machine_attributes (\n    workspace_id    VARCHAR(255),\n    machine_name    VARCHAR(255),\n    attribute_key   VARCHAR(255),\n    attribute       VARCHAR(255)\n);\n--indexes\nCREATE INDEX index_che_k8s_machine_attr_workspace_id_machine_name ON che_k8s_machine_attributes(workspace_id, machine_name);\n--constraints\nALTER TABLE che_k8s_machine_attributes ADD CONSTRAINT fk_che_k8s_machine_attributes_machine FOREIGN KEY (workspace_id, machine_name) REFERENCES che_k8s_machine (workspace_id, machine_name);\n--------------------------------------------------------------------------------\n\n\n-- Servers ---------------------------------------------------------------------\nCREATE TABLE che_k8s_server (\n    workspace_id    VARCHAR(255)    NOT NULL,\n    machine_name    VARCHAR(255)    NOT NULL,\n    server_name     VARCHAR(255)    NOT NULL,\n    url             VARCHAR(255)    NOT NULL,\n    status          VARCHAR(255)    NOT NULL,\n\n    PRIMARY KEY (workspace_id, machine_name, server_name)\n);\n\n--constraints\nALTER TABLE che_k8s_server ADD CONSTRAINT fk_che_k8s_server_machine FOREIGN KEY (workspace_id, machine_name) REFERENCES che_k8s_machine (workspace_id, machine_name);\n\nCREATE TABLE che_k8s_server_attributes (\n    workspace_id    VARCHAR(255),\n    machine_name    VARCHAR(255),\n    server_name     VARCHAR(255),\n    attribute_key   VARCHAR(255),\n    attribute       VARCHAR(255)\n);\n--indexes\nCREATE INDEX index_che_k8s_server_attr_ws_id_machine_name ON che_k8s_server_attributes(workspace_id, machine_name, server_name);\n--constraints\nALTER TABLE che_k8s_server_attributes ADD CONSTRAINT fk_che_k8s_server_attributes_machine FOREIGN KEY (workspace_id, machine_name, server_name) REFERENCES che_k8s_server (workspace_id, machine_name, server_name);\n--------------------------------------------------------------------------------\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/6.4.0/postgresql/2__add_signature_key.sql",
    "content": "--\n-- Copyright (c) 2012-2017 Red Hat, Inc.\n-- All rights reserved. This program and the accompanying materials\n-- are made available under the terms of the Eclipse Public License v1.0\n-- which accompanies this distribution, and is available at\n-- http://www.eclipse.org/legal/epl-v10.html\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- Signature key ---------------------------------------------------------------------\nCREATE TABLE che_sign_key (\n    id                    BIGINT       NOT NULL,\n    algorithm             VARCHAR(255) NOT NULL,\n    encoding_format       VARCHAR(255) NOT NULL,\n    encoded_value         BYTEA        NOT NULL,\n\n    PRIMARY KEY (id)\n);\n\n-- Signature key pair ----------------------------------------------------------------\nCREATE TABLE che_sign_key_pair (\n    id                  VARCHAR(255) NOT NULL,\n    public_key          BIGINT       NOT NULL,\n    private_key         BIGINT       NOT NULL,\n\n    PRIMARY KEY (id)\n);\n--constraints\nALTER TABLE che_sign_key_pair ADD CONSTRAINT fk_sign_public_key_id FOREIGN KEY (public_key) REFERENCES che_sign_key (id);\nALTER TABLE che_sign_key_pair ADD CONSTRAINT fk_sign_private_key_id FOREIGN KEY (private_key) REFERENCES che_sign_key (id);\n--indexes\nCREATE INDEX index_sign_public_key_id ON che_sign_key_pair (public_key);\nCREATE INDEX index_sign_private_key_id ON che_sign_key_pair (private_key);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.0.0-beta4.0/1__add_devfile.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- add devfile table\nCREATE TABLE devfile (\n    id            BIGINT          NOT NULL,\n    spec_version  VARCHAR(255)    NOT NULL,\n    name          VARCHAR(255)    NOT NULL,\n\n    PRIMARY KEY (id)\n);\n\n-- devfile attributes\nCREATE TABLE devfile_attributes (\n    devfile_id     BIGINT,\n    value_param    TEXT,\n    name           VARCHAR(255)\n);\n-- constraints & indexes\nALTER TABLE devfile_attributes ADD CONSTRAINT fk_devfile_attributes_devfile_id FOREIGN KEY (devfile_id) REFERENCES devfile (id);\nCREATE UNIQUE INDEX index_devfile_attributes_names ON devfile_attributes (devfile_id, name);\n\n-----------------------------------------------------------------------------------------------------------------------------------\n\n-- devfile project\nCREATE TABLE devfile_project (\n    id                   BIGINT       NOT NULL,\n    name                 VARCHAR(255) NOT NULL,\n    clone_path           TEXT,\n    type                 VARCHAR(255) NOT NULL,\n    location             TEXT,\n    branch               VARCHAR(255),\n    start_point          VARCHAR(255),\n    tag                  VARCHAR(255),\n    commit_id            VARCHAR(255),\n    devfile_id           BIGINT,\n\n    PRIMARY KEY (id)\n);\n-- constraints & indexes\nALTER TABLE devfile_project ADD CONSTRAINT fk_devfile_projects_id FOREIGN KEY (devfile_id) REFERENCES devfile (id);\nCREATE UNIQUE INDEX index_devfile_project_name ON devfile_project (devfile_id, name);\n\n-----------------------------------------------------------------------------------------------------------------------------------\n\n-- devfile command\nCREATE TABLE devfile_command (\n    id                  BIGINT       NOT NULL,\n    name                VARCHAR(255) NOT NULL,\n    devfile_id          BIGINT,\n\n    PRIMARY KEY (id)\n);\n-- constraints & indexes\nALTER TABLE devfile_command ADD CONSTRAINT fk_devfile_command_id FOREIGN KEY (devfile_id) REFERENCES devfile (id);\nCREATE UNIQUE INDEX index_devfile_command_name ON devfile_command (devfile_id, name);\n\n-- devfile command attributes\nCREATE TABLE devfile_command_attributes (\n    devfile_command_id     BIGINT,\n    value_param            TEXT,\n    name                   VARCHAR(255)\n);\n-- constraints & indexes\nALTER TABLE devfile_command_attributes ADD CONSTRAINT fk_devfile_command_attributes_command_id FOREIGN KEY (devfile_command_id) REFERENCES devfile_command (id);\nCREATE UNIQUE INDEX index_devfile_command_attributes_name ON devfile_command_attributes (devfile_command_id, name);\n\n-- devfile command action\nCREATE TABLE devfile_action (\n    id                      BIGINT       NOT NULL,\n    type                    VARCHAR(255) NOT NULL,\n    component               VARCHAR(255) NOT NULL,\n    command                 TEXT NOT NULL,\n    workdir                 TEXT,\n    devfile_command_id      BIGINT,\n\n    PRIMARY KEY (id)\n);\n-- constraints & indexes\nALTER TABLE devfile_action ADD CONSTRAINT fk_devfile_actions_id FOREIGN KEY (devfile_command_id) REFERENCES devfile_command (id);\nCREATE INDEX index_action_command_id ON devfile_action (devfile_command_id);\n\n\n-----------------------------------------------------------------------------------------------------------------------------------\n\n-- devfile component\nCREATE TABLE devfile_component (\n    id                     BIGINT       NOT NULL,\n    type                   VARCHAR(255) NOT NULL,\n    alias                  VARCHAR(255),\n    component_id           TEXT,\n    reference              TEXT,\n    reference_content      TEXT,\n    image                  TEXT,\n    memory_limit           VARCHAR(255),\n    mount_sources          BOOLEAN,\n    devfile_id             BIGINT,\n\n    PRIMARY KEY (id)\n);\n\n-- constraints & indexes\nALTER TABLE devfile_component ADD CONSTRAINT fk_devfile_component_id FOREIGN KEY (devfile_id) REFERENCES devfile (id);\n\n\n-- component command\nCREATE TABLE devfile_component_command (\n    devfile_component_id    BIGINT,\n    command                 TEXT NOT NULL\n);\n\n-- constraints & indexes\nALTER TABLE devfile_component_command ADD CONSTRAINT fk_component_command_component_id FOREIGN KEY (devfile_component_id) REFERENCES devfile_component (id);\nCREATE INDEX index_command_component_id ON devfile_component_command (devfile_component_id);\n\n-- component arg\nCREATE TABLE devfile_component_arg (\n    devfile_component_id    BIGINT,\n    args                    TEXT\n);\n\n--constraints\nALTER TABLE devfile_component_arg ADD CONSTRAINT fk_component_command_arg_id FOREIGN KEY (devfile_component_id) REFERENCES devfile_component (id);\nCREATE INDEX index_args_component_id ON devfile_component_arg (devfile_component_id);\n\n-- component selector\nCREATE TABLE devfile_component_selector (\n    devfile_component_id    BIGINT,\n    selector_key            VARCHAR(255),\n    selector                VARCHAR(255)\n);\n\n-- constraints & indexes\nALTER TABLE devfile_component_selector ADD CONSTRAINT fk_component_selector_id FOREIGN KEY (devfile_component_id) REFERENCES devfile_component (id);\nCREATE UNIQUE INDEX index_devfile_component_selector ON devfile_component_selector (devfile_component_id, selector_key);\n\n-- devfile endpoint\nCREATE TABLE devfile_endpoint (\n    id                      BIGINT       NOT NULL,\n    name                    VARCHAR(255) NOT NULL,\n    port                    INTEGER      NOT NULL,\n    devfile_component_id    BIGINT,\n\n    PRIMARY KEY (id)\n);\n-- constraints & indexes\nALTER TABLE devfile_endpoint ADD CONSTRAINT fk_devfile_endpoint_id FOREIGN KEY (devfile_component_id) REFERENCES devfile_component (id);\nCREATE UNIQUE INDEX index_devfile_endpoint_component_name ON devfile_endpoint (devfile_component_id, name);\n\n-- devfile endpoint attributes\nCREATE TABLE devfile_endpoint_attributes (\n    devfile_endpoint_id    BIGINT,\n    value_param            TEXT,\n    name                   VARCHAR(255)\n);\n-- constraints & indexes\nALTER TABLE devfile_endpoint_attributes ADD CONSTRAINT fk_devfile_endpoint_attributes_id FOREIGN KEY (devfile_endpoint_id) REFERENCES devfile_endpoint (id);\nCREATE UNIQUE INDEX index_devfile_endpoint_attributes_name ON devfile_endpoint_attributes (devfile_endpoint_id, name);\n\n\n-- devfile component env\nCREATE TABLE devfile_env (\n    id                    BIGINT       NOT NULL,\n    name                  VARCHAR(255) NOT NULL,\n    value_param           TEXT,\n    devfile_component_id  BIGINT,\n\n    PRIMARY KEY (id)\n);\n-- constraints & indexes\nALTER TABLE devfile_env ADD CONSTRAINT fk_devfile_env_id FOREIGN KEY (devfile_component_id) REFERENCES devfile_component (id);\nCREATE UNIQUE INDEX index_devfile_env_component_name ON devfile_env (devfile_component_id, name);\n\n\n-- devfile component volume\nCREATE TABLE devfile_volume (\n    id                     BIGINT       NOT NULL,\n    name                   VARCHAR(255) NOT NULL,\n    container_path         TEXT,\n    devfile_component_id   BIGINT,\n\n    PRIMARY KEY (id)\n);\n-- constraints & indexes\nALTER TABLE devfile_volume ADD CONSTRAINT fk_devfile_volumes_id FOREIGN KEY (devfile_component_id) REFERENCES devfile_component (id);\nCREATE UNIQUE INDEX index_devfile_volume_component_name ON devfile_volume (devfile_component_id, name);\n\n-- devfile component entrypoint\nCREATE TABLE devfile_entrypoint (\n    id                         BIGINT       NOT NULL,\n    parent_name                VARCHAR(255) NOT NULL,\n    container_name             VARCHAR(255) NOT NULL,\n    devfile_component_id       BIGINT,\n\n    PRIMARY KEY (id)\n);\n-- constraints & indexes\nALTER TABLE devfile_entrypoint ADD CONSTRAINT fk_devfile_entrypoints_id FOREIGN KEY (devfile_component_id) REFERENCES devfile_component (id);\nCREATE UNIQUE INDEX index_devfile_entrypoint_id_parent_container ON devfile_entrypoint (devfile_component_id, parent_name, container_name);\n\n\n-- entrypoint arg\nCREATE TABLE devfile_entrypoint_arg (\n    devfile_entrypoint_id    BIGINT,\n    arg                      VARCHAR(255) NOT NULL\n);\n\n-- constraints & indexes\nALTER TABLE devfile_entrypoint_arg ADD CONSTRAINT fk_entrypoint_arg_id FOREIGN KEY (devfile_entrypoint_id) REFERENCES devfile_entrypoint (id);\nCREATE INDEX index_entrypoint_arg_entrypoint_id ON devfile_entrypoint_arg (devfile_entrypoint_id);\n\n\n-- entrypoint commands\nCREATE TABLE devfile_entrypoint_commands (\n    devfile_entrypoint_id    BIGINT,\n    command                  VARCHAR(255) NOT NULL\n);\n\n-- constraints & indexes\nALTER TABLE devfile_entrypoint_commands ADD CONSTRAINT fk_entrypoint_commands_id FOREIGN KEY (devfile_entrypoint_id) REFERENCES devfile_entrypoint (id);\nCREATE INDEX index_entrypoint_commands_entrypoint_id ON devfile_entrypoint_commands (devfile_entrypoint_id);\n\n\nCREATE TABLE devfile_entrypoint_selector (\n    devfile_entrypoint_id    BIGINT,\n    selector_key             VARCHAR(255) NOT NULL,\n    selector                 VARCHAR(255) NOT NULL\n);\n\n-- constraints & indexes\nALTER TABLE devfile_entrypoint_selector ADD CONSTRAINT fk_entrypoint_selector_id FOREIGN KEY (devfile_entrypoint_id) REFERENCES devfile_entrypoint (id);\nCREATE UNIQUE INDEX index_entrypoint_selectors_keys ON devfile_entrypoint_selector (devfile_entrypoint_id, selector_key);\n\n\n-----------------------------------------------------------------------------------------------------------------------------------\n\n-- add devfile into workspace\nALTER TABLE workspace ADD COLUMN devfile_id BIGINT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.0.0-beta5.0/1__devfile_command_reference.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- devfile command action references\nALTER TABLE devfile_action ALTER COLUMN component DROP NOT NULL;\nALTER TABLE devfile_action ALTER COLUMN command DROP NOT NULL;\nALTER TABLE devfile_action ADD COLUMN reference TEXT;\nALTER TABLE devfile_action ADD COLUMN reference_content TEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.0.0-beta5.0/mysql/1__devfile_command_reference.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- devfile command action references\nALTER TABLE devfile_action MODIFY COLUMN component VARCHAR(255) NULL DEFAULT NULL;\nALTER TABLE devfile_action MODIFY COLUMN command TEXT NULL DEFAULT NULL;\nALTER TABLE devfile_action ADD COLUMN reference TEXT;\nALTER TABLE devfile_action ADD COLUMN reference_content TEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.0.0-beta6.0/1__add_devfile_component_prefs.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n-- component preferences\nCREATE TABLE devfile_component_preferences (\n    devfile_component_id      BIGINT,\n    preference_key            VARCHAR(255),\n    preference                VARCHAR(255)\n);\n\n-- constraints & indexes\nALTER TABLE devfile_component_preferences ADD CONSTRAINT fk_prefs_component_id FOREIGN KEY (devfile_component_id) REFERENCES devfile_component (id);\nCREATE UNIQUE INDEX index_devfile_component_prefs ON devfile_component_preferences (devfile_component_id, preference_key);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.0.0-beta7.0/1__add_registry_url_to_devfile_component.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n\nALTER TABLE devfile_component ADD COLUMN registry_url TEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.0.0-beta8.0-RC2.0/1__devfile_metadata.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE devfile RENAME COLUMN spec_version TO api_version;\nALTER TABLE devfile RENAME COLUMN name TO meta_name;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.0.0-beta8.0-RC2.0/2__devfile_make_some_fields_optional.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE devfile_entrypoint ALTER COLUMN parent_name DROP NOT NULL;\nALTER TABLE devfile_entrypoint ALTER COLUMN container_name DROP NOT NULL;\n\nALTER TABLE devfile_action ALTER COLUMN component DROP NOT NULL;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.0.0-beta8.0-RC2.0/mysql/1__devfile_metadata.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE devfile CHANGE spec_version api_version VARCHAR(255) NOT NULL;\nALTER TABLE devfile CHANGE name meta_name VARCHAR(255) NOT NULL;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.0.0-beta8.0-RC2.0/mysql/2__devfile_make_some_fields_optional.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE devfile_entrypoint\n    MODIFY COLUMN parent_name        VARCHAR(255) NULL DEFAULT NULL,\n    MODIFY COLUMN container_name     VARCHAR(255) NULL DEFAULT NULL;\n\nALTER TABLE devfile_action MODIFY COLUMN component VARCHAR(255) NULL DEFAULT NULL;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.10.0/1__add_devfile_plugin_editor_component_cpu_limit_request.sql",
    "content": "--\n-- Copyright (c) 2012-2020 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE devfile_component ADD COLUMN cpu_limit  VARCHAR(255);\nALTER TABLE devfile_component ADD COLUMN cpu_request  VARCHAR(255);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.10.0/2__add_devfile_plugin_editor_component_ram_request.sql",
    "content": "--\n-- Copyright (c) 2012-2020 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE devfile_component ADD COLUMN memory_request  VARCHAR(255);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.11.0/1__update_inconsistent_stopped_workspace_activities.sql",
    "content": "--\n-- Copyright (c) 2012-2020 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nUPDATE che_workspace_activity\n    SET last_stopped = 0\n    WHERE status = 'STOPPED' AND last_stopped IS NULL;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.16.0/1__add_devfile_component_automount_workspace_secrets.sql",
    "content": "--\n-- Copyright (c) 2012-2020 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE devfile_component ADD COLUMN automount_secrets BOOLEAN;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.2.0/1__remove_installers.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nDROP TABLE installer_serverconf_attributes;\nDROP TABLE installer_dependencies;\nDROP TABLE installer_servers;\nDROP TABLE installer_properties;\nDROP TABLE installer;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.20.0/1__userdevfile.sql",
    "content": "--\n-- Copyright (c) 2012-2020 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n\n-- add userdevfile table\nCREATE TABLE userdevfile (\n    id             VARCHAR(255)    NOT NULL UNIQUE,\n    accountid       VARCHAR(255)   NOT NULL,\n    devfile_id     BIGINT          NOT NULL UNIQUE,\n    meta_generated_name VARCHAR(255) ,\n    meta_name VARCHAR(255) ,\n    name VARCHAR(255)  NOT NULL ,\n    description TEXT ,\n    PRIMARY KEY (id)\n);\nCREATE INDEX index_userdevfile_devfile_id ON userdevfile (devfile_id);\nCREATE INDEX index_userdevfile_name ON userdevfile(name);\nALTER TABLE userdevfile ADD CONSTRAINT unq_userdevfile_0 UNIQUE (name, accountid);\nALTER TABLE userdevfile ADD CONSTRAINT fx_userdevfile_accountid FOREIGN KEY (accountid) REFERENCES account (id);\nALTER TABLE userdevfile ADD CONSTRAINT fk_userdevfile_devfile_id FOREIGN KEY (devfile_id) REFERENCES devfile (id);\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.21.0/1__remove_installers.sql",
    "content": "--\n-- Copyright (c) 2012-2020 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nDROP TABLE externalmachine_installers;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.26.0/1__remove_factory_button_and_image.sql",
    "content": "--\n-- Copyright (c) 2012-2020 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nDROP TABLE IF EXISTS che_factory_image;\n\nALTER TABLE che_factory DROP CONSTRAINT fk_che_f_button_id;\nALTER TABLE che_factory DROP COLUMN button_id;\nDROP TABLE IF EXISTS che_factory_button;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.26.0/mysql/1__remove_factory_button_and_image.sql",
    "content": "--\n-- Copyright (c) 2012-2020 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nDROP TABLE IF EXISTS che_factory_image;\n\nALTER TABLE che_factory DROP FOREIGN KEY fk_che_f_button_id;\nALTER TABLE che_factory DROP COLUMN button_id;\nDROP TABLE IF EXISTS che_factory_button;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.4.0/1__add_devfile_source_sparse_checkout_dir.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\nALTER TABLE devfile_project ADD COLUMN sparse_checkout_dir TEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.4.0/2__add_preview_url_to_devfile_command.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n\nALTER TABLE devfile_command ADD COLUMN preview_url_port INTEGER;\nALTER TABLE devfile_command ADD COLUMN preview_url_path TEXT;\n\nALTER TABLE k8s_runtime_command ADD COLUMN preview_url_port INTEGER;\nALTER TABLE k8s_runtime_command ADD COLUMN preview_url_path TEXT;\n\nALTER TABLE command ADD COLUMN preview_url_port INTEGER;\nALTER TABLE command ADD COLUMN preview_url_path TEXT;\n"
  },
  {
    "path": "wsmaster/che-core-sql-schema/src/main/resources/che-schema/7.6.0/1__drop_che_workspace_expiration.sql",
    "content": "--\n-- Copyright (c) 2012-2019 Red Hat, Inc.\n-- This program and the accompanying materials are made\n-- available under the terms of the Eclipse Public License 2.0\n-- which is available at https://www.eclipse.org/legal/epl-2.0/\n--\n-- SPDX-License-Identifier: EPL-2.0\n--\n-- Contributors:\n--   Red Hat, Inc. - initial API and implementation\n--\n\n\nDROP TABLE IF EXISTS che_workspace_expiration;\n"
  },
  {
    "path": "wsmaster/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright (c) 2012-2026 Red Hat, Inc.\n    This program and the accompanying materials are made\n    available under the terms of the Eclipse Public License 2.0\n    which is available at https://www.eclipse.org/legal/epl-2.0/\n\n    SPDX-License-Identifier: EPL-2.0\n\n    Contributors:\n      Red Hat, Inc. - initial API and implementation\n\n-->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>che-core-parent</artifactId>\n        <groupId>org.eclipse.che.core</groupId>\n        <version>7.118.0-SNAPSHOT</version>\n        <relativePath>../core/pom.xml</relativePath>\n    </parent>\n    <artifactId>che-master-parent</artifactId>\n    <packaging>pom</packaging>\n    <name>Che Core :: API :: Che Master Parent</name>\n    <modules>\n        <module>che-core-api-auth-shared</module>\n        <module>che-core-api-auth</module>\n        <module>che-core-api-auth-azure-devops</module>\n        <module>che-core-api-auth-bitbucket</module>\n        <module>che-core-api-auth-github</module>\n        <module>che-core-api-auth-github-common</module>\n        <module>che-core-api-auth-gitlab</module>\n        <module>che-core-api-auth-gitlab-common</module>\n        <module>che-core-api-auth-openshift</module>\n        <module>che-core-api-workspace-shared</module>\n        <module>che-core-api-workspace</module>\n        <module>che-core-api-user-shared</module>\n        <module>che-core-api-devfile-shared</module>\n        <module>che-core-api-devfile</module>\n        <module>che-core-api-account</module>\n        <module>che-core-api-user</module>\n        <module>che-core-api-factory-azure-devops</module>\n        <module>che-core-api-factory-git-ssh</module>\n        <module>che-core-api-factory-shared</module>\n        <module>che-core-api-factory</module>\n        <module>che-core-api-factory-github</module>\n        <module>che-core-api-factory-github-common</module>\n        <module>che-core-api-factory-gitlab</module>\n        <module>che-core-api-factory-gitlab-common</module>\n        <module>che-core-api-factory-bitbucket</module>\n        <module>che-core-api-factory-bitbucket-server</module>\n        <module>che-core-api-ssh</module>\n        <module>che-core-api-ssh-shared</module>\n        <module>che-core-sql-schema</module>\n        <module>che-core-api-system</module>\n        <module>che-core-api-system-shared</module>\n        <module>che-core-api-logger-shared</module>\n        <module>che-core-api-logger</module>\n        <module>che-core-api-metrics</module>\n    </modules>\n</project>\n"
  }
]